📄 ftstring.c
字号:
/****************************************************************************/
/* */
/* The FreeType project -- a free and portable quality TrueType renderer. */
/* */
/* Copyright 1996-2002, 2003, 2004, 2005, 2006 by */
/* D. Turner, R.Wilhelm, and W. Lemberg */
/* */
/* */
/* ftstring.c - simple text string display */
/* */
/****************************************************************************/
#include <ft2build.h>
#include FT_FREETYPE_H
#include "common.h"
#include "ftcommon.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <math.h>
#define CELLSTRING_HEIGHT 8
#define MAXPTSIZE 500 /* dtp */
static char* Text = (char *)"The quick brown fox jumps over the lazy dog";
enum {
RENDER_MODE_STRING,
RENDER_MODE_KERNCMP,
N_RENDER_MODES
};
static struct {
int render_mode;
FT_Encoding encoding;
int res;
int ptsize; /* current point size */
double gamma;
int angle;
FTDemo_String_Context sc;
FT_Byte gamma_ramp[256];
FT_Matrix trans_matrix;
int font_index;
char* header;
char header_buffer[256];
} status = { RENDER_MODE_STRING, FT_ENCODING_UNICODE, 72, 48, 2.0, 0 };
static FTDemo_Display* display;
static FTDemo_Handle* handle;
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/
/**** ****/
/**** E V E N T H A N D L I N G ****/
/**** ****/
/****************************************************************************/
/****************************************************************************/
/****************************************************************************/
static void
event_help( void )
{
grEvent dummy_event;
FTDemo_Display_Clear( display );
grGotoxy( 0, 0 );
grSetMargin( 2, 1 );
grGotobitmap( display->bitmap );
grWriteln( "FreeType String Viewer - part of the FreeType test suite" );
grLn();
grWriteln( "This program is used to display a string of text using" );
grWriteln( "the new convenience API of the FreeType 2 library." );
grLn();
grWriteln( "Use the following keys :" );
grLn();
grWriteln( " F1 or ? : display this help screen" );
grLn();
grWriteln( " a : toggle anti-aliasing" );
grWriteln( " b : toggle embedded bitmaps (and disable rotation)" );
grWriteln( " f : toggle forced auto-hinting" );
grWriteln( " h : toggle outline hinting" );
grWriteln( " l : toggle low precision rendering" );
grLn();
grWriteln( " 1-2 : select rendering mode" );
grWriteln( " k : cycle through kerning modes" );
grWriteln( " t : cycle through kerning degrees" );
grWriteln( " V : toggle vertical rendering" );
grLn();
grWriteln( " G : toggle gamma correction" );
grWriteln( " g : increase gamma by 0.1" );
grWriteln( " v : decrease gamma by 0.1" );
grLn();
grWriteln( " n : next font" );
grWriteln( " p : previous font" );
grLn();
grWriteln( " Up : increase pointsize by 1 unit" );
grWriteln( " Down : decrease pointsize by 1 unit" );
grWriteln( " Page Up : increase pointsize by 10 units" );
grWriteln( " Page Down : decrease pointsize by 10 units" );
grLn();
grWriteln( " Right : rotate counter-clockwise" );
grWriteln( " Left : rotate clockwise" );
grWriteln( " F7 : big rotate counter-clockwise" );
grWriteln( " F8 : big rotate clockwise" );
grLn();
grLn();
grWriteln( "press any key to exit this help screen" );
grRefreshSurface( display->surface );
grListenSurface( display->surface, gr_event_key, &dummy_event );
}
static void
event_font_change( int delta )
{
if ( status.font_index + delta >= handle->num_fonts ||
status.font_index + delta < 0 )
return;
status.font_index += delta;
FTDemo_Set_Current_Font( handle, handle->fonts[status.font_index] );
FTDemo_Set_Current_Pointsize( handle, status.ptsize, status.res );
FTDemo_Update_Current_Flags( handle );
FTDemo_String_Set( handle, (unsigned char*)Text );
}
static void
event_angle_change( int delta )
{
double radian;
FT_Fixed cosinus;
FT_Fixed sinus;
status.angle = ( status.angle + delta ) % 360;
if ( status.angle == 0 )
{
status.sc.matrix = NULL;
return;
}
status.sc.matrix = &status.trans_matrix;
if ( status.angle < 0 )
status.angle += 360;
radian = status.angle * 3.14159 / 180.0;
cosinus = (FT_Fixed)( cos( radian ) * 65536.0 );
sinus = (FT_Fixed)( sin( radian ) * 65536.0 );
status.trans_matrix.xx = cosinus;
status.trans_matrix.yx = sinus;
status.trans_matrix.xy = -sinus;
status.trans_matrix.yy = cosinus;
}
static void
event_gamma_change( double delta )
{
int i;
double gamma_inv;
status.gamma += delta;
if ( status.gamma > 3.0 )
status.gamma = 3.0;
else if ( status.gamma < 0.1 )
status.gamma = 0.1;
sprintf( status.header_buffer, "gamma changed to %.1f", status.gamma );
status.header = status.header_buffer;
gamma_inv = 1.0f / status.gamma;
for ( i = 0; i < 256; i++ )
status.gamma_ramp[i] = (FT_Byte)( pow( (double)i / 255.0f, gamma_inv )
* 255.0f );
}
static void
event_size_change( int delta )
{
status.ptsize += delta;
if ( status.ptsize < 1 )
status.ptsize = 1;
else if ( status.ptsize > MAXPTSIZE )
status.ptsize = MAXPTSIZE;
FTDemo_Set_Current_Pointsize( handle, status.ptsize, status.res );
}
static void
event_render_mode_change( int delta )
{
if ( delta )
{
status.render_mode = ( status.render_mode + delta ) % N_RENDER_MODES;
if ( status.render_mode < 0 )
status.render_mode += N_RENDER_MODES;
}
switch ( status.render_mode )
{
case RENDER_MODE_STRING:
status.header = NULL;
break;
case RENDER_MODE_KERNCMP:
status.header = (char *)"Kerning comparision";
break;
}
}
static int
Process_Event( grEvent* event )
{
FTDemo_String_Context* sc = &status.sc;
int ret = 0;
if ( event->key >= '1' && event->key < '1' + N_RENDER_MODES )
{
status.render_mode = event->key - '1';
event_render_mode_change( 0 );
return ret;
}
switch ( event->key )
{
case grKeyEsc:
case grKEY( 'q' ):
ret = 1;
break;
case grKeyF1:
case grKEY( '?' ):
event_help();
break;
case grKEY( 'a' ):
handle->antialias = !handle->antialias;
status.header = handle->antialias
? (char *)"anti-aliasing is now on"
: (char *)"anti-aliasing is now off";
FTDemo_Update_Current_Flags( handle );
break;
case grKEY( 'b' ):
handle->use_sbits = !handle->use_sbits;
status.header = handle->use_sbits
? (char *)"embedded bitmaps are now used when available"
: (char *)"embedded bitmaps are now ignored";
FTDemo_Update_Current_Flags( handle );
break;
case grKEY( 'f' ):
handle->autohint = !handle->autohint;
status.header = handle->autohint
? (char *)"forced auto-hinting is now on"
: (char *)"forced auto-hinting is now off";
FTDemo_Update_Current_Flags( handle );
break;
case grKEY( 'h' ):
handle->hinted = !handle->hinted;
status.header = handle->hinted
? (char *)"glyph hinting is now active"
: (char *)"glyph hinting is now ignored";
FTDemo_Update_Current_Flags( handle );
break;
case grKEY( 'l' ):
handle->low_prec = !handle->low_prec;
status.header = handle->low_prec
? (char *)"rendering precision is now forced to low"
: (char *)"rendering precision is now normal";
FTDemo_Update_Current_Flags( handle );
break;
case grKEY( 'k' ):
sc->kerning_mode = ( sc->kerning_mode + 1 ) % N_KERNING_MODES;
status.header =
sc->kerning_mode == KERNING_MODE_SMART
? (char *)"pair kerning and side bearing correction is now active"
: sc->kerning_mode == KERNING_MODE_NORMAL
? (char *)"pair kerning is now active"
: (char *)"pair kerning is now ignored";
break;
case grKEY( 't' ):
sc->kerning_degree = ( sc->kerning_degree + 1 ) % N_KERNING_DEGREES;
status.header =
sc->kerning_degree == KERNING_DEGREE_NONE
? (char *)"no track kerning"
: sc->kerning_degree == KERNING_DEGREE_LIGHT
? (char *)"light track kerning active"
: sc->kerning_degree == KERNING_DEGREE_MEDIUM
? (char *)"medium track kerning active"
: (char *)"tight track kerning active";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -