/src/canvas/default/ftk_font_manager.c

http://ftk.googlecode.com/ · C · 145 lines · 91 code · 25 blank · 29 comment · 16 complexity · 4db74ddc2b90b6e1310632042d52498b MD5 · raw file

  1. /*
  2. * File: ftk_font_manager.c
  3. * Author: Li XianJing <xianjimli@hotmail.com>
  4. * Brief: font manager.
  5. *
  6. * Copyright (c) 2009 - 2011 Li XianJing <xianjimli@hotmail.com>
  7. *
  8. * Licensed under the Academic Free License version 2.1
  9. *
  10. * This program is free software; you can redistribute it and/or modify
  11. * it under the terms of the GNU General Public License as published by
  12. * the Free Software Foundation; either version 2 of the License, or
  13. * (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  23. */
  24. /*
  25. * History:
  26. * ================================================================
  27. * 2011-03-20 Li XianJing <xianjimli@hotmail.com> created
  28. *
  29. */
  30. #include "ftk_util.h"
  31. #include "ftk_font.h"
  32. #include "ftk_globals.h"
  33. #include "ftk_font_manager.h"
  34. typedef struct _FtkFontEntry
  35. {
  36. FtkFont* font;
  37. FtkFontDesc* font_desc;
  38. }FtkFontEntry;
  39. struct _FtkFontManager
  40. {
  41. int nr;
  42. int used_nr;
  43. FtkFontDesc* default_font_desc;
  44. FtkFontEntry fonts[ZERO_LEN_ARRAY];
  45. };
  46. FtkFontManager* ftk_font_manager_create(int max_font_nr)
  47. {
  48. FtkFontManager* thiz = (FtkFontManager*)FTK_ZALLOC(sizeof(FtkFontManager)
  49. + sizeof(FtkFontEntry) * max_font_nr);
  50. if(thiz != NULL)
  51. {
  52. thiz->nr = max_font_nr;
  53. thiz->default_font_desc = ftk_font_desc_create(NULL);
  54. }
  55. return thiz;
  56. }
  57. FtkFont* ftk_font_manager_get_default_font(FtkFontManager* thiz)
  58. {
  59. FtkFont* font = NULL;
  60. return_val_if_fail(thiz != NULL, NULL);
  61. font = ftk_font_manager_load(thiz, thiz->default_font_desc);
  62. ftk_font_ref(font);
  63. return font;
  64. }
  65. FtkFont* ftk_font_manager_load(FtkFontManager* thiz, FtkFontDesc* font_desc)
  66. {
  67. int i = 0;
  68. FtkFont* font = NULL;
  69. char filename[FTK_MAX_PATH + 1] = {0};
  70. return_val_if_fail(thiz != NULL && font_desc != NULL, NULL);
  71. #ifndef USE_FREETYPE
  72. font_desc = thiz->default_font_desc;
  73. #endif
  74. for(i = 0; i < thiz->used_nr; i++)
  75. {
  76. if(ftk_font_desc_is_equal(thiz->fonts[i].font_desc, font_desc))
  77. {
  78. ftk_font_ref(thiz->fonts[i].font);
  79. return thiz->fonts[i].font;
  80. }
  81. }
  82. return_val_if_fail((thiz->used_nr+1) < thiz->nr, NULL);
  83. #if defined(USE_FREETYPE) && defined(ANDROID) && defined(ANDROID_NDK)
  84. ftk_strcpy(filename, ftk_font_desc_get_fontname(font_desc));
  85. #else
  86. ftk_strs_cat(filename, FTK_MAX_PATH,
  87. ftk_config_get_data_dir(ftk_default_config()), "/data/", ftk_font_desc_get_fontname(font_desc), NULL);
  88. ftk_normalize_path(filename);
  89. #endif
  90. font = ftk_font_create(filename, font_desc);
  91. if(font != NULL)
  92. {
  93. #if defined(USE_FREETYPE) || defined(USE_DEFAULT_FONT)
  94. FtkFont* cached_font = ftk_font_cache_create(font, 512);
  95. ftk_font_unref(font);
  96. font = cached_font;
  97. #endif
  98. ftk_font_ref(font);
  99. ftk_font_desc_ref(font_desc);
  100. thiz->fonts[thiz->used_nr].font = font;
  101. thiz->fonts[thiz->used_nr].font_desc = font_desc;
  102. thiz->used_nr++;
  103. }
  104. return font;
  105. }
  106. void ftk_font_manager_destroy(FtkFontManager* thiz)
  107. {
  108. int i = 0;
  109. if(thiz != NULL)
  110. {
  111. for(i = 0; i < thiz->used_nr; i++)
  112. {
  113. ftk_font_destroy(thiz->fonts[i].font);
  114. ftk_font_desc_unref(thiz->fonts[i].font_desc);
  115. }
  116. ftk_font_desc_unref(thiz->default_font_desc);
  117. FTK_FREE(thiz);
  118. }
  119. return;
  120. }