+int swf_FontReduce(SWFFONT * f)
+{
+ int i;
+ int max_unicode = 0;
+ int max_glyph = 0;
+ if ((!f) || (!f->use) || f->use->is_reduced)
+ return -1;
+
+ font_freelayout(f);
+ font_freeglyphnames(f);
+
+ f->use->used_glyphs= 0;
+ for (i = 0; i < f->numchars; i++) {
+ if(!f->use->chars[i]) {
+ if(f->glyph2ascii) {
+ f->glyph2ascii[i] = 0;
+ }
+ if(f->glyph[i].shape) {
+ swf_ShapeFree(f->glyph[i].shape);
+ f->glyph[i].shape = 0;
+ f->glyph[i].advance = 0;
+ }
+// f->use->used_glyphs++;
+ } else {
+ f->use->used_glyphs++;
+ max_glyph = i+1;
+ }
+ }
+ for (i = 0; i < f->maxascii; i++) {
+ if(f->ascii2glyph[i] > -1 && !f->use->chars[f->ascii2glyph[i]]) {
+ if(f->ascii2glyph) {
+ f->ascii2glyph[i] = -1;
+ }
+ } else {
+ max_unicode = i+1;
+ }
+ }
+ f->maxascii = max_unicode;
+ f->numchars = max_glyph;
+ font_freename(f);
+ return 0;
+}
+
+void swf_FontSort(SWFFONT * font)
+{
+ int i, j;
+ int *newplace;
+ int *newpos;
+ if (!font)
+ return;
+
+ newplace = (int*)rfx_alloc(sizeof(int) * font->numchars);
+
+ 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 = (int*)rfx_alloc(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]];
+ }
+
+ rfx_free(newpos);
+ rfx_free(newplace);
+}
+
+void swf_FontPrepareForEditText(SWFFONT * font)
+{
+ if (!font->layout)
+ swf_FontCreateLayout(font);
+ swf_FontSort(font);
+}
+
+int swf_FontInitUsage(SWFFONT * f)
+{
+ if (!f)
+ return -1;
+ if(f->use) {
+ fprintf(stderr, "Usage initialized twice");
+ return -1;
+ }
+ f->use = (FONTUSAGE*)rfx_alloc(sizeof(FONTUSAGE));
+ f->use->is_reduced = 0;
+ f->use->used_glyphs = 0;
+ f->use->chars = (int*)rfx_calloc(sizeof(f->use->chars[0]) * f->numchars);
+ return 0;
+}
+
+void swf_FontClearUsage(SWFFONT * f)
+{
+ if (!f || !f->use)
+ return;
+ rfx_free(f->use->chars); f->use->chars = 0;
+ rfx_free(f->use); f->use = 0;