/[qemacs]/qemacs/libfbf.c
ViewVC logotype

Diff of /qemacs/libfbf.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.3 by chqrlie, Sun May 8 14:56:51 2005 UTC revision 1.4 by chqrlie, Wed May 11 15:12:14 2005 UTC
# Line 65  static int get_bits(UniFontData *uf, int Line 65  static int get_bits(UniFontData *uf, int
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;
# Line 133  static void fbf_get_str(UniFontData *uf, Line 133  static void fbf_get_str(UniFontData *uf,
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;
# Line 192  int fbf_load_font(UniFontData *uf) Line 192  int fbf_load_font(UniFontData *uf)
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    
# Line 232  void fbf_free_font(UniFontData *uf) Line 232  void fbf_free_font(UniFontData *uf)
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);
# Line 253  static void init_context_tables(void) Line 253  static void init_context_tables(void)
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)
# Line 273  static void init_context_tables(void) Line 273  static void init_context_tables(void)
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;
# Line 368  static inline int get_ctx(int x, int y, Line 368  static inline int get_ctx(int x, int y,
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,
# Line 421  static void decode_glyph(UniFontData *uf Line 421  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 ||
# Line 466  static int read_num1(UniFontData *uf, En Line 466  static int read_num1(UniFontData *uf, En
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      }      }
# Line 528  static GlyphSegment *decode_metrics_segm Line 528  static GlyphSegment *decode_metrics_segm
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      }      }
# Line 554  static int decode_glyphs_segment(UniFont Line 554  static int decode_glyphs_segment(UniFont
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;
# Line 573  static int decode_glyphs_segment(UniFont Line 573  static int decode_glyphs_segment(UniFont
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);
# Line 598  int fbf_decode_glyph(UniFontData *uf, Line 598  int fbf_decode_glyph(UniFontData *uf,
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 &&
# Line 613  int fbf_decode_glyph(UniFontData *uf, Line 613  int fbf_decode_glyph(UniFontData *uf,
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;
# Line 764  static inline void bitmap_or(unsigned ch Line 764  static inline void bitmap_or(unsigned ch
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));
# Line 832  static int decode_hangul_glyph(UniFontDa Line 832  static int decode_hangul_glyph(UniFontDa
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;

Legend:
Removed from v.1.3  
changed lines
  Added in v.1.4

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26