Cleanup: minor changes to reduce code duplication
[blender.git] / source / blender / blenfont / intern / blf_font_i18n.c
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * The Original Code is Copyright (C) 2011 Blender Foundation.
19  * All rights reserved.
20  *
21  * Contributor(s): Blender Foundation,
22  *                 Sergey Sharybin
23  *
24  * ***** END GPL LICENSE BLOCK *****
25  */
26
27 /** \file blender/blenfont/intern/blf_font_i18n.c
28  *  \ingroup blf
29  *
30  * API for accessing font files.
31  */
32
33 #include <stdlib.h>
34 #include <string.h>
35
36 #include "BLF_api.h"
37
38 #include "MEM_guardedalloc.h"
39
40 #include "BLI_fileops.h"
41 #include "BLI_path_util.h"
42 #include "BLI_string.h"
43 #include "BLI_utildefines.h"
44
45 #include "BKE_appdir.h"
46
47 #ifdef WITH_INTERNATIONAL
48
49 struct FontBuf {
50         const char *filename;
51         uchar *data;
52         int data_len;
53 };
54
55 static struct FontBuf unifont_ttf =  {"droidsans.ttf.gz"};
56 static struct FontBuf unifont_mono_ttf = {"bmonofont-i18n.ttf.gz"};
57
58 static void fontbuf_load(struct FontBuf *fb)
59 {
60         const char *fontpath = BKE_appdir_folder_id(BLENDER_DATAFILES, "fonts");
61         uchar *data = NULL;
62         if (fontpath) {
63                 char unifont_path[1024];
64                 BLI_snprintf(unifont_path, sizeof(unifont_path), "%s/%s", fontpath, fb->filename);
65                 fb->data = (uchar *)BLI_file_ungzip_to_mem(unifont_path, &fb->data_len);
66
67         }
68         else {
69                 printf("%s: 'fonts' data path not found for '%s', continuing\n", __func__, fb->filename);
70         }
71 }
72
73 static void fontbuf_free(struct FontBuf *fb)
74 {
75         MEM_SAFE_FREE(fb->data);
76         fb->data_len = 0;
77 }
78
79 static uchar *fontbuf_get_mem(struct FontBuf *fb, int *r_size)
80 {
81         if (fb->data == NULL) {
82                 fontbuf_load(fb);
83         }
84         *r_size = fb->data_len;
85         return fb->data;
86 }
87
88 #endif /* WITH_INTERNATIONAL */
89
90
91 uchar *BLF_get_unifont(int *r_unifont_size)
92 {
93 #ifdef WITH_INTERNATIONAL
94         return fontbuf_get_mem(&unifont_ttf, r_unifont_size);
95 #else
96         UNUSED_VARS(r_unifont_size);
97         return NULL;
98 #endif
99 }
100
101 uchar *BLF_get_unifont_mono(int *r_unifont_size)
102 {
103 #ifdef WITH_INTERNATIONAL
104         return fontbuf_get_mem(&unifont_mono_ttf, r_unifont_size);
105 #else
106         UNUSED_VARS(r_unifont_size);
107         return NULL;
108 #endif
109 }
110
111 void BLF_free_unifont(void)
112 {
113 #ifdef WITH_INTERNATIONAL
114         fontbuf_free(&unifont_ttf);
115 #endif
116 }
117
118 void BLF_free_unifont_mono(void)
119 {
120 #ifdef WITH_INTERNATIONAL
121         fontbuf_free(&unifont_mono_ttf);
122 #endif
123 }