ref: 7cf4d377f4a2b545ab2bd876dabd8df5a00376ac
parent: 993a8d044538e59ebaffe27d4d04f8efb979fd7c
author: Werner Lemberg <[email protected]>
date: Tue May 21 10:13:01 EDT 2002
* src/type42/t42drivr.c: s/T42_ENCODING_TYPE_/T1_ENCODING_TYPE_/. (parse_font_matrix): Remove unnecessary code. (parse_sfnts): Initialize some variables. (t42_driver_class) [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Use ft_module_driver_has_hinter conditionally. Moved some type 42 specific structure definitions to... * include/freetype/internal/t42types.h: New file. * include/freetype/internal/internal.h (FT_INTERNAL_T42_TYPES_H): New macro. * include/freetype/cache/ftcsbits.h (FTC_SBit): Added a new field `num_grays' for specifying the number of used gray levels. * src/cache/ftcsbits.c (ftc_sbit_node_load): Initialize it. Adding a driver for BDF fonts written by Francesco Zappa Nardelli <[email protected]>. Heavily modified by me to better adapt it to FreeType, removing unneeded stuff. Additionally, it now supports Mark Leisher's BDF extension for anti-aliased bitmap glyphs with 2 and 4 bpp. * src/bdf/*: New driver. * include/freetype/internal/bdftypes.h: New file. * include/freetype/internal/fttrace.h: Added BDF driver components. * include/freetype/fterrdef.h: Added error codes for BDF driver. * include/freetype/config/ftmodule.h, src/Jamfile: Updated. * include/freetype/internal/internal.h (FT_INTERNAL_BDF_TYPES_H): New macro. * include/freetype/config/ftstdlib.h (ft_sprintf): New alias for sprintf. * include/freetype/internal/fttrace.h: Added Type 42 driver component. * src/type42/t42drivr.c: Use it. * include/freetype/internal/internal.h (FT_INTERNAL_PCF_TYPES_H): New macro.
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,49 @@
+2002-05-21 Roberto Alameda <[email protected]>.
+
+ * src/type42/t42drivr.c: s/T42_ENCODING_TYPE_/T1_ENCODING_TYPE_/.
+ (parse_font_matrix): Remove unnecessary code.
+ (parse_sfnts): Initialize some variables.
+ (t42_driver_class) [TT_CONFIG_OPTION_BYTECODE_INTERPRETER]: Use
+ ft_module_driver_has_hinter conditionally.
+ Moved some type 42 specific structure definitions to...
+ * include/freetype/internal/t42types.h: New file.
+ * include/freetype/internal/internal.h (FT_INTERNAL_T42_TYPES_H):
+ New macro.
+
+2002-05-20 Werner Lemberg <[email protected]>
+
+ * include/freetype/cache/ftcsbits.h (FTC_SBit): Added a new field
+ `num_grays' for specifying the number of used gray levels.
+ * src/cache/ftcsbits.c (ftc_sbit_node_load): Initialize it.
+
+2002-05-19 Werner Lemberg <[email protected]>
+
+ Adding a driver for BDF fonts written by Francesco Zappa Nardelli
+ <[email protected]>. Heavily modified by me to
+ better adapt it to FreeType, removing unneeded stuff. Additionally,
+ it now supports Mark Leisher's BDF extension for anti-aliased
+ bitmap glyphs with 2 and 4 bpp.
+
+ * src/bdf/*: New driver.
+ * include/freetype/internal/bdftypes.h: New file.
+ * include/freetype/internal/fttrace.h: Added BDF driver components.
+ * include/freetype/fterrdef.h: Added error codes for BDF driver.
+ * include/freetype/config/ftmodule.h, src/Jamfile: Updated.
+ * include/freetype/internal/internal.h (FT_INTERNAL_BDF_TYPES_H):
+ New macro.
+
+ * include/freetype/config/ftstdlib.h (ft_sprintf): New alias for
+ sprintf.
+
+2002-05-18 Werner Lemberg <[email protected]>
+
+ * include/freetype/internal/fttrace.h: Added Type 42 driver
+ component.
+ * src/type42/t42drivr.c: Use it.
+
+ * include/freetype/internal/internal.h (FT_INTERNAL_PCF_TYPES_H):
+ New macro.
+
2002-05-17 Werner Lemberg <[email protected]>
* src/type42/Jamfile: New file.
--- a/include/freetype/cache/ftcsbits.h
+++ b/include/freetype/cache/ftcsbits.h
@@ -57,28 +57,30 @@
/* A very compact structure used to describe a small glyph bitmap. */
/* */
/* <Fields> */
- /* width :: The bitmap width in pixels. */
+ /* width :: The bitmap width in pixels. */
/* */
- /* height :: The bitmap height in pixels. */
+ /* height :: The bitmap height in pixels. */
/* */
- /* left :: The horizontal distance from the pen position to the */
- /* left bitmap border (a.k.a. `left side bearing', or */
- /* `lsb'). */
+ /* left :: The horizontal distance from the pen position to the */
+ /* left bitmap border (a.k.a. `left side bearing', or */
+ /* `lsb'). */
/* */
- /* top :: The vertical distance from the pen position (on the */
- /* baseline) to the upper bitmap border (a.k.a. `top side */
- /* bearing'). The distance is positive for upwards */
- /* Y coordinates. */
+ /* top :: The vertical distance from the pen position (on the */
+ /* baseline) to the upper bitmap border (a.k.a. `top */
+ /* side bearing'). The distance is positive for upwards */
+ /* Y coordinates. */
/* */
- /* format :: The format of the glyph bitmap (monochrome or gray). */
+ /* format :: The format of the glyph bitmap (monochrome or gray). */
/* */
- /* pitch :: The number of bytes per bitmap line. May be positive */
- /* or negative. */
+ /* num_grays :: The number of gray levels. */
/* */
- /* xadvance :: The horizontal advance width in pixels. */
+ /* pitch :: The number of bytes per bitmap line. May be positive */
+ /* or negative. */
/* */
- /* yadvance :: The vertical advance height in pixels. */
+ /* xadvance :: The horizontal advance width in pixels. */
/* */
+ /* yadvance :: The vertical advance height in pixels. */
+ /* */
/* buffer :: A pointer to the bitmap pixels. */
/* */
typedef struct FTC_SBitRec_
@@ -89,6 +91,7 @@
FT_Char top;
FT_Byte format;
+ FT_Short num_grays; /* XXX: Should be FT_Byte. See ftcsbits.c */
FT_Char pitch;
FT_Char xadvance;
FT_Char yadvance;
--- a/include/freetype/config/ftmodule.h
+++ b/include/freetype/config/ftmodule.h
@@ -2,6 +2,7 @@
FT_USE_MODULE(cff_driver_class)
FT_USE_MODULE(t1cid_driver_class)
FT_USE_MODULE(pcf_driver_class)
+FT_USE_MODULE(bdf_driver_class)
FT_USE_MODULE(psaux_module_class)
FT_USE_MODULE(psnames_module_class)
FT_USE_MODULE(pshinter_module_class)
@@ -13,4 +14,3 @@
FT_USE_MODULE(t42_driver_class)
FT_USE_MODULE(pfr_driver_class)
FT_USE_MODULE(winfnt_driver_class)
-
--- a/include/freetype/config/ftstdlib.h
+++ b/include/freetype/config/ftstdlib.h
@@ -91,6 +91,10 @@
#define ft_memmove memmove
#define ft_memcmp memcmp
+#include <stdio.h>
+
+#define ft_sprintf sprintf
+
/**********************************************************************/
/* */
--- a/include/freetype/fterrdef.h
+++ b/include/freetype/fterrdef.h
@@ -35,19 +35,19 @@
"no error" )
FT_ERRORDEF_( Cannot_Open_Resource, 0x01, \
- "cannot open resource" )
+ "cannot open resource" )
FT_ERRORDEF_( Unknown_File_Format, 0x02, \
- "unknown file format" )
+ "unknown file format" )
FT_ERRORDEF_( Invalid_File_Format, 0x03, \
- "broken file" )
+ "broken file" )
FT_ERRORDEF_( Invalid_Version, 0x04, \
- "invalid FreeType version" )
+ "invalid FreeType version" )
FT_ERRORDEF_( Lower_Module_Version, 0x05, \
- "module version is too low" )
+ "module version is too low" )
FT_ERRORDEF_( Invalid_Argument, 0x06, \
- "invalid argument" )
+ "invalid argument" )
FT_ERRORDEF_( Unimplemented_Feature, 0x07, \
- "unimplemented feature" )
+ "unimplemented feature" )
FT_ERRORDEF_( Invalid_Table, 0x08, \
"broken table" )
FT_ERRORDEF_( Invalid_Offset, 0x09, \
@@ -56,158 +56,174 @@
/* glyph/character errors */
FT_ERRORDEF_( Invalid_Glyph_Index, 0x10, \
- "invalid glyph index" )
+ "invalid glyph index" )
FT_ERRORDEF_( Invalid_Character_Code, 0x11, \
- "invalid character code" )
+ "invalid character code" )
FT_ERRORDEF_( Invalid_Glyph_Format, 0x12, \
- "unsupported glyph image format" )
+ "unsupported glyph image format" )
FT_ERRORDEF_( Cannot_Render_Glyph, 0x13, \
- "cannot render this glyph format" )
+ "cannot render this glyph format" )
FT_ERRORDEF_( Invalid_Outline, 0x14, \
- "invalid outline" )
+ "invalid outline" )
FT_ERRORDEF_( Invalid_Composite, 0x15, \
- "invalid composite glyph" )
+ "invalid composite glyph" )
FT_ERRORDEF_( Too_Many_Hints, 0x16, \
- "too many hints" )
+ "too many hints" )
FT_ERRORDEF_( Invalid_Pixel_Size, 0x17, \
- "invalid pixel size" )
+ "invalid pixel size" )
/* handle errors */
FT_ERRORDEF_( Invalid_Handle, 0x20, \
- "invalid object handle" )
+ "invalid object handle" )
FT_ERRORDEF_( Invalid_Library_Handle, 0x21, \
- "invalid library handle" )
+ "invalid library handle" )
FT_ERRORDEF_( Invalid_Driver_Handle, 0x22, \
- "invalid module handle" )
+ "invalid module handle" )
FT_ERRORDEF_( Invalid_Face_Handle, 0x23, \
- "invalid face handle" )
+ "invalid face handle" )
FT_ERRORDEF_( Invalid_Size_Handle, 0x24, \
- "invalid size handle" )
+ "invalid size handle" )
FT_ERRORDEF_( Invalid_Slot_Handle, 0x25, \
- "invalid glyph slot handle" )
+ "invalid glyph slot handle" )
FT_ERRORDEF_( Invalid_CharMap_Handle, 0x26, \
- "invalid charmap handle" )
+ "invalid charmap handle" )
FT_ERRORDEF_( Invalid_Cache_Handle, 0x27, \
- "invalid cache manager handle" )
+ "invalid cache manager handle" )
FT_ERRORDEF_( Invalid_Stream_Handle, 0x28, \
- "invalid stream handle" )
+ "invalid stream handle" )
/* driver errors */
FT_ERRORDEF_( Too_Many_Drivers, 0x30, \
- "too many modules" )
+ "too many modules" )
FT_ERRORDEF_( Too_Many_Extensions, 0x31, \
- "too many extensions" )
+ "too many extensions" )
/* memory errors */
FT_ERRORDEF_( Out_Of_Memory, 0x40, \
- "out of memory" )
+ "out of memory" )
FT_ERRORDEF_( Unlisted_Object, 0x41, \
- "unlisted object" )
+ "unlisted object" )
/* stream errors */
FT_ERRORDEF_( Cannot_Open_Stream, 0x51, \
- "cannot open stream" )
+ "cannot open stream" )
FT_ERRORDEF_( Invalid_Stream_Seek, 0x52, \
- "invalid stream seek" )
+ "invalid stream seek" )
FT_ERRORDEF_( Invalid_Stream_Skip, 0x53, \
- "invalid stream skip" )
+ "invalid stream skip" )
FT_ERRORDEF_( Invalid_Stream_Read, 0x54, \
- "invalid stream read" )
+ "invalid stream read" )
FT_ERRORDEF_( Invalid_Stream_Operation, 0x55, \
- "invalid stream operation" )
+ "invalid stream operation" )
FT_ERRORDEF_( Invalid_Frame_Operation, 0x56, \
- "invalid frame operation" )
+ "invalid frame operation" )
FT_ERRORDEF_( Nested_Frame_Access, 0x57, \
- "nested frame access" )
+ "nested frame access" )
FT_ERRORDEF_( Invalid_Frame_Read, 0x58, \
- "invalid frame read" )
+ "invalid frame read" )
/* raster errors */
FT_ERRORDEF_( Raster_Uninitialized, 0x60, \
- "raster uninitialized" )
+ "raster uninitialized" )
FT_ERRORDEF_( Raster_Corrupted, 0x61, \
- "raster corrupted" )
+ "raster corrupted" )
FT_ERRORDEF_( Raster_Overflow, 0x62, \
- "raster overflow" )
+ "raster overflow" )
FT_ERRORDEF_( Raster_Negative_Height, 0x63, \
- "negative height while rastering" )
+ "negative height while rastering" )
/* cache errors */
FT_ERRORDEF_( Too_Many_Caches, 0x70, \
- "too many registered caches" )
+ "too many registered caches" )
/* TrueType and SFNT errors */
FT_ERRORDEF_( Invalid_Opcode, 0x80, \
- "invalid opcode" )
+ "invalid opcode" )
FT_ERRORDEF_( Too_Few_Arguments, 0x81, \
- "too few arguments" )
+ "too few arguments" )
FT_ERRORDEF_( Stack_Overflow, 0x82, \
- "stack overflow" )
+ "stack overflow" )
FT_ERRORDEF_( Code_Overflow, 0x83, \
- "code overflow" )
+ "code overflow" )
FT_ERRORDEF_( Bad_Argument, 0x84, \
- "bad argument" )
+ "bad argument" )
FT_ERRORDEF_( Divide_By_Zero, 0x85, \
- "division by zero" )
+ "division by zero" )
FT_ERRORDEF_( Invalid_Reference, 0x86, \
- "invalid reference" )
+ "invalid reference" )
FT_ERRORDEF_( Debug_OpCode, 0x87, \
- "found debug opcode" )
+ "found debug opcode" )
FT_ERRORDEF_( ENDF_In_Exec_Stream, 0x88, \
- "found ENDF opcode in execution stream" )
+ "found ENDF opcode in execution stream" )
FT_ERRORDEF_( Nested_DEFS, 0x89, \
- "nested DEFS" )
+ "nested DEFS" )
FT_ERRORDEF_( Invalid_CodeRange, 0x8A, \
- "invalid code range" )
+ "invalid code range" )
FT_ERRORDEF_( Execution_Too_Long, 0x8B, \
- "execution context too long" )
+ "execution context too long" )
FT_ERRORDEF_( Too_Many_Function_Defs, 0x8C, \
- "too many function definitions" )
+ "too many function definitions" )
FT_ERRORDEF_( Too_Many_Instruction_Defs, 0x8D, \
- "too many instruction definitions" )
+ "too many instruction definitions" )
FT_ERRORDEF_( Table_Missing, 0x8E, \
- "SFNT font table missing" )
+ "SFNT font table missing" )
FT_ERRORDEF_( Horiz_Header_Missing, 0x8F, \
- "horizontal header (hhea) table missing" )
+ "horizontal header (hhea) table missing" )
FT_ERRORDEF_( Locations_Missing, 0x90, \
- "locations (loca) table missing" )
+ "locations (loca) table missing" )
FT_ERRORDEF_( Name_Table_Missing, 0x91, \
- "name table missing" )
+ "name table missing" )
FT_ERRORDEF_( CMap_Table_Missing, 0x92, \
- "character map (cmap) table missing" )
+ "character map (cmap) table missing" )
FT_ERRORDEF_( Hmtx_Table_Missing, 0x93, \
- "horizontal metrics (hmtx) table missing" )
+ "horizontal metrics (hmtx) table missing" )
FT_ERRORDEF_( Post_Table_Missing, 0x94, \
- "PostScript (post) table missing" )
+ "PostScript (post) table missing" )
FT_ERRORDEF_( Invalid_Horiz_Metrics, 0x95, \
- "invalid horizontal metrics" )
+ "invalid horizontal metrics" )
FT_ERRORDEF_( Invalid_CharMap_Format, 0x96, \
- "invalid character map (cmap) format" )
+ "invalid character map (cmap) format" )
FT_ERRORDEF_( Invalid_PPem, 0x97, \
- "invalid ppem value" )
+ "invalid ppem value" )
FT_ERRORDEF_( Invalid_Vert_Metrics, 0x98, \
- "invalid vertical metrics" )
+ "invalid vertical metrics" )
FT_ERRORDEF_( Could_Not_Find_Context, 0x99, \
- "could not find context" )
+ "could not find context" )
FT_ERRORDEF_( Invalid_Post_Table_Format, 0x9A, \
- "invalid PostScript (post) table format" )
+ "invalid PostScript (post) table format" )
FT_ERRORDEF_( Invalid_Post_Table, 0x9B, \
- "invalid PostScript (post) table" )
+ "invalid PostScript (post) table" )
/* CFF, CID, and Type 1 errors */
FT_ERRORDEF_( Syntax_Error, 0xA0, \
- "opcode syntax error" )
+ "opcode syntax error" )
FT_ERRORDEF_( Stack_Underflow, 0xA1, \
- "argument stack underflow" )
+ "argument stack underflow" )
+ /* BDF errors */
+
+ FT_ERRORDEF_( Missing_Startfont_Field, 0xB0, \
+ "`STARTFONT' field missing" )
+ FT_ERRORDEF_( Missing_Font_Field, 0xB1, \
+ "`FONT' field missing" )
+ FT_ERRORDEF_( Missing_Size_Field, 0xB2, \
+ "`SIZE' field missing" )
+ FT_ERRORDEF_( Missing_Chars_Field, 0xB3, \
+ "`CHARS' field missing" )
+ FT_ERRORDEF_( Missing_Startchar_Field, 0xB4, \
+ "`STARTCHAR' field missing" )
+ FT_ERRORDEF_( Missing_Encoding_Field, 0xB5, \
+ "`ENCODING' field missing" )
+ FT_ERRORDEF_( Missing_Bbx_Field, 0xB6, \
+ "`BBX' field missing" )
/* END */
--- /dev/null
+++ b/include/freetype/internal/bdftypes.h
@@ -1,0 +1,53 @@
+/* bdftypes.h
+
+ FreeType font driver for bdf fonts
+
+ Copyright (C) 2001, 2002 by
+ Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+#ifndef __BDFTYPES_H__
+#define __BDFTYPES_H__
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+
+
+FT_BEGIN_HEADER
+
+
+ typedef struct BDF_Public_FaceRec_
+ {
+ FT_FaceRec root;
+
+ char* charset_encoding;
+ char* charset_registry;
+
+ } BDF_Public_FaceRec, *BDF_Public_Face;
+
+
+FT_END_HEADER
+
+
+#endif /* __BDFTYPES_H__ */
+
+
+/* END */
--- a/include/freetype/internal/fttrace.h
+++ b/include/freetype/internal/fttrace.h
@@ -77,6 +77,9 @@
FT_TRACE_DEF( cffobjs )
FT_TRACE_DEF( cffparse )
+/* Type 42 driver component */
+FT_TRACE_DEF( t42 )
+
/* CID driver components */
FT_TRACE_DEF( cidafm )
FT_TRACE_DEF( ciddriver )
@@ -88,14 +91,16 @@
/* Windows fonts component */
FT_TRACE_DEF( winfnt )
-/* PCF fonts component */
+/* PCF fonts components */
FT_TRACE_DEF( pcfdriver )
FT_TRACE_DEF( pcfread )
/* BDF fonts component */
-FT_TRACE_DEF( bdf )
+FT_TRACE_DEF( bdfdriver )
+FT_TRACE_DEF( bdflib )
/* PFR fonts component */
FT_TRACE_DEF( pfr )
+
/* END */
--- a/include/freetype/internal/internal.h
+++ b/include/freetype/internal/internal.h
@@ -38,8 +38,11 @@
#define FT_INTERNAL_TRUETYPE_TYPES_H <freetype/internal/tttypes.h>
#define FT_INTERNAL_TYPE1_TYPES_H <freetype/internal/t1types.h>
+#define FT_INTERNAL_TYPE42_TYPES_H <freetype/internal/t42types.h>
#define FT_INTERNAL_CFF_TYPES_H <freetype/internal/cfftypes.h>
#define FT_INTERNAL_FNT_TYPES_H <freetype/internal/fnttypes.h>
+#define FT_INTERNAL_BDF_TYPES_H <freetype/internal/bdftypes.h>
+#define FT_INTERNAL_PCF_TYPES_H <freetype/internal/pcftypes.h>
#define FT_INTERNAL_POSTSCRIPT_NAMES_H <freetype/internal/psnames.h>
#define FT_INTERNAL_POSTSCRIPT_AUX_H <freetype/internal/psaux.h>
--- a/include/freetype/internal/t1types.h
+++ b/include/freetype/internal/t1types.h
@@ -21,7 +21,7 @@
#define __T1TYPES_H__
-#include<ft2build.h>
+#include <ft2build.h>
#include FT_TYPE1_TABLES_H
#include FT_INTERNAL_POSTSCRIPT_NAMES_H
#include FT_INTERNAL_POSTSCRIPT_HINTS_H
--- /dev/null
+++ b/include/freetype/internal/t42types.h
@@ -1,0 +1,85 @@
+/***************************************************************************/
+/* */
+/* t42types.h */
+/* */
+/* Type 42 font data types (specification only). */
+/* */
+/* Copyright 2002 by Roberto Alameda. */
+/* */
+/* This file is part of the FreeType project, and may only be used, */
+/* modified, and distributed under the terms of the FreeType project */
+/* license, LICENSE.TXT. By continuing to use, modify, or distribute */
+/* this file you indicate that you have read the license and */
+/* understand and accept it fully. */
+/* */
+/***************************************************************************/
+
+
+#ifndef __T42TYPES_H__
+#define __T42TYPES_H__
+
+
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_TYPE1_TABLES_H
+#include FT_INTERNAL_TYPE1_TYPES_H
+#include FT_INTERNAL_POSTSCRIPT_NAMES_H
+#include FT_INTERNAL_POSTSCRIPT_HINTS_H
+
+
+FT_BEGIN_HEADER
+
+
+ typedef struct T42_FontRec_
+ {
+ /* font info dictionary */
+ PS_FontInfoRec font_info;
+
+ /* top-level dictionary */
+ FT_String* font_name;
+
+ T1_EncodingType encoding_type;
+ T1_EncodingRec encoding;
+
+ FT_Byte* charstrings_block;
+ FT_Byte* glyph_names_block;
+
+ FT_Int num_glyphs;
+ FT_String** glyph_names; /* array of glyph names */
+ FT_Byte** charstrings; /* array of glyph charstrings */
+ FT_Int* charstrings_len;
+
+ FT_Byte paint_type;
+ FT_Byte font_type;
+ FT_Matrix font_matrix; /* From FontMatrix field: a, b, c, d */
+ FT_Vector font_offset; /* From FontMatrix field: tx, ty */
+ FT_BBox font_bbox;
+
+ FT_Int stroke_width;
+
+ } T42_FontRec, *T42_Font;
+
+
+ typedef struct T42_FaceRec_
+ {
+ FT_FaceRec root;
+ T42_FontRec type42;
+ const void* psnames;
+ const void* psaux;
+ const void* afm_data;
+ FT_Byte* ttf_data;
+ FT_ULong ttf_size;
+ FT_Face ttf_face;
+ FT_CharMapRec charmaprecs[2];
+ FT_CharMap charmaps[2];
+ PS_Unicodes unicode_map;
+
+ } T42_FaceRec, *T42_Face;
+
+
+FT_END_HEADER
+
+#endif /* __T1TYPES_H__ */
+
+
+/* END */
--- a/src/Jamfile
+++ b/src/Jamfile
@@ -14,7 +14,6 @@
#
HDRMACRO [ FT2_SubDir include internal internal.h ] ;
-SubInclude FT2_TOP src pshinter ;
SubInclude FT2_TOP src autohint ;
SubInclude FT2_TOP src base ;
SubInclude FT2_TOP src bdf ;
@@ -24,6 +23,7 @@
SubInclude FT2_TOP src pcf ;
SubInclude FT2_TOP src pfr ;
SubInclude FT2_TOP src psaux ;
+SubInclude FT2_TOP src pshinter ;
SubInclude FT2_TOP src psnames ;
SubInclude FT2_TOP src raster ;
SubInclude FT2_TOP src sfnt ;
--- /dev/null
+++ b/src/bdf/Jamfile
@@ -1,0 +1,23 @@
+# FreeType 2 src/bdf Jamfile (c) 2002 David Turner
+#
+
+SubDir FT2_TOP src bdf ;
+
+SubDirHdrs [ FT2_SubDir src bdf ] ;
+
+{
+ local _sources ;
+
+ if $(FT2_MULTI)
+ {
+ _sources = bdfdrivr bdflib ;
+ }
+ else
+ {
+ _sources = bdf ;
+ }
+
+ Library $(FT2_LIB) : $(_sources).c ;
+}
+
+# end of src/bdf Jamfile
--- /dev/null
+++ b/src/bdf/README
@@ -1,0 +1,146 @@
+ FreeType font driver for BDF fonts
+
+ Francesco Zappa Nardelli
+ <[email protected]>
+
+
+Introduction
+************
+
+BDF (Bitmap Distribution Format) is a bitmap font format defined by Adobe,
+which is intended to be easily understood by both humans and computers.
+This code implements a BDF driver for the FreeType library, following the
+Adobe Specification V 2.2. The specification of the BDF font format is
+available from Adobe's web site:
+
+ http://partners.adobe.com/asn/developer/PDFS/TN/5005.BDF_Spec.pdf
+
+Many good bitmap fonts in bdf format come with XFree86 (www.XFree86.org).
+They do not define vertical metrics, because the X Consortium BDF
+specification has removed them.
+
+
+Encodings
+*********
+
+The variety of encodings that accompanies bdf fonts appears to encompass the
+small set defined in freetype.h. On the other hand, two properties that
+specify encoding and registry are usually defined in bdf fonts.
+
+I decided to make these two properties directly accessible, leaving to the
+client application the work of interpreting them. For instance:
+
+
+ #include FT_INTERNAL_BDF_TYPES_H
+
+ FT_Face face;
+ BDF_Public_Face bdfface;
+
+
+ FT_New_Face( library, ..., &face );
+
+ bdfface = (BDF_Public_Face)face;
+
+ if ( ( bdfface->charset_registry == "ISO10646" ) &&
+ ( bdfface->charset_encoding == "1" ) )
+ [..]
+
+
+Thus the driver always exports `ft_encoding_none' as face->charmap.encoding.
+FT_Get_Char_Index's behavior is unmodified, that is, it converts the ULong
+value given as argument into the corresponding glyph number.
+
+If the two properties are not available, Adobe Standard Encoding should be
+assumed.
+
+
+Anti-Aliased Bitmaps
+********************
+
+The driver supports an extension to the BDF format as used in Mark Leisher's
+xmbdfed bitmap font editor. It introduces a fourth field to the `SIZE'
+keyword which gives the bpp value (bits per pixel) of the glyph data in the
+font. Possible values are 1 (the default), 2 (four gray levels), and 4 (16
+gray levels). The driver returns either a bitmap with 1 bit per pixel or a
+pixmap with 8bits per pixel (using 4 and 16 gray levels, respectively).
+
+
+Known problems
+**************
+
+- A font is entirely loaded into memory. Obviously, this is not the Right
+ Thing(TM). If you have big fonts I suggest you convert them into PCF
+ format (using the bdftopcf utility): the PCF font drive of FreeType can
+ perform incremental glyph loading.
+
+When I have some time, I will implement on-demand glyph parsing.
+
+- Except for encodings properties, client applications have no visibility of
+ the PCF_Face object. This means that applications cannot directly access
+ font tables and must trust FreeType.
+
+- Currently, glyph names are ignored.
+
+ I plan to give full visibility of the BDF_Face object in an upcoming
+ revision of the driver, thus implementing also glyph names.
+
+- As I have never seen a BDF font that defines vertical metrics, vertical
+ metrics are (parsed and) discarded. If you own a BDF font that defines
+ vertical metrics, please let me know (I will implement them in 5-10
+ minutes).
+
+
+License
+*******
+
+Copyright (C) 2001-2002 by Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*** Portions of the driver (that is, bdflib.c and bdf.h):
+
+Copyright 2000 Computing Research Labs, New Mexico State University
+Copyright 2001-2002 Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
+OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+
+Credits
+*******
+
+This driver is based on excellent Mark Leisher's bdf library. If you
+find something good in this driver you should probably thank him, not
+me.
--- a/src/bdf/bdf.c
+++ b/src/bdf/bdf.c
@@ -2,7 +2,7 @@
FreeType font driver for bdf files
- Copyright (C) 2001 by
+ Copyright (C) 2001, 2002 by
Francesco Zappa Nardelli
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -28,6 +28,7 @@
#include <ft2build.h>
#include "bdflib.c"
-#include "bdfdriver.c"
+#include "bdfdrivr.c"
+
/* END */
--- a/src/bdf/bdf.h
+++ b/src/bdf/bdf.h
@@ -1,6 +1,6 @@
/*
* Copyright 2000 Computing Research Labs, New Mexico State University
- * Copyright 2001 Francesco Zappa Nardelli
+ * Copyright 2001, 2002 Francesco Zappa Nardelli
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -20,15 +20,16 @@
* OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
+
+
#ifndef __BDF_H__
#define __BDF_H__
+
/*
- * $Id$
+ * Based on bdf.h,v 1.16 2000/03/16 20:08:51 mleisher
*/
-#include <string.h>
-
#include <ft2build.h>
#include FT_INTERNAL_OBJECTS_H
#include FT_INTERNAL_STREAM_H
@@ -35,333 +36,260 @@
FT_BEGIN_HEADER
-/* Imported from bdfP.h */
-#ifndef MYABS
-#define MYABS(xx) ((xx) < 0 ? -(xx) : (xx))
-#endif
-#define _bdf_glyph_modified(map, e) ((map)[(e) >> 5] & (1 << ((e) & 31)))
-#define _bdf_set_glyph_modified(map, e) (map)[(e) >> 5] |= (1 << ((e) & 31))
-#define _bdf_clear_glyph_modified(map, e) (map)[(e) >> 5] &= ~(1 << ((e) & 31))
+/* Imported from bdfP.h */
+#define _bdf_glyph_modified( map, e ) \
+ ( (map)[(e) >> 5] & ( 1 << ( (e) & 31 ) ) )
+#define _bdf_set_glyph_modified( map, e ) \
+ ( (map)[(e) >> 5] |= ( 1 << ( (e) & 31 ) ) )
+#define _bdf_clear_glyph_modified( map, e ) \
+ ( (map)[(e) >> 5] &= ~( 1 << ( (e) & 31 ) ) )
+
/* end of bdfP.h */
-/**************************************************************************
- *
- * BDF font options macros and types.
- *
- **************************************************************************/
-#define BDF_UNIX_EOL 1 /* Save fonts with Unix LF. */
-#define BDF_DOS_EOL 2 /* Save fonts with DOS CRLF. */
-#define BDF_MAC_EOL 3 /* Save fonts with Mac CR. */
+ /*************************************************************************/
+ /* */
+ /* BDF font options macros and types. */
+ /* */
+ /*************************************************************************/
-#define BDF_CORRECT_METRICS 0x01 /* Correct invalid metrics when loading. */
-#define BDF_KEEP_COMMENTS 0x02 /* Preserve the font comments. */
-#define BDF_KEEP_UNENCODED 0x04 /* Keep the unencoded glyphs. */
-#define BDF_PROPORTIONAL 0x08 /* Font has proportional spacing. */
-#define BDF_MONOWIDTH 0x10 /* Font has mono width. */
-#define BDF_CHARCELL 0x20 /* Font has charcell spacing. */
-#define BDF_ALL_SPACING (BDF_PROPORTIONAL|BDF_MONOWIDTH|BDF_CHARCELL)
+#define BDF_CORRECT_METRICS 0x01 /* Correct invalid metrics when loading. */
+#define BDF_KEEP_COMMENTS 0x02 /* Preserve the font comments. */
+#define BDF_KEEP_UNENCODED 0x04 /* Keep the unencoded glyphs. */
+#define BDF_PROPORTIONAL 0x08 /* Font has proportional spacing. */
+#define BDF_MONOWIDTH 0x10 /* Font has mono width. */
+#define BDF_CHARCELL 0x20 /* Font has charcell spacing. */
-#define BDF_DEFAULT_LOAD_OPTIONS \
- (BDF_CORRECT_METRICS|BDF_KEEP_COMMENTS|BDF_KEEP_UNENCODED|BDF_PROPORTIONAL)
+#define BDF_ALL_SPACING ( BDF_PROPORTIONAL | \
+ BDF_MONOWIDTH | \
+ BDF_CHARCELL )
-typedef struct {
- int ttf_hint;
- int correct_metrics;
- int keep_unencoded;
- int keep_comments;
- int pad_cells;
- int font_spacing;
- long point_size;
- unsigned long resolution_x;
- unsigned long resolution_y;
- int bits_per_pixel;
- int eol;
-} bdf_options_t;
+#define BDF_DEFAULT_LOAD_OPTIONS ( BDF_CORRECT_METRICS | \
+ BDF_KEEP_COMMENTS | \
+ BDF_KEEP_UNENCODED | \
+ BDF_PROPORTIONAL )
-/*
- * Callback function type for unknown configuration options.
- */
-typedef int (*bdf_options_callback_t) (bdf_options_t *opts,
- char **params,
- unsigned long nparams,
- void *client_data);
-/**************************************************************************
- *
- * BDF font property macros and types.
- *
- **************************************************************************/
+ typedef struct bdf_options_t_
+ {
+ int correct_metrics;
+ int keep_unencoded;
+ int keep_comments;
+ int font_spacing;
-#define BDF_ATOM 1
-#define BDF_INTEGER 2
-#define BDF_CARDINAL 3
+ } bdf_options_t;
-/*
- * This structure represents a particular property of a font.
- * There are a set of defaults and each font has their own.
- */
-typedef struct {
- char *name; /* Name of the property. */
- int format; /* Format of the property. */
- int builtin; /* A builtin property. */
- union {
- char *atom;
- long int32;
- unsigned long card32;
- } value; /* Value of the property. */
-} bdf_property_t;
-/**************************************************************************
- *
- * BDF font metric and glyph types.
- *
- **************************************************************************/
+ /* Callback function type for unknown configuration options. */
+ typedef int
+ (*bdf_options_callback_t)( bdf_options_t* opts,
+ char** params,
+ unsigned long nparams,
+ void* client_data );
-/*
- * A general bitmap type, mostly used when the glyph bitmap is being edited.
- */
-typedef struct {
- short x;
- short y;
- unsigned short width;
- unsigned short height;
- unsigned short bpp;
- unsigned short pad;
- unsigned char *bitmap;
- unsigned long bytes;
-} bdf_bitmap_t;
-typedef struct {
- int font_spacing;
- unsigned short swidth;
- unsigned short dwidth;
- unsigned short width;
- unsigned short height;
- short x_offset;
- short y_offset;
- short ascent;
- short descent;
-} bdf_metrics_t;
+ /*************************************************************************/
+ /* */
+ /* BDF font property macros and types. */
+ /* */
+ /*************************************************************************/
-typedef struct {
- unsigned short width;
- unsigned short height;
- short x_offset;
- short y_offset;
- short ascent;
- short descent;
-} bdf_bbx_t;
-typedef struct {
- char *name; /* Glyph name. */
- long encoding; /* Glyph encoding. */
- unsigned short swidth; /* Scalable width. */
- unsigned short dwidth; /* Device width. */
- bdf_bbx_t bbx; /* Glyph bounding box. */
- unsigned char *bitmap; /* Glyph bitmap. */
- unsigned short bytes; /* Number of bytes used for the bitmap. */
-} bdf_glyph_t;
+#define BDF_ATOM 1
+#define BDF_INTEGER 2
+#define BDF_CARDINAL 3
-typedef struct {
- char *key;
- void *data;
-} _hashnode, *hashnode;
-typedef struct {
- int limit;
- int size;
- int used;
- hashnode *table;
-} hashtable;
+ /* This structure represents a particular property of a font. */
+ /* There are a set of defaults and each font has their own. */
+ typedef struct bdf_property_t_
+ {
+ char* name; /* Name of the property. */
+ int format; /* Format of the property. */
+ int builtin; /* A builtin property. */
+ union
+ {
+ char* atom;
+ long int32;
+ unsigned long card32;
-typedef struct {
- unsigned short pad; /* Pad to 4-byte boundary. */
- unsigned short bpp; /* Bits per pixel. */
- long start; /* Beginning encoding value of glyphs. */
- long end; /* Ending encoding value of glyphs. */
- bdf_glyph_t *glyphs; /* Glyphs themselves. */
- unsigned long glyphs_size; /* Glyph structures allocated. */
- unsigned long glyphs_used; /* Glyph structures used. */
- bdf_bbx_t bbx; /* Overall bounding box of glyphs. */
-} bdf_glyphlist_t;
+ } value; /* Value of the property. */
-typedef struct {
- char *name; /* Name of the font. */
- bdf_bbx_t bbx; /* Font bounding box. */
+ } bdf_property_t;
- long point_size; /* Point size of the font. */
- unsigned long resolution_x; /* Font horizontal resolution. */
- unsigned long resolution_y; /* Font vertical resolution. */
- int hbf; /* Font came from an HBF font. */
+ /*************************************************************************/
+ /* */
+ /* BDF font metric and glyph types. */
+ /* */
+ /*************************************************************************/
- int spacing; /* Font spacing value. */
- unsigned short monowidth; /* Logical width for monowidth font. */
+ typedef struct bdf_bbx_t_
+ {
+ unsigned short width;
+ unsigned short height;
- long default_glyph; /* Encoding of the default glyph. */
+ short x_offset;
+ short y_offset;
- long font_ascent; /* Font ascent. */
- long font_descent; /* Font descent. */
+ short ascent;
+ short descent;
- long glyphs_size; /* Glyph structures allocated. */
- long glyphs_used; /* Glyph structures used. */
- bdf_glyph_t *glyphs; /* Glyphs themselves. */
+ } bdf_bbx_t;
- long unencoded_size; /* Unencoded glyph structures allocated. */
- long unencoded_used; /* Unencoded glyph structures used. */
- bdf_glyph_t *unencoded; /* Unencoded glyphs themselves. */
- unsigned long props_size; /* Font properties allocated. */
- unsigned long props_used; /* Font properties used. */
- bdf_property_t *props; /* Font properties themselves. */
+ typedef struct bdf_glyph_t_
+ {
+ char* name; /* Glyph name. */
+ long encoding; /* Glyph encoding. */
+ unsigned short swidth; /* Scalable width. */
+ unsigned short dwidth; /* Device width. */
+ bdf_bbx_t bbx; /* Glyph bounding box. */
+ unsigned char* bitmap; /* Glyph bitmap. */
+ unsigned long bpr; /* Number of bytes used per row. */
+ unsigned short bytes; /* Number of bytes used for the bitmap. */
- char *comments; /* Font comments. */
- unsigned long comments_len; /* Length of comment string. */
+ } bdf_glyph_t;
- char *acmsgs; /* Auto-correction messages. */
- unsigned long acmsgs_len; /* Length of auto-correction messages. */
- bdf_glyphlist_t overflow; /* Storage used for glyph insertion. */
+ typedef struct _hashnode_
+ {
+ char* key;
+ void* data;
+
+ } _hashnode, *hashnode;
- void *internal; /* Internal data for the font. */
- unsigned long nmod[2048]; /* Bitmap indicating modified glyphs. */
- unsigned long umod[2048]; /* Bitmap indicating modified unencoded. */
+ typedef struct hashtable_
+ {
+ int limit;
+ int size;
+ int used;
+ hashnode* table;
- unsigned short modified; /* Boolean indicating font modified. */
- unsigned short bpp; /* Bits per pixel. */
+ } hashtable;
- FT_Memory memory;
- bdf_property_t *user_props;
- unsigned long nuser_props;
- hashtable proptbl;
-} bdf_font_t;
+ typedef struct bdf_glyphlist_t_
+ {
+ unsigned short pad; /* Pad to 4-byte boundary. */
+ unsigned short bpp; /* Bits per pixel. */
+ long start; /* Beginning encoding value of glyphs. */
+ long end; /* Ending encoding value of glyphs. */
+ bdf_glyph_t* glyphs; /* Glyphs themselves. */
+ unsigned long glyphs_size; /* Glyph structures allocated. */
+ unsigned long glyphs_used; /* Glyph structures used. */
+ bdf_bbx_t bbx; /* Overall bounding box of glyphs. */
+ } bdf_glyphlist_t;
-/**************************************************************************
- *
- * Types for load/save callbacks.
- *
- **************************************************************************/
-/*
- * Callback reasons.
- */
-#define BDF_LOAD_START 1
-#define BDF_LOADING 2
-#define BDF_SAVE_START 3
-#define BDF_SAVING 4
-#define BDF_TRANSLATE_START 5
-#define BDF_TRANSLATING 6
-#define BDF_ROTATE_START 7
-#define BDF_ROTATING 8
-#define BDF_SHEAR_START 9
-#define BDF_SHEARING 10
-#define BDF_GLYPH_NAME_START 11
-#define BDF_GLYPH_NAME 12
-#define BDF_EXPORT_START 13
-#define BDF_EXPORTING 14
-#define BDF_EMBOLDEN_START 15
-#define BDF_EMBOLDENING 16
-#define BDF_WARNING 20
-#define BDF_ERROR 21
+ typedef struct bdf_font_t_
+ {
+ char* name; /* Name of the font. */
+ bdf_bbx_t bbx; /* Font bounding box. */
-/*
- * Error codes.
- */
-#define BDF_OK 0
-#define BDF_MISSING_START -1
-#define BDF_MISSING_FONTNAME -2
-#define BDF_MISSING_SIZE -3
-#define BDF_MISSING_FONTBBX -4
-#define BDF_MISSING_CHARS -5
-#define BDF_MISSING_STARTCHAR -6
-#define BDF_MISSING_ENCODING -7
-#define BDF_MISSING_BBX -8
+ long point_size; /* Point size of the font. */
+ unsigned long resolution_x; /* Font horizontal resolution. */
+ unsigned long resolution_y; /* Font vertical resolution. */
-#define BDF_NOT_CONSOLE_FONT -10
-#define BDF_NOT_MF_FONT -11
-#define BDF_NOT_PSF_FONT -12
+ int spacing; /* Font spacing value. */
-#define BDF_OUT_OF_MEMORY -20
+ unsigned short monowidth; /* Logical width for monowidth font. */
-#define BDF_EMPTY_FONT -99
-#define BDF_INVALID_LINE -100
+ long default_glyph; /* Encoding of the default glyph. */
-typedef struct {
- unsigned long reason;
- unsigned long current;
- unsigned long total;
- unsigned long errlineno;
-} bdf_callback_struct_t;
+ long font_ascent; /* Font ascent. */
+ long font_descent; /* Font descent. */
-typedef void (*bdf_callback_t) (bdf_callback_struct_t *call_data,
- void *client_data);
+ unsigned long glyphs_size; /* Glyph structures allocated. */
+ unsigned long glyphs_used; /* Glyph structures used. */
+ bdf_glyph_t* glyphs; /* Glyphs themselves. */
-/**************************************************************************
- *
- * BDF font API.
- *
- **************************************************************************/
+ unsigned long unencoded_size; /* Unencoded glyph struct. allocated. */
+ unsigned long unencoded_used; /* Unencoded glyph struct. used. */
+ bdf_glyph_t* unencoded; /* Unencoded glyphs themselves. */
-/*
- * Startup and shutdown functions are no more needed
- */
+ unsigned long props_size; /* Font properties allocated. */
+ unsigned long props_used; /* Font properties used. */
+ bdf_property_t* props; /* Font properties themselves. */
-/*
- * Font options functions.
- */
-/*extern void bdf_default_options (bdf_options_t *opts);*/
+ char* comments; /* Font comments. */
+ unsigned long comments_len; /* Length of comment string. */
-/*
- * Font load, create, save and free functions.
- */
+ bdf_glyphlist_t overflow; /* Storage used for glyph insertion. */
-FT_LOCAL( bdf_font_t* ) bdf_load_font (FT_Stream stream, FT_Memory memory,
- bdf_options_t *opts,
- bdf_callback_t callback, void *data);
+ void* internal; /* Internal data for the font. */
+ unsigned long nmod[2048]; /* Bitmap indicating modified glyphs. */
+ unsigned long umod[2048]; /* Bitmap indicating modified */
+ /* unencoded glyphs. */
+ unsigned short modified; /* Boolean indicating font modified. */
+ unsigned short bpp; /* Bits per pixel. */
-FT_LOCAL( void ) bdf_free_font (bdf_font_t *font);
+ FT_Memory memory;
-/*
- * Font property functions.
- */
-/* extern void bdf_create_property (char *name, int type, bdf_font_t *font); */
-FT_LOCAL( bdf_property_t* ) bdf_get_property (char *name, bdf_font_t *font);
-FT_LOCAL( unsigned long ) bdf_property_list (bdf_property_t **props);
+ bdf_property_t* user_props;
+ unsigned long nuser_props;
+ hashtable proptbl;
-FT_LOCAL( void ) bdf_add_font_property (bdf_font_t *font,
- bdf_property_t *property);
-
-FT_LOCAL( void ) bdf_delete_font_property (bdf_font_t *font, char *name);
+ } bdf_font_t;
-FT_LOCAL( bdf_property_t* ) bdf_get_font_property (bdf_font_t *font,
- char *name);
-
-FT_LOCAL( unsigned long ) bdf_font_property_list (bdf_font_t *font,
- bdf_property_t **props);
-/*
- * Font comment functions.
- */
-FT_LOCAL( int ) bdf_replace_comments (bdf_font_t *font, char *comments,
- unsigned long comments_len);
+ /*************************************************************************/
+ /* */
+ /* Types for load/save callbacks. */
+ /* */
+ /*************************************************************************/
-/*
- * Other miscellaneous functions.
- */
-FT_LOCAL( void ) bdf_set_default_metrics (bdf_font_t *font);
-/* */
+ /* Error codes. */
+#define BDF_MISSING_START -1
+#define BDF_MISSING_FONTNAME -2
+#define BDF_MISSING_SIZE -3
+#define BDF_MISSING_CHARS -4
+#define BDF_MISSING_STARTCHAR -5
+#define BDF_MISSING_ENCODING -6
+#define BDF_MISSING_BBX -7
+#define BDF_OUT_OF_MEMORY -20
+
+#define BDF_INVALID_LINE -100
+
+
+ /*************************************************************************/
+ /* */
+ /* BDF font API. */
+ /* */
+ /*************************************************************************/
+
+ FT_LOCAL( FT_Error )
+ bdf_load_font( FT_Stream stream,
+ FT_Memory memory,
+ bdf_options_t* opts,
+ bdf_font_t* *font );
+
+ FT_LOCAL( void )
+ bdf_free_font( bdf_font_t* font );
+
+ FT_LOCAL( bdf_property_t * )
+ bdf_get_property( char* name,
+ bdf_font_t* font );
+
+ FT_LOCAL( bdf_property_t * )
+ bdf_get_font_property( bdf_font_t* font,
+ char* name );
+
+
FT_END_HEADER
-#endif /* _h_bdf */
+
+#endif /* __BDF_H__ */
+
+
+/* END */
--- a/src/bdf/bdfdriver.c
+++ /dev/null
@@ -1,463 +1,0 @@
-/* bdfdriver.c
-
- FreeType font driver for bdf files
-
- Copyright (C) 2001-2002 by
- Francesco Zappa Nardelli
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-#include <ft2build.h>
-
-#include FT_INTERNAL_DEBUG_H
-#include FT_INTERNAL_STREAM_H
-#include FT_INTERNAL_OBJECTS_H
-
-#include "bdf.h"
-#include "bdfdriver.h"
-
-#include "bdferror.h"
-
-
- /*************************************************************************/
- /* */
- /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
- /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
- /* messages during execution. */
- /* */
-#undef FT_COMPONENT
-#define FT_COMPONENT trace_bdf
-
-
-FT_CALLBACK_DEF( FT_Error )
-BDF_Face_Done( BDF_Face face )
-{
- FT_Memory memory = FT_FACE_MEMORY( face );
-
- bdf_free_font(face->bdffont);
-
- FT_FREE( face->en_table );
-
- FT_FREE( face->charset_encoding);
- FT_FREE( face->charset_registry);
- FT_FREE( face->root.family_name );
-
- FT_FREE( face->root.available_sizes );
- FT_FREE( face->bdffont );
-
- FT_TRACE4(("bdf: done face\n"));
-
- return FT_Err_Ok;
-}
-
-
-FT_CALLBACK_DEF( FT_Error )
-BDF_Face_Init( FT_Stream stream,
- BDF_Face face,
- FT_Int face_index,
- FT_Int num_params,
- FT_Parameter* params )
-{
- FT_Error error = FT_Err_Ok;
- FT_Memory memory = FT_FACE_MEMORY( face );
- bdf_font_t* font;
- bdf_options_t options;
-
- FT_UNUSED( num_params );
- FT_UNUSED( params );
- FT_UNUSED( face_index );
-
- (void) FT_STREAM_SEEK( 0 );
-
- options.correct_metrics = 1; /* FZ XXX : options semantics */
- options.keep_unencoded = 1;
- options.pad_cells = 1;
-
- font = bdf_load_font( stream, memory, &options, 0, 0 );
- if ( font == NULL )
- {
- FT_TRACE2(("[not a valid BDF file]\n"));
- goto Fail;
- }
-
- /* we have a bdf font: let's construct the face object */
- face->bdffont = font;
- {
- FT_Face root = FT_FACE( face );
- bdf_property_t* prop = NULL;
-
- FT_TRACE4(("glyph %d - %d, unencoded %d %d\n",font->glyphs_size,
- font->glyphs_used, font->unencoded_size, font->unencoded_used));
-
-
- root->num_faces = 1;
- root->face_index = 0;
- root->face_flags = FT_FACE_FLAG_FIXED_SIZES |
- FT_FACE_FLAG_HORIZONTAL |
- FT_FACE_FLAG_FAST_GLYPHS ;
-
- prop = bdf_get_font_property (font,"SPACING");
-
- if ( prop && prop->format == BDF_ATOM )
- {
- if ( (*(prop->value.atom) == 'M') ||
- (*(prop->value.atom) == 'C') )
- {
- root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
- }
- }
- }
-
- /* FZ XXX : TO DO : FT_FACE_FLAGS_VERTICAL */
- /* FZ XXX : I need a font to implement this */
-
- root->style_flags = 0;
-
- prop = bdf_get_font_property (font,"SLANT");
-
- if ( prop && prop->format == BDF_ATOM )
- {
- if ( (*(prop->value.atom) == 'O' ) ||
- (*(prop->value.atom) == 'I' ) )
- {
- root->style_flags |= FT_STYLE_FLAG_ITALIC;
- }
- }
-
- prop = bdf_get_font_property (font,"WEIGHT_NAME");
-
- if ( prop && prop->format == BDF_ATOM )
- {
- if ( *(prop->value.atom) == 'B' )
- root->style_flags |= FT_STYLE_FLAG_BOLD;
- }
-
-
- prop = bdf_get_font_property (font,"FAMILY_NAME");
- if (prop != NULL) {
- int l = strlen(prop->value.atom) + 1;
- if ( FT_ALLOC( root->family_name, l * sizeof(char)) )
- goto Fail;
- strcpy(root->family_name, prop->value.atom);
- } else root->family_name = 0;
-
- root->style_name = (char *)"Regular";
- if ( root->style_flags & FT_STYLE_FLAG_BOLD )
- {
- if ( root->style_flags & FT_STYLE_FLAG_ITALIC )
- root->style_name = (char *)"Bold Italic";
- else
- root->style_name = (char *)"Bold";
- }
- else if ( root->style_flags & FT_STYLE_FLAG_ITALIC )
- root->style_name = (char *)"Italic";
-
- root->num_glyphs = font->glyphs_size ; /* unencoded included */
-
- root->num_fixed_sizes = 1;
- if ( FT_ALLOC_ARRAY( root->available_sizes, 1,
- FT_Bitmap_Size ) )
- goto Fail;
-
- prop = bdf_get_font_property(font,"PIXEL_SIZE");
- if (prop != NULL) {
- bdf_property_t *xres = 0, *yres = 0;
-
- xres = bdf_get_font_property(font,"RESOLUTION_X");
- yres = bdf_get_font_property(font,"RESOLUTION_Y");
- if ((xres != NULL) && (yres != NULL)) {
- FT_TRACE4(("prop %d %d %d\n",prop->value.int32, xres->value.int32,
- yres->value.int32));
- root->available_sizes->width =
- prop->value.int32 * 75 / xres->value.int32;
- root->available_sizes->height =
- prop->value.int32 * 75 / yres->value.int32;
- }
- } else {
- /* some fonts have broken SIZE declaration (jiskan24.bdf) */
- FT_ERROR(("BDF Warning: reading size\n"));
- root->available_sizes->width = font->point_size ;
- root->available_sizes->height = font->point_size ;
- }
-
- /* encoding table */
- {
- bdf_glyph_t *cur = font->glyphs;
- int n;
-
- if ( FT_ALLOC ( face->en_table ,
- font->glyphs_size * sizeof(BDF_encoding_el ) ) )
- goto Fail;
-
- for (n = 0; n<font->glyphs_size ; n++) {
- (face->en_table[n]).enc = cur[n].encoding ;
- FT_TRACE4(("enc n: %d, val %ld\n",n,cur[n].encoding));
- (face->en_table[n]).glyph = n;
- }
- }
-
- /* charmaps */
- {
- bdf_property_t *charset_registry = 0, *charset_encoding = 0;
-
- charset_registry = bdf_get_font_property(font,"CHARSET_REGISTRY");
- charset_encoding = bdf_get_font_property(font,"CHARSET_ENCODING");
- if ((charset_registry != NULL) && (charset_encoding != NULL)) {
- if ((charset_registry->format == BDF_ATOM) &&
- (charset_encoding->format == BDF_ATOM)) {
- if (FT_ALLOC(face->charset_encoding,
- (strlen(charset_encoding->value.atom)+1) * sizeof(char)))
- goto Exit;
- if (FT_ALLOC(face->charset_registry,
- (strlen(charset_registry->value.atom)+1) * sizeof(char)))
- goto Exit;
- strcpy(face->charset_registry,charset_registry->value.atom);
- strcpy(face->charset_encoding,charset_encoding->value.atom);
-
- face->charmap.encoding = ft_encoding_none;
- face->charmap.platform_id = 0;
- face->charmap.encoding_id = 0;
- face->charmap.face = root;
- face->charmap_handle = &face->charmap;
- root->charmap = face->charmap_handle;
- goto Exit;
- }
- }
-
- /* otherwise assume adobe standard encoding */
- face->charmap.encoding = ft_encoding_adobe_standard;
- face->charmap.platform_id = 7; /* taken from t1objs.c */
- face->charmap.encoding_id = 0;
- face->charmap.face = root;
- face->charmap_handle = &face->charmap;
- root->charmap = face->charmap_handle;
- }
- }
-
- Exit:
- return FT_Err_Ok;
-
- Fail:
- BDF_Face_Done( face );
- return FT_Err_Unknown_File_Format;
-}
-
-static
-FT_Error BDF_Set_Pixel_Size( FT_Size size )
-{
- BDF_Face face = (BDF_Face)FT_SIZE_FACE( size );
- FT_Face root = FT_FACE( face );
-
- FT_TRACE4(("rec %d - pres %d\n",size->metrics.y_ppem,
- root->available_sizes->height));
- if (size->metrics.y_ppem == root->available_sizes->height) {
-
- size->metrics.ascender = face->bdffont->bbx.ascent << 6;
- size->metrics.descender = face->bdffont->bbx.descent * (-64);
- size->metrics.height = face->bdffont->bbx.height <<6;
-
- return FT_Err_Ok;
- }
- else {
- return FT_Err_Invalid_Pixel_Size;
- }
-}
-
-static
-FT_Error BDF_Glyph_Load( FT_GlyphSlot slot,
- FT_Size size,
- FT_UInt glyph_index,
- FT_Int load_flags )
-{
- BDF_Face face = (BDF_Face)FT_SIZE_FACE( size );
- FT_Error error = FT_Err_Ok;
- FT_Bitmap *bitmap = &slot->bitmap;
- bdf_glyph_t glyph;
- int i;
- FT_Memory memory = face->bdffont->memory;
-
- if (!face) {
- error = FT_Err_Invalid_Argument;
- goto Exit;
- }
-
- /* slot, bitmap => freetype, glyph => bdflib */
- glyph = face->bdffont->glyphs[glyph_index];
-
- bitmap->pitch = (glyph.bbx.width + 7) >> 3;
- bitmap->rows = glyph.bbx.height;
- bitmap->width = glyph.bbx.width;
- bitmap->num_grays = 1; /* unused */
- bitmap->pixel_mode = ft_pixel_mode_mono;
-
- if ( FT_ALLOC ( bitmap->buffer , glyph.bytes) )
- return FT_Err_Out_Of_Memory;
- FT_MEM_SET( bitmap->buffer , 0 , glyph.bytes );
- for (i=0 ; i<glyph.bytes ; i++) {
- bitmap->buffer[i] = glyph.bitmap[i];
- }
-
- slot->bitmap_left = 0;
- slot->bitmap_top = glyph.bbx.ascent ;
-
- /* FZ TO DO : vertical metrics */
- slot->metrics.horiAdvance = glyph.dwidth << 6;
- slot->metrics.horiBearingX = glyph.bbx.x_offset << 6 ;
- slot->metrics.horiBearingY = glyph.bbx.y_offset << 6 ;
- slot->metrics.width = bitmap->width << 6 ;
- slot->metrics.height = bitmap->rows << 6;
-
- slot->linearHoriAdvance = (FT_Fixed)glyph.dwidth << 16;
- slot->format = ft_glyph_format_bitmap;
- slot->flags = FT_GLYPH_OWN_BITMAP;
-
- Exit:
- return error;
-}
-
-static
-FT_UInt BDF_Get_Char_Index( FT_CharMap charmap,
- FT_ULong char_code )
-{
- BDF_Face face = ((BDF_Face)charmap->face);
- BDF_encoding_el *en_table = face->en_table;
- int low, high, mid;
-
- FT_TRACE4(("get_char_index %ld\n", char_code));
-
- low = 0;
- high = face->bdffont->glyphs_used - 1;
- while (low <= high) {
- mid = (low+high) / 2;
- if (char_code < en_table[mid].enc)
- high = mid - 1;
- else if (char_code > en_table[mid].enc)
- low = mid + 1;
- else return en_table[mid].glyph;
- }
-
- return face->bdffont->default_glyph;
-}
-
-FT_CALLBACK_TABLE_DEF
-const FT_Driver_ClassRec bdf_driver_class =
-{
- {
- ft_module_font_driver,
- sizeof ( FT_DriverRec ),
-
- "bdf",
- 0x10000L,
- 0x20000L,
-
- 0,
-
- (FT_Module_Constructor)0,
- (FT_Module_Destructor) 0,
- (FT_Module_Requester) 0
- },
-
- sizeof( BDF_FaceRec ),
- sizeof( FT_SizeRec ),
- sizeof( FT_GlyphSlotRec ),
-
- (FT_Face_InitFunc) BDF_Face_Init,
- (FT_Face_DoneFunc) BDF_Face_Done,
- (FT_Size_InitFunc) 0,
- (FT_Size_DoneFunc) 0,
- (FT_Slot_InitFunc) 0,
- (FT_Slot_DoneFunc) 0,
-
- (FT_Size_ResetPointsFunc) BDF_Set_Pixel_Size,
- (FT_Size_ResetPixelsFunc) BDF_Set_Pixel_Size,
-
- (FT_Slot_LoadFunc) BDF_Glyph_Load,
-
-#ifndef FT_CONFIG_OPTION_USE_CMAPS
- (FT_CharMap_CharIndexFunc)0,
-#else
- (FT_CharMap_CharIndexFunc)0,
-#endif
-
- (FT_Face_GetKerningFunc) 0,
- (FT_Face_AttachFunc) 0,
- (FT_Face_GetAdvancesFunc) 0,
-
-#ifndef FT_CONFIG_OPTION_USE_CMAPS
- (FT_CharMap_CharNextFunc) 0, /*PCF_Char_Get_Next,*/
-#else
- (FT_CharMap_CharNextFunc) 0
-#endif
- };
-
- /*
- (FTDriver_initFace) BDF_Init_Face,
- (FTDriver_doneFace) BDF_Done_Face,
- (FTDriver_initSize) 0,
- (FTDriver_doneSize) 0,
- (FTDriver_initGlyphSlot)0,
- (FTDriver_doneGlyphSlot)0,
-
- (FTDriver_setCharSizes) BDF_Set_Pixel_Size,
- (FTDriver_setPixelSizes)BDF_Set_Pixel_Size,
-
- (FTDriver_loadGlyph) BDF_Load_Glyph,
- (FTDriver_getCharIndex) BDF_Get_Char_Index,
-
- (FTDriver_getKerning) 0,
- (FTDriver_attachFile) 0,
- (FTDriver_getAdvances) 0
- */
-
-
-
-#ifdef FT_CONFIG_OPTION_DYNAMIC_DRIVERS
-
-
- /*************************************************************************/
- /* */
- /* <Function> */
- /* getDriverClass */
- /* */
- /* <Description> */
- /* This function is used when compiling the TrueType driver as a */
- /* shared library (`.DLL' or `.so'). It will be used by the */
- /* high-level library of FreeType to retrieve the address of the */
- /* driver's generic interface. */
- /* */
- /* It shouldn't be implemented in a static build, as each driver must */
- /* have the same function as an exported entry point. */
- /* */
- /* <Return> */
- /* The address of the TrueType's driver generic interface. The */
- /* format-specific interface can then be retrieved through the method */
- /* interface->get_format_interface. */
- /* */
- FT_EXPORT_DEF( const FT_Driver_Class* )
- getDriverClass( void )
- {
- return &bdf_driver_class;
- }
-
-
-#endif /* FT_CONFIG_OPTION_DYNAMIC_DRIVERS */
-
-
-/* END */
--- a/src/bdf/bdfdriver.h
+++ /dev/null
@@ -1,68 +1,0 @@
-/* bdfdriver.h
-
- FreeType font driver for bdf fonts
-
- Copyright (C) 2001 by
- Francesco Zappa Nardelli
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
-
-#ifndef __BDF_DRIVER_H__
-#define __BDF_DRIVER_H__
-
-#include <ft2build.h>
-#include FT_INTERNAL_DRIVER_H
-
-#include "bdf.h"
-
-FT_BEGIN_HEADER
-
- typedef struct {
- FT_Long enc;
- FT_Short glyph;
- } BDF_encoding_el;
-
- typedef struct BDF_FaceRec_
- {
- FT_FaceRec root;
-
- char *charset_encoding;
- char *charset_registry;
-
- bdf_font_t *bdffont;
-
- BDF_encoding_el *en_table;
-
- FT_CharMap charmap_handle;
- FT_CharMapRec charmap; /* a single charmap per face */
- } BDF_FaceRec, *BDF_Face;
-
-
- FT_EXPORT_VAR( const FT_Driver_ClassRec ) bdf_driver_class;
-
-FT_END_HEADER
-
-
-#endif /* __BDF_DRIVER_H__ */
-
-
-/* END */
-
--- /dev/null
+++ b/src/bdf/bdfdrivr.c
@@ -1,0 +1,564 @@
+/* bdfdrivr.c
+
+ FreeType font driver for bdf files
+
+ Copyright (C) 2001-2002 by
+ Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+#include <ft2build.h>
+
+#include FT_INTERNAL_DEBUG_H
+#include FT_INTERNAL_STREAM_H
+#include FT_INTERNAL_OBJECTS_H
+
+#include "bdf.h"
+#include "bdfdrivr.h"
+
+#include "bdferror.h"
+
+
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_bdfdriver
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ BDF_Face_Done( BDF_Face face )
+ {
+ FT_Memory memory = FT_FACE_MEMORY( face );
+
+
+ bdf_free_font( face->bdffont );
+
+ FT_FREE( face->en_table );
+
+ FT_FREE( face->charset_encoding );
+ FT_FREE( face->charset_registry );
+ FT_FREE( face->root.family_name );
+
+ FT_FREE( face->root.available_sizes );
+
+ FT_FREE( face->bdffont );
+
+ FT_TRACE4(( "BDF_Face_Done: done face\n" ));
+
+ return BDF_Err_Ok;
+ }
+
+
+ FT_CALLBACK_DEF( FT_Error )
+ BDF_Face_Init( FT_Stream stream,
+ BDF_Face face,
+ FT_Int face_index,
+ FT_Int num_params,
+ FT_Parameter* params )
+ {
+ FT_Error error = BDF_Err_Ok;
+ FT_Memory memory = FT_FACE_MEMORY( face );
+
+ bdf_font_t* font;
+ bdf_options_t options;
+
+ FT_UNUSED( num_params );
+ FT_UNUSED( params );
+ FT_UNUSED( face_index );
+
+
+ if ( FT_STREAM_SEEK( 0 ) )
+ goto Exit;
+
+ options.correct_metrics = 1; /* FZ XXX: options semantics */
+ options.keep_unencoded = 1;
+ options.keep_comments = 0;
+ options.font_spacing = BDF_PROPORTIONAL;
+
+ error = bdf_load_font( stream, memory, &options, &font );
+ if ( error == BDF_Err_Missing_Startfont_Field )
+ {
+ FT_TRACE2(( "[not a valid BDF file]\n" ));
+ goto Fail;
+ }
+ else if ( error )
+ goto Exit;
+
+ /* we have a bdf font: let's construct the face object */
+ face->bdffont = font;
+ {
+ FT_Face root = FT_FACE( face );
+ bdf_property_t* prop = NULL;
+
+
+ FT_TRACE4(( "number of glyphs: %d (%d)\n",
+ font->glyphs_size,
+ font->glyphs_used ));
+ FT_TRACE4(( "number of unencoded glyphs: %d (%d)\n",
+ font->unencoded_size,
+ font->unencoded_used ));
+
+ root->num_faces = 1;
+ root->face_index = 0;
+ root->face_flags = FT_FACE_FLAG_FIXED_SIZES |
+ FT_FACE_FLAG_HORIZONTAL |
+ FT_FACE_FLAG_FAST_GLYPHS;
+
+ prop = bdf_get_font_property( font, (char *)"SPACING" );
+ if ( prop != NULL )
+ if ( prop->format == BDF_ATOM )
+ if ( ( *(prop->value.atom) == 'M' ) ||
+ ( *(prop->value.atom) == 'C' ) )
+ root->face_flags |= FT_FACE_FLAG_FIXED_WIDTH;
+
+ /* FZ XXX: TO DO: FT_FACE_FLAGS_VERTICAL */
+ /* FZ XXX: I need a font to implement this */
+
+ root->style_flags = 0;
+ prop = bdf_get_font_property( font, (char *)"SLANT" );
+ if ( prop != NULL )
+ if ( prop->format == BDF_ATOM )
+ if ( ( *(prop->value.atom) == 'O' ) ||
+ ( *(prop->value.atom) == 'I' ) )
+ root->style_flags |= FT_STYLE_FLAG_ITALIC;
+
+ prop = bdf_get_font_property( font, (char *)"WEIGHT_NAME" );
+ if ( prop != NULL )
+ if ( prop->format == BDF_ATOM )
+ if ( *(prop->value.atom) == 'B' )
+ root->style_flags |= FT_STYLE_FLAG_BOLD;
+
+ prop = bdf_get_font_property( font, (char *)"FAMILY_NAME" );
+ if ( prop != NULL )
+ {
+ int l = ft_strlen( prop->value.atom ) + 1;
+
+
+ if ( FT_NEW_ARRAY( root->family_name, l ) )
+ goto Exit;
+ ft_strcpy( root->family_name, prop->value.atom );
+ }
+ else
+ root->family_name = 0;
+
+ root->style_name = (char *)"Regular";
+ if ( root->style_flags & FT_STYLE_FLAG_BOLD )
+ {
+ if ( root->style_flags & FT_STYLE_FLAG_ITALIC )
+ root->style_name = (char *)"Bold Italic";
+ else
+ root->style_name = (char *)"Bold";
+ }
+ else if ( root->style_flags & FT_STYLE_FLAG_ITALIC )
+ root->style_name = (char *)"Italic";
+
+ root->num_glyphs = font->glyphs_size; /* unencoded included */
+
+ root->num_fixed_sizes = 1;
+ if ( FT_NEW_ARRAY( root->available_sizes, 1 ) )
+ goto Exit;
+
+ prop = bdf_get_font_property( font, (char *)"PIXEL_SIZE" );
+ if ( prop != NULL )
+ {
+ bdf_property_t *xres = 0, *yres = 0;
+
+
+ xres = bdf_get_font_property( font, (char *)"RESOLUTION_X" );
+ yres = bdf_get_font_property( font, (char *)"RESOLUTION_Y" );
+ if ( ( xres != NULL ) && ( yres != NULL ) )
+ {
+ FT_TRACE4(( "PIXEL_SIZE: %d RESOLUTION_X: %d RESOLUTION_Y: %d\n",
+ prop->value.int32,
+ xres->value.int32,
+ yres->value.int32 ));
+ root->available_sizes->width =
+ prop->value.int32 * 75 / xres->value.int32;
+ root->available_sizes->height =
+ prop->value.int32 * 75 / yres->value.int32;
+ }
+ }
+ else
+ {
+ /* some fonts have broken SIZE declaration (jiskan24.bdf) */
+ FT_ERROR(( "BDF_Face_Init: reading size\n" ));
+ root->available_sizes->width = font->point_size ;
+ root->available_sizes->height = font->point_size ;
+ }
+
+ /* encoding table */
+ {
+ bdf_glyph_t* cur = font->glyphs;
+ unsigned long n;
+
+
+ if ( FT_NEW_ARRAY( face->en_table, font->glyphs_size ) )
+ goto Exit;
+
+ for ( n = 0; n < font->glyphs_size; n++ )
+ {
+ (face->en_table[n]).enc = cur[n].encoding;
+ FT_TRACE4(( "idx %d, val 0x%lX\n", n, cur[n].encoding ));
+ (face->en_table[n]).glyph = n;
+ }
+ }
+
+ /* charmaps */
+ {
+ bdf_property_t *charset_registry = 0, *charset_encoding = 0;
+
+
+ charset_registry =
+ bdf_get_font_property( font, (char *)"CHARSET_REGISTRY" );
+ charset_encoding =
+ bdf_get_font_property( font, (char *)"CHARSET_ENCODING" );
+ if ( ( charset_registry != NULL ) && ( charset_encoding != NULL ) )
+ {
+ if ( ( charset_registry->format == BDF_ATOM ) &&
+ ( charset_encoding->format == BDF_ATOM ) )
+ {
+ if ( FT_NEW_ARRAY( face->charset_encoding,
+ strlen( charset_encoding->value.atom ) + 1 ) )
+ goto Exit;
+ if (FT_NEW_ARRAY( face->charset_registry,
+ strlen( charset_registry->value.atom ) + 1 ) )
+ goto Exit;
+ ft_strcpy( face->charset_registry, charset_registry->value.atom );
+ ft_strcpy( face->charset_encoding, charset_encoding->value.atom );
+
+ face->charmap.encoding = ft_encoding_none;
+ face->charmap.platform_id = 0;
+ face->charmap.encoding_id = 0;
+ face->charmap.face = root;
+ face->charmap_handle = &face->charmap;
+
+ root->charmap = face->charmap_handle;
+
+ goto Exit;
+ }
+ }
+
+ /* otherwise assume adobe standard encoding */
+ face->charmap.encoding = ft_encoding_adobe_standard;
+ face->charmap.platform_id = 7; /* taken from t1objs.c */
+ face->charmap.encoding_id = 0;
+ face->charmap.face = root;
+ face->charmap_handle = &face->charmap;
+
+ root->charmap = face->charmap_handle;
+ }
+ }
+
+ Exit:
+ return error;
+
+ Fail:
+ BDF_Face_Done( face );
+ return BDF_Err_Unknown_File_Format;
+ }
+
+
+ static
+ FT_Error BDF_Set_Pixel_Size( FT_Size size )
+ {
+ BDF_Face face = (BDF_Face)FT_SIZE_FACE( size );
+ FT_Face root = FT_FACE( face );
+
+
+ FT_TRACE4(( "rec %d - pres %d\n",
+ size->metrics.y_ppem, root->available_sizes->height ));
+
+ if ( size->metrics.y_ppem == root->available_sizes->height )
+ {
+ size->metrics.ascender = face->bdffont->bbx.ascent << 6;
+ size->metrics.descender = face->bdffont->bbx.descent * ( -64 );
+ size->metrics.height = face->bdffont->bbx.height << 6;
+
+ return BDF_Err_Ok;
+ }
+ else
+ return BDF_Err_Invalid_Pixel_Size;
+ }
+
+
+ static FT_Error
+ BDF_Glyph_Load( FT_GlyphSlot slot,
+ FT_Size size,
+ FT_UInt glyph_index,
+ FT_Int load_flags )
+ {
+ BDF_Face face = (BDF_Face)FT_SIZE_FACE( size );
+ FT_Error error = BDF_Err_Ok;
+ FT_Bitmap* bitmap = &slot->bitmap;
+ bdf_glyph_t glyph;
+ int bpp = face->bdffont->bpp;
+ int i, j, count;
+ unsigned char *p, *pp;
+
+ FT_Memory memory = face->bdffont->memory;
+
+ FT_UNUSED( load_flags );
+
+
+ if ( !face )
+ {
+ error = BDF_Err_Invalid_Argument;
+ goto Exit;
+ }
+
+ /* slot, bitmap => freetype, glyph => bdflib */
+ glyph = face->bdffont->glyphs[glyph_index];
+
+ bitmap->rows = glyph.bbx.height;
+ bitmap->width = glyph.bbx.width;
+
+ if ( bpp == 1 )
+ {
+ bitmap->pixel_mode = ft_pixel_mode_mono;
+ bitmap->pitch = glyph.bpr;
+
+ if ( FT_NEW_ARRAY( bitmap->buffer, glyph.bytes ) )
+ goto Exit;
+ FT_MEM_COPY( bitmap->buffer, glyph.bitmap, glyph.bytes );
+ }
+ else
+ {
+ /* blow up pixmap to have 8 bits per pixel */
+ bitmap->pixel_mode = ft_pixel_mode_grays;
+ bitmap->pitch = bitmap->width;
+
+ if ( FT_NEW_ARRAY( bitmap->buffer, bitmap->rows * bitmap->pitch ) )
+ goto Exit;
+
+ switch ( bpp )
+ {
+ case 2:
+ bitmap->num_grays = 4;
+
+ count = 0;
+ p = glyph.bitmap;
+
+ for ( i = 0; i < bitmap->rows; i++ )
+ {
+ pp = p;
+
+ /* get the full bytes */
+ for ( j = 0; j < ( bitmap->width >> 2 ); j++ )
+ {
+ bitmap->buffer[count++] = ( *pp & 0xC0 ) >> 6;
+ bitmap->buffer[count++] = ( *pp & 0x30 ) >> 4;
+ bitmap->buffer[count++] = ( *pp & 0x0C ) >> 2;
+ bitmap->buffer[count++] = *pp & 0x03;
+
+ pp++;
+ }
+
+ /* get remaining pixels (if any) */
+ switch ( bitmap->width & 3 )
+ {
+ case 3:
+ bitmap->buffer[count++] = ( *pp & 0xC0 ) >> 6;
+ /* fall through */
+ case 2:
+ bitmap->buffer[count++] = ( *pp & 0x30 ) >> 4;
+ /* fall through */
+ case 1:
+ bitmap->buffer[count++] = ( *pp & 0x0C ) >> 2;
+ /* fall through */
+ case 0:
+ break;
+ }
+
+ p += glyph.bpr;
+ }
+ break;
+
+ case 4:
+ bitmap->num_grays = 16;
+
+ count = 0;
+ p = glyph.bitmap;
+
+ for ( i = 0; i < bitmap->rows; i++ )
+ {
+ pp = p;
+
+ /* get the full bytes */
+ for ( j = 0; j < ( bitmap->width >> 1 ); j++ )
+ {
+ bitmap->buffer[count++] = ( *pp & 0xF0 ) >> 4;
+ bitmap->buffer[count++] = *pp & 0x0F;
+
+ pp++;
+ }
+
+ /* get remaining pixel (if any) */
+ switch ( bitmap->width & 1 )
+ {
+ case 1:
+ bitmap->buffer[count++] = ( *pp & 0xF0 ) >> 4;
+ /* fall through */
+ case 0:
+ break;
+ }
+
+ p += glyph.bpr;
+ }
+ break;
+ }
+ }
+
+ slot->bitmap_left = 0;
+ slot->bitmap_top = glyph.bbx.ascent;
+
+ /* FZ XXX: TODO: vertical metrics */
+ slot->metrics.horiAdvance = glyph.dwidth << 6;
+ slot->metrics.horiBearingX = glyph.bbx.x_offset << 6;
+ slot->metrics.horiBearingY = glyph.bbx.y_offset << 6;
+ slot->metrics.width = bitmap->width << 6;
+ slot->metrics.height = bitmap->rows << 6;
+
+ slot->linearHoriAdvance = (FT_Fixed)glyph.dwidth << 16;
+ slot->format = ft_glyph_format_bitmap;
+ slot->flags = FT_GLYPH_OWN_BITMAP;
+
+ Exit:
+ return error;
+ }
+
+
+ static
+ FT_UInt BDF_Get_Char_Index( FT_CharMap charmap,
+ FT_ULong char_code )
+ {
+ BDF_Face face = (BDF_Face)charmap->face;
+ BDF_encoding_el* en_table = face->en_table;
+ int low, high, mid;
+
+
+ FT_TRACE4(( "BDF_Get_Char_Index %ld\n", char_code ));
+
+ low = 0;
+ high = face->bdffont->glyphs_used - 1;
+
+ while ( low <= high )
+ {
+ mid = ( low + high ) / 2;
+ if ( char_code < en_table[mid].enc )
+ high = mid - 1;
+ else if ( char_code > en_table[mid].enc )
+ low = mid + 1;
+ else
+ return en_table[mid].glyph;
+ }
+
+ return face->bdffont->default_glyph;
+ }
+
+
+ FT_CALLBACK_TABLE_DEF
+ const FT_Driver_ClassRec bdf_driver_class =
+ {
+ {
+ ft_module_font_driver,
+ sizeof ( FT_DriverRec ),
+
+ "bdf",
+ 0x10000L,
+ 0x20000L,
+
+ 0,
+
+ (FT_Module_Constructor)0,
+ (FT_Module_Destructor) 0,
+ (FT_Module_Requester) 0
+ },
+
+ sizeof( BDF_FaceRec ),
+ sizeof( FT_SizeRec ),
+ sizeof( FT_GlyphSlotRec ),
+
+ (FT_Face_InitFunc) BDF_Face_Init,
+ (FT_Face_DoneFunc) BDF_Face_Done,
+ (FT_Size_InitFunc) 0,
+ (FT_Size_DoneFunc) 0,
+ (FT_Slot_InitFunc) 0,
+ (FT_Slot_DoneFunc) 0,
+
+ (FT_Size_ResetPointsFunc) BDF_Set_Pixel_Size,
+ (FT_Size_ResetPixelsFunc) BDF_Set_Pixel_Size,
+
+ (FT_Slot_LoadFunc) BDF_Glyph_Load,
+
+#ifndef FT_CONFIG_OPTION_USE_CMAPS
+ (FT_CharMap_CharIndexFunc)0,
+#else
+ (FT_CharMap_CharIndexFunc)BDF_Get_Char_Index,
+#endif
+
+ (FT_Face_GetKerningFunc) 0,
+ (FT_Face_AttachFunc) 0,
+ (FT_Face_GetAdvancesFunc) 0,
+
+#ifndef FT_CONFIG_OPTION_USE_CMAPS
+ (FT_CharMap_CharNextFunc) 0, /* BDF_Char_Get_Next,*/
+#else
+ (FT_CharMap_CharNextFunc) 0
+#endif
+ };
+
+
+#ifdef FT_CONFIG_OPTION_DYNAMIC_DRIVERS
+
+
+ /*************************************************************************/
+ /* */
+ /* <Function> */
+ /* getDriverClass */
+ /* */
+ /* <Description> */
+ /* This function is used when compiling the TrueType driver as a */
+ /* shared library (`.DLL' or `.so'). It will be used by the */
+ /* high-level library of FreeType to retrieve the address of the */
+ /* driver's generic interface. */
+ /* */
+ /* It shouldn't be implemented in a static build, as each driver must */
+ /* have the same function as an exported entry point. */
+ /* */
+ /* <Return> */
+ /* The address of the TrueType's driver generic interface. The */
+ /* format-specific interface can then be retrieved through the method */
+ /* interface->get_format_interface. */
+ /* */
+ FT_EXPORT_DEF( const FT_Driver_Class* )
+ getDriverClass( void )
+ {
+ return &bdf_driver_class;
+ }
+
+
+#endif /* FT_CONFIG_OPTION_DYNAMIC_DRIVERS */
+
+
+/* END */
--- /dev/null
+++ b/src/bdf/bdfdrivr.h
@@ -1,0 +1,74 @@
+/* bdfdrivr.h
+
+ FreeType font driver for bdf fonts
+
+ Copyright (C) 2001, 2002 by
+ Francesco Zappa Nardelli
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
+*/
+
+
+#ifndef __BDFDRIVR_H__
+#define __BDFDRIVR_H__
+
+#include <ft2build.h>
+#include FT_INTERNAL_DRIVER_H
+
+#include "bdf.h"
+
+
+FT_BEGIN_HEADER
+
+
+ typedef struct BDF_encoding_el_
+ {
+ FT_ULong enc;
+ FT_Short glyph;
+
+ } BDF_encoding_el;
+
+
+ typedef struct BDF_FaceRec_
+ {
+ FT_FaceRec root;
+
+ char* charset_encoding;
+ char* charset_registry;
+
+ bdf_font_t* bdffont;
+
+ BDF_encoding_el* en_table;
+
+ FT_CharMap charmap_handle;
+ FT_CharMapRec charmap; /* a single charmap per face */
+
+ } BDF_FaceRec, *BDF_Face;
+
+
+ FT_EXPORT_VAR( const FT_Driver_ClassRec ) bdf_driver_class;
+
+
+FT_END_HEADER
+
+
+#endif /* __BDFDRIVR_H__ */
+
+
+/* END */
--- a/src/bdf/bdferror.h
+++ b/src/bdf/bdferror.h
@@ -1,5 +1,5 @@
/*
- * Copyright 2001 Francesco Zappa Nardelli
+ * Copyright 2001, 2002 Francesco Zappa Nardelli
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -22,7 +22,7 @@
/*************************************************************************/
/* */
- /* This file is used to define the PCF error enumeration constants. */
+ /* This file is used to define the BDF error enumeration constants. */
/* */
/*************************************************************************/
@@ -38,7 +38,7 @@
#include FT_ERRORS_H
-#endif /* __PCFERROR_H__ */
+#endif /* __BDFERROR_H__ */
/* END */
--- a/src/bdf/bdflib.c
+++ b/src/bdf/bdflib.c
@@ -1,6 +1,6 @@
/*
* Copyright 2000 Computing Research Labs, New Mexico State University
- * Copyright 2001 Francesco Zappa Nardelli
+ * Copyright 2001, 2002 Francesco Zappa Nardelli
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -21,10 +21,15 @@
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-/*
-static char rcsid[] = "$Id$";
-*/
+ /*************************************************************************/
+ /* */
+ /* This file is based on bdf.c,v 1.22 2000/03/16 20:08:50 */
+ /* */
+ /* taken from Mark Leisher's xmbdfed package */
+ /* */
+ /*************************************************************************/
+
#include <ft2build.h>
#include FT_INTERNAL_DEBUG_H
@@ -32,779 +37,708 @@
#include FT_INTERNAL_OBJECTS_H
#include "bdf.h"
-
#include "bdferror.h"
-#undef MAX
-#define MAX(h, i) ((h) > (i) ? (h) : (i))
-#undef MIN
-#define MIN(l, o) ((l) < (o) ? (l) : (o))
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_bdflib
-/**************************************************************************
- *
- * Masks used for checking different bits per pixel cases.
- *
- **************************************************************************/
-static const unsigned char onebpp[] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
-static const unsigned char twobpp[] = { 0xc0, 0x30, 0x0c, 0x03 };
-static const unsigned char fourbpp[] = { 0xf0, 0x0f };
-static const unsigned char eightbpp[] = { 0xff };
+ /*************************************************************************/
+ /* */
+ /* Default BDF font options. */
+ /* */
+ /*************************************************************************/
-/**************************************************************************
- *
- * Default BDF font options.
- *
- **************************************************************************/
-static const bdf_options_t _bdf_opts =
-{
- 1, /* Hint TTF glyphs. */
+ static bdf_options_t _bdf_opts =
+ {
1, /* Correct metrics. */
1, /* Preserve unencoded glyphs. */
- 1, /* Preserve comments. */
- 1, /* Pad character-cells. */
- BDF_PROPORTIONAL, /* Default spacing. */
- 12, /* Default point size. */
- 0, /* Default horizontal resolution. */
- 0, /* Default vertical resolution. */
- 1, /* Bits per pixel. */
- BDF_UNIX_EOL, /* Line separator. */
-};
+ 0, /* Preserve comments. */
+ BDF_PROPORTIONAL /* Default spacing. */
+ };
-/**************************************************************************
- *
- * Builtin BDF font properties.
- *
- **************************************************************************/
-/*
- * List of most properties that might appear in a font. Doesn't include the
- * RAW_* and AXIS_* properties in X11R6 polymorphic fonts.
- */
-static const bdf_property_t _bdf_properties[] =
-{
- {"ADD_STYLE_NAME", BDF_ATOM, 1},
- {"AVERAGE_WIDTH", BDF_INTEGER, 1},
- {"AVG_CAPITAL_WIDTH", BDF_INTEGER, 1},
- {"AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1},
- {"CAP_HEIGHT", BDF_INTEGER, 1},
- {"CHARSET_COLLECTIONS", BDF_ATOM, 1},
- {"CHARSET_ENCODING", BDF_ATOM, 1},
- {"CHARSET_REGISTRY", BDF_ATOM, 1},
- {"COMMENT", BDF_ATOM, 1},
- {"COPYRIGHT", BDF_ATOM, 1},
- {"DEFAULT_CHAR", BDF_CARDINAL, 1},
- {"DESTINATION", BDF_CARDINAL, 1},
- {"DEVICE_FONT_NAME", BDF_ATOM, 1},
- {"END_SPACE", BDF_INTEGER, 1},
- {"FACE_NAME", BDF_ATOM, 1},
- {"FAMILY_NAME", BDF_ATOM, 1},
- {"FIGURE_WIDTH", BDF_INTEGER, 1},
- {"FONT", BDF_ATOM, 1},
- {"FONTNAME_REGISTRY", BDF_ATOM, 1},
- {"FONT_ASCENT", BDF_INTEGER, 1},
- {"FONT_DESCENT", BDF_INTEGER, 1},
- {"FOUNDRY", BDF_ATOM, 1},
- {"FULL_NAME", BDF_ATOM, 1},
- {"ITALIC_ANGLE", BDF_INTEGER, 1},
- {"MAX_SPACE", BDF_INTEGER, 1},
- {"MIN_SPACE", BDF_INTEGER, 1},
- {"NORM_SPACE", BDF_INTEGER, 1},
- {"NOTICE", BDF_ATOM, 1},
- {"PIXEL_SIZE", BDF_INTEGER, 1},
- {"POINT_SIZE", BDF_INTEGER, 1},
- {"QUAD_WIDTH", BDF_INTEGER, 1},
- {"RAW_ASCENT", BDF_INTEGER, 1},
- {"RAW_AVERAGE_WIDTH", BDF_INTEGER, 1},
- {"RAW_AVG_CAPITAL_WIDTH", BDF_INTEGER, 1},
- {"RAW_AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1},
- {"RAW_CAP_HEIGHT", BDF_INTEGER, 1},
- {"RAW_DESCENT", BDF_INTEGER, 1},
- {"RAW_END_SPACE", BDF_INTEGER, 1},
- {"RAW_FIGURE_WIDTH", BDF_INTEGER, 1},
- {"RAW_MAX_SPACE", BDF_INTEGER, 1},
- {"RAW_MIN_SPACE", BDF_INTEGER, 1},
- {"RAW_NORM_SPACE", BDF_INTEGER, 1},
- {"RAW_PIXEL_SIZE", BDF_INTEGER, 1},
- {"RAW_POINT_SIZE", BDF_INTEGER, 1},
- {"RAW_PIXELSIZE", BDF_INTEGER, 1},
- {"RAW_POINTSIZE", BDF_INTEGER, 1},
- {"RAW_QUAD_WIDTH", BDF_INTEGER, 1},
- {"RAW_SMALL_CAP_SIZE", BDF_INTEGER, 1},
- {"RAW_STRIKEOUT_ASCENT", BDF_INTEGER, 1},
- {"RAW_STRIKEOUT_DESCENT", BDF_INTEGER, 1},
- {"RAW_SUBSCRIPT_SIZE", BDF_INTEGER, 1},
- {"RAW_SUBSCRIPT_X", BDF_INTEGER, 1},
- {"RAW_SUBSCRIPT_Y", BDF_INTEGER, 1},
- {"RAW_SUPERSCRIPT_SIZE", BDF_INTEGER, 1},
- {"RAW_SUPERSCRIPT_X", BDF_INTEGER, 1},
- {"RAW_SUPERSCRIPT_Y", BDF_INTEGER, 1},
- {"RAW_UNDERLINE_POSITION", BDF_INTEGER, 1},
- {"RAW_UNDERLINE_THICKNESS", BDF_INTEGER, 1},
- {"RAW_X_HEIGHT", BDF_INTEGER, 1},
- {"RELATIVE_SETWIDTH", BDF_CARDINAL, 1},
- {"RELATIVE_WEIGHT", BDF_CARDINAL, 1},
- {"RESOLUTION", BDF_INTEGER, 1},
- {"RESOLUTION_X", BDF_CARDINAL, 1},
- {"RESOLUTION_Y", BDF_CARDINAL, 1},
- {"SETWIDTH_NAME", BDF_ATOM, 1},
- {"SLANT", BDF_ATOM, 1},
- {"SMALL_CAP_SIZE", BDF_INTEGER, 1},
- {"SPACING", BDF_ATOM, 1},
- {"STRIKEOUT_ASCENT", BDF_INTEGER, 1},
- {"STRIKEOUT_DESCENT", BDF_INTEGER, 1},
- {"SUBSCRIPT_SIZE", BDF_INTEGER, 1},
- {"SUBSCRIPT_X", BDF_INTEGER, 1},
- {"SUBSCRIPT_Y", BDF_INTEGER, 1},
- {"SUPERSCRIPT_SIZE", BDF_INTEGER, 1},
- {"SUPERSCRIPT_X", BDF_INTEGER, 1},
- {"SUPERSCRIPT_Y", BDF_INTEGER, 1},
- {"UNDERLINE_POSITION", BDF_INTEGER, 1},
- {"UNDERLINE_THICKNESS", BDF_INTEGER, 1},
- {"WEIGHT", BDF_CARDINAL, 1},
- {"WEIGHT_NAME", BDF_ATOM, 1},
- {"X_HEIGHT", BDF_INTEGER, 1},
- {"_MULE_BASELINE_OFFSET", BDF_INTEGER, 1},
- {"_MULE_RELATIVE_COMPOSE", BDF_INTEGER, 1},
-};
+ /*************************************************************************/
+ /* */
+ /* Builtin BDF font properties. */
+ /* */
+ /*************************************************************************/
-static const FT_ULong _num_bdf_properties = FT_NUM_ELEMENT(_bdf_properties);
+ /* List of most properties that might appear in a font. Doesn't include */
+ /* the RAW_* and AXIS_* properties in X11R6 polymorphic fonts. */
-/*
- * User defined properties.
- */
-/*static bdf_property_t *user_props;
- static unsigned long nuser_props = 0;*/
+ static bdf_property_t _bdf_properties[] =
+ {
+ { (char *)"ADD_STYLE_NAME", BDF_ATOM, 1, { 0 } },
+ { (char *)"AVERAGE_WIDTH", BDF_INTEGER, 1, { 0 } },
+ { (char *)"AVG_CAPITAL_WIDTH", BDF_INTEGER, 1, { 0 } },
+ { (char *)"AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1, { 0 } },
+ { (char *)"CAP_HEIGHT", BDF_INTEGER, 1, { 0 } },
+ { (char *)"CHARSET_COLLECTIONS", BDF_ATOM, 1, { 0 } },
+ { (char *)"CHARSET_ENCODING", BDF_ATOM, 1, { 0 } },
+ { (char *)"CHARSET_REGISTRY", BDF_ATOM, 1, { 0 } },
+ { (char *)"COMMENT", BDF_ATOM, 1, { 0 } },
+ { (char *)"COPYRIGHT", BDF_ATOM, 1, { 0 } },
+ { (char *)"DEFAULT_CHAR", BDF_CARDINAL, 1, { 0 } },
+ { (char *)"DESTINATION", BDF_CARDINAL, 1, { 0 } },
+ { (char *)"DEVICE_FONT_NAME", BDF_ATOM, 1, { 0 } },
+ { (char *)"END_SPACE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"FACE_NAME", BDF_ATOM, 1, { 0 } },
+ { (char *)"FAMILY_NAME", BDF_ATOM, 1, { 0 } },
+ { (char *)"FIGURE_WIDTH", BDF_INTEGER, 1, { 0 } },
+ { (char *)"FONT", BDF_ATOM, 1, { 0 } },
+ { (char *)"FONTNAME_REGISTRY", BDF_ATOM, 1, { 0 } },
+ { (char *)"FONT_ASCENT", BDF_INTEGER, 1, { 0 } },
+ { (char *)"FONT_DESCENT", BDF_INTEGER, 1, { 0 } },
+ { (char *)"FOUNDRY", BDF_ATOM, 1, { 0 } },
+ { (char *)"FULL_NAME", BDF_ATOM, 1, { 0 } },
+ { (char *)"ITALIC_ANGLE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"MAX_SPACE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"MIN_SPACE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"NORM_SPACE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"NOTICE", BDF_ATOM, 1, { 0 } },
+ { (char *)"PIXEL_SIZE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"POINT_SIZE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"QUAD_WIDTH", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_ASCENT", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_AVERAGE_WIDTH", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_AVG_CAPITAL_WIDTH", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_AVG_LOWERCASE_WIDTH", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_CAP_HEIGHT", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_DESCENT", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_END_SPACE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_FIGURE_WIDTH", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_MAX_SPACE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_MIN_SPACE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_NORM_SPACE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_PIXEL_SIZE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_POINT_SIZE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_PIXELSIZE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_POINTSIZE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_QUAD_WIDTH", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_SMALL_CAP_SIZE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_STRIKEOUT_ASCENT", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_STRIKEOUT_DESCENT", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_SUBSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_SUBSCRIPT_X", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_SUBSCRIPT_Y", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_SUPERSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_SUPERSCRIPT_X", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_SUPERSCRIPT_Y", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_UNDERLINE_POSITION", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_UNDERLINE_THICKNESS", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RAW_X_HEIGHT", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RELATIVE_SETWIDTH", BDF_CARDINAL, 1, { 0 } },
+ { (char *)"RELATIVE_WEIGHT", BDF_CARDINAL, 1, { 0 } },
+ { (char *)"RESOLUTION", BDF_INTEGER, 1, { 0 } },
+ { (char *)"RESOLUTION_X", BDF_CARDINAL, 1, { 0 } },
+ { (char *)"RESOLUTION_Y", BDF_CARDINAL, 1, { 0 } },
+ { (char *)"SETWIDTH_NAME", BDF_ATOM, 1, { 0 } },
+ { (char *)"SLANT", BDF_ATOM, 1, { 0 } },
+ { (char *)"SMALL_CAP_SIZE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"SPACING", BDF_ATOM, 1, { 0 } },
+ { (char *)"STRIKEOUT_ASCENT", BDF_INTEGER, 1, { 0 } },
+ { (char *)"STRIKEOUT_DESCENT", BDF_INTEGER, 1, { 0 } },
+ { (char *)"SUBSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"SUBSCRIPT_X", BDF_INTEGER, 1, { 0 } },
+ { (char *)"SUBSCRIPT_Y", BDF_INTEGER, 1, { 0 } },
+ { (char *)"SUPERSCRIPT_SIZE", BDF_INTEGER, 1, { 0 } },
+ { (char *)"SUPERSCRIPT_X", BDF_INTEGER, 1, { 0 } },
+ { (char *)"SUPERSCRIPT_Y", BDF_INTEGER, 1, { 0 } },
+ { (char *)"UNDERLINE_POSITION", BDF_INTEGER, 1, { 0 } },
+ { (char *)"UNDERLINE_THICKNESS", BDF_INTEGER, 1, { 0 } },
+ { (char *)"WEIGHT", BDF_CARDINAL, 1, { 0 } },
+ { (char *)"WEIGHT_NAME", BDF_ATOM, 1, { 0 } },
+ { (char *)"X_HEIGHT", BDF_INTEGER, 1, { 0 } },
+ { (char *)"_MULE_BASELINE_OFFSET", BDF_INTEGER, 1, { 0 } },
+ { (char *)"_MULE_RELATIVE_COMPOSE", BDF_INTEGER, 1, { 0 } },
+ };
-/**************************************************************************
- *
- * Hash table utilities for the properties.
- *
- **************************************************************************/
+ static unsigned long
+ _num_bdf_properties = sizeof ( _bdf_properties ) /
+ sizeof ( _bdf_properties[0] );
-#define INITIAL_HT_SIZE 241
-typedef void (*hash_free_func)(hashnode node);
+ /*************************************************************************/
+ /* */
+ /* Hash table utilities for the properties. */
+ /* */
+ /*************************************************************************/
-static hashnode*
-hash_bucket(char *key, hashtable *ht)
-{
- char* kp = key;
- unsigned long res = 0;
- hashnode* bp = ht->table, *ndp;
+ /* XXX: Replace this with FreeType's hash functions */
- /*
- * Mocklisp hash function.
- */
- while (*kp)
- res = (res << 5) - res + *kp++;
- ndp = bp + (res % ht->size);
- while (*ndp)
+#define INITIAL_HT_SIZE 241
+
+ typedef void
+ (*hash_free_func)( hashnode node );
+
+ static hashnode*
+ hash_bucket( char* key,
+ hashtable* ht )
{
- kp = (*ndp)->key;
+ char* kp = key;
+ unsigned long res = 0;
+ hashnode* bp = ht->table, *ndp;
- if (kp[0] == key[0] && ft_strcmp(kp, key) == 0)
- break;
- ndp--;
- if (ndp < bp)
- ndp = bp + (ht->size - 1);
+ /* Mocklisp hash function. */
+ while ( *kp )
+ res = ( res << 5 ) - res + *kp++;
+
+ ndp = bp + ( res % ht->size );
+ while ( *ndp )
+ {
+ kp = (*ndp)->key;
+ if ( kp[0] == key[0] && ft_strcmp( kp, key ) == 0 )
+ break;
+ ndp--;
+ if ( ndp < bp )
+ ndp = bp + ( ht->size - 1 );
+ }
+
+ return ndp;
}
- return ndp;
-}
-static FT_Error
-hash_rehash ( hashtable* ht,
- FT_Memory memory )
-{
- hashnode *obp = ht->table, *bp, *nbp;
- int i, sz = ht->size;
- FT_Error error;
+ static FT_Error
+ hash_rehash( hashtable* ht,
+ FT_Memory memory )
+ {
+ hashnode* obp = ht->table, *bp, *nbp;
+ int i, sz = ht->size;
+ FT_Error error = BDF_Err_Ok;
- ht->size <<= 1;
- ht->limit = ht->size / 3;
- if ( FT_NEW_ARRAY( ht->table , ht->size ) )
- return error;
+ ht->size <<= 1;
+ ht->limit = ht->size / 3;
- for (i = 0, bp = obp; i < sz; i++, bp++)
- {
- if (*bp)
+ if ( FT_NEW_ARRAY( ht->table, ht->size ) )
+ goto Exit;
+ FT_MEM_SET( ht->table, 0, sizeof ( hashnode ) * ht->size );
+
+ for ( i = 0, bp = obp; i < sz; i++, bp++ )
{
- nbp = hash_bucket((*bp)->key, ht);
- *nbp = *bp;
+ if ( *bp )
+ {
+ nbp = hash_bucket( (*bp)->key, ht );
+ *nbp = *bp;
+ }
}
+ FT_FREE( obp );
+
+ Exit:
+ return error;
}
- FT_FREE(obp);
- return FT_Err_Ok;
-}
+ static FT_Error
+ hash_init( hashtable* ht,
+ FT_Memory memory )
+ {
+ int sz = INITIAL_HT_SIZE;
+ FT_Error error = BDF_Err_Ok;
-static FT_Error
-hash_init ( hashtable* ht,
- FT_Memory memory )
-{
- int sz = INITIAL_HT_SIZE;
- FT_Error error;
- ht->size = sz;
- ht->limit = sz / 3;
- ht->used = 0;
+ ht->size = sz;
+ ht->limit = sz / 3;
+ ht->used = 0;
- if ( FT_NEW_ARRAY( ht->table, size ) )
+ if ( FT_NEW_ARRAY( ht->table, sz ) )
+ goto Exit;
+ FT_MEM_SET( ht->table, 0, sizeof ( hashnode ) * sz );
+
+ Exit:
return error;
+ }
- return FT_Err_Ok;
-}
+ static void
+ hash_free( hashtable* ht,
+ FT_Memory memory )
+ {
+ if ( ht != 0 )
+ {
+ int i, sz = ht->size;
+ hashnode* bp = ht->table;
-static void
-hash_free( hashtable* ht,
- FT_Memory memory )
-{
- /* FT_Error error; */
- if ( ht != 0 )
+ for ( i = 0; i < sz; i++, bp++ )
+ FT_FREE( *bp );
+
+ FT_FREE( ht->table );
+ }
+ }
+
+
+ static FT_Error
+ hash_insert( char* key,
+ void* data,
+ hashtable* ht,
+ FT_Memory memory )
{
- int i, sz = ht->size;
- hashnode* bp = ht->table;
+ hashnode nn, *bp = hash_bucket( key, ht );
+ FT_Error error = BDF_Err_Ok;
- for (i = 0; i < sz; i++, bp++)
+
+ nn = *bp;
+ if ( !nn )
{
- if (*bp)
- FT_FREE(*bp);
+ if ( FT_NEW( nn ) )
+ goto Exit;
+ *bp = nn;
+
+ nn->key = key;
+ nn->data = data;
+
+ if ( ht->used >= ht->limit )
+ {
+ error = hash_rehash( ht, memory );
+ if ( error )
+ goto Exit;
+ }
+ ht->used++;
}
- if (sz > 0)
- FT_FREE(ht->table);
+ else
+ nn->data = data;
+
+ Exit:
+ return error;
}
-}
-static FT_Error
-hash_insert ( char* key,
- void* data,
- hashtable* ht,
- FT_Memory memory )
-{
- FT_Error error = FT_Err_Ok;
- hashnode nn, *bp = hash_bucket(key, ht);
-
- nn = *bp;
- if (!nn)
+ static hashnode
+ hash_lookup( char* key,
+ hashtable* ht )
{
- if ( FT_NEW( nn ) )
- return error;
+ hashnode *np = hash_bucket( key, ht );
- *bp = nn;
- nn->key = key;
- nn->data = data;
- if (ht->used >= ht->limit)
- error = hash_rehash(ht, memory);
-
- ht->used++;
+ return *np;
}
- else
- nn->data = data;
- return error;
-}
+ /*************************************************************************/
+ /* */
+ /* Utility types and functions. */
+ /* */
+ /*************************************************************************/
-static hashnode
-hash_lookup(char *key, hashtable *ht)
-{
- hashnode *np = hash_bucket(key, ht);
- return *np;
-}
-#ifdef 0
-static void
-hash_delete(char *name, hashtable *ht , FT_Memory memory)
-{
- hashnode *hp;
- /* FT_Error error; */
+ /* Function type for parsing lines of a BDF font. */
- hp = hash_bucket(name, ht);
- FT_FREE( *hp );
-}
-#endif
+ typedef FT_Error
+ (*_bdf_line_func_t)( char* line,
+ unsigned long linelen,
+ unsigned long lineno,
+ void* call_data,
+ void* client_data );
-/*
- * The builtin property table.
- */
-/*static hashtable proptbl; */ /* XXX eliminate this */
+ /* List structure for splitting lines into fields. */
+ typedef struct _bdf_list_t_
+ {
+ char** field;
+ unsigned long size;
+ unsigned long used;
-/**************************************************************************
- *
- * Utility types and functions.
- *
- **************************************************************************/
+ } _bdf_list_t;
-/*
- * Function type for parsing lines of a BDF font.
- */
-typedef int (*_bdf_line_func_t)( char* line,
- unsigned long linelen,
- unsigned long lineno,
- void* call_data,
- void* client_data );
-/*
- * List structure for splitting lines into fields.
- */
-typedef struct
-{
- char** field;
- unsigned long size;
- unsigned long used;
- char* bfield;
- unsigned long bsize;
- unsigned long bused;
+ /* Structure used while loading BDF fonts. */
-} _bdf_list_t;
+ typedef struct _bdf_parse_t_
+ {
+ unsigned long flags;
+ unsigned long cnt;
+ unsigned long row;
+ short minlb;
+ short maxlb;
+ short maxrb;
+ short maxas;
+ short maxds;
-/*
- * Structure used while loading BDF fonts.
- */
-typedef struct
-{
- unsigned long flags;
- unsigned long cnt;
- unsigned long row;
- unsigned long bpr;
- short minlb;
- short maxlb;
- short maxrb;
- short maxas;
- short maxds;
- short rbearing;
- char* glyph_name;
- long glyph_enc;
- bdf_font_t* font;
- bdf_options_t* opts;
- void* client_data;
- bdf_callback_t callback;
- bdf_callback_struct_t cb;
- unsigned long have[2048];
- _bdf_list_t list;
+ short rbearing;
- FT_Memory memory;
+ char* glyph_name;
+ long glyph_enc;
-} _bdf_parse_t;
+ bdf_font_t* font;
+ bdf_options_t* opts;
-#define setsbit(m, cc) (m[(cc) >> 3] |= (1 << ((cc) & 7)))
-#define sbitset(m, cc) (m[(cc) >> 3] & (1 << ((cc) & 7)))
+ unsigned long have[2048];
+ _bdf_list_t list;
-/*
- * An empty string for empty fields.
- */
-static const char empty[1] = { 0 }; /* XXX eliminate this */
+ FT_Memory memory;
-/*
- * Assume the line is NULL terminated and that the `list' parameter was
- * initialized the first time it was used.
- */
-static FT_Error
-_bdf_split ( char* separators,
- char* line,
- unsigned long linelen,
- _bdf_list_t* list,
- FT_Memory memory )
-{
- int mult, final_empty;
- char *sp, *ep, *end;
- unsigned char seps[32];
- FT_Error error;
+ } _bdf_parse_t;
- /*
- * Initialize the list.
- */
- list->used = list->bused = 0;
- /*
- * If the line is empty, then simply return.
- */
- if ( linelen == 0 || line[0] == 0 )
- return FT_Err_Ok;
+#define setsbit( m, cc ) ( m[(cc) >> 3] |= ( 1 << ( (cc) & 7 ) ) )
+#define sbitset( m, cc ) ( m[(cc) >> 3] & ( 1 << ( (cc) & 7 ) ) )
- /*
- * If the `separators' parameter is NULL or empty, split the list into
- * individual bytes.
- */
- if ( separators == 0 || *separators == 0 )
+
+ /* An empty string for empty fields. */
+
+ static char empty[1] = { 0 }; /* XXX eliminate this */
+
+
+ /* Assume the line is NULL-terminated and that the `list' parameter */
+ /* was initialized the first time it was used. */
+
+ static FT_Error
+ _bdf_split( char* separators,
+ char* line,
+ unsigned long linelen,
+ _bdf_list_t* list,
+ FT_Memory memory )
{
- if ( linelen > list->bsize )
+ int mult, final_empty;
+ char *sp, *ep, *end;
+ char seps[32];
+ FT_Error error = BDF_Err_Ok;
+
+
+ /* Initialize the list. */
+ list->used = 0;
+
+ /* If the line is empty, then simply return. */
+ if ( linelen == 0 || line[0] == 0 )
+ goto Exit;
+
+ /* In the original code, if the `separators' parameter is NULL or */
+ /* empty, the list is split into individual bytes. We don't need */
+ /* this, so an error is signaled. */
+ if ( separators == 0 || *separators == 0 )
{
- if ( list->bsize )
- {
- if ( FT_ALLOC ( list->bfield , linelen) )
- return error;
- }
+ error = BDF_Err_Invalid_Argument;
+ goto Exit;
+ }
+
+ /* Prepare the separator bitmap. */
+ FT_MEM_SET( seps, 0, 32 );
+
+ /* If the very last character of the separator string is a plus, then */
+ /* set the `mult' flag to indicate that multiple separators should be */
+ /* collapsed into one. */
+ for ( mult = 0, sp = separators; sp && *sp; sp++ )
+ {
+ if ( *sp == '+' && *( sp + 1 ) == 0 )
+ mult = 1;
else
- {
- if ( FT_REALLOC ( list->bfield , list->bsize, linelen) )
- return error;
- }
- list->bsize = linelen;
+ setsbit( seps, *sp );
}
- list->bused = linelen;
- FT_MEM_COPY (list->bfield, line, linelen);
- return FT_Err_Ok;
- }
+ /* Break the line up into fields. */
+ for ( final_empty = 0, sp = ep = line, end = sp + linelen;
+ sp < end && *sp; )
+ {
+ /* Collect everything that is not a separator. */
+ for ( ; *ep && !sbitset( seps, *ep ); ep++ )
+ ;
- /*
- * Prepare the separator bitmap.
- */
- FT_MEM_ZERO( seps, 32 );
+ /* Resize the list if necessary. */
+ if ( list->used == list->size )
+ {
+ if ( list->size == 0 )
+ {
+ if ( FT_NEW_ARRAY( list->field, 5 ) )
+ goto Exit;
+ }
+ else
+ {
+ if ( FT_RENEW_ARRAY ( list->field ,
+ list->size,
+ list->size + 5 ) )
+ goto Exit;
+ }
- /*
- * If the very last character of the separator string is a plus, then set
- * the `mult' flag to indicate that multiple separators should be
- * collapsed into one.
- */
- for ( mult = 0, sp = separators; sp && *sp; sp++ )
- {
- if ( sp[0] == '+' && sp[1] == 0)
- mult = 1;
- else
- setsbit( seps, sp[0] );
- }
+ list->size += 5;
+ }
- /*
- * Break the line up into fields.
- */
- final_empty = 0;
- sp = ep = line;
- end = sp + linelen;
- for ( ; sp < end && *sp;)
- {
- /*
- * Collect everything that is not a separator.
- */
- for ( ; *ep && !sbitset( seps, *ep ); ep++ ) ;
+ /* Assign the field appropriately. */
+ list->field[list->used++] = ( ep > sp ) ? sp : empty;
- /*
- * Resize the list if necessary.
- */
- if ( list->used == list->size )
- {
- if ( list->size == 0 )
+ sp = ep;
+
+ if ( mult )
{
- if ( FT_NEW_ARRAY( list->field , 5) )
- return error;
+ /* If multiple separators should be collapsed, do it now by */
+ /* setting all the separator characters to 0. */
+ for ( ; *ep && sbitset( seps, *ep ); ep++ )
+ *ep = 0;
}
- else
- {
- if ( FT_RENEW_ARRAY( list->field , list->size, list->size+5 )
- return error;
- }
- list->size += 5;
+ else if ( *ep != 0 )
+ /* Don't collapse multiple separators by making them 0, so just */
+ /* make the one encountered 0. */
+ *ep++ = 0;
+
+ final_empty = ( ep > sp && *ep == 0 );
+ sp = ep;
}
- /*
- * Assign the field appropriately.
- */
- list->field[ list->used++ ] = (ep > sp) ? sp : empty;
-
- sp = ep;
- if (mult)
+ /* Finally, NULL-terminate the list. */
+ if ( list->used + final_empty + 1 >= list->size )
{
- /*
- * If multiple separators should be collapsed, do it now by
- * setting all the separator characters to 0.
- */
- for ( ; *ep && sbitset(seps, *ep); ep++ )
- *ep = 0;
+ if ( list->used == list->size )
+ {
+ if ( list->size == 0 )
+ {
+ if ( FT_NEW_ARRAY( list->field, 5 ) )
+ goto Exit;
+ }
+ else
+ {
+ if ( FT_RENEW_ARRAY( list->field,
+ list->size,
+ list->size + 5 ) )
+ goto Exit;
+ }
+ list->size += 5;
+ }
}
- else if (*ep != 0)
- {
- /*
- * Don't collapse multiple separators by making them 0, so just
- * make the one encountered 0.
- */
- *ep++ = 0;
- }
- final_empty = ( ep > sp && *ep == 0 );
- sp = ep;
- }
+ if ( final_empty )
+ list->field[list->used++] = empty;
- /*
- * Finally, NULL terminate the list.
- */
- if ( list->used + final_empty + 1 >= list->size )
- {
if ( list->used == list->size )
{
if ( list->size == 0 )
{
if ( FT_NEW_ARRAY( list->field, 5 ) )
- return error;
+ goto Exit;
}
else
{
- if ( FT_RENEW_ARRAY( list->field , list->size, list->size+5 ) )
- return error;
+ if ( FT_RENEW_ARRAY( list->field,
+ list->size,
+ list->size + 5 ) )
+ goto Exit;
}
+
list->size += 5;
}
+
+ list->field[list->used] = 0;
+
+ Exit:
+ return error;
}
- if (final_empty)
- list->field[ list->used++ ] = empty;
- if ( list->used == list->size )
+ static void
+ _bdf_shift( unsigned long n,
+ _bdf_list_t* list )
{
- if ( list->size == 0 )
+ unsigned long i, u;
+
+
+ if ( list == 0 || list->used == 0 || n == 0 )
+ return;
+
+ if ( n >= list->used )
{
- if ( FT_NEW_ARRAY( list->field , 5 ) )
- return error;
+ list->used = 0;
+ return;
}
- else
- {
- if ( FT_NEW_ARRAY( list->field, list->size, list->size + 5 ) )
- return error;
- }
- list->size += 5;
+
+ for ( u = n, i = 0; u < list->used; i++, u++ )
+ list->field[i] = list->field[u];
+ list->used -= n;
}
- list->field[ list->used ] = 0;
- return FT_Err_Ok;
-}
+ static char *
+ _bdf_join( int c,
+ unsigned long* len,
+ _bdf_list_t* list )
+ {
+ unsigned long i, j;
+ char *fp, *dp;
-static void
-_bdf_shift( unsigned long n,
- _bdf_list_t* list)
-{
- unsigned long i, u;
- if ( list == 0 || list->used == 0 || n == 0 )
- return;
+ if ( list == 0 || list->used == 0 )
+ return 0;
- if ( n >= list->used )
- {
- list->used = 0;
- return;
+ *len = 0;
+
+ dp = list->field[0];
+ for ( i = j = 0; i < list->used; i++ )
+ {
+ fp = list->field[i];
+ while ( *fp )
+ dp[j++] = *fp++;
+
+ if ( i + 1 < list->used )
+ dp[j++] = c;
+ }
+ dp[j] = 0;
+
+ *len = j;
+ return dp;
}
- for ( u = n, i = 0; u < list->used; i++, u++ )
- list->field[i] = list->field[u];
- list->used -= n;
-}
+ /* High speed file reader that passes each line to a callback. */
+ static FT_Error
+ bdf_internal_readstream( FT_Stream stream,
+ char* buffer,
+ int count,
+ int *read_bytes )
+ {
+ int rbytes;
+ unsigned long pos = stream->pos;
+ FT_Error error = BDF_Err_Ok;
-static char*
-_bdf_join( int c,
- unsigned long* len,
- _bdf_list_t* list)
-{
- unsigned long i, j;
- char *fp, *dp;
- if ( list == 0 || list->used == 0 )
- return 0;
+ if ( pos > stream->size )
+ {
+ FT_ERROR(( "bdf_internal_readstream:" ));
+ FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
+ pos, stream->size ));
+ error = BDF_Err_Invalid_Stream_Operation;
+ goto Exit;
+ }
- *len = 0;
+ if ( stream->read )
+ rbytes = stream->read( stream, pos,
+ (unsigned char *)buffer, count );
+ else
+ {
+ rbytes = stream->size - pos;
+ if ( rbytes > count )
+ rbytes = count;
- dp = list->field[0];
+ FT_MEM_COPY( buffer, stream->base + pos, rbytes );
+ }
- for ( i = j = 0; i < list->used; i++ )
- {
- fp = list->field[i];
- while (*fp)
- dp[j++] = *fp++;
-
- if (i + 1 < list->used)
- dp[j++] = c;
- }
- dp[j] = 0;
+ stream->pos = pos + rbytes;
- *len = j;
- return dp;
-}
+ *read_bytes = rbytes;
-/*
- * High speed file reader that passes each line to a callback.
- */
-int ftreadstream( FT_Stream stream,
- char* buffer,
- int count )
-{
- int read_bytes;
- int pos = stream->pos;
-
- if ( pos >= stream->size )
- {
- FT_ERROR(( "FT_Read_Stream_At:" ));
- FT_ERROR(( " invalid i/o; pos = 0x%lx, size = 0x%lx\n",
- pos, stream->size ));
- return 0;
+ Exit:
+ return error;
}
- if ( stream->read )
- read_bytes = stream->read( stream, pos, buffer, count );
- else
+
+ static FT_Error
+ _bdf_readstream( FT_Stream stream,
+ _bdf_line_func_t callback,
+ void* client_data,
+ unsigned long *lno )
{
- read_bytes = stream->size - pos;
- if ( read_bytes > count )
- read_bytes = count;
+ _bdf_line_func_t cb;
+ unsigned long lineno;
+ int n, res, done, refill, bytes, hold;
+ char *ls, *le, *pp, *pe, *hp;
+ /* XXX: Use a dynamic buffer */
+ char buf[65536L];
+ FT_Error error = BDF_Err_Ok;
- ft_memcpy( buffer, stream->base + pos, read_bytes );
- }
- stream->pos = pos + read_bytes;
+ if ( callback == 0 )
+ {
+ error = BDF_Err_Invalid_Argument;
+ goto Exit;
+ }
- return read_bytes;
-}
+ cb = callback;
+ lineno = 1;
+ buf[0] = 0;
-static int
-_bdf_readstream( FT_Stream stream,
- _bdf_line_func_t callback,
- void* client_data,
- unsigned long* lno)
-{
- _bdf_line_func_t cb;
- unsigned long lineno;
- int n, res, done, refill, bytes, hold;
- char *ls, *le, *pp, *pe, *hp;
- char buf[65536];
+ res = done = 0;
+ pp = ls = le = buf;
- if (callback == 0)
- return -1;
+ bytes = 65536L;
- cb = callback;
- lineno = 1;
- buf[0] = 0;
- res = done = 0;
- pp = ls = le = buf;
- bytes = 65536;
+ while ( !done )
+ {
+ error = bdf_internal_readstream( stream, pp, bytes, &n );
+ if ( error )
+ goto Exit;
- while ( !done && (n = ftreadstream(stream, pp, bytes)) > 0 )
- {
- /*
- * Determine the new end of the buffer pages.
- */
- pe = pp + n;
+ if ( n == 0 )
+ break;
- for (refill = 0; done == 0 && refill == 0; )
- {
- while (le < pe && *le != '\n' && *le != '\r')
- le++;
+ /* Determine the new end of the buffer pages. */
+ pe = pp + n;
- if (le == pe)
+ for ( refill = 0; done == 0 && refill == 0; )
{
- /*
- * Hit the end of the last page in the buffer. Need to find
- * out how many pages to shift and how many pages need to be
- * read in. Adjust the line start and end pointers down to
- * point to the right places in the pages.
- */
- pp = buf + (((ls - buf) >> 13) << 13);
- n = pp - buf;
- ls -= n;
- le -= n;
- n = pe - pp;
- (void) ft_memcpy(buf, pp, n);
- pp = buf + n;
- bytes = 65536 - n;
- refill = 1;
- }
- else
- {
- /*
- * Temporarily NULL terminate the line.
- */
- hp = le;
- hold = *le;
- *le = 0;
+ while ( le < pe && *le != '\n' && *le != '\r' )
+ le++;
- if (callback && *ls != '#' && *ls != 0x1a && le > ls &&
- (res = (*cb)(ls, le - ls, lineno, (void *) &cb,
- client_data)) != 0)
- done = 1;
- else {
+ if ( le == pe )
+ {
+ /* Hit the end of the last page in the buffer. Need to find */
+ /* out how many pages to shift and how many pages need to be */
+ /* read in. Adjust the line start and end pointers down to */
+ /* point to the right places in the pages. */
+
+ pp = buf + ( ( ( ls - buf ) >> 13 ) << 13 );
+ n = pp - buf;
+ ls -= n;
+ le -= n;
+ n = pe - pp;
+
+ FT_MEM_COPY( buf, pp, n );
+
+ pp = buf + n;
+ bytes = 65536L - n;
+ refill = 1;
+ }
+ else
+ {
+ /* Temporarily NULL-terminate the line. */
+ hp = le;
+ hold = *le;
+ *le = 0;
+
+ /* XXX: Use encoding independent value for 0x1a */
+ if ( *ls != '#' && *ls != 0x1a &&
+ le > ls &&
+ ( error = (*cb)( ls, le - ls, lineno, (void *)&cb,
+ client_data ) ) != BDF_Err_Ok )
+ done = 1;
+ else
+ {
ls = ++le;
- /*
- * Handle the case of DOS crlf sequences.
- */
- if (le < pe && hold == '\n' && *le =='\r')
+ /* Handle the case of DOS crlf sequences. */
+ if ( le < pe && hold == '\n' && *le =='\r' )
ls = ++le;
- }
+ }
- /*
- * Increment the line number.
- */
- lineno++;
+ /* Increment the line number. */
+ lineno++;
- /*
- * Restore the character at the end of the line.
- */
- *hp = hold;
+ /* Restore the character at the end of the line. */
+ *hp = hold;
+ }
}
}
- }
- *lno = lineno;
- return res;
-}
+ *lno = lineno;
-FT_LOCAL_DEF( void )
-_bdf_memmove(char *dest, char *src, unsigned long bytes)
-{
- long i, j;
+ Exit:
+ return error;
+ }
- i = (long) bytes;
- j = i & 7;
- i = (i + 7) >> 3;
- /*
- * Do a memmove using Ye Olde Duff's Device for efficiency.
- */
- if (src < dest) {
- src += bytes;
- dest += bytes;
+ /* XXX: make this work with EBCDIC also */
- switch (j) {
- case 0: do {
- *--dest = *--src;
- case 7: *--dest = *--src;
- case 6: *--dest = *--src;
- case 5: *--dest = *--src;
- case 4: *--dest = *--src;
- case 3: *--dest = *--src;
- case 2: *--dest = *--src;
- case 1: *--dest = *--src;
- } while (--i > 0);
- }
- } else if (src > dest) {
- switch (j) {
- case 0: do {
- *dest++ = *src++;
- case 7: *dest++ = *src++;
- case 6: *dest++ = *src++;
- case 5: *dest++ = *src++;
- case 4: *dest++ = *src++;
- case 3: *dest++ = *src++;
- case 2: *dest++ = *src++;
- case 1: *dest++ = *src++;
- } while (--i > 0);
- }
- }
-}
-
-static const unsigned char a2i[128] = {
+ static unsigned char a2i[128] =
+ {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -816,592 +750,596 @@
0x00, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
+ };
-static const unsigned char odigits[32] = {
+ static unsigned char odigits[32] =
+ {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
+ };
-static const unsigned char ddigits[32] = {
+ static unsigned char ddigits[32] =
+ {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
+ };
-static const unsigned char hdigits[32] = {
+ static unsigned char hdigits[32] =
+ {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x03,
0x7e, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-};
+ };
-#define isdigok(m, d) (m[(d) >> 3] & (1 << ((d) & 7)))
-/*
- * Routine to convert an ASCII string into an unsigned long integer.
- */
-static unsigned long
-_bdf_atoul(char *s, char **end, int base)
-{
- unsigned long v;
- unsigned char *dmap;
+#define isdigok( m, d ) (m[(d) >> 3] & ( 1 << ( (d) & 7 ) ) )
- if (s == 0 || *s == 0)
- return 0;
- /*
- * Make sure the radix is something recognizable. Default to 10.
- */
- switch (base)
+ /* Routine to convert an ASCII string into an unsigned long integer. */
+ static unsigned long
+ _bdf_atoul( char* s,
+ char** end,
+ int base )
{
- case 8: dmap = odigits; break;
- case 16: dmap = hdigits; break;
- default: base = 10; dmap = ddigits; break;
- }
+ unsigned long v;
+ unsigned char* dmap;
- /*
- * Check for the special hex prefix.
- */
- if ( s[0] == '0' && ( s[1] == 'x' || s[1] == 'X'))
- {
- base = 16;
- dmap = hdigits;
- s += 2;
- }
- for ( v = 0; isdigok(dmap, *s); s++ )
- v = (v * base) + a2i[(int) *s];
+ if ( s == 0 || *s == 0 )
+ return 0;
- if (end != 0)
- *end = s;
+ /* Make sure the radix is something recognizable. Default to 10. */
+ switch ( base )
+ {
+ case 8:
+ dmap = odigits;
+ break;
+ case 16:
+ dmap = hdigits;
+ break;
+ default:
+ base = 10;
+ dmap = ddigits;
+ break;
+ }
- return v;
-}
+ /* Check for the special hex prefix. */
+ if ( *s == '0' &&
+ ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) )
+ {
+ base = 16;
+ dmap = hdigits;
+ s += 2;
+ }
+ for ( v = 0; isdigok( dmap, *s ); s++ )
+ v = v * base + a2i[(int)*s];
-/*
- * Routine to convert an ASCII string into an signed long integer.
- */
-static long
-_bdf_atol(char *s, char **end, int base)
-{
- long v, neg;
- unsigned char *dmap;
+ if ( end != 0 )
+ *end = s;
- if (s == 0 || *s == 0)
- return 0;
-
- /*
- * Make sure the radix is something recognizable. Default to 10.
- */
- switch (base) {
- case 8: dmap = odigits; break;
- case 16: dmap = hdigits; break;
- default: base = 10; dmap = ddigits; break;
+ return v;
}
- /*
- * Check for a minus sign.
- */
- neg = 0;
- if (*s == '-') {
+
+ /* Routine to convert an ASCII string into an signed long integer. */
+ static long
+ _bdf_atol( char* s,
+ char** end,
+ int base )
+ {
+ long v, neg;
+ unsigned char* dmap;
+
+
+ if ( s == 0 || *s == 0 )
+ return 0;
+
+ /* Make sure the radix is something recognizable. Default to 10. */
+ switch ( base )
+ {
+ case 8:
+ dmap = odigits;
+ break;
+ case 16:
+ dmap = hdigits;
+ break;
+ default:
+ base = 10;
+ dmap = ddigits;
+ break;
+ }
+
+ /* Check for a minus sign. */
+ neg = 0;
+ if ( *s == '-' )
+ {
s++;
neg = 1;
- }
+ }
- /*
- * Check for the special hex prefix.
- */
- if (*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X')) {
+ /* Check for the special hex prefix. */
+ if ( *s == '0' &&
+ ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) )
+ {
base = 16;
dmap = hdigits;
- s += 2;
- }
+ s += 2;
+ }
- for (v = 0; isdigok(dmap, *s); s++)
- v = (v * base) + a2i[(int) *s];
+ for ( v = 0; isdigok( dmap, *s ); s++ )
+ v = v * base + a2i[(int)*s];
- if (end != 0)
- *end = s;
+ if ( end != 0 )
+ *end = s;
- return (!neg) ? v : -v;
-}
+ return ( !neg ) ? v : -v;
+ }
-/*
- * Routine to convert an ASCII string into an signed short integer.
- */
-static short
-_bdf_atos(char *s, char **end, int base)
-{
- short v, neg;
- unsigned char *dmap;
+ /* Routine to convert an ASCII string into an signed short integer. */
+ static short
+ _bdf_atos( char* s,
+ char** end,
+ int base )
+ {
+ short v, neg;
+ unsigned char* dmap;
- if (s == 0 || *s == 0)
+
+ if ( s == 0 || *s == 0 )
return 0;
- /*
- * Make sure the radix is something recognizable. Default to 10.
- */
- switch (base) {
- case 8: dmap = odigits; break;
- case 16: dmap = hdigits; break;
- default: base = 10; dmap = ddigits; break;
+ /* Make sure the radix is something recognizable. Default to 10. */
+ switch ( base )
+ {
+ case 8:
+ dmap = odigits;
+ break;
+ case 16:
+ dmap = hdigits;
+ break;
+ default:
+ base = 10;
+ dmap = ddigits;
+ break;
}
- /*
- * Check for a minus.
- */
+ /* Check for a minus. */
neg = 0;
- if (*s == '-') {
- s++;
- neg = 1;
+ if ( *s == '-' )
+ {
+ s++;
+ neg = 1;
}
- /*
- * Check for the special hex prefix.
- */
- if (*s == '0' && (*(s + 1) == 'x' || *(s + 1) == 'X')) {
- base = 16;
- dmap = hdigits;
- s += 2;
+ /* Check for the special hex prefix. */
+ if ( *s == '0' &&
+ ( *( s + 1 ) == 'x' || *( s + 1 ) == 'X' ) )
+ {
+ base = 16;
+ dmap = hdigits;
+ s += 2;
}
- for (v = 0; isdigok(dmap, *s); s++)
- v = (v * base) + a2i[(int) *s];
+ for ( v = 0; isdigok( dmap, *s ); s++ )
+ v = v * base + a2i[(int)*s];
- if (end != 0)
+ if ( end != 0 )
*end = s;
- return (!neg) ? v : -v;
-}
+ return ( !neg ) ? v : -v;
+ }
-/*
- * Routine to compare two glyphs by encoding so they can be sorted.
- */
-static int
-by_encoding(const void *a, const void *b)
-{
- bdf_glyph_t *c1, *c2;
- c1 = (bdf_glyph_t *) a;
- c2 = (bdf_glyph_t *) b;
- if (c1->encoding < c2->encoding)
+ /* Routine to compare two glyphs by encoding so they can be sorted. */
+ static int
+ by_encoding( const void* a,
+ const void* b )
+ {
+ bdf_glyph_t *c1, *c2;
+
+
+ c1 = (bdf_glyph_t *)a;
+ c2 = (bdf_glyph_t *)b;
+
+ if ( c1->encoding < c2->encoding )
return -1;
- else if (c1->encoding > c2->encoding)
+ else if ( c1->encoding > c2->encoding )
return 1;
+
return 0;
-}
+ }
+ static FT_Error
+ bdf_create_property( char* name,
+ int format,
+ bdf_font_t* font )
+ {
+ unsigned long n;
+ bdf_property_t* p;
+ FT_Memory memory = font->memory;
+ FT_Error error = BDF_Err_Ok;
-static FT_Error
-bdf_create_property( char* name,
- int format,
- bdf_font_t* font )
-{
- unsigned long n;
- bdf_property_t* p;
- FT_Memory memory = font->memory;
- FT_Error error;
- /*
- * First check to see if the property has
- * already been added or not. If it has, then
- * simply ignore it.
- */
- if ( hash_lookup( name, &(font->proptbl)) )
- return FT_Err_Ok;
+ /* First check to see if the property has */
+ /* already been added or not. If it has, then */
+ /* simply ignore it. */
+ if ( hash_lookup( name, &(font->proptbl) ) )
+ goto Exit;
- if (font->nuser_props == 0)
- {
- if ( FT_NEW( font->user_props ) )
- return error;
- }
- else
- {
- if ( FT_RENEW_ARRAY( font->user_props, font->nuser_props,
- (font->nuser_props + 1) ) )
- return error;
- }
+ if ( font->nuser_props == 0 )
+ {
+ if ( FT_NEW_ARRAY( font->user_props, 1 ) )
+ goto Exit;
+ }
+ else
+ {
+ if ( FT_RENEW_ARRAY( font->user_props,
+ font->nuser_props,
+ font->nuser_props + 1 ) )
+ goto Exit;
+ }
- p = font->user_props + font->nuser_props;
-
- FT_ZERO( p );
-
- n = (unsigned long) (ft_strlen(name) + 1);
-
- if ( FT_ALLOC ( p->name , n) )
+ p = font->user_props + font->nuser_props;
+ FT_MEM_SET( p, 0, sizeof ( bdf_property_t ) );
+
+ n = (unsigned long)( ft_strlen( name ) + 1 );
+ if ( FT_NEW_ARRAY( p->name, n ) )
+ goto Exit;
+
+ FT_MEM_COPY( (char *)p->name, name, n );
+
+ p->format = format;
+ p->builtin = 0;
+
+ n = _num_bdf_properties + font->nuser_props;
+
+ error = hash_insert( p->name, (void *)n, &(font->proptbl), memory );
+ if ( error )
+ goto Exit;
+
+ font->nuser_props++;
+
+ Exit:
return error;
-
- FT_MEM_COPY(p->name, name, n);
- p->format = format;
- p->builtin = 0;
+ }
- n = _num_bdf_properties + font->nuser_props;
- error = hash_insert(p->name, (void *) n, &(font->proptbl) , memory);
- if (error) return error;
+ FT_LOCAL_DEF( bdf_property_t * )
+ bdf_get_property( char* name,
+ bdf_font_t* font )
+ {
+ hashnode hn;
+ unsigned long propid;
- font->nuser_props++;
- return FT_Err_Ok;
-}
+ if ( name == 0 || *name == 0 )
+ return 0;
-FT_LOCAL_DEF( bdf_property_t* )
-bdf_get_property(char *name, bdf_font_t *font)
-{
- hashnode hn;
- unsigned long propid;
+ if ( ( hn = hash_lookup( name, &(font->proptbl) ) ) == 0 )
+ return 0;
- if (name == 0 || *name == 0)
- return 0;
+ propid = (unsigned long)hn->data;
+ if ( propid >= _num_bdf_properties )
+ return font->user_props + ( propid - _num_bdf_properties );
- if ((hn = hash_lookup(name, &(font->proptbl))) == 0)
- return 0;
+ return _bdf_properties + propid;
+ }
- propid = (unsigned long) hn->data;
- if (propid >= _num_bdf_properties)
- return font->user_props + (propid - _num_bdf_properties);
- return _bdf_properties + propid;
-}
+ /*************************************************************************/
+ /* */
+ /* BDF font file parsing flags and functions. */
+ /* */
+ /*************************************************************************/
-/**************************************************************************
- *
- * BDF font file parsing flags and functions.
- *
- **************************************************************************/
+ /* Parse flags. */
-/*
- * Parse flags.
- */
-#define _BDF_START 0x0001
-#define _BDF_FONT_NAME 0x0002
-#define _BDF_SIZE 0x0004
-#define _BDF_FONT_BBX 0x0008
-#define _BDF_PROPS 0x0010
-#define _BDF_GLYPHS 0x0020
-#define _BDF_GLYPH 0x0040
-#define _BDF_ENCODING 0x0080
-#define _BDF_SWIDTH 0x0100
-#define _BDF_DWIDTH 0x0200
-#define _BDF_BBX 0x0400
-#define _BDF_BITMAP 0x0800
+#define _BDF_START 0x0001
+#define _BDF_FONT_NAME 0x0002
+#define _BDF_SIZE 0x0004
+#define _BDF_FONT_BBX 0x0008
+#define _BDF_PROPS 0x0010
+#define _BDF_GLYPHS 0x0020
+#define _BDF_GLYPH 0x0040
+#define _BDF_ENCODING 0x0080
+#define _BDF_SWIDTH 0x0100
+#define _BDF_DWIDTH 0x0200
+#define _BDF_BBX 0x0400
+#define _BDF_BITMAP 0x0800
-#define _BDF_SWIDTH_ADJ 0x1000
+#define _BDF_SWIDTH_ADJ 0x1000
-#define _BDF_GLYPH_BITS (_BDF_GLYPH|_BDF_ENCODING|_BDF_SWIDTH|\
- _BDF_DWIDTH|_BDF_BBX|_BDF_BITMAP)
+#define _BDF_GLYPH_BITS ( _BDF_GLYPH | \
+ _BDF_ENCODING | \
+ _BDF_SWIDTH | \
+ _BDF_DWIDTH | \
+ _BDF_BBX | \
+ _BDF_BITMAP )
-#define _BDF_GLYPH_WIDTH_CHECK 0x40000000
-#define _BDF_GLYPH_HEIGHT_CHECK 0x80000000
+#define _BDF_GLYPH_WIDTH_CHECK 0x40000000L
+#define _BDF_GLYPH_HEIGHT_CHECK 0x80000000L
-/*
- * Auto correction messages.
- */
-#define ACMSG1 "FONT_ASCENT property missing. Added \"FONT_ASCENT %hd\"."
-#define ACMSG2 "FONT_DESCENT property missing. Added \"FONT_DESCENT %hd\"."
-#define ACMSG3 "Font width != actual width. Old: %hd New: %hd."
-#define ACMSG4 "Font left bearing != actual left bearing. Old: %hd New: %hd."
-#define ACMSG5 "Font ascent != actual ascent. Old: %hd New: %hd."
-#define ACMSG6 "Font descent != actual descent. Old: %hd New: %hd."
-#define ACMSG7 "Font height != actual height. Old: %hd New: %hd."
-#define ACMSG8 "Glyph scalable width (SWIDTH) adjustments made."
-#define ACMSG9 "SWIDTH field missing at line %ld. Set automatically."
-#define ACMSG10 "DWIDTH field missing at line %ld. Set to glyph width."
-#define ACMSG11 "SIZE bits per pixel field adjusted to %hd."
-#define ACMSG12 "Duplicate encoding %ld (%s) changed to unencoded."
-#define ACMSG13 "Glyph %ld extra rows removed."
-#define ACMSG14 "Glyph %ld extra columns removed."
-#define ACMSG15 "Incorrect glyph count: %ld indicated but %ld found."
-/*
- * Error messages.
- */
-#define ERRMSG1 "[line %ld] Missing \"%s\" line."
-#define ERRMSG2 "[line %ld] Font header corrupted or missing fields."
-#define ERRMSG3 "[line %ld] Font glyphs corrupted or missing fields."
+ /* Auto correction messages. */
+#define ACMSG1 "FONT_ASCENT property missing. " \
+ "Added \"FONT_ASCENT %hd\".\n"
+#define ACMSG2 "FONT_DESCENT property missing. " \
+ "Added \"FONT_DESCENT %hd\".\n"
+#define ACMSG3 "Font width != actual width. Old: %hd New: %hd.\n"
+#define ACMSG4 "Font left bearing != actual left bearing. " \
+ "Old: %hd New: %hd.\n"
+#define ACMSG5 "Font ascent != actual ascent. Old: %hd New: %hd.\n"
+#define ACMSG6 "Font descent != actual descent. Old: %hd New: %hd.\n"
+#define ACMSG7 "Font height != actual height. Old: %hd New: %hd.\n"
+#define ACMSG8 "Glyph scalable width (SWIDTH) adjustments made.\n"
+#define ACMSG9 "SWIDTH field missing at line %ld. Set automatically.\n"
+#define ACMSG10 "DWIDTH field missing at line %ld. Set to glyph width.\n"
+#define ACMSG11 "SIZE bits per pixel field adjusted to %hd.\n"
+#define ACMSG12 "Duplicate encoding %ld (%s) changed to unencoded.\n"
+#define ACMSG13 "Glyph %ld extra rows removed.\n"
+#define ACMSG14 "Glyph %ld extra columns removed.\n"
+#define ACMSG15 "Incorrect glyph count: %ld indicated but %ld found.\n"
-static FT_Error
-_bdf_add_acmsg ( bdf_font_t* font,
- char* msg,
- unsigned long len )
-{
- char* cp;
- FT_Memory memory = font->memory;
- FT_Error error;
+ /* Error messages. */
+#define ERRMSG1 "[line %ld] Missing \"%s\" line.\n"
+#define ERRMSG2 "[line %ld] Font header corrupted or missing fields.\n"
+#define ERRMSG3 "[line %ld] Font glyphs corrupted or missing fields.\n"
- if ( font->acmsgs_len == 0 )
+
+ static FT_Error
+ _bdf_add_comment( bdf_font_t* font,
+ char* comment,
+ unsigned long len )
{
- if ( FT_ALLOC ( font->acmsgs , len + 1 ) )
- return error;
- }
- else
- {
- if ( FT_REALLOC ( font->acmsgs , font->acmsgs_len ,
- font->acmsgs_len + len + 1 ) )
- return error;
- }
+ char* cp;
+ FT_Memory memory = font->memory;
+ FT_Error error = BDF_Err_Ok;
- cp = font->acmsgs + font->acmsgs_len;
- FT_MEM_COPY(cp, msg, len);
- cp += len;
- *cp++ = '\n';
- font->acmsgs_len += len + 1;
- return FT_Err_Ok;
-}
+ if ( font->comments_len == 0 )
+ {
+ if ( FT_NEW_ARRAY( font->comments, len + 1 ) )
+ goto Exit;
+ }
+ else
+ {
+ if ( FT_RENEW_ARRAY( font->comments,
+ font->comments_len,
+ font->comments_len + len + 1 ) )
+ goto Exit;
+ }
+ cp = font->comments + font->comments_len;
+ FT_MEM_COPY( cp, comment, len );
+ cp += len;
+ *cp++ = '\n';
+ font->comments_len += len + 1;
-static FT_Error
-_bdf_add_comment ( bdf_font_t* font,
- char* comment,
- unsigned long len )
-{
- char *cp;
- FT_Memory memory = font->memory;
- FT_Error error;
-
- if (font->comments_len == 0) {
- if ( FT_ALLOC ( font->comments , len + 1 ) )
- return error;
+ Exit:
+ return error;
}
- else
+
+
+ /* Set the spacing from the font name if it exists, or set it to the */
+ /* default specified in the options. */
+ static FT_Error
+ _bdf_set_default_spacing( bdf_font_t* font,
+ bdf_options_t* opts )
{
- if ( FT_REALLOC ( font->comments , font->comments_len,
- font->comments_len + len + 1) )
- return error;
- }
+ unsigned long len;
+ char name[128];
+ _bdf_list_t list;
+ FT_Memory memory;
+ FT_Error error = BDF_Err_Ok;
- cp = font->comments + font->comments_len;
- FT_MEM_COPY(cp, comment, len);
- cp += len;
- *cp++ = '\n';
- font->comments_len += len + 1;
- return FT_Err_Ok;
-}
+ if ( font == 0 || font->name == 0 || font->name[0] == 0 )
+ {
+ error = BDF_Err_Invalid_Argument;
+ goto Exit;
+ }
-/*
- * Set the spacing from the font name if it exists, or set it to the default
- * specified in the options.
- */
-static void
-_bdf_set_default_spacing( bdf_font_t* font,
- bdf_options_t* opts)
-{
- unsigned long len;
- char name[128];
- _bdf_list_t list;
- FT_Memory memory;
- /* FT_Error error; */
+ memory = font->memory;
- if ( font == 0 || font->name == 0 || font->name[0] == 0 )
- return;
+ font->spacing = opts->font_spacing;
- memory = font->memory;
+ len = (unsigned long)( ft_strlen( font->name ) + 1 );
+ FT_MEM_COPY( name, font->name, len );
- font->spacing = opts->font_spacing;
+ list.size = list.used = 0;
- len = (unsigned long) ( ft_strlen(font->name) + 1 );
- (void) ft_memcpy(name, font->name, len);
-
- list.size = list.used = 0;
- _bdf_split("-", name, len, &list, memory);
-
- if (list.used == 15) {
- switch (list.field[11][0]) {
- case 'C': case 'c': font->spacing = BDF_CHARCELL; break;
- case 'M': case 'm': font->spacing = BDF_MONOWIDTH; break;
- case 'P': case 'p': font->spacing = BDF_PROPORTIONAL; break;
+ error = _bdf_split( (char *)"-", name, len, &list, memory );
+ if ( error )
+ goto Exit;
+
+ if ( list.used == 15 )
+ {
+ switch ( list.field[11][0] )
+ {
+ case 'C':
+ case 'c':
+ font->spacing = BDF_CHARCELL;
+ break;
+ case 'M':
+ case 'm':
+ font->spacing = BDF_MONOWIDTH;
+ break;
+ case 'P':
+ case 'p':
+ font->spacing = BDF_PROPORTIONAL;
+ break;
}
+ }
+
+ FT_FREE( list.field );
+
+ Exit:
+ return error;
}
- if (list.size > 0)
- FT_FREE(list.field);
-}
-/*
- * Determine if the property is an atom or not. If it is, then clean it up so
- * the double quotes are removed if they exist.
- */
-static int
-_bdf_is_atom( char* line,
- unsigned long linelen,
- char* *name,
- char* *value,
- bdf_font_t* font)
-{
- int hold;
- char *sp, *ep;
- bdf_property_t *p;
+ /* Determine whether the property is an atom or not. If it is, then */
+ /* clean it up so the double quotes are removed if they exist. */
+ static int
+ _bdf_is_atom( char* line,
+ unsigned long linelen,
+ char** name,
+ char** value,
+ bdf_font_t* font )
+ {
+ int hold;
+ char *sp, *ep;
+ bdf_property_t* p;
+
*name = sp = ep = line;
- while (*ep && *ep != ' ' && *ep != '\t')
+
+ while ( *ep && *ep != ' ' && *ep != '\t' )
ep++;
hold = -1;
- if (*ep)
+ if ( *ep )
{
hold = *ep;
*ep = 0;
}
- p = bdf_get_property(sp, font);
+ p = bdf_get_property( sp, font );
- /*
- * Restore the character that was saved before any return can happen.
- */
- if (hold != -1)
+ /* Restore the character that was saved before any return can happen. */
+ if ( hold != -1 )
*ep = hold;
- /*
- * If the propert exists and is not an atom, just return here.
- */
- if (p && p->format != BDF_ATOM)
+ /* If the property exists and is not an atom, just return here. */
+ if ( p && p->format != BDF_ATOM )
return 0;
- /*
- * The property is an atom. Trim all leading and trailing whitespace and
- * double quotes for the atom value.
- */
+ /* The property is an atom. Trim all leading and trailing whitespace */
+ /* and double quotes for the atom value. */
sp = ep;
ep = line + linelen;
- /*
- * Trim the leading whitespace if it exists.
- */
+ /* Trim the leading whitespace if it exists. */
*sp++ = 0;
- while (*sp && (*sp == ' ' || *sp == '\t'))
+ while ( *sp &&
+ ( *sp == ' ' || *sp == '\t' ) )
sp++;
- /*
- * Trim the leading double quote if it exists.
- */
- if (*sp == '"')
+ /* Trim the leading double quote if it exists. */
+ if ( *sp == '"' )
sp++;
*value = sp;
- /*
- * Trim the trailing whitespace if it exists.
- */
- while (ep > sp && (*(ep - 1) == ' ' || *(ep - 1) == '\t'))
+ /* Trim the trailing whitespace if it exists. */
+ while ( ep > sp &&
+ ( *( ep - 1 ) == ' ' || *( ep - 1 ) == '\t' ) )
*--ep = 0;
- /*
- * Trim the trailing double quote if it exists.
- */
- if (ep > sp && *(ep - 1) == '"')
+ /* Trim the trailing double quote if it exists. */
+ if ( ep > sp && *( ep - 1 ) == '"' )
*--ep = 0;
return 1;
-}
+ }
-static FT_Error
-_bdf_add_property ( bdf_font_t* font,
- char* name,
- char* value)
-{
- unsigned long propid;
- hashnode hn;
- int len;
- bdf_property_t *prop, *fp;
- FT_Memory memory = font->memory;
- FT_Error error;
- /* hashtable proptbl = font->proptbl;
- bdf_property_t *user_props = font->user_props;
- unsigned long nuser_props = font->nuser_props;
- */
+ static FT_Error
+ _bdf_add_property( bdf_font_t* font,
+ char* name,
+ char* value )
+ {
+ unsigned long propid;
+ hashnode hn;
+ int len;
+ bdf_property_t *prop, *fp;
+ FT_Memory memory = font->memory;
+ FT_Error error = BDF_Err_Ok;
- /*
- * First, check to see if the property already exists in the font.
- */
- if ((hn = hash_lookup(name, (hashtable *) font->internal)) != 0) {
- /*
- * The property already exists in the font, so simply replace
- * the value of the property with the current value.
- */
- fp = font->props + (unsigned long) hn->data;
- switch (prop->format)
+ /* First, check to see if the property already exists in the font. */
+ if ( ( hn = hash_lookup( name, (hashtable *)font->internal ) ) != 0 )
+ {
+ /* The property already exists in the font, so simply replace */
+ /* the value of the property with the current value. */
+ fp = font->props + (unsigned long)hn->data;
+
+ switch ( prop->format )
+ {
+ case BDF_ATOM:
+ /* Delete the current atom if it exists. */
+ FT_FREE( fp->value.atom );
+
+ if ( value == 0 )
+ len = 1;
+ else
+ len = ft_strlen( value ) + 1;
+
+ if ( len > 1 )
{
- case BDF_ATOM:
- {
- /*
- * Delete the current atom if it exists.
- */
- FT_FREE ( fp->value.atom );
-
- if (value == 0)
- len = 1;
- else
- len = ft_strlen(value) + 1;
- if (len > 1)
- {
- if ( FT_ALLOC ( fp->value.atom , len ) )
- return error;
-
- FT_MEM_COPY(fp->value.atom, value, len);
- }
- else
- fp->value.atom = 0;
- }
- break;
-
- case BDF_INTEGER:
- fp->value.int32 = _bdf_atol(value, 0, 10);
- break;
-
- case BDF_CARDINAL:
- fp->value.card32 = _bdf_atoul(value, 0, 10);
- break;
-
- default:
- ;
+ if ( FT_NEW_ARRAY( fp->value.atom, len ) )
+ goto Exit;
+ FT_MEM_COPY( fp->value.atom, value, len );
}
- return FT_Err_Ok;
+ else
+ fp->value.atom = 0;
+ break;
+
+ case BDF_INTEGER:
+ fp->value.int32 = _bdf_atol( value, 0, 10 );
+ break;
+
+ case BDF_CARDINAL:
+ fp->value.card32 = _bdf_atoul( value, 0, 10 );
+ break;
+ }
+
+ goto Exit;
}
- /*
- * See if this property type exists yet or not. If not, create it.
- */
- hn = hash_lookup(name, &(font->proptbl));
- if (hn == 0) {
- bdf_create_property(name, BDF_ATOM, font);
- hn = hash_lookup(name, &(font->proptbl));
+ /* See whether this property type exists yet or not. */
+ /* If not, create it. */
+ hn = hash_lookup( name, &(font->proptbl) );
+ if ( hn == 0 )
+ {
+ error = bdf_create_property( name, BDF_ATOM, font );
+ if ( error )
+ goto Exit;
+ hn = hash_lookup( name, &(font->proptbl) );
}
- /*
- * Allocate another property if this is overflow.
- */
- if (font->props_used == font->props_size)
+ /* Allocate another property if this is overflow. */
+ if ( font->props_used == font->props_size )
{
- if (font->props_size == 0)
+ if ( font->props_size == 0 )
{
- if ( FT_NEW( font->props ) )
- return error;
+ if ( FT_NEW_ARRAY( font->props, 1 ) )
+ goto Exit;
}
else
{
- if ( FT_RENEW_ARRAY( font->props, font->props_size,
- (font->props_size + 1) ) )
- return error;
+ if ( FT_RENEW_ARRAY( font->props,
+ font->props_size,
+ font->props_size + 1 ) )
+ goto Exit;
}
+
fp = font->props + font->props_size;
- FT_ZERO( fp );
+ FT_MEM_SET( fp, 0, sizeof ( bdf_property_t ) );
font->props_size++;
}
- propid = (unsigned long) hn->data;
- if (propid >= _num_bdf_properties)
- prop = font->user_props + (propid - _num_bdf_properties);
+ propid = (unsigned long)hn->data;
+ if ( propid >= _num_bdf_properties )
+ prop = font->user_props + ( propid - _num_bdf_properties );
else
prop = _bdf_properties + propid;
@@ -1411,1055 +1349,1062 @@
fp->format = prop->format;
fp->builtin = prop->builtin;
- switch (prop->format)
+ switch ( prop->format )
{
- case BDF_ATOM:
- {
- fp->value.atom = NULL;
-
- if ( value && value[0] != 0 )
- {
- len = ft_strlen(value) + 1;
+ case BDF_ATOM:
+ if ( value == 0 )
+ len = 1;
+ else
+ len = ft_strlen( value ) + 1;
- if ( FT_ALLOC ( fp->value.atom , len ) )
- return error;
-
- FT_MEM_COPY (fp->value.atom, value, len);
- }
- }
- break;
-
+ if ( len > 1 )
+ {
+ if ( FT_NEW_ARRAY( fp->value.atom, len ) )
+ goto Exit;
+ FT_MEM_COPY( fp->value.atom, value, len );
+ }
+ else
+ fp->value.atom = 0;
+ break;
+
case BDF_INTEGER:
- fp->value.int32 = _bdf_atol(value, 0, 10);
+ fp->value.int32 = _bdf_atol( value, 0, 10 );
break;
case BDF_CARDINAL:
- fp->value.card32 = _bdf_atoul(value, 0, 10);
+ fp->value.card32 = _bdf_atoul( value, 0, 10 );
break;
-
- default:
- ;
}
- /*
- * If the property happens to be a comment, then it doesn't need
- * to be added to the internal hash table.
- */
- if ( ft_memcmp(name, "COMMENT", 7) != 0 )
- /*
- * Add the property to the font property table.
- */
- hash_insert( fp->name, (void *) font->props_used,
- (hashtable *) font->internal, memory);
+ /* If the property happens to be a comment, then it doesn't need */
+ /* to be added to the internal hash table. */
+ if ( ft_memcmp( name, "COMMENT", 7 ) != 0 ) {
+ /* Add the property to the font property table. */
+ error = hash_insert( fp->name,
+ (void *)font->props_used,
+ (hashtable *)font->internal,
+ memory );
+ if ( error )
+ goto Exit;
+ }
font->props_used++;
- /*
- * Some special cases need to be handled here. The DEFAULT_CHAR property
- * needs to be located if it exists in the property list, the FONT_ASCENT
- * and FONT_DESCENT need to be assigned if they are present, and the
- * SPACING property should override the default spacing.
- */
- if ( ft_memcmp(name, "DEFAULT_CHAR", 12) == 0 )
+ /* Some special cases need to be handled here. The DEFAULT_CHAR */
+ /* property needs to be located if it exists in the property list, the */
+ /* FONT_ASCENT and FONT_DESCENT need to be assigned if they are */
+ /* present, and the SPACING property should override the default */
+ /* spacing. */
+ if ( ft_memcmp( name, "DEFAULT_CHAR", 12 ) == 0 )
font->default_glyph = fp->value.int32;
-
- else if ( ft_memcmp(name, "FONT_ASCENT", 11) == 0 )
+ else if ( ft_memcmp( name, "FONT_ASCENT", 11 ) == 0 )
font->font_ascent = fp->value.int32;
-
- else if ( ft_memcmp(name, "FONT_DESCENT", 12) == 0 )
+ else if ( ft_memcmp( name, "FONT_DESCENT", 12 ) == 0 )
font->font_descent = fp->value.int32;
-
- else if ( ft_memcmp(name, "SPACING", 7) == 0 )
+ else if ( ft_memcmp( name, "SPACING", 7 ) == 0 )
{
- if (fp->value.atom[0] == 'p' || fp->value.atom[0] == 'P')
+ if ( fp->value.atom[0] == 'p' || fp->value.atom[0] == 'P' )
font->spacing = BDF_PROPORTIONAL;
-
- else if (fp->value.atom[0] == 'm' || fp->value.atom[0] == 'M')
+ else if ( fp->value.atom[0] == 'm' || fp->value.atom[0] == 'M' )
font->spacing = BDF_MONOWIDTH;
-
- else if (fp->value.atom[0] == 'c' || fp->value.atom[0] == 'C')
+ else if ( fp->value.atom[0] == 'c' || fp->value.atom[0] == 'C' )
font->spacing = BDF_CHARCELL;
}
- return FT_Err_Ok;
-}
+ Exit:
+ return error;
+ }
-/*
- * Actually parse the glyph info and bitmaps.
- */
-static int
-_bdf_parse_glyphs( char* line,
- unsigned long linelen,
- unsigned long lineno,
- void* call_data,
- void* client_data)
-{
- int c;
- char *s;
- unsigned char *bp;
- unsigned long i, slen, nibbles;
- double ps, rx, dw, sw;
- _bdf_line_func_t *next;
- _bdf_parse_t *p;
- bdf_glyph_t *glyph;
- bdf_font_t *font;
- char nbuf[128];
- FT_Memory memory;
- FT_Error error;
- next = (_bdf_line_func_t *) call_data;
- p = (_bdf_parse_t *) client_data;
+ static unsigned char nibble_mask[8] =
+ {
+ 0xFF, 0x80, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFE
+ };
- font = p->font;
- memory = font->memory;
- /*
- * Check for a comment.
- */
- if (ft_memcmp(line, "COMMENT", 7) == 0) {
+ /* Actually parse the glyph info and bitmaps. */
+ static FT_Error
+ _bdf_parse_glyphs( char* line,
+ unsigned long linelen,
+ unsigned long lineno,
+ void* call_data,
+ void* client_data )
+ {
+ int c, mask_index;
+ char* s;
+ unsigned char* bp;
+ unsigned long i, slen, nibbles;
+ double ps, rx, dw, sw;
+
+ _bdf_line_func_t* next;
+ _bdf_parse_t* p;
+ bdf_glyph_t* glyph;
+ bdf_font_t* font;
+
+ FT_Memory memory;
+ FT_Error error = BDF_Err_Ok;
+
+ FT_UNUSED( lineno ); /* only used in debug mode */
+
+
+ next = (_bdf_line_func_t *)call_data;
+ p = (_bdf_parse_t *) client_data;
+
+ font = p->font;
+ memory = font->memory;
+
+ /* Check for a comment. */
+ if ( ft_memcmp( line, "COMMENT", 7 ) == 0 )
+ {
linelen -= 7;
+
s = line + 7;
- if (*s != 0) {
- s++;
- linelen--;
+ if ( *s != 0 )
+ {
+ s++;
+ linelen--;
}
- _bdf_add_comment(p->font, s, linelen);
- return 0;
- }
+ error = _bdf_add_comment( p->font, s, linelen );
+ goto Exit;
+ }
- /*
- * The very first thing expected is the number of glyphs.
- */
- if (!(p->flags & _BDF_GLYPHS)) {
- if (ft_memcmp(line, "CHARS", 5) != 0) {
- sprintf(nbuf, ERRMSG1, lineno, "CHARS");
- _bdf_add_acmsg(p->font, nbuf, ft_strlen(nbuf));
- return BDF_MISSING_CHARS;
+ /* The very first thing expected is the number of glyphs. */
+ if ( !( p->flags & _BDF_GLYPHS ) )
+ {
+ if ( ft_memcmp( line, "CHARS", 5 ) != 0 )
+ {
+ FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "CHARS" ));
+ error = BDF_Err_Missing_Chars_Field;
+ goto Exit;
}
- _bdf_split(" +", line, linelen, &p->list, memory);
- p->cnt = font->glyphs_size = _bdf_atoul(p->list.field[1], 0, 10);
- /*
- * Make sure the number of glyphs is non-zero.
- */
- if (p->cnt == 0)
+ error = _bdf_split( (char *)" +", line, linelen, &p->list, memory );
+ if ( error )
+ goto Exit;
+ p->cnt = font->glyphs_size = _bdf_atoul( p->list.field[1], 0, 10 );
+
+ /* Make sure the number of glyphs is non-zero. */
+ if ( p->cnt == 0 )
font->glyphs_size = 64;
-if ( FT_ALLOC ( font->glyphs , sizeof(bdf_glyph_t) *
- font->glyphs_size ) )
- return FT_Err_Out_Of_Memory;
+ if ( FT_NEW_ARRAY( font->glyphs, font->glyphs_size ) )
+ goto Exit;
- /*
- * Set up the callback to indicate the glyph loading is about to
- * begin.
- */
- if (p->callback != 0) {
- p->cb.reason = BDF_LOAD_START;
- p->cb.total = p->cnt;
- p->cb.current = 0;
- (*p->callback)(&p->cb, p->client_data);
- }
p->flags |= _BDF_GLYPHS;
- return 0;
- }
- /*
- * Check for the ENDFONT field.
- */
- if (ft_memcmp(line, "ENDFONT", 7) == 0) {
- /*
- * Sort the glyphs by encoding.
- */
- qsort((char *) font->glyphs, font->glyphs_used, sizeof(bdf_glyph_t),
- by_encoding);
+ goto Exit;
+ }
+ /* Check for the ENDFONT field. */
+ if ( ft_memcmp( line, "ENDFONT", 7 ) == 0 )
+ {
+ /* Sort the glyphs by encoding. */
+ ft_qsort( (char *)font->glyphs,
+ font->glyphs_used,
+ sizeof ( bdf_glyph_t ),
+ by_encoding );
+
p->flags &= ~_BDF_START;
- return 0;
- }
- /*
- * Check for the ENDCHAR field.
- */
- if (ft_memcmp(line, "ENDCHAR", 7) == 0) {
- /*
- * Set up and call the callback if it was passed.
- */
- if (p->callback != 0) {
- p->cb.reason = BDF_LOADING;
- p->cb.total = font->glyphs_size;
- p->cb.current = font->glyphs_used;
- (*p->callback)(&p->cb, p->client_data);
+ goto Exit;
}
- p->glyph_enc = 0;
- p->flags &= ~_BDF_GLYPH_BITS;
- return 0;
- }
- /*
- * Check to see if a glyph is being scanned but should be ignored
- * because it is an unencoded glyph.
- */
- if ((p->flags & _BDF_GLYPH) &&
- p->glyph_enc == -1 && p->opts->keep_unencoded == 0)
- return 0;
+ /* Check for the ENDCHAR field. */
+ if ( ft_memcmp( line, "ENDCHAR", 7 ) == 0 )
+ {
+ p->glyph_enc = 0;
+ p->flags &= ~_BDF_GLYPH_BITS;
- /*
- * Check for the STARTCHAR field.
- */
- if (ft_memcmp(line, "STARTCHAR", 9) == 0) {
- /*
- * Set the character name in the parse info first until the
- * encoding can be checked for an unencoded character.
- */
- if (p->glyph_name != 0)
- FT_FREE(p->glyph_name);
- _bdf_split(" +", line, linelen, &p->list,memory);
- _bdf_shift(1, &p->list);
- s = _bdf_join(' ', &slen, &p->list);
- if ( FT_ALLOC ( p->glyph_name , (slen + 1) ) )
- return BDF_OUT_OF_MEMORY;
- FT_MEM_COPY(p->glyph_name, s, slen + 1);
- p->flags |= _BDF_GLYPH;
- return 0;
- }
-
- /*
- * Check for the ENCODING field.
- */
- if (ft_memcmp(line, "ENCODING", 8) == 0) {
- if (!(p->flags & _BDF_GLYPH)) {
- /*
- * Missing STARTCHAR field.
- */
- sprintf(nbuf, ERRMSG1, lineno, "STARTCHAR");
- _bdf_add_acmsg(font, nbuf, ft_strlen(nbuf));
- return BDF_MISSING_STARTCHAR;
+ goto Exit;
}
- _bdf_split(" +", line, linelen, &p->list, memory);
- p->glyph_enc = _bdf_atol(p->list.field[1], 0, 10);
- /*
- * Check to see if this encoding has already been encountered. If it
- * has then change it to unencoded so it gets added if indicated.
- */
- if (p->glyph_enc >= 0) {
- if (_bdf_glyph_modified(p->have, p->glyph_enc)) {
- /*
- * Add a message saying a glyph has been moved to the
- * unencoded area.
- */
- sprintf(nbuf, ACMSG12, p->glyph_enc, p->glyph_name);
- _bdf_add_acmsg(font, nbuf, ft_strlen(nbuf));
- p->glyph_enc = -1;
- font->modified = 1;
- } else
- _bdf_set_glyph_modified(p->have, p->glyph_enc);
+ /* Check to see whether a glyph is being scanned but should be */
+ /* ignored because it is an unencoded glyph. */
+ if ( ( p->flags & _BDF_GLYPH ) &&
+ p->glyph_enc == -1 &&
+ p->opts->keep_unencoded == 0 )
+ goto Exit;
+
+ /* Check for the STARTCHAR field. */
+ if ( ft_memcmp( line, "STARTCHAR", 9 ) == 0 )
+ {
+ /* Set the character name in the parse info first until the */
+ /* encoding can be checked for an unencoded character. */
+ FT_FREE( p->glyph_name );
+
+ error = _bdf_split( (char *)" +", line, linelen, &p->list,memory );
+ if ( error )
+ goto Exit;
+ _bdf_shift( 1, &p->list );
+
+ s = _bdf_join( ' ', &slen, &p->list );
+
+ if ( FT_NEW_ARRAY( p->glyph_name, slen + 1 ) )
+ goto Exit;
+ FT_MEM_COPY( p->glyph_name, s, slen + 1 );
+
+ p->flags |= _BDF_GLYPH;
+
+ goto Exit;
}
- if (p->glyph_enc >= 0) {
- /*
- * Make sure there are enough glyphs allocated in case the
- * number of characters happen to be wrong.
- */
- if (font->glyphs_used == font->glyphs_size) {
- if ( FT_REALLOC ( font->glyphs,
- sizeof(bdf_glyph_t) * font->glyphs_size,
- sizeof(bdf_glyph_t) * (font->glyphs_size + 64) ) )
- return BDF_OUT_OF_MEMORY;
- FT_MEM_SET ((char *) (font->glyphs + font->glyphs_size),
- 0, sizeof(bdf_glyph_t) << 6); /* FZ inutile */
- font->glyphs_size += 64;
+ /* Check for the ENCODING field. */
+ if ( ft_memcmp( line, "ENCODING", 8 ) == 0 )
+ {
+ if ( !( p->flags & _BDF_GLYPH ) )
+ {
+ /* Missing STARTCHAR field. */
+ FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "STARTCHAR" ));
+ error = BDF_Err_Missing_Startchar_Field;
+ goto Exit;
}
- glyph = font->glyphs + font->glyphs_used++;
- glyph->name = p->glyph_name;
- glyph->encoding = p->glyph_enc;
+ error = _bdf_split( (char *)" +", line, linelen, &p->list, memory );
+ if ( error )
+ goto Exit;
+ p->glyph_enc = _bdf_atol( p->list.field[1], 0, 10 );
- /*
- * Reset the initial glyph info.
- */
- p->glyph_name = 0;
- } else {
- /*
- * Unencoded glyph. Check to see if it should be added or not.
- */
- if (p->opts->keep_unencoded != 0) {
- /*
- * Allocate the next unencoded glyph.
- */
- if (font->unencoded_used == font->unencoded_size) {
- if (font->unencoded_size == 0) {
- if ( FT_ALLOC ( font->unencoded , sizeof(bdf_glyph_t) << 2 ) )
- return BDF_OUT_OF_MEMORY;
+ /* Check to see whether this encoding has already been encountered. */
+ /* If it has then change it to unencoded so it gets added if */
+ /* indicated. */
+ if ( p->glyph_enc >= 0 )
+ {
+ if ( _bdf_glyph_modified( p->have, p->glyph_enc ) )
+ {
+ /* Emit a message saying a glyph has been moved to the */
+ /* unencoded area. */
+ FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG12,
+ p->glyph_enc, p->glyph_name ));
+ p->glyph_enc = -1;
+ font->modified = 1;
+ }
+ else
+ _bdf_set_glyph_modified( p->have, p->glyph_enc );
+ }
+
+ if ( p->glyph_enc >= 0 )
+ {
+ /* Make sure there are enough glyphs allocated in case the */
+ /* number of characters happen to be wrong. */
+ if ( font->glyphs_used == font->glyphs_size )
+ {
+ if ( FT_RENEW_ARRAY( font->glyphs,
+ font->glyphs_size,
+ font->glyphs_size + 64 ) )
+ goto Exit;
+ FT_MEM_SET( font->glyphs + font->glyphs_size,
+ 0,
+ sizeof ( bdf_glyph_t ) * 64 ); /* FZ inutile */
+ font->glyphs_size += 64;
+ }
+
+ glyph = font->glyphs + font->glyphs_used++;
+ glyph->name = p->glyph_name;
+ glyph->encoding = p->glyph_enc;
+
+ /* Reset the initial glyph info. */
+ p->glyph_name = 0;
+ }
+ else
+ {
+ /* Unencoded glyph. Check to see whether it should */
+ /* be added or not. */
+ if ( p->opts->keep_unencoded != 0 )
+ {
+ /* Allocate the next unencoded glyph. */
+ if ( font->unencoded_used == font->unencoded_size )
+ {
+ if ( font->unencoded_size == 0 )
+ {
+ if ( FT_NEW_ARRAY( font->unencoded, 2 ) )
+ goto Exit;
+ }
+ else
+ {
+ if ( FT_RENEW_ARRAY( font->unencoded ,
+ font->unencoded_size,
+ font->unencoded_size + 4 ) )
+ goto Exit;
+ }
+ font->unencoded_size += 4;
}
- else {
- if ( FT_REALLOC ( font->unencoded ,
- sizeof(bdf_glyph_t) * font->unencoded_size,
- sizeof(bdf_glyph_t) *
- (font->unencoded_size + 4) ) )
- return BDF_OUT_OF_MEMORY;
- }
- font->unencoded_size += 4;
+
+ glyph = font->unencoded + font->unencoded_used;
+ glyph->name = p->glyph_name;
+ glyph->encoding = font->unencoded_used++;
}
+ else
+ /* Free up the glyph name if the unencoded shouldn't be */
+ /* kept. */
+ FT_FREE( p->glyph_name );
- glyph = font->unencoded + font->unencoded_used;
- glyph->name = p->glyph_name;
- glyph->encoding = font->unencoded_used++;
- } else
- /*
- * Free up the glyph name if the unencoded shouldn't be
- * kept.
- */
- FT_FREE( p->glyph_name );
+ p->glyph_name = 0;
+ }
- p->glyph_name = 0;
- }
+ /* Clear the flags that might be added when width and height are */
+ /* checked for consistency. */
+ p->flags &= ~( _BDF_GLYPH_WIDTH_CHECK | _BDF_GLYPH_HEIGHT_CHECK );
- /*
- * Clear the flags that might be added when width and height are
- * checked for consistency.
- */
- p->flags &= ~(_BDF_GLYPH_WIDTH_CHECK|_BDF_GLYPH_HEIGHT_CHECK);
+ p->flags |= _BDF_ENCODING;
- p->flags |= _BDF_ENCODING;
- return 0;
- }
+ goto Exit;
+ }
- /*
- * Point at the glyph being constructed.
- */
- if (p->glyph_enc == -1)
- glyph = font->unencoded + (font->unencoded_used - 1);
- else
- glyph = font->glyphs + (font->glyphs_used - 1);
+ /* Point at the glyph being constructed. */
+ if ( p->glyph_enc == -1 )
+ glyph = font->unencoded + ( font->unencoded_used - 1 );
+ else
+ glyph = font->glyphs + ( font->glyphs_used - 1 );
- /*
- * Check to see if a bitmap is being constructed.
- */
- if (p->flags & _BDF_BITMAP) {
- /*
- * If there are more rows than are specified in the glyph metrics,
- * ignore the remaining lines.
- */
- if (p->row >= glyph->bbx.height) {
- if (!(p->flags & _BDF_GLYPH_HEIGHT_CHECK)) {
- sprintf(nbuf, ACMSG13, glyph->encoding);
- _bdf_add_acmsg(font, nbuf, ft_strlen(nbuf));
- p->flags |= _BDF_GLYPH_HEIGHT_CHECK;
- font->modified = 1;
- }
- return 0;
+ /* Check to see whether a bitmap is being constructed. */
+ if ( p->flags & _BDF_BITMAP )
+ {
+ /* If there are more rows than are specified in the glyph metrics, */
+ /* ignore the remaining lines. */
+ if ( p->row >= glyph->bbx.height )
+ {
+ if ( !( p->flags & _BDF_GLYPH_HEIGHT_CHECK ) )
+ {
+ FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG13, glyph->encoding ));
+ p->flags |= _BDF_GLYPH_HEIGHT_CHECK;
+ font->modified = 1;
+ }
+
+ goto Exit;
}
- /*
- * Only collect the number of nibbles indicated by the glyph metrics.
- * If there are more columns, they are simply ignored.
- */
- nibbles = p->bpr << 1;
- bp = glyph->bitmap + (p->row * p->bpr);
- for (i = 0, *bp = 0; i < nibbles; i++) {
- c = line[i];
- *bp = (*bp << 4) + a2i[c];
- if (i + 1 < nibbles && (i & 1))
- *++bp = 0;
+ /* Only collect the number of nibbles indicated by the glyph */
+ /* metrics. If there are more columns, they are simply ignored. */
+ nibbles = glyph->bpr << 1;
+ bp = glyph->bitmap + p->row * glyph->bpr;
+
+ for ( i = 0, *bp = 0; i < nibbles; i++ )
+ {
+ c = line[i];
+ *bp = ( *bp << 4 ) + a2i[c];
+ if ( i + 1 < nibbles && ( i & 1 ) )
+ *++bp = 0;
}
- /*
- * If any line has extra columns, indicate they have been removed.
- */
- if ((line[nibbles] == '0' || a2i[(int) line[nibbles]] != 0) &&
- !(p->flags & _BDF_GLYPH_WIDTH_CHECK)) {
- sprintf(nbuf, ACMSG14, glyph->encoding);
- _bdf_add_acmsg(font, nbuf, ft_strlen(nbuf));
- p->flags |= _BDF_GLYPH_WIDTH_CHECK;
- font->modified = 1;
+ /* Remove possible garbage at the right. */
+ mask_index = ( glyph->bbx.width * p->font->bpp ) & 7;
+ *bp &= nibble_mask[mask_index];
+
+ /* If any line has extra columns, indicate they have been removed. */
+ if ( ( line[nibbles] == '0' || a2i[(int)line[nibbles]] != 0 ) &&
+ !( p->flags & _BDF_GLYPH_WIDTH_CHECK ) )
+ {
+ FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG14, glyph->encoding ));
+ p->flags |= _BDF_GLYPH_WIDTH_CHECK;
+ font->modified = 1;
}
p->row++;
- return 0;
- }
+ goto Exit;
+ }
- /*
- * Expect the SWIDTH (scalable width) field next.
- */
- if (ft_memcmp(line, "SWIDTH", 6) == 0) {
- if (!(p->flags & _BDF_ENCODING)) {
- /*
- * Missing ENCODING field.
- */
- sprintf(nbuf, ERRMSG1, lineno, "ENCODING");
- _bdf_add_acmsg(font, nbuf, ft_strlen(nbuf));
- return BDF_MISSING_ENCODING;
+ /* Expect the SWIDTH (scalable width) field next. */
+ if ( ft_memcmp( line, "SWIDTH", 6 ) == 0 )
+ {
+ if ( !( p->flags & _BDF_ENCODING ) )
+ {
+ /* Missing ENCODING field. */
+ FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "ENCODING" ));
+ error = BDF_Err_Missing_Encoding_Field;
+ goto Exit;
}
- _bdf_split(" +", line, linelen, &p->list, memory);
- glyph->swidth = _bdf_atoul(p->list.field[1], 0, 10);
+
+ error = _bdf_split( (char *)" +", line, linelen, &p->list, memory );
+ if ( error )
+ goto Exit;
+ glyph->swidth = _bdf_atoul( p->list.field[1], 0, 10 );
p->flags |= _BDF_SWIDTH;
- return 0;
- }
- /*
- * Expect the DWIDTH (scalable width) field next.
- */
- if (ft_memcmp(line, "DWIDTH", 6) == 0) {
- _bdf_split(" +", line, linelen, &p->list,memory);
- glyph->dwidth = _bdf_atoul(p->list.field[1], 0, 10);
+ goto Exit;
+ }
- if (!(p->flags & _BDF_SWIDTH)) {
- /*
- * Missing SWIDTH field. Add an auto correction message and set
- * the scalable width from the device width.
- */
- sprintf(nbuf, ACMSG9, lineno);
- _bdf_add_acmsg(font, nbuf, ft_strlen(nbuf));
- ps = (double) font->point_size;
- rx = (double) font->resolution_x;
- dw = (double) glyph->dwidth;
- glyph->swidth = (unsigned short) ((dw * 72000.0) / (ps * rx));
+ /* Expect the DWIDTH (scalable width) field next. */
+ if ( ft_memcmp( line, "DWIDTH", 6 ) == 0 )
+ {
+ error = _bdf_split( (char *)" +", line, linelen, &p->list,memory );
+ if ( error )
+ goto Exit;
+ glyph->dwidth = _bdf_atoul( p->list.field[1], 0, 10 );
+
+ if ( !( p->flags & _BDF_SWIDTH ) )
+ {
+ /* Missing SWIDTH field. Emit an auto correction message and set */
+ /* the scalable width from the device width. */
+ FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG9, lineno ));
+
+ ps = (double)font->point_size;
+ rx = (double)font->resolution_x;
+ dw = (double)glyph->dwidth;
+
+ glyph->swidth = (unsigned short)( ( dw * 72000.0 ) / ( ps * rx ) );
}
p->flags |= _BDF_DWIDTH;
- return 0;
- }
+ goto Exit;
+ }
- /*
- * Expect the BBX field next.
- */
- if (ft_memcmp(line, "BBX", 3) == 0) {
- _bdf_split(" +", line, linelen, &p->list, memory);
- glyph->bbx.width = _bdf_atos(p->list.field[1], 0, 10);
- glyph->bbx.height = _bdf_atos(p->list.field[2], 0, 10);
- glyph->bbx.x_offset = _bdf_atos(p->list.field[3], 0, 10);
- glyph->bbx.y_offset = _bdf_atos(p->list.field[4], 0, 10);
+ /* Expect the BBX field next. */
+ if ( ft_memcmp( line, "BBX", 3 ) == 0 )
+ {
+ error = _bdf_split( (char *)" +", line, linelen, &p->list, memory );
+ if ( error )
+ goto Exit;
- /*
- * Generate the ascent and descent of the character.
- */
- glyph->bbx.ascent = glyph->bbx.height + glyph->bbx.y_offset;
+ glyph->bbx.width = _bdf_atos( p->list.field[1], 0, 10 );
+ glyph->bbx.height = _bdf_atos( p->list.field[2], 0, 10 );
+ glyph->bbx.x_offset = _bdf_atos( p->list.field[3], 0, 10 );
+ glyph->bbx.y_offset = _bdf_atos( p->list.field[4], 0, 10 );
+
+ /* Generate the ascent and descent of the character. */
+ glyph->bbx.ascent = glyph->bbx.height + glyph->bbx.y_offset;
glyph->bbx.descent = -glyph->bbx.y_offset;
- /*
- * Determine the overall font bounding box as the characters are
- * loaded so corrections can be done later if indicated.
- */
- p->maxas = MAX(glyph->bbx.ascent, p->maxas);
- p->maxds = MAX(glyph->bbx.descent, p->maxds);
+ /* Determine the overall font bounding box as the characters are */
+ /* loaded so corrections can be done later if indicated. */
+ p->maxas = MAX( glyph->bbx.ascent, p->maxas );
+ p->maxds = MAX( glyph->bbx.descent, p->maxds );
+
p->rbearing = glyph->bbx.width + glyph->bbx.x_offset;
- p->maxrb = MAX(p->rbearing, p->maxrb);
- p->minlb = MIN(glyph->bbx.x_offset, p->minlb);
- p->maxlb = MAX(glyph->bbx.x_offset, p->maxlb);
- if (!(p->flags & _BDF_DWIDTH)) {
- /*
- * Missing DWIDTH field. Add an auto correction message and set
- * the device width to the glyph width.
- */
- sprintf(nbuf, ACMSG10, lineno);
- _bdf_add_acmsg(font, nbuf, ft_strlen(nbuf));
- glyph->dwidth = glyph->bbx.width;
+ p->maxrb = MAX( p->rbearing, p->maxrb );
+ p->minlb = MIN( glyph->bbx.x_offset, p->minlb );
+ p->maxlb = MAX( glyph->bbx.x_offset, p->maxlb );
+
+ if ( !( p->flags & _BDF_DWIDTH ) )
+ {
+ /* Missing DWIDTH field. Emit an auto correction message and set */
+ /* the device width to the glyph width. */
+ FT_TRACE2(( "_bdf_parse_glyphs: " ACMSG10, lineno ));
+ glyph->dwidth = glyph->bbx.width;
}
- /*
- * If the BDF_CORRECT_METRICS flag is set, then adjust the SWIDTH
- * value if necessary.
- */
- if (p->opts->correct_metrics != 0) {
- /*
- * Determine the point size of the glyph.
- */
- ps = (double) font->point_size;
- rx = (double) font->resolution_x;
- dw = (double) glyph->dwidth;
- sw = (unsigned short) ((dw * 72000.0) / (ps * rx));
+ /* If the BDF_CORRECT_METRICS flag is set, then adjust the SWIDTH */
+ /* value if necessary. */
+ if ( p->opts->correct_metrics != 0 )
+ {
+ /* Determine the point size of the glyph. */
+ ps = (double)font->point_size;
+ rx = (double)font->resolution_x;
+ dw = (double)glyph->dwidth;
- if (sw != glyph->swidth) {
- glyph->swidth = sw;
- if (p->glyph_enc == -1)
- _bdf_set_glyph_modified(font->umod,
- font->unencoded_used - 1);
- else
- _bdf_set_glyph_modified(font->nmod, glyph->encoding);
- p->flags |= _BDF_SWIDTH_ADJ;
- font->modified = 1;
- }
+ sw = (unsigned short)( ( dw * 72000.0 ) / ( ps * rx ) );
+
+ if ( sw != glyph->swidth )
+ {
+ glyph->swidth = sw;
+
+ if ( p->glyph_enc == -1 )
+ _bdf_set_glyph_modified( font->umod,
+ font->unencoded_used - 1 );
+ else
+ _bdf_set_glyph_modified( font->nmod, glyph->encoding );
+
+ p->flags |= _BDF_SWIDTH_ADJ;
+ font->modified = 1;
+ }
}
+
p->flags |= _BDF_BBX;
- return 0;
- }
+ goto Exit;
+ }
- /*
- * And finally, gather up the bitmap.
- */
- if (ft_memcmp(line, "BITMAP", 6) == 0) {
- if (!(p->flags & _BDF_BBX)) {
- /*
- * Missing BBX field.
- */
- sprintf(nbuf, ERRMSG1, lineno, "BBX");
- _bdf_add_acmsg(font, nbuf, ft_strlen(nbuf));
- return BDF_MISSING_BBX;
+ /* And finally, gather up the bitmap. */
+ if ( ft_memcmp( line, "BITMAP", 6 ) == 0 )
+ {
+ if ( !( p->flags & _BDF_BBX ) )
+ {
+ /* Missing BBX field. */
+ FT_ERROR(( "_bdf_parse_glyphs: " ERRMSG1, lineno, "BBX" ));
+ error = BDF_Err_Missing_Bbx_Field;
+ goto Exit;
}
- /*
- * Allocate enough space for the bitmap.
- */
- p->bpr = ((glyph->bbx.width * p->font->bpp) + 7) >> 3;
- glyph->bytes = p->bpr * glyph->bbx.height;
- if ( FT_ALLOC ( glyph->bitmap , glyph->bytes ) )
- return BDF_OUT_OF_MEMORY;
- p->row = 0;
+
+ /* Allocate enough space for the bitmap. */
+ glyph->bpr = ( glyph->bbx.width * p->font->bpp + 7 ) >> 3;
+ glyph->bytes = glyph->bpr * glyph->bbx.height;
+
+ if ( FT_NEW_ARRAY( glyph->bitmap, glyph->bytes ) )
+ goto Exit;
+
+ p->row = 0;
p->flags |= _BDF_BITMAP;
- return 0;
+
+ goto Exit;
+ }
+
+ error = BDF_Err_Invalid_File_Format;
+
+ Exit:
+ return error;
}
- return BDF_INVALID_LINE;
-}
-/*
-* Load the font properties.
-*/
-static int
-_bdf_parse_properties(char *line, unsigned long linelen, unsigned long lineno,
- void *call_data, void *client_data)
-{
- unsigned long vlen;
- _bdf_line_func_t *next;
- _bdf_parse_t *p;
- char *name, *value, nbuf[128];
- FT_Memory memory;
+ /* Load the font properties. */
+ static FT_Error
+ _bdf_parse_properties( char* line,
+ unsigned long linelen,
+ unsigned long lineno,
+ void* call_data,
+ void* client_data )
+ {
+ unsigned long vlen;
+ _bdf_line_func_t* next;
+ _bdf_parse_t* p;
+ char* name;
+ char* value;
+ char nbuf[128];
+ FT_Memory memory;
+ FT_Error error = BDF_Err_Ok;
- next = (_bdf_line_func_t *) call_data;
- p = (_bdf_parse_t *) client_data;
+ FT_UNUSED( lineno );
- memory = p->font->memory;
- /*
- * Check for the end of the properties.
- */
- if (ft_memcmp(line, "ENDPROPERTIES", 13) == 0) {
- /*
- * If the FONT_ASCENT or FONT_DESCENT properties have not been
- * encountered yet, then make sure they are added as properties and
- * make sure they are set from the font bounding box info.
- *
- * This is *always* done regardless of the options, because X11
- * requires these two fields to compile fonts.
- */
- if (bdf_get_font_property(p->font, "FONT_ASCENT") == 0) {
- p->font->font_ascent = p->font->bbx.ascent;
- sprintf(nbuf, "%hd", p->font->bbx.ascent);
- _bdf_add_property(p->font, "FONT_ASCENT", nbuf);
- sprintf(nbuf, ACMSG1, p->font->bbx.ascent);
- _bdf_add_acmsg(p->font, nbuf, ft_strlen(nbuf));
- p->font->modified = 1;
+
+ next = (_bdf_line_func_t *)call_data;
+ p = (_bdf_parse_t *) client_data;
+
+ memory = p->font->memory;
+
+ /* Check for the end of the properties. */
+ if ( ft_memcmp( line, "ENDPROPERTIES", 13 ) == 0 )
+ {
+ /* If the FONT_ASCENT or FONT_DESCENT properties have not been */
+ /* encountered yet, then make sure they are added as properties and */
+ /* make sure they are set from the font bounding box info. */
+ /* */
+ /* This is *always* done regardless of the options, because X11 */
+ /* requires these two fields to compile fonts. */
+ if ( bdf_get_font_property( p->font, (char *)"FONT_ASCENT" ) == 0 )
+ {
+ p->font->font_ascent = p->font->bbx.ascent;
+ ft_sprintf( nbuf, "%hd", p->font->bbx.ascent );
+ error = _bdf_add_property( p->font, (char *)"FONT_ASCENT", nbuf );
+ if ( error )
+ goto Exit;
+
+ FT_TRACE2(( "_bdf_parse_properties: " ACMSG1, p->font->bbx.ascent ));
+ p->font->modified = 1;
}
- if (bdf_get_font_property(p->font, "FONT_DESCENT") == 0) {
- p->font->font_descent = p->font->bbx.descent;
- sprintf(nbuf, "%hd", p->font->bbx.descent);
- _bdf_add_property(p->font, "FONT_DESCENT", nbuf);
- sprintf(nbuf, ACMSG2, p->font->bbx.descent);
- _bdf_add_acmsg(p->font, nbuf, ft_strlen(nbuf));
- p->font->modified = 1;
+
+ if ( bdf_get_font_property( p->font, (char *)"FONT_DESCENT" ) == 0 )
+ {
+ p->font->font_descent = p->font->bbx.descent;
+ ft_sprintf( nbuf, "%hd", p->font->bbx.descent );
+ error = _bdf_add_property( p->font, (char *)"FONT_DESCENT", nbuf );
+ if ( error )
+ goto Exit;
+
+ FT_TRACE2(( "_bdf_parse_properties: " ACMSG2, p->font->bbx.descent ));
+ p->font->modified = 1;
}
+
p->flags &= ~_BDF_PROPS;
- *next = _bdf_parse_glyphs;
- return 0;
- }
+ *next = _bdf_parse_glyphs;
- /*
- * Ignore the _XFREE86_GLYPH_RANGES properties.
- */
- if (ft_memcmp(line, "_XFREE86_GLYPH_RANGES", 21) == 0)
- return 0;
+ goto Exit;
+ }
- /*
- * Handle COMMENT fields and properties in a special way to preserve
- * the spacing.
- */
- if (ft_memcmp(line, "COMMENT", 7) == 0) {
+ /* Ignore the _XFREE86_GLYPH_RANGES properties. */
+ if ( ft_memcmp( line, "_XFREE86_GLYPH_RANGES", 21 ) == 0 )
+ goto Exit;
+
+ /* Handle COMMENT fields and properties in a special way to preserve */
+ /* the spacing. */
+ if ( ft_memcmp( line, "COMMENT", 7 ) == 0 )
+ {
name = value = line;
value += 7;
- if (*value)
+ if ( *value )
*value++ = 0;
- _bdf_add_property(p->font, name, value);
- } else if (_bdf_is_atom(line, linelen, &name, &value, p->font))
- _bdf_add_property(p->font, name, value);
- else {
- _bdf_split(" +", line, linelen, &p->list, memory);
+ error = _bdf_add_property( p->font, name, value );
+ if ( error )
+ goto Exit;
+ }
+ else if ( _bdf_is_atom( line, linelen, &name, &value, p->font ) )
+ {
+ error = _bdf_add_property( p->font, name, value );
+ if ( error )
+ goto Exit;
+ }
+ else
+ {
+ error = _bdf_split( (char *)" +", line, linelen, &p->list, memory );
+ if ( error )
+ goto Exit;
name = p->list.field[0];
- _bdf_shift(1, &p->list);
- value = _bdf_join(' ', &vlen, &p->list);
- _bdf_add_property(p->font, name, value);
+
+ _bdf_shift( 1, &p->list );
+ value = _bdf_join( ' ', &vlen, &p->list );
+
+ error = _bdf_add_property( p->font, name, value );
+ if ( error )
+ goto Exit;
+ }
+
+ Exit:
+ return error;
}
- return 0;
-}
-/*
- * Load the font header.
- */
-static int
-_bdf_parse_start(char *line, unsigned long linelen, unsigned long lineno,
- void *call_data, void *client_data)
-{
- unsigned long slen;
- _bdf_line_func_t *next;
- _bdf_parse_t *p;
- bdf_font_t *font;
- char *s, nbuf[128];
- /* int test; */
- FT_Memory memory;
- FT_Error error;
+ /* Load the font header. */
+ static FT_Error
+ _bdf_parse_start( char* line,
+ unsigned long linelen,
+ unsigned long lineno,
+ void* call_data,
+ void* client_data )
+ {
+ unsigned long slen;
+ _bdf_line_func_t* next;
+ _bdf_parse_t* p;
+ bdf_font_t* font;
+ char *s;
- next = (_bdf_line_func_t *) call_data;
- p = (_bdf_parse_t *) client_data;
- if (p->font)
+ FT_Memory memory;
+ FT_Error error = BDF_Err_Ok;
+
+ FT_UNUSED( lineno ); /* only used in debug mode */
+
+
+ next = (_bdf_line_func_t *)call_data;
+ p = (_bdf_parse_t *) client_data;
+
+ if ( p->font )
memory = p->font->memory;
- /*
- * Check for a comment. This is done to handle those fonts that have
- * comments before the STARTFONT line for some reason.
- */
- if (ft_memcmp(line, "COMMENT", 7) == 0) {
- if (p->opts->keep_comments != 0 && p->font != 0) {
- linelen -= 7;
- s = line + 7;
- if (*s != 0) {
- s++;
- linelen--;
- }
- _bdf_add_comment(p->font, s, linelen);
- /* here font is not defined ! */
+ /* Check for a comment. This is done to handle those fonts that have */
+ /* comments before the STARTFONT line for some reason. */
+ if ( ft_memcmp( line, "COMMENT", 7 ) == 0 )
+ {
+ if ( p->opts->keep_comments != 0 && p->font != 0 )
+ {
+ linelen -= 7;
+
+ s = line + 7;
+ if ( *s != 0 )
+ {
+ s++;
+ linelen--;
}
- return 0;
+
+ error = _bdf_add_comment( p->font, s, linelen );
+ if ( error )
+ goto Exit;
+ /* here font is not defined! */
+ }
+
+ goto Exit;
}
- if (!(p->flags & _BDF_START)) {
+ if ( !( p->flags & _BDF_START ) )
+ {
+ memory = p->memory;
- memory = p->memory;
+ if ( ft_memcmp( line, "STARTFONT", 9 ) != 0 )
+ {
+ /* No STARTFONT field is a good indication of a problem. */
+ error = BDF_Err_Missing_Startfont_Field;
+ goto Exit;
+ }
- if (ft_memcmp(line, "STARTFONT", 9) != 0)
- /*
- * No STARTFONT field is a good indication of a problem.
- */
- return BDF_MISSING_START;
- p->flags = _BDF_START;
- font = p->font = 0;
+ p->flags = _BDF_START;
+ font = p->font = 0;
- if ( FT_ALLOC ( font, sizeof(bdf_font_t) ) )
- return BDF_OUT_OF_MEMORY;
- p->font = font;
+ if ( FT_NEW( font ) )
+ goto Exit;
+ p->font = font;
- font->memory = p->memory;
- p->memory = 0;
+ font->memory = p->memory;
+ p->memory = 0;
- /* if (font == 0) {
- fprintf(stderr,"failed font\n");
- }*/ /* XXX */
+ { /* setup */
+ unsigned long i;
+ bdf_property_t* prop;
- { /* setup */
- unsigned long i;
- bdf_property_t *prop;
- hash_init(&(font->proptbl), memory);
- for (i = 0, prop = _bdf_properties;
- i < _num_bdf_properties; i++, prop++)
- hash_insert(prop->name, (void *) i, &(font->proptbl) , memory);
- }
+ error = hash_init( &(font->proptbl), memory );
+ if ( error )
+ goto Exit;
+ for ( i = 0, prop = _bdf_properties;
+ i < _num_bdf_properties; i++, prop++ )
+ {
+ error = hash_insert( prop->name, (void *)i,
+ &(font->proptbl), memory );
+ if ( error )
+ goto Exit;
+ }
+ }
- if ( FT_ALLOC ( p->font->internal , sizeof(hashtable) ) )
- return BDF_OUT_OF_MEMORY;
- hash_init((hashtable *) p->font->internal,memory);
- p->font->spacing = p->opts->font_spacing;
- p->font->default_glyph = -1;
- return 0;
+ if ( FT_ALLOC( p->font->internal, sizeof ( hashtable ) ) )
+ goto Exit;
+ error = hash_init( (hashtable *)p->font->internal,memory );
+ if ( error )
+ goto Exit;
+ p->font->spacing = p->opts->font_spacing;
+ p->font->default_glyph = -1;
+
+ goto Exit;
}
- /*
- * Check for the start of the properties.
- */
- if (ft_memcmp(line, "STARTPROPERTIES", 15) == 0) {
- _bdf_split(" +", line, linelen, &p->list, memory);
- p->cnt = p->font->props_size = _bdf_atoul(p->list.field[1], 0, 10);
+ /* Check for the start of the properties. */
+ if ( ft_memcmp( line, "STARTPROPERTIES", 15 ) == 0 )
+ {
+ error = _bdf_split( (char *)" +", line, linelen, &p->list, memory );
+ if ( error )
+ goto Exit;
+ p->cnt = p->font->props_size = _bdf_atoul( p->list.field[1], 0, 10 );
- if ( FT_ALLOC ( p->font->props , (sizeof(bdf_property_t) * p->cnt) ) )
- return BDF_OUT_OF_MEMORY;
- p->flags |= _BDF_PROPS;
- *next = _bdf_parse_properties;
- return 0;
+ if ( FT_NEW_ARRAY( p->font->props, p->cnt ) )
+ goto Exit;
+
+ p->flags |= _BDF_PROPS;
+ *next = _bdf_parse_properties;
+
+ goto Exit;
}
- /*
- * Check for the FONTBOUNDINGBOX field.
- */
- if (ft_memcmp(line, "FONTBOUNDINGBOX", 15) == 0) {
- if (!(p->flags & _BDF_SIZE)) {
- /*
- * Missing the SIZE field.
- */
- sprintf(nbuf, ERRMSG1, lineno, "SIZE");
- _bdf_add_acmsg(p->font, nbuf, ft_strlen(nbuf));
- return BDF_MISSING_SIZE;
- }
- _bdf_split(" +", line, linelen, &p->list , memory);
- p->font->bbx.width = _bdf_atos(p->list.field[1], 0, 10);
- p->font->bbx.height = _bdf_atos(p->list.field[2], 0, 10);
- p->font->bbx.x_offset = _bdf_atos(p->list.field[3], 0, 10);
- p->font->bbx.y_offset = _bdf_atos(p->list.field[4], 0, 10);
- p->font->bbx.ascent = p->font->bbx.height + p->font->bbx.y_offset;
- p->font->bbx.descent = -p->font->bbx.y_offset;
- p->flags |= _BDF_FONT_BBX;
- return 0;
+ /* Check for the FONTBOUNDINGBOX field. */
+ if ( ft_memcmp( line, "FONTBOUNDINGBOX", 15 ) == 0 )
+ {
+ if ( !(p->flags & _BDF_SIZE ) )
+ {
+ /* Missing the SIZE field. */
+ FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "SIZE" ));
+ error = BDF_Err_Missing_Size_Field;
+ goto Exit;
+ }
+
+ error = _bdf_split( (char *)" +", line, linelen, &p->list , memory );
+ if ( error )
+ goto Exit;
+
+ p->font->bbx.width = _bdf_atos( p->list.field[1], 0, 10 );
+ p->font->bbx.height = _bdf_atos( p->list.field[2], 0, 10 );
+
+ p->font->bbx.x_offset = _bdf_atos( p->list.field[3], 0, 10 );
+ p->font->bbx.y_offset = _bdf_atos( p->list.field[4], 0, 10 );
+
+ p->font->bbx.ascent = p->font->bbx.height + p->font->bbx.y_offset;
+ p->font->bbx.descent = -p->font->bbx.y_offset;
+
+ p->flags |= _BDF_FONT_BBX;
+
+ goto Exit;
}
- /*
- * The next thing to check for is the FONT field.
- */
- if (ft_memcmp(line, "FONT", 4) == 0) {
- _bdf_split(" +", line, linelen, &p->list , memory);
- _bdf_shift(1, &p->list);
- s = _bdf_join(' ', &slen, &p->list);
- if ( FT_ALLOC ( p->font->name , slen + 1 ) )
- return BDF_OUT_OF_MEMORY;
- (void) ft_memcpy(p->font->name, s, slen + 1);
- /*
- * If the font name is an XLFD name, set the spacing to the one in the
- * font name. If there is no spacing fall back on the default.
- */
- _bdf_set_default_spacing(p->font, p->opts);
- p->flags |= _BDF_FONT_NAME;
- return 0;
+ /* The next thing to check for is the FONT field. */
+ if ( ft_memcmp( line, "FONT", 4 ) == 0 )
+ {
+ error = _bdf_split( (char *)" +", line, linelen, &p->list , memory );
+ if ( error )
+ goto Exit;
+ _bdf_shift( 1, &p->list );
+
+ s = _bdf_join( ' ', &slen, &p->list );
+ if ( FT_NEW_ARRAY( p->font->name, slen + 1 ) )
+ goto Exit;
+ FT_MEM_COPY( p->font->name, s, slen + 1 );
+
+ /* If the font name is an XLFD name, set the spacing to the one in */
+ /* the font name. If there is no spacing fall back on the default. */
+ error = _bdf_set_default_spacing( p->font, p->opts );
+ if ( error )
+ goto Exit;
+
+ p->flags |= _BDF_FONT_NAME;
+
+ goto Exit;
}
- /*
- * Check for the SIZE field.
- */
- if (ft_memcmp(line, "SIZE", 4) == 0) {
- if (!(p->flags & _BDF_FONT_NAME)) {
- /*
- * Missing the FONT field.
- */
- sprintf(nbuf, ERRMSG1, lineno, "FONT");
- _bdf_add_acmsg(p->font, nbuf, ft_strlen(nbuf));
- return BDF_MISSING_FONTNAME;
+ /* Check for the SIZE field. */
+ if ( ft_memcmp( line, "SIZE", 4 ) == 0 )
+ {
+ if ( !( p->flags & _BDF_FONT_NAME ) )
+ {
+ /* Missing the FONT field. */
+ FT_ERROR(( "_bdf_parse_start: " ERRMSG1, lineno, "FONT" ));
+ error = BDF_Err_Missing_Font_Field;
+ goto Exit;
+ }
+
+ error = _bdf_split( (char *)" +", line, linelen, &p->list, memory );
+ if ( error )
+ goto Exit;
+
+ p->font->point_size = _bdf_atoul( p->list.field[1], 0, 10 );
+ p->font->resolution_x = _bdf_atoul( p->list.field[2], 0, 10 );
+ p->font->resolution_y = _bdf_atoul( p->list.field[3], 0, 10 );
+
+ /* Check for the bits per pixel field. */
+ if ( p->list.used == 5 )
+ {
+ p->font->bpp = _bdf_atos( p->list.field[4], 0, 10 );
+ if ( p->font->bpp > 1 && ( p->font->bpp & 1 ) )
+ {
+ /* Move up to the next bits per pixel value if an odd number */
+ /* is encountered. */
+ p->font->bpp++;
+ if ( p->font->bpp <= 4 )
+ FT_TRACE2(( "_bdf_parse_start: " ACMSG11, p->font->bpp ));
}
- _bdf_split(" +", line, linelen, &p->list, memory);
- p->font->point_size = _bdf_atoul(p->list.field[1], 0, 10);
- p->font->resolution_x = _bdf_atoul(p->list.field[2], 0, 10);
- p->font->resolution_y = _bdf_atoul(p->list.field[3], 0, 10);
- /*
- * Check for the bits per pixel field.
- */
- if (p->list.used == 5) {
- p->font->bpp = _bdf_atos(p->list.field[4], 0, 10);
- if (p->font->bpp > 1 && (p->font->bpp & 1)) {
- /*
- * Move up to the next bits per pixel value if an odd number
- * is encountered.
- */
- p->font->bpp++;
- if (p->font->bpp <= 4) {
- sprintf(nbuf, ACMSG11, p->font->bpp);
- _bdf_add_acmsg(p->font, nbuf, ft_strlen(nbuf));
- }
- }
- if (p->font->bpp > 4) {
- sprintf(nbuf, ACMSG11, p->font->bpp);
- _bdf_add_acmsg(p->font, nbuf, ft_strlen(nbuf));
- p->font->bpp = 4;
- }
- } else
- p->font->bpp = 1;
+ if ( p->font->bpp > 4 )
+ {
+ FT_TRACE2(( "_bdf_parse_start: " ACMSG11, p->font->bpp ));
+ p->font->bpp = 4;
+ }
+ }
+ else
+ p->font->bpp = 1;
- p->flags |= _BDF_SIZE;
- return 0;
+ p->flags |= _BDF_SIZE;
+
+ goto Exit;
}
- return BDF_INVALID_LINE;
-}
+ error = BDF_Err_Invalid_File_Format;
-/**************************************************************************
- *
- * API.
- *
- **************************************************************************/
+ Exit:
+ return error;
+ }
-FT_LOCAL_DEF( bdf_font_t* )
-bdf_load_font( FT_Stream stream,
- FT_Memory extmemory,
- bdf_options_t* opts,
- bdf_callback_t callback,
- void* data)
-{
- int n;
- unsigned long lineno;
- char msgbuf[128];
- _bdf_parse_t p;
- FT_Memory memory;
- FT_Error error;
+ /*************************************************************************/
+ /* */
+ /* API. */
+ /* */
+ /*************************************************************************/
- (void) ft_memset((char *) &p, 0, sizeof(_bdf_parse_t));
- p.opts = (opts != 0) ? opts : &_bdf_opts;
- p.minlb = 32767;
- p.callback = callback;
- p.client_data = data;
+ FT_LOCAL_DEF( FT_Error )
+ bdf_load_font( FT_Stream stream,
+ FT_Memory extmemory,
+ bdf_options_t* opts,
+ bdf_font_t* *font )
+ {
+ unsigned long lineno;
+ _bdf_parse_t p;
+
+ FT_Memory memory;
+ FT_Error error = BDF_Err_Ok;
+
+
+ FT_MEM_SET( &p, 0, sizeof ( _bdf_parse_t ) );
+
+ p.opts = ( opts != 0 ) ? opts : &_bdf_opts;
+ p.minlb = 32767;
p.memory = extmemory; /* only during font creation */
- n = _bdf_readstream(stream, _bdf_parse_start, (void *) &p, &lineno);
+ error = _bdf_readstream( stream, _bdf_parse_start,
+ (void *)&p, &lineno );
+ if ( error )
+ goto Exit;
- if (p.font != 0) {
- /*
- * If the font is not proportional, set the fonts monowidth
- * field to the width of the font bounding box.
- */
+ if ( p.font != 0 )
+ {
+ /* If the font is not proportional, set the font's monowidth */
+ /* field to the width of the font bounding box. */
memory = p.font->memory;
- if (p.font->spacing != BDF_PROPORTIONAL)
- p.font->monowidth = p.font->bbx.width;
+ if ( p.font->spacing != BDF_PROPORTIONAL )
+ p.font->monowidth = p.font->bbx.width;
- /*
- * If the number of glyphs loaded is not that of the original count,
- * indicate the difference.
- */
- if (p.cnt != p.font->glyphs_used + p.font->unencoded_used) {
- sprintf(msgbuf, ACMSG15, p.cnt,
- p.font->glyphs_used + p.font->unencoded_used);
- _bdf_add_acmsg(p.font, msgbuf, ft_strlen(msgbuf));
- p.font->modified = 1;
+ /* If the number of glyphs loaded is not that of the original count, */
+ /* indicate the difference. */
+ if ( p.cnt != p.font->glyphs_used + p.font->unencoded_used )
+ {
+ FT_TRACE2(( "bdf_load_font: " ACMSG15, p.cnt,
+ p.font->glyphs_used + p.font->unencoded_used ));
+ p.font->modified = 1;
+ }
+
+ /* Once the font has been loaded, adjust the overall font metrics if */
+ /* necessary. */
+ if ( p.opts->correct_metrics != 0 &&
+ ( p.font->glyphs_used > 0 || p.font->unencoded_used > 0 ) )
+ {
+ if ( p.maxrb - p.minlb != p.font->bbx.width )
+ {
+ FT_TRACE2(( "bdf_load_font: " ACMSG3,
+ p.font->bbx.width, p.maxrb - p.minlb ));
+ p.font->bbx.width = p.maxrb - p.minlb;
+ p.font->modified = 1;
}
- /*
- * Once the font has been loaded, adjust the overall font metrics if
- * necessary.
- */
- if (p.opts->correct_metrics != 0 &&
- (p.font->glyphs_used > 0 || p.font->unencoded_used > 0)) {
- if (p.maxrb - p.minlb != p.font->bbx.width) {
- sprintf(msgbuf, ACMSG3, p.font->bbx.width, p.maxrb - p.minlb);
- _bdf_add_acmsg(p.font, msgbuf, ft_strlen(msgbuf));
- p.font->bbx.width = p.maxrb - p.minlb;
- p.font->modified = 1;
- }
- if (p.font->bbx.x_offset != p.minlb) {
- sprintf(msgbuf, ACMSG4, p.font->bbx.x_offset, p.minlb);
- _bdf_add_acmsg(p.font, msgbuf, ft_strlen(msgbuf));
- p.font->bbx.x_offset = p.minlb;
- p.font->modified = 1;
- }
- if (p.font->bbx.ascent != p.maxas) {
- sprintf(msgbuf, ACMSG5, p.font->bbx.ascent, p.maxas);
- _bdf_add_acmsg(p.font, msgbuf, ft_strlen(msgbuf));
- p.font->bbx.ascent = p.maxas;
- p.font->modified = 1;
- }
- if (p.font->bbx.descent != p.maxds) {
- sprintf(msgbuf, ACMSG6, p.font->bbx.descent, p.maxds);
- _bdf_add_acmsg(p.font, msgbuf, ft_strlen(msgbuf));
- p.font->bbx.descent = p.maxds;
- p.font->bbx.y_offset = -p.maxds;
- p.font->modified = 1;
- }
- if (p.maxas + p.maxds != p.font->bbx.height) {
- sprintf(msgbuf, ACMSG7, p.font->bbx.height, p.maxas + p.maxds);
- _bdf_add_acmsg(p.font, msgbuf, ft_strlen(msgbuf));
- }
- p.font->bbx.height = p.maxas + p.maxds;
+ if ( p.font->bbx.x_offset != p.minlb )
+ {
+ FT_TRACE2(( "bdf_load_font: " ACMSG4,
+ p.font->bbx.x_offset, p.minlb ));
+ p.font->bbx.x_offset = p.minlb;
+ p.font->modified = 1;
+ }
- if (p.flags & _BDF_SWIDTH_ADJ)
- _bdf_add_acmsg(p.font, ACMSG8, ft_strlen(ACMSG8));
+ if ( p.font->bbx.ascent != p.maxas )
+ {
+ FT_TRACE2(( "bdf_load_font: " ACMSG5,
+ p.font->bbx.ascent, p.maxas ));
+ p.font->bbx.ascent = p.maxas;
+ p.font->modified = 1;
}
- }
- /*
- * Last, if an error happened during loading, handle the messages.
- */
- if (n < 0 && callback != 0) {
- /*
- * An error was returned. Alert the client.
- */
- p.cb.reason = BDF_ERROR;
- p.cb.errlineno = lineno;
- (*callback)(&p.cb, data);
- } else if (p.flags & _BDF_START) {
- if (p.font != 0) {
- /*
- * The ENDFONT field was never reached or did not exist.
- */
- if (!(p.flags & _BDF_GLYPHS))
- /*
- * Error happened while parsing header.
- */
- sprintf(msgbuf, ERRMSG2, lineno);
- else
- /*
- * Error happened when parsing glyphs.
- */
- sprintf(msgbuf, ERRMSG3, lineno);
-
- _bdf_add_acmsg(p.font, msgbuf, ft_strlen(msgbuf));
+ if ( p.font->bbx.descent != p.maxds )
+ {
+ FT_TRACE2(( "bdf_load_font: " ACMSG6,
+ p.font->bbx.descent, p.maxds ));
+ p.font->bbx.descent = p.maxds;
+ p.font->bbx.y_offset = -p.maxds;
+ p.font->modified = 1;
}
- if (callback != 0) {
- p.cb.reason = BDF_ERROR;
- p.cb.errlineno = lineno;
- (*callback)(&p.cb, data);
+ if ( p.maxas + p.maxds != p.font->bbx.height )
+ {
+ FT_TRACE2(( "bdf_load_font: " ACMSG7,
+ p.font->bbx.height, p.maxas + p.maxds ));
+ p.font->bbx.height = p.maxas + p.maxds;
}
- } else if (callback != 0) {
- /*
- * This forces the progress bar to always finish.
- */
- p.cb.current = p.cb.total;
- (*p.callback)(&p.cb, p.client_data);
+
+ if ( p.flags & _BDF_SWIDTH_ADJ )
+ FT_TRACE2(( "bdf_load_font: " ACMSG8 ));
+ }
}
- /*
- * Free up the list used during the parsing.
- */
- if (p.list.size > 0)
- FT_FREE( p.list.field );
+ if ( p.flags & _BDF_START )
+ {
+ {
+ /* The ENDFONT field was never reached or did not exist. */
+ if ( !( p.flags & _BDF_GLYPHS ) )
+ /* Error happened while parsing header. */
+ FT_ERROR(( "bdf_load_font: " ERRMSG2, lineno ));
+ else
+ /* Error happened when parsing glyphs. */
+ FT_ERROR(( "bdf_load_font: " ERRMSG3, lineno ));
+ }
+ }
- if (p.font != 0) {
- /*
- * Make sure the comments are NULL terminated if they exist.
- */
- memory = p.font->memory;
+ /* Free up the list used during the parsing. */
+ FT_FREE( p.list.field );
- if (p.font->comments_len > 0) {
- if ( FT_REALLOC ( p.font->comments , p.font->comments_len ,
- p.font->comments_len + 1 ) )
- return 0;
- p.font->comments[p.font->comments_len] = 0;
- }
+ if ( p.font != 0 )
+ {
+ /* Make sure the comments are NULL terminated if they exist. */
+ memory = p.font->memory;
- /*
- * Make sure the auto-correct messages are NULL terminated if they
- * exist.
- */
- if (p.font->acmsgs_len > 0) {
- memory = p.font->memory;
+ if ( p.font->comments_len > 0 ) {
+ if ( FT_RENEW_ARRAY( p.font->comments,
+ p.font->comments_len,
+ p.font->comments_len + 1 ) )
+ goto Exit;
- if ( FT_REALLOC ( p.font->acmsgs , p.font->acmsgs_len ,
- p.font->acmsgs_len + 1 ) )
- return 0;
- p.font->acmsgs[p.font->acmsgs_len] = 0;
- }
+ p.font->comments[p.font->comments_len] = 0;
+ }
}
- return p.font;
-}
+ *font = p.font;
+ Exit:
+ return error;
+ }
-FT_LOCAL_DEF( void )
-bdf_free_font( bdf_font_t *font )
-{
- bdf_property_t *prop;
- unsigned long i;
- bdf_glyph_t *glyphs;
- FT_Memory memory;
- if (font == 0)
- return;
+ FT_LOCAL_DEF( void )
+ bdf_free_font( bdf_font_t* font )
+ {
+ bdf_property_t* prop;
+ unsigned long i;
+ bdf_glyph_t* glyphs;
+ FT_Memory memory;
+
+ if ( font == 0 )
+ return;
+
memory = font->memory;
- if (font->name != 0)
- FT_FREE(font->name);
+ FT_FREE( font->name );
- /*
- * Free up the internal hash table of property names.
- */
- if (font->internal) {
- hash_free((hashtable *) font->internal, memory);
- FT_FREE(font->internal);
+ /* Free up the internal hash table of property names. */
+ if ( font->internal )
+ {
+ hash_free( (hashtable *)font->internal, memory );
+ FT_FREE( font->internal );
}
- /*
- * Free up the comment info.
- */
- if (font->comments_len > 0)
- FT_FREE(font->comments);
- /*
- * Free up the auto-correction messages.
- */
- if (font->acmsgs_len > 0)
- FT_FREE(font->acmsgs);
+ /* Free up the comment info. */
+ FT_FREE( font->comments );
- /*
- * Free up the properties.
- */
- for (i = 0; i < font->props_size; i++) {
- if (font->props[i].format == BDF_ATOM && font->props[i].value.atom)
- FT_FREE(font->props[i].value.atom);
+ /* Free up the properties. */
+ for ( i = 0; i < font->props_size; i++ )
+ {
+ if ( font->props[i].format == BDF_ATOM )
+ FT_FREE( font->props[i].value.atom );
}
- if (font->props_size > 0 && font->props != 0)
- FT_FREE(font->props);
+ FT_FREE( font->props );
- /*
- * Free up the character info.
- */
- for (i = 0, glyphs = font->glyphs; i < font->glyphs_used; i++, glyphs++) {
- if (glyphs->name)
- FT_FREE(glyphs->name);
- if (glyphs->bytes > 0 && glyphs->bitmap != 0)
- FT_FREE(glyphs->bitmap);
+ /* Free up the character info. */
+ for ( i = 0, glyphs = font->glyphs;
+ i < font->glyphs_used; i++, glyphs++ )
+ {
+ FT_FREE( glyphs->name );
+ FT_FREE( glyphs->bitmap );
}
- for (i = 0, glyphs = font->unencoded; i < font->unencoded_used;
- i++, glyphs++) {
- if (glyphs->name)
- FT_FREE(glyphs->name);
- if (glyphs->bytes > 0)
- FT_FREE(glyphs->bitmap);
+ for ( i = 0, glyphs = font->unencoded; i < font->unencoded_used;
+ i++, glyphs++ )
+ {
+ FT_FREE( glyphs->name );
+ FT_FREE( glyphs->bitmap );
}
- if (font->glyphs_size > 0)
- FT_FREE( font->glyphs);
+ FT_FREE( font->glyphs );
+ FT_FREE( font->unencoded );
- if (font->unencoded_size > 0)
- FT_FREE( font->unencoded);
-
- /*
- * Free up the overflow storage if it was used.
- */
- for (i = 0, glyphs = font->overflow.glyphs; i < font->overflow.glyphs_used;
- i++, glyphs++) {
- if (glyphs->name != 0)
- FT_FREE(glyphs->name);
- if (glyphs->bytes > 0)
- FT_FREE( glyphs->bitmap);;
+ /* Free up the overflow storage if it was used. */
+ for ( i = 0, glyphs = font->overflow.glyphs;
+ i < font->overflow.glyphs_used; i++, glyphs++ )
+ {
+ FT_FREE( glyphs->name );
+ FT_FREE( glyphs->bitmap );
}
- if (font->overflow.glyphs_size > 0)
- FT_FREE(font->overflow.glyphs);
+ FT_FREE( font->overflow.glyphs );
+
/* bdf_cleanup */
- hash_free(&(font->proptbl),memory);
+ hash_free( &(font->proptbl), memory );
- /*
- * Free up the user defined properties.
- */
- for (prop = font->user_props, i = 0; i < font->nuser_props; i++, prop++) {
- FT_FREE(prop->name);
- if (prop->format == BDF_ATOM && prop->value.atom != 0)
- FT_FREE(prop->value.atom);
+ /* Free up the user defined properties. */
+ for (prop = font->user_props, i = 0;
+ i < font->nuser_props; i++, prop++ )
+ {
+ FT_FREE( prop->name );
+ if ( prop->format == BDF_ATOM )
+ FT_FREE( prop->value.atom );
}
- if (font->nuser_props > 0)
- FT_FREE(font->user_props);
- /*FREE( font);*/ /* XXX Fixme */
-}
+ FT_FREE( font->user_props );
+ /* FREE( font ); */ /* XXX Fixme */
+ }
-FT_LOCAL_DEF( bdf_property_t* )
-bdf_get_font_property( bdf_font_t* font,
- char* name)
-{
- hashnode hn;
+ FT_LOCAL_DEF( bdf_property_t * )
+ bdf_get_font_property( bdf_font_t* font,
+ char* name )
+ {
+ hashnode hn;
- if (font == 0 || font->props_size == 0 || name == 0 || *name == 0)
+
+ if ( font == 0 || font->props_size == 0 || name == 0 || *name == 0 )
return 0;
- hn = hash_lookup(name, (hashtable *) font->internal);
- return (hn) ? (font->props + ((unsigned long) hn->data)) : 0;
-}
+ hn = hash_lookup( name, (hashtable *)font->internal );
+
+ return hn ? ( font->props + (unsigned long)hn->data ) : 0;
+ }
+
+
+/* END */
--- a/src/bdf/module.mk
+++ b/src/bdf/module.mk
@@ -2,7 +2,7 @@
# FreeType 2 BDF module definition
#
-# Copyright 2001 by
+# Copyright 2001, 2002 by
# Francesco Zappa Nardelli
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
--- a/src/bdf/rules.mk
+++ b/src/bdf/rules.mk
@@ -3,7 +3,7 @@
#
-# Copyright (C) 2001 by
+# Copyright (C) 2001, 2002 by
# Francesco Zappa Nardelli
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -38,14 +38,13 @@
# bdf driver sources (i.e., C files)
#
-BDF_DRV_SRC := $(BDF_DIR_)bdflib.c $(BDF_DIR_)bdfdriver.c
+BDF_DRV_SRC := $(BDF_DIR_)bdflib.c $(BDF_DIR_)bdfdrivr.c
# bdf driver headers
#
-#BDF_DRV_H := $(BDF_DRV_SRC:%.c=%.h)
BDF_DRV_H := $(BDF_DIR_)bdf.h \
- $(BDF_DIR_)bdfdriver.h
+ $(BDF_DIR_)bdfdrivr.h
# bdf driver object(s)
#
--- a/src/cache/ftcsbits.c
+++ b/src/cache/ftcsbits.c
@@ -213,16 +213,23 @@
CHECK_CHAR( xadvance ) &&
CHECK_CHAR( yadvance ) )
{
- sbit->width = (FT_Byte)bitmap->width;
- sbit->height = (FT_Byte)bitmap->rows;
- sbit->pitch = (FT_Char)bitmap->pitch;
- sbit->left = (FT_Char)slot->bitmap_left;
- sbit->top = (FT_Char)slot->bitmap_top;
- sbit->xadvance = (FT_Char)xadvance;
- sbit->yadvance = (FT_Char)yadvance;
- sbit->format = (FT_Byte)bitmap->pixel_mode;
+ sbit->width = (FT_Byte)bitmap->width;
+ sbit->height = (FT_Byte)bitmap->rows;
+ sbit->pitch = (FT_Char)bitmap->pitch;
+ sbit->left = (FT_Char)slot->bitmap_left;
+ sbit->top = (FT_Char)slot->bitmap_top;
+ sbit->xadvance = (FT_Char)xadvance;
+ sbit->yadvance = (FT_Char)yadvance;
+ sbit->format = (FT_Byte)bitmap->pixel_mode;
+ /* XXX: Fixme: We don't handle the number of gray levels */
+ /* consistently -- we say num_grays == 1 for */
+ /* monochrome but num_grays == 256 for gray. It */
+ /* would be better to make this variable hold the */
+ /* highest possible value so that it fits into */
+ /* a single byte. */
+ sbit->num_grays = bitmap->num_grays;
- /* grab the bitmap when possible - this is a hack !! */
+ /* grab the bitmap when possible - this is a hack! */
if ( slot->flags & FT_GLYPH_OWN_BITMAP )
{
slot->flags &= ~FT_GLYPH_OWN_BITMAP;
--- a/src/type42/t42drivr.c
+++ b/src/type42/t42drivr.c
@@ -32,70 +32,23 @@
#include FT_INTERNAL_DRIVER_H
#include FT_INTERNAL_OBJECTS_H
#include FT_INTERNAL_TYPE1_TYPES_H
+#include FT_INTERNAL_TYPE42_TYPES_H
#include FT_INTERNAL_POSTSCRIPT_AUX_H
#include FT_INTERNAL_STREAM_H
- /********************* Data Definitions ******************/
+ /*************************************************************************/
+ /* */
+ /* The macro FT_COMPONENT is used in trace mode. It is an implicit */
+ /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */
+ /* messages during execution. */
+ /* */
+#undef FT_COMPONENT
+#define FT_COMPONENT trace_t42
- typedef enum T42_EncodingType_
- {
- T42_ENCODING_TYPE_NONE = 0,
- T42_ENCODING_TYPE_ARRAY,
- T42_ENCODING_TYPE_STANDARD,
- T42_ENCODING_TYPE_EXPERT,
- T42_ENCODING_TYPE_ISOLATIN1
-
- } T42_EncodingType;
+ /********************* Data Definitions ******************/
- typedef struct T42_Font_
- {
- /* font info dictionary */
- PS_FontInfoRec font_info;
-
- /* top-level dictionary */
- FT_String* font_name;
-
- T42_EncodingType encoding_type;
- T1_EncodingRec encoding;
-
- FT_Byte* charstrings_block;
- FT_Byte* glyph_names_block;
-
- FT_Int num_glyphs;
- FT_String** glyph_names; /* array of glyph names */
- FT_Byte** charstrings; /* array of glyph charstrings */
- FT_Int* charstrings_len;
-
- FT_Byte paint_type;
- FT_Byte font_type;
- FT_Matrix font_matrix; /* From FontMatrix field: a, b, c, d */
- FT_Vector font_offset; /* From FontMatrix field: tx, ty */
- FT_BBox font_bbox;
-
- FT_Int stroke_width;
-
- } T42_FontRec, *T42_Font;
-
-
- typedef struct T42_FaceRec_
- {
- FT_FaceRec root;
- T42_FontRec type42;
- void* psnames;
- void* psaux;
- void* afm_data;
- FT_Byte* ttf_data;
- FT_ULong ttf_size;
- FT_Face ttf_face;
- FT_CharMapRec charmaprecs[2];
- FT_CharMap charmaps[2];
- PS_Unicodes unicode_map;
-
- } T42_FaceRec, *T42_Face;
-
-
typedef struct T42_DriverRec_
{
FT_DriverRec root;
@@ -431,11 +384,6 @@
FT_Fixed temp_scale;
- /* XXX: Are these three lines necessary */
- if ( matrix->xx || matrix->yx )
- /* with synthetic fonts, it's possible we get here twice */
- return;
-
(void)T1_ToFixedArray( parser, 6, temp, 3 );
temp_scale = ABS( temp[3] );
@@ -604,7 +552,7 @@
cur++;
}
- face->type42.encoding_type = T42_ENCODING_TYPE_ARRAY;
+ face->type42.encoding_type = T1_ENCODING_TYPE_ARRAY;
parser->root.cursor = cur;
}
/* Otherwise, we should have either `StandardEncoding', */
@@ -613,15 +561,15 @@
{
if ( cur + 17 < limit &&
ft_strncmp( (const char*)cur, "StandardEncoding", 16 ) == 0 )
- face->type42.encoding_type = T42_ENCODING_TYPE_STANDARD;
+ face->type42.encoding_type = T1_ENCODING_TYPE_STANDARD;
else if ( cur + 15 < limit &&
ft_strncmp( (const char*)cur, "ExpertEncoding", 14 ) == 0 )
- face->type42.encoding_type = T42_ENCODING_TYPE_EXPERT;
+ face->type42.encoding_type = T1_ENCODING_TYPE_EXPERT;
else if ( cur + 18 < limit &&
ft_strncmp( (const char*)cur, "ISOLatin1Encoding", 17 ) == 0 )
- face->type42.encoding_type = T42_ENCODING_TYPE_ISOLATIN1;
+ face->type42.encoding_type = T1_ENCODING_TYPE_ISOLATIN1;
else {
FT_ERROR(( "parse_encoding: invalid token!\n" ));
@@ -654,10 +602,10 @@
FT_Byte* cur = parser->root.cursor;
FT_Byte* limit = parser->root.limit;
FT_Error error;
- FT_Int num_tables, status;
- FT_ULong count, ttf_size, string_size;
+ FT_Int num_tables = 0, status;
+ FT_ULong count, ttf_size = 0, string_size = 0;
FT_Bool in_string = 0;
- FT_Byte v;
+ FT_Byte v = 0;
/* The format is `/sfnts [ <...> <...> ... ] def' */
@@ -1151,7 +1099,7 @@
loader.glyph_names.elements = 0;
/* we must now build type42.encoding when we have a custom array */
- if ( type42->encoding_type == T42_ENCODING_TYPE_ARRAY )
+ if ( type42->encoding_type == T1_ENCODING_TYPE_ARRAY )
{
FT_Int charcode, idx, min_char, max_char;
FT_Byte* char_name;
@@ -1416,22 +1364,22 @@
switch ( face->type42.encoding_type )
{
- case T42_ENCODING_TYPE_STANDARD:
+ case T1_ENCODING_TYPE_STANDARD:
charmap->encoding = ft_encoding_adobe_standard;
charmap->encoding_id = 0;
break;
- case T42_ENCODING_TYPE_EXPERT:
+ case T1_ENCODING_TYPE_EXPERT:
charmap->encoding = ft_encoding_adobe_expert;
charmap->encoding_id = 1;
break;
- case T42_ENCODING_TYPE_ARRAY:
+ case T1_ENCODING_TYPE_ARRAY:
charmap->encoding = ft_encoding_adobe_custom;
charmap->encoding_id = 2;
break;
- case T42_ENCODING_TYPE_ISOLATIN1:
+ case T1_ENCODING_TYPE_ISOLATIN1:
charmap->encoding = ft_encoding_latin_1;
charmap->encoding_id = 3;
break;
@@ -1540,12 +1488,6 @@
ttmodule = FT_Get_Module( driver->root.root.library, "truetype" );
driver->ttclazz = (FT_Driver_Class)ttmodule->clazz;
- /* XXX: What about hinter support? */
-#if 0
- if (ttmodule->clazz->module_flags & ft_module_driver_has_hinter)
- driver->root.clazz->root.module_flags |= ft_module_driver_has_hinter;
-#endif
-
return T42_Err_Ok;
}
@@ -2063,7 +2005,11 @@
{
ft_module_font_driver |
ft_module_driver_scalable |
+#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
ft_module_driver_has_hinter,
+#else
+ 0,
+#endif
sizeof ( T42_DriverRec ),