[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20111] branches/blender2.5/blender/source /blender/blenfont: Add support for attach a file with metrics information to the font.

Diego Borghetti bdiego at gmail.com
Fri May 8 23:24:58 CEST 2009


Revision: 20111
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20111
Author:   bdiego
Date:     2009-05-08 23:24:58 +0200 (Fri, 08 May 2009)

Log Message:
-----------
Add support for attach a file with metrics information to the font.

Fonts like Type 1, have one file with the glyph image and another
file with metrics and kerning information, this try to search if the font
have this information and load (try open the same file but with the .afm
and .pfm extension).

Also add a function to load the same information from memory, just in case
that in some point we add a font like this.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenfont/BLF_api.h
    branches/blender2.5/blender/source/blender/blenfont/intern/blf.c
    branches/blender2.5/blender/source/blender/blenfont/intern/blf_dir.c
    branches/blender2.5/blender/source/blender/blenfont/intern/blf_font.c
    branches/blender2.5/blender/source/blender/blenfont/intern/blf_internal.h

Modified: branches/blender2.5/blender/source/blender/blenfont/BLF_api.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenfont/BLF_api.h	2009-05-08 19:47:40 UTC (rev 20110)
+++ branches/blender2.5/blender/source/blender/blenfont/BLF_api.h	2009-05-08 21:24:58 UTC (rev 20111)
@@ -37,6 +37,9 @@
 int BLF_load(char *name);
 int BLF_load_mem(char *name, unsigned char *mem, int mem_size);
 
+/* Attach a file with metrics information from memory. */
+void BLF_metrics_attach(unsigned char *mem, int mem_size);
+
 /*
  * Set/Get the current font.
  */

Modified: branches/blender2.5/blender/source/blender/blenfont/intern/blf.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenfont/intern/blf.c	2009-05-08 19:47:40 UTC (rev 20110)
+++ branches/blender2.5/blender/source/blender/blenfont/intern/blf.c	2009-05-08 21:24:58 UTC (rev 20111)
@@ -156,6 +156,15 @@
 	return(i);
 }
 
+void BLF_metrics_attach(unsigned char *mem, int mem_size)
+{
+	FontBLF *font;
+
+	font= global_font[global_font_cur];
+	if (font)
+		blf_font_attach_from_mem(font, mem, mem_size);
+}
+
 int BLF_load_mem(char *name, unsigned char *mem, int mem_size)
 {
 	FontBLF *font;

Modified: branches/blender2.5/blender/source/blender/blenfont/intern/blf_dir.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenfont/intern/blf_dir.c	2009-05-08 19:47:40 UTC (rev 20110)
+++ branches/blender2.5/blender/source/blender/blenfont/intern/blf_dir.c	2009-05-08 21:24:58 UTC (rev 20111)
@@ -173,3 +173,37 @@
 	}
 	return(0);
 }
+
+/* Some font have additional file with metrics information,
+ * in general, the extension of the file is: .afm or .pfm
+ */
+char *blf_dir_metrics_search(char *filename)
+{
+	char *mfile;
+	char *s;
+
+	mfile= BLI_strdup(filename);
+	s= strrchr(mfile, '.');
+	if (s) {
+		if (strlen(s) < 4) {
+			MEM_freeN(mfile);
+			return(NULL);
+		}
+		s++;
+		s[0]= 'a';
+		s[1]= 'f';
+		s[2]= 'm';
+
+		/* first check .afm */
+		if (BLI_exist(s))
+			return(s);
+
+		/* and now check .pfm */
+		s[0]= 'p';
+
+		if (BLI_exist(s))
+			return(s);
+	}
+	MEM_freeN(mfile);
+	return(NULL);
+}

Modified: branches/blender2.5/blender/source/blender/blenfont/intern/blf_font.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenfont/intern/blf_font.c	2009-05-08 19:47:40 UTC (rev 20110)
+++ branches/blender2.5/blender/source/blender/blenfont/intern/blf_font.c	2009-05-08 21:24:58 UTC (rev 20111)
@@ -308,6 +308,7 @@
 {
 	FontBLF *font;
 	FT_Error err;
+	char *mfile;
 
 	font= (FontBLF *)MEM_mallocN(sizeof(FontBLF), "blf_font_new");
 	err= FT_New_Face(global_ft_lib, filename, 0, &font->face);
@@ -324,12 +325,28 @@
 		return(NULL);
 	}
 
+	mfile= blf_dir_metrics_search(filename);
+	if (mfile) {
+		err= FT_Attach_File(font->face, mfile);
+		MEM_freeN(mfile);
+	}
+
 	font->name= BLI_strdup(name);
 	font->filename= BLI_strdup(filename);
 	blf_font_fill(font);
 	return(font);
 }
 
+void blf_font_attach_from_mem(FontBLF *font, const unsigned char *mem, int mem_size)
+{
+	FT_Open_Args open;
+
+	open.flags= FT_OPEN_MEMORY;
+	open.memory_base= (FT_Byte *)mem;
+	open.memory_size= mem_size;
+	FT_Attach_Stream(font->face, &open);
+}
+
 FontBLF *blf_font_new_from_mem(char *name, unsigned char *mem, int mem_size)
 {
 	FontBLF *font;

Modified: branches/blender2.5/blender/source/blender/blenfont/intern/blf_internal.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenfont/intern/blf_internal.h	2009-05-08 19:47:40 UTC (rev 20110)
+++ branches/blender2.5/blender/source/blender/blenfont/intern/blf_internal.h	2009-05-08 21:24:58 UTC (rev 20111)
@@ -33,6 +33,7 @@
 int blf_utf8_next(unsigned char *buf, int *iindex);
 
 char *blf_dir_search(const char *file);
+char *blf_dir_metrics_search(char *filename);
 int blf_dir_split(const char *str, char *file, int *size);
 
 int blf_font_init(void);
@@ -40,6 +41,8 @@
 
 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_attach_from_mem(FontBLF *font, const unsigned char *mem, int mem_size);
+
 void blf_font_size(FontBLF *font, int size, int dpi);
 void blf_font_draw(FontBLF *font, char *str);
 void blf_font_boundbox(FontBLF *font, char *str, rctf *box);





More information about the Bf-blender-cvs mailing list