summaryrefslogtreecommitdiff
path: root/Build/source/libs/freetype/freetype-1.5/lib/extend/ftxsbit.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/freetype/freetype-1.5/lib/extend/ftxsbit.c')
-rw-r--r--Build/source/libs/freetype/freetype-1.5/lib/extend/ftxsbit.c1393
1 files changed, 0 insertions, 1393 deletions
diff --git a/Build/source/libs/freetype/freetype-1.5/lib/extend/ftxsbit.c b/Build/source/libs/freetype/freetype-1.5/lib/extend/ftxsbit.c
deleted file mode 100644
index d692f7fd51c..00000000000
--- a/Build/source/libs/freetype/freetype-1.5/lib/extend/ftxsbit.c
+++ /dev/null
@@ -1,1393 +0,0 @@
-/*******************************************************************
- *
- * ftxsbit.c
- *
- * Embedded bitmap API extension
- *
- * Copyright 1996-2001 by
- * David Turner, Robert Wilhelm, and Werner Lemberg.
- *
- * 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.
- *
- *
- * This extension is used to load the embedded bitmaps present
- * in certain TrueType files.
- *
- ******************************************************************/
-
-#include "ftxsbit.h"
-#include "ttobjs.h"
-#include "ttfile.h"
-#include "ttload.h"
-#include "ttmemory.h"
-#include "tttags.h"
-#include "ttextend.h"
-#include "ttdebug.h"
-
-
-#define SBIT_ID Build_Extension_ID( 's', 'b', 'i', 't' )
-
-
-/* Required by the tracing mode */
-#undef TT_COMPONENT
-#define TT_COMPONENT trace_bitmap
-
-/* In all functions, the stream is taken from the 'face' object */
-#define DEFINE_LOCALS DEFINE_LOAD_LOCALS( face->stream )
-#define DEFINE_LOCALS_WO_FRAME DEFINE_LOAD_LOCALS_WO_FRAME( face->stream )
-
-
-/***************************
- *
- * miscellaneous functions
- *
- ***************************/
-
-/*******************************************************************
- *
- * Function: Load_BitmapData
- *
- * Bit-aligned bitmap data -> Byte-aligned bitmap data when pad is 0
- *
- ******************************************************************/
-
- static TT_Error
- Load_BitmapData( TT_SBit_Image* image,
- Int image_size,
- Byte x_offset,
- Byte y_offset,
- UShort source_width,
- UShort source_height,
- Bool byte_padded,
- PFace face )
- {
- DEFINE_LOCALS;
-
- Int count; /* number of bits left in rows */
- Int loaded; /* number of bits loaded in the accumulator */
- UShort buff; /* accumulator */
-
- PByte line; /* target write cursor */
- PByte limit;
-
-
- if ( ( y_offset + source_height > image->map.rows ) ||
- ( x_offset + source_width > image->map.width ) )
- return TT_Err_Invalid_Argument;
-
- if ( ACCESS_Frame( image_size ) )
- return error;
-
- buff = 0;
- loaded = 0;
- line = (PByte)image->map.bitmap +
- y_offset * image->map.cols;
- limit = (PByte)image->map.bitmap +
- ( y_offset + source_height ) * image->map.cols;
-
- for ( ; line < limit; line += image->map.cols )
- {
- PByte ptr;
-
-
- ptr = line + x_offset / 8;
- count = source_width;
-
- /* We may assume that `loaded' is less than 8 */
- buff >>= x_offset % 8;
- loaded += x_offset % 8;
-
- /* first of all, read all consecutive bytes */
- while ( count >= 8 )
- {
- if ( loaded < 8 )
- {
- buff |= ((UShort)GET_Byte()) << (8 - loaded);
- loaded += 8;
- }
-
- *ptr++ |= (Byte)(buff >> 8);
- buff <<= 8;
- loaded -= 8;
- count -= 8;
- }
-
- /* now write remaining bits (i.e. end of line with count < 8) */
- if ( count > 0 )
- {
- if ( loaded < count )
- {
- buff |= ((UShort)GET_Byte()) << (8 - loaded);
- loaded += 8;
- }
-
- *ptr |= ((Byte)(buff >> 8)) & ~(0xFF >> count);
- buff <<= count;
- loaded -= count;
- }
-
- if ( byte_padded )
- {
- buff = 0;
- loaded = 0;
- }
- }
-
- FORGET_Frame();
- return TT_Err_Ok;
- }
-
-
-/*******************************************************************
- *
- * Function: Crop_Bitmap
- *
- ******************************************************************/
-
- static void Crop_Bitmap( TT_SBit_Image* image )
- {
- /*******************************************************/
- /* In the following situation, some bounding boxes of */
- /* embedded bitmaps are too large. We need to crop it */
- /* to a reasonable size. */
- /* */
- /* --------- */
- /* | | ----- */
- /* | *** | |***| */
- /* | * | -----> | * | */
- /* | * | | * | */
- /* | * | | * | */
- /* | * | | * | */
- /* | *** | |***| */
- /* --------- ----- */
- /* */
- /*******************************************************/
-
- Int rows, count;
- Long line_len;
- PByte line;
-
-
- /********************************************************************/
- /* */
- /* first of all, check the top-most lines of the bitmap and remove */
- /* them if they're empty. */
- /* */
- {
- line = (PByte)image->map.bitmap;
- rows = image->map.rows;
- line_len = image->map.cols;
-
- for ( count = 0; count < rows; count++ )
- {
- PByte cur = line;
- PByte limit = line + line_len;
-
-
- for ( ; cur < limit; cur++ )
- if ( cur[0] )
- goto Found_Top;
-
- /* the current line was empty -- skip to next one */
- line = limit;
- }
-
- Found_Top:
- /* check that we have at least one filled line */
- if ( count >= rows )
- goto Empty_Bitmap;
-
- /* now, crop the empty upper lines */
- if ( count > 0 )
- {
- line = (PByte)image->map.bitmap;
-
- MEM_Move( line, line + count*line_len, (rows-count) * line_len );
-
- image->metrics.bbox.yMax -= count;
- image->metrics.vertBearingY -= count;
- image->metrics.horiBearingY -= count;
- image->map.rows -= count;
- rows -= count;
- }
- }
-
- /*******************************************************************/
- /* */
- /* second, crop the lower lines */
- /* */
- {
- line = (PByte)image->map.bitmap + (rows-1) * line_len;
-
- for ( count = 0; count < rows; count++ )
- {
- PByte cur = line;
- PByte limit = line + line_len;
-
-
- for ( ; cur < limit; cur++ )
- if ( cur[0] )
- goto Found_Bottom;
-
- /* the current line was empty -- skip to previous one */
- line -= line_len;
- }
-
- Found_Bottom:
- if ( count > 0 )
- {
- image->metrics.bbox.yMin += count;
- image->map.rows -= count;
- rows -= count;
- }
- }
-
- /*******************************************************************/
- /* */
- /* third, get rid of the space on the left side of the glyph */
- /* */
- do
- {
- PByte limit;
-
-
- line = (PByte)image->map.bitmap;
- limit = line + rows * line_len;
-
- for ( ; line < limit; line += line_len )
- if ( line[0] & 0x80 )
- goto Found_Left;
-
- /* shift the whole glyph one pixel to the left */
- line = (PByte)image->map.bitmap;
- limit = line + rows * line_len;
-
- for ( ; line < limit; line += line_len )
- {
- Int n, width = image->map.width;
- Byte old;
- PByte cur = line;
-
-
- old = cur[0] << 1;
-
- for ( n = 8; n < width; n += 8 )
- {
- Byte val;
-
-
- val = cur[1];
- cur[0] = old | (val >> 7);
- old = val << 1;
- cur++;
- }
- cur[0] = old;
- }
-
- image->map.width--;
- image->metrics.horiBearingX++;
- image->metrics.vertBearingX++;
- image->metrics.bbox.xMin++;
-
- } while ( image->map.width > 0 );
-
- Found_Left:
-
- /*********************************************************************/
- /* */
- /* finally, crop the bitmap width to get rid of the space on the */
- /* right side of the glyph. */
- /* */
- do
- {
- Int right = image->map.width-1;
- PByte limit;
- Byte mask;
-
-
- line = (PByte)image->map.bitmap + (right >> 3);
- limit = line + rows*line_len;
- mask = 0x80 >> (right & 7);
-
- for ( ; line < limit; line += line_len )
- if ( line[0] & mask )
- goto Found_Right;
-
- /* crop the whole glyph on the right */
- image->map.width--;
- image->metrics.bbox.xMax--;
-
- } while ( image->map.width > 0 );
-
- Found_Right:
- /* all right, the bitmap was cropped */
- return;
-
- Empty_Bitmap:
- image->map.width = 0;
- image->map.rows = 0;
- image->map.cols = 0;
- image->map.size = 0;
- }
-
-/*************
- *
- * Main body
- *
- *************/
-
-
- static TT_Error
- Load_Range_Codes( TT_SBit_Range* range,
- PFace face,
- Bool load_offsets )
- {
- DEFINE_LOCALS;
-
- ULong count, n, size;
-
-
- (void)face;
-
- /* read glyph count */
- if ( ACCESS_Frame( 4L ) )
- goto Exit;
- count = GET_ULong();
- FORGET_Frame();
-
- range->num_glyphs = count;
-
- /* Allocate glyph offsets table if needed */
- if ( load_offsets )
- {
- if ( ALLOC_ARRAY( range->glyph_offsets, count, ULong ) )
- goto Exit;
-
- size = count * 4L;
- }
- else
- size = count * 2L;
-
- /* Allocate glyph codes table and access frame */
- if ( ALLOC_ARRAY ( range->glyph_codes, count, UShort ) ||
- ACCESS_Frame( size ) )
- goto Exit;
-
- for ( n = 0; n < count; n++ )
- {
- range->glyph_codes[n] = GET_UShort();
-
- if ( load_offsets )
- range->glyph_offsets[n] = (ULong)range->image_offset + GET_UShort();
- }
-
- FORGET_Frame();
-
- Exit:
- return error;
- }
-
-
- static TT_Error
- Load_SBit_Range( TT_SBit_Strike* strike,
- TT_SBit_Range* range,
- PFace face )
- {
- DEFINE_LOCALS;
-
- UShort format;
-
-
- (void)face;
- (void)strike;
-
- format = range->index_format;
- PTRACE6(( "Index Format: %d\n", format ));
-
- switch( format )
- {
- case 1: /* variable metrics with 4-byte offsets */
- case 3: /* variable metrics with 2-byte offsets */
- {
- UShort num_glyphs, size_elem;
- Bool large = (format == 1);
- ULong* cur;
-
- num_glyphs = range->last_glyph - range->first_glyph + 1;
- PTRACE5(( " num glyphs: %hu\n", num_glyphs ));
-
- range->num_glyphs = num_glyphs;
-
- num_glyphs++; /* BEWARE */
-
- size_elem = large ? 4 : 2;
-
- if ( ALLOC_ARRAY( range->glyph_offsets, num_glyphs, ULong ) ||
- ACCESS_Frame( num_glyphs * size_elem ) )
- return error;
-
- cur = range->glyph_offsets;
-
- while ( num_glyphs > 0 )
- {
- cur[0] = (TT_ULong)( range->image_offset +
- (large ? GET_ULong() : GET_UShort()) );
- PTRACE7(( " offset: %d\n", cur[0] ));
- cur++;
- num_glyphs--;
- }
-
- FORGET_Frame();
- }
- break;
-
- case 2: /* all glyphs have identical metrics */
- case 4:
- case 5:
- {
- error = 0;
-
- if ( format != 4 ) /* read constant metrics, formats 2 and 5 */
- {
- TT_SBit_Metrics* metrics;
-
-
- if ( ACCESS_Frame( 12L ) )
- return error;
-
- range->image_size = GET_ULong();
- metrics = &range->metrics;
-
- metrics->height = GET_Byte();
- metrics->width = GET_Byte();
-
- metrics->horiBearingX = GET_Char();
- metrics->horiBearingY = GET_Char();
- metrics->horiAdvance = GET_Byte();
-
- metrics->vertBearingX = GET_Char();
- metrics->vertBearingY = GET_Char();
- metrics->vertAdvance = GET_Byte();
-
- FORGET_Frame();
- }
-
- if ( format != 2 ) /* load range codes, formats 4 and 5 */
- error = Load_Range_Codes( range, face, (format == 4) );
- }
- break;
-
- default:
- error = TT_Err_Invalid_File_Format;
- }
-
- PTRACE3(( "Embedded Bitmap Location Tables loaded.\n" ));
-
- return error;
- }
-
-
-/*******************************************************************
- *
- * Function : Load_TrueType_Eblc
- *
- * Description : Loads the Eblc table directory into face table.
- *
- * Input : face face record to look for
- *
- * Output : Error code.
- *
- ******************************************************************/
-
- static TT_Error
- Load_TrueType_Eblc( PFace face,
- TT_EBLC* eblc )
- {
- DEFINE_LOCALS;
-
- ULong eblc_offset;
- UInt i;
- Long table;
-
- TT_SBit_Strike* strike;
-
-
- PTRACE2(( "Load_EBLC_Table( %08lx )\n", (long)face ));
-
- eblc->version = 0;
-
- /* Try to find the `EBLC' or `bloc' table in the font files. */
- /* Both tags describe the same table; `EBLC' is for OpenType */
- /* fonts while `bloc' is for TrueType GX fonts. Many fonts */
- /* contain both tags pointing to the same table. */
-
- table = TT_LookUp_Table( face, TTAG_EBLC );
- if ( table < 0 )
- table = TT_LookUp_Table( face, TTAG_bloc );
-
- if ( table < 0 )
- /* This table is optional */
- return TT_Err_Ok;
-
- eblc_offset = face->dirTables[table].Offset;
-
- if ( FILE_Seek( eblc_offset ) ||
- ACCESS_Frame( 8L ) )
- return error;
-
- eblc->version = GET_ULong();
- eblc->num_strikes = GET_ULong();
-
- FORGET_Frame();
-
- PTRACE2(( "-- Tables count: %12u\n", eblc->num_strikes ));
- PTRACE2(( "-- Format version: %08lx\n", eblc->version ));
-
- if ( eblc->version != 0x00020000 )
- {
- PERROR(( "Invalid file format!\n" ));
- return TT_Err_Invalid_File_Format;
- }
-
- if ( ALLOC_ARRAY( eblc->strikes, eblc->num_strikes, TT_SBit_Strike ) ||
- ACCESS_Frame( 48L * eblc->num_strikes ) )
- return error;
-
- strike = eblc->strikes;
-
- for ( i = 0; i < (UInt)eblc->num_strikes; i++, strike++ )
- { /* loop through the tables and get all entries */
- ULong indexTablesSize;
- TT_SBit_Line_Metrics* metrics;
- Int count;
-
-
- strike->ranges_offset = GET_ULong();
- indexTablesSize = GET_ULong(); /* dont' save */
-
- strike->num_ranges = GET_ULong();
- strike->color_ref = GET_ULong();
-
- /* load horizontal and vertical metrics */
- metrics = &strike->hori;
- for ( count = 2; count > 0; count-- )
- {
- metrics->ascender = GET_Char();
- metrics->descender = GET_Char();
- metrics->max_width = GET_Byte();
-
- metrics->caret_slope_numerator = GET_Char();
- metrics->caret_slope_denominator = GET_Char();
- metrics->caret_offset = GET_Char();
-
- metrics->min_origin_SB = GET_Char();
- metrics->min_advance_SB = GET_Char();
- metrics->max_before_BL = GET_Char();
- metrics->min_after_BL = GET_Char();
- metrics->pads[0] = GET_Char();
- metrics->pads[1] = GET_Char();
-
- metrics = &strike->vert;
- }
-
- strike->start_glyph = GET_UShort();
- strike->end_glyph = GET_UShort();
- strike->x_ppem = GET_Byte();
- strike->y_ppem = GET_Byte();
- strike->bit_depth = GET_Byte();
- strike->flags = GET_Char();
-
- PTRACE4(( " start - end - ppemX - ppemY\n" ));
- PTRACE4(( " %04d - %04d - %3u - %3u\n",
- strike->start_glyph,
- strike->end_glyph,
- strike->x_ppem,
- strike->y_ppem ));
- }
-
- FORGET_Frame();
-
- /* Load EBLC index ranges */
- strike = eblc->strikes;
-
- for ( i = 0; i < eblc->num_strikes; i++, strike++ )
- {
- TT_SBit_Range* range;
- UShort count = strike->num_ranges;
-
-
- /* loop through the tables and get all entries */
- if ( ALLOC_ARRAY( strike->sbit_ranges,
- strike->num_ranges,
- TT_SBit_Range ) ||
- FILE_Seek( eblc_offset + strike->ranges_offset ) ||
- ACCESS_Frame( strike->num_ranges * 8L ) )
- return error;
-
- for ( range = strike->sbit_ranges; count > 0; count--, range++ )
- {
- range->first_glyph = GET_UShort();
- range->last_glyph = GET_UShort();
- range->table_offset = eblc_offset + strike->ranges_offset +
- GET_ULong();
- }
- FORGET_Frame();
-
- /* Now, read each index table */
- range = strike->sbit_ranges;
- for ( count = strike->num_ranges; count > 0; count--, range++ )
- {
- /* Read the header */
- if ( FILE_Seek( range->table_offset ) ||
- ACCESS_Frame( 8L ) )
- return error;;
-
- range->index_format = GET_UShort();
- range->image_format = GET_UShort();
- range->image_offset = GET_ULong();
-
- FORGET_Frame();
-
- error = Load_SBit_Range( strike, range, face );
- if (error) return error;
- }
- }
-
- return TT_Err_Ok;
- }
-
-
- static void Free_TrueType_Eblc( TT_EBLC* eblc )
- {
- if ( eblc )
- {
- ULong i;
- TT_SBit_Strike* strike = eblc->strikes;
-
-
- strike = eblc->strikes;
-
- for ( i = eblc->num_strikes; i > 0; i--, strike++ )
- {
- /* for each strike, release all glyph ranges */
- TT_SBit_Range* range = strike->sbit_ranges;
- Int n;
-
-
- for ( n = strike->num_ranges; n > 0; n--, range++ )
- {
- /* release a range */
- FREE( range->glyph_offsets );
- FREE( range->glyph_codes );
- }
- FREE( strike->sbit_ranges );
- strike->num_ranges = 0;
- }
- FREE( eblc->strikes );
- eblc->num_strikes = 0;
- eblc->version = 0;
- }
- }
-
-
- static TT_Error
- Load_SBit_Metrics( TT_Big_Glyph_Metrics* metrics,
- TT_SBit_Range* range,
- ULong ebdt_offset,
- PFace face )
- {
- DEFINE_LOCALS;
-
- Byte height, width;
-
-
- /* copy bitmap metrics for formats 2 and 5 */
- if ( ( ( range->index_format == 2 ) || ( range->index_format == 5 ) ) &&
- ( range->image_format == 5 ) )
- /* metrics are taken from current image bitmap */
- /* i.e. from `image.metrics' */
- {
- TT_SBit_Metrics* rmetrics = &range->metrics;
-
-
- metrics->bbox.xMin = rmetrics->horiBearingX;
- metrics->bbox.xMax = metrics->bbox.xMin + rmetrics->width;
-
- metrics->bbox.yMax = rmetrics->horiBearingY;
- metrics->bbox.yMin = metrics->bbox.yMax - rmetrics->height;
-
- metrics->horiBearingX = rmetrics->horiBearingX;
- metrics->horiBearingY = metrics->bbox.yMax;
- metrics->horiAdvance = rmetrics->horiAdvance;
-
- metrics->vertBearingX = rmetrics->vertBearingX;
- metrics->vertBearingY = rmetrics->vertBearingY;
- metrics->vertAdvance = rmetrics->vertAdvance;
-
- return TT_Err_Ok;
- }
-
- switch ( range->image_format )
- {
- case 1:
- case 2:
- case 6:
- case 7:
- case 8:
- case 9:
- {
- Long length = 5L;
-
-
- if ( range->image_format == 8 )
- length++;
-
- /* read the small metrics */
- if ( ACCESS_Frame( length ) )
- return error;
-
- height = GET_Byte();
- width = GET_Byte();
-
- metrics->horiBearingX = GET_Char();
- metrics->horiBearingY = GET_Char();
- metrics->horiAdvance = GET_Byte();
-
- FORGET_Frame();
-
- metrics->bbox.xMin = metrics->horiBearingX;
- metrics->bbox.yMax = metrics->horiBearingY;
- metrics->bbox.xMax = metrics->bbox.xMin + width;
- metrics->bbox.yMin = metrics->bbox.yMax - height;
-
- /* read the rest of the big metrics for the formats */
- /* that support it. */
- if ( ( range->image_format >= 6 ) && ( range->image_format != 8 ) )
- {
- if ( ACCESS_Frame( 3L ) )
- return error;
-
- metrics->vertBearingX = (Int)GET_Char();
- metrics->vertBearingY = (Int)GET_Char();
- metrics->vertAdvance = (Int)GET_Char();
-
- FORGET_Frame();
- }
- else
- {
- /* XXX: How can we fill these when the information isn't */
- /* available? */
- metrics->vertBearingX = 0;
- metrics->vertBearingY = 0;
- metrics->vertAdvance = 0;
- }
- }
- break;
-
- case 5: /* metrics are taken from current image bitmap */
- /* i.e. from 'image.metrics' */
- break;
-
- default:
- PERROR(( "Unsupported embedded bitmap format!\n" ));
- return TT_Err_Invalid_File_Format;
- }
-
- return TT_Err_Ok;
- }
-
-
- static TT_Error
- Load_SBit_Image( TT_SBit_Strike strike,
- UShort glyph_index,
- Byte x_offset,
- Byte y_offset,
- ULong ebdt_offset,
- TT_SBit_Image* image,
- UShort component_depth,
- PFace face )
- {
- DEFINE_LOCALS;
- Byte height, width;
-
- ULong bitmap_offset;
-
- TT_SBit_Range* range = 0;
-
- TT_Big_Glyph_Metrics metrics;
-
- /********************************************************************/
- /* */
- /* Scan the strike's range for the position/metrics of the source */
- /* glyph. */
- {
- UShort count = strike.num_ranges;
- TT_SBit_Range* cur = strike.sbit_ranges;
-
- for ( ; count > 0; count--, cur++ )
- {
- /* look for the glyph in the current range */
- switch ( cur->index_format )
- {
- case 1:
- case 2:
- case 3:
- if ( glyph_index >= cur->first_glyph &&
- glyph_index <= cur->last_glyph )
- {
- UShort delta = glyph_index - cur->first_glyph;
-
-
- range = cur;
- bitmap_offset = cur->index_format == 2
- ? cur->image_offset + cur->image_size * delta
- : cur->glyph_offsets[delta];
- goto Found;
- }
- break;
-
- case 4:
- case 5:
- {
- UShort n;
-
-
- for ( n = 0; (UInt)n < cur->num_glyphs; n++ )
- if ( cur->glyph_codes[n] == glyph_index )
- {
- range = cur;
- bitmap_offset = cur->index_format == 4
- ? cur->glyph_offsets[n]
- : cur->image_offset + cur->image_size * n;
- goto Found;
- }
- }
- break;
-
- default:
- return TT_Err_Invalid_Glyph_Index;
- }
- }
- /* Not found */
- return TT_Err_Invalid_Glyph_Index;
- }
-
- Found:
- if ( FILE_Seek( ebdt_offset + bitmap_offset ) )
- return error;
-
- /* First of all, load the metrics if needed */
- error = Load_SBit_Metrics( &metrics, range, ebdt_offset, face );
- if ( error )
- return error;
-
- width = metrics.bbox.xMax - metrics.bbox.xMin;
- height = metrics.bbox.yMax - metrics.bbox.yMin;
-
- if ( !component_depth )
- {
- image->metrics = metrics;
-
- image->map.width = width;
- image->map.rows = height;
-
- image->map.cols = (width + 7) >> 3;
- image->map.size = height * image->map.cols;
-
- if ( REALLOC( image->map.bitmap, image->map.size ) )
- return error;
-
- MEM_Set( image->map.bitmap, 0, image->map.size );
- }
-
- /* Now, load the data as needed */
- switch ( range->image_format )
- {
- case 1:
- case 6: /* byte-aligned data */
- error = Load_BitmapData( image,
- height * (( width + 7 ) >> 3),
- x_offset, y_offset,
- width, height,
- 1, face );
- if ( error )
- return error;
- break;
-
- case 2:
- case 5:
- case 7:
- error = Load_BitmapData( image,
- (width * height + 7) >> 3,
- x_offset, y_offset,
- width, height, 0, face );
- if ( error )
- return error;
- break;
-
- case 8:
- case 9:
- {
- /* Now, load composite sbit glyphs */
- /* This code is not sophisticated */
-
- TT_SBit_Component* component_array;
- UShort num_components;
-
- Int i = 0;
-
-
- if ( ACCESS_Frame( 2L ) )
- return error;
- num_components = GET_UShort();
- FORGET_Frame();
-
- MEM_Alloc( component_array,
- sizeof ( TT_SBit_Component ) * num_components );
-
- if ( ACCESS_Frame( 4L * num_components ) )
- return error;
-
- for ( i = 0; i < num_components; i++ )
- {
- component_array[i].glyph_code = GET_UShort();
- component_array[i].x_offset = GET_Char();
- component_array[i].y_offset = GET_Char();
- }
-
- FORGET_Frame();
-
- component_depth++;
-
- for ( i = 0; i < num_components; i++ )
- {
- error = Load_SBit_Image( strike, component_array[i].glyph_code,
- component_array[i].x_offset,
- component_array[i].y_offset,
- ebdt_offset,
- image,
- component_depth, face );
- if ( error )
- return error;
- }
- FREE( component_array );
- break;
-
- default:
- return TT_Err_Invalid_File_Format;
- }
- }
-
- return TT_Err_Ok;
- }
-
-
-/*******************************************************************
- *
- * Function: Load_TrueType_Ebdt
- *
- ******************************************************************/
-
- static TT_Error
- Load_TrueType_Ebdt( PFace face,
- TT_SBit_Strike strike,
- ULong glyph_index,
- TT_SBit_Image* image )
- {
- DEFINE_LOCALS;
-
- ULong ebdt_offset;
- ULong version;
- Long i;
-
-
- /* Try to find the `EBDT' or `bdat' table in the font files. */
- /* Both tags describe the same table, `EBDT' is for OpenType */
- /* fonts, while `bdat' is for TrueType GX fonts. Many fonts */
- /* contain both tags pointing to the same table */
-
- i = TT_LookUp_Table( face, TTAG_EBDT );
- if ( i < 0 )
- i = TT_LookUp_Table( face, TTAG_bdat );
-
- if ( i < 0 )
- return TT_Err_Table_Missing;
-
- ebdt_offset = face->dirTables[i].Offset;
-
- if ( FILE_Seek( ebdt_offset ) ||
- ACCESS_Frame( 4L ) ) /* read into frame */
- return error;
-
- version = GET_ULong();
- FORGET_Frame();
-
- PTRACE2(( "-- Format version : %08lx\n", version ));
- if ( version != 0x00020000 )
- {
- PERROR(( "Invalid file format!\n" ));
- return TT_Err_Invalid_File_Format;
- }
-
- /* This doesn't compile, I simply commented it out ?? - David */
- /* PTRACE4(( "-- Format: %d\n", range->image_format )); */
-
- error = Load_SBit_Image( strike,
- glyph_index,
- 0, 0,
- ebdt_offset,
- image,
- 0, face );
- if ( error )
- return error;
-
- return TT_Err_Ok;
- }
-
-
- static TT_Error EBLC_Create( void* ext,
- PFace face )
- {
- TT_EBLC* eblc = (TT_EBLC*)ext;
-
-
- /* by convention */
- if ( !eblc )
- return TT_Err_Ok;
-
- return Load_TrueType_Eblc( face, eblc );
- }
-
-
- static TT_Error EBLC_Destroy( void* ext,
- PFace face )
- {
- TT_EBLC* eblc = (TT_EBLC*)ext;
-
-
- (void)face;
-
- if ( eblc )
- Free_TrueType_Eblc( eblc );
-
- return TT_Err_Ok;
- }
-
-
- /*************************************************************/
- /* */
- /* <Function> */
- /* TT_Init_SBit_Extension */
- /* */
- /* <Description> */
- /* Initialize the embedded bitmaps extension for the */
- /* FreeType engine. */
- /* */
- /* <Input> */
- /* engine :: handle to current FreeType library instance */
- /* */
- /* <Return> */
- /* Error code. 0 means success. */
- /* */
- FT_EXPORT_FUNC( TT_Error )
- TT_Init_SBit_Extension( TT_Engine engine )
- {
- PEngine_Instance _engine = HANDLE_Engine( engine );
-
- TT_Error error;
-
-
- if ( !_engine )
- return TT_Err_Invalid_Engine;
-
- error = TT_Register_Extension( _engine,
- SBIT_ID,
- sizeof ( TT_EBLC ),
- EBLC_Create,
- EBLC_Destroy );
-
- return error;
- }
-
-
- /*************************************************************/
- /* */
- /* <Function> */
- /* TT_Get_Face_Bitmaps */
- /* */
- /* <Description> */
- /* Loads the `EBLC' table from a font file, if any. */
- /* */
- /* <Input> */
- /* face :: handle to the source TrueType font/face */
- /* */
- /* <Output> */
- /* eblc_table :: a descriptor for the EBLC table */
- /* */
- /* <Return> */
- /* Error code. 0 means success. */
- /* */
- /* <Note> */
- /* This function returns TT_Err_Table_Missing if the */
- /* font contains no embedded bitmaps. All fields in */
- /* `eblc_table' will then be set to 0. */
- /* */
- FT_EXPORT_FUNC( TT_Error )
- TT_Get_Face_Bitmaps( TT_Face face,
- TT_EBLC* eblc_table )
- {
- PFace faze = HANDLE_Face( face );
- TT_EBLC* eblc;
- TT_Error error;
-
-
- error = TT_Extension_Get( faze, SBIT_ID, (void**)&eblc );
- if ( !error )
- {
- if ( eblc->version )
- {
- *eblc_table = *eblc;
- return TT_Err_Ok;
- }
- error = TT_Err_Table_Missing;
- }
-
- eblc_table->version = 0;
- eblc_table->num_strikes = 0;
- eblc_table->strikes = 0;
-
- return error;
- }
-
-
-/*******************************************************************
- *
- * <Function> TT_Get_SBit_Strike
- *
- * <Description>
- * Loads suitable strike (bitmap sizetable) for given instance.
- * This strike includes sbitLineMetrics.
- *
- * <Input>
- * face :: the source face
- * instance :: the current size instance
- *
- * <Output>
- * strike :: the bitmap strike descriptor
- *
- * <Return>
- * TrueType error code. 0 means success.
- *
- ******************************************************************/
-
- FT_EXPORT_FUNC( TT_Error )
- TT_Get_SBit_Strike( TT_Face face,
- TT_Instance instance,
- TT_SBit_Strike* strike )
- {
- TT_Error error;
- PFace faze = HANDLE_Face( face );
- PInstance ins = HANDLE_Instance( instance );
-
- TT_EBLC* eblc;
- TT_Int x_ppem, y_ppem;
-
-
- if ( !strike || !ins || ins->owner != faze )
- return TT_Err_Invalid_Argument;
-
- error = TT_Extension_Get( faze, SBIT_ID, (void**)&eblc );
- if ( error )
- goto Exit;
-
- /********************************************************************/
- /* */
- /* Look for an sbit strike that matches the current x and y ppms */
- /* */
- {
- UShort count = eblc->num_strikes;
- TT_SBit_Strike* cur = eblc->strikes;
-
-
- x_ppem = ins->metrics.x_ppem;
- y_ppem = ins->metrics.y_ppem;
-
- MEM_Set( strike, 0, sizeof ( TT_SBit_Strike ) );
-
- for ( ; count > 0; count--, cur++ )
- if ( cur->x_ppem == x_ppem &&
- cur->y_ppem == y_ppem )
- {
- *strike = *cur;
- break;
- }
-
- /* return immediately if we didn't find an appropriate strike */
- if ( !strike->num_ranges )
- error = TT_Err_Invalid_PPem;
- }
-
- Exit:
- return error;
- }
-
-
- /*************************************************************/
- /* */
- /* <Function> */
- /* TT_Load_Glyph_Bitmap */
- /* */
- /* <Description> */
- /* Loads a given glyph embedded bitmap. */
- /* */
- /* <Input> */
- /* face :: handle to the source TrueType font/face */
- /* instance :: current size/transform instance */
- /* glyph_index :: index of source glyph */
- /* bitmap :: target embedded bitmap descriptor */
- /* */
- /* <Return> */
- /* Error code. 0 means success. */
- /* */
- /* <Note> */
- /* This function returns an error if there is no */
- /* embedded bitmap for the glyph at the given */
- /* instance. */
- /* */
- FT_EXPORT_FUNC( TT_Error )
- TT_Load_Glyph_Bitmap( TT_Face face,
- TT_Instance instance,
- TT_UShort glyph_index,
- TT_SBit_Image* image )
- {
- TT_Stream stream;
- TT_Error error;
-
- PFace faze = HANDLE_Face( face );
- PInstance ins = HANDLE_Instance( instance );
-
- TT_SBit_Strike strike;
-
-
- if ( ins->owner != faze )
- {
- error = TT_Err_Invalid_Argument;
- goto Fail;
- }
-
- /********************************************************************/
- /* */
- /* Look for an sbit strike that matches the current x and y ppms */
- /* */
- error = TT_Get_SBit_Strike( face, instance, &strike );
- if ( error )
- goto Fail;
-
- /* return immediately if the glyph index isn't in the strike extent */
- if ( glyph_index < strike.start_glyph ||
- glyph_index > strike.end_glyph )
- {
- error = TT_Err_Invalid_Glyph_Index;
- goto Fail;
- }
-
- {
- image->bit_depth = 1;
-
- if ( !USE_Stream( faze->stream, stream ) )
- {
- error = Load_TrueType_Ebdt( faze, strike, glyph_index, image );
-
- DONE_Stream( stream );
-
- /* exit successfully if we can */
- if ( !error )
- {
- image->map.flow = TT_Flow_Down;
-
- Crop_Bitmap( image );
-
- /* correct sbit metrics */
- {
- TT_Big_Glyph_Metrics* metrics = &image->metrics;
-
-
- metrics->bbox.xMin *= 64;
- metrics->bbox.xMax *= 64;
-
- metrics->bbox.yMax *= 64;
- metrics->bbox.yMin *= 64;
-
- metrics->horiBearingX *= 64;
- metrics->horiBearingY *= 64;
- metrics->horiAdvance *= 64;
-
- metrics->vertBearingX *= 64;
- metrics->vertBearingY *= 64;
- metrics->vertAdvance *= 64;
- }
-
- goto Exit;
- }
- }
- }
-
- Fail:
- image->map.width = 0;
- image->map.rows = 0;
- image->map.cols = 0;
- image->map.size = 0;
- image->map.bitmap = 0;
- image->map.flow = 0;
- image->bit_depth = 0;
-
- Exit:
- return error;
- }
-
-
- /*************************************************************/
- /* */
- /* <Function> */
- /* TT_New_SBit_Image */
- /* */
- /* <Description> */
- /* Allocates a new embedded bitmap container. */
- /* */
- /* <Output> */
- /* image :: sbit image */
- /* */
- /* <Return> */
- /* Error code. 0 means success. */
- /* */
- FT_EXPORT_FUNC( TT_Error )
- TT_New_SBit_Image( TT_SBit_Image** image )
- {
- return MEM_Alloc( *image, sizeof ( **image ) );
- }
-
-
- /*************************************************************/
- /* */
- /* <Function> */
- /* TT_Done_SBit_Image */
- /* */
- /* <Description> */
- /* Releases an embedded bitmap container. */
- /* */
- /* <Input> */
- /* image :: sbit image */
- /* */
- FT_EXPORT_FUNC( void )
- TT_Done_SBit_Image( TT_SBit_Image* image )
- {
- FREE( image->map.bitmap );
- FREE( image );
- }
-
-
-/* END */