📄 swf_shape.c
字号:
((SFVec2f *)fptr)->x = ct2.x; ((SFVec2f *)fptr)->y = ct2.y; gf_sg_vrml_mf_append(&points->point, GF_SG_VRML_MFVEC2F, &fptr); ((SFVec2f *)fptr)->x = ct.x; ((SFVec2f *)fptr)->y = ct.y; pt_idx+=2; } break; } } return (GF_Node *) n;}void SWF_MergeCurve2D(M_Curve2D *s, M_Curve2D *tomerge){ u32 i, pt_idx, j; SFVec2f pt; void *ptr; M_Coordinate2D *dest, *orig; dest = (M_Coordinate2D *) s->point; orig = (M_Coordinate2D *) tomerge->point; if (!tomerge->type.count) return; if (!orig->point.count) return; pt = orig->point.vals[0]; if (s->type.vals[s->type.count - 1] == 0) { dest->point.vals[dest->point.count - 1] = pt; } else { gf_sg_vrml_mf_append(&s->type, GF_SG_VRML_MFINT32, &ptr); *((SFInt32 *)ptr) = 0; gf_sg_vrml_mf_append(&dest->point, GF_SG_VRML_MFVEC2F, &ptr); *((SFVec2f *)ptr) = pt; } i = 0; if (tomerge->type.vals[0] == 0) i=1; pt_idx = 1; for (; i<tomerge->type.count; i++) { switch (tomerge->type.vals[i]) { case 0: if (s->type.vals[s->type.count - 1] == 0) { dest->point.vals[dest->point.count - 1] = pt; } else { gf_sg_vrml_mf_append(&s->type, GF_SG_VRML_MFINT32, &ptr); *((SFInt32 *)ptr) = 0; gf_sg_vrml_mf_append(&dest->point, GF_SG_VRML_MFVEC2F, &ptr); *((SFVec2f *)ptr) = orig->point.vals[pt_idx]; } pt_idx++; break; case 1: gf_sg_vrml_mf_append(&s->type, GF_SG_VRML_MFINT32, &ptr); *((SFInt32 *)ptr) = 1; gf_sg_vrml_mf_append(&dest->point, GF_SG_VRML_MFVEC2F, &ptr); *((SFVec2f *)ptr) = orig->point.vals[pt_idx]; pt_idx++; break; case 2: gf_sg_vrml_mf_append(&s->type, GF_SG_VRML_MFINT32, &ptr); *((SFInt32 *)ptr) = 2; for (j=0; j<3; j++) { gf_sg_vrml_mf_append(&dest->point, GF_SG_VRML_MFVEC2F, &ptr); *((SFVec2f *)ptr) = orig->point.vals[pt_idx]; pt_idx++; } break; case 7: gf_sg_vrml_mf_append(&s->type, GF_SG_VRML_MFINT32, &ptr); *((SFInt32 *)ptr) = 7; for (j=0; j<2; j++) { gf_sg_vrml_mf_append(&dest->point, GF_SG_VRML_MFVEC2F, &ptr); *((SFVec2f *)ptr) = orig->point.vals[pt_idx]; pt_idx++; } break; } }}void SWFShape_InsertBIFSShape(M_OrderedGroup *og, M_Shape *n){#if 1 M_Shape *prev; GF_ChildNodeItem *l = og->children; while (l) { prev = (M_Shape*)l->node; if (prev->appearance == n->appearance) { SWF_MergeCurve2D( (M_Curve2D *)prev->geometry, (M_Curve2D *)n->geometry); gf_node_register((GF_Node *)n, NULL); gf_node_unregister((GF_Node *)n, NULL); return; } l = l->next; }#endif gf_node_insert_child((GF_Node *)og, (GF_Node *)n, -1); gf_node_register((GF_Node *) n, (GF_Node *) og);}/*this is the core of the parser, translates flash to BIFS shapes*/GF_Node *SWFShapeToBIFS(SWFReader *read, SWFShape *shape){ GF_Node *n; GF_Node *og; u32 i, count; SWFShapeRec *srec; count = gf_list_count(shape->fill_left); count += gf_list_count(shape->lines); /*empty, return empty shape*/ if (!count) { M_Shape *s = (M_Shape *) SWF_NewNode(read, TAG_MPEG4_Shape); s->geometry = SWF_NewNode(read, TAG_MPEG4_Curve2D); gf_node_register(s->geometry, (GF_Node *)s); return (GF_Node *)s; } /*direct match, no top group*/ if (count == 1) { Bool is_fill = 1; srec = (SWFShapeRec*)gf_list_get(shape->fill_left, 0); if (!srec) { srec = (SWFShapeRec*)gf_list_get(shape->lines, 0); is_fill = 0; } return SWFShapeToCurve2D(read, shape, srec, is_fill); } /*we need a grouping node*/ og = SWF_NewNode(read, TAG_MPEG4_OrderedGroup); i=0; while ((srec = (SWFShapeRec*)gf_list_enum(shape->fill_left, &i))) { n = SWFShapeToCurve2D(read, shape, srec, 1); if (n) SWFShape_InsertBIFSShape((M_OrderedGroup*)og, (M_Shape *)n); } i=0; while ((srec = (SWFShapeRec*)gf_list_enum(shape->lines, &i))) { n = SWFShapeToCurve2D(read, shape, srec, 0); if (n) SWFShape_InsertBIFSShape((M_OrderedGroup*)og, (M_Shape *)n); } return og;}GF_Node *SWF_GetBIFSMatrix(SWFReader *read, GF_Matrix2D *mat){ M_TransformMatrix2D *tm = (M_TransformMatrix2D *)SWF_NewNode(read, TAG_MPEG4_TransformMatrix2D); tm->mxx = mat->m[0]; tm->mxy = mat->m[1]; tm->tx = mat->m[2]; tm->myx = mat->m[3]; tm->myy = mat->m[4]; tm->ty = mat->m[5]; return (GF_Node *) tm;}GF_Node *SWF_GetBIFSColorMatrix(SWFReader *read, GF_ColorMatrix *cmat){ M_ColorTransform *ct = (M_ColorTransform*)SWF_NewNode(read, TAG_MPEG4_ColorTransform); ct->mrr = cmat->m[0]; ct->mrg = cmat->m[1]; ct->mrb = cmat->m[2]; ct->mra = cmat->m[3]; ct->tr = cmat->m[4]; ct->mgr = cmat->m[5]; ct->mgg = cmat->m[6]; ct->mgb = cmat->m[7]; ct->mga = cmat->m[8]; ct->tg = cmat->m[9]; ct->mbr = cmat->m[10]; ct->mbg = cmat->m[11]; ct->mbb = cmat->m[12]; ct->mba = cmat->m[13]; ct->tb = cmat->m[14]; ct->mar = cmat->m[15]; ct->mag = cmat->m[16]; ct->mab = cmat->m[17]; ct->maa = cmat->m[18]; ct->ta = cmat->m[19]; return (GF_Node *) ct;}GF_Node *SWF_GetGlyph(SWFReader *read, u32 fontID, u32 gl_index, GF_Node *par){ char szDEF[1024]; u32 ID; GF_Node *n, *glyph; SWFFont *ft; sprintf(szDEF, "FT%d_GL%d", fontID, gl_index); n = gf_sg_find_node_by_name(read->load->scene_graph, szDEF); if (n) { gf_node_register(n, par); return n; } /*first use of glyph in file*/ ft = SWF_FindFont(read, fontID); if (!ft) { swf_report(read, GF_BAD_PARAM, "Cannot find font %d - skipping glyph", fontID); return NULL; } if (ft->nbGlyphs <= gl_index) { swf_report(read, GF_BAD_PARAM, "Glyph #%d not found in font %d - skipping", gl_index, fontID); return NULL; } n = (GF_Node*)gf_list_get(ft->glyphs, gl_index); if (gf_node_get_tag(n) != TAG_MPEG4_Shape) { swf_report(read, GF_BAD_PARAM, "Glyph #%d in font %d not a shape (translated in %s) - skipping", gl_index, fontID, gf_node_get_class_name(n)); return NULL; } glyph = ((M_Shape *)n)->geometry; /*space*/ if (!glyph) return NULL; read->load->ctx->max_node_id++; ID = read->load->ctx->max_node_id; gf_node_set_id(glyph, ID, szDEF); gf_node_register(glyph, par); /*also insert glyph*/ SWF_InsertNode(read, n); return glyph;}GF_Node *SWFTextToBIFS(SWFReader *read, SWFText *text){ u32 i, j; Bool use_text; Fixed dx; SWFGlyphRec *gr; SWFFont *ft; M_Transform2D *par, *gl_par; M_Shape *gl; M_TransformMatrix2D *tr; use_text = (read->flags & GF_SM_SWF_NO_FONT) ? 1 : 0; tr = (M_TransformMatrix2D *) SWF_NewNode(read, TAG_MPEG4_TransformMatrix2D); tr->mxx = text->mat.m[0]; tr->mxy = text->mat.m[1]; tr->tx = text->mat.m[2]; tr->myx = text->mat.m[3]; tr->myy = text->mat.m[4]; tr->ty = text->mat.m[5]; i=0; while ((gr = (SWFGlyphRec*)gf_list_enum(text->text, &i))) { par = (M_Transform2D *) SWF_NewNode(read, TAG_MPEG4_Transform2D); par->translation.x = gr->orig_x; par->translation.y = gr->orig_y; ft = NULL; if (use_text) { ft = SWF_FindFont(read, gr->fontID); if (!ft->glyph_codes) { use_text = 0; swf_report(read, GF_BAD_PARAM, "Font glyphs are not defined, cannot reference extern font - Forcing glyph embedding"); } } if (!use_text) { par->scale.x = gr->fontHeight; par->scale.y = gr->fontHeight; } else { /*don't forget we're flipped at top level...*/ par->scale.y = -FIX_ONE; } gf_node_insert_child((GF_Node *)tr, (GF_Node *) par, -1); gf_node_register((GF_Node *) par, (GF_Node *)tr); if (use_text) { u16 *str_w, *widestr; char *str; void *ptr; M_Text *t = (M_Text *) SWF_NewNode(read, TAG_MPEG4_Text); M_FontStyle *f = (M_FontStyle *) SWF_NewNode(read, TAG_MPEG4_FontStyle); t->fontStyle = (GF_Node *) f; gf_node_register(t->fontStyle, (GF_Node *) t); /*restore back the font height in pixels (it's currently in SWF glyph design units)*/ f->size = gf_mulfix(gr->fontHeight, FLT2FIX(SWF_TWIP_SCALE / SWF_TEXT_SCALE)); if (ft->fontName) { gf_sg_vrml_mf_reset(&f->family, GF_SG_VRML_MFSTRING); gf_sg_vrml_mf_append(&f->family, GF_SG_VRML_MFSTRING, &ptr); ((SFString*)ptr)->buffer = strdup(ft->fontName); } gf_sg_vrml_mf_reset(&f->justify, GF_SG_VRML_MFSTRING); gf_sg_vrml_mf_append(&f->justify, GF_SG_VRML_MFSTRING, &ptr); ((SFString*)ptr)->buffer = strdup("BEGIN"); if (f->style.buffer) free(f->style.buffer); if (ft->is_italic && ft->is_bold) f->style.buffer = strdup("BOLDITALIC"); else if (ft->is_bold) f->style.buffer = strdup("BOLD"); else if (ft->is_italic) f->style.buffer = strdup("ITALIC"); else f->style.buffer = strdup("PLAIN"); /*convert to UTF-8*/ str_w = (u16*)malloc(sizeof(u16) * (gr->nbGlyphs+1)); for (j=0; j<gr->nbGlyphs; j++) str_w[j] = ft->glyph_codes[gr->indexes[j]]; str_w[j] = 0; str = (char*)malloc(sizeof(char) * (gr->nbGlyphs+2)); widestr = str_w; j = gf_utf8_wcstombs(str, sizeof(u8) * (gr->nbGlyphs+1), (const unsigned short **) &widestr); if (j != (u32) -1) { str[j] = 0; gf_sg_vrml_mf_reset(&t->string, GF_SG_VRML_MFSTRING); gf_sg_vrml_mf_append(&t->string, GF_SG_VRML_MFSTRING, &ptr); ((SFString*)ptr)->buffer = (char*)malloc(sizeof(char) * (j+1)); memcpy(((SFString*)ptr)->buffer, str, sizeof(char) * (j+1)); } free(str); free(str_w); gl = (M_Shape *) SWF_NewNode(read, TAG_MPEG4_Shape); gl->appearance = SWF_GetAppearance(read, (GF_Node *) gl, gr->col, 0, 0); gl->geometry = (GF_Node *) t; gf_node_register(gl->geometry, (GF_Node *) gl); gf_node_insert_child((GF_Node *) par, (GF_Node *)gl, -1); gf_node_register((GF_Node *) gl, (GF_Node *) par); } else { /*convert glyphs*/ dx = 0; for (j=0; j<gr->nbGlyphs; j++) { gl = (M_Shape *) SWF_NewNode(read, TAG_MPEG4_Shape); gl->geometry = SWF_GetGlyph(read, gr->fontID, gr->indexes[j], (GF_Node *) gl); if (!gl->geometry) { gf_node_register((GF_Node *) gl, NULL); gf_node_unregister((GF_Node *) gl, NULL); dx += gr->dx[j]; continue; } assert((gf_node_get_tag(gl->geometry)==TAG_MPEG4_Curve2D) || (gf_node_get_tag(gl->geometry)==TAG_MPEG4_XCurve2D)); gl_par = (M_Transform2D *) SWF_NewNode(read, TAG_MPEG4_Transform2D); gl->appearance = SWF_GetAppearance(read, (GF_Node *) gl, gr->col, 0, 0); gl_par->translation.x = gf_divfix(dx, gr->fontHeight); dx += gr->dx[j]; gf_node_insert_child((GF_Node *) gl_par, (GF_Node *)gl, -1); gf_node_register((GF_Node *) gl, (GF_Node *) gl_par); gf_node_insert_child((GF_Node *) par, (GF_Node *)gl_par, -1); gf_node_register((GF_Node *) gl_par, (GF_Node *) par); } } } return (GF_Node *)tr;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -