}
}
#define PI 3.14159265358979
-static void add_solidline(RENDERBUF*buf, double x1, double y1, double x2, double y2, int width, renderpoint_t*p)
+static void add_solidline(RENDERBUF*buf, double x1, double y1, double x2, double y2, double width, renderpoint_t*p)
{
renderbuf_internal*i = (renderbuf_internal*)buf->internal;
#else
/* That's what Macromedia's Player seems to do at zoom level 0. */
/* TODO: needs testing */
- if(width<20)
- width = 20;
+
+ /* TODO: how does this interact with scaling? */
+ if(width * i->multiply < 20)
+ width = 20 / i->multiply;
#endif
sd = (double)dx*(double)dx+(double)dy*(double)dy;
void swf_Process(RENDERBUF*dest, U32 clipdepth);
+double matrixsize(MATRIX*m)
+{
+ double l1 = sqrt((m->sx /65536.0) * (m->sx /65536.0) + (m->r0 /65536.0) * (m->r0/65536.0) );
+ double l2 = sqrt((m->r1 /65536.0) * (m->r1 /65536.0) + (m->sy /65536.0) * (m->sy/65536.0) );
+ return sqrt(l1*l2);
+}
+
void swf_RenderShape(RENDERBUF*dest, SHAPE2*shape, MATRIX*m, CXFORM*c, U16 _depth,U16 _clipdepth)
{
renderbuf_internal*i = (renderbuf_internal*)dest->internal;
SHAPE2* lshape = 0;
renderpoint_t p, lp;
U32 clipdepth;
+ double widthmultiply = matrixsize(m);
memset(&p, 0, sizeof(renderpoint_t));
memset(&lp, 0, sizeof(renderpoint_t));
important for texture and gradient fill */
for(t=0;t<s2->numfillstyles;t++) {
MATRIX nm;
- swf_MatrixJoin(&nm, &s2->fillstyles[t].m, &mat); //TODO: is this the right order?
+ swf_MatrixJoin(&nm, &mat, &s2->fillstyles[t].m);
/*nm.sx *= i->multiply;
nm.sy *= i->multiply;
nm.r0 *= i->multiply;
lp.depth = (_depth << 16)+1;
}
+
while(line)
{
int x1,y1,x2,y2,x3,y3;
if(line->linestyle && ! clipdepth) {
lp.shapeline = &lshape->lines[line->linestyle-1];
- add_solidline(dest, x1, y1, x3, y3, shape->linestyles[line->linestyle-1].width, &lp);
+ add_solidline(dest, x1, y1, x3, y3, shape->linestyles[line->linestyle-1].width * widthmultiply, &lp);
lp.depth++;
}
if(line->fillstyle0 || line->fillstyle1) {
if(line->linestyle && ! clipdepth) {
lp.shapeline = &lshape->lines[line->linestyle-1];
- add_solidline(dest, xx, yy, nx, ny, shape->linestyles[line->linestyle-1].width, &lp);
+ add_solidline(dest, xx, yy, nx, ny, shape->linestyles[line->linestyle-1].width * widthmultiply, &lp);
lp.depth++;
}
if(line->fillstyle0 || line->fillstyle1) {
} while(++x<x2);
}
+
static void fill_solid(RGBA*line, int*z, int y, int x1, int x2, RGBA col, U32 depth)
{
int x = x1;
endx = 0;
if(clipdepth) {
- /* for clipping, the inverse is filled */
+ /* for clipping, the inverse is filled
+ TODO: lastx!=startx only at the start of the loop,
+ so this might be moved up
+ */
fill_clip(line, zline, y, lastx, startx, clipdepth);
}
change_state(y, &fillstate, p);
-
+
fill(dest, line, zline, y, startx, endx, &fillstate, clipdepth);
/* if(y == 0 && startx == 232 && endx == 418) {
printf("ymin=%d ymax=%d\n", i->ymin, i->ymax);
break;
}
if(clipdepth) {
+ /* TODO: is lastx *ever* != i->width2 here? */
fill_clip(line, zline, y, lastx, i->width2, clipdepth);
}
free_layers(&fillstate);
textcallbackblock_t * info = (textcallbackblock_t*)self;
font_t*font = 0;
int t;
- if(!info->idtable[fontid].obj.font) {
+ if(info->idtable[fontid].type != font_type) {
+ fprintf(stderr, "ID %d is not a font\n", fontid);
+ return;
+ } else if(!info->idtable[fontid].obj.font) {
fprintf(stderr, "Font %d unknown\n", fontid);
return;
} else {
m.sy = (m.sy * fontsize) / 1024;
m.r0 = (m.r0 * fontsize) / 1024;
m.r1 = (m.r1 * fontsize) / 1024;
- m.tx += p.x;
- m.ty += p.y;
+ m.tx = p.x;
+ m.ty = p.y;
if(chars[t]<0 || chars[t]>= font->numchars) {
fprintf(stderr, "Character out of range: %d\n", chars[t]);
swf_GetPlaceObject(tag, &p);
/* TODO: add move and deletion */
placements[numplacements++] = p;
- swf_PlaceObjectFree(&p); //dirty! but it only removes items we don't need
+ swf_PlaceObjectFree(&p); //dirty! but it only frees fields we don't use
}
tag = tag->next;
}
swf_GetU16(tag);
swf_GetRect(tag,0);
swf_GetMatrix(tag,&m);
- swf_MatrixJoin(&info.m, &m, &p->matrix);
+ swf_MatrixJoin(&info.m, &p->matrix, &m);
/*printf("Text matrix:\n");
swf_DumpMatrix(stdout, &m);
printf("Placement matrix:\n");
- swf_DumpMatrix(stdout, &p->matrix);*/
+ swf_DumpMatrix(stdout, &p->matrix);
+ printf("Final matrix:\n");
+ swf_DumpMatrix(stdout, &info.m);*/
info.idtable = idtable;
info.depth = p->depth;