Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego Borghetti <bdiego@gmail.com>2009-02-17 19:56:29 +0300
committerDiego Borghetti <bdiego@gmail.com>2009-02-17 19:56:29 +0300
commit16a61743e133e505bd4666ad30d1697764171ad8 (patch)
tree5ba2783ade41a70fbe23ef08c2a2c6ae3984c7d1 /source/blender/blenfont
parent9aa7e981bde5ad1b6f798ef5048cc4c373d09eb2 (diff)
Making the things compiled!!
I change the #if 0 with #if WITH_FREETYPE2, also fix a lot of typos, etc. This is the basic but now it draw text!!, I am using the "User Preference" space to test the library, nobody is working on that and the option are in the outliner now so... TODO-next: using the 4x4 mat, string size, bounding box, aspect and rotate. Notes: I update the Makefile, missing some include and other things so maybe scons, cmake and msvc also need update ?
Diffstat (limited to 'source/blender/blenfont')
-rw-r--r--source/blender/blenfont/BLF_api.h16
-rw-r--r--source/blender/blenfont/intern/Makefile38
-rw-r--r--source/blender/blenfont/intern/blf.c97
-rw-r--r--source/blender/blenfont/intern/blf_dir.c12
-rw-r--r--source/blender/blenfont/intern/blf_font.c61
-rw-r--r--source/blender/blenfont/intern/blf_glyph.c96
-rw-r--r--source/blender/blenfont/intern/blf_internal.h23
-rw-r--r--source/blender/blenfont/intern/blf_internal_types.h16
-rw-r--r--source/blender/blenfont/intern/blf_lang.c10
9 files changed, 294 insertions, 75 deletions
diff --git a/source/blender/blenfont/BLF_api.h b/source/blender/blenfont/BLF_api.h
index d91fbbf0fa9..cec3c81ee13 100644
--- a/source/blender/blenfont/BLF_api.h
+++ b/source/blender/blenfont/BLF_api.h
@@ -29,6 +29,18 @@
#ifndef BLF_API_H
#define BLF_API_H
+int BLF_init(void);
+void BLF_exit(void);
+
+int BLF_load(char *name);
+int BLF_load_mem(char *name, unsigned char *mem, int mem_size);
+
+void BLF_set(int fontid);
+void BLF_aspect(float aspect);
+void BLF_position(float x, float y, float z);
+void BLF_size(int size, int dpi);
+void BLF_draw(char *str);
+
/* Read the .Blanguages file, return 1 on success or 0 if fails. */
int BLF_lang_init(void);
@@ -49,8 +61,6 @@ int BLF_lang_error(void);
/* Return the code string for the specified language code. */
char *BLF_lang_find_code(short langid);
-#if 0
-
/* Add a path to the font dir paths. */
void BLF_dir_add(const char *path);
@@ -63,6 +73,4 @@ char **BLF_dir_get(int *ndir);
/* Free the data return by BLF_dir_get. */
void BLF_dir_free(char **dirs, int count);
-#endif /* zero!! */
-
#endif /* BLF_API_H */
diff --git a/source/blender/blenfont/intern/Makefile b/source/blender/blenfont/intern/Makefile
index 94e80466782..18bf42f3fa5 100644
--- a/source/blender/blenfont/intern/Makefile
+++ b/source/blender/blenfont/intern/Makefile
@@ -33,10 +33,46 @@ include nan_compile.mk
CFLAGS += $(LEVEL_1_C_WARNINGS)
-CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
+# OpenGL and Freetype2
+CPPFLAGS += -I$(NAN_GLEW)/include
+CPPFLAGS += $(OGL_CPPFLAGS)
+CPPFLAGS += -I$(NAN_FREETYPE)/include
+
+ifeq ($(OS), windows)
+ CPPFLAGS += -I$(NAN_ICONV)/include
+ ifeq ($(FREE_WINDOWS), true)
+ CPPFLAGS += -I$(NAN_FREETYPE)/include/freetype2
+ CPPFLAGS += -DUSE_GETTEXT_DLL
+ endif
+else
+ CPPFLAGS += -I$(NAN_FREETYPE)/include/freetype2
+endif
+
+ifeq ($(OS),linux)
+ ifeq ($(CPU),alpha)
+ CPPFLAGS += -I$(NAN_MESA)/include
+ endif
+ ifeq ($(CPU),i386)
+ CPPFLAGS += -I$(NAN_MESA)/include
+ endif
+ ifeq ($(CPU),powerpc)
+ CPPFLAGS += -I/usr/src/MesaCVS/include
+ endif
+endif
+
+ifeq ($(WITH_FREETYPE2), true)
+ CPPFLAGS += -DWITH_FREETYPE2
+endif
+
+# Modules
+CPPFLAGS += -I../../editors/include
CPPFLAGS += -I../../makesdna
CPPFLAGS += -I../../blenlib
CPPFLAGS += -I../../blenkernel
CPPFLAGS += -I../../ftfont
+# Memory allocator
+CPPFLAGS += -I$(NAN_GUARDEDALLOC)/include
+
+# Our own headers
CPPFLAGS += -I..
diff --git a/source/blender/blenfont/intern/blf.c b/source/blender/blenfont/intern/blf.c
index b503ea06404..b602a7f1234 100644
--- a/source/blender/blenfont/intern/blf.c
+++ b/source/blender/blenfont/intern/blf.c
@@ -26,20 +26,23 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#if 0
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#ifdef WITH_FREETYPE2
+
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
+#endif /* WITH_FREETYPE2 */
+
#include "MEM_guardedalloc.h"
#include "DNA_listBase.h"
+#include "DNA_vec_types.h"
#include "BKE_utildefines.h"
@@ -47,10 +50,15 @@
#include "BLI_linklist.h" /* linknode */
#include "BLI_string.h"
+#include "BIF_gl.h"
+#include "BIF_glutil.h"
+
#include "blf_internal_types.h"
#include "blf_internal.h"
+#ifdef WITH_FREETYPE2
+
/* Max number of font in memory.
* Take care that now every font have a glyph cache per size/dpi,
* so we don't need load the same font with different size, just
@@ -67,31 +75,55 @@ int global_font_num= 0;
/* Current font. */
int global_font_cur= 0;
+#endif /* WITH_FREETYPE2 */
+
int BLF_init(void)
{
+#ifdef WITH_FREETYPE2
int i;
for (i= 0; i < BLF_MAX_FONT; i++)
global_font[i]= NULL;
return(blf_font_init());
+#else
+ return(0);
+#endif
}
-int blf_search(char *name)
+void BLF_exit(void)
{
+#ifdef WITH_FREETYPE2
FontBLF *font;
int i;
for (i= 0; i < global_font_num; i++) {
font= global_font[i];
+ blf_font_free(font);
+ }
+
+ blf_font_exit();
+#endif
+}
+
+int blf_search(char *name)
+{
+#ifdef WITH_FREETYPE2
+ FontBLF *font;
+ int i;
+
+ for (i= 0; i < BLF_MAX_FONT; i++) {
+ font= global_font[i];
if (font && (!strcmp(font->name, name)))
return(i);
}
+#endif
return(-1);
}
int BLF_load(char *name)
{
+#ifdef WITH_FREETYPE2
FontBLF *font;
char *filename;
int i;
@@ -101,30 +133,44 @@ int BLF_load(char *name)
/* check if we already load this font. */
i= blf_search(name);
- if (i >= 0)
+ if (i >= 0) {
+ font= global_font[i];
+ font->ref++;
+ printf("Increment reference (%d): %s\n", font->ref, name);
return(i);
+ }
- if (global_font_num+1 >= BLF_MAX_FONT)
+ if (global_font_num+1 >= BLF_MAX_FONT) {
+ printf("Too many fonts!!!\n");
return(-1);
+ }
filename= blf_dir_search(name);
- if (!filename)
+ if (!filename) {
+ printf("Can't found font: %s\n", name);
return(-1);
+ }
font= blf_font_new(name, filename);
MEM_freeN(filename);
- if (!font)
+ if (!font) {
+ printf("Can't load font: %s\n", name);
return(-1);
+ }
global_font[global_font_num]= font;
i= global_font_num;
global_font_num++;
return(i);
+#else
+ return(-1);
+#endif /* WITH_FREETYPE2 */
}
int BLF_load_mem(char *name, unsigned char *mem, int mem_size)
{
+#ifdef WITH_FREETYPE2
FontBLF *font;
int i;
@@ -132,39 +178,55 @@ int BLF_load_mem(char *name, unsigned char *mem, int mem_size)
return(-1);
i= blf_search(name);
- if (i >= 0)
+ if (i >= 0) {
+ font= global_font[i];
+ font->ref++;
+ printf("Increment reference (%d): %s\n", font->ref, name);
return(i);
+ }
- if (global_font_num+1 >= BLF_MAX_FONT)
+ if (global_font_num+1 >= BLF_MAX_FONT) {
+ printf("Too many fonts!!!\n");
return(-1);
+ }
- font= blf_font_new_from_mem(name, mem, size);
- if (!font)
+ font= blf_font_new_from_mem(name, mem, mem_size);
+ if (!font) {
+ printf("Can't load font, %s from memory!!\n", name);
return(-1);
+ }
global_font[global_font_num]= font;
i= global_font_num;
global_font_num++;
return(i);
+#else
+ return(-1);
+#endif /* WITH_FREETYPE2 */
}
void BLF_set(int fontid)
{
- if (fontid >= 0 && fontid < global_font_num)
+#ifdef WITH_FREETYPE2
+ if (fontid >= 0 && fontid < BLF_MAX_FONT)
global_font_cur= fontid;
+#endif
}
void BLF_aspect(float aspect)
{
+#ifdef WITH_FREETYPE2
FontBLF *font;
font= global_font[global_font_cur];
if (font)
font->aspect= aspect;
+#endif
}
void BLF_position(float x, float y, float z)
{
+#ifdef WITH_FREETYPE2
FontBLF *font;
font= global_font[global_font_cur];
@@ -173,23 +235,27 @@ void BLF_position(float x, float y, float z)
font->pos[1]= y;
font->pos[2]= z;
}
+#endif
}
void BLF_size(int size, int dpi)
{
+#ifdef WITH_FREETYPE2
FontBLF *font;
font= global_font[global_font_cur];
if (font)
blf_font_size(font, size, dpi);
+#endif
}
void BLF_draw(char *str)
{
+#ifdef WITH_FREETYPE2
FontBLF *font;
font= global_font[global_font_cur];
- if (font) {
+ if (font && font->glyph_cache) {
glEnable(GL_BLEND);
glEnable(GL_TEXTURE_2D);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
@@ -200,9 +266,8 @@ void BLF_draw(char *str)
blf_font_draw(font, str);
glPopMatrix();
- glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
}
+#endif /* WITH_FREETYPE2 */
}
-
-#endif
diff --git a/source/blender/blenfont/intern/blf_dir.c b/source/blender/blenfont/intern/blf_dir.c
index dea422a1765..1216c610515 100644
--- a/source/blender/blenfont/intern/blf_dir.c
+++ b/source/blender/blenfont/intern/blf_dir.c
@@ -29,9 +29,19 @@
#include <stdlib.h>
#include <string.h>
+#ifdef WITH_FREETYPE2
+
+#include <ft2build.h>
+
+#include FT_FREETYPE_H
+#include FT_GLYPH_H
+
+#endif /* WITH_FREETYPE2 */
+
#include "MEM_guardedalloc.h"
#include "DNA_listBase.h"
+#include "DNA_vec_types.h"
#include "BKE_utildefines.h"
@@ -39,6 +49,8 @@
#include "BLI_linklist.h" /* linknode */
#include "BLI_string.h"
+#include "BIF_gl.h"
+
#include "blf_internal_types.h"
static ListBase global_font_dir= { NULL, NULL };
diff --git a/source/blender/blenfont/intern/blf_font.c b/source/blender/blenfont/intern/blf_font.c
index 28b33640692..62a64851109 100644
--- a/source/blender/blenfont/intern/blf_font.c
+++ b/source/blender/blenfont/intern/blf_font.c
@@ -26,31 +26,39 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#if 0
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#ifdef WITH_FREETYPE2
+
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
+#endif /* WITH_FREETYPE2 */
+
#include "MEM_guardedalloc.h"
#include "DNA_listBase.h"
+#include "DNA_vec_types.h"
#include "BKE_utildefines.h"
#include "BLI_blenlib.h"
#include "BLI_linklist.h" /* linknode */
#include "BLI_string.h"
+#include "BLI_arithb.h"
+
+#include "BIF_gl.h"
#include "blf_internal_types.h"
#include "blf_internal.h"
+#ifdef WITH_FREETYPE2
+
/* freetype2 handle. */
FT_Library global_ft_lib;
@@ -61,7 +69,7 @@ int blf_font_init(void)
void blf_font_exit(void)
{
- FT_Done_Freetype(global_ft_lib);
+ FT_Done_FreeType(global_ft_lib);
}
void blf_font_fill(FontBLF *font)
@@ -95,21 +103,20 @@ FontBLF *blf_font_new(char *name, char *filename)
font= (FontBLF *)MEM_mallocN(sizeof(FontBLF), "blf_font_new");
err= FT_New_Face(global_ft_lib, filename, 0, &font->face);
if (err) {
- printf("BLF: Can't load font: %s\n", filename);
MEM_freeN(font);
return(NULL);
}
err= FT_Select_Charmap(font->face, ft_encoding_unicode);
if (err) {
- printf("Warning: FT_Select_Charmap fail!!\n");
+ printf("Can't set the unicode character map!\n");
FT_Done_Face(font->face);
MEM_freeN(font);
return(NULL);
}
- font->name= MEM_strdup(name);
- font->filename= MEM_strdup(filename);
+ font->name= BLI_strdup(name);
+ font->filename= BLI_strdup(filename);
blf_font_fill(font);
return(font);
}
@@ -120,22 +127,21 @@ FontBLF *blf_font_new_from_mem(char *name, unsigned char *mem, int mem_size)
FT_Error err;
font= (FontBLF *)MEM_mallocN(sizeof(FontBLF), "blf_font_new_from_mem");
- err= FT_New_Memory_Face(global_ft_lib, mem, size, 0, &font->face);
+ err= FT_New_Memory_Face(global_ft_lib, mem, mem_size, 0, &font->face);
if (err) {
- printf("BLF: Can't load font: %s, from memory!!\n", name);
MEM_freeN(font);
return(NULL);
}
err= FT_Select_Charmap(font->face, ft_encoding_unicode);
if (err) {
- printf("BLF: FT_Select_Charmap fail!!\n");
+ printf("Can't set the unicode character map!\n");
FT_Done_Face(font->face);
MEM_freeN(font);
return(NULL);
}
- font->name= MEM_strdup(name);
+ font->name= BLI_strdup(name);
font->filename= NULL;
blf_font_fill(font);
return(font);
@@ -149,7 +155,7 @@ void blf_font_size(FontBLF *font, int size, int dpi)
err= FT_Set_Char_Size(font->face, 0, (size * 64), dpi, dpi);
if (err) {
/* FIXME: here we can go through the fixed size and choice a close one */
- printf("Warning: The current face don't support the size (%d) and dpi (%d)\n", size, dpi);
+ printf("The current font don't support the size, %d and dpi, %d\n", size, dpi);
return;
}
@@ -163,6 +169,8 @@ void blf_font_size(FontBLF *font, int size, int dpi)
gc= blf_glyph_cache_new(font);
if (gc)
font->glyph_cache= gc;
+ else
+ font->glyph_cache= NULL;
}
}
@@ -182,11 +190,11 @@ void blf_font_draw(FontBLF *font, char *str)
g_prev= NULL;
while (str[i]) {
- c= blf_uf8_next((unsigned char *)str, &i);
+ c= blf_utf8_next((unsigned char *)str, &i);
if (c == 0)
break;
- glyph_index= FT_Get_Char_Index(face, c);
+ glyph_index= FT_Get_Char_Index(font->face, c);
g= blf_glyph_search(font->glyph_cache, glyph_index);
if (!g)
g= blf_glyph_add(font, glyph_index, c);
@@ -195,11 +203,11 @@ void blf_font_draw(FontBLF *font, char *str)
if (!g)
continue;
- if (use_kering && g_prev) {
+ if (has_kerning && g_prev) {
delta.x= 0;
delta.y= 0;
- FT_Get_Kerning(font->face, g_prev->index, glyph_index, FT_KERNING_MODE_UNFITTED, &delta);
+ FT_Get_Kerning(font->face, g_prev->index, glyph_index, FT_KERNING_UNFITTED, &delta);
pen_x += delta.x >> 6;
}
@@ -209,4 +217,23 @@ void blf_font_draw(FontBLF *font, char *str)
}
}
-#endif /* zero!! */
+void blf_font_free(FontBLF *font)
+{
+ GlyphCacheBLF *gc;
+
+ font->glyph_cache= NULL;
+ while (font->cache.first) {
+ gc= font->cache.first;
+ BLI_remlink(&font->cache, gc);
+ blf_glyph_cache_free(gc);
+ }
+
+ FT_Done_Face(font->face);
+ if (font->filename)
+ MEM_freeN(font->filename);
+ if (font->name)
+ MEM_freeN(font->name);
+ MEM_freeN(font);
+}
+
+#endif /* WITH_FREETYPE2 */
diff --git a/source/blender/blenfont/intern/blf_glyph.c b/source/blender/blenfont/intern/blf_glyph.c
index ca8751a8746..3918be3d469 100644
--- a/source/blender/blenfont/intern/blf_glyph.c
+++ b/source/blender/blenfont/intern/blf_glyph.c
@@ -26,20 +26,25 @@
* ***** END GPL LICENSE BLOCK *****
*/
-#if 0
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <math.h>
+
+#ifdef WITH_FREETYPE2
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_GLYPH_H
+#include FT_OUTLINE_H
+
+#endif /* WITH_FREETYPE2 */
#include "MEM_guardedalloc.h"
#include "DNA_listBase.h"
+#include "DNA_vec_types.h"
#include "BKE_utildefines.h"
@@ -47,10 +52,14 @@
#include "BLI_linklist.h" /* linknode */
#include "BLI_string.h"
+#include "BIF_gl.h"
+
#include "blf_internal_types.h"
#include "blf_internal.h"
+#ifdef WITH_FREETYPE2
+
GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, int size, int dpi)
{
GlyphCacheBLF *p;
@@ -70,7 +79,7 @@ GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
GlyphCacheBLF *gc;
int i;
- gc= (GlyphCacheBLF *)MEM_mallocN(sizeof(GlyphCacheBLF));
+ gc= (GlyphCacheBLF *)MEM_mallocN(sizeof(GlyphCacheBLF), "blf_glyph_cache_new");
gc->next= NULL;
gc->prev= NULL;
gc->size= font->size;
@@ -81,30 +90,30 @@ GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
gc->bucket[i].last= NULL;
}
- gc->textures= (GLuint *)malloc(sizeof(GLunit)*256);
+ gc->textures= (GLuint *)malloc(sizeof(GLuint)*256);
gc->ntex= 256;
gc->cur_tex= -1;
gc->x_offs= 0;
gc->y_offs= 0;
gc->pad= 3;
- gc->num_glyphs= font->face.num_glyphs;
- gc->rem_glyphs= font->face.num_glyphs;
- gc->ascender= ((float)font->size.metrics.ascender) / 64.0f;
- gc->descender= ((float)font->size.metrics.descender) / 64.0f;
+ gc->num_glyphs= font->face->num_glyphs;
+ gc->rem_glyphs= font->face->num_glyphs;
+ gc->ascender= ((float)font->face->size->metrics.ascender) / 64.0f;
+ gc->descender= ((float)font->face->size->metrics.descender) / 64.0f;
if (FT_IS_SCALABLE(font->face)) {
gc->max_glyph_width= (float)((font->face->bbox.xMax - font->face->bbox.xMin) *
- (((float)font->face->size.metrics.x_ppem) /
+ (((float)font->face->size->metrics.x_ppem) /
((float)font->face->units_per_EM)));
gc->max_glyph_height= (float)((font->face->bbox.yMax - font->face->bbox.yMin) *
- (((float)font->face->size.metrics.y_ppem) /
+ (((float)font->face->size->metrics.y_ppem) /
((float)font->face->units_per_EM)));
}
else {
- gc->max_glyph_width= ((float)font->face->metrics.max_advance) / 64.0f;
- gc->max_glyph_height= ((float)font->face->size.metrics.height) / 64.0f;
+ gc->max_glyph_width= ((float)font->face->size->metrics.max_advance) / 64.0f;
+ gc->max_glyph_height= ((float)font->face->size->metrics.height) / 64.0f;
}
gc->p2_width= 0;
@@ -114,24 +123,42 @@ GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font)
return(gc);
}
+void blf_glyph_cache_free(GlyphCacheBLF *gc)
+{
+ GlyphBLF *g;
+ int i;
+
+ for (i= 0; i < 257; i++) {
+ while (gc->bucket[i].first) {
+ g= gc->bucket[i].first;
+ BLI_remlink(&(gc->bucket[i]), g);
+ blf_glyph_free(g);
+ }
+ }
+
+ glDeleteTextures(gc->cur_tex+1, gc->textures);
+ free((void *)gc->textures);
+ MEM_freeN(gc);
+}
+
void blf_glyph_cache_texture(FontBLF *font, GlyphCacheBLF *gc)
{
- int tot_mem;
+ int tot_mem, i;
unsigned char *buf;
/* move the index. */
gc->cur_tex++;
- if (gc->cur_tex > gc->ntex) {
+ if (gc->cur_tex >= gc->ntex) {
gc->ntex *= 2;
- gc->textures= (GLuint *)realloc((void *)gc->textures, sizeof(GLunit)*gc->ntex);
+ gc->textures= (GLuint *)realloc((void *)gc->textures, sizeof(GLuint)*gc->ntex);
}
gc->p2_width= blf_next_p2((gc->rem_glyphs * gc->max_glyph_width) + (gc->pad * 2));
if (gc->p2_width > font->max_tex_size)
gc->p2_width= font->max_tex_size;
- i= (int)((gc->p2_width - (gc->pad * 2)) / gc->p2_width);
+ i= (int)((gc->p2_width - (gc->pad * 2)) / gc->max_glyph_width);
gc->p2_height= blf_next_p2(((gc->num_glyphs / i) + 1) * gc->max_glyph_height);
if (gc->p2_height > font->max_tex_size)
@@ -141,7 +168,8 @@ void blf_glyph_cache_texture(FontBLF *font, GlyphCacheBLF *gc)
buf= (unsigned char *)malloc(tot_mem);
memset((void *)buf, 0, tot_mem);
- glGenTextures(1, (GLuint*)gc->texures[gc->cur_tex]);
+ glGenTextures(1, &gc->textures[gc->cur_tex]);
+ glBindTexture(GL_TEXTURE_2D, gc->textures[gc->cur_tex]);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
@@ -169,11 +197,11 @@ GlyphBLF *blf_glyph_search(GlyphCacheBLF *gc, FT_UInt idx)
GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
{
FT_GlyphSlot slot;
- GlyphCache *gc;
+ GlyphCacheBLF *gc;
GlyphBLF *g;
FT_Error err;
FT_Bitmap bitmap;
- FTBBox bbox;
+ FT_BBox bbox;
unsigned int key;
g= blf_glyph_search(font->glyph_cache, index);
@@ -188,7 +216,7 @@ GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
slot= font->face->glyph;
err= FT_Render_Glyph(slot, FT_RENDER_MODE_NORMAL);
- if (err)
+ if (err || slot->format != FT_GLYPH_FORMAT_BITMAP)
return(NULL);
g= (GlyphBLF *)MEM_mallocN(sizeof(GlyphBLF), "blf_glyph_add");
@@ -216,6 +244,7 @@ GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
bitmap= slot->bitmap;
g->tex= gc->textures[gc->cur_tex];
+
g->xoff= gc->x_offs;
g->yoff= gc->y_offs;
g->width= bitmap.width;
@@ -233,8 +262,8 @@ GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
}
g->advance= ((float)slot->advance.x) / 64.0f;
- g->pos_x= bitmap.left;
- g->pos_y= bitmap.top;
+ g->pos_x= slot->bitmap_left;
+ g->pos_y= slot->bitmap_top;
FT_Outline_Get_CBox(&(slot->outline), &bbox);
g->box.xmin= ((float)bbox.xMin) / 64.0f;
@@ -242,19 +271,28 @@ GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c)
g->box.ymin= ((float)bbox.yMin) / 64.0f;
g->box.ymax= ((float)bbox.yMax) / 64.0f;
- g->uv[0][0]= ((float)g->xoff) / ((float)g->p2_width);
- g->uv[0][1]= ((float)g->yoff) / ((float)g->p2_height);
- g->uv[1][0]= ((float)(g->xoff + g->width)) / ((float)g->p2_width);
- g->uv[1][1]= ((float)(g->yoff + g->height)) / ((float)g->p2_height);
+ g->uv[0][0]= ((float)g->xoff) / ((float)gc->p2_width);
+ g->uv[0][1]= ((float)g->yoff) / ((float)gc->p2_height);
+ g->uv[1][0]= ((float)(g->xoff + g->width)) / ((float)gc->p2_width);
+ g->uv[1][1]= ((float)(g->yoff + g->height)) / ((float)gc->p2_height);
/* update the x offset for the next glyph. */
gc->x_offs += (int)(g->box.xmax - g->box.xmin + gc->pad);
key= blf_hash(g->index);
- BLI_addhead(&gc->bucket[key], g);
+ BLI_addhead(&(gc->bucket[key]), g);
+ gc->rem_glyphs--;
return(g);
}
+void blf_glyph_free(GlyphBLF *g)
+{
+ /* don't need free the texture, the GlyphCache already
+ * have a list of all the texture and free it.
+ */
+ MEM_freeN(g);
+}
+
void blf_glyph_render(GlyphBLF *g, float x, float y)
{
GLint cur_tex;
@@ -262,7 +300,7 @@ void blf_glyph_render(GlyphBLF *g, float x, float y)
glGetIntegerv(GL_TEXTURE_2D_BINDING_EXT, &cur_tex);
if (cur_tex != g->tex)
- glBindTexture(GL_TEXTURE_2D, &g->tex);
+ glBindTexture(GL_TEXTURE_2D, g->tex);
dx= floor(x + g->pos_x);
glBegin(GL_QUADS);
@@ -280,4 +318,4 @@ void blf_glyph_render(GlyphBLF *g, float x, float y)
glEnd();
}
-#endif /* zero!! */
+#endif /* WITH_FREETYPE2 */
diff --git a/source/blender/blenfont/intern/blf_internal.h b/source/blender/blenfont/intern/blf_internal.h
index 8af94a8fb99..6bb7578935f 100644
--- a/source/blender/blenfont/intern/blf_internal.h
+++ b/source/blender/blenfont/intern/blf_internal.h
@@ -35,4 +35,27 @@ int blf_utf8_next(unsigned char *buf, int *iindex);
char *blf_dir_search(const char *file);
int blf_dir_split(const char *str, char *file, int *size);
+#ifdef WITH_FREETYPE2
+
+int blf_font_init(void);
+void blf_font_exit(void);
+
+FontBLF *blf_font_new(char *name, char *filename);
+FontBLF *blf_font_new_from_mem(char *name, unsigned char *mem, int mem_size);
+
+void blf_font_free(FontBLF *font);
+void blf_font_size(FontBLF *font, int size, int dpi);
+void blf_font_draw(FontBLF *font, char *str);
+
+GlyphCacheBLF *blf_glyph_cache_find(FontBLF *font, int size, int dpi);
+GlyphCacheBLF *blf_glyph_cache_new(FontBLF *font);
+void blf_glyph_cache_free(GlyphCacheBLF *gc);
+
+GlyphBLF *blf_glyph_search(GlyphCacheBLF *gc, FT_UInt idx);
+GlyphBLF *blf_glyph_add(FontBLF *font, FT_UInt index, unsigned int c);
+
+void blf_glyph_free(GlyphBLF *g);
+void blf_glyph_render(GlyphBLF *g, float x, float y);
+
+#endif /* WITH_FREETYPE2 */
#endif /* BLF_INTERNAL_H */
diff --git a/source/blender/blenfont/intern/blf_internal_types.h b/source/blender/blenfont/intern/blf_internal_types.h
index 5aacb2343bb..f8d5159bd9b 100644
--- a/source/blender/blenfont/intern/blf_internal_types.h
+++ b/source/blender/blenfont/intern/blf_internal_types.h
@@ -36,11 +36,11 @@ typedef struct DirBLF {
char *path;
} DirBLF;
-#if 0
+#ifdef WITH_FREETYPE2
-typedef struct _GlyphCacheBLF {
- struct _GlyphCacheBLF *next;
- struct _GlyphCacheBLF *prev;
+typedef struct GlyphCacheBLF {
+ struct GlyphCacheBLF *next;
+ struct GlyphCacheBLF *prev;
/* font size. */
int size;
@@ -88,9 +88,9 @@ typedef struct _GlyphCacheBLF {
float descender;
} GlyphCacheBLF;
-typedef struct _GlyphBLF {
- struct _GlyphBLF *next;
- struct _GlyphBLF *prev;
+typedef struct GlyphBLF {
+ struct GlyphBLF *next;
+ struct GlyphBLF *prev;
/* and the character, as UTF8 */
unsigned int c;
@@ -173,7 +173,7 @@ typedef struct FontBLF {
GlyphCacheBLF *glyph_cache;
} FontBLF;
-#endif /* zero!! */
+#endif /* WITH_FREETYPE2 */
typedef struct LangBLF {
struct LangBLF *next;
diff --git a/source/blender/blenfont/intern/blf_lang.c b/source/blender/blenfont/intern/blf_lang.c
index 0aaf399cf58..730440a5ae5 100644
--- a/source/blender/blenfont/intern/blf_lang.c
+++ b/source/blender/blenfont/intern/blf_lang.c
@@ -29,9 +29,17 @@
#include <stdlib.h>
#include <string.h>
+#ifdef WITH_FREETYPE2
+#include <ft2build.h>
+
+#include FT_FREETYPE_H
+#include FT_GLYPH_H
+#endif
+
#include "MEM_guardedalloc.h"
#include "DNA_listBase.h"
+#include "DNA_vec_types.h"
#include "BKE_utildefines.h"
@@ -39,6 +47,8 @@
#include "BLI_linklist.h" /* linknode */
#include "BLI_string.h"
+#include "BIF_gl.h"
+
#include "blf_internal_types.h"
// XXX 2.50 Remove this later.