-int swf_FontExtract(SWF * swf,int id,SWFFONT * * font)
-{ TAG * t;
- SWFFONT * f;
-
- if ((!swf)||(!font)) return -1;
-
- f = (SWFFONT *)malloc(sizeof(SWFFONT));
- memset(f,0x00,sizeof(SWFFONT));
-
- t = swf->firstTag;
-
- while (t)
- { int nid = 0;
- switch (swf_GetTagID(t))
- { case ST_DEFINEFONT:
- nid = swf_FontExtract_DefineFont(id,f,t);
- break;
-
- case ST_DEFINEFONT2:
- nid = swf_FontExtract_DefineFont2(id,f,t);
- break;
-
- case ST_DEFINEFONTINFO:
- case ST_DEFINEFONTINFO2:
- nid = swf_FontExtract_DefineFontInfo(id,f,t);
- break;
-
- case ST_DEFINETEXT:
- case ST_DEFINETEXT2:
- nid = swf_FontExtract_DefineText(id,f,t,f->layout?0:FEDTJ_MODIFY);
- break;
-
- case ST_GLYPHNAMES:
- nid = swf_FontExtract_GlyphNames(id,f,t);
- break;
+int swf_FontExtract(SWF * swf, int id, SWFFONT * *font)
+{
+ TAG *t;
+ SWFFONT *f;
+
+ if ((!swf) || (!font))
+ return -1;
+
+ f = (SWFFONT *) malloc(sizeof(SWFFONT));
+ memset(f, 0x00, sizeof(SWFFONT));
+
+ t = swf->firstTag;
+
+ while (t) {
+ int nid = 0;
+ switch (swf_GetTagID(t)) {
+ case ST_DEFINEFONT:
+ nid = swf_FontExtract_DefineFont(id, f, t);
+ break;
+
+ case ST_DEFINEFONT2:
+ nid = swf_FontExtract_DefineFont2(id, f, t);
+ break;
+
+ case ST_DEFINEFONTINFO:
+ case ST_DEFINEFONTINFO2:
+ nid = swf_FontExtract_DefineFontInfo(id, f, t);
+ break;
+
+ case ST_DEFINETEXT:
+ case ST_DEFINETEXT2:
+ nid = swf_FontExtract_DefineText(id, f, t, f->layout ? 0 : FEDTJ_MODIFY);
+ break;
+
+ case ST_GLYPHNAMES:
+ nid = swf_FontExtract_GlyphNames(id, f, t);
+ break;
+ }
+ if (nid > 0)
+ id = nid;
+ t = swf_NextTag(t);
+ }
+ if (f->id != id) {
+ free(f);
+ f = 0;
+ }
+ font[0] = f;
+ return 0;
+}
+
+int swf_FontSetID(SWFFONT * f, U16 id)
+{
+ if (!f)
+ return -1;
+ f->id = id;
+ return 0;
+}
+
+int swf_FontReduce(SWFFONT * f, FONTUSAGE * use)
+{
+ int i, j;
+ if ((!f) || (!use))
+ return -1;
+
+ /* TODO: layout, glyphnames */
+ j = 0;
+ for (i = 0; i < f->numchars; i++)
+ if (f->glyph[i].shape) {
+ if (f->glyph2ascii[i] < f->maxascii && use->code[f->glyph2ascii[i]]) {
+ f->ascii2glyph[f->glyph2ascii[i]] = j;
+ f->glyph2ascii[j] = f->glyph2ascii[i];
+ f->glyph[j] = f->glyph[i];
+ j++;
+ } else {
+ swf_ShapeFree(f->glyph[i].shape);
+ f->ascii2glyph[f->glyph2ascii[i]] = -1;
+ f->glyph2ascii[i] = 0;
+ f->glyph[i].shape = NULL;
+ f->glyph[i].advance = 0;
+ }
+ } else
+ f->ascii2glyph[f->glyph2ascii[i]] = -1;
+
+ f->numchars = j;
+
+ return j;
+}
+
+void swf_FontSort(SWFFONT * font)
+{
+ if (!font)
+ return;
+ int i, j, k;
+ int *newplace = malloc(sizeof(int) * font->numchars);
+ int *newpos;
+
+ for (i = 0; i < font->numchars; i++) {
+ newplace[i] = i;
+ }
+ for (i = 0; i < font->numchars; i++)
+ for (j = 0; j < i; j++) {
+ if (font->glyph2ascii[i] < font->glyph2ascii[j]) {
+ int n1, n2;
+ char *c1, *c2;
+ SWFGLYPH g1, g2;
+ SRECT r1, r2;
+ n1 = newplace[i];
+ n2 = newplace[j];
+ newplace[j] = n1;
+ newplace[i] = n2;
+ n1 = font->glyph2ascii[i];
+ n2 = font->glyph2ascii[j];
+ font->glyph2ascii[j] = n1;
+ font->glyph2ascii[i] = n2;
+ g1 = font->glyph[i];
+ g2 = font->glyph[j];
+ font->glyph[j] = g1;
+ font->glyph[i] = g2;
+ if (font->glyphnames) {
+ c1 = font->glyphnames[i];
+ c2 = font->glyphnames[j];
+ font->glyphnames[j] = c1;
+ font->glyphnames[i] = c2;
+ }
+ if (font->layout) {
+ r1 = font->layout->bounds[i];
+ r2 = font->layout->bounds[j];
+ font->layout->bounds[j] = r1;
+ font->layout->bounds[i] = r2;
+ }
+ }
+ }
+ newpos = malloc(sizeof(int) * font->numchars);
+ for (i = 0; i < font->numchars; i++) {
+ newpos[newplace[i]] = i;
+ }
+ for (i = 0; i < font->maxascii; i++) {
+ if (font->ascii2glyph[i] >= 0)
+ font->ascii2glyph[i] = newpos[font->ascii2glyph[i]];