⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 swf_shape.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 2 页
字号:
				((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 + -