ftrandom.c
来自「SumatraPDF是一款小型开源的pdf阅读工具。虽然玲珑小巧(只有800多K」· C语言 代码 · 共 660 行 · 第 1/2 页
C
660 行
/* Copyright (C) 2005 by George Williams */
/*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/* modified by Werner Lemberg <wl@gnu.org> */
/* This file is now part of the FreeType library */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include <dirent.h>
#include <math.h>
#include <signal.h>
#include <time.h>
#include <ft2build.h>
#include FT_FREETYPE_H
#include FT_OUTLINE_H
#define true 1
#define false 0
#define forever for (;;)
static int check_outlines = false;
static int nohints = false;
static int rasterize = false;
static char* results_dir = "results";
#define GOOD_FONTS_DIR "/home/wl/freetype-testfonts"
static char* default_dir_list[] =
{
GOOD_FONTS_DIR,
NULL
};
static char* default_ext_list[] =
{
"ttf",
"otf",
"ttc",
"cid",
"pfb",
"pfa",
"bdf",
"pcf",
"pfr",
"fon",
"otb",
"cff",
NULL
};
static int error_count = 1;
static int error_fraction = 0;
static FT_F26Dot6 font_size = 12 * 64;
static struct fontlist
{
char* name;
int len;
unsigned int isbinary: 1;
unsigned int isascii: 1;
unsigned int ishex: 1;
} *fontlist;
static int fcnt;
static int
FT_MoveTo( const FT_Vector *to,
void *user )
{
return 0;
}
static int
FT_LineTo( const FT_Vector *to,
void *user )
{
return 0;
}
static int
FT_ConicTo( const FT_Vector *_cp,
const FT_Vector *to,
void *user )
{
return 0;
}
static int
FT_CubicTo( const FT_Vector *cp1,
const FT_Vector *cp2,
const FT_Vector *to,
void *user )
{
return 0;
}
static FT_Outline_Funcs outlinefuncs =
{
FT_MoveTo,
FT_LineTo,
FT_ConicTo,
FT_CubicTo,
0, 0 /* No shift, no delta */
};
static void
TestFace( FT_Face face )
{
int gid;
int load_flags = FT_LOAD_DEFAULT;
if ( check_outlines &&
( face->face_flags & FT_FACE_FLAG_SCALABLE ) )
load_flags = FT_LOAD_NO_BITMAP;
if ( nohints )
load_flags |= FT_LOAD_NO_HINTING;
FT_Set_Char_Size( face, 0, font_size, 72, 72 );
for ( gid = 0; gid < face->num_glyphs; ++gid )
{
if ( check_outlines &&
( face->face_flags & FT_FACE_FLAG_SCALABLE ) )
{
if ( !FT_Load_Glyph( face, gid, load_flags ) )
FT_Outline_Decompose( &face->glyph->outline, &outlinefuncs, NULL );
}
else
FT_Load_Glyph( face, gid, load_flags );
if ( rasterize )
FT_Render_Glyph( face->glyph, ft_render_mode_normal );
}
FT_Done_Face( face );
}
static void
ExecuteTest( char* testfont )
{
FT_Library context;
FT_Face face;
int i, num;
if ( FT_Init_FreeType( &context ) )
{
fprintf( stderr, "Can't initialize FreeType.\n" );
exit( 1 );
}
if ( FT_New_Face( context, testfont, 0, &face ) )
{
/* The font is erroneous, so if this fails that's ok. */
exit( 0 );
}
if ( face->num_faces == 1 )
TestFace( face );
else
{
num = face->num_faces;
FT_Done_Face( face );
for ( i = 0; i < num; ++i )
{
if ( !FT_New_Face( context, testfont, i, &face ) )
TestFace( face );
}
}
exit( 0 );
}
static int
extmatch( char* filename,
char** extensions )
{
int i;
char* pt;
if ( extensions == NULL )
return true;
pt = strrchr( filename, '.' );
if ( pt == NULL )
return false;
if ( pt < strrchr( filename, '/' ) )
return false;
for ( i = 0; extensions[i] != NULL; ++i )
if ( strcasecmp( pt + 1, extensions[i] ) == 0 ||
strcasecmp( pt, extensions[i] ) == 0 )
return true;
return false;
}
static void
figurefiletype( struct fontlist* item )
{
FILE* foo;
item->isbinary = item->isascii = item->ishex = false;
foo = fopen( item->name, "rb" );
if ( foo != NULL )
{
/* Try to guess the file type from the first few characters... */
int ch1 = getc( foo );
int ch2 = getc( foo );
int ch3 = getc( foo );
int ch4 = getc( foo );
fclose( foo );
if ( ( ch1 == 0 && ch2 == 1 && ch3 == 0 && ch4 == 0 ) ||
( ch1 == 'O' && ch2 == 'T' && ch3 == 'T' && ch4 == 'O' ) ||
( ch1 == 't' && ch2 == 'r' && ch3 == 'u' && ch4 == 'e' ) ||
( ch1 == 't' && ch2 == 't' && ch3 == 'c' && ch4 == 'f' ) )
{
/* ttf, otf, ttc files */
item->isbinary = true;
}
else if ( ch1 == 0x80 && ch2 == '\01' )
{
/* PFB header */
item->isbinary = true;
}
else if ( ch1 == '%' && ch2 == '!' )
{
/* Random PostScript */
if ( strstr( item->name, ".pfa" ) != NULL ||
strstr( item->name, ".PFA" ) != NULL )
item->ishex = true;
else
item->isascii = true;
}
else if ( ch1 == 1 && ch2 == 0 && ch3 == 4 )
{
/* Bare CFF */
item->isbinary = true;
}
else if ( ch1 == 'S' && ch2 == 'T' && ch3 == 'A' && ch4 == 'R' )
{
/* BDF */
item->ishex = true;
}
else if ( ch1 == 'P' && ch2 == 'F' && ch3 == 'R' && ch4 == '0' )
{
/* PFR */
item->isbinary = true;
}
else if ( ( ch1 == '\1' && ch2 == 'f' && ch3 == 'c' && ch4 == 'p' ) ||
( ch1 == 'M' && ch2 == 'Z' ) )
{
/* Windows FON */
item->isbinary = true;
}
else
{
fprintf( stderr,
"Can't recognize file type of `%s', assuming binary\n",
item->name );
item->isbinary = true;
}
}
else
{
fprintf( stderr, "Can't open `%s' for typing the file.\n",
item->name );
item->isbinary = true;
}
}
static void
FindFonts( char** fontdirs,
char** extensions )
{
DIR* examples;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?