- else
- { int i;
- int buf[256];
- for (i=0;i<flags;i++)
- { int glyph;
- int adv;
- glyph = swf_GetBits(t,gbits);
- adv = swf_GetBits(t,abits);
- if (id==fid) // mitlesen ?
- if (jobs&FEDTJ_PRINT) {
- { int code = f->glyph2ascii[glyph];
- printf("%c",code);
- }
- if (jobs&FEDTJ_MODIFY)
- /*if (!f->glyph[code].advance)*/ f->glyph[glyph].advance = adv;
- }
- buf[i] = glyph;
- }
- if ((id==fid)&&(jobs&FEDTJ_PRINT)) printf("\n");
- if (jobs&FEDTJ_CALLBACK)
- callback(buf, flags, fid);
- }
- flags = swf_GetU8(t);
- }
-
- swf_RestoreTagPos(t);
- return id;
-}
-
-int swf_FontExtract_DefineText(int id,SWFFONT * f,TAG * t,int jobs)
-{
- return swf_FontExtract_DefineTextCallback(id,f,t,jobs,0);
-}
-
-int swf_FontExtract(SWF * swf,int id,SWFFONT * * font)
-{ TAG * t;
- SWFFONT * f;
-
- if ((!swf)||(!font)) return -1;
-
- f = (SWFFONT *)malloc(sizeof(SWFFONT)); font[0] = f;
- if (!f) return -1;
-
- 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:
- 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;
- }
- if (nid>0) id = nid;
- t = swf_NextTag(t);
- }
- 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,num;
- if ((!f)||(!use)) return -1;
-
- j = 0;
- for (i=0;i<f->numchars;i++)
- if (f->glyph[i].shape)
- { if (f->glyph2ascii[i]<MAX_CHAR_PER_FONT &&
- 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;
-}
-
-int swf_FontInitUsage(FONTUSAGE * use)
-{ if (!use) return -1;
- memset(use->code,0,sizeof(use->code[0])*MAX_CHAR_PER_FONT);
- return 0;
-}
-
-int swf_FontUse(FONTUSAGE * use,U8 * s)
-{ if ((!use)||(!s)) return -1;
- while (s[0])
- { use->code[s[0]] = 1;
- s++;
- }
- return 0;
-}
-
-int swf_FontSetDefine(TAG * t,SWFFONT * f)
-{ U16*ofs = (U16*)malloc(f->numchars*2);
- int p,i,j;
-
- if ((!t)||(!f)) return -1;
- swf_ResetWriteBits(t);
- swf_SetU16(t,f->id);
-
- p = 0; j = 0;
- for (i=0;i<f->numchars;i++)
- if (f->glyph[i].shape)
- { ofs[j++] = p;
- p+=swf_SetSimpleShape(NULL,f->glyph[i].shape);
- }
-
- for (i=0;i<j;i++) swf_SetU16(t,ofs[i]+j*2);
-
- for (i=0;i<f->numchars;i++)
- if (f->glyph[i].shape)
- swf_SetSimpleShape(t,f->glyph[i].shape);
-
- swf_ResetWriteBits(t);
- free(ofs);
- return 0;
-}
-
-int swf_FontSetInfo(TAG * t,SWFFONT * f)
-{ int l,i;
- U8 wide=0;
- if ((!t)||(!f)) return -1;
- swf_ResetWriteBits(t);
- swf_SetU16(t,f->id);
- l = strlen(f->name); if (l>255) l = 255;
- swf_SetU8(t,l);
- swf_SetBlock(t,f->name,l);
- if(f->numchars>=256)
- wide=1;
- swf_SetU8(t,(f->flags&0xfe)|wide);
-
- for (i=0;i<f->numchars;i++) {
- if (f->glyph[i].shape)
- wide?swf_SetU16(t,f->glyph2ascii[i]):
- swf_SetU8(t,f->glyph2ascii[i]);
- }
-
- return 0;
-}
-
-int swf_FontExport(int handle,SWFFONT * f)
-{ int l;
- int i;
- if (!f) return 0;
-
- l = sizeof(SWFFONT);
- if (handle>=0)
- if (write(handle,f,sizeof(SWFFONT))!=sizeof(SWFFONT)) return -1;
-
- if (f->name)
- { U16 ln = strlen(f->name);
- l+=2+ln;
- if (handle>=0)
- { if (write(handle,&ln,2)!=2) return -1;
- if (write(handle,f->name,ln)!=ln) return -1;
- }
- }
-
- if (f->layout)
- { l+=sizeof(SWFLAYOUT);
- if (handle>=0)
- if (write(handle,f->layout,sizeof(SWFLAYOUT))!=sizeof(SWFLAYOUT)) return -1;
-/* new kerning struct. hope commenting this out doesn't break things
- if (f->layout->kerning.data)
- { l+=f->layout->kerning.count*4;
- if (handle>=0)
- if (write(handle,f->layout->kerning.data,f->layout->kerning.count*4)!=f->layout->kerning.count*4) return -1;
- }*/
- }
-
- for (i=0;i<f->numchars;i++)
- { if (f->glyph[i].shape)
- { int ll = swf_ShapeExport(handle,f->glyph[i].shape);
- if (ll<0) return -1;
- l+=ll;
- }
- }
-
- return l;
-}
-
-int swf_FontImport(int handle,SWFFONT * * font)
-{ SWFFONT * f;
- int layout;
- int i = 0;
-
- if ((!font)||(handle<0)) return -1;
-
- f = (SWFFONT *)malloc(sizeof(SWFFONT)); font[0] = f;
- if (!f) return -1;
-
- memset(f,0x00,sizeof(SWFFONT));
-
- if (read(handle,f,sizeof(SWFFONT))!=sizeof(SWFFONT)) goto fehler;
-
- layout = (f->layout)?1:0; // avoid illegal free()
- f->layout = NULL;
-
- if (f->name)
- { U16 ln;
- f->name = NULL;
- if (read(handle,&ln,2)!=2) goto fehler;
- f->name = (U8*)malloc(ln+1);
- if (!f->name) goto fehler;
- if (read(handle,f->name,ln)!=ln) goto fehler;
- f->name[ln] = 0;
- }
-
- if (f->layout)
- { f->layout = (SWFLAYOUT *)malloc(sizeof(SWFLAYOUT));
- if (!f->layout) goto fehler;
- if (read(handle,f->layout,sizeof(SWFLAYOUT))!=sizeof(SWFLAYOUT)) goto fehler;
- /* new kerning struct. hope commenting this out doesn't break things
- if (f->layout->kerning.data)
- { int l = f->layout->kerning.count*4;
- f->layout->kerning.data = (U8*)malloc(l);
- if (!f->layout->kerning.data) goto fehler;
- if (read(handle,f->layout->kerning.data,l)!=l) goto fehler;
- } */
- }
-
- for (i=0;i<f->numchars;i++)
- { if (f->glyph[i].shape)
- { if (swf_ShapeImport(handle,&f->glyph[i].shape)<0) goto fehler;
- }
- }
-
- f->id = 0;
-
- return 0;
-
-fehler:
- if (f) for (;i<MAX_CHAR_PER_FONT;i++) f->glyph[i].shape = NULL;
- swf_FontFree(f);
- font[0] = NULL;
- return -1;
-}
-
-int swf_TextPrintDefineText(TAG * t,SWFFONT * f)
-{ int id = swf_GetTagID(t);
- if ((id==ST_DEFINETEXT)||(id==ST_DEFINETEXT2)) swf_FontExtract_DefineText(f->id,f,t,FEDTJ_PRINT);
- else return -1;
- return 0;
+
+ return id;
+}
+
+int swf_ParseDefineText(TAG * tag,
+ void (*callback) (void *self, int *chars, int *ypos, int nr, int fontid, int fontsize, int xstart, int ystart, RGBA * color), void *self)
+{
+ return swf_FontExtract_DefineTextCallback(-1, 0, tag, FEDTJ_CALLBACK, callback, self);
+}
+
+int swf_FontExtract_DefineText(int id, SWFFONT * f, TAG * t, int jobs)
+{
+ return swf_FontExtract_DefineTextCallback(id, f, t, jobs, 0, 0);
+}
+
+int swf_FontExtract(SWF * swf, int id, SWFFONT * *font)
+{
+ TAG *t;
+ SWFFONT *f;
+
+ if ((!swf) || (!font))
+ return -1;
+
+ f = (SWFFONT *) rfx_calloc(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) {
+ rfx_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;