Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. #include "fitz.h"
  2.  
  3. fz_text *
  4. fz_new_text(fz_font *font, fz_matrix trm, int wmode)
  5. {
  6.         fz_text *text;
  7.  
  8.         text = fz_malloc(sizeof(fz_text));
  9.         text->font = fz_keep_font(font);
  10.         text->trm = trm;
  11.         text->wmode = wmode;
  12.         text->len = 0;
  13.         text->cap = 0;
  14.         text->items = NULL;
  15.  
  16.         return text;
  17. }
  18.  
  19. void
  20. fz_free_text(fz_text *text)
  21. {
  22.         fz_drop_font(text->font);
  23.         fz_free(text->items);
  24.         fz_free(text);
  25. }
  26.  
  27. fz_text *
  28. fz_clone_text(fz_text *old)
  29. {
  30.         fz_text *text;
  31.  
  32.         text = fz_malloc(sizeof(fz_text));
  33.         text->font = fz_keep_font(old->font);
  34.         text->trm = old->trm;
  35.         text->wmode = old->wmode;
  36.         text->len = old->len;
  37.         text->cap = text->len;
  38.         text->items = fz_calloc(text->len, sizeof(fz_text_item));
  39.         memcpy(text->items, old->items, text->len * sizeof(fz_text_item));
  40.  
  41.         return text;
  42. }
  43.  
  44. fz_rect
  45. fz_bound_text(fz_text *text, fz_matrix ctm)
  46. {
  47.         fz_matrix trm;
  48.         fz_rect bbox;
  49.         fz_rect fbox;
  50.         int i;
  51.  
  52.         if (text->len == 0)
  53.                 return fz_empty_rect;
  54.  
  55.         /* find bbox of glyph origins in ctm space */
  56.  
  57.         bbox.x0 = bbox.x1 = text->items[0].x;
  58.         bbox.y0 = bbox.y1 = text->items[0].y;
  59.  
  60.         for (i = 1; i < text->len; i++)
  61.         {
  62.                 bbox.x0 = MIN(bbox.x0, text->items[i].x);
  63.                 bbox.y0 = MIN(bbox.y0, text->items[i].y);
  64.                 bbox.x1 = MAX(bbox.x1, text->items[i].x);
  65.                 bbox.y1 = MAX(bbox.y1, text->items[i].y);
  66.         }
  67.  
  68.         bbox = fz_transform_rect(ctm, bbox);
  69.  
  70.         /* find bbox of font in trm * ctm space */
  71.  
  72.         trm = fz_concat(text->trm, ctm);
  73.         trm.e = 0;
  74.         trm.f = 0;
  75.  
  76.         fbox.x0 = text->font->bbox.x0 * 0.001f;
  77.         fbox.y0 = text->font->bbox.y0 * 0.001f;
  78.         fbox.x1 = text->font->bbox.x1 * 0.001f;
  79.         fbox.y1 = text->font->bbox.y1 * 0.001f;
  80.  
  81.         fbox = fz_transform_rect(trm, fbox);
  82.  
  83.         /* expand glyph origin bbox by font bbox */
  84.  
  85.         bbox.x0 += fbox.x0;
  86.         bbox.y0 += fbox.y0;
  87.         bbox.x1 += fbox.x1;
  88.         bbox.y1 += fbox.y1;
  89.  
  90.         return bbox;
  91. }
  92.  
  93. static void
  94. fz_grow_text(fz_text *text, int n)
  95. {
  96.         if (text->len + n < text->cap)
  97.                 return;
  98.         while (text->len + n > text->cap)
  99.                 text->cap = text->cap + 36;
  100.         text->items = fz_realloc(text->items, text->cap, sizeof(fz_text_item));
  101. }
  102.  
  103. void
  104. fz_add_text(fz_text *text, int gid, int ucs, float x, float y)
  105. {
  106.         fz_grow_text(text, 1);
  107.         text->items[text->len].ucs = ucs;
  108.         text->items[text->len].gid = gid;
  109.         text->items[text->len].x = x;
  110.         text->items[text->len].y = y;
  111.         text->len++;
  112. }
  113.  
  114. static int isxmlmeta(int c)
  115. {
  116.         return c < 32 || c >= 128 || c == '&' || c == '<' || c == '>' || c == '\'' || c == '"';
  117. }
  118.  
  119. void fz_debug_text(fz_text *text, int indent)
  120. {
  121.         int i, n;
  122.         for (i = 0; i < text->len; i++)
  123.         {
  124.                 for (n = 0; n < indent; n++)
  125.                         putchar(' ');
  126.                 if (!isxmlmeta(text->items[i].ucs))
  127.                         printf("<g ucs=\"%c\" gid=\"%d\" x=\"%g\" y=\"%g\" />\n",
  128.                                 text->items[i].ucs, text->items[i].gid, text->items[i].x, text->items[i].y);
  129.                 else
  130.                         printf("<g ucs=\"U+%04X\" gid=\"%d\" x=\"%g\" y=\"%g\" />\n",
  131.                                 text->items[i].ucs, text->items[i].gid, text->items[i].x, text->items[i].y);
  132.         }
  133. }
  134.