of = swf_GetU16(t);
n = of / 2;
f->numchars = n;
- f->glyph = malloc(sizeof(SWFGLYPH) * n);
- memset(f->glyph, 0, sizeof(SWFGLYPH) * n);
+ f->glyph = rfx_calloc(sizeof(SWFGLYPH) * n);
for (i = 1; i < n; i++)
swf_GetU16(t);
}
if (f->name)
- free(f->name);
+ rfx_free(f->name);
- f->name = (U8 *) malloc(l + 1);
+ f->name = (U8 *) rfx_alloc(l + 1);
swf_GetBlock(t, f->name, l);
f->name[l] = 0;
f->language = swf_GetU8(t);
}
- f->glyph2ascii = (U16 *) malloc(sizeof(U16) * f->numchars);
+ f->glyph2ascii = (U16 *) rfx_alloc(sizeof(U16) * f->numchars);
maxcode = 0;
for (i = 0; i < f->numchars; i++) {
f->glyph2ascii[i] = ((flags & FF_WIDECODES) ? swf_GetU16(t) : swf_GetU8(t));
if (maxcode < 256)
maxcode = 256;
f->maxascii = maxcode;
- f->ascii2glyph = (int *) malloc(sizeof(int) * maxcode);
+ f->ascii2glyph = (int *) rfx_alloc(sizeof(int) * maxcode);
memset(f->ascii2glyph, -1, sizeof(int) * maxcode);
for (i = 0; i < f->numchars; i++)
if (fid == id) {
int num = swf_GetU16(tag);
int t;
- f->glyphnames = malloc(sizeof(char *) * num);
+ f->glyphnames = rfx_alloc(sizeof(char *) * num);
for (t = 0; t < num; t++) {
f->glyphnames[t] = strdup(swf_GetString(tag));
}
font->encoding |= FONT_ENCODING_SHIFTJIS;
namelen = swf_GetU8(tag);
- font->name = (U8 *) malloc(namelen + 1);
+ font->name = (U8 *) rfx_alloc(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);
+ font->glyph = (SWFGLYPH *) rfx_calloc(sizeof(SWFGLYPH) * glyphcount);
+ font->glyph2ascii = (U16 *) rfx_calloc(sizeof(U16) * glyphcount);
if (flags1 & 8) { // wide offsets
for (t = 0; t < glyphcount; t++)
if (maxcode < 256)
maxcode = 256;
font->maxascii = maxcode;
- font->ascii2glyph = (int *) malloc(sizeof(int) * maxcode);
+ font->ascii2glyph = (int *) rfx_alloc(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 = (SWFLAYOUT *) rfx_alloc(sizeof(SWFLAYOUT));
font->layout->ascent = swf_GetU16(tag);
font->layout->descent = swf_GetU16(tag);
font->layout->leading = swf_GetU16(tag);
S16 advance = swf_GetS16(tag);
font->glyph[t].advance = advance;
}
- font->layout->bounds = malloc(glyphcount * sizeof(SRECT));
+ font->layout->bounds = rfx_alloc(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);
+ font->layout->kerning = (SWFKERNING *) rfx_alloc(sizeof(SWFKERNING) * kerningcount);
if (kerningcount) {
- font->layout->kerning = malloc(sizeof(*font->layout->kerning) * kerningcount);
+ font->layout->kerning = rfx_alloc(sizeof(*font->layout->kerning) * kerningcount);
for (t = 0; t < kerningcount; t++) {
if (flags1 & 4) { // wide codes
font->layout->kerning[t].char1 = swf_GetU16(tag);
if ((!swf) || (!font))
return -1;
- f = (SWFFONT *) malloc(sizeof(SWFFONT));
- memset(f, 0x00, sizeof(SWFFONT));
+ f = (SWFFONT *) rfx_calloc(sizeof(SWFFONT));
t = swf->firstTag;
t = swf_NextTag(t);
}
if (f->id != id) {
- free(f);
+ rfx_free(f);
f = 0;
}
font[0] = f;
{
if (l) {
if (l->kerning)
- free(l->kerning);
+ rfx_free(l->kerning);
l->kerning = NULL;
if (l->bounds)
- free(l->bounds);
+ rfx_free(l->bounds);
l->bounds = NULL;
}
- free(l);
+ rfx_free(l);
}
int t;
for (t = 0; t < f->numchars; t++) {
if (f->glyphnames[t])
- free(f->glyphnames[t]);
+ rfx_free(f->glyphnames[t]);
}
- free(f->glyphnames);
+ rfx_free(f->glyphnames);
f->glyphnames = 0;
}
{
if (f->use) {
if(f->use->chars) {
- free(f->use->chars);f->use->chars = 0;
+ rfx_free(f->use->chars);f->use->chars = 0;
}
- free(f->use); f->use = 0;
+ rfx_free(f->use); f->use = 0;
}
}
static void font_freelayout(SWFFONT*f)
static void font_freename(SWFFONT*f)
{
if (f->name) {
- free(f->name);
+ rfx_free(f->name);
f->name = 0;
}
}
if (!font)
return;
- newplace = malloc(sizeof(int) * font->numchars);
+ newplace = rfx_alloc(sizeof(int) * font->numchars);
for (i = 0; i < font->numchars; i++) {
newplace[i] = i;
}
}
}
- newpos = malloc(sizeof(int) * font->numchars);
+ newpos = rfx_alloc(sizeof(int) * font->numchars);
for (i = 0; i < font->numchars; i++) {
newpos[newplace[i]] = i;
}
font->ascii2glyph[i] = newpos[font->ascii2glyph[i]];
}
- free(newpos);
- free(newplace);
+ rfx_free(newpos);
+ rfx_free(newplace);
}
void swf_FontPrepareForEditText(SWFFONT * font)
fprintf(stderr, "Usage initialized twice");
return -1;
}
- f->use = malloc(sizeof(FONTUSAGE));
+ f->use = rfx_alloc(sizeof(FONTUSAGE));
f->use->is_reduced = 0;
- f->use->chars = malloc(sizeof(f->use->chars[0]) * f->numchars);
- memset(f->use->chars, 0, sizeof(f->use->chars[0]) * f->numchars);
+ f->use->chars = rfx_calloc(sizeof(f->use->chars[0]) * f->numchars);
return 0;
}
{
if (!f || !f->use)
return;
- free(f->use->chars); f->use->chars = 0;
- free(f->use); f->use = 0;
+ rfx_free(f->use->chars); f->use->chars = 0;
+ rfx_free(f->use); f->use = 0;
}
int swf_FontUse(SWFFONT * f, U8 * s)
int swf_FontSetDefine(TAG * t, SWFFONT * f)
{
- U16 *ofs = (U16 *) malloc(f->numchars * 2);
+ U16 *ofs = (U16 *) rfx_alloc(f->numchars * 2);
int p, i, j;
if ((!t) || (!f))
swf_SetSimpleShape(t, f->glyph[i].shape);
swf_ResetWriteBits(t);
- free(ofs);
+ rfx_free(ofs);
return 0;
}
void swf_FontAddLayout(SWFFONT * f, int ascent, int descent, int leading)
{
- f->layout = (SWFLAYOUT *) malloc(sizeof(SWFLAYOUT));
+ f->layout = (SWFLAYOUT *) rfx_alloc(sizeof(SWFLAYOUT));
f->layout->ascent = ascent;
f->layout->descent = descent;
f->layout->leading = leading;
f->layout->kerningcount = 0;
f->layout->kerning = 0;
- f->layout->bounds = (SRECT *) malloc(sizeof(SRECT) * f->numchars);
- memset(f->layout->bounds, 0, sizeof(SRECT) * f->numchars);
+ f->layout->bounds = (SRECT *) rfx_calloc(sizeof(SRECT) * f->numchars);
}
int swf_FontSetInfo(TAG * t, SWFFONT * f)
swf_ShapeFree(f->glyph[i].shape);
f->glyph[i].shape = NULL;
}
- free(f->glyph);
+ rfx_free(f->glyph);
f->glyph = NULL;
}
if (f->ascii2glyph) {
- free(f->ascii2glyph);
+ rfx_free(f->ascii2glyph);
f->ascii2glyph = NULL;
}
if (f->glyph2ascii) {
- free(f->glyph2ascii);
+ rfx_free(f->glyph2ascii);
f->glyph2ascii = NULL;
}
font_freename(f);
font_freeglyphnames(f);
font_freeusage(f);
- free(f);
+ rfx_free(f);
}
int swf_TextSetInfoRecord(TAG * t, SWFFONT * font, U16 size, RGBA * color, int dx, int dy)
else
swf_SetRGB(t, color);
}
- if (dx)
+ if (dx) {
+ if(dx>32767 || dx<-32768)
+ fprintf(stderr, "Warning: Horizontal char position overflow: %d\n", dx);
swf_SetS16(t, dx);
- if (dy)
+ }
+ if (dy) {
+ if(dy>32767 || dy<-32768)
+ fprintf(stderr, "Warning: Vertical char position overflow: %d\n", dy);
swf_SetS16(t, dy);
+ }
if (font)
swf_SetU16(t, size);
SRECT swf_TextCalculateBBoxUTF8(SWFFONT * font, U8 * s, int scale)
{
- int pos = 0;
+ int xpos = 0;
+ int ypos = 0;
SRECT r;
swf_GetRect(0, &r);
while (*s) {
int g = font->ascii2glyph[c];
if (g >= 0) {
SRECT rn = font->layout->bounds[g];
- rn.xmin = (rn.xmin * scale) / 20 / 100 + pos;
- rn.xmax = (rn.xmax * scale) / 20 / 100 + pos;
- rn.ymin = (rn.ymin * scale) / 20 / 100;
- rn.ymax = (rn.ymax * scale) / 20 / 100;
+ rn.xmin = (rn.xmin * scale) / 20 / 100 + xpos;
+ rn.xmax = (rn.xmax * scale) / 20 / 100 + xpos;
+ rn.ymin = (rn.ymin * scale) / 20 / 100 + ypos;
+ rn.ymax = (rn.ymax * scale) / 20 / 100 + ypos;
swf_ExpandRect2(&r, &rn);
- pos += (font->glyph[g].advance * scale) / 20 / 100;
+ xpos += (font->glyph[g].advance * scale) / 20 / 100;
}
}
c++;
SWF swf;
if (!filename)
return 0;
- f = open(filename, O_RDONLY);
+ f = open(filename, O_RDONLY|O_BINARY);
if (f < 0 || swf_ReadSWF(f, &swf) < 0) {
fprintf(stderr, "%s is not a valid SWF font file or contains errors.\n", filename);
t = swf_InsertTag(t, ST_END);
- f = open(filename, O_RDWR | O_CREAT | O_TRUNC, 0644);
+ f = open(filename, O_RDWR | O_CREAT | O_TRUNC | O_BINARY, 0644);
if FAILED
(swf_WriteSWF(f, &swf)) fprintf(stderr, "WriteSWF() failed in writeFont().\n");
close(f);
if (!f->numchars)
return;
- f->layout = (SWFLAYOUT *) malloc(sizeof(SWFLAYOUT));
- memset(f->layout, 0, sizeof(SWFLAYOUT));
- f->layout->bounds = (SRECT *) malloc(f->numchars * sizeof(SRECT));
+ f->layout = (SWFLAYOUT *) rfx_calloc(sizeof(SWFLAYOUT));
+ f->layout->bounds = (SRECT *) rfx_alloc(f->numchars * sizeof(SRECT));
f->layout->ascent = -32767;
f->layout->descent = -32767;