X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fgfxtools.c;h=06930ec03f7ac14fa6087c132c1e4a88b405865f;hb=71dd373179978bb78c4166c2dc3b151c9070973c;hp=86970a2776f6d4743cb94cbad77d304418207743;hpb=b297c77630e356035a75d9c4297ba1d6ed424b16;p=swftools.git diff --git a/lib/gfxtools.c b/lib/gfxtools.c index 86970a2..06930ec 100644 --- a/lib/gfxtools.c +++ b/lib/gfxtools.c @@ -25,6 +25,7 @@ #include #include #include "gfxtools.h" +#include "gfxfont.h" typedef struct _linedraw_internal { @@ -43,6 +44,7 @@ static void linedraw_moveTo(gfxdrawer_t*d, gfxcoord_t x, gfxcoord_t y) return; } + l->sx = l->sy = 0; d->x = l->x = x; d->y = l->y = y; l->next = 0; @@ -713,10 +715,10 @@ void gfxmatrix_unit(gfxmatrix_t*m) } void gfxmatrix_multiply(gfxmatrix_t*m1, gfxmatrix_t*m2, gfxmatrix_t*dest) { - dest->m00 = m1->m00*m2->m00 + m1->m10*m2->m01 + m1->tx; - dest->m01 = m1->m01*m2->m00 + m1->m11*m2->m01 + m1->ty; - dest->m10 = m1->m00*m2->m10 + m1->m10*m2->m11 + m1->tx; - dest->m11 = m1->m01*m2->m10 + m1->m11*m2->m11 + m1->ty; + dest->m00 = m1->m00*m2->m00 + m1->m10*m2->m01; + dest->m01 = m1->m01*m2->m00 + m1->m11*m2->m01; + dest->m10 = m1->m00*m2->m10 + m1->m10*m2->m11; + dest->m11 = m1->m01*m2->m10 + m1->m11*m2->m11; dest->tx = m1->m00*m2->tx + m1->m10*m2->ty + m1->tx; dest->ty = m1->m01*m2->tx + m1->m11*m2->ty + m1->ty; } @@ -772,6 +774,19 @@ gfxfontlist_t*gfxfontlist_addfont(gfxfontlist_t*list, gfxfont_t*font) return l; } } +void gfxfontlist_free(gfxfontlist_t*list, char deletefonts) +{ + gfxfontlist_t*l = list; + while(l) { + gfxfontlist_t*next = l->next; + memset(l, 0, sizeof(*l)); + if(l->font) { + gfxfont_free(l->font); + } + free(l); + l = next; + } +} gfxline_t*gfxline_makerectangle(int x1,int y1,int x2, int y2) { @@ -783,3 +798,34 @@ gfxline_t*gfxline_makerectangle(int x1,int y1,int x2, int y2) line[4].x = x1;line[4].y = y1;line[4].type = gfx_lineTo; return line; } + +void gfximage_transform(gfximage_t*img, gfxcxform_t*cxform) +{ + int t; + int size = img->width*img->height; + + int rr,rg,rb,ra, tr; + int gr,gg,gb,ga, tg; + int br,bg,bb,ba, tb; + int ar,ag,ab,aa, ta; + rr = (int)(cxform->rr*256);gr = (int)(cxform->gr*256); + rg = (int)(cxform->rg*256);gg = (int)(cxform->gg*256); + rb = (int)(cxform->rb*256);gb = (int)(cxform->gb*256); + ra = (int)(cxform->ra*256);ga = (int)(cxform->ga*256); + br = (int)(cxform->br*256);ar = (int)(cxform->ar*256);tr = (int)(cxform->tr*256); + bg = (int)(cxform->bg*256);ag = (int)(cxform->ag*256);tg = (int)(cxform->tg*256); + bb = (int)(cxform->bb*256);ab = (int)(cxform->ab*256);tb = (int)(cxform->tb*256); + ba = (int)(cxform->ba*256);aa = (int)(cxform->aa*256);ta = (int)(cxform->ta*256); + + for(t=0;tdata[t]; + unsigned char r = (pixel->r * rr + pixel->g * rg + pixel->b * rb + pixel->a * ra + tr) / 256; + unsigned char g = (pixel->r * gr + pixel->g * gg + pixel->b * gb + pixel->a * ga + tg) / 256; + unsigned char b = (pixel->r * br + pixel->g * bg + pixel->b * bb + pixel->a * ba + tb) / 256; + unsigned char a = (pixel->r * ar + pixel->g * ag + pixel->b * ab + pixel->a * aa + ta) / 256; + pixel->r = r; + pixel->g = g; + pixel->b = b; + pixel->a = a; + } +}