typedef struct _swf_doc_internal
{
map16_t*id2char;
- int clips;
SWF swf;
int width,height;
MATRIX m;
}
//---- shape handling ----
-static void renderFilled(render_t*r, gfxline_t*line, FILLSTYLE*f, CXFORM*cx)
+static void renderFilled(render_t*r, gfxline_t*line, FILLSTYLE*f, CXFORM*cx, MATRIX*po_m)
{
if(f->type == FILL_SOLID) {
gfxcolor_t c = *(gfxcolor_t*)&f->color;
gfxmatrix_t m;
gfxcxform_t gfxcx;
convertCXForm(cx, &gfxcx);
- convertMatrix(&f->m, &m);
+ MATRIX m2;
+ swf_MatrixJoin(&m2, po_m, &f->m);
+ convertMatrix(&m2, &m);
m.m00/=20.0; m.m10/=20.0;
m.m01/=20.0; m.m11/=20.0;
/* TODO: handle clipped */
FILLSTYLE f;
f.type = FILL_SOLID;
f.color = *color;
- renderFilled(info->r, line, &f, 0);
+ renderFilled(info->r, line, &f, 0, 0);
gfxline_free(line);
}
}
TAG*tag = startTag;
int frame = 1;
int insprite = 0;
+
+ SWF*swf = rfx_calloc(sizeof(SWF));
+ swf->firstTag = startTag;
+
for(;tag;tag = tag->next) {
- if(tag->id == ST_END)
- break;
if(tag->id == ST_DEFINESPRITE) {
while(tag->id != ST_END)
tag = tag->next;
U16 depth = swf_GetDepth(tag);
map16_remove_id(depthmap, depth);
}
- if(tag->id == ST_SHOWFRAME || tag->id == ST_END) {
+ if(tag->id == ST_SHOWFRAME || tag->id == ST_END || !tag->next) {
if(frame == frame_to_extract) {
return depthmap;
}
map16_enumerate(depthmap, increaseAge, 0);
}
}
+ if(tag->id == ST_END)
+ break;
}
- fprintf(stderr, "gfxsource_swf: frame %d not found\n", frame_to_extract);
return depthmap;
}
// ---- rendering ----
-static void stopClippings(int from, render_t*r)
-{
- int t;
- for(t=from;t<r->clips;t++)
- r->device->endclip(r->device);
- r->clips = from;
-}
-
void swf_ShapeApplyMatrix(SHAPE2*shape, MATRIX*m)
{
}
line = swfline_to_gfxline(shape.lines, -1, t);
if(line) {
if(!p->po.clipdepth) {
- renderFilled(r, line, &shape.fillstyles[t-1], &p->po.cxform);
+ renderFilled(r, line, &shape.fillstyles[t-1], &p->po.cxform, &p->po.matrix);
} else {
r->device->startclip(r->device, line);
r->clips_waiting[p->po.clipdepth]++;
- r->clips++;
}
}
gfxline_free(line);
return;
}
if(c->type == TYPE_SPRITE) {
- int oldclip = r->clips;
+ int*old_clips_waiting = r->clips_waiting;
+ r->clips_waiting = rfx_calloc(sizeof(r->clips_waiting[0])*65536);
+
sprite_t* s = (sprite_t*)c->data;
- map16_t* depths = extractFrame(c->tag, p->age % s->frameCount);
+
+ map16_t* depths = extractFrame(c->tag->next, p->age % s->frameCount);
map16_enumerate(depths, placeObject, r);
- stopClippings(oldclip, r);
+
+ int t;
+ for(t=0;t<65536;t++) {
+ int i;
+ for(i=0; i<r->clips_waiting[t]; i++) {
+ r->device->endclip(r->device);
+ }
+ }
+ free(r->clips_waiting);
+ r->clips_waiting = old_clips_waiting;
return;
}
renderCharacter(r, p, c);
int t;
for(t=0;t<65536;t++) {
int i;
+
for(i=0; i<r.clips_waiting[t]; i++) {
output->endclip(output);
}
+
if(depths->ids[t]) {
placeObject(&r, t, depths->ids[t]);
}
src->open = swf_open;
return src;
}
+