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. #include "mupdf.h"
  3.  
  4. void
  5. pdf_set_font_wmode(pdf_font_desc *font, int wmode)
  6. {
  7.         font->wmode = wmode;
  8. }
  9.  
  10. void
  11. pdf_set_default_hmtx(pdf_font_desc *font, int w)
  12. {
  13.         font->dhmtx.w = w;
  14. }
  15.  
  16. void
  17. pdf_set_default_vmtx(pdf_font_desc *font, int y, int w)
  18. {
  19.         font->dvmtx.y = y;
  20.         font->dvmtx.w = w;
  21. }
  22.  
  23. void
  24. pdf_add_hmtx(pdf_font_desc *font, int lo, int hi, int w)
  25. {
  26.         if (font->hmtx_len + 1 >= font->hmtx_cap)
  27.         {
  28.                 font->hmtx_cap = font->hmtx_cap + 16;
  29.                 font->hmtx = fz_realloc(font->hmtx, font->hmtx_cap, sizeof(pdf_hmtx));
  30.         }
  31.  
  32.         font->hmtx[font->hmtx_len].lo = lo;
  33.         font->hmtx[font->hmtx_len].hi = hi;
  34.         font->hmtx[font->hmtx_len].w = w;
  35.         font->hmtx_len++;
  36. }
  37.  
  38. void
  39. pdf_add_vmtx(pdf_font_desc *font, int lo, int hi, int x, int y, int w)
  40. {
  41.         if (font->vmtx_len + 1 >= font->vmtx_cap)
  42.         {
  43.                 font->vmtx_cap = font->vmtx_cap + 16;
  44.                 font->vmtx = fz_realloc(font->vmtx, font->vmtx_cap, sizeof(pdf_vmtx));
  45.         }
  46.  
  47.         font->vmtx[font->vmtx_len].lo = lo;
  48.         font->vmtx[font->vmtx_len].hi = hi;
  49.         font->vmtx[font->vmtx_len].x = x;
  50.         font->vmtx[font->vmtx_len].y = y;
  51.         font->vmtx[font->vmtx_len].w = w;
  52.         font->vmtx_len++;
  53. }
  54.  
  55. static int cmph(const void *a0, const void *b0)
  56. {
  57.         pdf_hmtx *a = (pdf_hmtx*)a0;
  58.         pdf_hmtx *b = (pdf_hmtx*)b0;
  59.         return a->lo - b->lo;
  60. }
  61.  
  62. static int cmpv(const void *a0, const void *b0)
  63. {
  64.         pdf_vmtx *a = (pdf_vmtx*)a0;
  65.         pdf_vmtx *b = (pdf_vmtx*)b0;
  66.         return a->lo - b->lo;
  67. }
  68.  
  69. void
  70. pdf_end_hmtx(pdf_font_desc *font)
  71. {
  72.         if (!font->hmtx)
  73.                 return;
  74.         qsort(font->hmtx, font->hmtx_len, sizeof(pdf_hmtx), cmph);
  75. }
  76.  
  77. void
  78. pdf_end_vmtx(pdf_font_desc *font)
  79. {
  80.         if (!font->vmtx)
  81.                 return;
  82.         qsort(font->vmtx, font->vmtx_len, sizeof(pdf_vmtx), cmpv);
  83. }
  84.  
  85. pdf_hmtx
  86. pdf_get_hmtx(pdf_font_desc *font, int cid)
  87. {
  88.         int l = 0;
  89.         int r = font->hmtx_len - 1;
  90.         int m;
  91.  
  92.         if (!font->hmtx)
  93.                 goto notfound;
  94.  
  95.         while (l <= r)
  96.         {
  97.                 m = (l + r) >> 1;
  98.                 if (cid < font->hmtx[m].lo)
  99.                         r = m - 1;
  100.                 else if (cid > font->hmtx[m].hi)
  101.                         l = m + 1;
  102.                 else
  103.                         return font->hmtx[m];
  104.         }
  105.  
  106. notfound:
  107.         return font->dhmtx;
  108. }
  109.  
  110. pdf_vmtx
  111. pdf_get_vmtx(pdf_font_desc *font, int cid)
  112. {
  113.         pdf_hmtx h;
  114.         pdf_vmtx v;
  115.         int l = 0;
  116.         int r = font->vmtx_len - 1;
  117.         int m;
  118.  
  119.         if (!font->vmtx)
  120.                 goto notfound;
  121.  
  122.         while (l <= r)
  123.         {
  124.                 m = (l + r) >> 1;
  125.                 if (cid < font->vmtx[m].lo)
  126.                         r = m - 1;
  127.                 else if (cid > font->vmtx[m].hi)
  128.                         l = m + 1;
  129.                 else
  130.                         return font->vmtx[m];
  131.         }
  132.  
  133. notfound:
  134.         h = pdf_get_hmtx(font, cid);
  135.         v = font->dvmtx;
  136.         v.x = h.w / 2;
  137.         return v;
  138. }
  139.