65 |
int val, i; |
int val, i; |
66 |
|
|
67 |
val = 0; |
val = 0; |
68 |
for(i=0;i<n;i++) { |
for (i = 0; i < n; i++) { |
69 |
val = (val << 1) | get_bit(uf); |
val = (val << 1) | get_bit(uf); |
70 |
} |
} |
71 |
return val; |
return val; |
133 |
|
|
134 |
len = uf->fbf_getc(uf->infile); |
len = uf->fbf_getc(uf->infile); |
135 |
q = buf; |
q = buf; |
136 |
for(i=0;i<len;i++) { |
for (i = 0; i < len; i++) { |
137 |
c = uf->fbf_getc(uf->infile); |
c = uf->fbf_getc(uf->infile); |
138 |
if ((q - buf) < (buf_size - 1)) |
if ((q - buf) < (buf_size - 1)) |
139 |
*q++ = c; |
*q++ = c; |
192 |
if (!uf->csegs_offsets) |
if (!uf->csegs_offsets) |
193 |
goto fail; |
goto fail; |
194 |
uf->msegs_offsets = uf->csegs_offsets + uf->nb_csegs; |
uf->msegs_offsets = uf->csegs_offsets + uf->nb_csegs; |
195 |
for(i=0;i<uf->nb_csegs;i++) { |
for (i = 0; i < uf->nb_csegs; i++) { |
196 |
uf->msegs_offsets[i] = get_be32(uf); |
uf->msegs_offsets[i] = get_be32(uf); |
197 |
} |
} |
198 |
|
|
199 |
for(i=0;i<uf->nb_csegs;i++) { |
for (i = 0; i < uf->nb_csegs; i++) { |
200 |
uf->csegs_offsets[i] = get_be32(uf); |
uf->csegs_offsets[i] = get_be32(uf); |
201 |
} |
} |
202 |
|
|
232 |
GlyphSegment *gseg; |
GlyphSegment *gseg; |
233 |
int i; |
int i; |
234 |
|
|
235 |
for(i=0;i<CSEG_CACHE_SIZE;i++) { |
for (i = 0; i < CSEG_CACHE_SIZE; i++) { |
236 |
gseg = uf->cseg_cache[i]; |
gseg = uf->cseg_cache[i]; |
237 |
if (gseg) { |
if (gseg) { |
238 |
uf_free(uf, gseg->bitmap_table); |
uf_free(uf, gseg->bitmap_table); |
253 |
int ctxval, val, bit, freq0, freq1, shift; |
int ctxval, val, bit, freq0, freq1, shift; |
254 |
|
|
255 |
/* table for context frequency update */ |
/* table for context frequency update */ |
256 |
for(bit=0;bit<2;bit++) { |
for (bit = 0; bit < 2; bit++) { |
257 |
for(ctxval=0;ctxval<256;ctxval++) { |
for (ctxval = 0; ctxval < 256; ctxval++) { |
258 |
freq0 = 2*(ctxval >> 4) + 1; |
freq0 = 2*(ctxval >> 4) + 1; |
259 |
freq1 = 2*(ctxval & 0xf) + 1; |
freq1 = 2*(ctxval & 0xf) + 1; |
260 |
if (!bit) |
if (!bit) |
273 |
} |
} |
274 |
|
|
275 |
/* table for arith coding */ |
/* table for arith coding */ |
276 |
for(ctxval=0;ctxval<256;ctxval++) { |
for (ctxval = 0; ctxval < 256; ctxval++) { |
277 |
unsigned int sum, m, s; |
unsigned int sum, m, s; |
278 |
|
|
279 |
freq0 = 2*(ctxval >> 4) + 1; |
freq0 = 2*(ctxval >> 4) + 1; |
368 |
|
|
369 |
v = 0; |
v = 0; |
370 |
|
|
371 |
v = v * 3; |
v = v * 3; |
372 |
if (y >= 4) { |
if (y >= 4) { |
373 |
v += p[-3 * WRAP] << 0; // M |
v += p[-3 * WRAP] << 0; // M |
374 |
} else { |
} else { |
375 |
v += 2; |
v += 2; |
376 |
} |
} |
377 |
v = v * 3; |
v = v * 3; |
378 |
if (x >= 4) { |
if (x >= 4) { |
379 |
v += (p[-3]) << 0; // T |
v += (p[-3]) << 0; // T |
380 |
} else { |
} else { |
381 |
v += 2; |
v += 2; |
382 |
} |
} |
383 |
|
|
384 |
|
/* distance of 2 */ |
385 |
|
v = v << 2; |
386 |
|
v += p[-2 * WRAP + 2] << 0; // K |
387 |
|
v += p[-2 * WRAP - 2] << 1; // G |
388 |
|
|
389 |
|
v = v << 1; |
390 |
|
v += p[-2] << 0; // E |
391 |
|
|
392 |
|
v = v << 3; |
393 |
|
v += p[-2 * WRAP - 1] << 0; // H |
394 |
|
v += p[-2 * WRAP] << 1; // I |
395 |
|
v += p[-2 * WRAP + 1] << 2; // J |
396 |
|
|
397 |
|
v = v << 4; |
398 |
|
v += p[-WRAP - 1] << 0; // B |
399 |
|
v += p[-WRAP + 1] << 1; // D |
400 |
|
v += p[-WRAP + 2] << 2; // L |
401 |
|
v += p[-WRAP - 2] << 3; // F |
402 |
|
|
403 |
/* distance of 2 */ |
v = v << 2; |
404 |
v = v << 2; |
v += p[-1] << 0; // A |
405 |
v += p[-2 * WRAP + 2] << 0; // K |
v += p[-WRAP] << 1; // C |
|
v += p[-2 * WRAP - 2] << 1; // G |
|
|
|
|
|
v = v << 1; |
|
|
v += p[-2] << 0; // E |
|
|
|
|
|
v = v << 3; |
|
|
v += p[-2 * WRAP - 1] << 0; // H |
|
|
v += p[-2 * WRAP] << 1; // I |
|
|
v += p[-2 * WRAP + 1] << 2; // J |
|
|
|
|
|
v = v << 4; |
|
|
v += p[-WRAP - 1] << 0; // B |
|
|
v += p[-WRAP + 1] << 1; // D |
|
|
v += p[-WRAP + 2] << 2; // L |
|
|
v += p[-WRAP - 2] << 3; // F |
|
|
|
|
|
v = v << 2; |
|
|
v += p[-1] << 0; // A |
|
|
v += p[-WRAP] << 1; // C |
|
406 |
|
|
407 |
return v; |
return v; |
408 |
} |
} |
409 |
|
|
410 |
static void decode_glyph(UniFontData *uf, |
static void decode_glyph(UniFontData *uf, |
421 |
memset(bitmap, 1, sizeof(bitmap)); |
memset(bitmap, 1, sizeof(bitmap)); |
422 |
p = bitmap + MAXDIST + WRAP * MAXDIST; |
p = bitmap + MAXDIST + WRAP * MAXDIST; |
423 |
w1 = (w + 7) >> 3; |
w1 = (w + 7) >> 3; |
424 |
for(y=0;y<h;y++) { |
for (y = 0; y < h; y++) { |
425 |
lbuf = 0; |
lbuf = 0; |
426 |
for(x=0;x<w;x++) { |
for (x = 0; x < w; x++) { |
427 |
v = get_ctx(x, y, p); |
v = get_ctx(x, y, p); |
428 |
if (ctx_adapt[v] == 0x00 || |
if (ctx_adapt[v] == 0x00 || |
429 |
ctx_adapt[v] == 0x10 || |
ctx_adapt[v] == 0x10 || |
466 |
return 0; |
return 0; |
467 |
} |
} |
468 |
n = 1 << (l - 1); |
n = 1 << (l - 1); |
469 |
for(i=l-2;i>=0;i--) { |
for (i = l-2; i >= 0; i--) { |
470 |
ctx = 0; |
ctx = 0; |
471 |
n |= decode_ctx(uf, &ctx) << i; |
n |= decode_ctx(uf, &ctx) << i; |
472 |
} |
} |
528 |
arith_init(uf); |
arith_init(uf); |
529 |
|
|
530 |
memset(&metric_ctx, 0, sizeof(metric_ctx)); |
memset(&metric_ctx, 0, sizeof(metric_ctx)); |
531 |
for(i=0;i<nb_glyphs;i++) { |
for (i = 0; i < nb_glyphs; i++) { |
532 |
m = &g->metrics[i]; |
m = &g->metrics[i]; |
533 |
decode_glyph_metric(uf, &metric_ctx, m); |
decode_glyph_metric(uf, &metric_ctx, m); |
534 |
} |
} |
554 |
|
|
555 |
/* allocate bitmap */ |
/* allocate bitmap */ |
556 |
bitmap_size = 0; |
bitmap_size = 0; |
557 |
for(i=0;i<nb_glyphs;i++) { |
for (i = 0; i < nb_glyphs; i++) { |
558 |
m = &g->metrics[i]; |
m = &g->metrics[i]; |
559 |
size = ((m->w + 7) >> 3) * m->h; |
size = ((m->w + 7) >> 3) * m->h; |
560 |
bitmap_size += size; |
bitmap_size += size; |
573 |
|
|
574 |
arith_init(uf); |
arith_init(uf); |
575 |
data = g->bitmap_table; |
data = g->bitmap_table; |
576 |
for(i=0;i<nb_glyphs;i++) { |
for (i = 0; i < nb_glyphs; i++) { |
577 |
m = &g->metrics[i]; |
m = &g->metrics[i]; |
578 |
m->bitmap = data; |
m->bitmap = data; |
579 |
decode_glyph(uf, ctx1, ctx, data, m->w, m->h); |
decode_glyph(uf, ctx1, ctx, data, m->w, m->h); |
598 |
} |
} |
599 |
|
|
600 |
redo: |
redo: |
601 |
for(i=0;i<CSEG_CACHE_SIZE;i++) { |
for (i = 0; i < CSEG_CACHE_SIZE; i++) { |
602 |
gseg = uf->cseg_cache[i]; |
gseg = uf->cseg_cache[i]; |
603 |
if (gseg && |
if (gseg && |
604 |
index >= gseg->first_glyph && |
index >= gseg->first_glyph && |
613 |
/* free least used segment selected segment */ |
/* free least used segment selected segment */ |
614 |
cseg_min = 0; |
cseg_min = 0; |
615 |
use_count_min = 0x7fffffff; |
use_count_min = 0x7fffffff; |
616 |
for(i=0;i<CSEG_CACHE_SIZE;i++) { |
for (i = 0; i < CSEG_CACHE_SIZE; i++) { |
617 |
if (uf->cseg_cache[i] == NULL) { |
if (uf->cseg_cache[i] == NULL) { |
618 |
cseg_min = i; |
cseg_min = i; |
619 |
break; |
break; |
764 |
{ |
{ |
765 |
int i, j, bit, x1; |
int i, j, bit, x1; |
766 |
dst += dst_wrap * y; |
dst += dst_wrap * y; |
767 |
for(i=0;i<h;i++) { |
for (i = 0; i < h; i++) { |
768 |
for(j=0;j<w;j++) { |
for (j = 0; j < w; j++) { |
769 |
bit = (src[j >> 3] >> (7 - (j & 7))) & 1; |
bit = (src[j >> 3] >> (7 - (j & 7))) & 1; |
770 |
x1 = x + j; |
x1 = x + j; |
771 |
dst[x1 >> 3] |= bit << (7 - (x1 & 7)); |
dst[x1 >> 3] |= bit << (7 - (x1 & 7)); |
832 |
|
|
833 |
/* render the three glyphs & supperpose them */ |
/* render the three glyphs & supperpose them */ |
834 |
memset(glyph_entry->bitmap, 0, glyph_entry->h * wrap); |
memset(glyph_entry->bitmap, 0, glyph_entry->h * wrap); |
835 |
for(i=0;i<3;i++) { |
for (i = 0; i < 3; i++) { |
836 |
index = fbf_unicode_to_glyph(uf, JOHAB_BASE + ind[i]); |
index = fbf_unicode_to_glyph(uf, JOHAB_BASE + ind[i]); |
837 |
if (index < 0) |
if (index < 0) |
838 |
continue; |
continue; |