freetype.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #include "freetype/freetype.h"
  2. #include "freetype.h"
  3. static char* fterrstr(int);
  4. char*
  5. ftnewface(char *path, int index, FTface *f, FTfaceinfo *finfo)
  6. {
  7. FT_Library ft_lib;
  8. FT_Face ft_face;
  9. char *err;
  10. err = fterrstr(FT_Init_FreeType(&ft_lib));
  11. if (err != nil)
  12. return err;
  13. err = fterrstr(FT_New_Face(ft_lib, path, index, &ft_face));
  14. if (err != nil) {
  15. FT_Done_FreeType(ft_lib);
  16. return err;
  17. }
  18. f->ft_lib = ft_lib;
  19. f->ft_face = ft_face;
  20. finfo->nfaces = ft_face->num_faces;
  21. finfo->index = ft_face->face_index;
  22. finfo->style = ft_face->style_flags;
  23. finfo->height = (FT_MulFix(ft_face->height, ft_face->size->metrics.y_scale)+32)/64;
  24. finfo->ascent = (FT_MulFix(ft_face->ascender, ft_face->size->metrics.y_scale)+32)/64;
  25. finfo->familyname = ft_face->family_name;
  26. finfo->stylename = ft_face->style_name;
  27. return nil;
  28. }
  29. char*
  30. ftloadmemface(void *buf, int nbytes, int index, FTface *f, FTfaceinfo *finfo)
  31. {
  32. USED(buf);
  33. USED(f);
  34. USED(finfo);
  35. return "not implemented";
  36. }
  37. char*
  38. ftsetcharsize(FTface f, int pt, int hdpi, int vdpi, FTfaceinfo *finfo)
  39. {
  40. FT_Face ft_face = f.ft_face;
  41. char *err;
  42. err = fterrstr(FT_Set_Char_Size(ft_face, 0, pt, hdpi, vdpi));
  43. if (err != nil)
  44. return err;
  45. finfo->height = (FT_MulFix(ft_face->height, ft_face->size->metrics.y_scale)+32)/64;
  46. finfo->ascent = (FT_MulFix(ft_face->ascender, ft_face->size->metrics.y_scale)+32)/64;
  47. return nil;
  48. }
  49. void
  50. ftsettransform(FTface f, FTmatrix *m, FTvector *v)
  51. {
  52. /* FTMatrix and FTVector are compatible with FT_Matrix and FT_Vector */
  53. FT_Set_Transform(f.ft_face, (FT_Matrix*)m, (FT_Vector*)v);
  54. }
  55. int
  56. fthaschar(FTface f, int c)
  57. {
  58. return FT_Get_Char_Index(f.ft_face, c) != 0;
  59. }
  60. char*
  61. ftloadglyph(FTface f, int ix, FTglyph *g)
  62. {
  63. FT_Face ft_face = f.ft_face;
  64. FT_GlyphSlot ft_glyph;
  65. char *err;
  66. ix = FT_Get_Char_Index(ft_face, ix);
  67. err = fterrstr(FT_Load_Glyph(ft_face, ix, FT_LOAD_NO_BITMAP|FT_LOAD_RENDER|FT_LOAD_CROP_BITMAP));
  68. if (err != nil)
  69. return err;
  70. ft_glyph = ft_face->glyph;
  71. g->top = ft_glyph->bitmap_top;
  72. g->left = ft_glyph->bitmap_left;
  73. g->height = ft_glyph->bitmap.rows;
  74. g->width = ft_glyph->bitmap.width;
  75. g->advx = ft_glyph->advance.x;
  76. g->advy = ft_glyph->advance.y;
  77. g->bpr = ft_glyph->bitmap.pitch;
  78. g->bitmap = ft_glyph->bitmap.buffer;
  79. return nil;
  80. }
  81. void
  82. ftdoneface(FTface f)
  83. {
  84. if (f.ft_face != nil)
  85. FT_Done_Face(f.ft_face);
  86. if (f.ft_lib != nil)
  87. FT_Done_FreeType(f.ft_lib);
  88. }
  89. /*
  90. * get the freetype error strings
  91. */
  92. typedef struct FTerr FTerr;
  93. struct FTerr {
  94. int code;
  95. char* text;
  96. };
  97. #define FT_NOERRORDEF_(l,c,t)
  98. #define FT_ERRORDEF_(l,c,t) c,t,
  99. static FTerr fterrs[] = {
  100. #include "freetype/fterrdef.h"
  101. -1, "",
  102. };
  103. static char*
  104. fterrstr(int code)
  105. {
  106. int i;
  107. if (code == 0)
  108. return nil;
  109. for (i = 0; fterrs[i].code > 0; i++) {
  110. if (fterrs[i].code == code)
  111. return fterrs[i].text;
  112. }
  113. return "unknown FreeType error";
  114. }