float max1=-1e20,max2=-1e20;
int t;
float*row = malloc(sizeof(float)*(width+1));
- int filter_size = 20;
+ int filter_size = 10;
float* filter = malloc(sizeof(float)*(filter_size*2+1));
double var = filter_size/3;
for(t=-filter_size;t<=filter_size;t++) {
}
row[t] = sum;
}
+ free(filter);
for(t=from;t<=to;t++) {
if(row[t]>max1) {
if(num<=1) {
*_x1=x1;
} else {
+ /* this code is slightly wrong, in that it assumes that the glyph distortion problem
+ gets worse when the font sizes get smaller. it doesn't. in fact, the smaller
+ the font size, the more of the scaling bugs disappear (http://www.quiss.org/files/scaletest.swf)
+ A better way would probably to use the font size you need for the two alignzones
+ to come to lie in different pixels, which what I think is what makes the problems
+ appear/disappear.
+ */
+
double scale = min_size/1024.0;
for(t=from;t<=to;t++) {
if(t==x1) {
*_x2=x2;
}
-
free(row);
}
y = l->y;
l = l->next;
}
+ swf_Shape2Free(s);
+ free(s);
}
static ALIGNZONE detect_for_char(SWFFONT * f, int nr, float*row, float*column, SRECT font_bbox, SRECT char_bbox)
/* find two best x values */
int x1=-1,y1=-1,x2=-1,y2=-1;
- int nr_x = 1;
+ int nr_x = 0;
find_best(row, width, &x1, &x2, f->use->smallest_size,
char_bbox.xmin - font_bbox.xmin,
char_bbox.xmax - font_bbox.xmin, nr_x,
f->alignzones = (ALIGNZONE*)rfx_calloc(sizeof(ALIGNZONE)*f->numchars);
f->alignzone_flags = FONTALIGN_MEDIUM;
- if(!f->layout) {
+ if(!f->layout || !f->use) {
int t;
for(t=0;t<f->numchars;t++) {
// just align the baseline
f->alignzones[t].dy = 0xffff;//floatToF16(460.80 / 1024.0);
}
} else {
- int t;
SRECT bounds = {0,0,0,0};
-
+ int t;
for(t=0;t<f->numchars;t++) {
SRECT b = f->layout->bounds[t];
negate_y(&b);
for(t=0;t<=height;t++) {column_global[t]/=f->numchars/2;}
for(t=0;t<f->numchars;t++) {
- memcpy(column, column_global, sizeof(float)*(height+1));
+ //memcpy(column, column_global, sizeof(float)*(height+1));
+
+ memset(column, 0, sizeof(float)*(height+1));
+ int s;
+ int drawn = 0;
+ for(s=0;s<f->use->num_neighbors;s++) {
+ int char1 = f->use->neighbors[s].char1;
+ int char2 = f->use->neighbors[s].char2;
+ if(char1 == t || char2 == t) {
+ int other = t==char1?char2:char1;
+ draw_char(f, other, row, column, bounds);
+ drawn++;
+ }
+ }
+
+ for(s=0;s<=height;s++) {
+ column[t] /= drawn*2;
+ }
+
memset(row, 0, sizeof(float)*(width+1));
draw_char(f, t, row, column, bounds);
negate_y(&b);
f->alignzones[t] = detect_for_char(f, t, row, column, bounds, b);
}
+ free(row);
+ free(column_global);
+ free(column);
+ }
+}
+
+void swf_FontPostprocess(SWF*swf)
+{
+ TAG*tag = swf->firstTag;
+ while(tag) {
+ TAG*next = tag->next;
+ if(tag->id == ST_DEFINEFONT3) {
+ U16 id = swf_GetDefineID(tag);
+ SWFFONT*font = 0;
+ swf_FontExtract(swf, id, &font);
+ if(!font->alignzones) {
+ swf_FontCreateAlignZones(font);
+ tag = swf_InsertTag(tag, ST_DEFINEFONTALIGNZONES);
+ swf_FontSetAlignZones(tag, font);
+ }
+ swf_FontFree(font);
+ }
+ tag = next;
}
}
}
}
-