+int swf_FontExtract_DefineFont2(int id,SWFFONT * font,TAG * tag)
+{
+ int t, glyphcount;
+ int maxcode;
+ int fid;
+ U8 flags1,flags2,namelen;
+ swf_SaveTagPos(tag);
+ swf_SetTagPos(tag,0);
+ font->version=2;
+ fid = swf_GetU16(tag);
+ if(id && id!=fid)
+ return id;
+ font->id = fid;
+ flags1 = swf_GetU8(tag);
+ flags2 = swf_GetU8(tag); //reserved flags
+
+ if(flags1 & 1)
+ font->style |= FONT_STYLE_BOLD;
+ if(flags1 & 2)
+ font->style |= FONT_STYLE_ITALIC;
+ if(flags1 & 16)
+ font->encoding |= FONT_ENCODING_ANSI;
+ if(flags1 & 32)
+ font->encoding |= FONT_ENCODING_UNICODE;
+ if(flags1 & 64)
+ font->encoding |= FONT_ENCODING_SHIFTJIS;
+
+ namelen = swf_GetU8(tag);
+ font->name = (U8*)malloc(namelen+1);
+ font->name[namelen]=0;
+ swf_GetBlock(tag, font->name, namelen);
+ font->version = 2;
+ glyphcount = swf_GetU16(tag);
+ font->numchars = glyphcount;
+
+ font->glyph = (SWFGLYPH*)malloc(sizeof(SWFGLYPH)*glyphcount);
+ memset(font->glyph, 0, sizeof(SWFGLYPH)*glyphcount);
+ font->glyph2ascii = (U16*)malloc(sizeof(U16)*glyphcount);
+ memset(font->glyph2ascii, 0, sizeof(U16)*glyphcount);
+
+ if(flags1&8) { // wide offsets
+ for(t=0;t<glyphcount;t++)
+ swf_GetU32(tag); //offset[t]
+
+ if(glyphcount) /* this _if_ is not in the specs */
+ swf_GetU32(tag); // fontcodeoffset
+ } else {
+ for(t=0;t<glyphcount;t++)
+ swf_GetU16(tag); //offset[t]
+
+ if(glyphcount) /* this _if_ is not in the specs */
+ swf_GetU16(tag); // fontcodeoffset
+ }
+ for(t=0;t<glyphcount;t++)
+ swf_GetSimpleShape(tag,&(font->glyph[t].shape));
+
+ maxcode = 0;
+ for(t=0;t<glyphcount;t++) {
+ int code;
+ if(flags1&4) // wide codes
+ code = swf_GetU16(tag);
+ else
+ code = swf_GetU8(tag);
+ font->glyph2ascii[t] = code;
+ if(code > maxcode)
+ maxcode = code;
+ }
+ maxcode++;
+ if(maxcode<256)
+ maxcode=256;
+ font->maxascii = maxcode;
+ font->ascii2glyph = (int*)malloc(sizeof(int)*maxcode);
+ memset(font->ascii2glyph, -1, sizeof(int)*maxcode);
+ for(t=0;t<glyphcount;t++)
+ {
+ font->ascii2glyph[font->glyph2ascii[t]] = t;
+ }
+
+ if(flags1&128) { // has layout
+ U16 kerningcount;
+ font->layout = (SWFLAYOUT*)malloc(sizeof(SWFLAYOUT));
+ font->layout->ascent=swf_GetU16(tag);
+ font->layout->descent=swf_GetU16(tag);
+ font->layout->leading=swf_GetU16(tag);
+ for(t=0;t<glyphcount;t++) {
+ S16 advance = swf_GetS16(tag);
+ font->glyph[t].advance = advance;
+ }
+ font->layout->bounds = malloc(glyphcount*sizeof(SRECT));
+ for(t=0;t<glyphcount;t++) {
+ swf_ResetReadBits(tag);
+ swf_GetRect(tag, &font->layout->bounds[t]);
+ }
+
+ kerningcount = swf_GetU16(tag);
+ font->layout->kerningcount = kerningcount;
+
+ font->layout->kerning = (SWFKERNING*)malloc(sizeof(SWFKERNING)*kerningcount);
+ if(kerningcount) {
+ font->layout->kerning =
+ malloc(sizeof(*font->layout->kerning)* kerningcount);
+ for(t=0;t<kerningcount;t++)
+ {
+ if(flags1&4) { // wide codes
+ font->layout->kerning[t].char1 = swf_GetU16(tag);
+ font->layout->kerning[t].char2 = swf_GetU16(tag);
+ } else {
+ font->layout->kerning[t].char1 = swf_GetU8(tag);
+ font->layout->kerning[t].char2 = swf_GetU8(tag);
+ }
+ font->layout->kerning[t].adjustment = swf_GetS16(tag);
+ }
+ }
+ }
+ swf_RestoreTagPos(t);
+ return font->id;
+}
+
+