diff options
Diffstat (limited to 'Build/source/libs/freetype/freetype-1.5/test/ftview.c')
-rw-r--r-- | Build/source/libs/freetype/freetype-1.5/test/ftview.c | 539 |
1 files changed, 539 insertions, 0 deletions
diff --git a/Build/source/libs/freetype/freetype-1.5/test/ftview.c b/Build/source/libs/freetype/freetype-1.5/test/ftview.c new file mode 100644 index 00000000000..71ca0d87a28 --- /dev/null +++ b/Build/source/libs/freetype/freetype-1.5/test/ftview.c @@ -0,0 +1,539 @@ +/****************************************************************************/ +/* */ +/* The FreeType project -- a free and portable quality TrueType renderer. */ +/* */ +/* Copyright 1996-2001 by */ +/* D. Turner, R.Wilhelm, and W. Lemberg */ +/* */ +/* ftview: A simple font viewer. Supports hinting and grayscaling. */ +/* */ +/* */ +/* Keys: */ +/* */ +/* x : fine counter-clockwise rotation */ +/* c : fine clockwise rotation */ +/* */ +/* v : fast counter-clockwise rotation */ +/* b : fast clockwise rotation */ +/* */ +/* + : fast scale up */ +/* - : fast scale down */ +/* u : fine scale down */ +/* j : fine scale up */ +/* */ +/* l : go to next glyph */ +/* k : go to previous glyph */ +/* */ +/* o : go to tenth next glyph */ +/* i : go to tenth previous glyph */ +/* */ +/* 0 : go to hundredth next glyph */ +/* 9 : go to hundredth previous glyph */ +/* */ +/* ) : go to 1000th next glyph */ +/* ( : go to 1000th previous glyph */ +/* */ +/* } : go to 10000th next glyph */ +/* { : go to 10000th previous glyph */ +/* */ +/* n : go to next (or last) .ttf file */ +/* p : go to previous (or first) .ttf file */ +/* */ +/* h : toggle hinting */ +/* */ +/* B : toggle sbit */ +/* */ +/* ESC : exit */ +/* */ +/* */ +/* NOTE: This is just a test program that is used to show off and */ +/* debug the current engine. */ +/* */ +/****************************************************************************/ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "blitter.h" +#include "common.h" +#include "display.h" +#include "freetype.h" +#include "ftxsbit.h" + +#include "gdriver.h" +#include "gevents.h" +#include "gmain.h" + +#define Pi 3.1415926535 + +#define MAXPTSIZE 500 /* dtp */ +#define Center_X ( Bit.width / 2 ) /* dtp */ +#define Center_Y ( Bit.rows / 2 ) /* dtp */ + +/* + * If Ignore_Err_Not_SBit is not defined, + * "Fail" increase when the glyph does not have sbit and + * sbit_flag is 1. + */ +#define Ignore_Err_Not_SBit 1 + + TT_Engine engine; + + TT_Face face; + TT_Instance instance; + TT_Glyph glyph; + + TT_Big_Glyph_Metrics metrics; + TT_Outline outline; + TT_Face_Properties properties; + TT_Instance_Metrics imetrics; + + TT_SBit_Image* sbit; + + int num_glyphs; + + int ptsize; + int hinted; + + char Header[128]; + + int Rotation; + int Fail; + int Num; + + int gray_render; + unsigned int sbit_flag; /* 0 if to display outlines + * 1 if to use embedded bitmaps + * 2 if to show sbit and outline glyphs + */ + + int glyph_has_sbit; + + + + static TT_Error Reset_Scale( int pointSize ) + { + TT_Error error; + TT_SBit_Strike strike; + + + if ( (error = TT_Set_Instance_PointSize( instance, pointSize )) ) + { + RestoreScreen(); + fprintf( stderr, "Error = 0x%x.\n", (unsigned)error ); + Panic( "Could not reset instance.\n" ); + } + TT_Get_Instance_Metrics( instance, &imetrics ); + + /* now re-allocates the small bitmap */ + if ( gray_render ) + { + Init_Small( imetrics.x_ppem, imetrics.y_ppem ); + Clear_Small(); + } + + if ( TT_Get_SBit_Strike( face, instance, &strike ) ) + glyph_has_sbit = 0; + else + glyph_has_sbit = 1; + + return TT_Err_Ok; + } + + + static TT_Error LoadTrueTypeChar( int idx, int hint ) + { + int flags; + + + flags = TTLOAD_SCALE_GLYPH; + if ( hint ) + flags |= TTLOAD_HINT_GLYPH; + + return TT_Load_Glyph( instance, glyph, idx, flags ); + } + + + static TT_Error Render_All( int first_glyph, int ptsize ) + { + TT_F26Dot6 start_x, start_y, step_y, x, y; + int i; + + TT_Error error = 0; + + + start_x = 4; + start_y = vio_Height - ( ( ptsize * 96 + 36 ) / 72 + 10 ); + + step_y = imetrics.y_ppem + 10; + + x = start_x; + y = start_y; + + i = first_glyph; + + while ( i < num_glyphs ) + { + if ( ( glyph_has_sbit ) && + ( ( sbit_flag + 1 ) & 2 ) && + !(error = TT_Load_Glyph_Bitmap( face, instance, i, sbit )) ) + { + Blit_Bitmap( &Bit, + &sbit->map, + gray_render ? 8 : 1, + (int)x + (int)(sbit->metrics.horiBearingX/64), + Bit.rows - (int)y - (int)(sbit->metrics.horiBearingY/64), + gray_palette[4] ); + metrics = sbit->metrics; + goto Step; + } + + if ( ( ( !glyph_has_sbit ) || + ( ( sbit_flag + 1 ) & 1 ) ) && + !(error = LoadTrueTypeChar( i, hinted )) ) + { + TT_Get_Glyph_Outline( glyph, &outline ); + TT_Get_Glyph_Big_Metrics( glyph, &metrics ); + + Render_Single_Glyph( gray_render, glyph, (int)x, (int)y ); + } + else + { +#ifdef Ignore_Err_Not_SBit + if (!(( glyph_has_sbit ) && + ( sbit_flag == 1 ) && + ( error == TT_Err_Invalid_Glyph_Index ))) +#endif + Fail++; + } + Step: + x += ( metrics.horiAdvance / 64 ) + 1; + + if ( x + imetrics.x_ppem > vio_Width ) + { + x = start_x; + y -= step_y; + + if ( y < 10 ) + return TT_Err_Ok; + } + i++; + } + return TT_Err_Ok; + } + + + static int Process_Event( TEvent* event ) + { + switch ( event->what ) + { + case event_Quit: /* ESC or q */ + return 0; + + case event_Keyboard: + if ( event->info == 'n' ) /* Next file */ + return 'n'; + if ( event->info == 'p' ) /* Previous file */ + return 'p'; + if ( event->info == 'h' ) /* Toggle hinting */ + hinted = !hinted; + if ( ( event->info == 'B' ) && ( glyph_has_sbit ) ) /* Toggle sbit */ + sbit_flag = ( sbit_flag + 1 ) % 3; + break; + + case event_Rotate_Glyph: + Rotation = ( Rotation + event->info ) & 1023; + break; + + case event_Scale_Glyph: + ptsize += event->info; + if ( ptsize < 1 ) ptsize = 1; + if ( ptsize > MAXPTSIZE ) ptsize = MAXPTSIZE; + break; + + case event_Change_Glyph: + Num += event->info; + if ( Num < 0 ) Num = 0; + if ( Num >= num_glyphs ) Num = num_glyphs - 1; + break; + } + + return 1; + } + + + static void usage( char* execname ) + { + fprintf( stderr, + "\n" + "ftview: simple TrueType interpreter tester -- part of the FreeType project\n" + "--------------------------------------------------------------------------\n" + "\n" + "Usage: %s [options below] ppem fontname[.ttf|.ttc] ...\n", + execname ); + fprintf( stderr, + "\n" + " -g gray-level rendering (default: none)\n" + " -r R use resolution R dpi (default: 96)\n" + " -B use embedded bitmaps (default: none)\n" + "\n" ); + + exit( EXIT_FAILURE ); + } + + + int main( int argc, char** argv ) + { + int i, old_ptsize, orig_ptsize, file; + int XisSetup = 0; + char filename[128 + 4]; + char alt_filename[128 + 4]; + char* execname; + int option; + int res = 96; + + TT_Error error; + TEvent event; + + TT_EBLC eblc_table; + + + execname = ft_basename( argv[0] ); + + while ( 1 ) + { + option = ft_getopt( argc, argv, "gr:B" ); + + if ( option == -1 ) + break; + + switch ( option ) + { + case 'g': + gray_render = 1; + sbit_flag = 0; + break; + + case 'r': + res = atoi( ft_optarg ); + if ( res < 1 ) + usage( execname ); + break; + + case 'B': + if (!gray_render) +#if 0 + sbit_flag = 1; +#else + sbit_flag = 2; +#endif + break; + + default: + usage( execname ); + break; + } + } + + argc -= ft_optind; + argv += ft_optind; + + if ( argc <= 1 ) + usage( execname ); + + if ( sscanf( argv[0], "%d", &orig_ptsize ) != 1 ) + orig_ptsize = 64; + + file = 1; + + /* Initialize engine */ + + if ( (error = TT_Init_FreeType( &engine )) ) + Panic( "Error while initializing engine, code = 0x%x.\n", error ); + + if ( (error = TT_Init_SBit_Extension( engine )) ) + Panic( "Error while initializing sbit extention, code = 0x%x.\n", error ); + + NewFile: + ptsize = orig_ptsize; + hinted = 1; + + i = strlen( argv[file] ); + while ( i > 0 && argv[file][i] != '\\' && argv[file][i] != '/' ) + { + if ( argv[file][i] == '.' ) + i = 0; + i--; + } + + filename[128] = '\0'; + alt_filename[128] = '\0'; + + strncpy( filename, argv[file], 128 ); + strncpy( alt_filename, argv[file], 128 ); + + if ( i >= 0 ) + { + strncpy( filename + strlen( filename ), ".ttf", 4 ); + strncpy( alt_filename + strlen( alt_filename ), ".ttc", 4 ); + } + + /* Load face */ + + error = TT_Open_Face( engine, filename, &face ); + + if ( error == TT_Err_Could_Not_Open_File ) + { + strcpy( filename, alt_filename ); + error = TT_Open_Face( engine, alt_filename, &face ); + } + + if ( error == TT_Err_Could_Not_Open_File ) + Panic( "Could not find/open %s.\n", filename ); + else if ( error ) + Panic( "Error while opening %s, error code = 0x%x.\n", + filename, error ); + + /* get face properties and allocate preload arrays */ + + TT_Get_Face_Properties( face, &properties ); + + num_glyphs = properties.num_Glyphs; + + glyph_has_sbit = 0; + + error = TT_Get_Face_Bitmaps( face, &eblc_table ); + if ( error == TT_Err_Ok ) + glyph_has_sbit = 1; + if ( sbit_flag && !glyph_has_sbit ) + Panic( "%s does not have embedded bitmap glyphs.\n", filename ); + + /* create glyph */ + + error = TT_New_Glyph( face, &glyph ); + if ( error ) + Panic( "Could not create glyph container.\n" ); + + error = TT_New_SBit_Image( &sbit ); + if ( error ) + Panic( "Could not create sbit slot.\n" ); + + /* create instance */ + + error = TT_New_Instance( face, &instance ); + if ( error ) + Panic( "Could not create instance for %s.\n", filename ); + + error = TT_Set_Instance_Resolutions( instance, res, res ); + if ( error ) + Panic( "Could not set device resolutions." ); + + if ( !XisSetup ) + { + XisSetup = 1; + + if ( gray_render ) + { + if ( !SetGraphScreen( Graphics_Mode_Gray ) ) + Panic( "Could not set up grayscale graphics mode.\n" ); + + TT_Set_Raster_Gray_Palette( engine, virtual_palette ); + } + else + { + if ( !SetGraphScreen( Graphics_Mode_Mono ) ) + Panic( "Could not set up mono graphics mode.\n" ); + } + } + + Init_Display( gray_render ); + + Reset_Scale( ptsize ); + + old_ptsize = ptsize; + + Fail = 0; + Num = 0; + + for ( ;; ) + { + int key; + char* sbit_string; + static char* sbit_messages[4] = + { "off", "on", " if available", "NONE" }; + + sbit_string = sbit_messages[3]; + if ( glyph_has_sbit ) + { + if (sbit_flag >= 0 && sbit_flag < 3) + sbit_string = sbit_messages[sbit_flag]; + } + + Clear_Display(); + Render_All( Num, ptsize ); + if ( gray_render ) + Convert_To_Display_Palette(); + + sprintf( Header, "%s: Glyph: %4d ptsize: %4d hinting: %s sbit: %s", + ft_basename( filename ), Num, ptsize, + hinted ? "on" : "off", + sbit_string ); + Display_Bitmap_On_Screen( Bit.bitmap, Bit.rows, Bit.cols ); + +#ifndef X11 +#ifndef OS2 + Print_XY( 0, 0, Header ); +#endif +#endif + + Get_Event( &event ); + if ( !( key = Process_Event( &event ) ) ) + goto End; + + if ( key == 'n' ) + { + TT_Close_Face( face ); + + if ( file < argc - 1 ) + file++; + + goto NewFile; + } + + if ( key == 'p' ) + { + TT_Close_Face( face ); + + if ( file > 1 ) + file--; + + goto NewFile; + } + + if ( ptsize != old_ptsize ) + { + if ( Reset_Scale( ptsize ) ) + Panic( "Could not resize font.\n" ); + + old_ptsize = ptsize; + } + } + + End: + RestoreScreen(); + + TT_Done_SBit_Image( sbit ); + TT_Close_Face( face ); + TT_Done_FreeType( engine ); + + printf( "Execution completed successfully.\n" ); + printf( "Fails = %d\n", Fail ); + + exit( EXIT_SUCCESS ); /* for safety reasons */ + + return 0; /* never reached */ +} + + +/* End */ |