From 8c9c1e09979399e7400a90ec944679636d92054c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 2 Jan 2020 05:05:29 +0100 Subject: [PATCH 001/361] remove libpng and libjpeg (we use stb instead) --- vendor/libjpeg/include/jconfig.h | 45 - vendor/libjpeg/include/jerror.h | 304 --- vendor/libjpeg/include/jmorecfg.h | 390 --- vendor/libjpeg/include/jpeglib.h | 1173 --------- vendor/libjpeg/lib/x86/libjpeg.lib | Bin 311844 -> 0 bytes vendor/libjpeg/lib/x86/libjpeg_d.lib | Bin 814380 -> 0 bytes vendor/libpng/include/png.h | 3265 -------------------------- vendor/libpng/include/pngconf.h | 622 ----- vendor/libpng/include/pnglibconf.h | 216 -- vendor/libpng/lib/x86/libpng.lib | Bin 1066594 -> 0 bytes vendor/libpng/lib/x86/libpngd.lib | Bin 1236906 -> 0 bytes 11 files changed, 6015 deletions(-) delete mode 100644 vendor/libjpeg/include/jconfig.h delete mode 100644 vendor/libjpeg/include/jerror.h delete mode 100644 vendor/libjpeg/include/jmorecfg.h delete mode 100644 vendor/libjpeg/include/jpeglib.h delete mode 100644 vendor/libjpeg/lib/x86/libjpeg.lib delete mode 100644 vendor/libjpeg/lib/x86/libjpeg_d.lib delete mode 100644 vendor/libpng/include/png.h delete mode 100644 vendor/libpng/include/pngconf.h delete mode 100644 vendor/libpng/include/pnglibconf.h delete mode 100644 vendor/libpng/lib/x86/libpng.lib delete mode 100644 vendor/libpng/lib/x86/libpngd.lib diff --git a/vendor/libjpeg/include/jconfig.h b/vendor/libjpeg/include/jconfig.h deleted file mode 100644 index f15b418..0000000 --- a/vendor/libjpeg/include/jconfig.h +++ /dev/null @@ -1,45 +0,0 @@ -/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */ -/* see jconfig.txt for explanations */ - -#define HAVE_PROTOTYPES -#define HAVE_UNSIGNED_CHAR -#define HAVE_UNSIGNED_SHORT -/* #define void char */ -/* #define const */ -#undef CHAR_IS_UNSIGNED -#define HAVE_STDDEF_H -#define HAVE_STDLIB_H -#undef NEED_BSD_STRINGS -#undef NEED_SYS_TYPES_H -#undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */ -#undef NEED_SHORT_EXTERNAL_NAMES -#undef INCOMPLETE_TYPES_BROKEN - -/* Define "boolean" as unsigned char, not enum, per Windows custom */ -#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ -typedef unsigned char boolean; -#endif -#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ - - -#ifdef JPEG_INTERNALS - -#undef RIGHT_SHIFT_IS_UNSIGNED - -#endif /* JPEG_INTERNALS */ - -#ifdef JPEG_CJPEG_DJPEG - -#define BMP_SUPPORTED /* BMP image file format */ -#define GIF_SUPPORTED /* GIF image file format */ -#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ -#undef RLE_SUPPORTED /* Utah RLE image file format */ -#define TARGA_SUPPORTED /* Targa image file format */ - -#define TWO_FILE_COMMANDLINE /* optional */ -#define USE_SETMODE /* Microsoft has setmode() */ -#undef NEED_SIGNAL_CATCHER -#undef DONT_USE_B_MODE -#undef PROGRESS_REPORT /* optional */ - -#endif /* JPEG_CJPEG_DJPEG */ diff --git a/vendor/libjpeg/include/jerror.h b/vendor/libjpeg/include/jerror.h deleted file mode 100644 index a4b661f..0000000 --- a/vendor/libjpeg/include/jerror.h +++ /dev/null @@ -1,304 +0,0 @@ -/* - * jerror.h - * - * Copyright (C) 1994-1997, Thomas G. Lane. - * Modified 1997-2012 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file defines the error and message codes for the JPEG library. - * Edit this file to add new codes, or to translate the message strings to - * some other language. - * A set of error-reporting macros are defined too. Some applications using - * the JPEG library may wish to include this file to get the error codes - * and/or the macros. - */ - -/* - * To define the enum list of message codes, include this file without - * defining macro JMESSAGE. To create a message string table, include it - * again with a suitable JMESSAGE definition (see jerror.c for an example). - */ -#ifndef JMESSAGE -#ifndef JERROR_H -/* First time through, define the enum list */ -#define JMAKE_ENUM_LIST -#else -/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ -#define JMESSAGE(code,string) -#endif /* JERROR_H */ -#endif /* JMESSAGE */ - -#ifdef JMAKE_ENUM_LIST - -typedef enum { - -#define JMESSAGE(code,string) code , - -#endif /* JMAKE_ENUM_LIST */ - -JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */ - -/* For maintenance convenience, list is alphabetical by message code name */ -JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix") -JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix") -JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode") -JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS") -JMESSAGE(JERR_BAD_CROP_SPEC, "Invalid crop request") -JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range") -JMESSAGE(JERR_BAD_DCTSIZE, "DCT scaled block size %dx%d not supported") -JMESSAGE(JERR_BAD_DROP_SAMPLING, - "Component index %d: mismatching sampling ratio %d:%d, %d:%d, %c") -JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition") -JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace") -JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace") -JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length") -JMESSAGE(JERR_BAD_LIB_VERSION, - "Wrong JPEG library version: library is %d, caller expects %d") -JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan") -JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d") -JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d") -JMESSAGE(JERR_BAD_PROGRESSION, - "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") -JMESSAGE(JERR_BAD_PROG_SCRIPT, - "Invalid progressive parameters at scan script entry %d") -JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors") -JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d") -JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d") -JMESSAGE(JERR_BAD_STRUCT_SIZE, - "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") -JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") -JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small") -JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here") -JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") -JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") -JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request") -JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") -JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") -JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") -JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d") -JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)") -JMESSAGE(JERR_EMS_READ, "Read from EMS failed") -JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") -JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan") -JMESSAGE(JERR_FILE_READ, "Input file read error") -JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?") -JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet") -JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") -JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") -JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels") -JMESSAGE(JERR_INPUT_EMPTY, "Empty input file") -JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") -JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, - "Cannot transcode due to multiple use of quantization table %d") -JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data") -JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change") -JMESSAGE(JERR_NOTIMPL, "Not implemented yet") -JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time") -JMESSAGE(JERR_NO_ARITH_TABLE, "Arithmetic table 0x%02x was not defined") -JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") -JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") -JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") -JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined") -JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x") -JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)") -JMESSAGE(JERR_QUANT_COMPONENTS, - "Cannot quantize more than %d color components") -JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") -JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") -JMESSAGE(JERR_SOF_BEFORE, "Invalid JPEG file structure: %s before SOF") -JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") -JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker") -JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") -JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") -JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") -JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") -JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file") -JMESSAGE(JERR_TFILE_WRITE, - "Write failed on temporary file --- out of disk space?") -JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") -JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x") -JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") -JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation") -JMESSAGE(JERR_XMS_READ, "Read from XMS failed") -JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed") -JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT) -JMESSAGE(JMSG_VERSION, JVERSION) -JMESSAGE(JTRC_16BIT_TABLES, - "Caution: quantization tables are too coarse for baseline JPEG") -JMESSAGE(JTRC_ADOBE, - "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") -JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") -JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") -JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") -JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") -JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d") -JMESSAGE(JTRC_DRI, "Define Restart Interval %u") -JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") -JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") -JMESSAGE(JTRC_EOI, "End Of Image") -JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") -JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") -JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, - "Warning: thumbnail image size does not match data length %u") -JMESSAGE(JTRC_JFIF_EXTENSION, - "JFIF extension marker: type 0x%02x, length %u") -JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image") -JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u") -JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") -JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u") -JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") -JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") -JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") -JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") -JMESSAGE(JTRC_RST, "RST%d") -JMESSAGE(JTRC_SMOOTH_NOTIMPL, - "Smoothing not supported with nonstandard sampling ratios") -JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") -JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d") -JMESSAGE(JTRC_SOI, "Start of Image") -JMESSAGE(JTRC_SOS, "Start Of Scan: %d components") -JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d") -JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") -JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") -JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s") -JMESSAGE(JTRC_THUMB_JPEG, - "JFIF extension marker: JPEG-compressed thumbnail image, length %u") -JMESSAGE(JTRC_THUMB_PALETTE, - "JFIF extension marker: palette thumbnail image, length %u") -JMESSAGE(JTRC_THUMB_RGB, - "JFIF extension marker: RGB thumbnail image, length %u") -JMESSAGE(JTRC_UNKNOWN_IDS, - "Unrecognized component IDs %d %d %d, assuming YCbCr") -JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") -JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u") -JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d") -JMESSAGE(JWRN_ARITH_BAD_CODE, "Corrupt JPEG data: bad arithmetic code") -JMESSAGE(JWRN_BOGUS_PROGRESSION, - "Inconsistent progression sequence for component %d coefficient %d") -JMESSAGE(JWRN_EXTRANEOUS_DATA, - "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x") -JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment") -JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code") -JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d") -JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file") -JMESSAGE(JWRN_MUST_RESYNC, - "Corrupt JPEG data: found marker 0x%02x instead of RST%d") -JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG") -JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines") - -#ifdef JMAKE_ENUM_LIST - - JMSG_LASTMSGCODE -} J_MESSAGE_CODE; - -#undef JMAKE_ENUM_LIST -#endif /* JMAKE_ENUM_LIST */ - -/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ -#undef JMESSAGE - - -#ifndef JERROR_H -#define JERROR_H - -/* Macros to simplify using the error and trace message stuff */ -/* The first parameter is either type of cinfo pointer */ - -/* Fatal errors (print message and exit) */ -#define ERREXIT(cinfo,code) \ - ((cinfo)->err->msg_code = (code), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT1(cinfo,code,p1) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT2(cinfo,code,p1,p2) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT3(cinfo,code,p1,p2,p3) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (cinfo)->err->msg_parm.i[2] = (p3), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (cinfo)->err->msg_parm.i[2] = (p3), \ - (cinfo)->err->msg_parm.i[3] = (p4), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT6(cinfo,code,p1,p2,p3,p4,p5,p6) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (cinfo)->err->msg_parm.i[2] = (p3), \ - (cinfo)->err->msg_parm.i[3] = (p4), \ - (cinfo)->err->msg_parm.i[4] = (p5), \ - (cinfo)->err->msg_parm.i[5] = (p6), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXITS(cinfo,code,str) \ - ((cinfo)->err->msg_code = (code), \ - strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) - -#define MAKESTMT(stuff) do { stuff } while (0) - -/* Nonfatal errors (we can keep going, but the data is probably corrupt) */ -#define WARNMS(cinfo,code) \ - ((cinfo)->err->msg_code = (code), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) -#define WARNMS1(cinfo,code,p1) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) -#define WARNMS2(cinfo,code,p1,p2) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) - -/* Informational/debugging messages */ -#define TRACEMS(cinfo,lvl,code) \ - ((cinfo)->err->msg_code = (code), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) -#define TRACEMS1(cinfo,lvl,code,p1) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) -#define TRACEMS2(cinfo,lvl,code,p1,p2) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) -#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ - _mp[4] = (p5); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ - _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMSS(cinfo,lvl,code,str) \ - ((cinfo)->err->msg_code = (code), \ - strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) - -#endif /* JERROR_H */ diff --git a/vendor/libjpeg/include/jmorecfg.h b/vendor/libjpeg/include/jmorecfg.h deleted file mode 100644 index 2407edb..0000000 --- a/vendor/libjpeg/include/jmorecfg.h +++ /dev/null @@ -1,390 +0,0 @@ -/* - * jmorecfg.h - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * Modified 1997-2012 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains additional configuration options that customize the - * JPEG software for special applications or support machine-dependent - * optimizations. Most users will not need to touch this file. - */ - - -/* - * Define BITS_IN_JSAMPLE as either - * 8 for 8-bit sample values (the usual setting) - * 12 for 12-bit sample values - * Only 8 and 12 are legal data precisions for lossy JPEG according to the - * JPEG standard, and the IJG code does not support anything else! - * We do not support run-time selection of data precision, sorry. - */ - -#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ - - -/* - * Maximum number of components (color channels) allowed in JPEG image. - * To meet the letter of the JPEG spec, set this to 255. However, darn - * few applications need more than 4 channels (maybe 5 for CMYK + alpha - * mask). We recommend 10 as a reasonable compromise; use 4 if you are - * really short on memory. (Each allowed component costs a hundred or so - * bytes of storage, whether actually used in an image or not.) - */ - -#define MAX_COMPONENTS 10 /* maximum number of image components */ - - -/* - * Basic data types. - * You may need to change these if you have a machine with unusual data - * type sizes; for example, "char" not 8 bits, "short" not 16 bits, - * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, - * but it had better be at least 16. - */ - -/* Representation of a single sample (pixel element value). - * We frequently allocate large arrays of these, so it's important to keep - * them small. But if you have memory to burn and access to char or short - * arrays is very slow on your hardware, you might want to change these. - */ - -#if BITS_IN_JSAMPLE == 8 -/* JSAMPLE should be the smallest type that will hold the values 0..255. - * You can use a signed char by having GETJSAMPLE mask it with 0xFF. - */ - -#ifdef HAVE_UNSIGNED_CHAR - -typedef unsigned char JSAMPLE; -#define GETJSAMPLE(value) ((int) (value)) - -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JSAMPLE; -#ifdef CHAR_IS_UNSIGNED -#define GETJSAMPLE(value) ((int) (value)) -#else -#define GETJSAMPLE(value) ((int) (value) & 0xFF) -#endif /* CHAR_IS_UNSIGNED */ - -#endif /* HAVE_UNSIGNED_CHAR */ - -#define MAXJSAMPLE 255 -#define CENTERJSAMPLE 128 - -#endif /* BITS_IN_JSAMPLE == 8 */ - - -#if BITS_IN_JSAMPLE == 12 -/* JSAMPLE should be the smallest type that will hold the values 0..4095. - * On nearly all machines "short" will do nicely. - */ - -typedef short JSAMPLE; -#define GETJSAMPLE(value) ((int) (value)) - -#define MAXJSAMPLE 4095 -#define CENTERJSAMPLE 2048 - -#endif /* BITS_IN_JSAMPLE == 12 */ - - -/* Representation of a DCT frequency coefficient. - * This should be a signed value of at least 16 bits; "short" is usually OK. - * Again, we allocate large arrays of these, but you can change to int - * if you have memory to burn and "short" is really slow. - */ - -typedef short JCOEF; - - -/* Compressed datastreams are represented as arrays of JOCTET. - * These must be EXACTLY 8 bits wide, at least once they are written to - * external storage. Note that when using the stdio data source/destination - * managers, this is also the data type passed to fread/fwrite. - */ - -#ifdef HAVE_UNSIGNED_CHAR - -typedef unsigned char JOCTET; -#define GETJOCTET(value) (value) - -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JOCTET; -#ifdef CHAR_IS_UNSIGNED -#define GETJOCTET(value) (value) -#else -#define GETJOCTET(value) ((value) & 0xFF) -#endif /* CHAR_IS_UNSIGNED */ - -#endif /* HAVE_UNSIGNED_CHAR */ - - -/* These typedefs are used for various table entries and so forth. - * They must be at least as wide as specified; but making them too big - * won't cost a huge amount of memory, so we don't provide special - * extraction code like we did for JSAMPLE. (In other words, these - * typedefs live at a different point on the speed/space tradeoff curve.) - */ - -/* UINT8 must hold at least the values 0..255. */ - -#ifdef HAVE_UNSIGNED_CHAR -typedef unsigned char UINT8; -#else /* not HAVE_UNSIGNED_CHAR */ -#ifdef CHAR_IS_UNSIGNED -typedef char UINT8; -#else /* not CHAR_IS_UNSIGNED */ -typedef short UINT8; -#endif /* CHAR_IS_UNSIGNED */ -#endif /* HAVE_UNSIGNED_CHAR */ - -/* UINT16 must hold at least the values 0..65535. */ - -#ifdef HAVE_UNSIGNED_SHORT -typedef unsigned short UINT16; -#else /* not HAVE_UNSIGNED_SHORT */ -typedef unsigned int UINT16; -#endif /* HAVE_UNSIGNED_SHORT */ - -/* INT16 must hold at least the values -32768..32767. */ - -#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ -typedef short INT16; -#endif - -/* INT32 must hold at least signed 32-bit values. */ - -#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ -#ifndef _BASETSD_H_ /* Microsoft defines it in basetsd.h */ -#ifndef _BASETSD_H /* MinGW is slightly different */ -#ifndef QGLOBAL_H /* Qt defines it in qglobal.h */ -typedef long INT32; -#endif -#endif -#endif -#endif - -/* Datatype used for image dimensions. The JPEG standard only supports - * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore - * "unsigned int" is sufficient on all machines. However, if you need to - * handle larger images and you don't mind deviating from the spec, you - * can change this datatype. - */ - -typedef unsigned int JDIMENSION; - -#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ - - -/* These macros are used in all function definitions and extern declarations. - * You could modify them if you need to change function linkage conventions; - * in particular, you'll need to do that to make the library a Windows DLL. - * Another application is to make all functions global for use with debuggers - * or code profilers that require it. - */ - -/* a function called through method pointers: */ -#define METHODDEF(type) static type -/* a function used only in its module: */ -#define LOCAL(type) static type -/* a function referenced thru EXTERNs: */ -#define GLOBAL(type) type -/* a reference to a GLOBAL function: */ -#define EXTERN(type) extern type - - -/* This macro is used to declare a "method", that is, a function pointer. - * We want to supply prototype parameters if the compiler can cope. - * Note that the arglist parameter must be parenthesized! - * Again, you can customize this if you need special linkage keywords. - */ - -#ifdef HAVE_PROTOTYPES -#define JMETHOD(type,methodname,arglist) type (*methodname) arglist -#else -#define JMETHOD(type,methodname,arglist) type (*methodname) () -#endif - - -/* The noreturn type identifier is used to declare functions - * which cannot return. - * Compilers can thus create more optimized code and perform - * better checks for warnings and errors. - * Static analyzer tools can make improved inferences about - * execution paths and are prevented from giving false alerts. - * - * Unfortunately, the proposed specifications of corresponding - * extensions in the Dec 2011 ISO C standard revision (C11), - * GCC, MSVC, etc. are not viable. - * Thus we introduce a user defined type to declare noreturn - * functions at least for clarity. A proper compiler would - * have a suitable noreturn type to match in place of void. - */ - -#ifndef HAVE_NORETURN_T -typedef void noreturn_t; -#endif - - -/* Here is the pseudo-keyword for declaring pointers that must be "far" - * on 80x86 machines. Most of the specialized coding for 80x86 is handled - * by just saying "FAR *" where such a pointer is needed. In a few places - * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. - */ - -#ifndef FAR -#ifdef NEED_FAR_POINTERS -#define FAR far -#else -#define FAR -#endif -#endif - - -/* - * On a few systems, type boolean and/or its values FALSE, TRUE may appear - * in standard header files. Or you may have conflicts with application- - * specific header files that you want to include together with these files. - * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. - */ - -#ifdef HAVE_BOOLEAN -#ifndef FALSE /* in case these macros already exist */ -#define FALSE 0 /* values of boolean */ -#endif -#ifndef TRUE -#define TRUE 1 -#endif -#else -typedef enum { FALSE = 0, TRUE = 1 } boolean; -#endif - - -/* - * The remaining options affect code selection within the JPEG library, - * but they don't need to be visible to most applications using the library. - * To minimize application namespace pollution, the symbols won't be - * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. - */ - -#ifdef JPEG_INTERNALS -#define JPEG_INTERNAL_OPTIONS -#endif - -#ifdef JPEG_INTERNAL_OPTIONS - - -/* - * These defines indicate whether to include various optional functions. - * Undefining some of these symbols will produce a smaller but less capable - * library. Note that you can leave certain source files out of the - * compilation/linking process if you've #undef'd the corresponding symbols. - * (You may HAVE to do that if your compiler doesn't like null source files.) - */ - -/* Capability options common to encoder and decoder: */ - -#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ -#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ -#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ - -/* Encoder capability options: */ - -#define C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ -#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ -#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ -#define DCT_SCALING_SUPPORTED /* Input rescaling via DCT? (Requires DCT_ISLOW)*/ -#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ -/* Note: if you selected 12-bit data precision, it is dangerous to turn off - * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit - * precision, so jchuff.c normally uses entropy optimization to compute - * usable tables for higher precision. If you don't want to do optimization, - * you'll have to supply different default Huffman tables. - * The exact same statements apply for progressive JPEG: the default tables - * don't work for progressive mode. (This may get fixed, however.) - */ -#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ - -/* Decoder capability options: */ - -#define D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ -#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ -#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ -#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ -#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ -#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ -#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ -#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ -#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ -#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ - -/* more capability options later, no doubt */ - - -/* - * Ordering of RGB data in scanlines passed to or from the application. - * If your application wants to deal with data in the order B,G,R, just - * change these macros. You can also deal with formats such as R,G,B,X - * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing - * the offsets will also change the order in which colormap data is organized. - * RESTRICTIONS: - * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. - * 2. The color quantizer modules will not behave desirably if RGB_PIXELSIZE - * is not 3 (they don't understand about dummy color components!). So you - * can't use color quantization if you change that value. - */ - -#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ -#define RGB_GREEN 1 /* Offset of Green */ -#define RGB_BLUE 2 /* Offset of Blue */ -#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ - - -/* Definitions for speed-related optimizations. */ - - -/* If your compiler supports inline functions, define INLINE - * as the inline keyword; otherwise define it as empty. - */ - -#ifndef INLINE -#ifdef __GNUC__ /* for instance, GNU C knows about inline */ -#define INLINE __inline__ -#endif -#ifndef INLINE -#define INLINE /* default is to define it as empty */ -#endif -#endif - - -/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying - * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER - * as short on such a machine. MULTIPLIER must be at least 16 bits wide. - */ - -#ifndef MULTIPLIER -#define MULTIPLIER int /* type for fastest integer multiply */ -#endif - - -/* FAST_FLOAT should be either float or double, whichever is done faster - * by your compiler. (Note that this type is only used in the floating point - * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) - * Typically, float is faster in ANSI C compilers, while double is faster in - * pre-ANSI compilers (because they insist on converting to double anyway). - * The code below therefore chooses float if we have ANSI-style prototypes. - */ - -#ifndef FAST_FLOAT -#ifdef HAVE_PROTOTYPES -#define FAST_FLOAT float -#else -#define FAST_FLOAT double -#endif -#endif - -#endif /* JPEG_INTERNAL_OPTIONS */ diff --git a/vendor/libjpeg/include/jpeglib.h b/vendor/libjpeg/include/jpeglib.h deleted file mode 100644 index 0a6dac4..0000000 --- a/vendor/libjpeg/include/jpeglib.h +++ /dev/null @@ -1,1173 +0,0 @@ -/* - * jpeglib.h - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * Modified 2002-2012 by Guido Vollbeding. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file defines the application interface for the JPEG library. - * Most applications using the library need only include this file, - * and perhaps jerror.h if they want to know the exact error codes. - */ - -#ifndef JPEGLIB_H -#define JPEGLIB_H - -/* - * First we include the configuration files that record how this - * installation of the JPEG library is set up. jconfig.h can be - * generated automatically for many systems. jmorecfg.h contains - * manual configuration options that most people need not worry about. - */ - -#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ -#include "jconfig.h" /* widely used configuration options */ -#endif -#include "jmorecfg.h" /* seldom changed options */ - - -#ifdef __cplusplus -#ifndef DONT_USE_EXTERN_C -extern "C" { -#endif -#endif - -/* Version IDs for the JPEG library. - * Might be useful for tests like "#if JPEG_LIB_VERSION >= 90". - */ - -#define JPEG_LIB_VERSION 90 /* Compatibility version 9.0 */ -#define JPEG_LIB_VERSION_MAJOR 9 -#define JPEG_LIB_VERSION_MINOR 0 - - -/* Various constants determining the sizes of things. - * All of these are specified by the JPEG standard, so don't change them - * if you want to be compatible. - */ - -#define DCTSIZE 8 /* The basic DCT block is 8x8 coefficients */ -#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ -#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ -#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ -#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ -#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ -#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ -/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; - * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. - * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU - * to handle it. We even let you do this from the jconfig.h file. However, - * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe - * sometimes emits noncompliant files doesn't mean you should too. - */ -#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ -#ifndef D_MAX_BLOCKS_IN_MCU -#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ -#endif - - -/* Data structures for images (arrays of samples and of DCT coefficients). - * On 80x86 machines, the image arrays are too big for near pointers, - * but the pointer arrays can fit in near memory. - */ - -typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ -typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ -typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ - -typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ -typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ -typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ -typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ - -typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ - - -/* Types for JPEG compression parameters and working tables. */ - - -/* DCT coefficient quantization tables. */ - -typedef struct { - /* This array gives the coefficient quantizers in natural array order - * (not the zigzag order in which they are stored in a JPEG DQT marker). - * CAUTION: IJG versions prior to v6a kept this array in zigzag order. - */ - UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ - /* This field is used only during compression. It's initialized FALSE when - * the table is created, and set TRUE when it's been output to the file. - * You could suppress output of a table by setting this to TRUE. - * (See jpeg_suppress_tables for an example.) - */ - boolean sent_table; /* TRUE when table has been output */ -} JQUANT_TBL; - - -/* Huffman coding tables. */ - -typedef struct { - /* These two fields directly represent the contents of a JPEG DHT marker */ - UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ - /* length k bits; bits[0] is unused */ - UINT8 huffval[256]; /* The symbols, in order of incr code length */ - /* This field is used only during compression. It's initialized FALSE when - * the table is created, and set TRUE when it's been output to the file. - * You could suppress output of a table by setting this to TRUE. - * (See jpeg_suppress_tables for an example.) - */ - boolean sent_table; /* TRUE when table has been output */ -} JHUFF_TBL; - - -/* Basic info about one component (color channel). */ - -typedef struct { - /* These values are fixed over the whole image. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOF marker. */ - int component_id; /* identifier for this component (0..255) */ - int component_index; /* its index in SOF or cinfo->comp_info[] */ - int h_samp_factor; /* horizontal sampling factor (1..4) */ - int v_samp_factor; /* vertical sampling factor (1..4) */ - int quant_tbl_no; /* quantization table selector (0..3) */ - /* These values may vary between scans. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOS marker. */ - /* The decompressor output side may not use these variables. */ - int dc_tbl_no; /* DC entropy table selector (0..3) */ - int ac_tbl_no; /* AC entropy table selector (0..3) */ - - /* Remaining fields should be treated as private by applications. */ - - /* These values are computed during compression or decompression startup: */ - /* Component's size in DCT blocks. - * Any dummy blocks added to complete an MCU are not counted; therefore - * these values do not depend on whether a scan is interleaved or not. - */ - JDIMENSION width_in_blocks; - JDIMENSION height_in_blocks; - /* Size of a DCT block in samples, - * reflecting any scaling we choose to apply during the DCT step. - * Values from 1 to 16 are supported. - * Note that different components may receive different DCT scalings. - */ - int DCT_h_scaled_size; - int DCT_v_scaled_size; - /* The downsampled dimensions are the component's actual, unpadded number - * of samples at the main buffer (preprocessing/compression interface); - * DCT scaling is included, so - * downsampled_width = ceil(image_width * Hi/Hmax * DCT_h_scaled_size/DCTSIZE) - * and similarly for height. - */ - JDIMENSION downsampled_width; /* actual width in samples */ - JDIMENSION downsampled_height; /* actual height in samples */ - /* This flag is used only for decompression. In cases where some of the - * components will be ignored (eg grayscale output from YCbCr image), - * we can skip most computations for the unused components. - */ - boolean component_needed; /* do we need the value of this component? */ - - /* These values are computed before starting a scan of the component. */ - /* The decompressor output side may not use these variables. */ - int MCU_width; /* number of blocks per MCU, horizontally */ - int MCU_height; /* number of blocks per MCU, vertically */ - int MCU_blocks; /* MCU_width * MCU_height */ - int MCU_sample_width; /* MCU width in samples: MCU_width * DCT_h_scaled_size */ - int last_col_width; /* # of non-dummy blocks across in last MCU */ - int last_row_height; /* # of non-dummy blocks down in last MCU */ - - /* Saved quantization table for component; NULL if none yet saved. - * See jdinput.c comments about the need for this information. - * This field is currently used only for decompression. - */ - JQUANT_TBL * quant_table; - - /* Private per-component storage for DCT or IDCT subsystem. */ - void * dct_table; -} jpeg_component_info; - - -/* The script for encoding a multiple-scan file is an array of these: */ - -typedef struct { - int comps_in_scan; /* number of components encoded in this scan */ - int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ - int Ss, Se; /* progressive JPEG spectral selection parms */ - int Ah, Al; /* progressive JPEG successive approx. parms */ -} jpeg_scan_info; - -/* The decompressor can save APPn and COM markers in a list of these: */ - -typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; - -struct jpeg_marker_struct { - jpeg_saved_marker_ptr next; /* next in list, or NULL */ - UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ - unsigned int original_length; /* # bytes of data in the file */ - unsigned int data_length; /* # bytes of data saved at data[] */ - JOCTET FAR * data; /* the data contained in the marker */ - /* the marker length word is not counted in data_length or original_length */ -}; - -/* Known color spaces. */ - -typedef enum { - JCS_UNKNOWN, /* error/unspecified */ - JCS_GRAYSCALE, /* monochrome */ - JCS_RGB, /* red/green/blue */ - JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ - JCS_CMYK, /* C/M/Y/K */ - JCS_YCCK /* Y/Cb/Cr/K */ -} J_COLOR_SPACE; - -/* Supported color transforms. */ - -typedef enum { - JCT_NONE = 0, - JCT_SUBTRACT_GREEN = 1 -} J_COLOR_TRANSFORM; - -/* DCT/IDCT algorithm options. */ - -typedef enum { - JDCT_ISLOW, /* slow but accurate integer algorithm */ - JDCT_IFAST, /* faster, less accurate integer method */ - JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ -} J_DCT_METHOD; - -#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ -#define JDCT_DEFAULT JDCT_ISLOW -#endif -#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ -#define JDCT_FASTEST JDCT_IFAST -#endif - -/* Dithering options for decompression. */ - -typedef enum { - JDITHER_NONE, /* no dithering */ - JDITHER_ORDERED, /* simple ordered dither */ - JDITHER_FS /* Floyd-Steinberg error diffusion dither */ -} J_DITHER_MODE; - - -/* Common fields between JPEG compression and decompression master structs. */ - -#define jpeg_common_fields \ - struct jpeg_error_mgr * err; /* Error handler module */\ - struct jpeg_memory_mgr * mem; /* Memory manager module */\ - struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ - void * client_data; /* Available for use by application */\ - boolean is_decompressor; /* So common code can tell which is which */\ - int global_state /* For checking call sequence validity */ - -/* Routines that are to be used by both halves of the library are declared - * to receive a pointer to this structure. There are no actual instances of - * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. - */ -struct jpeg_common_struct { - jpeg_common_fields; /* Fields common to both master struct types */ - /* Additional fields follow in an actual jpeg_compress_struct or - * jpeg_decompress_struct. All three structs must agree on these - * initial fields! (This would be a lot cleaner in C++.) - */ -}; - -typedef struct jpeg_common_struct * j_common_ptr; -typedef struct jpeg_compress_struct * j_compress_ptr; -typedef struct jpeg_decompress_struct * j_decompress_ptr; - - -/* Master record for a compression instance */ - -struct jpeg_compress_struct { - jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ - - /* Destination for compressed data */ - struct jpeg_destination_mgr * dest; - - /* Description of source image --- these fields must be filled in by - * outer application before starting compression. in_color_space must - * be correct before you can even call jpeg_set_defaults(). - */ - - JDIMENSION image_width; /* input image width */ - JDIMENSION image_height; /* input image height */ - int input_components; /* # of color components in input image */ - J_COLOR_SPACE in_color_space; /* colorspace of input image */ - - double input_gamma; /* image gamma of input image */ - - /* Compression parameters --- these fields must be set before calling - * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to - * initialize everything to reasonable defaults, then changing anything - * the application specifically wants to change. That way you won't get - * burnt when new parameters are added. Also note that there are several - * helper routines to simplify changing parameters. - */ - - unsigned int scale_num, scale_denom; /* fraction by which to scale image */ - - JDIMENSION jpeg_width; /* scaled JPEG image width */ - JDIMENSION jpeg_height; /* scaled JPEG image height */ - /* Dimensions of actual JPEG image that will be written to file, - * derived from input dimensions by scaling factors above. - * These fields are computed by jpeg_start_compress(). - * You can also use jpeg_calc_jpeg_dimensions() to determine these values - * in advance of calling jpeg_start_compress(). - */ - - int data_precision; /* bits of precision in image data */ - - int num_components; /* # of color components in JPEG image */ - J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ - - jpeg_component_info * comp_info; - /* comp_info[i] describes component that appears i'th in SOF */ - - JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; - int q_scale_factor[NUM_QUANT_TBLS]; - /* ptrs to coefficient quantization tables, or NULL if not defined, - * and corresponding scale factors (percentage, initialized 100). - */ - - JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; - JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; - /* ptrs to Huffman coding tables, or NULL if not defined */ - - UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ - UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ - UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ - - int num_scans; /* # of entries in scan_info array */ - const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ - /* The default value of scan_info is NULL, which causes a single-scan - * sequential JPEG file to be emitted. To create a multi-scan file, - * set num_scans and scan_info to point to an array of scan definitions. - */ - - boolean raw_data_in; /* TRUE=caller supplies downsampled data */ - boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ - boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ - boolean CCIR601_sampling; /* TRUE=first samples are cosited */ - boolean do_fancy_downsampling; /* TRUE=apply fancy downsampling */ - int smoothing_factor; /* 1..100, or 0 for no input smoothing */ - J_DCT_METHOD dct_method; /* DCT algorithm selector */ - - /* The restart interval can be specified in absolute MCUs by setting - * restart_interval, or in MCU rows by setting restart_in_rows - * (in which case the correct restart_interval will be figured - * for each scan). - */ - unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ - int restart_in_rows; /* if > 0, MCU rows per restart interval */ - - /* Parameters controlling emission of special markers. */ - - boolean write_JFIF_header; /* should a JFIF marker be written? */ - UINT8 JFIF_major_version; /* What to write for the JFIF version number */ - UINT8 JFIF_minor_version; - /* These three values are not used by the JPEG code, merely copied */ - /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ - /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ - /* ratio is defined by X_density/Y_density even when density_unit=0. */ - UINT8 density_unit; /* JFIF code for pixel size units */ - UINT16 X_density; /* Horizontal pixel density */ - UINT16 Y_density; /* Vertical pixel density */ - boolean write_Adobe_marker; /* should an Adobe marker be written? */ - - J_COLOR_TRANSFORM color_transform; - /* Color transform identifier, writes LSE marker if nonzero */ - - /* State variable: index of next scanline to be written to - * jpeg_write_scanlines(). Application may use this to control its - * processing loop, e.g., "while (next_scanline < image_height)". - */ - - JDIMENSION next_scanline; /* 0 .. image_height-1 */ - - /* Remaining fields are known throughout compressor, but generally - * should not be touched by a surrounding application. - */ - - /* - * These fields are computed during compression startup - */ - boolean progressive_mode; /* TRUE if scan script uses progressive mode */ - int max_h_samp_factor; /* largest h_samp_factor */ - int max_v_samp_factor; /* largest v_samp_factor */ - - int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ - int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ - - JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ - /* The coefficient controller receives data in units of MCU rows as defined - * for fully interleaved scans (whether the JPEG file is interleaved or not). - * There are v_samp_factor * DCTSIZE sample rows of each component in an - * "iMCU" (interleaved MCU) row. - */ - - /* - * These fields are valid during any one scan. - * They describe the components and MCUs actually appearing in the scan. - */ - int comps_in_scan; /* # of JPEG components in this scan */ - jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; - /* *cur_comp_info[i] describes component that appears i'th in SOS */ - - JDIMENSION MCUs_per_row; /* # of MCUs across the image */ - JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ - - int blocks_in_MCU; /* # of DCT blocks per MCU */ - int MCU_membership[C_MAX_BLOCKS_IN_MCU]; - /* MCU_membership[i] is index in cur_comp_info of component owning */ - /* i'th block in an MCU */ - - int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ - - int block_size; /* the basic DCT block size: 1..16 */ - const int * natural_order; /* natural-order position array */ - int lim_Se; /* min( Se, DCTSIZE2-1 ) */ - - /* - * Links to compression subobjects (methods and private variables of modules) - */ - struct jpeg_comp_master * master; - struct jpeg_c_main_controller * main; - struct jpeg_c_prep_controller * prep; - struct jpeg_c_coef_controller * coef; - struct jpeg_marker_writer * marker; - struct jpeg_color_converter * cconvert; - struct jpeg_downsampler * downsample; - struct jpeg_forward_dct * fdct; - struct jpeg_entropy_encoder * entropy; - jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ - int script_space_size; -}; - - -/* Master record for a decompression instance */ - -struct jpeg_decompress_struct { - jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ - - /* Source of compressed data */ - struct jpeg_source_mgr * src; - - /* Basic description of image --- filled in by jpeg_read_header(). */ - /* Application may inspect these values to decide how to process image. */ - - JDIMENSION image_width; /* nominal image width (from SOF marker) */ - JDIMENSION image_height; /* nominal image height */ - int num_components; /* # of color components in JPEG image */ - J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ - - /* Decompression processing parameters --- these fields must be set before - * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes - * them to default values. - */ - - J_COLOR_SPACE out_color_space; /* colorspace for output */ - - unsigned int scale_num, scale_denom; /* fraction by which to scale image */ - - double output_gamma; /* image gamma wanted in output */ - - boolean buffered_image; /* TRUE=multiple output passes */ - boolean raw_data_out; /* TRUE=downsampled data wanted */ - - J_DCT_METHOD dct_method; /* IDCT algorithm selector */ - boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ - boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ - - boolean quantize_colors; /* TRUE=colormapped output wanted */ - /* the following are ignored if not quantize_colors: */ - J_DITHER_MODE dither_mode; /* type of color dithering to use */ - boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ - int desired_number_of_colors; /* max # colors to use in created colormap */ - /* these are significant only in buffered-image mode: */ - boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ - boolean enable_external_quant;/* enable future use of external colormap */ - boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ - - /* Description of actual output image that will be returned to application. - * These fields are computed by jpeg_start_decompress(). - * You can also use jpeg_calc_output_dimensions() to determine these values - * in advance of calling jpeg_start_decompress(). - */ - - JDIMENSION output_width; /* scaled image width */ - JDIMENSION output_height; /* scaled image height */ - int out_color_components; /* # of color components in out_color_space */ - int output_components; /* # of color components returned */ - /* output_components is 1 (a colormap index) when quantizing colors; - * otherwise it equals out_color_components. - */ - int rec_outbuf_height; /* min recommended height of scanline buffer */ - /* If the buffer passed to jpeg_read_scanlines() is less than this many rows - * high, space and time will be wasted due to unnecessary data copying. - * Usually rec_outbuf_height will be 1 or 2, at most 4. - */ - - /* When quantizing colors, the output colormap is described by these fields. - * The application can supply a colormap by setting colormap non-NULL before - * calling jpeg_start_decompress; otherwise a colormap is created during - * jpeg_start_decompress or jpeg_start_output. - * The map has out_color_components rows and actual_number_of_colors columns. - */ - int actual_number_of_colors; /* number of entries in use */ - JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ - - /* State variables: these variables indicate the progress of decompression. - * The application may examine these but must not modify them. - */ - - /* Row index of next scanline to be read from jpeg_read_scanlines(). - * Application may use this to control its processing loop, e.g., - * "while (output_scanline < output_height)". - */ - JDIMENSION output_scanline; /* 0 .. output_height-1 */ - - /* Current input scan number and number of iMCU rows completed in scan. - * These indicate the progress of the decompressor input side. - */ - int input_scan_number; /* Number of SOS markers seen so far */ - JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ - - /* The "output scan number" is the notional scan being displayed by the - * output side. The decompressor will not allow output scan/row number - * to get ahead of input scan/row, but it can fall arbitrarily far behind. - */ - int output_scan_number; /* Nominal scan number being displayed */ - JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ - - /* Current progression status. coef_bits[c][i] indicates the precision - * with which component c's DCT coefficient i (in zigzag order) is known. - * It is -1 when no data has yet been received, otherwise it is the point - * transform (shift) value for the most recent scan of the coefficient - * (thus, 0 at completion of the progression). - * This pointer is NULL when reading a non-progressive file. - */ - int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ - - /* Internal JPEG parameters --- the application usually need not look at - * these fields. Note that the decompressor output side may not use - * any parameters that can change between scans. - */ - - /* Quantization and Huffman tables are carried forward across input - * datastreams when processing abbreviated JPEG datastreams. - */ - - JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; - /* ptrs to coefficient quantization tables, or NULL if not defined */ - - JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; - JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; - /* ptrs to Huffman coding tables, or NULL if not defined */ - - /* These parameters are never carried across datastreams, since they - * are given in SOF/SOS markers or defined to be reset by SOI. - */ - - int data_precision; /* bits of precision in image data */ - - jpeg_component_info * comp_info; - /* comp_info[i] describes component that appears i'th in SOF */ - - boolean is_baseline; /* TRUE if Baseline SOF0 encountered */ - boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ - boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ - - UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ - UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ - UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ - - unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ - - /* These fields record data obtained from optional markers recognized by - * the JPEG library. - */ - boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ - /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ - UINT8 JFIF_major_version; /* JFIF version number */ - UINT8 JFIF_minor_version; - UINT8 density_unit; /* JFIF code for pixel size units */ - UINT16 X_density; /* Horizontal pixel density */ - UINT16 Y_density; /* Vertical pixel density */ - boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ - UINT8 Adobe_transform; /* Color transform code from Adobe marker */ - - J_COLOR_TRANSFORM color_transform; - /* Color transform identifier derived from LSE marker, otherwise zero */ - - boolean CCIR601_sampling; /* TRUE=first samples are cosited */ - - /* Aside from the specific data retained from APPn markers known to the - * library, the uninterpreted contents of any or all APPn and COM markers - * can be saved in a list for examination by the application. - */ - jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ - - /* Remaining fields are known throughout decompressor, but generally - * should not be touched by a surrounding application. - */ - - /* - * These fields are computed during decompression startup - */ - int max_h_samp_factor; /* largest h_samp_factor */ - int max_v_samp_factor; /* largest v_samp_factor */ - - int min_DCT_h_scaled_size; /* smallest DCT_h_scaled_size of any component */ - int min_DCT_v_scaled_size; /* smallest DCT_v_scaled_size of any component */ - - JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ - /* The coefficient controller's input and output progress is measured in - * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows - * in fully interleaved JPEG scans, but are used whether the scan is - * interleaved or not. We define an iMCU row as v_samp_factor DCT block - * rows of each component. Therefore, the IDCT output contains - * v_samp_factor*DCT_v_scaled_size sample rows of a component per iMCU row. - */ - - JSAMPLE * sample_range_limit; /* table for fast range-limiting */ - - /* - * These fields are valid during any one scan. - * They describe the components and MCUs actually appearing in the scan. - * Note that the decompressor output side must not use these fields. - */ - int comps_in_scan; /* # of JPEG components in this scan */ - jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; - /* *cur_comp_info[i] describes component that appears i'th in SOS */ - - JDIMENSION MCUs_per_row; /* # of MCUs across the image */ - JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ - - int blocks_in_MCU; /* # of DCT blocks per MCU */ - int MCU_membership[D_MAX_BLOCKS_IN_MCU]; - /* MCU_membership[i] is index in cur_comp_info of component owning */ - /* i'th block in an MCU */ - - int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ - - /* These fields are derived from Se of first SOS marker. - */ - int block_size; /* the basic DCT block size: 1..16 */ - const int * natural_order; /* natural-order position array for entropy decode */ - int lim_Se; /* min( Se, DCTSIZE2-1 ) for entropy decode */ - - /* This field is shared between entropy decoder and marker parser. - * It is either zero or the code of a JPEG marker that has been - * read from the data source, but has not yet been processed. - */ - int unread_marker; - - /* - * Links to decompression subobjects (methods, private variables of modules) - */ - struct jpeg_decomp_master * master; - struct jpeg_d_main_controller * main; - struct jpeg_d_coef_controller * coef; - struct jpeg_d_post_controller * post; - struct jpeg_input_controller * inputctl; - struct jpeg_marker_reader * marker; - struct jpeg_entropy_decoder * entropy; - struct jpeg_inverse_dct * idct; - struct jpeg_upsampler * upsample; - struct jpeg_color_deconverter * cconvert; - struct jpeg_color_quantizer * cquantize; -}; - - -/* "Object" declarations for JPEG modules that may be supplied or called - * directly by the surrounding application. - * As with all objects in the JPEG library, these structs only define the - * publicly visible methods and state variables of a module. Additional - * private fields may exist after the public ones. - */ - - -/* Error handler object */ - -struct jpeg_error_mgr { - /* Error exit handler: does not return to caller */ - JMETHOD(noreturn_t, error_exit, (j_common_ptr cinfo)); - /* Conditionally emit a trace or warning message */ - JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); - /* Routine that actually outputs a trace or error message */ - JMETHOD(void, output_message, (j_common_ptr cinfo)); - /* Format a message string for the most recent JPEG error or message */ - JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); -#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ - /* Reset error state variables at start of a new image */ - JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); - - /* The message ID code and any parameters are saved here. - * A message can have one string parameter or up to 8 int parameters. - */ - int msg_code; -#define JMSG_STR_PARM_MAX 80 - union { - int i[8]; - char s[JMSG_STR_PARM_MAX]; - } msg_parm; - - /* Standard state variables for error facility */ - - int trace_level; /* max msg_level that will be displayed */ - - /* For recoverable corrupt-data errors, we emit a warning message, - * but keep going unless emit_message chooses to abort. emit_message - * should count warnings in num_warnings. The surrounding application - * can check for bad data by seeing if num_warnings is nonzero at the - * end of processing. - */ - long num_warnings; /* number of corrupt-data warnings */ - - /* These fields point to the table(s) of error message strings. - * An application can change the table pointer to switch to a different - * message list (typically, to change the language in which errors are - * reported). Some applications may wish to add additional error codes - * that will be handled by the JPEG library error mechanism; the second - * table pointer is used for this purpose. - * - * First table includes all errors generated by JPEG library itself. - * Error code 0 is reserved for a "no such error string" message. - */ - const char * const * jpeg_message_table; /* Library errors */ - int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ - /* Second table can be added by application (see cjpeg/djpeg for example). - * It contains strings numbered first_addon_message..last_addon_message. - */ - const char * const * addon_message_table; /* Non-library errors */ - int first_addon_message; /* code for first string in addon table */ - int last_addon_message; /* code for last string in addon table */ -}; - - -/* Progress monitor object */ - -struct jpeg_progress_mgr { - JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); - - long pass_counter; /* work units completed in this pass */ - long pass_limit; /* total number of work units in this pass */ - int completed_passes; /* passes completed so far */ - int total_passes; /* total number of passes expected */ -}; - - -/* Data destination object for compression */ - -struct jpeg_destination_mgr { - JOCTET * next_output_byte; /* => next byte to write in buffer */ - size_t free_in_buffer; /* # of byte spaces remaining in buffer */ - - JMETHOD(void, init_destination, (j_compress_ptr cinfo)); - JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); - JMETHOD(void, term_destination, (j_compress_ptr cinfo)); -}; - - -/* Data source object for decompression */ - -struct jpeg_source_mgr { - const JOCTET * next_input_byte; /* => next byte to read from buffer */ - size_t bytes_in_buffer; /* # of bytes remaining in buffer */ - - JMETHOD(void, init_source, (j_decompress_ptr cinfo)); - JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); - JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); - JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); - JMETHOD(void, term_source, (j_decompress_ptr cinfo)); -}; - - -/* Memory manager object. - * Allocates "small" objects (a few K total), "large" objects (tens of K), - * and "really big" objects (virtual arrays with backing store if needed). - * The memory manager does not allow individual objects to be freed; rather, - * each created object is assigned to a pool, and whole pools can be freed - * at once. This is faster and more convenient than remembering exactly what - * to free, especially where malloc()/free() are not too speedy. - * NB: alloc routines never return NULL. They exit to error_exit if not - * successful. - */ - -#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ -#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ -#define JPOOL_NUMPOOLS 2 - -typedef struct jvirt_sarray_control * jvirt_sarray_ptr; -typedef struct jvirt_barray_control * jvirt_barray_ptr; - - -struct jpeg_memory_mgr { - /* Method pointers */ - JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, - size_t sizeofobject)); - JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, - size_t sizeofobject)); - JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, - JDIMENSION samplesperrow, - JDIMENSION numrows)); - JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, - JDIMENSION blocksperrow, - JDIMENSION numrows)); - JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, - int pool_id, - boolean pre_zero, - JDIMENSION samplesperrow, - JDIMENSION numrows, - JDIMENSION maxaccess)); - JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, - int pool_id, - boolean pre_zero, - JDIMENSION blocksperrow, - JDIMENSION numrows, - JDIMENSION maxaccess)); - JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); - JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, - jvirt_sarray_ptr ptr, - JDIMENSION start_row, - JDIMENSION num_rows, - boolean writable)); - JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, - jvirt_barray_ptr ptr, - JDIMENSION start_row, - JDIMENSION num_rows, - boolean writable)); - JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); - JMETHOD(void, self_destruct, (j_common_ptr cinfo)); - - /* Limit on memory allocation for this JPEG object. (Note that this is - * merely advisory, not a guaranteed maximum; it only affects the space - * used for virtual-array buffers.) May be changed by outer application - * after creating the JPEG object. - */ - long max_memory_to_use; - - /* Maximum allocation request accepted by alloc_large. */ - long max_alloc_chunk; -}; - - -/* Routine signature for application-supplied marker processing methods. - * Need not pass marker code since it is stored in cinfo->unread_marker. - */ -typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); - - -/* Declarations for routines called by application. - * The JPP macro hides prototype parameters from compilers that can't cope. - * Note JPP requires double parentheses. - */ - -#ifdef HAVE_PROTOTYPES -#define JPP(arglist) arglist -#else -#define JPP(arglist) () -#endif - - -/* Short forms of external names for systems with brain-damaged linkers. - * We shorten external names to be unique in the first six letters, which - * is good enough for all known systems. - * (If your compiler itself needs names to be unique in less than 15 - * characters, you are out of luck. Get a better compiler.) - */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_std_error jStdError -#define jpeg_CreateCompress jCreaCompress -#define jpeg_CreateDecompress jCreaDecompress -#define jpeg_destroy_compress jDestCompress -#define jpeg_destroy_decompress jDestDecompress -#define jpeg_stdio_dest jStdDest -#define jpeg_stdio_src jStdSrc -#define jpeg_mem_dest jMemDest -#define jpeg_mem_src jMemSrc -#define jpeg_set_defaults jSetDefaults -#define jpeg_set_colorspace jSetColorspace -#define jpeg_default_colorspace jDefColorspace -#define jpeg_set_quality jSetQuality -#define jpeg_set_linear_quality jSetLQuality -#define jpeg_default_qtables jDefQTables -#define jpeg_add_quant_table jAddQuantTable -#define jpeg_quality_scaling jQualityScaling -#define jpeg_simple_progression jSimProgress -#define jpeg_suppress_tables jSuppressTables -#define jpeg_alloc_quant_table jAlcQTable -#define jpeg_alloc_huff_table jAlcHTable -#define jpeg_start_compress jStrtCompress -#define jpeg_write_scanlines jWrtScanlines -#define jpeg_finish_compress jFinCompress -#define jpeg_calc_jpeg_dimensions jCjpegDimensions -#define jpeg_write_raw_data jWrtRawData -#define jpeg_write_marker jWrtMarker -#define jpeg_write_m_header jWrtMHeader -#define jpeg_write_m_byte jWrtMByte -#define jpeg_write_tables jWrtTables -#define jpeg_read_header jReadHeader -#define jpeg_start_decompress jStrtDecompress -#define jpeg_read_scanlines jReadScanlines -#define jpeg_finish_decompress jFinDecompress -#define jpeg_read_raw_data jReadRawData -#define jpeg_has_multiple_scans jHasMultScn -#define jpeg_start_output jStrtOutput -#define jpeg_finish_output jFinOutput -#define jpeg_input_complete jInComplete -#define jpeg_new_colormap jNewCMap -#define jpeg_consume_input jConsumeInput -#define jpeg_core_output_dimensions jCoreDimensions -#define jpeg_calc_output_dimensions jCalcDimensions -#define jpeg_save_markers jSaveMarkers -#define jpeg_set_marker_processor jSetMarker -#define jpeg_read_coefficients jReadCoefs -#define jpeg_write_coefficients jWrtCoefs -#define jpeg_copy_critical_parameters jCopyCrit -#define jpeg_abort_compress jAbrtCompress -#define jpeg_abort_decompress jAbrtDecompress -#define jpeg_abort jAbort -#define jpeg_destroy jDestroy -#define jpeg_resync_to_restart jResyncRestart -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* Default error-management setup */ -EXTERN(struct jpeg_error_mgr *) jpeg_std_error - JPP((struct jpeg_error_mgr * err)); - -/* Initialization of JPEG compression objects. - * jpeg_create_compress() and jpeg_create_decompress() are the exported - * names that applications should call. These expand to calls on - * jpeg_CreateCompress and jpeg_CreateDecompress with additional information - * passed for version mismatch checking. - * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. - */ -#define jpeg_create_compress(cinfo) \ - jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ - (size_t) sizeof(struct jpeg_compress_struct)) -#define jpeg_create_decompress(cinfo) \ - jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ - (size_t) sizeof(struct jpeg_decompress_struct)) -EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, - int version, size_t structsize)); -EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, - int version, size_t structsize)); -/* Destruction of JPEG compression objects */ -EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); - -/* Standard data source and destination managers: stdio streams. */ -/* Caller is responsible for opening the file before and closing after. */ -EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); -EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); - -/* Data source and destination managers: memory buffers. */ -EXTERN(void) jpeg_mem_dest JPP((j_compress_ptr cinfo, - unsigned char ** outbuffer, - unsigned long * outsize)); -EXTERN(void) jpeg_mem_src JPP((j_decompress_ptr cinfo, - unsigned char * inbuffer, - unsigned long insize)); - -/* Default parameter setup for compression */ -EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); -/* Compression parameter setup aids */ -EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, - J_COLOR_SPACE colorspace)); -EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, - boolean force_baseline)); -EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, - int scale_factor, - boolean force_baseline)); -EXTERN(void) jpeg_default_qtables JPP((j_compress_ptr cinfo, - boolean force_baseline)); -EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, - const unsigned int *basic_table, - int scale_factor, - boolean force_baseline)); -EXTERN(int) jpeg_quality_scaling JPP((int quality)); -EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, - boolean suppress)); -EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); -EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); - -/* Main entry points for compression */ -EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, - boolean write_all_tables)); -EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, - JSAMPARRAY scanlines, - JDIMENSION num_lines)); -EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); - -/* Precalculate JPEG dimensions for current compression parameters. */ -EXTERN(void) jpeg_calc_jpeg_dimensions JPP((j_compress_ptr cinfo)); - -/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ -EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, - JSAMPIMAGE data, - JDIMENSION num_lines)); - -/* Write a special marker. See libjpeg.txt concerning safe usage. */ -EXTERN(void) jpeg_write_marker - JPP((j_compress_ptr cinfo, int marker, - const JOCTET * dataptr, unsigned int datalen)); -/* Same, but piecemeal. */ -EXTERN(void) jpeg_write_m_header - JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); -EXTERN(void) jpeg_write_m_byte - JPP((j_compress_ptr cinfo, int val)); - -/* Alternate compression function: just write an abbreviated table file */ -EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); - -/* Decompression startup: read start of JPEG datastream to see what's there */ -EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, - boolean require_image)); -/* Return value is one of: */ -#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ -#define JPEG_HEADER_OK 1 /* Found valid image datastream */ -#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ -/* If you pass require_image = TRUE (normal case), you need not check for - * a TABLES_ONLY return code; an abbreviated file will cause an error exit. - * JPEG_SUSPENDED is only possible if you use a data source module that can - * give a suspension return (the stdio source module doesn't). - */ - -/* Main entry points for decompression */ -EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); -EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, - JSAMPARRAY scanlines, - JDIMENSION max_lines)); -EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); - -/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ -EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, - JSAMPIMAGE data, - JDIMENSION max_lines)); - -/* Additional entry points for buffered-image mode. */ -EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); -EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, - int scan_number)); -EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); -EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); -EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); -/* Return value is one of: */ -/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ -#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ -#define JPEG_REACHED_EOI 2 /* Reached end of image */ -#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ -#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ - -/* Precalculate output dimensions for current decompression parameters. */ -EXTERN(void) jpeg_core_output_dimensions JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); - -/* Control saving of COM and APPn markers into marker_list. */ -EXTERN(void) jpeg_save_markers - JPP((j_decompress_ptr cinfo, int marker_code, - unsigned int length_limit)); - -/* Install a special processing method for COM or APPn markers. */ -EXTERN(void) jpeg_set_marker_processor - JPP((j_decompress_ptr cinfo, int marker_code, - jpeg_marker_parser_method routine)); - -/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ -EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, - jvirt_barray_ptr * coef_arrays)); -EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, - j_compress_ptr dstinfo)); - -/* If you choose to abort compression or decompression before completing - * jpeg_finish_(de)compress, then you need to clean up to release memory, - * temporary files, etc. You can just call jpeg_destroy_(de)compress - * if you're done with the JPEG object, but if you want to clean it up and - * reuse it, call this: - */ -EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); - -/* Generic versions of jpeg_abort and jpeg_destroy that work on either - * flavor of JPEG object. These may be more convenient in some places. - */ -EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); -EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); - -/* Default restart-marker-resync procedure for use by data source modules */ -EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, - int desired)); - - -/* These marker codes are exported since applications and data source modules - * are likely to want to use them. - */ - -#define JPEG_RST0 0xD0 /* RST0 marker code */ -#define JPEG_EOI 0xD9 /* EOI marker code */ -#define JPEG_APP0 0xE0 /* APP0 marker code */ -#define JPEG_COM 0xFE /* COM marker code */ - - -/* If we have a brain-damaged compiler that emits warnings (or worse, errors) - * for structure definitions that are never filled in, keep it quiet by - * supplying dummy definitions for the various substructures. - */ - -#ifdef INCOMPLETE_TYPES_BROKEN -#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ -struct jvirt_sarray_control { long dummy; }; -struct jvirt_barray_control { long dummy; }; -struct jpeg_comp_master { long dummy; }; -struct jpeg_c_main_controller { long dummy; }; -struct jpeg_c_prep_controller { long dummy; }; -struct jpeg_c_coef_controller { long dummy; }; -struct jpeg_marker_writer { long dummy; }; -struct jpeg_color_converter { long dummy; }; -struct jpeg_downsampler { long dummy; }; -struct jpeg_forward_dct { long dummy; }; -struct jpeg_entropy_encoder { long dummy; }; -struct jpeg_decomp_master { long dummy; }; -struct jpeg_d_main_controller { long dummy; }; -struct jpeg_d_coef_controller { long dummy; }; -struct jpeg_d_post_controller { long dummy; }; -struct jpeg_input_controller { long dummy; }; -struct jpeg_marker_reader { long dummy; }; -struct jpeg_entropy_decoder { long dummy; }; -struct jpeg_inverse_dct { long dummy; }; -struct jpeg_upsampler { long dummy; }; -struct jpeg_color_deconverter { long dummy; }; -struct jpeg_color_quantizer { long dummy; }; -#endif /* JPEG_INTERNALS */ -#endif /* INCOMPLETE_TYPES_BROKEN */ - - -/* - * The JPEG library modules define JPEG_INTERNALS before including this file. - * The internal structure declarations are read only when that is true. - * Applications using the library should not include jpegint.h, but may wish - * to include jerror.h. - */ - -#ifdef JPEG_INTERNALS -#include "jpegint.h" /* fetch private declarations */ -#include "jerror.h" /* fetch error codes too */ -#endif - -#ifdef __cplusplus -#ifndef DONT_USE_EXTERN_C -} -#endif -#endif - -#endif /* JPEGLIB_H */ diff --git a/vendor/libjpeg/lib/x86/libjpeg.lib b/vendor/libjpeg/lib/x86/libjpeg.lib deleted file mode 100644 index 3476bbedb85b4ec24e4d3b843ac329b0389b911f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311844 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

4Rm%Cs1TCq<&i%4fVDS| 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

6)N%z`1etXM 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

DENcusCQG$dRp`-PntV`PHIcT68y5k1A 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%0A+D8=p-^Q$bjvw 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%0DxhL0W|+ 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 $)Nh<>bLk9yx!wLol2GEKU&?G5n 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 NI2fm;86X1&E&%^}JBa`Q diff --git a/vendor/libpng/include/png.h b/vendor/libpng/include/png.h deleted file mode 100644 index f2013cf..0000000 --- a/vendor/libpng/include/png.h +++ /dev/null @@ -1,3265 +0,0 @@ - -/* png.h - header file for PNG reference library - * - * libpng version 1.6.18, July 23, 2015 - * - * Copyright (c) 1998-2015 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license (See LICENSE, below) - * - * Authors and maintainers: - * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat - * libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger - * libpng versions 0.97, January 1998, through 1.6.18, July 23, 2015: Glenn - * See also "Contributing Authors", below. - * - * Note about libpng version numbers: - * - * Due to various miscommunications, unforeseen code incompatibilities - * and occasional factors outside the authors' control, version numbering - * on the library has not always been consistent and straightforward. - * The following table summarizes matters since version 0.89c, which was - * the first widely used release: - * - * source png.h png.h shared-lib - * version string int version - * ------- ------ ----- ---------- - * 0.89c "1.0 beta 3" 0.89 89 1.0.89 - * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90] - * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95] - * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96] - * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97] - * 0.97c 0.97 97 2.0.97 - * 0.98 0.98 98 2.0.98 - * 0.99 0.99 98 2.0.99 - * 0.99a-m 0.99 99 2.0.99 - * 1.00 1.00 100 2.1.0 [100 should be 10000] - * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000] - * 1.0.1 png.h string is 10001 2.1.0 - * 1.0.1a-e identical to the 10002 from here on, the shared library - * 1.0.2 source version) 10002 is 2.V where V is the source code - * 1.0.2a-b 10003 version, except as noted. - * 1.0.3 10003 - * 1.0.3a-d 10004 - * 1.0.4 10004 - * 1.0.4a-f 10005 - * 1.0.5 (+ 2 patches) 10005 - * 1.0.5a-d 10006 - * 1.0.5e-r 10100 (not source compatible) - * 1.0.5s-v 10006 (not binary compatible) - * 1.0.6 (+ 3 patches) 10006 (still binary incompatible) - * 1.0.6d-f 10007 (still binary incompatible) - * 1.0.6g 10007 - * 1.0.6h 10007 10.6h (testing xy.z so-numbering) - * 1.0.6i 10007 10.6i - * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0) - * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible) - * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible) - * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible) - * 1.0.7 1 10007 (still compatible) - * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4 - * 1.0.8rc1 1 10008 2.1.0.8rc1 - * 1.0.8 1 10008 2.1.0.8 - * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6 - * 1.0.9rc1 1 10009 2.1.0.9rc1 - * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10 - * 1.0.9rc2 1 10009 2.1.0.9rc2 - * 1.0.9 1 10009 2.1.0.9 - * 1.0.10beta1 1 10010 2.1.0.10beta1 - * 1.0.10rc1 1 10010 2.1.0.10rc1 - * 1.0.10 1 10010 2.1.0.10 - * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3 - * 1.0.11rc1 1 10011 2.1.0.11rc1 - * 1.0.11 1 10011 2.1.0.11 - * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2 - * 1.0.12rc1 2 10012 2.1.0.12rc1 - * 1.0.12 2 10012 2.1.0.12 - * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned) - * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2 - * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5 - * 1.2.0rc1 3 10200 3.1.2.0rc1 - * 1.2.0 3 10200 3.1.2.0 - * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4 - * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2 - * 1.2.1 3 10201 3.1.2.1 - * 1.2.2beta1-6 12 10202 12.so.0.1.2.2beta1-6 - * 1.0.13beta1 10 10013 10.so.0.1.0.13beta1 - * 1.0.13rc1 10 10013 10.so.0.1.0.13rc1 - * 1.2.2rc1 12 10202 12.so.0.1.2.2rc1 - * 1.0.13 10 10013 10.so.0.1.0.13 - * 1.2.2 12 10202 12.so.0.1.2.2 - * 1.2.3rc1-6 12 10203 12.so.0.1.2.3rc1-6 - * 1.2.3 12 10203 12.so.0.1.2.3 - * 1.2.4beta1-3 13 10204 12.so.0.1.2.4beta1-3 - * 1.0.14rc1 13 10014 10.so.0.1.0.14rc1 - * 1.2.4rc1 13 10204 12.so.0.1.2.4rc1 - * 1.0.14 10 10014 10.so.0.1.0.14 - * 1.2.4 13 10204 12.so.0.1.2.4 - * 1.2.5beta1-2 13 10205 12.so.0.1.2.5beta1-2 - * 1.0.15rc1-3 10 10015 10.so.0.1.0.15rc1-3 - * 1.2.5rc1-3 13 10205 12.so.0.1.2.5rc1-3 - * 1.0.15 10 10015 10.so.0.1.0.15 - * 1.2.5 13 10205 12.so.0.1.2.5 - * 1.2.6beta1-4 13 10206 12.so.0.1.2.6beta1-4 - * 1.0.16 10 10016 10.so.0.1.0.16 - * 1.2.6 13 10206 12.so.0.1.2.6 - * 1.2.7beta1-2 13 10207 12.so.0.1.2.7beta1-2 - * 1.0.17rc1 10 10017 12.so.0.1.0.17rc1 - * 1.2.7rc1 13 10207 12.so.0.1.2.7rc1 - * 1.0.17 10 10017 12.so.0.1.0.17 - * 1.2.7 13 10207 12.so.0.1.2.7 - * 1.2.8beta1-5 13 10208 12.so.0.1.2.8beta1-5 - * 1.0.18rc1-5 10 10018 12.so.0.1.0.18rc1-5 - * 1.2.8rc1-5 13 10208 12.so.0.1.2.8rc1-5 - * 1.0.18 10 10018 12.so.0.1.0.18 - * 1.2.8 13 10208 12.so.0.1.2.8 - * 1.2.9beta1-3 13 10209 12.so.0.1.2.9beta1-3 - * 1.2.9beta4-11 13 10209 12.so.0.9[.0] - * 1.2.9rc1 13 10209 12.so.0.9[.0] - * 1.2.9 13 10209 12.so.0.9[.0] - * 1.2.10beta1-7 13 10210 12.so.0.10[.0] - * 1.2.10rc1-2 13 10210 12.so.0.10[.0] - * 1.2.10 13 10210 12.so.0.10[.0] - * 1.4.0beta1-5 14 10400 14.so.0.0[.0] - * 1.2.11beta1-4 13 10211 12.so.0.11[.0] - * 1.4.0beta7-8 14 10400 14.so.0.0[.0] - * 1.2.11 13 10211 12.so.0.11[.0] - * 1.2.12 13 10212 12.so.0.12[.0] - * 1.4.0beta9-14 14 10400 14.so.0.0[.0] - * 1.2.13 13 10213 12.so.0.13[.0] - * 1.4.0beta15-36 14 10400 14.so.0.0[.0] - * 1.4.0beta37-87 14 10400 14.so.14.0[.0] - * 1.4.0rc01 14 10400 14.so.14.0[.0] - * 1.4.0beta88-109 14 10400 14.so.14.0[.0] - * 1.4.0rc02-08 14 10400 14.so.14.0[.0] - * 1.4.0 14 10400 14.so.14.0[.0] - * 1.4.1beta01-03 14 10401 14.so.14.1[.0] - * 1.4.1rc01 14 10401 14.so.14.1[.0] - * 1.4.1beta04-12 14 10401 14.so.14.1[.0] - * 1.4.1 14 10401 14.so.14.1[.0] - * 1.4.2 14 10402 14.so.14.2[.0] - * 1.4.3 14 10403 14.so.14.3[.0] - * 1.4.4 14 10404 14.so.14.4[.0] - * 1.5.0beta01-58 15 10500 15.so.15.0[.0] - * 1.5.0rc01-07 15 10500 15.so.15.0[.0] - * 1.5.0 15 10500 15.so.15.0[.0] - * 1.5.1beta01-11 15 10501 15.so.15.1[.0] - * 1.5.1rc01-02 15 10501 15.so.15.1[.0] - * 1.5.1 15 10501 15.so.15.1[.0] - * 1.5.2beta01-03 15 10502 15.so.15.2[.0] - * 1.5.2rc01-03 15 10502 15.so.15.2[.0] - * 1.5.2 15 10502 15.so.15.2[.0] - * 1.5.3beta01-10 15 10503 15.so.15.3[.0] - * 1.5.3rc01-02 15 10503 15.so.15.3[.0] - * 1.5.3beta11 15 10503 15.so.15.3[.0] - * 1.5.3 [omitted] - * 1.5.4beta01-08 15 10504 15.so.15.4[.0] - * 1.5.4rc01 15 10504 15.so.15.4[.0] - * 1.5.4 15 10504 15.so.15.4[.0] - * 1.5.5beta01-08 15 10505 15.so.15.5[.0] - * 1.5.5rc01 15 10505 15.so.15.5[.0] - * 1.5.5 15 10505 15.so.15.5[.0] - * 1.5.6beta01-07 15 10506 15.so.15.6[.0] - * 1.5.6rc01-03 15 10506 15.so.15.6[.0] - * 1.5.6 15 10506 15.so.15.6[.0] - * 1.5.7beta01-05 15 10507 15.so.15.7[.0] - * 1.5.7rc01-03 15 10507 15.so.15.7[.0] - * 1.5.7 15 10507 15.so.15.7[.0] - * 1.6.0beta01-40 16 10600 16.so.16.0[.0] - * 1.6.0rc01-08 16 10600 16.so.16.0[.0] - * 1.6.0 16 10600 16.so.16.0[.0] - * 1.6.1beta01-09 16 10601 16.so.16.1[.0] - * 1.6.1rc01 16 10601 16.so.16.1[.0] - * 1.6.1 16 10601 16.so.16.1[.0] - * 1.6.2beta01 16 10602 16.so.16.2[.0] - * 1.6.2rc01-06 16 10602 16.so.16.2[.0] - * 1.6.2 16 10602 16.so.16.2[.0] - * 1.6.3beta01-11 16 10603 16.so.16.3[.0] - * 1.6.3rc01 16 10603 16.so.16.3[.0] - * 1.6.3 16 10603 16.so.16.3[.0] - * 1.6.4beta01-02 16 10604 16.so.16.4[.0] - * 1.6.4rc01 16 10604 16.so.16.4[.0] - * 1.6.4 16 10604 16.so.16.4[.0] - * 1.6.5 16 10605 16.so.16.5[.0] - * 1.6.6 16 10606 16.so.16.6[.0] - * 1.6.7beta01-04 16 10607 16.so.16.7[.0] - * 1.6.7rc01-03 16 10607 16.so.16.7[.0] - * 1.6.7 16 10607 16.so.16.7[.0] - * 1.6.8beta01-02 16 10608 16.so.16.8[.0] - * 1.6.8rc01-02 16 10608 16.so.16.8[.0] - * 1.6.8 16 10608 16.so.16.8[.0] - * 1.6.9beta01-04 16 10609 16.so.16.9[.0] - * 1.6.9rc01-02 16 10609 16.so.16.9[.0] - * 1.6.9 16 10609 16.so.16.9[.0] - * 1.6.10beta01-03 16 10610 16.so.16.10[.0] - * 1.6.10rc01-03 16 10610 16.so.16.10[.0] - * 1.6.10 16 10610 16.so.16.10[.0] - * 1.6.11beta01-06 16 10611 16.so.16.11[.0] - * 1.6.11rc01-02 16 10611 16.so.16.11[.0] - * 1.6.11 16 10611 16.so.16.11[.0] - * 1.6.12rc01-03 16 10612 16.so.16.12[.0] - * 1.6.12 16 10612 16.so.16.12[.0] - * 1.6.13beta01-04 16 10613 16.so.16.13[.0] - * 1.6.13rc01-02 16 10613 16.so.16.13[.0] - * 1.6.13 16 10613 16.so.16.13[.0] - * 1.6.14beta01-07 16 10614 16.so.16.14[.0] - * 1.6.14rc01-02 16 10614 16.so.16.14[.0] - * 1.6.14 16 10614 16.so.16.14[.0] - * 1.6.15beta01-08 16 10615 16.so.16.15[.0] - * 1.6.15rc01-03 16 10615 16.so.16.15[.0] - * 1.6.15 16 10615 16.so.16.15[.0] - * 1.6.16beta01-03 16 10616 16.so.16.16[.0] - * 1.6.16rc01-02 16 10616 16.so.16.16[.0] - * 1.6.16 16 10616 16.so.16.16[.0] - * 1.6.17beta01-06 16 10617 16.so.16.17[.0] - * 1.6.17rc01-06 16 10617 16.so.16.17[.0] - * 1.6.17 16 10617 16.so.16.17[.0] - * 1.6.18beta01-09 16 10618 16.so.16.18[.0] - * 1.6.18rc01-03 16 10618 16.so.16.18[.0] - * 1.6.18 16 10618 16.so.16.18[.0] - * - * Henceforth the source version will match the shared-library major - * and minor numbers; the shared-library major version number will be - * used for changes in backward compatibility, as it is intended. The - * PNG_LIBPNG_VER macro, which is not used within libpng but is available - * for applications, is an unsigned integer of the form xyyzz corresponding - * to the source version x.y.z (leading zeros in y and z). Beta versions - * were given the previous public release number plus a letter, until - * version 1.0.6j; from then on they were given the upcoming public - * release number plus "betaNN" or "rcNN". - * - * Binary incompatibility exists only when applications make direct access - * to the info_ptr or png_ptr members through png.h, and the compiled - * application is loaded with a different version of the library. - * - * DLLNUM will change each time there are forward or backward changes - * in binary compatibility (e.g., when a new feature is added). - * - * See libpng-manual.txt or libpng.3 for more information. The PNG - * specification is available as a W3C Recommendation and as an ISO - * Specification, - * - * If you just need to read a PNG file and don't want to read the documentation - * skip to the end of this file and read the section entitled 'simplified API'. - */ - -/* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.6.18" -#define PNG_HEADER_VERSION_STRING \ - " libpng version 1.6.18 - July 23, 2015\n" - -#define PNG_LIBPNG_VER_SONUM 16 -#define PNG_LIBPNG_VER_DLLNUM 16 - -/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ -#define PNG_LIBPNG_VER_MAJOR 1 -#define PNG_LIBPNG_VER_MINOR 6 -#define PNG_LIBPNG_VER_RELEASE 18 - -/* This should match the numeric part of the final component of - * PNG_LIBPNG_VER_STRING, omitting any leading zero: - */ - -#define PNG_LIBPNG_VER_BUILD 0 - -/* Release Status */ -#define PNG_LIBPNG_BUILD_ALPHA 1 -#define PNG_LIBPNG_BUILD_BETA 2 -#define PNG_LIBPNG_BUILD_RC 3 -#define PNG_LIBPNG_BUILD_STABLE 4 -#define PNG_LIBPNG_BUILD_RELEASE_STATUS_MASK 7 - -/* Release-Specific Flags */ -#define PNG_LIBPNG_BUILD_PATCH 8 /* Can be OR'ed with - PNG_LIBPNG_BUILD_STABLE only */ -#define PNG_LIBPNG_BUILD_PRIVATE 16 /* Cannot be OR'ed with - PNG_LIBPNG_BUILD_SPECIAL */ -#define PNG_LIBPNG_BUILD_SPECIAL 32 /* Cannot be OR'ed with - PNG_LIBPNG_BUILD_PRIVATE */ - -#define PNG_LIBPNG_BUILD_BASE_TYPE PNG_LIBPNG_BUILD_STABLE - -/* Careful here. At one time, Guy wanted to use 082, but that would be octal. - * We must not include leading zeros. - * Versions 0.7 through 1.0.0 were in the range 0 to 100 here (only - * version 1.0.0 was mis-numbered 100 instead of 10000). From - * version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release - */ -#define PNG_LIBPNG_VER 10618 /* 1.6.18 */ - -/* Library configuration: these options cannot be changed after - * the library has been built. - */ -#ifndef PNGLCONF_H - /* If pnglibconf.h is missing, you can - * copy scripts/pnglibconf.h.prebuilt to pnglibconf.h - */ -# include "pnglibconf.h" -#endif - -#ifndef PNG_VERSION_INFO_ONLY - /* Machine specific configuration. */ -# include "pngconf.h" -#endif - -/* - * Added at libpng-1.2.8 - * - * Ref MSDN: Private as priority over Special - * VS_FF_PRIVATEBUILD File *was not* built using standard release - * procedures. If this value is given, the StringFileInfo block must - * contain a PrivateBuild string. - * - * VS_FF_SPECIALBUILD File *was* built by the original company using - * standard release procedures but is a variation of the standard - * file of the same version number. If this value is given, the - * StringFileInfo block must contain a SpecialBuild string. - */ - -#ifdef PNG_USER_PRIVATEBUILD /* From pnglibconf.h */ -# define PNG_LIBPNG_BUILD_TYPE \ - (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_PRIVATE) -#else -# ifdef PNG_LIBPNG_SPECIALBUILD -# define PNG_LIBPNG_BUILD_TYPE \ - (PNG_LIBPNG_BUILD_BASE_TYPE | PNG_LIBPNG_BUILD_SPECIAL) -# else -# define PNG_LIBPNG_BUILD_TYPE (PNG_LIBPNG_BUILD_BASE_TYPE) -# endif -#endif - -#ifndef PNG_VERSION_INFO_ONLY - -/* Inhibit C++ name-mangling for libpng functions but not for system calls. */ -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/* Version information for C files, stored in png.c. This had better match - * the version above. - */ -#define png_libpng_ver png_get_header_ver(NULL) - -/* This file is arranged in several sections: - * - * 1. Any configuration options that can be specified by for the application - * code when it is built. (Build time configuration is in pnglibconf.h) - * 2. Type definitions (base types are defined in pngconf.h), structure - * definitions. - * 3. Exported library functions. - * 4. Simplified API. - * - * The library source code has additional files (principally pngpriv.h) that - * allow configuration of the library. - */ -/* Section 1: run time configuration - * See pnglibconf.h for build time configuration - * - * Run time configuration allows the application to choose between - * implementations of certain arithmetic APIs. The default is set - * at build time and recorded in pnglibconf.h, but it is safe to - * override these (and only these) settings. Note that this won't - * change what the library does, only application code, and the - * settings can (and probably should) be made on a per-file basis - * by setting the #defines before including png.h - * - * Use macros to read integers from PNG data or use the exported - * functions? - * PNG_USE_READ_MACROS: use the macros (see below) Note that - * the macros evaluate their argument multiple times. - * PNG_NO_USE_READ_MACROS: call the relevant library function. - * - * Use the alternative algorithm for compositing alpha samples that - * does not use division? - * PNG_READ_COMPOSITE_NODIV_SUPPORTED: use the 'no division' - * algorithm. - * PNG_NO_READ_COMPOSITE_NODIV: use the 'division' algorithm. - * - * How to handle benign errors if PNG_ALLOW_BENIGN_ERRORS is - * false? - * PNG_ALLOW_BENIGN_ERRORS: map calls to the benign error - * APIs to png_warning. - * Otherwise the calls are mapped to png_error. - */ - -/* Section 2: type definitions, including structures and compile time - * constants. - * See pngconf.h for base types that vary by machine/system - */ - -/* This triggers a compiler error in png.c, if png.c and png.h - * do not agree upon the version number. - */ -typedef char* png_libpng_version_1_6_18; - -/* Basic control structions. Read libpng-manual.txt or libpng.3 for more info. - * - * png_struct is the cache of information used while reading or writing a single - * PNG file. One of these is always required, although the simplified API - * (below) hides the creation and destruction of it. - */ -typedef struct png_struct_def png_struct; -typedef const png_struct * png_const_structp; -typedef png_struct * png_structp; -typedef png_struct * * png_structpp; - -/* png_info contains information read from or to be written to a PNG file. One - * or more of these must exist while reading or creating a PNG file. The - * information is not used by libpng during read but is used to control what - * gets written when a PNG file is created. "png_get_" function calls read - * information during read and "png_set_" functions calls write information - * when creating a PNG. - * been moved into a separate header file that is not accessible to - * applications. Read libpng-manual.txt or libpng.3 for more info. - */ -typedef struct png_info_def png_info; -typedef png_info * png_infop; -typedef const png_info * png_const_infop; -typedef png_info * * png_infopp; - -/* Types with names ending 'p' are pointer types. The corresponding types with - * names ending 'rp' are identical pointer types except that the pointer is - * marked 'restrict', which means that it is the only pointer to the object - * passed to the function. Applications should not use the 'restrict' types; - * it is always valid to pass 'p' to a pointer with a function argument of the - * corresponding 'rp' type. Different compilers have different rules with - * regard to type matching in the presence of 'restrict'. For backward - * compatibility libpng callbacks never have 'restrict' in their parameters and, - * consequentially, writing portable application code is extremely difficult if - * an attempt is made to use 'restrict'. - */ -typedef png_struct * PNG_RESTRICT png_structrp; -typedef const png_struct * PNG_RESTRICT png_const_structrp; -typedef png_info * PNG_RESTRICT png_inforp; -typedef const png_info * PNG_RESTRICT png_const_inforp; - -/* Three color definitions. The order of the red, green, and blue, (and the - * exact size) is not important, although the size of the fields need to - * be png_byte or png_uint_16 (as defined below). - */ -typedef struct png_color_struct -{ - png_byte red; - png_byte green; - png_byte blue; -} png_color; -typedef png_color * png_colorp; -typedef const png_color * png_const_colorp; -typedef png_color * * png_colorpp; - -typedef struct png_color_16_struct -{ - png_byte index; /* used for palette files */ - png_uint_16 red; /* for use in red green blue files */ - png_uint_16 green; - png_uint_16 blue; - png_uint_16 gray; /* for use in grayscale files */ -} png_color_16; -typedef png_color_16 * png_color_16p; -typedef const png_color_16 * png_const_color_16p; -typedef png_color_16 * * png_color_16pp; - -typedef struct png_color_8_struct -{ - png_byte red; /* for use in red green blue files */ - png_byte green; - png_byte blue; - png_byte gray; /* for use in grayscale files */ - png_byte alpha; /* for alpha channel files */ -} png_color_8; -typedef png_color_8 * png_color_8p; -typedef const png_color_8 * png_const_color_8p; -typedef png_color_8 * * png_color_8pp; - -/* - * The following two structures are used for the in-core representation - * of sPLT chunks. - */ -typedef struct png_sPLT_entry_struct -{ - png_uint_16 red; - png_uint_16 green; - png_uint_16 blue; - png_uint_16 alpha; - png_uint_16 frequency; -} png_sPLT_entry; -typedef png_sPLT_entry * png_sPLT_entryp; -typedef const png_sPLT_entry * png_const_sPLT_entryp; -typedef png_sPLT_entry * * png_sPLT_entrypp; - -/* When the depth of the sPLT palette is 8 bits, the color and alpha samples - * occupy the LSB of their respective members, and the MSB of each member - * is zero-filled. The frequency member always occupies the full 16 bits. - */ - -typedef struct png_sPLT_struct -{ - png_charp name; /* palette name */ - png_byte depth; /* depth of palette samples */ - png_sPLT_entryp entries; /* palette entries */ - png_int_32 nentries; /* number of palette entries */ -} png_sPLT_t; -typedef png_sPLT_t * png_sPLT_tp; -typedef const png_sPLT_t * png_const_sPLT_tp; -typedef png_sPLT_t * * png_sPLT_tpp; - -#ifdef PNG_TEXT_SUPPORTED -/* png_text holds the contents of a text/ztxt/itxt chunk in a PNG file, - * and whether that contents is compressed or not. The "key" field - * points to a regular zero-terminated C string. The "text" fields can be a - * regular C string, an empty string, or a NULL pointer. - * However, the structure returned by png_get_text() will always contain - * the "text" field as a regular zero-terminated C string (possibly - * empty), never a NULL pointer, so it can be safely used in printf() and - * other string-handling functions. Note that the "itxt_length", "lang", and - * "lang_key" members of the structure only exist when the library is built - * with iTXt chunk support. Prior to libpng-1.4.0 the library was built by - * default without iTXt support. Also note that when iTXt *is* supported, - * the "lang" and "lang_key" fields contain NULL pointers when the - * "compression" field contains * PNG_TEXT_COMPRESSION_NONE or - * PNG_TEXT_COMPRESSION_zTXt. Note that the "compression value" is not the - * same as what appears in the PNG tEXt/zTXt/iTXt chunk's "compression flag" - * which is always 0 or 1, or its "compression method" which is always 0. - */ -typedef struct png_text_struct -{ - int compression; /* compression value: - -1: tEXt, none - 0: zTXt, deflate - 1: iTXt, none - 2: iTXt, deflate */ - png_charp key; /* keyword, 1-79 character description of "text" */ - png_charp text; /* comment, may be an empty string (ie "") - or a NULL pointer */ - png_size_t text_length; /* length of the text string */ - png_size_t itxt_length; /* length of the itxt string */ - png_charp lang; /* language code, 0-79 characters - or a NULL pointer */ - png_charp lang_key; /* keyword translated UTF-8 string, 0 or more - chars or a NULL pointer */ -} png_text; -typedef png_text * png_textp; -typedef const png_text * png_const_textp; -typedef png_text * * png_textpp; -#endif - -/* Supported compression types for text in PNG files (tEXt, and zTXt). - * The values of the PNG_TEXT_COMPRESSION_ defines should NOT be changed. */ -#define PNG_TEXT_COMPRESSION_NONE_WR -3 -#define PNG_TEXT_COMPRESSION_zTXt_WR -2 -#define PNG_TEXT_COMPRESSION_NONE -1 -#define PNG_TEXT_COMPRESSION_zTXt 0 -#define PNG_ITXT_COMPRESSION_NONE 1 -#define PNG_ITXT_COMPRESSION_zTXt 2 -#define PNG_TEXT_COMPRESSION_LAST 3 /* Not a valid value */ - -/* png_time is a way to hold the time in an machine independent way. - * Two conversions are provided, both from time_t and struct tm. There - * is no portable way to convert to either of these structures, as far - * as I know. If you know of a portable way, send it to me. As a side - * note - PNG has always been Year 2000 compliant! - */ -typedef struct png_time_struct -{ - png_uint_16 year; /* full year, as in, 1995 */ - png_byte month; /* month of year, 1 - 12 */ - png_byte day; /* day of month, 1 - 31 */ - png_byte hour; /* hour of day, 0 - 23 */ - png_byte minute; /* minute of hour, 0 - 59 */ - png_byte second; /* second of minute, 0 - 60 (for leap seconds) */ -} png_time; -typedef png_time * png_timep; -typedef const png_time * png_const_timep; -typedef png_time * * png_timepp; - -#if defined(PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED) ||\ - defined(PNG_USER_CHUNKS_SUPPORTED) -/* png_unknown_chunk is a structure to hold queued chunks for which there is - * no specific support. The idea is that we can use this to queue - * up private chunks for output even though the library doesn't actually - * know about their semantics. - * - * The data in the structure is set by libpng on read and used on write. - */ -typedef struct png_unknown_chunk_t -{ - png_byte name[5]; /* Textual chunk name with '\0' terminator */ - png_byte *data; /* Data, should not be modified on read! */ - png_size_t size; - - /* On write 'location' must be set using the flag values listed below. - * Notice that on read it is set by libpng however the values stored have - * more bits set than are listed below. Always treat the value as a - * bitmask. On write set only one bit - setting multiple bits may cause the - * chunk to be written in multiple places. - */ - png_byte location; /* mode of operation at read time */ -} -png_unknown_chunk; - -typedef png_unknown_chunk * png_unknown_chunkp; -typedef const png_unknown_chunk * png_const_unknown_chunkp; -typedef png_unknown_chunk * * png_unknown_chunkpp; -#endif - -/* Flag values for the unknown chunk location byte. */ -#define PNG_HAVE_IHDR 0x01 -#define PNG_HAVE_PLTE 0x02 -#define PNG_AFTER_IDAT 0x08 - -/* Maximum positive integer used in PNG is (2^31)-1 */ -#define PNG_UINT_31_MAX ((png_uint_32)0x7fffffffL) -#define PNG_UINT_32_MAX ((png_uint_32)(-1)) -#define PNG_SIZE_MAX ((png_size_t)(-1)) - -/* These are constants for fixed point values encoded in the - * PNG specification manner (x100000) - */ -#define PNG_FP_1 100000 -#define PNG_FP_HALF 50000 -#define PNG_FP_MAX ((png_fixed_point)0x7fffffffL) -#define PNG_FP_MIN (-PNG_FP_MAX) - -/* These describe the color_type field in png_info. */ -/* color type masks */ -#define PNG_COLOR_MASK_PALETTE 1 -#define PNG_COLOR_MASK_COLOR 2 -#define PNG_COLOR_MASK_ALPHA 4 - -/* color types. Note that not all combinations are legal */ -#define PNG_COLOR_TYPE_GRAY 0 -#define PNG_COLOR_TYPE_PALETTE (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE) -#define PNG_COLOR_TYPE_RGB (PNG_COLOR_MASK_COLOR) -#define PNG_COLOR_TYPE_RGB_ALPHA (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA) -#define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA) -/* aliases */ -#define PNG_COLOR_TYPE_RGBA PNG_COLOR_TYPE_RGB_ALPHA -#define PNG_COLOR_TYPE_GA PNG_COLOR_TYPE_GRAY_ALPHA - -/* This is for compression type. PNG 1.0-1.2 only define the single type. */ -#define PNG_COMPRESSION_TYPE_BASE 0 /* Deflate method 8, 32K window */ -#define PNG_COMPRESSION_TYPE_DEFAULT PNG_COMPRESSION_TYPE_BASE - -/* This is for filter type. PNG 1.0-1.2 only define the single type. */ -#define PNG_FILTER_TYPE_BASE 0 /* Single row per-byte filtering */ -#define PNG_INTRAPIXEL_DIFFERENCING 64 /* Used only in MNG datastreams */ -#define PNG_FILTER_TYPE_DEFAULT PNG_FILTER_TYPE_BASE - -/* These are for the interlacing type. These values should NOT be changed. */ -#define PNG_INTERLACE_NONE 0 /* Non-interlaced image */ -#define PNG_INTERLACE_ADAM7 1 /* Adam7 interlacing */ -#define PNG_INTERLACE_LAST 2 /* Not a valid value */ - -/* These are for the oFFs chunk. These values should NOT be changed. */ -#define PNG_OFFSET_PIXEL 0 /* Offset in pixels */ -#define PNG_OFFSET_MICROMETER 1 /* Offset in micrometers (1/10^6 meter) */ -#define PNG_OFFSET_LAST 2 /* Not a valid value */ - -/* These are for the pCAL chunk. These values should NOT be changed. */ -#define PNG_EQUATION_LINEAR 0 /* Linear transformation */ -#define PNG_EQUATION_BASE_E 1 /* Exponential base e transform */ -#define PNG_EQUATION_ARBITRARY 2 /* Arbitrary base exponential transform */ -#define PNG_EQUATION_HYPERBOLIC 3 /* Hyperbolic sine transformation */ -#define PNG_EQUATION_LAST 4 /* Not a valid value */ - -/* These are for the sCAL chunk. These values should NOT be changed. */ -#define PNG_SCALE_UNKNOWN 0 /* unknown unit (image scale) */ -#define PNG_SCALE_METER 1 /* meters per pixel */ -#define PNG_SCALE_RADIAN 2 /* radians per pixel */ -#define PNG_SCALE_LAST 3 /* Not a valid value */ - -/* These are for the pHYs chunk. These values should NOT be changed. */ -#define PNG_RESOLUTION_UNKNOWN 0 /* pixels/unknown unit (aspect ratio) */ -#define PNG_RESOLUTION_METER 1 /* pixels/meter */ -#define PNG_RESOLUTION_LAST 2 /* Not a valid value */ - -/* These are for the sRGB chunk. These values should NOT be changed. */ -#define PNG_sRGB_INTENT_PERCEPTUAL 0 -#define PNG_sRGB_INTENT_RELATIVE 1 -#define PNG_sRGB_INTENT_SATURATION 2 -#define PNG_sRGB_INTENT_ABSOLUTE 3 -#define PNG_sRGB_INTENT_LAST 4 /* Not a valid value */ - -/* This is for text chunks */ -#define PNG_KEYWORD_MAX_LENGTH 79 - -/* Maximum number of entries in PLTE/sPLT/tRNS arrays */ -#define PNG_MAX_PALETTE_LENGTH 256 - -/* These determine if an ancillary chunk's data has been successfully read - * from the PNG header, or if the application has filled in the corresponding - * data in the info_struct to be written into the output file. The values - * of the PNG_INFO_ defines should NOT be changed. - */ -#define PNG_INFO_gAMA 0x0001 -#define PNG_INFO_sBIT 0x0002 -#define PNG_INFO_cHRM 0x0004 -#define PNG_INFO_PLTE 0x0008 -#define PNG_INFO_tRNS 0x0010 -#define PNG_INFO_bKGD 0x0020 -#define PNG_INFO_hIST 0x0040 -#define PNG_INFO_pHYs 0x0080 -#define PNG_INFO_oFFs 0x0100 -#define PNG_INFO_tIME 0x0200 -#define PNG_INFO_pCAL 0x0400 -#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */ -#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */ -#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */ -#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */ -#define PNG_INFO_IDAT 0x8000 /* ESR, 1.0.6 */ - -/* This is used for the transformation routines, as some of them - * change these values for the row. It also should enable using - * the routines for other purposes. - */ -typedef struct png_row_info_struct -{ - png_uint_32 width; /* width of row */ - png_size_t rowbytes; /* number of bytes in row */ - png_byte color_type; /* color type of row */ - png_byte bit_depth; /* bit depth of row */ - png_byte channels; /* number of channels (1, 2, 3, or 4) */ - png_byte pixel_depth; /* bits per pixel (depth * channels) */ -} png_row_info; - -typedef png_row_info * png_row_infop; -typedef png_row_info * * png_row_infopp; - -/* These are the function types for the I/O functions and for the functions - * that allow the user to override the default I/O functions with his or her - * own. The png_error_ptr type should match that of user-supplied warning - * and error functions, while the png_rw_ptr type should match that of the - * user read/write data functions. Note that the 'write' function must not - * modify the buffer it is passed. The 'read' function, on the other hand, is - * expected to return the read data in the buffer. - */ -typedef PNG_CALLBACK(void, *png_error_ptr, (png_structp, png_const_charp)); -typedef PNG_CALLBACK(void, *png_rw_ptr, (png_structp, png_bytep, png_size_t)); -typedef PNG_CALLBACK(void, *png_flush_ptr, (png_structp)); -typedef PNG_CALLBACK(void, *png_read_status_ptr, (png_structp, png_uint_32, - int)); -typedef PNG_CALLBACK(void, *png_write_status_ptr, (png_structp, png_uint_32, - int)); - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -typedef PNG_CALLBACK(void, *png_progressive_info_ptr, (png_structp, png_infop)); -typedef PNG_CALLBACK(void, *png_progressive_end_ptr, (png_structp, png_infop)); - -/* The following callback receives png_uint_32 row_number, int pass for the - * png_bytep data of the row. When transforming an interlaced image the - * row number is the row number within the sub-image of the interlace pass, so - * the value will increase to the height of the sub-image (not the full image) - * then reset to 0 for the next pass. - * - * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to - * find the output pixel (x,y) given an interlaced sub-image pixel - * (row,col,pass). (See below for these macros.) - */ -typedef PNG_CALLBACK(void, *png_progressive_row_ptr, (png_structp, png_bytep, - png_uint_32, int)); -#endif - -#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \ - defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) -typedef PNG_CALLBACK(void, *png_user_transform_ptr, (png_structp, png_row_infop, - png_bytep)); -#endif - -#ifdef PNG_USER_CHUNKS_SUPPORTED -typedef PNG_CALLBACK(int, *png_user_chunk_ptr, (png_structp, - png_unknown_chunkp)); -#endif -#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED -/* not used anywhere */ -/* typedef PNG_CALLBACK(void, *png_unknown_chunk_ptr, (png_structp)); */ -#endif - -#ifdef PNG_SETJMP_SUPPORTED -/* This must match the function definition in , and the application - * must include this before png.h to obtain the definition of jmp_buf. The - * function is required to be PNG_NORETURN, but this is not checked. If the - * function does return the application will crash via an abort() or similar - * system level call. - * - * If you get a warning here while building the library you may need to make - * changes to ensure that pnglibconf.h records the calling convention used by - * your compiler. This may be very difficult - try using a different compiler - * to build the library! - */ -PNG_FUNCTION(void, (PNGCAPI *png_longjmp_ptr), PNGARG((jmp_buf, int)), typedef); -#endif - -/* Transform masks for the high-level interface */ -#define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */ -#define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */ -#define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */ -#define PNG_TRANSFORM_PACKING 0x0004 /* read and write */ -#define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */ -#define PNG_TRANSFORM_EXPAND 0x0010 /* read only */ -#define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */ -#define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */ -#define PNG_TRANSFORM_BGR 0x0080 /* read and write */ -#define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */ -#define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */ -#define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */ -#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* write only */ -/* Added to libpng-1.2.34 */ -#define PNG_TRANSFORM_STRIP_FILLER_BEFORE PNG_TRANSFORM_STRIP_FILLER -#define PNG_TRANSFORM_STRIP_FILLER_AFTER 0x1000 /* write only */ -/* Added to libpng-1.4.0 */ -#define PNG_TRANSFORM_GRAY_TO_RGB 0x2000 /* read only */ -/* Added to libpng-1.5.4 */ -#define PNG_TRANSFORM_EXPAND_16 0x4000 /* read only */ -#define PNG_TRANSFORM_SCALE_16 0x8000 /* read only */ - -/* Flags for MNG supported features */ -#define PNG_FLAG_MNG_EMPTY_PLTE 0x01 -#define PNG_FLAG_MNG_FILTER_64 0x04 -#define PNG_ALL_MNG_FEATURES 0x05 - -/* NOTE: prior to 1.5 these functions had no 'API' style declaration, - * this allowed the zlib default functions to be used on Windows - * platforms. In 1.5 the zlib default malloc (which just calls malloc and - * ignores the first argument) should be completely compatible with the - * following. - */ -typedef PNG_CALLBACK(png_voidp, *png_malloc_ptr, (png_structp, - png_alloc_size_t)); -typedef PNG_CALLBACK(void, *png_free_ptr, (png_structp, png_voidp)); - -/* Section 3: exported functions - * Here are the function definitions most commonly used. This is not - * the place to find out how to use libpng. See libpng-manual.txt for the - * full explanation, see example.c for the summary. This just provides - * a simple one line description of the use of each function. - * - * The PNG_EXPORT() and PNG_EXPORTA() macros used below are defined in - * pngconf.h and in the *.dfn files in the scripts directory. - * - * PNG_EXPORT(ordinal, type, name, (args)); - * - * ordinal: ordinal that is used while building - * *.def files. The ordinal value is only - * relevant when preprocessing png.h with - * the *.dfn files for building symbol table - * entries, and are removed by pngconf.h. - * type: return type of the function - * name: function name - * args: function arguments, with types - * - * When we wish to append attributes to a function prototype we use - * the PNG_EXPORTA() macro instead. - * - * PNG_EXPORTA(ordinal, type, name, (args), attributes); - * - * ordinal, type, name, and args: same as in PNG_EXPORT(). - * attributes: function attributes - */ - -/* Returns the version number of the library */ -PNG_EXPORT(1, png_uint_32, png_access_version_number, (void)); - -/* Tell lib we have already handled the first magic bytes. - * Handling more than 8 bytes from the beginning of the file is an error. - */ -PNG_EXPORT(2, void, png_set_sig_bytes, (png_structrp png_ptr, int num_bytes)); - -/* Check sig[start] through sig[start + num_to_check - 1] to see if it's a - * PNG file. Returns zero if the supplied bytes match the 8-byte PNG - * signature, and non-zero otherwise. Having num_to_check == 0 or - * start > 7 will always fail (ie return non-zero). - */ -PNG_EXPORT(3, int, png_sig_cmp, (png_const_bytep sig, png_size_t start, - png_size_t num_to_check)); - -/* Simple signature checking function. This is the same as calling - * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n). - */ -#define png_check_sig(sig, n) !png_sig_cmp((sig), 0, (n)) - -/* Allocate and initialize png_ptr struct for reading, and any other memory. */ -PNG_EXPORTA(4, png_structp, png_create_read_struct, - (png_const_charp user_png_ver, png_voidp error_ptr, - png_error_ptr error_fn, png_error_ptr warn_fn), - PNG_ALLOCATED); - -/* Allocate and initialize png_ptr struct for writing, and any other memory */ -PNG_EXPORTA(5, png_structp, png_create_write_struct, - (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, - png_error_ptr warn_fn), - PNG_ALLOCATED); - -PNG_EXPORT(6, png_size_t, png_get_compression_buffer_size, - (png_const_structrp png_ptr)); - -PNG_EXPORT(7, void, png_set_compression_buffer_size, (png_structrp png_ptr, - png_size_t size)); - -/* Moved from pngconf.h in 1.4.0 and modified to ensure setjmp/longjmp - * match up. - */ -#ifdef PNG_SETJMP_SUPPORTED -/* This function returns the jmp_buf built in to *png_ptr. It must be - * supplied with an appropriate 'longjmp' function to use on that jmp_buf - * unless the default error function is overridden in which case NULL is - * acceptable. The size of the jmp_buf is checked against the actual size - * allocated by the library - the call will return NULL on a mismatch - * indicating an ABI mismatch. - */ -PNG_EXPORT(8, jmp_buf*, png_set_longjmp_fn, (png_structrp png_ptr, - png_longjmp_ptr longjmp_fn, size_t jmp_buf_size)); -# define png_jmpbuf(png_ptr) \ - (*png_set_longjmp_fn((png_ptr), longjmp, (sizeof (jmp_buf)))) -#else -# define png_jmpbuf(png_ptr) \ - (LIBPNG_WAS_COMPILED_WITH__PNG_NO_SETJMP) -#endif -/* This function should be used by libpng applications in place of - * longjmp(png_ptr->jmpbuf, val). If longjmp_fn() has been set, it - * will use it; otherwise it will call PNG_ABORT(). This function was - * added in libpng-1.5.0. - */ -PNG_EXPORTA(9, void, png_longjmp, (png_const_structrp png_ptr, int val), - PNG_NORETURN); - -#ifdef PNG_READ_SUPPORTED -/* Reset the compression stream */ -PNG_EXPORTA(10, int, png_reset_zstream, (png_structrp png_ptr), PNG_DEPRECATED); -#endif - -/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */ -#ifdef PNG_USER_MEM_SUPPORTED -PNG_EXPORTA(11, png_structp, png_create_read_struct_2, - (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, - png_error_ptr warn_fn, - png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), - PNG_ALLOCATED); -PNG_EXPORTA(12, png_structp, png_create_write_struct_2, - (png_const_charp user_png_ver, png_voidp error_ptr, png_error_ptr error_fn, - png_error_ptr warn_fn, - png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn), - PNG_ALLOCATED); -#endif - -/* Write the PNG file signature. */ -PNG_EXPORT(13, void, png_write_sig, (png_structrp png_ptr)); - -/* Write a PNG chunk - size, type, (optional) data, CRC. */ -PNG_EXPORT(14, void, png_write_chunk, (png_structrp png_ptr, png_const_bytep - chunk_name, png_const_bytep data, png_size_t length)); - -/* Write the start of a PNG chunk - length and chunk name. */ -PNG_EXPORT(15, void, png_write_chunk_start, (png_structrp png_ptr, - png_const_bytep chunk_name, png_uint_32 length)); - -/* Write the data of a PNG chunk started with png_write_chunk_start(). */ -PNG_EXPORT(16, void, png_write_chunk_data, (png_structrp png_ptr, - png_const_bytep data, png_size_t length)); - -/* Finish a chunk started with png_write_chunk_start() (includes CRC). */ -PNG_EXPORT(17, void, png_write_chunk_end, (png_structrp png_ptr)); - -/* Allocate and initialize the info structure */ -PNG_EXPORTA(18, png_infop, png_create_info_struct, (png_const_structrp png_ptr), - PNG_ALLOCATED); - -/* DEPRECATED: this function allowed init structures to be created using the - * default allocation method (typically malloc). Use is deprecated in 1.6.0 and - * the API will be removed in the future. - */ -PNG_EXPORTA(19, void, png_info_init_3, (png_infopp info_ptr, - png_size_t png_info_struct_size), PNG_DEPRECATED); - -/* Writes all the PNG information before the image. */ -PNG_EXPORT(20, void, png_write_info_before_PLTE, - (png_structrp png_ptr, png_const_inforp info_ptr)); -PNG_EXPORT(21, void, png_write_info, - (png_structrp png_ptr, png_const_inforp info_ptr)); - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -/* Read the information before the actual image data. */ -PNG_EXPORT(22, void, png_read_info, - (png_structrp png_ptr, png_inforp info_ptr)); -#endif - -#ifdef PNG_TIME_RFC1123_SUPPORTED - /* Convert to a US string format: there is no localization support in this - * routine. The original implementation used a 29 character buffer in - * png_struct, this will be removed in future versions. - */ -#if PNG_LIBPNG_VER < 10700 -/* To do: remove this from libpng17 (and from libpng17/png.c and pngstruct.h) */ -PNG_EXPORTA(23, png_const_charp, png_convert_to_rfc1123, (png_structrp png_ptr, - png_const_timep ptime),PNG_DEPRECATED); -#endif -PNG_EXPORT(241, int, png_convert_to_rfc1123_buffer, (char out[29], - png_const_timep ptime)); -#endif - -#ifdef PNG_CONVERT_tIME_SUPPORTED -/* Convert from a struct tm to png_time */ -PNG_EXPORT(24, void, png_convert_from_struct_tm, (png_timep ptime, - const struct tm * ttime)); - -/* Convert from time_t to png_time. Uses gmtime() */ -PNG_EXPORT(25, void, png_convert_from_time_t, (png_timep ptime, time_t ttime)); -#endif /* CONVERT_tIME */ - -#ifdef PNG_READ_EXPAND_SUPPORTED -/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */ -PNG_EXPORT(26, void, png_set_expand, (png_structrp png_ptr)); -PNG_EXPORT(27, void, png_set_expand_gray_1_2_4_to_8, (png_structrp png_ptr)); -PNG_EXPORT(28, void, png_set_palette_to_rgb, (png_structrp png_ptr)); -PNG_EXPORT(29, void, png_set_tRNS_to_alpha, (png_structrp png_ptr)); -#endif - -#ifdef PNG_READ_EXPAND_16_SUPPORTED -/* Expand to 16-bit channels, forces conversion of palette to RGB and expansion - * of a tRNS chunk if present. - */ -PNG_EXPORT(221, void, png_set_expand_16, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED) -/* Use blue, green, red order for pixels. */ -PNG_EXPORT(30, void, png_set_bgr, (png_structrp png_ptr)); -#endif - -#ifdef PNG_READ_GRAY_TO_RGB_SUPPORTED -/* Expand the grayscale to 24-bit RGB if necessary. */ -PNG_EXPORT(31, void, png_set_gray_to_rgb, (png_structrp png_ptr)); -#endif - -#ifdef PNG_READ_RGB_TO_GRAY_SUPPORTED -/* Reduce RGB to grayscale. */ -#define PNG_ERROR_ACTION_NONE 1 -#define PNG_ERROR_ACTION_WARN 2 -#define PNG_ERROR_ACTION_ERROR 3 -#define PNG_RGB_TO_GRAY_DEFAULT (-1)/*for red/green coefficients*/ - -PNG_FP_EXPORT(32, void, png_set_rgb_to_gray, (png_structrp png_ptr, - int error_action, double red, double green)) -PNG_FIXED_EXPORT(33, void, png_set_rgb_to_gray_fixed, (png_structrp png_ptr, - int error_action, png_fixed_point red, png_fixed_point green)) - -PNG_EXPORT(34, png_byte, png_get_rgb_to_gray_status, (png_const_structrp - png_ptr)); -#endif - -#ifdef PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED -PNG_EXPORT(35, void, png_build_grayscale_palette, (int bit_depth, - png_colorp palette)); -#endif - -#ifdef PNG_READ_ALPHA_MODE_SUPPORTED -/* How the alpha channel is interpreted - this affects how the color channels - * of a PNG file are returned to the calling application when an alpha channel, - * or a tRNS chunk in a palette file, is present. - * - * This has no effect on the way pixels are written into a PNG output - * datastream. The color samples in a PNG datastream are never premultiplied - * with the alpha samples. - * - * The default is to return data according to the PNG specification: the alpha - * channel is a linear measure of the contribution of the pixel to the - * corresponding composited pixel, and the color channels are unassociated - * (not premultiplied). The gamma encoded color channels must be scaled - * according to the contribution and to do this it is necessary to undo - * the encoding, scale the color values, perform the composition and reencode - * the values. This is the 'PNG' mode. - * - * The alternative is to 'associate' the alpha with the color information by - * storing color channel values that have been scaled by the alpha. - * image. These are the 'STANDARD', 'ASSOCIATED' or 'PREMULTIPLIED' modes - * (the latter being the two common names for associated alpha color channels). - * - * For the 'OPTIMIZED' mode, a pixel is treated as opaque only if the alpha - * value is equal to the maximum value. - * - * The final choice is to gamma encode the alpha channel as well. This is - * broken because, in practice, no implementation that uses this choice - * correctly undoes the encoding before handling alpha composition. Use this - * choice only if other serious errors in the software or hardware you use - * mandate it; the typical serious error is for dark halos to appear around - * opaque areas of the composited PNG image because of arithmetic overflow. - * - * The API function png_set_alpha_mode specifies which of these choices to use - * with an enumerated 'mode' value and the gamma of the required output: - */ -#define PNG_ALPHA_PNG 0 /* according to the PNG standard */ -#define PNG_ALPHA_STANDARD 1 /* according to Porter/Duff */ -#define PNG_ALPHA_ASSOCIATED 1 /* as above; this is the normal practice */ -#define PNG_ALPHA_PREMULTIPLIED 1 /* as above */ -#define PNG_ALPHA_OPTIMIZED 2 /* 'PNG' for opaque pixels, else 'STANDARD' */ -#define PNG_ALPHA_BROKEN 3 /* the alpha channel is gamma encoded */ - -PNG_FP_EXPORT(227, void, png_set_alpha_mode, (png_structrp png_ptr, int mode, - double output_gamma)) -PNG_FIXED_EXPORT(228, void, png_set_alpha_mode_fixed, (png_structrp png_ptr, - int mode, png_fixed_point output_gamma)) -#endif - -#if defined(PNG_GAMMA_SUPPORTED) || defined(PNG_READ_ALPHA_MODE_SUPPORTED) -/* The output_gamma value is a screen gamma in libpng terminology: it expresses - * how to decode the output values, not how they are encoded. - */ -#define PNG_DEFAULT_sRGB -1 /* sRGB gamma and color space */ -#define PNG_GAMMA_MAC_18 -2 /* Old Mac '1.8' gamma and color space */ -#define PNG_GAMMA_sRGB 220000 /* Television standards--matches sRGB gamma */ -#define PNG_GAMMA_LINEAR PNG_FP_1 /* Linear */ -#endif - -/* The following are examples of calls to png_set_alpha_mode to achieve the - * required overall gamma correction and, where necessary, alpha - * premultiplication. - * - * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB); - * This is the default libpng handling of the alpha channel - it is not - * pre-multiplied into the color components. In addition the call states - * that the output is for a sRGB system and causes all PNG files without gAMA - * chunks to be assumed to be encoded using sRGB. - * - * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC); - * In this case the output is assumed to be something like an sRGB conformant - * display preceeded by a power-law lookup table of power 1.45. This is how - * early Mac systems behaved. - * - * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR); - * This is the classic Jim Blinn approach and will work in academic - * environments where everything is done by the book. It has the shortcoming - * of assuming that input PNG data with no gamma information is linear - this - * is unlikely to be correct unless the PNG files where generated locally. - * Most of the time the output precision will be so low as to show - * significant banding in dark areas of the image. - * - * png_set_expand_16(pp); - * png_set_alpha_mode(pp, PNG_ALPHA_STANDARD, PNG_DEFAULT_sRGB); - * This is a somewhat more realistic Jim Blinn inspired approach. PNG files - * are assumed to have the sRGB encoding if not marked with a gamma value and - * the output is always 16 bits per component. This permits accurate scaling - * and processing of the data. If you know that your input PNG files were - * generated locally you might need to replace PNG_DEFAULT_sRGB with the - * correct value for your system. - * - * png_set_alpha_mode(pp, PNG_ALPHA_OPTIMIZED, PNG_DEFAULT_sRGB); - * If you just need to composite the PNG image onto an existing background - * and if you control the code that does this you can use the optimization - * setting. In this case you just copy completely opaque pixels to the - * output. For pixels that are not completely transparent (you just skip - * those) you do the composition math using png_composite or png_composite_16 - * below then encode the resultant 8-bit or 16-bit values to match the output - * encoding. - * - * Other cases - * If neither the PNG nor the standard linear encoding work for you because - * of the software or hardware you use then you have a big problem. The PNG - * case will probably result in halos around the image. The linear encoding - * will probably result in a washed out, too bright, image (it's actually too - * contrasty.) Try the ALPHA_OPTIMIZED mode above - this will probably - * substantially reduce the halos. Alternatively try: - * - * png_set_alpha_mode(pp, PNG_ALPHA_BROKEN, PNG_DEFAULT_sRGB); - * This option will also reduce the halos, but there will be slight dark - * halos round the opaque parts of the image where the background is light. - * In the OPTIMIZED mode the halos will be light halos where the background - * is dark. Take your pick - the halos are unavoidable unless you can get - * your hardware/software fixed! (The OPTIMIZED approach is slightly - * faster.) - * - * When the default gamma of PNG files doesn't match the output gamma. - * If you have PNG files with no gamma information png_set_alpha_mode allows - * you to provide a default gamma, but it also sets the ouput gamma to the - * matching value. If you know your PNG files have a gamma that doesn't - * match the output you can take advantage of the fact that - * png_set_alpha_mode always sets the output gamma but only sets the PNG - * default if it is not already set: - * - * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_DEFAULT_sRGB); - * png_set_alpha_mode(pp, PNG_ALPHA_PNG, PNG_GAMMA_MAC); - * The first call sets both the default and the output gamma values, the - * second call overrides the output gamma without changing the default. This - * is easier than achieving the same effect with png_set_gamma. You must use - * PNG_ALPHA_PNG for the first call - internal checking in png_set_alpha will - * fire if more than one call to png_set_alpha_mode and png_set_background is - * made in the same read operation, however multiple calls with PNG_ALPHA_PNG - * are ignored. - */ - -#ifdef PNG_READ_STRIP_ALPHA_SUPPORTED -PNG_EXPORT(36, void, png_set_strip_alpha, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \ - defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED) -PNG_EXPORT(37, void, png_set_swap_alpha, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \ - defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED) -PNG_EXPORT(38, void, png_set_invert_alpha, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED) -/* Add a filler byte to 8-bit Gray or 24-bit RGB images. */ -PNG_EXPORT(39, void, png_set_filler, (png_structrp png_ptr, png_uint_32 filler, - int flags)); -/* The values of the PNG_FILLER_ defines should NOT be changed */ -# define PNG_FILLER_BEFORE 0 -# define PNG_FILLER_AFTER 1 -/* Add an alpha byte to 8-bit Gray or 24-bit RGB images. */ -PNG_EXPORT(40, void, png_set_add_alpha, (png_structrp png_ptr, - png_uint_32 filler, int flags)); -#endif /* READ_FILLER || WRITE_FILLER */ - -#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED) -/* Swap bytes in 16-bit depth files. */ -PNG_EXPORT(41, void, png_set_swap, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED) -/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */ -PNG_EXPORT(42, void, png_set_packing, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_PACKSWAP_SUPPORTED) || \ - defined(PNG_WRITE_PACKSWAP_SUPPORTED) -/* Swap packing order of pixels in bytes. */ -PNG_EXPORT(43, void, png_set_packswap, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED) -/* Converts files to legal bit depths. */ -PNG_EXPORT(44, void, png_set_shift, (png_structrp png_ptr, png_const_color_8p - true_bits)); -#endif - -#if defined(PNG_READ_INTERLACING_SUPPORTED) || \ - defined(PNG_WRITE_INTERLACING_SUPPORTED) -/* Have the code handle the interlacing. Returns the number of passes. - * MUST be called before png_read_update_info or png_start_read_image, - * otherwise it will not have the desired effect. Note that it is still - * necessary to call png_read_row or png_read_rows png_get_image_height - * times for each pass. -*/ -PNG_EXPORT(45, int, png_set_interlace_handling, (png_structrp png_ptr)); -#endif - -#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED) -/* Invert monochrome files */ -PNG_EXPORT(46, void, png_set_invert_mono, (png_structrp png_ptr)); -#endif - -#ifdef PNG_READ_BACKGROUND_SUPPORTED -/* Handle alpha and tRNS by replacing with a background color. Prior to - * libpng-1.5.4 this API must not be called before the PNG file header has been - * read. Doing so will result in unexpected behavior and possible warnings or - * errors if the PNG file contains a bKGD chunk. - */ -PNG_FP_EXPORT(47, void, png_set_background, (png_structrp png_ptr, - png_const_color_16p background_color, int background_gamma_code, - int need_expand, double background_gamma)) -PNG_FIXED_EXPORT(215, void, png_set_background_fixed, (png_structrp png_ptr, - png_const_color_16p background_color, int background_gamma_code, - int need_expand, png_fixed_point background_gamma)) -#endif -#ifdef PNG_READ_BACKGROUND_SUPPORTED -# define PNG_BACKGROUND_GAMMA_UNKNOWN 0 -# define PNG_BACKGROUND_GAMMA_SCREEN 1 -# define PNG_BACKGROUND_GAMMA_FILE 2 -# define PNG_BACKGROUND_GAMMA_UNIQUE 3 -#endif - -#ifdef PNG_READ_SCALE_16_TO_8_SUPPORTED -/* Scale a 16-bit depth file down to 8-bit, accurately. */ -PNG_EXPORT(229, void, png_set_scale_16, (png_structrp png_ptr)); -#endif - -#ifdef PNG_READ_STRIP_16_TO_8_SUPPORTED -#define PNG_READ_16_TO_8 SUPPORTED /* Name prior to 1.5.4 */ -/* Strip the second byte of information from a 16-bit depth file. */ -PNG_EXPORT(48, void, png_set_strip_16, (png_structrp png_ptr)); -#endif - -#ifdef PNG_READ_QUANTIZE_SUPPORTED -/* Turn on quantizing, and reduce the palette to the number of colors - * available. - */ -PNG_EXPORT(49, void, png_set_quantize, (png_structrp png_ptr, - png_colorp palette, int num_palette, int maximum_colors, - png_const_uint_16p histogram, int full_quantize)); -#endif - -#ifdef PNG_READ_GAMMA_SUPPORTED -/* The threshold on gamma processing is configurable but hard-wired into the - * library. The following is the floating point variant. - */ -#define PNG_GAMMA_THRESHOLD (PNG_GAMMA_THRESHOLD_FIXED*.00001) - -/* Handle gamma correction. Screen_gamma=(display_exponent). - * NOTE: this API simply sets the screen and file gamma values. It will - * therefore override the value for gamma in a PNG file if it is called after - * the file header has been read - use with care - call before reading the PNG - * file for best results! - * - * These routines accept the same gamma values as png_set_alpha_mode (described - * above). The PNG_GAMMA_ defines and PNG_DEFAULT_sRGB can be passed to either - * API (floating point or fixed.) Notice, however, that the 'file_gamma' value - * is the inverse of a 'screen gamma' value. - */ -PNG_FP_EXPORT(50, void, png_set_gamma, (png_structrp png_ptr, - double screen_gamma, double override_file_gamma)) -PNG_FIXED_EXPORT(208, void, png_set_gamma_fixed, (png_structrp png_ptr, - png_fixed_point screen_gamma, png_fixed_point override_file_gamma)) -#endif - -#ifdef PNG_WRITE_FLUSH_SUPPORTED -/* Set how many lines between output flushes - 0 for no flushing */ -PNG_EXPORT(51, void, png_set_flush, (png_structrp png_ptr, int nrows)); -/* Flush the current PNG output buffer */ -PNG_EXPORT(52, void, png_write_flush, (png_structrp png_ptr)); -#endif - -/* Optional update palette with requested transformations */ -PNG_EXPORT(53, void, png_start_read_image, (png_structrp png_ptr)); - -/* Optional call to update the users info structure */ -PNG_EXPORT(54, void, png_read_update_info, (png_structrp png_ptr, - png_inforp info_ptr)); - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -/* Read one or more rows of image data. */ -PNG_EXPORT(55, void, png_read_rows, (png_structrp png_ptr, png_bytepp row, - png_bytepp display_row, png_uint_32 num_rows)); -#endif - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -/* Read a row of data. */ -PNG_EXPORT(56, void, png_read_row, (png_structrp png_ptr, png_bytep row, - png_bytep display_row)); -#endif - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -/* Read the whole image into memory at once. */ -PNG_EXPORT(57, void, png_read_image, (png_structrp png_ptr, png_bytepp image)); -#endif - -/* Write a row of image data */ -PNG_EXPORT(58, void, png_write_row, (png_structrp png_ptr, - png_const_bytep row)); - -/* Write a few rows of image data: (*row) is not written; however, the type - * is declared as writeable to maintain compatibility with previous versions - * of libpng and to allow the 'display_row' array from read_rows to be passed - * unchanged to write_rows. - */ -PNG_EXPORT(59, void, png_write_rows, (png_structrp png_ptr, png_bytepp row, - png_uint_32 num_rows)); - -/* Write the image data */ -PNG_EXPORT(60, void, png_write_image, (png_structrp png_ptr, png_bytepp image)); - -/* Write the end of the PNG file. */ -PNG_EXPORT(61, void, png_write_end, (png_structrp png_ptr, - png_inforp info_ptr)); - -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -/* Read the end of the PNG file. */ -PNG_EXPORT(62, void, png_read_end, (png_structrp png_ptr, png_inforp info_ptr)); -#endif - -/* Free any memory associated with the png_info_struct */ -PNG_EXPORT(63, void, png_destroy_info_struct, (png_const_structrp png_ptr, - png_infopp info_ptr_ptr)); - -/* Free any memory associated with the png_struct and the png_info_structs */ -PNG_EXPORT(64, void, png_destroy_read_struct, (png_structpp png_ptr_ptr, - png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr)); - -/* Free any memory associated with the png_struct and the png_info_structs */ -PNG_EXPORT(65, void, png_destroy_write_struct, (png_structpp png_ptr_ptr, - png_infopp info_ptr_ptr)); - -/* Set the libpng method of handling chunk CRC errors */ -PNG_EXPORT(66, void, png_set_crc_action, (png_structrp png_ptr, int crit_action, - int ancil_action)); - -/* Values for png_set_crc_action() say how to handle CRC errors in - * ancillary and critical chunks, and whether to use the data contained - * therein. Note that it is impossible to "discard" data in a critical - * chunk. For versions prior to 0.90, the action was always error/quit, - * whereas in version 0.90 and later, the action for CRC errors in ancillary - * chunks is warn/discard. These values should NOT be changed. - * - * value action:critical action:ancillary - */ -#define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */ -#define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */ -#define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */ -#define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */ -#define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */ -#define PNG_CRC_NO_CHANGE 5 /* use current value use current value */ - -#ifdef PNG_WRITE_SUPPORTED -/* These functions give the user control over the scan-line filtering in - * libpng and the compression methods used by zlib. These functions are - * mainly useful for testing, as the defaults should work with most users. - * Those users who are tight on memory or want faster performance at the - * expense of compression can modify them. See the compression library - * header file (zlib.h) for an explination of the compression functions. - */ - -/* Set the filtering method(s) used by libpng. Currently, the only valid - * value for "method" is 0. - */ -PNG_EXPORT(67, void, png_set_filter, (png_structrp png_ptr, int method, - int filters)); -#endif /* WRITE */ - -/* Flags for png_set_filter() to say which filters to use. The flags - * are chosen so that they don't conflict with real filter types - * below, in case they are supplied instead of the #defined constants. - * These values should NOT be changed. - */ -#define PNG_NO_FILTERS 0x00 -#define PNG_FILTER_NONE 0x08 -#define PNG_FILTER_SUB 0x10 -#define PNG_FILTER_UP 0x20 -#define PNG_FILTER_AVG 0x40 -#define PNG_FILTER_PAETH 0x80 -#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \ - PNG_FILTER_AVG | PNG_FILTER_PAETH) - -/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now. - * These defines should NOT be changed. - */ -#define PNG_FILTER_VALUE_NONE 0 -#define PNG_FILTER_VALUE_SUB 1 -#define PNG_FILTER_VALUE_UP 2 -#define PNG_FILTER_VALUE_AVG 3 -#define PNG_FILTER_VALUE_PAETH 4 -#define PNG_FILTER_VALUE_LAST 5 - -#ifdef PNG_WRITE_SUPPORTED -#ifdef PNG_WRITE_WEIGHTED_FILTER_SUPPORTED /* DEPRECATED */ -PNG_FP_EXPORT(68, void, png_set_filter_heuristics, (png_structrp png_ptr, - int heuristic_method, int num_weights, png_const_doublep filter_weights, - png_const_doublep filter_costs)) -PNG_FIXED_EXPORT(209, void, png_set_filter_heuristics_fixed, - (png_structrp png_ptr, int heuristic_method, int num_weights, - png_const_fixed_point_p filter_weights, - png_const_fixed_point_p filter_costs)) -#endif /* WRITE_WEIGHTED_FILTER */ - -/* The following are no longer used and will be removed from libpng-1.7: */ -#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */ -#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */ -#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */ -#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */ - -/* Set the library compression level. Currently, valid values range from - * 0 - 9, corresponding directly to the zlib compression levels 0 - 9 - * (0 - no compression, 9 - "maximal" compression). Note that tests have - * shown that zlib compression levels 3-6 usually perform as well as level 9 - * for PNG images, and do considerably fewer caclulations. In the future, - * these values may not correspond directly to the zlib compression levels. - */ -#ifdef PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED -PNG_EXPORT(69, void, png_set_compression_level, (png_structrp png_ptr, - int level)); - -PNG_EXPORT(70, void, png_set_compression_mem_level, (png_structrp png_ptr, - int mem_level)); - -PNG_EXPORT(71, void, png_set_compression_strategy, (png_structrp png_ptr, - int strategy)); - -/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a - * smaller value of window_bits if it can do so safely. - */ -PNG_EXPORT(72, void, png_set_compression_window_bits, (png_structrp png_ptr, - int window_bits)); - -PNG_EXPORT(73, void, png_set_compression_method, (png_structrp png_ptr, - int method)); -#endif /* WRITE_CUSTOMIZE_COMPRESSION */ - -#ifdef PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED -/* Also set zlib parameters for compressing non-IDAT chunks */ -PNG_EXPORT(222, void, png_set_text_compression_level, (png_structrp png_ptr, - int level)); - -PNG_EXPORT(223, void, png_set_text_compression_mem_level, (png_structrp png_ptr, - int mem_level)); - -PNG_EXPORT(224, void, png_set_text_compression_strategy, (png_structrp png_ptr, - int strategy)); - -/* If PNG_WRITE_OPTIMIZE_CMF_SUPPORTED is defined, libpng will use a - * smaller value of window_bits if it can do so safely. - */ -PNG_EXPORT(225, void, png_set_text_compression_window_bits, - (png_structrp png_ptr, int window_bits)); - -PNG_EXPORT(226, void, png_set_text_compression_method, (png_structrp png_ptr, - int method)); -#endif /* WRITE_CUSTOMIZE_ZTXT_COMPRESSION */ -#endif /* WRITE */ - -/* These next functions are called for input/output, memory, and error - * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c, - * and call standard C I/O routines such as fread(), fwrite(), and - * fprintf(). These functions can be made to use other I/O routines - * at run time for those applications that need to handle I/O in a - * different manner by calling png_set_???_fn(). See libpng-manual.txt for - * more information. - */ - -#ifdef PNG_STDIO_SUPPORTED -/* Initialize the input/output for the PNG file to the default functions. */ -PNG_EXPORT(74, void, png_init_io, (png_structrp png_ptr, png_FILE_p fp)); -#endif - -/* Replace the (error and abort), and warning functions with user - * supplied functions. If no messages are to be printed you must still - * write and use replacement functions. The replacement error_fn should - * still do a longjmp to the last setjmp location if you are using this - * method of error handling. If error_fn or warning_fn is NULL, the - * default function will be used. - */ - -PNG_EXPORT(75, void, png_set_error_fn, (png_structrp png_ptr, - png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn)); - -/* Return the user pointer associated with the error functions */ -PNG_EXPORT(76, png_voidp, png_get_error_ptr, (png_const_structrp png_ptr)); - -/* Replace the default data output functions with a user supplied one(s). - * If buffered output is not used, then output_flush_fn can be set to NULL. - * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time - * output_flush_fn will be ignored (and thus can be NULL). - * It is probably a mistake to use NULL for output_flush_fn if - * write_data_fn is not also NULL unless you have built libpng with - * PNG_WRITE_FLUSH_SUPPORTED undefined, because in this case libpng's - * default flush function, which uses the standard *FILE structure, will - * be used. - */ -PNG_EXPORT(77, void, png_set_write_fn, (png_structrp png_ptr, png_voidp io_ptr, - png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)); - -/* Replace the default data input function with a user supplied one. */ -PNG_EXPORT(78, void, png_set_read_fn, (png_structrp png_ptr, png_voidp io_ptr, - png_rw_ptr read_data_fn)); - -/* Return the user pointer associated with the I/O functions */ -PNG_EXPORT(79, png_voidp, png_get_io_ptr, (png_const_structrp png_ptr)); - -PNG_EXPORT(80, void, png_set_read_status_fn, (png_structrp png_ptr, - png_read_status_ptr read_row_fn)); - -PNG_EXPORT(81, void, png_set_write_status_fn, (png_structrp png_ptr, - png_write_status_ptr write_row_fn)); - -#ifdef PNG_USER_MEM_SUPPORTED -/* Replace the default memory allocation functions with user supplied one(s). */ -PNG_EXPORT(82, void, png_set_mem_fn, (png_structrp png_ptr, png_voidp mem_ptr, - png_malloc_ptr malloc_fn, png_free_ptr free_fn)); -/* Return the user pointer associated with the memory functions */ -PNG_EXPORT(83, png_voidp, png_get_mem_ptr, (png_const_structrp png_ptr)); -#endif - -#ifdef PNG_READ_USER_TRANSFORM_SUPPORTED -PNG_EXPORT(84, void, png_set_read_user_transform_fn, (png_structrp png_ptr, - png_user_transform_ptr read_user_transform_fn)); -#endif - -#ifdef PNG_WRITE_USER_TRANSFORM_SUPPORTED -PNG_EXPORT(85, void, png_set_write_user_transform_fn, (png_structrp png_ptr, - png_user_transform_ptr write_user_transform_fn)); -#endif - -#ifdef PNG_USER_TRANSFORM_PTR_SUPPORTED -PNG_EXPORT(86, void, png_set_user_transform_info, (png_structrp png_ptr, - png_voidp user_transform_ptr, int user_transform_depth, - int user_transform_channels)); -/* Return the user pointer associated with the user transform functions */ -PNG_EXPORT(87, png_voidp, png_get_user_transform_ptr, - (png_const_structrp png_ptr)); -#endif - -#ifdef PNG_USER_TRANSFORM_INFO_SUPPORTED -/* Return information about the row currently being processed. Note that these - * APIs do not fail but will return unexpected results if called outside a user - * transform callback. Also note that when transforming an interlaced image the - * row number is the row number within the sub-image of the interlace pass, so - * the value will increase to the height of the sub-image (not the full image) - * then reset to 0 for the next pass. - * - * Use PNG_ROW_FROM_PASS_ROW(row, pass) and PNG_COL_FROM_PASS_COL(col, pass) to - * find the output pixel (x,y) given an interlaced sub-image pixel - * (row,col,pass). (See below for these macros.) - */ -PNG_EXPORT(217, png_uint_32, png_get_current_row_number, (png_const_structrp)); -PNG_EXPORT(218, png_byte, png_get_current_pass_number, (png_const_structrp)); -#endif - -#ifdef PNG_READ_USER_CHUNKS_SUPPORTED -/* This callback is called only for *unknown* chunks. If - * PNG_HANDLE_AS_UNKNOWN_SUPPORTED is set then it is possible to set known - * chunks to be treated as unknown, however in this case the callback must do - * any processing required by the chunk (e.g. by calling the appropriate - * png_set_ APIs.) - * - * There is no write support - on write, by default, all the chunks in the - * 'unknown' list are written in the specified position. - * - * The integer return from the callback function is interpreted thus: - * - * negative: An error occurred; png_chunk_error will be called. - * zero: The chunk was not handled, the chunk will be saved. A critical - * chunk will cause an error at this point unless it is to be saved. - * positive: The chunk was handled, libpng will ignore/discard it. - * - * See "INTERACTION WTIH USER CHUNK CALLBACKS" below for important notes about - * how this behavior will change in libpng 1.7 - */ -PNG_EXPORT(88, void, png_set_read_user_chunk_fn, (png_structrp png_ptr, - png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn)); -#endif - -#ifdef PNG_USER_CHUNKS_SUPPORTED -PNG_EXPORT(89, png_voidp, png_get_user_chunk_ptr, (png_const_structrp png_ptr)); -#endif - -#ifdef PNG_PROGRESSIVE_READ_SUPPORTED -/* Sets the function callbacks for the push reader, and a pointer to a - * user-defined structure available to the callback functions. - */ -PNG_EXPORT(90, void, png_set_progressive_read_fn, (png_structrp png_ptr, - png_voidp progressive_ptr, png_progressive_info_ptr info_fn, - png_progressive_row_ptr row_fn, png_progressive_end_ptr end_fn)); - -/* Returns the user pointer associated with the push read functions */ -PNG_EXPORT(91, png_voidp, png_get_progressive_ptr, - (png_const_structrp png_ptr)); - -/* Function to be called when data becomes available */ -PNG_EXPORT(92, void, png_process_data, (png_structrp png_ptr, - png_inforp info_ptr, png_bytep buffer, png_size_t buffer_size)); - -/* A function which may be called *only* within png_process_data to stop the - * processing of any more data. The function returns the number of bytes - * remaining, excluding any that libpng has cached internally. A subsequent - * call to png_process_data must supply these bytes again. If the argument - * 'save' is set to true the routine will first save all the pending data and - * will always return 0. - */ -PNG_EXPORT(219, png_size_t, png_process_data_pause, (png_structrp, int save)); - -/* A function which may be called *only* outside (after) a call to - * png_process_data. It returns the number of bytes of data to skip in the - * input. Normally it will return 0, but if it returns a non-zero value the - * application must skip than number of bytes of input data and pass the - * following data to the next call to png_process_data. - */ -PNG_EXPORT(220, png_uint_32, png_process_data_skip, (png_structrp)); - -/* Function that combines rows. 'new_row' is a flag that should come from - * the callback and be non-NULL if anything needs to be done; the library - * stores its own version of the new data internally and ignores the passed - * in value. - */ -PNG_EXPORT(93, void, png_progressive_combine_row, (png_const_structrp png_ptr, - png_bytep old_row, png_const_bytep new_row)); -#endif /* PROGRESSIVE_READ */ - -PNG_EXPORTA(94, png_voidp, png_malloc, (png_const_structrp png_ptr, - png_alloc_size_t size), PNG_ALLOCATED); -/* Added at libpng version 1.4.0 */ -PNG_EXPORTA(95, png_voidp, png_calloc, (png_const_structrp png_ptr, - png_alloc_size_t size), PNG_ALLOCATED); - -/* Added at libpng version 1.2.4 */ -PNG_EXPORTA(96, png_voidp, png_malloc_warn, (png_const_structrp png_ptr, - png_alloc_size_t size), PNG_ALLOCATED); - -/* Frees a pointer allocated by png_malloc() */ -PNG_EXPORT(97, void, png_free, (png_const_structrp png_ptr, png_voidp ptr)); - -/* Free data that was allocated internally */ -PNG_EXPORT(98, void, png_free_data, (png_const_structrp png_ptr, - png_inforp info_ptr, png_uint_32 free_me, int num)); - -/* Reassign responsibility for freeing existing data, whether allocated - * by libpng or by the application; this works on the png_info structure passed - * in, it does not change the state for other png_info structures. - * - * It is unlikely that this function works correctly as of 1.6.0 and using it - * may result either in memory leaks or double free of allocated data. - */ -PNG_EXPORT(99, void, png_data_freer, (png_const_structrp png_ptr, - png_inforp info_ptr, int freer, png_uint_32 mask)); - -/* Assignments for png_data_freer */ -#define PNG_DESTROY_WILL_FREE_DATA 1 -#define PNG_SET_WILL_FREE_DATA 1 -#define PNG_USER_WILL_FREE_DATA 2 -/* Flags for png_ptr->free_me and info_ptr->free_me */ -#define PNG_FREE_HIST 0x0008 -#define PNG_FREE_ICCP 0x0010 -#define PNG_FREE_SPLT 0x0020 -#define PNG_FREE_ROWS 0x0040 -#define PNG_FREE_PCAL 0x0080 -#define PNG_FREE_SCAL 0x0100 -#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED -# define PNG_FREE_UNKN 0x0200 -#endif -/* PNG_FREE_LIST 0x0400 removed in 1.6.0 because it is ignored */ -#define PNG_FREE_PLTE 0x1000 -#define PNG_FREE_TRNS 0x2000 -#define PNG_FREE_TEXT 0x4000 -#define PNG_FREE_ALL 0x7fff -#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */ - -#ifdef PNG_USER_MEM_SUPPORTED -PNG_EXPORTA(100, png_voidp, png_malloc_default, (png_const_structrp png_ptr, - png_alloc_size_t size), PNG_ALLOCATED PNG_DEPRECATED); -PNG_EXPORTA(101, void, png_free_default, (png_const_structrp png_ptr, - png_voidp ptr), PNG_DEPRECATED); -#endif - -#ifdef PNG_ERROR_TEXT_SUPPORTED -/* Fatal error in PNG image of libpng - can't continue */ -PNG_EXPORTA(102, void, png_error, (png_const_structrp png_ptr, - png_const_charp error_message), PNG_NORETURN); - -/* The same, but the chunk name is prepended to the error string. */ -PNG_EXPORTA(103, void, png_chunk_error, (png_const_structrp png_ptr, - png_const_charp error_message), PNG_NORETURN); - -#else -/* Fatal error in PNG image of libpng - can't continue */ -PNG_EXPORTA(104, void, png_err, (png_const_structrp png_ptr), PNG_NORETURN); -# define png_error(s1,s2) png_err(s1) -# define png_chunk_error(s1,s2) png_err(s1) -#endif - -#ifdef PNG_WARNINGS_SUPPORTED -/* Non-fatal error in libpng. Can continue, but may have a problem. */ -PNG_EXPORT(105, void, png_warning, (png_const_structrp png_ptr, - png_const_charp warning_message)); - -/* Non-fatal error in libpng, chunk name is prepended to message. */ -PNG_EXPORT(106, void, png_chunk_warning, (png_const_structrp png_ptr, - png_const_charp warning_message)); -#else -# define png_warning(s1,s2) ((void)(s1)) -# define png_chunk_warning(s1,s2) ((void)(s1)) -#endif - -#ifdef PNG_BENIGN_ERRORS_SUPPORTED -/* Benign error in libpng. Can continue, but may have a problem. - * User can choose whether to handle as a fatal error or as a warning. */ -PNG_EXPORT(107, void, png_benign_error, (png_const_structrp png_ptr, - png_const_charp warning_message)); - -#ifdef PNG_READ_SUPPORTED -/* Same, chunk name is prepended to message (only during read) */ -PNG_EXPORT(108, void, png_chunk_benign_error, (png_const_structrp png_ptr, - png_const_charp warning_message)); -#endif - -PNG_EXPORT(109, void, png_set_benign_errors, - (png_structrp png_ptr, int allowed)); -#else -# ifdef PNG_ALLOW_BENIGN_ERRORS -# define png_benign_error png_warning -# define png_chunk_benign_error png_chunk_warning -# else -# define png_benign_error png_error -# define png_chunk_benign_error png_chunk_error -# endif -#endif - -/* The png_set_ functions are for storing values in the png_info_struct. - * Similarly, the png_get_ calls are used to read values from the - * png_info_struct, either storing the parameters in the passed variables, or - * setting pointers into the png_info_struct where the data is stored. The - * png_get_ functions return a non-zero value if the data was available - * in info_ptr, or return zero and do not change any of the parameters if the - * data was not available. - * - * These functions should be used instead of directly accessing png_info - * to avoid problems with future changes in the size and internal layout of - * png_info_struct. - */ -/* Returns "flag" if chunk data is valid in info_ptr. */ -PNG_EXPORT(110, png_uint_32, png_get_valid, (png_const_structrp png_ptr, - png_const_inforp info_ptr, png_uint_32 flag)); - -/* Returns number of bytes needed to hold a transformed row. */ -PNG_EXPORT(111, png_size_t, png_get_rowbytes, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -#ifdef PNG_INFO_IMAGE_SUPPORTED -/* Returns row_pointers, which is an array of pointers to scanlines that was - * returned from png_read_png(). - */ -PNG_EXPORT(112, png_bytepp, png_get_rows, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Set row_pointers, which is an array of pointers to scanlines for use - * by png_write_png(). - */ -PNG_EXPORT(113, void, png_set_rows, (png_const_structrp png_ptr, - png_inforp info_ptr, png_bytepp row_pointers)); -#endif - -/* Returns number of color channels in image. */ -PNG_EXPORT(114, png_byte, png_get_channels, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -#ifdef PNG_EASY_ACCESS_SUPPORTED -/* Returns image width in pixels. */ -PNG_EXPORT(115, png_uint_32, png_get_image_width, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Returns image height in pixels. */ -PNG_EXPORT(116, png_uint_32, png_get_image_height, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Returns image bit_depth. */ -PNG_EXPORT(117, png_byte, png_get_bit_depth, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Returns image color_type. */ -PNG_EXPORT(118, png_byte, png_get_color_type, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Returns image filter_type. */ -PNG_EXPORT(119, png_byte, png_get_filter_type, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Returns image interlace_type. */ -PNG_EXPORT(120, png_byte, png_get_interlace_type, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Returns image compression_type. */ -PNG_EXPORT(121, png_byte, png_get_compression_type, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); - -/* Returns image resolution in pixels per meter, from pHYs chunk data. */ -PNG_EXPORT(122, png_uint_32, png_get_pixels_per_meter, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); -PNG_EXPORT(123, png_uint_32, png_get_x_pixels_per_meter, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); -PNG_EXPORT(124, png_uint_32, png_get_y_pixels_per_meter, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); - -/* Returns pixel aspect ratio, computed from pHYs chunk data. */ -PNG_FP_EXPORT(125, float, png_get_pixel_aspect_ratio, - (png_const_structrp png_ptr, png_const_inforp info_ptr)) -PNG_FIXED_EXPORT(210, png_fixed_point, png_get_pixel_aspect_ratio_fixed, - (png_const_structrp png_ptr, png_const_inforp info_ptr)) - -/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */ -PNG_EXPORT(126, png_int_32, png_get_x_offset_pixels, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); -PNG_EXPORT(127, png_int_32, png_get_y_offset_pixels, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); -PNG_EXPORT(128, png_int_32, png_get_x_offset_microns, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); -PNG_EXPORT(129, png_int_32, png_get_y_offset_microns, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); - -#endif /* EASY_ACCESS */ - -#ifdef PNG_READ_SUPPORTED -/* Returns pointer to signature string read from PNG header */ -PNG_EXPORT(130, png_const_bytep, png_get_signature, (png_const_structrp png_ptr, - png_const_inforp info_ptr)); -#endif - -#ifdef PNG_bKGD_SUPPORTED -PNG_EXPORT(131, png_uint_32, png_get_bKGD, (png_const_structrp png_ptr, - png_inforp info_ptr, png_color_16p *background)); -#endif - -#ifdef PNG_bKGD_SUPPORTED -PNG_EXPORT(132, void, png_set_bKGD, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_color_16p background)); -#endif - -#ifdef PNG_cHRM_SUPPORTED -PNG_FP_EXPORT(133, png_uint_32, png_get_cHRM, (png_const_structrp png_ptr, - png_const_inforp info_ptr, double *white_x, double *white_y, double *red_x, - double *red_y, double *green_x, double *green_y, double *blue_x, - double *blue_y)) -PNG_FP_EXPORT(230, png_uint_32, png_get_cHRM_XYZ, (png_const_structrp png_ptr, - png_const_inforp info_ptr, double *red_X, double *red_Y, double *red_Z, - double *green_X, double *green_Y, double *green_Z, double *blue_X, - double *blue_Y, double *blue_Z)) -PNG_FIXED_EXPORT(134, png_uint_32, png_get_cHRM_fixed, - (png_const_structrp png_ptr, png_const_inforp info_ptr, - png_fixed_point *int_white_x, png_fixed_point *int_white_y, - png_fixed_point *int_red_x, png_fixed_point *int_red_y, - png_fixed_point *int_green_x, png_fixed_point *int_green_y, - png_fixed_point *int_blue_x, png_fixed_point *int_blue_y)) -PNG_FIXED_EXPORT(231, png_uint_32, png_get_cHRM_XYZ_fixed, - (png_const_structrp png_ptr, png_const_inforp info_ptr, - png_fixed_point *int_red_X, png_fixed_point *int_red_Y, - png_fixed_point *int_red_Z, png_fixed_point *int_green_X, - png_fixed_point *int_green_Y, png_fixed_point *int_green_Z, - png_fixed_point *int_blue_X, png_fixed_point *int_blue_Y, - png_fixed_point *int_blue_Z)) -#endif - -#ifdef PNG_cHRM_SUPPORTED -PNG_FP_EXPORT(135, void, png_set_cHRM, (png_const_structrp png_ptr, - png_inforp info_ptr, - double white_x, double white_y, double red_x, double red_y, double green_x, - double green_y, double blue_x, double blue_y)) -PNG_FP_EXPORT(232, void, png_set_cHRM_XYZ, (png_const_structrp png_ptr, - png_inforp info_ptr, double red_X, double red_Y, double red_Z, - double green_X, double green_Y, double green_Z, double blue_X, - double blue_Y, double blue_Z)) -PNG_FIXED_EXPORT(136, void, png_set_cHRM_fixed, (png_const_structrp png_ptr, - png_inforp info_ptr, png_fixed_point int_white_x, - png_fixed_point int_white_y, png_fixed_point int_red_x, - png_fixed_point int_red_y, png_fixed_point int_green_x, - png_fixed_point int_green_y, png_fixed_point int_blue_x, - png_fixed_point int_blue_y)) -PNG_FIXED_EXPORT(233, void, png_set_cHRM_XYZ_fixed, (png_const_structrp png_ptr, - png_inforp info_ptr, png_fixed_point int_red_X, png_fixed_point int_red_Y, - png_fixed_point int_red_Z, png_fixed_point int_green_X, - png_fixed_point int_green_Y, png_fixed_point int_green_Z, - png_fixed_point int_blue_X, png_fixed_point int_blue_Y, - png_fixed_point int_blue_Z)) -#endif - -#ifdef PNG_gAMA_SUPPORTED -PNG_FP_EXPORT(137, png_uint_32, png_get_gAMA, (png_const_structrp png_ptr, - png_const_inforp info_ptr, double *file_gamma)) -PNG_FIXED_EXPORT(138, png_uint_32, png_get_gAMA_fixed, - (png_const_structrp png_ptr, png_const_inforp info_ptr, - png_fixed_point *int_file_gamma)) -#endif - -#ifdef PNG_gAMA_SUPPORTED -PNG_FP_EXPORT(139, void, png_set_gAMA, (png_const_structrp png_ptr, - png_inforp info_ptr, double file_gamma)) -PNG_FIXED_EXPORT(140, void, png_set_gAMA_fixed, (png_const_structrp png_ptr, - png_inforp info_ptr, png_fixed_point int_file_gamma)) -#endif - -#ifdef PNG_hIST_SUPPORTED -PNG_EXPORT(141, png_uint_32, png_get_hIST, (png_const_structrp png_ptr, - png_inforp info_ptr, png_uint_16p *hist)); -#endif - -#ifdef PNG_hIST_SUPPORTED -PNG_EXPORT(142, void, png_set_hIST, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_uint_16p hist)); -#endif - -PNG_EXPORT(143, png_uint_32, png_get_IHDR, (png_const_structrp png_ptr, - png_const_inforp info_ptr, png_uint_32 *width, png_uint_32 *height, - int *bit_depth, int *color_type, int *interlace_method, - int *compression_method, int *filter_method)); - -PNG_EXPORT(144, void, png_set_IHDR, (png_const_structrp png_ptr, - png_inforp info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth, - int color_type, int interlace_method, int compression_method, - int filter_method)); - -#ifdef PNG_oFFs_SUPPORTED -PNG_EXPORT(145, png_uint_32, png_get_oFFs, (png_const_structrp png_ptr, - png_const_inforp info_ptr, png_int_32 *offset_x, png_int_32 *offset_y, - int *unit_type)); -#endif - -#ifdef PNG_oFFs_SUPPORTED -PNG_EXPORT(146, void, png_set_oFFs, (png_const_structrp png_ptr, - png_inforp info_ptr, png_int_32 offset_x, png_int_32 offset_y, - int unit_type)); -#endif - -#ifdef PNG_pCAL_SUPPORTED -PNG_EXPORT(147, png_uint_32, png_get_pCAL, (png_const_structrp png_ptr, - png_inforp info_ptr, png_charp *purpose, png_int_32 *X0, - png_int_32 *X1, int *type, int *nparams, png_charp *units, - png_charpp *params)); -#endif - -#ifdef PNG_pCAL_SUPPORTED -PNG_EXPORT(148, void, png_set_pCAL, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_charp purpose, png_int_32 X0, png_int_32 X1, - int type, int nparams, png_const_charp units, png_charpp params)); -#endif - -#ifdef PNG_pHYs_SUPPORTED -PNG_EXPORT(149, png_uint_32, png_get_pHYs, (png_const_structrp png_ptr, - png_const_inforp info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, - int *unit_type)); -#endif - -#ifdef PNG_pHYs_SUPPORTED -PNG_EXPORT(150, void, png_set_pHYs, (png_const_structrp png_ptr, - png_inforp info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type)); -#endif - -PNG_EXPORT(151, png_uint_32, png_get_PLTE, (png_const_structrp png_ptr, - png_inforp info_ptr, png_colorp *palette, int *num_palette)); - -PNG_EXPORT(152, void, png_set_PLTE, (png_structrp png_ptr, - png_inforp info_ptr, png_const_colorp palette, int num_palette)); - -#ifdef PNG_sBIT_SUPPORTED -PNG_EXPORT(153, png_uint_32, png_get_sBIT, (png_const_structrp png_ptr, - png_inforp info_ptr, png_color_8p *sig_bit)); -#endif - -#ifdef PNG_sBIT_SUPPORTED -PNG_EXPORT(154, void, png_set_sBIT, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_color_8p sig_bit)); -#endif - -#ifdef PNG_sRGB_SUPPORTED -PNG_EXPORT(155, png_uint_32, png_get_sRGB, (png_const_structrp png_ptr, - png_const_inforp info_ptr, int *file_srgb_intent)); -#endif - -#ifdef PNG_sRGB_SUPPORTED -PNG_EXPORT(156, void, png_set_sRGB, (png_const_structrp png_ptr, - png_inforp info_ptr, int srgb_intent)); -PNG_EXPORT(157, void, png_set_sRGB_gAMA_and_cHRM, (png_const_structrp png_ptr, - png_inforp info_ptr, int srgb_intent)); -#endif - -#ifdef PNG_iCCP_SUPPORTED -PNG_EXPORT(158, png_uint_32, png_get_iCCP, (png_const_structrp png_ptr, - png_inforp info_ptr, png_charpp name, int *compression_type, - png_bytepp profile, png_uint_32 *proflen)); -#endif - -#ifdef PNG_iCCP_SUPPORTED -PNG_EXPORT(159, void, png_set_iCCP, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_charp name, int compression_type, - png_const_bytep profile, png_uint_32 proflen)); -#endif - -#ifdef PNG_sPLT_SUPPORTED -PNG_EXPORT(160, int, png_get_sPLT, (png_const_structrp png_ptr, - png_inforp info_ptr, png_sPLT_tpp entries)); -#endif - -#ifdef PNG_sPLT_SUPPORTED -PNG_EXPORT(161, void, png_set_sPLT, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_sPLT_tp entries, int nentries)); -#endif - -#ifdef PNG_TEXT_SUPPORTED -/* png_get_text also returns the number of text chunks in *num_text */ -PNG_EXPORT(162, int, png_get_text, (png_const_structrp png_ptr, - png_inforp info_ptr, png_textp *text_ptr, int *num_text)); -#endif - -/* Note while png_set_text() will accept a structure whose text, - * language, and translated keywords are NULL pointers, the structure - * returned by png_get_text will always contain regular - * zero-terminated C strings. They might be empty strings but - * they will never be NULL pointers. - */ - -#ifdef PNG_TEXT_SUPPORTED -PNG_EXPORT(163, void, png_set_text, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_textp text_ptr, int num_text)); -#endif - -#ifdef PNG_tIME_SUPPORTED -PNG_EXPORT(164, png_uint_32, png_get_tIME, (png_const_structrp png_ptr, - png_inforp info_ptr, png_timep *mod_time)); -#endif - -#ifdef PNG_tIME_SUPPORTED -PNG_EXPORT(165, void, png_set_tIME, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_timep mod_time)); -#endif - -#ifdef PNG_tRNS_SUPPORTED -PNG_EXPORT(166, png_uint_32, png_get_tRNS, (png_const_structrp png_ptr, - png_inforp info_ptr, png_bytep *trans_alpha, int *num_trans, - png_color_16p *trans_color)); -#endif - -#ifdef PNG_tRNS_SUPPORTED -PNG_EXPORT(167, void, png_set_tRNS, (png_structrp png_ptr, - png_inforp info_ptr, png_const_bytep trans_alpha, int num_trans, - png_const_color_16p trans_color)); -#endif - -#ifdef PNG_sCAL_SUPPORTED -PNG_FP_EXPORT(168, png_uint_32, png_get_sCAL, (png_const_structrp png_ptr, - png_const_inforp info_ptr, int *unit, double *width, double *height)) -#if defined(PNG_FLOATING_ARITHMETIC_SUPPORTED) || \ - defined(PNG_FLOATING_POINT_SUPPORTED) -/* NOTE: this API is currently implemented using floating point arithmetic, - * consequently it can only be used on systems with floating point support. - * In any case the range of values supported by png_fixed_point is small and it - * is highly recommended that png_get_sCAL_s be used instead. - */ -PNG_FIXED_EXPORT(214, png_uint_32, png_get_sCAL_fixed, - (png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit, - png_fixed_point *width, png_fixed_point *height)) -#endif -PNG_EXPORT(169, png_uint_32, png_get_sCAL_s, - (png_const_structrp png_ptr, png_const_inforp info_ptr, int *unit, - png_charpp swidth, png_charpp sheight)); - -PNG_FP_EXPORT(170, void, png_set_sCAL, (png_const_structrp png_ptr, - png_inforp info_ptr, int unit, double width, double height)) -PNG_FIXED_EXPORT(213, void, png_set_sCAL_fixed, (png_const_structrp png_ptr, - png_inforp info_ptr, int unit, png_fixed_point width, - png_fixed_point height)) -PNG_EXPORT(171, void, png_set_sCAL_s, (png_const_structrp png_ptr, - png_inforp info_ptr, int unit, - png_const_charp swidth, png_const_charp sheight)); -#endif /* sCAL */ - -#ifdef PNG_SET_UNKNOWN_CHUNKS_SUPPORTED -/* Provide the default handling for all unknown chunks or, optionally, for - * specific unknown chunks. - * - * NOTE: prior to 1.6.0 the handling specified for particular chunks on read was - * ignored and the default was used, the per-chunk setting only had an effect on - * write. If you wish to have chunk-specific handling on read in code that must - * work on earlier versions you must use a user chunk callback to specify the - * desired handling (keep or discard.) - * - * The 'keep' parameter is a PNG_HANDLE_CHUNK_ value as listed below. The - * parameter is interpreted as follows: - * - * READ: - * PNG_HANDLE_CHUNK_AS_DEFAULT: - * Known chunks: do normal libpng processing, do not keep the chunk (but - * see the comments below about PNG_HANDLE_AS_UNKNOWN_SUPPORTED) - * Unknown chunks: for a specific chunk use the global default, when used - * as the default discard the chunk data. - * PNG_HANDLE_CHUNK_NEVER: - * Discard the chunk data. - * PNG_HANDLE_CHUNK_IF_SAFE: - * Keep the chunk data if the chunk is not critical else raise a chunk - * error. - * PNG_HANDLE_CHUNK_ALWAYS: - * Keep the chunk data. - * - * If the chunk data is saved it can be retrieved using png_get_unknown_chunks, - * below. Notice that specifying "AS_DEFAULT" as a global default is equivalent - * to specifying "NEVER", however when "AS_DEFAULT" is used for specific chunks - * it simply resets the behavior to the libpng default. - * - * INTERACTION WTIH USER CHUNK CALLBACKS: - * The per-chunk handling is always used when there is a png_user_chunk_ptr - * callback and the callback returns 0; the chunk is then always stored *unless* - * it is critical and the per-chunk setting is other than ALWAYS. Notice that - * the global default is *not* used in this case. (In effect the per-chunk - * value is incremented to at least IF_SAFE.) - * - * IMPORTANT NOTE: this behavior will change in libpng 1.7 - the global and - * per-chunk defaults will be honored. If you want to preserve the current - * behavior when your callback returns 0 you must set PNG_HANDLE_CHUNK_IF_SAFE - * as the default - if you don't do this libpng 1.6 will issue a warning. - * - * If you want unhandled unknown chunks to be discarded in libpng 1.6 and - * earlier simply return '1' (handled). - * - * PNG_HANDLE_AS_UNKNOWN_SUPPORTED: - * If this is *not* set known chunks will always be handled by libpng and - * will never be stored in the unknown chunk list. Known chunks listed to - * png_set_keep_unknown_chunks will have no effect. If it is set then known - * chunks listed with a keep other than AS_DEFAULT will *never* be processed - * by libpng, in addition critical chunks must either be processed by the - * callback or saved. - * - * The IHDR and IEND chunks must not be listed. Because this turns off the - * default handling for chunks that would otherwise be recognized the - * behavior of libpng transformations may well become incorrect! - * - * WRITE: - * When writing chunks the options only apply to the chunks specified by - * png_set_unknown_chunks (below), libpng will *always* write known chunks - * required by png_set_ calls and will always write the core critical chunks - * (as required for PLTE). - * - * Each chunk in the png_set_unknown_chunks list is looked up in the - * png_set_keep_unknown_chunks list to find the keep setting, this is then - * interpreted as follows: - * - * PNG_HANDLE_CHUNK_AS_DEFAULT: - * Write safe-to-copy chunks and write other chunks if the global - * default is set to _ALWAYS, otherwise don't write this chunk. - * PNG_HANDLE_CHUNK_NEVER: - * Do not write the chunk. - * PNG_HANDLE_CHUNK_IF_SAFE: - * Write the chunk if it is safe-to-copy, otherwise do not write it. - * PNG_HANDLE_CHUNK_ALWAYS: - * Write the chunk. - * - * Note that the default behavior is effectively the opposite of the read case - - * in read unknown chunks are not stored by default, in write they are written - * by default. Also the behavior of PNG_HANDLE_CHUNK_IF_SAFE is very different - * - on write the safe-to-copy bit is checked, on read the critical bit is - * checked and on read if the chunk is critical an error will be raised. - * - * num_chunks: - * =========== - * If num_chunks is positive, then the "keep" parameter specifies the manner - * for handling only those chunks appearing in the chunk_list array, - * otherwise the chunk list array is ignored. - * - * If num_chunks is 0 the "keep" parameter specifies the default behavior for - * unknown chunks, as described above. - * - * If num_chunks is negative, then the "keep" parameter specifies the manner - * for handling all unknown chunks plus all chunks recognized by libpng - * except for the IHDR, PLTE, tRNS, IDAT, and IEND chunks (which continue to - * be processed by libpng. - */ -PNG_EXPORT(172, void, png_set_keep_unknown_chunks, (png_structrp png_ptr, - int keep, png_const_bytep chunk_list, int num_chunks)); - -/* The "keep" PNG_HANDLE_CHUNK_ parameter for the specified chunk is returned; - * the result is therefore true (non-zero) if special handling is required, - * false for the default handling. - */ -PNG_EXPORT(173, int, png_handle_as_unknown, (png_const_structrp png_ptr, - png_const_bytep chunk_name)); -#endif - -#ifdef PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED -PNG_EXPORT(174, void, png_set_unknown_chunks, (png_const_structrp png_ptr, - png_inforp info_ptr, png_const_unknown_chunkp unknowns, - int num_unknowns)); - /* NOTE: prior to 1.6.0 this routine set the 'location' field of the added - * unknowns to the location currently stored in the png_struct. This is - * invariably the wrong value on write. To fix this call the following API - * for each chunk in the list with the correct location. If you know your - * code won't be compiled on earlier versions you can rely on - * png_set_unknown_chunks(write-ptr, png_get_unknown_chunks(read-ptr)) doing - * the correct thing. - */ - -PNG_EXPORT(175, void, png_set_unknown_chunk_location, - (png_const_structrp png_ptr, png_inforp info_ptr, int chunk, int location)); - -PNG_EXPORT(176, int, png_get_unknown_chunks, (png_const_structrp png_ptr, - png_inforp info_ptr, png_unknown_chunkpp entries)); -#endif - -/* Png_free_data() will turn off the "valid" flag for anything it frees. - * If you need to turn it off for a chunk that your application has freed, - * you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); - */ -PNG_EXPORT(177, void, png_set_invalid, (png_const_structrp png_ptr, - png_inforp info_ptr, int mask)); - -#ifdef PNG_INFO_IMAGE_SUPPORTED -/* The "params" pointer is currently not used and is for future expansion. */ -#ifdef PNG_SEQUENTIAL_READ_SUPPORTED -PNG_EXPORT(178, void, png_read_png, (png_structrp png_ptr, png_inforp info_ptr, - int transforms, png_voidp params)); -#endif -#ifdef PNG_WRITE_SUPPORTED -PNG_EXPORT(179, void, png_write_png, (png_structrp png_ptr, png_inforp info_ptr, - int transforms, png_voidp params)); -#endif -#endif - -PNG_EXPORT(180, png_const_charp, png_get_copyright, - (png_const_structrp png_ptr)); -PNG_EXPORT(181, png_const_charp, png_get_header_ver, - (png_const_structrp png_ptr)); -PNG_EXPORT(182, png_const_charp, png_get_header_version, - (png_const_structrp png_ptr)); -PNG_EXPORT(183, png_const_charp, png_get_libpng_ver, - (png_const_structrp png_ptr)); - -#ifdef PNG_MNG_FEATURES_SUPPORTED -PNG_EXPORT(184, png_uint_32, png_permit_mng_features, (png_structrp png_ptr, - png_uint_32 mng_features_permitted)); -#endif - -/* For use in png_set_keep_unknown, added to version 1.2.6 */ -#define PNG_HANDLE_CHUNK_AS_DEFAULT 0 -#define PNG_HANDLE_CHUNK_NEVER 1 -#define PNG_HANDLE_CHUNK_IF_SAFE 2 -#define PNG_HANDLE_CHUNK_ALWAYS 3 -#define PNG_HANDLE_CHUNK_LAST 4 - -/* Strip the prepended error numbers ("#nnn ") from error and warning - * messages before passing them to the error or warning handler. - */ -#ifdef PNG_ERROR_NUMBERS_SUPPORTED -PNG_EXPORT(185, void, png_set_strip_error_numbers, (png_structrp png_ptr, - png_uint_32 strip_mode)); -#endif - -/* Added in libpng-1.2.6 */ -#ifdef PNG_SET_USER_LIMITS_SUPPORTED -PNG_EXPORT(186, void, png_set_user_limits, (png_structrp png_ptr, - png_uint_32 user_width_max, png_uint_32 user_height_max)); -PNG_EXPORT(187, png_uint_32, png_get_user_width_max, - (png_const_structrp png_ptr)); -PNG_EXPORT(188, png_uint_32, png_get_user_height_max, - (png_const_structrp png_ptr)); -/* Added in libpng-1.4.0 */ -PNG_EXPORT(189, void, png_set_chunk_cache_max, (png_structrp png_ptr, - png_uint_32 user_chunk_cache_max)); -PNG_EXPORT(190, png_uint_32, png_get_chunk_cache_max, - (png_const_structrp png_ptr)); -/* Added in libpng-1.4.1 */ -PNG_EXPORT(191, void, png_set_chunk_malloc_max, (png_structrp png_ptr, - png_alloc_size_t user_chunk_cache_max)); -PNG_EXPORT(192, png_alloc_size_t, png_get_chunk_malloc_max, - (png_const_structrp png_ptr)); -#endif - -#if defined(PNG_INCH_CONVERSIONS_SUPPORTED) -PNG_EXPORT(193, png_uint_32, png_get_pixels_per_inch, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); - -PNG_EXPORT(194, png_uint_32, png_get_x_pixels_per_inch, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); - -PNG_EXPORT(195, png_uint_32, png_get_y_pixels_per_inch, - (png_const_structrp png_ptr, png_const_inforp info_ptr)); - -PNG_FP_EXPORT(196, float, png_get_x_offset_inches, - (png_const_structrp png_ptr, png_const_inforp info_ptr)) -#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ -PNG_FIXED_EXPORT(211, png_fixed_point, png_get_x_offset_inches_fixed, - (png_const_structrp png_ptr, png_const_inforp info_ptr)) -#endif - -PNG_FP_EXPORT(197, float, png_get_y_offset_inches, (png_const_structrp png_ptr, - png_const_inforp info_ptr)) -#ifdef PNG_FIXED_POINT_SUPPORTED /* otherwise not implemented. */ -PNG_FIXED_EXPORT(212, png_fixed_point, png_get_y_offset_inches_fixed, - (png_const_structrp png_ptr, png_const_inforp info_ptr)) -#endif - -# ifdef PNG_pHYs_SUPPORTED -PNG_EXPORT(198, png_uint_32, png_get_pHYs_dpi, (png_const_structrp png_ptr, - png_const_inforp info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, - int *unit_type)); -# endif /* pHYs */ -#endif /* INCH_CONVERSIONS */ - -/* Added in libpng-1.4.0 */ -#ifdef PNG_IO_STATE_SUPPORTED -PNG_EXPORT(199, png_uint_32, png_get_io_state, (png_const_structrp png_ptr)); - -/* Removed from libpng 1.6; use png_get_io_chunk_type. */ -PNG_REMOVED(200, png_const_bytep, png_get_io_chunk_name, (png_structrp png_ptr), - PNG_DEPRECATED) - -PNG_EXPORT(216, png_uint_32, png_get_io_chunk_type, - (png_const_structrp png_ptr)); - -/* The flags returned by png_get_io_state() are the following: */ -# define PNG_IO_NONE 0x0000 /* no I/O at this moment */ -# define PNG_IO_READING 0x0001 /* currently reading */ -# define PNG_IO_WRITING 0x0002 /* currently writing */ -# define PNG_IO_SIGNATURE 0x0010 /* currently at the file signature */ -# define PNG_IO_CHUNK_HDR 0x0020 /* currently at the chunk header */ -# define PNG_IO_CHUNK_DATA 0x0040 /* currently at the chunk data */ -# define PNG_IO_CHUNK_CRC 0x0080 /* currently at the chunk crc */ -# define PNG_IO_MASK_OP 0x000f /* current operation: reading/writing */ -# define PNG_IO_MASK_LOC 0x00f0 /* current location: sig/hdr/data/crc */ -#endif /* IO_STATE */ - -/* Interlace support. The following macros are always defined so that if - * libpng interlace handling is turned off the macros may be used to handle - * interlaced images within the application. - */ -#define PNG_INTERLACE_ADAM7_PASSES 7 - -/* Two macros to return the first row and first column of the original, - * full, image which appears in a given pass. 'pass' is in the range 0 - * to 6 and the result is in the range 0 to 7. - */ -#define PNG_PASS_START_ROW(pass) (((1&~(pass))<<(3-((pass)>>1)))&7) -#define PNG_PASS_START_COL(pass) (((1& (pass))<<(3-(((pass)+1)>>1)))&7) - -/* A macro to return the offset between pixels in the output row for a pair of - * pixels in the input - effectively the inverse of the 'COL_SHIFT' macro that - * follows. Note that ROW_OFFSET is the offset from one row to the next whereas - * COL_OFFSET is from one column to the next, within a row. - */ -#define PNG_PASS_ROW_OFFSET(pass) ((pass)>2?(8>>(((pass)-1)>>1)):8) -#define PNG_PASS_COL_OFFSET(pass) (1<<((7-(pass))>>1)) - -/* Two macros to help evaluate the number of rows or columns in each - * pass. This is expressed as a shift - effectively log2 of the number or - * rows or columns in each 8x8 tile of the original image. - */ -#define PNG_PASS_ROW_SHIFT(pass) ((pass)>2?(8-(pass))>>1:3) -#define PNG_PASS_COL_SHIFT(pass) ((pass)>1?(7-(pass))>>1:3) - -/* Hence two macros to determine the number of rows or columns in a given - * pass of an image given its height or width. In fact these macros may - * return non-zero even though the sub-image is empty, because the other - * dimension may be empty for a small image. - */ -#define PNG_PASS_ROWS(height, pass) (((height)+(((1<>PNG_PASS_ROW_SHIFT(pass)) -#define PNG_PASS_COLS(width, pass) (((width)+(((1<>PNG_PASS_COL_SHIFT(pass)) - -/* For the reader row callbacks (both progressive and sequential) it is - * necessary to find the row in the output image given a row in an interlaced - * image, so two more macros: - */ -#define PNG_ROW_FROM_PASS_ROW(y_in, pass) \ - (((y_in)<>(((7-(off))-(pass))<<2)) & 0xF) | \ - ((0x01145AF0>>(((7-(off))-(pass))<<2)) & 0xF0)) - -#define PNG_ROW_IN_INTERLACE_PASS(y, pass) \ - ((PNG_PASS_MASK(pass,0) >> ((y)&7)) & 1) -#define PNG_COL_IN_INTERLACE_PASS(x, pass) \ - ((PNG_PASS_MASK(pass,1) >> ((x)&7)) & 1) - -#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED -/* With these routines we avoid an integer divide, which will be slower on - * most machines. However, it does take more operations than the corresponding - * divide method, so it may be slower on a few RISC systems. There are two - * shifts (by 8 or 16 bits) and an addition, versus a single integer divide. - * - * Note that the rounding factors are NOT supposed to be the same! 128 and - * 32768 are correct for the NODIV code; 127 and 32767 are correct for the - * standard method. - * - * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ] - */ - - /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */ - -# define png_composite(composite, fg, alpha, bg) \ - { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) \ - * (png_uint_16)(alpha) \ - + (png_uint_16)(bg)*(png_uint_16)(255 \ - - (png_uint_16)(alpha)) + 128); \ - (composite) = (png_byte)(((temp + (temp >> 8)) >> 8) & 0xff); } - -# define png_composite_16(composite, fg, alpha, bg) \ - { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) \ - * (png_uint_32)(alpha) \ - + (png_uint_32)(bg)*(65535 \ - - (png_uint_32)(alpha)) + 32768); \ - (composite) = (png_uint_16)(0xffff & ((temp + (temp >> 16)) >> 16)); } - -#else /* Standard method using integer division */ - -# define png_composite(composite, fg, alpha, bg) \ - (composite) = \ - (png_byte)(0xff & (((png_uint_16)(fg) * (png_uint_16)(alpha) + \ - (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \ - 127) / 255)) - -# define png_composite_16(composite, fg, alpha, bg) \ - (composite) = \ - (png_uint_16)(0xffff & (((png_uint_32)(fg) * (png_uint_32)(alpha) + \ - (png_uint_32)(bg)*(png_uint_32)(65535 - (png_uint_32)(alpha)) + \ - 32767) / 65535)) -#endif /* READ_COMPOSITE_NODIV */ - -#ifdef PNG_READ_INT_FUNCTIONS_SUPPORTED -PNG_EXPORT(201, png_uint_32, png_get_uint_32, (png_const_bytep buf)); -PNG_EXPORT(202, png_uint_16, png_get_uint_16, (png_const_bytep buf)); -PNG_EXPORT(203, png_int_32, png_get_int_32, (png_const_bytep buf)); -#endif - -PNG_EXPORT(204, png_uint_32, png_get_uint_31, (png_const_structrp png_ptr, - png_const_bytep buf)); -/* No png_get_int_16 -- may be added if there's a real need for it. */ - -/* Place a 32-bit number into a buffer in PNG byte order (big-endian). */ -#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED -PNG_EXPORT(205, void, png_save_uint_32, (png_bytep buf, png_uint_32 i)); -#endif -#ifdef PNG_SAVE_INT_32_SUPPORTED -PNG_EXPORT(206, void, png_save_int_32, (png_bytep buf, png_int_32 i)); -#endif - -/* Place a 16-bit number into a buffer in PNG byte order. - * The parameter is declared unsigned int, not png_uint_16, - * just to avoid potential problems on pre-ANSI C compilers. - */ -#ifdef PNG_WRITE_INT_FUNCTIONS_SUPPORTED -PNG_EXPORT(207, void, png_save_uint_16, (png_bytep buf, unsigned int i)); -/* No png_save_int_16 -- may be added if there's a real need for it. */ -#endif - -#ifdef PNG_USE_READ_MACROS -/* Inline macros to do direct reads of bytes from the input buffer. - * The png_get_int_32() routine assumes we are using two's complement - * format for negative values, which is almost certainly true. - */ -# define PNG_get_uint_32(buf) \ - (((png_uint_32)(*(buf)) << 24) + \ - ((png_uint_32)(*((buf) + 1)) << 16) + \ - ((png_uint_32)(*((buf) + 2)) << 8) + \ - ((png_uint_32)(*((buf) + 3)))) - - /* From libpng-1.4.0 until 1.4.4, the png_get_uint_16 macro (but not the - * function) incorrectly returned a value of type png_uint_32. - */ -# define PNG_get_uint_16(buf) \ - ((png_uint_16) \ - (((unsigned int)(*(buf)) << 8) + \ - ((unsigned int)(*((buf) + 1))))) - -# define PNG_get_int_32(buf) \ - ((png_int_32)((*(buf) & 0x80) \ - ? -((png_int_32)((png_get_uint_32(buf) ^ 0xffffffffL) + 1)) \ - : (png_int_32)png_get_uint_32(buf))) - - /* If PNG_PREFIX is defined the same thing as below happens in pnglibconf.h, - * but defining a macro name prefixed with PNG_PREFIX. - */ -# ifndef PNG_PREFIX -# define png_get_uint_32(buf) PNG_get_uint_32(buf) -# define png_get_uint_16(buf) PNG_get_uint_16(buf) -# define png_get_int_32(buf) PNG_get_int_32(buf) -# endif -#else -# ifdef PNG_PREFIX - /* No macros; revert to the (redefined) function */ -# define PNG_get_uint_32 (png_get_uint_32) -# define PNG_get_uint_16 (png_get_uint_16) -# define PNG_get_int_32 (png_get_int_32) -# endif -#endif - -#if defined(PNG_SIMPLIFIED_READ_SUPPORTED) || \ - defined(PNG_SIMPLIFIED_WRITE_SUPPORTED) -/******************************************************************************* - * SIMPLIFIED API - ******************************************************************************* - * - * Please read the documentation in libpng-manual.txt (TODO: write said - * documentation) if you don't understand what follows. - * - * The simplified API hides the details of both libpng and the PNG file format - * itself. It allows PNG files to be read into a very limited number of - * in-memory bitmap formats or to be written from the same formats. If these - * formats do not accomodate your needs then you can, and should, use the more - * sophisticated APIs above - these support a wide variety of in-memory formats - * and a wide variety of sophisticated transformations to those formats as well - * as a wide variety of APIs to manipulate ancillary information. - * - * To read a PNG file using the simplified API: - * - * 1) Declare a 'png_image' structure (see below) on the stack, set the - * version field to PNG_IMAGE_VERSION and the 'opaque' pointer to NULL - * (this is REQUIRED, your program may crash if you don't do it.) - * 2) Call the appropriate png_image_begin_read... function. - * 3) Set the png_image 'format' member to the required sample format. - * 4) Allocate a buffer for the image and, if required, the color-map. - * 5) Call png_image_finish_read to read the image and, if required, the - * color-map into your buffers. - * - * There are no restrictions on the format of the PNG input itself; all valid - * color types, bit depths, and interlace methods are acceptable, and the - * input image is transformed as necessary to the requested in-memory format - * during the png_image_finish_read() step. The only caveat is that if you - * request a color-mapped image from a PNG that is full-color or makes - * complex use of an alpha channel the transformation is extremely lossy and the - * result may look terrible. - * - * To write a PNG file using the simplified API: - * - * 1) Declare a 'png_image' structure on the stack and memset() it to all zero. - * 2) Initialize the members of the structure that describe the image, setting - * the 'format' member to the format of the image samples. - * 3) Call the appropriate png_image_write... function with a pointer to the - * image and, if necessary, the color-map to write the PNG data. - * - * png_image is a structure that describes the in-memory format of an image - * when it is being read or defines the in-memory format of an image that you - * need to write: - */ -#define PNG_IMAGE_VERSION 1 - -typedef struct png_control *png_controlp; -typedef struct -{ - png_controlp opaque; /* Initialize to NULL, free with png_image_free */ - png_uint_32 version; /* Set to PNG_IMAGE_VERSION */ - png_uint_32 width; /* Image width in pixels (columns) */ - png_uint_32 height; /* Image height in pixels (rows) */ - png_uint_32 format; /* Image format as defined below */ - png_uint_32 flags; /* A bit mask containing informational flags */ - png_uint_32 colormap_entries; - /* Number of entries in the color-map */ - - /* In the event of an error or warning the following field will be set to a - * non-zero value and the 'message' field will contain a '\0' terminated - * string with the libpng error or warning message. If both warnings and - * an error were encountered, only the error is recorded. If there - * are multiple warnings, only the first one is recorded. - * - * The upper 30 bits of this value are reserved, the low two bits contain - * a value as follows: - */ -# define PNG_IMAGE_WARNING 1 -# define PNG_IMAGE_ERROR 2 - /* - * The result is a two-bit code such that a value more than 1 indicates - * a failure in the API just called: - * - * 0 - no warning or error - * 1 - warning - * 2 - error - * 3 - error preceded by warning - */ -# define PNG_IMAGE_FAILED(png_cntrl) ((((png_cntrl).warning_or_error)&0x03)>1) - - png_uint_32 warning_or_error; - - char message[64]; -} png_image, *png_imagep; - -/* The samples of the image have one to four channels whose components have - * original values in the range 0 to 1.0: - * - * 1: A single gray or luminance channel (G). - * 2: A gray/luminance channel and an alpha channel (GA). - * 3: Three red, green, blue color channels (RGB). - * 4: Three color channels and an alpha channel (RGBA). - * - * The components are encoded in one of two ways: - * - * a) As a small integer, value 0..255, contained in a single byte. For the - * alpha channel the original value is simply value/255. For the color or - * luminance channels the value is encoded according to the sRGB specification - * and matches the 8-bit format expected by typical display devices. - * - * The color/gray channels are not scaled (pre-multiplied) by the alpha - * channel and are suitable for passing to color management software. - * - * b) As a value in the range 0..65535, contained in a 2-byte integer. All - * channels can be converted to the original value by dividing by 65535; all - * channels are linear. Color channels use the RGB encoding (RGB end-points) of - * the sRGB specification. This encoding is identified by the - * PNG_FORMAT_FLAG_LINEAR flag below. - * - * When the simplified API needs to convert between sRGB and linear colorspaces, - * the actual sRGB transfer curve defined in the sRGB specification (see the - * article at http://en.wikipedia.org/wiki/SRGB) is used, not the gamma=1/2.2 - * approximation used elsewhere in libpng. - * - * When an alpha channel is present it is expected to denote pixel coverage - * of the color or luminance channels and is returned as an associated alpha - * channel: the color/gray channels are scaled (pre-multiplied) by the alpha - * value. - * - * The samples are either contained directly in the image data, between 1 and 8 - * bytes per pixel according to the encoding, or are held in a color-map indexed - * by bytes in the image data. In the case of a color-map the color-map entries - * are individual samples, encoded as above, and the image data has one byte per - * pixel to select the relevant sample from the color-map. - */ - -/* PNG_FORMAT_* - * - * #defines to be used in png_image::format. Each #define identifies a - * particular layout of sample data and, if present, alpha values. There are - * separate defines for each of the two component encodings. - * - * A format is built up using single bit flag values. All combinations are - * valid. Formats can be built up from the flag values or you can use one of - * the predefined values below. When testing formats always use the FORMAT_FLAG - * macros to test for individual features - future versions of the library may - * add new flags. - * - * When reading or writing color-mapped images the format should be set to the - * format of the entries in the color-map then png_image_{read,write}_colormap - * called to read or write the color-map and set the format correctly for the - * image data. Do not set the PNG_FORMAT_FLAG_COLORMAP bit directly! - * - * NOTE: libpng can be built with particular features disabled, if you see - * compiler errors because the definition of one of the following flags has been - * compiled out it is because libpng does not have the required support. It is - * possible, however, for the libpng configuration to enable the format on just - * read or just write; in that case you may see an error at run time. You can - * guard against this by checking for the definition of the appropriate - * "_SUPPORTED" macro, one of: - * - * PNG_SIMPLIFIED_{READ,WRITE}_{BGR,AFIRST}_SUPPORTED - */ -#define PNG_FORMAT_FLAG_ALPHA 0x01U /* format with an alpha channel */ -#define PNG_FORMAT_FLAG_COLOR 0x02U /* color format: otherwise grayscale */ -#define PNG_FORMAT_FLAG_LINEAR 0x04U /* 2 byte channels else 1 byte */ -#define PNG_FORMAT_FLAG_COLORMAP 0x08U /* image data is color-mapped */ - -#ifdef PNG_FORMAT_BGR_SUPPORTED -# define PNG_FORMAT_FLAG_BGR 0x10U /* BGR colors, else order is RGB */ -#endif - -#ifdef PNG_FORMAT_AFIRST_SUPPORTED -# define PNG_FORMAT_FLAG_AFIRST 0x20U /* alpha channel comes first */ -#endif - -/* Commonly used formats have predefined macros. - * - * First the single byte (sRGB) formats: - */ -#define PNG_FORMAT_GRAY 0 -#define PNG_FORMAT_GA PNG_FORMAT_FLAG_ALPHA -#define PNG_FORMAT_AG (PNG_FORMAT_GA|PNG_FORMAT_FLAG_AFIRST) -#define PNG_FORMAT_RGB PNG_FORMAT_FLAG_COLOR -#define PNG_FORMAT_BGR (PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_BGR) -#define PNG_FORMAT_RGBA (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_ALPHA) -#define PNG_FORMAT_ARGB (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_AFIRST) -#define PNG_FORMAT_BGRA (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_ALPHA) -#define PNG_FORMAT_ABGR (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_AFIRST) - -/* Then the linear 2-byte formats. When naming these "Y" is used to - * indicate a luminance (gray) channel. - */ -#define PNG_FORMAT_LINEAR_Y PNG_FORMAT_FLAG_LINEAR -#define PNG_FORMAT_LINEAR_Y_ALPHA (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_ALPHA) -#define PNG_FORMAT_LINEAR_RGB (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR) -#define PNG_FORMAT_LINEAR_RGB_ALPHA \ - (PNG_FORMAT_FLAG_LINEAR|PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_ALPHA) - -/* With color-mapped formats the image data is one byte for each pixel, the byte - * is an index into the color-map which is formatted as above. To obtain a - * color-mapped format it is sufficient just to add the PNG_FOMAT_FLAG_COLORMAP - * to one of the above definitions, or you can use one of the definitions below. - */ -#define PNG_FORMAT_RGB_COLORMAP (PNG_FORMAT_RGB|PNG_FORMAT_FLAG_COLORMAP) -#define PNG_FORMAT_BGR_COLORMAP (PNG_FORMAT_BGR|PNG_FORMAT_FLAG_COLORMAP) -#define PNG_FORMAT_RGBA_COLORMAP (PNG_FORMAT_RGBA|PNG_FORMAT_FLAG_COLORMAP) -#define PNG_FORMAT_ARGB_COLORMAP (PNG_FORMAT_ARGB|PNG_FORMAT_FLAG_COLORMAP) -#define PNG_FORMAT_BGRA_COLORMAP (PNG_FORMAT_BGRA|PNG_FORMAT_FLAG_COLORMAP) -#define PNG_FORMAT_ABGR_COLORMAP (PNG_FORMAT_ABGR|PNG_FORMAT_FLAG_COLORMAP) - -/* PNG_IMAGE macros - * - * These are convenience macros to derive information from a png_image - * structure. The PNG_IMAGE_SAMPLE_ macros return values appropriate to the - * actual image sample values - either the entries in the color-map or the - * pixels in the image. The PNG_IMAGE_PIXEL_ macros return corresponding values - * for the pixels and will always return 1 for color-mapped formats. The - * remaining macros return information about the rows in the image and the - * complete image. - * - * NOTE: All the macros that take a png_image::format parameter are compile time - * constants if the format parameter is, itself, a constant. Therefore these - * macros can be used in array declarations and case labels where required. - * Similarly the macros are also pre-processor constants (sizeof is not used) so - * they can be used in #if tests. - * - * First the information about the samples. - */ -#define PNG_IMAGE_SAMPLE_CHANNELS(fmt)\ - (((fmt)&(PNG_FORMAT_FLAG_COLOR|PNG_FORMAT_FLAG_ALPHA))+1) - /* Return the total number of channels in a given format: 1..4 */ - -#define PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)\ - ((((fmt) & PNG_FORMAT_FLAG_LINEAR) >> 2)+1) - /* Return the size in bytes of a single component of a pixel or color-map - * entry (as appropriate) in the image: 1 or 2. - */ - -#define PNG_IMAGE_SAMPLE_SIZE(fmt)\ - (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * PNG_IMAGE_SAMPLE_COMPONENT_SIZE(fmt)) - /* This is the size of the sample data for one sample. If the image is - * color-mapped it is the size of one color-map entry (and image pixels are - * one byte in size), otherwise it is the size of one image pixel. - */ - -#define PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(fmt)\ - (PNG_IMAGE_SAMPLE_CHANNELS(fmt) * 256) - /* The maximum size of the color-map required by the format expressed in a - * count of components. This can be used to compile-time allocate a - * color-map: - * - * png_uint_16 colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(linear_fmt)]; - * - * png_byte colormap[PNG_IMAGE_MAXIMUM_COLORMAP_COMPONENTS(sRGB_fmt)]; - * - * Alternatively use the PNG_IMAGE_COLORMAP_SIZE macro below to use the - * information from one of the png_image_begin_read_ APIs and dynamically - * allocate the required memory. - */ - -/* Corresponding information about the pixels */ -#define PNG_IMAGE_PIXEL_(test,fmt)\ - (((fmt)&PNG_FORMAT_FLAG_COLORMAP)?1:test(fmt)) - -#define PNG_IMAGE_PIXEL_CHANNELS(fmt)\ - PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_CHANNELS,fmt) - /* The number of separate channels (components) in a pixel; 1 for a - * color-mapped image. - */ - -#define PNG_IMAGE_PIXEL_COMPONENT_SIZE(fmt)\ - PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_COMPONENT_SIZE,fmt) - /* The size, in bytes, of each component in a pixel; 1 for a color-mapped - * image. - */ - -#define PNG_IMAGE_PIXEL_SIZE(fmt) PNG_IMAGE_PIXEL_(PNG_IMAGE_SAMPLE_SIZE,fmt) - /* The size, in bytes, of a complete pixel; 1 for a color-mapped image. */ - -/* Information about the whole row, or whole image */ -#define PNG_IMAGE_ROW_STRIDE(image)\ - (PNG_IMAGE_PIXEL_CHANNELS((image).format) * (image).width) - /* Return the total number of components in a single row of the image; this - * is the minimum 'row stride', the minimum count of components between each - * row. For a color-mapped image this is the minimum number of bytes in a - * row. - */ - -#define PNG_IMAGE_BUFFER_SIZE(image, row_stride)\ - (PNG_IMAGE_PIXEL_COMPONENT_SIZE((image).format)*(image).height*(row_stride)) - /* Return the size, in bytes, of an image buffer given a png_image and a row - * stride - the number of components to leave space for in each row. - */ - -#define PNG_IMAGE_SIZE(image)\ - PNG_IMAGE_BUFFER_SIZE(image, PNG_IMAGE_ROW_STRIDE(image)) - /* Return the size, in bytes, of the image in memory given just a png_image; - * the row stride is the minimum stride required for the image. - */ - -#define PNG_IMAGE_COLORMAP_SIZE(image)\ - (PNG_IMAGE_SAMPLE_SIZE((image).format) * (image).colormap_entries) - /* Return the size, in bytes, of the color-map of this image. If the image - * format is not a color-map format this will return a size sufficient for - * 256 entries in the given format; check PNG_FORMAT_FLAG_COLORMAP if - * you don't want to allocate a color-map in this case. - */ - -/* PNG_IMAGE_FLAG_* - * - * Flags containing additional information about the image are held in the - * 'flags' field of png_image. - */ -#define PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB 0x01 - /* This indicates the the RGB values of the in-memory bitmap do not - * correspond to the red, green and blue end-points defined by sRGB. - */ - -#define PNG_IMAGE_FLAG_FAST 0x02 - /* On write emphasise speed over compression; the resultant PNG file will be - * larger but will be produced significantly faster, particular for large - * images. Do not use this option for images which will be distributed, only - * used it when producing intermediate files that will be read back in - * repeatedly. For a typical 24-bit image the option will double the read - * speed at the cost of increasing the image size by 25%, however for many - * more compressible images the PNG file can be 10 times larger with only a - * slight speed gain. - */ - -#define PNG_IMAGE_FLAG_16BIT_sRGB 0x04 - /* On read if the image is a 16-bit per component image and there is no gAMA - * or sRGB chunk assume that the components are sRGB encoded. Notice that - * images output by the simplified API always have gamma information; setting - * this flag only affects the interpretation of 16-bit images from an - * external source. It is recommended that the application expose this flag - * to the user; the user can normally easily recognize the difference between - * linear and sRGB encoding. This flag has no effect on write - the data - * passed to the write APIs must have the correct encoding (as defined - * above.) - * - * If the flag is not set (the default) input 16-bit per component data is - * assumed to be linear. - * - * NOTE: the flag can only be set after the png_image_begin_read_ call, - * because that call initializes the 'flags' field. - */ - -#ifdef PNG_SIMPLIFIED_READ_SUPPORTED -/* READ APIs - * --------- - * - * The png_image passed to the read APIs must have been initialized by setting - * the png_controlp field 'opaque' to NULL (or, safer, memset the whole thing.) - */ -#ifdef PNG_STDIO_SUPPORTED -PNG_EXPORT(234, int, png_image_begin_read_from_file, (png_imagep image, - const char *file_name)); - /* The named file is opened for read and the image header is filled in - * from the PNG header in the file. - */ - -PNG_EXPORT(235, int, png_image_begin_read_from_stdio, (png_imagep image, - FILE* file)); - /* The PNG header is read from the stdio FILE object. */ -#endif /* STDIO */ - -PNG_EXPORT(236, int, png_image_begin_read_from_memory, (png_imagep image, - png_const_voidp memory, png_size_t size)); - /* The PNG header is read from the given memory buffer. */ - -PNG_EXPORT(237, int, png_image_finish_read, (png_imagep image, - png_const_colorp background, void *buffer, png_int_32 row_stride, - void *colormap)); - /* Finish reading the image into the supplied buffer and clean up the - * png_image structure. - * - * row_stride is the step, in byte or 2-byte units as appropriate, - * between adjacent rows. A positive stride indicates that the top-most row - * is first in the buffer - the normal top-down arrangement. A negative - * stride indicates that the bottom-most row is first in the buffer. - * - * background need only be supplied if an alpha channel must be removed from - * a png_byte format and the removal is to be done by compositing on a solid - * color; otherwise it may be NULL and any composition will be done directly - * onto the buffer. The value is an sRGB color to use for the background, - * for grayscale output the green channel is used. - * - * background must be supplied when an alpha channel must be removed from a - * single byte color-mapped output format, in other words if: - * - * 1) The original format from png_image_begin_read_from_* had - * PNG_FORMAT_FLAG_ALPHA set. - * 2) The format set by the application does not. - * 3) The format set by the application has PNG_FORMAT_FLAG_COLORMAP set and - * PNG_FORMAT_FLAG_LINEAR *not* set. - * - * For linear output removing the alpha channel is always done by compositing - * on black and background is ignored. - * - * colormap must be supplied when PNG_FORMAT_FLAG_COLORMAP is set. It must - * be at least the size (in bytes) returned by PNG_IMAGE_COLORMAP_SIZE. - * image->colormap_entries will be updated to the actual number of entries - * written to the colormap; this may be less than the original value. - */ - -PNG_EXPORT(238, void, png_image_free, (png_imagep image)); - /* Free any data allocated by libpng in image->opaque, setting the pointer to - * NULL. May be called at any time after the structure is initialized. - */ -#endif /* SIMPLIFIED_READ */ - -#ifdef PNG_SIMPLIFIED_WRITE_SUPPORTED -#ifdef PNG_STDIO_SUPPORTED -/* WRITE APIS - * ---------- - * For write you must initialize a png_image structure to describe the image to - * be written. To do this use memset to set the whole structure to 0 then - * initialize fields describing your image. - * - * version: must be set to PNG_IMAGE_VERSION - * opaque: must be initialized to NULL - * width: image width in pixels - * height: image height in rows - * format: the format of the data (image and color-map) you wish to write - * flags: set to 0 unless one of the defined flags applies; set - * PNG_IMAGE_FLAG_COLORSPACE_NOT_sRGB for color format images where the RGB - * values do not correspond to the colors in sRGB. - * colormap_entries: set to the number of entries in the color-map (0 to 256) - */ -PNG_EXPORT(239, int, png_image_write_to_file, (png_imagep image, - const char *file, int convert_to_8bit, const void *buffer, - png_int_32 row_stride, const void *colormap)); - /* Write the image to the named file. */ - -PNG_EXPORT(240, int, png_image_write_to_stdio, (png_imagep image, FILE *file, - int convert_to_8_bit, const void *buffer, png_int_32 row_stride, - const void *colormap)); - /* Write the image to the given (FILE*). */ - -/* With both write APIs if image is in one of the linear formats with 16-bit - * data then setting convert_to_8_bit will cause the output to be an 8-bit PNG - * gamma encoded according to the sRGB specification, otherwise a 16-bit linear - * encoded PNG file is written. - * - * With color-mapped data formats the colormap parameter point to a color-map - * with at least image->colormap_entries encoded in the specified format. If - * the format is linear the written PNG color-map will be converted to sRGB - * regardless of the convert_to_8_bit flag. - * - * With all APIs row_stride is handled as in the read APIs - it is the spacing - * from one row to the next in component sized units (1 or 2 bytes) and if - * negative indicates a bottom-up row layout in the buffer. If row_stride is zero, - * libpng will calculate it for you from the image width and number of channels. - * - * Note that the write API does not support interlacing, sub-8-bit pixels, indexed - * PNG (color_type 3) or most ancillary chunks. - */ -#endif /* STDIO */ -#endif /* SIMPLIFIED_WRITE */ -/******************************************************************************* - * END OF SIMPLIFIED API - ******************************************************************************/ -#endif /* SIMPLIFIED_{READ|WRITE} */ - -#ifdef PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED -PNG_EXPORT(242, void, png_set_check_for_invalid_index, - (png_structrp png_ptr, int allowed)); -# ifdef PNG_GET_PALETTE_MAX_SUPPORTED -PNG_EXPORT(243, int, png_get_palette_max, (png_const_structp png_ptr, - png_const_infop info_ptr)); -# endif -#endif /* CHECK_FOR_INVALID_INDEX */ - -/******************************************************************************* - * IMPLEMENTATION OPTIONS - ******************************************************************************* - * - * Support for arbitrary implementation-specific optimizations. The API allows - * particular options to be turned on or off. 'Option' is the number of the - * option and 'onoff' is 0 (off) or non-0 (on). The value returned is given - * by the PNG_OPTION_ defines below. - * - * HARDWARE: normally hardware capabilites, such as the Intel SSE instructions, - * are detected at run time, however sometimes it may be impossible - * to do this in user mode, in which case it is necessary to discover - * the capabilities in an OS specific way. Such capabilities are - * listed here when libpng has support for them and must be turned - * ON by the application if present. - * - * SOFTWARE: sometimes software optimizations actually result in performance - * decrease on some architectures or systems, or with some sets of - * PNG images. 'Software' options allow such optimizations to be - * selected at run time. - */ -#ifdef PNG_SET_OPTION_SUPPORTED -#ifdef PNG_ARM_NEON_API_SUPPORTED -# define PNG_ARM_NEON 0 /* HARDWARE: ARM Neon SIMD instructions supported */ -#endif -#define PNG_MAXIMUM_INFLATE_WINDOW 2 /* SOFTWARE: force maximum window */ -#define PNG_SKIP_sRGB_CHECK_PROFILE 4 /* SOFTWARE: Check ICC profile for sRGB */ -#define PNG_OPTION_NEXT 6 /* Next option - numbers must be even */ - -/* Return values: NOTE: there are four values and 'off' is *not* zero */ -#define PNG_OPTION_UNSET 0 /* Unset - defaults to off */ -#define PNG_OPTION_INVALID 1 /* Option number out of range */ -#define PNG_OPTION_OFF 2 -#define PNG_OPTION_ON 3 - -PNG_EXPORT(244, int, png_set_option, (png_structrp png_ptr, int option, - int onoff)); -#endif /* SET_OPTION */ - -/******************************************************************************* - * END OF HARDWARE AND SOFTWARE OPTIONS - ******************************************************************************/ - -/* Maintainer: Put new public prototypes here ^, in libpng.3, in project - * defs, and in scripts/symbols.def. - */ - -/* The last ordinal number (this is the *last* one already used; the next - * one to use is one more than this.) - */ -#ifdef PNG_EXPORT_LAST_ORDINAL - PNG_EXPORT_LAST_ORDINAL(244); -#endif - -#ifdef __cplusplus -} -#endif - -#endif /* PNG_VERSION_INFO_ONLY */ -/* Do not put anything past this line */ -#endif /* PNG_H */ diff --git a/vendor/libpng/include/pngconf.h b/vendor/libpng/include/pngconf.h deleted file mode 100644 index 62e37cf..0000000 --- a/vendor/libpng/include/pngconf.h +++ /dev/null @@ -1,622 +0,0 @@ - -/* pngconf.h - machine configurable file for libpng - * - * libpng version 1.6.18, July 23, 2015 - * - * Copyright (c) 1998-2015 Glenn Randers-Pehrson - * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger) - * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.) - * - * This code is released under the libpng license. - * For conditions of distribution and use, see the disclaimer - * and license in png.h - * - * Any machine specific code is near the front of this file, so if you - * are configuring libpng for a machine, you may want to read the section - * starting here down to where it starts to typedef png_color, png_text, - * and png_info. - */ - -#ifndef PNGCONF_H -#define PNGCONF_H - -#ifndef PNG_BUILDING_SYMBOL_TABLE /* else includes may cause problems */ - -/* From libpng 1.6.0 libpng requires an ANSI X3.159-1989 ("ISOC90") compliant C - * compiler for correct compilation. The following header files are required by - * the standard. If your compiler doesn't provide these header files, or they - * do not match the standard, you will need to provide/improve them. - */ -#include -#include - -/* Library header files. These header files are all defined by ISOC90; libpng - * expects conformant implementations, however, an ISOC90 conformant system need - * not provide these header files if the functionality cannot be implemented. - * In this case it will be necessary to disable the relevant parts of libpng in - * the build of pnglibconf.h. - * - * Prior to 1.6.0 string.h was included here; the API changes in 1.6.0 to not - * include this unnecessary header file. - */ - -#ifdef PNG_STDIO_SUPPORTED - /* Required for the definition of FILE: */ -# include -#endif - -#ifdef PNG_SETJMP_SUPPORTED - /* Required for the definition of jmp_buf and the declaration of longjmp: */ -# include -#endif - -#ifdef PNG_CONVERT_tIME_SUPPORTED - /* Required for struct tm: */ -# include -#endif - -#endif /* PNG_BUILDING_SYMBOL_TABLE */ - -/* Prior to 1.6.0 it was possible to turn off 'const' in declarations using - * PNG_NO_CONST; this is no longer supported except for data declarations which - * apparently still cause problems in 2011 on some compilers. - */ -#define PNG_CONST const /* backward compatibility only */ - -/* This controls optimization of the reading of 16 and 32 bit values - * from PNG files. It can be set on a per-app-file basis - it - * just changes whether a macro is used when the function is called. - * The library builder sets the default; if read functions are not - * built into the library the macro implementation is forced on. - */ -#ifndef PNG_READ_INT_FUNCTIONS_SUPPORTED -# define PNG_USE_READ_MACROS -#endif -#if !defined(PNG_NO_USE_READ_MACROS) && !defined(PNG_USE_READ_MACROS) -# if PNG_DEFAULT_READ_MACROS -# define PNG_USE_READ_MACROS -# endif -#endif - -/* COMPILER SPECIFIC OPTIONS. - * - * These options are provided so that a variety of difficult compilers - * can be used. Some are fixed at build time (e.g. PNG_API_RULE - * below) but still have compiler specific implementations, others - * may be changed on a per-file basis when compiling against libpng. - */ - -/* The PNGARG macro was used in versions of libpng prior to 1.6.0 to protect - * against legacy (pre ISOC90) compilers that did not understand function - * prototypes. It is not required for modern C compilers. - */ -#ifndef PNGARG -# define PNGARG(arglist) arglist -#endif - -/* Function calling conventions. - * ============================= - * Normally it is not necessary to specify to the compiler how to call - * a function - it just does it - however on x86 systems derived from - * Microsoft and Borland C compilers ('IBM PC', 'DOS', 'Windows' systems - * and some others) there are multiple ways to call a function and the - * default can be changed on the compiler command line. For this reason - * libpng specifies the calling convention of every exported function and - * every function called via a user supplied function pointer. This is - * done in this file by defining the following macros: - * - * PNGAPI Calling convention for exported functions. - * PNGCBAPI Calling convention for user provided (callback) functions. - * PNGCAPI Calling convention used by the ANSI-C library (required - * for longjmp callbacks and sometimes used internally to - * specify the calling convention for zlib). - * - * These macros should never be overridden. If it is necessary to - * change calling convention in a private build this can be done - * by setting PNG_API_RULE (which defaults to 0) to one of the values - * below to select the correct 'API' variants. - * - * PNG_API_RULE=0 Use PNGCAPI - the 'C' calling convention - throughout. - * This is correct in every known environment. - * PNG_API_RULE=1 Use the operating system convention for PNGAPI and - * the 'C' calling convention (from PNGCAPI) for - * callbacks (PNGCBAPI). This is no longer required - * in any known environment - if it has to be used - * please post an explanation of the problem to the - * libpng mailing list. - * - * These cases only differ if the operating system does not use the C - * calling convention, at present this just means the above cases - * (x86 DOS/Windows sytems) and, even then, this does not apply to - * Cygwin running on those systems. - * - * Note that the value must be defined in pnglibconf.h so that what - * the application uses to call the library matches the conventions - * set when building the library. - */ - -/* Symbol export - * ============= - * When building a shared library it is almost always necessary to tell - * the compiler which symbols to export. The png.h macro 'PNG_EXPORT' - * is used to mark the symbols. On some systems these symbols can be - * extracted at link time and need no special processing by the compiler, - * on other systems the symbols are flagged by the compiler and just - * the declaration requires a special tag applied (unfortunately) in a - * compiler dependent way. Some systems can do either. - * - * A small number of older systems also require a symbol from a DLL to - * be flagged to the program that calls it. This is a problem because - * we do not know in the header file included by application code that - * the symbol will come from a shared library, as opposed to a statically - * linked one. For this reason the application must tell us by setting - * the magic flag PNG_USE_DLL to turn on the special processing before - * it includes png.h. - * - * Four additional macros are used to make this happen: - * - * PNG_IMPEXP The magic (if any) to cause a symbol to be exported from - * the build or imported if PNG_USE_DLL is set - compiler - * and system specific. - * - * PNG_EXPORT_TYPE(type) A macro that pre or appends PNG_IMPEXP to - * 'type', compiler specific. - * - * PNG_DLL_EXPORT Set to the magic to use during a libpng build to - * make a symbol exported from the DLL. Not used in the - * public header files; see pngpriv.h for how it is used - * in the libpng build. - * - * PNG_DLL_IMPORT Set to the magic to force the libpng symbols to come - * from a DLL - used to define PNG_IMPEXP when - * PNG_USE_DLL is set. - */ - -/* System specific discovery. - * ========================== - * This code is used at build time to find PNG_IMPEXP, the API settings - * and PNG_EXPORT_TYPE(), it may also set a macro to indicate the DLL - * import processing is possible. On Windows systems it also sets - * compiler-specific macros to the values required to change the calling - * conventions of the various functions. - */ -#if defined(_Windows) || defined(_WINDOWS) || defined(WIN32) ||\ - defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) - /* Windows system (DOS doesn't support DLLs). Includes builds under Cygwin or - * MinGW on any architecture currently supported by Windows. Also includes - * Watcom builds but these need special treatment because they are not - * compatible with GCC or Visual C because of different calling conventions. - */ -# if PNG_API_RULE == 2 - /* If this line results in an error, either because __watcall is not - * understood or because of a redefine just below you cannot use *this* - * build of the library with the compiler you are using. *This* build was - * build using Watcom and applications must also be built using Watcom! - */ -# define PNGCAPI __watcall -# endif - -# if defined(__GNUC__) || (defined(_MSC_VER) && (_MSC_VER >= 800)) -# define PNGCAPI __cdecl -# if PNG_API_RULE == 1 - /* If this line results in an error __stdcall is not understood and - * PNG_API_RULE should not have been set to '1'. - */ -# define PNGAPI __stdcall -# endif -# else - /* An older compiler, or one not detected (erroneously) above, - * if necessary override on the command line to get the correct - * variants for the compiler. - */ -# ifndef PNGCAPI -# define PNGCAPI _cdecl -# endif -# if PNG_API_RULE == 1 && !defined(PNGAPI) -# define PNGAPI _stdcall -# endif -# endif /* compiler/api */ - - /* NOTE: PNGCBAPI always defaults to PNGCAPI. */ - -# if defined(PNGAPI) && !defined(PNG_USER_PRIVATEBUILD) -# error "PNG_USER_PRIVATEBUILD must be defined if PNGAPI is changed" -# endif - -# if (defined(_MSC_VER) && _MSC_VER < 800) ||\ - (defined(__BORLANDC__) && __BORLANDC__ < 0x500) - /* older Borland and MSC - * compilers used '__export' and required this to be after - * the type. - */ -# ifndef PNG_EXPORT_TYPE -# define PNG_EXPORT_TYPE(type) type PNG_IMPEXP -# endif -# define PNG_DLL_EXPORT __export -# else /* newer compiler */ -# define PNG_DLL_EXPORT __declspec(dllexport) -# ifndef PNG_DLL_IMPORT -# define PNG_DLL_IMPORT __declspec(dllimport) -# endif -# endif /* compiler */ - -#else /* !Windows */ -# if (defined(__IBMC__) || defined(__IBMCPP__)) && defined(__OS2__) -# define PNGAPI _System -# else /* !Windows/x86 && !OS/2 */ - /* Use the defaults, or define PNG*API on the command line (but - * this will have to be done for every compile!) - */ -# endif /* other system, !OS/2 */ -#endif /* !Windows/x86 */ - -/* Now do all the defaulting . */ -#ifndef PNGCAPI -# define PNGCAPI -#endif -#ifndef PNGCBAPI -# define PNGCBAPI PNGCAPI -#endif -#ifndef PNGAPI -# define PNGAPI PNGCAPI -#endif - -/* PNG_IMPEXP may be set on the compilation system command line or (if not set) - * then in an internal header file when building the library, otherwise (when - * using the library) it is set here. - */ -#ifndef PNG_IMPEXP -# if defined(PNG_USE_DLL) && defined(PNG_DLL_IMPORT) - /* This forces use of a DLL, disallowing static linking */ -# define PNG_IMPEXP PNG_DLL_IMPORT -# endif - -# ifndef PNG_IMPEXP -# define PNG_IMPEXP -# endif -#endif - -/* In 1.5.2 the definition of PNG_FUNCTION has been changed to always treat - * 'attributes' as a storage class - the attributes go at the start of the - * function definition, and attributes are always appended regardless of the - * compiler. This considerably simplifies these macros but may cause problems - * if any compilers both need function attributes and fail to handle them as - * a storage class (this is unlikely.) - */ -#ifndef PNG_FUNCTION -# define PNG_FUNCTION(type, name, args, attributes) attributes type name args -#endif - -#ifndef PNG_EXPORT_TYPE -# define PNG_EXPORT_TYPE(type) PNG_IMPEXP type -#endif - - /* The ordinal value is only relevant when preprocessing png.h for symbol - * table entries, so we discard it here. See the .dfn files in the - * scripts directory. - */ - -#ifndef PNG_EXPORTA -# define PNG_EXPORTA(ordinal, type, name, args, attributes) \ - PNG_FUNCTION(PNG_EXPORT_TYPE(type), (PNGAPI name), PNGARG(args), \ - PNG_LINKAGE_API attributes) -#endif - -/* ANSI-C (C90) does not permit a macro to be invoked with an empty argument, - * so make something non-empty to satisfy the requirement: - */ -#define PNG_EMPTY /*empty list*/ - -#define PNG_EXPORT(ordinal, type, name, args) \ - PNG_EXPORTA(ordinal, type, name, args, PNG_EMPTY) - -/* Use PNG_REMOVED to comment out a removed interface. */ -#ifndef PNG_REMOVED -# define PNG_REMOVED(ordinal, type, name, args, attributes) -#endif - -#ifndef PNG_CALLBACK -# define PNG_CALLBACK(type, name, args) type (PNGCBAPI name) PNGARG(args) -#endif - -/* Support for compiler specific function attributes. These are used - * so that where compiler support is available incorrect use of API - * functions in png.h will generate compiler warnings. - * - * Added at libpng-1.2.41. - */ - -#ifndef PNG_NO_PEDANTIC_WARNINGS -# ifndef PNG_PEDANTIC_WARNINGS_SUPPORTED -# define PNG_PEDANTIC_WARNINGS_SUPPORTED -# endif -#endif - -#ifdef PNG_PEDANTIC_WARNINGS_SUPPORTED - /* Support for compiler specific function attributes. These are used - * so that where compiler support is available, incorrect use of API - * functions in png.h will generate compiler warnings. Added at libpng - * version 1.2.41. Disabling these removes the warnings but may also produce - * less efficient code. - */ -# if defined(__clang__) && defined(__has_attribute) - /* Clang defines both __clang__ and __GNUC__. Check __clang__ first. */ -# if !defined(PNG_USE_RESULT) && __has_attribute(__warn_unused_result__) -# define PNG_USE_RESULT __attribute__((__warn_unused_result__)) -# endif -# if !defined(PNG_NORETURN) && __has_attribute(__noreturn__) -# define PNG_NORETURN __attribute__((__noreturn__)) -# endif -# if !defined(PNG_ALLOCATED) && __has_attribute(__malloc__) -# define PNG_ALLOCATED __attribute__((__malloc__)) -# endif -# if !defined(PNG_DEPRECATED) && __has_attribute(__deprecated__) -# define PNG_DEPRECATED __attribute__((__deprecated__)) -# endif -# if !defined(PNG_PRIVATE) -# ifdef __has_extension -# if __has_extension(attribute_unavailable_with_message) -# define PNG_PRIVATE __attribute__((__unavailable__(\ - "This function is not exported by libpng."))) -# endif -# endif -# endif -# ifndef PNG_RESTRICT -# define PNG_RESTRICT __restrict -# endif - -# elif defined(__GNUC__) -# ifndef PNG_USE_RESULT -# define PNG_USE_RESULT __attribute__((__warn_unused_result__)) -# endif -# ifndef PNG_NORETURN -# define PNG_NORETURN __attribute__((__noreturn__)) -# endif -# if __GNUC__ >= 3 -# ifndef PNG_ALLOCATED -# define PNG_ALLOCATED __attribute__((__malloc__)) -# endif -# ifndef PNG_DEPRECATED -# define PNG_DEPRECATED __attribute__((__deprecated__)) -# endif -# ifndef PNG_PRIVATE -# if 0 /* Doesn't work so we use deprecated instead*/ -# define PNG_PRIVATE \ - __attribute__((warning("This function is not exported by libpng."))) -# else -# define PNG_PRIVATE \ - __attribute__((__deprecated__)) -# endif -# endif -# if ((__GNUC__ > 3) || !defined(__GNUC_MINOR__) || (__GNUC_MINOR__ >= 1)) -# ifndef PNG_RESTRICT -# define PNG_RESTRICT __restrict -# endif -# endif /* __GNUC__.__GNUC_MINOR__ > 3.0 */ -# endif /* __GNUC__ >= 3 */ - -# elif defined(_MSC_VER) && (_MSC_VER >= 1300) -# ifndef PNG_USE_RESULT -# define PNG_USE_RESULT /* not supported */ -# endif -# ifndef PNG_NORETURN -# define PNG_NORETURN __declspec(noreturn) -# endif -# ifndef PNG_ALLOCATED -# if (_MSC_VER >= 1400) -# define PNG_ALLOCATED __declspec(restrict) -# endif -# endif -# ifndef PNG_DEPRECATED -# define PNG_DEPRECATED __declspec(deprecated) -# endif -# ifndef PNG_PRIVATE -# define PNG_PRIVATE __declspec(deprecated) -# endif -# ifndef PNG_RESTRICT -# if (_MSC_VER >= 1400) -# define PNG_RESTRICT __restrict -# endif -# endif - -# elif defined(__WATCOMC__) -# ifndef PNG_RESTRICT -# define PNG_RESTRICT __restrict -# endif -# endif -#endif /* PNG_PEDANTIC_WARNINGS */ - -#ifndef PNG_DEPRECATED -# define PNG_DEPRECATED /* Use of this function is deprecated */ -#endif -#ifndef PNG_USE_RESULT -# define PNG_USE_RESULT /* The result of this function must be checked */ -#endif -#ifndef PNG_NORETURN -# define PNG_NORETURN /* This function does not return */ -#endif -#ifndef PNG_ALLOCATED -# define PNG_ALLOCATED /* The result of the function is new memory */ -#endif -#ifndef PNG_PRIVATE -# define PNG_PRIVATE /* This is a private libpng function */ -#endif -#ifndef PNG_RESTRICT -# define PNG_RESTRICT /* The C99 "restrict" feature */ -#endif - -#ifndef PNG_FP_EXPORT /* A floating point API. */ -# ifdef PNG_FLOATING_POINT_SUPPORTED -# define PNG_FP_EXPORT(ordinal, type, name, args)\ - PNG_EXPORT(ordinal, type, name, args); -# else /* No floating point APIs */ -# define PNG_FP_EXPORT(ordinal, type, name, args) -# endif -#endif -#ifndef PNG_FIXED_EXPORT /* A fixed point API. */ -# ifdef PNG_FIXED_POINT_SUPPORTED -# define PNG_FIXED_EXPORT(ordinal, type, name, args)\ - PNG_EXPORT(ordinal, type, name, args); -# else /* No fixed point APIs */ -# define PNG_FIXED_EXPORT(ordinal, type, name, args) -# endif -#endif - -#ifndef PNG_BUILDING_SYMBOL_TABLE -/* Some typedefs to get us started. These should be safe on most of the common - * platforms. - * - * png_uint_32 and png_int_32 may, currently, be larger than required to hold a - * 32-bit value however this is not normally advisable. - * - * png_uint_16 and png_int_16 should always be two bytes in size - this is - * verified at library build time. - * - * png_byte must always be one byte in size. - * - * The checks below use constants from limits.h, as defined by the ISOC90 - * standard. - */ -#if CHAR_BIT == 8 && UCHAR_MAX == 255 - typedef unsigned char png_byte; -#else -# error "libpng requires 8 bit bytes" -#endif - -#if INT_MIN == -32768 && INT_MAX == 32767 - typedef int png_int_16; -#elif SHRT_MIN == -32768 && SHRT_MAX == 32767 - typedef short png_int_16; -#else -# error "libpng requires a signed 16 bit type" -#endif - -#if UINT_MAX == 65535 - typedef unsigned int png_uint_16; -#elif USHRT_MAX == 65535 - typedef unsigned short png_uint_16; -#else -# error "libpng requires an unsigned 16 bit type" -#endif - -#if INT_MIN < -2147483646 && INT_MAX > 2147483646 - typedef int png_int_32; -#elif LONG_MIN < -2147483646 && LONG_MAX > 2147483646 - typedef long int png_int_32; -#else -# error "libpng requires a signed 32 bit (or more) type" -#endif - -#if UINT_MAX > 4294967294 - typedef unsigned int png_uint_32; -#elif ULONG_MAX > 4294967294 - typedef unsigned long int png_uint_32; -#else -# error "libpng requires an unsigned 32 bit (or more) type" -#endif - -/* Prior to 1.6.0 it was possible to disable the use of size_t, 1.6.0, however, - * requires an ISOC90 compiler and relies on consistent behavior of sizeof. - */ -typedef size_t png_size_t; -typedef ptrdiff_t png_ptrdiff_t; - -/* libpng needs to know the maximum value of 'size_t' and this controls the - * definition of png_alloc_size_t, below. This maximum value of size_t limits - * but does not control the maximum allocations the library makes - there is - * direct application control of this through png_set_user_limits(). - */ -#ifndef PNG_SMALL_SIZE_T - /* Compiler specific tests for systems where size_t is known to be less than - * 32 bits (some of these systems may no longer work because of the lack of - * 'far' support; see above.) - */ -# if (defined(__TURBOC__) && !defined(__FLAT__)) ||\ - (defined(_MSC_VER) && defined(MAXSEG_64K)) -# define PNG_SMALL_SIZE_T -# endif -#endif - -/* png_alloc_size_t is guaranteed to be no smaller than png_size_t, and no - * smaller than png_uint_32. Casts from png_size_t or png_uint_32 to - * png_alloc_size_t are not necessary; in fact, it is recommended not to use - * them at all so that the compiler can complain when something turns out to be - * problematic. - * - * Casts in the other direction (from png_alloc_size_t to png_size_t or - * png_uint_32) should be explicitly applied; however, we do not expect to - * encounter practical situations that require such conversions. - * - * PNG_SMALL_SIZE_T must be defined if the maximum value of size_t is less than - * 4294967295 - i.e. less than the maximum value of png_uint_32. - */ -#ifdef PNG_SMALL_SIZE_T - typedef png_uint_32 png_alloc_size_t; -#else - typedef png_size_t png_alloc_size_t; -#endif - -/* Prior to 1.6.0 libpng offered limited support for Microsoft C compiler - * implementations of Intel CPU specific support of user-mode segmented address - * spaces, where 16-bit pointers address more than 65536 bytes of memory using - * separate 'segment' registers. The implementation requires two different - * types of pointer (only one of which includes the segment value.) - * - * If required this support is available in version 1.2 of libpng and may be - * available in versions through 1.5, although the correctness of the code has - * not been verified recently. - */ - -/* Typedef for floating-point numbers that are converted to fixed-point with a - * multiple of 100,000, e.g., gamma - */ -typedef png_int_32 png_fixed_point; - -/* Add typedefs for pointers */ -typedef void * png_voidp; -typedef const void * png_const_voidp; -typedef png_byte * png_bytep; -typedef const png_byte * png_const_bytep; -typedef png_uint_32 * png_uint_32p; -typedef const png_uint_32 * png_const_uint_32p; -typedef png_int_32 * png_int_32p; -typedef const png_int_32 * png_const_int_32p; -typedef png_uint_16 * png_uint_16p; -typedef const png_uint_16 * png_const_uint_16p; -typedef png_int_16 * png_int_16p; -typedef const png_int_16 * png_const_int_16p; -typedef char * png_charp; -typedef const char * png_const_charp; -typedef png_fixed_point * png_fixed_point_p; -typedef const png_fixed_point * png_const_fixed_point_p; -typedef png_size_t * png_size_tp; -typedef const png_size_t * png_const_size_tp; - -#ifdef PNG_STDIO_SUPPORTED -typedef FILE * png_FILE_p; -#endif - -#ifdef PNG_FLOATING_POINT_SUPPORTED -typedef double * png_doublep; -typedef const double * png_const_doublep; -#endif - -/* Pointers to pointers; i.e. arrays */ -typedef png_byte * * png_bytepp; -typedef png_uint_32 * * png_uint_32pp; -typedef png_int_32 * * png_int_32pp; -typedef png_uint_16 * * png_uint_16pp; -typedef png_int_16 * * png_int_16pp; -typedef const char * * png_const_charpp; -typedef char * * png_charpp; -typedef png_fixed_point * * png_fixed_point_pp; -#ifdef PNG_FLOATING_POINT_SUPPORTED -typedef double * * png_doublepp; -#endif - -/* Pointers to pointers to pointers; i.e., pointer to array */ -typedef char * * * png_charppp; - -#endif /* PNG_BUILDING_SYMBOL_TABLE */ - -#endif /* PNGCONF_H */ diff --git a/vendor/libpng/include/pnglibconf.h b/vendor/libpng/include/pnglibconf.h deleted file mode 100644 index 2719f00..0000000 --- a/vendor/libpng/include/pnglibconf.h +++ /dev/null @@ -1,216 +0,0 @@ -/* libpng 1.6.18 STANDARD API DEFINITION */ - -/* pnglibconf.h - library build configuration */ - -/* Libpng version 1.6.18 - July 23, 2015 */ - -/* Copyright (c) 1998-2014 Glenn Randers-Pehrson */ - -/* This code is released under the libpng license. */ -/* For conditions of distribution and use, see the disclaimer */ -/* and license in png.h */ - -/* pnglibconf.h */ -/* Machine generated file: DO NOT EDIT */ -/* Derived from: scripts/pnglibconf.dfa */ -#ifndef PNGLCONF_H -#define PNGLCONF_H -/* options */ -#define PNG_16BIT_SUPPORTED -#define PNG_ALIGNED_MEMORY_SUPPORTED -/*#undef PNG_ARM_NEON_API_SUPPORTED*/ -/*#undef PNG_ARM_NEON_CHECK_SUPPORTED*/ -#define PNG_BENIGN_ERRORS_SUPPORTED -#define PNG_BENIGN_READ_ERRORS_SUPPORTED -/*#undef PNG_BENIGN_WRITE_ERRORS_SUPPORTED*/ -#define PNG_BUILD_GRAYSCALE_PALETTE_SUPPORTED -#define PNG_CHECK_FOR_INVALID_INDEX_SUPPORTED -#define PNG_COLORSPACE_SUPPORTED -#define PNG_CONSOLE_IO_SUPPORTED -#define PNG_CONVERT_tIME_SUPPORTED -#define PNG_EASY_ACCESS_SUPPORTED -/*#undef PNG_ERROR_NUMBERS_SUPPORTED*/ -#define PNG_ERROR_TEXT_SUPPORTED -#define PNG_FIXED_POINT_SUPPORTED -#define PNG_FLOATING_ARITHMETIC_SUPPORTED -#define PNG_FLOATING_POINT_SUPPORTED -#define PNG_FORMAT_AFIRST_SUPPORTED -#define PNG_FORMAT_BGR_SUPPORTED -#define PNG_GAMMA_SUPPORTED -#define PNG_GET_PALETTE_MAX_SUPPORTED -#define PNG_HANDLE_AS_UNKNOWN_SUPPORTED -#define PNG_INCH_CONVERSIONS_SUPPORTED -#define PNG_INFO_IMAGE_SUPPORTED -#define PNG_IO_STATE_SUPPORTED -#define PNG_MNG_FEATURES_SUPPORTED -#define PNG_POINTER_INDEXING_SUPPORTED -#define PNG_PROGRESSIVE_READ_SUPPORTED -#define PNG_READ_16BIT_SUPPORTED -#define PNG_READ_ALPHA_MODE_SUPPORTED -#define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED -#define PNG_READ_BACKGROUND_SUPPORTED -#define PNG_READ_BGR_SUPPORTED -#define PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED -#define PNG_READ_COMPOSITE_NODIV_SUPPORTED -#define PNG_READ_COMPRESSED_TEXT_SUPPORTED -#define PNG_READ_EXPAND_16_SUPPORTED -#define PNG_READ_EXPAND_SUPPORTED -#define PNG_READ_FILLER_SUPPORTED -#define PNG_READ_GAMMA_SUPPORTED -#define PNG_READ_GET_PALETTE_MAX_SUPPORTED -#define PNG_READ_GRAY_TO_RGB_SUPPORTED -#define PNG_READ_INTERLACING_SUPPORTED -#define PNG_READ_INT_FUNCTIONS_SUPPORTED -#define PNG_READ_INVERT_ALPHA_SUPPORTED -#define PNG_READ_INVERT_SUPPORTED -#define PNG_READ_OPT_PLTE_SUPPORTED -#define PNG_READ_PACKSWAP_SUPPORTED -#define PNG_READ_PACK_SUPPORTED -#define PNG_READ_QUANTIZE_SUPPORTED -#define PNG_READ_RGB_TO_GRAY_SUPPORTED -#define PNG_READ_SCALE_16_TO_8_SUPPORTED -#define PNG_READ_SHIFT_SUPPORTED -#define PNG_READ_STRIP_16_TO_8_SUPPORTED -#define PNG_READ_STRIP_ALPHA_SUPPORTED -#define PNG_READ_SUPPORTED -#define PNG_READ_SWAP_ALPHA_SUPPORTED -#define PNG_READ_SWAP_SUPPORTED -#define PNG_READ_TEXT_SUPPORTED -#define PNG_READ_TRANSFORMS_SUPPORTED -#define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED -#define PNG_READ_USER_CHUNKS_SUPPORTED -#define PNG_READ_USER_TRANSFORM_SUPPORTED -#define PNG_READ_bKGD_SUPPORTED -#define PNG_READ_cHRM_SUPPORTED -#define PNG_READ_gAMA_SUPPORTED -#define PNG_READ_hIST_SUPPORTED -#define PNG_READ_iCCP_SUPPORTED -#define PNG_READ_iTXt_SUPPORTED -#define PNG_READ_oFFs_SUPPORTED -#define PNG_READ_pCAL_SUPPORTED -#define PNG_READ_pHYs_SUPPORTED -#define PNG_READ_sBIT_SUPPORTED -#define PNG_READ_sCAL_SUPPORTED -#define PNG_READ_sPLT_SUPPORTED -#define PNG_READ_sRGB_SUPPORTED -#define PNG_READ_tEXt_SUPPORTED -#define PNG_READ_tIME_SUPPORTED -#define PNG_READ_tRNS_SUPPORTED -#define PNG_READ_zTXt_SUPPORTED -#define PNG_SAVE_INT_32_SUPPORTED -#define PNG_SAVE_UNKNOWN_CHUNKS_SUPPORTED -#define PNG_SEQUENTIAL_READ_SUPPORTED -#define PNG_SETJMP_SUPPORTED -#define PNG_SET_OPTION_SUPPORTED -#define PNG_SET_UNKNOWN_CHUNKS_SUPPORTED -#define PNG_SET_USER_LIMITS_SUPPORTED -#define PNG_SIMPLIFIED_READ_AFIRST_SUPPORTED -#define PNG_SIMPLIFIED_READ_BGR_SUPPORTED -#define PNG_SIMPLIFIED_READ_SUPPORTED -#define PNG_SIMPLIFIED_WRITE_AFIRST_SUPPORTED -#define PNG_SIMPLIFIED_WRITE_BGR_SUPPORTED -#define PNG_SIMPLIFIED_WRITE_SUPPORTED -#define PNG_STDIO_SUPPORTED -#define PNG_STORE_UNKNOWN_CHUNKS_SUPPORTED -#define PNG_TEXT_SUPPORTED -#define PNG_TIME_RFC1123_SUPPORTED -#define PNG_UNKNOWN_CHUNKS_SUPPORTED -#define PNG_USER_CHUNKS_SUPPORTED -#define PNG_USER_LIMITS_SUPPORTED -#define PNG_USER_MEM_SUPPORTED -#define PNG_USER_TRANSFORM_INFO_SUPPORTED -#define PNG_USER_TRANSFORM_PTR_SUPPORTED -#define PNG_WARNINGS_SUPPORTED -#define PNG_WRITE_16BIT_SUPPORTED -#define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED -#define PNG_WRITE_BGR_SUPPORTED -#define PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED -#define PNG_WRITE_COMPRESSED_TEXT_SUPPORTED -#define PNG_WRITE_CUSTOMIZE_COMPRESSION_SUPPORTED -#define PNG_WRITE_CUSTOMIZE_ZTXT_COMPRESSION_SUPPORTED -#define PNG_WRITE_FILLER_SUPPORTED -#define PNG_WRITE_FILTER_SUPPORTED -#define PNG_WRITE_FLUSH_SUPPORTED -#define PNG_WRITE_GET_PALETTE_MAX_SUPPORTED -#define PNG_WRITE_INTERLACING_SUPPORTED -#define PNG_WRITE_INT_FUNCTIONS_SUPPORTED -#define PNG_WRITE_INVERT_ALPHA_SUPPORTED -#define PNG_WRITE_INVERT_SUPPORTED -#define PNG_WRITE_OPTIMIZE_CMF_SUPPORTED -#define PNG_WRITE_PACKSWAP_SUPPORTED -#define PNG_WRITE_PACK_SUPPORTED -#define PNG_WRITE_SHIFT_SUPPORTED -#define PNG_WRITE_SUPPORTED -#define PNG_WRITE_SWAP_ALPHA_SUPPORTED -#define PNG_WRITE_SWAP_SUPPORTED -#define PNG_WRITE_TEXT_SUPPORTED -#define PNG_WRITE_TRANSFORMS_SUPPORTED -#define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED -#define PNG_WRITE_USER_TRANSFORM_SUPPORTED -#define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED -#define PNG_WRITE_bKGD_SUPPORTED -#define PNG_WRITE_cHRM_SUPPORTED -#define PNG_WRITE_gAMA_SUPPORTED -#define PNG_WRITE_hIST_SUPPORTED -#define PNG_WRITE_iCCP_SUPPORTED -#define PNG_WRITE_iTXt_SUPPORTED -#define PNG_WRITE_oFFs_SUPPORTED -#define PNG_WRITE_pCAL_SUPPORTED -#define PNG_WRITE_pHYs_SUPPORTED -#define PNG_WRITE_sBIT_SUPPORTED -#define PNG_WRITE_sCAL_SUPPORTED -#define PNG_WRITE_sPLT_SUPPORTED -#define PNG_WRITE_sRGB_SUPPORTED -#define PNG_WRITE_tEXt_SUPPORTED -#define PNG_WRITE_tIME_SUPPORTED -#define PNG_WRITE_tRNS_SUPPORTED -#define PNG_WRITE_zTXt_SUPPORTED -#define PNG_bKGD_SUPPORTED -#define PNG_cHRM_SUPPORTED -#define PNG_gAMA_SUPPORTED -#define PNG_hIST_SUPPORTED -#define PNG_iCCP_SUPPORTED -#define PNG_iTXt_SUPPORTED -#define PNG_oFFs_SUPPORTED -#define PNG_pCAL_SUPPORTED -#define PNG_pHYs_SUPPORTED -#define PNG_sBIT_SUPPORTED -#define PNG_sCAL_SUPPORTED -#define PNG_sPLT_SUPPORTED -#define PNG_sRGB_SUPPORTED -#define PNG_tEXt_SUPPORTED -#define PNG_tIME_SUPPORTED -#define PNG_tRNS_SUPPORTED -#define PNG_zTXt_SUPPORTED -/* end of options */ -/* settings */ -#define PNG_API_RULE 0 -#define PNG_COST_SHIFT 3 -#define PNG_DEFAULT_READ_MACROS 1 -#define PNG_GAMMA_THRESHOLD_FIXED 5000 -#define PNG_IDAT_READ_SIZE PNG_ZBUF_SIZE -#define PNG_INFLATE_BUF_SIZE 1024 -#define PNG_LINKAGE_API extern -#define PNG_LINKAGE_CALLBACK extern -#define PNG_LINKAGE_DATA extern -#define PNG_LINKAGE_FUNCTION extern -#define PNG_MAX_GAMMA_8 11 -#define PNG_QUANTIZE_BLUE_BITS 5 -#define PNG_QUANTIZE_GREEN_BITS 5 -#define PNG_QUANTIZE_RED_BITS 5 -#define PNG_TEXT_Z_DEFAULT_COMPRESSION (-1) -#define PNG_TEXT_Z_DEFAULT_STRATEGY 0 -#define PNG_USER_CHUNK_CACHE_MAX 1000 -#define PNG_USER_CHUNK_MALLOC_MAX 8000000 -#define PNG_USER_HEIGHT_MAX 1000000 -#define PNG_USER_WIDTH_MAX 1000000 -#define PNG_WEIGHT_SHIFT 8 -#define PNG_ZBUF_SIZE 8192 -#define PNG_ZLIB_VERNUM 0 /* unknown */ -#define PNG_Z_DEFAULT_COMPRESSION (-1) -#define PNG_Z_DEFAULT_NOFILTER_STRATEGY 0 -#define PNG_Z_DEFAULT_STRATEGY 1 -#define PNG_sCAL_PRECISION 5 -#define PNG_sRGB_PROFILE_CHECKS 2 -/* end of settings */ -#endif /* PNGLCONF_H */ diff --git a/vendor/libpng/lib/x86/libpng.lib b/vendor/libpng/lib/x86/libpng.lib deleted file mode 100644 index aa152ca7b79f736632f286dbdd145b1a71f0aae8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1066594 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 z zVqmahXJ|OY#K2&~&d~6jiGjhMouT0?69a=IJ3|92GXsMwJ41soGXsM+J41sSGXsMk zJ41snGXsM^J3~VvGXp~~J3~VaGXp~iJ3~V!GXp~?J43?^W(I~Zc7}#o%nS^X>xs97a7|P-T@AU=cHppII5Q~e! zkP(vaxEVnAxPo#Z7XwHJls~x{Tp1Y{KrAi>&}I>kZQKkq7#YAOf!jgNZ#cq0eL>I= zECZMb2a}L8>_hVrfzHw&t=~%0V4XphPS-!J2TDA$Bp@Q)Cz_9Nw4N-{;txNN#(#}5 zjsKb>2Z#{pH0*Z$)9fk2*y+g9$sZ3sJSeXFY3$)%*FOOe&CN$RdR>3O+C0riIKXy? zgDr19!VwQv4$8%1;L-+^mqfuVP(AbLz11PP6Myf;@KzG=I4owqb0Ikr5 z^jbmpjDdPXA`GB@V;xv8=(rM4FA0196|`Lpl=VPm6eyp7$}AWk)JX=dNQLo1@}M-q z2raWf;vmyOG)%uZm;n-jlu00YE3`5RX6GUX28Lj4WfFJ|S3LOo6wp~S5Ys@m!+I%T zHqvP2uK)%HaB&7MHh%p7|No05yf+ITNduK#yi$msEVSqVmmQ$dbg+pG3=AN*f!Lsa z6l`_sW>$svu=%goBh6d0LlV@2O z8bI~R1y;z(P?uR58bD!ng%y&=KwCK={bCRc(k}+FxEMer2y=teK8OWP{}REV^De@> z>Eivgapo9j3jN@cpe z1->2RC}H0TQu&&t`607ow=)O-`h%Tr9L=>q7)oNA>v$OWTR;o&yPYLk5Ae4nGBGeT z{}3o+-vJ8t*AmS?SjyOUfKt|L9`F%l)+eM7e81rU8CJ|<4)|Zp^S_wme<=sVZdkt4 zcx~S8`X`H_`$QH)^8=1ff5-|h?NSgU@GB($bd?p zBP`7i-gmnGS)l-zXGE93-|6}Xq_;$FMV^|4OH+U5>)H$ zQp5N-;{(y40=C;tqB~BcyYvOt{ zcr;OjVJag7_`oL-2GE%;5ZR543=E)SGesBlFo2rVA`GBg;X#ApA`D4P3=EgSE@)$7V0aE@^)fLqfW|yT7(guoS#T-8l8J!< zbYD0d!+ItL261p(_6QRL!y~Yc&rA#qpiYkn1E`H~7Az*s%)rnB)(dJIgO1%4VE~Oz zwu8lVnHd-$VxVjX@;#_T0+oy)Y{bmK02(R=$$|KwS_4#rf%u?WgBMMH5;p?_?6f9O zj^jp?zsrqi>4MB*LzA}x2_m(0L8UZ$tpairNEwKZz+J24CT8Y=+qxk4gWL|nAblVj zGW>*SzY3`M_?a3YHE6*C$Sqv3fGN0&0eK8GcAi+2UYeVlR|2hKK&^5I&@M2j1t9l< zn4rN1(57S%yP6$R!_=`u&K9f(wF*IwVTX*6HnKA`fV|Yg&d>nb@7~JJ&;Z(x-3DrX zF)%Q+vqMIhy4e}P$Cvf9Lq?h=uroA(YO%?n)*}N0!&G+2nSyiJA*U(LV`pdp&G0N^ zXJ`POu(g_T85nkeTBD$J%FfWx21>*13=MsZ3=D_a85(9X zGBBKAXJ`N&#Bh?Gp#ik9=nSY8$;iNPnVq3wA0q?94R(eG&`CXa*clqmF)}dRV`pdp zoo#xbouT0gBLl+&c7}#mj0_A<*%=z%F)}bbXJ=>t9moHIouL6VI{A{Fp@EBuf#Cx? z3wCI2andnHU(D zIT#xJm>3w?IT#v1ch_@rKw8%V91IPaObiT?91IPOObiS%91IOpm>3uoI2am0JxoOo zhK6NK3=B#f3=J!o7#Nf}7#enfPUhrbXgJNpz@W*&&~P4fMj;17!xd1goP(j^1``8= zF$Y7#JthVQ6Anmg-Hd~w;RC2O&%w~}or!_Ll7pcEG%RMz!O+0N%)nsB!O#HO$ZXHS z&>#W2egWEw{|0ScgU(KZw5~xcNb4HJ;$i^JP=NX!+@LCm0mOowqys9WASda7SX|)o zau@J|4p8d=#Nql7Q#{HOMA|i*wM?Ob{{9k)WW#6*lnx3Wyk}*hVknL6cvg zq6t<^f{J*MIv56ZQIO@4CmBE;Y;fo^K&lClI#4!-HQzx;g`5NlBFV>ti%3X84C-Km zW_Hn6I)K~+vR{&sfguW19)ita1g$gyxBj8iUM2bQpe-NZQXZ@VN|iMgo^QViUJpm}&uB*NBHl;p=-BxRN`2r_UBf@Tt|1sE70_u?>!GH?rm z!VIJwbo@BzD4a0LNs%z#vaFOkblEC5#!pi~1IH3vHjbiM|tnGD@83W`6Fco_#| zBCUdhp#e0pQN;l{^|FS8p#ijCtd0Xx9W;W9H3kNTHV(+)UL72eL;E^8Ag5Pu=75|F z-pv6S)ac`YbTB4xKu)!s2rAw{7a4Ov4*ie65Y+tAAX>lp|c>N+f^iu|C;NAPS+>ht`Z>Ti%!=U-L5jAwxp{7NZ>=K>xW*~ z2La$RARHv}qqFt_I8}#te*n{vwFU8@#%P@J0Wb|w4VC4H!y*P2f~p4P15hyxDJwt) zFB=1B0uIuA19j^^fXe{TNOc!DAA`E%kUR_WFDTEkF@VY#h!`kufbubD@(Gk~Kp52A z1Wj&%(jaUjco0n3BhI*<-ND2<{|P=o9Q znGI^-f{q#k*~@@D=m_cHmw*nsO3BOzXH<|K5OuIp0?fmjQ92SWpB_g^drWMCkU12TbF zzyUdgGYOiXL4445^K=e|2GATghz}av$l-uA`#^k9MUvyaEslobS4QL8D=u-L5>Hji71?F;5Nh9?0t;3gyIG!@Nf{w`Xj-J z;ULhWO^~laB{akgP<&!p&<1h~$S6=&0gd;7*flJWx#W5lh6d0~M-vO=K;mW=$k+_1 zuLfC31!6%~Qh``p;AMg!7B>T^X9r?o1SLp)woC-%d{|Jr;}1&Eavw-g zfX3TE{=|ZD1ShQ41O+F;91?=G9U7!v&>-!F25BEONI}#1kRS!IAVCUZaWQ~M5awn8 z)jl8=I7lH4*Ah9<>Wt?993_0)Z#LTn8O(3JM|6AUzuc=oA4^iv#;0DJ=3q zDG3xXpo9!c6fg`b$3fySc~H3w>d=D3Kq(DWj)K@Q`7_|Q4ul8F2%uqG^i{PWJ3;1y z_HTO;ioKGI{1k903bF-;A?Aa5IHC^Jd;z%+5_Moh!0`sk=b(iSV7;Il=%5VHA{fv> zCy2X`1=1!t$O2j1bDRaTsNw_*LxU0n1H&m6h6a$^PeWr7bpHpWi~+GAWekYL1#X9e zSlkStGlM`Za4bT~7+%oQ9M1~I&PGu5V$U3)CK1R1c7FYnoje!R-^5R*Ldq8G^+zg6(5PK3d zV@!o+jM*%ZIjlL*AiWAcP6xCK3&etC3=oS8T*81@+~6z%Vu6DcnlYR}Vfur=P6jDo z>;SEuY(B!#30`^`7kjw*2S=?ivI0=(A}av3dqIZ)v4Q6NJTaY9IucSNuX`=P(v6%?gFtvJJvxN z4a8my%{)t>nP)Au$Xm|>8Ryx+0y)KZD+}a~iJdGA4WQ2EE*8kjq|Gc0;FU=rd3y#1 zhHWg63x+`IK>i1*133}28Va&v62#&Lub2d}xEMgkhk;n!;1#|g7E%h~ZvjQfw>Hqw z2}`#tPYG-D4~G(t)&u;lpyQWYI45cDS$+YS{H{N~9abn|bpLkP zp@h-B<#r{bJO8#mkRSQCwSn%s;9q~D`6ovW&%u|>{OkKb-LcoaP)74X_Jc2(oA-ea zWbbuk>~!TQ6^4!+bhd#+yInaz!}b3ebTmd}PANz`zEc?@I==K|$VG0Iiu|18>R!&7q1g=z_-6z}*IaI4hlz zfguyDH(Kw%2PpfCc_pazZ&bYS8h zbXD&|W(M$;9M6~`t0!MEL&m1xFf%lO%A}9XkXg{L%nS`-3=9lEnIV^({b7cziu}(E zxnY2b1u|yM$^sd)mSTZ)YLr-?8bGHitFtgPtY%;Ut>b9`&4e4U zKyDB)WMOCk&1{&kFf@P~(q=3S4WJX2Em{%d} zj5)ACZW?f7VQ2siG zyL%x1z`BzRnpzk@%>+;qx(*cpWj#<84jQjS@BBfPfRr=1z_TXgD4Wz0(4byPYEgVf zYH3ksaY<$}X5|gm2_bN_$fOw{tB650G2Ec|+*EMm7gV#uGDco$ZhU!aW_m_RF@q#@ zn9slpJl+6u1WZaCI^2gOm7HH(0?AOIb~I?g0K`R*vynk;Q1c%&7zkn~vM_*K3+d2C z9cWw)(%S*CAdNZ@3$ic<#DXl00kOCk$O?K;>PK%qAqTxH5kViHmRXUC+2;WH2#RSD z0furoBLGPX5dn}AjZhTiL!+P+8U>f&?P?GU5(OX@WSupL1zBeeVu4#tkgkeAw=0kF zrPc%d9)~&`L3Jwj-U=+@k=wqYo(L>sfQJ2y(dsOa9*`O-(BXFQ*Z~iGgGNQta!QLc zFsdwQJb)-1ae+J%l2?>p4oS6GMnXXLgUkWB5!O3tVup-_v@%0RLOPfsE9*L;yEj0c zY)C=|u^^!cVnH?#gIJIa#2^+@C_)C6K>c~_!3XNIgPejZ_&`^xxu69fNDnCZgc%qZ zyfK3hbb@<4Ek~9>cX+MEj+~9pEm&4l;d*4l@0M#_k{JAk$yyAQKZSWRQuC z6*9=g&I%c1Vqk>~GJ)hl9Xe)K$RHC)9ViSy>Od|8b+RCXOdu9Fc#sLif@~fKu^^kr zK`d}8LC$!f6>;QcJWxfCzCZv}vBE0)0L& z3n@531LcjL;Ct*k9W$^8DQu7#R7!*V2^x+81s5nag8F2j%iPeb3XmR<8qh#_Ag&+< zA7=o+Ux>V*Rf6`+K-Zu_f)>+MNaANe4`z@XLH+^x15~wv*lN&V)`SMLE-Pg4Tn`$| z_u;_|VnKo##NuKAHI_guZt#*$5DOB_p&Z?=Jk}SA{cS-xugIhIQi+3Y{eK3AVjlkW zp#sf^91gx>f6WHnEqLnSOZfgm&~7^h{_Q-VRYDB>>kl1#!NUyN?;CsA=s@gYp8v6j zLHP?b@WRFby6yzBEehlt(7-wJlqzT$ImmaQGzg;6V-QqsnWHVY2k8ODAZRIiC~6Fr z<`opB=9cD^WESKQn%@A;^MMi$Xn_K#v7Da=TH^@oLV!dQa|$vN!3$tOooJ9qQEGB# zK~a8kVh+*(6R1G~aytlv+yUq&;VMU1>%Da)yZUoEYAn=LE#D7 zMh0mLf>@9g0b+518-O4dH+b1Chy_j&pxW-6TLn`Ie{UPe@sM4M%|}>z+dwD0K!IJz&+x!Q;&!=J7U=G7t;Y za$#sbVsN|-q!=U;7kd~~4uTfoh%l%^5AGFV03FZ{Sq%(IVh|SS?iC0Nv?mU&1Z&zl56wsvDxr_(1a!iDnz_|NK)AG#~ie$-@2GwL&fcs)q%V zb|FfSvvB|W|NsAMrRE?1OBJ#haH#nUn&3Gi(Cy0M(0o{?)0M-z9ppy-p4|Wc|3_zW zz?YEnH2alsKrCoJ!UF1LAx-_90nHeI?)7D309^(B6g&q4I?DjGFHeL46f2;mtRf7@ zKnI+GSIC3b_JbCtiGXe+X8;AX2!lE!1H*5yUSrVJL*SVY(0C~B)$pJ>F;IE}2Pgw% zoeL;w!Z0kW!sL%+WhgDG0I%lAlnQ!5bMO%{PFiIgHG(&Nsk1Bucgzo2@|k5Y)DZTEPHv8;A|6 zzCpA5Aa)Y;Y?xH&y`~wAkR^{fjF7!oxr~q{kA;koGZ`uw85%%0Lsda9@~&rOXaH5W zEsT&QQoW1}4WQk}{fv+$P%{`A8bC{+<}xxgfR@qDXJlvq_3f83GBki%RI3;n8bCKO zu3=lQ|a2GByi9iRimK>IpC_bf9qFn}%=2aUgj?mGqrBWNZ9 zGU^XvK}P*SEH3b#5>U$GW&oAYAQl&RWEiBI8@x*r#NuKA<#dn^Zt(hS5DTe%DADb1 z1FiY9ZUb$mESAq=0&U5GEPP-sFc2a&kg!-@ZWKtCy<#S^`Mj09I+)v>;sq}Eg-8P$r0P| z0=RgG^oEd!6F~NXG$OB8>4O&V6QPIEOl5{7tQpLZwY0OCAt%4hh8EnQ^~sQe8^nSX z+#nXD;0CcE1viKVj+o%?SdP})C7!Sq=b#OCtq1BXySqUX*gXnvy*4BmR&&EFj_(#_aiFVoG?UC0Akc0@PLjEy3*dWbo@OebD{8`=j*<{$@}a*zNjZ=imRJ^F(Ca(>i6`dY%76 z_iv_IA1oK?KHYuz;tN)WhX3_5zyItG{n6?AhJQPM^Kqs$>(fQ-J3+^RyjDnSJy{~X z1H?|VzELdLeUN{>>l;?kYJ`I?`1!Y=NbBVDYCgu)da3?!cj%AiV;~n>m%b=!>W=-> zUCQylOy+;-6L2{M+OSvppgZ(Ox9^vWFF;9N#<|<|MQ7}v)^Gf+_W%F?kB!KLa&b1uasWv-h6d1; zVJd8pid>bAp#gM~rWP9mc>3R%4YHQmgpHx$C<6n7B^%_>Bx^Q?2GF>q4I4uPs9|i& z#?Sz25<0LkG=P$$6B|PVXm!0C8$$ylBLjmc8$$!=I07#=h6Yfj?90Z`0BZL6u|cN) zx!52Jd_mhSAw>X)1t|hREG`C6oeD~w+~DRTh{Xjy>HxHOfE&EZ5yawR08O}qbZ~>G z_dzUZQK8Zu$`RZx)$JwH%^cRv&|M_c9n2FBDk_`>x_>l3XKFsr*y;PDv-D4A?E_Fz z0rJlZg%Tl9QE`yTt<&`jMEW&zXYH3>cSip8&K%6gK!wC5{uYq6-LV|Kpms2WS7+#l z?w^*fe~PoaW50C&=ikl~Z+xk@5mans9ssTEI`~4MgGKJ&iB8`;ouO}R{+0`NAA}zY z^t1Z{Xs1N%gP=hE?fikD@MP%rz0)1~ri0D9`3R3&^Kquu+w~8-W50lypz>gDcPz*M zVnku!EYa=zqdW9Ncj+HUVZh@EDhzyov|i$GjYTUAx}!Px*WYKp*Lta>1iZ-?>i*b2 z#kOER|8{ZcxXYn~FW}=YpiT|akx8cxz671?^pc~4&#kwf$@+8AiSE)rVX#7`+m!?4 zBnOG^&<`*tb%NYeIuW^G+Rp$xQwDT)45UyBho4Ln4?md(w1NsE3o2AV13AbwHs~5Y z(7+Bz4wT(M#S>@|GKddaS3VbXMhH^z^O}Q!K@hqv19Ub)KbpK5C#YBg<#)&xy{%~S zlR9%D%?2rg z=CVPGpm}VNB4|DvLj!2QdJ(iJTEfQA02=vN&IVbLv=Ukbt%eps>!3x?1~$lci%o0{ z4WJdL+t?TyK)34cV1sP0*vZDw06LXpHycC44h9B>y=)8(plwq7*cci>%a{+bK~@?a zV}opqI?l$>09vE>gblL7=qYGG3$&hwjiCY5>%7Fq&;VKmbcKzf0knGOIvYa+sMmj! z4YKm+HXB2OCnE#H9Z(U;$iQ$Pd}1SgF_mBK4{#Eq5GEhjqWzkw&lr=HN-Sa?7c>Zg#a65LmaR0YHRr85|o10_+|8_UAfZnzR3=9kb|F?k@!Q3eF&5c8$ zL=>#5w+*!0G5{t8a=t@}2>*7FueO2OZ*ZCKZXBQ$p(V2X+aTk5|F?l+`~No3HXoQO z0gx)tc{t|(w}JY&{M*_8DZ)bjhk4YUslW)RpRObiSq z;=OI)fghLzN25P@LOg0ffvztT zVK@jn9v>_QI`IM2j1^(vW@2CfH8~*XJV3^zCNeQFfVSp}Fl+@~lnU1I1hgX^%=*X# z8C7Cq0PPyb-RK2f#tJGyL1iz929>Cw8U==5F@Z!uc@si|&U=7uQ~{0I-$j#0K8+T1 zUcquSc_vU*g;c97W?*1IUvCR?6UcrLZ3YTxu+`wTOOVlB(BZNKx`C*zT@&Qxv!K?l zDfXqWpjrr24t{V!ABqCiLK~18z#zAQoCP`pehF0kAoN`R6AX|u7)~=l1`5tHK&D5} zGcYuO&S1LA02vX!#Q>RJxW@pQR=CdqS?BtQfuR9(8q*U7h6d19Z4e){y&J>_jYNU? zpy>h-AC#S6FfcTL3X3-k3=N?1$+rv)4WI_uM+Sxl&{*Xs28IUENaZ&Mh6d1?bw3yw z8bGIM{b68e08JtNXJBXmokzk98UbTuU|?lrXjsa~z`)7K&;Y7!xfvN6PB1cn&faPO zov0_s$k6bRkpYyV8$g%piZe1ad}L$*ofOc(0ZD-kpv#oy7#SKs=U6B+GBmg|F)-*b zLe5UmV`OM31D$EW$k0&1#K3TofuW%V$_JfUV#~z2G#q1MU;yz?LQd{$xX;AE5DprNV`5;4WQ3fVa0z-p0w~NNwHk;8sntL% zE(TC@UJblX7F3dfSX|(I23jG@4GIVFT3N`*8b}9ZWDUeZsr^6)i@|C?P<8y>y#&i3C!C(tL#Dcsp2_0d&5on@j-zHaBSyAq65N zL4-uW|1y^UW)K7Ux4RWJA5mBdS_@h#wt}NX=$jh{V+qgyG7X4=<|758 z50)Br`*D0f$N+MI`uBsNp&IBmH@NcuWflL+N?=@`*D`6X2TH|3r9TG)LkS=McDDj( zQQv$7RIf9^D@M?g7Pu4-$Y~IFiLVeS5&q`J!BWE8>!t%&!I8y?C|W_43=0DTsDK46 zE&}Z?7GVJO13?=+*cdgrS;&0le&4gaK4TgX%gF22lSEv>k(u;WPsS_((Vr z22dXkR0oQHRf95u2w3JXc!(af1R69vD*`?a4wNkr17xtN9Z<#w-6{>DaTScd&`b}L zM=uyb%`jyB$OR*)x8Dm|n29#(39=JZ@PT|}imTv@PfAV8FG`JvAHfK+1%_d+!94(q zyNH8~ih`OOFw;Qp0kJ`Ish|c9h#d+oj%_=vMO2FM(05(7hnGXwYz&j!#S zVj2VFh~r{VAp<&ihJm30H09U90689U5(7g6s4$z#z|a6H%%(FiG=P@L&SrotzMsdy z&;Y8wmM}n?#7m)t+bU?`wwi&V0d#!vCQu;@IvIe0p#iiUeh0L0+s(kx01D5&(82&z zX+su$fmo15UmzA_(HDpXS@Z>BfipR1&K5LeCJ36_>8|Ag&6|PRTcCNf1_p*wA#g5+ z45Wh(=ZifY44r=Jjs>-bKs$*zVe%}X9Ytc_+&P#^1bW-S`35G%@$E262}0rb!=OZr zDj>nYP-6c5FgO!SeLswpiQ$H1F}~)4%J3pa_?wULwA`*lF&xz5LkN63%zN#Sti>ih$}O2G9%$B6B16rIn$X7u13QC2I6m4`_%5Bo32Dp0WUmfwr9@ z%OlUff#&BxK1P;DpML{&B+%#IKyCtMe$ZS|5Vp);ke5!N(SvR58t=&I)P$ zSg}HmF0g?v3R}g>&;SY>N9eGh8}#f$4_3%IssXH!`SBoDh6d0aY%uh!!$?-h(InBV z3=N)lt<*W=1pgSL`SRuoH)vOE+ zpvt0&m7xK&ZLo!vp#fCrb+JNr{q(RhG=NTFo5Tv4*PFu1&;S~!o5jk|0LqbbK*OAj z3=B(H85%(Id&^lN^Lrrwf!dDm!OMg|{XGy1(%JyAxWH#6fmqxO0gMdbSv_z8)BHvR zw2TUN;5rYe!0B{-11fVsrzke>15Mj8l*%{k1J^mFVxWn776u0XmL5<~8$6WOe1s*q zYaZw@rk30MEuiT6=2pW5T?w$Q4WzO82OEDosIvjxeEAJL9mvk#0vc$7WbEc6EYWe@ zzJH9*f(->7Qvy|0$_v>}$;#ghnq9)F95TnK!fwOD-vU}DfKwsFT;@_vh`G$gML3m0 z&1AM=D)Ggs2x1;1%si%IB|=I|?(uJH18sQh0`KeWo(AfEb-4cM0`KqaaQ*r1Wry#t z&d?7XuD|)Wov`63;s9^`ZS^F9(!~L>Rt-f*R}s zRwf1ph&oZwxo%)F(AoQ-I!A;di-`feB1D7%)Pn)_^+gyaGcka7;)yUEh3h!S#J~^> zt}Q{QzJVGxA`CZ~7#Kh!oNNrBUJOJG)RPCT@nU0m0Xi)Xtm6&nyf`ombRryRx`~b9 z3#4Dgz{c={i2=NmmyH3`HwB$JiG7DH==3;HArEURg6cjHA5`~%=nYJuv(XVf{)Zq5 zP07(4Wie5FgJl{du(-I zQGPkN?gLp2OFs}J!8~G*8wYj$jnT&fOpy1*f>fB8AT3-0?VL42-%4wQp#piW3rGv* zhFx?s4AIRnG{m|*h7Y>R^|BBH11K0k6*}nnRbFKj2G)!V-U@!))uVZ9jFkxnBSO(hp$_zPS(w>zNiV`5o<5fX_VVW&o9;pmL6j z0aWgRCT+RF=e&YgT%a)+22iMSGl2LY78e6(k`YwaaD%(VAQl$`sPhe)u;yj}RW=|N z7XxUf3ba3-n*nsH0EorKP{7E*04j;N!3RHqSX>N^jNq{z25tt>oDyg)8y5p8CP3#5 zaD(q@0I|3j7Bez{&&K6u0L?*wN-Qphw~UZ;XSo?bBT5keg2t3UEN%uK=&7{eb`x~@ zj67)MCA_;%yg;JufiDK&@;goKz0X5-k604q#DD`8-T38*6gT6zuIzYI1O zyf_9j8UPxu1e?de06x1C#0Hh;pv6TXwiR@Fj01Fej0<#mj2jc=vIGz4G8j;U82?)pabqd*?~VHcJV>-NR^U{Npl3{cQD zPoU+0A`Cg83KCpB7cnq^_XLPAfM&-*4HoPv4>Y(73Po7Fp{G31p~cAZ$lXv-3aJ4} zBBe~^!!AI_{#T*NqaStwZb720I03l{l=47bR1;XzW?+P*y3)Mty!`UK_~eYzyll+P z^e}&rIQj%yo&`&U*ubJ zmYP^nT9jI>kXV$eke6SgkeHK`U!IzxkeR2Ds1V@iu8@*gl2}|)l$w~!P*9W)I;l`0 zH?br+BehteILO^eA*r-P0TdM=yE2`f0~9jzic3-xQy9V$b23vDpx2%#6r~oHW)`KU zD5T{V!30wjz{}@~8T|4UJY5_^iophzq~pWYCF1xxCVjK8r%mAhI(dth8Ey}1RDrF1lLL-zqCXlKTRPwH8;Pg z5-bmiJFqG%P&$D`A1IEYv6Yvv06v^nH#e~W>{vLj0FM4JyrpI|h*m5=%1k z^T2As) z2PpLuX9Y|pZW}=N%pzk4P_oj?Oi_M+jsdhPl9|B)R1oMH7))ejXn=_5rGT7U23p<* z8e?K$W(2iYKxG{Q>!qY7m8PqJ)}eqlY%nl0^6%m@l5 zm^mC6=746InHfQQzd*X5@8u4{bPuQ&VP*t1PhsY8VVDD|(U=)Q%Qisn+2VFD4$~aa zl51v0&>{9Pb9gY!0bOFs%m`{Vf%esNqDTA7*g2xwv%WC(aN0OT^{^aHwxo0$=G(E+Hf-uvKw zET%aimohVUFf%ZKVh&`K7>0X5GgZutppFm7)~=O)6EMvIwa1wmK@-j(SAfisz%U1t z0+|^>6Ahpg`Qd>0Lril(E@fr}H6~%^NMV=*ItGQA5#$z-J#X07p20K+bk-*`BWOwq zW{wPoIiQ9Z!kk36S0R|@fKod%BWTzQW{w<&IiTgi%#5HNub}jNEkCUe(;U#CJ~Jbz zEebP70mB^7764{OP)LIOHTA$#e@t_f!RZGyZ3Ht%3Bw!}uo}=_bWlmubDLu!ra7Pq zCT2#^M?`4M>`S zYjQ4V;SK0wX{53jwD6Fb5mYk4+@pbE4rnHukU5~f9Wx_nDgb7V7KS;Xm||uGr6Q1n zRF5UC$MhGdC&0`I8cKngqk~}%s5gK}KRicv?!Yt$v;~ft5jno}Fw6mM>p+-ui<$8> zra7Q(qs)w;DKeOQ3^2?AZ686TL-v5_ZJ6eO2C0}CK?jb(%rU|+2VA1U^Vh<|hxcHb z1KNLtnlDT+%mJN=&&&u*hd;d|3^C0COnGtjvJj^{-80LV^-i5RQK>1zGVcRiGb8NwR5V_v5 z!7vAObqq5jXhsKAi~Bg;#*!~UJJOjMK?CbB_t;^W0~$|YW`wMCXJFWu{pBsDdq8^u zm>EF}h(I+xDBU|?m;>r{L)sf4f6a(0dxvQbXhMOR5j0%^bB_~-IiPhW%#7g-kXBFZ ze-TMcb3n`3P|F_|40AvSY%()~c13{d_mhX$Ct#Wb+CgxjnHfQcp2FM{gkcV-q0P()8kYdoUzsPO4q%!C+Pi|8Keg$0@)0SERtW4ng`)S z)fA=X=0my{P;)@CpjIh}hN?-=Ey>J<*u}!2019LV1_oFi&jq#}q#9IqgJ>SO2q*=B zL?GsXSfJAqKr})Gw96A!1hiZhB;o@%2RseVz`)=I7XjUs15(2V7XdBm0EuwGML>rW zfn#ql$p8B1RPf9hi$M(g{jrU?ETp zf*7FXz93o$?u)fhHBN95&^1^fH34vuvrsibaFM%E5f``!=rSyjE(f>>Xi@_tg7B#r zsL*6!VBmwR0ZnLt)TqHlKnpiPA{ua!Xs9kNxJV6DL#TX*37$P$< zMAl-6?8Xo|i6L?wL*yxj$RDVPA3QX;VMQcdL>ek00T(fWib%ml{GcL;(1^kiDZmhE z#}Jv1A+icXWEY0WDGZUj7$R>mM3_NC9pEU0#k(+uh$e=JC5DJ6hDaoaNG66zC5A{R zhR93|k(C%CJ26B~Vu;+t5P69q@)JXZ8`MBV2_Hoa5i<-CKMavn43TCGk%br{n=nKU zVu)PC5P6It@)bjb4KxtIz`zg!uNh^aA_8y`Q>cg?T*Lz^A_5nQgNnGpMM|L}HgJ&+ zsE7w#WFAyR2rjY-Dk26KIRO=ccXa$N;5PkVtVVXvrT;1awy=s0Z~M zG~Eq4;smsE!35MlK@|b@#6VNi;MNyNjS;B71e#p}iLil1K<0p^{}CdfejsS#A1-1D zG8xoQMTmgR0ksMdA|P`>eQSgW$Q;lFKU~BFqy}_ZB0>bz$9v4g0KPf_>>gu~T__@8 zH-o0SL46Rg8Y7U&C?dw7whgGo2OduV`3vl3P|pS=0@h^+>f?c0JO~j`&k%HAIYI>F zFVF!=2oaDAL5rdgA|PKBGB7Z}MT|k=T*!zl0_tz0h!}zV<;4iRz`Bev!$m+2WSGSa(FIWh@&)MnZiE_;B9J+t z@j9>?Q;-@^-HZ?cxfvk>N^6hdDHGDqVqo}$BBECWn)d>!WMBY=BQqmtdjL%Qm>EIw3DPAJU)X}sWewE@QiG}sboc`^BWP>{q$?pdcPBzu z8B`ZY4XUn4a6bh!dIQq+^YCvmgs$~aT_826xDX1=x8dP1Nyur)}O3NT! zthbGN5W3i*!@D3gsJcLN8O)5ZUR~J2eG3q}9HF{EYEX40g2ND&HfFq=X@$^L3DpHs zgQ^R3iy9(DwL8RqLFn2E)df<6sta^kJ0e9*?z;LKq3b797f21NF3?;yBIJcj?;l0z zG6r?Lq4V9Sxkw2INDZnkPk{xU* z@8!6RFlQrF7f1~g!wo(LhIr7@1@I((d^}_@!OVmq9yCvzT$Gwvk_w&EEiNf4O)kMH z5pM*Mg3LV^XQm@_A&V)H%>=D~1X&C>5~2?*3|WN$*(wFrgOGz53cH>)ttdYiYDj!Z zE*3e^$VfcY&7jo>N$EupRUl4rd1664QhU5(Jii(`X0oUL7agMcQ`}>^UPhaf?UwrreugI5O#cd zViDBXw4&5hh!kWn6RZOy4Nt&Hsd<^{d7u%}e5CAxEDB8*>8U00Mfv4Pl_jZA5pY8A z2=YZw9O;g}j_6{Z9xg!;hk$f}w^V}N0^)%dTp{F2g8YIZJaA4+jZZ9&hpzB~2tz^x zv`GtW0yv+LlnWTn?_Oymnbd)-ESM8lA4y2Sd!|RmjW>zWKcZh!sz&%%wlK} z04-KQB`k8bf@L^#ag4l<@IJ(TL;%2YQaos>7{mz>C7!N+F35cJP=%-}cJd5CR+Wqv zA5c|6?oP<6Kr7mi`NaV~D5fCd0HQz1+a1L%8J@wY>RltC0R>TC6@tpoMC0eXxk1wq zM16s?qYtus3OpiF;mS*j67!1F@{4l8OQ)drrsT&bXQU=)$3s`@#e-Mz!SY68K>;`$!t)tO z04Wa^C#I#MWI7NZC1XNVRHP=CmO!&GBxOSlfdm{hW5Cvlg3~$N*_nAIMTrHO6{$H8 z|3I`r(=0>?VkAT&GcOY*5+QPs6VJc~qaH~O7J}*otv-WXyABqG=mceLL^_9vLDc6a zX67+C#K#w>CYKgvmQ+FmGC4m#J2TY*+L8g43h_ya#Zb?KxhbhRC5a67_VLaR@dnP$ z4!$lvZXV77UJlS@q4uVrb)oi_kcFZ4rqJNAHwCq39AFw`g(XYI$mky=i8iy(wI)v%iC@o4=p8w}-0(bls@EDRkke zy(!3z_NGatCHAHuk7nkjBQ*LrI5~Oxd3m^aIDnUs+M7btjlC&s5vjdtT7D5!9InyH z$HB+f$t}Rs*W1A_-`*5dOcX=RFGbvjeDD19=3p_SD|AJh9l`6ukP> z-W0Sn5fnUdjm~ZkKJHEdzMg*m4&eNimzV=_XR5s^JO|mEf|sD$o2DW(Iy$(z`Z@Z# zc=|g)*QDB;7Uh?NeN~cL1PvBQ{b_G%fZ|UVF9&abC*J^Xe|NBRL5U91(6KkRHw_K2 zH*^ehw>JbYS_L^e4{oiKpM#sLlbe^1X8^)l$dXlr%}`5`L)OK~!OJ7S#mULb*#Wee z)!r0VglFdG*_%Qd1I6~H_9`yE_9`xZ_NK;0*+@yq#mT|V%f-Vdz|)VAet(F5BU3XZ z{m%XlP9AP<9)6x4*z`kPY-(X|nptdbT3lKH_p!5^gOh)NQ-GVNr$b&oIE;&-fr}K= zpuB8v3QAPvaGfq54lXWEex5Ea&JMWO!h%8^v>Fz!&CJis$JN)(-NDe_#LV8r&;lju zoE;s!JbYce+?_lfK=vb-5Fn%SLHQ^@&E6EUOcqtIn}e^5uXli(3nbd1sTAyXV^9i* ztbYc@cuo#VVsmwH_ILGl^K)|shXHsMt-WP#VgWQH5CR3Di!gO8h!hoir* zE7-kgb|S5{1*dm}J|BkwKd%5cFIRuCK4gEwR^5X9o0$h%cMI3%;_l$$>gVq5>f}T~ z8)$_rT$_=*uaBFPlb=I*5^9KfJGeVLyZSk~24FJ|T!4T>4&;awxN$CS4lceA zUih_v9Fgk45RY7{gUfS<`1p$4T!%CQfI;8VQUMtlnwXdy7@3(Fm?4WQC>R{Fb-?VL3=Hhhu||;f*vtdX75H*7FwBLj15IIKb026u z-cc?F22tqv6fXaQR$IFBFfgP+)q$cAn|YwQj4B=mhC|SCAX+`6o}t;9 zIfZ2v=^3G^MHy*T`4t{cp(#bVF3th@MU?@WW%*@Q8D*i_xg}+pnK_yMIhBPDj+Q3I zPA2AtCZ+~XhAt*1sBZA_baM6$L35bDkBgt9uWPW90w@MS`{&vi7#KVl7zJna)PHuh zib*QX%t?vKDacDVG&8h_DJaU%N=+^)jw#D5E=|lyHaCn3&&)G6iudt!iVsT7Nlh$H zjVZ`WFVD=^%TLN;uwt+gWKdvWU}pfWBu#qI>l$!(?J*tGNLIrahyWZb6uCVpxV_*QqGAPDC zBjN&#nF?#e0@xo2wO>uqOL+D(odJBnJ7@znLn@|6AZ|>?CWYz8ac- zg@U$%tpeE^6;zB&ptk6OZ2^T3C|*ICpN+vs5Ohx`D6XRzL`9dXw>(ixX7*gBeRP3G z#3oTtDT5`bhzXCfWJ5y(y@He^hR>fqhIYT{cI9Y2P{RGcAOU=yLGuxo*u$Xw1Bx=l z_C46JG{}*lA{0b}90#I76QUpof%qT~fCgC2(T;cm=>e$$EeY2Ft?CA8WB{LSmy(*6 zSejE359y_&@9hMugAho2JHJRWfVZ<0loUbk%K`291|>j@@bn_u-bz~_6 z0|TU|2#!)vjDnVhLT!ULBtZ2sXn8M4+yuG_(wqTuO1%{Wd}IsV z+z49Y54oxU#Nq~Dzy@M*flt=}O-MsFJc3wU44{)kLDPcV44|`>KrAls`AQ%i+zg-v z$RHLtC4f#u?f^}ox1KCv>vZLa{r?dA#bTi99prLYID%pnlrKPhP>hu`Ffiz&#TZBr zNDXMJSsOLRNXawEw@rf1O#tm-0Xc;Oc5VWCh=c3}DL@W!4`?3pWMF6jMVc1_QAU-Hnf?@%Zr$8)7o&vGB7(jQ8fLPoNptCSREJ!SXSddr%u^^!v%F%kM z#HHJnr_(8++f|_T0O&e%27cEQ-L4{?UJ(d>b5#sOXBQ|UN<_g~FX*@vXvP=ZoMUJ{ z!V!BI1*Ome7bFMX_zsGFP}v8wALMQj8&n;EmP3QsHPG0v zg_fWV&{WXOz|a6H+4>nE7bAiWuLDhTgAT6)`FlAu|AD*@Nev(tBsG9oT;L-MK`d?t z&;f@a79{3fIl4U}5Sa=br;sy!&VbS{Xa-A$nl_{0@3J^20B6w z{Tu?29#Eu#Xibo7KpG*{6(qty!Ac;?PzysdoP{HDl)?%}(4i+_D?o7!icqA&5tMhK zr7i;~olaaHo5;XEaJH$baay4k=X)!P~fXoB&g&7zaG@+3NT4@f6 zED#G4Ss)e{!vqEf2GEWnZU)c+1t1m|185Bts9NJ@Si-;nuHd-9nGU3bn*nry0Eh*- zzz4*FT;Ky@aWOb2=H!5O_xgqU_&~P!Dx{U>C4)D{f`$@P6Lm)rsU-?Y z`6U?&MX8A?@t{zOPs>wC%u9i2g^Oh7DU@WSDikN?rYb;Y2}+An8ECgF71UD&g*gI4 z`;_25DkwEUcBCNWK`i9{DX0=)W&|}8K<#KJ^OQN5tLj1hGG<0lGXul|nSg6oDyV`7 z*_zk|I!6#>BGf(LJ}#)g$jk`pm4bSrAaii-N`+MerdkD#nC=1ThU`iOnFulm*RE7h zfdca3_BkwAc29x&hp4;4aP3M3rEO5JGuhkzJEnU;DI2m&4P+w7J&;|g@oA8{5+nj$ zDVPS%$`Aqg+FXzeK|+Xi|DXy3Bm&U|Vu7j;5RDK4HReDfi1qrQoiQL0(2fF-YZ(|o zYokCSi2Vbg)f^xZ4zTSiK7Qa9ETkfWu5tq}WrKCI-;q-r$)DlnM|m0-a6)4M3JB7UjX`YhaxOaFl_wIAq2ICJu>Q zuo37=AX3m-3MXF&4|n$fXHU?qLn3G}5;U|5DtO?7Nhdb&F}C+68(l-QdVrvbU})oD zV0Z=1HlUgVJbnh*0SYd|Kw3fLY-+Hi0TO_X$DxhufVR=JVW@L(KrZh<+Ch7b+dzp4 z#DQXL<4JcwM^p(gFsOhQWil{;cM^felRz{3P<^Z|`9%$_G zk1zwn1ZegKIRTq_pfhdMKt(dha45!RUJD}w!whi-1{vtaAyDaz%{kFa&{GF)+*q zH8Jp*2Wt78g{r}49%%jcJ!J-lYtW`8F8_jd6LY9CFqnh-iwuzZ30r)C&Y^TvWngFp z^)>Oh4^(1qhpGXo17U3DfzAp)uExNy8q^5GV;<;e$-C+d3~8Wd8}!;7Z01d1WMJsi zU|^7gF2Td)UywHgplU#F17U3Df%aFIYB4a>f|~4j+y~0G>!E5uW`Qs^^FS@iL)r`s z>!71MxZDQ{zXwn?AhSRimw6v_7#Qw=Hb>%dAEl9`iuO)C;H@ zeCC1TgVBhA;Vr1yiN`!p{K|t08JJ->!VlEKH8N&kkOFNNz+)b07q^cI14AcN9jL8^ zEq)sq85ri8Ffho1TT4jw2U@)aYF_z6)xeyHZJq&i8bUh}>OgxaHegXV{N^J-m)m$z zJRbpGnn3Z41ZXG?v_C+Gfk*HzXxjuhD)aMFlL`tz3rkB9lX6lSP-RQX^HF4FQS_$e zmlmN&qs@5)T1JJ(2(RCt_OkE(K|xVL1_n@z9Aqu1#e{3lLlBf)u?*zrr9;ADIL>+) zqt1GOCR)gucu`O>GN6%33MxhrM_MT8LZ)V@=12^q;nP5dMlj15AO{A62HrsPKpJuk z;4u}@1THtj3I+xS5Q~ce)N%$j*15sgbc0x244@0OK#gv0@Hvbi78m#kV_ME3F*GQZPH3#icp)((;)cbJiXSX3E=N?Bq&yLs5^}|4OUW0W9-lKh zYjWPm%!#>Uv!~_{QIXgX1YOc(D zDLFIprsdAcpRBE}M^%@mJ{6rBdewAm=~v!f-?O@FbKlC&jlFBTxAre{v-4r)#mSF_ zCkJ0P-dy~dyW9J;_Ui1{(zBy)Tko#^&ED>QTzz@^bMfin*Uh(=f9LP_Kd-+&|GoVD z`1|(z>;E%2G#n5Jm~cTMVZj4~f(;*7Tw0EZgiN`jlCtE9Ny(Nk93CAfBqCDhTwGIHik&CHcAEh~5a9TEzfbV(^`(Icax zO`q7@+K!2ZO}nO+w(OZ%*|u+7UR|f8qGsLF%3Afxs%qCSKEJ+ma&hzS>E*3^XIHoH zAG34wVd3D(mz9$jKQ=Dj{F&Xo{kVAe^y}*B%b%NCq=2g;iA5 z)HO7(9S)NN8Ai zL}XNS%viDG#Elm}I3+bLJtH$KJ7=!kdGhAVpIlN}R$ftARb8`I?K*Yq)h}*oZENr7 z?CS2>t9PHi{rWeLjE;>@OioSDoHcvS+TbhSs@z@5(|U=&WeNiW1Na8cF1{`|rVh3aKc?O?X0Or@aj}PO*h(wF%1R2m|0Bz@ zK;#>K3Y3Q1FqLYyUMlhLF6D9K-{!{L<@dkC?LYrEH0|U6U1hGNZf-b!Ru|bzwgWQwA1Q`JbU1AMtpC&UgG=SRWpi8bn z?S0Ut)}SVJ4in@W&0HqPl^%J}qr#UmLGJ!3Vq$0jopw{s1i8t#k_mFfM->y~ijQh0 zh6d1%JCJ(NZn#D!$i-*PObiX6eN!Dw3=N=Bxo#$ghB^iYhCU{S22g*kpNRo{F&ao8 z=z7h`ObiX6Gi+xtF*JbA4w=ow&;YtVW*+ni^7%{*4WKXvsRsoO$V|wzCy2!jp7sQ> zxEMfpE`nIx44|3=!~##d1b4@BfKDRb1sXNx-{!{IeIlHH`)<$~N0%RUy7E~6;_v;< zz`&3Ox)caB_rSl+kDGrzAL!uV-JpAsyWLp6-}GvJ$j*Gc`4>BX`#I1($0{JVGgu$z zZv)+Z(8$IG9CkFEx(0(r4}Gf0+yo51B)-KUx#GFzYH z_y5>^>flQzWDX0AbMO_L^)-I~PY|O{#CL+V$3@2;wmx3wgJu{%*sz1ISdg?lLe(PK zJsDy@hxI9b|BD{h$ICx=f`!1Y1Wkm15)w`fYJ-BNblJcMkXL~Bnu87?2jvbn@EOpc ze8mPn0~$0h#RfiQ7a|4vOMGhKu`*Uv{*pbQ8=OHd61hx zdO`F9Q04;}zyQnh*q7|1mjVzQz#1Ev7^f_9%N!@0PP$-%*4wn%dL9QnNU2_1stOs<>0VrpKt~mgWWqfC1XaJoi1kwk- zO@|3`MK2>WLj&lTe2_ROyg(C`kn^KKEXYJYh{XlIt_qYFxEVm#cY;`4;EP2-xq=&f zg%ya!#URJXzyJyfZU)drB_I|T_~?F6sBklYZX5@(xWK1SgYp7511NuhSX>OCQCN^| z+zcIz3=AL^xIF82<>>O@XgOIb(jCCk?aR}8sU-57V6P{mSLu(~!wo-KO1&B?I5|q? z;L=uJ7hgF+ZU6@4<8|;AlcUqO!2ck1EMBEwu`m1p zjU$871uXA@@+PS60p&|jZxzHxza9jn2c!nH)AS)m-hu3MBrpjLO2!~7QIaw2G<@VL z6BO5=1uq~sf-uN#5Dgl?1>I8zVzV(q7EtjpGBkkZ*#sCNi$8=IA=gcdFfufN#*0K5 z85%%&!JLty0W|b0#mLYA8iE5|j0qYZQeb3g01b)AfG)~p0AD`S06N(YbYUiF78|4w zbdsAUBSQn|6fs>!h6d2m1bs$^2GD8_ZAONMR0iF#*7RNps)hz z2c<>O)!ppi1zjK(WCk0=;$i^#2*l!M0M(Nq7C4=NuAu62Z(Cj zns9>)f6z!8$Z3cI9J$d2nj8QHG$_VEG$>Jk5(o@~j;;fV!{pH$U7$vTDOv#xG83d9 zbj;j6j6?+AX^URwg0z6Ff-LkRIvGJ4UZ9K&)yx30AH)Xv8q~-Ev5zw{G=MBP#mLYA zntnXb$j|^vXcrkFcd}f9CY&pbkeg($LKDz+MurAZL+l14Lj!1L^e!|3-D6~E0Qv6$ zBSQno9#GqR4>37dUn}}@%$=L# zwMD~E0shv13=9k~Jxm}yEWOT5*4K)~__uL&aPV*QV(jo>Y(B)&e1OUNTG6Xx?%V3KD zSUNmd__uknc6hKhAL3{}z-E1|=-e@PZi9w;4z^?NT+F2`$J{xXv=77F4T@(_=K}d2 zLeQiYC>?;}3Pgj_IcOmPNG%A1Cci-9FnLfzg%zox0y>xxSsv6-VT3kRK<0ohzC@Ns zZ>WH7)v`j%Cm=V0^n&iidW4Zric5+z3*wVA67%v>b1=$Wm^(?xET9|(nwtQ%xf4s` zAxHIt+83aL7*u(I+z-MacY$cooCD|(RuKC=H2-{LWM}}n`4c0g1M?SJ@cw6HXaLOv zF)~5cV=*y7@(nYz1H;0^&;T0fW@m!j%*?^W&;VNF#RcuK@G?OzFXe}JSOl0D8bF72 z2r@w~lMsS-SVWj01+FL)Lj!06TAYcYp$jyi&&1FG3gb{F$en~?ObiXn7#J8-p^X%E zXd^|FiJ@UH=&}lEheex-p#juM)L~+1098i%ObiX6r2_^`3=MA?7#NJ07#cu_9GWsQ zG=Lf<=1dF?ploKr#Lxgbz1Wh8p#gO3IOuv7P$R{LiJ<}1P_qYh=olFoK-aZ^?(cDA zVrXz;WMBYY+v3K^z~Bq&urV?)_%SgwfDV8Lxf_%YK<);`EvQm~G-^OBNTUYC;sQ6^ zK`d@?!yUu|mnYr691WG60;Q_mt~_D<+X}h(*BiEeD-neZ00?w>Fm`Zs1TgkGF!_N8 z06>Wzlu3{)1K1=9tgr`V5>RUZq!yHNKs75UF~H=}D+5p~$q+4(gUke(0jh@XVkYwP z!~%@84YCeo4GC!*l#C%20ch+Ss+j>~H;4^Nu(0I>_RtoE6SUxVVT3Fzb%VAjJQx`o zKt1pPM#v>yfzX5<#0a@{Hw>x|beEVJ{kRC3G1&JW=s&|gA2GA9e zv4=NsU~jd7DkYGcVS#`g2cT9PsCDXy7RDewpfColPgH|V0zi5^piTS9rA0-lc_r}$ ziN(e7d8N5YsYMuJ4zd!8k=A~eI-@OmhlDYx#ROH%0J0mz2Cd$JEs_RZ=mm0*H|WAK z1_lNnW=I(OF*7uP7E|~#LzeD>_@KlN>Wx5JO&}Je)dXTeT1_Apq}2psA%|sm1L(}* z*u%{y{$meJP&W|dI9!1VYBe~Z1tv%j$nl_k1FEz~BT8NM~q3f^JX)1*9wJCN~BK1`r<`xQf~<1}u^=T0h=mBq zQl{9$-3~d}gAms7B_#+!dO$%4TH&IC8H8x(Sb$a$qqhY?0RhE$k|QVxL1)ZCRf6{s zf!Ls#dFbRU_)-cfWwl1nCE@EtrH_?1GlSC8nf656nRi zd5|WMWst%b+dapi1;QYwfcm=7Q+AMVIfe+u=j10N4~!zGbdcLXRv@SJv(SAN7ohtp zE;B$ncvl%18bE!WYtVJx*P%;=L7g#3@e5*cg9jKvEH3bBZV-zbyb=b)0!J5Q(-BLv zM-3zPgbu3UK(2xX04Nqf2?xXn6}+IOljxNjNDoL2s7J97GnBE7FN3UrVx*LfJPrh@ z%NRh38`NTgDh6M02V#TV1M1p>*kaHH){@ZG@iGjM-i<6Ylt4qjkn#Y;f+T7Xi;DrY zs1n5D2JbWiu^^%3%h7tWr1raG2}1(|LkVwMw<}LtXCtU}{Mw3tTcbZC14Hu*h7!5v z7fdArpq?;8AUNfNH#!_^1T|$?UJEqr1a0o*C{lxnFg1GCfXr*I6<{poZ1k)E-6$7( zxG}M!{{R2~&@D?y=74(aP2kQeC;&j0)QT{G+7|U-F_3167$_(}Z5U7j0R;yLgGR4G zG$@6FX!K~D#=yXUzV;rZ2NaE)G?f9;ewobxX|HT$U}ylX2syz3xnvZyQ38}1 z=QBVq8(qY}&;VMV4ca&XIu-FC17ybFFau7~&P*3G9SqzYgpgd@F<}xrefZPk>gMt?{=mZH~ z5DOB#AQq&W0~6o`csyzGr0H4F?K4A=ux800$W$~+JgJupFo7U-Q{5z^KKl>i_&fiTEU5DkiSSP}RZ8jv5LMc`-X-jXlSA`mp|1qm<^3ld-; z78e6(V|eVj%?>sG?B79$KJ6ALa@WjUHN{7QZE0qY|VC6k4E)VlmFp0v{kp zZeS5rVf=!I)?a97F+hjI7@@ry&IZ&Ahat{cD z>;uur4HRQ&$eBSy&Jvn&t)UqgwBZxvKG3a~po|KdX@P_!hy@8r5Q__3;euF@t-T-? zQb-EGLK2c=8FA!T&|ERdg}6cyRAQT;t(Gxit>D^AqF-(56jL?d1y%ML!0}Fswf`*MeFWkkA9MAfX3hK|&A2f`lH31qnUy zhE0iXU!G>K8jfzp&Zeb|3=Cb4EFDcN85wYdBCOp28_z&bi=aDY(Pv0NdO$t^EeKzP z8H$ioBS}w*BG5g`ipC5KB}JvFkW&vK0gI8dL2dwrEGYJ2h;dY5{%f!g+OLQF`n8NQf(k7M37w|eaHzBv?UQ_zdAHKgSI4s zsuyi&cGiIg8|Z*uNU(uekYEF`AT4MR3(|rHu^%Y-A{fh+3 z?JNtl00Zd(IT%#mF2EjOIC^v-8=x3Zuz_+fp}O`yG>tui2HI0-UHc3gSfEpyA%O*A zK>`cJg5+8d3zBO=EJ$F1yBmhE?uOVm#|j6`ZUtx;wqs70t3ZciL6@sYhht&vVNf9k znxqD8e`8?4-5mfe)&_YVQ~`r%^q{^AzM$A06sjO;Fb3%X1vO~$Tp3iRgGIp$2teHd zwBZZT@wa4@nX=Ff586tNW+G@nL>{`W8Z=msCY_R6P?Eu*1l?VYMFDiqpcuLTjXW$0 z@*l`c$it$d(2*ty=tz?+Gh|{_ff+KcuffdF02+r-WoBpq_21Q)A@gDC%#cL}AbC)= z2byn#Bmoc$k_133E(Xw24-ku+0km8P#Nq-Ur~wL6NDm8iJul=8EXZ}rIr-%ZNtq=I zU=JbRAL?#(SIEkV-Vfct9@b0_nfFf(5A|M@K6c^)P$$QK>ZzNMo_m7l+xDbuv=l81FCwN z89`g)K!b%KbJ#J=0qJID1a(3{@-O*5Yhs!Ms`8i_L5ne9?%~8R2Q(kf%m|tt28Hj2 zlmA;W%>kuhW|XTCxiQQE1vE1wY?kb@!lmb!=71Xd%#5Hda4`4qVweN+F*74W=7aRe4E4ai6vG@)+klx7RN8>X0b1N< z`(T;_+A7Y>2wIKkWFshi>{5^Y#WV-B zCy|*Ev^5Q8jyi@ppn4B+MJV6l;~tpifc7JzhL0wOIiNj;i1<1dtNs+z98hx}^{@qP z40AwZ`pk@=S{$^OhsQMJ7N$9%xqD_t&=xe9zjVRofIxhKqnkvOyxCljlI8$G}huDqI*C z7KqBD77K}jak3el*xQHQWfE=`x5-tK-+r|J|e*hN&S1W3a zpyTyG2Rk4i(Eut@nHgcJpmRqW(y<92p)LfeK|O2%2-{fFygQUEl5x@ zfYhMs0!{lfGlB-7LAuPR&g4hvN`mSFsbON6#l*l6kG@|n9({{kJjSj#@Cgi{MkHvq z1$%2h-1*9=VQ2dI(T@wIr%%gK+dHF#Q`KvAO{#jdj!za zd2{mNC(}B6Ie0p|IXb)eK#tW#(g;4s7O6`BI-(h_&n3XY$0Ti;J!@(2t z(o^kC6Vt$_O`~=Z92mIt4b6{Fb36w`*m<#h{S`j`5hHq%&pp~v!80s)j%mCf*ydO;+ zwjIx)Tj7~h85pL4YG-g!$iRT@L<-QEoF~*67}P*DG_<>d%{sevp568!|9l2GtjM+y`oGvVtoNm}v}H%>ylLQ#NK`Fa|jQk9pr17#LDb7#N~K zbr}QXTvu%VUBk%0z-q?8un~H-7OwaZVq{==Y|g;&6p5KJxiB#> z?6qfLU<55a$73F-<6{g}192ht_yFzv@N!~c@B?K~Jm!Ilj0UJ0eCC1Tcd9c3!&2xh zC9e1YnRgwkhLCx0To@SsK--tN%meK()^lTExCTAKiW5iv1>JmZ;LgAx0lJtSPk8{! zW<{P13=5#@K;3<8@e4X3WS=Jk!!gj(e>~v_GVg~M1A`iLH9V-@g3Ub80!}M$28L;% zm92Qp1Nrxa4+BF1=yFT&ng;Cg3u;oX@nv900j)I0W1b!(1H&|b28JWhS!dAT12*>s zfbQ)KWMEhT9>PI7kpk^RBT#4f5>ySo_~l__V0aVE!0-b+XocInMT`s#TA>UKXQ1aI zfCgExxle?dfx#u5fgu945COa%3w!+mDt_ic)!=g0&=w9n;b+Ihz~B3{O`C@aQ2QvdhMmz(<2G9UDxXXaseMX=OWtih|q-Rj~BrTbNVG(FC1RnQ+ z%I7OkH83NwxzB`=f#FjM1A`i9HUf`%pdF(TX$%bWq3S@*5^UxbFfuT#Ok-e>1WmKy zF%OhKyrF9FxlaVN&nkm~p%*mCgvUJ4g6#d73=EB+nImXDh|PUB7#SGeXE87w2aP7< zF%PtB?Pm@H!)(yxG9L3DFfuT3<}on5g!XlDl~3vT${84PKnrj1_!kr(^C}q_&Op`SDz8AD z;Rlrr3>KiRYZ$s38NoR})A1vVxI;p`?d_L8cGCdGer*2z?9;x&07zAb(&BKLaKPhU5JV z4Bsb0)Zua;sJzmIjRirJVr@@qFfuT>Phw!mpA1n1HxI3!0;(?-Le)T2g34X&H#V## zLLF!TeT8dxtRLLF$}yoU&Npuy^uM5qG|G@m9y9cWeWtBGiEiv2O9jFPJ}v8yd5J#9jJf)kO+04e$QVb z)PW|&L_iC95y8xWEu2AOjLO7l}{@ zYPWwULLDeR1g9ef9**(=G;E+tggTHv;)zfPN-rfur~{?vej?O?`T>iGPzSEhiBJcc zOk@P@B18%rZ0QPA4oMQB4m3e$Mua+0`U@pO9mpT`M5qG|N39}49VmZXCqf-)SmQep z>Okqm473}CK=^^wWnfV^{7xtYjSNwKV^VQy3B~6VqTiU*bNRN8=((GZ9*REbQ@hQ2 zfVdlzG(b%RtfvQp+&Fr6AmpAVESEOHPvJ9xp1B75auOy@{DEpT++$Sn z2gGb@BtTS?;I5=bh!8Lup4N@1nBk#C2i$C!Kd76GAU=bcO-WILY7*SpR7@l=S7MqC zk8DFTXs}V@6G#yOvyFNtQ8(sLU5RNnb;AS_yRd8uHyaj6m{CGWut6*{f*DRlqu>rV zh99*{K^ctZPE5n$!D38}bP2J}gnGdOHwx}@Q)&bYw8cUVccK{u4^Jw(lX}jCnFMzw zRmwg{5a2c&k@KmM#vry)(cy5TXzET(!{L#DsFOj527s2ggHF^|l!Gj^r{$^GN#5=* z49Olrz6|M(zK#qTp1~muna<7u44EMjB@Fp)Zp91*&W=6|1s;*b48=~KAq>SJZgGH5 z2t#p*YY;E@iEBg&Ly4!aD?=4X8)PFG=ww#oOX1zM0s9QBY-8o`&eA;;Vxg14i6|Bv>F1mOCNax6Sf!uG?E7zECB89 z2X!q$YC%gFK{HMuahN>lno-CBcA$lt3=FWvFEDxVO}^0MxIp1Pn}LDBn86LU1|4J+ z1ISL09gYkP3}T=u3a}_6XuV&4UTS=DMrmF)#zr1c1cKEuFf=eRfG*1eiGYqV%*iY+ zVGw}s;sKq7k(^(eSHb`~=@8^9(0zJ|DJftrpmA5w6kv90Y5`ArmX)v>X;z$R0@$A2hzycBn`5hz z4~=~W@JSJ%89R_#kUv4A@}RHQOus}}Bc@18T0ZOqT7B~2~6%Y%uvk$bf2(q&e#NuK& z2s(QiJkNd<%Hm=GtyKc);AQ}=x&g7EX^NxuWGRdBf!M>{t~|{TSUVd*v)tG>nu5ly zK|Y4XB&gH?#S$poLAf3@&1s9aZxW;jqy{uLE{cdr&>GKz)S}$XlK9-b^!T*Y#FEmY z)MAYM53&x5acrIxM=AnPi~>g*c<(Oq-g1z8Kn8*~P(hcUF}#Jw+6NZMHPIiTq5h2p za-7R&7D&zq@j+?hGB`FsXBB~1kWF?V78e8P=sFOKo8bxr0|ST!4&~-r4hH^~GoCVWbbyB=x~?lcGU>(j+NiBK#7lO^3WNp!FXiYgXXyx+>hPBV9|6OMm-v=1+u<%}!@sc~MXjV*rIcq|8ucWMDww(hPDF$QaPM63nP6 z4YV}b)59eQBY8ng1la_tUSOv!VJi=mY#G428NrwCf~p-*B?GE<$}>|+G8jNd&48*I zkVr;qW_m^m187S*DDQ(xlBCR%cPP zfX5qXW)oE3fW$#ZJ%Pdvbi@;=9=HiT0_83PFh6d2~-Zu;k4WNY}?-&>wKxyVZ^n{v^3=9pRF7(gs=?gG_^t>5@tK#2~P zzd*Aa!QHVUjlV%fVtGaD?K&RN>8JcHpfx3}w@W#{wSfvc#*(ruh78c*PT`QMFavar zA%xj{M55D`qq7aPOsw^Gop3Ktbm0F|0mx;<-L4$XM|c|h!C6m$fuY%-gCnhT9%#v1 zT4%gSbf>#Od|d3|hI&b6NEKZo0an_4gd-Xx0TBcXfr&GqHH)CVIU)?<3=9nGz|}1% zRzW*&M8Ma<_<<{9&_P6?DpZ64bR{2y$3qc6Rm;( zxd~)Hh-SjfwgEmNt^~3zT1Ah19z3X`H!?)4`Hc+VH9zucQLvgHC8vXm1dz|qsxvSY zB<7@+l%z6%@*F6ygJLJIG&de54#{(%W&&*26(}q~{sPgUwlHiB1L$;Cke}I@7#cv6 zvYbqiUEb25Q%V^a7(l0`g4UAiL63|ForVfJ^2HE(O$6vPRM6#Hpwm$2f)3GRVrT%} zuFlQG&;ZI>JWP=5AwZ|Nf{I1ZX{n%ttz?-P8bG_fK=Poh24X|98i)nSY9JOD11Qyj z&RgXM7a<@P7X#=_-tXXM1!(UVh{eSKTCxmU{>9AzT3iTXaWQ~)y@5>O1|QB2Vu7tI z8G6(M=)ix-K7SAk(gXpqAjf=xSde4BKrCqJ^DuO~a+Gj3dQ>nl6fnddZcM27|Gyu{ z$(^u_h^wgwT1jV(mXkqxK;aB331(vn=hVE+^t^cReZS;1^gvk=6z!mFmza~2U!DpL zSWu2bZsLL50SZ^-CY}=;q%-Hu#?S!j;QF#bj%^EKV`u;^p9o}wocjghgDe4^@dycD z5DOB%AQl(+kQNY&o8b%t0|ST!4&P7w0TZ~z$2%DM@|8coCF>@0UUB5VfZlWF|;2=(-_JSTaPEG~mG@^pXZ-AIKg^rxldQL3xf~Ndr;{ zDrrC?3gsD@C8_Zh;93pT;zWp5f=5U|4NH(%QEEzj1y}^sWQ2)Sg7ty6j)Fwei&9hb zpk{$ueF(8ia3dE~fPuu4a!Nr~g4(^H5QGa=LJK=^X$LYC>Nf^Z*nrre5(3nm1+hV= z?t%D43=9pRFe`?ZZlJmfa=Ivp1?ldBSX>OC^Uy&oZg4FFV!?A?0G{0E0ZP6&a^En^ znL5y%DGkmcs5ujoyHIl`BzJ)ZdmuRplrtfE$;+7#y{I`8VlN_Rf=+ga*!vrvTS3DT zyTN4$C`W)=uE@C+q#BfBK&>JWjh|}PmudSc9EE4VVy=$RsrS22yjk>r?@@52B43xD%CPBm^ z!D6WSH3~DoMu3G-@@phm2o!7})4;hp3YvvM^(x33s9zaC;RRxYax5$d!;V93W`LZ# z-vZ6SpuPzt2ZLCU91LP{F@VnI0I|3kK-*P8EN~8Pexm`p*o?vWXs7ER(0DiKZjRRf zB?+zHN@BWQ1v*`Cbi0aly58w_mFRSR(CsSI>H4JGRiV@MMYpR;r|X+;SB*~B58bXh zovvTHT@5;2e`GQBy50!rb<+q42Y0cWj|j9LC}B-&_A3$yg9&kT`~HbHJ{t#C(fu^` zFsOAf3!HaAyNo~=T#10M6#}JR5e86i3Y2;gbqZ*p1QaSD4B8I>iY(AVRS+MPNKPy|3TemWO)Yg`9C081_qEiP#Ygv-Wxn@0;&%n!ycdwxi)C6E|8rdy`Zi)2kulH zpO#sXngUMCAR9og17V2SAQnR-69X56mEfQM|No0IFo6>kNS0tt1RCc6)kL6nS!P~I zJSZhcfJZ-Iog|oOBv=%b;*r%xfjd;7Mk7oVlBOfT;-K7sDjo?I2PHsM@hI@v3dnOX zad2vm01Ja+1VuO!EDTECD8f#)n>fN5AkzY%0|P-NT_p5C z;3x*j5O6dDLj!2PUK|5M18Cn=JOe`mDE%Zthgp)KISo{1LZ%TwEXXthh{eV5g^_^) z#NuZ70cAmRnhMsO7S;N#Bn+Ip?tpXG190wo0?u78z`5%UICp&j=f*GK+z8HNcPPkX zpq+uBiwH%)?LbH#1KnwaJCA{ubb=xu6w#n?N6%xR=^JEu&?YMu=+Gl5pMXvzN0wg< z+I&=3Cu*$L7M8t!7pk;f4E3uHRTWgra7K_Href$aPRYw3Z~DRN5> zmb)Ngkd_`SZ-Me4q@@STS0E8cOAnT#Ah`_EY6LkMWIjX;($WJ3Fh~rXiz>j?1S}VU zg(?|%8Mp=S{Qv)duLT1`1+3u*$}6C;38=3bKw$@BgNB7cWfX`FI^7ZER6}T9F@fe4 zQ)pfR9r6mwE9TI=Vgb!7phI6ldBqBvS3rlqf~qb%=waFR43KLz9ic;$PS898>IFdZ z2#5vABOn$R!yZNk1`vyz0knA?!~*A$ZdVTDla{_b{PPcbc6NY{x57Rg0opME@(?VV zL5UGmJ%WmKP+|gY)N(~Dut9o2YCs7}4ohOnNKMX;Ps=X?9q^HulbI5qnU|7U0WP^g zR$;+NBNWI3TA+jj>dS&65v9WnIieF(_Q4DTxe3GuxeJsQK9wGcYj7U<=C9yzKbo#N>?B_}oNtf)I2JBq#_$!}{QJU%<1}NJfHc2S{*&8ebsy zgD}WlAR3emKzRnl)`teC0UKnJ$q+gMVFV4>}yXs!;#f&?pw1qoIV3lgj#7C2Zzy~x&YCHAnHgjP_|{r~^}|Mlgy-yyT^C0w2R z7J!aRii1LH04gOnFfcHnmy#emLFR*KNi1m)X(BACG%YQ)D84weDix!YggFV)S3{dAFh-jg zFf<2Owje#ojIOvFq@2rs30KZrn8bAlh z{$^!p03C0@#m3M8>N4=KF*Ja-hV!yPZjc4(10~!4tdPsuSlJjFKoia&anP*aJyu9b z4!S`aQZ0g5kZKXc;$i@Gdq6S6%>Y^p0%CE22XsIO{&9ncazHFD2GGsMARXM`n~gy% za2^5;ctUO`fenQIFXaIDumb*<^1#^5M`U6TgF4`#`(N1@pmUE5BH#-fK$pZJQX{NR z0);AQ{uo4q`Wzq{z0L)tM)WBFkRDKp1}cnsFjEtF!4~?!9LQ`aMyg;5c86e70HE%4 zT4qjae0pMTZX%8@HOO5cJ3wxO`EeF>3SbVjF*Fz2hyfKBkRfRh3sRDSSdfwo#DbJ$ zAQm_lpe30Cq$Dd5|6eN5>#hMUaiG(k%|}E)Wecd42%4M|VNhmZ01u%e!XCMU3v(|h zJAm8`3VTp4g<(*t28qMu(Mtl*>LO%$^pXISI?)^7AUi?kgW`@Gd)y&)Zb7EQFeoEK z+2q6^sPIIKK~RkZ8Uclx$^dd3h>bjj1G)(Y&i1{6M^6b{LK zAQmL|fmo3BUmzAY_|Rq$3ml)25fT0tPyz>ykbvgAL8qbeZ+8<(Ydug>v=cPfoo0Qo zJR^%Civv2ukpUWHfQ)u@UjR*MPXoqMISKpB<8_+;z< zI*H)!SOLiTv9xX$@3c-9FGuV1HJ_uK{Wu&z8o+fDiV>jI8<1&iP&k3^rxsxV9Zv%~ zbefF;bZ87HO^7gnwu6FJaj-FfY9WXiDAYg$f3Pk!C}d&fDk#K2eDo9tI$H!J4wFY- zX#y%CVB48t@}H1~R6zIWz*@dAd0$XgM4GY&b^Fmv6OfxgZUrqk_=`Ew1z!1yUYfwn zhg3wMra35e5-d$Xbq~lJSA`fDGC(UHVRa937YpPbP#7S0v6ezF^jgILnPOhY09mED zje()Tl7RtqA2Rp?-F?vehYm16>Xg$Akeil4_Y8qrHlTZjKn;@lC2i1jb91c(1AhxBO*GevFqH6t(_1hofig57;o#rqE*bE@RHD~i7Ovj;*bBOG7!7EKQtc^Y5i6z-|fl)wH`&Q09>og|56D^TQ7?t zOCTJo-BqR;yn;la)4c|~qC}?Ap98cSrPIBnv%CVT8x&ulo4wc=Ks$k-fd|P!E!xLm z7HGg8GH^19fq?;%<3IyE;o#ODXxa?4x<&*%6a<>q7XjZm0Z|9)qk&pqBH%lrqQE*H zF))Dd<`H24P5VQ1fTsB%xf+!2LGgi{M?r(@AaPKa9+VD2c@$J4g2X_yDkG#d2$N?7 z&CEiFWI)5Bpou$>T9~{ySRRx=7#Kj=iyKY;<_Qgdrw^SR}0mgXK}s5!ZQ%xv31G6Er>_R4n29RGXpqKqt zLofTSVPa?i9qHD_1i3}Mg9);Ns~dWW?_?&12GCIE6eflSP|Z7yiJ<|sbY%t;Ljx$b zH#0FbfF@h#GBGrOR$I+yVrV$az`(GOiJ<{B;kuZKq2V?I1H)1#h6d1ND@Z-4UAT&g zq2Uh$1H&37h6d2Y%sM891};VhhK)=N4N{B@44ar38bI*^QV$CA@A|8W0OIQUhW^!u1UY zw9yy~y2KALHAdu^inOx=*zJFVSeI zWML=~vc6ct)y>$+1iHb_(fXgi zwc`K(|HikC54`5>j{ReN;5A!!?4NGXLPAjJKmyD9Fn`O}fB*lt9zZrAzH=VPQ;^_6 z4HR&gfXVq%6M!-De=e z02=Csl>VS~{ty;uJfIzH3TP|=VhSkDp_lofGX+5<=#YVaJ|> z)Pej4qCum!J>V$|1_nu1$YLg0R>(Sa1?UbHbympTQ<|)haRwb$h6d0XCkCvLsVGlY zh6d1rGcQ(1TQHUtGUb%S3b_P6g%vW4zJV2T*}Fe0WQA`CbUXnh4r&wTvNAM)+JXhF zkhWkED?Qc}+3L^u< za#n_hG|(A~tPBmHsnyl23=Nhyqf1gK95a|_7*AU3Gw17joKuL!abbiX2Ka)6l;GQ!3Jy=M_L1PiGdK`cnk2x4)8 zZ*l;!xWPMSKrC=91;RStpm+=Jj^zRMTtMe!f)}##w}3hs&9y2F{4Jp3wmVdz^->*o zx331M8Ut;H>pl_ITgceELuOnlpD+ho3Nk#^S#$TZ9z~8=!k%7VZ zTkEAdhu6%#o($ct8r>orS}*ap^f59pbb~rAovwdiruhB|41#rES`YBIWHB-@xLKDf z)SLiyO5mOI&Suc&l-2{#&JA2VE;=4m8~-omKw8@_((S9#*$kS`0Zj-ugBqaSt}-3X zpdBIIt_saZcsiOvBZKI@sX|8Rr~|07ZU)sfI4unOU#bG>O?A5}^qRDSk}6!YNM|!> zRv5SDECz^P<8RGJcq~g5>byXK#IvC{kg@weEM!jgMluFNJPK;g9O3Bh1ew~&va$6* ziD9>|M(}@=jSzF(nvd{+!fa=EEKj312dHz>*bNF*P#+i?MBo}3VjO6^1QKpYg4mg7 zKx6B#z;!UF?+a?vh=BJAfyPeR7(nw5kkJoN3mQ^GgUU3BI#6k546cpcL1$}&O#ziC z5Oq0>u>M{hBLjmOSRLpJCWv{U8u&d}$9}lF`-}|WrQIS7983%hmS7!xObiSV9kNUe z47y-3WhMp&$b5hX69WUNtNSeMt}(ynhH}gaQKt14tmR zAh9Shw-~(63>0c0V?o7iF?f0(Gtq#v|V2Bbffk%7URk)a_Tbml4}LqjDa1495K zLqjbi0|Q7MsDuTno5aWfs>K^-GcqtlGBPxPt}~5hWM}{_7>H+NXt>14zyNahHAV)8 z3`T~AH&Fh2Mh1p#MuvuOj0_Apj0_FTObiSl^Vpdf7?K$o8bD{@g7`8_3=A5K3=Qf` z3=E2(+KGvQK@M6wf%b1gwq<}=kah)#1=*GX%4Lvk86Xy9TLx(HEH?valm^6tY|8+J z3}jmdh{Xl61zd-6Gl1Gop#CKn1L(wMkjdN(PZ$}%`$oaF9k_puv{j?glLJ%^b~b|Q zLvWh}w9g3KCON@?YeFAZCxenID3zeMNkB{g@U=<)V9A}Jt@EJV2{I20CZ$aRTaF1z zm_@0@(1p<;$HGMLwniY6{)E~ipFk;qfq~&GBczA^gAuar;5R7785kJ;Kw})#l7O^F zKrBdm1jOQE0F9%7Slr;235W%bp>FV+3L#J*x)F3NFnDo=4$f5out5x1NroO5pxo$y zHVOjL18N_F3KMY<2OQw=-W2%yMx?p>v^*jQM36gEply#JH^Fb=1owu(dn`d0bb?Ag zNht;fEOvnlCvbX3jsuu8K_xsa{cUH3Z2j293R!rumlYBR`&c1cKK4UrLqW5)kT?Lb zAaMXT?mU0 zch z3lipUbU@P?kd@(|_yv4LKx35r;Rn+A^$&t3j*8^KEpPY$Vtib;?;qo{pw>GBsB4qP zukR{DNKqDR^Bay{*DIg+1$k7mgrK8(poI)F%||49U0;9|fH!r)WqVy;1oXOI3HVF4kQy&x(AQ9+JeNei8@&Et-iVy~dVyGBs zW78Fw7(^$i$^qpBF}{sg%hR2sv=d^@zV-^~bF0ltTkp#gM3;5kNy2GHu&eT6j1%grtC>B9E1JsoQsRfCF7EvL~ zujK^Qt{_XqZnEK2PeoBNIC|U=b&yn`f?VKoglrSyB_$k=M1FfEFjZCW`Z!p zTo8-wwd6SS2dHxhN#&q~4{{$!1ezB}$RChqF>($8`4{A7`oI`@4YY;%Qna#C44E!yiImT{Rf#x5KC7jJanD|>k z10CJIBA|ghBSr>>u;_9+{uaW?{?+s_7!jo3-0Iu^#{Pl zcb@CTXB+4|pwEP%%A*%&~x1dw6?l%YY{NCZ6V15pQ>BY@0S zfwrVUbSS~c$3V9*L39K$GBAL~1K1cqn?OJTDZ&s787E+11NFwCV_cx|4bWH-8$%vw zb{brmfHFC#xIkX#0J?Vw6fU5m0Yrm}3y?Y(1{G2uahQA)NCG;Z1*!l*sRUX63|JnL ztwCE$K)yznR|mDPpi@$y;slhGOwf91AUA=G0ntA(d(5CC=Hf9M?4Zm7vI(*p33Wuv z&lq>QU(JjR4WR0xoe?rm)y2rr07^$ajF9yX6B!vA zKo#m_MurB^VEI%=h6d0|*o}+~4WP9)vltl~K$XcHMurAZ3R}p?(7?#Zz_1uJ{>8|^ zu#^!pZ?ytC9tF||TCcH|k)go?GzQDa(BQ<#z_5W4G7klk2aQWLFfufN#?m?%85+_V z89>KoG=O3VRE0stfj}(CI1q@%#Q+-p`UgIW1JpMKvA7sOE&-(wZU$CH1_ls|3%q3$ zRAO*5h%qvN#}c?0lo=TqK-+G)!DF}}78k<;Mg|6u$=nP}pe&T)F$`SrmGXd=Q+a}> zAY4US5AgTdF)}bf4%GqWx$rE3fdAV-Yli-B1Gx%PrgZ-Rt&sX(Dw@TJR3EIQW32`3MK|kLF`M&2?WG_*+1AZgbrqhLWl-w;vtuEZuHj zdIP{~x;PwKPL}@EKI8ye(FIv<44Q^uZ#_^_51QU6`vNJyvbg@6K^zBK4(ZO(dZ5Iw zo3GQKr<<>rr<3_);Qz8e5S8Fr10K+foB{*G|3JNfw^s+7qItLAtM=t9?VxVzWkUkI_L?f4VpwlBkvl<|A zn7k&q7zCwy$k_b~EJp=_+yrtfXwH@aOVbH-k|wBA0WuecAtr)(qzp}fN+6KaUU)Gu zq~?_rWu_LROjzc@1VP0Ts8ax{1i`j2fX9QuOi*zQO2#108)itE^qv{A=Kni0q!aLy znE|{G^A9s*yQc#SLj!0{ha(F^1E@p6$O4&zXJuh%0PWo1VPR+hb%#Y*7#cup`y^Qy z8bCFu6bnNG=%^tX7RX$?JPShuXhXjm3qu2_4%J|RlwJBP3=JUnnt;x{V`N~kWMOCk zZGg98VQ2uA5!Nh_Id^^*h6YVW1_oOeh6ZcU{gEsT4Q`AK4B9M^vdf-@p&^)&fdS-R zP<(*g3kqw{crc{Q0cv;QU`U2 z(L21LArVm81U1`1Xzd21ISpb#n$sW_WOxk3f((y= zSm3yXOp=%AK!-$?K|2nRw%_x>w%<#@Cwjrl&OzOANW6k>zJjb}1%)N3OakQrNDyHT zccPa`un}KSIt1xKUJDKq0}Zx<#6fHjjl32d)V=~8Z-zb!4jN(wxdpTqPXK$o#)Gzx z#3$yZ#A7|+1r(cldn9Rxba0ctXQC>XRf7Br{?5|4z&a||?|6QIY8r9k63 z9lB050~+7Q-~$XG79_qwEH2PY6$6OH%>bHb1F^vI-3=ZA&*={3X}wgE+U+aQda@+$ zy8|dGGL(h}cSSO_+%B%mB64e}Ia2kO7Fnaqzj# z=(!wZA6OY_xg4}S29(Qp+cGfZ=BLD$WadKFhJi|N$0nVrQ9S>->QnV}(_fq`KPGXwZ6M-U$rUZ=n*0c0|W#SK1h z7Q}+gg@9O)xeyQwoDyIiY0&g6B=_^TfVwlF=3#hutw@PO7DEPu0s})Bq-B%=sxKkT zUjP4~c32x|tzu_0=uYy+pP*$h<-FnW6)B*_ov{+Fw@dQ7{3JlvGBY&%6exD=zHs?b zm!G6p%gIs>{_V~j)`#k48-6mCYVdD&X0kq1FTlUunZ^20JxG$x`cNHYPa0zX8OLY- zI_9))XO1-fYi*#F&uN`)poT~5f3O|=E%>4)Hhj%~90HAy?ydp@1E@m`Dytw< zH=r^CwCqO&d?qlY6$Tod1+C9u1Fx+>O{K_vO4zYTpdJt?=0K?wlwx2Q)Y1ou!{m`u zDJXe>`X$Kn$n7jpnGPGEgy~0bXMxIY^i&RV6Ucs0+vPu&R379Pj4{^-N;M#Npq6sT zbA6x$4N`@2z9OtH11+8`DN4*Mj!(=f$VddQ0|Pl3RL6l{?03Va@ew<72{w;F=?vubhk*`8 z3p%^C2Rgg84|;Ov0Vak9P!8D-twKRz!w&Agfmo2)Ef9-~0kmKiwCI(a0klmA#NuL@ z$H2hw6Womljgo>`TnwNsP#_)L;IlPBEO2yphjKK(kq8b82Q33U#>Bt?U4ytA#4HtQ z{l?$70mQ5o039#A6vXTXb(OoDL8XoMLF*57r8_{o*g;JGeo)qC{@D2M`~Uy-wH(dI zIGUgRc+I*Gq##SC`fW_eXfQqsTE9W`=G@5eMeO z-8Z{^|8zP_{4ZpIs&JNQJ|c09g`J_>S;B$&_-pa**dN`_EDpz=K^cMJxHGsUWj@&H z%+dO-M5x>KPuTy0FaL{SBPTrF&K$>B*ch6v8R{fDiv_w%{~UJ)72u$x_a7XAueCah zdBEbJ42L8x1Py1H_d)fy>l=sWV=|qtZ#ql=Si6ew_k92R|9^a(@d0q)V`@N-8c<0K z86yEre}c+*5eCqT?gVgg2I_}GMl$v>GB7~KNI)x_AT=>)eItYgS||fy_2%JY-^MNMm4Ncnsa! z_Jj#?T-IwQh6d0fweOf9Q$*jGAd{*;phqPCWMXIlwb_0#LG~&zKh6d22jvzAwcn^XwGeZMtTuqdjp#ij~S%aCOK@GIdl$oIcG(Y6P3>o8fWM*ja zVq{?W$i&b9+E@9RiJ<{BX4c3I*>fNVYELjSFvx@26O0TDip&fRpj|jhpmqf#1A_`P zLj!0nuPQS`189;|otdFw4rrAxGeg6AMg|5~W`+h(8R^c<&~TNJfguFczF=fv2nDq( zKx-G785;hA)-Hm20!$1HQOpbtLQD({(aa1DqM&tR%nS{n-CS{?_73PQ6J~}67bXUV zBxZ&NHzo##6lR77Pf$K!W@t!YVqnN*W@t!ZVqnMu^%R&G7;-@FWMW{*XJ%+M8E-deSd$-g)*weP zM6$adRDU%e;pi3F7Tw`8Q2?~>9W=@ViXAov(C!Jy7^^=60|V&LSj18;_{4xWxK<>++d z=ycqrGfw~2$&VDWb-~4|$Y%+ws`3O&^8xLsO`IyLm@Ct12=Hnu* zx9dBg&IVoa1gWM$gDap-36LWnAk`{pRRE;w2K7B4Sp~Gr8(Lw5mi>UMb5QpPq60MH z0;#Y;RVsS*D-T`%56cpuECp(_gVcg(&~P@04U_*1s*|DBFKFK?=uB#4d3R7ggsy7> z)tsP-Gi3S2V0lP#2lazMdw$SQ;{>@0WH)Hr+Bc9Ppmd6;eo?X%WLg$v16UE|)o_Fz z0|V5CVg}ISN>D=&l)pedXt)F@M}Zg4f_C-5YzDa-#0E7AKvSR~b}kEKS$`o5WHsd! z7KR4UaYWNt7#ac@7#L|7V_|3j*|vxUvWscV%12?cRG=Qc9HnT7^fCiMdL8mTuurM@$iuK(r3=N=-EPGiP z8bINGfCaL>{2&WM185n;N$3>Da_H0r$UUG~0!`sUvNnhX$=VU(W$*>X=WEUvBK{%*`x;Bo44FCV^DWB9E}ZR#Sr(u!C1-gJ;vhN3=;Xa0`O+ z0bB|)s}7a}B?wRvi`)l>ISrJSVSQi)=yr2eHpoJ14d_v8n$WZJwV>P1LDTT;;65;j z1?dBWSX>OCoDE`egD*M*vA7sOW9AA@Ii;xzkx1+a2-_WW8aYe?!hy;JrKZ5dK}@J< zIOrsFm^g$3l>sS=VgOw`Rh(J^94o@J^i6lGGvv$i;Oq$+Y~U+{6;F(V)#p3UGBeT>w!A-5i9=nP5erC6UDh%zB$)XqiV)VrtOD)-M>|mf;a`v>JSadM43&BL5XUHh4-CL-C_J2@sQ~6c z>m&HyEp6osVJ! zATlsBihvHnLMQ<3D1@j1wMs$vdoeIGg3eJyQNo~C1TMe9f}kp#nK2a1W?*GKJ4|yxomFN=&|+5bpb&Vz4rC&-IUpHkMo?1&WY5hTD$JPX zfZD{&jG&c?Al)E!oEYu_wR@QvL7QMeaj><`{tc!%phgfgV-6D}6hP*1W0(WEFa|WF z4RU>QBB&7#G7&j^KvBocsK5l;f&elFbl)tPpBcWV=I}G4Fidkm+lrVOK`UfHt^m165W^f$|D2f-G;0Pj@%g4XqL}7@n&Qli zpkZv7Il>s`fY04!1g&WWnRu}=d5=!^{YpNC%~#*S(=$ znC5^Q`pk?iNbx0(VGd|bB{L)FI318V79IyCJBLf3S4anV!80LV+Z$k&<;Xa_$XtT1DeN#n8U=tz;J%KBbIy$n)+jA1g-spnWKtf z4rrqi#9yG&YNtelBc^*md&QX0+1zn)yeRKP>w?*f7ljozuh22-<}XbB{iTIiPir%#5HN^`N{F zCGvVDra7STMP^11W>7f@at-M2ZIFq`m>EGs4xpNBqQ&AwOmjeM zrkELTFe2(NYYcNhW30@Kps8ArIji63Ucxj7bkjF8BWU&s<{n!Nb3ms!GBbi!u7m1} zXO6F~VVVQ#j59MffJV+io@ZcSu*Wb5w1thC5wt26RI|Qa_qqtv9MIefGb8A#Q%^*)j$OwyyoFG0g$3ePd<>tt5rH#~s5QPjI}0>Sd6c?H{h!W10inQpU_EfmHr@ zVweLui<_AdTnd3sHT2k~hiMLIbrr-tuyWoT!yM4y88ahj)(aG0vxU0XW10iH1)Q0& zgc*?zeKE`d%``BBm(zpli%apKL)Jh!4Y?f!8ZT#NT!ECH{V~h|4dO8~f`b z?*OKIK=TgFjG&oQP#A)eVjzY&pr$vX+>qF!*NkZnsOinjsDb33V6ZtL6G8bCL@P2V zfLrhk;PdT3BBpQ=P-*~)Fu+9+vnw!NpcR9tYCtQcQAI#=rl=yI)zhdV;8h7=A(+Xa z6B5A!aN9u(-9RFOa1qc>3Xq67Tm&@03=-joi-?1wiGhJZ7%l=jivy%a6fR;8RU-)( zf$b|2hl?ab)hNS73ZWvZaFJH1h&o&ZbYlR>E^fHULZ}*jxCm%&5v0ZtF0vP@#uzSg z8Y;pI7r6-)v4o2}hl)7EMZQ8sT;U>upkji7fk6{4A`caDgp24xMZDo6)=&|5xCm&T z669u2xJWoujWt{(6)Iv27pa7b*uzCSp(46)k!4VkK)A?0sE9vY_S*VCCT*M42A`ce{fQm@NMGB!Jh+NQ)Au_+p5pVTjaWi1cBI%*PN}haqwRL*z1s$V&{7e^3#2 z1_kiw00RRbw6J4^i^xJnAfXYTo0^+k09pqK@;s=N0ErZ*f~G%UA}T(9hM<-ZXqN`4 zr@+Pl5&^ZoNkF2%1=dix`4*p@@JS$N*}CgX%c2E>J@eRm2eF9#D?~)NTQ*0ow)IsfG{% z*#+8l1Q#&`wG>fBK(@z%M=GHHG6c155hBPVFrcv)W=2pu9Tc9*Ujt`BS_2@S1vD-| zYM4;QZ9u1LB6KAk@oGlsiiPR|sX^5Rx^SJD5fn-w)71laOhxEwgz5sRLDdCX9g5JE zmaw=7p=&u*7f21NF3`qxW=2r^5oA~BLc2)_U1y=XKx$BRfzHiG=n|Qr+Ktfl0jdk6 z22~emO##A%N219Yeoc2k0 zCqh>OR2N7MsxHtN7s9UBW$Nh&T`f>uAT_AE;=%1YP)`jMhUQsONd8&@)df<6stYvY z$IJ-ow}Nz?EbMkd*!2ji3#0~B7iil#Gb3mO1EedKBjYndmo&7C2vUQp3$%lanGrNz z0n&BL>cnD%u0W_RkQ!87pgUcd89^fkAYJ^ALFe#7D;I`Ns4kEiR9&DQGR%yizCTFU z9Q{Qf5q2Gd>H?`j)dd<-Wo878Jb-l-bNoc;`VG|uQiG}sv{Hnb5i}M7(k1`C*aD%; z7&NHIz`y`fgQ^R(!+@C)G^zm7)s|BckIEIiXCPf{ik%q{e$WPsX^71 z4Nixk(EyOHeLuot5xTTNO=<=P29O$5U7#JEh!nNR!+JJCR|-@YNDZnk&=rt~vD{TH zvmYUJ&4TIzsX^5R+987&d3%}Z#E#H)5vmKM22~g6;$LRa-fNJz80ssY9YpA20u2~5 zFo3UXMAZcvB4=gC9%Ih|r}C)df<6s;dwjhM*bak%iSCPLR{s4kEiR9&DR6*D8K1_rs%#Q*XKgsxXmT_826xiF$zqSt zr3$UCL26KSftNH^JWAkzHGSG$nf0571rKx$BRfz}ZtbXAMmA41rr2%3yyU|;~Lfz;JeP!W*3AR@Ua zBIW!H4EB&|+<5q@?+*4R_V##YfE^qx9V{8*VJbjVr$wLz68U-Ykm+5>^>=UuSWZj? z%jJSsTtEy;Mq)$6Ry=rW6l_9jQBi&oLMUURi)72+kl#7p=n0g-Aft zE9h2NBpK{C=Ykc0(lacpfR|f9M8TJ$gPBkhlM;)e=^iSOSX7i)3GqcyDmcf)BME_$ zFDPo_jUY%%iMNB}7(L&Cf$wIIK! z1Y$yBadKv6d|FX{ZhTq+rVt`nlfhP{6~q^p6oHM02*4KZFvKUOq{Qdvr9#pdgF}3L zacXjDQD#YHJVa%3etvdls)GrGy?wm1L%e~ngOk69kFT$fivy@6ur~#*9ke%%v{!L- zbU-NbaCZ#w3vfnJ6M>?}&%xcz#l_##%^Ru+yuJ|KBtHiaUuRE0FDD;VRj6k9IJmpI z`vFnrZZwgybX>STzQHkPECqD-_4|f+wM@M9bf_1?c zEZUob7h9s}b9Q#{32^lCaP;#=*algJ33VZ;ck=LZM^_78v5BhK)xqD%+uzmE z6J0H22`7qT=Ku#+4-ZFgUl&&g$ih)*QUkB8wKs(<9kn+FuN}2FEr17@laGUkzmLDa zo4-H0H4rD6LRXQZSm)&H;N|D!>gem^i>?dmIPBUy96Y_9{Cu3DvCm9M+Xm&0B08`4g|bpTbt=z)=+l4@_7S!{2bUs_^snxAHGim=Mt!7aeo(aYV>38odaRMy@YNinpH zLatSud>!1}J-h?FKoJIAMr&^hZRpsWf)>)+o0frA(xN!j#o58h(c1?c&!DCn)Hn8~ z8HrHWS>~tNTY{I_+M9yb*&-b3=HTfR5a93Pi4rEDRkTo3P{YK@$HC3T$2q{s*AHHz zgB2Sixf3ja;x88mH)mHT4?k}QupA=9umpmOtAo3Xmz%Grqc_|N)Hb5MXK#sFFg;hZy)8P7?JRMv-octUETu?#)q$a;S4|^c^ zIe7Xyxwv~eIXj@LBN)K}4nDpf9zIS!NRC7^!W8akHh%5ucGT34^kN^V%g9C$r6Lj?kXrTmH6f_r+1)3ZL^B@FR z9nv~wkSJ&^)+r2i4i3mG#6apm>tOy_GBA7rEzp6^!YK#@BtY#2E#d$vWB9d628 z3=A5er8>~HPT0%?-4kUKz`&3LTCRh~eR50;4D$jR81_J85;SOu%{&)o1_qN528IgI zlqMeY-Z3*UtO{pfm;st1WB|?BGB98>uY#3<;Yu_EgAZsL44SU6#Rn+ZCM7a3+=r^e zm0nyJ85lk%GBB8frn>OB4>Y!(2~`75xD43c2ioS?pUl9J4w?kRW1ci67#4sg$ME-TFF*f#C}1 z?gTvk1)Vf9X&wW^I?#b{c+87nVqoA{$iR>Qx*vmqfdRBb0h{|CfKIzu!oUy#TGoTd zJkaSNo0c;$JOOPOz~eq1CI*H@D;XHpL6<7xiVx6PlhgBf%e|xao=x71_q0b3=GDg!|E6qzz6JNGw%ZEw2&TH zy1)|D zJkSZmt%n#Gc7PU5F)%QIrhl-xZwC_tgUb;HhCj#fr)SWaPGQFx7*aqBtnj!GwAT37 z2?hos&{1x9+~*EDW#u#j!)DOs0C>`$05b!_>2nMWw?Ri#;4u%hUd!|n1H+ul5P#rm zUrk|RU@*GEz;Fz7H6^qh!d4#KVPs(NxX!?!0y<`xfq?N-hQs$D>Of0!u$c!s=IsAH28Q*ZquHVL7B=^R&X9cgkb&U==xA96$Su6s z%meMEa(T?azyi9^6pwjqpwoArGBDVHj`d&wT?B%?{>TBHp7V@>;R0y4J09~u%~Gb9 z3=F=Yf1B23A1_nLQ zu_ActOHj2j=K}+S66h=gsJ+^W#V5u16S z_D1d(28OGk^A@1?V)HMkeZ~Hbfx#8jvBA^62ko`=|Hi=Z7<8Ny)Lv}nf%;pTpc6+R z$q!6ob026AU*``722;=(et6sms;<(ZYQTo!D6c>_FEamTV0aEXZv>Bdp!44)K?lvi z48vg_=w{cOe;F7af-(Re^FZq}g+a%#5-<tJ-}lgsQB5y%E-_Q%E);7 zGobqSBpV~cRnTTTJmnv#y%x^N$nXui%pbI94x4|EFfuUMfDQ`+Wn?`04YV&LkB5;V zA9UOpp880Fg@NHWKO=)MXwwt49RW_yXyXE)bxs$dYGCoa9PlP&9yLBNE z>OhNawiBTawA}Cr5$ZtZogqRUD4cH+p$;^3^_U2CptY5Mh*ZZ9I)e$GT0rA8nCTB> zo)Qu2K=ErzggQ{Xxe%ca6fR*zr~|bN6Npd;GB1w^b)a@q1rh2%<2U_8r~~aSm`#K_ zQ3eKvJw&JjwbL&Wp$@cK_B9deK&yrS6QK??{-O-qAO%e`*vc1BeAp484zw!IhX{2b zdsB!|2g+~tM5^l{LLF%D=S(8hf%3;HBGiG>{azx}f#U5v5$ZtU_m~KEptXg+iBJbB zUsOQ{O+e!oL}80xko)Y2PzOrSK}4tnrN49{)Pd~nCPE#kyq`~mI?!ZIPl&=20NTa|>a2l|-S%Q&6r9mh|Jl_lCaE+tCnYAQATQm}%+MmHpeR2JbgEKJS!Qu* zVotKTVN7^tp0QE9kEc_7P-;$UVsUCrL0)=MX-Q^|UVc&*gB62~An5J}b_P(HmG+JS zOe?=n%R(qu_A{M<0o19y1{!)x#qS0+)R#G#Ndc0nA>0Yepp?6l zDj69Po^Ye!?xacyNYHS2s)h#?<-uY~#iW2R3+_@=D&}sy#>1n+l!{rNieUpc3hq#< zgbbv_Hlj*@72Pa&-C|@xjnbY7IL52@1OAx}wWK{E=TzNr$41PzDB1Xa>D z#5!sOFeFN;(iT873hra744x1)9G>vt&2q{U3oL-)UV*hODKQ%26LSk%m<4yJxh3@m z2M|uhVmv(9%`K_f)uCc>Wr!&I;O;l1PU!@RN&*(ZL&(sGigAuKT0nVXL^2E!MAR92 zfCdp_pah!*h#)ecN=XDM9;sNc!;M1J8q`SbXzs)`93EI^)Tq88ty5~0JE$hX-3@P5 zQ<5YJnT<#+)QAE|`h?dRaKmXdP6UZ@xZ&{lMYR4P_qc*qe6cb32(rmRRuxAvh>9*% zZ+W7Y%L`{)9Xh)trPqgTnC? zzyT2eIRLLbBO@cDfPjF2prD|ji;Ig(XlQ8Ys#U92F@v_@Ff%ZNfPsO5fw8f%@tHGc z&VW{Jf%fw8gZA_BGw_4JhYue zdZ1LH^?!*rR2IAo45m=P_&|JIbnM~Q|0Ueva1ZcgF~AgXfNpeP0ILD5`v5J87h#yq zz`y|7RVKm!y1tK{k%2*k0kl~|fC;oK@Cf|gQ_w|@pvAQ!3?O|Fb)c{WE#!u7RssbQ z19ZVQ^r}S$2GD72pw&wtwIB?MYsd~ukOt5~Wf0wSBtn98bF(RS8*|buIgY|!^O}53eyc-3=N=L zU^a0vG)!P%VA#yX&@hdGfnh5bLj!2j)lM#k2GC}ty<7|p+ZY%a4sbCv>}6nJILO7& z0NR{#h>M{CwCm;!7efQ+1oY!v3=N=7At$&P8bF&bPI56cfHoVP;$mn3g&Rm6$ct8t zpxZM*H_n1skc$^VEG`DnUPlm%n?VP(%a{?gD+83fx?_332@iCKDgU<1ygO(9tYN>|_;K0(J1 zL+xMyxe>$$nE_gw24XMcW@rGpV>LHJ1L(q}wcHF1pk-$3xfvQj%fdn8plzp{xEUHi z$DD5AW@rE%^t^$ap#c=ppo_2B89@6fK`d@?Mh3CC7(mIXkr8x>6KMArh{eTl9OPB7 z7$|WyfFmEYCLW}Nn*nsi5{L!9iL?2Q47kJ%=ik-`+E>~=4RqHw|F$;JrSIMQKoyu% zr|*x>&<~xie~!C?5+TDeS8j&Zll(14EDQ|Y^FX_%TW^;rHUH!&;_5zl@C7sf`s1&; zyN~m)KiGVL{oo5`>l^&7f-DRSt^fI3L_m5#Qr$P2AG3GHe(8?o>2!TkVh_^JaquNG z|N8T<*?K+L558pXb^gzM@Vi?L0|O&Nx9^uu*Ed}Z9j@FvK&4a(%jE~JnJ)k6KGEs> zrQ7#M!#>ar6%70>am)-1-EK9Vt}j+F@wb2ucJFrm)BJ;tzZtY08+2W8iBNN`03&~^ z2{Qx33P%1G9cBgwhl?+Eg32!K6Cl+O7%x9)e!y=1gTKukWSsAh=ARt=&7f;EjW2<3 zum1kA)Afh(f$y#_K#nVMvUC+Fk#GLVSi;`?lZk)o0f%niKNny2vN$lG=oSI(k7sxt zk0#yA;?T?D*ewD&JCWhFBiLoQjR377d@X~^2+$oJ-K8J8U4LkQ?ml(!6h|X?PfCeI z7mHluPjGl~C>{KEQHh)DUkp9ELYWvCw0}6iKKJb)JAZ2%69WS{_z&{0|H*to z`v>z4kdq*B4=yrFWOssA^lSV6>Hcu><>hDm>q~!hmU38sFXQa~{+g-#V`nMHPSD;A zZIItDKj=Qezuxypr|Xw)SB~xvoxWfE_*)h*GBEh@w}5VB@#Aj+rNZVP0{qQa85kJ8 z9cJWj1>K1I?GPh>D`>0W3P%3c-5{BRjQp*jn~c95W-g8Wc8Iw&Vg++)$hU*crT*O? zwLctu$JAN+qSuq5`$IQVCv)>*mgYk&&F@%BKU)9fZv)-V(Czx--~%S+8_XBFT{*OW zS|2aFqJ6phe;12X2Xk*Uqkrkw__%1$bUUpgg@&rut0)m1;1tmkb>zC#uJfKhqRXg3K zAHe1_e_+0${R6C@-~D(%Sa7E+2a59YyHI!WZ)56U=HKST*x}5`zs-rM!63|Hr z{M%T#m@hKl)c%R7qWlq5e=n$I!GLUv_0O_A?Vlix&How8pLQ|D$8|7+!=Q_)gW39L zSpX<};3ixDEdK~K3puB9cKbeQJ_yRJfl!||AK~c^ebaiWM4;REOV>dqU+!-gl$f{< zb}&J;gDVwCD~KTT3}}m*Fn9}58zTb)sM)~Au$mEctp}(#>~Lr1a2-(g|h-! zU}9w~3=B%(CR7az0|Vs7>qZs^234?FJ6x=Xg@Hi>EH())Hl2lmK^rVK7cK@W${QvoCU%lEg%|H zi!d<=pjMbB2IwNDh8Q9kYD_HA)tFeoE80?L2JrQr1tmocywHjkw8S>00IUR5UxJQ( zPRT4T$VseZ5M|&IoCmsF0PM!1{POtR#NuoQNd_Ll*>GW~Vu%!|ng-pw4B7w<*2KWT z016Wj8+2@V3aIF3U|`tK&Cmb}@dMD>`5-q#1E_I+n46&ibm_wpZiWWXJq|~?85%%W z>73Tw;(DBa?xEUHi&G3iZkY?c%Zia>>3=9mY)vvi38V)irFudi4Gz0%|GcRqF)$qGVQ2ug08jHUG=MHDy2!)O;L60naD|7V0dzIYRUU>0ZzcwY z8$1jRzDx`ZH+dKuf|wW>?(i@)q%$!vJmX<#0QI$0c^Mi&n~QaM85#~VF)$eOGBkiT zyPNYeG+bh0V6ft4Xt=|~z+lbG&~TrLfx(uSq2VDD1A{#;L&HlZ1_mcyhK7$!3=Gb^ z3=N-|7#Q4m85;gDF)#%1GBkjC$Nszw4IIo6J|8m!!#rMw1|en!hFD&P1_fpYhD2V5 z1|?<&h7?|g20dm5hE!gL218~BhIC$r24iLhhD=_D25V*ph8$jo20La3hCE(|1~+B~ zh5}xO247|dhH_qp22jhQjF+Jy0?G%qJ3#g%F*7hU@G>-HF*7hU@iH_tFf%Z;@-j3u zF*7i<@iH{DFf%Z;^D;EFF*7i9@G>+kgSu}OGXsMFFGIs#W(Ec!UWSIFQ2t3~1_n`H zhKAG33=Cqt3=LC6ez{bMBz{1PW zz|F$Izz*_13nU!GSQr>y^Ds0>u`n>a>M(pxvr|;MOasV+&$&F@Sc#fm)>8 z44{1lAQl$`D2IR=ecTM%j0_AQ78iphBLf5I5+`m3&>ddU-EYFWOF6>7gU1U%`+)a@#wkjKyWJ{OK}pRP zM3f2}|9{Q@-K_%D=K=M`82DX(WU=(Ras-4OZ(G8|zyLat1YEN>AK_{JU!vdb%E7Du%YzCwPz3}k%s^EP2!qbe28n~%AbKlUErbVB2RhLlBn}Z_V2A|`%78q? z0O`wvykLx0!GP=p>Fs7 zhUB8;_@v5`)M9Wao`C_}-GaFlWDLj+AR4r53{*{k*q<37-K`%CkOKTS149F7*YqC- z25>+AKLbO94rnJkBcvebVq|Cl9S6q4$j|`l%JDHWG=OeH;b&xM0JYCW7#SKsV;RDX z3=JT^g7~0X60~udodMLt2eG&rKs(VvEG`DnR%#H7n*l_EFu1$b_=bgrfdPD3n(@(2 z*FRz1r99!?wH&SAN|Yw-0L82I2Y#nx0oosWTmSt2|34rco@&08-iL8mS`U;se{Tm> z`Jg1(?OsvBe((k7_Y1F?55C}PegM9)4m@_I57iDEZR+;@V|*4Y25#;8{)sm}YkVLM zE&^tp0d26f0JnKSTh}22O`v)X*LB0TCh@Bu7 zLn9Ld7lW1Hpa1{=i!oq~HJG4}HJF3jHz57UV-5V!CJ-oei?cHe7(fGB;KUHdz)+G~ zkW`um%?sc*4cKA`0dhBp1-erLRy3SuU}yk^=XnOmP}UU&$cV#LXjZt%02#`7efN5Rsf5E4z7dfg$z+~wB9a}{$DEazmx~keL`k8 zACZWTJq#+cA!Q-xo(9mt0ElFUJQxK!`wbK%pxg?gLCFl1h+r7BmkuNjlLz&cK?w~c z21+KN(!~fZnSjg$=?CqflILFHyq6;{|AE#t?qV|G58bRu>!`IEJG#u zrylAI<>+ORvOdAzbdiyPp_fGpG_WFK%~8zM$r1K{JE-J>6lUEYnvZa_e&cTil_=e= zJlcmlU3ofP1-e~D0>XM-1p>O;XD~4^Fdq)cVno*`)BKN-zZKLl?rjGZEdij?hN1Zg zOX~stR#4*TE)@ZdJ@7FfWIh}a-s$_N)Aa{b4M(RdN9zIp7SPCVSTB!6V0S;r9*~X9 zrvuUK^5pGEF%MWE<=O? zbd%i@aP?Bb$iVO#talcu(FHacJQ4+Ffldzr6)=c=4@v`|d;r3rGa5k!E2!uL@j>|> zln+4p5LCT^x;M!3>$pGzc_3NPP$~lhALvXnu-zct3=BU(nxL&A(9OD_#v-!*Fp%Nk zjyj~Z1RAxsLYw&jxe269iiv^YEo!-uk_tN<7J58CsL=#6A7VRX2ms2)QGSR)%MVa_ z0Un};78)RNSUFNql$w@V0lC2h)W`yb4yXa2ms$>04H5-afuNRD3Ft0~yu^}Ja18`A zBc}><6g{*C0>>q&xeRq11IUjcHs}VzEudIqU|_IdVrT$W#|})8vdD#rp#gMzyf+i1 zJMGWJ&;Ys>I*G+sOtWOgNk ziJ@UV=%y?th6d0uVIdPk18Cf^n2Dj`90LPGDHCKirILxE0W|#9z{Jo1>SWY1F*JZG zrg|oZ24O~UYqSB>y=Y=$XaLO>HZw6a=z^vRLGEK@VCZCGXmDj@VCZ6EXmAI0!FZ5b0o1L)S+^^6P*$Cwxz z`WP7)&NDGIOk!kUSj)uFFrATsVI31g1E@O!lHUN82ZiBQCWZ!3w_^trLj&lH8<6~E zsQh(C28KOM3=I#V=7P?Y1)2MWk%8eb6GOv)s5q#b4-yBRS#$>EUnT~IvrG&PptJ}Q z2i1R|4hN)42eBYkI*7%^06Lin#NuY?0G(Y2o=^zwe$)I$2ho)64&~`~6$tK*<>-vP z(|U=&Wf!RDdz-&y6KDvX1=NgY=;jXV{>Z=nLpcAoYVJzi)hJI>n2A;wrs79Du`h>3xrH}ZdP z-T#ZPFTQ8K#r*5Ls|ctR=!|_(V%&W0fA_Us7Et}qpnaj+^~%8qOxhosAF(t)V>#~n z0aQ{PcLmMWG8}h(11bYwoAx^XZ+^gd@Bz~#`3wa@M1=VxHJ z{HyCo_qj_Cl*G9%bckD*J}G7EF8$#Dnwh!ujd$tQ?$8(Au@9_6pOkWThko$xjD7H$ znK|@Lx9g8?-#ZSSp)WdJe^@gX&3*|w`x6of2VXNCe9wdu3_nV=dqsTz|NsBL*Q69g zH9ul&e#Um(^#dq7LuZ4IyFU2`s>}@bfkx55VZhvd4IE@1%Ez=nFkfQ+2KV_Jh{h+N zz9rb_;2C6)&qF{N3*lwv){}L1-8Wxz_Ci9V`#)sz;oL5JdraTILHPa&%=bU6L*KxB z{{!UvC*7_O;J$xg%~&+y<$VTN5;*vp`QUqIG~X-s2LAVJe#GAVjQzOl2hb=k!q1@K zc&!iiF8eN!6g0ls_klTx$bJLjA9n>EKE{CT<&spS7-odVFi5TTxn1@3)biu(?$|rs zzE`@Ox#Mj(I=SQcw;d>w0MF4K>~v;{M(q#s!)EL{oms##(crcWsH+Ha7^F)G8VCi| z8*Jd4xFEInJOSs{<6r>hJ zpF@+M4m!*b)IVlmU;qul)}zTk0?R{cOj`y92GG6k$mZLF>u*pg2dSSyM+;h`wd+A{ z0@;0^nSsFvt$xmr2Q};CGxJJPi*gc^A+yXN3qXzsVTjQn7J4sG7&@BqN0Na7G+Lbr zx{nCCwGSGD2X*>DVF9Xl3lfWq8KfAv1wp|Ks?JM_67z~77o}w8=M{s8y63}(xXb{kYkDPQ)Zz>V`G=8#A%u^i0W@G3$_E)@59ecOn8?V$5Xr~T06O0=3gk~l28LKZNSz(W z$It+3or26;%*eoy$j8vIf{}qCnUA3XG*Okp$It+}={=o~pVqoCqV`vCwVqg&BV`zwEVqg&FV`xZ*@(Y+47)1FP8tOpj+VVk$?#1~S8oHPm z7$o@^8v2l}ro_YM^w%#K52l3Lhp01}#2@hD}iS?1b_`Qv*7nbi%~Iumv;(&cwj5m6xI6 z1``9rK3;|fP%UzRm!aV~XzH4mq2V191H&O+hK8@8DGTV7z!6@C24-dkhU2^p4Xn%z z45vUt;h=L|c^MkynHd<)@G>;0F*7in1*Lmt28MII3=N=#0T+208l0FJ7%uZNGE%g`{9nStRI zFGIs*W(J1WybKM~m>C#A?wJeaFK1?8=mCWvs38Q(Ps|JqlR)_h$_JHSAU>!_0xkQ1 zwCO-BNShAC;$nyd_o6_(9Z=s3RMc>RTX!H?ZU)fw5{L!v^LK~xgz;}P0?j}3Z}Vb0 z_>6=31Bm#@zs-vo%xDBP0qVa4SCoGG}H|$q96r2WDOCh3IbIRAR49?CJ!3SMjo~S4OUyCb-zGng7kup zgMA7r>p&Jj7M`W2mO!rViwEEKM#1RKWg!Lz(C7_l$`LwL13GXAY!w3o1IP^^HmJ4& z4LF0?S_}-JNg@Vq=*XNd1EdJnV}Q&$nldmnfYx3aGB7lNE{Hc`U}yjxDR08S&;ara zNFEf`pyN3qLpdN8WGDy3;sP%z1hKdoK=nC@1&vk?{%uVB+q@VLKHy+J2##7PgBdIm zdl(enpsE|(A_X~?fq? z{U8=M1E`t^ne@=nsR=D8Azp|P%<Ox(7dUu8EN%wSk>?;5G@y9+w+ZrZb7VaDh=ch8|29V^ z7=sziX#Dm6|Nr`OmhMC7iwr@F-a5gfKcJ)zS*igFL-a%lI+GaWW>A6v(dgj|I+`9m zd_j6Z{sqw)IKtQ1kYM;CuOBpF;6qs+ff&(8Ueo|exu6`1oN}RY0$RBRaz6-z+y$aR zeI(F$2#75XjS~rI;+2BVT*)#pH0UvaPxS&XO^}Ah6=?7s5?3G=B(6X#E{2H=3=E*r z3vLEbI}OC*0#8JNZUNzD0JYUXEG`C6j|`-P8(eIFSdcgkrAc9dEgv8k7SC|S6FH>? zG|WM#q=CW~gh6(JXiyr1HRoNSVeSQ<$!B2jfrh;=G>m_O&$b2?93U1Xj6p0&egLr` z`2oZNhaGsZ+`VK4V~OqxmJ-eXr2@?-B*Hu0OF+dj1E_MW6<~l?nDBwscxcvu2%G_h z189y!1XNEjtO92dP-cM)kb;uSaJ5;0L8%c$gR%|C>o5!&wgZX7 z3%OUX%%_jL7h!N^u1Ent=4fj87_ zWQLZl5Nm~yC(1w_E09B#Y#A6povL`y0wVm=CeRyz!1jXN3u1uU1hDpmAPZ#TSd@jK z0kl#;iUm?<$gn^rj%8UOb+7^pWa3zi1u`23I@K9c_kviEx);RaV%W&QzyNAsaWjCz z4#eVO0Im6n0ndDaxKx3aB(?E+jK!bRyAVM5Oa2{(5W@KPsd@TuKu)G$4FqmGmLm13m2fwWY zsp)770v+Pb0UD;@01s0ff6d9i{y1bI@&D2Xoo%4r-~ZA(|4Uy41^zF65*`d0?CbXZ z(|kn5_-uR}V$cHA5`k{GKw_Q&ML1+E1C(t*Gg~4IpacNPUZ7bFP^l-v5XHa%p3D>h zucim>g%Du?je!$;suQ zO7_kF|Nmpc5G`;}^ANOX0pw5+2Kfy{gJvHUj+voh5d#B*BQsC*Ci!Z{N85%(2#}Uksk&#$th6Wu*28KA0 zyBQf6l$aSBKntPNm?1?KXw(GKBLuM^JwgzRive`yK?Jy10?pHbSX>OCyH-G<#?1gy z17dM8fOc4c?mXgVP-bLc0I?u51RxcV83GUsTzoaY0bNRhS%P)W{qpDke@HRb0vbPA z!NlJRT9mbdr9}OIsQ@HTBW2p=BLZ<~qm|7kn7*}vN*kt5w~|s~b%l4=3N-!)t=i&m z2W9;ot5>aB_5Jz9SKa4(S%S1r@V9~n>34*MhK7EB-+k!d3wh>4ovk1K{Quv2pw6Rr z?>~^cZ-AF?XEFD-{`m9%KfF8z^E%xB@o#JW`RD)t4)_23+ggA9`TxK92u}xlZ#}bj z>FI8;&tWC=|E(aCdt3j2jDeP9%||5Cn)i8tCeO;bT5p#GeRJjzD3Lclkk;7-5^cR* z!jjhMEQS&~pd}NU-O(K14m&^_5|AKlKEmW42jYWbMg*MDASQ!W!Gbcg2zb@VHn3jMFdj&)2tySk1H(?R7-+8x zM64GyF$NZ!44*~@4bVaCSO;BuBEqm2v>q0$?l@>F4$K0rsRemhgy9lsbuC!z1|xdA z3beinRDggmXc`5S(qW|`s6Yozqk@WTP!kF?-G?GC1}d;YvXIqG?Ticz$nqyZyU(E0 z&7h5Bph65;UL7<}4K2_?!;GNu0Ze&Fg#c=|feHxp0w3gNkQ+gC64nAgz$e5N+-?II z4e}-k!@NkSz&A2QE8mR`(FF{!u74u7SqEA<2+B7JVGIn=+n>Q>1fVSGE{s|UfbtE< z@gNNHFNg*;{cS+GjDdk6nVF#hbi98KsPKeLAAk%0a%P4GPMmYJaebUP$3 z3uHLFk(r?(2{g>j%+Qd>z`)Q7E&SV{g+53fDE=lfL#Ct`KnwZB%#dMk5FgaxTF%VS z@ScHzVFfco1E|}uk{L2Zy^5KkL7I_);Se)J1E{cl!OYMA+Sd1#88YSko0*{jR4D&t zW@w0JWMKHm%+L@I@)HX~LoOo&11k$dLnSEvvM@A&(ij&D19;^)Hw$Fg8st7u`kBJa z(6E(}fngdmLj!1O!*piIRP!8WhK6H|3=FxTN{Nwyp%hw)fTqjY89>z&h{ert2Xs9O zcv=|L5(T-0n*r2F0kOCk^cWc!KojEJ44@%;5Q~cev}^}71j)_d3>sbs>jf?DfS3nz z1BeB#M4I17AZid;`?tH62ef$$lvP)-@VCwbO&|7wimryA%%vQlyYu&{`uF|Bg`oAQce|xw{TI;0}KmKh8)2t5_$$<@n z7}0!$BR&p1$p$KE7(jDu{M!!p@;ET}ff6PEHpaA0*H@r1l(bIQH=rSuv`*J|FDEfD zFc=@`bbSMoeF91TBq-av`*i5 zX`Q}r(mH)#fh}x4!h>nQ>sRmqR~rBNQ)%GU$lpQg`M3FgLkRr@8N(Bd={|+6)A|28tR~NQ%Fq^#K6D+S{%U!UaAHW1C91Vn%$s5 z4oKYrYGOfTK}$fMf${(YXagUlb^tY?AT z{1ZV$jR8`39!*{!)Ln(v7@!g#)HFmd@j-Ti^n&OptR;Suw>zY#4ssgEnIH_QMnEk5 zO?)Ht&9p{l6czBG7CmS#Ggul@n1eRqzWD$DKa)HILsDXLc6w2MX{V7Qo2X7GcN3 za@ir1qWSEQ?ce3>kOfMW>mvlg;5G=S1+Gdn{A zXz^SNJ3|8~RkyM;G=Li99qf<=OP%Zt4WO=GH#nb_ppGSp#e0~05T^V zv>=I{p`jYIKZqT&@MsP@L&H)=28Oxp4B$yhkb2N$BuG7IPhB88Lj$Pg6T}YLM+6cF zEiCe8hjbx8yD=ck-a#zLvUd=Rivi?%Q2oQr09pVCVsSBmI?i$6ZUv|X2V!wCfUYJ3 z>ELDnO~Qg$(30K-XGsro*a|kBy#w^ZtlL$f`G-P@DztHqRID@~5kOa*rO@ko2dWaS zYzHlH07+(nN7WcQU9a@IJ_vyGZuGi7LGbo~ia@yB0noS$oOc8?@&f0b04-C3^Un0T z{(za%e8i!-_R9ZG*9-hDpo>47Yj6DLZvoArH`ng@&)))Cgxy?w;6Hy0sEBK>J@TKw z1+*Hjx%R|={ua|4ZtdfBY}0;@{rJ#>~L5lA(ctp|om+K#3t}ixdN>P5?`Q z3v2vg(|kf8trM&`i?P>rPe5OlPrh&s@^bx^($VE}E~fS3$QU!WN<5eCqb zK?n+Aj}bf$rLbut1X#5Ef_{2f_j^AB3<<85tO~z`Yt!F9cFEA$lSG@Ol9x z1KOt~!mu5#1JtsDxD-^HgO>QQF`?WGtlc4 zP@YDX2TeP&Ku32$<>F~Z2Jk=_Oh0Hb4`|>CRCa>u6wv*i=yeLnPLN&@9gnq6N%jcx z1@|IAR)dTJVPfkPL-abu(3GM&1+>3(&;S4b_gXM8R8)fd3wQqi|GyupzW~`{1Uf(i z`3*#aF31Cww;=Xh7D!#Pm<3XoEMs8+FRWj|0-3d4$pRTRy3YdHSFx4_Qm3qE zVQ7d2wP8RlbOr_nkUVH1&K6J$oq>U28>nT@z`(GR1yX11Vu2hPvYUmW0knjA4-4do zki9Gn4WORGJ{E=sPzk%Ag`oj7q;-G=vWN5}3qu2_-n+oU(2&H)z;Kxbvhd|93qu2_ zPPhi`8C+*!XaG&Pf!qOFgnF9=vIzAq3uK|nJr;%r&;nnOJg5zHnuVbObRjK>54r$& z33LP;bnh6XP5`kWbpnV5sS^^xbV>}QzyftEAq5d=i!ekMG=2yvra*-lL>4rE z1Sy5X@ZLt(AFwQ0W*bxfdNts%)&d#1G+C0ltf|K7*q^^nw2mN z8frn72Te?X8kZn3P&Nl$zl@&EL1u#VgXl!8**x9R*Abk}LB_x^NDGt=p20_+JH;6P zHKZtKgIbHAQiW3-(prS9zyLKlKzk6Nj$i<}AH)VVu|eSpVyi+YeYByIK6)&W(|-(D z7#cvkiws#HBf_rGtZm8y85A&QVQ2sy_F@6e;vjj@1d|O5WX+r%D64@+cv%=4$`}|J zoLL~-!d+Mx8bBQtkow6C3=BHZECjmR4Kj%YVnHU6KrF~45~zCunM4AyAd^U-jLppe znnVJzAgBI-bU;r10kObYsPPSGvjnK-V=xBoI_&lZPa}2qe)$U@gar-if;!Tm1OVzi zgVyG>o-EP%=E&htqJ}HSp>|-qeFgZpw}F=31$W=P_!@NX3uv2O<8M&6w7fLj_VVt?vKvH4 zVl8ztJcC2Pr4GnwkT*aWVkn4(zr$*1i8dl>WJFOB1Rjz6`~QDU7y|=nxiDxU7^qkR zrFJglVhL0#fmXkQoyY*0LjkctqrRXWX(0A;cF2a!wd@QH+6)W~8`&XK&O6u{8eAC| z7BApM}-kB6b1%_Hm#4WLRGBn~mqWylVNkce61wFnm7<>QI$PLbWs>;XpGpEd1L+7XDUi76yj>pz&hsT zzFr*BP$Rm6p(L=^@xS%)V%Ki4(gqt2h7wEb^Th@YHM}brN;G@jSgem1%Qn=Qu3;z< z>jsp)9L-54Q` zus+V;oCrG3qQ-P31Al86GXq0LfU|QZB%DC|HV^Q(8i91Uu3|pc*$gU8vKV?>Wk4I( zds|ih|NkEV+EAGRDkXYbRet~ful+Be`8`wcaj+VY`p(^;ef6MnkfHgAO!HolUIzYF z&_RRz+qQy?;NRA&`v3ob&@$5x{M%a9kl5-lb{HsRdv}96rs2VzTUmbp{|_}%0JO=o z41E4$GiY=;0O~HVj&PVyBtWVHz^Z(g@NaWn3OD-2G>gy+cKGL|-C*xzG4%4(AAHEv*~Vhok1cx{@ZkmsC z_p;RYvNYnby1Q1O`G`#G{}RdX&J_#{0t}@BpzZPuom)X!?Ioxt=mwhy8vF)zid+9f zXBc4t$^i}9|C_gfw%CAO3h}^ka7G0U)InX|4bIEWN5F9aYMN#-WC=j!{%-|k28f~E zy`Vhbd_>@B200a_UaX;6U1-60JM&^RchK>?cQ zf~W(Hw174*urYu}K_TiuOC2EUKl_`*)05=kpX;eiwFZ~ zV*+Tyr3ga;69c$eBf>C~iGjhC5p)phHzt@m6=ntoeXv*|Gfb?LnSlYaZFn`DwGp(C z9=wTnH!}kR#4Y!j85lrE7K$+Z0xi1-%Yx3z0aZ;R3~KN*!$9Y8od7rHKpSL1NnV6u zG7D^mU?B?w18B5_jbSYd0|P|eYZe9uP!E}n;X4Zh18Cnn8^b>q28KgmQ}|e6F3@C! zjTqUo!ZtYjvcgObV}*6{Vp!2BXI-pJ-sIvlUu7PM>H2ImJ zb`+=}W?%rH+Axs?RsS=vJg5W306u)SA5GpJJR<;}=XSet8^ z&dveg<{HT9Aa8&$#840me{;Q%iP?VpRnUflyk(!v2 zS_Gbv05$PefHvlU{l&ll3KI|$G=Bv;1pvgBU}b0k9lR#V3OSxeiWSn)lw*agGE`)R zY{F7zg=~mcVP$9lbuCob7#ctw3j4I z8bD`*fW$!u3p=thG#p}JVDMyRXaJoR>cz^?06KZmmzAO6Is*fPA1h?ZQ2;AL188P9 zh?SusosoedjFq7QbaZ13D?ver(D0j)fuWF< zp+Sv_fuV#Iaz0o!D?>v*69YptD?>vk=!j)j$flrnR)&UkObiTNtPBl%nHU&)SRvtPBl1m>C$hu`)F5XJ%m7%gWI3h?#-mAS*+|XJ!V5BdiP!|CkvVPOvgG zfX>A_$qG3a>kKPHgBB<^vobUourM&3XJu#ror84|6dx=M43}6T=V4uCWoU?IVPLoc z3Lh2*hMS;xU}0c*%*xOJI%)7JD?>vQ=+r<~hK61i1_n_0&jy{l1qwG%{$gclSkA)0 z@RyaLVIvCz0~;Gd!)DNVU2F^uhgcXGWZ4)RuCp*O@Uby8JZ52F5M*O$c*?@SAjHPd z@ScT%L6nW5;UfzJgBTk_!*3P_21z!ChQBNf3{q?i4cx2@403D?4Wg_J42o zL1$t#frj*Z-B_)Umx+OEYp8+EM>wEIWpuglF}55iQM6$!WpAkAV`3=5q0snJ%K`qW zhnkNucb0zX4EfzDtpZ`A(x+QIree=}&KHfW}X zBOok1__!+vXrnTyHN?<-Lp0JUgDp6pwsupaaYhNGec+X6NgUME8VVNm=A*227dt2Z+cnyI$iJdx?Tx@pViZR zM4hLLOvm+aL4hYiD0JS|J?E+A(2+;u=DuvX=pwbVb z4m2zQX>lxv57dChwji}PXssVa9ViX+g3r7HrCNv>?AQYlhS#9=Dc}|dXjY#KtnMFt zrUs-BQs0X(!D@76(D{nsnqQL%y&gwiIi|-1*$54*1VQyUXn``Q9tY9lX!6rRTgRaF zI4Imet9C&1W-$F+pb7;#>;jrT1a-HO<#oef?O1a>0>1IT|MCTJP(8c>%7bYvVCLj%a~oLrD|wYa$; z%ZGWn7#cuB{}Z4`#S3yVG=NS|6Xt>p5{qy_hHF6bpf-RM7i1ntmW!bw5wwwq3$nIA zfs3I5G-#^A1vzp~6?%j`NFS)rpveU}hf5oJl)NDqWZAGO^r(0nE`|nBoY`_gHd6O< zF*JZSW`XpB))F{!F*JbA;OYS#anH!W0Fno-ECb1dPE>T}VrT%Z*Yes-7_vY| z;)B`-Apd|?lyNaMfEH~Pb3xW1lyfmOfL3L;aWOP}V`N}x=Yq5$KZPS z268_W#ND97W8btX&@G4Wg3XZ#Q^ekCb+%=tv3L%xEMfN$3e4A z+zg;4_aGJ*18Dm;NC!6qD9%AFXdNa1>d`<(&_R<@;oWW}&{b%lMHzTjE~C$lxBf3N z`0maD8WksPJp(7P>lrvfiwz*d-C58b5a7D4G`!381LWk%mIM6TTt6~{mWq7>4{h*o zbNvivbh&=v-*(~PBMz{Vub>TluHV4>_COm%V2mFDL4ok;e-Y|V@FQl#Kr8D(O-nZL zv4fCexe7j}4jL|i6#bxeagecc&}obib)W(t((MElgpf)AbnGrf2Pk4eOD;tiKqKi8 zb)e;mkg;;m2q!2TA+}M078rmE0}uu+vH=Z$!%8$zp$(b@2Nj#3VQtXN3$i>1KWKgp zBn#QU0oucYEFTQMyam$v0(GuH-DLDa7i1^M4iFuVwb0FXb1McHx*(%L&IDnIp&%Ci z&XpmNrxOypIu|tV{o()r|Dc6bpmA{UbR4KtggovI@(ajm$m8A|9FU21eh$dQx)29s zVqJuTp#ijmRg?oVv2MTtDNrRjAd9r5IT#v1aU{dR&;U9`10>%BIv$e)vKUK=g8@A2 zrp&?60LsW9dCO1}kj2#N z#)vp$wEIS9?3=LG+ojSFb5X5`i;f3b5)6^cg4+!mcx(lok91Z#9_tI`q9`VDKuzj$WaQs=9AE|un9=3PiYSU4 z*+4~+BRjMNa^wIrx*WMWL%(zdayB32?g;(g;mY0V`=jMjDVq&bsp4zjhF^@OY&OiL zVy~SVeldZW+^@|WeleFy+OU-9VRcx;FP0(^B$+N(?rz^7pv@7M4Ba0~ID0)A+#2i{ zN`LWhJJ9LMaqs~XGz_~hG#}yU41LjhsT8}HyInbqPqrSYv+s8O;MQrl6BFZ~kyzx2)jQXYuD z|D`V=jOHUc&~QdF3aNRm%)r0^8RP>kk%W|(pgB57>4x-G86fIFC;dU1 z+@Sk!Af|x!UPDS-(5_;LI?(Mlkn$OHuMI>Us0w}wZX)Nyo6^morMF-)(4rKGI?!@l z(2g|`hQo}o!8XupK#1&L_{o8wBhBA~^@17<5Lr_u2JlIiA`Es+uoDJBN0UQJdCegVrv z3S`jm&0{qAK+sMR28d~(S^!jQq1OT+H-YR1(P3C?fdXeoA8;)IavI1%APg}S#KO|_ zMlbnIDcgt#FX=&N#euD4U|;~b7sLkbSqH7X2eHjLAWdlpXo>I40clFRaxgT2mRh-S zKrX@A$idJ6+L-Lc0h#&qftLKf9FQh7NFEfPAsh@1pteB-2V@y;BnRXcCXhU6#Y`-; z3j~z(khTXP`WDtxf8VcfrFs|G!R_Q0Xdex zf&+3aez3mM)4u^_`cAQt2pcF=Ya$T937 z78e6(9Rg^XE;j=xFN0WI;Q9%qgPQ@gX&JOEg#-Npwq&1CozqxZX(7Rpi58Ct$ z+DZW`RlkCp!Jv)NFvfQn<6|KIHs2309$LehX6<3nfpjZ`Q0HuG34t_>RhhKyNbZH($9jHSHDJenI zGN>gbsI3Lc#UKo7H-j3Tuwn*OQi9s5pt2Cu9tNExge;HV9tIuOi!4t}dl+OV$PN%4 zfxRU3h@_xBY=E{l#L$?c0STP#VepU`C=fw=hoOTEpo#!=^bAP&7If3XL+GZ3C+v{+ z@H2Kud-yp!q&>_8Efrt0Gl0*qf6ERTSa`?I&``+0zyOl32c3Yy4%v_V1+*D}fq~&G zJ7kgoBoDIlCv5Q`g0z1@Iw0*|5DQ$Yfcn_bg`c341qdzt1T}pXzBzC(;aeXH-Q5}- zUdjoY5MbEM@tT)^+dk0I16}h#wsgA+SRdyHUq99SgN45xbg5c6XlZCzM=WzL}QkM@aN6X0)3#-%RCJxrei{3-GD);t*uD~iW=HKSZ z(ZR^S&6TsGZ6PD*dP-NWj9-3zzUiqfRsL~`gl?8HsLOTmX1L(BR4i<(6&~Sez3uHjFiv_Z|s+WbK0hAURSRezVAoqc` zp7ygqHdjqxVQ2u=h!a6a!GKzCprc?I89<8xzyqbzSQr{WCntgQxq&7QI8Z@<`(a4h#(7@dBJ`LDOr^|5=Kqp<{li z#>K~h%nQz90?ofc%;*N6$$Yz121zAUFK8YQq62n%OBO@eF&1mc7Ax>TC4VbuLZ*w^ zhOtD_hN%S7n}!$+nk|Ir29?Xbu73i+^IV{+^SCQ$3k1v<@Y*lX-kxq>4(s#$&7iZv zyI3S0JAHq2`ho@>T0!d}yIudNf_f^ppgs0PScGOniI-(9N2x0@rgXdhU_Kns>&zIy zzl|9*VFvS$NHoMhNFjyrBq2eHy7am5IWf@I14y9^%50EAxsL(1_69Wb0O{s~jx2%5 zf>snjifqtf>yYLos8EE6f%bZQ0(Zti3wt3tK*QvqlN>}CKnq8IfMr3IE<_fTxFNC= zKs(vNvY=H$5LwW!DbONm5eCq%DbVTyHik3sVT0R@3=E(f&e#}02cbiBfOafGDiY9q z0`7_gWEQAIgq6ae#w)0-2NmQX8q@_tmfrv#tOdzJy7{2QgDn3WEDsW4U;qt|fR^in zcrf!LKrLOQZa!$m1$spSaudjI5FLuWB7t@DK}LhhXAp*20lB#k^#C4fS0n-q+~A9D zKx3`NC7@dZKxYqwTmzbO%LGrTfp_8M;AFD*92VVfHZusa6neYfaF2( zahrpo0dz$1T@Ho@&}~KcLEUl&28IV53=NwZ7#Kk6KtnH2I3Tz5J?DU2AMhGFEbx|t zp#gO5_D>GT!fB9t&?3km9FVgaese&s1^C0k0KNtQBoCS?W8q|I0PPH9=Y*`D;oxLw z05t|d@}Q<0FDF9-Xumm#4_ey5%E{0G+64~cgGzIdeV}=05Fa$mbpYC}2kqQ|R45=8 zq(T9)AQcK|y$+;80kI$z3h2ONNQDAoaWQ}{+5qX`W&jP%fLPE91u_8Lj=pLGHo(XM z9+dRx1S`4|VPf!(fu(mH*FIUJggF*P6N>U8~M z?fRvbqdWA&%h3P-|997NbjSVxtx0(Ss`WZ!p(E7)OFzJZP6F>xHE0j;6>xn3I%^2D zdIPc>7*f-u!Rs*4!Q_x3ZBU07QVW2FL?DCKpkZl<4p1Eism(wqy+YK1!WL48fllXx zr~^$8f(GQ+z?bbo>;(;pfN~=n187JDA_h9a1aztl8~BbZh#08J2O2ySVF2Yj&~2P- z44{)(AhPjH4B%^(L>MyQ!_wvO6(hBHSBx|f7?#dPlSdww2A#JA+CvN)8-`UD$ivd0 z0Rqqo7Rd6*!_uIY^dNnh@{sxv)G-1bVuoIyf!qwL&p>nx_WCTq2huSD84aoyKp12d zh-Ltv5s6x#8KbWlF{bR4NYFhwpwlH*%QGKF!)KR|5IA+?~C z31VxrL58y}*dQxItk@vK**0vDl_6KzAZJKAut8RaII%&_6mn*ROk{%OK`TQ%*&xH( zK5UQy96vTledf;wIc)-@4irx@Y>?sYcs9s{W&#`JbP13==vMelHiiaJ>o=Q?p#e1g zlE(%)bEtp~(jh8lV`u=i&C1vyJBTaT7#ctufI#{|qqa3{3=N=xxmq^JL}()$Lj!1H zy9MMQMh1p9Hpt2lka}xS3CqUN0NQre&&JRI8c+d=gU%+J%m%3kr?D|KfI5~l*ciY^ z?$2UlXaG(3fYgD`CYsL%sSg*kL59hfvN1G(+HcF)7#ct)el2H%T!XWMjiCXwdTTWs zv5A$zxhFh~oO-GFgDB$Wr8K?mV- zgVsMVfKJCPNzH?-af6(00J@3;>JSEyA3$u-U^-}G0K|R@9qf4p9qf4v9qf4z9qjo4 z9qbVVt&nD5VE6*v68#OjCHgybOEgFxv?cmCbW8MK=->_`E2J!AXN9bG<6>oK04?F+ zW`&exAbp^NPWV|F8bI+O09~;T5(k}v@ESUp0y^~uvSk{?;s&1y1!6(AOqYZ6B}hMr z#l-+x^IirPJI27k0Ag`5fKnAm2RC?E2#5vFtIcm@z}dA8z3mI@vvYt)JUlwV3czh& z_y{XXk6i$)4myqvN=mR5%WfsX-LV4US&X0o0f?#HKS0-5{fDj{fQUgxe?jf%;Bbft zYHly?Ws&bb4{F%jGnDW^2A>_lOE0WXlrTCTcYOj{0Nhy%yJZU6m^|+K1r*PnzHfR1 z8M_!ATMm@|1hvqffLdtUr@}gYKY(%+17tNX^;l#s# z0-*UWkS9SHG_U|#`HEZ!fEpyA90{U9bD7BUo}lZ5L91v$$2);`+cGdPAj?ky%Y%Bm z3=BC84B*3^k>x*vS1328JXazYwS zNt}>T+97up)>BX?%cKkj4k70|9A#fLM^m2dMK7 zS-uKlK^h+*9gxNchy^XsL_n+Fur6N(UAzQalM33dgX=6^^mVL=q71x;nw{9ysqCP` zuOOufYGLNdzs>a*XcoT1^%MU#*Pk7(A3^i-9iTOOjqFNT~(7(+cEfM5%>5uMQe81rkYJQZ{bIOvR;-29aI zlFZyxNO=UB;{xSquoD>=7(o65v4t5J7+^JpC?^B>fIw+Z$l6mmPRJa)0w;7s9w$SC zC+K!EPRPxqs+^Fur)tnrM}reGho!{{ISX7HG~@?W4{G4*b22o5>NrDA$c8)OC6GcFWk#RGC z;uyq&%o%}nK<11;ICX@ZQ!h z2)}}i?F63$jwmKMS`U;+86Sv;x)ePMdfPyySOEWa@KNCbP~+eyi;KjgYk)Q?!QuUy z4_g}+b`TDZn-!3Dkn6)o;y^oQAR}?0f)!K*iZFmO4y5=4O|L@=NBqnCK}-1|>Of<6 zkYX1UtdJrWbX+}z1zK7SQ3sksg4hc>OdcW&x_%EL3z{#2xBzsb9_T7y5eCrmQHU65 z(I`Y6Xg?RkHVM!bdf+NRmWhD@v?z~_0kpFV;v>+7dJw%f@Uc55jIlf9MGNjs3=E(g zhg_h82E0H8I;b=SjaMMc_Xr^hbdWmG;5oAV4Wv_FLA&2Ten*x!2bFF}b4{Qo2zr4J zaudjG5FL%Zzz^~Z2KQw_MuW;s5Qcey;5pzJO-{;pZG-ZNjU4JBJD`#PcE}E_R)C!x z3m?M+HIYD$2VszZK{RNK8fbYVh<%%lp#gNL+XK)T7Xt&sW9XROQ#OVMV+IC>XP~hp z1_lOO=t;4!*dP_a8#c)1gSTvu%?BWPPzUED8$$zVlgd{%$Vsr@*%%r?bE!X|V|G75 zV_l$YM%WP=)BYsb85%$fuO!(S8bD)HQlJxS85tPl*%=x@=i;leGcuoUEA`7#>2$)<6ddLFTGJEXZ6Hhy~eU3|ce`*HGobo?QR1p z3HuLPtKWKnzXQ||;BN(ue00}}H2-I+O>N$1!o;klI0@RKK-9z%_6kz}*bx4uAih+Rvq8HQ_23I6$1n4I3hOa+Axqgph6!c12bP3bgdjxF$+38 z+yd=(VUU|ZdO>tD)?&6aFFP;4JP%ybf=q{Dq>>h6)X*4x)X>-rt$}S!Sq~qyQ5IA) zfd+1}Q&S5V_!uk&LH#C>>m;QZ7(it!sLcvmJ_8a1VUQm|G-xw7c)bh*1H)x5h6YgB ze&S+i0M$xgxFG9Te{eB0fEo$R+zbt%m49Yw;$~<79iVE>4e8;0-MAq)5Ib^1iq=GKNY6cmo1x(z0|P@LH)Q&w zk{fbxY85x6Xzk!;Xy68|+UI6y0BscQ;$~<7O^Hw8hHQw<;D$`^=W#=>V3-DSCnEy` z3peBnhN;|;o;;{m4=L(EEJ#rYVsU{d{yA08O-jCPTOxKs`bbi;Dqt z`Wk5e05=0@uOf)W#Q-YAL8fqnC+$HjF7REgAQm@x;sL}07m3YpWWf8!z_atnhc3V- zT`{Nc;dA!jY!6c>0G{TDPTzxOGhzLHckmEq787(!80efOSB_xNi3<>|sHQ-+k3lEC z(YB9)=9NGvF5KpC0i~C2Uk=z22cMxQE`SOO@QDkc14(+_n5_@PPF#T41v+s7Vnag> zA0zyf1$0T!7$-+SuNzZ9a5$F35z@OuIlB8n=Ogs87-caYbKziO=yhabKGx~_26WQ* z|5BdguApgMhVV|`7oDLWpyQ~=T|rR^o2dsCOwf^22k`Q4sHYKb>~04Yjjabt6fmT) zYd{K0qQ_c6w^2dHTJi7K0yzcJR0j2fA>}n_#UyBwjSbwJgp|mjQ44l(=?fZl1s&~!T}_z>eEAUA=^ z5)cL*JPaD@gq4V(@et4mDX2^b(V%5B$ny6=7n(uKbx;U`mSQ2xYe|7jg$!MQ8UUai zhb-R?mWSAOfe|v!f+-KO9WsgwayfeQ8suh>+dy;>)^fiJc31+)XpnK!nGMnh znmpVCT4Ke(z_5=Kvb5_6CuEKAaZX4baE=qQlBBo0b<>!9O6s_?045DPLo3}Qh>hwH)3Vo;q0VnIfS zLAeq#It*e#4mSYlfE;cBVu9<5#y0{i4B+cvAp^wSz7pM`3ZNOV&fXuOV+Y$B7#J8j zr+)bT|G%{>4}UA@lA>-`k>GC0ZeN-3ZmZsDp!V1CHqcxSDCRqvj<>|@c~O$0sg56dRbgS2W1jP#$_8-*#CC|KB^=$oATMcJw%!J@L0;9AgbqP-1EN7iFtWS`NCFgOpn*qFpB2=QWr0jzfy@J)X9qjgAJpIi zjs7F+zXsM1DSto%h@g#OhG=)GgWLqN8?+Jr4Qip5nU|IWS`7-iC=z5W$Vw1~7zkpa z4-kXSVFQ)H$hSU%R+oZwfYy@cm*=GxF@WZ?LG5i&Lo_WjFS9s<0i+1jHU-_QoS9cp zS^_?l4b)8m`4KD<4?4sRelaX42o+cu81hR?K&qt}xCIp$7#KjRAwme{;-KZNpo2`& z&wT^6cfspgLGcOp4g&)NC_F%HP*8v;RzXvSjF3U(-Hedq!cQ?mZkxHp2x-V(W`qn9 zKVoD69}oV75i%$KjFF)Mw7%ypBV_F0JtO4e$d8N+4WOLzjgg@Nv~c|gBcy@*n~|Xb z)V=!02${0_&j?uu#KFYS0J{5#lZl}L)MVjdf}9M)%LExy5MW|x0J&9=39=zVj0w^Z z7H48;0A2ek$;8kAYSc?HLDv7sGC|h=$T30gBGY1mG;~3y!$2CkAQq&d3u1AB?`Z2TfO>$)e)0do8&=xP#J-&f)|SRE)rzPVK}^|pbs6QXPaEmCJ-I1Vmb zKxz;rRf#slFwjIiOY8pQ12D_1aVOQ1@(xLXOci_KsJK%8OYC|LIgC+15yi`Ndh&mk>$~^ z1_AY$kmb>@1_2GwnxhpGAUi>JfM%IqgK`GQV#vkN&_W_UIVUkQ7u?|m84i|bfR#;P zULz9&7lRdep}80X6V_G^s1!ggDnP@3pi4gH3NtX|7N>)oE1;c^3=9mQi~}~9fq?;DqraHKIN9*7#yx!a7LV2#b- zDx0BHt~*qw`Q-m@rsg02`JGN^AMES{1!N}^M2GPKOXhN3OIHP?N;(iyi~7od_6Kpa z-YylfWaMwp`TzgFCAf0uZ%+U%83wZ%8H2+RZU$=v<;26_y^V+(7*hYn9!A`#0lF;- zQt^WNF_7E?ntfdeu5LkT9+W>o9tXua2!r}RAR1IdfM`(u0I7pvkQpFxm^^4v5ol;0 zBnC>_psVFTY?wUqZbDExx&)Ght|0+2(RUMqDq1tN`~z|m*nUO^hIb%KKpIi=59pM6 zaP|R9K?zX$fifGgXBp61SCA@DT?jG)cBUz4IR~hY1=YG>aZv5a08$OAWgz<0d0^K3re31R%PiF8EMUVju%|99WU5*`ZS_5kFGB7Y4 zZ`uH7ZGo~nn?U20aj}O%g|8hr$%EQzpc^;Y7(m@K&}v;a2GATG=&DIJ2GAXNpre@B zz^z75)<7mGJCY74Kfp?*Auh> z9X)Ahmc*xJ=9Hus#iy0#C6{F8=RvmdgA9jZm}QVfPM}+zKs6h<1z7+s??Ho-pu1aP zT0nM!*dVQ-IUf+)mY)Gs(=pibLzW*o^Ft>1L-`?X8_-=QkoAQi7B_f(A&A8VzDp9s z;s&2J2V#MvuJH{EN=FK`#t&39hj-WV7$0c;&+l@hb04TvgDBTJV+DGbfUi`Cmdd5Y z&HF$Hj53sJ!{&WqEgPQ3eW3Y;5Jwl!&Nh%5{#KCHtp`f3cF$YD#K6!E7PY>??|vhT z0Xps5{R6giu=$9D<~)$L&V8W5ue+9~6WkZ;juikE`tU9ps51sC$X|mlS%LS%piX9C zV1Tr!vKSz3A5fWmqV<0X2lG6zCSGudO&eTNG00-!@E z*}%u?g4$8oyNIB1FHpJzl{TPc4XV9Bg)k_ogGz4D#a_trdn7=OERZbZgd@;`b!2%? zNl}J=s<OXCOVxT((Rkc z4;kB<#Sdv|&f{lj04?ucz|YWdn1O*|5kKU z06Go%Ha|lHs8#xcA2KF(fgdtYa+x18KXQy8a$x9jkiQuj7*6stG=RpdPVqA|fG%yn z%g@jN8aIB#&(JWHk%8eEKSKlP)C-V#pl&3{9MEO&kD*00X!;h?{RFWfwJV6l#Q@5G zpgNSB0o0uZu^{7QpqWL;DoPLwGEN5Ch71`e1F;};Dj-uJb1EPfxOj)Hj|%VJ2bv^k z{a>PHJr8u8dzn>u*zq=y7$_YaZv%;eSfG3inpuSx#i04<|0TkmVEvt7z1_#bv##I; zN=&sMA%#)vff9b0W~c%%_Y7$64b)o`VF2Ad23iat0^Z62niywe09Ce-9weyG4AOzU z!~m^X1i25C4L~%g!~n5DWdaC;&d~yigTz2IsILS*RS?=e1GNxA;xKtoi-QF^LkbcD z%{?H?qtB3n8VROojRKIHKzc#+D=Z}j^x%Eaz!J!47zSy9vN5Jd4bex+37p~s@)l_G z7r5OEn)(E_hC!{?^2DM%XuASD_yg`fL2U)O7sLcDt^|c6h^@rP&;SZYRcJp_i;x_M1u$9q@M;K1_lNbMo4L33hiGyF+$ccJ2OHqn73ertYfx@4i16jL7VtM@}S`b zJ4Q%D1ym~LgYV2JNNhJ6@C z9n>%fSIwY1V?mRLA`GBm6wvWyA`Dp!4B!b>5eCo|WuP5eA`GCb_aGH5D1tz(UF3lh zP!S7CQ6M=`M1mp|w8#p?2MrW}M&^*^-*bS<8IUXk14td{CKP0OEAV;Ukg60^Re}!Y zvPN4P0J0OL7nJEXVoCUrP8alY2~hF}Spaez2t$kpvCwNvY~!k+p%Kt}Sye%#TM|Jn zWl-lCYzPAbc;6L>4Kf;(NI~rB3=H6bkwpxU>&O-}Kz8FVV}RUix`u(F0kr#mEd%8G zu?-B+sTl@H0tFSpkO2)43o@VqVsU}j!+}`b44|nM5DT2}!nEpqpa*ug0Ad<4x53BET|*Ey+sfkvDjX|*mDjPukB#;k57_`_4M1w*cM1xWeDDpvSxfmG01Gyk^m^`S`V7_k2GE^p2l*f=We*=@SIu+g8-5PVUWBx zD+2=;H06QRfjSZ(IS>ZPPh$mhM8CC?j3u+{IAtHzk zO1GfxUm*5XK86NR8Fr12p#da*n-4Oqc!v*i8`FJ0$mWkHe9*POd<+esak1xokOgY* z_#jQU_k57+en0R*YQS%N3=N?8`Oe4C0BWlJ<%1kR{*RBL0qiDd83-DggQQpx3zA|% zEJ%3=VnNC~5DT1QA?0238wv2BQaJy%3hw6P><9ld_nPoqpDX6$-^R?q=;&;HuIMXB zsRN7lapn)5r7x_{6<2j1)IQ#QS^IjYD^F)A2RKC=bk}l#QsOr8PS-E)owXd@KeT^! zhQ8@6{eVAV|9~XyKfTe6)`x1@yDxORetFH@?fSv`6Tgq^8wSR1R~|=)PFEgl-xo#G z@uX@{Hx*O|!4d)})IjYZP^t#)p9CGxjx3+V#=yV|P1T^b7--fLS$-`Ws4WIb)gW^~ zdo7UVxj;jXNXs-q(**u#sT$-akY3Qis9%Ul)w!iPC7Ea`8)PXciGeW8b5to|At@U? z5)3k%fq?El5ByhP1vI2%7hJ$$x zOyJ2CkO&3!GkA0XY#svx$Za4ds0INIae~-0p!M@CKFG%0*?bHQp!$0bA7p350zSy4 z=pcE}5%M5DsD-zP53*5rF&{$%$gfMG^)hI#0n*X~u^=ry5Q~ce)Y${ExWQAJAQmjH zyF+=xx(is0543(O5duwLcJWw1WA_;D*ae*_2J!)N?1Fp-DosE%XfP649u&KvVNQ@3 zDEEL$6c8JxA3b(K8~1F`N(+#kAhSU?|9r$ByQKxRja=}s1Sr>n`~borw}EI-$_CY2 zAoeO~?5=^+iy%idZpf(gF7C|gXEP_~&SOl>k zu?S*;V-eJ2`{q``QL2%}0Gq_Nw!O`hf(Fk4x0-D(<)&0K> zG)ZwBylw;J>@cLo8{j!^kRW*c0JNkw_OLK?Kc@&oI;gk<4+nsv9n_41c^#w$w0jps zgXBOor~m-5VHk9P6i6Jz2hqq$1eC!+qia@ZT|1DOAoZZt0INY^2hs?cr3H_3L)I$A zgNC~?5&%daSULE7BW(S3aJw2DwXnuCNIl3-5Dgkz0IePYvEM+uV4t9c{SSUfl>P&a z%YqaLFf@QR=rIaFI_?|-kmHBM1R#aEgaD)=4O;F6neqa$xWQ9iAQoiG3&esfo`J6$>Ww}H%L;NJ!s`eM*N(d+)7`JnNo z@87?<)i8Cs{^@K34Iz{ob^CI3PXmo4@NWa1>&3vo4K%OIpnVaf;SfkeC)kax2TJ;z zYyU8mbT<5EFG7qg#7Bcq?Ep^EK+Chj1t5zBBB0p{l0gHog>@JaR{>@Ts((Cpo zAozbNOoFHNK&j|!xwz)v%*E`D{w1JGxFPp#f?FSu5nd$b8PEZLpdBzG44^X?Ag309 z+#TAKwD2l*0|1VC91)ae6> zfs#FFI2Xi*$$K(_x)2}{1_qEi&`cbN2a^YFngq?Ag3JO{n4puyk>x=LbHaMFpc(_T ze#8i^#sIkqWHyN2geA)rXF|qlK<0w%0bx+G0MU?M1nQ9r=+`0}qECYwVxI;D^|C?c zD%pZgh)T-`FOvmlAV@a@c_;_uR*?OmBnE3zmoPv&&=m}j9bMH7kQ%2Me99*H@LTW< zXD0(>fomTFWT#d?149ESjwUcbt~l&sU}yl%tM@>MioyF#z?W2mSdgp&VnJ>X0PW4= z2G@un78e6(l_V%@aD#6w0kOCkKt-?{IBS5;3<9yZz#R&ZDUe$RKrC>!08eQ^Qe<~K zsLE(Q!qTuGTxpe9eRHp2DrIXvz<%%rb9Xu=?GQbnTB+N;CYXQQe9$yxrz^)UP=Z>)Qo?C59WIW?+ZurSuDr$T?&2m1-pZrq~_sZM_^($Z7wVW&!w!X#hb1SWRKS++DM4S2cYjw~m z2TE`uiC!Mi3I&E8VWFX+-(P|T1a2LCEzf*wB?D-KtYquA65fXWAiD*Md6;j%=1~3r z_y7M+_nPkTn(j|KL8qWJK4WNLU??%`Y6rQe{C)^D2wx(=zsLqip zGyB0G%)Nz%%panyw@+bWU?{8nzdeSD0eZ99|Lvfu1xV6pJ|X~36k*{d?BMe6H7l3` z?KNlzX$pg=?4AzdG#^svKGpn?U;AROheBsN$e`|n%@6p!v`;i2;qdI74qCg}*$-+0 zb%L$#ZU+_A%|HH?hk#p0+d)!b3%c7uv&x`@!48zjfl6oC)beq#1SnI2)iodC$N;sT zAGAg9>9P8)GIL^itjodnrFaZ7@g`;s6bQkgq`D0is<&)80_= zSZFJ(NPwXMl;$d+t*|lyNdFVW*8$ae0+8j`%>s}`Gpzy)4WJHDn*c)t=y0ZK0+3_9 zW#t714aghivkP{pnP#dfT6*ak%8f+07C<)2DvT3&;Yuq!^FVgDag=J#Kgeh zCCJdw!oxE17(m&~qyyaS0BweZxG%uZ zU7<9uI5RyjHANvauOu}+wMZeqv_v64O`#|;FFln3q#`Y|A~i*!AU`v&1iK=?{1Syk z1&Godn4X+eh2;FAqSAtr)D(rJN(IMYXHQRse z$)Js4ndy1?Mc}|tNH0pPEKW|$Nd@_gp(MyJSRuExxI`f-RUt90B(;bk!!tMpO(@CR z-33huYN0||VoqslF+)jyzCvzdUZp}oQGQxx4pgK#BfqEwwDSuT@{kZ)tDvm`?yF{dCSQ6V`aF)uGQ2QHPFmy%im=M^LtCFZ7Sch7^xiWC|Gg@`4fCXCENtib_RviisaPPlwxQAE97M6W|kB)fHMv#vP+9WK?hRF z5S&;B$|NY-tr*hsi;_XY#ffF9pwyL^r%;-gk(if~lbQl?vb91%PHJLtszP#NPL2X- zAf!08Bp!60Mm*H4cyKN(WC?>QWHz`3=AeRGBiL$^iqmalS|4#XV8FpTnx;N zpuM-C)&>IWrKBd6rmKJ!4}iKr49tv2;H@*5DySOpm@260$;=39Wx!-1v|bUo$OCgg z?LuZo&|o!)`?k0cv{V7aL>lD-s{xCFR;Yp6jtCLZtP7~#L5P6vD*$!#5F((n+(Er6 zgb1kB4H^$bh=49w1a+AZBB0GApp{Gr5m5UA)U88^fKFWpo&JmvSqHk37Ic^i11OyJ zKzR=Aa?rdh0|PT7=*%?Gd;)I)^Lo%g2?GN(#K55n8q{EB1l_v>YX5>XvNC{J$mW1_ zGc$sgu7a9?3Q1xYG0g#m5i=vmy`TYZkU8ua=740F85glYR@N~7F1Nun2Q)^;%&5c4 zz#t4V1hf_q!yHh9pP3PKMi;0naDC4Imzd^&+U3lQpmrI^Hz1?9G0Xvt(J?cEMuI`E zclV$C9Mc?7%Ym5@w4op5dXPE180LUl63mRC(OgjY+_@NSh-nTe#V|91+LbW(@MD+* zYPm2og3glzxn3bLQ5e%4(7YrwqYE=6c0ukD#4raGa?FhHm?6VqETQMKFwFtYo-s34 zure@!Vi#nNForpxy-3WAplbs`{u1%7OT;t>w2q0H5pm>EIyZ6JGk zu7bu6K{1D%4ng^cnGv+D3}%ivhB=@e49tw+0dfWgh8qVjFTivUX!xC(5p>`T%p6G! zb3i6AGlJIlf&5h@@jDpP9MH@oGb5;<4U2ba40Aw55g~ucfpR4yXfHR+J+c_)$b;3m zgI2|Y4qfs(^9R#Cpwfhy5p;M5%suiL=78q9nHfPtD4-m&H*NYGOmmdLcJ(lUTF{`_ zU|>+hFb6b8%*+V79R(EPb2luyhG`CH^Aj^812e)LWejsbbIi<)f52lE3=G{nSy?g7 z0i_CN#xqO|3^0GGVweM3FU-scx_b;1Qngy5{Fvr|%2sAZkiTH&sAHG|%Aw4R^BEWz zKso=l=ZOYPb3l9Tm>EHboWsn~#4rc6nv|IlG++hFX$lM7Ixx)v^?;cf1CacsjbRRG z?E*7nA}a#}$X0*D8V^i!KCn8 z5$5P)m;EHbL%mX%48eWM-5>@|PioIiOP)nHfRXhl6sFf#JNXnC5`i z8!$6IKr+V|!yM4I31&vnv2-B!ynnbb0@EDOdI)Al9wc*2G0Xu?RWLJx?lA$C!cW5I z-@`NqRPQn~f=0k#@otV`4(R3>W=7C`XrNsEbB0 zXh5aaD~rf3Omjf1beS0okmAc4!yH?1UIw)WKsC^Vh(0X&9aPFOGrnO&#JeqqIiQ-I znGtl;jn+j$sbyNJT{NW|G|=Ecq0)J&~Dl4N|;EVwe*R&R?J@1&}@E zg2%pLx(C$DVP*u~qY3j@G=@2#EAE*YVXGPEx~;}iUx3zoGc$tDX@;2-i(w9ELYA2k zRFZ?-Qxq+TrJV`t)1kKK<1x%h1p5or5&)T#(;kJT{S4ag!psOdI~eAkL=1D1!RCP0 zkAT{TKWrxoVulZBLKV`Bgqf3!VGgKk%ghK`$pFglESp!qdaHC&*9 z4X_X_e!9P&Eu-H6W>p z7$WmAL^ffF9L5m21Qkh#oBRMO5(*dj4i!Pz&IYQ$K=;7H)rdevc;O-{P!Vpph%r%b_C4aFM-GkyN7vX>wK=N=ANvMb_Tto{hq7E0ahKgvyMSP$l+HjFrsE96HBo8X04;QJ2iWtI0 zCO}1u;UWv6BBpSWO;8bYxX59sh$UR)3RJ`zF7gyAVhb1f1{JY~i?D-=S_TFNN4SUt zRKyuBq6rmohl^N2McCmY0ZrF+}EKh-|_Txr!n34nu?mRM3O672I|y z3=v}t5myY6APkXY43P?`h$w>ss5=ij@)0T$3>TRP74e3PY=nw5(yXago;GNMGBxIv2c;uP!WH)$Tp}5 zBnIPiQ*)CGKzn~d0SziwK_bPepxu=)5fvXlQ0I{W)YAfu8nH2``1pakuBal0pk6U( zITWa-2CFdy^?^aFXW=5C4kiPNh#|;m(0&(C%@5H9G8#?9f`I|FD;?BIg{rY+VCaU9 z2S7wj4Hy`vp^6wXFf2q7F)=_BF#)+5bSML;)eSbs1mtE=3j!`;400igh#5#1XqFe$ zmH_KA1L*=K9Jq)nsNaqv0`@6r1te&M3arZz6da%t6od%K925~_(3l12m|@U(6j+xr zXoLdP4}*&sf$TyN0U68y>eYe9iom+S4NDXeBajfN9}gO#0;@3s`3ptF5M(mw{shqI z6Icy6mQh7O?g7OqXk-bj25dWu2-sxM95-mx2&~2sG>(8GVg_fg(xE6a0adC2e}KZ#t@XEP((~YaT?CVzyJzwuo_d48Wa(5>ILoU z1=#>rV+e{16cHnkdvX~W7(nKM)qvvyRRpBw7b9o|GiWSY#m5h<21Ude-9)i>`F(B&#t(c{<#Ry&bP+cH3sJcK~H<%eg;~yYhKYxSTJg|oJ zN~kW78dP1N^<#+8*!t193t`tOs4kEiR9&E+Ai`g(dsjCibTLDn08)dh3$*csnGsgC zhb`K94xvjMstcqBRaY@MG(fXFAb(}IoOz1SH?`j)df10gP9SUbQtz&B}XB2or3BDsX^5R zx_S>`*KL>EdYEX57_A@gx!cx>ymFArY zU4o#AMg|53kQ!87phfnGkWX`&`4FMY7OD%R231!BIQ4=?7eHZHI(M2eLRTDA7f21N zF3_<@2)n|s>dZ&zYK7_osX^5RI%=4i5i}wTvdc&;P!*wTDO49o4XQ5Cu6kxhs5C?Q z_5GX(UDu$(AT_AEKuh1589{9okX=FgOo|9yzo5E6YEX57N@Qk6&@3uQ7f<|MO@uB} zXto2XLDdBsw`67n%?yBat<36RMd(U_>H?`j)zuCTdC;sbNLSx!woZhuSx{XdHK@8k zJ8qa6L34Q^U9W^X!x6epLUn=Epy~o`?m*1LIzO>iLg-?KMm|UlsxHtf31&v9G($$y zXA6WbOQpgQ^R3jsrqh&iwvvgs#_6T_826xEGc{vdyC$rh1E z=n{Zdp&&J=x1R%7E$usX^5Ry4#zX z5tgD<*L9pl=$Zo61yX~m3)Bl@W`xC;>i$9jgswwST_826xEH{prFub3ANBg z==uiL1yX~mYbrQxz{>f8xsg5yUHYIY1O^5MkQ!87pbK9S{tByb7DMPtg6aaPLDe-K zY!@sq2VLz#%9Z_4T_826xKF3eLmFGcA34%G!x zgQ^R(sS42s_{YU~9idANn$SRMP<4U!zcVv}W{W@}Z!LS?0HG@!stcqBRTpUP08zsp zdq4LBLKkSX9Ap+q4XQ5C<`zWiRquK2fY5aWY8OZisxDA(3Sk%Hmwr8ju8&Y%AT_AE zK(qXakgxlEdnH1bDzq{LsX^5RI%*tY*WuEn0EDhMs4kEiR9&FM)|eSVeNvFWgWgpk z*)<8O3#0~B7icdkBEIsM&p;{xPD6Ep)S&8G3{HozmfixJjYuu?KTusDHK@8k`!f(J zD*X73tq6bVK$|=uHK@9lg6#sWQULkO`M`}M2wl-oT_81(cK0->2uLjx!%ATW27Az= zN$~Db@E%YHdqaD$5NHK+JamtBQGU6DgQbHdlH$y~WMY*=d+29OChKkmBOZ^!Vi50tPTA7rX=%!UnCD%}<7~A>#4igBZaI(~444AyOa~ zLa(w>=@4$%jZ#UhlHnwOcLhpZ2@To<(R9HJ4#11(KQ@W5-_ z!B&Fg^4;8u5po62jy^~{k4PlB0G|+7gj}(cX9yAxw5S|zW(nxlZ3GW=B`cg)?Cj_h zk7O#^nqsiJ^wg60(#*V)cw-}o6>tGVGlT$E1;&O9u&JA%RM4O%jOUq`SrQM?4BaV! z9A?lMOG+$;##0eUb9{0UG)BSc0kqi_>^?9L5+l%)4iUoO1-D>sa#1ok9YHJw@gR90 z!AFYh#k@N5V%60&MM9+8}&0*G`174UTRb3xI9NS#m>$sR$zC@Rt&eH~E* z5J?!SCDYkC07XS6=xQ>sW1%V#DH|$)NZc?1c>0D4AQCl90G=OU0`P84#V~U>;6~M;ZEQ zUtp!+WCJZ65LXsB#K#w>CYKgvmQ+HcGC4m#J2Tb6gu&iE-q|7Ez}eZs*~i1%(cjt6 zA;8bw-W0Y`%-$4KO{S+7*_-B1`?(c8h$ z-o(h>!~#Xu$=Sif&)L(*)z8ZTrrQ+0#SK-dyMw!PfTzEshpz*8>l?_cxdotvoSI^9 z3aXe;)cZO3c>21zIR&^oz+(=)D-K1Kxv!&-zoWOarvr446^g8%Lx8`VV}PHxy90C! zoxQ22hf5HOB1>-%Pj4@OrvL}|&N>u%CoczQ4}VW5FaH1s=#D#3y0ABe@417-J93OW zxj6WFc{@A0dpSFR%2Rt&&~7|?)1*{;Q}BK~R2y6zoLqf;9lcx}Koto=#Q{D6t}c$Q zo(`az3cu(Aa4w(So^ zt!03pzptN*e*i=!csC%50)Gc5KR;(DA6Gv_%t2Elau`{9y103{I{W!Mz&8(~7~|yO z;O*(?@9XF3<&cz^f=Diz`FWt^4cb=tyXCsPo zXIBSbXJ1FR0AEK`<*+@Ep!^St&eG%zP?+T+eB*3??>g5=KNEx7wkoKnFosb~s zg117V*yr!yaddTdcXC1~D$UD8 zv);+U*~`(@-7UZ!l61hk_`r!EHxW&#i$j3BtDm=DfR967exAK0Z0DxEDMS-;5_fWT zaCP-^b@p}igP051xQX3hR|gkAZ)aa`HxG1!p}J5^_H=Odbq(U~a5=2_@a&Yr@_j31jbaa5W@<5RYDZIhC z5hHG#Tpj$~-MyTAon5ilOUMp$a&z$U@o@4FaE1mytc3$M8??<7CElGuW_$WLJ39p+ zIR~_>)ZP@j0Ttn;oJ^!N@9N;`=H%z<;^gZ9sY*>V^FXy9sCfX%{wU6Jckp!d^KfjSt0F?M37yu-K<~} zkVDwt-P_N}-^bknzHimuG#R>a6|6W9t$cBDaCdX^_3`%cK%{JlCor>$lb3^wr%!;R zn+GTxK(@5nn-=Al+na)SyJBrxxH`D_dO7>}yMdw*MGt5rEU2V}bPB<-lv;%B8CQ2V zXHQoj7Y9)53$!;DY8fPpU~9*?IJgCP__?}!AyrhMeY5ta@D7B%DR}3sy=h8n0m3qO z2Uky5e}69zP=Q`zZwlE>Yi|nPB#Wh8;pFb%@9pm4;p`LO0N!VdNXl5-Ax^Fiu5JO& z-Y(8=4k6&G5nPtyG9KK-^Y-xebnE@4*4?)cEBwsB z0J_@}H1vnOtrx@xZR+(w8X5$NF>nc>Y(fQzJ>X$r5QEJ&fCLyA7#tV`oS>ToLF@Iw zqM(J~-$1+Jz&r>6RtFj)fN;SiXsR|$k%8d?bk>d&wA@%AAOUI~Xzc`89cb&KmJ$O) z9(4Q`q|QM=zzKN+EJz_}^Tr9N8W10Z6|k5G+5#)6!oW}pT|EI>p@_}A4+0Df%T*Z| zrh`^|fUf(+;l3Z-3=HPx3=I09^(deNeL>-Z#eJYde*#??7|cLxNf;mlwba)`}+Pnj7QTA*q`eg$D{=G|doV94}lU~mQP@W5jpXk$w`R1L^15XNR6 z=)m`b0SpX`pq(Cg%mXbMH-@SKnFYew%YdBxubZ$RH@jW?lpf1H*%C1_lez zx)?m>t!7|g$bzbY8pnXmyd8`T45Eb$3}-=WU+|a*x}WMlR1H4!I+z$3)Jhl_)`8ZX z;4zOC3u=dl(qj zg6634nD?2Hf#H511H&cI{4(_F0c_!Cz|6qlHIad#3N&AfC;ULm{ZythFvNpqXz`R+ zphMM)r!p{12F=Ohai1h31H;j23=H=`v#<=1jV;*R2ilJEVmbrE3(yQI9`iPEF)&EY zVqiE0nipeWU;u6C#b(|YHU@^KWef~upp)sr#}!~N4^A*JFkFDDfkg>6^Fa5d%~;34 z-~&FT5VGwKTlzc8$iPsyfq}t$6T~#oBpf#LK#O(bH!&~-gU(sQ<33PPx^^oA!+)qc z&^`lf=7Gv*^=%9c>DwXp;;P?3OJZkkXJ9x4Rfo%cpe=#dwlgq10v{8M+rOZr6GV10 zFt~uu1OuHNjUzojVPasou#16V%U+24KnsMhg&$}M=d67U4CnSi)PeStVDm5ND5^L6 z7#JL&``mE(7qk?j=l}x)%R&6+ftFJ%9b{m5b_k*lmw6!TBn~q$+yGq&2;H)d&3!4L zBfE|;Fzh=9F%PsH0-Jw9O{N{k85nLru2Kgdxq{6+(0Q7Vjx#Vk10`5I`2%F0#7PDQ z3((z3c=8+Q>`kYW3=CeNh9Cj+YECgQ%z>%{?IXkHJ`qL+hGnN17 zInBVJ3%!yUSN!TQGB9|bVPGf+odAr-ed!Dg3@gtvFbJH3*b7?Li_LvY7#SGC&M`3j z0jZ9L^4$iGW3Ffi-{T>y#4eW3VweUX8I8+vUuuJ8lp zH_=NB42qy@=<%4>$IieIe3^ma;Vp=NLF-Pi`B#IDfuZp>1H($t!M}LS11+7o4OIg% zkpXM_0CXhWhldOd9H0{`@t6nNm~8c!fuRFQ9X9uY7QgR$%)sysbOr|=^FT*iYCL6N z;0Iqn4k?GQnJ2=;z~K0dfgu!pf+u8KJ+}A-#mD*=3=HR?>TtyeD1Y31!NBnFB_vdE zrDu?N!mk(@j6qjL63B11uNW9yK^MH@@h`}{^4AOu)1m5cxet_H7QSX+So?;s`|iJC zVE7MJhtE9Dw+sxT@9>)kieGoA8i-2l=>^n(oBED{;pTgYDtP!I9r*;30p&OD4HP1V89h zdT5w{C~V;Z+N`2YggTJD2}Gy^4Oi3=p$;^>FrNr@pmO^N5$Zr|$F2~e4zy9@84>D0 z@x}|fW*Zc6P>e17KpP1RG1NI=)%*pi6sVsDGv@|hxGBGzaF*R^9bTKhOb%T$mle2FKn#25kT>Kn;U4xZCcMdXu zG8m{c>&3t*IHRZjv#V81QfX#RN=!~cUb>-~p+!tVQGQlxa!GMaS!Qu*VotKTVN7^t zp0QE9kEc_7P%8N7#h8M;^diuxtX_Un7K0Uo4QOvE13Lp~)o0o}NZ(xfJp+SpW^z$} zaei8ff<}<0f`36tW^QH`=yXTt{M>@foYW$)dq6!L0R|31)i4Hzg1q$jlw#27qJj(@ zg38Du1q?zA9D-^nLIn)s=o;gTONvU9L7Qs6FfcHHHnD+fJORemT*h}363l~zuLwTc z()emI0|O}MgE9bUFi3zgQ(_Nys+3D16}Gl1`+p9Kw1kEUT zn3x$rLy3|~hoIr`0?iB-a+F(VNWEZz8wC#*BkBbU9>d|mVnn@QftdvN3M|zlETe|s zpk)}$HcFxs%_z7#EvXT~1PzDhSW7Avbkqo8NFfGKh;VmOC9M!N9G-j-l?wyp(il+h zla0Yg@QEzs;+iN1QPHL9El<>vnLU?jA6?)Pu}Ks(!c1l>y)4<#&_J&sC5hqlr;nlC zZ$9x0`0}Lj>w~x8mWh4h7XS@wF{JV9A1vee#2*P3|HK~wrkmezeBu}M<+BFLtcvwh;%IT(8wJW2e&lmo2m3}|er8+=0>XoJ~AFbmX=2hBOM zfoH(_z+#{yHkiQ2`hxmYpvz9!7(mnJv%s>TBOXAPb+9p%GB7ZJhI|oMD}qb|^@Ttf zIuXkNvK7P!ZFmQTA!z0a)PDqB6>SN+wge;z#UMQ(H6Z!`==^1{I3s8&b81mZJa~D3 zJb2kD#>Jgrl@OwVi2?OGHZwH71p~IL5ycs}!5ij5Qw#Z}B?YBW3mG66uz?0eKnn;U zb}%r2+z4WW(hh8cK?Hb+~80LvADn+T|sl^+zgWu41hF7@s&$ugG}Lhllv;MX@`QKSu`vJWzF>X4Sg1Eeg`tb1`2bS~ z7v!quPhDlcUp(1$1W>DC$7>K|$9tfPBvY@)n2z3I-4j zie`{H7>2HEf!>M9zyO(l1j#}=_@DtckUp6HNnj}m50p$m!EA_@Oh9&ml!4Z-TtFlf zaIZfCqo11I%B_d)^hN-#|SVmbjN=9uL9bj%fP?Qle0Va zi)Zsse*Shx0gyJ(hJS|tDxm%G4Be$XyFv3~ov{L~|M^=KKnk{ZfL4BV`f_yt?=tH; z-F5BKtA3L#YJR2_UnyPw%$32RT9M-fNSt)BM}6U4FF_Nuv1? z^X1>YJm94Z+@}scWKxP12GiW9xPx!P+xSH@<4;@BOl1su;2o@7am?v$0EWD$xYb83nc9ZwNJpm zbQ{#J*4w*5xr4uDIRgU&N{E$$?M4l;2`J&kj~-qileACo=I4iomj*1nkR+NP@n8Pk zed^#t7Vc9@vBKamV!;|lAWhIPVgZFwX%p1Vi14|{i!*$njzfeG$T+y;Fw+xA8XP_> z;1mT5pYBke*4rf(pdX&_59(BqJ{_@NMnzg;A-`_#dg936ZeVT{ekm^w?p_?J$Dx#d59ODW8D{%vCX z+x!?omZRD!h+${*F(&`g^H4(?DmghIMGSu{sOoRMT~ZJ7mJAO#rSWgy0J;OMH;}2z z>mMRGjrq5E{ZF&*04;tgRRf1t2k5r0QmL+vB#;li{&jVLR#tX+{qO1kErok61q*qv ze<01EIPm(|Z(;>Lif$bGaE9x;11Q`#&Tquc1XHC^SG(naRIRn17o$ zD8R3!F<(rxo&XMuApUK^O#IutnbY{!L&d@2V%60Fy8o=h`yVuby#IG~q=G_<8yZmF zj9nd|qt83MnIIw7;m!OKl+L<4Ac>_h5h5- z=Jy|w7-6B7f|^WWq2|lKEsTkOn;$6DE<-{S9BQV}Q1gR@njb9G_@JTY2MaYnSg83i zHy>m3=Wi`X6xGOST#S){p}ParKyEz=DNkE3@wb3ZmT0}r-vU~T)?La2@|`p%1H&%R zneE;GK^d#lS0K&$R4Et#Ha<{_<$Il!)_Ss(3!0JnUI%y202!)%k$)Rs8vptUMc@q0 zBbmm(-d6yU!P1y7?gTAB1n19F-4_qO;$Xgb@D~T@cJxvn{%xlqm3)_oV22pkW^hJ@ zm#48{XSHxJFm!n{wjk{0er?h4^MA21|F(<#+ql#C*Pq%4a<=xTH2(D)G8h>c(wIL& z?fuBV{T#yH4&mm*O#Y=CkuruHBLhS8jv1ht5&jm?<$BFK=0G^0Wk#T2Vc`I^D|nnc zV+D4Cvduowulx0?j=Z-)f%`tLhI_G_Q#Uw^9cAm}Px zX0QhZm@giDB>)as1&9INxA?bR2IUBl=MKK+=;oQozg;AHzDxWqprQtp;z9Q_ zg8Zbz1}^V=3mLorclj|j{QO_42+G5t#P0VWmg+${0W8A!60}~mGb6QnasaUL@wQUZ6}Xya@#k;dfm&9cWq|~5BxA29 zLzg!bQpkZ4J~-sKp&{qZ_!4wJPQ%at{LP>iEC2QhpgNU*+eiLw-k?JD+`T&); z!K`Wg>p{f{8@M>RlxBUcv=W+;Lk0M^-Q?e9#J?@*KU!5Nz`tE2utN-76EcBo!vFl+ z${4X!g#zGWu)~k3BaD%MTNw+eE))P2GCkmOJD3?<(1--S1Pzveax=UF{|`;@+|c?P zRBwZ$4^(f1a#e>nGb|!mUV`&Dv;sHg-*&Romjhe|XrJoz{nF*j0kRSlJe{FGz{MS? zcoPZa-ww_Z{Od!1@UQp%0xj9V5k^YM#=otY2~t#e|3|W`102Or5AtvC0Oc6`R&|Dc zC{=+3KmT@|1!-sK2mWovEM2}Fpe9BzV|VBWnD;tBjUsrU@^9||Wi9-6mJ%+wK`moQ zsU6JH;mzE9m;+WT`SZ7K|BKRC0o^taDYO5;%4}BtZGLRE5Uu!%BD)gC8b-VrnB}ho*LZZy$fA@)QSAh;e{%wJb{M$ScwF@|J!;R>6{R1}z zt%C4igcuRX#J??&nSYxn3*5KhERQgw^iOv!2QFj$m^;E)nvZe#cb5JEjV-huK$LA0 zK%*rjV@6gcR#sMKRtR7LEgjSc4@H88(miL)NSI$i+rdCfgOCS9K}!cgYC$7O za|Iyx9>e78xEL7Jp`&D=rF0Ew@+Y}KOOGL=WFT`&(B#!X3r?Uzub@%1I7S8r6SPq@ zkefhyLG(4uQMCNrg8brC@Hi{Tbc zKo>DZ7cs?9V`7A^#>fm^#Lxs?#K4e&AH{ZaGc*Ac0|sFRZb49x{*h#003B!o+Az$( z2OSj#t$PBU69gJL28G9wV8}9~f|4Sn0pcH^{e{rb0EH`v30k831}a{{!_WX4wJGCa zXaL1~Ee~Wwu!)DE0kq__gNLC3H0a*L!_WXab9e#|Lj!0L(nKDH22eY95)VTIC=*TP zVQ2vDT$#bc&;Z&AF_VX(;V1(G!yF#SE$Z`l7#ct;+2`{xG=NsBFXCZn02MTgc^DdQ zGcYjt@-sAmilNm!3=N=u{5l?n2GG#)S{{Z5P&*972c_ZlJPZv2j0_B$co-T$gU(xd z7#cu%Y8wwj1L!8XojeQ;_KXY+yLlKI+!z@c_VF+@fNm%}z{Ai`%*ep7pNFBLf{}p% z#II*$U^vXf(9p)nz;KL*p`o9Vf#D<%Lj!0c;uH@)9#l*nC!OPIF8FV`%FGIstCI$u`UWSH)PgDNjWgCa8ngBmYGgDx|~--gT#42HZ64HnD{3`V>R4erbg z3?{q`4I#`745qvc4N=St4CcHH4Kd6N3>Lf$4LMMKpj+zfc^Mi&GaHV)3=N@-j4Rgz~pBGcbhkGBn&`W?+cmWoUTB z%)k)E%h2$enSmjem!aV;GXq0BFGB-p>s;SL)B$K_2sZIFf{WrG}N## zFtmaE!@|JO3GxpM149QdL&H=S28LcAhG(n{3`cnx8s4!oFdXM)X!y>`z;Ke6 zp@D&of#DP{Ljxxp1H)Nfh6X-128Q#z3=N>Z+XY^R24gk`hKr!|z{bFE85C}83=CIz z85*M57#ObdGBhN!F)&=`WoT$&V_>+!%h1rn#=vlsm!YAb4dSl(Y!LS@W@BJ@#LLjI znvH?sAumJ20X7DPcf1S@TL79VrL5q)}L7jtvL7R`E!H|Q2L6?uA!Hk1}L6482Arq>;hy&uEG7bg? zGd_lf85|4@mV68i3pf}UEch52HgYg9*zhql9OhtPu;XKBIKjcd;Kaw!@Pvbb!G({Z z;UxzHgF7EX!#fTJ25&xwhVL8<3_g4e4gWb982tGd8dx|P7()0M8ay}|7()3N8vHmJ z7$W%?8VWfX7^3(X8mc)N7^3+Y8X7nu_RiphxMvP014A+&L&FkI28JX)hK3EC3=C;} z3=M}k85lD77#faqGB9NGF*ID@WMIhQV`#X=$-s~gau+89LkS;413wo7Ln$9agC-XP zLm3}K1L)Lyka>1o5c8e57#JG(7#f1O7#Ldk7#a$=7#Q057#b?L7#P|>?%`r!=;UK) zXy#&I=;mW+=-^^t=;dQ*n8d}v(8tHnFpGy>!z4b2hP7M_3{&|S8n$sU zFihiPXxPWaz%U);PA&$9S$qr)XSf&`=JPQ$2y-(qEZ}2kP~~P|SPXI(Hv_{GK8A)k zZU%;>Aa`&xFs$HXXei@mU|0z~n45uNJ0C;Cb8ZHPoqP-pAGjG9cJVPZfVTAS=3{7J<6&Uf z2MQ-128IKC3=NJv3=D_)7#i|;7#NO$!kq_V?iL=1Jv(?97|!!CG~D4~V7LSdXC4NI zi+l_XpzCa}@-Z|B@iH)6=VNFP=Vf5H&BxGS&db1XhmWDbj+cSqE+0dK6E6e9eLjYU zL|z7l2cY!F%fRrEkD(!-mx19iA45YoF9X9$IHO* z29#fT85rL2F*K~_WnlQg$I!5Ymx19EA49`IUIvEGd<+ezco`VJ@i8=<=Vf5{&BxH7 z#K*w!hmWB_gO7pXA1M9tF)%RmGc@$_F)*<3Gc-)&V_;z8XK2{P$H2hD&(Hw6I)ay< zp@AJVZO6~hpw7?0Ajr?qV93wFAjHqmV9pQmw+}xgJOcO`7^L|b8Y1`^7^L_a8dCTf z807dF8p`+?7!>#!8mjpj7?k)K8d~@n7?k-L8hZE{7*zQg8m96yFsSo0G|b~?V9?}e zXaG$UYVk8PY~^QQ(B)@nILyz$V9w9b@QI&+!2;wSP)~rLp@9?Bg6C&w&=p`{u;FKD z@DgBPu;piH@DX5Ou;*uJ0G)O1z|YVyQGkKLk)NSqiU7oY%LO3r1+|QSfhX{HFfcHH zSlkSIpe!!%tSzXo!p-o5fq?Oez|AQl%xIq0qzuvj&e#l_Ic2{0qTF1q_^?BRxA z0;QSV6G0u%85Q1L%hP=PU$4wuPzQ|pck6)?-R^Uc0T=#l z<&6B>#4o?=_Wc7L^?-D-`MZ5NI>H&5e|wbPh7N**7X}1^SJyNj;efaRv_Z29+$98E zcYc+DfdR2T2DwWJI?)4UJ1E(Jd&3c7x~J5-?cQVARXb}x?COvWd>+&DXZ zzu0i_H^+cSB@cM;w}5t?dX!W(zhL5T1@+sSAM$q}Jou1>`9!Dhmu_F4-tzywj{ljD zce=jlb^qV|fbrtHgAbU%%LkZ0YTp12zcMm1Fm%?w>8^bNS}VlAO$;(GG* zEL?{=*qeW|l(HJ%_Iu3=*607<_f6@I?%EG8K{3_s3bNziJ0|829?cJ#nU80m424<7 zyc?8cwQn%r?(_vuj)RgU#45No%phx+xDFk703$#avOz3l2F*x;th>-%`{8v&w<}Nc zL&nULpyBS`^8W|lF*ASg0Q>U;^N(J~|IH8BcY#uh_J!7yB^uo~LH_At>pFGmg$m=h z8&U^4*qeW`m$DjP@_WtbrxFx+pqo6pzw>WnvOZkOdW@0bHS;mX|6NR; zo*j;iUVf#|UZ>g!l%{mYg5sk4@WB@xsvzy1t}pnv9qx2})9uF68~DGM$C3GhXY2nG z>+bvf+noMeyS^wD0Ga9frj#S?xZ{5YhSzK$`v3nfrskI*)Zxg~<@CS9k+Jy|lXvN< z?oy5}H%_Jl9d6t<9LL-^SdO`IG4XFZz~2NK%{};nnScH9_)a$#NC{@c#NP@U&g^y- z0F|_$dZWvav*9O4X>OMXQ-?2imj_Fi16zmh|88HN4%dG$SMCJ6lD`EsfY6o7-F?5; zlffeCU#Uo!>wgQU|D`-#uKz5UP{N`4C3A-(GuWw2T~7bN4rcZ)J^6ASXng6X0Dmhe zi*YvJ^-RJ_ae56EHsU9P_^m~ez8TZbbX*nzBI2eNcI{RKPu4>*i}gPqLgT{^wX zjq|_*CRhlw9dqMi;oo+kNB})_`PUzBKEQtP1v7Y29k|j0m7}217L@9NnSlYcb_`Tx zfJ!`2^#Edn)PfQ*s27ba|CWV;ffZa~Fn}w88)*71SV7eXqU-l^b9a85lqZS%H|KvxMeA#s3K~G=O}{BnVkg$1cdw0NU`& zDagOiA!K7tGlpu0AF1sNJZw=wt$GBkkhbqo+>XaFs14HRT(03DbVBFNAHIuj;Tkf8x| zj!U>8q^gJ%WM}{#0HPf(#APpjH^je~b*E4U`R_IeA+_h6Yee(OwWTYUe1( z&;U9JLr9RJ0d&BNupmPNXk)#IAVUM_PDW8dhK49c1_nVvhK2-21_p6Kh6YfjOwWfGBi{&GBBtKGBk8CGB6|vGBkje5GM*UG)!V- zU`P^VXqd{#z>q4)&@h*gfgxRxp#gM&MiwYs7#SF{1sNK4Gcqvb3NkbtW@KQ<6l7>P z%E-WwFUZhvhLM4xK#-x~JR<``ksw0@=%&bGLCEM|sUSnceMSa`NE# zXwYY3VCWNMXfR=7VCWZQXz*lWV3;b%&=APPz%X49GWvH@kfEV~iGkscAVULac5=2L zLqj_g1H)WFhK7D728Q_{|1vQ!ED&U9n8C!ruuzbpVIC6$!y-_+U}9icEXdHXfr)`( z2`C*v)gNGDU|0t77ZU@+a!@*8VqjP)$k1?;iGg92AVUM_0I@Y7|1vQ!tOKP7CI*I$ zf(#9;%nS^h1sNK+nHdPs~dqp4?q{#zf zae-%6KrC)>;|Ih7H+ewKorXG2j#8_JIu7O%lWsqj?ob})i@hv@)`!Xjy1f2-b$I-5 zKJc%D!}?J9hi*3(<^!E>Ea0WfEXUk91v=cg<6;kk%1ThV>H;btpcr&e9f%1kA3!vy zTm`9vVVGK&Jo0*FP@V+cie`pZE`rPi=?670Z{sKz;|g7zXKqvWaaogBK-( z%0SR|W2jyRko_PwXp#YTlHyZPUSMEgcrM7$06GNX6R50UU|{$x$j|`VviwC5(oFse zN)rqW4BrJA8mt%?7=8*un#sSRWhbaT!VbQL55(eT0EHKb#l`S|fq?UGAL0ptk8Z(4l(UKy6ddQe%%2UvS$L)J+04 zN8|o?U%U9a`4J8*uh6kpw8enP-pN5Xe|UYxVgp;YN~-+otL~{GdCY%@%Jlz z`Vw>+8pI5c=3||%UwYmCH$PzB1*#PezGl+CzAAHTse8YnoZXUc1`K?5$yY>sz1V)ev;KrjjsPX7m`W&=?u9oAN zJ1566cW#c(a+ZdAP7eOocOb90@^t%3^hW$=zSnw^zYlb&U#|!_p>>9S@nXKv`mH3Q zyH=#vlYxI5v-QCm)?-ZnU$b_xSadM)Z{zNE74Yh1@o0X<%)iZrk*ULp86xQ2%i;kN zVeD{X0Z>DBM6J=#*PrQv2#|PfdOVLr~w2DlgmP|1`wpvEyBPp2x?n_rUdg! zbK}8{BXF~bfdNz~D1gRCp!S3O0b+v20YIl3f!L|ghEb*fLjyMh14Ayf&zvv7&;Xid zE)-yBuwh_eST4ZO-~>7mOMsyPbd>5U0fq)pfwKnMM_wxcX&|i=U}ykc!@5BLGF`b* zfT01@5ZfXEnYP?2z|a7?_H(-cLj!2QW~Tr{187a-1OZ5cYN7x`1L$DFNdgQFpv$l( z3otZ*4#t}b?Nd(^U}yjx2sd4TpMh9jVG z1WjuSFf@P`7n~A+OpBfYjX5wfFq{*BOpl%yfHb%+3NSQ)I_sAN7#b2885phzFf?Q{ zGB8{dU}&geWMH@s3KvEOhT8%R4a*oA814u#G=LVzeiLA504;fa3`@57e`?04>Ttz~7R>4BBnN z)f>djzm3PT!|N|-B{zf#UI-3h{`V-o1s#IxuH^xBQguL!#C!$NhVXjp*}8c)gO_=Q zgElC<1L;m)}9UCX)VWZ%f_5Htg#Yy@y#q5OmZ#w-6MrjcV66LdXXy`6+<|g%ugCv` zFPR*>4}vQ_yYBOi4?#VoPTvpR-u9o)UqjDDr(prHjyTvDwEN`gSua5N(*M!f$cVx-}x zK&g4_ff8fTfO_oAIlhAZ!dD;9_5x85lr2 zDA>S*6X-1f(D}Kb8Vyt`fgAy90f6|RIvz9%ehO`v0yNCQ4K|5^0W=!CA59)K%)tn4 z0f5Zeizbgg%<+hUfx!r^1pspsh`x@|0swD91vlkE=7Zb}!Z7!PhOID`MWHS|GBHP6 zdSq;YCSYWVEKcwrB3Yr9C zU|>k+hqMB+`578gL9GXV$cT9!KSKlPXy^idh6d2(<)!?P5poFuh6Ye0znY(+0d%cq z4L?J}Mo<8OCIuN77<%~`8bIekg4BU(&#C;7VT+G%zti%w=O@U^ol%KNADPIevx)P>bpUKV+ET zGCxCuJ5-%F69dC-eujo{CI*JP{0t2-ObiV7_!$~N=e2_Ppkaas{0t3sObiT<_!%0y znHU&e@-sAuFf%Z`;%8{kU}j)=2l5{?1H(stNO$}LKSP59GXukCeuf5bW(J1u{E$UB zKlm9MNrnGR>Gn6gH2`8kS_2>!7r0FcDgn3|K;1SF zi;Dr&CIIDoZU)eh6o|#ez{d#5tVftn><-W=Z!GV!;98cbm=C;3}J z+nsDUx?Oon4ME+P>%BZxpfPtY(4L*|{M(p17(s;Ne=zy4*Yj_0(0{+uXD>lRY`q2l zdrj(kMfQPofSQP)p>;M;|H|!uhtq%lZEPJ*|M<6oIDh%KvGtby?{NA97X95D^sBe* zzjx{Rm!QPm@RNnV6|@luJQEPg~F5KT8%hBb`+2G8@^evmK!JC7r! zj)jk$Aa~Y4N8W>q2~g(9_Y!J-? zS_la(szJM=K}iWD4wH`u%Yzaqq_YMJP7Ac68ssLBdeGX!E0{%fQDS9$Nq&4$dJ?$6 z2AK}S5OcvilEz*j9WBs?QLtVH1_qEDKy1*F(`!K6pBNYzhYchS+Bt8)4H=CwD{h8{Yz77fYi>vp3=%J8U|_K2hD>7GaWgc4!q1+Yp#gMH zyaP9+9F-MJwn);`>j4wx@DWRla5o1p=8 zk~2sgG*KJC&CmcE!wKYOXt=|`z!1dE&;UBQH<+8D0dyK-I5$HBsOpd6W@rG7@Dz1ZiWWXk+kvL3=P7d5oKKfku?M85%Sg85oke z85%%qBT_)&1{z`JW@zwcWMIhQhIFWMxfvQjdzbRL85#;fBh1_k4WKjv;)7xyv<3q* z2@7IDiaZdDivd*efLPoNAbUV8aB+kf)#Bs;jcWbiZw0M)?egaUZM<*z$y8e3dZ47b zJC>*QTZwmP>7VW&-JcPoD8l^PoEiDIc{4RW0vUPm5vwYQ=Du+7C-cEaOwAAFxi9|r z{nN!_)xp*q&D>kY2%5C}(Ot{Y<<8mR4w|)d=U_hO&cz6xwF6z}4$i;FqTz!$4L{lV zTR~%Bpyp>YXp{-;7MJc?0g!V(gLj~k;0PA{j(|>VAvu75{V~YI7P6a|OBK6AMOrVF zNOk*yf<_op95VKLGIp^DbU6O^EB%OPfC#h~7!+UN*&qf6@aQ8bzk|vf&;U_1BV^14 zCXYTq1ZplI>qj0S0_8_g1%)h+K0pNOAef?+IUqNI+yI&)y@OHa6qY9Dm1I_>f(smw z(V(IMgpt_97C4g7p&`&P5OioLJ|{mvyR?8oih)}YHbMlm5+(;8BZibypz9StmV+?J z-5?s|Z_q3fh|MGfDW6z{AOk|2LJZ(V6x>1#;Btyjh@k;=L%4ttLj!290Eq9vz`!6R z#LxgLpM-@VCs&9FF*JBHFfgbILDs2j3o$e_fv!~$VrT$$g}j9r8bB+0B83>hizW<& z7#cu>y2e5b4WM%!Oobrp*g<^II(Bm*h6d0H^%g=54WJX=Erl2wK;?|95TxAj5@Kio zl@}m$l^7WqK<0uDKmqYVYn(uQ&;X3T5JLlKEmWWoLxTq+14FP7Lqh-~14F0~Ljx%O zKhKYnwpr4v1K2_nW}r?pT2^@RU7hu)EV$pv#@3 zTf8&$4`_7;s1WIL=d|G{&FwDbVgB^ZRivSpN36uC`4?lEcyHDJj>!LAZvT7B{x`p5 z>R|LQecxTn(GmH-mqjS;xH}h<0615J=Z0G^m56o!f++5A{NL;OuR{`|9*bfd0sdBb zCI$wOeW2!qNkA`8SV<7bR^8sJ|J|Vi;2rB7k^egaA*~xna8shU>|gUs7LY@pbccdA z_kgw%MgH$_{MX9@+Ed5?b`@m680IRS?q4wT!0jYZJIn1~Z`r>N$A2A>e|tUubO`#F zLe0Zr3}~eRsF((a6@M#eA0x!sh#+$XIbIDCWDt8m4*%BycKF}kvcFJ=KY)cG+`Z5N zZkT&@yMH0dW4Heu5chUCf{X*1)8Pnqv!s71$S5QSBbx&XV9<>cumI)>>NW8Ig>fjz znXZs9o`4a)9gdKunj@&G_NT+~7ymZ5-yM!W`M0_K>Mi@#{E`C{_9xK7{4we;_9R?f{z%GONS!S4ZT}Ue6z((1)7X%L1yK!I8+~fJj=PLKIXf zBRBGnGl7-~KsFwxkq4T7+KDEA0@M$IHu6B`Y(kSq zUzG-GgrGO_KyCu*JH#tx`r5Z4zLV^kO0V6AeVzMIBSC#3`7sd3qs3W zQ0plzGY4d<0JN+H3*{uH7bA_h3xFnx51o5}?#pr>;|3g}r}kcQxFF35=d94>|iP-O@b2Mx^4<6>w4U0pJti=hEDi?V;(B;Dd-XgCfUq32>~I0qV`=Yotq+~s0uc+AMa@Q@2K z)&Mf+8`PX%j0_CVxFBN=FF@hI#K7>Hi=ly^iGkq_7efPRw&pDtLxUt#95e>;o{OPD z8MHx(i=jacv_XlBp+T34f#DMuWXZy3E`|nc(1s;0h6X1l28OR(kR=S?xELDZm>3v- zaxpZdGchpy=VEBc1m!_)2Jl8ECT@m?A|?g~Hg1N7N+t#dc5a4-2GB+&P)C7@fq@g$ zQD9^?K`d?t&?Z|D3*5j4P5FZsIEvY@m3o5b{^h&fojtq9d7I(CR>Lan^)Idthui-yMo^W-=2iL{*+?;vG5>qZ{&cu8gP2SmZcGppLB$KG(1fiM0A+a4 zS|1P%Y88TLP@xG@2g9H>Y#?!%JSZbUidjg{7StoNLu+M%%mnEN9qo1rd!d(^SC(2- zg0vnNWCsj`^g`LhHaEfTM$j}OsHFwf%K&l*hz%NS1r5}L*ngqtoiTDTfS2Affif|u zlHg)!039vJ&IMU-#m&Xgpvl0%Aj-wi0J>lz23pw3ff6fd2`{v8GvH!q0NvjQk_Q!T zW?Yb7t_2rlX|6RW(K0YF*lCDSB~H=4~}k$uyAnq3e=Qs zsNm!%weAjJVGiZ#{sfxW0wo9Vu)EX0F0cO`ZvXkWIsNT$`^Ue{=}&LapANUbpoGNd zU3xb@E;{ybcL6BfcK-uu1x;=uwMzbW`Tg$-``6(Ps_Fl9xP#gzzdPJPZM0tLRtxjI2js1t4|JdGBkk7*dv?_4WJ=}qnr#4lNcBnj&VXp@{e;u7CN5bgbWj% zCc4YX z&;Yub31kjvRQ4$+Lj&ldpJ$v5;02JcI2js1U9NYagB2MW7~X@zg^_{b11Dry=p!gR z7#SEq`av-S%88I#2gHKZIv^GocrXXV;${FXgaom`85~sWgm?FW`fH#gM-G8zk=-g* zGB_|WlyIzY;BNsfQSWxE>8|Bj$soYMP!a@M)>Nv@zr77qj|KeS1{(3}b!7a%4Kz9) z5DqFx7@CiWyw*%>-Um{`P$B>-f|yD;d)q*}V**|?Wij+RGQySebi3881l0y5N-YN} zZO8kU5 zC=r4Phaou#?05wRh7!w_Ad5?lS`JhS!@ORq@~zFEk%57wRJvgwh{2502nH4gkpC-* z@qYtDiNrT|4i;>Nfdhzvr3BLlAQ=`01}rk)+-e+3)c1{w>&aD@O!5d#x8?cdyL z1aR3Wz)%w0?U&MevVDu(JBm}E{X`l8U_Xi(43G6187mvPw*BlQ1R3Z z-qr;wpg{d;5e86I0_xm|fG5I1yWK<>K#O61gLQyP28b!3%RE8Lj6@ioGeRze5n*5i zHP*rER6vWiz{f3nfEwsvG4NRfU>4|1B+!WsA`Ejt13O@`U7&_Pm~|1<6#%ndF)@Hw zWQs5_f>z#w#iT*&^ua99v?8dfEy4iWLM|D|f-NH<=k2YQcWH&&UFA3UV=`RSLq6J+F4Rs^~$gdza=tyeNq9PDGNeD6< zl_~^jpO*?jw#L;9K?WZhg%}#F85kH^gdqDM+Jzv^g)Sk;^1dD+h6d36%Y8x&4HXOw z3=@PHz_Um*g&-6AvxOKMK+S;pLJSR{9j}XpAg7Nk6=G-rZHHVb#Lxh$NLC3kG=SRH zYlRpZI6=$XgdqDDZU{m4C)^c+boTEFLG~wn7J_uzzkuumO%sFcV`O0X3$l-qfq_Yw zq2UlC0|T=#WM2TgFhj##Mg|5BVTJ}!lTkpJp#ii6R8W|q0dz6Cs4!$dfP^qZgEkWb zgOo5sgDDdOgQ_q?gB|FiX<>#2e3w$g&7(^r+ZinGc>GZVqmZphMeZ%D9q3R8Vqt0W@xy<#K7Po%+TshOFNY7G`KrVrF0n2f2@#fgw^Da!N<6FhfHCGXp~$ z$X(0~49UU_4e87b3@IRYF*7h^3Nth`GBYq_3qwxlC>3UC0G-NFF3iv{kC}m?LYSdp zAu|I*l`umCXzxt5Fhj#?W(I~jVTOh+%nYDa9u3Dpd0UvF0W@IOAk5Hk4ax`YBgz(H zXn4%bz)&s3(D06#fnl8xL&HyI1_o(i$o`tU;AZ^{1_lNY3vymHh{XlwgQowv!3V{I zSX>OC70{qDdv0*r1+lom>&QVnR=B}?qCqS!2GF@Pp!o}K2GDE;h{Xlo{|s7Kzzr^Y zK`br?&>RrRHf{#c>4YE_7efi?Oc?O>tf13pAY!52Z<^njgmstlgm;B;82|6A{qgM( zBY!LC9FlK`nD|>j#UQB1$G^S9g$Z;B@eI&NN~iCaouIlw+xJUn>>KUV-Ey72ANaSO zI{1>Q`5_}{aG^8yNvH1%{#MXh7098SouM~C!xo^t068bHGxPyS0MwZV?Ir|w8$nlT zcgEi7s$%St>ZtwSRmIeNh}kOkf2o|+{Zgs!2GDYdPS+o;2TC~kw;k?|{m~^O(INNR zyW95x|F+}J=Nb98@o?~ObN$c1-uFXi?T_x-2mISuEcn;EeqlZV(s94L_6Pqq7770K zu5TI-f?9aY2fKZ59DKpw#lq3;`=W!*t@UIHTNhIYo14>r-#gu|9Q>`hpcQSgPhNu3 zH{7YMObiSlr%H7tF?KnD-Fc^!!|FyUONZQR75;4}Ku+M_b_8xW$V%oD&F2{pzU1%V z>-K$tYE$Xf?${?UL0fLR!N>h|`d$Gwzau~^H^9Siovs%^)0plcfl>iTUm0|+PiO1{ zr2eTG|28+qExo3m_r>Z3ml=v88ce z=#0J5S$c+l`=vDN*gK^LY1X$&wYz;ex*I`@TRUBEv>qrC>*@s6fBf4o^KUzJ`2{H8 zUU9sx;@^JybxpS`M|bHJ{_WtS`np~3bl>9NegUlP;46-9mNx$FA_4sCL%;BEJAC;C z==e~O5K9FAde;xk7rI?<@Nd6?B-IUa30U?GD>#-89elwLGqBtD!ogP@&AvYvyIC6f zxAO#aA3XSiql3M}pRxHkQ*-SLh7y4;whs0#H^vTku+TB4|Gp3STkrn+|G&HT2PmLH z1GJ#!yFWlf4%-<(arwabHvcvQ{%szNT>-3V2cL1Iaf6O~<=vH7!mdV+W$nm$sk=up?)Fc!F&xaq5?sR17J`UM&z`y=5v|Z@P5)Bgs zwKYI(6Hs>-R5yY!=)@t=>J3nh3*v)@D?rQRL25y>%)db=B{9GT7#JANfEzm?S*`!iZ98J zPcKTW1UFegt_QgsgdygFSfEJ{5?U9KO_#8P&X9&LKzr1{<}olZfZPRQgWAnoKrL4W z28LDKkYS4r+>qgkP27-izs=l`;fXEWkXhob+zbt%cFA^bh6a%So!pRxga^4H?TN$O zkS+E{xEUIH7#J9ib2Bu6_Mw8rL90|wfd-!$7#L1-LnbNCax*l5HVWV6W@rGN5^;|k zGVJhx8!~%*l^e2O@-a7Lq2Uv52Jrq!khxln3=Ge?A?=M<+zbt-j0_B~xfvQjr}@3( zhMZ~!5_bX(H*iDRBOgKjU}RwU#Ldv)%gDg+1>_G#28Ms!4B&-{zqlD1>Ok|wJPZv@ zpdl+B25>13GOriZzUG1Khvej8XxI*#Q|4i4*acd_z{Ak62efCOhoJ$~$K>XLEaw;D zVQ9F{$iN`R!_Xkg#K0iI16hzL#lz5Gz{J2H!^6-3s;T5ar>`+FFv#;j2K|+I7#cte z6m@tQ8a6U9FzA8IXJTN`2c4n@<%8NMMxayTm>3w0L8q!QF)*0&Ff`l(wQG178tySM zFj(*~G=TaQ{5%W|pP3jKY(S^0F)=XMgHBZgEeYmfXkcb$U~uMv>_Y^JgC@j0cp&=_ zy?7WJ{FxaTe0Ufd5fo&Ltmz!1g*X|F`^Ku!;f;$di5 z#LU1D&BM^J9%}v(W(I~tkb9XK7*cr{8bIxmG#-YAm&^kKlv{OJmImqx3hy@uQ00a8{yqQ ztPdBffya9VKn0fespgjrnI}O9OCS6x!F&;Pmx_3AJ)`yEqPtyacd5jK4iV^dV~IxE zoQPZyfo2XtnG4h%0MVd=2vp3#FlcZbBo31Yb&|mSE(XY%AfP1}$nx9385E)#G@fV+ zl4OAFodPjIn?_;98mJ%wEgP~z8#e{H31mNL+1YuFf~Yt-F()S%8Zokhw67 zS`>jgH6XX3b!s5D?w}Mqph*bOiei{KAUA;6paK!rsdR%*LU@A41{oL_yrGw__;NBd zNHQ=m_(LyUDTI!l7D2~Ki#Z`nSIRjdg;513WU`?Odie^dBMC_)AQmK%fLM^FVIUS{ zX&8tFP9&fsZMvK|L7N-@GcYg&cT4eaI}jG$8T-eBzXi0w-lN11yvY$XZwgx8;Qhb* zWAj5sP|jz#_)hy`Z^eJ+56r(odmV4{w}3X5LrIJ#s;5+8#hwQx-|G}qXfSjOxvGsO| z3{*2>OC$6=jOX34e?TptP>wDSu44|I99;(wJYeo{;^yCWkbnK*__$6d7Vv5dkW10) zSkRC?NF0;^Kv9XDw1pWMz#}in@}PwUu%r!&&M(mE1DJkLKLwVMLC3y;k_@tb^o0c= z`_RubfVl~@rRyw4(k{&_NKDQKr)iMEAV-5RnQ0p2K2ZA>WCRF<>;}=G>!Cmsp&)i7 z2c(}K!@P(7Y76QoP%x-NIl%k0XgTOp98XbG?fFgYBZe#GW?&x!O#F2 zUCQEsY{$#tfUFYD<6vk29r2UT!O-xGfq|ij12SGv%mFzMp_GH60knH&4F_a3=~@oR zs?l{EknMOII3VRas0f2(T@VYBbwMmH2GI5b5R01u)Q<$Qz*)EXjRa^_8iVoCPS-!+ zB0iRbf15W)r|*mApUnI%(-|2U!uYopbB1?c`*x72M5DV_fPWjm_C@|}{*0ZWZ@RC6 znM|FbA3)5`&@Z6IPTI5I+c~d(fWMNgVx*Ku^jv@ zpjG$H$Nn|{62kS#cpFo?6 zeE%4q1&zcofVTa17qfKxzS#|0T66g~^M~%!pbLC%S|8(Y1}$u#&?V62`{vRs2c^p$ z0spO!6}`taAex2whVeJ+!^QcK`moDq>zm83+>B3Jf9Lo8*dgFxeYofarZ#UD<`c%> zI(=VQA1pRS>d#4l>eGXdIhb#DgADp@e9{eUQ1|JBKRG%$IwBaG4=`D~z9_m9AJ+}? zN;KRry`Ve6KzRravoNx-urRSe05hoF-41GqF@P2?gBJL*FjmvM0nIG2F@ScQ=z_%_FfuUcfmxvP0~A-t zbv1RbP? ztbZzK84~#T7RVeaXm|zvNNA9oKz4)Zb65(*;*89+5^#wKG8q=sFdu-HB{4B@F<1%y z`TzgF7z4&WD753DQMW}IB9E0afDVW@WZ*+Nv)KZTZ$jKLW1waSXnnAvF#|(!W_o;5 zW=SyvXie9f|NsAMg)uNddcKn7PYb1*dIGB7Y)gBHR!I2an5 z85kJuaX^lCe#`+`GW(nZGUxgPTF8RrL3^WLaX>md?>HF1OYVPhFf@QN`yUR-%B%m- zLeicSvQ(B6)J_6*HaHD2 z=W;WEu9*SlVlD=LMg|5=kS`fP+Xg@^E(XxX0Z=~W2Cp{&vA7sOxfO)D!3QXUSX|&H zKPc~VgZDUsSX|(>NuXTJ%>Y_13}SIHfN~_r1>6jv%bP$fa3vC$v7n8S;eRPluj`-x zr5pj^GO789K{%eUBRa4!G#D{3Fo5_Ve}MR)q6Rd6%nrUJ6U5>M zUy=!8K~5wAu^=asfLP!N0&QF8-`)k9jSn;a7M|96vP7l(r}2T-|8+9mvp~~yT|CSU zKmV6-wwx?g-Uq6;9juSnylPCU`TxKEe`8X`|NH;{w|*;SZ%nGG2Mwzg)qFn&T9?4z z0@}~`{TOIz0DlW;nHT@ICeUJ!ULFVLF3^eq{%wqDolT&n=KR|nLCh3TKYyDeQ(9*e zXhHt>W1up-Bo{<8FqNkAZ{GxRr}2T-Z*>vP{{)JxATI1a*Z7d1fuW(2)wB8J2gfx2 ze9&rAhVFmbKR@&5voNRe=buXB|8e3oe?1R#^8o?t<2BE%kJXBHPXhU`;pBfU9wvtl zAEy7-$7(=3x?>N6%8a=dd^%l6cq_2|{yvphN_+ z8`RQe!aDs1stX`1cR+{SK-DsU><6(y-4ReT7R2^rfvnt#Vu7sKiD!WffhDp)YJ+4J z$i|5j7RW{~kUS{ym$E=k*eGLR0N)H-!NSns%fP@;$->Y8I>M)o1=3XSVqs|LWME+E zVSx;V^|3HCfHM3<7KR4U^^TKS7#h|yFfhzufo!Ol#R54YV-5>L185o=#0T|CL40mT z1_lrxw809*2ZiHe7D&?>G^q_KZ9yzZX$xX;fg8*q7B_fn6o>`RRPa+NyW94FhLHZZ z9w^c5?gQ=SY&}`R7YHi`Il6zmc7SnMI@>@BUh8**>DB`!f=E&zb6$%a2b%{fQjdcb zfmmtHeQcnOuC4z|I2-+H7!(*7Ub8o*)qwIPcm)b*`G`!*feMMnG;n5B{r|82Z>L+0 z@qx5X@JgNk+dvj0mBoA@?V#KZ(Ewh=kibyF30o(_0ydYCfuV#OvWSJL)a12x%YjNg z$m$?<{_Sm`Y@KG^2FlW<;%U}xpbTBgm)6+^T7lf?2VP49UHB4K$_}>tH7l6v4y$QC z!t(tPXqgFr3n+qHF7bDQcIbUS1S(icD;xHKDjtE70;oN#Aj!-FptwBvLLjXZY&rjS zu;mzXAQ$m(2fGJD4&+Gw?O-Qj$bsDb{SX5S14~JK%caU_sAGbmjw$up32FhSbstRQ zUk`Qw)E!U}khN)@U?)LEK$fNPukQmHoYo0;P+BLL_nE)04OCL5b%ULf#(%9Xi;;mL zt+Neu7vA?npg87leZ$DW@cj^IWl@RF|81ZI0uH|BBP^{4_*+2>uF)fwzZF!$f|o0K zW9k4kKrnTH)-N>d1D$}!Tq^c|8)%~svNfO!e8B0WfuTeUQ#Yu*?hdQz41EKN!+C5B z4A3~|Z=J}-z|hqPN+!?+W8M2el|qN_-wxj&U45YN>hS&7;rp|z4-`_yw>w>5bol;h zJ;2`wY8iC5feP>D<4m2dU-p5{&FNy1XgN^IpVsaABdyc@UkCq7P#IwJA95uj|F#od zu7CNr9oPj*CEB2?MKADga|d1gbuf+jLK^cm{_TglPaJ&7!F;0I^$Vy^<^PX=8;?Yn z>pu)#pqs;R>iQ4S^#@%Sdm8_G3{4<=_`7`nbi00WZa&Uz9s7d6#~3urSjy2I`lj(w zJ!p<6tmb73E9mH#Hc+w;faJpNxSHl894)u`J0G(!Fnm7@P6ueq+2CQ#$;`me-3AKY zPS+3o+uK09%R60PbhUxv)rP6moqzj0P)u}B15K>*Z{G(B{VoPoHBz0J6!*P zRY8LYB=8q3fMWQ+E~w#uA%+`Y>Tvzj8T!UD^aXz(DDQOFg5m>|O+ZPx_DlDF>kIt7 zpg}iC0%tzd>H49I0hEkEtE5^ElnTI7c$e${mmHu;;CZ0v;NJ#L&*19;`M24C(rp_5 z`d`|o__rNM<6nOwjrnKyG*Dk-2Pm_oG5_G-ejJ+K5B}uf-*&Lu_X~K}>A!B*5B%E% z__sO!M>6a$x?wnt=>u5;o<#rB;rJhB7$cHde^AWo4tkFV>+i_Z6*4YL+ur#f+4RmZ(S|>P5r*(qUaat$11U?21 z5yqFG^D97ZEU^oR+6>hN&roppf{cXcDu`(F5f!MF&9!eBN?f6Cg?R#6A3}{n5(O1D zP@`a?5TiiZ5$d$psnEi#H0JwZP?w^F15)Od`tWbx2P)6H`#|Me>;F0OvnDvK$o8w#u+5oyNzY)>3C&O}AT3r|XLq9Q-ZdwOJsG z_*+2>9ig`Kw}N&h@Na8d0P3o2p9ZpcH>eNTeOmiOx9f}M2j4s0YI+_2cly3*{=rtR z+Ip!@v3ncHWyS}(e|6vN{@-=_l8!;I1G9hW*X~jdux9>kZ3{se`Ly*v{@M#Kttdn47PBw0JvBNE6luFRt5&pl2j3fJ~(SWoOKkg?iO6^HJtSa&N|2r zv-b)+%-&~kv7c};9uAnjpv!O|J~!ZC0B@TSVF-Y;PQh6Z;H+TRNrn{MEO9E=T;1NFc_JyTGR4#WrbOlP9WgT_sf55}I3CJ!1n zWr6lgLFRz2p8<_-g3JS%k3Mb+I)Bg^ZJ{a1O(4A>`V5wyX;Ero3goaxw56sXi$Iou zFvtK94e6F5uEql`H8nIuzT^%pVq}W7>&nl-E%@XA|NrOJ85oj4^H&%Gkj^c5@!bT_ z_zTodklR5_P;asYD*lIs0eq0Q2rEMa$f;tikV9i7SRq3+Qml}PDLGciu2n@=$o>;` zR>+vACM#sjQ=b*G-^7R&vVhcv6>>~~Eh}W~)1H-~0kmhwffcgwBbgO)z;+HRWTL5* z6*93@%L-ZGQO^oF=dpnmvcR;16>_azCo4k(sNp=9m7xKY-xsk$4$xl4%FqBR_t&yA zG=RnoH?T4^fG$1_pC>h6ZmI z1_mE?hK5KM1_l*2hK6(&1_pIDhK5oW1_pgLhK5=e1_nbmhK6ny1_om`hK3m|3=EcR z3=Ioe7#OVB7#dcyFfiD#F*IytVPLRlV`w2Q8$-i8 z76t|vHim|eEDQ{;Yzz(GSr{1H*%%uBurM%qvoSPqure^ju`x98vNABlvoSRAvobIw zfc($Oz!1sC&>+Lgz!1&G&|t#Kz!1X*xi&4BjiJGjm4P9YjiCW_OHim}#> zn~kA?i-UpTJR3uU00#rZ1vZ8T84d=9OKc1csvHaqS3vQ=!N72hjiJGngMr}&8$&}J z2Lr<$Him{~4hDulYzz(aIT#rJvoSPm;b353W@l&s)&A`43=Ic37#QxeF*F?GU|@K} z#?Ww;gMr~G8$-iuQ2hY1pA&SA1w#WDCj-MfHiiZTP6mdLp!nxxVEDqu(BRJrF)xgh zfdOP*1SbQ706PQtnloW`hK4#$1_nuXhK43i1_mK^hK3283=Goj3=MNR85m^P85)*z zGBC)pGc;`BWMEKaXK2{V$-ofI&d~6flYt?eouT0u=-M=Ph6ZLX28MWch6X+^28IN7 zh6W)n28JYdh6V*L28L92h6ZCU28IlFh6YD228K*_h6YbA28Jwlh6Z0Q28JAVhK2+# z28MighK3R@28JSbhK5=$28LpGhK5#9{l?DF&Y_d0Ag`5fZCfN z9o*m(T|q4Hs9m=&N7qEqPONW-SW4v^6CnfKiQqA_wC0_lJ{m(gdt)Mam^-|?vgZ47 z22d-o1ynkJKMraumehVb#8g_rzpW9}Q|I445j5Ts#=m_dXpG0BM8Ts(wD|>7sY>^; zgU?u)KXe~D_=tu1!fTQ2Z=uI#R54z>^2Kzm*^c92Jm$l zS6Lvn^)(jAZqauvkmVsCSRiLcd}e{{{`>(QV+OUN*%?6F1VAjvHUSWeiviT_2eG)p zb9*2bG_~@8HfVN-)qFn$PI^&Yj*>Rar8=+;hQ}NwIQXX@=w$&dP-p0Hlmw0UI*M6> zhk;6UUV`Q$VQNcwK?8{lOeL&5EFF%L4V4lc#VjBLAbMIZRmx$GNj8G6^GNG#+yrWr zRZ0jz2D>{QHA*GGrm>WOjR23CGQioOU4SeNo{~%;H3K7YnEe8Ztq} z20LV`X(KyiRoEs_<;1|ia0pa6fi{7&L$dX8c7_H}_?`w;q6`cSXV@W|zF&eWcLvam z45V@Xo*i;#*GG29s;{r?kcA3A*&&;|f3rhYaWQj1&hTR8U}ykMO>uKDG=T0rgD6d)Ei_)I$xi;Dp?5FrO%!~iOC2|SPvZtxx{5DQXVx^jT_t#o@-d^_k+A_UHVkP+SHBOJyDVh=ah@_@EZJCrb% zVv%h;3EF(p=}`gBWU+^Z85kHq8*tbdKog#z(;P(@Kvk(1c+wa&BM%V+We`w42Bk$% zdIe$79p)e!IUj?nN|0JmJ_U`>q93~q(gRWhx}0w>T0R9$>Bi?n7Gr|U#e#8EpP(xf zco-NMKnoJ`Qd3jnJw054z>5+L?ZSusCDobT-bsf3p!X2`w|n-Srj1ef|f~vXi%{WiV9eCfz~8jpcShiJs>rp zwND38qpLU-dMZtPZhlHCc)b|NR4f=rq=CjPK*0iv2CxyJWhfxWfzC$FFD)r3ErG5# zfedDVq7rn+Bg_Vn+dyoP`(Vkki4hW&EsT)XP%9%OJA#5067(PzB_8Qa%WS zHqC>?Ve+5`2lBRbP|8D=N8XkW$`s&RbdXkQ{sI|}vp923PMmh4;eiGu^^)dAQl%mmx1ydHv{MlJ`jrwoXbGxw{tV_GBSWqa)+#(1o0p% zCqXR8%1Kbe1F~`w#Dc7x1UKElDCH62U0|R(1C!{$83TF`p&}ERIo;3Da5wFw| zl7y`G1l`-r0J~HQqypR$N`+k52{IPsMNqMft`pu+LatpwegwH1Ps$H`XrxmpxD5>mr1Gk+aJw_iXDr|fRTDJ+S>l#lsFt9K**NT7^7l8(;x?LqY z{c0eUUB@)g@{kgq#*?6Nu1>$2xY)yu5C4NILoge(;|x-NsWLEt(>5D8)j$q_0i^^` z(-*l53pzK80o>*Sk&uHJWtJe7hjCIqeA>vrX7KJc&k2Xnc>e-+R;DMPng zh3fzB|NrxXj`WbYCkbpuM1#G30y$>ga&n42lmB4JvIx=@y1zBe*bm z^n3&A@}rl=ATvSwLG&Jww?PIYT2jeH$?=KFpo4!f`Y0e>V8!5*gV8pwpm7mRD)6=y zU(ep6vPItHwVQkh%E)pkFpF54WQNDiVV=}Ef^pp%o+@kRnMBx{HezP zIS4?X0kSv7n1P`IbZMyt14Ba~=$Z-!hK58222d&l4@tQ&Kw4Un43K*Sy%-=P(ja~v z0|SE}17rl+p8;~3F-RPACqftl#NuKAZBGUDO}H7r2ZDiH zIG~FyK>3Fo+{Oa2xWF?spgh10UQG^SaeW^q<$N^Y!%#giX@yw7`3aDg)q!SPel1@M@E(Xx$ z10WVR1L#m(5DQ=U3eh2a^BEWz%<+Wp99-cWPw)m}TtN(8D?%uY=Rw1GAvBDaK*M+` zG>k!I3M7m{EJzrGSX|(c1+lon$H#$K_`+BKTno}R4TI9W3!X4OhBJ)QL01kL#v8?( z#Fym9W1ffrN|n$=iKCTIY?^L@hIcD8ygQ)b-3bkE&=4{tyg@8Tc!OA6;BhSw3o@<+ zVu8aO)T0ssHNRmUDo7(6B+S!%geL%17$gEw(0l|m1q3?x8PsVNVE}EGgs?zk#AiVb z22eYQ0llCB^*2C40c!|@0v*&z0|gO?2HlH_|l1H~I^fo~2PjpTtuQ5M7hQi1LZ5Ki+EiPi&k z(yf>3l+cC>r-4@V;vDBYgUEBBkcEupfiAOxut4=VXj+Ah0W_)y8JPpktS5n6i%AUV zYxjqY{O=-$N4&;T0r+{_G_*4P4#KF~5%Nc4eNkmv)kxWJVxh{X*) z;}*oi5e0N>GJ+Dn4O;dEHRC`52Wm1N#SCxwUQbGboS3F#88o~rq2XNvt!8VX;S4(N z91_kT79^ZOEJ!$mSdefAvB2Tn{3ZZ&V^kIcWa~up5f0G&Q4Tu;L$iO4LvyVR1L$h0 zQn_Hbyz$A-cF@_>t+(qqI(Rr7txwnd2(ykA;qPl?WngHom0$=C=Wi)zf~>A)=>7nn z?(Ho7(78Q3c3=Nq4j^Adv~lv zmx>twHXkv@j?{nr+m57lvpA<&vv?PacDaZ#cCd(bx&G^L5o0ty(CPZ*HFLM?6DRBI zHK)5{1-gAjS`U=6`dk03UDI95VSLFlRHh`L^(22E=yH^9U!Lw-kxt(?6Zp5Wh*=-6 zQRCm{BKP0h`grZPZdab}+BdyC5oz5ll4+gnT`rPL-RHY&MLHaroSF|Zcly4uzFu?u zCFnZz?$e#2Pb@=4>Pov~c|gYk{s)`qDpC{F9V!C3So^hrkqQ#Uw}yJLTJh;Vf92skw# zX6_7q(i!{1I#i@)T6e4f$lEVkZ}azoj(+Oy2SrJz?*rx&oxXSYw{cqgitzV8~9EWOfQ%F}(Ee;Xe{EcOieC>Y}dowXM_U7uLSiqu8)*0FS#o`G)s@c-ZKdO`aj z=s+5Y=vMEobW^=dio$gqH z4#sZR7u~)O96DWJSRdx^kpXYj`_Ns>5e83@$J;>(3sf|{`~lkh`>nI|33z5RIJ~nR zbOkP$(|kk#lyoy7X;83xI!LC2hYOm9zhjO|q0#zd2p*+opm^wq>KsSmwbh@5_xU&~DTGi{t)amzs&)p7Q(l#{ZMb5#Q~c} z2WO_v(kGz7z8=v2mC!HUt`E9-c6GS1bi2OjrR{#n<*E7A||3M~zmQFMuV(xT(&>8y1`XGOg4M@6{qdW8qNE);Rz1#N#D4l_P z+yNRM=oV?}41EDQJQlQ_8P))LiW@eFD-s0Tlh+ARBq4xwN8fK8e9zqJdgS0c=I-O)Z*;nzFh1FR?E8(*(hZ;z z!}mw0>y7SfouyYGcfeSm>%P?;dV=5oM)${q&$x_FcE;}LEZx%S`v!D`)p5{v!t?z8 zhpcb(ib(MLAMTDl(&>7q`(U^4gM$xPxsP>*9_V!4V|=OmCp7c74&o!v;zVzE8RvK>h}E_jLO{aB}u<{-sc} zv)lJgcj$+1*Du|%JGx7^bk|;Rbn<{Ws?+sL^G^l-o)l0{@%_>5dZRn^N_Xi7M+dJ? zuGnP20M3C=I(^Sry9)64oB$=2T8{svFCZ}hnl*}!2c5tIx()_1 zxueIx03L=AVE~mqprIZS2GFUepvy``8168^WM9Hrpo_dg-3}3kwag6QVL}lG(Dp2d zj@hgX3=r0GIBPSU^^cVSeC(7613w$gWFSWOo;6O95tE4R${%xZ@3SJIF*3hL{Rs;X0`n)ENhC(Dp#fB& z{bOVR-=qrSgEjy#GBGrORur)_F*JY2S z)u1zT85tV(GBPj-GeIuQ6J=s(0JTJ=nHU<3nHU&km>3#dL1*+cF*F1)F)%1FF*LL= zF)%1GF*J05&g^GmXqW<3HE69a=A6GOuX(AoS<3=N>|n%+zd4XmIuYnd1tc$pa(0+<*Y6hLS6 zGchzMGcz#6FflZMPHs;Cxr>>BA%%&dAr*AiEED9++AJo9hULr*40%ip4Lg|`7z&se z8V)iuFcdQ}G=R>qEn#A40NrI#%EZucm6?H|jESM)F4P>*In$L)3=PaI3=AOirC1mk zYMB@slvo%T>X;ZBj99?4Q4J0(3=Azy3=M%S3=Ex23=M@W3=F+Y3=L&03=I8D3=I`5 z3=ET)7#gZr7#OB7F*MY$FfdGIVrT$uJ)OnG&;VMbG@FT`VJ!;-!+a)&h65}N42zf; z8qTpWFf3tWXt=_{z_6T&q2Ue-1H(!thK8q5b)czEiCSXdbtHZn0Z2(mITY++(( z5NBmz*v`bzAj`_Yu#<_QL4_6KK0{UphCNIS4c4p>_k%XF9%N!@2x4VmI1EZRtPBh% zm>3$8SQ!{jGBGsdvobK80=b`+f#EDDo>>_f&NDGI%m9^_ObiX64X&3!=?7GjGC{U( zT>*tFD+9w-ko#E~7_Nid&&t4X6BN&^3=FrK7#g0jGBDg{Vrclz%E0g%6who74DXm2 z8id&x7(OsDG-$FhFnnTSXs}>|$UCqxFnniXXh>#bVEDW`>3*Yzz#1%nS|B*cccDm>C+rurV+QF*7v$Vq;(sW@c#MWQXVnpCiu9 z&;TlvLGFlWhq$wvoq<7$nV|tx-pWAxp`a-%$f6$*3o@+*VsSBmP7?sJxEVkVSP%=` z4+R}}@5 zQX>pH6%VsI057^PElw>$?1+s|%L7*qAe*pY93$n5(Dg8&yHIc#3NFaeyZIpZfouW! z0X9RV4Bb1U&cXnSZ3Yb%(5)B@3|i2=E9b#iT!8LU1F<0MSU@bup<^Hx|tI828L|#D5^B*+(7VvI%sGJ zbUXnY189&PG&d>202%@V-N}l5P|OeHWd_LJX%G|CZ~)c)piltOpcMchaZo)8qR|J% zKuiD82gN{Ug7kuRPaVe+)1VDdNT<|;jD=y4wNN&W=mpJFgX(@zeV$rWlwSm!r{;q$ zbpj2j7p10v&vFF08pKZr9Z`pM)e^|9APYe$6PCh7p|LK(0yzs>5*piwz_ATll>%aM zgV%$ASdgXnAQoilJ%|O4ZBRsKF~Wu{!6Q1L0iSMH9*+_kj}ie7{#MXQaiF101_g%K z0$_#%=nyNv8qldW(4!Yhp+jyA-M#|httTtux@$#R|5t?fvRK-JPK2qqKlqS;M}I`O z|M!R5rw%^nzxa~*6omg=``5+y%)bu46gc=^AgyyB=v?^tw9Y=z6(+~p9GMsx7*R*| zn~!j$HSYsSGn9&?HG?%UlyV(!0|{A3cSWPE_(dB22PFm2LMk=}(7vcg-~iiGj&Yh9 zvK-?WGvrA0Ys`>raDy4rHhs#>&;Xjwf5!}IlfGw$Z1nrY3^^D2Gc#m+J~s>G9Oz%n z3=Nj5X9nQ09~93(!tFDI#V0OLS#df#e?7s#lXNq^JNct3=9nD{UYQs z?3I}5t{8fDK1S6CN~@r_g(Npn9|)8Hk?#is*K6SU0z%XBYoJSY)-ynsK5SxuEPdDv zU7!h?u7QkSgIJKF4#a{?%Y#^uX?YL}Ul_BX&Cr1S0LuHIN(t&0(EbH56C?*>pyz#1 zngxl&5EaI|pkcfh8pa2pVSEr8#-Kf1kT3?ZAYlw* zLBbfsf`l=Mg)fX5SU?K^L6d)wQ43HwQ9F#W&3z%KnTr9j@P#uymPr+ZPxeK|Nl$%nrj6Zc9b$QGVELvz{J4sdNB5Iw=2ia zglJ}lMvn^6u5Yl4{*4R}Nm!bPHQ_*Rhc)d$twj(YRIY%Uc_6i*a$^xVtldC+;z812 z4AKKq18TbNM}#$KqhWDQVhQv-%=ulV?=PGoe{T=8|#JA8q@C>>W@jU}WgFXWT!#C&> z%ts6i4WPMWkUYq*AaPJQffj8*7UqLkkPZ!q#l-*`cm}b!!N)s+SX>OwiFxWJ3MrYz z$%#cN3ZT`bnaPPc3Mq*ti3<673eG{!3g9L>LuOuCVoqj?LSkA;YLNoyrp@A##G;aT zaQ`ebH!(d`As-?R7AY-A0fjYaPc&R>QfgX$QK~{oMyf)9pSwavYGO)ikwQjdu|iU6 zYMuf}AA@5-K~82e_|8s++|uF_h2qkJf}Bc)M1}0U{PH{n#9DI&@Ins;uuD=);t>)I zUDWp~uq$Zc7rYIC8=B1~?od?c+3gBId$@zI{Ihn~N znR)37$%#2R#R?_)3dN}<3J5g{iFqkVu7R5ZTI&I|E;A1jPN}dxjj%9;qzyuqzX++*m6@KGUj%X;)JtHWC?Kg&NX}19OUq2oOwB7PW++Ne0+|3>!=?akc_K@r z$QGrhpvdK9CKcqRE2QM77AxfCL!u+Us08A6ZA74JBiRiP3xqU8y+TQ4K`KK)VoqvF zNvc9-v4UTykB>rTo&VVoqiiC}#7^Va6aiOd$=lK}R7kKMx!d1(_A8IWT3gA!3E1 z)RNMoJct=dl_jagw#aL}KsogRXb~C%149C2Nk`TX2L^@%|NsBL?+B$2{zn52$@#ej zdYLK8@6R!S?vr9>a7ar{EYUMCn8?V`01?qkDN0Q)DN6;}0NUrq%m`{VfOrV3my()P znyvyGUItCKFfcPd0A+cE0tN;Ks2Xsw0xAcY8IemKh*G_h)Cy2J1>%9qQf5ZbF({zY z=+gYugW$6|VCI1B0Bn(J5 z$Q(8X5DVEHP>YzE@q++p^ooID)*G=3Omjf4U}pTm&A3GviZGP%t3GBY-U zk}T++5a&-GnC5``vdoO2**2KJL@>+&tutk2OoN&u&}GJtX%6VBGiFB6jlD2)#4yYO z4Hz*qf^NYBxmS6WC@-ctpmPtH86#K_;Uj@z4yez<%m}*J6=cqqj}Ia-%>fPDF*AaW zRe-ri3d0=GL=-clI@Dj`JJ)T&GzXN5nHf8n5blw|FbA|=ikT5~3$zkw!&+jM7N$9% z^|zZ5Xc0l9*iF&<gVLYeVFE`g56Vs6h0~#=78qpm>EGA zyMS_R^Zk>{FwFt2@ndEL&GLY92*^G)40ANVc7cxa2W7GLyCwHA%>fP4GBbj<=ED4? zfng44e1@43w7~-u_42D8ufa42v`v+n5mc1J%+bOy2h?_FW&|DL2x6UKjcUL&2edMq znGrPG04f zNdEE&z%&PRng}!F7bXSk-`rmz-m#5Bhk92dytp%I2Tpf)fw zBPd2d?pb~!CIr(QQ?NOpt<5lhnP8X$T9wYs2-+#r(9{PrBWU{;%p4~Sb3o%*%#2_g85kIzKfH{k{BZ?`p$;RWe0ISw#|^9o zw2&Lr%30ybW{>F}cd#1J)-F)X0~F3~80L6@)xgqo0{=NlOmjf3EL4AaV3-4HX&}M} zdwhYe6=h~b&KF)7=79Q^%#5HF5}=kx*oAY4G2P<}cC!X(wiM(k1_lNn40FK!az;=~ z0Hh>K!|@iTIsRaCKpW*?@#TkM4rrYTGb6|}kea5ZJ*zOy0c}}eW(2L+0;vJn7l2_7 zsN`X01dX3x-H2hDZ*E2vD2Nf}5 zP+)*C_dqCy7`Vt~s0a&Ozo zMNknoxJW%zLIaYrIK)7nU;rIm01^S~0%-!DHV7911qK7?*aEl+ z*v+7WaN!~#Z!v(@mBK|#Kz5yBWMBZ%5R*ZXfg)lGGWszy0|Thn4_0Fevi=>42*`;) zQA9uy#=?T6%LGHj(8!d5VLcZE1E@C%HW_pU0jdZ%wSW%70%ZoU8nC}mL`*@h2d(P_ z_q#!HVG42&=n7r9h#^P>wC)2W0yYO6U!beT;38nVKu3JQML?PuKnMK7MNC0~xQ7w4 z&KYcuk%-VxfU< z8dP1NoXN}xN*5qqp;yKH5V{ONL(vQj;M|L<3$$68nGrOq3DTu4<(!4kl?BxWQiG}s z)N*8I1dS?zbeRB44&uE|hcAT_AEK<5!7?AqzU7=h4r2C56B231!U zI30pUr9gI7U$o3a=wbzBPzDADkQ!87*7f21NF3@@?W=7Cx zEl8Jx!n`zut_r9wkQ!87pbMXw8Nu0>fq`M=x+QlJx;8*{fz+Vt0YEX57+C_*I6?A5Q0z#J}Xz~ZT0R-aL2&f3i28c*D ziU@M)R|-x)&}aZ@U_h8$3e^QtgX$hoZ<3i2rt9K8i5Cc6y--~sHK@AEQS36;QWQq$ z0$rR0vL2)cRTpRhE5feJDL>yMbnS)O1yX~m3siq2bbWHp+Jn$_6{-uQ22~emW)Pw4 z(t%5X2wiWXx%uuUm!J13_9El4Dqm8{8Y%vg=qZvbkHVz zq{CO>^3bhApv5yq=}8E4P*>Ezl|zgNtr~+1fsKal?}rN_%^4%iL=uFqCWWg9&rw6p zM8+b9uDTe!bPcQrVLD>29Ge)15wI18aO)t38k!+=!)CM*BH)D)Xk2uYk&aG-n+;l- z5s$gBA1t4nn3I#A3^5cmF%M%y#N*2oi}E0nX+^225Egi01B3~Z&df`Pa3F`?f=vb6 z2wt+2mS2<$Ilmt)k&+(|@o92KVqRWq4n!wNv^=o@&M8Pt&Mrn4$jmECEh>S_C#4s` z*{D{5SDq9@Bs23eq3c`VEMR4V!~q8f#BRhL^Rkiep1rBF15B%nkAt(Lm#>??&s~~ z>*N-I&<0s2W^Y=Ok!o)m;OA~{3Rx;(^*XiQq;P2w$>+J0o;DEGf%-$5VYRujg zvTV%WG|}D^yl~9k6t2_B#lbbe$JN=_$HxKeG?dk2_9~8!aHYNuZca|#uAbiR4&an) zZwgM!C~BNt96Wsdy&Rn!T^t~*&FoE~it|fL>`n92>`h@ym+Vc867%4uJGnSG1^D>8 zx_cpq8ECbwy(wrJ8j3Y8E)D@ce(qi_9?lL(%hT*lL4|Iyy=h6ly=if3iM=VfUa>dL zgfq@X;Nt1)?}P|r&@wf+J2Ug3kpy0;hS2El;OFY+?&|J~gn%Ll%51J9+czkO~LEk>`jr1W|VMs@^x_Xa&q$abaO}7S(KWB zTc3-YgNsjqtFybCrvqe>oV_V%m7Kk4UVaHA{pA;xz`{wz*(V9bwXS~Nem-8_h~Pog z|1dqKpw)6HZgqBYa0>A9a&q7+N-ky#Q5Ic(U%k51eOYTsd=H%?)>Fnv^ z?BwX_fU*?N-V~$-Ia4`%IJh|adiwf#xWn9nh|x-WQ}7}^P%wg5=^?z}>JZ=-;O^<< z;R(|QYvI_N!WQj;Z3C^^b6|)^F7Chu9YcJ4T24u6acT-fJZRl&j)MUjfQcKYrJ~5d z#7zv$aEPZ_m?a{l;OY%i(jXuiEC~}&#uTr}&2@k%#Z5AB=^L3DC?Ekt6BBa-BQrAt zGbBL;1qDL`12Z!-1qEYEm`nnf4l|VbE9(G81sAuAU#XQi2yDKLHLm$XOP}hcmfdQL&pd}q^Kx#k+F+i3J zfXzc1Tm!iWv~bJ_ss_XdVFv*N2jp%jNDQRJ7es(KP>f9-Xc0pMhB^la1qB6t7gsmO zP@fPVPbVv-($dTny`0P>C0xR~o_@|gp)Rgg@$vBv4)FoW8Nrpg@eT$C4xyE4Mfv5S z`PsQ8PVP>gq1l-^g=H1#8KJ2~8EIAd6&_BZDMh(1&H?#Fl>wP$`DIlZWue)*C1shJ zIhp=Bm4yzDmL|qdCgz4FrUp)iE+!_ZZt(GRa`p{DbC|!6i=U&fYp{|6C=r2{{DV&U z_F!NXoY7PN+0`lr+(M1XDacDVG&8h_DJaU%N=+^)jw#D5E=|lyHaCn3&&)G6iudt! ziVsT7Nlh$HjVZ`WFUri<%TLN;uwt+g1npj8X86DoL*(IRl#sdFcg3nPqwz3@RZ83M#2d1q!wbDyf+T3Lw6Tg0?~&SRe@^0O1rv zI2H=p3bqPlYgAA%GJ)En3$}$4lZ;VKVgRKNP)25B@Dbc83pw~Nia}I#sd~#3wPa?` zW!gs0@a38_D0wW~lWb3F8N9mokaXF$uwKnrF?z$GwfaF~rjmw|x+wD=YK?ru=Y2+H`d;b+iL z3n(wZFlfODvixQc2YM_FC_J`i8Nl8shEX{#-dqE9- z0vo?j&(JhQI=>vWh1P-rw#V^{Bm;P*J?MTs*dXcTJkVliC<8PO4w_B_aX}}JgZyH~z|a6H0BxY#X6&Fh2{DPhAA_YJs9Xiv z^b0&0 ztU#+4A$y)cEXbZG5Q~eUp8>K*fSX}5l*PpWI@$tMG;=d7W`GpZT;K!WK{~h@Kszu& zEH3aeB@l}ne03Fw1&(OYkpQjVO02tGc{<$^x?KfY4}kVYGw{2fXs(N3==6&zf!+pj z+zqrC3%uKkq4@~M@ix#cgdo4h#U2Kg1faCT2J!^>04FvE&@=)_9D7LsYJ-3@gFFnP z(Mtl*Vn>iTOdfPEI;0F_0GEuQW0g(OHqe921SKxe!bC6B!~-7F0$p#PhIxbsNDIg+ z-20e8SsLUJ(1|yh`QU3YLHp!EkqAl&@RSKUAOy1K8JsY{;RQ7r+8K+eR4UB?GnehAs%2x4)Ab3cd$Ier<$ zf~@)lu|S*Sa&kcXra)aE@b)x?w9-7twGu(8i75)Mpu;PmTj)T$!;fx?oR5k!J?J+0Gj0jU7785p`C6az>WbqWWZeHmeXy27gziqN$d zstcrs30%N|$7zwv46p!r&<8R&S)N#w2OrkPY-WI!gCYlVL1|IG{VQh$#?gi-u-Eeh4je)@jRK!A48n#|A3ljsw26YC8EzlJt!Z>>ApvARC zS_}+ApnWiSdes%6#ZuY~3@f0kL_m2O+^a?#MF1^;xTV9uzzfZqpi&B(`#_sK#B~`M z+(CO{kbCJ^%&XL6U|0iHhs!+BiRat&7#Q9`S1RCgA81Lnf&l|V6=>}g1Ekc#=Dq?( z28I>`28J)t^)0x}Yi3|zP%~m+SP3eeLH8r#7?l9suXhoo4!pDqX;cEuza^k!)l3)| z{6Tw97#J8p{S$2N<6vcASZmF|uobkIgMk5bwHO1o_yCpluN@f}xIlX~@c37Qk%2+P ziGjfe+JwR7U(k}hJZA=m{ZMtFY=q5ypc`{8J2Nm;gZ6FUiC@sRm$j}846mT-K&3P` z^FSxP3b`>bECMx?@R$cWt?LR@4Jf~WFgEi*8%|ewFfeQa?a{zv9;gNL#EXGJ0kls8 zPxyg0xM+DZFxWwxNw~rfw3)HMhk-#Fv|odPfdSOC#^yfIhQ_(R3=E;5{TO)M2U;%Q z?$5v=1lp6q09nR{&AbDQ3=ByD3=B%3^?7*A11;qV31VQ_2UQ1Z4PY}5ble?FFayH` zXi105zo12ghe8+_tU-G#K(`m*$RBf<7#MDcF));a_C?@vA1K+agsK6>EeKD$1Fd_4o-l{ieJl(Nez^<`ZlJY247kl( zz{kMAQp~`x1bWsNXxR}~^Eeq8SlSpE{(yRK3=9mQZDrWX7tmtUqDc%4PE#QM0Cf$q znfHf@f#J;*28I{YA?iR?EH?9Mm>3v#&0t_K10PWiTBM16ly?ae14Gel1_rTt5c5E- zO>E|YjxZ~j$H2e@>Sr=AFo3p%VsqaMRtAP;OBfjXRzb`IZMMc{-ZBOT29?ze45vUD z8Bcu)TKM^5H3P#DXfq90{s0|D{B11*!^w3JdvTQqFBlmZyw@`@7=w`M7 zJ_AGX1N`QJs*R-}H4h=`aOF49QF?L@85qhyCpaSe7p)%v8sb_3RRb{*lrJ%7r9kQq z5}^(hez%BF2WoDOjr^ZA7SZ zWME);ilNQ{WA+b}UerLRHWBbIsGHzVggQ`rs(}b~p#ESx5$ZrkB`hUE9jJS9mI!sA z_V|Ay)Pd5u4d`SSBErR<2z8)#b^#IUKpeGUhZh0= zf);su5}^(>(3?kuI#4?3CPE!3J+H)2hnb#1{mEAt>M-*!Xi9_^v@@H4e?dbQhD53h zCqf;_-dZBmf&8(M2z8+NI6|blmqe=L15Ym^0tVY^08qVbOoTd+KZ1x*2bz;8B|;sj z-0dMk9jM$`ON2U5d-5s~>Okq>4-x7>{!oJL&4vacw(tYB(=CZm2kLJm6QK^&zbYX@ z9jLx+Cqf-)EP4(R>Oki0AwnH!`0XMQ>Okq`4-x7>>0Tam-90pnK@_%d2BiZRBGiHE z)f^(!fy|ptggQ`tc^Hej;kQ}_w0YN)^3^h_i7AvXmjO*+gF5Qc47`G#pe7_JS%4P> z6bHFGLD!c{G4Ki|!l#G9%X2}JNr}a&3?PkbKxG@M#+1~Yl0*hs1`fejp^!xe;I)sS z6@Dq8mFOi!`8kB7LAQK^ChS2YyaJ3({MMJ&blv^#HOb%$pX{QokSSyV#)q5sUC~p_ zi;kOlK=T4;ggpaz12xDspq?PM6+WPIp!H1YMTxlzpyj&73K|s_W|}d%@RdoBMNSIEC8a5u`3i=HdIm9N z$uXIE$vLGdsWGWVMS1yp8Q9kU5VO*S$Q48sIx@MaBqcSicz~87p)DW+t$reBHI#yi z5voZFDnR1}gkdy%MU|lu6)b}|+l1;S!GnkzA%f~i45O(VA~<5!(2NRU zM96HoPmBzxU>o%o-l3X=5dqX&(+3X#Y9t#-Xj9)LxFe~U1E~_>kbD9+3LZ~J)XU#^ z42K7c5jBDwlH{mw61+U6O5~xs64PvW6i}u3fW)r_H39|AD7ZT66g&#d zsh2L{?!+`49!}=eOP5r1Iov3O%W2?FOvB;9VnK~&2{dU^BekFz1$U<@HBt*f!{M38 z6dntpJ}+qfDriT-7Fh;{B@7JUYx}qvRzO)?44_HDPDTa>Zib@_3=AL^7XxV0sS7Ly zn%V)exWH@rX}Oyr$=lt9A=x9ymm%HJ*O4L9**Sor*vT`50n|Nb2^8e@H-+XSEFR52n9H61tF(eT#NDnu|I1V|4}i{kf-Hh>KElDj{XiV( z77(5|{_QN_H8)@$L={vf_HZ{Fs3*?Q&G6p)T?1^yfO=gC z$V`x45ZwYAmzWe~Zk(j_13|-taFB-PHj)s0F;E z9kluryw)4EuLHF959VZ$-$87UyFnvFAa*qy186x5Lk$~4186-&EgM4v=wO+8Hpq2X zjcg1Jphf&mYzz&cdHhy3$n_{4Yzz&c@uRtHkn4DR*cci>%YQ(8(CYHZYzz&cBc4Ef z(E1w?AC%ree9-!%8Egyjxd9Go9Pav(7-@D+KWw8zZ=T6O?paWU)# ztyTf61LbOaMg|5hhI0%I44{KNxxtr7gIHV)pb215+T&&bO#^~hT;NO4K&g-$ysr$z zf^0zmrB=um1Q3ghL4XmGM!6Y4c>t7JxfnoKDu7(Y%>cT-55xj*RS52m

Km{=W}& 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

    F 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�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 diff --git a/vendor/libpng/lib/x86/libpngd.lib b/vendor/libpng/lib/x86/libpngd.lib deleted file mode 100644 index 96c2cd906bbdd8b20da12ee7558b88b8e64bdff7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1236906 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

    Mc5CG~8fvQd9 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%0A1KE#|3E)D{wJ1fM&>*xF9#q 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%0Dp#Om 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

    YxWv{vUBI5mQ{xIlVf zpi})I#R_P~2z2-`8v|$@9<%`mdv6PL)&s~{uoSw=0CgE8XxEc1TB8D_2b4lV^c7qw zG(N2~FS#T$KM$N#K~{iDG*GSw6(=CCLW&%;!@2NtLA$CzcId1|Bt&cFr*d0`$M1{ z1FCkR4rT!P8I)r{O-)e60}?lb<`{E9$Ps`Rf{>Gf>;xfaci0O;P9$&^gq)$}D#*|P zTGHtz$j|`VyyYnfx!}@U5OOksk01kh`*fHfLj$Pa9xe#EG(AF)p#gLURq+DyYnYWum z0u7nE`!xfjIZVgOwu4N7a=4Eq@v7(gs81~EqP1{?-%2GEu&hRA}11N*RR@;K28FX_5 z$RD5t2;yTqYy-Vk2I&E16;P(0gqBr6SE^*@WtPN4POAnP4ay>*>;b|cDiJ zf|4}yLY|4x9eI-&A(ysHgC2f0oe|REpUDWR9A+~@?%A3P+Cj&_z%ZYYp#jvkSpYo@ zYY8Ld29BlBLpDHD(2%4EVnLE3hy^)h1H^(HvH@a2lMX0Mz)1&vA`DcsmokC2&4V@- zcY5Gk$Ou|T1~Lc~j39rbx2Qln*$vTJR3JT|xYK7~V3>v;cbO&enfc(N4P-0`gNy~m z2#7|FH{`|mpkfB33SP|k3xeVUxl#t%3yKfqN_hfwQR8IjqQ)sq(0BpuR0CbA1KpVh zx)lKuz91GPd_gS8>TeJWvicjuf`%_>E*l)apfxSXhnO_iiZJlE%mm--%EJIUtU`dH z6m&*6BwvE-x!3itt3N@ulL@+h0kH%?XP$id#1G|)eBu}I{ql)F?!+g4K@dX#q$~pD zHwM_&Ggx-M8w)xR1uO+V0i{R*<$RPP!B6};u3x%+IXW33mNP*c+#oL?)vKV64rJFD zsOtpTH8zcbfdO(33TWLOd|N-~ET z7#NPCCYjvQoRrKmaEbw$3Q92`lR;?#WI80pfcj0KBwE74z)+N03|@x^QUO}BoCqG` z0Oco`Z%VJ8aR%m7-_2}#Z% z79=@?SX|(9RzNIn2GAiFAQl$`sF49;af9#q0gaH9{Dv^RlS*y^gu3=9k)CxMa+C=Su< zD$o(K=yerH4=C}1=wsLtZ+v-T5u`Z>G8&YEL1`0&K~_LgF#h%%nk=khLmu)2rBjfR zpd?Lfk_U~BgX%hv9%vwgYdXx{Dadc2#EslLm51)6QR0P+Nh$L}Zk1Byg(PA%UP$j$ z9hxX@;fqm0EJ&gRvA7sOi{?Oa!VSK^8N}jZ03C@5iZN~m(4abq#l-;HK?jOsZg3MH z#Nq-s(?O(6rfSOL$ppzxfoH=vm^J?f>KCnZhKt=8gP@PyS z(^$)K_TT^iwJbN^y)HcN3Yu?W=yv7!egiV<$WRxFtmy`*bNqm@1a$nA>kClveFJP3 zsPMf3=YmvS`~fwf{tWm?G$DjBaUh+7t}pJozJLy4f`uEYSKQpcw>xw7v*P4=B-st{XUrnrI91%MA^{1un=?P;vzg_=3_F z$Z$w<1@#@k1ug>vLqUEy^irD_|Ns97m6IvpA{UXek~2}e51=EpK*zT+Fo37OZ$P!> zf^s?9dArCZEXd8EM2K9%KH!23kv!yroNo4r3v$Znb1sGkP%q^r7i4eUD=r4miTVt0 zxfmKiR)64vTy^%Di=hEDvj2q(vNG!{7efOmIezDY?D_r41vwA!FBd}tD6IZ*L55nw z;E5T;f+S`Tiwk_(Er`XST%|Xcu z+(-cJJ_oe}z>Ne_S_ERCLf=FL1fWqBNQ(e;Ei9x( z0Gc_4vKU z1TFA_c_FoRC@(_;=mf$rUdRb~al8x-Aos^Z3&3!AngOvOX$HjN0uQZ%SlkSt>1+^- z$n+t=3vw`|nHT|PLmG!XDmWX5Bqs$ca1jLRdqR=|sLc&Y3V!g$A*eeJNeZ9EUlZV(Hy z_YA~>>^%dq2t_xjekv&eZ{o>=77fTz5AGp=52ql%(?C+X0Hp>yaJm2;W)4Xgpg~bc zx&RdnkRk$fTP7r3fCgl6r;Bw2iU`n_A@p_^NDnAofU@c-T3lB;)RR@Wb;CXwsLqOSN`VlGBiwN zU|`7SgY%@vk5j zIl@_2F;IyuEN7V#|CRFBM&Bk8@Zt215hariWU$C*#(L&Vi%AH;$LKZpex1q87mqkte5p`Zq3?Nas~|Nj5~|5~uyl>@v66+ZrsEyO{g zAq5U`P?3c@#6gqH_(B|1XrXT|2k8NYIB3phA+`{&DlREXP0R(Cw;;no7!-V{l`q~< z2UQ>-Eg%fC4;1R4(F@p4)J4$UaEqBC0)4DSPnX+i-Cb*1$3-U7@m1REJ(D0Sdg(c5DPNa24X>@4b+$cms1j;zMK`J zF9*sz{4Jnuf1tXtrn#ZcID}81sT!Z3nCjIf)+J_7QA$YGD2t1K{g=`iGdEdIs+cC0u6A3Ruzgc zfKG|VUG9Sl1&|@I0tNku7EmTOM;n0!=>erQ(9Amc%3@Fwh1@m*s%MKc)8j!an2N#W zKFDxTVgn^}P%;9mWne&BjD}p>f|jI%RDse$UTH4W9B>^B8E6940Z=2rtL#820eLZ$ z473)OXMofP3Jj1zd?g0Re4#P}WB^K)fuRB9el=(<{SAIQD2N4#c@PV-90J6GEQbKG zps@@(+Z7zkI-r6ERMA4`+d%VtklR6zxqj$8=K3+zL~| zsbj9+xtePQILbJWy9$7U|1~%0Dw<-}<`e&4+cekmu$O_EhTX0_%&r2>KRC*`cYxGs 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 From 1dc0ecf563089715ee905e37184f79e15693569d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 2 Jan 2020 05:06:05 +0100 Subject: [PATCH 002/361] Update Readme --- README.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/README.md b/README.md index 2534839..61e911d 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,21 @@ # Spectre 2D Engine A simple 2D Game engine from scratch! + +## Compiling + +This project uses [bam](http://matricks.github.io/bam/) build system +(Version 0.5 or greater) to compile the engine. + +Just running `bam` in this directory will start build the source. + +The build will produce `spectre.lib` in the `build` directory that +should be used when linking. + +You will also need to link against `FreeType2` that is located in +`vendor/FreeType2/lib/x<86|64>/freetype-s.lib` (or `freetype-d-s.lib` +for debug version) + +## Author + +Henrik Hautakoski - [henrik.hautakoski@gmail.com](mailto:henrik.hautakoski@gmail.com) From 2a111a237d49b6e07a872681acfdbe39ae12b8e0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 3 Jan 2020 20:30:08 +0100 Subject: [PATCH 003/361] Move OpenGL headers from API to implementation. We don't want to expose any OpenGL functions to client code. Because if we do, there is a chance we break client code if we switch implementation (Direct3D). --- include/Spectre/Graphics/OpenGL.h | 7 ------- source/Graphics/BatchRenderer2D.cpp | 2 +- source/Graphics/DefaultRenderer2D.cpp | 2 +- source/Graphics/GL/CheckError.h | 2 +- source/Graphics/GL/gl.h | 7 +++++++ source/Graphics/GL/glad.c | 2 +- {include/Spectre => source}/Graphics/GL/glad.h | 0 {include/Spectre => source}/Graphics/GL/khr.h | 0 source/Graphics/OpenGL.cpp | 2 +- source/Graphics/Shader.cpp | 2 +- source/Graphics/ShaderProgram.cpp | 2 +- source/Graphics/Texture.cpp | 2 +- source/Platform/Win32/glad_wgl.h | 2 +- 13 files changed, 16 insertions(+), 16 deletions(-) delete mode 100644 include/Spectre/Graphics/OpenGL.h create mode 100644 source/Graphics/GL/gl.h rename {include/Spectre => source}/Graphics/GL/glad.h (100%) rename {include/Spectre => source}/Graphics/GL/khr.h (100%) diff --git a/include/Spectre/Graphics/OpenGL.h b/include/Spectre/Graphics/OpenGL.h deleted file mode 100644 index a999a76..0000000 --- a/include/Spectre/Graphics/OpenGL.h +++ /dev/null @@ -1,7 +0,0 @@ - -#ifndef SPECTRE_OPENGL_H -#define SPECTRE_OPENGL_H - -#include - -#endif /* SPECTRE_OPENGL_H */ diff --git a/source/Graphics/BatchRenderer2D.cpp b/source/Graphics/BatchRenderer2D.cpp index bad2251..0d3161a 100644 --- a/source/Graphics/BatchRenderer2D.cpp +++ b/source/Graphics/BatchRenderer2D.cpp @@ -1,12 +1,12 @@ #include -#include #include #include #include #include #include #include +#include #include diff --git a/source/Graphics/DefaultRenderer2D.cpp b/source/Graphics/DefaultRenderer2D.cpp index 8076d47..112854e 100644 --- a/source/Graphics/DefaultRenderer2D.cpp +++ b/source/Graphics/DefaultRenderer2D.cpp @@ -1,8 +1,8 @@ #include -#include #include #include +#include namespace sp { diff --git a/source/Graphics/GL/CheckError.h b/source/Graphics/GL/CheckError.h index 192ac5f..0ed7f3b 100644 --- a/source/Graphics/GL/CheckError.h +++ b/source/Graphics/GL/CheckError.h @@ -2,7 +2,7 @@ #ifndef SPECTRE_GRAPHICS_GL_CHECKERROR_H #define SPECTRE_GRAPHICS_GL_CHECKERROR_H -#include +#include "gl.h" #define checkGLError(expr) do { expr; glCheckError(__FILE__, __LINE__, #expr); } while(false) diff --git a/source/Graphics/GL/gl.h b/source/Graphics/GL/gl.h new file mode 100644 index 0000000..287d8bb --- /dev/null +++ b/source/Graphics/GL/gl.h @@ -0,0 +1,7 @@ + +#ifndef SPECTRE_GRAPHICS_GL_GL_H +#define SPECTRE_GRAPHICS_GL_GL_H + +#include "glad.h" + +#endif /* SPECTRE_GRAPHICS_GL_GL_H */ diff --git a/source/Graphics/GL/glad.c b/source/Graphics/GL/glad.c index 8ae58e1..9dc2931 100644 --- a/source/Graphics/GL/glad.c +++ b/source/Graphics/GL/glad.c @@ -1,7 +1,7 @@ #include #include #include -#include +#include "glad.h" #ifndef GLAD_IMPL_UTIL_C_ #define GLAD_IMPL_UTIL_C_ diff --git a/include/Spectre/Graphics/GL/glad.h b/source/Graphics/GL/glad.h similarity index 100% rename from include/Spectre/Graphics/GL/glad.h rename to source/Graphics/GL/glad.h diff --git a/include/Spectre/Graphics/GL/khr.h b/source/Graphics/GL/khr.h similarity index 100% rename from include/Spectre/Graphics/GL/khr.h rename to source/Graphics/GL/khr.h diff --git a/source/Graphics/OpenGL.cpp b/source/Graphics/OpenGL.cpp index 55ecee9..6a1e6ff 100644 --- a/source/Graphics/OpenGL.cpp +++ b/source/Graphics/OpenGL.cpp @@ -1,6 +1,6 @@ #include -#include +#include #include namespace sp { diff --git a/source/Graphics/Shader.cpp b/source/Graphics/Shader.cpp index c1827c5..6fdee60 100644 --- a/source/Graphics/Shader.cpp +++ b/source/Graphics/Shader.cpp @@ -1,8 +1,8 @@ #include #include -#include #include +#include namespace sp { diff --git a/source/Graphics/ShaderProgram.cpp b/source/Graphics/ShaderProgram.cpp index 79da3c4..c8baf0b 100644 --- a/source/Graphics/ShaderProgram.cpp +++ b/source/Graphics/ShaderProgram.cpp @@ -1,8 +1,8 @@ #include -#include #include #include +#include namespace sp { diff --git a/source/Graphics/Texture.cpp b/source/Graphics/Texture.cpp index 954adf7..ddf8397 100644 --- a/source/Graphics/Texture.cpp +++ b/source/Graphics/Texture.cpp @@ -1,7 +1,7 @@ #include -#include #include +#include namespace sp { diff --git a/source/Platform/Win32/glad_wgl.h b/source/Platform/Win32/glad_wgl.h index 446e880..daa6c29 100644 --- a/source/Platform/Win32/glad_wgl.h +++ b/source/Platform/Win32/glad_wgl.h @@ -29,7 +29,7 @@ #define GLAD_WGL_H_ #include -#include +#include #define GLAD_WGL #define GLAD_OPTION_WGL_LOADER From 8b96338e24c286c06a99e8194f873bb3f73411cf Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 5 Jan 2020 23:20:00 +0100 Subject: [PATCH 004/361] include/Spectre/Graphics/Font.h: Minor typo fix. --- include/Spectre/Graphics/Font.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/Spectre/Graphics/Font.h b/include/Spectre/Graphics/Font.h index 17b5e4a..5caba40 100644 --- a/include/Spectre/Graphics/Font.h +++ b/include/Spectre/Graphics/Font.h @@ -1,6 +1,6 @@ -#ifndef SPECTRE_GRAPHCIS_FONT_H -#define SPECTRE_GRAPHCIS_FONT_H +#ifndef SPECTRE_GRAPHICS_FONT_H +#define SPECTRE_GRAPHICS_FONT_H #include #include @@ -77,4 +77,4 @@ protected : } -#endif /* SPECTRE_GRAPHCIS_FONT_H */ +#endif /* SPECTRE_GRAPHICS_FONT_H */ From 5c4eea4ae1ab0aab6b2948a1c04eb523abb9a0ee Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 5 Jan 2020 23:29:43 +0100 Subject: [PATCH 005/361] Font: rename Driver stuff to Engine and move subdirectory --- bam.lua | 6 +++--- include/Spectre/Graphics/Font.h | 4 ++-- source/Graphics/Font.cpp | 14 +++++++------- source/Graphics/Font/Engine/FontEngine.cpp | 16 ++++++++++++++++ .../Font/{FontDriver.h => Engine/FontEngine.h} | 10 +++++----- .../FreeTypeEngine.cpp} | 14 +++++++------- .../FreeTypeEngine.h} | 14 +++++++------- .../Graphics/Font/{ => Engine}/FreeTypeError.cpp | 0 source/Graphics/Font/Engine/FreeTypeError.h | 10 ++++++++++ source/Graphics/Font/FontDriver.cpp | 16 ---------------- source/Graphics/Font/FreeTypeError.h | 10 ---------- 11 files changed, 57 insertions(+), 57 deletions(-) create mode 100644 source/Graphics/Font/Engine/FontEngine.cpp rename source/Graphics/Font/{FontDriver.h => Engine/FontEngine.h} (73%) rename source/Graphics/Font/{FreeTypeDriver.cpp => Engine/FreeTypeEngine.cpp} (91%) rename source/Graphics/Font/{FreeTypeDriver.h => Engine/FreeTypeEngine.h} (58%) rename source/Graphics/Font/{ => Engine}/FreeTypeError.cpp (100%) create mode 100644 source/Graphics/Font/Engine/FreeTypeError.h delete mode 100644 source/Graphics/Font/FontDriver.cpp delete mode 100644 source/Graphics/Font/FreeTypeError.h diff --git a/bam.lua b/bam.lua index e165506..8379d00 100644 --- a/bam.lua +++ b/bam.lua @@ -154,9 +154,9 @@ local graphics_module = Module("source/Graphics", { "Texture.cpp", -- Text - "Font/FontDriver.cpp", - "Font/FreeTypeDriver.cpp", - "Font/FreeTypeError.cpp", + "Font/Engine/FontEngine.cpp", + "Font/Engine/FreeTypeEngine.cpp", + "Font/Engine/FreeTypeError.cpp", "Font.cpp", "Text.cpp", diff --git a/include/Spectre/Graphics/Font.h b/include/Spectre/Graphics/Font.h index 5caba40..8a33b50 100644 --- a/include/Spectre/Graphics/Font.h +++ b/include/Spectre/Graphics/Font.h @@ -12,7 +12,7 @@ namespace sp { -class FontDriver; +class FontEngine; // TODO: Fixup this api :) @@ -65,7 +65,7 @@ protected : Texture texture; }; - FontDriver *m_driver; + FontEngine *m_engine; mutable std::map m_charset; diff --git a/source/Graphics/Font.cpp b/source/Graphics/Font.cpp index 2f76461..a2ca857 100644 --- a/source/Graphics/Font.cpp +++ b/source/Graphics/Font.cpp @@ -5,27 +5,27 @@ #include #include #include -#include "Font/FreeTypeDriver.h" +#include "Font/Engine/FreeTypeEngine.h" namespace sp { Font::Font() : -m_driver (new FreeTypeDriver()) +m_engine (new FreeTypeEngine()) { } Font::~Font() { - delete m_driver; + delete m_engine; } bool Font::loadFromFile(const std::string& filename) { - if (!m_driver->loadFromFile(filename)) { + if (!m_engine->loadFromFile(filename)) { return false; } - if (!m_driver->setCharacterSize(22)) { + if (!m_engine->setCharacterSize(22)) { return false; } @@ -56,11 +56,11 @@ void Font::loadChar(unsigned char code) const Image img; Font::Glyph glyph; - if (!m_driver) { + if (!m_engine) { return; } - glyph = m_driver->loadGlyph(code, img); + glyph = m_engine->loadGlyph(code, img); if (glyph.size > vec2b(0, 0)) { diff --git a/source/Graphics/Font/Engine/FontEngine.cpp b/source/Graphics/Font/Engine/FontEngine.cpp new file mode 100644 index 0000000..f672f7e --- /dev/null +++ b/source/Graphics/Font/Engine/FontEngine.cpp @@ -0,0 +1,16 @@ + +#include "FontEngine.h" + +namespace sp { + +FontEngine::FontEngine() : +m_hinting (true) +{ +} + +void FontEngine::setHinting(bool value) +{ + m_hinting = value; +} + +} // namespace sp diff --git a/source/Graphics/Font/FontDriver.h b/source/Graphics/Font/Engine/FontEngine.h similarity index 73% rename from source/Graphics/Font/FontDriver.h rename to source/Graphics/Font/Engine/FontEngine.h index d222fed..c17773c 100644 --- a/source/Graphics/Font/FontDriver.h +++ b/source/Graphics/Font/Engine/FontEngine.h @@ -1,6 +1,6 @@ -#ifndef SPECTRE_GRAPHICS_FONT_FONTDRIVER_H -#define SPECTRE_GRAPHICS_FONT_FONTDRIVER_H +#ifndef SPECTRE_GRAPHICS_FONT_ENGINE_FONTENGINE_H +#define SPECTRE_GRAPHICS_FONT_ENGINE_FONTENGINE_H #include #include @@ -8,11 +8,11 @@ namespace sp { -class FontDriver +class FontEngine { public : - FontDriver(); + FontEngine(); void setHinting(bool value); @@ -32,4 +32,4 @@ protected : } // namespace sp -#endif /* SPECTRE_GRAPHICS_FONT_FONTDRIVER_H */ +#endif /* SPECTRE_GRAPHICS_FONT_ENGINE_FONTENGINE_H */ diff --git a/source/Graphics/Font/FreeTypeDriver.cpp b/source/Graphics/Font/Engine/FreeTypeEngine.cpp similarity index 91% rename from source/Graphics/Font/FreeTypeDriver.cpp rename to source/Graphics/Font/Engine/FreeTypeEngine.cpp index aa953c4..f5b857e 100644 --- a/source/Graphics/Font/FreeTypeDriver.cpp +++ b/source/Graphics/Font/Engine/FreeTypeEngine.cpp @@ -7,7 +7,7 @@ #include #include "FreeTypeError.h" -#include "FreeTypeDriver.h" +#include "FreeTypeEngine.h" namespace sp { @@ -58,19 +58,19 @@ LibWrapper::~LibWrapper() } } -FreeTypeDriver::FreeTypeDriver() : +FreeTypeEngine::FreeTypeEngine() : m_face (NULL) { } -FreeTypeDriver::~FreeTypeDriver() +FreeTypeEngine::~FreeTypeEngine() { if (m_face) { FT_Done_Face(m_face); } } -bool FreeTypeDriver::setCharacterSize(unsigned int size) +bool FreeTypeEngine::setCharacterSize(unsigned int size) { FT_Error error = FT_Set_Pixel_Sizes(m_face, 0, size); if (error) { @@ -80,7 +80,7 @@ bool FreeTypeDriver::setCharacterSize(unsigned int size) return true; } -bool FreeTypeDriver::loadFromFile(const std::string& filename) +bool FreeTypeEngine::loadFromFile(const std::string& filename) { FT_Face face; FT_Error error; @@ -103,7 +103,7 @@ bool FreeTypeDriver::loadFromFile(const std::string& filename) return true; } -Font::Glyph FreeTypeDriver::loadGlyph(unsigned int codepoint, Image& img, unsigned int outlineSize) +Font::Glyph FreeTypeEngine::loadGlyph(unsigned int codepoint, Image& img, unsigned int outlineSize) { Font::Glyph glyph; FT_Glyph glyph_info; @@ -163,7 +163,7 @@ Font::Glyph FreeTypeDriver::loadGlyph(unsigned int codepoint, Image& img, unsign return glyph; } -std::string FreeTypeDriver::getName() +std::string FreeTypeEngine::getName() { return m_face->family_name; } diff --git a/source/Graphics/Font/FreeTypeDriver.h b/source/Graphics/Font/Engine/FreeTypeEngine.h similarity index 58% rename from source/Graphics/Font/FreeTypeDriver.h rename to source/Graphics/Font/Engine/FreeTypeEngine.h index 669cfb8..fa90b26 100644 --- a/source/Graphics/Font/FreeTypeDriver.h +++ b/source/Graphics/Font/Engine/FreeTypeEngine.h @@ -1,20 +1,20 @@ -#ifndef SPECTRE_GRAPHICS_FONT_FREETYPEDRIVER_H -#define SPECTRE_GRAPHICS_FONT_FREETYPEDRIVER_H +#ifndef SPECTRE_GRAPHICS_FONT_ENGINE_FREETYPEENGINE_H +#define SPECTRE_GRAPHICS_FONT_ENGINE_FREETYPEENGINE_H #include #include FT_FREETYPE_H #include -#include "FontDriver.h" +#include "FontEngine.h" namespace sp { -class FreeTypeDriver : public FontDriver +class FreeTypeEngine : public FontEngine { public: - FreeTypeDriver(); - ~FreeTypeDriver(); + FreeTypeEngine(); + ~FreeTypeEngine(); virtual bool setCharacterSize(unsigned int size); @@ -31,4 +31,4 @@ private : } // namespace sp -#endif /* SPECTRE_GRAPHICS_FONT_FREETYPEDRIVER_H */ +#endif /* SPECTRE_GRAPHICS_FONT_ENGINE_FREETYPEENGINE_H */ diff --git a/source/Graphics/Font/FreeTypeError.cpp b/source/Graphics/Font/Engine/FreeTypeError.cpp similarity index 100% rename from source/Graphics/Font/FreeTypeError.cpp rename to source/Graphics/Font/Engine/FreeTypeError.cpp diff --git a/source/Graphics/Font/Engine/FreeTypeError.h b/source/Graphics/Font/Engine/FreeTypeError.h new file mode 100644 index 0000000..bbe4ec6 --- /dev/null +++ b/source/Graphics/Font/Engine/FreeTypeError.h @@ -0,0 +1,10 @@ + +#ifndef SPECTRE_GRAPHICS_FONT_ENGINE_FREETYPE_ERROR_H +#define SPECTRE_GRAPHICS_FONT_ENGINE_FREETYPE_ERROR_H + +#include +#include FT_FREETYPE_H + +const char* FT_GetErrorString(FT_Error error); + +#endif /* SPECTRE_GRAPHICS_FONT_ENGINE_FREETYPE_ERROR_H */ diff --git a/source/Graphics/Font/FontDriver.cpp b/source/Graphics/Font/FontDriver.cpp deleted file mode 100644 index e64e54d..0000000 --- a/source/Graphics/Font/FontDriver.cpp +++ /dev/null @@ -1,16 +0,0 @@ - -#include "FontDriver.h" - -namespace sp { - -FontDriver::FontDriver() : -m_hinting (true) -{ -} - -void FontDriver::setHinting(bool value) -{ - m_hinting = value; -} - -} // namespace sp diff --git a/source/Graphics/Font/FreeTypeError.h b/source/Graphics/Font/FreeTypeError.h deleted file mode 100644 index 47d76e3..0000000 --- a/source/Graphics/Font/FreeTypeError.h +++ /dev/null @@ -1,10 +0,0 @@ - -#ifndef SPECTRE_GRAPHICS_FONT_FREETYPE_ERROR_H -#define SPECTRE_GRAPHICS_FONT_FREETYPE_ERROR_H - -#include -#include FT_FREETYPE_H - -const char* FT_GetErrorString(FT_Error error); - -#endif /* SPECTRE_GRAPHICS_FONT_FREETYPE_ERROR_H */ From 2dd1187ff24ac9b680b72dc5b1c6ad7f083a3022 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 5 Jan 2020 23:40:25 +0100 Subject: [PATCH 006/361] Font: move Glyph to it's own header. --- include/Spectre/Graphics/Font.h | 12 +---------- include/Spectre/Graphics/Font/Glyph.h | 21 +++++++++++++++++++ source/Graphics/Font.cpp | 4 ++-- source/Graphics/Font/Engine/FontEngine.h | 3 ++- .../Graphics/Font/Engine/FreeTypeEngine.cpp | 4 ++-- source/Graphics/Font/Engine/FreeTypeEngine.h | 2 +- source/Graphics/Text.cpp | 4 ++-- 7 files changed, 31 insertions(+), 19 deletions(-) create mode 100644 include/Spectre/Graphics/Font/Glyph.h diff --git a/include/Spectre/Graphics/Font.h b/include/Spectre/Graphics/Font.h index 8a33b50..f593801 100644 --- a/include/Spectre/Graphics/Font.h +++ b/include/Spectre/Graphics/Font.h @@ -6,9 +6,9 @@ #include #include -#include #include #include +#include namespace sp { @@ -24,16 +24,6 @@ public : std::string name; }; - struct Glyph { - vec2b size; // Width, Height of bounding box. - vec2b offset; // Offset from cursor where the box begins. - unsigned char advance; - - //vec4u tex_coords; - vec2u texture_origin; - const Texture* texture; // Texture atlas. - }; - Font(); ~Font(); diff --git a/include/Spectre/Graphics/Font/Glyph.h b/include/Spectre/Graphics/Font/Glyph.h new file mode 100644 index 0000000..d8f2b7a --- /dev/null +++ b/include/Spectre/Graphics/Font/Glyph.h @@ -0,0 +1,21 @@ + +#ifndef SPECTRE_GRAPHICS_FONT_GLYPH_H +#define SPECTRE_GRAPHICS_FONT_GLYPH_H + +#include +#include + +namespace sp { + +struct Glyph { + vec2b size; // Width, Height of bounding box. + vec2b offset; // Offset from cursor where the box begins. + unsigned char advance; + + vec2u texture_origin; + const Texture* texture; // Texture atlas. +}; + +} // namespace sp + +#endif // SPECTRE_GRAPHICS_FONT_GLYPH_H diff --git a/source/Graphics/Font.cpp b/source/Graphics/Font.cpp index a2ca857..722866d 100644 --- a/source/Graphics/Font.cpp +++ b/source/Graphics/Font.cpp @@ -42,7 +42,7 @@ bool Font::loadFromMemory(const void *data) return false; } -Font::Glyph Font::getGlyph(unsigned int code) const +Glyph Font::getGlyph(unsigned int code) const { if (m_charset.find(code) == m_charset.end()) { @@ -54,7 +54,7 @@ Font::Glyph Font::getGlyph(unsigned int code) const void Font::loadChar(unsigned char code) const { Image img; - Font::Glyph glyph; + Glyph glyph; if (!m_engine) { return; diff --git a/source/Graphics/Font/Engine/FontEngine.h b/source/Graphics/Font/Engine/FontEngine.h index c17773c..8c03b12 100644 --- a/source/Graphics/Font/Engine/FontEngine.h +++ b/source/Graphics/Font/Engine/FontEngine.h @@ -4,6 +4,7 @@ #include #include +#include #include namespace sp { @@ -20,7 +21,7 @@ public : virtual bool loadFromFile(const std::string& filename) = 0; - virtual Font::Glyph loadGlyph(unsigned int codepoint, Image& img, unsigned int outlineSize = 0) = 0; + virtual Glyph loadGlyph(unsigned int codepoint, Image& img, unsigned int outlineSize = 0) = 0; virtual std::string getName() = 0; diff --git a/source/Graphics/Font/Engine/FreeTypeEngine.cpp b/source/Graphics/Font/Engine/FreeTypeEngine.cpp index f5b857e..1ed4e34 100644 --- a/source/Graphics/Font/Engine/FreeTypeEngine.cpp +++ b/source/Graphics/Font/Engine/FreeTypeEngine.cpp @@ -103,9 +103,9 @@ bool FreeTypeEngine::loadFromFile(const std::string& filename) return true; } -Font::Glyph FreeTypeEngine::loadGlyph(unsigned int codepoint, Image& img, unsigned int outlineSize) +Glyph FreeTypeEngine::loadGlyph(unsigned int codepoint, Image& img, unsigned int outlineSize) { - Font::Glyph glyph; + Glyph glyph; FT_Glyph glyph_info; FT_Int32 flags = FT_LOAD_TARGET_NORMAL; diff --git a/source/Graphics/Font/Engine/FreeTypeEngine.h b/source/Graphics/Font/Engine/FreeTypeEngine.h index fa90b26..6a8403e 100644 --- a/source/Graphics/Font/Engine/FreeTypeEngine.h +++ b/source/Graphics/Font/Engine/FreeTypeEngine.h @@ -20,7 +20,7 @@ public: virtual bool loadFromFile(const std::string& filename); - virtual Font::Glyph loadGlyph(unsigned int codepoint, Image& img, unsigned int outlineSize = 0); + virtual Glyph loadGlyph(unsigned int codepoint, Image& img, unsigned int outlineSize = 0); virtual std::string getName(); diff --git a/source/Graphics/Text.cpp b/source/Graphics/Text.cpp index c28d209..f8b2a40 100644 --- a/source/Graphics/Text.cpp +++ b/source/Graphics/Text.cpp @@ -94,7 +94,7 @@ Vector2f Text::getSize() const for(size_t i = 0; i < m_string.size(); i++) { - Font::Glyph glyph = m_font->getGlyph(m_string[i]); + Glyph glyph = m_font->getGlyph(m_string[i]); float h = glyph.size.y; float w = glyph.advance; @@ -142,7 +142,7 @@ void Text::updateGeometry() const Vertex2D v1, v2, v3, v4; - Font::Glyph glyph = m_font->getGlyph(m_string[i]); + Glyph glyph = m_font->getGlyph(m_string[i]); if (glyph.texture) { From 6e14209aae534a8c808d97f1111d8181726f96f5 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 6 Jan 2020 00:18:07 +0100 Subject: [PATCH 007/361] Font: add FontDescription class. --- .../Spectre/Graphics/Font/FontDescription.h | 22 +++++++++++++++++++ source/Graphics/Font/FontDescription.cpp | 16 ++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 include/Spectre/Graphics/Font/FontDescription.h create mode 100644 source/Graphics/Font/FontDescription.cpp diff --git a/include/Spectre/Graphics/Font/FontDescription.h b/include/Spectre/Graphics/Font/FontDescription.h new file mode 100644 index 0000000..284e5e2 --- /dev/null +++ b/include/Spectre/Graphics/Font/FontDescription.h @@ -0,0 +1,22 @@ + +#ifndef SPECTRE_GRAPHICS_FONT_FONTDESCRIPTION_H +#define SPECTRE_GRAPHICS_FONT_FONTDESCRIPTION_H + +namespace sp { + +class FontDescription +{ +public : + void hinting(bool value = true); + + bool isHintingEnabled() const; + +protected : + + // True if hinting is enabled. false otherwise. + bool m_hinting = true; +}; + +} // namespace sp + +#endif /* SPECTRE_GRAPHICS_FONT_FONTDESCRIPTION_H */ diff --git a/source/Graphics/Font/FontDescription.cpp b/source/Graphics/Font/FontDescription.cpp new file mode 100644 index 0000000..c37ffdc --- /dev/null +++ b/source/Graphics/Font/FontDescription.cpp @@ -0,0 +1,16 @@ + +#include + +namespace sp { + +void FontDescription::hinting(bool value) +{ + m_hinting = value; +} + +bool FontDescription::isHintingEnabled() const +{ + return m_hinting; +} + +} // namespace sp From f72178ffd06178348aa81348a885636f4a3fbd98 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 6 Jan 2020 00:19:12 +0100 Subject: [PATCH 008/361] FontEngine: remove hinting (exists in FontDescripion class) and let child classes handle it. --- bam.lua | 2 +- source/Graphics/Font/Engine/FontEngine.cpp | 16 ---------------- source/Graphics/Font/Engine/FontEngine.h | 10 ---------- source/Graphics/Font/Engine/FreeTypeEngine.cpp | 7 ++++--- source/Graphics/Font/Engine/FreeTypeEngine.h | 4 +++- 5 files changed, 8 insertions(+), 31 deletions(-) delete mode 100644 source/Graphics/Font/Engine/FontEngine.cpp diff --git a/bam.lua b/bam.lua index 8379d00..3fd8c7f 100644 --- a/bam.lua +++ b/bam.lua @@ -154,9 +154,9 @@ local graphics_module = Module("source/Graphics", { "Texture.cpp", -- Text - "Font/Engine/FontEngine.cpp", "Font/Engine/FreeTypeEngine.cpp", "Font/Engine/FreeTypeError.cpp", + "Font/FontDescription.cpp", "Font.cpp", "Text.cpp", diff --git a/source/Graphics/Font/Engine/FontEngine.cpp b/source/Graphics/Font/Engine/FontEngine.cpp deleted file mode 100644 index f672f7e..0000000 --- a/source/Graphics/Font/Engine/FontEngine.cpp +++ /dev/null @@ -1,16 +0,0 @@ - -#include "FontEngine.h" - -namespace sp { - -FontEngine::FontEngine() : -m_hinting (true) -{ -} - -void FontEngine::setHinting(bool value) -{ - m_hinting = value; -} - -} // namespace sp diff --git a/source/Graphics/Font/Engine/FontEngine.h b/source/Graphics/Font/Engine/FontEngine.h index 8c03b12..4d400a7 100644 --- a/source/Graphics/Font/Engine/FontEngine.h +++ b/source/Graphics/Font/Engine/FontEngine.h @@ -12,11 +12,6 @@ namespace sp { class FontEngine { public : - - FontEngine(); - - void setHinting(bool value); - virtual bool setCharacterSize(unsigned int size) = 0; virtual bool loadFromFile(const std::string& filename) = 0; @@ -24,11 +19,6 @@ public : virtual Glyph loadGlyph(unsigned int codepoint, Image& img, unsigned int outlineSize = 0) = 0; virtual std::string getName() = 0; - -protected : - - // True if hinting is enabled. false otherwise. - bool m_hinting; }; } // namespace sp diff --git a/source/Graphics/Font/Engine/FreeTypeEngine.cpp b/source/Graphics/Font/Engine/FreeTypeEngine.cpp index 1ed4e34..83f66af 100644 --- a/source/Graphics/Font/Engine/FreeTypeEngine.cpp +++ b/source/Graphics/Font/Engine/FreeTypeEngine.cpp @@ -58,8 +58,9 @@ LibWrapper::~LibWrapper() } } -FreeTypeEngine::FreeTypeEngine() : -m_face (NULL) +FreeTypeEngine::FreeTypeEngine(FontDescription desc) : +m_face (NULL), +m_desc (desc) { } @@ -113,7 +114,7 @@ Glyph FreeTypeEngine::loadGlyph(unsigned int codepoint, Image& img, unsigned int flags |= FT_LOAD_NO_BITMAP; } - if (m_hinting) { + if (m_desc.isHintingEnabled()) { flags |= FT_LOAD_FORCE_AUTOHINT; } else { flags |= FT_LOAD_NO_AUTOHINT; diff --git a/source/Graphics/Font/Engine/FreeTypeEngine.h b/source/Graphics/Font/Engine/FreeTypeEngine.h index 6a8403e..98b19ae 100644 --- a/source/Graphics/Font/Engine/FreeTypeEngine.h +++ b/source/Graphics/Font/Engine/FreeTypeEngine.h @@ -6,6 +6,7 @@ #include FT_FREETYPE_H #include +#include #include "FontEngine.h" namespace sp { @@ -13,7 +14,7 @@ namespace sp { class FreeTypeEngine : public FontEngine { public: - FreeTypeEngine(); + FreeTypeEngine(FontDescription desc = FontDescription()); ~FreeTypeEngine(); virtual bool setCharacterSize(unsigned int size); @@ -27,6 +28,7 @@ public: private : FT_Face m_face; + FontDescription m_desc; }; } // namespace sp From 093149e72c215abc45e9194a8d70102b29f3e3be Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 6 Jan 2020 00:38:06 +0100 Subject: [PATCH 009/361] FontEngine/FreeType: move libWrapper to its own compile unit. --- bam.lua | 1 + .../Graphics/Font/Engine/FreeTypeEngine.cpp | 52 ++----------------- source/Graphics/Font/Engine/FreeTypeLib.cpp | 37 +++++++++++++ source/Graphics/Font/Engine/FreeTypeLib.h | 32 ++++++++++++ 4 files changed, 73 insertions(+), 49 deletions(-) create mode 100644 source/Graphics/Font/Engine/FreeTypeLib.cpp create mode 100644 source/Graphics/Font/Engine/FreeTypeLib.h diff --git a/bam.lua b/bam.lua index 3fd8c7f..60adb07 100644 --- a/bam.lua +++ b/bam.lua @@ -156,6 +156,7 @@ local graphics_module = Module("source/Graphics", { -- Text "Font/Engine/FreeTypeEngine.cpp", "Font/Engine/FreeTypeError.cpp", + "Font/Engine/FreeTypeLib.cpp", "Font/FontDescription.cpp", "Font.cpp", "Text.cpp", diff --git a/source/Graphics/Font/Engine/FreeTypeEngine.cpp b/source/Graphics/Font/Engine/FreeTypeEngine.cpp index 83f66af..e82e73b 100644 --- a/source/Graphics/Font/Engine/FreeTypeEngine.cpp +++ b/source/Graphics/Font/Engine/FreeTypeEngine.cpp @@ -6,58 +6,12 @@ #include FT_STROKER_H #include +#include "FreeTypeLib.h" #include "FreeTypeError.h" #include "FreeTypeEngine.h" namespace sp { -class LibWrapper -{ -public : - static LibWrapper& getInstance() - { - static LibWrapper _inst; - return _inst; - }; - - // Do not implement. - LibWrapper(const LibWrapper&); - void operator=(const LibWrapper&); - - FT_Library handle; - - FT_Stroker stroker; - -private : - - LibWrapper(); - ~LibWrapper(); -}; - -LibWrapper::LibWrapper() -{ - FT_Error error = FT_Init_FreeType(&handle); - if (error) { - Log::error("Could not initialize FreeType"); - return; - } - - Log::info("FreeType font driver was initialized."); - error = FT_Stroker_New(handle, &stroker); -} - -LibWrapper::~LibWrapper() -{ - FT_Error error; - - FT_Stroker_Done(stroker); - - error = FT_Done_FreeType(handle); - if (error) { - Log::error("Could not close FreeType"); - } -} - FreeTypeEngine::FreeTypeEngine(FontDescription desc) : m_face (NULL), m_desc (desc) @@ -86,7 +40,7 @@ bool FreeTypeEngine::loadFromFile(const std::string& filename) FT_Face face; FT_Error error; - error = FT_New_Face(LibWrapper::getInstance().handle, filename.c_str(), 0, &face); + error = FT_New_Face(FreeTypeLib::getInstance().handle, filename.c_str(), 0, &face); if (error) { Log::warn("FreeType: could not load file (%s): %s", filename.c_str(), FT_GetErrorString(error)); @@ -130,7 +84,7 @@ Glyph FreeTypeEngine::loadGlyph(unsigned int codepoint, Image& img, unsigned int FT_Glyph_Metrics& metrics = m_face->glyph->metrics; if (outlineSize) { - FT_Stroker stroker = LibWrapper::getInstance().stroker; + FT_Stroker stroker = FreeTypeLib::getInstance().stroker; FT_Stroker_Set(stroker, outlineSize * 64, FT_STROKER_LINECAP_ROUND, diff --git a/source/Graphics/Font/Engine/FreeTypeLib.cpp b/source/Graphics/Font/Engine/FreeTypeLib.cpp new file mode 100644 index 0000000..9e113ac --- /dev/null +++ b/source/Graphics/Font/Engine/FreeTypeLib.cpp @@ -0,0 +1,37 @@ + +#include +#include "FreeTypeLib.h" + +namespace sp { + +FreeTypeLib& FreeTypeLib::getInstance() +{ + static FreeTypeLib _inst; + return _inst; +}; + +FreeTypeLib::FreeTypeLib() +{ + FT_Error error = FT_Init_FreeType(&handle); + if (error) { + Log::error("Could not initialize FreeType"); + return; + } + + Log::info("FreeType font driver was initialized."); + error = FT_Stroker_New(handle, &stroker); +} + +FreeTypeLib::~FreeTypeLib() +{ + FT_Error error; + + FT_Stroker_Done(stroker); + + error = FT_Done_FreeType(handle); + if (error) { + Log::error("Could not close FreeType"); + } +} + +} // namespace sp diff --git a/source/Graphics/Font/Engine/FreeTypeLib.h b/source/Graphics/Font/Engine/FreeTypeLib.h new file mode 100644 index 0000000..7459a61 --- /dev/null +++ b/source/Graphics/Font/Engine/FreeTypeLib.h @@ -0,0 +1,32 @@ + +#ifndef SPECTRE_GRAPHICS_FONT_ENGINE_FREETYPELIB_H +#define SPECTRE_GRAPHICS_FONT_ENGINE_FREETYPELIB_H + +#include +#include FT_FREETYPE_H +#include FT_STROKER_H + +namespace sp { + +class FreeTypeLib +{ +public : + static FreeTypeLib& getInstance(); + + // Do not implement. + FreeTypeLib(const FreeTypeLib&); + void operator=(const FreeTypeLib&); + + FT_Library handle; + + FT_Stroker stroker; + +private : + + FreeTypeLib(); + ~FreeTypeLib(); +}; + +} // namespace sp + +#endif /* SPECTRE_GRAPHICS_FONT_ENGINE_FREETYPELIB_H */ From f5b7fa81787c7999e34785aab38c8292dbcb8cc2 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 7 Jan 2020 05:51:23 +0100 Subject: [PATCH 010/361] FreeType2: skip static lib, build custom source into libspectre. --- bam.lua | 21 +- vendor/FreeType2/.gitignore | 4 + vendor/FreeType2/build.lua | 58 + .../include/freetype/config/ftconfig.h | 2 - .../include/freetype/config/ftmodule.h | 52 +- .../include/freetype/config/ftoption.h | 39 +- .../include/freetype/internal/autohint.h | 23 + .../include/freetype/internal/ftcalc.h | 26 +- .../include/freetype/internal/ftdrv.h | 123 +- .../include/freetype/internal/ftobjs.h | 433 +- .../include/freetype/internal/ftpic.h | 71 + .../include/freetype/internal/ftrfork.h | 22 +- .../include/freetype/internal/ftserv.h | 506 +- .../include/freetype/internal/internal.h | 1 + .../include/freetype/internal/pshints.h | 21 + .../freetype/internal/services/svbdf.h | 16 + .../freetype/internal/services/svcfftl.h | 22 + .../freetype/internal/services/svcid.h | 21 + .../freetype/internal/services/svgldict.h | 19 + .../freetype/internal/services/svmetric.h | 28 + .../include/freetype/internal/services/svmm.h | 32 + .../freetype/internal/services/svpostnm.h | 16 + .../freetype/internal/services/svprop.h | 16 + .../freetype/internal/services/svpscmap.h | 31 + .../freetype/internal/services/svpsinfo.h | 25 + .../freetype/internal/services/svsfnt.h | 15 + .../freetype/internal/services/svttcmap.h | 15 + .../freetype/internal/services/svttglyf.h | 13 + .../include/freetype/internal/sfnt.h | 79 + vendor/FreeType2/src/autofit/afangles.c | 285 + vendor/FreeType2/src/autofit/afangles.h | 7 + vendor/FreeType2/src/autofit/afblue.c | 739 ++ vendor/FreeType2/src/autofit/afblue.cin | 39 + vendor/FreeType2/src/autofit/afblue.dat | 1072 +++ vendor/FreeType2/src/autofit/afblue.h | 414 + vendor/FreeType2/src/autofit/afblue.hin | 146 + vendor/FreeType2/src/autofit/afcjk.c | 2381 +++++ vendor/FreeType2/src/autofit/afcjk.h | 141 + vendor/FreeType2/src/autofit/afcover.h | 105 + vendor/FreeType2/src/autofit/afdummy.c | 75 + vendor/FreeType2/src/autofit/afdummy.h | 40 + vendor/FreeType2/src/autofit/aferrors.h | 42 + vendor/FreeType2/src/autofit/afglobal.c | 503 + vendor/FreeType2/src/autofit/afglobal.h | 173 + vendor/FreeType2/src/autofit/afhints.c | 1659 ++++ vendor/FreeType2/src/autofit/afhints.h | 481 + vendor/FreeType2/src/autofit/afindic.c | 157 + vendor/FreeType2/src/autofit/afindic.h | 41 + vendor/FreeType2/src/autofit/aflatin.c | 3590 +++++++ vendor/FreeType2/src/autofit/aflatin.h | 194 + vendor/FreeType2/src/autofit/aflatin2.c | 2427 +++++ vendor/FreeType2/src/autofit/aflatin2.h | 46 + vendor/FreeType2/src/autofit/afloader.c | 721 ++ vendor/FreeType2/src/autofit/afloader.h | 91 + vendor/FreeType2/src/autofit/afmodule.c | 600 ++ vendor/FreeType2/src/autofit/afmodule.h | 58 + vendor/FreeType2/src/autofit/afpic.c | 152 + vendor/FreeType2/src/autofit/afpic.h | 105 + vendor/FreeType2/src/autofit/afranges.c | 1033 ++ vendor/FreeType2/src/autofit/afranges.h | 47 + vendor/FreeType2/src/autofit/afscript.h | 390 + vendor/FreeType2/src/autofit/afshaper.c | 683 ++ vendor/FreeType2/src/autofit/afshaper.h | 72 + vendor/FreeType2/src/autofit/afstyles.h | 475 + vendor/FreeType2/src/autofit/aftypes.h | 651 ++ vendor/FreeType2/src/autofit/afwarp.c | 373 + vendor/FreeType2/src/autofit/afwarp.h | 64 + vendor/FreeType2/src/autofit/afwrtsys.h | 52 + vendor/FreeType2/src/autofit/autofit.c | 39 + vendor/FreeType2/src/base/basepic.c | 108 + vendor/FreeType2/src/base/basepic.h | 91 + vendor/FreeType2/src/base/ftadvanc.c | 175 + vendor/FreeType2/src/base/ftapi.c | 121 + vendor/FreeType2/src/base/ftbase.c | 42 + vendor/FreeType2/src/base/ftbase.h | 78 + vendor/FreeType2/src/base/ftbbox.c | 515 + vendor/FreeType2/src/base/ftbdf.c | 91 + vendor/FreeType2/src/base/ftbitmap.c | 835 ++ vendor/FreeType2/src/base/ftcalc.c | 1017 ++ vendor/FreeType2/src/base/ftcid.c | 118 + vendor/FreeType2/src/base/ftdbgmem.c | 999 ++ vendor/FreeType2/src/base/ftdebug.c | 266 + vendor/FreeType2/src/base/ftfntfmt.c | 55 + vendor/FreeType2/src/base/ftfstype.c | 62 + vendor/FreeType2/src/base/ftgasp.c | 61 + vendor/FreeType2/src/base/ftgloadr.c | 406 + vendor/FreeType2/src/base/ftglyph.c | 649 ++ vendor/FreeType2/src/base/ftgxval.c | 142 + vendor/FreeType2/src/base/fthash.c | 339 + vendor/FreeType2/src/base/ftinit.c | 376 + vendor/FreeType2/src/base/ftlcdfil.c | 383 + vendor/FreeType2/src/base/ftmac.c | 1088 +++ vendor/FreeType2/src/base/ftmm.c | 508 + vendor/FreeType2/src/base/ftobjs.c | 5405 +++++++++++ vendor/FreeType2/src/base/ftotval.c | 91 + vendor/FreeType2/src/base/ftoutln.c | 1110 +++ vendor/FreeType2/src/base/ftpatent.c | 51 + vendor/FreeType2/src/base/ftpfr.c | 153 + vendor/FreeType2/src/base/ftpic.c | 55 + vendor/FreeType2/src/base/ftpsprop.c | 285 + vendor/FreeType2/src/base/ftrfork.c | 943 ++ vendor/FreeType2/src/base/ftsnames.c | 148 + vendor/FreeType2/src/base/ftstream.c | 860 ++ vendor/FreeType2/src/base/ftstroke.c | 2469 +++++ vendor/FreeType2/src/base/ftsynth.c | 163 + vendor/FreeType2/src/base/ftsystem.c | 320 + vendor/FreeType2/src/base/fttrigon.c | 526 + vendor/FreeType2/src/base/fttype1.c | 127 + vendor/FreeType2/src/base/ftutil.c | 443 + vendor/FreeType2/src/base/ftver.rc | 61 + vendor/FreeType2/src/base/ftwinfnt.c | 53 + vendor/FreeType2/src/base/md5.c | 291 + vendor/FreeType2/src/base/md5.h | 45 + vendor/FreeType2/src/base/module.lua | 12 + vendor/FreeType2/src/cff/cff.c | 30 + vendor/FreeType2/src/cff/cffcmap.c | 229 + vendor/FreeType2/src/cff/cffcmap.h | 67 + vendor/FreeType2/src/cff/cffdrivr.c | 1143 +++ vendor/FreeType2/src/cff/cffdrivr.h | 38 + vendor/FreeType2/src/cff/cfferrs.h | 42 + vendor/FreeType2/src/cff/cffgload.c | 683 ++ vendor/FreeType2/src/cff/cffgload.h | 63 + vendor/FreeType2/src/cff/cffload.c | 2564 +++++ vendor/FreeType2/src/cff/cffload.h | 125 + vendor/FreeType2/src/cff/cffobjs.c | 1206 +++ vendor/FreeType2/src/cff/cffobjs.h | 85 + vendor/FreeType2/src/cff/cffparse.c | 1694 ++++ vendor/FreeType2/src/cff/cffparse.h | 136 + vendor/FreeType2/src/cff/cffpic.c | 138 + vendor/FreeType2/src/cff/cffpic.h | 121 + vendor/FreeType2/src/cff/cfftoken.h | 150 + vendor/FreeType2/src/psaux/afmparse.c | 986 ++ vendor/FreeType2/src/psaux/afmparse.h | 89 + vendor/FreeType2/src/psaux/cffdecode.c | 2370 +++++ vendor/FreeType2/src/psaux/cffdecode.h | 64 + vendor/FreeType2/src/psaux/psarrst.c | 241 + vendor/FreeType2/src/psaux/psarrst.h | 100 + vendor/FreeType2/src/psaux/psaux.c | 41 + vendor/FreeType2/src/psaux/psauxerr.h | 42 + vendor/FreeType2/src/psaux/psauxmod.c | 191 + vendor/FreeType2/src/psaux/psauxmod.h | 51 + vendor/FreeType2/src/psaux/psblues.c | 582 ++ vendor/FreeType2/src/psaux/psblues.h | 185 + vendor/FreeType2/src/psaux/psconv.c | 611 ++ vendor/FreeType2/src/psaux/psconv.h | 71 + vendor/FreeType2/src/psaux/pserror.c | 52 + vendor/FreeType2/src/psaux/pserror.h | 119 + vendor/FreeType2/src/psaux/psfixed.h | 95 + vendor/FreeType2/src/psaux/psfont.c | 567 ++ vendor/FreeType2/src/psaux/psfont.h | 134 + vendor/FreeType2/src/psaux/psft.c | 890 ++ vendor/FreeType2/src/psaux/psft.h | 167 + vendor/FreeType2/src/psaux/psglue.h | 144 + vendor/FreeType2/src/psaux/pshints.c | 1939 ++++ vendor/FreeType2/src/psaux/pshints.h | 288 + vendor/FreeType2/src/psaux/psintrp.c | 3040 ++++++ vendor/FreeType2/src/psaux/psintrp.h | 83 + vendor/FreeType2/src/psaux/psobjs.c | 2533 +++++ vendor/FreeType2/src/psaux/psobjs.h | 313 + vendor/FreeType2/src/psaux/psread.c | 112 + vendor/FreeType2/src/psaux/psread.h | 68 + vendor/FreeType2/src/psaux/psstack.c | 328 + vendor/FreeType2/src/psaux/psstack.h | 121 + vendor/FreeType2/src/psaux/pstypes.h | 78 + vendor/FreeType2/src/psaux/t1cmap.c | 371 + vendor/FreeType2/src/psaux/t1cmap.h | 105 + vendor/FreeType2/src/psaux/t1decode.c | 1988 ++++ vendor/FreeType2/src/psaux/t1decode.h | 74 + vendor/FreeType2/src/pshinter/pshalgo.c | 2195 +++++ vendor/FreeType2/src/pshinter/pshalgo.h | 241 + vendor/FreeType2/src/pshinter/pshglob.c | 795 ++ vendor/FreeType2/src/pshinter/pshglob.h | 196 + vendor/FreeType2/src/pshinter/pshinter.c | 29 + vendor/FreeType2/src/pshinter/pshmod.c | 121 + vendor/FreeType2/src/pshinter/pshmod.h | 39 + vendor/FreeType2/src/pshinter/pshnterr.h | 41 + vendor/FreeType2/src/pshinter/pshpic.c | 76 + vendor/FreeType2/src/pshinter/pshpic.h | 63 + vendor/FreeType2/src/pshinter/pshrec.c | 1220 +++ vendor/FreeType2/src/pshinter/pshrec.h | 172 + vendor/FreeType2/src/psnames/psmodule.c | 632 ++ vendor/FreeType2/src/psnames/psmodule.h | 38 + vendor/FreeType2/src/psnames/psnamerr.h | 42 + vendor/FreeType2/src/psnames/psnames.c | 26 + vendor/FreeType2/src/psnames/pspic.c | 97 + vendor/FreeType2/src/psnames/pspic.h | 68 + vendor/FreeType2/src/psnames/pstables.h | 4238 ++++++++ vendor/FreeType2/src/raster/ftmisc.h | 142 + vendor/FreeType2/src/raster/ftraster.c | 3225 +++++++ vendor/FreeType2/src/raster/ftraster.h | 46 + vendor/FreeType2/src/raster/ftrend1.c | 204 + vendor/FreeType2/src/raster/ftrend1.h | 38 + vendor/FreeType2/src/raster/raster.c | 27 + vendor/FreeType2/src/raster/rasterrs.h | 42 + vendor/FreeType2/src/raster/rastpic.c | 89 + vendor/FreeType2/src/raster/rastpic.h | 63 + vendor/FreeType2/src/sfnt/pngshim.c | 456 + vendor/FreeType2/src/sfnt/pngshim.h | 51 + vendor/FreeType2/src/sfnt/sfdriver.c | 1288 +++ vendor/FreeType2/src/sfnt/sfdriver.h | 38 + vendor/FreeType2/src/sfnt/sferrors.h | 41 + vendor/FreeType2/src/sfnt/sfnt.c | 35 + vendor/FreeType2/src/sfnt/sfntpic.c | 143 + vendor/FreeType2/src/sfnt/sfntpic.h | 112 + vendor/FreeType2/src/sfnt/sfobjs.c | 1804 ++++ vendor/FreeType2/src/sfnt/sfobjs.h | 59 + vendor/FreeType2/src/sfnt/ttbdf.c | 257 + vendor/FreeType2/src/sfnt/ttbdf.h | 50 + vendor/FreeType2/src/sfnt/ttcmap.c | 3938 ++++++++ vendor/FreeType2/src/sfnt/ttcmap.h | 160 + vendor/FreeType2/src/sfnt/ttcmapc.h | 56 + vendor/FreeType2/src/sfnt/ttkern.c | 311 + vendor/FreeType2/src/sfnt/ttkern.h | 52 + vendor/FreeType2/src/sfnt/ttload.c | 1427 +++ vendor/FreeType2/src/sfnt/ttload.h | 112 + vendor/FreeType2/src/sfnt/ttmtx.c | 326 + vendor/FreeType2/src/sfnt/ttmtx.h | 55 + vendor/FreeType2/src/sfnt/ttpost.c | 575 ++ vendor/FreeType2/src/sfnt/ttpost.h | 46 + vendor/FreeType2/src/sfnt/ttsbit.c | 1682 ++++ vendor/FreeType2/src/sfnt/ttsbit.h | 63 + vendor/FreeType2/src/smooth/ftgrays.c | 2042 ++++ vendor/FreeType2/src/smooth/ftgrays.h | 58 + vendor/FreeType2/src/smooth/ftsmerrs.h | 42 + vendor/FreeType2/src/smooth/ftsmooth.c | 464 + vendor/FreeType2/src/smooth/ftsmooth.h | 42 + vendor/FreeType2/src/smooth/ftspic.c | 118 + vendor/FreeType2/src/smooth/ftspic.h | 75 + vendor/FreeType2/src/smooth/smooth.c | 27 + vendor/FreeType2/src/truetype/truetype.c | 32 + vendor/FreeType2/src/truetype/ttdriver.c | 666 ++ vendor/FreeType2/src/truetype/ttdriver.h | 38 + vendor/FreeType2/src/truetype/tterrors.h | 42 + vendor/FreeType2/src/truetype/ttgload.c | 2906 ++++++ vendor/FreeType2/src/truetype/ttgload.h | 62 + vendor/FreeType2/src/truetype/ttgxvar.c | 4074 ++++++++ vendor/FreeType2/src/truetype/ttgxvar.h | 453 + vendor/FreeType2/src/truetype/ttinterp.c | 8551 +++++++++++++++++ vendor/FreeType2/src/truetype/ttinterp.h | 539 ++ vendor/FreeType2/src/truetype/ttobjs.c | 1440 +++ vendor/FreeType2/src/truetype/ttobjs.h | 425 + vendor/FreeType2/src/truetype/ttpic.c | 101 + vendor/FreeType2/src/truetype/ttpic.h | 88 + vendor/FreeType2/src/truetype/ttpload.c | 642 ++ vendor/FreeType2/src/truetype/ttpload.h | 75 + vendor/FreeType2/src/truetype/ttsubpix.c | 1014 ++ vendor/FreeType2/src/truetype/ttsubpix.h | 111 + 247 files changed, 123377 insertions(+), 88 deletions(-) create mode 100644 vendor/FreeType2/.gitignore create mode 100644 vendor/FreeType2/build.lua create mode 100644 vendor/FreeType2/include/freetype/internal/ftpic.h create mode 100644 vendor/FreeType2/src/autofit/afangles.c create mode 100644 vendor/FreeType2/src/autofit/afangles.h create mode 100644 vendor/FreeType2/src/autofit/afblue.c create mode 100644 vendor/FreeType2/src/autofit/afblue.cin create mode 100644 vendor/FreeType2/src/autofit/afblue.dat create mode 100644 vendor/FreeType2/src/autofit/afblue.h create mode 100644 vendor/FreeType2/src/autofit/afblue.hin create mode 100644 vendor/FreeType2/src/autofit/afcjk.c create mode 100644 vendor/FreeType2/src/autofit/afcjk.h create mode 100644 vendor/FreeType2/src/autofit/afcover.h create mode 100644 vendor/FreeType2/src/autofit/afdummy.c create mode 100644 vendor/FreeType2/src/autofit/afdummy.h create mode 100644 vendor/FreeType2/src/autofit/aferrors.h create mode 100644 vendor/FreeType2/src/autofit/afglobal.c create mode 100644 vendor/FreeType2/src/autofit/afglobal.h create mode 100644 vendor/FreeType2/src/autofit/afhints.c create mode 100644 vendor/FreeType2/src/autofit/afhints.h create mode 100644 vendor/FreeType2/src/autofit/afindic.c create mode 100644 vendor/FreeType2/src/autofit/afindic.h create mode 100644 vendor/FreeType2/src/autofit/aflatin.c create mode 100644 vendor/FreeType2/src/autofit/aflatin.h create mode 100644 vendor/FreeType2/src/autofit/aflatin2.c create mode 100644 vendor/FreeType2/src/autofit/aflatin2.h create mode 100644 vendor/FreeType2/src/autofit/afloader.c create mode 100644 vendor/FreeType2/src/autofit/afloader.h create mode 100644 vendor/FreeType2/src/autofit/afmodule.c create mode 100644 vendor/FreeType2/src/autofit/afmodule.h create mode 100644 vendor/FreeType2/src/autofit/afpic.c create mode 100644 vendor/FreeType2/src/autofit/afpic.h create mode 100644 vendor/FreeType2/src/autofit/afranges.c create mode 100644 vendor/FreeType2/src/autofit/afranges.h create mode 100644 vendor/FreeType2/src/autofit/afscript.h create mode 100644 vendor/FreeType2/src/autofit/afshaper.c create mode 100644 vendor/FreeType2/src/autofit/afshaper.h create mode 100644 vendor/FreeType2/src/autofit/afstyles.h create mode 100644 vendor/FreeType2/src/autofit/aftypes.h create mode 100644 vendor/FreeType2/src/autofit/afwarp.c create mode 100644 vendor/FreeType2/src/autofit/afwarp.h create mode 100644 vendor/FreeType2/src/autofit/afwrtsys.h create mode 100644 vendor/FreeType2/src/autofit/autofit.c create mode 100644 vendor/FreeType2/src/base/basepic.c create mode 100644 vendor/FreeType2/src/base/basepic.h create mode 100644 vendor/FreeType2/src/base/ftadvanc.c create mode 100644 vendor/FreeType2/src/base/ftapi.c create mode 100644 vendor/FreeType2/src/base/ftbase.c create mode 100644 vendor/FreeType2/src/base/ftbase.h create mode 100644 vendor/FreeType2/src/base/ftbbox.c create mode 100644 vendor/FreeType2/src/base/ftbdf.c create mode 100644 vendor/FreeType2/src/base/ftbitmap.c create mode 100644 vendor/FreeType2/src/base/ftcalc.c create mode 100644 vendor/FreeType2/src/base/ftcid.c create mode 100644 vendor/FreeType2/src/base/ftdbgmem.c create mode 100644 vendor/FreeType2/src/base/ftdebug.c create mode 100644 vendor/FreeType2/src/base/ftfntfmt.c create mode 100644 vendor/FreeType2/src/base/ftfstype.c create mode 100644 vendor/FreeType2/src/base/ftgasp.c create mode 100644 vendor/FreeType2/src/base/ftgloadr.c create mode 100644 vendor/FreeType2/src/base/ftglyph.c create mode 100644 vendor/FreeType2/src/base/ftgxval.c create mode 100644 vendor/FreeType2/src/base/fthash.c create mode 100644 vendor/FreeType2/src/base/ftinit.c create mode 100644 vendor/FreeType2/src/base/ftlcdfil.c create mode 100644 vendor/FreeType2/src/base/ftmac.c create mode 100644 vendor/FreeType2/src/base/ftmm.c create mode 100644 vendor/FreeType2/src/base/ftobjs.c create mode 100644 vendor/FreeType2/src/base/ftotval.c create mode 100644 vendor/FreeType2/src/base/ftoutln.c create mode 100644 vendor/FreeType2/src/base/ftpatent.c create mode 100644 vendor/FreeType2/src/base/ftpfr.c create mode 100644 vendor/FreeType2/src/base/ftpic.c create mode 100644 vendor/FreeType2/src/base/ftpsprop.c create mode 100644 vendor/FreeType2/src/base/ftrfork.c create mode 100644 vendor/FreeType2/src/base/ftsnames.c create mode 100644 vendor/FreeType2/src/base/ftstream.c create mode 100644 vendor/FreeType2/src/base/ftstroke.c create mode 100644 vendor/FreeType2/src/base/ftsynth.c create mode 100644 vendor/FreeType2/src/base/ftsystem.c create mode 100644 vendor/FreeType2/src/base/fttrigon.c create mode 100644 vendor/FreeType2/src/base/fttype1.c create mode 100644 vendor/FreeType2/src/base/ftutil.c create mode 100644 vendor/FreeType2/src/base/ftver.rc create mode 100644 vendor/FreeType2/src/base/ftwinfnt.c create mode 100644 vendor/FreeType2/src/base/md5.c create mode 100644 vendor/FreeType2/src/base/md5.h create mode 100644 vendor/FreeType2/src/base/module.lua create mode 100644 vendor/FreeType2/src/cff/cff.c create mode 100644 vendor/FreeType2/src/cff/cffcmap.c create mode 100644 vendor/FreeType2/src/cff/cffcmap.h create mode 100644 vendor/FreeType2/src/cff/cffdrivr.c create mode 100644 vendor/FreeType2/src/cff/cffdrivr.h create mode 100644 vendor/FreeType2/src/cff/cfferrs.h create mode 100644 vendor/FreeType2/src/cff/cffgload.c create mode 100644 vendor/FreeType2/src/cff/cffgload.h create mode 100644 vendor/FreeType2/src/cff/cffload.c create mode 100644 vendor/FreeType2/src/cff/cffload.h create mode 100644 vendor/FreeType2/src/cff/cffobjs.c create mode 100644 vendor/FreeType2/src/cff/cffobjs.h create mode 100644 vendor/FreeType2/src/cff/cffparse.c create mode 100644 vendor/FreeType2/src/cff/cffparse.h create mode 100644 vendor/FreeType2/src/cff/cffpic.c create mode 100644 vendor/FreeType2/src/cff/cffpic.h create mode 100644 vendor/FreeType2/src/cff/cfftoken.h create mode 100644 vendor/FreeType2/src/psaux/afmparse.c create mode 100644 vendor/FreeType2/src/psaux/afmparse.h create mode 100644 vendor/FreeType2/src/psaux/cffdecode.c create mode 100644 vendor/FreeType2/src/psaux/cffdecode.h create mode 100644 vendor/FreeType2/src/psaux/psarrst.c create mode 100644 vendor/FreeType2/src/psaux/psarrst.h create mode 100644 vendor/FreeType2/src/psaux/psaux.c create mode 100644 vendor/FreeType2/src/psaux/psauxerr.h create mode 100644 vendor/FreeType2/src/psaux/psauxmod.c create mode 100644 vendor/FreeType2/src/psaux/psauxmod.h create mode 100644 vendor/FreeType2/src/psaux/psblues.c create mode 100644 vendor/FreeType2/src/psaux/psblues.h create mode 100644 vendor/FreeType2/src/psaux/psconv.c create mode 100644 vendor/FreeType2/src/psaux/psconv.h create mode 100644 vendor/FreeType2/src/psaux/pserror.c create mode 100644 vendor/FreeType2/src/psaux/pserror.h create mode 100644 vendor/FreeType2/src/psaux/psfixed.h create mode 100644 vendor/FreeType2/src/psaux/psfont.c create mode 100644 vendor/FreeType2/src/psaux/psfont.h create mode 100644 vendor/FreeType2/src/psaux/psft.c create mode 100644 vendor/FreeType2/src/psaux/psft.h create mode 100644 vendor/FreeType2/src/psaux/psglue.h create mode 100644 vendor/FreeType2/src/psaux/pshints.c create mode 100644 vendor/FreeType2/src/psaux/pshints.h create mode 100644 vendor/FreeType2/src/psaux/psintrp.c create mode 100644 vendor/FreeType2/src/psaux/psintrp.h create mode 100644 vendor/FreeType2/src/psaux/psobjs.c create mode 100644 vendor/FreeType2/src/psaux/psobjs.h create mode 100644 vendor/FreeType2/src/psaux/psread.c create mode 100644 vendor/FreeType2/src/psaux/psread.h create mode 100644 vendor/FreeType2/src/psaux/psstack.c create mode 100644 vendor/FreeType2/src/psaux/psstack.h create mode 100644 vendor/FreeType2/src/psaux/pstypes.h create mode 100644 vendor/FreeType2/src/psaux/t1cmap.c create mode 100644 vendor/FreeType2/src/psaux/t1cmap.h create mode 100644 vendor/FreeType2/src/psaux/t1decode.c create mode 100644 vendor/FreeType2/src/psaux/t1decode.h create mode 100644 vendor/FreeType2/src/pshinter/pshalgo.c create mode 100644 vendor/FreeType2/src/pshinter/pshalgo.h create mode 100644 vendor/FreeType2/src/pshinter/pshglob.c create mode 100644 vendor/FreeType2/src/pshinter/pshglob.h create mode 100644 vendor/FreeType2/src/pshinter/pshinter.c create mode 100644 vendor/FreeType2/src/pshinter/pshmod.c create mode 100644 vendor/FreeType2/src/pshinter/pshmod.h create mode 100644 vendor/FreeType2/src/pshinter/pshnterr.h create mode 100644 vendor/FreeType2/src/pshinter/pshpic.c create mode 100644 vendor/FreeType2/src/pshinter/pshpic.h create mode 100644 vendor/FreeType2/src/pshinter/pshrec.c create mode 100644 vendor/FreeType2/src/pshinter/pshrec.h create mode 100644 vendor/FreeType2/src/psnames/psmodule.c create mode 100644 vendor/FreeType2/src/psnames/psmodule.h create mode 100644 vendor/FreeType2/src/psnames/psnamerr.h create mode 100644 vendor/FreeType2/src/psnames/psnames.c create mode 100644 vendor/FreeType2/src/psnames/pspic.c create mode 100644 vendor/FreeType2/src/psnames/pspic.h create mode 100644 vendor/FreeType2/src/psnames/pstables.h create mode 100644 vendor/FreeType2/src/raster/ftmisc.h create mode 100644 vendor/FreeType2/src/raster/ftraster.c create mode 100644 vendor/FreeType2/src/raster/ftraster.h create mode 100644 vendor/FreeType2/src/raster/ftrend1.c create mode 100644 vendor/FreeType2/src/raster/ftrend1.h create mode 100644 vendor/FreeType2/src/raster/raster.c create mode 100644 vendor/FreeType2/src/raster/rasterrs.h create mode 100644 vendor/FreeType2/src/raster/rastpic.c create mode 100644 vendor/FreeType2/src/raster/rastpic.h create mode 100644 vendor/FreeType2/src/sfnt/pngshim.c create mode 100644 vendor/FreeType2/src/sfnt/pngshim.h create mode 100644 vendor/FreeType2/src/sfnt/sfdriver.c create mode 100644 vendor/FreeType2/src/sfnt/sfdriver.h create mode 100644 vendor/FreeType2/src/sfnt/sferrors.h create mode 100644 vendor/FreeType2/src/sfnt/sfnt.c create mode 100644 vendor/FreeType2/src/sfnt/sfntpic.c create mode 100644 vendor/FreeType2/src/sfnt/sfntpic.h create mode 100644 vendor/FreeType2/src/sfnt/sfobjs.c create mode 100644 vendor/FreeType2/src/sfnt/sfobjs.h create mode 100644 vendor/FreeType2/src/sfnt/ttbdf.c create mode 100644 vendor/FreeType2/src/sfnt/ttbdf.h create mode 100644 vendor/FreeType2/src/sfnt/ttcmap.c create mode 100644 vendor/FreeType2/src/sfnt/ttcmap.h create mode 100644 vendor/FreeType2/src/sfnt/ttcmapc.h create mode 100644 vendor/FreeType2/src/sfnt/ttkern.c create mode 100644 vendor/FreeType2/src/sfnt/ttkern.h create mode 100644 vendor/FreeType2/src/sfnt/ttload.c create mode 100644 vendor/FreeType2/src/sfnt/ttload.h create mode 100644 vendor/FreeType2/src/sfnt/ttmtx.c create mode 100644 vendor/FreeType2/src/sfnt/ttmtx.h create mode 100644 vendor/FreeType2/src/sfnt/ttpost.c create mode 100644 vendor/FreeType2/src/sfnt/ttpost.h create mode 100644 vendor/FreeType2/src/sfnt/ttsbit.c create mode 100644 vendor/FreeType2/src/sfnt/ttsbit.h create mode 100644 vendor/FreeType2/src/smooth/ftgrays.c create mode 100644 vendor/FreeType2/src/smooth/ftgrays.h create mode 100644 vendor/FreeType2/src/smooth/ftsmerrs.h create mode 100644 vendor/FreeType2/src/smooth/ftsmooth.c create mode 100644 vendor/FreeType2/src/smooth/ftsmooth.h create mode 100644 vendor/FreeType2/src/smooth/ftspic.c create mode 100644 vendor/FreeType2/src/smooth/ftspic.h create mode 100644 vendor/FreeType2/src/smooth/smooth.c create mode 100644 vendor/FreeType2/src/truetype/truetype.c create mode 100644 vendor/FreeType2/src/truetype/ttdriver.c create mode 100644 vendor/FreeType2/src/truetype/ttdriver.h create mode 100644 vendor/FreeType2/src/truetype/tterrors.h create mode 100644 vendor/FreeType2/src/truetype/ttgload.c create mode 100644 vendor/FreeType2/src/truetype/ttgload.h create mode 100644 vendor/FreeType2/src/truetype/ttgxvar.c create mode 100644 vendor/FreeType2/src/truetype/ttgxvar.h create mode 100644 vendor/FreeType2/src/truetype/ttinterp.c create mode 100644 vendor/FreeType2/src/truetype/ttinterp.h create mode 100644 vendor/FreeType2/src/truetype/ttobjs.c create mode 100644 vendor/FreeType2/src/truetype/ttobjs.h create mode 100644 vendor/FreeType2/src/truetype/ttpic.c create mode 100644 vendor/FreeType2/src/truetype/ttpic.h create mode 100644 vendor/FreeType2/src/truetype/ttpload.c create mode 100644 vendor/FreeType2/src/truetype/ttpload.h create mode 100644 vendor/FreeType2/src/truetype/ttsubpix.c create mode 100644 vendor/FreeType2/src/truetype/ttsubpix.h diff --git a/bam.lua b/bam.lua index 60adb07..47fdaca 100644 --- a/bam.lua +++ b/bam.lua @@ -80,11 +80,7 @@ settings.cc.includes:Add("include/") settings.cc.includes:Add("source/") -- FreeType2 -if TARGET_OS == "Win32" then - settings.cc.includes:Add("vendor/FreeType2/include") -else - settings.cc.includes:Add("/usr/include/freetype2") -end +settings.cc.includes:Add("vendor/FreeType2/include") -- STB settings.cc.includes:Add("vendor/stb/include") @@ -194,6 +190,10 @@ local scene_module = Module("source/Scene", { -- Build target -------------------------------- +-- Dependancies +Import("vendor/FreeType2/build.lua") + +-- engine local obj = Compile(settings, { system_module, platform_common_module, @@ -209,7 +209,8 @@ local obj = Compile(settings, { local libspectre = StaticLibrary(settings, "spectre", - obj + obj, + ft2_obj ) -------------------------------- @@ -230,14 +231,6 @@ if TARGET_OS == "Win32" then -- Windows needs to link against these. example_settings.link.libs:Add("opengl32", "gdi32", "user32") - - -- Staticly link freetype on windows. - example_settings.link.libpath:Add("vendor/FreeType2/lib/x86") - if example_settings.debug > 0 then - example_settings.link.libs:Add("freetype-d-s") - else - example_settings.link.libs:Add("freetype-s") - end end -- For now, to get examples working diff --git a/vendor/FreeType2/.gitignore b/vendor/FreeType2/.gitignore new file mode 100644 index 0000000..ddd3f15 --- /dev/null +++ b/vendor/FreeType2/.gitignore @@ -0,0 +1,4 @@ + +# Ignore FreeTypes own build files. +*.mk +Jamfile diff --git a/vendor/FreeType2/build.lua b/vendor/FreeType2/build.lua new file mode 100644 index 0000000..316b427 --- /dev/null +++ b/vendor/FreeType2/build.lua @@ -0,0 +1,58 @@ +-------------------------------- +-- -- +-- FreeType2 build config -- +-- -- +-------------------------------- +local basepath = PathDir(ModuleFilename()) + +-- Modules +-------------------------------- +local ft_modules = { + "base", + "autofit", + "cff", + "psaux", + "pshinter", + "psnames", + "raster", + "sfnt", + "smooth", + "truetype", +} + +-- Settings +-------------------------------- +settings = TableDeepCopy(global_settings) + +settings.labelprefix = "[FT2] " + +-- Compile flags +settings.cc.includes:Add("include") +settings.cc.flags:Add("-DFT2_BUILD_LIBRARY") + +-- Build target +-------------------------------- + +local obj = {} + +-- Compile each module to object files. +for k,name in pairs(ft_modules) do + local mod_base = PathJoin(basepath, string.format("src/%s/", name)) + local module_file = PathJoin(mod_base, "module.lua") + + -- Check if we have a module.lua file + -- that defines the modules sources + local f = io.open(module_file) + if f then + Import(module_file) + else + -- Otherwise, We assume there is a .c + src = PathJoin(mod_base, string.format("%s.c", name)) + end + + obj[name] = Compile(settings, src) + PseudoTarget("ft2_" .. name, obj[name]) +end + +ft2_obj = TableFlatten(obj) +PseudoTarget("ft2", ft2_obj) diff --git a/vendor/FreeType2/include/freetype/config/ftconfig.h b/vendor/FreeType2/include/freetype/config/ftconfig.h index 52c5e33..eedebf4 100644 --- a/vendor/FreeType2/include/freetype/config/ftconfig.h +++ b/vendor/FreeType2/include/freetype/config/ftconfig.h @@ -461,8 +461,6 @@ FT_BEGIN_HEADER #define FT_EXPORT( x ) __declspec( dllexport ) x #elif defined( __GNUC__ ) && __GNUC__ >= 4 #define FT_EXPORT( x ) __attribute__(( visibility( "default" ) )) x -#elif defined( __SUNPRO_C ) && __SUNPRO_C >= 0x550 -#define FT_EXPORT( x ) __global x #elif defined( __cplusplus ) #define FT_EXPORT( x ) extern "C" x #else diff --git a/vendor/FreeType2/include/freetype/config/ftmodule.h b/vendor/FreeType2/include/freetype/config/ftmodule.h index 76d271a..8eacc38 100644 --- a/vendor/FreeType2/include/freetype/config/ftmodule.h +++ b/vendor/FreeType2/include/freetype/config/ftmodule.h @@ -1,32 +1,34 @@ /* + * Spectre FreeType2 module config. * This file registers the FreeType modules compiled into the library. - * - * If you use GNU make, this file IS NOT USED! Instead, it is created in - * the objects directory (normally `/objs/') based on information - * from `/modules.cfg'. - * - * Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile - * FreeType without GNU make. - * */ -FT_USE_MODULE( FT_Module_Class, autofit_module_class ) +/* + * Drivers + */ FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) -FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) -FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) -FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) -FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) -FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) -FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) -FT_USE_MODULE( FT_Module_Class, psaux_module_class ) -FT_USE_MODULE( FT_Module_Class, psnames_module_class ) -FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) -FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) -FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) -FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) +/* FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) */ -/* EOF */ +/* + * Rendering + */ +FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) /* Monochrome */ +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) /* AntiAlias */ +/* FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) */ +/* FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) */ + +/* + * Dependancies + */ +FT_USE_MODULE( FT_Module_Class, autofit_module_class ) +FT_USE_MODULE( FT_Module_Class, psaux_module_class ) /* needed by CFF/OpenType driver */ +FT_USE_MODULE( FT_Module_Class, psnames_module_class ) /* needed by CFF/OpenType & TrueType driver */ +FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) /* needed by CFF/OpenType driver */ +FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) /* needed by TrueType driver */ diff --git a/vendor/FreeType2/include/freetype/config/ftoption.h b/vendor/FreeType2/include/freetype/config/ftoption.h index 1cf6946..a393549 100644 --- a/vendor/FreeType2/include/freetype/config/ftoption.h +++ b/vendor/FreeType2/include/freetype/config/ftoption.h @@ -105,7 +105,7 @@ FT_BEGIN_HEADER /* cff:no-stem-darkening=1 \ */ /* autofitter:warping=1 */ /* */ -#define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES +/* #define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES */ /*************************************************************************/ @@ -178,7 +178,7 @@ FT_BEGIN_HEADER /* */ /* Define this macro if you want to enable this `feature'. */ /* */ -#define FT_CONFIG_OPTION_USE_LZW +/* #define FT_CONFIG_OPTION_USE_LZW */ /*************************************************************************/ @@ -193,7 +193,7 @@ FT_BEGIN_HEADER /* Define this macro if you want to enable this `feature'. See also */ /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ /* */ -#define FT_CONFIG_OPTION_USE_ZLIB +/* #define FT_CONFIG_OPTION_USE_ZLIB */ /*************************************************************************/ @@ -486,6 +486,35 @@ FT_BEGIN_HEADER #undef FT_CONFIG_OPTION_USE_MODULE_ERRORS + /*************************************************************************/ + /* */ + /* Position Independent Code */ + /* */ + /* If this macro is set (which is _not_ the default), FreeType2 will */ + /* avoid creating constants that require address fixups. Instead the */ + /* constants will be moved into a struct and additional intialization */ + /* code will be used. */ + /* */ + /* Setting this macro is needed for systems that prohibit address */ + /* fixups, such as BREW. [Note that standard compilers like gcc or */ + /* clang handle PIC generation automatically; you don't have to set */ + /* FT_CONFIG_OPTION_PIC, which is only necessary for very special */ + /* compilers.] */ + /* */ + /* Note that FT_CONFIG_OPTION_PIC support is not available for all */ + /* modules (see `modules.cfg' for a complete list). For building with */ + /* FT_CONFIG_OPTION_PIC support, do the following. */ + /* */ + /* 0. Clone the repository. */ + /* 1. Define FT_CONFIG_OPTION_PIC. */ + /* 2. Remove all subdirectories in `src' that don't have */ + /* FT_CONFIG_OPTION_PIC support. */ + /* 3. Comment out the corresponding modules in `modules.cfg'. */ + /* 4. Compile. */ + /* */ +/* #define FT_CONFIG_OPTION_PIC */ + + /*************************************************************************/ /*************************************************************************/ /**** ****/ @@ -629,8 +658,8 @@ FT_BEGIN_HEADER /* [1] https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */ /* */ /* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 1 */ -#define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2 -/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING ( 1 | 2 ) */ +/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2 */ +#define TT_CONFIG_OPTION_SUBPIXEL_HINTING ( 1 | 2 ) /*************************************************************************/ diff --git a/vendor/FreeType2/include/freetype/internal/autohint.h b/vendor/FreeType2/include/freetype/internal/autohint.h index 4991e3b..f4d308f 100644 --- a/vendor/FreeType2/include/freetype/internal/autohint.h +++ b/vendor/FreeType2/include/freetype/internal/autohint.h @@ -197,6 +197,8 @@ FT_BEGIN_HEADER } FT_AutoHinter_InterfaceRec, *FT_AutoHinter_Interface; +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_AUTOHINTER_INTERFACE( \ class_, \ reset_face_, \ @@ -212,6 +214,27 @@ FT_BEGIN_HEADER load_glyph_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_AUTOHINTER_INTERFACE( \ + class_, \ + reset_face_, \ + get_global_hints_, \ + done_global_hints_, \ + load_glyph_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Library library, \ + FT_AutoHinter_InterfaceRec* clazz ) \ + { \ + FT_UNUSED( library ); \ + \ + clazz->reset_face = reset_face_; \ + clazz->get_global_hints = get_global_hints_; \ + clazz->done_global_hints = done_global_hints_; \ + clazz->load_glyph = load_glyph_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ FT_END_HEADER diff --git a/vendor/FreeType2/include/freetype/internal/ftcalc.h b/vendor/FreeType2/include/freetype/internal/ftcalc.h index 3f889e6..818a812 100644 --- a/vendor/FreeType2/include/freetype/internal/ftcalc.h +++ b/vendor/FreeType2/include/freetype/internal/ftcalc.h @@ -341,7 +341,6 @@ FT_BEGIN_HEADER */ #ifndef FT_CONFIG_OPTION_NO_ASSEMBLER - #if defined( __GNUC__ ) && \ ( __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 4 ) ) @@ -355,30 +354,7 @@ FT_BEGIN_HEADER #endif - -#elif defined( _MSC_VER ) - -#if FT_SIZEOF_INT == 4 - -#include - - static inline FT_Int32 - FT_MSB_i386( FT_UInt32 x ) - { - unsigned long where; - - - _BitScanReverse( &where, x ); - - return (FT_Int32)where; - } - -#define FT_MSB( x ) ( FT_MSB_i386( x ) ) - -#endif - -#endif - +#endif /* __GNUC__ */ #endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ #ifndef FT_MSB diff --git a/vendor/FreeType2/include/freetype/internal/ftdrv.h b/vendor/FreeType2/include/freetype/internal/ftdrv.h index 77f4513..58dd35a 100644 --- a/vendor/FreeType2/include/freetype/internal/ftdrv.h +++ b/vendor/FreeType2/include/freetype/internal/ftdrv.h @@ -199,13 +199,30 @@ FT_BEGIN_HEADER /* */ /* Used to initialize an instance of FT_Driver_ClassRec struct. */ /* */ + /* When FT_CONFIG_OPTION_PIC is defined a `create' function has to be */ + /* called with a pointer where the allocated structure is returned. */ + /* And when it is no longer needed a `destroy' function needs to be */ + /* called to release that allocation. */ + /* */ /* `ftinit.c' (ft_create_default_module_classes) already contains a */ /* mechanism to call these functions for the default modules */ /* described in `ftmodule.h'. */ /* */ - /* The struct will be allocated in the global scope (or the scope */ - /* where the macro is used). */ + /* Notice that the created `create' and `destroy' functions call */ + /* `pic_init' and `pic_free' to allow you to manually allocate and */ + /* initialize any additional global data, like a module specific */ + /* interface, and put them in the global pic container defined in */ + /* `ftpic.h'. If you don't need them just implement the functions as */ + /* empty to resolve the link error. Also the `pic_init' and */ + /* `pic_free' functions should be declared in `pic.h', to be referred */ + /* by driver definition calling `FT_DEFINE_DRIVER' in following. */ /* */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro is */ + /* used). */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DECLARE_DRIVER( class_ ) \ FT_CALLBACK_TABLE \ const FT_Driver_ClassRec class_; @@ -272,6 +289,108 @@ FT_BEGIN_HEADER select_size_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DECLARE_DRIVER( class_ ) FT_DECLARE_MODULE( class_ ) + +#define FT_DEFINE_DRIVER( \ + class_, \ + flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_, \ + face_object_size_, \ + size_object_size_, \ + slot_object_size_, \ + init_face_, \ + done_face_, \ + init_size_, \ + done_size_, \ + init_slot_, \ + done_slot_, \ + load_glyph_, \ + get_kerning_, \ + attach_file_, \ + get_advances_, \ + request_size_, \ + select_size_ ) \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_Module_Class* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + FT_Driver_Class dclazz = (FT_Driver_Class)clazz; \ + \ + \ + class_ ## _pic_free( library ); \ + if ( dclazz ) \ + FT_FREE( dclazz ); \ + } \ + \ + \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_Module_Class** output_class ) \ + { \ + FT_Driver_Class clazz = NULL; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + \ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \ + return error; \ + \ + error = class_ ## _pic_init( library ); \ + if ( error ) \ + { \ + FT_FREE( clazz ); \ + return error; \ + } \ + \ + FT_DEFINE_ROOT_MODULE( flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_ ) \ + \ + clazz->face_object_size = face_object_size_; \ + clazz->size_object_size = size_object_size_; \ + clazz->slot_object_size = slot_object_size_; \ + \ + clazz->init_face = init_face_; \ + clazz->done_face = done_face_; \ + \ + clazz->init_size = init_size_; \ + clazz->done_size = done_size_; \ + \ + clazz->init_slot = init_slot_; \ + clazz->done_slot = done_slot_; \ + \ + clazz->load_glyph = load_glyph_; \ + \ + clazz->get_kerning = get_kerning_; \ + clazz->attach_file = attach_file_; \ + clazz->get_advances = get_advances_; \ + \ + clazz->request_size = request_size_; \ + clazz->select_size = select_size_; \ + \ + *output_class = (FT_Module_Class*)clazz; \ + \ + return FT_Err_Ok; \ + } + + +#endif /* FT_CONFIG_OPTION_PIC */ FT_END_HEADER diff --git a/vendor/FreeType2/include/freetype/internal/ftobjs.h b/vendor/FreeType2/include/freetype/internal/ftobjs.h index af1e171..1c3c6ad 100644 --- a/vendor/FreeType2/include/freetype/internal/ftobjs.h +++ b/vendor/FreeType2/include/freetype/internal/ftobjs.h @@ -35,6 +35,7 @@ #include FT_INTERNAL_DRIVER_H #include FT_INTERNAL_AUTOHINT_H #include FT_INTERNAL_SERVICE_H +#include FT_INTERNAL_PIC_H #include FT_INTERNAL_CALC_H #ifdef FT_CONFIG_OPTION_INCREMENTAL @@ -227,6 +228,8 @@ FT_BEGIN_HEADER } FT_CMap_ClassRec; +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DECLARE_CMAP_CLASS( class_ ) \ FT_CALLBACK_TABLE const FT_CMap_ClassRec class_; @@ -257,6 +260,45 @@ FT_BEGIN_HEADER variantchar_list_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DECLARE_CMAP_CLASS( class_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Library library, \ + FT_CMap_ClassRec* clazz ); + +#define FT_DEFINE_CMAP_CLASS( \ + class_, \ + size_, \ + init_, \ + done_, \ + char_index_, \ + char_next_, \ + char_var_index_, \ + char_var_default_, \ + variant_list_, \ + charvariant_list_, \ + variantchar_list_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Library library, \ + FT_CMap_ClassRec* clazz ) \ + { \ + FT_UNUSED( library ); \ + \ + clazz->size = size_; \ + clazz->init = init_; \ + clazz->done = done_; \ + clazz->char_index = char_index_; \ + clazz->char_next = char_next_; \ + clazz->char_var_index = char_var_index_; \ + clazz->char_var_default = char_var_default_; \ + clazz->variant_list = variant_list_; \ + clazz->charvariant_list = charvariant_list_; \ + clazz->variantchar_list = variantchar_list_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /* create a new charmap and add it to charmap->face */ FT_BASE( FT_Error ) @@ -893,6 +935,10 @@ FT_BEGIN_HEADER FT_Bitmap_LcdFilterFunc lcd_filter_func; /* filtering callback */ #endif +#ifdef FT_CONFIG_OPTION_PIC + FT_PIC_Container pic_container; +#endif + FT_Int refcount; } FT_LibraryRec; @@ -967,6 +1013,22 @@ FT_BEGIN_HEADER #endif + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** P I C S U P P O R T ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* PIC support macros for ftimage.h */ + + /*************************************************************************/ /* */ /* */ @@ -974,9 +1036,14 @@ FT_BEGIN_HEADER /* */ /* */ /* Used to initialize an instance of FT_Outline_Funcs struct. */ - /* The struct will be allocated in the global scope (or the scope */ - /* where the macro is used). */ + /* When FT_CONFIG_OPTION_PIC is defined an init function will need */ + /* to be called with a pre-allocated structure to be filled. */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ /* */ +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_OUTLINE_FUNCS( \ class_, \ move_to_, \ @@ -995,6 +1062,31 @@ FT_BEGIN_HEADER delta_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_OUTLINE_FUNCS( \ + class_, \ + move_to_, \ + line_to_, \ + conic_to_, \ + cubic_to_, \ + shift_, \ + delta_ ) \ + static FT_Error \ + Init_Class_ ## class_( FT_Outline_Funcs* clazz ) \ + { \ + clazz->move_to = move_to_; \ + clazz->line_to = line_to_; \ + clazz->conic_to = conic_to_; \ + clazz->cubic_to = cubic_to_; \ + clazz->shift = shift_; \ + clazz->delta = delta_; \ + \ + return FT_Err_Ok; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /*************************************************************************/ /* */ @@ -1003,9 +1095,14 @@ FT_BEGIN_HEADER /* */ /* */ /* Used to initialize an instance of FT_Raster_Funcs struct. */ - /* The struct will be allocated in the global scope (or the scope */ - /* where the macro is used). */ + /* When FT_CONFIG_OPTION_PIC is defined an init function will need */ + /* to be called with a pre-allocated structure to be filled. */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ /* */ +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_RASTER_FUNCS( \ class_, \ glyph_format_, \ @@ -1024,6 +1121,31 @@ FT_BEGIN_HEADER raster_done_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_RASTER_FUNCS( \ + class_, \ + glyph_format_, \ + raster_new_, \ + raster_reset_, \ + raster_set_mode_, \ + raster_render_, \ + raster_done_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Raster_Funcs* clazz ) \ + { \ + clazz->glyph_format = glyph_format_; \ + clazz->raster_new = raster_new_; \ + clazz->raster_reset = raster_reset_; \ + clazz->raster_set_mode = raster_set_mode_; \ + clazz->raster_render = raster_render_; \ + clazz->raster_done = raster_done_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + + /* PIC support macros for ftrender.h */ /*************************************************************************/ @@ -1032,9 +1154,15 @@ FT_BEGIN_HEADER /* FT_DEFINE_GLYPH */ /* */ /* */ - /* The struct will be allocated in the global scope (or the scope */ - /* where the macro is used). */ + /* Used to initialize an instance of FT_Glyph_Class struct. */ + /* When FT_CONFIG_OPTION_PIC is defined an init function will need */ + /* to be called with a pre-allocated structure to be filled. */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ /* */ +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_GLYPH( \ class_, \ size_, \ @@ -1058,6 +1186,33 @@ FT_BEGIN_HEADER prepare_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_GLYPH( \ + class_, \ + size_, \ + format_, \ + init_, \ + done_, \ + copy_, \ + transform_, \ + bbox_, \ + prepare_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Glyph_Class* clazz ) \ + { \ + clazz->glyph_size = size_; \ + clazz->glyph_format = format_; \ + clazz->glyph_init = init_; \ + clazz->glyph_done = done_; \ + clazz->glyph_copy = copy_; \ + clazz->glyph_transform = transform_; \ + clazz->glyph_bbox = bbox_; \ + clazz->glyph_prepare = prepare_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /*************************************************************************/ /* */ @@ -1074,9 +1229,30 @@ FT_BEGIN_HEADER /* */ /* Used to initialize an instance of FT_Renderer_Class struct. */ /* */ - /* The struct will be allocated in the global scope (or the scope */ - /* where the macro is used). */ + /* When FT_CONFIG_OPTION_PIC is defined a `create' function will */ + /* need to be called with a pointer where the allocated structure is */ + /* returned. And when it is no longer needed a `destroy' function */ + /* needs to be called to release that allocation. */ + /* `ftinit.c' (ft_create_default_module_classes) already contains */ + /* a mechanism to call these functions for the default modules */ + /* described in `ftmodule.h'. */ /* */ + /* Notice that the created `create' and `destroy' functions call */ + /* `pic_init' and `pic_free' to allow you to manually allocate and */ + /* initialize any additional global data, like a module specific */ + /* interface, and put them in the global pic container defined in */ + /* `ftpic.h'. If you don't need them just implement the functions as */ + /* empty to resolve the link error. Also the `pic_init' and */ + /* `pic_free' functions should be declared in `pic.h', to be referred */ + /* by the renderer definition calling `FT_DEFINE_RENDERER' in the */ + /* following. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DECLARE_RENDERER( class_ ) \ FT_EXPORT_VAR( const FT_Renderer_Class ) class_; @@ -1119,6 +1295,128 @@ FT_BEGIN_HEADER raster_class_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DECLARE_RENDERER( class_ ) FT_DECLARE_MODULE( class_ ) + +#define FT_DEFINE_RENDERER( \ + class_, \ + flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_, \ + glyph_format_, \ + render_glyph_, \ + transform_glyph_, \ + get_glyph_cbox_, \ + set_mode_, \ + raster_class_ ) \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_Module_Class* clazz ) \ + { \ + FT_Renderer_Class* rclazz = (FT_Renderer_Class*)clazz; \ + FT_Memory memory = library->memory; \ + \ + \ + class_ ## _pic_free( library ); \ + if ( rclazz ) \ + FT_FREE( rclazz ); \ + } \ + \ + \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_Module_Class** output_class ) \ + { \ + FT_Renderer_Class* clazz = NULL; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + \ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \ + return error; \ + \ + error = class_ ## _pic_init( library ); \ + if ( error ) \ + { \ + FT_FREE( clazz ); \ + return error; \ + } \ + \ + FT_DEFINE_ROOT_MODULE( flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_ ) \ + \ + clazz->glyph_format = glyph_format_; \ + \ + clazz->render_glyph = render_glyph_; \ + clazz->transform_glyph = transform_glyph_; \ + clazz->get_glyph_cbox = get_glyph_cbox_; \ + clazz->set_mode = set_mode_; \ + \ + clazz->raster_class = raster_class_; \ + \ + *output_class = (FT_Module_Class*)clazz; \ + \ + return FT_Err_Ok; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + + /* PIC support macros for ftmodapi.h **/ + + +#ifdef FT_CONFIG_OPTION_PIC + + /*************************************************************************/ + /* */ + /* */ + /* FT_Module_Creator */ + /* */ + /* */ + /* A function used to create (allocate) a new module class object. */ + /* The object's members are initialized, but the module itself is */ + /* not. */ + /* */ + /* */ + /* memory :: A handle to the memory manager. */ + /* output_class :: Initialized with the newly allocated class. */ + /* */ + typedef FT_Error + (*FT_Module_Creator)( FT_Memory memory, + FT_Module_Class** output_class ); + + /*************************************************************************/ + /* */ + /* */ + /* FT_Module_Destroyer */ + /* */ + /* */ + /* A function used to destroy (deallocate) a module class object. */ + /* */ + /* */ + /* memory :: A handle to the memory manager. */ + /* clazz :: Module class to destroy. */ + /* */ + typedef void + (*FT_Module_Destroyer)( FT_Memory memory, + FT_Module_Class* clazz ); + +#endif + /*************************************************************************/ /* */ @@ -1135,8 +1433,27 @@ FT_BEGIN_HEADER /* */ /* Used to initialize an instance of an FT_Module_Class struct. */ /* */ - /* The struct will be allocated in the global scope (or the scope */ - /* where the macro is used). */ + /* When FT_CONFIG_OPTION_PIC is defined a `create' function needs */ + /* to be called with a pointer where the allocated structure is */ + /* returned. And when it is no longer needed a `destroy' function */ + /* needs to be called to release that allocation. */ + /* `ftinit.c' (ft_create_default_module_classes) already contains */ + /* a mechanism to call these functions for the default modules */ + /* described in `ftmodule.h'. */ + /* */ + /* Notice that the created `create' and `destroy' functions call */ + /* `pic_init' and `pic_free' to allow you to manually allocate and */ + /* initialize any additional global data, like a module specific */ + /* interface, and put them in the global pic container defined in */ + /* `ftpic.h'. If you don't need them just implement the functions as */ + /* empty to resolve the link error. Also the `pic_init' and */ + /* `pic_free' functions should be declared in `pic.h', to be referred */ + /* by the module definition calling `FT_DEFINE_MODULE' in the */ + /* following. */ + /* */ + /* When FT_CONFIG_OPTION_PIC is not defined the struct will be */ + /* allocated in the global scope (or the scope where the macro */ + /* is used). */ /* */ /* */ /* FT_DEFINE_ROOT_MODULE */ @@ -1146,6 +1463,8 @@ FT_BEGIN_HEADER /* another struct that contains it or in a function that initializes */ /* that containing struct. */ /* */ +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DECLARE_MODULE( class_ ) \ FT_CALLBACK_TABLE \ const FT_Module_Class class_; @@ -1204,6 +1523,100 @@ FT_BEGIN_HEADER }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DECLARE_MODULE( class_ ) \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_Module_Class** output_class ); \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_Module_Class* clazz ); + +#define FT_DEFINE_ROOT_MODULE( \ + flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_ ) \ + clazz->root.module_flags = flags_; \ + clazz->root.module_size = size_; \ + clazz->root.module_name = name_; \ + clazz->root.module_version = version_; \ + clazz->root.module_requires = requires_; \ + \ + clazz->root.module_interface = interface_; \ + \ + clazz->root.module_init = init_; \ + clazz->root.module_done = done_; \ + clazz->root.get_interface = get_interface_; + +#define FT_DEFINE_MODULE( \ + class_, \ + flags_, \ + size_, \ + name_, \ + version_, \ + requires_, \ + interface_, \ + init_, \ + done_, \ + get_interface_ ) \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_Module_Class* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + \ + \ + class_ ## _pic_free( library ); \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_Module_Class** output_class ) \ + { \ + FT_Memory memory = library->memory; \ + FT_Module_Class* clazz = NULL; \ + FT_Error error; \ + \ + \ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) ) ) \ + return error; \ + error = class_ ## _pic_init( library ); \ + if ( error ) \ + { \ + FT_FREE( clazz ); \ + return error; \ + } \ + \ + clazz->module_flags = flags_; \ + clazz->module_size = size_; \ + clazz->module_name = name_; \ + clazz->module_version = version_; \ + clazz->module_requires = requires_; \ + \ + clazz->module_interface = interface_; \ + \ + clazz->module_init = init_; \ + clazz->module_done = done_; \ + clazz->get_interface = get_interface_; \ + \ + *output_class = clazz; \ + \ + return FT_Err_Ok; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + FT_END_HEADER #endif /* FTOBJS_H_ */ diff --git a/vendor/FreeType2/include/freetype/internal/ftpic.h b/vendor/FreeType2/include/freetype/internal/ftpic.h new file mode 100644 index 0000000..5214f05 --- /dev/null +++ b/vendor/FreeType2/include/freetype/internal/ftpic.h @@ -0,0 +1,71 @@ +/***************************************************************************/ +/* */ +/* ftpic.h */ +/* */ +/* The FreeType position independent code services (declaration). */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Modules that ordinarily have const global data that need address */ + /* can instead define pointers here. */ + /* */ + /*************************************************************************/ + + +#ifndef FTPIC_H_ +#define FTPIC_H_ + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_PIC + + typedef struct FT_PIC_Container_ + { + /* pic containers for base */ + void* base; + + /* pic containers for modules */ + void* autofit; + void* cff; + void* pshinter; + void* psnames; + void* raster; + void* sfnt; + void* smooth; + void* truetype; + + } FT_PIC_Container; + + + /* Initialize the various function tables, structs, etc. */ + /* stored in the container. */ + FT_BASE( FT_Error ) + ft_pic_container_init( FT_Library library ); + + + /* Destroy the contents of the container. */ + FT_BASE( void ) + ft_pic_container_destroy( FT_Library library ); + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* FTPIC_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/include/freetype/internal/ftrfork.h b/vendor/FreeType2/include/freetype/internal/ftrfork.h index 825be9c..1aca48a 100644 --- a/vendor/FreeType2/include/freetype/internal/ftrfork.h +++ b/vendor/FreeType2/include/freetype/internal/ftrfork.h @@ -80,15 +80,35 @@ FT_BEGIN_HEADER FT_RFork_Rule type; } ft_raccess_guess_rec; +#ifndef FT_CONFIG_OPTION_PIC + /* this array is a storage in non-PIC mode, so ; is needed in END */ #define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type ) \ static const type name[] = { #define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix ) \ { raccess_guess_ ## func_suffix, \ FT_RFork_Rule_ ## type_suffix }, - /* this array is a storage, thus a final `;' is needed */ #define CONST_FT_RFORK_RULE_ARRAY_END }; +#else /* FT_CONFIG_OPTION_PIC */ + + /* this array is a function in PIC mode, so no ; is needed in END */ +#define CONST_FT_RFORK_RULE_ARRAY_BEGIN( name, type ) \ + void \ + FT_Init_Table_ ## name( type* storage ) \ + { \ + type* local = storage; \ + \ + \ + int i = 0; +#define CONST_FT_RFORK_RULE_ARRAY_ENTRY( func_suffix, type_suffix ) \ + local[i].func = raccess_guess_ ## func_suffix; \ + local[i].type = FT_RFork_Rule_ ## type_suffix; \ + i++; +#define CONST_FT_RFORK_RULE_ARRAY_END } + +#endif /* FT_CONFIG_OPTION_PIC */ + #endif /* FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ diff --git a/vendor/FreeType2/include/freetype/internal/ftserv.h b/vendor/FreeType2/include/freetype/internal/ftserv.h index 6ca6050..e01c167 100644 --- a/vendor/FreeType2/include/freetype/internal/ftserv.h +++ b/vendor/FreeType2/include/freetype/internal/ftserv.h @@ -168,15 +168,24 @@ FT_BEGIN_HEADER /* FT_DEFINE_SERVICEDESCREC6 */ /* FT_DEFINE_SERVICEDESCREC7 */ /* FT_DEFINE_SERVICEDESCREC8 */ - /* FT_DEFINE_SERVICEDESCREC9 */ - /* FT_DEFINE_SERVICEDESCREC10 */ /* */ /* */ /* Used to initialize an array of FT_ServiceDescRec structures. */ /* */ - /* The array will be allocated in the global scope (or the scope */ - /* where the macro is used). */ + /* When FT_CONFIG_OPTION_PIC is defined a `create' function needs to */ + /* be called with a pointer to return an allocated array. As soon as */ + /* it is no longer needed, a `destroy' function needs to be called to */ + /* release that allocation. */ /* */ + /* These functions should be manually called from the `pic_init' and */ + /* `pic_free' functions of your module (see FT_DEFINE_MODULE). */ + /* */ + /* When FT_CONFIG_OPTION_PIC is not defined the array will be */ + /* allocated in the global scope (or the scope where the macro is */ + /* used). */ + /* */ +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_SERVICEDESCREC1( class_, \ serv_id_1, serv_data_1 ) \ static const FT_ServiceDescRec class_[] = \ @@ -347,6 +356,495 @@ FT_BEGIN_HEADER { NULL, NULL } \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICEDESCREC1( class_, \ + serv_id_1, serv_data_1 ) \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + \ + \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec** output_class ) \ + { \ + FT_ServiceDescRec* clazz = NULL; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + \ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 2 ) ) \ + return error; \ + \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = NULL; \ + clazz[1].serv_data = NULL; \ + \ + *output_class = clazz; \ + \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC2( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2 ) \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + \ + \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec** output_class ) \ + { \ + FT_ServiceDescRec* clazz = NULL; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + \ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 3 ) ) \ + return error; \ + \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = NULL; \ + clazz[2].serv_data = NULL; \ + \ + *output_class = clazz; \ + \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC3( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3 ) \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + \ + \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec** output_class ) \ + { \ + FT_ServiceDescRec* clazz = NULL; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + \ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 4 ) ) \ + return error; \ + \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = NULL; \ + clazz[3].serv_data = NULL; \ + \ + *output_class = clazz; \ + \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC4( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4 ) \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + \ + \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec** output_class ) \ + { \ + FT_ServiceDescRec* clazz = NULL; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + \ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 5 ) ) \ + return error; \ + \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = serv_id_4; \ + clazz[3].serv_data = serv_data_4; \ + clazz[4].serv_id = NULL; \ + clazz[4].serv_data = NULL; \ + \ + *output_class = clazz; \ + \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC5( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5 ) \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + \ + \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec** output_class ) \ + { \ + FT_ServiceDescRec* clazz = NULL; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + \ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 6 ) ) \ + return error; \ + \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = serv_id_4; \ + clazz[3].serv_data = serv_data_4; \ + clazz[4].serv_id = serv_id_5; \ + clazz[4].serv_data = serv_data_5; \ + clazz[5].serv_id = NULL; \ + clazz[5].serv_data = NULL; \ + \ + *output_class = clazz; \ + \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC6( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6 ) \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + \ + \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec** output_class ) \ + { \ + FT_ServiceDescRec* clazz = NULL; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + \ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 7 ) ) \ + return error; \ + \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = serv_id_4; \ + clazz[3].serv_data = serv_data_4; \ + clazz[4].serv_id = serv_id_5; \ + clazz[4].serv_data = serv_data_5; \ + clazz[5].serv_id = serv_id_6; \ + clazz[5].serv_data = serv_data_6; \ + clazz[6].serv_id = NULL; \ + clazz[6].serv_data = NULL; \ + \ + *output_class = clazz; \ + \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC7( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7 ) \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + \ + \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec** output_class ) \ + { \ + FT_ServiceDescRec* clazz = NULL; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + \ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 8 ) ) \ + return error; \ + \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = serv_id_4; \ + clazz[3].serv_data = serv_data_4; \ + clazz[4].serv_id = serv_id_5; \ + clazz[4].serv_data = serv_data_5; \ + clazz[5].serv_id = serv_id_6; \ + clazz[5].serv_data = serv_data_6; \ + clazz[6].serv_id = serv_id_7; \ + clazz[6].serv_data = serv_data_7; \ + clazz[7].serv_id = NULL; \ + clazz[7].serv_data = NULL; \ + \ + *output_class = clazz; \ + \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC8( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7, \ + serv_id_8, serv_data_8 ) \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + \ + \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec** output_class ) \ + { \ + FT_ServiceDescRec* clazz = NULL; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + \ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 9 ) ) \ + return error; \ + \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = serv_id_4; \ + clazz[3].serv_data = serv_data_4; \ + clazz[4].serv_id = serv_id_5; \ + clazz[4].serv_data = serv_data_5; \ + clazz[5].serv_id = serv_id_6; \ + clazz[5].serv_data = serv_data_6; \ + clazz[6].serv_id = serv_id_7; \ + clazz[6].serv_data = serv_data_7; \ + clazz[7].serv_id = serv_id_8; \ + clazz[7].serv_data = serv_data_8; \ + clazz[8].serv_id = NULL; \ + clazz[8].serv_data = NULL; \ + \ + *output_class = clazz; \ + \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC9( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7, \ + serv_id_8, serv_data_8, \ + serv_id_9, serv_data_9 ) \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + \ + \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec** output_class ) \ + { \ + FT_ServiceDescRec* clazz = NULL; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + \ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 10 ) ) \ + return error; \ + \ + clazz[0].serv_id = serv_id_1; \ + clazz[0].serv_data = serv_data_1; \ + clazz[1].serv_id = serv_id_2; \ + clazz[1].serv_data = serv_data_2; \ + clazz[2].serv_id = serv_id_3; \ + clazz[2].serv_data = serv_data_3; \ + clazz[3].serv_id = serv_id_4; \ + clazz[3].serv_data = serv_data_4; \ + clazz[4].serv_id = serv_id_5; \ + clazz[4].serv_data = serv_data_5; \ + clazz[5].serv_id = serv_id_6; \ + clazz[5].serv_data = serv_data_6; \ + clazz[6].serv_id = serv_id_7; \ + clazz[6].serv_data = serv_data_7; \ + clazz[7].serv_id = serv_id_8; \ + clazz[7].serv_data = serv_data_8; \ + clazz[8].serv_id = serv_id_9; \ + clazz[8].serv_data = serv_data_9; \ + clazz[9].serv_id = NULL; \ + clazz[9].serv_data = NULL; \ + \ + *output_class = clazz; \ + \ + return FT_Err_Ok; \ + } + +#define FT_DEFINE_SERVICEDESCREC10( class_, \ + serv_id_1, serv_data_1, \ + serv_id_2, serv_data_2, \ + serv_id_3, serv_data_3, \ + serv_id_4, serv_data_4, \ + serv_id_5, serv_data_5, \ + serv_id_6, serv_data_6, \ + serv_id_7, serv_data_7, \ + serv_id_8, serv_data_8, \ + serv_id_9, serv_data_9, \ + serv_id_10, serv_data_10 ) \ + void \ + FT_Destroy_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec* clazz ) \ + { \ + FT_Memory memory = library->memory; \ + \ + \ + if ( clazz ) \ + FT_FREE( clazz ); \ + } \ + \ + FT_Error \ + FT_Create_Class_ ## class_( FT_Library library, \ + FT_ServiceDescRec** output_class ) \ + { \ + FT_ServiceDescRec* clazz = NULL; \ + FT_Error error; \ + FT_Memory memory = library->memory; \ + \ + \ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) * 11 ) ) \ + return error; \ + \ + clazz[ 0].serv_id = serv_id_1; \ + clazz[ 0].serv_data = serv_data_1; \ + clazz[ 1].serv_id = serv_id_2; \ + clazz[ 1].serv_data = serv_data_2; \ + clazz[ 2].serv_id = serv_id_3; \ + clazz[ 2].serv_data = serv_data_3; \ + clazz[ 3].serv_id = serv_id_4; \ + clazz[ 3].serv_data = serv_data_4; \ + clazz[ 4].serv_id = serv_id_5; \ + clazz[ 4].serv_data = serv_data_5; \ + clazz[ 5].serv_id = serv_id_6; \ + clazz[ 5].serv_data = serv_data_6; \ + clazz[ 6].serv_id = serv_id_7; \ + clazz[ 6].serv_data = serv_data_7; \ + clazz[ 7].serv_id = serv_id_8; \ + clazz[ 7].serv_data = serv_data_8; \ + clazz[ 8].serv_id = serv_id_9; \ + clazz[ 8].serv_data = serv_data_9; \ + clazz[ 9].serv_id = serv_id_10; \ + clazz[ 9].serv_data = serv_data_10; \ + clazz[10].serv_id = NULL; \ + clazz[10].serv_data = NULL; \ + \ + *output_class = clazz; \ + \ + return FT_Err_Ok; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /* * Parse a list of FT_ServiceDescRec descriptors and look for diff --git a/vendor/FreeType2/include/freetype/internal/internal.h b/vendor/FreeType2/include/freetype/internal/internal.h index 53b5b17..8f546e4 100644 --- a/vendor/FreeType2/include/freetype/internal/internal.h +++ b/vendor/FreeType2/include/freetype/internal/internal.h @@ -25,6 +25,7 @@ #define FT_INTERNAL_OBJECTS_H +#define FT_INTERNAL_PIC_H #define FT_INTERNAL_STREAM_H #define FT_INTERNAL_MEMORY_H #define FT_INTERNAL_DEBUG_H diff --git a/vendor/FreeType2/include/freetype/internal/pshints.h b/vendor/FreeType2/include/freetype/internal/pshints.h index 249cf97..d29314e 100644 --- a/vendor/FreeType2/include/freetype/internal/pshints.h +++ b/vendor/FreeType2/include/freetype/internal/pshints.h @@ -680,6 +680,8 @@ FT_BEGIN_HEADER typedef PSHinter_Interface* PSHinter_Service; +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_PSHINTER_INTERFACE( \ class_, \ get_globals_funcs_, \ @@ -692,6 +694,25 @@ FT_BEGIN_HEADER get_t2_funcs_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_PSHINTER_INTERFACE( \ + class_, \ + get_globals_funcs_, \ + get_t1_funcs_, \ + get_t2_funcs_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Library library, \ + PSHinter_Interface* clazz ) \ + { \ + FT_UNUSED( library ); \ + \ + clazz->get_globals_funcs = get_globals_funcs_; \ + clazz->get_t1_funcs = get_t1_funcs_; \ + clazz->get_t2_funcs = get_t2_funcs_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ FT_END_HEADER diff --git a/vendor/FreeType2/include/freetype/internal/services/svbdf.h b/vendor/FreeType2/include/freetype/internal/services/svbdf.h index e2133d7..4a9ec20 100644 --- a/vendor/FreeType2/include/freetype/internal/services/svbdf.h +++ b/vendor/FreeType2/include/freetype/internal/services/svbdf.h @@ -46,6 +46,8 @@ FT_BEGIN_HEADER }; +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_SERVICE_BDFRec( class_, \ get_charset_id_, \ get_property_ ) \ @@ -54,6 +56,20 @@ FT_BEGIN_HEADER get_charset_id_, get_property_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_BDFRec( class_, \ + get_charset_id_, \ + get_property_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Service_BDFRec* clazz ) \ + { \ + clazz->get_charset_id = get_charset_id_; \ + clazz->get_property = get_property_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /* */ diff --git a/vendor/FreeType2/include/freetype/internal/services/svcfftl.h b/vendor/FreeType2/include/freetype/internal/services/svcfftl.h index 55a3fa4..db623e6 100644 --- a/vendor/FreeType2/include/freetype/internal/services/svcfftl.h +++ b/vendor/FreeType2/include/freetype/internal/services/svcfftl.h @@ -65,6 +65,8 @@ FT_BEGIN_HEADER }; +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_SERVICE_CFFLOADREC( class_, \ get_standard_encoding_, \ load_private_dict_, \ @@ -80,6 +82,26 @@ FT_BEGIN_HEADER blend_build_vector_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_CFFLOADREC( class_, \ + get_standard_encoding_, \ + load_private_dict_, \ + fd_select_get_, \ + blend_check_vector_, \ + blend_build_vector_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Service_CFFLoadRec* clazz ) \ + { \ + clazz->get_standard_encoding = get_standard_encoding_; \ + clazz->load_private_dict = load_private_dict_; \ + clazz->fd_select_get = fd_select_get_; \ + clazz->blend_check_vector = blend_check_vector_; \ + clazz->blend_build_vector = blend_build_vector_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + FT_END_HEADER diff --git a/vendor/FreeType2/include/freetype/internal/services/svcid.h b/vendor/FreeType2/include/freetype/internal/services/svcid.h index fb0c90b..cb59ac6 100644 --- a/vendor/FreeType2/include/freetype/internal/services/svcid.h +++ b/vendor/FreeType2/include/freetype/internal/services/svcid.h @@ -48,6 +48,8 @@ FT_BEGIN_HEADER }; +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_SERVICE_CIDREC( class_, \ get_ros_, \ get_is_cid_, \ @@ -57,6 +59,25 @@ FT_BEGIN_HEADER get_ros_, get_is_cid_, get_cid_from_glyph_index_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_CIDREC( class_, \ + get_ros_, \ + get_is_cid_, \ + get_cid_from_glyph_index_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Library library, \ + FT_Service_CIDRec* clazz ) \ + { \ + FT_UNUSED( library ); \ + \ + clazz->get_ros = get_ros_; \ + clazz->get_is_cid = get_is_cid_; \ + clazz->get_cid_from_glyph_index = get_cid_from_glyph_index_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /* */ diff --git a/vendor/FreeType2/include/freetype/internal/services/svgldict.h b/vendor/FreeType2/include/freetype/internal/services/svgldict.h index d401a43..f1a68e3 100644 --- a/vendor/FreeType2/include/freetype/internal/services/svgldict.h +++ b/vendor/FreeType2/include/freetype/internal/services/svgldict.h @@ -52,6 +52,8 @@ FT_BEGIN_HEADER }; +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_SERVICE_GLYPHDICTREC( class_, \ get_name_, \ name_index_ ) \ @@ -60,6 +62,23 @@ FT_BEGIN_HEADER get_name_, name_index_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_GLYPHDICTREC( class_, \ + get_name_, \ + name_index_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Library library, \ + FT_Service_GlyphDictRec* clazz ) \ + { \ + FT_UNUSED( library ); \ + \ + clazz->get_name = get_name_; \ + clazz->name_index = name_index_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /* */ diff --git a/vendor/FreeType2/include/freetype/internal/services/svmetric.h b/vendor/FreeType2/include/freetype/internal/services/svmetric.h index e5a1a0e..abaacdd 100644 --- a/vendor/FreeType2/include/freetype/internal/services/svmetric.h +++ b/vendor/FreeType2/include/freetype/internal/services/svmetric.h @@ -93,6 +93,8 @@ FT_BEGIN_HEADER }; +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_SERVICE_METRICSVARIATIONSREC( class_, \ hadvance_adjust_, \ lsb_adjust_, \ @@ -114,6 +116,32 @@ FT_BEGIN_HEADER metrics_adjust_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_METRICSVARIATIONSREC( class_, \ + hadvance_adjust_, \ + lsb_adjust_, \ + rsb_adjust_, \ + vadvance_adjust_, \ + tsb_adjust_, \ + bsb_adjust_, \ + vorg_adjust_, \ + metrics_adjust_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Service_MetricsVariationsRec* clazz ) \ + { \ + clazz->hadvance_adjust = hadvance_adjust_; \ + clazz->lsb_adjust = lsb_adjust_; \ + clazz->rsb_adjust = rsb_adjust_; \ + clazz->vadvance_adjust = vadvance_adjust_; \ + clazz->tsb_adjust = tsb_adjust_; \ + clazz->bsb_adjust = bsb_adjust_; \ + clazz->vorg_adjust = vorg_adjust_; \ + clazz->metrics_adjust = metrics_adjust_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /* */ diff --git a/vendor/FreeType2/include/freetype/internal/services/svmm.h b/vendor/FreeType2/include/freetype/internal/services/svmm.h index 04a63c3..bcbb38e 100644 --- a/vendor/FreeType2/include/freetype/internal/services/svmm.h +++ b/vendor/FreeType2/include/freetype/internal/services/svmm.h @@ -104,6 +104,8 @@ FT_BEGIN_HEADER }; +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \ get_mm_, \ set_mm_design_, \ @@ -129,6 +131,36 @@ FT_BEGIN_HEADER done_blend_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_MULTIMASTERSREC( class_, \ + get_mm_, \ + set_mm_design_, \ + set_mm_blend_, \ + get_mm_blend_, \ + get_mm_var_, \ + set_var_design_, \ + get_var_design_, \ + set_instance_, \ + get_var_blend_, \ + done_blend_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Service_MultiMastersRec* clazz ) \ + { \ + clazz->get_mm = get_mm_; \ + clazz->set_mm_design = set_mm_design_; \ + clazz->set_mm_blend = set_mm_blend_; \ + clazz->get_mm_blend = get_mm_blend_; \ + clazz->get_mm_var = get_mm_var_; \ + clazz->set_var_design = set_var_design_; \ + clazz->get_var_design = get_var_design_; \ + clazz->set_instance = set_instance_; \ + clazz->get_var_blend = get_var_blend_; \ + clazz->done_blend = done_blend_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /* */ diff --git a/vendor/FreeType2/include/freetype/internal/services/svpostnm.h b/vendor/FreeType2/include/freetype/internal/services/svpostnm.h index 24e0255..4a49d8b 100644 --- a/vendor/FreeType2/include/freetype/internal/services/svpostnm.h +++ b/vendor/FreeType2/include/freetype/internal/services/svpostnm.h @@ -47,12 +47,28 @@ FT_BEGIN_HEADER }; +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \ static const FT_Service_PsFontNameRec class_ = \ { \ get_ps_font_name_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_PSFONTNAMEREC( class_, get_ps_font_name_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Library library, \ + FT_Service_PsFontNameRec* clazz ) \ + { \ + FT_UNUSED( library ); \ + \ + clazz->get_ps_font_name = get_ps_font_name_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /* */ diff --git a/vendor/FreeType2/include/freetype/internal/services/svprop.h b/vendor/FreeType2/include/freetype/internal/services/svprop.h index fb762cd..adc0bcf 100644 --- a/vendor/FreeType2/include/freetype/internal/services/svprop.h +++ b/vendor/FreeType2/include/freetype/internal/services/svprop.h @@ -45,6 +45,8 @@ FT_BEGIN_HEADER }; +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_SERVICE_PROPERTIESREC( class_, \ set_property_, \ get_property_ ) \ @@ -54,6 +56,20 @@ FT_BEGIN_HEADER get_property_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_PROPERTIESREC( class_, \ + set_property_, \ + get_property_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Service_PropertiesRec* clazz ) \ + { \ + clazz->set_property = set_property_; \ + clazz->get_property = get_property_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /* */ diff --git a/vendor/FreeType2/include/freetype/internal/services/svpscmap.h b/vendor/FreeType2/include/freetype/internal/services/svpscmap.h index 9747737..5589575 100644 --- a/vendor/FreeType2/include/freetype/internal/services/svpscmap.h +++ b/vendor/FreeType2/include/freetype/internal/services/svpscmap.h @@ -118,6 +118,8 @@ FT_BEGIN_HEADER }; +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_SERVICE_PSCMAPSREC( class_, \ unicode_value_, \ unicodes_init_, \ @@ -134,6 +136,35 @@ FT_BEGIN_HEADER adobe_std_strings_, adobe_std_encoding_, adobe_expert_encoding_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_PSCMAPSREC( class_, \ + unicode_value_, \ + unicodes_init_, \ + unicodes_char_index_, \ + unicodes_char_next_, \ + macintosh_name_, \ + adobe_std_strings_, \ + adobe_std_encoding_, \ + adobe_expert_encoding_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Library library, \ + FT_Service_PsCMapsRec* clazz ) \ + { \ + FT_UNUSED( library ); \ + \ + clazz->unicode_value = unicode_value_; \ + clazz->unicodes_init = unicodes_init_; \ + clazz->unicodes_char_index = unicodes_char_index_; \ + clazz->unicodes_char_next = unicodes_char_next_; \ + clazz->macintosh_name = macintosh_name_; \ + clazz->adobe_std_strings = adobe_std_strings_; \ + clazz->adobe_std_encoding = adobe_std_encoding_; \ + clazz->adobe_expert_encoding = adobe_expert_encoding_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /* */ diff --git a/vendor/FreeType2/include/freetype/internal/services/svpsinfo.h b/vendor/FreeType2/include/freetype/internal/services/svpsinfo.h index 589f573..408f406 100644 --- a/vendor/FreeType2/include/freetype/internal/services/svpsinfo.h +++ b/vendor/FreeType2/include/freetype/internal/services/svpsinfo.h @@ -62,6 +62,8 @@ FT_BEGIN_HEADER }; +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_SERVICE_PSINFOREC( class_, \ get_font_info_, \ ps_get_font_extra_, \ @@ -74,6 +76,29 @@ FT_BEGIN_HEADER get_font_private_, get_font_value_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_PSINFOREC( class_, \ + get_font_info_, \ + ps_get_font_extra_, \ + has_glyph_names_, \ + get_font_private_, \ + get_font_value_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Library library, \ + FT_Service_PsInfoRec* clazz ) \ + { \ + FT_UNUSED( library ); \ + \ + clazz->ps_get_font_info = get_font_info_; \ + clazz->ps_get_font_extra = ps_get_font_extra_; \ + clazz->ps_has_glyph_names = has_glyph_names_; \ + clazz->ps_get_font_private = get_font_private_; \ + clazz->ps_get_font_value = get_font_value_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /* */ diff --git a/vendor/FreeType2/include/freetype/internal/services/svsfnt.h b/vendor/FreeType2/include/freetype/internal/services/svsfnt.h index 670f5e6..e8b37bc 100644 --- a/vendor/FreeType2/include/freetype/internal/services/svsfnt.h +++ b/vendor/FreeType2/include/freetype/internal/services/svsfnt.h @@ -70,12 +70,27 @@ FT_BEGIN_HEADER }; +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \ static const FT_Service_SFNT_TableRec class_ = \ { \ load_, get_, info_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_SFNT_TABLEREC( class_, load_, get_, info_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Service_SFNT_TableRec* clazz ) \ + { \ + clazz->load_table = load_; \ + clazz->get_table = get_; \ + clazz->table_info = info_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /* */ diff --git a/vendor/FreeType2/include/freetype/internal/services/svttcmap.h b/vendor/FreeType2/include/freetype/internal/services/svttcmap.h index c0032f3..cd0e6fd 100644 --- a/vendor/FreeType2/include/freetype/internal/services/svttcmap.h +++ b/vendor/FreeType2/include/freetype/internal/services/svttcmap.h @@ -73,6 +73,7 @@ FT_BEGIN_HEADER TT_CMap_Info_GetFunc get_cmap_info; }; +#ifndef FT_CONFIG_OPTION_PIC #define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ ) \ static const FT_Service_TTCMapsRec class_ = \ @@ -80,6 +81,20 @@ FT_BEGIN_HEADER get_cmap_info_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_TTCMAPSREC( class_, get_cmap_info_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Library library, \ + FT_Service_TTCMapsRec* clazz ) \ + { \ + FT_UNUSED( library ); \ + \ + clazz->get_cmap_info = get_cmap_info_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /* */ diff --git a/vendor/FreeType2/include/freetype/internal/services/svttglyf.h b/vendor/FreeType2/include/freetype/internal/services/svttglyf.h index bacf832..16fac1c 100644 --- a/vendor/FreeType2/include/freetype/internal/services/svttglyf.h +++ b/vendor/FreeType2/include/freetype/internal/services/svttglyf.h @@ -39,12 +39,25 @@ FT_BEGIN_HEADER }; +#ifndef FT_CONFIG_OPTION_PIC + #define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ ) \ static const FT_Service_TTGlyfRec class_ = \ { \ get_location_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_SERVICE_TTGLYFREC( class_, get_location_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Service_TTGlyfRec* clazz ) \ + { \ + clazz->get_location = get_location_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + /* */ diff --git a/vendor/FreeType2/include/freetype/internal/sfnt.h b/vendor/FreeType2/include/freetype/internal/sfnt.h index 73f16ba..fb1e327 100644 --- a/vendor/FreeType2/include/freetype/internal/sfnt.h +++ b/vendor/FreeType2/include/freetype/internal/sfnt.h @@ -627,6 +627,7 @@ FT_BEGIN_HEADER /* transitional */ typedef SFNT_Interface* SFNT_Service; +#ifndef FT_CONFIG_OPTION_PIC #define FT_DEFINE_SFNT_INTERFACE( \ class_, \ @@ -696,6 +697,84 @@ FT_BEGIN_HEADER get_name_id_ \ }; +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_INTERNAL( a, a_ ) \ + clazz->a = a_; + +#define FT_DEFINE_SFNT_INTERFACE( \ + class_, \ + goto_table_, \ + init_face_, \ + load_face_, \ + done_face_, \ + get_interface_, \ + load_any_, \ + load_head_, \ + load_hhea_, \ + load_cmap_, \ + load_maxp_, \ + load_os2_, \ + load_post_, \ + load_name_, \ + free_name_, \ + load_kern_, \ + load_gasp_, \ + load_pclt_, \ + load_bhed_, \ + load_sbit_image_, \ + get_psname_, \ + free_psnames_, \ + get_kerning_, \ + load_font_dir_, \ + load_hmtx_, \ + load_eblc_, \ + free_eblc_, \ + set_sbit_strike_, \ + load_strike_metrics_, \ + get_metrics_, \ + get_name_, \ + get_name_id_ ) \ + void \ + FT_Init_Class_ ## class_( FT_Library library, \ + SFNT_Interface* clazz ) \ + { \ + FT_UNUSED( library ); \ + \ + clazz->goto_table = goto_table_; \ + clazz->init_face = init_face_; \ + clazz->load_face = load_face_; \ + clazz->done_face = done_face_; \ + clazz->get_interface = get_interface_; \ + clazz->load_any = load_any_; \ + clazz->load_head = load_head_; \ + clazz->load_hhea = load_hhea_; \ + clazz->load_cmap = load_cmap_; \ + clazz->load_maxp = load_maxp_; \ + clazz->load_os2 = load_os2_; \ + clazz->load_post = load_post_; \ + clazz->load_name = load_name_; \ + clazz->free_name = free_name_; \ + clazz->load_kern = load_kern_; \ + clazz->load_gasp = load_gasp_; \ + clazz->load_pclt = load_pclt_; \ + clazz->load_bhed = load_bhed_; \ + clazz->load_sbit_image = load_sbit_image_; \ + clazz->get_psname = get_psname_; \ + clazz->free_psnames = free_psnames_; \ + clazz->get_kerning = get_kerning_; \ + clazz->load_font_dir = load_font_dir_; \ + clazz->load_hmtx = load_hmtx_; \ + clazz->load_eblc = load_eblc_; \ + clazz->free_eblc = free_eblc_; \ + clazz->set_sbit_strike = set_sbit_strike_; \ + clazz->load_strike_metrics = load_strike_metrics_; \ + clazz->get_metrics = get_metrics_; \ + clazz->get_name = get_name_; \ + clazz->get_name_id = get_name_id_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ FT_END_HEADER diff --git a/vendor/FreeType2/src/autofit/afangles.c b/vendor/FreeType2/src/autofit/afangles.c new file mode 100644 index 0000000..c65a3ae --- /dev/null +++ b/vendor/FreeType2/src/autofit/afangles.c @@ -0,0 +1,285 @@ +/***************************************************************************/ +/* */ +/* afangles.c */ +/* */ +/* Routines used to compute vector angles with limited accuracy */ +/* and very high speed. It also contains sorting routines (body). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#include "aftypes.h" + + + /* + * We are not using `af_angle_atan' anymore, but we keep the source + * code below just in case... + */ + + +#if 0 + + + /* + * The trick here is to realize that we don't need a very accurate angle + * approximation. We are going to use the result of `af_angle_atan' to + * only compare the sign of angle differences, or check whether its + * magnitude is very small. + * + * The approximation + * + * dy * PI / (|dx|+|dy|) + * + * should be enough, and much faster to compute. + */ + FT_LOCAL_DEF( AF_Angle ) + af_angle_atan( FT_Fixed dx, + FT_Fixed dy ) + { + AF_Angle angle; + FT_Fixed ax = dx; + FT_Fixed ay = dy; + + + if ( ax < 0 ) + ax = -ax; + if ( ay < 0 ) + ay = -ay; + + ax += ay; + + if ( ax == 0 ) + angle = 0; + else + { + angle = ( AF_ANGLE_PI2 * dy ) / ( ax + ay ); + if ( dx < 0 ) + { + if ( angle >= 0 ) + angle = AF_ANGLE_PI - angle; + else + angle = -AF_ANGLE_PI - angle; + } + } + + return angle; + } + + +#elif 0 + + + /* the following table has been automatically generated with */ + /* the `mather.py' Python script */ + +#define AF_ATAN_BITS 8 + + static const FT_Byte af_arctan[1L << AF_ATAN_BITS] = + { + 0, 0, 1, 1, 1, 2, 2, 2, + 3, 3, 3, 3, 4, 4, 4, 5, + 5, 5, 6, 6, 6, 7, 7, 7, + 8, 8, 8, 9, 9, 9, 10, 10, + 10, 10, 11, 11, 11, 12, 12, 12, + 13, 13, 13, 14, 14, 14, 14, 15, + 15, 15, 16, 16, 16, 17, 17, 17, + 18, 18, 18, 18, 19, 19, 19, 20, + 20, 20, 21, 21, 21, 21, 22, 22, + 22, 23, 23, 23, 24, 24, 24, 24, + 25, 25, 25, 26, 26, 26, 26, 27, + 27, 27, 28, 28, 28, 28, 29, 29, + 29, 30, 30, 30, 30, 31, 31, 31, + 31, 32, 32, 32, 33, 33, 33, 33, + 34, 34, 34, 34, 35, 35, 35, 35, + 36, 36, 36, 36, 37, 37, 37, 38, + 38, 38, 38, 39, 39, 39, 39, 40, + 40, 40, 40, 41, 41, 41, 41, 42, + 42, 42, 42, 42, 43, 43, 43, 43, + 44, 44, 44, 44, 45, 45, 45, 45, + 46, 46, 46, 46, 46, 47, 47, 47, + 47, 48, 48, 48, 48, 48, 49, 49, + 49, 49, 50, 50, 50, 50, 50, 51, + 51, 51, 51, 51, 52, 52, 52, 52, + 52, 53, 53, 53, 53, 53, 54, 54, + 54, 54, 54, 55, 55, 55, 55, 55, + 56, 56, 56, 56, 56, 57, 57, 57, + 57, 57, 57, 58, 58, 58, 58, 58, + 59, 59, 59, 59, 59, 59, 60, 60, + 60, 60, 60, 61, 61, 61, 61, 61, + 61, 62, 62, 62, 62, 62, 62, 63, + 63, 63, 63, 63, 63, 64, 64, 64 + }; + + + FT_LOCAL_DEF( AF_Angle ) + af_angle_atan( FT_Fixed dx, + FT_Fixed dy ) + { + AF_Angle angle; + + + /* check trivial cases */ + if ( dy == 0 ) + { + angle = 0; + if ( dx < 0 ) + angle = AF_ANGLE_PI; + return angle; + } + else if ( dx == 0 ) + { + angle = AF_ANGLE_PI2; + if ( dy < 0 ) + angle = -AF_ANGLE_PI2; + return angle; + } + + angle = 0; + if ( dx < 0 ) + { + dx = -dx; + dy = -dy; + angle = AF_ANGLE_PI; + } + + if ( dy < 0 ) + { + FT_Pos tmp; + + + tmp = dx; + dx = -dy; + dy = tmp; + angle -= AF_ANGLE_PI2; + } + + if ( dx == 0 && dy == 0 ) + return 0; + + if ( dx == dy ) + angle += AF_ANGLE_PI4; + else if ( dx > dy ) + angle += af_arctan[FT_DivFix( dy, dx ) >> ( 16 - AF_ATAN_BITS )]; + else + angle += AF_ANGLE_PI2 - + af_arctan[FT_DivFix( dx, dy ) >> ( 16 - AF_ATAN_BITS )]; + + if ( angle > AF_ANGLE_PI ) + angle -= AF_ANGLE_2PI; + + return angle; + } + + +#endif /* 0 */ + + + FT_LOCAL_DEF( void ) + af_sort_pos( FT_UInt count, + FT_Pos* table ) + { + FT_UInt i, j; + FT_Pos swap; + + + for ( i = 1; i < count; i++ ) + { + for ( j = i; j > 0; j-- ) + { + if ( table[j] >= table[j - 1] ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + } + + + FT_LOCAL_DEF( void ) + af_sort_and_quantize_widths( FT_UInt* count, + AF_Width table, + FT_Pos threshold ) + { + FT_UInt i, j; + FT_UInt cur_idx; + FT_Pos cur_val; + FT_Pos sum; + AF_WidthRec swap; + + + if ( *count == 1 ) + return; + + /* sort */ + for ( i = 1; i < *count; i++ ) + { + for ( j = i; j > 0; j-- ) + { + if ( table[j].org >= table[j - 1].org ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + + cur_idx = 0; + cur_val = table[cur_idx].org; + + /* compute and use mean values for clusters not larger than */ + /* `threshold'; this is very primitive and might not yield */ + /* the best result, but normally, using reference character */ + /* `o', `*count' is 2, so the code below is fully sufficient */ + for ( i = 1; i < *count; i++ ) + { + if ( table[i].org - cur_val > threshold || + i == *count - 1 ) + { + sum = 0; + + /* fix loop for end of array */ + if ( table[i].org - cur_val <= threshold && + i == *count - 1 ) + i++; + + for ( j = cur_idx; j < i; j++ ) + { + sum += table[j].org; + table[j].org = 0; + } + table[cur_idx].org = sum / (FT_Pos)j; + + if ( i < *count - 1 ) + { + cur_idx = i + 1; + cur_val = table[cur_idx].org; + } + } + } + + cur_idx = 1; + + /* compress array to remove zero values */ + for ( i = 1; i < *count; i++ ) + { + if ( table[i].org ) + table[cur_idx++] = table[i]; + } + + *count = cur_idx; + } + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afangles.h b/vendor/FreeType2/src/autofit/afangles.h new file mode 100644 index 0000000..f33f9e1 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afangles.h @@ -0,0 +1,7 @@ +/* + * afangles.h + * + * This is a dummy file, used to please the build system. It is never + * included by the auto-fitter sources. + * + */ diff --git a/vendor/FreeType2/src/autofit/afblue.c b/vendor/FreeType2/src/autofit/afblue.c new file mode 100644 index 0000000..e4078fd --- /dev/null +++ b/vendor/FreeType2/src/autofit/afblue.c @@ -0,0 +1,739 @@ +/* This file has been generated by the Perl script `afblue.pl', */ +/* using data from file `afblue.dat'. */ + +/***************************************************************************/ +/* */ +/* afblue.c */ +/* */ +/* Auto-fitter data for blue strings (body). */ +/* */ +/* Copyright 2013-2018 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. */ +/* */ +/***************************************************************************/ + + +#include "aftypes.h" + + + FT_LOCAL_ARRAY_DEF( char ) + af_blue_strings[] = + { + /* */ + '\xF0', '\x9E', '\xA4', '\x8C', ' ', '\xF0', '\x9E', '\xA4', '\x85', ' ', '\xF0', '\x9E', '\xA4', '\x88', ' ', '\xF0', '\x9E', '\xA4', '\x8F', ' ', '\xF0', '\x9E', '\xA4', '\x94', ' ', '\xF0', '\x9E', '\xA4', '\x9A', /* 𞤌 𞤅 𞤈 𞤏 𞤔 𞤚 */ + '\0', + '\xF0', '\x9E', '\xA4', '\x82', ' ', '\xF0', '\x9E', '\xA4', '\x96', /* 𞤂 𞤖 */ + '\0', + '\xF0', '\x9E', '\xA4', '\xAC', ' ', '\xF0', '\x9E', '\xA4', '\xAE', ' ', '\xF0', '\x9E', '\xA4', '\xBB', ' ', '\xF0', '\x9E', '\xA4', '\xBC', ' ', '\xF0', '\x9E', '\xA4', '\xBE', /* 𞤬 𞤮 𞤻 𞤼 𞤾 */ + '\0', + '\xF0', '\x9E', '\xA4', '\xA4', ' ', '\xF0', '\x9E', '\xA4', '\xA8', ' ', '\xF0', '\x9E', '\xA4', '\xA9', ' ', '\xF0', '\x9E', '\xA4', '\xAD', ' ', '\xF0', '\x9E', '\xA4', '\xB4', ' ', '\xF0', '\x9E', '\xA4', '\xB8', ' ', '\xF0', '\x9E', '\xA4', '\xBA', ' ', '\xF0', '\x9E', '\xA5', '\x80', /* 𞤤 𞤨 𞤩 𞤭 𞤴 𞤸 𞤺 𞥀 */ + '\0', + '\xD8', '\xA7', ' ', '\xD8', '\xA5', ' ', '\xD9', '\x84', ' ', '\xD9', '\x83', ' ', '\xD8', '\xB7', ' ', '\xD8', '\xB8', /* ا إ ل ك ط ظ */ + '\0', + '\xD8', '\xAA', ' ', '\xD8', '\xAB', ' ', '\xD8', '\xB7', ' ', '\xD8', '\xB8', ' ', '\xD9', '\x83', /* ت ث ط ظ ك */ + '\0', + '\xD9', '\x80', /* ـ */ + '\0', + '\xD4', '\xB1', ' ', '\xD5', '\x84', ' ', '\xD5', '\x92', ' ', '\xD5', '\x8D', ' ', '\xD4', '\xB2', ' ', '\xD4', '\xB3', ' ', '\xD4', '\xB4', ' ', '\xD5', '\x95', /* Ա Մ Ւ Ս Բ Գ Դ Օ */ + '\0', + '\xD5', '\x92', ' ', '\xD5', '\x88', ' ', '\xD4', '\xB4', ' ', '\xD5', '\x83', ' ', '\xD5', '\x87', ' ', '\xD5', '\x8D', ' ', '\xD5', '\x8F', ' ', '\xD5', '\x95', /* Ւ Ո Դ Ճ Շ Ս Տ Օ */ + '\0', + '\xD5', '\xA5', ' ', '\xD5', '\xA7', ' ', '\xD5', '\xAB', ' ', '\xD5', '\xB4', ' ', '\xD5', '\xBE', ' ', '\xD6', '\x86', ' ', '\xD5', '\xB3', /* ե է ի մ վ ֆ ճ */ + '\0', + '\xD5', '\xA1', ' ', '\xD5', '\xB5', ' ', '\xD6', '\x82', ' ', '\xD5', '\xBD', ' ', '\xD5', '\xA3', ' ', '\xD5', '\xB7', ' ', '\xD6', '\x80', ' ', '\xD6', '\x85', /* ա յ ւ ս գ շ ր օ */ + '\0', + '\xD5', '\xB0', ' ', '\xD5', '\xB8', ' ', '\xD5', '\xB3', ' ', '\xD5', '\xA1', ' ', '\xD5', '\xA5', ' ', '\xD5', '\xAE', ' ', '\xD5', '\xBD', ' ', '\xD6', '\x85', /* հ ո ճ ա ե ծ ս օ */ + '\0', + '\xD5', '\xA2', ' ', '\xD5', '\xA8', ' ', '\xD5', '\xAB', ' ', '\xD5', '\xAC', ' ', '\xD5', '\xB2', ' ', '\xD5', '\xBA', ' ', '\xD6', '\x83', ' ', '\xD6', '\x81', /* բ ը ի լ ղ պ փ ց */ + '\0', + '\xF0', '\x90', '\xAC', '\x80', ' ', '\xF0', '\x90', '\xAC', '\x81', ' ', '\xF0', '\x90', '\xAC', '\x90', ' ', '\xF0', '\x90', '\xAC', '\x9B', /* 𐬀 𐬁 𐬐 𐬛 */ + '\0', + '\xF0', '\x90', '\xAC', '\x80', ' ', '\xF0', '\x90', '\xAC', '\x81', /* 𐬀 𐬁 */ + '\0', + '\xEA', '\x9A', '\xA7', ' ', '\xEA', '\x9A', '\xA8', ' ', '\xEA', '\x9B', '\x9B', ' ', '\xEA', '\x9B', '\x89', ' ', '\xEA', '\x9B', '\x81', ' ', '\xEA', '\x9B', '\x88', ' ', '\xEA', '\x9B', '\xAB', ' ', '\xEA', '\x9B', '\xAF', /* ꚧ ꚨ ꛛ ꛉ ꛁ ꛈ ꛫ ꛯ */ + '\0', + '\xEA', '\x9A', '\xAD', ' ', '\xEA', '\x9A', '\xB3', ' ', '\xEA', '\x9A', '\xB6', ' ', '\xEA', '\x9B', '\xAC', ' ', '\xEA', '\x9A', '\xA2', ' ', '\xEA', '\x9A', '\xBD', ' ', '\xEA', '\x9B', '\xAF', ' ', '\xEA', '\x9B', '\xB2', /* ꚭ ꚳ ꚶ ꛬ ꚢ ꚽ ꛯ ꛲ */ + '\0', + '\xE0', '\xA6', '\x85', ' ', '\xE0', '\xA6', '\xA1', ' ', '\xE0', '\xA6', '\xA4', ' ', '\xE0', '\xA6', '\xA8', ' ', '\xE0', '\xA6', '\xAC', ' ', '\xE0', '\xA6', '\xAD', ' ', '\xE0', '\xA6', '\xB2', ' ', '\xE0', '\xA6', '\x95', /* অ ড ত ন ব ভ ল ক */ + '\0', + '\xE0', '\xA6', '\x87', ' ', '\xE0', '\xA6', '\x9F', ' ', '\xE0', '\xA6', '\xA0', ' ', '\xE0', '\xA6', '\xBF', ' ', '\xE0', '\xA7', '\x80', ' ', '\xE0', '\xA7', '\x88', ' ', '\xE0', '\xA7', '\x97', /* ই ট ঠ ি ী ৈ ৗ */ + '\0', + '\xE0', '\xA6', '\x93', ' ', '\xE0', '\xA6', '\x8F', ' ', '\xE0', '\xA6', '\xA1', ' ', '\xE0', '\xA6', '\xA4', ' ', '\xE0', '\xA6', '\xA8', ' ', '\xE0', '\xA6', '\xAC', ' ', '\xE0', '\xA6', '\xB2', ' ', '\xE0', '\xA6', '\x95', /* ও এ ড ত ন ব ল ক */ + '\0', + '\xE1', '\x9D', '\x90', ' ', '\xE1', '\x9D', '\x88', /* ᝐ ᝈ */ + '\0', + '\xE1', '\x9D', '\x85', ' ', '\xE1', '\x9D', '\x8A', ' ', '\xE1', '\x9D', '\x8E', /* ᝅ ᝊ ᝎ */ + '\0', + '\xE1', '\x9D', '\x82', ' ', '\xE1', '\x9D', '\x83', ' ', '\xE1', '\x9D', '\x89', ' ', '\xE1', '\x9D', '\x8C', /* ᝂ ᝃ ᝉ ᝌ */ + '\0', + '\xE1', '\x9D', '\x80', ' ', '\xE1', '\x9D', '\x83', ' ', '\xE1', '\x9D', '\x86', ' ', '\xE1', '\x9D', '\x89', ' ', '\xE1', '\x9D', '\x8B', ' ', '\xE1', '\x9D', '\x8F', ' ', '\xE1', '\x9D', '\x91', /* ᝀ ᝃ ᝆ ᝉ ᝋ ᝏ ᝑ */ + '\0', + '\xE1', '\x97', '\x9C', ' ', '\xE1', '\x96', '\xB4', ' ', '\xE1', '\x90', '\x81', ' ', '\xE1', '\x92', '\xA3', ' ', '\xE1', '\x91', '\xAB', ' ', '\xE1', '\x91', '\x8E', ' ', '\xE1', '\x94', '\x91', ' ', '\xE1', '\x97', '\xB0', /* ᗜ ᖴ ᐁ ᒣ ᑫ ᑎ ᔑ ᗰ */ + '\0', + '\xE1', '\x97', '\xB6', ' ', '\xE1', '\x96', '\xB5', ' ', '\xE1', '\x92', '\xA7', ' ', '\xE1', '\x90', '\x83', ' ', '\xE1', '\x91', '\x8C', ' ', '\xE1', '\x92', '\x8D', ' ', '\xE1', '\x94', '\x91', ' ', '\xE1', '\x97', '\xA2', /* ᗶ ᖵ ᒧ ᐃ ᑌ ᒍ ᔑ ᗢ */ + '\0', + '\xE1', '\x93', '\x93', ' ', '\xE1', '\x93', '\x95', ' ', '\xE1', '\x93', '\x80', ' ', '\xE1', '\x93', '\x82', ' ', '\xE1', '\x93', '\x84', ' ', '\xE1', '\x95', '\x84', ' ', '\xE1', '\x95', '\x86', ' ', '\xE1', '\x98', '\xA3', /* ᓓ ᓕ ᓀ ᓂ ᓄ ᕄ ᕆ ᘣ */ + '\0', + '\xE1', '\x95', '\x83', ' ', '\xE1', '\x93', '\x82', ' ', '\xE1', '\x93', '\x80', ' ', '\xE1', '\x95', '\x82', ' ', '\xE1', '\x93', '\x97', ' ', '\xE1', '\x93', '\x9A', ' ', '\xE1', '\x95', '\x86', ' ', '\xE1', '\x98', '\xA3', /* ᕃ ᓂ ᓀ ᕂ ᓗ ᓚ ᕆ ᘣ */ + '\0', + '\xE1', '\x90', '\xAA', ' ', '\xE1', '\x99', '\x86', ' ', '\xE1', '\xA3', '\x98', ' ', '\xE1', '\x90', '\xA2', ' ', '\xE1', '\x92', '\xBE', ' ', '\xE1', '\xA3', '\x97', ' ', '\xE1', '\x94', '\x86', /* ᐪ ᙆ ᣘ ᐢ ᒾ ᣗ ᔆ */ + '\0', + '\xE1', '\x99', '\x86', ' ', '\xE1', '\x97', '\xAE', ' ', '\xE1', '\x92', '\xBB', ' ', '\xE1', '\x90', '\x9E', ' ', '\xE1', '\x94', '\x86', ' ', '\xE1', '\x92', '\xA1', ' ', '\xE1', '\x92', '\xA2', ' ', '\xE1', '\x93', '\x91', /* ᙆ ᗮ ᒻ ᐞ ᔆ ᒡ ᒢ ᓑ */ + '\0', + '\xF0', '\x90', '\x8A', '\xA7', ' ', '\xF0', '\x90', '\x8A', '\xAB', ' ', '\xF0', '\x90', '\x8A', '\xAC', ' ', '\xF0', '\x90', '\x8A', '\xAD', ' ', '\xF0', '\x90', '\x8A', '\xB1', ' ', '\xF0', '\x90', '\x8A', '\xBA', ' ', '\xF0', '\x90', '\x8A', '\xBC', ' ', '\xF0', '\x90', '\x8A', '\xBF', /* 𐊧 𐊫 𐊬 𐊭 𐊱 𐊺 𐊼 𐊿 */ + '\0', + '\xF0', '\x90', '\x8A', '\xA3', ' ', '\xF0', '\x90', '\x8A', '\xA7', ' ', '\xF0', '\x90', '\x8A', '\xB7', ' ', '\xF0', '\x90', '\x8B', '\x80', ' ', '\xF0', '\x90', '\x8A', '\xAB', ' ', '\xF0', '\x90', '\x8A', '\xB8', ' ', '\xF0', '\x90', '\x8B', '\x89', /* 𐊣 𐊧 𐊷 𐋀 𐊫 𐊸 𐋉 */ + '\0', + '\xF0', '\x91', '\x84', '\x83', ' ', '\xF0', '\x91', '\x84', '\x85', ' ', '\xF0', '\x91', '\x84', '\x89', ' ', '\xF0', '\x91', '\x84', '\x99', ' ', '\xF0', '\x91', '\x84', '\x97', /* 𑄃 𑄅 𑄉 𑄙 𑄗 */ + '\0', + '\xF0', '\x91', '\x84', '\x85', ' ', '\xF0', '\x91', '\x84', '\x9B', ' ', '\xF0', '\x91', '\x84', '\x9D', ' ', '\xF0', '\x91', '\x84', '\x97', ' ', '\xF0', '\x91', '\x84', '\x93', /* 𑄅 𑄛 𑄝 𑄗 𑄓 */ + '\0', + '\xF0', '\x91', '\x84', '\x96', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\x98', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\x99', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\xA4', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', ' ', '\xF0', '\x91', '\x84', '\xA5', '\xF0', '\x91', '\x84', '\xB3', '\xF0', '\x91', '\x84', '\xA2', /* 𑄖𑄳𑄢 𑄘𑄳𑄢 𑄙𑄳𑄢 𑄤𑄳𑄢 𑄥𑄳𑄢 */ + '\0', + '\xE1', '\x8F', '\x86', ' ', '\xE1', '\x8E', '\xBB', ' ', '\xE1', '\x8E', '\xAC', ' ', '\xE1', '\x8F', '\x83', ' ', '\xE1', '\x8E', '\xA4', ' ', '\xE1', '\x8F', '\xA3', ' ', '\xE1', '\x8E', '\xA6', ' ', '\xE1', '\x8F', '\x95', /* Ꮖ Ꮋ Ꭼ Ꮓ Ꭴ Ꮳ Ꭶ Ꮥ */ + '\0', + '\xEA', '\xAE', '\x92', ' ', '\xEA', '\xAE', '\xA4', ' ', '\xEA', '\xAE', '\xB6', ' ', '\xEA', '\xAD', '\xB4', ' ', '\xEA', '\xAD', '\xBE', ' ', '\xEA', '\xAE', '\x97', ' ', '\xEA', '\xAE', '\x9D', ' ', '\xEA', '\xAE', '\xBF', /* ꮒ ꮤ ꮶ ꭴ ꭾ ꮗ ꮝ ꮿ */ + '\0', + '\xEA', '\xAE', '\x96', ' ', '\xEA', '\xAD', '\xBC', ' ', '\xEA', '\xAE', '\x93', ' ', '\xEA', '\xAE', '\xA0', ' ', '\xEA', '\xAE', '\xB3', ' ', '\xEA', '\xAD', '\xB6', ' ', '\xEA', '\xAE', '\xA5', ' ', '\xEA', '\xAE', '\xBB', /* ꮖ ꭼ ꮓ ꮠ ꮳ ꭶ ꮥ ꮻ */ + '\0', + '\xE1', '\x8F', '\xB8', ' ', '\xEA', '\xAE', '\x90', ' ', '\xEA', '\xAD', '\xB9', ' ', '\xEA', '\xAD', '\xBB', /* ᏸ ꮐ ꭹ ꭻ */ + '\0', + '\xE2', '\xB2', '\x8C', ' ', '\xE2', '\xB2', '\x8E', ' ', '\xE2', '\xB2', '\xA0', ' ', '\xE2', '\xB3', '\x9E', ' ', '\xE2', '\xB2', '\x9E', ' ', '\xE2', '\xB2', '\x90', ' ', '\xE2', '\xB2', '\xA4', ' ', '\xE2', '\xB3', '\x8A', /* Ⲍ Ⲏ Ⲡ Ⳟ Ⲟ Ⲑ Ⲥ Ⳋ */ + '\0', + '\xE2', '\xB3', '\x90', ' ', '\xE2', '\xB3', '\x98', ' ', '\xE2', '\xB3', '\x9E', ' ', '\xE2', '\xB2', '\x8E', ' ', '\xE2', '\xB2', '\x9E', ' ', '\xE2', '\xB2', '\x90', ' ', '\xE2', '\xB3', '\x9C', ' ', '\xE2', '\xB2', '\xB0', /* Ⳑ Ⳙ Ⳟ Ⲏ Ⲟ Ⲑ Ⳝ Ⲱ */ + '\0', + '\xE2', '\xB2', '\x8D', ' ', '\xE2', '\xB2', '\x8F', ' ', '\xE2', '\xB2', '\xA1', ' ', '\xE2', '\xB3', '\x9F', ' ', '\xE2', '\xB2', '\x9F', ' ', '\xE2', '\xB2', '\x91', ' ', '\xE2', '\xB2', '\xA5', ' ', '\xE2', '\xB3', '\x8B', /* ⲍ ⲏ ⲡ ⳟ ⲟ ⲑ ⲥ ⳋ */ + '\0', + '\xE2', '\xB3', '\x91', ' ', '\xE2', '\xB3', '\x99', ' ', '\xE2', '\xB3', '\x9F', ' ', '\xE2', '\xB2', '\x8F', ' ', '\xE2', '\xB2', '\x9F', ' ', '\xE2', '\xB2', '\x91', ' ', '\xE2', '\xB3', '\x9D', ' ', '\xE2', '\xB3', '\x92', /* ⳑ ⳙ ⳟ ⲏ ⲟ ⲑ ⳝ Ⳓ */ + '\0', + '\xF0', '\x90', '\xA0', '\x8D', ' ', '\xF0', '\x90', '\xA0', '\x99', ' ', '\xF0', '\x90', '\xA0', '\xB3', ' ', '\xF0', '\x90', '\xA0', '\xB1', ' ', '\xF0', '\x90', '\xA0', '\x85', ' ', '\xF0', '\x90', '\xA0', '\x93', ' ', '\xF0', '\x90', '\xA0', '\xA3', ' ', '\xF0', '\x90', '\xA0', '\xA6', /* 𐠍 𐠙 𐠳 𐠱 𐠅 𐠓 𐠣 𐠦 */ + '\0', + '\xF0', '\x90', '\xA0', '\x83', ' ', '\xF0', '\x90', '\xA0', '\x8A', ' ', '\xF0', '\x90', '\xA0', '\x9B', ' ', '\xF0', '\x90', '\xA0', '\xA3', ' ', '\xF0', '\x90', '\xA0', '\xB3', ' ', '\xF0', '\x90', '\xA0', '\xB5', ' ', '\xF0', '\x90', '\xA0', '\x90', /* 𐠃 𐠊 𐠛 𐠣 𐠳 𐠵 𐠐 */ + '\0', + '\xF0', '\x90', '\xA0', '\x88', ' ', '\xF0', '\x90', '\xA0', '\x8F', ' ', '\xF0', '\x90', '\xA0', '\x96', /* 𐠈 𐠏 𐠖 */ + '\0', + '\xD0', '\x91', ' ', '\xD0', '\x92', ' ', '\xD0', '\x95', ' ', '\xD0', '\x9F', ' ', '\xD0', '\x97', ' ', '\xD0', '\x9E', ' ', '\xD0', '\xA1', ' ', '\xD0', '\xAD', /* Б В Е П З О С Э */ + '\0', + '\xD0', '\x91', ' ', '\xD0', '\x92', ' ', '\xD0', '\x95', ' ', '\xD0', '\xA8', ' ', '\xD0', '\x97', ' ', '\xD0', '\x9E', ' ', '\xD0', '\xA1', ' ', '\xD0', '\xAD', /* Б В Е Ш З О С Э */ + '\0', + '\xD1', '\x85', ' ', '\xD0', '\xBF', ' ', '\xD0', '\xBD', ' ', '\xD1', '\x88', ' ', '\xD0', '\xB5', ' ', '\xD0', '\xB7', ' ', '\xD0', '\xBE', ' ', '\xD1', '\x81', /* х п н ш е з о с */ + '\0', + '\xD1', '\x80', ' ', '\xD1', '\x83', ' ', '\xD1', '\x84', /* р у ф */ + '\0', + '\xF0', '\x90', '\x90', '\x82', ' ', '\xF0', '\x90', '\x90', '\x84', ' ', '\xF0', '\x90', '\x90', '\x8B', ' ', '\xF0', '\x90', '\x90', '\x97', ' ', '\xF0', '\x90', '\x90', '\x91', /* 𐐂 𐐄 𐐋 𐐗 𐐑 */ + '\0', + '\xF0', '\x90', '\x90', '\x80', ' ', '\xF0', '\x90', '\x90', '\x82', ' ', '\xF0', '\x90', '\x90', '\x84', ' ', '\xF0', '\x90', '\x90', '\x97', ' ', '\xF0', '\x90', '\x90', '\x9B', /* 𐐀 𐐂 𐐄 𐐗 𐐛 */ + '\0', + '\xF0', '\x90', '\x90', '\xAA', ' ', '\xF0', '\x90', '\x90', '\xAC', ' ', '\xF0', '\x90', '\x90', '\xB3', ' ', '\xF0', '\x90', '\x90', '\xBF', ' ', '\xF0', '\x90', '\x90', '\xB9', /* 𐐪 𐐬 𐐳 𐐿 𐐹 */ + '\0', + '\xF0', '\x90', '\x90', '\xA8', ' ', '\xF0', '\x90', '\x90', '\xAA', ' ', '\xF0', '\x90', '\x90', '\xAC', ' ', '\xF0', '\x90', '\x90', '\xBF', ' ', '\xF0', '\x90', '\x91', '\x83', /* 𐐨 𐐪 𐐬 𐐿 𐑃 */ + '\0', + '\xE0', '\xA4', '\x95', ' ', '\xE0', '\xA4', '\xAE', ' ', '\xE0', '\xA4', '\x85', ' ', '\xE0', '\xA4', '\x86', ' ', '\xE0', '\xA4', '\xA5', ' ', '\xE0', '\xA4', '\xA7', ' ', '\xE0', '\xA4', '\xAD', ' ', '\xE0', '\xA4', '\xB6', /* क म अ आ थ ध भ श */ + '\0', + '\xE0', '\xA4', '\x88', ' ', '\xE0', '\xA4', '\x90', ' ', '\xE0', '\xA4', '\x93', ' ', '\xE0', '\xA4', '\x94', ' ', '\xE0', '\xA4', '\xBF', ' ', '\xE0', '\xA5', '\x80', ' ', '\xE0', '\xA5', '\x8B', ' ', '\xE0', '\xA5', '\x8C', /* ई ऐ ओ औ ि ी ो ौ */ + '\0', + '\xE0', '\xA4', '\x95', ' ', '\xE0', '\xA4', '\xAE', ' ', '\xE0', '\xA4', '\x85', ' ', '\xE0', '\xA4', '\x86', ' ', '\xE0', '\xA4', '\xA5', ' ', '\xE0', '\xA4', '\xA7', ' ', '\xE0', '\xA4', '\xAD', ' ', '\xE0', '\xA4', '\xB6', /* क म अ आ थ ध भ श */ + '\0', + '\xE0', '\xA5', '\x81', ' ', '\xE0', '\xA5', '\x83', /* ु ृ */ + '\0', + '\xE1', '\x88', '\x80', ' ', '\xE1', '\x88', '\x83', ' ', '\xE1', '\x8B', '\x98', ' ', '\xE1', '\x8D', '\x90', ' ', '\xE1', '\x88', '\x9B', ' ', '\xE1', '\x89', '\xA0', ' ', '\xE1', '\x8B', '\x8B', ' ', '\xE1', '\x8B', '\x90', /* ሀ ሃ ዘ ፐ ማ በ ዋ ዐ */ + '\0', + '\xE1', '\x88', '\x88', ' ', '\xE1', '\x88', '\x90', ' ', '\xE1', '\x89', '\xA0', ' ', '\xE1', '\x8B', '\x98', ' ', '\xE1', '\x88', '\x80', ' ', '\xE1', '\x88', '\xAA', ' ', '\xE1', '\x8B', '\x90', ' ', '\xE1', '\x8C', '\xA8', /* ለ ሐ በ ዘ ሀ ሪ ዐ ጨ */ + '\0', + '\xE1', '\x83', '\x92', ' ', '\xE1', '\x83', '\x93', ' ', '\xE1', '\x83', '\x94', ' ', '\xE1', '\x83', '\x95', ' ', '\xE1', '\x83', '\x97', ' ', '\xE1', '\x83', '\x98', ' ', '\xE1', '\x83', '\x9D', ' ', '\xE1', '\x83', '\xA6', /* გ დ ე ვ თ ი ო ღ */ + '\0', + '\xE1', '\x83', '\x90', ' ', '\xE1', '\x83', '\x96', ' ', '\xE1', '\x83', '\x9B', ' ', '\xE1', '\x83', '\xA1', ' ', '\xE1', '\x83', '\xA8', ' ', '\xE1', '\x83', '\xAB', ' ', '\xE1', '\x83', '\xAE', ' ', '\xE1', '\x83', '\x9E', /* ა ზ მ ს შ ძ ხ პ */ + '\0', + '\xE1', '\x83', '\xA1', ' ', '\xE1', '\x83', '\xAE', ' ', '\xE1', '\x83', '\xA5', ' ', '\xE1', '\x83', '\x96', ' ', '\xE1', '\x83', '\x9B', ' ', '\xE1', '\x83', '\xA8', ' ', '\xE1', '\x83', '\xA9', ' ', '\xE1', '\x83', '\xAC', /* ს ხ ქ ზ მ შ ჩ წ */ + '\0', + '\xE1', '\x83', '\x94', ' ', '\xE1', '\x83', '\x95', ' ', '\xE1', '\x83', '\x9F', ' ', '\xE1', '\x83', '\xA2', ' ', '\xE1', '\x83', '\xA3', ' ', '\xE1', '\x83', '\xA4', ' ', '\xE1', '\x83', '\xA5', ' ', '\xE1', '\x83', '\xA7', /* ე ვ ჟ ტ უ ფ ქ ყ */ + '\0', + '\xE1', '\x82', '\xB1', ' ', '\xE1', '\x82', '\xA7', ' ', '\xE1', '\x82', '\xB9', ' ', '\xE1', '\x82', '\xBC', ' ', '\xE1', '\x82', '\xA4', ' ', '\xE1', '\x82', '\xA5', ' ', '\xE1', '\x82', '\xB3', ' ', '\xE1', '\x82', '\xBA', /* Ⴑ Ⴇ Ⴙ Ⴜ Ⴄ Ⴅ Ⴓ Ⴚ */ + '\0', + '\xE1', '\x82', '\xA4', ' ', '\xE1', '\x82', '\xA5', ' ', '\xE1', '\x82', '\xA7', ' ', '\xE1', '\x82', '\xA8', ' ', '\xE1', '\x82', '\xA6', ' ', '\xE1', '\x82', '\xB1', ' ', '\xE1', '\x82', '\xAA', ' ', '\xE1', '\x82', '\xAB', /* Ⴄ Ⴅ Ⴇ Ⴈ Ⴆ Ⴑ Ⴊ Ⴋ */ + '\0', + '\xE2', '\xB4', '\x81', ' ', '\xE2', '\xB4', '\x97', ' ', '\xE2', '\xB4', '\x82', ' ', '\xE2', '\xB4', '\x84', ' ', '\xE2', '\xB4', '\x85', ' ', '\xE2', '\xB4', '\x87', ' ', '\xE2', '\xB4', '\x94', ' ', '\xE2', '\xB4', '\x96', /* ⴁ ⴗ ⴂ ⴄ ⴅ ⴇ ⴔ ⴖ */ + '\0', + '\xE2', '\xB4', '\x88', ' ', '\xE2', '\xB4', '\x8C', ' ', '\xE2', '\xB4', '\x96', ' ', '\xE2', '\xB4', '\x8E', ' ', '\xE2', '\xB4', '\x83', ' ', '\xE2', '\xB4', '\x86', ' ', '\xE2', '\xB4', '\x8B', ' ', '\xE2', '\xB4', '\xA2', /* ⴈ ⴌ ⴖ ⴎ ⴃ ⴆ ⴋ ⴢ */ + '\0', + '\xE2', '\xB4', '\x90', ' ', '\xE2', '\xB4', '\x91', ' ', '\xE2', '\xB4', '\x93', ' ', '\xE2', '\xB4', '\x95', ' ', '\xE2', '\xB4', '\x99', ' ', '\xE2', '\xB4', '\x9B', ' ', '\xE2', '\xB4', '\xA1', ' ', '\xE2', '\xB4', '\xA3', /* ⴐ ⴑ ⴓ ⴕ ⴙ ⴛ ⴡ ⴣ */ + '\0', + '\xE2', '\xB4', '\x84', ' ', '\xE2', '\xB4', '\x85', ' ', '\xE2', '\xB4', '\x94', ' ', '\xE2', '\xB4', '\x95', ' ', '\xE2', '\xB4', '\x81', ' ', '\xE2', '\xB4', '\x82', ' ', '\xE2', '\xB4', '\x98', ' ', '\xE2', '\xB4', '\x9D', /* ⴄ ⴅ ⴔ ⴕ ⴁ ⴂ ⴘ ⴝ */ + '\0', + '\xE1', '\xB2', '\x9C', ' ', '\xE1', '\xB2', '\x9F', ' ', '\xE1', '\xB2', '\xB3', ' ', '\xE1', '\xB2', '\xB8', ' ', '\xE1', '\xB2', '\x92', ' ', '\xE1', '\xB2', '\x94', ' ', '\xE1', '\xB2', '\x9D', ' ', '\xE1', '\xB2', '\xB4', /* Ნ Ჟ Ჳ Ჸ Გ Ე Ო Ჴ */ + '\0', + '\xE1', '\xB2', '\x98', ' ', '\xE1', '\xB2', '\xB2', ' ', '\xE1', '\xB2', '\x9D', ' ', '\xE1', '\xB2', '\xA9', ' ', '\xE1', '\xB2', '\x9B', ' ', '\xE1', '\xB2', '\xA8', ' ', '\xE1', '\xB2', '\xAF', ' ', '\xE1', '\xB2', '\xBD', /* Ი Ჲ Ო Ჩ Მ Შ Ჯ Ჽ */ + '\0', + '\xE2', '\xB0', '\x85', ' ', '\xE2', '\xB0', '\x94', ' ', '\xE2', '\xB0', '\xAA', ' ', '\xE2', '\xB0', '\x84', ' ', '\xE2', '\xB0', '\x82', ' ', '\xE2', '\xB0', '\x8A', ' ', '\xE2', '\xB0', '\xAB', ' ', '\xE2', '\xB0', '\x8B', /* Ⰵ Ⱄ Ⱚ Ⰴ Ⰲ Ⰺ Ⱛ Ⰻ */ + '\0', + '\xE2', '\xB0', '\x85', ' ', '\xE2', '\xB0', '\x84', ' ', '\xE2', '\xB0', '\x82', ' ', '\xE2', '\xB0', '\xAA', ' ', '\xE2', '\xB0', '\x9E', ' ', '\xE2', '\xB0', '\xA1', ' ', '\xE2', '\xB0', '\x8A', ' ', '\xE2', '\xB0', '\x94', /* Ⰵ Ⰴ Ⰲ Ⱚ Ⱎ Ⱑ Ⰺ Ⱄ */ + '\0', + '\xE2', '\xB0', '\xB5', ' ', '\xE2', '\xB1', '\x84', ' ', '\xE2', '\xB1', '\x9A', ' ', '\xE2', '\xB0', '\xB4', ' ', '\xE2', '\xB0', '\xB2', ' ', '\xE2', '\xB0', '\xBA', ' ', '\xE2', '\xB1', '\x9B', ' ', '\xE2', '\xB0', '\xBB', /* ⰵ ⱄ ⱚ ⰴ ⰲ ⰺ ⱛ ⰻ */ + '\0', + '\xE2', '\xB0', '\xB5', ' ', '\xE2', '\xB0', '\xB4', ' ', '\xE2', '\xB0', '\xB2', ' ', '\xE2', '\xB1', '\x9A', ' ', '\xE2', '\xB1', '\x8E', ' ', '\xE2', '\xB1', '\x91', ' ', '\xE2', '\xB0', '\xBA', ' ', '\xE2', '\xB1', '\x84', /* ⰵ ⰴ ⰲ ⱚ ⱎ ⱑ ⰺ ⱄ */ + '\0', + '\xF0', '\x90', '\x8C', '\xB2', ' ', '\xF0', '\x90', '\x8C', '\xB6', ' ', '\xF0', '\x90', '\x8D', '\x80', ' ', '\xF0', '\x90', '\x8D', '\x84', ' ', '\xF0', '\x90', '\x8C', '\xB4', ' ', '\xF0', '\x90', '\x8D', '\x83', ' ', '\xF0', '\x90', '\x8D', '\x88', ' ', '\xF0', '\x90', '\x8C', '\xBE', /* 𐌲 𐌶 𐍀 𐍄 𐌴 𐍃 𐍈 𐌾 */ + '\0', + '\xF0', '\x90', '\x8C', '\xB6', ' ', '\xF0', '\x90', '\x8C', '\xB4', ' ', '\xF0', '\x90', '\x8D', '\x83', ' ', '\xF0', '\x90', '\x8D', '\x88', /* 𐌶 𐌴 𐍃 𐍈 */ + '\0', + '\xCE', '\x93', ' ', '\xCE', '\x92', ' ', '\xCE', '\x95', ' ', '\xCE', '\x96', ' ', '\xCE', '\x98', ' ', '\xCE', '\x9F', ' ', '\xCE', '\xA9', /* Γ Β Ε Ζ Θ Ο Ω */ + '\0', + '\xCE', '\x92', ' ', '\xCE', '\x94', ' ', '\xCE', '\x96', ' ', '\xCE', '\x9E', ' ', '\xCE', '\x98', ' ', '\xCE', '\x9F', /* Β Δ Ζ Ξ Θ Ο */ + '\0', + '\xCE', '\xB2', ' ', '\xCE', '\xB8', ' ', '\xCE', '\xB4', ' ', '\xCE', '\xB6', ' ', '\xCE', '\xBB', ' ', '\xCE', '\xBE', /* β θ δ ζ λ ξ */ + '\0', + '\xCE', '\xB1', ' ', '\xCE', '\xB5', ' ', '\xCE', '\xB9', ' ', '\xCE', '\xBF', ' ', '\xCF', '\x80', ' ', '\xCF', '\x83', ' ', '\xCF', '\x84', ' ', '\xCF', '\x89', /* α ε ι ο π σ τ ω */ + '\0', + '\xCE', '\xB2', ' ', '\xCE', '\xB3', ' ', '\xCE', '\xB7', ' ', '\xCE', '\xBC', ' ', '\xCF', '\x81', ' ', '\xCF', '\x86', ' ', '\xCF', '\x87', ' ', '\xCF', '\x88', /* β γ η μ ρ φ χ ψ */ + '\0', + '\xE0', '\xAA', '\xA4', ' ', '\xE0', '\xAA', '\xA8', ' ', '\xE0', '\xAA', '\x8B', ' ', '\xE0', '\xAA', '\x8C', ' ', '\xE0', '\xAA', '\x9B', ' ', '\xE0', '\xAA', '\x9F', ' ', '\xE0', '\xAA', '\xB0', ' ', '\xE0', '\xAB', '\xA6', /* ત ન ઋ ઌ છ ટ ર ૦ */ + '\0', + '\xE0', '\xAA', '\x96', ' ', '\xE0', '\xAA', '\x97', ' ', '\xE0', '\xAA', '\x98', ' ', '\xE0', '\xAA', '\x9E', ' ', '\xE0', '\xAA', '\x87', ' ', '\xE0', '\xAA', '\x88', ' ', '\xE0', '\xAA', '\xA0', ' ', '\xE0', '\xAA', '\x9C', /* ખ ગ ઘ ઞ ઇ ઈ ઠ જ */ + '\0', + '\xE0', '\xAA', '\x88', ' ', '\xE0', '\xAA', '\x8A', ' ', '\xE0', '\xAA', '\xBF', ' ', '\xE0', '\xAB', '\x80', ' ', '\xE0', '\xAA', '\xB2', '\xE0', '\xAB', '\x80', ' ', '\xE0', '\xAA', '\xB6', '\xE0', '\xAB', '\x8D', '\xE0', '\xAA', '\x9A', '\xE0', '\xAA', '\xBF', ' ', '\xE0', '\xAA', '\x9C', '\xE0', '\xAA', '\xBF', ' ', '\xE0', '\xAA', '\xB8', '\xE0', '\xAB', '\x80', /* ઈ ઊ િ ી લી શ્ચિ જિ સી */ + '\0', + '\xE0', '\xAB', '\x81', ' ', '\xE0', '\xAB', '\x83', ' ', '\xE0', '\xAB', '\x84', ' ', '\xE0', '\xAA', '\x96', '\xE0', '\xAB', '\x81', ' ', '\xE0', '\xAA', '\x9B', '\xE0', '\xAB', '\x83', ' ', '\xE0', '\xAA', '\x9B', '\xE0', '\xAB', '\x84', /* ુ ૃ ૄ ખુ છૃ છૄ */ + '\0', + '\xE0', '\xAB', '\xA6', ' ', '\xE0', '\xAB', '\xA7', ' ', '\xE0', '\xAB', '\xA8', ' ', '\xE0', '\xAB', '\xA9', ' ', '\xE0', '\xAB', '\xAD', /* ૦ ૧ ૨ ૩ ૭ */ + '\0', + '\xE0', '\xA8', '\x95', ' ', '\xE0', '\xA8', '\x97', ' ', '\xE0', '\xA8', '\x99', ' ', '\xE0', '\xA8', '\x9A', ' ', '\xE0', '\xA8', '\x9C', ' ', '\xE0', '\xA8', '\xA4', ' ', '\xE0', '\xA8', '\xA7', ' ', '\xE0', '\xA8', '\xB8', /* ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ */ + '\0', + '\xE0', '\xA8', '\x95', ' ', '\xE0', '\xA8', '\x97', ' ', '\xE0', '\xA8', '\x99', ' ', '\xE0', '\xA8', '\x9A', ' ', '\xE0', '\xA8', '\x9C', ' ', '\xE0', '\xA8', '\xA4', ' ', '\xE0', '\xA8', '\xA7', ' ', '\xE0', '\xA8', '\xB8', /* ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ */ + '\0', + '\xE0', '\xA8', '\x87', ' ', '\xE0', '\xA8', '\x88', ' ', '\xE0', '\xA8', '\x89', ' ', '\xE0', '\xA8', '\x8F', ' ', '\xE0', '\xA8', '\x93', ' ', '\xE0', '\xA9', '\xB3', ' ', '\xE0', '\xA8', '\xBF', ' ', '\xE0', '\xA9', '\x80', /* ਇ ਈ ਉ ਏ ਓ ੳ ਿ ੀ */ + '\0', + '\xE0', '\xA8', '\x85', ' ', '\xE0', '\xA8', '\x8F', ' ', '\xE0', '\xA8', '\x93', ' ', '\xE0', '\xA8', '\x97', ' ', '\xE0', '\xA8', '\x9C', ' ', '\xE0', '\xA8', '\xA0', ' ', '\xE0', '\xA8', '\xB0', ' ', '\xE0', '\xA8', '\xB8', /* ਅ ਏ ਓ ਗ ਜ ਠ ਰ ਸ */ + '\0', + '\xE0', '\xA9', '\xA6', ' ', '\xE0', '\xA9', '\xA7', ' ', '\xE0', '\xA9', '\xA8', ' ', '\xE0', '\xA9', '\xA9', ' ', '\xE0', '\xA9', '\xAD', /* ੦ ੧ ੨ ੩ ੭ */ + '\0', + '\xD7', '\x91', ' ', '\xD7', '\x93', ' ', '\xD7', '\x94', ' ', '\xD7', '\x97', ' ', '\xD7', '\x9A', ' ', '\xD7', '\x9B', ' ', '\xD7', '\x9D', ' ', '\xD7', '\xA1', /* ב ד ה ח ך כ ם ס */ + '\0', + '\xD7', '\x91', ' ', '\xD7', '\x98', ' ', '\xD7', '\x9B', ' ', '\xD7', '\x9D', ' ', '\xD7', '\xA1', ' ', '\xD7', '\xA6', /* ב ט כ ם ס צ */ + '\0', + '\xD7', '\xA7', ' ', '\xD7', '\x9A', ' ', '\xD7', '\x9F', ' ', '\xD7', '\xA3', ' ', '\xD7', '\xA5', /* ק ך ן ף ץ */ + '\0', + '\xE0', '\xB2', '\x87', ' ', '\xE0', '\xB2', '\x8A', ' ', '\xE0', '\xB2', '\x90', ' ', '\xE0', '\xB2', '\xA3', ' ', '\xE0', '\xB2', '\xB8', '\xE0', '\xB2', '\xBE', ' ', '\xE0', '\xB2', '\xA8', '\xE0', '\xB2', '\xBE', ' ', '\xE0', '\xB2', '\xA6', '\xE0', '\xB2', '\xBE', ' ', '\xE0', '\xB2', '\xB0', '\xE0', '\xB2', '\xBE', /* ಇ ಊ ಐ ಣ ಸಾ ನಾ ದಾ ರಾ */ + '\0', + '\xE0', '\xB2', '\x85', ' ', '\xE0', '\xB2', '\x89', ' ', '\xE0', '\xB2', '\x8E', ' ', '\xE0', '\xB2', '\xB2', ' ', '\xE0', '\xB3', '\xA6', ' ', '\xE0', '\xB3', '\xA8', ' ', '\xE0', '\xB3', '\xAC', ' ', '\xE0', '\xB3', '\xAD', /* ಅ ಉ ಎ ಲ ೦ ೨ ೬ ೭ */ + '\0', + '\xEA', '\xA4', '\x85', ' ', '\xEA', '\xA4', '\x8F', ' ', '\xEA', '\xA4', '\x81', ' ', '\xEA', '\xA4', '\x8B', ' ', '\xEA', '\xA4', '\x80', ' ', '\xEA', '\xA4', '\x8D', /* ꤅ ꤏ ꤁ ꤋ ꤀ ꤍ */ + '\0', + '\xEA', '\xA4', '\x88', ' ', '\xEA', '\xA4', '\x98', ' ', '\xEA', '\xA4', '\x80', ' ', '\xEA', '\xA4', '\x8D', ' ', '\xEA', '\xA4', '\xA2', /* ꤈ ꤘ ꤀ ꤍ ꤢ */ + '\0', + '\xEA', '\xA4', '\x96', ' ', '\xEA', '\xA4', '\xA1', /* ꤖ ꤡ */ + '\0', + '\xEA', '\xA4', '\x91', ' ', '\xEA', '\xA4', '\x9C', ' ', '\xEA', '\xA4', '\x9E', /* ꤑ ꤜ ꤞ */ + '\0', + '\xEA', '\xA4', '\x91', '\xEA', '\xA4', '\xAC', ' ', '\xEA', '\xA4', '\x9C', '\xEA', '\xA4', '\xAD', ' ', '\xEA', '\xA4', '\x94', '\xEA', '\xA4', '\xAC', /* ꤑ꤬ ꤜ꤭ ꤔ꤬ */ + '\0', + '\xE1', '\x9E', '\x81', ' ', '\xE1', '\x9E', '\x91', ' ', '\xE1', '\x9E', '\x93', ' ', '\xE1', '\x9E', '\xA7', ' ', '\xE1', '\x9E', '\xA9', ' ', '\xE1', '\x9E', '\xB6', /* ខ ទ ន ឧ ឩ ា */ + '\0', + '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x80', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x81', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x82', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x90', /* ក្ក ក្ខ ក្គ ក្ថ */ + '\0', + '\xE1', '\x9E', '\x81', ' ', '\xE1', '\x9E', '\x83', ' ', '\xE1', '\x9E', '\x85', ' ', '\xE1', '\x9E', '\x8B', ' ', '\xE1', '\x9E', '\x94', ' ', '\xE1', '\x9E', '\x98', ' ', '\xE1', '\x9E', '\x99', ' ', '\xE1', '\x9E', '\xB2', /* ខ ឃ ច ឋ ប ម យ ឲ */ + '\0', + '\xE1', '\x9E', '\x8F', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x9A', ' ', '\xE1', '\x9E', '\x9A', '\xE1', '\x9F', '\x80', ' ', '\xE1', '\x9E', '\xB2', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x99', ' ', '\xE1', '\x9E', '\xA2', '\xE1', '\x9E', '\xBF', /* ត្រ រៀ ឲ្យ អឿ */ + '\0', + '\xE1', '\x9E', '\x93', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x8F', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x9A', '\xE1', '\x9F', '\x83', ' ', '\xE1', '\x9E', '\x84', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x81', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x99', ' ', '\xE1', '\x9E', '\x80', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x94', '\xE1', '\x9F', '\x80', ' ', '\xE1', '\x9E', '\x85', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x9A', '\xE1', '\x9F', '\x80', ' ', '\xE1', '\x9E', '\x93', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x8F', '\xE1', '\x9E', '\xBF', ' ', '\xE1', '\x9E', '\x9B', '\xE1', '\x9F', '\x92', '\xE1', '\x9E', '\x94', '\xE1', '\x9E', '\xBF', /* ន្ត្រៃ ង្ខ្យ ក្បៀ ច្រៀ ន្តឿ ល្បឿ */ + '\0', + '\xE1', '\xA7', '\xA0', ' ', '\xE1', '\xA7', '\xA1', /* ᧠ ᧡ */ + '\0', + '\xE1', '\xA7', '\xB6', ' ', '\xE1', '\xA7', '\xB9', /* ᧶ ᧹ */ + '\0', + '\xE0', '\xBA', '\xB2', ' ', '\xE0', '\xBA', '\x94', ' ', '\xE0', '\xBA', '\xAD', ' ', '\xE0', '\xBA', '\xA1', ' ', '\xE0', '\xBA', '\xA5', ' ', '\xE0', '\xBA', '\xA7', ' ', '\xE0', '\xBA', '\xA3', ' ', '\xE0', '\xBA', '\x87', /* າ ດ ອ ມ ລ ວ ຣ ງ */ + '\0', + '\xE0', '\xBA', '\xB2', ' ', '\xE0', '\xBA', '\xAD', ' ', '\xE0', '\xBA', '\x9A', ' ', '\xE0', '\xBA', '\x8D', ' ', '\xE0', '\xBA', '\xA3', ' ', '\xE0', '\xBA', '\xAE', ' ', '\xE0', '\xBA', '\xA7', ' ', '\xE0', '\xBA', '\xA2', /* າ ອ ບ ຍ ຣ ຮ ວ ຢ */ + '\0', + '\xE0', '\xBA', '\x9B', ' ', '\xE0', '\xBA', '\xA2', ' ', '\xE0', '\xBA', '\x9F', ' ', '\xE0', '\xBA', '\x9D', /* ປ ຢ ຟ ຝ */ + '\0', + '\xE0', '\xBB', '\x82', ' ', '\xE0', '\xBB', '\x84', ' ', '\xE0', '\xBB', '\x83', /* ໂ ໄ ໃ */ + '\0', + '\xE0', '\xBA', '\x87', ' ', '\xE0', '\xBA', '\x8A', ' ', '\xE0', '\xBA', '\x96', ' ', '\xE0', '\xBA', '\xBD', ' ', '\xE0', '\xBB', '\x86', ' ', '\xE0', '\xBA', '\xAF', /* ງ ຊ ຖ ຽ ໆ ຯ */ + '\0', + 'T', ' ', 'H', ' ', 'E', ' ', 'Z', ' ', 'O', ' ', 'C', ' ', 'Q', ' ', 'S', /* T H E Z O C Q S */ + '\0', + 'H', ' ', 'E', ' ', 'Z', ' ', 'L', ' ', 'O', ' ', 'C', ' ', 'U', ' ', 'S', /* H E Z L O C U S */ + '\0', + 'f', ' ', 'i', ' ', 'j', ' ', 'k', ' ', 'd', ' ', 'b', ' ', 'h', /* f i j k d b h */ + '\0', + 'u', ' ', 'v', ' ', 'x', ' ', 'z', ' ', 'o', ' ', 'e', ' ', 's', ' ', 'c', /* u v x z o e s c */ + '\0', + 'n', ' ', 'r', ' ', 'x', ' ', 'z', ' ', 'o', ' ', 'e', ' ', 's', ' ', 'c', /* n r x z o e s c */ + '\0', + 'p', ' ', 'q', ' ', 'g', ' ', 'j', ' ', 'y', /* p q g j y */ + '\0', + '\xE2', '\x82', '\x80', ' ', '\xE2', '\x82', '\x83', ' ', '\xE2', '\x82', '\x85', ' ', '\xE2', '\x82', '\x87', ' ', '\xE2', '\x82', '\x88', /* ₀ ₃ ₅ ₇ ₈ */ + '\0', + '\xE2', '\x82', '\x80', ' ', '\xE2', '\x82', '\x81', ' ', '\xE2', '\x82', '\x82', ' ', '\xE2', '\x82', '\x83', ' ', '\xE2', '\x82', '\x88', /* ₀ ₁ ₂ ₃ ₈ */ + '\0', + '\xE1', '\xB5', '\xA2', ' ', '\xE2', '\xB1', '\xBC', ' ', '\xE2', '\x82', '\x95', ' ', '\xE2', '\x82', '\x96', ' ', '\xE2', '\x82', '\x97', /* ᵢ ⱼ ₕ ₖ ₗ */ + '\0', + '\xE2', '\x82', '\x90', ' ', '\xE2', '\x82', '\x91', ' ', '\xE2', '\x82', '\x92', ' ', '\xE2', '\x82', '\x93', ' ', '\xE2', '\x82', '\x99', ' ', '\xE2', '\x82', '\x9B', ' ', '\xE1', '\xB5', '\xA5', ' ', '\xE1', '\xB5', '\xA4', ' ', '\xE1', '\xB5', '\xA3', /* ₐ ₑ ₒ ₓ ₙ ₛ ᵥ ᵤ ᵣ */ + '\0', + '\xE1', '\xB5', '\xA6', ' ', '\xE1', '\xB5', '\xA7', ' ', '\xE1', '\xB5', '\xA8', ' ', '\xE1', '\xB5', '\xA9', ' ', '\xE2', '\x82', '\x9A', /* ᵦ ᵧ ᵨ ᵩ ₚ */ + '\0', + '\xE2', '\x81', '\xB0', ' ', '\xC2', '\xB3', ' ', '\xE2', '\x81', '\xB5', ' ', '\xE2', '\x81', '\xB7', ' ', '\xE1', '\xB5', '\x80', ' ', '\xE1', '\xB4', '\xB4', ' ', '\xE1', '\xB4', '\xB1', ' ', '\xE1', '\xB4', '\xBC', /* ⁰ ³ ⁵ ⁷ ᵀ ᴴ ᴱ ᴼ */ + '\0', + '\xE2', '\x81', '\xB0', ' ', '\xC2', '\xB9', ' ', '\xC2', '\xB2', ' ', '\xC2', '\xB3', ' ', '\xE1', '\xB4', '\xB1', ' ', '\xE1', '\xB4', '\xB8', ' ', '\xE1', '\xB4', '\xBC', ' ', '\xE1', '\xB5', '\x81', /* ⁰ ¹ ² ³ ᴱ ᴸ ᴼ ᵁ */ + '\0', + '\xE1', '\xB5', '\x87', ' ', '\xE1', '\xB5', '\x88', ' ', '\xE1', '\xB5', '\x8F', ' ', '\xCA', '\xB0', ' ', '\xCA', '\xB2', ' ', '\xE1', '\xB6', '\xA0', ' ', '\xE2', '\x81', '\xB1', /* ᵇ ᵈ ᵏ ʰ ʲ ᶠ ⁱ */ + '\0', + '\xE1', '\xB5', '\x89', ' ', '\xE1', '\xB5', '\x92', ' ', '\xCA', '\xB3', ' ', '\xCB', '\xA2', ' ', '\xCB', '\xA3', ' ', '\xE1', '\xB6', '\x9C', ' ', '\xE1', '\xB6', '\xBB', /* ᵉ ᵒ ʳ ˢ ˣ ᶜ ᶻ */ + '\0', + '\xE1', '\xB5', '\x96', ' ', '\xCA', '\xB8', ' ', '\xE1', '\xB5', '\x8D', /* ᵖ ʸ ᵍ */ + '\0', + '\xEA', '\x93', '\xA1', ' ', '\xEA', '\x93', '\xA7', ' ', '\xEA', '\x93', '\xB1', ' ', '\xEA', '\x93', '\xB6', ' ', '\xEA', '\x93', '\xA9', ' ', '\xEA', '\x93', '\x9A', ' ', '\xEA', '\x93', '\xB5', ' ', '\xEA', '\x93', '\xB3', /* ꓡ ꓧ ꓱ ꓶ ꓩ ꓚ ꓵ ꓳ */ + '\0', + '\xEA', '\x93', '\x95', ' ', '\xEA', '\x93', '\x9C', ' ', '\xEA', '\x93', '\x9E', ' ', '\xEA', '\x93', '\xA1', ' ', '\xEA', '\x93', '\x9B', ' ', '\xEA', '\x93', '\xA2', ' ', '\xEA', '\x93', '\xB3', ' ', '\xEA', '\x93', '\xB4', /* ꓕ ꓜ ꓞ ꓡ ꓛ ꓢ ꓳ ꓴ */ + '\0', + '\xE0', '\xB4', '\x92', ' ', '\xE0', '\xB4', '\x9F', ' ', '\xE0', '\xB4', '\xA0', ' ', '\xE0', '\xB4', '\xB1', ' ', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xAA', ' ', '\xE0', '\xB4', '\x9A', '\xE0', '\xB5', '\x8D', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xAA', '\xE0', '\xB5', '\x8D', '\xE0', '\xB4', '\xAA', /* ഒ ട ഠ റ ച പ ച്ച പ്പ */ + '\0', + '\xE0', '\xB4', '\x9F', ' ', '\xE0', '\xB4', '\xA0', ' ', '\xE0', '\xB4', '\xA7', ' ', '\xE0', '\xB4', '\xB6', ' ', '\xE0', '\xB4', '\x98', ' ', '\xE0', '\xB4', '\x9A', ' ', '\xE0', '\xB4', '\xA5', ' ', '\xE0', '\xB4', '\xB2', /* ട ഠ ധ ശ ഘ ച ഥ ല */ + '\0', + '\xE1', '\x80', '\x81', ' ', '\xE1', '\x80', '\x82', ' ', '\xE1', '\x80', '\x84', ' ', '\xE1', '\x80', '\x92', ' ', '\xE1', '\x80', '\x9D', ' ', '\xE1', '\x81', '\xA5', ' ', '\xE1', '\x81', '\x8A', ' ', '\xE1', '\x81', '\x8B', /* ခ ဂ င ဒ ဝ ၥ ၊ ။ */ + '\0', + '\xE1', '\x80', '\x84', ' ', '\xE1', '\x80', '\x8E', ' ', '\xE1', '\x80', '\x92', ' ', '\xE1', '\x80', '\x95', ' ', '\xE1', '\x80', '\x97', ' ', '\xE1', '\x80', '\x9D', ' ', '\xE1', '\x81', '\x8A', ' ', '\xE1', '\x81', '\x8B', /* င ဎ ဒ ပ ဗ ဝ ၊ ။ */ + '\0', + '\xE1', '\x80', '\xA9', ' ', '\xE1', '\x80', '\xBC', ' ', '\xE1', '\x81', '\x8D', ' ', '\xE1', '\x81', '\x8F', ' ', '\xE1', '\x81', '\x86', ' ', '\xE1', '\x80', '\xAB', ' ', '\xE1', '\x80', '\xAD', /* ဩ ြ ၍ ၏ ၆ ါ ိ */ + '\0', + '\xE1', '\x80', '\x89', ' ', '\xE1', '\x80', '\x8A', ' ', '\xE1', '\x80', '\xA5', ' ', '\xE1', '\x80', '\xA9', ' ', '\xE1', '\x80', '\xA8', ' ', '\xE1', '\x81', '\x82', ' ', '\xE1', '\x81', '\x85', ' ', '\xE1', '\x81', '\x89', /* ဉ ည ဥ ဩ ဨ ၂ ၅ ၉ */ + '\0', + '\xDF', '\x90', ' ', '\xDF', '\x89', ' ', '\xDF', '\x92', ' ', '\xDF', '\x9F', ' ', '\xDF', '\x96', ' ', '\xDF', '\x9C', ' ', '\xDF', '\xA0', ' ', '\xDF', '\xA5', /* ߐ ߉ ߒ ߟ ߖ ߜ ߠ ߥ */ + '\0', + '\xDF', '\x80', ' ', '\xDF', '\x98', ' ', '\xDF', '\xA1', ' ', '\xDF', '\xA0', ' ', '\xDF', '\xA5', /* ߀ ߘ ߡ ߠ ߥ */ + '\0', + '\xDF', '\x8F', ' ', '\xDF', '\x9B', ' ', '\xDF', '\x8B', /* ߏ ߛ ߋ */ + '\0', + '\xDF', '\x8E', ' ', '\xDF', '\x8F', ' ', '\xDF', '\x9B', ' ', '\xDF', '\x8B', /* ߎ ߏ ߛ ߋ */ + '\0', + '\xE1', '\xB1', '\x9B', ' ', '\xE1', '\xB1', '\x9C', ' ', '\xE1', '\xB1', '\x9D', ' ', '\xE1', '\xB1', '\xA1', ' ', '\xE1', '\xB1', '\xA2', ' ', '\xE1', '\xB1', '\xA5', /* ᱛ ᱜ ᱝ ᱡ ᱢ ᱥ */ + '\0', + '\xF0', '\x90', '\xB0', '\x97', ' ', '\xF0', '\x90', '\xB0', '\x98', ' ', '\xF0', '\x90', '\xB0', '\xA7', /* 𐰗 𐰘 𐰧 */ + '\0', + '\xF0', '\x90', '\xB0', '\x89', ' ', '\xF0', '\x90', '\xB0', '\x97', ' ', '\xF0', '\x90', '\xB0', '\xA6', ' ', '\xF0', '\x90', '\xB0', '\xA7', /* 𐰉 𐰗 𐰦 𐰧 */ + '\0', + '\xF0', '\x90', '\x92', '\xBE', ' ', '\xF0', '\x90', '\x93', '\x8D', ' ', '\xF0', '\x90', '\x93', '\x92', ' ', '\xF0', '\x90', '\x93', '\x93', ' ', '\xF0', '\x90', '\x92', '\xBB', ' ', '\xF0', '\x90', '\x93', '\x82', ' ', '\xF0', '\x90', '\x92', '\xB5', ' ', '\xF0', '\x90', '\x93', '\x86', /* 𐒾 𐓍 𐓒 𐓓 𐒻 𐓂 𐒵 𐓆 */ + '\0', + '\xF0', '\x90', '\x92', '\xB0', ' ', '\xF0', '\x90', '\x93', '\x8D', ' ', '\xF0', '\x90', '\x93', '\x82', ' ', '\xF0', '\x90', '\x92', '\xBF', ' ', '\xF0', '\x90', '\x93', '\x8E', ' ', '\xF0', '\x90', '\x92', '\xB9', /* 𐒰 𐓍 𐓂 𐒿 𐓎 𐒹 */ + '\0', + '\xF0', '\x90', '\x92', '\xBC', ' ', '\xF0', '\x90', '\x92', '\xBD', ' ', '\xF0', '\x90', '\x92', '\xBE', /* 𐒼 𐒽 𐒾 */ + '\0', + '\xF0', '\x90', '\x93', '\xB5', ' ', '\xF0', '\x90', '\x93', '\xB6', ' ', '\xF0', '\x90', '\x93', '\xBA', ' ', '\xF0', '\x90', '\x93', '\xBB', ' ', '\xF0', '\x90', '\x93', '\x9D', ' ', '\xF0', '\x90', '\x93', '\xA3', ' ', '\xF0', '\x90', '\x93', '\xAA', ' ', '\xF0', '\x90', '\x93', '\xAE', /* 𐓵 𐓶 𐓺 𐓻 𐓝 𐓣 𐓪 𐓮 */ + '\0', + '\xF0', '\x90', '\x93', '\x98', ' ', '\xF0', '\x90', '\x93', '\x9A', ' ', '\xF0', '\x90', '\x93', '\xA3', ' ', '\xF0', '\x90', '\x93', '\xB5', ' ', '\xF0', '\x90', '\x93', '\xA1', ' ', '\xF0', '\x90', '\x93', '\xA7', ' ', '\xF0', '\x90', '\x93', '\xAA', ' ', '\xF0', '\x90', '\x93', '\xB6', /* 𐓘 𐓚 𐓣 𐓵 𐓡 𐓧 𐓪 𐓶 */ + '\0', + '\xF0', '\x90', '\x93', '\xA4', ' ', '\xF0', '\x90', '\x93', '\xA6', ' ', '\xF0', '\x90', '\x93', '\xB8', ' ', '\xF0', '\x90', '\x93', '\xB9', ' ', '\xF0', '\x90', '\x93', '\x9B', /* 𐓤 𐓦 𐓸 𐓹 𐓛 */ + '\0', + '\xF0', '\x90', '\x93', '\xA4', ' ', '\xF0', '\x90', '\x93', '\xA5', ' ', '\xF0', '\x90', '\x93', '\xA6', /* 𐓤 𐓥 𐓦 */ + '\0', + '\xF0', '\x90', '\x92', '\x86', ' ', '\xF0', '\x90', '\x92', '\x89', ' ', '\xF0', '\x90', '\x92', '\x90', ' ', '\xF0', '\x90', '\x92', '\x92', ' ', '\xF0', '\x90', '\x92', '\x98', ' ', '\xF0', '\x90', '\x92', '\x9B', ' ', '\xF0', '\x90', '\x92', '\xA0', ' ', '\xF0', '\x90', '\x92', '\xA3', /* 𐒆 𐒉 𐒐 𐒒 𐒘 𐒛 𐒠 𐒣 */ + '\0', + '\xF0', '\x90', '\x92', '\x80', ' ', '\xF0', '\x90', '\x92', '\x82', ' ', '\xF0', '\x90', '\x92', '\x86', ' ', '\xF0', '\x90', '\x92', '\x88', ' ', '\xF0', '\x90', '\x92', '\x8A', ' ', '\xF0', '\x90', '\x92', '\x92', ' ', '\xF0', '\x90', '\x92', '\xA0', ' ', '\xF0', '\x90', '\x92', '\xA9', /* 𐒀 𐒂 𐒆 𐒈 𐒊 𐒒 𐒠 𐒩 */ + '\0', + '\xEA', '\xA2', '\x9C', ' ', '\xEA', '\xA2', '\x9E', ' ', '\xEA', '\xA2', '\xB3', ' ', '\xEA', '\xA2', '\x82', ' ', '\xEA', '\xA2', '\x96', ' ', '\xEA', '\xA2', '\x92', ' ', '\xEA', '\xA2', '\x9D', ' ', '\xEA', '\xA2', '\x9B', /* ꢜ ꢞ ꢳ ꢂ ꢖ ꢒ ꢝ ꢛ */ + '\0', + '\xEA', '\xA2', '\x82', ' ', '\xEA', '\xA2', '\xA8', ' ', '\xEA', '\xA2', '\xBA', ' ', '\xEA', '\xA2', '\xA4', ' ', '\xEA', '\xA2', '\x8E', /* ꢂ ꢨ ꢺ ꢤ ꢎ */ + '\0', + '\xF0', '\x90', '\x91', '\x95', ' ', '\xF0', '\x90', '\x91', '\x99', /* 𐑕 𐑙 */ + '\0', + '\xF0', '\x90', '\x91', '\x94', ' ', '\xF0', '\x90', '\x91', '\x96', ' ', '\xF0', '\x90', '\x91', '\x97', ' ', '\xF0', '\x90', '\x91', '\xB9', ' ', '\xF0', '\x90', '\x91', '\xBB', /* 𐑔 𐑖 𐑗 𐑹 𐑻 */ + '\0', + '\xF0', '\x90', '\x91', '\x9F', ' ', '\xF0', '\x90', '\x91', '\xA3', /* 𐑟 𐑣 */ + '\0', + '\xF0', '\x90', '\x91', '\xB1', ' ', '\xF0', '\x90', '\x91', '\xB2', ' ', '\xF0', '\x90', '\x91', '\xB3', ' ', '\xF0', '\x90', '\x91', '\xB4', ' ', '\xF0', '\x90', '\x91', '\xB8', ' ', '\xF0', '\x90', '\x91', '\xBA', ' ', '\xF0', '\x90', '\x91', '\xBC', /* 𐑱 𐑲 𐑳 𐑴 𐑸 𐑺 𐑼 */ + '\0', + '\xF0', '\x90', '\x91', '\xB4', ' ', '\xF0', '\x90', '\x91', '\xBB', ' ', '\xF0', '\x90', '\x91', '\xB9', /* 𐑴 𐑻 𐑹 */ + '\0', + '\xE0', '\xB6', '\x89', ' ', '\xE0', '\xB6', '\x9A', ' ', '\xE0', '\xB6', '\x9D', ' ', '\xE0', '\xB6', '\xB3', ' ', '\xE0', '\xB6', '\xB4', ' ', '\xE0', '\xB6', '\xBA', ' ', '\xE0', '\xB6', '\xBD', ' ', '\xE0', '\xB7', '\x86', /* ඉ ක ඝ ඳ ප ය ල ෆ */ + '\0', + '\xE0', '\xB6', '\x91', ' ', '\xE0', '\xB6', '\x94', ' ', '\xE0', '\xB6', '\x9D', ' ', '\xE0', '\xB6', '\xA2', ' ', '\xE0', '\xB6', '\xA7', ' ', '\xE0', '\xB6', '\xAE', ' ', '\xE0', '\xB6', '\xB0', ' ', '\xE0', '\xB6', '\xBB', /* එ ඔ ඝ ජ ට ථ ධ ර */ + '\0', + '\xE0', '\xB6', '\xAF', ' ', '\xE0', '\xB6', '\xB3', ' ', '\xE0', '\xB6', '\x8B', ' ', '\xE0', '\xB6', '\xBD', ' ', '\xE0', '\xB6', '\xAD', '\xE0', '\xB7', '\x96', ' ', '\xE0', '\xB6', '\xAD', '\xE0', '\xB7', '\x94', ' ', '\xE0', '\xB6', '\xB6', '\xE0', '\xB7', '\x94', ' ', '\xE0', '\xB6', '\xAF', '\xE0', '\xB7', '\x94', /* ද ඳ උ ල තූ තු බු දු */ + '\0', + '\xE1', '\xAE', '\x8B', ' ', '\xE1', '\xAE', '\x9E', ' ', '\xE1', '\xAE', '\xAE', ' ', '\xE1', '\xAE', '\xBD', ' ', '\xE1', '\xAE', '\xB0', ' ', '\xE1', '\xAE', '\x88', /* ᮋ ᮞ ᮮ ᮽ ᮰ ᮈ */ + '\0', + '\xE1', '\xAE', '\x84', ' ', '\xE1', '\xAE', '\x94', ' ', '\xE1', '\xAE', '\x95', ' ', '\xE1', '\xAE', '\x97', ' ', '\xE1', '\xAE', '\xB0', ' ', '\xE1', '\xAE', '\x86', ' ', '\xE1', '\xAE', '\x88', ' ', '\xE1', '\xAE', '\x89', /* ᮄ ᮔ ᮕ ᮗ ᮰ ᮆ ᮈ ᮉ */ + '\0', + '\xE1', '\xAE', '\xBC', ' ', '\xE1', '\xB3', '\x84', /* ᮼ ᳄ */ + '\0', + '\xEA', '\xAA', '\x86', ' ', '\xEA', '\xAA', '\x94', ' ', '\xEA', '\xAA', '\x92', ' ', '\xEA', '\xAA', '\x96', ' ', '\xEA', '\xAA', '\xAB', /* ꪆ ꪔ ꪒ ꪖ ꪫ */ + '\0', + '\xEA', '\xAA', '\x89', ' ', '\xEA', '\xAA', '\xAB', ' ', '\xEA', '\xAA', '\xAE', /* ꪉ ꪫ ꪮ */ + '\0', + '\xE0', '\xAE', '\x89', ' ', '\xE0', '\xAE', '\x92', ' ', '\xE0', '\xAE', '\x93', ' ', '\xE0', '\xAE', '\xB1', ' ', '\xE0', '\xAE', '\x88', ' ', '\xE0', '\xAE', '\x95', ' ', '\xE0', '\xAE', '\x99', ' ', '\xE0', '\xAE', '\x9A', /* உ ஒ ஓ ற ஈ க ங ச */ + '\0', + '\xE0', '\xAE', '\x95', ' ', '\xE0', '\xAE', '\x9A', ' ', '\xE0', '\xAE', '\xB2', ' ', '\xE0', '\xAE', '\xB6', ' ', '\xE0', '\xAE', '\x89', ' ', '\xE0', '\xAE', '\x99', ' ', '\xE0', '\xAE', '\x9F', ' ', '\xE0', '\xAE', '\xAA', /* க ச ல ஶ உ ங ட ப */ + '\0', + '\xE0', '\xB0', '\x87', ' ', '\xE0', '\xB0', '\x8C', ' ', '\xE0', '\xB0', '\x99', ' ', '\xE0', '\xB0', '\x9E', ' ', '\xE0', '\xB0', '\xA3', ' ', '\xE0', '\xB0', '\xB1', ' ', '\xE0', '\xB1', '\xAF', /* ఇ ఌ ఙ ఞ ణ ఱ ౯ */ + '\0', + '\xE0', '\xB0', '\x85', ' ', '\xE0', '\xB0', '\x95', ' ', '\xE0', '\xB0', '\x9A', ' ', '\xE0', '\xB0', '\xB0', ' ', '\xE0', '\xB0', '\xBD', ' ', '\xE0', '\xB1', '\xA8', ' ', '\xE0', '\xB1', '\xAC', /* అ క చ ర ఽ ౨ ౬ */ + '\0', + '\xE0', '\xB8', '\x9A', ' ', '\xE0', '\xB9', '\x80', ' ', '\xE0', '\xB9', '\x81', ' ', '\xE0', '\xB8', '\xAD', ' ', '\xE0', '\xB8', '\x81', ' ', '\xE0', '\xB8', '\xB2', /* บ เ แ อ ก า */ + '\0', + '\xE0', '\xB8', '\x9A', ' ', '\xE0', '\xB8', '\x9B', ' ', '\xE0', '\xB8', '\xA9', ' ', '\xE0', '\xB8', '\xAF', ' ', '\xE0', '\xB8', '\xAD', ' ', '\xE0', '\xB8', '\xA2', ' ', '\xE0', '\xB8', '\xAE', /* บ ป ษ ฯ อ ย ฮ */ + '\0', + '\xE0', '\xB8', '\x9B', ' ', '\xE0', '\xB8', '\x9D', ' ', '\xE0', '\xB8', '\x9F', /* ป ฝ ฟ */ + '\0', + '\xE0', '\xB9', '\x82', ' ', '\xE0', '\xB9', '\x83', ' ', '\xE0', '\xB9', '\x84', /* โ ใ ไ */ + '\0', + '\xE0', '\xB8', '\x8E', ' ', '\xE0', '\xB8', '\x8F', ' ', '\xE0', '\xB8', '\xA4', ' ', '\xE0', '\xB8', '\xA6', /* ฎ ฏ ฤ ฦ */ + '\0', + '\xE0', '\xB8', '\x8D', ' ', '\xE0', '\xB8', '\x90', /* ญ ฐ */ + '\0', + '\xE0', '\xB9', '\x90', ' ', '\xE0', '\xB9', '\x91', ' ', '\xE0', '\xB9', '\x93', /* ๐ ๑ ๓ */ + '\0', + '\xE2', '\xB5', '\x94', ' ', '\xE2', '\xB5', '\x99', ' ', '\xE2', '\xB5', '\x9B', ' ', '\xE2', '\xB5', '\x9E', ' ', '\xE2', '\xB4', '\xB5', ' ', '\xE2', '\xB4', '\xBC', ' ', '\xE2', '\xB4', '\xB9', ' ', '\xE2', '\xB5', '\x8E', /* ⵔ ⵙ ⵛ ⵞ ⴵ ⴼ ⴹ ⵎ */ + '\0', + '\xEA', '\x97', '\x8D', ' ', '\xEA', '\x98', '\x96', ' ', '\xEA', '\x98', '\x99', ' ', '\xEA', '\x98', '\x9C', ' ', '\xEA', '\x96', '\x9C', ' ', '\xEA', '\x96', '\x9D', ' ', '\xEA', '\x94', '\x85', ' ', '\xEA', '\x95', '\xA2', /* ꗍ ꘖ ꘙ ꘜ ꖜ ꖝ ꔅ ꕢ */ + '\0', + '\xEA', '\x97', '\x8D', ' ', '\xEA', '\x98', '\x96', ' ', '\xEA', '\x98', '\x99', ' ', '\xEA', '\x97', '\x9E', ' ', '\xEA', '\x94', '\x85', ' ', '\xEA', '\x95', '\xA2', ' ', '\xEA', '\x96', '\x9C', ' ', '\xEA', '\x94', '\x86', /* ꗍ ꘖ ꘙ ꗞ ꔅ ꕢ ꖜ ꔆ */ +#ifdef AF_CONFIG_OPTION_CJK + '\0', + '\xE4', '\xBB', '\x96', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\x9C', '\xB0', /* 他 们 你 來 們 到 和 地 */ + ' ', '\xE5', '\xAF', '\xB9', ' ', '\xE5', '\xB0', '\x8D', ' ', '\xE5', '\xB0', '\xB1', ' ', '\xE5', '\xB8', '\xAD', ' ', '\xE6', '\x88', '\x91', ' ', '\xE6', '\x97', '\xB6', ' ', '\xE6', '\x99', '\x82', ' ', '\xE6', '\x9C', '\x83', /* 对 對 就 席 我 时 時 會 */ + ' ', '\xE6', '\x9D', '\xA5', ' ', '\xE7', '\x82', '\xBA', ' ', '\xE8', '\x83', '\xBD', ' ', '\xE8', '\x88', '\xB0', ' ', '\xE8', '\xAA', '\xAA', ' ', '\xE8', '\xAF', '\xB4', ' ', '\xE8', '\xBF', '\x99', ' ', '\xE9', '\x80', '\x99', /* 来 為 能 舰 說 说 这 這 */ + ' ', '\xE9', '\xBD', '\x8A', ' ', '|', /* 齊 | */ + ' ', '\xE5', '\x86', '\x9B', ' ', '\xE5', '\x90', '\x8C', ' ', '\xE5', '\xB7', '\xB2', ' ', '\xE6', '\x84', '\xBF', ' ', '\xE6', '\x97', '\xA2', ' ', '\xE6', '\x98', '\x9F', ' ', '\xE6', '\x98', '\xAF', ' ', '\xE6', '\x99', '\xAF', /* 军 同 已 愿 既 星 是 景 */ + ' ', '\xE6', '\xB0', '\x91', ' ', '\xE7', '\x85', '\xA7', ' ', '\xE7', '\x8E', '\xB0', ' ', '\xE7', '\x8F', '\xBE', ' ', '\xE7', '\x90', '\x86', ' ', '\xE7', '\x94', '\xA8', ' ', '\xE7', '\xBD', '\xAE', ' ', '\xE8', '\xA6', '\x81', /* 民 照 现 現 理 用 置 要 */ + ' ', '\xE8', '\xBB', '\x8D', ' ', '\xE9', '\x82', '\xA3', ' ', '\xE9', '\x85', '\x8D', ' ', '\xE9', '\x87', '\x8C', ' ', '\xE9', '\x96', '\x8B', ' ', '\xE9', '\x9B', '\xB7', ' ', '\xE9', '\x9C', '\xB2', ' ', '\xE9', '\x9D', '\xA2', /* 軍 那 配 里 開 雷 露 面 */ + ' ', '\xE9', '\xA1', '\xBE', /* 顾 */ + '\0', + '\xE4', '\xB8', '\xAA', ' ', '\xE4', '\xB8', '\xBA', ' ', '\xE4', '\xBA', '\xBA', ' ', '\xE4', '\xBB', '\x96', ' ', '\xE4', '\xBB', '\xA5', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86', /* 个 为 人 他 以 们 你 來 */ + ' ', '\xE5', '\x80', '\x8B', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\xA4', '\xA7', ' ', '\xE5', '\xAF', '\xB9', ' ', '\xE5', '\xB0', '\x8D', ' ', '\xE5', '\xB0', '\xB1', /* 個 們 到 和 大 对 對 就 */ + ' ', '\xE6', '\x88', '\x91', ' ', '\xE6', '\x97', '\xB6', ' ', '\xE6', '\x99', '\x82', ' ', '\xE6', '\x9C', '\x89', ' ', '\xE6', '\x9D', '\xA5', ' ', '\xE7', '\x82', '\xBA', ' ', '\xE8', '\xA6', '\x81', ' ', '\xE8', '\xAA', '\xAA', /* 我 时 時 有 来 為 要 說 */ + ' ', '\xE8', '\xAF', '\xB4', ' ', '|', /* 说 | */ + ' ', '\xE4', '\xB8', '\xBB', ' ', '\xE4', '\xBA', '\x9B', ' ', '\xE5', '\x9B', '\xA0', ' ', '\xE5', '\xAE', '\x83', ' ', '\xE6', '\x83', '\xB3', ' ', '\xE6', '\x84', '\x8F', ' ', '\xE7', '\x90', '\x86', ' ', '\xE7', '\x94', '\x9F', /* 主 些 因 它 想 意 理 生 */ + ' ', '\xE7', '\x95', '\xB6', ' ', '\xE7', '\x9C', '\x8B', ' ', '\xE7', '\x9D', '\x80', ' ', '\xE7', '\xBD', '\xAE', ' ', '\xE8', '\x80', '\x85', ' ', '\xE8', '\x87', '\xAA', ' ', '\xE8', '\x91', '\x97', ' ', '\xE8', '\xA3', '\xA1', /* 當 看 着 置 者 自 著 裡 */ + ' ', '\xE8', '\xBF', '\x87', ' ', '\xE8', '\xBF', '\x98', ' ', '\xE8', '\xBF', '\x9B', ' ', '\xE9', '\x80', '\xB2', ' ', '\xE9', '\x81', '\x8E', ' ', '\xE9', '\x81', '\x93', ' ', '\xE9', '\x82', '\x84', ' ', '\xE9', '\x87', '\x8C', /* 过 还 进 進 過 道 還 里 */ + ' ', '\xE9', '\x9D', '\xA2', /* 面 */ +#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT + '\0', + ' ', '\xE4', '\xBA', '\x9B', ' ', '\xE4', '\xBB', '\xAC', ' ', '\xE4', '\xBD', '\xA0', ' ', '\xE4', '\xBE', '\x86', ' ', '\xE5', '\x80', '\x91', ' ', '\xE5', '\x88', '\xB0', ' ', '\xE5', '\x92', '\x8C', ' ', '\xE5', '\x9C', '\xB0', /* 些 们 你 來 們 到 和 地 */ + ' ', '\xE5', '\xA5', '\xB9', ' ', '\xE5', '\xB0', '\x86', ' ', '\xE5', '\xB0', '\x87', ' ', '\xE5', '\xB0', '\xB1', ' ', '\xE5', '\xB9', '\xB4', ' ', '\xE5', '\xBE', '\x97', ' ', '\xE6', '\x83', '\x85', ' ', '\xE6', '\x9C', '\x80', /* 她 将 將 就 年 得 情 最 */ + ' ', '\xE6', '\xA0', '\xB7', ' ', '\xE6', '\xA8', '\xA3', ' ', '\xE7', '\x90', '\x86', ' ', '\xE8', '\x83', '\xBD', ' ', '\xE8', '\xAA', '\xAA', ' ', '\xE8', '\xAF', '\xB4', ' ', '\xE8', '\xBF', '\x99', ' ', '\xE9', '\x80', '\x99', /* 样 樣 理 能 說 说 这 這 */ + ' ', '\xE9', '\x80', '\x9A', ' ', '|', /* 通 | */ + ' ', '\xE5', '\x8D', '\xB3', ' ', '\xE5', '\x90', '\x97', ' ', '\xE5', '\x90', '\xA7', ' ', '\xE5', '\x90', '\xAC', ' ', '\xE5', '\x91', '\xA2', ' ', '\xE5', '\x93', '\x81', ' ', '\xE5', '\x93', '\x8D', ' ', '\xE5', '\x97', '\x8E', /* 即 吗 吧 听 呢 品 响 嗎 */ + ' ', '\xE5', '\xB8', '\x88', ' ', '\xE5', '\xB8', '\xAB', ' ', '\xE6', '\x94', '\xB6', ' ', '\xE6', '\x96', '\xAD', ' ', '\xE6', '\x96', '\xB7', ' ', '\xE6', '\x98', '\x8E', ' ', '\xE7', '\x9C', '\xBC', ' ', '\xE9', '\x96', '\x93', /* 师 師 收 断 斷 明 眼 間 */ + ' ', '\xE9', '\x97', '\xB4', ' ', '\xE9', '\x99', '\x85', ' ', '\xE9', '\x99', '\x88', ' ', '\xE9', '\x99', '\x90', ' ', '\xE9', '\x99', '\xA4', ' ', '\xE9', '\x99', '\xB3', ' ', '\xE9', '\x9A', '\x8F', ' ', '\xE9', '\x9A', '\x9B', /* 间 际 陈 限 除 陳 随 際 */ + ' ', '\xE9', '\x9A', '\xA8', /* 隨 */ + '\0', + '\xE4', '\xBA', '\x8B', ' ', '\xE5', '\x89', '\x8D', ' ', '\xE5', '\xAD', '\xB8', ' ', '\xE5', '\xB0', '\x86', ' ', '\xE5', '\xB0', '\x87', ' ', '\xE6', '\x83', '\x85', ' ', '\xE6', '\x83', '\xB3', ' ', '\xE6', '\x88', '\x96', /* 事 前 學 将 將 情 想 或 */ + ' ', '\xE6', '\x94', '\xBF', ' ', '\xE6', '\x96', '\xAF', ' ', '\xE6', '\x96', '\xB0', ' ', '\xE6', '\xA0', '\xB7', ' ', '\xE6', '\xA8', '\xA3', ' ', '\xE6', '\xB0', '\x91', ' ', '\xE6', '\xB2', '\x92', ' ', '\xE6', '\xB2', '\xA1', /* 政 斯 新 样 樣 民 沒 没 */ + ' ', '\xE7', '\x84', '\xB6', ' ', '\xE7', '\x89', '\xB9', ' ', '\xE7', '\x8E', '\xB0', ' ', '\xE7', '\x8F', '\xBE', ' ', '\xE7', '\x90', '\x83', ' ', '\xE7', '\xAC', '\xAC', ' ', '\xE7', '\xB6', '\x93', ' ', '\xE8', '\xB0', '\x81', /* 然 特 现 現 球 第 經 谁 */ + ' ', '\xE8', '\xB5', '\xB7', ' ', '|', /* 起 | */ + ' ', '\xE4', '\xBE', '\x8B', ' ', '\xE5', '\x88', '\xA5', ' ', '\xE5', '\x88', '\xAB', ' ', '\xE5', '\x88', '\xB6', ' ', '\xE5', '\x8A', '\xA8', ' ', '\xE5', '\x8B', '\x95', ' ', '\xE5', '\x90', '\x97', ' ', '\xE5', '\x97', '\x8E', /* 例 別 别 制 动 動 吗 嗎 */ + ' ', '\xE5', '\xA2', '\x9E', ' ', '\xE6', '\x8C', '\x87', ' ', '\xE6', '\x98', '\x8E', ' ', '\xE6', '\x9C', '\x9D', ' ', '\xE6', '\x9C', '\x9F', ' ', '\xE6', '\x9E', '\x84', ' ', '\xE7', '\x89', '\xA9', ' ', '\xE7', '\xA1', '\xAE', /* 增 指 明 朝 期 构 物 确 */ + ' ', '\xE7', '\xA7', '\x8D', ' ', '\xE8', '\xAA', '\xBF', ' ', '\xE8', '\xB0', '\x83', ' ', '\xE8', '\xB2', '\xBB', ' ', '\xE8', '\xB4', '\xB9', ' ', '\xE9', '\x82', '\xA3', ' ', '\xE9', '\x83', '\xBD', ' ', '\xE9', '\x96', '\x93', /* 种 調 调 費 费 那 都 間 */ + ' ', '\xE9', '\x97', '\xB4', /* 间 */ +#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ +#endif /* AF_CONFIG_OPTION_CJK */ + '\0', + + }; + + + /* stringsets are specific to styles */ + FT_LOCAL_ARRAY_DEF( AF_Blue_StringRec ) + af_blue_stringsets[] = + { + /* */ + { AF_BLUE_STRING_ADLAM_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_ADLAM_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_ARABIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_ARABIC_BOTTOM, 0 }, + { AF_BLUE_STRING_ARABIC_JOIN, AF_BLUE_PROPERTY_LATIN_NEUTRAL }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_ARMENIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_AVESTAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_AVESTAN_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_BAMUM_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_BAMUM_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_BENGALI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_BENGALI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_BENGALI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_NEUTRAL | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_BENGALI_BASE, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_BUHID_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_BUHID_LARGE, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_BUHID_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_BUHID_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CHAKMA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CHAKMA_BOTTOM, 0 }, + { AF_BLUE_STRING_CHAKMA_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CARIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CARIAN_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CHEROKEE_CAPITAL, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CHEROKEE_CAPITAL, 0 }, + { AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CHEROKEE_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_CHEROKEE_SMALL, 0 }, + { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_COPTIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_COPTIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CYPRIOT_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CYPRIOT_BOTTOM, 0 }, + { AF_BLUE_STRING_CYPRIOT_SMALL, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CYPRIOT_SMALL, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_CYRILLIC_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_CYRILLIC_SMALL, 0 }, + { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_DEVANAGARI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_DEVANAGARI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_DEVANAGARI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_NEUTRAL | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_DEVANAGARI_BASE, 0 }, + { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_DESERET_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_DESERET_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_DESERET_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_ETHIOPIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM, 0 }, + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER, 0 }, + { AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM, 0 }, + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM, 0 }, + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GOTHIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GOTHIC_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GREEK_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GREEK_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_GREEK_SMALL, 0 }, + { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GUJARATI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_GUJARATI_BOTTOM, 0 }, + { AF_BLUE_STRING_GUJARATI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GUJARATI_DESCENDER, 0 }, + { AF_BLUE_STRING_GUJARATI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_GURMUKHI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GURMUKHI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_GURMUKHI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_NEUTRAL | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_GURMUKHI_BOTTOM, 0 }, + { AF_BLUE_STRING_GURMUKHI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_HEBREW_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_LONG }, + { AF_BLUE_STRING_HEBREW_BOTTOM, 0 }, + { AF_BLUE_STRING_HEBREW_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_KAYAH_LI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_KAYAH_LI_BOTTOM, 0 }, + { AF_BLUE_STRING_KAYAH_LI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_KAYAH_LI_DESCENDER, 0 }, + { AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_KHMER_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP, AF_BLUE_PROPERTY_LATIN_SUB_TOP }, + { AF_BLUE_STRING_KHMER_BOTTOM, 0 }, + { AF_BLUE_STRING_KHMER_DESCENDER, 0 }, + { AF_BLUE_STRING_KHMER_LARGE_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_KANNADA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_KANNADA_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_LAO_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_LAO_BOTTOM, 0 }, + { AF_BLUE_STRING_LAO_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LAO_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LAO_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_LATIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_LATIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LATIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_LATIN_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LATIN_SUBS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_LATIN_SUBS_SMALL, 0 }, + { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LATIN_SUPS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_LATIN_SUPS_SMALL, 0 }, + { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_LISU_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_LISU_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_MALAYALAM_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_MYANMAR_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_MYANMAR_BOTTOM, 0 }, + { AF_BLUE_STRING_MYANMAR_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_MYANMAR_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_NKO_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_NKO_BOTTOM, 0 }, + { AF_BLUE_STRING_NKO_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_OL_CHIKI, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_OL_CHIKI, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_OLD_TURKIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_OLD_TURKIC_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_OSAGE_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM, 0 }, + { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0 }, + { AF_BLUE_STRING_OSAGE_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_OSMANYA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_OSMANYA_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_SAURASHTRA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_SHAVIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_SHAVIAN_BOTTOM, 0 }, + { AF_BLUE_STRING_SHAVIAN_DESCENDER, 0 }, + { AF_BLUE_STRING_SHAVIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_SINHALA_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_SINHALA_BOTTOM, 0 }, + { AF_BLUE_STRING_SINHALA_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_SUNDANESE_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_SUNDANESE_BOTTOM, 0 }, + { AF_BLUE_STRING_SUNDANESE_DESCENDER, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_TAMIL_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_TAMIL_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_TAI_VIET_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_TAI_VIET_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_TELUGU_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_TELUGU_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_TIFINAGH, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_THAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT }, + { AF_BLUE_STRING_THAI_BOTTOM, 0 }, + { AF_BLUE_STRING_THAI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_THAI_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_THAI_DESCENDER, 0 }, + { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0 }, + { AF_BLUE_STRING_THAI_DIGIT_TOP, 0 }, + { AF_BLUE_STRING_MAX, 0 }, + { AF_BLUE_STRING_VAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP }, + { AF_BLUE_STRING_VAI_BOTTOM, 0 }, + { AF_BLUE_STRING_MAX, 0 }, +#ifdef AF_CONFIG_OPTION_CJK + { AF_BLUE_STRING_CJK_TOP, AF_BLUE_PROPERTY_CJK_TOP }, + { AF_BLUE_STRING_CJK_BOTTOM, 0 }, +#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT + { AF_BLUE_STRING_CJK_LEFT, AF_BLUE_PROPERTY_CJK_HORIZ }, + { AF_BLUE_STRING_CJK_RIGHT, AF_BLUE_PROPERTY_CJK_HORIZ | + AF_BLUE_PROPERTY_CJK_RIGHT }, +#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ + { AF_BLUE_STRING_MAX, 0 }, +#endif /* AF_CONFIG_OPTION_CJK */ + + }; + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afblue.cin b/vendor/FreeType2/src/autofit/afblue.cin new file mode 100644 index 0000000..4913e2e --- /dev/null +++ b/vendor/FreeType2/src/autofit/afblue.cin @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* afblue.c */ +/* */ +/* Auto-fitter data for blue strings (body). */ +/* */ +/* Copyright 2013-2018 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. */ +/* */ +/***************************************************************************/ + + +#include "aftypes.h" + + + FT_LOCAL_ARRAY_DEF( char ) + af_blue_strings[] = + { + /* */ +@AF_BLUE_STRINGS_ARRAY@ + }; + + + /* stringsets are specific to styles */ + FT_LOCAL_ARRAY_DEF( AF_Blue_StringRec ) + af_blue_stringsets[] = + { + /* */ +@AF_BLUE_STRINGSETS_ARRAY@ + }; + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afblue.dat b/vendor/FreeType2/src/autofit/afblue.dat new file mode 100644 index 0000000..bc2f0d2 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afblue.dat @@ -0,0 +1,1072 @@ +// afblue.dat +// +// Auto-fitter data for blue strings. +// +// Copyright 2013-2018 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 file contains data specific to blue zones. It gets processed by +// a script to simulate `jagged arrays', with enumeration values holding +// offsets into the arrays. +// +// The format of the file is rather simple: A section starts with three +// labels separated by whitespace and followed by a colon (everything in a +// single line); the first label gives the name of the enumeration template, +// the second the name of the array template, and the third the name of the +// `maximum' template. The script then fills the corresponding templates +// (indicated by `@' characters around the name). +// +// A section contains one or more data records. Each data record consists +// of two or more lines. The first line holds the enumeration name, and the +// remaining lines the corresponding array data. +// +// There are two possible representations for array data. +// +// - A string of characters or character clusters (for example, representing +// Aksharas, Devanagari syllables) in UTF-8 encoding enclosed in double +// quotes, using C syntax, where the elements are separated by spaces. +// There can be only one string per line, thus the starting and ending +// double quote must be the first and last character in the line, +// respectively, ignoring whitespace before and after the string. If +// there are multiple strings (in multiple lines), they are concatenated +// to a single string. In the output, a string gets represented as a +// series of singles bytes, followed by a zero byte. The enumeration +// values simply hold byte offsets to the start of the corresponding +// strings. +// +// For strings, the `maximum' template holds the maximum number of +// non-space characters in all strings. +// +// - Data blocks enclosed in balanced braces, which get copied verbatim and +// which can span multiple lines. The opening brace of a block must be +// the first character of a line (ignoring whitespace), and the closing +// brace the last (ignoring whitespace also). The script appends a comma +// character after each block and counts the number of blocks to set the +// enumeration values. +// +// For data blocks, the `maximum' template holds the maximum number of +// array elements. +// +// A section can contain either strings only or data blocks only. +// +// A comment line starts with `//'; it gets removed. A preprocessor +// directive line (using the standard syntax of `cpp') starts with `#' and +// gets copied verbatim to both the enumeration and the array. Whitespace +// outside of a string is insignificant. +// +// Preprocessor directives are ignored while the script computes maximum +// values; this essentially means that the maximum values can easily be too +// large. Given that the purpose of those values is to create local +// fixed-size arrays at compile time for further processing of the blue zone +// data, this isn't a problem. Note the final zero byte of a string is not +// counted. Note also that the count holds the number of UTF-8 encoded +// characters, not bytes. + + +// The blue zone string data, to be used in the blue stringsets below. + +AF_BLUE_STRING_ENUM AF_BLUE_STRINGS_ARRAY AF_BLUE_STRING_MAX_LEN: + + AF_BLUE_STRING_ADLAM_CAPITAL_TOP + "𞤌 𞤅 𞤈 𞤏 𞤔 𞤚" + AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM + "𞤂 𞤖" + AF_BLUE_STRING_ADLAM_SMALL_TOP + "𞤬 𞤮 𞤻 𞤼 𞤾" + AF_BLUE_STRING_ADLAM_SMALL_BOTTOM + "𞤤 𞤨 𞤩 𞤭 𞤴 𞤸 𞤺 𞥀" + + AF_BLUE_STRING_ARABIC_TOP + "ا إ ل ك ط ظ" + AF_BLUE_STRING_ARABIC_BOTTOM + "ت ث ط ظ ك" + // We don't necessarily have access to medial forms via Unicode in case + // Arabic presentational forms are missing. The only character that is + // guaranteed to have the same vertical position with joining (this is, + // non-isolated) forms is U+0640, ARABIC TATWEEL, which must join both + // round and flat curves. + AF_BLUE_STRING_ARABIC_JOIN + "ـ" + + AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP + "Ա Մ Ւ Ս Բ Գ Դ Օ" + AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM + "Ւ Ո Դ Ճ Շ Ս Տ Օ" + AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER + "ե է ի մ վ ֆ ճ" + AF_BLUE_STRING_ARMENIAN_SMALL_TOP + "ա յ ւ ս գ շ ր օ" + AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM + "հ ո ճ ա ե ծ ս օ" + AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER + "բ ը ի լ ղ պ փ ց" + + AF_BLUE_STRING_AVESTAN_TOP + "𐬀 𐬁 𐬐 𐬛" + AF_BLUE_STRING_AVESTAN_BOTTOM + "𐬀 𐬁" + + AF_BLUE_STRING_BAMUM_TOP + "ꚧ ꚨ ꛛ ꛉ ꛁ ꛈ ꛫ ꛯ" + AF_BLUE_STRING_BAMUM_BOTTOM + "ꚭ ꚳ ꚶ ꛬ ꚢ ꚽ ꛯ ꛲" + + AF_BLUE_STRING_BENGALI_BASE + "অ ড ত ন ব ভ ল ক" + AF_BLUE_STRING_BENGALI_TOP + "ই ট ঠ ি ী ৈ ৗ" + AF_BLUE_STRING_BENGALI_HEAD + "ও এ ড ত ন ব ল ক" + + AF_BLUE_STRING_BUHID_TOP + "ᝐ ᝈ" + AF_BLUE_STRING_BUHID_LARGE + "ᝅ ᝊ ᝎ" + AF_BLUE_STRING_BUHID_SMALL + "ᝂ ᝃ ᝉ ᝌ" + AF_BLUE_STRING_BUHID_BOTTOM + "ᝀ ᝃ ᝆ ᝉ ᝋ ᝏ ᝑ" + + AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP + "ᗜ ᖴ ᐁ ᒣ ᑫ ᑎ ᔑ ᗰ" + AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM + "ᗶ ᖵ ᒧ ᐃ ᑌ ᒍ ᔑ ᗢ" + AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP + "ᓓ ᓕ ᓀ ᓂ ᓄ ᕄ ᕆ ᘣ" + AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM + "ᕃ ᓂ ᓀ ᕂ ᓗ ᓚ ᕆ ᘣ" + AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP + "ᐪ ᙆ ᣘ ᐢ ᒾ ᣗ ᔆ" + AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM + "ᙆ ᗮ ᒻ ᐞ ᔆ ᒡ ᒢ ᓑ" + + AF_BLUE_STRING_CARIAN_TOP + "𐊧 𐊫 𐊬 𐊭 𐊱 𐊺 𐊼 𐊿" + AF_BLUE_STRING_CARIAN_BOTTOM + "𐊣 𐊧 𐊷 𐋀 𐊫 𐊸 𐋉" + + AF_BLUE_STRING_CHAKMA_TOP + "𑄃 𑄅 𑄉 𑄙 𑄗" + AF_BLUE_STRING_CHAKMA_BOTTOM + "𑄅 𑄛 𑄝 𑄗 𑄓" + AF_BLUE_STRING_CHAKMA_DESCENDER + "𑄖𑄳𑄢 𑄘𑄳𑄢 𑄙𑄳𑄢 𑄤𑄳𑄢 𑄥𑄳𑄢" + + AF_BLUE_STRING_CHEROKEE_CAPITAL + "Ꮖ Ꮋ Ꭼ Ꮓ Ꭴ Ꮳ Ꭶ Ꮥ" + AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER + "ꮒ ꮤ ꮶ ꭴ ꭾ ꮗ ꮝ ꮿ" + AF_BLUE_STRING_CHEROKEE_SMALL + "ꮖ ꭼ ꮓ ꮠ ꮳ ꭶ ꮥ ꮻ" + AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER + "ᏸ ꮐ ꭹ ꭻ" + + AF_BLUE_STRING_COPTIC_CAPITAL_TOP + "Ⲍ Ⲏ Ⲡ Ⳟ Ⲟ Ⲑ Ⲥ Ⳋ" + AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM + "Ⳑ Ⳙ Ⳟ Ⲏ Ⲟ Ⲑ Ⳝ Ⲱ" + AF_BLUE_STRING_COPTIC_SMALL_TOP + "ⲍ ⲏ ⲡ ⳟ ⲟ ⲑ ⲥ ⳋ" + AF_BLUE_STRING_COPTIC_SMALL_BOTTOM + "ⳑ ⳙ ⳟ ⲏ ⲟ ⲑ ⳝ Ⳓ" + + AF_BLUE_STRING_CYPRIOT_TOP + "𐠍 𐠙 𐠳 𐠱 𐠅 𐠓 𐠣 𐠦" + AF_BLUE_STRING_CYPRIOT_BOTTOM + "𐠃 𐠊 𐠛 𐠣 𐠳 𐠵 𐠐" + AF_BLUE_STRING_CYPRIOT_SMALL + "𐠈 𐠏 𐠖" + + AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP + "Б В Е П З О С Э" + AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM + "Б В Е Ш З О С Э" + AF_BLUE_STRING_CYRILLIC_SMALL + "х п н ш е з о с" + AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER + "р у ф" + + AF_BLUE_STRING_DESERET_CAPITAL_TOP + "𐐂 𐐄 𐐋 𐐗 𐐑" + AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM + "𐐀 𐐂 𐐄 𐐗 𐐛" + AF_BLUE_STRING_DESERET_SMALL_TOP + "𐐪 𐐬 𐐳 𐐿 𐐹" + AF_BLUE_STRING_DESERET_SMALL_BOTTOM + "𐐨 𐐪 𐐬 𐐿 𐑃" + + AF_BLUE_STRING_DEVANAGARI_BASE + "क म अ आ थ ध भ श" + AF_BLUE_STRING_DEVANAGARI_TOP + "ई ऐ ओ औ ि ी ो ौ" + // note that some fonts have extreme variation in the height of the + // round head elements; for this reason we also define the `base' + // blue zone, which must be always present + AF_BLUE_STRING_DEVANAGARI_HEAD + "क म अ आ थ ध भ श" + AF_BLUE_STRING_DEVANAGARI_BOTTOM + "ु ृ" + + AF_BLUE_STRING_ETHIOPIC_TOP + "ሀ ሃ ዘ ፐ ማ በ ዋ ዐ" + AF_BLUE_STRING_ETHIOPIC_BOTTOM + "ለ ሐ በ ዘ ሀ ሪ ዐ ጨ" + + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP + "გ დ ე ვ თ ი ო ღ" + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM + "ა ზ მ ს შ ძ ხ პ" + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER + "ს ხ ქ ზ მ შ ჩ წ" + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER + "ე ვ ჟ ტ უ ფ ქ ყ" + + AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP + "Ⴑ Ⴇ Ⴙ Ⴜ Ⴄ Ⴅ Ⴓ Ⴚ" + AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM + "Ⴄ Ⴅ Ⴇ Ⴈ Ⴆ Ⴑ Ⴊ Ⴋ" + + AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP + "ⴁ ⴗ ⴂ ⴄ ⴅ ⴇ ⴔ ⴖ" + AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM + "ⴈ ⴌ ⴖ ⴎ ⴃ ⴆ ⴋ ⴢ" + AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER + "ⴐ ⴑ ⴓ ⴕ ⴙ ⴛ ⴡ ⴣ" + AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER + "ⴄ ⴅ ⴔ ⴕ ⴁ ⴂ ⴘ ⴝ" + + AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP + "Ნ Ჟ Ჳ Ჸ Გ Ე Ო Ჴ" + AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM + "Ი Ჲ Ო Ჩ Მ Შ Ჯ Ჽ" + + AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP + "Ⰵ Ⱄ Ⱚ Ⰴ Ⰲ Ⰺ Ⱛ Ⰻ" + AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM + "Ⰵ Ⰴ Ⰲ Ⱚ Ⱎ Ⱑ Ⰺ Ⱄ" + AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP + "ⰵ ⱄ ⱚ ⰴ ⰲ ⰺ ⱛ ⰻ" + AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM + "ⰵ ⰴ ⰲ ⱚ ⱎ ⱑ ⰺ ⱄ" + + AF_BLUE_STRING_GOTHIC_TOP + "𐌲 𐌶 𐍀 𐍄 𐌴 𐍃 𐍈 𐌾" + AF_BLUE_STRING_GOTHIC_BOTTOM + "𐌶 𐌴 𐍃 𐍈" + + AF_BLUE_STRING_GREEK_CAPITAL_TOP + "Γ Β Ε Ζ Θ Ο Ω" + AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM + "Β Δ Ζ Ξ Θ Ο" + AF_BLUE_STRING_GREEK_SMALL_BETA_TOP + "β θ δ ζ λ ξ" + AF_BLUE_STRING_GREEK_SMALL + "α ε ι ο π σ τ ω" + AF_BLUE_STRING_GREEK_SMALL_DESCENDER + "β γ η μ ρ φ χ ψ" + + AF_BLUE_STRING_GUJARATI_TOP + "ત ન ઋ ઌ છ ટ ર ૦" + AF_BLUE_STRING_GUJARATI_BOTTOM + "ખ ગ ઘ ઞ ઇ ઈ ઠ જ" + AF_BLUE_STRING_GUJARATI_ASCENDER + "ઈ ઊ િ ી લી શ્ચિ જિ સી" + AF_BLUE_STRING_GUJARATI_DESCENDER + "ુ ૃ ૄ ખુ છૃ છૄ" + AF_BLUE_STRING_GUJARATI_DIGIT_TOP + "૦ ૧ ૨ ૩ ૭" + + AF_BLUE_STRING_GURMUKHI_BASE + "ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ" + AF_BLUE_STRING_GURMUKHI_HEAD + "ਕ ਗ ਙ ਚ ਜ ਤ ਧ ਸ" + AF_BLUE_STRING_GURMUKHI_TOP + "ਇ ਈ ਉ ਏ ਓ ੳ ਿ ੀ" + AF_BLUE_STRING_GURMUKHI_BOTTOM + "ਅ ਏ ਓ ਗ ਜ ਠ ਰ ਸ" + AF_BLUE_STRING_GURMUKHI_DIGIT_TOP + "੦ ੧ ੨ ੩ ੭" + + AF_BLUE_STRING_HEBREW_TOP + "ב ד ה ח ך כ ם ס" + AF_BLUE_STRING_HEBREW_BOTTOM + "ב ט כ ם ס צ" + AF_BLUE_STRING_HEBREW_DESCENDER + "ק ך ן ף ץ" + + AF_BLUE_STRING_KANNADA_TOP + "ಇ ಊ ಐ ಣ ಸಾ ನಾ ದಾ ರಾ" + AF_BLUE_STRING_KANNADA_BOTTOM + "ಅ ಉ ಎ ಲ ೦ ೨ ೬ ೭" + + AF_BLUE_STRING_KAYAH_LI_TOP + "꤅ ꤏ ꤁ ꤋ ꤀ ꤍ" + AF_BLUE_STRING_KAYAH_LI_BOTTOM + "꤈ ꤘ ꤀ ꤍ ꤢ" + AF_BLUE_STRING_KAYAH_LI_ASCENDER + "ꤖ ꤡ" + AF_BLUE_STRING_KAYAH_LI_DESCENDER + "ꤑ ꤜ ꤞ" + AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER + "ꤑ꤬ ꤜ꤭ ꤔ꤬" + + AF_BLUE_STRING_KHMER_TOP + "ខ ទ ន ឧ ឩ ា" + AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP + "ក្ក ក្ខ ក្គ ក្ថ" + AF_BLUE_STRING_KHMER_BOTTOM + "ខ ឃ ច ឋ ប ម យ ឲ" + AF_BLUE_STRING_KHMER_DESCENDER + "ត្រ រៀ ឲ្យ អឿ" + AF_BLUE_STRING_KHMER_LARGE_DESCENDER + "ន្ត្រៃ ង្ខ្យ ក្បៀ ច្រៀ ន្តឿ ល្បឿ" + + AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP + "᧠ ᧡" + AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM + "᧶ ᧹" + + AF_BLUE_STRING_LAO_TOP + "າ ດ ອ ມ ລ ວ ຣ ງ" + AF_BLUE_STRING_LAO_BOTTOM + "າ ອ ບ ຍ ຣ ຮ ວ ຢ" + AF_BLUE_STRING_LAO_ASCENDER + "ປ ຢ ຟ ຝ" + AF_BLUE_STRING_LAO_LARGE_ASCENDER + "ໂ ໄ ໃ" + AF_BLUE_STRING_LAO_DESCENDER + "ງ ຊ ຖ ຽ ໆ ຯ" + + AF_BLUE_STRING_LATIN_CAPITAL_TOP + "T H E Z O C Q S" + AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM + "H E Z L O C U S" + AF_BLUE_STRING_LATIN_SMALL_F_TOP + "f i j k d b h" + AF_BLUE_STRING_LATIN_SMALL_TOP + "u v x z o e s c" + AF_BLUE_STRING_LATIN_SMALL_BOTTOM + "n r x z o e s c" + AF_BLUE_STRING_LATIN_SMALL_DESCENDER + "p q g j y" + + // we assume that both the subscript and superscript ranges + // don't contain oldstyle digits (actually, most fonts probably + // have digits only in those ranges) + AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP + "₀ ₃ ₅ ₇ ₈" + AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM + "₀ ₁ ₂ ₃ ₈" + AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP + "ᵢ ⱼ ₕ ₖ ₗ" + AF_BLUE_STRING_LATIN_SUBS_SMALL + "ₐ ₑ ₒ ₓ ₙ ₛ ᵥ ᵤ ᵣ" + AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER + "ᵦ ᵧ ᵨ ᵩ ₚ" + + AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP + "⁰ ³ ⁵ ⁷ ᵀ ᴴ ᴱ ᴼ" + AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM + "⁰ ¹ ² ³ ᴱ ᴸ ᴼ ᵁ" + AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP + "ᵇ ᵈ ᵏ ʰ ʲ ᶠ ⁱ" + AF_BLUE_STRING_LATIN_SUPS_SMALL + "ᵉ ᵒ ʳ ˢ ˣ ᶜ ᶻ" + AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER + "ᵖ ʸ ᵍ" + + AF_BLUE_STRING_LISU_TOP + "ꓡ ꓧ ꓱ ꓶ ꓩ ꓚ ꓵ ꓳ" + AF_BLUE_STRING_LISU_BOTTOM + "ꓕ ꓜ ꓞ ꓡ ꓛ ꓢ ꓳ ꓴ" + + AF_BLUE_STRING_MALAYALAM_TOP + "ഒ ട ഠ റ ച പ ച്ച പ്പ" + AF_BLUE_STRING_MALAYALAM_BOTTOM + "ട ഠ ധ ശ ഘ ച ഥ ല" + + AF_BLUE_STRING_MYANMAR_TOP + "ခ ဂ င ဒ ဝ ၥ ၊ ။" + AF_BLUE_STRING_MYANMAR_BOTTOM + "င ဎ ဒ ပ ဗ ဝ ၊ ။" + AF_BLUE_STRING_MYANMAR_ASCENDER + "ဩ ြ ၍ ၏ ၆ ါ ိ" + AF_BLUE_STRING_MYANMAR_DESCENDER + "ဉ ည ဥ ဩ ဨ ၂ ၅ ၉" + + AF_BLUE_STRING_NKO_TOP + "ߐ ߉ ߒ ߟ ߖ ߜ ߠ ߥ" + AF_BLUE_STRING_NKO_BOTTOM + "߀ ߘ ߡ ߠ ߥ" + AF_BLUE_STRING_NKO_SMALL_TOP + "ߏ ߛ ߋ" + AF_BLUE_STRING_NKO_SMALL_BOTTOM + "ߎ ߏ ߛ ߋ" + + AF_BLUE_STRING_OL_CHIKI + "ᱛ ᱜ ᱝ ᱡ ᱢ ᱥ" + + AF_BLUE_STRING_OLD_TURKIC_TOP + "𐰗 𐰘 𐰧" + AF_BLUE_STRING_OLD_TURKIC_BOTTOM + "𐰉 𐰗 𐰦 𐰧" + + AF_BLUE_STRING_OSAGE_CAPITAL_TOP + "𐒾 𐓍 𐓒 𐓓 𐒻 𐓂 𐒵 𐓆" + AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM + "𐒰 𐓍 𐓂 𐒿 𐓎 𐒹" + AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER + "𐒼 𐒽 𐒾" + AF_BLUE_STRING_OSAGE_SMALL_TOP + "𐓵 𐓶 𐓺 𐓻 𐓝 𐓣 𐓪 𐓮" + AF_BLUE_STRING_OSAGE_SMALL_BOTTOM + "𐓘 𐓚 𐓣 𐓵 𐓡 𐓧 𐓪 𐓶" + AF_BLUE_STRING_OSAGE_SMALL_ASCENDER + "𐓤 𐓦 𐓸 𐓹 𐓛" + AF_BLUE_STRING_OSAGE_SMALL_DESCENDER + "𐓤 𐓥 𐓦" + + AF_BLUE_STRING_OSMANYA_TOP + "𐒆 𐒉 𐒐 𐒒 𐒘 𐒛 𐒠 𐒣" + AF_BLUE_STRING_OSMANYA_BOTTOM + "𐒀 𐒂 𐒆 𐒈 𐒊 𐒒 𐒠 𐒩" + + AF_BLUE_STRING_SAURASHTRA_TOP + "ꢜ ꢞ ꢳ ꢂ ꢖ ꢒ ꢝ ꢛ" + AF_BLUE_STRING_SAURASHTRA_BOTTOM + "ꢂ ꢨ ꢺ ꢤ ꢎ" + + AF_BLUE_STRING_SHAVIAN_TOP + "𐑕 𐑙" + AF_BLUE_STRING_SHAVIAN_BOTTOM + "𐑔 𐑖 𐑗 𐑹 𐑻" + AF_BLUE_STRING_SHAVIAN_DESCENDER + "𐑟 𐑣" + AF_BLUE_STRING_SHAVIAN_SMALL_TOP + "𐑱 𐑲 𐑳 𐑴 𐑸 𐑺 𐑼" + AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM + "𐑴 𐑻 𐑹" + + AF_BLUE_STRING_SINHALA_TOP + "ඉ ක ඝ ඳ ප ය ල ෆ" + AF_BLUE_STRING_SINHALA_BOTTOM + "එ ඔ ඝ ජ ට ථ ධ ර" + AF_BLUE_STRING_SINHALA_DESCENDER + "ද ඳ උ ල තූ තු බු දු" + + AF_BLUE_STRING_SUNDANESE_TOP + "ᮋ ᮞ ᮮ ᮽ ᮰ ᮈ" + AF_BLUE_STRING_SUNDANESE_BOTTOM + "ᮄ ᮔ ᮕ ᮗ ᮰ ᮆ ᮈ ᮉ" + AF_BLUE_STRING_SUNDANESE_DESCENDER + "ᮼ ᳄" + + AF_BLUE_STRING_TAI_VIET_TOP + "ꪆ ꪔ ꪒ ꪖ ꪫ" + AF_BLUE_STRING_TAI_VIET_BOTTOM + "ꪉ ꪫ ꪮ" + + AF_BLUE_STRING_TAMIL_TOP + "உ ஒ ஓ ற ஈ க ங ச" + AF_BLUE_STRING_TAMIL_BOTTOM + "க ச ல ஶ உ ங ட ப" + + AF_BLUE_STRING_TELUGU_TOP + "ఇ ఌ ఙ ఞ ణ ఱ ౯" + AF_BLUE_STRING_TELUGU_BOTTOM + "అ క చ ర ఽ ౨ ౬" + + AF_BLUE_STRING_THAI_TOP + "บ เ แ อ ก า" + AF_BLUE_STRING_THAI_BOTTOM + "บ ป ษ ฯ อ ย ฮ" + AF_BLUE_STRING_THAI_ASCENDER + "ป ฝ ฟ" + AF_BLUE_STRING_THAI_LARGE_ASCENDER + "โ ใ ไ" + AF_BLUE_STRING_THAI_DESCENDER + "ฎ ฏ ฤ ฦ" + AF_BLUE_STRING_THAI_LARGE_DESCENDER + "ญ ฐ" + AF_BLUE_STRING_THAI_DIGIT_TOP + "๐ ๑ ๓" + + AF_BLUE_STRING_TIFINAGH + "ⵔ ⵙ ⵛ ⵞ ⴵ ⴼ ⴹ ⵎ" + + AF_BLUE_STRING_VAI_TOP + "ꗍ ꘖ ꘙ ꘜ ꖜ ꖝ ꔅ ꕢ" + AF_BLUE_STRING_VAI_BOTTOM + "ꗍ ꘖ ꘙ ꗞ ꔅ ꕢ ꖜ ꔆ" + + +#ifdef AF_CONFIG_OPTION_CJK + + AF_BLUE_STRING_CJK_TOP + "他 们 你 來 們 到 和 地" + " 对 對 就 席 我 时 時 會" + " 来 為 能 舰 說 说 这 這" + " 齊 |" + " 军 同 已 愿 既 星 是 景" + " 民 照 现 現 理 用 置 要" + " 軍 那 配 里 開 雷 露 面" + " 顾" + AF_BLUE_STRING_CJK_BOTTOM + "个 为 人 他 以 们 你 來" + " 個 們 到 和 大 对 對 就" + " 我 时 時 有 来 為 要 說" + " 说 |" + " 主 些 因 它 想 意 理 生" + " 當 看 着 置 者 自 著 裡" + " 过 还 进 進 過 道 還 里" + " 面" + +#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT + + AF_BLUE_STRING_CJK_LEFT + " 些 们 你 來 們 到 和 地" + " 她 将 將 就 年 得 情 最" + " 样 樣 理 能 說 说 这 這" + " 通 |" + " 即 吗 吧 听 呢 品 响 嗎" + " 师 師 收 断 斷 明 眼 間" + " 间 际 陈 限 除 陳 随 際" + " 隨" + AF_BLUE_STRING_CJK_RIGHT + "事 前 學 将 將 情 想 或" + " 政 斯 新 样 樣 民 沒 没" + " 然 特 现 現 球 第 經 谁" + " 起 |" + " 例 別 别 制 动 動 吗 嗎" + " 增 指 明 朝 期 构 物 确" + " 种 調 调 費 费 那 都 間" + " 间" + +#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ + +#endif /* AF_CONFIG_OPTION_CJK */ + + +// The blue zone stringsets, as used in the script styles, cf. `afstyles.h'. +// +// The AF_BLUE_PROPERTY_XXX flags are defined in `afblue.h'; here some +// explanations. +// +// A blue zone in general is defined by a reference and an overshoot line. +// During the hinting process, all coordinate values between those two lines +// are set equal to the reference value, provided that the blue zone is not +// wider than 0.75 pixels (otherwise the blue zone gets ignored). All +// entries must have `AF_BLUE_STRING_MAX' as the final line. +// +// During the glyph analysis, edges are sorted from bottom to top, and then +// sequentially checked, edge by edge, against the blue zones in the order +// given below. +// +// +// latin auto-hinter +// ----------------- +// +// Characters in a blue string are automatically classified as having a flat +// (reference) or a round (overshoot) extremum. The blue zone is then set +// up by the mean values of all flat extrema and all round extrema, +// respectively. Only horizontal blue zones (i.e., adjusting vertical +// coordinate values) are supported. +// +// Some scripts like Khmer need character composition to get all necessary +// blue zones, since Unicode only provides an abstract data model that +// doesn't represent all possible glyph shapes. For such character +// clusters, the HarfBuzz library is used to convert them into the +// corresponding glyphs. The largest glyph element (where `largest' can be +// either `largest ascender' or `largest descender') then defines the +// corresponding flat or round extremum. +// +// For the latin auto-hinter, the overshoot should be larger than the +// reference for top zones, and vice versa for bottom zones. +// +// LATIN_TOP +// Take the maximum flat and round coordinate values of the blue string +// characters for computing the blue zone's reference and overshoot +// values. +// +// If not set, take the minimum values. +// +// Mutually exclusive with `LATIN_SUB_TOP'. +// +// LATIN_SUB_TOP +// For all glyphs of a character cluster, compute the maximum flat +// and round coordinate values of each component, then take the +// smallest of the maximum values. The idea is to get the top of +// subscript glyphs, as used in Khmer, for example. Note that +// this mechanism doesn't work for ordinary ligatures. +// +// This flags indicates a secondary blue zone: It gets removed if +// there is a non-LATIN_SUB_TOP blue zone at the same coordinate +// value (after scaling). +// +// Mutually exclusive with `LATIN_TOP'. +// +// LATIN_NEUTRAL +// Ignore round extrema and define the blue zone with flat values only. +// Both top and bottom of contours can match. This is useful for +// scripts like Devanagari where vowel signs attach to the base +// character and are implemented as components of composite glyphs. +// +// If not set, both round and flat extrema are taken into account. +// Additionally, only the top or the bottom of a contour can match, +// depending on the LATIN_TOP flag. +// +// Neutral blue zones should always follow non-neutral blue zones. +// +// LATIN_X_HEIGHT +// Scale all glyphs vertically from the corresponding script to make the +// reference line of this blue zone align on the grid. The scaling +// takes place before all other blue zones get aligned to the grid. +// Only one blue character string of a script style can have this flag. +// +// LATIN_LONG +// Apply an additional constraint for blue zone values: Don't +// necessarily use the extremum as-is but a segment of the topmost (or +// bottommost) contour that is longer than a heuristic threshold, and +// which is not too far away vertically from the real extremum. This +// ensures that small bumps in the outline are ignored (for example, the +// `vertical serifs' found in many Hebrew glyph designs). +// +// The segment must be at least EM/25 font units long, and the distance +// to the extremum must be smaller than EM/4. +// +// +// cjk auto-hinter +// --------------- +// +// Characters in a blue string are *not* automatically classified. Instead, +// first come the characters used for the overshoot value, then the +// character `|', then the characters used for the reference value +// (everything separated by space characters). The blue zone is then set up +// by the mean values of all reference values and all overshoot values, +// respectively. Both horizontal and vertical blue zones (i.e., adjusting +// vertical and horizontal coordinate values, respectively) are supported. +// +// For the cjk auto-hinter, the overshoot should be smaller than the +// reference for top zones, and vice versa for bottom zones. +// +// CJK_TOP +// Take the maximum flat and round coordinate values of the blue string +// characters. If not set, take the minimum values. +// +// CJK_RIGHT +// A synonym for CJK_TOP. If CJK_HORIZ is set, this flag indicates the +// right blue zone, taking horizontal maximum values. +// +// CJK_HORIZ +// Define a blue zone for horizontal hinting (i.e., vertical blue +// zones). If not set, this is a blue zone for vertical hinting. + + +AF_BLUE_STRINGSET_ENUM AF_BLUE_STRINGSETS_ARRAY AF_BLUE_STRINGSET_MAX_LEN: + + AF_BLUE_STRINGSET_ADLM + { AF_BLUE_STRING_ADLAM_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_ADLAM_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_ADLAM_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_ARAB + { AF_BLUE_STRING_ARABIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_ARABIC_BOTTOM, 0 } + { AF_BLUE_STRING_ARABIC_JOIN, AF_BLUE_PROPERTY_LATIN_NEUTRAL } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_ARMN + { AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_ARMENIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_AVST + { AF_BLUE_STRING_AVESTAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_AVESTAN_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_BAMU + { AF_BLUE_STRING_BAMUM_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_BAMUM_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_BENG + { AF_BLUE_STRING_BENGALI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_BENGALI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_BENGALI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_NEUTRAL | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_BENGALI_BASE, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_BUHD + { AF_BLUE_STRING_BUHID_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_BUHID_LARGE, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_BUHID_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_BUHID_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CAKM + { AF_BLUE_STRING_CHAKMA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CHAKMA_BOTTOM, 0 } + { AF_BLUE_STRING_CHAKMA_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CANS + { AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM, 0 } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CARI + { AF_BLUE_STRING_CARIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CARIAN_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CHER + { AF_BLUE_STRING_CHEROKEE_CAPITAL, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CHEROKEE_CAPITAL, 0 } + { AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CHEROKEE_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_CHEROKEE_SMALL, 0 } + { AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_COPT + { AF_BLUE_STRING_COPTIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_COPTIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_COPTIC_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CPRT + { AF_BLUE_STRING_CYPRIOT_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CYPRIOT_BOTTOM, 0 } + { AF_BLUE_STRING_CYPRIOT_SMALL, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CYPRIOT_SMALL, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_CYRL + { AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_CYRILLIC_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_CYRILLIC_SMALL, 0 } + { AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_DEVA + { AF_BLUE_STRING_DEVANAGARI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_DEVANAGARI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_DEVANAGARI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_NEUTRAL | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_DEVANAGARI_BASE, 0 } + { AF_BLUE_STRING_DEVANAGARI_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_DSRT + { AF_BLUE_STRING_DESERET_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_DESERET_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_DESERET_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_ETHI + { AF_BLUE_STRING_ETHIOPIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_ETHIOPIC_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_GEOR + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM, 0 } + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER, 0 } + { AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_GEOK + { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM, 0 } + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM, 0 } + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_GLAG + { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_GOTH + { AF_BLUE_STRING_GOTHIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GOTHIC_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_GREK + { AF_BLUE_STRING_GREEK_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_GREEK_SMALL_BETA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GREEK_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_GREEK_SMALL, 0 } + { AF_BLUE_STRING_GREEK_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_GUJR + { AF_BLUE_STRING_GUJARATI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_GUJARATI_BOTTOM, 0 } + { AF_BLUE_STRING_GUJARATI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GUJARATI_DESCENDER, 0 } + { AF_BLUE_STRING_GUJARATI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_GURU + { AF_BLUE_STRING_GURMUKHI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GURMUKHI_HEAD, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_GURMUKHI_BASE, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_NEUTRAL | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_GURMUKHI_BOTTOM, 0 } + { AF_BLUE_STRING_GURMUKHI_DIGIT_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_HEBR + { AF_BLUE_STRING_HEBREW_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_LONG } + { AF_BLUE_STRING_HEBREW_BOTTOM, 0 } + { AF_BLUE_STRING_HEBREW_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_KALI + { AF_BLUE_STRING_KAYAH_LI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_KAYAH_LI_BOTTOM, 0 } + { AF_BLUE_STRING_KAYAH_LI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_KAYAH_LI_DESCENDER, 0 } + { AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_KHMR + { AF_BLUE_STRING_KHMER_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP, AF_BLUE_PROPERTY_LATIN_SUB_TOP } + { AF_BLUE_STRING_KHMER_BOTTOM, 0 } + { AF_BLUE_STRING_KHMER_DESCENDER, 0 } + { AF_BLUE_STRING_KHMER_LARGE_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_KHMS + { AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_KNDA + { AF_BLUE_STRING_KANNADA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_KANNADA_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_LAO + { AF_BLUE_STRING_LAO_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_LAO_BOTTOM, 0 } + { AF_BLUE_STRING_LAO_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LAO_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LAO_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_LATN + { AF_BLUE_STRING_LATIN_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_LATIN_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LATIN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_LATIN_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_LATIN_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_LATB + { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LATIN_SUBS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_LATIN_SUBS_SMALL, 0 } + { AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_LATP + { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LATIN_SUPS_SMALL, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_LATIN_SUPS_SMALL, 0 } + { AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_LISU + { AF_BLUE_STRING_LISU_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_LISU_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_MLYM + { AF_BLUE_STRING_MALAYALAM_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MALAYALAM_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_MYMR + { AF_BLUE_STRING_MYANMAR_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_MYANMAR_BOTTOM, 0 } + { AF_BLUE_STRING_MYANMAR_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_MYANMAR_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_NKOO + { AF_BLUE_STRING_NKO_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_NKO_BOTTOM, 0 } + { AF_BLUE_STRING_NKO_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_NKO_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_NONE + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_OLCK + { AF_BLUE_STRING_OL_CHIKI, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_OL_CHIKI, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_ORKH + { AF_BLUE_STRING_OLD_TURKIC_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_OLD_TURKIC_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_OSGE + { AF_BLUE_STRING_OSAGE_CAPITAL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM, 0 } + { AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER, 0 } + { AF_BLUE_STRING_OSAGE_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_OSAGE_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_OSAGE_SMALL_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_OSAGE_SMALL_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_OSMA + { AF_BLUE_STRING_OSMANYA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_OSMANYA_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_SAUR + { AF_BLUE_STRING_SAURASHTRA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_SAURASHTRA_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_SHAW + { AF_BLUE_STRING_SHAVIAN_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_SHAVIAN_BOTTOM, 0 } + { AF_BLUE_STRING_SHAVIAN_DESCENDER, 0 } + { AF_BLUE_STRING_SHAVIAN_SMALL_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_SINH + { AF_BLUE_STRING_SINHALA_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_SINHALA_BOTTOM, 0 } + { AF_BLUE_STRING_SINHALA_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_SUND + { AF_BLUE_STRING_SUNDANESE_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_SUNDANESE_BOTTOM, 0 } + { AF_BLUE_STRING_SUNDANESE_DESCENDER, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_TAML + { AF_BLUE_STRING_TAMIL_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_TAMIL_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_TAVT + { AF_BLUE_STRING_TAI_VIET_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_TAI_VIET_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_TELU + { AF_BLUE_STRING_TELUGU_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_TELUGU_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_TFNG + { AF_BLUE_STRING_TIFINAGH, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_TIFINAGH, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_THAI + { AF_BLUE_STRING_THAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP | + AF_BLUE_PROPERTY_LATIN_X_HEIGHT } + { AF_BLUE_STRING_THAI_BOTTOM, 0 } + { AF_BLUE_STRING_THAI_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_THAI_LARGE_ASCENDER, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_THAI_DESCENDER, 0 } + { AF_BLUE_STRING_THAI_LARGE_DESCENDER, 0 } + { AF_BLUE_STRING_THAI_DIGIT_TOP, 0 } + { AF_BLUE_STRING_MAX, 0 } + + AF_BLUE_STRINGSET_VAII + { AF_BLUE_STRING_VAI_TOP, AF_BLUE_PROPERTY_LATIN_TOP } + { AF_BLUE_STRING_VAI_BOTTOM, 0 } + { AF_BLUE_STRING_MAX, 0 } + +#ifdef AF_CONFIG_OPTION_CJK + + AF_BLUE_STRINGSET_HANI + { AF_BLUE_STRING_CJK_TOP, AF_BLUE_PROPERTY_CJK_TOP } + { AF_BLUE_STRING_CJK_BOTTOM, 0 } +#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT + { AF_BLUE_STRING_CJK_LEFT, AF_BLUE_PROPERTY_CJK_HORIZ } + { AF_BLUE_STRING_CJK_RIGHT, AF_BLUE_PROPERTY_CJK_HORIZ | + AF_BLUE_PROPERTY_CJK_RIGHT } +#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ + { AF_BLUE_STRING_MAX, 0 } + +#endif /* AF_CONFIG_OPTION_CJK */ + + +// END diff --git a/vendor/FreeType2/src/autofit/afblue.h b/vendor/FreeType2/src/autofit/afblue.h new file mode 100644 index 0000000..de31e25 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afblue.h @@ -0,0 +1,414 @@ +/* This file has been generated by the Perl script `afblue.pl', */ +/* using data from file `afblue.dat'. */ + +/***************************************************************************/ +/* */ +/* afblue.h */ +/* */ +/* Auto-fitter data for blue strings (specification). */ +/* */ +/* Copyright 2013-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AFBLUE_H_ +#define AFBLUE_H_ + + +FT_BEGIN_HEADER + + + /* an auxiliary macro to decode a UTF-8 character -- since we only use */ + /* hard-coded, self-converted data, no error checking is performed */ +#define GET_UTF8_CHAR( ch, p ) \ + do \ + { \ + ch = (unsigned char)*p++; \ + if ( ch >= 0x80 ) \ + { \ + FT_UInt len_; \ + \ + \ + if ( ch < 0xE0 ) \ + { \ + len_ = 1; \ + ch &= 0x1F; \ + } \ + else if ( ch < 0xF0 ) \ + { \ + len_ = 2; \ + ch &= 0x0F; \ + } \ + else \ + { \ + len_ = 3; \ + ch &= 0x07; \ + } \ + \ + for ( ; len_ > 0; len_-- ) \ + ch = ( ch << 6 ) | ( *p++ & 0x3F ); \ + } \ + } while ( 0 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** B L U E S T R I N G S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* At the bottommost level, we define strings for finding blue zones. */ + + +#define AF_BLUE_STRING_MAX_LEN 51 + + /* The AF_Blue_String enumeration values are offsets into the */ + /* `af_blue_strings' array. */ + + typedef enum AF_Blue_String_ + { + AF_BLUE_STRING_ADLAM_CAPITAL_TOP = 0, + AF_BLUE_STRING_ADLAM_CAPITAL_BOTTOM = 30, + AF_BLUE_STRING_ADLAM_SMALL_TOP = 40, + AF_BLUE_STRING_ADLAM_SMALL_BOTTOM = 65, + AF_BLUE_STRING_ARABIC_TOP = 105, + AF_BLUE_STRING_ARABIC_BOTTOM = 123, + AF_BLUE_STRING_ARABIC_JOIN = 138, + AF_BLUE_STRING_ARMENIAN_CAPITAL_TOP = 141, + AF_BLUE_STRING_ARMENIAN_CAPITAL_BOTTOM = 165, + AF_BLUE_STRING_ARMENIAN_SMALL_ASCENDER = 189, + AF_BLUE_STRING_ARMENIAN_SMALL_TOP = 210, + AF_BLUE_STRING_ARMENIAN_SMALL_BOTTOM = 234, + AF_BLUE_STRING_ARMENIAN_SMALL_DESCENDER = 258, + AF_BLUE_STRING_AVESTAN_TOP = 282, + AF_BLUE_STRING_AVESTAN_BOTTOM = 302, + AF_BLUE_STRING_BAMUM_TOP = 312, + AF_BLUE_STRING_BAMUM_BOTTOM = 344, + AF_BLUE_STRING_BENGALI_BASE = 376, + AF_BLUE_STRING_BENGALI_TOP = 408, + AF_BLUE_STRING_BENGALI_HEAD = 436, + AF_BLUE_STRING_BUHID_TOP = 468, + AF_BLUE_STRING_BUHID_LARGE = 476, + AF_BLUE_STRING_BUHID_SMALL = 488, + AF_BLUE_STRING_BUHID_BOTTOM = 504, + AF_BLUE_STRING_CANADIAN_SYLLABICS_TOP = 532, + AF_BLUE_STRING_CANADIAN_SYLLABICS_BOTTOM = 564, + AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_TOP = 596, + AF_BLUE_STRING_CANADIAN_SYLLABICS_SMALL_BOTTOM = 628, + AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_TOP = 660, + AF_BLUE_STRING_CANADIAN_SYLLABICS_SUPS_BOTTOM = 688, + AF_BLUE_STRING_CARIAN_TOP = 720, + AF_BLUE_STRING_CARIAN_BOTTOM = 760, + AF_BLUE_STRING_CHAKMA_TOP = 795, + AF_BLUE_STRING_CHAKMA_BOTTOM = 820, + AF_BLUE_STRING_CHAKMA_DESCENDER = 845, + AF_BLUE_STRING_CHEROKEE_CAPITAL = 910, + AF_BLUE_STRING_CHEROKEE_SMALL_ASCENDER = 942, + AF_BLUE_STRING_CHEROKEE_SMALL = 974, + AF_BLUE_STRING_CHEROKEE_SMALL_DESCENDER = 1006, + AF_BLUE_STRING_COPTIC_CAPITAL_TOP = 1022, + AF_BLUE_STRING_COPTIC_CAPITAL_BOTTOM = 1054, + AF_BLUE_STRING_COPTIC_SMALL_TOP = 1086, + AF_BLUE_STRING_COPTIC_SMALL_BOTTOM = 1118, + AF_BLUE_STRING_CYPRIOT_TOP = 1150, + AF_BLUE_STRING_CYPRIOT_BOTTOM = 1190, + AF_BLUE_STRING_CYPRIOT_SMALL = 1225, + AF_BLUE_STRING_CYRILLIC_CAPITAL_TOP = 1240, + AF_BLUE_STRING_CYRILLIC_CAPITAL_BOTTOM = 1264, + AF_BLUE_STRING_CYRILLIC_SMALL = 1288, + AF_BLUE_STRING_CYRILLIC_SMALL_DESCENDER = 1312, + AF_BLUE_STRING_DESERET_CAPITAL_TOP = 1321, + AF_BLUE_STRING_DESERET_CAPITAL_BOTTOM = 1346, + AF_BLUE_STRING_DESERET_SMALL_TOP = 1371, + AF_BLUE_STRING_DESERET_SMALL_BOTTOM = 1396, + AF_BLUE_STRING_DEVANAGARI_BASE = 1421, + AF_BLUE_STRING_DEVANAGARI_TOP = 1453, + AF_BLUE_STRING_DEVANAGARI_HEAD = 1485, + AF_BLUE_STRING_DEVANAGARI_BOTTOM = 1517, + AF_BLUE_STRING_ETHIOPIC_TOP = 1525, + AF_BLUE_STRING_ETHIOPIC_BOTTOM = 1557, + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_TOP = 1589, + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_BOTTOM = 1621, + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_ASCENDER = 1653, + AF_BLUE_STRING_GEORGIAN_MKHEDRULI_DESCENDER = 1685, + AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_TOP = 1717, + AF_BLUE_STRING_GEORGIAN_ASOMTAVRULI_BOTTOM = 1749, + AF_BLUE_STRING_GEORGIAN_NUSKHURI_TOP = 1781, + AF_BLUE_STRING_GEORGIAN_NUSKHURI_BOTTOM = 1813, + AF_BLUE_STRING_GEORGIAN_NUSKHURI_ASCENDER = 1845, + AF_BLUE_STRING_GEORGIAN_NUSKHURI_DESCENDER = 1877, + AF_BLUE_STRING_GEORGIAN_MTAVRULI_TOP = 1909, + AF_BLUE_STRING_GEORGIAN_MTAVRULI_BOTTOM = 1941, + AF_BLUE_STRING_GLAGOLITIC_CAPITAL_TOP = 1973, + AF_BLUE_STRING_GLAGOLITIC_CAPITAL_BOTTOM = 2005, + AF_BLUE_STRING_GLAGOLITIC_SMALL_TOP = 2037, + AF_BLUE_STRING_GLAGOLITIC_SMALL_BOTTOM = 2069, + AF_BLUE_STRING_GOTHIC_TOP = 2101, + AF_BLUE_STRING_GOTHIC_BOTTOM = 2141, + AF_BLUE_STRING_GREEK_CAPITAL_TOP = 2161, + AF_BLUE_STRING_GREEK_CAPITAL_BOTTOM = 2182, + AF_BLUE_STRING_GREEK_SMALL_BETA_TOP = 2200, + AF_BLUE_STRING_GREEK_SMALL = 2218, + AF_BLUE_STRING_GREEK_SMALL_DESCENDER = 2242, + AF_BLUE_STRING_GUJARATI_TOP = 2266, + AF_BLUE_STRING_GUJARATI_BOTTOM = 2298, + AF_BLUE_STRING_GUJARATI_ASCENDER = 2330, + AF_BLUE_STRING_GUJARATI_DESCENDER = 2380, + AF_BLUE_STRING_GUJARATI_DIGIT_TOP = 2413, + AF_BLUE_STRING_GURMUKHI_BASE = 2433, + AF_BLUE_STRING_GURMUKHI_HEAD = 2465, + AF_BLUE_STRING_GURMUKHI_TOP = 2497, + AF_BLUE_STRING_GURMUKHI_BOTTOM = 2529, + AF_BLUE_STRING_GURMUKHI_DIGIT_TOP = 2561, + AF_BLUE_STRING_HEBREW_TOP = 2581, + AF_BLUE_STRING_HEBREW_BOTTOM = 2605, + AF_BLUE_STRING_HEBREW_DESCENDER = 2623, + AF_BLUE_STRING_KANNADA_TOP = 2638, + AF_BLUE_STRING_KANNADA_BOTTOM = 2682, + AF_BLUE_STRING_KAYAH_LI_TOP = 2714, + AF_BLUE_STRING_KAYAH_LI_BOTTOM = 2738, + AF_BLUE_STRING_KAYAH_LI_ASCENDER = 2758, + AF_BLUE_STRING_KAYAH_LI_DESCENDER = 2766, + AF_BLUE_STRING_KAYAH_LI_LARGE_DESCENDER = 2778, + AF_BLUE_STRING_KHMER_TOP = 2799, + AF_BLUE_STRING_KHMER_SUBSCRIPT_TOP = 2823, + AF_BLUE_STRING_KHMER_BOTTOM = 2863, + AF_BLUE_STRING_KHMER_DESCENDER = 2895, + AF_BLUE_STRING_KHMER_LARGE_DESCENDER = 2929, + AF_BLUE_STRING_KHMER_SYMBOLS_WAXING_TOP = 3016, + AF_BLUE_STRING_KHMER_SYMBOLS_WANING_BOTTOM = 3024, + AF_BLUE_STRING_LAO_TOP = 3032, + AF_BLUE_STRING_LAO_BOTTOM = 3064, + AF_BLUE_STRING_LAO_ASCENDER = 3096, + AF_BLUE_STRING_LAO_LARGE_ASCENDER = 3112, + AF_BLUE_STRING_LAO_DESCENDER = 3124, + AF_BLUE_STRING_LATIN_CAPITAL_TOP = 3148, + AF_BLUE_STRING_LATIN_CAPITAL_BOTTOM = 3164, + AF_BLUE_STRING_LATIN_SMALL_F_TOP = 3180, + AF_BLUE_STRING_LATIN_SMALL_TOP = 3194, + AF_BLUE_STRING_LATIN_SMALL_BOTTOM = 3210, + AF_BLUE_STRING_LATIN_SMALL_DESCENDER = 3226, + AF_BLUE_STRING_LATIN_SUBS_CAPITAL_TOP = 3236, + AF_BLUE_STRING_LATIN_SUBS_CAPITAL_BOTTOM = 3256, + AF_BLUE_STRING_LATIN_SUBS_SMALL_F_TOP = 3276, + AF_BLUE_STRING_LATIN_SUBS_SMALL = 3296, + AF_BLUE_STRING_LATIN_SUBS_SMALL_DESCENDER = 3332, + AF_BLUE_STRING_LATIN_SUPS_CAPITAL_TOP = 3352, + AF_BLUE_STRING_LATIN_SUPS_CAPITAL_BOTTOM = 3383, + AF_BLUE_STRING_LATIN_SUPS_SMALL_F_TOP = 3412, + AF_BLUE_STRING_LATIN_SUPS_SMALL = 3438, + AF_BLUE_STRING_LATIN_SUPS_SMALL_DESCENDER = 3463, + AF_BLUE_STRING_LISU_TOP = 3474, + AF_BLUE_STRING_LISU_BOTTOM = 3506, + AF_BLUE_STRING_MALAYALAM_TOP = 3538, + AF_BLUE_STRING_MALAYALAM_BOTTOM = 3582, + AF_BLUE_STRING_MYANMAR_TOP = 3614, + AF_BLUE_STRING_MYANMAR_BOTTOM = 3646, + AF_BLUE_STRING_MYANMAR_ASCENDER = 3678, + AF_BLUE_STRING_MYANMAR_DESCENDER = 3706, + AF_BLUE_STRING_NKO_TOP = 3738, + AF_BLUE_STRING_NKO_BOTTOM = 3762, + AF_BLUE_STRING_NKO_SMALL_TOP = 3777, + AF_BLUE_STRING_NKO_SMALL_BOTTOM = 3786, + AF_BLUE_STRING_OL_CHIKI = 3798, + AF_BLUE_STRING_OLD_TURKIC_TOP = 3822, + AF_BLUE_STRING_OLD_TURKIC_BOTTOM = 3837, + AF_BLUE_STRING_OSAGE_CAPITAL_TOP = 3857, + AF_BLUE_STRING_OSAGE_CAPITAL_BOTTOM = 3897, + AF_BLUE_STRING_OSAGE_CAPITAL_DESCENDER = 3927, + AF_BLUE_STRING_OSAGE_SMALL_TOP = 3942, + AF_BLUE_STRING_OSAGE_SMALL_BOTTOM = 3982, + AF_BLUE_STRING_OSAGE_SMALL_ASCENDER = 4022, + AF_BLUE_STRING_OSAGE_SMALL_DESCENDER = 4047, + AF_BLUE_STRING_OSMANYA_TOP = 4062, + AF_BLUE_STRING_OSMANYA_BOTTOM = 4102, + AF_BLUE_STRING_SAURASHTRA_TOP = 4142, + AF_BLUE_STRING_SAURASHTRA_BOTTOM = 4174, + AF_BLUE_STRING_SHAVIAN_TOP = 4194, + AF_BLUE_STRING_SHAVIAN_BOTTOM = 4204, + AF_BLUE_STRING_SHAVIAN_DESCENDER = 4229, + AF_BLUE_STRING_SHAVIAN_SMALL_TOP = 4239, + AF_BLUE_STRING_SHAVIAN_SMALL_BOTTOM = 4274, + AF_BLUE_STRING_SINHALA_TOP = 4289, + AF_BLUE_STRING_SINHALA_BOTTOM = 4321, + AF_BLUE_STRING_SINHALA_DESCENDER = 4353, + AF_BLUE_STRING_SUNDANESE_TOP = 4397, + AF_BLUE_STRING_SUNDANESE_BOTTOM = 4421, + AF_BLUE_STRING_SUNDANESE_DESCENDER = 4453, + AF_BLUE_STRING_TAI_VIET_TOP = 4461, + AF_BLUE_STRING_TAI_VIET_BOTTOM = 4481, + AF_BLUE_STRING_TAMIL_TOP = 4493, + AF_BLUE_STRING_TAMIL_BOTTOM = 4525, + AF_BLUE_STRING_TELUGU_TOP = 4557, + AF_BLUE_STRING_TELUGU_BOTTOM = 4585, + AF_BLUE_STRING_THAI_TOP = 4613, + AF_BLUE_STRING_THAI_BOTTOM = 4637, + AF_BLUE_STRING_THAI_ASCENDER = 4665, + AF_BLUE_STRING_THAI_LARGE_ASCENDER = 4677, + AF_BLUE_STRING_THAI_DESCENDER = 4689, + AF_BLUE_STRING_THAI_LARGE_DESCENDER = 4705, + AF_BLUE_STRING_THAI_DIGIT_TOP = 4713, + AF_BLUE_STRING_TIFINAGH = 4725, + AF_BLUE_STRING_VAI_TOP = 4757, + AF_BLUE_STRING_VAI_BOTTOM = 4789, + af_blue_1_1 = 4820, +#ifdef AF_CONFIG_OPTION_CJK + AF_BLUE_STRING_CJK_TOP = af_blue_1_1 + 1, + AF_BLUE_STRING_CJK_BOTTOM = af_blue_1_1 + 203, + af_blue_1_1_1 = af_blue_1_1 + 404, +#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT + AF_BLUE_STRING_CJK_LEFT = af_blue_1_1_1 + 1, + AF_BLUE_STRING_CJK_RIGHT = af_blue_1_1_1 + 204, + af_blue_1_1_2 = af_blue_1_1_1 + 405, +#else + af_blue_1_1_2 = af_blue_1_1_1 + 0, +#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ + af_blue_1_2 = af_blue_1_1_2 + 0, +#else + af_blue_1_2 = af_blue_1_1 + 0, +#endif /* AF_CONFIG_OPTION_CJK */ + + + AF_BLUE_STRING_MAX /* do not remove */ + + } AF_Blue_String; + + + FT_LOCAL_ARRAY( char ) + af_blue_strings[]; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** B L U E S T R I N G S E T S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* The next level is to group blue strings into style-specific sets. */ + + + /* Properties are specific to a writing system. We assume that a given */ + /* blue string can't be used in more than a single writing system, which */ + /* is a safe bet. */ +#define AF_BLUE_PROPERTY_LATIN_TOP ( 1U << 0 ) /* must have value 1 */ +#define AF_BLUE_PROPERTY_LATIN_SUB_TOP ( 1U << 1 ) +#define AF_BLUE_PROPERTY_LATIN_NEUTRAL ( 1U << 2 ) +#define AF_BLUE_PROPERTY_LATIN_X_HEIGHT ( 1U << 3 ) +#define AF_BLUE_PROPERTY_LATIN_LONG ( 1U << 4 ) + +#define AF_BLUE_PROPERTY_CJK_TOP ( 1U << 0 ) /* must have value 1 */ +#define AF_BLUE_PROPERTY_CJK_HORIZ ( 1U << 1 ) /* must have value 2 */ +#define AF_BLUE_PROPERTY_CJK_RIGHT AF_BLUE_PROPERTY_CJK_TOP + + +#define AF_BLUE_STRINGSET_MAX_LEN 8 + + /* The AF_Blue_Stringset enumeration values are offsets into the */ + /* `af_blue_stringsets' array. */ + + typedef enum AF_Blue_Stringset_ + { + AF_BLUE_STRINGSET_ADLM = 0, + AF_BLUE_STRINGSET_ARAB = 5, + AF_BLUE_STRINGSET_ARMN = 9, + AF_BLUE_STRINGSET_AVST = 16, + AF_BLUE_STRINGSET_BAMU = 19, + AF_BLUE_STRINGSET_BENG = 22, + AF_BLUE_STRINGSET_BUHD = 27, + AF_BLUE_STRINGSET_CAKM = 32, + AF_BLUE_STRINGSET_CANS = 36, + AF_BLUE_STRINGSET_CARI = 43, + AF_BLUE_STRINGSET_CHER = 46, + AF_BLUE_STRINGSET_COPT = 53, + AF_BLUE_STRINGSET_CPRT = 58, + AF_BLUE_STRINGSET_CYRL = 63, + AF_BLUE_STRINGSET_DEVA = 69, + AF_BLUE_STRINGSET_DSRT = 75, + AF_BLUE_STRINGSET_ETHI = 80, + AF_BLUE_STRINGSET_GEOR = 83, + AF_BLUE_STRINGSET_GEOK = 90, + AF_BLUE_STRINGSET_GLAG = 97, + AF_BLUE_STRINGSET_GOTH = 102, + AF_BLUE_STRINGSET_GREK = 105, + AF_BLUE_STRINGSET_GUJR = 112, + AF_BLUE_STRINGSET_GURU = 118, + AF_BLUE_STRINGSET_HEBR = 124, + AF_BLUE_STRINGSET_KALI = 128, + AF_BLUE_STRINGSET_KHMR = 134, + AF_BLUE_STRINGSET_KHMS = 140, + AF_BLUE_STRINGSET_KNDA = 143, + AF_BLUE_STRINGSET_LAO = 146, + AF_BLUE_STRINGSET_LATN = 152, + AF_BLUE_STRINGSET_LATB = 159, + AF_BLUE_STRINGSET_LATP = 166, + AF_BLUE_STRINGSET_LISU = 173, + AF_BLUE_STRINGSET_MLYM = 176, + AF_BLUE_STRINGSET_MYMR = 179, + AF_BLUE_STRINGSET_NKOO = 184, + AF_BLUE_STRINGSET_NONE = 189, + AF_BLUE_STRINGSET_OLCK = 190, + AF_BLUE_STRINGSET_ORKH = 193, + AF_BLUE_STRINGSET_OSGE = 196, + AF_BLUE_STRINGSET_OSMA = 204, + AF_BLUE_STRINGSET_SAUR = 207, + AF_BLUE_STRINGSET_SHAW = 210, + AF_BLUE_STRINGSET_SINH = 216, + AF_BLUE_STRINGSET_SUND = 220, + AF_BLUE_STRINGSET_TAML = 224, + AF_BLUE_STRINGSET_TAVT = 227, + AF_BLUE_STRINGSET_TELU = 230, + AF_BLUE_STRINGSET_TFNG = 233, + AF_BLUE_STRINGSET_THAI = 236, + AF_BLUE_STRINGSET_VAII = 244, + af_blue_2_1 = 247, +#ifdef AF_CONFIG_OPTION_CJK + AF_BLUE_STRINGSET_HANI = af_blue_2_1 + 0, + af_blue_2_1_1 = af_blue_2_1 + 2, +#ifdef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT + af_blue_2_1_2 = af_blue_2_1_1 + 2, +#else + af_blue_2_1_2 = af_blue_2_1_1 + 0, +#endif /* AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT */ + af_blue_2_2 = af_blue_2_1_2 + 1, +#else + af_blue_2_2 = af_blue_2_1 + 0, +#endif /* AF_CONFIG_OPTION_CJK */ + + + AF_BLUE_STRINGSET_MAX /* do not remove */ + + } AF_Blue_Stringset; + + + typedef struct AF_Blue_StringRec_ + { + AF_Blue_String string; + FT_UShort properties; + + } AF_Blue_StringRec; + + + FT_LOCAL_ARRAY( AF_Blue_StringRec ) + af_blue_stringsets[]; + +/* */ + +FT_END_HEADER + + +#endif /* AFBLUE_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afblue.hin b/vendor/FreeType2/src/autofit/afblue.hin new file mode 100644 index 0000000..682147c --- /dev/null +++ b/vendor/FreeType2/src/autofit/afblue.hin @@ -0,0 +1,146 @@ +/***************************************************************************/ +/* */ +/* afblue.h */ +/* */ +/* Auto-fitter data for blue strings (specification). */ +/* */ +/* Copyright 2013-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AFBLUE_H_ +#define AFBLUE_H_ + + +FT_BEGIN_HEADER + + + /* an auxiliary macro to decode a UTF-8 character -- since we only use */ + /* hard-coded, self-converted data, no error checking is performed */ +#define GET_UTF8_CHAR( ch, p ) \ + do \ + { \ + ch = (unsigned char)*p++; \ + if ( ch >= 0x80 ) \ + { \ + FT_UInt len_; \ + \ + \ + if ( ch < 0xE0 ) \ + { \ + len_ = 1; \ + ch &= 0x1F; \ + } \ + else if ( ch < 0xF0 ) \ + { \ + len_ = 2; \ + ch &= 0x0F; \ + } \ + else \ + { \ + len_ = 3; \ + ch &= 0x07; \ + } \ + \ + for ( ; len_ > 0; len_-- ) \ + ch = ( ch << 6 ) | ( *p++ & 0x3F ); \ + } \ + } while ( 0 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** B L U E S T R I N G S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* At the bottommost level, we define strings for finding blue zones. */ + + +#define AF_BLUE_STRING_MAX_LEN @AF_BLUE_STRING_MAX_LEN@ + + /* The AF_Blue_String enumeration values are offsets into the */ + /* `af_blue_strings' array. */ + + typedef enum AF_Blue_String_ + { +@AF_BLUE_STRING_ENUM@ + + AF_BLUE_STRING_MAX /* do not remove */ + + } AF_Blue_String; + + + FT_LOCAL_ARRAY( char ) + af_blue_strings[]; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** B L U E S T R I N G S E T S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* The next level is to group blue strings into style-specific sets. */ + + + /* Properties are specific to a writing system. We assume that a given */ + /* blue string can't be used in more than a single writing system, which */ + /* is a safe bet. */ +#define AF_BLUE_PROPERTY_LATIN_TOP ( 1U << 0 ) /* must have value 1 */ +#define AF_BLUE_PROPERTY_LATIN_SUB_TOP ( 1U << 1 ) +#define AF_BLUE_PROPERTY_LATIN_NEUTRAL ( 1U << 2 ) +#define AF_BLUE_PROPERTY_LATIN_X_HEIGHT ( 1U << 3 ) +#define AF_BLUE_PROPERTY_LATIN_LONG ( 1U << 4 ) + +#define AF_BLUE_PROPERTY_CJK_TOP ( 1U << 0 ) /* must have value 1 */ +#define AF_BLUE_PROPERTY_CJK_HORIZ ( 1U << 1 ) /* must have value 2 */ +#define AF_BLUE_PROPERTY_CJK_RIGHT AF_BLUE_PROPERTY_CJK_TOP + + +#define AF_BLUE_STRINGSET_MAX_LEN @AF_BLUE_STRINGSET_MAX_LEN@ + + /* The AF_Blue_Stringset enumeration values are offsets into the */ + /* `af_blue_stringsets' array. */ + + typedef enum AF_Blue_Stringset_ + { +@AF_BLUE_STRINGSET_ENUM@ + + AF_BLUE_STRINGSET_MAX /* do not remove */ + + } AF_Blue_Stringset; + + + typedef struct AF_Blue_StringRec_ + { + AF_Blue_String string; + FT_UShort properties; + + } AF_Blue_StringRec; + + + FT_LOCAL_ARRAY( AF_Blue_StringRec ) + af_blue_stringsets[]; + +/* */ + +FT_END_HEADER + + +#endif /* AFBLUE_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afcjk.c b/vendor/FreeType2/src/autofit/afcjk.c new file mode 100644 index 0000000..21b6bff --- /dev/null +++ b/vendor/FreeType2/src/autofit/afcjk.c @@ -0,0 +1,2381 @@ +/***************************************************************************/ +/* */ +/* afcjk.c */ +/* */ +/* Auto-fitter hinting routines for CJK writing system (body). */ +/* */ +/* Copyright 2006-2018 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. */ +/* */ +/***************************************************************************/ + + /* + * The algorithm is based on akito's autohint patch, archived at + * + * https://web.archive.org/web/20051219160454/http://www.kde.gr.jp:80/~akito/patch/freetype2/2.1.7/ + * + */ + +#include +#include FT_ADVANCES_H +#include FT_INTERNAL_DEBUG_H + +#include "afglobal.h" +#include "afpic.h" +#include "aflatin.h" +#include "afcjk.h" + + +#ifdef AF_CONFIG_OPTION_CJK + +#undef AF_CONFIG_OPTION_CJK_BLUE_HANI_VERT + +#include "aferrors.h" + + +#ifdef AF_CONFIG_OPTION_USE_WARPER +#include "afwarp.h" +#endif + + + /*************************************************************************/ + /* */ + /* 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_afcjk + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Basically the Latin version with AF_CJKMetrics */ + /* to replace AF_LatinMetrics. */ + + FT_LOCAL_DEF( void ) + af_cjk_metrics_init_widths( AF_CJKMetrics metrics, + FT_Face face ) + { + /* scan the array of segments in each direction */ + AF_GlyphHintsRec hints[1]; + + + FT_TRACE5(( "\n" + "cjk standard widths computation (style `%s')\n" + "===================================================\n" + "\n", + af_style_names[metrics->root.style_class->style] )); + + af_glyph_hints_init( hints, face->memory ); + + metrics->axis[AF_DIMENSION_HORZ].width_count = 0; + metrics->axis[AF_DIMENSION_VERT].width_count = 0; + + { + FT_Error error; + FT_ULong glyph_index; + int dim; + AF_CJKMetricsRec dummy[1]; + AF_Scaler scaler = &dummy->root.scaler; + +#ifdef FT_CONFIG_OPTION_PIC + AF_FaceGlobals globals = metrics->root.globals; +#endif + + AF_StyleClass style_class = metrics->root.style_class; + AF_ScriptClass script_class = AF_SCRIPT_CLASSES_GET + [style_class->script]; + + void* shaper_buf; + const char* p; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_ULong ch = 0; +#endif + + p = script_class->standard_charstring; + shaper_buf = af_shaper_buf_create( face ); + + /* We check a list of standard characters. The first match wins. */ + + glyph_index = 0; + while ( *p ) + { + unsigned int num_idx; + +#ifdef FT_DEBUG_LEVEL_TRACE + const char* p_old; +#endif + + + while ( *p == ' ' ) + p++; + +#ifdef FT_DEBUG_LEVEL_TRACE + p_old = p; + GET_UTF8_CHAR( ch, p_old ); +#endif + + /* reject input that maps to more than a single glyph */ + p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); + if ( num_idx > 1 ) + continue; + + /* otherwise exit loop if we have a result */ + glyph_index = af_shaper_get_elem( &metrics->root, + shaper_buf, + 0, + NULL, + NULL ); + if ( glyph_index ) + break; + } + + af_shaper_buf_destroy( face, shaper_buf ); + + if ( !glyph_index ) + goto Exit; + + if ( !glyph_index ) + goto Exit; + + FT_TRACE5(( "standard character: U+%04lX (glyph index %d)\n", + ch, glyph_index )); + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || face->glyph->outline.n_points <= 0 ) + goto Exit; + + FT_ZERO( dummy ); + + dummy->units_per_em = metrics->units_per_em; + + scaler->x_scale = 0x10000L; + scaler->y_scale = 0x10000L; + scaler->x_delta = 0; + scaler->y_delta = 0; + + scaler->face = face; + scaler->render_mode = FT_RENDER_MODE_NORMAL; + scaler->flags = 0; + + af_glyph_hints_rescale( hints, (AF_StyleMetrics)dummy ); + + error = af_glyph_hints_reload( hints, &face->glyph->outline ); + if ( error ) + goto Exit; + + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_CJKAxis axis = &metrics->axis[dim]; + AF_AxisHints axhints = &hints->axis[dim]; + AF_Segment seg, limit, link; + FT_UInt num_widths = 0; + + + error = af_latin_hints_compute_segments( hints, + (AF_Dimension)dim ); + if ( error ) + goto Exit; + + /* + * We assume that the glyphs selected for the stem width + * computation are `featureless' enough so that the linking + * algorithm works fine without adjustments of its scoring + * function. + */ + af_latin_hints_link_segments( hints, + 0, + NULL, + (AF_Dimension)dim ); + + seg = axhints->segments; + limit = seg + axhints->num_segments; + + for ( ; seg < limit; seg++ ) + { + link = seg->link; + + /* we only consider stem segments there! */ + if ( link && link->link == seg && link > seg ) + { + FT_Pos dist; + + + dist = seg->pos - link->pos; + if ( dist < 0 ) + dist = -dist; + + if ( num_widths < AF_CJK_MAX_WIDTHS ) + axis->widths[num_widths++].org = dist; + } + } + + /* this also replaces multiple almost identical stem widths */ + /* with a single one (the value 100 is heuristic) */ + af_sort_and_quantize_widths( &num_widths, axis->widths, + dummy->units_per_em / 100 ); + axis->width_count = num_widths; + } + + Exit: + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_CJKAxis axis = &metrics->axis[dim]; + FT_Pos stdw; + + + stdw = ( axis->width_count > 0 ) ? axis->widths[0].org + : AF_LATIN_CONSTANT( metrics, 50 ); + + /* let's try 20% of the smallest width */ + axis->edge_distance_threshold = stdw / 5; + axis->standard_width = stdw; + axis->extra_light = 0; + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_UInt i; + + + FT_TRACE5(( "%s widths:\n", + dim == AF_DIMENSION_VERT ? "horizontal" + : "vertical" )); + + FT_TRACE5(( " %d (standard)", axis->standard_width )); + for ( i = 1; i < axis->width_count; i++ ) + FT_TRACE5(( " %d", axis->widths[i].org )); + + FT_TRACE5(( "\n" )); + } +#endif + } + } + + FT_TRACE5(( "\n" )); + + af_glyph_hints_done( hints ); + } + + + /* Find all blue zones. */ + + static void + af_cjk_metrics_init_blues( AF_CJKMetrics metrics, + FT_Face face ) + { + FT_Pos fills[AF_BLUE_STRING_MAX_LEN]; + FT_Pos flats[AF_BLUE_STRING_MAX_LEN]; + + FT_UInt num_fills; + FT_UInt num_flats; + + FT_Bool fill; + + AF_CJKBlue blue; + FT_Error error; + AF_CJKAxis axis; + FT_Outline outline; + + AF_StyleClass sc = metrics->root.style_class; + + AF_Blue_Stringset bss = sc->blue_stringset; + const AF_Blue_StringRec* bs = &af_blue_stringsets[bss]; + + void* shaper_buf; + + + /* we walk over the blue character strings as specified in the */ + /* style's entry in the `af_blue_stringset' array, computing its */ + /* extremum points (depending on the string properties) */ + + FT_TRACE5(( "cjk blue zones computation\n" + "==========================\n" + "\n" )); + + shaper_buf = af_shaper_buf_create( face ); + + for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ ) + { + const char* p = &af_blue_strings[bs->string]; + FT_Pos* blue_ref; + FT_Pos* blue_shoot; + + + if ( AF_CJK_IS_HORIZ_BLUE( bs ) ) + axis = &metrics->axis[AF_DIMENSION_HORZ]; + else + axis = &metrics->axis[AF_DIMENSION_VERT]; + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_String* cjk_blue_name[4] = + { + (FT_String*)"bottom", /* -- , -- */ + (FT_String*)"top", /* -- , TOP */ + (FT_String*)"left", /* HORIZ, -- */ + (FT_String*)"right" /* HORIZ, TOP */ + }; + + + FT_TRACE5(( "blue zone %d (%s):\n", + axis->blue_count, + cjk_blue_name[AF_CJK_IS_HORIZ_BLUE( bs ) | + AF_CJK_IS_TOP_BLUE( bs ) ] )); + } +#endif /* FT_DEBUG_LEVEL_TRACE */ + + num_fills = 0; + num_flats = 0; + + fill = 1; /* start with characters that define fill values */ + FT_TRACE5(( " [overshoot values]\n" )); + + while ( *p ) + { + FT_ULong glyph_index; + FT_Pos best_pos; /* same as points.y or points.x, resp. */ + FT_Int best_point; + FT_Vector* points; + + unsigned int num_idx; + +#ifdef FT_DEBUG_LEVEL_TRACE + const char* p_old; + FT_ULong ch; +#endif + + + while ( *p == ' ' ) + p++; + +#ifdef FT_DEBUG_LEVEL_TRACE + p_old = p; + GET_UTF8_CHAR( ch, p_old ); +#endif + + /* switch to characters that define flat values */ + if ( *p == '|' ) + { + fill = 0; + FT_TRACE5(( " [reference values]\n" )); + p++; + continue; + } + + /* reject input that maps to more than a single glyph */ + p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); + if ( num_idx > 1 ) + continue; + + /* load the character in the face -- skip unknown or empty ones */ + glyph_index = af_shaper_get_elem( &metrics->root, + shaper_buf, + 0, + NULL, + NULL ); + if ( glyph_index == 0 ) + { + FT_TRACE5(( " U+%04lX unavailable\n", ch )); + continue; + } + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + outline = face->glyph->outline; + if ( error || outline.n_points <= 2 ) + { + FT_TRACE5(( " U+%04lX contains no (usable) outlines\n", ch )); + continue; + } + + /* now compute min or max point indices and coordinates */ + points = outline.points; + best_point = -1; + best_pos = 0; /* make compiler happy */ + + { + FT_Int nn; + FT_Int first = 0; + FT_Int last = -1; + + + for ( nn = 0; nn < outline.n_contours; first = last + 1, nn++ ) + { + FT_Int pp; + + + last = outline.contours[nn]; + + /* Avoid single-point contours since they are never rasterized. */ + /* In some fonts, they correspond to mark attachment points */ + /* which are way outside of the glyph's real outline. */ + if ( last <= first ) + continue; + + if ( AF_CJK_IS_HORIZ_BLUE( bs ) ) + { + if ( AF_CJK_IS_RIGHT_BLUE( bs ) ) + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].x > best_pos ) + { + best_point = pp; + best_pos = points[pp].x; + } + } + else + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].x < best_pos ) + { + best_point = pp; + best_pos = points[pp].x; + } + } + } + else + { + if ( AF_CJK_IS_TOP_BLUE( bs ) ) + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y > best_pos ) + { + best_point = pp; + best_pos = points[pp].y; + } + } + else + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y < best_pos ) + { + best_point = pp; + best_pos = points[pp].y; + } + } + } + } + + FT_TRACE5(( " U+%04lX: best_pos = %5ld\n", ch, best_pos )); + } + + if ( fill ) + fills[num_fills++] = best_pos; + else + flats[num_flats++] = best_pos; + + } /* end while loop */ + + if ( num_flats == 0 && num_fills == 0 ) + { + /* + * we couldn't find a single glyph to compute this blue zone, + * we will simply ignore it then + */ + FT_TRACE5(( " empty\n" )); + continue; + } + + /* we have computed the contents of the `fill' and `flats' tables, */ + /* now determine the reference and overshoot position of the blue -- */ + /* we simply take the median value after a simple sort */ + af_sort_pos( num_fills, fills ); + af_sort_pos( num_flats, flats ); + + blue = &axis->blues[axis->blue_count]; + blue_ref = &blue->ref.org; + blue_shoot = &blue->shoot.org; + + axis->blue_count++; + + if ( num_flats == 0 ) + { + *blue_ref = + *blue_shoot = fills[num_fills / 2]; + } + else if ( num_fills == 0 ) + { + *blue_ref = + *blue_shoot = flats[num_flats / 2]; + } + else + { + *blue_ref = fills[num_fills / 2]; + *blue_shoot = flats[num_flats / 2]; + } + + /* make sure blue_ref >= blue_shoot for top/right or */ + /* vice versa for bottom/left */ + if ( *blue_shoot != *blue_ref ) + { + FT_Pos ref = *blue_ref; + FT_Pos shoot = *blue_shoot; + FT_Bool under_ref = FT_BOOL( shoot < ref ); + + + /* AF_CJK_IS_TOP_BLUE covers `right' and `top' */ + if ( AF_CJK_IS_TOP_BLUE( bs ) ^ under_ref ) + { + *blue_ref = + *blue_shoot = ( shoot + ref ) / 2; + + FT_TRACE5(( " [reference smaller than overshoot," + " taking mean value]\n" )); + } + } + + blue->flags = 0; + if ( AF_CJK_IS_TOP_BLUE( bs ) ) + blue->flags |= AF_CJK_BLUE_TOP; + + FT_TRACE5(( " -> reference = %ld\n" + " overshoot = %ld\n", + *blue_ref, *blue_shoot )); + + } /* end for loop */ + + af_shaper_buf_destroy( face, shaper_buf ); + + FT_TRACE5(( "\n" )); + + return; + } + + + /* Basically the Latin version with type AF_CJKMetrics for metrics. */ + + FT_LOCAL_DEF( void ) + af_cjk_metrics_check_digits( AF_CJKMetrics metrics, + FT_Face face ) + { + FT_Bool started = 0, same_width = 1; + FT_Fixed advance = 0, old_advance = 0; + + void* shaper_buf; + + /* in all supported charmaps, digits have character codes 0x30-0x39 */ + const char digits[] = "0 1 2 3 4 5 6 7 8 9"; + const char* p; + + + p = digits; + shaper_buf = af_shaper_buf_create( face ); + + while ( *p ) + { + FT_ULong glyph_index; + unsigned int num_idx; + + + /* reject input that maps to more than a single glyph */ + p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); + if ( num_idx > 1 ) + continue; + + glyph_index = af_shaper_get_elem( &metrics->root, + shaper_buf, + 0, + &advance, + NULL ); + if ( !glyph_index ) + continue; + + if ( started ) + { + if ( advance != old_advance ) + { + same_width = 0; + break; + } + } + else + { + old_advance = advance; + started = 1; + } + } + + af_shaper_buf_destroy( face, shaper_buf ); + + metrics->root.digits_have_same_width = same_width; + } + + + /* Initialize global metrics. */ + + FT_LOCAL_DEF( FT_Error ) + af_cjk_metrics_init( AF_CJKMetrics metrics, + FT_Face face ) + { + FT_CharMap oldmap = face->charmap; + + + metrics->units_per_em = face->units_per_EM; + + if ( !FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) + { + af_cjk_metrics_init_widths( metrics, face ); + af_cjk_metrics_init_blues( metrics, face ); + af_cjk_metrics_check_digits( metrics, face ); + } + + FT_Set_Charmap( face, oldmap ); + return FT_Err_Ok; + } + + + /* Adjust scaling value, then scale and shift widths */ + /* and blue zones (if applicable) for given dimension. */ + + static void + af_cjk_metrics_scale_dim( AF_CJKMetrics metrics, + AF_Scaler scaler, + AF_Dimension dim ) + { + FT_Fixed scale; + FT_Pos delta; + AF_CJKAxis axis; + FT_UInt nn; + + + if ( dim == AF_DIMENSION_HORZ ) + { + scale = scaler->x_scale; + delta = scaler->x_delta; + } + else + { + scale = scaler->y_scale; + delta = scaler->y_delta; + } + + axis = &metrics->axis[dim]; + + if ( axis->org_scale == scale && axis->org_delta == delta ) + return; + + axis->org_scale = scale; + axis->org_delta = delta; + + axis->scale = scale; + axis->delta = delta; + + /* scale the blue zones */ + for ( nn = 0; nn < axis->blue_count; nn++ ) + { + AF_CJKBlue blue = &axis->blues[nn]; + FT_Pos dist; + + + blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; + blue->ref.fit = blue->ref.cur; + blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; + blue->shoot.fit = blue->shoot.cur; + blue->flags &= ~AF_CJK_BLUE_ACTIVE; + + /* a blue zone is only active if it is less than 3/4 pixels tall */ + dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); + if ( dist <= 48 && dist >= -48 ) + { + FT_Pos delta1, delta2; + + + blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); + + /* shoot is under shoot for cjk */ + delta1 = FT_DivFix( blue->ref.fit, scale ) - blue->shoot.org; + delta2 = delta1; + if ( delta1 < 0 ) + delta2 = -delta2; + + delta2 = FT_MulFix( delta2, scale ); + + FT_TRACE5(( "delta: %d", delta1 )); + if ( delta2 < 32 ) + delta2 = 0; +#if 0 + else if ( delta2 < 64 ) + delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); +#endif + else + delta2 = FT_PIX_ROUND( delta2 ); + FT_TRACE5(( "/%d\n", delta2 )); + + if ( delta1 < 0 ) + delta2 = -delta2; + + blue->shoot.fit = blue->ref.fit - delta2; + + FT_TRACE5(( ">> active cjk blue zone %c%d[%ld/%ld]:\n" + " ref: cur=%.2f fit=%.2f\n" + " shoot: cur=%.2f fit=%.2f\n", + ( dim == AF_DIMENSION_HORZ ) ? 'H' : 'V', + nn, blue->ref.org, blue->shoot.org, + blue->ref.cur / 64.0, blue->ref.fit / 64.0, + blue->shoot.cur / 64.0, blue->shoot.fit / 64.0 )); + + blue->flags |= AF_CJK_BLUE_ACTIVE; + } + } + } + + + /* Scale global values in both directions. */ + + FT_LOCAL_DEF( void ) + af_cjk_metrics_scale( AF_CJKMetrics metrics, + AF_Scaler scaler ) + { + /* we copy the whole structure since the x and y scaling values */ + /* are not modified, contrary to e.g. the `latin' auto-hinter */ + metrics->root.scaler = *scaler; + + af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); + af_cjk_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); + } + + + /* Extract standard_width from writing system/script specific */ + /* metrics class. */ + + FT_LOCAL_DEF( void ) + af_cjk_get_standard_widths( AF_CJKMetrics metrics, + FT_Pos* stdHW, + FT_Pos* stdVW ) + { + if ( stdHW ) + *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width; + + if ( stdVW ) + *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Walk over all contours and compute its segments. */ + + static FT_Error + af_cjk_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + FT_Error error; + AF_Segment seg; + + + error = af_latin_hints_compute_segments( hints, dim ); + if ( error ) + return error; + + /* a segment is round if it doesn't have successive */ + /* on-curve points. */ + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Point pt = seg->first; + AF_Point last = seg->last; + FT_UInt f0 = pt->flags & AF_FLAG_CONTROL; + FT_UInt f1; + + + seg->flags &= ~AF_EDGE_ROUND; + + for ( ; pt != last; f0 = f1 ) + { + pt = pt->next; + f1 = pt->flags & AF_FLAG_CONTROL; + + if ( !f0 && !f1 ) + break; + + if ( pt == last ) + seg->flags |= AF_EDGE_ROUND; + } + } + + return FT_Err_Ok; + } + + + static void + af_cjk_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Direction major_dir = axis->major_dir; + AF_Segment seg1, seg2; + FT_Pos len_threshold; + FT_Pos dist_threshold; + + + len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); + + dist_threshold = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + dist_threshold = FT_DivFix( 64 * 3, dist_threshold ); + + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + if ( seg1->dir != major_dir ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + if ( seg2 != seg1 && seg1->dir + seg2->dir == 0 ) + { + FT_Pos dist = seg2->pos - seg1->pos; + + + if ( dist < 0 ) + continue; + + { + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len; + + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max > seg2->max_coord ) + max = seg2->max_coord; + + len = max - min; + if ( len >= len_threshold ) + { + if ( dist * 8 < seg1->score * 9 && + ( dist * 8 < seg1->score * 7 || seg1->len < len ) ) + { + seg1->score = dist; + seg1->len = len; + seg1->link = seg2; + } + + if ( dist * 8 < seg2->score * 9 && + ( dist * 8 < seg2->score * 7 || seg2->len < len ) ) + { + seg2->score = dist; + seg2->len = len; + seg2->link = seg1; + } + } + } + } + } + + /* + * now compute the `serif' segments + * + * In Hanzi, some strokes are wider on one or both of the ends. + * We either identify the stems on the ends as serifs or remove + * the linkage, depending on the length of the stems. + * + */ + + { + AF_Segment link1, link2; + + + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + link1 = seg1->link; + if ( !link1 || link1->link != seg1 || link1->pos <= seg1->pos ) + continue; + + if ( seg1->score >= dist_threshold ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + { + if ( seg2->pos > seg1->pos || seg1 == seg2 ) + continue; + + link2 = seg2->link; + if ( !link2 || link2->link != seg2 || link2->pos < link1->pos ) + continue; + + if ( seg1->pos == seg2->pos && link1->pos == link2->pos ) + continue; + + if ( seg2->score <= seg1->score || seg1->score * 4 <= seg2->score ) + continue; + + /* seg2 < seg1 < link1 < link2 */ + + if ( seg1->len >= seg2->len * 3 ) + { + AF_Segment seg; + + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Segment link = seg->link; + + + if ( link == seg2 ) + { + seg->link = NULL; + seg->serif = link1; + } + else if ( link == link2 ) + { + seg->link = NULL; + seg->serif = seg1; + } + } + } + else + { + seg1->link = link1->link = NULL; + + break; + } + } + } + } + + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 ) + { + if ( seg2->link != seg1 ) + { + seg1->link = NULL; + + if ( seg2->score < dist_threshold || seg1->score < seg2->score * 4 ) + seg1->serif = seg2->link; + } + } + } + } + + + static FT_Error + af_cjk_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Error error = FT_Err_Ok; + FT_Memory memory = hints->memory; + AF_CJKAxis laxis = &((AF_CJKMetrics)hints->metrics)->axis[dim]; + + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + FT_Fixed scale; + FT_Pos edge_distance_threshold; + + + axis->num_edges = 0; + + scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + + /*********************************************************************/ + /* */ + /* We begin by generating a sorted table of edges for the current */ + /* direction. To do so, we simply scan each segment and try to find */ + /* an edge in our table that corresponds to its position. */ + /* */ + /* If no edge is found, we create and insert a new edge in the */ + /* sorted table. Otherwise, we simply add the segment to the edge's */ + /* list which is then processed in the second step to compute the */ + /* edge's properties. */ + /* */ + /* Note that the edges table is sorted along the segment/edge */ + /* position. */ + /* */ + /*********************************************************************/ + + edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = FT_DivFix( 64 / 4, scale ); + else + edge_distance_threshold = laxis->edge_distance_threshold; + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = NULL; + FT_Pos best = 0xFFFFU; + FT_Int ee; + + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + if ( edge->dir != seg->dir ) + continue; + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold && dist < best ) + { + AF_Segment link = seg->link; + + + /* check whether all linked segments of the candidate edge */ + /* can make a single edge. */ + if ( link ) + { + AF_Segment seg1 = edge->first; + FT_Pos dist2 = 0; + + + do + { + AF_Segment link1 = seg1->link; + + + if ( link1 ) + { + dist2 = AF_SEGMENT_DIST( link, link1 ); + if ( dist2 >= edge_distance_threshold ) + break; + } + + } while ( ( seg1 = seg1->edge_next ) != edge->first ); + + if ( dist2 >= edge_distance_threshold ) + continue; + } + + best = dist; + found = edge; + } + } + + if ( !found ) + { + AF_Edge edge; + + + /* insert a new edge in the list and */ + /* sort according to the position */ + error = af_axis_hints_new_edge( axis, seg->pos, + (AF_Direction)seg->dir, 0, + memory, &edge ); + if ( error ) + goto Exit; + + /* add the segment to the new edge's list */ + FT_ZERO( edge ); + + edge->first = seg; + edge->last = seg; + edge->dir = seg->dir; + edge->fpos = seg->pos; + edge->opos = FT_MulFix( seg->pos, scale ); + edge->pos = edge->opos; + seg->edge_next = seg; + } + else + { + /* if an edge was found, simply add the segment to the edge's */ + /* list */ + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + /******************************************************************/ + /* */ + /* Good, we now compute each edge's properties according to the */ + /* segments found on its position. Basically, these are */ + /* */ + /* - the edge's main direction */ + /* - stem edge, serif edge or both (which defaults to stem then) */ + /* - rounded edge, straight or both (which defaults to straight) */ + /* - link for edge */ + /* */ + /******************************************************************/ + + /* first of all, set the `edge' field in each segment -- this is */ + /* required in order to compute edge links */ + + /* + * Note that removing this loop and setting the `edge' field of each + * segment directly in the code above slows down execution speed for + * some reasons on platforms like the Sun. + */ + { + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + + + for ( edge = edges; edge < edge_limit; edge++ ) + { + seg = edge->first; + if ( seg ) + do + { + seg->edge = edge; + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + /* now compute each edge properties */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Int is_round = 0; /* does it contain round segments? */ + FT_Int is_straight = 0; /* does it contain straight segments? */ + + + seg = edge->first; + + do + { + FT_Bool is_serif; + + + /* check for roundness of segment */ + if ( seg->flags & AF_EDGE_ROUND ) + is_round++; + else + is_straight++; + + /* check for links -- if seg->serif is set, then seg->link must */ + /* be ignored */ + is_serif = (FT_Bool)( seg->serif && seg->serif->edge != edge ); + + if ( seg->link || is_serif ) + { + AF_Edge edge2; + AF_Segment seg2; + + + edge2 = edge->link; + seg2 = seg->link; + + if ( is_serif ) + { + seg2 = seg->serif; + edge2 = edge->serif; + } + + if ( edge2 ) + { + FT_Pos edge_delta; + FT_Pos seg_delta; + + + edge_delta = edge->fpos - edge2->fpos; + if ( edge_delta < 0 ) + edge_delta = -edge_delta; + + seg_delta = AF_SEGMENT_DIST( seg, seg2 ); + + if ( seg_delta < edge_delta ) + edge2 = seg2->edge; + } + else + edge2 = seg2->edge; + + if ( is_serif ) + { + edge->serif = edge2; + edge2->flags |= AF_EDGE_SERIF; + } + else + edge->link = edge2; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + + /* set the round/straight flags */ + edge->flags = AF_EDGE_NORMAL; + + if ( is_round > 0 && is_round >= is_straight ) + edge->flags |= AF_EDGE_ROUND; + + /* get rid of serifs if link is set */ + /* XXX: This gets rid of many unpleasant artefacts! */ + /* Example: the `c' in cour.pfa at size 13 */ + + if ( edge->serif && edge->link ) + edge->serif = NULL; + } + } + + Exit: + return error; + } + + + /* Detect segments and edges for given dimension. */ + + static FT_Error + af_cjk_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ) + { + FT_Error error; + + + error = af_cjk_hints_compute_segments( hints, dim ); + if ( !error ) + { + af_cjk_hints_link_segments( hints, dim ); + + error = af_cjk_hints_compute_edges( hints, dim ); + } + return error; + } + + + /* Compute all edges which lie within blue zones. */ + + static void + af_cjk_hints_compute_blue_edges( AF_GlyphHints hints, + AF_CJKMetrics metrics, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edge = axis->edges; + AF_Edge edge_limit = edge + axis->num_edges; + AF_CJKAxis cjk = &metrics->axis[dim]; + FT_Fixed scale = cjk->scale; + FT_Pos best_dist0; /* initial threshold */ + + + /* compute the initial threshold as a fraction of the EM size */ + best_dist0 = FT_MulFix( metrics->units_per_em / 40, scale ); + + if ( best_dist0 > 64 / 2 ) /* maximum 1/2 pixel */ + best_dist0 = 64 / 2; + + /* compute which blue zones are active, i.e. have their scaled */ + /* size < 3/4 pixels */ + + /* If the distant between an edge and a blue zone is shorter than */ + /* best_dist0, set the blue zone for the edge. Then search for */ + /* the blue zone with the smallest best_dist to the edge. */ + + for ( ; edge < edge_limit; edge++ ) + { + FT_UInt bb; + AF_Width best_blue = NULL; + FT_Pos best_dist = best_dist0; + + + for ( bb = 0; bb < cjk->blue_count; bb++ ) + { + AF_CJKBlue blue = cjk->blues + bb; + FT_Bool is_top_right_blue, is_major_dir; + + + /* skip inactive blue zones (i.e., those that are too small) */ + if ( !( blue->flags & AF_CJK_BLUE_ACTIVE ) ) + continue; + + /* if it is a top zone, check for right edges -- if it is a bottom */ + /* zone, check for left edges */ + /* */ + /* of course, that's for TrueType */ + is_top_right_blue = + (FT_Byte)( ( blue->flags & AF_CJK_BLUE_TOP ) != 0 ); + is_major_dir = + FT_BOOL( edge->dir == axis->major_dir ); + + /* if it is a top zone, the edge must be against the major */ + /* direction; if it is a bottom zone, it must be in the major */ + /* direction */ + if ( is_top_right_blue ^ is_major_dir ) + { + FT_Pos dist; + AF_Width compare; + + + /* Compare the edge to the closest blue zone type */ + if ( FT_ABS( edge->fpos - blue->ref.org ) > + FT_ABS( edge->fpos - blue->shoot.org ) ) + compare = &blue->shoot; + else + compare = &blue->ref; + + dist = edge->fpos - compare->org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = compare; + } + } + } + + if ( best_blue ) + edge->blue_edge = best_blue; + } + } + + + /* Initalize hinting engine. */ + + FT_LOCAL_DEF( FT_Error ) + af_cjk_hints_init( AF_GlyphHints hints, + AF_CJKMetrics metrics ) + { + FT_Render_Mode mode; + FT_UInt32 scaler_flags, other_flags; + + + af_glyph_hints_rescale( hints, (AF_StyleMetrics)metrics ); + + /* + * correct x_scale and y_scale when needed, since they may have + * been modified af_cjk_scale_dim above + */ + hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; + hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; + hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; + hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; + + /* compute flags depending on render mode, etc. */ + mode = metrics->root.scaler.render_mode; + +#if 0 /* AF_CONFIG_OPTION_USE_WARPER */ + if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) + metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; +#endif + + scaler_flags = hints->scaler_flags; + other_flags = 0; + + /* + * We snap the width of vertical stems for the monochrome and + * horizontal LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_HORZ_SNAP; + + /* + * We snap the width of horizontal stems for the monochrome and + * vertical LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) + other_flags |= AF_LATIN_HINTS_VERT_SNAP; + + /* + * We adjust stems to full pixels unless in `light' or `lcd' mode. + */ + if ( mode != FT_RENDER_MODE_LIGHT && mode != FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_STEM_ADJUST; + + if ( mode == FT_RENDER_MODE_MONO ) + other_flags |= AF_LATIN_HINTS_MONO; + + scaler_flags |= AF_SCALER_FLAG_NO_ADVANCE; + +#ifdef AF_CONFIG_OPTION_USE_WARPER + /* get (global) warper flag */ + if ( !metrics->root.globals->module->warping ) + scaler_flags |= AF_SCALER_FLAG_NO_WARPER; +#endif + + hints->scaler_flags = scaler_flags; + hints->other_flags = other_flags; + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L Y P H G R I D - F I T T I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* Snap a given width in scaled coordinates to one of the */ + /* current standard widths. */ + + static FT_Pos + af_cjk_snap_width( AF_Width widths, + FT_UInt count, + FT_Pos width ) + { + FT_UInt n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + FT_Pos scaled; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + scaled = FT_PIX_ROUND( reference ); + + if ( width >= reference ) + { + if ( width < scaled + 48 ) + width = reference; + } + else + { + if ( width > scaled - 48 ) + width = reference; + } + + return width; + } + + + /* Compute the snapped width of a given stem. */ + /* There is a lot of voodoo in this function; changing the hard-coded */ + /* parameters influence the whole hinting process. */ + + static FT_Pos + af_cjk_compute_stem_width( AF_GlyphHints hints, + AF_Dimension dim, + FT_Pos width, + FT_UInt base_flags, + FT_UInt stem_flags ) + { + AF_CJKMetrics metrics = (AF_CJKMetrics)hints->metrics; + AF_CJKAxis axis = &metrics->axis[dim]; + FT_Pos dist = width; + FT_Int sign = 0; + FT_Bool vertical = FT_BOOL( dim == AF_DIMENSION_VERT ); + + FT_UNUSED( base_flags ); + FT_UNUSED( stem_flags ); + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + return width; + + if ( dist < 0 ) + { + dist = -width; + sign = 1; + } + + if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || + ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) + { + /* smooth hinting process: very lightly quantize the stem width */ + + if ( axis->width_count > 0 ) + { + if ( FT_ABS( dist - axis->widths[0].cur ) < 40 ) + { + dist = axis->widths[0].cur; + if ( dist < 48 ) + dist = 48; + + goto Done_Width; + } + } + + if ( dist < 54 ) + dist += ( 54 - dist ) / 2; + else if ( dist < 3 * 64 ) + { + FT_Pos delta; + + + delta = dist & 63; + dist &= -64; + + if ( delta < 10 ) + dist += delta; + else if ( delta < 22 ) + dist += 10; + else if ( delta < 42 ) + dist += delta; + else if ( delta < 54 ) + dist += 54; + else + dist += delta; + } + } + else + { + /* strong hinting process: snap the stem width to integer pixels */ + + dist = af_cjk_snap_width( axis->widths, axis->width_count, dist ); + + if ( vertical ) + { + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + + if ( dist >= 64 ) + dist = ( dist + 16 ) & ~63; + else + dist = 64; + } + else + { + if ( AF_LATIN_HINTS_DO_MONO( hints ) ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & ~63; + } + else + { + /* for horizontal anti-aliased hinting, we adopt a more subtle */ + /* approach: we strengthen small stems, round stems whose size */ + /* is between 1 and 2 pixels to an integer, otherwise nothing */ + + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + + else if ( dist < 128 ) + dist = ( dist + 22 ) & ~63; + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + /* Align one stem edge relative to the previous stem edge. */ + + static void + af_cjk_align_linked_edge( AF_GlyphHints hints, + AF_Dimension dim, + AF_Edge base_edge, + AF_Edge stem_edge ) + { + FT_Pos dist = stem_edge->opos - base_edge->opos; + + FT_Pos fitted_width = af_cjk_compute_stem_width( hints, dim, dist, + base_edge->flags, + stem_edge->flags ); + + + stem_edge->pos = base_edge->pos + fitted_width; + + FT_TRACE5(( " CJKLINK: edge %d @%d (opos=%.2f) linked to %.2f," + " dist was %.2f, now %.2f\n", + stem_edge - hints->axis[dim].edges, stem_edge->fpos, + stem_edge->opos / 64.0, stem_edge->pos / 64.0, + dist / 64.0, fitted_width / 64.0 )); + } + + + /* Shift the coordinates of the `serif' edge by the same amount */ + /* as the corresponding `base' edge has been moved already. */ + + static void + af_cjk_align_serif_edge( AF_GlyphHints hints, + AF_Edge base, + AF_Edge serif ) + { + FT_UNUSED( hints ); + + serif->pos = base->pos + ( serif->opos - base->opos ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#define AF_LIGHT_MODE_MAX_HORZ_GAP 9 +#define AF_LIGHT_MODE_MAX_VERT_GAP 15 +#define AF_LIGHT_MODE_MAX_DELTA_ABS 14 + + + static FT_Pos + af_hint_normal_stem( AF_GlyphHints hints, + AF_Edge edge, + AF_Edge edge2, + FT_Pos anchor, + AF_Dimension dim ) + { + FT_Pos org_len, cur_len, org_center; + FT_Pos cur_pos1, cur_pos2; + FT_Pos d_off1, u_off1, d_off2, u_off2, delta; + FT_Pos offset; + FT_Pos threshold = 64; + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + { + if ( ( edge->flags & AF_EDGE_ROUND ) && + ( edge2->flags & AF_EDGE_ROUND ) ) + { + if ( dim == AF_DIMENSION_VERT ) + threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP; + else + threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP; + } + else + { + if ( dim == AF_DIMENSION_VERT ) + threshold = 64 - AF_LIGHT_MODE_MAX_HORZ_GAP / 3; + else + threshold = 64 - AF_LIGHT_MODE_MAX_VERT_GAP / 3; + } + } + + org_len = edge2->opos - edge->opos; + cur_len = af_cjk_compute_stem_width( hints, dim, org_len, + edge->flags, + edge2->flags ); + + org_center = ( edge->opos + edge2->opos ) / 2 + anchor; + cur_pos1 = org_center - cur_len / 2; + cur_pos2 = cur_pos1 + cur_len; + d_off1 = cur_pos1 - FT_PIX_FLOOR( cur_pos1 ); + d_off2 = cur_pos2 - FT_PIX_FLOOR( cur_pos2 ); + u_off1 = 64 - d_off1; + u_off2 = 64 - d_off2; + delta = 0; + + + if ( d_off1 == 0 || d_off2 == 0 ) + goto Exit; + + if ( cur_len <= threshold ) + { + if ( d_off2 < cur_len ) + { + if ( u_off1 <= d_off2 ) + delta = u_off1; + else + delta = -d_off2; + } + + goto Exit; + } + + if ( threshold < 64 ) + { + if ( d_off1 >= threshold || u_off1 >= threshold || + d_off2 >= threshold || u_off2 >= threshold ) + goto Exit; + } + + offset = cur_len & 63; + + if ( offset < 32 ) + { + if ( u_off1 <= offset || d_off2 <= offset ) + goto Exit; + } + else + offset = 64 - threshold; + + d_off1 = threshold - u_off1; + u_off1 = u_off1 - offset; + u_off2 = threshold - d_off2; + d_off2 = d_off2 - offset; + + if ( d_off1 <= u_off1 ) + u_off1 = -d_off1; + + if ( d_off2 <= u_off2 ) + u_off2 = -d_off2; + + if ( FT_ABS( u_off1 ) <= FT_ABS( u_off2 ) ) + delta = u_off1; + else + delta = u_off2; + + Exit: + +#if 1 + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) ) + { + if ( delta > AF_LIGHT_MODE_MAX_DELTA_ABS ) + delta = AF_LIGHT_MODE_MAX_DELTA_ABS; + else if ( delta < -AF_LIGHT_MODE_MAX_DELTA_ABS ) + delta = -AF_LIGHT_MODE_MAX_DELTA_ABS; + } +#endif + + cur_pos1 += delta; + + if ( edge->opos < edge2->opos ) + { + edge->pos = cur_pos1; + edge2->pos = cur_pos1 + cur_len; + } + else + { + edge->pos = cur_pos1 + cur_len; + edge2->pos = cur_pos1; + } + + return delta; + } + + + /* The main grid-fitting routine. */ + + static void + af_cjk_hint_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + FT_PtrDist n_edges; + AF_Edge edge; + AF_Edge anchor = NULL; + FT_Pos delta = 0; + FT_Int skipped = 0; + FT_Bool has_last_stem = FALSE; + FT_Pos last_stem_pos = 0; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_UInt num_actions = 0; +#endif + + + FT_TRACE5(( "cjk %s edge hinting (style `%s')\n", + dim == AF_DIMENSION_VERT ? "horizontal" : "vertical", + af_style_names[hints->metrics->style_class->style] )); + + /* we begin by aligning all stems relative to the blue zone */ + + if ( AF_HINTS_DO_BLUES( hints ) ) + { + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Width blue; + AF_Edge edge1, edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + blue = edge->blue_edge; + edge1 = NULL; + edge2 = edge->link; + + if ( blue ) + { + edge1 = edge; + } + else if ( edge2 && edge2->blue_edge ) + { + blue = edge2->blue_edge; + edge1 = edge2; + edge2 = edge; + } + + if ( !edge1 ) + continue; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE5(( " CJKBLUE: edge %d @%d (opos=%.2f) snapped to %.2f," + " was %.2f\n", + edge1 - edges, edge1->fpos, edge1->opos / 64.0, + blue->fit / 64.0, edge1->pos / 64.0 )); + + num_actions++; +#endif + + edge1->pos = blue->fit; + edge1->flags |= AF_EDGE_DONE; + + if ( edge2 && !edge2->blue_edge ) + { + af_cjk_align_linked_edge( hints, dim, edge1, edge2 ); + edge2->flags |= AF_EDGE_DONE; + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions++; +#endif + } + + if ( !anchor ) + anchor = edge; + } + } + + /* now we align all stem edges. */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + /* skip all non-stem edges */ + edge2 = edge->link; + if ( !edge2 ) + { + skipped++; + continue; + } + + /* Some CJK characters have so many stems that + * the hinter is likely to merge two adjacent ones. + * To solve this problem, if either edge of a stem + * is too close to the previous one, we avoid + * aligning the two edges, but rather interpolate + * their locations at the end of this function in + * order to preserve the space between the stems. + */ + if ( has_last_stem && + ( edge->pos < last_stem_pos + 64 || + edge2->pos < last_stem_pos + 64 ) ) + { + skipped++; + continue; + } + + /* now align the stem */ + + /* this should not happen, but it's better to be safe */ + if ( edge2->blue_edge ) + { + FT_TRACE5(( "ASSERTION FAILED for edge %d\n", edge2-edges )); + + af_cjk_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions++; +#endif + + continue; + } + + if ( edge2 < edge ) + { + af_cjk_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions++; +#endif + + /* We rarely reaches here it seems; + * usually the two edges belonging + * to one stem are marked as DONE together + */ + has_last_stem = TRUE; + last_stem_pos = edge->pos; + continue; + } + + if ( dim != AF_DIMENSION_VERT && !anchor ) + { + +#if 0 + if ( fixedpitch ) + { + AF_Edge left = edge; + AF_Edge right = edge_limit - 1; + AF_EdgeRec left1, left2, right1, right2; + FT_Pos target, center1, center2; + FT_Pos delta1, delta2, d1, d2; + + + while ( right > left && !right->link ) + right--; + + left1 = *left; + left2 = *left->link; + right1 = *right->link; + right2 = *right; + + delta = ( ( ( hinter->pp2.x + 32 ) & -64 ) - hinter->pp2.x ) / 2; + target = left->opos + ( right->opos - left->opos ) / 2 + delta - 16; + + delta1 = delta; + delta1 += af_hint_normal_stem( hints, left, left->link, + delta1, 0 ); + + if ( left->link != right ) + af_hint_normal_stem( hints, right->link, right, delta1, 0 ); + + center1 = left->pos + ( right->pos - left->pos ) / 2; + + if ( center1 >= target ) + delta2 = delta - 32; + else + delta2 = delta + 32; + + delta2 += af_hint_normal_stem( hints, &left1, &left2, delta2, 0 ); + + if ( delta1 != delta2 ) + { + if ( left->link != right ) + af_hint_normal_stem( hints, &right1, &right2, delta2, 0 ); + + center2 = left1.pos + ( right2.pos - left1.pos ) / 2; + + d1 = center1 - target; + d2 = center2 - target; + + if ( FT_ABS( d2 ) < FT_ABS( d1 ) ) + { + left->pos = left1.pos; + left->link->pos = left2.pos; + + if ( left->link != right ) + { + right->link->pos = right1.pos; + right->pos = right2.pos; + } + + delta1 = delta2; + } + } + + delta = delta1; + right->link->flags |= AF_EDGE_DONE; + right->flags |= AF_EDGE_DONE; + } + else + +#endif /* 0 */ + + delta = af_hint_normal_stem( hints, edge, edge2, 0, + AF_DIMENSION_HORZ ); + } + else + af_hint_normal_stem( hints, edge, edge2, delta, dim ); + +#if 0 + printf( "stem (%d,%d) adjusted (%.1f,%.1f)\n", + edge - edges, edge2 - edges, + ( edge->pos - edge->opos ) / 64.0, + ( edge2->pos - edge2->opos ) / 64.0 ); +#endif + + anchor = edge; + edge->flags |= AF_EDGE_DONE; + edge2->flags |= AF_EDGE_DONE; + has_last_stem = TRUE; + last_stem_pos = edge2->pos; + } + + /* make sure that lowercase m's maintain their symmetry */ + + /* In general, lowercase m's have six vertical edges if they are sans */ + /* serif, or twelve if they are with serifs. This implementation is */ + /* based on that assumption, and seems to work very well with most */ + /* faces. However, if for a certain face this assumption is not */ + /* true, the m is just rendered like before. In addition, any stem */ + /* correction will only be applied to symmetrical glyphs (even if the */ + /* glyph is not an m), so the potential for unwanted distortion is */ + /* relatively low. */ + + /* We don't handle horizontal edges since we can't easily assure that */ + /* the third (lowest) stem aligns with the base line; it might end up */ + /* one pixel higher or lower. */ + + n_edges = edge_limit - edges; + if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) + { + AF_Edge edge1, edge2, edge3; + FT_Pos dist1, dist2, span; + + + if ( n_edges == 6 ) + { + edge1 = edges; + edge2 = edges + 2; + edge3 = edges + 4; + } + else + { + edge1 = edges + 1; + edge2 = edges + 5; + edge3 = edges + 9; + } + + dist1 = edge2->opos - edge1->opos; + dist2 = edge3->opos - edge2->opos; + + span = dist1 - dist2; + if ( span < 0 ) + span = -span; + + if ( edge1->link == edge1 + 1 && + edge2->link == edge2 + 1 && + edge3->link == edge3 + 1 && span < 8 ) + { + delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); + edge3->pos -= delta; + if ( edge3->link ) + edge3->link->pos -= delta; + + /* move the serifs along with the stem */ + if ( n_edges == 12 ) + { + ( edges + 8 )->pos -= delta; + ( edges + 11 )->pos -= delta; + } + + edge3->flags |= AF_EDGE_DONE; + if ( edge3->link ) + edge3->link->flags |= AF_EDGE_DONE; + } + } + + if ( !skipped ) + goto Exit; + + /* + * now hint the remaining edges (serifs and single) in order + * to complete our processing + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + if ( edge->flags & AF_EDGE_DONE ) + continue; + + if ( edge->serif ) + { + af_cjk_align_serif_edge( hints, edge->serif, edge ); + edge->flags |= AF_EDGE_DONE; + skipped--; + } + } + + if ( !skipped ) + goto Exit; + + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge before, after; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + before = after = edge; + + while ( --before >= edges ) + if ( before->flags & AF_EDGE_DONE ) + break; + + while ( ++after < edge_limit ) + if ( after->flags & AF_EDGE_DONE ) + break; + + if ( before >= edges || after < edge_limit ) + { + if ( before < edges ) + af_cjk_align_serif_edge( hints, after, edge ); + else if ( after >= edge_limit ) + af_cjk_align_serif_edge( hints, before, edge ); + else + { + if ( after->fpos == before->fpos ) + edge->pos = before->pos; + else + edge->pos = before->pos + + FT_MulDiv( edge->fpos - before->fpos, + after->pos - before->pos, + after->fpos - before->fpos ); + } + } + } + + Exit: + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !num_actions ) + FT_TRACE5(( " (none)\n" )); + FT_TRACE5(( "\n" )); +#endif + + return; + } + + + static void + af_cjk_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = & hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + FT_Bool snapping; + + + snapping = FT_BOOL( ( dim == AF_DIMENSION_HORZ && + AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) || + ( dim == AF_DIMENSION_VERT && + AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) ); + + for ( edge = edges; edge < edge_limit; edge++ ) + { + /* move the points of each segment */ + /* in each edge to the edge's position */ + AF_Segment seg = edge->first; + + + if ( snapping ) + { + do + { + AF_Point point = seg->first; + + + for (;;) + { + if ( dim == AF_DIMENSION_HORZ ) + { + point->x = edge->pos; + point->flags |= AF_FLAG_TOUCH_X; + } + else + { + point->y = edge->pos; + point->flags |= AF_FLAG_TOUCH_Y; + } + + if ( point == seg->last ) + break; + + point = point->next; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + else + { + FT_Pos delta = edge->pos - edge->opos; + + + do + { + AF_Point point = seg->first; + + + for (;;) + { + if ( dim == AF_DIMENSION_HORZ ) + { + point->x += delta; + point->flags |= AF_FLAG_TOUCH_X; + } + else + { + point->y += delta; + point->flags |= AF_FLAG_TOUCH_Y; + } + + if ( point == seg->last ) + break; + + point = point->next; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + } + } + + + /* Apply the complete hinting algorithm to a CJK glyph. */ + + FT_LOCAL_DEF( FT_Error ) + af_cjk_hints_apply( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline, + AF_CJKMetrics metrics ) + { + FT_Error error; + int dim; + + FT_UNUSED( metrics ); + FT_UNUSED( glyph_index ); + + + error = af_glyph_hints_reload( hints, outline ); + if ( error ) + goto Exit; + + /* analyze glyph outline */ + if ( AF_HINTS_DO_HORIZONTAL( hints ) ) + { + error = af_cjk_hints_detect_features( hints, AF_DIMENSION_HORZ ); + if ( error ) + goto Exit; + + af_cjk_hints_compute_blue_edges( hints, metrics, AF_DIMENSION_HORZ ); + } + + if ( AF_HINTS_DO_VERTICAL( hints ) ) + { + error = af_cjk_hints_detect_features( hints, AF_DIMENSION_VERT ); + if ( error ) + goto Exit; + + af_cjk_hints_compute_blue_edges( hints, metrics, AF_DIMENSION_VERT ); + } + + /* grid-fit the outline */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || + ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) + { + +#ifdef AF_CONFIG_OPTION_USE_WARPER + if ( dim == AF_DIMENSION_HORZ && + metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL && + AF_HINTS_DO_WARP( hints ) ) + { + AF_WarperRec warper; + FT_Fixed scale; + FT_Pos delta; + + + af_warper_compute( &warper, hints, (AF_Dimension)dim, + &scale, &delta ); + af_glyph_hints_scale_dim( hints, (AF_Dimension)dim, + scale, delta ); + continue; + } +#endif /* AF_CONFIG_OPTION_USE_WARPER */ + + af_cjk_hint_edges( hints, (AF_Dimension)dim ); + af_cjk_align_edge_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); + } + } + + af_glyph_hints_save( hints, outline ); + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + AF_DEFINE_WRITING_SYSTEM_CLASS( + af_cjk_writing_system_class, + + AF_WRITING_SYSTEM_CJK, + + sizeof ( AF_CJKMetricsRec ), + + (AF_WritingSystem_InitMetricsFunc) af_cjk_metrics_init, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)af_cjk_metrics_scale, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)af_cjk_get_standard_widths, /* style_metrics_getstdw */ + + (AF_WritingSystem_InitHintsFunc) af_cjk_hints_init, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) af_cjk_hints_apply /* style_hints_apply */ + ) + + +#else /* !AF_CONFIG_OPTION_CJK */ + + + AF_DEFINE_WRITING_SYSTEM_CLASS( + af_cjk_writing_system_class, + + AF_WRITING_SYSTEM_CJK, + + sizeof ( AF_CJKMetricsRec ), + + (AF_WritingSystem_InitMetricsFunc) NULL, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)NULL, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)NULL, /* style_metrics_getstdw */ + + (AF_WritingSystem_InitHintsFunc) NULL, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) NULL /* style_hints_apply */ + ) + + +#endif /* !AF_CONFIG_OPTION_CJK */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afcjk.h b/vendor/FreeType2/src/autofit/afcjk.h new file mode 100644 index 0000000..d229c0c --- /dev/null +++ b/vendor/FreeType2/src/autofit/afcjk.h @@ -0,0 +1,141 @@ +/***************************************************************************/ +/* */ +/* afcjk.h */ +/* */ +/* Auto-fitter hinting routines for CJK writing system (specification). */ +/* */ +/* Copyright 2006-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AFCJK_H_ +#define AFCJK_H_ + +#include "afhints.h" +#include "aflatin.h" + + +FT_BEGIN_HEADER + + + /* the CJK-specific writing system */ + + AF_DECLARE_WRITING_SYSTEM_CLASS( af_cjk_writing_system_class ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C J K G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* + * CJK glyphs tend to fill the square. So we have both vertical and + * horizontal blue zones. But some glyphs have flat bounding strokes that + * leave some space between neighbour glyphs. + */ + +#define AF_CJK_IS_TOP_BLUE( b ) \ + ( (b)->properties & AF_BLUE_PROPERTY_CJK_TOP ) +#define AF_CJK_IS_HORIZ_BLUE( b ) \ + ( (b)->properties & AF_BLUE_PROPERTY_CJK_HORIZ ) +#define AF_CJK_IS_RIGHT_BLUE AF_CJK_IS_TOP_BLUE + +#define AF_CJK_MAX_WIDTHS 16 + + +#define AF_CJK_BLUE_ACTIVE ( 1U << 0 ) /* zone height is <= 3/4px */ +#define AF_CJK_BLUE_TOP ( 1U << 1 ) /* result of AF_CJK_IS_TOP_BLUE */ +#define AF_CJK_BLUE_ADJUSTMENT ( 1U << 2 ) /* used for scale adjustment */ + /* optimization */ + + + typedef struct AF_CJKBlueRec_ + { + AF_WidthRec ref; + AF_WidthRec shoot; /* undershoot */ + FT_UInt flags; + + } AF_CJKBlueRec, *AF_CJKBlue; + + + typedef struct AF_CJKAxisRec_ + { + FT_Fixed scale; + FT_Pos delta; + + FT_UInt width_count; /* number of used widths */ + AF_WidthRec widths[AF_CJK_MAX_WIDTHS]; /* widths array */ + FT_Pos edge_distance_threshold; /* used for creating edges */ + FT_Pos standard_width; /* the default stem thickness */ + FT_Bool extra_light; /* is standard width very light? */ + + /* used for horizontal metrics too for CJK */ + FT_Bool control_overshoot; + FT_UInt blue_count; + AF_CJKBlueRec blues[AF_BLUE_STRINGSET_MAX]; + + FT_Fixed org_scale; + FT_Pos org_delta; + + } AF_CJKAxisRec, *AF_CJKAxis; + + + typedef struct AF_CJKMetricsRec_ + { + AF_StyleMetricsRec root; + FT_UInt units_per_em; + AF_CJKAxisRec axis[AF_DIMENSION_MAX]; + + } AF_CJKMetricsRec, *AF_CJKMetrics; + + +#ifdef AF_CONFIG_OPTION_CJK + FT_LOCAL( FT_Error ) + af_cjk_metrics_init( AF_CJKMetrics metrics, + FT_Face face ); + + FT_LOCAL( void ) + af_cjk_metrics_scale( AF_CJKMetrics metrics, + AF_Scaler scaler ); + + FT_LOCAL( FT_Error ) + af_cjk_hints_init( AF_GlyphHints hints, + AF_CJKMetrics metrics ); + + FT_LOCAL( FT_Error ) + af_cjk_hints_apply( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline, + AF_CJKMetrics metrics ); + + /* shared; called from afindic.c */ + FT_LOCAL( void ) + af_cjk_metrics_check_digits( AF_CJKMetrics metrics, + FT_Face face ); + + FT_LOCAL( void ) + af_cjk_metrics_init_widths( AF_CJKMetrics metrics, + FT_Face face ); +#endif /* AF_CONFIG_OPTION_CJK */ + + +/* */ + +FT_END_HEADER + +#endif /* AFCJK_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afcover.h b/vendor/FreeType2/src/autofit/afcover.h new file mode 100644 index 0000000..6eeb8fc --- /dev/null +++ b/vendor/FreeType2/src/autofit/afcover.h @@ -0,0 +1,105 @@ +/***************************************************************************/ +/* */ +/* afcover.h */ +/* */ +/* Auto-fitter coverages (specification only). */ +/* */ +/* Copyright 2013-2018 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 header file can be included multiple times. */ + /* Define `COVERAGE' as needed. */ + + + /* Add new coverages here. The first and second arguments are the */ + /* coverage name in lowercase and uppercase, respectively, followed */ + /* by a description string. The last four arguments are the four */ + /* characters defining the corresponding OpenType feature. */ + +#if 0 + /* XXX: It's not possible to define blue zone characters in advance. */ + COVERAGE( alternative_fractions, ALTERNATIVE_FRACTIONS, + "alternative fractions", + 'a', 'f', 'r', 'c' ) +#endif + + COVERAGE( petite_capitals_from_capitals, PETITE_CAPITALS_FROM_CAPITALS, + "petite capitals from capitals", + 'c', '2', 'c', 'p' ) + + COVERAGE( small_capitals_from_capitals, SMALL_CAPITALS_FROM_CAPITALS, + "small capitals from capitals", + 'c', '2', 's', 'c' ) + +#if 0 + /* XXX: Only digits are in this coverage, however, both normal style */ + /* and oldstyle representation forms are possible. */ + COVERAGE( denominators, DENOMINATORS, + "denominators", + 'd', 'n', 'o', 'm' ) +#endif + +#if 0 + /* XXX: It's not possible to define blue zone characters in advance. */ + COVERAGE( fractions, FRACTIONS, + "fractions", + 'f', 'r', 'a', 'c' ) +#endif + +#if 0 + /* XXX: Only digits are in this coverage, however, both normal style */ + /* and oldstyle representation forms are possible. */ + COVERAGE( numerators, NUMERATORS, + "numerators", + 'n', 'u', 'm', 'r' ) +#endif + + COVERAGE( ordinals, ORDINALS, + "ordinals", + 'o', 'r', 'd', 'n' ) + + COVERAGE( petite_capitals, PETITE_CAPITALS, + "petite capitals", + 'p', 'c', 'a', 'p' ) + + COVERAGE( ruby, RUBY, + "ruby", + 'r', 'u', 'b', 'y' ) + + COVERAGE( scientific_inferiors, SCIENTIFIC_INFERIORS, + "scientific inferiors", + 's', 'i', 'n', 'f' ) + + COVERAGE( small_capitals, SMALL_CAPITALS, + "small capitals", + 's', 'm', 'c', 'p' ) + + COVERAGE( subscript, SUBSCRIPT, + "subscript", + 's', 'u', 'b', 's' ) + + COVERAGE( superscript, SUPERSCRIPT, + "superscript", + 's', 'u', 'p', 's' ) + + COVERAGE( titling, TITLING, + "titling", + 't', 'i', 't', 'l' ) + +#if 0 + /* to be always excluded */ + COVERAGE(nalt, 'n', 'a', 'l', 't'); /* Alternate Annotation Forms (?) */ + COVERAGE(ornm, 'o', 'r', 'n', 'm'); /* Ornaments (?) */ +#endif + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afdummy.c b/vendor/FreeType2/src/autofit/afdummy.c new file mode 100644 index 0000000..f30c517 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afdummy.c @@ -0,0 +1,75 @@ +/***************************************************************************/ +/* */ +/* afdummy.c */ +/* */ +/* Auto-fitter dummy routines to be used if no hinting should be */ +/* performed (body). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#include "afdummy.h" +#include "afhints.h" +#include "aferrors.h" + + + static FT_Error + af_dummy_hints_init( AF_GlyphHints hints, + AF_StyleMetrics metrics ) + { + af_glyph_hints_rescale( hints, metrics ); + + hints->x_scale = metrics->scaler.x_scale; + hints->y_scale = metrics->scaler.y_scale; + hints->x_delta = metrics->scaler.x_delta; + hints->y_delta = metrics->scaler.y_delta; + + return FT_Err_Ok; + } + + + static FT_Error + af_dummy_hints_apply( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline ) + { + FT_Error error; + + FT_UNUSED( glyph_index ); + + + error = af_glyph_hints_reload( hints, outline ); + if ( !error ) + af_glyph_hints_save( hints, outline ); + + return error; + } + + + AF_DEFINE_WRITING_SYSTEM_CLASS( + af_dummy_writing_system_class, + + AF_WRITING_SYSTEM_DUMMY, + + sizeof ( AF_StyleMetricsRec ), + + (AF_WritingSystem_InitMetricsFunc) NULL, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)NULL, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)NULL, /* style_metrics_getstdw */ + + (AF_WritingSystem_InitHintsFunc) af_dummy_hints_init, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) af_dummy_hints_apply /* style_hints_apply */ + ) + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afdummy.h b/vendor/FreeType2/src/autofit/afdummy.h new file mode 100644 index 0000000..b382acd --- /dev/null +++ b/vendor/FreeType2/src/autofit/afdummy.h @@ -0,0 +1,40 @@ +/***************************************************************************/ +/* */ +/* afdummy.h */ +/* */ +/* Auto-fitter dummy routines to be used if no hinting should be */ +/* performed (specification). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AFDUMMY_H_ +#define AFDUMMY_H_ + +#include "aftypes.h" + + +FT_BEGIN_HEADER + + /* A dummy writing system used when no hinting should be performed. */ + + AF_DECLARE_WRITING_SYSTEM_CLASS( af_dummy_writing_system_class ) + +/* */ + +FT_END_HEADER + + +#endif /* AFDUMMY_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/aferrors.h b/vendor/FreeType2/src/autofit/aferrors.h new file mode 100644 index 0000000..e5de543 --- /dev/null +++ b/vendor/FreeType2/src/autofit/aferrors.h @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* aferrors.h */ +/* */ +/* Autofitter error codes (specification only). */ +/* */ +/* Copyright 2005-2018 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 file is used to define the Autofitter error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef AFERRORS_H_ +#define AFERRORS_H_ + +#include FT_MODULE_ERRORS_H + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX AF_Err_ +#define FT_ERR_BASE FT_Mod_Err_Autofit + +#include FT_ERRORS_H + +#endif /* AFERRORS_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afglobal.c b/vendor/FreeType2/src/autofit/afglobal.c new file mode 100644 index 0000000..3d09c53 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afglobal.c @@ -0,0 +1,503 @@ +/***************************************************************************/ +/* */ +/* afglobal.c */ +/* */ +/* Auto-fitter routines to compute global hinting values (body). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#include "afglobal.h" +#include "afranges.h" +#include "afshaper.h" +#include FT_INTERNAL_DEBUG_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_afglobal + + + /* get writing system specific header files */ +#undef WRITING_SYSTEM +#define WRITING_SYSTEM( ws, WS ) /* empty */ +#include "afwrtsys.h" + +#include "aferrors.h" +#include "afpic.h" + + +#undef SCRIPT +#define SCRIPT( s, S, d, h, H, ss ) \ + AF_DEFINE_SCRIPT_CLASS( \ + af_ ## s ## _script_class, \ + AF_SCRIPT_ ## S, \ + af_ ## s ## _uniranges, \ + af_ ## s ## _nonbase_uniranges, \ + AF_ ## H, \ + ss ) + +#include "afscript.h" + + +#undef STYLE +#define STYLE( s, S, d, ws, sc, ss, c ) \ + AF_DEFINE_STYLE_CLASS( \ + af_ ## s ## _style_class, \ + AF_STYLE_ ## S, \ + ws, \ + sc, \ + ss, \ + c ) + +#include "afstyles.h" + + +#ifndef FT_CONFIG_OPTION_PIC + +#undef WRITING_SYSTEM +#define WRITING_SYSTEM( ws, WS ) \ + &af_ ## ws ## _writing_system_class, + + FT_LOCAL_ARRAY_DEF( AF_WritingSystemClass ) + af_writing_system_classes[] = + { + +#include "afwrtsys.h" + + NULL /* do not remove */ + }; + + +#undef SCRIPT +#define SCRIPT( s, S, d, h, H, ss ) \ + &af_ ## s ## _script_class, + + FT_LOCAL_ARRAY_DEF( AF_ScriptClass ) + af_script_classes[] = + { + +#include "afscript.h" + + NULL /* do not remove */ + }; + + +#undef STYLE +#define STYLE( s, S, d, ws, sc, ss, c ) \ + &af_ ## s ## _style_class, + + FT_LOCAL_ARRAY_DEF( AF_StyleClass ) + af_style_classes[] = + { + +#include "afstyles.h" + + NULL /* do not remove */ + }; + +#endif /* !FT_CONFIG_OPTION_PIC */ + + +#ifdef FT_DEBUG_LEVEL_TRACE + +#undef STYLE +#define STYLE( s, S, d, ws, sc, ss, c ) #s, + + FT_LOCAL_ARRAY_DEF( char* ) + af_style_names[] = + { + +#include "afstyles.h" + + }; + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + /* Compute the style index of each glyph within a given face. */ + + static FT_Error + af_face_globals_compute_style_coverage( AF_FaceGlobals globals ) + { + FT_Error error; + FT_Face face = globals->face; + FT_CharMap old_charmap = face->charmap; + FT_UShort* gstyles = globals->glyph_styles; + FT_UInt ss; + FT_UInt i; + FT_UInt dflt = ~0U; /* a non-valid value */ + + + /* the value AF_STYLE_UNASSIGNED means `uncovered glyph' */ + for ( i = 0; i < (FT_UInt)globals->glyph_count; i++ ) + gstyles[i] = AF_STYLE_UNASSIGNED; + + error = FT_Select_Charmap( face, FT_ENCODING_UNICODE ); + if ( error ) + { + /* + * Ignore this error; we simply use the fallback style. + * XXX: Shouldn't we rather disable hinting? + */ + error = FT_Err_Ok; + goto Exit; + } + + /* scan each style in a Unicode charmap */ + for ( ss = 0; AF_STYLE_CLASSES_GET[ss]; ss++ ) + { + AF_StyleClass style_class = + AF_STYLE_CLASSES_GET[ss]; + AF_ScriptClass script_class = + AF_SCRIPT_CLASSES_GET[style_class->script]; + AF_Script_UniRange range; + + + if ( !script_class->script_uni_ranges ) + continue; + + /* + * Scan all Unicode points in the range and set the corresponding + * glyph style index. + */ + if ( style_class->coverage == AF_COVERAGE_DEFAULT ) + { + if ( (FT_UInt)style_class->script == + globals->module->default_script ) + dflt = ss; + + for ( range = script_class->script_uni_ranges; + range->first != 0; + range++ ) + { + FT_ULong charcode = range->first; + FT_UInt gindex; + + + gindex = FT_Get_Char_Index( face, charcode ); + + if ( gindex != 0 && + gindex < (FT_ULong)globals->glyph_count && + ( gstyles[gindex] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED ) + gstyles[gindex] = (FT_UShort)ss; + + for (;;) + { + charcode = FT_Get_Next_Char( face, charcode, &gindex ); + + if ( gindex == 0 || charcode > range->last ) + break; + + if ( gindex < (FT_ULong)globals->glyph_count && + ( gstyles[gindex] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED ) + gstyles[gindex] = (FT_UShort)ss; + } + } + + /* do the same for the script's non-base characters */ + for ( range = script_class->script_uni_nonbase_ranges; + range->first != 0; + range++ ) + { + FT_ULong charcode = range->first; + FT_UInt gindex; + + + gindex = FT_Get_Char_Index( face, charcode ); + + if ( gindex != 0 && + gindex < (FT_ULong)globals->glyph_count && + ( gstyles[gindex] & AF_STYLE_MASK ) == (FT_UShort)ss ) + gstyles[gindex] |= AF_NONBASE; + + for (;;) + { + charcode = FT_Get_Next_Char( face, charcode, &gindex ); + + if ( gindex == 0 || charcode > range->last ) + break; + + if ( gindex < (FT_ULong)globals->glyph_count && + ( gstyles[gindex] & AF_STYLE_MASK ) == (FT_UShort)ss ) + gstyles[gindex] |= AF_NONBASE; + } + } + } + else + { + /* get glyphs not directly addressable by cmap */ + af_shaper_get_coverage( globals, style_class, gstyles, 0 ); + } + } + + /* handle the remaining default OpenType features ... */ + for ( ss = 0; AF_STYLE_CLASSES_GET[ss]; ss++ ) + { + AF_StyleClass style_class = AF_STYLE_CLASSES_GET[ss]; + + + if ( style_class->coverage == AF_COVERAGE_DEFAULT ) + af_shaper_get_coverage( globals, style_class, gstyles, 0 ); + } + + /* ... and finally the default OpenType features of the default script */ + af_shaper_get_coverage( globals, AF_STYLE_CLASSES_GET[dflt], gstyles, 1 ); + + /* mark ASCII digits */ + for ( i = 0x30; i <= 0x39; i++ ) + { + FT_UInt gindex = FT_Get_Char_Index( face, i ); + + + if ( gindex != 0 && gindex < (FT_ULong)globals->glyph_count ) + gstyles[gindex] |= AF_DIGIT; + } + + Exit: + /* + * By default, all uncovered glyphs are set to the fallback style. + * XXX: Shouldn't we disable hinting or do something similar? + */ + if ( globals->module->fallback_style != AF_STYLE_UNASSIGNED ) + { + FT_Long nn; + + + for ( nn = 0; nn < globals->glyph_count; nn++ ) + { + if ( ( gstyles[nn] & AF_STYLE_MASK ) == AF_STYLE_UNASSIGNED ) + { + gstyles[nn] &= ~AF_STYLE_MASK; + gstyles[nn] |= globals->module->fallback_style; + } + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + + FT_TRACE4(( "\n" + "style coverage\n" + "==============\n" + "\n" )); + + for ( ss = 0; AF_STYLE_CLASSES_GET[ss]; ss++ ) + { + AF_StyleClass style_class = AF_STYLE_CLASSES_GET[ss]; + FT_UInt count = 0; + FT_Long idx; + + + FT_TRACE4(( "%s:\n", af_style_names[style_class->style] )); + + for ( idx = 0; idx < globals->glyph_count; idx++ ) + { + if ( ( gstyles[idx] & AF_STYLE_MASK ) == style_class->style ) + { + if ( !( count % 10 ) ) + FT_TRACE4(( " " )); + + FT_TRACE4(( " %d", idx )); + count++; + + if ( !( count % 10 ) ) + FT_TRACE4(( "\n" )); + } + } + + if ( !count ) + FT_TRACE4(( " (none)\n" )); + if ( count % 10 ) + FT_TRACE4(( "\n" )); + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + FT_Set_Charmap( face, old_charmap ); + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_face_globals_new( FT_Face face, + AF_FaceGlobals *aglobals, + AF_Module module ) + { + FT_Error error; + FT_Memory memory; + AF_FaceGlobals globals = NULL; + + + memory = face->memory; + + /* we allocate an AF_FaceGlobals structure together */ + /* with the glyph_styles array */ + if ( FT_ALLOC( globals, + sizeof ( *globals ) + + (FT_ULong)face->num_glyphs * sizeof ( FT_UShort ) ) ) + goto Exit; + + globals->face = face; + globals->glyph_count = face->num_glyphs; + /* right after the globals structure come the glyph styles */ + globals->glyph_styles = (FT_UShort*)( globals + 1 ); + globals->module = module; + globals->stem_darkening_for_ppem = 0; + globals->darken_x = 0; + globals->darken_y = 0; + globals->standard_vertical_width = 0; + globals->standard_horizontal_width = 0; + globals->scale_down_factor = 0; + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + globals->hb_font = hb_ft_font_create( face, NULL ); + globals->hb_buf = hb_buffer_create(); +#endif + + error = af_face_globals_compute_style_coverage( globals ); + if ( error ) + { + af_face_globals_free( globals ); + globals = NULL; + } + else + globals->increase_x_height = AF_PROP_INCREASE_X_HEIGHT_MAX; + + Exit: + *aglobals = globals; + return error; + } + + + FT_LOCAL_DEF( void ) + af_face_globals_free( AF_FaceGlobals globals ) + { + if ( globals ) + { + FT_Memory memory = globals->face->memory; + FT_UInt nn; + + + for ( nn = 0; nn < AF_STYLE_MAX; nn++ ) + { + if ( globals->metrics[nn] ) + { + AF_StyleClass style_class = + AF_STYLE_CLASSES_GET[nn]; + AF_WritingSystemClass writing_system_class = + AF_WRITING_SYSTEM_CLASSES_GET[style_class->writing_system]; + + + if ( writing_system_class->style_metrics_done ) + writing_system_class->style_metrics_done( globals->metrics[nn] ); + + FT_FREE( globals->metrics[nn] ); + } + } + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + hb_font_destroy( globals->hb_font ); + hb_buffer_destroy( globals->hb_buf ); +#endif + + /* no need to free `globals->glyph_styles'; */ + /* it is part of the `globals' array */ + FT_FREE( globals ); + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_face_globals_get_metrics( AF_FaceGlobals globals, + FT_UInt gindex, + FT_UInt options, + AF_StyleMetrics *ametrics ) + { + AF_StyleMetrics metrics = NULL; + + AF_Style style = (AF_Style)options; + AF_WritingSystemClass writing_system_class; + AF_StyleClass style_class; + + FT_Error error = FT_Err_Ok; + + + if ( gindex >= (FT_ULong)globals->glyph_count ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* if we have a forced style (via `options'), use it, */ + /* otherwise look into `glyph_styles' array */ + if ( style == AF_STYLE_NONE_DFLT || style + 1 >= AF_STYLE_MAX ) + style = (AF_Style)( globals->glyph_styles[gindex] & + AF_STYLE_UNASSIGNED ); + + style_class = AF_STYLE_CLASSES_GET[style]; + writing_system_class = AF_WRITING_SYSTEM_CLASSES_GET + [style_class->writing_system]; + + metrics = globals->metrics[style]; + if ( !metrics ) + { + /* create the global metrics object if necessary */ + FT_Memory memory = globals->face->memory; + + + if ( FT_ALLOC( metrics, writing_system_class->style_metrics_size ) ) + goto Exit; + + metrics->style_class = style_class; + metrics->globals = globals; + + if ( writing_system_class->style_metrics_init ) + { + error = writing_system_class->style_metrics_init( metrics, + globals->face ); + if ( error ) + { + if ( writing_system_class->style_metrics_done ) + writing_system_class->style_metrics_done( metrics ); + + FT_FREE( metrics ); + goto Exit; + } + } + + globals->metrics[style] = metrics; + } + + Exit: + *ametrics = metrics; + + return error; + } + + + FT_LOCAL_DEF( FT_Bool ) + af_face_globals_is_digit( AF_FaceGlobals globals, + FT_UInt gindex ) + { + if ( gindex < (FT_ULong)globals->glyph_count ) + return (FT_Bool)( globals->glyph_styles[gindex] & AF_DIGIT ); + + return (FT_Bool)0; + } + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afglobal.h b/vendor/FreeType2/src/autofit/afglobal.h new file mode 100644 index 0000000..489ed46 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afglobal.h @@ -0,0 +1,173 @@ +/***************************************************************************/ +/* */ +/* afglobal.h */ +/* */ +/* Auto-fitter routines to compute global hinting values */ +/* (specification). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AFGLOBAL_H_ +#define AFGLOBAL_H_ + + +#include "aftypes.h" +#include "afmodule.h" +#include "afshaper.h" + + +FT_BEGIN_HEADER + + + FT_LOCAL_ARRAY( AF_WritingSystemClass ) + af_writing_system_classes[]; + + +#undef SCRIPT +#define SCRIPT( s, S, d, h, H, ss ) \ + AF_DECLARE_SCRIPT_CLASS( af_ ## s ## _script_class ) + +#include "afscript.h" + + FT_LOCAL_ARRAY( AF_ScriptClass ) + af_script_classes[]; + + +#undef STYLE +#define STYLE( s, S, d, ws, sc, ss, c ) \ + AF_DECLARE_STYLE_CLASS( af_ ## s ## _style_class ) + +#include "afstyles.h" + + FT_LOCAL_ARRAY( AF_StyleClass ) + af_style_classes[]; + + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_LOCAL_ARRAY( char* ) + af_style_names[]; +#endif + + + /* + * Default values and flags for both autofitter globals (found in + * AF_ModuleRec) and face globals (in AF_FaceGlobalsRec). + */ + + /* index of fallback style in `af_style_classes' */ +#ifdef AF_CONFIG_OPTION_CJK +#define AF_STYLE_FALLBACK AF_STYLE_HANI_DFLT +#else +#define AF_STYLE_FALLBACK AF_STYLE_NONE_DFLT +#endif + /* default script for OpenType; ignored if HarfBuzz isn't used */ +#define AF_SCRIPT_DEFAULT AF_SCRIPT_LATN + + /* a bit mask for AF_DIGIT and AF_NONBASE */ +#define AF_STYLE_MASK 0x3FFF + /* an uncovered glyph */ +#define AF_STYLE_UNASSIGNED AF_STYLE_MASK + + /* if this flag is set, we have an ASCII digit */ +#define AF_DIGIT 0x8000U + /* if this flag is set, we have a non-base character */ +#define AF_NONBASE 0x4000U + + /* `increase-x-height' property */ +#define AF_PROP_INCREASE_X_HEIGHT_MIN 6 +#define AF_PROP_INCREASE_X_HEIGHT_MAX 0 + + + /************************************************************************/ + /************************************************************************/ + /***** *****/ + /***** F A C E G L O B A L S *****/ + /***** *****/ + /************************************************************************/ + /************************************************************************/ + + + /* + * Note that glyph_styles[] maps each glyph to an index into the + * `af_style_classes' array. + * + */ + typedef struct AF_FaceGlobalsRec_ + { + FT_Face face; + FT_Long glyph_count; /* same as face->num_glyphs */ + FT_UShort* glyph_styles; + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + hb_font_t* hb_font; + hb_buffer_t* hb_buf; /* for feature comparison */ +#endif + + /* per-face auto-hinter properties */ + FT_UInt increase_x_height; + + AF_StyleMetrics metrics[AF_STYLE_MAX]; + + /* Compute darkening amount once per size. Use this to check whether */ + /* darken_{x,y} needs to be recomputed. */ + FT_UShort stem_darkening_for_ppem; + /* Copy from e.g. AF_LatinMetrics.axis[AF_DIMENSION_HORZ] */ + /* to compute the darkening amount. */ + FT_Pos standard_vertical_width; + /* Copy from e.g. AF_LatinMetrics.axis[AF_DIMENSION_VERT] */ + /* to compute the darkening amount. */ + FT_Pos standard_horizontal_width; + /* The actual amount to darken a glyph along the X axis. */ + FT_Pos darken_x; + /* The actual amount to darken a glyph along the Y axis. */ + FT_Pos darken_y; + /* Amount to scale down by to keep emboldened points */ + /* on the Y-axis in pre-computed blue zones. */ + FT_Fixed scale_down_factor; + AF_Module module; /* to access global properties */ + + } AF_FaceGlobalsRec; + + + /* + * model the global hints data for a given face, decomposed into + * style-specific items + */ + + FT_LOCAL( FT_Error ) + af_face_globals_new( FT_Face face, + AF_FaceGlobals *aglobals, + AF_Module module ); + + FT_LOCAL( FT_Error ) + af_face_globals_get_metrics( AF_FaceGlobals globals, + FT_UInt gindex, + FT_UInt options, + AF_StyleMetrics *ametrics ); + + FT_LOCAL( void ) + af_face_globals_free( AF_FaceGlobals globals ); + + FT_LOCAL_DEF( FT_Bool ) + af_face_globals_is_digit( AF_FaceGlobals globals, + FT_UInt gindex ); + + /* */ + + +FT_END_HEADER + +#endif /* AFGLOBAL_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afhints.c b/vendor/FreeType2/src/autofit/afhints.c new file mode 100644 index 0000000..0666dbc --- /dev/null +++ b/vendor/FreeType2/src/autofit/afhints.c @@ -0,0 +1,1659 @@ +/***************************************************************************/ +/* */ +/* afhints.c */ +/* */ +/* Auto-fitter hinting routines (body). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#include "afhints.h" +#include "aferrors.h" +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_DEBUG_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_afhints + + + /* Get new segment for given axis. */ + + FT_LOCAL_DEF( FT_Error ) + af_axis_hints_new_segment( AF_AxisHints axis, + FT_Memory memory, + AF_Segment *asegment ) + { + FT_Error error = FT_Err_Ok; + AF_Segment segment = NULL; + + + if ( axis->num_segments < AF_SEGMENTS_EMBEDDED ) + { + if ( !axis->segments ) + { + axis->segments = axis->embedded.segments; + axis->max_segments = AF_SEGMENTS_EMBEDDED; + } + } + else if ( axis->num_segments >= axis->max_segments ) + { + FT_Int old_max = axis->max_segments; + FT_Int new_max = old_max; + FT_Int big_max = (FT_Int)( FT_INT_MAX / sizeof ( *segment ) ); + + + if ( old_max >= big_max ) + { + error = FT_THROW( Out_Of_Memory ); + goto Exit; + } + + new_max += ( new_max >> 2 ) + 4; + if ( new_max < old_max || new_max > big_max ) + new_max = big_max; + + if ( axis->segments == axis->embedded.segments ) + { + if ( FT_NEW_ARRAY( axis->segments, new_max ) ) + goto Exit; + ft_memcpy( axis->segments, axis->embedded.segments, + sizeof ( axis->embedded.segments ) ); + } + else + { + if ( FT_RENEW_ARRAY( axis->segments, old_max, new_max ) ) + goto Exit; + } + + axis->max_segments = new_max; + } + + segment = axis->segments + axis->num_segments++; + + Exit: + *asegment = segment; + return error; + } + + + /* Get new edge for given axis, direction, and position, */ + /* without initializing the edge itself. */ + + FT_LOCAL( FT_Error ) + af_axis_hints_new_edge( AF_AxisHints axis, + FT_Int fpos, + AF_Direction dir, + FT_Bool top_to_bottom_hinting, + FT_Memory memory, + AF_Edge *anedge ) + { + FT_Error error = FT_Err_Ok; + AF_Edge edge = NULL; + AF_Edge edges; + + + if ( axis->num_edges < AF_EDGES_EMBEDDED ) + { + if ( !axis->edges ) + { + axis->edges = axis->embedded.edges; + axis->max_edges = AF_EDGES_EMBEDDED; + } + } + else if ( axis->num_edges >= axis->max_edges ) + { + FT_Int old_max = axis->max_edges; + FT_Int new_max = old_max; + FT_Int big_max = (FT_Int)( FT_INT_MAX / sizeof ( *edge ) ); + + + if ( old_max >= big_max ) + { + error = FT_THROW( Out_Of_Memory ); + goto Exit; + } + + new_max += ( new_max >> 2 ) + 4; + if ( new_max < old_max || new_max > big_max ) + new_max = big_max; + + if ( axis->edges == axis->embedded.edges ) + { + if ( FT_NEW_ARRAY( axis->edges, new_max ) ) + goto Exit; + ft_memcpy( axis->edges, axis->embedded.edges, + sizeof ( axis->embedded.edges ) ); + } + else + { + if ( FT_RENEW_ARRAY( axis->edges, old_max, new_max ) ) + goto Exit; + } + + axis->max_edges = new_max; + } + + edges = axis->edges; + edge = edges + axis->num_edges; + + while ( edge > edges ) + { + if ( top_to_bottom_hinting ? ( edge[-1].fpos > fpos ) + : ( edge[-1].fpos < fpos ) ) + break; + + /* we want the edge with same position and minor direction */ + /* to appear before those in the major one in the list */ + if ( edge[-1].fpos == fpos && dir == axis->major_dir ) + break; + + edge[0] = edge[-1]; + edge--; + } + + axis->num_edges++; + + Exit: + *anedge = edge; + return error; + } + + +#ifdef FT_DEBUG_AUTOFIT + +#include FT_CONFIG_STANDARD_LIBRARY_H + + /* The dump functions are used in the `ftgrid' demo program, too. */ +#define AF_DUMP( varformat ) \ + do \ + { \ + if ( to_stdout ) \ + printf varformat; \ + else \ + FT_TRACE7( varformat ); \ + } while ( 0 ) + + + static const char* + af_dir_str( AF_Direction dir ) + { + const char* result; + + + switch ( dir ) + { + case AF_DIR_UP: + result = "up"; + break; + case AF_DIR_DOWN: + result = "down"; + break; + case AF_DIR_LEFT: + result = "left"; + break; + case AF_DIR_RIGHT: + result = "right"; + break; + default: + result = "none"; + } + + return result; + } + + +#define AF_INDEX_NUM( ptr, base ) (int)( (ptr) ? ( (ptr) - (base) ) : -1 ) + + + static char* + af_print_idx( char* p, + int idx ) + { + if ( idx == -1 ) + { + p[0] = '-'; + p[1] = '-'; + p[2] = '\0'; + } + else + ft_sprintf( p, "%d", idx ); + + return p; + } + + + static int + af_get_segment_index( AF_GlyphHints hints, + int point_idx, + int dimension ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Point point = hints->points + point_idx; + AF_Segment segments = axis->segments; + AF_Segment limit = segments + axis->num_segments; + AF_Segment segment; + + + for ( segment = segments; segment < limit; segment++ ) + { + if ( segment->first <= segment->last ) + { + if ( point >= segment->first && point <= segment->last ) + break; + } + else + { + AF_Point p = segment->first; + + + for (;;) + { + if ( point == p ) + goto Exit; + + if ( p == segment->last ) + break; + + p = p->next; + } + } + } + + Exit: + if ( segment == limit ) + return -1; + + return (int)( segment - segments ); + } + + + static int + af_get_edge_index( AF_GlyphHints hints, + int segment_idx, + int dimension ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Edge edges = axis->edges; + AF_Segment segment = axis->segments + segment_idx; + + + return segment_idx == -1 ? -1 : AF_INDEX_NUM( segment->edge, edges ); + } + + +#ifdef __cplusplus + extern "C" { +#endif + void + af_glyph_hints_dump_points( AF_GlyphHints hints, + FT_Bool to_stdout ) + { + AF_Point points = hints->points; + AF_Point limit = points + hints->num_points; + AF_Point* contour = hints->contours; + AF_Point* climit = contour + hints->num_contours; + AF_Point point; + + + AF_DUMP(( "Table of points:\n" )); + + if ( hints->num_points ) + { + AF_DUMP(( " index hedge hseg vedge vseg flags " + /* " XXXXX XXXXX XXXXX XXXXX XXXXX XXXXXX" */ + " xorg yorg xscale yscale xfit yfit" )); + /* " XXXXX XXXXX XXXX.XX XXXX.XX XXXX.XX XXXX.XX" */ + } + else + AF_DUMP(( " (none)\n" )); + + for ( point = points; point < limit; point++ ) + { + int point_idx = AF_INDEX_NUM( point, points ); + int segment_idx_0 = af_get_segment_index( hints, point_idx, 0 ); + int segment_idx_1 = af_get_segment_index( hints, point_idx, 1 ); + + char buf1[16], buf2[16], buf3[16], buf4[16]; + + + /* insert extra newline at the beginning of a contour */ + if ( contour < climit && *contour == point ) + { + AF_DUMP(( "\n" )); + contour++; + } + + AF_DUMP(( " %5d %5s %5s %5s %5s %s" + " %5d %5d %7.2f %7.2f %7.2f %7.2f\n", + point_idx, + af_print_idx( buf1, + af_get_edge_index( hints, segment_idx_1, 1 ) ), + af_print_idx( buf2, segment_idx_1 ), + af_print_idx( buf3, + af_get_edge_index( hints, segment_idx_0, 0 ) ), + af_print_idx( buf4, segment_idx_0 ), + ( point->flags & AF_FLAG_NEAR ) + ? " near " + : ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) + ? " weak " + : "strong", + + point->fx, + point->fy, + point->ox / 64.0, + point->oy / 64.0, + point->x / 64.0, + point->y / 64.0 )); + } + AF_DUMP(( "\n" )); + } +#ifdef __cplusplus + } +#endif + + + static const char* + af_edge_flags_to_string( FT_UInt flags ) + { + static char temp[32]; + int pos = 0; + + + if ( flags & AF_EDGE_ROUND ) + { + ft_memcpy( temp + pos, "round", 5 ); + pos += 5; + } + if ( flags & AF_EDGE_SERIF ) + { + if ( pos > 0 ) + temp[pos++] = ' '; + ft_memcpy( temp + pos, "serif", 5 ); + pos += 5; + } + if ( pos == 0 ) + return "normal"; + + temp[pos] = '\0'; + + return temp; + } + + + /* Dump the array of linked segments. */ + +#ifdef __cplusplus + extern "C" { +#endif + void + af_glyph_hints_dump_segments( AF_GlyphHints hints, + FT_Bool to_stdout ) + { + FT_Int dimension; + + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Point points = hints->points; + AF_Edge edges = axis->edges; + AF_Segment segments = axis->segments; + AF_Segment limit = segments + axis->num_segments; + AF_Segment seg; + + char buf1[16], buf2[16], buf3[16]; + + + AF_DUMP(( "Table of %s segments:\n", + dimension == AF_DIMENSION_HORZ ? "vertical" + : "horizontal" )); + if ( axis->num_segments ) + { + AF_DUMP(( " index pos delta dir from to " + /* " XXXXX XXXXX XXXXX XXXXX XXXX XXXX" */ + " link serif edge" + /* " XXXX XXXXX XXXX" */ + " height extra flags\n" )); + /* " XXXXXX XXXXX XXXXXXXXXXX" */ + } + else + AF_DUMP(( " (none)\n" )); + + for ( seg = segments; seg < limit; seg++ ) + AF_DUMP(( " %5d %5d %5d %5s %4d %4d" + " %4s %5s %4s" + " %6d %5d %11s\n", + AF_INDEX_NUM( seg, segments ), + seg->pos, + seg->delta, + af_dir_str( (AF_Direction)seg->dir ), + AF_INDEX_NUM( seg->first, points ), + AF_INDEX_NUM( seg->last, points ), + + af_print_idx( buf1, AF_INDEX_NUM( seg->link, segments ) ), + af_print_idx( buf2, AF_INDEX_NUM( seg->serif, segments ) ), + af_print_idx( buf3, AF_INDEX_NUM( seg->edge, edges ) ), + + seg->height, + seg->height - ( seg->max_coord - seg->min_coord ), + af_edge_flags_to_string( seg->flags ) )); + AF_DUMP(( "\n" )); + } + } +#ifdef __cplusplus + } +#endif + + + /* Fetch number of segments. */ + +#ifdef __cplusplus + extern "C" { +#endif + FT_Error + af_glyph_hints_get_num_segments( AF_GlyphHints hints, + FT_Int dimension, + FT_Int* num_segments ) + { + AF_Dimension dim; + AF_AxisHints axis; + + + dim = ( dimension == 0 ) ? AF_DIMENSION_HORZ : AF_DIMENSION_VERT; + + axis = &hints->axis[dim]; + *num_segments = axis->num_segments; + + return FT_Err_Ok; + } +#ifdef __cplusplus + } +#endif + + + /* Fetch offset of segments into user supplied offset array. */ + +#ifdef __cplusplus + extern "C" { +#endif + FT_Error + af_glyph_hints_get_segment_offset( AF_GlyphHints hints, + FT_Int dimension, + FT_Int idx, + FT_Pos *offset, + FT_Bool *is_blue, + FT_Pos *blue_offset ) + { + AF_Dimension dim; + AF_AxisHints axis; + AF_Segment seg; + + + if ( !offset ) + return FT_THROW( Invalid_Argument ); + + dim = ( dimension == 0 ) ? AF_DIMENSION_HORZ : AF_DIMENSION_VERT; + + axis = &hints->axis[dim]; + + if ( idx < 0 || idx >= axis->num_segments ) + return FT_THROW( Invalid_Argument ); + + seg = &axis->segments[idx]; + *offset = ( dim == AF_DIMENSION_HORZ ) ? seg->first->fx + : seg->first->fy; + if ( seg->edge ) + *is_blue = (FT_Bool)( seg->edge->blue_edge != 0 ); + else + *is_blue = FALSE; + + if ( *is_blue ) + *blue_offset = seg->edge->blue_edge->org; + else + *blue_offset = 0; + + return FT_Err_Ok; + } +#ifdef __cplusplus + } +#endif + + + /* Dump the array of linked edges. */ + +#ifdef __cplusplus + extern "C" { +#endif + void + af_glyph_hints_dump_edges( AF_GlyphHints hints, + FT_Bool to_stdout ) + { + FT_Int dimension; + + + for ( dimension = 1; dimension >= 0; dimension-- ) + { + AF_AxisHints axis = &hints->axis[dimension]; + AF_Edge edges = axis->edges; + AF_Edge limit = edges + axis->num_edges; + AF_Edge edge; + + char buf1[16], buf2[16]; + + + /* + * note: AF_DIMENSION_HORZ corresponds to _vertical_ edges + * since they have a constant X coordinate. + */ + if ( dimension == AF_DIMENSION_HORZ ) + AF_DUMP(( "Table of %s edges (1px=%.2fu, 10u=%.2fpx):\n", + "vertical", + 65536.0 * 64.0 / hints->x_scale, + 10.0 * hints->x_scale / 65536.0 / 64.0 )); + else + AF_DUMP(( "Table of %s edges (1px=%.2fu, 10u=%.2fpx):\n", + "horizontal", + 65536.0 * 64.0 / hints->y_scale, + 10.0 * hints->y_scale / 65536.0 / 64.0 )); + + if ( axis->num_edges ) + { + AF_DUMP(( " index pos dir link serif" + /* " XXXXX XXXX.XX XXXXX XXXX XXXXX" */ + " blue opos pos flags\n" )); + /* " X XXXX.XX XXXX.XX XXXXXXXXXXX" */ + } + else + AF_DUMP(( " (none)\n" )); + + for ( edge = edges; edge < limit; edge++ ) + AF_DUMP(( " %5d %7.2f %5s %4s %5s" + " %c %7.2f %7.2f %11s\n", + AF_INDEX_NUM( edge, edges ), + (int)edge->opos / 64.0, + af_dir_str( (AF_Direction)edge->dir ), + af_print_idx( buf1, AF_INDEX_NUM( edge->link, edges ) ), + af_print_idx( buf2, AF_INDEX_NUM( edge->serif, edges ) ), + + edge->blue_edge ? 'y' : 'n', + edge->opos / 64.0, + edge->pos / 64.0, + af_edge_flags_to_string( edge->flags ) )); + AF_DUMP(( "\n" )); + } + } +#ifdef __cplusplus + } +#endif + +#undef AF_DUMP + +#endif /* !FT_DEBUG_AUTOFIT */ + + + /* Compute the direction value of a given vector. */ + + FT_LOCAL_DEF( AF_Direction ) + af_direction_compute( FT_Pos dx, + FT_Pos dy ) + { + FT_Pos ll, ss; /* long and short arm lengths */ + AF_Direction dir; /* candidate direction */ + + + if ( dy >= dx ) + { + if ( dy >= -dx ) + { + dir = AF_DIR_UP; + ll = dy; + ss = dx; + } + else + { + dir = AF_DIR_LEFT; + ll = -dx; + ss = dy; + } + } + else /* dy < dx */ + { + if ( dy >= -dx ) + { + dir = AF_DIR_RIGHT; + ll = dx; + ss = dy; + } + else + { + dir = AF_DIR_DOWN; + ll = -dy; + ss = dx; + } + } + + /* return no direction if arm lengths do not differ enough */ + /* (value 14 is heuristic, corresponding to approx. 4.1 degrees) */ + /* the long arm is never negative */ + if ( ll <= 14 * FT_ABS( ss ) ) + dir = AF_DIR_NONE; + + return dir; + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_init( AF_GlyphHints hints, + FT_Memory memory ) + { + /* no need to initialize the embedded items */ + FT_MEM_ZERO( hints, sizeof ( *hints ) - sizeof ( hints->embedded ) ); + hints->memory = memory; + } + + + FT_LOCAL_DEF( void ) + af_glyph_hints_done( AF_GlyphHints hints ) + { + FT_Memory memory; + int dim; + + + if ( !( hints && hints->memory ) ) + return; + + memory = hints->memory; + + /* + * note that we don't need to free the segment and edge + * buffers since they are really within the hints->points array + */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_AxisHints axis = &hints->axis[dim]; + + + axis->num_segments = 0; + axis->max_segments = 0; + if ( axis->segments != axis->embedded.segments ) + FT_FREE( axis->segments ); + + axis->num_edges = 0; + axis->max_edges = 0; + if ( axis->edges != axis->embedded.edges ) + FT_FREE( axis->edges ); + } + + if ( hints->contours != hints->embedded.contours ) + FT_FREE( hints->contours ); + hints->max_contours = 0; + hints->num_contours = 0; + + if ( hints->points != hints->embedded.points ) + FT_FREE( hints->points ); + hints->max_points = 0; + hints->num_points = 0; + + hints->memory = NULL; + } + + + /* Reset metrics. */ + + FT_LOCAL_DEF( void ) + af_glyph_hints_rescale( AF_GlyphHints hints, + AF_StyleMetrics metrics ) + { + hints->metrics = metrics; + hints->scaler_flags = metrics->scaler.flags; + } + + + /* Recompute all AF_Point in AF_GlyphHints from the definitions */ + /* in a source outline. */ + + FT_LOCAL_DEF( FT_Error ) + af_glyph_hints_reload( AF_GlyphHints hints, + FT_Outline* outline ) + { + FT_Error error = FT_Err_Ok; + AF_Point points; + FT_UInt old_max, new_max; + FT_Fixed x_scale = hints->x_scale; + FT_Fixed y_scale = hints->y_scale; + FT_Pos x_delta = hints->x_delta; + FT_Pos y_delta = hints->y_delta; + FT_Memory memory = hints->memory; + + + hints->num_points = 0; + hints->num_contours = 0; + + hints->axis[0].num_segments = 0; + hints->axis[0].num_edges = 0; + hints->axis[1].num_segments = 0; + hints->axis[1].num_edges = 0; + + /* first of all, reallocate the contours array if necessary */ + new_max = (FT_UInt)outline->n_contours; + old_max = (FT_UInt)hints->max_contours; + + if ( new_max <= AF_CONTOURS_EMBEDDED ) + { + if ( !hints->contours ) + { + hints->contours = hints->embedded.contours; + hints->max_contours = AF_CONTOURS_EMBEDDED; + } + } + else if ( new_max > old_max ) + { + if ( hints->contours == hints->embedded.contours ) + hints->contours = NULL; + + new_max = ( new_max + 3 ) & ~3U; /* round up to a multiple of 4 */ + + if ( FT_RENEW_ARRAY( hints->contours, old_max, new_max ) ) + goto Exit; + + hints->max_contours = (FT_Int)new_max; + } + + /* + * then reallocate the points arrays if necessary -- + * note that we reserve two additional point positions, used to + * hint metrics appropriately + */ + new_max = (FT_UInt)( outline->n_points + 2 ); + old_max = (FT_UInt)hints->max_points; + + if ( new_max <= AF_POINTS_EMBEDDED ) + { + if ( !hints->points ) + { + hints->points = hints->embedded.points; + hints->max_points = AF_POINTS_EMBEDDED; + } + } + else if ( new_max > old_max ) + { + if ( hints->points == hints->embedded.points ) + hints->points = NULL; + + new_max = ( new_max + 2 + 7 ) & ~7U; /* round up to a multiple of 8 */ + + if ( FT_RENEW_ARRAY( hints->points, old_max, new_max ) ) + goto Exit; + + hints->max_points = (FT_Int)new_max; + } + + hints->num_points = outline->n_points; + hints->num_contours = outline->n_contours; + + /* We can't rely on the value of `FT_Outline.flags' to know the fill */ + /* direction used for a glyph, given that some fonts are broken (e.g., */ + /* the Arphic ones). We thus recompute it each time we need to. */ + /* */ + hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_UP; + hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_LEFT; + + if ( FT_Outline_Get_Orientation( outline ) == FT_ORIENTATION_POSTSCRIPT ) + { + hints->axis[AF_DIMENSION_HORZ].major_dir = AF_DIR_DOWN; + hints->axis[AF_DIMENSION_VERT].major_dir = AF_DIR_RIGHT; + } + + hints->x_scale = x_scale; + hints->y_scale = y_scale; + hints->x_delta = x_delta; + hints->y_delta = y_delta; + + hints->xmin_delta = 0; + hints->xmax_delta = 0; + + points = hints->points; + if ( hints->num_points == 0 ) + goto Exit; + + { + AF_Point point; + AF_Point point_limit = points + hints->num_points; + + /* value 20 in `near_limit' is heuristic */ + FT_UInt units_per_em = hints->metrics->scaler.face->units_per_EM; + FT_Int near_limit = 20 * units_per_em / 2048; + + + /* compute coordinates & Bezier flags, next and prev */ + { + FT_Vector* vec = outline->points; + char* tag = outline->tags; + FT_Short endpoint = outline->contours[0]; + AF_Point end = points + endpoint; + AF_Point prev = end; + FT_Int contour_index = 0; + + + for ( point = points; point < point_limit; point++, vec++, tag++ ) + { + FT_Pos out_x, out_y; + + + point->in_dir = (FT_Char)AF_DIR_NONE; + point->out_dir = (FT_Char)AF_DIR_NONE; + + point->fx = (FT_Short)vec->x; + point->fy = (FT_Short)vec->y; + point->ox = point->x = FT_MulFix( vec->x, x_scale ) + x_delta; + point->oy = point->y = FT_MulFix( vec->y, y_scale ) + y_delta; + + end->fx = (FT_Short)outline->points[endpoint].x; + end->fy = (FT_Short)outline->points[endpoint].y; + + switch ( FT_CURVE_TAG( *tag ) ) + { + case FT_CURVE_TAG_CONIC: + point->flags = AF_FLAG_CONIC; + break; + case FT_CURVE_TAG_CUBIC: + point->flags = AF_FLAG_CUBIC; + break; + default: + point->flags = AF_FLAG_NONE; + } + + out_x = point->fx - prev->fx; + out_y = point->fy - prev->fy; + + if ( FT_ABS( out_x ) + FT_ABS( out_y ) < near_limit ) + prev->flags |= AF_FLAG_NEAR; + + point->prev = prev; + prev->next = point; + prev = point; + + if ( point == end ) + { + if ( ++contour_index < outline->n_contours ) + { + endpoint = outline->contours[contour_index]; + end = points + endpoint; + prev = end; + } + } + } + } + + /* set up the contours array */ + { + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + short* end = outline->contours; + short idx = 0; + + + for ( ; contour < contour_limit; contour++, end++ ) + { + contour[0] = points + idx; + idx = (short)( end[0] + 1 ); + } + } + + { + /* + * Compute directions of `in' and `out' vectors. + * + * Note that distances between points that are very near to each + * other are accumulated. In other words, the auto-hinter either + * prepends the small vectors between near points to the first + * non-near vector, or the sum of small vector lengths exceeds a + * threshold, thus `grouping' the small vectors. All intermediate + * points are tagged as weak; the directions are adjusted also to + * be equal to the accumulated one. + */ + + FT_Int near_limit2 = 2 * near_limit - 1; + + AF_Point* contour; + AF_Point* contour_limit = hints->contours + hints->num_contours; + + + for ( contour = hints->contours; contour < contour_limit; contour++ ) + { + AF_Point first = *contour; + AF_Point next, prev, curr; + + FT_Pos out_x, out_y; + + + /* since the first point of a contour could be part of a */ + /* series of near points, go backwards to find the first */ + /* non-near point and adjust `first' */ + + point = first; + prev = first->prev; + + while ( prev != first ) + { + out_x = point->fx - prev->fx; + out_y = point->fy - prev->fy; + + /* + * We use Taxicab metrics to measure the vector length. + * + * Note that the accumulated distances so far could have the + * opposite direction of the distance measured here. For this + * reason we use `near_limit2' for the comparison to get a + * non-near point even in the worst case. + */ + if ( FT_ABS( out_x ) + FT_ABS( out_y ) >= near_limit2 ) + break; + + point = prev; + prev = prev->prev; + } + + /* adjust first point */ + first = point; + + /* now loop over all points of the contour to get */ + /* `in' and `out' vector directions */ + + curr = first; + + /* + * We abuse the `u' and `v' fields to store index deltas to the + * next and previous non-near point, respectively. + * + * To avoid problems with not having non-near points, we point to + * `first' by default as the next non-near point. + * + */ + curr->u = (FT_Pos)( first - curr ); + first->v = -curr->u; + + out_x = 0; + out_y = 0; + + next = first; + do + { + AF_Direction out_dir; + + + point = next; + next = point->next; + + out_x += next->fx - point->fx; + out_y += next->fy - point->fy; + + if ( FT_ABS( out_x ) + FT_ABS( out_y ) < near_limit ) + { + next->flags |= AF_FLAG_WEAK_INTERPOLATION; + continue; + } + + curr->u = (FT_Pos)( next - curr ); + next->v = -curr->u; + + out_dir = af_direction_compute( out_x, out_y ); + + /* adjust directions for all points inbetween; */ + /* the loop also updates position of `curr' */ + curr->out_dir = (FT_Char)out_dir; + for ( curr = curr->next; curr != next; curr = curr->next ) + { + curr->in_dir = (FT_Char)out_dir; + curr->out_dir = (FT_Char)out_dir; + } + next->in_dir = (FT_Char)out_dir; + + curr->u = (FT_Pos)( first - curr ); + first->v = -curr->u; + + out_x = 0; + out_y = 0; + + } while ( next != first ); + } + + /* + * The next step is to `simplify' an outline's topology so that we + * can identify local extrema more reliably: A series of + * non-horizontal or non-vertical vectors pointing into the same + * quadrant are handled as a single, long vector. From a + * topological point of the view, the intermediate points are of no + * interest and thus tagged as weak. + */ + + for ( point = points; point < point_limit; point++ ) + { + if ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) + continue; + + if ( point->in_dir == AF_DIR_NONE && + point->out_dir == AF_DIR_NONE ) + { + /* check whether both vectors point into the same quadrant */ + + FT_Pos in_x, in_y; + FT_Pos out_x, out_y; + + AF_Point next_u = point + point->u; + AF_Point prev_v = point + point->v; + + + in_x = point->fx - prev_v->fx; + in_y = point->fy - prev_v->fy; + + out_x = next_u->fx - point->fx; + out_y = next_u->fy - point->fy; + + if ( ( in_x ^ out_x ) >= 0 && ( in_y ^ out_y ) >= 0 ) + { + /* yes, so tag current point as weak */ + /* and update index deltas */ + + point->flags |= AF_FLAG_WEAK_INTERPOLATION; + + prev_v->u = (FT_Pos)( next_u - prev_v ); + next_u->v = -prev_v->u; + } + } + } + + /* + * Finally, check for remaining weak points. Everything else not + * collected in edges so far is then implicitly classified as strong + * points. + */ + + for ( point = points; point < point_limit; point++ ) + { + if ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) + continue; + + if ( point->flags & AF_FLAG_CONTROL ) + { + /* control points are always weak */ + Is_Weak_Point: + point->flags |= AF_FLAG_WEAK_INTERPOLATION; + } + else if ( point->out_dir == point->in_dir ) + { + if ( point->out_dir != AF_DIR_NONE ) + { + /* current point lies on a horizontal or */ + /* vertical segment (but doesn't start or end it) */ + goto Is_Weak_Point; + } + + { + AF_Point next_u = point + point->u; + AF_Point prev_v = point + point->v; + + + if ( ft_corner_is_flat( point->fx - prev_v->fx, + point->fy - prev_v->fy, + next_u->fx - point->fx, + next_u->fy - point->fy ) ) + { + /* either the `in' or the `out' vector is much more */ + /* dominant than the other one, so tag current point */ + /* as weak and update index deltas */ + + prev_v->u = (FT_Pos)( next_u - prev_v ); + next_u->v = -prev_v->u; + + goto Is_Weak_Point; + } + } + } + else if ( point->in_dir == -point->out_dir ) + { + /* current point forms a spike */ + goto Is_Weak_Point; + } + } + } + } + + Exit: + return error; + } + + + /* Store the hinted outline in an FT_Outline structure. */ + + FT_LOCAL_DEF( void ) + af_glyph_hints_save( AF_GlyphHints hints, + FT_Outline* outline ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + FT_Vector* vec = outline->points; + char* tag = outline->tags; + + + for ( ; point < limit; point++, vec++, tag++ ) + { + vec->x = point->x; + vec->y = point->y; + + if ( point->flags & AF_FLAG_CONIC ) + tag[0] = FT_CURVE_TAG_CONIC; + else if ( point->flags & AF_FLAG_CUBIC ) + tag[0] = FT_CURVE_TAG_CUBIC; + else + tag[0] = FT_CURVE_TAG_ON; + } + } + + + /**************************************************************** + * + * EDGE POINT GRID-FITTING + * + ****************************************************************/ + + + /* Align all points of an edge to the same coordinate value, */ + /* either horizontally or vertically. */ + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = & hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + + if ( dim == AF_DIMENSION_HORZ ) + { + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge edge = seg->edge; + AF_Point point, first, last; + + + if ( !edge ) + continue; + + first = seg->first; + last = seg->last; + point = first; + for (;;) + { + point->x = edge->pos; + point->flags |= AF_FLAG_TOUCH_X; + + if ( point == last ) + break; + + point = point->next; + } + } + } + else + { + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge edge = seg->edge; + AF_Point point, first, last; + + + if ( !edge ) + continue; + + first = seg->first; + last = seg->last; + point = first; + for (;;) + { + point->y = edge->pos; + point->flags |= AF_FLAG_TOUCH_Y; + + if ( point == last ) + break; + + point = point->next; + } + } + } + } + + + /**************************************************************** + * + * STRONG POINT INTERPOLATION + * + ****************************************************************/ + + + /* Hint the strong points -- this is equivalent to the TrueType `IP' */ + /* hinting instruction. */ + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_strong_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_Point points = hints->points; + AF_Point point_limit = points + hints->num_points; + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + FT_UInt touch_flag; + + + if ( dim == AF_DIMENSION_HORZ ) + touch_flag = AF_FLAG_TOUCH_X; + else + touch_flag = AF_FLAG_TOUCH_Y; + + if ( edges < edge_limit ) + { + AF_Point point; + AF_Edge edge; + + + for ( point = points; point < point_limit; point++ ) + { + FT_Pos u, ou, fu; /* point position */ + FT_Pos delta; + + + if ( point->flags & touch_flag ) + continue; + + /* if this point is candidate to weak interpolation, we */ + /* interpolate it after all strong points have been processed */ + + if ( ( point->flags & AF_FLAG_WEAK_INTERPOLATION ) ) + continue; + + if ( dim == AF_DIMENSION_VERT ) + { + u = point->fy; + ou = point->oy; + } + else + { + u = point->fx; + ou = point->ox; + } + + fu = u; + + /* is the point before the first edge? */ + edge = edges; + delta = edge->fpos - u; + if ( delta >= 0 ) + { + u = edge->pos - ( edge->opos - ou ); + goto Store_Point; + } + + /* is the point after the last edge? */ + edge = edge_limit - 1; + delta = u - edge->fpos; + if ( delta >= 0 ) + { + u = edge->pos + ( ou - edge->opos ); + goto Store_Point; + } + + { + FT_PtrDist min, max, mid; + FT_Pos fpos; + + + /* find enclosing edges */ + min = 0; + max = edge_limit - edges; + +#if 1 + /* for a small number of edges, a linear search is better */ + if ( max <= 8 ) + { + FT_PtrDist nn; + + + for ( nn = 0; nn < max; nn++ ) + if ( edges[nn].fpos >= u ) + break; + + if ( edges[nn].fpos == u ) + { + u = edges[nn].pos; + goto Store_Point; + } + min = nn; + } + else +#endif + while ( min < max ) + { + mid = ( max + min ) >> 1; + edge = edges + mid; + fpos = edge->fpos; + + if ( u < fpos ) + max = mid; + else if ( u > fpos ) + min = mid + 1; + else + { + /* we are on the edge */ + u = edge->pos; + goto Store_Point; + } + } + + /* point is not on an edge */ + { + AF_Edge before = edges + min - 1; + AF_Edge after = edges + min + 0; + + + /* assert( before && after && before != after ) */ + if ( before->scale == 0 ) + before->scale = FT_DivFix( after->pos - before->pos, + after->fpos - before->fpos ); + + u = before->pos + FT_MulFix( fu - before->fpos, + before->scale ); + } + } + + Store_Point: + /* save the point position */ + if ( dim == AF_DIMENSION_HORZ ) + point->x = u; + else + point->y = u; + + point->flags |= touch_flag; + } + } + } + + + /**************************************************************** + * + * WEAK POINT INTERPOLATION + * + ****************************************************************/ + + + /* Shift the original coordinates of all points between `p1' and */ + /* `p2' to get hinted coordinates, using the same difference as */ + /* given by `ref'. */ + + static void + af_iup_shift( AF_Point p1, + AF_Point p2, + AF_Point ref ) + { + AF_Point p; + FT_Pos delta = ref->u - ref->v; + + + if ( delta == 0 ) + return; + + for ( p = p1; p < ref; p++ ) + p->u = p->v + delta; + + for ( p = ref + 1; p <= p2; p++ ) + p->u = p->v + delta; + } + + + /* Interpolate the original coordinates of all points between `p1' and */ + /* `p2' to get hinted coordinates, using `ref1' and `ref2' as the */ + /* reference points. The `u' and `v' members are the current and */ + /* original coordinate values, respectively. */ + /* */ + /* Details can be found in the TrueType bytecode specification. */ + + static void + af_iup_interp( AF_Point p1, + AF_Point p2, + AF_Point ref1, + AF_Point ref2 ) + { + AF_Point p; + FT_Pos u, v1, v2, u1, u2, d1, d2; + + + if ( p1 > p2 ) + return; + + if ( ref1->v > ref2->v ) + { + p = ref1; + ref1 = ref2; + ref2 = p; + } + + v1 = ref1->v; + v2 = ref2->v; + u1 = ref1->u; + u2 = ref2->u; + d1 = u1 - v1; + d2 = u2 - v2; + + if ( u1 == u2 || v1 == v2 ) + { + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v1 ) + u += d1; + else if ( u >= v2 ) + u += d2; + else + u = u1; + + p->u = u; + } + } + else + { + FT_Fixed scale = FT_DivFix( u2 - u1, v2 - v1 ); + + + for ( p = p1; p <= p2; p++ ) + { + u = p->v; + + if ( u <= v1 ) + u += d1; + else if ( u >= v2 ) + u += d2; + else + u = u1 + FT_MulFix( u - v1, scale ); + + p->u = u; + } + } + } + + + /* Hint the weak points -- this is equivalent to the TrueType `IUP' */ + /* hinting instruction. */ + + FT_LOCAL_DEF( void ) + af_glyph_hints_align_weak_points( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_Point points = hints->points; + AF_Point point_limit = points + hints->num_points; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + FT_UInt touch_flag; + AF_Point point; + AF_Point end_point; + AF_Point first_point; + + + /* PASS 1: Move segment points to edge positions */ + + if ( dim == AF_DIMENSION_HORZ ) + { + touch_flag = AF_FLAG_TOUCH_X; + + for ( point = points; point < point_limit; point++ ) + { + point->u = point->x; + point->v = point->ox; + } + } + else + { + touch_flag = AF_FLAG_TOUCH_Y; + + for ( point = points; point < point_limit; point++ ) + { + point->u = point->y; + point->v = point->oy; + } + } + + for ( ; contour < contour_limit; contour++ ) + { + AF_Point first_touched, last_touched; + + + point = *contour; + end_point = point->prev; + first_point = point; + + /* find first touched point */ + for (;;) + { + if ( point > end_point ) /* no touched point in contour */ + goto NextContour; + + if ( point->flags & touch_flag ) + break; + + point++; + } + + first_touched = point; + + for (;;) + { + FT_ASSERT( point <= end_point && + ( point->flags & touch_flag ) != 0 ); + + /* skip any touched neighbours */ + while ( point < end_point && + ( point[1].flags & touch_flag ) != 0 ) + point++; + + last_touched = point; + + /* find the next touched point, if any */ + point++; + for (;;) + { + if ( point > end_point ) + goto EndContour; + + if ( ( point->flags & touch_flag ) != 0 ) + break; + + point++; + } + + /* interpolate between last_touched and point */ + af_iup_interp( last_touched + 1, point - 1, + last_touched, point ); + } + + EndContour: + /* special case: only one point was touched */ + if ( last_touched == first_touched ) + af_iup_shift( first_point, end_point, first_touched ); + + else /* interpolate the last part */ + { + if ( last_touched < end_point ) + af_iup_interp( last_touched + 1, end_point, + last_touched, first_touched ); + + if ( first_touched > points ) + af_iup_interp( first_point, first_touched - 1, + last_touched, first_touched ); + } + + NextContour: + ; + } + + /* now save the interpolated values back to x/y */ + if ( dim == AF_DIMENSION_HORZ ) + { + for ( point = points; point < point_limit; point++ ) + point->x = point->u; + } + else + { + for ( point = points; point < point_limit; point++ ) + point->y = point->u; + } + } + + +#ifdef AF_CONFIG_OPTION_USE_WARPER + + /* Apply (small) warp scale and warp delta for given dimension. */ + + FT_LOCAL_DEF( void ) + af_glyph_hints_scale_dim( AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed scale, + FT_Pos delta ) + { + AF_Point points = hints->points; + AF_Point points_limit = points + hints->num_points; + AF_Point point; + + + if ( dim == AF_DIMENSION_HORZ ) + { + for ( point = points; point < points_limit; point++ ) + point->x = FT_MulFix( point->fx, scale ) + delta; + } + else + { + for ( point = points; point < points_limit; point++ ) + point->y = FT_MulFix( point->fy, scale ) + delta; + } + } + +#endif /* AF_CONFIG_OPTION_USE_WARPER */ + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afhints.h b/vendor/FreeType2/src/autofit/afhints.h new file mode 100644 index 0000000..3326ebc --- /dev/null +++ b/vendor/FreeType2/src/autofit/afhints.h @@ -0,0 +1,481 @@ +/***************************************************************************/ +/* */ +/* afhints.h */ +/* */ +/* Auto-fitter hinting routines (specification). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AFHINTS_H_ +#define AFHINTS_H_ + +#include "aftypes.h" + +#define xxAF_SORT_SEGMENTS + +FT_BEGIN_HEADER + + /* + * The definition of outline glyph hints. These are shared by all + * writing system analysis routines (until now). + */ + + typedef enum AF_Dimension_ + { + AF_DIMENSION_HORZ = 0, /* x coordinates, */ + /* i.e., vertical segments & edges */ + AF_DIMENSION_VERT = 1, /* y coordinates, */ + /* i.e., horizontal segments & edges */ + + AF_DIMENSION_MAX /* do not remove */ + + } AF_Dimension; + + + /* hint directions -- the values are computed so that two vectors are */ + /* in opposite directions iff `dir1 + dir2 == 0' */ + typedef enum AF_Direction_ + { + AF_DIR_NONE = 4, + AF_DIR_RIGHT = 1, + AF_DIR_LEFT = -1, + AF_DIR_UP = 2, + AF_DIR_DOWN = -2 + + } AF_Direction; + + + /* + * The following explanations are mostly taken from the article + * + * Real-Time Grid Fitting of Typographic Outlines + * + * by David Turner and Werner Lemberg + * + * https://www.tug.org/TUGboat/Articles/tb24-3/lemberg.pdf + * + * with appropriate updates. + * + * + * Segments + * + * `af_{cjk,latin,...}_hints_compute_segments' are the functions to + * find segments in an outline. + * + * A segment is a series of at least two consecutive points that are + * approximately aligned along a coordinate axis. The analysis to do + * so is specific to a writing system. + * + * + * Edges + * + * `af_{cjk,latin,...}_hints_compute_edges' are the functions to find + * edges. + * + * As soon as segments are defined, the auto-hinter groups them into + * edges. An edge corresponds to a single position on the main + * dimension that collects one or more segments (allowing for a small + * threshold). + * + * As an example, the `latin' writing system first tries to grid-fit + * edges, then to align segments on the edges unless it detects that + * they form a serif. + * + * + * A H + * | | + * | | + * | | + * | | + * C | | F + * +------<-----+ +-----<------+ + * | B G | + * | | + * | | + * +--------------->------------------+ + * D E + * + * + * Stems + * + * Stems are detected by `af_{cjk,latin,...}_hint_edges'. + * + * Segments need to be `linked' to other ones in order to detect stems. + * A stem is made of two segments that face each other in opposite + * directions and that are sufficiently close to each other. Using + * vocabulary from the TrueType specification, stem segments form a + * `black distance'. + * + * In the above ASCII drawing, the horizontal segments are BC, DE, and + * FG; the vertical segments are AB, CD, EF, and GH. + * + * Each segment has at most one `best' candidate to form a black + * distance, or no candidate at all. Notice that two distinct segments + * can have the same candidate, which frequently means a serif. + * + * A stem is recognized by the following condition: + * + * best segment_1 = segment_2 && best segment_2 = segment_1 + * + * The best candidate is stored in field `link' in structure + * `AF_Segment'. + * + * In the above ASCII drawing, the best candidate for both AB and CD is + * GH, while the best candidate for GH is AB. Similarly, the best + * candidate for EF and GH is AB, while the best candidate for AB is + * GH. + * + * The detection and handling of stems is dependent on the writing + * system. + * + * + * Serifs + * + * Serifs are detected by `af_{cjk,latin,...}_hint_edges'. + * + * In comparison to a stem, a serif (as handled by the auto-hinter + * module that takes care of the `latin' writing system) has + * + * best segment_1 = segment_2 && best segment_2 != segment_1 + * + * where segment_1 corresponds to the serif segment (CD and EF in the + * above ASCII drawing). + * + * The best candidate is stored in field `serif' in structure + * `AF_Segment' (and `link' is set to NULL). + * + * + * Touched points + * + * A point is called `touched' if it has been processed somehow by the + * auto-hinter. It basically means that it shouldn't be moved again + * (or moved only under certain constraints to preserve the already + * applied processing). + * + * + * Flat and round segments + * + * Segments are `round' or `flat', depending on the series of points + * that define them. A segment is round if the next and previous point + * of an extremum (which can be either a single point or sequence of + * points) are both conic or cubic control points. Otherwise, a + * segment with an extremum is flat. + * + * + * Strong Points + * + * Experience has shown that points not part of an edge need to be + * interpolated linearly between their two closest edges, even if these + * are not part of the contour of those particular points. Typical + * candidates for this are + * + * - angle points (i.e., points where the `in' and `out' direction + * differ greatly) + * + * - inflection points (i.e., where the `in' and `out' angles are the + * same, but the curvature changes sign) [currently, such points + * aren't handled specially in the auto-hinter] + * + * `af_glyph_hints_align_strong_points' is the function that takes + * care of such situations; it is equivalent to the TrueType `IP' + * hinting instruction. + * + * + * Weak Points + * + * Other points in the outline must be interpolated using the + * coordinates of their previous and next unfitted contour neighbours. + * These are called `weak points' and are touched by the function + * `af_glyph_hints_align_weak_points', equivalent to the TrueType `IUP' + * hinting instruction. Typical candidates are control points and + * points on the contour without a major direction. + * + * The major effect is to reduce possible distortion caused by + * alignment of edges and strong points, thus weak points are processed + * after strong points. + */ + + + /* point hint flags */ +#define AF_FLAG_NONE 0 + + /* point type flags */ +#define AF_FLAG_CONIC ( 1U << 0 ) +#define AF_FLAG_CUBIC ( 1U << 1 ) +#define AF_FLAG_CONTROL ( AF_FLAG_CONIC | AF_FLAG_CUBIC ) + + /* point touch flags */ +#define AF_FLAG_TOUCH_X ( 1U << 2 ) +#define AF_FLAG_TOUCH_Y ( 1U << 3 ) + + /* candidates for weak interpolation have this flag set */ +#define AF_FLAG_WEAK_INTERPOLATION ( 1U << 4 ) + + /* the distance to the next point is very small */ +#define AF_FLAG_NEAR ( 1U << 5 ) + + + /* edge hint flags */ +#define AF_EDGE_NORMAL 0 +#define AF_EDGE_ROUND ( 1U << 0 ) +#define AF_EDGE_SERIF ( 1U << 1 ) +#define AF_EDGE_DONE ( 1U << 2 ) +#define AF_EDGE_NEUTRAL ( 1U << 3 ) /* edge aligns to a neutral blue zone */ + + + typedef struct AF_PointRec_* AF_Point; + typedef struct AF_SegmentRec_* AF_Segment; + typedef struct AF_EdgeRec_* AF_Edge; + + + typedef struct AF_PointRec_ + { + FT_UShort flags; /* point flags used by hinter */ + FT_Char in_dir; /* direction of inwards vector */ + FT_Char out_dir; /* direction of outwards vector */ + + FT_Pos ox, oy; /* original, scaled position */ + FT_Short fx, fy; /* original, unscaled position (in font units) */ + FT_Pos x, y; /* current position */ + FT_Pos u, v; /* current (x,y) or (y,x) depending on context */ + + AF_Point next; /* next point in contour */ + AF_Point prev; /* previous point in contour */ + + } AF_PointRec; + + + typedef struct AF_SegmentRec_ + { + FT_Byte flags; /* edge/segment flags for this segment */ + FT_Char dir; /* segment direction */ + FT_Short pos; /* position of segment */ + FT_Short delta; /* deviation from segment position */ + FT_Short min_coord; /* minimum coordinate of segment */ + FT_Short max_coord; /* maximum coordinate of segment */ + FT_Short height; /* the hinted segment height */ + + AF_Edge edge; /* the segment's parent edge */ + AF_Segment edge_next; /* link to next segment in parent edge */ + + AF_Segment link; /* (stem) link segment */ + AF_Segment serif; /* primary segment for serifs */ + FT_Pos score; /* used during stem matching */ + FT_Pos len; /* used during stem matching */ + + AF_Point first; /* first point in edge segment */ + AF_Point last; /* last point in edge segment */ + + } AF_SegmentRec; + + + typedef struct AF_EdgeRec_ + { + FT_Short fpos; /* original, unscaled position (in font units) */ + FT_Pos opos; /* original, scaled position */ + FT_Pos pos; /* current position */ + + FT_Byte flags; /* edge flags */ + FT_Char dir; /* edge direction */ + FT_Fixed scale; /* used to speed up interpolation between edges */ + + AF_Width blue_edge; /* non-NULL if this is a blue edge */ + AF_Edge link; /* link edge */ + AF_Edge serif; /* primary edge for serifs */ + FT_Int score; /* used during stem matching */ + + AF_Segment first; /* first segment in edge */ + AF_Segment last; /* last segment in edge */ + + } AF_EdgeRec; + +#define AF_SEGMENTS_EMBEDDED 18 /* number of embedded segments */ +#define AF_EDGES_EMBEDDED 12 /* number of embedded edges */ + + typedef struct AF_AxisHintsRec_ + { + FT_Int num_segments; /* number of used segments */ + FT_Int max_segments; /* number of allocated segments */ + AF_Segment segments; /* segments array */ +#ifdef AF_SORT_SEGMENTS + FT_Int mid_segments; +#endif + + FT_Int num_edges; /* number of used edges */ + FT_Int max_edges; /* number of allocated edges */ + AF_Edge edges; /* edges array */ + + AF_Direction major_dir; /* either vertical or horizontal */ + + /* two arrays to avoid allocation penalty */ + struct + { + AF_SegmentRec segments[AF_SEGMENTS_EMBEDDED]; + AF_EdgeRec edges[AF_EDGES_EMBEDDED]; + } embedded; + + + } AF_AxisHintsRec, *AF_AxisHints; + + +#define AF_POINTS_EMBEDDED 96 /* number of embedded points */ +#define AF_CONTOURS_EMBEDDED 8 /* number of embedded contours */ + + typedef struct AF_GlyphHintsRec_ + { + FT_Memory memory; + + FT_Fixed x_scale; + FT_Pos x_delta; + + FT_Fixed y_scale; + FT_Pos y_delta; + + FT_Int max_points; /* number of allocated points */ + FT_Int num_points; /* number of used points */ + AF_Point points; /* points array */ + + FT_Int max_contours; /* number of allocated contours */ + FT_Int num_contours; /* number of used contours */ + AF_Point* contours; /* contours array */ + + AF_AxisHintsRec axis[AF_DIMENSION_MAX]; + + FT_UInt32 scaler_flags; /* copy of scaler flags */ + FT_UInt32 other_flags; /* free for style-specific */ + /* implementations */ + AF_StyleMetrics metrics; + + FT_Pos xmin_delta; /* used for warping */ + FT_Pos xmax_delta; + + /* Two arrays to avoid allocation penalty. */ + /* The `embedded' structure must be the last element! */ + struct + { + AF_Point contours[AF_CONTOURS_EMBEDDED]; + AF_PointRec points[AF_POINTS_EMBEDDED]; + } embedded; + + } AF_GlyphHintsRec; + + +#define AF_HINTS_TEST_SCALER( h, f ) ( (h)->scaler_flags & (f) ) +#define AF_HINTS_TEST_OTHER( h, f ) ( (h)->other_flags & (f) ) + + +#ifdef FT_DEBUG_AUTOFIT + +#define AF_HINTS_DO_HORIZONTAL( h ) \ + ( !_af_debug_disable_horz_hints && \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) ) + +#define AF_HINTS_DO_VERTICAL( h ) \ + ( !_af_debug_disable_vert_hints && \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) ) + +#define AF_HINTS_DO_BLUES( h ) ( !_af_debug_disable_blue_hints ) + +#else /* !FT_DEBUG_AUTOFIT */ + +#define AF_HINTS_DO_HORIZONTAL( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_HORIZONTAL ) + +#define AF_HINTS_DO_VERTICAL( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_VERTICAL ) + +#define AF_HINTS_DO_BLUES( h ) 1 + +#endif /* !FT_DEBUG_AUTOFIT */ + + +#define AF_HINTS_DO_ADVANCE( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_ADVANCE ) + +#define AF_HINTS_DO_WARP( h ) \ + !AF_HINTS_TEST_SCALER( h, AF_SCALER_FLAG_NO_WARPER ) + + + + FT_LOCAL( AF_Direction ) + af_direction_compute( FT_Pos dx, + FT_Pos dy ); + + + FT_LOCAL( FT_Error ) + af_axis_hints_new_segment( AF_AxisHints axis, + FT_Memory memory, + AF_Segment *asegment ); + + FT_LOCAL( FT_Error) + af_axis_hints_new_edge( AF_AxisHints axis, + FT_Int fpos, + AF_Direction dir, + FT_Bool top_to_bottom_hinting, + FT_Memory memory, + AF_Edge *edge ); + + FT_LOCAL( void ) + af_glyph_hints_init( AF_GlyphHints hints, + FT_Memory memory ); + + FT_LOCAL( void ) + af_glyph_hints_rescale( AF_GlyphHints hints, + AF_StyleMetrics metrics ); + + FT_LOCAL( FT_Error ) + af_glyph_hints_reload( AF_GlyphHints hints, + FT_Outline* outline ); + + FT_LOCAL( void ) + af_glyph_hints_save( AF_GlyphHints hints, + FT_Outline* outline ); + + FT_LOCAL( void ) + af_glyph_hints_align_edge_points( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_glyph_hints_align_strong_points( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_glyph_hints_align_weak_points( AF_GlyphHints hints, + AF_Dimension dim ); + +#ifdef AF_CONFIG_OPTION_USE_WARPER + FT_LOCAL( void ) + af_glyph_hints_scale_dim( AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed scale, + FT_Pos delta ); +#endif + + FT_LOCAL( void ) + af_glyph_hints_done( AF_GlyphHints hints ); + +/* */ + +#define AF_SEGMENT_LEN( seg ) ( (seg)->max_coord - (seg)->min_coord ) + +#define AF_SEGMENT_DIST( seg1, seg2 ) ( ( (seg1)->pos > (seg2)->pos ) \ + ? (seg1)->pos - (seg2)->pos \ + : (seg2)->pos - (seg1)->pos ) + + +FT_END_HEADER + +#endif /* AFHINTS_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afindic.c b/vendor/FreeType2/src/autofit/afindic.c new file mode 100644 index 0000000..dfbea5f --- /dev/null +++ b/vendor/FreeType2/src/autofit/afindic.c @@ -0,0 +1,157 @@ +/***************************************************************************/ +/* */ +/* afindic.c */ +/* */ +/* Auto-fitter hinting routines for Indic writing system (body). */ +/* */ +/* Copyright 2007-2018 by */ +/* Rahul Bhalerao , . */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include "aftypes.h" +#include "aflatin.h" +#include "afcjk.h" + + +#ifdef AF_CONFIG_OPTION_INDIC + +#include "afindic.h" +#include "aferrors.h" + + +#ifdef AF_CONFIG_OPTION_USE_WARPER +#include "afwarp.h" +#endif + + + static FT_Error + af_indic_metrics_init( AF_CJKMetrics metrics, + FT_Face face ) + { + /* skip blue zone init in CJK routines */ + FT_CharMap oldmap = face->charmap; + + + metrics->units_per_em = face->units_per_EM; + + if ( FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) + face->charmap = NULL; + else + { + af_cjk_metrics_init_widths( metrics, face ); +#if 0 + /* either need indic specific blue_chars[] or just skip blue zones */ + af_cjk_metrics_init_blues( metrics, face, af_cjk_blue_chars ); +#endif + af_cjk_metrics_check_digits( metrics, face ); + } + + FT_Set_Charmap( face, oldmap ); + + return FT_Err_Ok; + } + + + static void + af_indic_metrics_scale( AF_CJKMetrics metrics, + AF_Scaler scaler ) + { + /* use CJK routines */ + af_cjk_metrics_scale( metrics, scaler ); + } + + + static FT_Error + af_indic_hints_init( AF_GlyphHints hints, + AF_CJKMetrics metrics ) + { + /* use CJK routines */ + return af_cjk_hints_init( hints, metrics ); + } + + + static FT_Error + af_indic_hints_apply( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline, + AF_CJKMetrics metrics ) + { + /* use CJK routines */ + return af_cjk_hints_apply( glyph_index, hints, outline, metrics ); + } + + + /* Extract standard_width from writing system/script specific */ + /* metrics class. */ + + static void + af_indic_get_standard_widths( AF_CJKMetrics metrics, + FT_Pos* stdHW, + FT_Pos* stdVW ) + { + if ( stdHW ) + *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width; + + if ( stdVW ) + *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** I N D I C S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + AF_DEFINE_WRITING_SYSTEM_CLASS( + af_indic_writing_system_class, + + AF_WRITING_SYSTEM_INDIC, + + sizeof ( AF_CJKMetricsRec ), + + (AF_WritingSystem_InitMetricsFunc) af_indic_metrics_init, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)af_indic_metrics_scale, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)af_indic_get_standard_widths, /* style_metrics_getstdw */ + + (AF_WritingSystem_InitHintsFunc) af_indic_hints_init, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) af_indic_hints_apply /* style_hints_apply */ + ) + + +#else /* !AF_CONFIG_OPTION_INDIC */ + + + AF_DEFINE_WRITING_SYSTEM_CLASS( + af_indic_writing_system_class, + + AF_WRITING_SYSTEM_INDIC, + + sizeof ( AF_CJKMetricsRec ), + + (AF_WritingSystem_InitMetricsFunc) NULL, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)NULL, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)NULL, /* style_metrics_getstdw */ + + (AF_WritingSystem_InitHintsFunc) NULL, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) NULL /* style_hints_apply */ + ) + + +#endif /* !AF_CONFIG_OPTION_INDIC */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afindic.h b/vendor/FreeType2/src/autofit/afindic.h new file mode 100644 index 0000000..5688738 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afindic.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* afindic.h */ +/* */ +/* Auto-fitter hinting routines for Indic writing system */ +/* (specification). */ +/* */ +/* Copyright 2007-2018 by */ +/* Rahul Bhalerao , . */ +/* */ +/* 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 AFINDIC_H_ +#define AFINDIC_H_ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the `indic' writing system */ + + AF_DECLARE_WRITING_SYSTEM_CLASS( af_indic_writing_system_class ) + + +/* */ + +FT_END_HEADER + +#endif /* AFINDIC_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/aflatin.c b/vendor/FreeType2/src/autofit/aflatin.c new file mode 100644 index 0000000..9f1b540 --- /dev/null +++ b/vendor/FreeType2/src/autofit/aflatin.c @@ -0,0 +1,3590 @@ +/***************************************************************************/ +/* */ +/* aflatin.c */ +/* */ +/* Auto-fitter hinting routines for latin writing system (body). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_ADVANCES_H +#include FT_INTERNAL_DEBUG_H + +#include "afglobal.h" +#include "afpic.h" +#include "aflatin.h" +#include "aferrors.h" + + +#ifdef AF_CONFIG_OPTION_USE_WARPER +#include "afwarp.h" +#endif + + + /*************************************************************************/ + /* */ + /* 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_aflatin + + + /* needed for computation of round vs. flat segments */ +#define FLAT_THRESHOLD( x ) ( x / 14 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Find segments and links, compute all stem widths, and initialize */ + /* standard width and height for the glyph with given charcode. */ + + FT_LOCAL_DEF( void ) + af_latin_metrics_init_widths( AF_LatinMetrics metrics, + FT_Face face ) + { + /* scan the array of segments in each direction */ + AF_GlyphHintsRec hints[1]; + + + FT_TRACE5(( "\n" + "latin standard widths computation (style `%s')\n" + "=====================================================\n" + "\n", + af_style_names[metrics->root.style_class->style] )); + + af_glyph_hints_init( hints, face->memory ); + + metrics->axis[AF_DIMENSION_HORZ].width_count = 0; + metrics->axis[AF_DIMENSION_VERT].width_count = 0; + + { + FT_Error error; + FT_ULong glyph_index; + int dim; + AF_LatinMetricsRec dummy[1]; + AF_Scaler scaler = &dummy->root.scaler; + +#ifdef FT_CONFIG_OPTION_PIC + AF_FaceGlobals globals = metrics->root.globals; +#endif + + AF_StyleClass style_class = metrics->root.style_class; + AF_ScriptClass script_class = AF_SCRIPT_CLASSES_GET + [style_class->script]; + + void* shaper_buf; + const char* p; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_ULong ch = 0; +#endif + + p = script_class->standard_charstring; + shaper_buf = af_shaper_buf_create( face ); + + /* + * We check a list of standard characters to catch features like + * `c2sc' (small caps from caps) that don't contain lowercase letters + * by definition, or other features that mainly operate on numerals. + * The first match wins. + */ + + glyph_index = 0; + while ( *p ) + { + unsigned int num_idx; + +#ifdef FT_DEBUG_LEVEL_TRACE + const char* p_old; +#endif + + + while ( *p == ' ' ) + p++; + +#ifdef FT_DEBUG_LEVEL_TRACE + p_old = p; + GET_UTF8_CHAR( ch, p_old ); +#endif + + /* reject input that maps to more than a single glyph */ + p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); + if ( num_idx > 1 ) + continue; + + /* otherwise exit loop if we have a result */ + glyph_index = af_shaper_get_elem( &metrics->root, + shaper_buf, + 0, + NULL, + NULL ); + if ( glyph_index ) + break; + } + + af_shaper_buf_destroy( face, shaper_buf ); + + if ( !glyph_index ) + goto Exit; + + FT_TRACE5(( "standard character: U+%04lX (glyph index %d)\n", + ch, glyph_index )); + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || face->glyph->outline.n_points <= 0 ) + goto Exit; + + FT_ZERO( dummy ); + + dummy->units_per_em = metrics->units_per_em; + + scaler->x_scale = 0x10000L; + scaler->y_scale = 0x10000L; + scaler->x_delta = 0; + scaler->y_delta = 0; + + scaler->face = face; + scaler->render_mode = FT_RENDER_MODE_NORMAL; + scaler->flags = 0; + + af_glyph_hints_rescale( hints, (AF_StyleMetrics)dummy ); + + error = af_glyph_hints_reload( hints, &face->glyph->outline ); + if ( error ) + goto Exit; + + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + AF_AxisHints axhints = &hints->axis[dim]; + AF_Segment seg, limit, link; + FT_UInt num_widths = 0; + + + error = af_latin_hints_compute_segments( hints, + (AF_Dimension)dim ); + if ( error ) + goto Exit; + + /* + * We assume that the glyphs selected for the stem width + * computation are `featureless' enough so that the linking + * algorithm works fine without adjustments of its scoring + * function. + */ + af_latin_hints_link_segments( hints, + 0, + NULL, + (AF_Dimension)dim ); + + seg = axhints->segments; + limit = seg + axhints->num_segments; + + for ( ; seg < limit; seg++ ) + { + link = seg->link; + + /* we only consider stem segments there! */ + if ( link && link->link == seg && link > seg ) + { + FT_Pos dist; + + + dist = seg->pos - link->pos; + if ( dist < 0 ) + dist = -dist; + + if ( num_widths < AF_LATIN_MAX_WIDTHS ) + axis->widths[num_widths++].org = dist; + } + } + + /* this also replaces multiple almost identical stem widths */ + /* with a single one (the value 100 is heuristic) */ + af_sort_and_quantize_widths( &num_widths, axis->widths, + dummy->units_per_em / 100 ); + axis->width_count = num_widths; + } + + Exit: + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + FT_Pos stdw; + + + stdw = ( axis->width_count > 0 ) ? axis->widths[0].org + : AF_LATIN_CONSTANT( metrics, 50 ); + + /* let's try 20% of the smallest width */ + axis->edge_distance_threshold = stdw / 5; + axis->standard_width = stdw; + axis->extra_light = 0; + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_UInt i; + + + FT_TRACE5(( "%s widths:\n", + dim == AF_DIMENSION_VERT ? "horizontal" + : "vertical" )); + + FT_TRACE5(( " %d (standard)", axis->standard_width )); + for ( i = 1; i < axis->width_count; i++ ) + FT_TRACE5(( " %d", axis->widths[i].org )); + + FT_TRACE5(( "\n" )); + } +#endif + } + } + + FT_TRACE5(( "\n" )); + + af_glyph_hints_done( hints ); + } + + + static void + af_latin_sort_blue( FT_UInt count, + AF_LatinBlue* table ) + { + FT_UInt i, j; + AF_LatinBlue swap; + + + /* we sort from bottom to top */ + for ( i = 1; i < count; i++ ) + { + for ( j = i; j > 0; j-- ) + { + FT_Pos a, b; + + + if ( table[j - 1]->flags & ( AF_LATIN_BLUE_TOP | + AF_LATIN_BLUE_SUB_TOP ) ) + a = table[j - 1]->ref.org; + else + a = table[j - 1]->shoot.org; + + if ( table[j]->flags & ( AF_LATIN_BLUE_TOP | + AF_LATIN_BLUE_SUB_TOP ) ) + b = table[j]->ref.org; + else + b = table[j]->shoot.org; + + if ( b >= a ) + break; + + swap = table[j]; + table[j] = table[j - 1]; + table[j - 1] = swap; + } + } + } + + + /* Find all blue zones. Flat segments give the reference points, */ + /* round segments the overshoot positions. */ + + static void + af_latin_metrics_init_blues( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Pos flats [AF_BLUE_STRING_MAX_LEN]; + FT_Pos rounds[AF_BLUE_STRING_MAX_LEN]; + + FT_UInt num_flats; + FT_UInt num_rounds; + + AF_LatinBlue blue; + FT_Error error; + AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; + FT_Outline outline; + + AF_StyleClass sc = metrics->root.style_class; + + AF_Blue_Stringset bss = sc->blue_stringset; + const AF_Blue_StringRec* bs = &af_blue_stringsets[bss]; + + FT_Pos flat_threshold = FLAT_THRESHOLD( metrics->units_per_em ); + + void* shaper_buf; + + + /* we walk over the blue character strings as specified in the */ + /* style's entry in the `af_blue_stringset' array */ + + FT_TRACE5(( "latin blue zones computation\n" + "============================\n" + "\n" )); + + shaper_buf = af_shaper_buf_create( face ); + + for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ ) + { + const char* p = &af_blue_strings[bs->string]; + FT_Pos* blue_ref; + FT_Pos* blue_shoot; + FT_Pos ascender; + FT_Pos descender; + + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_Bool have_flag = 0; + + + FT_TRACE5(( "blue zone %d", axis->blue_count )); + + if ( bs->properties ) + { + FT_TRACE5(( " (" )); + + if ( AF_LATIN_IS_TOP_BLUE( bs ) ) + { + FT_TRACE5(( "top" )); + have_flag = 1; + } + else if ( AF_LATIN_IS_SUB_TOP_BLUE( bs ) ) + { + FT_TRACE5(( "sub top" )); + have_flag = 1; + } + + if ( AF_LATIN_IS_NEUTRAL_BLUE( bs ) ) + { + if ( have_flag ) + FT_TRACE5(( ", " )); + FT_TRACE5(( "neutral" )); + have_flag = 1; + } + + if ( AF_LATIN_IS_X_HEIGHT_BLUE( bs ) ) + { + if ( have_flag ) + FT_TRACE5(( ", " )); + FT_TRACE5(( "small top" )); + have_flag = 1; + } + + if ( AF_LATIN_IS_LONG_BLUE( bs ) ) + { + if ( have_flag ) + FT_TRACE5(( ", " )); + FT_TRACE5(( "long" )); + } + + FT_TRACE5(( ")" )); + } + + FT_TRACE5(( ":\n" )); + } +#endif /* FT_DEBUG_LEVEL_TRACE */ + + num_flats = 0; + num_rounds = 0; + ascender = 0; + descender = 0; + + while ( *p ) + { + FT_ULong glyph_index; + FT_Long y_offset; + FT_Int best_point, best_contour_first, best_contour_last; + FT_Vector* points; + + FT_Pos best_y_extremum; /* same as points.y */ + FT_Bool best_round = 0; + + unsigned int i, num_idx; + +#ifdef FT_DEBUG_LEVEL_TRACE + const char* p_old; + FT_ULong ch; +#endif + + + while ( *p == ' ' ) + p++; + +#ifdef FT_DEBUG_LEVEL_TRACE + p_old = p; + GET_UTF8_CHAR( ch, p_old ); +#endif + + p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); + + if ( !num_idx ) + { + FT_TRACE5(( " U+%04lX unavailable\n", ch )); + continue; + } + + if ( AF_LATIN_IS_TOP_BLUE( bs ) ) + best_y_extremum = FT_INT_MIN; + else + best_y_extremum = FT_INT_MAX; + + /* iterate over all glyph elements of the character cluster */ + /* and get the data of the `biggest' one */ + for ( i = 0; i < num_idx; i++ ) + { + FT_Pos best_y; + FT_Bool round = 0; + + + /* load the character in the face -- skip unknown or empty ones */ + glyph_index = af_shaper_get_elem( &metrics->root, + shaper_buf, + i, + NULL, + &y_offset ); + if ( glyph_index == 0 ) + { + FT_TRACE5(( " U+%04lX unavailable\n", ch )); + continue; + } + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + outline = face->glyph->outline; + /* reject glyphs that don't produce any rendering */ + if ( error || outline.n_points <= 2 ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( num_idx == 1 ) + FT_TRACE5(( " U+%04lX contains no (usable) outlines\n", ch )); + else + FT_TRACE5(( " component %d of cluster starting with U+%04lX" + " contains no (usable) outlines\n", i, ch )); +#endif + continue; + } + + /* now compute min or max point indices and coordinates */ + points = outline.points; + best_point = -1; + best_y = 0; /* make compiler happy */ + best_contour_first = 0; /* ditto */ + best_contour_last = 0; /* ditto */ + + { + FT_Int nn; + FT_Int first = 0; + FT_Int last = -1; + + + for ( nn = 0; nn < outline.n_contours; first = last + 1, nn++ ) + { + FT_Int old_best_point = best_point; + FT_Int pp; + + + last = outline.contours[nn]; + + /* Avoid single-point contours since they are never */ + /* rasterized. In some fonts, they correspond to mark */ + /* attachment points that are way outside of the glyph's */ + /* real outline. */ + if ( last <= first ) + continue; + + if ( AF_LATIN_IS_TOP_BLUE( bs ) || + AF_LATIN_IS_SUB_TOP_BLUE( bs ) ) + { + for ( pp = first; pp <= last; pp++ ) + { + if ( best_point < 0 || points[pp].y > best_y ) + { + best_point = pp; + best_y = points[pp].y; + ascender = FT_MAX( ascender, best_y + y_offset ); + } + else + descender = FT_MIN( descender, points[pp].y + y_offset ); + } + } + else + { + for ( pp = first; pp <= last; pp++ ) + { + if ( best_point < 0 || points[pp].y < best_y ) + { + best_point = pp; + best_y = points[pp].y; + descender = FT_MIN( descender, best_y + y_offset ); + } + else + ascender = FT_MAX( ascender, points[pp].y + y_offset ); + } + } + + if ( best_point != old_best_point ) + { + best_contour_first = first; + best_contour_last = last; + } + } + } + + /* now check whether the point belongs to a straight or round */ + /* segment; we first need to find in which contour the extremum */ + /* lies, then inspect its previous and next points */ + if ( best_point >= 0 ) + { + FT_Pos best_x = points[best_point].x; + FT_Int prev, next; + FT_Int best_segment_first, best_segment_last; + FT_Int best_on_point_first, best_on_point_last; + FT_Pos dist; + + + best_segment_first = best_point; + best_segment_last = best_point; + + if ( FT_CURVE_TAG( outline.tags[best_point] ) == FT_CURVE_TAG_ON ) + { + best_on_point_first = best_point; + best_on_point_last = best_point; + } + else + { + best_on_point_first = -1; + best_on_point_last = -1; + } + + /* look for the previous and next points on the contour */ + /* that are not on the same Y coordinate, then threshold */ + /* the `closeness'... */ + prev = best_point; + next = prev; + + do + { + if ( prev > best_contour_first ) + prev--; + else + prev = best_contour_last; + + dist = FT_ABS( points[prev].y - best_y ); + /* accept a small distance or a small angle (both values are */ + /* heuristic; value 20 corresponds to approx. 2.9 degrees) */ + if ( dist > 5 ) + if ( FT_ABS( points[prev].x - best_x ) <= 20 * dist ) + break; + + best_segment_first = prev; + + if ( FT_CURVE_TAG( outline.tags[prev] ) == FT_CURVE_TAG_ON ) + { + best_on_point_first = prev; + if ( best_on_point_last < 0 ) + best_on_point_last = prev; + } + + } while ( prev != best_point ); + + do + { + if ( next < best_contour_last ) + next++; + else + next = best_contour_first; + + dist = FT_ABS( points[next].y - best_y ); + if ( dist > 5 ) + if ( FT_ABS( points[next].x - best_x ) <= 20 * dist ) + break; + + best_segment_last = next; + + if ( FT_CURVE_TAG( outline.tags[next] ) == FT_CURVE_TAG_ON ) + { + best_on_point_last = next; + if ( best_on_point_first < 0 ) + best_on_point_first = next; + } + + } while ( next != best_point ); + + if ( AF_LATIN_IS_LONG_BLUE( bs ) ) + { + /* If this flag is set, we have an additional constraint to */ + /* get the blue zone distance: Find a segment of the topmost */ + /* (or bottommost) contour that is longer than a heuristic */ + /* threshold. This ensures that small bumps in the outline */ + /* are ignored (for example, the `vertical serifs' found in */ + /* many Hebrew glyph designs). */ + + /* If this segment is long enough, we are done. Otherwise, */ + /* search the segment next to the extremum that is long */ + /* enough, has the same direction, and a not too large */ + /* vertical distance from the extremum. Note that the */ + /* algorithm doesn't check whether the found segment is */ + /* actually the one (vertically) nearest to the extremum. */ + + /* heuristic threshold value */ + FT_Pos length_threshold = metrics->units_per_em / 25; + + + dist = FT_ABS( points[best_segment_last].x - + points[best_segment_first].x ); + + if ( dist < length_threshold && + best_segment_last - best_segment_first + 2 <= + best_contour_last - best_contour_first ) + { + /* heuristic threshold value */ + FT_Pos height_threshold = metrics->units_per_em / 4; + + FT_Int first; + FT_Int last; + FT_Bool hit; + + /* we intentionally declare these two variables */ + /* outside of the loop since various compilers emit */ + /* incorrect warning messages otherwise, talking about */ + /* `possibly uninitialized variables' */ + FT_Int p_first = 0; /* make compiler happy */ + FT_Int p_last = 0; + + FT_Bool left2right; + + + /* compute direction */ + prev = best_point; + + do + { + if ( prev > best_contour_first ) + prev--; + else + prev = best_contour_last; + + if ( points[prev].x != best_x ) + break; + + } while ( prev != best_point ); + + /* skip glyph for the degenerate case */ + if ( prev == best_point ) + continue; + + left2right = FT_BOOL( points[prev].x < points[best_point].x ); + + first = best_segment_last; + last = first; + hit = 0; + + do + { + FT_Bool l2r; + FT_Pos d; + + + if ( !hit ) + { + /* no hit; adjust first point */ + first = last; + + /* also adjust first and last on point */ + if ( FT_CURVE_TAG( outline.tags[first] ) == + FT_CURVE_TAG_ON ) + { + p_first = first; + p_last = first; + } + else + { + p_first = -1; + p_last = -1; + } + + hit = 1; + } + + if ( last < best_contour_last ) + last++; + else + last = best_contour_first; + + if ( FT_ABS( best_y - points[first].y ) > height_threshold ) + { + /* vertical distance too large */ + hit = 0; + continue; + } + + /* same test as above */ + dist = FT_ABS( points[last].y - points[first].y ); + if ( dist > 5 ) + if ( FT_ABS( points[last].x - points[first].x ) <= + 20 * dist ) + { + hit = 0; + continue; + } + + if ( FT_CURVE_TAG( outline.tags[last] ) == FT_CURVE_TAG_ON ) + { + p_last = last; + if ( p_first < 0 ) + p_first = last; + } + + l2r = FT_BOOL( points[first].x < points[last].x ); + d = FT_ABS( points[last].x - points[first].x ); + + if ( l2r == left2right && + d >= length_threshold ) + { + /* all constraints are met; update segment after */ + /* finding its end */ + do + { + if ( last < best_contour_last ) + last++; + else + last = best_contour_first; + + d = FT_ABS( points[last].y - points[first].y ); + if ( d > 5 ) + if ( FT_ABS( points[next].x - points[first].x ) <= + 20 * dist ) + { + if ( last > best_contour_first ) + last--; + else + last = best_contour_last; + break; + } + + p_last = last; + + if ( FT_CURVE_TAG( outline.tags[last] ) == + FT_CURVE_TAG_ON ) + { + p_last = last; + if ( p_first < 0 ) + p_first = last; + } + + } while ( last != best_segment_first ); + + best_y = points[first].y; + + best_segment_first = first; + best_segment_last = last; + + best_on_point_first = p_first; + best_on_point_last = p_last; + + break; + } + + } while ( last != best_segment_first ); + } + } + + /* for computing blue zones, we add the y offset as returned */ + /* by the currently used OpenType feature -- for example, */ + /* superscript glyphs might be identical to subscript glyphs */ + /* with a vertical shift */ + best_y += y_offset; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( num_idx == 1 ) + FT_TRACE5(( " U+%04lX: best_y = %5ld", ch, best_y )); + else + FT_TRACE5(( " component %d of cluster starting with U+%04lX:" + " best_y = %5ld", i, ch, best_y )); +#endif + + /* now set the `round' flag depending on the segment's kind: */ + /* */ + /* - if the horizontal distance between the first and last */ + /* `on' point is larger than a heuristic threshold */ + /* we have a flat segment */ + /* - if either the first or the last point of the segment is */ + /* an `off' point, the segment is round, otherwise it is */ + /* flat */ + if ( best_on_point_first >= 0 && + best_on_point_last >= 0 && + ( FT_ABS( points[best_on_point_last].x - + points[best_on_point_first].x ) ) > + flat_threshold ) + round = 0; + else + round = FT_BOOL( + FT_CURVE_TAG( outline.tags[best_segment_first] ) != + FT_CURVE_TAG_ON || + FT_CURVE_TAG( outline.tags[best_segment_last] ) != + FT_CURVE_TAG_ON ); + + if ( round && AF_LATIN_IS_NEUTRAL_BLUE( bs ) ) + { + /* only use flat segments for a neutral blue zone */ + FT_TRACE5(( " (round, skipped)\n" )); + continue; + } + + FT_TRACE5(( " (%s)\n", round ? "round" : "flat" )); + } + + if ( AF_LATIN_IS_TOP_BLUE( bs ) ) + { + if ( best_y > best_y_extremum ) + { + best_y_extremum = best_y; + best_round = round; + } + } + else + { + if ( best_y < best_y_extremum ) + { + best_y_extremum = best_y; + best_round = round; + } + } + + } /* end for loop */ + + if ( !( best_y_extremum == FT_INT_MIN || + best_y_extremum == FT_INT_MAX ) ) + { + if ( best_round ) + rounds[num_rounds++] = best_y_extremum; + else + flats[num_flats++] = best_y_extremum; + } + + } /* end while loop */ + + if ( num_flats == 0 && num_rounds == 0 ) + { + /* + * we couldn't find a single glyph to compute this blue zone, + * we will simply ignore it then + */ + FT_TRACE5(( " empty\n" )); + continue; + } + + /* we have computed the contents of the `rounds' and `flats' tables, */ + /* now determine the reference and overshoot position of the blue -- */ + /* we simply take the median value after a simple sort */ + af_sort_pos( num_rounds, rounds ); + af_sort_pos( num_flats, flats ); + + blue = &axis->blues[axis->blue_count]; + blue_ref = &blue->ref.org; + blue_shoot = &blue->shoot.org; + + axis->blue_count++; + + if ( num_flats == 0 ) + { + *blue_ref = + *blue_shoot = rounds[num_rounds / 2]; + } + else if ( num_rounds == 0 ) + { + *blue_ref = + *blue_shoot = flats[num_flats / 2]; + } + else + { + *blue_ref = flats [num_flats / 2]; + *blue_shoot = rounds[num_rounds / 2]; + } + + /* there are sometimes problems: if the overshoot position of top */ + /* zones is under its reference position, or the opposite for bottom */ + /* zones. We must thus check everything there and correct the errors */ + if ( *blue_shoot != *blue_ref ) + { + FT_Pos ref = *blue_ref; + FT_Pos shoot = *blue_shoot; + FT_Bool over_ref = FT_BOOL( shoot > ref ); + + + if ( ( AF_LATIN_IS_TOP_BLUE( bs ) || + AF_LATIN_IS_SUB_TOP_BLUE( bs) ) ^ over_ref ) + { + *blue_ref = + *blue_shoot = ( shoot + ref ) / 2; + + FT_TRACE5(( " [overshoot smaller than reference," + " taking mean value]\n" )); + } + } + + blue->ascender = ascender; + blue->descender = descender; + + blue->flags = 0; + if ( AF_LATIN_IS_TOP_BLUE( bs ) ) + blue->flags |= AF_LATIN_BLUE_TOP; + if ( AF_LATIN_IS_SUB_TOP_BLUE( bs ) ) + blue->flags |= AF_LATIN_BLUE_SUB_TOP; + if ( AF_LATIN_IS_NEUTRAL_BLUE( bs ) ) + blue->flags |= AF_LATIN_BLUE_NEUTRAL; + + /* + * The following flag is used later to adjust the y and x scales + * in order to optimize the pixel grid alignment of the top of small + * letters. + */ + if ( AF_LATIN_IS_X_HEIGHT_BLUE( bs ) ) + blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; + + FT_TRACE5(( " -> reference = %ld\n" + " overshoot = %ld\n", + *blue_ref, *blue_shoot )); + + } /* end for loop */ + + af_shaper_buf_destroy( face, shaper_buf ); + + /* we finally check whether blue zones are ordered; */ + /* `ref' and `shoot' values of two blue zones must not overlap */ + if ( axis->blue_count ) + { + FT_UInt i; + AF_LatinBlue blue_sorted[AF_BLUE_STRINGSET_MAX_LEN + 2]; + + + for ( i = 0; i < axis->blue_count; i++ ) + blue_sorted[i] = &axis->blues[i]; + + /* sort bottoms of blue zones... */ + af_latin_sort_blue( axis->blue_count, blue_sorted ); + + /* ...and adjust top values if necessary */ + for ( i = 0; i < axis->blue_count - 1; i++ ) + { + FT_Pos* a; + FT_Pos* b; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Bool a_is_top = 0; +#endif + + + if ( blue_sorted[i]->flags & ( AF_LATIN_BLUE_TOP | + AF_LATIN_BLUE_SUB_TOP ) ) + { + a = &blue_sorted[i]->shoot.org; +#ifdef FT_DEBUG_LEVEL_TRACE + a_is_top = 1; +#endif + } + else + a = &blue_sorted[i]->ref.org; + + if ( blue_sorted[i + 1]->flags & ( AF_LATIN_BLUE_TOP | + AF_LATIN_BLUE_SUB_TOP ) ) + b = &blue_sorted[i + 1]->shoot.org; + else + b = &blue_sorted[i + 1]->ref.org; + + if ( *a > *b ) + { + *a = *b; + FT_TRACE5(( "blue zone overlap:" + " adjusting %s %d to %ld\n", + a_is_top ? "overshoot" : "reference", + blue_sorted[i] - axis->blues, + *a )); + } + } + } + + FT_TRACE5(( "\n" )); + + return; + } + + + /* Check whether all ASCII digits have the same advance width. */ + + FT_LOCAL_DEF( void ) + af_latin_metrics_check_digits( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Bool started = 0, same_width = 1; + FT_Fixed advance = 0, old_advance = 0; + + void* shaper_buf; + + /* in all supported charmaps, digits have character codes 0x30-0x39 */ + const char digits[] = "0 1 2 3 4 5 6 7 8 9"; + const char* p; + + + p = digits; + shaper_buf = af_shaper_buf_create( face ); + + while ( *p ) + { + FT_ULong glyph_index; + unsigned int num_idx; + + + /* reject input that maps to more than a single glyph */ + p = af_shaper_get_cluster( p, &metrics->root, shaper_buf, &num_idx ); + if ( num_idx > 1 ) + continue; + + glyph_index = af_shaper_get_elem( &metrics->root, + shaper_buf, + 0, + &advance, + NULL ); + if ( !glyph_index ) + continue; + + if ( started ) + { + if ( advance != old_advance ) + { + same_width = 0; + break; + } + } + else + { + old_advance = advance; + started = 1; + } + } + + af_shaper_buf_destroy( face, shaper_buf ); + + metrics->root.digits_have_same_width = same_width; + } + + + /* Initialize global metrics. */ + + FT_LOCAL_DEF( FT_Error ) + af_latin_metrics_init( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_CharMap oldmap = face->charmap; + + + metrics->units_per_em = face->units_per_EM; + + if ( !FT_Select_Charmap( face, FT_ENCODING_UNICODE ) ) + { + af_latin_metrics_init_widths( metrics, face ); + af_latin_metrics_init_blues( metrics, face ); + af_latin_metrics_check_digits( metrics, face ); + } + + FT_Set_Charmap( face, oldmap ); + return FT_Err_Ok; + } + + + /* Adjust scaling value, then scale and shift widths */ + /* and blue zones (if applicable) for given dimension. */ + + static void + af_latin_metrics_scale_dim( AF_LatinMetrics metrics, + AF_Scaler scaler, + AF_Dimension dim ) + { + FT_Fixed scale; + FT_Pos delta; + AF_LatinAxis axis; + FT_UInt nn; + + + if ( dim == AF_DIMENSION_HORZ ) + { + scale = scaler->x_scale; + delta = scaler->x_delta; + } + else + { + scale = scaler->y_scale; + delta = scaler->y_delta; + } + + axis = &metrics->axis[dim]; + + if ( axis->org_scale == scale && axis->org_delta == delta ) + return; + + axis->org_scale = scale; + axis->org_delta = delta; + + /* + * correct X and Y scale to optimize the alignment of the top of small + * letters to the pixel grid + */ + { + AF_LatinAxis Axis = &metrics->axis[AF_DIMENSION_VERT]; + AF_LatinBlue blue = NULL; + + + for ( nn = 0; nn < Axis->blue_count; nn++ ) + { + if ( Axis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) + { + blue = &Axis->blues[nn]; + break; + } + } + + if ( blue ) + { + FT_Pos scaled; + FT_Pos threshold; + FT_Pos fitted; + FT_UInt limit; + FT_UInt ppem; + + + scaled = FT_MulFix( blue->shoot.org, scale ); + ppem = metrics->root.scaler.face->size->metrics.x_ppem; + limit = metrics->root.globals->increase_x_height; + threshold = 40; + + /* if the `increase-x-height' property is active, */ + /* we round up much more often */ + if ( limit && + ppem <= limit && + ppem >= AF_PROP_INCREASE_X_HEIGHT_MIN ) + threshold = 52; + + fitted = ( scaled + threshold ) & ~63; + + if ( scaled != fitted ) + { +#if 0 + if ( dim == AF_DIMENSION_HORZ ) + { + if ( fitted < scaled ) + scale -= scale / 50; /* scale *= 0.98 */ + } + else +#endif + if ( dim == AF_DIMENSION_VERT ) + { + FT_Pos max_height; + FT_Pos dist; + FT_Fixed new_scale; + + + new_scale = FT_MulDiv( scale, fitted, scaled ); + + /* the scaling should not change the result by more than two pixels */ + max_height = metrics->units_per_em; + + for ( nn = 0; nn < Axis->blue_count; nn++ ) + { + max_height = FT_MAX( max_height, Axis->blues[nn].ascender ); + max_height = FT_MAX( max_height, -Axis->blues[nn].descender ); + } + + dist = FT_ABS( FT_MulFix( max_height, new_scale - scale ) ); + dist &= ~127; + + if ( dist == 0 ) + { + FT_TRACE5(( + "af_latin_metrics_scale_dim:" + " x height alignment (style `%s'):\n" + " " + " vertical scaling changed from %.5f to %.5f (by %d%%)\n" + "\n", + af_style_names[metrics->root.style_class->style], + scale / 65536.0, + new_scale / 65536.0, + ( fitted - scaled ) * 100 / scaled )); + + scale = new_scale; + } +#ifdef FT_DEBUG_LEVEL_TRACE + else + { + FT_TRACE5(( + "af_latin_metrics_scale_dim:" + " x height alignment (style `%s'):\n" + " " + " excessive vertical scaling abandoned\n" + "\n", + af_style_names[metrics->root.style_class->style] )); + } +#endif + } + } + } + } + + axis->scale = scale; + axis->delta = delta; + + if ( dim == AF_DIMENSION_HORZ ) + { + metrics->root.scaler.x_scale = scale; + metrics->root.scaler.x_delta = delta; + } + else + { + metrics->root.scaler.y_scale = scale; + metrics->root.scaler.y_delta = delta; + } + + FT_TRACE5(( "%s widths (style `%s')\n", + dim == AF_DIMENSION_HORZ ? "horizontal" : "vertical", + af_style_names[metrics->root.style_class->style] )); + + /* scale the widths */ + for ( nn = 0; nn < axis->width_count; nn++ ) + { + AF_Width width = axis->widths + nn; + + + width->cur = FT_MulFix( width->org, scale ); + width->fit = width->cur; + + FT_TRACE5(( " %d scaled to %.2f\n", + width->org, + width->cur / 64.0 )); + } + + FT_TRACE5(( "\n" )); + + /* an extra-light axis corresponds to a standard width that is */ + /* smaller than 5/8 pixels */ + axis->extra_light = + (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 ); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( axis->extra_light ) + FT_TRACE5(( "`%s' style is extra light (at current resolution)\n" + "\n", + af_style_names[metrics->root.style_class->style] )); +#endif + + if ( dim == AF_DIMENSION_VERT ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( axis->blue_count ) + FT_TRACE5(( "blue zones (style `%s')\n", + af_style_names[metrics->root.style_class->style] )); +#endif + + /* scale the blue zones */ + for ( nn = 0; nn < axis->blue_count; nn++ ) + { + AF_LatinBlue blue = &axis->blues[nn]; + FT_Pos dist; + + + blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; + blue->ref.fit = blue->ref.cur; + blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; + blue->shoot.fit = blue->shoot.cur; + blue->flags &= ~AF_LATIN_BLUE_ACTIVE; + + /* a blue zone is only active if it is less than 3/4 pixels tall */ + dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); + if ( dist <= 48 && dist >= -48 ) + { +#if 0 + FT_Pos delta1; +#endif + FT_Pos delta2; + + + /* use discrete values for blue zone widths */ + +#if 0 + + /* generic, original code */ + delta1 = blue->shoot.org - blue->ref.org; + delta2 = delta1; + if ( delta1 < 0 ) + delta2 = -delta2; + + delta2 = FT_MulFix( delta2, scale ); + + if ( delta2 < 32 ) + delta2 = 0; + else if ( delta2 < 64 ) + delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); + else + delta2 = FT_PIX_ROUND( delta2 ); + + if ( delta1 < 0 ) + delta2 = -delta2; + + blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); + blue->shoot.fit = blue->ref.fit + delta2; + +#else + + /* simplified version due to abs(dist) <= 48 */ + delta2 = dist; + if ( dist < 0 ) + delta2 = -delta2; + + if ( delta2 < 32 ) + delta2 = 0; + else if ( delta2 < 48 ) + delta2 = 32; + else + delta2 = 64; + + if ( dist < 0 ) + delta2 = -delta2; + + blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); + blue->shoot.fit = blue->ref.fit - delta2; + +#endif + + blue->flags |= AF_LATIN_BLUE_ACTIVE; + } + } + + /* use sub-top blue zone only if it doesn't overlap with */ + /* another (non-sup-top) blue zone; otherwise, the */ + /* effect would be similar to a neutral blue zone, which */ + /* is not desired here */ + for ( nn = 0; nn < axis->blue_count; nn++ ) + { + AF_LatinBlue blue = &axis->blues[nn]; + FT_UInt i; + + + if ( !( blue->flags & AF_LATIN_BLUE_SUB_TOP ) ) + continue; + if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) + continue; + + for ( i = 0; i < axis->blue_count; i++ ) + { + AF_LatinBlue b = &axis->blues[i]; + + + if ( b->flags & AF_LATIN_BLUE_SUB_TOP ) + continue; + if ( !( b->flags & AF_LATIN_BLUE_ACTIVE ) ) + continue; + + if ( b->ref.fit <= blue->shoot.fit && + b->shoot.fit >= blue->ref.fit ) + { + blue->flags &= ~AF_LATIN_BLUE_ACTIVE; + break; + } + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + for ( nn = 0; nn < axis->blue_count; nn++ ) + { + AF_LatinBlue blue = &axis->blues[nn]; + + + FT_TRACE5(( " reference %d: %d scaled to %.2f%s\n" + " overshoot %d: %d scaled to %.2f%s\n", + nn, + blue->ref.org, + blue->ref.fit / 64.0, + blue->flags & AF_LATIN_BLUE_ACTIVE ? "" + : " (inactive)", + nn, + blue->shoot.org, + blue->shoot.fit / 64.0, + blue->flags & AF_LATIN_BLUE_ACTIVE ? "" + : " (inactive)" )); + } +#endif + } + } + + + /* Scale global values in both directions. */ + + FT_LOCAL_DEF( void ) + af_latin_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ) + { + metrics->root.scaler.render_mode = scaler->render_mode; + metrics->root.scaler.face = scaler->face; + metrics->root.scaler.flags = scaler->flags; + + af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); + af_latin_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); + } + + + /* Extract standard_width from writing system/script specific */ + /* metrics class. */ + + FT_LOCAL_DEF( void ) + af_latin_get_standard_widths( AF_LatinMetrics metrics, + FT_Pos* stdHW, + FT_Pos* stdVW ) + { + if ( stdHW ) + *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width; + + if ( stdVW ) + *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* Walk over all contours and compute its segments. */ + + FT_LOCAL_DEF( FT_Error ) + af_latin_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics)hints->metrics; + AF_AxisHints axis = &hints->axis[dim]; + FT_Memory memory = hints->memory; + FT_Error error = FT_Err_Ok; + AF_Segment segment = NULL; + AF_SegmentRec seg0; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + AF_Direction major_dir, segment_dir; + + FT_Pos flat_threshold = FLAT_THRESHOLD( metrics->units_per_em ); + + + FT_ZERO( &seg0 ); + seg0.score = 32000; + seg0.flags = AF_EDGE_NORMAL; + + major_dir = (AF_Direction)FT_ABS( axis->major_dir ); + segment_dir = major_dir; + + axis->num_segments = 0; + + /* set up (u,v) in each point */ + if ( dim == AF_DIMENSION_HORZ ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fx; + point->v = point->fy; + } + } + else + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fy; + point->v = point->fx; + } + } + + /* do each contour separately */ + for ( ; contour < contour_limit; contour++ ) + { + AF_Point point = contour[0]; + AF_Point last = point->prev; + int on_edge = 0; + + /* we call values measured along a segment (point->v) */ + /* `coordinates', and values orthogonal to it (point->u) */ + /* `positions' */ + FT_Pos min_pos = 32000; + FT_Pos max_pos = -32000; + FT_Pos min_coord = 32000; + FT_Pos max_coord = -32000; + FT_UShort min_flags = AF_FLAG_NONE; + FT_UShort max_flags = AF_FLAG_NONE; + FT_Pos min_on_coord = 32000; + FT_Pos max_on_coord = -32000; + + FT_Bool passed; + + AF_Segment prev_segment = NULL; + + FT_Pos prev_min_pos = min_pos; + FT_Pos prev_max_pos = max_pos; + FT_Pos prev_min_coord = min_coord; + FT_Pos prev_max_coord = max_coord; + FT_UShort prev_min_flags = min_flags; + FT_UShort prev_max_flags = max_flags; + FT_Pos prev_min_on_coord = min_on_coord; + FT_Pos prev_max_on_coord = max_on_coord; + + + if ( FT_ABS( last->out_dir ) == major_dir && + FT_ABS( point->out_dir ) == major_dir ) + { + /* we are already on an edge, try to locate its start */ + last = point; + + for (;;) + { + point = point->prev; + if ( FT_ABS( point->out_dir ) != major_dir ) + { + point = point->next; + break; + } + if ( point == last ) + break; + } + } + + last = point; + passed = 0; + + for (;;) + { + FT_Pos u, v; + + + if ( on_edge ) + { + /* get minimum and maximum position */ + u = point->u; + if ( u < min_pos ) + min_pos = u; + if ( u > max_pos ) + max_pos = u; + + /* get minimum and maximum coordinate together with flags */ + v = point->v; + if ( v < min_coord ) + { + min_coord = v; + min_flags = point->flags; + } + if ( v > max_coord ) + { + max_coord = v; + max_flags = point->flags; + } + + /* get minimum and maximum coordinate of `on' points */ + if ( !( point->flags & AF_FLAG_CONTROL ) ) + { + v = point->v; + if ( v < min_on_coord ) + min_on_coord = v; + if ( v > max_on_coord ) + max_on_coord = v; + } + + if ( point->out_dir != segment_dir || point == last ) + { + /* check whether the new segment's start point is identical to */ + /* the previous segment's end point; for example, this might */ + /* happen for spikes */ + + if ( !prev_segment || segment->first != prev_segment->last ) + { + /* points are different: we are just leaving an edge, thus */ + /* record a new segment */ + + segment->last = point; + segment->pos = (FT_Short)( ( min_pos + max_pos ) >> 1 ); + segment->delta = (FT_Short)( ( max_pos - min_pos ) >> 1 ); + + /* a segment is round if either its first or last point */ + /* is a control point, and the length of the on points */ + /* inbetween doesn't exceed a heuristic limit */ + if ( ( min_flags | max_flags ) & AF_FLAG_CONTROL && + ( max_on_coord - min_on_coord ) < flat_threshold ) + segment->flags |= AF_EDGE_ROUND; + + segment->min_coord = (FT_Short)min_coord; + segment->max_coord = (FT_Short)max_coord; + segment->height = segment->max_coord - segment->min_coord; + + prev_segment = segment; + prev_min_pos = min_pos; + prev_max_pos = max_pos; + prev_min_coord = min_coord; + prev_max_coord = max_coord; + prev_min_flags = min_flags; + prev_max_flags = max_flags; + prev_min_on_coord = min_on_coord; + prev_max_on_coord = max_on_coord; + } + else + { + /* points are the same: we don't create a new segment but */ + /* merge the current segment with the previous one */ + + if ( prev_segment->last->in_dir == point->in_dir ) + { + /* we have identical directions (this can happen for */ + /* degenerate outlines that move zig-zag along the main */ + /* axis without changing the coordinate value of the other */ + /* axis, and where the segments have just been merged): */ + /* unify segments */ + + /* update constraints */ + + if ( prev_min_pos < min_pos ) + min_pos = prev_min_pos; + if ( prev_max_pos > max_pos ) + max_pos = prev_max_pos; + + if ( prev_min_coord < min_coord ) + { + min_coord = prev_min_coord; + min_flags = prev_min_flags; + } + if ( prev_max_coord > max_coord ) + { + max_coord = prev_max_coord; + max_flags = prev_max_flags; + } + + if ( prev_min_on_coord < min_on_coord ) + min_on_coord = prev_min_on_coord; + if ( prev_max_on_coord > max_on_coord ) + max_on_coord = prev_max_on_coord; + + prev_segment->last = point; + prev_segment->pos = (FT_Short)( ( min_pos + + max_pos ) >> 1 ); + prev_segment->delta = (FT_Short)( ( max_pos - + min_pos ) >> 1 ); + + if ( ( min_flags | max_flags ) & AF_FLAG_CONTROL && + ( max_on_coord - min_on_coord ) < flat_threshold ) + prev_segment->flags |= AF_EDGE_ROUND; + else + prev_segment->flags &= ~AF_EDGE_ROUND; + + prev_segment->min_coord = (FT_Short)min_coord; + prev_segment->max_coord = (FT_Short)max_coord; + prev_segment->height = prev_segment->max_coord - + prev_segment->min_coord; + } + else + { + /* we have different directions; use the properties of the */ + /* longer segment and discard the other one */ + + if ( FT_ABS( prev_max_coord - prev_min_coord ) > + FT_ABS( max_coord - min_coord ) ) + { + /* discard current segment */ + + if ( min_pos < prev_min_pos ) + prev_min_pos = min_pos; + if ( max_pos > prev_max_pos ) + prev_max_pos = max_pos; + + prev_segment->last = point; + prev_segment->pos = (FT_Short)( ( prev_min_pos + + prev_max_pos ) >> 1 ); + prev_segment->delta = (FT_Short)( ( prev_max_pos - + prev_min_pos ) >> 1 ); + } + else + { + /* discard previous segment */ + + if ( prev_min_pos < min_pos ) + min_pos = prev_min_pos; + if ( prev_max_pos > max_pos ) + max_pos = prev_max_pos; + + segment->last = point; + segment->pos = (FT_Short)( ( min_pos + max_pos ) >> 1 ); + segment->delta = (FT_Short)( ( max_pos - min_pos ) >> 1 ); + + if ( ( min_flags | max_flags ) & AF_FLAG_CONTROL && + ( max_on_coord - min_on_coord ) < flat_threshold ) + segment->flags |= AF_EDGE_ROUND; + + segment->min_coord = (FT_Short)min_coord; + segment->max_coord = (FT_Short)max_coord; + segment->height = segment->max_coord - + segment->min_coord; + + *prev_segment = *segment; + + prev_min_pos = min_pos; + prev_max_pos = max_pos; + prev_min_coord = min_coord; + prev_max_coord = max_coord; + prev_min_flags = min_flags; + prev_max_flags = max_flags; + prev_min_on_coord = min_on_coord; + prev_max_on_coord = max_on_coord; + } + } + + axis->num_segments--; + } + + on_edge = 0; + segment = NULL; + + /* fall through */ + } + } + + /* now exit if we are at the start/end point */ + if ( point == last ) + { + if ( passed ) + break; + passed = 1; + } + + /* if we are not on an edge, check whether the major direction */ + /* coincides with the current point's `out' direction, or */ + /* whether we have a single-point contour */ + if ( !on_edge && + ( FT_ABS( point->out_dir ) == major_dir || + point == point->prev ) ) + { + /* this is the start of a new segment! */ + segment_dir = (AF_Direction)point->out_dir; + + error = af_axis_hints_new_segment( axis, memory, &segment ); + if ( error ) + goto Exit; + + /* clear all segment fields */ + segment[0] = seg0; + + segment->dir = (FT_Char)segment_dir; + segment->first = point; + segment->last = point; + + /* `af_axis_hints_new_segment' reallocates memory, */ + /* thus we have to refresh the `prev_segment' pointer */ + if ( prev_segment ) + prev_segment = segment - 1; + + min_pos = max_pos = point->u; + min_coord = max_coord = point->v; + min_flags = max_flags = point->flags; + + if ( point->flags & AF_FLAG_CONTROL ) + { + min_on_coord = 32000; + max_on_coord = -32000; + } + else + min_on_coord = max_on_coord = point->v; + + on_edge = 1; + + if ( point == point->prev ) + { + /* we have a one-point segment: this is a one-point */ + /* contour with `in' and `out' direction set to */ + /* AF_DIR_NONE */ + segment->pos = (FT_Short)min_pos; + + if (point->flags & AF_FLAG_CONTROL) + segment->flags |= AF_EDGE_ROUND; + + segment->min_coord = (FT_Short)point->v; + segment->max_coord = (FT_Short)point->v; + segment->height = 0; + + on_edge = 0; + segment = NULL; + } + } + + point = point->next; + } + + } /* contours */ + + + /* now slightly increase the height of segments if this makes */ + /* sense -- this is used to better detect and ignore serifs */ + { + AF_Segment segments = axis->segments; + AF_Segment segments_end = segments + axis->num_segments; + + + for ( segment = segments; segment < segments_end; segment++ ) + { + AF_Point first = segment->first; + AF_Point last = segment->last; + FT_Pos first_v = first->v; + FT_Pos last_v = last->v; + + + if ( first_v < last_v ) + { + AF_Point p; + + + p = first->prev; + if ( p->v < first_v ) + segment->height = (FT_Short)( segment->height + + ( ( first_v - p->v ) >> 1 ) ); + + p = last->next; + if ( p->v > last_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - last_v ) >> 1 ) ); + } + else + { + AF_Point p; + + + p = first->prev; + if ( p->v > first_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - first_v ) >> 1 ) ); + + p = last->next; + if ( p->v < last_v ) + segment->height = (FT_Short)( segment->height + + ( ( last_v - p->v ) >> 1 ) ); + } + } + } + + Exit: + return error; + } + + + /* Link segments to form stems and serifs. If `width_count' and */ + /* `widths' are non-zero, use them to fine-tune the scoring function. */ + + FT_LOCAL_DEF( void ) + af_latin_hints_link_segments( AF_GlyphHints hints, + FT_UInt width_count, + AF_WidthRec* widths, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + FT_Pos len_threshold, len_score, dist_score, max_width; + AF_Segment seg1, seg2; + + + if ( width_count ) + max_width = widths[width_count - 1].org; + else + max_width = 0; + + /* a heuristic value to set up a minimum value for overlapping */ + len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); + if ( len_threshold == 0 ) + len_threshold = 1; + + /* a heuristic value to weight lengths */ + len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 ); + + /* a heuristic value to weight distances (no call to */ + /* AF_LATIN_CONSTANT needed, since we work on multiples */ + /* of the stem width) */ + dist_score = 3000; + + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + if ( seg1->dir != axis->major_dir ) + continue; + + /* search for stems having opposite directions, */ + /* with seg1 to the `left' of seg2 */ + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + { + FT_Pos pos1 = seg1->pos; + FT_Pos pos2 = seg2->pos; + + + if ( seg1->dir + seg2->dir == 0 && pos2 > pos1 ) + { + /* compute distance between the two segments */ + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len; + + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max > seg2->max_coord ) + max = seg2->max_coord; + + /* compute maximum coordinate difference of the two segments */ + /* (this is, how much they overlap) */ + len = max - min; + if ( len >= len_threshold ) + { + /* + * The score is the sum of two demerits indicating the + * `badness' of a fit, measured along the segments' main axis + * and orthogonal to it, respectively. + * + * o The less overlapping along the main axis, the worse it + * is, causing a larger demerit. + * + * o The nearer the orthogonal distance to a stem width, the + * better it is, causing a smaller demerit. For simplicity, + * however, we only increase the demerit for values that + * exceed the largest stem width. + */ + + FT_Pos dist = pos2 - pos1; + + FT_Pos dist_demerit, score; + + + if ( max_width ) + { + /* distance demerits are based on multiples of `max_width'; */ + /* we scale by 1024 for getting more precision */ + FT_Pos delta = ( dist << 10 ) / max_width - ( 1 << 10 ); + + + if ( delta > 10000 ) + dist_demerit = 32000; + else if ( delta > 0 ) + dist_demerit = delta * delta / dist_score; + else + dist_demerit = 0; + } + else + dist_demerit = dist; /* default if no widths available */ + + score = dist_demerit + len_score / len; + + /* and we search for the smallest score */ + if ( score < seg1->score ) + { + seg1->score = score; + seg1->link = seg2; + } + + if ( score < seg2->score ) + { + seg2->score = score; + seg2->link = seg1; + } + } + } + } + } + + /* now compute the `serif' segments, cf. explanations in `afhints.h' */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 ) + { + if ( seg2->link != seg1 ) + { + seg1->link = 0; + seg1->serif = seg2->link; + } + } + } + } + + + /* Link segments to edges, using feature analysis for selection. */ + + FT_LOCAL_DEF( FT_Error ) + af_latin_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Error error = FT_Err_Ok; + FT_Memory memory = hints->memory; + AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; + +#ifdef FT_CONFIG_OPTION_PIC + AF_FaceGlobals globals = hints->metrics->globals; +#endif + + AF_StyleClass style_class = hints->metrics->style_class; + AF_ScriptClass script_class = AF_SCRIPT_CLASSES_GET + [style_class->script]; + + FT_Bool top_to_bottom_hinting = 0; + + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + +#if 0 + AF_Direction up_dir; +#endif + FT_Fixed scale; + FT_Pos edge_distance_threshold; + FT_Pos segment_length_threshold; + FT_Pos segment_width_threshold; + + + axis->num_edges = 0; + + scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + +#if 0 + up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP + : AF_DIR_RIGHT; +#endif + + if ( dim == AF_DIMENSION_VERT ) + top_to_bottom_hinting = script_class->top_to_bottom_hinting; + + /* + * We ignore all segments that are less than 1 pixel in length + * to avoid many problems with serif fonts. We compute the + * corresponding threshold in font units. + */ + if ( dim == AF_DIMENSION_HORZ ) + segment_length_threshold = FT_DivFix( 64, hints->y_scale ); + else + segment_length_threshold = 0; + + /* + * Similarly, we ignore segments that have a width delta + * larger than 0.5px (i.e., a width larger than 1px). + */ + segment_width_threshold = FT_DivFix( 32, scale ); + + /*********************************************************************/ + /* */ + /* We begin by generating a sorted table of edges for the current */ + /* direction. To do so, we simply scan each segment and try to find */ + /* an edge in our table that corresponds to its position. */ + /* */ + /* If no edge is found, we create and insert a new edge in the */ + /* sorted table. Otherwise, we simply add the segment to the edge's */ + /* list which gets processed in the second step to compute the */ + /* edge's properties. */ + /* */ + /* Note that the table of edges is sorted along the segment/edge */ + /* position. */ + /* */ + /*********************************************************************/ + + /* assure that edge distance threshold is at most 0.25px */ + edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = 64 / 4; + + edge_distance_threshold = FT_DivFix( edge_distance_threshold, + scale ); + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = NULL; + FT_Int ee; + + + /* ignore too short segments, too wide ones, and, in this loop, */ + /* one-point segments without a direction */ + if ( seg->height < segment_length_threshold || + seg->delta > segment_width_threshold || + seg->dir == AF_DIR_NONE ) + continue; + + /* A special case for serif edges: If they are smaller than */ + /* 1.5 pixels we ignore them. */ + if ( seg->serif && + 2 * seg->height < 3 * segment_length_threshold ) + continue; + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold && edge->dir == seg->dir ) + { + found = edge; + break; + } + } + + if ( !found ) + { + AF_Edge edge; + + + /* insert a new edge in the list and */ + /* sort according to the position */ + error = af_axis_hints_new_edge( axis, seg->pos, + (AF_Direction)seg->dir, + top_to_bottom_hinting, + memory, &edge ); + if ( error ) + goto Exit; + + /* add the segment to the new edge's list */ + FT_ZERO( edge ); + + edge->first = seg; + edge->last = seg; + edge->dir = seg->dir; + edge->fpos = seg->pos; + edge->opos = FT_MulFix( seg->pos, scale ); + edge->pos = edge->opos; + seg->edge_next = seg; + } + else + { + /* if an edge was found, simply add the segment to the edge's */ + /* list */ + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + /* we loop again over all segments to catch one-point segments */ + /* without a direction: if possible, link them to existing edges */ + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = NULL; + FT_Int ee; + + + if ( seg->dir != AF_DIR_NONE ) + continue; + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold ) + { + found = edge; + break; + } + } + + /* one-point segments without a match are ignored */ + if ( found ) + { + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + + /******************************************************************/ + /* */ + /* Good, we now compute each edge's properties according to the */ + /* segments found on its position. Basically, these are */ + /* */ + /* - the edge's main direction */ + /* - stem edge, serif edge or both (which defaults to stem then) */ + /* - rounded edge, straight or both (which defaults to straight) */ + /* - link for edge */ + /* */ + /******************************************************************/ + + /* first of all, set the `edge' field in each segment -- this is */ + /* required in order to compute edge links */ + + /* + * Note that removing this loop and setting the `edge' field of each + * segment directly in the code above slows down execution speed for + * some reasons on platforms like the Sun. + */ + { + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + + + for ( edge = edges; edge < edge_limit; edge++ ) + { + seg = edge->first; + if ( seg ) + do + { + seg->edge = edge; + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + /* now compute each edge properties */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Int is_round = 0; /* does it contain round segments? */ + FT_Int is_straight = 0; /* does it contain straight segments? */ +#if 0 + FT_Pos ups = 0; /* number of upwards segments */ + FT_Pos downs = 0; /* number of downwards segments */ +#endif + + + seg = edge->first; + + do + { + FT_Bool is_serif; + + + /* check for roundness of segment */ + if ( seg->flags & AF_EDGE_ROUND ) + is_round++; + else + is_straight++; + +#if 0 + /* check for segment direction */ + if ( seg->dir == up_dir ) + ups += seg->max_coord - seg->min_coord; + else + downs += seg->max_coord - seg->min_coord; +#endif + + /* check for links -- if seg->serif is set, then seg->link must */ + /* be ignored */ + is_serif = (FT_Bool)( seg->serif && + seg->serif->edge && + seg->serif->edge != edge ); + + if ( ( seg->link && seg->link->edge ) || is_serif ) + { + AF_Edge edge2; + AF_Segment seg2; + + + edge2 = edge->link; + seg2 = seg->link; + + if ( is_serif ) + { + seg2 = seg->serif; + edge2 = edge->serif; + } + + if ( edge2 ) + { + FT_Pos edge_delta; + FT_Pos seg_delta; + + + edge_delta = edge->fpos - edge2->fpos; + if ( edge_delta < 0 ) + edge_delta = -edge_delta; + + seg_delta = seg->pos - seg2->pos; + if ( seg_delta < 0 ) + seg_delta = -seg_delta; + + if ( seg_delta < edge_delta ) + edge2 = seg2->edge; + } + else + edge2 = seg2->edge; + + if ( is_serif ) + { + edge->serif = edge2; + edge2->flags |= AF_EDGE_SERIF; + } + else + edge->link = edge2; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + + /* set the round/straight flags */ + edge->flags = AF_EDGE_NORMAL; + + if ( is_round > 0 && is_round >= is_straight ) + edge->flags |= AF_EDGE_ROUND; + +#if 0 + /* set the edge's main direction */ + edge->dir = AF_DIR_NONE; + + if ( ups > downs ) + edge->dir = (FT_Char)up_dir; + + else if ( ups < downs ) + edge->dir = (FT_Char)-up_dir; + + else if ( ups == downs ) + edge->dir = 0; /* both up and down! */ +#endif + + /* get rid of serifs if link is set */ + /* XXX: This gets rid of many unpleasant artefacts! */ + /* Example: the `c' in cour.pfa at size 13 */ + + if ( edge->serif && edge->link ) + edge->serif = NULL; + } + } + + Exit: + return error; + } + + + /* Detect segments and edges for given dimension. */ + + FT_LOCAL_DEF( FT_Error ) + af_latin_hints_detect_features( AF_GlyphHints hints, + FT_UInt width_count, + AF_WidthRec* widths, + AF_Dimension dim ) + { + FT_Error error; + + + error = af_latin_hints_compute_segments( hints, dim ); + if ( !error ) + { + af_latin_hints_link_segments( hints, width_count, widths, dim ); + + error = af_latin_hints_compute_edges( hints, dim ); + } + + return error; + } + + + /* Compute all edges which lie within blue zones. */ + + static void + af_latin_hints_compute_blue_edges( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + AF_AxisHints axis = &hints->axis[AF_DIMENSION_VERT]; + AF_Edge edge = axis->edges; + AF_Edge edge_limit = edge + axis->num_edges; + AF_LatinAxis latin = &metrics->axis[AF_DIMENSION_VERT]; + FT_Fixed scale = latin->scale; + + + /* compute which blue zones are active, i.e. have their scaled */ + /* size < 3/4 pixels */ + + /* for each horizontal edge search the blue zone which is closest */ + for ( ; edge < edge_limit; edge++ ) + { + FT_UInt bb; + AF_Width best_blue = NULL; + FT_Bool best_blue_is_neutral = 0; + FT_Pos best_dist; /* initial threshold */ + + + /* compute the initial threshold as a fraction of the EM size */ + /* (the value 40 is heuristic) */ + best_dist = FT_MulFix( metrics->units_per_em / 40, scale ); + + /* assure a minimum distance of 0.5px */ + if ( best_dist > 64 / 2 ) + best_dist = 64 / 2; + + for ( bb = 0; bb < latin->blue_count; bb++ ) + { + AF_LatinBlue blue = latin->blues + bb; + FT_Bool is_top_blue, is_neutral_blue, is_major_dir; + + + /* skip inactive blue zones (i.e., those that are too large) */ + if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) + continue; + + /* if it is a top zone, check for right edges (against the major */ + /* direction); if it is a bottom zone, check for left edges (in */ + /* the major direction) -- this assumes the TrueType convention */ + /* for the orientation of contours */ + is_top_blue = + (FT_Byte)( ( blue->flags & ( AF_LATIN_BLUE_TOP | + AF_LATIN_BLUE_SUB_TOP ) ) != 0 ); + is_neutral_blue = + (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_NEUTRAL ) != 0); + is_major_dir = + FT_BOOL( edge->dir == axis->major_dir ); + + /* neutral blue zones are handled for both directions */ + if ( is_top_blue ^ is_major_dir || is_neutral_blue ) + { + FT_Pos dist; + + + /* first of all, compare it to the reference position */ + dist = edge->fpos - blue->ref.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = &blue->ref; + best_blue_is_neutral = is_neutral_blue; + } + + /* now compare it to the overshoot position and check whether */ + /* the edge is rounded, and whether the edge is over the */ + /* reference position of a top zone, or under the reference */ + /* position of a bottom zone (provided we don't have a */ + /* neutral blue zone) */ + if ( edge->flags & AF_EDGE_ROUND && + dist != 0 && + !is_neutral_blue ) + { + FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); + + + if ( is_top_blue ^ is_under_ref ) + { + dist = edge->fpos - blue->shoot.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = &blue->shoot; + best_blue_is_neutral = is_neutral_blue; + } + } + } + } + } + + if ( best_blue ) + { + edge->blue_edge = best_blue; + if ( best_blue_is_neutral ) + edge->flags |= AF_EDGE_NEUTRAL; + } + } + } + + + /* Initalize hinting engine. */ + + static FT_Error + af_latin_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + FT_Render_Mode mode; + FT_UInt32 scaler_flags, other_flags; + FT_Face face = metrics->root.scaler.face; + + + af_glyph_hints_rescale( hints, (AF_StyleMetrics)metrics ); + + /* + * correct x_scale and y_scale if needed, since they may have + * been modified by `af_latin_metrics_scale_dim' above + */ + hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; + hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; + hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; + hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; + + /* compute flags depending on render mode, etc. */ + mode = metrics->root.scaler.render_mode; + +#if 0 /* #ifdef AF_CONFIG_OPTION_USE_WARPER */ + if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) + metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; +#endif + + scaler_flags = hints->scaler_flags; + other_flags = 0; + + /* + * We snap the width of vertical stems for the monochrome and + * horizontal LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_HORZ_SNAP; + + /* + * We snap the width of horizontal stems for the monochrome and + * vertical LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) + other_flags |= AF_LATIN_HINTS_VERT_SNAP; + + /* + * We adjust stems to full pixels unless in `light' or `lcd' mode. + */ + if ( mode != FT_RENDER_MODE_LIGHT && mode != FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_STEM_ADJUST; + + if ( mode == FT_RENDER_MODE_MONO ) + other_flags |= AF_LATIN_HINTS_MONO; + + /* + * In `light' or `lcd' mode we disable horizontal hinting completely. + * We also do it if the face is italic. + * + * However, if warping is enabled (which only works in `light' hinting + * mode), advance widths get adjusted, too. + */ + if ( mode == FT_RENDER_MODE_LIGHT || mode == FT_RENDER_MODE_LCD || + ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 ) + scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; + +#ifdef AF_CONFIG_OPTION_USE_WARPER + /* get (global) warper flag */ + if ( !metrics->root.globals->module->warping ) + scaler_flags |= AF_SCALER_FLAG_NO_WARPER; +#endif + + hints->scaler_flags = scaler_flags; + hints->other_flags = other_flags; + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* Snap a given width in scaled coordinates to one of the */ + /* current standard widths. */ + + static FT_Pos + af_latin_snap_width( AF_Width widths, + FT_UInt count, + FT_Pos width ) + { + FT_UInt n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + FT_Pos scaled; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + scaled = FT_PIX_ROUND( reference ); + + if ( width >= reference ) + { + if ( width < scaled + 48 ) + width = reference; + } + else + { + if ( width > scaled - 48 ) + width = reference; + } + + return width; + } + + + /* Compute the snapped width of a given stem, ignoring very thin ones. */ + /* There is a lot of voodoo in this function; changing the hard-coded */ + /* parameters influence the whole hinting process. */ + + static FT_Pos + af_latin_compute_stem_width( AF_GlyphHints hints, + AF_Dimension dim, + FT_Pos width, + FT_Pos base_delta, + FT_UInt base_flags, + FT_UInt stem_flags ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics)hints->metrics; + AF_LatinAxis axis = &metrics->axis[dim]; + FT_Pos dist = width; + FT_Int sign = 0; + FT_Int vertical = ( dim == AF_DIMENSION_VERT ); + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || + axis->extra_light ) + return width; + + if ( dist < 0 ) + { + dist = -width; + sign = 1; + } + + if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || + ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) + { + /* smooth hinting process: very lightly quantize the stem width */ + + /* leave the widths of serifs alone */ + if ( ( stem_flags & AF_EDGE_SERIF ) && + vertical && + ( dist < 3 * 64 ) ) + goto Done_Width; + + else if ( base_flags & AF_EDGE_ROUND ) + { + if ( dist < 80 ) + dist = 64; + } + else if ( dist < 56 ) + dist = 56; + + if ( axis->width_count > 0 ) + { + FT_Pos delta; + + + /* compare to standard width */ + delta = dist - axis->widths[0].cur; + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + dist = axis->widths[0].cur; + if ( dist < 48 ) + dist = 48; + + goto Done_Width; + } + + if ( dist < 3 * 64 ) + { + delta = dist & 63; + dist &= -64; + + if ( delta < 10 ) + dist += delta; + + else if ( delta < 32 ) + dist += 10; + + else if ( delta < 54 ) + dist += 54; + + else + dist += delta; + } + else + { + /* A stem's end position depends on two values: the start */ + /* position and the stem length. The former gets usually */ + /* rounded to the grid, while the latter gets rounded also if it */ + /* exceeds a certain length (see below in this function). This */ + /* `double rounding' can lead to a great difference to the */ + /* original, unhinted position; this normally doesn't matter for */ + /* large PPEM values, but for small sizes it can easily make */ + /* outlines collide. For this reason, we adjust the stem length */ + /* by a small amount depending on the PPEM value in case the */ + /* former and latter rounding both point into the same */ + /* direction. */ + + FT_Pos bdelta = 0; + + + if ( ( ( width > 0 ) && ( base_delta > 0 ) ) || + ( ( width < 0 ) && ( base_delta < 0 ) ) ) + { + FT_UInt ppem = metrics->root.scaler.face->size->metrics.x_ppem; + + + if ( ppem < 10 ) + bdelta = base_delta; + else if ( ppem < 30 ) + bdelta = ( base_delta * (FT_Pos)( 30 - ppem ) ) / 20; + + if ( bdelta < 0 ) + bdelta = -bdelta; + } + + dist = ( dist - bdelta + 32 ) & ~63; + } + } + } + else + { + /* strong hinting process: snap the stem width to integer pixels */ + + FT_Pos org_dist = dist; + + + dist = af_latin_snap_width( axis->widths, axis->width_count, dist ); + + if ( vertical ) + { + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + + if ( dist >= 64 ) + dist = ( dist + 16 ) & ~63; + else + dist = 64; + } + else + { + if ( AF_LATIN_HINTS_DO_MONO( hints ) ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & ~63; + } + else + { + /* for horizontal anti-aliased hinting, we adopt a more subtle */ + /* approach: we strengthen small stems, round stems whose size */ + /* is between 1 and 2 pixels to an integer, otherwise nothing */ + + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + + else if ( dist < 128 ) + { + /* We only round to an integer width if the corresponding */ + /* distortion is less than 1/4 pixel. Otherwise this */ + /* makes everything worse since the diagonals, which are */ + /* not hinted, appear a lot bolder or thinner than the */ + /* vertical stems. */ + + FT_Pos delta; + + + dist = ( dist + 22 ) & ~63; + delta = dist - org_dist; + if ( delta < 0 ) + delta = -delta; + + if ( delta >= 16 ) + { + dist = org_dist; + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + } + } + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + /* Align one stem edge relative to the previous stem edge. */ + + static void + af_latin_align_linked_edge( AF_GlyphHints hints, + AF_Dimension dim, + AF_Edge base_edge, + AF_Edge stem_edge ) + { + FT_Pos dist, base_delta; + FT_Pos fitted_width; + + + dist = stem_edge->opos - base_edge->opos; + base_delta = base_edge->pos - base_edge->opos; + + fitted_width = af_latin_compute_stem_width( hints, dim, + dist, base_delta, + base_edge->flags, + stem_edge->flags ); + + + stem_edge->pos = base_edge->pos + fitted_width; + + FT_TRACE5(( " LINK: edge %d (opos=%.2f) linked to %.2f," + " dist was %.2f, now %.2f\n", + stem_edge - hints->axis[dim].edges, stem_edge->opos / 64.0, + stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 )); + } + + + /* Shift the coordinates of the `serif' edge by the same amount */ + /* as the corresponding `base' edge has been moved already. */ + + static void + af_latin_align_serif_edge( AF_GlyphHints hints, + AF_Edge base, + AF_Edge serif ) + { + FT_UNUSED( hints ); + + serif->pos = base->pos + ( serif->opos - base->opos ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* The main grid-fitting routine. */ + + static void + af_latin_hint_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + FT_PtrDist n_edges; + AF_Edge edge; + AF_Edge anchor = NULL; + FT_Int has_serifs = 0; + +#ifdef FT_CONFIG_OPTION_PIC + AF_FaceGlobals globals = hints->metrics->globals; +#endif + + AF_StyleClass style_class = hints->metrics->style_class; + AF_ScriptClass script_class = AF_SCRIPT_CLASSES_GET + [style_class->script]; + + FT_Bool top_to_bottom_hinting = 0; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_UInt num_actions = 0; +#endif + + + FT_TRACE5(( "latin %s edge hinting (style `%s')\n", + dim == AF_DIMENSION_VERT ? "horizontal" : "vertical", + af_style_names[hints->metrics->style_class->style] )); + + if ( dim == AF_DIMENSION_VERT ) + top_to_bottom_hinting = script_class->top_to_bottom_hinting; + + /* we begin by aligning all stems relative to the blue zone */ + /* if needed -- that's only for horizontal edges */ + + if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) ) + { + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Width blue; + AF_Edge edge1, edge2; /* these edges form the stem to check */ + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + edge1 = NULL; + edge2 = edge->link; + + /* + * If a stem contains both a neutral and a non-neutral blue zone, + * skip the neutral one. Otherwise, outlines with different + * directions might be incorrectly aligned at the same vertical + * position. + * + * If we have two neutral blue zones, skip one of them. + * + */ + if ( edge->blue_edge && edge2 && edge2->blue_edge ) + { + FT_Byte neutral = edge->flags & AF_EDGE_NEUTRAL; + FT_Byte neutral2 = edge2->flags & AF_EDGE_NEUTRAL; + + + if ( neutral2 ) + { + edge2->blue_edge = NULL; + edge2->flags &= ~AF_EDGE_NEUTRAL; + } + else if ( neutral ) + { + edge->blue_edge = NULL; + edge->flags &= ~AF_EDGE_NEUTRAL; + } + } + + blue = edge->blue_edge; + if ( blue ) + edge1 = edge; + + /* flip edges if the other edge is aligned to a blue zone */ + else if ( edge2 && edge2->blue_edge ) + { + blue = edge2->blue_edge; + edge1 = edge2; + edge2 = edge; + } + + if ( !edge1 ) + continue; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !anchor ) + FT_TRACE5(( " BLUE_ANCHOR: edge %d (opos=%.2f) snapped to %.2f," + " was %.2f (anchor=edge %d)\n", + edge1 - edges, edge1->opos / 64.0, blue->fit / 64.0, + edge1->pos / 64.0, edge - edges )); + else + FT_TRACE5(( " BLUE: edge %d (opos=%.2f) snapped to %.2f," + " was %.2f\n", + edge1 - edges, edge1->opos / 64.0, blue->fit / 64.0, + edge1->pos / 64.0 )); + + num_actions++; +#endif + + edge1->pos = blue->fit; + edge1->flags |= AF_EDGE_DONE; + + if ( edge2 && !edge2->blue_edge ) + { + af_latin_align_linked_edge( hints, dim, edge1, edge2 ); + edge2->flags |= AF_EDGE_DONE; + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions++; +#endif + } + + if ( !anchor ) + anchor = edge; + } + } + + /* now we align all other stem edges, trying to maintain the */ + /* relative order of stems in the glyph */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + /* skip all non-stem edges */ + edge2 = edge->link; + if ( !edge2 ) + { + has_serifs++; + continue; + } + + /* now align the stem */ + + /* this should not happen, but it's better to be safe */ + if ( edge2->blue_edge ) + { + FT_TRACE5(( " ASSERTION FAILED for edge %d\n", edge2 - edges )); + + af_latin_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions++; +#endif + continue; + } + + if ( !anchor ) + { + /* if we reach this if clause, no stem has been aligned yet */ + + FT_Pos org_len, org_center, cur_len; + FT_Pos cur_pos1, error1, error2, u_off, d_off; + + + org_len = edge2->opos - edge->opos; + cur_len = af_latin_compute_stem_width( hints, dim, + org_len, 0, + edge->flags, + edge2->flags ); + + /* some voodoo to specially round edges for small stem widths; */ + /* the idea is to align the center of a stem, then shifting */ + /* the stem edges to suitable positions */ + if ( cur_len <= 64 ) + { + /* width <= 1px */ + u_off = 32; + d_off = 32; + } + else + { + /* 1px < width < 1.5px */ + u_off = 38; + d_off = 26; + } + + if ( cur_len < 96 ) + { + org_center = edge->opos + ( org_len >> 1 ); + cur_pos1 = FT_PIX_ROUND( org_center ); + + error1 = org_center - ( cur_pos1 - u_off ); + if ( error1 < 0 ) + error1 = -error1; + + error2 = org_center - ( cur_pos1 + d_off ); + if ( error2 < 0 ) + error2 = -error2; + + if ( error1 < error2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = edge->pos + cur_len; + } + else + edge->pos = FT_PIX_ROUND( edge->opos ); + + anchor = edge; + edge->flags |= AF_EDGE_DONE; + + FT_TRACE5(( " ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)" + " snapped to %.2f and %.2f\n", + edge - edges, edge->opos / 64.0, + edge2 - edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0 )); + + af_latin_align_linked_edge( hints, dim, edge, edge2 ); + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions += 2; +#endif + } + else + { + FT_Pos org_pos, org_len, org_center, cur_len; + FT_Pos cur_pos1, cur_pos2, delta1, delta2; + + + org_pos = anchor->pos + ( edge->opos - anchor->opos ); + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin_compute_stem_width( hints, dim, + org_len, 0, + edge->flags, + edge2->flags ); + + if ( edge2->flags & AF_EDGE_DONE ) + { + FT_TRACE5(( " ADJUST: edge %d (pos=%.2f) moved to %.2f\n", + edge - edges, edge->pos / 64.0, + ( edge2->pos - cur_len ) / 64.0 )); + + edge->pos = edge2->pos - cur_len; + } + + else if ( cur_len < 96 ) + { + FT_Pos u_off, d_off; + + + cur_pos1 = FT_PIX_ROUND( org_center ); + + if ( cur_len <= 64 ) + { + u_off = 32; + d_off = 32; + } + else + { + u_off = 38; + d_off = 26; + } + + delta1 = org_center - ( cur_pos1 - u_off ); + if ( delta1 < 0 ) + delta1 = -delta1; + + delta2 = org_center - ( cur_pos1 + d_off ); + if ( delta2 < 0 ) + delta2 = -delta2; + + if ( delta1 < delta2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = cur_pos1 + cur_len / 2; + + FT_TRACE5(( " STEM: edge %d (opos=%.2f) linked to %d (opos=%.2f)" + " snapped to %.2f and %.2f\n", + edge - edges, edge->opos / 64.0, + edge2 - edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0 )); + } + + else + { + org_pos = anchor->pos + ( edge->opos - anchor->opos ); + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin_compute_stem_width( hints, dim, + org_len, 0, + edge->flags, + edge2->flags ); + + cur_pos1 = FT_PIX_ROUND( org_pos ); + delta1 = cur_pos1 + ( cur_len >> 1 ) - org_center; + if ( delta1 < 0 ) + delta1 = -delta1; + + cur_pos2 = FT_PIX_ROUND( org_pos + org_len ) - cur_len; + delta2 = cur_pos2 + ( cur_len >> 1 ) - org_center; + if ( delta2 < 0 ) + delta2 = -delta2; + + edge->pos = ( delta1 < delta2 ) ? cur_pos1 : cur_pos2; + edge2->pos = edge->pos + cur_len; + + FT_TRACE5(( " STEM: edge %d (opos=%.2f) linked to %d (opos=%.2f)" + " snapped to %.2f and %.2f\n", + edge - edges, edge->opos / 64.0, + edge2 - edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0 )); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions++; +#endif + + edge->flags |= AF_EDGE_DONE; + edge2->flags |= AF_EDGE_DONE; + + if ( edge > edges && + ( top_to_bottom_hinting ? ( edge->pos > edge[-1].pos ) + : ( edge->pos < edge[-1].pos ) ) ) + { + /* don't move if stem would (almost) disappear otherwise; */ + /* the ad-hoc value 16 corresponds to 1/4px */ + if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE5(( " BOUND: edge %d (pos=%.2f) moved to %.2f\n", + edge - edges, + edge->pos / 64.0, + edge[-1].pos / 64.0 )); + + num_actions++; +#endif + + edge->pos = edge[-1].pos; + } + } + } + } + + /* make sure that lowercase m's maintain their symmetry */ + + /* In general, lowercase m's have six vertical edges if they are sans */ + /* serif, or twelve if they are with serifs. This implementation is */ + /* based on that assumption, and seems to work very well with most */ + /* faces. However, if for a certain face this assumption is not */ + /* true, the m is just rendered like before. In addition, any stem */ + /* correction will only be applied to symmetrical glyphs (even if the */ + /* glyph is not an m), so the potential for unwanted distortion is */ + /* relatively low. */ + + /* We don't handle horizontal edges since we can't easily assure that */ + /* the third (lowest) stem aligns with the base line; it might end up */ + /* one pixel higher or lower. */ + + n_edges = edge_limit - edges; + if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) + { + AF_Edge edge1, edge2, edge3; + FT_Pos dist1, dist2, span, delta; + + + if ( n_edges == 6 ) + { + edge1 = edges; + edge2 = edges + 2; + edge3 = edges + 4; + } + else + { + edge1 = edges + 1; + edge2 = edges + 5; + edge3 = edges + 9; + } + + dist1 = edge2->opos - edge1->opos; + dist2 = edge3->opos - edge2->opos; + + span = dist1 - dist2; + if ( span < 0 ) + span = -span; + + if ( span < 8 ) + { + delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); + edge3->pos -= delta; + if ( edge3->link ) + edge3->link->pos -= delta; + + /* move the serifs along with the stem */ + if ( n_edges == 12 ) + { + ( edges + 8 )->pos -= delta; + ( edges + 11 )->pos -= delta; + } + + edge3->flags |= AF_EDGE_DONE; + if ( edge3->link ) + edge3->link->flags |= AF_EDGE_DONE; + } + } + + if ( has_serifs || !anchor ) + { + /* + * now hint the remaining edges (serifs and single) in order + * to complete our processing + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Pos delta; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + delta = 1000; + + if ( edge->serif ) + { + delta = edge->serif->opos - edge->opos; + if ( delta < 0 ) + delta = -delta; + } + + if ( delta < 64 + 16 ) + { + af_latin_align_serif_edge( hints, edge->serif, edge ); + FT_TRACE5(( " SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)" + " aligned to %.2f\n", + edge - edges, edge->opos / 64.0, + edge->serif - edges, edge->serif->opos / 64.0, + edge->pos / 64.0 )); + } + else if ( !anchor ) + { + edge->pos = FT_PIX_ROUND( edge->opos ); + anchor = edge; + FT_TRACE5(( " SERIF_ANCHOR: edge %d (opos=%.2f)" + " snapped to %.2f\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); + } + else + { + AF_Edge before, after; + + + for ( before = edge - 1; before >= edges; before-- ) + if ( before->flags & AF_EDGE_DONE ) + break; + + for ( after = edge + 1; after < edge_limit; after++ ) + if ( after->flags & AF_EDGE_DONE ) + break; + + if ( before >= edges && before < edge && + after < edge_limit && after > edge ) + { + if ( after->opos == before->opos ) + edge->pos = before->pos; + else + edge->pos = before->pos + + FT_MulDiv( edge->opos - before->opos, + after->pos - before->pos, + after->opos - before->opos ); + + FT_TRACE5(( " SERIF_LINK1: edge %d (opos=%.2f) snapped to %.2f" + " from %d (opos=%.2f)\n", + edge - edges, edge->opos / 64.0, + edge->pos / 64.0, + before - edges, before->opos / 64.0 )); + } + else + { + edge->pos = anchor->pos + + ( ( edge->opos - anchor->opos + 16 ) & ~31 ); + FT_TRACE5(( " SERIF_LINK2: edge %d (opos=%.2f)" + " snapped to %.2f\n", + edge - edges, edge->opos / 64.0, edge->pos / 64.0 )); + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + num_actions++; +#endif + edge->flags |= AF_EDGE_DONE; + + if ( edge > edges && + ( top_to_bottom_hinting ? ( edge->pos > edge[-1].pos ) + : ( edge->pos < edge[-1].pos ) ) ) + { + /* don't move if stem would (almost) disappear otherwise; */ + /* the ad-hoc value 16 corresponds to 1/4px */ + if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE5(( " BOUND: edge %d (pos=%.2f) moved to %.2f\n", + edge - edges, + edge->pos / 64.0, + edge[-1].pos / 64.0 )); + + num_actions++; +#endif + edge->pos = edge[-1].pos; + } + } + + if ( edge + 1 < edge_limit && + edge[1].flags & AF_EDGE_DONE && + ( top_to_bottom_hinting ? ( edge->pos < edge[1].pos ) + : ( edge->pos > edge[1].pos ) ) ) + { + /* don't move if stem would (almost) disappear otherwise; */ + /* the ad-hoc value 16 corresponds to 1/4px */ + if ( edge->link && FT_ABS( edge->link->pos - edge[-1].pos ) > 16 ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE5(( " BOUND: edge %d (pos=%.2f) moved to %.2f\n", + edge - edges, + edge->pos / 64.0, + edge[1].pos / 64.0 )); + + num_actions++; +#endif + + edge->pos = edge[1].pos; + } + } + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !num_actions ) + FT_TRACE5(( " (none)\n" )); + FT_TRACE5(( "\n" )); +#endif + } + + + /* Apply the complete hinting algorithm to a latin glyph. */ + + static FT_Error + af_latin_hints_apply( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics ) + { + FT_Error error; + int dim; + + AF_LatinAxis axis; + + + error = af_glyph_hints_reload( hints, outline ); + if ( error ) + goto Exit; + + /* analyze glyph outline */ + if ( AF_HINTS_DO_HORIZONTAL( hints ) ) + { + axis = &metrics->axis[AF_DIMENSION_HORZ]; + error = af_latin_hints_detect_features( hints, + axis->width_count, + axis->widths, + AF_DIMENSION_HORZ ); + if ( error ) + goto Exit; + } + + if ( AF_HINTS_DO_VERTICAL( hints ) ) + { + axis = &metrics->axis[AF_DIMENSION_VERT]; + error = af_latin_hints_detect_features( hints, + axis->width_count, + axis->widths, + AF_DIMENSION_VERT ); + if ( error ) + goto Exit; + + /* apply blue zones to base characters only */ + if ( !( metrics->root.globals->glyph_styles[glyph_index] & AF_NONBASE ) ) + af_latin_hints_compute_blue_edges( hints, metrics ); + } + + /* grid-fit the outline */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { +#ifdef AF_CONFIG_OPTION_USE_WARPER + if ( dim == AF_DIMENSION_HORZ && + metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL && + AF_HINTS_DO_WARP( hints ) ) + { + AF_WarperRec warper; + FT_Fixed scale; + FT_Pos delta; + + + af_warper_compute( &warper, hints, (AF_Dimension)dim, + &scale, &delta ); + af_glyph_hints_scale_dim( hints, (AF_Dimension)dim, + scale, delta ); + continue; + } +#endif /* AF_CONFIG_OPTION_USE_WARPER */ + + if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || + ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) + { + af_latin_hint_edges( hints, (AF_Dimension)dim ); + af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); + } + } + + af_glyph_hints_save( hints, outline ); + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + AF_DEFINE_WRITING_SYSTEM_CLASS( + af_latin_writing_system_class, + + AF_WRITING_SYSTEM_LATIN, + + sizeof ( AF_LatinMetricsRec ), + + (AF_WritingSystem_InitMetricsFunc) af_latin_metrics_init, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)af_latin_metrics_scale, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)af_latin_get_standard_widths, /* style_metrics_getstdw */ + + (AF_WritingSystem_InitHintsFunc) af_latin_hints_init, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) af_latin_hints_apply /* style_hints_apply */ + ) + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/aflatin.h b/vendor/FreeType2/src/autofit/aflatin.h new file mode 100644 index 0000000..432cccc --- /dev/null +++ b/vendor/FreeType2/src/autofit/aflatin.h @@ -0,0 +1,194 @@ +/***************************************************************************/ +/* */ +/* aflatin.h */ +/* */ +/* Auto-fitter hinting routines for latin writing system */ +/* (specification). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AFLATIN_H_ +#define AFLATIN_H_ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + /* the `latin' writing system */ + + AF_DECLARE_WRITING_SYSTEM_CLASS( af_latin_writing_system_class ) + + + /* constants are given with units_per_em == 2048 in mind */ +#define AF_LATIN_CONSTANT( metrics, c ) \ + ( ( (c) * (FT_Long)( (AF_LatinMetrics)(metrics) )->units_per_em ) / 2048 ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* + * The following declarations could be embedded in the file `aflatin.c'; + * they have been made semi-public to allow alternate writing system + * hinters to re-use some of them. + */ + + +#define AF_LATIN_IS_TOP_BLUE( b ) \ + ( (b)->properties & AF_BLUE_PROPERTY_LATIN_TOP ) +#define AF_LATIN_IS_SUB_TOP_BLUE( b ) \ + ( (b)->properties & AF_BLUE_PROPERTY_LATIN_SUB_TOP ) +#define AF_LATIN_IS_NEUTRAL_BLUE( b ) \ + ( (b)->properties & AF_BLUE_PROPERTY_LATIN_NEUTRAL ) +#define AF_LATIN_IS_X_HEIGHT_BLUE( b ) \ + ( (b)->properties & AF_BLUE_PROPERTY_LATIN_X_HEIGHT ) +#define AF_LATIN_IS_LONG_BLUE( b ) \ + ( (b)->properties & AF_BLUE_PROPERTY_LATIN_LONG ) + +#define AF_LATIN_MAX_WIDTHS 16 + + +#define AF_LATIN_BLUE_ACTIVE ( 1U << 0 ) /* zone height is <= 3/4px */ +#define AF_LATIN_BLUE_TOP ( 1U << 1 ) /* we have a top blue zone */ +#define AF_LATIN_BLUE_SUB_TOP ( 1U << 2 ) /* we have a subscript top */ + /* blue zone */ +#define AF_LATIN_BLUE_NEUTRAL ( 1U << 3 ) /* we have neutral blue zone */ +#define AF_LATIN_BLUE_ADJUSTMENT ( 1U << 4 ) /* used for scale adjustment */ + /* optimization */ + + + typedef struct AF_LatinBlueRec_ + { + AF_WidthRec ref; + AF_WidthRec shoot; + FT_Pos ascender; + FT_Pos descender; + FT_UInt flags; + + } AF_LatinBlueRec, *AF_LatinBlue; + + + typedef struct AF_LatinAxisRec_ + { + FT_Fixed scale; + FT_Pos delta; + + FT_UInt width_count; /* number of used widths */ + AF_WidthRec widths[AF_LATIN_MAX_WIDTHS]; /* widths array */ + FT_Pos edge_distance_threshold; /* used for creating edges */ + FT_Pos standard_width; /* the default stem thickness */ + FT_Bool extra_light; /* is standard width very light? */ + + /* ignored for horizontal metrics */ + FT_UInt blue_count; + AF_LatinBlueRec blues[AF_BLUE_STRINGSET_MAX]; + + FT_Fixed org_scale; + FT_Pos org_delta; + + } AF_LatinAxisRec, *AF_LatinAxis; + + + typedef struct AF_LatinMetricsRec_ + { + AF_StyleMetricsRec root; + FT_UInt units_per_em; + AF_LatinAxisRec axis[AF_DIMENSION_MAX]; + + } AF_LatinMetricsRec, *AF_LatinMetrics; + + + FT_LOCAL( FT_Error ) + af_latin_metrics_init( AF_LatinMetrics metrics, + FT_Face face ); + + FT_LOCAL( void ) + af_latin_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ); + + FT_LOCAL( void ) + af_latin_metrics_init_widths( AF_LatinMetrics metrics, + FT_Face face ); + + FT_LOCAL( void ) + af_latin_metrics_check_digits( AF_LatinMetrics metrics, + FT_Face face ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define AF_LATIN_HINTS_HORZ_SNAP ( 1U << 0 ) /* stem width snapping */ +#define AF_LATIN_HINTS_VERT_SNAP ( 1U << 1 ) /* stem height snapping */ +#define AF_LATIN_HINTS_STEM_ADJUST ( 1U << 2 ) /* stem width/height */ + /* adjustment */ +#define AF_LATIN_HINTS_MONO ( 1U << 3 ) /* monochrome rendering */ + + +#define AF_LATIN_HINTS_DO_HORZ_SNAP( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_HORZ_SNAP ) + +#define AF_LATIN_HINTS_DO_VERT_SNAP( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_VERT_SNAP ) + +#define AF_LATIN_HINTS_DO_STEM_ADJUST( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_STEM_ADJUST ) + +#define AF_LATIN_HINTS_DO_MONO( h ) \ + AF_HINTS_TEST_OTHER( h, AF_LATIN_HINTS_MONO ) + + + /* + * The next functions shouldn't normally be exported. However, other + * writing systems might like to use these functions as-is. + */ + FT_LOCAL( FT_Error ) + af_latin_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( void ) + af_latin_hints_link_segments( AF_GlyphHints hints, + FT_UInt width_count, + AF_WidthRec* widths, + AF_Dimension dim ); + + FT_LOCAL( FT_Error ) + af_latin_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL( FT_Error ) + af_latin_hints_detect_features( AF_GlyphHints hints, + FT_UInt width_count, + AF_WidthRec* widths, + AF_Dimension dim ); + +/* */ + +FT_END_HEADER + +#endif /* AFLATIN_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/aflatin2.c b/vendor/FreeType2/src/autofit/aflatin2.c new file mode 100644 index 0000000..5c71378 --- /dev/null +++ b/vendor/FreeType2/src/autofit/aflatin2.c @@ -0,0 +1,2427 @@ +/* ATTENTION: This file doesn't compile. It is only here as a reference */ +/* of an alternative latin hinting algorithm that was always */ +/* marked as experimental. */ + + +/***************************************************************************/ +/* */ +/* aflatin2.c */ +/* */ +/* Auto-fitter hinting routines for latin writing system (body). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#include FT_ADVANCES_H + + +#ifdef FT_OPTION_AUTOFIT2 + +#include "afglobal.h" +#include "aflatin.h" +#include "aflatin2.h" +#include "aferrors.h" + + +#ifdef AF_CONFIG_OPTION_USE_WARPER +#include "afwarp.h" +#endif + + + /*************************************************************************/ + /* */ + /* 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_aflatin2 + + + FT_LOCAL_DEF( FT_Error ) + af_latin2_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + FT_LOCAL_DEF( void ) + af_latin2_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ); + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L O B A L M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + af_latin2_metrics_init_widths( AF_LatinMetrics metrics, + FT_Face face ) + { + /* scan the array of segments in each direction */ + AF_GlyphHintsRec hints[1]; + + + af_glyph_hints_init( hints, face->memory ); + + metrics->axis[AF_DIMENSION_HORZ].width_count = 0; + metrics->axis[AF_DIMENSION_VERT].width_count = 0; + + { + FT_Error error; + FT_UInt glyph_index; + int dim; + AF_LatinMetricsRec dummy[1]; + AF_Scaler scaler = &dummy->root.scaler; + + + glyph_index = FT_Get_Char_Index( + face, + metrics->root.style_class->standard_char ); + if ( glyph_index == 0 ) + goto Exit; + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || face->glyph->outline.n_points <= 0 ) + goto Exit; + + FT_ZERO( dummy ); + + dummy->units_per_em = metrics->units_per_em; + scaler->x_scale = scaler->y_scale = 0x10000L; + scaler->x_delta = scaler->y_delta = 0; + scaler->face = face; + scaler->render_mode = FT_RENDER_MODE_NORMAL; + scaler->flags = 0; + + af_glyph_hints_rescale( hints, (AF_StyleMetrics)dummy ); + + error = af_glyph_hints_reload( hints, &face->glyph->outline ); + if ( error ) + goto Exit; + + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + AF_AxisHints axhints = &hints->axis[dim]; + AF_Segment seg, limit, link; + FT_UInt num_widths = 0; + + + error = af_latin2_hints_compute_segments( hints, + (AF_Dimension)dim ); + if ( error ) + goto Exit; + + af_latin2_hints_link_segments( hints, + (AF_Dimension)dim ); + + seg = axhints->segments; + limit = seg + axhints->num_segments; + + for ( ; seg < limit; seg++ ) + { + link = seg->link; + + /* we only consider stem segments there! */ + if ( link && link->link == seg && link > seg ) + { + FT_Pos dist; + + + dist = seg->pos - link->pos; + if ( dist < 0 ) + dist = -dist; + + if ( num_widths < AF_LATIN_MAX_WIDTHS ) + axis->widths[num_widths++].org = dist; + } + } + + af_sort_widths( num_widths, axis->widths ); + axis->width_count = num_widths; + } + + Exit: + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { + AF_LatinAxis axis = &metrics->axis[dim]; + FT_Pos stdw; + + + stdw = ( axis->width_count > 0 ) + ? axis->widths[0].org + : AF_LATIN_CONSTANT( metrics, 50 ); + + /* let's try 20% of the smallest width */ + axis->edge_distance_threshold = stdw / 5; + axis->standard_width = stdw; + axis->extra_light = 0; + } + } + + af_glyph_hints_done( hints ); + } + + + +#define AF_LATIN_MAX_TEST_CHARACTERS 12 + + + static const char af_latin2_blue_chars[AF_LATIN_MAX_BLUES] + [AF_LATIN_MAX_TEST_CHARACTERS+1] = + { + "THEZOCQS", + "HEZLOCUS", + "fijkdbh", + "xzroesc", + "xzroesc", + "pqgjy" + }; + + + static void + af_latin2_metrics_init_blues( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Pos flats [AF_LATIN_MAX_TEST_CHARACTERS]; + FT_Pos rounds[AF_LATIN_MAX_TEST_CHARACTERS]; + FT_Int num_flats; + FT_Int num_rounds; + FT_Int bb; + AF_LatinBlue blue; + FT_Error error; + AF_LatinAxis axis = &metrics->axis[AF_DIMENSION_VERT]; + FT_GlyphSlot glyph = face->glyph; + + + /* we compute the blues simply by loading each character from the */ + /* 'af_latin2_blue_chars[blues]' string, then compute its top-most or */ + /* bottom-most points (depending on `AF_IS_TOP_BLUE') */ + + FT_TRACE5(( "blue zones computation\n" + "======================\n\n" )); + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + const char* p = af_latin2_blue_chars[bb]; + const char* limit = p + AF_LATIN_MAX_TEST_CHARACTERS; + FT_Pos* blue_ref; + FT_Pos* blue_shoot; + + + FT_TRACE5(( "blue zone %d:\n", bb )); + + num_flats = 0; + num_rounds = 0; + + for ( ; p < limit && *p; p++ ) + { + FT_UInt glyph_index; + FT_Int best_point, best_y, best_first, best_last; + FT_Vector* points; + FT_Bool round; + + + /* load the character in the face -- skip unknown or empty ones */ + glyph_index = FT_Get_Char_Index( face, (FT_UInt)*p ); + if ( glyph_index == 0 ) + continue; + + error = FT_Load_Glyph( face, glyph_index, FT_LOAD_NO_SCALE ); + if ( error || glyph->outline.n_points <= 0 ) + continue; + + /* now compute min or max point indices and coordinates */ + points = glyph->outline.points; + best_point = -1; + best_y = 0; /* make compiler happy */ + best_first = 0; /* ditto */ + best_last = 0; /* ditto */ + + { + FT_Int nn; + FT_Int first = 0; + FT_Int last = -1; + + + for ( nn = 0; nn < glyph->outline.n_contours; first = last+1, nn++ ) + { + FT_Int old_best_point = best_point; + FT_Int pp; + + + last = glyph->outline.contours[nn]; + + /* Avoid single-point contours since they are never rasterized. */ + /* In some fonts, they correspond to mark attachment points */ + /* which are way outside of the glyph's real outline. */ + if ( last == first ) + continue; + + if ( AF_LATIN_IS_TOP_BLUE( bb ) ) + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y > best_y ) + { + best_point = pp; + best_y = points[pp].y; + } + } + else + { + for ( pp = first; pp <= last; pp++ ) + if ( best_point < 0 || points[pp].y < best_y ) + { + best_point = pp; + best_y = points[pp].y; + } + } + + if ( best_point != old_best_point ) + { + best_first = first; + best_last = last; + } + } + FT_TRACE5(( " %c %d", *p, best_y )); + } + + /* now check whether the point belongs to a straight or round */ + /* segment; we first need to find in which contour the extremum */ + /* lies, then inspect its previous and next points */ + { + FT_Pos best_x = points[best_point].x; + FT_Int start, end, prev, next; + FT_Pos dist; + + + /* now look for the previous and next points that are not on the */ + /* same Y coordinate. Threshold the `closeness'... */ + start = end = best_point; + + do + { + prev = start - 1; + if ( prev < best_first ) + prev = best_last; + + dist = FT_ABS( points[prev].y - best_y ); + /* accept a small distance or a small angle (both values are */ + /* heuristic; value 20 corresponds to approx. 2.9 degrees) */ + if ( dist > 5 ) + if ( FT_ABS( points[prev].x - best_x ) <= 20 * dist ) + break; + + start = prev; + + } while ( start != best_point ); + + do + { + next = end + 1; + if ( next > best_last ) + next = best_first; + + dist = FT_ABS( points[next].y - best_y ); + if ( dist > 5 ) + if ( FT_ABS( points[next].x - best_x ) <= 20 * dist ) + break; + + end = next; + + } while ( end != best_point ); + + /* now, set the `round' flag depending on the segment's kind */ + round = FT_BOOL( + FT_CURVE_TAG( glyph->outline.tags[start] ) != FT_CURVE_TAG_ON || + FT_CURVE_TAG( glyph->outline.tags[ end ] ) != FT_CURVE_TAG_ON ); + + FT_TRACE5(( " (%s)\n", round ? "round" : "flat" )); + } + + if ( round ) + rounds[num_rounds++] = best_y; + else + flats[num_flats++] = best_y; + } + + if ( num_flats == 0 && num_rounds == 0 ) + { + /* + * we couldn't find a single glyph to compute this blue zone, + * we will simply ignore it then + */ + FT_TRACE5(( " empty\n" )); + continue; + } + + /* we have computed the contents of the `rounds' and `flats' tables, */ + /* now determine the reference and overshoot position of the blue -- */ + /* we simply take the median value after a simple sort */ + af_sort_pos( num_rounds, rounds ); + af_sort_pos( num_flats, flats ); + + blue = & axis->blues[axis->blue_count]; + blue_ref = & blue->ref.org; + blue_shoot = & blue->shoot.org; + + axis->blue_count++; + + if ( num_flats == 0 ) + { + *blue_ref = + *blue_shoot = rounds[num_rounds / 2]; + } + else if ( num_rounds == 0 ) + { + *blue_ref = + *blue_shoot = flats[num_flats / 2]; + } + else + { + *blue_ref = flats[num_flats / 2]; + *blue_shoot = rounds[num_rounds / 2]; + } + + /* there are sometimes problems: if the overshoot position of top */ + /* zones is under its reference position, or the opposite for bottom */ + /* zones. We must thus check everything there and correct the errors */ + if ( *blue_shoot != *blue_ref ) + { + FT_Pos ref = *blue_ref; + FT_Pos shoot = *blue_shoot; + FT_Bool over_ref = FT_BOOL( shoot > ref ); + + + if ( AF_LATIN_IS_TOP_BLUE( bb ) ^ over_ref ) + { + *blue_ref = + *blue_shoot = ( shoot + ref ) / 2; + + FT_TRACE5(( " [overshoot smaller than reference," + " taking mean value]\n" )); + } + } + + blue->flags = 0; + if ( AF_LATIN_IS_TOP_BLUE( bb ) ) + blue->flags |= AF_LATIN_BLUE_TOP; + + /* + * The following flag is used later to adjust the y and x scales + * in order to optimize the pixel grid alignment of the top of small + * letters. + */ + if ( AF_LATIN_IS_X_HEIGHT_BLUE( bb ) ) + blue->flags |= AF_LATIN_BLUE_ADJUSTMENT; + + FT_TRACE5(( " -> reference = %ld\n" + " overshoot = %ld\n", + *blue_ref, *blue_shoot )); + } + + return; + } + + + FT_LOCAL_DEF( void ) + af_latin2_metrics_check_digits( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_UInt i; + FT_Bool started = 0, same_width = 1; + FT_Fixed advance, old_advance = 0; + + + /* check whether all ASCII digits have the same advance width; */ + /* digit `0' is 0x30 in all supported charmaps */ + for ( i = 0x30; i <= 0x39; i++ ) + { + FT_UInt glyph_index; + + + glyph_index = FT_Get_Char_Index( face, i ); + if ( glyph_index == 0 ) + continue; + + if ( FT_Get_Advance( face, glyph_index, + FT_LOAD_NO_SCALE | + FT_LOAD_NO_HINTING | + FT_LOAD_IGNORE_TRANSFORM, + &advance ) ) + continue; + + if ( started ) + { + if ( advance != old_advance ) + { + same_width = 0; + break; + } + } + else + { + old_advance = advance; + started = 1; + } + } + + metrics->root.digits_have_same_width = same_width; + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin2_metrics_init( AF_LatinMetrics metrics, + FT_Face face ) + { + FT_Error error = FT_Err_Ok; + FT_CharMap oldmap = face->charmap; + FT_UInt ee; + + static const FT_Encoding latin_encodings[] = + { + FT_ENCODING_UNICODE, + FT_ENCODING_APPLE_ROMAN, + FT_ENCODING_ADOBE_STANDARD, + FT_ENCODING_ADOBE_LATIN_1, + FT_ENCODING_NONE /* end of list */ + }; + + + metrics->units_per_em = face->units_per_EM; + + /* do we have a latin charmap in there? */ + for ( ee = 0; latin_encodings[ee] != FT_ENCODING_NONE; ee++ ) + { + error = FT_Select_Charmap( face, latin_encodings[ee] ); + if ( !error ) + break; + } + + if ( !error ) + { + af_latin2_metrics_init_widths( metrics, face ); + af_latin2_metrics_init_blues( metrics, face ); + af_latin2_metrics_check_digits( metrics, face ); + } + + FT_Set_Charmap( face, oldmap ); + return FT_Err_Ok; + } + + + static void + af_latin2_metrics_scale_dim( AF_LatinMetrics metrics, + AF_Scaler scaler, + AF_Dimension dim ) + { + FT_Fixed scale; + FT_Pos delta; + AF_LatinAxis axis; + FT_UInt nn; + + + if ( dim == AF_DIMENSION_HORZ ) + { + scale = scaler->x_scale; + delta = scaler->x_delta; + } + else + { + scale = scaler->y_scale; + delta = scaler->y_delta; + } + + axis = &metrics->axis[dim]; + + if ( axis->org_scale == scale && axis->org_delta == delta ) + return; + + axis->org_scale = scale; + axis->org_delta = delta; + + /* + * correct Y scale to optimize the alignment of the top of small + * letters to the pixel grid + */ + if ( dim == AF_DIMENSION_VERT ) + { + AF_LatinAxis vaxis = &metrics->axis[AF_DIMENSION_VERT]; + AF_LatinBlue blue = NULL; + + + for ( nn = 0; nn < vaxis->blue_count; nn++ ) + { + if ( vaxis->blues[nn].flags & AF_LATIN_BLUE_ADJUSTMENT ) + { + blue = &vaxis->blues[nn]; + break; + } + } + + if ( blue ) + { + FT_Pos scaled; + FT_Pos threshold; + FT_Pos fitted; + FT_UInt limit; + FT_UInt ppem; + + + scaled = FT_MulFix( blue->shoot.org, scaler->y_scale ); + ppem = metrics->root.scaler.face->size->metrics.x_ppem; + limit = metrics->root.globals->increase_x_height; + threshold = 40; + + /* if the `increase-x-height' property is active, */ + /* we round up much more often */ + if ( limit && + ppem <= limit && + ppem >= AF_PROP_INCREASE_X_HEIGHT_MIN ) + threshold = 52; + + fitted = ( scaled + threshold ) & ~63; + +#if 1 + if ( scaled != fitted ) + { + scale = FT_MulDiv( scale, fitted, scaled ); + FT_TRACE5(( "== scaled x-top = %.2g" + " fitted = %.2g, scaling = %.4g\n", + scaled / 64.0, fitted / 64.0, + ( fitted * 1.0 ) / scaled )); + } +#endif + } + } + + axis->scale = scale; + axis->delta = delta; + + if ( dim == AF_DIMENSION_HORZ ) + { + metrics->root.scaler.x_scale = scale; + metrics->root.scaler.x_delta = delta; + } + else + { + metrics->root.scaler.y_scale = scale; + metrics->root.scaler.y_delta = delta; + } + + /* scale the standard widths */ + for ( nn = 0; nn < axis->width_count; nn++ ) + { + AF_Width width = axis->widths + nn; + + + width->cur = FT_MulFix( width->org, scale ); + width->fit = width->cur; + } + + /* an extra-light axis corresponds to a standard width that is */ + /* smaller than 5/8 pixels */ + axis->extra_light = + (FT_Bool)( FT_MulFix( axis->standard_width, scale ) < 32 + 8 ); + + if ( dim == AF_DIMENSION_VERT ) + { + /* scale the blue zones */ + for ( nn = 0; nn < axis->blue_count; nn++ ) + { + AF_LatinBlue blue = &axis->blues[nn]; + FT_Pos dist; + + + blue->ref.cur = FT_MulFix( blue->ref.org, scale ) + delta; + blue->ref.fit = blue->ref.cur; + blue->shoot.cur = FT_MulFix( blue->shoot.org, scale ) + delta; + blue->shoot.fit = blue->shoot.cur; + blue->flags &= ~AF_LATIN_BLUE_ACTIVE; + + /* a blue zone is only active if it is less than 3/4 pixels tall */ + dist = FT_MulFix( blue->ref.org - blue->shoot.org, scale ); + if ( dist <= 48 && dist >= -48 ) + { + FT_Pos delta1, delta2; + + delta1 = blue->shoot.org - blue->ref.org; + delta2 = delta1; + if ( delta1 < 0 ) + delta2 = -delta2; + + delta2 = FT_MulFix( delta2, scale ); + + if ( delta2 < 32 ) + delta2 = 0; + else if ( delta2 < 64 ) + delta2 = 32 + ( ( ( delta2 - 32 ) + 16 ) & ~31 ); + else + delta2 = FT_PIX_ROUND( delta2 ); + + if ( delta1 < 0 ) + delta2 = -delta2; + + blue->ref.fit = FT_PIX_ROUND( blue->ref.cur ); + blue->shoot.fit = blue->ref.fit + delta2; + + FT_TRACE5(( ">> activating blue zone %d:" + " ref.cur=%.2g ref.fit=%.2g" + " shoot.cur=%.2g shoot.fit=%.2g\n", + nn, blue->ref.cur / 64.0, blue->ref.fit / 64.0, + blue->shoot.cur / 64.0, blue->shoot.fit / 64.0 )); + + blue->flags |= AF_LATIN_BLUE_ACTIVE; + } + } + } + } + + + FT_LOCAL_DEF( void ) + af_latin2_metrics_scale( AF_LatinMetrics metrics, + AF_Scaler scaler ) + { + metrics->root.scaler.render_mode = scaler->render_mode; + metrics->root.scaler.face = scaler->face; + metrics->root.scaler.flags = scaler->flags; + + af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_HORZ ); + af_latin2_metrics_scale_dim( metrics, scaler, AF_DIMENSION_VERT ); + } + + + /* Extract standard_width from writing system/script specific */ + /* metrics class. */ + + FT_LOCAL_DEF( void ) + af_latin2_get_standard_widths( AF_LatinMetrics metrics, + FT_Pos* stdHW, + FT_Pos* stdVW ) + { + if ( stdHW ) + *stdHW = metrics->axis[AF_DIMENSION_VERT].standard_width; + + if ( stdVW ) + *stdVW = metrics->axis[AF_DIMENSION_HORZ].standard_width; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H A N A L Y S I S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define SORT_SEGMENTS + + FT_LOCAL_DEF( FT_Error ) + af_latin2_hints_compute_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Memory memory = hints->memory; + FT_Error error = FT_Err_Ok; + AF_Segment segment = NULL; + AF_SegmentRec seg0; + AF_Point* contour = hints->contours; + AF_Point* contour_limit = contour + hints->num_contours; + AF_Direction major_dir, segment_dir; + + + FT_ZERO( &seg0 ); + seg0.score = 32000; + seg0.flags = AF_EDGE_NORMAL; + + major_dir = (AF_Direction)FT_ABS( axis->major_dir ); + segment_dir = major_dir; + + axis->num_segments = 0; + + /* set up (u,v) in each point */ + if ( dim == AF_DIMENSION_HORZ ) + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fx; + point->v = point->fy; + } + } + else + { + AF_Point point = hints->points; + AF_Point limit = point + hints->num_points; + + + for ( ; point < limit; point++ ) + { + point->u = point->fy; + point->v = point->fx; + } + } + + /* do each contour separately */ + for ( ; contour < contour_limit; contour++ ) + { + AF_Point point = contour[0]; + AF_Point start = point; + AF_Point last = point->prev; + + + if ( point == last ) /* skip singletons -- just in case */ + continue; + + /* already on an edge ?, backtrack to find its start */ + if ( FT_ABS( point->in_dir ) == major_dir ) + { + point = point->prev; + + while ( point->in_dir == start->in_dir ) + point = point->prev; + } + else /* otherwise, find first segment start, if any */ + { + while ( FT_ABS( point->out_dir ) != major_dir ) + { + point = point->next; + + if ( point == start ) + goto NextContour; + } + } + + start = point; + + for (;;) + { + AF_Point first; + FT_Pos min_u, min_v, max_u, max_v; + + /* we're at the start of a new segment */ + FT_ASSERT( FT_ABS( point->out_dir ) == major_dir && + point->in_dir != point->out_dir ); + first = point; + + min_u = max_u = point->u; + min_v = max_v = point->v; + + point = point->next; + + while ( point->out_dir == first->out_dir ) + { + point = point->next; + + if ( point->u < min_u ) + min_u = point->u; + + if ( point->u > max_u ) + max_u = point->u; + } + + if ( point->v < min_v ) + min_v = point->v; + + if ( point->v > max_v ) + max_v = point->v; + + /* record new segment */ + error = af_axis_hints_new_segment( axis, memory, &segment ); + if ( error ) + goto Exit; + + segment[0] = seg0; + segment->dir = first->out_dir; + segment->first = first; + segment->last = point; + segment->pos = (FT_Short)( ( min_u + max_u ) >> 1 ); + segment->min_coord = (FT_Short) min_v; + segment->max_coord = (FT_Short) max_v; + segment->height = (FT_Short)( max_v - min_v ); + + /* a segment is round if it doesn't have successive */ + /* on-curve points. */ + { + AF_Point pt = first; + AF_Point last = point; + FT_UInt f0 = pt->flags & AF_FLAG_CONTROL; + FT_UInt f1; + + + segment->flags &= ~AF_EDGE_ROUND; + + for ( ; pt != last; f0 = f1 ) + { + pt = pt->next; + f1 = pt->flags & AF_FLAG_CONTROL; + + if ( !f0 && !f1 ) + break; + + if ( pt == last ) + segment->flags |= AF_EDGE_ROUND; + } + } + + /* this can happen in the case of a degenerate contour + * e.g. a 2-point vertical contour + */ + if ( point == start ) + break; + + /* jump to the start of the next segment, if any */ + while ( FT_ABS( point->out_dir ) != major_dir ) + { + point = point->next; + + if ( point == start ) + goto NextContour; + } + } + + NextContour: + ; + } /* contours */ + + /* now slightly increase the height of segments when this makes */ + /* sense -- this is used to better detect and ignore serifs */ + { + AF_Segment segments = axis->segments; + AF_Segment segments_end = segments + axis->num_segments; + + + for ( segment = segments; segment < segments_end; segment++ ) + { + AF_Point first = segment->first; + AF_Point last = segment->last; + AF_Point p; + FT_Pos first_v = first->v; + FT_Pos last_v = last->v; + + + if ( first_v < last_v ) + { + p = first->prev; + if ( p->v < first_v ) + segment->height = (FT_Short)( segment->height + + ( ( first_v - p->v ) >> 1 ) ); + + p = last->next; + if ( p->v > last_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - last_v ) >> 1 ) ); + } + else + { + p = first->prev; + if ( p->v > first_v ) + segment->height = (FT_Short)( segment->height + + ( ( p->v - first_v ) >> 1 ) ); + + p = last->next; + if ( p->v < last_v ) + segment->height = (FT_Short)( segment->height + + ( ( last_v - p->v ) >> 1 ) ); + } + } + } + +#ifdef AF_SORT_SEGMENTS + /* place all segments with a negative direction to the start + * of the array, used to speed up segment linking later... + */ + { + AF_Segment segments = axis->segments; + FT_UInt count = axis->num_segments; + FT_UInt ii, jj; + + for ( ii = 0; ii < count; ii++ ) + { + if ( segments[ii].dir > 0 ) + { + for ( jj = ii + 1; jj < count; jj++ ) + { + if ( segments[jj].dir < 0 ) + { + AF_SegmentRec tmp; + + + tmp = segments[ii]; + segments[ii] = segments[jj]; + segments[jj] = tmp; + + break; + } + } + + if ( jj == count ) + break; + } + } + axis->mid_segments = ii; + } +#endif + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + af_latin2_hints_link_segments( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; +#ifdef AF_SORT_SEGMENTS + AF_Segment segment_mid = segments + axis->mid_segments; +#endif + FT_Pos len_threshold, len_score; + AF_Segment seg1, seg2; + + + len_threshold = AF_LATIN_CONSTANT( hints->metrics, 8 ); + if ( len_threshold == 0 ) + len_threshold = 1; + + len_score = AF_LATIN_CONSTANT( hints->metrics, 6000 ); + +#ifdef AF_SORT_SEGMENTS + for ( seg1 = segments; seg1 < segment_mid; seg1++ ) + { + if ( seg1->dir != axis->major_dir ) + continue; + + for ( seg2 = segment_mid; seg2 < segment_limit; seg2++ ) +#else + /* now compare each segment to the others */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + if ( seg1->dir != axis->major_dir ) + continue; + + for ( seg2 = segments; seg2 < segment_limit; seg2++ ) + if ( seg1->dir + seg2->dir == 0 && seg2->pos > seg1->pos ) +#endif + { + FT_Pos pos1 = seg1->pos; + FT_Pos pos2 = seg2->pos; + FT_Pos dist = pos2 - pos1; + + + if ( dist < 0 ) + continue; + + { + FT_Pos min = seg1->min_coord; + FT_Pos max = seg1->max_coord; + FT_Pos len, score; + + + if ( min < seg2->min_coord ) + min = seg2->min_coord; + + if ( max > seg2->max_coord ) + max = seg2->max_coord; + + len = max - min; + if ( len >= len_threshold ) + { + score = dist + len_score / len; + if ( score < seg1->score ) + { + seg1->score = score; + seg1->link = seg2; + } + + if ( score < seg2->score ) + { + seg2->score = score; + seg2->link = seg1; + } + } + } + } + } +#if 0 + } +#endif + + /* now, compute the `serif' segments */ + for ( seg1 = segments; seg1 < segment_limit; seg1++ ) + { + seg2 = seg1->link; + + if ( seg2 ) + { + if ( seg2->link != seg1 ) + { + seg1->link = NULL; + seg1->serif = seg2->link; + } + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin2_hints_compute_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + FT_Error error = FT_Err_Ok; + FT_Memory memory = hints->memory; + AF_LatinAxis laxis = &((AF_LatinMetrics)hints->metrics)->axis[dim]; + + AF_Segment segments = axis->segments; + AF_Segment segment_limit = segments + axis->num_segments; + AF_Segment seg; + + AF_Direction up_dir; + FT_Fixed scale; + FT_Pos edge_distance_threshold; + FT_Pos segment_length_threshold; + + + axis->num_edges = 0; + + scale = ( dim == AF_DIMENSION_HORZ ) ? hints->x_scale + : hints->y_scale; + + up_dir = ( dim == AF_DIMENSION_HORZ ) ? AF_DIR_UP + : AF_DIR_RIGHT; + + /* + * We want to ignore very small (mostly serif) segments, we do that + * by ignoring those that whose length is less than a given fraction + * of the standard width. If there is no standard width, we ignore + * those that are less than a given size in pixels + * + * also, unlink serif segments that are linked to segments farther + * than 50% of the standard width + */ + if ( dim == AF_DIMENSION_HORZ ) + { + if ( laxis->width_count > 0 ) + segment_length_threshold = ( laxis->standard_width * 10 ) >> 4; + else + segment_length_threshold = FT_DivFix( 64, hints->y_scale ); + } + else + segment_length_threshold = 0; + + /*********************************************************************/ + /* */ + /* We will begin by generating a sorted table of edges for the */ + /* current direction. To do so, we simply scan each segment and try */ + /* to find an edge in our table that corresponds to its position. */ + /* */ + /* If no edge is found, we create and insert a new edge in the */ + /* sorted table. Otherwise, we simply add the segment to the edge's */ + /* list which will be processed in the second step to compute the */ + /* edge's properties. */ + /* */ + /* Note that the edges table is sorted along the segment/edge */ + /* position. */ + /* */ + /*********************************************************************/ + + edge_distance_threshold = FT_MulFix( laxis->edge_distance_threshold, + scale ); + if ( edge_distance_threshold > 64 / 4 ) + edge_distance_threshold = 64 / 4; + + edge_distance_threshold = FT_DivFix( edge_distance_threshold, + scale ); + + for ( seg = segments; seg < segment_limit; seg++ ) + { + AF_Edge found = NULL; + FT_Int ee; + + + if ( seg->height < segment_length_threshold ) + continue; + + /* A special case for serif edges: If they are smaller than */ + /* 1.5 pixels we ignore them. */ + if ( seg->serif ) + { + FT_Pos dist = seg->serif->pos - seg->pos; + + + if ( dist < 0 ) + dist = -dist; + + if ( dist >= laxis->standard_width >> 1 ) + { + /* unlink this serif, it is too distant from its reference stem */ + seg->serif = NULL; + } + else if ( 2*seg->height < 3 * segment_length_threshold ) + continue; + } + + /* look for an edge corresponding to the segment */ + for ( ee = 0; ee < axis->num_edges; ee++ ) + { + AF_Edge edge = axis->edges + ee; + FT_Pos dist; + + + dist = seg->pos - edge->fpos; + if ( dist < 0 ) + dist = -dist; + + if ( dist < edge_distance_threshold && edge->dir == seg->dir ) + { + found = edge; + break; + } + } + + if ( !found ) + { + AF_Edge edge; + + + /* insert a new edge in the list and */ + /* sort according to the position */ + error = af_axis_hints_new_edge( axis, seg->pos, seg->dir, 0, + memory, &edge ); + if ( error ) + goto Exit; + + /* add the segment to the new edge's list */ + FT_ZERO( edge ); + + edge->first = seg; + edge->last = seg; + edge->dir = seg->dir; + edge->fpos = seg->pos; + edge->opos = FT_MulFix( seg->pos, scale ); + edge->pos = edge->opos; + seg->edge_next = seg; + } + else + { + /* if an edge was found, simply add the segment to the edge's */ + /* list */ + seg->edge_next = found->first; + found->last->edge_next = seg; + found->last = seg; + } + } + + + /*********************************************************************/ + /* */ + /* Good, we will now compute each edge's properties according to */ + /* segments found on its position. Basically, these are: */ + /* */ + /* - edge's main direction */ + /* - stem edge, serif edge or both (which defaults to stem then) */ + /* - rounded edge, straight or both (which defaults to straight) */ + /* - link for edge */ + /* */ + /*********************************************************************/ + + /* first of all, set the `edge' field in each segment -- this is */ + /* required in order to compute edge links */ + + /* + * Note that removing this loop and setting the `edge' field of each + * segment directly in the code above slows down execution speed for + * some reasons on platforms like the Sun. + */ + { + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + + + for ( edge = edges; edge < edge_limit; edge++ ) + { + seg = edge->first; + if ( seg ) + do + { + seg->edge = edge; + seg = seg->edge_next; + + } while ( seg != edge->first ); + } + + /* now, compute each edge properties */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Int is_round = 0; /* does it contain round segments? */ + FT_Int is_straight = 0; /* does it contain straight segments? */ +#if 0 + FT_Pos ups = 0; /* number of upwards segments */ + FT_Pos downs = 0; /* number of downwards segments */ +#endif + + + seg = edge->first; + + do + { + FT_Bool is_serif; + + + /* check for roundness of segment */ + if ( seg->flags & AF_EDGE_ROUND ) + is_round++; + else + is_straight++; + +#if 0 + /* check for segment direction */ + if ( seg->dir == up_dir ) + ups += seg->max_coord-seg->min_coord; + else + downs += seg->max_coord-seg->min_coord; +#endif + + /* check for links -- if seg->serif is set, then seg->link must */ + /* be ignored */ + is_serif = (FT_Bool)( seg->serif && + seg->serif->edge && + seg->serif->edge != edge ); + + if ( ( seg->link && seg->link->edge ) || is_serif ) + { + AF_Edge edge2; + AF_Segment seg2; + + + edge2 = edge->link; + seg2 = seg->link; + + if ( is_serif ) + { + seg2 = seg->serif; + edge2 = edge->serif; + } + + if ( edge2 ) + { + FT_Pos edge_delta; + FT_Pos seg_delta; + + + edge_delta = edge->fpos - edge2->fpos; + if ( edge_delta < 0 ) + edge_delta = -edge_delta; + + seg_delta = seg->pos - seg2->pos; + if ( seg_delta < 0 ) + seg_delta = -seg_delta; + + if ( seg_delta < edge_delta ) + edge2 = seg2->edge; + } + else + edge2 = seg2->edge; + + if ( is_serif ) + { + edge->serif = edge2; + edge2->flags |= AF_EDGE_SERIF; + } + else + edge->link = edge2; + } + + seg = seg->edge_next; + + } while ( seg != edge->first ); + + /* set the round/straight flags */ + edge->flags = AF_EDGE_NORMAL; + + if ( is_round > 0 && is_round >= is_straight ) + edge->flags |= AF_EDGE_ROUND; + +#if 0 + /* set the edge's main direction */ + edge->dir = AF_DIR_NONE; + + if ( ups > downs ) + edge->dir = (FT_Char)up_dir; + + else if ( ups < downs ) + edge->dir = (FT_Char)-up_dir; + + else if ( ups == downs ) + edge->dir = 0; /* both up and down! */ +#endif + + /* gets rid of serifs if link is set */ + /* XXX: This gets rid of many unpleasant artefacts! */ + /* Example: the `c' in cour.pfa at size 13 */ + + if ( edge->serif && edge->link ) + edge->serif = NULL; + } + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + af_latin2_hints_detect_features( AF_GlyphHints hints, + AF_Dimension dim ) + { + FT_Error error; + + + error = af_latin2_hints_compute_segments( hints, dim ); + if ( !error ) + { + af_latin2_hints_link_segments( hints, dim ); + + error = af_latin2_hints_compute_edges( hints, dim ); + } + return error; + } + + + static void + af_latin2_hints_compute_blue_edges( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + AF_AxisHints axis = &hints->axis[AF_DIMENSION_VERT]; + AF_Edge edge = axis->edges; + AF_Edge edge_limit = edge + axis->num_edges; + AF_LatinAxis latin = &metrics->axis[AF_DIMENSION_VERT]; + FT_Fixed scale = latin->scale; + FT_Pos best_dist0; /* initial threshold */ + + + /* compute the initial threshold as a fraction of the EM size */ + best_dist0 = FT_MulFix( metrics->units_per_em / 40, scale ); + + if ( best_dist0 > 64 / 2 ) + best_dist0 = 64 / 2; + + /* compute which blue zones are active, i.e. have their scaled */ + /* size < 3/4 pixels */ + + /* for each horizontal edge search the blue zone which is closest */ + for ( ; edge < edge_limit; edge++ ) + { + FT_Int bb; + AF_Width best_blue = NULL; + FT_Pos best_dist = best_dist0; + + for ( bb = 0; bb < AF_LATIN_BLUE_MAX; bb++ ) + { + AF_LatinBlue blue = latin->blues + bb; + FT_Bool is_top_blue, is_major_dir; + + + /* skip inactive blue zones (i.e., those that are too small) */ + if ( !( blue->flags & AF_LATIN_BLUE_ACTIVE ) ) + continue; + + /* if it is a top zone, check for right edges -- if it is a bottom */ + /* zone, check for left edges */ + /* */ + /* of course, that's for TrueType */ + is_top_blue = (FT_Byte)( ( blue->flags & AF_LATIN_BLUE_TOP ) != 0 ); + is_major_dir = FT_BOOL( edge->dir == axis->major_dir ); + + /* if it is a top zone, the edge must be against the major */ + /* direction; if it is a bottom zone, it must be in the major */ + /* direction */ + if ( is_top_blue ^ is_major_dir ) + { + FT_Pos dist; + AF_Width compare; + + + /* if it's a rounded edge, compare it to the overshoot position */ + /* if it's a flat edge, compare it to the reference position */ + if ( edge->flags & AF_EDGE_ROUND ) + compare = &blue->shoot; + else + compare = &blue->ref; + + dist = edge->fpos - compare->org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = compare; + } + +#if 0 + /* now, compare it to the overshoot position if the edge is */ + /* rounded, and if the edge is over the reference position of a */ + /* top zone, or under the reference position of a bottom zone */ + if ( edge->flags & AF_EDGE_ROUND && dist != 0 ) + { + FT_Bool is_under_ref = FT_BOOL( edge->fpos < blue->ref.org ); + + + if ( is_top_blue ^ is_under_ref ) + { + blue = latin->blues + bb; + dist = edge->fpos - blue->shoot.org; + if ( dist < 0 ) + dist = -dist; + + dist = FT_MulFix( dist, scale ); + if ( dist < best_dist ) + { + best_dist = dist; + best_blue = & blue->shoot; + } + } + } +#endif + } + } + + if ( best_blue ) + edge->blue_edge = best_blue; + } + } + + + static FT_Error + af_latin2_hints_init( AF_GlyphHints hints, + AF_LatinMetrics metrics ) + { + FT_Render_Mode mode; + FT_UInt32 scaler_flags, other_flags; + FT_Face face = metrics->root.scaler.face; + + + af_glyph_hints_rescale( hints, (AF_StyleMetrics)metrics ); + + /* + * correct x_scale and y_scale if needed, since they may have + * been modified `af_latin2_metrics_scale_dim' above + */ + hints->x_scale = metrics->axis[AF_DIMENSION_HORZ].scale; + hints->x_delta = metrics->axis[AF_DIMENSION_HORZ].delta; + hints->y_scale = metrics->axis[AF_DIMENSION_VERT].scale; + hints->y_delta = metrics->axis[AF_DIMENSION_VERT].delta; + + /* compute flags depending on render mode, etc. */ + mode = metrics->root.scaler.render_mode; + +#if 0 /* #ifdef AF_CONFIG_OPTION_USE_WARPER */ + if ( mode == FT_RENDER_MODE_LCD || mode == FT_RENDER_MODE_LCD_V ) + metrics->root.scaler.render_mode = mode = FT_RENDER_MODE_NORMAL; +#endif + + scaler_flags = hints->scaler_flags; + other_flags = 0; + + /* + * We snap the width of vertical stems for the monochrome and + * horizontal LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_HORZ_SNAP; + + /* + * We snap the width of horizontal stems for the monochrome and + * vertical LCD rendering targets only. + */ + if ( mode == FT_RENDER_MODE_MONO || mode == FT_RENDER_MODE_LCD_V ) + other_flags |= AF_LATIN_HINTS_VERT_SNAP; + + /* + * We adjust stems to full pixels unless in `light' or `lcd' mode. + */ + if ( mode != FT_RENDER_MODE_LIGHT && mode != FT_RENDER_MODE_LCD ) + other_flags |= AF_LATIN_HINTS_STEM_ADJUST; + + if ( mode == FT_RENDER_MODE_MONO ) + other_flags |= AF_LATIN_HINTS_MONO; + + /* + * In `light' or `lcd' mode we disable horizontal hinting completely. + * We also do it if the face is italic. + */ + if ( mode == FT_RENDER_MODE_LIGHT || mode == FT_RENDER_MODE_LCD || + ( face->style_flags & FT_STYLE_FLAG_ITALIC ) != 0 ) + scaler_flags |= AF_SCALER_FLAG_NO_HORIZONTAL; + +#ifdef AF_CONFIG_OPTION_USE_WARPER + /* get (global) warper flag */ + if ( !metrics->root.globals->module->warping ) + scaler_flags |= AF_SCALER_FLAG_NO_WARPER; +#endif + + hints->scaler_flags = scaler_flags; + hints->other_flags = other_flags; + + return 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N G L Y P H G R I D - F I T T I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* snap a given width in scaled coordinates to one of the */ + /* current standard widths */ + + static FT_Pos + af_latin2_snap_width( AF_Width widths, + FT_UInt count, + FT_Pos width ) + { + FT_UInt n; + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + FT_Pos scaled; + + + for ( n = 0; n < count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + scaled = FT_PIX_ROUND( reference ); + + if ( width >= reference ) + { + if ( width < scaled + 48 ) + width = reference; + } + else + { + if ( width > scaled - 48 ) + width = reference; + } + + return width; + } + + + /* compute the snapped width of a given stem */ + + static FT_Pos + af_latin2_compute_stem_width( AF_GlyphHints hints, + AF_Dimension dim, + FT_Pos width, + FT_UInt base_flags, + FT_UInt stem_flags ) + { + AF_LatinMetrics metrics = (AF_LatinMetrics) hints->metrics; + AF_LatinAxis axis = & metrics->axis[dim]; + FT_Pos dist = width; + FT_Int sign = 0; + FT_Int vertical = ( dim == AF_DIMENSION_VERT ); + + FT_UNUSED( base_flags ); + + + if ( !AF_LATIN_HINTS_DO_STEM_ADJUST( hints ) || + axis->extra_light ) + return width; + + if ( dist < 0 ) + { + dist = -width; + sign = 1; + } + + if ( ( vertical && !AF_LATIN_HINTS_DO_VERT_SNAP( hints ) ) || + ( !vertical && !AF_LATIN_HINTS_DO_HORZ_SNAP( hints ) ) ) + { + /* smooth hinting process: very lightly quantize the stem width */ + + /* leave the widths of serifs alone */ + + if ( ( stem_flags & AF_EDGE_SERIF ) && vertical && ( dist < 3 * 64 ) ) + goto Done_Width; + +#if 0 + else if ( ( base_flags & AF_EDGE_ROUND ) ) + { + if ( dist < 80 ) + dist = 64; + } + else if ( dist < 56 ) + dist = 56; +#endif + if ( axis->width_count > 0 ) + { + FT_Pos delta; + + + /* compare to standard width */ + if ( axis->width_count > 0 ) + { + delta = dist - axis->widths[0].cur; + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + dist = axis->widths[0].cur; + if ( dist < 48 ) + dist = 48; + + goto Done_Width; + } + } + + if ( dist < 3 * 64 ) + { + delta = dist & 63; + dist &= -64; + + if ( delta < 10 ) + dist += delta; + + else if ( delta < 32 ) + dist += 10; + + else if ( delta < 54 ) + dist += 54; + + else + dist += delta; + } + else + dist = ( dist + 32 ) & ~63; + } + } + else + { + /* strong hinting process: snap the stem width to integer pixels */ + FT_Pos org_dist = dist; + + + dist = af_latin2_snap_width( axis->widths, axis->width_count, dist ); + + if ( vertical ) + { + /* in the case of vertical hinting, always round */ + /* the stem heights to integer pixels */ + + if ( dist >= 64 ) + dist = ( dist + 16 ) & ~63; + else + dist = 64; + } + else + { + if ( AF_LATIN_HINTS_DO_MONO( hints ) ) + { + /* monochrome horizontal hinting: snap widths to integer pixels */ + /* with a different threshold */ + + if ( dist < 64 ) + dist = 64; + else + dist = ( dist + 32 ) & ~63; + } + else + { + /* for horizontal anti-aliased hinting, we adopt a more subtle */ + /* approach: we strengthen small stems, round stems whose size */ + /* is between 1 and 2 pixels to an integer, otherwise nothing */ + + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + + else if ( dist < 128 ) + { + /* We only round to an integer width if the corresponding */ + /* distortion is less than 1/4 pixel. Otherwise this */ + /* makes everything worse since the diagonals, which are */ + /* not hinted, appear a lot bolder or thinner than the */ + /* vertical stems. */ + + FT_Int delta; + + + dist = ( dist + 22 ) & ~63; + delta = dist - org_dist; + if ( delta < 0 ) + delta = -delta; + + if ( delta >= 16 ) + { + dist = org_dist; + if ( dist < 48 ) + dist = ( dist + 64 ) >> 1; + } + } + else + /* round otherwise to prevent color fringes in LCD mode */ + dist = ( dist + 32 ) & ~63; + } + } + } + + Done_Width: + if ( sign ) + dist = -dist; + + return dist; + } + + + /* align one stem edge relative to the previous stem edge */ + + static void + af_latin2_align_linked_edge( AF_GlyphHints hints, + AF_Dimension dim, + AF_Edge base_edge, + AF_Edge stem_edge ) + { + FT_Pos dist = stem_edge->opos - base_edge->opos; + + FT_Pos fitted_width = af_latin2_compute_stem_width( hints, dim, dist, + base_edge->flags, + stem_edge->flags ); + + + stem_edge->pos = base_edge->pos + fitted_width; + + FT_TRACE5(( "LINK: edge %d (opos=%.2f) linked to (%.2f), " + "dist was %.2f, now %.2f\n", + stem_edge-hints->axis[dim].edges, stem_edge->opos / 64.0, + stem_edge->pos / 64.0, dist / 64.0, fitted_width / 64.0 )); + } + + + static void + af_latin2_align_serif_edge( AF_GlyphHints hints, + AF_Edge base, + AF_Edge serif ) + { + FT_UNUSED( hints ); + + serif->pos = base->pos + ( serif->opos - base->opos ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** E D G E H I N T I N G ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + static void + af_latin2_hint_edges( AF_GlyphHints hints, + AF_Dimension dim ) + { + AF_AxisHints axis = &hints->axis[dim]; + AF_Edge edges = axis->edges; + AF_Edge edge_limit = edges + axis->num_edges; + AF_Edge edge; + AF_Edge anchor = NULL; + FT_Int has_serifs = 0; + FT_Pos anchor_drift = 0; + + + + FT_TRACE5(( "==== hinting %s edges =====\n", + dim == AF_DIMENSION_HORZ ? "vertical" : "horizontal" )); + + /* we begin by aligning all stems relative to the blue zone */ + /* if needed -- that's only for horizontal edges */ + + if ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_BLUES( hints ) ) + { + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Width blue; + AF_Edge edge1, edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + blue = edge->blue_edge; + edge1 = NULL; + edge2 = edge->link; + + if ( blue ) + { + edge1 = edge; + } + else if ( edge2 && edge2->blue_edge ) + { + blue = edge2->blue_edge; + edge1 = edge2; + edge2 = edge; + } + + if ( !edge1 ) + continue; + + FT_TRACE5(( "BLUE: edge %d (opos=%.2f) snapped to (%.2f), " + "was (%.2f)\n", + edge1-edges, edge1->opos / 64.0, blue->fit / 64.0, + edge1->pos / 64.0 )); + + edge1->pos = blue->fit; + edge1->flags |= AF_EDGE_DONE; + + if ( edge2 && !edge2->blue_edge ) + { + af_latin2_align_linked_edge( hints, dim, edge1, edge2 ); + edge2->flags |= AF_EDGE_DONE; + } + + if ( !anchor ) + { + anchor = edge; + + anchor_drift = ( anchor->pos - anchor->opos ); + if ( edge2 ) + anchor_drift = ( anchor_drift + + ( edge2->pos - edge2->opos ) ) >> 1; + } + } + } + + /* now we will align all stem edges, trying to maintain the */ + /* relative order of stems in the glyph */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + AF_Edge edge2; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + /* skip all non-stem edges */ + edge2 = edge->link; + if ( !edge2 ) + { + has_serifs++; + continue; + } + + /* now align the stem */ + + /* this should not happen, but it's better to be safe */ + if ( edge2->blue_edge ) + { + FT_TRACE5(( "ASSERTION FAILED for edge %d\n", edge2-edges )); + + af_latin2_align_linked_edge( hints, dim, edge2, edge ); + edge->flags |= AF_EDGE_DONE; + continue; + } + + if ( !anchor ) + { + FT_Pos org_len, org_center, cur_len; + FT_Pos cur_pos1, error1, error2, u_off, d_off; + + + org_len = edge2->opos - edge->opos; + cur_len = af_latin2_compute_stem_width( hints, dim, org_len, + edge->flags, + edge2->flags ); + if ( cur_len <= 64 ) + u_off = d_off = 32; + else + { + u_off = 38; + d_off = 26; + } + + if ( cur_len < 96 ) + { + org_center = edge->opos + ( org_len >> 1 ); + + cur_pos1 = FT_PIX_ROUND( org_center ); + + error1 = org_center - ( cur_pos1 - u_off ); + if ( error1 < 0 ) + error1 = -error1; + + error2 = org_center - ( cur_pos1 + d_off ); + if ( error2 < 0 ) + error2 = -error2; + + if ( error1 < error2 ) + cur_pos1 -= u_off; + else + cur_pos1 += d_off; + + edge->pos = cur_pos1 - cur_len / 2; + edge2->pos = edge->pos + cur_len; + } + else + edge->pos = FT_PIX_ROUND( edge->opos ); + + FT_TRACE5(( "ANCHOR: edge %d (opos=%.2f) and %d (opos=%.2f)" + " snapped to (%.2f) (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0 )); + anchor = edge; + + edge->flags |= AF_EDGE_DONE; + + af_latin2_align_linked_edge( hints, dim, edge, edge2 ); + + edge2->flags |= AF_EDGE_DONE; + + anchor_drift = ( ( anchor->pos - anchor->opos ) + + ( edge2->pos - edge2->opos ) ) >> 1; + + FT_TRACE5(( "DRIFT: %.2f\n", anchor_drift/64.0 )); + } + else + { + FT_Pos org_pos, org_len, org_center, cur_center, cur_len; + FT_Pos org_left, org_right; + + + org_pos = edge->opos + anchor_drift; + org_len = edge2->opos - edge->opos; + org_center = org_pos + ( org_len >> 1 ); + + cur_len = af_latin2_compute_stem_width( hints, dim, org_len, + edge->flags, + edge2->flags ); + + org_left = org_pos + ( ( org_len - cur_len ) >> 1 ); + org_right = org_pos + ( ( org_len + cur_len ) >> 1 ); + + FT_TRACE5(( "ALIGN: left=%.2f right=%.2f ", + org_left / 64.0, org_right / 64.0 )); + cur_center = org_center; + + if ( edge2->flags & AF_EDGE_DONE ) + { + FT_TRACE5(( "\n" )); + edge->pos = edge2->pos - cur_len; + } + else + { + /* we want to compare several displacement, and choose + * the one that increases fitness while minimizing + * distortion as well + */ + FT_Pos displacements[6], scores[6], org, fit, delta; + FT_UInt count = 0; + + /* note: don't even try to fit tiny stems */ + if ( cur_len < 32 ) + { + FT_TRACE5(( "tiny stem\n" )); + goto AlignStem; + } + + /* if the span is within a single pixel, don't touch it */ + if ( FT_PIX_FLOOR( org_left ) == FT_PIX_CEIL( org_right ) ) + { + FT_TRACE5(( "single pixel stem\n" )); + goto AlignStem; + } + + if ( cur_len <= 96 ) + { + /* we want to avoid the absolute worst case which is + * when the left and right edges of the span each represent + * about 50% of the gray. we'd better want to change this + * to 25/75%, since this is much more pleasant to the eye with + * very acceptable distortion + */ + FT_Pos frac_left = org_left & 63; + FT_Pos frac_right = org_right & 63; + + if ( frac_left >= 22 && frac_left <= 42 && + frac_right >= 22 && frac_right <= 42 ) + { + org = frac_left; + fit = ( org <= 32 ) ? 16 : 48; + delta = FT_ABS( fit - org ); + displacements[count] = fit - org; + scores[count++] = delta; + FT_TRACE5(( "dispA=%.2f (%d) ", ( fit - org ) / 64.0, delta )); + + org = frac_right; + fit = ( org <= 32 ) ? 16 : 48; + delta = FT_ABS( fit - org ); + displacements[count] = fit - org; + scores[count++] = delta; + FT_TRACE5(( "dispB=%.2f (%d) ", ( fit - org ) / 64.0, delta )); + } + } + + /* snapping the left edge to the grid */ + org = org_left; + fit = FT_PIX_ROUND( org ); + delta = FT_ABS( fit - org ); + displacements[count] = fit - org; + scores[count++] = delta; + FT_TRACE5(( "dispC=%.2f (%d) ", ( fit - org ) / 64.0, delta )); + + /* snapping the right edge to the grid */ + org = org_right; + fit = FT_PIX_ROUND( org ); + delta = FT_ABS( fit - org ); + displacements[count] = fit - org; + scores[count++] = delta; + FT_TRACE5(( "dispD=%.2f (%d) ", ( fit - org ) / 64.0, delta )); + + /* now find the best displacement */ + { + FT_Pos best_score = scores[0]; + FT_Pos best_disp = displacements[0]; + FT_UInt nn; + + for ( nn = 1; nn < count; nn++ ) + { + if ( scores[nn] < best_score ) + { + best_score = scores[nn]; + best_disp = displacements[nn]; + } + } + + cur_center = org_center + best_disp; + } + FT_TRACE5(( "\n" )); + } + + AlignStem: + edge->pos = cur_center - ( cur_len >> 1 ); + edge2->pos = edge->pos + cur_len; + + FT_TRACE5(( "STEM1: %d (opos=%.2f) to %d (opos=%.2f)" + " snapped to (%.2f) and (%.2f)," + " org_len=%.2f cur_len=%.2f\n", + edge-edges, edge->opos / 64.0, + edge2-edges, edge2->opos / 64.0, + edge->pos / 64.0, edge2->pos / 64.0, + org_len / 64.0, cur_len / 64.0 )); + + edge->flags |= AF_EDGE_DONE; + edge2->flags |= AF_EDGE_DONE; + + if ( edge > edges && edge->pos < edge[-1].pos ) + { + FT_TRACE5(( "BOUND: %d (pos=%.2f) to (%.2f)\n", + edge-edges, edge->pos / 64.0, edge[-1].pos / 64.0 )); + edge->pos = edge[-1].pos; + } + } + } + + /* make sure that lowercase m's maintain their symmetry */ + + /* In general, lowercase m's have six vertical edges if they are sans */ + /* serif, or twelve if they are with serifs. This implementation is */ + /* based on that assumption, and seems to work very well with most */ + /* faces. However, if for a certain face this assumption is not */ + /* true, the m is just rendered like before. In addition, any stem */ + /* correction will only be applied to symmetrical glyphs (even if the */ + /* glyph is not an m), so the potential for unwanted distortion is */ + /* relatively low. */ + + /* We don't handle horizontal edges since we can't easily assure that */ + /* the third (lowest) stem aligns with the base line; it might end up */ + /* one pixel higher or lower. */ + +#if 0 + { + FT_Int n_edges = edge_limit - edges; + + + if ( dim == AF_DIMENSION_HORZ && ( n_edges == 6 || n_edges == 12 ) ) + { + AF_Edge edge1, edge2, edge3; + FT_Pos dist1, dist2, span, delta; + + + if ( n_edges == 6 ) + { + edge1 = edges; + edge2 = edges + 2; + edge3 = edges + 4; + } + else + { + edge1 = edges + 1; + edge2 = edges + 5; + edge3 = edges + 9; + } + + dist1 = edge2->opos - edge1->opos; + dist2 = edge3->opos - edge2->opos; + + span = dist1 - dist2; + if ( span < 0 ) + span = -span; + + if ( span < 8 ) + { + delta = edge3->pos - ( 2 * edge2->pos - edge1->pos ); + edge3->pos -= delta; + if ( edge3->link ) + edge3->link->pos -= delta; + + /* move the serifs along with the stem */ + if ( n_edges == 12 ) + { + ( edges + 8 )->pos -= delta; + ( edges + 11 )->pos -= delta; + } + + edge3->flags |= AF_EDGE_DONE; + if ( edge3->link ) + edge3->link->flags |= AF_EDGE_DONE; + } + } + } +#endif + + if ( has_serifs || !anchor ) + { + /* + * now hint the remaining edges (serifs and single) in order + * to complete our processing + */ + for ( edge = edges; edge < edge_limit; edge++ ) + { + FT_Pos delta; + + + if ( edge->flags & AF_EDGE_DONE ) + continue; + + delta = 1000; + + if ( edge->serif ) + { + delta = edge->serif->opos - edge->opos; + if ( delta < 0 ) + delta = -delta; + } + + if ( delta < 64 + 16 ) + { + af_latin2_align_serif_edge( hints, edge->serif, edge ); + FT_TRACE5(( "SERIF: edge %d (opos=%.2f) serif to %d (opos=%.2f)" + " aligned to (%.2f)\n", + edge-edges, edge->opos / 64.0, + edge->serif - edges, edge->serif->opos / 64.0, + edge->pos / 64.0 )); + } + else if ( !anchor ) + { + FT_TRACE5(( "SERIF_ANCHOR: edge %d (opos=%.2f)" + " snapped to (%.2f)\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); + edge->pos = FT_PIX_ROUND( edge->opos ); + anchor = edge; + } + else + { + AF_Edge before, after; + + + for ( before = edge - 1; before >= edges; before-- ) + if ( before->flags & AF_EDGE_DONE ) + break; + + for ( after = edge + 1; after < edge_limit; after++ ) + if ( after->flags & AF_EDGE_DONE ) + break; + + if ( before >= edges && before < edge && + after < edge_limit && after > edge ) + { + if ( after->opos == before->opos ) + edge->pos = before->pos; + else + edge->pos = before->pos + + FT_MulDiv( edge->opos - before->opos, + after->pos - before->pos, + after->opos - before->opos ); + FT_TRACE5(( "SERIF_LINK1: edge %d (opos=%.2f) snapped to (%.2f)" + " from %d (opos=%.2f)\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0, + before - edges, before->opos / 64.0 )); + } + else + { + edge->pos = anchor->pos + + ( ( edge->opos - anchor->opos + 16 ) & ~31 ); + + FT_TRACE5(( "SERIF_LINK2: edge %d (opos=%.2f)" + " snapped to (%.2f)\n", + edge-edges, edge->opos / 64.0, edge->pos / 64.0 )); + } + } + + edge->flags |= AF_EDGE_DONE; + + if ( edge > edges && edge->pos < edge[-1].pos ) + edge->pos = edge[-1].pos; + + if ( edge + 1 < edge_limit && + edge[1].flags & AF_EDGE_DONE && + edge->pos > edge[1].pos ) + edge->pos = edge[1].pos; + } + } + } + + + static FT_Error + af_latin2_hints_apply( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline, + AF_LatinMetrics metrics ) + { + FT_Error error; + int dim; + + FT_UNUSED( glyph_index ); + + + error = af_glyph_hints_reload( hints, outline ); + if ( error ) + goto Exit; + + /* analyze glyph outline */ + if ( AF_HINTS_DO_HORIZONTAL( hints ) ) + { + error = af_latin2_hints_detect_features( hints, AF_DIMENSION_HORZ ); + if ( error ) + goto Exit; + } + + if ( AF_HINTS_DO_VERTICAL( hints ) ) + { + error = af_latin2_hints_detect_features( hints, AF_DIMENSION_VERT ); + if ( error ) + goto Exit; + + af_latin2_hints_compute_blue_edges( hints, metrics ); + } + + /* grid-fit the outline */ + for ( dim = 0; dim < AF_DIMENSION_MAX; dim++ ) + { +#ifdef AF_CONFIG_OPTION_USE_WARPER + if ( dim == AF_DIMENSION_HORZ && + metrics->root.scaler.render_mode == FT_RENDER_MODE_NORMAL && + AF_HINTS_DO_WARP( hints ) ) + { + AF_WarperRec warper; + FT_Fixed scale; + FT_Pos delta; + + + af_warper_compute( &warper, hints, dim, &scale, &delta ); + af_glyph_hints_scale_dim( hints, dim, scale, delta ); + continue; + } +#endif /* AF_CONFIG_OPTION_USE_WARPER */ + + if ( ( dim == AF_DIMENSION_HORZ && AF_HINTS_DO_HORIZONTAL( hints ) ) || + ( dim == AF_DIMENSION_VERT && AF_HINTS_DO_VERTICAL( hints ) ) ) + { + af_latin2_hint_edges( hints, (AF_Dimension)dim ); + af_glyph_hints_align_edge_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_strong_points( hints, (AF_Dimension)dim ); + af_glyph_hints_align_weak_points( hints, (AF_Dimension)dim ); + } + } + af_glyph_hints_save( hints, outline ); + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** L A T I N S C R I P T C L A S S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + AF_DEFINE_WRITING_SYSTEM_CLASS( + af_latin2_writing_system_class, + + AF_WRITING_SYSTEM_LATIN2, + + sizeof ( AF_LatinMetricsRec ), + + (AF_WritingSystem_InitMetricsFunc) af_latin2_metrics_init, /* style_metrics_init */ + (AF_WritingSystem_ScaleMetricsFunc)af_latin2_metrics_scale, /* style_metrics_scale */ + (AF_WritingSystem_DoneMetricsFunc) NULL, /* style_metrics_done */ + (AF_WritingSystem_GetStdWidthsFunc)af_latin2_get_standard_widths, /* style_metrics_getstdw */ + + (AF_WritingSystem_InitHintsFunc) af_latin2_hints_init, /* style_hints_init */ + (AF_WritingSystem_ApplyHintsFunc) af_latin2_hints_apply /* style_hints_apply */ + ) + +#else /* !FT_OPTION_AUTOFIT2 */ + + /* ANSI C doesn't like empty source files */ + typedef int _af_latin2_dummy; + +#endif /* !FT_OPTION_AUTOFIT2 */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/aflatin2.h b/vendor/FreeType2/src/autofit/aflatin2.h new file mode 100644 index 0000000..0129dc7 --- /dev/null +++ b/vendor/FreeType2/src/autofit/aflatin2.h @@ -0,0 +1,46 @@ +/* ATTENTION: This file doesn't compile. It is only here as a reference */ +/* of an alternative latin hinting algorithm that was always */ +/* marked as experimental. */ + + +/***************************************************************************/ +/* */ +/* aflatin2.h */ +/* */ +/* Auto-fitter hinting routines for latin writing system */ +/* (specification). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AFLATIN2_H_ +#define AFLATIN2_H_ + +#include "afhints.h" + + +FT_BEGIN_HEADER + + + /* the `latin' writing system */ + + AF_DECLARE_WRITING_SYSTEM_CLASS( af_latin2_writing_system_class ) + + +/* */ + +FT_END_HEADER + +#endif /* AFLATIN_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afloader.c b/vendor/FreeType2/src/autofit/afloader.c new file mode 100644 index 0000000..a55550b --- /dev/null +++ b/vendor/FreeType2/src/autofit/afloader.c @@ -0,0 +1,721 @@ +/***************************************************************************/ +/* */ +/* afloader.c */ +/* */ +/* Auto-fitter glyph loading routines (body). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#include "afglobal.h" +#include "afloader.h" +#include "afhints.h" +#include "aferrors.h" +#include "afmodule.h" +#include "afpic.h" + +#include FT_INTERNAL_CALC_H + + + /* Initialize glyph loader. */ + + FT_LOCAL_DEF( void ) + af_loader_init( AF_Loader loader, + AF_GlyphHints hints ) + { + FT_ZERO( loader ); + + loader->hints = hints; + } + + + /* Reset glyph loader and compute globals if necessary. */ + + FT_LOCAL_DEF( FT_Error ) + af_loader_reset( AF_Loader loader, + AF_Module module, + FT_Face face ) + { + FT_Error error = FT_Err_Ok; + + + loader->face = face; + loader->globals = (AF_FaceGlobals)face->autohint.data; + + if ( !loader->globals ) + { + error = af_face_globals_new( face, &loader->globals, module ); + if ( !error ) + { + face->autohint.data = + (FT_Pointer)loader->globals; + face->autohint.finalizer = + (FT_Generic_Finalizer)af_face_globals_free; + } + } + + return error; + } + + + /* Finalize glyph loader. */ + + FT_LOCAL_DEF( void ) + af_loader_done( AF_Loader loader ) + { + loader->face = NULL; + loader->globals = NULL; + loader->hints = NULL; + } + + +#define af_intToFixed( i ) \ + ( (FT_Fixed)( (FT_UInt32)(i) << 16 ) ) +#define af_fixedToInt( x ) \ + ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) ) +#define af_floatToFixed( f ) \ + ( (FT_Fixed)( (f) * 65536.0 + 0.5 ) ) + + + static FT_Error + af_loader_embolden_glyph_in_slot( AF_Loader loader, + FT_Face face, + AF_StyleMetrics style_metrics ) + { + FT_Error error = FT_Err_Ok; + + FT_GlyphSlot slot = face->glyph; + AF_FaceGlobals globals = loader->globals; + AF_WritingSystemClass writing_system_class; + + FT_Size_Metrics* size_metrics = &face->size->internal->autohint_metrics; + + FT_Pos stdVW = 0; + FT_Pos stdHW = 0; + + FT_Bool size_changed = size_metrics->x_ppem != + globals->stem_darkening_for_ppem; + + FT_Fixed em_size = af_intToFixed( face->units_per_EM ); + FT_Fixed em_ratio = FT_DivFix( af_intToFixed( 1000 ), em_size ); + + FT_Matrix scale_down_matrix = { 0x10000L, 0, 0, 0x10000L }; + + + /* Skip stem darkening for broken fonts. */ + if ( !face->units_per_EM ) + { + error = FT_ERR( Corrupted_Font_Header ); + goto Exit; + } + + /* + * We depend on the writing system (script analyzers) to supply + * standard widths for the script of the glyph we are looking at. If + * it can't deliver, stem darkening is disabled. + */ + writing_system_class = + AF_WRITING_SYSTEM_CLASSES_GET[style_metrics->style_class->writing_system]; + + if ( writing_system_class->style_metrics_getstdw ) + writing_system_class->style_metrics_getstdw( style_metrics, + &stdHW, + &stdVW ); + else + { + error = FT_ERR( Unimplemented_Feature ); + goto Exit; + } + + if ( size_changed || + ( stdVW > 0 && stdVW != globals->standard_vertical_width ) ) + { + FT_Fixed darken_by_font_units_x, darken_x; + + + darken_by_font_units_x = + af_intToFixed( af_loader_compute_darkening( loader, + face, + stdVW ) ); + darken_x = FT_DivFix( FT_MulFix( darken_by_font_units_x, + size_metrics->x_scale ), + em_ratio ); + + globals->standard_vertical_width = stdVW; + globals->stem_darkening_for_ppem = size_metrics->x_ppem; + globals->darken_x = af_fixedToInt( darken_x ); + } + + if ( size_changed || + ( stdHW > 0 && stdHW != globals->standard_horizontal_width ) ) + { + FT_Fixed darken_by_font_units_y, darken_y; + + + darken_by_font_units_y = + af_intToFixed( af_loader_compute_darkening( loader, + face, + stdHW ) ); + darken_y = FT_DivFix( FT_MulFix( darken_by_font_units_y, + size_metrics->y_scale ), + em_ratio ); + + globals->standard_horizontal_width = stdHW; + globals->stem_darkening_for_ppem = size_metrics->x_ppem; + globals->darken_y = af_fixedToInt( darken_y ); + + /* + * Scale outlines down on the Y-axis to keep them inside their blue + * zones. The stronger the emboldening, the stronger the downscaling + * (plus heuristical padding to prevent outlines still falling out + * their zones due to rounding). + * + * Reason: `FT_Outline_Embolden' works by shifting the rightmost + * points of stems farther to the right, and topmost points farther + * up. This positions points on the Y-axis outside their + * pre-computed blue zones and leads to distortion when applying the + * hints in the code further below. Code outside this emboldening + * block doesn't know we are presenting it with modified outlines the + * analyzer didn't see! + * + * An unfortunate side effect of downscaling is that the emboldening + * effect is slightly decreased. The loss becomes more pronounced + * versus the CFF driver at smaller sizes, e.g., at 9ppem and below. + */ + globals->scale_down_factor = + FT_DivFix( em_size - ( darken_by_font_units_y + af_intToFixed( 8 ) ), + em_size ); + } + + FT_Outline_EmboldenXY( &slot->outline, + globals->darken_x, + globals->darken_y ); + + scale_down_matrix.yy = globals->scale_down_factor; + FT_Outline_Transform( &slot->outline, &scale_down_matrix ); + + Exit: + return error; + } + + + /* Load the glyph at index into the current slot of a face and hint it. */ + + FT_LOCAL_DEF( FT_Error ) + af_loader_load_glyph( AF_Loader loader, + AF_Module module, + FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + + FT_Size size = face->size; + FT_Size_Internal size_internal = size->internal; + FT_GlyphSlot slot = face->glyph; + FT_Slot_Internal slot_internal = slot->internal; + FT_GlyphLoader gloader = slot_internal->loader; + + AF_GlyphHints hints = loader->hints; + AF_ScalerRec scaler; + AF_StyleMetrics style_metrics; + FT_UInt style_options = AF_STYLE_NONE_DFLT; + AF_StyleClass style_class; + AF_WritingSystemClass writing_system_class; + +#ifdef FT_CONFIG_OPTION_PIC + AF_FaceGlobals globals = loader->globals; +#endif + + + if ( !size ) + return FT_THROW( Invalid_Size_Handle ); + + FT_ZERO( &scaler ); + + if ( !size_internal->autohint_metrics.x_scale || + size_internal->autohint_mode != FT_LOAD_TARGET_MODE( load_flags ) ) + { + /* switching between hinting modes usually means different scaling */ + /* values; this later on enforces recomputation of everything */ + /* related to the current size */ + + size_internal->autohint_mode = FT_LOAD_TARGET_MODE( load_flags ); + size_internal->autohint_metrics = size->metrics; + +#ifdef AF_CONFIG_OPTION_TT_SIZE_METRICS + { + FT_Size_Metrics* size_metrics = &size_internal->autohint_metrics; + + + /* set metrics to integer values and adjust scaling accordingly; */ + /* this is the same setup as with TrueType fonts, cf. function */ + /* `tt_size_reset' in file `ttobjs.c' */ + size_metrics->ascender = FT_PIX_ROUND( + FT_MulFix( face->ascender, + size_metrics->y_scale ) ); + size_metrics->descender = FT_PIX_ROUND( + FT_MulFix( face->descender, + size_metrics->y_scale ) ); + size_metrics->height = FT_PIX_ROUND( + FT_MulFix( face->height, + size_metrics->y_scale ) ); + + size_metrics->x_scale = FT_DivFix( size_metrics->x_ppem << 6, + face->units_per_EM ); + size_metrics->y_scale = FT_DivFix( size_metrics->y_ppem << 6, + face->units_per_EM ); + size_metrics->max_advance = FT_PIX_ROUND( + FT_MulFix( face->max_advance_width, + size_metrics->x_scale ) ); + } +#endif /* AF_CONFIG_OPTION_TT_SIZE_METRICS */ + } + + /* + * TODO: This code currently doesn't support fractional advance widths, + * i.e., placing hinted glyphs at anything other than integer + * x-positions. This is only relevant for the warper code, which + * scales and shifts glyphs to optimize blackness of stems (hinting on + * the x-axis by nature places things on pixel integers, hinting on the + * y-axis only, i.e., LIGHT mode, doesn't touch the x-axis). The delta + * values of the scaler would need to be adjusted. + */ + scaler.face = face; + scaler.x_scale = size_internal->autohint_metrics.x_scale; + scaler.x_delta = 0; + scaler.y_scale = size_internal->autohint_metrics.y_scale; + scaler.y_delta = 0; + + scaler.render_mode = FT_LOAD_TARGET_MODE( load_flags ); + scaler.flags = 0; + + /* note that the fallback style can't be changed anymore */ + /* after the first call of `af_loader_load_glyph' */ + error = af_loader_reset( loader, module, face ); + if ( error ) + goto Exit; + +#ifdef FT_OPTION_AUTOFIT2 + /* XXX: undocumented hook to activate the latin2 writing system. */ + if ( load_flags & ( 1UL << 20 ) ) + style_options = AF_STYLE_LTN2_DFLT; +#endif + + /* + * Glyphs (really code points) are assigned to scripts. Script + * analysis is done lazily: For each glyph that passes through here, + * the corresponding script analyzer is called, but returns immediately + * if it has been run already. + */ + error = af_face_globals_get_metrics( loader->globals, glyph_index, + style_options, &style_metrics ); + if ( error ) + goto Exit; + + style_class = style_metrics->style_class; + writing_system_class = + AF_WRITING_SYSTEM_CLASSES_GET[style_class->writing_system]; + + loader->metrics = style_metrics; + + if ( writing_system_class->style_metrics_scale ) + writing_system_class->style_metrics_scale( style_metrics, &scaler ); + else + style_metrics->scaler = scaler; + + if ( writing_system_class->style_hints_init ) + { + error = writing_system_class->style_hints_init( hints, + style_metrics ); + if ( error ) + goto Exit; + } + + /* + * Do the main work of `af_loader_load_glyph'. Note that we never have + * to deal with composite glyphs as those get loaded into + * FT_GLYPH_FORMAT_OUTLINE by the recursed `FT_Load_Glyph' function. + * In the rare cases where FT_LOAD_NO_RECURSE is set, it implies + * FT_LOAD_NO_SCALE and as such the auto-hinter is never called. + */ + load_flags |= FT_LOAD_NO_SCALE | + FT_LOAD_IGNORE_TRANSFORM | + FT_LOAD_LINEAR_DESIGN; + load_flags &= ~FT_LOAD_RENDER; + + error = FT_Load_Glyph( face, glyph_index, load_flags ); + if ( error ) + goto Exit; + + /* + * Apply stem darkening (emboldening) here before hints are applied to + * the outline. Glyphs are scaled down proportionally to the + * emboldening so that curve points don't fall outside their + * precomputed blue zones. + * + * Any emboldening done by the font driver (e.g., the CFF driver) + * doesn't reach here because the autohinter loads the unprocessed + * glyphs in font units for analysis (functions `af_*_metrics_init_*') + * and then above to prepare it for the rasterizers by itself, + * independently of the font driver. So emboldening must be done here, + * within the autohinter. + * + * All glyphs to be autohinted pass through here one by one. The + * standard widths can therefore change from one glyph to the next, + * depending on what script a glyph is assigned to (each script has its + * own set of standard widths and other metrics). The darkening amount + * must therefore be recomputed for each size and + * `standard_{vertical,horizontal}_width' change. + * + * Ignore errors and carry on without emboldening. + * + */ + + /* stem darkening only works well in `light' mode */ + if ( scaler.render_mode == FT_RENDER_MODE_LIGHT && + ( !face->internal->no_stem_darkening || + ( face->internal->no_stem_darkening < 0 && + !module->no_stem_darkening ) ) ) + af_loader_embolden_glyph_in_slot( loader, face, style_metrics ); + + loader->transformed = slot_internal->glyph_transformed; + if ( loader->transformed ) + { + FT_Matrix inverse; + + + loader->trans_matrix = slot_internal->glyph_matrix; + loader->trans_delta = slot_internal->glyph_delta; + + inverse = loader->trans_matrix; + if ( !FT_Matrix_Invert( &inverse ) ) + FT_Vector_Transform( &loader->trans_delta, &inverse ); + } + + switch ( slot->format ) + { + case FT_GLYPH_FORMAT_OUTLINE: + /* translate the loaded glyph when an internal transform is needed */ + if ( loader->transformed ) + FT_Outline_Translate( &slot->outline, + loader->trans_delta.x, + loader->trans_delta.y ); + + /* compute original horizontal phantom points */ + /* (and ignore vertical ones) */ + loader->pp1.x = hints->x_delta; + loader->pp1.y = hints->y_delta; + loader->pp2.x = FT_MulFix( slot->metrics.horiAdvance, + hints->x_scale ) + hints->x_delta; + loader->pp2.y = hints->y_delta; + + /* be sure to check for spacing glyphs */ + if ( slot->outline.n_points == 0 ) + goto Hint_Metrics; + + /* now load the slot image into the auto-outline */ + /* and run the automatic hinting process */ + if ( writing_system_class->style_hints_apply ) + writing_system_class->style_hints_apply( glyph_index, + hints, + &gloader->base.outline, + style_metrics ); + + /* we now need to adjust the metrics according to the change in */ + /* width/positioning that occurred during the hinting process */ + if ( scaler.render_mode != FT_RENDER_MODE_LIGHT ) + { + FT_Pos old_rsb, old_lsb, new_lsb; + FT_Pos pp1x_uh, pp2x_uh; + + AF_AxisHints axis = &hints->axis[AF_DIMENSION_HORZ]; + AF_Edge edge1 = axis->edges; /* leftmost edge */ + AF_Edge edge2 = edge1 + + axis->num_edges - 1; /* rightmost edge */ + + + if ( axis->num_edges > 1 && AF_HINTS_DO_ADVANCE( hints ) ) + { + old_rsb = loader->pp2.x - edge2->opos; + /* loader->pp1.x is always zero at this point of time */ + old_lsb = edge1->opos /* - loader->pp1.x */; + new_lsb = edge1->pos; + + /* remember unhinted values to later account */ + /* for rounding errors */ + pp1x_uh = new_lsb - old_lsb; + pp2x_uh = edge2->pos + old_rsb; + + /* prefer too much space over too little space */ + /* for very small sizes */ + + if ( old_lsb < 24 ) + pp1x_uh -= 8; + + if ( old_rsb < 24 ) + pp2x_uh += 8; + + loader->pp1.x = FT_PIX_ROUND( pp1x_uh ); + loader->pp2.x = FT_PIX_ROUND( pp2x_uh ); + + if ( loader->pp1.x >= new_lsb && old_lsb > 0 ) + loader->pp1.x -= 64; + + if ( loader->pp2.x <= edge2->pos && old_rsb > 0 ) + loader->pp2.x += 64; + + slot->lsb_delta = loader->pp1.x - pp1x_uh; + slot->rsb_delta = loader->pp2.x - pp2x_uh; + } + else + { + FT_Pos pp1x = loader->pp1.x; + FT_Pos pp2x = loader->pp2.x; + + + loader->pp1.x = FT_PIX_ROUND( pp1x + hints->xmin_delta ); + loader->pp2.x = FT_PIX_ROUND( pp2x + hints->xmax_delta ); + + slot->lsb_delta = loader->pp1.x - pp1x; + slot->rsb_delta = loader->pp2.x - pp2x; + } + } + /* `light' mode uses integer advance widths */ + /* but sets `lsb_delta' and `rsb_delta' */ + else + { + FT_Pos pp1x = loader->pp1.x; + FT_Pos pp2x = loader->pp2.x; + + + loader->pp1.x = FT_PIX_ROUND( pp1x ); + loader->pp2.x = FT_PIX_ROUND( pp2x ); + + slot->lsb_delta = loader->pp1.x - pp1x; + slot->rsb_delta = loader->pp2.x - pp2x; + } + + break; + + default: + /* we don't support other formats (yet?) */ + error = FT_THROW( Unimplemented_Feature ); + } + + Hint_Metrics: + { + FT_BBox bbox; + FT_Vector vvector; + + + vvector.x = slot->metrics.vertBearingX - slot->metrics.horiBearingX; + vvector.y = slot->metrics.vertBearingY - slot->metrics.horiBearingY; + vvector.x = FT_MulFix( vvector.x, style_metrics->scaler.x_scale ); + vvector.y = FT_MulFix( vvector.y, style_metrics->scaler.y_scale ); + + /* transform the hinted outline if needed */ + if ( loader->transformed ) + { + FT_Outline_Transform( &gloader->base.outline, &loader->trans_matrix ); + FT_Vector_Transform( &vvector, &loader->trans_matrix ); + } + + /* we must translate our final outline by -pp1.x and compute */ + /* the new metrics */ + if ( loader->pp1.x ) + FT_Outline_Translate( &gloader->base.outline, -loader->pp1.x, 0 ); + + FT_Outline_Get_CBox( &gloader->base.outline, &bbox ); + + bbox.xMin = FT_PIX_FLOOR( bbox.xMin ); + bbox.yMin = FT_PIX_FLOOR( bbox.yMin ); + bbox.xMax = FT_PIX_CEIL( bbox.xMax ); + bbox.yMax = FT_PIX_CEIL( bbox.yMax ); + + slot->metrics.width = bbox.xMax - bbox.xMin; + slot->metrics.height = bbox.yMax - bbox.yMin; + slot->metrics.horiBearingX = bbox.xMin; + slot->metrics.horiBearingY = bbox.yMax; + + slot->metrics.vertBearingX = FT_PIX_FLOOR( bbox.xMin + vvector.x ); + slot->metrics.vertBearingY = FT_PIX_FLOOR( bbox.yMax + vvector.y ); + + /* for mono-width fonts (like Andale, Courier, etc.) we need */ + /* to keep the original rounded advance width; ditto for */ + /* digits if all have the same advance width */ + if ( scaler.render_mode != FT_RENDER_MODE_LIGHT && + ( FT_IS_FIXED_WIDTH( slot->face ) || + ( af_face_globals_is_digit( loader->globals, glyph_index ) && + style_metrics->digits_have_same_width ) ) ) + { + slot->metrics.horiAdvance = + FT_MulFix( slot->metrics.horiAdvance, + style_metrics->scaler.x_scale ); + + /* Set delta values to 0. Otherwise code that uses them is */ + /* going to ruin the fixed advance width. */ + slot->lsb_delta = 0; + slot->rsb_delta = 0; + } + else + { + /* non-spacing glyphs must stay as-is */ + if ( slot->metrics.horiAdvance ) + slot->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; + } + + slot->metrics.vertAdvance = FT_MulFix( slot->metrics.vertAdvance, + style_metrics->scaler.y_scale ); + + slot->metrics.horiAdvance = FT_PIX_ROUND( slot->metrics.horiAdvance ); + slot->metrics.vertAdvance = FT_PIX_ROUND( slot->metrics.vertAdvance ); + + slot->format = FT_GLYPH_FORMAT_OUTLINE; + } + + Exit: + return error; + } + + + /* + * Compute amount of font units the face should be emboldened by, in + * analogy to the CFF driver's `cf2_computeDarkening' function. See there + * for details of the algorithm. + * + * XXX: Currently a crude adaption of the original algorithm. Do better? + */ + FT_LOCAL_DEF( FT_Int32 ) + af_loader_compute_darkening( AF_Loader loader, + FT_Face face, + FT_Pos standard_width ) + { + AF_Module module = loader->globals->module; + + FT_UShort units_per_EM; + FT_Fixed ppem, em_ratio; + FT_Fixed stem_width, stem_width_per_1000, scaled_stem, darken_amount; + FT_Int log_base_2; + FT_Int x1, y1, x2, y2, x3, y3, x4, y4; + + + ppem = FT_MAX( af_intToFixed( 4 ), + af_intToFixed( face->size->metrics.x_ppem ) ); + units_per_EM = face->units_per_EM; + + em_ratio = FT_DivFix( af_intToFixed( 1000 ), + af_intToFixed ( units_per_EM ) ); + if ( em_ratio < af_floatToFixed( .01 ) ) + { + /* If something goes wrong, don't embolden. */ + return 0; + } + + x1 = module->darken_params[0]; + y1 = module->darken_params[1]; + x2 = module->darken_params[2]; + y2 = module->darken_params[3]; + x3 = module->darken_params[4]; + y3 = module->darken_params[5]; + x4 = module->darken_params[6]; + y4 = module->darken_params[7]; + + if ( standard_width <= 0 ) + { + stem_width = af_intToFixed( 75 ); /* taken from cf2font.c */ + stem_width_per_1000 = stem_width; + } + else + { + stem_width = af_intToFixed( standard_width ); + stem_width_per_1000 = FT_MulFix( stem_width, em_ratio ); + } + + log_base_2 = FT_MSB( (FT_UInt32)stem_width_per_1000 ) + + FT_MSB( (FT_UInt32)ppem ); + + if ( log_base_2 >= 46 ) + { + /* possible overflow */ + scaled_stem = af_intToFixed( x4 ); + } + else + scaled_stem = FT_MulFix( stem_width_per_1000, ppem ); + + /* now apply the darkening parameters */ + if ( scaled_stem < af_intToFixed( x1 ) ) + darken_amount = FT_DivFix( af_intToFixed( y1 ), ppem ); + + else if ( scaled_stem < af_intToFixed( x2 ) ) + { + FT_Int xdelta = x2 - x1; + FT_Int ydelta = y2 - y1; + FT_Int x = stem_width_per_1000 - + FT_DivFix( af_intToFixed( x1 ), ppem ); + + + if ( !xdelta ) + goto Try_x3; + + darken_amount = FT_MulDiv( x, ydelta, xdelta ) + + FT_DivFix( af_intToFixed( y1 ), ppem ); + } + + else if ( scaled_stem < af_intToFixed( x3 ) ) + { + Try_x3: + { + FT_Int xdelta = x3 - x2; + FT_Int ydelta = y3 - y2; + FT_Int x = stem_width_per_1000 - + FT_DivFix( af_intToFixed( x2 ), ppem ); + + + if ( !xdelta ) + goto Try_x4; + + darken_amount = FT_MulDiv( x, ydelta, xdelta ) + + FT_DivFix( af_intToFixed( y2 ), ppem ); + } + } + + else if ( scaled_stem < af_intToFixed( x4 ) ) + { + Try_x4: + { + FT_Int xdelta = x4 - x3; + FT_Int ydelta = y4 - y3; + FT_Int x = stem_width_per_1000 - + FT_DivFix( af_intToFixed( x3 ), ppem ); + + + if ( !xdelta ) + goto Use_y4; + + darken_amount = FT_MulDiv( x, ydelta, xdelta ) + + FT_DivFix( af_intToFixed( y3 ), ppem ); + } + } + + else + { + Use_y4: + darken_amount = FT_DivFix( af_intToFixed( y4 ), ppem ); + } + + /* Convert darken_amount from per 1000 em to true character space. */ + return af_fixedToInt( FT_DivFix( darken_amount, em_ratio ) ); + } + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afloader.h b/vendor/FreeType2/src/autofit/afloader.h new file mode 100644 index 0000000..d4d72d1 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afloader.h @@ -0,0 +1,91 @@ +/***************************************************************************/ +/* */ +/* afloader.h */ +/* */ +/* Auto-fitter glyph loading routines (specification). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AFLOADER_H_ +#define AFLOADER_H_ + +#include "afhints.h" +#include "afmodule.h" +#include "afglobal.h" + + +FT_BEGIN_HEADER + + /* + * The autofitter module's (global) data structure to communicate with + * actual fonts. If necessary, `local' data like the current face, the + * current face's auto-hint data, or the current glyph's parameters + * relevant to auto-hinting are `swapped in'. Cf. functions like + * `af_loader_reset' and `af_loader_load_g'. + */ + + typedef struct AF_LoaderRec_ + { + /* current face data */ + FT_Face face; + AF_FaceGlobals globals; + + /* current glyph data */ + AF_GlyphHints hints; + AF_StyleMetrics metrics; + FT_Bool transformed; + FT_Matrix trans_matrix; + FT_Vector trans_delta; + FT_Vector pp1; + FT_Vector pp2; + /* we don't handle vertical phantom points */ + + } AF_LoaderRec, *AF_Loader; + + + FT_LOCAL( void ) + af_loader_init( AF_Loader loader, + AF_GlyphHints hints ); + + + FT_LOCAL( FT_Error ) + af_loader_reset( AF_Loader loader, + AF_Module module, + FT_Face face ); + + + FT_LOCAL( void ) + af_loader_done( AF_Loader loader ); + + + FT_LOCAL( FT_Error ) + af_loader_load_glyph( AF_Loader loader, + AF_Module module, + FT_Face face, + FT_UInt gindex, + FT_Int32 load_flags ); + + FT_LOCAL_DEF( FT_Int32 ) + af_loader_compute_darkening( AF_Loader loader, + FT_Face face, + FT_Pos standard_width ); + +/* */ + + +FT_END_HEADER + +#endif /* AFLOADER_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afmodule.c b/vendor/FreeType2/src/autofit/afmodule.c new file mode 100644 index 0000000..dcaa17a --- /dev/null +++ b/vendor/FreeType2/src/autofit/afmodule.c @@ -0,0 +1,600 @@ +/***************************************************************************/ +/* */ +/* afmodule.c */ +/* */ +/* Auto-fitter module implementation (body). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#include "afglobal.h" +#include "afmodule.h" +#include "afloader.h" +#include "aferrors.h" +#include "afpic.h" + +#ifdef FT_DEBUG_AUTOFIT + +#ifndef FT_MAKE_OPTION_SINGLE_OBJECT + +#ifdef __cplusplus + extern "C" { +#endif + extern void + af_glyph_hints_dump_segments( AF_GlyphHints hints, + FT_Bool to_stdout ); + extern void + af_glyph_hints_dump_points( AF_GlyphHints hints, + FT_Bool to_stdout ); + extern void + af_glyph_hints_dump_edges( AF_GlyphHints hints, + FT_Bool to_stdout ); +#ifdef __cplusplus + } +#endif + +#endif + + int _af_debug_disable_horz_hints; + int _af_debug_disable_vert_hints; + int _af_debug_disable_blue_hints; + + /* we use a global object instead of a local one for debugging */ + AF_GlyphHintsRec _af_debug_hints_rec[1]; + + void* _af_debug_hints = _af_debug_hints_rec; +#endif + +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_DRIVER_H +#include FT_SERVICE_PROPERTIES_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_afmodule + + + static FT_Error + af_property_get_face_globals( FT_Face face, + AF_FaceGlobals* aglobals, + AF_Module module ) + { + FT_Error error = FT_Err_Ok; + AF_FaceGlobals globals; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + globals = (AF_FaceGlobals)face->autohint.data; + if ( !globals ) + { + /* trigger computation of the global style data */ + /* in case it hasn't been done yet */ + error = af_face_globals_new( face, &globals, module ); + if ( !error ) + { + face->autohint.data = + (FT_Pointer)globals; + face->autohint.finalizer = + (FT_Generic_Finalizer)af_face_globals_free; + } + } + + if ( !error ) + *aglobals = globals; + + return error; + } + + +#ifdef FT_CONFIG_OPTION_PIC + +#undef AF_SCRIPT_CLASSES_GET +#define AF_SCRIPT_CLASSES_GET \ + ( GET_PIC( ft_module->library )->af_script_classes ) + +#undef AF_STYLE_CLASSES_GET +#define AF_STYLE_CLASSES_GET \ + ( GET_PIC( ft_module->library )->af_style_classes ) + +#endif + + + static FT_Error + af_property_set( FT_Module ft_module, + const char* property_name, + const void* value, + FT_Bool value_is_string ) + { + FT_Error error = FT_Err_Ok; + AF_Module module = (AF_Module)ft_module; + +#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_UNUSED( value_is_string ); +#endif + + + if ( !ft_strcmp( property_name, "fallback-script" ) ) + { + FT_UInt* fallback_script; + FT_UInt ss; + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + return FT_THROW( Invalid_Argument ); +#endif + + fallback_script = (FT_UInt*)value; + + /* We translate the fallback script to a fallback style that uses */ + /* `fallback-script' as its script and `AF_COVERAGE_NONE' as its */ + /* coverage value. */ + for ( ss = 0; AF_STYLE_CLASSES_GET[ss]; ss++ ) + { + AF_StyleClass style_class = AF_STYLE_CLASSES_GET[ss]; + + + if ( (FT_UInt)style_class->script == *fallback_script && + style_class->coverage == AF_COVERAGE_DEFAULT ) + { + module->fallback_style = ss; + break; + } + } + + if ( !AF_STYLE_CLASSES_GET[ss] ) + { + FT_TRACE0(( "af_property_set: Invalid value %d for property `%s'\n", + fallback_script, property_name )); + return FT_THROW( Invalid_Argument ); + } + + return error; + } + else if ( !ft_strcmp( property_name, "default-script" ) ) + { + FT_UInt* default_script; + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + return FT_THROW( Invalid_Argument ); +#endif + + default_script = (FT_UInt*)value; + + module->default_script = *default_script; + + return error; + } + else if ( !ft_strcmp( property_name, "increase-x-height" ) ) + { + FT_Prop_IncreaseXHeight* prop; + AF_FaceGlobals globals; + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + return FT_THROW( Invalid_Argument ); +#endif + + prop = (FT_Prop_IncreaseXHeight*)value; + + error = af_property_get_face_globals( prop->face, &globals, module ); + if ( !error ) + globals->increase_x_height = prop->limit; + + return error; + } +#ifdef AF_CONFIG_OPTION_USE_WARPER + else if ( !ft_strcmp( property_name, "warping" ) ) + { +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + long w = ft_strtol( s, NULL, 10 ); + + + if ( w == 0 ) + module->warping = 0; + else if ( w == 1 ) + module->warping = 1; + else + return FT_THROW( Invalid_Argument ); + } + else +#endif + { + FT_Bool* warping = (FT_Bool*)value; + + + module->warping = *warping; + } + + return error; + } +#endif /* AF_CONFIG_OPTION_USE_WARPER */ + else if ( !ft_strcmp( property_name, "darkening-parameters" ) ) + { + FT_Int* darken_params; + FT_Int x1, y1, x2, y2, x3, y3, x4, y4; + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_Int dp[8]; + + + if ( value_is_string ) + { + const char* s = (const char*)value; + char* ep; + int i; + + + /* eight comma-separated numbers */ + for ( i = 0; i < 7; i++ ) + { + dp[i] = (FT_Int)ft_strtol( s, &ep, 10 ); + if ( *ep != ',' || s == ep ) + return FT_THROW( Invalid_Argument ); + + s = ep + 1; + } + + dp[7] = (FT_Int)ft_strtol( s, &ep, 10 ); + if ( !( *ep == '\0' || *ep == ' ' ) || s == ep ) + return FT_THROW( Invalid_Argument ); + + darken_params = dp; + } + else +#endif + darken_params = (FT_Int*)value; + + x1 = darken_params[0]; + y1 = darken_params[1]; + x2 = darken_params[2]; + y2 = darken_params[3]; + x3 = darken_params[4]; + y3 = darken_params[5]; + x4 = darken_params[6]; + y4 = darken_params[7]; + + if ( x1 < 0 || x2 < 0 || x3 < 0 || x4 < 0 || + y1 < 0 || y2 < 0 || y3 < 0 || y4 < 0 || + x1 > x2 || x2 > x3 || x3 > x4 || + y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 ) + return FT_THROW( Invalid_Argument ); + + module->darken_params[0] = x1; + module->darken_params[1] = y1; + module->darken_params[2] = x2; + module->darken_params[3] = y2; + module->darken_params[4] = x3; + module->darken_params[5] = y3; + module->darken_params[6] = x4; + module->darken_params[7] = y4; + + return error; + } + else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) + { +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + long nsd = ft_strtol( s, NULL, 10 ); + + + if ( !nsd ) + module->no_stem_darkening = FALSE; + else + module->no_stem_darkening = TRUE; + } + else +#endif + { + FT_Bool* no_stem_darkening = (FT_Bool*)value; + + + module->no_stem_darkening = *no_stem_darkening; + } + + return error; + } + + FT_TRACE0(( "af_property_set: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + + static FT_Error + af_property_get( FT_Module ft_module, + const char* property_name, + void* value ) + { + FT_Error error = FT_Err_Ok; + AF_Module module = (AF_Module)ft_module; + FT_UInt fallback_style = module->fallback_style; + FT_UInt default_script = module->default_script; +#ifdef AF_CONFIG_OPTION_USE_WARPER + FT_Bool warping = module->warping; +#endif + + + if ( !ft_strcmp( property_name, "glyph-to-script-map" ) ) + { + FT_Prop_GlyphToScriptMap* prop = (FT_Prop_GlyphToScriptMap*)value; + AF_FaceGlobals globals; + + + error = af_property_get_face_globals( prop->face, &globals, module ); + if ( !error ) + prop->map = globals->glyph_styles; + + return error; + } + else if ( !ft_strcmp( property_name, "fallback-script" ) ) + { + FT_UInt* val = (FT_UInt*)value; + + AF_StyleClass style_class = AF_STYLE_CLASSES_GET[fallback_style]; + + + *val = style_class->script; + + return error; + } + else if ( !ft_strcmp( property_name, "default-script" ) ) + { + FT_UInt* val = (FT_UInt*)value; + + + *val = default_script; + + return error; + } + else if ( !ft_strcmp( property_name, "increase-x-height" ) ) + { + FT_Prop_IncreaseXHeight* prop = (FT_Prop_IncreaseXHeight*)value; + AF_FaceGlobals globals; + + + error = af_property_get_face_globals( prop->face, &globals, module ); + if ( !error ) + prop->limit = globals->increase_x_height; + + return error; + } +#ifdef AF_CONFIG_OPTION_USE_WARPER + else if ( !ft_strcmp( property_name, "warping" ) ) + { + FT_Bool* val = (FT_Bool*)value; + + + *val = warping; + + return error; + } +#endif /* AF_CONFIG_OPTION_USE_WARPER */ + else if ( !ft_strcmp( property_name, "darkening-parameters" ) ) + { + FT_Int* darken_params = module->darken_params; + FT_Int* val = (FT_Int*)value; + + + val[0] = darken_params[0]; + val[1] = darken_params[1]; + val[2] = darken_params[2]; + val[3] = darken_params[3]; + val[4] = darken_params[4]; + val[5] = darken_params[5]; + val[6] = darken_params[6]; + val[7] = darken_params[7]; + + return error; + } + else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) + { + FT_Bool no_stem_darkening = module->no_stem_darkening; + FT_Bool* val = (FT_Bool*)value; + + + *val = no_stem_darkening; + + return error; + } + + FT_TRACE0(( "af_property_get: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + + FT_DEFINE_SERVICE_PROPERTIESREC( + af_service_properties, + + (FT_Properties_SetFunc)af_property_set, /* set_property */ + (FT_Properties_GetFunc)af_property_get ) /* get_property */ + + + FT_DEFINE_SERVICEDESCREC1( + af_services, + + FT_SERVICE_ID_PROPERTIES, &AF_SERVICE_PROPERTIES_GET ) + + + FT_CALLBACK_DEF( FT_Module_Interface ) + af_get_interface( FT_Module module, + const char* module_interface ) + { + /* AF_SERVICES_GET dereferences `library' in PIC mode */ +#ifdef FT_CONFIG_OPTION_PIC + FT_Library library; + + + if ( !module ) + return NULL; + library = module->library; + if ( !library ) + return NULL; +#else + FT_UNUSED( module ); +#endif + + return ft_service_list_lookup( AF_SERVICES_GET, module_interface ); + } + + + FT_CALLBACK_DEF( FT_Error ) + af_autofitter_init( FT_Module ft_module ) /* AF_Module */ + { + AF_Module module = (AF_Module)ft_module; + + + module->fallback_style = AF_STYLE_FALLBACK; + module->default_script = AF_SCRIPT_DEFAULT; +#ifdef AF_CONFIG_OPTION_USE_WARPER + module->warping = 0; +#endif + module->no_stem_darkening = TRUE; + + module->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1; + module->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1; + module->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2; + module->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2; + module->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3; + module->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3; + module->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4; + module->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( void ) + af_autofitter_done( FT_Module ft_module ) /* AF_Module */ + { + FT_UNUSED( ft_module ); + +#ifdef FT_DEBUG_AUTOFIT + if ( _af_debug_hints_rec->memory ) + af_glyph_hints_done( _af_debug_hints_rec ); +#endif + } + + + FT_CALLBACK_DEF( FT_Error ) + af_autofitter_load_glyph( AF_Module module, + FT_GlyphSlot slot, + FT_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory = module->root.library->memory; + +#ifdef FT_DEBUG_AUTOFIT + + /* in debug mode, we use a global object that survives this routine */ + + AF_GlyphHints hints = _af_debug_hints_rec; + AF_LoaderRec loader[1]; + + FT_UNUSED( size ); + + + if ( hints->memory ) + af_glyph_hints_done( hints ); + + af_glyph_hints_init( hints, memory ); + af_loader_init( loader, hints ); + + error = af_loader_load_glyph( loader, module, slot->face, + glyph_index, load_flags ); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( ft_trace_levels[FT_COMPONENT] ) + { +#endif + af_glyph_hints_dump_points( hints, 0 ); + af_glyph_hints_dump_segments( hints, 0 ); + af_glyph_hints_dump_edges( hints, 0 ); +#ifdef FT_DEBUG_LEVEL_TRACE + } +#endif + + af_loader_done( loader ); + + return error; + +#else /* !FT_DEBUG_AUTOFIT */ + + AF_GlyphHintsRec hints[1]; + AF_LoaderRec loader[1]; + + FT_UNUSED( size ); + + + af_glyph_hints_init( hints, memory ); + af_loader_init( loader, hints ); + + error = af_loader_load_glyph( loader, module, slot->face, + glyph_index, load_flags ); + + af_loader_done( loader ); + af_glyph_hints_done( hints ); + + return error; + +#endif /* !FT_DEBUG_AUTOFIT */ + } + + + FT_DEFINE_AUTOHINTER_INTERFACE( + af_autofitter_interface, + + NULL, /* reset_face */ + NULL, /* get_global_hints */ + NULL, /* done_global_hints */ + (FT_AutoHinter_GlyphLoadFunc)af_autofitter_load_glyph ) /* load_glyph */ + + + FT_DEFINE_MODULE( + autofit_module_class, + + FT_MODULE_HINTER, + sizeof ( AF_ModuleRec ), + + "autofitter", + 0x10000L, /* version 1.0 of the autofitter */ + 0x20000L, /* requires FreeType 2.0 or above */ + + (const void*)&AF_INTERFACE_GET, + + (FT_Module_Constructor)af_autofitter_init, /* module_init */ + (FT_Module_Destructor) af_autofitter_done, /* module_done */ + (FT_Module_Requester) af_get_interface /* get_interface */ + ) + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afmodule.h b/vendor/FreeType2/src/autofit/afmodule.h new file mode 100644 index 0000000..56f64ea --- /dev/null +++ b/vendor/FreeType2/src/autofit/afmodule.h @@ -0,0 +1,58 @@ +/***************************************************************************/ +/* */ +/* afmodule.h */ +/* */ +/* Auto-fitter module implementation (specification). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AFMODULE_H_ +#define AFMODULE_H_ + +#include +#include FT_INTERNAL_OBJECTS_H +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + /* + * This is the `extended' FT_Module structure that holds the + * autofitter's global data. + */ + + typedef struct AF_ModuleRec_ + { + FT_ModuleRec root; + + FT_UInt fallback_style; + FT_UInt default_script; +#ifdef AF_CONFIG_OPTION_USE_WARPER + FT_Bool warping; +#endif + FT_Bool no_stem_darkening; + FT_Int darken_params[8]; + + } AF_ModuleRec, *AF_Module; + + +FT_DECLARE_MODULE( autofit_module_class ) + + +FT_END_HEADER + +#endif /* AFMODULE_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afpic.c b/vendor/FreeType2/src/autofit/afpic.c new file mode 100644 index 0000000..d48d016 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afpic.c @@ -0,0 +1,152 @@ +/***************************************************************************/ +/* */ +/* afpic.c */ +/* */ +/* The FreeType position independent code services for autofit module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "afpic.h" +#include "afglobal.h" +#include "aferrors.h" + + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from afmodule.c */ + FT_Error + FT_Create_Class_af_services( FT_Library library, + FT_ServiceDescRec** output_class ); + + void + FT_Destroy_Class_af_services( FT_Library library, + FT_ServiceDescRec* clazz ); + + void + FT_Init_Class_af_service_properties( FT_Service_PropertiesRec* clazz ); + + void FT_Init_Class_af_autofitter_interface( + FT_Library library, + FT_AutoHinter_InterfaceRec* clazz ); + + + /* forward declaration of PIC init functions from writing system classes */ +#undef WRITING_SYSTEM +#define WRITING_SYSTEM( ws, WS ) /* empty */ + +#include "afwrtsys.h" + + + void + autofit_module_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + + + if ( pic_container->autofit ) + { + AFModulePIC* container = (AFModulePIC*)pic_container->autofit; + + + if ( container->af_services ) + FT_Destroy_Class_af_services( library, + container->af_services ); + container->af_services = NULL; + + FT_FREE( container ); + pic_container->autofit = NULL; + } + } + + + FT_Error + autofit_module_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_UInt ss; + FT_Error error = FT_Err_Ok; + AFModulePIC* container = NULL; + FT_Memory memory = library->memory; + + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof ( *container ) ); + pic_container->autofit = container; + + /* initialize pointer table - */ + /* this is how the module usually expects this data */ + error = FT_Create_Class_af_services( library, + &container->af_services ); + if ( error ) + goto Exit; + + FT_Init_Class_af_service_properties( &container->af_service_properties ); + + for ( ss = 0; ss < AF_WRITING_SYSTEM_MAX; ss++ ) + container->af_writing_system_classes[ss] = + &container->af_writing_system_classes_rec[ss]; + container->af_writing_system_classes[AF_WRITING_SYSTEM_MAX] = NULL; + + for ( ss = 0; ss < AF_SCRIPT_MAX; ss++ ) + container->af_script_classes[ss] = + &container->af_script_classes_rec[ss]; + container->af_script_classes[AF_SCRIPT_MAX] = NULL; + + for ( ss = 0; ss < AF_STYLE_MAX; ss++ ) + container->af_style_classes[ss] = + &container->af_style_classes_rec[ss]; + container->af_style_classes[AF_STYLE_MAX] = NULL; + +#undef WRITING_SYSTEM +#define WRITING_SYSTEM( ws, WS ) \ + FT_Init_Class_af_ ## ws ## _writing_system_class( \ + &container->af_writing_system_classes_rec[ss++] ); + + ss = 0; +#include "afwrtsys.h" + +#undef SCRIPT +#define SCRIPT( s, S, d, h, H, sss ) \ + FT_Init_Class_af_ ## s ## _script_class( \ + &container->af_script_classes_rec[ss++] ); + + ss = 0; +#include "afscript.h" + +#undef STYLE +#define STYLE( s, S, d, ws, sc, bss, c ) \ + FT_Init_Class_af_ ## s ## _style_class( \ + &container->af_style_classes_rec[ss++] ); + + ss = 0; +#include "afstyles.h" + + FT_Init_Class_af_autofitter_interface( + library, &container->af_autofitter_interface ); + + Exit: + if ( error ) + autofit_module_class_pic_free( library ); + return error; + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afpic.h b/vendor/FreeType2/src/autofit/afpic.h new file mode 100644 index 0000000..0c73456 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afpic.h @@ -0,0 +1,105 @@ +/***************************************************************************/ +/* */ +/* afpic.h */ +/* */ +/* The FreeType position independent code services for autofit module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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 AFPIC_H_ +#define AFPIC_H_ + + +#include FT_INTERNAL_PIC_H + + +#ifndef FT_CONFIG_OPTION_PIC + +#define AF_SERVICES_GET af_services +#define AF_SERVICE_PROPERTIES_GET af_service_properties + +#define AF_WRITING_SYSTEM_CLASSES_GET af_writing_system_classes +#define AF_SCRIPT_CLASSES_GET af_script_classes +#define AF_STYLE_CLASSES_GET af_style_classes +#define AF_INTERFACE_GET af_autofitter_interface + +#else /* FT_CONFIG_OPTION_PIC */ + + /* some include files required for members of AFModulePIC */ +#include FT_SERVICE_PROPERTIES_H + +#include "aftypes.h" + + +FT_BEGIN_HEADER + + typedef struct AFModulePIC_ + { + FT_ServiceDescRec* af_services; + FT_Service_PropertiesRec af_service_properties; + + AF_WritingSystemClass af_writing_system_classes + [AF_WRITING_SYSTEM_MAX + 1]; + AF_WritingSystemClassRec af_writing_system_classes_rec + [AF_WRITING_SYSTEM_MAX]; + + AF_ScriptClass af_script_classes + [AF_SCRIPT_MAX + 1]; + AF_ScriptClassRec af_script_classes_rec + [AF_SCRIPT_MAX]; + + AF_StyleClass af_style_classes + [AF_STYLE_MAX + 1]; + AF_StyleClassRec af_style_classes_rec + [AF_STYLE_MAX]; + + FT_AutoHinter_InterfaceRec af_autofitter_interface; + + } AFModulePIC; + + +#define GET_PIC( lib ) \ + ( (AFModulePIC*)( (lib)->pic_container.autofit ) ) + +#define AF_SERVICES_GET \ + ( GET_PIC( library )->af_services ) +#define AF_SERVICE_PROPERTIES_GET \ + ( GET_PIC( library )->af_service_properties ) + +#define AF_WRITING_SYSTEM_CLASSES_GET \ + ( GET_PIC( FT_FACE_LIBRARY( globals->face ) )->af_writing_system_classes ) +#define AF_SCRIPT_CLASSES_GET \ + ( GET_PIC( FT_FACE_LIBRARY( globals->face ) )->af_script_classes ) +#define AF_STYLE_CLASSES_GET \ + ( GET_PIC( FT_FACE_LIBRARY( globals->face ) )->af_style_classes ) +#define AF_INTERFACE_GET \ + ( GET_PIC( library )->af_autofitter_interface ) + + + /* see afpic.c for the implementation */ + void + autofit_module_class_pic_free( FT_Library library ); + + FT_Error + autofit_module_class_pic_init( FT_Library library ); + +FT_END_HEADER + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +#endif /* AFPIC_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afranges.c b/vendor/FreeType2/src/autofit/afranges.c new file mode 100644 index 0000000..cf67faf --- /dev/null +++ b/vendor/FreeType2/src/autofit/afranges.c @@ -0,0 +1,1033 @@ +/***************************************************************************/ +/* */ +/* afranges.c */ +/* */ +/* Auto-fitter Unicode script ranges (body). */ +/* */ +/* Copyright 2013-2018 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. */ +/* */ +/***************************************************************************/ + + +#include "afranges.h" + + /* + * The algorithm for assigning properties and styles to the `glyph_styles' + * array is as follows (cf. the implementation in + * `af_face_globals_compute_style_coverage'). + * + * Walk over all scripts (as listed in `afscript.h'). + * + * For a given script, walk over all styles (as listed in `afstyles.h'). + * The order of styles is important and should be as follows. + * + * - First come styles based on OpenType features (small caps, for + * example). Since features rely on glyph indices, thus completely + * bypassing character codes, no properties are assigned. + * + * - Next comes the default style, using the character ranges as defined + * below. This also assigns properties. + * + * Note that there also exist fallback scripts, mainly covering + * superscript and subscript glyphs of a script that are not present as + * OpenType features. Fallback scripts are defined below, also + * assigning properties; they are applied after the corresponding + * script. + * + */ + + + /* XXX Check base character ranges again: */ + /* Right now, they are quickly derived by visual inspection. */ + /* I can imagine that fine-tuning is necessary. */ + + /* for the auto-hinter, a `non-base character' is something that should */ + /* not be affected by blue zones, regardless of whether this is a */ + /* spacing or no-spacing glyph */ + + /* the `af_xxxx_nonbase_uniranges' ranges must be strict subsets */ + /* of the corresponding `af_xxxx_uniranges' ranges */ + + + const AF_Script_UniRangeRec af_adlm_uniranges[] = + { + AF_UNIRANGE_REC( 0x1E900, 0x1E95F ), /* Adlam */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_adlm_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1D944, 0x1E94A ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_arab_uniranges[] = + { + AF_UNIRANGE_REC( 0x0600, 0x06FF ), /* Arabic */ + AF_UNIRANGE_REC( 0x0750, 0x07FF ), /* Arabic Supplement */ + AF_UNIRANGE_REC( 0x08A0, 0x08FF ), /* Arabic Extended-A */ + AF_UNIRANGE_REC( 0xFB50, 0xFDFF ), /* Arabic Presentation Forms-A */ + AF_UNIRANGE_REC( 0xFE70, 0xFEFF ), /* Arabic Presentation Forms-B */ + AF_UNIRANGE_REC( 0x1EE00, 0x1EEFF ), /* Arabic Mathematical Alphabetic Symbols */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_arab_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0600, 0x0605 ), + AF_UNIRANGE_REC( 0x0610, 0x061A ), + AF_UNIRANGE_REC( 0x064B, 0x065F ), + AF_UNIRANGE_REC( 0x0670, 0x0670 ), + AF_UNIRANGE_REC( 0x06D6, 0x06DC ), + AF_UNIRANGE_REC( 0x06DF, 0x06E4 ), + AF_UNIRANGE_REC( 0x06E7, 0x06E8 ), + AF_UNIRANGE_REC( 0x06EA, 0x06ED ), + AF_UNIRANGE_REC( 0x08D4, 0x08E1 ), + AF_UNIRANGE_REC( 0x08D3, 0x08FF ), + AF_UNIRANGE_REC( 0xFBB2, 0xFBC1 ), + AF_UNIRANGE_REC( 0xFE70, 0xFE70 ), + AF_UNIRANGE_REC( 0xFE72, 0xFE72 ), + AF_UNIRANGE_REC( 0xFE74, 0xFE74 ), + AF_UNIRANGE_REC( 0xFE76, 0xFE76 ), + AF_UNIRANGE_REC( 0xFE78, 0xFE78 ), + AF_UNIRANGE_REC( 0xFE7A, 0xFE7A ), + AF_UNIRANGE_REC( 0xFE7C, 0xFE7C ), + AF_UNIRANGE_REC( 0xFE7E, 0xFE7E ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_armn_uniranges[] = + { + AF_UNIRANGE_REC( 0x0530, 0x058F ), /* Armenian */ + AF_UNIRANGE_REC( 0xFB13, 0xFB17 ), /* Alphab. Present. Forms (Armenian) */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_armn_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0559, 0x055F ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_avst_uniranges[] = + { + AF_UNIRANGE_REC( 0x10B00, 0x10B3F ), /* Avestan */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_avst_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x10B39, 0x10B3F ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_bamu_uniranges[] = + { + AF_UNIRANGE_REC( 0xA6A0, 0xA6FF ), /* Bamum */ +#if 0 + /* The characters in the Bamum supplement are pictograms, */ + /* not (directly) related to the syllabic Bamum script */ + AF_UNIRANGE_REC( 0x16800, 0x16A3F ), /* Bamum Supplement */ +#endif + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_bamu_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0xA6F0, 0xA6F1 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_beng_uniranges[] = + { + AF_UNIRANGE_REC( 0x0980, 0x09FF ), /* Bengali */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_beng_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0981, 0x0981 ), + AF_UNIRANGE_REC( 0x09BC, 0x09BC ), + AF_UNIRANGE_REC( 0x09C1, 0x09C4 ), + AF_UNIRANGE_REC( 0x09CD, 0x09CD ), + AF_UNIRANGE_REC( 0x09E2, 0x09E3 ), + AF_UNIRANGE_REC( 0x09FE, 0x09FE ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_buhd_uniranges[] = + { + AF_UNIRANGE_REC( 0x1740, 0x175F ), /* Buhid */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_buhd_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1752, 0x1753 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cakm_uniranges[] = + { + AF_UNIRANGE_REC( 0x11100, 0x1114F ), /* Chakma */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cakm_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x11100, 0x11102 ), + AF_UNIRANGE_REC( 0x11127, 0x11134 ), + AF_UNIRANGE_REC( 0x11146, 0x11146 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cans_uniranges[] = + { + AF_UNIRANGE_REC( 0x1400, 0x167F ), /* Unified Canadian Aboriginal Syllabics */ + AF_UNIRANGE_REC( 0x18B0, 0x18FF ), /* Unified Canadian Aboriginal Syllabics Extended */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cans_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cari_uniranges[] = + { + AF_UNIRANGE_REC( 0x102A0, 0x102DF ), /* Carian */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cari_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cher_uniranges[] = + { + AF_UNIRANGE_REC( 0x13A0, 0x13FF ), /* Cherokee */ + AF_UNIRANGE_REC( 0xAB70, 0xABBF ), /* Cherokee Supplement */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cher_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_copt_uniranges[] = + { + AF_UNIRANGE_REC( 0x2C80, 0x2CFF ), /* Coptic */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_copt_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x2CEF, 0x2CF1 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cprt_uniranges[] = + { + AF_UNIRANGE_REC( 0x10800, 0x1083F ), /* Cypriot */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cprt_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_cyrl_uniranges[] = + { + AF_UNIRANGE_REC( 0x0400, 0x04FF ), /* Cyrillic */ + AF_UNIRANGE_REC( 0x0500, 0x052F ), /* Cyrillic Supplement */ + AF_UNIRANGE_REC( 0x2DE0, 0x2DFF ), /* Cyrillic Extended-A */ + AF_UNIRANGE_REC( 0xA640, 0xA69F ), /* Cyrillic Extended-B */ + AF_UNIRANGE_REC( 0x1C80, 0x1C8F ), /* Cyrillic Extended-C */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_cyrl_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0483, 0x0489 ), + AF_UNIRANGE_REC( 0x2DE0, 0x2DFF ), + AF_UNIRANGE_REC( 0xA66F, 0xA67F ), + AF_UNIRANGE_REC( 0xA69E, 0xA69F ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + /* There are some characters in the Devanagari Unicode block that are */ + /* generic to Indic scripts; we omit them so that their presence doesn't */ + /* trigger Devanagari. */ + + const AF_Script_UniRangeRec af_deva_uniranges[] = + { + AF_UNIRANGE_REC( 0x0900, 0x093B ), /* Devanagari */ + /* omitting U+093C nukta */ + AF_UNIRANGE_REC( 0x093D, 0x0950 ), /* ... continued */ + /* omitting U+0951 udatta, U+0952 anudatta */ + AF_UNIRANGE_REC( 0x0953, 0x0963 ), /* ... continued */ + /* omitting U+0964 danda, U+0965 double danda */ + AF_UNIRANGE_REC( 0x0966, 0x097F ), /* ... continued */ + AF_UNIRANGE_REC( 0x20B9, 0x20B9 ), /* (new) Rupee sign */ + AF_UNIRANGE_REC( 0xA8E0, 0xA8FF ), /* Devanagari Extended */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_deva_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0900, 0x0902 ), + AF_UNIRANGE_REC( 0x093A, 0x093A ), + AF_UNIRANGE_REC( 0x0941, 0x0948 ), + AF_UNIRANGE_REC( 0x094D, 0x094D ), + AF_UNIRANGE_REC( 0x0953, 0x0957 ), + AF_UNIRANGE_REC( 0x0962, 0x0963 ), + AF_UNIRANGE_REC( 0xA8E0, 0xA8F1 ), + AF_UNIRANGE_REC( 0xA8FF, 0xA8FF ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_dsrt_uniranges[] = + { + AF_UNIRANGE_REC( 0x10400, 0x1044F ), /* Deseret */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_dsrt_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_ethi_uniranges[] = + { + AF_UNIRANGE_REC( 0x1200, 0x137F ), /* Ethiopic */ + AF_UNIRANGE_REC( 0x1380, 0x139F ), /* Ethiopic Supplement */ + AF_UNIRANGE_REC( 0x2D80, 0x2DDF ), /* Ethiopic Extended */ + AF_UNIRANGE_REC( 0xAB00, 0xAB2F ), /* Ethiopic Extended-A */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_ethi_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x135D, 0x135F ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_geor_uniranges[] = + { + AF_UNIRANGE_REC( 0x10D0, 0x10FF ), /* Georgian (Mkhedruli) */ + AF_UNIRANGE_REC( 0x1C90, 0x1CBF ), /* Georgian Extended (Mtavruli) */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_geor_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_geok_uniranges[] = + { + /* Khutsuri */ + AF_UNIRANGE_REC( 0x10A0, 0x10CD ), /* Georgian (Asomtavruli) */ + AF_UNIRANGE_REC( 0x2D00, 0x2D2D ), /* Georgian Supplement (Nuskhuri) */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_geok_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_glag_uniranges[] = + { + AF_UNIRANGE_REC( 0x2C00, 0x2C5F ), /* Glagolitic */ + AF_UNIRANGE_REC( 0x1E000, 0x1E02F ), /* Glagolitic Supplement */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_glag_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1E000, 0x1E02F ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_goth_uniranges[] = + { + AF_UNIRANGE_REC( 0x10330, 0x1034F ), /* Gothic */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_goth_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_grek_uniranges[] = + { + AF_UNIRANGE_REC( 0x0370, 0x03FF ), /* Greek and Coptic */ + AF_UNIRANGE_REC( 0x1F00, 0x1FFF ), /* Greek Extended */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_grek_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x037A, 0x037A ), + AF_UNIRANGE_REC( 0x0384, 0x0385 ), + AF_UNIRANGE_REC( 0x1FBD, 0x1FC1 ), + AF_UNIRANGE_REC( 0x1FCD, 0x1FCF ), + AF_UNIRANGE_REC( 0x1FDD, 0x1FDF ), + AF_UNIRANGE_REC( 0x1FED, 0x1FEF ), + AF_UNIRANGE_REC( 0x1FFD, 0x1FFE ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_gujr_uniranges[] = + { + AF_UNIRANGE_REC( 0x0A80, 0x0AFF ), /* Gujarati */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_gujr_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0A81, 0x0A82 ), + AF_UNIRANGE_REC( 0x0ABC, 0x0ABC ), + AF_UNIRANGE_REC( 0x0AC1, 0x0AC8 ), + AF_UNIRANGE_REC( 0x0ACD, 0x0ACD ), + AF_UNIRANGE_REC( 0x0AE2, 0x0AE3 ), + AF_UNIRANGE_REC( 0x0AFA, 0x0AFF ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_guru_uniranges[] = + { + AF_UNIRANGE_REC( 0x0A00, 0x0A7F ), /* Gurmukhi */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_guru_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0A01, 0x0A02 ), + AF_UNIRANGE_REC( 0x0A3C, 0x0A3C ), + AF_UNIRANGE_REC( 0x0A41, 0x0A51 ), + AF_UNIRANGE_REC( 0x0A70, 0x0A71 ), + AF_UNIRANGE_REC( 0x0A75, 0x0A75 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_hebr_uniranges[] = + { + AF_UNIRANGE_REC( 0x0590, 0x05FF ), /* Hebrew */ + AF_UNIRANGE_REC( 0xFB1D, 0xFB4F ), /* Alphab. Present. Forms (Hebrew) */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_hebr_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0591, 0x05BF ), + AF_UNIRANGE_REC( 0x05C1, 0x05C2 ), + AF_UNIRANGE_REC( 0x05C4, 0x05C5 ), + AF_UNIRANGE_REC( 0x05C7, 0x05C7 ), + AF_UNIRANGE_REC( 0xFB1E, 0xFB1E ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_kali_uniranges[] = + { + AF_UNIRANGE_REC( 0xA900, 0xA92F ), /* Kayah Li */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_kali_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0xA926, 0xA92D ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_knda_uniranges[] = + { + AF_UNIRANGE_REC( 0x0C80, 0x0CFF ), /* Kannada */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_knda_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0C81, 0x0C81 ), + AF_UNIRANGE_REC( 0x0CBC, 0x0CBC ), + AF_UNIRANGE_REC( 0x0CBF, 0x0CBF ), + AF_UNIRANGE_REC( 0x0CC6, 0x0CC6 ), + AF_UNIRANGE_REC( 0x0CCC, 0x0CCD ), + AF_UNIRANGE_REC( 0x0CE2, 0x0CE3 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_khmr_uniranges[] = + { + AF_UNIRANGE_REC( 0x1780, 0x17FF ), /* Khmer */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_khmr_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x17B7, 0x17BD ), + AF_UNIRANGE_REC( 0x17C6, 0x17C6 ), + AF_UNIRANGE_REC( 0x17C9, 0x17D3 ), + AF_UNIRANGE_REC( 0x17DD, 0x17DD ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_khms_uniranges[] = + { + AF_UNIRANGE_REC( 0x19E0, 0x19FF ), /* Khmer Symbols */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_khms_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_lao_uniranges[] = + { + AF_UNIRANGE_REC( 0x0E80, 0x0EFF ), /* Lao */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_lao_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0EB1, 0x0EB1 ), + AF_UNIRANGE_REC( 0x0EB4, 0x0EBC ), + AF_UNIRANGE_REC( 0x0EC8, 0x0ECD ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_latn_uniranges[] = + { + AF_UNIRANGE_REC( 0x0020, 0x007F ), /* Basic Latin (no control chars) */ + AF_UNIRANGE_REC( 0x00A0, 0x00A9 ), /* Latin-1 Supplement (no control chars) */ + AF_UNIRANGE_REC( 0x00AB, 0x00B1 ), /* ... continued */ + AF_UNIRANGE_REC( 0x00B4, 0x00B8 ), /* ... continued */ + AF_UNIRANGE_REC( 0x00BB, 0x00FF ), /* ... continued */ + AF_UNIRANGE_REC( 0x0100, 0x017F ), /* Latin Extended-A */ + AF_UNIRANGE_REC( 0x0180, 0x024F ), /* Latin Extended-B */ + AF_UNIRANGE_REC( 0x0250, 0x02AF ), /* IPA Extensions */ + AF_UNIRANGE_REC( 0x02B9, 0x02DF ), /* Spacing Modifier Letters */ + AF_UNIRANGE_REC( 0x02E5, 0x02FF ), /* ... continued */ + AF_UNIRANGE_REC( 0x0300, 0x036F ), /* Combining Diacritical Marks */ + AF_UNIRANGE_REC( 0x1AB0, 0x1ABE ), /* Combining Diacritical Marks Extended */ + AF_UNIRANGE_REC( 0x1D00, 0x1D2B ), /* Phonetic Extensions */ + AF_UNIRANGE_REC( 0x1D6B, 0x1D77 ), /* ... continued */ + AF_UNIRANGE_REC( 0x1D79, 0x1D7F ), /* ... continued */ + AF_UNIRANGE_REC( 0x1D80, 0x1D9A ), /* Phonetic Extensions Supplement */ + AF_UNIRANGE_REC( 0x1DC0, 0x1DFF ), /* Combining Diacritical Marks Supplement */ + AF_UNIRANGE_REC( 0x1E00, 0x1EFF ), /* Latin Extended Additional */ + AF_UNIRANGE_REC( 0x2000, 0x206F ), /* General Punctuation */ + AF_UNIRANGE_REC( 0x20A0, 0x20B8 ), /* Currency Symbols ... */ + AF_UNIRANGE_REC( 0x20BA, 0x20CF ), /* ... except new Rupee sign */ + AF_UNIRANGE_REC( 0x2150, 0x218F ), /* Number Forms */ + AF_UNIRANGE_REC( 0x2C60, 0x2C7B ), /* Latin Extended-C */ + AF_UNIRANGE_REC( 0x2C7E, 0x2C7F ), /* ... continued */ + AF_UNIRANGE_REC( 0x2E00, 0x2E7F ), /* Supplemental Punctuation */ + AF_UNIRANGE_REC( 0xA720, 0xA76F ), /* Latin Extended-D */ + AF_UNIRANGE_REC( 0xA771, 0xA7F7 ), /* ... continued */ + AF_UNIRANGE_REC( 0xA7FA, 0xA7FF ), /* ... continued */ + AF_UNIRANGE_REC( 0xAB30, 0xAB5B ), /* Latin Extended-E */ + AF_UNIRANGE_REC( 0xAB60, 0xAB6F ), /* ... continued */ + AF_UNIRANGE_REC( 0xFB00, 0xFB06 ), /* Alphab. Present. Forms (Latin Ligs) */ + AF_UNIRANGE_REC( 0x1D400, 0x1D7FF ), /* Mathematical Alphanumeric Symbols */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_latn_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x005E, 0x0060 ), + AF_UNIRANGE_REC( 0x007E, 0x007E ), + AF_UNIRANGE_REC( 0x00A8, 0x00A9 ), + AF_UNIRANGE_REC( 0x00AE, 0x00B0 ), + AF_UNIRANGE_REC( 0x00B4, 0x00B4 ), + AF_UNIRANGE_REC( 0x00B8, 0x00B8 ), + AF_UNIRANGE_REC( 0x00BC, 0x00BE ), + AF_UNIRANGE_REC( 0x02B9, 0x02DF ), + AF_UNIRANGE_REC( 0x02E5, 0x02FF ), + AF_UNIRANGE_REC( 0x0300, 0x036F ), + AF_UNIRANGE_REC( 0x1AB0, 0x1ABE ), + AF_UNIRANGE_REC( 0x1DC0, 0x1DFF ), + AF_UNIRANGE_REC( 0x2017, 0x2017 ), + AF_UNIRANGE_REC( 0x203E, 0x203E ), + AF_UNIRANGE_REC( 0xA788, 0xA788 ), + AF_UNIRANGE_REC( 0xA7F8, 0xA7FA ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_latb_uniranges[] = + { + AF_UNIRANGE_REC( 0x1D62, 0x1D6A ), /* some small subscript letters */ + AF_UNIRANGE_REC( 0x2080, 0x209C ), /* subscript digits and letters */ + AF_UNIRANGE_REC( 0x2C7C, 0x2C7C ), /* latin subscript small letter j */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_latb_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_latp_uniranges[] = + { + AF_UNIRANGE_REC( 0x00AA, 0x00AA ), /* feminine ordinal indicator */ + AF_UNIRANGE_REC( 0x00B2, 0x00B3 ), /* superscript two and three */ + AF_UNIRANGE_REC( 0x00B9, 0x00BA ), /* superscript one, masc. ord. indic. */ + AF_UNIRANGE_REC( 0x02B0, 0x02B8 ), /* some latin superscript mod. letters */ + AF_UNIRANGE_REC( 0x02E0, 0x02E4 ), /* some IPA modifier letters */ + AF_UNIRANGE_REC( 0x1D2C, 0x1D61 ), /* latin superscript modifier letters */ + AF_UNIRANGE_REC( 0x1D78, 0x1D78 ), /* modifier letter cyrillic en */ + AF_UNIRANGE_REC( 0x1D9B, 0x1DBF ), /* more modifier letters */ + AF_UNIRANGE_REC( 0x2070, 0x207F ), /* superscript digits and letters */ + AF_UNIRANGE_REC( 0x2C7D, 0x2C7D ), /* modifier letter capital v */ + AF_UNIRANGE_REC( 0xA770, 0xA770 ), /* modifier letter us */ + AF_UNIRANGE_REC( 0xA7F8, 0xA7F9 ), /* more modifier letters */ + AF_UNIRANGE_REC( 0xAB5C, 0xAB5F ), /* more modifier letters */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_latp_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_lisu_uniranges[] = + { + AF_UNIRANGE_REC( 0xA4D0, 0xA4FF ), /* Lisu */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_lisu_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_mlym_uniranges[] = + { + AF_UNIRANGE_REC( 0x0D00, 0x0D7F ), /* Malayalam */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_mlym_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0D00, 0x0D01 ), + AF_UNIRANGE_REC( 0x0D3B, 0x0D3C ), + AF_UNIRANGE_REC( 0x0D4D, 0x0D4E ), + AF_UNIRANGE_REC( 0x0D62, 0x0D63 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_mymr_uniranges[] = + { + AF_UNIRANGE_REC( 0x1000, 0x109F ), /* Myanmar */ + AF_UNIRANGE_REC( 0xA9E0, 0xA9FF ), /* Myanmar Extended-B */ + AF_UNIRANGE_REC( 0xAA60, 0xAA7F ), /* Myanmar Extended-A */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_mymr_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x102D, 0x1030 ), + AF_UNIRANGE_REC( 0x1032, 0x1037 ), + AF_UNIRANGE_REC( 0x103A, 0x103A ), + AF_UNIRANGE_REC( 0x103D, 0x103E ), + AF_UNIRANGE_REC( 0x1058, 0x1059 ), + AF_UNIRANGE_REC( 0x105E, 0x1060 ), + AF_UNIRANGE_REC( 0x1071, 0x1074 ), + AF_UNIRANGE_REC( 0x1082, 0x1082 ), + AF_UNIRANGE_REC( 0x1085, 0x1086 ), + AF_UNIRANGE_REC( 0x108D, 0x108D ), + AF_UNIRANGE_REC( 0xA9E5, 0xA9E5 ), + AF_UNIRANGE_REC( 0xAA7C, 0xAA7C ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_nkoo_uniranges[] = + { + AF_UNIRANGE_REC( 0x07C0, 0x07FF ), /* N'Ko */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_nkoo_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x07EB, 0x07F5 ), + AF_UNIRANGE_REC( 0x07FD, 0x07FD ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_none_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_none_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_olck_uniranges[] = + { + AF_UNIRANGE_REC( 0x1C50, 0x1C7F ), /* Ol Chiki */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_olck_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_orkh_uniranges[] = + { + AF_UNIRANGE_REC( 0x10C00, 0x10C4F ), /* Old Turkic */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_orkh_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_osge_uniranges[] = + { + AF_UNIRANGE_REC( 0x104B0, 0x104FF ), /* Osage */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_osge_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_osma_uniranges[] = + { + AF_UNIRANGE_REC( 0x10480, 0x104AF ), /* Osmanya */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_osma_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_saur_uniranges[] = + { + AF_UNIRANGE_REC( 0xA880, 0xA8DF ), /* Saurashtra */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_saur_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0xA880, 0xA881 ), + AF_UNIRANGE_REC( 0xA8B4, 0xA8C5 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_shaw_uniranges[] = + { + AF_UNIRANGE_REC( 0x10450, 0x1047F ), /* Shavian */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_shaw_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_sinh_uniranges[] = + { + AF_UNIRANGE_REC( 0x0D80, 0x0DFF ), /* Sinhala */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_sinh_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0DCA, 0x0DCA ), + AF_UNIRANGE_REC( 0x0DD2, 0x0DD6 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_sund_uniranges[] = + { + AF_UNIRANGE_REC( 0x1B80, 0x1BBF ), /* Sundanese */ + AF_UNIRANGE_REC( 0x1CC0, 0x1CCF ), /* Sundanese Supplement */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_sund_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1B80, 0x1B82 ), + AF_UNIRANGE_REC( 0x1BA1, 0x1BAD ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_taml_uniranges[] = + { + AF_UNIRANGE_REC( 0x0B80, 0x0BFF ), /* Tamil */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_taml_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0B82, 0x0B82 ), + AF_UNIRANGE_REC( 0x0BC0, 0x0BC2 ), + AF_UNIRANGE_REC( 0x0BCD, 0x0BCD ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_tavt_uniranges[] = + { + AF_UNIRANGE_REC( 0xAA80, 0xAADF ), /* Tai Viet */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_tavt_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0xAAB0, 0xAAB0 ), + AF_UNIRANGE_REC( 0xAAB2, 0xAAB4 ), + AF_UNIRANGE_REC( 0xAAB7, 0xAAB8 ), + AF_UNIRANGE_REC( 0xAABE, 0xAABF ), + AF_UNIRANGE_REC( 0xAAC1, 0xAAC1 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_telu_uniranges[] = + { + AF_UNIRANGE_REC( 0x0C00, 0x0C7F ), /* Telugu */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_telu_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0C00, 0x0C00 ), + AF_UNIRANGE_REC( 0x0C04, 0x0C04 ), + AF_UNIRANGE_REC( 0x0C3E, 0x0C40 ), + AF_UNIRANGE_REC( 0x0C46, 0x0C56 ), + AF_UNIRANGE_REC( 0x0C62, 0x0C63 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_thai_uniranges[] = + { + AF_UNIRANGE_REC( 0x0E00, 0x0E7F ), /* Thai */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_thai_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0E31, 0x0E31 ), + AF_UNIRANGE_REC( 0x0E34, 0x0E3A ), + AF_UNIRANGE_REC( 0x0E47, 0x0E4E ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_tfng_uniranges[] = + { + AF_UNIRANGE_REC( 0x2D30, 0x2D7F ), /* Tifinagh */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_tfng_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_vaii_uniranges[] = + { + AF_UNIRANGE_REC( 0xA500, 0xA63F ), /* Vai */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_vaii_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0, 0 ) + }; + + +#ifdef AF_CONFIG_OPTION_INDIC + + const AF_Script_UniRangeRec af_limb_uniranges[] = + { + AF_UNIRANGE_REC( 0x1900, 0x194F ), /* Limbu */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_limb_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x1920, 0x1922 ), + AF_UNIRANGE_REC( 0x1927, 0x1934 ), + AF_UNIRANGE_REC( 0x1937, 0x193B ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_orya_uniranges[] = + { + AF_UNIRANGE_REC( 0x0B00, 0x0B7F ), /* Oriya */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_orya_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0B01, 0x0B02 ), + AF_UNIRANGE_REC( 0x0B3C, 0x0B3C ), + AF_UNIRANGE_REC( 0x0B3F, 0x0B3F ), + AF_UNIRANGE_REC( 0x0B41, 0x0B44 ), + AF_UNIRANGE_REC( 0x0B4D, 0x0B56 ), + AF_UNIRANGE_REC( 0x0B62, 0x0B63 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_sylo_uniranges[] = + { + AF_UNIRANGE_REC( 0xA800, 0xA82F ), /* Syloti Nagri */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_sylo_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0xA802, 0xA802 ), + AF_UNIRANGE_REC( 0xA806, 0xA806 ), + AF_UNIRANGE_REC( 0xA80B, 0xA80B ), + AF_UNIRANGE_REC( 0xA825, 0xA826 ), + AF_UNIRANGE_REC( 0, 0 ) + }; + + + const AF_Script_UniRangeRec af_tibt_uniranges[] = + { + AF_UNIRANGE_REC( 0x0F00, 0x0FFF ), /* Tibetan */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_tibt_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x0F18, 0x0F19 ), + AF_UNIRANGE_REC( 0x0F35, 0x0F35 ), + AF_UNIRANGE_REC( 0x0F37, 0x0F37 ), + AF_UNIRANGE_REC( 0x0F39, 0x0F39 ), + AF_UNIRANGE_REC( 0x0F3E, 0x0F3F ), + AF_UNIRANGE_REC( 0x0F71, 0x0F7E ), + AF_UNIRANGE_REC( 0x0F80, 0x0F84 ), + AF_UNIRANGE_REC( 0x0F86, 0x0F87 ), + AF_UNIRANGE_REC( 0x0F8D, 0x0FBC ), + AF_UNIRANGE_REC( 0, 0 ) + }; + +#endif /* !AF_CONFIG_OPTION_INDIC */ + +#ifdef AF_CONFIG_OPTION_CJK + + /* this corresponds to Unicode 6.0 */ + + const AF_Script_UniRangeRec af_hani_uniranges[] = + { + AF_UNIRANGE_REC( 0x1100, 0x11FF ), /* Hangul Jamo */ + AF_UNIRANGE_REC( 0x2E80, 0x2EFF ), /* CJK Radicals Supplement */ + AF_UNIRANGE_REC( 0x2F00, 0x2FDF ), /* Kangxi Radicals */ + AF_UNIRANGE_REC( 0x2FF0, 0x2FFF ), /* Ideographic Description Characters */ + AF_UNIRANGE_REC( 0x3000, 0x303F ), /* CJK Symbols and Punctuation */ + AF_UNIRANGE_REC( 0x3040, 0x309F ), /* Hiragana */ + AF_UNIRANGE_REC( 0x30A0, 0x30FF ), /* Katakana */ + AF_UNIRANGE_REC( 0x3100, 0x312F ), /* Bopomofo */ + AF_UNIRANGE_REC( 0x3130, 0x318F ), /* Hangul Compatibility Jamo */ + AF_UNIRANGE_REC( 0x3190, 0x319F ), /* Kanbun */ + AF_UNIRANGE_REC( 0x31A0, 0x31BF ), /* Bopomofo Extended */ + AF_UNIRANGE_REC( 0x31C0, 0x31EF ), /* CJK Strokes */ + AF_UNIRANGE_REC( 0x31F0, 0x31FF ), /* Katakana Phonetic Extensions */ + AF_UNIRANGE_REC( 0x3300, 0x33FF ), /* CJK Compatibility */ + AF_UNIRANGE_REC( 0x3400, 0x4DBF ), /* CJK Unified Ideographs Extension A */ + AF_UNIRANGE_REC( 0x4DC0, 0x4DFF ), /* Yijing Hexagram Symbols */ + AF_UNIRANGE_REC( 0x4E00, 0x9FFF ), /* CJK Unified Ideographs */ + AF_UNIRANGE_REC( 0xA960, 0xA97F ), /* Hangul Jamo Extended-A */ + AF_UNIRANGE_REC( 0xAC00, 0xD7AF ), /* Hangul Syllables */ + AF_UNIRANGE_REC( 0xD7B0, 0xD7FF ), /* Hangul Jamo Extended-B */ + AF_UNIRANGE_REC( 0xF900, 0xFAFF ), /* CJK Compatibility Ideographs */ + AF_UNIRANGE_REC( 0xFE10, 0xFE1F ), /* Vertical forms */ + AF_UNIRANGE_REC( 0xFE30, 0xFE4F ), /* CJK Compatibility Forms */ + AF_UNIRANGE_REC( 0xFF00, 0xFFEF ), /* Halfwidth and Fullwidth Forms */ + AF_UNIRANGE_REC( 0x1B000, 0x1B0FF ), /* Kana Supplement */ + AF_UNIRANGE_REC( 0x1B100, 0x1B12F ), /* Kana Extended-A */ + AF_UNIRANGE_REC( 0x1D300, 0x1D35F ), /* Tai Xuan Hing Symbols */ + AF_UNIRANGE_REC( 0x20000, 0x2A6DF ), /* CJK Unified Ideographs Extension B */ + AF_UNIRANGE_REC( 0x2A700, 0x2B73F ), /* CJK Unified Ideographs Extension C */ + AF_UNIRANGE_REC( 0x2B740, 0x2B81F ), /* CJK Unified Ideographs Extension D */ + AF_UNIRANGE_REC( 0x2B820, 0x2CEAF ), /* CJK Unified Ideographs Extension E */ + AF_UNIRANGE_REC( 0x2CEB0, 0x2EBEF ), /* CJK Unified Ideographs Extension F */ + AF_UNIRANGE_REC( 0x2F800, 0x2FA1F ), /* CJK Compatibility Ideographs Supplement */ + AF_UNIRANGE_REC( 0, 0 ) + }; + + const AF_Script_UniRangeRec af_hani_nonbase_uniranges[] = + { + AF_UNIRANGE_REC( 0x302A, 0x302F ), + AF_UNIRANGE_REC( 0x3190, 0x319F ), + AF_UNIRANGE_REC( 0, 0 ) + }; + +#endif /* !AF_CONFIG_OPTION_CJK */ + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afranges.h b/vendor/FreeType2/src/autofit/afranges.h new file mode 100644 index 0000000..ba3b5e7 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afranges.h @@ -0,0 +1,47 @@ +/***************************************************************************/ +/* */ +/* afranges.h */ +/* */ +/* Auto-fitter Unicode script ranges (specification). */ +/* */ +/* Copyright 2013-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AFRANGES_H_ +#define AFRANGES_H_ + + +#include "aftypes.h" + + +FT_BEGIN_HEADER + +#undef SCRIPT +#define SCRIPT( s, S, d, h, H, ss ) \ + extern const AF_Script_UniRangeRec af_ ## s ## _uniranges[]; + +#include "afscript.h" + +#undef SCRIPT +#define SCRIPT( s, S, d, h, H, ss ) \ + extern const AF_Script_UniRangeRec af_ ## s ## _nonbase_uniranges[]; + +#include "afscript.h" + + /* */ + +FT_END_HEADER + +#endif /* AFRANGES_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afscript.h b/vendor/FreeType2/src/autofit/afscript.h new file mode 100644 index 0000000..623a173 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afscript.h @@ -0,0 +1,390 @@ +/***************************************************************************/ +/* */ +/* afscript.h */ +/* */ +/* Auto-fitter scripts (specification only). */ +/* */ +/* Copyright 2013-2018 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. */ +/* */ +/***************************************************************************/ + + + /* The following part can be included multiple times. */ + /* Define `SCRIPT' as needed. */ + + + /* Add new scripts here. The first and second arguments are the */ + /* script name in lowercase and uppercase, respectively, followed */ + /* by a description string. Then comes the corresponding HarfBuzz */ + /* script name tag, followed by a string of standard characters (to */ + /* derive the standard width and height of stems). */ + /* */ + /* Note that fallback scripts only have a default style, thus we */ + /* use `HB_SCRIPT_INVALID' as the HarfBuzz script name tag for */ + /* them. */ + + SCRIPT( adlm, ADLM, + "Adlam", + HB_SCRIPT_ADLAM, + HINTING_BOTTOM_TO_TOP, + "\xF0\x9E\xA4\x8C \xF0\x9E\xA4\xAE" ) /* 𞤌 𞤮 */ + + SCRIPT( arab, ARAB, + "Arabic", + HB_SCRIPT_ARABIC, + HINTING_BOTTOM_TO_TOP, + "\xD9\x84 \xD8\xAD \xD9\x80" ) /* ل ح ـ */ + + SCRIPT( armn, ARMN, + "Armenian", + HB_SCRIPT_ARMENIAN, + HINTING_BOTTOM_TO_TOP, + "\xD5\xBD \xD5\x8D" ) /* ս Ս */ + + SCRIPT( avst, AVST, + "Avestan", + HB_SCRIPT_AVESTAN, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\xAC\x9A" ) /* 𐬚 */ + + SCRIPT( bamu, BAMU, + "Bamum", + HB_SCRIPT_BAMUM, + HINTING_BOTTOM_TO_TOP, + "\xEA\x9B\x81 \xEA\x9B\xAF" ) /* ꛁ ꛯ */ + + /* there are no simple forms for letters; we thus use two digit shapes */ + SCRIPT( beng, BENG, + "Bengali", + HB_SCRIPT_BENGALI, + HINTING_TOP_TO_BOTTOM, + "\xE0\xA7\xA6 \xE0\xA7\xAA" ) /* ০ ৪ */ + + SCRIPT( buhd, BUHD, + "Buhid", + HB_SCRIPT_BUHID, + HINTING_BOTTOM_TO_TOP, + "\xE1\x9D\x8B \xE1\x9D\x8F" ) /* ᝋ ᝏ */ + + SCRIPT( cakm, CAKM, + "Chakma", + HB_SCRIPT_CHAKMA, + HINTING_BOTTOM_TO_TOP, + "\xF0\x91\x84\xA4 \xF0\x91\x84\x89 \xF0\x91\x84\x9B" ) /* 𑄤 𑄉 𑄛 */ + + SCRIPT( cans, CANS, + "Canadian Syllabics", + HB_SCRIPT_CANADIAN_SYLLABICS, + HINTING_BOTTOM_TO_TOP, + "\xE1\x91\x8C \xE1\x93\x9A" ) /* ᑌ ᓚ */ + + SCRIPT( cari, CARI, + "Carian", + HB_SCRIPT_CARIAN, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\x8A\xAB \xF0\x90\x8B\x89" ) /* 𐊫 𐋉 */ + + SCRIPT( cher, CHER, + "Cherokee", + HB_SCRIPT_CHEROKEE, + HINTING_BOTTOM_TO_TOP, + "\xE1\x8E\xA4 \xE1\x8F\x85 \xEA\xAE\x95" ) /* Ꭴ Ꮕ ꮕ */ + + SCRIPT( copt, COPT, + "Coptic", + HB_SCRIPT_COPTIC, + HINTING_BOTTOM_TO_TOP, + "\xE2\xB2\x9E \xE2\xB2\x9F" ) /* Ⲟ ⲟ */ + + SCRIPT( cprt, CPRT, + "Cypriot", + HB_SCRIPT_CYPRIOT, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\xA0\x85 \xF0\x90\xA0\xA3" ) /* 𐠅 𐠣 */ + + SCRIPT( cyrl, CYRL, + "Cyrillic", + HB_SCRIPT_CYRILLIC, + HINTING_BOTTOM_TO_TOP, + "\xD0\xBE \xD0\x9E" ) /* о О */ + + SCRIPT( deva, DEVA, + "Devanagari", + HB_SCRIPT_DEVANAGARI, + HINTING_TOP_TO_BOTTOM, + "\xE0\xA4\xA0 \xE0\xA4\xB5 \xE0\xA4\x9F" ) /* ठ व ट */ + + SCRIPT( dsrt, DSRT, + "Deseret", + HB_SCRIPT_DESERET, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\x90\x84 \xF0\x90\x90\xAC" ) /* 𐐄 𐐬 */ + + SCRIPT( ethi, ETHI, + "Ethiopic", + HB_SCRIPT_ETHIOPIC, + HINTING_BOTTOM_TO_TOP, + "\xE1\x8B\x90" ) /* ዐ */ + + SCRIPT( geor, GEOR, + "Georgian (Mkhedruli)", + HB_SCRIPT_GEORGIAN, + HINTING_BOTTOM_TO_TOP, + "\xE1\x83\x98 \xE1\x83\x94 \xE1\x83\x90 \xE1\xB2\xBF" ) /* ი ე ა Ი */ + + SCRIPT( geok, GEOK, + "Georgian (Khutsuri)", + HB_SCRIPT_INVALID, + HINTING_BOTTOM_TO_TOP, + "\xE1\x82\xB6 \xE1\x82\xB1 \xE2\xB4\x99" ) /* Ⴖ Ⴑ ⴙ */ + + SCRIPT( glag, GLAG, + "Glagolitic", + HB_SCRIPT_GLAGOLITIC, + HINTING_BOTTOM_TO_TOP, + "\xE2\xB0\x95 \xE2\xB1\x85" ) /* Ⱅ ⱅ */ + + SCRIPT( goth, GOTH, + "Gothic", + HB_SCRIPT_GOTHIC, + HINTING_TOP_TO_BOTTOM, + "\xF0\x90\x8C\xB4 \xF0\x90\x8C\xBE \xF0\x90\x8D\x83" ) /* 𐌴 𐌾 𐍃 */ + + SCRIPT( grek, GREK, + "Greek", + HB_SCRIPT_GREEK, + HINTING_BOTTOM_TO_TOP, + "\xCE\xBF \xCE\x9F" ) /* ο Ο */ + + SCRIPT( gujr, GUJR, + "Gujarati", + HB_SCRIPT_GUJARATI, + HINTING_BOTTOM_TO_TOP, + "\xE0\xAA\x9F \xE0\xAB\xA6" ) /* ટ ૦ */ + + SCRIPT( guru, GURU, + "Gurmukhi", + HB_SCRIPT_GURMUKHI, + HINTING_TOP_TO_BOTTOM, + "\xE0\xA8\xA0 \xE0\xA8\xB0 \xE0\xA9\xA6" ) /* ਠ ਰ ੦ */ + + SCRIPT( hebr, HEBR, + "Hebrew", + HB_SCRIPT_HEBREW, + HINTING_BOTTOM_TO_TOP, + "\xD7\x9D" ) /* ם */ + + SCRIPT( kali, KALI, + "Kayah Li", + HB_SCRIPT_KAYAH_LI, + HINTING_BOTTOM_TO_TOP, + "\xEA\xA4\x8D \xEA\xA4\x80" ) /* ꤍ ꤀ */ + + /* only digit zero has a simple shape in the Khmer script */ + SCRIPT( khmr, KHMR, + "Khmer", + HB_SCRIPT_KHMER, + HINTING_BOTTOM_TO_TOP, + "\xE1\x9F\xA0" ) /* ០ */ + + SCRIPT( khms, KHMS, + "Khmer Symbols", + HB_SCRIPT_INVALID, + HINTING_BOTTOM_TO_TOP, + "\xE1\xA7\xA1 \xE1\xA7\xAA" ) /* ᧡ ᧪ */ + + SCRIPT( knda, KNDA, + "Kannada", + HB_SCRIPT_KANNADA, + HINTING_BOTTOM_TO_TOP, + "\xE0\xB3\xA6 \xE0\xB2\xAC" ) /* ೦ ಬ */ + + /* only digit zero has a simple shape in the Lao script */ + SCRIPT( lao, LAO, + "Lao", + HB_SCRIPT_LAO, + HINTING_BOTTOM_TO_TOP, + "\xE0\xBB\x90" ) /* ໐ */ + + SCRIPT( latn, LATN, + "Latin", + HB_SCRIPT_LATIN, + HINTING_BOTTOM_TO_TOP, + "o O 0" ) + + SCRIPT( latb, LATB, + "Latin Subscript Fallback", + HB_SCRIPT_INVALID, + HINTING_BOTTOM_TO_TOP, + "\xE2\x82\x92 \xE2\x82\x80" ) /* ₒ ₀ */ + + SCRIPT( latp, LATP, + "Latin Superscript Fallback", + HB_SCRIPT_INVALID, + HINTING_BOTTOM_TO_TOP, + "\xE1\xB5\x92 \xE1\xB4\xBC \xE2\x81\xB0" ) /* ᵒ ᴼ ⁰ */ + + SCRIPT( lisu, LISU, + "Lisu", + HB_SCRIPT_LISU, + HINTING_BOTTOM_TO_TOP, + "\xEA\x93\xB3" ) /* ꓳ */ + + SCRIPT( mlym, MLYM, + "Malayalam", + HB_SCRIPT_MALAYALAM, + HINTING_BOTTOM_TO_TOP, + "\xE0\xB4\xA0 \xE0\xB4\xB1" ) /* ഠ റ */ + + SCRIPT( mymr, MYMR, + "Myanmar", + HB_SCRIPT_MYANMAR, + HINTING_BOTTOM_TO_TOP, + "\xE1\x80\x9D \xE1\x80\x84 \xE1\x80\x82" ) /* ဝ င ဂ */ + + SCRIPT( nkoo, NKOO, + "N'Ko", + HB_SCRIPT_NKO, + HINTING_BOTTOM_TO_TOP, + "\xDF\x8B \xDF\x80" ) /* ߋ ߀ */ + + SCRIPT( none, NONE, + "no script", + HB_SCRIPT_INVALID, + HINTING_BOTTOM_TO_TOP, + "" ) + + SCRIPT( olck, OLCK, + "Ol Chiki", + HB_SCRIPT_OL_CHIKI, + HINTING_BOTTOM_TO_TOP, + "\xE1\xB1\x9B" ) /* ᱛ */ + + SCRIPT( orkh, ORKH, + "Old Turkic", + HB_SCRIPT_OLD_TURKIC, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\xB0\x97" ) /* 𐰗 */ + + SCRIPT( osge, OSGE, + "Osage", + HB_SCRIPT_OSAGE, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\x93\x82 \xF0\x90\x93\xAA" ) /* 𐓂 𐓪 */ + + SCRIPT( osma, OSMA, + "Osmanya", + HB_SCRIPT_OSMANYA, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\x92\x86 \xF0\x90\x92\xA0" ) /* 𐒆 𐒠 */ + + SCRIPT( saur, SAUR, + "Saurashtra", + HB_SCRIPT_SAURASHTRA, + HINTING_BOTTOM_TO_TOP, + "\xEA\xA2\x9D \xEA\xA3\x90" ) /* ꢝ ꣐ */ + + SCRIPT( shaw, SHAW, + "Shavian", + HB_SCRIPT_SHAVIAN, + HINTING_BOTTOM_TO_TOP, + "\xF0\x90\x91\xB4" ) /* 𐑴 */ + + SCRIPT( sinh, SINH, + "Sinhala", + HB_SCRIPT_SINHALA, + HINTING_BOTTOM_TO_TOP, + "\xE0\xB6\xA7" ) /* ට */ + + /* only digit zero has a simple (round) shape in the Sundanese script */ + SCRIPT( sund, SUND, + "Sundanese", + HB_SCRIPT_SUNDANESE, + HINTING_BOTTOM_TO_TOP, + "\xE1\xAE\xB0" ) /* ᮰ */ + + /* only digit zero has a simple (round) shape in the Tamil script */ + SCRIPT( taml, TAML, + "Tamil", + HB_SCRIPT_TAMIL, + HINTING_BOTTOM_TO_TOP, + "\xE0\xAF\xA6" ) /* ௦ */ + + SCRIPT( tavt, TAVT, + "Tai Viet", + HB_SCRIPT_TAI_VIET, + HINTING_BOTTOM_TO_TOP, + "\xEA\xAA\x92 \xEA\xAA\xAB" ) /* ꪒ ꪫ */ + + /* there are no simple forms for letters; we thus use two digit shapes */ + SCRIPT( telu, TELU, + "Telugu", + HB_SCRIPT_TELUGU, + HINTING_BOTTOM_TO_TOP, + "\xE0\xB1\xA6 \xE0\xB1\xA7" ) /* ౦ ౧ */ + + SCRIPT( tfng, TFNG, + "Tifinagh", + HB_SCRIPT_TIFINAGH, + HINTING_BOTTOM_TO_TOP, + "\xE2\xB5\x94" ) /* ⵔ */ + + SCRIPT( thai, THAI, + "Thai", + HB_SCRIPT_THAI, + HINTING_BOTTOM_TO_TOP, + "\xE0\xB8\xB2 \xE0\xB9\x85 \xE0\xB9\x90" ) /* า ๅ ๐ */ + + SCRIPT( vaii, VAII, + "Vai", + HB_SCRIPT_VAI, + HINTING_BOTTOM_TO_TOP, + "\xEA\x98\x93 \xEA\x96\x9C \xEA\x96\xB4" ) /* ꘓ ꖜ ꖴ */ + +#ifdef AF_CONFIG_OPTION_INDIC + + SCRIPT( limb, LIMB, + "Limbu", + HB_SCRIPT_LIMBU, + HINTING_BOTTOM_TO_TOP, + "o" ) /* XXX */ + + SCRIPT( orya, ORYA, + "Oriya", + HB_SCRIPT_ORIYA, + HINTING_BOTTOM_TO_TOP, + "o" ) /* XXX */ + + SCRIPT( sylo, SYLO, + "Syloti Nagri", + HB_SCRIPT_SYLOTI_NAGRI, + HINTING_BOTTOM_TO_TOP, + "o" ) /* XXX */ + + SCRIPT( tibt, TIBT, + "Tibetan", + HB_SCRIPT_TIBETAN, + HINTING_BOTTOM_TO_TOP, + "o" ) /* XXX */ + +#endif /* AF_CONFIG_OPTION_INDIC */ + +#ifdef AF_CONFIG_OPTION_CJK + + SCRIPT( hani, HANI, + "CJKV ideographs", + HB_SCRIPT_HAN, + HINTING_BOTTOM_TO_TOP, + "\xE7\x94\xB0 \xE5\x9B\x97" ) /* 田 囗 */ + +#endif /* AF_CONFIG_OPTION_CJK */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afshaper.c b/vendor/FreeType2/src/autofit/afshaper.c new file mode 100644 index 0000000..f308281 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afshaper.c @@ -0,0 +1,683 @@ +/***************************************************************************/ +/* */ +/* afshaper.c */ +/* */ +/* HarfBuzz interface for accessing OpenType features (body). */ +/* */ +/* Copyright 2013-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_ADVANCES_H +#include "afglobal.h" +#include "aftypes.h" +#include "afshaper.h" + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + + + /*************************************************************************/ + /* */ + /* 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_afshaper + + + /* + * We use `sets' (in the HarfBuzz sense, which comes quite near to the + * usual mathematical meaning) to manage both lookups and glyph indices. + * + * 1. For each coverage, collect lookup IDs in a set. Note that an + * auto-hinter `coverage' is represented by one `feature', and a + * feature consists of an arbitrary number of (font specific) `lookup's + * that actually do the mapping job. Please check the OpenType + * specification for more details on features and lookups. + * + * 2. Create glyph ID sets from the corresponding lookup sets. + * + * 3. The glyph set corresponding to AF_COVERAGE_DEFAULT is computed + * with all lookups specific to the OpenType script activated. It + * relies on the order of AF_DEFINE_STYLE_CLASS entries so that + * special coverages (like `oldstyle figures') don't get overwritten. + * + */ + + + /* load coverage tags */ +#undef COVERAGE +#define COVERAGE( name, NAME, description, \ + tag1, tag2, tag3, tag4 ) \ + static const hb_tag_t name ## _coverage[] = \ + { \ + HB_TAG( tag1, tag2, tag3, tag4 ), \ + HB_TAG_NONE \ + }; + + +#include "afcover.h" + + + /* define mapping between coverage tags and AF_Coverage */ +#undef COVERAGE +#define COVERAGE( name, NAME, description, \ + tag1, tag2, tag3, tag4 ) \ + name ## _coverage, + + + static const hb_tag_t* coverages[] = + { +#include "afcover.h" + + NULL /* AF_COVERAGE_DEFAULT */ + }; + + + /* load HarfBuzz script tags */ +#undef SCRIPT +#define SCRIPT( s, S, d, h, H, ss ) h, + + + static const hb_script_t scripts[] = + { +#include "afscript.h" + }; + + + FT_Error + af_shaper_get_coverage( AF_FaceGlobals globals, + AF_StyleClass style_class, + FT_UShort* gstyles, + FT_Bool default_script ) + { + hb_face_t* face; + + hb_set_t* gsub_lookups = NULL; /* GSUB lookups for a given script */ + hb_set_t* gsub_glyphs = NULL; /* glyphs covered by GSUB lookups */ + hb_set_t* gpos_lookups = NULL; /* GPOS lookups for a given script */ + hb_set_t* gpos_glyphs = NULL; /* glyphs covered by GPOS lookups */ + + hb_script_t script; + const hb_tag_t* coverage_tags; + hb_tag_t script_tags[] = { HB_TAG_NONE, + HB_TAG_NONE, + HB_TAG_NONE, + HB_TAG_NONE }; + + hb_codepoint_t idx; +#ifdef FT_DEBUG_LEVEL_TRACE + int count; +#endif + + + if ( !globals || !style_class || !gstyles ) + return FT_THROW( Invalid_Argument ); + + face = hb_font_get_face( globals->hb_font ); + + coverage_tags = coverages[style_class->coverage]; + script = scripts[style_class->script]; + + /* Convert a HarfBuzz script tag into the corresponding OpenType */ + /* tag or tags -- some Indic scripts like Devanagari have an old */ + /* and a new set of features. */ + hb_ot_tags_from_script( script, + &script_tags[0], + &script_tags[1] ); + + /* `hb_ot_tags_from_script' usually returns HB_OT_TAG_DEFAULT_SCRIPT */ + /* as the second tag. We change that to HB_TAG_NONE except for the */ + /* default script. */ + if ( default_script ) + { + if ( script_tags[0] == HB_TAG_NONE ) + script_tags[0] = HB_OT_TAG_DEFAULT_SCRIPT; + else + { + if ( script_tags[1] == HB_TAG_NONE ) + script_tags[1] = HB_OT_TAG_DEFAULT_SCRIPT; + else if ( script_tags[1] != HB_OT_TAG_DEFAULT_SCRIPT ) + script_tags[2] = HB_OT_TAG_DEFAULT_SCRIPT; + } + } + else + { + /* we use non-standard tags like `khms' for special purposes; */ + /* HarfBuzz maps them to `DFLT', which we don't want to handle here */ + if ( script_tags[0] == HB_OT_TAG_DEFAULT_SCRIPT ) + goto Exit; + + if ( script_tags[1] == HB_OT_TAG_DEFAULT_SCRIPT ) + script_tags[1] = HB_TAG_NONE; + } + + gsub_lookups = hb_set_create(); + hb_ot_layout_collect_lookups( face, + HB_OT_TAG_GSUB, + script_tags, + NULL, + coverage_tags, + gsub_lookups ); + + if ( hb_set_is_empty( gsub_lookups ) ) + goto Exit; /* nothing to do */ + + FT_TRACE4(( "GSUB lookups (style `%s'):\n" + " ", + af_style_names[style_class->style] )); + +#ifdef FT_DEBUG_LEVEL_TRACE + count = 0; +#endif + + gsub_glyphs = hb_set_create(); + for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups, &idx ); ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " %d", idx )); + count++; +#endif + + /* get output coverage of GSUB feature */ + hb_ot_layout_lookup_collect_glyphs( face, + HB_OT_TAG_GSUB, + idx, + NULL, + NULL, + NULL, + gsub_glyphs ); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !count ) + FT_TRACE4(( " (none)" )); + FT_TRACE4(( "\n\n" )); +#endif + + FT_TRACE4(( "GPOS lookups (style `%s'):\n" + " ", + af_style_names[style_class->style] )); + + gpos_lookups = hb_set_create(); + hb_ot_layout_collect_lookups( face, + HB_OT_TAG_GPOS, + script_tags, + NULL, + coverage_tags, + gpos_lookups ); + +#ifdef FT_DEBUG_LEVEL_TRACE + count = 0; +#endif + + gpos_glyphs = hb_set_create(); + for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gpos_lookups, &idx ); ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " %d", idx )); + count++; +#endif + + /* get input coverage of GPOS feature */ + hb_ot_layout_lookup_collect_glyphs( face, + HB_OT_TAG_GPOS, + idx, + NULL, + gpos_glyphs, + NULL, + NULL ); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !count ) + FT_TRACE4(( " (none)" )); + FT_TRACE4(( "\n\n" )); +#endif + + /* + * We now check whether we can construct blue zones, using glyphs + * covered by the feature only. In case there is not a single zone + * (this is, not a single character is covered), we skip this coverage. + * + */ + if ( style_class->coverage != AF_COVERAGE_DEFAULT ) + { + AF_Blue_Stringset bss = style_class->blue_stringset; + const AF_Blue_StringRec* bs = &af_blue_stringsets[bss]; + + FT_Bool found = 0; + + + for ( ; bs->string != AF_BLUE_STRING_MAX; bs++ ) + { + const char* p = &af_blue_strings[bs->string]; + + + while ( *p ) + { + hb_codepoint_t ch; + + + GET_UTF8_CHAR( ch, p ); + + for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_lookups, + &idx ); ) + { + hb_codepoint_t gidx = FT_Get_Char_Index( globals->face, ch ); + + + if ( hb_ot_layout_lookup_would_substitute( face, idx, + &gidx, 1, 1 ) ) + { + found = 1; + break; + } + } + } + } + + if ( !found ) + { + FT_TRACE4(( " no blue characters found; style skipped\n" )); + goto Exit; + } + } + + /* + * Various OpenType features might use the same glyphs at different + * vertical positions; for example, superscript and subscript glyphs + * could be the same. However, the auto-hinter is completely + * agnostic of OpenType features after the feature analysis has been + * completed: The engine then simply receives a glyph index and returns a + * hinted and usually rendered glyph. + * + * Consider the superscript feature of font `pala.ttf': Some of the + * glyphs are `real', this is, they have a zero vertical offset, but + * most of them are small caps glyphs shifted up to the superscript + * position (this is, the `sups' feature is present in both the GSUB and + * GPOS tables). The code for blue zones computation actually uses a + * feature's y offset so that the `real' glyphs get correct hints. But + * later on it is impossible to decide whether a glyph index belongs to, + * say, the small caps or superscript feature. + * + * For this reason, we don't assign a style to a glyph if the current + * feature covers the glyph in both the GSUB and the GPOS tables. This + * is quite a broad condition, assuming that + * + * (a) glyphs that get used in multiple features are present in a + * feature without vertical shift, + * + * and + * + * (b) a feature's GPOS data really moves the glyph vertically. + * + * Not fulfilling condition (a) makes a font larger; it would also + * reduce the number of glyphs that could be addressed directly without + * using OpenType features, so this assumption is rather strong. + * + * Condition (b) is much weaker, and there might be glyphs which get + * missed. However, the OpenType features we are going to handle are + * primarily located in GSUB, and HarfBuzz doesn't provide an API to + * directly get the necessary information from the GPOS table. A + * possible solution might be to directly parse the GPOS table to find + * out whether a glyph gets shifted vertically, but this is something I + * would like to avoid if not really necessary. + * + * Note that we don't follow this logic for the default coverage. + * Complex scripts like Devanagari have mandatory GPOS features to + * position many glyph elements, using mark-to-base or mark-to-ligature + * tables; the number of glyphs missed due to condition (b) would be far + * too large. + * + */ + if ( style_class->coverage != AF_COVERAGE_DEFAULT ) + hb_set_subtract( gsub_glyphs, gpos_glyphs ); + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " glyphs without GPOS data (`*' means already assigned)" )); + count = 0; +#endif + + for ( idx = HB_SET_VALUE_INVALID; hb_set_next( gsub_glyphs, &idx ); ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !( count % 10 ) ) + FT_TRACE4(( "\n" + " " )); + + FT_TRACE4(( " %d", idx )); + count++; +#endif + + /* glyph indices returned by `hb_ot_layout_lookup_collect_glyphs' */ + /* can be arbitrary: some fonts use fake indices for processing */ + /* internal to GSUB or GPOS, which is fully valid */ + if ( idx >= (hb_codepoint_t)globals->glyph_count ) + continue; + + if ( gstyles[idx] == AF_STYLE_UNASSIGNED ) + gstyles[idx] = (FT_UShort)style_class->style; +#ifdef FT_DEBUG_LEVEL_TRACE + else + FT_TRACE4(( "*" )); +#endif + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !count ) + FT_TRACE4(( "\n" + " (none)" )); + FT_TRACE4(( "\n\n" )); +#endif + + Exit: + hb_set_destroy( gsub_lookups ); + hb_set_destroy( gsub_glyphs ); + hb_set_destroy( gpos_lookups ); + hb_set_destroy( gpos_glyphs ); + + return FT_Err_Ok; + } + + + /* construct HarfBuzz features */ +#undef COVERAGE +#define COVERAGE( name, NAME, description, \ + tag1, tag2, tag3, tag4 ) \ + static const hb_feature_t name ## _feature[] = \ + { \ + { \ + HB_TAG( tag1, tag2, tag3, tag4 ), \ + 1, 0, (unsigned int)-1 \ + } \ + }; + + +#include "afcover.h" + + + /* define mapping between HarfBuzz features and AF_Coverage */ +#undef COVERAGE +#define COVERAGE( name, NAME, description, \ + tag1, tag2, tag3, tag4 ) \ + name ## _feature, + + + static const hb_feature_t* features[] = + { +#include "afcover.h" + + NULL /* AF_COVERAGE_DEFAULT */ + }; + + + void* + af_shaper_buf_create( FT_Face face ) + { + FT_UNUSED( face ); + + return (void*)hb_buffer_create(); + } + + + void + af_shaper_buf_destroy( FT_Face face, + void* buf ) + { + FT_UNUSED( face ); + + hb_buffer_destroy( (hb_buffer_t*)buf ); + } + + + const char* + af_shaper_get_cluster( const char* p, + AF_StyleMetrics metrics, + void* buf_, + unsigned int* count ) + { + AF_StyleClass style_class; + const hb_feature_t* feature; + FT_Int upem; + const char* q; + int len; + + hb_buffer_t* buf = (hb_buffer_t*)buf_; + hb_font_t* font; + hb_codepoint_t dummy; + + + upem = (FT_Int)metrics->globals->face->units_per_EM; + style_class = metrics->style_class; + feature = features[style_class->coverage]; + + font = metrics->globals->hb_font; + + /* we shape at a size of units per EM; this means font units */ + hb_font_set_scale( font, upem, upem ); + + while ( *p == ' ' ) + p++; + + /* count bytes up to next space (or end of buffer) */ + q = p; + while ( !( *q == ' ' || *q == '\0' ) ) + GET_UTF8_CHAR( dummy, q ); + len = (int)( q - p ); + + /* feed character(s) to the HarfBuzz buffer */ + hb_buffer_clear_contents( buf ); + hb_buffer_add_utf8( buf, p, len, 0, len ); + + /* we let HarfBuzz guess the script and writing direction */ + hb_buffer_guess_segment_properties( buf ); + + /* shape buffer, which means conversion from character codes to */ + /* glyph indices, possibly applying a feature */ + hb_shape( font, buf, feature, feature ? 1 : 0 ); + + if ( feature ) + { + hb_buffer_t* hb_buf = metrics->globals->hb_buf; + + unsigned int gcount; + hb_glyph_info_t* ginfo; + + unsigned int hb_gcount; + hb_glyph_info_t* hb_ginfo; + + + /* we have to check whether applying a feature does actually change */ + /* glyph indices; otherwise the affected glyph or glyphs aren't */ + /* available at all in the feature */ + + hb_buffer_clear_contents( hb_buf ); + hb_buffer_add_utf8( hb_buf, p, len, 0, len ); + hb_buffer_guess_segment_properties( hb_buf ); + hb_shape( font, hb_buf, NULL, 0 ); + + ginfo = hb_buffer_get_glyph_infos( buf, &gcount ); + hb_ginfo = hb_buffer_get_glyph_infos( hb_buf, &hb_gcount ); + + if ( gcount == hb_gcount ) + { + unsigned int i; + + + for (i = 0; i < gcount; i++ ) + if ( ginfo[i].codepoint != hb_ginfo[i].codepoint ) + break; + + if ( i == gcount ) + { + /* both buffers have identical glyph indices */ + hb_buffer_clear_contents( buf ); + } + } + } + + *count = hb_buffer_get_length( buf ); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( feature && *count > 1 ) + FT_TRACE1(( "af_shaper_get_cluster:" + " input character mapped to multiple glyphs\n" )); +#endif + + return q; + } + + + FT_ULong + af_shaper_get_elem( AF_StyleMetrics metrics, + void* buf_, + unsigned int idx, + FT_Long* advance, + FT_Long* y_offset ) + { + hb_buffer_t* buf = (hb_buffer_t*)buf_; + hb_glyph_info_t* ginfo; + hb_glyph_position_t* gpos; + unsigned int gcount; + + FT_UNUSED( metrics ); + + + ginfo = hb_buffer_get_glyph_infos( buf, &gcount ); + gpos = hb_buffer_get_glyph_positions( buf, &gcount ); + + if ( idx >= gcount ) + return 0; + + if ( advance ) + *advance = gpos[idx].x_advance; + if ( y_offset ) + *y_offset = gpos[idx].y_offset; + + return ginfo[idx].codepoint; + } + + +#else /* !FT_CONFIG_OPTION_USE_HARFBUZZ */ + + + FT_Error + af_shaper_get_coverage( AF_FaceGlobals globals, + AF_StyleClass style_class, + FT_UShort* gstyles, + FT_Bool default_script ) + { + FT_UNUSED( globals ); + FT_UNUSED( style_class ); + FT_UNUSED( gstyles ); + FT_UNUSED( default_script ); + + return FT_Err_Ok; + } + + + void* + af_shaper_buf_create( FT_Face face ) + { + FT_Error error; + FT_Memory memory = face->memory; + FT_ULong* buf; + + + FT_MEM_ALLOC( buf, sizeof ( FT_ULong ) ); + + return (void*)buf; + } + + + void + af_shaper_buf_destroy( FT_Face face, + void* buf ) + { + FT_Memory memory = face->memory; + + + FT_FREE( buf ); + } + + + const char* + af_shaper_get_cluster( const char* p, + AF_StyleMetrics metrics, + void* buf_, + unsigned int* count ) + { + FT_Face face = metrics->globals->face; + FT_ULong ch, dummy = 0; + FT_ULong* buf = (FT_ULong*)buf_; + + + while ( *p == ' ' ) + p++; + + GET_UTF8_CHAR( ch, p ); + + /* since we don't have an engine to handle clusters, */ + /* we scan the characters but return zero */ + while ( !( *p == ' ' || *p == '\0' ) ) + GET_UTF8_CHAR( dummy, p ); + + if ( dummy ) + { + *buf = 0; + *count = 0; + } + else + { + *buf = FT_Get_Char_Index( face, ch ); + *count = 1; + } + + return p; + } + + + FT_ULong + af_shaper_get_elem( AF_StyleMetrics metrics, + void* buf_, + unsigned int idx, + FT_Long* advance, + FT_Long* y_offset ) + { + FT_Face face = metrics->globals->face; + FT_ULong glyph_index = *(FT_ULong*)buf_; + + FT_UNUSED( idx ); + + + if ( advance ) + FT_Get_Advance( face, + glyph_index, + FT_LOAD_NO_SCALE | + FT_LOAD_NO_HINTING | + FT_LOAD_IGNORE_TRANSFORM, + advance ); + + if ( y_offset ) + *y_offset = 0; + + return glyph_index; + } + + +#endif /* !FT_CONFIG_OPTION_USE_HARFBUZZ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afshaper.h b/vendor/FreeType2/src/autofit/afshaper.h new file mode 100644 index 0000000..7efd9f6 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afshaper.h @@ -0,0 +1,72 @@ +/***************************************************************************/ +/* */ +/* afshaper.h */ +/* */ +/* HarfBuzz interface for accessing OpenType features (specification). */ +/* */ +/* Copyright 2013-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AFSHAPER_H_ +#define AFSHAPER_H_ + + +#include +#include FT_FREETYPE_H + + +#ifdef FT_CONFIG_OPTION_USE_HARFBUZZ + +#include +#include +#include + +#endif + + +FT_BEGIN_HEADER + + FT_Error + af_shaper_get_coverage( AF_FaceGlobals globals, + AF_StyleClass style_class, + FT_UShort* gstyles, + FT_Bool default_script ); + + + void* + af_shaper_buf_create( FT_Face face ); + + void + af_shaper_buf_destroy( FT_Face face, + void* buf ); + + const char* + af_shaper_get_cluster( const char* p, + AF_StyleMetrics metrics, + void* buf_, + unsigned int* count ); + + FT_ULong + af_shaper_get_elem( AF_StyleMetrics metrics, + void* buf_, + unsigned int idx, + FT_Long* x_advance, + FT_Long* y_offset ); + + /* */ + +FT_END_HEADER + +#endif /* AFSHAPER_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afstyles.h b/vendor/FreeType2/src/autofit/afstyles.h new file mode 100644 index 0000000..e2688b3 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afstyles.h @@ -0,0 +1,475 @@ +/***************************************************************************/ +/* */ +/* afstyles.h */ +/* */ +/* Auto-fitter styles (specification only). */ +/* */ +/* Copyright 2013-2018 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. */ +/* */ +/***************************************************************************/ + + + /* The following part can be included multiple times. */ + /* Define `STYLE' as needed. */ + + + /* Add new styles here. The first and second arguments are the */ + /* style name in lowercase and uppercase, respectively, followed */ + /* by a description string. The next arguments are the */ + /* corresponding writing system, script, blue stringset, and */ + /* coverage. */ + /* */ + /* Note that styles using `AF_COVERAGE_DEFAULT' should always */ + /* come after styles with other coverages. Also note that */ + /* fallback scripts only use `AF_COVERAGE_DEFAULT' for its */ + /* style. */ + /* */ + /* Example: */ + /* */ + /* STYLE( cyrl_dflt, CYRL_DFLT, */ + /* "Cyrillic default style", */ + /* AF_WRITING_SYSTEM_LATIN, */ + /* AF_SCRIPT_CYRL, */ + /* AF_BLUE_STRINGSET_CYRL, */ + /* AF_COVERAGE_DEFAULT ) */ + +#undef STYLE_LATIN +#define STYLE_LATIN( s, S, f, F, ds, df, C ) \ + STYLE( s ## _ ## f, S ## _ ## F, \ + ds " " df " style", \ + AF_WRITING_SYSTEM_LATIN, \ + AF_SCRIPT_ ## S, \ + AF_BLUE_STRINGSET_ ## S, \ + AF_COVERAGE_ ## C ) + +#undef META_STYLE_LATIN +#define META_STYLE_LATIN( s, S, ds ) \ + STYLE_LATIN( s, S, c2cp, C2CP, ds, \ + "petite capitals from capitals", \ + PETITE_CAPITALS_FROM_CAPITALS ) \ + STYLE_LATIN( s, S, c2sc, C2SC, ds, \ + "small capitals from capitals", \ + SMALL_CAPITALS_FROM_CAPITALS ) \ + STYLE_LATIN( s, S, ordn, ORDN, ds, \ + "ordinals", \ + ORDINALS ) \ + STYLE_LATIN( s, S, pcap, PCAP, ds, \ + "petite capitals", \ + PETITE_CAPITALS ) \ + STYLE_LATIN( s, S, sinf, SINF, ds, \ + "scientific inferiors", \ + SCIENTIFIC_INFERIORS ) \ + STYLE_LATIN( s, S, smcp, SMCP, ds, \ + "small capitals", \ + SMALL_CAPITALS ) \ + STYLE_LATIN( s, S, subs, SUBS, ds, \ + "subscript", \ + SUBSCRIPT ) \ + STYLE_LATIN( s, S, sups, SUPS, ds, \ + "superscript", \ + SUPERSCRIPT ) \ + STYLE_LATIN( s, S, titl, TITL, ds, \ + "titling", \ + TITLING ) \ + STYLE_LATIN( s, S, dflt, DFLT, ds, \ + "default", \ + DEFAULT ) + + + STYLE( adlm_dflt, ADLM_DFLT, + "Adlam default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_ADLM, + AF_BLUE_STRINGSET_ADLM, + AF_COVERAGE_DEFAULT ) + + STYLE( arab_dflt, ARAB_DFLT, + "Arabic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_ARAB, + AF_BLUE_STRINGSET_ARAB, + AF_COVERAGE_DEFAULT ) + + STYLE( armn_dflt, ARMN_DFLT, + "Armenian default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_ARMN, + AF_BLUE_STRINGSET_ARMN, + AF_COVERAGE_DEFAULT ) + + STYLE( avst_dflt, AVST_DFLT, + "Avestan default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_AVST, + AF_BLUE_STRINGSET_AVST, + AF_COVERAGE_DEFAULT ) + + STYLE( bamu_dflt, BAMU_DFLT, + "Bamum default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_BAMU, + AF_BLUE_STRINGSET_BAMU, + AF_COVERAGE_DEFAULT ) + + STYLE( beng_dflt, BENG_DFLT, + "Bengali default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_BENG, + AF_BLUE_STRINGSET_BENG, + AF_COVERAGE_DEFAULT ) + + STYLE( buhd_dflt, BUHD_DFLT, + "Buhid default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_BUHD, + AF_BLUE_STRINGSET_BUHD, + AF_COVERAGE_DEFAULT ) + + STYLE( cakm_dflt, CAKM_DFLT, + "Chakma default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_CAKM, + AF_BLUE_STRINGSET_CAKM, + AF_COVERAGE_DEFAULT ) + + STYLE( cans_dflt, CANS_DFLT, + "Canadian Syllabics default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_CANS, + AF_BLUE_STRINGSET_CANS, + AF_COVERAGE_DEFAULT ) + + STYLE( cari_dflt, CARI_DFLT, + "Carian default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_CARI, + AF_BLUE_STRINGSET_CARI, + AF_COVERAGE_DEFAULT ) + + STYLE( cher_dflt, CHER_DFLT, + "Cherokee default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_CHER, + AF_BLUE_STRINGSET_CHER, + AF_COVERAGE_DEFAULT ) + + STYLE( copt_dflt, COPT_DFLT, + "Coptic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_COPT, + AF_BLUE_STRINGSET_COPT, + AF_COVERAGE_DEFAULT ) + + STYLE( cprt_dflt, CPRT_DFLT, + "Cypriot default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_CPRT, + AF_BLUE_STRINGSET_CPRT, + AF_COVERAGE_DEFAULT ) + + META_STYLE_LATIN( cyrl, CYRL, "Cyrillic" ) + + STYLE( deva_dflt, DEVA_DFLT, + "Devanagari default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_DEVA, + AF_BLUE_STRINGSET_DEVA, + AF_COVERAGE_DEFAULT ) + + STYLE( dsrt_dflt, DSRT_DFLT, + "Deseret default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_DSRT, + AF_BLUE_STRINGSET_DSRT, + AF_COVERAGE_DEFAULT ) + + STYLE( ethi_dflt, ETHI_DFLT, + "Ethiopic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_ETHI, + AF_BLUE_STRINGSET_ETHI, + AF_COVERAGE_DEFAULT ) + + STYLE( geor_dflt, GEOR_DFLT, + "Georgian (Mkhedruli) default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_GEOR, + AF_BLUE_STRINGSET_GEOR, + AF_COVERAGE_DEFAULT ) + + STYLE( geok_dflt, GEOK_DFLT, + "Georgian (Khutsuri) default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_GEOK, + AF_BLUE_STRINGSET_GEOK, + AF_COVERAGE_DEFAULT ) + + STYLE( glag_dflt, GLAG_DFLT, + "Glagolitic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_GLAG, + AF_BLUE_STRINGSET_GLAG, + AF_COVERAGE_DEFAULT ) + + STYLE( goth_dflt, GOTH_DFLT, + "Gothic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_GOTH, + AF_BLUE_STRINGSET_GOTH, + AF_COVERAGE_DEFAULT ) + + META_STYLE_LATIN( grek, GREK, "Greek" ) + + STYLE( gujr_dflt, GUJR_DFLT, + "Gujarati default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_GUJR, + AF_BLUE_STRINGSET_GUJR, + AF_COVERAGE_DEFAULT ) + + STYLE( guru_dflt, GURU_DFLT, + "Gurmukhi default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_GURU, + AF_BLUE_STRINGSET_GURU, + AF_COVERAGE_DEFAULT ) + + STYLE( hebr_dflt, HEBR_DFLT, + "Hebrew default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_HEBR, + AF_BLUE_STRINGSET_HEBR, + AF_COVERAGE_DEFAULT ) + + STYLE( kali_dflt, KALI_DFLT, + "Kayah Li default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_KALI, + AF_BLUE_STRINGSET_KALI, + AF_COVERAGE_DEFAULT ) + + STYLE( khmr_dflt, KHMR_DFLT, + "Khmer default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_KHMR, + AF_BLUE_STRINGSET_KHMR, + AF_COVERAGE_DEFAULT ) + + STYLE( khms_dflt, KHMS_DFLT, + "Khmer Symbols default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_KHMS, + AF_BLUE_STRINGSET_KHMS, + AF_COVERAGE_DEFAULT ) + + STYLE( knda_dflt, KNDA_DFLT, + "Kannada default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_KNDA, + AF_BLUE_STRINGSET_KNDA, + AF_COVERAGE_DEFAULT ) + + STYLE( lao_dflt, LAO_DFLT, + "Lao default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_LAO, + AF_BLUE_STRINGSET_LAO, + AF_COVERAGE_DEFAULT ) + + META_STYLE_LATIN( latn, LATN, "Latin" ) + + STYLE( latb_dflt, LATB_DFLT, + "Latin subscript fallback default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_LATB, + AF_BLUE_STRINGSET_LATB, + AF_COVERAGE_DEFAULT ) + + STYLE( latp_dflt, LATP_DFLT, + "Latin superscript fallback default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_LATP, + AF_BLUE_STRINGSET_LATP, + AF_COVERAGE_DEFAULT ) + +#ifdef FT_OPTION_AUTOFIT2 + STYLE( ltn2_dflt, LTN2_DFLT, + "Latin 2 default style", + AF_WRITING_SYSTEM_LATIN2, + AF_SCRIPT_LATN, + AF_BLUE_STRINGSET_LATN, + AF_COVERAGE_DEFAULT ) +#endif + + STYLE( lisu_dflt, LISU_DFLT, + "Lisu default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_LISU, + AF_BLUE_STRINGSET_LISU, + AF_COVERAGE_DEFAULT ) + + STYLE( mlym_dflt, MLYM_DFLT, + "Malayalam default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_MLYM, + AF_BLUE_STRINGSET_MLYM, + AF_COVERAGE_DEFAULT ) + + STYLE( mymr_dflt, MYMR_DFLT, + "Myanmar default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_MYMR, + AF_BLUE_STRINGSET_MYMR, + AF_COVERAGE_DEFAULT ) + + STYLE( nkoo_dflt, NKOO_DFLT, + "N'Ko default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_NKOO, + AF_BLUE_STRINGSET_NKOO, + AF_COVERAGE_DEFAULT ) + + STYLE( none_dflt, NONE_DFLT, + "no style", + AF_WRITING_SYSTEM_DUMMY, + AF_SCRIPT_NONE, + AF_BLUE_STRINGSET_NONE, + AF_COVERAGE_DEFAULT ) + + STYLE( olck_dflt, OLCK_DFLT, + "Ol Chiki default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_OLCK, + AF_BLUE_STRINGSET_OLCK, + AF_COVERAGE_DEFAULT ) + + STYLE( orkh_dflt, ORKH_DFLT, + "Old Turkic default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_ORKH, + AF_BLUE_STRINGSET_ORKH, + AF_COVERAGE_DEFAULT ) + + STYLE( osge_dflt, OSGE_DFLT, + "Osage default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_OSGE, + AF_BLUE_STRINGSET_OSGE, + AF_COVERAGE_DEFAULT ) + + STYLE( osma_dflt, OSMA_DFLT, + "Osmanya default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_OSMA, + AF_BLUE_STRINGSET_OSMA, + AF_COVERAGE_DEFAULT ) + + STYLE( saur_dflt, SAUR_DFLT, + "Saurashtra default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_SAUR, + AF_BLUE_STRINGSET_SAUR, + AF_COVERAGE_DEFAULT ) + + STYLE( shaw_dflt, SHAW_DFLT, + "Shavian default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_SHAW, + AF_BLUE_STRINGSET_SHAW, + AF_COVERAGE_DEFAULT ) + + STYLE( sinh_dflt, SINH_DFLT, + "Sinhala default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_SINH, + AF_BLUE_STRINGSET_SINH, + AF_COVERAGE_DEFAULT ) + + STYLE( sund_dflt, SUND_DFLT, + "Sundanese default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_SUND, + AF_BLUE_STRINGSET_SUND, + AF_COVERAGE_DEFAULT ) + + STYLE( taml_dflt, TAML_DFLT, + "Tamil default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_TAML, + AF_BLUE_STRINGSET_TAML, + AF_COVERAGE_DEFAULT ) + + STYLE( tavt_dflt, TAVT_DFLT, + "Tai Viet default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_TAVT, + AF_BLUE_STRINGSET_TAVT, + AF_COVERAGE_DEFAULT ) + + STYLE( telu_dflt, TELU_DFLT, + "Telugu default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_TELU, + AF_BLUE_STRINGSET_TELU, + AF_COVERAGE_DEFAULT ) + + STYLE( tfng_dflt, TFNG_DFLT, + "Tifinagh default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_TFNG, + AF_BLUE_STRINGSET_TFNG, + AF_COVERAGE_DEFAULT ) + + STYLE( thai_dflt, THAI_DFLT, + "Thai default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_THAI, + AF_BLUE_STRINGSET_THAI, + AF_COVERAGE_DEFAULT ) + + STYLE( vaii_dflt, VAII_DFLT, + "Vai default style", + AF_WRITING_SYSTEM_LATIN, + AF_SCRIPT_VAII, + AF_BLUE_STRINGSET_VAII, + AF_COVERAGE_DEFAULT ) + +#ifdef AF_CONFIG_OPTION_INDIC + + /* no blue stringset support for the Indic writing system yet */ +#undef STYLE_DEFAULT_INDIC +#define STYLE_DEFAULT_INDIC( s, S, d ) \ + STYLE( s ## _dflt, S ## _DFLT, \ + d " default style", \ + AF_WRITING_SYSTEM_INDIC, \ + AF_SCRIPT_ ## S, \ + (AF_Blue_Stringset)0, \ + AF_COVERAGE_DEFAULT ) + + STYLE_DEFAULT_INDIC( limb, LIMB, "Limbu" ) + STYLE_DEFAULT_INDIC( orya, ORYA, "Oriya" ) + STYLE_DEFAULT_INDIC( sylo, SYLO, "Syloti Nagri" ) + STYLE_DEFAULT_INDIC( tibt, TIBT, "Tibetan" ) + +#endif /* AF_CONFIG_OPTION_INDIC */ + +#ifdef AF_CONFIG_OPTION_CJK + + STYLE( hani_dflt, HANI_DFLT, + "CJKV ideographs default style", + AF_WRITING_SYSTEM_CJK, + AF_SCRIPT_HANI, + AF_BLUE_STRINGSET_HANI, + AF_COVERAGE_DEFAULT ) + +#endif /* AF_CONFIG_OPTION_CJK */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/aftypes.h b/vendor/FreeType2/src/autofit/aftypes.h new file mode 100644 index 0000000..6bd8c89 --- /dev/null +++ b/vendor/FreeType2/src/autofit/aftypes.h @@ -0,0 +1,651 @@ +/***************************************************************************/ +/* */ +/* aftypes.h */ +/* */ +/* Auto-fitter types (specification only). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + + /************************************************************************* + * + * The auto-fitter is a complete rewrite of the old auto-hinter. + * Its main feature is the ability to differentiate between different + * writing systems and scripts in order to apply specific rules. + * + * The code has also been compartmentalized into several entities that + * should make algorithmic experimentation easier than with the old + * code. + * + *************************************************************************/ + + +#ifndef AFTYPES_H_ +#define AFTYPES_H_ + +#include + +#include FT_FREETYPE_H +#include FT_OUTLINE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H + +#include "afblue.h" + +#ifdef FT_DEBUG_AUTOFIT +#include FT_CONFIG_STANDARD_LIBRARY_H +#endif + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** D E B U G G I N G *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#ifdef FT_DEBUG_AUTOFIT + +extern int _af_debug_disable_horz_hints; +extern int _af_debug_disable_vert_hints; +extern int _af_debug_disable_blue_hints; +extern void* _af_debug_hints; + +#endif /* FT_DEBUG_AUTOFIT */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** U T I L I T Y S T U F F *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AF_WidthRec_ + { + FT_Pos org; /* original position/width in font units */ + FT_Pos cur; /* current/scaled position/width in device subpixels */ + FT_Pos fit; /* current/fitted position/width in device subpixels */ + + } AF_WidthRec, *AF_Width; + + + FT_LOCAL( void ) + af_sort_pos( FT_UInt count, + FT_Pos* table ); + + FT_LOCAL( void ) + af_sort_and_quantize_widths( FT_UInt* count, + AF_Width widths, + FT_Pos threshold ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** A N G L E T Y P E S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The auto-fitter doesn't need a very high angular accuracy; + * this allows us to speed up some computations considerably with a + * light Cordic algorithm (see afangles.c). + */ + + typedef FT_Int AF_Angle; + + +#define AF_ANGLE_PI 256 +#define AF_ANGLE_2PI ( AF_ANGLE_PI * 2 ) +#define AF_ANGLE_PI2 ( AF_ANGLE_PI / 2 ) +#define AF_ANGLE_PI4 ( AF_ANGLE_PI / 4 ) + + +#if 0 + /* + * compute the angle of a given 2-D vector + */ + FT_LOCAL( AF_Angle ) + af_angle_atan( FT_Pos dx, + FT_Pos dy ); + + + /* + * compute `angle2 - angle1'; the result is always within + * the range [-AF_ANGLE_PI .. AF_ANGLE_PI - 1] + */ + FT_LOCAL( AF_Angle ) + af_angle_diff( AF_Angle angle1, + AF_Angle angle2 ); +#endif /* 0 */ + + +#define AF_ANGLE_DIFF( result, angle1, angle2 ) \ + FT_BEGIN_STMNT \ + AF_Angle _delta = (angle2) - (angle1); \ + \ + \ + while ( _delta <= -AF_ANGLE_PI ) \ + _delta += AF_ANGLE_2PI; \ + \ + while ( _delta > AF_ANGLE_PI ) \ + _delta -= AF_ANGLE_2PI; \ + \ + result = _delta; \ + FT_END_STMNT + + + /* opaque handle to glyph-specific hints -- see `afhints.h' for more + * details + */ + typedef struct AF_GlyphHintsRec_* AF_GlyphHints; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S C A L E R S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * A scaler models the target pixel device that will receive the + * auto-hinted glyph image. + */ + +#define AF_SCALER_FLAG_NO_HORIZONTAL 1U /* disable horizontal hinting */ +#define AF_SCALER_FLAG_NO_VERTICAL 2U /* disable vertical hinting */ +#define AF_SCALER_FLAG_NO_ADVANCE 4U /* disable advance hinting */ +#define AF_SCALER_FLAG_NO_WARPER 8U /* disable warper */ + + + typedef struct AF_ScalerRec_ + { + FT_Face face; /* source font face */ + FT_Fixed x_scale; /* from font units to 1/64th device pixels */ + FT_Fixed y_scale; /* from font units to 1/64th device pixels */ + FT_Pos x_delta; /* in 1/64th device pixels */ + FT_Pos y_delta; /* in 1/64th device pixels */ + FT_Render_Mode render_mode; /* monochrome, anti-aliased, LCD, etc. */ + FT_UInt32 flags; /* additional control flags, see above */ + + } AF_ScalerRec, *AF_Scaler; + + +#define AF_SCALER_EQUAL_SCALES( a, b ) \ + ( (a)->x_scale == (b)->x_scale && \ + (a)->y_scale == (b)->y_scale && \ + (a)->x_delta == (b)->x_delta && \ + (a)->y_delta == (b)->y_delta ) + + + typedef struct AF_StyleMetricsRec_* AF_StyleMetrics; + + /* This function parses an FT_Face to compute global metrics for + * a specific style. + */ + typedef FT_Error + (*AF_WritingSystem_InitMetricsFunc)( AF_StyleMetrics metrics, + FT_Face face ); + + typedef void + (*AF_WritingSystem_ScaleMetricsFunc)( AF_StyleMetrics metrics, + AF_Scaler scaler ); + + typedef void + (*AF_WritingSystem_DoneMetricsFunc)( AF_StyleMetrics metrics ); + + typedef void + (*AF_WritingSystem_GetStdWidthsFunc)( AF_StyleMetrics metrics, + FT_Pos* stdHW, + FT_Pos* stdVW ); + + + typedef FT_Error + (*AF_WritingSystem_InitHintsFunc)( AF_GlyphHints hints, + AF_StyleMetrics metrics ); + + typedef FT_Error + (*AF_WritingSystem_ApplyHintsFunc)( FT_UInt glyph_index, + AF_GlyphHints hints, + FT_Outline* outline, + AF_StyleMetrics metrics ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** W R I T I N G S Y S T E M S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * For the auto-hinter, a writing system consists of multiple scripts that + * can be handled similarly *in a typographical way*; the relationship is + * not based on history. For example, both the Greek and the unrelated + * Armenian scripts share the same features like ascender, descender, + * x-height, etc. Essentially, a writing system is covered by a + * submodule of the auto-fitter; it contains + * + * - a specific global analyzer that computes global metrics specific to + * the script (based on script-specific characters to identify ascender + * height, x-height, etc.), + * + * - a specific glyph analyzer that computes segments and edges for each + * glyph covered by the script, + * + * - a specific grid-fitting algorithm that distorts the scaled glyph + * outline according to the results of the glyph analyzer. + */ + +#define AFWRTSYS_H_ /* don't load header files */ +#undef WRITING_SYSTEM +#define WRITING_SYSTEM( ws, WS ) \ + AF_WRITING_SYSTEM_ ## WS, + + /* The list of known writing systems. */ + typedef enum AF_WritingSystem_ + { + +#include "afwrtsys.h" + + AF_WRITING_SYSTEM_MAX /* do not remove */ + + } AF_WritingSystem; + +#undef AFWRTSYS_H_ + + + typedef struct AF_WritingSystemClassRec_ + { + AF_WritingSystem writing_system; + + FT_Offset style_metrics_size; + AF_WritingSystem_InitMetricsFunc style_metrics_init; + AF_WritingSystem_ScaleMetricsFunc style_metrics_scale; + AF_WritingSystem_DoneMetricsFunc style_metrics_done; + AF_WritingSystem_GetStdWidthsFunc style_metrics_getstdw; + + AF_WritingSystem_InitHintsFunc style_hints_init; + AF_WritingSystem_ApplyHintsFunc style_hints_apply; + + } AF_WritingSystemClassRec; + + typedef const AF_WritingSystemClassRec* AF_WritingSystemClass; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S C R I P T S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * Each script is associated with two sets of Unicode ranges to test + * whether the font face supports the script, and which non-base + * characters the script contains. + * + * We use four-letter script tags from the OpenType specification, + * extended by `NONE', which indicates `no script'. + */ + +#undef SCRIPT +#define SCRIPT( s, S, d, h, H, ss ) \ + AF_SCRIPT_ ## S, + + /* The list of known scripts. */ + typedef enum AF_Script_ + { + +#include "afscript.h" + + AF_SCRIPT_MAX /* do not remove */ + + } AF_Script; + + + typedef struct AF_Script_UniRangeRec_ + { + FT_UInt32 first; + FT_UInt32 last; + + } AF_Script_UniRangeRec; + +#define AF_UNIRANGE_REC( a, b ) { (FT_UInt32)(a), (FT_UInt32)(b) } + + typedef const AF_Script_UniRangeRec* AF_Script_UniRange; + + + typedef struct AF_ScriptClassRec_ + { + AF_Script script; + + /* last element in the ranges must be { 0, 0 } */ + AF_Script_UniRange script_uni_ranges; + AF_Script_UniRange script_uni_nonbase_ranges; + + FT_Bool top_to_bottom_hinting; + + const char* standard_charstring; /* for default width and height */ + + } AF_ScriptClassRec; + + typedef const AF_ScriptClassRec* AF_ScriptClass; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** C O V E R A G E S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * Usually, a font contains more glyphs than can be addressed by its + * character map. + * + * In the PostScript font world, encoding vectors specific to a given + * task are used to select such glyphs, and these glyphs can be often + * recognized by having a suffix in its glyph names. For example, a + * superscript glyph `A' might be called `A.sup'. Unfortunately, this + * naming scheme is not standardized and thus unusable for us. + * + * In the OpenType world, a better solution was invented, namely + * `features', which cleanly separate a character's input encoding from + * the corresponding glyph's appearance, and which don't use glyph names + * at all. For our purposes, and slightly generalized, an OpenType + * feature is a name of a mapping that maps character codes to + * non-standard glyph indices (features get used for other things also). + * For example, the `sups' feature provides superscript glyphs, thus + * mapping character codes like `A' or `B' to superscript glyph + * representation forms. How this mapping happens is completely + * uninteresting to us. + * + * For the auto-hinter, a `coverage' represents all glyphs of an OpenType + * feature collected in a set (as listed below) that can be hinted + * together. To continue the above example, superscript glyphs must not + * be hinted together with normal glyphs because the blue zones + * completely differ. + * + * Note that FreeType itself doesn't compute coverages; it only provides + * the glyphs addressable by the default Unicode character map. Instead, + * we use the HarfBuzz library (if available), which has many functions + * exactly for this purpose. + * + * AF_COVERAGE_DEFAULT is special: It should cover everything that isn't + * listed separately (including the glyphs addressable by the character + * map). In case HarfBuzz isn't available, it exactly covers the glyphs + * addressable by the character map. + * + */ + +#undef COVERAGE +#define COVERAGE( name, NAME, description, \ + tag1, tag2, tag3, tag4 ) \ + AF_COVERAGE_ ## NAME, + + + typedef enum AF_Coverage_ + { +#include "afcover.h" + + AF_COVERAGE_DEFAULT + + } AF_Coverage; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S T Y L E S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* + * The topmost structure for modelling the auto-hinter glyph input data + * is a `style class', grouping everything together. + */ + +#undef STYLE +#define STYLE( s, S, d, ws, sc, ss, c ) \ + AF_STYLE_ ## S, + + /* The list of known styles. */ + typedef enum AF_Style_ + { + +#include "afstyles.h" + + AF_STYLE_MAX /* do not remove */ + + } AF_Style; + + + typedef struct AF_StyleClassRec_ + { + AF_Style style; + + AF_WritingSystem writing_system; + AF_Script script; + AF_Blue_Stringset blue_stringset; + AF_Coverage coverage; + + } AF_StyleClassRec; + + typedef const AF_StyleClassRec* AF_StyleClass; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** S T Y L E M E T R I C S *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct AF_FaceGlobalsRec_* AF_FaceGlobals; + + /* This is the main structure that combines everything. Autofit modules */ + /* specific to writing systems derive their structures from it, for */ + /* example `AF_LatinMetrics'. */ + + typedef struct AF_StyleMetricsRec_ + { + AF_StyleClass style_class; + AF_ScalerRec scaler; + FT_Bool digits_have_same_width; + + AF_FaceGlobals globals; /* to access properties */ + + } AF_StyleMetricsRec; + + +#define AF_HINTING_BOTTOM_TO_TOP 0 +#define AF_HINTING_TOP_TO_BOTTOM 1 + + + /* Declare and define vtables for classes */ +#ifndef FT_CONFIG_OPTION_PIC + +#define AF_DECLARE_WRITING_SYSTEM_CLASS( writing_system_class ) \ + FT_CALLBACK_TABLE const AF_WritingSystemClassRec \ + writing_system_class; + +#define AF_DEFINE_WRITING_SYSTEM_CLASS( \ + writing_system_class, \ + system, \ + m_size, \ + m_init, \ + m_scale, \ + m_done, \ + m_stdw, \ + h_init, \ + h_apply ) \ + FT_CALLBACK_TABLE_DEF \ + const AF_WritingSystemClassRec writing_system_class = \ + { \ + system, \ + \ + m_size, \ + \ + m_init, \ + m_scale, \ + m_done, \ + m_stdw, \ + \ + h_init, \ + h_apply \ + }; + + +#define AF_DECLARE_SCRIPT_CLASS( script_class ) \ + FT_CALLBACK_TABLE const AF_ScriptClassRec \ + script_class; + +#define AF_DEFINE_SCRIPT_CLASS( \ + script_class, \ + script, \ + ranges, \ + nonbase_ranges, \ + top_to_bottom, \ + std_charstring ) \ + FT_CALLBACK_TABLE_DEF \ + const AF_ScriptClassRec script_class = \ + { \ + script, \ + ranges, \ + nonbase_ranges, \ + top_to_bottom, \ + std_charstring, \ + }; + + +#define AF_DECLARE_STYLE_CLASS( style_class ) \ + FT_CALLBACK_TABLE const AF_StyleClassRec \ + style_class; + +#define AF_DEFINE_STYLE_CLASS( \ + style_class, \ + style, \ + writing_system, \ + script, \ + blue_stringset, \ + coverage ) \ + FT_CALLBACK_TABLE_DEF \ + const AF_StyleClassRec style_class = \ + { \ + style, \ + writing_system, \ + script, \ + blue_stringset, \ + coverage \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define AF_DECLARE_WRITING_SYSTEM_CLASS( writing_system_class ) \ + FT_LOCAL( void ) \ + FT_Init_Class_ ## writing_system_class( AF_WritingSystemClassRec* ac ); + +#define AF_DEFINE_WRITING_SYSTEM_CLASS( \ + writing_system_class, \ + system, \ + m_size, \ + m_init, \ + m_scale, \ + m_done, \ + m_stdw, \ + h_init, \ + h_apply ) \ + FT_LOCAL_DEF( void ) \ + FT_Init_Class_ ## writing_system_class( AF_WritingSystemClassRec* ac ) \ + { \ + ac->writing_system = system; \ + \ + ac->style_metrics_size = m_size; \ + \ + ac->style_metrics_init = m_init; \ + ac->style_metrics_scale = m_scale; \ + ac->style_metrics_done = m_done; \ + ac->style_metrics_getstdw = m_stdw; \ + \ + ac->style_hints_init = h_init; \ + ac->style_hints_apply = h_apply; \ + } + + +#define AF_DECLARE_SCRIPT_CLASS( script_class ) \ + FT_LOCAL( void ) \ + FT_Init_Class_ ## script_class( AF_ScriptClassRec* ac ); + +#define AF_DEFINE_SCRIPT_CLASS( \ + script_class, \ + script_, \ + ranges, \ + nonbase_ranges, \ + top_to_bottom, \ + std_charstring ) \ + FT_LOCAL_DEF( void ) \ + FT_Init_Class_ ## script_class( AF_ScriptClassRec* ac ) \ + { \ + ac->script = script_; \ + ac->script_uni_ranges = ranges; \ + ac->script_uni_nonbase_ranges = nonbase_ranges; \ + ac->top_to_bottom_hinting = top_to_bottom; \ + ac->standard_charstring = std_charstring; \ + } + + +#define AF_DECLARE_STYLE_CLASS( style_class ) \ + FT_LOCAL( void ) \ + FT_Init_Class_ ## style_class( AF_StyleClassRec* ac ); + +#define AF_DEFINE_STYLE_CLASS( \ + style_class, \ + style_, \ + writing_system_, \ + script_, \ + blue_stringset_, \ + coverage_ ) \ + FT_LOCAL_DEF( void ) \ + FT_Init_Class_ ## style_class( AF_StyleClassRec* ac ) \ + { \ + ac->style = style_; \ + ac->writing_system = writing_system_; \ + ac->script = script_; \ + ac->blue_stringset = blue_stringset_; \ + ac->coverage = coverage_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* */ + +FT_END_HEADER + +#endif /* AFTYPES_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afwarp.c b/vendor/FreeType2/src/autofit/afwarp.c new file mode 100644 index 0000000..2a75ea7 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afwarp.c @@ -0,0 +1,373 @@ +/***************************************************************************/ +/* */ +/* afwarp.c */ +/* */ +/* Auto-fitter warping algorithm (body). */ +/* */ +/* Copyright 2006-2018 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. */ +/* */ +/***************************************************************************/ + + + /* + * The idea of the warping code is to slightly scale and shift a glyph + * within a single dimension so that as much of its segments are aligned + * (more or less) on the grid. To find out the optimal scaling and + * shifting value, various parameter combinations are tried and scored. + */ + +#include "afwarp.h" + +#ifdef AF_CONFIG_OPTION_USE_WARPER + + /*************************************************************************/ + /* */ + /* 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_afwarp + + + /* The weights cover the range 0/64 - 63/64 of a pixel. Obviously, */ + /* values around a half pixel (which means exactly between two grid */ + /* lines) gets the worst weight. */ +#if 1 + static const AF_WarpScore + af_warper_weights[64] = + { + 35, 32, 30, 25, 20, 15, 12, 10, 5, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -1, -2, -5, -8,-10,-10,-20,-20,-30,-30, + + -30,-30,-20,-20,-10,-10, -8, -5, -2, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 5, 10, 12, 15, 20, 25, 30, 32, + }; +#else + static const AF_WarpScore + af_warper_weights[64] = + { + 30, 20, 10, 5, 4, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -1, -2, -2, -5, -5,-10,-10,-15,-20, + + -20,-15,-15,-10,-10, -5, -5, -2, -2, -1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 4, 5, 10, 20, + }; +#endif + + + /* Score segments for a given `scale' and `delta' in the range */ + /* `xx1' to `xx2', and store the best result in `warper'. If */ + /* the new best score is equal to the old one, prefer the */ + /* value with a smaller distortion (around `base_distort'). */ + + static void + af_warper_compute_line_best( AF_Warper warper, + FT_Fixed scale, + FT_Pos delta, + FT_Pos xx1, + FT_Pos xx2, + AF_WarpScore base_distort, + AF_Segment segments, + FT_Int num_segments ) + { + FT_Int idx_min, idx_max, idx0; + FT_Int nn; + AF_WarpScore scores[65]; + + + for ( nn = 0; nn < 65; nn++ ) + scores[nn] = 0; + + idx0 = xx1 - warper->t1; + + /* compute minimum and maximum indices */ + { + FT_Pos xx1min = warper->x1min; + FT_Pos xx1max = warper->x1max; + FT_Pos w = xx2 - xx1; + + + if ( xx1min + w < warper->x2min ) + xx1min = warper->x2min - w; + + if ( xx1max + w > warper->x2max ) + xx1max = warper->x2max - w; + + idx_min = xx1min - warper->t1; + idx_max = xx1max - warper->t1; + + if ( idx_min < 0 || idx_min > idx_max || idx_max > 64 ) + { + FT_TRACE5(( "invalid indices:\n" + " min=%d max=%d, xx1=%ld xx2=%ld,\n" + " x1min=%ld x1max=%ld, x2min=%ld x2max=%ld\n", + idx_min, idx_max, xx1, xx2, + warper->x1min, warper->x1max, + warper->x2min, warper->x2max )); + return; + } + } + + for ( nn = 0; nn < num_segments; nn++ ) + { + FT_Pos len = segments[nn].max_coord - segments[nn].min_coord; + FT_Pos y0 = FT_MulFix( segments[nn].pos, scale ) + delta; + FT_Pos y = y0 + ( idx_min - idx0 ); + FT_Int idx; + + + /* score the length of the segments for the given range */ + for ( idx = idx_min; idx <= idx_max; idx++, y++ ) + scores[idx] += af_warper_weights[y & 63] * len; + } + + /* find best score */ + { + FT_Int idx; + + + for ( idx = idx_min; idx <= idx_max; idx++ ) + { + AF_WarpScore score = scores[idx]; + AF_WarpScore distort = base_distort + ( idx - idx0 ); + + + if ( score > warper->best_score || + ( score == warper->best_score && + distort < warper->best_distort ) ) + { + warper->best_score = score; + warper->best_distort = distort; + warper->best_scale = scale; + warper->best_delta = delta + ( idx - idx0 ); + } + } + } + } + + + /* Compute optimal scaling and delta values for a given glyph and */ + /* dimension. */ + + FT_LOCAL_DEF( void ) + af_warper_compute( AF_Warper warper, + AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed *a_scale, + FT_Pos *a_delta ) + { + AF_AxisHints axis; + AF_Point points; + + FT_Fixed org_scale; + FT_Pos org_delta; + + FT_Int nn, num_points, num_segments; + FT_Int X1, X2; + FT_Int w; + + AF_WarpScore base_distort; + AF_Segment segments; + + + /* get original scaling transformation */ + if ( dim == AF_DIMENSION_VERT ) + { + org_scale = hints->y_scale; + org_delta = hints->y_delta; + } + else + { + org_scale = hints->x_scale; + org_delta = hints->x_delta; + } + + warper->best_scale = org_scale; + warper->best_delta = org_delta; + warper->best_score = FT_INT_MIN; + warper->best_distort = 0; + + axis = &hints->axis[dim]; + segments = axis->segments; + num_segments = axis->num_segments; + points = hints->points; + num_points = hints->num_points; + + *a_scale = org_scale; + *a_delta = org_delta; + + /* get X1 and X2, minimum and maximum in original coordinates */ + if ( num_segments < 1 ) + return; + +#if 1 + X1 = X2 = points[0].fx; + for ( nn = 1; nn < num_points; nn++ ) + { + FT_Int X = points[nn].fx; + + + if ( X < X1 ) + X1 = X; + if ( X > X2 ) + X2 = X; + } +#else + X1 = X2 = segments[0].pos; + for ( nn = 1; nn < num_segments; nn++ ) + { + FT_Int X = segments[nn].pos; + + + if ( X < X1 ) + X1 = X; + if ( X > X2 ) + X2 = X; + } +#endif + + if ( X1 >= X2 ) + return; + + warper->x1 = FT_MulFix( X1, org_scale ) + org_delta; + warper->x2 = FT_MulFix( X2, org_scale ) + org_delta; + + warper->t1 = AF_WARPER_FLOOR( warper->x1 ); + warper->t2 = AF_WARPER_CEIL( warper->x2 ); + + /* examine a half pixel wide range around the maximum coordinates */ + warper->x1min = warper->x1 & ~31; + warper->x1max = warper->x1min + 32; + warper->x2min = warper->x2 & ~31; + warper->x2max = warper->x2min + 32; + + if ( warper->x1max > warper->x2 ) + warper->x1max = warper->x2; + + if ( warper->x2min < warper->x1 ) + warper->x2min = warper->x1; + + warper->w0 = warper->x2 - warper->x1; + + if ( warper->w0 <= 64 ) + { + warper->x1max = warper->x1; + warper->x2min = warper->x2; + } + + /* examine (at most) a pixel wide range around the natural width */ + warper->wmin = warper->x2min - warper->x1max; + warper->wmax = warper->x2max - warper->x1min; + +#if 1 + /* some heuristics to reduce the number of widths to be examined */ + { + int margin = 16; + + + if ( warper->w0 <= 128 ) + { + margin = 8; + if ( warper->w0 <= 96 ) + margin = 4; + } + + if ( warper->wmin < warper->w0 - margin ) + warper->wmin = warper->w0 - margin; + + if ( warper->wmax > warper->w0 + margin ) + warper->wmax = warper->w0 + margin; + } + + if ( warper->wmin < warper->w0 * 3 / 4 ) + warper->wmin = warper->w0 * 3 / 4; + + if ( warper->wmax > warper->w0 * 5 / 4 ) + warper->wmax = warper->w0 * 5 / 4; +#else + /* no scaling, just translation */ + warper->wmin = warper->wmax = warper->w0; +#endif + + for ( w = warper->wmin; w <= warper->wmax; w++ ) + { + FT_Fixed new_scale; + FT_Pos new_delta; + FT_Pos xx1, xx2; + + + /* compute min and max positions for given width, */ + /* assuring that they stay within the coordinate ranges */ + xx1 = warper->x1; + xx2 = warper->x2; + if ( w >= warper->w0 ) + { + xx1 -= w - warper->w0; + if ( xx1 < warper->x1min ) + { + xx2 += warper->x1min - xx1; + xx1 = warper->x1min; + } + } + else + { + xx1 -= w - warper->w0; + if ( xx1 > warper->x1max ) + { + xx2 -= xx1 - warper->x1max; + xx1 = warper->x1max; + } + } + + if ( xx1 < warper->x1 ) + base_distort = warper->x1 - xx1; + else + base_distort = xx1 - warper->x1; + + if ( xx2 < warper->x2 ) + base_distort += warper->x2 - xx2; + else + base_distort += xx2 - warper->x2; + + /* give base distortion a greater weight while scoring */ + base_distort *= 10; + + new_scale = org_scale + FT_DivFix( w - warper->w0, X2 - X1 ); + new_delta = xx1 - FT_MulFix( X1, new_scale ); + + af_warper_compute_line_best( warper, new_scale, new_delta, xx1, xx2, + base_distort, + segments, num_segments ); + } + + { + FT_Fixed best_scale = warper->best_scale; + FT_Pos best_delta = warper->best_delta; + + + hints->xmin_delta = FT_MulFix( X1, best_scale - org_scale ) + + best_delta; + hints->xmax_delta = FT_MulFix( X2, best_scale - org_scale ) + + best_delta; + + *a_scale = best_scale; + *a_delta = best_delta; + } + } + +#else /* !AF_CONFIG_OPTION_USE_WARPER */ + + /* ANSI C doesn't like empty source files */ + typedef int _af_warp_dummy; + +#endif /* !AF_CONFIG_OPTION_USE_WARPER */ + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afwarp.h b/vendor/FreeType2/src/autofit/afwarp.h new file mode 100644 index 0000000..520b1be --- /dev/null +++ b/vendor/FreeType2/src/autofit/afwarp.h @@ -0,0 +1,64 @@ +/***************************************************************************/ +/* */ +/* afwarp.h */ +/* */ +/* Auto-fitter warping algorithm (specification). */ +/* */ +/* Copyright 2006-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AFWARP_H_ +#define AFWARP_H_ + +#include "afhints.h" + +FT_BEGIN_HEADER + +#define AF_WARPER_SCALE + +#define AF_WARPER_FLOOR( x ) ( (x) & ~FT_TYPEOF( x )63 ) +#define AF_WARPER_CEIL( x ) AF_WARPER_FLOOR( (x) + 63 ) + + + typedef FT_Int32 AF_WarpScore; + + typedef struct AF_WarperRec_ + { + FT_Pos x1, x2; + FT_Pos t1, t2; + FT_Pos x1min, x1max; + FT_Pos x2min, x2max; + FT_Pos w0, wmin, wmax; + + FT_Fixed best_scale; + FT_Pos best_delta; + AF_WarpScore best_score; + AF_WarpScore best_distort; + + } AF_WarperRec, *AF_Warper; + + + FT_LOCAL( void ) + af_warper_compute( AF_Warper warper, + AF_GlyphHints hints, + AF_Dimension dim, + FT_Fixed *a_scale, + FT_Fixed *a_delta ); + + +FT_END_HEADER + + +#endif /* AFWARP_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/afwrtsys.h b/vendor/FreeType2/src/autofit/afwrtsys.h new file mode 100644 index 0000000..4675f32 --- /dev/null +++ b/vendor/FreeType2/src/autofit/afwrtsys.h @@ -0,0 +1,52 @@ +/***************************************************************************/ +/* */ +/* afwrtsys.h */ +/* */ +/* Auto-fitter writing systems (specification only). */ +/* */ +/* Copyright 2013-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AFWRTSYS_H_ +#define AFWRTSYS_H_ + + /* Since preprocessor directives can't create other preprocessor */ + /* directives, we have to include the header files manually. */ + +#include "afdummy.h" +#include "aflatin.h" +#include "afcjk.h" +#include "afindic.h" +#ifdef FT_OPTION_AUTOFIT2 +#include "aflatin2.h" +#endif + +#endif /* AFWRTSYS_H_ */ + + + /* The following part can be included multiple times. */ + /* Define `WRITING_SYSTEM' as needed. */ + + + /* Add new writing systems here. The arguments are the writing system */ + /* name in lowercase and uppercase, respectively. */ + + WRITING_SYSTEM( dummy, DUMMY ) + WRITING_SYSTEM( latin, LATIN ) + WRITING_SYSTEM( cjk, CJK ) + WRITING_SYSTEM( indic, INDIC ) +#ifdef FT_OPTION_AUTOFIT2 + WRITING_SYSTEM( latin2, LATIN2 ) +#endif + + +/* END */ diff --git a/vendor/FreeType2/src/autofit/autofit.c b/vendor/FreeType2/src/autofit/autofit.c new file mode 100644 index 0000000..c160516 --- /dev/null +++ b/vendor/FreeType2/src/autofit/autofit.c @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* autofit.c */ +/* */ +/* Auto-fitter module (body). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT +#include + +#include "afangles.c" +#include "afblue.c" +#include "afcjk.c" +#include "afdummy.c" +#include "afglobal.c" +#include "afhints.c" +#include "afindic.c" +#include "aflatin.c" +#include "aflatin2.c" +#include "afloader.c" +#include "afmodule.c" +#include "afpic.c" +#include "afranges.c" +#include "afshaper.c" +#include "afwarp.c" + + +/* END */ diff --git a/vendor/FreeType2/src/base/basepic.c b/vendor/FreeType2/src/base/basepic.c new file mode 100644 index 0000000..bc80406 --- /dev/null +++ b/vendor/FreeType2/src/base/basepic.c @@ -0,0 +1,108 @@ +/***************************************************************************/ +/* */ +/* basepic.c */ +/* */ +/* The FreeType position independent code services for base. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "basepic.h" + + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from ftglyph.c */ + void + FT_Init_Class_ft_outline_glyph_class( FT_Glyph_Class* clazz ); + + void + FT_Init_Class_ft_bitmap_glyph_class( FT_Glyph_Class* clazz ); + +#ifdef FT_CONFIG_OPTION_MAC_FONTS + /* forward declaration of PIC init function from ftrfork.c */ + /* (not modularized) */ + void + FT_Init_Table_ft_raccess_guess_table( ft_raccess_guess_rec* record ); +#endif + + /* forward declaration of PIC init functions from ftinit.c */ + FT_Error + ft_create_default_module_classes( FT_Library library ); + + void + ft_destroy_default_module_classes( FT_Library library ); + + + void + ft_base_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + + + if ( pic_container->base ) + { + /* destroy default module classes */ + /* (in case FT_Add_Default_Modules was used) */ + ft_destroy_default_module_classes( library ); + + FT_FREE( pic_container->base ); + pic_container->base = NULL; + } + } + + + FT_Error + ft_base_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + BasePIC* container = NULL; + FT_Memory memory = library->memory; + + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof ( *container ) ); + pic_container->base = container; + + /* initialize default modules list and pointers */ + error = ft_create_default_module_classes( library ); + if ( error ) + goto Exit; + + /* initialize pointer table - */ + /* this is how the module usually expects this data */ + FT_Init_Class_ft_outline_glyph_class( + &container->ft_outline_glyph_class ); + FT_Init_Class_ft_bitmap_glyph_class( + &container->ft_bitmap_glyph_class ); +#ifdef FT_CONFIG_OPTION_MAC_FONTS + FT_Init_Table_ft_raccess_guess_table( + (ft_raccess_guess_rec*)&container->ft_raccess_guess_table ); +#endif + + Exit: + if ( error ) + ft_base_pic_free( library ); + return error; + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/vendor/FreeType2/src/base/basepic.h b/vendor/FreeType2/src/base/basepic.h new file mode 100644 index 0000000..492d1ed --- /dev/null +++ b/vendor/FreeType2/src/base/basepic.h @@ -0,0 +1,91 @@ +/***************************************************************************/ +/* */ +/* basepic.h */ +/* */ +/* The FreeType position independent code services for base. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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 BASEPIC_H_ +#define BASEPIC_H_ + + +#include FT_INTERNAL_PIC_H + + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_OUTLINE_GLYPH_CLASS_GET &ft_outline_glyph_class +#define FT_BITMAP_GLYPH_CLASS_GET &ft_bitmap_glyph_class +#define FT_DEFAULT_MODULES_GET ft_default_modules + +#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#define FT_RACCESS_GUESS_TABLE_GET ft_raccess_guess_table +#endif + +#else /* FT_CONFIG_OPTION_PIC */ + +#include FT_GLYPH_H + +#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#include FT_INTERNAL_RFORK_H +#endif + + +FT_BEGIN_HEADER + + typedef struct BasePIC_ + { + FT_Module_Class** default_module_classes; + FT_Glyph_Class ft_outline_glyph_class; + FT_Glyph_Class ft_bitmap_glyph_class; + +#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK + ft_raccess_guess_rec ft_raccess_guess_table[FT_RACCESS_N_RULES]; +#endif + + } BasePIC; + + +#define GET_PIC( lib ) ( (BasePIC*)( (lib)->pic_container.base ) ) + +#define FT_OUTLINE_GLYPH_CLASS_GET \ + ( &GET_PIC( library )->ft_outline_glyph_class ) +#define FT_BITMAP_GLYPH_CLASS_GET \ + ( &GET_PIC( library )->ft_bitmap_glyph_class ) +#define FT_DEFAULT_MODULES_GET \ + ( GET_PIC( library )->default_module_classes ) + +#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#define FT_RACCESS_GUESS_TABLE_GET \ + ( GET_PIC( library )->ft_raccess_guess_table ) +#endif + + + /* see basepic.c for the implementation */ + void + ft_base_pic_free( FT_Library library ); + + FT_Error + ft_base_pic_init( FT_Library library ); + +FT_END_HEADER + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +#endif /* BASEPIC_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftadvanc.c b/vendor/FreeType2/src/base/ftadvanc.c new file mode 100644 index 0000000..230c84d --- /dev/null +++ b/vendor/FreeType2/src/base/ftadvanc.c @@ -0,0 +1,175 @@ +/***************************************************************************/ +/* */ +/* ftadvanc.c */ +/* */ +/* Quick computation of advance widths (body). */ +/* */ +/* Copyright 2008-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H + +#include FT_ADVANCES_H +#include FT_INTERNAL_OBJECTS_H + + + static FT_Error + _ft_face_scale_advances( FT_Face face, + FT_Fixed* advances, + FT_UInt count, + FT_Int32 flags ) + { + FT_Fixed scale; + FT_UInt nn; + + + if ( flags & FT_LOAD_NO_SCALE ) + return FT_Err_Ok; + + if ( !face->size ) + return FT_THROW( Invalid_Size_Handle ); + + if ( flags & FT_LOAD_VERTICAL_LAYOUT ) + scale = face->size->metrics.y_scale; + else + scale = face->size->metrics.x_scale; + + /* this must be the same scaling as to get linear{Hori,Vert}Advance */ + /* (see `FT_Load_Glyph' implementation in src/base/ftobjs.c) */ + + for ( nn = 0; nn < count; nn++ ) + advances[nn] = FT_MulDiv( advances[nn], scale, 64 ); + + return FT_Err_Ok; + } + + + /* at the moment, we can perform fast advance retrieval only in */ + /* the following cases: */ + /* */ + /* - unscaled load */ + /* - unhinted load */ + /* - light-hinted load */ + /* - if a variations font, it must have an `HVAR' or `VVAR' */ + /* table (thus the old MM or GX fonts don't qualify; this */ + /* gets checked by the driver-specific functions) */ + +#define LOAD_ADVANCE_FAST_CHECK( face, flags ) \ + ( flags & ( FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING ) || \ + FT_LOAD_TARGET_MODE( flags ) == FT_RENDER_MODE_LIGHT ) + + + /* documentation is in ftadvanc.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Advance( FT_Face face, + FT_UInt gindex, + FT_Int32 flags, + FT_Fixed *padvance ) + { + FT_Face_GetAdvancesFunc func; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !padvance ) + return FT_THROW( Invalid_Argument ); + + if ( gindex >= (FT_UInt)face->num_glyphs ) + return FT_THROW( Invalid_Glyph_Index ); + + func = face->driver->clazz->get_advances; + if ( func && LOAD_ADVANCE_FAST_CHECK( face, flags ) ) + { + FT_Error error; + + + error = func( face, gindex, 1, flags, padvance ); + if ( !error ) + return _ft_face_scale_advances( face, padvance, 1, flags ); + + if ( FT_ERR_NEQ( error, Unimplemented_Feature ) ) + return error; + } + + return FT_Get_Advances( face, gindex, 1, flags, padvance ); + } + + + /* documentation is in ftadvanc.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 flags, + FT_Fixed *padvances ) + { + FT_Error error = FT_Err_Ok; + + FT_Face_GetAdvancesFunc func; + + FT_UInt num, end, nn; + FT_Int factor; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !padvances ) + return FT_THROW( Invalid_Argument ); + + num = (FT_UInt)face->num_glyphs; + end = start + count; + if ( start >= num || end < start || end > num ) + return FT_THROW( Invalid_Glyph_Index ); + + if ( count == 0 ) + return FT_Err_Ok; + + func = face->driver->clazz->get_advances; + if ( func && LOAD_ADVANCE_FAST_CHECK( face, flags ) ) + { + error = func( face, start, count, flags, padvances ); + if ( !error ) + return _ft_face_scale_advances( face, padvances, count, flags ); + + if ( FT_ERR_NEQ( error, Unimplemented_Feature ) ) + return error; + } + + error = FT_Err_Ok; + + if ( flags & FT_ADVANCE_FLAG_FAST_ONLY ) + return FT_THROW( Unimplemented_Feature ); + + flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; + factor = ( flags & FT_LOAD_NO_SCALE ) ? 1 : 1024; + for ( nn = 0; nn < count; nn++ ) + { + error = FT_Load_Glyph( face, start + nn, flags ); + if ( error ) + break; + + /* scale from 26.6 to 16.16, unless NO_SCALE was requested */ + padvances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) + ? face->glyph->advance.y * factor + : face->glyph->advance.x * factor; + } + + return error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftapi.c b/vendor/FreeType2/src/base/ftapi.c new file mode 100644 index 0000000..32d6e95 --- /dev/null +++ b/vendor/FreeType2/src/base/ftapi.c @@ -0,0 +1,121 @@ +/***************************************************************************/ +/* */ +/* ftapi.c */ +/* */ +/* The FreeType compatibility functions (body). */ +/* */ +/* Copyright 2002-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_LIST_H +#include FT_OUTLINE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TABLES_H +#include FT_OUTLINE_H + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** C O M P A T I B I L I T Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* backward compatibility API */ + + FT_BASE_DEF( void ) + FT_New_Memory_Stream( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Stream stream ) + { + FT_UNUSED( library ); + + FT_Stream_OpenMemory( stream, base, size ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Seek_Stream( FT_Stream stream, + FT_ULong pos ) + { + return FT_Stream_Seek( stream, pos ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Skip_Stream( FT_Stream stream, + FT_Long distance ) + { + return FT_Stream_Skip( stream, distance ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Read_Stream( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ) + { + return FT_Stream_Read( stream, buffer, count ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Read_Stream_At( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + return FT_Stream_ReadAt( stream, pos, buffer, count ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Extract_Frame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ) + { + return FT_Stream_ExtractFrame( stream, count, pbytes ); + } + + + FT_BASE_DEF( void ) + FT_Release_Frame( FT_Stream stream, + FT_Byte** pbytes ) + { + FT_Stream_ReleaseFrame( stream, pbytes ); + } + + FT_BASE_DEF( FT_Error ) + FT_Access_Frame( FT_Stream stream, + FT_ULong count ) + { + return FT_Stream_EnterFrame( stream, count ); + } + + + FT_BASE_DEF( void ) + FT_Forget_Frame( FT_Stream stream ) + { + FT_Stream_ExitFrame( stream ); + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftbase.c b/vendor/FreeType2/src/base/ftbase.c new file mode 100644 index 0000000..f914b9b --- /dev/null +++ b/vendor/FreeType2/src/base/ftbase.c @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* ftbase.c */ +/* */ +/* Single object library component (body only). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#define FT_MAKE_OPTION_SINGLE_OBJECT + +#include "basepic.c" +#include "ftadvanc.c" +#include "ftcalc.c" +#include "ftdbgmem.c" +#include "ftfntfmt.c" +#include "ftgloadr.c" +#include "fthash.c" +#include "ftlcdfil.c" +#include "ftmac.c" +#include "ftobjs.c" +#include "ftoutln.c" +#include "ftpic.c" +#include "ftpsprop.c" +#include "ftrfork.c" +#include "ftsnames.c" +#include "ftstream.c" +#include "fttrigon.c" +#include "ftutil.c" + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftbase.h b/vendor/FreeType2/src/base/ftbase.h new file mode 100644 index 0000000..7e8cfad --- /dev/null +++ b/vendor/FreeType2/src/base/ftbase.h @@ -0,0 +1,78 @@ +/***************************************************************************/ +/* */ +/* ftbase.h */ +/* */ +/* Private functions used in the `base' module (specification). */ +/* */ +/* Copyright 2008-2018 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg, and suzuki toshiya. */ +/* */ +/* 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 FTBASE_H_ +#define FTBASE_H_ + + +#include +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + +#ifdef FT_CONFIG_OPTION_MAC_FONTS + + /* MacOS resource fork cannot exceed 16MB at least for Carbon code; */ + /* see https://support.microsoft.com/en-us/kb/130437 */ +#define FT_MAC_RFORK_MAX_LEN 0x00FFFFFFUL + + + /* Assume the stream is sfnt-wrapped PS Type1 or sfnt-wrapped CID-keyed */ + /* font, and try to load a face specified by the face_index. */ + FT_LOCAL( FT_Error ) + open_face_PS_from_sfnt_stream( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Int num_params, + FT_Parameter *params, + FT_Face *aface ); + + + /* Create a new FT_Face given a buffer and a driver name. */ + /* From ftmac.c. */ + FT_LOCAL( FT_Error ) + open_face_from_buffer( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Long face_index, + const char* driver_name, + FT_Face *aface ); + + +#if defined( FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK ) && \ + !defined( FT_MACINTOSH ) + /* Mac OS X/Darwin kernel often changes recommended method to access */ + /* the resource fork and older methods makes the kernel issue the */ + /* warning of deprecated method. To calm it down, the methods based */ + /* on Darwin VFS should be grouped and skip the rest methods after */ + /* the case the resource is opened but found to lack a font in it. */ + FT_LOCAL( FT_Bool ) + ft_raccess_rule_by_darwin_vfs( FT_Library library, FT_UInt rule_index ); +#endif + +#endif /* FT_CONFIG_OPTION_MAC_FONTS */ + + +FT_END_HEADER + +#endif /* FTBASE_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftbbox.c b/vendor/FreeType2/src/base/ftbbox.c new file mode 100644 index 0000000..151e85c --- /dev/null +++ b/vendor/FreeType2/src/base/ftbbox.c @@ -0,0 +1,515 @@ +/***************************************************************************/ +/* */ +/* ftbbox.c */ +/* */ +/* FreeType bbox computation (body). */ +/* */ +/* Copyright 1996-2018 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 component has a _single_ role: to compute exact outline bounding */ + /* boxes. */ + /* */ + /*************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H + +#include FT_BBOX_H +#include FT_IMAGE_H +#include FT_OUTLINE_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_OBJECTS_H + + + typedef struct TBBox_Rec_ + { + FT_Vector last; + FT_BBox bbox; + + } TBBox_Rec; + + +#define FT_UPDATE_BBOX( p, bbox ) \ + FT_BEGIN_STMNT \ + if ( p->x < bbox.xMin ) \ + bbox.xMin = p->x; \ + if ( p->x > bbox.xMax ) \ + bbox.xMax = p->x; \ + if ( p->y < bbox.yMin ) \ + bbox.yMin = p->y; \ + if ( p->y > bbox.yMax ) \ + bbox.yMax = p->y; \ + FT_END_STMNT + +#define CHECK_X( p, bbox ) \ + ( p->x < bbox.xMin || p->x > bbox.xMax ) + +#define CHECK_Y( p, bbox ) \ + ( p->y < bbox.yMin || p->y > bbox.yMax ) + + + /*************************************************************************/ + /* */ + /* */ + /* BBox_Move_To */ + /* */ + /* */ + /* This function is used as a `move_to' emitter during */ + /* FT_Outline_Decompose(). It simply records the destination point */ + /* in `user->last'. We also update bbox in case contour starts with */ + /* an implicit `on' point. */ + /* */ + /* */ + /* to :: A pointer to the destination vector. */ + /* */ + /* */ + /* user :: A pointer to the current walk context. */ + /* */ + /* */ + /* Always 0. Needed for the interface only. */ + /* */ + static int + BBox_Move_To( FT_Vector* to, + TBBox_Rec* user ) + { + FT_UPDATE_BBOX( to, user->bbox ); + + user->last = *to; + + return 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* BBox_Line_To */ + /* */ + /* */ + /* This function is used as a `line_to' emitter during */ + /* FT_Outline_Decompose(). It simply records the destination point */ + /* in `user->last'; no further computations are necessary because */ + /* bbox already contains both explicit ends of the line segment. */ + /* */ + /* */ + /* to :: A pointer to the destination vector. */ + /* */ + /* */ + /* user :: A pointer to the current walk context. */ + /* */ + /* */ + /* Always 0. Needed for the interface only. */ + /* */ + static int + BBox_Line_To( FT_Vector* to, + TBBox_Rec* user ) + { + user->last = *to; + + return 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* BBox_Conic_Check */ + /* */ + /* */ + /* Find the extrema of a 1-dimensional conic Bezier curve and update */ + /* a bounding range. This version uses direct computation, as it */ + /* doesn't need square roots. */ + /* */ + /* */ + /* y1 :: The start coordinate. */ + /* */ + /* y2 :: The coordinate of the control point. */ + /* */ + /* y3 :: The end coordinate. */ + /* */ + /* */ + /* min :: The address of the current minimum. */ + /* */ + /* max :: The address of the current maximum. */ + /* */ + static void + BBox_Conic_Check( FT_Pos y1, + FT_Pos y2, + FT_Pos y3, + FT_Pos* min, + FT_Pos* max ) + { + /* This function is only called when a control off-point is outside */ + /* the bbox that contains all on-points. It finds a local extremum */ + /* within the segment, equal to (y1*y3 - y2*y2)/(y1 - 2*y2 + y3). */ + /* Or, offsetting from y2, we get */ + + y1 -= y2; + y3 -= y2; + y2 += FT_MulDiv( y1, y3, y1 + y3 ); + + if ( y2 < *min ) + *min = y2; + if ( y2 > *max ) + *max = y2; + } + + + /*************************************************************************/ + /* */ + /* */ + /* BBox_Conic_To */ + /* */ + /* */ + /* This function is used as a `conic_to' emitter during */ + /* FT_Outline_Decompose(). It checks a conic Bezier curve with the */ + /* current bounding box, and computes its extrema if necessary to */ + /* update it. */ + /* */ + /* */ + /* control :: A pointer to a control point. */ + /* */ + /* to :: A pointer to the destination vector. */ + /* */ + /* */ + /* user :: The address of the current walk context. */ + /* */ + /* */ + /* Always 0. Needed for the interface only. */ + /* */ + /* */ + /* In the case of a non-monotonous arc, we compute directly the */ + /* extremum coordinates, as it is sufficiently fast. */ + /* */ + static int + BBox_Conic_To( FT_Vector* control, + FT_Vector* to, + TBBox_Rec* user ) + { + /* in case `to' is implicit and not included in bbox yet */ + FT_UPDATE_BBOX( to, user->bbox ); + + if ( CHECK_X( control, user->bbox ) ) + BBox_Conic_Check( user->last.x, + control->x, + to->x, + &user->bbox.xMin, + &user->bbox.xMax ); + + if ( CHECK_Y( control, user->bbox ) ) + BBox_Conic_Check( user->last.y, + control->y, + to->y, + &user->bbox.yMin, + &user->bbox.yMax ); + + user->last = *to; + + return 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* BBox_Cubic_Check */ + /* */ + /* */ + /* Find the extrema of a 1-dimensional cubic Bezier curve and */ + /* update a bounding range. This version uses iterative splitting */ + /* because it is faster than the exact solution with square roots. */ + /* */ + /* */ + /* p1 :: The start coordinate. */ + /* */ + /* p2 :: The coordinate of the first control point. */ + /* */ + /* p3 :: The coordinate of the second control point. */ + /* */ + /* p4 :: The end coordinate. */ + /* */ + /* */ + /* min :: The address of the current minimum. */ + /* */ + /* max :: The address of the current maximum. */ + /* */ + static FT_Pos + cubic_peak( FT_Pos q1, + FT_Pos q2, + FT_Pos q3, + FT_Pos q4 ) + { + FT_Pos peak = 0; + FT_Int shift; + + + /* This function finds a peak of a cubic segment if it is above 0 */ + /* using iterative bisection of the segment, or returns 0. */ + /* The fixed-point arithmetic of bisection is inherently stable */ + /* but may loose accuracy in the two lowest bits. To compensate, */ + /* we upscale the segment if there is room. Large values may need */ + /* to be downscaled to avoid overflows during bisection. */ + /* It is called with either q2 or q3 positive, which is necessary */ + /* for the peak to exist and avoids undefined FT_MSB. */ + + shift = 27 - FT_MSB( (FT_UInt32)( FT_ABS( q1 ) | + FT_ABS( q2 ) | + FT_ABS( q3 ) | + FT_ABS( q4 ) ) ); + + if ( shift > 0 ) + { + /* upscaling too much just wastes time */ + if ( shift > 2 ) + shift = 2; + + q1 <<= shift; + q2 <<= shift; + q3 <<= shift; + q4 <<= shift; + } + else + { + q1 >>= -shift; + q2 >>= -shift; + q3 >>= -shift; + q4 >>= -shift; + } + + /* for a peak to exist above 0, the cubic segment must have */ + /* at least one of its control off-points above 0. */ + while ( q2 > 0 || q3 > 0 ) + { + /* determine which half contains the maximum and split */ + if ( q1 + q2 > q3 + q4 ) /* first half */ + { + q4 = q4 + q3; + q3 = q3 + q2; + q2 = q2 + q1; + q4 = q4 + q3; + q3 = q3 + q2; + q4 = ( q4 + q3 ) / 8; + q3 = q3 / 4; + q2 = q2 / 2; + } + else /* second half */ + { + q1 = q1 + q2; + q2 = q2 + q3; + q3 = q3 + q4; + q1 = q1 + q2; + q2 = q2 + q3; + q1 = ( q1 + q2 ) / 8; + q2 = q2 / 4; + q3 = q3 / 2; + } + + /* check whether either end reached the maximum */ + if ( q1 == q2 && q1 >= q3 ) + { + peak = q1; + break; + } + if ( q3 == q4 && q2 <= q4 ) + { + peak = q4; + break; + } + } + + if ( shift > 0 ) + peak >>= shift; + else + peak <<= -shift; + + return peak; + } + + + static void + BBox_Cubic_Check( FT_Pos p1, + FT_Pos p2, + FT_Pos p3, + FT_Pos p4, + FT_Pos* min, + FT_Pos* max ) + { + /* This function is only called when a control off-point is outside */ + /* the bbox that contains all on-points. So at least one of the */ + /* conditions below holds and cubic_peak is called with at least one */ + /* non-zero argument. */ + + if ( p2 > *max || p3 > *max ) + *max += cubic_peak( p1 - *max, p2 - *max, p3 - *max, p4 - *max ); + + /* now flip the signs to update the minimum */ + if ( p2 < *min || p3 < *min ) + *min -= cubic_peak( *min - p1, *min - p2, *min - p3, *min - p4 ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* BBox_Cubic_To */ + /* */ + /* */ + /* This function is used as a `cubic_to' emitter during */ + /* FT_Outline_Decompose(). It checks a cubic Bezier curve with the */ + /* current bounding box, and computes its extrema if necessary to */ + /* update it. */ + /* */ + /* */ + /* control1 :: A pointer to the first control point. */ + /* */ + /* control2 :: A pointer to the second control point. */ + /* */ + /* to :: A pointer to the destination vector. */ + /* */ + /* */ + /* user :: The address of the current walk context. */ + /* */ + /* */ + /* Always 0. Needed for the interface only. */ + /* */ + /* */ + /* In the case of a non-monotonous arc, we don't compute directly */ + /* extremum coordinates, we subdivide instead. */ + /* */ + static int + BBox_Cubic_To( FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to, + TBBox_Rec* user ) + { + /* We don't need to check `to' since it is always an on-point, */ + /* thus within the bbox. Only segments with an off-point outside */ + /* the bbox can possibly reach new extreme values. */ + + if ( CHECK_X( control1, user->bbox ) || + CHECK_X( control2, user->bbox ) ) + BBox_Cubic_Check( user->last.x, + control1->x, + control2->x, + to->x, + &user->bbox.xMin, + &user->bbox.xMax ); + + if ( CHECK_Y( control1, user->bbox ) || + CHECK_Y( control2, user->bbox ) ) + BBox_Cubic_Check( user->last.y, + control1->y, + control2->y, + to->y, + &user->bbox.yMin, + &user->bbox.yMax ); + + user->last = *to; + + return 0; + } + + + FT_DEFINE_OUTLINE_FUNCS( + bbox_interface, + + (FT_Outline_MoveTo_Func) BBox_Move_To, /* move_to */ + (FT_Outline_LineTo_Func) BBox_Line_To, /* line_to */ + (FT_Outline_ConicTo_Func)BBox_Conic_To, /* conic_to */ + (FT_Outline_CubicTo_Func)BBox_Cubic_To, /* cubic_to */ + 0, /* shift */ + 0 /* delta */ + ) + + + /* documentation is in ftbbox.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Get_BBox( FT_Outline* outline, + FT_BBox *abbox ) + { + FT_BBox cbox = { 0x7FFFFFFFL, 0x7FFFFFFFL, + -0x7FFFFFFFL, -0x7FFFFFFFL }; + FT_BBox bbox = { 0x7FFFFFFFL, 0x7FFFFFFFL, + -0x7FFFFFFFL, -0x7FFFFFFFL }; + FT_Vector* vec; + FT_UShort n; + + + if ( !abbox ) + return FT_THROW( Invalid_Argument ); + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + /* if outline is empty, return (0,0,0,0) */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + { + abbox->xMin = abbox->xMax = 0; + abbox->yMin = abbox->yMax = 0; + + return 0; + } + + /* We compute the control box as well as the bounding box of */ + /* all `on' points in the outline. Then, if the two boxes */ + /* coincide, we exit immediately. */ + + vec = outline->points; + + for ( n = 0; n < outline->n_points; n++ ) + { + FT_UPDATE_BBOX( vec, cbox ); + + if ( FT_CURVE_TAG( outline->tags[n] ) == FT_CURVE_TAG_ON ) + FT_UPDATE_BBOX( vec, bbox ); + + vec++; + } + + /* test two boxes for equality */ + if ( cbox.xMin < bbox.xMin || cbox.xMax > bbox.xMax || + cbox.yMin < bbox.yMin || cbox.yMax > bbox.yMax ) + { + /* the two boxes are different, now walk over the outline to */ + /* get the Bezier arc extrema. */ + + FT_Error error; + TBBox_Rec user; + +#ifdef FT_CONFIG_OPTION_PIC + FT_Outline_Funcs bbox_interface; + + + Init_Class_bbox_interface( &bbox_interface ); +#endif + + user.bbox = bbox; + + error = FT_Outline_Decompose( outline, &bbox_interface, &user ); + if ( error ) + return error; + + *abbox = user.bbox; + } + else + *abbox = bbox; + + return FT_Err_Ok; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftbdf.c b/vendor/FreeType2/src/base/ftbdf.c new file mode 100644 index 0000000..c4ea502 --- /dev/null +++ b/vendor/FreeType2/src/base/ftbdf.c @@ -0,0 +1,91 @@ +/***************************************************************************/ +/* */ +/* ftbdf.c */ +/* */ +/* FreeType API for accessing BDF-specific strings (body). */ +/* */ +/* Copyright 2002-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H + +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_BDF_H + + + /* documentation is in ftbdf.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_BDF_Charset_ID( FT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ) + { + FT_Error error; + const char* encoding = NULL; + const char* registry = NULL; + + FT_Service_BDF service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + FT_FACE_FIND_SERVICE( face, service, BDF ); + + if ( service && service->get_charset_id ) + error = service->get_charset_id( face, &encoding, ®istry ); + else + error = FT_THROW( Invalid_Argument ); + + if ( acharset_encoding ) + *acharset_encoding = encoding; + + if ( acharset_registry ) + *acharset_registry = registry; + + return error; + } + + + /* documentation is in ftbdf.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_BDF_Property( FT_Face face, + const char* prop_name, + BDF_PropertyRec *aproperty ) + { + FT_Error error; + + FT_Service_BDF service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !aproperty ) + return FT_THROW( Invalid_Argument ); + + aproperty->type = BDF_PROPERTY_TYPE_NONE; + + FT_FACE_FIND_SERVICE( face, service, BDF ); + + if ( service && service->get_property ) + error = service->get_property( face, prop_name, aproperty ); + else + error = FT_THROW( Invalid_Argument ); + + return error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftbitmap.c b/vendor/FreeType2/src/base/ftbitmap.c new file mode 100644 index 0000000..a974666 --- /dev/null +++ b/vendor/FreeType2/src/base/ftbitmap.c @@ -0,0 +1,835 @@ +/***************************************************************************/ +/* */ +/* ftbitmap.c */ +/* */ +/* FreeType utility functions for bitmaps (body). */ +/* */ +/* Copyright 2004-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H + +#include FT_BITMAP_H +#include FT_IMAGE_H +#include FT_INTERNAL_OBJECTS_H + + + static + const FT_Bitmap null_bitmap = { 0, 0, 0, 0, 0, 0, 0, 0 }; + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( void ) + FT_Bitmap_Init( FT_Bitmap *abitmap ) + { + if ( abitmap ) + *abitmap = null_bitmap; + } + + + /* deprecated function name; retained for ABI compatibility */ + + FT_EXPORT_DEF( void ) + FT_Bitmap_New( FT_Bitmap *abitmap ) + { + if ( abitmap ) + *abitmap = null_bitmap; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Copy( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target) + { + FT_Memory memory; + FT_Error error = FT_Err_Ok; + + FT_Int pitch; + FT_ULong size; + + FT_Int source_pitch_sign, target_pitch_sign; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !source || !target ) + return FT_THROW( Invalid_Argument ); + + if ( source == target ) + return FT_Err_Ok; + + source_pitch_sign = source->pitch < 0 ? -1 : 1; + target_pitch_sign = target->pitch < 0 ? -1 : 1; + + if ( !source->buffer ) + { + *target = *source; + if ( source_pitch_sign != target_pitch_sign ) + target->pitch = -target->pitch; + + return FT_Err_Ok; + } + + memory = library->memory; + pitch = source->pitch; + + if ( pitch < 0 ) + pitch = -pitch; + size = (FT_ULong)pitch * source->rows; + + if ( target->buffer ) + { + FT_Int target_pitch = target->pitch; + FT_ULong target_size; + + + if ( target_pitch < 0 ) + target_pitch = -target_pitch; + target_size = (FT_ULong)target_pitch * target->rows; + + if ( target_size != size ) + (void)FT_QREALLOC( target->buffer, target_size, size ); + } + else + (void)FT_QALLOC( target->buffer, size ); + + if ( !error ) + { + unsigned char *p; + + + p = target->buffer; + *target = *source; + target->buffer = p; + + if ( source_pitch_sign == target_pitch_sign ) + FT_MEM_COPY( target->buffer, source->buffer, size ); + else + { + /* take care of bitmap flow */ + FT_UInt i; + FT_Byte* s = source->buffer; + FT_Byte* t = target->buffer; + + + t += (FT_ULong)pitch * ( target->rows - 1 ); + + for ( i = target->rows; i > 0; i-- ) + { + FT_ARRAY_COPY( t, s, pitch ); + + s += pitch; + t -= pitch; + } + } + } + + return error; + } + + + /* Enlarge `bitmap' horizontally and vertically by `xpixels' */ + /* and `ypixels', respectively. */ + + static FT_Error + ft_bitmap_assure_buffer( FT_Memory memory, + FT_Bitmap* bitmap, + FT_UInt xpixels, + FT_UInt ypixels ) + { + FT_Error error; + unsigned int pitch; + unsigned int new_pitch; + FT_UInt bpp; + FT_UInt width, height; + unsigned char* buffer = NULL; + + + width = bitmap->width; + height = bitmap->rows; + pitch = (unsigned int)FT_ABS( bitmap->pitch ); + + switch ( bitmap->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + bpp = 1; + new_pitch = ( width + xpixels + 7 ) >> 3; + break; + case FT_PIXEL_MODE_GRAY2: + bpp = 2; + new_pitch = ( width + xpixels + 3 ) >> 2; + break; + case FT_PIXEL_MODE_GRAY4: + bpp = 4; + new_pitch = ( width + xpixels + 1 ) >> 1; + break; + case FT_PIXEL_MODE_GRAY: + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + bpp = 8; + new_pitch = width + xpixels; + break; + default: + return FT_THROW( Invalid_Glyph_Format ); + } + + /* if no need to allocate memory */ + if ( ypixels == 0 && new_pitch <= pitch ) + { + /* zero the padding */ + FT_UInt bit_width = pitch * 8; + FT_UInt bit_last = ( width + xpixels ) * bpp; + + + if ( bit_last < bit_width ) + { + FT_Byte* line = bitmap->buffer + ( bit_last >> 3 ); + FT_Byte* end = bitmap->buffer + pitch; + FT_UInt shift = bit_last & 7; + FT_UInt mask = 0xFF00U >> shift; + FT_UInt count = height; + + + for ( ; count > 0; count--, line += pitch, end += pitch ) + { + FT_Byte* write = line; + + + if ( shift > 0 ) + { + write[0] = (FT_Byte)( write[0] & mask ); + write++; + } + if ( write < end ) + FT_MEM_ZERO( write, end - write ); + } + } + + return FT_Err_Ok; + } + + /* otherwise allocate new buffer */ + if ( FT_QALLOC_MULT( buffer, bitmap->rows + ypixels, new_pitch ) ) + return error; + + /* new rows get added at the top of the bitmap, */ + /* thus take care of the flow direction */ + if ( bitmap->pitch > 0 ) + { + FT_UInt len = ( width * bpp + 7 ) >> 3; + + unsigned char* in = bitmap->buffer; + unsigned char* out = buffer; + + unsigned char* limit = bitmap->buffer + pitch * bitmap->rows; + unsigned int delta = new_pitch - len; + + + FT_MEM_ZERO( out, new_pitch * ypixels ); + out += new_pitch * ypixels; + + while ( in < limit ) + { + FT_MEM_COPY( out, in, len ); + in += pitch; + out += len; + + /* we use FT_QALLOC_MULT, which doesn't zero out the buffer; */ + /* consequently, we have to manually zero out the remaining bytes */ + FT_MEM_ZERO( out, delta ); + out += delta; + } + } + else + { + FT_UInt len = ( width * bpp + 7 ) >> 3; + + unsigned char* in = bitmap->buffer; + unsigned char* out = buffer; + + unsigned char* limit = bitmap->buffer + pitch * bitmap->rows; + unsigned int delta = new_pitch - len; + + + while ( in < limit ) + { + FT_MEM_COPY( out, in, len ); + in += pitch; + out += len; + + FT_MEM_ZERO( out, delta ); + out += delta; + } + + FT_MEM_ZERO( out, new_pitch * ypixels ); + } + + FT_FREE( bitmap->buffer ); + bitmap->buffer = buffer; + + /* set pitch only, width and height are left untouched */ + if ( bitmap->pitch < 0 ) + bitmap->pitch = -(int)new_pitch; + else + bitmap->pitch = (int)new_pitch; + + return FT_Err_Ok; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Embolden( FT_Library library, + FT_Bitmap* bitmap, + FT_Pos xStrength, + FT_Pos yStrength ) + { + FT_Error error; + unsigned char* p; + FT_Int i, x, pitch; + FT_UInt y; + FT_Int xstr, ystr; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !bitmap || !bitmap->buffer ) + return FT_THROW( Invalid_Argument ); + + if ( ( ( FT_PIX_ROUND( xStrength ) >> 6 ) > FT_INT_MAX ) || + ( ( FT_PIX_ROUND( yStrength ) >> 6 ) > FT_INT_MAX ) ) + return FT_THROW( Invalid_Argument ); + + xstr = (FT_Int)FT_PIX_ROUND( xStrength ) >> 6; + ystr = (FT_Int)FT_PIX_ROUND( yStrength ) >> 6; + + if ( xstr == 0 && ystr == 0 ) + return FT_Err_Ok; + else if ( xstr < 0 || ystr < 0 ) + return FT_THROW( Invalid_Argument ); + + switch ( bitmap->pixel_mode ) + { + case FT_PIXEL_MODE_GRAY2: + case FT_PIXEL_MODE_GRAY4: + { + FT_Bitmap tmp; + + + /* convert to 8bpp */ + FT_Bitmap_Init( &tmp ); + error = FT_Bitmap_Convert( library, bitmap, &tmp, 1 ); + if ( error ) + return error; + + FT_Bitmap_Done( library, bitmap ); + *bitmap = tmp; + } + break; + + case FT_PIXEL_MODE_MONO: + if ( xstr > 8 ) + xstr = 8; + break; + + case FT_PIXEL_MODE_LCD: + xstr *= 3; + break; + + case FT_PIXEL_MODE_LCD_V: + ystr *= 3; + break; + + case FT_PIXEL_MODE_BGRA: + /* We don't embolden color glyphs. */ + return FT_Err_Ok; + } + + error = ft_bitmap_assure_buffer( library->memory, bitmap, + (FT_UInt)xstr, (FT_UInt)ystr ); + if ( error ) + return error; + + /* take care of bitmap flow */ + pitch = bitmap->pitch; + if ( pitch > 0 ) + p = bitmap->buffer + pitch * ystr; + else + { + pitch = -pitch; + p = bitmap->buffer + (FT_UInt)pitch * ( bitmap->rows - 1 ); + } + + /* for each row */ + for ( y = 0; y < bitmap->rows; y++ ) + { + /* + * Horizontally: + * + * From the last pixel on, make each pixel or'ed with the + * `xstr' pixels before it. + */ + for ( x = pitch - 1; x >= 0; x-- ) + { + unsigned char tmp; + + + tmp = p[x]; + for ( i = 1; i <= xstr; i++ ) + { + if ( bitmap->pixel_mode == FT_PIXEL_MODE_MONO ) + { + p[x] |= tmp >> i; + + /* the maximum value of 8 for `xstr' comes from here */ + if ( x > 0 ) + p[x] |= p[x - 1] << ( 8 - i ); + +#if 0 + if ( p[x] == 0xFF ) + break; +#endif + } + else + { + if ( x - i >= 0 ) + { + if ( p[x] + p[x - i] > bitmap->num_grays - 1 ) + { + p[x] = (unsigned char)( bitmap->num_grays - 1 ); + break; + } + else + { + p[x] = (unsigned char)( p[x] + p[x - i] ); + if ( p[x] == bitmap->num_grays - 1 ) + break; + } + } + else + break; + } + } + } + + /* + * Vertically: + * + * Make the above `ystr' rows or'ed with it. + */ + for ( x = 1; x <= ystr; x++ ) + { + unsigned char* q; + + + q = p - bitmap->pitch * x; + for ( i = 0; i < pitch; i++ ) + q[i] |= p[i]; + } + + p += bitmap->pitch; + } + + bitmap->width += (FT_UInt)xstr; + bitmap->rows += (FT_UInt)ystr; + + return FT_Err_Ok; + } + + + static FT_Byte + ft_gray_for_premultiplied_srgb_bgra( const FT_Byte* bgra ) + { + FT_UInt a = bgra[3]; + FT_UInt l; + + + /* Short-circuit transparent color to avoid division by zero. */ + if ( !a ) + return 0; + + /* + * Luminosity for sRGB is defined using ~0.2126,0.7152,0.0722 + * coefficients for RGB channels *on the linear colors*. + * A gamma of 2.2 is fair to assume. And then, we need to + * undo the premultiplication too. + * + * https://accessibility.kde.org/hsl-adjusted.php + * + * We do the computation with integers only, applying a gamma of 2.0. + * We guarantee 32-bit arithmetic to avoid overflow but the resulting + * luminosity fits into 16 bits. + * + */ + + l = ( 4732UL /* 0.0722 * 65536 */ * bgra[0] * bgra[0] + + 46871UL /* 0.7152 * 65536 */ * bgra[1] * bgra[1] + + 13933UL /* 0.2126 * 65536 */ * bgra[2] * bgra[2] ) >> 16; + + /* + * Final transparency can be determined as follows. + * + * - If alpha is zero, we want 0. + * - If alpha is zero and luminosity is zero, we want 255. + * - If alpha is zero and luminosity is one, we want 0. + * + * So the formula is a * (1 - l) = a - l * a. + * + * We still need to undo premultiplication by dividing l by a*a. + * + */ + + return (FT_Byte)( a - l / a ); + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Convert( FT_Library library, + const FT_Bitmap *source, + FT_Bitmap *target, + FT_Int alignment ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory; + + FT_Byte* s; + FT_Byte* t; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !source || !target ) + return FT_THROW( Invalid_Argument ); + + memory = library->memory; + + switch ( source->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + case FT_PIXEL_MODE_GRAY: + case FT_PIXEL_MODE_GRAY2: + case FT_PIXEL_MODE_GRAY4: + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + case FT_PIXEL_MODE_BGRA: + { + FT_Int pad, old_target_pitch, target_pitch; + FT_ULong old_size; + + + old_target_pitch = target->pitch; + if ( old_target_pitch < 0 ) + old_target_pitch = -old_target_pitch; + + old_size = target->rows * (FT_UInt)old_target_pitch; + + target->pixel_mode = FT_PIXEL_MODE_GRAY; + target->rows = source->rows; + target->width = source->width; + + pad = 0; + if ( alignment > 0 ) + { + pad = (FT_Int)source->width % alignment; + if ( pad != 0 ) + pad = alignment - pad; + } + + target_pitch = (FT_Int)source->width + pad; + + if ( target_pitch > 0 && + (FT_ULong)target->rows > FT_ULONG_MAX / (FT_ULong)target_pitch ) + return FT_THROW( Invalid_Argument ); + + if ( FT_QREALLOC( target->buffer, + old_size, target->rows * (FT_UInt)target_pitch ) ) + return error; + + target->pitch = target->pitch < 0 ? -target_pitch : target_pitch; + } + break; + + default: + error = FT_THROW( Invalid_Argument ); + } + + s = source->buffer; + t = target->buffer; + + /* take care of bitmap flow */ + if ( source->pitch < 0 ) + s -= source->pitch * (FT_Int)( source->rows - 1 ); + if ( target->pitch < 0 ) + t -= target->pitch * (FT_Int)( target->rows - 1 ); + + switch ( source->pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + { + FT_UInt i; + + + target->num_grays = 2; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_UInt j; + + + /* get the full bytes */ + for ( j = source->width >> 3; j > 0; j-- ) + { + FT_Int val = ss[0]; /* avoid a byte->int cast on each line */ + + + tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7 ); + tt[1] = (FT_Byte)( ( val & 0x40 ) >> 6 ); + tt[2] = (FT_Byte)( ( val & 0x20 ) >> 5 ); + tt[3] = (FT_Byte)( ( val & 0x10 ) >> 4 ); + tt[4] = (FT_Byte)( ( val & 0x08 ) >> 3 ); + tt[5] = (FT_Byte)( ( val & 0x04 ) >> 2 ); + tt[6] = (FT_Byte)( ( val & 0x02 ) >> 1 ); + tt[7] = (FT_Byte)( val & 0x01 ); + + tt += 8; + ss += 1; + } + + /* get remaining pixels (if any) */ + j = source->width & 7; + if ( j > 0 ) + { + FT_Int val = *ss; + + + for ( ; j > 0; j-- ) + { + tt[0] = (FT_Byte)( ( val & 0x80 ) >> 7); + val <<= 1; + tt += 1; + } + } + + s += source->pitch; + t += target->pitch; + } + } + break; + + + case FT_PIXEL_MODE_GRAY: + case FT_PIXEL_MODE_LCD: + case FT_PIXEL_MODE_LCD_V: + { + FT_UInt width = source->width; + FT_UInt i; + + + target->num_grays = 256; + + for ( i = source->rows; i > 0; i-- ) + { + FT_ARRAY_COPY( t, s, width ); + + s += source->pitch; + t += target->pitch; + } + } + break; + + + case FT_PIXEL_MODE_GRAY2: + { + FT_UInt i; + + + target->num_grays = 4; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_UInt j; + + + /* get the full bytes */ + for ( j = source->width >> 2; j > 0; j-- ) + { + FT_Int val = ss[0]; + + + tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); + tt[1] = (FT_Byte)( ( val & 0x30 ) >> 4 ); + tt[2] = (FT_Byte)( ( val & 0x0C ) >> 2 ); + tt[3] = (FT_Byte)( ( val & 0x03 ) ); + + ss += 1; + tt += 4; + } + + j = source->width & 3; + if ( j > 0 ) + { + FT_Int val = ss[0]; + + + for ( ; j > 0; j-- ) + { + tt[0] = (FT_Byte)( ( val & 0xC0 ) >> 6 ); + val <<= 2; + tt += 1; + } + } + + s += source->pitch; + t += target->pitch; + } + } + break; + + + case FT_PIXEL_MODE_GRAY4: + { + FT_UInt i; + + + target->num_grays = 16; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_UInt j; + + + /* get the full bytes */ + for ( j = source->width >> 1; j > 0; j-- ) + { + FT_Int val = ss[0]; + + + tt[0] = (FT_Byte)( ( val & 0xF0 ) >> 4 ); + tt[1] = (FT_Byte)( ( val & 0x0F ) ); + + ss += 1; + tt += 2; + } + + if ( source->width & 1 ) + tt[0] = (FT_Byte)( ( ss[0] & 0xF0 ) >> 4 ); + + s += source->pitch; + t += target->pitch; + } + } + break; + + + case FT_PIXEL_MODE_BGRA: + { + FT_UInt i; + + + target->num_grays = 256; + + for ( i = source->rows; i > 0; i-- ) + { + FT_Byte* ss = s; + FT_Byte* tt = t; + FT_UInt j; + + + for ( j = source->width; j > 0; j-- ) + { + tt[0] = ft_gray_for_premultiplied_srgb_bgra( ss ); + + ss += 4; + tt += 1; + } + + s += source->pitch; + t += target->pitch; + } + } + break; + + default: + ; + } + + return error; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_GlyphSlot_Own_Bitmap( FT_GlyphSlot slot ) + { + if ( slot && slot->format == FT_GLYPH_FORMAT_BITMAP && + !( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) + { + FT_Bitmap bitmap; + FT_Error error; + + + FT_Bitmap_Init( &bitmap ); + error = FT_Bitmap_Copy( slot->library, &slot->bitmap, &bitmap ); + if ( error ) + return error; + + slot->bitmap = bitmap; + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + } + + return FT_Err_Ok; + } + + + /* documentation is in ftbitmap.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Bitmap_Done( FT_Library library, + FT_Bitmap *bitmap ) + { + FT_Memory memory; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !bitmap ) + return FT_THROW( Invalid_Argument ); + + memory = library->memory; + + FT_FREE( bitmap->buffer ); + *bitmap = null_bitmap; + + return FT_Err_Ok; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftcalc.c b/vendor/FreeType2/src/base/ftcalc.c new file mode 100644 index 0000000..f4ff45f --- /dev/null +++ b/vendor/FreeType2/src/base/ftcalc.c @@ -0,0 +1,1017 @@ +/***************************************************************************/ +/* */ +/* ftcalc.c */ +/* */ +/* Arithmetic computations (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* Support for 1-complement arithmetic has been totally dropped in this */ + /* release. You can still write your own code if you need it. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* Implementing basic computation routines. */ + /* */ + /* FT_MulDiv(), FT_MulFix(), FT_DivFix(), FT_RoundFix(), FT_CeilFix(), */ + /* and FT_FloorFix() are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#include +#include FT_GLYPH_H +#include FT_TRIGONOMETRY_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H + + +#ifdef FT_MULFIX_ASSEMBLER +#undef FT_MulFix +#endif + +/* we need to emulate a 64-bit data type if a real one isn't available */ + +#ifndef FT_LONG64 + + typedef struct FT_Int64_ + { + FT_UInt32 lo; + FT_UInt32 hi; + + } FT_Int64; + +#endif /* !FT_LONG64 */ + + + /*************************************************************************/ + /* */ + /* 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_calc + + + /* transfer sign, leaving a positive number; */ + /* we need an unsigned value to safely negate INT_MIN (or LONG_MIN) */ +#define FT_MOVE_SIGN( x, x_unsigned, s ) \ + FT_BEGIN_STMNT \ + if ( x < 0 ) \ + { \ + x_unsigned = 0U - (x_unsigned); \ + s = -s; \ + } \ + FT_END_STMNT + + /* The following three functions are available regardless of whether */ + /* FT_LONG64 is defined. */ + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_RoundFix( FT_Fixed a ) + { + return ( ADD_LONG( a, 0x8000L - ( a < 0 ) ) ) & ~0xFFFFL; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_CeilFix( FT_Fixed a ) + { + return ( ADD_LONG( a, 0xFFFFL ) ) & ~0xFFFFL; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_FloorFix( FT_Fixed a ) + { + return a & ~0xFFFFL; + } + +#ifndef FT_MSB + + FT_BASE_DEF ( FT_Int ) + FT_MSB( FT_UInt32 z ) + { + FT_Int shift = 0; + + + /* determine msb bit index in `shift' */ + if ( z & 0xFFFF0000UL ) + { + z >>= 16; + shift += 16; + } + if ( z & 0x0000FF00UL ) + { + z >>= 8; + shift += 8; + } + if ( z & 0x000000F0UL ) + { + z >>= 4; + shift += 4; + } + if ( z & 0x0000000CUL ) + { + z >>= 2; + shift += 2; + } + if ( z & 0x00000002UL ) + { + /* z >>= 1; */ + shift += 1; + } + + return shift; + } + +#endif /* !FT_MSB */ + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Fixed ) + FT_Hypot( FT_Fixed x, + FT_Fixed y ) + { + FT_Vector v; + + + v.x = x; + v.y = y; + + return FT_Vector_Length( &v ); + } + + +#ifdef FT_LONG64 + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulDiv( FT_Long a_, + FT_Long b_, + FT_Long c_ ) + { + FT_Int s = 1; + FT_UInt64 a, b, c, d; + FT_Long d_; + + + a = (FT_UInt64)a_; + b = (FT_UInt64)b_; + c = (FT_UInt64)c_; + + FT_MOVE_SIGN( a_, a, s ); + FT_MOVE_SIGN( b_, b, s ); + FT_MOVE_SIGN( c_, c, s ); + + d = c > 0 ? ( a * b + ( c >> 1 ) ) / c + : 0x7FFFFFFFUL; + + d_ = (FT_Long)d; + + return s < 0 ? NEG_LONG( d_ ) : d_; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Long ) + FT_MulDiv_No_Round( FT_Long a_, + FT_Long b_, + FT_Long c_ ) + { + FT_Int s = 1; + FT_UInt64 a, b, c, d; + FT_Long d_; + + + a = (FT_UInt64)a_; + b = (FT_UInt64)b_; + c = (FT_UInt64)c_; + + FT_MOVE_SIGN( a_, a, s ); + FT_MOVE_SIGN( b_, b, s ); + FT_MOVE_SIGN( c_, c, s ); + + d = c > 0 ? a * b / c + : 0x7FFFFFFFUL; + + d_ = (FT_Long)d; + + return s < 0 ? NEG_LONG( d_ ) : d_; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulFix( FT_Long a_, + FT_Long b_ ) + { +#ifdef FT_MULFIX_ASSEMBLER + + return FT_MULFIX_ASSEMBLER( (FT_Int32)a_, (FT_Int32)b_ ); + +#else + + FT_Int64 ab = (FT_Int64)a_ * (FT_Int64)b_; + + /* this requires arithmetic right shift of signed numbers */ + return (FT_Long)( ( ab + 0x8000L - ( ab < 0 ) ) >> 16 ); + +#endif /* FT_MULFIX_ASSEMBLER */ + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_DivFix( FT_Long a_, + FT_Long b_ ) + { + FT_Int s = 1; + FT_UInt64 a, b, q; + FT_Long q_; + + + a = (FT_UInt64)a_; + b = (FT_UInt64)b_; + + FT_MOVE_SIGN( a_, a, s ); + FT_MOVE_SIGN( b_, b, s ); + + q = b > 0 ? ( ( a << 16 ) + ( b >> 1 ) ) / b + : 0x7FFFFFFFUL; + + q_ = (FT_Long)q; + + return s < 0 ? NEG_LONG( q_ ) : q_; + } + + +#else /* !FT_LONG64 */ + + + static void + ft_multo64( FT_UInt32 x, + FT_UInt32 y, + FT_Int64 *z ) + { + FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2; + + + lo1 = x & 0x0000FFFFU; hi1 = x >> 16; + lo2 = y & 0x0000FFFFU; hi2 = y >> 16; + + lo = lo1 * lo2; + i1 = lo1 * hi2; + i2 = lo2 * hi1; + hi = hi1 * hi2; + + /* Check carry overflow of i1 + i2 */ + i1 += i2; + hi += (FT_UInt32)( i1 < i2 ) << 16; + + hi += i1 >> 16; + i1 = i1 << 16; + + /* Check carry overflow of i1 + lo */ + lo += i1; + hi += ( lo < i1 ); + + z->lo = lo; + z->hi = hi; + } + + + static FT_UInt32 + ft_div64by32( FT_UInt32 hi, + FT_UInt32 lo, + FT_UInt32 y ) + { + FT_UInt32 r, q; + FT_Int i; + + + if ( hi >= y ) + return (FT_UInt32)0x7FFFFFFFL; + + /* We shift as many bits as we can into the high register, perform */ + /* 32-bit division with modulo there, then work through the remaining */ + /* bits with long division. This optimization is especially noticeable */ + /* for smaller dividends that barely use the high register. */ + + i = 31 - FT_MSB( hi ); + r = ( hi << i ) | ( lo >> ( 32 - i ) ); lo <<= i; /* left 64-bit shift */ + q = r / y; + r -= q * y; /* remainder */ + + i = 32 - i; /* bits remaining in low register */ + do + { + q <<= 1; + r = ( r << 1 ) | ( lo >> 31 ); lo <<= 1; + + if ( r >= y ) + { + r -= y; + q |= 1; + } + } while ( --i ); + + return q; + } + + + static void + FT_Add64( FT_Int64* x, + FT_Int64* y, + FT_Int64 *z ) + { + FT_UInt32 lo, hi; + + + lo = x->lo + y->lo; + hi = x->hi + y->hi + ( lo < x->lo ); + + z->lo = lo; + z->hi = hi; + } + + + /* The FT_MulDiv function has been optimized thanks to ideas from */ + /* Graham Asher and Alexei Podtelezhnikov. The trick is to optimize */ + /* a rather common case when everything fits within 32-bits. */ + /* */ + /* We compute 'a*b+c/2', then divide it by 'c' (all positive values). */ + /* */ + /* The product of two positive numbers never exceeds the square of */ + /* its mean values. Therefore, we always avoid the overflow by */ + /* imposing */ + /* */ + /* (a + b) / 2 <= sqrt(X - c/2) , */ + /* */ + /* where X = 2^32 - 1, the maximum unsigned 32-bit value, and using */ + /* unsigned arithmetic. Now we replace `sqrt' with a linear function */ + /* that is smaller or equal for all values of c in the interval */ + /* [0;X/2]; it should be equal to sqrt(X) and sqrt(3X/4) at the */ + /* endpoints. Substituting the linear solution and explicit numbers */ + /* we get */ + /* */ + /* a + b <= 131071.99 - c / 122291.84 . */ + /* */ + /* In practice, we should use a faster and even stronger inequality */ + /* */ + /* a + b <= 131071 - (c >> 16) */ + /* */ + /* or, alternatively, */ + /* */ + /* a + b <= 129894 - (c >> 17) . */ + /* */ + /* FT_MulFix, on the other hand, is optimized for a small value of */ + /* the first argument, when the second argument can be much larger. */ + /* This can be achieved by scaling the second argument and the limit */ + /* in the above inequalities. For example, */ + /* */ + /* a + (b >> 8) <= (131071 >> 4) */ + /* */ + /* covers the practical range of use. The actual test below is a bit */ + /* tighter to avoid the border case overflows. */ + /* */ + /* In the case of FT_DivFix, the exact overflow check */ + /* */ + /* a << 16 <= X - c/2 */ + /* */ + /* is scaled down by 2^16 and we use */ + /* */ + /* a <= 65535 - (c >> 17) . */ + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulDiv( FT_Long a_, + FT_Long b_, + FT_Long c_ ) + { + FT_Int s = 1; + FT_UInt32 a, b, c; + + + /* XXX: this function does not allow 64-bit arguments */ + + a = (FT_UInt32)a_; + b = (FT_UInt32)b_; + c = (FT_UInt32)c_; + + FT_MOVE_SIGN( a_, a, s ); + FT_MOVE_SIGN( b_, b, s ); + FT_MOVE_SIGN( c_, c, s ); + + if ( c == 0 ) + a = 0x7FFFFFFFUL; + + else if ( a + b <= 129894UL - ( c >> 17 ) ) + a = ( a * b + ( c >> 1 ) ) / c; + + else + { + FT_Int64 temp, temp2; + + + ft_multo64( a, b, &temp ); + + temp2.hi = 0; + temp2.lo = c >> 1; + + FT_Add64( &temp, &temp2, &temp ); + + /* last attempt to ditch long division */ + a = ( temp.hi == 0 ) ? temp.lo / c + : ft_div64by32( temp.hi, temp.lo, c ); + } + + a_ = (FT_Long)a; + + return s < 0 ? NEG_LONG( a_ ) : a_; + } + + + FT_BASE_DEF( FT_Long ) + FT_MulDiv_No_Round( FT_Long a_, + FT_Long b_, + FT_Long c_ ) + { + FT_Int s = 1; + FT_UInt32 a, b, c; + + + /* XXX: this function does not allow 64-bit arguments */ + + a = (FT_UInt32)a_; + b = (FT_UInt32)b_; + c = (FT_UInt32)c_; + + FT_MOVE_SIGN( a_, a, s ); + FT_MOVE_SIGN( b_, b, s ); + FT_MOVE_SIGN( c_, c, s ); + + if ( c == 0 ) + a = 0x7FFFFFFFUL; + + else if ( a + b <= 131071UL ) + a = a * b / c; + + else + { + FT_Int64 temp; + + + ft_multo64( a, b, &temp ); + + /* last attempt to ditch long division */ + a = ( temp.hi == 0 ) ? temp.lo / c + : ft_div64by32( temp.hi, temp.lo, c ); + } + + a_ = (FT_Long)a; + + return s < 0 ? NEG_LONG( a_ ) : a_; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_MulFix( FT_Long a_, + FT_Long b_ ) + { +#ifdef FT_MULFIX_ASSEMBLER + + return FT_MULFIX_ASSEMBLER( a_, b_ ); + +#elif 0 + + /* + * This code is nonportable. See comment below. + * + * However, on a platform where right-shift of a signed quantity fills + * the leftmost bits by copying the sign bit, it might be faster. + */ + + FT_Long sa, sb; + FT_UInt32 a, b; + + + /* + * This is a clever way of converting a signed number `a' into its + * absolute value (stored back into `a') and its sign. The sign is + * stored in `sa'; 0 means `a' was positive or zero, and -1 means `a' + * was negative. (Similarly for `b' and `sb'). + * + * Unfortunately, it doesn't work (at least not portably). + * + * It makes the assumption that right-shift on a negative signed value + * fills the leftmost bits by copying the sign bit. This is wrong. + * According to K&R 2nd ed, section `A7.8 Shift Operators' on page 206, + * the result of right-shift of a negative signed value is + * implementation-defined. At least one implementation fills the + * leftmost bits with 0s (i.e., it is exactly the same as an unsigned + * right shift). This means that when `a' is negative, `sa' ends up + * with the value 1 rather than -1. After that, everything else goes + * wrong. + */ + sa = ( a_ >> ( sizeof ( a_ ) * 8 - 1 ) ); + a = ( a_ ^ sa ) - sa; + sb = ( b_ >> ( sizeof ( b_ ) * 8 - 1 ) ); + b = ( b_ ^ sb ) - sb; + + a = (FT_UInt32)a_; + b = (FT_UInt32)b_; + + if ( a + ( b >> 8 ) <= 8190UL ) + a = ( a * b + 0x8000U ) >> 16; + else + { + FT_UInt32 al = a & 0xFFFFUL; + + + a = ( a >> 16 ) * b + al * ( b >> 16 ) + + ( ( al * ( b & 0xFFFFUL ) + 0x8000UL ) >> 16 ); + } + + sa ^= sb; + a = ( a ^ sa ) - sa; + + return (FT_Long)a; + +#else /* 0 */ + + FT_Int s = 1; + FT_UInt32 a, b; + + + /* XXX: this function does not allow 64-bit arguments */ + + a = (FT_UInt32)a_; + b = (FT_UInt32)b_; + + FT_MOVE_SIGN( a_, a, s ); + FT_MOVE_SIGN( b_, b, s ); + + if ( a + ( b >> 8 ) <= 8190UL ) + a = ( a * b + 0x8000UL ) >> 16; + else + { + FT_UInt32 al = a & 0xFFFFUL; + + + a = ( a >> 16 ) * b + al * ( b >> 16 ) + + ( ( al * ( b & 0xFFFFUL ) + 0x8000UL ) >> 16 ); + } + + a_ = (FT_Long)a; + + return s < 0 ? NEG_LONG( a_ ) : a_; + +#endif /* 0 */ + + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_DivFix( FT_Long a_, + FT_Long b_ ) + { + FT_Int s = 1; + FT_UInt32 a, b, q; + FT_Long q_; + + + /* XXX: this function does not allow 64-bit arguments */ + + a = (FT_UInt32)a_; + b = (FT_UInt32)b_; + + FT_MOVE_SIGN( a_, a, s ); + FT_MOVE_SIGN( b_, b, s ); + + if ( b == 0 ) + { + /* check for division by 0 */ + q = 0x7FFFFFFFUL; + } + else if ( a <= 65535UL - ( b >> 17 ) ) + { + /* compute result directly */ + q = ( ( a << 16 ) + ( b >> 1 ) ) / b; + } + else + { + /* we need more bits; we have to do it by hand */ + FT_Int64 temp, temp2; + + + temp.hi = a >> 16; + temp.lo = a << 16; + temp2.hi = 0; + temp2.lo = b >> 1; + + FT_Add64( &temp, &temp2, &temp ); + q = ft_div64by32( temp.hi, temp.lo, b ); + } + + q_ = (FT_Long)q; + + return s < 0 ? NEG_LONG( q_ ) : q_; + } + + +#endif /* !FT_LONG64 */ + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Matrix_Multiply( const FT_Matrix* a, + FT_Matrix *b ) + { + FT_Fixed xx, xy, yx, yy; + + + if ( !a || !b ) + return; + + xx = ADD_LONG( FT_MulFix( a->xx, b->xx ), + FT_MulFix( a->xy, b->yx ) ); + xy = ADD_LONG( FT_MulFix( a->xx, b->xy ), + FT_MulFix( a->xy, b->yy ) ); + yx = ADD_LONG( FT_MulFix( a->yx, b->xx ), + FT_MulFix( a->yy, b->yx ) ); + yy = ADD_LONG( FT_MulFix( a->yx, b->xy ), + FT_MulFix( a->yy, b->yy ) ); + + b->xx = xx; + b->xy = xy; + b->yx = yx; + b->yy = yy; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Matrix_Invert( FT_Matrix* matrix ) + { + FT_Pos delta, xx, yy; + + + if ( !matrix ) + return FT_THROW( Invalid_Argument ); + + /* compute discriminant */ + delta = FT_MulFix( matrix->xx, matrix->yy ) - + FT_MulFix( matrix->xy, matrix->yx ); + + if ( !delta ) + return FT_THROW( Invalid_Argument ); /* matrix can't be inverted */ + + matrix->xy = - FT_DivFix( matrix->xy, delta ); + matrix->yx = - FT_DivFix( matrix->yx, delta ); + + xx = matrix->xx; + yy = matrix->yy; + + matrix->xx = FT_DivFix( yy, delta ); + matrix->yy = FT_DivFix( xx, delta ); + + return FT_Err_Ok; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( void ) + FT_Matrix_Multiply_Scaled( const FT_Matrix* a, + FT_Matrix *b, + FT_Long scaling ) + { + FT_Fixed xx, xy, yx, yy; + + FT_Long val = 0x10000L * scaling; + + + if ( !a || !b ) + return; + + xx = ADD_LONG( FT_MulDiv( a->xx, b->xx, val ), + FT_MulDiv( a->xy, b->yx, val ) ); + xy = ADD_LONG( FT_MulDiv( a->xx, b->xy, val ), + FT_MulDiv( a->xy, b->yy, val ) ); + yx = ADD_LONG( FT_MulDiv( a->yx, b->xx, val ), + FT_MulDiv( a->yy, b->yx, val ) ); + yy = ADD_LONG( FT_MulDiv( a->yx, b->xy, val ), + FT_MulDiv( a->yy, b->yy, val ) ); + + b->xx = xx; + b->xy = xy; + b->yx = yx; + b->yy = yy; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( void ) + FT_Vector_Transform_Scaled( FT_Vector* vector, + const FT_Matrix* matrix, + FT_Long scaling ) + { + FT_Pos xz, yz; + + FT_Long val = 0x10000L * scaling; + + + if ( !vector || !matrix ) + return; + + xz = ADD_LONG( FT_MulDiv( vector->x, matrix->xx, val ), + FT_MulDiv( vector->y, matrix->xy, val ) ); + yz = ADD_LONG( FT_MulDiv( vector->x, matrix->yx, val ), + FT_MulDiv( vector->y, matrix->yy, val ) ); + + vector->x = xz; + vector->y = yz; + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_UInt32 ) + FT_Vector_NormLen( FT_Vector* vector ) + { + FT_Int32 x_ = vector->x; + FT_Int32 y_ = vector->y; + FT_Int32 b, z; + FT_UInt32 x, y, u, v, l; + FT_Int sx = 1, sy = 1, shift; + + + x = (FT_UInt32)x_; + y = (FT_UInt32)y_; + + FT_MOVE_SIGN( x_, x, sx ); + FT_MOVE_SIGN( y_, y, sy ); + + /* trivial cases */ + if ( x == 0 ) + { + if ( y > 0 ) + vector->y = sy * 0x10000; + return y; + } + else if ( y == 0 ) + { + if ( x > 0 ) + vector->x = sx * 0x10000; + return x; + } + + /* Estimate length and prenormalize by shifting so that */ + /* the new approximate length is between 2/3 and 4/3. */ + /* The magic constant 0xAAAAAAAAUL (2/3 of 2^32) helps */ + /* achieve this in 16.16 fixed-point representation. */ + l = x > y ? x + ( y >> 1 ) + : y + ( x >> 1 ); + + shift = 31 - FT_MSB( l ); + shift -= 15 + ( l >= ( 0xAAAAAAAAUL >> shift ) ); + + if ( shift > 0 ) + { + x <<= shift; + y <<= shift; + + /* re-estimate length for tiny vectors */ + l = x > y ? x + ( y >> 1 ) + : y + ( x >> 1 ); + } + else + { + x >>= -shift; + y >>= -shift; + l >>= -shift; + } + + /* lower linear approximation for reciprocal length minus one */ + b = 0x10000 - (FT_Int32)l; + + x_ = (FT_Int32)x; + y_ = (FT_Int32)y; + + /* Newton's iterations */ + do + { + u = (FT_UInt32)( x_ + ( x_ * b >> 16 ) ); + v = (FT_UInt32)( y_ + ( y_ * b >> 16 ) ); + + /* Normalized squared length in the parentheses approaches 2^32. */ + /* On two's complement systems, converting to signed gives the */ + /* difference with 2^32 even if the expression wraps around. */ + z = -(FT_Int32)( u * u + v * v ) / 0x200; + z = z * ( ( 0x10000 + b ) >> 8 ) / 0x10000; + + b += z; + + } while ( z > 0 ); + + vector->x = sx < 0 ? -(FT_Pos)u : (FT_Pos)u; + vector->y = sy < 0 ? -(FT_Pos)v : (FT_Pos)v; + + /* Conversion to signed helps to recover from likely wrap around */ + /* in calculating the prenormalized length, because it gives the */ + /* correct difference with 2^32 on two's complement systems. */ + l = (FT_UInt32)( 0x10000 + (FT_Int32)( u * x + v * y ) / 0x10000 ); + if ( shift > 0 ) + l = ( l + ( 1 << ( shift - 1 ) ) ) >> shift; + else + l <<= -shift; + + return l; + } + + +#if 0 + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int32 ) + FT_SqrtFixed( FT_Int32 x ) + { + FT_UInt32 root, rem_hi, rem_lo, test_div; + FT_Int count; + + + root = 0; + + if ( x > 0 ) + { + rem_hi = 0; + rem_lo = (FT_UInt32)x; + count = 24; + do + { + rem_hi = ( rem_hi << 2 ) | ( rem_lo >> 30 ); + rem_lo <<= 2; + root <<= 1; + test_div = ( root << 1 ) + 1; + + if ( rem_hi >= test_div ) + { + rem_hi -= test_div; + root += 1; + } + } while ( --count ); + } + + return (FT_Int32)root; + } + +#endif /* 0 */ + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int ) + ft_corner_orientation( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ) + { +#ifdef FT_LONG64 + + FT_Int64 delta = (FT_Int64)in_x * out_y - (FT_Int64)in_y * out_x; + + + return ( delta > 0 ) - ( delta < 0 ); + +#else + + FT_Int result; + + + /* we silently ignore overflow errors, since such large values */ + /* lead to even more (harmless) rendering errors later on */ + if ( ADD_LONG( FT_ABS( in_x ), FT_ABS( out_y ) ) <= 131071L && + ADD_LONG( FT_ABS( in_y ), FT_ABS( out_x ) ) <= 131071L ) + { + FT_Long z1 = MUL_LONG( in_x, out_y ); + FT_Long z2 = MUL_LONG( in_y, out_x ); + + + if ( z1 > z2 ) + result = +1; + else if ( z1 < z2 ) + result = -1; + else + result = 0; + } + else /* products might overflow 32 bits */ + { + FT_Int64 z1, z2; + + + /* XXX: this function does not allow 64-bit arguments */ + ft_multo64( (FT_UInt32)in_x, (FT_UInt32)out_y, &z1 ); + ft_multo64( (FT_UInt32)in_y, (FT_UInt32)out_x, &z2 ); + + if ( z1.hi > z2.hi ) + result = +1; + else if ( z1.hi < z2.hi ) + result = -1; + else if ( z1.lo > z2.lo ) + result = +1; + else if ( z1.lo < z2.lo ) + result = -1; + else + result = 0; + } + + /* XXX: only the sign of return value, +1/0/-1 must be used */ + return result; + +#endif + } + + + /* documentation is in ftcalc.h */ + + FT_BASE_DEF( FT_Int ) + ft_corner_is_flat( FT_Pos in_x, + FT_Pos in_y, + FT_Pos out_x, + FT_Pos out_y ) + { + FT_Pos ax = in_x + out_x; + FT_Pos ay = in_y + out_y; + + FT_Pos d_in, d_out, d_hypot; + + + /* The idea of this function is to compare the length of the */ + /* hypotenuse with the `in' and `out' length. The `corner' */ + /* represented by `in' and `out' is flat if the hypotenuse's */ + /* length isn't too large. */ + /* */ + /* This approach has the advantage that the angle between */ + /* `in' and `out' is not checked. In case one of the two */ + /* vectors is `dominant', this is, much larger than the */ + /* other vector, we thus always have a flat corner. */ + /* */ + /* hypotenuse */ + /* x---------------------------x */ + /* \ / */ + /* \ / */ + /* in \ / out */ + /* \ / */ + /* o */ + /* Point */ + + d_in = FT_HYPOT( in_x, in_y ); + d_out = FT_HYPOT( out_x, out_y ); + d_hypot = FT_HYPOT( ax, ay ); + + /* now do a simple length comparison: */ + /* */ + /* d_in + d_out < 17/16 d_hypot */ + + return ( d_in + d_out - d_hypot ) < ( d_hypot >> 4 ); + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftcid.c b/vendor/FreeType2/src/base/ftcid.c new file mode 100644 index 0000000..f518464 --- /dev/null +++ b/vendor/FreeType2/src/base/ftcid.c @@ -0,0 +1,118 @@ +/***************************************************************************/ +/* */ +/* ftcid.c */ +/* */ +/* FreeType API for accessing CID font information. */ +/* */ +/* Copyright 2007-2018 by */ +/* Derek Clegg and Michael Toftdal. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_CID_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_CID_H + + + /* documentation is in ftcid.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_CID_Registry_Ordering_Supplement( FT_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement) + { + FT_Error error; + const char* r = NULL; + const char* o = NULL; + FT_Int s = 0; + + + error = FT_ERR( Invalid_Argument ); + + if ( face ) + { + FT_Service_CID service; + + + FT_FACE_FIND_SERVICE( face, service, CID ); + + if ( service && service->get_ros ) + error = service->get_ros( face, &r, &o, &s ); + } + + if ( registry ) + *registry = r; + + if ( ordering ) + *ordering = o; + + if ( supplement ) + *supplement = s; + + return error; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Get_CID_Is_Internally_CID_Keyed( FT_Face face, + FT_Bool *is_cid ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + FT_Bool ic = 0; + + + if ( face ) + { + FT_Service_CID service; + + + FT_FACE_FIND_SERVICE( face, service, CID ); + + if ( service && service->get_is_cid ) + error = service->get_is_cid( face, &ic); + } + + if ( is_cid ) + *is_cid = ic; + + return error; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Get_CID_From_Glyph_Index( FT_Face face, + FT_UInt glyph_index, + FT_UInt *cid ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + FT_UInt c = 0; + + + if ( face ) + { + FT_Service_CID service; + + + FT_FACE_FIND_SERVICE( face, service, CID ); + + if ( service && service->get_cid_from_glyph_index ) + error = service->get_cid_from_glyph_index( face, glyph_index, &c); + } + + if ( cid ) + *cid = c; + + return error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftdbgmem.c b/vendor/FreeType2/src/base/ftdbgmem.c new file mode 100644 index 0000000..c33d8ac --- /dev/null +++ b/vendor/FreeType2/src/base/ftdbgmem.c @@ -0,0 +1,999 @@ +/***************************************************************************/ +/* */ +/* ftdbgmem.c */ +/* */ +/* Memory debugger (body). */ +/* */ +/* Copyright 2001-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_MEMORY_H +#include FT_SYSTEM_H +#include FT_ERRORS_H +#include FT_TYPES_H + + +#ifdef FT_DEBUG_MEMORY + +#define KEEPALIVE /* `Keep alive' means that freed blocks aren't released + * to the heap. This is useful to detect double-frees + * or weird heap corruption, but it uses large amounts of + * memory, however. + */ + +#include FT_CONFIG_STANDARD_LIBRARY_H + + FT_BASE_DEF( const char* ) _ft_debug_file = NULL; + FT_BASE_DEF( long ) _ft_debug_lineno = 0; + + extern void + FT_DumpMemory( FT_Memory memory ); + + + typedef struct FT_MemSourceRec_* FT_MemSource; + typedef struct FT_MemNodeRec_* FT_MemNode; + typedef struct FT_MemTableRec_* FT_MemTable; + + +#define FT_MEM_VAL( addr ) ( (FT_PtrDist)(FT_Pointer)( addr ) ) + + /* + * This structure holds statistics for a single allocation/release + * site. This is useful to know where memory operations happen the + * most. + */ + typedef struct FT_MemSourceRec_ + { + const char* file_name; + long line_no; + + FT_Long cur_blocks; /* current number of allocated blocks */ + FT_Long max_blocks; /* max. number of allocated blocks */ + FT_Long all_blocks; /* total number of blocks allocated */ + + FT_Long cur_size; /* current cumulative allocated size */ + FT_Long max_size; /* maximum cumulative allocated size */ + FT_Long all_size; /* total cumulative allocated size */ + + FT_Long cur_max; /* current maximum allocated size */ + + FT_UInt32 hash; + FT_MemSource link; + + } FT_MemSourceRec; + + + /* + * We don't need a resizable array for the memory sources because + * their number is pretty limited within FreeType. + */ +#define FT_MEM_SOURCE_BUCKETS 128 + + /* + * This structure holds information related to a single allocated + * memory block. If KEEPALIVE is defined, blocks that are freed by + * FreeType are never released to the system. Instead, their `size' + * field is set to `-size'. This is mainly useful to detect double + * frees, at the price of a large memory footprint during execution. + */ + typedef struct FT_MemNodeRec_ + { + FT_Byte* address; + FT_Long size; /* < 0 if the block was freed */ + + FT_MemSource source; + +#ifdef KEEPALIVE + const char* free_file_name; + FT_Long free_line_no; +#endif + + FT_MemNode link; + + } FT_MemNodeRec; + + + /* + * The global structure, containing compound statistics and all hash + * tables. + */ + typedef struct FT_MemTableRec_ + { + FT_Long size; + FT_Long nodes; + FT_MemNode* buckets; + + FT_Long alloc_total; + FT_Long alloc_current; + FT_Long alloc_max; + FT_Long alloc_count; + + FT_Bool bound_total; + FT_Long alloc_total_max; + + FT_Bool bound_count; + FT_Long alloc_count_max; + + FT_MemSource sources[FT_MEM_SOURCE_BUCKETS]; + + FT_Bool keep_alive; + + FT_Memory memory; + FT_Pointer memory_user; + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + + } FT_MemTableRec; + + +#define FT_MEM_SIZE_MIN 7 +#define FT_MEM_SIZE_MAX 13845163 + +#define FT_FILENAME( x ) ( (x) ? (x) : "unknown file" ) + + + /* + * Prime numbers are ugly to handle. It would be better to implement + * L-Hashing, which is 10% faster and doesn't require divisions. + */ + static const FT_Int ft_mem_primes[] = + { + 7, + 11, + 19, + 37, + 73, + 109, + 163, + 251, + 367, + 557, + 823, + 1237, + 1861, + 2777, + 4177, + 6247, + 9371, + 14057, + 21089, + 31627, + 47431, + 71143, + 106721, + 160073, + 240101, + 360163, + 540217, + 810343, + 1215497, + 1823231, + 2734867, + 4102283, + 6153409, + 9230113, + 13845163, + }; + + + static FT_Long + ft_mem_closest_prime( FT_Long num ) + { + size_t i; + + + for ( i = 0; + i < sizeof ( ft_mem_primes ) / sizeof ( ft_mem_primes[0] ); i++ ) + if ( ft_mem_primes[i] > num ) + return ft_mem_primes[i]; + + return FT_MEM_SIZE_MAX; + } + + + static void + ft_mem_debug_panic( const char* fmt, + ... ) + { + va_list ap; + + + printf( "FreeType.Debug: " ); + + va_start( ap, fmt ); + vprintf( fmt, ap ); + va_end( ap ); + + printf( "\n" ); + exit( EXIT_FAILURE ); + } + + + static FT_Pointer + ft_mem_table_alloc( FT_MemTable table, + FT_Long size ) + { + FT_Memory memory = table->memory; + FT_Pointer block; + + + memory->user = table->memory_user; + block = table->alloc( memory, size ); + memory->user = table; + + return block; + } + + + static void + ft_mem_table_free( FT_MemTable table, + FT_Pointer block ) + { + FT_Memory memory = table->memory; + + + memory->user = table->memory_user; + table->free( memory, block ); + memory->user = table; + } + + + static void + ft_mem_table_resize( FT_MemTable table ) + { + FT_Long new_size; + + + new_size = ft_mem_closest_prime( table->nodes ); + if ( new_size != table->size ) + { + FT_MemNode* new_buckets; + FT_Long i; + + + new_buckets = (FT_MemNode *) + ft_mem_table_alloc( + table, + new_size * (FT_Long)sizeof ( FT_MemNode ) ); + if ( !new_buckets ) + return; + + FT_ARRAY_ZERO( new_buckets, new_size ); + + for ( i = 0; i < table->size; i++ ) + { + FT_MemNode node, next, *pnode; + FT_PtrDist hash; + + + node = table->buckets[i]; + while ( node ) + { + next = node->link; + hash = FT_MEM_VAL( node->address ) % (FT_PtrDist)new_size; + pnode = new_buckets + hash; + + node->link = pnode[0]; + pnode[0] = node; + + node = next; + } + } + + if ( table->buckets ) + ft_mem_table_free( table, table->buckets ); + + table->buckets = new_buckets; + table->size = new_size; + } + } + + + static FT_MemTable + ft_mem_table_new( FT_Memory memory ) + { + FT_MemTable table; + + + table = (FT_MemTable)memory->alloc( memory, sizeof ( *table ) ); + if ( !table ) + goto Exit; + + FT_ZERO( table ); + + table->size = FT_MEM_SIZE_MIN; + table->nodes = 0; + + table->memory = memory; + + table->memory_user = memory->user; + + table->alloc = memory->alloc; + table->realloc = memory->realloc; + table->free = memory->free; + + table->buckets = (FT_MemNode *) + memory->alloc( + memory, + table->size * (FT_Long)sizeof ( FT_MemNode ) ); + if ( table->buckets ) + FT_ARRAY_ZERO( table->buckets, table->size ); + else + { + memory->free( memory, table ); + table = NULL; + } + + Exit: + return table; + } + + + static void + ft_mem_table_destroy( FT_MemTable table ) + { + FT_Long i; + FT_Long leak_count = 0; + FT_Long leaks = 0; + + + FT_DumpMemory( table->memory ); + + /* remove all blocks from the table, revealing leaked ones */ + for ( i = 0; i < table->size; i++ ) + { + FT_MemNode *pnode = table->buckets + i, next, node = *pnode; + + + while ( node ) + { + next = node->link; + node->link = NULL; + + if ( node->size > 0 ) + { + printf( + "leaked memory block at address %p, size %8ld in (%s:%ld)\n", + (void*)node->address, + node->size, + FT_FILENAME( node->source->file_name ), + node->source->line_no ); + + leak_count++; + leaks += node->size; + + ft_mem_table_free( table, node->address ); + } + + node->address = NULL; + node->size = 0; + + ft_mem_table_free( table, node ); + node = next; + } + table->buckets[i] = NULL; + } + + ft_mem_table_free( table, table->buckets ); + table->buckets = NULL; + + table->size = 0; + table->nodes = 0; + + /* remove all sources */ + for ( i = 0; i < FT_MEM_SOURCE_BUCKETS; i++ ) + { + FT_MemSource source, next; + + + for ( source = table->sources[i]; source != NULL; source = next ) + { + next = source->link; + ft_mem_table_free( table, source ); + } + + table->sources[i] = NULL; + } + + printf( "FreeType: total memory allocations = %ld\n", + table->alloc_total ); + printf( "FreeType: maximum memory footprint = %ld\n", + table->alloc_max ); + + ft_mem_table_free( table, table ); + + if ( leak_count > 0 ) + ft_mem_debug_panic( + "FreeType: %ld bytes of memory leaked in %ld blocks\n", + leaks, leak_count ); + + printf( "FreeType: no memory leaks detected\n" ); + } + + + static FT_MemNode* + ft_mem_table_get_nodep( FT_MemTable table, + FT_Byte* address ) + { + FT_PtrDist hash; + FT_MemNode *pnode, node; + + + hash = FT_MEM_VAL( address ); + pnode = table->buckets + ( hash % (FT_PtrDist)table->size ); + + for (;;) + { + node = pnode[0]; + if ( !node ) + break; + + if ( node->address == address ) + break; + + pnode = &node->link; + } + return pnode; + } + + + static FT_MemSource + ft_mem_table_get_source( FT_MemTable table ) + { + FT_UInt32 hash; + FT_MemSource node, *pnode; + + + /* cast to FT_PtrDist first since void* can be larger */ + /* than FT_UInt32 and GCC 4.1.1 emits a warning */ + hash = (FT_UInt32)(FT_PtrDist)(void*)_ft_debug_file + + (FT_UInt32)( 5 * _ft_debug_lineno ); + pnode = &table->sources[hash % FT_MEM_SOURCE_BUCKETS]; + + for (;;) + { + node = *pnode; + if ( !node ) + break; + + if ( node->file_name == _ft_debug_file && + node->line_no == _ft_debug_lineno ) + goto Exit; + + pnode = &node->link; + } + + node = (FT_MemSource)ft_mem_table_alloc( table, sizeof ( *node ) ); + if ( !node ) + ft_mem_debug_panic( + "not enough memory to perform memory debugging\n" ); + + node->file_name = _ft_debug_file; + node->line_no = _ft_debug_lineno; + + node->cur_blocks = 0; + node->max_blocks = 0; + node->all_blocks = 0; + + node->cur_size = 0; + node->max_size = 0; + node->all_size = 0; + + node->cur_max = 0; + + node->link = NULL; + node->hash = hash; + *pnode = node; + + Exit: + return node; + } + + + static void + ft_mem_table_set( FT_MemTable table, + FT_Byte* address, + FT_Long size, + FT_Long delta ) + { + FT_MemNode *pnode, node; + + + if ( table ) + { + FT_MemSource source; + + + pnode = ft_mem_table_get_nodep( table, address ); + node = *pnode; + if ( node ) + { + if ( node->size < 0 ) + { + /* This block was already freed. Our memory is now completely */ + /* corrupted! */ + /* This can only happen in keep-alive mode. */ + ft_mem_debug_panic( + "memory heap corrupted (allocating freed block)" ); + } + else + { + /* This block was already allocated. This means that our memory */ + /* is also corrupted! */ + ft_mem_debug_panic( + "memory heap corrupted (re-allocating allocated block at" + " %p, of size %ld)\n" + "org=%s:%d new=%s:%d\n", + node->address, node->size, + FT_FILENAME( node->source->file_name ), node->source->line_no, + FT_FILENAME( _ft_debug_file ), _ft_debug_lineno ); + } + } + + /* we need to create a new node in this table */ + node = (FT_MemNode)ft_mem_table_alloc( table, sizeof ( *node ) ); + if ( !node ) + ft_mem_debug_panic( "not enough memory to run memory tests" ); + + node->address = address; + node->size = size; + node->source = source = ft_mem_table_get_source( table ); + + if ( delta == 0 ) + { + /* this is an allocation */ + source->all_blocks++; + source->cur_blocks++; + if ( source->cur_blocks > source->max_blocks ) + source->max_blocks = source->cur_blocks; + } + + if ( size > source->cur_max ) + source->cur_max = size; + + if ( delta != 0 ) + { + /* we are growing or shrinking a reallocated block */ + source->cur_size += delta; + table->alloc_current += delta; + } + else + { + /* we are allocating a new block */ + source->cur_size += size; + table->alloc_current += size; + } + + source->all_size += size; + + if ( source->cur_size > source->max_size ) + source->max_size = source->cur_size; + + node->free_file_name = NULL; + node->free_line_no = 0; + + node->link = pnode[0]; + + pnode[0] = node; + table->nodes++; + + table->alloc_total += size; + + if ( table->alloc_current > table->alloc_max ) + table->alloc_max = table->alloc_current; + + if ( table->nodes * 3 < table->size || + table->size * 3 < table->nodes ) + ft_mem_table_resize( table ); + } + } + + + static void + ft_mem_table_remove( FT_MemTable table, + FT_Byte* address, + FT_Long delta ) + { + if ( table ) + { + FT_MemNode *pnode, node; + + + pnode = ft_mem_table_get_nodep( table, address ); + node = *pnode; + if ( node ) + { + FT_MemSource source; + + + if ( node->size < 0 ) + ft_mem_debug_panic( + "freeing memory block at %p more than once at (%s:%ld)\n" + "block allocated at (%s:%ld) and released at (%s:%ld)", + address, + FT_FILENAME( _ft_debug_file ), _ft_debug_lineno, + FT_FILENAME( node->source->file_name ), node->source->line_no, + FT_FILENAME( node->free_file_name ), node->free_line_no ); + + /* scramble the node's content for additional safety */ + FT_MEM_SET( address, 0xF3, node->size ); + + if ( delta == 0 ) + { + source = node->source; + + source->cur_blocks--; + source->cur_size -= node->size; + + table->alloc_current -= node->size; + } + + if ( table->keep_alive ) + { + /* we simply invert the node's size to indicate that the node */ + /* was freed. */ + node->size = -node->size; + node->free_file_name = _ft_debug_file; + node->free_line_no = _ft_debug_lineno; + } + else + { + table->nodes--; + + *pnode = node->link; + + node->size = 0; + node->source = NULL; + + ft_mem_table_free( table, node ); + + if ( table->nodes * 3 < table->size || + table->size * 3 < table->nodes ) + ft_mem_table_resize( table ); + } + } + else + ft_mem_debug_panic( + "trying to free unknown block at %p in (%s:%ld)\n", + address, + FT_FILENAME( _ft_debug_file ), _ft_debug_lineno ); + } + } + + + static FT_Pointer + ft_mem_debug_alloc( FT_Memory memory, + FT_Long size ) + { + FT_MemTable table = (FT_MemTable)memory->user; + FT_Byte* block; + + + if ( size <= 0 ) + ft_mem_debug_panic( "negative block size allocation (%ld)", size ); + + /* return NULL if the maximum number of allocations was reached */ + if ( table->bound_count && + table->alloc_count >= table->alloc_count_max ) + return NULL; + + /* return NULL if this allocation would overflow the maximum heap size */ + if ( table->bound_total && + table->alloc_total_max - table->alloc_current > size ) + return NULL; + + block = (FT_Byte *)ft_mem_table_alloc( table, size ); + if ( block ) + { + ft_mem_table_set( table, block, size, 0 ); + + table->alloc_count++; + } + + _ft_debug_file = ""; + _ft_debug_lineno = 0; + + return (FT_Pointer)block; + } + + + static void + ft_mem_debug_free( FT_Memory memory, + FT_Pointer block ) + { + FT_MemTable table = (FT_MemTable)memory->user; + + + if ( !block ) + ft_mem_debug_panic( "trying to free NULL in (%s:%ld)", + FT_FILENAME( _ft_debug_file ), + _ft_debug_lineno ); + + ft_mem_table_remove( table, (FT_Byte*)block, 0 ); + + if ( !table->keep_alive ) + ft_mem_table_free( table, block ); + + table->alloc_count--; + + _ft_debug_file = ""; + _ft_debug_lineno = 0; + } + + + static FT_Pointer + ft_mem_debug_realloc( FT_Memory memory, + FT_Long cur_size, + FT_Long new_size, + FT_Pointer block ) + { + FT_MemTable table = (FT_MemTable)memory->user; + FT_MemNode node, *pnode; + FT_Pointer new_block; + FT_Long delta; + + const char* file_name = FT_FILENAME( _ft_debug_file ); + FT_Long line_no = _ft_debug_lineno; + + + /* unlikely, but possible */ + if ( new_size == cur_size ) + return block; + + /* the following is valid according to ANSI C */ +#if 0 + if ( !block || !cur_size ) + ft_mem_debug_panic( "trying to reallocate NULL in (%s:%ld)", + file_name, line_no ); +#endif + + /* while the following is allowed in ANSI C also, we abort since */ + /* such case should be handled by FreeType. */ + if ( new_size <= 0 ) + ft_mem_debug_panic( + "trying to reallocate %p to size 0 (current is %ld) in (%s:%ld)", + block, cur_size, file_name, line_no ); + + /* check `cur_size' value */ + pnode = ft_mem_table_get_nodep( table, (FT_Byte*)block ); + node = *pnode; + if ( !node ) + ft_mem_debug_panic( + "trying to reallocate unknown block at %p in (%s:%ld)", + block, file_name, line_no ); + + if ( node->size <= 0 ) + ft_mem_debug_panic( + "trying to reallocate freed block at %p in (%s:%ld)", + block, file_name, line_no ); + + if ( node->size != cur_size ) + ft_mem_debug_panic( "invalid ft_realloc request for %p. cur_size is " + "%ld instead of %ld in (%s:%ld)", + block, cur_size, node->size, file_name, line_no ); + + /* return NULL if the maximum number of allocations was reached */ + if ( table->bound_count && + table->alloc_count >= table->alloc_count_max ) + return NULL; + + delta = new_size - cur_size; + + /* return NULL if this allocation would overflow the maximum heap size */ + if ( delta > 0 && + table->bound_total && + table->alloc_current + delta > table->alloc_total_max ) + return NULL; + + new_block = (FT_Pointer)ft_mem_table_alloc( table, new_size ); + if ( !new_block ) + return NULL; + + ft_mem_table_set( table, (FT_Byte*)new_block, new_size, delta ); + + ft_memcpy( new_block, block, cur_size < new_size ? (size_t)cur_size + : (size_t)new_size ); + + ft_mem_table_remove( table, (FT_Byte*)block, delta ); + + _ft_debug_file = ""; + _ft_debug_lineno = 0; + + if ( !table->keep_alive ) + ft_mem_table_free( table, block ); + + return new_block; + } + + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ) + { + FT_MemTable table; + FT_Int result = 0; + + + if ( ft_getenv( "FT2_DEBUG_MEMORY" ) ) + { + table = ft_mem_table_new( memory ); + if ( table ) + { + const char* p; + + + memory->user = table; + memory->alloc = ft_mem_debug_alloc; + memory->realloc = ft_mem_debug_realloc; + memory->free = ft_mem_debug_free; + + p = ft_getenv( "FT2_ALLOC_TOTAL_MAX" ); + if ( p ) + { + FT_Long total_max = ft_strtol( p, NULL, 10 ); + + + if ( total_max > 0 ) + { + table->bound_total = 1; + table->alloc_total_max = total_max; + } + } + + p = ft_getenv( "FT2_ALLOC_COUNT_MAX" ); + if ( p ) + { + FT_Long total_count = ft_strtol( p, NULL, 10 ); + + + if ( total_count > 0 ) + { + table->bound_count = 1; + table->alloc_count_max = total_count; + } + } + + p = ft_getenv( "FT2_KEEP_ALIVE" ); + if ( p ) + { + FT_Long keep_alive = ft_strtol( p, NULL, 10 ); + + + if ( keep_alive > 0 ) + table->keep_alive = 1; + } + + result = 1; + } + } + return result; + } + + + extern void + ft_mem_debug_done( FT_Memory memory ) + { + FT_MemTable table = (FT_MemTable)memory->user; + + + if ( table ) + { + memory->free = table->free; + memory->realloc = table->realloc; + memory->alloc = table->alloc; + + ft_mem_table_destroy( table ); + memory->user = NULL; + } + } + + + static int + ft_mem_source_compare( const void* p1, + const void* p2 ) + { + FT_MemSource s1 = *(FT_MemSource*)p1; + FT_MemSource s2 = *(FT_MemSource*)p2; + + + if ( s2->max_size > s1->max_size ) + return 1; + else if ( s2->max_size < s1->max_size ) + return -1; + else + return 0; + } + + + extern void + FT_DumpMemory( FT_Memory memory ) + { + FT_MemTable table = (FT_MemTable)memory->user; + + + if ( table ) + { + FT_MemSource* bucket = table->sources; + FT_MemSource* limit = bucket + FT_MEM_SOURCE_BUCKETS; + FT_MemSource* sources; + FT_Int nn, count; + const char* fmt; + + + count = 0; + for ( ; bucket < limit; bucket++ ) + { + FT_MemSource source = *bucket; + + + for ( ; source; source = source->link ) + count++; + } + + sources = (FT_MemSource*) + ft_mem_table_alloc( + table, count * (FT_Long)sizeof ( *sources ) ); + + count = 0; + for ( bucket = table->sources; bucket < limit; bucket++ ) + { + FT_MemSource source = *bucket; + + + for ( ; source; source = source->link ) + sources[count++] = source; + } + + ft_qsort( sources, + (size_t)count, + sizeof ( *sources ), + ft_mem_source_compare ); + + printf( "FreeType Memory Dump: " + "current=%ld max=%ld total=%ld count=%ld\n", + table->alloc_current, table->alloc_max, + table->alloc_total, table->alloc_count ); + printf( " block block sizes sizes sizes source\n" ); + printf( " count high sum highsum max location\n" ); + printf( "-------------------------------------------------\n" ); + + fmt = "%6ld %6ld %8ld %8ld %8ld %s:%d\n"; + + for ( nn = 0; nn < count; nn++ ) + { + FT_MemSource source = sources[nn]; + + + printf( fmt, + source->cur_blocks, source->max_blocks, + source->cur_size, source->max_size, source->cur_max, + FT_FILENAME( source->file_name ), + source->line_no ); + } + printf( "------------------------------------------------\n" ); + + ft_mem_table_free( table, sources ); + } + } + +#else /* !FT_DEBUG_MEMORY */ + + /* ANSI C doesn't like empty source files */ + typedef int _debug_mem_dummy; + +#endif /* !FT_DEBUG_MEMORY */ + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftdebug.c b/vendor/FreeType2/src/base/ftdebug.c new file mode 100644 index 0000000..fe26309 --- /dev/null +++ b/vendor/FreeType2/src/base/ftdebug.c @@ -0,0 +1,266 @@ +/***************************************************************************/ +/* */ +/* ftdebug.c */ +/* */ +/* Debugging and logging component (body). */ +/* */ +/* Copyright 1996-2018 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 component contains various macros and functions used to ease the */ + /* debugging of the FreeType engine. Its main purpose is in assertion */ + /* checking, tracing, and error detection. */ + /* */ + /* There are now three debugging modes: */ + /* */ + /* - trace mode */ + /* */ + /* Error and trace messages are sent to the log file (which can be the */ + /* standard error output). */ + /* */ + /* - error mode */ + /* */ + /* Only error messages are generated. */ + /* */ + /* - release mode: */ + /* */ + /* No error message is sent or generated. The code is free from any */ + /* debugging parts. */ + /* */ + /*************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_DEBUG_H + + +#ifdef FT_DEBUG_LEVEL_ERROR + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Message( const char* fmt, + ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( void ) + FT_Panic( const char* fmt, + ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + + exit( EXIT_FAILURE ); + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( int ) + FT_Throw( FT_Error error, + int line, + const char* file ) + { + FT_UNUSED( error ); + FT_UNUSED( line ); + FT_UNUSED( file ); + + return 0; + } + +#endif /* FT_DEBUG_LEVEL_ERROR */ + + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* array of trace levels, initialized to 0 */ + int ft_trace_levels[trace_count]; + + + /* define array of trace toggle names */ +#define FT_TRACE_DEF( x ) #x , + + static const char* ft_trace_toggles[trace_count + 1] = + { +#include FT_INTERNAL_TRACE_H + NULL + }; + +#undef FT_TRACE_DEF + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return trace_count; + } + + + /* documentation is in ftdebug.h */ + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + int max = FT_Trace_Get_Count(); + + + if ( idx < max ) + return ft_trace_toggles[idx]; + else + return NULL; + } + + + /*************************************************************************/ + /* */ + /* Initialize the tracing sub-system. This is done by retrieving the */ + /* value of the `FT2_DEBUG' environment variable. It must be a list of */ + /* toggles, separated by spaces, `;', or `,'. Example: */ + /* */ + /* export FT2_DEBUG="any:3 memory:7 stream:5" */ + /* */ + /* This requests that all levels be set to 3, except the trace level for */ + /* the memory and stream components which are set to 7 and 5, */ + /* respectively. */ + /* */ + /* See the file `include/freetype/internal/fttrace.h' for details of */ + /* the available toggle names. */ + /* */ + /* The level must be between 0 and 7; 0 means quiet (except for serious */ + /* runtime errors), and 7 means _very_ verbose. */ + /* */ + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + const char* ft2_debug = ft_getenv( "FT2_DEBUG" ); + + + if ( ft2_debug ) + { + const char* p = ft2_debug; + const char* q; + + + for ( ; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' || *p == ',' || *p == ';' || *p == '=' ) + continue; + + /* read toggle name, followed by ':' */ + q = p; + while ( *p && *p != ':' ) + p++; + + if ( !*p ) + break; + + if ( *p == ':' && p > q ) + { + FT_Int n, i, len = (FT_Int)( p - q ); + FT_Int level = -1, found = -1; + + + for ( n = 0; n < trace_count; n++ ) + { + const char* toggle = ft_trace_toggles[n]; + + + for ( i = 0; i < len; i++ ) + { + if ( toggle[i] != q[i] ) + break; + } + + if ( i == len && toggle[i] == 0 ) + { + found = n; + break; + } + } + + /* read level */ + p++; + if ( *p ) + { + level = *p - '0'; + if ( level < 0 || level > 7 ) + level = -1; + } + + if ( found >= 0 && level >= 0 ) + { + if ( found == trace_any ) + { + /* special case for `any' */ + for ( n = 0; n < trace_count; n++ ) + ft_trace_levels[n] = level; + } + else + ft_trace_levels[found] = level; + } + } + } + } + } + + +#else /* !FT_DEBUG_LEVEL_TRACE */ + + + FT_BASE_DEF( void ) + ft_debug_init( void ) + { + /* nothing */ + } + + + FT_BASE_DEF( FT_Int ) + FT_Trace_Get_Count( void ) + { + return 0; + } + + + FT_BASE_DEF( const char * ) + FT_Trace_Get_Name( FT_Int idx ) + { + FT_UNUSED( idx ); + + return NULL; + } + + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftfntfmt.c b/vendor/FreeType2/src/base/ftfntfmt.c new file mode 100644 index 0000000..a2900ce --- /dev/null +++ b/vendor/FreeType2/src/base/ftfntfmt.c @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* ftfntfmt.c */ +/* */ +/* FreeType utility file for font formats (body). */ +/* */ +/* Copyright 2002-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FONT_FORMATS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_FONT_FORMAT_H + + + /* documentation is in ftfntfmt.h */ + + FT_EXPORT_DEF( const char* ) + FT_Get_Font_Format( FT_Face face ) + { + const char* result = NULL; + + + if ( face ) + FT_FACE_FIND_SERVICE( face, result, FONT_FORMAT ); + + return result; + } + + + /* deprecated function name; retained for ABI compatibility */ + + FT_EXPORT_DEF( const char* ) + FT_Get_X11_Font_Format( FT_Face face ) + { + const char* result = NULL; + + + if ( face ) + FT_FACE_FIND_SERVICE( face, result, FONT_FORMAT ); + + return result; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftfstype.c b/vendor/FreeType2/src/base/ftfstype.c new file mode 100644 index 0000000..e6cdf6e --- /dev/null +++ b/vendor/FreeType2/src/base/ftfstype.c @@ -0,0 +1,62 @@ +/***************************************************************************/ +/* */ +/* ftfstype.c */ +/* */ +/* FreeType utility file to access FSType data (body). */ +/* */ +/* Copyright 2008-2018 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. */ +/* */ +/***************************************************************************/ + +#include +#include FT_TYPE1_TABLES_H +#include FT_TRUETYPE_TABLES_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_POSTSCRIPT_INFO_H + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UShort ) + FT_Get_FSType_Flags( FT_Face face ) + { + TT_OS2* os2; + + + /* first, try to get the fs_type directly from the font */ + if ( face ) + { + FT_Service_PsInfo service = NULL; + + + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_get_font_extra ) + { + PS_FontExtraRec extra; + + + if ( !service->ps_get_font_extra( face, &extra ) && + extra.fs_type != 0 ) + return extra.fs_type; + } + } + + /* look at FSType before fsType for Type42 */ + + if ( ( os2 = (TT_OS2*)FT_Get_Sfnt_Table( face, FT_SFNT_OS2 ) ) != NULL && + os2->version != 0xFFFFU ) + return os2->fsType; + + return 0; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftgasp.c b/vendor/FreeType2/src/base/ftgasp.c new file mode 100644 index 0000000..4f80bba --- /dev/null +++ b/vendor/FreeType2/src/base/ftgasp.c @@ -0,0 +1,61 @@ +/***************************************************************************/ +/* */ +/* ftgasp.c */ +/* */ +/* Access of TrueType's `gasp' table (body). */ +/* */ +/* Copyright 2007-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_GASP_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + + FT_EXPORT_DEF( FT_Int ) + FT_Get_Gasp( FT_Face face, + FT_UInt ppem ) + { + FT_Int result = FT_GASP_NO_TABLE; + + + if ( face && FT_IS_SFNT( face ) ) + { + TT_Face ttface = (TT_Face)face; + + + if ( ttface->gasp.numRanges > 0 ) + { + TT_GaspRange range = ttface->gasp.gaspRanges; + TT_GaspRange range_end = range + ttface->gasp.numRanges; + + + while ( ppem > range->maxPPEM ) + { + range++; + if ( range >= range_end ) + goto Exit; + } + + result = range->gaspFlag; + + /* ensure that we don't have spurious bits */ + if ( ttface->gasp.version == 0 ) + result &= 3; + } + } + Exit: + return result; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftgloadr.c b/vendor/FreeType2/src/base/ftgloadr.c new file mode 100644 index 0000000..4720249 --- /dev/null +++ b/vendor/FreeType2/src/base/ftgloadr.c @@ -0,0 +1,406 @@ +/***************************************************************************/ +/* */ +/* ftgloadr.c */ +/* */ +/* The FreeType glyph loader (body). */ +/* */ +/* Copyright 2002-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_GLYPH_LOADER_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_OBJECTS_H + +#undef FT_COMPONENT +#define FT_COMPONENT trace_gloader + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** *****/ + /***** G L Y P H L O A D E R *****/ + /***** *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* The glyph loader is a simple object which is used to load a set of */ + /* glyphs easily. It is critical for the correct loading of composites. */ + /* */ + /* Ideally, one can see it as a stack of abstract `glyph' objects. */ + /* */ + /* loader.base Is really the bottom of the stack. It describes a */ + /* single glyph image made of the juxtaposition of */ + /* several glyphs (those `in the stack'). */ + /* */ + /* loader.current Describes the top of the stack, on which a new */ + /* glyph can be loaded. */ + /* */ + /* Rewind Clears the stack. */ + /* Prepare Set up `loader.current' for addition of a new glyph */ + /* image. */ + /* Add Add the `current' glyph image to the `base' one, */ + /* and prepare for another one. */ + /* */ + /* The glyph loader is now a base object. Each driver used to */ + /* re-implement it in one way or the other, which wasted code and */ + /* energy. */ + /* */ + /*************************************************************************/ + + + /* create a new glyph loader */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_New( FT_Memory memory, + FT_GlyphLoader *aloader ) + { + FT_GlyphLoader loader = NULL; + FT_Error error; + + + if ( !FT_NEW( loader ) ) + { + loader->memory = memory; + *aloader = loader; + } + return error; + } + + + /* rewind the glyph loader - reset counters to 0 */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Rewind( FT_GlyphLoader loader ) + { + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + base->outline.n_points = 0; + base->outline.n_contours = 0; + base->num_subglyphs = 0; + + *current = *base; + } + + + /* reset the glyph loader, frees all allocated tables */ + /* and starts from zero */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Reset( FT_GlyphLoader loader ) + { + FT_Memory memory = loader->memory; + + + FT_FREE( loader->base.outline.points ); + FT_FREE( loader->base.outline.tags ); + FT_FREE( loader->base.outline.contours ); + FT_FREE( loader->base.extra_points ); + FT_FREE( loader->base.subglyphs ); + + loader->base.extra_points2 = NULL; + + loader->max_points = 0; + loader->max_contours = 0; + loader->max_subglyphs = 0; + + FT_GlyphLoader_Rewind( loader ); + } + + + /* delete a glyph loader */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Done( FT_GlyphLoader loader ) + { + if ( loader ) + { + FT_Memory memory = loader->memory; + + + FT_GlyphLoader_Reset( loader ); + FT_FREE( loader ); + } + } + + + /* re-adjust the `current' outline fields */ + static void + FT_GlyphLoader_Adjust_Points( FT_GlyphLoader loader ) + { + FT_Outline* base = &loader->base.outline; + FT_Outline* current = &loader->current.outline; + + + current->points = base->points + base->n_points; + current->tags = base->tags + base->n_points; + current->contours = base->contours + base->n_contours; + + /* handle extra points table - if any */ + if ( loader->use_extra ) + { + loader->current.extra_points = loader->base.extra_points + + base->n_points; + + loader->current.extra_points2 = loader->base.extra_points2 + + base->n_points; + } + } + + + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CreateExtra( FT_GlyphLoader loader ) + { + FT_Error error; + FT_Memory memory = loader->memory; + + + if ( !FT_NEW_ARRAY( loader->base.extra_points, 2 * loader->max_points ) ) + { + loader->use_extra = 1; + loader->base.extra_points2 = loader->base.extra_points + + loader->max_points; + + FT_GlyphLoader_Adjust_Points( loader ); + } + return error; + } + + + /* re-adjust the `current' subglyphs field */ + static void + FT_GlyphLoader_Adjust_Subglyphs( FT_GlyphLoader loader ) + { + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + current->subglyphs = base->subglyphs + base->num_subglyphs; + } + + + /* Ensure that we can add `n_points' and `n_contours' to our glyph. */ + /* This function reallocates its outline tables if necessary. Note that */ + /* it DOESN'T change the number of points within the loader! */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CheckPoints( FT_GlyphLoader loader, + FT_UInt n_points, + FT_UInt n_contours ) + { + FT_Memory memory = loader->memory; + FT_Error error = FT_Err_Ok; + FT_Outline* base = &loader->base.outline; + FT_Outline* current = &loader->current.outline; + FT_Bool adjust = 0; + + FT_UInt new_max, old_max; + + + /* check points & tags */ + new_max = (FT_UInt)base->n_points + (FT_UInt)current->n_points + + n_points; + old_max = loader->max_points; + + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 8 ); + + if ( new_max > FT_OUTLINE_POINTS_MAX ) + return FT_THROW( Array_Too_Large ); + + if ( FT_RENEW_ARRAY( base->points, old_max, new_max ) || + FT_RENEW_ARRAY( base->tags, old_max, new_max ) ) + goto Exit; + + if ( loader->use_extra ) + { + if ( FT_RENEW_ARRAY( loader->base.extra_points, + old_max * 2, new_max * 2 ) ) + goto Exit; + + FT_ARRAY_MOVE( loader->base.extra_points + new_max, + loader->base.extra_points + old_max, + old_max ); + + loader->base.extra_points2 = loader->base.extra_points + new_max; + } + + adjust = 1; + loader->max_points = new_max; + } + + /* check contours */ + old_max = loader->max_contours; + new_max = (FT_UInt)base->n_contours + (FT_UInt)current->n_contours + + n_contours; + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 4 ); + + if ( new_max > FT_OUTLINE_CONTOURS_MAX ) + return FT_THROW( Array_Too_Large ); + + if ( FT_RENEW_ARRAY( base->contours, old_max, new_max ) ) + goto Exit; + + adjust = 1; + loader->max_contours = new_max; + } + + if ( adjust ) + FT_GlyphLoader_Adjust_Points( loader ); + + Exit: + if ( error ) + FT_GlyphLoader_Reset( loader ); + + return error; + } + + + /* Ensure that we can add `n_subglyphs' to our glyph. this function */ + /* reallocates its subglyphs table if necessary. Note that it DOES */ + /* NOT change the number of subglyphs within the loader! */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CheckSubGlyphs( FT_GlyphLoader loader, + FT_UInt n_subs ) + { + FT_Memory memory = loader->memory; + FT_Error error = FT_Err_Ok; + FT_UInt new_max, old_max; + + FT_GlyphLoad base = &loader->base; + FT_GlyphLoad current = &loader->current; + + + new_max = base->num_subglyphs + current->num_subglyphs + n_subs; + old_max = loader->max_subglyphs; + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 2 ); + if ( FT_RENEW_ARRAY( base->subglyphs, old_max, new_max ) ) + goto Exit; + + loader->max_subglyphs = new_max; + + FT_GlyphLoader_Adjust_Subglyphs( loader ); + } + + Exit: + return error; + } + + + /* prepare loader for the addition of a new glyph on top of the base one */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Prepare( FT_GlyphLoader loader ) + { + FT_GlyphLoad current = &loader->current; + + + current->outline.n_points = 0; + current->outline.n_contours = 0; + current->num_subglyphs = 0; + + FT_GlyphLoader_Adjust_Points ( loader ); + FT_GlyphLoader_Adjust_Subglyphs( loader ); + } + + + /* add current glyph to the base image -- and prepare for another */ + FT_BASE_DEF( void ) + FT_GlyphLoader_Add( FT_GlyphLoader loader ) + { + FT_GlyphLoad base; + FT_GlyphLoad current; + + FT_Int n_curr_contours; + FT_Int n_base_points; + FT_Int n; + + + if ( !loader ) + return; + + base = &loader->base; + current = &loader->current; + + n_curr_contours = current->outline.n_contours; + n_base_points = base->outline.n_points; + + base->outline.n_points = + (short)( base->outline.n_points + current->outline.n_points ); + base->outline.n_contours = + (short)( base->outline.n_contours + current->outline.n_contours ); + + base->num_subglyphs += current->num_subglyphs; + + /* adjust contours count in newest outline */ + for ( n = 0; n < n_curr_contours; n++ ) + current->outline.contours[n] = + (short)( current->outline.contours[n] + n_base_points ); + + /* prepare for another new glyph image */ + FT_GlyphLoader_Prepare( loader ); + } + + + FT_BASE_DEF( FT_Error ) + FT_GlyphLoader_CopyPoints( FT_GlyphLoader target, + FT_GlyphLoader source ) + { + FT_Error error; + FT_UInt num_points = (FT_UInt)source->base.outline.n_points; + FT_UInt num_contours = (FT_UInt)source->base.outline.n_contours; + + + error = FT_GlyphLoader_CheckPoints( target, num_points, num_contours ); + if ( !error ) + { + FT_Outline* out = &target->base.outline; + FT_Outline* in = &source->base.outline; + + + FT_ARRAY_COPY( out->points, in->points, + num_points ); + FT_ARRAY_COPY( out->tags, in->tags, + num_points ); + FT_ARRAY_COPY( out->contours, in->contours, + num_contours ); + + /* do we need to copy the extra points? */ + if ( target->use_extra && source->use_extra ) + { + FT_ARRAY_COPY( target->base.extra_points, source->base.extra_points, + num_points ); + FT_ARRAY_COPY( target->base.extra_points2, source->base.extra_points2, + num_points ); + } + + out->n_points = (short)num_points; + out->n_contours = (short)num_contours; + + FT_GlyphLoader_Adjust_Points( target ); + } + + return error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftglyph.c b/vendor/FreeType2/src/base/ftglyph.c new file mode 100644 index 0000000..6759aa2 --- /dev/null +++ b/vendor/FreeType2/src/base/ftglyph.c @@ -0,0 +1,649 @@ +/***************************************************************************/ +/* */ +/* ftglyph.c */ +/* */ +/* FreeType convenience functions to handle glyphs (body). */ +/* */ +/* Copyright 1996-2018 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 file contains the definition of several convenience functions */ + /* that can be used by client applications to easily retrieve glyph */ + /* bitmaps and outlines from a given face. */ + /* */ + /* These functions should be optional if you are writing a font server */ + /* or text layout engine on top of FreeType. However, they are pretty */ + /* handy for many other simple uses of the library. */ + /* */ + /*************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H + +#include FT_GLYPH_H +#include FT_OUTLINE_H +#include FT_BITMAP_H +#include FT_INTERNAL_OBJECTS_H + +#include "basepic.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_glyph + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_BitmapGlyph support ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( FT_Error ) + ft_bitmap_glyph_init( FT_Glyph bitmap_glyph, + FT_GlyphSlot slot ) + { + FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; + FT_Error error = FT_Err_Ok; + FT_Library library = FT_GLYPH( glyph )->library; + + + if ( slot->format != FT_GLYPH_FORMAT_BITMAP ) + { + error = FT_THROW( Invalid_Glyph_Format ); + goto Exit; + } + + glyph->left = slot->bitmap_left; + glyph->top = slot->bitmap_top; + + /* do lazy copying whenever possible */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + glyph->bitmap = slot->bitmap; + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + else + { + FT_Bitmap_Init( &glyph->bitmap ); + error = FT_Bitmap_Copy( library, &slot->bitmap, &glyph->bitmap ); + } + + Exit: + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_bitmap_glyph_copy( FT_Glyph bitmap_source, + FT_Glyph bitmap_target ) + { + FT_Library library = bitmap_source->library; + FT_BitmapGlyph source = (FT_BitmapGlyph)bitmap_source; + FT_BitmapGlyph target = (FT_BitmapGlyph)bitmap_target; + + + target->left = source->left; + target->top = source->top; + + return FT_Bitmap_Copy( library, &source->bitmap, &target->bitmap ); + } + + + FT_CALLBACK_DEF( void ) + ft_bitmap_glyph_done( FT_Glyph bitmap_glyph ) + { + FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; + FT_Library library = FT_GLYPH( glyph )->library; + + + FT_Bitmap_Done( library, &glyph->bitmap ); + } + + + FT_CALLBACK_DEF( void ) + ft_bitmap_glyph_bbox( FT_Glyph bitmap_glyph, + FT_BBox* cbox ) + { + FT_BitmapGlyph glyph = (FT_BitmapGlyph)bitmap_glyph; + + + cbox->xMin = glyph->left * 64; + cbox->xMax = cbox->xMin + (FT_Pos)( glyph->bitmap.width * 64 ); + cbox->yMax = glyph->top * 64; + cbox->yMin = cbox->yMax - (FT_Pos)( glyph->bitmap.rows * 64 ); + } + + + FT_DEFINE_GLYPH( + ft_bitmap_glyph_class, + + sizeof ( FT_BitmapGlyphRec ), + FT_GLYPH_FORMAT_BITMAP, + + ft_bitmap_glyph_init, /* FT_Glyph_InitFunc glyph_init */ + ft_bitmap_glyph_done, /* FT_Glyph_DoneFunc glyph_done */ + ft_bitmap_glyph_copy, /* FT_Glyph_CopyFunc glyph_copy */ + NULL, /* FT_Glyph_TransformFunc glyph_transform */ + ft_bitmap_glyph_bbox, /* FT_Glyph_GetBBoxFunc glyph_bbox */ + NULL /* FT_Glyph_PrepareFunc glyph_prepare */ + ) + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_OutlineGlyph support ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_Error ) + ft_outline_glyph_init( FT_Glyph outline_glyph, + FT_GlyphSlot slot ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + FT_Error error = FT_Err_Ok; + FT_Library library = FT_GLYPH( glyph )->library; + FT_Outline* source = &slot->outline; + FT_Outline* target = &glyph->outline; + + + /* check format in glyph slot */ + if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) + { + error = FT_THROW( Invalid_Glyph_Format ); + goto Exit; + } + + /* allocate new outline */ + error = FT_Outline_New( library, + (FT_UInt)source->n_points, + source->n_contours, + &glyph->outline ); + if ( error ) + goto Exit; + + FT_Outline_Copy( source, target ); + + Exit: + return error; + } + + + FT_CALLBACK_DEF( void ) + ft_outline_glyph_done( FT_Glyph outline_glyph ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + FT_Outline_Done( FT_GLYPH( glyph )->library, &glyph->outline ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_outline_glyph_copy( FT_Glyph outline_source, + FT_Glyph outline_target ) + { + FT_OutlineGlyph source = (FT_OutlineGlyph)outline_source; + FT_OutlineGlyph target = (FT_OutlineGlyph)outline_target; + FT_Error error; + FT_Library library = FT_GLYPH( source )->library; + + + error = FT_Outline_New( library, + (FT_UInt)source->outline.n_points, + source->outline.n_contours, + &target->outline ); + if ( !error ) + FT_Outline_Copy( &source->outline, &target->outline ); + + return error; + } + + + FT_CALLBACK_DEF( void ) + ft_outline_glyph_transform( FT_Glyph outline_glyph, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + if ( matrix ) + FT_Outline_Transform( &glyph->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &glyph->outline, delta->x, delta->y ); + } + + + FT_CALLBACK_DEF( void ) + ft_outline_glyph_bbox( FT_Glyph outline_glyph, + FT_BBox* bbox ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + FT_Outline_Get_CBox( &glyph->outline, bbox ); + } + + + FT_CALLBACK_DEF( FT_Error ) + ft_outline_glyph_prepare( FT_Glyph outline_glyph, + FT_GlyphSlot slot ) + { + FT_OutlineGlyph glyph = (FT_OutlineGlyph)outline_glyph; + + + slot->format = FT_GLYPH_FORMAT_OUTLINE; + slot->outline = glyph->outline; + slot->outline.flags &= ~FT_OUTLINE_OWNER; + + return FT_Err_Ok; + } + + + FT_DEFINE_GLYPH( + ft_outline_glyph_class, + + sizeof ( FT_OutlineGlyphRec ), + FT_GLYPH_FORMAT_OUTLINE, + + ft_outline_glyph_init, /* FT_Glyph_InitFunc glyph_init */ + ft_outline_glyph_done, /* FT_Glyph_DoneFunc glyph_done */ + ft_outline_glyph_copy, /* FT_Glyph_CopyFunc glyph_copy */ + ft_outline_glyph_transform, /* FT_Glyph_TransformFunc glyph_transform */ + ft_outline_glyph_bbox, /* FT_Glyph_GetBBoxFunc glyph_bbox */ + ft_outline_glyph_prepare /* FT_Glyph_PrepareFunc glyph_prepare */ + ) + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** FT_Glyph class and API ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + ft_new_glyph( FT_Library library, + const FT_Glyph_Class* clazz, + FT_Glyph* aglyph ) + { + FT_Memory memory = library->memory; + FT_Error error; + FT_Glyph glyph = NULL; + + + *aglyph = NULL; + + if ( !FT_ALLOC( glyph, clazz->glyph_size ) ) + { + glyph->library = library; + glyph->clazz = clazz; + glyph->format = clazz->glyph_format; + + *aglyph = glyph; + } + + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Copy( FT_Glyph source, + FT_Glyph *target ) + { + FT_Glyph copy; + FT_Error error; + const FT_Glyph_Class* clazz; + + + /* check arguments */ + if ( !target || !source || !source->clazz ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + *target = NULL; + + if ( !source || !source->clazz ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + clazz = source->clazz; + error = ft_new_glyph( source->library, clazz, © ); + if ( error ) + goto Exit; + + copy->advance = source->advance; + copy->format = source->format; + + if ( clazz->glyph_copy ) + error = clazz->glyph_copy( source, copy ); + + if ( error ) + FT_Done_Glyph( copy ); + else + *target = copy; + + Exit: + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Glyph( FT_GlyphSlot slot, + FT_Glyph *aglyph ) + { + FT_Library library; + FT_Error error; + FT_Glyph glyph; + + const FT_Glyph_Class* clazz = NULL; + + + if ( !slot ) + return FT_THROW( Invalid_Slot_Handle ); + + library = slot->library; + + if ( !aglyph ) + return FT_THROW( Invalid_Argument ); + + /* if it is a bitmap, that's easy :-) */ + if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) + clazz = FT_BITMAP_GLYPH_CLASS_GET; + + /* if it is an outline */ + else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + clazz = FT_OUTLINE_GLYPH_CLASS_GET; + + else + { + /* try to find a renderer that supports the glyph image format */ + FT_Renderer render = FT_Lookup_Renderer( library, slot->format, 0 ); + + + if ( render ) + clazz = &render->glyph_class; + } + + if ( !clazz ) + { + error = FT_THROW( Invalid_Glyph_Format ); + goto Exit; + } + + /* create FT_Glyph object */ + error = ft_new_glyph( library, clazz, &glyph ); + if ( error ) + goto Exit; + + /* copy advance while converting 26.6 to 16.16 format */ + if ( slot->advance.x >= 0x8000L * 64 || + slot->advance.x <= -0x8000L * 64 ) + { + FT_ERROR(( "FT_Get_Glyph: advance width too large\n" )); + error = FT_THROW( Invalid_Argument ); + goto Exit2; + } + if ( slot->advance.y >= 0x8000L * 64 || + slot->advance.y <= -0x8000L * 64 ) + { + FT_ERROR(( "FT_Get_Glyph: advance height too large\n" )); + error = FT_THROW( Invalid_Argument ); + goto Exit2; + } + + glyph->advance.x = slot->advance.x * 1024; + glyph->advance.y = slot->advance.y * 1024; + + /* now import the image from the glyph slot */ + error = clazz->glyph_init( glyph, slot ); + + Exit2: + /* if an error occurred, destroy the glyph */ + if ( error ) + FT_Done_Glyph( glyph ); + else + *aglyph = glyph; + + Exit: + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Transform( FT_Glyph glyph, + FT_Matrix* matrix, + FT_Vector* delta ) + { + FT_Error error = FT_Err_Ok; + + + if ( !glyph || !glyph->clazz ) + error = FT_THROW( Invalid_Argument ); + else + { + const FT_Glyph_Class* clazz = glyph->clazz; + + + if ( clazz->glyph_transform ) + { + /* transform glyph image */ + clazz->glyph_transform( glyph, matrix, delta ); + + /* transform advance vector */ + if ( matrix ) + FT_Vector_Transform( &glyph->advance, matrix ); + } + else + error = FT_THROW( Invalid_Glyph_Format ); + } + return error; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Glyph_Get_CBox( FT_Glyph glyph, + FT_UInt bbox_mode, + FT_BBox *acbox ) + { + const FT_Glyph_Class* clazz; + + + if ( !acbox ) + return; + + acbox->xMin = acbox->yMin = acbox->xMax = acbox->yMax = 0; + + if ( !glyph || !glyph->clazz ) + return; + + clazz = glyph->clazz; + if ( !clazz->glyph_bbox ) + return; + + /* retrieve bbox in 26.6 coordinates */ + clazz->glyph_bbox( glyph, acbox ); + + /* perform grid fitting if needed */ + if ( bbox_mode == FT_GLYPH_BBOX_GRIDFIT || + bbox_mode == FT_GLYPH_BBOX_PIXELS ) + { + acbox->xMin = FT_PIX_FLOOR( acbox->xMin ); + acbox->yMin = FT_PIX_FLOOR( acbox->yMin ); + acbox->xMax = FT_PIX_CEIL( acbox->xMax ); + acbox->yMax = FT_PIX_CEIL( acbox->yMax ); + } + + /* convert to integer pixels if needed */ + if ( bbox_mode == FT_GLYPH_BBOX_TRUNCATE || + bbox_mode == FT_GLYPH_BBOX_PIXELS ) + { + acbox->xMin >>= 6; + acbox->yMin >>= 6; + acbox->xMax >>= 6; + acbox->yMax >>= 6; + } + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_To_Bitmap( FT_Glyph* the_glyph, + FT_Render_Mode render_mode, + FT_Vector* origin, + FT_Bool destroy ) + { + FT_GlyphSlotRec dummy; + FT_GlyphSlot_InternalRec dummy_internal; + FT_Error error = FT_Err_Ok; + FT_Glyph b, glyph; + FT_BitmapGlyph bitmap = NULL; + const FT_Glyph_Class* clazz; + + /* FT_BITMAP_GLYPH_CLASS_GET dereferences `library' in PIC mode */ + FT_Library library; + + + /* check argument */ + if ( !the_glyph ) + goto Bad; + glyph = *the_glyph; + if ( !glyph ) + goto Bad; + + clazz = glyph->clazz; + library = glyph->library; + if ( !library || !clazz ) + goto Bad; + + /* when called with a bitmap glyph, do nothing and return successfully */ + if ( clazz == FT_BITMAP_GLYPH_CLASS_GET ) + goto Exit; + + if ( !clazz->glyph_prepare ) + goto Bad; + + /* we render the glyph into a glyph bitmap using a `dummy' glyph slot */ + /* then calling FT_Render_Glyph_Internal() */ + + FT_ZERO( &dummy ); + FT_ZERO( &dummy_internal ); + dummy.internal = &dummy_internal; + dummy.library = library; + dummy.format = clazz->glyph_format; + + /* create result bitmap glyph */ + error = ft_new_glyph( library, FT_BITMAP_GLYPH_CLASS_GET, &b ); + if ( error ) + goto Exit; + bitmap = (FT_BitmapGlyph)b; + +#if 1 + /* if `origin' is set, translate the glyph image */ + if ( origin ) + FT_Glyph_Transform( glyph, 0, origin ); +#else + FT_UNUSED( origin ); +#endif + + /* prepare dummy slot for rendering */ + error = clazz->glyph_prepare( glyph, &dummy ); + if ( !error ) + error = FT_Render_Glyph_Internal( glyph->library, &dummy, render_mode ); + +#if 1 + if ( !destroy && origin ) + { + FT_Vector v; + + + v.x = -origin->x; + v.y = -origin->y; + FT_Glyph_Transform( glyph, 0, &v ); + } +#endif + + if ( error ) + goto Exit; + + /* in case of success, copy the bitmap to the glyph bitmap */ + error = ft_bitmap_glyph_init( (FT_Glyph)bitmap, &dummy ); + if ( error ) + goto Exit; + + /* copy advance */ + bitmap->root.advance = glyph->advance; + + if ( destroy ) + FT_Done_Glyph( glyph ); + + *the_glyph = FT_GLYPH( bitmap ); + + Exit: + if ( error && bitmap ) + FT_Done_Glyph( FT_GLYPH( bitmap ) ); + + return error; + + Bad: + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + + /* documentation is in ftglyph.h */ + + FT_EXPORT_DEF( void ) + FT_Done_Glyph( FT_Glyph glyph ) + { + if ( glyph ) + { + FT_Memory memory = glyph->library->memory; + const FT_Glyph_Class* clazz = glyph->clazz; + + + if ( clazz->glyph_done ) + clazz->glyph_done( glyph ); + + FT_FREE( glyph ); + } + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftgxval.c b/vendor/FreeType2/src/base/ftgxval.c new file mode 100644 index 0000000..19e2d6a --- /dev/null +++ b/vendor/FreeType2/src/base/ftgxval.c @@ -0,0 +1,142 @@ +/***************************************************************************/ +/* */ +/* ftgxval.c */ +/* */ +/* FreeType API for validating TrueTypeGX/AAT tables (body). */ +/* */ +/* Copyright 2004-2018 by */ +/* Masatake YAMATO, Redhat K.K, */ +/* 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. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* */ +/* gxvalid is derived from both gxlayout module and otvalid module. */ +/* Development of gxlayout is supported by the Information-technology */ +/* Promotion Agency(IPA), Japan. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H + +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_GX_VALIDATE_H + + + /* documentation is in ftgxval.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_TrueTypeGX_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes tables[FT_VALIDATE_GX_LENGTH], + FT_UInt table_length ) + { + FT_Service_GXvalidate service; + FT_Error error; + + + if ( !face ) + { + error = FT_THROW( Invalid_Face_Handle ); + goto Exit; + } + + if ( !tables ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, service, GX_VALIDATE ); + + if ( service ) + error = service->validate( face, + validation_flags, + tables, + table_length ); + else + error = FT_THROW( Unimplemented_Feature ); + + Exit: + return error; + } + + + FT_EXPORT_DEF( void ) + FT_TrueTypeGX_Free( FT_Face face, + FT_Bytes table ) + { + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + + FT_FREE( table ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_ClassicKern_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *ckern_table ) + { + FT_Service_CKERNvalidate service; + FT_Error error; + + + if ( !face ) + { + error = FT_THROW( Invalid_Face_Handle ); + goto Exit; + } + + if ( !ckern_table ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, service, CLASSICKERN_VALIDATE ); + + if ( service ) + error = service->validate( face, + validation_flags, + ckern_table ); + else + error = FT_THROW( Unimplemented_Feature ); + + Exit: + return error; + } + + + FT_EXPORT_DEF( void ) + FT_ClassicKern_Free( FT_Face face, + FT_Bytes table ) + { + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + + + FT_FREE( table ); + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/fthash.c b/vendor/FreeType2/src/base/fthash.c new file mode 100644 index 0000000..21bc8dd --- /dev/null +++ b/vendor/FreeType2/src/base/fthash.c @@ -0,0 +1,339 @@ +/***************************************************************************/ +/* */ +/* fthash.c */ +/* */ +/* Hashing functions (body). */ +/* */ +/***************************************************************************/ + +/* + * Copyright 2000 Computing Research Labs, New Mexico State University + * Copyright 2001-2015 + * 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. + */ + + /*************************************************************************/ + /* */ + /* This file is based on code from bdf.c,v 1.22 2000/03/16 20:08:50 */ + /* */ + /* taken from Mark Leisher's xmbdfed package */ + /* */ + /*************************************************************************/ + + +#include +#include FT_INTERNAL_HASH_H +#include FT_INTERNAL_MEMORY_H + + +#define INITIAL_HT_SIZE 241 + + + static FT_ULong + hash_str_lookup( FT_Hashkey* key ) + { + const char* kp = key->str; + FT_ULong res = 0; + + + /* Mocklisp hash function. */ + while ( *kp ) + res = ( res << 5 ) - res + (FT_ULong)*kp++; + + return res; + } + + + static FT_ULong + hash_num_lookup( FT_Hashkey* key ) + { + FT_ULong num = (FT_ULong)key->num; + FT_ULong res; + + + /* Mocklisp hash function. */ + res = num & 0xFF; + res = ( res << 5 ) - res + ( ( num >> 8 ) & 0xFF ); + res = ( res << 5 ) - res + ( ( num >> 16 ) & 0xFF ); + res = ( res << 5 ) - res + ( ( num >> 24 ) & 0xFF ); + + return res; + } + + + static FT_Bool + hash_str_compare( FT_Hashkey* a, + FT_Hashkey* b ) + { + if ( a->str[0] == b->str[0] && + ft_strcmp( a->str, b->str ) == 0 ) + return 1; + + return 0; + } + + + static FT_Bool + hash_num_compare( FT_Hashkey* a, + FT_Hashkey* b ) + { + if ( a->num == b->num ) + return 1; + + return 0; + } + + + static FT_Hashnode* + hash_bucket( FT_Hashkey key, + FT_Hash hash ) + { + FT_ULong res = 0; + FT_Hashnode* bp = hash->table; + FT_Hashnode* ndp; + + + res = (hash->lookup)( &key ); + + ndp = bp + ( res % hash->size ); + while ( *ndp ) + { + if ( (hash->compare)( &(*ndp)->key, &key ) ) + break; + + ndp--; + if ( ndp < bp ) + ndp = bp + ( hash->size - 1 ); + } + + return ndp; + } + + + static FT_Error + hash_rehash( FT_Hash hash, + FT_Memory memory ) + { + FT_Hashnode* obp = hash->table; + FT_Hashnode* bp; + FT_Hashnode* nbp; + + FT_UInt i, sz = hash->size; + FT_Error error = FT_Err_Ok; + + + hash->size <<= 1; + hash->limit = hash->size / 3; + + if ( FT_NEW_ARRAY( hash->table, hash->size ) ) + goto Exit; + + for ( i = 0, bp = obp; i < sz; i++, bp++ ) + { + if ( *bp ) + { + nbp = hash_bucket( (*bp)->key, hash ); + *nbp = *bp; + } + } + + FT_FREE( obp ); + + Exit: + return error; + } + + + static FT_Error + hash_init( FT_Hash hash, + FT_Bool is_num, + FT_Memory memory ) + { + FT_UInt sz = INITIAL_HT_SIZE; + FT_Error error; + + + hash->size = sz; + hash->limit = sz / 3; + hash->used = 0; + + if ( is_num ) + { + hash->lookup = hash_num_lookup; + hash->compare = hash_num_compare; + } + else + { + hash->lookup = hash_str_lookup; + hash->compare = hash_str_compare; + } + + FT_MEM_NEW_ARRAY( hash->table, sz ); + + return error; + } + + + FT_Error + ft_hash_str_init( FT_Hash hash, + FT_Memory memory ) + { + return hash_init( hash, 0, memory ); + } + + + FT_Error + ft_hash_num_init( FT_Hash hash, + FT_Memory memory ) + { + return hash_init( hash, 1, memory ); + } + + + void + ft_hash_str_free( FT_Hash hash, + FT_Memory memory ) + { + if ( hash ) + { + FT_UInt sz = hash->size; + FT_Hashnode* bp = hash->table; + FT_UInt i; + + + for ( i = 0; i < sz; i++, bp++ ) + FT_FREE( *bp ); + + FT_FREE( hash->table ); + } + } + + + /* `ft_hash_num_free' is the same as `ft_hash_str_free' */ + + + static FT_Error + hash_insert( FT_Hashkey key, + size_t data, + FT_Hash hash, + FT_Memory memory ) + { + FT_Hashnode nn; + FT_Hashnode* bp = hash_bucket( key, hash ); + FT_Error error = FT_Err_Ok; + + + nn = *bp; + if ( !nn ) + { + if ( FT_NEW( nn ) ) + goto Exit; + *bp = nn; + + nn->key = key; + nn->data = data; + + if ( hash->used >= hash->limit ) + { + error = hash_rehash( hash, memory ); + if ( error ) + goto Exit; + } + + hash->used++; + } + else + nn->data = data; + + Exit: + return error; + } + + + FT_Error + ft_hash_str_insert( const char* key, + size_t data, + FT_Hash hash, + FT_Memory memory ) + { + FT_Hashkey hk; + + + hk.str = key; + + return hash_insert( hk, data, hash, memory ); + } + + + FT_Error + ft_hash_num_insert( FT_Int num, + size_t data, + FT_Hash hash, + FT_Memory memory ) + { + FT_Hashkey hk; + + + hk.num = num; + + return hash_insert( hk, data, hash, memory ); + } + + + static size_t* + hash_lookup( FT_Hashkey key, + FT_Hash hash ) + { + FT_Hashnode* np = hash_bucket( key, hash ); + + + return (*np) ? &(*np)->data + : NULL; + } + + + size_t* + ft_hash_str_lookup( const char* key, + FT_Hash hash ) + { + FT_Hashkey hk; + + + hk.str = key; + + return hash_lookup( hk, hash ); + } + + + size_t* + ft_hash_num_lookup( FT_Int num, + FT_Hash hash ) + { + FT_Hashkey hk; + + + hk.num = num; + + return hash_lookup( hk, hash ); + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftinit.c b/vendor/FreeType2/src/base/ftinit.c new file mode 100644 index 0000000..1fa4721 --- /dev/null +++ b/vendor/FreeType2/src/base/ftinit.c @@ -0,0 +1,376 @@ +/***************************************************************************/ +/* */ +/* ftinit.c */ +/* */ +/* FreeType initialization layer (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* The purpose of this file is to implement the following two */ + /* functions: */ + /* */ + /* FT_Add_Default_Modules(): */ + /* This function is used to add the set of default modules to a */ + /* fresh new library object. The set is taken from the header file */ + /* `freetype/config/ftmodule.h'. See the document `FreeType 2.0 */ + /* Build System' for more information. */ + /* */ + /* FT_Init_FreeType(): */ + /* This function creates a system object for the current platform, */ + /* builds a library out of it, then calls FT_Default_Drivers(). */ + /* */ + /* Note that even if FT_Init_FreeType() uses the implementation of the */ + /* system object defined at build time, client applications are still */ + /* able to provide their own `ftsystem.c'. */ + /* */ + /*************************************************************************/ + + +#include +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_MODULE_H +#include "basepic.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_init + + +#ifndef FT_CONFIG_OPTION_PIC + + +#undef FT_USE_MODULE +#ifdef __cplusplus +#define FT_USE_MODULE( type, x ) extern "C" const type x; +#else +#define FT_USE_MODULE( type, x ) extern const type x; +#endif + +#include FT_CONFIG_MODULES_H + +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) (const FT_Module_Class*)&(x), + + static + const FT_Module_Class* const ft_default_modules[] = + { +#include FT_CONFIG_MODULES_H + 0 + }; + + +#else /* FT_CONFIG_OPTION_PIC */ + + +#ifdef __cplusplus +#define FT_EXTERNC extern "C" +#else +#define FT_EXTERNC extern +#endif + + /* declare the module's class creation/destruction functions */ +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) \ + FT_EXTERNC FT_Error \ + FT_Create_Class_ ## x( FT_Library library, \ + FT_Module_Class* *output_class ); \ + FT_EXTERNC void \ + FT_Destroy_Class_ ## x( FT_Library library, \ + FT_Module_Class* clazz ); + +#include FT_CONFIG_MODULES_H + + /* count all module classes */ +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) MODULE_CLASS_ ## x, + + enum + { +#include FT_CONFIG_MODULES_H + FT_NUM_MODULE_CLASSES + }; + + /* destroy all module classes */ +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) \ + if ( classes[i] ) \ + { \ + FT_Destroy_Class_ ## x( library, classes[i] ); \ + } \ + i++; + + + FT_BASE_DEF( void ) + ft_destroy_default_module_classes( FT_Library library ) + { + FT_Module_Class* *classes; + FT_Memory memory; + FT_UInt i; + BasePIC* pic_container = (BasePIC*)library->pic_container.base; + + + if ( !pic_container->default_module_classes ) + return; + + memory = library->memory; + classes = pic_container->default_module_classes; + i = 0; + +#include FT_CONFIG_MODULES_H + + FT_FREE( classes ); + pic_container->default_module_classes = NULL; + } + + + /* initialize all module classes and the pointer table */ +#undef FT_USE_MODULE +#define FT_USE_MODULE( type, x ) \ + error = FT_Create_Class_ ## x( library, &clazz ); \ + if ( error ) \ + goto Exit; \ + classes[i++] = clazz; + + + FT_BASE_DEF( FT_Error ) + ft_create_default_module_classes( FT_Library library ) + { + FT_Error error; + FT_Memory memory; + FT_Module_Class* *classes = NULL; + FT_Module_Class* clazz; + FT_UInt i; + BasePIC* pic_container = (BasePIC*)library->pic_container.base; + + + memory = library->memory; + + pic_container->default_module_classes = NULL; + + if ( FT_ALLOC( classes, sizeof ( FT_Module_Class* ) * + ( FT_NUM_MODULE_CLASSES + 1 ) ) ) + return error; + + /* initialize all pointers to 0, especially the last one */ + for ( i = 0; i < FT_NUM_MODULE_CLASSES; i++ ) + classes[i] = NULL; + classes[FT_NUM_MODULE_CLASSES] = NULL; + + i = 0; + +#include FT_CONFIG_MODULES_H + + Exit: + if ( error ) + ft_destroy_default_module_classes( library ); + else + pic_container->default_module_classes = classes; + + return error; + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( void ) + FT_Add_Default_Modules( FT_Library library ) + { + FT_Error error; + const FT_Module_Class* const* cur; + + + /* FT_DEFAULT_MODULES_GET dereferences `library' in PIC mode */ +#ifdef FT_CONFIG_OPTION_PIC + if ( !library ) + return; +#endif + + /* GCC 4.6 warns the type difference: + * FT_Module_Class** != const FT_Module_Class* const* + */ + cur = (const FT_Module_Class* const*)FT_DEFAULT_MODULES_GET; + + /* test for valid `library' delayed to FT_Add_Module() */ + while ( *cur ) + { + error = FT_Add_Module( library, *cur ); + /* notify errors, but don't stop */ + if ( error ) + FT_TRACE0(( "FT_Add_Default_Module:" + " Cannot install `%s', error = 0x%x\n", + (*cur)->module_name, error )); + cur++; + } + } + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + +#define MAX_LENGTH 128 + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Default_Properties( FT_Library library ) + { + const char* env; + const char* p; + const char* q; + + char module_name[MAX_LENGTH + 1]; + char property_name[MAX_LENGTH + 1]; + char property_value[MAX_LENGTH + 1]; + + int i; + + + env = ft_getenv( "FREETYPE_PROPERTIES" ); + if ( !env ) + return; + + for ( p = env; *p; p++ ) + { + /* skip leading whitespace and separators */ + if ( *p == ' ' || *p == '\t' ) + continue; + + /* read module name, followed by `:' */ + q = p; + for ( i = 0; i < MAX_LENGTH; i++ ) + { + if ( !*p || *p == ':' ) + break; + module_name[i] = *p++; + } + module_name[i] = '\0'; + + if ( !*p || *p != ':' || p == q ) + break; + + /* read property name, followed by `=' */ + q = ++p; + for ( i = 0; i < MAX_LENGTH; i++ ) + { + if ( !*p || *p == '=' ) + break; + property_name[i] = *p++; + } + property_name[i] = '\0'; + + if ( !*p || *p != '=' || p == q ) + break; + + /* read property value, followed by whitespace (if any) */ + q = ++p; + for ( i = 0; i < MAX_LENGTH; i++ ) + { + if ( !*p || *p == ' ' || *p == '\t' ) + break; + property_value[i] = *p++; + } + property_value[i] = '\0'; + + if ( !( *p == '\0' || *p == ' ' || *p == '\t' ) || p == q ) + break; + + /* we completely ignore errors */ + ft_property_string_set( library, + module_name, + property_name, + property_value ); + } + } + +#else + + FT_EXPORT_DEF( void ) + FT_Set_Default_Properties( FT_Library library ) + { + FT_UNUSED( library ); + } + +#endif + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Init_FreeType( FT_Library *alibrary ) + { + FT_Error error; + FT_Memory memory; + + + /* check of `alibrary' delayed to `FT_New_Library' */ + + /* First of all, allocate a new system object -- this function is part */ + /* of the system-specific component, i.e. `ftsystem.c'. */ + + memory = FT_New_Memory(); + if ( !memory ) + { + FT_ERROR(( "FT_Init_FreeType: cannot find memory manager\n" )); + return FT_THROW( Unimplemented_Feature ); + } + + /* build a library out of it, then fill it with the set of */ + /* default drivers. */ + + error = FT_New_Library( memory, alibrary ); + if ( error ) + FT_Done_Memory( memory ); + else + FT_Add_Default_Modules( *alibrary ); + + FT_Set_Default_Properties( *alibrary ); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_FreeType( FT_Library library ) + { + FT_Memory memory; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + memory = library->memory; + + /* Discard the library object */ + FT_Done_Library( library ); + + /* discard memory manager */ + FT_Done_Memory( memory ); + + return FT_Err_Ok; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftlcdfil.c b/vendor/FreeType2/src/base/ftlcdfil.c new file mode 100644 index 0000000..8d314df --- /dev/null +++ b/vendor/FreeType2/src/base/ftlcdfil.c @@ -0,0 +1,383 @@ +/***************************************************************************/ +/* */ +/* ftlcdfil.c */ +/* */ +/* FreeType API for color filtering of subpixel bitmap glyphs (body). */ +/* */ +/* Copyright 2006-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H + +#include FT_LCD_FILTER_H +#include FT_IMAGE_H +#include FT_INTERNAL_OBJECTS_H + + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + +/* define USE_LEGACY to implement the legacy filter */ +#define USE_LEGACY + +#define FT_SHIFTCLAMP( x ) ( x >>= 8, (FT_Byte)( x > 255 ? 255 : x ) ) + + + /* add padding according to filter weights */ + FT_BASE_DEF (void) + ft_lcd_padding( FT_Pos* Min, + FT_Pos* Max, + FT_GlyphSlot slot ) + { + FT_Byte* lcd_weights; + FT_Bitmap_LcdFilterFunc lcd_filter_func; + + + /* Per-face LCD filtering takes priority if set up. */ + if ( slot->face && slot->face->internal->lcd_filter_func ) + { + lcd_weights = slot->face->internal->lcd_weights; + lcd_filter_func = slot->face->internal->lcd_filter_func; + } + else + { + lcd_weights = slot->library->lcd_weights; + lcd_filter_func = slot->library->lcd_filter_func; + } + + if ( lcd_filter_func == ft_lcd_filter_fir ) + { + *Min -= lcd_weights[0] ? 43 : + lcd_weights[1] ? 22 : 0; + *Max += lcd_weights[4] ? 43 : + lcd_weights[3] ? 22 : 0; + } + } + + + /* FIR filter used by the default and light filters */ + FT_BASE_DEF( void ) + ft_lcd_filter_fir( FT_Bitmap* bitmap, + FT_Render_Mode mode, + FT_LcdFiveTapFilter weights ) + { + FT_UInt width = (FT_UInt)bitmap->width; + FT_UInt height = (FT_UInt)bitmap->rows; + FT_Int pitch = bitmap->pitch; + FT_Byte* origin = bitmap->buffer; + + + /* take care of bitmap flow */ + if ( pitch > 0 && height > 0 ) + origin += pitch * (FT_Int)( height - 1 ); + + /* horizontal in-place FIR filter */ + if ( mode == FT_RENDER_MODE_LCD && width >= 2 ) + { + FT_Byte* line = origin; + + + /* `fir' must be at least 32 bit wide, since the sum of */ + /* the values in `weights' can exceed 0xFF */ + + for ( ; height > 0; height--, line -= pitch ) + { + FT_UInt fir[5]; + FT_UInt val, xx; + + + val = line[0]; + fir[2] = weights[2] * val; + fir[3] = weights[3] * val; + fir[4] = weights[4] * val; + + val = line[1]; + fir[1] = fir[2] + weights[1] * val; + fir[2] = fir[3] + weights[2] * val; + fir[3] = fir[4] + weights[3] * val; + fir[4] = weights[4] * val; + + for ( xx = 2; xx < width; xx++ ) + { + val = line[xx]; + fir[0] = fir[1] + weights[0] * val; + fir[1] = fir[2] + weights[1] * val; + fir[2] = fir[3] + weights[2] * val; + fir[3] = fir[4] + weights[3] * val; + fir[4] = weights[4] * val; + + line[xx - 2] = FT_SHIFTCLAMP( fir[0] ); + } + + line[xx - 2] = FT_SHIFTCLAMP( fir[1] ); + line[xx - 1] = FT_SHIFTCLAMP( fir[2] ); + } + } + + /* vertical in-place FIR filter */ + else if ( mode == FT_RENDER_MODE_LCD_V && height >= 2 ) + { + FT_Byte* column = origin; + + + for ( ; width > 0; width--, column++ ) + { + FT_Byte* col = column; + FT_UInt fir[5]; + FT_UInt val, yy; + + + val = col[0]; + fir[2] = weights[2] * val; + fir[3] = weights[3] * val; + fir[4] = weights[4] * val; + col -= pitch; + + val = col[0]; + fir[1] = fir[2] + weights[1] * val; + fir[2] = fir[3] + weights[2] * val; + fir[3] = fir[4] + weights[3] * val; + fir[4] = weights[4] * val; + col -= pitch; + + for ( yy = 2; yy < height; yy++, col -= pitch ) + { + val = col[0]; + fir[0] = fir[1] + weights[0] * val; + fir[1] = fir[2] + weights[1] * val; + fir[2] = fir[3] + weights[2] * val; + fir[3] = fir[4] + weights[3] * val; + fir[4] = weights[4] * val; + + col[pitch * 2] = FT_SHIFTCLAMP( fir[0] ); + } + + col[pitch * 2] = FT_SHIFTCLAMP( fir[1] ); + col[pitch] = FT_SHIFTCLAMP( fir[2] ); + } + } + } + + +#ifdef USE_LEGACY + + /* intra-pixel filter used by the legacy filter */ + static void + _ft_lcd_filter_legacy( FT_Bitmap* bitmap, + FT_Render_Mode mode, + FT_Byte* weights ) + { + FT_UInt width = (FT_UInt)bitmap->width; + FT_UInt height = (FT_UInt)bitmap->rows; + FT_Int pitch = bitmap->pitch; + FT_Byte* origin = bitmap->buffer; + + static const unsigned int filters[3][3] = + { + { 65538 * 9/13, 65538 * 1/6, 65538 * 1/13 }, + { 65538 * 3/13, 65538 * 4/6, 65538 * 3/13 }, + { 65538 * 1/13, 65538 * 1/6, 65538 * 9/13 } + }; + + FT_UNUSED( weights ); + + + /* take care of bitmap flow */ + if ( pitch > 0 && height > 0 ) + origin += pitch * (FT_Int)( height - 1 ); + + /* horizontal in-place intra-pixel filter */ + if ( mode == FT_RENDER_MODE_LCD && width >= 3 ) + { + FT_Byte* line = origin; + + + for ( ; height > 0; height--, line -= pitch ) + { + FT_UInt xx; + + + for ( xx = 0; xx < width; xx += 3 ) + { + FT_UInt r, g, b; + FT_UInt p; + + + p = line[xx]; + r = filters[0][0] * p; + g = filters[0][1] * p; + b = filters[0][2] * p; + + p = line[xx + 1]; + r += filters[1][0] * p; + g += filters[1][1] * p; + b += filters[1][2] * p; + + p = line[xx + 2]; + r += filters[2][0] * p; + g += filters[2][1] * p; + b += filters[2][2] * p; + + line[xx] = (FT_Byte)( r / 65536 ); + line[xx + 1] = (FT_Byte)( g / 65536 ); + line[xx + 2] = (FT_Byte)( b / 65536 ); + } + } + } + else if ( mode == FT_RENDER_MODE_LCD_V && height >= 3 ) + { + FT_Byte* column = origin; + + + for ( ; width > 0; width--, column++ ) + { + FT_Byte* col = column - 2 * pitch; + + + for ( ; height > 0; height -= 3, col -= 3 * pitch ) + { + FT_UInt r, g, b; + FT_UInt p; + + + p = col[0]; + r = filters[0][0] * p; + g = filters[0][1] * p; + b = filters[0][2] * p; + + p = col[pitch]; + r += filters[1][0] * p; + g += filters[1][1] * p; + b += filters[1][2] * p; + + p = col[pitch * 2]; + r += filters[2][0] * p; + g += filters[2][1] * p; + b += filters[2][2] * p; + + col[0] = (FT_Byte)( r / 65536 ); + col[pitch] = (FT_Byte)( g / 65536 ); + col[pitch * 2] = (FT_Byte)( b / 65536 ); + } + } + } + } + +#endif /* USE_LEGACY */ + + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilterWeights( FT_Library library, + unsigned char *weights ) + { + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !weights ) + return FT_THROW( Invalid_Argument ); + + ft_memcpy( library->lcd_weights, weights, FT_LCD_FILTER_FIVE_TAPS ); + library->lcd_filter_func = ft_lcd_filter_fir; + + return FT_Err_Ok; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ) + { + static const FT_LcdFiveTapFilter default_weights = + { 0x08, 0x4d, 0x56, 0x4d, 0x08 }; + static const FT_LcdFiveTapFilter light_weights = + { 0x00, 0x55, 0x56, 0x55, 0x00 }; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + switch ( filter ) + { + case FT_LCD_FILTER_NONE: + library->lcd_filter_func = NULL; + break; + + case FT_LCD_FILTER_DEFAULT: + ft_memcpy( library->lcd_weights, + default_weights, + FT_LCD_FILTER_FIVE_TAPS ); + library->lcd_filter_func = ft_lcd_filter_fir; + break; + + case FT_LCD_FILTER_LIGHT: + ft_memcpy( library->lcd_weights, + light_weights, + FT_LCD_FILTER_FIVE_TAPS ); + library->lcd_filter_func = ft_lcd_filter_fir; + break; + +#ifdef USE_LEGACY + + case FT_LCD_FILTER_LEGACY: + case FT_LCD_FILTER_LEGACY1: + library->lcd_filter_func = _ft_lcd_filter_legacy; + break; + +#endif + + default: + return FT_THROW( Invalid_Argument ); + } + + return FT_Err_Ok; + } + +#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + /* add padding according to accommodate outline shifts */ + FT_BASE_DEF (void) + ft_lcd_padding( FT_Pos* Min, + FT_Pos* Max, + FT_GlyphSlot slot ) + { + FT_UNUSED( slot ); + + *Min -= 21; + *Max += 21; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilterWeights( FT_Library library, + unsigned char *weights ) + { + FT_UNUSED( library ); + FT_UNUSED( weights ); + + return FT_THROW( Unimplemented_Feature ); + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Library_SetLcdFilter( FT_Library library, + FT_LcdFilter filter ) + { + FT_UNUSED( library ); + FT_UNUSED( filter ); + + return FT_THROW( Unimplemented_Feature ); + } + +#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftmac.c b/vendor/FreeType2/src/base/ftmac.c new file mode 100644 index 0000000..fd4c0cc --- /dev/null +++ b/vendor/FreeType2/src/base/ftmac.c @@ -0,0 +1,1088 @@ +/***************************************************************************/ +/* */ +/* ftmac.c */ +/* */ +/* Mac FOND support. Written by just@letterror.com. */ +/* Heavily modified by mpsuzuki, George Williams, and Sean McBride. */ +/* */ +/* This file is for Mac OS X only; see builds/mac/ftoldmac.c for */ +/* classic platforms built by MPW. */ +/* */ +/* Copyright 1996-2018 by */ +/* Just van Rossum, 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. */ +/* */ +/***************************************************************************/ + + + /* + Notes + + Mac suitcase files can (and often do!) contain multiple fonts. To + support this I use the face_index argument of FT_(Open|New)_Face() + functions, and pretend the suitcase file is a collection. + + Warning: fbit and NFNT bitmap resources are not supported yet. In old + sfnt fonts, bitmap glyph data for each size is stored in each `NFNT' + resources instead of the `bdat' table in the sfnt resource. Therefore, + face->num_fixed_sizes is set to 0, because bitmap data in `NFNT' + resource is unavailable at present. + + The Mac FOND support works roughly like this: + + - Check whether the offered stream points to a Mac suitcase file. This + is done by checking the file type: it has to be 'FFIL' or 'tfil'. The + stream that gets passed to our init_face() routine is a stdio stream, + which isn't usable for us, since the FOND resources live in the + resource fork. So we just grab the stream->pathname field. + + - Read the FOND resource into memory, then check whether there is a + TrueType font and/or(!) a Type 1 font available. + + - If there is a Type 1 font available (as a separate `LWFN' file), read + its data into memory, massage it slightly so it becomes PFB data, wrap + it into a memory stream, load the Type 1 driver and delegate the rest + of the work to it by calling FT_Open_Face(). (XXX TODO: after this + has been done, the kerning data from the FOND resource should be + appended to the face: On the Mac there are usually no AFM files + available. However, this is tricky since we need to map Mac char + codes to ps glyph names to glyph ID's...) + + - If there is a TrueType font (an `sfnt' resource), read it into memory, + wrap it into a memory stream, load the TrueType driver and delegate + the rest of the work to it, by calling FT_Open_Face(). + + - Some suitcase fonts (notably Onyx) might point the `LWFN' file to + itself, even though it doesn't contains `POST' resources. To handle + this special case without opening the file an extra time, we just + ignore errors from the `LWFN' and fallback to the `sfnt' if both are + available. + */ + + +#include +#include FT_FREETYPE_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_STREAM_H +#include "ftbase.h" + + +#ifdef FT_MACINTOSH + + /* This is for Mac OS X. Without redefinition, OS_INLINE */ + /* expands to `static inline' which doesn't survive the */ + /* -ansi compilation flag of GCC. */ +#if !HAVE_ANSI_OS_INLINE +#undef OS_INLINE +#define OS_INLINE static __inline__ +#endif + + /* `configure' checks the availability of `ResourceIndex' strictly */ + /* and sets HAVE_TYPE_RESOURCE_INDEX 1 or 0 always. If it is */ + /* not set (e.g., a build without `configure'), the availability */ + /* is guessed from the SDK version. */ +#ifndef HAVE_TYPE_RESOURCE_INDEX +#if !defined( MAC_OS_X_VERSION_10_5 ) || \ + ( MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5 ) +#define HAVE_TYPE_RESOURCE_INDEX 0 +#else +#define HAVE_TYPE_RESOURCE_INDEX 1 +#endif +#endif /* !HAVE_TYPE_RESOURCE_INDEX */ + +#if ( HAVE_TYPE_RESOURCE_INDEX == 0 ) + typedef short ResourceIndex; +#endif + +#include +#include +#include /* PATH_MAX */ + + /* Don't want warnings about our own use of deprecated functions. */ +#define FT_DEPRECATED_ATTRIBUTE + +#include FT_MAC_H + +#ifndef kATSOptionFlagsUnRestrictedScope /* since Mac OS X 10.1 */ +#define kATSOptionFlagsUnRestrictedScope kATSOptionFlagsDefault +#endif + + + /* Set PREFER_LWFN to 1 if LWFN (Type 1) is preferred over + TrueType in case *both* are available (this is not common, + but it *is* possible). */ +#ifndef PREFER_LWFN +#define PREFER_LWFN 1 +#endif + + + /* This function is deprecated because FSSpec is deprecated in Mac OS X */ + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { + FT_UNUSED( fontName ); + FT_UNUSED( pathSpec ); + FT_UNUSED( face_index ); + + return FT_THROW( Unimplemented_Feature ); + } + + + /* Private function. */ + /* The FSSpec type has been discouraged for a long time, */ + /* unfortunately an FSRef replacement API for */ + /* ATSFontGetFileSpecification() is only available in */ + /* Mac OS X 10.5 and later. */ + static OSStatus + FT_ATSFontGetFileReference( ATSFontRef ats_font_id, + FSRef* ats_font_ref ) + { +#if defined( MAC_OS_X_VERSION_10_5 ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) + + OSStatus err; + + err = ATSFontGetFileReference( ats_font_id, ats_font_ref ); + + return err; +#elif __LP64__ /* No 64bit Carbon API on legacy platforms */ + FT_UNUSED( ats_font_id ); + FT_UNUSED( ats_font_ref ); + + + return fnfErr; +#else /* 32bit Carbon API on legacy platforms */ + OSStatus err; + FSSpec spec; + + + err = ATSFontGetFileSpecification( ats_font_id, &spec ); + if ( noErr == err ) + err = FSpMakeFSRef( &spec, ats_font_ref ); + + return err; +#endif + } + + + static FT_Error + FT_GetFileRef_From_Mac_ATS_Name( const char* fontName, + FSRef* ats_font_ref, + FT_Long* face_index ) + { + CFStringRef cf_fontName; + ATSFontRef ats_font_id; + + + *face_index = 0; + + cf_fontName = CFStringCreateWithCString( NULL, fontName, + kCFStringEncodingMacRoman ); + ats_font_id = ATSFontFindFromName( cf_fontName, + kATSOptionFlagsUnRestrictedScope ); + CFRelease( cf_fontName ); + + if ( ats_font_id == 0 || ats_font_id == 0xFFFFFFFFUL ) + return FT_THROW( Unknown_File_Format ); + + if ( noErr != FT_ATSFontGetFileReference( ats_font_id, ats_font_ref ) ) + return FT_THROW( Unknown_File_Format ); + + /* face_index calculation by searching preceding fontIDs */ + /* with same FSRef */ + { + ATSFontRef id2 = ats_font_id - 1; + FSRef ref2; + + + while ( id2 > 0 ) + { + if ( noErr != FT_ATSFontGetFileReference( id2, &ref2 ) ) + break; + if ( noErr != FSCompareFSRefs( ats_font_ref, &ref2 ) ) + break; + + id2 --; + } + *face_index = ats_font_id - ( id2 + 1 ); + } + + return FT_Err_Ok; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_GetFilePath_From_Mac_ATS_Name( const char* fontName, + UInt8* path, + UInt32 maxPathSize, + FT_Long* face_index ) + { + FSRef ref; + FT_Error err; + + + if ( !fontName || !face_index ) + return FT_THROW( Invalid_Argument); + + err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); + if ( err ) + return err; + + if ( noErr != FSRefMakePath( &ref, path, maxPathSize ) ) + return FT_THROW( Unknown_File_Format ); + + return FT_Err_Ok; + } + + + /* This function is deprecated because FSSpec is deprecated in Mac OS X */ + FT_EXPORT_DEF( FT_Error ) + FT_GetFile_From_Mac_ATS_Name( const char* fontName, + FSSpec* pathSpec, + FT_Long* face_index ) + { +#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) ) + FT_UNUSED( fontName ); + FT_UNUSED( pathSpec ); + FT_UNUSED( face_index ); + + return FT_THROW( Unimplemented_Feature ); +#else + FSRef ref; + FT_Error err; + + + if ( !fontName || !face_index ) + return FT_THROW( Invalid_Argument ); + + err = FT_GetFileRef_From_Mac_ATS_Name( fontName, &ref, face_index ); + if ( err ) + return err; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, NULL, NULL, + pathSpec, NULL ) ) + return FT_THROW( Unknown_File_Format ); + + return FT_Err_Ok; +#endif + } + + + static OSErr + FT_FSPathMakeRes( const UInt8* pathname, + ResFileRefNum* res ) + { + OSErr err; + FSRef ref; + + + if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) + return FT_THROW( Cannot_Open_Resource ); + + /* at present, no support for dfont format */ + err = FSOpenResourceFile( &ref, 0, NULL, fsRdPerm, res ); + if ( noErr == err ) + return err; + + /* fallback to original resource-fork font */ + *res = FSOpenResFile( &ref, fsRdPerm ); + err = ResError(); + + return err; + } + + + /* Return the file type for given pathname */ + static OSType + get_file_type_from_path( const UInt8* pathname ) + { + FSRef ref; + FSCatalogInfo info; + + + if ( noErr != FSPathMakeRef( pathname, &ref, FALSE ) ) + return ( OSType ) 0; + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoFinderInfo, &info, + NULL, NULL, NULL ) ) + return ( OSType ) 0; + + return ((FInfo *)(info.finderInfo))->fdType; + } + + + /* Given a PostScript font name, create the Macintosh LWFN file name. */ + static void + create_lwfn_name( char* ps_name, + Str255 lwfn_file_name ) + { + int max = 5, count = 0; + FT_Byte* p = lwfn_file_name; + FT_Byte* q = (FT_Byte*)ps_name; + + + lwfn_file_name[0] = 0; + + while ( *q ) + { + if ( ft_isupper( *q ) ) + { + if ( count ) + max = 3; + count = 0; + } + if ( count < max && ( ft_isalnum( *q ) || *q == '_' ) ) + { + *++p = *q; + lwfn_file_name[0]++; + count++; + } + q++; + } + } + + + static short + count_faces_sfnt( char* fond_data ) + { + /* The count is 1 greater than the value in the FOND. */ + /* Isn't that cute? :-) */ + + return EndianS16_BtoN( *( (short*)( fond_data + + sizeof ( FamRec ) ) ) ) + 1; + } + + + static short + count_faces_scalable( char* fond_data ) + { + AsscEntry* assoc; + short i, face, face_all; + + + face_all = EndianS16_BtoN( *( (short *)( fond_data + + sizeof ( FamRec ) ) ) ) + 1; + assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); + face = 0; + + for ( i = 0; i < face_all; i++ ) + { + if ( 0 == EndianS16_BtoN( assoc[i].fontSize ) ) + face++; + } + return face; + } + + + /* Look inside the FOND data, answer whether there should be an SFNT + resource, and answer the name of a possible LWFN Type 1 file. + + Thanks to Paul Miller (paulm@profoundeffects.com) for the fix + to load a face OTHER than the first one in the FOND! + */ + + + static void + parse_fond( char* fond_data, + short* have_sfnt, + ResID* sfnt_id, + Str255 lwfn_file_name, + short face_index ) + { + AsscEntry* assoc; + AsscEntry* base_assoc; + FamRec* fond; + + + *sfnt_id = 0; + *have_sfnt = 0; + lwfn_file_name[0] = 0; + + fond = (FamRec*)fond_data; + assoc = (AsscEntry*)( fond_data + sizeof ( FamRec ) + 2 ); + base_assoc = assoc; + + /* the maximum faces in a FOND is 48, size of StyleTable.indexes[] */ + if ( 47 < face_index ) + return; + + /* Let's do a little range checking before we get too excited here */ + if ( face_index < count_faces_sfnt( fond_data ) ) + { + assoc += face_index; /* add on the face_index! */ + + /* if the face at this index is not scalable, + fall back to the first one (old behavior) */ + if ( EndianS16_BtoN( assoc->fontSize ) == 0 ) + { + *have_sfnt = 1; + *sfnt_id = EndianS16_BtoN( assoc->fontID ); + } + else if ( base_assoc->fontSize == 0 ) + { + *have_sfnt = 1; + *sfnt_id = EndianS16_BtoN( base_assoc->fontID ); + } + } + + if ( EndianS32_BtoN( fond->ffStylOff ) ) + { + unsigned char* p = (unsigned char*)fond_data; + StyleTable* style; + unsigned short string_count; + char ps_name[256]; + unsigned char* names[64]; + int i; + + + p += EndianS32_BtoN( fond->ffStylOff ); + style = (StyleTable*)p; + p += sizeof ( StyleTable ); + string_count = EndianS16_BtoN( *(short*)(p) ); + string_count = FT_MIN( 64, string_count ); + p += sizeof ( short ); + + for ( i = 0; i < string_count; i++ ) + { + names[i] = p; + p += names[i][0]; + p++; + } + + { + size_t ps_name_len = (size_t)names[0][0]; + + + if ( ps_name_len != 0 ) + { + ft_memcpy(ps_name, names[0] + 1, ps_name_len); + ps_name[ps_name_len] = 0; + } + if ( style->indexes[face_index] > 1 && + style->indexes[face_index] <= string_count ) + { + unsigned char* suffixes = names[style->indexes[face_index] - 1]; + + + for ( i = 1; i <= suffixes[0]; i++ ) + { + unsigned char* s; + size_t j = suffixes[i] - 1; + + + if ( j < string_count && ( s = names[j] ) != NULL ) + { + size_t s_len = (size_t)s[0]; + + + if ( s_len != 0 && ps_name_len + s_len < sizeof ( ps_name ) ) + { + ft_memcpy( ps_name + ps_name_len, s + 1, s_len ); + ps_name_len += s_len; + ps_name[ps_name_len] = 0; + } + } + } + } + } + + create_lwfn_name( ps_name, lwfn_file_name ); + } + } + + + static FT_Error + lookup_lwfn_by_fond( const UInt8* path_fond, + ConstStr255Param base_lwfn, + UInt8* path_lwfn, + size_t path_size ) + { + FSRef ref, par_ref; + size_t dirname_len; + + + /* Pathname for FSRef can be in various formats: HFS, HFS+, and POSIX. */ + /* We should not extract parent directory by string manipulation. */ + + if ( noErr != FSPathMakeRef( path_fond, &ref, FALSE ) ) + return FT_THROW( Invalid_Argument ); + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, + NULL, NULL, NULL, &par_ref ) ) + return FT_THROW( Invalid_Argument ); + + if ( noErr != FSRefMakePath( &par_ref, path_lwfn, path_size ) ) + return FT_THROW( Invalid_Argument ); + + if ( ft_strlen( (char *)path_lwfn ) + 1 + base_lwfn[0] > path_size ) + return FT_THROW( Invalid_Argument ); + + /* now we have absolute dirname in path_lwfn */ + ft_strcat( (char *)path_lwfn, "/" ); + dirname_len = ft_strlen( (char *)path_lwfn ); + ft_strcat( (char *)path_lwfn, (char *)base_lwfn + 1 ); + path_lwfn[dirname_len + base_lwfn[0]] = '\0'; + + if ( noErr != FSPathMakeRef( path_lwfn, &ref, FALSE ) ) + return FT_THROW( Cannot_Open_Resource ); + + if ( noErr != FSGetCatalogInfo( &ref, kFSCatInfoNone, + NULL, NULL, NULL, NULL ) ) + return FT_THROW( Cannot_Open_Resource ); + + return FT_Err_Ok; + } + + + static short + count_faces( Handle fond, + const UInt8* pathname ) + { + ResID sfnt_id; + short have_sfnt, have_lwfn; + Str255 lwfn_file_name; + UInt8 buff[PATH_MAX]; + FT_Error err; + short num_faces; + + + have_sfnt = have_lwfn = 0; + + parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, 0 ); + + if ( lwfn_file_name[0] ) + { + err = lookup_lwfn_by_fond( pathname, lwfn_file_name, + buff, sizeof ( buff ) ); + if ( !err ) + have_lwfn = 1; + } + + if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) + num_faces = 1; + else + num_faces = count_faces_scalable( *fond ); + + return num_faces; + } + + + /* Read Type 1 data from the POST resources inside the LWFN file, + return a PFB buffer. This is somewhat convoluted because the FT2 + PFB parser wants the ASCII header as one chunk, and the LWFN + chunks are often not organized that way, so we glue chunks + of the same type together. */ + static FT_Error + read_lwfn( FT_Memory memory, + ResFileRefNum res, + FT_Byte** pfb_data, + FT_ULong* size ) + { + FT_Error error = FT_Err_Ok; + ResID res_id; + unsigned char *buffer, *p, *size_p = NULL; + FT_ULong total_size = 0; + FT_ULong old_total_size = 0; + FT_ULong post_size, pfb_chunk_size; + Handle post_data; + char code, last_code; + + + UseResFile( res ); + + /* First pass: load all POST resources, and determine the size of */ + /* the output buffer. */ + res_id = 501; + last_code = -1; + + for (;;) + { + post_data = Get1Resource( TTAG_POST, res_id++ ); + if ( !post_data ) + break; /* we are done */ + + code = (*post_data)[0]; + + if ( code != last_code ) + { + if ( code == 5 ) + total_size += 2; /* just the end code */ + else + total_size += 6; /* code + 4 bytes chunk length */ + } + + total_size += (FT_ULong)GetHandleSize( post_data ) - 2; + last_code = code; + + /* detect resource fork overflow */ + if ( FT_MAC_RFORK_MAX_LEN < total_size ) + { + error = FT_THROW( Array_Too_Large ); + goto Error; + } + + old_total_size = total_size; + } + + if ( FT_ALLOC( buffer, (FT_Long)total_size ) ) + goto Error; + + /* Second pass: append all POST data to the buffer, add PFB fields. */ + /* Glue all consecutive chunks of the same type together. */ + p = buffer; + res_id = 501; + last_code = -1; + pfb_chunk_size = 0; + + for (;;) + { + post_data = Get1Resource( TTAG_POST, res_id++ ); + if ( !post_data ) + break; /* we are done */ + + post_size = (FT_ULong)GetHandleSize( post_data ) - 2; + code = (*post_data)[0]; + + if ( code != last_code ) + { + if ( last_code != -1 ) + { + /* we are done adding a chunk, fill in the size field */ + if ( size_p ) + { + *size_p++ = (FT_Byte)( pfb_chunk_size & 0xFF ); + *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 8 ) & 0xFF ); + *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 16 ) & 0xFF ); + *size_p++ = (FT_Byte)( ( pfb_chunk_size >> 24 ) & 0xFF ); + } + pfb_chunk_size = 0; + } + + *p++ = 0x80; + if ( code == 5 ) + *p++ = 0x03; /* the end */ + else if ( code == 2 ) + *p++ = 0x02; /* binary segment */ + else + *p++ = 0x01; /* ASCII segment */ + + if ( code != 5 ) + { + size_p = p; /* save for later */ + p += 4; /* make space for size field */ + } + } + + ft_memcpy( p, *post_data + 2, post_size ); + pfb_chunk_size += post_size; + p += post_size; + last_code = code; + } + + *pfb_data = buffer; + *size = total_size; + + Error: + CloseResFile( res ); + return error; + } + + + /* Create a new FT_Face from a file path to an LWFN file. */ + static FT_Error + FT_New_Face_From_LWFN( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Byte* pfb_data; + FT_ULong pfb_size; + FT_Error error; + ResFileRefNum res; + + + if ( noErr != FT_FSPathMakeRes( pathname, &res ) ) + return FT_THROW( Cannot_Open_Resource ); + + pfb_data = NULL; + pfb_size = 0; + error = read_lwfn( library->memory, res, &pfb_data, &pfb_size ); + CloseResFile( res ); /* PFB is already loaded, useless anymore */ + if ( error ) + return error; + + return open_face_from_buffer( library, + pfb_data, + pfb_size, + face_index, + "type1", + aface ); + } + + + /* Create a new FT_Face from an SFNT resource, specified by res ID. */ + static FT_Error + FT_New_Face_From_SFNT( FT_Library library, + ResID sfnt_id, + FT_Long face_index, + FT_Face* aface ) + { + Handle sfnt = NULL; + FT_Byte* sfnt_data; + size_t sfnt_size; + FT_Error error = FT_Err_Ok; + FT_Memory memory = library->memory; + int is_cff, is_sfnt_ps; + + + sfnt = GetResource( TTAG_sfnt, sfnt_id ); + if ( !sfnt ) + return FT_THROW( Invalid_Handle ); + + sfnt_size = (FT_ULong)GetHandleSize( sfnt ); + + /* detect resource fork overflow */ + if ( FT_MAC_RFORK_MAX_LEN < sfnt_size ) + return FT_THROW( Array_Too_Large ); + + if ( FT_ALLOC( sfnt_data, (FT_Long)sfnt_size ) ) + { + ReleaseResource( sfnt ); + return error; + } + + ft_memcpy( sfnt_data, *sfnt, sfnt_size ); + ReleaseResource( sfnt ); + + is_cff = sfnt_size > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 ); + is_sfnt_ps = sfnt_size > 4 && !ft_memcmp( sfnt_data, "typ1", 4 ); + + if ( is_sfnt_ps ) + { + FT_Stream stream; + + + if ( FT_NEW( stream ) ) + goto Try_OpenType; + + FT_Stream_OpenMemory( stream, sfnt_data, sfnt_size ); + if ( !open_face_PS_from_sfnt_stream( library, + stream, + face_index, + 0, NULL, + aface ) ) + { + FT_Stream_Close( stream ); + FT_FREE( stream ); + FT_FREE( sfnt_data ); + goto Exit; + } + + FT_FREE( stream ); + } + Try_OpenType: + error = open_face_from_buffer( library, + sfnt_data, + sfnt_size, + face_index, + is_cff ? "cff" : "truetype", + aface ); + Exit: + return error; + } + + + /* Create a new FT_Face from a file path to a suitcase file. */ + static FT_Error + FT_New_Face_From_Suitcase( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Error error = FT_ERR( Cannot_Open_Resource ); + ResFileRefNum res_ref; + ResourceIndex res_index; + Handle fond; + short num_faces_in_res; + + + if ( noErr != FT_FSPathMakeRes( pathname, &res_ref ) ) + return FT_THROW( Cannot_Open_Resource ); + + UseResFile( res_ref ); + if ( ResError() ) + return FT_THROW( Cannot_Open_Resource ); + + num_faces_in_res = 0; + for ( res_index = 1; ; res_index++ ) + { + short num_faces_in_fond; + + + fond = Get1IndResource( TTAG_FOND, res_index ); + if ( ResError() ) + break; + + num_faces_in_fond = count_faces( fond, pathname ); + num_faces_in_res += num_faces_in_fond; + + if ( 0 <= face_index && face_index < num_faces_in_fond && error ) + error = FT_New_Face_From_FOND( library, fond, face_index, aface ); + + face_index -= num_faces_in_fond; + } + + CloseResFile( res_ref ); + if ( !error && aface && *aface ) + (*aface)->num_faces = num_faces_in_res; + return error; + } + + + /* documentation is in ftmac.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FOND( FT_Library library, + Handle fond, + FT_Long face_index, + FT_Face* aface ) + { + short have_sfnt, have_lwfn = 0; + ResID sfnt_id, fond_id; + OSType fond_type; + Str255 fond_name; + Str255 lwfn_file_name; + UInt8 path_lwfn[PATH_MAX]; + OSErr err; + FT_Error error = FT_Err_Ok; + + + /* check of `library' and `aface' delayed to `FT_New_Face_From_XXX' */ + + GetResInfo( fond, &fond_id, &fond_type, fond_name ); + if ( ResError() != noErr || fond_type != TTAG_FOND ) + return FT_THROW( Invalid_File_Format ); + + parse_fond( *fond, &have_sfnt, &sfnt_id, lwfn_file_name, face_index ); + + if ( lwfn_file_name[0] ) + { + ResFileRefNum res; + + + res = HomeResFile( fond ); + if ( noErr != ResError() ) + goto found_no_lwfn_file; + + { + UInt8 path_fond[PATH_MAX]; + FSRef ref; + + + err = FSGetForkCBInfo( res, kFSInvalidVolumeRefNum, + NULL, NULL, NULL, &ref, NULL ); + if ( noErr != err ) + goto found_no_lwfn_file; + + err = FSRefMakePath( &ref, path_fond, sizeof ( path_fond ) ); + if ( noErr != err ) + goto found_no_lwfn_file; + + error = lookup_lwfn_by_fond( path_fond, lwfn_file_name, + path_lwfn, sizeof ( path_lwfn ) ); + if ( !error ) + have_lwfn = 1; + } + } + + if ( have_lwfn && ( !have_sfnt || PREFER_LWFN ) ) + error = FT_New_Face_From_LWFN( library, + path_lwfn, + face_index, + aface ); + else + error = FT_THROW( Unknown_File_Format ); + + found_no_lwfn_file: + if ( have_sfnt && error ) + error = FT_New_Face_From_SFNT( library, + sfnt_id, + face_index, + aface ); + + return error; + } + + + /* Common function to load a new FT_Face from a resource file. */ + static FT_Error + FT_New_Face_From_Resource( FT_Library library, + const UInt8* pathname, + FT_Long face_index, + FT_Face* aface ) + { + OSType file_type; + FT_Error error; + + + /* LWFN is a (very) specific file format, check for it explicitly */ + file_type = get_file_type_from_path( pathname ); + if ( file_type == TTAG_LWFN ) + return FT_New_Face_From_LWFN( library, pathname, face_index, aface ); + + /* Otherwise the file type doesn't matter (there are more than */ + /* `FFIL' and `tfil'). Just try opening it as a font suitcase; */ + /* if it works, fine. */ + + error = FT_New_Face_From_Suitcase( library, pathname, face_index, aface ); + if ( error ) + { + /* let it fall through to normal loader (.ttf, .otf, etc.); */ + /* we signal this by returning no error and no FT_Face */ + *aface = NULL; + } + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Face */ + /* */ + /* */ + /* This is the Mac-specific implementation of FT_New_Face. In */ + /* addition to the standard FT_New_Face() functionality, it also */ + /* accepts pathnames to Mac suitcase files. For further */ + /* documentation see the original FT_New_Face() in freetype.h. */ + /* */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face( FT_Library library, + const char* pathname, + FT_Long face_index, + FT_Face* aface ) + { + FT_Open_Args args; + FT_Error error; + + + /* test for valid `library' and `aface' delayed to FT_Open_Face() */ + if ( !pathname ) + return FT_THROW( Invalid_Argument ); + + *aface = NULL; + + /* try resourcefork based font: LWFN, FFIL */ + error = FT_New_Face_From_Resource( library, (UInt8 *)pathname, + face_index, aface ); + if ( error || *aface ) + return error; + + /* let it fall through to normal loader (.ttf, .otf, etc.) */ + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + + return FT_Open_Face( library, &args, face_index, aface ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Face_From_FSRef */ + /* */ + /* */ + /* FT_New_Face_From_FSRef is identical to FT_New_Face except it */ + /* accepts an FSRef instead of a path. */ + /* */ + /* This function is deprecated because Carbon data types (FSRef) */ + /* are not cross-platform, and thus not suitable for the FreeType API. */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FSRef( FT_Library library, + const FSRef* ref, + FT_Long face_index, + FT_Face* aface ) + { + FT_Error error; + FT_Open_Args args; + + OSErr err; + UInt8 pathname[PATH_MAX]; + + + /* check of `library' and `aface' delayed to */ + /* `FT_New_Face_From_Resource' */ + + if ( !ref ) + return FT_THROW( Invalid_Argument ); + + err = FSRefMakePath( ref, pathname, sizeof ( pathname ) ); + if ( err ) + error = FT_THROW( Cannot_Open_Resource ); + + error = FT_New_Face_From_Resource( library, pathname, face_index, aface ); + if ( error || *aface ) + return error; + + /* fallback to datafork font */ + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + return FT_Open_Face( library, &args, face_index, aface ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_New_Face_From_FSSpec */ + /* */ + /* */ + /* FT_New_Face_From_FSSpec is identical to FT_New_Face except it */ + /* accepts an FSSpec instead of a path. */ + /* */ + /* This function is deprecated because FSSpec is deprecated in Mac OS X */ + FT_EXPORT_DEF( FT_Error ) + FT_New_Face_From_FSSpec( FT_Library library, + const FSSpec* spec, + FT_Long face_index, + FT_Face* aface ) + { +#if ( __LP64__ ) || ( defined( MAC_OS_X_VERSION_10_5 ) && \ + ( MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_5 ) ) + FT_UNUSED( library ); + FT_UNUSED( spec ); + FT_UNUSED( face_index ); + FT_UNUSED( aface ); + + return FT_THROW( Unimplemented_Feature ); +#else + FSRef ref; + + + /* check of `library' and `aface' delayed to `FT_New_Face_From_FSRef' */ + + if ( !spec || FSpMakeFSRef( spec, &ref ) != noErr ) + return FT_THROW( Invalid_Argument ); + else + return FT_New_Face_From_FSRef( library, &ref, face_index, aface ); +#endif + } + +#else /* !FT_MACINTOSH */ + + /* ANSI C doesn't like empty source files */ + typedef int _ft_mac_dummy; + +#endif /* !FT_MACINTOSH */ + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftmm.c b/vendor/FreeType2/src/base/ftmm.c new file mode 100644 index 0000000..800441b --- /dev/null +++ b/vendor/FreeType2/src/base/ftmm.c @@ -0,0 +1,508 @@ +/***************************************************************************/ +/* */ +/* ftmm.c */ +/* */ +/* Multiple Master font support (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H + +#include FT_MULTIPLE_MASTERS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_METRICS_VARIATIONS_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_mm + + + static FT_Error + ft_face_get_mm_service( FT_Face face, + FT_Service_MultiMasters *aservice ) + { + FT_Error error; + + + *aservice = NULL; + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + error = FT_ERR( Invalid_Argument ); + + if ( FT_HAS_MULTIPLE_MASTERS( face ) ) + { + FT_FACE_LOOKUP_SERVICE( face, + *aservice, + MULTI_MASTERS ); + + if ( *aservice ) + error = FT_Err_Ok; + } + + return error; + } + + + static FT_Error + ft_face_get_mvar_service( FT_Face face, + FT_Service_MetricsVariations *aservice ) + { + FT_Error error; + + + *aservice = NULL; + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + error = FT_ERR( Invalid_Argument ); + + if ( FT_HAS_MULTIPLE_MASTERS( face ) ) + { + FT_FACE_LOOKUP_SERVICE( face, + *aservice, + METRICS_VARIATIONS ); + + if ( *aservice ) + error = FT_Err_Ok; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Multi_Master( FT_Face face, + FT_Multi_Master *amaster ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( !amaster ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service->get_mm ) + error = service->get_mm( face, amaster ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_MM_Var( FT_Face face, + FT_MM_Var* *amaster ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( !amaster ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service->get_mm_var ) + error = service->get_mm_var( face, amaster ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_MM_Var( FT_Library library, + FT_MM_Var* amaster ) + { + FT_Memory memory; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + memory = library->memory; + FT_FREE( amaster ); + + return FT_Err_Ok; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_MM_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Long* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( num_coords && !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service->set_mm_design ) + error = service->set_mm_design( face, num_coords, coords ); + } + + /* enforce recomputation of auto-hinting data */ + if ( !error && face->autohint.finalizer ) + { + face->autohint.finalizer( face->autohint.data ); + face->autohint.data = NULL; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service_mm = NULL; + FT_Service_MetricsVariations service_mvar = NULL; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( num_coords && !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service_mm ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service_mm->set_var_design ) + error = service_mm->set_var_design( face, num_coords, coords ); + + /* internal error code -1 means `no change'; we can exit immediately */ + if ( error == -1 ) + return FT_Err_Ok; + } + + if ( !error ) + { + (void)ft_face_get_mvar_service( face, &service_mvar ); + + if ( service_mvar && service_mvar->metrics_adjust ) + service_mvar->metrics_adjust( face ); + } + + /* enforce recomputation of auto-hinting data */ + if ( !error && face->autohint.finalizer ) + { + face->autohint.finalizer( face->autohint.data ); + face->autohint.data = NULL; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Var_Design_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service->get_var_design ) + error = service->get_var_design( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service_mm = NULL; + FT_Service_MetricsVariations service_mvar = NULL; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( num_coords && !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service_mm ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service_mm->set_mm_blend ) + error = service_mm->set_mm_blend( face, num_coords, coords ); + + /* internal error code -1 means `no change'; we can exit immediately */ + if ( error == -1 ) + return FT_Err_Ok; + } + + if ( !error ) + { + (void)ft_face_get_mvar_service( face, &service_mvar ); + + if ( service_mvar && service_mvar->metrics_adjust ) + service_mvar->metrics_adjust( face ); + } + + /* enforce recomputation of auto-hinting data */ + if ( !error && face->autohint.finalizer ) + { + face->autohint.finalizer( face->autohint.data ); + face->autohint.data = NULL; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + /* This is exactly the same as the previous function. It exists for */ + /* orthogonality. */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service_mm = NULL; + FT_Service_MetricsVariations service_mvar = NULL; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( num_coords && !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service_mm ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service_mm->set_mm_blend ) + error = service_mm->set_mm_blend( face, num_coords, coords ); + + /* internal error code -1 means `no change'; we can exit immediately */ + if ( error == -1 ) + return FT_Err_Ok; + } + + if ( !error ) + { + (void)ft_face_get_mvar_service( face, &service_mvar ); + + if ( service_mvar && service_mvar->metrics_adjust ) + service_mvar->metrics_adjust( face ); + } + + /* enforce recomputation of auto-hinting data */ + if ( !error && face->autohint.finalizer ) + { + face->autohint.finalizer( face->autohint.data ); + face->autohint.data = NULL; + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_MM_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service->get_mm_blend ) + error = service->get_mm_blend( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + /* This is exactly the same as the previous function. It exists for */ + /* orthogonality. */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Var_Blend_Coordinates( FT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + FT_Service_MultiMasters service; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + if ( !coords ) + return FT_THROW( Invalid_Argument ); + + error = ft_face_get_mm_service( face, &service ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service->get_mm_blend ) + error = service->get_mm_blend( face, num_coords, coords ); + } + + return error; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Var_Axis_Flags( FT_MM_Var* master, + FT_UInt axis_index, + FT_UInt* flags ) + { + FT_UShort* axis_flags; + + + if ( !master || !flags ) + return FT_THROW( Invalid_Argument ); + + if ( axis_index >= master->num_axis ) + return FT_THROW( Invalid_Argument ); + + /* the axis flags array immediately follows the data of `master' */ + axis_flags = (FT_UShort*)&( master[1] ); + *flags = axis_flags[axis_index]; + + return FT_Err_Ok; + } + + + /* documentation is in ftmm.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Named_Instance( FT_Face face, + FT_UInt instance_index ) + { + FT_Error error; + + FT_Service_MultiMasters service_mm = NULL; + FT_Service_MetricsVariations service_mvar = NULL; + + + /* check of `face' delayed to `ft_face_get_mm_service' */ + + error = ft_face_get_mm_service( face, &service_mm ); + if ( !error ) + { + error = FT_ERR( Invalid_Argument ); + if ( service_mm->set_instance ) + error = service_mm->set_instance( face, instance_index ); + } + + if ( !error ) + { + (void)ft_face_get_mvar_service( face, &service_mvar ); + + if ( service_mvar && service_mvar->metrics_adjust ) + service_mvar->metrics_adjust( face ); + } + + /* enforce recomputation of auto-hinting data */ + if ( !error && face->autohint.finalizer ) + { + face->autohint.finalizer( face->autohint.data ); + face->autohint.data = NULL; + } + + if ( !error ) + { + face->face_index = ( instance_index << 16 ) | + ( face->face_index & 0xFFFFL ); + face->face_flags &= ~FT_FACE_FLAG_VARIATION; + } + + return error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftobjs.c b/vendor/FreeType2/src/base/ftobjs.c new file mode 100644 index 0000000..8d07e35 --- /dev/null +++ b/vendor/FreeType2/src/base/ftobjs.c @@ -0,0 +1,5405 @@ +/***************************************************************************/ +/* */ +/* ftobjs.c */ +/* */ +/* The FreeType private base classes (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_LIST_H +#include FT_OUTLINE_H +#include FT_FONT_FORMATS_H + +#include FT_INTERNAL_VALIDATE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_RFORK_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H /* for SFNT_Load_Table_Func */ +#include FT_INTERNAL_POSTSCRIPT_AUX_H /* for PS_Driver */ + +#include FT_TRUETYPE_TABLES_H +#include FT_TRUETYPE_TAGS_H +#include FT_TRUETYPE_IDS_H + +#include FT_SERVICE_PROPERTIES_H +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_TT_CMAP_H +#include FT_SERVICE_KERNING_H +#include FT_SERVICE_TRUETYPE_ENGINE_H + +#include FT_DRIVER_H + +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#include "ftbase.h" +#endif + + +#ifdef FT_DEBUG_LEVEL_TRACE + +#include FT_BITMAP_H + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + /* We disable the warning `conversion from XXX to YYY, */ + /* possible loss of data' in order to compile cleanly with */ + /* the maximum level of warnings: `md5.c' is non-FreeType */ + /* code, and it gets used during development builds only. */ +#pragma warning( push ) +#pragma warning( disable : 4244 ) +#endif /* _MSC_VER */ + + /* It's easiest to include `md5.c' directly. However, since OpenSSL */ + /* also provides the same functions, there might be conflicts if */ + /* both FreeType and OpenSSL are built as static libraries. For */ + /* this reason, we put the MD5 stuff into the `FT_' namespace. */ +#define MD5_u32plus FT_MD5_u32plus +#define MD5_CTX FT_MD5_CTX +#define MD5_Init FT_MD5_Init +#define MD5_Update FT_MD5_Update +#define MD5_Final FT_MD5_Final + +#undef HAVE_OPENSSL + +#include "md5.c" + +#if defined( _MSC_VER ) +#pragma warning( pop ) +#endif + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + +#define GRID_FIT_METRICS + + + /* forward declaration */ + static FT_Error + ft_open_face_internal( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface, + FT_Bool test_mac_fonts ); + + + FT_BASE_DEF( FT_Pointer ) + ft_service_list_lookup( FT_ServiceDesc service_descriptors, + const char* service_id ) + { + FT_Pointer result = NULL; + FT_ServiceDesc desc = service_descriptors; + + + if ( desc && service_id ) + { + for ( ; desc->serv_id != NULL; desc++ ) + { + if ( ft_strcmp( desc->serv_id, service_id ) == 0 ) + { + result = (FT_Pointer)desc->serv_data; + break; + } + } + } + + return result; + } + + + FT_BASE_DEF( void ) + ft_validator_init( FT_Validator valid, + const FT_Byte* base, + const FT_Byte* limit, + FT_ValidationLevel level ) + { + valid->base = base; + valid->limit = limit; + valid->level = level; + valid->error = FT_Err_Ok; + } + + + FT_BASE_DEF( FT_Int ) + ft_validator_run( FT_Validator valid ) + { + /* This function doesn't work! None should call it. */ + FT_UNUSED( valid ); + + return -1; + } + + + FT_BASE_DEF( void ) + ft_validator_error( FT_Validator valid, + FT_Error error ) + { + /* since the cast below also disables the compiler's */ + /* type check, we introduce a dummy variable, which */ + /* will be optimized away */ + volatile ft_jmp_buf* jump_buffer = &valid->jump_buffer; + + + valid->error = error; + + /* throw away volatileness; use `jump_buffer' or the */ + /* compiler may warn about an unused local variable */ + ft_longjmp( *(ft_jmp_buf*) jump_buffer, 1 ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** S T R E A M ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* create a new input stream from an FT_Open_Args structure */ + /* */ + FT_BASE_DEF( FT_Error ) + FT_Stream_New( FT_Library library, + const FT_Open_Args* args, + FT_Stream *astream ) + { + FT_Error error; + FT_Memory memory; + FT_Stream stream = NULL; + + + *astream = NULL; + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !args ) + return FT_THROW( Invalid_Argument ); + + memory = library->memory; + + if ( FT_NEW( stream ) ) + goto Exit; + + stream->memory = memory; + + if ( args->flags & FT_OPEN_MEMORY ) + { + /* create a memory-based stream */ + FT_Stream_OpenMemory( stream, + (const FT_Byte*)args->memory_base, + (FT_ULong)args->memory_size ); + } + +#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT + + else if ( args->flags & FT_OPEN_PATHNAME ) + { + /* create a normal system stream */ + error = FT_Stream_Open( stream, args->pathname ); + stream->pathname.pointer = args->pathname; + } + else if ( ( args->flags & FT_OPEN_STREAM ) && args->stream ) + { + /* use an existing, user-provided stream */ + + /* in this case, we do not need to allocate a new stream object */ + /* since the caller is responsible for closing it himself */ + FT_FREE( stream ); + stream = args->stream; + } + +#endif + + else + error = FT_THROW( Invalid_Argument ); + + if ( error ) + FT_FREE( stream ); + else + stream->memory = memory; /* just to be certain */ + + *astream = stream; + + Exit: + return error; + } + + + FT_BASE_DEF( void ) + FT_Stream_Free( FT_Stream stream, + FT_Int external ) + { + if ( stream ) + { + FT_Memory memory = stream->memory; + + + FT_Stream_Close( stream ); + + if ( !external ) + FT_FREE( stream ); + } + } + + + /*************************************************************************/ + /* */ + /* 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_objs + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** FACE, SIZE & GLYPH SLOT OBJECTS ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + static FT_Error + ft_glyphslot_init( FT_GlyphSlot slot ) + { + FT_Driver driver = slot->face->driver; + FT_Driver_Class clazz = driver->clazz; + FT_Memory memory = driver->root.memory; + FT_Error error = FT_Err_Ok; + FT_Slot_Internal internal = NULL; + + + slot->library = driver->root.library; + + if ( FT_NEW( internal ) ) + goto Exit; + + slot->internal = internal; + + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + error = FT_GlyphLoader_New( memory, &internal->loader ); + + if ( !error && clazz->init_slot ) + error = clazz->init_slot( slot ); + + Exit: + return error; + } + + + FT_BASE_DEF( void ) + ft_glyphslot_free_bitmap( FT_GlyphSlot slot ) + { + if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + + + FT_FREE( slot->bitmap.buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + else + { + /* assume that the bitmap buffer was stolen or not */ + /* allocated from the heap */ + slot->bitmap.buffer = NULL; + } + } + + + FT_BASE_DEF( void ) + ft_glyphslot_preset_bitmap( FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Outline* outline = &slot->outline; + FT_Bitmap* bitmap = &slot->bitmap; + + FT_Pixel_Mode pixel_mode; + + FT_BBox cbox; + FT_Pos x_shift = 0; + FT_Pos y_shift = 0; + FT_Pos x_left, y_top; + FT_Pos width, height, pitch; + + + if ( slot->internal && ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) ) + return; + + if ( origin ) + { + x_shift = origin->x; + y_shift = origin->y; + } + + /* compute the control box, and grid-fit it, */ + /* taking into account the origin shift */ + FT_Outline_Get_CBox( outline, &cbox ); + + cbox.xMin += x_shift; + cbox.yMin += y_shift; + cbox.xMax += x_shift; + cbox.yMax += y_shift; + + switch ( mode ) + { + case FT_RENDER_MODE_MONO: + pixel_mode = FT_PIXEL_MODE_MONO; +#if 1 + /* undocumented but confirmed: bbox values get rounded */ + /* unless the rounded box can collapse for a narrow glyph */ + if ( cbox.xMax - cbox.xMin < 64 ) + { + cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); + cbox.xMax = FT_PIX_CEIL_LONG( cbox.xMax ); + } + else + { + cbox.xMin = FT_PIX_ROUND_LONG( cbox.xMin ); + cbox.xMax = FT_PIX_ROUND_LONG( cbox.xMax ); + } + + if ( cbox.yMax - cbox.yMin < 64 ) + { + cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); + cbox.yMax = FT_PIX_CEIL_LONG( cbox.yMax ); + } + else + { + cbox.yMin = FT_PIX_ROUND_LONG( cbox.yMin ); + cbox.yMax = FT_PIX_ROUND_LONG( cbox.yMax ); + } +#else + cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); + cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); + cbox.xMax = FT_PIX_CEIL_LONG( cbox.xMax ); + cbox.yMax = FT_PIX_CEIL_LONG( cbox.yMax ); +#endif + break; + + case FT_RENDER_MODE_LCD: + pixel_mode = FT_PIXEL_MODE_LCD; + ft_lcd_padding( &cbox.xMin, &cbox.xMax, slot ); + goto Round; + + case FT_RENDER_MODE_LCD_V: + pixel_mode = FT_PIXEL_MODE_LCD_V; + ft_lcd_padding( &cbox.yMin, &cbox.yMax, slot ); + goto Round; + + case FT_RENDER_MODE_NORMAL: + case FT_RENDER_MODE_LIGHT: + default: + pixel_mode = FT_PIXEL_MODE_GRAY; + Round: + cbox.xMin = FT_PIX_FLOOR( cbox.xMin ); + cbox.yMin = FT_PIX_FLOOR( cbox.yMin ); + cbox.xMax = FT_PIX_CEIL_LONG( cbox.xMax ); + cbox.yMax = FT_PIX_CEIL_LONG( cbox.yMax ); + } + + x_shift = SUB_LONG( x_shift, cbox.xMin ); + y_shift = SUB_LONG( y_shift, cbox.yMin ); + + x_left = cbox.xMin >> 6; + y_top = cbox.yMax >> 6; + + width = ( (FT_ULong)cbox.xMax - (FT_ULong)cbox.xMin ) >> 6; + height = ( (FT_ULong)cbox.yMax - (FT_ULong)cbox.yMin ) >> 6; + + switch ( pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + pitch = ( ( width + 15 ) >> 4 ) << 1; + break; + + case FT_PIXEL_MODE_LCD: + width *= 3; + pitch = FT_PAD_CEIL( width, 4 ); + break; + + case FT_PIXEL_MODE_LCD_V: + height *= 3; + /* fall through */ + + case FT_PIXEL_MODE_GRAY: + default: + pitch = width; + } + + slot->bitmap_left = (FT_Int)x_left; + slot->bitmap_top = (FT_Int)y_top; + + bitmap->pixel_mode = (unsigned char)pixel_mode; + bitmap->num_grays = 256; + bitmap->width = (unsigned int)width; + bitmap->rows = (unsigned int)height; + bitmap->pitch = pitch; + } + + + FT_BASE_DEF( void ) + ft_glyphslot_set_bitmap( FT_GlyphSlot slot, + FT_Byte* buffer ) + { + ft_glyphslot_free_bitmap( slot ); + + slot->bitmap.buffer = buffer; + + FT_ASSERT( (slot->internal->flags & FT_GLYPH_OWN_BITMAP) == 0 ); + } + + + FT_BASE_DEF( FT_Error ) + ft_glyphslot_alloc_bitmap( FT_GlyphSlot slot, + FT_ULong size ) + { + FT_Memory memory = FT_FACE_MEMORY( slot->face ); + FT_Error error; + + + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + FT_FREE( slot->bitmap.buffer ); + else + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + (void)FT_ALLOC( slot->bitmap.buffer, size ); + return error; + } + + + static void + ft_glyphslot_clear( FT_GlyphSlot slot ) + { + /* free bitmap if needed */ + ft_glyphslot_free_bitmap( slot ); + + /* clear all public fields in the glyph slot */ + FT_ZERO( &slot->metrics ); + FT_ZERO( &slot->outline ); + + slot->bitmap.width = 0; + slot->bitmap.rows = 0; + slot->bitmap.pitch = 0; + slot->bitmap.pixel_mode = 0; + /* `slot->bitmap.buffer' has been handled by ft_glyphslot_free_bitmap */ + + slot->bitmap_left = 0; + slot->bitmap_top = 0; + slot->num_subglyphs = 0; + slot->subglyphs = NULL; + slot->control_data = NULL; + slot->control_len = 0; + slot->other = NULL; + slot->format = FT_GLYPH_FORMAT_NONE; + + slot->linearHoriAdvance = 0; + slot->linearVertAdvance = 0; + slot->lsb_delta = 0; + slot->rsb_delta = 0; + } + + + static void + ft_glyphslot_done( FT_GlyphSlot slot ) + { + FT_Driver driver = slot->face->driver; + FT_Driver_Class clazz = driver->clazz; + FT_Memory memory = driver->root.memory; + + + if ( clazz->done_slot ) + clazz->done_slot( slot ); + + /* free bitmap buffer if needed */ + ft_glyphslot_free_bitmap( slot ); + + /* slot->internal might be NULL in out-of-memory situations */ + if ( slot->internal ) + { + /* free glyph loader */ + if ( FT_DRIVER_USES_OUTLINES( driver ) ) + { + FT_GlyphLoader_Done( slot->internal->loader ); + slot->internal->loader = NULL; + } + + FT_FREE( slot->internal ); + } + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_New_GlyphSlot( FT_Face face, + FT_GlyphSlot *aslot ) + { + FT_Error error; + FT_Driver driver; + FT_Driver_Class clazz; + FT_Memory memory; + FT_GlyphSlot slot = NULL; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !face->driver ) + return FT_THROW( Invalid_Argument ); + + driver = face->driver; + clazz = driver->clazz; + memory = driver->root.memory; + + FT_TRACE4(( "FT_New_GlyphSlot: Creating new slot object\n" )); + if ( !FT_ALLOC( slot, clazz->slot_object_size ) ) + { + slot->face = face; + + error = ft_glyphslot_init( slot ); + if ( error ) + { + ft_glyphslot_done( slot ); + FT_FREE( slot ); + goto Exit; + } + + slot->next = face->glyph; + face->glyph = slot; + + if ( aslot ) + *aslot = slot; + } + else if ( aslot ) + *aslot = NULL; + + + Exit: + FT_TRACE4(( "FT_New_GlyphSlot: Return 0x%x\n", error )); + + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_GlyphSlot( FT_GlyphSlot slot ) + { + if ( slot ) + { + FT_Driver driver = slot->face->driver; + FT_Memory memory = driver->root.memory; + FT_GlyphSlot prev; + FT_GlyphSlot cur; + + + /* Remove slot from its parent face's list */ + prev = NULL; + cur = slot->face->glyph; + + while ( cur ) + { + if ( cur == slot ) + { + if ( !prev ) + slot->face->glyph = cur->next; + else + prev->next = cur->next; + + /* finalize client-specific data */ + if ( slot->generic.finalizer ) + slot->generic.finalizer( slot ); + + ft_glyphslot_done( slot ); + FT_FREE( slot ); + break; + } + prev = cur; + cur = cur->next; + } + } + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Transform( FT_Face face, + FT_Matrix* matrix, + FT_Vector* delta ) + { + FT_Face_Internal internal; + + + if ( !face ) + return; + + internal = face->internal; + + internal->transform_flags = 0; + + if ( !matrix ) + { + internal->transform_matrix.xx = 0x10000L; + internal->transform_matrix.xy = 0; + internal->transform_matrix.yx = 0; + internal->transform_matrix.yy = 0x10000L; + + matrix = &internal->transform_matrix; + } + else + internal->transform_matrix = *matrix; + + /* set transform_flags bit flag 0 if `matrix' isn't the identity */ + if ( ( matrix->xy | matrix->yx ) || + matrix->xx != 0x10000L || + matrix->yy != 0x10000L ) + internal->transform_flags |= 1; + + if ( !delta ) + { + internal->transform_delta.x = 0; + internal->transform_delta.y = 0; + + delta = &internal->transform_delta; + } + else + internal->transform_delta = *delta; + + /* set transform_flags bit flag 1 if `delta' isn't the null vector */ + if ( delta->x | delta->y ) + internal->transform_flags |= 2; + } + + + static FT_Renderer + ft_lookup_glyph_renderer( FT_GlyphSlot slot ); + + +#ifdef GRID_FIT_METRICS + static void + ft_glyphslot_grid_fit_metrics( FT_GlyphSlot slot, + FT_Bool vertical ) + { + FT_Glyph_Metrics* metrics = &slot->metrics; + FT_Pos right, bottom; + + + if ( vertical ) + { + metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX ); + metrics->horiBearingY = FT_PIX_CEIL_LONG( metrics->horiBearingY ); + + right = FT_PIX_CEIL_LONG( ADD_LONG( metrics->vertBearingX, + metrics->width ) ); + bottom = FT_PIX_CEIL_LONG( ADD_LONG( metrics->vertBearingY, + metrics->height ) ); + + metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX ); + metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY ); + + metrics->width = SUB_LONG( right, + metrics->vertBearingX ); + metrics->height = SUB_LONG( bottom, + metrics->vertBearingY ); + } + else + { + metrics->vertBearingX = FT_PIX_FLOOR( metrics->vertBearingX ); + metrics->vertBearingY = FT_PIX_FLOOR( metrics->vertBearingY ); + + right = FT_PIX_CEIL_LONG( ADD_LONG( metrics->horiBearingX, + metrics->width ) ); + bottom = FT_PIX_FLOOR( SUB_LONG( metrics->horiBearingY, + metrics->height ) ); + + metrics->horiBearingX = FT_PIX_FLOOR( metrics->horiBearingX ); + metrics->horiBearingY = FT_PIX_CEIL_LONG( metrics->horiBearingY ); + + metrics->width = SUB_LONG( right, + metrics->horiBearingX ); + metrics->height = SUB_LONG( metrics->horiBearingY, + bottom ); + } + + metrics->horiAdvance = FT_PIX_ROUND_LONG( metrics->horiAdvance ); + metrics->vertAdvance = FT_PIX_ROUND_LONG( metrics->vertAdvance ); + } +#endif /* GRID_FIT_METRICS */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Load_Glyph( FT_Face face, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + FT_Driver driver; + FT_GlyphSlot slot; + FT_Library library; + FT_Bool autohint = FALSE; + FT_Module hinter; + TT_Face ttface = (TT_Face)face; + + + if ( !face || !face->size || !face->glyph ) + return FT_THROW( Invalid_Face_Handle ); + + /* The validity test for `glyph_index' is performed by the */ + /* font drivers. */ + + slot = face->glyph; + ft_glyphslot_clear( slot ); + + driver = face->driver; + library = driver->root.library; + hinter = library->auto_hinter; + + /* resolve load flags dependencies */ + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | + FT_LOAD_IGNORE_TRANSFORM; + + if ( load_flags & FT_LOAD_NO_SCALE ) + { + load_flags |= FT_LOAD_NO_HINTING | + FT_LOAD_NO_BITMAP; + + load_flags &= ~FT_LOAD_RENDER; + } + + if ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) + load_flags &= ~FT_LOAD_RENDER; + + /* + * Determine whether we need to auto-hint or not. + * The general rules are: + * + * - Do only auto-hinting if we have + * + * - a hinter module, + * - a scalable font format dealing with outlines, + * - not a tricky font, and + * - no transforms except simple slants and/or rotations by + * integer multiples of 90 degrees. + * + * - Then, auto-hint if FT_LOAD_FORCE_AUTOHINT is set or if we don't + * have a native font hinter. + * + * - Otherwise, auto-hint for LIGHT hinting mode or if there isn't + * any hinting bytecode in the TrueType/OpenType font. + * + * - Exception: The font is `tricky' and requires the native hinter to + * load properly. + */ + + if ( hinter && + !( load_flags & FT_LOAD_NO_HINTING ) && + !( load_flags & FT_LOAD_NO_AUTOHINT ) && + FT_DRIVER_IS_SCALABLE( driver ) && + FT_DRIVER_USES_OUTLINES( driver ) && + !FT_IS_TRICKY( face ) && + ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) || + ( face->internal->transform_matrix.yx == 0 && + face->internal->transform_matrix.xx != 0 ) || + ( face->internal->transform_matrix.xx == 0 && + face->internal->transform_matrix.yx != 0 ) ) ) + { + if ( ( load_flags & FT_LOAD_FORCE_AUTOHINT ) || + !FT_DRIVER_HAS_HINTER( driver ) ) + autohint = TRUE; + else + { + FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags ); + FT_Bool is_light_type1; + + + /* only the new Adobe engine (for both CFF and Type 1) is `light'; */ + /* we use `strstr' to catch both `Type 1' and `CID Type 1' */ + is_light_type1 = + ft_strstr( FT_Get_Font_Format( face ), "Type 1" ) != NULL && + ((PS_Driver)driver)->hinting_engine == FT_HINTING_ADOBE; + + /* the check for `num_locations' assures that we actually */ + /* test for instructions in a TTF and not in a CFF-based OTF */ + /* */ + /* since `maxSizeOfInstructions' might be unreliable, we */ + /* check the size of the `fpgm' and `prep' tables, too -- */ + /* the assumption is that there don't exist real TTFs where */ + /* both `fpgm' and `prep' tables are missing */ + if ( ( mode == FT_RENDER_MODE_LIGHT && + ( !FT_DRIVER_HINTS_LIGHTLY( driver ) && + !is_light_type1 ) ) || + ( FT_IS_SFNT( face ) && + ttface->num_locations && + ttface->max_profile.maxSizeOfInstructions == 0 && + ttface->font_program_size == 0 && + ttface->cvt_program_size == 0 ) ) + autohint = TRUE; + } + } + + if ( autohint ) + { + FT_AutoHinter_Interface hinting; + + + /* try to load embedded bitmaps first if available */ + /* */ + /* XXX: This is really a temporary hack that should disappear */ + /* promptly with FreeType 2.1! */ + /* */ + if ( FT_HAS_FIXED_SIZES( face ) && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) + { + error = driver->clazz->load_glyph( slot, face->size, + glyph_index, + load_flags | FT_LOAD_SBITS_ONLY ); + + if ( !error && slot->format == FT_GLYPH_FORMAT_BITMAP ) + goto Load_Ok; + } + + { + FT_Face_Internal internal = face->internal; + FT_Int transform_flags = internal->transform_flags; + + + /* since the auto-hinter calls FT_Load_Glyph by itself, */ + /* make sure that glyphs aren't transformed */ + internal->transform_flags = 0; + + /* load auto-hinted outline */ + hinting = (FT_AutoHinter_Interface)hinter->clazz->module_interface; + + error = hinting->load_glyph( (FT_AutoHinter)hinter, + slot, face->size, + glyph_index, load_flags ); + + internal->transform_flags = transform_flags; + } + } + else + { + error = driver->clazz->load_glyph( slot, + face->size, + glyph_index, + load_flags ); + if ( error ) + goto Exit; + + if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + /* check that the loaded outline is correct */ + error = FT_Outline_Check( &slot->outline ); + if ( error ) + goto Exit; + +#ifdef GRID_FIT_METRICS + if ( !( load_flags & FT_LOAD_NO_HINTING ) ) + ft_glyphslot_grid_fit_metrics( slot, + FT_BOOL( load_flags & FT_LOAD_VERTICAL_LAYOUT ) ); +#endif + } + } + + Load_Ok: + /* compute the advance */ + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + slot->advance.x = 0; + slot->advance.y = slot->metrics.vertAdvance; + } + else + { + slot->advance.x = slot->metrics.horiAdvance; + slot->advance.y = 0; + } + + /* compute the linear advance in 16.16 pixels */ + if ( ( load_flags & FT_LOAD_LINEAR_DESIGN ) == 0 && + FT_IS_SCALABLE( face ) ) + { + FT_Size_Metrics* metrics = &face->size->metrics; + + + /* it's tricky! */ + slot->linearHoriAdvance = FT_MulDiv( slot->linearHoriAdvance, + metrics->x_scale, 64 ); + + slot->linearVertAdvance = FT_MulDiv( slot->linearVertAdvance, + metrics->y_scale, 64 ); + } + + if ( ( load_flags & FT_LOAD_IGNORE_TRANSFORM ) == 0 ) + { + FT_Face_Internal internal = face->internal; + + + /* now, transform the glyph image if needed */ + if ( internal->transform_flags ) + { + /* get renderer */ + FT_Renderer renderer = ft_lookup_glyph_renderer( slot ); + + + if ( renderer ) + error = renderer->clazz->transform_glyph( + renderer, slot, + &internal->transform_matrix, + &internal->transform_delta ); + else if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + /* apply `standard' transformation if no renderer is available */ + if ( internal->transform_flags & 1 ) + FT_Outline_Transform( &slot->outline, + &internal->transform_matrix ); + + if ( internal->transform_flags & 2 ) + FT_Outline_Translate( &slot->outline, + internal->transform_delta.x, + internal->transform_delta.y ); + } + + /* transform advance */ + FT_Vector_Transform( &slot->advance, &internal->transform_matrix ); + } + } + + /* do we need to render the image or preset the bitmap now? */ + if ( !error && + ( load_flags & FT_LOAD_NO_SCALE ) == 0 && + slot->format != FT_GLYPH_FORMAT_BITMAP && + slot->format != FT_GLYPH_FORMAT_COMPOSITE ) + { + FT_Render_Mode mode = FT_LOAD_TARGET_MODE( load_flags ); + + + if ( mode == FT_RENDER_MODE_NORMAL && + load_flags & FT_LOAD_MONOCHROME ) + mode = FT_RENDER_MODE_MONO; + + if ( load_flags & FT_LOAD_RENDER ) + error = FT_Render_Glyph( slot, mode ); + else + ft_glyphslot_preset_bitmap( slot, mode, NULL ); + } + + FT_TRACE5(( "FT_Load_Glyph: index %d, flags %x\n", + glyph_index, load_flags )); + FT_TRACE5(( " x advance: %f\n", slot->advance.x / 64.0 )); + FT_TRACE5(( " y advance: %f\n", slot->advance.y / 64.0 )); + FT_TRACE5(( " linear x advance: %f\n", + slot->linearHoriAdvance / 65536.0 )); + FT_TRACE5(( " linear y advance: %f\n", + slot->linearVertAdvance / 65536.0 )); + FT_TRACE5(( " bitmap %dx%d, mode %d\n", + slot->bitmap.width, slot->bitmap.rows, + slot->bitmap.pixel_mode )); + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Load_Char( FT_Face face, + FT_ULong char_code, + FT_Int32 load_flags ) + { + FT_UInt glyph_index; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + glyph_index = (FT_UInt)char_code; + if ( face->charmap ) + glyph_index = FT_Get_Char_Index( face, char_code ); + + return FT_Load_Glyph( face, glyph_index, load_flags ); + } + + + /* destructor for sizes list */ + static void + destroy_size( FT_Memory memory, + FT_Size size, + FT_Driver driver ) + { + /* finalize client-specific data */ + if ( size->generic.finalizer ) + size->generic.finalizer( size ); + + /* finalize format-specific stuff */ + if ( driver->clazz->done_size ) + driver->clazz->done_size( size ); + + FT_FREE( size->internal ); + FT_FREE( size ); + } + + + static void + ft_cmap_done_internal( FT_CMap cmap ); + + + static void + destroy_charmaps( FT_Face face, + FT_Memory memory ) + { + FT_Int n; + + + if ( !face ) + return; + + for ( n = 0; n < face->num_charmaps; n++ ) + { + FT_CMap cmap = FT_CMAP( face->charmaps[n] ); + + + ft_cmap_done_internal( cmap ); + + face->charmaps[n] = NULL; + } + + FT_FREE( face->charmaps ); + face->num_charmaps = 0; + } + + + /* destructor for faces list */ + static void + destroy_face( FT_Memory memory, + FT_Face face, + FT_Driver driver ) + { + FT_Driver_Class clazz = driver->clazz; + + + /* discard auto-hinting data */ + if ( face->autohint.finalizer ) + face->autohint.finalizer( face->autohint.data ); + + /* Discard glyph slots for this face. */ + /* Beware! FT_Done_GlyphSlot() changes the field `face->glyph' */ + while ( face->glyph ) + FT_Done_GlyphSlot( face->glyph ); + + /* discard all sizes for this face */ + FT_List_Finalize( &face->sizes_list, + (FT_List_Destructor)destroy_size, + memory, + driver ); + face->size = NULL; + + /* now discard client data */ + if ( face->generic.finalizer ) + face->generic.finalizer( face ); + + /* discard charmaps */ + destroy_charmaps( face, memory ); + + /* finalize format-specific stuff */ + if ( clazz->done_face ) + clazz->done_face( face ); + + /* close the stream for this face if needed */ + FT_Stream_Free( + face->stream, + ( face->face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); + + face->stream = NULL; + + /* get rid of it */ + if ( face->internal ) + { + FT_FREE( face->internal ); + } + FT_FREE( face ); + } + + + static void + Destroy_Driver( FT_Driver driver ) + { + FT_List_Finalize( &driver->faces_list, + (FT_List_Destructor)destroy_face, + driver->root.memory, + driver ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* find_unicode_charmap */ + /* */ + /* */ + /* This function finds a Unicode charmap, if there is one. */ + /* And if there is more than one, it tries to favour the more */ + /* extensive one, i.e., one that supports UCS-4 against those which */ + /* are limited to the BMP (said UCS-2 encoding.) */ + /* */ + /* This function is called from open_face() (just below), and also */ + /* from FT_Select_Charmap( ..., FT_ENCODING_UNICODE ). */ + /* */ + static FT_Error + find_unicode_charmap( FT_Face face ) + { + FT_CharMap* first; + FT_CharMap* cur; + + + /* caller should have already checked that `face' is valid */ + FT_ASSERT( face ); + + first = face->charmaps; + + if ( !first ) + return FT_THROW( Invalid_CharMap_Handle ); + + /* + * The original TrueType specification(s) only specified charmap + * formats that are capable of mapping 8 or 16 bit character codes to + * glyph indices. + * + * However, recent updates to the Apple and OpenType specifications + * introduced new formats that are capable of mapping 32-bit character + * codes as well. And these are already used on some fonts, mainly to + * map non-BMP Asian ideographs as defined in Unicode. + * + * For compatibility purposes, these fonts generally come with + * *several* Unicode charmaps: + * + * - One of them in the "old" 16-bit format, that cannot access + * all glyphs in the font. + * + * - Another one in the "new" 32-bit format, that can access all + * the glyphs. + * + * This function has been written to always favor a 32-bit charmap + * when found. Otherwise, a 16-bit one is returned when found. + */ + + /* Since the `interesting' table, with IDs (3,10), is normally the */ + /* last one, we loop backwards. This loses with type1 fonts with */ + /* non-BMP characters (<.0001%), this wins with .ttf with non-BMP */ + /* chars (.01% ?), and this is the same about 99.99% of the time! */ + + cur = first + face->num_charmaps; /* points after the last one */ + + for ( ; --cur >= first; ) + { + if ( cur[0]->encoding == FT_ENCODING_UNICODE ) + { + /* XXX If some new encodings to represent UCS-4 are added, */ + /* they should be added here. */ + if ( ( cur[0]->platform_id == TT_PLATFORM_MICROSOFT && + cur[0]->encoding_id == TT_MS_ID_UCS_4 ) || + ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && + cur[0]->encoding_id == TT_APPLE_ID_UNICODE_32 ) ) + { + face->charmap = cur[0]; + return FT_Err_Ok; + } + } + } + + /* We do not have any UCS-4 charmap. */ + /* Do the loop again and search for UCS-2 charmaps. */ + cur = first + face->num_charmaps; + + for ( ; --cur >= first; ) + { + if ( cur[0]->encoding == FT_ENCODING_UNICODE ) + { + face->charmap = cur[0]; + return FT_Err_Ok; + } + } + + return FT_THROW( Invalid_CharMap_Handle ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* find_variant_selector_charmap */ + /* */ + /* */ + /* This function finds the variant selector charmap, if there is one. */ + /* There can only be one (platform=0, specific=5, format=14). */ + /* */ + static FT_CharMap + find_variant_selector_charmap( FT_Face face ) + { + FT_CharMap* first; + FT_CharMap* end; + FT_CharMap* cur; + + + /* caller should have already checked that `face' is valid */ + FT_ASSERT( face ); + + first = face->charmaps; + + if ( !first ) + return NULL; + + end = first + face->num_charmaps; /* points after the last one */ + + for ( cur = first; cur < end; cur++ ) + { + if ( cur[0]->platform_id == TT_PLATFORM_APPLE_UNICODE && + cur[0]->encoding_id == TT_APPLE_ID_VARIANT_SELECTOR && + FT_Get_CMap_Format( cur[0] ) == 14 ) + return cur[0]; + } + + return NULL; + } + + + /*************************************************************************/ + /* */ + /* */ + /* open_face */ + /* */ + /* */ + /* This function does some work for FT_Open_Face(). */ + /* */ + static FT_Error + open_face( FT_Driver driver, + FT_Stream *astream, + FT_Bool external_stream, + FT_Long face_index, + FT_Int num_params, + FT_Parameter* params, + FT_Face *aface ) + { + FT_Memory memory; + FT_Driver_Class clazz; + FT_Face face = NULL; + FT_Face_Internal internal = NULL; + + FT_Error error, error2; + + + clazz = driver->clazz; + memory = driver->root.memory; + + /* allocate the face object and perform basic initialization */ + if ( FT_ALLOC( face, clazz->face_object_size ) ) + goto Fail; + + face->driver = driver; + face->memory = memory; + face->stream = *astream; + + /* set the FT_FACE_FLAG_EXTERNAL_STREAM bit for FT_Done_Face */ + if ( external_stream ) + face->face_flags |= FT_FACE_FLAG_EXTERNAL_STREAM; + + if ( FT_NEW( internal ) ) + goto Fail; + + face->internal = internal; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + { + int i; + + + face->internal->incremental_interface = NULL; + for ( i = 0; i < num_params && !face->internal->incremental_interface; + i++ ) + if ( params[i].tag == FT_PARAM_TAG_INCREMENTAL ) + face->internal->incremental_interface = + (FT_Incremental_Interface)params[i].data; + } +#endif + + face->internal->random_seed = -1; + + if ( clazz->init_face ) + error = clazz->init_face( *astream, + face, + (FT_Int)face_index, + num_params, + params ); + *astream = face->stream; /* Stream may have been changed. */ + if ( error ) + goto Fail; + + /* select Unicode charmap by default */ + error2 = find_unicode_charmap( face ); + + /* if no Unicode charmap can be found, FT_Err_Invalid_CharMap_Handle */ + /* is returned. */ + + /* no error should happen, but we want to play safe */ + if ( error2 && FT_ERR_NEQ( error2, Invalid_CharMap_Handle ) ) + { + error = error2; + goto Fail; + } + + *aface = face; + + Fail: + if ( error ) + { + destroy_charmaps( face, memory ); + if ( clazz->done_face ) + clazz->done_face( face ); + FT_FREE( internal ); + FT_FREE( face ); + *aface = NULL; + } + + return error; + } + + + /* there's a Mac-specific extended implementation of FT_New_Face() */ + /* in src/base/ftmac.c */ + +#ifndef FT_MACINTOSH + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Face( FT_Library library, + const char* pathname, + FT_Long face_index, + FT_Face *aface ) + { + FT_Open_Args args; + + + /* test for valid `library' and `aface' delayed to `FT_Open_Face' */ + if ( !pathname ) + return FT_THROW( Invalid_Argument ); + + args.flags = FT_OPEN_PATHNAME; + args.pathname = (char*)pathname; + args.stream = NULL; + + return ft_open_face_internal( library, &args, face_index, aface, 1 ); + } + +#endif + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Memory_Face( FT_Library library, + const FT_Byte* file_base, + FT_Long file_size, + FT_Long face_index, + FT_Face *aface ) + { + FT_Open_Args args; + + + /* test for valid `library' and `face' delayed to `FT_Open_Face' */ + if ( !file_base ) + return FT_THROW( Invalid_Argument ); + + args.flags = FT_OPEN_MEMORY; + args.memory_base = file_base; + args.memory_size = file_size; + args.stream = NULL; + + return ft_open_face_internal( library, &args, face_index, aface, 1 ); + } + + +#ifdef FT_CONFIG_OPTION_MAC_FONTS + + /* The behavior here is very similar to that in base/ftmac.c, but it */ + /* is designed to work on non-mac systems, so no mac specific calls. */ + /* */ + /* We look at the file and determine if it is a mac dfont file or a mac */ + /* resource file, or a macbinary file containing a mac resource file. */ + /* */ + /* Unlike ftmac I'm not going to look at a `FOND'. I don't really see */ + /* the point, especially since there may be multiple `FOND' resources. */ + /* Instead I'll just look for `sfnt' and `POST' resources, ordered as */ + /* they occur in the file. */ + /* */ + /* Note that multiple `POST' resources do not mean multiple postscript */ + /* fonts; they all get jammed together to make what is essentially a */ + /* pfb file. */ + /* */ + /* We aren't interested in `NFNT' or `FONT' bitmap resources. */ + /* */ + /* As soon as we get an `sfnt' load it into memory and pass it off to */ + /* FT_Open_Face. */ + /* */ + /* If we have a (set of) `POST' resources, massage them into a (memory) */ + /* pfb file and pass that to FT_Open_Face. (As with ftmac.c I'm not */ + /* going to try to save the kerning info. After all that lives in the */ + /* `FOND' which isn't in the file containing the `POST' resources so */ + /* we don't really have access to it. */ + + + /* Finalizer for a memory stream; gets called by FT_Done_Face(). */ + /* It frees the memory it uses. */ + /* From `ftmac.c'. */ + static void + memory_stream_close( FT_Stream stream ) + { + FT_Memory memory = stream->memory; + + + FT_FREE( stream->base ); + + stream->size = 0; + stream->base = NULL; + stream->close = NULL; + } + + + /* Create a new memory stream from a buffer and a size. */ + /* From `ftmac.c'. */ + static FT_Error + new_memory_stream( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Stream_CloseFunc close, + FT_Stream *astream ) + { + FT_Error error; + FT_Memory memory; + FT_Stream stream = NULL; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !base ) + return FT_THROW( Invalid_Argument ); + + *astream = NULL; + memory = library->memory; + if ( FT_NEW( stream ) ) + goto Exit; + + FT_Stream_OpenMemory( stream, base, size ); + + stream->close = close; + + *astream = stream; + + Exit: + return error; + } + + + /* Create a new FT_Face given a buffer and a driver name. */ + /* From `ftmac.c'. */ + FT_LOCAL_DEF( FT_Error ) + open_face_from_buffer( FT_Library library, + FT_Byte* base, + FT_ULong size, + FT_Long face_index, + const char* driver_name, + FT_Face *aface ) + { + FT_Open_Args args; + FT_Error error; + FT_Stream stream = NULL; + FT_Memory memory = library->memory; + + + error = new_memory_stream( library, + base, + size, + memory_stream_close, + &stream ); + if ( error ) + { + FT_FREE( base ); + return error; + } + + args.flags = FT_OPEN_STREAM; + args.stream = stream; + if ( driver_name ) + { + args.flags = args.flags | FT_OPEN_DRIVER; + args.driver = FT_Get_Module( library, driver_name ); + } + +#ifdef FT_MACINTOSH + /* At this point, the face index has served its purpose; */ + /* whoever calls this function has already used it to */ + /* locate the correct font data. We should not propagate */ + /* this index to FT_Open_Face() (unless it is negative). */ + + if ( face_index > 0 ) + face_index &= 0x7FFF0000L; /* retain GX data */ +#endif + + error = ft_open_face_internal( library, &args, face_index, aface, 0 ); + + if ( !error ) + (*aface)->face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; + else +#ifdef FT_MACINTOSH + FT_Stream_Free( stream, 0 ); +#else + { + FT_Stream_Close( stream ); + FT_FREE( stream ); + } +#endif + + return error; + } + + + /* Look up `TYP1' or `CID ' table from sfnt table directory. */ + /* `offset' and `length' must exclude the binary header in tables. */ + + /* Type 1 and CID-keyed font drivers should recognize sfnt-wrapped */ + /* format too. Here, since we can't expect that the TrueType font */ + /* driver is loaded unconditionally, we must parse the font by */ + /* ourselves. We are only interested in the name of the table and */ + /* the offset. */ + + static FT_Error + ft_lookup_PS_in_sfnt_stream( FT_Stream stream, + FT_Long face_index, + FT_ULong* offset, + FT_ULong* length, + FT_Bool* is_sfnt_cid ) + { + FT_Error error; + FT_UShort numTables; + FT_Long pstable_index; + FT_ULong tag; + int i; + + + *offset = 0; + *length = 0; + *is_sfnt_cid = FALSE; + + /* TODO: support for sfnt-wrapped PS/CID in TTC format */ + + /* version check for 'typ1' (should be ignored?) */ + if ( FT_READ_ULONG( tag ) ) + return error; + if ( tag != TTAG_typ1 ) + return FT_THROW( Unknown_File_Format ); + + if ( FT_READ_USHORT( numTables ) ) + return error; + if ( FT_STREAM_SKIP( 2 * 3 ) ) /* skip binary search header */ + return error; + + pstable_index = -1; + *is_sfnt_cid = FALSE; + + for ( i = 0; i < numTables; i++ ) + { + if ( FT_READ_ULONG( tag ) || FT_STREAM_SKIP( 4 ) || + FT_READ_ULONG( *offset ) || FT_READ_ULONG( *length ) ) + return error; + + if ( tag == TTAG_CID ) + { + pstable_index++; + *offset += 22; + *length -= 22; + *is_sfnt_cid = TRUE; + if ( face_index < 0 ) + return FT_Err_Ok; + } + else if ( tag == TTAG_TYP1 ) + { + pstable_index++; + *offset += 24; + *length -= 24; + *is_sfnt_cid = FALSE; + if ( face_index < 0 ) + return FT_Err_Ok; + } + if ( face_index >= 0 && pstable_index == face_index ) + return FT_Err_Ok; + } + + return FT_THROW( Table_Missing ); + } + + + FT_LOCAL_DEF( FT_Error ) + open_face_PS_from_sfnt_stream( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Int num_params, + FT_Parameter *params, + FT_Face *aface ) + { + FT_Error error; + FT_Memory memory = library->memory; + FT_ULong offset, length; + FT_ULong pos; + FT_Bool is_sfnt_cid; + FT_Byte* sfnt_ps = NULL; + + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + /* ignore GX stuff */ + if ( face_index > 0 ) + face_index &= 0xFFFFL; + + pos = FT_STREAM_POS(); + + error = ft_lookup_PS_in_sfnt_stream( stream, + face_index, + &offset, + &length, + &is_sfnt_cid ); + if ( error ) + goto Exit; + + if ( offset > stream->size ) + { + FT_TRACE2(( "open_face_PS_from_sfnt_stream: invalid table offset\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + else if ( length > stream->size - offset ) + { + FT_TRACE2(( "open_face_PS_from_sfnt_stream: invalid table length\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + error = FT_Stream_Seek( stream, pos + offset ); + if ( error ) + goto Exit; + + if ( FT_ALLOC( sfnt_ps, (FT_Long)length ) ) + goto Exit; + + error = FT_Stream_Read( stream, (FT_Byte *)sfnt_ps, length ); + if ( error ) + { + FT_FREE( sfnt_ps ); + goto Exit; + } + + error = open_face_from_buffer( library, + sfnt_ps, + length, + FT_MIN( face_index, 0 ), + is_sfnt_cid ? "cid" : "type1", + aface ); + Exit: + { + FT_Error error1; + + + if ( FT_ERR_EQ( error, Unknown_File_Format ) ) + { + error1 = FT_Stream_Seek( stream, pos ); + if ( error1 ) + return error1; + } + + return error; + } + } + + +#ifndef FT_MACINTOSH + + /* The resource header says we've got resource_cnt `POST' (type1) */ + /* resources in this file. They all need to be coalesced into */ + /* one lump which gets passed on to the type1 driver. */ + /* Here can be only one PostScript font in a file so face_index */ + /* must be 0 (or -1). */ + /* */ + static FT_Error + Mac_Read_POST_Resource( FT_Library library, + FT_Stream stream, + FT_Long *offsets, + FT_Long resource_cnt, + FT_Long face_index, + FT_Face *aface ) + { + FT_Error error = FT_ERR( Cannot_Open_Resource ); + FT_Memory memory = library->memory; + + FT_Byte* pfb_data = NULL; + int i, type, flags; + FT_ULong len; + FT_ULong pfb_len, pfb_pos, pfb_lenpos; + FT_ULong rlen, temp; + + + if ( face_index == -1 ) + face_index = 0; + if ( face_index != 0 ) + return error; + + /* Find the length of all the POST resources, concatenated. Assume */ + /* worst case (each resource in its own section). */ + pfb_len = 0; + for ( i = 0; i < resource_cnt; i++ ) + { + error = FT_Stream_Seek( stream, (FT_ULong)offsets[i] ); + if ( error ) + goto Exit; + if ( FT_READ_ULONG( temp ) ) /* actually LONG */ + goto Exit; + + /* FT2 allocator takes signed long buffer length, + * too large value causing overflow should be checked + */ + FT_TRACE4(( " POST fragment #%d: length=0x%08x" + " total pfb_len=0x%08x\n", + i, temp, pfb_len + temp + 6 )); + + if ( FT_MAC_RFORK_MAX_LEN < temp || + FT_MAC_RFORK_MAX_LEN - temp < pfb_len + 6 ) + { + FT_TRACE2(( " MacOS resource length cannot exceed" + " 0x%08x\n", + FT_MAC_RFORK_MAX_LEN )); + + error = FT_THROW( Invalid_Offset ); + goto Exit; + } + + pfb_len += temp + 6; + } + + FT_TRACE2(( " total buffer size to concatenate" + " %d POST fragments: 0x%08x\n", + resource_cnt, pfb_len + 2 )); + + if ( pfb_len + 2 < 6 ) + { + FT_TRACE2(( " too long fragment length makes" + " pfb_len confused: pfb_len=0x%08x\n", + pfb_len )); + + error = FT_THROW( Array_Too_Large ); + goto Exit; + } + + if ( FT_ALLOC( pfb_data, (FT_Long)pfb_len + 2 ) ) + goto Exit; + + pfb_data[0] = 0x80; + pfb_data[1] = 1; /* Ascii section */ + pfb_data[2] = 0; /* 4-byte length, fill in later */ + pfb_data[3] = 0; + pfb_data[4] = 0; + pfb_data[5] = 0; + pfb_pos = 6; + pfb_lenpos = 2; + + len = 0; + type = 1; + + for ( i = 0; i < resource_cnt; i++ ) + { + error = FT_Stream_Seek( stream, (FT_ULong)offsets[i] ); + if ( error ) + goto Exit2; + if ( FT_READ_ULONG( rlen ) ) + goto Exit2; + + /* FT2 allocator takes signed long buffer length, + * too large fragment length causing overflow should be checked + */ + if ( 0x7FFFFFFFUL < rlen ) + { + error = FT_THROW( Invalid_Offset ); + goto Exit2; + } + + if ( FT_READ_USHORT( flags ) ) + goto Exit2; + + FT_TRACE3(( "POST fragment[%d]:" + " offsets=0x%08x, rlen=0x%08x, flags=0x%04x\n", + i, offsets[i], rlen, flags )); + + error = FT_ERR( Array_Too_Large ); + + /* postpone the check of `rlen longer than buffer' */ + /* until `FT_Stream_Read' */ + + if ( ( flags >> 8 ) == 0 ) /* Comment, should not be loaded */ + { + FT_TRACE3(( " Skip POST fragment #%d because it is a comment\n", + i )); + continue; + } + + /* the flags are part of the resource, so rlen >= 2, */ + /* but some fonts declare rlen = 0 for empty fragment */ + if ( rlen > 2 ) + rlen -= 2; + else + rlen = 0; + + if ( ( flags >> 8 ) == type ) + len += rlen; + else + { + FT_TRACE3(( " Write POST fragment #%d header (4-byte) to buffer" + " %p + 0x%08x\n", + i, pfb_data, pfb_lenpos )); + + if ( pfb_lenpos + 3 > pfb_len + 2 ) + goto Exit2; + + pfb_data[pfb_lenpos ] = (FT_Byte)( len ); + pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); + pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); + pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); + + if ( ( flags >> 8 ) == 5 ) /* End of font mark */ + break; + + FT_TRACE3(( " Write POST fragment #%d header (6-byte) to buffer" + " %p + 0x%08x\n", + i, pfb_data, pfb_pos )); + + if ( pfb_pos + 6 > pfb_len + 2 ) + goto Exit2; + + pfb_data[pfb_pos++] = 0x80; + + type = flags >> 8; + len = rlen; + + pfb_data[pfb_pos++] = (FT_Byte)type; + pfb_lenpos = pfb_pos; + pfb_data[pfb_pos++] = 0; /* 4-byte length, fill in later */ + pfb_data[pfb_pos++] = 0; + pfb_data[pfb_pos++] = 0; + pfb_data[pfb_pos++] = 0; + } + + if ( pfb_pos > pfb_len || pfb_pos + rlen > pfb_len ) + goto Exit2; + + FT_TRACE3(( " Load POST fragment #%d (%d byte) to buffer" + " %p + 0x%08x\n", + i, rlen, pfb_data, pfb_pos )); + + error = FT_Stream_Read( stream, (FT_Byte *)pfb_data + pfb_pos, rlen ); + if ( error ) + goto Exit2; + + pfb_pos += rlen; + } + + error = FT_ERR( Array_Too_Large ); + + if ( pfb_pos + 2 > pfb_len + 2 ) + goto Exit2; + pfb_data[pfb_pos++] = 0x80; + pfb_data[pfb_pos++] = 3; + + if ( pfb_lenpos + 3 > pfb_len + 2 ) + goto Exit2; + pfb_data[pfb_lenpos ] = (FT_Byte)( len ); + pfb_data[pfb_lenpos + 1] = (FT_Byte)( len >> 8 ); + pfb_data[pfb_lenpos + 2] = (FT_Byte)( len >> 16 ); + pfb_data[pfb_lenpos + 3] = (FT_Byte)( len >> 24 ); + + return open_face_from_buffer( library, + pfb_data, + pfb_pos, + face_index, + "type1", + aface ); + + Exit2: + if ( FT_ERR_EQ( error, Array_Too_Large ) ) + FT_TRACE2(( " Abort due to too-short buffer to store" + " all POST fragments\n" )); + else if ( FT_ERR_EQ( error, Invalid_Offset ) ) + FT_TRACE2(( " Abort due to invalid offset in a POST fragment\n" )); + + if ( error ) + error = FT_ERR( Cannot_Open_Resource ); + FT_FREE( pfb_data ); + + Exit: + return error; + } + + + /* The resource header says we've got resource_cnt `sfnt' */ + /* (TrueType/OpenType) resources in this file. Look through */ + /* them for the one indicated by face_index, load it into mem, */ + /* pass it on to the truetype driver, and return it. */ + /* */ + static FT_Error + Mac_Read_sfnt_Resource( FT_Library library, + FT_Stream stream, + FT_Long *offsets, + FT_Long resource_cnt, + FT_Long face_index, + FT_Face *aface ) + { + FT_Memory memory = library->memory; + FT_Byte* sfnt_data = NULL; + FT_Error error; + FT_ULong flag_offset; + FT_Long rlen; + int is_cff; + FT_Long face_index_in_resource = 0; + + + if ( face_index < 0 ) + face_index = -face_index - 1; + if ( face_index >= resource_cnt ) + return FT_THROW( Cannot_Open_Resource ); + + flag_offset = (FT_ULong)offsets[face_index]; + error = FT_Stream_Seek( stream, flag_offset ); + if ( error ) + goto Exit; + + if ( FT_READ_LONG( rlen ) ) + goto Exit; + if ( rlen < 1 ) + return FT_THROW( Cannot_Open_Resource ); + if ( (FT_ULong)rlen > FT_MAC_RFORK_MAX_LEN ) + return FT_THROW( Invalid_Offset ); + + error = open_face_PS_from_sfnt_stream( library, + stream, + face_index, + 0, NULL, + aface ); + if ( !error ) + goto Exit; + + /* rewind sfnt stream before open_face_PS_from_sfnt_stream() */ + error = FT_Stream_Seek( stream, flag_offset + 4 ); + if ( error ) + goto Exit; + + if ( FT_ALLOC( sfnt_data, rlen ) ) + return error; + error = FT_Stream_Read( stream, (FT_Byte *)sfnt_data, (FT_ULong)rlen ); + if ( error ) { + FT_FREE( sfnt_data ); + goto Exit; + } + + is_cff = rlen > 4 && !ft_memcmp( sfnt_data, "OTTO", 4 ); + error = open_face_from_buffer( library, + sfnt_data, + (FT_ULong)rlen, + face_index_in_resource, + is_cff ? "cff" : "truetype", + aface ); + + Exit: + return error; + } + + + /* Check for a valid resource fork header, or a valid dfont */ + /* header. In a resource fork the first 16 bytes are repeated */ + /* at the location specified by bytes 4-7. In a dfont bytes */ + /* 4-7 point to 16 bytes of zeroes instead. */ + /* */ + static FT_Error + IsMacResource( FT_Library library, + FT_Stream stream, + FT_Long resource_offset, + FT_Long face_index, + FT_Face *aface ) + { + FT_Memory memory = library->memory; + FT_Error error; + FT_Long map_offset, rdata_pos; + FT_Long *data_offsets; + FT_Long count; + + + error = FT_Raccess_Get_HeaderInfo( library, stream, resource_offset, + &map_offset, &rdata_pos ); + if ( error ) + return error; + + /* POST resources must be sorted to concatenate properly */ + error = FT_Raccess_Get_DataOffsets( library, stream, + map_offset, rdata_pos, + TTAG_POST, TRUE, + &data_offsets, &count ); + if ( !error ) + { + error = Mac_Read_POST_Resource( library, stream, data_offsets, count, + face_index, aface ); + FT_FREE( data_offsets ); + /* POST exists in an LWFN providing a single face */ + if ( !error ) + (*aface)->num_faces = 1; + return error; + } + + /* sfnt resources should not be sorted to preserve the face order by + QuickDraw API */ + error = FT_Raccess_Get_DataOffsets( library, stream, + map_offset, rdata_pos, + TTAG_sfnt, FALSE, + &data_offsets, &count ); + if ( !error ) + { + FT_Long face_index_internal = face_index % count; + + + error = Mac_Read_sfnt_Resource( library, stream, data_offsets, count, + face_index_internal, aface ); + FT_FREE( data_offsets ); + if ( !error ) + (*aface)->num_faces = count; + } + + return error; + } + + + /* Check for a valid macbinary header, and if we find one */ + /* check that the (flattened) resource fork in it is valid. */ + /* */ + static FT_Error + IsMacBinary( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface ) + { + unsigned char header[128]; + FT_Error error; + FT_Long dlen, offset; + + + if ( !stream ) + return FT_THROW( Invalid_Stream_Operation ); + + error = FT_Stream_Seek( stream, 0 ); + if ( error ) + goto Exit; + + error = FT_Stream_Read( stream, (FT_Byte*)header, 128 ); + if ( error ) + goto Exit; + + if ( header[ 0] != 0 || + header[74] != 0 || + header[82] != 0 || + header[ 1] == 0 || + header[ 1] > 33 || + header[63] != 0 || + header[2 + header[1]] != 0 || + header[0x53] > 0x7F ) + return FT_THROW( Unknown_File_Format ); + + dlen = ( header[0x53] << 24 ) | + ( header[0x54] << 16 ) | + ( header[0x55] << 8 ) | + header[0x56]; +#if 0 + rlen = ( header[0x57] << 24 ) | + ( header[0x58] << 16 ) | + ( header[0x59] << 8 ) | + header[0x5A]; +#endif /* 0 */ + offset = 128 + ( ( dlen + 127 ) & ~127 ); + + return IsMacResource( library, stream, offset, face_index, aface ); + + Exit: + return error; + } + + + static FT_Error + load_face_in_embedded_rfork( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface, + const FT_Open_Args *args ) + { + +#undef FT_COMPONENT +#define FT_COMPONENT trace_raccess + + FT_Memory memory = library->memory; + FT_Error error = FT_ERR( Unknown_File_Format ); + FT_UInt i; + + char * file_names[FT_RACCESS_N_RULES]; + FT_Long offsets[FT_RACCESS_N_RULES]; + FT_Error errors[FT_RACCESS_N_RULES]; + FT_Bool is_darwin_vfs, vfs_rfork_has_no_font = FALSE; /* not tested */ + + FT_Open_Args args2; + FT_Stream stream2 = NULL; + + + FT_Raccess_Guess( library, stream, + args->pathname, file_names, offsets, errors ); + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + is_darwin_vfs = ft_raccess_rule_by_darwin_vfs( library, i ); + if ( is_darwin_vfs && vfs_rfork_has_no_font ) + { + FT_TRACE3(( "Skip rule %d: darwin vfs resource fork" + " is already checked and" + " no font is found\n", + i )); + continue; + } + + if ( errors[i] ) + { + FT_TRACE3(( "Error 0x%x has occurred in rule %d\n", + errors[i], i )); + continue; + } + + args2.flags = FT_OPEN_PATHNAME; + args2.pathname = file_names[i] ? file_names[i] : args->pathname; + + FT_TRACE3(( "Try rule %d: %s (offset=%d) ...", + i, args2.pathname, offsets[i] )); + + error = FT_Stream_New( library, &args2, &stream2 ); + if ( is_darwin_vfs && FT_ERR_EQ( error, Cannot_Open_Stream ) ) + vfs_rfork_has_no_font = TRUE; + + if ( error ) + { + FT_TRACE3(( "failed\n" )); + continue; + } + + error = IsMacResource( library, stream2, offsets[i], + face_index, aface ); + FT_Stream_Free( stream2, 0 ); + + FT_TRACE3(( "%s\n", error ? "failed": "successful" )); + + if ( !error ) + break; + else if ( is_darwin_vfs ) + vfs_rfork_has_no_font = TRUE; + } + + for (i = 0; i < FT_RACCESS_N_RULES; i++) + { + if ( file_names[i] ) + FT_FREE( file_names[i] ); + } + + /* Caller (load_mac_face) requires FT_Err_Unknown_File_Format. */ + if ( error ) + error = FT_ERR( Unknown_File_Format ); + + return error; + +#undef FT_COMPONENT +#define FT_COMPONENT trace_objs + + } + + + /* Check for some macintosh formats without Carbon framework. */ + /* Is this a macbinary file? If so look at the resource fork. */ + /* Is this a mac dfont file? */ + /* Is this an old style resource fork? (in data) */ + /* Else call load_face_in_embedded_rfork to try extra rules */ + /* (defined in `ftrfork.c'). */ + /* */ + static FT_Error + load_mac_face( FT_Library library, + FT_Stream stream, + FT_Long face_index, + FT_Face *aface, + const FT_Open_Args *args ) + { + FT_Error error; + FT_UNUSED( args ); + + + error = IsMacBinary( library, stream, face_index, aface ); + if ( FT_ERR_EQ( error, Unknown_File_Format ) ) + { + +#undef FT_COMPONENT +#define FT_COMPONENT trace_raccess + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE3(( "Try as dfont: " )); + if ( !( args->flags & FT_OPEN_MEMORY ) ) + FT_TRACE3(( "%s ...", args->pathname )); +#endif + + error = IsMacResource( library, stream, 0, face_index, aface ); + + FT_TRACE3(( "%s\n", error ? "failed" : "successful" )); + +#undef FT_COMPONENT +#define FT_COMPONENT trace_objs + + } + + if ( ( FT_ERR_EQ( error, Unknown_File_Format ) || + FT_ERR_EQ( error, Invalid_Stream_Operation ) ) && + ( args->flags & FT_OPEN_PATHNAME ) ) + error = load_face_in_embedded_rfork( library, stream, + face_index, aface, args ); + return error; + } +#endif + +#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Open_Face( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface ) + { + return ft_open_face_internal( library, args, face_index, aface, 1 ); + } + + + static FT_Error + ft_open_face_internal( FT_Library library, + const FT_Open_Args* args, + FT_Long face_index, + FT_Face *aface, + FT_Bool test_mac_fonts ) + { + FT_Error error; + FT_Driver driver = NULL; + FT_Memory memory = NULL; + FT_Stream stream = NULL; + FT_Face face = NULL; + FT_ListNode node = NULL; + FT_Bool external_stream; + FT_Module* cur; + FT_Module* limit; + +#ifndef FT_CONFIG_OPTION_MAC_FONTS + FT_UNUSED( test_mac_fonts ); +#endif + + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE3(( "FT_Open_Face: " )); + if ( face_index < 0 ) + FT_TRACE3(( "Requesting number of faces and named instances\n")); + else + { + FT_TRACE3(( "Requesting face %ld", face_index & 0xFFFFL )); + if ( face_index & 0x7FFF0000L ) + FT_TRACE3(( ", named instance %ld", face_index >> 16 )); + FT_TRACE3(( "\n" )); + } +#endif + + /* test for valid `library' delayed to `FT_Stream_New' */ + + if ( ( !aface && face_index >= 0 ) || !args ) + return FT_THROW( Invalid_Argument ); + + external_stream = FT_BOOL( ( args->flags & FT_OPEN_STREAM ) && + args->stream ); + + /* create input stream */ + error = FT_Stream_New( library, args, &stream ); + if ( error ) + goto Fail3; + + memory = library->memory; + + /* If the font driver is specified in the `args' structure, use */ + /* it. Otherwise, we scan the list of registered drivers. */ + if ( ( args->flags & FT_OPEN_DRIVER ) && args->driver ) + { + driver = FT_DRIVER( args->driver ); + + /* not all modules are drivers, so check... */ + if ( FT_MODULE_IS_DRIVER( driver ) ) + { + FT_Int num_params = 0; + FT_Parameter* params = NULL; + + + if ( args->flags & FT_OPEN_PARAMS ) + { + num_params = args->num_params; + params = args->params; + } + + error = open_face( driver, &stream, external_stream, face_index, + num_params, params, &face ); + if ( !error ) + goto Success; + } + else + error = FT_THROW( Invalid_Handle ); + + FT_Stream_Free( stream, external_stream ); + goto Fail; + } + else + { + error = FT_ERR( Missing_Module ); + + /* check each font driver for an appropriate format */ + cur = library->modules; + limit = cur + library->num_modules; + + for ( ; cur < limit; cur++ ) + { + /* not all modules are font drivers, so check... */ + if ( FT_MODULE_IS_DRIVER( cur[0] ) ) + { + FT_Int num_params = 0; + FT_Parameter* params = NULL; + + + driver = FT_DRIVER( cur[0] ); + + if ( args->flags & FT_OPEN_PARAMS ) + { + num_params = args->num_params; + params = args->params; + } + + error = open_face( driver, &stream, external_stream, face_index, + num_params, params, &face ); + if ( !error ) + goto Success; + +#ifdef FT_CONFIG_OPTION_MAC_FONTS + if ( test_mac_fonts && + ft_strcmp( cur[0]->clazz->module_name, "truetype" ) == 0 && + FT_ERR_EQ( error, Table_Missing ) ) + { + /* TrueType but essential tables are missing */ + error = FT_Stream_Seek( stream, 0 ); + if ( error ) + break; + + error = open_face_PS_from_sfnt_stream( library, + stream, + face_index, + num_params, + params, + aface ); + if ( !error ) + { + FT_Stream_Free( stream, external_stream ); + return error; + } + } +#endif + + if ( FT_ERR_NEQ( error, Unknown_File_Format ) ) + goto Fail3; + } + } + + Fail3: + /* If we are on the mac, and we get an */ + /* FT_Err_Invalid_Stream_Operation it may be because we have an */ + /* empty data fork, so we need to check the resource fork. */ + if ( FT_ERR_NEQ( error, Cannot_Open_Stream ) && + FT_ERR_NEQ( error, Unknown_File_Format ) && + FT_ERR_NEQ( error, Invalid_Stream_Operation ) ) + goto Fail2; + +#if !defined( FT_MACINTOSH ) && defined( FT_CONFIG_OPTION_MAC_FONTS ) + if ( test_mac_fonts ) + { + error = load_mac_face( library, stream, face_index, aface, args ); + if ( !error ) + { + /* We don't want to go to Success here. We've already done */ + /* that. On the other hand, if we succeeded we still need to */ + /* close this stream (we opened a different stream which */ + /* extracted the interesting information out of this stream */ + /* here. That stream will still be open and the face will */ + /* point to it). */ + FT_Stream_Free( stream, external_stream ); + return error; + } + } + + if ( FT_ERR_NEQ( error, Unknown_File_Format ) ) + goto Fail2; +#endif /* !FT_MACINTOSH && FT_CONFIG_OPTION_MAC_FONTS */ + + /* no driver is able to handle this format */ + error = FT_THROW( Unknown_File_Format ); + + Fail2: + FT_Stream_Free( stream, external_stream ); + goto Fail; + } + + Success: + FT_TRACE4(( "FT_Open_Face: New face object, adding to list\n" )); + + /* add the face object to its driver's list */ + if ( FT_NEW( node ) ) + goto Fail; + + node->data = face; + /* don't assume driver is the same as face->driver, so use */ + /* face->driver instead. */ + FT_List_Add( &face->driver->faces_list, node ); + + /* now allocate a glyph slot object for the face */ + FT_TRACE4(( "FT_Open_Face: Creating glyph slot\n" )); + + if ( face_index >= 0 ) + { + error = FT_New_GlyphSlot( face, NULL ); + if ( error ) + goto Fail; + + /* finally, allocate a size object for the face */ + { + FT_Size size; + + + FT_TRACE4(( "FT_Open_Face: Creating size object\n" )); + + error = FT_New_Size( face, &size ); + if ( error ) + goto Fail; + + face->size = size; + } + } + + /* some checks */ + + if ( FT_IS_SCALABLE( face ) ) + { + if ( face->height < 0 ) + face->height = (FT_Short)-face->height; + + if ( !FT_HAS_VERTICAL( face ) ) + face->max_advance_height = (FT_Short)face->height; + } + + if ( FT_HAS_FIXED_SIZES( face ) ) + { + FT_Int i; + + + for ( i = 0; i < face->num_fixed_sizes; i++ ) + { + FT_Bitmap_Size* bsize = face->available_sizes + i; + + + if ( bsize->height < 0 ) + bsize->height = -bsize->height; + if ( bsize->x_ppem < 0 ) + bsize->x_ppem = -bsize->x_ppem; + if ( bsize->y_ppem < 0 ) + bsize->y_ppem = -bsize->y_ppem; + + /* check whether negation actually has worked */ + if ( bsize->height < 0 || bsize->x_ppem < 0 || bsize->y_ppem < 0 ) + { + FT_TRACE0(( "FT_Open_Face:" + " Invalid bitmap dimensions for strike %d," + " now disabled\n", i )); + bsize->width = 0; + bsize->height = 0; + bsize->size = 0; + bsize->x_ppem = 0; + bsize->y_ppem = 0; + } + } + } + + /* initialize internal face data */ + { + FT_Face_Internal internal = face->internal; + + + internal->transform_matrix.xx = 0x10000L; + internal->transform_matrix.xy = 0; + internal->transform_matrix.yx = 0; + internal->transform_matrix.yy = 0x10000L; + + internal->transform_delta.x = 0; + internal->transform_delta.y = 0; + + internal->refcount = 1; + + internal->no_stem_darkening = -1; + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + /* Per-face filtering can only be set up by FT_Face_Properties */ + internal->lcd_filter_func = NULL; +#endif + } + + if ( aface ) + *aface = face; + else + FT_Done_Face( face ); + + goto Exit; + + Fail: + if ( node ) + FT_Done_Face( face ); /* face must be in the driver's list */ + else if ( face ) + destroy_face( memory, face, driver ); + + Exit: +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !error && face_index < 0 ) + { + FT_TRACE3(( "FT_Open_Face: The font has %ld face%s\n" + " and %ld named instance%s for face %ld\n", + face->num_faces, + face->num_faces == 1 ? "" : "s", + face->style_flags >> 16, + ( face->style_flags >> 16 ) == 1 ? "" : "s", + -face_index - 1 )); + } +#endif + + FT_TRACE4(( "FT_Open_Face: Return 0x%x\n", error )); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Attach_File( FT_Face face, + const char* filepathname ) + { + FT_Open_Args open; + + + /* test for valid `face' delayed to `FT_Attach_Stream' */ + + if ( !filepathname ) + return FT_THROW( Invalid_Argument ); + + open.stream = NULL; + open.flags = FT_OPEN_PATHNAME; + open.pathname = (char*)filepathname; + + return FT_Attach_Stream( face, &open ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Attach_Stream( FT_Face face, + FT_Open_Args* parameters ) + { + FT_Stream stream; + FT_Error error; + FT_Driver driver; + + FT_Driver_Class clazz; + + + /* test for valid `parameters' delayed to `FT_Stream_New' */ + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + driver = face->driver; + if ( !driver ) + return FT_THROW( Invalid_Driver_Handle ); + + error = FT_Stream_New( driver->root.library, parameters, &stream ); + if ( error ) + goto Exit; + + /* we implement FT_Attach_Stream in each driver through the */ + /* `attach_file' interface */ + + error = FT_ERR( Unimplemented_Feature ); + clazz = driver->clazz; + if ( clazz->attach_file ) + error = clazz->attach_file( face, stream ); + + /* close the attached stream */ + FT_Stream_Free( stream, + (FT_Bool)( parameters->stream && + ( parameters->flags & FT_OPEN_STREAM ) ) ); + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Reference_Face( FT_Face face ) + { + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + face->internal->refcount++; + + return FT_Err_Ok; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_Face( FT_Face face ) + { + FT_Error error; + FT_Driver driver; + FT_Memory memory; + FT_ListNode node; + + + error = FT_ERR( Invalid_Face_Handle ); + if ( face && face->driver ) + { + face->internal->refcount--; + if ( face->internal->refcount > 0 ) + error = FT_Err_Ok; + else + { + driver = face->driver; + memory = driver->root.memory; + + /* find face in driver's list */ + node = FT_List_Find( &driver->faces_list, face ); + if ( node ) + { + /* remove face object from the driver's list */ + FT_List_Remove( &driver->faces_list, node ); + FT_FREE( node ); + + /* now destroy the object proper */ + destroy_face( memory, face, driver ); + error = FT_Err_Ok; + } + } + } + + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Size( FT_Face face, + FT_Size *asize ) + { + FT_Error error; + FT_Memory memory; + FT_Driver driver; + FT_Driver_Class clazz; + + FT_Size size = NULL; + FT_ListNode node = NULL; + + FT_Size_Internal internal = NULL; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !asize ) + return FT_THROW( Invalid_Argument ); + + if ( !face->driver ) + return FT_THROW( Invalid_Driver_Handle ); + + *asize = NULL; + + driver = face->driver; + clazz = driver->clazz; + memory = face->memory; + + /* Allocate new size object and perform basic initialisation */ + if ( FT_ALLOC( size, clazz->size_object_size ) || FT_NEW( node ) ) + goto Exit; + + size->face = face; + + if ( FT_NEW( internal ) ) + goto Exit; + + size->internal = internal; + + if ( clazz->init_size ) + error = clazz->init_size( size ); + + /* in case of success, add to the face's list */ + if ( !error ) + { + *asize = size; + node->data = size; + FT_List_Add( &face->sizes_list, node ); + } + + Exit: + if ( error ) + { + FT_FREE( node ); + FT_FREE( size ); + } + + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_Size( FT_Size size ) + { + FT_Error error; + FT_Driver driver; + FT_Memory memory; + FT_Face face; + FT_ListNode node; + + + if ( !size ) + return FT_THROW( Invalid_Size_Handle ); + + face = size->face; + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + driver = face->driver; + if ( !driver ) + return FT_THROW( Invalid_Driver_Handle ); + + memory = driver->root.memory; + + error = FT_Err_Ok; + node = FT_List_Find( &face->sizes_list, size ); + if ( node ) + { + FT_List_Remove( &face->sizes_list, node ); + FT_FREE( node ); + + if ( face->size == size ) + { + face->size = NULL; + if ( face->sizes_list.head ) + face->size = (FT_Size)(face->sizes_list.head->data); + } + + destroy_size( memory, size, driver ); + } + else + error = FT_THROW( Invalid_Size_Handle ); + + return error; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Error ) + FT_Match_Size( FT_Face face, + FT_Size_Request req, + FT_Bool ignore_width, + FT_ULong* size_index ) + { + FT_Int i; + FT_Long w, h; + + + if ( !FT_HAS_FIXED_SIZES( face ) ) + return FT_THROW( Invalid_Face_Handle ); + + /* FT_Bitmap_Size doesn't provide enough info... */ + if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL ) + return FT_THROW( Unimplemented_Feature ); + + w = FT_REQUEST_WIDTH ( req ); + h = FT_REQUEST_HEIGHT( req ); + + if ( req->width && !req->height ) + h = w; + else if ( !req->width && req->height ) + w = h; + + w = FT_PIX_ROUND( w ); + h = FT_PIX_ROUND( h ); + + if ( !w || !h ) + return FT_THROW( Invalid_Pixel_Size ); + + for ( i = 0; i < face->num_fixed_sizes; i++ ) + { + FT_Bitmap_Size* bsize = face->available_sizes + i; + + + if ( h != FT_PIX_ROUND( bsize->y_ppem ) ) + continue; + + if ( w == FT_PIX_ROUND( bsize->x_ppem ) || ignore_width ) + { + FT_TRACE3(( "FT_Match_Size: bitmap strike %d matches\n", i )); + + if ( size_index ) + *size_index = (FT_ULong)i; + + return FT_Err_Ok; + } + } + + FT_TRACE3(( "FT_Match_Size: no matching bitmap strike\n" )); + + return FT_THROW( Invalid_Pixel_Size ); + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + ft_synthesize_vertical_metrics( FT_Glyph_Metrics* metrics, + FT_Pos advance ) + { + FT_Pos height = metrics->height; + + + /* compensate for glyph with bbox above/below the baseline */ + if ( metrics->horiBearingY < 0 ) + { + if ( height < metrics->horiBearingY ) + height = metrics->horiBearingY; + } + else if ( metrics->horiBearingY > 0 ) + height -= metrics->horiBearingY; + + /* the factor 1.2 is a heuristical value */ + if ( !advance ) + advance = height * 12 / 10; + + metrics->vertBearingX = metrics->horiBearingX - metrics->horiAdvance / 2; + metrics->vertBearingY = ( advance - height ) / 2; + metrics->vertAdvance = advance; + } + + + static void + ft_recompute_scaled_metrics( FT_Face face, + FT_Size_Metrics* metrics ) + { + /* Compute root ascender, descender, test height, and max_advance */ + +#ifdef GRID_FIT_METRICS + metrics->ascender = FT_PIX_CEIL( FT_MulFix( face->ascender, + metrics->y_scale ) ); + + metrics->descender = FT_PIX_FLOOR( FT_MulFix( face->descender, + metrics->y_scale ) ); + + metrics->height = FT_PIX_ROUND( FT_MulFix( face->height, + metrics->y_scale ) ); + + metrics->max_advance = FT_PIX_ROUND( FT_MulFix( face->max_advance_width, + metrics->x_scale ) ); +#else /* !GRID_FIT_METRICS */ + metrics->ascender = FT_MulFix( face->ascender, + metrics->y_scale ); + + metrics->descender = FT_MulFix( face->descender, + metrics->y_scale ); + + metrics->height = FT_MulFix( face->height, + metrics->y_scale ); + + metrics->max_advance = FT_MulFix( face->max_advance_width, + metrics->x_scale ); +#endif /* !GRID_FIT_METRICS */ + } + + + FT_BASE_DEF( void ) + FT_Select_Metrics( FT_Face face, + FT_ULong strike_index ) + { + FT_Size_Metrics* metrics; + FT_Bitmap_Size* bsize; + + + metrics = &face->size->metrics; + bsize = face->available_sizes + strike_index; + + metrics->x_ppem = (FT_UShort)( ( bsize->x_ppem + 32 ) >> 6 ); + metrics->y_ppem = (FT_UShort)( ( bsize->y_ppem + 32 ) >> 6 ); + + if ( FT_IS_SCALABLE( face ) ) + { + metrics->x_scale = FT_DivFix( bsize->x_ppem, + face->units_per_EM ); + metrics->y_scale = FT_DivFix( bsize->y_ppem, + face->units_per_EM ); + + ft_recompute_scaled_metrics( face, metrics ); + } + else + { + metrics->x_scale = 1L << 16; + metrics->y_scale = 1L << 16; + metrics->ascender = bsize->y_ppem; + metrics->descender = 0; + metrics->height = bsize->height << 6; + metrics->max_advance = bsize->x_ppem; + } + } + + + FT_BASE_DEF( void ) + FT_Request_Metrics( FT_Face face, + FT_Size_Request req ) + { + FT_Size_Metrics* metrics; + + + metrics = &face->size->metrics; + + if ( FT_IS_SCALABLE( face ) ) + { + FT_Long w = 0, h = 0, scaled_w = 0, scaled_h = 0; + + + switch ( req->type ) + { + case FT_SIZE_REQUEST_TYPE_NOMINAL: + w = h = face->units_per_EM; + break; + + case FT_SIZE_REQUEST_TYPE_REAL_DIM: + w = h = face->ascender - face->descender; + break; + + case FT_SIZE_REQUEST_TYPE_BBOX: + w = face->bbox.xMax - face->bbox.xMin; + h = face->bbox.yMax - face->bbox.yMin; + break; + + case FT_SIZE_REQUEST_TYPE_CELL: + w = face->max_advance_width; + h = face->ascender - face->descender; + break; + + case FT_SIZE_REQUEST_TYPE_SCALES: + metrics->x_scale = (FT_Fixed)req->width; + metrics->y_scale = (FT_Fixed)req->height; + if ( !metrics->x_scale ) + metrics->x_scale = metrics->y_scale; + else if ( !metrics->y_scale ) + metrics->y_scale = metrics->x_scale; + goto Calculate_Ppem; + + case FT_SIZE_REQUEST_TYPE_MAX: + break; + } + + /* to be on the safe side */ + if ( w < 0 ) + w = -w; + + if ( h < 0 ) + h = -h; + + scaled_w = FT_REQUEST_WIDTH ( req ); + scaled_h = FT_REQUEST_HEIGHT( req ); + + /* determine scales */ + if ( req->width ) + { + metrics->x_scale = FT_DivFix( scaled_w, w ); + + if ( req->height ) + { + metrics->y_scale = FT_DivFix( scaled_h, h ); + + if ( req->type == FT_SIZE_REQUEST_TYPE_CELL ) + { + if ( metrics->y_scale > metrics->x_scale ) + metrics->y_scale = metrics->x_scale; + else + metrics->x_scale = metrics->y_scale; + } + } + else + { + metrics->y_scale = metrics->x_scale; + scaled_h = FT_MulDiv( scaled_w, h, w ); + } + } + else + { + metrics->x_scale = metrics->y_scale = FT_DivFix( scaled_h, h ); + scaled_w = FT_MulDiv( scaled_h, w, h ); + } + + Calculate_Ppem: + /* calculate the ppems */ + if ( req->type != FT_SIZE_REQUEST_TYPE_NOMINAL ) + { + scaled_w = FT_MulFix( face->units_per_EM, metrics->x_scale ); + scaled_h = FT_MulFix( face->units_per_EM, metrics->y_scale ); + } + + metrics->x_ppem = (FT_UShort)( ( scaled_w + 32 ) >> 6 ); + metrics->y_ppem = (FT_UShort)( ( scaled_h + 32 ) >> 6 ); + + ft_recompute_scaled_metrics( face, metrics ); + } + else + { + FT_ZERO( metrics ); + metrics->x_scale = 1L << 16; + metrics->y_scale = 1L << 16; + } + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Select_Size( FT_Face face, + FT_Int strike_index ) + { + FT_Error error = FT_Err_Ok; + FT_Driver_Class clazz; + + + if ( !face || !FT_HAS_FIXED_SIZES( face ) ) + return FT_THROW( Invalid_Face_Handle ); + + if ( strike_index < 0 || strike_index >= face->num_fixed_sizes ) + return FT_THROW( Invalid_Argument ); + + clazz = face->driver->clazz; + + if ( clazz->select_size ) + { + error = clazz->select_size( face->size, (FT_ULong)strike_index ); + + FT_TRACE5(( "FT_Select_Size (%s driver):\n", + face->driver->root.clazz->module_name )); + } + else + { + FT_Select_Metrics( face, (FT_ULong)strike_index ); + + FT_TRACE5(( "FT_Select_Size:\n" )); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_Size_Metrics* metrics = &face->size->metrics; + + + FT_TRACE5(( " x scale: %d (%f)\n", + metrics->x_scale, metrics->x_scale / 65536.0 )); + FT_TRACE5(( " y scale: %d (%f)\n", + metrics->y_scale, metrics->y_scale / 65536.0 )); + FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 )); + FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 )); + FT_TRACE5(( " height: %f\n", metrics->height / 64.0 )); + FT_TRACE5(( " max advance: %f\n", metrics->max_advance / 64.0 )); + FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem )); + FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem )); + } +#endif + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Request_Size( FT_Face face, + FT_Size_Request req ) + { + FT_Error error = FT_Err_Ok; + FT_Driver_Class clazz; + FT_ULong strike_index; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !req || req->width < 0 || req->height < 0 || + req->type >= FT_SIZE_REQUEST_TYPE_MAX ) + return FT_THROW( Invalid_Argument ); + + /* signal the auto-hinter to recompute its size metrics */ + /* (if requested) */ + face->size->internal->autohint_metrics.x_scale = 0; + + clazz = face->driver->clazz; + + if ( clazz->request_size ) + { + error = clazz->request_size( face->size, req ); + + FT_TRACE5(( "FT_Request_Size (%s driver):\n", + face->driver->root.clazz->module_name )); + } + else if ( !FT_IS_SCALABLE( face ) && FT_HAS_FIXED_SIZES( face ) ) + { + /* + * The reason that a driver doesn't have `request_size' defined is + * either that the scaling here suffices or that the supported formats + * are bitmap-only and size matching is not implemented. + * + * In the latter case, a simple size matching is done. + */ + error = FT_Match_Size( face, req, 0, &strike_index ); + if ( error ) + return error; + + return FT_Select_Size( face, (FT_Int)strike_index ); + } + else + { + FT_Request_Metrics( face, req ); + + FT_TRACE5(( "FT_Request_Size:\n" )); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_Size_Metrics* metrics = &face->size->metrics; + + + FT_TRACE5(( " x scale: %d (%f)\n", + metrics->x_scale, metrics->x_scale / 65536.0 )); + FT_TRACE5(( " y scale: %d (%f)\n", + metrics->y_scale, metrics->y_scale / 65536.0 )); + FT_TRACE5(( " ascender: %f\n", metrics->ascender / 64.0 )); + FT_TRACE5(( " descender: %f\n", metrics->descender / 64.0 )); + FT_TRACE5(( " height: %f\n", metrics->height / 64.0 )); + FT_TRACE5(( " max advance: %f\n", metrics->max_advance / 64.0 )); + FT_TRACE5(( " x ppem: %d\n", metrics->x_ppem )); + FT_TRACE5(( " y ppem: %d\n", metrics->y_ppem )); + } +#endif + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Char_Size( FT_Face face, + FT_F26Dot6 char_width, + FT_F26Dot6 char_height, + FT_UInt horz_resolution, + FT_UInt vert_resolution ) + { + FT_Size_RequestRec req; + + + /* check of `face' delayed to `FT_Request_Size' */ + + if ( !char_width ) + char_width = char_height; + else if ( !char_height ) + char_height = char_width; + + if ( !horz_resolution ) + horz_resolution = vert_resolution; + else if ( !vert_resolution ) + vert_resolution = horz_resolution; + + if ( char_width < 1 * 64 ) + char_width = 1 * 64; + if ( char_height < 1 * 64 ) + char_height = 1 * 64; + + if ( !horz_resolution ) + horz_resolution = vert_resolution = 72; + + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = char_width; + req.height = char_height; + req.horiResolution = horz_resolution; + req.vertResolution = vert_resolution; + + return FT_Request_Size( face, &req ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Pixel_Sizes( FT_Face face, + FT_UInt pixel_width, + FT_UInt pixel_height ) + { + FT_Size_RequestRec req; + + + /* check of `face' delayed to `FT_Request_Size' */ + + if ( pixel_width == 0 ) + pixel_width = pixel_height; + else if ( pixel_height == 0 ) + pixel_height = pixel_width; + + if ( pixel_width < 1 ) + pixel_width = 1; + if ( pixel_height < 1 ) + pixel_height = 1; + + /* use `>=' to avoid potential compiler warning on 16bit platforms */ + if ( pixel_width >= 0xFFFFU ) + pixel_width = 0xFFFFU; + if ( pixel_height >= 0xFFFFU ) + pixel_height = 0xFFFFU; + + req.type = FT_SIZE_REQUEST_TYPE_NOMINAL; + req.width = (FT_Long)( pixel_width << 6 ); + req.height = (FT_Long)( pixel_height << 6 ); + req.horiResolution = 0; + req.vertResolution = 0; + + return FT_Request_Size( face, &req ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Kerning( FT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_UInt kern_mode, + FT_Vector *akerning ) + { + FT_Error error = FT_Err_Ok; + FT_Driver driver; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !akerning ) + return FT_THROW( Invalid_Argument ); + + driver = face->driver; + + akerning->x = 0; + akerning->y = 0; + + if ( driver->clazz->get_kerning ) + { + error = driver->clazz->get_kerning( face, + left_glyph, + right_glyph, + akerning ); + if ( !error ) + { + if ( kern_mode != FT_KERNING_UNSCALED ) + { + akerning->x = FT_MulFix( akerning->x, face->size->metrics.x_scale ); + akerning->y = FT_MulFix( akerning->y, face->size->metrics.y_scale ); + + if ( kern_mode != FT_KERNING_UNFITTED ) + { + FT_Pos orig_x = akerning->x; + FT_Pos orig_y = akerning->y; + + + /* we scale down kerning values for small ppem values */ + /* to avoid that rounding makes them too big. */ + /* `25' has been determined heuristically. */ + if ( face->size->metrics.x_ppem < 25 ) + akerning->x = FT_MulDiv( orig_x, + face->size->metrics.x_ppem, 25 ); + if ( face->size->metrics.y_ppem < 25 ) + akerning->y = FT_MulDiv( orig_y, + face->size->metrics.y_ppem, 25 ); + + akerning->x = FT_PIX_ROUND( akerning->x ); + akerning->y = FT_PIX_ROUND( akerning->y ); + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_Pos orig_x_rounded = FT_PIX_ROUND( orig_x ); + FT_Pos orig_y_rounded = FT_PIX_ROUND( orig_y ); + + + if ( akerning->x != orig_x_rounded || + akerning->y != orig_y_rounded ) + FT_TRACE5(( "FT_Get_Kerning: horizontal kerning" + " (%d, %d) scaled down to (%d, %d) pixels\n", + orig_x_rounded / 64, orig_y_rounded / 64, + akerning->x / 64, akerning->y / 64 )); + } +#endif + } + } + } + } + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Track_Kerning( FT_Face face, + FT_Fixed point_size, + FT_Int degree, + FT_Fixed* akerning ) + { + FT_Service_Kerning service; + FT_Error error = FT_Err_Ok; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !akerning ) + return FT_THROW( Invalid_Argument ); + + FT_FACE_FIND_SERVICE( face, service, KERNING ); + if ( !service ) + return FT_THROW( Unimplemented_Feature ); + + error = service->get_track( face, + point_size, + degree, + akerning ); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Select_Charmap( FT_Face face, + FT_Encoding encoding ) + { + FT_CharMap* cur; + FT_CharMap* limit; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( encoding == FT_ENCODING_NONE ) + return FT_THROW( Invalid_Argument ); + + /* FT_ENCODING_UNICODE is special. We try to find the `best' Unicode */ + /* charmap available, i.e., one with UCS-4 characters, if possible. */ + /* */ + /* This is done by find_unicode_charmap() above, to share code. */ + if ( encoding == FT_ENCODING_UNICODE ) + return find_unicode_charmap( face ); + + cur = face->charmaps; + if ( !cur ) + return FT_THROW( Invalid_CharMap_Handle ); + + limit = cur + face->num_charmaps; + + for ( ; cur < limit; cur++ ) + { + if ( cur[0]->encoding == encoding ) + { + face->charmap = cur[0]; + return 0; + } + } + + return FT_THROW( Invalid_Argument ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Charmap( FT_Face face, + FT_CharMap charmap ) + { + FT_CharMap* cur; + FT_CharMap* limit; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + cur = face->charmaps; + if ( !cur || !charmap ) + return FT_THROW( Invalid_CharMap_Handle ); + + if ( FT_Get_CMap_Format( charmap ) == 14 ) + return FT_THROW( Invalid_Argument ); + + limit = cur + face->num_charmaps; + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] == charmap ) + { + face->charmap = cur[0]; + return FT_Err_Ok; + } + } + + return FT_THROW( Invalid_Argument ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Int ) + FT_Get_Charmap_Index( FT_CharMap charmap ) + { + FT_Int i; + + + if ( !charmap || !charmap->face ) + return -1; + + for ( i = 0; i < charmap->face->num_charmaps; i++ ) + if ( charmap->face->charmaps[i] == charmap ) + break; + + FT_ASSERT( i < charmap->face->num_charmaps ); + + return i; + } + + + static void + ft_cmap_done_internal( FT_CMap cmap ) + { + FT_CMap_Class clazz = cmap->clazz; + FT_Face face = cmap->charmap.face; + FT_Memory memory = FT_FACE_MEMORY( face ); + + + if ( clazz->done ) + clazz->done( cmap ); + + FT_FREE( cmap ); + } + + + FT_BASE_DEF( void ) + FT_CMap_Done( FT_CMap cmap ) + { + if ( cmap ) + { + FT_Face face = cmap->charmap.face; + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Error error; + FT_Int i, j; + + + for ( i = 0; i < face->num_charmaps; i++ ) + { + if ( (FT_CMap)face->charmaps[i] == cmap ) + { + FT_CharMap last_charmap = face->charmaps[face->num_charmaps - 1]; + + + if ( FT_RENEW_ARRAY( face->charmaps, + face->num_charmaps, + face->num_charmaps - 1 ) ) + return; + + /* remove it from our list of charmaps */ + for ( j = i + 1; j < face->num_charmaps; j++ ) + { + if ( j == face->num_charmaps - 1 ) + face->charmaps[j - 1] = last_charmap; + else + face->charmaps[j - 1] = face->charmaps[j]; + } + + face->num_charmaps--; + + if ( (FT_CMap)face->charmap == cmap ) + face->charmap = NULL; + + ft_cmap_done_internal( cmap ); + + break; + } + } + } + } + + + FT_BASE_DEF( FT_Error ) + FT_CMap_New( FT_CMap_Class clazz, + FT_Pointer init_data, + FT_CharMap charmap, + FT_CMap *acmap ) + { + FT_Error error = FT_Err_Ok; + FT_Face face; + FT_Memory memory; + FT_CMap cmap = NULL; + + + if ( !clazz || !charmap || !charmap->face ) + return FT_THROW( Invalid_Argument ); + + face = charmap->face; + memory = FT_FACE_MEMORY( face ); + + if ( !FT_ALLOC( cmap, clazz->size ) ) + { + cmap->charmap = *charmap; + cmap->clazz = clazz; + + if ( clazz->init ) + { + error = clazz->init( cmap, init_data ); + if ( error ) + goto Fail; + } + + /* add it to our list of charmaps */ + if ( FT_RENEW_ARRAY( face->charmaps, + face->num_charmaps, + face->num_charmaps + 1 ) ) + goto Fail; + + face->charmaps[face->num_charmaps++] = (FT_CharMap)cmap; + } + + Exit: + if ( acmap ) + *acmap = cmap; + + return error; + + Fail: + ft_cmap_done_internal( cmap ); + cmap = NULL; + goto Exit; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Char_Index( FT_Face face, + FT_ULong charcode ) + { + FT_UInt result = 0; + + + if ( face && face->charmap ) + { + FT_CMap cmap = FT_CMAP( face->charmap ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large charcode" )); + FT_TRACE1(( " 0x%x is truncated\n", charcode )); + } + + result = cmap->clazz->char_index( cmap, (FT_UInt32)charcode ); + if ( result >= (FT_UInt)face->num_glyphs ) + result = 0; + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_First_Char( FT_Face face, + FT_UInt *agindex ) + { + FT_ULong result = 0; + FT_UInt gindex = 0; + + + /* only do something if we have a charmap, and we have glyphs at all */ + if ( face && face->charmap && face->num_glyphs ) + { + gindex = FT_Get_Char_Index( face, 0 ); + if ( gindex == 0 ) + result = FT_Get_Next_Char( face, 0, &gindex ); + } + + if ( agindex ) + *agindex = gindex; + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_Next_Char( FT_Face face, + FT_ULong charcode, + FT_UInt *agindex ) + { + FT_ULong result = 0; + FT_UInt gindex = 0; + + + if ( face && face->charmap && face->num_glyphs ) + { + FT_UInt32 code = (FT_UInt32)charcode; + FT_CMap cmap = FT_CMAP( face->charmap ); + + + do + { + gindex = cmap->clazz->char_next( cmap, &code ); + + } while ( gindex >= (FT_UInt)face->num_glyphs ); + + result = ( gindex == 0 ) ? 0 : code; + } + + if ( agindex ) + *agindex = gindex; + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Face_Properties( FT_Face face, + FT_UInt num_properties, + FT_Parameter* properties ) + { + FT_Error error = FT_Err_Ok; + + + if ( num_properties > 0 && !properties ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + for ( ; num_properties > 0; num_properties-- ) + { + if ( properties->tag == FT_PARAM_TAG_STEM_DARKENING ) + { + if ( properties->data ) + { + if ( *( (FT_Bool*)properties->data ) == TRUE ) + face->internal->no_stem_darkening = FALSE; + else + face->internal->no_stem_darkening = TRUE; + } + else + { + /* use module default */ + face->internal->no_stem_darkening = -1; + } + } + else if ( properties->tag == FT_PARAM_TAG_LCD_FILTER_WEIGHTS ) + { +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + if ( properties->data ) + { + ft_memcpy( face->internal->lcd_weights, + properties->data, + FT_LCD_FILTER_FIVE_TAPS ); + face->internal->lcd_filter_func = ft_lcd_filter_fir; + } +#else + error = FT_THROW( Unimplemented_Feature ); + goto Exit; +#endif + } + else if ( properties->tag == FT_PARAM_TAG_RANDOM_SEED ) + { + if ( properties->data ) + { + face->internal->random_seed = *( (FT_Int32*)properties->data ); + if ( face->internal->random_seed < 0 ) + face->internal->random_seed = 0; + } + else + { + /* use module default */ + face->internal->random_seed = -1; + } + } + else + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( error ) + break; + + properties++; + } + + Exit: + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Face_GetCharVariantIndex( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ) + { + FT_UInt result = 0; + + + if ( face && + face->charmap && + face->charmap->encoding == FT_ENCODING_UNICODE ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + FT_CMap ucmap = FT_CMAP( face->charmap ); + + + if ( charmap ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Face_GetCharVariantIndex:" + " too large charcode" )); + FT_TRACE1(( " 0x%x is truncated\n", charcode )); + } + if ( variantSelector > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Face_GetCharVariantIndex:" + " too large variantSelector" )); + FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); + } + + result = vcmap->clazz->char_var_index( vcmap, ucmap, + (FT_UInt32)charcode, + (FT_UInt32)variantSelector ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Int ) + FT_Face_GetCharVariantIsDefault( FT_Face face, + FT_ULong charcode, + FT_ULong variantSelector ) + { + FT_Int result = -1; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Face_GetCharVariantIsDefault:" + " too large charcode" )); + FT_TRACE1(( " 0x%x is truncated\n", charcode )); + } + if ( variantSelector > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Face_GetCharVariantIsDefault:" + " too large variantSelector" )); + FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); + } + + result = vcmap->clazz->char_var_default( vcmap, + (FT_UInt32)charcode, + (FT_UInt32)variantSelector ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt32* ) + FT_Face_GetVariantSelectors( FT_Face face ) + { + FT_UInt32 *result = NULL; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + result = vcmap->clazz->variant_list( vcmap, memory ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt32* ) + FT_Face_GetVariantsOfChar( FT_Face face, + FT_ULong charcode ) + { + FT_UInt32 *result = NULL; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + if ( charcode > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Face_GetVariantsOfChar: too large charcode" )); + FT_TRACE1(( " 0x%x is truncated\n", charcode )); + } + + result = vcmap->clazz->charvariant_list( vcmap, memory, + (FT_UInt32)charcode ); + } + } + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt32* ) + FT_Face_GetCharsOfVariant( FT_Face face, + FT_ULong variantSelector ) + { + FT_UInt32 *result = NULL; + + + if ( face ) + { + FT_CharMap charmap = find_variant_selector_charmap( face ); + + + if ( charmap ) + { + FT_CMap vcmap = FT_CMAP( charmap ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + if ( variantSelector > 0xFFFFFFFFUL ) + { + FT_TRACE1(( "FT_Get_Char_Index: too large variantSelector" )); + FT_TRACE1(( " 0x%x is truncated\n", variantSelector )); + } + + result = vcmap->clazz->variantchar_list( vcmap, memory, + (FT_UInt32)variantSelector ); + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Name_Index( FT_Face face, + FT_String* glyph_name ) + { + FT_UInt result = 0; + + + if ( face && + FT_HAS_GLYPH_NAMES( face ) && + glyph_name ) + { + FT_Service_GlyphDict service; + + + FT_FACE_LOOKUP_SERVICE( face, + service, + GLYPH_DICT ); + + if ( service && service->name_index ) + result = service->name_index( face, glyph_name ); + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Glyph_Name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_Error error; + FT_Service_GlyphDict service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !buffer || buffer_max == 0 ) + return FT_THROW( Invalid_Argument ); + + /* clean up buffer */ + ((FT_Byte*)buffer)[0] = '\0'; + + if ( (FT_Long)glyph_index >= face->num_glyphs ) + return FT_THROW( Invalid_Glyph_Index ); + + if ( !FT_HAS_GLYPH_NAMES( face ) ) + return FT_THROW( Invalid_Argument ); + + FT_FACE_LOOKUP_SERVICE( face, service, GLYPH_DICT ); + if ( service && service->get_name ) + error = service->get_name( face, glyph_index, buffer, buffer_max ); + else + error = FT_THROW( Invalid_Argument ); + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( const char* ) + FT_Get_Postscript_Name( FT_Face face ) + { + const char* result = NULL; + + + if ( !face ) + goto Exit; + + if ( !result ) + { + FT_Service_PsFontName service; + + + FT_FACE_LOOKUP_SERVICE( face, + service, + POSTSCRIPT_FONT_NAME ); + + if ( service && service->get_ps_font_name ) + result = service->get_ps_font_name( face ); + } + + Exit: + return result; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( void* ) + FT_Get_Sfnt_Table( FT_Face face, + FT_Sfnt_Tag tag ) + { + void* table = NULL; + FT_Service_SFNT_Table service; + + + if ( face && FT_IS_SFNT( face ) ) + { + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( service ) + table = service->get_table( face, tag ); + } + + return table; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Load_Sfnt_Table( FT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ) + { + FT_Service_SFNT_Table service; + + + if ( !face || !FT_IS_SFNT( face ) ) + return FT_THROW( Invalid_Face_Handle ); + + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( !service ) + return FT_THROW( Unimplemented_Feature ); + + return service->load_table( face, tag, offset, buffer, length ); + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Sfnt_Table_Info( FT_Face face, + FT_UInt table_index, + FT_ULong *tag, + FT_ULong *length ) + { + FT_Service_SFNT_Table service; + FT_ULong offset; + + + /* test for valid `length' delayed to `service->table_info' */ + + if ( !face || !FT_IS_SFNT( face ) ) + return FT_THROW( Invalid_Face_Handle ); + + FT_FACE_FIND_SERVICE( face, service, SFNT_TABLE ); + if ( !service ) + return FT_THROW( Unimplemented_Feature ); + + return service->table_info( face, table_index, tag, &offset, length ); + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_ULong ) + FT_Get_CMap_Language_ID( FT_CharMap charmap ) + { + FT_Service_TTCMaps service; + FT_Face face; + TT_CMapInfo cmap_info; + + + if ( !charmap || !charmap->face ) + return 0; + + face = charmap->face; + FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); + if ( !service ) + return 0; + if ( service->get_cmap_info( charmap, &cmap_info )) + return 0; + + return cmap_info.language; + } + + + /* documentation is in tttables.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_Get_CMap_Format( FT_CharMap charmap ) + { + FT_Service_TTCMaps service; + FT_Face face; + TT_CMapInfo cmap_info; + + + if ( !charmap || !charmap->face ) + return -1; + + face = charmap->face; + FT_FACE_FIND_SERVICE( face, service, TT_CMAP ); + if ( !service ) + return -1; + if ( service->get_cmap_info( charmap, &cmap_info )) + return -1; + + return cmap_info.format; + } + + + /* documentation is in ftsizes.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Activate_Size( FT_Size size ) + { + FT_Face face; + + + if ( !size ) + return FT_THROW( Invalid_Size_Handle ); + + face = size->face; + if ( !face || !face->driver ) + return FT_THROW( Invalid_Face_Handle ); + + /* we don't need anything more complex than that; all size objects */ + /* are already listed by the face */ + face->size = size; + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** R E N D E R E R S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /* lookup a renderer by glyph format in the library's list */ + FT_BASE_DEF( FT_Renderer ) + FT_Lookup_Renderer( FT_Library library, + FT_Glyph_Format format, + FT_ListNode* node ) + { + FT_ListNode cur; + FT_Renderer result = NULL; + + + if ( !library ) + goto Exit; + + cur = library->renderers.head; + + if ( node ) + { + if ( *node ) + cur = (*node)->next; + *node = NULL; + } + + while ( cur ) + { + FT_Renderer renderer = FT_RENDERER( cur->data ); + + + if ( renderer->glyph_format == format ) + { + if ( node ) + *node = cur; + + result = renderer; + break; + } + cur = cur->next; + } + + Exit: + return result; + } + + + static FT_Renderer + ft_lookup_glyph_renderer( FT_GlyphSlot slot ) + { + FT_Face face = slot->face; + FT_Library library = FT_FACE_LIBRARY( face ); + FT_Renderer result = library->cur_renderer; + + + if ( !result || result->glyph_format != slot->format ) + result = FT_Lookup_Renderer( library, slot->format, 0 ); + + return result; + } + + + static void + ft_set_current_renderer( FT_Library library ) + { + FT_Renderer renderer; + + + renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, 0 ); + library->cur_renderer = renderer; + } + + + static FT_Error + ft_add_renderer( FT_Module module ) + { + FT_Library library = module->library; + FT_Memory memory = library->memory; + FT_Error error; + FT_ListNode node = NULL; + + + if ( FT_NEW( node ) ) + goto Exit; + + { + FT_Renderer render = FT_RENDERER( module ); + FT_Renderer_Class* clazz = (FT_Renderer_Class*)module->clazz; + + + render->clazz = clazz; + render->glyph_format = clazz->glyph_format; + + /* allocate raster object if needed */ + if ( clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && + clazz->raster_class->raster_new ) + { + error = clazz->raster_class->raster_new( memory, &render->raster ); + if ( error ) + goto Fail; + + render->raster_render = clazz->raster_class->raster_render; + render->render = clazz->render_glyph; + } + + /* add to list */ + node->data = module; + FT_List_Add( &library->renderers, node ); + + ft_set_current_renderer( library ); + } + + Fail: + if ( error ) + FT_FREE( node ); + + Exit: + return error; + } + + + static void + ft_remove_renderer( FT_Module module ) + { + FT_Library library; + FT_Memory memory; + FT_ListNode node; + + + library = module->library; + if ( !library ) + return; + + memory = library->memory; + + node = FT_List_Find( &library->renderers, module ); + if ( node ) + { + FT_Renderer render = FT_RENDERER( module ); + + + /* release raster object, if any */ + if ( render->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && + render->raster ) + render->clazz->raster_class->raster_done( render->raster ); + + /* remove from list */ + FT_List_Remove( &library->renderers, node ); + FT_FREE( node ); + + ft_set_current_renderer( library ); + } + } + + + /* documentation is in ftrender.h */ + + FT_EXPORT_DEF( FT_Renderer ) + FT_Get_Renderer( FT_Library library, + FT_Glyph_Format format ) + { + /* test for valid `library' delayed to `FT_Lookup_Renderer' */ + + return FT_Lookup_Renderer( library, format, 0 ); + } + + + /* documentation is in ftrender.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Set_Renderer( FT_Library library, + FT_Renderer renderer, + FT_UInt num_params, + FT_Parameter* parameters ) + { + FT_ListNode node; + FT_Error error = FT_Err_Ok; + + FT_Renderer_SetModeFunc set_mode; + + + if ( !library ) + { + error = FT_THROW( Invalid_Library_Handle ); + goto Exit; + } + + if ( !renderer ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( num_params > 0 && !parameters ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + node = FT_List_Find( &library->renderers, renderer ); + if ( !node ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_List_Up( &library->renderers, node ); + + if ( renderer->glyph_format == FT_GLYPH_FORMAT_OUTLINE ) + library->cur_renderer = renderer; + + set_mode = renderer->clazz->set_mode; + + for ( ; num_params > 0; num_params-- ) + { + error = set_mode( renderer, parameters->tag, parameters->data ); + if ( error ) + break; + parameters++; + } + + Exit: + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_Render_Glyph_Internal( FT_Library library, + FT_GlyphSlot slot, + FT_Render_Mode render_mode ) + { + FT_Error error = FT_Err_Ok; + FT_Renderer renderer; + + + /* if it is already a bitmap, no need to do anything */ + switch ( slot->format ) + { + case FT_GLYPH_FORMAT_BITMAP: /* already a bitmap, don't do anything */ + break; + + default: + { + FT_ListNode node = NULL; + + + /* small shortcut for the very common case */ + if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + { + renderer = library->cur_renderer; + node = library->renderers.head; + } + else + renderer = FT_Lookup_Renderer( library, slot->format, &node ); + + error = FT_ERR( Unimplemented_Feature ); + while ( renderer ) + { + error = renderer->render( renderer, slot, render_mode, NULL ); + if ( !error || + FT_ERR_NEQ( error, Cannot_Render_Glyph ) ) + break; + + /* FT_Err_Cannot_Render_Glyph is returned if the render mode */ + /* is unsupported by the current renderer for this glyph image */ + /* format. */ + + /* now, look for another renderer that supports the same */ + /* format. */ + renderer = FT_Lookup_Renderer( library, slot->format, &node ); + } + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + +#undef FT_COMPONENT +#define FT_COMPONENT trace_bitmap + + /* + * Computing the MD5 checksum is expensive, unnecessarily distorting a + * possible profiling of FreeType if compiled with tracing support. For + * this reason, we execute the following code only if explicitly + * requested. + */ + + /* we use FT_TRACE3 in this block */ + if ( !error && + ft_trace_levels[trace_bitmap] >= 3 && + slot->bitmap.buffer ) + { + FT_Bitmap bitmap; + FT_Error err; + + + FT_Bitmap_Init( &bitmap ); + + /* we convert to a single bitmap format for computing the checksum */ + /* this also converts the bitmap flow to `down' (i.e., pitch > 0) */ + err = FT_Bitmap_Convert( library, &slot->bitmap, &bitmap, 1 ); + if ( !err ) + { + MD5_CTX ctx; + unsigned char md5[16]; + unsigned long coverage = 0; + int i, j; + int rows = (int)bitmap.rows; + int pitch = bitmap.pitch; + + + FT_TRACE3(( "FT_Render_Glyph: bitmap %dx%d, mode %d\n", + rows, pitch, slot->bitmap.pixel_mode )); + + for ( i = 0; i < rows; i++ ) + for ( j = 0; j < pitch; j++ ) + coverage += bitmap.buffer[i * pitch + j]; + + FT_TRACE3(( " Total coverage: %lu\n", coverage )); + + MD5_Init( &ctx ); + if ( bitmap.buffer ) + MD5_Update( &ctx, bitmap.buffer, + (unsigned long)rows * (unsigned long)pitch ); + MD5_Final( md5, &ctx ); + + FT_TRACE3(( " MD5 checksum: " )); + for ( i = 0; i < 16; i++ ) + FT_TRACE3(( "%02X", md5[i] )); + FT_TRACE3(( "\n" )); + } + + FT_Bitmap_Done( library, &bitmap ); + } + + /* + * Dump bitmap in Netpbm format (PBM or PGM). + */ + + /* we use FT_TRACE7 in this block */ + if ( !error && + ft_trace_levels[trace_bitmap] >= 7 && + slot->bitmap.rows < 128U && + slot->bitmap.width < 128U && + slot->bitmap.buffer ) + { + int rows = (int)slot->bitmap.rows; + int width = (int)slot->bitmap.width; + int pitch = slot->bitmap.pitch; + int i, j, m; + unsigned char* topleft = slot->bitmap.buffer; + + if ( pitch < 0 ) + topleft -= pitch * ( rows - 1 ); + + FT_TRACE7(( "Netpbm image: start\n" )); + switch ( slot->bitmap.pixel_mode ) + { + case FT_PIXEL_MODE_MONO: + FT_TRACE7(( "P1 %d %d\n", width, rows )); + for ( i = 0; i < rows; i++ ) + { + for ( j = 0; j < width; ) + for ( m = 128; m > 0 && j < width; m >>= 1, j++ ) + FT_TRACE7(( " %d", ( topleft[i * pitch + j / 8] & m ) != 0 )); + FT_TRACE7(( "\n" )); + } + break; + + default: + FT_TRACE7(( "P2 %d %d 255\n", width, rows )); + for ( i = 0; i < rows; i++ ) + { + for ( j = 0; j < width; j += 1 ) + FT_TRACE7(( " %3u", topleft[i * pitch + j] )); + FT_TRACE7(( "\n" )); + } + } + FT_TRACE7(( "Netpbm image: end\n" )); + } + +#undef FT_COMPONENT +#define FT_COMPONENT trace_objs + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + return error; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Render_Glyph( FT_GlyphSlot slot, + FT_Render_Mode render_mode ) + { + FT_Library library; + + + if ( !slot || !slot->face ) + return FT_THROW( Invalid_Argument ); + + library = FT_FACE_LIBRARY( slot->face ); + + return FT_Render_Glyph_Internal( library, slot, render_mode ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** M O D U L E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* Destroy_Module */ + /* */ + /* */ + /* Destroys a given module object. For drivers, this also destroys */ + /* all child faces. */ + /* */ + /* */ + /* module :: A handle to the target driver object. */ + /* */ + /* */ + /* The driver _must_ be LOCKED! */ + /* */ + static void + Destroy_Module( FT_Module module ) + { + FT_Memory memory = module->memory; + FT_Module_Class* clazz = module->clazz; + FT_Library library = module->library; + + + if ( library && library->auto_hinter == module ) + library->auto_hinter = NULL; + + /* if the module is a renderer */ + if ( FT_MODULE_IS_RENDERER( module ) ) + ft_remove_renderer( module ); + + /* if the module is a font driver, add some steps */ + if ( FT_MODULE_IS_DRIVER( module ) ) + Destroy_Driver( FT_DRIVER( module ) ); + + /* finalize the module object */ + if ( clazz->module_done ) + clazz->module_done( module ); + + /* discard it */ + FT_FREE( module ); + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Add_Module( FT_Library library, + const FT_Module_Class* clazz ) + { + FT_Error error; + FT_Memory memory; + FT_Module module = NULL; + FT_UInt nn; + + +#define FREETYPE_VER_FIXED ( ( (FT_Long)FREETYPE_MAJOR << 16 ) | \ + FREETYPE_MINOR ) + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !clazz ) + return FT_THROW( Invalid_Argument ); + + /* check FreeType version */ + if ( clazz->module_requires > FREETYPE_VER_FIXED ) + return FT_THROW( Invalid_Version ); + + /* look for a module with the same name in the library's table */ + for ( nn = 0; nn < library->num_modules; nn++ ) + { + module = library->modules[nn]; + if ( ft_strcmp( module->clazz->module_name, clazz->module_name ) == 0 ) + { + /* this installed module has the same name, compare their versions */ + if ( clazz->module_version <= module->clazz->module_version ) + return FT_THROW( Lower_Module_Version ); + + /* remove the module from our list, then exit the loop to replace */ + /* it by our new version.. */ + FT_Remove_Module( library, module ); + break; + } + } + + memory = library->memory; + error = FT_Err_Ok; + + if ( library->num_modules >= FT_MAX_MODULES ) + { + error = FT_THROW( Too_Many_Drivers ); + goto Exit; + } + + /* allocate module object */ + if ( FT_ALLOC( module, clazz->module_size ) ) + goto Exit; + + /* base initialization */ + module->library = library; + module->memory = memory; + module->clazz = (FT_Module_Class*)clazz; + + /* check whether the module is a renderer - this must be performed */ + /* before the normal module initialization */ + if ( FT_MODULE_IS_RENDERER( module ) ) + { + /* add to the renderers list */ + error = ft_add_renderer( module ); + if ( error ) + goto Fail; + } + + /* is the module a auto-hinter? */ + if ( FT_MODULE_IS_HINTER( module ) ) + library->auto_hinter = module; + + /* if the module is a font driver */ + if ( FT_MODULE_IS_DRIVER( module ) ) + { + FT_Driver driver = FT_DRIVER( module ); + + + driver->clazz = (FT_Driver_Class)module->clazz; + } + + if ( clazz->module_init ) + { + error = clazz->module_init( module ); + if ( error ) + goto Fail; + } + + /* add module to the library's table */ + library->modules[library->num_modules++] = module; + + Exit: + return error; + + Fail: + if ( FT_MODULE_IS_RENDERER( module ) ) + { + FT_Renderer renderer = FT_RENDERER( module ); + + + if ( renderer->clazz && + renderer->clazz->glyph_format == FT_GLYPH_FORMAT_OUTLINE && + renderer->raster ) + renderer->clazz->raster_class->raster_done( renderer->raster ); + } + + FT_FREE( module ); + goto Exit; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Module ) + FT_Get_Module( FT_Library library, + const char* module_name ) + { + FT_Module result = NULL; + FT_Module* cur; + FT_Module* limit; + + + if ( !library || !module_name ) + return result; + + cur = library->modules; + limit = cur + library->num_modules; + + for ( ; cur < limit; cur++ ) + if ( ft_strcmp( cur[0]->clazz->module_name, module_name ) == 0 ) + { + result = cur[0]; + break; + } + + return result; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( const void* ) + FT_Get_Module_Interface( FT_Library library, + const char* mod_name ) + { + FT_Module module; + + + /* test for valid `library' delayed to FT_Get_Module() */ + + module = FT_Get_Module( library, mod_name ); + + return module ? module->clazz->module_interface : 0; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_module_get_service( FT_Module module, + const char* service_id, + FT_Bool global ) + { + FT_Pointer result = NULL; + + + if ( module ) + { + FT_ASSERT( module->clazz && module->clazz->get_interface ); + + /* first, look for the service in the module */ + if ( module->clazz->get_interface ) + result = module->clazz->get_interface( module, service_id ); + + if ( global && !result ) + { + /* we didn't find it, look in all other modules then */ + FT_Library library = module->library; + FT_Module* cur = library->modules; + FT_Module* limit = cur + library->num_modules; + + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] != module ) + { + FT_ASSERT( cur[0]->clazz ); + + if ( cur[0]->clazz->get_interface ) + { + result = cur[0]->clazz->get_interface( cur[0], service_id ); + if ( result ) + break; + } + } + } + } + } + + return result; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Remove_Module( FT_Library library, + FT_Module module ) + { + /* try to find the module from the table, then remove it from there */ + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( module ) + { + FT_Module* cur = library->modules; + FT_Module* limit = cur + library->num_modules; + + + for ( ; cur < limit; cur++ ) + { + if ( cur[0] == module ) + { + /* remove it from the table */ + library->num_modules--; + limit--; + while ( cur < limit ) + { + cur[0] = cur[1]; + cur++; + } + limit[0] = NULL; + + /* destroy the module */ + Destroy_Module( module ); + + return FT_Err_Ok; + } + } + } + return FT_THROW( Invalid_Driver_Handle ); + } + + + static FT_Error + ft_property_do( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + void* value, + FT_Bool set, + FT_Bool value_is_string ) + { + FT_Module* cur; + FT_Module* limit; + FT_Module_Interface interface; + + FT_Service_Properties service; + +#ifdef FT_DEBUG_LEVEL_ERROR + const FT_String* set_name = "FT_Property_Set"; + const FT_String* get_name = "FT_Property_Get"; + const FT_String* func_name = set ? set_name : get_name; +#endif + + FT_Bool missing_func; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !module_name || !property_name || !value ) + return FT_THROW( Invalid_Argument ); + + cur = library->modules; + limit = cur + library->num_modules; + + /* search module */ + for ( ; cur < limit; cur++ ) + if ( !ft_strcmp( cur[0]->clazz->module_name, module_name ) ) + break; + + if ( cur == limit ) + { + FT_ERROR(( "%s: can't find module `%s'\n", + func_name, module_name )); + return FT_THROW( Missing_Module ); + } + + /* check whether we have a service interface */ + if ( !cur[0]->clazz->get_interface ) + { + FT_ERROR(( "%s: module `%s' doesn't support properties\n", + func_name, module_name )); + return FT_THROW( Unimplemented_Feature ); + } + + /* search property service */ + interface = cur[0]->clazz->get_interface( cur[0], + FT_SERVICE_ID_PROPERTIES ); + if ( !interface ) + { + FT_ERROR(( "%s: module `%s' doesn't support properties\n", + func_name, module_name )); + return FT_THROW( Unimplemented_Feature ); + } + + service = (FT_Service_Properties)interface; + + if ( set ) + missing_func = (FT_Bool)( !service->set_property ); + else + missing_func = (FT_Bool)( !service->get_property ); + + if ( missing_func ) + { + FT_ERROR(( "%s: property service of module `%s' is broken\n", + func_name, module_name )); + return FT_THROW( Unimplemented_Feature ); + } + + return set ? service->set_property( cur[0], + property_name, + value, + value_is_string ) + : service->get_property( cur[0], + property_name, + value ); + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Property_Set( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + const void* value ) + { + return ft_property_do( library, + module_name, + property_name, + (void*)value, + TRUE, + FALSE ); + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Property_Get( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + void* value ) + { + return ft_property_do( library, + module_name, + property_name, + value, + FALSE, + FALSE ); + } + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + + /* this variant is used for handling the FREETYPE_PROPERTIES */ + /* environment variable */ + + FT_BASE_DEF( FT_Error ) + ft_property_string_set( FT_Library library, + const FT_String* module_name, + const FT_String* property_name, + FT_String* value ) + { + return ft_property_do( library, + module_name, + property_name, + (void*)value, + TRUE, + TRUE ); + } + +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** L I B R A R Y ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Reference_Library( FT_Library library ) + { + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + library->refcount++; + + return FT_Err_Ok; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_New_Library( FT_Memory memory, + FT_Library *alibrary ) + { + FT_Library library = NULL; + FT_Error error; + + + if ( !memory || !alibrary ) + return FT_THROW( Invalid_Argument ); + +#ifdef FT_DEBUG_LEVEL_ERROR + /* init debugging support */ + ft_debug_init(); +#endif + + /* first of all, allocate the library object */ + if ( FT_NEW( library ) ) + return error; + + library->memory = memory; + +#ifdef FT_CONFIG_OPTION_PIC + /* initialize position independent code containers */ + error = ft_pic_container_init( library ); + if ( error ) + goto Fail; +#endif + + library->version_major = FREETYPE_MAJOR; + library->version_minor = FREETYPE_MINOR; + library->version_patch = FREETYPE_PATCH; + + library->refcount = 1; + + /* That's ok now */ + *alibrary = library; + + return FT_Err_Ok; + +#ifdef FT_CONFIG_OPTION_PIC + Fail: + ft_pic_container_destroy( library ); + FT_FREE( library ); + return error; +#endif + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Library_Version( FT_Library library, + FT_Int *amajor, + FT_Int *aminor, + FT_Int *apatch ) + { + FT_Int major = 0; + FT_Int minor = 0; + FT_Int patch = 0; + + + if ( library ) + { + major = library->version_major; + minor = library->version_minor; + patch = library->version_patch; + } + + if ( amajor ) + *amajor = major; + + if ( aminor ) + *aminor = minor; + + if ( apatch ) + *apatch = patch; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Done_Library( FT_Library library ) + { + FT_Memory memory; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + library->refcount--; + if ( library->refcount > 0 ) + goto Exit; + + memory = library->memory; + + /* + * Close all faces in the library. If we don't do this, we can have + * some subtle memory leaks. + * + * Example: + * + * - the cff font driver uses the pshinter module in cff_size_done + * - if the pshinter module is destroyed before the cff font driver, + * opened FT_Face objects managed by the driver are not properly + * destroyed, resulting in a memory leak + * + * Some faces are dependent on other faces, like Type42 faces that + * depend on TrueType faces synthesized internally. + * + * The order of drivers should be specified in driver_name[]. + */ + { + FT_UInt m, n; + const char* driver_name[] = { "type42", NULL }; + + + for ( m = 0; + m < sizeof ( driver_name ) / sizeof ( driver_name[0] ); + m++ ) + { + for ( n = 0; n < library->num_modules; n++ ) + { + FT_Module module = library->modules[n]; + const char* module_name = module->clazz->module_name; + FT_List faces; + + + if ( driver_name[m] && + ft_strcmp( module_name, driver_name[m] ) != 0 ) + continue; + + if ( ( module->clazz->module_flags & FT_MODULE_FONT_DRIVER ) == 0 ) + continue; + + FT_TRACE7(( "FT_Done_Library: close faces for %s\n", module_name )); + + faces = &FT_DRIVER( module )->faces_list; + while ( faces->head ) + { + FT_Done_Face( FT_FACE( faces->head->data ) ); + if ( faces->head ) + FT_TRACE0(( "FT_Done_Library: failed to free some faces\n" )); + } + } + } + } + + /* Close all other modules in the library */ +#if 1 + /* XXX Modules are removed in the reversed order so that */ + /* type42 module is removed before truetype module. This */ + /* avoids double free in some occasions. It is a hack. */ + while ( library->num_modules > 0 ) + FT_Remove_Module( library, + library->modules[library->num_modules - 1] ); +#else + { + FT_UInt n; + + + for ( n = 0; n < library->num_modules; n++ ) + { + FT_Module module = library->modules[n]; + + + if ( module ) + { + Destroy_Module( module ); + library->modules[n] = NULL; + } + } + } +#endif + +#ifdef FT_CONFIG_OPTION_PIC + /* Destroy pic container contents */ + ft_pic_container_destroy( library ); +#endif + + FT_FREE( library ); + + Exit: + return FT_Err_Ok; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( void ) + FT_Set_Debug_Hook( FT_Library library, + FT_UInt hook_index, + FT_DebugHook_Func debug_hook ) + { + if ( library && debug_hook && + hook_index < + ( sizeof ( library->debug_hooks ) / sizeof ( void* ) ) ) + library->debug_hooks[hook_index] = debug_hook; + } + + + /* documentation is in ftmodapi.h */ + + FT_EXPORT_DEF( FT_TrueTypeEngineType ) + FT_Get_TrueType_Engine_Type( FT_Library library ) + { + FT_TrueTypeEngineType result = FT_TRUETYPE_ENGINE_TYPE_NONE; + + + if ( library ) + { + FT_Module module = FT_Get_Module( library, "truetype" ); + + + if ( module ) + { + FT_Service_TrueTypeEngine service; + + + service = (FT_Service_TrueTypeEngine) + ft_module_get_service( module, + FT_SERVICE_ID_TRUETYPE_ENGINE, + 0 ); + if ( service ) + result = service->engine_type; + } + } + + return result; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_SubGlyph_Info( FT_GlyphSlot glyph, + FT_UInt sub_index, + FT_Int *p_index, + FT_UInt *p_flags, + FT_Int *p_arg1, + FT_Int *p_arg2, + FT_Matrix *p_transform ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + + + if ( glyph && + glyph->subglyphs && + glyph->format == FT_GLYPH_FORMAT_COMPOSITE && + sub_index < glyph->num_subglyphs ) + { + FT_SubGlyph subg = glyph->subglyphs + sub_index; + + + *p_index = subg->index; + *p_flags = subg->flags; + *p_arg1 = subg->arg1; + *p_arg2 = subg->arg2; + *p_transform = subg->transform; + + error = FT_Err_Ok; + } + + return error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftotval.c b/vendor/FreeType2/src/base/ftotval.c new file mode 100644 index 0000000..a2944a7 --- /dev/null +++ b/vendor/FreeType2/src/base/ftotval.c @@ -0,0 +1,91 @@ +/***************************************************************************/ +/* */ +/* ftotval.c */ +/* */ +/* FreeType API for validating OpenType tables (body). */ +/* */ +/* Copyright 2004-2018 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. */ +/* */ +/***************************************************************************/ + +#include +#include FT_INTERNAL_DEBUG_H + +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_OPENTYPE_VALIDATE_H +#include FT_OPENTYPE_VALIDATE_H + + + /* documentation is in ftotval.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_OpenType_Validate( FT_Face face, + FT_UInt validation_flags, + FT_Bytes *BASE_table, + FT_Bytes *GDEF_table, + FT_Bytes *GPOS_table, + FT_Bytes *GSUB_table, + FT_Bytes *JSTF_table ) + { + FT_Service_OTvalidate service; + FT_Error error; + + + if ( !face ) + { + error = FT_THROW( Invalid_Face_Handle ); + goto Exit; + } + + if ( !( BASE_table && + GDEF_table && + GPOS_table && + GSUB_table && + JSTF_table ) ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, service, OPENTYPE_VALIDATE ); + + if ( service ) + error = service->validate( face, + validation_flags, + BASE_table, + GDEF_table, + GPOS_table, + GSUB_table, + JSTF_table ); + else + error = FT_THROW( Unimplemented_Feature ); + + Exit: + return error; + } + + + FT_EXPORT_DEF( void ) + FT_OpenType_Free( FT_Face face, + FT_Bytes table ) + { + FT_Memory memory; + + + if ( !face ) + return; + + memory = FT_FACE_MEMORY( face ); + + FT_FREE( table ); + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftoutln.c b/vendor/FreeType2/src/base/ftoutln.c new file mode 100644 index 0000000..cb91321 --- /dev/null +++ b/vendor/FreeType2/src/base/ftoutln.c @@ -0,0 +1,1110 @@ +/***************************************************************************/ +/* */ +/* ftoutln.c */ +/* */ +/* FreeType outline management (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* All functions are declared in freetype.h. */ + /* */ + /*************************************************************************/ + + +#include +#include FT_OUTLINE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_DEBUG_H +#include FT_TRIGONOMETRY_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_outline + + + static + const FT_Outline null_outline = { 0, 0, NULL, NULL, NULL, 0 }; + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Decompose( FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ) + { +#undef SCALED +#define SCALED( x ) ( ( (x) < 0 ? -( -(x) << shift ) \ + : ( (x) << shift ) ) - delta ) + + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + FT_Error error; + + FT_Int n; /* index of contour in outline */ + FT_UInt first; /* index of first point in contour */ + FT_Int tag; /* current point's state */ + + FT_Int shift; + FT_Pos delta; + + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + if ( !func_interface ) + return FT_THROW( Invalid_Argument ); + + shift = func_interface->shift; + delta = func_interface->delta; + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + FT_Int last; /* index of last point in contour */ + + + FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n )); + + last = outline->contours[n]; + if ( last < 0 ) + goto Invalid_Outline; + limit = outline->points + last; + + v_start = outline->points[first]; + v_start.x = SCALED( v_start.x ); + v_start.y = SCALED( v_start.y ); + + v_last = outline->points[last]; + v_last.x = SCALED( v_last.x ); + v_last.y = SCALED( v_last.y ); + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + /* v_last = v_start; */ + } + point--; + tags--; + } + + FT_TRACE5(( " move to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->move_to( &v_start, user ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " line to (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0 )); + error = func_interface->line_to( &vec, user ); + if ( error ) + goto Exit; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point->x ); + v_control.y = SCALED( point->y ); + + Do_Conic: + if ( point < limit ) + { + FT_Vector vec; + FT_Vector v_middle; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + if ( tag == FT_CURVE_TAG_ON ) + { + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_middle.x / 64.0, v_middle.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_middle, user ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_start, user ); + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1.x = SCALED( point[-2].x ); + vec1.y = SCALED( point[-2].y ); + + vec2.x = SCALED( point[-1].x ); + vec2.y = SCALED( point[-1].y ); + + if ( point <= limit ) + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); + goto Close; + } + } + } + + /* close the contour with a line segment */ + FT_TRACE5(( " line to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->line_to( &v_start, user ); + + Close: + if ( error ) + goto Exit; + + first = (FT_UInt)last + 1; + } + + FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); + return FT_Err_Ok; + + Invalid_Outline: + error = FT_THROW( Invalid_Outline ); + /* fall through */ + + Exit: + FT_TRACE5(( "FT_Outline_Decompose: Error 0x%x\n", error )); + return error; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_New_Internal( FT_Memory memory, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ) + { + FT_Error error; + + + if ( !anoutline || !memory ) + return FT_THROW( Invalid_Argument ); + + *anoutline = null_outline; + + if ( numContours < 0 || + (FT_UInt)numContours > numPoints ) + return FT_THROW( Invalid_Argument ); + + if ( numPoints > FT_OUTLINE_POINTS_MAX ) + return FT_THROW( Array_Too_Large ); + + if ( FT_NEW_ARRAY( anoutline->points, numPoints ) || + FT_NEW_ARRAY( anoutline->tags, numPoints ) || + FT_NEW_ARRAY( anoutline->contours, numContours ) ) + goto Fail; + + anoutline->n_points = (FT_Short)numPoints; + anoutline->n_contours = (FT_Short)numContours; + anoutline->flags |= FT_OUTLINE_OWNER; + + return FT_Err_Ok; + + Fail: + anoutline->flags |= FT_OUTLINE_OWNER; + FT_Outline_Done_Internal( memory, anoutline ); + + return error; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_New( FT_Library library, + FT_UInt numPoints, + FT_Int numContours, + FT_Outline *anoutline ) + { + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + return FT_Outline_New_Internal( library->memory, numPoints, + numContours, anoutline ); + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Check( FT_Outline* outline ) + { + if ( outline ) + { + FT_Int n_points = outline->n_points; + FT_Int n_contours = outline->n_contours; + FT_Int end0, end; + FT_Int n; + + + /* empty glyph? */ + if ( n_points == 0 && n_contours == 0 ) + return FT_Err_Ok; + + /* check point and contour counts */ + if ( n_points <= 0 || n_contours <= 0 ) + goto Bad; + + end0 = end = -1; + for ( n = 0; n < n_contours; n++ ) + { + end = outline->contours[n]; + + /* note that we don't accept empty contours */ + if ( end <= end0 || end >= n_points ) + goto Bad; + + end0 = end; + } + + if ( end != n_points - 1 ) + goto Bad; + + /* XXX: check the tags array */ + return FT_Err_Ok; + } + + Bad: + return FT_THROW( Invalid_Argument ); + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Copy( const FT_Outline* source, + FT_Outline *target ) + { + FT_Int is_owner; + + + if ( !source || !target ) + return FT_THROW( Invalid_Outline ); + + if ( source->n_points != target->n_points || + source->n_contours != target->n_contours ) + return FT_THROW( Invalid_Argument ); + + if ( source == target ) + return FT_Err_Ok; + + if ( source->n_points ) + { + FT_ARRAY_COPY( target->points, source->points, source->n_points ); + FT_ARRAY_COPY( target->tags, source->tags, source->n_points ); + } + + if ( source->n_contours ) + FT_ARRAY_COPY( target->contours, source->contours, source->n_contours ); + + /* copy all flags, except the `FT_OUTLINE_OWNER' one */ + is_owner = target->flags & FT_OUTLINE_OWNER; + target->flags = source->flags; + + target->flags &= ~FT_OUTLINE_OWNER; + target->flags |= is_owner; + + return FT_Err_Ok; + } + + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Done_Internal( FT_Memory memory, + FT_Outline* outline ) + { + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + if ( !memory ) + return FT_THROW( Invalid_Argument ); + + if ( outline->flags & FT_OUTLINE_OWNER ) + { + FT_FREE( outline->points ); + FT_FREE( outline->tags ); + FT_FREE( outline->contours ); + } + *outline = null_outline; + + return FT_Err_Ok; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Done( FT_Library library, + FT_Outline* outline ) + { + /* check for valid `outline' in FT_Outline_Done_Internal() */ + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + return FT_Outline_Done_Internal( library->memory, outline ); + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ) + { + FT_Pos xMin, yMin, xMax, yMax; + + + if ( outline && acbox ) + { + if ( outline->n_points == 0 ) + { + xMin = 0; + yMin = 0; + xMax = 0; + yMax = 0; + } + else + { + FT_Vector* vec = outline->points; + FT_Vector* limit = vec + outline->n_points; + + + xMin = xMax = vec->x; + yMin = yMax = vec->y; + vec++; + + for ( ; vec < limit; vec++ ) + { + FT_Pos x, y; + + + x = vec->x; + if ( x < xMin ) xMin = x; + if ( x > xMax ) xMax = x; + + y = vec->y; + if ( y < yMin ) yMin = y; + if ( y > yMax ) yMax = y; + } + } + acbox->xMin = xMin; + acbox->xMax = xMax; + acbox->yMin = yMin; + acbox->yMax = yMax; + } + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Translate( const FT_Outline* outline, + FT_Pos xOffset, + FT_Pos yOffset ) + { + FT_UShort n; + FT_Vector* vec; + + + if ( !outline ) + return; + + vec = outline->points; + + for ( n = 0; n < outline->n_points; n++ ) + { + vec->x = ADD_LONG( vec->x, xOffset ); + vec->y = ADD_LONG( vec->y, yOffset ); + vec++; + } + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Reverse( FT_Outline* outline ) + { + FT_UShort n; + FT_Int first, last; + + + if ( !outline ) + return; + + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + last = outline->contours[n]; + + /* reverse point table */ + { + FT_Vector* p = outline->points + first; + FT_Vector* q = outline->points + last; + FT_Vector swap; + + + while ( p < q ) + { + swap = *p; + *p = *q; + *q = swap; + p++; + q--; + } + } + + /* reverse tags table */ + { + char* p = outline->tags + first; + char* q = outline->tags + last; + + + while ( p < q ) + { + char swap; + + + swap = *p; + *p = *q; + *q = swap; + p++; + q--; + } + } + + first = last + 1; + } + + outline->flags ^= FT_OUTLINE_REVERSE_FILL; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Render( FT_Library library, + FT_Outline* outline, + FT_Raster_Params* params ) + { + FT_Error error; + FT_Renderer renderer; + FT_ListNode node; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + if ( !params ) + return FT_THROW( Invalid_Argument ); + + renderer = library->cur_renderer; + node = library->renderers.head; + + params->source = (void*)outline; + + error = FT_ERR( Cannot_Render_Glyph ); + while ( renderer ) + { + error = renderer->raster_render( renderer->raster, params ); + if ( !error || FT_ERR_NEQ( error, Cannot_Render_Glyph ) ) + break; + + /* FT_Err_Cannot_Render_Glyph is returned if the render mode */ + /* is unsupported by the current renderer for this glyph image */ + /* format */ + + /* now, look for another renderer that supports the same */ + /* format */ + renderer = FT_Lookup_Renderer( library, FT_GLYPH_FORMAT_OUTLINE, + &node ); + } + + return error; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Get_Bitmap( FT_Library library, + FT_Outline* outline, + const FT_Bitmap *abitmap ) + { + FT_Raster_Params params; + + + if ( !abitmap ) + return FT_THROW( Invalid_Argument ); + + /* other checks are delayed to `FT_Outline_Render' */ + + params.target = abitmap; + params.flags = 0; + + if ( abitmap->pixel_mode == FT_PIXEL_MODE_GRAY || + abitmap->pixel_mode == FT_PIXEL_MODE_LCD || + abitmap->pixel_mode == FT_PIXEL_MODE_LCD_V ) + params.flags |= FT_RASTER_FLAG_AA; + + return FT_Outline_Render( library, outline, ¶ms ); + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Transform( FT_Vector* vector, + const FT_Matrix* matrix ) + { + FT_Pos xz, yz; + + + if ( !vector || !matrix ) + return; + + xz = FT_MulFix( vector->x, matrix->xx ) + + FT_MulFix( vector->y, matrix->xy ); + + yz = FT_MulFix( vector->x, matrix->yx ) + + FT_MulFix( vector->y, matrix->yy ); + + vector->x = xz; + vector->y = yz; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( void ) + FT_Outline_Transform( const FT_Outline* outline, + const FT_Matrix* matrix ) + { + FT_Vector* vec; + FT_Vector* limit; + + + if ( !outline || !matrix ) + return; + + vec = outline->points; + limit = vec + outline->n_points; + + for ( ; vec < limit; vec++ ) + FT_Vector_Transform( vec, matrix ); + } + + +#if 0 + +#define FT_OUTLINE_GET_CONTOUR( outline, c, first, last ) \ + do \ + { \ + (first) = ( c > 0 ) ? (outline)->points + \ + (outline)->contours[c - 1] + 1 \ + : (outline)->points; \ + (last) = (outline)->points + (outline)->contours[c]; \ + } while ( 0 ) + + + /* Is a point in some contour? */ + /* */ + /* We treat every point of the contour as if it */ + /* it were ON. That is, we allow false positives, */ + /* but disallow false negatives. (XXX really?) */ + static FT_Bool + ft_contour_has( FT_Outline* outline, + FT_Short c, + FT_Vector* point ) + { + FT_Vector* first; + FT_Vector* last; + FT_Vector* a; + FT_Vector* b; + FT_UInt n = 0; + + + FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); + + for ( a = first; a <= last; a++ ) + { + FT_Pos x; + FT_Int intersect; + + + b = ( a == last ) ? first : a + 1; + + intersect = ( a->y - point->y ) ^ ( b->y - point->y ); + + /* a and b are on the same side */ + if ( intersect >= 0 ) + { + if ( intersect == 0 && a->y == point->y ) + { + if ( ( a->x <= point->x && b->x >= point->x ) || + ( a->x >= point->x && b->x <= point->x ) ) + return 1; + } + + continue; + } + + x = a->x + ( b->x - a->x ) * (point->y - a->y ) / ( b->y - a->y ); + + if ( x < point->x ) + n++; + else if ( x == point->x ) + return 1; + } + + return n & 1; + } + + + static FT_Bool + ft_contour_enclosed( FT_Outline* outline, + FT_UShort c ) + { + FT_Vector* first; + FT_Vector* last; + FT_Short i; + + + FT_OUTLINE_GET_CONTOUR( outline, c, first, last ); + + for ( i = 0; i < outline->n_contours; i++ ) + { + if ( i != c && ft_contour_has( outline, i, first ) ) + { + FT_Vector* pt; + + + for ( pt = first + 1; pt <= last; pt++ ) + if ( !ft_contour_has( outline, i, pt ) ) + return 0; + + return 1; + } + } + + return 0; + } + + + /* This version differs from the public one in that each */ + /* part (contour not enclosed in another contour) of the */ + /* outline is checked for orientation. This is */ + /* necessary for some buggy CJK fonts. */ + static FT_Orientation + ft_outline_get_orientation( FT_Outline* outline ) + { + FT_Short i; + FT_Vector* first; + FT_Vector* last; + FT_Orientation orient = FT_ORIENTATION_NONE; + + + first = outline->points; + for ( i = 0; i < outline->n_contours; i++, first = last + 1 ) + { + FT_Vector* point; + FT_Vector* xmin_point; + FT_Pos xmin; + + + last = outline->points + outline->contours[i]; + + /* skip degenerate contours */ + if ( last < first + 2 ) + continue; + + if ( ft_contour_enclosed( outline, i ) ) + continue; + + xmin = first->x; + xmin_point = first; + + for ( point = first + 1; point <= last; point++ ) + { + if ( point->x < xmin ) + { + xmin = point->x; + xmin_point = point; + } + } + + /* check the orientation of the contour */ + { + FT_Vector* prev; + FT_Vector* next; + FT_Orientation o; + + + prev = ( xmin_point == first ) ? last : xmin_point - 1; + next = ( xmin_point == last ) ? first : xmin_point + 1; + + if ( FT_Atan2( prev->x - xmin_point->x, prev->y - xmin_point->y ) > + FT_Atan2( next->x - xmin_point->x, next->y - xmin_point->y ) ) + o = FT_ORIENTATION_POSTSCRIPT; + else + o = FT_ORIENTATION_TRUETYPE; + + if ( orient == FT_ORIENTATION_NONE ) + orient = o; + else if ( orient != o ) + return FT_ORIENTATION_NONE; + } + } + + return orient; + } + +#endif /* 0 */ + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_Embolden( FT_Outline* outline, + FT_Pos strength ) + { + return FT_Outline_EmboldenXY( outline, strength, strength ); + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Outline_EmboldenXY( FT_Outline* outline, + FT_Pos xstrength, + FT_Pos ystrength ) + { + FT_Vector* points; + FT_Int c, first, last; + FT_Int orientation; + + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + xstrength /= 2; + ystrength /= 2; + if ( xstrength == 0 && ystrength == 0 ) + return FT_Err_Ok; + + orientation = FT_Outline_Get_Orientation( outline ); + if ( orientation == FT_ORIENTATION_NONE ) + { + if ( outline->n_contours ) + return FT_THROW( Invalid_Argument ); + else + return FT_Err_Ok; + } + + points = outline->points; + + first = 0; + for ( c = 0; c < outline->n_contours; c++ ) + { + FT_Vector in, out, anchor, shift; + FT_Fixed l_in, l_out, l_anchor = 0, l, q, d; + FT_Int i, j, k; + + + l_in = 0; + last = outline->contours[c]; + + /* pacify compiler */ + in.x = in.y = anchor.x = anchor.y = 0; + + /* Counter j cycles though the points; counter i advances only */ + /* when points are moved; anchor k marks the first moved point. */ + for ( i = last, j = first, k = -1; + j != i && i != k; + j = j < last ? j + 1 : first ) + { + if ( j != k ) + { + out.x = points[j].x - points[i].x; + out.y = points[j].y - points[i].y; + l_out = (FT_Fixed)FT_Vector_NormLen( &out ); + + if ( l_out == 0 ) + continue; + } + else + { + out = anchor; + l_out = l_anchor; + } + + if ( l_in != 0 ) + { + if ( k < 0 ) + { + k = i; + anchor = in; + l_anchor = l_in; + } + + d = FT_MulFix( in.x, out.x ) + FT_MulFix( in.y, out.y ); + + /* shift only if turn is less than ~160 degrees */ + if ( d > -0xF000L ) + { + d = d + 0x10000L; + + /* shift components along lateral bisector in proper orientation */ + shift.x = in.y + out.y; + shift.y = in.x + out.x; + + if ( orientation == FT_ORIENTATION_TRUETYPE ) + shift.x = -shift.x; + else + shift.y = -shift.y; + + /* restrict shift magnitude to better handle collapsing segments */ + q = FT_MulFix( out.x, in.y ) - FT_MulFix( out.y, in.x ); + if ( orientation == FT_ORIENTATION_TRUETYPE ) + q = -q; + + l = FT_MIN( l_in, l_out ); + + /* non-strict inequalities avoid divide-by-zero when q == l == 0 */ + if ( FT_MulFix( xstrength, q ) <= FT_MulFix( l, d ) ) + shift.x = FT_MulDiv( shift.x, xstrength, d ); + else + shift.x = FT_MulDiv( shift.x, l, q ); + + + if ( FT_MulFix( ystrength, q ) <= FT_MulFix( l, d ) ) + shift.y = FT_MulDiv( shift.y, ystrength, d ); + else + shift.y = FT_MulDiv( shift.y, l, q ); + } + else + shift.x = shift.y = 0; + + for ( ; + i != j; + i = i < last ? i + 1 : first ) + { + points[i].x += xstrength + shift.x; + points[i].y += ystrength + shift.y; + } + } + else + i = j; + + in = out; + l_in = l_out; + } + + first = last + 1; + } + + return FT_Err_Ok; + } + + + /* documentation is in ftoutln.h */ + + FT_EXPORT_DEF( FT_Orientation ) + FT_Outline_Get_Orientation( FT_Outline* outline ) + { + FT_BBox cbox; + FT_Int xshift, yshift; + FT_Vector* points; + FT_Vector v_prev, v_cur; + FT_Int c, n, first; + FT_Pos area = 0; + + + if ( !outline || outline->n_points <= 0 ) + return FT_ORIENTATION_TRUETYPE; + + /* We use the nonzero winding rule to find the orientation. */ + /* Since glyph outlines behave much more `regular' than arbitrary */ + /* cubic or quadratic curves, this test deals with the polygon */ + /* only that is spanned up by the control points. */ + + FT_Outline_Get_CBox( outline, &cbox ); + + /* Handle collapsed outlines to avoid undefined FT_MSB. */ + if ( cbox.xMin == cbox.xMax || cbox.yMin == cbox.yMax ) + return FT_ORIENTATION_NONE; + + xshift = FT_MSB( (FT_UInt32)( FT_ABS( cbox.xMax ) | + FT_ABS( cbox.xMin ) ) ) - 14; + xshift = FT_MAX( xshift, 0 ); + + yshift = FT_MSB( (FT_UInt32)( cbox.yMax - cbox.yMin ) ) - 14; + yshift = FT_MAX( yshift, 0 ); + + points = outline->points; + + first = 0; + for ( c = 0; c < outline->n_contours; c++ ) + { + FT_Int last = outline->contours[c]; + + + v_prev.x = points[last].x >> xshift; + v_prev.y = points[last].y >> yshift; + + for ( n = first; n <= last; n++ ) + { + v_cur.x = points[n].x >> xshift; + v_cur.y = points[n].y >> yshift; + + area = ADD_LONG( area, + ( v_cur.y - v_prev.y ) * ( v_cur.x + v_prev.x ) ); + + v_prev = v_cur; + } + + first = last + 1; + } + + if ( area > 0 ) + return FT_ORIENTATION_POSTSCRIPT; + else if ( area < 0 ) + return FT_ORIENTATION_TRUETYPE; + else + return FT_ORIENTATION_NONE; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftpatent.c b/vendor/FreeType2/src/base/ftpatent.c new file mode 100644 index 0000000..e23ee2e --- /dev/null +++ b/vendor/FreeType2/src/base/ftpatent.c @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* ftpatent.c */ +/* */ +/* FreeType API for checking patented TrueType bytecode instructions */ +/* (body). Obsolete, retained for backward compatibility. */ +/* */ +/* Copyright 2007-2018 by */ +/* David Turner. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + +#include +#include FT_FREETYPE_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_TRUETYPE_GLYF_H + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Face_CheckTrueTypePatents( FT_Face face ) + { + FT_UNUSED( face ); + + return FALSE; + } + + + /* documentation is in freetype.h */ + + FT_EXPORT_DEF( FT_Bool ) + FT_Face_SetUnpatentedHinting( FT_Face face, + FT_Bool value ) + { + FT_UNUSED( face ); + FT_UNUSED( value ); + + return FALSE; + } + +/* END */ diff --git a/vendor/FreeType2/src/base/ftpfr.c b/vendor/FreeType2/src/base/ftpfr.c new file mode 100644 index 0000000..bfe1352 --- /dev/null +++ b/vendor/FreeType2/src/base/ftpfr.c @@ -0,0 +1,153 @@ +/***************************************************************************/ +/* */ +/* ftpfr.c */ +/* */ +/* FreeType API for accessing PFR-specific data (body). */ +/* */ +/* Copyright 2002-2018 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. */ +/* */ +/***************************************************************************/ + +#include +#include FT_INTERNAL_DEBUG_H + +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_PFR_H + + + /* check the format */ + static FT_Service_PfrMetrics + ft_pfr_check( FT_Face face ) + { + FT_Service_PfrMetrics service = NULL; + + + if ( face ) + FT_FACE_LOOKUP_SERVICE( face, service, PFR_METRICS ); + + return service; + } + + + /* documentation is in ftpfr.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PFR_Metrics( FT_Face face, + FT_UInt *aoutline_resolution, + FT_UInt *ametrics_resolution, + FT_Fixed *ametrics_x_scale, + FT_Fixed *ametrics_y_scale ) + { + FT_Error error = FT_Err_Ok; + FT_Service_PfrMetrics service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + service = ft_pfr_check( face ); + if ( service ) + { + error = service->get_metrics( face, + aoutline_resolution, + ametrics_resolution, + ametrics_x_scale, + ametrics_y_scale ); + } + else + { + FT_Fixed x_scale, y_scale; + + + /* this is not a PFR font */ + if ( aoutline_resolution ) + *aoutline_resolution = face->units_per_EM; + + if ( ametrics_resolution ) + *ametrics_resolution = face->units_per_EM; + + x_scale = y_scale = 0x10000L; + if ( face->size ) + { + x_scale = face->size->metrics.x_scale; + y_scale = face->size->metrics.y_scale; + } + + if ( ametrics_x_scale ) + *ametrics_x_scale = x_scale; + + if ( ametrics_y_scale ) + *ametrics_y_scale = y_scale; + + error = FT_THROW( Unknown_File_Format ); + } + + return error; + } + + + /* documentation is in ftpfr.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PFR_Kerning( FT_Face face, + FT_UInt left, + FT_UInt right, + FT_Vector *avector ) + { + FT_Error error; + FT_Service_PfrMetrics service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !avector ) + return FT_THROW( Invalid_Argument ); + + service = ft_pfr_check( face ); + if ( service ) + error = service->get_kerning( face, left, right, avector ); + else + error = FT_Get_Kerning( face, left, right, + FT_KERNING_UNSCALED, avector ); + + return error; + } + + + /* documentation is in ftpfr.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PFR_Advance( FT_Face face, + FT_UInt gindex, + FT_Pos *aadvance ) + { + FT_Error error; + FT_Service_PfrMetrics service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !aadvance ) + return FT_THROW( Invalid_Argument ); + + service = ft_pfr_check( face ); + if ( service ) + error = service->get_advance( face, gindex, aadvance ); + else + /* XXX: TODO: PROVIDE ADVANCE-LOADING METHOD TO ALL FONT DRIVERS */ + error = FT_THROW( Invalid_Argument ); + + return error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftpic.c b/vendor/FreeType2/src/base/ftpic.c new file mode 100644 index 0000000..1492e18 --- /dev/null +++ b/vendor/FreeType2/src/base/ftpic.c @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* ftpic.c */ +/* */ +/* The FreeType position independent code services (body). */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "basepic.h" + +#ifdef FT_CONFIG_OPTION_PIC + + /* documentation is in ftpic.h */ + + FT_BASE_DEF( FT_Error ) + ft_pic_container_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error; + + + FT_MEM_SET( pic_container, 0, sizeof ( *pic_container ) ); + + error = ft_base_pic_init( library ); + if ( error ) + return error; + + return FT_Err_Ok; + } + + + /* Destroy the contents of the container. */ + FT_BASE_DEF( void ) + ft_pic_container_destroy( FT_Library library ) + { + ft_base_pic_free( library ); + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftpsprop.c b/vendor/FreeType2/src/base/ftpsprop.c new file mode 100644 index 0000000..459b5e6 --- /dev/null +++ b/vendor/FreeType2/src/base/ftpsprop.c @@ -0,0 +1,285 @@ +/***************************************************************************/ +/* */ +/* ftpsprop.c */ +/* */ +/* Get and set properties of PostScript drivers (body). */ +/* See `ftdriver.h' for available properties. */ +/* */ +/* Copyright 2017-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_DRIVER_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_POSTSCRIPT_PROPS_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_psprops + + + FT_BASE_CALLBACK_DEF( FT_Error ) + ps_property_set( FT_Module module, /* PS_Driver */ + const char* property_name, + const void* value, + FT_Bool value_is_string ) + { + FT_Error error = FT_Err_Ok; + PS_Driver driver = (PS_Driver)module; + +#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_UNUSED( value_is_string ); +#endif + + + if ( !ft_strcmp( property_name, "darkening-parameters" ) ) + { + FT_Int* darken_params; + FT_Int x1, y1, x2, y2, x3, y3, x4, y4; + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_Int dp[8]; + + + if ( value_is_string ) + { + const char* s = (const char*)value; + char* ep; + int i; + + + /* eight comma-separated numbers */ + for ( i = 0; i < 7; i++ ) + { + dp[i] = (FT_Int)ft_strtol( s, &ep, 10 ); + if ( *ep != ',' || s == ep ) + return FT_THROW( Invalid_Argument ); + + s = ep + 1; + } + + dp[7] = (FT_Int)ft_strtol( s, &ep, 10 ); + if ( !( *ep == '\0' || *ep == ' ' ) || s == ep ) + return FT_THROW( Invalid_Argument ); + + darken_params = dp; + } + else +#endif + darken_params = (FT_Int*)value; + + x1 = darken_params[0]; + y1 = darken_params[1]; + x2 = darken_params[2]; + y2 = darken_params[3]; + x3 = darken_params[4]; + y3 = darken_params[5]; + x4 = darken_params[6]; + y4 = darken_params[7]; + + if ( x1 < 0 || x2 < 0 || x3 < 0 || x4 < 0 || + y1 < 0 || y2 < 0 || y3 < 0 || y4 < 0 || + x1 > x2 || x2 > x3 || x3 > x4 || + y1 > 500 || y2 > 500 || y3 > 500 || y4 > 500 ) + return FT_THROW( Invalid_Argument ); + + driver->darken_params[0] = x1; + driver->darken_params[1] = y1; + driver->darken_params[2] = x2; + driver->darken_params[3] = y2; + driver->darken_params[4] = x3; + driver->darken_params[5] = y3; + driver->darken_params[6] = x4; + driver->darken_params[7] = y4; + + return error; + } + + else if ( !ft_strcmp( property_name, "hinting-engine" ) ) + { +#if defined( CFF_CONFIG_OPTION_OLD_ENGINE ) || \ + defined( T1_CONFIG_OPTION_OLD_ENGINE ) + const char* module_name = module->clazz->module_name; +#endif + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + + + if ( !ft_strcmp( s, "adobe" ) ) + driver->hinting_engine = FT_HINTING_ADOBE; + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + else if ( !ft_strcmp( module_name, "cff" ) && + !ft_strcmp( s, "freetype" ) ) + driver->hinting_engine = FT_HINTING_FREETYPE; +#endif + +#ifdef T1_CONFIG_OPTION_OLD_ENGINE + else if ( ( !ft_strcmp( module_name, "type1" ) || + !ft_strcmp( module_name, "t1cid" ) ) && + !ft_strcmp( s, "freetype" ) ) + driver->hinting_engine = FT_HINTING_FREETYPE; +#endif + + else + return FT_THROW( Invalid_Argument ); + } + else +#endif /* FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES */ + { + FT_UInt* hinting_engine = (FT_UInt*)value; + + + if ( *hinting_engine == FT_HINTING_ADOBE +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + || ( *hinting_engine == FT_HINTING_FREETYPE && + !ft_strcmp( module_name, "cff" ) ) +#endif +#ifdef T1_CONFIG_OPTION_OLD_ENGINE + || ( *hinting_engine == FT_HINTING_FREETYPE && + ( !ft_strcmp( module_name, "type1" ) || + !ft_strcmp( module_name, "t1cid" ) ) ) +#endif + ) + driver->hinting_engine = *hinting_engine; + else + error = FT_ERR( Unimplemented_Feature ); + + return error; + } + } + + else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) + { +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + long nsd = ft_strtol( s, NULL, 10 ); + + + if ( !nsd ) + driver->no_stem_darkening = FALSE; + else + driver->no_stem_darkening = TRUE; + } + else +#endif + { + FT_Bool* no_stem_darkening = (FT_Bool*)value; + + + driver->no_stem_darkening = *no_stem_darkening; + } + + return error; + } + + else if ( !ft_strcmp( property_name, "random-seed" ) ) + { + FT_Int32 random_seed; + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + + + random_seed = (FT_Int32)ft_strtol( s, NULL, 10 ); + } + else +#endif + random_seed = *(FT_Int32*)value; + + if ( random_seed < 0 ) + random_seed = 0; + + driver->random_seed = random_seed; + + return error; + } + + FT_TRACE0(( "ps_property_set: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + + FT_BASE_CALLBACK_DEF( FT_Error ) + ps_property_get( FT_Module module, /* PS_Driver */ + const char* property_name, + void* value ) + { + FT_Error error = FT_Err_Ok; + PS_Driver driver = (PS_Driver)module; + + + if ( !ft_strcmp( property_name, "darkening-parameters" ) ) + { + FT_Int* darken_params = driver->darken_params; + FT_Int* val = (FT_Int*)value; + + + val[0] = darken_params[0]; + val[1] = darken_params[1]; + val[2] = darken_params[2]; + val[3] = darken_params[3]; + val[4] = darken_params[4]; + val[5] = darken_params[5]; + val[6] = darken_params[6]; + val[7] = darken_params[7]; + + return error; + } + + else if ( !ft_strcmp( property_name, "hinting-engine" ) ) + { + FT_UInt hinting_engine = driver->hinting_engine; + FT_UInt* val = (FT_UInt*)value; + + + *val = hinting_engine; + + return error; + } + + else if ( !ft_strcmp( property_name, "no-stem-darkening" ) ) + { + FT_Bool no_stem_darkening = driver->no_stem_darkening; + FT_Bool* val = (FT_Bool*)value; + + + *val = no_stem_darkening; + + return error; + } + + FT_TRACE0(( "ps_property_get: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftrfork.c b/vendor/FreeType2/src/base/ftrfork.c new file mode 100644 index 0000000..c3a2b91 --- /dev/null +++ b/vendor/FreeType2/src/base/ftrfork.c @@ -0,0 +1,943 @@ +/***************************************************************************/ +/* */ +/* ftrfork.c */ +/* */ +/* Embedded resource forks accessor (body). */ +/* */ +/* Copyright 2004-2018 by */ +/* Masatake YAMATO and Redhat K.K. */ +/* */ +/* FT_Raccess_Get_HeaderInfo() and raccess_guess_darwin_hfsplus() are */ +/* derived from ftobjs.c. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + +/***************************************************************************/ +/* Development of the code in this file is support of */ +/* Information-technology Promotion Agency, Japan. */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_RFORK_H +#include "basepic.h" +#include "ftbase.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_raccess + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** Resource fork directory access ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + FT_BASE_DEF( FT_Error ) + FT_Raccess_Get_HeaderInfo( FT_Library library, + FT_Stream stream, + FT_Long rfork_offset, + FT_Long *map_offset, + FT_Long *rdata_pos ) + { + FT_Error error; + unsigned char head[16], head2[16]; + FT_Long map_pos, map_len, rdata_len; + int allzeros, allmatch, i; + FT_Long type_list; + + FT_UNUSED( library ); + + + error = FT_Stream_Seek( stream, (FT_ULong)rfork_offset ); + if ( error ) + return error; + + error = FT_Stream_Read( stream, (FT_Byte*)head, 16 ); + if ( error ) + return error; + + /* ensure positive values */ + if ( head[0] >= 0x80 || + head[4] >= 0x80 || + head[8] >= 0x80 || + head[12] >= 0x80 ) + return FT_THROW( Unknown_File_Format ); + + *rdata_pos = ( head[ 0] << 24 ) | + ( head[ 1] << 16 ) | + ( head[ 2] << 8 ) | + head[ 3]; + map_pos = ( head[ 4] << 24 ) | + ( head[ 5] << 16 ) | + ( head[ 6] << 8 ) | + head[ 7]; + rdata_len = ( head[ 8] << 24 ) | + ( head[ 9] << 16 ) | + ( head[10] << 8 ) | + head[11]; + map_len = ( head[12] << 24 ) | + ( head[13] << 16 ) | + ( head[14] << 8 ) | + head[15]; + + /* the map must not be empty */ + if ( !map_pos ) + return FT_THROW( Unknown_File_Format ); + + /* check whether rdata and map overlap */ + if ( *rdata_pos < map_pos ) + { + if ( *rdata_pos > map_pos - rdata_len ) + return FT_THROW( Unknown_File_Format ); + } + else + { + if ( map_pos > *rdata_pos - map_len ) + return FT_THROW( Unknown_File_Format ); + } + + /* check whether end of rdata or map exceeds stream size */ + if ( FT_LONG_MAX - rdata_len < *rdata_pos || + FT_LONG_MAX - map_len < map_pos || + + FT_LONG_MAX - ( *rdata_pos + rdata_len ) < rfork_offset || + FT_LONG_MAX - ( map_pos + map_len ) < rfork_offset || + + (FT_ULong)( rfork_offset + *rdata_pos + rdata_len ) > stream->size || + (FT_ULong)( rfork_offset + map_pos + map_len ) > stream->size ) + return FT_THROW( Unknown_File_Format ); + + *rdata_pos += rfork_offset; + map_pos += rfork_offset; + + error = FT_Stream_Seek( stream, (FT_ULong)map_pos ); + if ( error ) + return error; + + head2[15] = (FT_Byte)( head[15] + 1 ); /* make it be different */ + + error = FT_Stream_Read( stream, (FT_Byte*)head2, 16 ); + if ( error ) + return error; + + allzeros = 1; + allmatch = 1; + for ( i = 0; i < 16; i++ ) + { + if ( head2[i] != 0 ) + allzeros = 0; + if ( head2[i] != head[i] ) + allmatch = 0; + } + if ( !allzeros && !allmatch ) + return FT_THROW( Unknown_File_Format ); + + /* If we have reached this point then it is probably a mac resource */ + /* file. Now, does it contain any interesting resources? */ + + (void)FT_STREAM_SKIP( 4 /* skip handle to next resource map */ + + 2 /* skip file resource number */ + + 2 ); /* skip attributes */ + + if ( FT_READ_SHORT( type_list ) ) + return error; + if ( type_list < 0 ) + return FT_THROW( Unknown_File_Format ); + + error = FT_Stream_Seek( stream, (FT_ULong)( map_pos + type_list ) ); + if ( error ) + return error; + + *map_offset = map_pos + type_list; + return FT_Err_Ok; + } + + + static int + ft_raccess_sort_ref_by_id( FT_RFork_Ref* a, + FT_RFork_Ref* b ) + { + if ( a->res_id < b->res_id ) + return -1; + else if ( a->res_id > b->res_id ) + return 1; + else + return 0; + } + + + FT_BASE_DEF( FT_Error ) + FT_Raccess_Get_DataOffsets( FT_Library library, + FT_Stream stream, + FT_Long map_offset, + FT_Long rdata_pos, + FT_Long tag, + FT_Bool sort_by_res_id, + FT_Long **offsets, + FT_Long *count ) + { + FT_Error error; + int i, j, cnt, subcnt; + FT_Long tag_internal, rpos; + FT_Memory memory = library->memory; + FT_Long temp; + FT_Long *offsets_internal = NULL; + FT_RFork_Ref *ref = NULL; + + + FT_TRACE3(( "\n" )); + error = FT_Stream_Seek( stream, (FT_ULong)map_offset ); + if ( error ) + return error; + + if ( FT_READ_SHORT( cnt ) ) + return error; + cnt++; + + /* `rpos' is a signed 16bit integer offset to resource records; the */ + /* size of a resource record is 12 bytes. The map header is 28 bytes, */ + /* and a type list needs 10 bytes or more. If we assume that the name */ + /* list is empty and we have only a single entry in the type list, */ + /* there can be at most */ + /* */ + /* (32768 - 28 - 10) / 12 = 2727 */ + /* */ + /* resources. */ + /* */ + /* A type list starts with a two-byte counter, followed by 10-byte */ + /* type records. Assuming that there are no resources, the number of */ + /* type records can be at most */ + /* */ + /* (32768 - 28 - 2) / 8 = 4079 */ + /* */ + if ( cnt > 4079 ) + return FT_THROW( Invalid_Table ); + + for ( i = 0; i < cnt; i++ ) + { + if ( FT_READ_LONG( tag_internal ) || + FT_READ_SHORT( subcnt ) || + FT_READ_SHORT( rpos ) ) + return error; + + FT_TRACE2(( "Resource tags: %c%c%c%c\n", + (char)( 0xFF & ( tag_internal >> 24 ) ), + (char)( 0xFF & ( tag_internal >> 16 ) ), + (char)( 0xFF & ( tag_internal >> 8 ) ), + (char)( 0xFF & ( tag_internal >> 0 ) ) )); + FT_TRACE3(( " : subcount=%d, suboffset=0x%04x\n", + subcnt, rpos )); + + if ( tag_internal == tag ) + { + *count = subcnt + 1; + rpos += map_offset; + + /* a zero count might be valid in the resource specification, */ + /* however, it is completely useless to us */ + if ( *count < 1 || *count > 2727 ) + return FT_THROW( Invalid_Table ); + + error = FT_Stream_Seek( stream, (FT_ULong)rpos ); + if ( error ) + return error; + + if ( FT_NEW_ARRAY( ref, *count ) ) + return error; + + for ( j = 0; j < *count; j++ ) + { + if ( FT_READ_SHORT( ref[j].res_id ) ) + goto Exit; + if ( FT_STREAM_SKIP( 2 ) ) /* resource name offset */ + goto Exit; + if ( FT_READ_LONG( temp ) ) /* attributes (8bit), offset (24bit) */ + goto Exit; + if ( FT_STREAM_SKIP( 4 ) ) /* mbz */ + goto Exit; + + /* + * According to Inside Macintosh: More Macintosh Toolbox, + * "Resource IDs" (1-46), there are some reserved IDs. + * However, FreeType2 is not a font synthesizer, no need + * to check the acceptable resource ID. + */ + if ( temp < 0 ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + ref[j].offset = temp & 0xFFFFFFL; + + FT_TRACE3(( " [%d]:" + " resource_id=0x%04x, offset=0x%08x\n", + j, (FT_UShort)ref[j].res_id, ref[j].offset )); + } + + if ( sort_by_res_id ) + { + ft_qsort( ref, + (size_t)*count, + sizeof ( FT_RFork_Ref ), + ( int(*)(const void*, + const void*) )ft_raccess_sort_ref_by_id ); + + FT_TRACE3(( " -- sort resources by their ids --\n" )); + + for ( j = 0; j < *count; j++ ) + FT_TRACE3(( " [%d]:" + " resource_id=0x%04x, offset=0x%08x\n", + j, ref[j].res_id, ref[j].offset )); + } + + if ( FT_NEW_ARRAY( offsets_internal, *count ) ) + goto Exit; + + /* XXX: duplicated reference ID, + * gap between reference IDs are acceptable? + * further investigation on Apple implementation is needed. + */ + for ( j = 0; j < *count; j++ ) + offsets_internal[j] = rdata_pos + ref[j].offset; + + *offsets = offsets_internal; + error = FT_Err_Ok; + + Exit: + FT_FREE( ref ); + return error; + } + } + + return FT_THROW( Cannot_Open_Resource ); + } + + +#ifdef FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** Guessing functions ****/ + /**** ****/ + /**** When you add a new guessing function, ****/ + /**** update FT_RACCESS_N_RULES in ftrfork.h. ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + raccess_guess_apple_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_apple_single( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_ufs_export( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_newvfs( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_darwin_hfsplus( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_vfat( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_cap( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_netatalk( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ); + + + CONST_FT_RFORK_RULE_ARRAY_BEGIN(ft_raccess_guess_table, + ft_raccess_guess_rec) + CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_double, apple_double) + CONST_FT_RFORK_RULE_ARRAY_ENTRY(apple_single, apple_single) + CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_ufs_export, darwin_ufs_export) + CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_newvfs, darwin_newvfs) + CONST_FT_RFORK_RULE_ARRAY_ENTRY(darwin_hfsplus, darwin_hfsplus) + CONST_FT_RFORK_RULE_ARRAY_ENTRY(vfat, vfat) + CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_cap, linux_cap) + CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_double, linux_double) + CONST_FT_RFORK_RULE_ARRAY_ENTRY(linux_netatalk, linux_netatalk) + CONST_FT_RFORK_RULE_ARRAY_END + + + /*************************************************************************/ + /**** ****/ + /**** Helper functions ****/ + /**** ****/ + /*************************************************************************/ + + static FT_Error + raccess_guess_apple_generic( FT_Library library, + FT_Stream stream, + char *base_file_name, + FT_Int32 magic, + FT_Long *result_offset ); + + static FT_Error + raccess_guess_linux_double_from_file_name( FT_Library library, + char * file_name, + FT_Long *result_offset ); + + static char * + raccess_make_file_name( FT_Memory memory, + const char *original_name, + const char *insertion ); + + FT_BASE_DEF( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char* base_name, + char **new_names, + FT_Long *offsets, + FT_Error *errors ) + { + FT_Int i; + + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + new_names[i] = NULL; + if ( NULL != stream ) + errors[i] = FT_Stream_Seek( stream, 0 ); + else + errors[i] = FT_Err_Ok; + + if ( errors[i] ) + continue; + + errors[i] = (FT_RACCESS_GUESS_TABLE_GET[i].func)( library, + stream, base_name, + &(new_names[i]), + &(offsets[i]) ); + } + + return; + } + + +#if defined( FT_CONFIG_OPTION_MAC_FONTS ) && !defined( FT_MACINTOSH ) + static FT_RFork_Rule + raccess_get_rule_type_from_rule_index( FT_Library library, + FT_UInt rule_index ) + { + FT_UNUSED( library ); + + if ( rule_index >= FT_RACCESS_N_RULES ) + return FT_RFork_Rule_invalid; + + return FT_RACCESS_GUESS_TABLE_GET[rule_index].type; + } + + + /* + * For this function, refer ftbase.h. + */ + FT_LOCAL_DEF( FT_Bool ) + ft_raccess_rule_by_darwin_vfs( FT_Library library, + FT_UInt rule_index ) + { + switch( raccess_get_rule_type_from_rule_index( library, rule_index ) ) + { + case FT_RFork_Rule_darwin_newvfs: + case FT_RFork_Rule_darwin_hfsplus: + return TRUE; + + default: + return FALSE; + } + } +#endif + + + static FT_Error + raccess_guess_apple_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + FT_Int32 magic = ( 0x00 << 24 ) | + ( 0x05 << 16 ) | + ( 0x16 << 8 ) | + 0x07; + + + *result_file_name = NULL; + if ( NULL == stream ) + return FT_THROW( Cannot_Open_Stream ); + + return raccess_guess_apple_generic( library, stream, base_file_name, + magic, result_offset ); + } + + + static FT_Error + raccess_guess_apple_single( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + FT_Int32 magic = ( 0x00 << 24 ) | + ( 0x05 << 16 ) | + ( 0x16 << 8 ) | + 0x00; + + + *result_file_name = NULL; + if ( NULL == stream ) + return FT_THROW( Cannot_Open_Stream ); + + return raccess_guess_apple_generic( library, stream, base_file_name, + magic, result_offset ); + } + + + static FT_Error + raccess_guess_darwin_ufs_export( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + newpath = raccess_make_file_name( memory, base_file_name, "._" ); + if ( !newpath ) + return FT_THROW( Out_Of_Memory ); + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_darwin_hfsplus( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + /* + Only meaningful on systems with hfs+ drivers (or Macs). + */ + FT_Error error; + char* newpath = NULL; + FT_Memory memory; + FT_Long base_file_len = (FT_Long)ft_strlen( base_file_name ); + + FT_UNUSED( stream ); + + + memory = library->memory; + + if ( base_file_len + 6 > FT_INT_MAX ) + return FT_THROW( Array_Too_Large ); + + if ( FT_ALLOC( newpath, base_file_len + 6 ) ) + return error; + + FT_MEM_COPY( newpath, base_file_name, base_file_len ); + FT_MEM_COPY( newpath + base_file_len, "/rsrc", 6 ); + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_darwin_newvfs( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + /* + Only meaningful on systems with Mac OS X (> 10.1). + */ + FT_Error error; + char* newpath = NULL; + FT_Memory memory; + FT_Long base_file_len = (FT_Long)ft_strlen( base_file_name ); + + FT_UNUSED( stream ); + + + memory = library->memory; + + if ( base_file_len + 18 > FT_INT_MAX ) + return FT_THROW( Array_Too_Large ); + + if ( FT_ALLOC( newpath, base_file_len + 18 ) ) + return error; + + FT_MEM_COPY( newpath, base_file_name, base_file_len ); + FT_MEM_COPY( newpath + base_file_len, "/..namedfork/rsrc", 18 ); + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_vfat( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, + "resource.frk/" ); + if ( !newpath ) + return FT_THROW( Out_Of_Memory ); + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_linux_cap( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, ".resource/" ); + if ( !newpath ) + return FT_THROW( Out_Of_Memory ); + + *result_file_name = newpath; + *result_offset = 0; + + return FT_Err_Ok; + } + + + static FT_Error + raccess_guess_linux_double( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, "%" ); + if ( !newpath ) + return FT_THROW( Out_Of_Memory ); + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_linux_netatalk( FT_Library library, + FT_Stream stream, + char *base_file_name, + char **result_file_name, + FT_Long *result_offset ) + { + char* newpath; + FT_Error error; + FT_Memory memory; + + FT_UNUSED( stream ); + + + memory = library->memory; + + newpath = raccess_make_file_name( memory, base_file_name, + ".AppleDouble/" ); + if ( !newpath ) + return FT_THROW( Out_Of_Memory ); + + error = raccess_guess_linux_double_from_file_name( library, newpath, + result_offset ); + if ( !error ) + *result_file_name = newpath; + else + FT_FREE( newpath ); + + return error; + } + + + static FT_Error + raccess_guess_apple_generic( FT_Library library, + FT_Stream stream, + char *base_file_name, + FT_Int32 magic, + FT_Long *result_offset ) + { + FT_Int32 magic_from_stream; + FT_Error error; + FT_Int32 version_number = 0; + FT_UShort n_of_entries; + + int i; + FT_Int32 entry_id, entry_offset, entry_length = 0; + + const FT_Int32 resource_fork_entry_id = 0x2; + + FT_UNUSED( library ); + FT_UNUSED( base_file_name ); + FT_UNUSED( version_number ); + FT_UNUSED( entry_length ); + + + if ( FT_READ_LONG( magic_from_stream ) ) + return error; + if ( magic_from_stream != magic ) + return FT_THROW( Unknown_File_Format ); + + if ( FT_READ_LONG( version_number ) ) + return error; + + /* filler */ + error = FT_Stream_Skip( stream, 16 ); + if ( error ) + return error; + + if ( FT_READ_USHORT( n_of_entries ) ) + return error; + if ( n_of_entries == 0 ) + return FT_THROW( Unknown_File_Format ); + + for ( i = 0; i < n_of_entries; i++ ) + { + if ( FT_READ_LONG( entry_id ) ) + return error; + if ( entry_id == resource_fork_entry_id ) + { + if ( FT_READ_LONG( entry_offset ) || + FT_READ_LONG( entry_length ) ) + continue; + *result_offset = entry_offset; + + return FT_Err_Ok; + } + else + { + error = FT_Stream_Skip( stream, 4 + 4 ); /* offset + length */ + if ( error ) + return error; + } + } + + return FT_THROW( Unknown_File_Format ); + } + + + static FT_Error + raccess_guess_linux_double_from_file_name( FT_Library library, + char *file_name, + FT_Long *result_offset ) + { + FT_Open_Args args2; + FT_Stream stream2; + char * nouse = NULL; + FT_Error error; + + + args2.flags = FT_OPEN_PATHNAME; + args2.pathname = file_name; + error = FT_Stream_New( library, &args2, &stream2 ); + if ( error ) + return error; + + error = raccess_guess_apple_double( library, stream2, file_name, + &nouse, result_offset ); + + FT_Stream_Free( stream2, 0 ); + + return error; + } + + + static char* + raccess_make_file_name( FT_Memory memory, + const char *original_name, + const char *insertion ) + { + char* new_name = NULL; + const char* tmp; + const char* slash; + size_t new_length; + FT_Error error = FT_Err_Ok; + + FT_UNUSED( error ); + + + new_length = ft_strlen( original_name ) + ft_strlen( insertion ); + if ( FT_ALLOC( new_name, new_length + 1 ) ) + return NULL; + + tmp = ft_strrchr( original_name, '/' ); + if ( tmp ) + { + ft_strncpy( new_name, + original_name, + (size_t)( tmp - original_name + 1 ) ); + new_name[tmp - original_name + 1] = '\0'; + slash = tmp + 1; + } + else + { + slash = original_name; + new_name[0] = '\0'; + } + + ft_strcat( new_name, insertion ); + ft_strcat( new_name, slash ); + + return new_name; + } + + +#else /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + + /*************************************************************************/ + /* Dummy function; just sets errors */ + /*************************************************************************/ + + FT_BASE_DEF( void ) + FT_Raccess_Guess( FT_Library library, + FT_Stream stream, + char *base_name, + char **new_names, + FT_Long *offsets, + FT_Error *errors ) + { + FT_Int i; + + FT_UNUSED( library ); + FT_UNUSED( stream ); + FT_UNUSED( base_name ); + + + for ( i = 0; i < FT_RACCESS_N_RULES; i++ ) + { + new_names[i] = NULL; + offsets[i] = 0; + errors[i] = FT_ERR( Unimplemented_Feature ); + } + } + + +#endif /* !FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK */ + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftsnames.c b/vendor/FreeType2/src/base/ftsnames.c new file mode 100644 index 0000000..90ea1e2 --- /dev/null +++ b/vendor/FreeType2/src/base/ftsnames.c @@ -0,0 +1,148 @@ +/***************************************************************************/ +/* */ +/* ftsnames.c */ +/* */ +/* Simple interface to access SFNT name tables (which are used */ +/* to hold font names, copyright info, notices, etc.) (body). */ +/* */ +/* This is _not_ used to retrieve glyph names! */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H + +#include FT_SFNT_NAMES_H +#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_INTERNAL_STREAM_H + + +#ifdef TT_CONFIG_OPTION_SFNT_NAMES + + + /* documentation is in ftsnames.h */ + + FT_EXPORT_DEF( FT_UInt ) + FT_Get_Sfnt_Name_Count( FT_Face face ) + { + return ( face && FT_IS_SFNT( face ) ) ? ((TT_Face)face)->num_names : 0; + } + + + /* documentation is in ftsnames.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Sfnt_Name( FT_Face face, + FT_UInt idx, + FT_SfntName *aname ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + + + if ( aname && face && FT_IS_SFNT( face ) ) + { + TT_Face ttface = (TT_Face)face; + + + if ( idx < (FT_UInt)ttface->num_names ) + { + TT_Name entry = ttface->name_table.names + idx; + + + /* load name on demand */ + if ( entry->stringLength > 0 && !entry->string ) + { + FT_Memory memory = face->memory; + FT_Stream stream = face->stream; + + + if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) || + FT_STREAM_SEEK( entry->stringOffset ) || + FT_STREAM_READ( entry->string, entry->stringLength ) ) + { + FT_FREE( entry->string ); + entry->stringLength = 0; + } + } + + aname->platform_id = entry->platformID; + aname->encoding_id = entry->encodingID; + aname->language_id = entry->languageID; + aname->name_id = entry->nameID; + aname->string = (FT_Byte*)entry->string; + aname->string_len = entry->stringLength; + + error = FT_Err_Ok; + } + } + + return error; + } + + + /* documentation is in ftsnames.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_Sfnt_LangTag( FT_Face face, + FT_UInt langID, + FT_SfntLangTag *alangTag ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + + + if ( alangTag && face && FT_IS_SFNT( face ) ) + { + TT_Face ttface = (TT_Face)face; + + + if ( ttface->name_table.format != 1 ) + return FT_THROW( Invalid_Table ); + + if ( langID > 0x8000U && + langID - 0x8000U < ttface->name_table.numLangTagRecords ) + { + TT_LangTag entry = ttface->name_table.langTags + + ( langID - 0x8000U ); + + + /* load name on demand */ + if ( entry->stringLength > 0 && !entry->string ) + { + FT_Memory memory = face->memory; + FT_Stream stream = face->stream; + + + if ( FT_NEW_ARRAY ( entry->string, entry->stringLength ) || + FT_STREAM_SEEK( entry->stringOffset ) || + FT_STREAM_READ( entry->string, entry->stringLength ) ) + { + FT_FREE( entry->string ); + entry->stringLength = 0; + } + } + + alangTag->string = (FT_Byte*)entry->string; + alangTag->string_len = entry->stringLength; + + error = FT_Err_Ok; + } + } + + return error; + } + + +#endif /* TT_CONFIG_OPTION_SFNT_NAMES */ + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftstream.c b/vendor/FreeType2/src/base/ftstream.c new file mode 100644 index 0000000..18df7dc --- /dev/null +++ b/vendor/FreeType2/src/base/ftstream.c @@ -0,0 +1,860 @@ +/***************************************************************************/ +/* */ +/* ftstream.c */ +/* */ +/* I/O stream support (body). */ +/* */ +/* Copyright 2000-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_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_stream + + + FT_BASE_DEF( void ) + FT_Stream_OpenMemory( FT_Stream stream, + const FT_Byte* base, + FT_ULong size ) + { + stream->base = (FT_Byte*) base; + stream->size = size; + stream->pos = 0; + stream->cursor = NULL; + stream->read = NULL; + stream->close = NULL; + } + + + FT_BASE_DEF( void ) + FT_Stream_Close( FT_Stream stream ) + { + if ( stream && stream->close ) + stream->close( stream ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Seek( FT_Stream stream, + FT_ULong pos ) + { + FT_Error error = FT_Err_Ok; + + + if ( stream->read ) + { + if ( stream->read( stream, pos, 0, 0 ) ) + { + FT_ERROR(( "FT_Stream_Seek:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + error = FT_THROW( Invalid_Stream_Operation ); + } + } + /* note that seeking to the first position after the file is valid */ + else if ( pos > stream->size ) + { + FT_ERROR(( "FT_Stream_Seek:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + error = FT_THROW( Invalid_Stream_Operation ); + } + + if ( !error ) + stream->pos = pos; + + return error; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Skip( FT_Stream stream, + FT_Long distance ) + { + if ( distance < 0 ) + return FT_THROW( Invalid_Stream_Operation ); + + return FT_Stream_Seek( stream, stream->pos + (FT_ULong)distance ); + } + + + FT_BASE_DEF( FT_ULong ) + FT_Stream_Pos( FT_Stream stream ) + { + return stream->pos; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_Read( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ) + { + return FT_Stream_ReadAt( stream, stream->pos, buffer, count ); + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_ReadAt( FT_Stream stream, + FT_ULong pos, + FT_Byte* buffer, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + FT_ULong read_bytes; + + + if ( pos >= stream->size ) + { + FT_ERROR(( "FT_Stream_ReadAt:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + pos, stream->size )); + + return FT_THROW( Invalid_Stream_Operation ); + } + + if ( stream->read ) + read_bytes = stream->read( stream, pos, buffer, count ); + else + { + read_bytes = stream->size - pos; + if ( read_bytes > count ) + read_bytes = count; + + FT_MEM_COPY( buffer, stream->base + pos, read_bytes ); + } + + stream->pos = pos + read_bytes; + + if ( read_bytes < count ) + { + FT_ERROR(( "FT_Stream_ReadAt:" + " invalid read; expected %lu bytes, got %lu\n", + count, read_bytes )); + + error = FT_THROW( Invalid_Stream_Operation ); + } + + return error; + } + + + FT_BASE_DEF( FT_ULong ) + FT_Stream_TryRead( FT_Stream stream, + FT_Byte* buffer, + FT_ULong count ) + { + FT_ULong read_bytes = 0; + + + if ( stream->pos >= stream->size ) + goto Exit; + + if ( stream->read ) + read_bytes = stream->read( stream, stream->pos, buffer, count ); + else + { + read_bytes = stream->size - stream->pos; + if ( read_bytes > count ) + read_bytes = count; + + FT_MEM_COPY( buffer, stream->base + stream->pos, read_bytes ); + } + + stream->pos += read_bytes; + + Exit: + return read_bytes; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_ExtractFrame( FT_Stream stream, + FT_ULong count, + FT_Byte** pbytes ) + { + FT_Error error; + + + error = FT_Stream_EnterFrame( stream, count ); + if ( !error ) + { + *pbytes = (FT_Byte*)stream->cursor; + + /* equivalent to FT_Stream_ExitFrame(), with no memory block release */ + stream->cursor = NULL; + stream->limit = NULL; + } + + return error; + } + + + FT_BASE_DEF( void ) + FT_Stream_ReleaseFrame( FT_Stream stream, + FT_Byte** pbytes ) + { + if ( stream && stream->read ) + { + FT_Memory memory = stream->memory; + +#ifdef FT_DEBUG_MEMORY + ft_mem_free( memory, *pbytes ); + *pbytes = NULL; +#else + FT_FREE( *pbytes ); +#endif + } + *pbytes = NULL; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_EnterFrame( FT_Stream stream, + FT_ULong count ) + { + FT_Error error = FT_Err_Ok; + FT_ULong read_bytes; + + + /* check for nested frame access */ + FT_ASSERT( stream && stream->cursor == 0 ); + + if ( stream->read ) + { + /* allocate the frame in memory */ + FT_Memory memory = stream->memory; + + + /* simple sanity check */ + if ( count > stream->size ) + { + FT_ERROR(( "FT_Stream_EnterFrame:" + " frame size (%lu) larger than stream size (%lu)\n", + count, stream->size )); + + error = FT_THROW( Invalid_Stream_Operation ); + goto Exit; + } + +#ifdef FT_DEBUG_MEMORY + /* assume _ft_debug_file and _ft_debug_lineno are already set */ + stream->base = (unsigned char*)ft_mem_qalloc( memory, + (FT_Long)count, + &error ); + if ( error ) + goto Exit; +#else + if ( FT_QALLOC( stream->base, count ) ) + goto Exit; +#endif + /* read it */ + read_bytes = stream->read( stream, stream->pos, + stream->base, count ); + if ( read_bytes < count ) + { + FT_ERROR(( "FT_Stream_EnterFrame:" + " invalid read; expected %lu bytes, got %lu\n", + count, read_bytes )); + + FT_FREE( stream->base ); + error = FT_THROW( Invalid_Stream_Operation ); + } + stream->cursor = stream->base; + stream->limit = stream->cursor + count; + stream->pos += read_bytes; + } + else + { + /* check current and new position */ + if ( stream->pos >= stream->size || + stream->size - stream->pos < count ) + { + FT_ERROR(( "FT_Stream_EnterFrame:" + " invalid i/o; pos = 0x%lx, count = %lu, size = 0x%lx\n", + stream->pos, count, stream->size )); + + error = FT_THROW( Invalid_Stream_Operation ); + goto Exit; + } + + /* set cursor */ + stream->cursor = stream->base + stream->pos; + stream->limit = stream->cursor + count; + stream->pos += count; + } + + Exit: + return error; + } + + + FT_BASE_DEF( void ) + FT_Stream_ExitFrame( FT_Stream stream ) + { + /* IMPORTANT: The assertion stream->cursor != 0 was removed, given */ + /* that it is possible to access a frame of length 0 in */ + /* some weird fonts (usually, when accessing an array of */ + /* 0 records, like in some strange kern tables). */ + /* */ + /* In this case, the loader code handles the 0-length table */ + /* gracefully; however, stream.cursor is really set to 0 by the */ + /* FT_Stream_EnterFrame() call, and this is not an error. */ + /* */ + FT_ASSERT( stream ); + + if ( stream->read ) + { + FT_Memory memory = stream->memory; + +#ifdef FT_DEBUG_MEMORY + ft_mem_free( memory, stream->base ); + stream->base = NULL; +#else + FT_FREE( stream->base ); +#endif + } + stream->cursor = NULL; + stream->limit = NULL; + } + + + FT_BASE_DEF( FT_Char ) + FT_Stream_GetChar( FT_Stream stream ) + { + FT_Char result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + if ( stream->cursor < stream->limit ) + result = (FT_Char)*stream->cursor++; + + return result; + } + + + FT_BASE_DEF( FT_UShort ) + FT_Stream_GetUShort( FT_Stream stream ) + { + FT_Byte* p; + FT_UShort result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 1 < stream->limit ) + result = FT_NEXT_USHORT( p ); + stream->cursor = p; + + return result; + } + + + FT_BASE_DEF( FT_UShort ) + FT_Stream_GetUShortLE( FT_Stream stream ) + { + FT_Byte* p; + FT_UShort result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 1 < stream->limit ) + result = FT_NEXT_USHORT_LE( p ); + stream->cursor = p; + + return result; + } + + + FT_BASE_DEF( FT_ULong ) + FT_Stream_GetUOffset( FT_Stream stream ) + { + FT_Byte* p; + FT_ULong result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 2 < stream->limit ) + result = FT_NEXT_UOFF3( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_ULong ) + FT_Stream_GetULong( FT_Stream stream ) + { + FT_Byte* p; + FT_ULong result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 3 < stream->limit ) + result = FT_NEXT_ULONG( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_ULong ) + FT_Stream_GetULongLE( FT_Stream stream ) + { + FT_Byte* p; + FT_ULong result; + + + FT_ASSERT( stream && stream->cursor ); + + result = 0; + p = stream->cursor; + if ( p + 3 < stream->limit ) + result = FT_NEXT_ULONG_LE( p ); + stream->cursor = p; + return result; + } + + + FT_BASE_DEF( FT_Char ) + FT_Stream_ReadChar( FT_Stream stream, + FT_Error* error ) + { + FT_Byte result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, &result, 1L ) != 1L ) + goto Fail; + } + else + { + if ( stream->pos < stream->size ) + result = stream->base[stream->pos]; + else + goto Fail; + } + stream->pos++; + + return (FT_Char)result; + + Fail: + *error = FT_THROW( Invalid_Stream_Operation ); + FT_ERROR(( "FT_Stream_ReadChar:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_UShort ) + FT_Stream_ReadUShort( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[2]; + FT_Byte* p = 0; + FT_UShort result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 1 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 2L ) != 2L ) + goto Fail; + + p = reads; + } + else + p = stream->base + stream->pos; + + if ( p ) + result = FT_NEXT_USHORT( p ); + } + else + goto Fail; + + stream->pos += 2; + + return result; + + Fail: + *error = FT_THROW( Invalid_Stream_Operation ); + FT_ERROR(( "FT_Stream_ReadUShort:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_UShort ) + FT_Stream_ReadUShortLE( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[2]; + FT_Byte* p = 0; + FT_UShort result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 1 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 2L ) != 2L ) + goto Fail; + + p = reads; + } + else + p = stream->base + stream->pos; + + if ( p ) + result = FT_NEXT_USHORT_LE( p ); + } + else + goto Fail; + + stream->pos += 2; + + return result; + + Fail: + *error = FT_THROW( Invalid_Stream_Operation ); + FT_ERROR(( "FT_Stream_ReadUShortLE:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_ULong ) + FT_Stream_ReadUOffset( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[3]; + FT_Byte* p = 0; + FT_ULong result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 2 < stream->size ) + { + if ( stream->read ) + { + if (stream->read( stream, stream->pos, reads, 3L ) != 3L ) + goto Fail; + + p = reads; + } + else + p = stream->base + stream->pos; + + if ( p ) + result = FT_NEXT_UOFF3( p ); + } + else + goto Fail; + + stream->pos += 3; + + return result; + + Fail: + *error = FT_THROW( Invalid_Stream_Operation ); + FT_ERROR(( "FT_Stream_ReadUOffset:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_ULong ) + FT_Stream_ReadULong( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[4]; + FT_Byte* p = 0; + FT_ULong result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 3 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 4L ) != 4L ) + goto Fail; + + p = reads; + } + else + p = stream->base + stream->pos; + + if ( p ) + result = FT_NEXT_ULONG( p ); + } + else + goto Fail; + + stream->pos += 4; + + return result; + + Fail: + *error = FT_THROW( Invalid_Stream_Operation ); + FT_ERROR(( "FT_Stream_ReadULong:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_ULong ) + FT_Stream_ReadULongLE( FT_Stream stream, + FT_Error* error ) + { + FT_Byte reads[4]; + FT_Byte* p = 0; + FT_ULong result = 0; + + + FT_ASSERT( stream ); + + *error = FT_Err_Ok; + + if ( stream->pos + 3 < stream->size ) + { + if ( stream->read ) + { + if ( stream->read( stream, stream->pos, reads, 4L ) != 4L ) + goto Fail; + + p = reads; + } + else + p = stream->base + stream->pos; + + if ( p ) + result = FT_NEXT_ULONG_LE( p ); + } + else + goto Fail; + + stream->pos += 4; + + return result; + + Fail: + *error = FT_THROW( Invalid_Stream_Operation ); + FT_ERROR(( "FT_Stream_ReadULongLE:" + " invalid i/o; pos = 0x%lx, size = 0x%lx\n", + stream->pos, stream->size )); + + return 0; + } + + + FT_BASE_DEF( FT_Error ) + FT_Stream_ReadFields( FT_Stream stream, + const FT_Frame_Field* fields, + void* structure ) + { + FT_Error error; + FT_Bool frame_accessed = 0; + FT_Byte* cursor; + + + if ( !fields ) + return FT_THROW( Invalid_Argument ); + + if ( !stream ) + return FT_THROW( Invalid_Stream_Handle ); + + cursor = stream->cursor; + + error = FT_Err_Ok; + do + { + FT_ULong value; + FT_Int sign_shift; + FT_Byte* p; + + + switch ( fields->value ) + { + case ft_frame_start: /* access a new frame */ + error = FT_Stream_EnterFrame( stream, fields->offset ); + if ( error ) + goto Exit; + + frame_accessed = 1; + cursor = stream->cursor; + fields++; + continue; /* loop! */ + + case ft_frame_bytes: /* read a byte sequence */ + case ft_frame_skip: /* skip some bytes */ + { + FT_UInt len = fields->size; + + + if ( cursor + len > stream->limit ) + { + error = FT_THROW( Invalid_Stream_Operation ); + goto Exit; + } + + if ( fields->value == ft_frame_bytes ) + { + p = (FT_Byte*)structure + fields->offset; + FT_MEM_COPY( p, cursor, len ); + } + cursor += len; + fields++; + continue; + } + + case ft_frame_byte: + case ft_frame_schar: /* read a single byte */ + value = FT_NEXT_BYTE( cursor ); + sign_shift = 24; + break; + + case ft_frame_short_be: + case ft_frame_ushort_be: /* read a 2-byte big-endian short */ + value = FT_NEXT_USHORT( cursor ); + sign_shift = 16; + break; + + case ft_frame_short_le: + case ft_frame_ushort_le: /* read a 2-byte little-endian short */ + value = FT_NEXT_USHORT_LE( cursor ); + sign_shift = 16; + break; + + case ft_frame_long_be: + case ft_frame_ulong_be: /* read a 4-byte big-endian long */ + value = FT_NEXT_ULONG( cursor ); + sign_shift = 0; + break; + + case ft_frame_long_le: + case ft_frame_ulong_le: /* read a 4-byte little-endian long */ + value = FT_NEXT_ULONG_LE( cursor ); + sign_shift = 0; + break; + + case ft_frame_off3_be: + case ft_frame_uoff3_be: /* read a 3-byte big-endian long */ + value = FT_NEXT_UOFF3( cursor ); + sign_shift = 8; + break; + + case ft_frame_off3_le: + case ft_frame_uoff3_le: /* read a 3-byte little-endian long */ + value = FT_NEXT_UOFF3_LE( cursor ); + sign_shift = 8; + break; + + default: + /* otherwise, exit the loop */ + stream->cursor = cursor; + goto Exit; + } + + /* now, compute the signed value is necessary */ + if ( fields->value & FT_FRAME_OP_SIGNED ) + value = (FT_ULong)( (FT_Int32)( value << sign_shift ) >> sign_shift ); + + /* finally, store the value in the object */ + + p = (FT_Byte*)structure + fields->offset; + switch ( fields->size ) + { + case ( 8 / FT_CHAR_BIT ): + *(FT_Byte*)p = (FT_Byte)value; + break; + + case ( 16 / FT_CHAR_BIT ): + *(FT_UShort*)p = (FT_UShort)value; + break; + + case ( 32 / FT_CHAR_BIT ): + *(FT_UInt32*)p = (FT_UInt32)value; + break; + + default: /* for 64-bit systems */ + *(FT_ULong*)p = (FT_ULong)value; + } + + /* go to next field */ + fields++; + } + while ( 1 ); + + Exit: + /* close the frame if it was opened by this read */ + if ( frame_accessed ) + FT_Stream_ExitFrame( stream ); + + return error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftstroke.c b/vendor/FreeType2/src/base/ftstroke.c new file mode 100644 index 0000000..6ae1819 --- /dev/null +++ b/vendor/FreeType2/src/base/ftstroke.c @@ -0,0 +1,2469 @@ +/***************************************************************************/ +/* */ +/* ftstroke.c */ +/* */ +/* FreeType path stroker (body). */ +/* */ +/* Copyright 2002-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_STROKER_H +#include FT_TRIGONOMETRY_H +#include FT_OUTLINE_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H + +#include "basepic.h" + + + /* declare an extern to access `ft_outline_glyph_class' globally */ + /* allocated in `ftglyph.c', and use the FT_OUTLINE_GLYPH_CLASS_GET */ + /* macro to access it when FT_CONFIG_OPTION_PIC is defined */ +#ifndef FT_CONFIG_OPTION_PIC + FT_CALLBACK_TABLE const FT_Glyph_Class ft_outline_glyph_class; +#endif + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_StrokerBorder ) + FT_Outline_GetInsideBorder( FT_Outline* outline ) + { + FT_Orientation o = FT_Outline_Get_Orientation( outline ); + + + return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_RIGHT + : FT_STROKER_BORDER_LEFT; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_StrokerBorder ) + FT_Outline_GetOutsideBorder( FT_Outline* outline ) + { + FT_Orientation o = FT_Outline_Get_Orientation( outline ); + + + return o == FT_ORIENTATION_TRUETYPE ? FT_STROKER_BORDER_LEFT + : FT_STROKER_BORDER_RIGHT; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BEZIER COMPUTATIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define FT_SMALL_CONIC_THRESHOLD ( FT_ANGLE_PI / 6 ) +#define FT_SMALL_CUBIC_THRESHOLD ( FT_ANGLE_PI / 8 ) + +#define FT_EPSILON 2 + +#define FT_IS_SMALL( x ) ( (x) > -FT_EPSILON && (x) < FT_EPSILON ) + + + static FT_Pos + ft_pos_abs( FT_Pos x ) + { + return x >= 0 ? x : -x; + } + + + static void + ft_conic_split( FT_Vector* base ) + { + FT_Pos a, b; + + + base[4].x = base[2].x; + b = base[1].x; + a = base[3].x = ( base[2].x + b ) / 2; + b = base[1].x = ( base[0].x + b ) / 2; + base[2].x = ( a + b ) / 2; + + base[4].y = base[2].y; + b = base[1].y; + a = base[3].y = ( base[2].y + b ) / 2; + b = base[1].y = ( base[0].y + b ) / 2; + base[2].y = ( a + b ) / 2; + } + + + static FT_Bool + ft_conic_is_small_enough( FT_Vector* base, + FT_Angle *angle_in, + FT_Angle *angle_out ) + { + FT_Vector d1, d2; + FT_Angle theta; + FT_Int close1, close2; + + + d1.x = base[1].x - base[2].x; + d1.y = base[1].y - base[2].y; + d2.x = base[0].x - base[1].x; + d2.y = base[0].y - base[1].y; + + close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y ); + close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y ); + + if ( close1 ) + { + if ( close2 ) + { + /* basically a point; */ + /* do nothing to retain original direction */ + } + else + { + *angle_in = + *angle_out = FT_Atan2( d2.x, d2.y ); + } + } + else /* !close1 */ + { + if ( close2 ) + { + *angle_in = + *angle_out = FT_Atan2( d1.x, d1.y ); + } + else + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_out = FT_Atan2( d2.x, d2.y ); + } + } + + theta = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_out ) ); + + return FT_BOOL( theta < FT_SMALL_CONIC_THRESHOLD ); + } + + + static void + ft_cubic_split( FT_Vector* base ) + { + FT_Pos a, b, c, d; + + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = ( base[0].x + c ) / 2; + base[5].x = b = ( base[3].x + d ) / 2; + c = ( c + d ) / 2; + base[2].x = a = ( a + c ) / 2; + base[4].x = b = ( b + c ) / 2; + base[3].x = ( a + b ) / 2; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = ( base[0].y + c ) / 2; + base[5].y = b = ( base[3].y + d ) / 2; + c = ( c + d ) / 2; + base[2].y = a = ( a + c ) / 2; + base[4].y = b = ( b + c ) / 2; + base[3].y = ( a + b ) / 2; + } + + + /* Return the average of `angle1' and `angle2'. */ + /* This gives correct result even if `angle1' and `angle2' */ + /* have opposite signs. */ + static FT_Angle + ft_angle_mean( FT_Angle angle1, + FT_Angle angle2 ) + { + return angle1 + FT_Angle_Diff( angle1, angle2 ) / 2; + } + + + static FT_Bool + ft_cubic_is_small_enough( FT_Vector* base, + FT_Angle *angle_in, + FT_Angle *angle_mid, + FT_Angle *angle_out ) + { + FT_Vector d1, d2, d3; + FT_Angle theta1, theta2; + FT_Int close1, close2, close3; + + + d1.x = base[2].x - base[3].x; + d1.y = base[2].y - base[3].y; + d2.x = base[1].x - base[2].x; + d2.y = base[1].y - base[2].y; + d3.x = base[0].x - base[1].x; + d3.y = base[0].y - base[1].y; + + close1 = FT_IS_SMALL( d1.x ) && FT_IS_SMALL( d1.y ); + close2 = FT_IS_SMALL( d2.x ) && FT_IS_SMALL( d2.y ); + close3 = FT_IS_SMALL( d3.x ) && FT_IS_SMALL( d3.y ); + + if ( close1 ) + { + if ( close2 ) + { + if ( close3 ) + { + /* basically a point; */ + /* do nothing to retain original direction */ + } + else /* !close3 */ + { + *angle_in = + *angle_mid = + *angle_out = FT_Atan2( d3.x, d3.y ); + } + } + else /* !close2 */ + { + if ( close3 ) + { + *angle_in = + *angle_mid = + *angle_out = FT_Atan2( d2.x, d2.y ); + } + else /* !close3 */ + { + *angle_in = + *angle_mid = FT_Atan2( d2.x, d2.y ); + *angle_out = FT_Atan2( d3.x, d3.y ); + } + } + } + else /* !close1 */ + { + if ( close2 ) + { + if ( close3 ) + { + *angle_in = + *angle_mid = + *angle_out = FT_Atan2( d1.x, d1.y ); + } + else /* !close3 */ + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_out = FT_Atan2( d3.x, d3.y ); + *angle_mid = ft_angle_mean( *angle_in, *angle_out ); + } + } + else /* !close2 */ + { + if ( close3 ) + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_mid = + *angle_out = FT_Atan2( d2.x, d2.y ); + } + else /* !close3 */ + { + *angle_in = FT_Atan2( d1.x, d1.y ); + *angle_mid = FT_Atan2( d2.x, d2.y ); + *angle_out = FT_Atan2( d3.x, d3.y ); + } + } + } + + theta1 = ft_pos_abs( FT_Angle_Diff( *angle_in, *angle_mid ) ); + theta2 = ft_pos_abs( FT_Angle_Diff( *angle_mid, *angle_out ) ); + + return FT_BOOL( theta1 < FT_SMALL_CUBIC_THRESHOLD && + theta2 < FT_SMALL_CUBIC_THRESHOLD ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STROKE BORDERS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef enum FT_StrokeTags_ + { + FT_STROKE_TAG_ON = 1, /* on-curve point */ + FT_STROKE_TAG_CUBIC = 2, /* cubic off-point */ + FT_STROKE_TAG_BEGIN = 4, /* sub-path start */ + FT_STROKE_TAG_END = 8 /* sub-path end */ + + } FT_StrokeTags; + +#define FT_STROKE_TAG_BEGIN_END ( FT_STROKE_TAG_BEGIN | FT_STROKE_TAG_END ) + + typedef struct FT_StrokeBorderRec_ + { + FT_UInt num_points; + FT_UInt max_points; + FT_Vector* points; + FT_Byte* tags; + FT_Bool movable; /* TRUE for ends of lineto borders */ + FT_Int start; /* index of current sub-path start point */ + FT_Memory memory; + FT_Bool valid; + + } FT_StrokeBorderRec, *FT_StrokeBorder; + + + static FT_Error + ft_stroke_border_grow( FT_StrokeBorder border, + FT_UInt new_points ) + { + FT_UInt old_max = border->max_points; + FT_UInt new_max = border->num_points + new_points; + FT_Error error = FT_Err_Ok; + + + if ( new_max > old_max ) + { + FT_UInt cur_max = old_max; + FT_Memory memory = border->memory; + + + while ( cur_max < new_max ) + cur_max += ( cur_max >> 1 ) + 16; + + if ( FT_RENEW_ARRAY( border->points, old_max, cur_max ) || + FT_RENEW_ARRAY( border->tags, old_max, cur_max ) ) + goto Exit; + + border->max_points = cur_max; + } + + Exit: + return error; + } + + + static void + ft_stroke_border_close( FT_StrokeBorder border, + FT_Bool reverse ) + { + FT_UInt start = (FT_UInt)border->start; + FT_UInt count = border->num_points; + + + FT_ASSERT( border->start >= 0 ); + + /* don't record empty paths! */ + if ( count <= start + 1U ) + border->num_points = start; + else + { + /* copy the last point to the start of this sub-path, since */ + /* it contains the `adjusted' starting coordinates */ + border->num_points = --count; + border->points[start] = border->points[count]; + + if ( reverse ) + { + /* reverse the points */ + { + FT_Vector* vec1 = border->points + start + 1; + FT_Vector* vec2 = border->points + count - 1; + + + for ( ; vec1 < vec2; vec1++, vec2-- ) + { + FT_Vector tmp; + + + tmp = *vec1; + *vec1 = *vec2; + *vec2 = tmp; + } + } + + /* then the tags */ + { + FT_Byte* tag1 = border->tags + start + 1; + FT_Byte* tag2 = border->tags + count - 1; + + + for ( ; tag1 < tag2; tag1++, tag2-- ) + { + FT_Byte tmp; + + + tmp = *tag1; + *tag1 = *tag2; + *tag2 = tmp; + } + } + } + + border->tags[start ] |= FT_STROKE_TAG_BEGIN; + border->tags[count - 1] |= FT_STROKE_TAG_END; + } + + border->start = -1; + border->movable = FALSE; + } + + + static FT_Error + ft_stroke_border_lineto( FT_StrokeBorder border, + FT_Vector* to, + FT_Bool movable ) + { + FT_Error error = FT_Err_Ok; + + + FT_ASSERT( border->start >= 0 ); + + if ( border->movable ) + { + /* move last point */ + border->points[border->num_points - 1] = *to; + } + else + { + /* don't add zero-length lineto */ + if ( border->num_points > 0 && + FT_IS_SMALL( border->points[border->num_points - 1].x - to->x ) && + FT_IS_SMALL( border->points[border->num_points - 1].y - to->y ) ) + return error; + + /* add one point */ + error = ft_stroke_border_grow( border, 1 ); + if ( !error ) + { + FT_Vector* vec = border->points + border->num_points; + FT_Byte* tag = border->tags + border->num_points; + + + vec[0] = *to; + tag[0] = FT_STROKE_TAG_ON; + + border->num_points += 1; + } + } + border->movable = movable; + return error; + } + + + static FT_Error + ft_stroke_border_conicto( FT_StrokeBorder border, + FT_Vector* control, + FT_Vector* to ) + { + FT_Error error; + + + FT_ASSERT( border->start >= 0 ); + + error = ft_stroke_border_grow( border, 2 ); + if ( !error ) + { + FT_Vector* vec = border->points + border->num_points; + FT_Byte* tag = border->tags + border->num_points; + + + vec[0] = *control; + vec[1] = *to; + + tag[0] = 0; + tag[1] = FT_STROKE_TAG_ON; + + border->num_points += 2; + } + + border->movable = FALSE; + + return error; + } + + + static FT_Error + ft_stroke_border_cubicto( FT_StrokeBorder border, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ) + { + FT_Error error; + + + FT_ASSERT( border->start >= 0 ); + + error = ft_stroke_border_grow( border, 3 ); + if ( !error ) + { + FT_Vector* vec = border->points + border->num_points; + FT_Byte* tag = border->tags + border->num_points; + + + vec[0] = *control1; + vec[1] = *control2; + vec[2] = *to; + + tag[0] = FT_STROKE_TAG_CUBIC; + tag[1] = FT_STROKE_TAG_CUBIC; + tag[2] = FT_STROKE_TAG_ON; + + border->num_points += 3; + } + + border->movable = FALSE; + + return error; + } + + +#define FT_ARC_CUBIC_ANGLE ( FT_ANGLE_PI / 2 ) + + + static FT_Error + ft_stroke_border_arcto( FT_StrokeBorder border, + FT_Vector* center, + FT_Fixed radius, + FT_Angle angle_start, + FT_Angle angle_diff ) + { + FT_Angle total, angle, step, rotate, next, theta; + FT_Vector a, b, a2, b2; + FT_Fixed length; + FT_Error error = FT_Err_Ok; + + + /* compute start point */ + FT_Vector_From_Polar( &a, radius, angle_start ); + a.x += center->x; + a.y += center->y; + + total = angle_diff; + angle = angle_start; + rotate = ( angle_diff >= 0 ) ? FT_ANGLE_PI2 : -FT_ANGLE_PI2; + + while ( total != 0 ) + { + step = total; + if ( step > FT_ARC_CUBIC_ANGLE ) + step = FT_ARC_CUBIC_ANGLE; + + else if ( step < -FT_ARC_CUBIC_ANGLE ) + step = -FT_ARC_CUBIC_ANGLE; + + next = angle + step; + theta = step; + if ( theta < 0 ) + theta = -theta; + + theta >>= 1; + + /* compute end point */ + FT_Vector_From_Polar( &b, radius, next ); + b.x += center->x; + b.y += center->y; + + /* compute first and second control points */ + length = FT_MulDiv( radius, FT_Sin( theta ) * 4, + ( 0x10000L + FT_Cos( theta ) ) * 3 ); + + FT_Vector_From_Polar( &a2, length, angle + rotate ); + a2.x += a.x; + a2.y += a.y; + + FT_Vector_From_Polar( &b2, length, next - rotate ); + b2.x += b.x; + b2.y += b.y; + + /* add cubic arc */ + error = ft_stroke_border_cubicto( border, &a2, &b2, &b ); + if ( error ) + break; + + /* process the rest of the arc ?? */ + a = b; + total -= step; + angle = next; + } + + return error; + } + + + static FT_Error + ft_stroke_border_moveto( FT_StrokeBorder border, + FT_Vector* to ) + { + /* close current open path if any ? */ + if ( border->start >= 0 ) + ft_stroke_border_close( border, FALSE ); + + border->start = (FT_Int)border->num_points; + border->movable = FALSE; + + return ft_stroke_border_lineto( border, to, FALSE ); + } + + + static void + ft_stroke_border_init( FT_StrokeBorder border, + FT_Memory memory ) + { + border->memory = memory; + border->points = NULL; + border->tags = NULL; + + border->num_points = 0; + border->max_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static void + ft_stroke_border_reset( FT_StrokeBorder border ) + { + border->num_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static void + ft_stroke_border_done( FT_StrokeBorder border ) + { + FT_Memory memory = border->memory; + + + FT_FREE( border->points ); + FT_FREE( border->tags ); + + border->num_points = 0; + border->max_points = 0; + border->start = -1; + border->valid = FALSE; + } + + + static FT_Error + ft_stroke_border_get_counts( FT_StrokeBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_Error error = FT_Err_Ok; + FT_UInt num_points = 0; + FT_UInt num_contours = 0; + + FT_UInt count = border->num_points; + FT_Vector* point = border->points; + FT_Byte* tags = border->tags; + FT_Int in_contour = 0; + + + for ( ; count > 0; count--, num_points++, point++, tags++ ) + { + if ( tags[0] & FT_STROKE_TAG_BEGIN ) + { + if ( in_contour != 0 ) + goto Fail; + + in_contour = 1; + } + else if ( in_contour == 0 ) + goto Fail; + + if ( tags[0] & FT_STROKE_TAG_END ) + { + in_contour = 0; + num_contours++; + } + } + + if ( in_contour != 0 ) + goto Fail; + + border->valid = TRUE; + + Exit: + *anum_points = num_points; + *anum_contours = num_contours; + return error; + + Fail: + num_points = 0; + num_contours = 0; + goto Exit; + } + + + static void + ft_stroke_border_export( FT_StrokeBorder border, + FT_Outline* outline ) + { + /* copy point locations */ + if ( border->num_points ) + FT_ARRAY_COPY( outline->points + outline->n_points, + border->points, + border->num_points ); + + /* copy tags */ + { + FT_UInt count = border->num_points; + FT_Byte* read = border->tags; + FT_Byte* write = (FT_Byte*)outline->tags + outline->n_points; + + + for ( ; count > 0; count--, read++, write++ ) + { + if ( *read & FT_STROKE_TAG_ON ) + *write = FT_CURVE_TAG_ON; + else if ( *read & FT_STROKE_TAG_CUBIC ) + *write = FT_CURVE_TAG_CUBIC; + else + *write = FT_CURVE_TAG_CONIC; + } + } + + /* copy contours */ + { + FT_UInt count = border->num_points; + FT_Byte* tags = border->tags; + FT_Short* write = outline->contours + outline->n_contours; + FT_Short idx = (FT_Short)outline->n_points; + + + for ( ; count > 0; count--, tags++, idx++ ) + { + if ( *tags & FT_STROKE_TAG_END ) + { + *write++ = idx; + outline->n_contours++; + } + } + } + + outline->n_points += (short)border->num_points; + + FT_ASSERT( FT_Outline_Check( outline ) == 0 ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STROKER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define FT_SIDE_TO_ROTATE( s ) ( FT_ANGLE_PI2 - (s) * FT_ANGLE_PI ) + + typedef struct FT_StrokerRec_ + { + FT_Angle angle_in; /* direction into curr join */ + FT_Angle angle_out; /* direction out of join */ + FT_Vector center; /* current position */ + FT_Fixed line_length; /* length of last lineto */ + FT_Bool first_point; /* is this the start? */ + FT_Bool subpath_open; /* is the subpath open? */ + FT_Angle subpath_angle; /* subpath start direction */ + FT_Vector subpath_start; /* subpath start position */ + FT_Fixed subpath_line_length; /* subpath start lineto len */ + FT_Bool handle_wide_strokes; /* use wide strokes logic? */ + + FT_Stroker_LineCap line_cap; + FT_Stroker_LineJoin line_join; + FT_Stroker_LineJoin line_join_saved; + FT_Fixed miter_limit; + FT_Fixed radius; + + FT_StrokeBorderRec borders[2]; + FT_Library library; + + } FT_StrokerRec; + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_New( FT_Library library, + FT_Stroker *astroker ) + { + FT_Error error; /* assigned in FT_NEW */ + FT_Memory memory; + FT_Stroker stroker = NULL; + + + if ( !library ) + return FT_THROW( Invalid_Library_Handle ); + + if ( !astroker ) + return FT_THROW( Invalid_Argument ); + + memory = library->memory; + + if ( !FT_NEW( stroker ) ) + { + stroker->library = library; + + ft_stroke_border_init( &stroker->borders[0], memory ); + ft_stroke_border_init( &stroker->borders[1], memory ); + } + + *astroker = stroker; + + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Set( FT_Stroker stroker, + FT_Fixed radius, + FT_Stroker_LineCap line_cap, + FT_Stroker_LineJoin line_join, + FT_Fixed miter_limit ) + { + if ( !stroker ) + return; + + stroker->radius = radius; + stroker->line_cap = line_cap; + stroker->line_join = line_join; + stroker->miter_limit = miter_limit; + + /* ensure miter limit has sensible value */ + if ( stroker->miter_limit < 0x10000L ) + stroker->miter_limit = 0x10000L; + + /* save line join style: */ + /* line join style can be temporarily changed when stroking curves */ + stroker->line_join_saved = line_join; + + FT_Stroker_Rewind( stroker ); + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Rewind( FT_Stroker stroker ) + { + if ( stroker ) + { + ft_stroke_border_reset( &stroker->borders[0] ); + ft_stroke_border_reset( &stroker->borders[1] ); + } + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Done( FT_Stroker stroker ) + { + if ( stroker ) + { + FT_Memory memory = stroker->library->memory; + + + ft_stroke_border_done( &stroker->borders[0] ); + ft_stroke_border_done( &stroker->borders[1] ); + + stroker->library = NULL; + FT_FREE( stroker ); + } + } + + + /* create a circular arc at a corner or cap */ + static FT_Error + ft_stroker_arcto( FT_Stroker stroker, + FT_Int side ) + { + FT_Angle total, rotate; + FT_Fixed radius = stroker->radius; + FT_Error error = FT_Err_Ok; + FT_StrokeBorder border = stroker->borders + side; + + + rotate = FT_SIDE_TO_ROTATE( side ); + + total = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + if ( total == FT_ANGLE_PI ) + total = -rotate * 2; + + error = ft_stroke_border_arcto( border, + &stroker->center, + radius, + stroker->angle_in + rotate, + total ); + border->movable = FALSE; + return error; + } + + + /* add a cap at the end of an opened path */ + static FT_Error + ft_stroker_cap( FT_Stroker stroker, + FT_Angle angle, + FT_Int side ) + { + FT_Error error = FT_Err_Ok; + + + if ( stroker->line_cap == FT_STROKER_LINECAP_ROUND ) + { + /* add a round cap */ + stroker->angle_in = angle; + stroker->angle_out = angle + FT_ANGLE_PI; + + error = ft_stroker_arcto( stroker, side ); + } + else if ( stroker->line_cap == FT_STROKER_LINECAP_SQUARE ) + { + /* add a square cap */ + FT_Vector delta, delta2; + FT_Angle rotate = FT_SIDE_TO_ROTATE( side ); + FT_Fixed radius = stroker->radius; + FT_StrokeBorder border = stroker->borders + side; + + + FT_Vector_From_Polar( &delta2, radius, angle + rotate ); + FT_Vector_From_Polar( &delta, radius, angle ); + + delta.x += stroker->center.x + delta2.x; + delta.y += stroker->center.y + delta2.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + FT_Vector_From_Polar( &delta2, radius, angle - rotate ); + FT_Vector_From_Polar( &delta, radius, angle ); + + delta.x += delta2.x + stroker->center.x; + delta.y += delta2.y + stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + else if ( stroker->line_cap == FT_STROKER_LINECAP_BUTT ) + { + /* add a butt ending */ + FT_Vector delta; + FT_Angle rotate = FT_SIDE_TO_ROTATE( side ); + FT_Fixed radius = stroker->radius; + FT_StrokeBorder border = stroker->borders + side; + + + FT_Vector_From_Polar( &delta, radius, angle + rotate ); + + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + FT_Vector_From_Polar( &delta, radius, angle - rotate ); + + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + + Exit: + return error; + } + + + /* process an inside corner, i.e. compute intersection */ + static FT_Error + ft_stroker_inside( FT_Stroker stroker, + FT_Int side, + FT_Fixed line_length ) + { + FT_StrokeBorder border = stroker->borders + side; + FT_Angle phi, theta, rotate; + FT_Fixed length, thcos; + FT_Vector delta; + FT_Error error = FT_Err_Ok; + FT_Bool intersect; /* use intersection of lines? */ + + + rotate = FT_SIDE_TO_ROTATE( side ); + + theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ) / 2; + + /* Only intersect borders if between two lineto's and both */ + /* lines are long enough (line_length is zero for curves). */ + /* Also avoid U-turns of nearly 180 degree. */ + if ( !border->movable || line_length == 0 || + theta > 0x59C000 || theta < -0x59C000 ) + intersect = FALSE; + else + { + /* compute minimum required length of lines */ + FT_Fixed min_length = ft_pos_abs( FT_MulFix( stroker->radius, + FT_Tan( theta ) ) ); + + + intersect = FT_BOOL( min_length && + stroker->line_length >= min_length && + line_length >= min_length ); + } + + if ( !intersect ) + { + FT_Vector_From_Polar( &delta, stroker->radius, + stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + border->movable = FALSE; + } + else + { + /* compute median angle */ + phi = stroker->angle_in + theta; + + thcos = FT_Cos( theta ); + + length = FT_DivFix( stroker->radius, thcos ); + + FT_Vector_From_Polar( &delta, length, phi + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + } + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + + return error; + } + + + /* process an outside corner, i.e. compute bevel/miter/round */ + static FT_Error + ft_stroker_outside( FT_Stroker stroker, + FT_Int side, + FT_Fixed line_length ) + { + FT_StrokeBorder border = stroker->borders + side; + FT_Error error; + FT_Angle rotate; + + + if ( stroker->line_join == FT_STROKER_LINEJOIN_ROUND ) + error = ft_stroker_arcto( stroker, side ); + else + { + /* this is a mitered (pointed) or beveled (truncated) corner */ + FT_Fixed sigma = 0, radius = stroker->radius; + FT_Angle theta = 0, phi = 0; + FT_Fixed thcos = 0; + FT_Bool bevel, fixed_bevel; + + + rotate = FT_SIDE_TO_ROTATE( side ); + + bevel = + FT_BOOL( stroker->line_join == FT_STROKER_LINEJOIN_BEVEL ); + + fixed_bevel = + FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_MITER_VARIABLE ); + + if ( !bevel ) + { + theta = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + + if ( theta == FT_ANGLE_PI ) + { + theta = rotate; + phi = stroker->angle_in; + } + else + { + theta /= 2; + phi = stroker->angle_in + theta + rotate; + } + + thcos = FT_Cos( theta ); + sigma = FT_MulFix( stroker->miter_limit, thcos ); + + /* is miter limit exceeded? */ + if ( sigma < 0x10000L ) + { + /* don't create variable bevels for very small deviations; */ + /* FT_Sin(x) = 0 for x <= 57 */ + if ( fixed_bevel || ft_pos_abs( theta ) > 57 ) + bevel = TRUE; + } + } + + if ( bevel ) /* this is a bevel (broken angle) */ + { + if ( fixed_bevel ) + { + /* the outer corners are simply joined together */ + FT_Vector delta; + + + /* add bevel */ + FT_Vector_From_Polar( &delta, + radius, + stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + border->movable = FALSE; + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + else /* variable bevel */ + { + /* the miter is truncated */ + FT_Vector middle, delta; + FT_Fixed length; + + + /* compute middle point */ + FT_Vector_From_Polar( &middle, + FT_MulFix( radius, stroker->miter_limit ), + phi ); + middle.x += stroker->center.x; + middle.y += stroker->center.y; + + /* compute first angle point */ + length = FT_MulDiv( radius, 0x10000L - sigma, + ft_pos_abs( FT_Sin( theta ) ) ); + + FT_Vector_From_Polar( &delta, length, phi + rotate ); + delta.x += middle.x; + delta.y += middle.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* compute second angle point */ + FT_Vector_From_Polar( &delta, length, phi - rotate ); + delta.x += middle.x; + delta.y += middle.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* finally, add an end point; only needed if not lineto */ + /* (line_length is zero for curves) */ + if ( line_length == 0 ) + { + FT_Vector_From_Polar( &delta, + radius, + stroker->angle_out + rotate ); + + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + } + } + else /* this is a miter (intersection) */ + { + FT_Fixed length; + FT_Vector delta; + + + length = FT_DivFix( stroker->radius, thcos ); + + FT_Vector_From_Polar( &delta, length, phi ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + + /* now add an end point; only needed if not lineto */ + /* (line_length is zero for curves) */ + if ( line_length == 0 ) + { + FT_Vector_From_Polar( &delta, + stroker->radius, + stroker->angle_out + rotate ); + delta.x += stroker->center.x; + delta.y += stroker->center.y; + + error = ft_stroke_border_lineto( border, &delta, FALSE ); + } + } + } + + Exit: + return error; + } + + + static FT_Error + ft_stroker_process_corner( FT_Stroker stroker, + FT_Fixed line_length ) + { + FT_Error error = FT_Err_Ok; + FT_Angle turn; + FT_Int inside_side; + + + turn = FT_Angle_Diff( stroker->angle_in, stroker->angle_out ); + + /* no specific corner processing is required if the turn is 0 */ + if ( turn == 0 ) + goto Exit; + + /* when we turn to the right, the inside side is 0 */ + /* otherwise, the inside side is 1 */ + inside_side = ( turn < 0 ); + + /* process the inside side */ + error = ft_stroker_inside( stroker, inside_side, line_length ); + if ( error ) + goto Exit; + + /* process the outside side */ + error = ft_stroker_outside( stroker, !inside_side, line_length ); + + Exit: + return error; + } + + + /* add two points to the left and right borders corresponding to the */ + /* start of the subpath */ + static FT_Error + ft_stroker_subpath_start( FT_Stroker stroker, + FT_Angle start_angle, + FT_Fixed line_length ) + { + FT_Vector delta; + FT_Vector point; + FT_Error error; + FT_StrokeBorder border; + + + FT_Vector_From_Polar( &delta, stroker->radius, + start_angle + FT_ANGLE_PI2 ); + + point.x = stroker->center.x + delta.x; + point.y = stroker->center.y + delta.y; + + border = stroker->borders; + error = ft_stroke_border_moveto( border, &point ); + if ( error ) + goto Exit; + + point.x = stroker->center.x - delta.x; + point.y = stroker->center.y - delta.y; + + border++; + error = ft_stroke_border_moveto( border, &point ); + + /* save angle, position, and line length for last join */ + /* (line_length is zero for curves) */ + stroker->subpath_angle = start_angle; + stroker->first_point = FALSE; + stroker->subpath_line_length = line_length; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_LineTo( FT_Stroker stroker, + FT_Vector* to ) + { + FT_Error error = FT_Err_Ok; + FT_StrokeBorder border; + FT_Vector delta; + FT_Angle angle; + FT_Int side; + FT_Fixed line_length; + + + if ( !stroker || !to ) + return FT_THROW( Invalid_Argument ); + + delta.x = to->x - stroker->center.x; + delta.y = to->y - stroker->center.y; + + /* a zero-length lineto is a no-op; avoid creating a spurious corner */ + if ( delta.x == 0 && delta.y == 0 ) + goto Exit; + + /* compute length of line */ + line_length = FT_Vector_Length( &delta ); + + angle = FT_Atan2( delta.x, delta.y ); + FT_Vector_From_Polar( &delta, stroker->radius, angle + FT_ANGLE_PI2 ); + + /* process corner if necessary */ + if ( stroker->first_point ) + { + /* This is the first segment of a subpath. We need to */ + /* add a point to each border at their respective starting */ + /* point locations. */ + error = ft_stroker_subpath_start( stroker, angle, line_length ); + if ( error ) + goto Exit; + } + else + { + /* process the current corner */ + stroker->angle_out = angle; + error = ft_stroker_process_corner( stroker, line_length ); + if ( error ) + goto Exit; + } + + /* now add a line segment to both the `inside' and `outside' paths */ + for ( border = stroker->borders, side = 1; side >= 0; side--, border++ ) + { + FT_Vector point; + + + point.x = to->x + delta.x; + point.y = to->y + delta.y; + + /* the ends of lineto borders are movable */ + error = ft_stroke_border_lineto( border, &point, TRUE ); + if ( error ) + goto Exit; + + delta.x = -delta.x; + delta.y = -delta.y; + } + + stroker->angle_in = angle; + stroker->center = *to; + stroker->line_length = line_length; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_ConicTo( FT_Stroker stroker, + FT_Vector* control, + FT_Vector* to ) + { + FT_Error error = FT_Err_Ok; + FT_Vector bez_stack[34]; + FT_Vector* arc; + FT_Vector* limit = bez_stack + 30; + FT_Bool first_arc = TRUE; + + + if ( !stroker || !control || !to ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* if all control points are coincident, this is a no-op; */ + /* avoid creating a spurious corner */ + if ( FT_IS_SMALL( stroker->center.x - control->x ) && + FT_IS_SMALL( stroker->center.y - control->y ) && + FT_IS_SMALL( control->x - to->x ) && + FT_IS_SMALL( control->y - to->y ) ) + { + stroker->center = *to; + goto Exit; + } + + arc = bez_stack; + arc[0] = *to; + arc[1] = *control; + arc[2] = stroker->center; + + while ( arc >= bez_stack ) + { + FT_Angle angle_in, angle_out; + + + /* initialize with current direction */ + angle_in = angle_out = stroker->angle_in; + + if ( arc < limit && + !ft_conic_is_small_enough( arc, &angle_in, &angle_out ) ) + { + if ( stroker->first_point ) + stroker->angle_in = angle_in; + + ft_conic_split( arc ); + arc += 2; + continue; + } + + if ( first_arc ) + { + first_arc = FALSE; + + /* process corner if necessary */ + if ( stroker->first_point ) + error = ft_stroker_subpath_start( stroker, angle_in, 0 ); + else + { + stroker->angle_out = angle_in; + error = ft_stroker_process_corner( stroker, 0 ); + } + } + else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) > + FT_SMALL_CONIC_THRESHOLD / 4 ) + { + /* if the deviation from one arc to the next is too great, */ + /* add a round corner */ + stroker->center = arc[2]; + stroker->angle_out = angle_in; + stroker->line_join = FT_STROKER_LINEJOIN_ROUND; + + error = ft_stroker_process_corner( stroker, 0 ); + + /* reinstate line join style */ + stroker->line_join = stroker->line_join_saved; + } + + if ( error ) + goto Exit; + + /* the arc's angle is small enough; we can add it directly to each */ + /* border */ + { + FT_Vector ctrl, end; + FT_Angle theta, phi, rotate, alpha0 = 0; + FT_Fixed length; + FT_StrokeBorder border; + FT_Int side; + + + theta = FT_Angle_Diff( angle_in, angle_out ) / 2; + phi = angle_in + theta; + length = FT_DivFix( stroker->radius, FT_Cos( theta ) ); + + /* compute direction of original arc */ + if ( stroker->handle_wide_strokes ) + alpha0 = FT_Atan2( arc[0].x - arc[2].x, arc[0].y - arc[2].y ); + + for ( border = stroker->borders, side = 0; + side <= 1; + side++, border++ ) + { + rotate = FT_SIDE_TO_ROTATE( side ); + + /* compute control point */ + FT_Vector_From_Polar( &ctrl, length, phi + rotate ); + ctrl.x += arc[1].x; + ctrl.y += arc[1].y; + + /* compute end point */ + FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); + end.x += arc[0].x; + end.y += arc[0].y; + + if ( stroker->handle_wide_strokes ) + { + FT_Vector start; + FT_Angle alpha1; + + + /* determine whether the border radius is greater than the */ + /* radius of curvature of the original arc */ + start = border->points[border->num_points - 1]; + + alpha1 = FT_Atan2( end.x - start.x, end.y - start.y ); + + /* is the direction of the border arc opposite to */ + /* that of the original arc? */ + if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) > + FT_ANGLE_PI / 2 ) + { + FT_Angle beta, gamma; + FT_Vector bvec, delta; + FT_Fixed blen, sinA, sinB, alen; + + + /* use the sine rule to find the intersection point */ + beta = FT_Atan2( arc[2].x - start.x, arc[2].y - start.y ); + gamma = FT_Atan2( arc[0].x - end.x, arc[0].y - end.y ); + + bvec.x = end.x - start.x; + bvec.y = end.y - start.y; + + blen = FT_Vector_Length( &bvec ); + + sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) ); + sinB = ft_pos_abs( FT_Sin( beta - gamma ) ); + + alen = FT_MulDiv( blen, sinA, sinB ); + + FT_Vector_From_Polar( &delta, alen, beta ); + delta.x += start.x; + delta.y += start.y; + + /* circumnavigate the negative sector backwards */ + border->movable = FALSE; + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + error = ft_stroke_border_lineto( border, &end, FALSE ); + if ( error ) + goto Exit; + error = ft_stroke_border_conicto( border, &ctrl, &start ); + if ( error ) + goto Exit; + /* and then move to the endpoint */ + error = ft_stroke_border_lineto( border, &end, FALSE ); + if ( error ) + goto Exit; + + continue; + } + + /* else fall through */ + } + + /* simply add an arc */ + error = ft_stroke_border_conicto( border, &ctrl, &end ); + if ( error ) + goto Exit; + } + } + + arc -= 2; + + stroker->angle_in = angle_out; + } + + stroker->center = *to; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_CubicTo( FT_Stroker stroker, + FT_Vector* control1, + FT_Vector* control2, + FT_Vector* to ) + { + FT_Error error = FT_Err_Ok; + FT_Vector bez_stack[37]; + FT_Vector* arc; + FT_Vector* limit = bez_stack + 32; + FT_Bool first_arc = TRUE; + + + if ( !stroker || !control1 || !control2 || !to ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* if all control points are coincident, this is a no-op; */ + /* avoid creating a spurious corner */ + if ( FT_IS_SMALL( stroker->center.x - control1->x ) && + FT_IS_SMALL( stroker->center.y - control1->y ) && + FT_IS_SMALL( control1->x - control2->x ) && + FT_IS_SMALL( control1->y - control2->y ) && + FT_IS_SMALL( control2->x - to->x ) && + FT_IS_SMALL( control2->y - to->y ) ) + { + stroker->center = *to; + goto Exit; + } + + arc = bez_stack; + arc[0] = *to; + arc[1] = *control2; + arc[2] = *control1; + arc[3] = stroker->center; + + while ( arc >= bez_stack ) + { + FT_Angle angle_in, angle_mid, angle_out; + + + /* initialize with current direction */ + angle_in = angle_out = angle_mid = stroker->angle_in; + + if ( arc < limit && + !ft_cubic_is_small_enough( arc, &angle_in, + &angle_mid, &angle_out ) ) + { + if ( stroker->first_point ) + stroker->angle_in = angle_in; + + ft_cubic_split( arc ); + arc += 3; + continue; + } + + if ( first_arc ) + { + first_arc = FALSE; + + /* process corner if necessary */ + if ( stroker->first_point ) + error = ft_stroker_subpath_start( stroker, angle_in, 0 ); + else + { + stroker->angle_out = angle_in; + error = ft_stroker_process_corner( stroker, 0 ); + } + } + else if ( ft_pos_abs( FT_Angle_Diff( stroker->angle_in, angle_in ) ) > + FT_SMALL_CUBIC_THRESHOLD / 4 ) + { + /* if the deviation from one arc to the next is too great, */ + /* add a round corner */ + stroker->center = arc[3]; + stroker->angle_out = angle_in; + stroker->line_join = FT_STROKER_LINEJOIN_ROUND; + + error = ft_stroker_process_corner( stroker, 0 ); + + /* reinstate line join style */ + stroker->line_join = stroker->line_join_saved; + } + + if ( error ) + goto Exit; + + /* the arc's angle is small enough; we can add it directly to each */ + /* border */ + { + FT_Vector ctrl1, ctrl2, end; + FT_Angle theta1, phi1, theta2, phi2, rotate, alpha0 = 0; + FT_Fixed length1, length2; + FT_StrokeBorder border; + FT_Int side; + + + theta1 = FT_Angle_Diff( angle_in, angle_mid ) / 2; + theta2 = FT_Angle_Diff( angle_mid, angle_out ) / 2; + phi1 = ft_angle_mean( angle_in, angle_mid ); + phi2 = ft_angle_mean( angle_mid, angle_out ); + length1 = FT_DivFix( stroker->radius, FT_Cos( theta1 ) ); + length2 = FT_DivFix( stroker->radius, FT_Cos( theta2 ) ); + + /* compute direction of original arc */ + if ( stroker->handle_wide_strokes ) + alpha0 = FT_Atan2( arc[0].x - arc[3].x, arc[0].y - arc[3].y ); + + for ( border = stroker->borders, side = 0; + side <= 1; + side++, border++ ) + { + rotate = FT_SIDE_TO_ROTATE( side ); + + /* compute control points */ + FT_Vector_From_Polar( &ctrl1, length1, phi1 + rotate ); + ctrl1.x += arc[2].x; + ctrl1.y += arc[2].y; + + FT_Vector_From_Polar( &ctrl2, length2, phi2 + rotate ); + ctrl2.x += arc[1].x; + ctrl2.y += arc[1].y; + + /* compute end point */ + FT_Vector_From_Polar( &end, stroker->radius, angle_out + rotate ); + end.x += arc[0].x; + end.y += arc[0].y; + + if ( stroker->handle_wide_strokes ) + { + FT_Vector start; + FT_Angle alpha1; + + + /* determine whether the border radius is greater than the */ + /* radius of curvature of the original arc */ + start = border->points[border->num_points - 1]; + + alpha1 = FT_Atan2( end.x - start.x, end.y - start.y ); + + /* is the direction of the border arc opposite to */ + /* that of the original arc? */ + if ( ft_pos_abs( FT_Angle_Diff( alpha0, alpha1 ) ) > + FT_ANGLE_PI / 2 ) + { + FT_Angle beta, gamma; + FT_Vector bvec, delta; + FT_Fixed blen, sinA, sinB, alen; + + + /* use the sine rule to find the intersection point */ + beta = FT_Atan2( arc[3].x - start.x, arc[3].y - start.y ); + gamma = FT_Atan2( arc[0].x - end.x, arc[0].y - end.y ); + + bvec.x = end.x - start.x; + bvec.y = end.y - start.y; + + blen = FT_Vector_Length( &bvec ); + + sinA = ft_pos_abs( FT_Sin( alpha1 - gamma ) ); + sinB = ft_pos_abs( FT_Sin( beta - gamma ) ); + + alen = FT_MulDiv( blen, sinA, sinB ); + + FT_Vector_From_Polar( &delta, alen, beta ); + delta.x += start.x; + delta.y += start.y; + + /* circumnavigate the negative sector backwards */ + border->movable = FALSE; + error = ft_stroke_border_lineto( border, &delta, FALSE ); + if ( error ) + goto Exit; + error = ft_stroke_border_lineto( border, &end, FALSE ); + if ( error ) + goto Exit; + error = ft_stroke_border_cubicto( border, + &ctrl2, + &ctrl1, + &start ); + if ( error ) + goto Exit; + /* and then move to the endpoint */ + error = ft_stroke_border_lineto( border, &end, FALSE ); + if ( error ) + goto Exit; + + continue; + } + + /* else fall through */ + } + + /* simply add an arc */ + error = ft_stroke_border_cubicto( border, &ctrl1, &ctrl2, &end ); + if ( error ) + goto Exit; + } + } + + arc -= 3; + + stroker->angle_in = angle_out; + } + + stroker->center = *to; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_BeginSubPath( FT_Stroker stroker, + FT_Vector* to, + FT_Bool open ) + { + if ( !stroker || !to ) + return FT_THROW( Invalid_Argument ); + + /* We cannot process the first point, because there is not enough */ + /* information regarding its corner/cap. The latter will be processed */ + /* in the `FT_Stroker_EndSubPath' routine. */ + /* */ + stroker->first_point = TRUE; + stroker->center = *to; + stroker->subpath_open = open; + + /* Determine if we need to check whether the border radius is greater */ + /* than the radius of curvature of a curve, to handle this case */ + /* specially. This is only required if bevel joins or butt caps may */ + /* be created, because round & miter joins and round & square caps */ + /* cover the negative sector created with wide strokes. */ + stroker->handle_wide_strokes = + FT_BOOL( stroker->line_join != FT_STROKER_LINEJOIN_ROUND || + ( stroker->subpath_open && + stroker->line_cap == FT_STROKER_LINECAP_BUTT ) ); + + /* record the subpath start point for each border */ + stroker->subpath_start = *to; + + stroker->angle_in = 0; + + return FT_Err_Ok; + } + + + static FT_Error + ft_stroker_add_reverse_left( FT_Stroker stroker, + FT_Bool open ) + { + FT_StrokeBorder right = stroker->borders + 0; + FT_StrokeBorder left = stroker->borders + 1; + FT_Int new_points; + FT_Error error = FT_Err_Ok; + + + FT_ASSERT( left->start >= 0 ); + + new_points = (FT_Int)left->num_points - left->start; + if ( new_points > 0 ) + { + error = ft_stroke_border_grow( right, (FT_UInt)new_points ); + if ( error ) + goto Exit; + + { + FT_Vector* dst_point = right->points + right->num_points; + FT_Byte* dst_tag = right->tags + right->num_points; + FT_Vector* src_point = left->points + left->num_points - 1; + FT_Byte* src_tag = left->tags + left->num_points - 1; + + + while ( src_point >= left->points + left->start ) + { + *dst_point = *src_point; + *dst_tag = *src_tag; + + if ( open ) + dst_tag[0] &= ~FT_STROKE_TAG_BEGIN_END; + else + { + FT_Byte ttag = + (FT_Byte)( dst_tag[0] & FT_STROKE_TAG_BEGIN_END ); + + + /* switch begin/end tags if necessary */ + if ( ttag == FT_STROKE_TAG_BEGIN || + ttag == FT_STROKE_TAG_END ) + dst_tag[0] ^= FT_STROKE_TAG_BEGIN_END; + } + + src_point--; + src_tag--; + dst_point++; + dst_tag++; + } + } + + left->num_points = (FT_UInt)left->start; + right->num_points += (FT_UInt)new_points; + + right->movable = FALSE; + left->movable = FALSE; + } + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + /* there's a lot of magic in this function! */ + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_EndSubPath( FT_Stroker stroker ) + { + FT_Error error = FT_Err_Ok; + + + if ( !stroker ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( stroker->subpath_open ) + { + FT_StrokeBorder right = stroker->borders; + + + /* All right, this is an opened path, we need to add a cap between */ + /* right & left, add the reverse of left, then add a final cap */ + /* between left & right. */ + error = ft_stroker_cap( stroker, stroker->angle_in, 0 ); + if ( error ) + goto Exit; + + /* add reversed points from `left' to `right' */ + error = ft_stroker_add_reverse_left( stroker, TRUE ); + if ( error ) + goto Exit; + + /* now add the final cap */ + stroker->center = stroker->subpath_start; + error = ft_stroker_cap( stroker, + stroker->subpath_angle + FT_ANGLE_PI, 0 ); + if ( error ) + goto Exit; + + /* Now end the right subpath accordingly. The left one is */ + /* rewind and doesn't need further processing. */ + ft_stroke_border_close( right, FALSE ); + } + else + { + FT_Angle turn; + FT_Int inside_side; + + + /* close the path if needed */ + if ( stroker->center.x != stroker->subpath_start.x || + stroker->center.y != stroker->subpath_start.y ) + { + error = FT_Stroker_LineTo( stroker, &stroker->subpath_start ); + if ( error ) + goto Exit; + } + + /* process the corner */ + stroker->angle_out = stroker->subpath_angle; + turn = FT_Angle_Diff( stroker->angle_in, + stroker->angle_out ); + + /* no specific corner processing is required if the turn is 0 */ + if ( turn != 0 ) + { + /* when we turn to the right, the inside side is 0 */ + /* otherwise, the inside side is 1 */ + inside_side = ( turn < 0 ); + + error = ft_stroker_inside( stroker, + inside_side, + stroker->subpath_line_length ); + if ( error ) + goto Exit; + + /* process the outside side */ + error = ft_stroker_outside( stroker, + !inside_side, + stroker->subpath_line_length ); + if ( error ) + goto Exit; + } + + /* then end our two subpaths */ + ft_stroke_border_close( stroker->borders + 0, FALSE ); + ft_stroke_border_close( stroker->borders + 1, TRUE ); + } + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_GetBorderCounts( FT_Stroker stroker, + FT_StrokerBorder border, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_UInt num_points = 0, num_contours = 0; + FT_Error error; + + + if ( !stroker || border > 1 ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + error = ft_stroke_border_get_counts( stroker->borders + border, + &num_points, &num_contours ); + Exit: + if ( anum_points ) + *anum_points = num_points; + + if ( anum_contours ) + *anum_contours = num_contours; + + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_GetCounts( FT_Stroker stroker, + FT_UInt *anum_points, + FT_UInt *anum_contours ) + { + FT_UInt count1, count2, num_points = 0; + FT_UInt count3, count4, num_contours = 0; + FT_Error error; + + + if ( !stroker ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + error = ft_stroke_border_get_counts( stroker->borders + 0, + &count1, &count2 ); + if ( error ) + goto Exit; + + error = ft_stroke_border_get_counts( stroker->borders + 1, + &count3, &count4 ); + if ( error ) + goto Exit; + + num_points = count1 + count3; + num_contours = count2 + count4; + + Exit: + if ( anum_points ) + *anum_points = num_points; + + if ( anum_contours ) + *anum_contours = num_contours; + + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_ExportBorder( FT_Stroker stroker, + FT_StrokerBorder border, + FT_Outline* outline ) + { + if ( !stroker || !outline ) + return; + + if ( border == FT_STROKER_BORDER_LEFT || + border == FT_STROKER_BORDER_RIGHT ) + { + FT_StrokeBorder sborder = & stroker->borders[border]; + + + if ( sborder->valid ) + ft_stroke_border_export( sborder, outline ); + } + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( void ) + FT_Stroker_Export( FT_Stroker stroker, + FT_Outline* outline ) + { + FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_LEFT, outline ); + FT_Stroker_ExportBorder( stroker, FT_STROKER_BORDER_RIGHT, outline ); + } + + + /* documentation is in ftstroke.h */ + + /* + * The following is very similar to FT_Outline_Decompose, except + * that we do support opened paths, and do not scale the outline. + */ + FT_EXPORT_DEF( FT_Error ) + FT_Stroker_ParseOutline( FT_Stroker stroker, + FT_Outline* outline, + FT_Bool opened ) + { + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + FT_Error error; + + FT_Int n; /* index of contour in outline */ + FT_UInt first; /* index of first point in contour */ + FT_Int tag; /* current point's state */ + + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + if ( !stroker ) + return FT_THROW( Invalid_Argument ); + + FT_Stroker_Rewind( stroker ); + + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + FT_UInt last; /* index of last point in contour */ + + + last = (FT_UInt)outline->contours[n]; + limit = outline->points + last; + + /* skip empty points; we don't stroke these */ + if ( last <= first ) + { + first = last + 1; + continue; + } + + v_start = outline->points[first]; + v_last = outline->points[last]; + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* First point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + } + point--; + tags--; + } + + error = FT_Stroker_BeginSubPath( stroker, &v_start, opened ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + FT_Vector vec; + + + vec.x = point->x; + vec.y = point->y; + + error = FT_Stroker_LineTo( stroker, &vec ); + if ( error ) + goto Exit; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = point->x; + v_control.y = point->y; + + Do_Conic: + if ( point < limit ) + { + FT_Vector vec; + FT_Vector v_middle; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + vec = point[0]; + + if ( tag == FT_CURVE_TAG_ON ) + { + error = FT_Stroker_ConicTo( stroker, &v_control, &vec ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + error = FT_Stroker_ConicTo( stroker, &v_control, &v_middle ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + error = FT_Stroker_ConicTo( stroker, &v_control, &v_start ); + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1 = point[-2]; + vec2 = point[-1]; + + if ( point <= limit ) + { + FT_Vector vec; + + + vec = point[0]; + + error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &vec ); + if ( error ) + goto Exit; + continue; + } + + error = FT_Stroker_CubicTo( stroker, &vec1, &vec2, &v_start ); + goto Close; + } + } + } + + Close: + if ( error ) + goto Exit; + + /* don't try to end the path if no segments have been generated */ + if ( !stroker->first_point ) + { + error = FT_Stroker_EndSubPath( stroker ); + if ( error ) + goto Exit; + } + + first = last + 1; + } + + return FT_Err_Ok; + + Exit: + return error; + + Invalid_Outline: + return FT_THROW( Invalid_Outline ); + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_Stroke( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool destroy ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + FT_Glyph glyph = NULL; + + /* for FT_OUTLINE_GLYPH_CLASS_GET (in PIC mode) */ + FT_Library library = stroker->library; + + FT_UNUSED( library ); + + + if ( !pglyph ) + goto Exit; + + glyph = *pglyph; + if ( !glyph || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET ) + goto Exit; + + { + FT_Glyph copy; + + + error = FT_Glyph_Copy( glyph, © ); + if ( error ) + goto Exit; + + glyph = copy; + } + + { + FT_OutlineGlyph oglyph = (FT_OutlineGlyph)glyph; + FT_Outline* outline = &oglyph->outline; + FT_UInt num_points, num_contours; + + + error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); + if ( error ) + goto Fail; + + FT_Stroker_GetCounts( stroker, &num_points, &num_contours ); + + FT_Outline_Done( glyph->library, outline ); + + error = FT_Outline_New( glyph->library, + num_points, + (FT_Int)num_contours, + outline ); + if ( error ) + goto Fail; + + outline->n_points = 0; + outline->n_contours = 0; + + FT_Stroker_Export( stroker, outline ); + } + + if ( destroy ) + FT_Done_Glyph( *pglyph ); + + *pglyph = glyph; + goto Exit; + + Fail: + FT_Done_Glyph( glyph ); + glyph = NULL; + + if ( !destroy ) + *pglyph = NULL; + + Exit: + return error; + } + + + /* documentation is in ftstroke.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Glyph_StrokeBorder( FT_Glyph *pglyph, + FT_Stroker stroker, + FT_Bool inside, + FT_Bool destroy ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + FT_Glyph glyph = NULL; + + /* for FT_OUTLINE_GLYPH_CLASS_GET (in PIC mode) */ + FT_Library library = stroker->library; + + FT_UNUSED( library ); + + + if ( !pglyph ) + goto Exit; + + glyph = *pglyph; + if ( !glyph || glyph->clazz != FT_OUTLINE_GLYPH_CLASS_GET ) + goto Exit; + + { + FT_Glyph copy; + + + error = FT_Glyph_Copy( glyph, © ); + if ( error ) + goto Exit; + + glyph = copy; + } + + { + FT_OutlineGlyph oglyph = (FT_OutlineGlyph)glyph; + FT_StrokerBorder border; + FT_Outline* outline = &oglyph->outline; + FT_UInt num_points, num_contours; + + + border = FT_Outline_GetOutsideBorder( outline ); + if ( inside ) + { + if ( border == FT_STROKER_BORDER_LEFT ) + border = FT_STROKER_BORDER_RIGHT; + else + border = FT_STROKER_BORDER_LEFT; + } + + error = FT_Stroker_ParseOutline( stroker, outline, FALSE ); + if ( error ) + goto Fail; + + FT_Stroker_GetBorderCounts( stroker, border, + &num_points, &num_contours ); + + FT_Outline_Done( glyph->library, outline ); + + error = FT_Outline_New( glyph->library, + num_points, + (FT_Int)num_contours, + outline ); + if ( error ) + goto Fail; + + outline->n_points = 0; + outline->n_contours = 0; + + FT_Stroker_ExportBorder( stroker, border, outline ); + } + + if ( destroy ) + FT_Done_Glyph( *pglyph ); + + *pglyph = glyph; + goto Exit; + + Fail: + FT_Done_Glyph( glyph ); + glyph = NULL; + + if ( !destroy ) + *pglyph = NULL; + + Exit: + return error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftsynth.c b/vendor/FreeType2/src/base/ftsynth.c new file mode 100644 index 0000000..c283467 --- /dev/null +++ b/vendor/FreeType2/src/base/ftsynth.c @@ -0,0 +1,163 @@ +/***************************************************************************/ +/* */ +/* ftsynth.c */ +/* */ +/* FreeType synthesizing code for emboldening and slanting (body). */ +/* */ +/* Copyright 2000-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_SYNTHESIS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_OUTLINE_H +#include FT_BITMAP_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_synth + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** EXPERIMENTAL OBLIQUING SUPPORT ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /* documentation is in ftsynth.h */ + + FT_EXPORT_DEF( void ) + FT_GlyphSlot_Oblique( FT_GlyphSlot slot ) + { + FT_Matrix transform; + FT_Outline* outline; + + + if ( !slot ) + return; + + outline = &slot->outline; + + /* only oblique outline glyphs */ + if ( slot->format != FT_GLYPH_FORMAT_OUTLINE ) + return; + + /* we don't touch the advance width */ + + /* For italic, simply apply a shear transform, with an angle */ + /* of about 12 degrees. */ + + transform.xx = 0x10000L; + transform.yx = 0x00000L; + + transform.xy = 0x0366AL; + transform.yy = 0x10000L; + + FT_Outline_Transform( outline, &transform ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** EXPERIMENTAL EMBOLDENING SUPPORT ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* documentation is in ftsynth.h */ + + FT_EXPORT_DEF( void ) + FT_GlyphSlot_Embolden( FT_GlyphSlot slot ) + { + FT_Library library; + FT_Face face; + FT_Error error; + FT_Pos xstr, ystr; + + + if ( !slot ) + return; + + library = slot->library; + face = slot->face; + + if ( slot->format != FT_GLYPH_FORMAT_OUTLINE && + slot->format != FT_GLYPH_FORMAT_BITMAP ) + return; + + /* some reasonable strength */ + xstr = FT_MulFix( face->units_per_EM, + face->size->metrics.y_scale ) / 24; + ystr = xstr; + + if ( slot->format == FT_GLYPH_FORMAT_OUTLINE ) + FT_Outline_EmboldenXY( &slot->outline, xstr, ystr ); + + else /* slot->format == FT_GLYPH_FORMAT_BITMAP */ + { + /* round to full pixels */ + xstr &= ~63; + if ( xstr == 0 ) + xstr = 1 << 6; + ystr &= ~63; + + /* + * XXX: overflow check for 16-bit system, for compatibility + * with FT_GlyphSlot_Embolden() since FreeType 2.1.10. + * unfortunately, this function return no informations + * about the cause of error. + */ + if ( ( ystr >> 6 ) > FT_INT_MAX || ( ystr >> 6 ) < FT_INT_MIN ) + { + FT_TRACE1(( "FT_GlyphSlot_Embolden:" )); + FT_TRACE1(( "too strong emboldening parameter ystr=%d\n", ystr )); + return; + } + error = FT_GlyphSlot_Own_Bitmap( slot ); + if ( error ) + return; + + error = FT_Bitmap_Embolden( library, &slot->bitmap, xstr, ystr ); + if ( error ) + return; + } + + if ( slot->advance.x ) + slot->advance.x += xstr; + + if ( slot->advance.y ) + slot->advance.y += ystr; + + slot->metrics.width += xstr; + slot->metrics.height += ystr; + slot->metrics.horiAdvance += xstr; + slot->metrics.vertAdvance += ystr; + slot->metrics.horiBearingY += ystr; + + /* XXX: 16-bit overflow case must be excluded before here */ + if ( slot->format == FT_GLYPH_FORMAT_BITMAP ) + slot->bitmap_top += (FT_Int)( ystr >> 6 ); + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftsystem.c b/vendor/FreeType2/src/base/ftsystem.c new file mode 100644 index 0000000..6adebdb --- /dev/null +++ b/vendor/FreeType2/src/base/ftsystem.c @@ -0,0 +1,320 @@ +/***************************************************************************/ +/* */ +/* ftsystem.c */ +/* */ +/* ANSI-specific FreeType low-level system interface (body). */ +/* */ +/* Copyright 1996-2018 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 file contains the default interface used by FreeType to access */ + /* low-level, i.e. memory management, i/o access as well as thread */ + /* synchronisation. It can be replaced by user-specific routines if */ + /* necessary. */ + /* */ + /*************************************************************************/ + + +#include +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_SYSTEM_H +#include FT_ERRORS_H +#include FT_TYPES_H + + + /*************************************************************************/ + /* */ + /* MEMORY MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* It is not necessary to do any error checking for the */ + /* allocation-related functions. This will be done by the higher level */ + /* routines like ft_mem_alloc() or ft_mem_realloc(). */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* ft_alloc */ + /* */ + /* */ + /* The memory allocation function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* size :: The requested size in bytes. */ + /* */ + /* */ + /* The address of newly allocated block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_alloc( FT_Memory memory, + long size ) + { + FT_UNUSED( memory ); + + return ft_smalloc( (size_t)size ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_realloc */ + /* */ + /* */ + /* The memory reallocation function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* cur_size :: The current size of the allocated memory block. */ + /* */ + /* new_size :: The newly requested size in bytes. */ + /* */ + /* block :: The current address of the block in memory. */ + /* */ + /* */ + /* The address of the reallocated memory block. */ + /* */ + FT_CALLBACK_DEF( void* ) + ft_realloc( FT_Memory memory, + long cur_size, + long new_size, + void* block ) + { + FT_UNUSED( memory ); + FT_UNUSED( cur_size ); + + return ft_srealloc( block, (size_t)new_size ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_free */ + /* */ + /* */ + /* The memory release function. */ + /* */ + /* */ + /* memory :: A pointer to the memory object. */ + /* */ + /* block :: The address of block in memory to be freed. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_free( FT_Memory memory, + void* block ) + { + FT_UNUSED( memory ); + + ft_sfree( block ); + } + + + /*************************************************************************/ + /* */ + /* RESOURCE MANAGEMENT INTERFACE */ + /* */ + /*************************************************************************/ + +#ifndef FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT + + /*************************************************************************/ + /* */ + /* 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_io + + /* We use the macro STREAM_FILE for convenience to extract the */ + /* system-specific stream handle from a given FreeType stream object */ +#define STREAM_FILE( stream ) ( (FT_FILE*)stream->descriptor.pointer ) + + + /*************************************************************************/ + /* */ + /* */ + /* ft_ansi_stream_close */ + /* */ + /* */ + /* The function to close a stream. */ + /* */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + FT_CALLBACK_DEF( void ) + ft_ansi_stream_close( FT_Stream stream ) + { + ft_fclose( STREAM_FILE( stream ) ); + + stream->descriptor.pointer = NULL; + stream->size = 0; + stream->base = NULL; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_ansi_stream_io */ + /* */ + /* */ + /* The function to open a stream. */ + /* */ + /* */ + /* stream :: A pointer to the stream object. */ + /* */ + /* offset :: The position in the data stream to start reading. */ + /* */ + /* buffer :: The address of buffer to store the read data. */ + /* */ + /* count :: The number of bytes to read from the stream. */ + /* */ + /* */ + /* The number of bytes actually read. If `count' is zero (this is, */ + /* the function is used for seeking), a non-zero return value */ + /* indicates an error. */ + /* */ + FT_CALLBACK_DEF( unsigned long ) + ft_ansi_stream_io( FT_Stream stream, + unsigned long offset, + unsigned char* buffer, + unsigned long count ) + { + FT_FILE* file; + + + if ( !count && offset > stream->size ) + return 1; + + file = STREAM_FILE( stream ); + + if ( stream->pos != offset ) + ft_fseek( file, (long)offset, SEEK_SET ); + + return (unsigned long)ft_fread( buffer, 1, count, file ); + } + + + /* documentation is in ftstream.h */ + + FT_BASE_DEF( FT_Error ) + FT_Stream_Open( FT_Stream stream, + const char* filepathname ) + { + FT_FILE* file; + + + if ( !stream ) + return FT_THROW( Invalid_Stream_Handle ); + + stream->descriptor.pointer = NULL; + stream->pathname.pointer = (char*)filepathname; + stream->base = NULL; + stream->pos = 0; + stream->read = NULL; + stream->close = NULL; + + file = ft_fopen( filepathname, "rb" ); + if ( !file ) + { + FT_ERROR(( "FT_Stream_Open:" + " could not open `%s'\n", filepathname )); + + return FT_THROW( Cannot_Open_Resource ); + } + + ft_fseek( file, 0, SEEK_END ); + stream->size = (unsigned long)ft_ftell( file ); + if ( !stream->size ) + { + FT_ERROR(( "FT_Stream_Open:" )); + FT_ERROR(( " opened `%s' but zero-sized\n", filepathname )); + ft_fclose( file ); + return FT_THROW( Cannot_Open_Stream ); + } + ft_fseek( file, 0, SEEK_SET ); + + stream->descriptor.pointer = file; + stream->read = ft_ansi_stream_io; + stream->close = ft_ansi_stream_close; + + FT_TRACE1(( "FT_Stream_Open:" )); + FT_TRACE1(( " opened `%s' (%d bytes) successfully\n", + filepathname, stream->size )); + + return FT_Err_Ok; + } + +#endif /* !FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ + +#ifdef FT_DEBUG_MEMORY + + extern FT_Int + ft_mem_debug_init( FT_Memory memory ); + + extern void + ft_mem_debug_done( FT_Memory memory ); + +#endif + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( FT_Memory ) + FT_New_Memory( void ) + { + FT_Memory memory; + + + memory = (FT_Memory)ft_smalloc( sizeof ( *memory ) ); + if ( memory ) + { + memory->user = NULL; + memory->alloc = ft_alloc; + memory->realloc = ft_realloc; + memory->free = ft_free; +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_init( memory ); +#endif + } + + return memory; + } + + + /* documentation is in ftobjs.h */ + + FT_BASE_DEF( void ) + FT_Done_Memory( FT_Memory memory ) + { +#ifdef FT_DEBUG_MEMORY + ft_mem_debug_done( memory ); +#endif + ft_sfree( memory ); + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/fttrigon.c b/vendor/FreeType2/src/base/fttrigon.c new file mode 100644 index 0000000..d6dd098 --- /dev/null +++ b/vendor/FreeType2/src/base/fttrigon.c @@ -0,0 +1,526 @@ +/***************************************************************************/ +/* */ +/* fttrigon.c */ +/* */ +/* FreeType trigonometric functions (body). */ +/* */ +/* Copyright 2001-2018 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 is a fixed-point CORDIC implementation of trigonometric */ + /* functions as well as transformations between Cartesian and polar */ + /* coordinates. The angles are represented as 16.16 fixed-point values */ + /* in degrees, i.e., the angular resolution is 2^-16 degrees. Note that */ + /* only vectors longer than 2^16*180/pi (or at least 22 bits) on a */ + /* discrete Cartesian grid can have the same or better angular */ + /* resolution. Therefore, to maintain this precision, some functions */ + /* require an interim upscaling of the vectors, whereas others operate */ + /* with 24-bit long vectors directly. */ + /* */ + /*************************************************************************/ + +#include +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_CALC_H +#include FT_TRIGONOMETRY_H + + + /* the Cordic shrink factor 0.858785336480436 * 2^32 */ +#define FT_TRIG_SCALE 0xDBD95B16UL + + /* the highest bit in overflow-safe vector components, */ + /* MSB of 0.858785336480436 * sqrt(0.5) * 2^30 */ +#define FT_TRIG_SAFE_MSB 29 + + /* this table was generated for FT_PI = 180L << 16, i.e. degrees */ +#define FT_TRIG_MAX_ITERS 23 + + static const FT_Angle + ft_trig_arctan_table[] = + { + 1740967L, 919879L, 466945L, 234379L, 117304L, 58666L, 29335L, + 14668L, 7334L, 3667L, 1833L, 917L, 458L, 229L, 115L, + 57L, 29L, 14L, 7L, 4L, 2L, 1L + }; + + +#ifdef FT_LONG64 + + /* multiply a given value by the CORDIC shrink factor */ + static FT_Fixed + ft_trig_downscale( FT_Fixed val ) + { + FT_Int s = 1; + + + if ( val < 0 ) + { + val = -val; + s = -1; + } + + /* 0x40000000 comes from regression analysis between true */ + /* and CORDIC hypotenuse, so it minimizes the error */ + val = (FT_Fixed)( + ( (FT_UInt64)val * FT_TRIG_SCALE + 0x40000000UL ) >> 32 ); + + return s < 0 ? -val : val; + } + +#else /* !FT_LONG64 */ + + /* multiply a given value by the CORDIC shrink factor */ + static FT_Fixed + ft_trig_downscale( FT_Fixed val ) + { + FT_Int s = 1; + FT_UInt32 lo1, hi1, lo2, hi2, lo, hi, i1, i2; + + + if ( val < 0 ) + { + val = -val; + s = -1; + } + + lo1 = (FT_UInt32)val & 0x0000FFFFU; + hi1 = (FT_UInt32)val >> 16; + lo2 = FT_TRIG_SCALE & 0x0000FFFFU; + hi2 = FT_TRIG_SCALE >> 16; + + lo = lo1 * lo2; + i1 = lo1 * hi2; + i2 = lo2 * hi1; + hi = hi1 * hi2; + + /* Check carry overflow of i1 + i2 */ + i1 += i2; + hi += (FT_UInt32)( i1 < i2 ) << 16; + + hi += i1 >> 16; + i1 = i1 << 16; + + /* Check carry overflow of i1 + lo */ + lo += i1; + hi += ( lo < i1 ); + + /* 0x40000000 comes from regression analysis between true */ + /* and CORDIC hypotenuse, so it minimizes the error */ + + /* Check carry overflow of lo + 0x40000000 */ + lo += 0x40000000UL; + hi += ( lo < 0x40000000UL ); + + val = (FT_Fixed)hi; + + return s < 0 ? -val : val; + } + +#endif /* !FT_LONG64 */ + + + /* undefined and never called for zero vector */ + static FT_Int + ft_trig_prenorm( FT_Vector* vec ) + { + FT_Pos x, y; + FT_Int shift; + + + x = vec->x; + y = vec->y; + + shift = FT_MSB( (FT_UInt32)( FT_ABS( x ) | FT_ABS( y ) ) ); + + if ( shift <= FT_TRIG_SAFE_MSB ) + { + shift = FT_TRIG_SAFE_MSB - shift; + vec->x = (FT_Pos)( (FT_ULong)x << shift ); + vec->y = (FT_Pos)( (FT_ULong)y << shift ); + } + else + { + shift -= FT_TRIG_SAFE_MSB; + vec->x = x >> shift; + vec->y = y >> shift; + shift = -shift; + } + + return shift; + } + + + static void + ft_trig_pseudo_rotate( FT_Vector* vec, + FT_Angle theta ) + { + FT_Int i; + FT_Fixed x, y, xtemp, b; + const FT_Angle *arctanptr; + + + x = vec->x; + y = vec->y; + + /* Rotate inside [-PI/4,PI/4] sector */ + while ( theta < -FT_ANGLE_PI4 ) + { + xtemp = y; + y = -x; + x = xtemp; + theta += FT_ANGLE_PI2; + } + + while ( theta > FT_ANGLE_PI4 ) + { + xtemp = -y; + y = x; + x = xtemp; + theta -= FT_ANGLE_PI2; + } + + arctanptr = ft_trig_arctan_table; + + /* Pseudorotations, with right shifts */ + for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ ) + { + if ( theta < 0 ) + { + xtemp = x + ( ( y + b ) >> i ); + y = y - ( ( x + b ) >> i ); + x = xtemp; + theta += *arctanptr++; + } + else + { + xtemp = x - ( ( y + b ) >> i ); + y = y + ( ( x + b ) >> i ); + x = xtemp; + theta -= *arctanptr++; + } + } + + vec->x = x; + vec->y = y; + } + + + static void + ft_trig_pseudo_polarize( FT_Vector* vec ) + { + FT_Angle theta; + FT_Int i; + FT_Fixed x, y, xtemp, b; + const FT_Angle *arctanptr; + + + x = vec->x; + y = vec->y; + + /* Get the vector into [-PI/4,PI/4] sector */ + if ( y > x ) + { + if ( y > -x ) + { + theta = FT_ANGLE_PI2; + xtemp = y; + y = -x; + x = xtemp; + } + else + { + theta = y > 0 ? FT_ANGLE_PI : -FT_ANGLE_PI; + x = -x; + y = -y; + } + } + else + { + if ( y < -x ) + { + theta = -FT_ANGLE_PI2; + xtemp = -y; + y = x; + x = xtemp; + } + else + { + theta = 0; + } + } + + arctanptr = ft_trig_arctan_table; + + /* Pseudorotations, with right shifts */ + for ( i = 1, b = 1; i < FT_TRIG_MAX_ITERS; b <<= 1, i++ ) + { + if ( y > 0 ) + { + xtemp = x + ( ( y + b ) >> i ); + y = y - ( ( x + b ) >> i ); + x = xtemp; + theta += *arctanptr++; + } + else + { + xtemp = x - ( ( y + b ) >> i ); + y = y + ( ( x + b ) >> i ); + x = xtemp; + theta -= *arctanptr++; + } + } + + /* round theta to acknowledge its error that mostly comes */ + /* from accumulated rounding errors in the arctan table */ + if ( theta >= 0 ) + theta = FT_PAD_ROUND( theta, 16 ); + else + theta = -FT_PAD_ROUND( -theta, 16 ); + + vec->x = x; + vec->y = theta; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Cos( FT_Angle angle ) + { + FT_Vector v; + + + FT_Vector_Unit( &v, angle ); + + return v.x; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Sin( FT_Angle angle ) + { + FT_Vector v; + + + FT_Vector_Unit( &v, angle ); + + return v.y; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Tan( FT_Angle angle ) + { + FT_Vector v; + + + FT_Vector_Unit( &v, angle ); + + return FT_DivFix( v.y, v.x ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Angle ) + FT_Atan2( FT_Fixed dx, + FT_Fixed dy ) + { + FT_Vector v; + + + if ( dx == 0 && dy == 0 ) + return 0; + + v.x = dx; + v.y = dy; + ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + return v.y; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Unit( FT_Vector* vec, + FT_Angle angle ) + { + if ( !vec ) + return; + + vec->x = FT_TRIG_SCALE >> 8; + vec->y = 0; + ft_trig_pseudo_rotate( vec, angle ); + vec->x = ( vec->x + 0x80L ) >> 8; + vec->y = ( vec->y + 0x80L ) >> 8; + } + + + /* these macros return 0 for positive numbers, + and -1 for negative ones */ +#define FT_SIGN_LONG( x ) ( (x) >> ( FT_SIZEOF_LONG * 8 - 1 ) ) +#define FT_SIGN_INT( x ) ( (x) >> ( FT_SIZEOF_INT * 8 - 1 ) ) +#define FT_SIGN_INT32( x ) ( (x) >> 31 ) +#define FT_SIGN_INT16( x ) ( (x) >> 15 ) + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Rotate( FT_Vector* vec, + FT_Angle angle ) + { + FT_Int shift; + FT_Vector v; + + + if ( !vec || !angle ) + return; + + v = *vec; + + if ( v.x == 0 && v.y == 0 ) + return; + + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_rotate( &v, angle ); + v.x = ft_trig_downscale( v.x ); + v.y = ft_trig_downscale( v.y ); + + if ( shift > 0 ) + { + FT_Int32 half = (FT_Int32)1L << ( shift - 1 ); + + + vec->x = ( v.x + half + FT_SIGN_LONG( v.x ) ) >> shift; + vec->y = ( v.y + half + FT_SIGN_LONG( v.y ) ) >> shift; + } + else + { + shift = -shift; + vec->x = (FT_Pos)( (FT_ULong)v.x << shift ); + vec->y = (FT_Pos)( (FT_ULong)v.y << shift ); + } + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Fixed ) + FT_Vector_Length( FT_Vector* vec ) + { + FT_Int shift; + FT_Vector v; + + + if ( !vec ) + return 0; + + v = *vec; + + /* handle trivial cases */ + if ( v.x == 0 ) + { + return FT_ABS( v.y ); + } + else if ( v.y == 0 ) + { + return FT_ABS( v.x ); + } + + /* general case */ + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + v.x = ft_trig_downscale( v.x ); + + if ( shift > 0 ) + return ( v.x + ( 1L << ( shift - 1 ) ) ) >> shift; + + return (FT_Fixed)( (FT_UInt32)v.x << -shift ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_Polarize( FT_Vector* vec, + FT_Fixed *length, + FT_Angle *angle ) + { + FT_Int shift; + FT_Vector v; + + + if ( !vec || !length || !angle ) + return; + + v = *vec; + + if ( v.x == 0 && v.y == 0 ) + return; + + shift = ft_trig_prenorm( &v ); + ft_trig_pseudo_polarize( &v ); + + v.x = ft_trig_downscale( v.x ); + + *length = shift >= 0 ? ( v.x >> shift ) + : (FT_Fixed)( (FT_UInt32)v.x << -shift ); + *angle = v.y; + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( void ) + FT_Vector_From_Polar( FT_Vector* vec, + FT_Fixed length, + FT_Angle angle ) + { + if ( !vec ) + return; + + vec->x = length; + vec->y = 0; + + FT_Vector_Rotate( vec, angle ); + } + + + /* documentation is in fttrigon.h */ + + FT_EXPORT_DEF( FT_Angle ) + FT_Angle_Diff( FT_Angle angle1, + FT_Angle angle2 ) + { + FT_Angle delta = angle2 - angle1; + + + while ( delta <= -FT_ANGLE_PI ) + delta += FT_ANGLE_2PI; + + while ( delta > FT_ANGLE_PI ) + delta -= FT_ANGLE_2PI; + + return delta; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/fttype1.c b/vendor/FreeType2/src/base/fttype1.c new file mode 100644 index 0000000..aa8f8cc --- /dev/null +++ b/vendor/FreeType2/src/base/fttype1.c @@ -0,0 +1,127 @@ +/***************************************************************************/ +/* */ +/* fttype1.c */ +/* */ +/* FreeType utility file for PS names support (body). */ +/* */ +/* Copyright 2002-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_POSTSCRIPT_INFO_H + + + /* documentation is in t1tables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PS_Font_Info( FT_Face face, + PS_FontInfoRec* afont_info ) + { + FT_Error error; + FT_Service_PsInfo service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !afont_info ) + return FT_THROW( Invalid_Argument ); + + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_get_font_info ) + error = service->ps_get_font_info( face, afont_info ); + else + error = FT_THROW( Invalid_Argument ); + + return error; + } + + + /* documentation is in t1tables.h */ + + FT_EXPORT_DEF( FT_Int ) + FT_Has_PS_Glyph_Names( FT_Face face ) + { + FT_Int result = 0; + FT_Service_PsInfo service; + + + if ( face ) + { + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_has_glyph_names ) + result = service->ps_has_glyph_names( face ); + } + + return result; + } + + + /* documentation is in t1tables.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_PS_Font_Private( FT_Face face, + PS_PrivateRec* afont_private ) + { + FT_Error error; + FT_Service_PsInfo service; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !afont_private ) + return FT_THROW( Invalid_Argument ); + + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_get_font_private ) + error = service->ps_get_font_private( face, afont_private ); + else + error = FT_THROW( Invalid_Argument ); + + return error; + } + + + /* documentation is in t1tables.h */ + + FT_EXPORT_DEF( FT_Long ) + FT_Get_PS_Font_Value( FT_Face face, + PS_Dict_Keys key, + FT_UInt idx, + void *value, + FT_Long value_len ) + { + FT_Int result = 0; + FT_Service_PsInfo service = NULL; + + + if ( face ) + { + FT_FACE_FIND_SERVICE( face, service, POSTSCRIPT_INFO ); + + if ( service && service->ps_get_font_value ) + result = service->ps_get_font_value( face, key, idx, + value, value_len ); + } + + return result; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftutil.c b/vendor/FreeType2/src/base/ftutil.c new file mode 100644 index 0000000..4de5f2c --- /dev/null +++ b/vendor/FreeType2/src/base/ftutil.c @@ -0,0 +1,443 @@ +/***************************************************************************/ +/* */ +/* ftutil.c */ +/* */ +/* FreeType utility file for memory and list management (body). */ +/* */ +/* Copyright 2002-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_MEMORY_H +#include FT_INTERNAL_OBJECTS_H +#include FT_LIST_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_memory + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** *****/ + /***** M E M O R Y M A N A G E M E N T *****/ + /***** *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_alloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ) + { + FT_Error error; + FT_Pointer block = ft_mem_qalloc( memory, size, &error ); + + if ( !error && size > 0 ) + FT_MEM_ZERO( block, size ); + + *p_error = error; + return block; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_qalloc( FT_Memory memory, + FT_Long size, + FT_Error *p_error ) + { + FT_Error error = FT_Err_Ok; + FT_Pointer block = NULL; + + + if ( size > 0 ) + { + block = memory->alloc( memory, size ); + if ( !block ) + error = FT_THROW( Out_Of_Memory ); + } + else if ( size < 0 ) + { + /* may help catch/prevent security issues */ + error = FT_THROW( Invalid_Argument ); + } + + *p_error = error; + return block; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_realloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ) + { + FT_Error error = FT_Err_Ok; + + + block = ft_mem_qrealloc( memory, item_size, + cur_count, new_count, block, &error ); + if ( !error && new_count > cur_count ) + FT_MEM_ZERO( (char*)block + cur_count * item_size, + ( new_count - cur_count ) * item_size ); + + *p_error = error; + return block; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_qrealloc( FT_Memory memory, + FT_Long item_size, + FT_Long cur_count, + FT_Long new_count, + void* block, + FT_Error *p_error ) + { + FT_Error error = FT_Err_Ok; + + + /* Note that we now accept `item_size == 0' as a valid parameter, in + * order to cover very weird cases where an ALLOC_MULT macro would be + * called. + */ + if ( cur_count < 0 || new_count < 0 || item_size < 0 ) + { + /* may help catch/prevent nasty security issues */ + error = FT_THROW( Invalid_Argument ); + } + else if ( new_count == 0 || item_size == 0 ) + { + ft_mem_free( memory, block ); + block = NULL; + } + else if ( new_count > FT_INT_MAX / item_size ) + { + error = FT_THROW( Array_Too_Large ); + } + else if ( cur_count == 0 ) + { + FT_ASSERT( !block ); + + block = memory->alloc( memory, new_count * item_size ); + if ( block == NULL ) + error = FT_THROW( Out_Of_Memory ); + } + else + { + FT_Pointer block2; + FT_Long cur_size = cur_count * item_size; + FT_Long new_size = new_count * item_size; + + + block2 = memory->realloc( memory, cur_size, new_size, block ); + if ( !block2 ) + error = FT_THROW( Out_Of_Memory ); + else + block = block2; + } + + *p_error = error; + return block; + } + + + FT_BASE_DEF( void ) + ft_mem_free( FT_Memory memory, + const void *P ) + { + if ( P ) + memory->free( memory, (void*)P ); + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_dup( FT_Memory memory, + const void* address, + FT_ULong size, + FT_Error *p_error ) + { + FT_Error error; + FT_Pointer p = ft_mem_qalloc( memory, (FT_Long)size, &error ); + + + if ( !error && address ) + ft_memcpy( p, address, size ); + + *p_error = error; + return p; + } + + + FT_BASE_DEF( FT_Pointer ) + ft_mem_strdup( FT_Memory memory, + const char* str, + FT_Error *p_error ) + { + FT_ULong len = str ? (FT_ULong)ft_strlen( str ) + 1 + : 0; + + + return ft_mem_dup( memory, str, len, p_error ); + } + + + FT_BASE_DEF( FT_Int ) + ft_mem_strcpyn( char* dst, + const char* src, + FT_ULong size ) + { + while ( size > 1 && *src != 0 ) + { + *dst++ = *src++; + size--; + } + + *dst = 0; /* always zero-terminate */ + + return *src != 0; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** *****/ + /***** D O U B L Y L I N K E D L I S T S *****/ + /***** *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + +#undef FT_COMPONENT +#define FT_COMPONENT trace_list + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( FT_ListNode ) + FT_List_Find( FT_List list, + void* data ) + { + FT_ListNode cur; + + + if ( !list ) + return NULL; + + cur = list->head; + while ( cur ) + { + if ( cur->data == data ) + return cur; + + cur = cur->next; + } + + return NULL; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Add( FT_List list, + FT_ListNode node ) + { + FT_ListNode before; + + + if ( !list || !node ) + return; + + before = list->tail; + + node->next = NULL; + node->prev = before; + + if ( before ) + before->next = node; + else + list->head = node; + + list->tail = node; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Insert( FT_List list, + FT_ListNode node ) + { + FT_ListNode after; + + + if ( !list || !node ) + return; + + after = list->head; + + node->next = after; + node->prev = NULL; + + if ( !after ) + list->tail = node; + else + after->prev = node; + + list->head = node; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Remove( FT_List list, + FT_ListNode node ) + { + FT_ListNode before, after; + + + if ( !list || !node ) + return; + + before = node->prev; + after = node->next; + + if ( before ) + before->next = after; + else + list->head = after; + + if ( after ) + after->prev = before; + else + list->tail = before; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Up( FT_List list, + FT_ListNode node ) + { + FT_ListNode before, after; + + + if ( !list || !node ) + return; + + before = node->prev; + after = node->next; + + /* check whether we are already on top of the list */ + if ( !before ) + return; + + before->next = after; + + if ( after ) + after->prev = before; + else + list->tail = before; + + node->prev = NULL; + node->next = list->head; + list->head->prev = node; + list->head = node; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_List_Iterate( FT_List list, + FT_List_Iterator iterator, + void* user ) + { + FT_ListNode cur; + FT_Error error = FT_Err_Ok; + + + if ( !list || !iterator ) + return FT_THROW( Invalid_Argument ); + + cur = list->head; + + while ( cur ) + { + FT_ListNode next = cur->next; + + + error = iterator( cur, user ); + if ( error ) + break; + + cur = next; + } + + return error; + } + + + /* documentation is in ftlist.h */ + + FT_EXPORT_DEF( void ) + FT_List_Finalize( FT_List list, + FT_List_Destructor destroy, + FT_Memory memory, + void* user ) + { + FT_ListNode cur; + + + if ( !list || !memory ) + return; + + cur = list->head; + while ( cur ) + { + FT_ListNode next = cur->next; + void* data = cur->data; + + + if ( destroy ) + destroy( memory, data, user ); + + FT_FREE( cur ); + cur = next; + } + + list->head = NULL; + list->tail = NULL; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/ftver.rc b/vendor/FreeType2/src/base/ftver.rc new file mode 100644 index 0000000..a2903d5 --- /dev/null +++ b/vendor/FreeType2/src/base/ftver.rc @@ -0,0 +1,61 @@ +/***************************************************************************/ +/* */ +/* ftver.rc */ +/* */ +/* FreeType VERSIONINFO resource for Windows DLLs. */ +/* */ +/* Copyright 2018 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. */ +/* */ +/***************************************************************************/ + + +#include + +#define FT_VERSION 2,9,1,0 +#define FT_VERSION_STR "2.9.1" + +VS_VERSION_INFO VERSIONINFO +FILEVERSION FT_VERSION +PRODUCTVERSION FT_VERSION +FILEFLAGSMASK VS_FFI_FILEFLAGSMASK +#ifdef _DEBUG +FILEFLAGS VS_FF_DEBUG +#endif +#ifdef _DLL +FILETYPE VFT_DLL +#define FT_FILENAME "freetype.dll" +#else +FILETYPE VFT_STATIC_LIB +#define FT_FILENAME "freetype.lib" +#endif +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904E4" + BEGIN + VALUE "CompanyName", "The FreeType Project" + VALUE "FileDescription", "Font Rendering Library" + VALUE "FileVersion", FT_VERSION_STR + VALUE "ProductName", "FreeType" + VALUE "ProductVersion", FT_VERSION_STR + VALUE "LegalCopyright", "\251 2018 The FreeType Project www.freetype.org. All rights reserved." + VALUE "InternalName", "freetype" + VALUE "OriginalFilename", FT_FILENAME + END + END + + BLOCK "VarFileInfo" + BEGIN + /* The following line should only be modified for localized versions. */ + /* It consists of any number of WORD,WORD pairs, with each pair */ + /* describing a "language,codepage" combination supported by the file. */ + VALUE "Translation", 0x409, 1252 + END +END diff --git a/vendor/FreeType2/src/base/ftwinfnt.c b/vendor/FreeType2/src/base/ftwinfnt.c new file mode 100644 index 0000000..11bd28a --- /dev/null +++ b/vendor/FreeType2/src/base/ftwinfnt.c @@ -0,0 +1,53 @@ +/***************************************************************************/ +/* */ +/* ftwinfnt.c */ +/* */ +/* FreeType API for accessing Windows FNT specific info (body). */ +/* */ +/* Copyright 2003-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_WINFONTS_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_WINFNT_H + + + /* documentation is in ftwinfnt.h */ + + FT_EXPORT_DEF( FT_Error ) + FT_Get_WinFNT_Header( FT_Face face, + FT_WinFNT_HeaderRec *header ) + { + FT_Service_WinFnt service; + FT_Error error; + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( !header ) + return FT_THROW( Invalid_Argument ); + + FT_FACE_LOOKUP_SERVICE( face, service, WINFNT ); + + if ( service ) + error = service->get_header( face, header ); + else + error = FT_THROW( Invalid_Argument ); + + return error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/base/md5.c b/vendor/FreeType2/src/base/md5.c new file mode 100644 index 0000000..b235e17 --- /dev/null +++ b/vendor/FreeType2/src/base/md5.c @@ -0,0 +1,291 @@ +/* + * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. + * MD5 Message-Digest Algorithm (RFC 1321). + * + * Homepage: + * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 + * + * Author: + * Alexander Peslyak, better known as Solar Designer + * + * This software was written by Alexander Peslyak in 2001. No copyright is + * claimed, and the software is hereby placed in the public domain. + * In case this attempt to disclaim copyright and place the software in the + * public domain is deemed null and void, then the software is + * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the + * general public under the following terms: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * There's ABSOLUTELY NO WARRANTY, express or implied. + * + * (This is a heavily cut-down "BSD license".) + * + * This differs from Colin Plumb's older public domain implementation in that + * no exactly 32-bit integer data type is required (any 32-bit or wider + * unsigned integer data type will do), there's no compile-time endianness + * configuration, and the function prototypes match OpenSSL's. No code from + * Colin Plumb's implementation has been reused; this comment merely compares + * the properties of the two independent implementations. + * + * The primary goals of this implementation are portability and ease of use. + * It is meant to be fast, but not as fast as possible. Some known + * optimizations are not included to reduce source code size and avoid + * compile-time configuration. + */ + +#ifndef HAVE_OPENSSL + +#include + +#include "md5.h" + +/* + * The basic MD5 functions. + * + * F and G are optimized compared to their RFC 1321 definitions for + * architectures that lack an AND-NOT instruction, just like in Colin Plumb's + * implementation. + */ +#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z)))) +#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y)))) +#define H(x, y, z) (((x) ^ (y)) ^ (z)) +#define H2(x, y, z) ((x) ^ ((y) ^ (z))) +#define I(x, y, z) ((y) ^ ((x) | ~(z))) + +/* + * The MD5 transformation for all four rounds. + */ +#define STEP(f, a, b, c, d, x, t, s) \ + (a) += f((b), (c), (d)) + (x) + (t); \ + (a) = (((a) << (s)) | (((a) & 0xffffffff) >> (32 - (s)))); \ + (a) += (b); + +/* + * SET reads 4 input bytes in little-endian byte order and stores them in a + * properly aligned word in host byte order. + * + * The check for little-endian architectures that tolerate unaligned memory + * accesses is just an optimization. Nothing will break if it fails to detect + * a suitable architecture. + * + * Unfortunately, this optimization may be a C strict aliasing rules violation + * if the caller's data buffer has effective type that cannot be aliased by + * MD5_u32plus. In practice, this problem may occur if these MD5 routines are + * inlined into a calling function, or with future and dangerously advanced + * link-time optimizations. For the time being, keeping these MD5 routines in + * their own translation unit avoids the problem. + */ +#if defined(__i386__) || defined(__x86_64__) || defined(__vax__) +#define SET(n) \ + (*(MD5_u32plus *)&ptr[(n) * 4]) +#define GET(n) \ + SET(n) +#else +#define SET(n) \ + (ctx->block[(n)] = \ + (MD5_u32plus)ptr[(n) * 4] | \ + ((MD5_u32plus)ptr[(n) * 4 + 1] << 8) | \ + ((MD5_u32plus)ptr[(n) * 4 + 2] << 16) | \ + ((MD5_u32plus)ptr[(n) * 4 + 3] << 24)) +#define GET(n) \ + (ctx->block[(n)]) +#endif + +/* + * This processes one or more 64-byte data blocks, but does NOT update the bit + * counters. There are no alignment requirements. + */ +static const void *body(MD5_CTX *ctx, const void *data, unsigned long size) +{ + const unsigned char *ptr; + MD5_u32plus a, b, c, d; + MD5_u32plus saved_a, saved_b, saved_c, saved_d; + + ptr = (const unsigned char *)data; + + a = ctx->a; + b = ctx->b; + c = ctx->c; + d = ctx->d; + + do { + saved_a = a; + saved_b = b; + saved_c = c; + saved_d = d; + +/* Round 1 */ + STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7) + STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12) + STEP(F, c, d, a, b, SET(2), 0x242070db, 17) + STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22) + STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7) + STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12) + STEP(F, c, d, a, b, SET(6), 0xa8304613, 17) + STEP(F, b, c, d, a, SET(7), 0xfd469501, 22) + STEP(F, a, b, c, d, SET(8), 0x698098d8, 7) + STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12) + STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17) + STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22) + STEP(F, a, b, c, d, SET(12), 0x6b901122, 7) + STEP(F, d, a, b, c, SET(13), 0xfd987193, 12) + STEP(F, c, d, a, b, SET(14), 0xa679438e, 17) + STEP(F, b, c, d, a, SET(15), 0x49b40821, 22) + +/* Round 2 */ + STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5) + STEP(G, d, a, b, c, GET(6), 0xc040b340, 9) + STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14) + STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20) + STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5) + STEP(G, d, a, b, c, GET(10), 0x02441453, 9) + STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14) + STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20) + STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5) + STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9) + STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14) + STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20) + STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5) + STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9) + STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14) + STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20) + +/* Round 3 */ + STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4) + STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11) + STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16) + STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23) + STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4) + STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11) + STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16) + STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23) + STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4) + STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11) + STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16) + STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23) + STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4) + STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11) + STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16) + STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23) + +/* Round 4 */ + STEP(I, a, b, c, d, GET(0), 0xf4292244, 6) + STEP(I, d, a, b, c, GET(7), 0x432aff97, 10) + STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15) + STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21) + STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6) + STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10) + STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15) + STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21) + STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6) + STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10) + STEP(I, c, d, a, b, GET(6), 0xa3014314, 15) + STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21) + STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6) + STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10) + STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15) + STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21) + + a += saved_a; + b += saved_b; + c += saved_c; + d += saved_d; + + ptr += 64; + } while (size -= 64); + + ctx->a = a; + ctx->b = b; + ctx->c = c; + ctx->d = d; + + return ptr; +} + +void MD5_Init(MD5_CTX *ctx) +{ + ctx->a = 0x67452301; + ctx->b = 0xefcdab89; + ctx->c = 0x98badcfe; + ctx->d = 0x10325476; + + ctx->lo = 0; + ctx->hi = 0; +} + +void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size) +{ + MD5_u32plus saved_lo; + unsigned long used, available; + + saved_lo = ctx->lo; + if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo) + ctx->hi++; + ctx->hi += size >> 29; + + used = saved_lo & 0x3f; + + if (used) { + available = 64 - used; + + if (size < available) { + memcpy(&ctx->buffer[used], data, size); + return; + } + + memcpy(&ctx->buffer[used], data, available); + data = (const unsigned char *)data + available; + size -= available; + body(ctx, ctx->buffer, 64); + } + + if (size >= 64) { + data = body(ctx, data, size & ~(unsigned long)0x3f); + size &= 0x3f; + } + + memcpy(ctx->buffer, data, size); +} + +#define OUT(dst, src) \ + (dst)[0] = (unsigned char)(src); \ + (dst)[1] = (unsigned char)((src) >> 8); \ + (dst)[2] = (unsigned char)((src) >> 16); \ + (dst)[3] = (unsigned char)((src) >> 24); + +void MD5_Final(unsigned char *result, MD5_CTX *ctx) +{ + unsigned long used, available; + + used = ctx->lo & 0x3f; + + ctx->buffer[used++] = 0x80; + + available = 64 - used; + + if (available < 8) { + memset(&ctx->buffer[used], 0, available); + body(ctx, ctx->buffer, 64); + used = 0; + available = 64; + } + + memset(&ctx->buffer[used], 0, available - 8); + + ctx->lo <<= 3; + OUT(&ctx->buffer[56], ctx->lo) + OUT(&ctx->buffer[60], ctx->hi) + + body(ctx, ctx->buffer, 64); + + OUT(&result[0], ctx->a) + OUT(&result[4], ctx->b) + OUT(&result[8], ctx->c) + OUT(&result[12], ctx->d) + + memset(ctx, 0, sizeof(*ctx)); +} + +#endif diff --git a/vendor/FreeType2/src/base/md5.h b/vendor/FreeType2/src/base/md5.h new file mode 100644 index 0000000..2da44bf --- /dev/null +++ b/vendor/FreeType2/src/base/md5.h @@ -0,0 +1,45 @@ +/* + * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. + * MD5 Message-Digest Algorithm (RFC 1321). + * + * Homepage: + * http://openwall.info/wiki/people/solar/software/public-domain-source-code/md5 + * + * Author: + * Alexander Peslyak, better known as Solar Designer + * + * This software was written by Alexander Peslyak in 2001. No copyright is + * claimed, and the software is hereby placed in the public domain. + * In case this attempt to disclaim copyright and place the software in the + * public domain is deemed null and void, then the software is + * Copyright (c) 2001 Alexander Peslyak and it is hereby released to the + * general public under the following terms: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. + * + * There's ABSOLUTELY NO WARRANTY, express or implied. + * + * See md5.c for more information. + */ + +#ifdef HAVE_OPENSSL +#include +#elif !defined(_MD5_H) +#define _MD5_H + +/* Any 32-bit or wider unsigned integer data type will do */ +typedef unsigned int MD5_u32plus; + +typedef struct { + MD5_u32plus lo, hi; + MD5_u32plus a, b, c, d; + unsigned char buffer[64]; + MD5_u32plus block[16]; +} MD5_CTX; + +extern void MD5_Init(MD5_CTX *ctx); +extern void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size); +extern void MD5_Final(unsigned char *result, MD5_CTX *ctx); + +#endif diff --git a/vendor/FreeType2/src/base/module.lua b/vendor/FreeType2/src/base/module.lua new file mode 100644 index 0000000..2197a30 --- /dev/null +++ b/vendor/FreeType2/src/base/module.lua @@ -0,0 +1,12 @@ + +local basepath = PathDir(ModuleFilename()) + +src = Module(basepath, { + "ftbase.c", + "ftinit.c", + "ftsystem.c", + "ftmm.c", + "ftstroke.c", + "ftglyph.c", + "ftbitmap.c" +}) diff --git a/vendor/FreeType2/src/cff/cff.c b/vendor/FreeType2/src/cff/cff.c new file mode 100644 index 0000000..1a755d5 --- /dev/null +++ b/vendor/FreeType2/src/cff/cff.c @@ -0,0 +1,30 @@ +/***************************************************************************/ +/* */ +/* cff.c */ +/* */ +/* FreeType OpenType driver component (body only). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT +#include + +#include "cffcmap.c" +#include "cffdrivr.c" +#include "cffgload.c" +#include "cffparse.c" +#include "cffpic.c" +#include "cffload.c" +#include "cffobjs.c" + +/* END */ diff --git a/vendor/FreeType2/src/cff/cffcmap.c b/vendor/FreeType2/src/cff/cffcmap.c new file mode 100644 index 0000000..e45ae11 --- /dev/null +++ b/vendor/FreeType2/src/cff/cffcmap.c @@ -0,0 +1,229 @@ +/***************************************************************************/ +/* */ +/* cffcmap.c */ +/* */ +/* CFF character mapping table (cmap) support (body). */ +/* */ +/* Copyright 2002-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include "cffcmap.h" +#include "cffload.h" + +#include "cfferrs.h" + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( FT_Error ) + cff_cmap_encoding_init( CFF_CMapStd cmap, + FT_Pointer pointer ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( cmap ); + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Encoding encoding = &cff->encoding; + + FT_UNUSED( pointer ); + + + cmap->gids = encoding->codes; + + return 0; + } + + + FT_CALLBACK_DEF( void ) + cff_cmap_encoding_done( CFF_CMapStd cmap ) + { + cmap->gids = NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_encoding_char_index( CFF_CMapStd cmap, + FT_UInt32 char_code ) + { + FT_UInt result = 0; + + + if ( char_code < 256 ) + result = cmap->gids[char_code]; + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + cff_cmap_encoding_char_next( CFF_CMapStd cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code; + + + *pchar_code = 0; + + if ( char_code < 255 ) + { + FT_UInt code = (FT_UInt)(char_code + 1); + + + for (;;) + { + if ( code >= 256 ) + break; + + result = cmap->gids[code]; + if ( result != 0 ) + { + *pchar_code = code; + break; + } + + code++; + } + } + return result; + } + + + FT_DEFINE_CMAP_CLASS( + cff_cmap_encoding_class_rec, + + sizeof ( CFF_CMapStdRec ), + + (FT_CMap_InitFunc) cff_cmap_encoding_init, /* init */ + (FT_CMap_DoneFunc) cff_cmap_encoding_done, /* done */ + (FT_CMap_CharIndexFunc)cff_cmap_encoding_char_index, /* char_index */ + (FT_CMap_CharNextFunc) cff_cmap_encoding_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ + ) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( const char* ) + cff_sid_to_glyph_name( TT_Face face, + FT_UInt idx ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Charset charset = &cff->charset; + FT_UInt sid = charset->sids[idx]; + + + return cff_index_get_sid_string( cff, sid ); + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_cmap_unicode_init( PS_Unicodes unicodes, + FT_Pointer pointer ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + CFF_Font cff = (CFF_Font)face->extra.data; + CFF_Charset charset = &cff->charset; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + FT_UNUSED( pointer ); + + + /* can't build Unicode map for CID-keyed font */ + /* because we don't know glyph names. */ + if ( !charset->sids ) + return FT_THROW( No_Unicode_Glyph_Name ); + + return psnames->unicodes_init( memory, + unicodes, + cff->num_glyphs, + (PS_GetGlyphNameFunc)&cff_sid_to_glyph_name, + (PS_FreeGlyphNameFunc)NULL, + (FT_Pointer)face ); + } + + + FT_CALLBACK_DEF( void ) + cff_cmap_unicode_done( PS_Unicodes unicodes ) + { + FT_Face face = FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( unicodes->maps ); + unicodes->num_maps = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + cff_cmap_unicode_char_index( PS_Unicodes unicodes, + FT_UInt32 char_code ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + return psnames->unicodes_char_index( unicodes, char_code ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + cff_cmap_unicode_char_next( PS_Unicodes unicodes, + FT_UInt32 *pchar_code ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)cff->psnames; + + + return psnames->unicodes_char_next( unicodes, pchar_code ); + } + + + FT_DEFINE_CMAP_CLASS( + cff_cmap_unicode_class_rec, + + sizeof ( PS_UnicodesRec ), + + (FT_CMap_InitFunc) cff_cmap_unicode_init, /* init */ + (FT_CMap_DoneFunc) cff_cmap_unicode_done, /* done */ + (FT_CMap_CharIndexFunc)cff_cmap_unicode_char_index, /* char_index */ + (FT_CMap_CharNextFunc) cff_cmap_unicode_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ + ) + + +/* END */ diff --git a/vendor/FreeType2/src/cff/cffcmap.h b/vendor/FreeType2/src/cff/cffcmap.h new file mode 100644 index 0000000..856a43d --- /dev/null +++ b/vendor/FreeType2/src/cff/cffcmap.h @@ -0,0 +1,67 @@ +/***************************************************************************/ +/* */ +/* cffcmap.h */ +/* */ +/* CFF character mapping table (cmap) support (specification). */ +/* */ +/* Copyright 2002-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef CFFCMAP_H_ +#define CFFCMAP_H_ + +#include FT_INTERNAL_CFF_OBJECTS_TYPES_H + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* standard (and expert) encoding cmaps */ + typedef struct CFF_CMapStdRec_* CFF_CMapStd; + + typedef struct CFF_CMapStdRec_ + { + FT_CMapRec cmap; + FT_UShort* gids; /* up to 256 elements */ + + } CFF_CMapStdRec; + + + FT_DECLARE_CMAP_CLASS(cff_cmap_encoding_class_rec) + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* unicode (synthetic) cmaps */ + + FT_DECLARE_CMAP_CLASS(cff_cmap_unicode_class_rec) + + +FT_END_HEADER + +#endif /* CFFCMAP_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/cff/cffdrivr.c b/vendor/FreeType2/src/cff/cffdrivr.c new file mode 100644 index 0000000..df89684 --- /dev/null +++ b/vendor/FreeType2/src/cff/cffdrivr.c @@ -0,0 +1,1143 @@ +/***************************************************************************/ +/* */ +/* cffdrivr.c */ +/* */ +/* OpenType font driver implementation (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_POSTSCRIPT_PROPS_H +#include FT_SERVICE_CID_H +#include FT_SERVICE_POSTSCRIPT_INFO_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_TT_CMAP_H +#include FT_SERVICE_CFF_TABLE_LOAD_H + +#include "cffdrivr.h" +#include "cffgload.h" +#include "cffload.h" +#include "cffcmap.h" +#include "cffparse.h" +#include "cffobjs.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_METRICS_VARIATIONS_H +#endif + +#include "cfferrs.h" +#include "cffpic.h" + +#include FT_SERVICE_FONT_FORMAT_H +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_PROPERTIES_H +#include FT_DRIVER_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_cffdriver + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F A C E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* cff_get_kerning */ + /* */ + /* */ + /* A driver method used to return the kerning vector between two */ + /* glyphs of the same face. */ + /* */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* left_glyph :: The index of the left glyph in the kern pair. */ + /* */ + /* right_glyph :: The index of the right glyph in the kern pair. */ + /* */ + /* */ + /* kerning :: The kerning vector. This is in font units for */ + /* scalable formats, and in pixels for fixed-sizes */ + /* formats. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Only horizontal layouts (left-to-right & right-to-left) are */ + /* supported by this function. Other layouts, or more sophisticated */ + /* kernings, are out of scope of this method (the basic driver */ + /* interface is meant to be simple). */ + /* */ + /* They can be implemented by format-specific interfaces. */ + /* */ + FT_CALLBACK_DEF( FT_Error ) + cff_get_kerning( FT_Face ttface, /* TT_Face */ + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + TT_Face face = (TT_Face)ttface; + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + + kerning->x = 0; + kerning->y = 0; + + if ( sfnt ) + kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* cff_glyph_load */ + /* */ + /* */ + /* A driver method used to load a glyph within a given glyph slot. */ + /* */ + /* */ + /* slot :: A handle to the target slot object where the glyph */ + /* will be loaded. */ + /* */ + /* size :: A handle to the source face size at which the glyph */ + /* must be scaled, loaded, etc. */ + /* */ + /* glyph_index :: The index of the glyph in the font file. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* FT_LOAD_??? constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_CALLBACK_DEF( FT_Error ) + cff_glyph_load( FT_GlyphSlot cffslot, /* CFF_GlyphSlot */ + FT_Size cffsize, /* CFF_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + CFF_GlyphSlot slot = (CFF_GlyphSlot)cffslot; + CFF_Size size = (CFF_Size)cffsize; + + + if ( !slot ) + return FT_THROW( Invalid_Slot_Handle ); + + FT_TRACE1(( "cff_glyph_load: glyph index %d\n", glyph_index )); + + /* check whether we want a scaled outline or bitmap */ + if ( !size ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + /* reset the size object if necessary */ + if ( load_flags & FT_LOAD_NO_SCALE ) + size = NULL; + + if ( size ) + { + /* these two objects must have the same parent */ + if ( cffsize->face != cffslot->face ) + return FT_THROW( Invalid_Face_Handle ); + } + + /* now load the glyph outline if necessary */ + error = cff_slot_load( slot, size, glyph_index, load_flags ); + + /* force drop-out mode to 2 - irrelevant now */ + /* slot->outline.dropout_mode = 2; */ + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + cff_get_advances( FT_Face face, + FT_UInt start, + FT_UInt count, + FT_Int32 flags, + FT_Fixed* advances ) + { + FT_UInt nn; + FT_Error error = FT_Err_Ok; + FT_GlyphSlot slot = face->glyph; + + + if ( FT_IS_SFNT( face ) ) + { + /* OpenType 1.7 mandates that the data from `hmtx' table be used; */ + /* it is no longer necessary that those values are identical to */ + /* the values in the `CFF' table */ + + TT_Face ttface = (TT_Face)face; + FT_Short dummy; + + + if ( flags & FT_LOAD_VERTICAL_LAYOUT ) + { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* no fast retrieval for blended MM fonts without VVAR table */ + if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) && + !( ttface->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) + return FT_THROW( Unimplemented_Feature ); +#endif + + /* check whether we have data from the `vmtx' table at all; */ + /* otherwise we extract the info from the CFF glyphstrings */ + /* (instead of synthesizing a global value using the `OS/2' */ + /* table) */ + if ( !ttface->vertical_info ) + goto Missing_Table; + + for ( nn = 0; nn < count; nn++ ) + { + FT_UShort ah; + + + ( (SFNT_Service)ttface->sfnt )->get_metrics( ttface, + 1, + start + nn, + &dummy, + &ah ); + + FT_TRACE5(( " idx %d: advance height %d font unit%s\n", + start + nn, + ah, + ah == 1 ? "" : "s" )); + advances[nn] = ah; + } + } + else + { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* no fast retrieval for blended MM fonts without HVAR table */ + if ( ( FT_IS_NAMED_INSTANCE( face ) || FT_IS_VARIATION( face ) ) && + !( ttface->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) + return FT_THROW( Unimplemented_Feature ); +#endif + + /* check whether we have data from the `hmtx' table at all */ + if ( !ttface->horizontal.number_Of_HMetrics ) + goto Missing_Table; + + for ( nn = 0; nn < count; nn++ ) + { + FT_UShort aw; + + + ( (SFNT_Service)ttface->sfnt )->get_metrics( ttface, + 0, + start + nn, + &dummy, + &aw ); + + FT_TRACE5(( " idx %d: advance width %d font unit%s\n", + start + nn, + aw, + aw == 1 ? "" : "s" )); + advances[nn] = aw; + } + } + + return error; + } + + Missing_Table: + flags |= (FT_UInt32)FT_LOAD_ADVANCE_ONLY; + + for ( nn = 0; nn < count; nn++ ) + { + error = cff_glyph_load( slot, face->size, start + nn, flags ); + if ( error ) + break; + + advances[nn] = ( flags & FT_LOAD_VERTICAL_LAYOUT ) + ? slot->linearVertAdvance + : slot->linearHoriAdvance; + } + + return error; + } + + + /* + * GLYPH DICT SERVICE + * + */ + + static FT_Error + cff_get_glyph_name( CFF_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + CFF_Font font = (CFF_Font)face->extra.data; + FT_String* gname; + FT_UShort sid; + FT_Error error; + + + /* CFF2 table does not have glyph names; */ + /* we need to use `post' table method */ + if ( font->version_major == 2 ) + { + FT_Library library = FT_FACE_LIBRARY( face ); + FT_Module sfnt_module = FT_Get_Module( library, "sfnt" ); + FT_Service_GlyphDict service = + (FT_Service_GlyphDict)ft_module_get_service( + sfnt_module, + FT_SERVICE_ID_GLYPH_DICT, + 0 ); + + + if ( service && service->get_name ) + return service->get_name( FT_FACE( face ), + glyph_index, + buffer, + buffer_max ); + else + { + FT_ERROR(( "cff_get_glyph_name:" + " cannot get glyph name from a CFF2 font\n" + " " + " without the `PSNames' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + } + + if ( !font->psnames ) + { + FT_ERROR(( "cff_get_glyph_name:" + " cannot get glyph name from CFF & CEF fonts\n" + " " + " without the `PSNames' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + + /* first, locate the sid in the charset table */ + sid = font->charset.sids[glyph_index]; + + /* now, lookup the name itself */ + gname = cff_index_get_sid_string( font, sid ); + + if ( gname ) + FT_STRCPYN( buffer, gname, buffer_max ); + + error = FT_Err_Ok; + + Exit: + return error; + } + + + static FT_UInt + cff_get_name_index( CFF_Face face, + FT_String* glyph_name ) + { + CFF_Font cff; + CFF_Charset charset; + FT_Service_PsCMaps psnames; + FT_String* name; + FT_UShort sid; + FT_UInt i; + + + cff = (CFF_FontRec *)face->extra.data; + charset = &cff->charset; + + /* CFF2 table does not have glyph names; */ + /* we need to use `post' table method */ + if ( cff->version_major == 2 ) + { + FT_Library library = FT_FACE_LIBRARY( face ); + FT_Module sfnt_module = FT_Get_Module( library, "sfnt" ); + FT_Service_GlyphDict service = + (FT_Service_GlyphDict)ft_module_get_service( + sfnt_module, + FT_SERVICE_ID_GLYPH_DICT, + 0 ); + + + if ( service && service->name_index ) + return service->name_index( FT_FACE( face ), glyph_name ); + else + { + FT_ERROR(( "cff_get_name_index:" + " cannot get glyph index from a CFF2 font\n" + " " + " without the `PSNames' module\n" )); + return 0; + } + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + if ( !psnames ) + return 0; + + for ( i = 0; i < cff->num_glyphs; i++ ) + { + sid = charset->sids[i]; + + if ( sid > 390 ) + name = cff_index_get_string( cff, sid - 391 ); + else + name = (FT_String *)psnames->adobe_std_strings( sid ); + + if ( !name ) + continue; + + if ( !ft_strcmp( glyph_name, name ) ) + return i; + } + + return 0; + } + + + FT_DEFINE_SERVICE_GLYPHDICTREC( + cff_service_glyph_dict, + + (FT_GlyphDict_GetNameFunc) cff_get_glyph_name, /* get_name */ + (FT_GlyphDict_NameIndexFunc)cff_get_name_index /* name_index */ + ) + + + /* + * POSTSCRIPT INFO SERVICE + * + */ + + static FT_Int + cff_ps_has_glyph_names( FT_Face face ) + { + return ( face->face_flags & FT_FACE_FLAG_GLYPH_NAMES ) > 0; + } + + + static FT_Error + cff_ps_get_font_info( CFF_Face face, + PS_FontInfoRec* afont_info ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Error error = FT_Err_Ok; + + + if ( cff && !cff->font_info ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + PS_FontInfoRec *font_info = NULL; + FT_Memory memory = face->root.memory; + + + if ( FT_ALLOC( font_info, sizeof ( *font_info ) ) ) + goto Fail; + + font_info->version = cff_index_get_sid_string( cff, + dict->version ); + font_info->notice = cff_index_get_sid_string( cff, + dict->notice ); + font_info->full_name = cff_index_get_sid_string( cff, + dict->full_name ); + font_info->family_name = cff_index_get_sid_string( cff, + dict->family_name ); + font_info->weight = cff_index_get_sid_string( cff, + dict->weight ); + font_info->italic_angle = dict->italic_angle; + font_info->is_fixed_pitch = dict->is_fixed_pitch; + font_info->underline_position = (FT_Short)dict->underline_position; + font_info->underline_thickness = (FT_UShort)dict->underline_thickness; + + cff->font_info = font_info; + } + + if ( cff ) + *afont_info = *cff->font_info; + + Fail: + return error; + } + + + static FT_Error + cff_ps_get_font_extra( CFF_Face face, + PS_FontExtraRec* afont_extra ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + FT_Error error = FT_Err_Ok; + + + if ( cff && cff->font_extra == NULL ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + PS_FontExtraRec* font_extra = NULL; + FT_Memory memory = face->root.memory; + FT_String* embedded_postscript; + + + if ( FT_ALLOC( font_extra, sizeof ( *font_extra ) ) ) + goto Fail; + + font_extra->fs_type = 0U; + + embedded_postscript = cff_index_get_sid_string( + cff, + dict->embedded_postscript ); + if ( embedded_postscript ) + { + FT_String* start_fstype; + FT_String* start_def; + + + /* Identify the XYZ integer in `/FSType XYZ def' substring. */ + if ( ( start_fstype = ft_strstr( embedded_postscript, + "/FSType" ) ) != NULL && + ( start_def = ft_strstr( start_fstype + + sizeof ( "/FSType" ) - 1, + "def" ) ) != NULL ) + { + FT_String* s; + + + for ( s = start_fstype + sizeof ( "/FSType" ) - 1; + s != start_def; + s++ ) + { + if ( *s >= '0' && *s <= '9' ) + { + if ( font_extra->fs_type >= ( FT_USHORT_MAX - 9 ) / 10 ) + { + /* Overflow - ignore the FSType value. */ + font_extra->fs_type = 0U; + break; + } + + font_extra->fs_type *= 10; + font_extra->fs_type += (FT_UShort)( *s - '0' ); + } + else if ( *s != ' ' && *s != '\n' && *s != '\r' ) + { + /* Non-whitespace character between `/FSType' and next `def' */ + /* - ignore the FSType value. */ + font_extra->fs_type = 0U; + break; + } + } + } + } + + cff->font_extra = font_extra; + } + + if ( cff ) + *afont_extra = *cff->font_extra; + + Fail: + return error; + } + + + FT_DEFINE_SERVICE_PSINFOREC( + cff_service_ps_info, + + (PS_GetFontInfoFunc) cff_ps_get_font_info, /* ps_get_font_info */ + (PS_GetFontExtraFunc) cff_ps_get_font_extra, /* ps_get_font_extra */ + (PS_HasGlyphNamesFunc) cff_ps_has_glyph_names, /* ps_has_glyph_names */ + /* unsupported with CFF fonts */ + (PS_GetFontPrivateFunc)NULL, /* ps_get_font_private */ + /* not implemented */ + (PS_GetFontValueFunc) NULL /* ps_get_font_value */ + ) + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + static const char* + cff_get_ps_name( CFF_Face face ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + + /* following the OpenType specification 1.7, we return the name stored */ + /* in the `name' table for a CFF wrapped into an SFNT container */ + + if ( FT_IS_SFNT( FT_FACE( face ) ) && sfnt ) + { + FT_Library library = FT_FACE_LIBRARY( face ); + FT_Module sfnt_module = FT_Get_Module( library, "sfnt" ); + FT_Service_PsFontName service = + (FT_Service_PsFontName)ft_module_get_service( + sfnt_module, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, + 0 ); + + + if ( service && service->get_ps_font_name ) + return service->get_ps_font_name( FT_FACE( face ) ); + } + + return (const char*)cff->font_name; + } + + + FT_DEFINE_SERVICE_PSFONTNAMEREC( + cff_service_ps_name, + + (FT_PsName_GetFunc)cff_get_ps_name /* get_ps_font_name */ + ) + + + /* + * TT CMAP INFO + * + * If the charmap is a synthetic Unicode encoding cmap or + * a Type 1 standard (or expert) encoding cmap, hide TT CMAP INFO + * service defined in SFNT module. + * + * Otherwise call the service function in the sfnt module. + * + */ + static FT_Error + cff_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ) + { + FT_CMap cmap = FT_CMAP( charmap ); + FT_Error error = FT_Err_Ok; + + FT_Face face = FT_CMAP_FACE( cmap ); + FT_Library library = FT_FACE_LIBRARY( face ); + + + if ( cmap->clazz != &CFF_CMAP_ENCODING_CLASS_REC_GET && + cmap->clazz != &CFF_CMAP_UNICODE_CLASS_REC_GET ) + { + FT_Module sfnt = FT_Get_Module( library, "sfnt" ); + FT_Service_TTCMaps service = + (FT_Service_TTCMaps)ft_module_get_service( sfnt, + FT_SERVICE_ID_TT_CMAP, + 0 ); + + + if ( service && service->get_cmap_info ) + error = service->get_cmap_info( charmap, cmap_info ); + } + else + error = FT_THROW( Invalid_CharMap_Format ); + + return error; + } + + + FT_DEFINE_SERVICE_TTCMAPSREC( + cff_service_get_cmap_info, + + (TT_CMap_Info_GetFunc)cff_get_cmap_info /* get_cmap_info */ + ) + + + /* + * CID INFO SERVICE + * + */ + static FT_Error + cff_get_ros( CFF_Face face, + const char* *registry, + const char* *ordering, + FT_Int *supplement ) + { + FT_Error error = FT_Err_Ok; + CFF_Font cff = (CFF_Font)face->extra.data; + + + if ( cff ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + + + if ( dict->cid_registry == 0xFFFFU ) + { + error = FT_THROW( Invalid_Argument ); + goto Fail; + } + + if ( registry ) + { + if ( !cff->registry ) + cff->registry = cff_index_get_sid_string( cff, + dict->cid_registry ); + *registry = cff->registry; + } + + if ( ordering ) + { + if ( !cff->ordering ) + cff->ordering = cff_index_get_sid_string( cff, + dict->cid_ordering ); + *ordering = cff->ordering; + } + + /* + * XXX: According to Adobe TechNote #5176, the supplement in CFF + * can be a real number. We truncate it to fit public API + * since freetype-2.3.6. + */ + if ( supplement ) + { + if ( dict->cid_supplement < FT_INT_MIN || + dict->cid_supplement > FT_INT_MAX ) + FT_TRACE1(( "cff_get_ros: too large supplement %d is truncated\n", + dict->cid_supplement )); + *supplement = (FT_Int)dict->cid_supplement; + } + } + + Fail: + return error; + } + + + static FT_Error + cff_get_is_cid( CFF_Face face, + FT_Bool *is_cid ) + { + FT_Error error = FT_Err_Ok; + CFF_Font cff = (CFF_Font)face->extra.data; + + + *is_cid = 0; + + if ( cff ) + { + CFF_FontRecDict dict = &cff->top_font.font_dict; + + + if ( dict->cid_registry != 0xFFFFU ) + *is_cid = 1; + } + + return error; + } + + + static FT_Error + cff_get_cid_from_glyph_index( CFF_Face face, + FT_UInt glyph_index, + FT_UInt *cid ) + { + FT_Error error = FT_Err_Ok; + CFF_Font cff; + + + cff = (CFF_Font)face->extra.data; + + if ( cff ) + { + FT_UInt c; + CFF_FontRecDict dict = &cff->top_font.font_dict; + + + if ( dict->cid_registry == 0xFFFFU ) + { + error = FT_THROW( Invalid_Argument ); + goto Fail; + } + + if ( glyph_index > cff->num_glyphs ) + { + error = FT_THROW( Invalid_Argument ); + goto Fail; + } + + c = cff->charset.sids[glyph_index]; + + if ( cid ) + *cid = c; + } + + Fail: + return error; + } + + + FT_DEFINE_SERVICE_CIDREC( + cff_service_cid_info, + + (FT_CID_GetRegistryOrderingSupplementFunc) + cff_get_ros, /* get_ros */ + (FT_CID_GetIsInternallyCIDKeyedFunc) + cff_get_is_cid, /* get_is_cid */ + (FT_CID_GetCIDFromGlyphIndexFunc) + cff_get_cid_from_glyph_index /* get_cid_from_glyph_index */ + ) + + + /* + * PROPERTY SERVICE + * + */ + + FT_DEFINE_SERVICE_PROPERTIESREC( + cff_service_properties, + + (FT_Properties_SetFunc)ps_property_set, /* set_property */ + (FT_Properties_GetFunc)ps_property_get ) /* get_property */ + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + /* + * MULTIPLE MASTER SERVICE + * + */ + + static FT_Error + cff_set_mm_blend( CFF_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + return mm->set_mm_blend( FT_FACE( face ), num_coords, coords ); + } + + + static FT_Error + cff_get_mm_blend( CFF_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + return mm->get_mm_blend( FT_FACE( face ), num_coords, coords ); + } + + + static FT_Error + cff_get_mm_var( CFF_Face face, + FT_MM_Var* *master ) + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + return mm->get_mm_var( FT_FACE( face ), master ); + } + + + static FT_Error + cff_set_var_design( CFF_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + return mm->set_var_design( FT_FACE( face ), num_coords, coords ); + } + + + static FT_Error + cff_get_var_design( CFF_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + return mm->get_var_design( FT_FACE( face ), num_coords, coords ); + } + + + static FT_Error + cff_set_instance( CFF_Face face, + FT_UInt instance_index ) + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + return mm->set_instance( FT_FACE( face ), instance_index ); + } + + + FT_DEFINE_SERVICE_MULTIMASTERSREC( + cff_service_multi_masters, + + (FT_Get_MM_Func) NULL, /* get_mm */ + (FT_Set_MM_Design_Func) NULL, /* set_mm_design */ + (FT_Set_MM_Blend_Func) cff_set_mm_blend, /* set_mm_blend */ + (FT_Get_MM_Blend_Func) cff_get_mm_blend, /* get_mm_blend */ + (FT_Get_MM_Var_Func) cff_get_mm_var, /* get_mm_var */ + (FT_Set_Var_Design_Func)cff_set_var_design, /* set_var_design */ + (FT_Get_Var_Design_Func)cff_get_var_design, /* get_var_design */ + (FT_Set_Instance_Func) cff_set_instance, /* set_instance */ + + (FT_Get_Var_Blend_Func) cff_get_var_blend, /* get_var_blend */ + (FT_Done_Blend_Func) cff_done_blend /* done_blend */ + ) + + + /* + * METRICS VARIATIONS SERVICE + * + */ + + static FT_Error + cff_hadvance_adjust( CFF_Face face, + FT_UInt gindex, + FT_Int *avalue ) + { + FT_Service_MetricsVariations var = (FT_Service_MetricsVariations)face->var; + + + return var->hadvance_adjust( FT_FACE( face ), gindex, avalue ); + } + + + static void + cff_metrics_adjust( CFF_Face face ) + { + FT_Service_MetricsVariations var = (FT_Service_MetricsVariations)face->var; + + + var->metrics_adjust( FT_FACE( face ) ); + } + + + FT_DEFINE_SERVICE_METRICSVARIATIONSREC( + cff_service_metrics_variations, + + (FT_HAdvance_Adjust_Func)cff_hadvance_adjust, /* hadvance_adjust */ + (FT_LSB_Adjust_Func) NULL, /* lsb_adjust */ + (FT_RSB_Adjust_Func) NULL, /* rsb_adjust */ + + (FT_VAdvance_Adjust_Func)NULL, /* vadvance_adjust */ + (FT_TSB_Adjust_Func) NULL, /* tsb_adjust */ + (FT_BSB_Adjust_Func) NULL, /* bsb_adjust */ + (FT_VOrg_Adjust_Func) NULL, /* vorg_adjust */ + + (FT_Metrics_Adjust_Func) cff_metrics_adjust /* metrics_adjust */ + ) +#endif + + + /* + * CFFLOAD SERVICE + * + */ + + FT_DEFINE_SERVICE_CFFLOADREC( + cff_service_cff_load, + + (FT_Get_Standard_Encoding_Func)cff_get_standard_encoding, + (FT_Load_Private_Dict_Func) cff_load_private_dict, + (FT_FD_Select_Get_Func) cff_fd_select_get, + (FT_Blend_Check_Vector_Func) cff_blend_check_vector, + (FT_Blend_Build_Vector_Func) cff_blend_build_vector + ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** D R I V E R I N T E R F A C E ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + +#if !defined FT_CONFIG_OPTION_NO_GLYPH_NAMES && \ + defined TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_DEFINE_SERVICEDESCREC10( + cff_services, + + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF, + FT_SERVICE_ID_MULTI_MASTERS, &CFF_SERVICE_MULTI_MASTERS_GET, + FT_SERVICE_ID_METRICS_VARIATIONS, &CFF_SERVICE_METRICS_VAR_GET, + FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_GLYPH_DICT, &CFF_SERVICE_GLYPH_DICT_GET, + FT_SERVICE_ID_TT_CMAP, &CFF_SERVICE_GET_CMAP_INFO_GET, + FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET, + FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET, + FT_SERVICE_ID_CFF_LOAD, &CFF_SERVICE_CFF_LOAD_GET + ) +#elif !defined FT_CONFIG_OPTION_NO_GLYPH_NAMES + FT_DEFINE_SERVICEDESCREC8( + cff_services, + + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF, + FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_GLYPH_DICT, &CFF_SERVICE_GLYPH_DICT_GET, + FT_SERVICE_ID_TT_CMAP, &CFF_SERVICE_GET_CMAP_INFO_GET, + FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET, + FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET, + FT_SERVICE_ID_CFF_LOAD, &CFF_SERVICE_CFF_LOAD_GET + ) +#elif defined TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_DEFINE_SERVICEDESCREC9( + cff_services, + + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF, + FT_SERVICE_ID_MULTI_MASTERS, &CFF_SERVICE_MULTI_MASTERS_GET, + FT_SERVICE_ID_METRICS_VARIATIONS, &CFF_SERVICE_METRICS_VAR_GET, + FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_TT_CMAP, &CFF_SERVICE_GET_CMAP_INFO_GET, + FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET, + FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET, + FT_SERVICE_ID_CFF_LOAD, &CFF_SERVICE_CFF_LOAD_GET + ) +#else + FT_DEFINE_SERVICEDESCREC7( + cff_services, + + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_CFF, + FT_SERVICE_ID_POSTSCRIPT_INFO, &CFF_SERVICE_PS_INFO_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &CFF_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_TT_CMAP, &CFF_SERVICE_GET_CMAP_INFO_GET, + FT_SERVICE_ID_CID, &CFF_SERVICE_CID_INFO_GET, + FT_SERVICE_ID_PROPERTIES, &CFF_SERVICE_PROPERTIES_GET, + FT_SERVICE_ID_CFF_LOAD, &CFF_SERVICE_CFF_LOAD_GET + ) +#endif + + + FT_CALLBACK_DEF( FT_Module_Interface ) + cff_get_interface( FT_Module driver, /* CFF_Driver */ + const char* module_interface ) + { + FT_Library library; + FT_Module sfnt; + FT_Module_Interface result; + + + /* CFF_SERVICES_GET dereferences `library' in PIC mode */ +#ifdef FT_CONFIG_OPTION_PIC + if ( !driver ) + return NULL; + library = driver->library; + if ( !library ) + return NULL; +#endif + + result = ft_service_list_lookup( CFF_SERVICES_GET, module_interface ); + if ( result ) + return result; + + /* `driver' is not yet evaluated in non-PIC mode */ +#ifndef FT_CONFIG_OPTION_PIC + if ( !driver ) + return NULL; + library = driver->library; + if ( !library ) + return NULL; +#endif + + /* we pass our request to the `sfnt' module */ + sfnt = FT_Get_Module( library, "sfnt" ); + + return sfnt ? sfnt->clazz->get_interface( sfnt, module_interface ) : 0; + } + + + /* The FT_DriverInterface structure is defined in ftdriver.h. */ + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#define CFF_SIZE_SELECT cff_size_select +#else +#define CFF_SIZE_SELECT 0 +#endif + + FT_DEFINE_DRIVER( + cff_driver_class, + + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + FT_MODULE_DRIVER_HAS_HINTER | + FT_MODULE_DRIVER_HINTS_LIGHTLY, + + sizeof ( PS_DriverRec ), + "cff", + 0x10000L, + 0x20000L, + + NULL, /* module-specific interface */ + + cff_driver_init, /* FT_Module_Constructor module_init */ + cff_driver_done, /* FT_Module_Destructor module_done */ + cff_get_interface, /* FT_Module_Requester get_interface */ + + sizeof ( TT_FaceRec ), + sizeof ( CFF_SizeRec ), + sizeof ( CFF_GlyphSlotRec ), + + cff_face_init, /* FT_Face_InitFunc init_face */ + cff_face_done, /* FT_Face_DoneFunc done_face */ + cff_size_init, /* FT_Size_InitFunc init_size */ + cff_size_done, /* FT_Size_DoneFunc done_size */ + cff_slot_init, /* FT_Slot_InitFunc init_slot */ + cff_slot_done, /* FT_Slot_DoneFunc done_slot */ + + cff_glyph_load, /* FT_Slot_LoadFunc load_glyph */ + + cff_get_kerning, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ + cff_get_advances, /* FT_Face_GetAdvancesFunc get_advances */ + + cff_size_request, /* FT_Size_RequestFunc request_size */ + CFF_SIZE_SELECT /* FT_Size_SelectFunc select_size */ + ) + + +/* END */ diff --git a/vendor/FreeType2/src/cff/cffdrivr.h b/vendor/FreeType2/src/cff/cffdrivr.h new file mode 100644 index 0000000..ad7c3ad --- /dev/null +++ b/vendor/FreeType2/src/cff/cffdrivr.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* cffdrivr.h */ +/* */ +/* High-level OpenType driver interface (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef CFFDRIVER_H_ +#define CFFDRIVER_H_ + + +#include +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_DRIVER( cff_driver_class ) + + +FT_END_HEADER + +#endif /* CFFDRIVER_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/cff/cfferrs.h b/vendor/FreeType2/src/cff/cfferrs.h new file mode 100644 index 0000000..b2e1bfa --- /dev/null +++ b/vendor/FreeType2/src/cff/cfferrs.h @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* cfferrs.h */ +/* */ +/* CFF error codes (specification only). */ +/* */ +/* Copyright 2001-2018 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 file is used to define the CFF error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef CFFERRS_H_ +#define CFFERRS_H_ + +#include FT_MODULE_ERRORS_H + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX CFF_Err_ +#define FT_ERR_BASE FT_Mod_Err_CFF + + +#include FT_ERRORS_H + +#endif /* CFFERRS_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/cff/cffgload.c b/vendor/FreeType2/src/cff/cffgload.c new file mode 100644 index 0000000..c58471c --- /dev/null +++ b/vendor/FreeType2/src/cff/cffgload.c @@ -0,0 +1,683 @@ +/***************************************************************************/ +/* */ +/* cffgload.c */ +/* */ +/* OpenType Glyph Loader (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_OUTLINE_H +#include FT_DRIVER_H + +#include "cffload.h" +#include "cffgload.h" + +#include "cfferrs.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_cffgload + + + FT_LOCAL_DEF( FT_Error ) + cff_get_glyph_data( TT_Face face, + FT_UInt glyph_index, + FT_Byte** pointer, + FT_ULong* length ) + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* For incremental fonts get the character data using the */ + /* callback function. */ + if ( face->root.internal->incremental_interface ) + { + FT_Data data; + FT_Error error = + face->root.internal->incremental_interface->funcs->get_glyph_data( + face->root.internal->incremental_interface->object, + glyph_index, &data ); + + + *pointer = (FT_Byte*)data.pointer; + *length = (FT_ULong)data.length; + + return error; + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + { + CFF_Font cff = (CFF_Font)(face->extra.data); + + + return cff_index_access_element( &cff->charstrings_index, glyph_index, + pointer, length ); + } + } + + + FT_LOCAL_DEF( void ) + cff_free_glyph_data( TT_Face face, + FT_Byte** pointer, + FT_ULong length ) + { +#ifndef FT_CONFIG_OPTION_INCREMENTAL + FT_UNUSED( length ); +#endif + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* For incremental fonts get the character data using the */ + /* callback function. */ + if ( face->root.internal->incremental_interface ) + { + FT_Data data; + + + data.pointer = *pointer; + data.length = (FT_Int)length; + + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, &data ); + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + { + CFF_Font cff = (CFF_Font)(face->extra.data); + + + cff_index_forget_element( &cff->charstrings_index, pointer ); + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** COMPUTE THE MAXIMUM ADVANCE WIDTH *********/ + /********** *********/ + /********** The following code is in charge of computing *********/ + /********** the maximum advance width of the font. It *********/ + /********** quickly processes each glyph charstring to *********/ + /********** extract the value from either a `sbw' or `seac' *********/ + /********** operator. *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#if 0 /* unused until we support pure CFF fonts */ + + + FT_LOCAL_DEF( FT_Error ) + cff_compute_max_advance( TT_Face face, + FT_Int* max_advance ) + { + FT_Error error = FT_Err_Ok; + CFF_Decoder decoder; + FT_Int glyph_index; + CFF_Font cff = (CFF_Font)face->other; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + const CFF_Decoder_Funcs decoder_funcs = psaux->cff_decoder_funcs; + + + *max_advance = 0; + + /* Initialize load decoder */ + decoder_funcs->init( &decoder, face, 0, 0, 0, 0, 0, 0 ); + + decoder.builder.metrics_only = 1; + decoder.builder.load_points = 0; + + /* For each glyph, parse the glyph charstring and extract */ + /* the advance width. */ + for ( glyph_index = 0; glyph_index < face->root.num_glyphs; + glyph_index++ ) + { + FT_Byte* charstring; + FT_ULong charstring_len; + + + /* now get load the unscaled outline */ + error = cff_get_glyph_data( face, glyph_index, + &charstring, &charstring_len ); + if ( !error ) + { + error = decoder_funcs->prepare( &decoder, size, glyph_index ); + if ( !error ) + error = decoder_funcs->parse_charstrings_old( &decoder, + charstring, + charstring_len, + 0 ); + + cff_free_glyph_data( face, &charstring, &charstring_len ); + } + + /* ignore the error if one has occurred -- skip to next glyph */ + error = FT_Err_Ok; + } + + *max_advance = decoder.builder.advance.x; + + return FT_Err_Ok; + } + + +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_Error ) + cff_slot_load( CFF_GlyphSlot glyph, + CFF_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + CFF_Decoder decoder; + PS_Decoder psdecoder; + TT_Face face = (TT_Face)glyph->root.face; + FT_Bool hinting, scaled, force_scaling; + CFF_Font cff = (CFF_Font)face->extra.data; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + const CFF_Decoder_Funcs decoder_funcs = psaux->cff_decoder_funcs; + + FT_Matrix font_matrix; + FT_Vector font_offset; + + + force_scaling = FALSE; + + /* in a CID-keyed font, consider `glyph_index' as a CID and map */ + /* it immediately to the real glyph_index -- if it isn't a */ + /* subsetted font, glyph_indices and CIDs are identical, though */ + if ( cff->top_font.font_dict.cid_registry != 0xFFFFU && + cff->charset.cids ) + { + /* don't handle CID 0 (.notdef) which is directly mapped to GID 0 */ + if ( glyph_index != 0 ) + { + glyph_index = cff_charset_cid_to_gindex( &cff->charset, + glyph_index ); + if ( glyph_index == 0 ) + return FT_THROW( Invalid_Argument ); + } + } + else if ( glyph_index >= cff->num_glyphs ) + return FT_THROW( Invalid_Argument ); + + if ( load_flags & FT_LOAD_NO_RECURSE ) + load_flags |= FT_LOAD_NO_SCALE | FT_LOAD_NO_HINTING; + + glyph->x_scale = 0x10000L; + glyph->y_scale = 0x10000L; + if ( size ) + { + glyph->x_scale = size->root.metrics.x_scale; + glyph->y_scale = size->root.metrics.y_scale; + } + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* try to load embedded bitmap if any */ + /* */ + /* XXX: The convention should be emphasized in */ + /* the documents because it can be confusing. */ + if ( size ) + { + CFF_Face cff_face = (CFF_Face)size->root.face; + SFNT_Service sfnt = (SFNT_Service)cff_face->sfnt; + FT_Stream stream = cff_face->root.stream; + + + if ( size->strike_index != 0xFFFFFFFFUL && + sfnt->load_eblc && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 ) + { + TT_SBit_MetricsRec metrics; + + + error = sfnt->load_sbit_image( face, + size->strike_index, + glyph_index, + (FT_UInt)load_flags, + stream, + &glyph->root.bitmap, + &metrics ); + + if ( !error ) + { + FT_Bool has_vertical_info; + FT_UShort advance; + FT_Short dummy; + + + glyph->root.outline.n_points = 0; + glyph->root.outline.n_contours = 0; + + glyph->root.metrics.width = (FT_Pos)metrics.width << 6; + glyph->root.metrics.height = (FT_Pos)metrics.height << 6; + + glyph->root.metrics.horiBearingX = (FT_Pos)metrics.horiBearingX << 6; + glyph->root.metrics.horiBearingY = (FT_Pos)metrics.horiBearingY << 6; + glyph->root.metrics.horiAdvance = (FT_Pos)metrics.horiAdvance << 6; + + glyph->root.metrics.vertBearingX = (FT_Pos)metrics.vertBearingX << 6; + glyph->root.metrics.vertBearingY = (FT_Pos)metrics.vertBearingY << 6; + glyph->root.metrics.vertAdvance = (FT_Pos)metrics.vertAdvance << 6; + + glyph->root.format = FT_GLYPH_FORMAT_BITMAP; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + glyph->root.bitmap_left = metrics.vertBearingX; + glyph->root.bitmap_top = metrics.vertBearingY; + } + else + { + glyph->root.bitmap_left = metrics.horiBearingX; + glyph->root.bitmap_top = metrics.horiBearingY; + } + + /* compute linear advance widths */ + + (void)( (SFNT_Service)face->sfnt )->get_metrics( face, 0, + glyph_index, + &dummy, + &advance ); + glyph->root.linearHoriAdvance = advance; + + has_vertical_info = FT_BOOL( + face->vertical_info && + face->vertical.number_Of_VMetrics > 0 ); + + /* get the vertical metrics from the vmtx table if we have one */ + if ( has_vertical_info ) + { + (void)( (SFNT_Service)face->sfnt )->get_metrics( face, 1, + glyph_index, + &dummy, + &advance ); + glyph->root.linearVertAdvance = advance; + } + else + { + /* make up vertical ones */ + if ( face->os2.version != 0xFFFFU ) + glyph->root.linearVertAdvance = (FT_Pos) + ( face->os2.sTypoAscender - face->os2.sTypoDescender ); + else + glyph->root.linearVertAdvance = (FT_Pos) + ( face->horizontal.Ascender - face->horizontal.Descender ); + } + + return error; + } + } + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* return immediately if we only want the embedded bitmaps */ + if ( load_flags & FT_LOAD_SBITS_ONLY ) + return FT_THROW( Invalid_Argument ); + + /* if we have a CID subfont, use its matrix (which has already */ + /* been multiplied with the root matrix) */ + + /* this scaling is only relevant if the PS hinter isn't active */ + if ( cff->num_subfonts ) + { + FT_Long top_upm, sub_upm; + FT_Byte fd_index = cff_fd_select_get( &cff->fd_select, + glyph_index ); + + + if ( fd_index >= cff->num_subfonts ) + fd_index = (FT_Byte)( cff->num_subfonts - 1 ); + + top_upm = (FT_Long)cff->top_font.font_dict.units_per_em; + sub_upm = (FT_Long)cff->subfonts[fd_index]->font_dict.units_per_em; + + + font_matrix = cff->subfonts[fd_index]->font_dict.font_matrix; + font_offset = cff->subfonts[fd_index]->font_dict.font_offset; + + if ( top_upm != sub_upm ) + { + glyph->x_scale = FT_MulDiv( glyph->x_scale, top_upm, sub_upm ); + glyph->y_scale = FT_MulDiv( glyph->y_scale, top_upm, sub_upm ); + + force_scaling = TRUE; + } + } + else + { + font_matrix = cff->top_font.font_dict.font_matrix; + font_offset = cff->top_font.font_dict.font_offset; + } + + glyph->root.outline.n_points = 0; + glyph->root.outline.n_contours = 0; + + /* top-level code ensures that FT_LOAD_NO_HINTING is set */ + /* if FT_LOAD_NO_SCALE is active */ + hinting = FT_BOOL( ( load_flags & FT_LOAD_NO_HINTING ) == 0 ); + scaled = FT_BOOL( ( load_flags & FT_LOAD_NO_SCALE ) == 0 ); + + glyph->hint = hinting; + glyph->scaled = scaled; + glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; /* by default */ + + { +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( face ); +#endif + + + FT_Byte* charstring; + FT_ULong charstring_len; + + + decoder_funcs->init( &decoder, face, size, glyph, hinting, + FT_LOAD_TARGET_MODE( load_flags ), + cff_get_glyph_data, + cff_free_glyph_data ); + + /* this is for pure CFFs */ + if ( load_flags & FT_LOAD_ADVANCE_ONLY ) + decoder.width_only = TRUE; + + decoder.builder.no_recurse = + (FT_Bool)( load_flags & FT_LOAD_NO_RECURSE ); + + /* now load the unscaled outline */ + error = cff_get_glyph_data( face, glyph_index, + &charstring, &charstring_len ); + if ( error ) + goto Glyph_Build_Finished; + + error = decoder_funcs->prepare( &decoder, size, glyph_index ); + if ( error ) + goto Glyph_Build_Finished; + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + /* choose which CFF renderer to use */ + if ( driver->hinting_engine == FT_HINTING_FREETYPE ) + error = decoder_funcs->parse_charstrings_old( &decoder, + charstring, + charstring_len, + 0 ); + else +#endif + { + psaux->ps_decoder_init( &psdecoder, &decoder, FALSE ); + + error = decoder_funcs->parse_charstrings( &psdecoder, + charstring, + charstring_len ); + + /* Adobe's engine uses 16.16 numbers everywhere; */ + /* as a consequence, glyphs larger than 2000ppem get rejected */ + if ( FT_ERR_EQ( error, Glyph_Too_Big ) ) + { + /* this time, we retry unhinted and scale up the glyph later on */ + /* (the engine uses and sets the hardcoded value 0x10000 / 64 = */ + /* 0x400 for both `x_scale' and `y_scale' in this case) */ + hinting = FALSE; + force_scaling = TRUE; + glyph->hint = hinting; + + error = decoder_funcs->parse_charstrings( &psdecoder, + charstring, + charstring_len ); + } + } + + cff_free_glyph_data( face, &charstring, charstring_len ); + + if ( error ) + goto Glyph_Build_Finished; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* Control data and length may not be available for incremental */ + /* fonts. */ + if ( face->root.internal->incremental_interface ) + { + glyph->root.control_data = NULL; + glyph->root.control_len = 0; + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + /* We set control_data and control_len if charstrings is loaded. */ + /* See how charstring loads at cff_index_access_element() in */ + /* cffload.c. */ + { + CFF_Index csindex = &cff->charstrings_index; + + + if ( csindex->offsets ) + { + glyph->root.control_data = csindex->bytes + + csindex->offsets[glyph_index] - 1; + glyph->root.control_len = (FT_Long)charstring_len; + } + } + + Glyph_Build_Finished: + /* save new glyph tables, if no error */ + if ( !error ) + decoder.builder.funcs.done( &decoder.builder ); + /* XXX: anything to do for broken glyph entry? */ + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* Incremental fonts can optionally override the metrics. */ + if ( !error && + face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec metrics; + + + metrics.bearing_x = decoder.builder.left_bearing.x; + metrics.bearing_y = 0; + metrics.advance = decoder.builder.advance.x; + metrics.advance_v = decoder.builder.advance.y; + + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, FALSE, &metrics ); + + decoder.builder.left_bearing.x = metrics.bearing_x; + decoder.builder.advance.x = metrics.advance; + decoder.builder.advance.y = metrics.advance_v; + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + if ( !error ) + { + /* Now, set the metrics -- this is rather simple, as */ + /* the left side bearing is the xMin, and the top side */ + /* bearing the yMax. */ + + /* For composite glyphs, return only left side bearing and */ + /* advance width. */ + if ( load_flags & FT_LOAD_NO_RECURSE ) + { + FT_Slot_Internal internal = glyph->root.internal; + + + glyph->root.metrics.horiBearingX = decoder.builder.left_bearing.x; + glyph->root.metrics.horiAdvance = decoder.glyph_width; + internal->glyph_matrix = font_matrix; + internal->glyph_delta = font_offset; + internal->glyph_transformed = 1; + } + else + { + FT_BBox cbox; + FT_Glyph_Metrics* metrics = &glyph->root.metrics; + FT_Bool has_vertical_info; + + + if ( face->horizontal.number_Of_HMetrics ) + { + FT_Short horiBearingX = 0; + FT_UShort horiAdvance = 0; + + + ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, + glyph_index, + &horiBearingX, + &horiAdvance ); + metrics->horiAdvance = horiAdvance; + metrics->horiBearingX = horiBearingX; + glyph->root.linearHoriAdvance = horiAdvance; + } + else + { + /* copy the _unscaled_ advance width */ + metrics->horiAdvance = decoder.glyph_width; + glyph->root.linearHoriAdvance = decoder.glyph_width; + } + + glyph->root.internal->glyph_transformed = 0; + + has_vertical_info = FT_BOOL( face->vertical_info && + face->vertical.number_Of_VMetrics > 0 ); + + /* get the vertical metrics from the vmtx table if we have one */ + if ( has_vertical_info ) + { + FT_Short vertBearingY = 0; + FT_UShort vertAdvance = 0; + + + ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, + glyph_index, + &vertBearingY, + &vertAdvance ); + metrics->vertBearingY = vertBearingY; + metrics->vertAdvance = vertAdvance; + } + else + { + /* make up vertical ones */ + if ( face->os2.version != 0xFFFFU ) + metrics->vertAdvance = (FT_Pos)( face->os2.sTypoAscender - + face->os2.sTypoDescender ); + else + metrics->vertAdvance = (FT_Pos)( face->horizontal.Ascender - + face->horizontal.Descender ); + } + + glyph->root.linearVertAdvance = metrics->vertAdvance; + + glyph->root.format = FT_GLYPH_FORMAT_OUTLINE; + + glyph->root.outline.flags = 0; + if ( size && size->root.metrics.y_ppem < 24 ) + glyph->root.outline.flags |= FT_OUTLINE_HIGH_PRECISION; + + glyph->root.outline.flags |= FT_OUTLINE_REVERSE_FILL; + + /* apply the font matrix, if any */ + if ( font_matrix.xx != 0x10000L || font_matrix.yy != 0x10000L || + font_matrix.xy != 0 || font_matrix.yx != 0 ) + { + FT_Outline_Transform( &glyph->root.outline, &font_matrix ); + + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, + font_matrix.xx ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, + font_matrix.yy ); + } + + if ( font_offset.x || font_offset.y ) + { + FT_Outline_Translate( &glyph->root.outline, + font_offset.x, + font_offset.y ); + + metrics->horiAdvance += font_offset.x; + metrics->vertAdvance += font_offset.y; + } + + if ( ( load_flags & FT_LOAD_NO_SCALE ) == 0 || force_scaling ) + { + /* scale the outline and the metrics */ + FT_Int n; + FT_Outline* cur = &glyph->root.outline; + FT_Vector* vec = cur->points; + FT_Fixed x_scale = glyph->x_scale; + FT_Fixed y_scale = glyph->y_scale; + + + /* First of all, scale the points */ + if ( !hinting || !decoder.builder.hints_funcs ) + for ( n = cur->n_points; n > 0; n--, vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + + /* Then scale the metrics */ + metrics->horiAdvance = FT_MulFix( metrics->horiAdvance, x_scale ); + metrics->vertAdvance = FT_MulFix( metrics->vertAdvance, y_scale ); + } + + /* compute the other metrics */ + FT_Outline_Get_CBox( &glyph->root.outline, &cbox ); + + metrics->width = cbox.xMax - cbox.xMin; + metrics->height = cbox.yMax - cbox.yMin; + + metrics->horiBearingX = cbox.xMin; + metrics->horiBearingY = cbox.yMax; + + if ( has_vertical_info ) + metrics->vertBearingX = metrics->horiBearingX - + metrics->horiAdvance / 2; + else + { + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + ft_synthesize_vertical_metrics( metrics, + metrics->vertAdvance ); + } + } + } + + return error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/cff/cffgload.h b/vendor/FreeType2/src/cff/cffgload.h new file mode 100644 index 0000000..803f397 --- /dev/null +++ b/vendor/FreeType2/src/cff/cffgload.h @@ -0,0 +1,63 @@ +/***************************************************************************/ +/* */ +/* cffgload.h */ +/* */ +/* OpenType Glyph Loader (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef CFFGLOAD_H_ +#define CFFGLOAD_H_ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_CFF_OBJECTS_TYPES_H + + +FT_BEGIN_HEADER + + FT_LOCAL( FT_Error ) + cff_get_glyph_data( TT_Face face, + FT_UInt glyph_index, + FT_Byte** pointer, + FT_ULong* length ); + FT_LOCAL( void ) + cff_free_glyph_data( TT_Face face, + FT_Byte** pointer, + FT_ULong length ); + + +#if 0 /* unused until we support pure CFF fonts */ + + /* Compute the maximum advance width of a font through quick parsing */ + FT_LOCAL( FT_Error ) + cff_compute_max_advance( TT_Face face, + FT_Int* max_advance ); + +#endif /* 0 */ + + + FT_LOCAL( FT_Error ) + cff_slot_load( CFF_GlyphSlot glyph, + CFF_Size size, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* CFFGLOAD_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/cff/cffload.c b/vendor/FreeType2/src/cff/cffload.c new file mode 100644 index 0000000..1c6fe51 --- /dev/null +++ b/vendor/FreeType2/src/cff/cffload.c @@ -0,0 +1,2564 @@ +/***************************************************************************/ +/* */ +/* cffload.c */ +/* */ +/* OpenType and CFF data/program tables loader (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include FT_TYPE1_TABLES_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#endif + +#include "cffload.h" +#include "cffparse.h" + +#include "cfferrs.h" + + +#define FT_FIXED_ONE ( (FT_Fixed)0x10000 ) + + +#if 1 + + static const FT_UShort cff_isoadobe_charset[229] = + { + 0, 1, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, + 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 44, 45, 46, 47, + 48, 49, 50, 51, 52, 53, 54, 55, + 56, 57, 58, 59, 60, 61, 62, 63, + 64, 65, 66, 67, 68, 69, 70, 71, + 72, 73, 74, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, + 88, 89, 90, 91, 92, 93, 94, 95, + 96, 97, 98, 99, 100, 101, 102, 103, + 104, 105, 106, 107, 108, 109, 110, 111, + 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, + 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, + 144, 145, 146, 147, 148, 149, 150, 151, + 152, 153, 154, 155, 156, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, + 176, 177, 178, 179, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 191, + 192, 193, 194, 195, 196, 197, 198, 199, + 200, 201, 202, 203, 204, 205, 206, 207, + 208, 209, 210, 211, 212, 213, 214, 215, + 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228 + }; + + static const FT_UShort cff_expert_charset[166] = + { + 0, 1, 229, 230, 231, 232, 233, 234, + 235, 236, 237, 238, 13, 14, 15, 99, + 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 27, 28, 249, 250, 251, 252, + 253, 254, 255, 256, 257, 258, 259, 260, + 261, 262, 263, 264, 265, 266, 109, 110, + 267, 268, 269, 270, 271, 272, 273, 274, + 275, 276, 277, 278, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, 294, 295, 296, 297, 298, + 299, 300, 301, 302, 303, 304, 305, 306, + 307, 308, 309, 310, 311, 312, 313, 314, + 315, 316, 317, 318, 158, 155, 163, 319, + 320, 321, 322, 323, 324, 325, 326, 150, + 164, 169, 327, 328, 329, 330, 331, 332, + 333, 334, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 363, 364, + 365, 366, 367, 368, 369, 370, 371, 372, + 373, 374, 375, 376, 377, 378 + }; + + static const FT_UShort cff_expertsubset_charset[87] = + { + 0, 1, 231, 232, 235, 236, 237, 238, + 13, 14, 15, 99, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 27, 28, + 249, 250, 251, 253, 254, 255, 256, 257, + 258, 259, 260, 261, 262, 263, 264, 265, + 266, 109, 110, 267, 268, 269, 270, 272, + 300, 301, 302, 305, 314, 315, 158, 155, + 163, 320, 321, 322, 323, 324, 325, 326, + 150, 164, 169, 327, 328, 329, 330, 331, + 332, 333, 334, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346 + }; + + static const FT_UShort cff_standard_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, + 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, + 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 98, 99, 100, 101, 102, + 103, 104, 105, 106, 107, 108, 109, 110, + 0, 111, 112, 113, 114, 0, 115, 116, + 117, 118, 119, 120, 121, 122, 0, 123, + 0, 124, 125, 126, 127, 128, 129, 130, + 131, 0, 132, 133, 0, 134, 135, 136, + 137, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 138, 0, 139, 0, 0, 0, 0, + 140, 141, 142, 143, 0, 0, 0, 0, + 0, 144, 0, 0, 0, 145, 0, 0, + 146, 147, 148, 149, 0, 0, 0, 0 + }; + + static const FT_UShort cff_expert_encoding[256] = + { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 1, 229, 230, 0, 231, 232, 233, 234, + 235, 236, 237, 238, 13, 14, 15, 99, + 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 27, 28, 249, 250, 251, 252, + 0, 253, 254, 255, 256, 257, 0, 0, + 0, 258, 0, 0, 259, 260, 261, 262, + 0, 0, 263, 264, 265, 0, 266, 109, + 110, 267, 268, 269, 0, 270, 271, 272, + 273, 274, 275, 276, 277, 278, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, 294, 295, 296, + 297, 298, 299, 300, 301, 302, 303, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 304, 305, 306, 0, 0, 307, 308, + 309, 310, 311, 0, 312, 0, 0, 312, + 0, 0, 314, 315, 0, 0, 316, 317, + 318, 0, 0, 0, 158, 155, 163, 319, + 320, 321, 322, 323, 324, 325, 0, 0, + 326, 150, 164, 169, 327, 328, 329, 330, + 331, 332, 333, 334, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, + 363, 364, 365, 366, 367, 368, 369, 370, + 371, 372, 373, 374, 375, 376, 377, 378 + }; + +#endif /* 1 */ + + + FT_LOCAL_DEF( FT_UShort ) + cff_get_standard_encoding( FT_UInt charcode ) + { + return (FT_UShort)( charcode < 256 ? cff_standard_encoding[charcode] + : 0 ); + } + + + /*************************************************************************/ + /* */ + /* 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_cffload + + + /* read an offset from the index's stream current position */ + static FT_ULong + cff_index_read_offset( CFF_Index idx, + FT_Error *errorp ) + { + FT_Error error; + FT_Stream stream = idx->stream; + FT_Byte tmp[4]; + FT_ULong result = 0; + + + if ( !FT_STREAM_READ( tmp, idx->off_size ) ) + { + FT_Int nn; + + + for ( nn = 0; nn < idx->off_size; nn++ ) + result = ( result << 8 ) | tmp[nn]; + } + + *errorp = error; + return result; + } + + + static FT_Error + cff_index_init( CFF_Index idx, + FT_Stream stream, + FT_Bool load, + FT_Bool cff2 ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_UInt count; + + + FT_ZERO( idx ); + + idx->stream = stream; + idx->start = FT_STREAM_POS(); + + if ( cff2 ) + { + if ( FT_READ_ULONG( count ) ) + goto Exit; + idx->hdr_size = 5; + } + else + { + if ( FT_READ_USHORT( count ) ) + goto Exit; + idx->hdr_size = 3; + } + + if ( count > 0 ) + { + FT_Byte offsize; + FT_ULong size; + + + /* there is at least one element; read the offset size, */ + /* then access the offset table to compute the index's total size */ + if ( FT_READ_BYTE( offsize ) ) + goto Exit; + + if ( offsize < 1 || offsize > 4 ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + idx->count = count; + idx->off_size = offsize; + size = (FT_ULong)( count + 1 ) * offsize; + + idx->data_offset = idx->start + idx->hdr_size + size; + + if ( FT_STREAM_SKIP( size - offsize ) ) + goto Exit; + + size = cff_index_read_offset( idx, &error ); + if ( error ) + goto Exit; + + if ( size == 0 ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + idx->data_size = --size; + + if ( load ) + { + /* load the data */ + if ( FT_FRAME_EXTRACT( size, idx->bytes ) ) + goto Exit; + } + else + { + /* skip the data */ + if ( FT_STREAM_SKIP( size ) ) + goto Exit; + } + } + + Exit: + if ( error ) + FT_FREE( idx->offsets ); + + return error; + } + + + static void + cff_index_done( CFF_Index idx ) + { + if ( idx->stream ) + { + FT_Stream stream = idx->stream; + FT_Memory memory = stream->memory; + + + if ( idx->bytes ) + FT_FRAME_RELEASE( idx->bytes ); + + FT_FREE( idx->offsets ); + FT_ZERO( idx ); + } + } + + + static FT_Error + cff_index_load_offsets( CFF_Index idx ) + { + FT_Error error = FT_Err_Ok; + FT_Stream stream = idx->stream; + FT_Memory memory = stream->memory; + + + if ( idx->count > 0 && !idx->offsets ) + { + FT_Byte offsize = idx->off_size; + FT_ULong data_size; + FT_Byte* p; + FT_Byte* p_end; + FT_ULong* poff; + + + data_size = (FT_ULong)( idx->count + 1 ) * offsize; + + if ( FT_NEW_ARRAY( idx->offsets, idx->count + 1 ) || + FT_STREAM_SEEK( idx->start + idx->hdr_size ) || + FT_FRAME_ENTER( data_size ) ) + goto Exit; + + poff = idx->offsets; + p = (FT_Byte*)stream->cursor; + p_end = p + data_size; + + switch ( offsize ) + { + case 1: + for ( ; p < p_end; p++, poff++ ) + poff[0] = p[0]; + break; + + case 2: + for ( ; p < p_end; p += 2, poff++ ) + poff[0] = FT_PEEK_USHORT( p ); + break; + + case 3: + for ( ; p < p_end; p += 3, poff++ ) + poff[0] = FT_PEEK_UOFF3( p ); + break; + + default: + for ( ; p < p_end; p += 4, poff++ ) + poff[0] = FT_PEEK_ULONG( p ); + } + + FT_FRAME_EXIT(); + } + + Exit: + if ( error ) + FT_FREE( idx->offsets ); + + return error; + } + + + /* Allocate a table containing pointers to an index's elements. */ + /* The `pool' argument makes this function convert the index */ + /* entries to C-style strings (this is, NULL-terminated). */ + static FT_Error + cff_index_get_pointers( CFF_Index idx, + FT_Byte*** table, + FT_Byte** pool, + FT_ULong* pool_size ) + { + FT_Error error = FT_Err_Ok; + FT_Memory memory = idx->stream->memory; + + FT_Byte** t = NULL; + FT_Byte* new_bytes = NULL; + FT_ULong new_size; + + + *table = NULL; + + if ( !idx->offsets ) + { + error = cff_index_load_offsets( idx ); + if ( error ) + goto Exit; + } + + new_size = idx->data_size + idx->count; + + if ( idx->count > 0 && + !FT_NEW_ARRAY( t, idx->count + 1 ) && + ( !pool || !FT_ALLOC( new_bytes, new_size ) ) ) + { + FT_ULong n, cur_offset; + FT_ULong extra = 0; + FT_Byte* org_bytes = idx->bytes; + + + /* at this point, `idx->offsets' can't be NULL */ + cur_offset = idx->offsets[0] - 1; + + /* sanity check */ + if ( cur_offset != 0 ) + { + FT_TRACE0(( "cff_index_get_pointers:" + " invalid first offset value %d set to zero\n", + cur_offset )); + cur_offset = 0; + } + + if ( !pool ) + t[0] = org_bytes + cur_offset; + else + t[0] = new_bytes + cur_offset; + + for ( n = 1; n <= idx->count; n++ ) + { + FT_ULong next_offset = idx->offsets[n] - 1; + + + /* two sanity checks for invalid offset tables */ + if ( next_offset < cur_offset ) + next_offset = cur_offset; + else if ( next_offset > idx->data_size ) + next_offset = idx->data_size; + + if ( !pool ) + t[n] = org_bytes + next_offset; + else + { + t[n] = new_bytes + next_offset + extra; + + if ( next_offset != cur_offset ) + { + FT_MEM_COPY( t[n - 1], org_bytes + cur_offset, t[n] - t[n - 1] ); + t[n][0] = '\0'; + t[n] += 1; + extra++; + } + } + + cur_offset = next_offset; + } + *table = t; + + if ( pool ) + *pool = new_bytes; + if ( pool_size ) + *pool_size = new_size; + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_index_access_element( CFF_Index idx, + FT_UInt element, + FT_Byte** pbytes, + FT_ULong* pbyte_len ) + { + FT_Error error = FT_Err_Ok; + + + if ( idx && idx->count > element ) + { + /* compute start and end offsets */ + FT_Stream stream = idx->stream; + FT_ULong off1, off2 = 0; + + + /* load offsets from file or the offset table */ + if ( !idx->offsets ) + { + FT_ULong pos = element * idx->off_size; + + + if ( FT_STREAM_SEEK( idx->start + idx->hdr_size + pos ) ) + goto Exit; + + off1 = cff_index_read_offset( idx, &error ); + if ( error ) + goto Exit; + + if ( off1 != 0 ) + { + do + { + element++; + off2 = cff_index_read_offset( idx, &error ); + + } while ( off2 == 0 && element < idx->count ); + } + } + else /* use offsets table */ + { + off1 = idx->offsets[element]; + if ( off1 ) + { + do + { + element++; + off2 = idx->offsets[element]; + + } while ( off2 == 0 && element < idx->count ); + } + } + + /* XXX: should check off2 does not exceed the end of this entry; */ + /* at present, only truncate off2 at the end of this stream */ + if ( off2 > stream->size + 1 || + idx->data_offset > stream->size - off2 + 1 ) + { + FT_ERROR(( "cff_index_access_element:" + " offset to next entry (%d)" + " exceeds the end of stream (%d)\n", + off2, stream->size - idx->data_offset + 1 )); + off2 = stream->size - idx->data_offset + 1; + } + + /* access element */ + if ( off1 && off2 > off1 ) + { + *pbyte_len = off2 - off1; + + if ( idx->bytes ) + { + /* this index was completely loaded in memory, that's easy */ + *pbytes = idx->bytes + off1 - 1; + } + else + { + /* this index is still on disk/file, access it through a frame */ + if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) || + FT_FRAME_EXTRACT( off2 - off1, *pbytes ) ) + goto Exit; + } + } + else + { + /* empty index element */ + *pbytes = 0; + *pbyte_len = 0; + } + } + else + error = FT_THROW( Invalid_Argument ); + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + cff_index_forget_element( CFF_Index idx, + FT_Byte** pbytes ) + { + if ( idx->bytes == 0 ) + { + FT_Stream stream = idx->stream; + + + FT_FRAME_RELEASE( *pbytes ); + } + } + + + /* get an entry from Name INDEX */ + FT_LOCAL_DEF( FT_String* ) + cff_index_get_name( CFF_Font font, + FT_UInt element ) + { + CFF_Index idx = &font->name_index; + FT_Memory memory; + FT_Byte* bytes; + FT_ULong byte_len; + FT_Error error; + FT_String* name = 0; + + + if ( !idx->stream ) /* CFF2 does not include a name index */ + goto Exit; + + memory = idx->stream->memory; + + error = cff_index_access_element( idx, element, &bytes, &byte_len ); + if ( error ) + goto Exit; + + if ( !FT_ALLOC( name, byte_len + 1 ) ) + { + if ( byte_len ) + FT_MEM_COPY( name, bytes, byte_len ); + name[byte_len] = 0; + } + cff_index_forget_element( idx, &bytes ); + + Exit: + return name; + } + + + /* get an entry from String INDEX */ + FT_LOCAL_DEF( FT_String* ) + cff_index_get_string( CFF_Font font, + FT_UInt element ) + { + return ( element < font->num_strings ) + ? (FT_String*)font->strings[element] + : NULL; + } + + + FT_LOCAL_DEF( FT_String* ) + cff_index_get_sid_string( CFF_Font font, + FT_UInt sid ) + { + /* value 0xFFFFU indicates a missing dictionary entry */ + if ( sid == 0xFFFFU ) + return NULL; + + /* if it is not a standard string, return it */ + if ( sid > 390 ) + return cff_index_get_string( font, sid - 391 ); + + /* CID-keyed CFF fonts don't have glyph names */ + if ( !font->psnames ) + return NULL; + + /* this is a standard string */ + return (FT_String *)font->psnames->adobe_std_strings( sid ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** FD Select table support ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + + + static void + CFF_Done_FD_Select( CFF_FDSelect fdselect, + FT_Stream stream ) + { + if ( fdselect->data ) + FT_FRAME_RELEASE( fdselect->data ); + + fdselect->data_size = 0; + fdselect->format = 0; + fdselect->range_count = 0; + } + + + static FT_Error + CFF_Load_FD_Select( CFF_FDSelect fdselect, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong offset ) + { + FT_Error error; + FT_Byte format; + FT_UInt num_ranges; + + + /* read format */ + if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) ) + goto Exit; + + fdselect->format = format; + fdselect->cache_count = 0; /* clear cache */ + + switch ( format ) + { + case 0: /* format 0, that's simple */ + fdselect->data_size = num_glyphs; + goto Load_Data; + + case 3: /* format 3, a tad more complex */ + if ( FT_READ_USHORT( num_ranges ) ) + goto Exit; + + if ( !num_ranges ) + { + FT_TRACE0(( "CFF_Load_FD_Select: empty FDSelect array\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + fdselect->data_size = num_ranges * 3 + 2; + + Load_Data: + if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) ) + goto Exit; + break; + + default: /* hmm... that's wrong */ + error = FT_THROW( Invalid_File_Format ); + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Byte ) + cff_fd_select_get( CFF_FDSelect fdselect, + FT_UInt glyph_index ) + { + FT_Byte fd = 0; + + + /* if there is no FDSelect, return zero */ + /* Note: CFF2 with just one Font Dict has no FDSelect */ + if ( !fdselect->data ) + goto Exit; + + switch ( fdselect->format ) + { + case 0: + fd = fdselect->data[glyph_index]; + break; + + case 3: + /* first, compare to the cache */ + if ( (FT_UInt)( glyph_index - fdselect->cache_first ) < + fdselect->cache_count ) + { + fd = fdselect->cache_fd; + break; + } + + /* then, look up the ranges array */ + { + FT_Byte* p = fdselect->data; + FT_Byte* p_limit = p + fdselect->data_size; + FT_Byte fd2; + FT_UInt first, limit; + + + first = FT_NEXT_USHORT( p ); + do + { + if ( glyph_index < first ) + break; + + fd2 = *p++; + limit = FT_NEXT_USHORT( p ); + + if ( glyph_index < limit ) + { + fd = fd2; + + /* update cache */ + fdselect->cache_first = first; + fdselect->cache_count = limit - first; + fdselect->cache_fd = fd2; + break; + } + first = limit; + + } while ( p < p_limit ); + } + break; + + default: + ; + } + + Exit: + return fd; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*** ***/ + /*** CFF font support ***/ + /*** ***/ + /*************************************************************************/ + /*************************************************************************/ + + static FT_Error + cff_charset_compute_cids( CFF_Charset charset, + FT_UInt num_glyphs, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + FT_UInt i; + FT_Long j; + FT_UShort max_cid = 0; + + + if ( charset->max_cid > 0 ) + goto Exit; + + for ( i = 0; i < num_glyphs; i++ ) + { + if ( charset->sids[i] > max_cid ) + max_cid = charset->sids[i]; + } + + if ( FT_NEW_ARRAY( charset->cids, (FT_ULong)max_cid + 1 ) ) + goto Exit; + + /* When multiple GIDs map to the same CID, we choose the lowest */ + /* GID. This is not described in any spec, but it matches the */ + /* behaviour of recent Acroread versions. */ + for ( j = (FT_Long)num_glyphs - 1; j >= 0; j-- ) + charset->cids[charset->sids[j]] = (FT_UShort)j; + + charset->max_cid = max_cid; + charset->num_glyphs = num_glyphs; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_UInt ) + cff_charset_cid_to_gindex( CFF_Charset charset, + FT_UInt cid ) + { + FT_UInt result = 0; + + + if ( cid <= charset->max_cid ) + result = charset->cids[cid]; + + return result; + } + + + static void + cff_charset_free_cids( CFF_Charset charset, + FT_Memory memory ) + { + FT_FREE( charset->cids ); + charset->max_cid = 0; + } + + + static void + cff_charset_done( CFF_Charset charset, + FT_Stream stream ) + { + FT_Memory memory = stream->memory; + + + cff_charset_free_cids( charset, memory ); + + FT_FREE( charset->sids ); + charset->format = 0; + charset->offset = 0; + } + + + static FT_Error + cff_charset_load( CFF_Charset charset, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong base_offset, + FT_ULong offset, + FT_Bool invert ) + { + FT_Memory memory = stream->memory; + FT_Error error = FT_Err_Ok; + FT_UShort glyph_sid; + + + /* If the offset is greater than 2, we have to parse the charset */ + /* table. */ + if ( offset > 2 ) + { + FT_UInt j; + + + charset->offset = base_offset + offset; + + /* Get the format of the table. */ + if ( FT_STREAM_SEEK( charset->offset ) || + FT_READ_BYTE( charset->format ) ) + goto Exit; + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* assign the .notdef glyph */ + charset->sids[0] = 0; + + switch ( charset->format ) + { + case 0: + if ( num_glyphs > 0 ) + { + if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) ) + goto Exit; + + for ( j = 1; j < num_glyphs; j++ ) + charset->sids[j] = FT_GET_USHORT(); + + FT_FRAME_EXIT(); + } + break; + + case 1: + case 2: + { + FT_UInt nleft; + FT_UInt i; + + + j = 1; + + while ( j < num_glyphs ) + { + /* Read the first glyph sid of the range. */ + if ( FT_READ_USHORT( glyph_sid ) ) + goto Exit; + + /* Read the number of glyphs in the range. */ + if ( charset->format == 2 ) + { + if ( FT_READ_USHORT( nleft ) ) + goto Exit; + } + else + { + if ( FT_READ_BYTE( nleft ) ) + goto Exit; + } + + /* try to rescue some of the SIDs if `nleft' is too large */ + if ( glyph_sid > 0xFFFFL - nleft ) + { + FT_ERROR(( "cff_charset_load: invalid SID range trimmed" + " nleft=%d -> %d\n", nleft, 0xFFFFL - glyph_sid )); + nleft = ( FT_UInt )( 0xFFFFL - glyph_sid ); + } + + /* Fill in the range of sids -- `nleft + 1' glyphs. */ + for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ ) + charset->sids[j] = glyph_sid; + } + } + break; + + default: + FT_ERROR(( "cff_charset_load: invalid table format\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + } + else + { + /* Parse default tables corresponding to offset == 0, 1, or 2. */ + /* CFF specification intimates the following: */ + /* */ + /* In order to use a predefined charset, the following must be */ + /* true: The charset constructed for the glyphs in the font's */ + /* charstrings dictionary must match the predefined charset in */ + /* the first num_glyphs. */ + + charset->offset = offset; /* record charset type */ + + switch ( (FT_UInt)offset ) + { + case 0: + if ( num_glyphs > 229 ) + { + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" + "predefined charset (Adobe ISO-Latin)\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* Copy the predefined charset into the allocated memory. */ + FT_ARRAY_COPY( charset->sids, cff_isoadobe_charset, num_glyphs ); + + break; + + case 1: + if ( num_glyphs > 166 ) + { + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" + "predefined charset (Adobe Expert)\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* Copy the predefined charset into the allocated memory. */ + FT_ARRAY_COPY( charset->sids, cff_expert_charset, num_glyphs ); + + break; + + case 2: + if ( num_glyphs > 87 ) + { + FT_ERROR(( "cff_charset_load: implicit charset larger than\n" + "predefined charset (Adobe Expert Subset)\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* Allocate memory for sids. */ + if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) + goto Exit; + + /* Copy the predefined charset into the allocated memory. */ + FT_ARRAY_COPY( charset->sids, cff_expertsubset_charset, num_glyphs ); + + break; + + default: + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + } + + /* we have to invert the `sids' array for subsetted CID-keyed fonts */ + if ( invert ) + error = cff_charset_compute_cids( charset, num_glyphs, memory ); + + Exit: + /* Clean up if there was an error. */ + if ( error ) + { + FT_FREE( charset->sids ); + FT_FREE( charset->cids ); + charset->format = 0; + charset->offset = 0; + charset->sids = 0; + } + + return error; + } + + + static void + cff_vstore_done( CFF_VStoreRec* vstore, + FT_Memory memory ) + { + FT_UInt i; + + + /* free regionList and axisLists */ + if ( vstore->varRegionList ) + { + for ( i = 0; i < vstore->regionCount; i++ ) + FT_FREE( vstore->varRegionList[i].axisList ); + } + FT_FREE( vstore->varRegionList ); + + /* free varData and indices */ + if ( vstore->varData ) + { + for ( i = 0; i < vstore->dataCount; i++ ) + FT_FREE( vstore->varData[i].regionIndices ); + } + FT_FREE( vstore->varData ); + } + + + /* convert 2.14 to Fixed */ + #define FT_fdot14ToFixed( x ) ( (FT_Fixed)( (FT_ULong)(x) << 2 ) ) + + + static FT_Error + cff_vstore_load( CFF_VStoreRec* vstore, + FT_Stream stream, + FT_ULong base_offset, + FT_ULong offset ) + { + FT_Memory memory = stream->memory; + FT_Error error = FT_ERR( Invalid_File_Format ); + + FT_ULong* dataOffsetArray = NULL; + FT_UInt i, j; + + + /* no offset means no vstore to parse */ + if ( offset ) + { + FT_UInt vsOffset; + FT_UInt format; + FT_ULong regionListOffset; + + + /* we need to parse the table to determine its size; */ + /* skip table length */ + if ( FT_STREAM_SEEK( base_offset + offset ) || + FT_STREAM_SKIP( 2 ) ) + goto Exit; + + /* actual variation store begins after the length */ + vsOffset = FT_STREAM_POS(); + + /* check the header */ + if ( FT_READ_USHORT( format ) ) + goto Exit; + if ( format != 1 ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* read top level fields */ + if ( FT_READ_ULONG( regionListOffset ) || + FT_READ_USHORT( vstore->dataCount ) ) + goto Exit; + + /* make temporary copy of item variation data offsets; */ + /* we'll parse region list first, then come back */ + if ( FT_NEW_ARRAY( dataOffsetArray, vstore->dataCount ) ) + goto Exit; + + for ( i = 0; i < vstore->dataCount; i++ ) + { + if ( FT_READ_ULONG( dataOffsetArray[i] ) ) + goto Exit; + } + + /* parse regionList and axisLists */ + if ( FT_STREAM_SEEK( vsOffset + regionListOffset ) || + FT_READ_USHORT( vstore->axisCount ) || + FT_READ_USHORT( vstore->regionCount ) ) + goto Exit; + + if ( FT_NEW_ARRAY( vstore->varRegionList, vstore->regionCount ) ) + goto Exit; + + for ( i = 0; i < vstore->regionCount; i++ ) + { + CFF_VarRegion* region = &vstore->varRegionList[i]; + + + if ( FT_NEW_ARRAY( region->axisList, vstore->axisCount ) ) + goto Exit; + + for ( j = 0; j < vstore->axisCount; j++ ) + { + CFF_AxisCoords* axis = ®ion->axisList[j]; + + FT_Int16 start14, peak14, end14; + + + if ( FT_READ_SHORT( start14 ) || + FT_READ_SHORT( peak14 ) || + FT_READ_SHORT( end14 ) ) + goto Exit; + + axis->startCoord = FT_fdot14ToFixed( start14 ); + axis->peakCoord = FT_fdot14ToFixed( peak14 ); + axis->endCoord = FT_fdot14ToFixed( end14 ); + } + } + + /* use dataOffsetArray now to parse varData items */ + if ( FT_NEW_ARRAY( vstore->varData, vstore->dataCount ) ) + goto Exit; + + for ( i = 0; i < vstore->dataCount; i++ ) + { + CFF_VarData* data = &vstore->varData[i]; + + + if ( FT_STREAM_SEEK( vsOffset + dataOffsetArray[i] ) ) + goto Exit; + + /* ignore `itemCount' and `shortDeltaCount' */ + /* because CFF2 has no delta sets */ + if ( FT_STREAM_SKIP( 4 ) ) + goto Exit; + + /* Note: just record values; consistency is checked later */ + /* by cff_blend_build_vector when it consumes `vstore' */ + + if ( FT_READ_USHORT( data->regionIdxCount ) ) + goto Exit; + + if ( FT_NEW_ARRAY( data->regionIndices, data->regionIdxCount ) ) + goto Exit; + + for ( j = 0; j < data->regionIdxCount; j++ ) + { + if ( FT_READ_USHORT( data->regionIndices[j] ) ) + goto Exit; + } + } + } + + error = FT_Err_Ok; + + Exit: + FT_FREE( dataOffsetArray ); + if ( error ) + cff_vstore_done( vstore, memory ); + + return error; + } + + + /* Clear blend stack (after blend values are consumed). */ + /* */ + /* TODO: Should do this in cff_run_parse, but subFont */ + /* ref is not available there. */ + /* */ + /* Allocation is not changed when stack is cleared. */ + FT_LOCAL_DEF( void ) + cff_blend_clear( CFF_SubFont subFont ) + { + subFont->blend_top = subFont->blend_stack; + subFont->blend_used = 0; + } + + + /* Blend numOperands on the stack, */ + /* store results into the first numBlends values, */ + /* then pop remaining arguments. */ + /* */ + /* This is comparable to `cf2_doBlend' but */ + /* the cffparse stack is different and can't be written. */ + /* Blended values are written to a different buffer, */ + /* using reserved operator 255. */ + /* */ + /* Blend calculation is done in 16.16 fixed point. */ + FT_LOCAL_DEF( FT_Error ) + cff_blend_doBlend( CFF_SubFont subFont, + CFF_Parser parser, + FT_UInt numBlends ) + { + FT_UInt delta; + FT_UInt base; + FT_UInt i, j; + FT_UInt size; + + CFF_Blend blend = &subFont->blend; + + FT_Memory memory = subFont->blend.font->memory; /* for FT_REALLOC */ + FT_Error error = FT_Err_Ok; /* for FT_REALLOC */ + + /* compute expected number of operands for this blend */ + FT_UInt numOperands = (FT_UInt)( numBlends * blend->lenBV ); + FT_UInt count = (FT_UInt)( parser->top - 1 - parser->stack ); + + + if ( numOperands > count ) + { + FT_TRACE4(( " cff_blend_doBlend: Stack underflow %d argument%s\n", + count, + count == 1 ? "" : "s" )); + + error = FT_THROW( Stack_Underflow ); + goto Exit; + } + + /* check whether we have room for `numBlends' values at `blend_top' */ + size = 5 * numBlends; /* add 5 bytes per entry */ + if ( subFont->blend_used + size > subFont->blend_alloc ) + { + FT_Byte* blend_stack_old = subFont->blend_stack; + FT_Byte* blend_top_old = subFont->blend_top; + + + /* increase or allocate `blend_stack' and reset `blend_top'; */ + /* prepare to append `numBlends' values to the buffer */ + if ( FT_REALLOC( subFont->blend_stack, + subFont->blend_alloc, + subFont->blend_alloc + size ) ) + goto Exit; + + subFont->blend_top = subFont->blend_stack + subFont->blend_used; + subFont->blend_alloc += size; + + /* iterate over the parser stack and adjust pointers */ + /* if the reallocated buffer has a different address */ + if ( blend_stack_old && + subFont->blend_stack != blend_stack_old ) + { + FT_PtrDist offset = subFont->blend_stack - blend_stack_old; + FT_Byte** p; + + + for ( p = parser->stack; p < parser->top; p++ ) + { + if ( *p >= blend_stack_old && *p < blend_top_old ) + *p += offset; + } + } + } + subFont->blend_used += size; + + base = count - numOperands; /* index of first blend arg */ + delta = base + numBlends; /* index of first delta arg */ + + for ( i = 0; i < numBlends; i++ ) + { + const FT_Int32* weight = &blend->BV[1]; + FT_UInt32 sum; + + + /* convert inputs to 16.16 fixed point */ + sum = cff_parse_num( parser, &parser->stack[i + base] ) * 0x10000; + + for ( j = 1; j < blend->lenBV; j++ ) + sum += cff_parse_num( parser, &parser->stack[delta++] ) * *weight++; + + /* point parser stack to new value on blend_stack */ + parser->stack[i + base] = subFont->blend_top; + + /* Push blended result as Type 2 5-byte fixed point number. This */ + /* will not conflict with actual DICTs because 255 is a reserved */ + /* opcode in both CFF and CFF2 DICTs. See `cff_parse_num' for */ + /* decode of this, which rounds to an integer. */ + *subFont->blend_top++ = 255; + *subFont->blend_top++ = (FT_Byte)( sum >> 24 ); + *subFont->blend_top++ = (FT_Byte)( sum >> 16 ); + *subFont->blend_top++ = (FT_Byte)( sum >> 8 ); + *subFont->blend_top++ = (FT_Byte)sum; + } + + /* leave only numBlends results on parser stack */ + parser->top = &parser->stack[base + numBlends]; + + Exit: + return error; + } + + + /* Compute a blend vector from variation store index and normalized */ + /* vector based on pseudo-code in OpenType Font Variations Overview. */ + /* */ + /* Note: lenNDV == 0 produces a default blend vector, (1,0,0,...). */ + FT_LOCAL_DEF( FT_Error ) + cff_blend_build_vector( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ) + { + FT_Error error = FT_Err_Ok; /* for FT_REALLOC */ + FT_Memory memory = blend->font->memory; /* for FT_REALLOC */ + + FT_UInt len; + CFF_VStore vs; + CFF_VarData* varData; + FT_UInt master; + + + FT_ASSERT( lenNDV == 0 || NDV ); + + blend->builtBV = FALSE; + + vs = &blend->font->vstore; + + /* VStore and fvar must be consistent */ + if ( lenNDV != 0 && lenNDV != vs->axisCount ) + { + FT_TRACE4(( " cff_blend_build_vector: Axis count mismatch\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( vsindex >= vs->dataCount ) + { + FT_TRACE4(( " cff_blend_build_vector: vsindex out of range\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* select the item variation data structure */ + varData = &vs->varData[vsindex]; + + /* prepare buffer for the blend vector */ + len = varData->regionIdxCount + 1; /* add 1 for default component */ + if ( FT_REALLOC( blend->BV, + blend->lenBV * sizeof( *blend->BV ), + len * sizeof( *blend->BV ) ) ) + goto Exit; + + blend->lenBV = len; + + /* outer loop steps through master designs to be blended */ + for ( master = 0; master < len; master++ ) + { + FT_UInt j; + FT_UInt idx; + CFF_VarRegion* varRegion; + + + /* default factor is always one */ + if ( master == 0 ) + { + blend->BV[master] = FT_FIXED_ONE; + FT_TRACE4(( " build blend vector len %d\n" + " [ %f ", + len, + blend->BV[master] / 65536.0 )); + continue; + } + + /* VStore array does not include default master, so subtract one */ + idx = varData->regionIndices[master - 1]; + varRegion = &vs->varRegionList[idx]; + + if ( idx >= vs->regionCount ) + { + FT_TRACE4(( " cff_blend_build_vector:" + " region index out of range\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* Note: `lenNDV' could be zero. */ + /* In that case, build default blend vector (1,0,0...). */ + if ( !lenNDV ) + { + blend->BV[master] = 0; + continue; + } + + /* In the normal case, initialize each component to 1 */ + /* before inner loop. */ + blend->BV[master] = FT_FIXED_ONE; /* default */ + + /* inner loop steps through axes in this region */ + for ( j = 0; j < lenNDV; j++ ) + { + CFF_AxisCoords* axis = &varRegion->axisList[j]; + FT_Fixed axisScalar; + + + /* compute the scalar contribution of this axis; */ + /* ignore invalid ranges */ + if ( axis->startCoord > axis->peakCoord || + axis->peakCoord > axis->endCoord ) + axisScalar = FT_FIXED_ONE; + + else if ( axis->startCoord < 0 && + axis->endCoord > 0 && + axis->peakCoord != 0 ) + axisScalar = FT_FIXED_ONE; + + /* peak of 0 means ignore this axis */ + else if ( axis->peakCoord == 0 ) + axisScalar = FT_FIXED_ONE; + + /* ignore this region if coords are out of range */ + else if ( NDV[j] < axis->startCoord || + NDV[j] > axis->endCoord ) + axisScalar = 0; + + /* calculate a proportional factor */ + else + { + if ( NDV[j] == axis->peakCoord ) + axisScalar = FT_FIXED_ONE; + else if ( NDV[j] < axis->peakCoord ) + axisScalar = FT_DivFix( NDV[j] - axis->startCoord, + axis->peakCoord - axis->startCoord ); + else + axisScalar = FT_DivFix( axis->endCoord - NDV[j], + axis->endCoord - axis->peakCoord ); + } + + /* take product of all the axis scalars */ + blend->BV[master] = FT_MulFix( blend->BV[master], axisScalar ); + } + + FT_TRACE4(( ", %f ", + blend->BV[master] / 65536.0 )); + } + + FT_TRACE4(( "]\n" )); + + /* record the parameters used to build the blend vector */ + blend->lastVsindex = vsindex; + + if ( lenNDV != 0 ) + { + /* user has set a normalized vector */ + if ( FT_REALLOC( blend->lastNDV, + blend->lenNDV * sizeof ( *NDV ), + lenNDV * sizeof ( *NDV ) ) ) + goto Exit; + + FT_MEM_COPY( blend->lastNDV, + NDV, + lenNDV * sizeof ( *NDV ) ); + } + + blend->lenNDV = lenNDV; + blend->builtBV = TRUE; + + Exit: + return error; + } + + + /* `lenNDV' is zero for default vector; */ + /* return TRUE if blend vector needs to be built. */ + FT_LOCAL_DEF( FT_Bool ) + cff_blend_check_vector( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ) + { + if ( !blend->builtBV || + blend->lastVsindex != vsindex || + blend->lenNDV != lenNDV || + ( lenNDV && + ft_memcmp( NDV, + blend->lastNDV, + lenNDV * sizeof ( *NDV ) ) != 0 ) ) + { + /* need to build blend vector */ + return TRUE; + } + + return FALSE; + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + FT_LOCAL_DEF( FT_Error ) + cff_get_var_blend( CFF_Face face, + FT_UInt *num_coords, + FT_Fixed* *coords, + FT_Fixed* *normalizedcoords, + FT_MM_Var* *mm_var ) + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + return mm->get_var_blend( FT_FACE( face ), + num_coords, + coords, + normalizedcoords, + mm_var ); + } + + + FT_LOCAL_DEF( void ) + cff_done_blend( CFF_Face face ) + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + + if (mm) + mm->done_blend( FT_FACE( face ) ); + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + + static void + cff_encoding_done( CFF_Encoding encoding ) + { + encoding->format = 0; + encoding->offset = 0; + encoding->count = 0; + } + + + static FT_Error + cff_encoding_load( CFF_Encoding encoding, + CFF_Charset charset, + FT_UInt num_glyphs, + FT_Stream stream, + FT_ULong base_offset, + FT_ULong offset ) + { + FT_Error error = FT_Err_Ok; + FT_UInt count; + FT_UInt j; + FT_UShort glyph_sid; + FT_UInt glyph_code; + + + /* Check for charset->sids. If we do not have this, we fail. */ + if ( !charset->sids ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* Zero out the code to gid/sid mappings. */ + for ( j = 0; j < 256; j++ ) + { + encoding->sids [j] = 0; + encoding->codes[j] = 0; + } + + /* Note: The encoding table in a CFF font is indexed by glyph index; */ + /* the first encoded glyph index is 1. Hence, we read the character */ + /* code (`glyph_code') at index j and make the assignment: */ + /* */ + /* encoding->codes[glyph_code] = j + 1 */ + /* */ + /* We also make the assignment: */ + /* */ + /* encoding->sids[glyph_code] = charset->sids[j + 1] */ + /* */ + /* This gives us both a code to GID and a code to SID mapping. */ + + if ( offset > 1 ) + { + encoding->offset = base_offset + offset; + + /* we need to parse the table to determine its size */ + if ( FT_STREAM_SEEK( encoding->offset ) || + FT_READ_BYTE( encoding->format ) || + FT_READ_BYTE( count ) ) + goto Exit; + + switch ( encoding->format & 0x7F ) + { + case 0: + { + FT_Byte* p; + + + /* By convention, GID 0 is always ".notdef" and is never */ + /* coded in the font. Hence, the number of codes found */ + /* in the table is `count+1'. */ + /* */ + encoding->count = count + 1; + + if ( FT_FRAME_ENTER( count ) ) + goto Exit; + + p = (FT_Byte*)stream->cursor; + + for ( j = 1; j <= count; j++ ) + { + glyph_code = *p++; + + /* Make sure j is not too big. */ + if ( j < num_glyphs ) + { + /* Assign code to GID mapping. */ + encoding->codes[glyph_code] = (FT_UShort)j; + + /* Assign code to SID mapping. */ + encoding->sids[glyph_code] = charset->sids[j]; + } + } + + FT_FRAME_EXIT(); + } + break; + + case 1: + { + FT_UInt nleft; + FT_UInt i = 1; + FT_UInt k; + + + encoding->count = 0; + + /* Parse the Format1 ranges. */ + for ( j = 0; j < count; j++, i += nleft ) + { + /* Read the first glyph code of the range. */ + if ( FT_READ_BYTE( glyph_code ) ) + goto Exit; + + /* Read the number of codes in the range. */ + if ( FT_READ_BYTE( nleft ) ) + goto Exit; + + /* Increment nleft, so we read `nleft + 1' codes/sids. */ + nleft++; + + /* compute max number of character codes */ + if ( (FT_UInt)nleft > encoding->count ) + encoding->count = nleft; + + /* Fill in the range of codes/sids. */ + for ( k = i; k < nleft + i; k++, glyph_code++ ) + { + /* Make sure k is not too big. */ + if ( k < num_glyphs && glyph_code < 256 ) + { + /* Assign code to GID mapping. */ + encoding->codes[glyph_code] = (FT_UShort)k; + + /* Assign code to SID mapping. */ + encoding->sids[glyph_code] = charset->sids[k]; + } + } + } + + /* simple check; one never knows what can be found in a font */ + if ( encoding->count > 256 ) + encoding->count = 256; + } + break; + + default: + FT_ERROR(( "cff_encoding_load: invalid table format\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* Parse supplemental encodings, if any. */ + if ( encoding->format & 0x80 ) + { + FT_UInt gindex; + + + /* count supplements */ + if ( FT_READ_BYTE( count ) ) + goto Exit; + + for ( j = 0; j < count; j++ ) + { + /* Read supplemental glyph code. */ + if ( FT_READ_BYTE( glyph_code ) ) + goto Exit; + + /* Read the SID associated with this glyph code. */ + if ( FT_READ_USHORT( glyph_sid ) ) + goto Exit; + + /* Assign code to SID mapping. */ + encoding->sids[glyph_code] = glyph_sid; + + /* First, look up GID which has been assigned to */ + /* SID glyph_sid. */ + for ( gindex = 0; gindex < num_glyphs; gindex++ ) + { + if ( charset->sids[gindex] == glyph_sid ) + { + encoding->codes[glyph_code] = (FT_UShort)gindex; + break; + } + } + } + } + } + else + { + /* We take into account the fact a CFF font can use a predefined */ + /* encoding without containing all of the glyphs encoded by this */ + /* encoding (see the note at the end of section 12 in the CFF */ + /* specification). */ + + switch ( (FT_UInt)offset ) + { + case 0: + /* First, copy the code to SID mapping. */ + FT_ARRAY_COPY( encoding->sids, cff_standard_encoding, 256 ); + goto Populate; + + case 1: + /* First, copy the code to SID mapping. */ + FT_ARRAY_COPY( encoding->sids, cff_expert_encoding, 256 ); + + Populate: + /* Construct code to GID mapping from code to SID mapping */ + /* and charset. */ + + encoding->count = 0; + + error = cff_charset_compute_cids( charset, num_glyphs, + stream->memory ); + if ( error ) + goto Exit; + + for ( j = 0; j < 256; j++ ) + { + FT_UInt sid = encoding->sids[j]; + FT_UInt gid = 0; + + + if ( sid ) + gid = cff_charset_cid_to_gindex( charset, sid ); + + if ( gid != 0 ) + { + encoding->codes[j] = (FT_UShort)gid; + encoding->count = j + 1; + } + else + { + encoding->codes[j] = 0; + encoding->sids [j] = 0; + } + } + break; + + default: + FT_ERROR(( "cff_encoding_load: invalid table format\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + } + + Exit: + + /* Clean up if there was an error. */ + return error; + } + + + /* Parse private dictionary; first call is always from `cff_face_init', */ + /* so NDV has not been set for CFF2 variation. */ + /* */ + /* `cff_slot_load' must call this function each time NDV changes. */ + FT_LOCAL_DEF( FT_Error ) + cff_load_private_dict( CFF_Font font, + CFF_SubFont subfont, + FT_UInt lenNDV, + FT_Fixed* NDV ) + { + FT_Error error = FT_Err_Ok; + CFF_ParserRec parser; + CFF_FontRecDict top = &subfont->font_dict; + CFF_Private priv = &subfont->private_dict; + FT_Stream stream = font->stream; + FT_UInt stackSize; + + + /* store handle needed to access memory, vstore for blend; */ + /* we need this for clean-up even if there is no private DICT */ + subfont->blend.font = font; + subfont->blend.usedBV = FALSE; /* clear state */ + + if ( !top->private_offset || !top->private_size ) + goto Exit2; /* no private DICT, do nothing */ + + /* set defaults */ + FT_ZERO( priv ); + + priv->blue_shift = 7; + priv->blue_fuzz = 1; + priv->lenIV = -1; + priv->expansion_factor = (FT_Fixed)( 0.06 * 0x10000L ); + priv->blue_scale = (FT_Fixed)( 0.039625 * 0x10000L * 1000 ); + + /* provide inputs for blend calculations */ + priv->subfont = subfont; + subfont->lenNDV = lenNDV; + subfont->NDV = NDV; + + /* add 1 for the operator */ + stackSize = font->cff2 ? font->top_font.font_dict.maxstack + 1 + : CFF_MAX_STACK_DEPTH + 1; + + if ( cff_parser_init( &parser, + font->cff2 ? CFF2_CODE_PRIVATE : CFF_CODE_PRIVATE, + priv, + font->library, + stackSize, + top->num_designs, + top->num_axes ) ) + goto Exit; + + if ( FT_STREAM_SEEK( font->base_offset + top->private_offset ) || + FT_FRAME_ENTER( top->private_size ) ) + goto Exit; + + FT_TRACE4(( " private dictionary:\n" )); + error = cff_parser_run( &parser, + (FT_Byte*)stream->cursor, + (FT_Byte*)stream->limit ); + FT_FRAME_EXIT(); + + if ( error ) + goto Exit; + + /* ensure that `num_blue_values' is even */ + priv->num_blue_values &= ~1; + + /* sanitize `initialRandomSeed' to be a positive value, if necessary; */ + /* this is not mandated by the specification but by our implementation */ + if ( priv->initial_random_seed < 0 ) + priv->initial_random_seed = -priv->initial_random_seed; + else if ( priv->initial_random_seed == 0 ) + priv->initial_random_seed = 987654321; + + /* some sanitizing to avoid overflows later on; */ + /* the upper limits are ad-hoc values */ + if ( priv->blue_shift > 1000 || priv->blue_shift < 0 ) + { + FT_TRACE2(( "cff_load_private_dict:" + " setting unlikely BlueShift value %d to default (7)\n", + priv->blue_shift )); + priv->blue_shift = 7; + } + + if ( priv->blue_fuzz > 1000 || priv->blue_fuzz < 0 ) + { + FT_TRACE2(( "cff_load_private_dict:" + " setting unlikely BlueFuzz value %d to default (1)\n", + priv->blue_fuzz )); + priv->blue_fuzz = 1; + } + + Exit: + /* clean up */ + cff_blend_clear( subfont ); /* clear blend stack */ + cff_parser_done( &parser ); /* free parser stack */ + + Exit2: + /* no clean up (parser not initialized) */ + return error; + } + + + /* There are 3 ways to call this function, distinguished by code. */ + /* */ + /* . CFF_CODE_TOPDICT for either a CFF Top DICT or a CFF Font DICT */ + /* . CFF2_CODE_TOPDICT for CFF2 Top DICT */ + /* . CFF2_CODE_FONTDICT for CFF2 Font DICT */ + + static FT_Error + cff_subfont_load( CFF_SubFont subfont, + CFF_Index idx, + FT_UInt font_index, + FT_Stream stream, + FT_ULong base_offset, + FT_UInt code, + CFF_Font font, + CFF_Face face ) + { + FT_Error error; + CFF_ParserRec parser; + FT_Byte* dict = NULL; + FT_ULong dict_len; + CFF_FontRecDict top = &subfont->font_dict; + CFF_Private priv = &subfont->private_dict; + + PSAux_Service psaux = (PSAux_Service)face->psaux; + + FT_Bool cff2 = FT_BOOL( code == CFF2_CODE_TOPDICT || + code == CFF2_CODE_FONTDICT ); + FT_UInt stackSize = cff2 ? CFF2_DEFAULT_STACK + : CFF_MAX_STACK_DEPTH; + + + /* Note: We use default stack size for CFF2 Font DICT because */ + /* Top and Font DICTs are not allowed to have blend operators. */ + error = cff_parser_init( &parser, + code, + &subfont->font_dict, + font->library, + stackSize, + 0, + 0 ); + if ( error ) + goto Exit; + + /* set defaults */ + FT_ZERO( top ); + + top->underline_position = -( 100L << 16 ); + top->underline_thickness = 50L << 16; + top->charstring_type = 2; + top->font_matrix.xx = 0x10000L; + top->font_matrix.yy = 0x10000L; + top->cid_count = 8720; + + /* we use the implementation specific SID value 0xFFFF to indicate */ + /* missing entries */ + top->version = 0xFFFFU; + top->notice = 0xFFFFU; + top->copyright = 0xFFFFU; + top->full_name = 0xFFFFU; + top->family_name = 0xFFFFU; + top->weight = 0xFFFFU; + top->embedded_postscript = 0xFFFFU; + + top->cid_registry = 0xFFFFU; + top->cid_ordering = 0xFFFFU; + top->cid_font_name = 0xFFFFU; + + /* set default stack size */ + top->maxstack = cff2 ? CFF2_DEFAULT_STACK : 48; + + if ( idx->count ) /* count is nonzero for a real index */ + error = cff_index_access_element( idx, font_index, &dict, &dict_len ); + else + { + /* CFF2 has a fake top dict index; */ + /* simulate `cff_index_access_element' */ + + /* Note: macros implicitly use `stream' and set `error' */ + if ( FT_STREAM_SEEK( idx->data_offset ) || + FT_FRAME_EXTRACT( idx->data_size, dict ) ) + goto Exit; + + dict_len = idx->data_size; + } + + if ( !error ) + { + FT_TRACE4(( " top dictionary:\n" )); + error = cff_parser_run( &parser, dict, dict + dict_len ); + } + + /* clean up regardless of error */ + if ( idx->count ) + cff_index_forget_element( idx, &dict ); + else + FT_FRAME_RELEASE( dict ); + + if ( error ) + goto Exit; + + /* if it is a CID font, we stop there */ + if ( top->cid_registry != 0xFFFFU ) + goto Exit; + + /* Parse the private dictionary, if any. */ + /* */ + /* CFF2 does not have a private dictionary in the Top DICT */ + /* but may have one in a Font DICT. We need to parse */ + /* the latter here in order to load any local subrs. */ + error = cff_load_private_dict( font, subfont, 0, 0 ); + if ( error ) + goto Exit; + + if ( !cff2 ) + { + /* + * Initialize the random number generator. + * + * . If we have a face-specific seed, use it. + * If non-zero, update it to a positive value. + * + * . Otherwise, use the seed from the CFF driver. + * If non-zero, update it to a positive value. + * + * . If the random value is zero, use the seed given by the subfont's + * `initialRandomSeed' value. + * + */ + if ( face->root.internal->random_seed == -1 ) + { + PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( face ); + + + subfont->random = (FT_UInt32)driver->random_seed; + if ( driver->random_seed ) + { + do + { + driver->random_seed = + (FT_Int32)psaux->cff_random( (FT_UInt32)driver->random_seed ); + + } while ( driver->random_seed < 0 ); + } + } + else + { + subfont->random = (FT_UInt32)face->root.internal->random_seed; + if ( face->root.internal->random_seed ) + { + do + { + face->root.internal->random_seed = + (FT_Int32)psaux->cff_random( + (FT_UInt32)face->root.internal->random_seed ); + + } while ( face->root.internal->random_seed < 0 ); + } + } + + if ( !subfont->random ) + subfont->random = (FT_UInt32)priv->initial_random_seed; + } + + /* read the local subrs, if any */ + if ( priv->local_subrs_offset ) + { + if ( FT_STREAM_SEEK( base_offset + top->private_offset + + priv->local_subrs_offset ) ) + goto Exit; + + error = cff_index_init( &subfont->local_subrs_index, stream, 1, cff2 ); + if ( error ) + goto Exit; + + error = cff_index_get_pointers( &subfont->local_subrs_index, + &subfont->local_subrs, NULL, NULL ); + if ( error ) + goto Exit; + } + + Exit: + cff_parser_done( &parser ); /* free parser stack */ + + return error; + } + + + static void + cff_subfont_done( FT_Memory memory, + CFF_SubFont subfont ) + { + if ( subfont ) + { + cff_index_done( &subfont->local_subrs_index ); + FT_FREE( subfont->local_subrs ); + + FT_FREE( subfont->blend.lastNDV ); + FT_FREE( subfont->blend.BV ); + FT_FREE( subfont->blend_stack ); + } + } + + + FT_LOCAL_DEF( FT_Error ) + cff_font_load( FT_Library library, + FT_Stream stream, + FT_Int face_index, + CFF_Font font, + CFF_Face face, + FT_Bool pure_cff, + FT_Bool cff2 ) + { + static const FT_Frame_Field cff_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRec + + FT_FRAME_START( 3 ), + FT_FRAME_BYTE( version_major ), + FT_FRAME_BYTE( version_minor ), + FT_FRAME_BYTE( header_size ), + FT_FRAME_END + }; + + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong base_offset; + CFF_FontRecDict dict; + CFF_IndexRec string_index; + FT_UInt subfont_index; + + + FT_ZERO( font ); + FT_ZERO( &string_index ); + + dict = &font->top_font.font_dict; + base_offset = FT_STREAM_POS(); + + font->library = library; + font->stream = stream; + font->memory = memory; + font->cff2 = cff2; + font->base_offset = base_offset; + + /* read CFF font header */ + if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) ) + goto Exit; + + if ( cff2 ) + { + if ( font->version_major != 2 || + font->header_size < 5 ) + { + FT_TRACE2(( " not a CFF2 font header\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + if ( FT_READ_USHORT( font->top_dict_length ) ) + goto Exit; + } + else + { + FT_Byte absolute_offset; + + + if ( FT_READ_BYTE( absolute_offset ) ) + goto Exit; + + if ( font->version_major != 1 || + font->header_size < 4 || + absolute_offset > 4 ) + { + FT_TRACE2(( " not a CFF font header\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + } + + /* skip the rest of the header */ + if ( FT_STREAM_SEEK( base_offset + font->header_size ) ) + { + /* For pure CFFs we have read only four bytes so far. Contrary to */ + /* other formats like SFNT those bytes doesn't define a signature; */ + /* it is thus possible that the font isn't a CFF at all. */ + if ( pure_cff ) + { + FT_TRACE2(( " not a CFF file\n" )); + error = FT_THROW( Unknown_File_Format ); + } + goto Exit; + } + + if ( cff2 ) + { + /* For CFF2, the top dict data immediately follow the header */ + /* and the length is stored in the header `offSize' field; */ + /* there is no index for it. */ + /* */ + /* Use the `font_dict_index' to save the current position */ + /* and length of data, but leave count at zero as an indicator. */ + FT_ZERO( &font->font_dict_index ); + + font->font_dict_index.data_offset = FT_STREAM_POS(); + font->font_dict_index.data_size = font->top_dict_length; + + /* skip the top dict data for now, we will parse it later */ + if ( FT_STREAM_SKIP( font->top_dict_length ) ) + goto Exit; + + /* next, read the global subrs index */ + if ( FT_SET_ERROR( cff_index_init( &font->global_subrs_index, + stream, 1, cff2 ) ) ) + goto Exit; + } + else + { + /* for CFF, read the name, top dict, string and global subrs index */ + if ( FT_SET_ERROR( cff_index_init( &font->name_index, + stream, 0, cff2 ) ) ) + { + if ( pure_cff ) + { + FT_TRACE2(( " not a CFF file\n" )); + error = FT_THROW( Unknown_File_Format ); + } + goto Exit; + } + + /* if we have an empty font name, */ + /* it must be the only font in the CFF */ + if ( font->name_index.count > 1 && + font->name_index.data_size < font->name_index.count ) + { + /* for pure CFFs, we still haven't checked enough bytes */ + /* to be sure that it is a CFF at all */ + error = pure_cff ? FT_THROW( Unknown_File_Format ) + : FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( FT_SET_ERROR( cff_index_init( &font->font_dict_index, + stream, 0, cff2 ) ) || + FT_SET_ERROR( cff_index_init( &string_index, + stream, 1, cff2 ) ) || + FT_SET_ERROR( cff_index_init( &font->global_subrs_index, + stream, 1, cff2 ) ) || + FT_SET_ERROR( cff_index_get_pointers( &string_index, + &font->strings, + &font->string_pool, + &font->string_pool_size ) ) ) + goto Exit; + + /* there must be a Top DICT index entry for each name index entry */ + if ( font->name_index.count > font->font_dict_index.count ) + { + FT_ERROR(( "cff_font_load:" + " not enough entries in Top DICT index\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + } + + font->num_strings = string_index.count; + + if ( pure_cff ) + { + /* well, we don't really forget the `disabled' fonts... */ + subfont_index = (FT_UInt)( face_index & 0xFFFF ); + + if ( face_index > 0 && subfont_index >= font->name_index.count ) + { + FT_ERROR(( "cff_font_load:" + " invalid subfont index for pure CFF font (%d)\n", + subfont_index )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + font->num_faces = font->name_index.count; + } + else + { + subfont_index = 0; + + if ( font->name_index.count > 1 ) + { + FT_ERROR(( "cff_font_load:" + " invalid CFF font with multiple subfonts\n" + " " + " in SFNT wrapper\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + } + + /* in case of a font format check, simply exit now */ + if ( face_index < 0 ) + goto Exit; + + /* now, parse the top-level font dictionary */ + FT_TRACE4(( "parsing top-level\n" )); + error = cff_subfont_load( &font->top_font, + &font->font_dict_index, + subfont_index, + stream, + base_offset, + cff2 ? CFF2_CODE_TOPDICT : CFF_CODE_TOPDICT, + font, + face ); + if ( error ) + goto Exit; + + if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) ) + goto Exit; + + error = cff_index_init( &font->charstrings_index, stream, 0, cff2 ); + if ( error ) + goto Exit; + + /* now, check for a CID or CFF2 font */ + if ( dict->cid_registry != 0xFFFFU || + cff2 ) + { + CFF_IndexRec fd_index; + CFF_SubFont sub = NULL; + FT_UInt idx; + + + /* for CFF2, read the Variation Store if available; */ + /* this must follow the Top DICT parse and precede any Private DICT */ + error = cff_vstore_load( &font->vstore, + stream, + base_offset, + dict->vstore_offset ); + if ( error ) + goto Exit; + + /* this is a CID-keyed font, we must now allocate a table of */ + /* sub-fonts, then load each of them separately */ + if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) ) + goto Exit; + + error = cff_index_init( &fd_index, stream, 0, cff2 ); + if ( error ) + goto Exit; + + /* Font Dicts are not limited to 256 for CFF2. */ + /* TODO: support this for CFF2 */ + if ( fd_index.count > CFF_MAX_CID_FONTS ) + { + FT_TRACE0(( "cff_font_load: FD array too large in CID font\n" )); + goto Fail_CID; + } + + /* allocate & read each font dict independently */ + font->num_subfonts = fd_index.count; + if ( FT_NEW_ARRAY( sub, fd_index.count ) ) + goto Fail_CID; + + /* set up pointer table */ + for ( idx = 0; idx < fd_index.count; idx++ ) + font->subfonts[idx] = sub + idx; + + /* now load each subfont independently */ + for ( idx = 0; idx < fd_index.count; idx++ ) + { + sub = font->subfonts[idx]; + FT_TRACE4(( "parsing subfont %u\n", idx )); + error = cff_subfont_load( sub, + &fd_index, + idx, + stream, + base_offset, + cff2 ? CFF2_CODE_FONTDICT + : CFF_CODE_TOPDICT, + font, + face ); + if ( error ) + goto Fail_CID; + } + + /* now load the FD Select array; */ + /* CFF2 omits FDSelect if there is only one FD */ + if ( !cff2 || fd_index.count > 1 ) + error = CFF_Load_FD_Select( &font->fd_select, + font->charstrings_index.count, + stream, + base_offset + dict->cid_fd_select_offset ); + + Fail_CID: + cff_index_done( &fd_index ); + + if ( error ) + goto Exit; + } + else + font->num_subfonts = 0; + + /* read the charstrings index now */ + if ( dict->charstrings_offset == 0 ) + { + FT_ERROR(( "cff_font_load: no charstrings offset\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + font->num_glyphs = font->charstrings_index.count; + + error = cff_index_get_pointers( &font->global_subrs_index, + &font->global_subrs, NULL, NULL ); + + if ( error ) + goto Exit; + + /* read the Charset and Encoding tables if available */ + if ( !cff2 && font->num_glyphs > 0 ) + { + FT_Bool invert = FT_BOOL( dict->cid_registry != 0xFFFFU && pure_cff ); + + + error = cff_charset_load( &font->charset, font->num_glyphs, stream, + base_offset, dict->charset_offset, invert ); + if ( error ) + goto Exit; + + /* CID-keyed CFFs don't have an encoding */ + if ( dict->cid_registry == 0xFFFFU ) + { + error = cff_encoding_load( &font->encoding, + &font->charset, + font->num_glyphs, + stream, + base_offset, + dict->encoding_offset ); + if ( error ) + goto Exit; + } + } + + /* get the font name (/CIDFontName for CID-keyed fonts, */ + /* /FontName otherwise) */ + font->font_name = cff_index_get_name( font, subfont_index ); + + Exit: + cff_index_done( &string_index ); + + return error; + } + + + FT_LOCAL_DEF( void ) + cff_font_done( CFF_Font font ) + { + FT_Memory memory = font->memory; + FT_UInt idx; + + + cff_index_done( &font->global_subrs_index ); + cff_index_done( &font->font_dict_index ); + cff_index_done( &font->name_index ); + cff_index_done( &font->charstrings_index ); + + /* release font dictionaries, but only if working with */ + /* a CID keyed CFF font or a CFF2 font */ + if ( font->num_subfonts > 0 ) + { + for ( idx = 0; idx < font->num_subfonts; idx++ ) + cff_subfont_done( memory, font->subfonts[idx] ); + + /* the subfonts array has been allocated as a single block */ + FT_FREE( font->subfonts[0] ); + } + + cff_encoding_done( &font->encoding ); + cff_charset_done( &font->charset, font->stream ); + cff_vstore_done( &font->vstore, memory ); + + cff_subfont_done( memory, &font->top_font ); + + CFF_Done_FD_Select( &font->fd_select, font->stream ); + + FT_FREE( font->font_info ); + + FT_FREE( font->font_name ); + FT_FREE( font->global_subrs ); + FT_FREE( font->strings ); + FT_FREE( font->string_pool ); + + if ( font->cf2_instance.finalizer ) + { + font->cf2_instance.finalizer( font->cf2_instance.data ); + FT_FREE( font->cf2_instance.data ); + } + + FT_FREE( font->font_extra ); + } + + +/* END */ diff --git a/vendor/FreeType2/src/cff/cffload.h b/vendor/FreeType2/src/cff/cffload.h new file mode 100644 index 0000000..14d14e2 --- /dev/null +++ b/vendor/FreeType2/src/cff/cffload.h @@ -0,0 +1,125 @@ +/***************************************************************************/ +/* */ +/* cffload.h */ +/* */ +/* OpenType & CFF data/program tables loader (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef CFFLOAD_H_ +#define CFFLOAD_H_ + + +#include +#include FT_INTERNAL_CFF_TYPES_H +#include "cffparse.h" +#include FT_INTERNAL_CFF_OBJECTS_TYPES_H /* for CFF_Face */ + + +FT_BEGIN_HEADER + + FT_LOCAL( FT_UShort ) + cff_get_standard_encoding( FT_UInt charcode ); + + + FT_LOCAL( FT_String* ) + cff_index_get_string( CFF_Font font, + FT_UInt element ); + + FT_LOCAL( FT_String* ) + cff_index_get_sid_string( CFF_Font font, + FT_UInt sid ); + + + FT_LOCAL( FT_Error ) + cff_index_access_element( CFF_Index idx, + FT_UInt element, + FT_Byte** pbytes, + FT_ULong* pbyte_len ); + + FT_LOCAL( void ) + cff_index_forget_element( CFF_Index idx, + FT_Byte** pbytes ); + + FT_LOCAL( FT_String* ) + cff_index_get_name( CFF_Font font, + FT_UInt element ); + + + FT_LOCAL( FT_UInt ) + cff_charset_cid_to_gindex( CFF_Charset charset, + FT_UInt cid ); + + + FT_LOCAL( FT_Error ) + cff_font_load( FT_Library library, + FT_Stream stream, + FT_Int face_index, + CFF_Font font, + CFF_Face face, + FT_Bool pure_cff, + FT_Bool cff2 ); + + FT_LOCAL( void ) + cff_font_done( CFF_Font font ); + + + FT_LOCAL( FT_Error ) + cff_load_private_dict( CFF_Font font, + CFF_SubFont subfont, + FT_UInt lenNDV, + FT_Fixed* NDV ); + + FT_LOCAL( FT_Byte ) + cff_fd_select_get( CFF_FDSelect fdselect, + FT_UInt glyph_index ); + + FT_LOCAL( FT_Bool ) + cff_blend_check_vector( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ); + + FT_LOCAL( FT_Error ) + cff_blend_build_vector( CFF_Blend blend, + FT_UInt vsindex, + FT_UInt lenNDV, + FT_Fixed* NDV ); + + FT_LOCAL( void ) + cff_blend_clear( CFF_SubFont subFont ); + + FT_LOCAL( FT_Error ) + cff_blend_doBlend( CFF_SubFont subfont, + CFF_Parser parser, + FT_UInt numBlends ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_LOCAL( FT_Error ) + cff_get_var_blend( CFF_Face face, + FT_UInt *num_coords, + FT_Fixed* *coords, + FT_Fixed* *normalizedcoords, + FT_MM_Var* *mm_var ); + + FT_LOCAL( void ) + cff_done_blend( CFF_Face face ); +#endif + + +FT_END_HEADER + +#endif /* CFFLOAD_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/cff/cffobjs.c b/vendor/FreeType2/src/cff/cffobjs.c new file mode 100644 index 0000000..a2d7aec --- /dev/null +++ b/vendor/FreeType2/src/cff/cffobjs.c @@ -0,0 +1,1206 @@ +/***************************************************************************/ +/* */ +/* cffobjs.c */ +/* */ +/* OpenType objects manager (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include + +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_STREAM_H +#include FT_ERRORS_H +#include FT_TRUETYPE_IDS_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_SFNT_H +#include FT_DRIVER_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_METRICS_VARIATIONS_H +#endif + +#include FT_INTERNAL_CFF_OBJECTS_TYPES_H +#include "cffobjs.h" +#include "cffload.h" +#include "cffcmap.h" +#include "cffpic.h" + +#include "cfferrs.h" + +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_SERVICE_CFF_TABLE_LOAD_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_cffobjs + + + /*************************************************************************/ + /* */ + /* SIZE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + static PSH_Globals_Funcs + cff_size_get_globals_funcs( CFF_Size size ) + { + CFF_Face face = (CFF_Face)size->root.face; + CFF_Font font = (CFF_Font)face->extra.data; + PSHinter_Service pshinter = font->pshinter; + FT_Module module; + + + module = FT_Get_Module( size->root.face->driver->root.library, + "pshinter" ); + return ( module && pshinter && pshinter->get_globals_funcs ) + ? pshinter->get_globals_funcs( module ) + : 0; + } + + + FT_LOCAL_DEF( void ) + cff_size_done( FT_Size cffsize ) /* CFF_Size */ + { + FT_Memory memory = cffsize->face->memory; + CFF_Size size = (CFF_Size)cffsize; + CFF_Face face = (CFF_Face)size->root.face; + CFF_Font font = (CFF_Font)face->extra.data; + CFF_Internal internal = (CFF_Internal)cffsize->internal->module_data; + + + if ( internal ) + { + PSH_Globals_Funcs funcs; + + + funcs = cff_size_get_globals_funcs( size ); + if ( funcs ) + { + FT_UInt i; + + + funcs->destroy( internal->topfont ); + + for ( i = font->num_subfonts; i > 0; i-- ) + funcs->destroy( internal->subfonts[i - 1] ); + } + + FT_FREE( internal ); + } + } + + + /* CFF and Type 1 private dictionaries have slightly different */ + /* structures; we need to synthesize a Type 1 dictionary on the fly */ + + static void + cff_make_private_dict( CFF_SubFont subfont, + PS_Private priv ) + { + CFF_Private cpriv = &subfont->private_dict; + FT_UInt n, count; + + + FT_ZERO( priv ); + + count = priv->num_blue_values = cpriv->num_blue_values; + for ( n = 0; n < count; n++ ) + priv->blue_values[n] = (FT_Short)cpriv->blue_values[n]; + + count = priv->num_other_blues = cpriv->num_other_blues; + for ( n = 0; n < count; n++ ) + priv->other_blues[n] = (FT_Short)cpriv->other_blues[n]; + + count = priv->num_family_blues = cpriv->num_family_blues; + for ( n = 0; n < count; n++ ) + priv->family_blues[n] = (FT_Short)cpriv->family_blues[n]; + + count = priv->num_family_other_blues = cpriv->num_family_other_blues; + for ( n = 0; n < count; n++ ) + priv->family_other_blues[n] = (FT_Short)cpriv->family_other_blues[n]; + + priv->blue_scale = cpriv->blue_scale; + priv->blue_shift = (FT_Int)cpriv->blue_shift; + priv->blue_fuzz = (FT_Int)cpriv->blue_fuzz; + + priv->standard_width[0] = (FT_UShort)cpriv->standard_width; + priv->standard_height[0] = (FT_UShort)cpriv->standard_height; + + count = priv->num_snap_widths = cpriv->num_snap_widths; + for ( n = 0; n < count; n++ ) + priv->snap_widths[n] = (FT_Short)cpriv->snap_widths[n]; + + count = priv->num_snap_heights = cpriv->num_snap_heights; + for ( n = 0; n < count; n++ ) + priv->snap_heights[n] = (FT_Short)cpriv->snap_heights[n]; + + priv->force_bold = cpriv->force_bold; + priv->language_group = cpriv->language_group; + priv->lenIV = cpriv->lenIV; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_size_init( FT_Size cffsize ) /* CFF_Size */ + { + CFF_Size size = (CFF_Size)cffsize; + FT_Error error = FT_Err_Ok; + PSH_Globals_Funcs funcs = cff_size_get_globals_funcs( size ); + + + if ( funcs ) + { + CFF_Face face = (CFF_Face)cffsize->face; + CFF_Font font = (CFF_Font)face->extra.data; + CFF_Internal internal = NULL; + + PS_PrivateRec priv; + FT_Memory memory = cffsize->face->memory; + + FT_UInt i; + + + if ( FT_NEW( internal ) ) + goto Exit; + + cff_make_private_dict( &font->top_font, &priv ); + error = funcs->create( cffsize->face->memory, &priv, + &internal->topfont ); + if ( error ) + goto Exit; + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + + + cff_make_private_dict( sub, &priv ); + error = funcs->create( cffsize->face->memory, &priv, + &internal->subfonts[i - 1] ); + if ( error ) + goto Exit; + } + + cffsize->internal->module_data = internal; + } + + size->strike_index = 0xFFFFFFFFUL; + + Exit: + return error; + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL_DEF( FT_Error ) + cff_size_select( FT_Size size, + FT_ULong strike_index ) + { + CFF_Size cffsize = (CFF_Size)size; + PSH_Globals_Funcs funcs; + + + cffsize->strike_index = strike_index; + + FT_Select_Metrics( size->face, strike_index ); + + funcs = cff_size_get_globals_funcs( cffsize ); + + if ( funcs ) + { + CFF_Face face = (CFF_Face)size->face; + CFF_Font font = (CFF_Font)face->extra.data; + CFF_Internal internal = (CFF_Internal)size->internal->module_data; + + FT_Long top_upm = (FT_Long)font->top_font.font_dict.units_per_em; + FT_UInt i; + + + funcs->set_scale( internal->topfont, + size->metrics.x_scale, size->metrics.y_scale, + 0, 0 ); + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + FT_Long sub_upm = (FT_Long)sub->font_dict.units_per_em; + FT_Pos x_scale, y_scale; + + + if ( top_upm != sub_upm ) + { + x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); + y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); + } + else + { + x_scale = size->metrics.x_scale; + y_scale = size->metrics.y_scale; + } + + funcs->set_scale( internal->subfonts[i - 1], + x_scale, y_scale, 0, 0 ); + } + } + + return FT_Err_Ok; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + FT_LOCAL_DEF( FT_Error ) + cff_size_request( FT_Size size, + FT_Size_Request req ) + { + CFF_Size cffsize = (CFF_Size)size; + PSH_Globals_Funcs funcs; + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + if ( FT_HAS_FIXED_SIZES( size->face ) ) + { + CFF_Face cffface = (CFF_Face)size->face; + SFNT_Service sfnt = (SFNT_Service)cffface->sfnt; + FT_ULong strike_index; + + + if ( sfnt->set_sbit_strike( cffface, req, &strike_index ) ) + cffsize->strike_index = 0xFFFFFFFFUL; + else + return cff_size_select( size, strike_index ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + FT_Request_Metrics( size->face, req ); + + funcs = cff_size_get_globals_funcs( cffsize ); + + if ( funcs ) + { + CFF_Face cffface = (CFF_Face)size->face; + CFF_Font font = (CFF_Font)cffface->extra.data; + CFF_Internal internal = (CFF_Internal)size->internal->module_data; + + FT_Long top_upm = (FT_Long)font->top_font.font_dict.units_per_em; + FT_UInt i; + + + funcs->set_scale( internal->topfont, + size->metrics.x_scale, size->metrics.y_scale, + 0, 0 ); + + for ( i = font->num_subfonts; i > 0; i-- ) + { + CFF_SubFont sub = font->subfonts[i - 1]; + FT_Long sub_upm = (FT_Long)sub->font_dict.units_per_em; + FT_Pos x_scale, y_scale; + + + if ( top_upm != sub_upm ) + { + x_scale = FT_MulDiv( size->metrics.x_scale, top_upm, sub_upm ); + y_scale = FT_MulDiv( size->metrics.y_scale, top_upm, sub_upm ); + } + else + { + x_scale = size->metrics.x_scale; + y_scale = size->metrics.y_scale; + } + + funcs->set_scale( internal->subfonts[i - 1], + x_scale, y_scale, 0, 0 ); + } + } + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* SLOT FUNCTIONS */ + /* */ + /*************************************************************************/ + + FT_LOCAL_DEF( void ) + cff_slot_done( FT_GlyphSlot slot ) + { + slot->internal->glyph_hints = NULL; + } + + + FT_LOCAL_DEF( FT_Error ) + cff_slot_init( FT_GlyphSlot slot ) + { + CFF_Face face = (CFF_Face)slot->face; + CFF_Font font = (CFF_Font)face->extra.data; + PSHinter_Service pshinter = font->pshinter; + + + if ( pshinter ) + { + FT_Module module; + + + module = FT_Get_Module( slot->face->driver->root.library, + "pshinter" ); + if ( module ) + { + T2_Hints_Funcs funcs; + + + funcs = pshinter->get_t2_funcs( module ); + slot->internal->glyph_hints = (void*)funcs; + } + } + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* FACE FUNCTIONS */ + /* */ + /*************************************************************************/ + + static FT_String* + cff_strcpy( FT_Memory memory, + const FT_String* source ) + { + FT_Error error; + FT_String* result; + + + (void)FT_STRDUP( result, source ); + + FT_UNUSED( error ); + + return result; + } + + + /* Strip all subset prefixes of the form `ABCDEF+'. Usually, there */ + /* is only one, but font names like `APCOOG+JFABTD+FuturaBQ-Bold' */ + /* have been seen in the wild. */ + + static void + remove_subset_prefix( FT_String* name ) + { + FT_Int32 idx = 0; + FT_Int32 length = (FT_Int32)ft_strlen( name ) + 1; + FT_Bool continue_search = 1; + + + while ( continue_search ) + { + if ( length >= 7 && name[6] == '+' ) + { + for ( idx = 0; idx < 6; idx++ ) + { + /* ASCII uppercase letters */ + if ( !( 'A' <= name[idx] && name[idx] <= 'Z' ) ) + continue_search = 0; + } + + if ( continue_search ) + { + for ( idx = 7; idx < length; idx++ ) + name[idx - 7] = name[idx]; + length -= 7; + } + } + else + continue_search = 0; + } + } + + + /* Remove the style part from the family name (if present). */ + + static void + remove_style( FT_String* family_name, + const FT_String* style_name ) + { + FT_Int32 family_name_length, style_name_length; + + + family_name_length = (FT_Int32)ft_strlen( family_name ); + style_name_length = (FT_Int32)ft_strlen( style_name ); + + if ( family_name_length > style_name_length ) + { + FT_Int idx; + + + for ( idx = 1; idx <= style_name_length; idx++ ) + { + if ( family_name[family_name_length - idx] != + style_name[style_name_length - idx] ) + break; + } + + if ( idx > style_name_length ) + { + /* family_name ends with style_name; remove it */ + idx = family_name_length - style_name_length - 1; + + /* also remove special characters */ + /* between real family name and style */ + while ( idx > 0 && + ( family_name[idx] == '-' || + family_name[idx] == ' ' || + family_name[idx] == '_' || + family_name[idx] == '+' ) ) + idx--; + + if ( idx > 0 ) + family_name[idx + 1] = '\0'; + } + } + } + + + FT_LOCAL_DEF( FT_Error ) + cff_face_init( FT_Stream stream, + FT_Face cffface, /* CFF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + CFF_Face face = (CFF_Face)cffface; + FT_Error error; + SFNT_Service sfnt; + FT_Service_PsCMaps psnames; + PSHinter_Service pshinter; + PSAux_Service psaux; + FT_Service_CFFLoad cffload; + FT_Bool pure_cff = 1; + FT_Bool cff2 = 0; + FT_Bool sfnt_format = 0; + FT_Library library = cffface->driver->root.library; + + + sfnt = (SFNT_Service)FT_Get_Module_Interface( library, + "sfnt" ); + if ( !sfnt ) + { + FT_ERROR(( "cff_face_init: cannot access `sfnt' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + + pshinter = (PSHinter_Service)FT_Get_Module_Interface( library, + "pshinter" ); + + psaux = (PSAux_Service)FT_Get_Module_Interface( library, + "psaux" ); + if ( !psaux ) + { + FT_ERROR(( "cff_face_init: cannot access `psaux' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + face->psaux = psaux; + + FT_FACE_FIND_GLOBAL_SERVICE( face, cffload, CFF_LOAD ); + + FT_TRACE2(( "CFF driver\n" )); + + /* create input stream from resource */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + /* check whether we have a valid OpenType file */ + FT_TRACE2(( " " )); + error = sfnt->init_face( stream, face, face_index, num_params, params ); + if ( !error ) + { + if ( face->format_tag != TTAG_OTTO ) /* `OTTO'; OpenType/CFF font */ + { + FT_TRACE2(( " not an OpenType/CFF font\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + /* if we are performing a simple font format check, exit immediately */ + if ( face_index < 0 ) + return FT_Err_Ok; + + sfnt_format = 1; + + /* now, the font can be either an OpenType/CFF font, or an SVG CEF */ + /* font; in the latter case it doesn't have a `head' table */ + error = face->goto_table( face, TTAG_head, stream, 0 ); + if ( !error ) + { + pure_cff = 0; + + /* load font directory */ + error = sfnt->load_face( stream, face, face_index, + num_params, params ); + if ( error ) + goto Exit; + } + else + { + /* load the `cmap' table explicitly */ + error = sfnt->load_cmap( face, stream ); + if ( error ) + goto Exit; + } + + /* now load the CFF part of the file; */ + /* give priority to CFF2 */ + error = face->goto_table( face, TTAG_CFF2, stream, 0 ); + if ( !error ) + { + cff2 = 1; + face->is_cff2 = cff2; + } + + if ( FT_ERR_EQ( error, Table_Missing ) ) + error = face->goto_table( face, TTAG_CFF, stream, 0 ); + + if ( error ) + goto Exit; + } + else + { + /* rewind to start of file; we are going to load a pure-CFF font */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + error = FT_Err_Ok; + } + + /* now load and parse the CFF table in the file */ + { + CFF_Font cff = NULL; + CFF_FontRecDict dict; + FT_Memory memory = cffface->memory; + FT_Int32 flags; + FT_UInt i; + + + if ( FT_NEW( cff ) ) + goto Exit; + + face->extra.data = cff; + error = cff_font_load( library, + stream, + face_index, + cff, + face, + pure_cff, + cff2 ); + if ( error ) + goto Exit; + + /* if we are performing a simple font format check, exit immediately */ + /* (this is here for pure CFF) */ + if ( face_index < 0 ) + { + cffface->num_faces = (FT_Long)cff->num_faces; + return FT_Err_Ok; + } + + cff->pshinter = pshinter; + cff->psnames = psnames; + cff->cffload = cffload; + + cffface->face_index = face_index & 0xFFFF; + + /* Complement the root flags with some interesting information. */ + /* Note that this is only necessary for pure CFF and CEF fonts; */ + /* SFNT based fonts use the `name' table instead. */ + + cffface->num_glyphs = (FT_Long)cff->num_glyphs; + + dict = &cff->top_font.font_dict; + + /* we need the `PSNames' module for CFF and CEF formats */ + /* which aren't CID-keyed */ + if ( dict->cid_registry == 0xFFFFU && !psnames ) + { + FT_ERROR(( "cff_face_init:" + " cannot open CFF & CEF fonts\n" + " " + " without the `PSNames' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_UInt idx; + FT_String* s; + + + FT_TRACE4(( "SIDs\n" )); + + /* dump string index, including default strings for convenience */ + for ( idx = 0; idx <= 390; idx++ ) + { + s = cff_index_get_sid_string( cff, idx ); + if ( s ) + FT_TRACE4(( " %5d %s\n", idx, s )); + } + + /* In Multiple Master CFFs, two SIDs hold the Normalize Design */ + /* Vector (NDV) and Convert Design Vector (CDV) charstrings, */ + /* which may contain NULL bytes in the middle of the data, too. */ + /* We thus access `cff->strings' directly. */ + for ( idx = 1; idx < cff->num_strings; idx++ ) + { + FT_Byte* s1 = cff->strings[idx - 1]; + FT_Byte* s2 = cff->strings[idx]; + FT_PtrDist s1len = s2 - s1 - 1; /* without the final NULL byte */ + FT_PtrDist l; + + + FT_TRACE4(( " %5d ", idx + 390 )); + for ( l = 0; l < s1len; l++ ) + FT_TRACE4(( "%c", s1[l] )); + FT_TRACE4(( "\n" )); + } + + /* print last element */ + if ( cff->num_strings ) + { + FT_Byte* s1 = cff->strings[cff->num_strings - 1]; + FT_Byte* s2 = cff->string_pool + cff->string_pool_size; + FT_PtrDist s1len = s2 - s1 - 1; + FT_PtrDist l; + + + FT_TRACE4(( " %5d ", cff->num_strings + 390 )); + for ( l = 0; l < s1len; l++ ) + FT_TRACE4(( "%c", s1[l] )); + FT_TRACE4(( "\n" )); + } + } +#endif /* FT_DEBUG_LEVEL_TRACE */ + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + { + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + FT_Service_MetricsVariations var = (FT_Service_MetricsVariations)face->var; + + FT_UInt instance_index = (FT_UInt)face_index >> 16; + + + if ( FT_HAS_MULTIPLE_MASTERS( cffface ) && + mm && + instance_index > 0 ) + { + error = mm->set_instance( cffface, instance_index ); + if ( error ) + goto Exit; + + if ( var ) + var->metrics_adjust( cffface ); + } + } +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + if ( !dict->has_font_matrix ) + dict->units_per_em = pure_cff ? 1000 : face->root.units_per_EM; + + /* Normalize the font matrix so that `matrix->yy' is 1; if */ + /* it is zero, we use `matrix->yx' instead. The scaling is */ + /* done with `units_per_em' then (at this point, it already */ + /* contains the scaling factor, but without normalization */ + /* of the matrix). */ + /* */ + /* Note that the offsets must be expressed in integer font */ + /* units. */ + + { + FT_Matrix* matrix = &dict->font_matrix; + FT_Vector* offset = &dict->font_offset; + FT_ULong* upm = &dict->units_per_em; + FT_Fixed temp; + + + temp = matrix->yy ? FT_ABS( matrix->yy ) + : FT_ABS( matrix->yx ); + + if ( temp != 0x10000L ) + { + *upm = (FT_ULong)FT_DivFix( (FT_Long)*upm, temp ); + + matrix->xx = FT_DivFix( matrix->xx, temp ); + matrix->yx = FT_DivFix( matrix->yx, temp ); + matrix->xy = FT_DivFix( matrix->xy, temp ); + matrix->yy = FT_DivFix( matrix->yy, temp ); + offset->x = FT_DivFix( offset->x, temp ); + offset->y = FT_DivFix( offset->y, temp ); + } + + offset->x >>= 16; + offset->y >>= 16; + } + + for ( i = cff->num_subfonts; i > 0; i-- ) + { + CFF_FontRecDict sub = &cff->subfonts[i - 1]->font_dict; + CFF_FontRecDict top = &cff->top_font.font_dict; + + FT_Matrix* matrix; + FT_Vector* offset; + FT_ULong* upm; + FT_Fixed temp; + + + if ( sub->has_font_matrix ) + { + FT_Long scaling; + + + /* if we have a top-level matrix, */ + /* concatenate the subfont matrix */ + + if ( top->has_font_matrix ) + { + if ( top->units_per_em > 1 && sub->units_per_em > 1 ) + scaling = (FT_Long)FT_MIN( top->units_per_em, + sub->units_per_em ); + else + scaling = 1; + + FT_Matrix_Multiply_Scaled( &top->font_matrix, + &sub->font_matrix, + scaling ); + FT_Vector_Transform_Scaled( &sub->font_offset, + &top->font_matrix, + scaling ); + + sub->units_per_em = (FT_ULong) + FT_MulDiv( (FT_Long)sub->units_per_em, + (FT_Long)top->units_per_em, + scaling ); + } + } + else + { + sub->font_matrix = top->font_matrix; + sub->font_offset = top->font_offset; + + sub->units_per_em = top->units_per_em; + } + + matrix = &sub->font_matrix; + offset = &sub->font_offset; + upm = &sub->units_per_em; + + temp = matrix->yy ? FT_ABS( matrix->yy ) + : FT_ABS( matrix->yx ); + + + if ( temp != 0x10000L ) + { + *upm = (FT_ULong)FT_DivFix( (FT_Long)*upm, temp ); + + matrix->xx = FT_DivFix( matrix->xx, temp ); + matrix->yx = FT_DivFix( matrix->yx, temp ); + matrix->xy = FT_DivFix( matrix->xy, temp ); + matrix->yy = FT_DivFix( matrix->yy, temp ); + offset->x = FT_DivFix( offset->x, temp ); + offset->y = FT_DivFix( offset->y, temp ); + } + + offset->x >>= 16; + offset->y >>= 16; + } + + if ( pure_cff ) + { + char* style_name = NULL; + + + /* set up num_faces */ + cffface->num_faces = (FT_Long)cff->num_faces; + + /* compute number of glyphs */ + if ( dict->cid_registry != 0xFFFFU ) + cffface->num_glyphs = (FT_Long)( cff->charset.max_cid + 1 ); + else + cffface->num_glyphs = (FT_Long)cff->charstrings_index.count; + + /* set global bbox, as well as EM size */ + cffface->bbox.xMin = dict->font_bbox.xMin >> 16; + cffface->bbox.yMin = dict->font_bbox.yMin >> 16; + /* no `U' suffix here to 0xFFFF! */ + cffface->bbox.xMax = ( dict->font_bbox.xMax + 0xFFFF ) >> 16; + cffface->bbox.yMax = ( dict->font_bbox.yMax + 0xFFFF ) >> 16; + + cffface->units_per_EM = (FT_UShort)( dict->units_per_em ); + + cffface->ascender = (FT_Short)( cffface->bbox.yMax ); + cffface->descender = (FT_Short)( cffface->bbox.yMin ); + + cffface->height = (FT_Short)( ( cffface->units_per_EM * 12 ) / 10 ); + if ( cffface->height < cffface->ascender - cffface->descender ) + cffface->height = (FT_Short)( cffface->ascender - + cffface->descender ); + + cffface->underline_position = + (FT_Short)( dict->underline_position >> 16 ); + cffface->underline_thickness = + (FT_Short)( dict->underline_thickness >> 16 ); + + /* retrieve font family & style name */ + if ( dict->family_name ) + { + char* family_name; + + + family_name = cff_index_get_sid_string( cff, dict->family_name ); + if ( family_name ) + cffface->family_name = cff_strcpy( memory, family_name ); + } + + if ( !cffface->family_name ) + { + cffface->family_name = cff_index_get_name( + cff, + (FT_UInt)( face_index & 0xFFFF ) ); + if ( cffface->family_name ) + remove_subset_prefix( cffface->family_name ); + } + + if ( cffface->family_name ) + { + char* full = cff_index_get_sid_string( cff, + dict->full_name ); + char* fullp = full; + char* family = cffface->family_name; + + + /* We try to extract the style name from the full name. */ + /* We need to ignore spaces and dashes during the search. */ + if ( full && family ) + { + while ( *fullp ) + { + /* skip common characters at the start of both strings */ + if ( *fullp == *family ) + { + family++; + fullp++; + continue; + } + + /* ignore spaces and dashes in full name during comparison */ + if ( *fullp == ' ' || *fullp == '-' ) + { + fullp++; + continue; + } + + /* ignore spaces and dashes in family name during comparison */ + if ( *family == ' ' || *family == '-' ) + { + family++; + continue; + } + + if ( !*family && *fullp ) + { + /* The full name begins with the same characters as the */ + /* family name, with spaces and dashes removed. In this */ + /* case, the remaining string in `fullp' will be used as */ + /* the style name. */ + style_name = cff_strcpy( memory, fullp ); + + /* remove the style part from the family name (if present) */ + remove_style( cffface->family_name, style_name ); + } + break; + } + } + } + else + { + char *cid_font_name = + cff_index_get_sid_string( cff, + dict->cid_font_name ); + + + /* do we have a `/FontName' for a CID-keyed font? */ + if ( cid_font_name ) + cffface->family_name = cff_strcpy( memory, cid_font_name ); + } + + if ( style_name ) + cffface->style_name = style_name; + else + /* assume "Regular" style if we don't know better */ + cffface->style_name = cff_strcpy( memory, (char *)"Regular" ); + + /*******************************************************************/ + /* */ + /* Compute face flags. */ + /* */ + flags = FT_FACE_FLAG_SCALABLE | /* scalable outlines */ + FT_FACE_FLAG_HORIZONTAL | /* horizontal data */ + FT_FACE_FLAG_HINTER; /* has native hinter */ + + if ( sfnt_format ) + flags |= FT_FACE_FLAG_SFNT; + + /* fixed width font? */ + if ( dict->is_fixed_pitch ) + flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* XXX: WE DO NOT SUPPORT KERNING METRICS IN THE GPOS TABLE FOR NOW */ +#if 0 + /* kerning available? */ + if ( face->kern_pairs ) + flags |= FT_FACE_FLAG_KERNING; +#endif + + cffface->face_flags |= flags; + + /*******************************************************************/ + /* */ + /* Compute style flags. */ + /* */ + flags = 0; + + if ( dict->italic_angle ) + flags |= FT_STYLE_FLAG_ITALIC; + + { + char *weight = cff_index_get_sid_string( cff, + dict->weight ); + + + if ( weight ) + if ( !ft_strcmp( weight, "Bold" ) || + !ft_strcmp( weight, "Black" ) ) + flags |= FT_STYLE_FLAG_BOLD; + } + + /* double check */ + if ( !(flags & FT_STYLE_FLAG_BOLD) && cffface->style_name ) + if ( !ft_strncmp( cffface->style_name, "Bold", 4 ) || + !ft_strncmp( cffface->style_name, "Black", 5 ) ) + flags |= FT_STYLE_FLAG_BOLD; + + cffface->style_flags = flags; + } + +#ifndef FT_CONFIG_OPTION_NO_GLYPH_NAMES + /* CID-keyed CFF fonts don't have glyph names -- the SFNT loader */ + /* has unset this flag because of the 3.0 `post' table. */ + if ( dict->cid_registry == 0xFFFFU ) + cffface->face_flags |= FT_FACE_FLAG_GLYPH_NAMES; +#endif + + if ( dict->cid_registry != 0xFFFFU && pure_cff ) + cffface->face_flags |= FT_FACE_FLAG_CID_KEYED; + + /*******************************************************************/ + /* */ + /* Compute char maps. */ + /* */ + + /* Try to synthesize a Unicode charmap if there is none available */ + /* already. If an OpenType font contains a Unicode "cmap", we */ + /* will use it, whatever be in the CFF part of the file. */ + { + FT_CharMapRec cmaprec; + FT_CharMap cmap; + FT_UInt nn; + CFF_Encoding encoding = &cff->encoding; + + + for ( nn = 0; nn < (FT_UInt)cffface->num_charmaps; nn++ ) + { + cmap = cffface->charmaps[nn]; + + /* Windows Unicode? */ + if ( cmap->platform_id == TT_PLATFORM_MICROSOFT && + cmap->encoding_id == TT_MS_ID_UNICODE_CS ) + goto Skip_Unicode; + + /* Apple Unicode platform id? */ + if ( cmap->platform_id == TT_PLATFORM_APPLE_UNICODE ) + goto Skip_Unicode; /* Apple Unicode */ + } + + /* since CID-keyed fonts don't contain glyph names, we can't */ + /* construct a cmap */ + if ( pure_cff && cff->top_font.font_dict.cid_registry != 0xFFFFU ) + goto Exit; + + /* we didn't find a Unicode charmap -- synthesize one */ + cmaprec.face = cffface; + cmaprec.platform_id = TT_PLATFORM_MICROSOFT; + cmaprec.encoding_id = TT_MS_ID_UNICODE_CS; + cmaprec.encoding = FT_ENCODING_UNICODE; + + nn = (FT_UInt)cffface->num_charmaps; + + error = FT_CMap_New( &CFF_CMAP_UNICODE_CLASS_REC_GET, NULL, + &cmaprec, NULL ); + if ( error && + FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) ) + goto Exit; + error = FT_Err_Ok; + + /* if no Unicode charmap was previously selected, select this one */ + if ( !cffface->charmap && nn != (FT_UInt)cffface->num_charmaps ) + cffface->charmap = cffface->charmaps[nn]; + + Skip_Unicode: + if ( encoding->count > 0 ) + { + FT_CMap_Class clazz; + + + cmaprec.face = cffface; + cmaprec.platform_id = TT_PLATFORM_ADOBE; /* Adobe platform id */ + + if ( encoding->offset == 0 ) + { + cmaprec.encoding_id = TT_ADOBE_ID_STANDARD; + cmaprec.encoding = FT_ENCODING_ADOBE_STANDARD; + clazz = &CFF_CMAP_ENCODING_CLASS_REC_GET; + } + else if ( encoding->offset == 1 ) + { + cmaprec.encoding_id = TT_ADOBE_ID_EXPERT; + cmaprec.encoding = FT_ENCODING_ADOBE_EXPERT; + clazz = &CFF_CMAP_ENCODING_CLASS_REC_GET; + } + else + { + cmaprec.encoding_id = TT_ADOBE_ID_CUSTOM; + cmaprec.encoding = FT_ENCODING_ADOBE_CUSTOM; + clazz = &CFF_CMAP_ENCODING_CLASS_REC_GET; + } + + error = FT_CMap_New( clazz, NULL, &cmaprec, NULL ); + } + } + } + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + cff_face_done( FT_Face cffface ) /* CFF_Face */ + { + CFF_Face face = (CFF_Face)cffface; + FT_Memory memory; + SFNT_Service sfnt; + + + if ( !face ) + return; + + memory = cffface->memory; + sfnt = (SFNT_Service)face->sfnt; + + if ( sfnt ) + sfnt->done_face( face ); + + { + CFF_Font cff = (CFF_Font)face->extra.data; + + + if ( cff ) + { + cff_font_done( cff ); + FT_FREE( face->extra.data ); + } + } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + cff_done_blend( face ); + face->blend = NULL; +#endif + } + + + FT_LOCAL_DEF( FT_Error ) + cff_driver_init( FT_Module module ) /* CFF_Driver */ + { + PS_Driver driver = (PS_Driver)module; + + FT_UInt32 seed; + + + /* set default property values, cf. `ftcffdrv.h' */ +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + driver->hinting_engine = FT_HINTING_FREETYPE; +#else + driver->hinting_engine = FT_HINTING_ADOBE; +#endif + + driver->no_stem_darkening = TRUE; + + driver->darken_params[0] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1; + driver->darken_params[1] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1; + driver->darken_params[2] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2; + driver->darken_params[3] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2; + driver->darken_params[4] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3; + driver->darken_params[5] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3; + driver->darken_params[6] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4; + driver->darken_params[7] = CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4; + + /* compute random seed from some memory addresses */ + seed = (FT_UInt32)( (FT_Offset)(char*)&seed ^ + (FT_Offset)(char*)&module ^ + (FT_Offset)(char*)module->memory ); + seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 ); + + driver->random_seed = (FT_Int32)seed; + if ( driver->random_seed < 0 ) + driver->random_seed = -driver->random_seed; + else if ( driver->random_seed == 0 ) + driver->random_seed = 123456789; + + return FT_Err_Ok; + } + + + FT_LOCAL_DEF( void ) + cff_driver_done( FT_Module module ) /* CFF_Driver */ + { + FT_UNUSED( module ); + } + + +/* END */ diff --git a/vendor/FreeType2/src/cff/cffobjs.h b/vendor/FreeType2/src/cff/cffobjs.h new file mode 100644 index 0000000..616a25b --- /dev/null +++ b/vendor/FreeType2/src/cff/cffobjs.h @@ -0,0 +1,85 @@ +/***************************************************************************/ +/* */ +/* cffobjs.h */ +/* */ +/* OpenType objects manager (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef CFFOBJS_H_ +#define CFFOBJS_H_ + + +#include + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + cff_size_init( FT_Size size ); /* CFF_Size */ + + FT_LOCAL( void ) + cff_size_done( FT_Size size ); /* CFF_Size */ + + FT_LOCAL( FT_Error ) + cff_size_request( FT_Size size, + FT_Size_Request req ); + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL( FT_Error ) + cff_size_select( FT_Size size, + FT_ULong strike_index ); + +#endif + + FT_LOCAL( void ) + cff_slot_done( FT_GlyphSlot slot ); + + FT_LOCAL( FT_Error ) + cff_slot_init( FT_GlyphSlot slot ); + + + /*************************************************************************/ + /* */ + /* Face functions */ + /* */ + FT_LOCAL( FT_Error ) + cff_face_init( FT_Stream stream, + FT_Face face, /* CFF_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + cff_face_done( FT_Face face ); /* CFF_Face */ + + + /*************************************************************************/ + /* */ + /* Driver functions */ + /* */ + FT_LOCAL( FT_Error ) + cff_driver_init( FT_Module module ); /* PS_Driver */ + + FT_LOCAL( void ) + cff_driver_done( FT_Module module ); /* PS_Driver */ + + +FT_END_HEADER + +#endif /* CFFOBJS_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/cff/cffparse.c b/vendor/FreeType2/src/cff/cffparse.c new file mode 100644 index 0000000..b9611cf --- /dev/null +++ b/vendor/FreeType2/src/cff/cffparse.c @@ -0,0 +1,1694 @@ +/***************************************************************************/ +/* */ +/* cffparse.c */ +/* */ +/* CFF token stream parser (body) */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include "cffparse.h" +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + +#include "cfferrs.h" +#include "cffpic.h" +#include "cffload.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_cffparse + + + FT_LOCAL_DEF( FT_Error ) + cff_parser_init( CFF_Parser parser, + FT_UInt code, + void* object, + FT_Library library, + FT_UInt stackSize, + FT_UShort num_designs, + FT_UShort num_axes ) + { + FT_Memory memory = library->memory; /* for FT_NEW_ARRAY */ + FT_Error error; /* for FT_NEW_ARRAY */ + + + FT_ZERO( parser ); + +#if 0 + parser->top = parser->stack; +#endif + parser->object_code = code; + parser->object = object; + parser->library = library; + parser->num_designs = num_designs; + parser->num_axes = num_axes; + + /* allocate the stack buffer */ + if ( FT_NEW_ARRAY( parser->stack, stackSize ) ) + { + FT_FREE( parser->stack ); + goto Exit; + } + + parser->stackSize = stackSize; + parser->top = parser->stack; /* empty stack */ + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + cff_parser_done( CFF_Parser parser ) + { + FT_Memory memory = parser->library->memory; /* for FT_FREE */ + + + FT_FREE( parser->stack ); + } + + + /* read an integer */ + static FT_Long + cff_parse_integer( FT_Byte* start, + FT_Byte* limit ) + { + FT_Byte* p = start; + FT_Int v = *p++; + FT_Long val = 0; + + + if ( v == 28 ) + { + if ( p + 2 > limit ) + goto Bad; + + val = (FT_Short)( ( (FT_UShort)p[0] << 8 ) | p[1] ); + } + else if ( v == 29 ) + { + if ( p + 4 > limit ) + goto Bad; + + val = (FT_Long)( ( (FT_ULong)p[0] << 24 ) | + ( (FT_ULong)p[1] << 16 ) | + ( (FT_ULong)p[2] << 8 ) | + (FT_ULong)p[3] ); + } + else if ( v < 247 ) + { + val = v - 139; + } + else if ( v < 251 ) + { + if ( p + 1 > limit ) + goto Bad; + + val = ( v - 247 ) * 256 + p[0] + 108; + } + else + { + if ( p + 1 > limit ) + goto Bad; + + val = -( v - 251 ) * 256 - p[0] - 108; + } + + Exit: + return val; + + Bad: + val = 0; + FT_TRACE4(( "!!!END OF DATA:!!!" )); + goto Exit; + } + + + static const FT_Long power_tens[] = + { + 1L, + 10L, + 100L, + 1000L, + 10000L, + 100000L, + 1000000L, + 10000000L, + 100000000L, + 1000000000L + }; + + /* maximum values allowed for multiplying */ + /* with the corresponding `power_tens' element */ + static const FT_Long power_ten_limits[] = + { + FT_LONG_MAX / 1L, + FT_LONG_MAX / 10L, + FT_LONG_MAX / 100L, + FT_LONG_MAX / 1000L, + FT_LONG_MAX / 10000L, + FT_LONG_MAX / 100000L, + FT_LONG_MAX / 1000000L, + FT_LONG_MAX / 10000000L, + FT_LONG_MAX / 100000000L, + FT_LONG_MAX / 1000000000L, + }; + + + /* read a real */ + static FT_Fixed + cff_parse_real( FT_Byte* start, + FT_Byte* limit, + FT_Long power_ten, + FT_Long* scaling ) + { + FT_Byte* p = start; + FT_Int nib; + FT_UInt phase; + + FT_Long result, number, exponent; + FT_Int sign = 0, exponent_sign = 0, have_overflow = 0; + FT_Long exponent_add, integer_length, fraction_length; + + + if ( scaling ) + *scaling = 0; + + result = 0; + + number = 0; + exponent = 0; + + exponent_add = 0; + integer_length = 0; + fraction_length = 0; + + /* First of all, read the integer part. */ + phase = 4; + + for (;;) + { + /* If we entered this iteration with phase == 4, we need to */ + /* read a new byte. This also skips past the initial 0x1E. */ + if ( phase ) + { + p++; + + /* Make sure we don't read past the end. */ + if ( p >= limit ) + goto Bad; + } + + /* Get the nibble. */ + nib = (FT_Int)( p[0] >> phase ) & 0xF; + phase = 4 - phase; + + if ( nib == 0xE ) + sign = 1; + else if ( nib > 9 ) + break; + else + { + /* Increase exponent if we can't add the digit. */ + if ( number >= 0xCCCCCCCL ) + exponent_add++; + /* Skip leading zeros. */ + else if ( nib || number ) + { + integer_length++; + number = number * 10 + nib; + } + } + } + + /* Read fraction part, if any. */ + if ( nib == 0xA ) + for (;;) + { + /* If we entered this iteration with phase == 4, we need */ + /* to read a new byte. */ + if ( phase ) + { + p++; + + /* Make sure we don't read past the end. */ + if ( p >= limit ) + goto Bad; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + if ( nib >= 10 ) + break; + + /* Skip leading zeros if possible. */ + if ( !nib && !number ) + exponent_add--; + /* Only add digit if we don't overflow. */ + else if ( number < 0xCCCCCCCL && fraction_length < 9 ) + { + fraction_length++; + number = number * 10 + nib; + } + } + + /* Read exponent, if any. */ + if ( nib == 12 ) + { + exponent_sign = 1; + nib = 11; + } + + if ( nib == 11 ) + { + for (;;) + { + /* If we entered this iteration with phase == 4, */ + /* we need to read a new byte. */ + if ( phase ) + { + p++; + + /* Make sure we don't read past the end. */ + if ( p >= limit ) + goto Bad; + } + + /* Get the nibble. */ + nib = ( p[0] >> phase ) & 0xF; + phase = 4 - phase; + if ( nib >= 10 ) + break; + + /* Arbitrarily limit exponent. */ + if ( exponent > 1000 ) + have_overflow = 1; + else + exponent = exponent * 10 + nib; + } + + if ( exponent_sign ) + exponent = -exponent; + } + + if ( !number ) + goto Exit; + + if ( have_overflow ) + { + if ( exponent_sign ) + goto Underflow; + else + goto Overflow; + } + + /* We don't check `power_ten' and `exponent_add'. */ + exponent += power_ten + exponent_add; + + if ( scaling ) + { + /* Only use `fraction_length'. */ + fraction_length += integer_length; + exponent += integer_length; + + if ( fraction_length <= 5 ) + { + if ( number > 0x7FFFL ) + { + result = FT_DivFix( number, 10 ); + *scaling = exponent - fraction_length + 1; + } + else + { + if ( exponent > 0 ) + { + FT_Long new_fraction_length, shift; + + + /* Make `scaling' as small as possible. */ + new_fraction_length = FT_MIN( exponent, 5 ); + shift = new_fraction_length - fraction_length; + + if ( shift > 0 ) + { + exponent -= new_fraction_length; + number *= power_tens[shift]; + if ( number > 0x7FFFL ) + { + number /= 10; + exponent += 1; + } + } + else + exponent -= fraction_length; + } + else + exponent -= fraction_length; + + result = (FT_Long)( (FT_ULong)number << 16 ); + *scaling = exponent; + } + } + else + { + if ( ( number / power_tens[fraction_length - 5] ) > 0x7FFFL ) + { + result = FT_DivFix( number, power_tens[fraction_length - 4] ); + *scaling = exponent - 4; + } + else + { + result = FT_DivFix( number, power_tens[fraction_length - 5] ); + *scaling = exponent - 5; + } + } + } + else + { + integer_length += exponent; + fraction_length -= exponent; + + if ( integer_length > 5 ) + goto Overflow; + if ( integer_length < -5 ) + goto Underflow; + + /* Remove non-significant digits. */ + if ( integer_length < 0 ) + { + number /= power_tens[-integer_length]; + fraction_length += integer_length; + } + + /* this can only happen if exponent was non-zero */ + if ( fraction_length == 10 ) + { + number /= 10; + fraction_length -= 1; + } + + /* Convert into 16.16 format. */ + if ( fraction_length > 0 ) + { + if ( ( number / power_tens[fraction_length] ) > 0x7FFFL ) + goto Exit; + + result = FT_DivFix( number, power_tens[fraction_length] ); + } + else + { + number *= power_tens[-fraction_length]; + + if ( number > 0x7FFFL ) + goto Overflow; + + result = (FT_Long)( (FT_ULong)number << 16 ); + } + } + + Exit: + if ( sign ) + result = -result; + + return result; + + Overflow: + result = 0x7FFFFFFFL; + FT_TRACE4(( "!!!OVERFLOW:!!!" )); + goto Exit; + + Underflow: + result = 0; + FT_TRACE4(( "!!!UNDERFLOW:!!!" )); + goto Exit; + + Bad: + result = 0; + FT_TRACE4(( "!!!END OF DATA:!!!" )); + goto Exit; + } + + + /* read a number, either integer or real */ + FT_LOCAL_DEF( FT_Long ) + cff_parse_num( CFF_Parser parser, + FT_Byte** d ) + { + if ( **d == 30 ) + { + /* binary-coded decimal is truncated to integer */ + return cff_parse_real( *d, parser->limit, 0, NULL ) >> 16; + } + + else if ( **d == 255 ) + { + /* 16.16 fixed point is used internally for CFF2 blend results. */ + /* Since these are trusted values, a limit check is not needed. */ + + /* After the 255, 4 bytes give the number. */ + /* The blend value is converted to integer, with rounding; */ + /* due to the right-shift we don't need the lowest byte. */ +#if 0 + return (FT_Short)( + ( ( ( (FT_UInt32)*( d[0] + 1 ) << 24 ) | + ( (FT_UInt32)*( d[0] + 2 ) << 16 ) | + ( (FT_UInt32)*( d[0] + 3 ) << 8 ) | + (FT_UInt32)*( d[0] + 4 ) ) + 0x8000U ) >> 16 ); +#else + return (FT_Short)( + ( ( ( (FT_UInt32)*( d[0] + 1 ) << 16 ) | + ( (FT_UInt32)*( d[0] + 2 ) << 8 ) | + (FT_UInt32)*( d[0] + 3 ) ) + 0x80U ) >> 8 ); +#endif + } + + else + return cff_parse_integer( *d, parser->limit ); + } + + + /* read a floating point number, either integer or real */ + static FT_Fixed + do_fixed( CFF_Parser parser, + FT_Byte** d, + FT_Long scaling ) + { + if ( **d == 30 ) + return cff_parse_real( *d, parser->limit, scaling, NULL ); + else + { + FT_Long val = cff_parse_integer( *d, parser->limit ); + + + if ( scaling ) + { + if ( FT_ABS( val ) > power_ten_limits[scaling] ) + { + val = val > 0 ? 0x7FFFFFFFL : -0x7FFFFFFFL; + goto Overflow; + } + + val *= power_tens[scaling]; + } + + if ( val > 0x7FFF ) + { + val = 0x7FFFFFFFL; + goto Overflow; + } + else if ( val < -0x7FFF ) + { + val = -0x7FFFFFFFL; + goto Overflow; + } + + return (FT_Long)( (FT_ULong)val << 16 ); + + Overflow: + FT_TRACE4(( "!!!OVERFLOW:!!!" )); + return val; + } + } + + + /* read a floating point number, either integer or real */ + static FT_Fixed + cff_parse_fixed( CFF_Parser parser, + FT_Byte** d ) + { + return do_fixed( parser, d, 0 ); + } + + + /* read a floating point number, either integer or real, */ + /* but return `10^scaling' times the number read in */ + static FT_Fixed + cff_parse_fixed_scaled( CFF_Parser parser, + FT_Byte** d, + FT_Long scaling ) + { + return do_fixed( parser, d, scaling ); + } + + + /* read a floating point number, either integer or real, */ + /* and return it as precise as possible -- `scaling' returns */ + /* the scaling factor (as a power of 10) */ + static FT_Fixed + cff_parse_fixed_dynamic( CFF_Parser parser, + FT_Byte** d, + FT_Long* scaling ) + { + FT_ASSERT( scaling ); + + if ( **d == 30 ) + return cff_parse_real( *d, parser->limit, 0, scaling ); + else + { + FT_Long number; + FT_Int integer_length; + + + number = cff_parse_integer( d[0], d[1] ); + + if ( number > 0x7FFFL ) + { + for ( integer_length = 5; integer_length < 10; integer_length++ ) + if ( number < power_tens[integer_length] ) + break; + + if ( ( number / power_tens[integer_length - 5] ) > 0x7FFFL ) + { + *scaling = integer_length - 4; + return FT_DivFix( number, power_tens[integer_length - 4] ); + } + else + { + *scaling = integer_length - 5; + return FT_DivFix( number, power_tens[integer_length - 5] ); + } + } + else + { + *scaling = 0; + return (FT_Long)( (FT_ULong)number << 16 ); + } + } + } + + + static FT_Error + cff_parse_font_matrix( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Matrix* matrix = &dict->font_matrix; + FT_Vector* offset = &dict->font_offset; + FT_ULong* upm = &dict->units_per_em; + FT_Byte** data = parser->stack; + FT_Error error = FT_ERR( Stack_Underflow ); + + + if ( parser->top >= parser->stack + 6 ) + { + FT_Fixed values[6]; + FT_Long scalings[6]; + + FT_Long min_scaling, max_scaling; + int i; + + + error = FT_Err_Ok; + + dict->has_font_matrix = TRUE; + + /* We expect a well-formed font matrix, this is, the matrix elements */ + /* `xx' and `yy' are of approximately the same magnitude. To avoid */ + /* loss of precision, we use the magnitude of the largest matrix */ + /* element to scale all other elements. The scaling factor is then */ + /* contained in the `units_per_em' value. */ + + max_scaling = FT_LONG_MIN; + min_scaling = FT_LONG_MAX; + + for ( i = 0; i < 6; i++ ) + { + values[i] = cff_parse_fixed_dynamic( parser, data++, &scalings[i] ); + if ( values[i] ) + { + if ( scalings[i] > max_scaling ) + max_scaling = scalings[i]; + if ( scalings[i] < min_scaling ) + min_scaling = scalings[i]; + } + } + + if ( max_scaling < -9 || + max_scaling > 0 || + ( max_scaling - min_scaling ) < 0 || + ( max_scaling - min_scaling ) > 9 ) + { + /* Return default matrix in case of unlikely values. */ + + FT_TRACE1(( "cff_parse_font_matrix:" + " strange scaling values (minimum %d, maximum %d),\n" + " " + " using default matrix\n", min_scaling, max_scaling )); + + matrix->xx = 0x10000L; + matrix->yx = 0; + matrix->xy = 0; + matrix->yy = 0x10000L; + offset->x = 0; + offset->y = 0; + *upm = 1; + + goto Exit; + } + + for ( i = 0; i < 6; i++ ) + { + FT_Fixed value = values[i]; + FT_Long divisor, half_divisor; + + + if ( !value ) + continue; + + divisor = power_tens[max_scaling - scalings[i]]; + half_divisor = divisor >> 1; + + if ( value < 0 ) + { + if ( FT_LONG_MIN + half_divisor < value ) + values[i] = ( value - half_divisor ) / divisor; + else + values[i] = FT_LONG_MIN / divisor; + } + else + { + if ( FT_LONG_MAX - half_divisor > value ) + values[i] = ( value + half_divisor ) / divisor; + else + values[i] = FT_LONG_MAX / divisor; + } + } + + matrix->xx = values[0]; + matrix->yx = values[1]; + matrix->xy = values[2]; + matrix->yy = values[3]; + offset->x = values[4]; + offset->y = values[5]; + + *upm = (FT_ULong)power_tens[-max_scaling]; + + FT_TRACE4(( " [%f %f %f %f %f %f]\n", + (double)matrix->xx / *upm / 65536, + (double)matrix->xy / *upm / 65536, + (double)matrix->yx / *upm / 65536, + (double)matrix->yy / *upm / 65536, + (double)offset->x / *upm / 65536, + (double)offset->y / *upm / 65536 )); + } + + Exit: + return error; + } + + + static FT_Error + cff_parse_font_bbox( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_BBox* bbox = &dict->font_bbox; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = FT_ERR( Stack_Underflow ); + + if ( parser->top >= parser->stack + 4 ) + { + bbox->xMin = FT_RoundFix( cff_parse_fixed( parser, data++ ) ); + bbox->yMin = FT_RoundFix( cff_parse_fixed( parser, data++ ) ); + bbox->xMax = FT_RoundFix( cff_parse_fixed( parser, data++ ) ); + bbox->yMax = FT_RoundFix( cff_parse_fixed( parser, data ) ); + error = FT_Err_Ok; + + FT_TRACE4(( " [%d %d %d %d]\n", + bbox->xMin / 65536, + bbox->yMin / 65536, + bbox->xMax / 65536, + bbox->yMax / 65536 )); + } + + return error; + } + + + static FT_Error + cff_parse_private_dict( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = FT_ERR( Stack_Underflow ); + + if ( parser->top >= parser->stack + 2 ) + { + FT_Long tmp; + + + tmp = cff_parse_num( parser, data++ ); + if ( tmp < 0 ) + { + FT_ERROR(( "cff_parse_private_dict: Invalid dictionary size\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + dict->private_size = (FT_ULong)tmp; + + tmp = cff_parse_num( parser, data ); + if ( tmp < 0 ) + { + FT_ERROR(( "cff_parse_private_dict: Invalid dictionary offset\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + dict->private_offset = (FT_ULong)tmp; + + FT_TRACE4(( " %lu %lu\n", + dict->private_size, dict->private_offset )); + + error = FT_Err_Ok; + } + + Fail: + return error; + } + + + /* The `MultipleMaster' operator comes before any */ + /* top DICT operators that contain T2 charstrings. */ + + static FT_Error + cff_parse_multiple_master( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Error error; + + +#ifdef FT_DEBUG_LEVEL_TRACE + /* beautify tracing message */ + if ( ft_trace_levels[FT_COMPONENT] < 4 ) + FT_TRACE1(( "Multiple Master CFFs not supported yet," + " handling first master design only\n" )); + else + FT_TRACE1(( " (not supported yet," + " handling first master design only)\n" )); +#endif + + error = FT_ERR( Stack_Underflow ); + + /* currently, we handle only the first argument */ + if ( parser->top >= parser->stack + 5 ) + { + FT_Long num_designs = cff_parse_num( parser, parser->stack ); + + + if ( num_designs > 16 || num_designs < 2 ) + { + FT_ERROR(( "cff_parse_multiple_master:" + " Invalid number of designs\n" )); + error = FT_THROW( Invalid_File_Format ); + } + else + { + dict->num_designs = (FT_UShort)num_designs; + dict->num_axes = (FT_UShort)( parser->top - parser->stack - 4 ); + + parser->num_designs = dict->num_designs; + parser->num_axes = dict->num_axes; + + error = FT_Err_Ok; + } + } + + return error; + } + + + static FT_Error + cff_parse_cid_ros( CFF_Parser parser ) + { + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Byte** data = parser->stack; + FT_Error error; + + + error = FT_ERR( Stack_Underflow ); + + if ( parser->top >= parser->stack + 3 ) + { + dict->cid_registry = (FT_UInt)cff_parse_num( parser, data++ ); + dict->cid_ordering = (FT_UInt)cff_parse_num( parser, data++ ); + if ( **data == 30 ) + FT_TRACE1(( "cff_parse_cid_ros: real supplement is rounded\n" )); + dict->cid_supplement = cff_parse_num( parser, data ); + if ( dict->cid_supplement < 0 ) + FT_TRACE1(( "cff_parse_cid_ros: negative supplement %d is found\n", + dict->cid_supplement )); + error = FT_Err_Ok; + + FT_TRACE4(( " %d %d %d\n", + dict->cid_registry, + dict->cid_ordering, + dict->cid_supplement )); + } + + return error; + } + + + static FT_Error + cff_parse_vsindex( CFF_Parser parser ) + { + /* vsindex operator can only be used in a Private DICT */ + CFF_Private priv = (CFF_Private)parser->object; + FT_Byte** data = parser->stack; + CFF_Blend blend; + FT_Error error; + + + if ( !priv || !priv->subfont ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + blend = &priv->subfont->blend; + + if ( blend->usedBV ) + { + FT_ERROR(( " cff_parse_vsindex: vsindex not allowed after blend\n" )); + error = FT_THROW( Syntax_Error ); + goto Exit; + } + + priv->vsindex = (FT_UInt)cff_parse_num( parser, data++ ); + + FT_TRACE4(( " %d\n", priv->vsindex )); + + error = FT_Err_Ok; + + Exit: + return error; + } + + + static FT_Error + cff_parse_blend( CFF_Parser parser ) + { + /* blend operator can only be used in a Private DICT */ + CFF_Private priv = (CFF_Private)parser->object; + CFF_SubFont subFont; + CFF_Blend blend; + FT_UInt numBlends; + FT_Error error; + + + if ( !priv || !priv->subfont ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + subFont = priv->subfont; + blend = &subFont->blend; + + if ( cff_blend_check_vector( blend, + priv->vsindex, + subFont->lenNDV, + subFont->NDV ) ) + { + error = cff_blend_build_vector( blend, + priv->vsindex, + subFont->lenNDV, + subFont->NDV ); + if ( error ) + goto Exit; + } + + numBlends = (FT_UInt)cff_parse_num( parser, parser->top - 1 ); + if ( numBlends > parser->stackSize ) + { + FT_ERROR(( "cff_parse_blend: Invalid number of blends\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + FT_TRACE4(( " %d value%s blended\n", + numBlends, + numBlends == 1 ? "" : "s" )); + + error = cff_blend_doBlend( subFont, parser, numBlends ); + + blend->usedBV = TRUE; + + Exit: + return error; + } + + + /* maxstack operator increases parser and operand stacks for CFF2 */ + static FT_Error + cff_parse_maxstack( CFF_Parser parser ) + { + /* maxstack operator can only be used in a Top DICT */ + CFF_FontRecDict dict = (CFF_FontRecDict)parser->object; + FT_Byte** data = parser->stack; + FT_Error error = FT_Err_Ok; + + + if ( !dict ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + dict->maxstack = (FT_UInt)cff_parse_num( parser, data++ ); + if ( dict->maxstack > CFF2_MAX_STACK ) + dict->maxstack = CFF2_MAX_STACK; + if ( dict->maxstack < CFF2_DEFAULT_STACK ) + dict->maxstack = CFF2_DEFAULT_STACK; + + FT_TRACE4(( " %d\n", dict->maxstack )); + + Exit: + return error; + } + + +#define CFF_FIELD_NUM( code, name, id ) \ + CFF_FIELD( code, name, id, cff_kind_num ) +#define CFF_FIELD_FIXED( code, name, id ) \ + CFF_FIELD( code, name, id, cff_kind_fixed ) +#define CFF_FIELD_FIXED_1000( code, name, id ) \ + CFF_FIELD( code, name, id, cff_kind_fixed_thousand ) +#define CFF_FIELD_STRING( code, name, id ) \ + CFF_FIELD( code, name, id, cff_kind_string ) +#define CFF_FIELD_BOOL( code, name, id ) \ + CFF_FIELD( code, name, id, cff_kind_bool ) + + +#ifndef FT_CONFIG_OPTION_PIC + + +#undef CFF_FIELD +#undef CFF_FIELD_DELTA + + +#ifndef FT_DEBUG_LEVEL_TRACE + + +#define CFF_FIELD_CALLBACK( code, name, id ) \ + { \ + cff_kind_callback, \ + code | CFFCODE, \ + 0, 0, \ + cff_parse_ ## name, \ + 0, 0 \ + }, + +#define CFF_FIELD_BLEND( code, id ) \ + { \ + cff_kind_blend, \ + code | CFFCODE, \ + 0, 0, \ + cff_parse_blend, \ + 0, 0 \ + }, + +#define CFF_FIELD( code, name, id, kind ) \ + { \ + kind, \ + code | CFFCODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE( name ), \ + 0, 0, 0 \ + }, + +#define CFF_FIELD_DELTA( code, name, max, id ) \ + { \ + cff_kind_delta, \ + code | CFFCODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE_DELTA( name ), \ + 0, \ + max, \ + FT_FIELD_OFFSET( num_ ## name ) \ + }, + + static const CFF_Field_Handler cff_field_handlers[] = + { + +#include "cfftoken.h" + + { 0, 0, 0, 0, 0, 0, 0 } + }; + + +#else /* FT_DEBUG_LEVEL_TRACE */ + + + +#define CFF_FIELD_CALLBACK( code, name, id ) \ + { \ + cff_kind_callback, \ + code | CFFCODE, \ + 0, 0, \ + cff_parse_ ## name, \ + 0, 0, \ + id \ + }, + +#define CFF_FIELD_BLEND( code, id ) \ + { \ + cff_kind_blend, \ + code | CFFCODE, \ + 0, 0, \ + cff_parse_blend, \ + 0, 0, \ + id \ + }, + +#define CFF_FIELD( code, name, id, kind ) \ + { \ + kind, \ + code | CFFCODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE( name ), \ + 0, 0, 0, \ + id \ + }, + +#define CFF_FIELD_DELTA( code, name, max, id ) \ + { \ + cff_kind_delta, \ + code | CFFCODE, \ + FT_FIELD_OFFSET( name ), \ + FT_FIELD_SIZE_DELTA( name ), \ + 0, \ + max, \ + FT_FIELD_OFFSET( num_ ## name ), \ + id \ + }, + + static const CFF_Field_Handler cff_field_handlers[] = + { + +#include "cfftoken.h" + + { 0, 0, 0, 0, 0, 0, 0, 0 } + }; + + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + +#else /* FT_CONFIG_OPTION_PIC */ + + + void + FT_Destroy_Class_cff_field_handlers( FT_Library library, + CFF_Field_Handler* clazz ) + { + FT_Memory memory = library->memory; + + + if ( clazz ) + FT_FREE( clazz ); + } + + + FT_Error + FT_Create_Class_cff_field_handlers( FT_Library library, + CFF_Field_Handler** output_class ) + { + CFF_Field_Handler* clazz = NULL; + FT_Error error; + FT_Memory memory = library->memory; + + int i = 0; + + +#undef CFF_FIELD +#define CFF_FIELD( code, name, id, kind ) i++; +#undef CFF_FIELD_DELTA +#define CFF_FIELD_DELTA( code, name, max, id ) i++; +#undef CFF_FIELD_CALLBACK +#define CFF_FIELD_CALLBACK( code, name, id ) i++; +#undef CFF_FIELD_BLEND +#define CFF_FIELD_BLEND( code, id ) i++; + +#include "cfftoken.h" + + i++; /* { 0, 0, 0, 0, 0, 0, 0 } */ + + if ( FT_ALLOC( clazz, sizeof ( CFF_Field_Handler ) * i ) ) + return error; + + i = 0; + + +#ifndef FT_DEBUG_LEVEL_TRACE + + +#undef CFF_FIELD_CALLBACK +#define CFF_FIELD_CALLBACK( code_, name_, id_ ) \ + clazz[i].kind = cff_kind_callback; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = 0; \ + clazz[i].size = 0; \ + clazz[i].reader = cff_parse_ ## name_; \ + clazz[i].array_max = 0; \ + clazz[i].count_offset = 0; \ + i++; + +#undef CFF_FIELD +#define CFF_FIELD( code_, name_, id_, kind_ ) \ + clazz[i].kind = kind_; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ + clazz[i].size = FT_FIELD_SIZE( name_ ); \ + clazz[i].reader = 0; \ + clazz[i].array_max = 0; \ + clazz[i].count_offset = 0; \ + i++; \ + +#undef CFF_FIELD_DELTA +#define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \ + clazz[i].kind = cff_kind_delta; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ + clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \ + clazz[i].reader = 0; \ + clazz[i].array_max = max_; \ + clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \ + i++; + +#undef CFF_FIELD_BLEND +#define CFF_FIELD_BLEND( code_, id_ ) \ + clazz[i].kind = cff_kind_blend; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = 0; \ + clazz[i].size = 0; \ + clazz[i].reader = cff_parse_blend; \ + clazz[i].array_max = 0; \ + clazz[i].count_offset = 0; \ + i++; + +#include "cfftoken.h" + + clazz[i].kind = 0; + clazz[i].code = 0; + clazz[i].offset = 0; + clazz[i].size = 0; + clazz[i].reader = 0; + clazz[i].array_max = 0; + clazz[i].count_offset = 0; + + +#else /* FT_DEBUG_LEVEL_TRACE */ + + +#undef CFF_FIELD_CALLBACK +#define CFF_FIELD_CALLBACK( code_, name_, id_ ) \ + clazz[i].kind = cff_kind_callback; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = 0; \ + clazz[i].size = 0; \ + clazz[i].reader = cff_parse_ ## name_; \ + clazz[i].array_max = 0; \ + clazz[i].count_offset = 0; \ + clazz[i].id = id_; \ + i++; + +#undef CFF_FIELD +#define CFF_FIELD( code_, name_, id_, kind_ ) \ + clazz[i].kind = kind_; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ + clazz[i].size = FT_FIELD_SIZE( name_ ); \ + clazz[i].reader = 0; \ + clazz[i].array_max = 0; \ + clazz[i].count_offset = 0; \ + clazz[i].id = id_; \ + i++; \ + +#undef CFF_FIELD_DELTA +#define CFF_FIELD_DELTA( code_, name_, max_, id_ ) \ + clazz[i].kind = cff_kind_delta; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = FT_FIELD_OFFSET( name_ ); \ + clazz[i].size = FT_FIELD_SIZE_DELTA( name_ ); \ + clazz[i].reader = 0; \ + clazz[i].array_max = max_; \ + clazz[i].count_offset = FT_FIELD_OFFSET( num_ ## name_ ); \ + clazz[i].id = id_; \ + i++; + +#undef CFF_FIELD_BLEND +#define CFF_FIELD_BLEND( code_, id_ ) \ + clazz[i].kind = cff_kind_blend; \ + clazz[i].code = code_ | CFFCODE; \ + clazz[i].offset = 0; \ + clazz[i].size = 0; \ + clazz[i].reader = cff_parse_blend; \ + clazz[i].array_max = 0; \ + clazz[i].count_offset = 0; \ + clazz[i].id = id_; \ + i++; + +#include "cfftoken.h" + + clazz[i].kind = 0; + clazz[i].code = 0; + clazz[i].offset = 0; + clazz[i].size = 0; + clazz[i].reader = 0; + clazz[i].array_max = 0; + clazz[i].count_offset = 0; + clazz[i].id = 0; + + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + *output_class = clazz; + + return FT_Err_Ok; + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + + + FT_LOCAL_DEF( FT_Error ) + cff_parser_run( CFF_Parser parser, + FT_Byte* start, + FT_Byte* limit ) + { +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + PSAux_Service psaux; +#endif + + FT_Byte* p = start; + FT_Error error = FT_Err_Ok; + FT_Library library = parser->library; + + FT_UNUSED( library ); + + + parser->top = parser->stack; + parser->start = start; + parser->limit = limit; + parser->cursor = start; + + while ( p < limit ) + { + FT_UInt v = *p; + + /* Opcode 31 is legacy MM T2 operator, not a number. */ + /* Opcode 255 is reserved and should not appear in fonts; */ + /* it is used internally for CFF2 blends. */ + if ( v >= 27 && v != 31 && v != 255 ) + { + /* it's a number; we will push its position on the stack */ + if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) + goto Stack_Overflow; + + *parser->top++ = p; + + /* now, skip it */ + if ( v == 30 ) + { + /* skip real number */ + p++; + for (;;) + { + /* An unterminated floating point number at the */ + /* end of a dictionary is invalid but harmless. */ + if ( p >= limit ) + goto Exit; + v = p[0] >> 4; + if ( v == 15 ) + break; + v = p[0] & 0xF; + if ( v == 15 ) + break; + p++; + } + } + else if ( v == 28 ) + p += 2; + else if ( v == 29 ) + p += 4; + else if ( v > 246 ) + p += 1; + } +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + else if ( v == 31 ) + { + /* a Type 2 charstring */ + + CFF_Decoder decoder; + CFF_FontRec cff_rec; + FT_Byte* charstring_base; + FT_ULong charstring_len; + + FT_Fixed* stack; + FT_Byte* q; + + + charstring_base = ++p; + + /* search `endchar' operator */ + for (;;) + { + if ( p >= limit ) + goto Exit; + if ( *p == 14 ) + break; + p++; + } + + charstring_len = (FT_ULong)( p - charstring_base ) + 1; + + /* construct CFF_Decoder object */ + FT_ZERO( &decoder ); + FT_ZERO( &cff_rec ); + + cff_rec.top_font.font_dict.num_designs = parser->num_designs; + cff_rec.top_font.font_dict.num_axes = parser->num_axes; + decoder.cff = &cff_rec; + + psaux = (PSAux_Service)FT_Get_Module_Interface( library, "psaux" ); + if ( !psaux ) + { + FT_ERROR(( "cff_parser_run: cannot access `psaux' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + + error = psaux->cff_decoder_funcs->parse_charstrings_old( + &decoder, charstring_base, charstring_len, 1 ); + + /* Now copy the stack data in the temporary decoder object, */ + /* converting it back to charstring number representations */ + /* (this is ugly, I know). */ + /* */ + /* We overwrite the original top DICT charstring under the */ + /* assumption that the charstring representation of the result */ + /* of `cff_decoder_parse_charstrings' is shorter, which should */ + /* be always true. */ + + q = charstring_base - 1; + stack = decoder.stack; + + while ( stack < decoder.top ) + { + FT_ULong num; + FT_Bool neg; + + + if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) + goto Stack_Overflow; + + *parser->top++ = q; + + if ( *stack < 0 ) + { + num = (FT_ULong)-*stack; + neg = 1; + } + else + { + num = (FT_ULong)*stack; + neg = 0; + } + + if ( num & 0xFFFFU ) + { + if ( neg ) + num = (FT_ULong)-num; + + *q++ = 255; + *q++ = ( num & 0xFF000000U ) >> 24; + *q++ = ( num & 0x00FF0000U ) >> 16; + *q++ = ( num & 0x0000FF00U ) >> 8; + *q++ = num & 0x000000FFU; + } + else + { + num >>= 16; + + if ( neg ) + { + if ( num <= 107 ) + *q++ = (FT_Byte)( 139 - num ); + else if ( num <= 1131 ) + { + *q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 251 ); + *q++ = (FT_Byte)( ( num - 108 ) & 0xFF ); + } + else + { + num = (FT_ULong)-num; + + *q++ = 28; + *q++ = (FT_Byte)( num >> 8 ); + *q++ = (FT_Byte)( num & 0xFF ); + } + } + else + { + if ( num <= 107 ) + *q++ = (FT_Byte)( num + 139 ); + else if ( num <= 1131 ) + { + *q++ = (FT_Byte)( ( ( num - 108 ) >> 8 ) + 247 ); + *q++ = (FT_Byte)( ( num - 108 ) & 0xFF ); + } + else + { + *q++ = 28; + *q++ = (FT_Byte)( num >> 8 ); + *q++ = (FT_Byte)( num & 0xFF ); + } + } + } + + stack++; + } + } +#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ + else + { + /* This is not a number, hence it's an operator. Compute its code */ + /* and look for it in our current list. */ + + FT_UInt code; + FT_UInt num_args; + const CFF_Field_Handler* field; + + + if ( (FT_UInt)( parser->top - parser->stack ) >= parser->stackSize ) + goto Stack_Overflow; + + num_args = (FT_UInt)( parser->top - parser->stack ); + *parser->top = p; + code = v; + + if ( v == 12 ) + { + /* two byte operator */ + p++; + if ( p >= limit ) + goto Syntax_Error; + + code = 0x100 | p[0]; + } + code = code | parser->object_code; + + for ( field = CFF_FIELD_HANDLERS_GET; field->kind; field++ ) + { + if ( field->code == (FT_Int)code ) + { + /* we found our field's handler; read it */ + FT_Long val; + FT_Byte* q = (FT_Byte*)parser->object + field->offset; + + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " %s", field->id )); +#endif + + /* check that we have enough arguments -- except for */ + /* delta encoded arrays, which can be empty */ + if ( field->kind != cff_kind_delta && num_args < 1 ) + goto Stack_Underflow; + + switch ( field->kind ) + { + case cff_kind_bool: + case cff_kind_string: + case cff_kind_num: + val = cff_parse_num( parser, parser->stack ); + goto Store_Number; + + case cff_kind_fixed: + val = cff_parse_fixed( parser, parser->stack ); + goto Store_Number; + + case cff_kind_fixed_thousand: + val = cff_parse_fixed_scaled( parser, parser->stack, 3 ); + + Store_Number: + switch ( field->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)q = (FT_Byte)val; + break; + + case (16 / FT_CHAR_BIT): + *(FT_Short*)q = (FT_Short)val; + break; + + case (32 / FT_CHAR_BIT): + *(FT_Int32*)q = (FT_Int)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + switch ( field->kind ) + { + case cff_kind_bool: + FT_TRACE4(( " %s\n", val ? "true" : "false" )); + break; + + case cff_kind_string: + FT_TRACE4(( " %ld (SID)\n", val )); + break; + + case cff_kind_num: + FT_TRACE4(( " %ld\n", val )); + break; + + case cff_kind_fixed: + FT_TRACE4(( " %f\n", (double)val / 65536 )); + break; + + case cff_kind_fixed_thousand: + FT_TRACE4(( " %f\n", (double)val / 65536 / 1000 )); + + default: + ; /* never reached */ + } +#endif + + break; + + case cff_kind_delta: + { + FT_Byte* qcount = (FT_Byte*)parser->object + + field->count_offset; + + FT_Byte** data = parser->stack; + + + if ( num_args > field->array_max ) + num_args = field->array_max; + + FT_TRACE4(( " [" )); + + /* store count */ + *qcount = (FT_Byte)num_args; + + val = 0; + while ( num_args > 0 ) + { + val = ADD_LONG( val, cff_parse_num( parser, data++ ) ); + switch ( field->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)q = (FT_Byte)val; + break; + + case (16 / FT_CHAR_BIT): + *(FT_Short*)q = (FT_Short)val; + break; + + case (32 / FT_CHAR_BIT): + *(FT_Int32*)q = (FT_Int)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + + FT_TRACE4(( " %ld", val )); + + q += field->size; + num_args--; + } + + FT_TRACE4(( "]\n" )); + } + break; + + default: /* callback or blend */ + error = field->reader( parser ); + if ( error ) + goto Exit; + } + goto Found; + } + } + + /* this is an unknown operator, or it is unsupported; */ + /* we will ignore it for now. */ + + Found: + /* clear stack */ + /* TODO: could clear blend stack here, */ + /* but we don't have access to subFont */ + if ( field->kind != cff_kind_blend ) + parser->top = parser->stack; + } + p++; + } + + Exit: + return error; + + Stack_Overflow: + error = FT_THROW( Invalid_Argument ); + goto Exit; + + Stack_Underflow: + error = FT_THROW( Invalid_Argument ); + goto Exit; + + Syntax_Error: + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + +/* END */ diff --git a/vendor/FreeType2/src/cff/cffparse.h b/vendor/FreeType2/src/cff/cffparse.h new file mode 100644 index 0000000..8a8caec --- /dev/null +++ b/vendor/FreeType2/src/cff/cffparse.h @@ -0,0 +1,136 @@ +/***************************************************************************/ +/* */ +/* cffparse.h */ +/* */ +/* CFF token stream parser (specification) */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef CFFPARSE_H_ +#define CFFPARSE_H_ + + +#include +#include FT_INTERNAL_CFF_TYPES_H +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + /* CFF uses constant parser stack size; */ + /* CFF2 can increase from default 193 */ +#define CFF_MAX_STACK_DEPTH 96 + + /* + * There are plans to remove the `maxstack' operator in a forthcoming + * revision of the CFF2 specification, increasing the (then static) stack + * size to 513. By making the default stack size equal to the maximum + * stack size, the operator is essentially disabled, which has the + * desired effect in FreeType. + */ +#define CFF2_MAX_STACK 513 +#define CFF2_DEFAULT_STACK 513 + +#define CFF_CODE_TOPDICT 0x1000 +#define CFF_CODE_PRIVATE 0x2000 +#define CFF2_CODE_TOPDICT 0x3000 +#define CFF2_CODE_FONTDICT 0x4000 +#define CFF2_CODE_PRIVATE 0x5000 + + + typedef struct CFF_ParserRec_ + { + FT_Library library; + FT_Byte* start; + FT_Byte* limit; + FT_Byte* cursor; + + FT_Byte** stack; + FT_Byte** top; + FT_UInt stackSize; /* allocated size */ + + FT_UInt object_code; + void* object; + + FT_UShort num_designs; /* a copy of `CFF_FontRecDict->num_designs' */ + FT_UShort num_axes; /* a copy of `CFF_FontRecDict->num_axes' */ + + } CFF_ParserRec, *CFF_Parser; + + + FT_LOCAL( FT_Long ) + cff_parse_num( CFF_Parser parser, + FT_Byte** d ); + + FT_LOCAL( FT_Error ) + cff_parser_init( CFF_Parser parser, + FT_UInt code, + void* object, + FT_Library library, + FT_UInt stackSize, + FT_UShort num_designs, + FT_UShort num_axes ); + + FT_LOCAL( void ) + cff_parser_done( CFF_Parser parser ); + + FT_LOCAL( FT_Error ) + cff_parser_run( CFF_Parser parser, + FT_Byte* start, + FT_Byte* limit ); + + + enum + { + cff_kind_none = 0, + cff_kind_num, + cff_kind_fixed, + cff_kind_fixed_thousand, + cff_kind_string, + cff_kind_bool, + cff_kind_delta, + cff_kind_callback, + cff_kind_blend, + + cff_kind_max /* do not remove */ + }; + + + /* now generate handlers for the most simple fields */ + typedef FT_Error (*CFF_Field_Reader)( CFF_Parser parser ); + + typedef struct CFF_Field_Handler_ + { + int kind; + int code; + FT_UInt offset; + FT_Byte size; + CFF_Field_Reader reader; + FT_UInt array_max; + FT_UInt count_offset; + +#ifdef FT_DEBUG_LEVEL_TRACE + const char* id; +#endif + + } CFF_Field_Handler; + + +FT_END_HEADER + + +#endif /* CFFPARSE_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/cff/cffpic.c b/vendor/FreeType2/src/cff/cffpic.c new file mode 100644 index 0000000..08b74c7 --- /dev/null +++ b/vendor/FreeType2/src/cff/cffpic.c @@ -0,0 +1,138 @@ +/***************************************************************************/ +/* */ +/* cffpic.c */ +/* */ +/* The FreeType position independent code services for cff module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "cffcmap.h" +#include "cffpic.h" +#include "cfferrs.h" + + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from cffdrivr.c */ + FT_Error + FT_Create_Class_cff_services( FT_Library library, + FT_ServiceDescRec** output_class ); + void + FT_Destroy_Class_cff_services( FT_Library library, + FT_ServiceDescRec* clazz ); + void + FT_Init_Class_cff_service_ps_info( FT_Library library, + FT_Service_PsInfoRec* clazz ); + void + FT_Init_Class_cff_service_glyph_dict( FT_Library library, + FT_Service_GlyphDictRec* clazz ); + void + FT_Init_Class_cff_service_ps_name( FT_Library library, + FT_Service_PsFontNameRec* clazz ); + void + FT_Init_Class_cff_service_get_cmap_info( FT_Library library, + FT_Service_TTCMapsRec* clazz ); + void + FT_Init_Class_cff_service_cid_info( FT_Library library, + FT_Service_CIDRec* clazz ); + + /* forward declaration of PIC init functions from cffparse.c */ + FT_Error + FT_Create_Class_cff_field_handlers( FT_Library library, + CFF_Field_Handler** output_class ); + void + FT_Destroy_Class_cff_field_handlers( FT_Library library, + CFF_Field_Handler* clazz ); + + + void + cff_driver_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + + + if ( pic_container->cff ) + { + CffModulePIC* container = (CffModulePIC*)pic_container->cff; + + + if ( container->cff_services ) + FT_Destroy_Class_cff_services( library, + container->cff_services ); + container->cff_services = NULL; + if ( container->cff_field_handlers ) + FT_Destroy_Class_cff_field_handlers( + library, container->cff_field_handlers ); + container->cff_field_handlers = NULL; + FT_FREE( container ); + pic_container->cff = NULL; + } + } + + + FT_Error + cff_driver_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + CffModulePIC* container = NULL; + FT_Memory memory = library->memory; + + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC ( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof ( *container ) ); + pic_container->cff = container; + + /* initialize pointer table - */ + /* this is how the module usually expects this data */ + error = FT_Create_Class_cff_services( library, + &container->cff_services ); + if ( error ) + goto Exit; + + error = FT_Create_Class_cff_field_handlers( + library, &container->cff_field_handlers ); + if ( error ) + goto Exit; + + FT_Init_Class_cff_service_ps_info( + library, &container->cff_service_ps_info ); + FT_Init_Class_cff_service_glyph_dict( + library, &container->cff_service_glyph_dict ); + FT_Init_Class_cff_service_ps_name( + library, &container->cff_service_ps_name ); + FT_Init_Class_cff_service_get_cmap_info( + library, &container->cff_service_get_cmap_info ); + FT_Init_Class_cff_service_cid_info( + library, &container->cff_service_cid_info ); + FT_Init_Class_cff_cmap_encoding_class_rec( + library, &container->cff_cmap_encoding_class_rec ); + FT_Init_Class_cff_cmap_unicode_class_rec( + library, &container->cff_cmap_unicode_class_rec ); + + Exit: + if ( error ) + cff_driver_class_pic_free( library ); + return error; + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/vendor/FreeType2/src/cff/cffpic.h b/vendor/FreeType2/src/cff/cffpic.h new file mode 100644 index 0000000..8ba4203 --- /dev/null +++ b/vendor/FreeType2/src/cff/cffpic.h @@ -0,0 +1,121 @@ +/***************************************************************************/ +/* */ +/* cffpic.h */ +/* */ +/* The FreeType position independent code services for cff module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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 CFFPIC_H_ +#define CFFPIC_H_ + + +#include FT_INTERNAL_PIC_H + +#ifndef FT_CONFIG_OPTION_PIC + +#define CFF_SERVICE_PS_INFO_GET cff_service_ps_info +#define CFF_SERVICE_GLYPH_DICT_GET cff_service_glyph_dict +#define CFF_SERVICE_PS_NAME_GET cff_service_ps_name +#define CFF_SERVICE_GET_CMAP_INFO_GET cff_service_get_cmap_info +#define CFF_SERVICE_CID_INFO_GET cff_service_cid_info +#define CFF_SERVICE_PROPERTIES_GET cff_service_properties +#define CFF_SERVICES_GET cff_services +#define CFF_SERVICE_MULTI_MASTERS_GET cff_service_multi_masters +#define CFF_SERVICE_METRICS_VAR_GET cff_service_metrics_variations +#define CFF_SERVICE_CFF_LOAD_GET cff_service_cff_load +#define CFF_CMAP_ENCODING_CLASS_REC_GET cff_cmap_encoding_class_rec +#define CFF_CMAP_UNICODE_CLASS_REC_GET cff_cmap_unicode_class_rec +#define CFF_FIELD_HANDLERS_GET cff_field_handlers + +#else /* FT_CONFIG_OPTION_PIC */ + +#include FT_SERVICE_GLYPH_DICT_H +#include "cffparse.h" +#include FT_SERVICE_POSTSCRIPT_INFO_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_TT_CMAP_H +#include FT_SERVICE_CID_H +#include FT_SERVICE_PROPERTIES_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_METRICS_VARIATIONS_H + + +FT_BEGIN_HEADER + + typedef struct CffModulePIC_ + { + FT_ServiceDescRec* cff_services; + CFF_Field_Handler* cff_field_handlers; + FT_Service_PsInfoRec cff_service_ps_info; + FT_Service_GlyphDictRec cff_service_glyph_dict; + FT_Service_PsFontNameRec cff_service_ps_name; + FT_Service_TTCMapsRec cff_service_get_cmap_info; + FT_Service_CIDRec cff_service_cid_info; + FT_Service_PropertiesRec cff_service_properties; + FT_Service_MultiMastersRec cff_service_multi_masters; + FT_Service_MetricsVariationsRec cff_service_metrics_variations; + FT_Service_CFFLoadRec cff_service_cff_load; + FT_CMap_ClassRec cff_cmap_encoding_class_rec; + FT_CMap_ClassRec cff_cmap_unicode_class_rec; + + } CffModulePIC; + + +#define GET_PIC( lib ) \ + ( (CffModulePIC*)( (lib)->pic_container.cff ) ) + +#define CFF_SERVICE_PS_INFO_GET \ + ( GET_PIC( library )->cff_service_ps_info ) +#define CFF_SERVICE_GLYPH_DICT_GET \ + ( GET_PIC( library )->cff_service_glyph_dict ) +#define CFF_SERVICE_PS_NAME_GET \ + ( GET_PIC( library )->cff_service_ps_name ) +#define CFF_SERVICE_GET_CMAP_INFO_GET \ + ( GET_PIC( library )->cff_service_get_cmap_info ) +#define CFF_SERVICE_CID_INFO_GET \ + ( GET_PIC( library )->cff_service_cid_info ) +#define CFF_SERVICE_PROPERTIES_GET \ + ( GET_PIC( library )->cff_service_properties ) +#define CFF_SERVICES_GET \ + ( GET_PIC( library )->cff_services ) +#define CFF_SERVICE_MULTI_MASTERS_GET \ + ( GET_PIC( library )->cff_service_multi_masters ) +#define CFF_SERVICE_METRICS_VAR_GET \ + ( GET_PIC( library )->cff_service_metrics_variations ) +#define CFF_SERVICE_CFF_LOAD_GET \ + ( GET_PIC( library )->cff_service_cff_load ) +#define CFF_CMAP_ENCODING_CLASS_REC_GET \ + ( GET_PIC( library )->cff_cmap_encoding_class_rec ) +#define CFF_CMAP_UNICODE_CLASS_REC_GET \ + ( GET_PIC( library )->cff_cmap_unicode_class_rec ) +#define CFF_FIELD_HANDLERS_GET \ + ( GET_PIC( library )->cff_field_handlers ) + + /* see cffpic.c for the implementation */ + void + cff_driver_class_pic_free( FT_Library library ); + + FT_Error + cff_driver_class_pic_init( FT_Library library ); + +FT_END_HEADER + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +#endif /* CFFPIC_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/cff/cfftoken.h b/vendor/FreeType2/src/cff/cfftoken.h new file mode 100644 index 0000000..fec1ca2 --- /dev/null +++ b/vendor/FreeType2/src/cff/cfftoken.h @@ -0,0 +1,150 @@ +/***************************************************************************/ +/* */ +/* cfftoken.h */ +/* */ +/* CFF token definitions (specification only). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRecDictRec + +#undef CFFCODE +#define CFFCODE CFF_CODE_TOPDICT + + CFF_FIELD_STRING ( 0, version, "Version" ) + CFF_FIELD_STRING ( 1, notice, "Notice" ) + CFF_FIELD_STRING ( 0x100, copyright, "Copyright" ) + CFF_FIELD_STRING ( 2, full_name, "FullName" ) + CFF_FIELD_STRING ( 3, family_name, "FamilyName" ) + CFF_FIELD_STRING ( 4, weight, "Weight" ) + CFF_FIELD_BOOL ( 0x101, is_fixed_pitch, "isFixedPitch" ) + CFF_FIELD_FIXED ( 0x102, italic_angle, "ItalicAngle" ) + CFF_FIELD_FIXED ( 0x103, underline_position, "UnderlinePosition" ) + CFF_FIELD_FIXED ( 0x104, underline_thickness, "UnderlineThickness" ) + CFF_FIELD_NUM ( 0x105, paint_type, "PaintType" ) + CFF_FIELD_NUM ( 0x106, charstring_type, "CharstringType" ) + CFF_FIELD_CALLBACK( 0x107, font_matrix, "FontMatrix" ) + CFF_FIELD_NUM ( 13, unique_id, "UniqueID" ) + CFF_FIELD_CALLBACK( 5, font_bbox, "FontBBox" ) + CFF_FIELD_NUM ( 0x108, stroke_width, "StrokeWidth" ) +#if 0 + CFF_FIELD_DELTA ( 14, xuid, 16, "XUID" ) +#endif + CFF_FIELD_NUM ( 15, charset_offset, "charset" ) + CFF_FIELD_NUM ( 16, encoding_offset, "Encoding" ) + CFF_FIELD_NUM ( 17, charstrings_offset, "CharStrings" ) + CFF_FIELD_CALLBACK( 18, private_dict, "Private" ) + CFF_FIELD_NUM ( 0x114, synthetic_base, "SyntheticBase" ) + CFF_FIELD_STRING ( 0x115, embedded_postscript, "PostScript" ) + +#if 0 + CFF_FIELD_STRING ( 0x116, base_font_name, "BaseFontName" ) + CFF_FIELD_DELTA ( 0x117, base_font_blend, 16, "BaseFontBlend" ) +#endif + + /* the next two operators were removed from the Type2 specification */ + /* in version 16-March-2000 */ + CFF_FIELD_CALLBACK( 0x118, multiple_master, "MultipleMaster" ) +#if 0 + CFF_FIELD_CALLBACK( 0x11A, blend_axis_types, "BlendAxisTypes" ) +#endif + + CFF_FIELD_CALLBACK( 0x11E, cid_ros, "ROS" ) + CFF_FIELD_NUM ( 0x11F, cid_font_version, "CIDFontVersion" ) + CFF_FIELD_NUM ( 0x120, cid_font_revision, "CIDFontRevision" ) + CFF_FIELD_NUM ( 0x121, cid_font_type, "CIDFontType" ) + CFF_FIELD_NUM ( 0x122, cid_count, "CIDCount" ) + CFF_FIELD_NUM ( 0x123, cid_uid_base, "UIDBase" ) + CFF_FIELD_NUM ( 0x124, cid_fd_array_offset, "FDArray" ) + CFF_FIELD_NUM ( 0x125, cid_fd_select_offset, "FDSelect" ) + CFF_FIELD_STRING ( 0x126, cid_font_name, "FontName" ) + +#if 0 + CFF_FIELD_NUM ( 0x127, chameleon, "Chameleon" ) +#endif + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_PrivateRec +#undef CFFCODE +#define CFFCODE CFF_CODE_PRIVATE + + CFF_FIELD_DELTA ( 6, blue_values, 14, "BlueValues" ) + CFF_FIELD_DELTA ( 7, other_blues, 10, "OtherBlues" ) + CFF_FIELD_DELTA ( 8, family_blues, 14, "FamilyBlues" ) + CFF_FIELD_DELTA ( 9, family_other_blues, 10, "FamilyOtherBlues" ) + CFF_FIELD_FIXED_1000( 0x109, blue_scale, "BlueScale" ) + CFF_FIELD_NUM ( 0x10A, blue_shift, "BlueShift" ) + CFF_FIELD_NUM ( 0x10B, blue_fuzz, "BlueFuzz" ) + CFF_FIELD_NUM ( 10, standard_width, "StdHW" ) + CFF_FIELD_NUM ( 11, standard_height, "StdVW" ) + CFF_FIELD_DELTA ( 0x10C, snap_widths, 13, "StemSnapH" ) + CFF_FIELD_DELTA ( 0x10D, snap_heights, 13, "StemSnapV" ) + CFF_FIELD_BOOL ( 0x10E, force_bold, "ForceBold" ) + CFF_FIELD_FIXED ( 0x10F, force_bold_threshold, "ForceBoldThreshold" ) + CFF_FIELD_NUM ( 0x110, lenIV, "lenIV" ) + CFF_FIELD_NUM ( 0x111, language_group, "LanguageGroup" ) + CFF_FIELD_FIXED ( 0x112, expansion_factor, "ExpansionFactor" ) + CFF_FIELD_NUM ( 0x113, initial_random_seed, "initialRandomSeed" ) + CFF_FIELD_NUM ( 19, local_subrs_offset, "Subrs" ) + CFF_FIELD_NUM ( 20, default_width, "defaultWidthX" ) + CFF_FIELD_NUM ( 21, nominal_width, "nominalWidthX" ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRecDictRec +#undef CFFCODE +#define CFFCODE CFF2_CODE_TOPDICT + + CFF_FIELD_CALLBACK( 0x107, font_matrix, "FontMatrix" ) + CFF_FIELD_NUM ( 17, charstrings_offset, "CharStrings" ) + CFF_FIELD_NUM ( 0x124, cid_fd_array_offset, "FDArray" ) + CFF_FIELD_NUM ( 0x125, cid_fd_select_offset, "FDSelect" ) + CFF_FIELD_NUM ( 24, vstore_offset, "vstore" ) + CFF_FIELD_CALLBACK( 25, maxstack, "maxstack" ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_FontRecDictRec +#undef CFFCODE +#define CFFCODE CFF2_CODE_FONTDICT + + CFF_FIELD_CALLBACK( 18, private_dict, "Private" ) + CFF_FIELD_CALLBACK( 0x107, font_matrix, "FontMatrix" ) + + +#undef FT_STRUCTURE +#define FT_STRUCTURE CFF_PrivateRec +#undef CFFCODE +#define CFFCODE CFF2_CODE_PRIVATE + + CFF_FIELD_DELTA ( 6, blue_values, 14, "BlueValues" ) + CFF_FIELD_DELTA ( 7, other_blues, 10, "OtherBlues" ) + CFF_FIELD_DELTA ( 8, family_blues, 14, "FamilyBlues" ) + CFF_FIELD_DELTA ( 9, family_other_blues, 10, "FamilyOtherBlues" ) + CFF_FIELD_FIXED_1000( 0x109, blue_scale, "BlueScale" ) + CFF_FIELD_NUM ( 0x10A, blue_shift, "BlueShift" ) + CFF_FIELD_NUM ( 0x10B, blue_fuzz, "BlueFuzz" ) + CFF_FIELD_NUM ( 10, standard_width, "StdHW" ) + CFF_FIELD_NUM ( 11, standard_height, "StdVW" ) + CFF_FIELD_DELTA ( 0x10C, snap_widths, 13, "StemSnapH" ) + CFF_FIELD_DELTA ( 0x10D, snap_heights, 13, "StemSnapV" ) + CFF_FIELD_NUM ( 0x111, language_group, "LanguageGroup" ) + CFF_FIELD_FIXED ( 0x112, expansion_factor, "ExpansionFactor" ) + CFF_FIELD_CALLBACK ( 22, vsindex, "vsindex" ) + CFF_FIELD_BLEND ( 23, "blend" ) + CFF_FIELD_NUM ( 19, local_subrs_offset, "Subrs" ) + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/afmparse.c b/vendor/FreeType2/src/psaux/afmparse.c new file mode 100644 index 0000000..0c33d59 --- /dev/null +++ b/vendor/FreeType2/src/psaux/afmparse.c @@ -0,0 +1,986 @@ +/***************************************************************************/ +/* */ +/* afmparse.c */ +/* */ +/* AFM parser (body). */ +/* */ +/* Copyright 2006-2018 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. */ +/* */ +/***************************************************************************/ + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_POSTSCRIPT_AUX_H + +#ifndef T1_CONFIG_OPTION_NO_AFM + +#include "afmparse.h" +#include "psconv.h" + +#include "psauxerr.h" + + +/***************************************************************************/ +/* */ +/* AFM_Stream */ +/* */ +/* The use of AFM_Stream is largely inspired by parseAFM.[ch] from t1lib. */ +/* */ +/* */ + + enum + { + AFM_STREAM_STATUS_NORMAL, + AFM_STREAM_STATUS_EOC, + AFM_STREAM_STATUS_EOL, + AFM_STREAM_STATUS_EOF + }; + + + typedef struct AFM_StreamRec_ + { + FT_Byte* cursor; + FT_Byte* base; + FT_Byte* limit; + + FT_Int status; + + } AFM_StreamRec; + + +#ifndef EOF +#define EOF -1 +#endif + + + /* this works because empty lines are ignored */ +#define AFM_IS_NEWLINE( ch ) ( (ch) == '\r' || (ch) == '\n' ) + +#define AFM_IS_EOF( ch ) ( (ch) == EOF || (ch) == '\x1a' ) +#define AFM_IS_SPACE( ch ) ( (ch) == ' ' || (ch) == '\t' ) + + /* column separator; there is no `column' in the spec actually */ +#define AFM_IS_SEP( ch ) ( (ch) == ';' ) + +#define AFM_GETC() \ + ( ( (stream)->cursor < (stream)->limit ) ? *(stream)->cursor++ \ + : EOF ) + +#define AFM_STREAM_KEY_BEGIN( stream ) \ + (char*)( (stream)->cursor - 1 ) + +#define AFM_STREAM_KEY_LEN( stream, key ) \ + (FT_Offset)( (char*)(stream)->cursor - key - 1 ) + +#define AFM_STATUS_EOC( stream ) \ + ( (stream)->status >= AFM_STREAM_STATUS_EOC ) + +#define AFM_STATUS_EOL( stream ) \ + ( (stream)->status >= AFM_STREAM_STATUS_EOL ) + +#define AFM_STATUS_EOF( stream ) \ + ( (stream)->status >= AFM_STREAM_STATUS_EOF ) + + + static int + afm_stream_skip_spaces( AFM_Stream stream ) + { + int ch = 0; /* make stupid compiler happy */ + + + if ( AFM_STATUS_EOC( stream ) ) + return ';'; + + while ( 1 ) + { + ch = AFM_GETC(); + if ( !AFM_IS_SPACE( ch ) ) + break; + } + + if ( AFM_IS_NEWLINE( ch ) ) + stream->status = AFM_STREAM_STATUS_EOL; + else if ( AFM_IS_SEP( ch ) ) + stream->status = AFM_STREAM_STATUS_EOC; + else if ( AFM_IS_EOF( ch ) ) + stream->status = AFM_STREAM_STATUS_EOF; + + return ch; + } + + + /* read a key or value in current column */ + static char* + afm_stream_read_one( AFM_Stream stream ) + { + char* str; + + + afm_stream_skip_spaces( stream ); + if ( AFM_STATUS_EOC( stream ) ) + return NULL; + + str = AFM_STREAM_KEY_BEGIN( stream ); + + while ( 1 ) + { + int ch = AFM_GETC(); + + + if ( AFM_IS_SPACE( ch ) ) + break; + else if ( AFM_IS_NEWLINE( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOL; + break; + } + else if ( AFM_IS_SEP( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOC; + break; + } + else if ( AFM_IS_EOF( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOF; + break; + } + } + + return str; + } + + + /* read a string (i.e., read to EOL) */ + static char* + afm_stream_read_string( AFM_Stream stream ) + { + char* str; + + + afm_stream_skip_spaces( stream ); + if ( AFM_STATUS_EOL( stream ) ) + return NULL; + + str = AFM_STREAM_KEY_BEGIN( stream ); + + /* scan to eol */ + while ( 1 ) + { + int ch = AFM_GETC(); + + + if ( AFM_IS_NEWLINE( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOL; + break; + } + else if ( AFM_IS_EOF( ch ) ) + { + stream->status = AFM_STREAM_STATUS_EOF; + break; + } + } + + return str; + } + + + /*************************************************************************/ + /* */ + /* AFM_Parser */ + /* */ + /* */ + + /* all keys defined in Ch. 7-10 of 5004.AFM_Spec.pdf */ + typedef enum AFM_Token_ + { + AFM_TOKEN_ASCENDER, + AFM_TOKEN_AXISLABEL, + AFM_TOKEN_AXISTYPE, + AFM_TOKEN_B, + AFM_TOKEN_BLENDAXISTYPES, + AFM_TOKEN_BLENDDESIGNMAP, + AFM_TOKEN_BLENDDESIGNPOSITIONS, + AFM_TOKEN_C, + AFM_TOKEN_CC, + AFM_TOKEN_CH, + AFM_TOKEN_CAPHEIGHT, + AFM_TOKEN_CHARWIDTH, + AFM_TOKEN_CHARACTERSET, + AFM_TOKEN_CHARACTERS, + AFM_TOKEN_DESCENDER, + AFM_TOKEN_ENCODINGSCHEME, + AFM_TOKEN_ENDAXIS, + AFM_TOKEN_ENDCHARMETRICS, + AFM_TOKEN_ENDCOMPOSITES, + AFM_TOKEN_ENDDIRECTION, + AFM_TOKEN_ENDFONTMETRICS, + AFM_TOKEN_ENDKERNDATA, + AFM_TOKEN_ENDKERNPAIRS, + AFM_TOKEN_ENDTRACKKERN, + AFM_TOKEN_ESCCHAR, + AFM_TOKEN_FAMILYNAME, + AFM_TOKEN_FONTBBOX, + AFM_TOKEN_FONTNAME, + AFM_TOKEN_FULLNAME, + AFM_TOKEN_ISBASEFONT, + AFM_TOKEN_ISCIDFONT, + AFM_TOKEN_ISFIXEDPITCH, + AFM_TOKEN_ISFIXEDV, + AFM_TOKEN_ITALICANGLE, + AFM_TOKEN_KP, + AFM_TOKEN_KPH, + AFM_TOKEN_KPX, + AFM_TOKEN_KPY, + AFM_TOKEN_L, + AFM_TOKEN_MAPPINGSCHEME, + AFM_TOKEN_METRICSSETS, + AFM_TOKEN_N, + AFM_TOKEN_NOTICE, + AFM_TOKEN_PCC, + AFM_TOKEN_STARTAXIS, + AFM_TOKEN_STARTCHARMETRICS, + AFM_TOKEN_STARTCOMPOSITES, + AFM_TOKEN_STARTDIRECTION, + AFM_TOKEN_STARTFONTMETRICS, + AFM_TOKEN_STARTKERNDATA, + AFM_TOKEN_STARTKERNPAIRS, + AFM_TOKEN_STARTKERNPAIRS0, + AFM_TOKEN_STARTKERNPAIRS1, + AFM_TOKEN_STARTTRACKKERN, + AFM_TOKEN_STDHW, + AFM_TOKEN_STDVW, + AFM_TOKEN_TRACKKERN, + AFM_TOKEN_UNDERLINEPOSITION, + AFM_TOKEN_UNDERLINETHICKNESS, + AFM_TOKEN_VV, + AFM_TOKEN_VVECTOR, + AFM_TOKEN_VERSION, + AFM_TOKEN_W, + AFM_TOKEN_W0, + AFM_TOKEN_W0X, + AFM_TOKEN_W0Y, + AFM_TOKEN_W1, + AFM_TOKEN_W1X, + AFM_TOKEN_W1Y, + AFM_TOKEN_WX, + AFM_TOKEN_WY, + AFM_TOKEN_WEIGHT, + AFM_TOKEN_WEIGHTVECTOR, + AFM_TOKEN_XHEIGHT, + N_AFM_TOKENS, + AFM_TOKEN_UNKNOWN + + } AFM_Token; + + + static const char* const afm_key_table[N_AFM_TOKENS] = + { + "Ascender", + "AxisLabel", + "AxisType", + "B", + "BlendAxisTypes", + "BlendDesignMap", + "BlendDesignPositions", + "C", + "CC", + "CH", + "CapHeight", + "CharWidth", + "CharacterSet", + "Characters", + "Descender", + "EncodingScheme", + "EndAxis", + "EndCharMetrics", + "EndComposites", + "EndDirection", + "EndFontMetrics", + "EndKernData", + "EndKernPairs", + "EndTrackKern", + "EscChar", + "FamilyName", + "FontBBox", + "FontName", + "FullName", + "IsBaseFont", + "IsCIDFont", + "IsFixedPitch", + "IsFixedV", + "ItalicAngle", + "KP", + "KPH", + "KPX", + "KPY", + "L", + "MappingScheme", + "MetricsSets", + "N", + "Notice", + "PCC", + "StartAxis", + "StartCharMetrics", + "StartComposites", + "StartDirection", + "StartFontMetrics", + "StartKernData", + "StartKernPairs", + "StartKernPairs0", + "StartKernPairs1", + "StartTrackKern", + "StdHW", + "StdVW", + "TrackKern", + "UnderlinePosition", + "UnderlineThickness", + "VV", + "VVector", + "Version", + "W", + "W0", + "W0X", + "W0Y", + "W1", + "W1X", + "W1Y", + "WX", + "WY", + "Weight", + "WeightVector", + "XHeight" + }; + + + /* + * `afm_parser_read_vals' and `afm_parser_next_key' provide + * high-level operations to an AFM_Stream. The rest of the + * parser functions should use them without accessing the + * AFM_Stream directly. + */ + + FT_LOCAL_DEF( FT_Int ) + afm_parser_read_vals( AFM_Parser parser, + AFM_Value vals, + FT_Int n ) + { + AFM_Stream stream = parser->stream; + char* str; + FT_Int i; + + + if ( n > AFM_MAX_ARGUMENTS ) + return 0; + + for ( i = 0; i < n; i++ ) + { + FT_Offset len; + AFM_Value val = vals + i; + + + if ( val->type == AFM_VALUE_TYPE_STRING ) + str = afm_stream_read_string( stream ); + else + str = afm_stream_read_one( stream ); + + if ( !str ) + break; + + len = AFM_STREAM_KEY_LEN( stream, str ); + + switch ( val->type ) + { + case AFM_VALUE_TYPE_STRING: + case AFM_VALUE_TYPE_NAME: + { + FT_Memory memory = parser->memory; + FT_Error error; + + + if ( !FT_QALLOC( val->u.s, len + 1 ) ) + { + ft_memcpy( val->u.s, str, len ); + val->u.s[len] = '\0'; + } + } + break; + + case AFM_VALUE_TYPE_FIXED: + val->u.f = PS_Conv_ToFixed( (FT_Byte**)(void*)&str, + (FT_Byte*)str + len, 0 ); + break; + + case AFM_VALUE_TYPE_INTEGER: + val->u.i = PS_Conv_ToInt( (FT_Byte**)(void*)&str, + (FT_Byte*)str + len ); + break; + + case AFM_VALUE_TYPE_BOOL: + val->u.b = FT_BOOL( len == 4 && + !ft_strncmp( str, "true", 4 ) ); + break; + + case AFM_VALUE_TYPE_INDEX: + if ( parser->get_index ) + val->u.i = parser->get_index( str, len, parser->user_data ); + else + val->u.i = 0; + break; + } + } + + return i; + } + + + FT_LOCAL_DEF( char* ) + afm_parser_next_key( AFM_Parser parser, + FT_Bool line, + FT_Offset* len ) + { + AFM_Stream stream = parser->stream; + char* key = NULL; /* make stupid compiler happy */ + + + if ( line ) + { + while ( 1 ) + { + /* skip current line */ + if ( !AFM_STATUS_EOL( stream ) ) + afm_stream_read_string( stream ); + + stream->status = AFM_STREAM_STATUS_NORMAL; + key = afm_stream_read_one( stream ); + + /* skip empty line */ + if ( !key && + !AFM_STATUS_EOF( stream ) && + AFM_STATUS_EOL( stream ) ) + continue; + + break; + } + } + else + { + while ( 1 ) + { + /* skip current column */ + while ( !AFM_STATUS_EOC( stream ) ) + afm_stream_read_one( stream ); + + stream->status = AFM_STREAM_STATUS_NORMAL; + key = afm_stream_read_one( stream ); + + /* skip empty column */ + if ( !key && + !AFM_STATUS_EOF( stream ) && + AFM_STATUS_EOC( stream ) ) + continue; + + break; + } + } + + if ( len ) + *len = ( key ) ? (FT_Offset)AFM_STREAM_KEY_LEN( stream, key ) + : 0; + + return key; + } + + + static AFM_Token + afm_tokenize( const char* key, + FT_Offset len ) + { + int n; + + + for ( n = 0; n < N_AFM_TOKENS; n++ ) + { + if ( *( afm_key_table[n] ) == *key ) + { + for ( ; n < N_AFM_TOKENS; n++ ) + { + if ( *( afm_key_table[n] ) != *key ) + return AFM_TOKEN_UNKNOWN; + + if ( ft_strncmp( afm_key_table[n], key, len ) == 0 ) + return (AFM_Token) n; + } + } + } + + return AFM_TOKEN_UNKNOWN; + } + + + FT_LOCAL_DEF( FT_Error ) + afm_parser_init( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ) + { + AFM_Stream stream = NULL; + FT_Error error; + + + if ( FT_NEW( stream ) ) + return error; + + stream->cursor = stream->base = base; + stream->limit = limit; + + /* don't skip the first line during the first call */ + stream->status = AFM_STREAM_STATUS_EOL; + + parser->memory = memory; + parser->stream = stream; + parser->FontInfo = NULL; + parser->get_index = NULL; + + return FT_Err_Ok; + } + + + FT_LOCAL( void ) + afm_parser_done( AFM_Parser parser ) + { + FT_Memory memory = parser->memory; + + + FT_FREE( parser->stream ); + } + + + static FT_Error + afm_parser_read_int( AFM_Parser parser, + FT_Int* aint ) + { + AFM_ValueRec val; + + + val.type = AFM_VALUE_TYPE_INTEGER; + + if ( afm_parser_read_vals( parser, &val, 1 ) == 1 ) + { + *aint = val.u.i; + + return FT_Err_Ok; + } + else + return FT_THROW( Syntax_Error ); + } + + + static FT_Error + afm_parse_track_kern( AFM_Parser parser ) + { + AFM_FontInfo fi = parser->FontInfo; + AFM_TrackKern tk; + char* key; + FT_Offset len; + int n = -1; + FT_Int tmp; + + + if ( afm_parser_read_int( parser, &tmp ) ) + goto Fail; + + if ( tmp < 0 ) + goto Fail; + + fi->NumTrackKern = (FT_UInt)tmp; + + if ( fi->NumTrackKern ) + { + FT_Memory memory = parser->memory; + FT_Error error; + + + if ( FT_QNEW_ARRAY( fi->TrackKerns, fi->NumTrackKern ) ) + return error; + } + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_ValueRec shared_vals[5]; + + + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_TRACKKERN: + n++; + + if ( n >= (int)fi->NumTrackKern ) + goto Fail; + + tk = fi->TrackKerns + n; + + shared_vals[0].type = AFM_VALUE_TYPE_INTEGER; + shared_vals[1].type = AFM_VALUE_TYPE_FIXED; + shared_vals[2].type = AFM_VALUE_TYPE_FIXED; + shared_vals[3].type = AFM_VALUE_TYPE_FIXED; + shared_vals[4].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 5 ) != 5 ) + goto Fail; + + tk->degree = shared_vals[0].u.i; + tk->min_ptsize = shared_vals[1].u.f; + tk->min_kern = shared_vals[2].u.f; + tk->max_ptsize = shared_vals[3].u.f; + tk->max_kern = shared_vals[4].u.f; + + break; + + case AFM_TOKEN_ENDTRACKKERN: + case AFM_TOKEN_ENDKERNDATA: + case AFM_TOKEN_ENDFONTMETRICS: + fi->NumTrackKern = (FT_UInt)( n + 1 ); + return FT_Err_Ok; + + case AFM_TOKEN_UNKNOWN: + break; + + default: + goto Fail; + } + } + + Fail: + return FT_THROW( Syntax_Error ); + } + + +#undef KERN_INDEX +#define KERN_INDEX( g1, g2 ) ( ( (FT_ULong)g1 << 16 ) | g2 ) + + + /* compare two kerning pairs */ + FT_CALLBACK_DEF( int ) + afm_compare_kern_pairs( const void* a, + const void* b ) + { + AFM_KernPair kp1 = (AFM_KernPair)a; + AFM_KernPair kp2 = (AFM_KernPair)b; + + FT_ULong index1 = KERN_INDEX( kp1->index1, kp1->index2 ); + FT_ULong index2 = KERN_INDEX( kp2->index1, kp2->index2 ); + + + if ( index1 > index2 ) + return 1; + else if ( index1 < index2 ) + return -1; + else + return 0; + } + + + static FT_Error + afm_parse_kern_pairs( AFM_Parser parser ) + { + AFM_FontInfo fi = parser->FontInfo; + AFM_KernPair kp; + char* key; + FT_Offset len; + int n = -1; + FT_Int tmp; + + + if ( afm_parser_read_int( parser, &tmp ) ) + goto Fail; + + if ( tmp < 0 ) + goto Fail; + + fi->NumKernPair = (FT_UInt)tmp; + + if ( fi->NumKernPair ) + { + FT_Memory memory = parser->memory; + FT_Error error; + + + if ( FT_QNEW_ARRAY( fi->KernPairs, fi->NumKernPair ) ) + return error; + } + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_Token token = afm_tokenize( key, len ); + + + switch ( token ) + { + case AFM_TOKEN_KP: + case AFM_TOKEN_KPX: + case AFM_TOKEN_KPY: + { + FT_Int r; + AFM_ValueRec shared_vals[4]; + + + n++; + + if ( n >= (int)fi->NumKernPair ) + goto Fail; + + kp = fi->KernPairs + n; + + shared_vals[0].type = AFM_VALUE_TYPE_INDEX; + shared_vals[1].type = AFM_VALUE_TYPE_INDEX; + shared_vals[2].type = AFM_VALUE_TYPE_INTEGER; + shared_vals[3].type = AFM_VALUE_TYPE_INTEGER; + r = afm_parser_read_vals( parser, shared_vals, 4 ); + if ( r < 3 ) + goto Fail; + + /* index values can't be negative */ + kp->index1 = shared_vals[0].u.u; + kp->index2 = shared_vals[1].u.u; + if ( token == AFM_TOKEN_KPY ) + { + kp->x = 0; + kp->y = shared_vals[2].u.i; + } + else + { + kp->x = shared_vals[2].u.i; + kp->y = ( token == AFM_TOKEN_KP && r == 4 ) + ? shared_vals[3].u.i : 0; + } + } + break; + + case AFM_TOKEN_ENDKERNPAIRS: + case AFM_TOKEN_ENDKERNDATA: + case AFM_TOKEN_ENDFONTMETRICS: + fi->NumKernPair = (FT_UInt)( n + 1 ); + ft_qsort( fi->KernPairs, fi->NumKernPair, + sizeof ( AFM_KernPairRec ), + afm_compare_kern_pairs ); + return FT_Err_Ok; + + case AFM_TOKEN_UNKNOWN: + break; + + default: + goto Fail; + } + } + + Fail: + return FT_THROW( Syntax_Error ); + } + + + static FT_Error + afm_parse_kern_data( AFM_Parser parser ) + { + FT_Error error; + char* key; + FT_Offset len; + + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_STARTTRACKKERN: + error = afm_parse_track_kern( parser ); + if ( error ) + return error; + break; + + case AFM_TOKEN_STARTKERNPAIRS: + case AFM_TOKEN_STARTKERNPAIRS0: + error = afm_parse_kern_pairs( parser ); + if ( error ) + return error; + break; + + case AFM_TOKEN_ENDKERNDATA: + case AFM_TOKEN_ENDFONTMETRICS: + return FT_Err_Ok; + + case AFM_TOKEN_UNKNOWN: + break; + + default: + goto Fail; + } + } + + Fail: + return FT_THROW( Syntax_Error ); + } + + + static FT_Error + afm_parser_skip_section( AFM_Parser parser, + FT_Int n, + AFM_Token end_section ) + { + char* key; + FT_Offset len; + + + while ( n-- > 0 ) + { + key = afm_parser_next_key( parser, 1, NULL ); + if ( !key ) + goto Fail; + } + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_Token token = afm_tokenize( key, len ); + + + if ( token == end_section || token == AFM_TOKEN_ENDFONTMETRICS ) + return FT_Err_Ok; + } + + Fail: + return FT_THROW( Syntax_Error ); + } + + + FT_LOCAL_DEF( FT_Error ) + afm_parser_parse( AFM_Parser parser ) + { + FT_Memory memory = parser->memory; + AFM_FontInfo fi = parser->FontInfo; + FT_Error error = FT_ERR( Syntax_Error ); + char* key; + FT_Offset len; + FT_Int metrics_sets = 0; + + + if ( !fi ) + return FT_THROW( Invalid_Argument ); + + key = afm_parser_next_key( parser, 1, &len ); + if ( !key || len != 16 || + ft_strncmp( key, "StartFontMetrics", 16 ) != 0 ) + return FT_THROW( Unknown_File_Format ); + + while ( ( key = afm_parser_next_key( parser, 1, &len ) ) != 0 ) + { + AFM_ValueRec shared_vals[4]; + + + switch ( afm_tokenize( key, len ) ) + { + case AFM_TOKEN_METRICSSETS: + if ( afm_parser_read_int( parser, &metrics_sets ) ) + goto Fail; + + if ( metrics_sets != 0 && metrics_sets != 2 ) + { + error = FT_THROW( Unimplemented_Feature ); + + goto Fail; + } + break; + + case AFM_TOKEN_ISCIDFONT: + shared_vals[0].type = AFM_VALUE_TYPE_BOOL; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->IsCIDFont = shared_vals[0].u.b; + break; + + case AFM_TOKEN_FONTBBOX: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + shared_vals[1].type = AFM_VALUE_TYPE_FIXED; + shared_vals[2].type = AFM_VALUE_TYPE_FIXED; + shared_vals[3].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 4 ) != 4 ) + goto Fail; + + fi->FontBBox.xMin = shared_vals[0].u.f; + fi->FontBBox.yMin = shared_vals[1].u.f; + fi->FontBBox.xMax = shared_vals[2].u.f; + fi->FontBBox.yMax = shared_vals[3].u.f; + break; + + case AFM_TOKEN_ASCENDER: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->Ascender = shared_vals[0].u.f; + break; + + case AFM_TOKEN_DESCENDER: + shared_vals[0].type = AFM_VALUE_TYPE_FIXED; + if ( afm_parser_read_vals( parser, shared_vals, 1 ) != 1 ) + goto Fail; + + fi->Descender = shared_vals[0].u.f; + break; + + case AFM_TOKEN_STARTCHARMETRICS: + { + FT_Int n = 0; + + + if ( afm_parser_read_int( parser, &n ) ) + goto Fail; + + error = afm_parser_skip_section( parser, n, + AFM_TOKEN_ENDCHARMETRICS ); + if ( error ) + return error; + } + break; + + case AFM_TOKEN_STARTKERNDATA: + error = afm_parse_kern_data( parser ); + if ( error ) + goto Fail; + /* fall through since we only support kern data */ + + case AFM_TOKEN_ENDFONTMETRICS: + return FT_Err_Ok; + + default: + break; + } + } + + Fail: + FT_FREE( fi->TrackKerns ); + fi->NumTrackKern = 0; + + FT_FREE( fi->KernPairs ); + fi->NumKernPair = 0; + + fi->IsCIDFont = 0; + + return error; + } + +#else /* T1_CONFIG_OPTION_NO_AFM */ + + /* ANSI C doesn't like empty source files */ + typedef int _afm_parse_dummy; + +#endif /* T1_CONFIG_OPTION_NO_AFM */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/afmparse.h b/vendor/FreeType2/src/psaux/afmparse.h new file mode 100644 index 0000000..86f852a --- /dev/null +++ b/vendor/FreeType2/src/psaux/afmparse.h @@ -0,0 +1,89 @@ +/***************************************************************************/ +/* */ +/* afmparse.h */ +/* */ +/* AFM parser (specification). */ +/* */ +/* Copyright 2006-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef AFMPARSE_H_ +#define AFMPARSE_H_ + + +#include +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + afm_parser_init( AFM_Parser parser, + FT_Memory memory, + FT_Byte* base, + FT_Byte* limit ); + + + FT_LOCAL( void ) + afm_parser_done( AFM_Parser parser ); + + + FT_LOCAL( FT_Error ) + afm_parser_parse( AFM_Parser parser ); + + + enum AFM_ValueType_ + { + AFM_VALUE_TYPE_STRING, + AFM_VALUE_TYPE_NAME, + AFM_VALUE_TYPE_FIXED, /* real number */ + AFM_VALUE_TYPE_INTEGER, + AFM_VALUE_TYPE_BOOL, + AFM_VALUE_TYPE_INDEX /* glyph index */ + }; + + + typedef struct AFM_ValueRec_ + { + enum AFM_ValueType_ type; + union + { + char* s; + FT_Fixed f; + FT_Int i; + FT_UInt u; + FT_Bool b; + + } u; + + } AFM_ValueRec, *AFM_Value; + +#define AFM_MAX_ARGUMENTS 5 + + FT_LOCAL( FT_Int ) + afm_parser_read_vals( AFM_Parser parser, + AFM_Value vals, + FT_Int n ); + + /* read the next key from the next line or column */ + FT_LOCAL( char* ) + afm_parser_next_key( AFM_Parser parser, + FT_Bool line, + FT_Offset* len ); + +FT_END_HEADER + +#endif /* AFMPARSE_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/cffdecode.c b/vendor/FreeType2/src/psaux/cffdecode.c new file mode 100644 index 0000000..80d622c --- /dev/null +++ b/vendor/FreeType2/src/psaux/cffdecode.c @@ -0,0 +1,2370 @@ +/***************************************************************************/ +/* */ +/* cffdecode.c */ +/* */ +/* PostScript CFF (Type 2) decoding routines (body). */ +/* */ +/* Copyright 2017-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_SERVICE_H +#include FT_SERVICE_CFF_TABLE_LOAD_H + +#include "cffdecode.h" +#include "psobjs.h" + +#include "psauxerr.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_cffdecode + + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + + typedef enum CFF_Operator_ + { + cff_op_unknown = 0, + + cff_op_rmoveto, + cff_op_hmoveto, + cff_op_vmoveto, + + cff_op_rlineto, + cff_op_hlineto, + cff_op_vlineto, + + cff_op_rrcurveto, + cff_op_hhcurveto, + cff_op_hvcurveto, + cff_op_rcurveline, + cff_op_rlinecurve, + cff_op_vhcurveto, + cff_op_vvcurveto, + + cff_op_flex, + cff_op_hflex, + cff_op_hflex1, + cff_op_flex1, + + cff_op_endchar, + + cff_op_hstem, + cff_op_vstem, + cff_op_hstemhm, + cff_op_vstemhm, + + cff_op_hintmask, + cff_op_cntrmask, + cff_op_dotsection, /* deprecated, acts as no-op */ + + cff_op_abs, + cff_op_add, + cff_op_sub, + cff_op_div, + cff_op_neg, + cff_op_random, + cff_op_mul, + cff_op_sqrt, + + cff_op_blend, + + cff_op_drop, + cff_op_exch, + cff_op_index, + cff_op_roll, + cff_op_dup, + + cff_op_put, + cff_op_get, + cff_op_store, + cff_op_load, + + cff_op_and, + cff_op_or, + cff_op_not, + cff_op_eq, + cff_op_ifelse, + + cff_op_callsubr, + cff_op_callgsubr, + cff_op_return, + + /* Type 1 opcodes: invalid but seen in real life */ + cff_op_hsbw, + cff_op_closepath, + cff_op_callothersubr, + cff_op_pop, + cff_op_seac, + cff_op_sbw, + cff_op_setcurrentpoint, + + /* do not remove */ + cff_op_max + + } CFF_Operator; + + +#define CFF_COUNT_CHECK_WIDTH 0x80 +#define CFF_COUNT_EXACT 0x40 +#define CFF_COUNT_CLEAR_STACK 0x20 + + /* count values which have the `CFF_COUNT_CHECK_WIDTH' flag set are */ + /* used for checking the width and requested numbers of arguments */ + /* only; they are set to zero afterwards */ + + /* the other two flags are informative only and unused currently */ + + static const FT_Byte cff_argument_counts[] = + { + 0, /* unknown */ + + 2 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, /* rmoveto */ + 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, + 1 | CFF_COUNT_CHECK_WIDTH | CFF_COUNT_EXACT, + + 0 | CFF_COUNT_CLEAR_STACK, /* rlineto */ + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + + 0 | CFF_COUNT_CLEAR_STACK, /* rrcurveto */ + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + 0 | CFF_COUNT_CLEAR_STACK, + + 13, /* flex */ + 7, + 9, + 11, + + 0 | CFF_COUNT_CHECK_WIDTH, /* endchar */ + + 2 | CFF_COUNT_CHECK_WIDTH, /* hstem */ + 2 | CFF_COUNT_CHECK_WIDTH, + 2 | CFF_COUNT_CHECK_WIDTH, + 2 | CFF_COUNT_CHECK_WIDTH, + + 0 | CFF_COUNT_CHECK_WIDTH, /* hintmask */ + 0 | CFF_COUNT_CHECK_WIDTH, /* cntrmask */ + 0, /* dotsection */ + + 1, /* abs */ + 2, + 2, + 2, + 1, + 0, + 2, + 1, + + 1, /* blend */ + + 1, /* drop */ + 2, + 1, + 2, + 1, + + 2, /* put */ + 1, + 4, + 3, + + 2, /* and */ + 2, + 1, + 2, + 4, + + 1, /* callsubr */ + 1, + 0, + + 2, /* hsbw */ + 0, + 0, + 0, + 5, /* seac */ + 4, /* sbw */ + 2 /* setcurrentpoint */ + }; + + + static FT_Error + cff_operator_seac( CFF_Decoder* decoder, + FT_Pos asb, + FT_Pos adx, + FT_Pos ady, + FT_Int bchar, + FT_Int achar ) + { + FT_Error error; + CFF_Builder* builder = &decoder->builder; + FT_Int bchar_index, achar_index; + TT_Face face = decoder->builder.face; + FT_Vector left_bearing, advance; + FT_Byte* charstring; + FT_ULong charstring_len; + FT_Pos glyph_width; + + + if ( decoder->seac ) + { + FT_ERROR(( "cff_operator_seac: invalid nested seac\n" )); + return FT_THROW( Syntax_Error ); + } + + adx += decoder->builder.left_bearing.x; + ady += decoder->builder.left_bearing.y; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* Incremental fonts don't necessarily have valid charsets. */ + /* They use the character code, not the glyph index, in this case. */ + if ( face->root.internal->incremental_interface ) + { + bchar_index = bchar; + achar_index = achar; + } + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + CFF_Font cff = (CFF_Font)(face->extra.data); + + + bchar_index = cff_lookup_glyph_by_stdcharcode( cff, bchar ); + achar_index = cff_lookup_glyph_by_stdcharcode( cff, achar ); + } + + if ( bchar_index < 0 || achar_index < 0 ) + { + FT_ERROR(( "cff_operator_seac:" + " invalid seac character code arguments\n" )); + return FT_THROW( Syntax_Error ); + } + + /* If we are trying to load a composite glyph, do not load the */ + /* accent character and return the array of subglyphs. */ + if ( builder->no_recurse ) + { + FT_GlyphSlot glyph = (FT_GlyphSlot)builder->glyph; + FT_GlyphLoader loader = glyph->internal->loader; + FT_SubGlyph subg; + + + /* reallocate subglyph array if necessary */ + error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); + if ( error ) + goto Exit; + + subg = loader->current.subglyphs; + + /* subglyph 0 = base character */ + subg->index = bchar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | + FT_SUBGLYPH_FLAG_USE_MY_METRICS; + subg->arg1 = 0; + subg->arg2 = 0; + subg++; + + /* subglyph 1 = accent character */ + subg->index = achar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; + subg->arg1 = (FT_Int)( adx >> 16 ); + subg->arg2 = (FT_Int)( ady >> 16 ); + + /* set up remaining glyph fields */ + glyph->num_subglyphs = 2; + glyph->subglyphs = loader->base.subglyphs; + glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + loader->current.num_subglyphs = 2; + } + + FT_GlyphLoader_Prepare( builder->loader ); + + /* First load `bchar' in builder */ + error = decoder->get_glyph_callback( face, (FT_UInt)bchar_index, + &charstring, &charstring_len ); + if ( !error ) + { + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = cff_decoder_parse_charstrings( decoder, charstring, + charstring_len, 0 ); + decoder->seac = FALSE; + + decoder->free_glyph_callback( face, &charstring, charstring_len ); + + if ( error ) + goto Exit; + } + + /* Save the left bearing, advance and glyph width of the base */ + /* character as they will be erased by the next load. */ + + left_bearing = builder->left_bearing; + advance = builder->advance; + glyph_width = decoder->glyph_width; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + + builder->pos_x = adx - asb; + builder->pos_y = ady; + + /* Now load `achar' on top of the base outline. */ + error = decoder->get_glyph_callback( face, (FT_UInt)achar_index, + &charstring, &charstring_len ); + if ( !error ) + { + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = cff_decoder_parse_charstrings( decoder, charstring, + charstring_len, 0 ); + decoder->seac = FALSE; + + decoder->free_glyph_callback( face, &charstring, charstring_len ); + + if ( error ) + goto Exit; + } + + /* Restore the left side bearing, advance and glyph width */ + /* of the base character. */ + builder->left_bearing = left_bearing; + builder->advance = advance; + decoder->glyph_width = glyph_width; + + builder->pos_x = 0; + builder->pos_y = 0; + + Exit: + return error; + } + +#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /********** *********/ + /********** *********/ + /********** GENERIC CHARSTRING PARSING *********/ + /********** *********/ + /********** *********/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* */ + /* cff_compute_bias */ + /* */ + /* */ + /* Computes the bias value in dependence of the number of glyph */ + /* subroutines. */ + /* */ + /* */ + /* in_charstring_type :: The `CharstringType' value of the top DICT */ + /* dictionary. */ + /* */ + /* num_subrs :: The number of glyph subroutines. */ + /* */ + /* */ + /* The bias value. */ + static FT_Int + cff_compute_bias( FT_Int in_charstring_type, + FT_UInt num_subrs ) + { + FT_Int result; + + + if ( in_charstring_type == 1 ) + result = 0; + else if ( num_subrs < 1240 ) + result = 107; + else if ( num_subrs < 33900U ) + result = 1131; + else + result = 32768U; + + return result; + } + + + FT_LOCAL_DEF( FT_Int ) + cff_lookup_glyph_by_stdcharcode( CFF_Font cff, + FT_Int charcode ) + { + FT_UInt n; + FT_UShort glyph_sid; + + FT_Service_CFFLoad cffload; + + + /* CID-keyed fonts don't have glyph names */ + if ( !cff->charset.sids ) + return -1; + + /* check range of standard char code */ + if ( charcode < 0 || charcode > 255 ) + return -1; + +#if 0 + /* retrieve cffload from list of current modules */ + FT_Service_CFFLoad cffload; + + + FT_FACE_FIND_GLOBAL_SERVICE( face, cffload, CFF_LOAD ); + if ( !cffload ) + { + FT_ERROR(( "cff_lookup_glyph_by_stdcharcode:" + " the `cffload' module is not available\n" )); + return FT_THROW( Unimplemented_Feature ); + } +#endif + + cffload = (FT_Service_CFFLoad)cff->cffload; + + /* Get code to SID mapping from `cff_standard_encoding'. */ + glyph_sid = cffload->get_standard_encoding( (FT_UInt)charcode ); + + for ( n = 0; n < cff->num_glyphs; n++ ) + { + if ( cff->charset.sids[n] == glyph_sid ) + return (FT_Int)n; + } + + return -1; + } + + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + + /*************************************************************************/ + /* */ + /* */ + /* cff_decoder_parse_charstrings */ + /* */ + /* */ + /* Parses a given Type 2 charstrings program. */ + /* */ + /* */ + /* decoder :: The current Type 1 decoder. */ + /* */ + /* */ + /* charstring_base :: The base of the charstring stream. */ + /* */ + /* charstring_len :: The length in bytes of the charstring stream. */ + /* */ + /* in_dict :: Set to 1 if function is called from top or */ + /* private DICT (needed for Multiple Master CFFs). */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + cff_decoder_parse_charstrings( CFF_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len, + FT_Bool in_dict ) + { + FT_Error error; + CFF_Decoder_Zone* zone; + FT_Byte* ip; + FT_Byte* limit; + CFF_Builder* builder = &decoder->builder; + FT_Pos x, y; + FT_Fixed* stack; + FT_Int charstring_type = + decoder->cff->top_font.font_dict.charstring_type; + FT_UShort num_designs = + decoder->cff->top_font.font_dict.num_designs; + FT_UShort num_axes = + decoder->cff->top_font.font_dict.num_axes; + + T2_Hints_Funcs hinter; + + + /* set default width */ + decoder->num_hints = 0; + decoder->read_width = 1; + + /* initialize the decoder */ + decoder->top = decoder->stack; + decoder->zone = decoder->zones; + zone = decoder->zones; + stack = decoder->top; + + hinter = (T2_Hints_Funcs)builder->hints_funcs; + + builder->path_begun = 0; + + zone->base = charstring_base; + limit = zone->limit = charstring_base + charstring_len; + ip = zone->cursor = zone->base; + + error = FT_Err_Ok; + + x = builder->pos_x; + y = builder->pos_y; + + /* begin hints recording session, if any */ + if ( hinter ) + hinter->open( hinter->hints ); + + /* now execute loop */ + while ( ip < limit ) + { + CFF_Operator op; + FT_Byte v; + + + /********************************************************************/ + /* */ + /* Decode operator or operand */ + /* */ + v = *ip++; + if ( v >= 32 || v == 28 ) + { + FT_Int shift = 16; + FT_Int32 val; + + + /* this is an operand, push it on the stack */ + + /* if we use shifts, all computations are done with unsigned */ + /* values; the conversion to a signed value is the last step */ + if ( v == 28 ) + { + if ( ip + 1 >= limit ) + goto Syntax_Error; + val = (FT_Short)( ( (FT_UShort)ip[0] << 8 ) | ip[1] ); + ip += 2; + } + else if ( v < 247 ) + val = (FT_Int32)v - 139; + else if ( v < 251 ) + { + if ( ip >= limit ) + goto Syntax_Error; + val = ( (FT_Int32)v - 247 ) * 256 + *ip++ + 108; + } + else if ( v < 255 ) + { + if ( ip >= limit ) + goto Syntax_Error; + val = -( (FT_Int32)v - 251 ) * 256 - *ip++ - 108; + } + else + { + if ( ip + 3 >= limit ) + goto Syntax_Error; + val = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) | + ( (FT_UInt32)ip[1] << 16 ) | + ( (FT_UInt32)ip[2] << 8 ) | + (FT_UInt32)ip[3] ); + ip += 4; + if ( charstring_type == 2 ) + shift = 0; + } + if ( decoder->top - stack >= CFF_MAX_OPERANDS ) + goto Stack_Overflow; + + val = (FT_Int32)( (FT_UInt32)val << shift ); + *decoder->top++ = val; + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !( val & 0xFFFFL ) ) + FT_TRACE4(( " %hd", (FT_Short)( (FT_UInt32)val >> 16 ) )); + else + FT_TRACE4(( " %.5f", val / 65536.0 )); +#endif + + } + else + { + /* The specification says that normally arguments are to be taken */ + /* from the bottom of the stack. However, this seems not to be */ + /* correct, at least for Acroread 7.0.8 on GNU/Linux: It pops the */ + /* arguments similar to a PS interpreter. */ + + FT_Fixed* args = decoder->top; + FT_Int num_args = (FT_Int)( args - decoder->stack ); + FT_Int req_args; + + + /* find operator */ + op = cff_op_unknown; + + switch ( v ) + { + case 1: + op = cff_op_hstem; + break; + case 3: + op = cff_op_vstem; + break; + case 4: + op = cff_op_vmoveto; + break; + case 5: + op = cff_op_rlineto; + break; + case 6: + op = cff_op_hlineto; + break; + case 7: + op = cff_op_vlineto; + break; + case 8: + op = cff_op_rrcurveto; + break; + case 9: + op = cff_op_closepath; + break; + case 10: + op = cff_op_callsubr; + break; + case 11: + op = cff_op_return; + break; + case 12: + if ( ip >= limit ) + goto Syntax_Error; + v = *ip++; + + switch ( v ) + { + case 0: + op = cff_op_dotsection; + break; + case 1: /* this is actually the Type1 vstem3 operator */ + op = cff_op_vstem; + break; + case 2: /* this is actually the Type1 hstem3 operator */ + op = cff_op_hstem; + break; + case 3: + op = cff_op_and; + break; + case 4: + op = cff_op_or; + break; + case 5: + op = cff_op_not; + break; + case 6: + op = cff_op_seac; + break; + case 7: + op = cff_op_sbw; + break; + case 8: + op = cff_op_store; + break; + case 9: + op = cff_op_abs; + break; + case 10: + op = cff_op_add; + break; + case 11: + op = cff_op_sub; + break; + case 12: + op = cff_op_div; + break; + case 13: + op = cff_op_load; + break; + case 14: + op = cff_op_neg; + break; + case 15: + op = cff_op_eq; + break; + case 16: + op = cff_op_callothersubr; + break; + case 17: + op = cff_op_pop; + break; + case 18: + op = cff_op_drop; + break; + case 20: + op = cff_op_put; + break; + case 21: + op = cff_op_get; + break; + case 22: + op = cff_op_ifelse; + break; + case 23: + op = cff_op_random; + break; + case 24: + op = cff_op_mul; + break; + case 26: + op = cff_op_sqrt; + break; + case 27: + op = cff_op_dup; + break; + case 28: + op = cff_op_exch; + break; + case 29: + op = cff_op_index; + break; + case 30: + op = cff_op_roll; + break; + case 33: + op = cff_op_setcurrentpoint; + break; + case 34: + op = cff_op_hflex; + break; + case 35: + op = cff_op_flex; + break; + case 36: + op = cff_op_hflex1; + break; + case 37: + op = cff_op_flex1; + break; + default: + FT_TRACE4(( " unknown op (12, %d)\n", v )); + break; + } + break; + case 13: + op = cff_op_hsbw; + break; + case 14: + op = cff_op_endchar; + break; + case 16: + op = cff_op_blend; + break; + case 18: + op = cff_op_hstemhm; + break; + case 19: + op = cff_op_hintmask; + break; + case 20: + op = cff_op_cntrmask; + break; + case 21: + op = cff_op_rmoveto; + break; + case 22: + op = cff_op_hmoveto; + break; + case 23: + op = cff_op_vstemhm; + break; + case 24: + op = cff_op_rcurveline; + break; + case 25: + op = cff_op_rlinecurve; + break; + case 26: + op = cff_op_vvcurveto; + break; + case 27: + op = cff_op_hhcurveto; + break; + case 29: + op = cff_op_callgsubr; + break; + case 30: + op = cff_op_vhcurveto; + break; + case 31: + op = cff_op_hvcurveto; + break; + default: + FT_TRACE4(( " unknown op (%d)\n", v )); + break; + } + + if ( op == cff_op_unknown ) + continue; + + /* in Multiple Master CFFs, T2 charstrings can appear in */ + /* dictionaries, but some operators are prohibited */ + if ( in_dict ) + { + switch ( op ) + { + case cff_op_hstem: + case cff_op_vstem: + case cff_op_vmoveto: + case cff_op_rlineto: + case cff_op_hlineto: + case cff_op_vlineto: + case cff_op_rrcurveto: + case cff_op_hstemhm: + case cff_op_hintmask: + case cff_op_cntrmask: + case cff_op_rmoveto: + case cff_op_hmoveto: + case cff_op_vstemhm: + case cff_op_rcurveline: + case cff_op_rlinecurve: + case cff_op_vvcurveto: + case cff_op_hhcurveto: + case cff_op_vhcurveto: + case cff_op_hvcurveto: + case cff_op_hflex: + case cff_op_flex: + case cff_op_hflex1: + case cff_op_flex1: + case cff_op_callsubr: + case cff_op_callgsubr: + goto MM_Error; + + default: + break; + } + } + + /* check arguments */ + req_args = cff_argument_counts[op]; + if ( req_args & CFF_COUNT_CHECK_WIDTH ) + { + if ( num_args > 0 && decoder->read_width ) + { + /* If `nominal_width' is non-zero, the number is really a */ + /* difference against `nominal_width'. Else, the number here */ + /* is truly a width, not a difference against `nominal_width'. */ + /* If the font does not set `nominal_width', then */ + /* `nominal_width' defaults to zero, and so we can set */ + /* `glyph_width' to `nominal_width' plus number on the stack */ + /* -- for either case. */ + + FT_Int set_width_ok; + + + switch ( op ) + { + case cff_op_hmoveto: + case cff_op_vmoveto: + set_width_ok = num_args & 2; + break; + + case cff_op_hstem: + case cff_op_vstem: + case cff_op_hstemhm: + case cff_op_vstemhm: + case cff_op_rmoveto: + case cff_op_hintmask: + case cff_op_cntrmask: + set_width_ok = num_args & 1; + break; + + case cff_op_endchar: + /* If there is a width specified for endchar, we either have */ + /* 1 argument or 5 arguments. We like to argue. */ + set_width_ok = in_dict + ? 0 + : ( ( num_args == 5 ) || ( num_args == 1 ) ); + break; + + default: + set_width_ok = 0; + break; + } + + if ( set_width_ok ) + { + decoder->glyph_width = decoder->nominal_width + + ( stack[0] >> 16 ); + + if ( decoder->width_only ) + { + /* we only want the advance width; stop here */ + break; + } + + /* Consumed an argument. */ + num_args--; + } + } + + decoder->read_width = 0; + req_args = 0; + } + + req_args &= 0x000F; + if ( num_args < req_args ) + goto Stack_Underflow; + args -= req_args; + num_args -= req_args; + + /* At this point, `args' points to the first argument of the */ + /* operand in case `req_args' isn't zero. Otherwise, we have */ + /* to adjust `args' manually. */ + + /* Note that we only pop arguments from the stack which we */ + /* really need and can digest so that we can continue in case */ + /* of superfluous stack elements. */ + + switch ( op ) + { + case cff_op_hstem: + case cff_op_vstem: + case cff_op_hstemhm: + case cff_op_vstemhm: + /* the number of arguments is always even here */ + FT_TRACE4(( + op == cff_op_hstem ? " hstem\n" : + ( op == cff_op_vstem ? " vstem\n" : + ( op == cff_op_hstemhm ? " hstemhm\n" : " vstemhm\n" ) ) )); + + if ( hinter ) + hinter->stems( hinter->hints, + ( op == cff_op_hstem || op == cff_op_hstemhm ), + num_args / 2, + args - ( num_args & ~1 ) ); + + decoder->num_hints += num_args / 2; + args = stack; + break; + + case cff_op_hintmask: + case cff_op_cntrmask: + FT_TRACE4(( op == cff_op_hintmask ? " hintmask" : " cntrmask" )); + + /* implement vstem when needed -- */ + /* the specification doesn't say it, but this also works */ + /* with the 'cntrmask' operator */ + /* */ + if ( num_args > 0 ) + { + if ( hinter ) + hinter->stems( hinter->hints, + 0, + num_args / 2, + args - ( num_args & ~1 ) ); + + decoder->num_hints += num_args / 2; + } + + /* In a valid charstring there must be at least one byte */ + /* after `hintmask' or `cntrmask' (e.g., for a `return' */ + /* instruction). Additionally, there must be space for */ + /* `num_hints' bits. */ + + if ( ( ip + ( ( decoder->num_hints + 7 ) >> 3 ) ) >= limit ) + goto Syntax_Error; + + if ( hinter ) + { + if ( op == cff_op_hintmask ) + hinter->hintmask( hinter->hints, + (FT_UInt)builder->current->n_points, + (FT_UInt)decoder->num_hints, + ip ); + else + hinter->counter( hinter->hints, + (FT_UInt)decoder->num_hints, + ip ); + } + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_UInt maskbyte; + + + FT_TRACE4(( " (maskbytes:" )); + + for ( maskbyte = 0; + maskbyte < (FT_UInt)( ( decoder->num_hints + 7 ) >> 3 ); + maskbyte++, ip++ ) + FT_TRACE4(( " 0x%02X", *ip )); + + FT_TRACE4(( ")\n" )); + } +#else + ip += ( decoder->num_hints + 7 ) >> 3; +#endif + args = stack; + break; + + case cff_op_rmoveto: + FT_TRACE4(( " rmoveto\n" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + x = ADD_LONG( x, args[-2] ); + y = ADD_LONG( y, args[-1] ); + args = stack; + break; + + case cff_op_vmoveto: + FT_TRACE4(( " vmoveto\n" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + y = ADD_LONG( y, args[-1] ); + args = stack; + break; + + case cff_op_hmoveto: + FT_TRACE4(( " hmoveto\n" )); + + cff_builder_close_contour( builder ); + builder->path_begun = 0; + x = ADD_LONG( x, args[-1] ); + args = stack; + break; + + case cff_op_rlineto: + FT_TRACE4(( " rlineto\n" )); + + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, num_args / 2 ) ) + goto Fail; + + if ( num_args < 2 ) + goto Stack_Underflow; + + args -= num_args & ~1; + while ( args < decoder->top ) + { + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, 1 ); + args += 2; + } + args = stack; + break; + + case cff_op_hlineto: + case cff_op_vlineto: + { + FT_Int phase = ( op == cff_op_hlineto ); + + + FT_TRACE4(( op == cff_op_hlineto ? " hlineto\n" + : " vlineto\n" )); + + if ( num_args < 0 ) + goto Stack_Underflow; + + /* there exist subsetted fonts (found in PDFs) */ + /* which call `hlineto' without arguments */ + if ( num_args == 0 ) + break; + + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, num_args ) ) + goto Fail; + + args = stack; + while ( args < decoder->top ) + { + if ( phase ) + x = ADD_LONG( x, args[0] ); + else + y = ADD_LONG( y, args[0] ); + + if ( cff_builder_add_point1( builder, x, y ) ) + goto Fail; + + args++; + phase ^= 1; + } + args = stack; + } + break; + + case cff_op_rrcurveto: + { + FT_Int nargs; + + + FT_TRACE4(( " rrcurveto\n" )); + + if ( num_args < 6 ) + goto Stack_Underflow; + + nargs = num_args - num_args % 6; + + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, nargs / 2 ) ) + goto Fail; + + args -= nargs; + while ( args < decoder->top ) + { + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[2] ); + y = ADD_LONG( y, args[3] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[4] ); + y = ADD_LONG( y, args[5] ); + cff_builder_add_point( builder, x, y, 1 ); + + args += 6; + } + args = stack; + } + break; + + case cff_op_vvcurveto: + { + FT_Int nargs; + + + FT_TRACE4(( " vvcurveto\n" )); + + if ( num_args < 4 ) + goto Stack_Underflow; + + /* if num_args isn't of the form 4n or 4n+1, */ + /* we enforce it by clearing the second bit */ + + nargs = num_args & ~2; + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + args -= nargs; + + if ( nargs & 1 ) + { + x = ADD_LONG( x, args[0] ); + args++; + nargs--; + } + + if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) ) + goto Fail; + + while ( args < decoder->top ) + { + y = ADD_LONG( y, args[0] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[1] ); + y = ADD_LONG( y, args[2] ); + cff_builder_add_point( builder, x, y, 0 ); + + y = ADD_LONG( y, args[3] ); + cff_builder_add_point( builder, x, y, 1 ); + + args += 4; + } + args = stack; + } + break; + + case cff_op_hhcurveto: + { + FT_Int nargs; + + + FT_TRACE4(( " hhcurveto\n" )); + + if ( num_args < 4 ) + goto Stack_Underflow; + + /* if num_args isn't of the form 4n or 4n+1, */ + /* we enforce it by clearing the second bit */ + + nargs = num_args & ~2; + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + args -= nargs; + if ( nargs & 1 ) + { + y = ADD_LONG( y, args[0] ); + args++; + nargs--; + } + + if ( cff_check_points( builder, 3 * ( nargs / 4 ) ) ) + goto Fail; + + while ( args < decoder->top ) + { + x = ADD_LONG( x, args[0] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[1] ); + y = ADD_LONG( y, args[2] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[3] ); + cff_builder_add_point( builder, x, y, 1 ); + + args += 4; + } + args = stack; + } + break; + + case cff_op_vhcurveto: + case cff_op_hvcurveto: + { + FT_Int phase; + FT_Int nargs; + + + FT_TRACE4(( op == cff_op_vhcurveto ? " vhcurveto\n" + : " hvcurveto\n" )); + + if ( cff_builder_start_point( builder, x, y ) ) + goto Fail; + + if ( num_args < 4 ) + goto Stack_Underflow; + + /* if num_args isn't of the form 8n, 8n+1, 8n+4, or 8n+5, */ + /* we enforce it by clearing the second bit */ + + nargs = num_args & ~2; + + args -= nargs; + if ( cff_check_points( builder, ( nargs / 4 ) * 3 ) ) + goto Stack_Underflow; + + phase = ( op == cff_op_hvcurveto ); + + while ( nargs >= 4 ) + { + nargs -= 4; + if ( phase ) + { + x = ADD_LONG( x, args[0] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[1] ); + y = ADD_LONG( y, args[2] ); + cff_builder_add_point( builder, x, y, 0 ); + + y = ADD_LONG( y, args[3] ); + if ( nargs == 1 ) + x = ADD_LONG( x, args[4] ); + cff_builder_add_point( builder, x, y, 1 ); + } + else + { + y = ADD_LONG( y, args[0] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[1] ); + y = ADD_LONG( y, args[2] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[3] ); + if ( nargs == 1 ) + y = ADD_LONG( y, args[4] ); + cff_builder_add_point( builder, x, y, 1 ); + } + args += 4; + phase ^= 1; + } + args = stack; + } + break; + + case cff_op_rlinecurve: + { + FT_Int num_lines; + FT_Int nargs; + + + FT_TRACE4(( " rlinecurve\n" )); + + if ( num_args < 8 ) + goto Stack_Underflow; + + nargs = num_args & ~1; + num_lines = ( nargs - 6 ) / 2; + + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, num_lines + 3 ) ) + goto Fail; + + args -= nargs; + + /* first, add the line segments */ + while ( num_lines > 0 ) + { + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, 1 ); + + args += 2; + num_lines--; + } + + /* then the curve */ + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[2] ); + y = ADD_LONG( y, args[3] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[4] ); + y = ADD_LONG( y, args[5] ); + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + } + break; + + case cff_op_rcurveline: + { + FT_Int num_curves; + FT_Int nargs; + + + FT_TRACE4(( " rcurveline\n" )); + + if ( num_args < 8 ) + goto Stack_Underflow; + + nargs = num_args - 2; + nargs = nargs - nargs % 6 + 2; + num_curves = ( nargs - 2 ) / 6; + + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, num_curves * 3 + 2 ) ) + goto Fail; + + args -= nargs; + + /* first, add the curves */ + while ( num_curves > 0 ) + { + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[2] ); + y = ADD_LONG( y, args[3] ); + cff_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, args[4] ); + y = ADD_LONG( y, args[5] ); + cff_builder_add_point( builder, x, y, 1 ); + + args += 6; + num_curves--; + } + + /* then the final line */ + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + } + break; + + case cff_op_hflex1: + { + FT_Pos start_y; + + + FT_TRACE4(( " hflex1\n" )); + + /* adding five more points: 4 control points, 1 on-curve point */ + /* -- make sure we have enough space for the start point if it */ + /* needs to be added */ + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, 6 ) ) + goto Fail; + + /* record the starting point's y position for later use */ + start_y = y; + + /* first control point */ + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, 0 ); + + /* second control point */ + x = ADD_LONG( x, args[2] ); + y = ADD_LONG( y, args[3] ); + cff_builder_add_point( builder, x, y, 0 ); + + /* join point; on curve, with y-value the same as the last */ + /* control point's y-value */ + x = ADD_LONG( x, args[4] ); + cff_builder_add_point( builder, x, y, 1 ); + + /* third control point, with y-value the same as the join */ + /* point's y-value */ + x = ADD_LONG( x, args[5] ); + cff_builder_add_point( builder, x, y, 0 ); + + /* fourth control point */ + x = ADD_LONG( x, args[6] ); + y = ADD_LONG( y, args[7] ); + cff_builder_add_point( builder, x, y, 0 ); + + /* ending point, with y-value the same as the start */ + x = ADD_LONG( x, args[8] ); + y = start_y; + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case cff_op_hflex: + { + FT_Pos start_y; + + + FT_TRACE4(( " hflex\n" )); + + /* adding six more points; 4 control points, 2 on-curve points */ + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, 6 ) ) + goto Fail; + + /* record the starting point's y-position for later use */ + start_y = y; + + /* first control point */ + x = ADD_LONG( x, args[0] ); + cff_builder_add_point( builder, x, y, 0 ); + + /* second control point */ + x = ADD_LONG( x, args[1] ); + y = ADD_LONG( y, args[2] ); + cff_builder_add_point( builder, x, y, 0 ); + + /* join point; on curve, with y-value the same as the last */ + /* control point's y-value */ + x = ADD_LONG( x, args[3] ); + cff_builder_add_point( builder, x, y, 1 ); + + /* third control point, with y-value the same as the join */ + /* point's y-value */ + x = ADD_LONG( x, args[4] ); + cff_builder_add_point( builder, x, y, 0 ); + + /* fourth control point */ + x = ADD_LONG( x, args[5] ); + y = start_y; + cff_builder_add_point( builder, x, y, 0 ); + + /* ending point, with y-value the same as the start point's */ + /* y-value -- we don't add this point, though */ + x = ADD_LONG( x, args[6] ); + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case cff_op_flex1: + { + FT_Pos start_x, start_y; /* record start x, y values for */ + /* alter use */ + FT_Fixed dx = 0, dy = 0; /* used in horizontal/vertical */ + /* algorithm below */ + FT_Int horizontal, count; + FT_Fixed* temp; + + + FT_TRACE4(( " flex1\n" )); + + /* adding six more points; 4 control points, 2 on-curve points */ + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, 6 ) ) + goto Fail; + + /* record the starting point's x, y position for later use */ + start_x = x; + start_y = y; + + /* XXX: figure out whether this is supposed to be a horizontal */ + /* or vertical flex; the Type 2 specification is vague... */ + + temp = args; + + /* grab up to the last argument */ + for ( count = 5; count > 0; count-- ) + { + dx = ADD_LONG( dx, temp[0] ); + dy = ADD_LONG( dy, temp[1] ); + temp += 2; + } + + if ( dx < 0 ) + dx = -dx; + if ( dy < 0 ) + dy = -dy; + + /* strange test, but here it is... */ + horizontal = ( dx > dy ); + + for ( count = 5; count > 0; count-- ) + { + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, + (FT_Bool)( count == 3 ) ); + args += 2; + } + + /* is last operand an x- or y-delta? */ + if ( horizontal ) + { + x = ADD_LONG( x, args[0] ); + y = start_y; + } + else + { + x = start_x; + y = ADD_LONG( y, args[0] ); + } + + cff_builder_add_point( builder, x, y, 1 ); + + args = stack; + break; + } + + case cff_op_flex: + { + FT_UInt count; + + + FT_TRACE4(( " flex\n" )); + + if ( cff_builder_start_point( builder, x, y ) || + cff_check_points( builder, 6 ) ) + goto Fail; + + for ( count = 6; count > 0; count-- ) + { + x = ADD_LONG( x, args[0] ); + y = ADD_LONG( y, args[1] ); + cff_builder_add_point( builder, x, y, + (FT_Bool)( count == 4 || count == 1 ) ); + args += 2; + } + + args = stack; + } + break; + + case cff_op_seac: + FT_TRACE4(( " seac\n" )); + + error = cff_operator_seac( decoder, + args[0], args[1], args[2], + (FT_Int)( args[3] >> 16 ), + (FT_Int)( args[4] >> 16 ) ); + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + + /* return now! */ + FT_TRACE4(( "\n" )); + return error; + + case cff_op_endchar: + /* in dictionaries, `endchar' simply indicates end of data */ + if ( in_dict ) + return error; + + FT_TRACE4(( " endchar\n" )); + + /* We are going to emulate the seac operator. */ + if ( num_args >= 4 ) + { + /* Save glyph width so that the subglyphs don't overwrite it. */ + FT_Pos glyph_width = decoder->glyph_width; + + + error = cff_operator_seac( decoder, + 0L, args[-4], args[-3], + (FT_Int)( args[-2] >> 16 ), + (FT_Int)( args[-1] >> 16 ) ); + + decoder->glyph_width = glyph_width; + } + else + { + cff_builder_close_contour( builder ); + + /* close hints recording session */ + if ( hinter ) + { + if ( hinter->close( hinter->hints, + (FT_UInt)builder->current->n_points ) ) + goto Syntax_Error; + + /* apply hints to the loaded glyph outline now */ + error = hinter->apply( hinter->hints, + builder->current, + (PSH_Globals)builder->hints_globals, + decoder->hint_mode ); + if ( error ) + goto Fail; + } + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + } + + /* return now! */ + FT_TRACE4(( "\n" )); + return error; + + case cff_op_abs: + FT_TRACE4(( " abs\n" )); + + if ( args[0] < 0 ) + { + if ( args[0] == FT_LONG_MIN ) + args[0] = FT_LONG_MAX; + else + args[0] = -args[0]; + } + args++; + break; + + case cff_op_add: + FT_TRACE4(( " add\n" )); + + args[0] = ADD_LONG( args[0], args[1] ); + args++; + break; + + case cff_op_sub: + FT_TRACE4(( " sub\n" )); + + args[0] = SUB_LONG( args[0], args[1] ); + args++; + break; + + case cff_op_div: + FT_TRACE4(( " div\n" )); + + args[0] = FT_DivFix( args[0], args[1] ); + args++; + break; + + case cff_op_neg: + FT_TRACE4(( " neg\n" )); + + if ( args[0] == FT_LONG_MIN ) + args[0] = FT_LONG_MAX; + args[0] = -args[0]; + args++; + break; + + case cff_op_random: + FT_TRACE4(( " random\n" )); + + /* only use the lower 16 bits of `random' */ + /* to generate a number in the range (0;1] */ + args[0] = (FT_Fixed) + ( ( decoder->current_subfont->random & 0xFFFF ) + 1 ); + args++; + + decoder->current_subfont->random = + cff_random( decoder->current_subfont->random ); + break; + + case cff_op_mul: + FT_TRACE4(( " mul\n" )); + + args[0] = FT_MulFix( args[0], args[1] ); + args++; + break; + + case cff_op_sqrt: + FT_TRACE4(( " sqrt\n" )); + + if ( args[0] > 0 ) + { + FT_Fixed root = args[0]; + FT_Fixed new_root; + + + for (;;) + { + new_root = ( root + FT_DivFix( args[0], root ) + 1 ) >> 1; + if ( new_root == root ) + break; + root = new_root; + } + args[0] = new_root; + } + else + args[0] = 0; + args++; + break; + + case cff_op_drop: + /* nothing */ + FT_TRACE4(( " drop\n" )); + + break; + + case cff_op_exch: + { + FT_Fixed tmp; + + + FT_TRACE4(( " exch\n" )); + + tmp = args[0]; + args[0] = args[1]; + args[1] = tmp; + args += 2; + } + break; + + case cff_op_index: + { + FT_Int idx = (FT_Int)( args[0] >> 16 ); + + + FT_TRACE4(( " index\n" )); + + if ( idx < 0 ) + idx = 0; + else if ( idx > num_args - 2 ) + idx = num_args - 2; + args[0] = args[-( idx + 1 )]; + args++; + } + break; + + case cff_op_roll: + { + FT_Int count = (FT_Int)( args[0] >> 16 ); + FT_Int idx = (FT_Int)( args[1] >> 16 ); + + + FT_TRACE4(( " roll\n" )); + + if ( count <= 0 ) + count = 1; + + args -= count; + if ( args < stack ) + goto Stack_Underflow; + + if ( idx >= 0 ) + { + while ( idx > 0 ) + { + FT_Fixed tmp = args[count - 1]; + FT_Int i; + + + for ( i = count - 2; i >= 0; i-- ) + args[i + 1] = args[i]; + args[0] = tmp; + idx--; + } + } + else + { + while ( idx < 0 ) + { + FT_Fixed tmp = args[0]; + FT_Int i; + + + for ( i = 0; i < count - 1; i++ ) + args[i] = args[i + 1]; + args[count - 1] = tmp; + idx++; + } + } + args += count; + } + break; + + case cff_op_dup: + FT_TRACE4(( " dup\n" )); + + args[1] = args[0]; + args += 2; + break; + + case cff_op_put: + { + FT_Fixed val = args[0]; + FT_Int idx = (FT_Int)( args[1] >> 16 ); + + + FT_TRACE4(( " put\n" )); + + /* the Type2 specification before version 16-March-2000 */ + /* didn't give a hard-coded size limit of the temporary */ + /* storage array; instead, an argument of the */ + /* `MultipleMaster' operator set the size */ + if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS ) + decoder->buildchar[idx] = val; + } + break; + + case cff_op_get: + { + FT_Int idx = (FT_Int)( args[0] >> 16 ); + FT_Fixed val = 0; + + + FT_TRACE4(( " get\n" )); + + if ( idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS ) + val = decoder->buildchar[idx]; + + args[0] = val; + args++; + } + break; + + case cff_op_store: + /* this operator was removed from the Type2 specification */ + /* in version 16-March-2000 */ + + /* since we currently don't handle interpolation of multiple */ + /* master fonts, this is a no-op */ + FT_TRACE4(( " store\n" )); + break; + + case cff_op_load: + /* this operator was removed from the Type2 specification */ + /* in version 16-March-2000 */ + { + FT_Int reg_idx = (FT_Int)args[0]; + FT_Int idx = (FT_Int)args[1]; + FT_Int count = (FT_Int)args[2]; + + + FT_TRACE4(( " load\n" )); + + /* since we currently don't handle interpolation of multiple */ + /* master fonts, we store a vector [1 0 0 ...] in the */ + /* temporary storage array regardless of the Registry index */ + if ( reg_idx >= 0 && reg_idx <= 2 && + idx >= 0 && idx < CFF_MAX_TRANS_ELEMENTS && + count >= 0 && count <= num_axes ) + { + FT_Int end, i; + + + end = FT_MIN( idx + count, CFF_MAX_TRANS_ELEMENTS ); + + if ( idx < end ) + decoder->buildchar[idx] = 1 << 16; + + for ( i = idx + 1; i < end; i++ ) + decoder->buildchar[i] = 0; + } + } + break; + + case cff_op_blend: + /* this operator was removed from the Type2 specification */ + /* in version 16-March-2000 */ + { + FT_Int num_results = (FT_Int)( args[0] >> 16 ); + + + FT_TRACE4(( " blend\n" )); + + if ( num_results < 0 ) + goto Syntax_Error; + + if ( num_results * (FT_Int)num_designs > num_args ) + goto Stack_Underflow; + + /* since we currently don't handle interpolation of multiple */ + /* master fonts, return the `num_results' values of the */ + /* first master */ + args -= num_results * ( num_designs - 1 ); + num_args -= num_results * ( num_designs - 1 ); + } + break; + + case cff_op_dotsection: + /* this operator is deprecated and ignored by the parser */ + FT_TRACE4(( " dotsection\n" )); + break; + + case cff_op_closepath: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " closepath (invalid op)\n" )); + + args = stack; + break; + + case cff_op_hsbw: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " hsbw (invalid op)\n" )); + + decoder->glyph_width = + ADD_LONG( decoder->nominal_width, ( args[1] >> 16 ) ); + + decoder->builder.left_bearing.x = args[0]; + decoder->builder.left_bearing.y = 0; + + x = ADD_LONG( decoder->builder.pos_x, args[0] ); + y = decoder->builder.pos_y; + args = stack; + break; + + case cff_op_sbw: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " sbw (invalid op)\n" )); + + decoder->glyph_width = + ADD_LONG( decoder->nominal_width, ( args[2] >> 16 ) ); + + decoder->builder.left_bearing.x = args[0]; + decoder->builder.left_bearing.y = args[1]; + + x = ADD_LONG( decoder->builder.pos_x, args[0] ); + y = ADD_LONG( decoder->builder.pos_y, args[1] ); + args = stack; + break; + + case cff_op_setcurrentpoint: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " setcurrentpoint (invalid op)\n" )); + + x = ADD_LONG( decoder->builder.pos_x, args[0] ); + y = ADD_LONG( decoder->builder.pos_y, args[1] ); + args = stack; + break; + + case cff_op_callothersubr: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " callothersubr (invalid op)\n" )); + + /* subsequent `pop' operands should add the arguments, */ + /* this is the implementation described for `unknown' other */ + /* subroutines in the Type1 spec. */ + /* */ + /* XXX Fix return arguments (see discussion below). */ + args -= 2 + ( args[-2] >> 16 ); + if ( args < stack ) + goto Stack_Underflow; + break; + + case cff_op_pop: + /* this is an invalid Type 2 operator; however, there */ + /* exist fonts which are incorrectly converted from probably */ + /* Type 1 to CFF, and some parsers seem to accept it */ + + FT_TRACE4(( " pop (invalid op)\n" )); + + /* XXX Increasing `args' is wrong: After a certain number of */ + /* `pop's we get a stack overflow. Reason for doing it is */ + /* code like this (actually found in a CFF font): */ + /* */ + /* 17 1 3 callothersubr */ + /* pop */ + /* callsubr */ + /* */ + /* Since we handle `callothersubr' as a no-op, and */ + /* `callsubr' needs at least one argument, `pop' can't be a */ + /* no-op too as it basically should be. */ + /* */ + /* The right solution would be to provide real support for */ + /* `callothersubr' as done in `t1decode.c', however, given */ + /* the fact that CFF fonts with `pop' are invalid, it is */ + /* questionable whether it is worth the time. */ + args++; + break; + + case cff_op_and: + { + FT_Fixed cond = ( args[0] && args[1] ); + + + FT_TRACE4(( " and\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_or: + { + FT_Fixed cond = ( args[0] || args[1] ); + + + FT_TRACE4(( " or\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_not: + { + FT_Fixed cond = !args[0]; + + + FT_TRACE4(( " not\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_eq: + { + FT_Fixed cond = ( args[0] == args[1] ); + + + FT_TRACE4(( " eq\n" )); + + args[0] = cond ? 0x10000L : 0; + args++; + } + break; + + case cff_op_ifelse: + { + FT_Fixed cond = ( args[2] <= args[3] ); + + + FT_TRACE4(( " ifelse\n" )); + + if ( !cond ) + args[0] = args[1]; + args++; + } + break; + + case cff_op_callsubr: + { + FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) + + decoder->locals_bias ); + + + FT_TRACE4(( " callsubr (idx %d, entering level %d)\n", + idx, + zone - decoder->zones + 1 )); + + if ( idx >= decoder->num_locals ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invalid local subr index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + zone->base = decoder->locals[idx]; + zone->limit = decoder->locals[idx + 1]; + zone->cursor = zone->base; + + if ( !zone->base || zone->limit == zone->base ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invoking empty subrs\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + } + break; + + case cff_op_callgsubr: + { + FT_UInt idx = (FT_UInt)( ( args[0] >> 16 ) + + decoder->globals_bias ); + + + FT_TRACE4(( " callgsubr (idx %d, entering level %d)\n", + idx, + zone - decoder->zones + 1 )); + + if ( idx >= decoder->num_globals ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invalid global subr index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= CFF_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + zone->base = decoder->globals[idx]; + zone->limit = decoder->globals[idx + 1]; + zone->cursor = zone->base; + + if ( !zone->base || zone->limit == zone->base ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " invoking empty subrs\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + } + break; + + case cff_op_return: + FT_TRACE4(( " return (leaving level %d)\n", + decoder->zone - decoder->zones )); + + if ( decoder->zone <= decoder->zones ) + { + FT_ERROR(( "cff_decoder_parse_charstrings:" + " unexpected return\n" )); + goto Syntax_Error; + } + + decoder->zone--; + zone = decoder->zone; + ip = zone->cursor; + limit = zone->limit; + break; + + default: + FT_ERROR(( "Unimplemented opcode: %d", ip[-1] )); + + if ( ip[-1] == 12 ) + FT_ERROR(( " %d", ip[0] )); + FT_ERROR(( "\n" )); + + return FT_THROW( Unimplemented_Feature ); + } + + decoder->top = args; + + if ( decoder->top - stack >= CFF_MAX_OPERANDS ) + goto Stack_Overflow; + + } /* general operator processing */ + + } /* while ip < limit */ + + FT_TRACE4(( "..end..\n\n" )); + + Fail: + return error; + + MM_Error: + FT_TRACE4(( "cff_decoder_parse_charstrings:" + " invalid opcode found in top DICT charstring\n")); + return FT_THROW( Invalid_File_Format ); + + Syntax_Error: + FT_TRACE4(( "cff_decoder_parse_charstrings: syntax error\n" )); + return FT_THROW( Invalid_File_Format ); + + Stack_Underflow: + FT_TRACE4(( "cff_decoder_parse_charstrings: stack underflow\n" )); + return FT_THROW( Too_Few_Arguments ); + + Stack_Overflow: + FT_TRACE4(( "cff_decoder_parse_charstrings: stack overflow\n" )); + return FT_THROW( Stack_Overflow ); + } + +#endif /* CFF_CONFIG_OPTION_OLD_ENGINE */ + + + /*************************************************************************/ + /* */ + /* */ + /* cff_decoder_init */ + /* */ + /* */ + /* Initializes a given glyph decoder. */ + /* */ + /* */ + /* decoder :: A pointer to the glyph builder to initialize. */ + /* */ + /* */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* slot :: The current glyph object. */ + /* */ + /* hinting :: Whether hinting is active. */ + /* */ + /* hint_mode :: The hinting mode. */ + /* */ + FT_LOCAL_DEF( void ) + cff_decoder_init( CFF_Decoder* decoder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot slot, + FT_Bool hinting, + FT_Render_Mode hint_mode, + CFF_Decoder_Get_Glyph_Callback get_callback, + CFF_Decoder_Free_Glyph_Callback free_callback ) + { + CFF_Font cff = (CFF_Font)face->extra.data; + + + /* clear everything */ + FT_ZERO( decoder ); + + /* initialize builder */ + cff_builder_init( &decoder->builder, face, size, slot, hinting ); + + /* initialize Type2 decoder */ + decoder->cff = cff; + decoder->num_globals = cff->global_subrs_index.count; + decoder->globals = cff->global_subrs; + decoder->globals_bias = cff_compute_bias( + cff->top_font.font_dict.charstring_type, + decoder->num_globals ); + + decoder->hint_mode = hint_mode; + + decoder->get_glyph_callback = get_callback; + decoder->free_glyph_callback = free_callback; + } + + + /* this function is used to select the subfont */ + /* and the locals subrs array */ + FT_LOCAL_DEF( FT_Error ) + cff_decoder_prepare( CFF_Decoder* decoder, + CFF_Size size, + FT_UInt glyph_index ) + { + CFF_Builder *builder = &decoder->builder; + CFF_Font cff = (CFF_Font)builder->face->extra.data; + CFF_SubFont sub = &cff->top_font; + FT_Error error = FT_Err_Ok; + + FT_Service_CFFLoad cffload = (FT_Service_CFFLoad)cff->cffload; + + + /* manage CID fonts */ + if ( cff->num_subfonts ) + { + FT_Byte fd_index = cffload->fd_select_get( &cff->fd_select, + glyph_index ); + + + if ( fd_index >= cff->num_subfonts ) + { + FT_TRACE4(( "cff_decoder_prepare: invalid CID subfont index\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + FT_TRACE3(( " in subfont %d:\n", fd_index )); + + sub = cff->subfonts[fd_index]; + + if ( builder->hints_funcs && size ) + { + FT_Size ftsize = FT_SIZE( size ); + CFF_Internal internal = (CFF_Internal)ftsize->internal->module_data; + + + /* for CFFs without subfonts, this value has already been set */ + builder->hints_globals = (void *)internal->subfonts[fd_index]; + } + } + + decoder->num_locals = sub->local_subrs_index.count; + decoder->locals = sub->local_subrs; + decoder->locals_bias = cff_compute_bias( + decoder->cff->top_font.font_dict.charstring_type, + decoder->num_locals ); + + decoder->glyph_width = sub->private_dict.default_width; + decoder->nominal_width = sub->private_dict.nominal_width; + + decoder->current_subfont = sub; + + Exit: + return error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/cffdecode.h b/vendor/FreeType2/src/psaux/cffdecode.h new file mode 100644 index 0000000..0d4f5fe --- /dev/null +++ b/vendor/FreeType2/src/psaux/cffdecode.h @@ -0,0 +1,64 @@ +/***************************************************************************/ +/* */ +/* cffdecode.h */ +/* */ +/* PostScript CFF (Type 2) decoding routines (specification). */ +/* */ +/* Copyright 2017-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef CFFDECODE_H_ +#define CFFDECODE_H_ + + +#include +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + +FT_BEGIN_HEADER + + FT_LOCAL( void ) + cff_decoder_init( CFF_Decoder* decoder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot slot, + FT_Bool hinting, + FT_Render_Mode hint_mode, + CFF_Decoder_Get_Glyph_Callback get_callback, + CFF_Decoder_Free_Glyph_Callback free_callback ); + + FT_LOCAL( FT_Error ) + cff_decoder_prepare( CFF_Decoder* decoder, + CFF_Size size, + FT_UInt glyph_index ); + + + FT_LOCAL( FT_Int ) + cff_lookup_glyph_by_stdcharcode( CFF_Font cff, + FT_Int charcode ); + + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + FT_LOCAL( FT_Error ) + cff_decoder_parse_charstrings( CFF_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len, + FT_Bool in_dict ); +#endif + + +FT_END_HEADER + +#endif + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psarrst.c b/vendor/FreeType2/src/psaux/psarrst.c new file mode 100644 index 0000000..a878094 --- /dev/null +++ b/vendor/FreeType2/src/psaux/psarrst.c @@ -0,0 +1,241 @@ +/***************************************************************************/ +/* */ +/* psarrst.c */ +/* */ +/* Adobe's code for Array Stacks (body). */ +/* */ +/* Copyright 2007-2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#include "psft.h" +#include FT_INTERNAL_DEBUG_H + +#include "psglue.h" +#include "psarrst.h" + +#include "pserror.h" + + + /* + * CF2_ArrStack uses an error pointer, to enable shared errors. + * Shared errors are necessary when multiple objects allow the program + * to continue after detecting errors. Only the first error should be + * recorded. + */ + + FT_LOCAL_DEF( void ) + cf2_arrstack_init( CF2_ArrStack arrstack, + FT_Memory memory, + FT_Error* error, + size_t sizeItem ) + { + FT_ASSERT( arrstack ); + + /* initialize the structure */ + arrstack->memory = memory; + arrstack->error = error; + arrstack->sizeItem = sizeItem; + arrstack->allocated = 0; + arrstack->chunk = 10; /* chunks of 10 items */ + arrstack->count = 0; + arrstack->totalSize = 0; + arrstack->ptr = NULL; + } + + + FT_LOCAL_DEF( void ) + cf2_arrstack_finalize( CF2_ArrStack arrstack ) + { + FT_Memory memory = arrstack->memory; /* for FT_FREE */ + + + FT_ASSERT( arrstack ); + + arrstack->allocated = 0; + arrstack->count = 0; + arrstack->totalSize = 0; + + /* free the data buffer */ + FT_FREE( arrstack->ptr ); + } + + + /* allocate or reallocate the buffer size; */ + /* return false on memory error */ + static FT_Bool + cf2_arrstack_setNumElements( CF2_ArrStack arrstack, + size_t numElements ) + { + FT_ASSERT( arrstack ); + + { + FT_Error error = FT_Err_Ok; /* for FT_REALLOC */ + FT_Memory memory = arrstack->memory; /* for FT_REALLOC */ + + size_t newSize = numElements * arrstack->sizeItem; + + + if ( numElements > FT_LONG_MAX / arrstack->sizeItem ) + goto exit; + + + FT_ASSERT( newSize > 0 ); /* avoid realloc with zero size */ + + if ( !FT_REALLOC( arrstack->ptr, arrstack->totalSize, newSize ) ) + { + arrstack->allocated = numElements; + arrstack->totalSize = newSize; + + if ( arrstack->count > numElements ) + { + /* we truncated the list! */ + CF2_SET_ERROR( arrstack->error, Stack_Overflow ); + arrstack->count = numElements; + return FALSE; + } + + return TRUE; /* success */ + } + } + + exit: + /* if there's not already an error, store this one */ + CF2_SET_ERROR( arrstack->error, Out_Of_Memory ); + + return FALSE; + } + + + /* set the count, ensuring allocation is sufficient */ + FT_LOCAL_DEF( void ) + cf2_arrstack_setCount( CF2_ArrStack arrstack, + size_t numElements ) + { + FT_ASSERT( arrstack ); + + if ( numElements > arrstack->allocated ) + { + /* expand the allocation first */ + if ( !cf2_arrstack_setNumElements( arrstack, numElements ) ) + return; + } + + arrstack->count = numElements; + } + + + /* clear the count */ + FT_LOCAL_DEF( void ) + cf2_arrstack_clear( CF2_ArrStack arrstack ) + { + FT_ASSERT( arrstack ); + + arrstack->count = 0; + } + + + /* current number of items */ + FT_LOCAL_DEF( size_t ) + cf2_arrstack_size( const CF2_ArrStack arrstack ) + { + FT_ASSERT( arrstack ); + + return arrstack->count; + } + + + FT_LOCAL_DEF( void* ) + cf2_arrstack_getBuffer( const CF2_ArrStack arrstack ) + { + FT_ASSERT( arrstack ); + + return arrstack->ptr; + } + + + /* return pointer to the given element */ + FT_LOCAL_DEF( void* ) + cf2_arrstack_getPointer( const CF2_ArrStack arrstack, + size_t idx ) + { + void* newPtr; + + + FT_ASSERT( arrstack ); + + if ( idx >= arrstack->count ) + { + /* overflow */ + CF2_SET_ERROR( arrstack->error, Stack_Overflow ); + idx = 0; /* choose safe default */ + } + + newPtr = (FT_Byte*)arrstack->ptr + idx * arrstack->sizeItem; + + return newPtr; + } + + + /* push (append) an element at the end of the list; */ + /* return false on memory error */ + /* TODO: should there be a length param for extra checking? */ + FT_LOCAL_DEF( void ) + cf2_arrstack_push( CF2_ArrStack arrstack, + const void* ptr ) + { + FT_ASSERT( arrstack ); + + if ( arrstack->count == arrstack->allocated ) + { + /* grow the buffer by one chunk */ + if ( !cf2_arrstack_setNumElements( + arrstack, arrstack->allocated + arrstack->chunk ) ) + { + /* on error, ignore the push */ + return; + } + } + + FT_ASSERT( ptr ); + + { + size_t offset = arrstack->count * arrstack->sizeItem; + void* newPtr = (FT_Byte*)arrstack->ptr + offset; + + + FT_MEM_COPY( newPtr, ptr, arrstack->sizeItem ); + arrstack->count += 1; + } + } + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psarrst.h b/vendor/FreeType2/src/psaux/psarrst.h new file mode 100644 index 0000000..b3568eb --- /dev/null +++ b/vendor/FreeType2/src/psaux/psarrst.h @@ -0,0 +1,100 @@ +/***************************************************************************/ +/* */ +/* psarrst.h */ +/* */ +/* Adobe's code for Array Stacks (specification). */ +/* */ +/* Copyright 2007-2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#ifndef PSARRST_H_ +#define PSARRST_H_ + + +#include "pserror.h" + + +FT_BEGIN_HEADER + + + /* need to define the struct here (not opaque) so it can be allocated by */ + /* clients */ + typedef struct CF2_ArrStackRec_ + { + FT_Memory memory; + FT_Error* error; + + size_t sizeItem; /* bytes per element */ + size_t allocated; /* items allocated */ + size_t chunk; /* allocation increment in items */ + size_t count; /* number of elements allocated */ + size_t totalSize; /* total bytes allocated */ + + void* ptr; /* ptr to data */ + + } CF2_ArrStackRec, *CF2_ArrStack; + + + FT_LOCAL( void ) + cf2_arrstack_init( CF2_ArrStack arrstack, + FT_Memory memory, + FT_Error* error, + size_t sizeItem ); + FT_LOCAL( void ) + cf2_arrstack_finalize( CF2_ArrStack arrstack ); + + FT_LOCAL( void ) + cf2_arrstack_setCount( CF2_ArrStack arrstack, + size_t numElements ); + FT_LOCAL( void ) + cf2_arrstack_clear( CF2_ArrStack arrstack ); + FT_LOCAL( size_t ) + cf2_arrstack_size( const CF2_ArrStack arrstack ); + + FT_LOCAL( void* ) + cf2_arrstack_getBuffer( const CF2_ArrStack arrstack ); + FT_LOCAL( void* ) + cf2_arrstack_getPointer( const CF2_ArrStack arrstack, + size_t idx ); + + FT_LOCAL( void ) + cf2_arrstack_push( CF2_ArrStack arrstack, + const void* ptr ); + + +FT_END_HEADER + + +#endif /* PSARRST_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psaux.c b/vendor/FreeType2/src/psaux/psaux.c new file mode 100644 index 0000000..fb447fc --- /dev/null +++ b/vendor/FreeType2/src/psaux/psaux.c @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* psaux.c */ +/* */ +/* FreeType auxiliary PostScript driver component (body only). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT +#include + +#include "afmparse.c" +#include "psauxmod.c" +#include "psconv.c" +#include "psobjs.c" +#include "t1cmap.c" +#include "t1decode.c" +#include "cffdecode.c" + +#include "psarrst.c" +#include "psblues.c" +#include "pserror.c" +#include "psfont.c" +#include "psft.c" +#include "pshints.c" +#include "psintrp.c" +#include "psread.c" +#include "psstack.c" + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psauxerr.h b/vendor/FreeType2/src/psaux/psauxerr.h new file mode 100644 index 0000000..cc33fd2 --- /dev/null +++ b/vendor/FreeType2/src/psaux/psauxerr.h @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* psauxerr.h */ +/* */ +/* PS auxiliary module error codes (specification only). */ +/* */ +/* Copyright 2001-2018 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 file is used to define the PS auxiliary module error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef PSAUXERR_H_ +#define PSAUXERR_H_ + +#include FT_MODULE_ERRORS_H + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX PSaux_Err_ +#define FT_ERR_BASE FT_Mod_Err_PSaux + +#include FT_ERRORS_H + +#endif /* PSAUXERR_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psauxmod.c b/vendor/FreeType2/src/psaux/psauxmod.c new file mode 100644 index 0000000..ee49708 --- /dev/null +++ b/vendor/FreeType2/src/psaux/psauxmod.c @@ -0,0 +1,191 @@ +/***************************************************************************/ +/* */ +/* psauxmod.c */ +/* */ +/* FreeType auxiliary PostScript module implementation (body). */ +/* */ +/* Copyright 2000-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include "psauxmod.h" +#include "psobjs.h" +#include "t1decode.h" +#include "t1cmap.h" +#include "psft.h" +#include "cffdecode.h" + +#ifndef T1_CONFIG_OPTION_NO_AFM +#include "afmparse.h" +#endif + + + FT_CALLBACK_TABLE_DEF + const PS_Table_FuncsRec ps_table_funcs = + { + ps_table_new, /* init */ + ps_table_done, /* done */ + ps_table_add, /* add */ + ps_table_release /* release */ + }; + + + FT_CALLBACK_TABLE_DEF + const PS_Parser_FuncsRec ps_parser_funcs = + { + ps_parser_init, /* init */ + ps_parser_done, /* done */ + + ps_parser_skip_spaces, /* skip_spaces */ + ps_parser_skip_PS_token, /* skip_PS_token */ + + ps_parser_to_int, /* to_int */ + ps_parser_to_fixed, /* to_fixed */ + ps_parser_to_bytes, /* to_bytes */ + ps_parser_to_coord_array, /* to_coord_array */ + ps_parser_to_fixed_array, /* to_fixed_array */ + ps_parser_to_token, /* to_token */ + ps_parser_to_token_array, /* to_token_array */ + + ps_parser_load_field, /* load_field */ + ps_parser_load_field_table /* load_field_table */ + }; + + + FT_CALLBACK_TABLE_DEF + const PS_Builder_FuncsRec ps_builder_funcs = + { + ps_builder_init, /* init */ + ps_builder_done /* done */ + }; + + + FT_CALLBACK_TABLE_DEF + const T1_Builder_FuncsRec t1_builder_funcs = + { + t1_builder_init, /* init */ + t1_builder_done, /* done */ + + t1_builder_check_points, /* check_points */ + t1_builder_add_point, /* add_point */ + t1_builder_add_point1, /* add_point1 */ + t1_builder_add_contour, /* add_contour */ + t1_builder_start_point, /* start_point */ + t1_builder_close_contour /* close_contour */ + }; + + + FT_CALLBACK_TABLE_DEF + const T1_Decoder_FuncsRec t1_decoder_funcs = + { + t1_decoder_init, /* init */ + t1_decoder_done, /* done */ +#ifdef T1_CONFIG_OPTION_OLD_ENGINE + t1_decoder_parse_charstrings, /* parse_charstrings_old */ +#else + t1_decoder_parse_metrics, /* parse_metrics */ +#endif + cf2_decoder_parse_charstrings /* parse_charstrings */ + }; + + +#ifndef T1_CONFIG_OPTION_NO_AFM + FT_CALLBACK_TABLE_DEF + const AFM_Parser_FuncsRec afm_parser_funcs = + { + afm_parser_init, /* init */ + afm_parser_done, /* done */ + afm_parser_parse /* parse */ + }; +#endif + + + FT_CALLBACK_TABLE_DEF + const T1_CMap_ClassesRec t1_cmap_classes = + { + &t1_cmap_standard_class_rec, + &t1_cmap_expert_class_rec, + &t1_cmap_custom_class_rec, + &t1_cmap_unicode_class_rec + }; + + + FT_CALLBACK_TABLE_DEF + const CFF_Builder_FuncsRec cff_builder_funcs = + { + cff_builder_init, /* init */ + cff_builder_done, /* done */ + + cff_check_points, /* check_points */ + cff_builder_add_point, /* add_point */ + cff_builder_add_point1, /* add_point1 */ + cff_builder_add_contour, /* add_contour */ + cff_builder_start_point, /* start_point */ + cff_builder_close_contour /* close_contour */ + }; + + + FT_CALLBACK_TABLE_DEF + const CFF_Decoder_FuncsRec cff_decoder_funcs = + { + cff_decoder_init, /* init */ + cff_decoder_prepare, /* prepare */ + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + cff_decoder_parse_charstrings, /* parse_charstrings_old */ +#endif + cf2_decoder_parse_charstrings /* parse_charstrings */ + }; + + + static + const PSAux_Interface psaux_interface = + { + &ps_table_funcs, + &ps_parser_funcs, + &t1_builder_funcs, + &t1_decoder_funcs, + t1_decrypt, + cff_random, + ps_decoder_init, + t1_make_subfont, + + (const T1_CMap_ClassesRec*) &t1_cmap_classes, + +#ifndef T1_CONFIG_OPTION_NO_AFM + &afm_parser_funcs, +#else + 0, +#endif + + &cff_decoder_funcs, + }; + + + FT_CALLBACK_TABLE_DEF + const FT_Module_Class psaux_module_class = + { + 0, + sizeof ( FT_ModuleRec ), + "psaux", + 0x20000L, + 0x20000L, + + &psaux_interface, /* module-specific interface */ + + (FT_Module_Constructor)NULL, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) NULL /* get_interface */ + }; + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psauxmod.h b/vendor/FreeType2/src/psaux/psauxmod.h new file mode 100644 index 0000000..f30978f --- /dev/null +++ b/vendor/FreeType2/src/psaux/psauxmod.h @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* psauxmod.h */ +/* */ +/* FreeType auxiliary PostScript module implementation (specification). */ +/* */ +/* Copyright 2000-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef PSAUXMOD_H_ +#define PSAUXMOD_H_ + + +#include +#include FT_MODULE_H + +#include FT_INTERNAL_POSTSCRIPT_AUX_H + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_PIC +#error "this module does not support PIC yet" +#endif + + + FT_CALLBACK_TABLE + const CFF_Builder_FuncsRec cff_builder_funcs; + + FT_CALLBACK_TABLE + const PS_Builder_FuncsRec ps_builder_funcs; + + + FT_EXPORT_VAR( const FT_Module_Class ) psaux_driver_class; + + +FT_END_HEADER + +#endif /* PSAUXMOD_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psblues.c b/vendor/FreeType2/src/psaux/psblues.c new file mode 100644 index 0000000..ae39d03 --- /dev/null +++ b/vendor/FreeType2/src/psaux/psblues.c @@ -0,0 +1,582 @@ +/***************************************************************************/ +/* */ +/* psblues.c */ +/* */ +/* Adobe's code for handling Blue Zones (body). */ +/* */ +/* Copyright 2009-2014 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#include "psft.h" +#include FT_INTERNAL_DEBUG_H + +#include "psblues.h" +#include "pshints.h" +#include "psfont.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_cf2blues + + + /* + * For blue values, the FreeType parser produces an array of integers, + * while the Adobe CFF engine produces an array of fixed. + * Define a macro to convert FreeType to fixed. + */ +#define cf2_blueToFixed( x ) cf2_intToFixed( x ) + + + FT_LOCAL_DEF( void ) + cf2_blues_init( CF2_Blues blues, + CF2_Font font ) + { + /* pointer to parsed font object */ + PS_Decoder* decoder = font->decoder; + + CF2_Fixed zoneHeight; + CF2_Fixed maxZoneHeight = 0; + CF2_Fixed csUnitsPerPixel; + + size_t numBlueValues; + size_t numOtherBlues; + size_t numFamilyBlues; + size_t numFamilyOtherBlues; + + FT_Pos* blueValues; + FT_Pos* otherBlues; + FT_Pos* familyBlues; + FT_Pos* familyOtherBlues; + + size_t i; + CF2_Fixed emBoxBottom, emBoxTop; + +#if 0 + CF2_Int unitsPerEm = font->unitsPerEm; + + + if ( unitsPerEm == 0 ) + unitsPerEm = 1000; +#endif + + FT_ZERO( blues ); + blues->scale = font->innerTransform.d; + + cf2_getBlueMetrics( decoder, + &blues->blueScale, + &blues->blueShift, + &blues->blueFuzz ); + + cf2_getBlueValues( decoder, &numBlueValues, &blueValues ); + cf2_getOtherBlues( decoder, &numOtherBlues, &otherBlues ); + cf2_getFamilyBlues( decoder, &numFamilyBlues, &familyBlues ); + cf2_getFamilyOtherBlues( decoder, &numFamilyOtherBlues, &familyOtherBlues ); + + /* + * synthetic em box hint heuristic + * + * Apply this when ideographic dictionary (LanguageGroup 1) has no + * real alignment zones. Adobe tools generate dummy zones at -250 and + * 1100 for a 1000 unit em. Fonts with ICF-based alignment zones + * should not enable the heuristic. When the heuristic is enabled, + * the font's blue zones are ignored. + * + */ + + /* get em box from OS/2 typoAscender/Descender */ + /* TODO: FreeType does not parse these metrics. Skip them for now. */ +#if 0 + FCM_getHorizontalLineMetrics( &e, + font->font, + &ascender, + &descender, + &linegap ); + if ( ascender - descender == unitsPerEm ) + { + emBoxBottom = cf2_intToFixed( descender ); + emBoxTop = cf2_intToFixed( ascender ); + } + else +#endif + { + emBoxBottom = CF2_ICF_Bottom; + emBoxTop = CF2_ICF_Top; + } + + if ( cf2_getLanguageGroup( decoder ) == 1 && + ( numBlueValues == 0 || + ( numBlueValues == 4 && + cf2_blueToFixed( blueValues[0] ) < emBoxBottom && + cf2_blueToFixed( blueValues[1] ) < emBoxBottom && + cf2_blueToFixed( blueValues[2] ) > emBoxTop && + cf2_blueToFixed( blueValues[3] ) > emBoxTop ) ) ) + { + /* + * Construct hint edges suitable for synthetic ghost hints at top + * and bottom of em box. +-CF2_MIN_COUNTER allows for unhinted + * features above or below the last hinted edge. This also gives a + * net 1 pixel boost to the height of ideographic glyphs. + * + * Note: Adjust synthetic hints outward by epsilon (0x.0001) to + * avoid interference. E.g., some fonts have real hints at + * 880 and -120. + */ + + blues->emBoxBottomEdge.csCoord = emBoxBottom - CF2_FIXED_EPSILON; + blues->emBoxBottomEdge.dsCoord = cf2_fixedRound( + FT_MulFix( + blues->emBoxBottomEdge.csCoord, + blues->scale ) ) - + CF2_MIN_COUNTER; + blues->emBoxBottomEdge.scale = blues->scale; + blues->emBoxBottomEdge.flags = CF2_GhostBottom | + CF2_Locked | + CF2_Synthetic; + + blues->emBoxTopEdge.csCoord = emBoxTop + CF2_FIXED_EPSILON + + 2 * font->darkenY; + blues->emBoxTopEdge.dsCoord = cf2_fixedRound( + FT_MulFix( + blues->emBoxTopEdge.csCoord, + blues->scale ) ) + + CF2_MIN_COUNTER; + blues->emBoxTopEdge.scale = blues->scale; + blues->emBoxTopEdge.flags = CF2_GhostTop | + CF2_Locked | + CF2_Synthetic; + + blues->doEmBoxHints = TRUE; /* enable the heuristic */ + + return; + } + + /* copy `BlueValues' and `OtherBlues' to a combined array of top and */ + /* bottom zones */ + for ( i = 0; i < numBlueValues; i += 2 ) + { + blues->zone[blues->count].csBottomEdge = + cf2_blueToFixed( blueValues[i] ); + blues->zone[blues->count].csTopEdge = + cf2_blueToFixed( blueValues[i + 1] ); + + zoneHeight = SUB_INT32( blues->zone[blues->count].csTopEdge, + blues->zone[blues->count].csBottomEdge ); + + if ( zoneHeight < 0 ) + { + FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" )); + continue; /* reject this zone */ + } + + if ( zoneHeight > maxZoneHeight ) + { + /* take maximum before darkening adjustment */ + /* so overshoot suppression point doesn't change */ + maxZoneHeight = zoneHeight; + } + + /* adjust both edges of top zone upward by twice darkening amount */ + if ( i != 0 ) + { + blues->zone[blues->count].csTopEdge += 2 * font->darkenY; + blues->zone[blues->count].csBottomEdge += 2 * font->darkenY; + } + + /* first `BlueValue' is bottom zone; others are top */ + if ( i == 0 ) + { + blues->zone[blues->count].bottomZone = + TRUE; + blues->zone[blues->count].csFlatEdge = + blues->zone[blues->count].csTopEdge; + } + else + { + blues->zone[blues->count].bottomZone = + FALSE; + blues->zone[blues->count].csFlatEdge = + blues->zone[blues->count].csBottomEdge; + } + + blues->count += 1; + } + + for ( i = 0; i < numOtherBlues; i += 2 ) + { + blues->zone[blues->count].csBottomEdge = + cf2_blueToFixed( otherBlues[i] ); + blues->zone[blues->count].csTopEdge = + cf2_blueToFixed( otherBlues[i + 1] ); + + zoneHeight = SUB_INT32( blues->zone[blues->count].csTopEdge, + blues->zone[blues->count].csBottomEdge ); + + if ( zoneHeight < 0 ) + { + FT_TRACE4(( "cf2_blues_init: ignoring negative zone height\n" )); + continue; /* reject this zone */ + } + + if ( zoneHeight > maxZoneHeight ) + { + /* take maximum before darkening adjustment */ + /* so overshoot suppression point doesn't change */ + maxZoneHeight = zoneHeight; + } + + /* Note: bottom zones are not adjusted for darkening amount */ + + /* all OtherBlues are bottom zone */ + blues->zone[blues->count].bottomZone = + TRUE; + blues->zone[blues->count].csFlatEdge = + blues->zone[blues->count].csTopEdge; + + blues->count += 1; + } + + /* Adjust for FamilyBlues */ + + /* Search for the nearest flat edge in `FamilyBlues' or */ + /* `FamilyOtherBlues'. According to the Black Book, any matching edge */ + /* must be within one device pixel */ + + csUnitsPerPixel = FT_DivFix( cf2_intToFixed( 1 ), blues->scale ); + + /* loop on all zones in this font */ + for ( i = 0; i < blues->count; i++ ) + { + size_t j; + CF2_Fixed minDiff; + CF2_Fixed flatFamilyEdge, diff; + /* value for this font */ + CF2_Fixed flatEdge = blues->zone[i].csFlatEdge; + + + if ( blues->zone[i].bottomZone ) + { + /* In a bottom zone, the top edge is the flat edge. */ + /* Search `FamilyOtherBlues' for bottom zones; look for closest */ + /* Family edge that is within the one pixel threshold. */ + + minDiff = CF2_FIXED_MAX; + + for ( j = 0; j < numFamilyOtherBlues; j += 2 ) + { + /* top edge */ + flatFamilyEdge = cf2_blueToFixed( familyOtherBlues[j + 1] ); + + diff = cf2_fixedAbs( SUB_INT32( flatEdge, flatFamilyEdge ) ); + + if ( diff < minDiff && diff < csUnitsPerPixel ) + { + blues->zone[i].csFlatEdge = flatFamilyEdge; + minDiff = diff; + + if ( diff == 0 ) + break; + } + } + + /* check the first member of FamilyBlues, which is a bottom zone */ + if ( numFamilyBlues >= 2 ) + { + /* top edge */ + flatFamilyEdge = cf2_blueToFixed( familyBlues[1] ); + + diff = cf2_fixedAbs( SUB_INT32( flatEdge, flatFamilyEdge ) ); + + if ( diff < minDiff && diff < csUnitsPerPixel ) + blues->zone[i].csFlatEdge = flatFamilyEdge; + } + } + else + { + /* In a top zone, the bottom edge is the flat edge. */ + /* Search `FamilyBlues' for top zones; skip first zone, which is a */ + /* bottom zone; look for closest Family edge that is within the */ + /* one pixel threshold */ + + minDiff = CF2_FIXED_MAX; + + for ( j = 2; j < numFamilyBlues; j += 2 ) + { + /* bottom edge */ + flatFamilyEdge = cf2_blueToFixed( familyBlues[j] ); + + /* adjust edges of top zone upward by twice darkening amount */ + flatFamilyEdge += 2 * font->darkenY; /* bottom edge */ + + diff = cf2_fixedAbs( SUB_INT32( flatEdge, flatFamilyEdge ) ); + + if ( diff < minDiff && diff < csUnitsPerPixel ) + { + blues->zone[i].csFlatEdge = flatFamilyEdge; + minDiff = diff; + + if ( diff == 0 ) + break; + } + } + } + } + + /* TODO: enforce separation of zones, including BlueFuzz */ + + /* Adjust BlueScale; similar to AdjustBlueScale() in coretype */ + /* `bcsetup.c'. */ + + if ( maxZoneHeight > 0 ) + { + if ( blues->blueScale > FT_DivFix( cf2_intToFixed( 1 ), + maxZoneHeight ) ) + { + /* clamp at maximum scale */ + blues->blueScale = FT_DivFix( cf2_intToFixed( 1 ), + maxZoneHeight ); + } + + /* + * TODO: Revisit the bug fix for 613448. The minimum scale + * requirement catches a number of library fonts. For + * example, with default BlueScale (.039625) and 0.4 minimum, + * the test below catches any font with maxZoneHeight < 10.1. + * There are library fonts ranging from 2 to 10 that get + * caught, including e.g., Eurostile LT Std Medium with + * maxZoneHeight of 6. + * + */ +#if 0 + if ( blueScale < .4 / maxZoneHeight ) + { + tetraphilia_assert( 0 ); + /* clamp at minimum scale, per bug 0613448 fix */ + blueScale = .4 / maxZoneHeight; + } +#endif + + } + + /* + * Suppress overshoot and boost blue zones at small sizes. Boost + * amount varies linearly from 0.5 pixel near 0 to 0 pixel at + * blueScale cutoff. + * Note: This boost amount is different from the coretype heuristic. + * + */ + + if ( blues->scale < blues->blueScale ) + { + blues->suppressOvershoot = TRUE; + + /* Change rounding threshold for `dsFlatEdge'. */ + /* Note: constant changed from 0.5 to 0.6 to avoid a problem with */ + /* 10ppem Arial */ + + blues->boost = cf2_doubleToFixed( .6 ) - + FT_MulDiv( cf2_doubleToFixed ( .6 ), + blues->scale, + blues->blueScale ); + if ( blues->boost > 0x7FFF ) + { + /* boost must remain less than 0.5, or baseline could go negative */ + blues->boost = 0x7FFF; + } + } + + /* boost and darkening have similar effects; don't do both */ + if ( font->stemDarkened ) + blues->boost = 0; + + /* set device space alignment for each zone; */ + /* apply boost amount before rounding flat edge */ + + for ( i = 0; i < blues->count; i++ ) + { + if ( blues->zone[i].bottomZone ) + blues->zone[i].dsFlatEdge = cf2_fixedRound( + FT_MulFix( + blues->zone[i].csFlatEdge, + blues->scale ) - + blues->boost ); + else + blues->zone[i].dsFlatEdge = cf2_fixedRound( + FT_MulFix( + blues->zone[i].csFlatEdge, + blues->scale ) + + blues->boost ); + } + } + + + /* + * Check whether `stemHint' is captured by one of the blue zones. + * + * Zero, one or both edges may be valid; only valid edges can be + * captured. For compatibility with CoolType, search top and bottom + * zones in the same pass (see `BlueLock'). If a hint is captured, + * return true and position the edge(s) in one of 3 ways: + * + * 1) If `BlueScale' suppresses overshoot, position the captured edge + * at the flat edge of the zone. + * 2) If overshoot is not suppressed and `BlueShift' requires + * overshoot, position the captured edge a minimum of 1 device pixel + * from the flat edge. + * 3) If overshoot is not suppressed or required, position the captured + * edge at the nearest device pixel. + * + */ + FT_LOCAL_DEF( FT_Bool ) + cf2_blues_capture( const CF2_Blues blues, + CF2_Hint bottomHintEdge, + CF2_Hint topHintEdge ) + { + /* TODO: validate? */ + CF2_Fixed csFuzz = blues->blueFuzz; + + /* new position of captured edge */ + CF2_Fixed dsNew; + + /* amount that hint is moved when positioned */ + CF2_Fixed dsMove = 0; + + FT_Bool captured = FALSE; + CF2_UInt i; + + + /* assert edge flags are consistent */ + FT_ASSERT( !cf2_hint_isTop( bottomHintEdge ) && + !cf2_hint_isBottom( topHintEdge ) ); + + /* TODO: search once without blue fuzz for compatibility with coretype? */ + for ( i = 0; i < blues->count; i++ ) + { + if ( blues->zone[i].bottomZone && + cf2_hint_isBottom( bottomHintEdge ) ) + { + if ( SUB_INT32( blues->zone[i].csBottomEdge, csFuzz ) <= + bottomHintEdge->csCoord && + bottomHintEdge->csCoord <= + ADD_INT32( blues->zone[i].csTopEdge, csFuzz ) ) + { + /* bottom edge captured by bottom zone */ + + if ( blues->suppressOvershoot ) + dsNew = blues->zone[i].dsFlatEdge; + + else if ( SUB_INT32( blues->zone[i].csTopEdge, + bottomHintEdge->csCoord ) >= + blues->blueShift ) + { + /* guarantee minimum of 1 pixel overshoot */ + dsNew = FT_MIN( + cf2_fixedRound( bottomHintEdge->dsCoord ), + blues->zone[i].dsFlatEdge - cf2_intToFixed( 1 ) ); + } + + else + { + /* simply round captured edge */ + dsNew = cf2_fixedRound( bottomHintEdge->dsCoord ); + } + + dsMove = SUB_INT32( dsNew, bottomHintEdge->dsCoord ); + captured = TRUE; + + break; + } + } + + if ( !blues->zone[i].bottomZone && cf2_hint_isTop( topHintEdge ) ) + { + if ( SUB_INT32( blues->zone[i].csBottomEdge, csFuzz ) <= + topHintEdge->csCoord && + topHintEdge->csCoord <= + ADD_INT32( blues->zone[i].csTopEdge, csFuzz ) ) + { + /* top edge captured by top zone */ + + if ( blues->suppressOvershoot ) + dsNew = blues->zone[i].dsFlatEdge; + + else if ( SUB_INT32( topHintEdge->csCoord, + blues->zone[i].csBottomEdge ) >= + blues->blueShift ) + { + /* guarantee minimum of 1 pixel overshoot */ + dsNew = FT_MAX( + cf2_fixedRound( topHintEdge->dsCoord ), + blues->zone[i].dsFlatEdge + cf2_intToFixed( 1 ) ); + } + + else + { + /* simply round captured edge */ + dsNew = cf2_fixedRound( topHintEdge->dsCoord ); + } + + dsMove = SUB_INT32( dsNew, topHintEdge->dsCoord ); + captured = TRUE; + + break; + } + } + } + + if ( captured ) + { + /* move both edges and flag them `locked' */ + if ( cf2_hint_isValid( bottomHintEdge ) ) + { + bottomHintEdge->dsCoord = ADD_INT32( bottomHintEdge->dsCoord, + dsMove ); + cf2_hint_lock( bottomHintEdge ); + } + + if ( cf2_hint_isValid( topHintEdge ) ) + { + topHintEdge->dsCoord = ADD_INT32( topHintEdge->dsCoord, dsMove ); + cf2_hint_lock( topHintEdge ); + } + } + + return captured; + } + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psblues.h b/vendor/FreeType2/src/psaux/psblues.h new file mode 100644 index 0000000..25ef684 --- /dev/null +++ b/vendor/FreeType2/src/psaux/psblues.h @@ -0,0 +1,185 @@ +/***************************************************************************/ +/* */ +/* psblues.h */ +/* */ +/* Adobe's code for handling Blue Zones (specification). */ +/* */ +/* Copyright 2009-2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + + /* + * A `CF2_Blues' object stores the blue zones (horizontal alignment + * zones) of a font. These are specified in the CFF private dictionary + * by `BlueValues', `OtherBlues', `FamilyBlues', and `FamilyOtherBlues'. + * Each zone is defined by a top and bottom edge in character space. + * Further, each zone is either a top zone or a bottom zone, as recorded + * by `bottomZone'. + * + * The maximum number of `BlueValues' and `FamilyBlues' is 7 each. + * However, these are combined to produce a total of 7 zones. + * Similarly, the maximum number of `OtherBlues' and `FamilyOtherBlues' + * is 5 and these are combined to produce an additional 5 zones. + * + * Blue zones are used to `capture' hints and force them to a common + * alignment point. This alignment is recorded in device space in + * `dsFlatEdge'. Except for this value, a `CF2_Blues' object could be + * constructed independently of scaling. Construction may occur once + * the matrix is known. Other features implemented in the Capture + * method are overshoot suppression, overshoot enforcement, and Blue + * Boost. + * + * Capture is determined by `BlueValues' and `OtherBlues', but the + * alignment point may be adjusted to the scaled flat edge of + * `FamilyBlues' or `FamilyOtherBlues'. No alignment is done to the + * curved edge of a zone. + * + */ + + +#ifndef PSBLUES_H_ +#define PSBLUES_H_ + + +#include "psglue.h" + + +FT_BEGIN_HEADER + + + /* + * `CF2_Hint' is shared by `cf2hints.h' and + * `cf2blues.h', but `cf2blues.h' depends on + * `cf2hints.h', so define it here. Note: The typedef is in + * `cf2glue.h'. + * + */ + enum + { + CF2_GhostBottom = 0x1, /* a single bottom edge */ + CF2_GhostTop = 0x2, /* a single top edge */ + CF2_PairBottom = 0x4, /* the bottom edge of a stem hint */ + CF2_PairTop = 0x8, /* the top edge of a stem hint */ + CF2_Locked = 0x10, /* this edge has been aligned */ + /* by a blue zone */ + CF2_Synthetic = 0x20 /* this edge was synthesized */ + }; + + + /* + * Default value for OS/2 typoAscender/Descender when their difference + * is not equal to `unitsPerEm'. The default is based on -250 and 1100 + * in `CF2_Blues', assuming 1000 units per em here. + * + */ + enum + { + CF2_ICF_Top = cf2_intToFixed( 880 ), + CF2_ICF_Bottom = cf2_intToFixed( -120 ) + }; + + + /* + * Constant used for hint adjustment and for synthetic em box hint + * placement. + */ +#define CF2_MIN_COUNTER cf2_doubleToFixed( 0.5 ) + + + /* shared typedef is in cf2glue.h */ + struct CF2_HintRec_ + { + CF2_UInt flags; /* attributes of the edge */ + size_t index; /* index in original stem hint array */ + /* (if not synthetic) */ + CF2_Fixed csCoord; + CF2_Fixed dsCoord; + CF2_Fixed scale; + }; + + + typedef struct CF2_BlueRec_ + { + CF2_Fixed csBottomEdge; + CF2_Fixed csTopEdge; + CF2_Fixed csFlatEdge; /* may be from either local or Family zones */ + CF2_Fixed dsFlatEdge; /* top edge of bottom zone or bottom edge */ + /* of top zone (rounded) */ + FT_Bool bottomZone; + + } CF2_BlueRec; + + + /* max total blue zones is 12 */ + enum + { + CF2_MAX_BLUES = 7, + CF2_MAX_OTHERBLUES = 5 + }; + + + typedef struct CF2_BluesRec_ + { + CF2_Fixed scale; + CF2_UInt count; + FT_Bool suppressOvershoot; + FT_Bool doEmBoxHints; + + CF2_Fixed blueScale; + CF2_Fixed blueShift; + CF2_Fixed blueFuzz; + + CF2_Fixed boost; + + CF2_HintRec emBoxTopEdge; + CF2_HintRec emBoxBottomEdge; + + CF2_BlueRec zone[CF2_MAX_BLUES + CF2_MAX_OTHERBLUES]; + + } CF2_BluesRec, *CF2_Blues; + + + FT_LOCAL( void ) + cf2_blues_init( CF2_Blues blues, + CF2_Font font ); + FT_LOCAL( FT_Bool ) + cf2_blues_capture( const CF2_Blues blues, + CF2_Hint bottomHintEdge, + CF2_Hint topHintEdge ); + + +FT_END_HEADER + + +#endif /* PSBLUES_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psconv.c b/vendor/FreeType2/src/psaux/psconv.c new file mode 100644 index 0000000..a033850 --- /dev/null +++ b/vendor/FreeType2/src/psaux/psconv.c @@ -0,0 +1,611 @@ +/***************************************************************************/ +/* */ +/* psconv.c */ +/* */ +/* Some convenience conversions (body). */ +/* */ +/* Copyright 2006-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_DEBUG_H + +#include "psconv.h" +#include "psauxerr.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_psconv + + + /* The following array is used by various functions to quickly convert */ + /* digits (both decimal and non-decimal) into numbers. */ + +#if 'A' == 65 + /* ASCII */ + + static const FT_Char ft_char_table[128] = + { + /* 0x00 */ + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + }; + + /* no character >= 0x80 can represent a valid number */ +#define OP >= + +#endif /* 'A' == 65 */ + +#if 'A' == 193 + /* EBCDIC */ + + static const FT_Char ft_char_table[128] = + { + /* 0x80 */ + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, + -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, -1, -1, -1, -1, -1, -1, + -1, 19, 20, 21, 22, 23, 24, 25, 26, 27, -1, -1, -1, -1, -1, -1, + -1, -1, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, + }; + + /* no character < 0x80 can represent a valid number */ +#define OP < + +#endif /* 'A' == 193 */ + + + FT_LOCAL_DEF( FT_Long ) + PS_Conv_Strtol( FT_Byte** cursor, + FT_Byte* limit, + FT_Long base ) + { + FT_Byte* p = *cursor; + + FT_Long num = 0; + FT_Bool sign = 0; + FT_Bool have_overflow = 0; + + FT_Long num_limit; + FT_Char c_limit; + + + if ( p >= limit ) + goto Bad; + + if ( base < 2 || base > 36 ) + { + FT_TRACE4(( "!!!INVALID BASE:!!!" )); + return 0; + } + + if ( *p == '-' || *p == '+' ) + { + sign = FT_BOOL( *p == '-' ); + + p++; + if ( p == limit ) + goto Bad; + + /* only a single sign is allowed */ + if ( *p == '-' || *p == '+' ) + return 0; + } + + num_limit = 0x7FFFFFFFL / base; + c_limit = (FT_Char)( 0x7FFFFFFFL % base ); + + for ( ; p < limit; p++ ) + { + FT_Char c; + + + if ( IS_PS_SPACE( *p ) || *p OP 0x80 ) + break; + + c = ft_char_table[*p & 0x7F]; + + if ( c < 0 || c >= base ) + break; + + if ( num > num_limit || ( num == num_limit && c > c_limit ) ) + have_overflow = 1; + else + num = num * base + c; + } + + *cursor = p; + + if ( have_overflow ) + { + num = 0x7FFFFFFFL; + FT_TRACE4(( "!!!OVERFLOW:!!!" )); + } + + if ( sign ) + num = -num; + + return num; + + Bad: + FT_TRACE4(( "!!!END OF DATA:!!!" )); + return 0; + } + + + FT_LOCAL_DEF( FT_Long ) + PS_Conv_ToInt( FT_Byte** cursor, + FT_Byte* limit ) + + { + FT_Byte* p = *cursor; + FT_Byte* curp; + + FT_Long num; + + + curp = p; + num = PS_Conv_Strtol( &p, limit, 10 ); + + if ( p == curp ) + return 0; + + if ( p < limit && *p == '#' ) + { + p++; + + curp = p; + num = PS_Conv_Strtol( &p, limit, num ); + + if ( p == curp ) + return 0; + } + + *cursor = p; + + return num; + } + + + FT_LOCAL_DEF( FT_Fixed ) + PS_Conv_ToFixed( FT_Byte** cursor, + FT_Byte* limit, + FT_Long power_ten ) + { + FT_Byte* p = *cursor; + FT_Byte* curp; + + FT_Fixed integral = 0; + FT_Long decimal = 0; + FT_Long divider = 1; + + FT_Bool sign = 0; + FT_Bool have_overflow = 0; + FT_Bool have_underflow = 0; + + + if ( p >= limit ) + goto Bad; + + if ( *p == '-' || *p == '+' ) + { + sign = FT_BOOL( *p == '-' ); + + p++; + if ( p == limit ) + goto Bad; + + /* only a single sign is allowed */ + if ( *p == '-' || *p == '+' ) + return 0; + } + + /* read the integer part */ + if ( *p != '.' ) + { + curp = p; + integral = PS_Conv_ToInt( &p, limit ); + + if ( p == curp ) + return 0; + + if ( integral > 0x7FFF ) + have_overflow = 1; + else + integral = (FT_Fixed)( (FT_UInt32)integral << 16 ); + } + + /* read the decimal part */ + if ( p < limit && *p == '.' ) + { + p++; + + for ( ; p < limit; p++ ) + { + FT_Char c; + + + if ( IS_PS_SPACE( *p ) || *p OP 0x80 ) + break; + + c = ft_char_table[*p & 0x7F]; + + if ( c < 0 || c >= 10 ) + break; + + /* only add digit if we don't overflow */ + if ( divider < 0xCCCCCCCL && decimal < 0xCCCCCCCL ) + { + decimal = decimal * 10 + c; + + if ( !integral && power_ten > 0 ) + power_ten--; + else + divider *= 10; + } + } + } + + /* read exponent, if any */ + if ( p + 1 < limit && ( *p == 'e' || *p == 'E' ) ) + { + FT_Long exponent; + + + p++; + + curp = p; + exponent = PS_Conv_ToInt( &p, limit ); + + if ( curp == p ) + return 0; + + /* arbitrarily limit exponent */ + if ( exponent > 1000 ) + have_overflow = 1; + else if ( exponent < -1000 ) + have_underflow = 1; + else + power_ten += exponent; + } + + *cursor = p; + + if ( !integral && !decimal ) + return 0; + + if ( have_overflow ) + goto Overflow; + if ( have_underflow ) + goto Underflow; + + while ( power_ten > 0 ) + { + if ( integral >= 0xCCCCCCCL ) + goto Overflow; + integral *= 10; + + if ( decimal >= 0xCCCCCCCL ) + { + if ( divider == 1 ) + goto Overflow; + divider /= 10; + } + else + decimal *= 10; + + power_ten--; + } + + while ( power_ten < 0 ) + { + integral /= 10; + if ( divider < 0xCCCCCCCL ) + divider *= 10; + else + decimal /= 10; + + if ( !integral && !decimal ) + goto Underflow; + + power_ten++; + } + + if ( decimal ) + { + decimal = FT_DivFix( decimal, divider ); + /* it's not necessary to check this addition for overflow */ + /* due to the structure of the real number representation */ + integral += decimal; + } + + Exit: + if ( sign ) + integral = -integral; + + return integral; + + Bad: + FT_TRACE4(( "!!!END OF DATA:!!!" )); + return 0; + + Overflow: + integral = 0x7FFFFFFFL; + FT_TRACE4(( "!!!OVERFLOW:!!!" )); + goto Exit; + + Underflow: + FT_TRACE4(( "!!!UNDERFLOW:!!!" )); + return 0; + } + + +#if 0 + FT_LOCAL_DEF( FT_UInt ) + PS_Conv_StringDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ) + { + FT_Byte* p; + FT_UInt r = 0; + + + for ( p = *cursor; r < n && p < limit; p++ ) + { + FT_Byte b; + + + if ( *p != '\\' ) + { + buffer[r++] = *p; + + continue; + } + + p++; + + switch ( *p ) + { + case 'n': + b = '\n'; + break; + case 'r': + b = '\r'; + break; + case 't': + b = '\t'; + break; + case 'b': + b = '\b'; + break; + case 'f': + b = '\f'; + break; + case '\r': + p++; + if ( *p != '\n' ) + { + b = *p; + + break; + } + /* no break */ + case '\n': + continue; + break; + default: + if ( IS_PS_DIGIT( *p ) ) + { + b = *p - '0'; + + p++; + + if ( IS_PS_DIGIT( *p ) ) + { + b = b * 8 + *p - '0'; + + p++; + + if ( IS_PS_DIGIT( *p ) ) + b = b * 8 + *p - '0'; + else + { + buffer[r++] = b; + b = *p; + } + } + else + { + buffer[r++] = b; + b = *p; + } + } + else + b = *p; + break; + } + + buffer[r++] = b; + } + + *cursor = p; + + return r; + } +#endif /* 0 */ + + + FT_LOCAL_DEF( FT_UInt ) + PS_Conv_ASCIIHexDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ) + { + FT_Byte* p; + FT_UInt r = 0; + FT_UInt w = 0; + FT_UInt pad = 0x01; + + + n *= 2; + +#if 1 + + p = *cursor; + + if ( p >= limit ) + return 0; + + if ( n > (FT_UInt)( limit - p ) ) + n = (FT_UInt)( limit - p ); + + /* we try to process two nibbles at a time to be as fast as possible */ + for ( ; r < n; r++ ) + { + FT_UInt c = p[r]; + + + if ( IS_PS_SPACE( c ) ) + continue; + + if ( c OP 0x80 ) + break; + + c = (FT_UInt)ft_char_table[c & 0x7F]; + if ( c >= 16 ) + break; + + pad = ( pad << 4 ) | c; + if ( pad & 0x100 ) + { + buffer[w++] = (FT_Byte)pad; + pad = 0x01; + } + } + + if ( pad != 0x01 ) + buffer[w++] = (FT_Byte)( pad << 4 ); + + *cursor = p + r; + + return w; + +#else /* 0 */ + + for ( r = 0; r < n; r++ ) + { + FT_Char c; + + + if ( IS_PS_SPACE( *p ) ) + continue; + + if ( *p OP 0x80 ) + break; + + c = ft_char_table[*p & 0x7F]; + + if ( (unsigned)c >= 16 ) + break; + + if ( r & 1 ) + { + *buffer = (FT_Byte)(*buffer + c); + buffer++; + } + else + *buffer = (FT_Byte)(c << 4); + + r++; + } + + *cursor = p; + + return ( r + 1 ) / 2; + +#endif /* 0 */ + + } + + + FT_LOCAL_DEF( FT_UInt ) + PS_Conv_EexecDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n, + FT_UShort* seed ) + { + FT_Byte* p; + FT_UInt r; + FT_UInt s = *seed; + + +#if 1 + + p = *cursor; + + if ( p >= limit ) + return 0; + + if ( n > (FT_UInt)(limit - p) ) + n = (FT_UInt)(limit - p); + + for ( r = 0; r < n; r++ ) + { + FT_UInt val = p[r]; + FT_UInt b = ( val ^ ( s >> 8 ) ); + + + s = ( (val + s)*52845U + 22719 ) & 0xFFFFU; + buffer[r] = (FT_Byte) b; + } + + *cursor = p + n; + *seed = (FT_UShort)s; + +#else /* 0 */ + + for ( r = 0, p = *cursor; r < n && p < limit; r++, p++ ) + { + FT_Byte b = (FT_Byte)( *p ^ ( s >> 8 ) ); + + + s = (FT_UShort)( ( *p + s ) * 52845U + 22719 ); + *buffer++ = b; + } + *cursor = p; + *seed = s; + +#endif /* 0 */ + + return r; + } + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psconv.h b/vendor/FreeType2/src/psaux/psconv.h new file mode 100644 index 0000000..d643ffc --- /dev/null +++ b/vendor/FreeType2/src/psaux/psconv.h @@ -0,0 +1,71 @@ +/***************************************************************************/ +/* */ +/* psconv.h */ +/* */ +/* Some convenience conversions (specification). */ +/* */ +/* Copyright 2006-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef PSCONV_H_ +#define PSCONV_H_ + + +#include +#include FT_INTERNAL_POSTSCRIPT_AUX_H + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Long ) + PS_Conv_Strtol( FT_Byte** cursor, + FT_Byte* limit, + FT_Long base ); + + + FT_LOCAL( FT_Long ) + PS_Conv_ToInt( FT_Byte** cursor, + FT_Byte* limit ); + + FT_LOCAL( FT_Fixed ) + PS_Conv_ToFixed( FT_Byte** cursor, + FT_Byte* limit, + FT_Long power_ten ); + +#if 0 + FT_LOCAL( FT_UInt ) + PS_Conv_StringDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ); +#endif + + FT_LOCAL( FT_UInt ) + PS_Conv_ASCIIHexDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n ); + + FT_LOCAL( FT_UInt ) + PS_Conv_EexecDecode( FT_Byte** cursor, + FT_Byte* limit, + FT_Byte* buffer, + FT_Offset n, + FT_UShort* seed ); + + +FT_END_HEADER + +#endif /* PSCONV_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/pserror.c b/vendor/FreeType2/src/psaux/pserror.c new file mode 100644 index 0000000..9169e52 --- /dev/null +++ b/vendor/FreeType2/src/psaux/pserror.c @@ -0,0 +1,52 @@ +/***************************************************************************/ +/* */ +/* pserror.c */ +/* */ +/* Adobe's code for error handling (body). */ +/* */ +/* Copyright 2006-2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#include "psft.h" +#include "pserror.h" + + + FT_LOCAL_DEF( void ) + cf2_setError( FT_Error* error, + FT_Error value ) + { + if ( error && !*error ) + *error = value; + } + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/pserror.h b/vendor/FreeType2/src/psaux/pserror.h new file mode 100644 index 0000000..13d5206 --- /dev/null +++ b/vendor/FreeType2/src/psaux/pserror.h @@ -0,0 +1,119 @@ +/***************************************************************************/ +/* */ +/* pserror.h */ +/* */ +/* Adobe's code for error handling (specification). */ +/* */ +/* Copyright 2006-2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#ifndef PSERROR_H_ +#define PSERROR_H_ + + +#include FT_MODULE_ERRORS_H + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX CF2_Err_ +#define FT_ERR_BASE FT_Mod_Err_CF2 + + +#include FT_ERRORS_H +#include "psft.h" + + +FT_BEGIN_HEADER + + + /* + * A poor-man error facility. + * + * This code being written in vanilla C, doesn't have the luxury of a + * language-supported exception mechanism such as the one available in + * Java. Instead, we are stuck with using error codes that must be + * carefully managed and preserved. However, it is convenient for us to + * model our error mechanism on a Java-like exception mechanism. + * When we assign an error code we are thus `throwing' an error. + * + * The preservation of an error code is done by coding convention. + * Upon a function call if the error code is anything other than + * `FT_Err_Ok', which is guaranteed to be zero, we + * will return without altering that error. This will allow the + * error to propagate and be handled at the appropriate location in + * the code. + * + * This allows a style of code where the error code is initialized + * up front and a block of calls are made with the error code only + * being checked after the block. If a new error occurs, the original + * error will be preserved and a functional no-op should result in any + * subsequent function that has an initial error code not equal to + * `FT_Err_Ok'. + * + * Errors are encoded by calling the `FT_THROW' macro. For example, + * + * { + * FT_Error e; + * + * + * ... + * e = FT_THROW( Out_Of_Memory ); + * } + * + */ + + + /* Set error code to a particular value. */ + FT_LOCAL( void ) + cf2_setError( FT_Error* error, + FT_Error value ); + + + /* + * A macro that conditionally sets an error code. + * + * This macro will first check whether `error' is set; + * if not, it will set it to `e'. + * + */ +#define CF2_SET_ERROR( error, e ) \ + cf2_setError( error, FT_THROW( e ) ) + + +FT_END_HEADER + + +#endif /* PSERROR_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psfixed.h b/vendor/FreeType2/src/psaux/psfixed.h new file mode 100644 index 0000000..219589e --- /dev/null +++ b/vendor/FreeType2/src/psaux/psfixed.h @@ -0,0 +1,95 @@ +/***************************************************************************/ +/* */ +/* psfixed.h */ +/* */ +/* Adobe's code for Fixed Point Mathematics (specification only). */ +/* */ +/* Copyright 2007-2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#ifndef PSFIXED_H_ +#define PSFIXED_H_ + + +FT_BEGIN_HEADER + + + /* rasterizer integer and fixed point arithmetic must be 32-bit */ + +#define CF2_Fixed CF2_F16Dot16 + typedef FT_Int32 CF2_Frac; /* 2.30 fixed point */ + + +#define CF2_FIXED_MAX ( (CF2_Fixed)0x7FFFFFFFL ) +#define CF2_FIXED_MIN ( (CF2_Fixed)0x80000000L ) +#define CF2_FIXED_ONE ( (CF2_Fixed)0x10000L ) +#define CF2_FIXED_EPSILON ( (CF2_Fixed)0x0001 ) + + /* in C 89, left and right shift of negative numbers is */ + /* implementation specific behaviour in the general case */ + +#define cf2_intToFixed( i ) \ + ( (CF2_Fixed)( (FT_UInt32)(i) << 16 ) ) +#define cf2_fixedToInt( x ) \ + ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) ) +#define cf2_fixedRound( x ) \ + ( (CF2_Fixed)( ( (FT_UInt32)(x) + 0x8000U ) & 0xFFFF0000UL ) ) +#define cf2_doubleToFixed( f ) \ + ( (CF2_Fixed)( (f) * 65536.0 + 0.5 ) ) +#define cf2_fixedAbs( x ) \ + ( (x) < 0 ? NEG_INT32( x ) : (x) ) +#define cf2_fixedFloor( x ) \ + ( (CF2_Fixed)( (FT_UInt32)(x) & 0xFFFF0000UL ) ) +#define cf2_fixedFraction( x ) \ + ( (x) - cf2_fixedFloor( x ) ) +#define cf2_fracToFixed( x ) \ + ( (x) < 0 ? -( ( -(x) + 0x2000 ) >> 14 ) \ + : ( ( (x) + 0x2000 ) >> 14 ) ) + + + /* signed numeric types */ + typedef enum CF2_NumberType_ + { + CF2_NumberFixed, /* 16.16 */ + CF2_NumberFrac, /* 2.30 */ + CF2_NumberInt /* 32.0 */ + + } CF2_NumberType; + + +FT_END_HEADER + + +#endif /* PSFIXED_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psfont.c b/vendor/FreeType2/src/psaux/psfont.c new file mode 100644 index 0000000..dde67a7 --- /dev/null +++ b/vendor/FreeType2/src/psaux/psfont.c @@ -0,0 +1,567 @@ +/***************************************************************************/ +/* */ +/* psfont.c */ +/* */ +/* Adobe's code for font instances (body). */ +/* */ +/* Copyright 2007-2014 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_CALC_H + +#include "psft.h" + +#include "psglue.h" +#include "psfont.h" +#include "pserror.h" +#include "psintrp.h" + + + /* Compute a stem darkening amount in character space. */ + static void + cf2_computeDarkening( CF2_Fixed emRatio, + CF2_Fixed ppem, + CF2_Fixed stemWidth, + CF2_Fixed* darkenAmount, + CF2_Fixed boldenAmount, + FT_Bool stemDarkened, + FT_Int* darkenParams ) + { + /* + * Total darkening amount is computed in 1000 unit character space + * using the modified 5 part curve as Adobe's Avalon rasterizer. + * The darkening amount is smaller for thicker stems. + * It becomes zero when the stem is thicker than 2.333 pixels. + * + * By default, we use + * + * darkenAmount = 0.4 pixels if scaledStem <= 0.5 pixels, + * darkenAmount = 0.275 pixels if 1 <= scaledStem <= 1.667 pixels, + * darkenAmount = 0 pixel if scaledStem >= 2.333 pixels, + * + * and piecewise linear in-between: + * + * + * darkening + * ^ + * | + * | (x1,y1) + * |--------+ + * | \ + * | \ + * | \ (x3,y3) + * | +----------+ + * | (x2,y2) \ + * | \ + * | \ + * | +----------------- + * | (x4,y4) + * +---------------------------------------------> stem + * thickness + * + * + * This corresponds to the following values for the + * `darkening-parameters' property: + * + * (x1, y1) = (500, 400) + * (x2, y2) = (1000, 275) + * (x3, y3) = (1667, 275) + * (x4, y4) = (2333, 0) + * + */ + + /* Internal calculations are done in units per thousand for */ + /* convenience. The x axis is scaled stem width in */ + /* thousandths of a pixel. That is, 1000 is 1 pixel. */ + /* The y axis is darkening amount in thousandths of a pixel.*/ + /* In the code, below, dividing by ppem and */ + /* adjusting for emRatio converts darkenAmount to character */ + /* space (font units). */ + CF2_Fixed stemWidthPer1000, scaledStem; + FT_Int logBase2; + + + *darkenAmount = 0; + + if ( boldenAmount == 0 && !stemDarkened ) + return; + + /* protect against range problems and divide by zero */ + if ( emRatio < cf2_doubleToFixed( .01 ) ) + return; + + if ( stemDarkened ) + { + FT_Int x1 = darkenParams[0]; + FT_Int y1 = darkenParams[1]; + FT_Int x2 = darkenParams[2]; + FT_Int y2 = darkenParams[3]; + FT_Int x3 = darkenParams[4]; + FT_Int y3 = darkenParams[5]; + FT_Int x4 = darkenParams[6]; + FT_Int y4 = darkenParams[7]; + + + /* convert from true character space to 1000 unit character space; */ + /* add synthetic emboldening effect */ + + /* `stemWidthPer1000' will not overflow for a legitimate font */ + + stemWidthPer1000 = FT_MulFix( stemWidth + boldenAmount, emRatio ); + + /* `scaledStem' can easily overflow, so we must clamp its maximum */ + /* value; the test doesn't need to be precise, but must be */ + /* conservative. The clamp value (default 2333) where */ + /* `darkenAmount' is zero is well below the overflow value of */ + /* 32767. */ + /* */ + /* FT_MSB computes the integer part of the base 2 logarithm. The */ + /* number of bits for the product is 1 or 2 more than the sum of */ + /* logarithms; remembering that the 16 lowest bits of the fraction */ + /* are dropped this is correct to within a factor of almost 4. */ + /* For example, 0x80.0000 * 0x80.0000 = 0x4000.0000 is 23+23 and */ + /* is flagged as possible overflow because 0xFF.FFFF * 0xFF.FFFF = */ + /* 0xFFFF.FE00 is also 23+23. */ + + logBase2 = FT_MSB( (FT_UInt32)stemWidthPer1000 ) + + FT_MSB( (FT_UInt32)ppem ); + + if ( logBase2 >= 46 ) + /* possible overflow */ + scaledStem = cf2_intToFixed( x4 ); + else + scaledStem = FT_MulFix( stemWidthPer1000, ppem ); + + /* now apply the darkening parameters */ + + if ( scaledStem < cf2_intToFixed( x1 ) ) + *darkenAmount = FT_DivFix( cf2_intToFixed( y1 ), ppem ); + + else if ( scaledStem < cf2_intToFixed( x2 ) ) + { + FT_Int xdelta = x2 - x1; + FT_Int ydelta = y2 - y1; + FT_Int x = stemWidthPer1000 - + FT_DivFix( cf2_intToFixed( x1 ), ppem ); + + + if ( !xdelta ) + goto Try_x3; + + *darkenAmount = FT_MulDiv( x, ydelta, xdelta ) + + FT_DivFix( cf2_intToFixed( y1 ), ppem ); + } + + else if ( scaledStem < cf2_intToFixed( x3 ) ) + { + Try_x3: + { + FT_Int xdelta = x3 - x2; + FT_Int ydelta = y3 - y2; + FT_Int x = stemWidthPer1000 - + FT_DivFix( cf2_intToFixed( x2 ), ppem ); + + + if ( !xdelta ) + goto Try_x4; + + *darkenAmount = FT_MulDiv( x, ydelta, xdelta ) + + FT_DivFix( cf2_intToFixed( y2 ), ppem ); + } + } + + else if ( scaledStem < cf2_intToFixed( x4 ) ) + { + Try_x4: + { + FT_Int xdelta = x4 - x3; + FT_Int ydelta = y4 - y3; + FT_Int x = stemWidthPer1000 - + FT_DivFix( cf2_intToFixed( x3 ), ppem ); + + + if ( !xdelta ) + goto Use_y4; + + *darkenAmount = FT_MulDiv( x, ydelta, xdelta ) + + FT_DivFix( cf2_intToFixed( y3 ), ppem ); + } + } + + else + { + Use_y4: + *darkenAmount = FT_DivFix( cf2_intToFixed( y4 ), ppem ); + } + + /* use half the amount on each side and convert back to true */ + /* character space */ + *darkenAmount = FT_DivFix( *darkenAmount, 2 * emRatio ); + } + + /* add synthetic emboldening effect in character space */ + *darkenAmount += boldenAmount / 2; + } + + + /* set up values for the current FontDict and matrix; */ + /* called for each glyph to be rendered */ + + /* caller's transform is adjusted for subpixel positioning */ + static void + cf2_font_setup( CF2_Font font, + const CF2_Matrix* transform ) + { + /* pointer to parsed font object */ + PS_Decoder* decoder = font->decoder; + + FT_Bool needExtraSetup = FALSE; + + CFF_VStoreRec* vstore; + FT_Bool hasVariations = FALSE; + + /* character space units */ + CF2_Fixed boldenX = font->syntheticEmboldeningAmountX; + CF2_Fixed boldenY = font->syntheticEmboldeningAmountY; + + CFF_SubFont subFont; + CF2_Fixed ppem; + + CF2_UInt lenNormalizedV = 0; + FT_Fixed* normalizedV = NULL; + + /* clear previous error */ + font->error = FT_Err_Ok; + + /* if a CID fontDict has changed, we need to recompute some cached */ + /* data */ + subFont = cf2_getSubfont( decoder ); + if ( font->lastSubfont != subFont ) + { + font->lastSubfont = subFont; + needExtraSetup = TRUE; + } + + if ( !font->isT1 ) + { + FT_Service_CFFLoad cffload = (FT_Service_CFFLoad)font->cffload; + + + /* check for variation vectors */ + vstore = cf2_getVStore( decoder ); + hasVariations = ( vstore->dataCount != 0 ); + + if ( hasVariations ) + { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* check whether Private DICT in this subfont needs to be reparsed */ + font->error = cf2_getNormalizedVector( decoder, + &lenNormalizedV, + &normalizedV ); + if ( font->error ) + return; + + if ( cffload->blend_check_vector( &subFont->blend, + subFont->private_dict.vsindex, + lenNormalizedV, + normalizedV ) ) + { + /* blend has changed, reparse */ + cffload->load_private_dict( decoder->cff, + subFont, + lenNormalizedV, + normalizedV ); + needExtraSetup = TRUE; + } +#endif + + /* copy from subfont */ + font->blend.font = subFont->blend.font; + + /* clear state of charstring blend */ + font->blend.usedBV = FALSE; + + /* initialize value for charstring */ + font->vsindex = subFont->private_dict.vsindex; + + /* store vector inputs for blends in charstring */ + font->lenNDV = lenNormalizedV; + font->NDV = normalizedV; + } + } + + /* if ppem has changed, we need to recompute some cached data */ + /* note: because of CID font matrix concatenation, ppem and transform */ + /* do not necessarily track. */ + ppem = cf2_getPpemY( decoder ); + if ( font->ppem != ppem ) + { + font->ppem = ppem; + needExtraSetup = TRUE; + } + + /* copy hinted flag on each call */ + font->hinted = (FT_Bool)( font->renderingFlags & CF2_FlagsHinted ); + + /* determine if transform has changed; */ + /* include Fontmatrix but ignore translation */ + if ( ft_memcmp( transform, + &font->currentTransform, + 4 * sizeof ( CF2_Fixed ) ) != 0 ) + { + /* save `key' information for `cache of one' matrix data; */ + /* save client transform, without the translation */ + font->currentTransform = *transform; + font->currentTransform.tx = + font->currentTransform.ty = cf2_intToFixed( 0 ); + + /* TODO: FreeType transform is simple scalar; for now, use identity */ + /* for outer */ + font->innerTransform = *transform; + font->outerTransform.a = + font->outerTransform.d = cf2_intToFixed( 1 ); + font->outerTransform.b = + font->outerTransform.c = cf2_intToFixed( 0 ); + + needExtraSetup = TRUE; + } + + /* + * font->darkened is set to true if there is a stem darkening request or + * the font is synthetic emboldened. + * font->darkened controls whether to adjust blue zones, winding order, + * and hinting. + * + */ + if ( font->stemDarkened != ( font->renderingFlags & CF2_FlagsDarkened ) ) + { + font->stemDarkened = + (FT_Bool)( font->renderingFlags & CF2_FlagsDarkened ); + + /* blue zones depend on darkened flag */ + needExtraSetup = TRUE; + } + + /* recompute variables that are dependent on transform or FontDict or */ + /* darken flag */ + if ( needExtraSetup ) + { + /* StdVW is found in the private dictionary; */ + /* recompute darkening amounts whenever private dictionary or */ + /* transform change */ + /* Note: a rendering flag turns darkening on or off, so we want to */ + /* store the `on' amounts; */ + /* darkening amount is computed in character space */ + /* TODO: testing size-dependent darkening here; */ + /* what to do for rotations? */ + + CF2_Fixed emRatio; + CF2_Fixed stdHW; + CF2_Int unitsPerEm = font->unitsPerEm; + + + if ( unitsPerEm == 0 ) + unitsPerEm = 1000; + + ppem = FT_MAX( cf2_intToFixed( 4 ), + font->ppem ); /* use minimum ppem of 4 */ + +#if 0 + /* since vstem is measured in the x-direction, we use the `a' member */ + /* of the fontMatrix */ + emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->a ); +#endif + + /* Freetype does not preserve the fontMatrix when parsing; use */ + /* unitsPerEm instead. */ + /* TODO: check precision of this */ + emRatio = cf2_intToFixed( 1000 ) / unitsPerEm; + font->stdVW = cf2_getStdVW( decoder ); + + if ( font->stdVW <= 0 ) + font->stdVW = FT_DivFix( cf2_intToFixed( 75 ), emRatio ); + + if ( boldenX > 0 ) + { + /* Ensure that boldenX is at least 1 pixel for synthetic bold font */ + /* (similar to what Avalon does) */ + boldenX = FT_MAX( boldenX, + FT_DivFix( cf2_intToFixed( unitsPerEm ), ppem ) ); + + /* Synthetic emboldening adds at least 1 pixel to darkenX, while */ + /* stem darkening adds at most half pixel. Since the purpose of */ + /* stem darkening (readability at small sizes) is met with */ + /* synthetic emboldening, no need to add stem darkening for a */ + /* synthetic bold font. */ + cf2_computeDarkening( emRatio, + ppem, + font->stdVW, + &font->darkenX, + boldenX, + FALSE, + font->darkenParams ); + } + else + cf2_computeDarkening( emRatio, + ppem, + font->stdVW, + &font->darkenX, + 0, + font->stemDarkened, + font->darkenParams ); + +#if 0 + /* since hstem is measured in the y-direction, we use the `d' member */ + /* of the fontMatrix */ + /* TODO: use the same units per em as above; check this */ + emRatio = cf2_fixedFracMul( cf2_intToFixed( 1000 ), fontMatrix->d ); +#endif + + /* set the default stem width, because it must be the same for all */ + /* family members; */ + /* choose a constant for StdHW that depends on font contrast */ + stdHW = cf2_getStdHW( decoder ); + + if ( stdHW > 0 && font->stdVW > MUL_INT32( 2, stdHW ) ) + font->stdHW = FT_DivFix( cf2_intToFixed( 75 ), emRatio ); + else + { + /* low contrast font gets less hstem darkening */ + font->stdHW = FT_DivFix( cf2_intToFixed( 110 ), emRatio ); + } + + cf2_computeDarkening( emRatio, + ppem, + font->stdHW, + &font->darkenY, + boldenY, + font->stemDarkened, + font->darkenParams ); + + if ( font->darkenX != 0 || font->darkenY != 0 ) + font->darkened = TRUE; + else + font->darkened = FALSE; + + font->reverseWinding = FALSE; /* initial expectation is CCW */ + + /* compute blue zones for this instance */ + cf2_blues_init( &font->blues, font ); + + } /* needExtraSetup */ + } + + + /* equivalent to AdobeGetOutline */ + FT_LOCAL_DEF( FT_Error ) + cf2_getGlyphOutline( CF2_Font font, + CF2_Buffer charstring, + const CF2_Matrix* transform, + CF2_F16Dot16* glyphWidth ) + { + FT_Error lastError = FT_Err_Ok; + + FT_Vector translation; + +#if 0 + FT_Vector advancePoint; +#endif + + CF2_Fixed advWidth = 0; + FT_Bool needWinding; + + + /* Note: use both integer and fraction for outlines. This allows bbox */ + /* to come out directly. */ + + translation.x = transform->tx; + translation.y = transform->ty; + + /* set up values based on transform */ + cf2_font_setup( font, transform ); + if ( font->error ) + goto exit; /* setup encountered an error */ + + /* reset darken direction */ + font->reverseWinding = FALSE; + + /* winding order only affects darkening */ + needWinding = font->darkened; + + while ( 1 ) + { + /* reset output buffer */ + cf2_outline_reset( &font->outline ); + + /* build the outline, passing the full translation */ + cf2_interpT2CharString( font, + charstring, + (CF2_OutlineCallbacks)&font->outline, + &translation, + FALSE, + 0, + 0, + &advWidth ); + + if ( font->error ) + goto exit; + + if ( !needWinding ) + break; + + /* check winding order */ + if ( font->outline.root.windingMomentum >= 0 ) /* CFF is CCW */ + break; + + /* invert darkening and render again */ + /* TODO: this should be a parameter to getOutline-computeOffset */ + font->reverseWinding = TRUE; + + needWinding = FALSE; /* exit after next iteration */ + } + + /* finish storing client outline */ + cf2_outline_close( &font->outline ); + + exit: + /* FreeType just wants the advance width; there is no translation */ + *glyphWidth = advWidth; + + /* free resources and collect errors from objects we've used */ + cf2_setError( &font->error, lastError ); + + return font->error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psfont.h b/vendor/FreeType2/src/psaux/psfont.h new file mode 100644 index 0000000..e611ac4 --- /dev/null +++ b/vendor/FreeType2/src/psaux/psfont.h @@ -0,0 +1,134 @@ +/***************************************************************************/ +/* */ +/* psfont.h */ +/* */ +/* Adobe's code for font instances (specification). */ +/* */ +/* Copyright 2007-2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#ifndef PSFONT_H_ +#define PSFONT_H_ + + +#include FT_SERVICE_CFF_TABLE_LOAD_H + +#include "psft.h" +#include "psblues.h" + + +FT_BEGIN_HEADER + + +#define CF2_OPERAND_STACK_SIZE 48 +#define CF2_MAX_SUBR 16 /* maximum subroutine nesting; */ + /* only 10 are allowed but there exist */ + /* fonts like `HiraKakuProN-W3.ttf' */ + /* (Hiragino Kaku Gothic ProN W3; */ + /* 8.2d6e1; 2014-12-19) that exceed */ + /* this limit */ +#define CF2_STORAGE_SIZE 32 + + + /* typedef is in `cf2glue.h' */ + struct CF2_FontRec_ + { + FT_Memory memory; + FT_Error error; /* shared error for this instance */ + + FT_Bool isT1; + FT_Bool isCFF2; + CF2_RenderingFlags renderingFlags; + + /* variables that depend on Transform: */ + /* the following have zero translation; */ + /* inner * outer = font * original */ + + CF2_Matrix currentTransform; /* original client matrix */ + CF2_Matrix innerTransform; /* for hinting; erect, scaled */ + CF2_Matrix outerTransform; /* post hinting; includes rotations */ + CF2_Fixed ppem; /* transform-dependent */ + + /* variation data */ + CFF_BlendRec blend; /* cached charstring blend vector */ + CF2_UInt vsindex; /* current vsindex */ + CF2_UInt lenNDV; /* current length NDV or zero */ + FT_Fixed* NDV; /* ptr to current NDV or NULL */ + + CF2_Int unitsPerEm; + + CF2_Fixed syntheticEmboldeningAmountX; /* character space units */ + CF2_Fixed syntheticEmboldeningAmountY; /* character space units */ + + /* FreeType related members */ + CF2_OutlineRec outline; /* freetype glyph outline functions */ + PS_Decoder* decoder; + CFF_SubFont lastSubfont; /* FreeType parsed data; */ + /* top font or subfont */ + + /* these flags can vary from one call to the next */ + FT_Bool hinted; + FT_Bool darkened; /* true if stemDarkened or synthetic bold */ + /* i.e. darkenX != 0 || darkenY != 0 */ + FT_Bool stemDarkened; + + FT_Int darkenParams[8]; /* 1000 unit character space */ + + /* variables that depend on both FontDict and Transform */ + CF2_Fixed stdVW; /* in character space; depends on dict entry */ + CF2_Fixed stdHW; /* in character space; depends on dict entry */ + CF2_Fixed darkenX; /* character space units */ + CF2_Fixed darkenY; /* depends on transform */ + /* and private dict (StdVW) */ + FT_Bool reverseWinding; /* darken assuming */ + /* counterclockwise winding */ + + CF2_BluesRec blues; /* computed zone data */ + + FT_Service_CFFLoad cffload; /* pointer to cff functions */ + }; + + + FT_LOCAL( FT_Error ) + cf2_getGlyphOutline( CF2_Font font, + CF2_Buffer charstring, + const CF2_Matrix* transform, + CF2_F16Dot16* glyphWidth ); + + +FT_END_HEADER + + +#endif /* PSFONT_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psft.c b/vendor/FreeType2/src/psaux/psft.c new file mode 100644 index 0000000..1f75017 --- /dev/null +++ b/vendor/FreeType2/src/psaux/psft.c @@ -0,0 +1,890 @@ +/***************************************************************************/ +/* */ +/* psft.c */ +/* */ +/* FreeType Glue Component to Adobe's Interpreter (body). */ +/* */ +/* Copyright 2013-2014 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#include "psft.h" +#include FT_INTERNAL_DEBUG_H + +#include "psfont.h" +#include "pserror.h" +#include "psobjs.h" +#include "cffdecode.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#endif + +#include FT_SERVICE_CFF_TABLE_LOAD_H + + +#define CF2_MAX_SIZE cf2_intToFixed( 2000 ) /* max ppem */ + + + /* + * This check should avoid most internal overflow cases. Clients should + * generally respond to `Glyph_Too_Big' by getting a glyph outline + * at EM size, scaling it and filling it as a graphics operation. + * + */ + static FT_Error + cf2_checkTransform( const CF2_Matrix* transform, + CF2_Int unitsPerEm ) + { + CF2_Fixed maxScale; + + + FT_ASSERT( unitsPerEm > 0 ); + + if ( transform->a <= 0 || transform->d <= 0 ) + return FT_THROW( Invalid_Size_Handle ); + + FT_ASSERT( transform->b == 0 && transform->c == 0 ); + FT_ASSERT( transform->tx == 0 && transform->ty == 0 ); + + if ( unitsPerEm > 0x7FFF ) + return FT_THROW( Glyph_Too_Big ); + + maxScale = FT_DivFix( CF2_MAX_SIZE, cf2_intToFixed( unitsPerEm ) ); + + if ( transform->a > maxScale || transform->d > maxScale ) + return FT_THROW( Glyph_Too_Big ); + + return FT_Err_Ok; + } + + + static void + cf2_setGlyphWidth( CF2_Outline outline, + CF2_Fixed width ) + { + PS_Decoder* decoder = outline->decoder; + + + FT_ASSERT( decoder ); + + if ( !decoder->builder.is_t1 ) + *decoder->glyph_width = cf2_fixedToInt( width ); + } + + + /* Clean up font instance. */ + static void + cf2_free_instance( void* ptr ) + { + CF2_Font font = (CF2_Font)ptr; + + + if ( font ) + { + FT_Memory memory = font->memory; + + + FT_FREE( font->blend.lastNDV ); + FT_FREE( font->blend.BV ); + } + } + + + /********************************************/ + /* */ + /* functions for handling client outline; */ + /* FreeType uses coordinates in 26.6 format */ + /* */ + /********************************************/ + + static void + cf2_builder_moveTo( CF2_OutlineCallbacks callbacks, + const CF2_CallbackParams params ) + { + /* downcast the object pointer */ + CF2_Outline outline = (CF2_Outline)callbacks; + PS_Builder* builder; + + (void)params; /* only used in debug mode */ + + + FT_ASSERT( outline && outline->decoder ); + FT_ASSERT( params->op == CF2_PathOpMoveTo ); + + builder = &outline->decoder->builder; + + /* note: two successive moves simply close the contour twice */ + ps_builder_close_contour( builder ); + builder->path_begun = 0; + } + + + static void + cf2_builder_lineTo( CF2_OutlineCallbacks callbacks, + const CF2_CallbackParams params ) + { + FT_Error error; + + /* downcast the object pointer */ + CF2_Outline outline = (CF2_Outline)callbacks; + PS_Builder* builder; + + + FT_ASSERT( outline && outline->decoder ); + FT_ASSERT( params->op == CF2_PathOpLineTo ); + + builder = &outline->decoder->builder; + + if ( !builder->path_begun ) + { + /* record the move before the line; also check points and set */ + /* `path_begun' */ + error = ps_builder_start_point( builder, + params->pt0.x, + params->pt0.y ); + if ( error ) + { + if ( !*callbacks->error ) + *callbacks->error = error; + return; + } + } + + /* `ps_builder_add_point1' includes a check_points call for one point */ + error = ps_builder_add_point1( builder, + params->pt1.x, + params->pt1.y ); + if ( error ) + { + if ( !*callbacks->error ) + *callbacks->error = error; + return; + } + } + + + static void + cf2_builder_cubeTo( CF2_OutlineCallbacks callbacks, + const CF2_CallbackParams params ) + { + FT_Error error; + + /* downcast the object pointer */ + CF2_Outline outline = (CF2_Outline)callbacks; + PS_Builder* builder; + + + FT_ASSERT( outline && outline->decoder ); + FT_ASSERT( params->op == CF2_PathOpCubeTo ); + + builder = &outline->decoder->builder; + + if ( !builder->path_begun ) + { + /* record the move before the line; also check points and set */ + /* `path_begun' */ + error = ps_builder_start_point( builder, + params->pt0.x, + params->pt0.y ); + if ( error ) + { + if ( !*callbacks->error ) + *callbacks->error = error; + return; + } + } + + /* prepare room for 3 points: 2 off-curve, 1 on-curve */ + error = ps_builder_check_points( builder, 3 ); + if ( error ) + { + if ( !*callbacks->error ) + *callbacks->error = error; + return; + } + + ps_builder_add_point( builder, + params->pt1.x, + params->pt1.y, 0 ); + ps_builder_add_point( builder, + params->pt2.x, + params->pt2.y, 0 ); + ps_builder_add_point( builder, + params->pt3.x, + params->pt3.y, 1 ); + } + + + static void + cf2_outline_init( CF2_Outline outline, + FT_Memory memory, + FT_Error* error ) + { + FT_ZERO( outline ); + + outline->root.memory = memory; + outline->root.error = error; + + outline->root.moveTo = cf2_builder_moveTo; + outline->root.lineTo = cf2_builder_lineTo; + outline->root.cubeTo = cf2_builder_cubeTo; + } + + + /* get scaling and hint flag from GlyphSlot */ + static void + cf2_getScaleAndHintFlag( PS_Decoder* decoder, + CF2_Fixed* x_scale, + CF2_Fixed* y_scale, + FT_Bool* hinted, + FT_Bool* scaled ) + { + FT_ASSERT( decoder && decoder->builder.glyph ); + + /* note: FreeType scale includes a factor of 64 */ + *hinted = decoder->builder.glyph->hint; + *scaled = decoder->builder.glyph->scaled; + + if ( *hinted ) + { + *x_scale = ADD_INT32( decoder->builder.glyph->x_scale, 32 ) / 64; + *y_scale = ADD_INT32( decoder->builder.glyph->y_scale, 32 ) / 64; + } + else + { + /* for unhinted outlines, `cff_slot_load' does the scaling, */ + /* thus render at `unity' scale */ + + *x_scale = 0x0400; /* 1/64 as 16.16 */ + *y_scale = 0x0400; + } + } + + + /* get units per em from `FT_Face' */ + /* TODO: should handle font matrix concatenation? */ + static FT_UShort + cf2_getUnitsPerEm( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->builder.face ); + FT_ASSERT( decoder->builder.face->units_per_EM ); + + return decoder->builder.face->units_per_EM; + } + + + /* Main entry point: Render one glyph. */ + FT_LOCAL_DEF( FT_Error ) + cf2_decoder_parse_charstrings( PS_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len ) + { + FT_Memory memory; + FT_Error error = FT_Err_Ok; + CF2_Font font; + + FT_Bool is_t1 = decoder->builder.is_t1; + + + FT_ASSERT( decoder && + ( is_t1 || decoder->cff ) ); + + if ( is_t1 && !decoder->current_subfont ) + { + FT_ERROR(( "cf2_decoder_parse_charstrings (Type 1): " + "SubFont missing. Use `t1_make_subfont' first\n" )); + return FT_THROW( Invalid_Table ); + } + + memory = decoder->builder.memory; + + /* CF2 data is saved here across glyphs */ + font = (CF2_Font)decoder->cf2_instance->data; + + /* on first glyph, allocate instance structure */ + if ( !decoder->cf2_instance->data ) + { + decoder->cf2_instance->finalizer = + (FT_Generic_Finalizer)cf2_free_instance; + + if ( FT_ALLOC( decoder->cf2_instance->data, + sizeof ( CF2_FontRec ) ) ) + return FT_THROW( Out_Of_Memory ); + + font = (CF2_Font)decoder->cf2_instance->data; + + font->memory = memory; + + if ( !is_t1 ) + font->cffload = (FT_Service_CFFLoad)decoder->cff->cffload; + + /* initialize a client outline, to be shared by each glyph rendered */ + cf2_outline_init( &font->outline, font->memory, &font->error ); + } + + /* save decoder; it is a stack variable and will be different on each */ + /* call */ + font->decoder = decoder; + font->outline.decoder = decoder; + + { + /* build parameters for Adobe engine */ + + PS_Builder* builder = &decoder->builder; + PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( builder->face ); + + FT_Bool no_stem_darkening_driver = + driver->no_stem_darkening; + FT_Char no_stem_darkening_font = + builder->face->internal->no_stem_darkening; + + /* local error */ + FT_Error error2 = FT_Err_Ok; + CF2_BufferRec buf; + CF2_Matrix transform; + CF2_F16Dot16 glyphWidth; + + FT_Bool hinted; + FT_Bool scaled; + + + /* FreeType has already looked up the GID; convert to */ + /* `RegionBuffer', assuming that the input has been validated */ + FT_ASSERT( charstring_base + charstring_len >= charstring_base ); + + FT_ZERO( &buf ); + buf.start = + buf.ptr = charstring_base; + buf.end = charstring_base + charstring_len; + + FT_ZERO( &transform ); + + cf2_getScaleAndHintFlag( decoder, + &transform.a, + &transform.d, + &hinted, + &scaled ); + + if ( is_t1 ) + font->isCFF2 = FALSE; + else + { + /* copy isCFF2 boolean from TT_Face to CF2_Font */ + font->isCFF2 = ((TT_Face)builder->face)->is_cff2; + } + font->isT1 = is_t1; + + font->renderingFlags = 0; + if ( hinted ) + font->renderingFlags |= CF2_FlagsHinted; + if ( scaled && ( !no_stem_darkening_font || + ( no_stem_darkening_font < 0 && + !no_stem_darkening_driver ) ) ) + font->renderingFlags |= CF2_FlagsDarkened; + + font->darkenParams[0] = driver->darken_params[0]; + font->darkenParams[1] = driver->darken_params[1]; + font->darkenParams[2] = driver->darken_params[2]; + font->darkenParams[3] = driver->darken_params[3]; + font->darkenParams[4] = driver->darken_params[4]; + font->darkenParams[5] = driver->darken_params[5]; + font->darkenParams[6] = driver->darken_params[6]; + font->darkenParams[7] = driver->darken_params[7]; + + /* now get an outline for this glyph; */ + /* also get units per em to validate scale */ + font->unitsPerEm = (CF2_Int)cf2_getUnitsPerEm( decoder ); + + if ( scaled ) + { + error2 = cf2_checkTransform( &transform, font->unitsPerEm ); + if ( error2 ) + return error2; + } + + error2 = cf2_getGlyphOutline( font, &buf, &transform, &glyphWidth ); + if ( error2 ) + return FT_ERR( Invalid_File_Format ); + + cf2_setGlyphWidth( &font->outline, glyphWidth ); + + return FT_Err_Ok; + } + } + + + /* get pointer to current FreeType subfont (based on current glyphID) */ + FT_LOCAL_DEF( CFF_SubFont ) + cf2_getSubfont( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + return decoder->current_subfont; + } + + + /* get pointer to VStore structure */ + FT_LOCAL_DEF( CFF_VStore ) + cf2_getVStore( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->cff ); + + return &decoder->cff->vstore; + } + + + /* get maxstack value from CFF2 Top DICT */ + FT_LOCAL_DEF( FT_UInt ) + cf2_getMaxstack( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->cff ); + + return decoder->cff->top_font.font_dict.maxstack; + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* Get normalized design vector for current render request; */ + /* return pointer and length. */ + /* */ + /* Note: Uses FT_Fixed not CF2_Fixed for the vector. */ + FT_LOCAL_DEF( FT_Error ) + cf2_getNormalizedVector( PS_Decoder* decoder, + CF2_UInt *len, + FT_Fixed* *vec ) + { + TT_Face face; + FT_Service_MultiMasters mm; + + + FT_ASSERT( decoder && decoder->builder.face ); + FT_ASSERT( vec && len ); + FT_ASSERT( !decoder->builder.is_t1 ); + + face = (TT_Face)decoder->builder.face; + mm = (FT_Service_MultiMasters)face->mm; + + return mm->get_var_blend( FT_FACE( face ), len, NULL, vec, NULL ); + } +#endif + + + /* get `y_ppem' from `CFF_Size' */ + FT_LOCAL_DEF( CF2_Fixed ) + cf2_getPpemY( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && + decoder->builder.face && + decoder->builder.face->size ); + + /* + * Note that `y_ppem' can be zero if there wasn't a call to + * `FT_Set_Char_Size' or something similar. However, this isn't a + * problem since we come to this place in the code only if + * FT_LOAD_NO_SCALE is set (the other case gets caught by + * `cf2_checkTransform'). The ppem value is needed to compute the stem + * darkening, which is disabled for getting the unscaled outline. + * + */ + return cf2_intToFixed( + decoder->builder.face->size->metrics.y_ppem ); + } + + + /* get standard stem widths for the current subfont; */ + /* FreeType stores these as integer font units */ + /* (note: variable names seem swapped) */ + FT_LOCAL_DEF( CF2_Fixed ) + cf2_getStdVW( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + return cf2_intToFixed( + decoder->current_subfont->private_dict.standard_height ); + } + + + FT_LOCAL_DEF( CF2_Fixed ) + cf2_getStdHW( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + return cf2_intToFixed( + decoder->current_subfont->private_dict.standard_width ); + } + + + /* note: FreeType stores 1000 times the actual value for `BlueScale' */ + FT_LOCAL_DEF( void ) + cf2_getBlueMetrics( PS_Decoder* decoder, + CF2_Fixed* blueScale, + CF2_Fixed* blueShift, + CF2_Fixed* blueFuzz ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + *blueScale = FT_DivFix( + decoder->current_subfont->private_dict.blue_scale, + cf2_intToFixed( 1000 ) ); + *blueShift = cf2_intToFixed( + decoder->current_subfont->private_dict.blue_shift ); + *blueFuzz = cf2_intToFixed( + decoder->current_subfont->private_dict.blue_fuzz ); + } + + + /* get blue values counts and arrays; the FreeType parser has validated */ + /* the counts and verified that each is an even number */ + FT_LOCAL_DEF( void ) + cf2_getBlueValues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + *count = decoder->current_subfont->private_dict.num_blue_values; + *data = (FT_Pos*) + &decoder->current_subfont->private_dict.blue_values; + } + + + FT_LOCAL_DEF( void ) + cf2_getOtherBlues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + *count = decoder->current_subfont->private_dict.num_other_blues; + *data = (FT_Pos*) + &decoder->current_subfont->private_dict.other_blues; + } + + + FT_LOCAL_DEF( void ) + cf2_getFamilyBlues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + *count = decoder->current_subfont->private_dict.num_family_blues; + *data = (FT_Pos*) + &decoder->current_subfont->private_dict.family_blues; + } + + + FT_LOCAL_DEF( void ) + cf2_getFamilyOtherBlues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + *count = decoder->current_subfont->private_dict.num_family_other_blues; + *data = (FT_Pos*) + &decoder->current_subfont->private_dict.family_other_blues; + } + + + FT_LOCAL_DEF( CF2_Int ) + cf2_getLanguageGroup( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + return decoder->current_subfont->private_dict.language_group; + } + + + /* convert unbiased subroutine index to `CF2_Buffer' and */ + /* return 0 on success */ + FT_LOCAL_DEF( CF2_Int ) + cf2_initGlobalRegionBuffer( PS_Decoder* decoder, + CF2_Int subrNum, + CF2_Buffer buf ) + { + CF2_UInt idx; + + + FT_ASSERT( decoder ); + + FT_ZERO( buf ); + + idx = (CF2_UInt)( subrNum + decoder->globals_bias ); + if ( idx >= decoder->num_globals ) + return TRUE; /* error */ + + FT_ASSERT( decoder->globals ); + + buf->start = + buf->ptr = decoder->globals[idx]; + buf->end = decoder->globals[idx + 1]; + + return FALSE; /* success */ + } + + + /* convert AdobeStandardEncoding code to CF2_Buffer; */ + /* used for seac component */ + FT_LOCAL_DEF( FT_Error ) + cf2_getSeacComponent( PS_Decoder* decoder, + CF2_Int code, + CF2_Buffer buf ) + { + CF2_Int gid; + FT_Byte* charstring; + FT_ULong len; + FT_Error error; + + + FT_ASSERT( decoder ); + FT_ASSERT( !decoder->builder.is_t1 ); + + FT_ZERO( buf ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* Incremental fonts don't necessarily have valid charsets. */ + /* They use the character code, not the glyph index, in this case. */ + if ( decoder->builder.face->internal->incremental_interface ) + gid = code; + else +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + gid = cff_lookup_glyph_by_stdcharcode( decoder->cff, code ); + if ( gid < 0 ) + return FT_THROW( Invalid_Glyph_Format ); + } + + error = decoder->get_glyph_callback( (TT_Face)decoder->builder.face, + (CF2_UInt)gid, + &charstring, + &len ); + /* TODO: for now, just pass the FreeType error through */ + if ( error ) + return error; + + /* assume input has been validated */ + FT_ASSERT( charstring + len >= charstring ); + + buf->start = charstring; + buf->end = charstring + len; + buf->ptr = buf->start; + + return FT_Err_Ok; + } + + + FT_LOCAL_DEF( void ) + cf2_freeSeacComponent( PS_Decoder* decoder, + CF2_Buffer buf ) + { + FT_ASSERT( decoder ); + FT_ASSERT( !decoder->builder.is_t1 ); + + decoder->free_glyph_callback( (TT_Face)decoder->builder.face, + (FT_Byte**)&buf->start, + (FT_ULong)( buf->end - buf->start ) ); + } + + + FT_LOCAL_DEF( FT_Error ) + cf2_getT1SeacComponent( PS_Decoder* decoder, + FT_UInt glyph_index, + CF2_Buffer buf ) + { + FT_Data glyph_data; + FT_Error error = FT_Err_Ok; + T1_Face face = (T1_Face)decoder->builder.face; + T1_Font type1 = &face->type1; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_Incremental_InterfaceRec *inc = + face->root.internal->incremental_interface; + + + /* For incremental fonts get the character data using the */ + /* callback function. */ + if ( inc ) + error = inc->funcs->get_glyph_data( inc->object, + glyph_index, &glyph_data ); + else +#endif + /* For ordinary fonts get the character data stored in the face record. */ + { + glyph_data.pointer = type1->charstrings[glyph_index]; + glyph_data.length = (FT_Int)type1->charstrings_len[glyph_index]; + } + + if ( !error ) + { + FT_Byte* charstring_base = (FT_Byte*)glyph_data.pointer; + FT_ULong charstring_len = (FT_ULong)glyph_data.length; + + + FT_ASSERT( charstring_base + charstring_len >= charstring_base ); + + FT_ZERO( buf ); + buf->start = + buf->ptr = charstring_base; + buf->end = charstring_base + charstring_len; + } + + return error; + } + + + FT_LOCAL_DEF( void ) + cf2_freeT1SeacComponent( PS_Decoder* decoder, + CF2_Buffer buf ) + { + T1_Face face; + FT_Data data; + + + FT_ASSERT( decoder ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + face = (T1_Face)decoder->builder.face; + + data.pointer = buf->start; + data.length = (FT_Int)( buf->end - buf->start ); + + if ( face->root.internal->incremental_interface ) + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, + &data ); +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + } + + + FT_LOCAL_DEF( CF2_Int ) + cf2_initLocalRegionBuffer( PS_Decoder* decoder, + CF2_Int subrNum, + CF2_Buffer buf ) + { + CF2_UInt idx; + + + FT_ASSERT( decoder ); + + FT_ZERO( buf ); + + idx = (CF2_UInt)( subrNum + decoder->locals_bias ); + if ( idx >= decoder->num_locals ) + return TRUE; /* error */ + + FT_ASSERT( decoder->locals ); + + buf->start = decoder->locals[idx]; + + if ( decoder->builder.is_t1 ) + { + /* The Type 1 driver stores subroutines without the seed bytes. */ + /* The CID driver stores subroutines with seed bytes. This */ + /* case is taken care of when decoder->subrs_len == 0. */ + if ( decoder->locals_len ) + buf->end = buf->start + decoder->locals_len[idx]; + else + { + /* We are using subroutines from a CID font. We must adjust */ + /* for the seed bytes. */ + buf->start += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 ); + buf->end = decoder->locals[idx + 1]; + } + + if ( !buf->start ) + { + FT_ERROR(( "cf2_initLocalRegionBuffer (Type 1 mode):" + " invoking empty subrs\n" )); + } + } + else + { + buf->end = decoder->locals[idx + 1]; + } + + buf->ptr = buf->start; + + return FALSE; /* success */ + } + + + FT_LOCAL_DEF( CF2_Fixed ) + cf2_getDefaultWidthX( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + return cf2_intToFixed( + decoder->current_subfont->private_dict.default_width ); + } + + + FT_LOCAL_DEF( CF2_Fixed ) + cf2_getNominalWidthX( PS_Decoder* decoder ) + { + FT_ASSERT( decoder && decoder->current_subfont ); + + return cf2_intToFixed( + decoder->current_subfont->private_dict.nominal_width ); + } + + + FT_LOCAL_DEF( void ) + cf2_outline_reset( CF2_Outline outline ) + { + PS_Decoder* decoder = outline->decoder; + + + FT_ASSERT( decoder ); + + outline->root.windingMomentum = 0; + + FT_GlyphLoader_Rewind( decoder->builder.loader ); + } + + + FT_LOCAL_DEF( void ) + cf2_outline_close( CF2_Outline outline ) + { + PS_Decoder* decoder = outline->decoder; + + + FT_ASSERT( decoder ); + + ps_builder_close_contour( &decoder->builder ); + + FT_GlyphLoader_Add( decoder->builder.loader ); + } + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psft.h b/vendor/FreeType2/src/psaux/psft.h new file mode 100644 index 0000000..ab17211 --- /dev/null +++ b/vendor/FreeType2/src/psaux/psft.h @@ -0,0 +1,167 @@ +/***************************************************************************/ +/* */ +/* psft.h */ +/* */ +/* FreeType Glue Component to Adobe's Interpreter (specification). */ +/* */ +/* Copyright 2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#ifndef PSFT_H_ +#define PSFT_H_ + + +#include "pstypes.h" + + + /* TODO: disable asserts for now */ +#define CF2_NDEBUG + + +#include FT_SYSTEM_H + +#include "psglue.h" +#include FT_INTERNAL_POSTSCRIPT_AUX_H /* for PS_Decoder */ + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + cf2_decoder_parse_charstrings( PS_Decoder* decoder, + FT_Byte* charstring_base, + FT_ULong charstring_len ); + + FT_LOCAL( CFF_SubFont ) + cf2_getSubfont( PS_Decoder* decoder ); + + FT_LOCAL( CFF_VStore ) + cf2_getVStore( PS_Decoder* decoder ); + + FT_LOCAL( FT_UInt ) + cf2_getMaxstack( PS_Decoder* decoder ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_LOCAL( FT_Error ) + cf2_getNormalizedVector( PS_Decoder* decoder, + CF2_UInt *len, + FT_Fixed* *vec ); +#endif + + FT_LOCAL( CF2_Fixed ) + cf2_getPpemY( PS_Decoder* decoder ); + FT_LOCAL( CF2_Fixed ) + cf2_getStdVW( PS_Decoder* decoder ); + FT_LOCAL( CF2_Fixed ) + cf2_getStdHW( PS_Decoder* decoder ); + + FT_LOCAL( void ) + cf2_getBlueMetrics( PS_Decoder* decoder, + CF2_Fixed* blueScale, + CF2_Fixed* blueShift, + CF2_Fixed* blueFuzz ); + FT_LOCAL( void ) + cf2_getBlueValues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ); + FT_LOCAL( void ) + cf2_getOtherBlues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ); + FT_LOCAL( void ) + cf2_getFamilyBlues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ); + FT_LOCAL( void ) + cf2_getFamilyOtherBlues( PS_Decoder* decoder, + size_t* count, + FT_Pos* *data ); + + FT_LOCAL( CF2_Int ) + cf2_getLanguageGroup( PS_Decoder* decoder ); + + FT_LOCAL( CF2_Int ) + cf2_initGlobalRegionBuffer( PS_Decoder* decoder, + CF2_Int subrNum, + CF2_Buffer buf ); + FT_LOCAL( FT_Error ) + cf2_getSeacComponent( PS_Decoder* decoder, + CF2_Int code, + CF2_Buffer buf ); + FT_LOCAL( void ) + cf2_freeSeacComponent( PS_Decoder* decoder, + CF2_Buffer buf ); + FT_LOCAL( CF2_Int ) + cf2_initLocalRegionBuffer( PS_Decoder* decoder, + CF2_Int subrNum, + CF2_Buffer buf ); + + FT_LOCAL( CF2_Fixed ) + cf2_getDefaultWidthX( PS_Decoder* decoder ); + FT_LOCAL( CF2_Fixed ) + cf2_getNominalWidthX( PS_Decoder* decoder ); + + + FT_LOCAL( FT_Error ) + cf2_getT1SeacComponent( PS_Decoder* decoder, + FT_UInt glyph_index, + CF2_Buffer buf ); + FT_LOCAL( void ) + cf2_freeT1SeacComponent( PS_Decoder* decoder, + CF2_Buffer buf ); + + /* + * FreeType client outline + * + * process output from the charstring interpreter + */ + typedef struct CF2_OutlineRec_ + { + CF2_OutlineCallbacksRec root; /* base class must be first */ + PS_Decoder* decoder; + + } CF2_OutlineRec, *CF2_Outline; + + + FT_LOCAL( void ) + cf2_outline_reset( CF2_Outline outline ); + FT_LOCAL( void ) + cf2_outline_close( CF2_Outline outline ); + + +FT_END_HEADER + + +#endif /* PSFT_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psglue.h b/vendor/FreeType2/src/psaux/psglue.h new file mode 100644 index 0000000..5545e12 --- /dev/null +++ b/vendor/FreeType2/src/psaux/psglue.h @@ -0,0 +1,144 @@ +/***************************************************************************/ +/* */ +/* psglue.h */ +/* */ +/* Adobe's code for shared stuff (specification only). */ +/* */ +/* Copyright 2007-2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#ifndef PSGLUE_H_ +#define PSGLUE_H_ + + +/* common includes for other modules */ +#include "pserror.h" +#include "psfixed.h" +#include "psarrst.h" +#include "psread.h" + + +FT_BEGIN_HEADER + + + /* rendering parameters */ + + /* apply hints to rendered glyphs */ +#define CF2_FlagsHinted 1 + /* for testing */ +#define CF2_FlagsDarkened 2 + + /* type for holding the flags */ + typedef CF2_Int CF2_RenderingFlags; + + + /* elements of a glyph outline */ + typedef enum CF2_PathOp_ + { + CF2_PathOpMoveTo = 1, /* change the current point */ + CF2_PathOpLineTo = 2, /* line */ + CF2_PathOpQuadTo = 3, /* quadratic curve */ + CF2_PathOpCubeTo = 4 /* cubic curve */ + + } CF2_PathOp; + + + /* a matrix of fixed point values */ + typedef struct CF2_Matrix_ + { + CF2_F16Dot16 a; + CF2_F16Dot16 b; + CF2_F16Dot16 c; + CF2_F16Dot16 d; + CF2_F16Dot16 tx; + CF2_F16Dot16 ty; + + } CF2_Matrix; + + + /* these typedefs are needed by more than one header file */ + /* and gcc compiler doesn't allow redefinition */ + typedef struct CF2_FontRec_ CF2_FontRec, *CF2_Font; + typedef struct CF2_HintRec_ CF2_HintRec, *CF2_Hint; + + + /* A common structure for all callback parameters. */ + /* */ + /* Some members may be unused. For example, `pt0' is not used for */ + /* `moveTo' and `pt3' is not used for `quadTo'. The initial point `pt0' */ + /* is included for each path element for generality; curve conversions */ + /* need it. The `op' parameter allows one function to handle multiple */ + /* element types. */ + + typedef struct CF2_CallbackParamsRec_ + { + FT_Vector pt0; + FT_Vector pt1; + FT_Vector pt2; + FT_Vector pt3; + + CF2_Int op; + + } CF2_CallbackParamsRec, *CF2_CallbackParams; + + + /* forward reference */ + typedef struct CF2_OutlineCallbacksRec_ CF2_OutlineCallbacksRec, + *CF2_OutlineCallbacks; + + /* callback function pointers */ + typedef void + (*CF2_Callback_Type)( CF2_OutlineCallbacks callbacks, + const CF2_CallbackParams params ); + + + struct CF2_OutlineCallbacksRec_ + { + CF2_Callback_Type moveTo; + CF2_Callback_Type lineTo; + CF2_Callback_Type quadTo; + CF2_Callback_Type cubeTo; + + CF2_Int windingMomentum; /* for winding order detection */ + + FT_Memory memory; + FT_Error* error; + }; + + +FT_END_HEADER + + +#endif /* PSGLUE_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/pshints.c b/vendor/FreeType2/src/psaux/pshints.c new file mode 100644 index 0000000..3615196 --- /dev/null +++ b/vendor/FreeType2/src/psaux/pshints.c @@ -0,0 +1,1939 @@ +/***************************************************************************/ +/* */ +/* pshints.c */ +/* */ +/* Adobe's code for handling CFF hints (body). */ +/* */ +/* Copyright 2007-2014 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#include "psft.h" +#include FT_INTERNAL_DEBUG_H + +#include "psglue.h" +#include "psfont.h" +#include "pshints.h" +#include "psintrp.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_cf2hints + + + typedef struct CF2_HintMoveRec_ + { + size_t j; /* index of upper hint map edge */ + CF2_Fixed moveUp; /* adjustment to optimum position */ + + } CF2_HintMoveRec, *CF2_HintMove; + + + /* Compute angular momentum for winding order detection. It is called */ + /* for all lines and curves, but not necessarily in element order. */ + static CF2_Int + cf2_getWindingMomentum( CF2_Fixed x1, + CF2_Fixed y1, + CF2_Fixed x2, + CF2_Fixed y2 ) + { + /* cross product of pt1 position from origin with pt2 position from */ + /* pt1; we reduce the precision so that the result fits into 32 bits */ + + return ( x1 >> 16 ) * ( SUB_INT32( y2, y1 ) >> 16 ) - + ( y1 >> 16 ) * ( SUB_INT32( x2, x1 ) >> 16 ); + } + + + /* + * Construct from a StemHint; this is used as a parameter to + * `cf2_blues_capture'. + * `hintOrigin' is the character space displacement of a seac accent. + * Adjust stem hint for darkening here. + * + */ + static void + cf2_hint_init( CF2_Hint hint, + const CF2_ArrStack stemHintArray, + size_t indexStemHint, + const CF2_Font font, + CF2_Fixed hintOrigin, + CF2_Fixed scale, + FT_Bool bottom ) + { + CF2_Fixed width; + const CF2_StemHintRec* stemHint; + + + FT_ZERO( hint ); + + stemHint = (const CF2_StemHintRec*)cf2_arrstack_getPointer( + stemHintArray, + indexStemHint ); + + width = SUB_INT32( stemHint->max, stemHint->min ); + + if ( width == cf2_intToFixed( -21 ) ) + { + /* ghost bottom */ + + if ( bottom ) + { + hint->csCoord = stemHint->max; + hint->flags = CF2_GhostBottom; + } + else + hint->flags = 0; + } + + else if ( width == cf2_intToFixed( -20 ) ) + { + /* ghost top */ + + if ( bottom ) + hint->flags = 0; + else + { + hint->csCoord = stemHint->min; + hint->flags = CF2_GhostTop; + } + } + + else if ( width < 0 ) + { + /* inverted pair */ + + /* + * Hints with negative widths were produced by an early version of a + * non-Adobe font tool. The Type 2 spec allows edge (ghost) hints + * with negative widths, but says + * + * All other negative widths have undefined meaning. + * + * CoolType has a silent workaround that negates the hint width; for + * permissive mode, we do the same here. + * + * Note: Such fonts cannot use ghost hints, but should otherwise work. + * Note: Some poor hints in our faux fonts can produce negative + * widths at some blends. For example, see a light weight of + * `u' in ASerifMM. + * + */ + if ( bottom ) + { + hint->csCoord = stemHint->max; + hint->flags = CF2_PairBottom; + } + else + { + hint->csCoord = stemHint->min; + hint->flags = CF2_PairTop; + } + } + + else + { + /* normal pair */ + + if ( bottom ) + { + hint->csCoord = stemHint->min; + hint->flags = CF2_PairBottom; + } + else + { + hint->csCoord = stemHint->max; + hint->flags = CF2_PairTop; + } + } + + /* Now that ghost hints have been detected, adjust this edge for */ + /* darkening. Bottoms are not changed; tops are incremented by twice */ + /* `darkenY'. */ + if ( cf2_hint_isTop( hint ) ) + hint->csCoord = ADD_INT32( hint->csCoord, 2 * font->darkenY ); + + hint->csCoord = ADD_INT32( hint->csCoord, hintOrigin ); + hint->scale = scale; + hint->index = indexStemHint; /* index in original stem hint array */ + + /* if original stem hint has been used, use the same position */ + if ( hint->flags != 0 && stemHint->used ) + { + if ( cf2_hint_isTop( hint ) ) + hint->dsCoord = stemHint->maxDS; + else + hint->dsCoord = stemHint->minDS; + + cf2_hint_lock( hint ); + } + else + hint->dsCoord = FT_MulFix( hint->csCoord, scale ); + } + + + /* initialize an invalid hint map element */ + static void + cf2_hint_initZero( CF2_Hint hint ) + { + FT_ZERO( hint ); + } + + + FT_LOCAL_DEF( FT_Bool ) + cf2_hint_isValid( const CF2_Hint hint ) + { + return (FT_Bool)( hint->flags != 0 ); + } + + + static FT_Bool + cf2_hint_isPair( const CF2_Hint hint ) + { + return (FT_Bool)( ( hint->flags & + ( CF2_PairBottom | CF2_PairTop ) ) != 0 ); + } + + + static FT_Bool + cf2_hint_isPairTop( const CF2_Hint hint ) + { + return (FT_Bool)( ( hint->flags & CF2_PairTop ) != 0 ); + } + + + FT_LOCAL_DEF( FT_Bool ) + cf2_hint_isTop( const CF2_Hint hint ) + { + return (FT_Bool)( ( hint->flags & + ( CF2_PairTop | CF2_GhostTop ) ) != 0 ); + } + + + FT_LOCAL_DEF( FT_Bool ) + cf2_hint_isBottom( const CF2_Hint hint ) + { + return (FT_Bool)( ( hint->flags & + ( CF2_PairBottom | CF2_GhostBottom ) ) != 0 ); + } + + + static FT_Bool + cf2_hint_isLocked( const CF2_Hint hint ) + { + return (FT_Bool)( ( hint->flags & CF2_Locked ) != 0 ); + } + + + static FT_Bool + cf2_hint_isSynthetic( const CF2_Hint hint ) + { + return (FT_Bool)( ( hint->flags & CF2_Synthetic ) != 0 ); + } + + + FT_LOCAL_DEF( void ) + cf2_hint_lock( CF2_Hint hint ) + { + hint->flags |= CF2_Locked; + } + + + FT_LOCAL_DEF( void ) + cf2_hintmap_init( CF2_HintMap hintmap, + CF2_Font font, + CF2_HintMap initialMap, + CF2_ArrStack hintMoves, + CF2_Fixed scale ) + { + FT_ZERO( hintmap ); + + /* copy parameters from font instance */ + hintmap->hinted = font->hinted; + hintmap->scale = scale; + hintmap->font = font; + hintmap->initialHintMap = initialMap; + /* will clear in `cf2_hintmap_adjustHints' */ + hintmap->hintMoves = hintMoves; + } + + + static FT_Bool + cf2_hintmap_isValid( const CF2_HintMap hintmap ) + { + return hintmap->isValid; + } + + + static void + cf2_hintmap_dump( CF2_HintMap hintmap ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + CF2_UInt i; + + + FT_TRACE6(( " index csCoord dsCoord scale flags\n" )); + + for ( i = 0; i < hintmap->count; i++ ) + { + CF2_Hint hint = &hintmap->edge[i]; + + + FT_TRACE6(( " %3d %7.2f %7.2f %5d %s%s%s%s\n", + hint->index, + hint->csCoord / 65536.0, + hint->dsCoord / ( hint->scale * 1.0 ), + hint->scale, + ( cf2_hint_isPair( hint ) ? "p" : "g" ), + ( cf2_hint_isTop( hint ) ? "t" : "b" ), + ( cf2_hint_isLocked( hint ) ? "L" : ""), + ( cf2_hint_isSynthetic( hint ) ? "S" : "" ) )); + } +#else + FT_UNUSED( hintmap ); +#endif + } + + + /* transform character space coordinate to device space using hint map */ + static CF2_Fixed + cf2_hintmap_map( CF2_HintMap hintmap, + CF2_Fixed csCoord ) + { + if ( hintmap->count == 0 || ! hintmap->hinted ) + { + /* there are no hints; use uniform scale and zero offset */ + return FT_MulFix( csCoord, hintmap->scale ); + } + else + { + /* start linear search from last hit */ + CF2_UInt i = hintmap->lastIndex; + + + FT_ASSERT( hintmap->lastIndex < CF2_MAX_HINT_EDGES ); + + /* search up */ + while ( i < hintmap->count - 1 && + csCoord >= hintmap->edge[i + 1].csCoord ) + i += 1; + + /* search down */ + while ( i > 0 && csCoord < hintmap->edge[i].csCoord ) + i -= 1; + + hintmap->lastIndex = i; + + if ( i == 0 && csCoord < hintmap->edge[0].csCoord ) + { + /* special case for points below first edge: use uniform scale */ + return ADD_INT32( FT_MulFix( SUB_INT32( csCoord, + hintmap->edge[0].csCoord ), + hintmap->scale ), + hintmap->edge[0].dsCoord ); + } + else + { + /* + * Note: entries with duplicate csCoord are allowed. + * Use edge[i], the highest entry where csCoord >= entry[i].csCoord + */ + return ADD_INT32( FT_MulFix( SUB_INT32( csCoord, + hintmap->edge[i].csCoord ), + hintmap->edge[i].scale ), + hintmap->edge[i].dsCoord ); + } + } + } + + + /* + * This hinting policy moves a hint pair in device space so that one of + * its two edges is on a device pixel boundary (its fractional part is + * zero). `cf2_hintmap_insertHint' guarantees no overlap in CS + * space. Ensure here that there is no overlap in DS. + * + * In the first pass, edges are adjusted relative to adjacent hints. + * Those that are below have already been adjusted. Those that are + * above have not yet been adjusted. If a hint above blocks an + * adjustment to an optimal position, we will try again in a second + * pass. The second pass is top-down. + * + */ + + static void + cf2_hintmap_adjustHints( CF2_HintMap hintmap ) + { + size_t i, j; + + + cf2_arrstack_clear( hintmap->hintMoves ); /* working storage */ + + /* + * First pass is bottom-up (font hint order) without look-ahead. + * Locked edges are already adjusted. + * Unlocked edges begin with dsCoord from `initialHintMap'. + * Save edges that are not optimally adjusted in `hintMoves' array, + * and process them in second pass. + */ + + for ( i = 0; i < hintmap->count; i++ ) + { + FT_Bool isPair = cf2_hint_isPair( &hintmap->edge[i] ); + + + /* index of upper edge (same value for ghost hint) */ + j = isPair ? i + 1 : i; + + FT_ASSERT( j < hintmap->count ); + FT_ASSERT( cf2_hint_isValid( &hintmap->edge[i] ) ); + FT_ASSERT( cf2_hint_isValid( &hintmap->edge[j] ) ); + FT_ASSERT( cf2_hint_isLocked( &hintmap->edge[i] ) == + cf2_hint_isLocked( &hintmap->edge[j] ) ); + + if ( !cf2_hint_isLocked( &hintmap->edge[i] ) ) + { + /* hint edge is not locked, we can adjust it */ + CF2_Fixed fracDown = cf2_fixedFraction( hintmap->edge[i].dsCoord ); + CF2_Fixed fracUp = cf2_fixedFraction( hintmap->edge[j].dsCoord ); + + /* calculate all four possibilities; moves down are negative */ + CF2_Fixed downMoveDown = 0 - fracDown; + CF2_Fixed upMoveDown = 0 - fracUp; + CF2_Fixed downMoveUp = ( fracDown == 0 ) + ? 0 + : cf2_intToFixed( 1 ) - fracDown; + CF2_Fixed upMoveUp = ( fracUp == 0 ) + ? 0 + : cf2_intToFixed( 1 ) - fracUp; + + /* smallest move up */ + CF2_Fixed moveUp = FT_MIN( downMoveUp, upMoveUp ); + /* smallest move down */ + CF2_Fixed moveDown = FT_MAX( downMoveDown, upMoveDown ); + + /* final amount to move edge or edge pair */ + CF2_Fixed move; + + CF2_Fixed downMinCounter = CF2_MIN_COUNTER; + CF2_Fixed upMinCounter = CF2_MIN_COUNTER; + FT_Bool saveEdge = FALSE; + + + /* minimum counter constraint doesn't apply when adjacent edges */ + /* are synthetic */ + /* TODO: doesn't seem a big effect; for now, reduce the code */ +#if 0 + if ( i == 0 || + cf2_hint_isSynthetic( &hintmap->edge[i - 1] ) ) + downMinCounter = 0; + + if ( j >= hintmap->count - 1 || + cf2_hint_isSynthetic( &hintmap->edge[j + 1] ) ) + upMinCounter = 0; +#endif + + /* is there room to move up? */ + /* there is if we are at top of array or the next edge is at or */ + /* beyond proposed move up? */ + if ( j >= hintmap->count - 1 || + hintmap->edge[j + 1].dsCoord >= + ADD_INT32( hintmap->edge[j].dsCoord, + moveUp + upMinCounter ) ) + { + /* there is room to move up; is there also room to move down? */ + if ( i == 0 || + hintmap->edge[i - 1].dsCoord <= + ADD_INT32( hintmap->edge[i].dsCoord, + moveDown - downMinCounter ) ) + { + /* move smaller absolute amount */ + move = ( -moveDown < moveUp ) ? moveDown : moveUp; /* optimum */ + } + else + move = moveUp; + } + else + { + /* is there room to move down? */ + if ( i == 0 || + hintmap->edge[i - 1].dsCoord <= + ADD_INT32( hintmap->edge[i].dsCoord, + moveDown - downMinCounter ) ) + { + move = moveDown; + /* true if non-optimum move */ + saveEdge = (FT_Bool)( moveUp < -moveDown ); + } + else + { + /* no room to move either way without overlapping or reducing */ + /* the counter too much */ + move = 0; + saveEdge = TRUE; + } + } + + /* Identify non-moves and moves down that aren't optimal, and save */ + /* them for second pass. */ + /* Do this only if there is an unlocked edge above (which could */ + /* possibly move). */ + if ( saveEdge && + j < hintmap->count - 1 && + !cf2_hint_isLocked( &hintmap->edge[j + 1] ) ) + { + CF2_HintMoveRec savedMove; + + + savedMove.j = j; + /* desired adjustment in second pass */ + savedMove.moveUp = moveUp - move; + + cf2_arrstack_push( hintmap->hintMoves, &savedMove ); + } + + /* move the edge(s) */ + hintmap->edge[i].dsCoord = ADD_INT32( hintmap->edge[i].dsCoord, + move ); + if ( isPair ) + hintmap->edge[j].dsCoord = ADD_INT32( hintmap->edge[j].dsCoord, + move ); + } + + /* assert there are no overlaps in device space */ + FT_ASSERT( i == 0 || + hintmap->edge[i - 1].dsCoord <= hintmap->edge[i].dsCoord ); + FT_ASSERT( i < j || + hintmap->edge[i].dsCoord <= hintmap->edge[j].dsCoord ); + + /* adjust the scales, avoiding divide by zero */ + if ( i > 0 ) + { + if ( hintmap->edge[i].csCoord != hintmap->edge[i - 1].csCoord ) + hintmap->edge[i - 1].scale = + FT_DivFix( SUB_INT32( hintmap->edge[i].dsCoord, + hintmap->edge[i - 1].dsCoord ), + SUB_INT32( hintmap->edge[i].csCoord, + hintmap->edge[i - 1].csCoord ) ); + } + + if ( isPair ) + { + if ( hintmap->edge[j].csCoord != hintmap->edge[j - 1].csCoord ) + hintmap->edge[j - 1].scale = + FT_DivFix( SUB_INT32( hintmap->edge[j].dsCoord, + hintmap->edge[j - 1].dsCoord ), + SUB_INT32( hintmap->edge[j].csCoord, + hintmap->edge[j - 1].csCoord ) ); + + i += 1; /* skip upper edge on next loop */ + } + } + + /* second pass tries to move non-optimal hints up, in case there is */ + /* room now */ + for ( i = cf2_arrstack_size( hintmap->hintMoves ); i > 0; i-- ) + { + CF2_HintMove hintMove = (CF2_HintMove) + cf2_arrstack_getPointer( hintmap->hintMoves, i - 1 ); + + + j = hintMove->j; + + /* this was tested before the push, above */ + FT_ASSERT( j < hintmap->count - 1 ); + + /* is there room to move up? */ + if ( hintmap->edge[j + 1].dsCoord >= + ADD_INT32( hintmap->edge[j].dsCoord, + hintMove->moveUp + CF2_MIN_COUNTER ) ) + { + /* there is more room now, move edge up */ + hintmap->edge[j].dsCoord = ADD_INT32( hintmap->edge[j].dsCoord, + hintMove->moveUp ); + + if ( cf2_hint_isPair( &hintmap->edge[j] ) ) + { + FT_ASSERT( j > 0 ); + hintmap->edge[j - 1].dsCoord = + ADD_INT32( hintmap->edge[j - 1].dsCoord, hintMove->moveUp ); + } + } + } + } + + + /* insert hint edges into map, sorted by csCoord */ + static void + cf2_hintmap_insertHint( CF2_HintMap hintmap, + CF2_Hint bottomHintEdge, + CF2_Hint topHintEdge ) + { + CF2_UInt indexInsert; + + /* set default values, then check for edge hints */ + FT_Bool isPair = TRUE; + CF2_Hint firstHintEdge = bottomHintEdge; + CF2_Hint secondHintEdge = topHintEdge; + + + /* one or none of the input params may be invalid when dealing with */ + /* edge hints; at least one edge must be valid */ + FT_ASSERT( cf2_hint_isValid( bottomHintEdge ) || + cf2_hint_isValid( topHintEdge ) ); + + /* determine how many and which edges to insert */ + if ( !cf2_hint_isValid( bottomHintEdge ) ) + { + /* insert only the top edge */ + firstHintEdge = topHintEdge; + isPair = FALSE; + } + else if ( !cf2_hint_isValid( topHintEdge ) ) + { + /* insert only the bottom edge */ + isPair = FALSE; + } + + /* paired edges must be in proper order */ + if ( isPair && + topHintEdge->csCoord < bottomHintEdge->csCoord ) + return; + + /* linear search to find index value of insertion point */ + indexInsert = 0; + for ( ; indexInsert < hintmap->count; indexInsert++ ) + { + if ( hintmap->edge[indexInsert].csCoord >= firstHintEdge->csCoord ) + break; + } + + FT_TRACE7(( " Got hint at %.2f (%.2f)\n", + firstHintEdge->csCoord / 65536.0, + firstHintEdge->dsCoord / 65536.0 )); + if ( isPair ) + FT_TRACE7(( " Got hint at %.2f (%.2f)\n", + secondHintEdge->csCoord / 65536.0, + secondHintEdge->dsCoord / 65536.0 )); + + /* + * Discard any hints that overlap in character space. Most often, this + * is while building the initial map, where captured hints from all + * zones are combined. Define overlap to include hints that `touch' + * (overlap zero). Hiragino Sans/Gothic fonts have numerous hints that + * touch. Some fonts have non-ideographic glyphs that overlap our + * synthetic hints. + * + * Overlap also occurs when darkening stem hints that are close. + * + */ + if ( indexInsert < hintmap->count ) + { + /* we are inserting before an existing edge: */ + /* verify that an existing edge is not the same */ + if ( hintmap->edge[indexInsert].csCoord == firstHintEdge->csCoord ) + return; /* ignore overlapping stem hint */ + + /* verify that a new pair does not straddle the next edge */ + if ( isPair && + hintmap->edge[indexInsert].csCoord <= secondHintEdge->csCoord ) + return; /* ignore overlapping stem hint */ + + /* verify that we are not inserting between paired edges */ + if ( cf2_hint_isPairTop( &hintmap->edge[indexInsert] ) ) + return; /* ignore overlapping stem hint */ + } + + /* recompute device space locations using initial hint map */ + if ( cf2_hintmap_isValid( hintmap->initialHintMap ) && + !cf2_hint_isLocked( firstHintEdge ) ) + { + if ( isPair ) + { + /* Use hint map to position the center of stem, and nominal scale */ + /* to position the two edges. This preserves the stem width. */ + CF2_Fixed midpoint = + cf2_hintmap_map( + hintmap->initialHintMap, + ADD_INT32( secondHintEdge->csCoord, + firstHintEdge->csCoord ) / 2 ); + CF2_Fixed halfWidth = + FT_MulFix( SUB_INT32( secondHintEdge->csCoord, + firstHintEdge->csCoord ) / 2, + hintmap->scale ); + + + firstHintEdge->dsCoord = SUB_INT32( midpoint, halfWidth ); + secondHintEdge->dsCoord = ADD_INT32( midpoint, halfWidth ); + } + else + firstHintEdge->dsCoord = cf2_hintmap_map( hintmap->initialHintMap, + firstHintEdge->csCoord ); + } + + /* + * Discard any hints that overlap in device space; this can occur + * because locked hints have been moved to align with blue zones. + * + * TODO: Although we might correct this later during adjustment, we + * don't currently have a way to delete a conflicting hint once it has + * been inserted. See v2.030 MinionPro-Regular, 12 ppem darkened, + * initial hint map for second path, glyph 945 (the perispomeni (tilde) + * in U+1F6E, Greek omega with psili and perispomeni). Darkening is + * 25. Pair 667,747 initially conflicts in design space with top edge + * 660. This is because 667 maps to 7.87, and the top edge was + * captured by a zone at 8.0. The pair is later successfully inserted + * in a zone without the top edge. In this zone it is adjusted to 8.0, + * and no longer conflicts with the top edge in design space. This + * means it can be included in yet a later zone which does have the top + * edge hint. This produces a small mismatch between the first and + * last points of this path, even though the hint masks are the same. + * The density map difference is tiny (1/256). + * + */ + + if ( indexInsert > 0 ) + { + /* we are inserting after an existing edge */ + if ( firstHintEdge->dsCoord < hintmap->edge[indexInsert - 1].dsCoord ) + return; + } + + if ( indexInsert < hintmap->count ) + { + /* we are inserting before an existing edge */ + if ( isPair ) + { + if ( secondHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord ) + return; + } + else + { + if ( firstHintEdge->dsCoord > hintmap->edge[indexInsert].dsCoord ) + return; + } + } + + /* make room to insert */ + { + CF2_UInt iSrc = hintmap->count - 1; + CF2_UInt iDst = isPair ? hintmap->count + 1 : hintmap->count; + + CF2_UInt count = hintmap->count - indexInsert; + + + if ( iDst >= CF2_MAX_HINT_EDGES ) + { + FT_TRACE4(( "cf2_hintmap_insertHint: too many hintmaps\n" )); + return; + } + + while ( count-- ) + hintmap->edge[iDst--] = hintmap->edge[iSrc--]; + + /* insert first edge */ + hintmap->edge[indexInsert] = *firstHintEdge; /* copy struct */ + hintmap->count += 1; + + FT_TRACE7(( " Inserting hint %.2f (%.2f)\n", + firstHintEdge->csCoord / 65536.0, + firstHintEdge->dsCoord / 65536.0 )); + + if ( isPair ) + { + /* insert second edge */ + hintmap->edge[indexInsert + 1] = *secondHintEdge; /* copy struct */ + hintmap->count += 1; + + FT_TRACE7(( " Inserting hint %.2f (%.2f)\n", + secondHintEdge->csCoord / 65536.0, + secondHintEdge->dsCoord / 65536.0 )); + + } + } + + return; + } + + + /* + * Build a map from hints and mask. + * + * This function may recur one level if `hintmap->initialHintMap' is not yet + * valid. + * If `initialMap' is true, simply build initial map. + * + * Synthetic hints are used in two ways. A hint at zero is inserted, if + * needed, in the initial hint map, to prevent translations from + * propagating across the origin. If synthetic em box hints are enabled + * for ideographic dictionaries, then they are inserted in all hint + * maps, including the initial one. + * + */ + FT_LOCAL_DEF( void ) + cf2_hintmap_build( CF2_HintMap hintmap, + CF2_ArrStack hStemHintArray, + CF2_ArrStack vStemHintArray, + CF2_HintMask hintMask, + CF2_Fixed hintOrigin, + FT_Bool initialMap ) + { + FT_Byte* maskPtr; + + CF2_Font font = hintmap->font; + CF2_HintMaskRec tempHintMask; + + size_t bitCount, i; + FT_Byte maskByte; + + + /* check whether initial map is constructed */ + if ( !initialMap && !cf2_hintmap_isValid( hintmap->initialHintMap ) ) + { + /* make recursive call with initialHintMap and temporary mask; */ + /* temporary mask will get all bits set, below */ + cf2_hintmask_init( &tempHintMask, hintMask->error ); + cf2_hintmap_build( hintmap->initialHintMap, + hStemHintArray, + vStemHintArray, + &tempHintMask, + hintOrigin, + TRUE ); + } + + if ( !cf2_hintmask_isValid( hintMask ) ) + { + /* without a hint mask, assume all hints are active */ + cf2_hintmask_setAll( hintMask, + cf2_arrstack_size( hStemHintArray ) + + cf2_arrstack_size( vStemHintArray ) ); + if ( !cf2_hintmask_isValid( hintMask ) ) + { + if ( font->isT1 ) + { + /* no error, just continue unhinted */ + *hintMask->error = FT_Err_Ok; + hintmap->hinted = FALSE; + } + return; /* too many stem hints */ + } + } + + /* begin by clearing the map */ + hintmap->count = 0; + hintmap->lastIndex = 0; + + /* make a copy of the hint mask so we can modify it */ + tempHintMask = *hintMask; + maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask ); + + /* use the hStem hints only, which are first in the mask */ + bitCount = cf2_arrstack_size( hStemHintArray ); + + /* Defense-in-depth. Should never return here. */ + if ( bitCount > hintMask->bitCount ) + return; + + /* synthetic embox hints get highest priority */ + if ( font->blues.doEmBoxHints ) + { + CF2_HintRec dummy; + + + cf2_hint_initZero( &dummy ); /* invalid hint map element */ + + /* ghost bottom */ + cf2_hintmap_insertHint( hintmap, + &font->blues.emBoxBottomEdge, + &dummy ); + /* ghost top */ + cf2_hintmap_insertHint( hintmap, + &dummy, + &font->blues.emBoxTopEdge ); + } + + /* insert hints captured by a blue zone or already locked (higher */ + /* priority) */ + for ( i = 0, maskByte = 0x80; i < bitCount; i++ ) + { + if ( maskByte & *maskPtr ) + { + /* expand StemHint into two `CF2_Hint' elements */ + CF2_HintRec bottomHintEdge, topHintEdge; + + + cf2_hint_init( &bottomHintEdge, + hStemHintArray, + i, + font, + hintOrigin, + hintmap->scale, + TRUE /* bottom */ ); + cf2_hint_init( &topHintEdge, + hStemHintArray, + i, + font, + hintOrigin, + hintmap->scale, + FALSE /* top */ ); + + if ( cf2_hint_isLocked( &bottomHintEdge ) || + cf2_hint_isLocked( &topHintEdge ) || + cf2_blues_capture( &font->blues, + &bottomHintEdge, + &topHintEdge ) ) + { + /* insert captured hint into map */ + cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge ); + + *maskPtr &= ~maskByte; /* turn off the bit for this hint */ + } + } + + if ( ( i & 7 ) == 7 ) + { + /* move to next mask byte */ + maskPtr++; + maskByte = 0x80; + } + else + maskByte >>= 1; + } + + /* initial hint map includes only captured hints plus maybe one at 0 */ + + /* + * TODO: There is a problem here because we are trying to build a + * single hint map containing all captured hints. It is + * possible for there to be conflicts between captured hints, + * either because of darkening or because the hints are in + * separate hint zones (we are ignoring hint zones for the + * initial map). An example of the latter is MinionPro-Regular + * v2.030 glyph 883 (Greek Capital Alpha with Psili) at 15ppem. + * A stem hint for the psili conflicts with the top edge hint + * for the base character. The stem hint gets priority because + * of its sort order. In glyph 884 (Greek Capital Alpha with + * Psili and Oxia), the top of the base character gets a stem + * hint, and the psili does not. This creates different initial + * maps for the two glyphs resulting in different renderings of + * the base character. Will probably defer this either as not + * worth the cost or as a font bug. I don't think there is any + * good reason for an accent to be captured by an alignment + * zone. -darnold 2/12/10 + */ + + if ( initialMap ) + { + /* Apply a heuristic that inserts a point for (0,0), unless it's */ + /* already covered by a mapping. This locks the baseline for glyphs */ + /* that have no baseline hints. */ + + if ( hintmap->count == 0 || + hintmap->edge[0].csCoord > 0 || + hintmap->edge[hintmap->count - 1].csCoord < 0 ) + { + /* all edges are above 0 or all edges are below 0; */ + /* construct a locked edge hint at 0 */ + + CF2_HintRec edge, invalid; + + + cf2_hint_initZero( &edge ); + + edge.flags = CF2_GhostBottom | + CF2_Locked | + CF2_Synthetic; + edge.scale = hintmap->scale; + + cf2_hint_initZero( &invalid ); + cf2_hintmap_insertHint( hintmap, &edge, &invalid ); + } + } + else + { + /* insert remaining hints */ + + maskPtr = cf2_hintmask_getMaskPtr( &tempHintMask ); + + for ( i = 0, maskByte = 0x80; i < bitCount; i++ ) + { + if ( maskByte & *maskPtr ) + { + CF2_HintRec bottomHintEdge, topHintEdge; + + + cf2_hint_init( &bottomHintEdge, + hStemHintArray, + i, + font, + hintOrigin, + hintmap->scale, + TRUE /* bottom */ ); + cf2_hint_init( &topHintEdge, + hStemHintArray, + i, + font, + hintOrigin, + hintmap->scale, + FALSE /* top */ ); + + cf2_hintmap_insertHint( hintmap, &bottomHintEdge, &topHintEdge ); + } + + if ( ( i & 7 ) == 7 ) + { + /* move to next mask byte */ + maskPtr++; + maskByte = 0x80; + } + else + maskByte >>= 1; + } + } + + FT_TRACE6(( initialMap ? "flags: [p]air [g]host [t]op " + "[b]ottom [L]ocked [S]ynthetic\n" + "Initial hintmap\n" + : "Hints:\n" )); + cf2_hintmap_dump( hintmap ); + + /* + * Note: The following line is a convenient place to break when + * debugging hinting. Examine `hintmap->edge' for the list of + * enabled hints, then step over the call to see the effect of + * adjustment. We stop here first on the recursive call that + * creates the initial map, and then on each counter group and + * hint zone. + */ + + /* adjust positions of hint edges that are not locked to blue zones */ + cf2_hintmap_adjustHints( hintmap ); + + FT_TRACE6(( "(adjusted)\n" )); + cf2_hintmap_dump( hintmap ); + + /* save the position of all hints that were used in this hint map; */ + /* if we use them again, we'll locate them in the same position */ + if ( !initialMap ) + { + for ( i = 0; i < hintmap->count; i++ ) + { + if ( !cf2_hint_isSynthetic( &hintmap->edge[i] ) ) + { + /* Note: include both valid and invalid edges */ + /* Note: top and bottom edges are copied back separately */ + CF2_StemHint stemhint = (CF2_StemHint) + cf2_arrstack_getPointer( hStemHintArray, + hintmap->edge[i].index ); + + + if ( cf2_hint_isTop( &hintmap->edge[i] ) ) + stemhint->maxDS = hintmap->edge[i].dsCoord; + else + stemhint->minDS = hintmap->edge[i].dsCoord; + + stemhint->used = TRUE; + } + } + } + + /* hint map is ready to use */ + hintmap->isValid = TRUE; + + /* remember this mask has been used */ + cf2_hintmask_setNew( hintMask, FALSE ); + } + + + FT_LOCAL_DEF( void ) + cf2_glyphpath_init( CF2_GlyphPath glyphpath, + CF2_Font font, + CF2_OutlineCallbacks callbacks, + CF2_Fixed scaleY, + /* CF2_Fixed hShift, */ + CF2_ArrStack hStemHintArray, + CF2_ArrStack vStemHintArray, + CF2_HintMask hintMask, + CF2_Fixed hintOriginY, + const CF2_Blues blues, + const FT_Vector* fractionalTranslation ) + { + FT_ZERO( glyphpath ); + + glyphpath->font = font; + glyphpath->callbacks = callbacks; + + cf2_arrstack_init( &glyphpath->hintMoves, + font->memory, + &font->error, + sizeof ( CF2_HintMoveRec ) ); + + cf2_hintmap_init( &glyphpath->initialHintMap, + font, + &glyphpath->initialHintMap, + &glyphpath->hintMoves, + scaleY ); + cf2_hintmap_init( &glyphpath->firstHintMap, + font, + &glyphpath->initialHintMap, + &glyphpath->hintMoves, + scaleY ); + cf2_hintmap_init( &glyphpath->hintMap, + font, + &glyphpath->initialHintMap, + &glyphpath->hintMoves, + scaleY ); + + glyphpath->scaleX = font->innerTransform.a; + glyphpath->scaleC = font->innerTransform.c; + glyphpath->scaleY = font->innerTransform.d; + + glyphpath->fractionalTranslation = *fractionalTranslation; + +#if 0 + glyphpath->hShift = hShift; /* for fauxing */ +#endif + + glyphpath->hStemHintArray = hStemHintArray; + glyphpath->vStemHintArray = vStemHintArray; + glyphpath->hintMask = hintMask; /* ptr to current mask */ + glyphpath->hintOriginY = hintOriginY; + glyphpath->blues = blues; + glyphpath->darken = font->darkened; /* TODO: should we make copies? */ + glyphpath->xOffset = font->darkenX; + glyphpath->yOffset = font->darkenY; + glyphpath->miterLimit = 2 * FT_MAX( + cf2_fixedAbs( glyphpath->xOffset ), + cf2_fixedAbs( glyphpath->yOffset ) ); + + /* .1 character space unit */ + glyphpath->snapThreshold = cf2_doubleToFixed( 0.1 ); + + glyphpath->moveIsPending = TRUE; + glyphpath->pathIsOpen = FALSE; + glyphpath->pathIsClosing = FALSE; + glyphpath->elemIsQueued = FALSE; + } + + + FT_LOCAL_DEF( void ) + cf2_glyphpath_finalize( CF2_GlyphPath glyphpath ) + { + cf2_arrstack_finalize( &glyphpath->hintMoves ); + } + + + /* + * Hint point in y-direction and apply outerTransform. + * Input `current' hint map (which is actually delayed by one element). + * Input x,y point in Character Space. + * Output x,y point in Device Space, including translation. + */ + static void + cf2_glyphpath_hintPoint( CF2_GlyphPath glyphpath, + CF2_HintMap hintmap, + FT_Vector* ppt, + CF2_Fixed x, + CF2_Fixed y ) + { + FT_Vector pt; /* hinted point in upright DS */ + + + pt.x = ADD_INT32( FT_MulFix( glyphpath->scaleX, x ), + FT_MulFix( glyphpath->scaleC, y ) ); + pt.y = cf2_hintmap_map( hintmap, y ); + + ppt->x = ADD_INT32( + FT_MulFix( glyphpath->font->outerTransform.a, pt.x ), + ADD_INT32( + FT_MulFix( glyphpath->font->outerTransform.c, pt.y ), + glyphpath->fractionalTranslation.x ) ); + ppt->y = ADD_INT32( + FT_MulFix( glyphpath->font->outerTransform.b, pt.x ), + ADD_INT32( + FT_MulFix( glyphpath->font->outerTransform.d, pt.y ), + glyphpath->fractionalTranslation.y ) ); + } + + + /* + * From two line segments, (u1,u2) and (v1,v2), compute a point of + * intersection on the corresponding lines. + * Return false if no intersection is found, or if the intersection is + * too far away from the ends of the line segments, u2 and v1. + * + */ + static FT_Bool + cf2_glyphpath_computeIntersection( CF2_GlyphPath glyphpath, + const FT_Vector* u1, + const FT_Vector* u2, + const FT_Vector* v1, + const FT_Vector* v2, + FT_Vector* intersection ) + { + /* + * Let `u' be a zero-based vector from the first segment, `v' from the + * second segment. + * Let `w 'be the zero-based vector from `u1' to `v1'. + * `perp' is the `perpendicular dot product'; see + * https://mathworld.wolfram.com/PerpDotProduct.html. + * `s' is the parameter for the parametric line for the first segment + * (`u'). + * + * See notation in + * http://softsurfer.com/Archive/algorithm_0104/algorithm_0104B.htm. + * Calculations are done in 16.16, but must handle the squaring of + * line lengths in character space. We scale all vectors by 1/32 to + * avoid overflow. This allows values up to 4095 to be squared. The + * scale factor cancels in the divide. + * + * TODO: the scale factor could be computed from UnitsPerEm. + * + */ + +#define cf2_perp( a, b ) \ + ( FT_MulFix( a.x, b.y ) - FT_MulFix( a.y, b.x ) ) + + /* round and divide by 32 */ +#define CF2_CS_SCALE( x ) \ + ( ( (x) + 0x10 ) >> 5 ) + + FT_Vector u, v, w; /* scaled vectors */ + CF2_Fixed denominator, s; + + + u.x = CF2_CS_SCALE( SUB_INT32( u2->x, u1->x ) ); + u.y = CF2_CS_SCALE( SUB_INT32( u2->y, u1->y ) ); + v.x = CF2_CS_SCALE( SUB_INT32( v2->x, v1->x ) ); + v.y = CF2_CS_SCALE( SUB_INT32( v2->y, v1->y ) ); + w.x = CF2_CS_SCALE( SUB_INT32( v1->x, u1->x ) ); + w.y = CF2_CS_SCALE( SUB_INT32( v1->y, u1->y ) ); + + denominator = cf2_perp( u, v ); + + if ( denominator == 0 ) + return FALSE; /* parallel or coincident lines */ + + s = FT_DivFix( cf2_perp( w, v ), denominator ); + + intersection->x = ADD_INT32( u1->x, + FT_MulFix( s, SUB_INT32( u2->x, u1->x ) ) ); + intersection->y = ADD_INT32( u1->y, + FT_MulFix( s, SUB_INT32( u2->y, u1->y ) ) ); + + + /* + * Special case snapping for horizontal and vertical lines. + * This cleans up intersections and reduces problems with winding + * order detection. + * Sample case is sbc cd KozGoPr6N-Medium.otf 20 16685. + * Note: these calculations are in character space. + * + */ + + if ( u1->x == u2->x && + cf2_fixedAbs( SUB_INT32( intersection->x, + u1->x ) ) < glyphpath->snapThreshold ) + intersection->x = u1->x; + if ( u1->y == u2->y && + cf2_fixedAbs( SUB_INT32( intersection->y, + u1->y ) ) < glyphpath->snapThreshold ) + intersection->y = u1->y; + + if ( v1->x == v2->x && + cf2_fixedAbs( SUB_INT32( intersection->x, + v1->x ) ) < glyphpath->snapThreshold ) + intersection->x = v1->x; + if ( v1->y == v2->y && + cf2_fixedAbs( SUB_INT32( intersection->y, + v1->y ) ) < glyphpath->snapThreshold ) + intersection->y = v1->y; + + /* limit the intersection distance from midpoint of u2 and v1 */ + if ( cf2_fixedAbs( intersection->x - ADD_INT32( u2->x, v1->x ) / 2 ) > + glyphpath->miterLimit || + cf2_fixedAbs( intersection->y - ADD_INT32( u2->y, v1->y ) / 2 ) > + glyphpath->miterLimit ) + return FALSE; + + return TRUE; + } + + + /* + * Push the cached element (glyphpath->prevElem*) to the outline + * consumer. When a darkening offset is used, the end point of the + * cached element may be adjusted to an intersection point or we may + * synthesize a connecting line to the current element. If we are + * closing a subpath, we may also generate a connecting line to the start + * point. + * + * This is where Character Space (CS) is converted to Device Space (DS) + * using a hint map. This calculation must use a HintMap that was valid + * at the time the element was saved. For the first point in a subpath, + * that is a saved HintMap. For most elements, it just means the caller + * has delayed building a HintMap from the current HintMask. + * + * Transform each point with outerTransform and call the outline + * callbacks. This is a general 3x3 transform: + * + * x' = a*x + c*y + tx, y' = b*x + d*y + ty + * + * but it uses 4 elements from CF2_Font and the translation part + * from CF2_GlyphPath. + * + */ + static void + cf2_glyphpath_pushPrevElem( CF2_GlyphPath glyphpath, + CF2_HintMap hintmap, + FT_Vector* nextP0, + FT_Vector nextP1, + FT_Bool close ) + { + CF2_CallbackParamsRec params; + + FT_Vector* prevP0; + FT_Vector* prevP1; + + FT_Vector intersection = { 0, 0 }; + FT_Bool useIntersection = FALSE; + + + FT_ASSERT( glyphpath->prevElemOp == CF2_PathOpLineTo || + glyphpath->prevElemOp == CF2_PathOpCubeTo ); + + if ( glyphpath->prevElemOp == CF2_PathOpLineTo ) + { + prevP0 = &glyphpath->prevElemP0; + prevP1 = &glyphpath->prevElemP1; + } + else + { + prevP0 = &glyphpath->prevElemP2; + prevP1 = &glyphpath->prevElemP3; + } + + /* optimization: if previous and next elements are offset by the same */ + /* amount, then there will be no gap, and no need to compute an */ + /* intersection. */ + if ( prevP1->x != nextP0->x || prevP1->y != nextP0->y ) + { + /* previous element does not join next element: */ + /* adjust end point of previous element to the intersection */ + useIntersection = cf2_glyphpath_computeIntersection( glyphpath, + prevP0, + prevP1, + nextP0, + &nextP1, + &intersection ); + if ( useIntersection ) + { + /* modify the last point of the cached element (either line or */ + /* curve) */ + *prevP1 = intersection; + } + } + + params.pt0 = glyphpath->currentDS; + + switch( glyphpath->prevElemOp ) + { + case CF2_PathOpLineTo: + params.op = CF2_PathOpLineTo; + + /* note: pt2 and pt3 are unused */ + + if ( close ) + { + /* use first hint map if closing */ + cf2_glyphpath_hintPoint( glyphpath, + &glyphpath->firstHintMap, + ¶ms.pt1, + glyphpath->prevElemP1.x, + glyphpath->prevElemP1.y ); + } + else + { + cf2_glyphpath_hintPoint( glyphpath, + hintmap, + ¶ms.pt1, + glyphpath->prevElemP1.x, + glyphpath->prevElemP1.y ); + } + + /* output only non-zero length lines */ + if ( params.pt0.x != params.pt1.x || params.pt0.y != params.pt1.y ) + { + glyphpath->callbacks->lineTo( glyphpath->callbacks, ¶ms ); + + glyphpath->currentDS = params.pt1; + } + break; + + case CF2_PathOpCubeTo: + params.op = CF2_PathOpCubeTo; + + /* TODO: should we intersect the interior joins (p1-p2 and p2-p3)? */ + cf2_glyphpath_hintPoint( glyphpath, + hintmap, + ¶ms.pt1, + glyphpath->prevElemP1.x, + glyphpath->prevElemP1.y ); + cf2_glyphpath_hintPoint( glyphpath, + hintmap, + ¶ms.pt2, + glyphpath->prevElemP2.x, + glyphpath->prevElemP2.y ); + cf2_glyphpath_hintPoint( glyphpath, + hintmap, + ¶ms.pt3, + glyphpath->prevElemP3.x, + glyphpath->prevElemP3.y ); + + glyphpath->callbacks->cubeTo( glyphpath->callbacks, ¶ms ); + + glyphpath->currentDS = params.pt3; + + break; + } + + if ( !useIntersection || close ) + { + /* insert connecting line between end of previous element and start */ + /* of current one */ + /* note: at the end of a subpath, we might do both, so use `nextP0' */ + /* before we change it, below */ + + if ( close ) + { + /* if we are closing the subpath, then nextP0 is in the first */ + /* hint zone */ + cf2_glyphpath_hintPoint( glyphpath, + &glyphpath->firstHintMap, + ¶ms.pt1, + nextP0->x, + nextP0->y ); + } + else + { + cf2_glyphpath_hintPoint( glyphpath, + hintmap, + ¶ms.pt1, + nextP0->x, + nextP0->y ); + } + + if ( params.pt1.x != glyphpath->currentDS.x || + params.pt1.y != glyphpath->currentDS.y ) + { + /* length is nonzero */ + params.op = CF2_PathOpLineTo; + params.pt0 = glyphpath->currentDS; + + /* note: pt2 and pt3 are unused */ + glyphpath->callbacks->lineTo( glyphpath->callbacks, ¶ms ); + + glyphpath->currentDS = params.pt1; + } + } + + if ( useIntersection ) + { + /* return intersection point to caller */ + *nextP0 = intersection; + } + } + + + /* push a MoveTo element based on current point and offset of current */ + /* element */ + static void + cf2_glyphpath_pushMove( CF2_GlyphPath glyphpath, + FT_Vector start ) + { + CF2_CallbackParamsRec params; + + + params.op = CF2_PathOpMoveTo; + params.pt0 = glyphpath->currentDS; + + /* Test if move has really happened yet; it would have called */ + /* `cf2_hintmap_build' to set `isValid'. */ + if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) ) + { + /* we are here iff first subpath is missing a moveto operator: */ + /* synthesize first moveTo to finish initialization of hintMap */ + cf2_glyphpath_moveTo( glyphpath, + glyphpath->start.x, + glyphpath->start.y ); + } + + cf2_glyphpath_hintPoint( glyphpath, + &glyphpath->hintMap, + ¶ms.pt1, + start.x, + start.y ); + + /* note: pt2 and pt3 are unused */ + glyphpath->callbacks->moveTo( glyphpath->callbacks, ¶ms ); + + glyphpath->currentDS = params.pt1; + glyphpath->offsetStart0 = start; + } + + + /* + * All coordinates are in character space. + * On input, (x1, y1) and (x2, y2) give line segment. + * On output, (x, y) give offset vector. + * We use a piecewise approximation to trig functions. + * + * TODO: Offset true perpendicular and proper length + * supply the y-translation for hinting here, too, + * that adds yOffset unconditionally to *y. + */ + static void + cf2_glyphpath_computeOffset( CF2_GlyphPath glyphpath, + CF2_Fixed x1, + CF2_Fixed y1, + CF2_Fixed x2, + CF2_Fixed y2, + CF2_Fixed* x, + CF2_Fixed* y ) + { + CF2_Fixed dx = SUB_INT32( x2, x1 ); + CF2_Fixed dy = SUB_INT32( y2, y1 ); + + + /* note: negative offsets don't work here; negate deltas to change */ + /* quadrants, below */ + if ( glyphpath->font->reverseWinding ) + { + dx = NEG_INT32( dx ); + dy = NEG_INT32( dy ); + } + + *x = *y = 0; + + if ( !glyphpath->darken ) + return; + + /* add momentum for this path element */ + glyphpath->callbacks->windingMomentum = + ADD_INT32( glyphpath->callbacks->windingMomentum, + cf2_getWindingMomentum( x1, y1, x2, y2 ) ); + + /* note: allow mixed integer and fixed multiplication here */ + if ( dx >= 0 ) + { + if ( dy >= 0 ) + { + /* first quadrant, +x +y */ + + if ( dx > MUL_INT32( 2, dy ) ) + { + /* +x */ + *x = 0; + *y = 0; + } + else if ( dy > MUL_INT32( 2, dx ) ) + { + /* +y */ + *x = glyphpath->xOffset; + *y = glyphpath->yOffset; + } + else + { + /* +x +y */ + *x = FT_MulFix( cf2_doubleToFixed( 0.7 ), + glyphpath->xOffset ); + *y = FT_MulFix( cf2_doubleToFixed( 1.0 - 0.7 ), + glyphpath->yOffset ); + } + } + else + { + /* fourth quadrant, +x -y */ + + if ( dx > MUL_INT32( -2, dy ) ) + { + /* +x */ + *x = 0; + *y = 0; + } + else if ( NEG_INT32( dy ) > MUL_INT32( 2, dx ) ) + { + /* -y */ + *x = NEG_INT32( glyphpath->xOffset ); + *y = glyphpath->yOffset; + } + else + { + /* +x -y */ + *x = FT_MulFix( cf2_doubleToFixed( -0.7 ), + glyphpath->xOffset ); + *y = FT_MulFix( cf2_doubleToFixed( 1.0 - 0.7 ), + glyphpath->yOffset ); + } + } + } + else + { + if ( dy >= 0 ) + { + /* second quadrant, -x +y */ + + if ( NEG_INT32( dx ) > MUL_INT32( 2, dy ) ) + { + /* -x */ + *x = 0; + *y = MUL_INT32( 2, glyphpath->yOffset ); + } + else if ( dy > MUL_INT32( -2, dx ) ) + { + /* +y */ + *x = glyphpath->xOffset; + *y = glyphpath->yOffset; + } + else + { + /* -x +y */ + *x = FT_MulFix( cf2_doubleToFixed( 0.7 ), + glyphpath->xOffset ); + *y = FT_MulFix( cf2_doubleToFixed( 1.0 + 0.7 ), + glyphpath->yOffset ); + } + } + else + { + /* third quadrant, -x -y */ + + if ( NEG_INT32( dx ) > MUL_INT32( -2, dy ) ) + { + /* -x */ + *x = 0; + *y = MUL_INT32( 2, glyphpath->yOffset ); + } + else if ( NEG_INT32( dy ) > MUL_INT32( -2, dx ) ) + { + /* -y */ + *x = NEG_INT32( glyphpath->xOffset ); + *y = glyphpath->yOffset; + } + else + { + /* -x -y */ + *x = FT_MulFix( cf2_doubleToFixed( -0.7 ), + glyphpath->xOffset ); + *y = FT_MulFix( cf2_doubleToFixed( 1.0 + 0.7 ), + glyphpath->yOffset ); + } + } + } + } + + + /* + * The functions cf2_glyphpath_{moveTo,lineTo,curveTo,closeOpenPath} are + * called by the interpreter with Character Space (CS) coordinates. Each + * path element is placed into a queue of length one to await the + * calculation of the following element. At that time, the darkening + * offset of the following element is known and joins can be computed, + * including possible modification of this element, before mapping to + * Device Space (DS) and passing it on to the outline consumer. + * + */ + FT_LOCAL_DEF( void ) + cf2_glyphpath_moveTo( CF2_GlyphPath glyphpath, + CF2_Fixed x, + CF2_Fixed y ) + { + cf2_glyphpath_closeOpenPath( glyphpath ); + + /* save the parameters of the move for later, when we'll know how to */ + /* offset it; */ + /* also save last move point */ + glyphpath->currentCS.x = glyphpath->start.x = x; + glyphpath->currentCS.y = glyphpath->start.y = y; + + glyphpath->moveIsPending = TRUE; + + /* ensure we have a valid map with current mask */ + if ( !cf2_hintmap_isValid( &glyphpath->hintMap ) || + cf2_hintmask_isNew( glyphpath->hintMask ) ) + cf2_hintmap_build( &glyphpath->hintMap, + glyphpath->hStemHintArray, + glyphpath->vStemHintArray, + glyphpath->hintMask, + glyphpath->hintOriginY, + FALSE ); + + /* save a copy of current HintMap to use when drawing initial point */ + glyphpath->firstHintMap = glyphpath->hintMap; /* structure copy */ + } + + + FT_LOCAL_DEF( void ) + cf2_glyphpath_lineTo( CF2_GlyphPath glyphpath, + CF2_Fixed x, + CF2_Fixed y ) + { + CF2_Fixed xOffset, yOffset; + FT_Vector P0, P1; + FT_Bool newHintMap; + + /* + * New hints will be applied after cf2_glyphpath_pushPrevElem has run. + * In case this is a synthesized closing line, any new hints should be + * delayed until this path is closed (`cf2_hintmask_isNew' will be + * called again before the next line or curve). + */ + + /* true if new hint map not on close */ + newHintMap = cf2_hintmask_isNew( glyphpath->hintMask ) && + !glyphpath->pathIsClosing; + + /* + * Zero-length lines may occur in the charstring. Because we cannot + * compute darkening offsets or intersections from zero-length lines, + * it is best to remove them and avoid artifacts. However, zero-length + * lines in CS at the start of a new hint map can generate non-zero + * lines in DS due to hint substitution. We detect a change in hint + * map here and pass those zero-length lines along. + */ + + /* + * Note: Find explicitly closed paths here with a conditional + * breakpoint using + * + * !gp->pathIsClosing && gp->start.x == x && gp->start.y == y + * + */ + + if ( glyphpath->currentCS.x == x && + glyphpath->currentCS.y == y && + !newHintMap ) + /* + * Ignore zero-length lines in CS where the hint map is the same + * because the line in DS will also be zero length. + * + * Ignore zero-length lines when we synthesize a closing line because + * the close will be handled in cf2_glyphPath_pushPrevElem. + */ + return; + + cf2_glyphpath_computeOffset( glyphpath, + glyphpath->currentCS.x, + glyphpath->currentCS.y, + x, + y, + &xOffset, + &yOffset ); + + /* construct offset points */ + P0.x = ADD_INT32( glyphpath->currentCS.x, xOffset ); + P0.y = ADD_INT32( glyphpath->currentCS.y, yOffset ); + P1.x = ADD_INT32( x, xOffset ); + P1.y = ADD_INT32( y, yOffset ); + + if ( glyphpath->moveIsPending ) + { + /* emit offset 1st point as MoveTo */ + cf2_glyphpath_pushMove( glyphpath, P0 ); + + glyphpath->moveIsPending = FALSE; /* adjust state machine */ + glyphpath->pathIsOpen = TRUE; + + glyphpath->offsetStart1 = P1; /* record second point */ + } + + if ( glyphpath->elemIsQueued ) + { + FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) || + glyphpath->hintMap.count == 0 ); + + cf2_glyphpath_pushPrevElem( glyphpath, + &glyphpath->hintMap, + &P0, + P1, + FALSE ); + } + + /* queue the current element with offset points */ + glyphpath->elemIsQueued = TRUE; + glyphpath->prevElemOp = CF2_PathOpLineTo; + glyphpath->prevElemP0 = P0; + glyphpath->prevElemP1 = P1; + + /* update current map */ + if ( newHintMap ) + cf2_hintmap_build( &glyphpath->hintMap, + glyphpath->hStemHintArray, + glyphpath->vStemHintArray, + glyphpath->hintMask, + glyphpath->hintOriginY, + FALSE ); + + glyphpath->currentCS.x = x; /* pre-offset current point */ + glyphpath->currentCS.y = y; + } + + + FT_LOCAL_DEF( void ) + cf2_glyphpath_curveTo( CF2_GlyphPath glyphpath, + CF2_Fixed x1, + CF2_Fixed y1, + CF2_Fixed x2, + CF2_Fixed y2, + CF2_Fixed x3, + CF2_Fixed y3 ) + { + CF2_Fixed xOffset1, yOffset1, xOffset3, yOffset3; + FT_Vector P0, P1, P2, P3; + + + /* TODO: ignore zero length portions of curve?? */ + cf2_glyphpath_computeOffset( glyphpath, + glyphpath->currentCS.x, + glyphpath->currentCS.y, + x1, + y1, + &xOffset1, + &yOffset1 ); + cf2_glyphpath_computeOffset( glyphpath, + x2, + y2, + x3, + y3, + &xOffset3, + &yOffset3 ); + + /* add momentum from the middle segment */ + glyphpath->callbacks->windingMomentum = + ADD_INT32( glyphpath->callbacks->windingMomentum, + cf2_getWindingMomentum( x1, y1, x2, y2 ) ); + + /* construct offset points */ + P0.x = ADD_INT32( glyphpath->currentCS.x, xOffset1 ); + P0.y = ADD_INT32( glyphpath->currentCS.y, yOffset1 ); + P1.x = ADD_INT32( x1, xOffset1 ); + P1.y = ADD_INT32( y1, yOffset1 ); + /* note: preserve angle of final segment by using offset3 at both ends */ + P2.x = ADD_INT32( x2, xOffset3 ); + P2.y = ADD_INT32( y2, yOffset3 ); + P3.x = ADD_INT32( x3, xOffset3 ); + P3.y = ADD_INT32( y3, yOffset3 ); + + if ( glyphpath->moveIsPending ) + { + /* emit offset 1st point as MoveTo */ + cf2_glyphpath_pushMove( glyphpath, P0 ); + + glyphpath->moveIsPending = FALSE; + glyphpath->pathIsOpen = TRUE; + + glyphpath->offsetStart1 = P1; /* record second point */ + } + + if ( glyphpath->elemIsQueued ) + { + FT_ASSERT( cf2_hintmap_isValid( &glyphpath->hintMap ) || + glyphpath->hintMap.count == 0 ); + + cf2_glyphpath_pushPrevElem( glyphpath, + &glyphpath->hintMap, + &P0, + P1, + FALSE ); + } + + /* queue the current element with offset points */ + glyphpath->elemIsQueued = TRUE; + glyphpath->prevElemOp = CF2_PathOpCubeTo; + glyphpath->prevElemP0 = P0; + glyphpath->prevElemP1 = P1; + glyphpath->prevElemP2 = P2; + glyphpath->prevElemP3 = P3; + + /* update current map */ + if ( cf2_hintmask_isNew( glyphpath->hintMask ) ) + cf2_hintmap_build( &glyphpath->hintMap, + glyphpath->hStemHintArray, + glyphpath->vStemHintArray, + glyphpath->hintMask, + glyphpath->hintOriginY, + FALSE ); + + glyphpath->currentCS.x = x3; /* pre-offset current point */ + glyphpath->currentCS.y = y3; + } + + + FT_LOCAL_DEF( void ) + cf2_glyphpath_closeOpenPath( CF2_GlyphPath glyphpath ) + { + if ( glyphpath->pathIsOpen ) + { + /* + * A closing line in Character Space line is always generated below + * with `cf2_glyphPath_lineTo'. It may be ignored later if it turns + * out to be zero length in Device Space. + */ + glyphpath->pathIsClosing = TRUE; + + cf2_glyphpath_lineTo( glyphpath, + glyphpath->start.x, + glyphpath->start.y ); + + /* empty the final element from the queue and close the path */ + if ( glyphpath->elemIsQueued ) + cf2_glyphpath_pushPrevElem( glyphpath, + &glyphpath->hintMap, + &glyphpath->offsetStart0, + glyphpath->offsetStart1, + TRUE ); + + /* reset state machine */ + glyphpath->moveIsPending = TRUE; + glyphpath->pathIsOpen = FALSE; + glyphpath->pathIsClosing = FALSE; + glyphpath->elemIsQueued = FALSE; + } + } + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/pshints.h b/vendor/FreeType2/src/psaux/pshints.h new file mode 100644 index 0000000..92e37e9 --- /dev/null +++ b/vendor/FreeType2/src/psaux/pshints.h @@ -0,0 +1,288 @@ +/***************************************************************************/ +/* */ +/* pshints.h */ +/* */ +/* Adobe's code for handling CFF hints (body). */ +/* */ +/* Copyright 2007-2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#ifndef PSHINT_H_ +#define PSHINT_H_ + +FT_BEGIN_HEADER + + + enum + { + CF2_MAX_HINTS = 96 /* maximum # of hints */ + }; + + + /* + * A HintMask object stores a bit mask that specifies which hints in the + * charstring are active at a given time. Hints in CFF must be declared + * at the start, before any drawing operators, with horizontal hints + * preceding vertical hints. The HintMask is ordered the same way, with + * horizontal hints immediately followed by vertical hints. Clients are + * responsible for knowing how many of each type are present. + * + * The maximum total number of hints is 96, as specified by the CFF + * specification. + * + * A HintMask is built 0 or more times while interpreting a charstring, by + * the HintMask operator. There is only one HintMask, but it is built or + * rebuilt each time there is a hint substitution (HintMask operator) in + * the charstring. A default HintMask with all bits set is built if there + * has been no HintMask operator prior to the first drawing operator. + * + */ + + typedef struct CF2_HintMaskRec_ + { + FT_Error* error; + + FT_Bool isValid; + FT_Bool isNew; + + size_t bitCount; + size_t byteCount; + + FT_Byte mask[( CF2_MAX_HINTS + 7 ) / 8]; + + } CF2_HintMaskRec, *CF2_HintMask; + + + typedef struct CF2_StemHintRec_ + { + FT_Bool used; /* DS positions are valid */ + + CF2_Fixed min; /* original character space value */ + CF2_Fixed max; + + CF2_Fixed minDS; /* DS position after first use */ + CF2_Fixed maxDS; + + } CF2_StemHintRec, *CF2_StemHint; + + + /* + * A HintMap object stores a piecewise linear function for mapping + * y-coordinates from character space to device space, providing + * appropriate pixel alignment to stem edges. + * + * The map is implemented as an array of `CF2_Hint' elements, each + * representing an edge. When edges are paired, as from stem hints, the + * bottom edge must immediately precede the top edge in the array. + * Element character space AND device space positions must both increase + * monotonically in the array. `CF2_Hint' elements are also used as + * parameters to `cf2_blues_capture'. + * + * The `cf2_hintmap_build' method must be called before any drawing + * operation (beginning with a Move operator) and at each hint + * substitution (HintMask operator). + * + * The `cf2_hintmap_map' method is called to transform y-coordinates at + * each drawing operation (move, line, curve). + * + */ + + /* TODO: make this a CF2_ArrStack and add a deep copy method */ + enum + { + CF2_MAX_HINT_EDGES = CF2_MAX_HINTS * 2 + }; + + + typedef struct CF2_HintMapRec_ + { + CF2_Font font; + + /* initial map based on blue zones */ + struct CF2_HintMapRec_* initialHintMap; + + /* working storage for 2nd pass adjustHints */ + CF2_ArrStack hintMoves; + + FT_Bool isValid; + FT_Bool hinted; + + CF2_Fixed scale; + CF2_UInt count; + + /* start search from this index */ + CF2_UInt lastIndex; + + CF2_HintRec edge[CF2_MAX_HINT_EDGES]; /* 192 */ + + } CF2_HintMapRec, *CF2_HintMap; + + + FT_LOCAL( FT_Bool ) + cf2_hint_isValid( const CF2_Hint hint ); + FT_LOCAL( FT_Bool ) + cf2_hint_isTop( const CF2_Hint hint ); + FT_LOCAL( FT_Bool ) + cf2_hint_isBottom( const CF2_Hint hint ); + FT_LOCAL( void ) + cf2_hint_lock( CF2_Hint hint ); + + + FT_LOCAL( void ) + cf2_hintmap_init( CF2_HintMap hintmap, + CF2_Font font, + CF2_HintMap initialMap, + CF2_ArrStack hintMoves, + CF2_Fixed scale ); + FT_LOCAL( void ) + cf2_hintmap_build( CF2_HintMap hintmap, + CF2_ArrStack hStemHintArray, + CF2_ArrStack vStemHintArray, + CF2_HintMask hintMask, + CF2_Fixed hintOrigin, + FT_Bool initialMap ); + + + /* + * GlyphPath is a wrapper for drawing operations that scales the + * coordinates according to the render matrix and HintMap. It also tracks + * open paths to control ClosePath and to insert MoveTo for broken fonts. + * + */ + typedef struct CF2_GlyphPathRec_ + { + /* TODO: gather some of these into a hinting context */ + + CF2_Font font; /* font instance */ + CF2_OutlineCallbacks callbacks; /* outline consumer */ + + + CF2_HintMapRec hintMap; /* current hint map */ + CF2_HintMapRec firstHintMap; /* saved copy */ + CF2_HintMapRec initialHintMap; /* based on all captured hints */ + + CF2_ArrStackRec hintMoves; /* list of hint moves for 2nd pass */ + + CF2_Fixed scaleX; /* matrix a */ + CF2_Fixed scaleC; /* matrix c */ + CF2_Fixed scaleY; /* matrix d */ + + FT_Vector fractionalTranslation; /* including deviceXScale */ +#if 0 + CF2_Fixed hShift; /* character space horizontal shift */ + /* (for fauxing) */ +#endif + + FT_Bool pathIsOpen; /* true after MoveTo */ + FT_Bool pathIsClosing; /* true when synthesizing closepath line */ + FT_Bool darken; /* true if stem darkening */ + FT_Bool moveIsPending; /* true between MoveTo and offset MoveTo */ + + /* references used to call `cf2_hintmap_build', if necessary */ + CF2_ArrStack hStemHintArray; + CF2_ArrStack vStemHintArray; + CF2_HintMask hintMask; /* ptr to the current mask */ + CF2_Fixed hintOriginY; /* copy of current origin */ + const CF2_BluesRec* blues; + + CF2_Fixed xOffset; /* character space offsets */ + CF2_Fixed yOffset; + + /* character space miter limit threshold */ + CF2_Fixed miterLimit; + /* vertical/horizontal snap distance in character space */ + CF2_Fixed snapThreshold; + + FT_Vector offsetStart0; /* first and second points of first */ + FT_Vector offsetStart1; /* element with offset applied */ + + /* current point, character space, before offset */ + FT_Vector currentCS; + /* current point, device space */ + FT_Vector currentDS; + /* start point of subpath, character space */ + FT_Vector start; + + /* the following members constitute the `queue' of one element */ + FT_Bool elemIsQueued; + CF2_Int prevElemOp; + + FT_Vector prevElemP0; + FT_Vector prevElemP1; + FT_Vector prevElemP2; + FT_Vector prevElemP3; + + } CF2_GlyphPathRec, *CF2_GlyphPath; + + + FT_LOCAL( void ) + cf2_glyphpath_init( CF2_GlyphPath glyphpath, + CF2_Font font, + CF2_OutlineCallbacks callbacks, + CF2_Fixed scaleY, + /* CF2_Fixed hShift, */ + CF2_ArrStack hStemHintArray, + CF2_ArrStack vStemHintArray, + CF2_HintMask hintMask, + CF2_Fixed hintOrigin, + const CF2_Blues blues, + const FT_Vector* fractionalTranslation ); + FT_LOCAL( void ) + cf2_glyphpath_finalize( CF2_GlyphPath glyphpath ); + + FT_LOCAL( void ) + cf2_glyphpath_moveTo( CF2_GlyphPath glyphpath, + CF2_Fixed x, + CF2_Fixed y ); + FT_LOCAL( void ) + cf2_glyphpath_lineTo( CF2_GlyphPath glyphpath, + CF2_Fixed x, + CF2_Fixed y ); + FT_LOCAL( void ) + cf2_glyphpath_curveTo( CF2_GlyphPath glyphpath, + CF2_Fixed x1, + CF2_Fixed y1, + CF2_Fixed x2, + CF2_Fixed y2, + CF2_Fixed x3, + CF2_Fixed y3 ); + FT_LOCAL( void ) + cf2_glyphpath_closeOpenPath( CF2_GlyphPath glyphpath ); + + +FT_END_HEADER + + +#endif /* PSHINT_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psintrp.c b/vendor/FreeType2/src/psaux/psintrp.c new file mode 100644 index 0000000..da5a8da --- /dev/null +++ b/vendor/FreeType2/src/psaux/psintrp.c @@ -0,0 +1,3040 @@ +/***************************************************************************/ +/* */ +/* psintrp.c */ +/* */ +/* Adobe's CFF Interpreter (body). */ +/* */ +/* Copyright 2007-2014 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#include "psft.h" +#include FT_INTERNAL_DEBUG_H +#include FT_SERVICE_CFF_TABLE_LOAD_H + +#include "psglue.h" +#include "psfont.h" +#include "psstack.h" +#include "pshints.h" +#include "psintrp.h" + +#include "pserror.h" + +#include "psobjs.h" /* for cff_random */ +#include "t1decode.h" /* for t1 seac */ + + + /*************************************************************************/ + /* */ + /* 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_cf2interp + + + FT_LOCAL_DEF( void ) + cf2_hintmask_init( CF2_HintMask hintmask, + FT_Error* error ) + { + FT_ZERO( hintmask ); + + hintmask->error = error; + } + + + FT_LOCAL_DEF( FT_Bool ) + cf2_hintmask_isValid( const CF2_HintMask hintmask ) + { + return hintmask->isValid; + } + + + FT_LOCAL_DEF( FT_Bool ) + cf2_hintmask_isNew( const CF2_HintMask hintmask ) + { + return hintmask->isNew; + } + + + FT_LOCAL_DEF( void ) + cf2_hintmask_setNew( CF2_HintMask hintmask, + FT_Bool val ) + { + hintmask->isNew = val; + } + + + /* clients call `getMaskPtr' in order to iterate */ + /* through hint mask */ + + FT_LOCAL_DEF( FT_Byte* ) + cf2_hintmask_getMaskPtr( CF2_HintMask hintmask ) + { + return hintmask->mask; + } + + + static size_t + cf2_hintmask_setCounts( CF2_HintMask hintmask, + size_t bitCount ) + { + if ( bitCount > CF2_MAX_HINTS ) + { + /* total of h and v stems must be <= 96 */ + CF2_SET_ERROR( hintmask->error, Invalid_Glyph_Format ); + return 0; + } + + hintmask->bitCount = bitCount; + hintmask->byteCount = ( hintmask->bitCount + 7 ) / 8; + + hintmask->isValid = TRUE; + hintmask->isNew = TRUE; + + return bitCount; + } + + + /* consume the hintmask bytes from the charstring, advancing the src */ + /* pointer */ + static void + cf2_hintmask_read( CF2_HintMask hintmask, + CF2_Buffer charstring, + size_t bitCount ) + { + size_t i; + +#ifndef CF2_NDEBUG + /* these are the bits in the final mask byte that should be zero */ + /* Note: this variable is only used in an assert expression below */ + /* and then only if CF2_NDEBUG is not defined */ + CF2_UInt mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1; +#endif + + + /* initialize counts and isValid */ + if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 ) + return; + + FT_ASSERT( hintmask->byteCount > 0 ); + + FT_TRACE4(( " (maskbytes:" )); + + /* set mask and advance interpreter's charstring pointer */ + for ( i = 0; i < hintmask->byteCount; i++ ) + { + hintmask->mask[i] = (FT_Byte)cf2_buf_readByte( charstring ); + FT_TRACE4(( " 0x%02X", hintmask->mask[i] )); + } + + FT_TRACE4(( ")\n" )); + + /* assert any unused bits in last byte are zero unless there's a prior */ + /* error */ + /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */ +#ifndef CF2_NDEBUG + FT_ASSERT( ( hintmask->mask[hintmask->byteCount - 1] & mask ) == 0 || + *hintmask->error ); +#endif + } + + + FT_LOCAL_DEF( void ) + cf2_hintmask_setAll( CF2_HintMask hintmask, + size_t bitCount ) + { + size_t i; + CF2_UInt mask = ( 1 << ( -(CF2_Int)bitCount & 7 ) ) - 1; + + + /* initialize counts and isValid */ + if ( cf2_hintmask_setCounts( hintmask, bitCount ) == 0 ) + return; + + FT_ASSERT( hintmask->byteCount > 0 ); + FT_ASSERT( hintmask->byteCount <= + sizeof ( hintmask->mask ) / sizeof ( hintmask->mask[0] ) ); + + /* set mask to all ones */ + for ( i = 0; i < hintmask->byteCount; i++ ) + hintmask->mask[i] = 0xFF; + + /* clear unused bits */ + /* bitCount -> mask, 0 -> 0, 1 -> 7f, 2 -> 3f, ... 6 -> 3, 7 -> 1 */ + hintmask->mask[hintmask->byteCount - 1] &= ~mask; + } + + + /* Type2 charstring opcodes */ + enum + { + cf2_cmdRESERVED_0, /* 0 */ + cf2_cmdHSTEM, /* 1 */ + cf2_cmdRESERVED_2, /* 2 */ + cf2_cmdVSTEM, /* 3 */ + cf2_cmdVMOVETO, /* 4 */ + cf2_cmdRLINETO, /* 5 */ + cf2_cmdHLINETO, /* 6 */ + cf2_cmdVLINETO, /* 7 */ + cf2_cmdRRCURVETO, /* 8 */ + cf2_cmdCLOSEPATH, /* 9 T1 only */ + cf2_cmdCALLSUBR, /* 10 */ + cf2_cmdRETURN, /* 11 */ + cf2_cmdESC, /* 12 */ + cf2_cmdHSBW, /* 13 T1 only */ + cf2_cmdENDCHAR, /* 14 */ + cf2_cmdVSINDEX, /* 15 */ + cf2_cmdBLEND, /* 16 */ + cf2_cmdRESERVED_17, /* 17 */ + cf2_cmdHSTEMHM, /* 18 */ + cf2_cmdHINTMASK, /* 19 */ + cf2_cmdCNTRMASK, /* 20 */ + cf2_cmdRMOVETO, /* 21 */ + cf2_cmdHMOVETO, /* 22 */ + cf2_cmdVSTEMHM, /* 23 */ + cf2_cmdRCURVELINE, /* 24 */ + cf2_cmdRLINECURVE, /* 25 */ + cf2_cmdVVCURVETO, /* 26 */ + cf2_cmdHHCURVETO, /* 27 */ + cf2_cmdEXTENDEDNMBR, /* 28 */ + cf2_cmdCALLGSUBR, /* 29 */ + cf2_cmdVHCURVETO, /* 30 */ + cf2_cmdHVCURVETO /* 31 */ + }; + + enum + { + cf2_escDOTSECTION, /* 0 */ + cf2_escVSTEM3, /* 1 T1 only */ + cf2_escHSTEM3, /* 2 T1 only */ + cf2_escAND, /* 3 */ + cf2_escOR, /* 4 */ + cf2_escNOT, /* 5 */ + cf2_escSEAC, /* 6 T1 only */ + cf2_escSBW, /* 7 T1 only */ + cf2_escRESERVED_8, /* 8 */ + cf2_escABS, /* 9 */ + cf2_escADD, /* 10 like otherADD */ + cf2_escSUB, /* 11 like otherSUB */ + cf2_escDIV, /* 12 */ + cf2_escRESERVED_13, /* 13 */ + cf2_escNEG, /* 14 */ + cf2_escEQ, /* 15 */ + cf2_escCALLOTHERSUBR,/* 16 T1 only */ + cf2_escPOP, /* 17 T1 only */ + cf2_escDROP, /* 18 */ + cf2_escRESERVED_19, /* 19 */ + cf2_escPUT, /* 20 like otherPUT */ + cf2_escGET, /* 21 like otherGET */ + cf2_escIFELSE, /* 22 like otherIFELSE */ + cf2_escRANDOM, /* 23 like otherRANDOM */ + cf2_escMUL, /* 24 like otherMUL */ + cf2_escRESERVED_25, /* 25 */ + cf2_escSQRT, /* 26 */ + cf2_escDUP, /* 27 like otherDUP */ + cf2_escEXCH, /* 28 like otherEXCH */ + cf2_escINDEX, /* 29 */ + cf2_escROLL, /* 30 */ + cf2_escRESERVED_31, /* 31 */ + cf2_escRESERVED_32, /* 32 */ + cf2_escSETCURRENTPT, /* 33 T1 only */ + cf2_escHFLEX, /* 34 */ + cf2_escFLEX, /* 35 */ + cf2_escHFLEX1, /* 36 */ + cf2_escFLEX1, /* 37 */ + cf2_escRESERVED_38 /* 38 & all higher */ + }; + + + /* `stemHintArray' does not change once we start drawing the outline. */ + static void + cf2_doStems( const CF2_Font font, + CF2_Stack opStack, + CF2_ArrStack stemHintArray, + CF2_Fixed* width, + FT_Bool* haveWidth, + CF2_Fixed hintOffset ) + { + CF2_UInt i; + CF2_UInt count = cf2_stack_count( opStack ); + FT_Bool hasWidthArg = (FT_Bool)( count & 1 ); + + /* variable accumulates delta values from operand stack */ + CF2_Fixed position = hintOffset; + + if ( font->isT1 && !font->decoder->flex_state && !*haveWidth ) + FT_ERROR(( "cf2_doStems (Type 1 mode):" + " No width. Use hsbw/sbw as first op\n" )); + + if ( !font->isT1 && hasWidthArg && !*haveWidth ) + *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ), + cf2_getNominalWidthX( font->decoder ) ); + + if ( font->decoder->width_only ) + goto exit; + + for ( i = hasWidthArg ? 1 : 0; i < count; i += 2 ) + { + /* construct a CF2_StemHint and push it onto the list */ + CF2_StemHintRec stemhint; + + + stemhint.min = + position = ADD_INT32( position, + cf2_stack_getReal( opStack, i ) ); + stemhint.max = + position = ADD_INT32( position, + cf2_stack_getReal( opStack, i + 1 ) ); + + stemhint.used = FALSE; + stemhint.maxDS = + stemhint.minDS = 0; + + cf2_arrstack_push( stemHintArray, &stemhint ); /* defer error check */ + } + + cf2_stack_clear( opStack ); + + exit: + /* cf2_doStems must define a width (may be default) */ + *haveWidth = TRUE; + } + + + static void + cf2_doFlex( CF2_Stack opStack, + CF2_Fixed* curX, + CF2_Fixed* curY, + CF2_GlyphPath glyphPath, + const FT_Bool* readFromStack, + FT_Bool doConditionalLastRead ) + { + CF2_Fixed vals[14]; + CF2_UInt idx; + FT_Bool isHFlex; + CF2_Int top, i, j; + + + vals[0] = *curX; + vals[1] = *curY; + idx = 0; + isHFlex = FT_BOOL( readFromStack[9] == FALSE ); + top = isHFlex ? 9 : 10; + + for ( i = 0; i < top; i++ ) + { + vals[i + 2] = vals[i]; + if ( readFromStack[i] ) + vals[i + 2] = ADD_INT32( vals[i + 2], cf2_stack_getReal( opStack, + idx++ ) ); + } + + if ( isHFlex ) + vals[9 + 2] = *curY; + + if ( doConditionalLastRead ) + { + FT_Bool lastIsX = (FT_Bool)( + cf2_fixedAbs( SUB_INT32( vals[10], *curX ) ) > + cf2_fixedAbs( SUB_INT32( vals[11], *curY ) ) ); + CF2_Fixed lastVal = cf2_stack_getReal( opStack, idx ); + + + if ( lastIsX ) + { + vals[12] = ADD_INT32( vals[10], lastVal ); + vals[13] = *curY; + } + else + { + vals[12] = *curX; + vals[13] = ADD_INT32( vals[11], lastVal ); + } + } + else + { + if ( readFromStack[10] ) + vals[12] = ADD_INT32( vals[10], + cf2_stack_getReal( opStack, idx++ ) ); + else + vals[12] = *curX; + + if ( readFromStack[11] ) + vals[13] = ADD_INT32( vals[11], + cf2_stack_getReal( opStack, idx ) ); + else + vals[13] = *curY; + } + + for ( j = 0; j < 2; j++ ) + cf2_glyphpath_curveTo( glyphPath, vals[j * 6 + 2], + vals[j * 6 + 3], + vals[j * 6 + 4], + vals[j * 6 + 5], + vals[j * 6 + 6], + vals[j * 6 + 7] ); + + cf2_stack_clear( opStack ); + + *curX = vals[12]; + *curY = vals[13]; + } + + + /* Blend numOperands on the stack, */ + /* store results into the first numBlends values, */ + /* then pop remaining arguments. */ + static void + cf2_doBlend( const CFF_Blend blend, + CF2_Stack opStack, + CF2_UInt numBlends ) + { + CF2_UInt delta; + CF2_UInt base; + CF2_UInt i, j; + CF2_UInt numOperands = (CF2_UInt)( numBlends * blend->lenBV ); + + + base = cf2_stack_count( opStack ) - numOperands; + delta = base + numBlends; + + for ( i = 0; i < numBlends; i++ ) + { + const CF2_Fixed* weight = &blend->BV[1]; + + /* start with first term */ + CF2_Fixed sum = cf2_stack_getReal( opStack, i + base ); + + + for ( j = 1; j < blend->lenBV; j++ ) + sum = ADD_INT32( sum, + FT_MulFix( *weight++, + cf2_stack_getReal( opStack, + delta++ ) ) ); + + /* store blended result */ + cf2_stack_setReal( opStack, i + base, sum ); + } + + /* leave only `numBlends' results on stack */ + cf2_stack_pop( opStack, numOperands - numBlends ); + } + + + /* + * `error' is a shared error code used by many objects in this + * routine. Before the code continues from an error, it must check and + * record the error in `*error'. The idea is that this shared + * error code will record the first error encountered. If testing + * for an error anyway, the cost of `goto exit' is small, so we do it, + * even if continuing would be safe. In this case, `lastError' is + * set, so the testing and storing can be done in one place, at `exit'. + * + * Continuing after an error is intended for objects which do their own + * testing of `*error', e.g., array stack functions. This allows us to + * avoid an extra test after the call. + * + * Unimplemented opcodes are ignored. + * + */ + FT_LOCAL_DEF( void ) + cf2_interpT2CharString( CF2_Font font, + CF2_Buffer buf, + CF2_OutlineCallbacks callbacks, + const FT_Vector* translation, + FT_Bool doingSeac, + CF2_Fixed curX, + CF2_Fixed curY, + CF2_Fixed* width ) + { + /* lastError is used for errors that are immediately tested */ + FT_Error lastError = FT_Err_Ok; + + /* pointer to parsed font object */ + PS_Decoder* decoder = font->decoder; + + FT_Error* error = &font->error; + FT_Memory memory = font->memory; + + CF2_Fixed scaleY = font->innerTransform.d; + CF2_Fixed nominalWidthX = cf2_getNominalWidthX( decoder ); + + /* stuff for Type 1 */ + FT_Int known_othersubr_result_cnt = 0; + FT_Bool large_int = FALSE; + FT_Bool initial_map_ready = FALSE; + +#define PS_STORAGE_SIZE 3 + CF2_F16Dot16 results[PS_STORAGE_SIZE]; /* for othersubr results */ + FT_Int result_cnt = 0; + + /* save this for hinting seac accents */ + CF2_Fixed hintOriginY = curY; + + CF2_Stack opStack = NULL; + FT_UInt stackSize; + FT_Byte op1; /* first opcode byte */ + + CF2_F16Dot16 storage[CF2_STORAGE_SIZE]; /* for `put' and `get' */ + CF2_F16Dot16 flexStore[6]; /* for Type 1 flex */ + + /* instruction limit; 20,000,000 matches Avalon */ + FT_UInt32 instructionLimit = 20000000UL; + + CF2_ArrStackRec subrStack; + + FT_Bool haveWidth; + CF2_Buffer charstring = NULL; + + CF2_Int charstringIndex = -1; /* initialize to empty */ + + /* TODO: placeholders for hint structures */ + + /* objects used for hinting */ + CF2_ArrStackRec hStemHintArray; + CF2_ArrStackRec vStemHintArray; + + CF2_HintMaskRec hintMask; + CF2_GlyphPathRec glyphPath; + + + FT_ZERO( &storage ); + FT_ZERO( &results ); + FT_ZERO( &flexStore ); + + /* initialize the remaining objects */ + cf2_arrstack_init( &subrStack, + memory, + error, + sizeof ( CF2_BufferRec ) ); + cf2_arrstack_init( &hStemHintArray, + memory, + error, + sizeof ( CF2_StemHintRec ) ); + cf2_arrstack_init( &vStemHintArray, + memory, + error, + sizeof ( CF2_StemHintRec ) ); + + /* initialize CF2_StemHint arrays */ + cf2_hintmask_init( &hintMask, error ); + + /* initialize path map to manage drawing operations */ + + /* Note: last 4 params are used to handle `MoveToPermissive', which */ + /* may need to call `hintMap.Build' */ + /* TODO: MoveToPermissive is gone; are these still needed? */ + cf2_glyphpath_init( &glyphPath, + font, + callbacks, + scaleY, + /* hShift, */ + &hStemHintArray, + &vStemHintArray, + &hintMask, + hintOriginY, + &font->blues, + translation ); + + /* + * Initialize state for width parsing. From the CFF Spec: + * + * The first stack-clearing operator, which must be one of hstem, + * hstemhm, vstem, vstemhm, cntrmask, hintmask, hmoveto, vmoveto, + * rmoveto, or endchar, takes an additional argument - the width (as + * described earlier), which may be expressed as zero or one numeric + * argument. + * + * What we implement here uses the first validly specified width, but + * does not detect errors for specifying more than one width. + * + * If one of the above operators occurs without explicitly specifying + * a width, we assume the default width. + * + * CFF2 charstrings always return the default width (0). + * + */ + haveWidth = font->isCFF2 ? TRUE : FALSE; + *width = cf2_getDefaultWidthX( decoder ); + + /* + * Note: At this point, all pointers to resources must be NULL + * and all local objects must be initialized. + * There must be no branches to `exit:' above this point. + * + */ + + /* allocate an operand stack */ + stackSize = font->isCFF2 ? cf2_getMaxstack( decoder ) + : CF2_OPERAND_STACK_SIZE; + opStack = cf2_stack_init( memory, error, stackSize ); + + if ( !opStack ) + { + lastError = FT_THROW( Out_Of_Memory ); + goto exit; + } + + /* initialize subroutine stack by placing top level charstring as */ + /* first element (max depth plus one for the charstring) */ + /* Note: Caller owns and must finalize the first charstring. */ + /* Our copy of it does not change that requirement. */ + cf2_arrstack_setCount( &subrStack, CF2_MAX_SUBR + 1 ); + + charstring = (CF2_Buffer)cf2_arrstack_getBuffer( &subrStack ); + *charstring = *buf; /* structure copy */ + + charstringIndex = 0; /* entry is valid now */ + + /* catch errors so far */ + if ( *error ) + goto exit; + + /* main interpreter loop */ + while ( 1 ) + { + if ( font->isT1 ) + FT_ASSERT( known_othersubr_result_cnt == 0 || + result_cnt == 0 ); + + if ( cf2_buf_isEnd( charstring ) ) + { + /* If we've reached the end of the charstring, simulate a */ + /* cf2_cmdRETURN or cf2_cmdENDCHAR. */ + /* We do this for both CFF and CFF2. */ + if ( charstringIndex ) + op1 = cf2_cmdRETURN; /* end of buffer for subroutine */ + else + op1 = cf2_cmdENDCHAR; /* end of buffer for top level charstring */ + } + else + { + op1 = (FT_Byte)cf2_buf_readByte( charstring ); + + /* Explicit RETURN and ENDCHAR in CFF2 should be ignored. */ + /* Note: Trace message will report 0 instead of 11 or 14. */ + if ( ( op1 == cf2_cmdRETURN || op1 == cf2_cmdENDCHAR ) && + font->isCFF2 ) + op1 = cf2_cmdRESERVED_0; + } + + if ( font->isT1 ) + { + if ( !initial_map_ready && + !( op1 == cf2_cmdHSTEM || + op1 == cf2_cmdVSTEM || + op1 == cf2_cmdHSBW || + op1 == cf2_cmdCALLSUBR || + op1 == cf2_cmdRETURN || + op1 == cf2_cmdESC || + op1 == cf2_cmdENDCHAR || + op1 >= 32 /* Numbers */ ) ) + { + /* Skip outline commands first time round. */ + /* `endchar' will trigger initial hintmap build */ + /* and rewind the charstring. */ + cf2_stack_clear( opStack ); + continue; + } + + if ( result_cnt > 0 && + !( op1 == cf2_cmdCALLSUBR || + op1 == cf2_cmdRETURN || + op1 == cf2_cmdESC || + op1 >= 32 /* Numbers */ ) ) + { + /* all operands have been transferred by previous pops */ + result_cnt = 0; + } + + if ( large_int && !( op1 >= 32 || op1 == cf2_escDIV ) ) + { + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " no `div' after large integer\n" )); + + large_int = FALSE; + } + } + + /* check for errors once per loop */ + if ( *error ) + goto exit; + + instructionLimit--; + if ( instructionLimit == 0 ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + switch( op1 ) + { + case cf2_cmdRESERVED_0: + case cf2_cmdRESERVED_2: + case cf2_cmdRESERVED_17: + /* we may get here if we have a prior error */ + FT_TRACE4(( " unknown op (%d)\n", op1 )); + break; + + case cf2_cmdVSINDEX: + FT_TRACE4(( " vsindex\n" )); + + if ( !font->isCFF2 ) + break; /* clear stack & ignore */ + + if ( font->blend.usedBV ) + { + /* vsindex not allowed after blend */ + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + { + FT_Int temp = cf2_stack_popInt( opStack ); + + + if ( temp >= 0 ) + font->vsindex = (FT_UInt)temp; + } + break; + + case cf2_cmdBLEND: + { + FT_UInt numBlends; + + + FT_TRACE4(( " blend\n" )); + + if ( !font->isCFF2 ) + break; /* clear stack & ignore */ + + /* do we have a `blend' op in a non-variant font? */ + if ( !font->blend.font ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + /* check cached blend vector */ + if ( font->cffload->blend_check_vector( &font->blend, + font->vsindex, + font->lenNDV, + font->NDV ) ) + { + lastError = font->cffload->blend_build_vector( &font->blend, + font->vsindex, + font->lenNDV, + font->NDV ); + if ( lastError ) + goto exit; + } + + /* do the blend */ + numBlends = (FT_UInt)cf2_stack_popInt( opStack ); + if ( numBlends > stackSize ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + cf2_doBlend( &font->blend, opStack, numBlends ); + + font->blend.usedBV = TRUE; + } + continue; /* do not clear the stack */ + + case cf2_cmdHSTEMHM: + case cf2_cmdHSTEM: + FT_TRACE4(( op1 == cf2_cmdHSTEMHM ? " hstemhm\n" : " hstem\n" )); + + if ( !font->isT1 ) + { + /* never add hints after the mask is computed */ + /* except if in Type 1 mode (no hintmask op) */ + if ( cf2_hintmask_isValid( &hintMask ) ) + { + FT_TRACE4(( "cf2_interpT2CharString:" + " invalid horizontal hint mask\n" )); + break; + } + } + + /* add left-sidebearing correction in Type 1 mode */ + cf2_doStems( font, + opStack, + &hStemHintArray, + width, + &haveWidth, + font->isT1 ? decoder->builder.left_bearing->y + : 0 ); + + if ( decoder->width_only ) + goto exit; + + break; + + case cf2_cmdVSTEMHM: + case cf2_cmdVSTEM: + FT_TRACE4(( op1 == cf2_cmdVSTEMHM ? " vstemhm\n" : " vstem\n" )); + + if ( !font->isT1 ) + { + /* never add hints after the mask is computed */ + /* except if in Type 1 mode (no hintmask op) */ + if ( cf2_hintmask_isValid( &hintMask ) ) + { + FT_TRACE4(( "cf2_interpT2CharString:" + " invalid vertical hint mask\n" )); + break; + } + } + + /* add left-sidebearing correction in Type 1 mode */ + cf2_doStems( font, + opStack, + &vStemHintArray, + width, + &haveWidth, + font->isT1 ? decoder->builder.left_bearing->x + : 0 ); + + if ( decoder->width_only ) + goto exit; + + break; + + case cf2_cmdVMOVETO: + FT_TRACE4(( " vmoveto\n" )); + + if ( font->isT1 && !decoder->flex_state && !haveWidth ) + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " No width. Use hsbw/sbw as first op\n" )); + + if ( cf2_stack_count( opStack ) > 1 && !haveWidth ) + *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ), + nominalWidthX ); + + /* width is defined or default after this */ + haveWidth = TRUE; + + if ( decoder->width_only ) + goto exit; + + curY = ADD_INT32( curY, cf2_stack_popFixed( opStack ) ); + + if ( !decoder->flex_state ) + cf2_glyphpath_moveTo( &glyphPath, curX, curY ); + + break; + + case cf2_cmdRLINETO: + { + CF2_UInt idx; + CF2_UInt count = cf2_stack_count( opStack ); + + + FT_TRACE4(( " rlineto\n" )); + + for ( idx = 0; idx < count; idx += 2 ) + { + curX = ADD_INT32( curX, cf2_stack_getReal( opStack, + idx + 0 ) ); + curY = ADD_INT32( curY, cf2_stack_getReal( opStack, + idx + 1 ) ); + + cf2_glyphpath_lineTo( &glyphPath, curX, curY ); + } + + cf2_stack_clear( opStack ); + } + continue; /* no need to clear stack again */ + + case cf2_cmdHLINETO: + case cf2_cmdVLINETO: + { + CF2_UInt idx; + CF2_UInt count = cf2_stack_count( opStack ); + + FT_Bool isX = FT_BOOL( op1 == cf2_cmdHLINETO ); + + + FT_TRACE4(( isX ? " hlineto\n" : " vlineto\n" )); + + for ( idx = 0; idx < count; idx++ ) + { + CF2_Fixed v = cf2_stack_getReal( opStack, idx ); + + + if ( isX ) + curX = ADD_INT32( curX, v ); + else + curY = ADD_INT32( curY, v ); + + isX = !isX; + + cf2_glyphpath_lineTo( &glyphPath, curX, curY ); + } + + cf2_stack_clear( opStack ); + } + continue; + + case cf2_cmdRCURVELINE: + case cf2_cmdRRCURVETO: + { + CF2_UInt count = cf2_stack_count( opStack ); + CF2_UInt idx = 0; + + + FT_TRACE4(( op1 == cf2_cmdRCURVELINE ? " rcurveline\n" + : " rrcurveto\n" )); + + while ( idx + 6 <= count ) + { + CF2_Fixed x1, y1, x2, y2, x3, y3; + + + x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX ); + y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), curY ); + x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), x1 ); + y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y1 ); + x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), x2 ); + y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 5 ), y2 ); + + cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); + + curX = x3; + curY = y3; + idx += 6; + } + + if ( op1 == cf2_cmdRCURVELINE ) + { + curX = ADD_INT32( curX, cf2_stack_getReal( opStack, + idx + 0 ) ); + curY = ADD_INT32( curY, cf2_stack_getReal( opStack, + idx + 1 ) ); + + cf2_glyphpath_lineTo( &glyphPath, curX, curY ); + } + + cf2_stack_clear( opStack ); + } + continue; /* no need to clear stack again */ + + case cf2_cmdCLOSEPATH: + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (%d)\n", op1 )); + else + { + FT_TRACE4(( " closepath" )); + + /* if there is no path, `closepath' is a no-op */ + ps_builder_close_contour( &decoder->builder ); + + haveWidth = TRUE; + } + break; + + case cf2_cmdCALLGSUBR: + case cf2_cmdCALLSUBR: + { + CF2_Int subrNum; + + + FT_TRACE4(( op1 == cf2_cmdCALLGSUBR ? " callgsubr" + : " callsubr" )); + + if ( ( !font->isT1 && charstringIndex > CF2_MAX_SUBR ) || + ( font->isT1 && charstringIndex > T1_MAX_SUBRS_CALLS ) ) + { + /* max subr plus one for charstring */ + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; /* overflow of stack */ + } + + /* push our current CFF charstring region on subrStack */ + charstring = (CF2_Buffer) + cf2_arrstack_getPointer( + &subrStack, + (size_t)charstringIndex + 1 ); + + /* set up the new CFF region and pointer */ + subrNum = cf2_stack_popInt( opStack ); + + if ( font->isT1 && decoder->locals_hash ) + { + size_t* val = ft_hash_num_lookup( subrNum, + decoder->locals_hash ); + + + if ( val ) + subrNum = *val; + else + subrNum = -1; + } + + switch ( op1 ) + { + case cf2_cmdCALLGSUBR: + FT_TRACE4(( " (idx %d, entering level %d)\n", + subrNum + decoder->globals_bias, + charstringIndex + 1 )); + + if ( cf2_initGlobalRegionBuffer( decoder, + subrNum, + charstring ) ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; /* subroutine lookup or stream error */ + } + break; + + default: + /* cf2_cmdCALLSUBR */ + FT_TRACE4(( " (idx %d, entering level %d)\n", + subrNum + decoder->locals_bias, + charstringIndex + 1 )); + + if ( cf2_initLocalRegionBuffer( decoder, + subrNum, + charstring ) ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; /* subroutine lookup or stream error */ + } + } + + charstringIndex += 1; /* entry is valid now */ + } + continue; /* do not clear the stack */ + + case cf2_cmdRETURN: + FT_TRACE4(( " return (leaving level %d)\n", charstringIndex )); + + if ( charstringIndex < 1 ) + { + /* Note: cannot return from top charstring */ + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; /* underflow of stack */ + } + + /* restore position in previous charstring */ + charstring = (CF2_Buffer) + cf2_arrstack_getPointer( + &subrStack, + (CF2_UInt)--charstringIndex ); + continue; /* do not clear the stack */ + + case cf2_cmdESC: + { + FT_Byte op2 = (FT_Byte)cf2_buf_readByte( charstring ); + + + /* first switch for 2-byte operators handles CFF2 */ + /* and opcodes that are reserved for both CFF and CFF2 */ + switch ( op2 ) + { + case cf2_escHFLEX: + { + static const FT_Bool readFromStack[12] = + { + TRUE /* dx1 */, FALSE /* dy1 */, + TRUE /* dx2 */, TRUE /* dy2 */, + TRUE /* dx3 */, FALSE /* dy3 */, + TRUE /* dx4 */, FALSE /* dy4 */, + TRUE /* dx5 */, FALSE /* dy5 */, + TRUE /* dx6 */, FALSE /* dy6 */ + }; + + + FT_TRACE4(( " hflex\n" )); + + cf2_doFlex( opStack, + &curX, + &curY, + &glyphPath, + readFromStack, + FALSE /* doConditionalLastRead */ ); + } + continue; + + case cf2_escFLEX: + { + static const FT_Bool readFromStack[12] = + { + TRUE /* dx1 */, TRUE /* dy1 */, + TRUE /* dx2 */, TRUE /* dy2 */, + TRUE /* dx3 */, TRUE /* dy3 */, + TRUE /* dx4 */, TRUE /* dy4 */, + TRUE /* dx5 */, TRUE /* dy5 */, + TRUE /* dx6 */, TRUE /* dy6 */ + }; + + + FT_TRACE4(( " flex\n" )); + + cf2_doFlex( opStack, + &curX, + &curY, + &glyphPath, + readFromStack, + FALSE /* doConditionalLastRead */ ); + } + break; /* TODO: why is this not a continue? */ + + case cf2_escHFLEX1: + { + static const FT_Bool readFromStack[12] = + { + TRUE /* dx1 */, TRUE /* dy1 */, + TRUE /* dx2 */, TRUE /* dy2 */, + TRUE /* dx3 */, FALSE /* dy3 */, + TRUE /* dx4 */, FALSE /* dy4 */, + TRUE /* dx5 */, TRUE /* dy5 */, + TRUE /* dx6 */, FALSE /* dy6 */ + }; + + + FT_TRACE4(( " hflex1\n" )); + + cf2_doFlex( opStack, + &curX, + &curY, + &glyphPath, + readFromStack, + FALSE /* doConditionalLastRead */ ); + } + continue; + + case cf2_escFLEX1: + { + static const FT_Bool readFromStack[12] = + { + TRUE /* dx1 */, TRUE /* dy1 */, + TRUE /* dx2 */, TRUE /* dy2 */, + TRUE /* dx3 */, TRUE /* dy3 */, + TRUE /* dx4 */, TRUE /* dy4 */, + TRUE /* dx5 */, TRUE /* dy5 */, + FALSE /* dx6 */, FALSE /* dy6 */ + }; + + + FT_TRACE4(( " flex1\n" )); + + cf2_doFlex( opStack, + &curX, + &curY, + &glyphPath, + readFromStack, + TRUE /* doConditionalLastRead */ ); + } + continue; + + /* these opcodes are always reserved */ + case cf2_escRESERVED_8: + case cf2_escRESERVED_13: + case cf2_escRESERVED_19: + case cf2_escRESERVED_25: + case cf2_escRESERVED_31: + case cf2_escRESERVED_32: + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + break; + + default: + { + if ( font->isCFF2 || op2 >= cf2_escRESERVED_38 ) + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + else if ( font->isT1 && result_cnt > 0 && op2 != cf2_escPOP ) + { + /* all operands have been transferred by previous pops */ + result_cnt = 0; + } + else + { + /* second switch for 2-byte operators handles */ + /* CFF and Type 1 */ + switch ( op2 ) + { + + case cf2_escDOTSECTION: + /* something about `flip type of locking' -- ignore it */ + FT_TRACE4(( " dotsection\n" )); + + break; + + case cf2_escVSTEM3: + case cf2_escHSTEM3: + /* + * Type 1: Type 2: + * x0 dx0 x1 dx1 x2 dx2 vstem3 x dx {dxa dxb}* vstem + * y0 dy0 y1 dy1 y2 dy2 hstem3 y dy {dya dyb}* hstem + * relative to lsb point relative to zero + * + */ + { + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + else + { + CF2_F16Dot16 v0, v1, v2; + + FT_Bool isV = FT_BOOL( op2 == cf2_escVSTEM3 ); + + + FT_TRACE4(( isV ? " vstem3\n" + : " hstem3\n" )); + + FT_ASSERT( cf2_stack_count( opStack ) == 6 ); + + v0 = cf2_stack_getReal( opStack, 0 ); + v1 = cf2_stack_getReal( opStack, 2 ); + v2 = cf2_stack_getReal( opStack, 4 ); + + cf2_stack_setReal( + opStack, 2, + SUB_INT32( SUB_INT32( v1, v0 ), + cf2_stack_getReal( opStack, 1 ) ) ); + cf2_stack_setReal( + opStack, 4, + SUB_INT32( SUB_INT32( v2, v1 ), + cf2_stack_getReal( opStack, 3 ) ) ); + + /* add left-sidebearing correction */ + cf2_doStems( font, + opStack, + isV ? &vStemHintArray : &hStemHintArray, + width, + &haveWidth, + isV ? decoder->builder.left_bearing->x + : decoder->builder.left_bearing->y ); + + if ( decoder->width_only ) + goto exit; + } + } + break; + + case cf2_escAND: + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; + + + FT_TRACE4(( " and\n" )); + + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushInt( opStack, arg1 && arg2 ); + } + continue; /* do not clear the stack */ + + case cf2_escOR: + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; + + + FT_TRACE4(( " or\n" )); + + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushInt( opStack, arg1 || arg2 ); + } + continue; /* do not clear the stack */ + + case cf2_escNOT: + { + CF2_F16Dot16 arg; + + + FT_TRACE4(( " not\n" )); + + arg = cf2_stack_popFixed( opStack ); + + cf2_stack_pushInt( opStack, !arg ); + } + continue; /* do not clear the stack */ + + case cf2_escSEAC: + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + else + { + FT_Error error2; + CF2_Int bchar_index, achar_index; + FT_Vector left_bearing, advance; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + T1_Face face = (T1_Face)decoder->builder.face; +#endif + CF2_BufferRec component; + CF2_Fixed dummyWidth; + + CF2_Int achar = cf2_stack_popInt( opStack ); + CF2_Int bchar = cf2_stack_popInt( opStack ); + + FT_Pos ady = cf2_stack_popFixed ( opStack ); + FT_Pos adx = cf2_stack_popFixed ( opStack ); + FT_Pos asb = cf2_stack_popFixed ( opStack ); + + + FT_TRACE4(( " seac\n" )); + + if ( doingSeac ) + { + FT_ERROR(( " nested seac\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; /* nested seac */ + } + + if ( decoder->builder.metrics_only ) + { + FT_ERROR(( " unexpected seac\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; /* unexpected seac */ + } + + /* `glyph_names' is set to 0 for CID fonts which do */ + /* not include an encoding. How can we deal with */ + /* these? */ +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( decoder->glyph_names == 0 && + !face->root.internal->incremental_interface ) +#else + if ( decoder->glyph_names == 0 ) +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + FT_ERROR(( + "cf2_interpT2CharString: (Type 1 seac)" + " glyph names table not available in this font\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + /* seac weirdness */ + adx += decoder->builder.left_bearing->x; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( face->root.internal->incremental_interface ) + { + /* the caller must handle the font encoding also */ + bchar_index = bchar; + achar_index = achar; + } + else +#endif + { + bchar_index = t1_lookup_glyph_by_stdcharcode_ps( + decoder, bchar ); + achar_index = t1_lookup_glyph_by_stdcharcode_ps( + decoder, achar ); + } + + if ( bchar_index < 0 || achar_index < 0 ) + { + FT_ERROR(( + "cf2_interpT2CharString: (Type 1 seac)" + " invalid seac character code arguments\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + /* if we are trying to load a composite glyph, */ + /* do not load the accent character and return */ + /* the array of subglyphs. */ + if ( decoder->builder.no_recurse ) + { + FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph; + FT_GlyphLoader loader = glyph->internal->loader; + FT_SubGlyph subg; + + + /* reallocate subglyph array if necessary */ + error2 = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); + if ( error2 ) + { + lastError = error2; /* pass FreeType error through */ + goto exit; + } + + subg = loader->current.subglyphs; + + /* subglyph 0 = base character */ + subg->index = bchar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | + FT_SUBGLYPH_FLAG_USE_MY_METRICS; + subg->arg1 = 0; + subg->arg2 = 0; + subg++; + + /* subglyph 1 = accent character */ + subg->index = achar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; + subg->arg1 = (FT_Int)FIXED_TO_INT( adx - asb ); + subg->arg2 = (FT_Int)FIXED_TO_INT( ady ); + + /* set up remaining glyph fields */ + glyph->num_subglyphs = 2; + glyph->subglyphs = loader->base.subglyphs; + glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + loader->current.num_subglyphs = 2; + + goto exit; + } + + /* First load `bchar' in builder */ + /* now load the unscaled outline */ + + /* prepare loader */ + FT_GlyphLoader_Prepare( decoder->builder.loader ); + + error2 = cf2_getT1SeacComponent( decoder, + (FT_UInt)bchar_index, + &component ); + if ( error2 ) + { + lastError = error2; /* pass FreeType error through */ + goto exit; + } + cf2_interpT2CharString( font, + &component, + callbacks, + translation, + TRUE, + 0, + 0, + &dummyWidth ); + cf2_freeT1SeacComponent( decoder, &component ); + + /* save the left bearing and width of the base */ + /* character as they will be erased by the next load */ + + left_bearing = *decoder->builder.left_bearing; + advance = *decoder->builder.advance; + + decoder->builder.left_bearing->x = 0; + decoder->builder.left_bearing->y = 0; + + /* Now load `achar' on top of */ + /* the base outline */ + + error2 = cf2_getT1SeacComponent( decoder, + (FT_UInt)achar_index, + &component ); + if ( error2 ) + { + lastError = error2; /* pass FreeType error through */ + goto exit; + } + cf2_interpT2CharString( font, + &component, + callbacks, + translation, + TRUE, + adx - asb, + ady, + &dummyWidth ); + cf2_freeT1SeacComponent( decoder, &component ); + + /* restore the left side bearing and */ + /* advance width of the base character */ + + *decoder->builder.left_bearing = left_bearing; + *decoder->builder.advance = advance; + + goto exit; + } + break; + + case cf2_escSBW: + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + else + { + CF2_Fixed lsb_x, lsb_y; + PS_Builder* builder; + + + FT_TRACE4(( " sbw" )); + + builder = &decoder->builder; + + builder->advance->y = cf2_stack_popFixed( opStack ); + builder->advance->x = cf2_stack_popFixed( opStack ); + + lsb_y = cf2_stack_popFixed( opStack ); + lsb_x = cf2_stack_popFixed( opStack ); + + builder->left_bearing->x = + ADD_INT32( builder->left_bearing->x, lsb_x ); + builder->left_bearing->y = + ADD_INT32( builder->left_bearing->y, lsb_y ); + + haveWidth = TRUE; + + /* the `metrics_only' indicates that we only want */ + /* to compute the glyph's metrics (lsb + advance */ + /* width), not load the rest of it; so exit */ + /* immediately */ + if ( builder->metrics_only ) + goto exit; + + if ( initial_map_ready ) + { + curX = ADD_INT32( curX, lsb_x ); + curY = ADD_INT32( curY, lsb_y ); + } + } + break; + + case cf2_escABS: + { + CF2_F16Dot16 arg; + + + FT_TRACE4(( " abs\n" )); + + arg = cf2_stack_popFixed( opStack ); + + if ( arg < -CF2_FIXED_MAX ) + cf2_stack_pushFixed( opStack, CF2_FIXED_MAX ); + else + cf2_stack_pushFixed( opStack, FT_ABS( arg ) ); + } + continue; /* do not clear the stack */ + + case cf2_escADD: + { + CF2_F16Dot16 summand1; + CF2_F16Dot16 summand2; + + + FT_TRACE4(( " add\n" )); + + summand2 = cf2_stack_popFixed( opStack ); + summand1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + ADD_INT32( summand1, + summand2 ) ); + } + continue; /* do not clear the stack */ + + case cf2_escSUB: + { + CF2_F16Dot16 minuend; + CF2_F16Dot16 subtrahend; + + + FT_TRACE4(( " sub\n" )); + + subtrahend = cf2_stack_popFixed( opStack ); + minuend = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + SUB_INT32( minuend, subtrahend ) ); + } + continue; /* do not clear the stack */ + + case cf2_escDIV: + { + CF2_F16Dot16 dividend; + CF2_F16Dot16 divisor; + + + FT_TRACE4(( " div\n" )); + + if ( font->isT1 && large_int ) + { + divisor = (CF2_F16Dot16)cf2_stack_popInt( opStack ); + dividend = (CF2_F16Dot16)cf2_stack_popInt( opStack ); + + large_int = FALSE; + } + else + { + divisor = cf2_stack_popFixed( opStack ); + dividend = cf2_stack_popFixed( opStack ); + } + + cf2_stack_pushFixed( opStack, + FT_DivFix( dividend, divisor ) ); + + } + continue; /* do not clear the stack */ + + case cf2_escNEG: + { + CF2_F16Dot16 arg; + + + FT_TRACE4(( " neg\n" )); + + arg = cf2_stack_popFixed( opStack ); + + if ( arg < -CF2_FIXED_MAX ) + cf2_stack_pushFixed( opStack, CF2_FIXED_MAX ); + else + cf2_stack_pushFixed( opStack, -arg ); + } + continue; /* do not clear the stack */ + + case cf2_escEQ: + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; + + + FT_TRACE4(( " eq\n" )); + + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushInt( opStack, arg1 == arg2 ); + } + continue; /* do not clear the stack */ + + case cf2_escCALLOTHERSUBR: + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + else + { + CF2_Int subr_no; + CF2_Int arg_cnt; + CF2_UInt count; + CF2_UInt opIdx = 0; + + + FT_TRACE4(( " callothersubr\n" )); + + subr_no = cf2_stack_popInt( opStack ); + arg_cnt = cf2_stack_popInt( opStack ); + + /*******************************************************/ + /* */ + /* remove all operands to callothersubr from the stack */ + /* */ + /* for handled othersubrs, where we know the number of */ + /* arguments, we increase the stack by the value of */ + /* known_othersubr_result_cnt */ + /* */ + /* for unhandled othersubrs the following pops adjust */ + /* the stack pointer as necessary */ + + count = cf2_stack_count( opStack ); + FT_ASSERT( (CF2_UInt)arg_cnt <= count ); + + opIdx += count - (CF2_UInt)arg_cnt; + + known_othersubr_result_cnt = 0; + result_cnt = 0; + + /* XXX TODO: The checks to `arg_count == ' */ + /* might not be correct; an othersubr expects a */ + /* certain number of operands on the PostScript stack */ + /* (as opposed to the T1 stack) but it doesn't have to */ + /* put them there by itself; previous othersubrs might */ + /* have left the operands there if they were not */ + /* followed by an appropriate number of pops */ + /* */ + /* On the other hand, Adobe Reader 7.0.8 for Linux */ + /* doesn't accept a font that contains charstrings */ + /* like */ + /* */ + /* 100 200 2 20 callothersubr */ + /* 300 1 20 callothersubr pop */ + /* */ + /* Perhaps this is the reason why BuildCharArray */ + /* exists. */ + + switch ( subr_no ) + { + case 0: /* end flex feature */ + if ( arg_cnt != 3 ) + goto Unexpected_OtherSubr; + + if ( initial_map_ready && + ( !decoder->flex_state || + decoder->num_flex_vectors != 7 ) ) + { + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " unexpected flex end\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + /* the two `results' are popped */ + /* by the following setcurrentpoint */ + cf2_stack_pushFixed( opStack, curX ); + cf2_stack_pushFixed( opStack, curY ); + known_othersubr_result_cnt = 2; + break; + + case 1: /* start flex feature */ + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + if ( !initial_map_ready ) + break; + + if ( ps_builder_check_points( &decoder->builder, 6 ) ) + goto exit; + + decoder->flex_state = 1; + decoder->num_flex_vectors = 0; + break; + + case 2: /* add flex vectors */ + { + FT_Int idx; + FT_Int idx2; + + + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + if ( !initial_map_ready ) + break; + + if ( !decoder->flex_state ) + { + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " missing flex start\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + /* note that we should not add a point for */ + /* index 0; this will move our current position */ + /* to the flex point without adding any point */ + /* to the outline */ + idx = decoder->num_flex_vectors++; + if ( idx > 0 && idx < 7 ) + { + /* in malformed fonts it is possible to have */ + /* other opcodes in the middle of a flex (which */ + /* don't increase `num_flex_vectors'); we thus */ + /* have to check whether we can add a point */ + + if ( ps_builder_check_points( &decoder->builder, + 1 ) ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + /* map: 1->2 2->4 3->6 4->2 5->4 6->6 */ + idx2 = ( idx > 3 ? idx - 3 : idx ) * 2; + + flexStore[idx2 - 2] = curX; + flexStore[idx2 - 1] = curY; + + if ( idx == 3 || idx == 6 ) + cf2_glyphpath_curveTo( &glyphPath, + flexStore[0], + flexStore[1], + flexStore[2], + flexStore[3], + flexStore[4], + flexStore[5] ); + } + } + break; + + case 3: /* change hints */ + if ( arg_cnt != 1 ) + goto Unexpected_OtherSubr; + + if ( initial_map_ready ) + { + /* do not clear hints if initial hintmap */ + /* is not ready - we need to collate all */ + cf2_arrstack_clear( &vStemHintArray ); + cf2_arrstack_clear( &hStemHintArray ); + + cf2_hintmask_init( &hintMask, error ); + hintMask.isValid = FALSE; + hintMask.isNew = TRUE; + } + + known_othersubr_result_cnt = 1; + break; + + case 12: + case 13: + /* counter control hints, clear stack */ + cf2_stack_clear( opStack ); + break; + + case 14: + case 15: + case 16: + case 17: + case 18: /* multiple masters */ + { + PS_Blend blend = decoder->blend; + FT_UInt num_points, nn, mm; + CF2_UInt delta; + CF2_UInt values; + + + if ( !blend ) + { + FT_ERROR(( + "cf2_interpT2CharString:" + " unexpected multiple masters operator\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + num_points = (FT_UInt)subr_no - 13 + + ( subr_no == 18 ); + if ( arg_cnt != (FT_Int)( num_points * + blend->num_designs ) ) + { + FT_ERROR(( + "cf2_interpT2CharString:" + " incorrect number of multiple masters arguments\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + /* We want to compute */ + /* */ + /* a0*w0 + a1*w1 + ... + ak*wk */ + /* */ + /* but we only have a0, a1-a0, a2-a0, ..., ak-a0. */ + /* */ + /* However, given that w0 + w1 + ... + wk == 1, we */ + /* can rewrite it easily as */ + /* */ + /* a0 + (a1-a0)*w1 + (a2-a0)*w2 + ... + (ak-a0)*wk */ + /* */ + /* where k == num_designs-1. */ + /* */ + /* I guess that's why it's written in this `compact' */ + /* form. */ + /* */ + delta = opIdx + num_points; + values = opIdx; + for ( nn = 0; nn < num_points; nn++ ) + { + CF2_Fixed tmp = cf2_stack_getReal( opStack, + values ); + + + for ( mm = 1; mm < blend->num_designs; mm++ ) + tmp = ADD_INT32( tmp, + FT_MulFix( + cf2_stack_getReal( opStack, + delta++ ), + blend->weight_vector[mm] ) ); + + cf2_stack_setReal( opStack, values++, tmp ); + } + cf2_stack_pop( opStack, + (CF2_UInt)arg_cnt - num_points ); + + known_othersubr_result_cnt = (FT_Int)num_points; + break; + } + + case 19: + /* 1 19 callothersubr */ + /* ==> replace elements starting from index */ + /* cvi( ) of BuildCharArray with */ + /* WeightVector */ + { + FT_Int idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 1 || !blend ) + goto Unexpected_OtherSubr; + + idx = cf2_stack_popInt( opStack ); + + if ( idx < 0 || + (FT_UInt)idx + blend->num_designs > + decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + ft_memcpy( &decoder->buildchar[idx], + blend->weight_vector, + blend->num_designs * + sizeof ( blend->weight_vector[0] ) ); + } + break; + + case 20: + /* 2 20 callothersubr pop */ + /* ==> push + onto T1 stack */ + { + CF2_F16Dot16 summand1; + CF2_F16Dot16 summand2; + + + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + summand2 = cf2_stack_popFixed( opStack ); + summand1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + ADD_INT32( summand1, + summand2 ) ); + known_othersubr_result_cnt = 1; + } + break; + + case 21: + /* 2 21 callothersubr pop */ + /* ==> push - onto T1 stack */ + { + CF2_F16Dot16 minuend; + CF2_F16Dot16 subtrahend; + + + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + subtrahend = cf2_stack_popFixed( opStack ); + minuend = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + SUB_INT32( minuend, + subtrahend ) ); + known_othersubr_result_cnt = 1; + } + break; + + case 22: + /* 2 22 callothersubr pop */ + /* ==> push * onto T1 stack */ + { + CF2_F16Dot16 factor1; + CF2_F16Dot16 factor2; + + + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + factor2 = cf2_stack_popFixed( opStack ); + factor1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + FT_MulFix( factor1, factor2 ) ); + known_othersubr_result_cnt = 1; + } + break; + + case 23: + /* 2 23 callothersubr pop */ + /* ==> push / onto T1 stack */ + { + CF2_F16Dot16 dividend; + CF2_F16Dot16 divisor; + + + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + divisor = cf2_stack_popFixed( opStack ); + dividend = cf2_stack_popFixed( opStack ); + + if ( divisor == 0 ) + goto Unexpected_OtherSubr; + + cf2_stack_pushFixed( opStack, + FT_DivFix( dividend, + divisor ) ); + known_othersubr_result_cnt = 1; + } + break; + + case 24: + /* 2 24 callothersubr */ + /* ==> set BuildCharArray[cvi( )] = */ + { + CF2_Int idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 2 || !blend ) + goto Unexpected_OtherSubr; + + idx = cf2_stack_popInt( opStack ); + + if ( idx < 0 || + (FT_UInt)idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + decoder->buildchar[idx] = + cf2_stack_popFixed( opStack ); + } + break; + + case 25: + /* 1 25 callothersubr pop */ + /* ==> push BuildCharArray[cvi( idx )] */ + /* onto T1 stack */ + { + CF2_Int idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 1 || !blend ) + goto Unexpected_OtherSubr; + + idx = cf2_stack_popInt( opStack ); + + if ( idx < 0 || + (FT_UInt)idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + cf2_stack_pushFixed( opStack, + decoder->buildchar[idx] ); + known_othersubr_result_cnt = 1; + } + break; + +#if 0 + case 26: + /* mark */ + /* ==> set BuildCharArray[cvi( )] = , */ + /* leave mark on T1 stack */ + /* */ + /* ==> set BuildCharArray[cvi( )] = */ + XXX which routine has left its mark on the + XXX (PostScript) stack?; + break; +#endif + + case 27: + /* 4 27 callothersubr pop */ + /* ==> push onto T1 stack if <= , */ + /* otherwise push */ + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; + CF2_F16Dot16 cond1; + CF2_F16Dot16 cond2; + + + if ( arg_cnt != 4 ) + goto Unexpected_OtherSubr; + + cond2 = cf2_stack_popFixed( opStack ); + cond1 = cf2_stack_popFixed( opStack ); + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + cond1 <= cond2 ? arg1 : arg2 ); + known_othersubr_result_cnt = 1; + } + break; + + case 28: + /* 0 28 callothersubr pop */ + /* ==> push random value from interval [0, 1) */ + /* onto stack */ + { + CF2_F16Dot16 r; + + + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + /* only use the lower 16 bits of `random' */ + /* to generate a number in the range (0;1] */ + r = (CF2_F16Dot16) + ( ( decoder->current_subfont->random & 0xFFFF ) + 1 ); + + decoder->current_subfont->random = + cff_random( decoder->current_subfont->random ); + + cf2_stack_pushFixed( opStack, r ); + known_othersubr_result_cnt = 1; + } + break; + + default: + if ( arg_cnt >= 0 && subr_no >= 0 ) + { + FT_Int i; + + + FT_ERROR(( + "cf2_interpT2CharString (Type 1 mode):" + " unknown othersubr [%d %d], wish me luck\n", + arg_cnt, subr_no )); + + /* store the unused args */ + /* for this unhandled OtherSubr */ + + if ( arg_cnt > PS_STORAGE_SIZE ) + arg_cnt = PS_STORAGE_SIZE; + result_cnt = arg_cnt; + + for ( i = 1; i <= arg_cnt; i++ ) + results[result_cnt - i] = + cf2_stack_popFixed( opStack ); + + break; + } + /* fall through */ + + Unexpected_OtherSubr: + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " invalid othersubr [%d %d]\n", + arg_cnt, subr_no )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + } + continue; /* do not clear the stack */ + + case cf2_escPOP: + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + else + { + FT_TRACE4(( " pop" )); + + if ( known_othersubr_result_cnt > 0 ) + { + known_othersubr_result_cnt--; + /* ignore, we pushed the operands ourselves */ + continue; + } + + if ( result_cnt == 0 ) + { + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " no more operands for othersubr\n" )); + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; + } + + result_cnt--; + cf2_stack_pushFixed( opStack, results[result_cnt] ); + } + continue; /* do not clear the stack */ + + case cf2_escDROP: + FT_TRACE4(( " drop\n" )); + + (void)cf2_stack_popFixed( opStack ); + continue; /* do not clear the stack */ + + case cf2_escPUT: + { + CF2_F16Dot16 val; + CF2_Int idx; + + + FT_TRACE4(( " put\n" )); + + idx = cf2_stack_popInt( opStack ); + val = cf2_stack_popFixed( opStack ); + + if ( idx >= 0 && idx < CF2_STORAGE_SIZE ) + storage[idx] = val; + } + continue; /* do not clear the stack */ + + case cf2_escGET: + { + CF2_Int idx; + + + FT_TRACE4(( " get\n" )); + + idx = cf2_stack_popInt( opStack ); + + if ( idx >= 0 && idx < CF2_STORAGE_SIZE ) + cf2_stack_pushFixed( opStack, storage[idx] ); + } + continue; /* do not clear the stack */ + + case cf2_escIFELSE: + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; + CF2_F16Dot16 cond1; + CF2_F16Dot16 cond2; + + + FT_TRACE4(( " ifelse\n" )); + + cond2 = cf2_stack_popFixed( opStack ); + cond1 = cf2_stack_popFixed( opStack ); + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + cond1 <= cond2 ? arg1 : arg2 ); + } + continue; /* do not clear the stack */ + + case cf2_escRANDOM: /* in spec */ + { + CF2_F16Dot16 r; + + + FT_TRACE4(( " random\n" )); + + /* only use the lower 16 bits of `random' */ + /* to generate a number in the range (0;1] */ + r = (CF2_F16Dot16) + ( ( decoder->current_subfont->random & 0xFFFF ) + 1 ); + + decoder->current_subfont->random = + cff_random( decoder->current_subfont->random ); + + cf2_stack_pushFixed( opStack, r ); + } + continue; /* do not clear the stack */ + + case cf2_escMUL: + { + CF2_F16Dot16 factor1; + CF2_F16Dot16 factor2; + + + FT_TRACE4(( " mul\n" )); + + factor2 = cf2_stack_popFixed( opStack ); + factor1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, + FT_MulFix( factor1, factor2 ) ); + } + continue; /* do not clear the stack */ + + case cf2_escSQRT: + { + CF2_F16Dot16 arg; + + + FT_TRACE4(( " sqrt\n" )); + + arg = cf2_stack_popFixed( opStack ); + if ( arg > 0 ) + { + /* use a start value that doesn't make */ + /* the algorithm's addition overflow */ + FT_Fixed root = arg < 10 ? arg : arg >> 1; + FT_Fixed new_root; + + + /* Babylonian method */ + for (;;) + { + new_root = ( root + FT_DivFix( arg, root ) + 1 ) >> 1; + if ( new_root == root ) + break; + root = new_root; + } + arg = new_root; + } + else + arg = 0; + + cf2_stack_pushFixed( opStack, arg ); + } + continue; /* do not clear the stack */ + + case cf2_escDUP: + { + CF2_F16Dot16 arg; + + + FT_TRACE4(( " dup\n" )); + + arg = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, arg ); + cf2_stack_pushFixed( opStack, arg ); + } + continue; /* do not clear the stack */ + + case cf2_escEXCH: + { + CF2_F16Dot16 arg1; + CF2_F16Dot16 arg2; + + + FT_TRACE4(( " exch\n" )); + + arg2 = cf2_stack_popFixed( opStack ); + arg1 = cf2_stack_popFixed( opStack ); + + cf2_stack_pushFixed( opStack, arg2 ); + cf2_stack_pushFixed( opStack, arg1 ); + } + continue; /* do not clear the stack */ + + case cf2_escINDEX: + { + CF2_Int idx; + CF2_UInt size; + + + FT_TRACE4(( " index\n" )); + + idx = cf2_stack_popInt( opStack ); + size = cf2_stack_count( opStack ); + + if ( size > 0 ) + { + /* for `cf2_stack_getReal', */ + /* index 0 is bottom of stack */ + CF2_UInt gr_idx; + + + if ( idx < 0 ) + gr_idx = size - 1; + else if ( (CF2_UInt)idx >= size ) + gr_idx = 0; + else + gr_idx = size - 1 - (CF2_UInt)idx; + + cf2_stack_pushFixed( opStack, + cf2_stack_getReal( opStack, + gr_idx ) ); + } + } + continue; /* do not clear the stack */ + + case cf2_escROLL: + { + CF2_Int idx; + CF2_Int count; + + + FT_TRACE4(( " roll\n" )); + + idx = cf2_stack_popInt( opStack ); + count = cf2_stack_popInt( opStack ); + + cf2_stack_roll( opStack, count, idx ); + } + continue; /* do not clear the stack */ + + case cf2_escSETCURRENTPT: + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (12, %d)\n", op2 )); + else + { + FT_TRACE4(( " setcurrentpoint" )); + + if ( !initial_map_ready ) + break; + + /* From the T1 specification, section 6.4: */ + /* */ + /* The setcurrentpoint command is used only in */ + /* conjunction with results from OtherSubrs */ + /* procedures. */ + + /* known_othersubr_result_cnt != 0 is already handled */ + /* above. */ + + /* Note, however, that both Ghostscript and Adobe */ + /* Distiller handle this situation by silently */ + /* ignoring the inappropriate `setcurrentpoint' */ + /* instruction. So we do the same. */ +#if 0 + + if ( decoder->flex_state != 1 ) + { + FT_ERROR(( "cf2_interpT2CharString:" + " unexpected `setcurrentpoint'\n" )); + goto Syntax_Error; + } + else + ... +#endif + + curY = cf2_stack_popFixed( opStack ); + curX = cf2_stack_popFixed( opStack ); + + decoder->flex_state = 0; + } + break; + + } /* end of 2nd switch checking op2 */ + } + } + } /* end of 1st switch checking op2 */ + } /* case cf2_cmdESC */ + + break; + + case cf2_cmdHSBW: + if ( !font->isT1 ) + FT_TRACE4(( " unknown op (%d)\n", op1 )); + else + { + CF2_Fixed lsb_x; + PS_Builder* builder; + + + FT_TRACE4(( " hsbw" )); + + builder = &decoder->builder; + + builder->advance->x = cf2_stack_popFixed( opStack ); + builder->advance->y = 0; + + lsb_x = cf2_stack_popFixed( opStack ); + + builder->left_bearing->x = ADD_INT32( builder->left_bearing->x, + lsb_x ); + + haveWidth = TRUE; + + /* the `metrics_only' indicates that we only want to compute */ + /* the glyph's metrics (lsb + advance width), not load the */ + /* rest of it; so exit immediately */ + if ( builder->metrics_only ) + goto exit; + + if ( initial_map_ready ) + curX = ADD_INT32( curX, lsb_x ); + } + break; + + case cf2_cmdENDCHAR: + FT_TRACE4(( " endchar\n" )); + + if ( font->isT1 && !initial_map_ready ) + { + FT_TRACE5(( "cf2_interpT2CharString (Type 1 mode): " + "Build initial hintmap, rewinding...\n" )); + + /* trigger initial hintmap build */ + cf2_glyphpath_moveTo( &glyphPath, curX, curY ); + + initial_map_ready = TRUE; + + /* change hints routine - clear for rewind */ + cf2_arrstack_clear( &vStemHintArray ); + cf2_arrstack_clear( &hStemHintArray ); + + cf2_hintmask_init( &hintMask, error ); + hintMask.isValid = FALSE; + hintMask.isNew = TRUE; + + /* rewind charstring */ + /* some charstrings use endchar from a final subroutine call */ + /* without returning, detect these and exit to the top level */ + /* charstring */ + while ( charstringIndex > 0 ) + { + FT_TRACE4(( " return (leaving level %d)\n", charstringIndex )); + + /* restore position in previous charstring */ + charstring = (CF2_Buffer) + cf2_arrstack_getPointer( + &subrStack, + (CF2_UInt)--charstringIndex ); + } + charstring->ptr = charstring->start; + + break; + } + + if ( cf2_stack_count( opStack ) == 1 || + cf2_stack_count( opStack ) == 5 ) + { + if ( !haveWidth ) + *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ), + nominalWidthX ); + } + + /* width is defined or default after this */ + haveWidth = TRUE; + + if ( decoder->width_only ) + goto exit; + + /* close path if still open */ + cf2_glyphpath_closeOpenPath( &glyphPath ); + + /* disable seac for CFF2 and Type1 */ + /* (charstring ending with args on stack) */ + if ( !font->isCFF2 && !font->isT1 && cf2_stack_count( opStack ) > 1 ) + { + /* must be either 4 or 5 -- */ + /* this is a (deprecated) implied `seac' operator */ + + CF2_Int achar; + CF2_Int bchar; + CF2_BufferRec component; + CF2_Fixed dummyWidth; /* ignore component width */ + FT_Error error2; + + + if ( doingSeac ) + { + lastError = FT_THROW( Invalid_Glyph_Format ); + goto exit; /* nested seac */ + } + + achar = cf2_stack_popInt( opStack ); + bchar = cf2_stack_popInt( opStack ); + + curY = cf2_stack_popFixed( opStack ); + curX = cf2_stack_popFixed( opStack ); + + error2 = cf2_getSeacComponent( decoder, achar, &component ); + if ( error2 ) + { + lastError = error2; /* pass FreeType error through */ + goto exit; + } + cf2_interpT2CharString( font, + &component, + callbacks, + translation, + TRUE, + curX, + curY, + &dummyWidth ); + cf2_freeSeacComponent( decoder, &component ); + + error2 = cf2_getSeacComponent( decoder, bchar, &component ); + if ( error2 ) + { + lastError = error2; /* pass FreeType error through */ + goto exit; + } + cf2_interpT2CharString( font, + &component, + callbacks, + translation, + TRUE, + 0, + 0, + &dummyWidth ); + cf2_freeSeacComponent( decoder, &component ); + } + goto exit; + + case cf2_cmdCNTRMASK: + case cf2_cmdHINTMASK: + /* the final \n in the tracing message gets added in */ + /* `cf2_hintmask_read' (which also traces the mask bytes) */ + FT_TRACE4(( op1 == cf2_cmdCNTRMASK ? " cntrmask" : " hintmask" )); + + /* never add hints after the mask is computed */ + if ( cf2_stack_count( opStack ) > 1 && + cf2_hintmask_isValid( &hintMask ) ) + { + FT_TRACE4(( "cf2_interpT2CharString: invalid hint mask\n" )); + break; + } + + /* if there are arguments on the stack, there this is an */ + /* implied cf2_cmdVSTEMHM */ + cf2_doStems( font, + opStack, + &vStemHintArray, + width, + &haveWidth, + 0 ); + + if ( decoder->width_only ) + goto exit; + + if ( op1 == cf2_cmdHINTMASK ) + { + /* consume the hint mask bytes which follow the operator */ + cf2_hintmask_read( &hintMask, + charstring, + cf2_arrstack_size( &hStemHintArray ) + + cf2_arrstack_size( &vStemHintArray ) ); + } + else + { + /* + * Consume the counter mask bytes which follow the operator: + * Build a temporary hint map, just to place and lock those + * stems participating in the counter mask. These are most + * likely the dominant hstems, and are grouped together in a + * few counter groups, not necessarily in correspondence + * with the hint groups. This reduces the chances of + * conflicts between hstems that are initially placed in + * separate hint groups and then brought together. The + * positions are copied back to `hStemHintArray', so we can + * discard `counterMask' and `counterHintMap'. + * + */ + CF2_HintMapRec counterHintMap; + CF2_HintMaskRec counterMask; + + + cf2_hintmap_init( &counterHintMap, + font, + &glyphPath.initialHintMap, + &glyphPath.hintMoves, + scaleY ); + cf2_hintmask_init( &counterMask, error ); + + cf2_hintmask_read( &counterMask, + charstring, + cf2_arrstack_size( &hStemHintArray ) + + cf2_arrstack_size( &vStemHintArray ) ); + cf2_hintmap_build( &counterHintMap, + &hStemHintArray, + &vStemHintArray, + &counterMask, + 0, + FALSE ); + } + break; + + case cf2_cmdRMOVETO: + FT_TRACE4(( " rmoveto\n" )); + + if ( font->isT1 && !decoder->flex_state && !haveWidth ) + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " No width. Use hsbw/sbw as first op\n" )); + + if ( cf2_stack_count( opStack ) > 2 && !haveWidth ) + *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ), + nominalWidthX ); + + /* width is defined or default after this */ + haveWidth = TRUE; + + if ( decoder->width_only ) + goto exit; + + curY = ADD_INT32( curY, cf2_stack_popFixed( opStack ) ); + curX = ADD_INT32( curX, cf2_stack_popFixed( opStack ) ); + + if ( !decoder->flex_state ) + cf2_glyphpath_moveTo( &glyphPath, curX, curY ); + + break; + + case cf2_cmdHMOVETO: + FT_TRACE4(( " hmoveto\n" )); + + if ( font->isT1 && !decoder->flex_state && !haveWidth ) + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " No width. Use hsbw/sbw as first op\n" )); + + if ( cf2_stack_count( opStack ) > 1 && !haveWidth ) + *width = ADD_INT32( cf2_stack_getReal( opStack, 0 ), + nominalWidthX ); + + /* width is defined or default after this */ + haveWidth = TRUE; + + if ( decoder->width_only ) + goto exit; + + curX = ADD_INT32( curX, cf2_stack_popFixed( opStack ) ); + + if ( !decoder->flex_state ) + cf2_glyphpath_moveTo( &glyphPath, curX, curY ); + + break; + + case cf2_cmdRLINECURVE: + { + CF2_UInt count = cf2_stack_count( opStack ); + CF2_UInt idx = 0; + + + FT_TRACE4(( " rlinecurve\n" )); + + while ( idx + 6 < count ) + { + curX = ADD_INT32( curX, cf2_stack_getReal( opStack, + idx + 0 ) ); + curY = ADD_INT32( curY, cf2_stack_getReal( opStack, + idx + 1 ) ); + + cf2_glyphpath_lineTo( &glyphPath, curX, curY ); + idx += 2; + } + + while ( idx < count ) + { + CF2_Fixed x1, y1, x2, y2, x3, y3; + + + x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX ); + y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), curY ); + x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), x1 ); + y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y1 ); + x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), x2 ); + y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 5 ), y2 ); + + cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); + + curX = x3; + curY = y3; + idx += 6; + } + + cf2_stack_clear( opStack ); + } + continue; /* no need to clear stack again */ + + case cf2_cmdVVCURVETO: + { + CF2_UInt count, count1 = cf2_stack_count( opStack ); + CF2_UInt idx = 0; + + + /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */ + /* we enforce it by clearing the second bit */ + /* (and sorting the stack indexing to suit) */ + count = count1 & ~2U; + idx += count1 - count; + + FT_TRACE4(( " vvcurveto\n" )); + + while ( idx < count ) + { + CF2_Fixed x1, y1, x2, y2, x3, y3; + + + if ( ( count - idx ) & 1 ) + { + x1 = ADD_INT32( cf2_stack_getReal( opStack, idx ), curX ); + + idx++; + } + else + x1 = curX; + + y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curY ); + x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 ); + y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 ); + x3 = x2; + y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y2 ); + + cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); + + curX = x3; + curY = y3; + idx += 4; + } + + cf2_stack_clear( opStack ); + } + continue; /* no need to clear stack again */ + + case cf2_cmdHHCURVETO: + { + CF2_UInt count, count1 = cf2_stack_count( opStack ); + CF2_UInt idx = 0; + + + /* if `cf2_stack_count' isn't of the form 4n or 4n+1, */ + /* we enforce it by clearing the second bit */ + /* (and sorting the stack indexing to suit) */ + count = count1 & ~2U; + idx += count1 - count; + + FT_TRACE4(( " hhcurveto\n" )); + + while ( idx < count ) + { + CF2_Fixed x1, y1, x2, y2, x3, y3; + + + if ( ( count - idx ) & 1 ) + { + y1 = ADD_INT32( cf2_stack_getReal( opStack, idx ), curY ); + + idx++; + } + else + y1 = curY; + + x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX ); + x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 ); + y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 ); + x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), x2 ); + y3 = y2; + + cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); + + curX = x3; + curY = y3; + idx += 4; + } + + cf2_stack_clear( opStack ); + } + continue; /* no need to clear stack again */ + + case cf2_cmdVHCURVETO: + case cf2_cmdHVCURVETO: + { + CF2_UInt count, count1 = cf2_stack_count( opStack ); + CF2_UInt idx = 0; + + FT_Bool alternate = FT_BOOL( op1 == cf2_cmdHVCURVETO ); + + + /* if `cf2_stack_count' isn't of the form 8n, 8n+1, */ + /* 8n+4, or 8n+5, we enforce it by clearing the */ + /* second bit */ + /* (and sorting the stack indexing to suit) */ + count = count1 & ~2U; + idx += count1 - count; + + FT_TRACE4(( alternate ? " hvcurveto\n" : " vhcurveto\n" )); + + while ( idx < count ) + { + CF2_Fixed x1, x2, x3, y1, y2, y3; + + + if ( alternate ) + { + x1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curX ); + y1 = curY; + x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 ); + y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 ); + y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), y2 ); + + if ( count - idx == 5 ) + { + x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), x2 ); + + idx++; + } + else + x3 = x2; + + alternate = FALSE; + } + else + { + x1 = curX; + y1 = ADD_INT32( cf2_stack_getReal( opStack, idx + 0 ), curY ); + x2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 1 ), x1 ); + y2 = ADD_INT32( cf2_stack_getReal( opStack, idx + 2 ), y1 ); + x3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 3 ), x2 ); + + if ( count - idx == 5 ) + { + y3 = ADD_INT32( cf2_stack_getReal( opStack, idx + 4 ), y2 ); + + idx++; + } + else + y3 = y2; + + alternate = TRUE; + } + + cf2_glyphpath_curveTo( &glyphPath, x1, y1, x2, y2, x3, y3 ); + + curX = x3; + curY = y3; + idx += 4; + } + + cf2_stack_clear( opStack ); + } + continue; /* no need to clear stack again */ + + case cf2_cmdEXTENDEDNMBR: + { + CF2_Int v; + + CF2_Int byte1 = cf2_buf_readByte( charstring ); + CF2_Int byte2 = cf2_buf_readByte( charstring ); + + + v = (FT_Short)( ( byte1 << 8 ) | + byte2 ); + + FT_TRACE4(( " %d", v )); + + cf2_stack_pushInt( opStack, v ); + } + continue; + + default: + /* numbers */ + { + if ( /* op1 >= 32 && */ op1 <= 246 ) + { + CF2_Int v; + + + v = op1 - 139; + + FT_TRACE4(( " %d", v )); + + /* -107 .. 107 */ + cf2_stack_pushInt( opStack, v ); + } + + else if ( /* op1 >= 247 && */ op1 <= 250 ) + { + CF2_Int v; + + + v = op1; + v -= 247; + v *= 256; + v += cf2_buf_readByte( charstring ); + v += 108; + + FT_TRACE4(( " %d", v )); + + /* 108 .. 1131 */ + cf2_stack_pushInt( opStack, v ); + } + + else if ( /* op1 >= 251 && */ op1 <= 254 ) + { + CF2_Int v; + + + v = op1; + v -= 251; + v *= 256; + v += cf2_buf_readByte( charstring ); + v = -v - 108; + + FT_TRACE4(( " %d", v )); + + /* -1131 .. -108 */ + cf2_stack_pushInt( opStack, v ); + } + + else /* op1 == 255 */ + { + CF2_Fixed v; + + FT_UInt32 byte1 = (FT_UInt32)cf2_buf_readByte( charstring ); + FT_UInt32 byte2 = (FT_UInt32)cf2_buf_readByte( charstring ); + FT_UInt32 byte3 = (FT_UInt32)cf2_buf_readByte( charstring ); + FT_UInt32 byte4 = (FT_UInt32)cf2_buf_readByte( charstring ); + + + v = (CF2_Fixed)( ( byte1 << 24 ) | + ( byte2 << 16 ) | + ( byte3 << 8 ) | + byte4 ); + + /* + * For Type 1: + * + * According to the specification, values > 32000 or < -32000 + * must be followed by a `div' operator to make the result be + * in the range [-32000;32000]. We expect that the second + * argument of `div' is not a large number. Additionally, we + * don't handle stuff like ` div + * div' or div div'. This is probably + * not allowed anyway. + * + * + div is not checked but should not be + * allowed as the large value remains untouched. + * + */ + if ( font->isT1 ) + { + if ( v > 32000 || v < -32000 ) + { + if ( large_int ) + FT_ERROR(( "cf2_interpT2CharString (Type 1 mode):" + " no `div' after large integer\n" )); + else + large_int = TRUE; + } + + FT_TRACE4(( " %d", v )); + + cf2_stack_pushInt( opStack, (CF2_Int)v ); + } + else + { + FT_TRACE4(( " %.5fF", v / 65536.0 )); + + cf2_stack_pushFixed( opStack, v ); + } + } + } + continue; /* don't clear stack */ + + } /* end of switch statement checking `op1' */ + + cf2_stack_clear( opStack ); + + } /* end of main interpreter loop */ + + /* we get here if the charstring ends without cf2_cmdENDCHAR */ + FT_TRACE4(( "cf2_interpT2CharString:" + " charstring ends without ENDCHAR\n" )); + + exit: + /* check whether last error seen is also the first one */ + cf2_setError( error, lastError ); + + if ( *error ) + FT_TRACE4(( "charstring error %d\n", *error )); + + /* free resources from objects we've used */ + cf2_glyphpath_finalize( &glyphPath ); + cf2_arrstack_finalize( &vStemHintArray ); + cf2_arrstack_finalize( &hStemHintArray ); + cf2_arrstack_finalize( &subrStack ); + cf2_stack_free( opStack ); + + FT_TRACE4(( "\n" )); + + return; + } + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psintrp.h b/vendor/FreeType2/src/psaux/psintrp.h new file mode 100644 index 0000000..4790aaa --- /dev/null +++ b/vendor/FreeType2/src/psaux/psintrp.h @@ -0,0 +1,83 @@ +/***************************************************************************/ +/* */ +/* psintrp.h */ +/* */ +/* Adobe's CFF Interpreter (specification). */ +/* */ +/* Copyright 2007-2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#ifndef PSINTRP_H_ +#define PSINTRP_H_ + + +#include "psft.h" +#include "pshints.h" + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + cf2_hintmask_init( CF2_HintMask hintmask, + FT_Error* error ); + FT_LOCAL( FT_Bool ) + cf2_hintmask_isValid( const CF2_HintMask hintmask ); + FT_LOCAL( FT_Bool ) + cf2_hintmask_isNew( const CF2_HintMask hintmask ); + FT_LOCAL( void ) + cf2_hintmask_setNew( CF2_HintMask hintmask, + FT_Bool val ); + FT_LOCAL( FT_Byte* ) + cf2_hintmask_getMaskPtr( CF2_HintMask hintmask ); + FT_LOCAL( void ) + cf2_hintmask_setAll( CF2_HintMask hintmask, + size_t bitCount ); + + FT_LOCAL( void ) + cf2_interpT2CharString( CF2_Font font, + CF2_Buffer charstring, + CF2_OutlineCallbacks callbacks, + const FT_Vector* translation, + FT_Bool doingSeac, + CF2_Fixed curX, + CF2_Fixed curY, + CF2_Fixed* width ); + + +FT_END_HEADER + + +#endif /* PSINTRP_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psobjs.c b/vendor/FreeType2/src/psaux/psobjs.c new file mode 100644 index 0000000..f54bc7e --- /dev/null +++ b/vendor/FreeType2/src/psaux/psobjs.c @@ -0,0 +1,2533 @@ +/***************************************************************************/ +/* */ +/* psobjs.c */ +/* */ +/* Auxiliary functions for PostScript fonts (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_DRIVER_H + +#include "psobjs.h" +#include "psconv.h" + +#include "psauxerr.h" +#include "psauxmod.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_psobjs + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* */ + /* ps_table_new */ + /* */ + /* */ + /* Initializes a PS_Table. */ + /* */ + /* */ + /* table :: The address of the target table. */ + /* */ + /* */ + /* count :: The table size = the maximum number of elements. */ + /* */ + /* memory :: The memory object to use for all subsequent */ + /* reallocations. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + ps_table_new( PS_Table table, + FT_Int count, + FT_Memory memory ) + { + FT_Error error; + + + table->memory = memory; + if ( FT_NEW_ARRAY( table->elements, count ) || + FT_NEW_ARRAY( table->lengths, count ) ) + goto Exit; + + table->max_elems = count; + table->init = 0xDEADBEEFUL; + table->num_elems = 0; + table->block = NULL; + table->capacity = 0; + table->cursor = 0; + + *(PS_Table_FuncsRec*)&table->funcs = ps_table_funcs; + + Exit: + if ( error ) + FT_FREE( table->elements ); + + return error; + } + + + static void + shift_elements( PS_Table table, + FT_Byte* old_base ) + { + FT_PtrDist delta = table->block - old_base; + FT_Byte** offset = table->elements; + FT_Byte** limit = offset + table->max_elems; + + + for ( ; offset < limit; offset++ ) + { + if ( offset[0] ) + offset[0] += delta; + } + } + + + static FT_Error + reallocate_t1_table( PS_Table table, + FT_Offset new_size ) + { + FT_Memory memory = table->memory; + FT_Byte* old_base = table->block; + FT_Error error; + + + /* allocate new base block */ + if ( FT_ALLOC( table->block, new_size ) ) + { + table->block = old_base; + return error; + } + + /* copy elements and shift offsets */ + if ( old_base ) + { + FT_MEM_COPY( table->block, old_base, table->capacity ); + shift_elements( table, old_base ); + FT_FREE( old_base ); + } + + table->capacity = new_size; + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ps_table_add */ + /* */ + /* */ + /* Adds an object to a PS_Table, possibly growing its memory block. */ + /* */ + /* */ + /* table :: The target table. */ + /* */ + /* */ + /* idx :: The index of the object in the table. */ + /* */ + /* object :: The address of the object to copy in memory. */ + /* */ + /* length :: The length in bytes of the source object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. An error is returned if a */ + /* reallocation fails. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + ps_table_add( PS_Table table, + FT_Int idx, + void* object, + FT_UInt length ) + { + if ( idx < 0 || idx >= table->max_elems ) + { + FT_ERROR(( "ps_table_add: invalid index\n" )); + return FT_THROW( Invalid_Argument ); + } + + /* grow the base block if needed */ + if ( table->cursor + length > table->capacity ) + { + FT_Error error; + FT_Offset new_size = table->capacity; + FT_PtrDist in_offset; + + + in_offset = (FT_Byte*)object - table->block; + if ( in_offset < 0 || (FT_Offset)in_offset >= table->capacity ) + in_offset = -1; + + while ( new_size < table->cursor + length ) + { + /* increase size by 25% and round up to the nearest multiple + of 1024 */ + new_size += ( new_size >> 2 ) + 1; + new_size = FT_PAD_CEIL( new_size, 1024 ); + } + + error = reallocate_t1_table( table, new_size ); + if ( error ) + return error; + + if ( in_offset >= 0 ) + object = table->block + in_offset; + } + + /* add the object to the base block and adjust offset */ + table->elements[idx] = table->block + table->cursor; + table->lengths [idx] = length; + FT_MEM_COPY( table->block + table->cursor, object, length ); + + table->cursor += length; + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ps_table_done */ + /* */ + /* */ + /* Finalizes a PS_TableRec (i.e., reallocate it to its current */ + /* cursor). */ + /* */ + /* */ + /* table :: The target table. */ + /* */ + /* */ + /* This function does NOT release the heap's memory block. It is up */ + /* to the caller to clean it, or reference it in its own structures. */ + /* */ + FT_LOCAL_DEF( void ) + ps_table_done( PS_Table table ) + { + FT_Memory memory = table->memory; + FT_Error error; + FT_Byte* old_base = table->block; + + + /* should never fail, because rec.cursor <= rec.size */ + if ( !old_base ) + return; + + if ( FT_ALLOC( table->block, table->cursor ) ) + return; + FT_MEM_COPY( table->block, old_base, table->cursor ); + shift_elements( table, old_base ); + + table->capacity = table->cursor; + FT_FREE( old_base ); + + FT_UNUSED( error ); + } + + + FT_LOCAL_DEF( void ) + ps_table_release( PS_Table table ) + { + FT_Memory memory = table->memory; + + + if ( (FT_ULong)table->init == 0xDEADBEEFUL ) + { + FT_FREE( table->block ); + FT_FREE( table->elements ); + FT_FREE( table->lengths ); + table->init = 0; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* first character must be already part of the comment */ + + static void + skip_comment( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + + + while ( cur < limit ) + { + if ( IS_PS_NEWLINE( *cur ) ) + break; + cur++; + } + + *acur = cur; + } + + + static void + skip_spaces( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + + + while ( cur < limit ) + { + if ( !IS_PS_SPACE( *cur ) ) + { + if ( *cur == '%' ) + /* According to the PLRM, a comment is equal to a space. */ + skip_comment( &cur, limit ); + else + break; + } + cur++; + } + + *acur = cur; + } + + +#define IS_OCTAL_DIGIT( c ) ( '0' <= (c) && (c) <= '7' ) + + + /* first character must be `('; */ + /* *acur is positioned at the character after the closing `)' */ + + static FT_Error + skip_literal_string( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Int embed = 0; + FT_Error error = FT_ERR( Invalid_File_Format ); + unsigned int i; + + + while ( cur < limit ) + { + FT_Byte c = *cur; + + + cur++; + + if ( c == '\\' ) + { + /* Red Book 3rd ed., section `Literal Text Strings', p. 29: */ + /* A backslash can introduce three different types */ + /* of escape sequences: */ + /* - a special escaped char like \r, \n, etc. */ + /* - a one-, two-, or three-digit octal number */ + /* - none of the above in which case the backslash is ignored */ + + if ( cur == limit ) + /* error (or to be ignored?) */ + break; + + switch ( *cur ) + { + /* skip `special' escape */ + case 'n': + case 'r': + case 't': + case 'b': + case 'f': + case '\\': + case '(': + case ')': + cur++; + break; + + default: + /* skip octal escape or ignore backslash */ + for ( i = 0; i < 3 && cur < limit; i++ ) + { + if ( !IS_OCTAL_DIGIT( *cur ) ) + break; + + cur++; + } + } + } + else if ( c == '(' ) + embed++; + else if ( c == ')' ) + { + embed--; + if ( embed == 0 ) + { + error = FT_Err_Ok; + break; + } + } + } + + *acur = cur; + + return error; + } + + + /* first character must be `<' */ + + static FT_Error + skip_string( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Error err = FT_Err_Ok; + + + while ( ++cur < limit ) + { + /* All whitespace characters are ignored. */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + break; + + if ( !IS_PS_XDIGIT( *cur ) ) + break; + } + + if ( cur < limit && *cur != '>' ) + { + FT_ERROR(( "skip_string: missing closing delimiter `>'\n" )); + err = FT_THROW( Invalid_File_Format ); + } + else + cur++; + + *acur = cur; + return err; + } + + + /* first character must be the opening brace that */ + /* starts the procedure */ + + /* NB: [ and ] need not match: */ + /* `/foo {[} def' is a valid PostScript fragment, */ + /* even within a Type1 font */ + + static FT_Error + skip_procedure( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur; + FT_Int embed = 0; + FT_Error error = FT_Err_Ok; + + + FT_ASSERT( **acur == '{' ); + + for ( cur = *acur; cur < limit && error == FT_Err_Ok; cur++ ) + { + switch ( *cur ) + { + case '{': + embed++; + break; + + case '}': + embed--; + if ( embed == 0 ) + { + cur++; + goto end; + } + break; + + case '(': + error = skip_literal_string( &cur, limit ); + break; + + case '<': + error = skip_string( &cur, limit ); + break; + + case '%': + skip_comment( &cur, limit ); + break; + } + } + + end: + if ( embed != 0 ) + error = FT_THROW( Invalid_File_Format ); + + *acur = cur; + + return error; + } + + + /***********************************************************************/ + /* */ + /* All exported parsing routines handle leading whitespace and stop at */ + /* the first character which isn't part of the just handled token. */ + /* */ + /***********************************************************************/ + + + FT_LOCAL_DEF( void ) + ps_parser_skip_PS_token( PS_Parser parser ) + { + /* Note: PostScript allows any non-delimiting, non-whitespace */ + /* character in a name (PS Ref Manual, 3rd ed, p31). */ + /* PostScript delimiters are (, ), <, >, [, ], {, }, /, and %. */ + + FT_Byte* cur = parser->cursor; + FT_Byte* limit = parser->limit; + FT_Error error = FT_Err_Ok; + + + skip_spaces( &cur, limit ); /* this also skips comments */ + if ( cur >= limit ) + goto Exit; + + /* self-delimiting, single-character tokens */ + if ( *cur == '[' || *cur == ']' ) + { + cur++; + goto Exit; + } + + /* skip balanced expressions (procedures and strings) */ + + if ( *cur == '{' ) /* {...} */ + { + error = skip_procedure( &cur, limit ); + goto Exit; + } + + if ( *cur == '(' ) /* (...) */ + { + error = skip_literal_string( &cur, limit ); + goto Exit; + } + + if ( *cur == '<' ) /* <...> */ + { + if ( cur + 1 < limit && *(cur + 1) == '<' ) /* << */ + { + cur++; + cur++; + } + else + error = skip_string( &cur, limit ); + + goto Exit; + } + + if ( *cur == '>' ) + { + cur++; + if ( cur >= limit || *cur != '>' ) /* >> */ + { + FT_ERROR(( "ps_parser_skip_PS_token:" + " unexpected closing delimiter `>'\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + cur++; + goto Exit; + } + + if ( *cur == '/' ) + cur++; + + /* anything else */ + while ( cur < limit ) + { + /* *cur might be invalid (e.g., ')' or '}'), but this */ + /* is handled by the test `cur == parser->cursor' below */ + if ( IS_PS_DELIM( *cur ) ) + break; + + cur++; + } + + Exit: + if ( cur < limit && cur == parser->cursor ) + { + FT_ERROR(( "ps_parser_skip_PS_token:" + " current token is `%c' which is self-delimiting\n" + " " + " but invalid at this point\n", + *cur )); + + error = FT_THROW( Invalid_File_Format ); + } + + if ( cur > limit ) + cur = limit; + + parser->error = error; + parser->cursor = cur; + } + + + FT_LOCAL_DEF( void ) + ps_parser_skip_spaces( PS_Parser parser ) + { + skip_spaces( &parser->cursor, parser->limit ); + } + + + /* `token' here means either something between balanced delimiters */ + /* or the next token; the delimiters are not removed. */ + + FT_LOCAL_DEF( void ) + ps_parser_to_token( PS_Parser parser, + T1_Token token ) + { + FT_Byte* cur; + FT_Byte* limit; + FT_Int embed; + + + token->type = T1_TOKEN_TYPE_NONE; + token->start = NULL; + token->limit = NULL; + + /* first of all, skip leading whitespace */ + ps_parser_skip_spaces( parser ); + + cur = parser->cursor; + limit = parser->limit; + + if ( cur >= limit ) + return; + + switch ( *cur ) + { + /************* check for literal string *****************/ + case '(': + token->type = T1_TOKEN_TYPE_STRING; + token->start = cur; + + if ( skip_literal_string( &cur, limit ) == FT_Err_Ok ) + token->limit = cur; + break; + + /************* check for programs/array *****************/ + case '{': + token->type = T1_TOKEN_TYPE_ARRAY; + token->start = cur; + + if ( skip_procedure( &cur, limit ) == FT_Err_Ok ) + token->limit = cur; + break; + + /************* check for table/array ********************/ + /* XXX: in theory we should also look for "<<" */ + /* since this is semantically equivalent to "["; */ + /* in practice it doesn't matter (?) */ + case '[': + token->type = T1_TOKEN_TYPE_ARRAY; + embed = 1; + token->start = cur++; + + /* we need this to catch `[ ]' */ + parser->cursor = cur; + ps_parser_skip_spaces( parser ); + cur = parser->cursor; + + while ( cur < limit && !parser->error ) + { + /* XXX: this is wrong because it does not */ + /* skip comments, procedures, and strings */ + if ( *cur == '[' ) + embed++; + else if ( *cur == ']' ) + { + embed--; + if ( embed <= 0 ) + { + token->limit = ++cur; + break; + } + } + + parser->cursor = cur; + ps_parser_skip_PS_token( parser ); + /* we need this to catch `[XXX ]' */ + ps_parser_skip_spaces ( parser ); + cur = parser->cursor; + } + break; + + /* ************ otherwise, it is any token **************/ + default: + token->start = cur; + token->type = ( *cur == '/' ) ? T1_TOKEN_TYPE_KEY : T1_TOKEN_TYPE_ANY; + ps_parser_skip_PS_token( parser ); + cur = parser->cursor; + if ( !parser->error ) + token->limit = cur; + } + + if ( !token->limit ) + { + token->start = NULL; + token->type = T1_TOKEN_TYPE_NONE; + } + + parser->cursor = cur; + } + + + /* NB: `tokens' can be NULL if we only want to count */ + /* the number of array elements */ + + FT_LOCAL_DEF( void ) + ps_parser_to_token_array( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ) + { + T1_TokenRec master; + + + *pnum_tokens = -1; + + /* this also handles leading whitespace */ + ps_parser_to_token( parser, &master ); + + if ( master.type == T1_TOKEN_TYPE_ARRAY ) + { + FT_Byte* old_cursor = parser->cursor; + FT_Byte* old_limit = parser->limit; + T1_Token cur = tokens; + T1_Token limit = cur + max_tokens; + + + /* don't include outermost delimiters */ + parser->cursor = master.start + 1; + parser->limit = master.limit - 1; + + while ( parser->cursor < parser->limit ) + { + T1_TokenRec token; + + + ps_parser_to_token( parser, &token ); + if ( !token.type ) + break; + + if ( tokens && cur < limit ) + *cur = token; + + cur++; + } + + *pnum_tokens = (FT_Int)( cur - tokens ); + + parser->cursor = old_cursor; + parser->limit = old_limit; + } + } + + + /* first character must be a delimiter or a part of a number */ + /* NB: `coords' can be NULL if we just want to skip the */ + /* array; in this case we ignore `max_coords' */ + + static FT_Int + ps_tocoordarray( FT_Byte* *acur, + FT_Byte* limit, + FT_Int max_coords, + FT_Short* coords ) + { + FT_Byte* cur = *acur; + FT_Int count = 0; + FT_Byte c, ender; + + + if ( cur >= limit ) + goto Exit; + + /* check for the beginning of an array; otherwise, only one number */ + /* will be read */ + c = *cur; + ender = 0; + + if ( c == '[' ) + ender = ']'; + else if ( c == '{' ) + ender = '}'; + + if ( ender ) + cur++; + + /* now, read the coordinates */ + while ( cur < limit ) + { + FT_Short dummy; + FT_Byte* old_cur; + + + /* skip whitespace in front of data */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + goto Exit; + + if ( *cur == ender ) + { + cur++; + break; + } + + old_cur = cur; + + if ( coords && count >= max_coords ) + break; + + /* call PS_Conv_ToFixed() even if coords == NULL */ + /* to properly parse number at `cur' */ + *( coords ? &coords[count] : &dummy ) = + (FT_Short)( PS_Conv_ToFixed( &cur, limit, 0 ) >> 16 ); + + if ( old_cur == cur ) + { + count = -1; + goto Exit; + } + else + count++; + + if ( !ender ) + break; + } + + Exit: + *acur = cur; + return count; + } + + + /* first character must be a delimiter or a part of a number */ + /* NB: `values' can be NULL if we just want to skip the */ + /* array; in this case we ignore `max_values' */ + /* */ + /* return number of successfully parsed values */ + + static FT_Int + ps_tofixedarray( FT_Byte* *acur, + FT_Byte* limit, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ) + { + FT_Byte* cur = *acur; + FT_Int count = 0; + FT_Byte c, ender; + + + if ( cur >= limit ) + goto Exit; + + /* Check for the beginning of an array. Otherwise, only one number */ + /* will be read. */ + c = *cur; + ender = 0; + + if ( c == '[' ) + ender = ']'; + else if ( c == '{' ) + ender = '}'; + + if ( ender ) + cur++; + + /* now, read the values */ + while ( cur < limit ) + { + FT_Fixed dummy; + FT_Byte* old_cur; + + + /* skip whitespace in front of data */ + skip_spaces( &cur, limit ); + if ( cur >= limit ) + goto Exit; + + if ( *cur == ender ) + { + cur++; + break; + } + + old_cur = cur; + + if ( values && count >= max_values ) + break; + + /* call PS_Conv_ToFixed() even if coords == NULL */ + /* to properly parse number at `cur' */ + *( values ? &values[count] : &dummy ) = + PS_Conv_ToFixed( &cur, limit, power_ten ); + + if ( old_cur == cur ) + { + count = -1; + goto Exit; + } + else + count++; + + if ( !ender ) + break; + } + + Exit: + *acur = cur; + return count; + } + + +#if 0 + + static FT_String* + ps_tostring( FT_Byte** cursor, + FT_Byte* limit, + FT_Memory memory ) + { + FT_Byte* cur = *cursor; + FT_UInt len = 0; + FT_Int count; + FT_String* result; + FT_Error error; + + + /* XXX: some stupid fonts have a `Notice' or `Copyright' string */ + /* that simply doesn't begin with an opening parenthesis, even */ + /* though they have a closing one! E.g. "amuncial.pfb" */ + /* */ + /* We must deal with these ill-fated cases there. Note that */ + /* these fonts didn't work with the old Type 1 driver as the */ + /* notice/copyright was not recognized as a valid string token */ + /* and made the old token parser commit errors. */ + + while ( cur < limit && ( *cur == ' ' || *cur == '\t' ) ) + cur++; + if ( cur + 1 >= limit ) + return 0; + + if ( *cur == '(' ) + cur++; /* skip the opening parenthesis, if there is one */ + + *cursor = cur; + count = 0; + + /* then, count its length */ + for ( ; cur < limit; cur++ ) + { + if ( *cur == '(' ) + count++; + + else if ( *cur == ')' ) + { + count--; + if ( count < 0 ) + break; + } + } + + len = (FT_UInt)( cur - *cursor ); + if ( cur >= limit || FT_ALLOC( result, len + 1 ) ) + return 0; + + /* now copy the string */ + FT_MEM_COPY( result, *cursor, len ); + result[len] = '\0'; + *cursor = cur; + return result; + } + +#endif /* 0 */ + + + static int + ps_tobool( FT_Byte* *acur, + FT_Byte* limit ) + { + FT_Byte* cur = *acur; + FT_Bool result = 0; + + + /* return 1 if we find `true', 0 otherwise */ + if ( cur + 3 < limit && + cur[0] == 't' && + cur[1] == 'r' && + cur[2] == 'u' && + cur[3] == 'e' ) + { + result = 1; + cur += 5; + } + else if ( cur + 4 < limit && + cur[0] == 'f' && + cur[1] == 'a' && + cur[2] == 'l' && + cur[3] == 's' && + cur[4] == 'e' ) + { + result = 0; + cur += 6; + } + + *acur = cur; + return result; + } + + + /* load a simple field (i.e. non-table) into the current list of objects */ + + FT_LOCAL_DEF( FT_Error ) + ps_parser_load_field( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ) + { + T1_TokenRec token; + FT_Byte* cur; + FT_Byte* limit; + FT_UInt count; + FT_UInt idx; + FT_Error error; + T1_FieldType type; + + + /* this also skips leading whitespace */ + ps_parser_to_token( parser, &token ); + if ( !token.type ) + goto Fail; + + count = 1; + idx = 0; + cur = token.start; + limit = token.limit; + + type = field->type; + + /* we must detect arrays in /FontBBox */ + if ( type == T1_FIELD_TYPE_BBOX ) + { + T1_TokenRec token2; + FT_Byte* old_cur = parser->cursor; + FT_Byte* old_limit = parser->limit; + + + /* don't include delimiters */ + parser->cursor = token.start + 1; + parser->limit = token.limit - 1; + + ps_parser_to_token( parser, &token2 ); + parser->cursor = old_cur; + parser->limit = old_limit; + + if ( token2.type == T1_TOKEN_TYPE_ARRAY ) + { + type = T1_FIELD_TYPE_MM_BBOX; + goto FieldArray; + } + } + else if ( token.type == T1_TOKEN_TYPE_ARRAY ) + { + count = max_objects; + + FieldArray: + /* if this is an array and we have no blend, an error occurs */ + if ( max_objects == 0 ) + goto Fail; + + idx = 1; + + /* don't include delimiters */ + cur++; + limit--; + } + + for ( ; count > 0; count--, idx++ ) + { + FT_Byte* q = (FT_Byte*)objects[idx] + field->offset; + FT_Long val; + FT_String* string = NULL; + + + skip_spaces( &cur, limit ); + + switch ( type ) + { + case T1_FIELD_TYPE_BOOL: + val = ps_tobool( &cur, limit ); + goto Store_Integer; + + case T1_FIELD_TYPE_FIXED: + val = PS_Conv_ToFixed( &cur, limit, 0 ); + goto Store_Integer; + + case T1_FIELD_TYPE_FIXED_1000: + val = PS_Conv_ToFixed( &cur, limit, 3 ); + goto Store_Integer; + + case T1_FIELD_TYPE_INTEGER: + val = PS_Conv_ToInt( &cur, limit ); + /* fall through */ + + Store_Integer: + switch ( field->size ) + { + case (8 / FT_CHAR_BIT): + *(FT_Byte*)q = (FT_Byte)val; + break; + + case (16 / FT_CHAR_BIT): + *(FT_UShort*)q = (FT_UShort)val; + break; + + case (32 / FT_CHAR_BIT): + *(FT_UInt32*)q = (FT_UInt32)val; + break; + + default: /* for 64-bit systems */ + *(FT_Long*)q = val; + } + break; + + case T1_FIELD_TYPE_STRING: + case T1_FIELD_TYPE_KEY: + { + FT_Memory memory = parser->memory; + FT_UInt len = (FT_UInt)( limit - cur ); + + + if ( cur >= limit ) + break; + + /* we allow both a string or a name */ + /* for cases like /FontName (foo) def */ + if ( token.type == T1_TOKEN_TYPE_KEY ) + { + /* don't include leading `/' */ + len--; + cur++; + } + else if ( token.type == T1_TOKEN_TYPE_STRING ) + { + /* don't include delimiting parentheses */ + /* XXX we don't handle <<...>> here */ + /* XXX should we convert octal escapes? */ + /* if so, what encoding should we use? */ + cur++; + len -= 2; + } + else + { + FT_ERROR(( "ps_parser_load_field:" + " expected a name or string\n" + " " + " but found token of type %d instead\n", + token.type )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* for this to work (FT_String**)q must have been */ + /* initialized to NULL */ + if ( *(FT_String**)q ) + { + FT_TRACE0(( "ps_parser_load_field: overwriting field %s\n", + field->ident )); + FT_FREE( *(FT_String**)q ); + *(FT_String**)q = NULL; + } + + if ( FT_ALLOC( string, len + 1 ) ) + goto Exit; + + FT_MEM_COPY( string, cur, len ); + string[len] = 0; + + *(FT_String**)q = string; + } + break; + + case T1_FIELD_TYPE_BBOX: + { + FT_Fixed temp[4]; + FT_BBox* bbox = (FT_BBox*)q; + FT_Int result; + + + result = ps_tofixedarray( &cur, limit, 4, temp, 0 ); + + if ( result < 4 ) + { + FT_ERROR(( "ps_parser_load_field:" + " expected four integers in bounding box\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + bbox->xMin = FT_RoundFix( temp[0] ); + bbox->yMin = FT_RoundFix( temp[1] ); + bbox->xMax = FT_RoundFix( temp[2] ); + bbox->yMax = FT_RoundFix( temp[3] ); + } + break; + + case T1_FIELD_TYPE_MM_BBOX: + { + FT_Memory memory = parser->memory; + FT_Fixed* temp = NULL; + FT_Int result; + FT_UInt i; + + + if ( FT_NEW_ARRAY( temp, max_objects * 4 ) ) + goto Exit; + + for ( i = 0; i < 4; i++ ) + { + result = ps_tofixedarray( &cur, limit, (FT_Int)max_objects, + temp + i * max_objects, 0 ); + if ( result < 0 || (FT_UInt)result < max_objects ) + { + FT_ERROR(( "ps_parser_load_field:" + " expected %d integer%s in the %s subarray\n" + " " + " of /FontBBox in the /Blend dictionary\n", + max_objects, max_objects > 1 ? "s" : "", + i == 0 ? "first" + : ( i == 1 ? "second" + : ( i == 2 ? "third" + : "fourth" ) ) )); + error = FT_THROW( Invalid_File_Format ); + + FT_FREE( temp ); + goto Exit; + } + + skip_spaces( &cur, limit ); + } + + for ( i = 0; i < max_objects; i++ ) + { + FT_BBox* bbox = (FT_BBox*)objects[i]; + + + bbox->xMin = FT_RoundFix( temp[i ] ); + bbox->yMin = FT_RoundFix( temp[i + max_objects] ); + bbox->xMax = FT_RoundFix( temp[i + 2 * max_objects] ); + bbox->yMax = FT_RoundFix( temp[i + 3 * max_objects] ); + } + + FT_FREE( temp ); + } + break; + + default: + /* an error occurred */ + goto Fail; + } + } + +#if 0 /* obsolete -- keep for reference */ + if ( pflags ) + *pflags |= 1L << field->flag_bit; +#else + FT_UNUSED( pflags ); +#endif + + error = FT_Err_Ok; + + Exit: + return error; + + Fail: + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + +#define T1_MAX_TABLE_ELEMENTS 32 + + + FT_LOCAL_DEF( FT_Error ) + ps_parser_load_field_table( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ) + { + T1_TokenRec elements[T1_MAX_TABLE_ELEMENTS]; + T1_Token token; + FT_Int num_elements; + FT_Error error = FT_Err_Ok; + FT_Byte* old_cursor; + FT_Byte* old_limit; + T1_FieldRec fieldrec = *(T1_Field)field; + + + fieldrec.type = T1_FIELD_TYPE_INTEGER; + if ( field->type == T1_FIELD_TYPE_FIXED_ARRAY || + field->type == T1_FIELD_TYPE_BBOX ) + fieldrec.type = T1_FIELD_TYPE_FIXED; + + ps_parser_to_token_array( parser, elements, + T1_MAX_TABLE_ELEMENTS, &num_elements ); + if ( num_elements < 0 ) + { + error = FT_ERR( Ignore ); + goto Exit; + } + if ( (FT_UInt)num_elements > field->array_max ) + num_elements = (FT_Int)field->array_max; + + old_cursor = parser->cursor; + old_limit = parser->limit; + + /* we store the elements count if necessary; */ + /* we further assume that `count_offset' can't be zero */ + if ( field->type != T1_FIELD_TYPE_BBOX && field->count_offset != 0 ) + *(FT_Byte*)( (FT_Byte*)objects[0] + field->count_offset ) = + (FT_Byte)num_elements; + + /* we now load each element, adjusting the field.offset on each one */ + token = elements; + for ( ; num_elements > 0; num_elements--, token++ ) + { + parser->cursor = token->start; + parser->limit = token->limit; + + error = ps_parser_load_field( parser, + &fieldrec, + objects, + max_objects, + 0 ); + if ( error ) + break; + + fieldrec.offset += fieldrec.size; + } + +#if 0 /* obsolete -- keep for reference */ + if ( pflags ) + *pflags |= 1L << field->flag_bit; +#else + FT_UNUSED( pflags ); +#endif + + parser->cursor = old_cursor; + parser->limit = old_limit; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Long ) + ps_parser_to_int( PS_Parser parser ) + { + ps_parser_skip_spaces( parser ); + return PS_Conv_ToInt( &parser->cursor, parser->limit ); + } + + + /* first character must be `<' if `delimiters' is non-zero */ + + FT_LOCAL_DEF( FT_Error ) + ps_parser_to_bytes( PS_Parser parser, + FT_Byte* bytes, + FT_Offset max_bytes, + FT_ULong* pnum_bytes, + FT_Bool delimiters ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* cur; + + + ps_parser_skip_spaces( parser ); + cur = parser->cursor; + + if ( cur >= parser->limit ) + goto Exit; + + if ( delimiters ) + { + if ( *cur != '<' ) + { + FT_ERROR(( "ps_parser_to_bytes: Missing starting delimiter `<'\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + cur++; + } + + *pnum_bytes = PS_Conv_ASCIIHexDecode( &cur, + parser->limit, + bytes, + max_bytes ); + + if ( delimiters ) + { + if ( cur < parser->limit && *cur != '>' ) + { + FT_ERROR(( "ps_parser_to_bytes: Missing closing delimiter `>'\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + cur++; + } + + parser->cursor = cur; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Fixed ) + ps_parser_to_fixed( PS_Parser parser, + FT_Int power_ten ) + { + ps_parser_skip_spaces( parser ); + return PS_Conv_ToFixed( &parser->cursor, parser->limit, power_ten ); + } + + + FT_LOCAL_DEF( FT_Int ) + ps_parser_to_coord_array( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ) + { + ps_parser_skip_spaces( parser ); + return ps_tocoordarray( &parser->cursor, parser->limit, + max_coords, coords ); + } + + + FT_LOCAL_DEF( FT_Int ) + ps_parser_to_fixed_array( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ) + { + ps_parser_skip_spaces( parser ); + return ps_tofixedarray( &parser->cursor, parser->limit, + max_values, values, power_ten ); + } + + +#if 0 + + FT_LOCAL_DEF( FT_String* ) + T1_ToString( PS_Parser parser ) + { + return ps_tostring( &parser->cursor, parser->limit, parser->memory ); + } + + + FT_LOCAL_DEF( FT_Bool ) + T1_ToBool( PS_Parser parser ) + { + return ps_tobool( &parser->cursor, parser->limit ); + } + +#endif /* 0 */ + + + FT_LOCAL_DEF( void ) + ps_parser_init( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ) + { + parser->error = FT_Err_Ok; + parser->base = base; + parser->limit = limit; + parser->cursor = base; + parser->memory = memory; + parser->funcs = ps_parser_funcs; + } + + + FT_LOCAL_DEF( void ) + ps_parser_done( PS_Parser parser ) + { + FT_UNUSED( parser ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* */ + /* t1_builder_init */ + /* */ + /* */ + /* Initializes a given glyph builder. */ + /* */ + /* */ + /* builder :: A pointer to the glyph builder to initialize. */ + /* */ + /* */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* glyph :: The current glyph object. */ + /* */ + /* hinting :: Whether hinting should be applied. */ + /* */ + FT_LOCAL_DEF( void ) + t1_builder_init( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot glyph, + FT_Bool hinting ) + { + builder->parse_state = T1_Parse_Start; + builder->load_points = 1; + + builder->face = face; + builder->glyph = glyph; + builder->memory = face->memory; + + if ( glyph ) + { + FT_GlyphLoader loader = glyph->internal->loader; + + + builder->loader = loader; + builder->base = &loader->base.outline; + builder->current = &loader->current.outline; + FT_GlyphLoader_Rewind( loader ); + + builder->hints_globals = size->internal->module_data; + builder->hints_funcs = NULL; + + if ( hinting ) + builder->hints_funcs = glyph->internal->glyph_hints; + } + + builder->pos_x = 0; + builder->pos_y = 0; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + builder->advance.x = 0; + builder->advance.y = 0; + + builder->funcs = t1_builder_funcs; + } + + + /*************************************************************************/ + /* */ + /* */ + /* t1_builder_done */ + /* */ + /* */ + /* Finalizes a given glyph builder. Its contents can still be used */ + /* after the call, but the function saves important information */ + /* within the corresponding glyph slot. */ + /* */ + /* */ + /* builder :: A pointer to the glyph builder to finalize. */ + /* */ + FT_LOCAL_DEF( void ) + t1_builder_done( T1_Builder builder ) + { + FT_GlyphSlot glyph = builder->glyph; + + + if ( glyph ) + glyph->outline = *builder->base; + } + + + /* check that there is enough space for `count' more points */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_check_points( T1_Builder builder, + FT_Int count ) + { + return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); + } + + + /* add a new point, do not check space */ + FT_LOCAL_DEF( void ) + t1_builder_add_point( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ) + { + FT_Outline* outline = builder->current; + + + if ( builder->load_points ) + { + FT_Vector* point = outline->points + outline->n_points; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; + + + point->x = FIXED_TO_INT( x ); + point->y = FIXED_TO_INT( y ); + *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); + } + outline->n_points++; + } + + + /* check space for a new on-curve point, then add it */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_add_point1( T1_Builder builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error; + + + error = t1_builder_check_points( builder, 1 ); + if ( !error ) + t1_builder_add_point( builder, x, y, 1 ); + + return error; + } + + + /* check space for a new contour, then add it */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_add_contour( T1_Builder builder ) + { + FT_Outline* outline = builder->current; + FT_Error error; + + + /* this might happen in invalid fonts */ + if ( !outline ) + { + FT_ERROR(( "t1_builder_add_contour: no outline to add points to\n" )); + return FT_THROW( Invalid_File_Format ); + } + + if ( !builder->load_points ) + { + outline->n_contours++; + return FT_Err_Ok; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); + if ( !error ) + { + if ( outline->n_contours > 0 ) + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + + outline->n_contours++; + } + + return error; + } + + + /* if a path was begun, add its first on-curve point */ + FT_LOCAL_DEF( FT_Error ) + t1_builder_start_point( T1_Builder builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error = FT_ERR( Invalid_File_Format ); + + + /* test whether we are building a new contour */ + + if ( builder->parse_state == T1_Parse_Have_Path ) + error = FT_Err_Ok; + else + { + builder->parse_state = T1_Parse_Have_Path; + error = t1_builder_add_contour( builder ); + if ( !error ) + error = t1_builder_add_point1( builder, x, y ); + } + + return error; + } + + + /* close the current contour */ + FT_LOCAL_DEF( void ) + t1_builder_close_contour( T1_Builder builder ) + { + FT_Outline* outline = builder->current; + FT_Int first; + + + if ( !outline ) + return; + + first = outline->n_contours <= 1 + ? 0 : outline->contours[outline->n_contours - 2] + 1; + + /* in malformed fonts it can happen that a contour was started */ + /* but no points were added */ + if ( outline->n_contours && first == outline->n_points ) + { + outline->n_contours--; + return; + } + + /* We must not include the last point in the path if it */ + /* is located on the first point. */ + if ( outline->n_points > 1 ) + { + FT_Vector* p1 = outline->points + first; + FT_Vector* p2 = outline->points + outline->n_points - 1; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; + + + /* `delete' last point only if it coincides with the first */ + /* point and it is not a control point (which can happen). */ + if ( p1->x == p2->x && p1->y == p2->y ) + if ( *control == FT_CURVE_TAG_ON ) + outline->n_points--; + } + + if ( outline->n_contours > 0 ) + { + /* Don't add contours only consisting of one point, i.e., */ + /* check whether the first and the last point is the same. */ + if ( first == outline->n_points - 1 ) + { + outline->n_contours--; + outline->n_points--; + } + else + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* cff_builder_init */ + /* */ + /* */ + /* Initializes a given glyph builder. */ + /* */ + /* */ + /* builder :: A pointer to the glyph builder to initialize. */ + /* */ + /* */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* glyph :: The current glyph object. */ + /* */ + /* hinting :: Whether hinting is active. */ + /* */ + FT_LOCAL_DEF( void ) + cff_builder_init( CFF_Builder* builder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot glyph, + FT_Bool hinting ) + { + builder->path_begun = 0; + builder->load_points = 1; + + builder->face = face; + builder->glyph = glyph; + builder->memory = face->root.memory; + + if ( glyph ) + { + FT_GlyphLoader loader = glyph->root.internal->loader; + + + builder->loader = loader; + builder->base = &loader->base.outline; + builder->current = &loader->current.outline; + FT_GlyphLoader_Rewind( loader ); + + builder->hints_globals = NULL; + builder->hints_funcs = NULL; + + if ( hinting && size ) + { + FT_Size ftsize = FT_SIZE( size ); + CFF_Internal internal = (CFF_Internal)ftsize->internal->module_data; + + if ( internal ) + { + builder->hints_globals = (void *)internal->topfont; + builder->hints_funcs = glyph->root.internal->glyph_hints; + } + } + } + + builder->pos_x = 0; + builder->pos_y = 0; + + builder->left_bearing.x = 0; + builder->left_bearing.y = 0; + builder->advance.x = 0; + builder->advance.y = 0; + + builder->funcs = cff_builder_funcs; + } + + + /*************************************************************************/ + /* */ + /* */ + /* cff_builder_done */ + /* */ + /* */ + /* Finalizes a given glyph builder. Its contents can still be used */ + /* after the call, but the function saves important information */ + /* within the corresponding glyph slot. */ + /* */ + /* */ + /* builder :: A pointer to the glyph builder to finalize. */ + /* */ + FT_LOCAL_DEF( void ) + cff_builder_done( CFF_Builder* builder ) + { + CFF_GlyphSlot glyph = builder->glyph; + + + if ( glyph ) + glyph->root.outline = *builder->base; + } + + + /* check that there is enough space for `count' more points */ + FT_LOCAL_DEF( FT_Error ) + cff_check_points( CFF_Builder* builder, + FT_Int count ) + { + return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); + } + + + /* add a new point, do not check space */ + FT_LOCAL_DEF( void ) + cff_builder_add_point( CFF_Builder* builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ) + { + FT_Outline* outline = builder->current; + + + if ( builder->load_points ) + { + FT_Vector* point = outline->points + outline->n_points; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( builder->face ); + + + if ( driver->hinting_engine == FT_HINTING_FREETYPE ) + { + point->x = x >> 16; + point->y = y >> 16; + } + else +#endif + { + /* cf2_decoder_parse_charstrings uses 16.16 coordinates */ + point->x = x >> 10; + point->y = y >> 10; + } + *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); + } + + outline->n_points++; + } + + + /* check space for a new on-curve point, then add it */ + FT_LOCAL_DEF( FT_Error ) + cff_builder_add_point1( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error; + + + error = cff_check_points( builder, 1 ); + if ( !error ) + cff_builder_add_point( builder, x, y, 1 ); + + return error; + } + + + /* check space for a new contour, then add it */ + FT_LOCAL_DEF( FT_Error ) + cff_builder_add_contour( CFF_Builder* builder ) + { + FT_Outline* outline = builder->current; + FT_Error error; + + + if ( !builder->load_points ) + { + outline->n_contours++; + return FT_Err_Ok; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); + if ( !error ) + { + if ( outline->n_contours > 0 ) + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + + outline->n_contours++; + } + + return error; + } + + + /* if a path was begun, add its first on-curve point */ + FT_LOCAL_DEF( FT_Error ) + cff_builder_start_point( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error = FT_Err_Ok; + + + /* test whether we are building a new contour */ + if ( !builder->path_begun ) + { + builder->path_begun = 1; + error = cff_builder_add_contour( builder ); + if ( !error ) + error = cff_builder_add_point1( builder, x, y ); + } + + return error; + } + + + /* close the current contour */ + FT_LOCAL_DEF( void ) + cff_builder_close_contour( CFF_Builder* builder ) + { + FT_Outline* outline = builder->current; + FT_Int first; + + + if ( !outline ) + return; + + first = outline->n_contours <= 1 + ? 0 : outline->contours[outline->n_contours - 2] + 1; + + /* We must not include the last point in the path if it */ + /* is located on the first point. */ + if ( outline->n_points > 1 ) + { + FT_Vector* p1 = outline->points + first; + FT_Vector* p2 = outline->points + outline->n_points - 1; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; + + + /* `delete' last point only if it coincides with the first */ + /* point and if it is not a control point (which can happen). */ + if ( p1->x == p2->x && p1->y == p2->y ) + if ( *control == FT_CURVE_TAG_ON ) + outline->n_points--; + } + + if ( outline->n_contours > 0 ) + { + /* Don't add contours only consisting of one point, i.e., */ + /* check whether begin point and last point are the same. */ + if ( first == outline->n_points - 1 ) + { + outline->n_contours--; + outline->n_points--; + } + else + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* */ + /* ps_builder_init */ + /* */ + /* */ + /* Initializes a given glyph builder. */ + /* */ + /* */ + /* builder :: A pointer to the glyph builder to initialize. */ + /* */ + /* */ + /* face :: The current face object. */ + /* */ + /* size :: The current size object. */ + /* */ + /* glyph :: The current glyph object. */ + /* */ + /* hinting :: Whether hinting should be applied. */ + /* */ + FT_LOCAL_DEF( void ) + ps_builder_init( PS_Builder* ps_builder, + void* builder, + FT_Bool is_t1 ) + { + FT_ZERO( ps_builder ); + + if ( is_t1 ) + { + T1_Builder t1builder = (T1_Builder)builder; + + + ps_builder->memory = t1builder->memory; + ps_builder->face = (FT_Face)t1builder->face; + ps_builder->glyph = (CFF_GlyphSlot)t1builder->glyph; + ps_builder->loader = t1builder->loader; + ps_builder->base = t1builder->base; + ps_builder->current = t1builder->current; + + ps_builder->pos_x = &t1builder->pos_x; + ps_builder->pos_y = &t1builder->pos_y; + + ps_builder->left_bearing = &t1builder->left_bearing; + ps_builder->advance = &t1builder->advance; + + ps_builder->bbox = &t1builder->bbox; + ps_builder->path_begun = 0; + ps_builder->load_points = t1builder->load_points; + ps_builder->no_recurse = t1builder->no_recurse; + + ps_builder->metrics_only = t1builder->metrics_only; + } + else + { + CFF_Builder* cffbuilder = (CFF_Builder*)builder; + + + ps_builder->memory = cffbuilder->memory; + ps_builder->face = (FT_Face)cffbuilder->face; + ps_builder->glyph = cffbuilder->glyph; + ps_builder->loader = cffbuilder->loader; + ps_builder->base = cffbuilder->base; + ps_builder->current = cffbuilder->current; + + ps_builder->pos_x = &cffbuilder->pos_x; + ps_builder->pos_y = &cffbuilder->pos_y; + + ps_builder->left_bearing = &cffbuilder->left_bearing; + ps_builder->advance = &cffbuilder->advance; + + ps_builder->bbox = &cffbuilder->bbox; + ps_builder->path_begun = cffbuilder->path_begun; + ps_builder->load_points = cffbuilder->load_points; + ps_builder->no_recurse = cffbuilder->no_recurse; + + ps_builder->metrics_only = cffbuilder->metrics_only; + } + + ps_builder->is_t1 = is_t1; + ps_builder->funcs = ps_builder_funcs; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ps_builder_done */ + /* */ + /* */ + /* Finalizes a given glyph builder. Its contents can still be used */ + /* after the call, but the function saves important information */ + /* within the corresponding glyph slot. */ + /* */ + /* */ + /* builder :: A pointer to the glyph builder to finalize. */ + /* */ + FT_LOCAL_DEF( void ) + ps_builder_done( PS_Builder* builder ) + { + CFF_GlyphSlot glyph = builder->glyph; + + + if ( glyph ) + glyph->root.outline = *builder->base; + } + + + /* check that there is enough space for `count' more points */ + FT_LOCAL_DEF( FT_Error ) + ps_builder_check_points( PS_Builder* builder, + FT_Int count ) + { + return FT_GLYPHLOADER_CHECK_POINTS( builder->loader, count, 0 ); + } + + + /* add a new point, do not check space */ + FT_LOCAL_DEF( void ) + ps_builder_add_point( PS_Builder* builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ) + { + FT_Outline* outline = builder->current; + + + if ( builder->load_points ) + { + FT_Vector* point = outline->points + outline->n_points; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points; + +#ifdef CFF_CONFIG_OPTION_OLD_ENGINE + PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( builder->face ); + + + if ( !builder->is_t1 && + driver->hinting_engine == FT_HINTING_FREETYPE ) + { + point->x = x >> 16; + point->y = y >> 16; + } + else +#endif +#ifdef T1_CONFIG_OPTION_OLD_ENGINE +#ifndef CFF_CONFIG_OPTION_OLD_ENGINE + PS_Driver driver = (PS_Driver)FT_FACE_DRIVER( builder->face ); +#endif + if ( builder->is_t1 && + driver->hinting_engine == FT_HINTING_FREETYPE ) + { + point->x = FIXED_TO_INT( x ); + point->y = FIXED_TO_INT( y ); + } + else +#endif + { + /* cf2_decoder_parse_charstrings uses 16.16 coordinates */ + point->x = x >> 10; + point->y = y >> 10; + } + *control = (FT_Byte)( flag ? FT_CURVE_TAG_ON : FT_CURVE_TAG_CUBIC ); + } + outline->n_points++; + } + + + /* check space for a new on-curve point, then add it */ + FT_LOCAL_DEF( FT_Error ) + ps_builder_add_point1( PS_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error; + + + error = ps_builder_check_points( builder, 1 ); + if ( !error ) + ps_builder_add_point( builder, x, y, 1 ); + + return error; + } + + + /* check space for a new contour, then add it */ + FT_LOCAL_DEF( FT_Error ) + ps_builder_add_contour( PS_Builder* builder ) + { + FT_Outline* outline = builder->current; + FT_Error error; + + + /* this might happen in invalid fonts */ + if ( !outline ) + { + FT_ERROR(( "ps_builder_add_contour: no outline to add points to\n" )); + return FT_THROW( Invalid_File_Format ); + } + + if ( !builder->load_points ) + { + outline->n_contours++; + return FT_Err_Ok; + } + + error = FT_GLYPHLOADER_CHECK_POINTS( builder->loader, 0, 1 ); + if ( !error ) + { + if ( outline->n_contours > 0 ) + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + + outline->n_contours++; + } + + return error; + } + + + /* if a path was begun, add its first on-curve point */ + FT_LOCAL_DEF( FT_Error ) + ps_builder_start_point( PS_Builder* builder, + FT_Pos x, + FT_Pos y ) + { + FT_Error error = FT_Err_Ok; + + + /* test whether we are building a new contour */ + if ( !builder->path_begun ) + { + builder->path_begun = 1; + error = ps_builder_add_contour( builder ); + if ( !error ) + error = ps_builder_add_point1( builder, x, y ); + } + + return error; + } + + + /* close the current contour */ + FT_LOCAL_DEF( void ) + ps_builder_close_contour( PS_Builder* builder ) + { + FT_Outline* outline = builder->current; + FT_Int first; + + + if ( !outline ) + return; + + first = outline->n_contours <= 1 + ? 0 : outline->contours[outline->n_contours - 2] + 1; + + /* in malformed fonts it can happen that a contour was started */ + /* but no points were added */ + if ( outline->n_contours && first == outline->n_points ) + { + outline->n_contours--; + return; + } + + /* We must not include the last point in the path if it */ + /* is located on the first point. */ + if ( outline->n_points > 1 ) + { + FT_Vector* p1 = outline->points + first; + FT_Vector* p2 = outline->points + outline->n_points - 1; + FT_Byte* control = (FT_Byte*)outline->tags + outline->n_points - 1; + + + /* `delete' last point only if it coincides with the first */ + /* point and it is not a control point (which can happen). */ + if ( p1->x == p2->x && p1->y == p2->y ) + if ( *control == FT_CURVE_TAG_ON ) + outline->n_points--; + } + + if ( outline->n_contours > 0 ) + { + /* Don't add contours only consisting of one point, i.e., */ + /* check whether the first and the last point is the same. */ + if ( first == outline->n_points - 1 ) + { + outline->n_contours--; + outline->n_points--; + } + else + outline->contours[outline->n_contours - 1] = + (short)( outline->n_points - 1 ); + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** OTHER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* ps_decoder_init */ + /* */ + /* */ + /* Creates a wrapper decoder for use in the combined */ + /* Type 1 / CFF interpreter. */ + /* */ + /* */ + /* ps_decoder :: A pointer to the decoder to initialize. */ + /* */ + /* */ + /* decoder :: A pointer to the original decoder. */ + /* */ + /* is_t1 :: Flag indicating Type 1 or CFF */ + /* */ + FT_LOCAL_DEF( void ) + ps_decoder_init( PS_Decoder* ps_decoder, + void* decoder, + FT_Bool is_t1 ) + { + FT_ZERO( ps_decoder ); + + if ( is_t1 ) + { + T1_Decoder t1_decoder = (T1_Decoder)decoder; + + + ps_builder_init( &ps_decoder->builder, + &t1_decoder->builder, + is_t1 ); + + ps_decoder->cf2_instance = &t1_decoder->cf2_instance; + ps_decoder->psnames = t1_decoder->psnames; + + ps_decoder->num_glyphs = t1_decoder->num_glyphs; + ps_decoder->glyph_names = t1_decoder->glyph_names; + ps_decoder->hint_mode = t1_decoder->hint_mode; + ps_decoder->blend = t1_decoder->blend; + + ps_decoder->num_locals = (FT_UInt)t1_decoder->num_subrs; + ps_decoder->locals = t1_decoder->subrs; + ps_decoder->locals_len = t1_decoder->subrs_len; + ps_decoder->locals_hash = t1_decoder->subrs_hash; + + ps_decoder->buildchar = t1_decoder->buildchar; + ps_decoder->len_buildchar = t1_decoder->len_buildchar; + + ps_decoder->lenIV = t1_decoder->lenIV; + } + else + { + CFF_Decoder* cff_decoder = (CFF_Decoder*)decoder; + + + ps_builder_init( &ps_decoder->builder, + &cff_decoder->builder, + is_t1 ); + + ps_decoder->cff = cff_decoder->cff; + ps_decoder->cf2_instance = &cff_decoder->cff->cf2_instance; + ps_decoder->current_subfont = cff_decoder->current_subfont; + + ps_decoder->num_globals = cff_decoder->num_globals; + ps_decoder->globals = cff_decoder->globals; + ps_decoder->globals_bias = cff_decoder->globals_bias; + ps_decoder->num_locals = cff_decoder->num_locals; + ps_decoder->locals = cff_decoder->locals; + ps_decoder->locals_bias = cff_decoder->locals_bias; + + ps_decoder->glyph_width = &cff_decoder->glyph_width; + ps_decoder->width_only = cff_decoder->width_only; + + ps_decoder->hint_mode = cff_decoder->hint_mode; + + ps_decoder->get_glyph_callback = cff_decoder->get_glyph_callback; + ps_decoder->free_glyph_callback = cff_decoder->free_glyph_callback; + } + } + + + /* Synthesize a SubFont object for Type 1 fonts, for use in the */ + /* new interpreter to access Private dict data. */ + FT_LOCAL_DEF( void ) + t1_make_subfont( FT_Face face, + PS_Private priv, + CFF_SubFont subfont ) + { + CFF_Private cpriv = &subfont->private_dict; + FT_UInt n, count; + + + FT_ZERO( subfont ); + FT_ZERO( cpriv ); + + count = cpriv->num_blue_values = priv->num_blue_values; + for ( n = 0; n < count; n++ ) + cpriv->blue_values[n] = (FT_Pos)priv->blue_values[n]; + + count = cpriv->num_other_blues = priv->num_other_blues; + for ( n = 0; n < count; n++ ) + cpriv->other_blues[n] = (FT_Pos)priv->other_blues[n]; + + count = cpriv->num_family_blues = priv->num_family_blues; + for ( n = 0; n < count; n++ ) + cpriv->family_blues[n] = (FT_Pos)priv->family_blues[n]; + + count = cpriv->num_family_other_blues = priv->num_family_other_blues; + for ( n = 0; n < count; n++ ) + cpriv->family_other_blues[n] = (FT_Pos)priv->family_other_blues[n]; + + cpriv->blue_scale = priv->blue_scale; + cpriv->blue_shift = (FT_Pos)priv->blue_shift; + cpriv->blue_fuzz = (FT_Pos)priv->blue_fuzz; + + cpriv->standard_width = (FT_Pos)priv->standard_width[0]; + cpriv->standard_height = (FT_Pos)priv->standard_height[0]; + + count = cpriv->num_snap_widths = priv->num_snap_widths; + for ( n = 0; n < count; n++ ) + cpriv->snap_widths[n] = (FT_Pos)priv->snap_widths[n]; + + count = cpriv->num_snap_heights = priv->num_snap_heights; + for ( n = 0; n < count; n++ ) + cpriv->snap_heights[n] = (FT_Pos)priv->snap_heights[n]; + + cpriv->force_bold = priv->force_bold; + cpriv->lenIV = priv->lenIV; + cpriv->language_group = priv->language_group; + cpriv->expansion_factor = priv->expansion_factor; + + cpriv->subfont = subfont; + + + /* Initialize the random number generator. */ + if ( face->internal->random_seed != -1 ) + { + /* If we have a face-specific seed, use it. */ + /* If non-zero, update it to a positive value. */ + subfont->random = (FT_UInt32)face->internal->random_seed; + if ( face->internal->random_seed ) + { + do + { + face->internal->random_seed = (FT_Int32)cff_random( + (FT_UInt32)face->internal->random_seed ); + + } while ( face->internal->random_seed < 0 ); + } + } + if ( !subfont->random ) + { + FT_UInt32 seed; + + + /* compute random seed from some memory addresses */ + seed = (FT_UInt32)( (FT_Offset)(char*)&seed ^ + (FT_Offset)(char*)&face ^ + (FT_Offset)(char*)&subfont ); + seed = seed ^ ( seed >> 10 ) ^ ( seed >> 20 ); + if ( seed == 0 ) + seed = 0x7384; + + subfont->random = seed; + } + } + + + FT_LOCAL_DEF( void ) + t1_decrypt( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ) + { + PS_Conv_EexecDecode( &buffer, + buffer + length, + buffer, + length, + &seed ); + } + + + FT_LOCAL_DEF( FT_UInt32 ) + cff_random( FT_UInt32 r ) + { + /* a 32bit version of the `xorshift' algorithm */ + r ^= r << 13; + r ^= r >> 17; + r ^= r << 5; + + return r; + } + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psobjs.h b/vendor/FreeType2/src/psaux/psobjs.h new file mode 100644 index 0000000..8e0fe5f --- /dev/null +++ b/vendor/FreeType2/src/psaux/psobjs.h @@ -0,0 +1,313 @@ +/***************************************************************************/ +/* */ +/* psobjs.h */ +/* */ +/* Auxiliary functions for PostScript fonts (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef PSOBJS_H_ +#define PSOBJS_H_ + + +#include +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_CFF_OBJECTS_TYPES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1_TABLE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_TABLE + const PS_Table_FuncsRec ps_table_funcs; + + FT_CALLBACK_TABLE + const PS_Parser_FuncsRec ps_parser_funcs; + + FT_CALLBACK_TABLE + const T1_Builder_FuncsRec t1_builder_funcs; + + + FT_LOCAL( FT_Error ) + ps_table_new( PS_Table table, + FT_Int count, + FT_Memory memory ); + + FT_LOCAL( FT_Error ) + ps_table_add( PS_Table table, + FT_Int idx, + void* object, + FT_UInt length ); + + FT_LOCAL( void ) + ps_table_done( PS_Table table ); + + + FT_LOCAL( void ) + ps_table_release( PS_Table table ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 PARSER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_LOCAL( void ) + ps_parser_skip_spaces( PS_Parser parser ); + + FT_LOCAL( void ) + ps_parser_skip_PS_token( PS_Parser parser ); + + FT_LOCAL( void ) + ps_parser_to_token( PS_Parser parser, + T1_Token token ); + + FT_LOCAL( void ) + ps_parser_to_token_array( PS_Parser parser, + T1_Token tokens, + FT_UInt max_tokens, + FT_Int* pnum_tokens ); + + FT_LOCAL( FT_Error ) + ps_parser_load_field( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_LOCAL( FT_Error ) + ps_parser_load_field_table( PS_Parser parser, + const T1_Field field, + void** objects, + FT_UInt max_objects, + FT_ULong* pflags ); + + FT_LOCAL( FT_Long ) + ps_parser_to_int( PS_Parser parser ); + + + FT_LOCAL( FT_Error ) + ps_parser_to_bytes( PS_Parser parser, + FT_Byte* bytes, + FT_Offset max_bytes, + FT_ULong* pnum_bytes, + FT_Bool delimiters ); + + + FT_LOCAL( FT_Fixed ) + ps_parser_to_fixed( PS_Parser parser, + FT_Int power_ten ); + + + FT_LOCAL( FT_Int ) + ps_parser_to_coord_array( PS_Parser parser, + FT_Int max_coords, + FT_Short* coords ); + + FT_LOCAL( FT_Int ) + ps_parser_to_fixed_array( PS_Parser parser, + FT_Int max_values, + FT_Fixed* values, + FT_Int power_ten ); + + + FT_LOCAL( void ) + ps_parser_init( PS_Parser parser, + FT_Byte* base, + FT_Byte* limit, + FT_Memory memory ); + + FT_LOCAL( void ) + ps_parser_done( PS_Parser parser ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** T1 BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + t1_builder_init( T1_Builder builder, + FT_Face face, + FT_Size size, + FT_GlyphSlot glyph, + FT_Bool hinting ); + + FT_LOCAL( void ) + t1_builder_done( T1_Builder builder ); + + FT_LOCAL( FT_Error ) + t1_builder_check_points( T1_Builder builder, + FT_Int count ); + + FT_LOCAL( void ) + t1_builder_add_point( T1_Builder builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + + FT_LOCAL( FT_Error ) + t1_builder_add_point1( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + FT_LOCAL( FT_Error ) + t1_builder_add_contour( T1_Builder builder ); + + + FT_LOCAL( FT_Error ) + t1_builder_start_point( T1_Builder builder, + FT_Pos x, + FT_Pos y ); + + + FT_LOCAL( void ) + t1_builder_close_contour( T1_Builder builder ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** CFF BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + cff_builder_init( CFF_Builder* builder, + TT_Face face, + CFF_Size size, + CFF_GlyphSlot glyph, + FT_Bool hinting ); + + FT_LOCAL( void ) + cff_builder_done( CFF_Builder* builder ); + + FT_LOCAL( FT_Error ) + cff_check_points( CFF_Builder* builder, + FT_Int count ); + + FT_LOCAL( void ) + cff_builder_add_point( CFF_Builder* builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + FT_LOCAL( FT_Error ) + cff_builder_add_point1( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ); + FT_LOCAL( FT_Error ) + cff_builder_start_point( CFF_Builder* builder, + FT_Pos x, + FT_Pos y ); + FT_LOCAL( void ) + cff_builder_close_contour( CFF_Builder* builder ); + + FT_LOCAL( FT_Error ) + cff_builder_add_contour( CFF_Builder* builder ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS BUILDER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + ps_builder_init( PS_Builder* ps_builder, + void* builder, + FT_Bool is_t1 ); + + + FT_LOCAL( void ) + ps_builder_done( PS_Builder* builder ); + + FT_LOCAL( FT_Error ) + ps_builder_check_points( PS_Builder* builder, + FT_Int count ); + + FT_LOCAL( void ) + ps_builder_add_point( PS_Builder* builder, + FT_Pos x, + FT_Pos y, + FT_Byte flag ); + + FT_LOCAL( FT_Error ) + ps_builder_add_point1( PS_Builder* builder, + FT_Pos x, + FT_Pos y ); + + FT_LOCAL( FT_Error ) + ps_builder_add_contour( PS_Builder* builder ); + + FT_LOCAL( FT_Error ) + ps_builder_start_point( PS_Builder* builder, + FT_Pos x, + FT_Pos y ); + + FT_LOCAL( void ) + ps_builder_close_contour( PS_Builder* builder ); + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** OTHER *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_LOCAL( void ) + ps_decoder_init( PS_Decoder* ps_decoder, + void* decoder, + FT_Bool is_t1 ); + + FT_LOCAL( void ) + t1_make_subfont( FT_Face face, + PS_Private priv, + CFF_SubFont subfont ); + + FT_LOCAL( void ) + t1_decrypt( FT_Byte* buffer, + FT_Offset length, + FT_UShort seed ); + + + FT_LOCAL( FT_UInt32 ) + cff_random( FT_UInt32 r ); + + +FT_END_HEADER + +#endif /* PSOBJS_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psread.c b/vendor/FreeType2/src/psaux/psread.c new file mode 100644 index 0000000..719863c --- /dev/null +++ b/vendor/FreeType2/src/psaux/psread.c @@ -0,0 +1,112 @@ +/***************************************************************************/ +/* */ +/* psread.c */ +/* */ +/* Adobe's code for stream handling (body). */ +/* */ +/* Copyright 2007-2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#include "psft.h" +#include FT_INTERNAL_DEBUG_H + +#include "psglue.h" + +#include "pserror.h" + + + /* Define CF2_IO_FAIL as 1 to enable random errors and random */ + /* value errors in I/O. */ +#define CF2_IO_FAIL 0 + + +#if CF2_IO_FAIL + + /* set the .00 value to a nonzero probability */ + static int + randomError2( void ) + { + /* for region buffer ReadByte (interp) function */ + return (double)rand() / RAND_MAX < .00; + } + + /* set the .00 value to a nonzero probability */ + static CF2_Int + randomValue() + { + return (double)rand() / RAND_MAX < .00 ? rand() : 0; + } + +#endif /* CF2_IO_FAIL */ + + + /* Region Buffer */ + /* */ + /* Can be constructed from a copied buffer managed by */ + /* `FCM_getDatablock'. */ + /* Reads bytes with check for end of buffer. */ + + /* reading past the end of the buffer sets error and returns zero */ + FT_LOCAL_DEF( CF2_Int ) + cf2_buf_readByte( CF2_Buffer buf ) + { + if ( buf->ptr < buf->end ) + { +#if CF2_IO_FAIL + if ( randomError2() ) + { + CF2_SET_ERROR( buf->error, Invalid_Stream_Operation ); + return 0; + } + + return *(buf->ptr)++ + randomValue(); +#else + return *(buf->ptr)++; +#endif + } + else + { + CF2_SET_ERROR( buf->error, Invalid_Stream_Operation ); + return 0; + } + } + + + /* note: end condition can occur without error */ + FT_LOCAL_DEF( FT_Bool ) + cf2_buf_isEnd( CF2_Buffer buf ) + { + return (FT_Bool)( buf->ptr >= buf->end ); + } + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psread.h b/vendor/FreeType2/src/psaux/psread.h new file mode 100644 index 0000000..464b29b --- /dev/null +++ b/vendor/FreeType2/src/psaux/psread.h @@ -0,0 +1,68 @@ +/***************************************************************************/ +/* */ +/* psread.h */ +/* */ +/* Adobe's code for stream handling (specification). */ +/* */ +/* Copyright 2007-2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#ifndef PSREAD_H_ +#define PSREAD_H_ + + +FT_BEGIN_HEADER + + + typedef struct CF2_BufferRec_ + { + FT_Error* error; + const FT_Byte* start; + const FT_Byte* end; + const FT_Byte* ptr; + + } CF2_BufferRec, *CF2_Buffer; + + + FT_LOCAL( CF2_Int ) + cf2_buf_readByte( CF2_Buffer buf ); + FT_LOCAL( FT_Bool ) + cf2_buf_isEnd( CF2_Buffer buf ); + + +FT_END_HEADER + + +#endif /* PSREAD_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psstack.c b/vendor/FreeType2/src/psaux/psstack.c new file mode 100644 index 0000000..69d0633 --- /dev/null +++ b/vendor/FreeType2/src/psaux/psstack.c @@ -0,0 +1,328 @@ +/***************************************************************************/ +/* */ +/* psstack.c */ +/* */ +/* Adobe's code for emulating a CFF stack (body). */ +/* */ +/* Copyright 2007-2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#include "psft.h" +#include FT_INTERNAL_DEBUG_H + +#include "psglue.h" +#include "psfont.h" +#include "psstack.h" + +#include "pserror.h" + + + /* Allocate and initialize an instance of CF2_Stack. */ + /* Note: This function returns NULL on error (does not set */ + /* `error'). */ + FT_LOCAL_DEF( CF2_Stack ) + cf2_stack_init( FT_Memory memory, + FT_Error* e, + FT_UInt stackSize ) + { + FT_Error error = FT_Err_Ok; /* for FT_NEW */ + + CF2_Stack stack = NULL; + + + if ( !FT_NEW( stack ) ) + { + /* initialize the structure; FT_NEW zeroes it */ + stack->memory = memory; + stack->error = e; + } + + /* allocate the stack buffer */ + if ( FT_NEW_ARRAY( stack->buffer, stackSize ) ) + { + FT_FREE( stack ); + return NULL; + } + + stack->stackSize = stackSize; + stack->top = stack->buffer; /* empty stack */ + + return stack; + } + + + FT_LOCAL_DEF( void ) + cf2_stack_free( CF2_Stack stack ) + { + if ( stack ) + { + FT_Memory memory = stack->memory; + + /* free the buffer */ + FT_FREE( stack->buffer ); + + /* free the main structure */ + FT_FREE( stack ); + } + } + + + FT_LOCAL_DEF( CF2_UInt ) + cf2_stack_count( CF2_Stack stack ) + { + return (CF2_UInt)( stack->top - stack->buffer ); + } + + + FT_LOCAL_DEF( void ) + cf2_stack_pushInt( CF2_Stack stack, + CF2_Int val ) + { + if ( stack->top == stack->buffer + stack->stackSize ) + { + CF2_SET_ERROR( stack->error, Stack_Overflow ); + return; /* stack overflow */ + } + + stack->top->u.i = val; + stack->top->type = CF2_NumberInt; + stack->top++; + } + + + FT_LOCAL_DEF( void ) + cf2_stack_pushFixed( CF2_Stack stack, + CF2_Fixed val ) + { + if ( stack->top == stack->buffer + stack->stackSize ) + { + CF2_SET_ERROR( stack->error, Stack_Overflow ); + return; /* stack overflow */ + } + + stack->top->u.r = val; + stack->top->type = CF2_NumberFixed; + stack->top++; + } + + + /* this function is only allowed to pop an integer type */ + FT_LOCAL_DEF( CF2_Int ) + cf2_stack_popInt( CF2_Stack stack ) + { + if ( stack->top == stack->buffer ) + { + CF2_SET_ERROR( stack->error, Stack_Underflow ); + return 0; /* underflow */ + } + if ( stack->top[-1].type != CF2_NumberInt ) + { + CF2_SET_ERROR( stack->error, Syntax_Error ); + return 0; /* type mismatch */ + } + + stack->top--; + + return stack->top->u.i; + } + + + /* Note: type mismatch is silently cast */ + /* TODO: check this */ + FT_LOCAL_DEF( CF2_Fixed ) + cf2_stack_popFixed( CF2_Stack stack ) + { + if ( stack->top == stack->buffer ) + { + CF2_SET_ERROR( stack->error, Stack_Underflow ); + return cf2_intToFixed( 0 ); /* underflow */ + } + + stack->top--; + + switch ( stack->top->type ) + { + case CF2_NumberInt: + return cf2_intToFixed( stack->top->u.i ); + case CF2_NumberFrac: + return cf2_fracToFixed( stack->top->u.f ); + default: + return stack->top->u.r; + } + } + + + /* Note: type mismatch is silently cast */ + /* TODO: check this */ + FT_LOCAL_DEF( CF2_Fixed ) + cf2_stack_getReal( CF2_Stack stack, + CF2_UInt idx ) + { + FT_ASSERT( cf2_stack_count( stack ) <= stack->stackSize ); + + if ( idx >= cf2_stack_count( stack ) ) + { + CF2_SET_ERROR( stack->error, Stack_Overflow ); + return cf2_intToFixed( 0 ); /* bounds error */ + } + + switch ( stack->buffer[idx].type ) + { + case CF2_NumberInt: + return cf2_intToFixed( stack->buffer[idx].u.i ); + case CF2_NumberFrac: + return cf2_fracToFixed( stack->buffer[idx].u.f ); + default: + return stack->buffer[idx].u.r; + } + } + + + /* provide random access to stack */ + FT_LOCAL_DEF( void ) + cf2_stack_setReal( CF2_Stack stack, + CF2_UInt idx, + CF2_Fixed val ) + { + if ( idx > cf2_stack_count( stack ) ) + { + CF2_SET_ERROR( stack->error, Stack_Overflow ); + return; + } + + stack->buffer[idx].u.r = val; + stack->buffer[idx].type = CF2_NumberFixed; + } + + + /* discard (pop) num values from stack */ + FT_LOCAL_DEF( void ) + cf2_stack_pop( CF2_Stack stack, + CF2_UInt num ) + { + if ( num > cf2_stack_count( stack ) ) + { + CF2_SET_ERROR( stack->error, Stack_Underflow ); + return; + } + stack->top -= num; + } + + + FT_LOCAL_DEF( void ) + cf2_stack_roll( CF2_Stack stack, + CF2_Int count, + CF2_Int shift ) + { + /* we initialize this variable to avoid compiler warnings */ + CF2_StackNumber last = { { 0 }, CF2_NumberInt }; + + CF2_Int start_idx, idx, i; + + + if ( count < 2 ) + return; /* nothing to do (values 0 and 1), or undefined value */ + + if ( (CF2_UInt)count > cf2_stack_count( stack ) ) + { + CF2_SET_ERROR( stack->error, Stack_Overflow ); + return; + } + + if ( shift < 0 ) + shift = -( ( -shift ) % count ); + else + shift %= count; + + if ( shift == 0 ) + return; /* nothing to do */ + + /* We use the following algorithm to do the rolling, */ + /* which needs two temporary variables only. */ + /* */ + /* Example: */ + /* */ + /* count = 8 */ + /* shift = 2 */ + /* */ + /* stack indices before roll: 7 6 5 4 3 2 1 0 */ + /* stack indices after roll: 1 0 7 6 5 4 3 2 */ + /* */ + /* The value of index 0 gets moved to index 2, while */ + /* the old value of index 2 gets moved to index 4, */ + /* and so on. We thus have the following copying */ + /* chains for shift value 2. */ + /* */ + /* 0 -> 2 -> 4 -> 6 -> 0 */ + /* 1 -> 3 -> 5 -> 7 -> 1 */ + /* */ + /* If `count' and `shift' are incommensurable, we */ + /* have a single chain only. Otherwise, increase */ + /* the start index by 1 after the first chain, then */ + /* do the next chain until all elements in all */ + /* chains are handled. */ + + start_idx = -1; + idx = -1; + for ( i = 0; i < count; i++ ) + { + CF2_StackNumber tmp; + + + if ( start_idx == idx ) + { + start_idx++; + idx = start_idx; + last = stack->buffer[idx]; + } + + idx += shift; + if ( idx >= count ) + idx -= count; + else if ( idx < 0 ) + idx += count; + + tmp = stack->buffer[idx]; + stack->buffer[idx] = last; + last = tmp; + } + } + + + FT_LOCAL_DEF( void ) + cf2_stack_clear( CF2_Stack stack ) + { + stack->top = stack->buffer; + } + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/psstack.h b/vendor/FreeType2/src/psaux/psstack.h new file mode 100644 index 0000000..38f7b41 --- /dev/null +++ b/vendor/FreeType2/src/psaux/psstack.h @@ -0,0 +1,121 @@ +/***************************************************************************/ +/* */ +/* psstack.h */ +/* */ +/* Adobe's code for emulating a CFF stack (specification). */ +/* */ +/* Copyright 2007-2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#ifndef PSSTACK_H_ +#define PSSTACK_H_ + + +FT_BEGIN_HEADER + + + /* CFF operand stack; specified maximum of 48 or 192 values */ + typedef struct CF2_StackNumber_ + { + union + { + CF2_Fixed r; /* 16.16 fixed point */ + CF2_Frac f; /* 2.30 fixed point (for font matrix) */ + CF2_Int i; + } u; + + CF2_NumberType type; + + } CF2_StackNumber; + + + typedef struct CF2_StackRec_ + { + FT_Memory memory; + FT_Error* error; + CF2_StackNumber* buffer; + CF2_StackNumber* top; + FT_UInt stackSize; + + } CF2_StackRec, *CF2_Stack; + + + FT_LOCAL( CF2_Stack ) + cf2_stack_init( FT_Memory memory, + FT_Error* error, + FT_UInt stackSize ); + FT_LOCAL( void ) + cf2_stack_free( CF2_Stack stack ); + + FT_LOCAL( CF2_UInt ) + cf2_stack_count( CF2_Stack stack ); + + FT_LOCAL( void ) + cf2_stack_pushInt( CF2_Stack stack, + CF2_Int val ); + FT_LOCAL( void ) + cf2_stack_pushFixed( CF2_Stack stack, + CF2_Fixed val ); + + FT_LOCAL( CF2_Int ) + cf2_stack_popInt( CF2_Stack stack ); + FT_LOCAL( CF2_Fixed ) + cf2_stack_popFixed( CF2_Stack stack ); + + FT_LOCAL( CF2_Fixed ) + cf2_stack_getReal( CF2_Stack stack, + CF2_UInt idx ); + FT_LOCAL( void ) + cf2_stack_setReal( CF2_Stack stack, + CF2_UInt idx, + CF2_Fixed val ); + + FT_LOCAL( void ) + cf2_stack_pop( CF2_Stack stack, + CF2_UInt num ); + + FT_LOCAL( void ) + cf2_stack_roll( CF2_Stack stack, + CF2_Int count, + CF2_Int idx ); + + FT_LOCAL( void ) + cf2_stack_clear( CF2_Stack stack ); + + +FT_END_HEADER + + +#endif /* PSSTACK_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/pstypes.h b/vendor/FreeType2/src/psaux/pstypes.h new file mode 100644 index 0000000..dfbaa3d --- /dev/null +++ b/vendor/FreeType2/src/psaux/pstypes.h @@ -0,0 +1,78 @@ +/***************************************************************************/ +/* */ +/* pstypes.h */ +/* */ +/* Adobe's code for defining data types (specification only). */ +/* */ +/* Copyright 2011-2013 Adobe Systems Incorporated. */ +/* */ +/* This software, and all works of authorship, whether in source or */ +/* object code form as indicated by the copyright notice(s) included */ +/* herein (collectively, the "Work") is made available, and may only be */ +/* used, modified, and distributed under the FreeType Project License, */ +/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ +/* FreeType Project License, each contributor to the Work hereby grants */ +/* to any individual or legal entity exercising permissions granted by */ +/* the FreeType Project License and this section (hereafter, "You" or */ +/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ +/* royalty-free, irrevocable (except as stated in this section) patent */ +/* license to make, have made, use, offer to sell, sell, import, and */ +/* otherwise transfer the Work, where such license applies only to those */ +/* patent claims licensable by such contributor that are necessarily */ +/* infringed by their contribution(s) alone or by combination of their */ +/* contribution(s) with the Work to which such contribution(s) was */ +/* submitted. If You institute patent litigation against any entity */ +/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ +/* the Work or a contribution incorporated within the Work constitutes */ +/* direct or contributory patent infringement, then any patent licenses */ +/* granted to You under this License for that Work shall terminate as of */ +/* the date such litigation is filed. */ +/* */ +/* By using, modifying, or distributing the Work you indicate that you */ +/* have read and understood the terms and conditions of the */ +/* FreeType Project License as well as those provided in this section, */ +/* and you accept them fully. */ +/* */ +/***************************************************************************/ + + +#ifndef PSTYPES_H_ +#define PSTYPES_H_ + +#include +#include FT_FREETYPE_H + + +FT_BEGIN_HEADER + + + /* + * The data models that we expect to support are as follows: + * + * name char short int long long-long pointer example + * ----------------------------------------------------- + * ILP32 8 16 32 32 64* 32 32-bit MacOS, x86 + * LLP64 8 16 32 32 64 64 x64 + * LP64 8 16 32 64 64 64 64-bit MacOS + * + * *) type may be supported by emulation on a 32-bit architecture + * + */ + + + /* integers at least 32 bits wide */ +#define CF2_UInt FT_UFast +#define CF2_Int FT_Fast + + + /* fixed-float numbers */ + typedef FT_Int32 CF2_F16Dot16; + + +FT_END_HEADER + + +#endif /* PSTYPES_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/t1cmap.c b/vendor/FreeType2/src/psaux/t1cmap.c new file mode 100644 index 0000000..112a789 --- /dev/null +++ b/vendor/FreeType2/src/psaux/t1cmap.c @@ -0,0 +1,371 @@ +/***************************************************************************/ +/* */ +/* t1cmap.c */ +/* */ +/* Type 1 character map support (body). */ +/* */ +/* Copyright 2002-2018 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. */ +/* */ +/***************************************************************************/ + + +#include "t1cmap.h" + +#include FT_INTERNAL_DEBUG_H + +#include "psauxerr.h" + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + t1_cmap_std_init( T1_CMapStd cmap, + FT_Int is_expert ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + cmap->num_glyphs = (FT_UInt)face->type1.num_glyphs; + cmap->glyph_names = (const char* const*)face->type1.glyph_names; + cmap->sid_to_string = psnames->adobe_std_strings; + cmap->code_to_sid = is_expert ? psnames->adobe_expert_encoding + : psnames->adobe_std_encoding; + + FT_ASSERT( cmap->code_to_sid ); + } + + + FT_CALLBACK_DEF( void ) + t1_cmap_std_done( T1_CMapStd cmap ) + { + cmap->num_glyphs = 0; + cmap->glyph_names = NULL; + cmap->sid_to_string = NULL; + cmap->code_to_sid = NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_std_char_index( T1_CMapStd cmap, + FT_UInt32 char_code ) + { + FT_UInt result = 0; + + + if ( char_code < 256 ) + { + FT_UInt code, n; + const char* glyph_name; + + + /* convert character code to Adobe SID string */ + code = cmap->code_to_sid[char_code]; + glyph_name = cmap->sid_to_string( code ); + + /* look for the corresponding glyph name */ + for ( n = 0; n < cmap->num_glyphs; n++ ) + { + const char* gname = cmap->glyph_names[n]; + + + if ( gname && gname[0] == glyph_name[0] && + ft_strcmp( gname, glyph_name ) == 0 ) + { + result = n; + break; + } + } + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + t1_cmap_std_char_next( T1_CMapStd cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code + 1; + + + while ( char_code < 256 ) + { + result = t1_cmap_std_char_index( cmap, char_code ); + if ( result != 0 ) + goto Exit; + + char_code++; + } + char_code = 0; + + Exit: + *pchar_code = char_code; + return result; + } + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_standard_init( T1_CMapStd cmap, + FT_Pointer pointer ) + { + FT_UNUSED( pointer ); + + + t1_cmap_std_init( cmap, 0 ); + return 0; + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_standard_class_rec = + { + sizeof ( T1_CMapStdRec ), + + (FT_CMap_InitFunc) t1_cmap_standard_init, /* init */ + (FT_CMap_DoneFunc) t1_cmap_std_done, /* done */ + (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, /* char_index */ + (FT_CMap_CharNextFunc) t1_cmap_std_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ + }; + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_expert_init( T1_CMapStd cmap, + FT_Pointer pointer ) + { + FT_UNUSED( pointer ); + + + t1_cmap_std_init( cmap, 1 ); + return 0; + } + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_expert_class_rec = + { + sizeof ( T1_CMapStdRec ), + + (FT_CMap_InitFunc) t1_cmap_expert_init, /* init */ + (FT_CMap_DoneFunc) t1_cmap_std_done, /* done */ + (FT_CMap_CharIndexFunc)t1_cmap_std_char_index, /* char_index */ + (FT_CMap_CharNextFunc) t1_cmap_std_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CUSTOM ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_custom_init( T1_CMapCustom cmap, + FT_Pointer pointer ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( cmap ); + T1_Encoding encoding = &face->type1.encoding; + + FT_UNUSED( pointer ); + + + cmap->first = (FT_UInt)encoding->code_first; + cmap->count = (FT_UInt)encoding->code_last - cmap->first; + cmap->indices = encoding->char_index; + + FT_ASSERT( cmap->indices ); + FT_ASSERT( encoding->code_first <= encoding->code_last ); + + return 0; + } + + + FT_CALLBACK_DEF( void ) + t1_cmap_custom_done( T1_CMapCustom cmap ) + { + cmap->indices = NULL; + cmap->first = 0; + cmap->count = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_custom_char_index( T1_CMapCustom cmap, + FT_UInt32 char_code ) + { + FT_UInt result = 0; + + + if ( ( char_code >= cmap->first ) && + ( char_code < ( cmap->first + cmap->count ) ) ) + result = cmap->indices[char_code]; + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + t1_cmap_custom_char_next( T1_CMapCustom cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *pchar_code; + + + char_code++; + + if ( char_code < cmap->first ) + char_code = cmap->first; + + for ( ; char_code < ( cmap->first + cmap->count ); char_code++ ) + { + result = cmap->indices[char_code]; + if ( result != 0 ) + goto Exit; + } + + char_code = 0; + + Exit: + *pchar_code = char_code; + return result; + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_custom_class_rec = + { + sizeof ( T1_CMapCustomRec ), + + (FT_CMap_InitFunc) t1_cmap_custom_init, /* init */ + (FT_CMap_DoneFunc) t1_cmap_custom_done, /* done */ + (FT_CMap_CharIndexFunc)t1_cmap_custom_char_index, /* char_index */ + (FT_CMap_CharNextFunc) t1_cmap_custom_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ + }; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_CALLBACK_DEF( const char * ) + psaux_get_glyph_name( T1_Face face, + FT_UInt idx ) + { + return face->type1.glyph_names[idx]; + } + + + FT_CALLBACK_DEF( FT_Error ) + t1_cmap_unicode_init( PS_Unicodes unicodes, + FT_Pointer pointer ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + FT_UNUSED( pointer ); + + + return psnames->unicodes_init( memory, + unicodes, + (FT_UInt)face->type1.num_glyphs, + (PS_GetGlyphNameFunc)&psaux_get_glyph_name, + (PS_FreeGlyphNameFunc)NULL, + (FT_Pointer)face ); + } + + + FT_CALLBACK_DEF( void ) + t1_cmap_unicode_done( PS_Unicodes unicodes ) + { + FT_Face face = FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( unicodes->maps ); + unicodes->num_maps = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + t1_cmap_unicode_char_index( PS_Unicodes unicodes, + FT_UInt32 char_code ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_char_index( unicodes, char_code ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + t1_cmap_unicode_char_next( PS_Unicodes unicodes, + FT_UInt32 *pchar_code ) + { + T1_Face face = (T1_Face)FT_CMAP_FACE( unicodes ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_char_next( unicodes, pchar_code ); + } + + + FT_CALLBACK_TABLE_DEF const FT_CMap_ClassRec + t1_cmap_unicode_class_rec = + { + sizeof ( PS_UnicodesRec ), + + (FT_CMap_InitFunc) t1_cmap_unicode_init, /* init */ + (FT_CMap_DoneFunc) t1_cmap_unicode_done, /* done */ + (FT_CMap_CharIndexFunc)t1_cmap_unicode_char_index, /* char_index */ + (FT_CMap_CharNextFunc) t1_cmap_unicode_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL /* variantchar_list */ + }; + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/t1cmap.h b/vendor/FreeType2/src/psaux/t1cmap.h new file mode 100644 index 0000000..4308e31 --- /dev/null +++ b/vendor/FreeType2/src/psaux/t1cmap.h @@ -0,0 +1,105 @@ +/***************************************************************************/ +/* */ +/* t1cmap.h */ +/* */ +/* Type 1 character map support (specification). */ +/* */ +/* Copyright 2002-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef T1CMAP_H_ +#define T1CMAP_H_ + +#include +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_TYPE1_TYPES_H + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 STANDARD (AND EXPERT) ENCODING CMAPS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* standard (and expert) encoding cmaps */ + typedef struct T1_CMapStdRec_* T1_CMapStd; + + typedef struct T1_CMapStdRec_ + { + FT_CMapRec cmap; + + const FT_UShort* code_to_sid; + PS_Adobe_Std_StringsFunc sid_to_string; + + FT_UInt num_glyphs; + const char* const* glyph_names; + + } T1_CMapStdRec; + + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_standard_class_rec; + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_expert_class_rec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 CUSTOM ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + typedef struct T1_CMapCustomRec_* T1_CMapCustom; + + typedef struct T1_CMapCustomRec_ + { + FT_CMapRec cmap; + FT_UInt first; + FT_UInt count; + FT_UShort* indices; + + } T1_CMapCustomRec; + + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_custom_class_rec; + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE1 SYNTHETIC UNICODE ENCODING CMAP *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* unicode (synthetic) cmaps */ + + FT_CALLBACK_TABLE const FT_CMap_ClassRec + t1_cmap_unicode_class_rec; + + /* */ + + +FT_END_HEADER + +#endif /* T1CMAP_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/t1decode.c b/vendor/FreeType2/src/psaux/t1decode.c new file mode 100644 index 0000000..6ad1456 --- /dev/null +++ b/vendor/FreeType2/src/psaux/t1decode.c @@ -0,0 +1,1988 @@ +/***************************************************************************/ +/* */ +/* t1decode.c */ +/* */ +/* PostScript Type 1 decoding routines (body). */ +/* */ +/* Copyright 2000-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include FT_INTERNAL_HASH_H +#include FT_OUTLINE_H + +#include "t1decode.h" +#include "psobjs.h" + +#include "psauxerr.h" + +/* ensure proper sign extension */ +#define Fix2Int( f ) ( (FT_Int)(FT_Short)( (f) >> 16 ) ) + + /*************************************************************************/ + /* */ + /* 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_t1decode + + + typedef enum T1_Operator_ + { + op_none = 0, + op_endchar, + op_hsbw, + op_seac, + op_sbw, + op_closepath, + op_hlineto, + op_hmoveto, + op_hvcurveto, + op_rlineto, + op_rmoveto, + op_rrcurveto, + op_vhcurveto, + op_vlineto, + op_vmoveto, + op_dotsection, + op_hstem, + op_hstem3, + op_vstem, + op_vstem3, + op_div, + op_callothersubr, + op_callsubr, + op_pop, + op_return, + op_setcurrentpoint, + op_unknown15, + + op_max /* never remove this one */ + + } T1_Operator; + + + static + const FT_Int t1_args_count[op_max] = + { + 0, /* none */ + 0, /* endchar */ + 2, /* hsbw */ + 5, /* seac */ + 4, /* sbw */ + 0, /* closepath */ + 1, /* hlineto */ + 1, /* hmoveto */ + 4, /* hvcurveto */ + 2, /* rlineto */ + 2, /* rmoveto */ + 6, /* rrcurveto */ + 4, /* vhcurveto */ + 1, /* vlineto */ + 1, /* vmoveto */ + 0, /* dotsection */ + 2, /* hstem */ + 6, /* hstem3 */ + 2, /* vstem */ + 6, /* vstem3 */ + 2, /* div */ + -1, /* callothersubr */ + 1, /* callsubr */ + 0, /* pop */ + 0, /* return */ + 2, /* setcurrentpoint */ + 2 /* opcode 15 (undocumented and obsolete) */ + }; + + + /*************************************************************************/ + /* */ + /* */ + /* t1_lookup_glyph_by_stdcharcode_ps */ + /* */ + /* */ + /* Looks up a given glyph by its StandardEncoding charcode. Used to */ + /* implement the SEAC Type 1 operator in the Adobe engine */ + /* */ + /* */ + /* face :: The current face object. */ + /* */ + /* charcode :: The character code to look for. */ + /* */ + /* */ + /* A glyph index in the font face. Returns -1 if the corresponding */ + /* glyph wasn't found. */ + /* */ + FT_LOCAL_DEF( FT_Int ) + t1_lookup_glyph_by_stdcharcode_ps( PS_Decoder* decoder, + FT_Int charcode ) + { + FT_UInt n; + const FT_String* glyph_name; + FT_Service_PsCMaps psnames = decoder->psnames; + + + /* check range of standard char code */ + if ( charcode < 0 || charcode > 255 ) + return -1; + + glyph_name = psnames->adobe_std_strings( + psnames->adobe_std_encoding[charcode]); + + for ( n = 0; n < decoder->num_glyphs; n++ ) + { + FT_String* name = (FT_String*)decoder->glyph_names[n]; + + + if ( name && + name[0] == glyph_name[0] && + ft_strcmp( name, glyph_name ) == 0 ) + return (FT_Int)n; + } + + return -1; + } + + +#ifdef T1_CONFIG_OPTION_OLD_ENGINE + /*************************************************************************/ + /* */ + /* */ + /* t1_lookup_glyph_by_stdcharcode */ + /* */ + /* */ + /* Looks up a given glyph by its StandardEncoding charcode. Used to */ + /* implement the SEAC Type 1 operator. */ + /* */ + /* */ + /* face :: The current face object. */ + /* */ + /* charcode :: The character code to look for. */ + /* */ + /* */ + /* A glyph index in the font face. Returns -1 if the corresponding */ + /* glyph wasn't found. */ + /* */ + static FT_Int + t1_lookup_glyph_by_stdcharcode( T1_Decoder decoder, + FT_Int charcode ) + { + FT_UInt n; + const FT_String* glyph_name; + FT_Service_PsCMaps psnames = decoder->psnames; + + + /* check range of standard char code */ + if ( charcode < 0 || charcode > 255 ) + return -1; + + glyph_name = psnames->adobe_std_strings( + psnames->adobe_std_encoding[charcode]); + + for ( n = 0; n < decoder->num_glyphs; n++ ) + { + FT_String* name = (FT_String*)decoder->glyph_names[n]; + + + if ( name && + name[0] == glyph_name[0] && + ft_strcmp( name, glyph_name ) == 0 ) + return (FT_Int)n; + } + + return -1; + } + + + /* parse a single Type 1 glyph */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_parse_glyph( T1_Decoder decoder, + FT_UInt glyph ) + { + return decoder->parse_callback( decoder, glyph ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* t1operator_seac */ + /* */ + /* */ + /* Implements the `seac' Type 1 operator for a Type 1 decoder. */ + /* */ + /* */ + /* decoder :: The current CID decoder. */ + /* */ + /* asb :: The accent's side bearing. */ + /* */ + /* adx :: The horizontal offset of the accent. */ + /* */ + /* ady :: The vertical offset of the accent. */ + /* */ + /* bchar :: The base character's StandardEncoding charcode. */ + /* */ + /* achar :: The accent character's StandardEncoding charcode. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + t1operator_seac( T1_Decoder decoder, + FT_Pos asb, + FT_Pos adx, + FT_Pos ady, + FT_Int bchar, + FT_Int achar ) + { + FT_Error error; + FT_Int bchar_index, achar_index; +#if 0 + FT_Int n_base_points; + FT_Outline* base = decoder->builder.base; +#endif + FT_Vector left_bearing, advance; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + T1_Face face = (T1_Face)decoder->builder.face; +#endif + + + if ( decoder->seac ) + { + FT_ERROR(( "t1operator_seac: invalid nested seac\n" )); + return FT_THROW( Syntax_Error ); + } + + if ( decoder->builder.metrics_only ) + { + FT_ERROR(( "t1operator_seac: unexpected seac\n" )); + return FT_THROW( Syntax_Error ); + } + + /* seac weirdness */ + adx += decoder->builder.left_bearing.x; + + /* `glyph_names' is set to 0 for CID fonts which do not */ + /* include an encoding. How can we deal with these? */ +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( decoder->glyph_names == 0 && + !face->root.internal->incremental_interface ) +#else + if ( decoder->glyph_names == 0 ) +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + FT_ERROR(( "t1operator_seac:" + " glyph names table not available in this font\n" )); + return FT_THROW( Syntax_Error ); + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( face->root.internal->incremental_interface ) + { + /* the caller must handle the font encoding also */ + bchar_index = bchar; + achar_index = achar; + } + else +#endif + { + bchar_index = t1_lookup_glyph_by_stdcharcode( decoder, bchar ); + achar_index = t1_lookup_glyph_by_stdcharcode( decoder, achar ); + } + + if ( bchar_index < 0 || achar_index < 0 ) + { + FT_ERROR(( "t1operator_seac:" + " invalid seac character code arguments\n" )); + return FT_THROW( Syntax_Error ); + } + + /* if we are trying to load a composite glyph, do not load the */ + /* accent character and return the array of subglyphs. */ + if ( decoder->builder.no_recurse ) + { + FT_GlyphSlot glyph = (FT_GlyphSlot)decoder->builder.glyph; + FT_GlyphLoader loader = glyph->internal->loader; + FT_SubGlyph subg; + + + /* reallocate subglyph array if necessary */ + error = FT_GlyphLoader_CheckSubGlyphs( loader, 2 ); + if ( error ) + goto Exit; + + subg = loader->current.subglyphs; + + /* subglyph 0 = base character */ + subg->index = bchar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES | + FT_SUBGLYPH_FLAG_USE_MY_METRICS; + subg->arg1 = 0; + subg->arg2 = 0; + subg++; + + /* subglyph 1 = accent character */ + subg->index = achar_index; + subg->flags = FT_SUBGLYPH_FLAG_ARGS_ARE_XY_VALUES; + subg->arg1 = (FT_Int)FIXED_TO_INT( adx - asb ); + subg->arg2 = (FT_Int)FIXED_TO_INT( ady ); + + /* set up remaining glyph fields */ + glyph->num_subglyphs = 2; + glyph->subglyphs = loader->base.subglyphs; + glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + loader->current.num_subglyphs = 2; + goto Exit; + } + + /* First load `bchar' in builder */ + /* now load the unscaled outline */ + + FT_GlyphLoader_Prepare( decoder->builder.loader ); /* prepare loader */ + + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = t1_decoder_parse_glyph( decoder, (FT_UInt)bchar_index ); + decoder->seac = FALSE; + if ( error ) + goto Exit; + + /* save the left bearing and width of the base character */ + /* as they will be erased by the next load. */ + + left_bearing = decoder->builder.left_bearing; + advance = decoder->builder.advance; + + decoder->builder.left_bearing.x = 0; + decoder->builder.left_bearing.y = 0; + + decoder->builder.pos_x = adx - asb; + decoder->builder.pos_y = ady; + + /* Now load `achar' on top of */ + /* the base outline */ + + /* the seac operator must not be nested */ + decoder->seac = TRUE; + error = t1_decoder_parse_glyph( decoder, (FT_UInt)achar_index ); + decoder->seac = FALSE; + if ( error ) + goto Exit; + + /* restore the left side bearing and */ + /* advance width of the base character */ + + decoder->builder.left_bearing = left_bearing; + decoder->builder.advance = advance; + + decoder->builder.pos_x = 0; + decoder->builder.pos_y = 0; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* t1_decoder_parse_charstrings */ + /* */ + /* */ + /* Parses a given Type 1 charstrings program. */ + /* */ + /* */ + /* decoder :: The current Type 1 decoder. */ + /* */ + /* charstring_base :: The base address of the charstring stream. */ + /* */ + /* charstring_len :: The length in bytes of the charstring stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_parse_charstrings( T1_Decoder decoder, + FT_Byte* charstring_base, + FT_UInt charstring_len ) + { + FT_Error error; + T1_Decoder_Zone zone; + FT_Byte* ip; + FT_Byte* limit; + T1_Builder builder = &decoder->builder; + FT_Pos x, y, orig_x, orig_y; + FT_Int known_othersubr_result_cnt = 0; + FT_Int unknown_othersubr_result_cnt = 0; + FT_Bool large_int; + FT_Fixed seed; + + T1_Hints_Funcs hinter; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Bool bol = TRUE; +#endif + + + /* compute random seed from stack address of parameter */ + seed = (FT_Fixed)( ( (FT_Offset)(char*)&seed ^ + (FT_Offset)(char*)&decoder ^ + (FT_Offset)(char*)&charstring_base ) & + FT_ULONG_MAX ); + seed = ( seed ^ ( seed >> 10 ) ^ ( seed >> 20 ) ) & 0xFFFFL; + if ( seed == 0 ) + seed = 0x7384; + + /* First of all, initialize the decoder */ + decoder->top = decoder->stack; + decoder->zone = decoder->zones; + zone = decoder->zones; + + builder->parse_state = T1_Parse_Start; + + hinter = (T1_Hints_Funcs)builder->hints_funcs; + + /* a font that reads BuildCharArray without setting */ + /* its values first is buggy, but ... */ + FT_ASSERT( ( decoder->len_buildchar == 0 ) == + ( decoder->buildchar == NULL ) ); + + if ( decoder->buildchar && decoder->len_buildchar > 0 ) + FT_ARRAY_ZERO( decoder->buildchar, decoder->len_buildchar ); + + FT_TRACE4(( "\n" + "Start charstring\n" )); + + zone->base = charstring_base; + limit = zone->limit = charstring_base + charstring_len; + ip = zone->cursor = zone->base; + + error = FT_Err_Ok; + + x = orig_x = builder->pos_x; + y = orig_y = builder->pos_y; + + /* begin hints recording session, if any */ + if ( hinter ) + hinter->open( hinter->hints ); + + large_int = FALSE; + + /* now, execute loop */ + while ( ip < limit ) + { + FT_Long* top = decoder->top; + T1_Operator op = op_none; + FT_Int32 value = 0; + + + FT_ASSERT( known_othersubr_result_cnt == 0 || + unknown_othersubr_result_cnt == 0 ); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( bol ) + { + FT_TRACE5(( " (%d)", decoder->top - decoder->stack )); + bol = FALSE; + } +#endif + + /*********************************************************************/ + /* */ + /* Decode operator or operand */ + /* */ + /* */ + + /* first of all, decompress operator or value */ + switch ( *ip++ ) + { + case 1: + op = op_hstem; + break; + + case 3: + op = op_vstem; + break; + case 4: + op = op_vmoveto; + break; + case 5: + op = op_rlineto; + break; + case 6: + op = op_hlineto; + break; + case 7: + op = op_vlineto; + break; + case 8: + op = op_rrcurveto; + break; + case 9: + op = op_closepath; + break; + case 10: + op = op_callsubr; + break; + case 11: + op = op_return; + break; + + case 13: + op = op_hsbw; + break; + case 14: + op = op_endchar; + break; + + case 15: /* undocumented, obsolete operator */ + op = op_unknown15; + break; + + case 21: + op = op_rmoveto; + break; + case 22: + op = op_hmoveto; + break; + + case 30: + op = op_vhcurveto; + break; + case 31: + op = op_hvcurveto; + break; + + case 12: + if ( ip >= limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid escape (12+EOF)\n" )); + goto Syntax_Error; + } + + switch ( *ip++ ) + { + case 0: + op = op_dotsection; + break; + case 1: + op = op_vstem3; + break; + case 2: + op = op_hstem3; + break; + case 6: + op = op_seac; + break; + case 7: + op = op_sbw; + break; + case 12: + op = op_div; + break; + case 16: + op = op_callothersubr; + break; + case 17: + op = op_pop; + break; + case 33: + op = op_setcurrentpoint; + break; + + default: + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid escape (12+%d)\n", + ip[-1] )); + goto Syntax_Error; + } + break; + + case 255: /* four bytes integer */ + if ( ip + 4 > limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + value = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) | + ( (FT_UInt32)ip[1] << 16 ) | + ( (FT_UInt32)ip[2] << 8 ) | + (FT_UInt32)ip[3] ); + ip += 4; + + /* According to the specification, values > 32000 or < -32000 must */ + /* be followed by a `div' operator to make the result be in the */ + /* range [-32000;32000]. We expect that the second argument of */ + /* `div' is not a large number. Additionally, we don't handle */ + /* stuff like ` div div' or */ + /* div div'. This is probably not allowed */ + /* anyway. */ + if ( value > 32000 || value < -32000 ) + { + if ( large_int ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " no `div' after large integer\n" )); + } + else + large_int = TRUE; + } + else + { + if ( !large_int ) + value = (FT_Int32)( (FT_UInt32)value << 16 ); + } + + break; + + default: + if ( ip[-1] >= 32 ) + { + if ( ip[-1] < 247 ) + value = (FT_Int32)ip[-1] - 139; + else + { + if ( ++ip > limit ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + if ( ip[-2] < 251 ) + value = ( ( ip[-2] - 247 ) * 256 ) + ip[-1] + 108; + else + value = -( ( ( ip[-2] - 251 ) * 256 ) + ip[-1] + 108 ); + } + + if ( !large_int ) + value = (FT_Int32)( (FT_UInt32)value << 16 ); + } + else + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid byte (%d)\n", ip[-1] )); + goto Syntax_Error; + } + } + + if ( unknown_othersubr_result_cnt > 0 ) + { + switch ( op ) + { + case op_callsubr: + case op_return: + case op_none: + case op_pop: + break; + + default: + /* all operands have been transferred by previous pops */ + unknown_othersubr_result_cnt = 0; + break; + } + } + + if ( large_int && !( op == op_none || op == op_div ) ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " no `div' after large integer\n" )); + + large_int = FALSE; + } + + /*********************************************************************/ + /* */ + /* Push value on stack, or process operator */ + /* */ + /* */ + if ( op == op_none ) + { + if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS ) + { + FT_ERROR(( "t1_decoder_parse_charstrings: stack overflow\n" )); + goto Syntax_Error; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( large_int ) + FT_TRACE4(( " %d", value )); + else + FT_TRACE4(( " %d", value / 65536 )); +#endif + + *top++ = value; + decoder->top = top; + } + else if ( op == op_callothersubr ) /* callothersubr */ + { + FT_Int subr_no; + FT_Int arg_cnt; + + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " callothersubr\n" )); + bol = TRUE; +#endif + + if ( top - decoder->stack < 2 ) + goto Stack_Underflow; + + top -= 2; + + subr_no = Fix2Int( top[1] ); + arg_cnt = Fix2Int( top[0] ); + + /***********************************************************/ + /* */ + /* remove all operands to callothersubr from the stack */ + /* */ + /* for handled othersubrs, where we know the number of */ + /* arguments, we increase the stack by the value of */ + /* known_othersubr_result_cnt */ + /* */ + /* for unhandled othersubrs the following pops adjust the */ + /* stack pointer as necessary */ + + if ( arg_cnt > top - decoder->stack ) + goto Stack_Underflow; + + top -= arg_cnt; + + known_othersubr_result_cnt = 0; + unknown_othersubr_result_cnt = 0; + + /* XXX TODO: The checks to `arg_count == ' */ + /* might not be correct; an othersubr expects a certain */ + /* number of operands on the PostScript stack (as opposed */ + /* to the T1 stack) but it doesn't have to put them there */ + /* by itself; previous othersubrs might have left the */ + /* operands there if they were not followed by an */ + /* appropriate number of pops */ + /* */ + /* On the other hand, Adobe Reader 7.0.8 for Linux doesn't */ + /* accept a font that contains charstrings like */ + /* */ + /* 100 200 2 20 callothersubr */ + /* 300 1 20 callothersubr pop */ + /* */ + /* Perhaps this is the reason why BuildCharArray exists. */ + + switch ( subr_no ) + { + case 0: /* end flex feature */ + if ( arg_cnt != 3 ) + goto Unexpected_OtherSubr; + + if ( !decoder->flex_state || + decoder->num_flex_vectors != 7 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected flex end\n" )); + goto Syntax_Error; + } + + /* the two `results' are popped by the following setcurrentpoint */ + top[0] = x; + top[1] = y; + known_othersubr_result_cnt = 2; + break; + + case 1: /* start flex feature */ + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) || + FT_SET_ERROR( t1_builder_check_points( builder, 6 ) ) ) + goto Fail; + + decoder->flex_state = 1; + decoder->num_flex_vectors = 0; + break; + + case 2: /* add flex vectors */ + { + FT_Int idx; + + + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + if ( !decoder->flex_state ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " missing flex start\n" )); + goto Syntax_Error; + } + + /* note that we should not add a point for index 0; */ + /* this will move our current position to the flex */ + /* point without adding any point to the outline */ + idx = decoder->num_flex_vectors++; + if ( idx > 0 && idx < 7 ) + { + /* in malformed fonts it is possible to have other */ + /* opcodes in the middle of a flex (which don't */ + /* increase `num_flex_vectors'); we thus have to */ + /* check whether we can add a point */ + if ( FT_SET_ERROR( t1_builder_check_points( builder, 1 ) ) ) + goto Syntax_Error; + + t1_builder_add_point( builder, + x, + y, + (FT_Byte)( idx == 3 || idx == 6 ) ); + } + } + break; + + case 3: /* change hints */ + if ( arg_cnt != 1 ) + goto Unexpected_OtherSubr; + + known_othersubr_result_cnt = 1; + + if ( hinter ) + hinter->reset( hinter->hints, + (FT_UInt)builder->current->n_points ); + break; + + case 12: + case 13: + /* counter control hints, clear stack */ + top = decoder->stack; + break; + + case 14: + case 15: + case 16: + case 17: + case 18: /* multiple masters */ + { + PS_Blend blend = decoder->blend; + FT_UInt num_points, nn, mm; + FT_Long* delta; + FT_Long* values; + + + if ( !blend ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected multiple masters operator\n" )); + goto Syntax_Error; + } + + num_points = (FT_UInt)subr_no - 13 + ( subr_no == 18 ); + if ( arg_cnt != (FT_Int)( num_points * blend->num_designs ) ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " incorrect number of multiple masters arguments\n" )); + goto Syntax_Error; + } + + /* We want to compute */ + /* */ + /* a0*w0 + a1*w1 + ... + ak*wk */ + /* */ + /* but we only have a0, a1-a0, a2-a0, ..., ak-a0. */ + /* */ + /* However, given that w0 + w1 + ... + wk == 1, we can */ + /* rewrite it easily as */ + /* */ + /* a0 + (a1-a0)*w1 + (a2-a0)*w2 + ... + (ak-a0)*wk */ + /* */ + /* where k == num_designs-1. */ + /* */ + /* I guess that's why it's written in this `compact' */ + /* form. */ + /* */ + delta = top + num_points; + values = top; + for ( nn = 0; nn < num_points; nn++ ) + { + FT_Long tmp = values[0]; + + + for ( mm = 1; mm < blend->num_designs; mm++ ) + tmp = ADD_LONG( tmp, + FT_MulFix( *delta++, + blend->weight_vector[mm] ) ); + + *values++ = tmp; + } + + known_othersubr_result_cnt = (FT_Int)num_points; + break; + } + + case 19: + /* 1 19 callothersubr */ + /* => replace elements starting from index cvi( ) */ + /* of BuildCharArray with WeightVector */ + { + FT_Int idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 1 || !blend ) + goto Unexpected_OtherSubr; + + idx = Fix2Int( top[0] ); + + if ( idx < 0 || + (FT_UInt)idx + blend->num_designs > decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + ft_memcpy( &decoder->buildchar[idx], + blend->weight_vector, + blend->num_designs * + sizeof ( blend->weight_vector[0] ) ); + } + break; + + case 20: + /* 2 20 callothersubr pop */ + /* ==> push + onto T1 stack */ + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + top[0] = ADD_LONG( top[0], top[1] ); + + known_othersubr_result_cnt = 1; + break; + + case 21: + /* 2 21 callothersubr pop */ + /* ==> push - onto T1 stack */ + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + top[0] = SUB_LONG( top[0], top[1] ); + + known_othersubr_result_cnt = 1; + break; + + case 22: + /* 2 22 callothersubr pop */ + /* ==> push * onto T1 stack */ + if ( arg_cnt != 2 ) + goto Unexpected_OtherSubr; + + top[0] = FT_MulFix( top[0], top[1] ); + + known_othersubr_result_cnt = 1; + break; + + case 23: + /* 2 23 callothersubr pop */ + /* ==> push / onto T1 stack */ + if ( arg_cnt != 2 || top[1] == 0 ) + goto Unexpected_OtherSubr; + + top[0] = FT_DivFix( top[0], top[1] ); + + known_othersubr_result_cnt = 1; + break; + + case 24: + /* 2 24 callothersubr */ + /* ==> set BuildCharArray[cvi( )] = */ + { + FT_Int idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 2 || !blend ) + goto Unexpected_OtherSubr; + + idx = Fix2Int( top[1] ); + + if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + decoder->buildchar[idx] = top[0]; + } + break; + + case 25: + /* 1 25 callothersubr pop */ + /* ==> push BuildCharArray[cvi( idx )] */ + /* onto T1 stack */ + { + FT_Int idx; + PS_Blend blend = decoder->blend; + + + if ( arg_cnt != 1 || !blend ) + goto Unexpected_OtherSubr; + + idx = Fix2Int( top[0] ); + + if ( idx < 0 || (FT_UInt) idx >= decoder->len_buildchar ) + goto Unexpected_OtherSubr; + + top[0] = decoder->buildchar[idx]; + } + + known_othersubr_result_cnt = 1; + break; + +#if 0 + case 26: + /* mark ==> set BuildCharArray[cvi( )] = , */ + /* leave mark on T1 stack */ + /* ==> set BuildCharArray[cvi( )] = */ + XXX which routine has left its mark on the (PostScript) stack?; + break; +#endif + + case 27: + /* 4 27 callothersubr pop */ + /* ==> push onto T1 stack if <= , */ + /* otherwise push */ + if ( arg_cnt != 4 ) + goto Unexpected_OtherSubr; + + if ( top[2] > top[3] ) + top[0] = top[1]; + + known_othersubr_result_cnt = 1; + break; + + case 28: + /* 0 28 callothersubr pop */ + /* => push random value from interval [0, 1) onto stack */ + if ( arg_cnt != 0 ) + goto Unexpected_OtherSubr; + + { + FT_Fixed Rand; + + + Rand = seed; + if ( Rand >= 0x8000L ) + Rand++; + + top[0] = Rand; + + seed = FT_MulFix( seed, 0x10000L - seed ); + if ( seed == 0 ) + seed += 0x2873; + } + + known_othersubr_result_cnt = 1; + break; + + default: + if ( arg_cnt >= 0 && subr_no >= 0 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unknown othersubr [%d %d], wish me luck\n", + arg_cnt, subr_no )); + unknown_othersubr_result_cnt = arg_cnt; + break; + } + /* fall through */ + + Unexpected_OtherSubr: + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid othersubr [%d %d]\n", arg_cnt, subr_no )); + goto Syntax_Error; + } + + top += known_othersubr_result_cnt; + + decoder->top = top; + } + else /* general operator */ + { + FT_Int num_args = t1_args_count[op]; + + + FT_ASSERT( num_args >= 0 ); + + if ( top - decoder->stack < num_args ) + goto Stack_Underflow; + + /* XXX Operators usually take their operands from the */ + /* bottom of the stack, i.e., the operands are */ + /* decoder->stack[0], ..., decoder->stack[num_args - 1]; */ + /* only div, callsubr, and callothersubr are different. */ + /* In practice it doesn't matter (?). */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + switch ( op ) + { + case op_callsubr: + case op_div: + case op_callothersubr: + case op_pop: + case op_return: + break; + + default: + if ( top - decoder->stack != num_args ) + FT_TRACE0(( "t1_decoder_parse_charstrings:" + " too much operands on the stack" + " (seen %d, expected %d)\n", + top - decoder->stack, num_args )); + break; + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + top -= num_args; + + switch ( op ) + { + case op_endchar: + FT_TRACE4(( " endchar\n" )); + + t1_builder_close_contour( builder ); + + /* close hints recording session */ + if ( hinter ) + { + if ( hinter->close( hinter->hints, + (FT_UInt)builder->current->n_points ) ) + goto Syntax_Error; + + /* apply hints to the loaded glyph outline now */ + error = hinter->apply( hinter->hints, + builder->current, + (PSH_Globals)builder->hints_globals, + decoder->hint_mode ); + if ( error ) + goto Fail; + } + + /* add current outline to the glyph slot */ + FT_GlyphLoader_Add( builder->loader ); + + /* the compiler should optimize away this empty loop but ... */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + if ( decoder->len_buildchar > 0 ) + { + FT_UInt i; + + + FT_TRACE4(( "BuildCharArray = [ " )); + + for ( i = 0; i < decoder->len_buildchar; i++ ) + FT_TRACE4(( "%d ", decoder->buildchar[i] )); + + FT_TRACE4(( "]\n" )); + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + FT_TRACE4(( "\n" )); + + /* return now! */ + return FT_Err_Ok; + + case op_hsbw: + FT_TRACE4(( " hsbw" )); + + builder->parse_state = T1_Parse_Have_Width; + + builder->left_bearing.x = ADD_LONG( builder->left_bearing.x, + top[0] ); + + builder->advance.x = top[1]; + builder->advance.y = 0; + + orig_x = x = ADD_LONG( builder->pos_x, top[0] ); + orig_y = y = builder->pos_y; + + FT_UNUSED( orig_y ); + + /* the `metrics_only' indicates that we only want to compute */ + /* the glyph's metrics (lsb + advance width), not load the */ + /* rest of it; so exit immediately */ + if ( builder->metrics_only ) + return FT_Err_Ok; + + break; + + case op_seac: + return t1operator_seac( decoder, + top[0], + top[1], + top[2], + Fix2Int( top[3] ), + Fix2Int( top[4] ) ); + + case op_sbw: + FT_TRACE4(( " sbw" )); + + builder->parse_state = T1_Parse_Have_Width; + + builder->left_bearing.x = ADD_LONG( builder->left_bearing.x, + top[0] ); + builder->left_bearing.y = ADD_LONG( builder->left_bearing.y, + top[1] ); + + builder->advance.x = top[2]; + builder->advance.y = top[3]; + + x = ADD_LONG( builder->pos_x, top[0] ); + y = ADD_LONG( builder->pos_y, top[1] ); + + /* the `metrics_only' indicates that we only want to compute */ + /* the glyph's metrics (lsb + advance width), not load the */ + /* rest of it; so exit immediately */ + if ( builder->metrics_only ) + return FT_Err_Ok; + + break; + + case op_closepath: + FT_TRACE4(( " closepath" )); + + /* if there is no path, `closepath' is a no-op */ + if ( builder->parse_state == T1_Parse_Have_Path || + builder->parse_state == T1_Parse_Have_Moveto ) + t1_builder_close_contour( builder ); + + builder->parse_state = T1_Parse_Have_Width; + break; + + case op_hlineto: + FT_TRACE4(( " hlineto" )); + + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) ) + goto Fail; + + x = ADD_LONG( x, top[0] ); + goto Add_Line; + + case op_hmoveto: + FT_TRACE4(( " hmoveto" )); + + x = ADD_LONG( x, top[0] ); + + if ( !decoder->flex_state ) + { + if ( builder->parse_state == T1_Parse_Start ) + goto Syntax_Error; + builder->parse_state = T1_Parse_Have_Moveto; + } + break; + + case op_hvcurveto: + FT_TRACE4(( " hvcurveto" )); + + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) || + FT_SET_ERROR( t1_builder_check_points( builder, 3 ) ) ) + goto Fail; + + x = ADD_LONG( x, top[0] ); + t1_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, top[1] ); + y = ADD_LONG( y, top[2] ); + t1_builder_add_point( builder, x, y, 0 ); + + y = ADD_LONG( y, top[3] ); + t1_builder_add_point( builder, x, y, 1 ); + break; + + case op_rlineto: + FT_TRACE4(( " rlineto" )); + + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) ) + goto Fail; + + x = ADD_LONG( x, top[0] ); + y = ADD_LONG( y, top[1] ); + + Add_Line: + if ( FT_SET_ERROR( t1_builder_add_point1( builder, x, y ) ) ) + goto Fail; + break; + + case op_rmoveto: + FT_TRACE4(( " rmoveto" )); + + x = ADD_LONG( x, top[0] ); + y = ADD_LONG( y, top[1] ); + + if ( !decoder->flex_state ) + { + if ( builder->parse_state == T1_Parse_Start ) + goto Syntax_Error; + builder->parse_state = T1_Parse_Have_Moveto; + } + break; + + case op_rrcurveto: + FT_TRACE4(( " rrcurveto" )); + + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) || + FT_SET_ERROR( t1_builder_check_points( builder, 3 ) ) ) + goto Fail; + + x = ADD_LONG( x, top[0] ); + y = ADD_LONG( y, top[1] ); + t1_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, top[2] ); + y = ADD_LONG( y, top[3] ); + t1_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, top[4] ); + y = ADD_LONG( y, top[5] ); + t1_builder_add_point( builder, x, y, 1 ); + break; + + case op_vhcurveto: + FT_TRACE4(( " vhcurveto" )); + + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) || + FT_SET_ERROR( t1_builder_check_points( builder, 3 ) ) ) + goto Fail; + + y = ADD_LONG( y, top[0] ); + t1_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, top[1] ); + y = ADD_LONG( y, top[2] ); + t1_builder_add_point( builder, x, y, 0 ); + + x = ADD_LONG( x, top[3] ); + t1_builder_add_point( builder, x, y, 1 ); + break; + + case op_vlineto: + FT_TRACE4(( " vlineto" )); + + if ( FT_SET_ERROR( t1_builder_start_point( builder, x, y ) ) ) + goto Fail; + + y = ADD_LONG( y, top[0] ); + goto Add_Line; + + case op_vmoveto: + FT_TRACE4(( " vmoveto" )); + + y = ADD_LONG( y, top[0] ); + + if ( !decoder->flex_state ) + { + if ( builder->parse_state == T1_Parse_Start ) + goto Syntax_Error; + builder->parse_state = T1_Parse_Have_Moveto; + } + break; + + case op_div: + FT_TRACE4(( " div" )); + + /* if `large_int' is set, we divide unscaled numbers; */ + /* otherwise, we divide numbers in 16.16 format -- */ + /* in both cases, it is the same operation */ + *top = FT_DivFix( top[0], top[1] ); + top++; + + large_int = FALSE; + break; + + case op_callsubr: + { + FT_Int idx; + + + FT_TRACE4(( " callsubr" )); + + idx = Fix2Int( top[0] ); + + if ( decoder->subrs_hash ) + { + size_t* val = ft_hash_num_lookup( idx, + decoder->subrs_hash ); + + + if ( val ) + idx = *val; + else + idx = -1; + } + + if ( idx < 0 || idx >= decoder->num_subrs ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invalid subrs index\n" )); + goto Syntax_Error; + } + + if ( zone - decoder->zones >= T1_MAX_SUBRS_CALLS ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " too many nested subrs\n" )); + goto Syntax_Error; + } + + zone->cursor = ip; /* save current instruction pointer */ + + zone++; + + /* The Type 1 driver stores subroutines without the seed bytes. */ + /* The CID driver stores subroutines with seed bytes. This */ + /* case is taken care of when decoder->subrs_len == 0. */ + zone->base = decoder->subrs[idx]; + + if ( decoder->subrs_len ) + zone->limit = zone->base + decoder->subrs_len[idx]; + else + { + /* We are using subroutines from a CID font. We must adjust */ + /* for the seed bytes. */ + zone->base += ( decoder->lenIV >= 0 ? decoder->lenIV : 0 ); + zone->limit = decoder->subrs[idx + 1]; + } + + zone->cursor = zone->base; + + if ( !zone->base ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " invoking empty subrs\n" )); + goto Syntax_Error; + } + + decoder->zone = zone; + ip = zone->base; + limit = zone->limit; + break; + } + + case op_pop: + FT_TRACE4(( " pop" )); + + if ( known_othersubr_result_cnt > 0 ) + { + known_othersubr_result_cnt--; + /* ignore, we pushed the operands ourselves */ + break; + } + + if ( unknown_othersubr_result_cnt == 0 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " no more operands for othersubr\n" )); + goto Syntax_Error; + } + + unknown_othersubr_result_cnt--; + top++; /* `push' the operand to callothersubr onto the stack */ + break; + + case op_return: + FT_TRACE4(( " return" )); + + if ( zone <= decoder->zones ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected return\n" )); + goto Syntax_Error; + } + + zone--; + ip = zone->cursor; + limit = zone->limit; + decoder->zone = zone; + break; + + case op_dotsection: + FT_TRACE4(( " dotsection" )); + + break; + + case op_hstem: + FT_TRACE4(( " hstem" )); + + /* record horizontal hint */ + if ( hinter ) + { + /* top[0] += builder->left_bearing.y; */ + hinter->stem( hinter->hints, 1, top ); + } + break; + + case op_hstem3: + FT_TRACE4(( " hstem3" )); + + /* record horizontal counter-controlled hints */ + if ( hinter ) + hinter->stem3( hinter->hints, 1, top ); + break; + + case op_vstem: + FT_TRACE4(( " vstem" )); + + /* record vertical hint */ + if ( hinter ) + { + top[0] = ADD_LONG( top[0], orig_x ); + hinter->stem( hinter->hints, 0, top ); + } + break; + + case op_vstem3: + FT_TRACE4(( " vstem3" )); + + /* record vertical counter-controlled hints */ + if ( hinter ) + { + FT_Pos dx = orig_x; + + + top[0] = ADD_LONG( top[0], dx ); + top[2] = ADD_LONG( top[2], dx ); + top[4] = ADD_LONG( top[4], dx ); + hinter->stem3( hinter->hints, 0, top ); + } + break; + + case op_setcurrentpoint: + FT_TRACE4(( " setcurrentpoint" )); + + /* From the T1 specification, section 6.4: */ + /* */ + /* The setcurrentpoint command is used only in */ + /* conjunction with results from OtherSubrs procedures. */ + + /* known_othersubr_result_cnt != 0 is already handled */ + /* above. */ + + /* Note, however, that both Ghostscript and Adobe */ + /* Distiller handle this situation by silently ignoring */ + /* the inappropriate `setcurrentpoint' instruction. So */ + /* we do the same. */ +#if 0 + + if ( decoder->flex_state != 1 ) + { + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unexpected `setcurrentpoint'\n" )); + goto Syntax_Error; + } + else + ... +#endif + + x = top[0]; + y = top[1]; + decoder->flex_state = 0; + break; + + case op_unknown15: + FT_TRACE4(( " opcode_15" )); + /* nothing to do except to pop the two arguments */ + break; + + default: + FT_ERROR(( "t1_decoder_parse_charstrings:" + " unhandled opcode %d\n", op )); + goto Syntax_Error; + } + + /* XXX Operators usually clear the operand stack; */ + /* only div, callsubr, callothersubr, pop, and */ + /* return are different. */ + /* In practice it doesn't matter (?). */ + + decoder->top = top; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( "\n" )); + bol = TRUE; +#endif + + } /* general operator processing */ + + } /* while ip < limit */ + + FT_TRACE4(( "..end..\n\n" )); + + Fail: + return error; + + Syntax_Error: + return FT_THROW( Syntax_Error ); + + Stack_Underflow: + return FT_THROW( Stack_Underflow ); + } + +#else /* T1_CONFIG_OPTION_OLD_ENGINE */ + + /*************************************************************************/ + /* */ + /* */ + /* t1_decoder_parse_metrics */ + /* */ + /* */ + /* Parses a given Type 1 charstrings program to extract width */ + /* */ + /* */ + /* decoder :: The current Type 1 decoder. */ + /* */ + /* charstring_base :: The base address of the charstring stream. */ + /* */ + /* charstring_len :: The length in bytes of the charstring stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_parse_metrics( T1_Decoder decoder, + FT_Byte* charstring_base, + FT_UInt charstring_len ) + { + T1_Decoder_Zone zone; + FT_Byte* ip; + FT_Byte* limit; + T1_Builder builder = &decoder->builder; + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Bool bol = TRUE; +#endif + + + /* First of all, initialize the decoder */ + decoder->top = decoder->stack; + decoder->zone = decoder->zones; + zone = decoder->zones; + + builder->parse_state = T1_Parse_Start; + + FT_TRACE4(( "\n" + "Start charstring: get width\n" )); + + zone->base = charstring_base; + limit = zone->limit = charstring_base + charstring_len; + ip = zone->cursor = zone->base; + + /* now, execute loop */ + while ( ip < limit ) + { + FT_Long* top = decoder->top; + T1_Operator op = op_none; + FT_Int32 value = 0; + + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( bol ) + { + FT_TRACE5(( " (%d)", decoder->top - decoder->stack )); + bol = FALSE; + } +#endif + + /*********************************************************************/ + /* */ + /* Decode operator or operand */ + /* */ + /* */ + + /* first of all, decompress operator or value */ + switch ( *ip++ ) + { + case 1: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: + case 9: + case 10: + case 11: + case 14: + case 15: + case 21: + case 22: + case 30: + case 31: + goto No_Width; + + case 13: + op = op_hsbw; + break; + + case 12: + if ( ip >= limit ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " invalid escape (12+EOF)\n" )); + goto Syntax_Error; + } + + switch ( *ip++ ) + { + case 7: + op = op_sbw; + break; + + default: + goto No_Width; + } + break; + + case 255: /* four bytes integer */ + if ( ip + 4 > limit ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + value = (FT_Int32)( ( (FT_UInt32)ip[0] << 24 ) | + ( (FT_UInt32)ip[1] << 16 ) | + ( (FT_UInt32)ip[2] << 8 ) | + (FT_UInt32)ip[3] ); + ip += 4; + + /* According to the specification, values > 32000 or < -32000 must */ + /* be followed by a `div' operator to make the result be in the */ + /* range [-32000;32000]. We expect that the second argument of */ + /* `div' is not a large number. Additionally, we don't handle */ + /* stuff like ` div div' or */ + /* div div'. This is probably not allowed */ + /* anyway. */ + if ( value > 32000 || value < -32000 ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " large integer found for width\n" )); + goto Syntax_Error; + } + else + { + value = (FT_Int32)( (FT_UInt32)value << 16 ); + } + + break; + + default: + if ( ip[-1] >= 32 ) + { + if ( ip[-1] < 247 ) + value = (FT_Int32)ip[-1] - 139; + else + { + if ( ++ip > limit ) + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " unexpected EOF in integer\n" )); + goto Syntax_Error; + } + + if ( ip[-2] < 251 ) + value = ( ( ip[-2] - 247 ) * 256 ) + ip[-1] + 108; + else + value = -( ( ( ip[-2] - 251 ) * 256 ) + ip[-1] + 108 ); + } + + value = (FT_Int32)( (FT_UInt32)value << 16 ); + } + else + { + FT_ERROR(( "t1_decoder_parse_metrics:" + " invalid byte (%d)\n", ip[-1] )); + goto Syntax_Error; + } + } + + /*********************************************************************/ + /* */ + /* Push value on stack, or process operator */ + /* */ + /* */ + if ( op == op_none ) + { + if ( top - decoder->stack >= T1_MAX_CHARSTRINGS_OPERANDS ) + { + FT_ERROR(( "t1_decoder_parse_metrics: stack overflow\n" )); + goto Syntax_Error; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + FT_TRACE4(( " %d", value / 65536 )); +#endif + + *top++ = value; + decoder->top = top; + } + else /* general operator */ + { + FT_Int num_args = t1_args_count[op]; + + + FT_ASSERT( num_args >= 0 ); + + if ( top - decoder->stack < num_args ) + goto Stack_Underflow; + +#ifdef FT_DEBUG_LEVEL_TRACE + + if ( top - decoder->stack != num_args ) + FT_TRACE0(( "t1_decoder_parse_metrics:" + " too much operands on the stack" + " (seen %d, expected %d)\n", + top - decoder->stack, num_args )); + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + top -= num_args; + + switch ( op ) + { + case op_hsbw: + FT_TRACE4(( " hsbw" )); + + builder->parse_state = T1_Parse_Have_Width; + + builder->left_bearing.x = ADD_LONG( builder->left_bearing.x, + top[0] ); + + builder->advance.x = top[1]; + builder->advance.y = 0; + + /* we only want to compute the glyph's metrics */ + /* (lsb + advance width), not load the rest of */ + /* it; so exit immediately */ + return FT_Err_Ok; + + case op_sbw: + FT_TRACE4(( " sbw" )); + + builder->parse_state = T1_Parse_Have_Width; + + builder->left_bearing.x = ADD_LONG( builder->left_bearing.x, + top[0] ); + builder->left_bearing.y = ADD_LONG( builder->left_bearing.y, + top[1] ); + + builder->advance.x = top[2]; + builder->advance.y = top[3]; + + /* we only want to compute the glyph's metrics */ + /* (lsb + advance width), not load the rest of */ + /* it; so exit immediately */ + return FT_Err_Ok; + + default: + FT_ERROR(( "t1_decoder_parse_metrics:" + " unhandled opcode %d\n", op )); + goto Syntax_Error; + } + + } /* general operator processing */ + + } /* while ip < limit */ + + FT_TRACE4(( "..end..\n\n" )); + + No_Width: + FT_ERROR(( "t1_decoder_parse_metrics:" + " no width, found op %d instead\n", + ip[-1] )); + Syntax_Error: + return FT_THROW( Syntax_Error ); + + Stack_Underflow: + return FT_THROW( Stack_Underflow ); + } +#endif /* T1_CONFIG_OPTION_OLD_ENGINE */ + + + /* initialize T1 decoder */ + FT_LOCAL_DEF( FT_Error ) + t1_decoder_init( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback parse_callback ) + { + FT_ZERO( decoder ); + + /* retrieve PSNames interface from list of current modules */ + { + FT_Service_PsCMaps psnames; + + + FT_FACE_FIND_GLOBAL_SERVICE( face, psnames, POSTSCRIPT_CMAPS ); + if ( !psnames ) + { + FT_ERROR(( "t1_decoder_init:" + " the `psnames' module is not available\n" )); + return FT_THROW( Unimplemented_Feature ); + } + + decoder->psnames = psnames; + } + + t1_builder_init( &decoder->builder, face, size, slot, hinting ); + + /* decoder->buildchar and decoder->len_buildchar have to be */ + /* initialized by the caller since we cannot know the length */ + /* of the BuildCharArray */ + + decoder->num_glyphs = (FT_UInt)face->num_glyphs; + decoder->glyph_names = glyph_names; + decoder->hint_mode = hint_mode; + decoder->blend = blend; + decoder->parse_callback = parse_callback; + + decoder->funcs = t1_decoder_funcs; + + return FT_Err_Ok; + } + + + /* finalize T1 decoder */ + FT_LOCAL_DEF( void ) + t1_decoder_done( T1_Decoder decoder ) + { + FT_Memory memory = decoder->builder.memory; + + + t1_builder_done( &decoder->builder ); + + if ( decoder->cf2_instance.finalizer ) + { + decoder->cf2_instance.finalizer( decoder->cf2_instance.data ); + FT_FREE( decoder->cf2_instance.data ); + } + } + + +/* END */ diff --git a/vendor/FreeType2/src/psaux/t1decode.h b/vendor/FreeType2/src/psaux/t1decode.h new file mode 100644 index 0000000..1d9718d --- /dev/null +++ b/vendor/FreeType2/src/psaux/t1decode.h @@ -0,0 +1,74 @@ +/***************************************************************************/ +/* */ +/* t1decode.h */ +/* */ +/* PostScript Type 1 decoding routines (specification). */ +/* */ +/* Copyright 2000-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef T1DECODE_H_ +#define T1DECODE_H_ + + +#include +#include FT_INTERNAL_POSTSCRIPT_AUX_H +#include FT_INTERNAL_TYPE1_TYPES_H + + +FT_BEGIN_HEADER + + + FT_CALLBACK_TABLE + const T1_Decoder_FuncsRec t1_decoder_funcs; + + FT_LOCAL( FT_Int ) + t1_lookup_glyph_by_stdcharcode_ps( PS_Decoder* decoder, + FT_Int charcode ); + +#ifdef T1_CONFIG_OPTION_OLD_ENGINE + FT_LOCAL( FT_Error ) + t1_decoder_parse_glyph( T1_Decoder decoder, + FT_UInt glyph_index ); + + FT_LOCAL( FT_Error ) + t1_decoder_parse_charstrings( T1_Decoder decoder, + FT_Byte* base, + FT_UInt len ); +#else + FT_LOCAL( FT_Error ) + t1_decoder_parse_metrics( T1_Decoder decoder, + FT_Byte* charstring_base, + FT_UInt charstring_len ); +#endif + + FT_LOCAL( FT_Error ) + t1_decoder_init( T1_Decoder decoder, + FT_Face face, + FT_Size size, + FT_GlyphSlot slot, + FT_Byte** glyph_names, + PS_Blend blend, + FT_Bool hinting, + FT_Render_Mode hint_mode, + T1_Decoder_Callback parse_glyph ); + + FT_LOCAL( void ) + t1_decoder_done( T1_Decoder decoder ); + + +FT_END_HEADER + +#endif /* T1DECODE_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/pshinter/pshalgo.c b/vendor/FreeType2/src/pshinter/pshalgo.c new file mode 100644 index 0000000..b98077c --- /dev/null +++ b/vendor/FreeType2/src/pshinter/pshalgo.c @@ -0,0 +1,2195 @@ +/***************************************************************************/ +/* */ +/* pshalgo.c */ +/* */ +/* PostScript hinting algorithm (body). */ +/* */ +/* Copyright 2001-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include "pshalgo.h" + +#include "pshnterr.h" + + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pshalgo + + +#ifdef DEBUG_HINTER + PSH_Hint_Table ps_debug_hint_table = NULL; + PSH_HintFunc ps_debug_hint_func = NULL; + PSH_Glyph ps_debug_glyph = NULL; +#endif + + +#define COMPUTE_INFLEXS /* compute inflection points to optimize `S' */ + /* and similar glyphs */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BASIC HINTS RECORDINGS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* return true if two stem hints overlap */ + static FT_Int + psh_hint_overlap( PSH_Hint hint1, + PSH_Hint hint2 ) + { + return hint1->org_pos + hint1->org_len >= hint2->org_pos && + hint2->org_pos + hint2->org_len >= hint1->org_pos; + } + + + /* destroy hints table */ + static void + psh_hint_table_done( PSH_Hint_Table table, + FT_Memory memory ) + { + FT_FREE( table->zones ); + table->num_zones = 0; + table->zone = NULL; + + FT_FREE( table->sort ); + FT_FREE( table->hints ); + table->num_hints = 0; + table->max_hints = 0; + table->sort_global = NULL; + } + + + /* deactivate all hints in a table */ + static void + psh_hint_table_deactivate( PSH_Hint_Table table ) + { + FT_UInt count = table->max_hints; + PSH_Hint hint = table->hints; + + + for ( ; count > 0; count--, hint++ ) + { + psh_hint_deactivate( hint ); + hint->order = -1; + } + } + + + /* internal function to record a new hint */ + static void + psh_hint_table_record( PSH_Hint_Table table, + FT_UInt idx ) + { + PSH_Hint hint = table->hints + idx; + + + if ( idx >= table->max_hints ) + { + FT_TRACE0(( "psh_hint_table_record: invalid hint index %d\n", idx )); + return; + } + + /* ignore active hints */ + if ( psh_hint_is_active( hint ) ) + return; + + psh_hint_activate( hint ); + + /* now scan the current active hint set to check */ + /* whether `hint' overlaps with another hint */ + { + PSH_Hint* sorted = table->sort_global; + FT_UInt count = table->num_hints; + PSH_Hint hint2; + + + hint->parent = NULL; + for ( ; count > 0; count--, sorted++ ) + { + hint2 = sorted[0]; + + if ( psh_hint_overlap( hint, hint2 ) ) + { + hint->parent = hint2; + break; + } + } + } + + if ( table->num_hints < table->max_hints ) + table->sort_global[table->num_hints++] = hint; + else + FT_TRACE0(( "psh_hint_table_record: too many sorted hints! BUG!\n" )); + } + + + static void + psh_hint_table_record_mask( PSH_Hint_Table table, + PS_Mask hint_mask ) + { + FT_Int mask = 0, val = 0; + FT_Byte* cursor = hint_mask->bytes; + FT_UInt idx, limit; + + + limit = hint_mask->num_bits; + + for ( idx = 0; idx < limit; idx++ ) + { + if ( mask == 0 ) + { + val = *cursor++; + mask = 0x80; + } + + if ( val & mask ) + psh_hint_table_record( table, idx ); + + mask >>= 1; + } + } + + + /* create hints table */ + static FT_Error + psh_hint_table_init( PSH_Hint_Table table, + PS_Hint_Table hints, + PS_Mask_Table hint_masks, + PS_Mask_Table counter_masks, + FT_Memory memory ) + { + FT_UInt count; + FT_Error error; + + FT_UNUSED( counter_masks ); + + + count = hints->num_hints; + + /* allocate our tables */ + if ( FT_NEW_ARRAY( table->sort, 2 * count ) || + FT_NEW_ARRAY( table->hints, count ) || + FT_NEW_ARRAY( table->zones, 2 * count + 1 ) ) + goto Exit; + + table->max_hints = count; + table->sort_global = table->sort + count; + table->num_hints = 0; + table->num_zones = 0; + table->zone = NULL; + + /* initialize the `table->hints' array */ + { + PSH_Hint write = table->hints; + PS_Hint read = hints->hints; + + + for ( ; count > 0; count--, write++, read++ ) + { + write->org_pos = read->pos; + write->org_len = read->len; + write->flags = read->flags; + } + } + + /* we now need to determine the initial `parent' stems; first */ + /* activate the hints that are given by the initial hint masks */ + if ( hint_masks ) + { + PS_Mask mask = hint_masks->masks; + + + count = hint_masks->num_masks; + table->hint_masks = hint_masks; + + for ( ; count > 0; count--, mask++ ) + psh_hint_table_record_mask( table, mask ); + } + + /* finally, do a linear parse in case some hints were left alone */ + if ( table->num_hints != table->max_hints ) + { + FT_UInt idx; + + + FT_TRACE0(( "psh_hint_table_init: missing/incorrect hint masks\n" )); + + count = table->max_hints; + for ( idx = 0; idx < count; idx++ ) + psh_hint_table_record( table, idx ); + } + + Exit: + return error; + } + + + static void + psh_hint_table_activate_mask( PSH_Hint_Table table, + PS_Mask hint_mask ) + { + FT_Int mask = 0, val = 0; + FT_Byte* cursor = hint_mask->bytes; + FT_UInt idx, limit, count; + + + limit = hint_mask->num_bits; + count = 0; + + psh_hint_table_deactivate( table ); + + for ( idx = 0; idx < limit; idx++ ) + { + if ( mask == 0 ) + { + val = *cursor++; + mask = 0x80; + } + + if ( val & mask ) + { + PSH_Hint hint = &table->hints[idx]; + + + if ( !psh_hint_is_active( hint ) ) + { + FT_UInt count2; + +#if 0 + PSH_Hint* sort = table->sort; + PSH_Hint hint2; + + + for ( count2 = count; count2 > 0; count2--, sort++ ) + { + hint2 = sort[0]; + if ( psh_hint_overlap( hint, hint2 ) ) + FT_TRACE0(( "psh_hint_table_activate_mask:" + " found overlapping hints\n" )) + } +#else + count2 = 0; +#endif + + if ( count2 == 0 ) + { + psh_hint_activate( hint ); + if ( count < table->max_hints ) + table->sort[count++] = hint; + else + FT_TRACE0(( "psh_hint_tableactivate_mask:" + " too many active hints\n" )); + } + } + } + + mask >>= 1; + } + table->num_hints = count; + + /* now, sort the hints; they are guaranteed to not overlap */ + /* so we can compare their "org_pos" field directly */ + { + FT_Int i1, i2; + PSH_Hint hint1, hint2; + PSH_Hint* sort = table->sort; + + + /* a simple bubble sort will do, since in 99% of cases, the hints */ + /* will be already sorted -- and the sort will be linear */ + for ( i1 = 1; i1 < (FT_Int)count; i1++ ) + { + hint1 = sort[i1]; + for ( i2 = i1 - 1; i2 >= 0; i2-- ) + { + hint2 = sort[i2]; + + if ( hint2->org_pos < hint1->org_pos ) + break; + + sort[i2 + 1] = hint2; + sort[i2] = hint1; + } + } + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** HINTS GRID-FITTING AND OPTIMIZATION *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#if 1 + static FT_Pos + psh_dimension_quantize_len( PSH_Dimension dim, + FT_Pos len, + FT_Bool do_snapping ) + { + if ( len <= 64 ) + len = 64; + else + { + FT_Pos delta = len - dim->stdw.widths[0].cur; + + + if ( delta < 0 ) + delta = -delta; + + if ( delta < 40 ) + { + len = dim->stdw.widths[0].cur; + if ( len < 48 ) + len = 48; + } + + if ( len < 3 * 64 ) + { + delta = ( len & 63 ); + len &= -64; + + if ( delta < 10 ) + len += delta; + + else if ( delta < 32 ) + len += 10; + + else if ( delta < 54 ) + len += 54; + + else + len += delta; + } + else + len = FT_PIX_ROUND( len ); + } + + if ( do_snapping ) + len = FT_PIX_ROUND( len ); + + return len; + } +#endif /* 0 */ + + +#ifdef DEBUG_HINTER + + static void + ps_simple_scale( PSH_Hint_Table table, + FT_Fixed scale, + FT_Fixed delta, + FT_Int dimension ) + { + FT_UInt count; + + + for ( count = 0; count < table->max_hints; count++ ) + { + PSH_Hint hint = table->hints + count; + + + hint->cur_pos = FT_MulFix( hint->org_pos, scale ) + delta; + hint->cur_len = FT_MulFix( hint->org_len, scale ); + + if ( ps_debug_hint_func ) + ps_debug_hint_func( hint, dimension ); + } + } + +#endif /* DEBUG_HINTER */ + + + static FT_Fixed + psh_hint_snap_stem_side_delta( FT_Fixed pos, + FT_Fixed len ) + { + FT_Fixed delta1 = FT_PIX_ROUND( pos ) - pos; + FT_Fixed delta2 = FT_PIX_ROUND( pos + len ) - pos - len; + + + if ( FT_ABS( delta1 ) <= FT_ABS( delta2 ) ) + return delta1; + else + return delta2; + } + + + static void + psh_hint_align( PSH_Hint hint, + PSH_Globals globals, + FT_Int dimension, + PSH_Glyph glyph ) + { + PSH_Dimension dim = &globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + + + if ( !psh_hint_is_fitted( hint ) ) + { + FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta; + FT_Pos len = FT_MulFix( hint->org_len, scale ); + + FT_Int do_snapping; + FT_Pos fit_len; + PSH_AlignmentRec align; + + + /* ignore stem alignments when requested through the hint flags */ + if ( ( dimension == 0 && !glyph->do_horz_hints ) || + ( dimension == 1 && !glyph->do_vert_hints ) ) + { + hint->cur_pos = pos; + hint->cur_len = len; + + psh_hint_set_fitted( hint ); + return; + } + + /* perform stem snapping when requested - this is necessary + * for monochrome and LCD hinting modes only + */ + do_snapping = ( dimension == 0 && glyph->do_horz_snapping ) || + ( dimension == 1 && glyph->do_vert_snapping ); + + hint->cur_len = fit_len = len; + + /* check blue zones for horizontal stems */ + align.align = PSH_BLUE_ALIGN_NONE; + align.align_bot = align.align_top = 0; + + if ( dimension == 1 ) + psh_blues_snap_stem( &globals->blues, + hint->org_pos + hint->org_len, + hint->org_pos, + &align ); + + switch ( align.align ) + { + case PSH_BLUE_ALIGN_TOP: + /* the top of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_top - fit_len; + break; + + case PSH_BLUE_ALIGN_BOT: + /* the bottom of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_bot; + break; + + case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT: + /* both edges of the stem are aligned against blue zones */ + hint->cur_pos = align.align_bot; + hint->cur_len = align.align_top - align.align_bot; + break; + + default: + { + PSH_Hint parent = hint->parent; + + + if ( parent ) + { + FT_Pos par_org_center, par_cur_center; + FT_Pos cur_org_center, cur_delta; + + + /* ensure that parent is already fitted */ + if ( !psh_hint_is_fitted( parent ) ) + psh_hint_align( parent, globals, dimension, glyph ); + + /* keep original relation between hints, this is, use the */ + /* scaled distance between the centers of the hints to */ + /* compute the new position */ + par_org_center = parent->org_pos + ( parent->org_len >> 1 ); + par_cur_center = parent->cur_pos + ( parent->cur_len >> 1 ); + cur_org_center = hint->org_pos + ( hint->org_len >> 1 ); + + cur_delta = FT_MulFix( cur_org_center - par_org_center, scale ); + pos = par_cur_center + cur_delta - ( len >> 1 ); + } + + hint->cur_pos = pos; + hint->cur_len = fit_len; + + /* Stem adjustment tries to snap stem widths to standard + * ones. This is important to prevent unpleasant rounding + * artefacts. + */ + if ( glyph->do_stem_adjust ) + { + if ( len <= 64 ) + { + /* the stem is less than one pixel; we will center it + * around the nearest pixel center + */ + if ( len >= 32 ) + { + /* This is a special case where we also widen the stem + * and align it to the pixel grid. + * + * stem_center = pos + (len/2) + * nearest_pixel_center = FT_ROUND(stem_center-32)+32 + * new_pos = nearest_pixel_center-32 + * = FT_ROUND(stem_center-32) + * = FT_FLOOR(stem_center-32+32) + * = FT_FLOOR(stem_center) + * new_len = 64 + */ + pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ); + len = 64; + } + else if ( len > 0 ) + { + /* This is a very small stem; we simply align it to the + * pixel grid, trying to find the minimum displacement. + * + * left = pos + * right = pos + len + * left_nearest_edge = ROUND(pos) + * right_nearest_edge = ROUND(right) + * + * if ( ABS(left_nearest_edge - left) <= + * ABS(right_nearest_edge - right) ) + * new_pos = left + * else + * new_pos = right + */ + FT_Pos left_nearest = FT_PIX_ROUND( pos ); + FT_Pos right_nearest = FT_PIX_ROUND( pos + len ); + FT_Pos left_disp = left_nearest - pos; + FT_Pos right_disp = right_nearest - ( pos + len ); + + + if ( left_disp < 0 ) + left_disp = -left_disp; + if ( right_disp < 0 ) + right_disp = -right_disp; + if ( left_disp <= right_disp ) + pos = left_nearest; + else + pos = right_nearest; + } + else + { + /* this is a ghost stem; we simply round it */ + pos = FT_PIX_ROUND( pos ); + } + } + else + { + len = psh_dimension_quantize_len( dim, len, 0 ); + } + } + + /* now that we have a good hinted stem width, try to position */ + /* the stem along a pixel grid integer coordinate */ + hint->cur_pos = pos + psh_hint_snap_stem_side_delta( pos, len ); + hint->cur_len = len; + } + } + + if ( do_snapping ) + { + pos = hint->cur_pos; + len = hint->cur_len; + + if ( len < 64 ) + len = 64; + else + len = FT_PIX_ROUND( len ); + + switch ( align.align ) + { + case PSH_BLUE_ALIGN_TOP: + hint->cur_pos = align.align_top - len; + hint->cur_len = len; + break; + + case PSH_BLUE_ALIGN_BOT: + hint->cur_len = len; + break; + + case PSH_BLUE_ALIGN_BOT | PSH_BLUE_ALIGN_TOP: + /* don't touch */ + break; + + + default: + hint->cur_len = len; + if ( len & 64 ) + pos = FT_PIX_FLOOR( pos + ( len >> 1 ) ) + 32; + else + pos = FT_PIX_ROUND( pos + ( len >> 1 ) ); + + hint->cur_pos = pos - ( len >> 1 ); + hint->cur_len = len; + } + } + + psh_hint_set_fitted( hint ); + +#ifdef DEBUG_HINTER + if ( ps_debug_hint_func ) + ps_debug_hint_func( hint, dimension ); +#endif + } + } + + +#if 0 /* not used for now, experimental */ + + /* + * A variant to perform "light" hinting (i.e. FT_RENDER_MODE_LIGHT) + * of stems + */ + static void + psh_hint_align_light( PSH_Hint hint, + PSH_Globals globals, + FT_Int dimension, + PSH_Glyph glyph ) + { + PSH_Dimension dim = &globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + + + if ( !psh_hint_is_fitted( hint ) ) + { + FT_Pos pos = FT_MulFix( hint->org_pos, scale ) + delta; + FT_Pos len = FT_MulFix( hint->org_len, scale ); + + FT_Pos fit_len; + + PSH_AlignmentRec align; + + + /* ignore stem alignments when requested through the hint flags */ + if ( ( dimension == 0 && !glyph->do_horz_hints ) || + ( dimension == 1 && !glyph->do_vert_hints ) ) + { + hint->cur_pos = pos; + hint->cur_len = len; + + psh_hint_set_fitted( hint ); + return; + } + + fit_len = len; + + hint->cur_len = fit_len; + + /* check blue zones for horizontal stems */ + align.align = PSH_BLUE_ALIGN_NONE; + align.align_bot = align.align_top = 0; + + if ( dimension == 1 ) + psh_blues_snap_stem( &globals->blues, + hint->org_pos + hint->org_len, + hint->org_pos, + &align ); + + switch ( align.align ) + { + case PSH_BLUE_ALIGN_TOP: + /* the top of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_top - fit_len; + break; + + case PSH_BLUE_ALIGN_BOT: + /* the bottom of the stem is aligned against a blue zone */ + hint->cur_pos = align.align_bot; + break; + + case PSH_BLUE_ALIGN_TOP | PSH_BLUE_ALIGN_BOT: + /* both edges of the stem are aligned against blue zones */ + hint->cur_pos = align.align_bot; + hint->cur_len = align.align_top - align.align_bot; + break; + + default: + { + PSH_Hint parent = hint->parent; + + + if ( parent ) + { + FT_Pos par_org_center, par_cur_center; + FT_Pos cur_org_center, cur_delta; + + + /* ensure that parent is already fitted */ + if ( !psh_hint_is_fitted( parent ) ) + psh_hint_align_light( parent, globals, dimension, glyph ); + + par_org_center = parent->org_pos + ( parent->org_len / 2 ); + par_cur_center = parent->cur_pos + ( parent->cur_len / 2 ); + cur_org_center = hint->org_pos + ( hint->org_len / 2 ); + + cur_delta = FT_MulFix( cur_org_center - par_org_center, scale ); + pos = par_cur_center + cur_delta - ( len >> 1 ); + } + + /* Stems less than one pixel wide are easy -- we want to + * make them as dark as possible, so they must fall within + * one pixel. If the stem is split between two pixels + * then snap the edge that is nearer to the pixel boundary + * to the pixel boundary. + */ + if ( len <= 64 ) + { + if ( ( pos + len + 63 ) / 64 != pos / 64 + 1 ) + pos += psh_hint_snap_stem_side_delta ( pos, len ); + } + + /* Position stems other to minimize the amount of mid-grays. + * There are, in general, two positions that do this, + * illustrated as A) and B) below. + * + * + + + + + * + * A) |--------------------------------| + * B) |--------------------------------| + * C) |--------------------------------| + * + * Position A) (split the excess stem equally) should be better + * for stems of width N + f where f < 0.5. + * + * Position B) (split the deficiency equally) should be better + * for stems of width N + f where f > 0.5. + * + * It turns out though that minimizing the total number of lit + * pixels is also important, so position C), with one edge + * aligned with a pixel boundary is actually preferable + * to A). There are also more possible positions for C) than + * for A) or B), so it involves less distortion of the overall + * character shape. + */ + else /* len > 64 */ + { + FT_Fixed frac_len = len & 63; + FT_Fixed center = pos + ( len >> 1 ); + FT_Fixed delta_a, delta_b; + + + if ( ( len / 64 ) & 1 ) + { + delta_a = FT_PIX_FLOOR( center ) + 32 - center; + delta_b = FT_PIX_ROUND( center ) - center; + } + else + { + delta_a = FT_PIX_ROUND( center ) - center; + delta_b = FT_PIX_FLOOR( center ) + 32 - center; + } + + /* We choose between B) and C) above based on the amount + * of fractional stem width; for small amounts, choose + * C) always, for large amounts, B) always, and inbetween, + * pick whichever one involves less stem movement. + */ + if ( frac_len < 32 ) + { + pos += psh_hint_snap_stem_side_delta ( pos, len ); + } + else if ( frac_len < 48 ) + { + FT_Fixed side_delta = psh_hint_snap_stem_side_delta ( pos, + len ); + + if ( FT_ABS( side_delta ) < FT_ABS( delta_b ) ) + pos += side_delta; + else + pos += delta_b; + } + else + { + pos += delta_b; + } + } + + hint->cur_pos = pos; + } + } /* switch */ + + psh_hint_set_fitted( hint ); + +#ifdef DEBUG_HINTER + if ( ps_debug_hint_func ) + ps_debug_hint_func( hint, dimension ); +#endif + } + } + +#endif /* 0 */ + + + static void + psh_hint_table_align_hints( PSH_Hint_Table table, + PSH_Globals globals, + FT_Int dimension, + PSH_Glyph glyph ) + { + PSH_Hint hint; + FT_UInt count; + +#ifdef DEBUG_HINTER + + PSH_Dimension dim = &globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + + + if ( ps_debug_no_vert_hints && dimension == 0 ) + { + ps_simple_scale( table, scale, delta, dimension ); + return; + } + + if ( ps_debug_no_horz_hints && dimension == 1 ) + { + ps_simple_scale( table, scale, delta, dimension ); + return; + } + +#endif /* DEBUG_HINTER*/ + + hint = table->hints; + count = table->max_hints; + + for ( ; count > 0; count--, hint++ ) + psh_hint_align( hint, globals, dimension, glyph ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** POINTS INTERPOLATION ROUTINES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define xxDEBUG_ZONES + + +#ifdef DEBUG_ZONES + +#include FT_CONFIG_STANDARD_LIBRARY_H + + static void + psh_print_zone( PSH_Zone zone ) + { + printf( "zone [scale,delta,min,max] = [%.5f,%.2f,%d,%d]\n", + zone->scale / 65536.0, + zone->delta / 64.0, + zone->min, + zone->max ); + } + +#endif /* DEBUG_ZONES */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** HINTER GLYPH MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + +#define psh_corner_is_flat ft_corner_is_flat +#define psh_corner_orientation ft_corner_orientation + + +#ifdef COMPUTE_INFLEXS + + /* compute all inflex points in a given glyph */ + static void + psh_glyph_compute_inflections( PSH_Glyph glyph ) + { + FT_UInt n; + + + for ( n = 0; n < glyph->num_contours; n++ ) + { + PSH_Point first, start, end, before, after; + FT_Pos in_x, in_y, out_x, out_y; + FT_Int orient_prev, orient_cur; + FT_Int finished = 0; + + + /* we need at least 4 points to create an inflection point */ + if ( glyph->contours[n].count < 4 ) + continue; + + /* compute first segment in contour */ + first = glyph->contours[n].start; + + start = end = first; + do + { + end = end->next; + if ( end == first ) + goto Skip; + + in_x = end->org_u - start->org_u; + in_y = end->org_v - start->org_v; + + } while ( in_x == 0 && in_y == 0 ); + + /* extend the segment start whenever possible */ + before = start; + do + { + do + { + start = before; + before = before->prev; + if ( before == first ) + goto Skip; + + out_x = start->org_u - before->org_u; + out_y = start->org_v - before->org_v; + + } while ( out_x == 0 && out_y == 0 ); + + orient_prev = psh_corner_orientation( in_x, in_y, out_x, out_y ); + + } while ( orient_prev == 0 ); + + first = start; + in_x = out_x; + in_y = out_y; + + /* now, process all segments in the contour */ + do + { + /* first, extend current segment's end whenever possible */ + after = end; + do + { + do + { + end = after; + after = after->next; + if ( after == first ) + finished = 1; + + out_x = after->org_u - end->org_u; + out_y = after->org_v - end->org_v; + + } while ( out_x == 0 && out_y == 0 ); + + orient_cur = psh_corner_orientation( in_x, in_y, out_x, out_y ); + + } while ( orient_cur == 0 ); + + if ( ( orient_cur ^ orient_prev ) < 0 ) + { + do + { + psh_point_set_inflex( start ); + start = start->next; + } + while ( start != end ); + + psh_point_set_inflex( start ); + } + + start = end; + end = after; + orient_prev = orient_cur; + in_x = out_x; + in_y = out_y; + + } while ( !finished ); + + Skip: + ; + } + } + +#endif /* COMPUTE_INFLEXS */ + + + static void + psh_glyph_done( PSH_Glyph glyph ) + { + FT_Memory memory = glyph->memory; + + + psh_hint_table_done( &glyph->hint_tables[1], memory ); + psh_hint_table_done( &glyph->hint_tables[0], memory ); + + FT_FREE( glyph->points ); + FT_FREE( glyph->contours ); + + glyph->num_points = 0; + glyph->num_contours = 0; + + glyph->memory = NULL; + } + + + static int + psh_compute_dir( FT_Pos dx, + FT_Pos dy ) + { + FT_Pos ax, ay; + int result = PSH_DIR_NONE; + + + ax = FT_ABS( dx ); + ay = FT_ABS( dy ); + + if ( ay * 12 < ax ) + { + /* |dy| <<< |dx| means a near-horizontal segment */ + result = ( dx >= 0 ) ? PSH_DIR_RIGHT : PSH_DIR_LEFT; + } + else if ( ax * 12 < ay ) + { + /* |dx| <<< |dy| means a near-vertical segment */ + result = ( dy >= 0 ) ? PSH_DIR_UP : PSH_DIR_DOWN; + } + + return result; + } + + + /* load outline point coordinates into hinter glyph */ + static void + psh_glyph_load_points( PSH_Glyph glyph, + FT_Int dimension ) + { + FT_Vector* vec = glyph->outline->points; + PSH_Point point = glyph->points; + FT_UInt count = glyph->num_points; + + + for ( ; count > 0; count--, point++, vec++ ) + { + point->flags2 = 0; + point->hint = NULL; + if ( dimension == 0 ) + { + point->org_u = vec->x; + point->org_v = vec->y; + } + else + { + point->org_u = vec->y; + point->org_v = vec->x; + } + +#ifdef DEBUG_HINTER + point->org_x = vec->x; + point->org_y = vec->y; +#endif + + } + } + + + /* save hinted point coordinates back to outline */ + static void + psh_glyph_save_points( PSH_Glyph glyph, + FT_Int dimension ) + { + FT_UInt n; + PSH_Point point = glyph->points; + FT_Vector* vec = glyph->outline->points; + char* tags = glyph->outline->tags; + + + for ( n = 0; n < glyph->num_points; n++ ) + { + if ( dimension == 0 ) + vec[n].x = point->cur_u; + else + vec[n].y = point->cur_u; + + if ( psh_point_is_strong( point ) ) + tags[n] |= (char)( ( dimension == 0 ) ? 32 : 64 ); + +#ifdef DEBUG_HINTER + + if ( dimension == 0 ) + { + point->cur_x = point->cur_u; + point->flags_x = point->flags2 | point->flags; + } + else + { + point->cur_y = point->cur_u; + point->flags_y = point->flags2 | point->flags; + } + +#endif + + point++; + } + } + + + static FT_Error + psh_glyph_init( PSH_Glyph glyph, + FT_Outline* outline, + PS_Hints ps_hints, + PSH_Globals globals ) + { + FT_Error error; + FT_Memory memory; + + + /* clear all fields */ + FT_ZERO( glyph ); + + memory = glyph->memory = globals->memory; + + /* allocate and setup points + contours arrays */ + if ( FT_NEW_ARRAY( glyph->points, outline->n_points ) || + FT_NEW_ARRAY( glyph->contours, outline->n_contours ) ) + goto Exit; + + glyph->num_points = (FT_UInt)outline->n_points; + glyph->num_contours = (FT_UInt)outline->n_contours; + + { + FT_UInt first = 0, next, n; + PSH_Point points = glyph->points; + PSH_Contour contour = glyph->contours; + + + for ( n = 0; n < glyph->num_contours; n++ ) + { + FT_UInt count; + PSH_Point point; + + + next = (FT_UInt)outline->contours[n] + 1; + count = next - first; + + contour->start = points + first; + contour->count = count; + + if ( count > 0 ) + { + point = points + first; + + point->prev = points + next - 1; + point->contour = contour; + + for ( ; count > 1; count-- ) + { + point[0].next = point + 1; + point[1].prev = point; + point++; + point->contour = contour; + } + point->next = points + first; + } + + contour++; + first = next; + } + } + + { + PSH_Point points = glyph->points; + PSH_Point point = points; + FT_Vector* vec = outline->points; + FT_UInt n; + + + for ( n = 0; n < glyph->num_points; n++, point++ ) + { + FT_Int n_prev = (FT_Int)( point->prev - points ); + FT_Int n_next = (FT_Int)( point->next - points ); + FT_Pos dxi, dyi, dxo, dyo; + + + if ( !( outline->tags[n] & FT_CURVE_TAG_ON ) ) + point->flags = PSH_POINT_OFF; + + dxi = vec[n].x - vec[n_prev].x; + dyi = vec[n].y - vec[n_prev].y; + + point->dir_in = (FT_Char)psh_compute_dir( dxi, dyi ); + + dxo = vec[n_next].x - vec[n].x; + dyo = vec[n_next].y - vec[n].y; + + point->dir_out = (FT_Char)psh_compute_dir( dxo, dyo ); + + /* detect smooth points */ + if ( point->flags & PSH_POINT_OFF ) + point->flags |= PSH_POINT_SMOOTH; + + else if ( point->dir_in == point->dir_out ) + { + if ( point->dir_out != PSH_DIR_NONE || + psh_corner_is_flat( dxi, dyi, dxo, dyo ) ) + point->flags |= PSH_POINT_SMOOTH; + } + } + } + + glyph->outline = outline; + glyph->globals = globals; + +#ifdef COMPUTE_INFLEXS + psh_glyph_load_points( glyph, 0 ); + psh_glyph_compute_inflections( glyph ); +#endif /* COMPUTE_INFLEXS */ + + /* now deal with hints tables */ + error = psh_hint_table_init( &glyph->hint_tables [0], + &ps_hints->dimension[0].hints, + &ps_hints->dimension[0].masks, + &ps_hints->dimension[0].counters, + memory ); + if ( error ) + goto Exit; + + error = psh_hint_table_init( &glyph->hint_tables [1], + &ps_hints->dimension[1].hints, + &ps_hints->dimension[1].masks, + &ps_hints->dimension[1].counters, + memory ); + if ( error ) + goto Exit; + + Exit: + return error; + } + + + /* compute all extrema in a glyph for a given dimension */ + static void + psh_glyph_compute_extrema( PSH_Glyph glyph ) + { + FT_UInt n; + + + /* first of all, compute all local extrema */ + for ( n = 0; n < glyph->num_contours; n++ ) + { + PSH_Point first = glyph->contours[n].start; + PSH_Point point, before, after; + + + if ( glyph->contours[n].count == 0 ) + continue; + + point = first; + before = point; + + do + { + before = before->prev; + if ( before == first ) + goto Skip; + + } while ( before->org_u == point->org_u ); + + first = point = before->next; + + for (;;) + { + after = point; + do + { + after = after->next; + if ( after == first ) + goto Next; + + } while ( after->org_u == point->org_u ); + + if ( before->org_u < point->org_u ) + { + if ( after->org_u < point->org_u ) + { + /* local maximum */ + goto Extremum; + } + } + else /* before->org_u > point->org_u */ + { + if ( after->org_u > point->org_u ) + { + /* local minimum */ + Extremum: + do + { + psh_point_set_extremum( point ); + point = point->next; + + } while ( point != after ); + } + } + + before = after->prev; + point = after; + + } /* for */ + + Next: + ; + } + + /* for each extremum, determine its direction along the */ + /* orthogonal axis */ + for ( n = 0; n < glyph->num_points; n++ ) + { + PSH_Point point, before, after; + + + point = &glyph->points[n]; + before = point; + after = point; + + if ( psh_point_is_extremum( point ) ) + { + do + { + before = before->prev; + if ( before == point ) + goto Skip; + + } while ( before->org_v == point->org_v ); + + do + { + after = after->next; + if ( after == point ) + goto Skip; + + } while ( after->org_v == point->org_v ); + } + + if ( before->org_v < point->org_v && + after->org_v > point->org_v ) + { + psh_point_set_positive( point ); + } + else if ( before->org_v > point->org_v && + after->org_v < point->org_v ) + { + psh_point_set_negative( point ); + } + + Skip: + ; + } + } + + + /* major_dir is the direction for points on the bottom/left of the stem; */ + /* Points on the top/right of the stem will have a direction of */ + /* -major_dir. */ + + static void + psh_hint_table_find_strong_points( PSH_Hint_Table table, + PSH_Point point, + FT_UInt count, + FT_Int threshold, + FT_Int major_dir ) + { + PSH_Hint* sort = table->sort; + FT_UInt num_hints = table->num_hints; + + + for ( ; count > 0; count--, point++ ) + { + FT_Int point_dir = 0; + FT_Pos org_u = point->org_u; + + + if ( psh_point_is_strong( point ) ) + continue; + + if ( PSH_DIR_COMPARE( point->dir_in, major_dir ) ) + point_dir = point->dir_in; + + else if ( PSH_DIR_COMPARE( point->dir_out, major_dir ) ) + point_dir = point->dir_out; + + if ( point_dir ) + { + if ( point_dir == major_dir ) + { + FT_UInt nn; + + + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos; + + + if ( d < threshold && -d < threshold ) + { + psh_point_set_strong( point ); + point->flags2 |= PSH_POINT_EDGE_MIN; + point->hint = hint; + break; + } + } + } + else if ( point_dir == -major_dir ) + { + FT_UInt nn; + + + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos - hint->org_len; + + + if ( d < threshold && -d < threshold ) + { + psh_point_set_strong( point ); + point->flags2 |= PSH_POINT_EDGE_MAX; + point->hint = hint; + break; + } + } + } + } + +#if 1 + else if ( psh_point_is_extremum( point ) ) + { + /* treat extrema as special cases for stem edge alignment */ + FT_UInt nn, min_flag, max_flag; + + + if ( major_dir == PSH_DIR_HORIZONTAL ) + { + min_flag = PSH_POINT_POSITIVE; + max_flag = PSH_POINT_NEGATIVE; + } + else + { + min_flag = PSH_POINT_NEGATIVE; + max_flag = PSH_POINT_POSITIVE; + } + + if ( point->flags2 & min_flag ) + { + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos; + + + if ( d < threshold && -d < threshold ) + { + point->flags2 |= PSH_POINT_EDGE_MIN; + point->hint = hint; + psh_point_set_strong( point ); + break; + } + } + } + else if ( point->flags2 & max_flag ) + { + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + FT_Pos d = org_u - hint->org_pos - hint->org_len; + + + if ( d < threshold && -d < threshold ) + { + point->flags2 |= PSH_POINT_EDGE_MAX; + point->hint = hint; + psh_point_set_strong( point ); + break; + } + } + } + + if ( !point->hint ) + { + for ( nn = 0; nn < num_hints; nn++ ) + { + PSH_Hint hint = sort[nn]; + + + if ( org_u >= hint->org_pos && + org_u <= hint->org_pos + hint->org_len ) + { + point->hint = hint; + break; + } + } + } + } + +#endif /* 1 */ + } + } + + + /* the accepted shift for strong points in fractional pixels */ +#define PSH_STRONG_THRESHOLD 32 + + /* the maximum shift value in font units */ +#define PSH_STRONG_THRESHOLD_MAXIMUM 30 + + + /* find strong points in a glyph */ + static void + psh_glyph_find_strong_points( PSH_Glyph glyph, + FT_Int dimension ) + { + /* a point is `strong' if it is located on a stem edge and */ + /* has an `in' or `out' tangent parallel to the hint's direction */ + + PSH_Hint_Table table = &glyph->hint_tables[dimension]; + PS_Mask mask = table->hint_masks->masks; + FT_UInt num_masks = table->hint_masks->num_masks; + FT_UInt first = 0; + FT_Int major_dir = ( dimension == 0 ) ? PSH_DIR_VERTICAL + : PSH_DIR_HORIZONTAL; + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Int threshold; + + + threshold = (FT_Int)FT_DivFix( PSH_STRONG_THRESHOLD, scale ); + if ( threshold > PSH_STRONG_THRESHOLD_MAXIMUM ) + threshold = PSH_STRONG_THRESHOLD_MAXIMUM; + + /* process secondary hints to `selected' points */ + if ( num_masks > 1 && glyph->num_points > 0 ) + { + /* the `endchar' op can reduce the number of points */ + first = mask->end_point > glyph->num_points + ? glyph->num_points + : mask->end_point; + mask++; + for ( ; num_masks > 1; num_masks--, mask++ ) + { + FT_UInt next = FT_MIN( mask->end_point, glyph->num_points ); + + + if ( next > first ) + { + FT_UInt count = next - first; + PSH_Point point = glyph->points + first; + + + psh_hint_table_activate_mask( table, mask ); + + psh_hint_table_find_strong_points( table, point, count, + threshold, major_dir ); + } + first = next; + } + } + + /* process primary hints for all points */ + if ( num_masks == 1 ) + { + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + psh_hint_table_activate_mask( table, table->hint_masks->masks ); + + psh_hint_table_find_strong_points( table, point, count, + threshold, major_dir ); + } + + /* now, certain points may have been attached to a hint and */ + /* not marked as strong; update their flags then */ + { + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + for ( ; count > 0; count--, point++ ) + if ( point->hint && !psh_point_is_strong( point ) ) + psh_point_set_strong( point ); + } + } + + + /* find points in a glyph which are in a blue zone and have `in' or */ + /* `out' tangents parallel to the horizontal axis */ + static void + psh_glyph_find_blue_points( PSH_Blues blues, + PSH_Glyph glyph ) + { + PSH_Blue_Table table; + PSH_Blue_Zone zone; + FT_UInt glyph_count = glyph->num_points; + FT_UInt blue_count; + PSH_Point point = glyph->points; + + + for ( ; glyph_count > 0; glyph_count--, point++ ) + { + FT_Pos y; + + + /* check tangents */ + if ( !PSH_DIR_COMPARE( point->dir_in, PSH_DIR_HORIZONTAL ) && + !PSH_DIR_COMPARE( point->dir_out, PSH_DIR_HORIZONTAL ) ) + continue; + + /* skip strong points */ + if ( psh_point_is_strong( point ) ) + continue; + + y = point->org_u; + + /* look up top zones */ + table = &blues->normal_top; + blue_count = table->count; + zone = table->zones; + + for ( ; blue_count > 0; blue_count--, zone++ ) + { + FT_Pos delta = y - zone->org_bottom; + + + if ( delta < -blues->blue_fuzz ) + break; + + if ( y <= zone->org_top + blues->blue_fuzz ) + if ( blues->no_overshoots || delta <= blues->blue_threshold ) + { + point->cur_u = zone->cur_bottom; + psh_point_set_strong( point ); + psh_point_set_fitted( point ); + } + } + + /* look up bottom zones */ + table = &blues->normal_bottom; + blue_count = table->count; + zone = table->zones + blue_count - 1; + + for ( ; blue_count > 0; blue_count--, zone-- ) + { + FT_Pos delta = zone->org_top - y; + + + if ( delta < -blues->blue_fuzz ) + break; + + if ( y >= zone->org_bottom - blues->blue_fuzz ) + if ( blues->no_overshoots || delta < blues->blue_threshold ) + { + point->cur_u = zone->cur_top; + psh_point_set_strong( point ); + psh_point_set_fitted( point ); + } + } + } + } + + + /* interpolate strong points with the help of hinted coordinates */ + static void + psh_glyph_interpolate_strong_points( PSH_Glyph glyph, + FT_Int dimension ) + { + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + + FT_UInt count = glyph->num_points; + PSH_Point point = glyph->points; + + + for ( ; count > 0; count--, point++ ) + { + PSH_Hint hint = point->hint; + + + if ( hint ) + { + FT_Pos delta; + + + if ( psh_point_is_edge_min( point ) ) + point->cur_u = hint->cur_pos; + + else if ( psh_point_is_edge_max( point ) ) + point->cur_u = hint->cur_pos + hint->cur_len; + + else + { + delta = point->org_u - hint->org_pos; + + if ( delta <= 0 ) + point->cur_u = hint->cur_pos + FT_MulFix( delta, scale ); + + else if ( delta >= hint->org_len ) + point->cur_u = hint->cur_pos + hint->cur_len + + FT_MulFix( delta - hint->org_len, scale ); + + else /* hint->org_len > 0 */ + point->cur_u = hint->cur_pos + + FT_MulDiv( delta, hint->cur_len, + hint->org_len ); + } + psh_point_set_fitted( point ); + } + } + } + + +#define PSH_MAX_STRONG_INTERNAL 16 + + static void + psh_glyph_interpolate_normal_points( PSH_Glyph glyph, + FT_Int dimension ) + { + +#if 1 + /* first technique: a point is strong if it is a local extremum */ + + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Memory memory = glyph->memory; + + PSH_Point* strongs = NULL; + PSH_Point strongs_0[PSH_MAX_STRONG_INTERNAL]; + FT_UInt num_strongs = 0; + + PSH_Point points = glyph->points; + PSH_Point points_end = points + glyph->num_points; + PSH_Point point; + + + /* first count the number of strong points */ + for ( point = points; point < points_end; point++ ) + { + if ( psh_point_is_strong( point ) ) + num_strongs++; + } + + if ( num_strongs == 0 ) /* nothing to do here */ + return; + + /* allocate an array to store a list of points, */ + /* stored in increasing org_u order */ + if ( num_strongs <= PSH_MAX_STRONG_INTERNAL ) + strongs = strongs_0; + else + { + FT_Error error; + + + if ( FT_NEW_ARRAY( strongs, num_strongs ) ) + return; + } + + num_strongs = 0; + for ( point = points; point < points_end; point++ ) + { + PSH_Point* insert; + + + if ( !psh_point_is_strong( point ) ) + continue; + + for ( insert = strongs + num_strongs; insert > strongs; insert-- ) + { + if ( insert[-1]->org_u <= point->org_u ) + break; + + insert[0] = insert[-1]; + } + insert[0] = point; + num_strongs++; + } + + /* now try to interpolate all normal points */ + for ( point = points; point < points_end; point++ ) + { + if ( psh_point_is_strong( point ) ) + continue; + + /* sometimes, some local extrema are smooth points */ + if ( psh_point_is_smooth( point ) ) + { + if ( point->dir_in == PSH_DIR_NONE || + point->dir_in != point->dir_out ) + continue; + + if ( !psh_point_is_extremum( point ) && + !psh_point_is_inflex( point ) ) + continue; + + point->flags &= ~PSH_POINT_SMOOTH; + } + + /* find best enclosing point coordinates then interpolate */ + { + PSH_Point before, after; + FT_UInt nn; + + + for ( nn = 0; nn < num_strongs; nn++ ) + if ( strongs[nn]->org_u > point->org_u ) + break; + + if ( nn == 0 ) /* point before the first strong point */ + { + after = strongs[0]; + + point->cur_u = after->cur_u + + FT_MulFix( point->org_u - after->org_u, + scale ); + } + else + { + before = strongs[nn - 1]; + + for ( nn = num_strongs; nn > 0; nn-- ) + if ( strongs[nn - 1]->org_u < point->org_u ) + break; + + if ( nn == num_strongs ) /* point is after last strong point */ + { + before = strongs[nn - 1]; + + point->cur_u = before->cur_u + + FT_MulFix( point->org_u - before->org_u, + scale ); + } + else + { + FT_Pos u; + + + after = strongs[nn]; + + /* now interpolate point between before and after */ + u = point->org_u; + + if ( u == before->org_u ) + point->cur_u = before->cur_u; + + else if ( u == after->org_u ) + point->cur_u = after->cur_u; + + else + point->cur_u = before->cur_u + + FT_MulDiv( u - before->org_u, + after->cur_u - before->cur_u, + after->org_u - before->org_u ); + } + } + psh_point_set_fitted( point ); + } + } + + if ( strongs != strongs_0 ) + FT_FREE( strongs ); + +#endif /* 1 */ + + } + + + /* interpolate other points */ + static void + psh_glyph_interpolate_other_points( PSH_Glyph glyph, + FT_Int dimension ) + { + PSH_Dimension dim = &glyph->globals->dimension[dimension]; + FT_Fixed scale = dim->scale_mult; + FT_Fixed delta = dim->scale_delta; + PSH_Contour contour = glyph->contours; + FT_UInt num_contours = glyph->num_contours; + + + for ( ; num_contours > 0; num_contours--, contour++ ) + { + PSH_Point start = contour->start; + PSH_Point first, next, point; + FT_UInt fit_count; + + + /* count the number of strong points in this contour */ + next = start + contour->count; + fit_count = 0; + first = NULL; + + for ( point = start; point < next; point++ ) + if ( psh_point_is_fitted( point ) ) + { + if ( !first ) + first = point; + + fit_count++; + } + + /* if there are less than 2 fitted points in the contour, we */ + /* simply scale and eventually translate the contour points */ + if ( fit_count < 2 ) + { + if ( fit_count == 1 ) + delta = first->cur_u - FT_MulFix( first->org_u, scale ); + + for ( point = start; point < next; point++ ) + if ( point != first ) + point->cur_u = FT_MulFix( point->org_u, scale ) + delta; + + goto Next_Contour; + } + + /* there are more than 2 strong points in this contour; we */ + /* need to interpolate weak points between them */ + start = first; + do + { + /* skip consecutive fitted points */ + for (;;) + { + next = first->next; + if ( next == start ) + goto Next_Contour; + + if ( !psh_point_is_fitted( next ) ) + break; + + first = next; + } + + /* find next fitted point after unfitted one */ + for (;;) + { + next = next->next; + if ( psh_point_is_fitted( next ) ) + break; + } + + /* now interpolate between them */ + { + FT_Pos org_a, org_ab, cur_a, cur_ab; + FT_Pos org_c, org_ac, cur_c; + FT_Fixed scale_ab; + + + if ( first->org_u <= next->org_u ) + { + org_a = first->org_u; + cur_a = first->cur_u; + org_ab = next->org_u - org_a; + cur_ab = next->cur_u - cur_a; + } + else + { + org_a = next->org_u; + cur_a = next->cur_u; + org_ab = first->org_u - org_a; + cur_ab = first->cur_u - cur_a; + } + + scale_ab = 0x10000L; + if ( org_ab > 0 ) + scale_ab = FT_DivFix( cur_ab, org_ab ); + + point = first->next; + do + { + org_c = point->org_u; + org_ac = org_c - org_a; + + if ( org_ac <= 0 ) + { + /* on the left of the interpolation zone */ + cur_c = cur_a + FT_MulFix( org_ac, scale ); + } + else if ( org_ac >= org_ab ) + { + /* on the right on the interpolation zone */ + cur_c = cur_a + cur_ab + FT_MulFix( org_ac - org_ab, scale ); + } + else + { + /* within the interpolation zone */ + cur_c = cur_a + FT_MulFix( org_ac, scale_ab ); + } + + point->cur_u = cur_c; + + point = point->next; + + } while ( point != next ); + } + + /* keep going until all points in the contours have been processed */ + first = next; + + } while ( first != start ); + + Next_Contour: + ; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** HIGH-LEVEL INTERFACE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + FT_Error + ps_hints_apply( PS_Hints ps_hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ) + { + PSH_GlyphRec glyphrec; + PSH_Glyph glyph = &glyphrec; + FT_Error error; +#ifdef DEBUG_HINTER + FT_Memory memory; +#endif + FT_Int dimension; + + + /* something to do? */ + if ( outline->n_points == 0 || outline->n_contours == 0 ) + return FT_Err_Ok; + +#ifdef DEBUG_HINTER + + memory = globals->memory; + + if ( ps_debug_glyph ) + { + psh_glyph_done( ps_debug_glyph ); + FT_FREE( ps_debug_glyph ); + } + + if ( FT_NEW( glyph ) ) + return error; + + ps_debug_glyph = glyph; + +#endif /* DEBUG_HINTER */ + + error = psh_glyph_init( glyph, outline, ps_hints, globals ); + if ( error ) + goto Exit; + + /* try to optimize the y_scale so that the top of non-capital letters + * is aligned on a pixel boundary whenever possible + */ + { + PSH_Dimension dim_x = &glyph->globals->dimension[0]; + PSH_Dimension dim_y = &glyph->globals->dimension[1]; + + FT_Fixed x_scale = dim_x->scale_mult; + FT_Fixed y_scale = dim_y->scale_mult; + + FT_Fixed old_x_scale = x_scale; + FT_Fixed old_y_scale = y_scale; + + FT_Fixed scaled; + FT_Fixed fitted; + + FT_Bool rescale = FALSE; + + + scaled = FT_MulFix( globals->blues.normal_top.zones->org_ref, y_scale ); + fitted = FT_PIX_ROUND( scaled ); + + if ( fitted != 0 && scaled != fitted ) + { + rescale = TRUE; + + y_scale = FT_MulDiv( y_scale, fitted, scaled ); + + if ( fitted < scaled ) + x_scale -= x_scale / 50; + + psh_globals_set_scale( glyph->globals, x_scale, y_scale, 0, 0 ); + } + + glyph->do_horz_hints = 1; + glyph->do_vert_hints = 1; + + glyph->do_horz_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO || + hint_mode == FT_RENDER_MODE_LCD ); + + glyph->do_vert_snapping = FT_BOOL( hint_mode == FT_RENDER_MODE_MONO || + hint_mode == FT_RENDER_MODE_LCD_V ); + + glyph->do_stem_adjust = FT_BOOL( hint_mode != FT_RENDER_MODE_LIGHT ); + + for ( dimension = 0; dimension < 2; dimension++ ) + { + /* load outline coordinates into glyph */ + psh_glyph_load_points( glyph, dimension ); + + /* compute local extrema */ + psh_glyph_compute_extrema( glyph ); + + /* compute aligned stem/hints positions */ + psh_hint_table_align_hints( &glyph->hint_tables[dimension], + glyph->globals, + dimension, + glyph ); + + /* find strong points, align them, then interpolate others */ + psh_glyph_find_strong_points( glyph, dimension ); + if ( dimension == 1 ) + psh_glyph_find_blue_points( &globals->blues, glyph ); + psh_glyph_interpolate_strong_points( glyph, dimension ); + psh_glyph_interpolate_normal_points( glyph, dimension ); + psh_glyph_interpolate_other_points( glyph, dimension ); + + /* save hinted coordinates back to outline */ + psh_glyph_save_points( glyph, dimension ); + + if ( rescale ) + psh_globals_set_scale( glyph->globals, + old_x_scale, old_y_scale, 0, 0 ); + } + } + + Exit: + +#ifndef DEBUG_HINTER + psh_glyph_done( glyph ); +#endif + + return error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/pshinter/pshalgo.h b/vendor/FreeType2/src/pshinter/pshalgo.h new file mode 100644 index 0000000..c50683f --- /dev/null +++ b/vendor/FreeType2/src/pshinter/pshalgo.h @@ -0,0 +1,241 @@ +/***************************************************************************/ +/* */ +/* pshalgo.h */ +/* */ +/* PostScript hinting algorithm (specification). */ +/* */ +/* Copyright 2001-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef PSHALGO_H_ +#define PSHALGO_H_ + + +#include "pshrec.h" +#include "pshglob.h" + + +FT_BEGIN_HEADER + + + /* handle to Hint structure */ + typedef struct PSH_HintRec_* PSH_Hint; + + + /* hint bit-flags */ +#define PSH_HINT_GHOST PS_HINT_FLAG_GHOST +#define PSH_HINT_BOTTOM PS_HINT_FLAG_BOTTOM +#define PSH_HINT_ACTIVE 4U +#define PSH_HINT_FITTED 8U + + +#define psh_hint_is_active( x ) ( ( (x)->flags & PSH_HINT_ACTIVE ) != 0 ) +#define psh_hint_is_ghost( x ) ( ( (x)->flags & PSH_HINT_GHOST ) != 0 ) +#define psh_hint_is_fitted( x ) ( ( (x)->flags & PSH_HINT_FITTED ) != 0 ) + +#define psh_hint_activate( x ) (x)->flags |= PSH_HINT_ACTIVE +#define psh_hint_deactivate( x ) (x)->flags &= ~PSH_HINT_ACTIVE +#define psh_hint_set_fitted( x ) (x)->flags |= PSH_HINT_FITTED + + + /* hint structure */ + typedef struct PSH_HintRec_ + { + FT_Int org_pos; + FT_Int org_len; + FT_Pos cur_pos; + FT_Pos cur_len; + FT_UInt flags; + PSH_Hint parent; + FT_Int order; + + } PSH_HintRec; + + + /* this is an interpolation zone used for strong points; */ + /* weak points are interpolated according to their strong */ + /* neighbours */ + typedef struct PSH_ZoneRec_ + { + FT_Fixed scale; + FT_Fixed delta; + FT_Pos min; + FT_Pos max; + + } PSH_ZoneRec, *PSH_Zone; + + + typedef struct PSH_Hint_TableRec_ + { + FT_UInt max_hints; + FT_UInt num_hints; + PSH_Hint hints; + PSH_Hint* sort; + PSH_Hint* sort_global; + FT_UInt num_zones; + PSH_ZoneRec* zones; + PSH_Zone zone; + PS_Mask_Table hint_masks; + PS_Mask_Table counter_masks; + + } PSH_Hint_TableRec, *PSH_Hint_Table; + + + typedef struct PSH_PointRec_* PSH_Point; + typedef struct PSH_ContourRec_* PSH_Contour; + + enum + { + PSH_DIR_NONE = 4, + PSH_DIR_UP = -1, + PSH_DIR_DOWN = 1, + PSH_DIR_LEFT = -2, + PSH_DIR_RIGHT = 2 + }; + +#define PSH_DIR_HORIZONTAL 2 +#define PSH_DIR_VERTICAL 1 + +#define PSH_DIR_COMPARE( d1, d2 ) ( (d1) == (d2) || (d1) == -(d2) ) +#define PSH_DIR_IS_HORIZONTAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_HORIZONTAL ) +#define PSH_DIR_IS_VERTICAL( d ) PSH_DIR_COMPARE( d, PSH_DIR_VERTICAL ) + + + /* the following bit-flags are computed once by the glyph */ + /* analyzer, for both dimensions */ +#define PSH_POINT_OFF 1U /* point is off the curve */ +#define PSH_POINT_SMOOTH 2U /* point is smooth */ +#define PSH_POINT_INFLEX 4U /* point is inflection */ + + +#define psh_point_is_smooth( p ) ( (p)->flags & PSH_POINT_SMOOTH ) +#define psh_point_is_off( p ) ( (p)->flags & PSH_POINT_OFF ) +#define psh_point_is_inflex( p ) ( (p)->flags & PSH_POINT_INFLEX ) + +#define psh_point_set_smooth( p ) (p)->flags |= PSH_POINT_SMOOTH +#define psh_point_set_off( p ) (p)->flags |= PSH_POINT_OFF +#define psh_point_set_inflex( p ) (p)->flags |= PSH_POINT_INFLEX + + + /* the following bit-flags are re-computed for each dimension */ +#define PSH_POINT_STRONG 16U /* point is strong */ +#define PSH_POINT_FITTED 32U /* point is already fitted */ +#define PSH_POINT_EXTREMUM 64U /* point is local extremum */ +#define PSH_POINT_POSITIVE 128U /* extremum has positive contour flow */ +#define PSH_POINT_NEGATIVE 256U /* extremum has negative contour flow */ +#define PSH_POINT_EDGE_MIN 512U /* point is aligned to left/bottom stem edge */ +#define PSH_POINT_EDGE_MAX 1024U /* point is aligned to top/right stem edge */ + + +#define psh_point_is_strong( p ) ( (p)->flags2 & PSH_POINT_STRONG ) +#define psh_point_is_fitted( p ) ( (p)->flags2 & PSH_POINT_FITTED ) +#define psh_point_is_extremum( p ) ( (p)->flags2 & PSH_POINT_EXTREMUM ) +#define psh_point_is_positive( p ) ( (p)->flags2 & PSH_POINT_POSITIVE ) +#define psh_point_is_negative( p ) ( (p)->flags2 & PSH_POINT_NEGATIVE ) +#define psh_point_is_edge_min( p ) ( (p)->flags2 & PSH_POINT_EDGE_MIN ) +#define psh_point_is_edge_max( p ) ( (p)->flags2 & PSH_POINT_EDGE_MAX ) + +#define psh_point_set_strong( p ) (p)->flags2 |= PSH_POINT_STRONG +#define psh_point_set_fitted( p ) (p)->flags2 |= PSH_POINT_FITTED +#define psh_point_set_extremum( p ) (p)->flags2 |= PSH_POINT_EXTREMUM +#define psh_point_set_positive( p ) (p)->flags2 |= PSH_POINT_POSITIVE +#define psh_point_set_negative( p ) (p)->flags2 |= PSH_POINT_NEGATIVE +#define psh_point_set_edge_min( p ) (p)->flags2 |= PSH_POINT_EDGE_MIN +#define psh_point_set_edge_max( p ) (p)->flags2 |= PSH_POINT_EDGE_MAX + + + typedef struct PSH_PointRec_ + { + PSH_Point prev; + PSH_Point next; + PSH_Contour contour; + FT_UInt flags; + FT_UInt flags2; + FT_Char dir_in; + FT_Char dir_out; + PSH_Hint hint; + FT_Pos org_u; + FT_Pos org_v; + FT_Pos cur_u; +#ifdef DEBUG_HINTER + FT_Pos org_x; + FT_Pos cur_x; + FT_Pos org_y; + FT_Pos cur_y; + FT_UInt flags_x; + FT_UInt flags_y; +#endif + + } PSH_PointRec; + + + typedef struct PSH_ContourRec_ + { + PSH_Point start; + FT_UInt count; + + } PSH_ContourRec; + + + typedef struct PSH_GlyphRec_ + { + FT_UInt num_points; + FT_UInt num_contours; + + PSH_Point points; + PSH_Contour contours; + + FT_Memory memory; + FT_Outline* outline; + PSH_Globals globals; + PSH_Hint_TableRec hint_tables[2]; + + FT_Bool vertical; + FT_Int major_dir; + FT_Int minor_dir; + + FT_Bool do_horz_hints; + FT_Bool do_vert_hints; + FT_Bool do_horz_snapping; + FT_Bool do_vert_snapping; + FT_Bool do_stem_adjust; + + } PSH_GlyphRec, *PSH_Glyph; + + +#ifdef DEBUG_HINTER + extern PSH_Hint_Table ps_debug_hint_table; + + typedef void + (*PSH_HintFunc)( PSH_Hint hint, + FT_Bool vertical ); + + extern PSH_HintFunc ps_debug_hint_func; + + extern PSH_Glyph ps_debug_glyph; +#endif + + + extern FT_Error + ps_hints_apply( PS_Hints ps_hints, + FT_Outline* outline, + PSH_Globals globals, + FT_Render_Mode hint_mode ); + + +FT_END_HEADER + + +#endif /* PSHALGO_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/pshinter/pshglob.c b/vendor/FreeType2/src/pshinter/pshglob.c new file mode 100644 index 0000000..accc049 --- /dev/null +++ b/vendor/FreeType2/src/pshinter/pshglob.c @@ -0,0 +1,795 @@ +/***************************************************************************/ +/* */ +/* pshglob.c */ +/* */ +/* PostScript hinter global hinting management (body). */ +/* Inspired by the new auto-hinter module. */ +/* */ +/* Copyright 2001-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "pshglob.h" + +#ifdef DEBUG_HINTER + PSH_Globals ps_debug_globals = NULL; +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** STANDARD WIDTHS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* scale the widths/heights table */ + static void + psh_globals_scale_widths( PSH_Globals globals, + FT_UInt direction ) + { + PSH_Dimension dim = &globals->dimension[direction]; + PSH_Widths stdw = &dim->stdw; + FT_UInt count = stdw->count; + PSH_Width width = stdw->widths; + PSH_Width stand = width; /* standard width/height */ + FT_Fixed scale = dim->scale_mult; + + + if ( count > 0 ) + { + width->cur = FT_MulFix( width->org, scale ); + width->fit = FT_PIX_ROUND( width->cur ); + + width++; + count--; + + for ( ; count > 0; count--, width++ ) + { + FT_Pos w, dist; + + + w = FT_MulFix( width->org, scale ); + dist = w - stand->cur; + + if ( dist < 0 ) + dist = -dist; + + if ( dist < 128 ) + w = stand->cur; + + width->cur = w; + width->fit = FT_PIX_ROUND( w ); + } + } + } + + +#if 0 + + /* org_width is in font units, result in device pixels, 26.6 format */ + FT_LOCAL_DEF( FT_Pos ) + psh_dimension_snap_width( PSH_Dimension dimension, + FT_Int org_width ) + { + FT_UInt n; + FT_Pos width = FT_MulFix( org_width, dimension->scale_mult ); + FT_Pos best = 64 + 32 + 2; + FT_Pos reference = width; + + + for ( n = 0; n < dimension->stdw.count; n++ ) + { + FT_Pos w; + FT_Pos dist; + + + w = dimension->stdw.widths[n].cur; + dist = width - w; + if ( dist < 0 ) + dist = -dist; + if ( dist < best ) + { + best = dist; + reference = w; + } + } + + if ( width >= reference ) + { + width -= 0x21; + if ( width < reference ) + width = reference; + } + else + { + width += 0x21; + if ( width > reference ) + width = reference; + } + + return width; + } + +#endif /* 0 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** BLUE ZONES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + psh_blues_set_zones_0( PSH_Blues target, + FT_Bool is_others, + FT_UInt read_count, + FT_Short* read, + PSH_Blue_Table top_table, + PSH_Blue_Table bot_table ) + { + FT_UInt count_top = top_table->count; + FT_UInt count_bot = bot_table->count; + FT_Bool first = 1; + + FT_UNUSED( target ); + + + for ( ; read_count > 1; read_count -= 2 ) + { + FT_Int reference, delta; + FT_UInt count; + PSH_Blue_Zone zones, zone; + FT_Bool top; + + + /* read blue zone entry, and select target top/bottom zone */ + top = 0; + if ( first || is_others ) + { + reference = read[1]; + delta = read[0] - reference; + + zones = bot_table->zones; + count = count_bot; + first = 0; + } + else + { + reference = read[0]; + delta = read[1] - reference; + + zones = top_table->zones; + count = count_top; + top = 1; + } + + /* insert into sorted table */ + zone = zones; + for ( ; count > 0; count--, zone++ ) + { + if ( reference < zone->org_ref ) + break; + + if ( reference == zone->org_ref ) + { + FT_Int delta0 = zone->org_delta; + + + /* we have two zones on the same reference position -- */ + /* only keep the largest one */ + if ( delta < 0 ) + { + if ( delta < delta0 ) + zone->org_delta = delta; + } + else + { + if ( delta > delta0 ) + zone->org_delta = delta; + } + goto Skip; + } + } + + for ( ; count > 0; count-- ) + zone[count] = zone[count-1]; + + zone->org_ref = reference; + zone->org_delta = delta; + + if ( top ) + count_top++; + else + count_bot++; + + Skip: + read += 2; + } + + top_table->count = count_top; + bot_table->count = count_bot; + } + + + /* Re-read blue zones from the original fonts and store them into our */ + /* private structure. This function re-orders, sanitizes, and */ + /* fuzz-expands the zones as well. */ + static void + psh_blues_set_zones( PSH_Blues target, + FT_UInt count, + FT_Short* blues, + FT_UInt count_others, + FT_Short* other_blues, + FT_Int fuzz, + FT_Int family ) + { + PSH_Blue_Table top_table, bot_table; + FT_UInt count_top, count_bot; + + + if ( family ) + { + top_table = &target->family_top; + bot_table = &target->family_bottom; + } + else + { + top_table = &target->normal_top; + bot_table = &target->normal_bottom; + } + + /* read the input blue zones, and build two sorted tables */ + /* (one for the top zones, the other for the bottom zones) */ + top_table->count = 0; + bot_table->count = 0; + + /* first, the blues */ + psh_blues_set_zones_0( target, 0, + count, blues, top_table, bot_table ); + psh_blues_set_zones_0( target, 1, + count_others, other_blues, top_table, bot_table ); + + count_top = top_table->count; + count_bot = bot_table->count; + + /* sanitize top table */ + if ( count_top > 0 ) + { + PSH_Blue_Zone zone = top_table->zones; + + + for ( count = count_top; count > 0; count--, zone++ ) + { + FT_Int delta; + + + if ( count > 1 ) + { + delta = zone[1].org_ref - zone[0].org_ref; + if ( zone->org_delta > delta ) + zone->org_delta = delta; + } + + zone->org_bottom = zone->org_ref; + zone->org_top = zone->org_delta + zone->org_ref; + } + } + + /* sanitize bottom table */ + if ( count_bot > 0 ) + { + PSH_Blue_Zone zone = bot_table->zones; + + + for ( count = count_bot; count > 0; count--, zone++ ) + { + FT_Int delta; + + + if ( count > 1 ) + { + delta = zone[0].org_ref - zone[1].org_ref; + if ( zone->org_delta < delta ) + zone->org_delta = delta; + } + + zone->org_top = zone->org_ref; + zone->org_bottom = zone->org_delta + zone->org_ref; + } + } + + /* expand top and bottom tables with blue fuzz */ + { + FT_Int dim, top, bot, delta; + PSH_Blue_Zone zone; + + + zone = top_table->zones; + count = count_top; + + for ( dim = 1; dim >= 0; dim-- ) + { + if ( count > 0 ) + { + /* expand the bottom of the lowest zone normally */ + zone->org_bottom -= fuzz; + + /* expand the top and bottom of intermediate zones; */ + /* checking that the interval is smaller than the fuzz */ + top = zone->org_top; + + for ( count--; count > 0; count-- ) + { + bot = zone[1].org_bottom; + delta = bot - top; + + if ( delta / 2 < fuzz ) + zone[0].org_top = zone[1].org_bottom = top + delta / 2; + else + { + zone[0].org_top = top + fuzz; + zone[1].org_bottom = bot - fuzz; + } + + zone++; + top = zone->org_top; + } + + /* expand the top of the highest zone normally */ + zone->org_top = top + fuzz; + } + zone = bot_table->zones; + count = count_bot; + } + } + } + + + /* reset the blues table when the device transform changes */ + static void + psh_blues_scale_zones( PSH_Blues blues, + FT_Fixed scale, + FT_Pos delta ) + { + FT_UInt count; + FT_UInt num; + PSH_Blue_Table table = NULL; + + /* */ + /* Determine whether we need to suppress overshoots or */ + /* not. We simply need to compare the vertical scale */ + /* parameter to the raw bluescale value. Here is why: */ + /* */ + /* We need to suppress overshoots for all pointsizes. */ + /* At 300dpi that satisfies: */ + /* */ + /* pointsize < 240*bluescale + 0.49 */ + /* */ + /* This corresponds to: */ + /* */ + /* pixelsize < 1000*bluescale + 49/24 */ + /* */ + /* scale*EM_Size < 1000*bluescale + 49/24 */ + /* */ + /* However, for normal Type 1 fonts, EM_Size is 1000! */ + /* We thus only check: */ + /* */ + /* scale < bluescale + 49/24000 */ + /* */ + /* which we shorten to */ + /* */ + /* "scale < bluescale" */ + /* */ + /* Note that `blue_scale' is stored 1000 times its real */ + /* value, and that `scale' converts from font units to */ + /* fractional pixels. */ + /* */ + + /* 1000 / 64 = 125 / 8 */ + if ( scale >= 0x20C49BAL ) + blues->no_overshoots = FT_BOOL( scale < blues->blue_scale * 8 / 125 ); + else + blues->no_overshoots = FT_BOOL( scale * 125 < blues->blue_scale * 8 ); + + /* */ + /* The blue threshold is the font units distance under */ + /* which overshoots are suppressed due to the BlueShift */ + /* even if the scale is greater than BlueScale. */ + /* */ + /* It is the smallest distance such that */ + /* */ + /* dist <= BlueShift && dist*scale <= 0.5 pixels */ + /* */ + { + FT_Int threshold = blues->blue_shift; + + + while ( threshold > 0 && FT_MulFix( threshold, scale ) > 32 ) + threshold--; + + blues->blue_threshold = threshold; + } + + for ( num = 0; num < 4; num++ ) + { + PSH_Blue_Zone zone; + + + switch ( num ) + { + case 0: + table = &blues->normal_top; + break; + case 1: + table = &blues->normal_bottom; + break; + case 2: + table = &blues->family_top; + break; + default: + table = &blues->family_bottom; + break; + } + + zone = table->zones; + count = table->count; + for ( ; count > 0; count--, zone++ ) + { + zone->cur_top = FT_MulFix( zone->org_top, scale ) + delta; + zone->cur_bottom = FT_MulFix( zone->org_bottom, scale ) + delta; + zone->cur_ref = FT_MulFix( zone->org_ref, scale ) + delta; + zone->cur_delta = FT_MulFix( zone->org_delta, scale ); + + /* round scaled reference position */ + zone->cur_ref = FT_PIX_ROUND( zone->cur_ref ); + +#if 0 + if ( zone->cur_ref > zone->cur_top ) + zone->cur_ref -= 64; + else if ( zone->cur_ref < zone->cur_bottom ) + zone->cur_ref += 64; +#endif + } + } + + /* process the families now */ + + for ( num = 0; num < 2; num++ ) + { + PSH_Blue_Zone zone1, zone2; + FT_UInt count1, count2; + PSH_Blue_Table normal, family; + + + switch ( num ) + { + case 0: + normal = &blues->normal_top; + family = &blues->family_top; + break; + + default: + normal = &blues->normal_bottom; + family = &blues->family_bottom; + } + + zone1 = normal->zones; + count1 = normal->count; + + for ( ; count1 > 0; count1--, zone1++ ) + { + /* try to find a family zone whose reference position is less */ + /* than 1 pixel far from the current zone */ + zone2 = family->zones; + count2 = family->count; + + for ( ; count2 > 0; count2--, zone2++ ) + { + FT_Pos Delta; + + + Delta = zone1->org_ref - zone2->org_ref; + if ( Delta < 0 ) + Delta = -Delta; + + if ( FT_MulFix( Delta, scale ) < 64 ) + { + zone1->cur_top = zone2->cur_top; + zone1->cur_bottom = zone2->cur_bottom; + zone1->cur_ref = zone2->cur_ref; + zone1->cur_delta = zone2->cur_delta; + break; + } + } + } + } + } + + + /* calculate the maximum height of given blue zones */ + static FT_Short + psh_calc_max_height( FT_UInt num, + const FT_Short* values, + FT_Short cur_max ) + { + FT_UInt count; + + + for ( count = 0; count < num; count += 2 ) + { + FT_Short cur_height = values[count + 1] - values[count]; + + + if ( cur_height > cur_max ) + cur_max = cur_height; + } + + return cur_max; + } + + + FT_LOCAL_DEF( void ) + psh_blues_snap_stem( PSH_Blues blues, + FT_Int stem_top, + FT_Int stem_bot, + PSH_Alignment alignment ) + { + PSH_Blue_Table table; + FT_UInt count; + FT_Pos delta; + PSH_Blue_Zone zone; + FT_Int no_shoots; + + + alignment->align = PSH_BLUE_ALIGN_NONE; + + no_shoots = blues->no_overshoots; + + /* look up stem top in top zones table */ + table = &blues->normal_top; + count = table->count; + zone = table->zones; + + for ( ; count > 0; count--, zone++ ) + { + delta = stem_top - zone->org_bottom; + if ( delta < -blues->blue_fuzz ) + break; + + if ( stem_top <= zone->org_top + blues->blue_fuzz ) + { + if ( no_shoots || delta <= blues->blue_threshold ) + { + alignment->align |= PSH_BLUE_ALIGN_TOP; + alignment->align_top = zone->cur_ref; + } + break; + } + } + + /* look up stem bottom in bottom zones table */ + table = &blues->normal_bottom; + count = table->count; + zone = table->zones + count-1; + + for ( ; count > 0; count--, zone-- ) + { + delta = zone->org_top - stem_bot; + if ( delta < -blues->blue_fuzz ) + break; + + if ( stem_bot >= zone->org_bottom - blues->blue_fuzz ) + { + if ( no_shoots || delta < blues->blue_threshold ) + { + alignment->align |= PSH_BLUE_ALIGN_BOT; + alignment->align_bot = zone->cur_ref; + } + break; + } + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLOBAL HINTS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + psh_globals_destroy( PSH_Globals globals ) + { + if ( globals ) + { + FT_Memory memory; + + + memory = globals->memory; + globals->dimension[0].stdw.count = 0; + globals->dimension[1].stdw.count = 0; + + globals->blues.normal_top.count = 0; + globals->blues.normal_bottom.count = 0; + globals->blues.family_top.count = 0; + globals->blues.family_bottom.count = 0; + + FT_FREE( globals ); + +#ifdef DEBUG_HINTER + ps_debug_globals = NULL; +#endif + } + } + + + static FT_Error + psh_globals_new( FT_Memory memory, + T1_Private* priv, + PSH_Globals *aglobals ) + { + PSH_Globals globals = NULL; + FT_Error error; + + + if ( !FT_NEW( globals ) ) + { + FT_UInt count; + FT_Short* read; + + + globals->memory = memory; + + /* copy standard widths */ + { + PSH_Dimension dim = &globals->dimension[1]; + PSH_Width write = dim->stdw.widths; + + + write->org = priv->standard_width[0]; + write++; + + read = priv->snap_widths; + for ( count = priv->num_snap_widths; count > 0; count-- ) + { + write->org = *read; + write++; + read++; + } + + dim->stdw.count = priv->num_snap_widths + 1; + } + + /* copy standard heights */ + { + PSH_Dimension dim = &globals->dimension[0]; + PSH_Width write = dim->stdw.widths; + + + write->org = priv->standard_height[0]; + write++; + read = priv->snap_heights; + for ( count = priv->num_snap_heights; count > 0; count-- ) + { + write->org = *read; + write++; + read++; + } + + dim->stdw.count = priv->num_snap_heights + 1; + } + + /* copy blue zones */ + psh_blues_set_zones( &globals->blues, priv->num_blue_values, + priv->blue_values, priv->num_other_blues, + priv->other_blues, priv->blue_fuzz, 0 ); + + psh_blues_set_zones( &globals->blues, priv->num_family_blues, + priv->family_blues, priv->num_family_other_blues, + priv->family_other_blues, priv->blue_fuzz, 1 ); + + /* limit the BlueScale value to `1 / max_of_blue_zone_heights' */ + { + FT_Fixed max_scale; + FT_Short max_height = 1; + + + max_height = psh_calc_max_height( priv->num_blue_values, + priv->blue_values, + max_height ); + max_height = psh_calc_max_height( priv->num_other_blues, + priv->other_blues, + max_height ); + max_height = psh_calc_max_height( priv->num_family_blues, + priv->family_blues, + max_height ); + max_height = psh_calc_max_height( priv->num_family_other_blues, + priv->family_other_blues, + max_height ); + + /* BlueScale is scaled 1000 times */ + max_scale = FT_DivFix( 1000, max_height ); + globals->blues.blue_scale = priv->blue_scale < max_scale + ? priv->blue_scale + : max_scale; + } + + globals->blues.blue_shift = priv->blue_shift; + globals->blues.blue_fuzz = priv->blue_fuzz; + + globals->dimension[0].scale_mult = 0; + globals->dimension[0].scale_delta = 0; + globals->dimension[1].scale_mult = 0; + globals->dimension[1].scale_delta = 0; + +#ifdef DEBUG_HINTER + ps_debug_globals = globals; +#endif + } + + *aglobals = globals; + return error; + } + + + FT_LOCAL_DEF( void ) + psh_globals_set_scale( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ) + { + PSH_Dimension dim; + + + dim = &globals->dimension[0]; + if ( x_scale != dim->scale_mult || + x_delta != dim->scale_delta ) + { + dim->scale_mult = x_scale; + dim->scale_delta = x_delta; + + psh_globals_scale_widths( globals, 0 ); + } + + dim = &globals->dimension[1]; + if ( y_scale != dim->scale_mult || + y_delta != dim->scale_delta ) + { + dim->scale_mult = y_scale; + dim->scale_delta = y_delta; + + psh_globals_scale_widths( globals, 1 ); + psh_blues_scale_zones( &globals->blues, y_scale, y_delta ); + } + } + + + FT_LOCAL_DEF( void ) + psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs ) + { + funcs->create = psh_globals_new; + funcs->set_scale = psh_globals_set_scale; + funcs->destroy = psh_globals_destroy; + } + + +/* END */ diff --git a/vendor/FreeType2/src/pshinter/pshglob.h b/vendor/FreeType2/src/pshinter/pshglob.h new file mode 100644 index 0000000..cf80bf4 --- /dev/null +++ b/vendor/FreeType2/src/pshinter/pshglob.h @@ -0,0 +1,196 @@ +/***************************************************************************/ +/* */ +/* pshglob.h */ +/* */ +/* PostScript hinter global hinting management. */ +/* */ +/* Copyright 2001-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef PSHGLOB_H_ +#define PSHGLOB_H_ + + +#include FT_FREETYPE_H +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLOBAL HINTS INTERNALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* @constant: */ + /* PS_GLOBALS_MAX_BLUE_ZONES */ + /* */ + /* @description: */ + /* The maximum number of blue zones in a font global hints structure. */ + /* See @PS_Globals_BluesRec. */ + /* */ +#define PS_GLOBALS_MAX_BLUE_ZONES 16 + + + /*************************************************************************/ + /* */ + /* @constant: */ + /* PS_GLOBALS_MAX_STD_WIDTHS */ + /* */ + /* @description: */ + /* The maximum number of standard and snap widths in either the */ + /* horizontal or vertical direction. See @PS_Globals_WidthsRec. */ + /* */ +#define PS_GLOBALS_MAX_STD_WIDTHS 16 + + + /* standard and snap width */ + typedef struct PSH_WidthRec_ + { + FT_Int org; + FT_Pos cur; + FT_Pos fit; + + } PSH_WidthRec, *PSH_Width; + + + /* standard and snap widths table */ + typedef struct PSH_WidthsRec_ + { + FT_UInt count; + PSH_WidthRec widths[PS_GLOBALS_MAX_STD_WIDTHS]; + + } PSH_WidthsRec, *PSH_Widths; + + + typedef struct PSH_DimensionRec_ + { + PSH_WidthsRec stdw; + FT_Fixed scale_mult; + FT_Fixed scale_delta; + + } PSH_DimensionRec, *PSH_Dimension; + + + /* blue zone descriptor */ + typedef struct PSH_Blue_ZoneRec_ + { + FT_Int org_ref; + FT_Int org_delta; + FT_Int org_top; + FT_Int org_bottom; + + FT_Pos cur_ref; + FT_Pos cur_delta; + FT_Pos cur_bottom; + FT_Pos cur_top; + + } PSH_Blue_ZoneRec, *PSH_Blue_Zone; + + + typedef struct PSH_Blue_TableRec_ + { + FT_UInt count; + PSH_Blue_ZoneRec zones[PS_GLOBALS_MAX_BLUE_ZONES]; + + } PSH_Blue_TableRec, *PSH_Blue_Table; + + + /* blue zones table */ + typedef struct PSH_BluesRec_ + { + PSH_Blue_TableRec normal_top; + PSH_Blue_TableRec normal_bottom; + PSH_Blue_TableRec family_top; + PSH_Blue_TableRec family_bottom; + + FT_Fixed blue_scale; + FT_Int blue_shift; + FT_Int blue_threshold; + FT_Int blue_fuzz; + FT_Bool no_overshoots; + + } PSH_BluesRec, *PSH_Blues; + + + /* font globals. */ + /* dimension 0 => X coordinates + vertical hints/stems */ + /* dimension 1 => Y coordinates + horizontal hints/stems */ + typedef struct PSH_GlobalsRec_ + { + FT_Memory memory; + PSH_DimensionRec dimension[2]; + PSH_BluesRec blues; + + } PSH_GlobalsRec; + + +#define PSH_BLUE_ALIGN_NONE 0 +#define PSH_BLUE_ALIGN_TOP 1 +#define PSH_BLUE_ALIGN_BOT 2 + + + typedef struct PSH_AlignmentRec_ + { + int align; + FT_Pos align_top; + FT_Pos align_bot; + + } PSH_AlignmentRec, *PSH_Alignment; + + + FT_LOCAL( void ) + psh_globals_funcs_init( PSH_Globals_FuncsRec* funcs ); + + +#if 0 + /* snap a stem width to fitter coordinates. `org_width' is in font */ + /* units. The result is in device pixels (26.6 format). */ + FT_LOCAL( FT_Pos ) + psh_dimension_snap_width( PSH_Dimension dimension, + FT_Int org_width ); +#endif + + FT_LOCAL( void ) + psh_globals_set_scale( PSH_Globals globals, + FT_Fixed x_scale, + FT_Fixed y_scale, + FT_Fixed x_delta, + FT_Fixed y_delta ); + + /* snap a stem to one or two blue zones */ + FT_LOCAL( void ) + psh_blues_snap_stem( PSH_Blues blues, + FT_Int stem_top, + FT_Int stem_bot, + PSH_Alignment alignment ); + /* */ + +#ifdef DEBUG_HINTER + extern PSH_Globals ps_debug_globals; +#endif + + +FT_END_HEADER + + +#endif /* PSHGLOB_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/pshinter/pshinter.c b/vendor/FreeType2/src/pshinter/pshinter.c new file mode 100644 index 0000000..0eedac4 --- /dev/null +++ b/vendor/FreeType2/src/pshinter/pshinter.c @@ -0,0 +1,29 @@ +/***************************************************************************/ +/* */ +/* pshinter.c */ +/* */ +/* FreeType PostScript Hinting module */ +/* */ +/* Copyright 2001-2018 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT +#include + +#include "pshalgo.c" +#include "pshglob.c" +#include "pshmod.c" +#include "pshpic.c" +#include "pshrec.c" + + +/* END */ diff --git a/vendor/FreeType2/src/pshinter/pshmod.c b/vendor/FreeType2/src/pshinter/pshmod.c new file mode 100644 index 0000000..0b8f6f9 --- /dev/null +++ b/vendor/FreeType2/src/pshinter/pshmod.c @@ -0,0 +1,121 @@ +/***************************************************************************/ +/* */ +/* pshmod.c */ +/* */ +/* FreeType PostScript hinter module implementation (body). */ +/* */ +/* Copyright 2001-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_OBJECTS_H +#include "pshrec.h" +#include "pshalgo.h" +#include "pshpic.h" + + + /* the Postscript Hinter module structure */ + typedef struct PS_Hinter_Module_Rec_ + { + FT_ModuleRec root; + PS_HintsRec ps_hints; + + PSH_Globals_FuncsRec globals_funcs; + T1_Hints_FuncsRec t1_funcs; + T2_Hints_FuncsRec t2_funcs; + + } PS_Hinter_ModuleRec, *PS_Hinter_Module; + + + /* finalize module */ + FT_CALLBACK_DEF( void ) + ps_hinter_done( PS_Hinter_Module module ) + { + module->t1_funcs.hints = NULL; + module->t2_funcs.hints = NULL; + + ps_hints_done( &module->ps_hints ); + } + + + /* initialize module, create hints recorder and the interface */ + FT_CALLBACK_DEF( FT_Error ) + ps_hinter_init( PS_Hinter_Module module ) + { + FT_Memory memory = module->root.memory; + void* ph = &module->ps_hints; + + + ps_hints_init( &module->ps_hints, memory ); + + psh_globals_funcs_init( &module->globals_funcs ); + + t1_hints_funcs_init( &module->t1_funcs ); + module->t1_funcs.hints = (T1_Hints)ph; + + t2_hints_funcs_init( &module->t2_funcs ); + module->t2_funcs.hints = (T2_Hints)ph; + + return 0; + } + + + /* returns global hints interface */ + FT_CALLBACK_DEF( PSH_Globals_Funcs ) + pshinter_get_globals_funcs( FT_Module module ) + { + return &((PS_Hinter_Module)module)->globals_funcs; + } + + + /* return Type 1 hints interface */ + FT_CALLBACK_DEF( T1_Hints_Funcs ) + pshinter_get_t1_funcs( FT_Module module ) + { + return &((PS_Hinter_Module)module)->t1_funcs; + } + + + /* return Type 2 hints interface */ + FT_CALLBACK_DEF( T2_Hints_Funcs ) + pshinter_get_t2_funcs( FT_Module module ) + { + return &((PS_Hinter_Module)module)->t2_funcs; + } + + + FT_DEFINE_PSHINTER_INTERFACE( + pshinter_interface, + + pshinter_get_globals_funcs, + pshinter_get_t1_funcs, + pshinter_get_t2_funcs + ) + + + FT_DEFINE_MODULE( + pshinter_module_class, + + 0, + sizeof ( PS_Hinter_ModuleRec ), + "pshinter", + 0x10000L, + 0x20000L, + + &PSHINTER_INTERFACE_GET, /* module-specific interface */ + + (FT_Module_Constructor)ps_hinter_init, /* module_init */ + (FT_Module_Destructor) ps_hinter_done, /* module_done */ + (FT_Module_Requester) NULL /* get_interface */ + ) + +/* END */ diff --git a/vendor/FreeType2/src/pshinter/pshmod.h b/vendor/FreeType2/src/pshinter/pshmod.h new file mode 100644 index 0000000..556de2f --- /dev/null +++ b/vendor/FreeType2/src/pshinter/pshmod.h @@ -0,0 +1,39 @@ +/***************************************************************************/ +/* */ +/* pshmod.h */ +/* */ +/* PostScript hinter module interface (specification). */ +/* */ +/* Copyright 2001-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef PSHMOD_H_ +#define PSHMOD_H_ + + +#include +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_MODULE( pshinter_module_class ) + + +FT_END_HEADER + + +#endif /* PSHMOD_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/pshinter/pshnterr.h b/vendor/FreeType2/src/pshinter/pshnterr.h new file mode 100644 index 0000000..b9d02d2 --- /dev/null +++ b/vendor/FreeType2/src/pshinter/pshnterr.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* pshnterr.h */ +/* */ +/* PS Hinter error codes (specification only). */ +/* */ +/* Copyright 2003-2018 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 file is used to define the PSHinter error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef PSHNTERR_H_ +#define PSHNTERR_H_ + +#include FT_MODULE_ERRORS_H + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX PSH_Err_ +#define FT_ERR_BASE FT_Mod_Err_PShinter + +#include FT_ERRORS_H + +#endif /* PSHNTERR_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/pshinter/pshpic.c b/vendor/FreeType2/src/pshinter/pshpic.c new file mode 100644 index 0000000..465ad31 --- /dev/null +++ b/vendor/FreeType2/src/pshinter/pshpic.c @@ -0,0 +1,76 @@ +/***************************************************************************/ +/* */ +/* pshpic.c */ +/* */ +/* The FreeType position independent code services for pshinter module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "pshpic.h" +#include "pshnterr.h" + + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from pshmod.c */ + void + FT_Init_Class_pshinter_interface( FT_Library library, + PSHinter_Interface* clazz ); + + void + pshinter_module_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + + + if ( pic_container->pshinter ) + { + FT_FREE( pic_container->pshinter ); + pic_container->pshinter = NULL; + } + } + + + FT_Error + pshinter_module_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + PSHinterPIC* container = NULL; + FT_Memory memory = library->memory; + + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof ( *container ) ); + pic_container->pshinter = container; + + /* add call to initialization function when you add new scripts */ + FT_Init_Class_pshinter_interface( + library, &container->pshinter_interface ); + + if ( error ) + pshinter_module_class_pic_free( library ); + + return error; + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/vendor/FreeType2/src/pshinter/pshpic.h b/vendor/FreeType2/src/pshinter/pshpic.h new file mode 100644 index 0000000..4469ba8 --- /dev/null +++ b/vendor/FreeType2/src/pshinter/pshpic.h @@ -0,0 +1,63 @@ +/***************************************************************************/ +/* */ +/* pshpic.h */ +/* */ +/* The FreeType position independent code services for pshinter module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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 PSHPIC_H_ +#define PSHPIC_H_ + + +#include FT_INTERNAL_PIC_H + + +#ifndef FT_CONFIG_OPTION_PIC + +#define PSHINTER_INTERFACE_GET pshinter_interface + +#else /* FT_CONFIG_OPTION_PIC */ + +#include FT_INTERNAL_POSTSCRIPT_HINTS_H + +FT_BEGIN_HEADER + + typedef struct PSHinterPIC_ + { + PSHinter_Interface pshinter_interface; + + } PSHinterPIC; + + +#define GET_PIC( lib ) ( (PSHinterPIC*)( (lib)->pic_container.pshinter ) ) + +#define PSHINTER_INTERFACE_GET ( GET_PIC( library )->pshinter_interface ) + + /* see pshpic.c for the implementation */ + void + pshinter_module_class_pic_free( FT_Library library ); + + FT_Error + pshinter_module_class_pic_init( FT_Library library ); + +FT_END_HEADER + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +#endif /* PSHPIC_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/pshinter/pshrec.c b/vendor/FreeType2/src/pshinter/pshrec.c new file mode 100644 index 0000000..6648d13 --- /dev/null +++ b/vendor/FreeType2/src/pshinter/pshrec.c @@ -0,0 +1,1220 @@ +/***************************************************************************/ +/* */ +/* pshrec.c */ +/* */ +/* FreeType PostScript hints recorder (body). */ +/* */ +/* Copyright 2001-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H + +#include "pshrec.h" +#include "pshalgo.h" + +#include "pshnterr.h" + +#undef FT_COMPONENT +#define FT_COMPONENT trace_pshrec + +#ifdef DEBUG_HINTER + PS_Hints ps_debug_hints = NULL; + int ps_debug_no_horz_hints = 0; + int ps_debug_no_vert_hints = 0; +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_HINT MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* destroy hints table */ + static void + ps_hint_table_done( PS_Hint_Table table, + FT_Memory memory ) + { + FT_FREE( table->hints ); + table->num_hints = 0; + table->max_hints = 0; + } + + + /* ensure that a table can contain "count" elements */ + static FT_Error + ps_hint_table_ensure( PS_Hint_Table table, + FT_UInt count, + FT_Memory memory ) + { + FT_UInt old_max = table->max_hints; + FT_UInt new_max = count; + FT_Error error = FT_Err_Ok; + + + if ( new_max > old_max ) + { + /* try to grow the table */ + new_max = FT_PAD_CEIL( new_max, 8 ); + if ( !FT_RENEW_ARRAY( table->hints, old_max, new_max ) ) + table->max_hints = new_max; + } + return error; + } + + + static FT_Error + ps_hint_table_alloc( PS_Hint_Table table, + FT_Memory memory, + PS_Hint *ahint ) + { + FT_Error error = FT_Err_Ok; + FT_UInt count; + PS_Hint hint = NULL; + + + count = table->num_hints; + count++; + + if ( count >= table->max_hints ) + { + error = ps_hint_table_ensure( table, count, memory ); + if ( error ) + goto Exit; + } + + hint = table->hints + count - 1; + hint->pos = 0; + hint->len = 0; + hint->flags = 0; + + table->num_hints = count; + + Exit: + *ahint = hint; + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_MASK MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* destroy mask */ + static void + ps_mask_done( PS_Mask mask, + FT_Memory memory ) + { + FT_FREE( mask->bytes ); + mask->num_bits = 0; + mask->max_bits = 0; + mask->end_point = 0; + } + + + /* ensure that a mask can contain "count" bits */ + static FT_Error + ps_mask_ensure( PS_Mask mask, + FT_UInt count, + FT_Memory memory ) + { + FT_UInt old_max = ( mask->max_bits + 7 ) >> 3; + FT_UInt new_max = ( count + 7 ) >> 3; + FT_Error error = FT_Err_Ok; + + + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 8 ); + if ( !FT_RENEW_ARRAY( mask->bytes, old_max, new_max ) ) + mask->max_bits = new_max * 8; + } + return error; + } + + + /* test a bit value in a given mask */ + static FT_Int + ps_mask_test_bit( PS_Mask mask, + FT_Int idx ) + { + if ( (FT_UInt)idx >= mask->num_bits ) + return 0; + + return mask->bytes[idx >> 3] & ( 0x80 >> ( idx & 7 ) ); + } + + + /* clear a given bit */ + static void + ps_mask_clear_bit( PS_Mask mask, + FT_UInt idx ) + { + FT_Byte* p; + + + if ( idx >= mask->num_bits ) + return; + + p = mask->bytes + ( idx >> 3 ); + p[0] = (FT_Byte)( p[0] & ~( 0x80 >> ( idx & 7 ) ) ); + } + + + /* set a given bit, possibly grow the mask */ + static FT_Error + ps_mask_set_bit( PS_Mask mask, + FT_UInt idx, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* p; + + + if ( idx >= mask->num_bits ) + { + error = ps_mask_ensure( mask, idx + 1, memory ); + if ( error ) + goto Exit; + + mask->num_bits = idx + 1; + } + + p = mask->bytes + ( idx >> 3 ); + p[0] = (FT_Byte)( p[0] | ( 0x80 >> ( idx & 7 ) ) ); + + Exit: + return error; + } + + + /* destroy mask table */ + static void + ps_mask_table_done( PS_Mask_Table table, + FT_Memory memory ) + { + FT_UInt count = table->max_masks; + PS_Mask mask = table->masks; + + + for ( ; count > 0; count--, mask++ ) + ps_mask_done( mask, memory ); + + FT_FREE( table->masks ); + table->num_masks = 0; + table->max_masks = 0; + } + + + /* ensure that a mask table can contain "count" masks */ + static FT_Error + ps_mask_table_ensure( PS_Mask_Table table, + FT_UInt count, + FT_Memory memory ) + { + FT_UInt old_max = table->max_masks; + FT_UInt new_max = count; + FT_Error error = FT_Err_Ok; + + + if ( new_max > old_max ) + { + new_max = FT_PAD_CEIL( new_max, 8 ); + if ( !FT_RENEW_ARRAY( table->masks, old_max, new_max ) ) + table->max_masks = new_max; + } + return error; + } + + + /* allocate a new mask in a table */ + static FT_Error + ps_mask_table_alloc( PS_Mask_Table table, + FT_Memory memory, + PS_Mask *amask ) + { + FT_UInt count; + FT_Error error = FT_Err_Ok; + PS_Mask mask = NULL; + + + count = table->num_masks; + count++; + + if ( count > table->max_masks ) + { + error = ps_mask_table_ensure( table, count, memory ); + if ( error ) + goto Exit; + } + + mask = table->masks + count - 1; + mask->num_bits = 0; + mask->end_point = 0; + table->num_masks = count; + + Exit: + *amask = mask; + return error; + } + + + /* return last hint mask in a table, create one if the table is empty */ + static FT_Error + ps_mask_table_last( PS_Mask_Table table, + FT_Memory memory, + PS_Mask *amask ) + { + FT_Error error = FT_Err_Ok; + FT_UInt count; + PS_Mask mask; + + + count = table->num_masks; + if ( count == 0 ) + { + error = ps_mask_table_alloc( table, memory, &mask ); + if ( error ) + goto Exit; + } + else + mask = table->masks + count - 1; + + Exit: + *amask = mask; + return error; + } + + + /* set a new mask to a given bit range */ + static FT_Error + ps_mask_table_set_bits( PS_Mask_Table table, + const FT_Byte* source, + FT_UInt bit_pos, + FT_UInt bit_count, + FT_Memory memory ) + { + FT_Error error; + PS_Mask mask; + + + error = ps_mask_table_last( table, memory, &mask ); + if ( error ) + goto Exit; + + error = ps_mask_ensure( mask, bit_count, memory ); + if ( error ) + goto Exit; + + mask->num_bits = bit_count; + + /* now, copy bits */ + { + FT_Byte* read = (FT_Byte*)source + ( bit_pos >> 3 ); + FT_Int rmask = 0x80 >> ( bit_pos & 7 ); + FT_Byte* write = mask->bytes; + FT_Int wmask = 0x80; + FT_Int val; + + + for ( ; bit_count > 0; bit_count-- ) + { + val = write[0] & ~wmask; + + if ( read[0] & rmask ) + val |= wmask; + + write[0] = (FT_Byte)val; + + rmask >>= 1; + if ( rmask == 0 ) + { + read++; + rmask = 0x80; + } + + wmask >>= 1; + if ( wmask == 0 ) + { + write++; + wmask = 0x80; + } + } + } + + Exit: + return error; + } + + + /* test whether two masks in a table intersect */ + static FT_Int + ps_mask_table_test_intersect( PS_Mask_Table table, + FT_UInt index1, + FT_UInt index2 ) + { + PS_Mask mask1 = table->masks + index1; + PS_Mask mask2 = table->masks + index2; + FT_Byte* p1 = mask1->bytes; + FT_Byte* p2 = mask2->bytes; + FT_UInt count1 = mask1->num_bits; + FT_UInt count2 = mask2->num_bits; + FT_UInt count; + + + count = FT_MIN( count1, count2 ); + for ( ; count >= 8; count -= 8 ) + { + if ( p1[0] & p2[0] ) + return 1; + + p1++; + p2++; + } + + if ( count == 0 ) + return 0; + + return ( p1[0] & p2[0] ) & ~( 0xFF >> count ); + } + + + /* merge two masks, used by ps_mask_table_merge_all */ + static FT_Error + ps_mask_table_merge( PS_Mask_Table table, + FT_UInt index1, + FT_UInt index2, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + + + /* swap index1 and index2 so that index1 < index2 */ + if ( index1 > index2 ) + { + FT_UInt temp; + + + temp = index1; + index1 = index2; + index2 = temp; + } + + if ( index1 < index2 && index2 < table->num_masks ) + { + /* we need to merge the bitsets of index1 and index2 with a */ + /* simple union */ + PS_Mask mask1 = table->masks + index1; + PS_Mask mask2 = table->masks + index2; + FT_UInt count1 = mask1->num_bits; + FT_UInt count2 = mask2->num_bits; + FT_Int delta; + + + if ( count2 > 0 ) + { + FT_UInt pos; + FT_Byte* read; + FT_Byte* write; + + + /* if "count2" is greater than "count1", we need to grow the */ + /* first bitset, and clear the highest bits */ + if ( count2 > count1 ) + { + error = ps_mask_ensure( mask1, count2, memory ); + if ( error ) + goto Exit; + + for ( pos = count1; pos < count2; pos++ ) + ps_mask_clear_bit( mask1, pos ); + } + + /* merge (unite) the bitsets */ + read = mask2->bytes; + write = mask1->bytes; + pos = ( count2 + 7 ) >> 3; + + for ( ; pos > 0; pos-- ) + { + write[0] = (FT_Byte)( write[0] | read[0] ); + write++; + read++; + } + } + + /* Now, remove "mask2" from the list. We need to keep the masks */ + /* sorted in order of importance, so move table elements. */ + mask2->num_bits = 0; + mask2->end_point = 0; + + /* number of masks to move */ + delta = (FT_Int)( table->num_masks - 1 - index2 ); + if ( delta > 0 ) + { + /* move to end of table for reuse */ + PS_MaskRec dummy = *mask2; + + + ft_memmove( mask2, + mask2 + 1, + (FT_UInt)delta * sizeof ( PS_MaskRec ) ); + + mask2[delta] = dummy; + } + + table->num_masks--; + } + else + FT_TRACE0(( "ps_mask_table_merge: ignoring invalid indices (%d,%d)\n", + index1, index2 )); + + Exit: + return error; + } + + + /* Try to merge all masks in a given table. This is used to merge */ + /* all counter masks into independent counter "paths". */ + /* */ + static FT_Error + ps_mask_table_merge_all( PS_Mask_Table table, + FT_Memory memory ) + { + FT_Int index1, index2; + FT_Error error = FT_Err_Ok; + + + /* both loops go down to 0, thus FT_Int for index1 and index2 */ + for ( index1 = (FT_Int)table->num_masks - 1; index1 > 0; index1-- ) + { + for ( index2 = index1 - 1; index2 >= 0; index2-- ) + { + if ( ps_mask_table_test_intersect( table, + (FT_UInt)index1, + (FT_UInt)index2 ) ) + { + error = ps_mask_table_merge( table, + (FT_UInt)index2, + (FT_UInt)index1, + memory ); + if ( error ) + goto Exit; + + break; + } + } + } + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_DIMENSION MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* finalize a given dimension */ + static void + ps_dimension_done( PS_Dimension dimension, + FT_Memory memory ) + { + ps_mask_table_done( &dimension->counters, memory ); + ps_mask_table_done( &dimension->masks, memory ); + ps_hint_table_done( &dimension->hints, memory ); + } + + + /* initialize a given dimension */ + static void + ps_dimension_init( PS_Dimension dimension ) + { + dimension->hints.num_hints = 0; + dimension->masks.num_masks = 0; + dimension->counters.num_masks = 0; + } + + +#if 0 + + /* set a bit at a given index in the current hint mask */ + static FT_Error + ps_dimension_set_mask_bit( PS_Dimension dim, + FT_UInt idx, + FT_Memory memory ) + { + PS_Mask mask; + FT_Error error = FT_Err_Ok; + + + /* get last hint mask */ + error = ps_mask_table_last( &dim->masks, memory, &mask ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( mask, idx, memory ); + + Exit: + return error; + } + +#endif + + /* set the end point in a mask, called from "End" & "Reset" methods */ + static void + ps_dimension_end_mask( PS_Dimension dim, + FT_UInt end_point ) + { + FT_UInt count = dim->masks.num_masks; + + + if ( count > 0 ) + { + PS_Mask mask = dim->masks.masks + count - 1; + + + mask->end_point = end_point; + } + } + + + /* set the end point in the current mask, then create a new empty one */ + /* (called by "Reset" method) */ + static FT_Error + ps_dimension_reset_mask( PS_Dimension dim, + FT_UInt end_point, + FT_Memory memory ) + { + PS_Mask mask; + + + /* end current mask */ + ps_dimension_end_mask( dim, end_point ); + + /* allocate new one */ + return ps_mask_table_alloc( &dim->masks, memory, &mask ); + } + + + /* set a new mask, called from the "T2Stem" method */ + static FT_Error + ps_dimension_set_mask_bits( PS_Dimension dim, + const FT_Byte* source, + FT_UInt source_pos, + FT_UInt source_bits, + FT_UInt end_point, + FT_Memory memory ) + { + FT_Error error; + + + /* reset current mask, if any */ + error = ps_dimension_reset_mask( dim, end_point, memory ); + if ( error ) + goto Exit; + + /* set bits in new mask */ + error = ps_mask_table_set_bits( &dim->masks, source, + source_pos, source_bits, memory ); + + Exit: + return error; + } + + + /* add a new single stem (called from "T1Stem" method) */ + static FT_Error + ps_dimension_add_t1stem( PS_Dimension dim, + FT_Int pos, + FT_Int len, + FT_Memory memory, + FT_Int *aindex ) + { + FT_Error error = FT_Err_Ok; + FT_UInt flags = 0; + + + /* detect ghost stem */ + if ( len < 0 ) + { + flags |= PS_HINT_FLAG_GHOST; + if ( len == -21 ) + { + flags |= PS_HINT_FLAG_BOTTOM; + pos += len; + } + len = 0; + } + + if ( aindex ) + *aindex = -1; + + /* now, lookup stem in the current hints table */ + { + PS_Mask mask; + FT_UInt idx; + FT_UInt max = dim->hints.num_hints; + PS_Hint hint = dim->hints.hints; + + + for ( idx = 0; idx < max; idx++, hint++ ) + { + if ( hint->pos == pos && hint->len == len ) + break; + } + + /* we need to create a new hint in the table */ + if ( idx >= max ) + { + error = ps_hint_table_alloc( &dim->hints, memory, &hint ); + if ( error ) + goto Exit; + + hint->pos = pos; + hint->len = len; + hint->flags = flags; + } + + /* now, store the hint in the current mask */ + error = ps_mask_table_last( &dim->masks, memory, &mask ); + if ( error ) + goto Exit; + + error = ps_mask_set_bit( mask, idx, memory ); + if ( error ) + goto Exit; + + if ( aindex ) + *aindex = (FT_Int)idx; + } + + Exit: + return error; + } + + + /* add a "hstem3/vstem3" counter to our dimension table */ + static FT_Error + ps_dimension_add_counter( PS_Dimension dim, + FT_Int hint1, + FT_Int hint2, + FT_Int hint3, + FT_Memory memory ) + { + FT_Error error = FT_Err_Ok; + FT_UInt count = dim->counters.num_masks; + PS_Mask counter = dim->counters.masks; + + + /* try to find an existing counter mask that already uses */ + /* one of these stems here */ + for ( ; count > 0; count--, counter++ ) + { + if ( ps_mask_test_bit( counter, hint1 ) || + ps_mask_test_bit( counter, hint2 ) || + ps_mask_test_bit( counter, hint3 ) ) + break; + } + + /* create a new counter when needed */ + if ( count == 0 ) + { + error = ps_mask_table_alloc( &dim->counters, memory, &counter ); + if ( error ) + goto Exit; + } + + /* now, set the bits for our hints in the counter mask */ + if ( hint1 >= 0 ) + { + error = ps_mask_set_bit( counter, (FT_UInt)hint1, memory ); + if ( error ) + goto Exit; + } + + if ( hint2 >= 0 ) + { + error = ps_mask_set_bit( counter, (FT_UInt)hint2, memory ); + if ( error ) + goto Exit; + } + + if ( hint3 >= 0 ) + { + error = ps_mask_set_bit( counter, (FT_UInt)hint3, memory ); + if ( error ) + goto Exit; + } + + Exit: + return error; + } + + + /* end of recording session for a given dimension */ + static FT_Error + ps_dimension_end( PS_Dimension dim, + FT_UInt end_point, + FT_Memory memory ) + { + /* end hint mask table */ + ps_dimension_end_mask( dim, end_point ); + + /* merge all counter masks into independent "paths" */ + return ps_mask_table_merge_all( &dim->counters, memory ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** PS_RECORDER MANAGEMENT *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /* destroy hints */ + FT_LOCAL( void ) + ps_hints_done( PS_Hints hints ) + { + FT_Memory memory = hints->memory; + + + ps_dimension_done( &hints->dimension[0], memory ); + ps_dimension_done( &hints->dimension[1], memory ); + + hints->error = FT_Err_Ok; + hints->memory = NULL; + } + + + FT_LOCAL( void ) + ps_hints_init( PS_Hints hints, + FT_Memory memory ) + { + FT_ZERO( hints ); + hints->memory = memory; + } + + + /* initialize a hints for a new session */ + static void + ps_hints_open( PS_Hints hints, + PS_Hint_Type hint_type ) + { + hints->error = FT_Err_Ok; + hints->hint_type = hint_type; + + ps_dimension_init( &hints->dimension[0] ); + ps_dimension_init( &hints->dimension[1] ); + } + + + /* add one or more stems to the current hints table */ + static void + ps_hints_stem( PS_Hints hints, + FT_UInt dimension, + FT_Int count, + FT_Long* stems ) + { + PS_Dimension dim; + + + if ( hints->error ) + return; + + /* limit "dimension" to 0..1 */ + if ( dimension > 1 ) + { + FT_TRACE0(( "ps_hints_stem: invalid dimension (%d) used\n", + dimension )); + dimension = ( dimension != 0 ); + } + + /* record the stems in the current hints/masks table */ + /* (Type 1 & 2's `hstem' or `vstem' operators) */ + dim = &hints->dimension[dimension]; + + for ( ; count > 0; count--, stems += 2 ) + { + FT_Error error; + FT_Memory memory = hints->memory; + + + error = ps_dimension_add_t1stem( dim, + (FT_Int)stems[0], + (FT_Int)stems[1], + memory, + NULL ); + if ( error ) + { + FT_ERROR(( "ps_hints_stem: could not add stem" + " (%d,%d) to hints table\n", stems[0], stems[1] )); + + hints->error = error; + return; + } + } + } + + + /* add one Type1 counter stem to the current hints table */ + static void + ps_hints_t1stem3( PS_Hints hints, + FT_UInt dimension, + FT_Fixed* stems ) + { + FT_Error error = FT_Err_Ok; + + + if ( !hints->error ) + { + PS_Dimension dim; + FT_Memory memory = hints->memory; + FT_Int count; + FT_Int idx[3]; + + + /* limit "dimension" to 0..1 */ + if ( dimension > 1 ) + { + FT_TRACE0(( "ps_hints_t1stem3: invalid dimension (%d) used\n", + dimension )); + dimension = ( dimension != 0 ); + } + + dim = &hints->dimension[dimension]; + + /* there must be 6 elements in the 'stem' array */ + if ( hints->hint_type == PS_HINT_TYPE_1 ) + { + /* add the three stems to our hints/masks table */ + for ( count = 0; count < 3; count++, stems += 2 ) + { + error = ps_dimension_add_t1stem( dim, + (FT_Int)FIXED_TO_INT( stems[0] ), + (FT_Int)FIXED_TO_INT( stems[1] ), + memory, &idx[count] ); + if ( error ) + goto Fail; + } + + /* now, add the hints to the counters table */ + error = ps_dimension_add_counter( dim, idx[0], idx[1], idx[2], + memory ); + if ( error ) + goto Fail; + } + else + { + FT_ERROR(( "ps_hints_t1stem3: called with invalid hint type\n" )); + error = FT_THROW( Invalid_Argument ); + goto Fail; + } + } + + return; + + Fail: + FT_ERROR(( "ps_hints_t1stem3: could not add counter stems to table\n" )); + hints->error = error; + } + + + /* reset hints (only with Type 1 hints) */ + static void + ps_hints_t1reset( PS_Hints hints, + FT_UInt end_point ) + { + FT_Error error = FT_Err_Ok; + + + if ( !hints->error ) + { + FT_Memory memory = hints->memory; + + + if ( hints->hint_type == PS_HINT_TYPE_1 ) + { + error = ps_dimension_reset_mask( &hints->dimension[0], + end_point, memory ); + if ( error ) + goto Fail; + + error = ps_dimension_reset_mask( &hints->dimension[1], + end_point, memory ); + if ( error ) + goto Fail; + } + else + { + /* invalid hint type */ + error = FT_THROW( Invalid_Argument ); + goto Fail; + } + } + return; + + Fail: + hints->error = error; + } + + + /* Type2 "hintmask" operator, add a new hintmask to each direction */ + static void + ps_hints_t2mask( PS_Hints hints, + FT_UInt end_point, + FT_UInt bit_count, + const FT_Byte* bytes ) + { + FT_Error error; + + + if ( !hints->error ) + { + PS_Dimension dim = hints->dimension; + FT_Memory memory = hints->memory; + FT_UInt count1 = dim[0].hints.num_hints; + FT_UInt count2 = dim[1].hints.num_hints; + + + /* check bit count; must be equal to current total hint count */ + if ( bit_count != count1 + count2 ) + { + FT_TRACE0(( "ps_hints_t2mask:" + " called with invalid bitcount %d (instead of %d)\n", + bit_count, count1 + count2 )); + + /* simply ignore the operator */ + return; + } + + /* set-up new horizontal and vertical hint mask now */ + error = ps_dimension_set_mask_bits( &dim[0], bytes, count2, count1, + end_point, memory ); + if ( error ) + goto Fail; + + error = ps_dimension_set_mask_bits( &dim[1], bytes, 0, count2, + end_point, memory ); + if ( error ) + goto Fail; + } + return; + + Fail: + hints->error = error; + } + + + static void + ps_hints_t2counter( PS_Hints hints, + FT_UInt bit_count, + const FT_Byte* bytes ) + { + FT_Error error; + + + if ( !hints->error ) + { + PS_Dimension dim = hints->dimension; + FT_Memory memory = hints->memory; + FT_UInt count1 = dim[0].hints.num_hints; + FT_UInt count2 = dim[1].hints.num_hints; + + + /* check bit count, must be equal to current total hint count */ + if ( bit_count != count1 + count2 ) + { + FT_TRACE0(( "ps_hints_t2counter:" + " called with invalid bitcount %d (instead of %d)\n", + bit_count, count1 + count2 )); + + /* simply ignore the operator */ + return; + } + + /* set-up new horizontal and vertical hint mask now */ + error = ps_dimension_set_mask_bits( &dim[0], bytes, 0, count1, + 0, memory ); + if ( error ) + goto Fail; + + error = ps_dimension_set_mask_bits( &dim[1], bytes, count1, count2, + 0, memory ); + if ( error ) + goto Fail; + } + return; + + Fail: + hints->error = error; + } + + + /* end recording session */ + static FT_Error + ps_hints_close( PS_Hints hints, + FT_UInt end_point ) + { + FT_Error error; + + + error = hints->error; + if ( !error ) + { + FT_Memory memory = hints->memory; + PS_Dimension dim = hints->dimension; + + + error = ps_dimension_end( &dim[0], end_point, memory ); + if ( !error ) + { + error = ps_dimension_end( &dim[1], end_point, memory ); + } + } + +#ifdef DEBUG_HINTER + if ( !error ) + ps_debug_hints = hints; +#endif + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 1 HINTS RECORDING INTERFACE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + t1_hints_open( T1_Hints hints ) + { + ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_1 ); + } + + static void + t1_hints_stem( T1_Hints hints, + FT_UInt dimension, + FT_Fixed* coords ) + { + FT_Pos stems[2]; + + + stems[0] = FIXED_TO_INT( coords[0] ); + stems[1] = FIXED_TO_INT( coords[1] ); + + ps_hints_stem( (PS_Hints)hints, dimension, 1, stems ); + } + + + FT_LOCAL_DEF( void ) + t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ) + { + FT_ZERO( funcs ); + + funcs->open = (T1_Hints_OpenFunc) t1_hints_open; + funcs->close = (T1_Hints_CloseFunc) ps_hints_close; + funcs->stem = (T1_Hints_SetStemFunc) t1_hints_stem; + funcs->stem3 = (T1_Hints_SetStem3Func)ps_hints_t1stem3; + funcs->reset = (T1_Hints_ResetFunc) ps_hints_t1reset; + funcs->apply = (T1_Hints_ApplyFunc) ps_hints_apply; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** TYPE 2 HINTS RECORDING INTERFACE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + static void + t2_hints_open( T2_Hints hints ) + { + ps_hints_open( (PS_Hints)hints, PS_HINT_TYPE_2 ); + } + + + static void + t2_hints_stems( T2_Hints hints, + FT_UInt dimension, + FT_Int count, + FT_Fixed* coords ) + { + FT_Pos stems[32], y; + FT_Int total = count, n; + + + y = 0; + while ( total > 0 ) + { + /* determine number of stems to write */ + count = total; + if ( count > 16 ) + count = 16; + + /* compute integer stem positions in font units */ + for ( n = 0; n < count * 2; n++ ) + { + y += coords[n]; + stems[n] = FIXED_TO_INT( y ); + } + + /* compute lengths */ + for ( n = 0; n < count * 2; n += 2 ) + stems[n + 1] = stems[n + 1] - stems[n]; + + /* add them to the current dimension */ + ps_hints_stem( (PS_Hints)hints, dimension, count, stems ); + + total -= count; + } + } + + + FT_LOCAL_DEF( void ) + t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ) + { + FT_ZERO( funcs ); + + funcs->open = (T2_Hints_OpenFunc) t2_hints_open; + funcs->close = (T2_Hints_CloseFunc) ps_hints_close; + funcs->stems = (T2_Hints_StemsFunc) t2_hints_stems; + funcs->hintmask= (T2_Hints_MaskFunc) ps_hints_t2mask; + funcs->counter = (T2_Hints_CounterFunc)ps_hints_t2counter; + funcs->apply = (T2_Hints_ApplyFunc) ps_hints_apply; + } + + +/* END */ diff --git a/vendor/FreeType2/src/pshinter/pshrec.h b/vendor/FreeType2/src/pshinter/pshrec.h new file mode 100644 index 0000000..7e3dfe0 --- /dev/null +++ b/vendor/FreeType2/src/pshinter/pshrec.h @@ -0,0 +1,172 @@ +/***************************************************************************/ +/* */ +/* pshrec.h */ +/* */ +/* Postscript (Type1/Type2) hints recorder (specification). */ +/* */ +/* Copyright 2001-2018 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. */ +/* */ +/***************************************************************************/ + + + /**************************************************************************/ + /* */ + /* The functions defined here are called from the Type 1, CID and CFF */ + /* font drivers to record the hints of a given character/glyph. */ + /* */ + /* The hints are recorded in a unified format, and are later processed */ + /* by the `optimizer' and `fitter' to adjust the outlines to the pixel */ + /* grid. */ + /* */ + /**************************************************************************/ + + +#ifndef PSHREC_H_ +#define PSHREC_H_ + + +#include +#include FT_INTERNAL_POSTSCRIPT_HINTS_H +#include "pshglob.h" + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GLYPH HINTS RECORDER INTERNALS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* handle to hint record */ + typedef struct PS_HintRec_* PS_Hint; + + /* hint types */ + typedef enum PS_Hint_Type_ + { + PS_HINT_TYPE_1 = 1, + PS_HINT_TYPE_2 = 2 + + } PS_Hint_Type; + + + /* hint flags */ +#define PS_HINT_FLAG_GHOST 1U +#define PS_HINT_FLAG_BOTTOM 2U + + + /* hint descriptor */ + typedef struct PS_HintRec_ + { + FT_Int pos; + FT_Int len; + FT_UInt flags; + + } PS_HintRec; + + +#define ps_hint_is_active( x ) ( (x)->flags & PS_HINT_FLAG_ACTIVE ) +#define ps_hint_is_ghost( x ) ( (x)->flags & PS_HINT_FLAG_GHOST ) +#define ps_hint_is_bottom( x ) ( (x)->flags & PS_HINT_FLAG_BOTTOM ) + + + /* hints table descriptor */ + typedef struct PS_Hint_TableRec_ + { + FT_UInt num_hints; + FT_UInt max_hints; + PS_Hint hints; + + } PS_Hint_TableRec, *PS_Hint_Table; + + + /* hint and counter mask descriptor */ + typedef struct PS_MaskRec_ + { + FT_UInt num_bits; + FT_UInt max_bits; + FT_Byte* bytes; + FT_UInt end_point; + + } PS_MaskRec, *PS_Mask; + + + /* masks and counters table descriptor */ + typedef struct PS_Mask_TableRec_ + { + FT_UInt num_masks; + FT_UInt max_masks; + PS_Mask masks; + + } PS_Mask_TableRec, *PS_Mask_Table; + + + /* dimension-specific hints descriptor */ + typedef struct PS_DimensionRec_ + { + PS_Hint_TableRec hints; + PS_Mask_TableRec masks; + PS_Mask_TableRec counters; + + } PS_DimensionRec, *PS_Dimension; + + + /* glyph hints descriptor */ + /* dimension 0 => X coordinates + vertical hints/stems */ + /* dimension 1 => Y coordinates + horizontal hints/stems */ + typedef struct PS_HintsRec_ + { + FT_Memory memory; + FT_Error error; + FT_UInt32 magic; + PS_Hint_Type hint_type; + PS_DimensionRec dimension[2]; + + } PS_HintsRec, *PS_Hints; + + /* */ + + /* initialize hints recorder */ + FT_LOCAL( void ) + ps_hints_init( PS_Hints hints, + FT_Memory memory ); + + /* finalize hints recorder */ + FT_LOCAL( void ) + ps_hints_done( PS_Hints hints ); + + /* initialize Type1 hints recorder interface */ + FT_LOCAL( void ) + t1_hints_funcs_init( T1_Hints_FuncsRec* funcs ); + + /* initialize Type2 hints recorder interface */ + FT_LOCAL( void ) + t2_hints_funcs_init( T2_Hints_FuncsRec* funcs ); + + +#ifdef DEBUG_HINTER + extern PS_Hints ps_debug_hints; + extern int ps_debug_no_horz_hints; + extern int ps_debug_no_vert_hints; +#endif + + /* */ + + +FT_END_HEADER + + +#endif /* PSHREC_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psnames/psmodule.c b/vendor/FreeType2/src/psnames/psmodule.c new file mode 100644 index 0000000..8929ebe --- /dev/null +++ b/vendor/FreeType2/src/psnames/psmodule.c @@ -0,0 +1,632 @@ +/***************************************************************************/ +/* */ +/* psmodule.c */ +/* */ +/* PSNames module implementation (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + +#include "psmodule.h" + + /* + * The file `pstables.h' with its arrays and its function + * `ft_get_adobe_glyph_index' is useful for other projects also (for + * example, `pdfium' is using it). However, if used as a C++ header, + * including it in two different source files makes it necessary to use + * `extern const' for the declaration of its arrays, otherwise the data + * would be duplicated as mandated by the C++ standard. + * + * For this reason, we use `DEFINE_PS_TABLES' to guard the function + * definitions, and `DEFINE_PS_TABLES_DATA' to provide both proper array + * declarations and definitions. + */ +#include "pstables.h" +#define DEFINE_PS_TABLES +#define DEFINE_PS_TABLES_DATA +#include "pstables.h" + +#include "psnamerr.h" +#include "pspic.h" + + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + +#define VARIANT_BIT 0x80000000UL +#define BASE_GLYPH( code ) ( (FT_UInt32)( (code) & ~VARIANT_BIT ) ) + + + /* Return the Unicode value corresponding to a given glyph. Note that */ + /* we do deal with glyph variants by detecting a non-initial dot in */ + /* the name, as in `A.swash' or `e.final'; in this case, the */ + /* VARIANT_BIT is set in the return value. */ + /* */ + static FT_UInt32 + ps_unicode_value( const char* glyph_name ) + { + /* If the name begins with `uni', then the glyph name may be a */ + /* hard-coded unicode character code. */ + if ( glyph_name[0] == 'u' && + glyph_name[1] == 'n' && + glyph_name[2] == 'i' ) + { + /* determine whether the next four characters following are */ + /* hexadecimal. */ + + /* XXX: Add code to deal with ligatures, i.e. glyph names like */ + /* `uniXXXXYYYYZZZZ'... */ + + FT_Int count; + FT_UInt32 value = 0; + const char* p = glyph_name + 3; + + + for ( count = 4; count > 0; count--, p++ ) + { + char c = *p; + unsigned int d; + + + d = (unsigned char)c - '0'; + if ( d >= 10 ) + { + d = (unsigned char)c - 'A'; + if ( d >= 6 ) + d = 16; + else + d += 10; + } + + /* Exit if a non-uppercase hexadecimal character was found */ + /* -- this also catches character codes below `0' since such */ + /* negative numbers cast to `unsigned int' are far too big. */ + if ( d >= 16 ) + break; + + value = ( value << 4 ) + d; + } + + /* there must be exactly four hex digits */ + if ( count == 0 ) + { + if ( *p == '\0' ) + return value; + if ( *p == '.' ) + return (FT_UInt32)( value | VARIANT_BIT ); + } + } + + /* If the name begins with `u', followed by four to six uppercase */ + /* hexadecimal digits, it is a hard-coded unicode character code. */ + if ( glyph_name[0] == 'u' ) + { + FT_Int count; + FT_UInt32 value = 0; + const char* p = glyph_name + 1; + + + for ( count = 6; count > 0; count--, p++ ) + { + char c = *p; + unsigned int d; + + + d = (unsigned char)c - '0'; + if ( d >= 10 ) + { + d = (unsigned char)c - 'A'; + if ( d >= 6 ) + d = 16; + else + d += 10; + } + + if ( d >= 16 ) + break; + + value = ( value << 4 ) + d; + } + + if ( count <= 2 ) + { + if ( *p == '\0' ) + return value; + if ( *p == '.' ) + return (FT_UInt32)( value | VARIANT_BIT ); + } + } + + /* Look for a non-initial dot in the glyph name in order to */ + /* find variants like `A.swash', `e.final', etc. */ + { + const char* p = glyph_name; + const char* dot = NULL; + + + for ( ; *p; p++ ) + { + if ( *p == '.' && p > glyph_name ) + { + dot = p; + break; + } + } + + /* now look up the glyph in the Adobe Glyph List */ + if ( !dot ) + return (FT_UInt32)ft_get_adobe_glyph_index( glyph_name, p ); + else + return (FT_UInt32)( ft_get_adobe_glyph_index( glyph_name, dot ) | + VARIANT_BIT ); + } + } + + + /* ft_qsort callback to sort the unicode map */ + FT_CALLBACK_DEF( int ) + compare_uni_maps( const void* a, + const void* b ) + { + PS_UniMap* map1 = (PS_UniMap*)a; + PS_UniMap* map2 = (PS_UniMap*)b; + FT_UInt32 unicode1 = BASE_GLYPH( map1->unicode ); + FT_UInt32 unicode2 = BASE_GLYPH( map2->unicode ); + + + /* sort base glyphs before glyph variants */ + if ( unicode1 == unicode2 ) + { + if ( map1->unicode > map2->unicode ) + return 1; + else if ( map1->unicode < map2->unicode ) + return -1; + else + return 0; + } + else + { + if ( unicode1 > unicode2 ) + return 1; + else if ( unicode1 < unicode2 ) + return -1; + else + return 0; + } + } + + + /* support for extra glyphs not handled (well) in AGL; */ + /* we add extra mappings for them if necessary */ + +#define EXTRA_GLYPH_LIST_SIZE 10 + + static const FT_UInt32 ft_extra_glyph_unicodes[EXTRA_GLYPH_LIST_SIZE] = + { + /* WGL 4 */ + 0x0394, + 0x03A9, + 0x2215, + 0x00AD, + 0x02C9, + 0x03BC, + 0x2219, + 0x00A0, + /* Romanian */ + 0x021A, + 0x021B + }; + + static const char ft_extra_glyph_names[] = + { + 'D','e','l','t','a',0, + 'O','m','e','g','a',0, + 'f','r','a','c','t','i','o','n',0, + 'h','y','p','h','e','n',0, + 'm','a','c','r','o','n',0, + 'm','u',0, + 'p','e','r','i','o','d','c','e','n','t','e','r','e','d',0, + 's','p','a','c','e',0, + 'T','c','o','m','m','a','a','c','c','e','n','t',0, + 't','c','o','m','m','a','a','c','c','e','n','t',0 + }; + + static const FT_Int + ft_extra_glyph_name_offsets[EXTRA_GLYPH_LIST_SIZE] = + { + 0, + 6, + 12, + 21, + 28, + 35, + 38, + 53, + 59, + 72 + }; + + + static void + ps_check_extra_glyph_name( const char* gname, + FT_UInt glyph, + FT_UInt* extra_glyphs, + FT_UInt *states ) + { + FT_UInt n; + + + for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) + { + if ( ft_strcmp( ft_extra_glyph_names + + ft_extra_glyph_name_offsets[n], gname ) == 0 ) + { + if ( states[n] == 0 ) + { + /* mark this extra glyph as a candidate for the cmap */ + states[n] = 1; + extra_glyphs[n] = glyph; + } + + return; + } + } + } + + + static void + ps_check_extra_glyph_unicode( FT_UInt32 uni_char, + FT_UInt *states ) + { + FT_UInt n; + + + for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) + { + if ( uni_char == ft_extra_glyph_unicodes[n] ) + { + /* disable this extra glyph from being added to the cmap */ + states[n] = 2; + + return; + } + } + } + + + /* Build a table that maps Unicode values to glyph indices. */ + static FT_Error + ps_unicodes_init( FT_Memory memory, + PS_Unicodes table, + FT_UInt num_glyphs, + PS_GetGlyphNameFunc get_glyph_name, + PS_FreeGlyphNameFunc free_glyph_name, + FT_Pointer glyph_data ) + { + FT_Error error; + + FT_UInt extra_glyph_list_states[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + FT_UInt extra_glyphs[EXTRA_GLYPH_LIST_SIZE]; + + + /* we first allocate the table */ + table->num_maps = 0; + table->maps = NULL; + + if ( !FT_NEW_ARRAY( table->maps, num_glyphs + EXTRA_GLYPH_LIST_SIZE ) ) + { + FT_UInt n; + FT_UInt count; + PS_UniMap* map; + FT_UInt32 uni_char; + + + map = table->maps; + + for ( n = 0; n < num_glyphs; n++ ) + { + const char* gname = get_glyph_name( glyph_data, n ); + + + if ( gname ) + { + ps_check_extra_glyph_name( gname, n, + extra_glyphs, extra_glyph_list_states ); + uni_char = ps_unicode_value( gname ); + + if ( BASE_GLYPH( uni_char ) != 0 ) + { + ps_check_extra_glyph_unicode( uni_char, + extra_glyph_list_states ); + map->unicode = uni_char; + map->glyph_index = n; + map++; + } + + if ( free_glyph_name ) + free_glyph_name( glyph_data, gname ); + } + } + + for ( n = 0; n < EXTRA_GLYPH_LIST_SIZE; n++ ) + { + if ( extra_glyph_list_states[n] == 1 ) + { + /* This glyph name has an additional representation. */ + /* Add it to the cmap. */ + + map->unicode = ft_extra_glyph_unicodes[n]; + map->glyph_index = extra_glyphs[n]; + map++; + } + } + + /* now compress the table a bit */ + count = (FT_UInt)( map - table->maps ); + + if ( count == 0 ) + { + /* No unicode chars here! */ + FT_FREE( table->maps ); + if ( !error ) + error = FT_THROW( No_Unicode_Glyph_Name ); + } + else + { + /* Reallocate if the number of used entries is much smaller. */ + if ( count < num_glyphs / 2 ) + { + (void)FT_RENEW_ARRAY( table->maps, num_glyphs, count ); + error = FT_Err_Ok; + } + + /* Sort the table in increasing order of unicode values, */ + /* taking care of glyph variants. */ + ft_qsort( table->maps, count, sizeof ( PS_UniMap ), + compare_uni_maps ); + } + + table->num_maps = count; + } + + return error; + } + + + static FT_UInt + ps_unicodes_char_index( PS_Unicodes table, + FT_UInt32 unicode ) + { + PS_UniMap *min, *max, *mid, *result = NULL; + + + /* Perform a binary search on the table. */ + + min = table->maps; + max = min + table->num_maps - 1; + + while ( min <= max ) + { + FT_UInt32 base_glyph; + + + mid = min + ( ( max - min ) >> 1 ); + + if ( mid->unicode == unicode ) + { + result = mid; + break; + } + + base_glyph = BASE_GLYPH( mid->unicode ); + + if ( base_glyph == unicode ) + result = mid; /* remember match but continue search for base glyph */ + + if ( min == max ) + break; + + if ( base_glyph < unicode ) + min = mid + 1; + else + max = mid - 1; + } + + if ( result ) + return result->glyph_index; + else + return 0; + } + + + static FT_UInt32 + ps_unicodes_char_next( PS_Unicodes table, + FT_UInt32 *unicode ) + { + FT_UInt result = 0; + FT_UInt32 char_code = *unicode + 1; + + + { + FT_UInt min = 0; + FT_UInt max = table->num_maps; + FT_UInt mid; + PS_UniMap* map; + FT_UInt32 base_glyph; + + + while ( min < max ) + { + mid = min + ( ( max - min ) >> 1 ); + map = table->maps + mid; + + if ( map->unicode == char_code ) + { + result = map->glyph_index; + goto Exit; + } + + base_glyph = BASE_GLYPH( map->unicode ); + + if ( base_glyph == char_code ) + result = map->glyph_index; + + if ( base_glyph < char_code ) + min = mid + 1; + else + max = mid; + } + + if ( result ) + goto Exit; /* we have a variant glyph */ + + /* we didn't find it; check whether we have a map just above it */ + char_code = 0; + + if ( min < table->num_maps ) + { + map = table->maps + min; + result = map->glyph_index; + char_code = BASE_GLYPH( map->unicode ); + } + } + + Exit: + *unicode = char_code; + return result; + } + + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + + static const char* + ps_get_macintosh_name( FT_UInt name_index ) + { + if ( name_index >= FT_NUM_MAC_NAMES ) + name_index = 0; + + return ft_standard_glyph_names + ft_mac_names[name_index]; + } + + + static const char* + ps_get_standard_strings( FT_UInt sid ) + { + if ( sid >= FT_NUM_SID_NAMES ) + return 0; + + return ft_standard_glyph_names + ft_sid_names[sid]; + } + + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + FT_DEFINE_SERVICE_PSCMAPSREC( + pscmaps_interface, + + (PS_Unicode_ValueFunc) ps_unicode_value, /* unicode_value */ + (PS_Unicodes_InitFunc) ps_unicodes_init, /* unicodes_init */ + (PS_Unicodes_CharIndexFunc)ps_unicodes_char_index, /* unicodes_char_index */ + (PS_Unicodes_CharNextFunc) ps_unicodes_char_next, /* unicodes_char_next */ + + (PS_Macintosh_NameFunc) ps_get_macintosh_name, /* macintosh_name */ + (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, /* adobe_std_strings */ + + t1_standard_encoding, /* adobe_std_encoding */ + t1_expert_encoding /* adobe_expert_encoding */ + ) + +#else + + FT_DEFINE_SERVICE_PSCMAPSREC( + pscmaps_interface, + + NULL, /* unicode_value */ + NULL, /* unicodes_init */ + NULL, /* unicodes_char_index */ + NULL, /* unicodes_char_next */ + + (PS_Macintosh_NameFunc) ps_get_macintosh_name, /* macintosh_name */ + (PS_Adobe_Std_StringsFunc) ps_get_standard_strings, /* adobe_std_strings */ + + t1_standard_encoding, /* adobe_std_encoding */ + t1_expert_encoding /* adobe_expert_encoding */ + ) + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + + FT_DEFINE_SERVICEDESCREC1( + pscmaps_services, + + FT_SERVICE_ID_POSTSCRIPT_CMAPS, &PSCMAPS_INTERFACE_GET ) + + + static FT_Pointer + psnames_get_service( FT_Module module, + const char* service_id ) + { + /* PSCMAPS_SERVICES_GET dereferences `library' in PIC mode */ +#ifdef FT_CONFIG_OPTION_PIC + FT_Library library; + + + if ( !module ) + return NULL; + library = module->library; + if ( !library ) + return NULL; +#else + FT_UNUSED( module ); +#endif + + return ft_service_list_lookup( PSCMAPS_SERVICES_GET, service_id ); + } + +#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + +#ifndef FT_CONFIG_OPTION_POSTSCRIPT_NAMES +#define PUT_PS_NAMES_SERVICE( a ) NULL +#else +#define PUT_PS_NAMES_SERVICE( a ) a +#endif + + FT_DEFINE_MODULE( + psnames_module_class, + + 0, /* this is not a font driver, nor a renderer */ + sizeof ( FT_ModuleRec ), + + "psnames", /* driver name */ + 0x10000L, /* driver version */ + 0x20000L, /* driver requires FreeType 2 or above */ + + PUT_PS_NAMES_SERVICE( + (void*)&PSCMAPS_INTERFACE_GET ), /* module specific interface */ + + (FT_Module_Constructor)NULL, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) PUT_PS_NAMES_SERVICE( psnames_get_service ) /* get_interface */ + ) + + +/* END */ diff --git a/vendor/FreeType2/src/psnames/psmodule.h b/vendor/FreeType2/src/psnames/psmodule.h new file mode 100644 index 0000000..3e94f8b --- /dev/null +++ b/vendor/FreeType2/src/psnames/psmodule.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* psmodule.h */ +/* */ +/* High-level PSNames module interface (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef PSMODULE_H_ +#define PSMODULE_H_ + + +#include +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_MODULE( psnames_module_class ) + + +FT_END_HEADER + +#endif /* PSMODULE_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psnames/psnamerr.h b/vendor/FreeType2/src/psnames/psnamerr.h new file mode 100644 index 0000000..14eb76c --- /dev/null +++ b/vendor/FreeType2/src/psnames/psnamerr.h @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* psnamerr.h */ +/* */ +/* PS names module error codes (specification only). */ +/* */ +/* Copyright 2001-2018 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 file is used to define the PS names module error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef PSNAMERR_H_ +#define PSNAMERR_H_ + +#include FT_MODULE_ERRORS_H + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX PSnames_Err_ +#define FT_ERR_BASE FT_Mod_Err_PSnames + +#include FT_ERRORS_H + +#endif /* PSNAMERR_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psnames/psnames.c b/vendor/FreeType2/src/psnames/psnames.c new file mode 100644 index 0000000..febb80d --- /dev/null +++ b/vendor/FreeType2/src/psnames/psnames.c @@ -0,0 +1,26 @@ +/***************************************************************************/ +/* */ +/* psnames.c */ +/* */ +/* FreeType PSNames module component (body only). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT +#include + +#include "psmodule.c" +#include "pspic.c" + + +/* END */ diff --git a/vendor/FreeType2/src/psnames/pspic.c b/vendor/FreeType2/src/psnames/pspic.c new file mode 100644 index 0000000..85a06f3 --- /dev/null +++ b/vendor/FreeType2/src/psnames/pspic.c @@ -0,0 +1,97 @@ +/***************************************************************************/ +/* */ +/* pspic.c */ +/* */ +/* The FreeType position independent code services for psnames module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "pspic.h" +#include "psnamerr.h" + + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from psmodule.c */ + FT_Error + FT_Create_Class_pscmaps_services( FT_Library library, + FT_ServiceDescRec** output_class ); + void + FT_Destroy_Class_pscmaps_services( FT_Library library, + FT_ServiceDescRec* clazz ); + + void + FT_Init_Class_pscmaps_interface( FT_Library library, + FT_Service_PsCMapsRec* clazz ); + + + void + psnames_module_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + + + if ( pic_container->psnames ) + { + PSModulePIC* container = (PSModulePIC*)pic_container->psnames; + + + if ( container->pscmaps_services ) + FT_Destroy_Class_pscmaps_services( library, + container->pscmaps_services ); + container->pscmaps_services = NULL; + FT_FREE( container ); + pic_container->psnames = NULL; + } + } + + + FT_Error + psnames_module_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + PSModulePIC* container = NULL; + FT_Memory memory = library->memory; + + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof ( *container ) ); + pic_container->psnames = container; + + /* initialize pointer table - */ + /* this is how the module usually expects this data */ + error = FT_Create_Class_pscmaps_services( + library, &container->pscmaps_services ); + if ( error ) + goto Exit; + FT_Init_Class_pscmaps_interface( library, + &container->pscmaps_interface ); + + Exit: + if ( error ) + psnames_module_class_pic_free( library ); + return error; + } + + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/vendor/FreeType2/src/psnames/pspic.h b/vendor/FreeType2/src/psnames/pspic.h new file mode 100644 index 0000000..889780c --- /dev/null +++ b/vendor/FreeType2/src/psnames/pspic.h @@ -0,0 +1,68 @@ +/***************************************************************************/ +/* */ +/* pspic.h */ +/* */ +/* The FreeType position independent code services for psnames module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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 PSPIC_H_ +#define PSPIC_H_ + + +#include FT_INTERNAL_PIC_H + + +#ifndef FT_CONFIG_OPTION_PIC + +#define PSCMAPS_SERVICES_GET pscmaps_services +#define PSCMAPS_INTERFACE_GET pscmaps_interface + +#else /* FT_CONFIG_OPTION_PIC */ + +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + + +FT_BEGIN_HEADER + + typedef struct PSModulePIC_ + { + FT_ServiceDescRec* pscmaps_services; + FT_Service_PsCMapsRec pscmaps_interface; + + } PSModulePIC; + + +#define GET_PIC( lib ) \ + ( (PSModulePIC*)((lib)->pic_container.psnames) ) +#define PSCMAPS_SERVICES_GET ( GET_PIC( library )->pscmaps_services ) +#define PSCMAPS_INTERFACE_GET ( GET_PIC( library )->pscmaps_interface ) + + + /* see pspic.c for the implementation */ + void + psnames_module_class_pic_free( FT_Library library ); + + FT_Error + psnames_module_class_pic_init( FT_Library library ); + +FT_END_HEADER + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +#endif /* PSPIC_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/psnames/pstables.h b/vendor/FreeType2/src/psnames/pstables.h new file mode 100644 index 0000000..79545ee --- /dev/null +++ b/vendor/FreeType2/src/psnames/pstables.h @@ -0,0 +1,4238 @@ +/***************************************************************************/ +/* */ +/* pstables.h */ +/* */ +/* PostScript glyph names. */ +/* */ +/* Copyright 2005-2018 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 file has been generated automatically -- do not edit! */ + + +#ifndef DEFINE_PS_TABLES_DATA +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const char ft_standard_glyph_names[3696] +#ifdef DEFINE_PS_TABLES_DATA + = + { + '.','n','u','l','l', 0, + 'n','o','n','m','a','r','k','i','n','g','r','e','t','u','r','n', 0, + 'n','o','t','e','q','u','a','l', 0, + 'i','n','f','i','n','i','t','y', 0, + 'l','e','s','s','e','q','u','a','l', 0, + 'g','r','e','a','t','e','r','e','q','u','a','l', 0, + 'p','a','r','t','i','a','l','d','i','f','f', 0, + 's','u','m','m','a','t','i','o','n', 0, + 'p','r','o','d','u','c','t', 0, + 'p','i', 0, + 'i','n','t','e','g','r','a','l', 0, + 'O','m','e','g','a', 0, + 'r','a','d','i','c','a','l', 0, + 'a','p','p','r','o','x','e','q','u','a','l', 0, + 'D','e','l','t','a', 0, + 'n','o','n','b','r','e','a','k','i','n','g','s','p','a','c','e', 0, + 'l','o','z','e','n','g','e', 0, + 'a','p','p','l','e', 0, + 'f','r','a','n','c', 0, + 'G','b','r','e','v','e', 0, + 'g','b','r','e','v','e', 0, + 'I','d','o','t','a','c','c','e','n','t', 0, + 'S','c','e','d','i','l','l','a', 0, + 's','c','e','d','i','l','l','a', 0, + 'C','a','c','u','t','e', 0, + 'c','a','c','u','t','e', 0, + 'C','c','a','r','o','n', 0, + 'c','c','a','r','o','n', 0, + 'd','c','r','o','a','t', 0, + '.','n','o','t','d','e','f', 0, + 's','p','a','c','e', 0, + 'e','x','c','l','a','m', 0, + 'q','u','o','t','e','d','b','l', 0, + 'n','u','m','b','e','r','s','i','g','n', 0, + 'd','o','l','l','a','r', 0, + 'p','e','r','c','e','n','t', 0, + 'a','m','p','e','r','s','a','n','d', 0, + 'q','u','o','t','e','r','i','g','h','t', 0, + 'p','a','r','e','n','l','e','f','t', 0, + 'p','a','r','e','n','r','i','g','h','t', 0, + 'a','s','t','e','r','i','s','k', 0, + 'p','l','u','s', 0, + 'c','o','m','m','a', 0, + 'h','y','p','h','e','n', 0, + 'p','e','r','i','o','d', 0, + 's','l','a','s','h', 0, + 'z','e','r','o', 0, + 'o','n','e', 0, + 't','w','o', 0, + 't','h','r','e','e', 0, + 'f','o','u','r', 0, + 'f','i','v','e', 0, + 's','i','x', 0, + 's','e','v','e','n', 0, + 'e','i','g','h','t', 0, + 'n','i','n','e', 0, + 'c','o','l','o','n', 0, + 's','e','m','i','c','o','l','o','n', 0, + 'l','e','s','s', 0, + 'e','q','u','a','l', 0, + 'g','r','e','a','t','e','r', 0, + 'q','u','e','s','t','i','o','n', 0, + 'a','t', 0, + 'A', 0, + 'B', 0, + 'C', 0, + 'D', 0, + 'E', 0, + 'F', 0, + 'G', 0, + 'H', 0, + 'I', 0, + 'J', 0, + 'K', 0, + 'L', 0, + 'M', 0, + 'N', 0, + 'O', 0, + 'P', 0, + 'Q', 0, + 'R', 0, + 'S', 0, + 'T', 0, + 'U', 0, + 'V', 0, + 'W', 0, + 'X', 0, + 'Y', 0, + 'Z', 0, + 'b','r','a','c','k','e','t','l','e','f','t', 0, + 'b','a','c','k','s','l','a','s','h', 0, + 'b','r','a','c','k','e','t','r','i','g','h','t', 0, + 'a','s','c','i','i','c','i','r','c','u','m', 0, + 'u','n','d','e','r','s','c','o','r','e', 0, + 'q','u','o','t','e','l','e','f','t', 0, + 'a', 0, + 'b', 0, + 'c', 0, + 'd', 0, + 'e', 0, + 'f', 0, + 'g', 0, + 'h', 0, + 'i', 0, + 'j', 0, + 'k', 0, + 'l', 0, + 'm', 0, + 'n', 0, + 'o', 0, + 'p', 0, + 'q', 0, + 'r', 0, + 's', 0, + 't', 0, + 'u', 0, + 'v', 0, + 'w', 0, + 'x', 0, + 'y', 0, + 'z', 0, + 'b','r','a','c','e','l','e','f','t', 0, + 'b','a','r', 0, + 'b','r','a','c','e','r','i','g','h','t', 0, + 'a','s','c','i','i','t','i','l','d','e', 0, + 'e','x','c','l','a','m','d','o','w','n', 0, + 'c','e','n','t', 0, + 's','t','e','r','l','i','n','g', 0, + 'f','r','a','c','t','i','o','n', 0, + 'y','e','n', 0, + 'f','l','o','r','i','n', 0, + 's','e','c','t','i','o','n', 0, + 'c','u','r','r','e','n','c','y', 0, + 'q','u','o','t','e','s','i','n','g','l','e', 0, + 'q','u','o','t','e','d','b','l','l','e','f','t', 0, + 'g','u','i','l','l','e','m','o','t','l','e','f','t', 0, + 'g','u','i','l','s','i','n','g','l','l','e','f','t', 0, + 'g','u','i','l','s','i','n','g','l','r','i','g','h','t', 0, + 'f','i', 0, + 'f','l', 0, + 'e','n','d','a','s','h', 0, + 'd','a','g','g','e','r', 0, + 'd','a','g','g','e','r','d','b','l', 0, + 'p','e','r','i','o','d','c','e','n','t','e','r','e','d', 0, + 'p','a','r','a','g','r','a','p','h', 0, + 'b','u','l','l','e','t', 0, + 'q','u','o','t','e','s','i','n','g','l','b','a','s','e', 0, + 'q','u','o','t','e','d','b','l','b','a','s','e', 0, + 'q','u','o','t','e','d','b','l','r','i','g','h','t', 0, + 'g','u','i','l','l','e','m','o','t','r','i','g','h','t', 0, + 'e','l','l','i','p','s','i','s', 0, + 'p','e','r','t','h','o','u','s','a','n','d', 0, + 'q','u','e','s','t','i','o','n','d','o','w','n', 0, + 'g','r','a','v','e', 0, + 'a','c','u','t','e', 0, + 'c','i','r','c','u','m','f','l','e','x', 0, + 't','i','l','d','e', 0, + 'm','a','c','r','o','n', 0, + 'b','r','e','v','e', 0, + 'd','o','t','a','c','c','e','n','t', 0, + 'd','i','e','r','e','s','i','s', 0, + 'r','i','n','g', 0, + 'c','e','d','i','l','l','a', 0, + 'h','u','n','g','a','r','u','m','l','a','u','t', 0, + 'o','g','o','n','e','k', 0, + 'c','a','r','o','n', 0, + 'e','m','d','a','s','h', 0, + 'A','E', 0, + 'o','r','d','f','e','m','i','n','i','n','e', 0, + 'L','s','l','a','s','h', 0, + 'O','s','l','a','s','h', 0, + 'O','E', 0, + 'o','r','d','m','a','s','c','u','l','i','n','e', 0, + 'a','e', 0, + 'd','o','t','l','e','s','s','i', 0, + 'l','s','l','a','s','h', 0, + 'o','s','l','a','s','h', 0, + 'o','e', 0, + 'g','e','r','m','a','n','d','b','l','s', 0, + 'o','n','e','s','u','p','e','r','i','o','r', 0, + 'l','o','g','i','c','a','l','n','o','t', 0, + 'm','u', 0, + 't','r','a','d','e','m','a','r','k', 0, + 'E','t','h', 0, + 'o','n','e','h','a','l','f', 0, + 'p','l','u','s','m','i','n','u','s', 0, + 'T','h','o','r','n', 0, + 'o','n','e','q','u','a','r','t','e','r', 0, + 'd','i','v','i','d','e', 0, + 'b','r','o','k','e','n','b','a','r', 0, + 'd','e','g','r','e','e', 0, + 't','h','o','r','n', 0, + 't','h','r','e','e','q','u','a','r','t','e','r','s', 0, + 't','w','o','s','u','p','e','r','i','o','r', 0, + 'r','e','g','i','s','t','e','r','e','d', 0, + 'm','i','n','u','s', 0, + 'e','t','h', 0, + 'm','u','l','t','i','p','l','y', 0, + 't','h','r','e','e','s','u','p','e','r','i','o','r', 0, + 'c','o','p','y','r','i','g','h','t', 0, + 'A','a','c','u','t','e', 0, + 'A','c','i','r','c','u','m','f','l','e','x', 0, + 'A','d','i','e','r','e','s','i','s', 0, + 'A','g','r','a','v','e', 0, + 'A','r','i','n','g', 0, + 'A','t','i','l','d','e', 0, + 'C','c','e','d','i','l','l','a', 0, + 'E','a','c','u','t','e', 0, + 'E','c','i','r','c','u','m','f','l','e','x', 0, + 'E','d','i','e','r','e','s','i','s', 0, + 'E','g','r','a','v','e', 0, + 'I','a','c','u','t','e', 0, + 'I','c','i','r','c','u','m','f','l','e','x', 0, + 'I','d','i','e','r','e','s','i','s', 0, + 'I','g','r','a','v','e', 0, + 'N','t','i','l','d','e', 0, + 'O','a','c','u','t','e', 0, + 'O','c','i','r','c','u','m','f','l','e','x', 0, + 'O','d','i','e','r','e','s','i','s', 0, + 'O','g','r','a','v','e', 0, + 'O','t','i','l','d','e', 0, + 'S','c','a','r','o','n', 0, + 'U','a','c','u','t','e', 0, + 'U','c','i','r','c','u','m','f','l','e','x', 0, + 'U','d','i','e','r','e','s','i','s', 0, + 'U','g','r','a','v','e', 0, + 'Y','a','c','u','t','e', 0, + 'Y','d','i','e','r','e','s','i','s', 0, + 'Z','c','a','r','o','n', 0, + 'a','a','c','u','t','e', 0, + 'a','c','i','r','c','u','m','f','l','e','x', 0, + 'a','d','i','e','r','e','s','i','s', 0, + 'a','g','r','a','v','e', 0, + 'a','r','i','n','g', 0, + 'a','t','i','l','d','e', 0, + 'c','c','e','d','i','l','l','a', 0, + 'e','a','c','u','t','e', 0, + 'e','c','i','r','c','u','m','f','l','e','x', 0, + 'e','d','i','e','r','e','s','i','s', 0, + 'e','g','r','a','v','e', 0, + 'i','a','c','u','t','e', 0, + 'i','c','i','r','c','u','m','f','l','e','x', 0, + 'i','d','i','e','r','e','s','i','s', 0, + 'i','g','r','a','v','e', 0, + 'n','t','i','l','d','e', 0, + 'o','a','c','u','t','e', 0, + 'o','c','i','r','c','u','m','f','l','e','x', 0, + 'o','d','i','e','r','e','s','i','s', 0, + 'o','g','r','a','v','e', 0, + 'o','t','i','l','d','e', 0, + 's','c','a','r','o','n', 0, + 'u','a','c','u','t','e', 0, + 'u','c','i','r','c','u','m','f','l','e','x', 0, + 'u','d','i','e','r','e','s','i','s', 0, + 'u','g','r','a','v','e', 0, + 'y','a','c','u','t','e', 0, + 'y','d','i','e','r','e','s','i','s', 0, + 'z','c','a','r','o','n', 0, + 'e','x','c','l','a','m','s','m','a','l','l', 0, + 'H','u','n','g','a','r','u','m','l','a','u','t','s','m','a','l','l', 0, + 'd','o','l','l','a','r','o','l','d','s','t','y','l','e', 0, + 'd','o','l','l','a','r','s','u','p','e','r','i','o','r', 0, + 'a','m','p','e','r','s','a','n','d','s','m','a','l','l', 0, + 'A','c','u','t','e','s','m','a','l','l', 0, + 'p','a','r','e','n','l','e','f','t','s','u','p','e','r','i','o','r', 0, + 'p','a','r','e','n','r','i','g','h','t','s','u','p','e','r','i','o','r', 0, + 't','w','o','d','o','t','e','n','l','e','a','d','e','r', 0, + 'o','n','e','d','o','t','e','n','l','e','a','d','e','r', 0, + 'z','e','r','o','o','l','d','s','t','y','l','e', 0, + 'o','n','e','o','l','d','s','t','y','l','e', 0, + 't','w','o','o','l','d','s','t','y','l','e', 0, + 't','h','r','e','e','o','l','d','s','t','y','l','e', 0, + 'f','o','u','r','o','l','d','s','t','y','l','e', 0, + 'f','i','v','e','o','l','d','s','t','y','l','e', 0, + 's','i','x','o','l','d','s','t','y','l','e', 0, + 's','e','v','e','n','o','l','d','s','t','y','l','e', 0, + 'e','i','g','h','t','o','l','d','s','t','y','l','e', 0, + 'n','i','n','e','o','l','d','s','t','y','l','e', 0, + 'c','o','m','m','a','s','u','p','e','r','i','o','r', 0, + 't','h','r','e','e','q','u','a','r','t','e','r','s','e','m','d','a','s','h', 0, + 'p','e','r','i','o','d','s','u','p','e','r','i','o','r', 0, + 'q','u','e','s','t','i','o','n','s','m','a','l','l', 0, + 'a','s','u','p','e','r','i','o','r', 0, + 'b','s','u','p','e','r','i','o','r', 0, + 'c','e','n','t','s','u','p','e','r','i','o','r', 0, + 'd','s','u','p','e','r','i','o','r', 0, + 'e','s','u','p','e','r','i','o','r', 0, + 'i','s','u','p','e','r','i','o','r', 0, + 'l','s','u','p','e','r','i','o','r', 0, + 'm','s','u','p','e','r','i','o','r', 0, + 'n','s','u','p','e','r','i','o','r', 0, + 'o','s','u','p','e','r','i','o','r', 0, + 'r','s','u','p','e','r','i','o','r', 0, + 's','s','u','p','e','r','i','o','r', 0, + 't','s','u','p','e','r','i','o','r', 0, + 'f','f', 0, + 'f','f','i', 0, + 'f','f','l', 0, + 'p','a','r','e','n','l','e','f','t','i','n','f','e','r','i','o','r', 0, + 'p','a','r','e','n','r','i','g','h','t','i','n','f','e','r','i','o','r', 0, + 'C','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'h','y','p','h','e','n','s','u','p','e','r','i','o','r', 0, + 'G','r','a','v','e','s','m','a','l','l', 0, + 'A','s','m','a','l','l', 0, + 'B','s','m','a','l','l', 0, + 'C','s','m','a','l','l', 0, + 'D','s','m','a','l','l', 0, + 'E','s','m','a','l','l', 0, + 'F','s','m','a','l','l', 0, + 'G','s','m','a','l','l', 0, + 'H','s','m','a','l','l', 0, + 'I','s','m','a','l','l', 0, + 'J','s','m','a','l','l', 0, + 'K','s','m','a','l','l', 0, + 'L','s','m','a','l','l', 0, + 'M','s','m','a','l','l', 0, + 'N','s','m','a','l','l', 0, + 'O','s','m','a','l','l', 0, + 'P','s','m','a','l','l', 0, + 'Q','s','m','a','l','l', 0, + 'R','s','m','a','l','l', 0, + 'S','s','m','a','l','l', 0, + 'T','s','m','a','l','l', 0, + 'U','s','m','a','l','l', 0, + 'V','s','m','a','l','l', 0, + 'W','s','m','a','l','l', 0, + 'X','s','m','a','l','l', 0, + 'Y','s','m','a','l','l', 0, + 'Z','s','m','a','l','l', 0, + 'c','o','l','o','n','m','o','n','e','t','a','r','y', 0, + 'o','n','e','f','i','t','t','e','d', 0, + 'r','u','p','i','a','h', 0, + 'T','i','l','d','e','s','m','a','l','l', 0, + 'e','x','c','l','a','m','d','o','w','n','s','m','a','l','l', 0, + 'c','e','n','t','o','l','d','s','t','y','l','e', 0, + 'L','s','l','a','s','h','s','m','a','l','l', 0, + 'S','c','a','r','o','n','s','m','a','l','l', 0, + 'Z','c','a','r','o','n','s','m','a','l','l', 0, + 'D','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'B','r','e','v','e','s','m','a','l','l', 0, + 'C','a','r','o','n','s','m','a','l','l', 0, + 'D','o','t','a','c','c','e','n','t','s','m','a','l','l', 0, + 'M','a','c','r','o','n','s','m','a','l','l', 0, + 'f','i','g','u','r','e','d','a','s','h', 0, + 'h','y','p','h','e','n','i','n','f','e','r','i','o','r', 0, + 'O','g','o','n','e','k','s','m','a','l','l', 0, + 'R','i','n','g','s','m','a','l','l', 0, + 'C','e','d','i','l','l','a','s','m','a','l','l', 0, + 'q','u','e','s','t','i','o','n','d','o','w','n','s','m','a','l','l', 0, + 'o','n','e','e','i','g','h','t','h', 0, + 't','h','r','e','e','e','i','g','h','t','h','s', 0, + 'f','i','v','e','e','i','g','h','t','h','s', 0, + 's','e','v','e','n','e','i','g','h','t','h','s', 0, + 'o','n','e','t','h','i','r','d', 0, + 't','w','o','t','h','i','r','d','s', 0, + 'z','e','r','o','s','u','p','e','r','i','o','r', 0, + 'f','o','u','r','s','u','p','e','r','i','o','r', 0, + 'f','i','v','e','s','u','p','e','r','i','o','r', 0, + 's','i','x','s','u','p','e','r','i','o','r', 0, + 's','e','v','e','n','s','u','p','e','r','i','o','r', 0, + 'e','i','g','h','t','s','u','p','e','r','i','o','r', 0, + 'n','i','n','e','s','u','p','e','r','i','o','r', 0, + 'z','e','r','o','i','n','f','e','r','i','o','r', 0, + 'o','n','e','i','n','f','e','r','i','o','r', 0, + 't','w','o','i','n','f','e','r','i','o','r', 0, + 't','h','r','e','e','i','n','f','e','r','i','o','r', 0, + 'f','o','u','r','i','n','f','e','r','i','o','r', 0, + 'f','i','v','e','i','n','f','e','r','i','o','r', 0, + 's','i','x','i','n','f','e','r','i','o','r', 0, + 's','e','v','e','n','i','n','f','e','r','i','o','r', 0, + 'e','i','g','h','t','i','n','f','e','r','i','o','r', 0, + 'n','i','n','e','i','n','f','e','r','i','o','r', 0, + 'c','e','n','t','i','n','f','e','r','i','o','r', 0, + 'd','o','l','l','a','r','i','n','f','e','r','i','o','r', 0, + 'p','e','r','i','o','d','i','n','f','e','r','i','o','r', 0, + 'c','o','m','m','a','i','n','f','e','r','i','o','r', 0, + 'A','g','r','a','v','e','s','m','a','l','l', 0, + 'A','a','c','u','t','e','s','m','a','l','l', 0, + 'A','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'A','t','i','l','d','e','s','m','a','l','l', 0, + 'A','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'A','r','i','n','g','s','m','a','l','l', 0, + 'A','E','s','m','a','l','l', 0, + 'C','c','e','d','i','l','l','a','s','m','a','l','l', 0, + 'E','g','r','a','v','e','s','m','a','l','l', 0, + 'E','a','c','u','t','e','s','m','a','l','l', 0, + 'E','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'E','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'I','g','r','a','v','e','s','m','a','l','l', 0, + 'I','a','c','u','t','e','s','m','a','l','l', 0, + 'I','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'I','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'E','t','h','s','m','a','l','l', 0, + 'N','t','i','l','d','e','s','m','a','l','l', 0, + 'O','g','r','a','v','e','s','m','a','l','l', 0, + 'O','a','c','u','t','e','s','m','a','l','l', 0, + 'O','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'O','t','i','l','d','e','s','m','a','l','l', 0, + 'O','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'O','E','s','m','a','l','l', 0, + 'O','s','l','a','s','h','s','m','a','l','l', 0, + 'U','g','r','a','v','e','s','m','a','l','l', 0, + 'U','a','c','u','t','e','s','m','a','l','l', 0, + 'U','c','i','r','c','u','m','f','l','e','x','s','m','a','l','l', 0, + 'U','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + 'Y','a','c','u','t','e','s','m','a','l','l', 0, + 'T','h','o','r','n','s','m','a','l','l', 0, + 'Y','d','i','e','r','e','s','i','s','s','m','a','l','l', 0, + '0','0','1','.','0','0','0', 0, + '0','0','1','.','0','0','1', 0, + '0','0','1','.','0','0','2', 0, + '0','0','1','.','0','0','3', 0, + 'B','l','a','c','k', 0, + 'B','o','l','d', 0, + 'B','o','o','k', 0, + 'L','i','g','h','t', 0, + 'M','e','d','i','u','m', 0, + 'R','e','g','u','l','a','r', 0, + 'R','o','m','a','n', 0, + 'S','e','m','i','b','o','l','d', 0, + } +#endif /* DEFINE_PS_TABLES_DATA */ + ; + + +#define FT_NUM_MAC_NAMES 258 + + /* Values are offsets into the `ft_standard_glyph_names' table */ + +#ifndef DEFINE_PS_TABLES_DATA +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const short ft_mac_names[FT_NUM_MAC_NAMES] +#ifdef DEFINE_PS_TABLES_DATA + = + { + 253, 0, 6, 261, 267, 274, 283, 294, 301, 309, 758, 330, 340, 351, + 360, 365, 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, + 436, 441, 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, + 500, 502, 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, + 528, 530, 532, 534, 536, 538, 540, 552, 562, 575, 587, 979, 608, 610, + 612, 614, 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, + 640, 642, 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, + 1375,1392,1405,1414,1486,1512,1562,1603,1632,1610,1622,1645,1639,1652, + 1661,1690,1668,1680,1697,1726,1704,1716,1733,1740,1769,1747,1759,1776, + 1790,1819,1797,1809, 839,1263, 707, 712, 741, 881, 871,1160,1302,1346, + 1197, 985,1031, 23,1086,1108, 32,1219, 41, 51, 730,1194, 64, 76, + 86, 94, 97,1089,1118, 106,1131,1150, 966, 696,1183, 112, 734, 120, + 132, 783, 930, 945, 138,1385,1398,1529,1115,1157, 832,1079, 770, 916, + 598, 319,1246, 155,1833,1586, 721, 749, 797, 811, 826, 829, 846, 856, + 888, 903, 954,1363,1421,1356,1433,1443,1450,1457,1469,1479,1493,1500, + 163,1522,1543,1550,1572,1134, 991,1002,1008,1015,1021,1040,1045,1053, + 1066,1073,1101,1143,1536,1783,1596,1843,1253,1207,1319,1579,1826,1229, + 1270,1313,1323,1171,1290,1332,1211,1235,1276, 169, 175, 182, 189, 200, + 209, 218, 225, 232, 239, 246 + } +#endif /* DEFINE_PS_TABLES_DATA */ + ; + + +#define FT_NUM_SID_NAMES 391 + + /* Values are offsets into the `ft_standard_glyph_names' table */ + +#ifndef DEFINE_PS_TABLES_DATA +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const short ft_sid_names[FT_NUM_SID_NAMES] +#ifdef DEFINE_PS_TABLES_DATA + = + { + 253, 261, 267, 274, 283, 294, 301, 309, 319, 330, 340, 351, 360, 365, + 371, 378, 385, 391, 396, 400, 404, 410, 415, 420, 424, 430, 436, 441, + 447, 457, 462, 468, 476, 485, 488, 490, 492, 494, 496, 498, 500, 502, + 504, 506, 508, 510, 512, 514, 516, 518, 520, 522, 524, 526, 528, 530, + 532, 534, 536, 538, 540, 552, 562, 575, 587, 598, 608, 610, 612, 614, + 616, 618, 620, 622, 624, 626, 628, 630, 632, 634, 636, 638, 640, 642, + 644, 646, 648, 650, 652, 654, 656, 658, 660, 670, 674, 685, 696, 707, + 712, 721, 730, 734, 741, 749, 758, 770, 783, 797, 811, 826, 829, 832, + 839, 846, 856, 871, 881, 888, 903, 916, 930, 945, 954, 966, 979, 985, + 991,1002,1008,1015,1021,1031,1040,1045,1053,1066,1073,1079,1086,1089, + 1101,1108,1115,1118,1131,1134,1143,1150,1157,1160,1171,1183,1194,1197, + 1207,1211,1219,1229,1235,1246,1253,1263,1270,1276,1290,1302,1313,1319, + 1323,1332,1346,1356,1363,1375,1385,1392,1398,1405,1414,1421,1433,1443, + 1450,1457,1469,1479,1486,1493,1500,1512,1522,1529,1536,1543,1550,1562, + 1572,1579,1586,1596,1603,1610,1622,1632,1639,1645,1652,1661,1668,1680, + 1690,1697,1704,1716,1726,1733,1740,1747,1759,1769,1776,1783,1790,1797, + 1809,1819,1826,1833,1843,1850,1862,1880,1895,1910,1925,1936,1954,1973, + 1988,2003,2016,2028,2040,2054,2067,2080,2092,2106,2120,2133,2147,2167, + 2182,2196,2206,2216,2229,2239,2249,2259,2269,2279,2289,2299,2309,2319, + 2329,2332,2336,2340,2358,2377,2393,2408,2419,2426,2433,2440,2447,2454, + 2461,2468,2475,2482,2489,2496,2503,2510,2517,2524,2531,2538,2545,2552, + 2559,2566,2573,2580,2587,2594,2601,2615,2625,2632,2643,2659,2672,2684, + 2696,2708,2722,2733,2744,2759,2771,2782,2797,2809,2819,2832,2850,2860, + 2873,2885,2898,2907,2917,2930,2943,2956,2968,2982,2996,3009,3022,3034, + 3046,3060,3073,3086,3098,3112,3126,3139,3152,3167,3182,3196,3208,3220, + 3237,3249,3264,3275,3283,3297,3309,3321,3338,3353,3365,3377,3394,3409, + 3418,3430,3442,3454,3471,3483,3498,3506,3518,3530,3542,3559,3574,3586, + 3597,3612,3620,3628,3636,3644,3650,3655,3660,3666,3673,3681,3687 + } +#endif /* DEFINE_PS_TABLES_DATA */ + ; + + + /* the following are indices into the SID name table */ +#ifndef DEFINE_PS_TABLES_DATA +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const unsigned short t1_standard_encoding[256] +#ifdef DEFINE_PS_TABLES_DATA + = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, + 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 96, 97, 98, 99,100,101,102,103,104,105,106,107,108,109,110, + 0,111,112,113,114, 0,115,116,117,118,119,120,121,122, 0,123, + 0,124,125,126,127,128,129,130,131, 0,132,133, 0,134,135,136, + 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,138, 0,139, 0, 0, 0, 0,140,141,142,143, 0, 0, 0, 0, + 0,144, 0, 0, 0,145, 0, 0,146,147,148,149, 0, 0, 0, 0 + } +#endif /* DEFINE_PS_TABLES_DATA */ + ; + + + /* the following are indices into the SID name table */ +#ifndef DEFINE_PS_TABLES_DATA +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const unsigned short t1_expert_encoding[256] +#ifdef DEFINE_PS_TABLES_DATA + = + { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1,229,230, 0,231,232,233,234,235,236,237,238, 13, 14, 15, 99, + 239,240,241,242,243,244,245,246,247,248, 27, 28,249,250,251,252, + 0,253,254,255,256,257, 0, 0, 0,258, 0, 0,259,260,261,262, + 0, 0,263,264,265, 0,266,109,110,267,268,269, 0,270,271,272, + 273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288, + 289,290,291,292,293,294,295,296,297,298,299,300,301,302,303, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,304,305,306, 0, 0,307,308,309,310,311, 0,312, 0, 0,313, + 0, 0,314,315, 0, 0,316,317,318, 0, 0, 0,158,155,163,319, + 320,321,322,323,324,325, 0, 0,326,150,164,169,327,328,329,330, + 331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346, + 347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362, + 363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378 + } +#endif /* DEFINE_PS_TABLES_DATA */ + ; + + + /* + * This table is a compressed version of the Adobe Glyph List (AGL), + * optimized for efficient searching. It has been generated by the + * `glnames.py' python script located in the `src/tools' directory. + * + * The lookup function to get the Unicode value for a given string + * is defined below the table. + */ + +#ifdef FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + +#ifndef DEFINE_PS_TABLES_DATA +#ifdef __cplusplus + extern "C" +#else + extern +#endif +#endif + const unsigned char ft_adobe_glyph_list[55997L] +#ifdef DEFINE_PS_TABLES_DATA + = + { + 0, 52, 0,106, 2,167, 3, 63, 4,220, 6,125, 9,143, 10, 23, + 11,137, 12,199, 14,246, 15, 87, 16,233, 17,219, 18,104, 19, 88, + 22,110, 23, 32, 23, 71, 24, 77, 27,156, 29, 73, 31,247, 32,107, + 32,222, 33, 55, 34,154, 35,218, 58, 10, 64,122, 72,188, 80,109, + 88,104, 93, 61, 98,168,106, 91,114,111,115,237,122,180,127,255, + 135,164,143,132,149,213,158,108,161,115,168,175,183,147,197,199, + 202, 25,204,166,208,209,209, 81,215, 26, 65,143, 0, 65, 0,140, + 0,175, 0,193, 1, 15, 1,147, 1,233, 1,251, 2, 7, 2, 40, + 2, 57, 2, 82, 2, 91, 2,128, 2,136, 2,154, 69,131, 0,198, + 0,150, 0,158, 0,167,225,227,245,244,101,128, 1,252,237,225, + 227,242,239,110,128, 1,226,243,237,225,236,108,128,247,230,225, + 227,245,244,101,129, 0,193, 0,185,243,237,225,236,108,128,247, + 225,226,242,229,246,101,134, 1, 2, 0,213, 0,221, 0,232, 0, + 243, 0,251, 1, 7,225,227,245,244,101,128, 30,174,227,249,242, + 233,236,236,233, 99,128, 4,208,228,239,244,226,229,236,239,119, + 128, 30,182,231,242,225,246,101,128, 30,176,232,239,239,235,225, + 226,239,246,101,128, 30,178,244,233,236,228,101,128, 30,180, 99, + 4, 1, 25, 1, 32, 1,121, 1,137,225,242,239,110,128, 1,205, + 233,242, 99, 2, 1, 40, 1, 45,236,101,128, 36,182,245,237,230, + 236,229,120,134, 0,194, 1, 66, 1, 74, 1, 85, 1, 93, 1,105, + 1,113,225,227,245,244,101,128, 30,164,228,239,244,226,229,236, + 239,119,128, 30,172,231,242,225,246,101,128, 30,166,232,239,239, + 235,225,226,239,246,101,128, 30,168,243,237,225,236,108,128,247, + 226,244,233,236,228,101,128, 30,170,245,244,101,129,246,201, 1, + 129,243,237,225,236,108,128,247,180,249,242,233,236,236,233, 99, + 128, 4, 16,100, 3, 1,155, 1,165, 1,209,226,236,231,242,225, + 246,101,128, 2, 0,233,229,242,229,243,233,115,131, 0,196, 1, + 181, 1,192, 1,201,227,249,242,233,236,236,233, 99,128, 4,210, + 237,225,227,242,239,110,128, 1,222,243,237,225,236,108,128,247, + 228,239,116, 2, 1,216, 1,224,226,229,236,239,119,128, 30,160, + 237,225,227,242,239,110,128, 1,224,231,242,225,246,101,129, 0, + 192, 1,243,243,237,225,236,108,128,247,224,232,239,239,235,225, + 226,239,246,101,128, 30,162,105, 2, 2, 13, 2, 25,229,227,249, + 242,233,236,236,233, 99,128, 4,212,238,246,229,242,244,229,228, + 226,242,229,246,101,128, 2, 2,236,240,232, 97,129, 3,145, 2, + 49,244,239,238,239,115,128, 3,134,109, 2, 2, 63, 2, 71,225, + 227,242,239,110,128, 1, 0,239,238,239,243,240,225,227,101,128, + 255, 33,239,231,239,238,229,107,128, 1, 4,242,233,238,103,131, + 0,197, 2,104, 2,112, 2,120,225,227,245,244,101,128, 1,250, + 226,229,236,239,119,128, 30, 0,243,237,225,236,108,128,247,229, + 243,237,225,236,108,128,247, 97,244,233,236,228,101,129, 0,195, + 2,146,243,237,225,236,108,128,247,227,249,226,225,242,237,229, + 238,233,225,110,128, 5, 49, 66,137, 0, 66, 2,189, 2,198, 2, + 223, 3, 3, 3, 10, 3, 22, 3, 34, 3, 46, 3, 54,227,233,242, + 227,236,101,128, 36,183,228,239,116, 2, 2,206, 2,215,225,227, + 227,229,238,116,128, 30, 2,226,229,236,239,119,128, 30, 4,101, + 3, 2,231, 2,242, 2,254,227,249,242,233,236,236,233, 99,128, + 4, 17,238,225,242,237,229,238,233,225,110,128, 5, 50,244, 97, + 128, 3,146,232,239,239,107,128, 1,129,236,233,238,229,226,229, + 236,239,119,128, 30, 6,237,239,238,239,243,240,225,227,101,128, + 255, 34,242,229,246,229,243,237,225,236,108,128,246,244,243,237, + 225,236,108,128,247, 98,244,239,240,226,225,114,128, 1,130, 67, + 137, 0, 67, 3, 85, 3,127, 3,193, 3,210, 3,224, 4,171, 4, + 188, 4,200, 4,212, 97, 3, 3, 93, 3,104, 3,111,225,242,237, + 229,238,233,225,110,128, 5, 62,227,245,244,101,128, 1, 6,242, + 239,110,129,246,202, 3,119,243,237,225,236,108,128,246,245, 99, + 3, 3,135, 3,142, 3,171,225,242,239,110,128, 1, 12,229,228, + 233,236,236, 97,130, 0,199, 3,155, 3,163,225,227,245,244,101, + 128, 30, 8,243,237,225,236,108,128,247,231,233,242, 99, 2, 3, + 179, 3,184,236,101,128, 36,184,245,237,230,236,229,120,128, 1, + 8,228,239,116,129, 1, 10, 3,201,225,227,227,229,238,116,128, + 1, 10,229,228,233,236,236,225,243,237,225,236,108,128,247,184, + 104, 4, 3,234, 3,246, 4,161, 4,165,225,225,242,237,229,238, + 233,225,110,128, 5, 73,101, 6, 4, 4, 4, 24, 4, 35, 4,103, + 4,115, 4,136,225,226,235,232,225,243,233,225,238,227,249,242, + 233,236,236,233, 99,128, 4,188,227,249,242,233,236,236,233, 99, + 128, 4, 39,100, 2, 4, 41, 4, 85,229,243,227,229,238,228,229, + 114, 2, 4, 54, 4, 74,225,226,235,232,225,243,233,225,238,227, + 249,242,233,236,236,233, 99,128, 4,190,227,249,242,233,236,236, + 233, 99,128, 4,182,233,229,242,229,243,233,243,227,249,242,233, + 236,236,233, 99,128, 4,244,232,225,242,237,229,238,233,225,110, + 128, 5, 67,235,232,225,235,225,243,243,233,225,238,227,249,242, + 233,236,236,233, 99,128, 4,203,246,229,242,244,233,227,225,236, + 243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4, + 184,105,128, 3,167,239,239,107,128, 1,135,233,242,227,245,237, + 230,236,229,248,243,237,225,236,108,128,246,246,237,239,238,239, + 243,240,225,227,101,128,255, 35,239,225,242,237,229,238,233,225, + 110,128, 5, 81,243,237,225,236,108,128,247, 99, 68,142, 0, 68, + 4,252, 5, 10, 5, 36, 5, 96, 5,121, 5,166, 5,173, 5,231, + 5,244, 6, 0, 6, 12, 6, 28, 6, 48, 6, 57, 90,129, 1,241, + 5, 2,227,225,242,239,110,128, 1,196, 97, 2, 5, 16, 5, 27, + 225,242,237,229,238,233,225,110,128, 5, 52,230,242,233,227,225, + 110,128, 1,137, 99, 4, 5, 46, 5, 53, 5, 62, 5, 89,225,242, + 239,110,128, 1, 14,229,228,233,236,236, 97,128, 30, 16,233,242, + 99, 2, 5, 70, 5, 75,236,101,128, 36,185,245,237,230,236,229, + 248,226,229,236,239,119,128, 30, 18,242,239,225,116,128, 1, 16, + 228,239,116, 2, 5,104, 5,113,225,227,227,229,238,116,128, 30, + 10,226,229,236,239,119,128, 30, 12,101, 3, 5,129, 5,140, 5, + 150,227,249,242,233,236,236,233, 99,128, 4, 20,233,227,239,240, + 244,233, 99,128, 3,238,236,244, 97,129, 34, 6, 5,158,231,242, + 229,229,107,128, 3,148,232,239,239,107,128, 1,138,105, 2, 5, + 179, 5,218,229,242,229,243,233,115,131,246,203, 5,194, 5,202, + 5,210,193,227,245,244,101,128,246,204,199,242,225,246,101,128, + 246,205,243,237,225,236,108,128,247,168,231,225,237,237,225,231, + 242,229,229,107,128, 3,220,234,229,227,249,242,233,236,236,233, + 99,128, 4, 2,236,233,238,229,226,229,236,239,119,128, 30, 14, + 237,239,238,239,243,240,225,227,101,128,255, 36,239,244,225,227, + 227,229,238,244,243,237,225,236,108,128,246,247,115, 2, 6, 34, + 6, 41,236,225,243,104,128, 1, 16,237,225,236,108,128,247,100, + 244,239,240,226,225,114,128, 1,139,122,131, 1,242, 6, 67, 6, + 75, 6,112,227,225,242,239,110,128, 1,197,101, 2, 6, 81, 6, + 101,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236, + 233, 99,128, 4,224,227,249,242,233,236,236,233, 99,128, 4, 5, + 232,229,227,249,242,233,236,236,233, 99,128, 4, 15, 69,146, 0, + 69, 6,165, 6,183, 6,191, 7, 89, 7,153, 7,165, 7,183, 7, + 211, 8, 7, 8, 36, 8, 94, 8,169, 8,189, 8,208, 8,248, 9, + 44, 9,109, 9,115,225,227,245,244,101,129, 0,201, 6,175,243, + 237,225,236,108,128,247,233,226,242,229,246,101,128, 1, 20, 99, + 5, 6,203, 6,210, 6,224, 6,236, 7, 79,225,242,239,110,128, + 1, 26,229,228,233,236,236,225,226,242,229,246,101,128, 30, 28, + 232,225,242,237,229,238,233,225,110,128, 5, 53,233,242, 99, 2, + 6,244, 6,249,236,101,128, 36,186,245,237,230,236,229,120,135, + 0,202, 7, 16, 7, 24, 7, 32, 7, 43, 7, 51, 7, 63, 7, 71, + 225,227,245,244,101,128, 30,190,226,229,236,239,119,128, 30, 24, + 228,239,244,226,229,236,239,119,128, 30,198,231,242,225,246,101, + 128, 30,192,232,239,239,235,225,226,239,246,101,128, 30,194,243, + 237,225,236,108,128,247,234,244,233,236,228,101,128, 30,196,249, + 242,233,236,236,233, 99,128, 4, 4,100, 3, 7, 97, 7,107, 7, + 127,226,236,231,242,225,246,101,128, 2, 4,233,229,242,229,243, + 233,115,129, 0,203, 7,119,243,237,225,236,108,128,247,235,239, + 116,130, 1, 22, 7,136, 7,145,225,227,227,229,238,116,128, 1, + 22,226,229,236,239,119,128, 30,184,230,227,249,242,233,236,236, + 233, 99,128, 4, 36,231,242,225,246,101,129, 0,200, 7,175,243, + 237,225,236,108,128,247,232,104, 2, 7,189, 7,200,225,242,237, + 229,238,233,225,110,128, 5, 55,239,239,235,225,226,239,246,101, + 128, 30,186,105, 3, 7,219, 7,230, 7,245,231,232,244,242,239, + 237,225,110,128, 33,103,238,246,229,242,244,229,228,226,242,229, + 246,101,128, 2, 6,239,244,233,230,233,229,228,227,249,242,233, + 236,236,233, 99,128, 4,100,108, 2, 8, 13, 8, 24,227,249,242, + 233,236,236,233, 99,128, 4, 27,229,246,229,238,242,239,237,225, + 110,128, 33,106,109, 3, 8, 44, 8, 72, 8, 83,225,227,242,239, + 110,130, 1, 18, 8, 56, 8, 64,225,227,245,244,101,128, 30, 22, + 231,242,225,246,101,128, 30, 20,227,249,242,233,236,236,233, 99, + 128, 4, 28,239,238,239,243,240,225,227,101,128,255, 37,110, 4, + 8,104, 8,115, 8,135, 8,154,227,249,242,233,236,236,233, 99, + 128, 4, 29,228,229,243,227,229,238,228,229,242,227,249,242,233, + 236,236,233, 99,128, 4,162,103,129, 1, 74, 8,141,232,229,227, + 249,242,233,236,236,233, 99,128, 4,164,232,239,239,235,227,249, + 242,233,236,236,233, 99,128, 4,199,111, 2, 8,175, 8,183,231, + 239,238,229,107,128, 1, 24,240,229,110,128, 1,144,240,243,233, + 236,239,110,129, 3,149, 8,200,244,239,238,239,115,128, 3,136, + 114, 2, 8,214, 8,225,227,249,242,233,236,236,233, 99,128, 4, + 32,229,246,229,242,243,229,100,129, 1,142, 8,237,227,249,242, + 233,236,236,233, 99,128, 4, 45,115, 4, 9, 2, 9, 13, 9, 33, + 9, 37,227,249,242,233,236,236,233, 99,128, 4, 33,228,229,243, + 227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4, + 170,104,128, 1,169,237,225,236,108,128,247,101,116, 3, 9, 52, + 9, 78, 9, 92, 97,130, 3,151, 9, 60, 9, 70,242,237,229,238, + 233,225,110,128, 5, 56,244,239,238,239,115,128, 3,137,104,129, + 0,208, 9, 84,243,237,225,236,108,128,247,240,233,236,228,101, + 129, 30,188, 9,101,226,229,236,239,119,128, 30, 26,245,242,111, + 128, 32,172,250,104,130, 1,183, 9,124, 9,132,227,225,242,239, + 110,128, 1,238,242,229,246,229,242,243,229,100,128, 1,184, 70, + 136, 0, 70, 9,163, 9,172, 9,184, 9,212, 9,219, 9,248, 10, + 4, 10, 15,227,233,242,227,236,101,128, 36,187,228,239,244,225, + 227,227,229,238,116,128, 30, 30,101, 2, 9,190, 9,202,232,225, + 242,237,229,238,233,225,110,128, 5, 86,233,227,239,240,244,233, + 99,128, 3,228,232,239,239,107,128, 1,145,105, 2, 9,225, 9, + 238,244,225,227,249,242,233,236,236,233, 99,128, 4,114,246,229, + 242,239,237,225,110,128, 33,100,237,239,238,239,243,240,225,227, + 101,128,255, 38,239,245,242,242,239,237,225,110,128, 33, 99,243, + 237,225,236,108,128,247,102, 71,140, 0, 71, 10, 51, 10, 61, 10, + 107, 10,115, 10,176, 10,193, 10,205, 11, 39, 11, 52, 11, 65, 11, + 90, 11,107,194,243,241,245,225,242,101,128, 51,135, 97, 3, 10, + 69, 10, 76, 10, 94,227,245,244,101,128, 1,244,237,237, 97,129, + 3,147, 10, 84,225,230,242,233,227,225,110,128, 1,148,238,231, + 233,225,227,239,240,244,233, 99,128, 3,234,226,242,229,246,101, + 128, 1, 30, 99, 4, 10,125, 10,132, 10,141, 10,163,225,242,239, + 110,128, 1,230,229,228,233,236,236, 97,128, 1, 34,233,242, 99, + 2, 10,149, 10,154,236,101,128, 36,188,245,237,230,236,229,120, + 128, 1, 28,239,237,237,225,225,227,227,229,238,116,128, 1, 34, + 228,239,116,129, 1, 32, 10,184,225,227,227,229,238,116,128, 1, + 32,229,227,249,242,233,236,236,233, 99,128, 4, 19,104, 3, 10, + 213, 10,226, 11, 33,225,228,225,242,237,229,238,233,225,110,128, + 5, 66,101, 3, 10,234, 10,255, 11, 16,237,233,228,228,236,229, + 232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,148,243, + 244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,146, + 245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128, 4, + 144,239,239,107,128, 1,147,233,237,225,242,237,229,238,233,225, + 110,128, 5, 51,234,229,227,249,242,233,236,236,233, 99,128, 4, + 3,109, 2, 11, 71, 11, 79,225,227,242,239,110,128, 30, 32,239, + 238,239,243,240,225,227,101,128,255, 39,242,225,246,101,129,246, + 206, 11, 99,243,237,225,236,108,128,247, 96,115, 2, 11,113, 11, + 129,237,225,236,108,129,247,103, 11,122,232,239,239,107,128, 2, + 155,244,242,239,235,101,128, 1,228, 72,140, 0, 72, 11,165, 11, + 190, 11,198, 11,208, 12, 17, 12, 40, 12, 77, 12,117, 12,129, 12, + 157, 12,165, 12,189,177,184, 53, 3, 11,175, 11,180, 11,185,179, + 51,128, 37,207,180, 51,128, 37,170,181, 49,128, 37,171,178,178, + 176,183, 51,128, 37,161,208,243,241,245,225,242,101,128, 51,203, + 97, 3, 11,216, 11,236, 12, 0,225,226,235,232,225,243,233,225, + 238,227,249,242,233,236,236,233, 99,128, 4,168,228,229,243,227, + 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,178, + 242,228,243,233,231,238,227,249,242,233,236,236,233, 99,128, 4, + 42, 98, 2, 12, 23, 12, 28,225,114,128, 1, 38,242,229,246,229, + 226,229,236,239,119,128, 30, 42, 99, 2, 12, 46, 12, 55,229,228, + 233,236,236, 97,128, 30, 40,233,242, 99, 2, 12, 63, 12, 68,236, + 101,128, 36,189,245,237,230,236,229,120,128, 1, 36,100, 2, 12, + 83, 12, 93,233,229,242,229,243,233,115,128, 30, 38,239,116, 2, + 12,100, 12,109,225,227,227,229,238,116,128, 30, 34,226,229,236, + 239,119,128, 30, 36,237,239,238,239,243,240,225,227,101,128,255, + 40,111, 2, 12,135, 12,146,225,242,237,229,238,233,225,110,128, + 5, 64,242,233,227,239,240,244,233, 99,128, 3,232,243,237,225, + 236,108,128,247,104,245,238,231,225,242,245,237,236,225,245,116, + 129,246,207, 12,181,243,237,225,236,108,128,246,248,250,243,241, + 245,225,242,101,128, 51,144, 73,146, 0, 73, 12,239, 12,251, 12, + 255, 13, 11, 13, 29, 13, 37, 13, 94, 13,181, 13,214, 13,224, 13, + 242, 13,254, 14, 48, 14, 86, 14, 99, 14,166, 14,187, 14,205,193, + 227,249,242,233,236,236,233, 99,128, 4, 47, 74,128, 1, 50,213, + 227,249,242,233,236,236,233, 99,128, 4, 46,225,227,245,244,101, + 129, 0,205, 13, 21,243,237,225,236,108,128,247,237,226,242,229, + 246,101,128, 1, 44, 99, 3, 13, 45, 13, 52, 13, 84,225,242,239, + 110,128, 1,207,233,242, 99, 2, 13, 60, 13, 65,236,101,128, 36, + 190,245,237,230,236,229,120,129, 0,206, 13, 76,243,237,225,236, + 108,128,247,238,249,242,233,236,236,233, 99,128, 4, 6,100, 3, + 13,102, 13,112, 13,155,226,236,231,242,225,246,101,128, 2, 8, + 233,229,242,229,243,233,115,131, 0,207, 13,128, 13,136, 13,147, + 225,227,245,244,101,128, 30, 46,227,249,242,233,236,236,233, 99, + 128, 4,228,243,237,225,236,108,128,247,239,239,116,130, 1, 48, + 13,164, 13,173,225,227,227,229,238,116,128, 1, 48,226,229,236, + 239,119,128, 30,202,101, 2, 13,187, 13,203,226,242,229,246,229, + 227,249,242,233,236,236,233, 99,128, 4,214,227,249,242,233,236, + 236,233, 99,128, 4, 21,230,242,225,235,244,245,114,128, 33, 17, + 231,242,225,246,101,129, 0,204, 13,234,243,237,225,236,108,128, + 247,236,232,239,239,235,225,226,239,246,101,128, 30,200,105, 3, + 14, 6, 14, 17, 14, 32,227,249,242,233,236,236,233, 99,128, 4, + 24,238,246,229,242,244,229,228,226,242,229,246,101,128, 2, 10, + 243,232,239,242,244,227,249,242,233,236,236,233, 99,128, 4, 25, + 109, 2, 14, 54, 14, 75,225,227,242,239,110,129, 1, 42, 14, 64, + 227,249,242,233,236,236,233, 99,128, 4,226,239,238,239,243,240, + 225,227,101,128,255, 41,238,233,225,242,237,229,238,233,225,110, + 128, 5, 59,111, 3, 14,107, 14,118, 14,126,227,249,242,233,236, + 236,233, 99,128, 4, 1,231,239,238,229,107,128, 1, 46,244, 97, + 131, 3,153, 14,137, 14,147, 14,158,225,230,242,233,227,225,110, + 128, 1,150,228,233,229,242,229,243,233,115,128, 3,170,244,239, + 238,239,115,128, 3,138,115, 2, 14,172, 14,179,237,225,236,108, + 128,247,105,244,242,239,235,101,128, 1,151,244,233,236,228,101, + 129, 1, 40, 14,197,226,229,236,239,119,128, 30, 44,250,232,233, + 244,243, 97, 2, 14,216, 14,227,227,249,242,233,236,236,233, 99, + 128, 4,116,228,226,236,231,242,225,246,229,227,249,242,233,236, + 236,233, 99,128, 4,118, 74,134, 0, 74, 15, 6, 15, 18, 15, 41, + 15, 53, 15, 67, 15, 79,225,225,242,237,229,238,233,225,110,128, + 5, 65,227,233,242, 99, 2, 15, 27, 15, 32,236,101,128, 36,191, + 245,237,230,236,229,120,128, 1, 52,229,227,249,242,233,236,236, + 233, 99,128, 4, 8,232,229,232,225,242,237,229,238,233,225,110, + 128, 5, 75,237,239,238,239,243,240,225,227,101,128,255, 42,243, + 237,225,236,108,128,247,106, 75,140, 0, 75, 15,115, 15,125, 15, + 135, 16, 18, 16, 65, 16, 76, 16,106, 16,143, 16,156, 16,168, 16, + 180, 16,208,194,243,241,245,225,242,101,128, 51,133,203,243,241, + 245,225,242,101,128, 51,205, 97, 7, 15,151, 15,169, 15,191, 15, + 211, 15,226, 15,232, 15,249,226,225,243,232,235,233,242,227,249, + 242,233,236,236,233, 99,128, 4,160, 99, 2, 15,175, 15,181,245, + 244,101,128, 30, 48,249,242,233,236,236,233, 99,128, 4, 26,228, + 229,243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99, + 128, 4,154,232,239,239,235,227,249,242,233,236,236,233, 99,128, + 4,195,240,240, 97,128, 3,154,243,244,242,239,235,229,227,249, + 242,233,236,236,233, 99,128, 4,158,246,229,242,244,233,227,225, + 236,243,244,242,239,235,229,227,249,242,233,236,236,233, 99,128, + 4,156, 99, 4, 16, 28, 16, 35, 16, 44, 16, 52,225,242,239,110, + 128, 1,232,229,228,233,236,236, 97,128, 1, 54,233,242,227,236, + 101,128, 36,192,239,237,237,225,225,227,227,229,238,116,128, 1, + 54,228,239,244,226,229,236,239,119,128, 30, 50,101, 2, 16, 82, + 16, 94,232,225,242,237,229,238,233,225,110,128, 5, 84,238,225, + 242,237,229,238,233,225,110,128, 5, 63,104, 3, 16,114, 16,126, + 16,137,225,227,249,242,233,236,236,233, 99,128, 4, 37,229,233, + 227,239,240,244,233, 99,128, 3,230,239,239,107,128, 1,152,234, + 229,227,249,242,233,236,236,233, 99,128, 4, 12,236,233,238,229, + 226,229,236,239,119,128, 30, 52,237,239,238,239,243,240,225,227, + 101,128,255, 43,239,240,240, 97, 2, 16,189, 16,200,227,249,242, + 233,236,236,233, 99,128, 4,128,231,242,229,229,107,128, 3,222, + 115, 2, 16,214, 16,226,233,227,249,242,233,236,236,233, 99,128, + 4,110,237,225,236,108,128,247,107, 76,138, 0, 76, 17, 1, 17, + 5, 17, 9, 17, 29, 17, 95, 17,133, 17,147, 17,165, 17,177, 17, + 189, 74,128, 1,199, 76,128,246,191, 97, 2, 17, 15, 17, 22,227, + 245,244,101,128, 1, 57,237,226,228, 97,128, 3,155, 99, 4, 17, + 39, 17, 46, 17, 55, 17, 82,225,242,239,110,128, 1, 61,229,228, + 233,236,236, 97,128, 1, 59,233,242, 99, 2, 17, 63, 17, 68,236, + 101,128, 36,193,245,237,230,236,229,248,226,229,236,239,119,128, + 30, 60,239,237,237,225,225,227,227,229,238,116,128, 1, 59,228, + 239,116,130, 1, 63, 17,105, 17,114,225,227,227,229,238,116,128, + 1, 63,226,229,236,239,119,129, 30, 54, 17,124,237,225,227,242, + 239,110,128, 30, 56,233,247,238,225,242,237,229,238,233,225,110, + 128, 5, 60,106,129, 1,200, 17,153,229,227,249,242,233,236,236, + 233, 99,128, 4, 9,236,233,238,229,226,229,236,239,119,128, 30, + 58,237,239,238,239,243,240,225,227,101,128,255, 44,115, 2, 17, + 195, 17,212,236,225,243,104,129, 1, 65, 17,204,243,237,225,236, + 108,128,246,249,237,225,236,108,128,247,108, 77,137, 0, 77, 17, + 241, 17,251, 18, 24, 18, 33, 18, 58, 18, 71, 18, 83, 18, 91, 18, + 100,194,243,241,245,225,242,101,128, 51,134,225, 99, 2, 18, 2, + 18, 18,242,239,110,129,246,208, 18, 10,243,237,225,236,108,128, + 247,175,245,244,101,128, 30, 62,227,233,242,227,236,101,128, 36, + 194,228,239,116, 2, 18, 41, 18, 50,225,227,227,229,238,116,128, + 30, 64,226,229,236,239,119,128, 30, 66,229,238,225,242,237,229, + 238,233,225,110,128, 5, 68,237,239,238,239,243,240,225,227,101, + 128,255, 45,243,237,225,236,108,128,247,109,244,245,242,238,229, + 100,128, 1,156,117,128, 3,156, 78,141, 0, 78, 18,134, 18,138, + 18,146, 18,212, 18,237, 18,248, 19, 3, 19, 21, 19, 33, 19, 45, + 19, 58, 19, 66, 19, 84, 74,128, 1,202,225,227,245,244,101,128, + 1, 67, 99, 4, 18,156, 18,163, 18,172, 18,199,225,242,239,110, + 128, 1, 71,229,228,233,236,236, 97,128, 1, 69,233,242, 99, 2, + 18,180, 18,185,236,101,128, 36,195,245,237,230,236,229,248,226, + 229,236,239,119,128, 30, 74,239,237,237,225,225,227,227,229,238, + 116,128, 1, 69,228,239,116, 2, 18,220, 18,229,225,227,227,229, + 238,116,128, 30, 68,226,229,236,239,119,128, 30, 70,232,239,239, + 235,236,229,230,116,128, 1,157,233,238,229,242,239,237,225,110, + 128, 33,104,106,129, 1,203, 19, 9,229,227,249,242,233,236,236, + 233, 99,128, 4, 10,236,233,238,229,226,229,236,239,119,128, 30, + 72,237,239,238,239,243,240,225,227,101,128,255, 46,239,247,225, + 242,237,229,238,233,225,110,128, 5, 70,243,237,225,236,108,128, + 247,110,244,233,236,228,101,129, 0,209, 19, 76,243,237,225,236, + 108,128,247,241,117,128, 3,157, 79,141, 0, 79, 19,118, 19,132, + 19,150, 19,203, 20, 78, 20,152, 20,187, 21, 48, 21, 69, 21,213, + 21,223, 21,254, 22, 53, 69,129, 1, 82, 19,124,243,237,225,236, + 108,128,246,250,225,227,245,244,101,129, 0,211, 19,142,243,237, + 225,236,108,128,247,243, 98, 2, 19,156, 19,196,225,242,242,229, + 100, 2, 19,166, 19,177,227,249,242,233,236,236,233, 99,128, 4, + 232,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, + 99,128, 4,234,242,229,246,101,128, 1, 78, 99, 4, 19,213, 19, + 220, 19,235, 20, 68,225,242,239,110,128, 1,209,229,238,244,229, + 242,229,228,244,233,236,228,101,128, 1,159,233,242, 99, 2, 19, + 243, 19,248,236,101,128, 36,196,245,237,230,236,229,120,134, 0, + 212, 20, 13, 20, 21, 20, 32, 20, 40, 20, 52, 20, 60,225,227,245, + 244,101,128, 30,208,228,239,244,226,229,236,239,119,128, 30,216, + 231,242,225,246,101,128, 30,210,232,239,239,235,225,226,239,246, + 101,128, 30,212,243,237,225,236,108,128,247,244,244,233,236,228, + 101,128, 30,214,249,242,233,236,236,233, 99,128, 4, 30,100, 3, + 20, 86, 20,109, 20,142,226,108, 2, 20, 93, 20,101,225,227,245, + 244,101,128, 1, 80,231,242,225,246,101,128, 2, 12,233,229,242, + 229,243,233,115,130, 0,214, 20,123, 20,134,227,249,242,233,236, + 236,233, 99,128, 4,230,243,237,225,236,108,128,247,246,239,244, + 226,229,236,239,119,128, 30,204,103, 2, 20,158, 20,170,239,238, + 229,235,243,237,225,236,108,128,246,251,242,225,246,101,129, 0, + 210, 20,179,243,237,225,236,108,128,247,242,104, 4, 20,197, 20, + 208, 20,212, 21, 34,225,242,237,229,238,233,225,110,128, 5, 85, + 109,128, 33, 38,111, 2, 20,218, 20,228,239,235,225,226,239,246, + 101,128, 30,206,242,110,133, 1,160, 20,243, 20,251, 21, 6, 21, + 14, 21, 26,225,227,245,244,101,128, 30,218,228,239,244,226,229, + 236,239,119,128, 30,226,231,242,225,246,101,128, 30,220,232,239, + 239,235,225,226,239,246,101,128, 30,222,244,233,236,228,101,128, + 30,224,245,238,231,225,242,245,237,236,225,245,116,128, 1, 80, + 105,129, 1,162, 21, 54,238,246,229,242,244,229,228,226,242,229, + 246,101,128, 2, 14,109, 4, 21, 79, 21,107, 21,184, 21,202,225, + 227,242,239,110,130, 1, 76, 21, 91, 21, 99,225,227,245,244,101, + 128, 30, 82,231,242,225,246,101,128, 30, 80,229,231, 97,132, 33, + 38, 21,121, 21,132, 21,140, 21,156,227,249,242,233,236,236,233, + 99,128, 4, 96,231,242,229,229,107,128, 3,169,242,239,245,238, + 228,227,249,242,233,236,236,233, 99,128, 4,122,116, 2, 21,162, + 21,177,233,244,236,239,227,249,242,233,236,236,233, 99,128, 4, + 124,239,238,239,115,128, 3,143,233,227,242,239,110,129, 3,159, + 21,194,244,239,238,239,115,128, 3,140,239,238,239,243,240,225, + 227,101,128,255, 47,238,229,242,239,237,225,110,128, 33, 96,111, + 2, 21,229, 21,248,231,239,238,229,107,129, 1,234, 21,239,237, + 225,227,242,239,110,128, 1,236,240,229,110,128, 1,134,115, 3, + 22, 6, 22, 33, 22, 40,236,225,243,104,130, 0,216, 22, 17, 22, + 25,225,227,245,244,101,128, 1,254,243,237,225,236,108,128,247, + 248,237,225,236,108,128,247,111,244,242,239,235,229,225,227,245, + 244,101,128, 1,254,116, 2, 22, 59, 22, 70,227,249,242,233,236, + 236,233, 99,128, 4,126,233,236,228,101,131, 0,213, 22, 83, 22, + 91, 22,102,225,227,245,244,101,128, 30, 76,228,233,229,242,229, + 243,233,115,128, 30, 78,243,237,225,236,108,128,247,245, 80,136, + 0, 80, 22,130, 22,138, 22,147, 22,159, 22,211, 22,227, 22,246, + 23, 2,225,227,245,244,101,128, 30, 84,227,233,242,227,236,101, + 128, 36,197,228,239,244,225,227,227,229,238,116,128, 30, 86,101, + 3, 22,167, 22,178, 22,190,227,249,242,233,236,236,233, 99,128, + 4, 31,232,225,242,237,229,238,233,225,110,128, 5, 74,237,233, + 228,228,236,229,232,239,239,235,227,249,242,233,236,236,233, 99, + 128, 4,166,104, 2, 22,217, 22,221,105,128, 3,166,239,239,107, + 128, 1,164,105,129, 3,160, 22,233,247,242,225,242,237,229,238, + 233,225,110,128, 5, 83,237,239,238,239,243,240,225,227,101,128, + 255, 48,115, 2, 23, 8, 23, 25,105,129, 3,168, 23, 14,227,249, + 242,233,236,236,233, 99,128, 4,112,237,225,236,108,128,247,112, + 81,131, 0, 81, 23, 42, 23, 51, 23, 63,227,233,242,227,236,101, + 128, 36,198,237,239,238,239,243,240,225,227,101,128,255, 49,243, + 237,225,236,108,128,247,113, 82,138, 0, 82, 23, 95, 23,119, 23, + 166, 23,217, 23,230, 23,240, 23,245, 24, 19, 24, 31, 24, 43, 97, + 2, 23,101, 23,112,225,242,237,229,238,233,225,110,128, 5, 76, + 227,245,244,101,128, 1, 84, 99, 4, 23,129, 23,136, 23,145, 23, + 153,225,242,239,110,128, 1, 88,229,228,233,236,236, 97,128, 1, + 86,233,242,227,236,101,128, 36,199,239,237,237,225,225,227,227, + 229,238,116,128, 1, 86,100, 2, 23,172, 23,182,226,236,231,242, + 225,246,101,128, 2, 16,239,116, 2, 23,189, 23,198,225,227,227, + 229,238,116,128, 30, 88,226,229,236,239,119,129, 30, 90, 23,208, + 237,225,227,242,239,110,128, 30, 92,229,232,225,242,237,229,238, + 233,225,110,128, 5, 80,230,242,225,235,244,245,114,128, 33, 28, + 232,111,128, 3,161,233,110, 2, 23,252, 24, 5,231,243,237,225, + 236,108,128,246,252,246,229,242,244,229,228,226,242,229,246,101, + 128, 2, 18,236,233,238,229,226,229,236,239,119,128, 30, 94,237, + 239,238,239,243,240,225,227,101,128,255, 50,243,237,225,236,108, + 129,247,114, 24, 53,233,238,246,229,242,244,229,100,129, 2,129, + 24, 66,243,245,240,229,242,233,239,114,128, 2,182, 83,139, 0, + 83, 24,103, 26, 17, 26, 55, 26,182, 26,221, 26,250, 27, 84, 27, + 105, 27,117, 27,135, 27,143, 70, 6, 24,117, 24,209, 24,241, 25, + 77, 25,119, 25,221, 48, 9, 24,137, 24,145, 24,153, 24,161, 24, + 169, 24,177, 24,185, 24,193, 24,201,177,176,176,176, 48,128, 37, + 12,178,176,176,176, 48,128, 37, 20,179,176,176,176, 48,128, 37, + 16,180,176,176,176, 48,128, 37, 24,181,176,176,176, 48,128, 37, + 60,182,176,176,176, 48,128, 37, 44,183,176,176,176, 48,128, 37, + 52,184,176,176,176, 48,128, 37, 28,185,176,176,176, 48,128, 37, + 36, 49, 3, 24,217, 24,225, 24,233,176,176,176,176, 48,128, 37, + 0,177,176,176,176, 48,128, 37, 2,185,176,176,176, 48,128, 37, + 97, 50, 9, 25, 5, 25, 13, 25, 21, 25, 29, 25, 37, 25, 45, 25, + 53, 25, 61, 25, 69,176,176,176,176, 48,128, 37, 98,177,176,176, + 176, 48,128, 37, 86,178,176,176,176, 48,128, 37, 85,179,176,176, + 176, 48,128, 37, 99,180,176,176,176, 48,128, 37, 81,181,176,176, + 176, 48,128, 37, 87,182,176,176,176, 48,128, 37, 93,183,176,176, + 176, 48,128, 37, 92,184,176,176,176, 48,128, 37, 91, 51, 4, 25, + 87, 25, 95, 25,103, 25,111,182,176,176,176, 48,128, 37, 94,183, + 176,176,176, 48,128, 37, 95,184,176,176,176, 48,128, 37, 90,185, + 176,176,176, 48,128, 37, 84, 52, 10, 25,141, 25,149, 25,157, 25, + 165, 25,173, 25,181, 25,189, 25,197, 25,205, 25,213,176,176,176, + 176, 48,128, 37,105,177,176,176,176, 48,128, 37,102,178,176,176, + 176, 48,128, 37, 96,179,176,176,176, 48,128, 37, 80,180,176,176, + 176, 48,128, 37,108,181,176,176,176, 48,128, 37,103,182,176,176, + 176, 48,128, 37,104,183,176,176,176, 48,128, 37,100,184,176,176, + 176, 48,128, 37,101,185,176,176,176, 48,128, 37, 89, 53, 5, 25, + 233, 25,241, 25,249, 26, 1, 26, 9,176,176,176,176, 48,128, 37, + 88,177,176,176,176, 48,128, 37, 82,178,176,176,176, 48,128, 37, + 83,179,176,176,176, 48,128, 37,107,180,176,176,176, 48,128, 37, + 106, 97, 2, 26, 23, 26, 44,227,245,244,101,129, 1, 90, 26, 32, + 228,239,244,225,227,227,229,238,116,128, 30,100,237,240,233,231, + 242,229,229,107,128, 3,224, 99, 5, 26, 67, 26, 98, 26,107, 26, + 147, 26,169,225,242,239,110,130, 1, 96, 26, 78, 26, 90,228,239, + 244,225,227,227,229,238,116,128, 30,102,243,237,225,236,108,128, + 246,253,229,228,233,236,236, 97,128, 1, 94,232,247, 97,130, 1, + 143, 26,117, 26,128,227,249,242,233,236,236,233, 99,128, 4,216, + 228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99, + 128, 4,218,233,242, 99, 2, 26,155, 26,160,236,101,128, 36,200, + 245,237,230,236,229,120,128, 1, 92,239,237,237,225,225,227,227, + 229,238,116,128, 2, 24,228,239,116, 2, 26,190, 26,199,225,227, + 227,229,238,116,128, 30, 96,226,229,236,239,119,129, 30, 98, 26, + 209,228,239,244,225,227,227,229,238,116,128, 30,104,101, 2, 26, + 227, 26,239,232,225,242,237,229,238,233,225,110,128, 5, 77,246, + 229,238,242,239,237,225,110,128, 33,102,104, 5, 27, 6, 27, 34, + 27, 48, 27, 59, 27, 72, 97, 2, 27, 12, 27, 23,225,242,237,229, + 238,233,225,110,128, 5, 71,227,249,242,233,236,236,233, 99,128, + 4, 40,227,232,225,227,249,242,233,236,236,233, 99,128, 4, 41, + 229,233,227,239,240,244,233, 99,128, 3,226,232,225,227,249,242, + 233,236,236,233, 99,128, 4,186,233,237,225,227,239,240,244,233, + 99,128, 3,236,105, 2, 27, 90, 27, 96,231,237, 97,128, 3,163, + 248,242,239,237,225,110,128, 33,101,237,239,238,239,243,240,225, + 227,101,128,255, 51,239,230,244,243,233,231,238,227,249,242,233, + 236,236,233, 99,128, 4, 44,243,237,225,236,108,128,247,115,244, + 233,231,237,225,231,242,229,229,107,128, 3,218, 84,141, 0, 84, + 27,186, 27,191, 27,197, 28, 7, 28, 32, 28, 96, 28,147, 28,177, + 28,189, 28,201, 28,246, 29, 6, 29, 46,225,117,128, 3,164,226, + 225,114,128, 1,102, 99, 4, 27,207, 27,214, 27,223, 27,250,225, + 242,239,110,128, 1,100,229,228,233,236,236, 97,128, 1, 98,233, + 242, 99, 2, 27,231, 27,236,236,101,128, 36,201,245,237,230,236, + 229,248,226,229,236,239,119,128, 30,112,239,237,237,225,225,227, + 227,229,238,116,128, 1, 98,228,239,116, 2, 28, 15, 28, 24,225, + 227,227,229,238,116,128, 30,106,226,229,236,239,119,128, 30,108, + 101, 4, 28, 42, 28, 53, 28, 73, 28, 82,227,249,242,233,236,236, + 233, 99,128, 4, 34,228,229,243,227,229,238,228,229,242,227,249, + 242,233,236,236,233, 99,128, 4,172,238,242,239,237,225,110,128, + 33,105,244,243,229,227,249,242,233,236,236,233, 99,128, 4,180, + 104, 3, 28,104, 28,110, 28,136,229,244, 97,128, 3,152,111, 2, + 28,116, 28,121,239,107,128, 1,172,242,110,129, 0,222, 28,128, + 243,237,225,236,108,128,247,254,242,229,229,242,239,237,225,110, + 128, 33, 98,105, 2, 28,153, 28,164,236,228,229,243,237,225,236, + 108,128,246,254,247,238,225,242,237,229,238,233,225,110,128, 5, + 79,236,233,238,229,226,229,236,239,119,128, 30,110,237,239,238, + 239,243,240,225,227,101,128,255, 52,111, 2, 28,207, 28,218,225, + 242,237,229,238,233,225,110,128, 5, 57,238,101, 3, 28,227, 28, + 234, 28,240,230,233,246,101,128, 1,188,243,233,120,128, 1,132, + 244,247,111,128, 1,167,242,229,244,242,239,230,236,229,248,232, + 239,239,107,128, 1,174,115, 3, 29, 14, 29, 26, 29, 39,229,227, + 249,242,233,236,236,233, 99,128, 4, 38,232,229,227,249,242,233, + 236,236,233, 99,128, 4, 11,237,225,236,108,128,247,116,119, 2, + 29, 52, 29, 64,229,236,246,229,242,239,237,225,110,128, 33,107, + 239,242,239,237,225,110,128, 33, 97, 85,142, 0, 85, 29,105, 29, + 123, 29,131, 29,198, 30, 69, 30, 87, 30,198, 30,214, 30,226, 31, + 21, 31, 30, 31,142, 31,149, 31,219,225,227,245,244,101,129, 0, + 218, 29,115,243,237,225,236,108,128,247,250,226,242,229,246,101, + 128, 1,108, 99, 3, 29,139, 29,146, 29,188,225,242,239,110,128, + 1,211,233,242, 99, 2, 29,154, 29,159,236,101,128, 36,202,245, + 237,230,236,229,120,130, 0,219, 29,172, 29,180,226,229,236,239, + 119,128, 30,118,243,237,225,236,108,128,247,251,249,242,233,236, + 236,233, 99,128, 4, 35,100, 3, 29,206, 29,229, 30, 59,226,108, + 2, 29,213, 29,221,225,227,245,244,101,128, 1,112,231,242,225, + 246,101,128, 2, 20,233,229,242,229,243,233,115,134, 0,220, 29, + 251, 30, 3, 30, 11, 30, 34, 30, 42, 30, 51,225,227,245,244,101, + 128, 1,215,226,229,236,239,119,128, 30,114, 99, 2, 30, 17, 30, + 24,225,242,239,110,128, 1,217,249,242,233,236,236,233, 99,128, + 4,240,231,242,225,246,101,128, 1,219,237,225,227,242,239,110, + 128, 1,213,243,237,225,236,108,128,247,252,239,244,226,229,236, + 239,119,128, 30,228,231,242,225,246,101,129, 0,217, 30, 79,243, + 237,225,236,108,128,247,249,104, 2, 30, 93, 30,171,111, 2, 30, + 99, 30,109,239,235,225,226,239,246,101,128, 30,230,242,110,133, + 1,175, 30,124, 30,132, 30,143, 30,151, 30,163,225,227,245,244, + 101,128, 30,232,228,239,244,226,229,236,239,119,128, 30,240,231, + 242,225,246,101,128, 30,234,232,239,239,235,225,226,239,246,101, + 128, 30,236,244,233,236,228,101,128, 30,238,245,238,231,225,242, + 245,237,236,225,245,116,129, 1,112, 30,187,227,249,242,233,236, + 236,233, 99,128, 4,242,233,238,246,229,242,244,229,228,226,242, + 229,246,101,128, 2, 22,235,227,249,242,233,236,236,233, 99,128, + 4,120,109, 2, 30,232, 31, 10,225,227,242,239,110,130, 1,106, + 30,244, 30,255,227,249,242,233,236,236,233, 99,128, 4,238,228, + 233,229,242,229,243,233,115,128, 30,122,239,238,239,243,240,225, + 227,101,128,255, 53,239,231,239,238,229,107,128, 1,114,240,243, + 233,236,239,110,133, 3,165, 31, 49, 31, 53, 31, 90, 31,121, 31, + 134, 49,128, 3,210, 97, 2, 31, 59, 31, 81,227,245,244,229,232, + 239,239,235,243,249,237,226,239,236,231,242,229,229,107,128, 3, + 211,230,242,233,227,225,110,128, 1,177,228,233,229,242,229,243, + 233,115,129, 3,171, 31,103,232,239,239,235,243,249,237,226,239, + 236,231,242,229,229,107,128, 3,212,232,239,239,235,243,249,237, + 226,239,108,128, 3,210,244,239,238,239,115,128, 3,142,242,233, + 238,103,128, 1,110,115, 3, 31,157, 31,172, 31,179,232,239,242, + 244,227,249,242,233,236,236,233, 99,128, 4, 14,237,225,236,108, + 128,247,117,244,242,225,233,231,232,116, 2, 31,191, 31,202,227, + 249,242,233,236,236,233, 99,128, 4,174,243,244,242,239,235,229, + 227,249,242,233,236,236,233, 99,128, 4,176,244,233,236,228,101, + 130, 1,104, 31,231, 31,239,225,227,245,244,101,128, 30,120,226, + 229,236,239,119,128, 30,116, 86,136, 0, 86, 32, 11, 32, 20, 32, + 31, 32, 60, 32, 67, 32, 79, 32, 91, 32, 99,227,233,242,227,236, + 101,128, 36,203,228,239,244,226,229,236,239,119,128, 30,126,101, + 2, 32, 37, 32, 48,227,249,242,233,236,236,233, 99,128, 4, 18, + 247,225,242,237,229,238,233,225,110,128, 5, 78,232,239,239,107, + 128, 1,178,237,239,238,239,243,240,225,227,101,128,255, 54,239, + 225,242,237,229,238,233,225,110,128, 5, 72,243,237,225,236,108, + 128,247,118,244,233,236,228,101,128, 30,124, 87,134, 0, 87, 32, + 123, 32,131, 32,154, 32,194, 32,202, 32,214,225,227,245,244,101, + 128, 30,130,227,233,242, 99, 2, 32,140, 32,145,236,101,128, 36, + 204,245,237,230,236,229,120,128, 1,116,100, 2, 32,160, 32,170, + 233,229,242,229,243,233,115,128, 30,132,239,116, 2, 32,177, 32, + 186,225,227,227,229,238,116,128, 30,134,226,229,236,239,119,128, + 30,136,231,242,225,246,101,128, 30,128,237,239,238,239,243,240, + 225,227,101,128,255, 55,243,237,225,236,108,128,247,119, 88,134, + 0, 88, 32,238, 32,247, 33, 18, 33, 31, 33, 35, 33, 47,227,233, + 242,227,236,101,128, 36,205,100, 2, 32,253, 33, 7,233,229,242, + 229,243,233,115,128, 30,140,239,244,225,227,227,229,238,116,128, + 30,138,229,232,225,242,237,229,238,233,225,110,128, 5, 61,105, + 128, 3,158,237,239,238,239,243,240,225,227,101,128,255, 56,243, + 237,225,236,108,128,247,120, 89,139, 0, 89, 33, 81, 33,116, 33, + 139, 33,189, 33,228, 33,236, 33,253, 34, 40, 34, 52, 34, 60, 34, + 68, 97, 2, 33, 87, 33,104,227,245,244,101,129, 0,221, 33, 96, + 243,237,225,236,108,128,247,253,244,227,249,242,233,236,236,233, + 99,128, 4, 98,227,233,242, 99, 2, 33,125, 33,130,236,101,128, + 36,206,245,237,230,236,229,120,128, 1,118,100, 2, 33,145, 33, + 165,233,229,242,229,243,233,115,129, 1,120, 33,157,243,237,225, + 236,108,128,247,255,239,116, 2, 33,172, 33,181,225,227,227,229, + 238,116,128, 30,142,226,229,236,239,119,128, 30,244,229,114, 2, + 33,196, 33,208,233,227,249,242,233,236,236,233, 99,128, 4, 43, + 245,228,233,229,242,229,243,233,243,227,249,242,233,236,236,233, + 99,128, 4,248,231,242,225,246,101,128, 30,242,232,239,239,107, + 129, 1,179, 33,245,225,226,239,246,101,128, 30,246,105, 3, 34, + 5, 34, 16, 34, 27,225,242,237,229,238,233,225,110,128, 5, 69, + 227,249,242,233,236,236,233, 99,128, 4, 7,247,238,225,242,237, + 229,238,233,225,110,128, 5, 82,237,239,238,239,243,240,225,227, + 101,128,255, 57,243,237,225,236,108,128,247,121,244,233,236,228, + 101,128, 30,248,245,115, 2, 34, 75, 34,113,226,233,103, 2, 34, + 83, 34, 94,227,249,242,233,236,236,233, 99,128, 4,106,233,239, + 244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, 4, + 108,236,233,244,244,236,101, 2, 34,124, 34,135,227,249,242,233, + 236,236,233, 99,128, 4,102,233,239,244,233,230,233,229,228,227, + 249,242,233,236,236,233, 99,128, 4,104, 90,136, 0, 90, 34,174, + 34,198, 34,243, 35, 14, 35, 81, 35,173, 35,185, 35,197, 97, 2, + 34,180, 34,191,225,242,237,229,238,233,225,110,128, 5, 54,227, + 245,244,101,128, 1,121, 99, 2, 34,204, 34,221,225,242,239,110, + 129, 1,125, 34,213,243,237,225,236,108,128,246,255,233,242, 99, + 2, 34,229, 34,234,236,101,128, 36,207,245,237,230,236,229,120, + 128, 30,144,228,239,116,130, 1,123, 34,253, 35, 6,225,227,227, + 229,238,116,128, 1,123,226,229,236,239,119,128, 30,146,101, 3, + 35, 22, 35, 33, 35, 76,227,249,242,233,236,236,233, 99,128, 4, + 23,100, 2, 35, 39, 35, 58,229,243,227,229,238,228,229,242,227, + 249,242,233,236,236,233, 99,128, 4,152,233,229,242,229,243,233, + 243,227,249,242,233,236,236,233, 99,128, 4,222,244, 97,128, 3, + 150,232,101, 4, 35, 92, 35,103, 35,119, 35,130,225,242,237,229, + 238,233,225,110,128, 5, 58,226,242,229,246,229,227,249,242,233, + 236,236,233, 99,128, 4,193,227,249,242,233,236,236,233, 99,128, + 4, 22,100, 2, 35,136, 35,155,229,243,227,229,238,228,229,242, + 227,249,242,233,236,236,233, 99,128, 4,150,233,229,242,229,243, + 233,243,227,249,242,233,236,236,233, 99,128, 4,220,236,233,238, + 229,226,229,236,239,119,128, 30,148,237,239,238,239,243,240,225, + 227,101,128,255, 58,115, 2, 35,203, 35,210,237,225,236,108,128, + 247,122,244,242,239,235,101,128, 1,181, 97,158, 0, 97, 36, 26, + 38,154, 39, 4, 39, 68, 39,132, 39,196, 40, 4, 40, 68, 40,126, + 40,190, 41, 70, 41,217, 42,137, 42,237, 43, 17, 49,192, 49,229, + 50, 0, 50,225, 51, 7, 52, 96, 52,168, 53,123, 53,132, 54, 5, + 56, 13, 57, 3, 57, 50, 57,201, 57,215, 49,138, 39, 1, 36, 50, + 36,114, 36,154, 36,218, 37, 26, 37, 90, 37,154, 37,218, 38, 26, + 38, 90, 48,138, 39, 33, 36, 74, 36, 78, 36, 82, 36, 86, 36, 90, + 36, 94, 36, 98, 36,102, 36,106, 36,110, 48,128, 39, 94, 49,128, + 39, 97, 50,128, 39, 98, 51,128, 39, 99, 52,128, 39,100, 53,128, + 39, 16, 54,128, 39,101, 55,128, 39,102, 56,128, 39,103, 57,128, + 38, 96, 49,134, 38, 27, 36,130, 36,134, 36,138, 36,142, 36,146, + 36,150, 48,128, 38,101, 49,128, 38,102, 50,128, 38, 99, 55,128, + 39, 9, 56,128, 39, 8, 57,128, 39, 7, 50,138, 38, 30, 36,178, + 36,182, 36,186, 36,190, 36,194, 36,198, 36,202, 36,206, 36,210, + 36,214, 48,128, 36, 96, 49,128, 36, 97, 50,128, 36, 98, 51,128, + 36, 99, 52,128, 36,100, 53,128, 36,101, 54,128, 36,102, 55,128, + 36,103, 56,128, 36,104, 57,128, 36,105, 51,138, 39, 12, 36,242, + 36,246, 36,250, 36,254, 37, 2, 37, 6, 37, 10, 37, 14, 37, 18, + 37, 22, 48,128, 39,118, 49,128, 39,119, 50,128, 39,120, 51,128, + 39,121, 52,128, 39,122, 53,128, 39,123, 54,128, 39,124, 55,128, + 39,125, 56,128, 39,126, 57,128, 39,127, 52,138, 39, 13, 37, 50, + 37, 54, 37, 58, 37, 62, 37, 66, 37, 70, 37, 74, 37, 78, 37, 82, + 37, 86, 48,128, 39,128, 49,128, 39,129, 50,128, 39,130, 51,128, + 39,131, 52,128, 39,132, 53,128, 39,133, 54,128, 39,134, 55,128, + 39,135, 56,128, 39,136, 57,128, 39,137, 53,138, 39, 14, 37,114, + 37,118, 37,122, 37,126, 37,130, 37,134, 37,138, 37,142, 37,146, + 37,150, 48,128, 39,138, 49,128, 39,139, 50,128, 39,140, 51,128, + 39,141, 52,128, 39,142, 53,128, 39,143, 54,128, 39,144, 55,128, + 39,145, 56,128, 39,146, 57,128, 39,147, 54,138, 39, 15, 37,178, + 37,182, 37,186, 37,190, 37,194, 37,198, 37,202, 37,206, 37,210, + 37,214, 48,128, 39,148, 49,128, 33,146, 50,128, 39,163, 51,128, + 33,148, 52,128, 33,149, 53,128, 39,153, 54,128, 39,155, 55,128, + 39,156, 56,128, 39,157, 57,128, 39,158, 55,138, 39, 17, 37,242, + 37,246, 37,250, 37,254, 38, 2, 38, 6, 38, 10, 38, 14, 38, 18, + 38, 22, 48,128, 39,159, 49,128, 39,160, 50,128, 39,161, 51,128, + 39,162, 52,128, 39,164, 53,128, 39,165, 54,128, 39,166, 55,128, + 39,167, 56,128, 39,168, 57,128, 39,169, 56,138, 39, 18, 38, 50, + 38, 54, 38, 58, 38, 62, 38, 66, 38, 70, 38, 74, 38, 78, 38, 82, + 38, 86, 48,128, 39,171, 49,128, 39,173, 50,128, 39,175, 51,128, + 39,178, 52,128, 39,179, 53,128, 39,181, 54,128, 39,184, 55,128, + 39,186, 56,128, 39,187, 57,128, 39,188, 57,138, 39, 19, 38,114, + 38,118, 38,122, 38,126, 38,130, 38,134, 38,138, 38,142, 38,146, + 38,150, 48,128, 39,189, 49,128, 39,190, 50,128, 39,154, 51,128, + 39,170, 52,128, 39,182, 53,128, 39,185, 54,128, 39,152, 55,128, + 39,180, 56,128, 39,183, 57,128, 39,172, 50,138, 39, 2, 38,178, + 38,224, 38,228, 38,232, 38,236, 38,240, 38,244, 38,248, 38,252, + 39, 0, 48,135, 39, 20, 38,196, 38,200, 38,204, 38,208, 38,212, + 38,216, 38,220, 48,128, 39,174, 49,128, 39,177, 50,128, 39, 3, + 51,128, 39, 80, 52,128, 39, 82, 53,128, 39,110, 54,128, 39,112, + 49,128, 39, 21, 50,128, 39, 22, 51,128, 39, 23, 52,128, 39, 24, + 53,128, 39, 25, 54,128, 39, 26, 55,128, 39, 27, 56,128, 39, 28, + 57,128, 39, 34, 51,138, 39, 4, 39, 28, 39, 32, 39, 36, 39, 40, + 39, 44, 39, 48, 39, 52, 39, 56, 39, 60, 39, 64, 48,128, 39, 35, + 49,128, 39, 36, 50,128, 39, 37, 51,128, 39, 38, 52,128, 39, 39, + 53,128, 38, 5, 54,128, 39, 41, 55,128, 39, 42, 56,128, 39, 43, + 57,128, 39, 44, 52,138, 38, 14, 39, 92, 39, 96, 39,100, 39,104, + 39,108, 39,112, 39,116, 39,120, 39,124, 39,128, 48,128, 39, 45, + 49,128, 39, 46, 50,128, 39, 47, 51,128, 39, 48, 52,128, 39, 49, + 53,128, 39, 50, 54,128, 39, 51, 55,128, 39, 52, 56,128, 39, 53, + 57,128, 39, 54, 53,138, 39, 6, 39,156, 39,160, 39,164, 39,168, + 39,172, 39,176, 39,180, 39,184, 39,188, 39,192, 48,128, 39, 55, + 49,128, 39, 56, 50,128, 39, 57, 51,128, 39, 58, 52,128, 39, 59, + 53,128, 39, 60, 54,128, 39, 61, 55,128, 39, 62, 56,128, 39, 63, + 57,128, 39, 64, 54,138, 39, 29, 39,220, 39,224, 39,228, 39,232, + 39,236, 39,240, 39,244, 39,248, 39,252, 40, 0, 48,128, 39, 65, + 49,128, 39, 66, 50,128, 39, 67, 51,128, 39, 68, 52,128, 39, 69, + 53,128, 39, 70, 54,128, 39, 71, 55,128, 39, 72, 56,128, 39, 73, + 57,128, 39, 74, 55,138, 39, 30, 40, 28, 40, 32, 40, 36, 40, 40, + 40, 44, 40, 48, 40, 52, 40, 56, 40, 60, 40, 64, 48,128, 39, 75, + 49,128, 37,207, 50,128, 39, 77, 51,128, 37,160, 52,128, 39, 79, + 53,128, 39, 81, 54,128, 37,178, 55,128, 37,188, 56,128, 37,198, + 57,128, 39, 86, 56,137, 39, 31, 40, 90, 40, 94, 40, 98, 40,102, + 40,106, 40,110, 40,114, 40,118, 40,122, 49,128, 37,215, 50,128, + 39, 88, 51,128, 39, 89, 52,128, 39, 90, 53,128, 39,111, 54,128, + 39,113, 55,128, 39,114, 56,128, 39,115, 57,128, 39,104, 57,138, + 39, 32, 40,150, 40,154, 40,158, 40,162, 40,166, 40,170, 40,174, + 40,178, 40,182, 40,186, 48,128, 39,105, 49,128, 39,108, 50,128, + 39,109, 51,128, 39,106, 52,128, 39,107, 53,128, 39,116, 54,128, + 39,117, 55,128, 39, 91, 56,128, 39, 92, 57,128, 39, 93, 97, 7, + 40,206, 40,216, 40,223, 40,230, 40,255, 41, 15, 41, 26,226,229, + 238,231,225,236,105,128, 9,134,227,245,244,101,128, 0,225,228, + 229,246, 97,128, 9, 6,231,117, 2, 40,237, 40,246,234,225,242, + 225,244,105,128, 10,134,242,237,245,235,232,105,128, 10, 6,237, + 225,244,242,225,231,245,242,237,245,235,232,105,128, 10, 62,242, + 245,243,241,245,225,242,101,128, 51, 3,246,239,247,229,236,243, + 233,231,110, 3, 41, 42, 41, 52, 41, 59,226,229,238,231,225,236, + 105,128, 9,190,228,229,246, 97,128, 9, 62,231,245,234,225,242, + 225,244,105,128, 10,190, 98, 4, 41, 80, 41,121, 41,130, 41,140, + 226,242,229,246,233,225,244,233,239,110, 2, 41, 95, 41,110,237, + 225,242,235,225,242,237,229,238,233,225,110,128, 5, 95,243,233, + 231,238,228,229,246, 97,128, 9,112,229,238,231,225,236,105,128, + 9,133,239,240,239,237,239,230,111,128, 49, 26,242,229,246,101, + 134, 1, 3, 41,159, 41,167, 41,178, 41,189, 41,197, 41,209,225, + 227,245,244,101,128, 30,175,227,249,242,233,236,236,233, 99,128, + 4,209,228,239,244,226,229,236,239,119,128, 30,183,231,242,225, + 246,101,128, 30,177,232,239,239,235,225,226,239,246,101,128, 30, + 179,244,233,236,228,101,128, 30,181, 99, 4, 41,227, 41,234, 42, + 57, 42,127,225,242,239,110,128, 1,206,233,242, 99, 2, 41,242, + 41,247,236,101,128, 36,208,245,237,230,236,229,120,133, 0,226, + 42, 10, 42, 18, 42, 29, 42, 37, 42, 49,225,227,245,244,101,128, + 30,165,228,239,244,226,229,236,239,119,128, 30,173,231,242,225, + 246,101,128, 30,167,232,239,239,235,225,226,239,246,101,128, 30, + 169,244,233,236,228,101,128, 30,171,245,244,101,133, 0,180, 42, + 73, 42, 84, 42,101, 42,108, 42,117,226,229,236,239,247,227,237, + 98,128, 3, 23, 99, 2, 42, 90, 42, 95,237, 98,128, 3, 1,239, + 237, 98,128, 3, 1,228,229,246, 97,128, 9, 84,236,239,247,237, + 239,100,128, 2,207,244,239,238,229,227,237, 98,128, 3, 65,249, + 242,233,236,236,233, 99,128, 4, 48,100, 5, 42,149, 42,159, 42, + 173, 42,179, 42,213,226,236,231,242,225,246,101,128, 2, 1,228, + 225,235,231,245,242,237,245,235,232,105,128, 10,113,229,246, 97, + 128, 9, 5,233,229,242,229,243,233,115,130, 0,228, 42,193, 42, + 204,227,249,242,233,236,236,233, 99,128, 4,211,237,225,227,242, + 239,110,128, 1,223,239,116, 2, 42,220, 42,228,226,229,236,239, + 119,128, 30,161,237,225,227,242,239,110,128, 1,225,101,131, 0, + 230, 42,247, 42,255, 43, 8,225,227,245,244,101,128, 1,253,235, + 239,242,229,225,110,128, 49, 80,237,225,227,242,239,110,128, 1, + 227,230,233,105, 6, 43, 33, 43, 53, 45,246, 45,252, 46, 11, 49, + 111, 48, 2, 43, 39, 43, 46,176,178,176, 56,128, 32, 21,184,185, + 180, 49,128, 32,164,177, 48, 3, 43, 62, 45, 86, 45,221, 48, 9, + 43, 82, 43,102, 43,164, 43,226, 44, 32, 44, 94, 44,156, 44,218, + 45, 24, 49, 3, 43, 90, 43, 94, 43, 98, 55,128, 4, 16, 56,128, + 4, 17, 57,128, 4, 18, 50, 10, 43,124, 43,128, 43,132, 43,136, + 43,140, 43,144, 43,148, 43,152, 43,156, 43,160, 48,128, 4, 19, + 49,128, 4, 20, 50,128, 4, 21, 51,128, 4, 1, 52,128, 4, 22, + 53,128, 4, 23, 54,128, 4, 24, 55,128, 4, 25, 56,128, 4, 26, + 57,128, 4, 27, 51, 10, 43,186, 43,190, 43,194, 43,198, 43,202, + 43,206, 43,210, 43,214, 43,218, 43,222, 48,128, 4, 28, 49,128, + 4, 29, 50,128, 4, 30, 51,128, 4, 31, 52,128, 4, 32, 53,128, + 4, 33, 54,128, 4, 34, 55,128, 4, 35, 56,128, 4, 36, 57,128, + 4, 37, 52, 10, 43,248, 43,252, 44, 0, 44, 4, 44, 8, 44, 12, + 44, 16, 44, 20, 44, 24, 44, 28, 48,128, 4, 38, 49,128, 4, 39, + 50,128, 4, 40, 51,128, 4, 41, 52,128, 4, 42, 53,128, 4, 43, + 54,128, 4, 44, 55,128, 4, 45, 56,128, 4, 46, 57,128, 4, 47, + 53, 10, 44, 54, 44, 58, 44, 62, 44, 66, 44, 70, 44, 74, 44, 78, + 44, 82, 44, 86, 44, 90, 48,128, 4,144, 49,128, 4, 2, 50,128, + 4, 3, 51,128, 4, 4, 52,128, 4, 5, 53,128, 4, 6, 54,128, + 4, 7, 55,128, 4, 8, 56,128, 4, 9, 57,128, 4, 10, 54, 10, + 44,116, 44,120, 44,124, 44,128, 44,132, 44,136, 44,140, 44,144, + 44,148, 44,152, 48,128, 4, 11, 49,128, 4, 12, 50,128, 4, 14, + 51,128,246,196, 52,128,246,197, 53,128, 4, 48, 54,128, 4, 49, + 55,128, 4, 50, 56,128, 4, 51, 57,128, 4, 52, 55, 10, 44,178, + 44,182, 44,186, 44,190, 44,194, 44,198, 44,202, 44,206, 44,210, + 44,214, 48,128, 4, 53, 49,128, 4, 81, 50,128, 4, 54, 51,128, + 4, 55, 52,128, 4, 56, 53,128, 4, 57, 54,128, 4, 58, 55,128, + 4, 59, 56,128, 4, 60, 57,128, 4, 61, 56, 10, 44,240, 44,244, + 44,248, 44,252, 45, 0, 45, 4, 45, 8, 45, 12, 45, 16, 45, 20, + 48,128, 4, 62, 49,128, 4, 63, 50,128, 4, 64, 51,128, 4, 65, + 52,128, 4, 66, 53,128, 4, 67, 54,128, 4, 68, 55,128, 4, 69, + 56,128, 4, 70, 57,128, 4, 71, 57, 10, 45, 46, 45, 50, 45, 54, + 45, 58, 45, 62, 45, 66, 45, 70, 45, 74, 45, 78, 45, 82, 48,128, + 4, 72, 49,128, 4, 73, 50,128, 4, 74, 51,128, 4, 75, 52,128, + 4, 76, 53,128, 4, 77, 54,128, 4, 78, 55,128, 4, 79, 56,128, + 4,145, 57,128, 4, 82, 49, 4, 45, 96, 45,158, 45,163, 45,189, + 48, 10, 45,118, 45,122, 45,126, 45,130, 45,134, 45,138, 45,142, + 45,146, 45,150, 45,154, 48,128, 4, 83, 49,128, 4, 84, 50,128, + 4, 85, 51,128, 4, 86, 52,128, 4, 87, 53,128, 4, 88, 54,128, + 4, 89, 55,128, 4, 90, 56,128, 4, 91, 57,128, 4, 92,177, 48, + 128, 4, 94, 52, 4, 45,173, 45,177, 45,181, 45,185, 53,128, 4, + 15, 54,128, 4, 98, 55,128, 4,114, 56,128, 4,116, 57, 5, 45, + 201, 45,205, 45,209, 45,213, 45,217, 50,128,246,198, 51,128, 4, + 95, 52,128, 4, 99, 53,128, 4,115, 54,128, 4,117, 56, 2, 45, + 227, 45,241, 51, 2, 45,233, 45,237, 49,128,246,199, 50,128,246, + 200,180, 54,128, 4,217,178,185, 57,128, 32, 14,179, 48, 2, 46, + 3, 46, 7, 48,128, 32, 15, 49,128, 32, 13,181, 55, 7, 46, 28, + 46, 98, 47,163, 47,240, 48,197, 49, 34, 49,105, 51, 2, 46, 34, + 46, 48, 56, 2, 46, 40, 46, 44, 49,128, 6,106, 56,128, 6, 12, + 57, 8, 46, 66, 46, 70, 46, 74, 46, 78, 46, 82, 46, 86, 46, 90, + 46, 94, 50,128, 6, 96, 51,128, 6, 97, 52,128, 6, 98, 53,128, + 6, 99, 54,128, 6,100, 55,128, 6,101, 56,128, 6,102, 57,128, + 6,103, 52, 7, 46,114, 46,146, 46,208, 47, 14, 47, 46, 47,102, + 47,158, 48, 5, 46,126, 46,130, 46,134, 46,138, 46,142, 48,128, + 6,104, 49,128, 6,105, 51,128, 6, 27, 55,128, 6, 31, 57,128, + 6, 33, 49, 10, 46,168, 46,172, 46,176, 46,180, 46,184, 46,188, + 46,192, 46,196, 46,200, 46,204, 48,128, 6, 34, 49,128, 6, 35, + 50,128, 6, 36, 51,128, 6, 37, 52,128, 6, 38, 53,128, 6, 39, + 54,128, 6, 40, 55,128, 6, 41, 56,128, 6, 42, 57,128, 6, 43, + 50, 10, 46,230, 46,234, 46,238, 46,242, 46,246, 46,250, 46,254, + 47, 2, 47, 6, 47, 10, 48,128, 6, 44, 49,128, 6, 45, 50,128, + 6, 46, 51,128, 6, 47, 52,128, 6, 48, 53,128, 6, 49, 54,128, + 6, 50, 55,128, 6, 51, 56,128, 6, 52, 57,128, 6, 53, 51, 5, + 47, 26, 47, 30, 47, 34, 47, 38, 47, 42, 48,128, 6, 54, 49,128, + 6, 55, 50,128, 6, 56, 51,128, 6, 57, 52,128, 6, 58, 52, 9, + 47, 66, 47, 70, 47, 74, 47, 78, 47, 82, 47, 86, 47, 90, 47, 94, + 47, 98, 48,128, 6, 64, 49,128, 6, 65, 50,128, 6, 66, 51,128, + 6, 67, 52,128, 6, 68, 53,128, 6, 69, 54,128, 6, 70, 56,128, + 6, 72, 57,128, 6, 73, 53, 9, 47,122, 47,126, 47,130, 47,134, + 47,138, 47,142, 47,146, 47,150, 47,154, 48,128, 6, 74, 49,128, + 6, 75, 50,128, 6, 76, 51,128, 6, 77, 52,128, 6, 78, 53,128, + 6, 79, 54,128, 6, 80, 55,128, 6, 81, 56,128, 6, 82,183, 48, + 128, 6, 71, 53, 3, 47,171, 47,203, 47,235, 48, 5, 47,183, 47, + 187, 47,191, 47,195, 47,199, 53,128, 6,164, 54,128, 6,126, 55, + 128, 6,134, 56,128, 6,152, 57,128, 6,175, 49, 5, 47,215, 47, + 219, 47,223, 47,227, 47,231, 49,128, 6,121, 50,128, 6,136, 51, + 128, 6,145, 52,128, 6,186, 57,128, 6,210,179, 52,128, 6,213, + 54, 7, 48, 0, 48, 5, 48, 10, 48, 15, 48, 53, 48,115, 48,177, + 179, 54,128, 32,170,180, 53,128, 5,190,181, 56,128, 5,195, 54, + 6, 48, 29, 48, 33, 48, 37, 48, 41, 48, 45, 48, 49, 52,128, 5, + 208, 53,128, 5,209, 54,128, 5,210, 55,128, 5,211, 56,128, 5, + 212, 57,128, 5,213, 55, 10, 48, 75, 48, 79, 48, 83, 48, 87, 48, + 91, 48, 95, 48, 99, 48,103, 48,107, 48,111, 48,128, 5,214, 49, + 128, 5,215, 50,128, 5,216, 51,128, 5,217, 52,128, 5,218, 53, + 128, 5,219, 54,128, 5,220, 55,128, 5,221, 56,128, 5,222, 57, + 128, 5,223, 56, 10, 48,137, 48,141, 48,145, 48,149, 48,153, 48, + 157, 48,161, 48,165, 48,169, 48,173, 48,128, 5,224, 49,128, 5, + 225, 50,128, 5,226, 51,128, 5,227, 52,128, 5,228, 53,128, 5, + 229, 54,128, 5,230, 55,128, 5,231, 56,128, 5,232, 57,128, 5, + 233, 57, 3, 48,185, 48,189, 48,193, 48,128, 5,234, 52,128,251, + 42, 53,128,251, 43, 55, 4, 48,207, 48,221, 48,241, 48,246, 48, + 2, 48,213, 48,217, 48,128,251, 75, 53,128,251, 31, 49, 3, 48, + 229, 48,233, 48,237, 54,128, 5,240, 55,128, 5,241, 56,128, 5, + 242,178, 51,128,251, 53, 57, 7, 49, 6, 49, 10, 49, 14, 49, 18, + 49, 22, 49, 26, 49, 30, 51,128, 5,180, 52,128, 5,181, 53,128, + 5,182, 54,128, 5,187, 55,128, 5,184, 56,128, 5,183, 57,128, + 5,176, 56, 3, 49, 42, 49, 86, 49, 91, 48, 7, 49, 58, 49, 62, + 49, 66, 49, 70, 49, 74, 49, 78, 49, 82, 48,128, 5,178, 49,128, + 5,177, 50,128, 5,179, 51,128, 5,194, 52,128, 5,193, 54,128, + 5,185, 55,128, 5,188,179, 57,128, 5,189, 52, 2, 49, 97, 49, + 101, 49,128, 5,191, 50,128, 5,192,185,178, 57,128, 2,188, 54, + 3, 49,119, 49,178, 49,185, 49, 4, 49,129, 49,145, 49,151, 49, + 172, 50, 2, 49,135, 49,140,180, 56,128, 33, 5,184, 57,128, 33, + 19,179,181, 50,128, 33, 22,181, 55, 3, 49,160, 49,164, 49,168, + 51,128, 32, 44, 52,128, 32, 45, 53,128, 32, 46,182,182, 52,128, + 32, 12,179,177,182, 55,128, 6,109,180,185,179, 55,128, 2,189, + 103, 2, 49,198, 49,205,242,225,246,101,128, 0,224,117, 2, 49, + 211, 49,220,234,225,242,225,244,105,128, 10,133,242,237,245,235, + 232,105,128, 10, 5,104, 2, 49,235, 49,245,233,242,225,231,225, + 238, 97,128, 48, 66,239,239,235,225,226,239,246,101,128, 30,163, + 105, 7, 50, 16, 50, 41, 50, 48, 50, 60, 50, 85, 50,101, 50,181, + 98, 2, 50, 22, 50, 31,229,238,231,225,236,105,128, 9,144,239, + 240,239,237,239,230,111,128, 49, 30,228,229,246, 97,128, 9, 16, + 229,227,249,242,233,236,236,233, 99,128, 4,213,231,117, 2, 50, + 67, 50, 76,234,225,242,225,244,105,128, 10,144,242,237,245,235, + 232,105,128, 10, 16,237,225,244,242,225,231,245,242,237,245,235, + 232,105,128, 10, 72,110, 5, 50,113, 50,122, 50,136, 50,152, 50, + 167,225,242,225,226,233, 99,128, 6, 57,230,233,238,225,236,225, + 242,225,226,233, 99,128,254,202,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,254,203,237,229,228,233,225,236,225,242, + 225,226,233, 99,128,254,204,246,229,242,244,229,228,226,242,229, + 246,101,128, 2, 3,246,239,247,229,236,243,233,231,110, 3, 50, + 197, 50,207, 50,214,226,229,238,231,225,236,105,128, 9,200,228, + 229,246, 97,128, 9, 72,231,245,234,225,242,225,244,105,128, 10, + 200,107, 2, 50,231, 50,255,225,244,225,235,225,238, 97,129, 48, + 162, 50,243,232,225,236,230,247,233,228,244,104,128,255,113,239, + 242,229,225,110,128, 49, 79,108, 3, 51, 15, 52, 71, 52, 80,101, + 2, 51, 21, 52, 66,102,136, 5,208, 51, 41, 51, 50, 51, 65, 51, + 79, 51,168, 51,182, 52, 37, 52, 51,225,242,225,226,233, 99,128, + 6, 39,228,225,231,229,243,232,232,229,226,242,229,119,128,251, + 48,230,233,238,225,236,225,242,225,226,233, 99,128,254,142,104, + 2, 51, 85, 51,160,225,237,250, 97, 2, 51, 94, 51,127,225,226, + 239,246,101, 2, 51,104, 51,113,225,242,225,226,233, 99,128, 6, + 35,230,233,238,225,236,225,242,225,226,233, 99,128,254,132,226, + 229,236,239,119, 2, 51,137, 51,146,225,242,225,226,233, 99,128, + 6, 37,230,233,238,225,236,225,242,225,226,233, 99,128,254,136, + 229,226,242,229,119,128, 5,208,236,225,237,229,228,232,229,226, + 242,229,119,128,251, 79,237, 97, 2, 51,189, 51,225,228,228,225, + 225,226,239,246,101, 2, 51,202, 51,211,225,242,225,226,233, 99, + 128, 6, 34,230,233,238,225,236,225,242,225,226,233, 99,128,254, + 130,235,243,245,242, 97, 4, 51,239, 51,248, 52, 6, 52, 22,225, + 242,225,226,233, 99,128, 6, 73,230,233,238,225,236,225,242,225, + 226,233, 99,128,254,240,233,238,233,244,233,225,236,225,242,225, + 226,233, 99,128,254,243,237,229,228,233,225,236,225,242,225,226, + 233, 99,128,254,244,240,225,244,225,232,232,229,226,242,229,119, + 128,251, 46,241,225,237,225,244,243,232,229,226,242,229,119,128, + 251, 47,240,104,128, 33, 53,236,229,241,245,225,108,128, 34, 76, + 240,232, 97,129, 3,177, 52, 88,244,239,238,239,115,128, 3,172, + 109, 4, 52,106, 52,114, 52,125, 52,159,225,227,242,239,110,128, + 1, 1,239,238,239,243,240,225,227,101,128,255, 65,240,229,242, + 243,225,238,100,130, 0, 38, 52,139, 52,151,237,239,238,239,243, + 240,225,227,101,128,255, 6,243,237,225,236,108,128,247, 38,243, + 241,245,225,242,101,128, 51,194,110, 4, 52,178, 52,189, 53, 55, + 53, 65,226,239,240,239,237,239,230,111,128, 49, 34,103, 4, 52, + 199, 52,210, 52,224, 53, 47,226,239,240,239,237,239,230,111,128, + 49, 36,235,232,225,238,235,232,245,244,232,225,105,128, 14, 90, + 236,101,131, 34, 32, 52,235, 53, 32, 53, 39,226,242,225,227,235, + 229,116, 2, 52,247, 53, 11,236,229,230,116,129, 48, 8, 53, 0, + 246,229,242,244,233,227,225,108,128,254, 63,242,233,231,232,116, + 129, 48, 9, 53, 21,246,229,242,244,233,227,225,108,128,254, 64, + 236,229,230,116,128, 35, 41,242,233,231,232,116,128, 35, 42,243, + 244,242,239,109,128, 33, 43,239,244,229,236,229,233, 97,128, 3, + 135,117, 2, 53, 71, 53, 83,228,225,244,244,225,228,229,246, 97, + 128, 9, 82,243,246,225,242, 97, 3, 53, 95, 53,105, 53,112,226, + 229,238,231,225,236,105,128, 9,130,228,229,246, 97,128, 9, 2, + 231,245,234,225,242,225,244,105,128, 10,130,239,231,239,238,229, + 107,128, 1, 5,112, 3, 53,140, 53,164, 53,194, 97, 2, 53,146, + 53,158,225,244,239,243,241,245,225,242,101,128, 51, 0,242,229, + 110,128, 36,156,239,243,244,242,239,240,232,101, 2, 53,177, 53, + 188,225,242,237,229,238,233,225,110,128, 5, 90,237,239,100,128, + 2,188,112, 2, 53,200, 53,205,236,101,128,248,255,242,111, 2, + 53,212, 53,220,225,227,232,229,115,128, 34, 80,120, 2, 53,226, + 53,246,229,241,245,225,108,129, 34, 72, 53,236,239,242,233,237, + 225,231,101,128, 34, 82,233,237,225,244,229,236,249,229,241,245, + 225,108,128, 34, 69,114, 4, 54, 15, 54, 42, 54, 46, 54, 91,225, + 229, 97, 2, 54, 23, 54, 33,229,235,239,242,229,225,110,128, 49, + 142,235,239,242,229,225,110,128, 49,141, 99,128, 35, 18,105, 2, + 54, 52, 54, 66,231,232,244,232,225,236,230,242,233,238,103,128, + 30,154,238,103,130, 0,229, 54, 75, 54, 83,225,227,245,244,101, + 128, 1,251,226,229,236,239,119,128, 30, 1,242,239,119, 8, 54, + 111, 54,118, 54,247, 55, 57, 55,107, 55,162, 55,185, 56, 4,226, + 239,244,104,128, 33,148,100, 3, 54,126, 54,165, 54,212,225,243, + 104, 4, 54,138, 54,145, 54,152, 54,160,228,239,247,110,128, 33, + 227,236,229,230,116,128, 33,224,242,233,231,232,116,128, 33,226, + 245,112,128, 33,225,226,108, 5, 54,178, 54,185, 54,192, 54,199, + 54,207,226,239,244,104,128, 33,212,228,239,247,110,128, 33,211, + 236,229,230,116,128, 33,208,242,233,231,232,116,128, 33,210,245, + 112,128, 33,209,239,247,110,131, 33,147, 54,224, 54,231, 54,239, + 236,229,230,116,128, 33,153,242,233,231,232,116,128, 33,152,247, + 232,233,244,101,128, 33,233,104, 2, 54,253, 55, 48,229,225,100, + 4, 55, 9, 55, 19, 55, 29, 55, 40,228,239,247,238,237,239,100, + 128, 2,197,236,229,230,244,237,239,100,128, 2,194,242,233,231, + 232,244,237,239,100,128, 2,195,245,240,237,239,100,128, 2,196, + 239,242,233,250,229,120,128,248,231,236,229,230,116,131, 33,144, + 55, 70, 55, 87, 55, 99,228,226,108,129, 33,208, 55, 78,243,244, + 242,239,235,101,128, 33,205,239,246,229,242,242,233,231,232,116, + 128, 33,198,247,232,233,244,101,128, 33,230,242,233,231,232,116, + 132, 33,146, 55,123, 55,135, 55,143, 55,154,228,226,236,243,244, + 242,239,235,101,128, 33,207,232,229,225,246,121,128, 39,158,239, + 246,229,242,236,229,230,116,128, 33,196,247,232,233,244,101,128, + 33,232,244,225, 98, 2, 55,170, 55,177,236,229,230,116,128, 33, + 228,242,233,231,232,116,128, 33,229,245,112,132, 33,145, 55,198, + 55,226, 55,244, 55,252,100, 2, 55,204, 55,216,110,129, 33,149, + 55,210,226,243,101,128, 33,168,239,247,238,226,225,243,101,128, + 33,168,236,229,230,116,129, 33,150, 55,235,239,230,228,239,247, + 110,128, 33,197,242,233,231,232,116,128, 33,151,247,232,233,244, + 101,128, 33,231,246,229,242,244,229,120,128,248,230,115, 5, 56, + 25, 56,101, 56,146, 56,229, 56,239, 99, 2, 56, 31, 56, 83,233, + 105, 2, 56, 38, 56, 61,227,233,242,227,245,109,129, 0, 94, 56, + 49,237,239,238,239,243,240,225,227,101,128,255, 62,244,233,236, + 228,101,129, 0,126, 56, 71,237,239,238,239,243,240,225,227,101, + 128,255, 94,242,233,240,116,129, 2, 81, 56, 92,244,245,242,238, + 229,100,128, 2, 82,237,225,236,108, 2, 56,110, 56,121,232,233, + 242,225,231,225,238, 97,128, 48, 65,235,225,244,225,235,225,238, + 97,129, 48,161, 56,134,232,225,236,230,247,233,228,244,104,128, + 255,103,244,229,242,233,115, 2, 56,156, 56,225,107,131, 0, 42, + 56,166, 56,194, 56,217, 97, 2, 56,172, 56,186,236,244,239,238, + 229,225,242,225,226,233, 99,128, 6,109,242,225,226,233, 99,128, + 6,109,109, 2, 56,200, 56,206,225,244,104,128, 34, 23,239,238, + 239,243,240,225,227,101,128,255, 10,243,237,225,236,108,128,254, + 97,109,128, 32, 66,245,240,229,242,233,239,114,128,246,233,249, + 237,240,244,239,244,233,227,225,236,236,249,229,241,245,225,108, + 128, 34, 67,116,132, 0, 64, 57, 15, 57, 22, 57, 34, 57, 42,233, + 236,228,101,128, 0,227,237,239,238,239,243,240,225,227,101,128, + 255, 32,243,237,225,236,108,128,254,107,245,242,238,229,100,128, + 2, 80,117, 6, 57, 64, 57, 89, 57, 96, 57,121, 57,141, 57,157, + 98, 2, 57, 70, 57, 79,229,238,231,225,236,105,128, 9,148,239, + 240,239,237,239,230,111,128, 49, 32,228,229,246, 97,128, 9, 20, + 231,117, 2, 57,103, 57,112,234,225,242,225,244,105,128, 10,148, + 242,237,245,235,232,105,128, 10, 20,236,229,238,231,244,232,237, + 225,242,235,226,229,238,231,225,236,105,128, 9,215,237,225,244, + 242,225,231,245,242,237,245,235,232,105,128, 10, 76,246,239,247, + 229,236,243,233,231,110, 3, 57,173, 57,183, 57,190,226,229,238, + 231,225,236,105,128, 9,204,228,229,246, 97,128, 9, 76,231,245, + 234,225,242,225,244,105,128, 10,204,246,225,231,242,225,232,225, + 228,229,246, 97,128, 9, 61,121, 2, 57,221, 57,233,226,225,242, + 237,229,238,233,225,110,128, 5, 97,233,110,130, 5,226, 57,242, + 58, 1,225,236,244,239,238,229,232,229,226,242,229,119,128,251, + 32,232,229,226,242,229,119,128, 5,226, 98,144, 0, 98, 58, 46, + 58,181, 58,192, 58,201, 58,226, 60, 11, 60, 73, 60,146, 62, 72, + 62, 84, 62,127, 62,135, 62,145, 64, 15, 64, 39, 64, 48, 97, 7, + 58, 62, 58, 72, 58, 96, 58,103, 58,128, 58,152, 58,163,226,229, + 238,231,225,236,105,128, 9,172,227,235,243,236,225,243,104,129, + 0, 92, 58, 84,237,239,238,239,243,240,225,227,101,128,255, 60, + 228,229,246, 97,128, 9, 44,231,117, 2, 58,110, 58,119,234,225, + 242,225,244,105,128, 10,172,242,237,245,235,232,105,128, 10, 44, + 104, 2, 58,134, 58,144,233,242,225,231,225,238, 97,128, 48,112, + 244,244,232,225,105,128, 14, 63,235,225,244,225,235,225,238, 97, + 128, 48,208,114,129, 0,124, 58,169,237,239,238,239,243,240,225, + 227,101,128,255, 92,226,239,240,239,237,239,230,111,128, 49, 5, + 227,233,242,227,236,101,128, 36,209,228,239,116, 2, 58,209, 58, + 218,225,227,227,229,238,116,128, 30, 3,226,229,236,239,119,128, + 30, 5,101, 6, 58,240, 59, 5, 59, 28, 59,170, 59,181, 59,193, + 225,237,229,228,243,233,248,244,229,229,238,244,232,238,239,244, + 229,115,128, 38,108, 99, 2, 59, 11, 59, 18,225,245,243,101,128, + 34, 53,249,242,233,236,236,233, 99,128, 4, 49,104, 5, 59, 40, + 59, 49, 59, 63, 59, 93, 59,152,225,242,225,226,233, 99,128, 6, + 40,230,233,238,225,236,225,242,225,226,233, 99,128,254,144,105, + 2, 59, 69, 59, 84,238,233,244,233,225,236,225,242,225,226,233, + 99,128,254,145,242,225,231,225,238, 97,128, 48,121,237,101, 2, + 59,100, 59,113,228,233,225,236,225,242,225,226,233, 99,128,254, + 146,229,237,105, 2, 59,121, 59,136,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,252,159,243,239,236,225,244,229,228,225, + 242,225,226,233, 99,128,252, 8,238,239,239,238,230,233,238,225, + 236,225,242,225,226,233, 99,128,252,109,235,225,244,225,235,225, + 238, 97,128, 48,217,238,225,242,237,229,238,233,225,110,128, 5, + 98,116,132, 5,209, 59,205, 59,225, 59,245, 59,254, 97,129, 3, + 178, 59,211,243,249,237,226,239,236,231,242,229,229,107,128, 3, + 208,228,225,231,229,243,104,129,251, 49, 59,236,232,229,226,242, + 229,119,128,251, 49,232,229,226,242,229,119,128, 5,209,242,225, + 230,229,232,229,226,242,229,119,128,251, 76,104, 2, 60, 17, 60, + 67, 97, 3, 60, 25, 60, 35, 60, 42,226,229,238,231,225,236,105, + 128, 9,173,228,229,246, 97,128, 9, 45,231,117, 2, 60, 49, 60, + 58,234,225,242,225,244,105,128, 10,173,242,237,245,235,232,105, + 128, 10, 45,239,239,107,128, 2, 83,105, 5, 60, 85, 60, 96, 60, + 107, 60,121, 60,135,232,233,242,225,231,225,238, 97,128, 48,115, + 235,225,244,225,235,225,238, 97,128, 48,211,236,225,226,233,225, + 236,227,236,233,227,107,128, 2,152,238,228,233,231,245,242,237, + 245,235,232,105,128, 10, 2,242,245,243,241,245,225,242,101,128, + 51, 49,108, 3, 60,154, 62, 55, 62, 66, 97, 2, 60,160, 62, 50, + 227,107, 6, 60,175, 60,184, 60,221, 61,114, 61,169, 61,221,227, + 233,242,227,236,101,128, 37,207,100, 2, 60,190, 60,199,233,225, + 237,239,238,100,128, 37,198,239,247,238,240,239,233,238,244,233, + 238,231,244,242,233,225,238,231,236,101,128, 37,188,108, 2, 60, + 227, 61, 74,101, 2, 60,233, 61, 13,230,244,240,239,233,238,244, + 233,238,103, 2, 60,248, 61, 2,240,239,233,238,244,229,114,128, + 37,196,244,242,233,225,238,231,236,101,128, 37,192,238,244,233, + 227,245,236,225,242,226,242,225,227,235,229,116, 2, 61, 33, 61, + 53,236,229,230,116,129, 48, 16, 61, 42,246,229,242,244,233,227, + 225,108,128,254, 59,242,233,231,232,116,129, 48, 17, 61, 63,246, + 229,242,244,233,227,225,108,128,254, 60,239,247,229,114, 2, 61, + 83, 61, 98,236,229,230,244,244,242,233,225,238,231,236,101,128, + 37,227,242,233,231,232,244,244,242,233,225,238,231,236,101,128, + 37,226,114, 2, 61,120, 61,131,229,227,244,225,238,231,236,101, + 128, 37,172,233,231,232,244,240,239,233,238,244,233,238,103, 2, + 61,148, 61,158,240,239,233,238,244,229,114,128, 37,186,244,242, + 233,225,238,231,236,101,128, 37,182,115, 3, 61,177, 61,207, 61, + 215,109, 2, 61,183, 61,195,225,236,236,243,241,245,225,242,101, + 128, 37,170,233,236,233,238,231,230,225,227,101,128, 38, 59,241, + 245,225,242,101,128, 37,160,244,225,114,128, 38, 5,245,240,112, + 2, 61,229, 62, 11,229,114, 2, 61,236, 61,251,236,229,230,244, + 244,242,233,225,238,231,236,101,128, 37,228,242,233,231,232,244, + 244,242,233,225,238,231,236,101,128, 37,229,239,233,238,244,233, + 238,103, 2, 62, 23, 62, 39,243,237,225,236,236,244,242,233,225, + 238,231,236,101,128, 37,180,244,242,233,225,238,231,236,101,128, + 37,178,238,107,128, 36, 35,233,238,229,226,229,236,239,119,128, + 30, 7,239,227,107,128, 37,136,237,239,238,239,243,240,225,227, + 101,128,255, 66,111, 3, 62, 92, 62,105, 62,116,226,225,233,237, + 225,233,244,232,225,105,128, 14, 26,232,233,242,225,231,225,238, + 97,128, 48,124,235,225,244,225,235,225,238, 97,128, 48,220,240, + 225,242,229,110,128, 36,157,241,243,241,245,225,242,101,128, 51, + 195,114, 4, 62,155, 63,149, 63,222, 64, 5,225, 99, 2, 62,162, + 63, 56,101, 3, 62,170, 62,175, 62,243,229,120,128,248,244,236, + 229,230,116,133, 0,123, 62,192, 62,197, 62,219, 62,227, 62,232, + 226,116,128,248,243,109, 2, 62,203, 62,208,233,100,128,248,242, + 239,238,239,243,240,225,227,101,128,255, 91,243,237,225,236,108, + 128,254, 91,244,112,128,248,241,246,229,242,244,233,227,225,108, + 128,254, 55,242,233,231,232,116,133, 0,125, 63, 5, 63, 10, 63, + 32, 63, 40, 63, 45,226,116,128,248,254,109, 2, 63, 16, 63, 21, + 233,100,128,248,253,239,238,239,243,240,225,227,101,128,255, 93, + 243,237,225,236,108,128,254, 92,244,112,128,248,252,246,229,242, + 244,233,227,225,108,128,254, 56,235,229,116, 2, 63, 64, 63,106, + 236,229,230,116,132, 0, 91, 63, 79, 63, 84, 63, 89, 63,101,226, + 116,128,248,240,229,120,128,248,239,237,239,238,239,243,240,225, + 227,101,128,255, 59,244,112,128,248,238,242,233,231,232,116,132, + 0, 93, 63,122, 63,127, 63,132, 63,144,226,116,128,248,251,229, + 120,128,248,250,237,239,238,239,243,240,225,227,101,128,255, 61, + 244,112,128,248,249,229,246,101,131, 2,216, 63,161, 63,172, 63, + 178,226,229,236,239,247,227,237, 98,128, 3, 46,227,237, 98,128, + 3, 6,233,238,246,229,242,244,229,100, 3, 63,193, 63,204, 63, + 210,226,229,236,239,247,227,237, 98,128, 3, 47,227,237, 98,128, + 3, 17,228,239,245,226,236,229,227,237, 98,128, 3, 97,233,228, + 231,101, 2, 63,231, 63,242,226,229,236,239,247,227,237, 98,128, + 3, 42,233,238,246,229,242,244,229,228,226,229,236,239,247,227, + 237, 98,128, 3, 58,239,235,229,238,226,225,114,128, 0,166,115, + 2, 64, 21, 64, 29,244,242,239,235,101,128, 1,128,245,240,229, + 242,233,239,114,128,246,234,244,239,240,226,225,114,128, 1,131, + 117, 3, 64, 56, 64, 67, 64, 78,232,233,242,225,231,225,238, 97, + 128, 48,118,235,225,244,225,235,225,238, 97,128, 48,214,236,108, + 2, 64, 85, 64,115,229,116,130, 32, 34, 64, 94, 64,104,233,238, + 246,229,242,243,101,128, 37,216,239,240,229,242,225,244,239,114, + 128, 34, 25,243,229,249,101,128, 37,206, 99,143, 0, 99, 64,156, + 65,105, 65,116, 65,180, 65,211, 66, 48, 67,215, 68,199, 69, 43, + 69, 92, 72, 84, 72, 92, 72,102, 72,114, 72,147, 97, 9, 64,176, + 64,187, 64,197, 64,204, 64,211, 64,236, 64,246, 65, 42, 65, 51, + 225,242,237,229,238,233,225,110,128, 5,110,226,229,238,231,225, + 236,105,128, 9,154,227,245,244,101,128, 1, 7,228,229,246, 97, + 128, 9, 26,231,117, 2, 64,218, 64,227,234,225,242,225,244,105, + 128, 10,154,242,237,245,235,232,105,128, 10, 26,236,243,241,245, + 225,242,101,128, 51,136,238,228,242,225,226,233,238,228,117, 4, + 65, 8, 65, 18, 65, 24, 65, 31,226,229,238,231,225,236,105,128, + 9,129,227,237, 98,128, 3, 16,228,229,246, 97,128, 9, 1,231, + 245,234,225,242,225,244,105,128, 10,129,240,243,236,239,227,107, + 128, 33,234,114, 3, 65, 59, 65, 65, 65, 91,229,239,102,128, 33, + 5,239,110,130, 2,199, 65, 74, 65, 85,226,229,236,239,247,227, + 237, 98,128, 3, 44,227,237, 98,128, 3, 12,242,233,225,231,229, + 242,229,244,245,242,110,128, 33,181,226,239,240,239,237,239,230, + 111,128, 49, 24, 99, 4, 65,126, 65,133, 65,152, 65,174,225,242, + 239,110,128, 1, 13,229,228,233,236,236, 97,129, 0,231, 65,144, + 225,227,245,244,101,128, 30, 9,233,242, 99, 2, 65,160, 65,165, + 236,101,128, 36,210,245,237,230,236,229,120,128, 1, 9,245,242, + 108,128, 2, 85,100, 2, 65,186, 65,202,239,116,129, 1, 11, 65, + 193,225,227,227,229,238,116,128, 1, 11,243,241,245,225,242,101, + 128, 51,197,101, 2, 65,217, 65,233,228,233,236,236, 97,129, 0, + 184, 65,227,227,237, 98,128, 3, 39,238,116,132, 0,162, 65,246, + 66, 14, 66, 26, 66, 37,105, 2, 65,252, 66, 4,231,242,225,228, + 101,128, 33, 3,238,230,229,242,233,239,114,128,246,223,237,239, + 238,239,243,240,225,227,101,128,255,224,239,236,228,243,244,249, + 236,101,128,247,162,243,245,240,229,242,233,239,114,128,246,224, + 104, 5, 66, 60, 66,123, 66,134, 67, 62, 67,154, 97, 4, 66, 70, + 66, 81, 66, 91, 66, 98,225,242,237,229,238,233,225,110,128, 5, + 121,226,229,238,231,225,236,105,128, 9,155,228,229,246, 97,128, + 9, 27,231,117, 2, 66,105, 66,114,234,225,242,225,244,105,128, + 10,155,242,237,245,235,232,105,128, 10, 27,226,239,240,239,237, + 239,230,111,128, 49, 20,101, 6, 66,148, 66,168, 66,192, 67, 4, + 67, 16, 67, 37,225,226,235,232,225,243,233,225,238,227,249,242, + 233,236,236,233, 99,128, 4,189, 99, 2, 66,174, 66,182,235,237, + 225,242,107,128, 39, 19,249,242,233,236,236,233, 99,128, 4, 71, + 100, 2, 66,198, 66,242,229,243,227,229,238,228,229,114, 2, 66, + 211, 66,231,225,226,235,232,225,243,233,225,238,227,249,242,233, + 236,236,233, 99,128, 4,191,227,249,242,233,236,236,233, 99,128, + 4,183,233,229,242,229,243,233,243,227,249,242,233,236,236,233, + 99,128, 4,245,232,225,242,237,229,238,233,225,110,128, 5,115, + 235,232,225,235,225,243,243,233,225,238,227,249,242,233,236,236, + 233, 99,128, 4,204,246,229,242,244,233,227,225,236,243,244,242, + 239,235,229,227,249,242,233,236,236,233, 99,128, 4,185,105,129, + 3,199, 67, 68,229,245,227,104, 4, 67, 81, 67,116, 67,131, 67, + 140, 97, 2, 67, 87, 67,102,227,233,242,227,236,229,235,239,242, + 229,225,110,128, 50,119,240,225,242,229,238,235,239,242,229,225, + 110,128, 50, 23,227,233,242,227,236,229,235,239,242,229,225,110, + 128, 50,105,235,239,242,229,225,110,128, 49, 74,240,225,242,229, + 238,235,239,242,229,225,110,128, 50, 9,111, 2, 67,160, 67,210, + 227,104, 3, 67,169, 67,191, 67,201,225,110, 2, 67,176, 67,184, + 231,244,232,225,105,128, 14, 10,244,232,225,105,128, 14, 8,233, + 238,231,244,232,225,105,128, 14, 9,239,229,244,232,225,105,128, + 14, 12,239,107,128, 1,136,105, 2, 67,221, 68, 67,229,245, 99, + 5, 67,235, 68, 14, 68, 29, 68, 38, 68, 52, 97, 2, 67,241, 68, + 0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,118, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 22,227,233, + 242,227,236,229,235,239,242,229,225,110,128, 50,104,235,239,242, + 229,225,110,128, 49, 72,240,225,242,229,238,235,239,242,229,225, + 110,128, 50, 8,245,240,225,242,229,238,235,239,242,229,225,110, + 128, 50, 28,242, 99, 2, 68, 74, 68,169,236,101,132, 37,203, 68, + 87, 68, 98, 68,103, 68,127,237,245,236,244,233,240,236,121,128, + 34,151,239,116,128, 34,153,112, 2, 68,109, 68,115,236,245,115, + 128, 34,149,239,243,244,225,236,237,225,242,107,128, 48, 54,247, + 233,244,104, 2, 68,136, 68,152,236,229,230,244,232,225,236,230, + 226,236,225,227,107,128, 37,208,242,233,231,232,244,232,225,236, + 230,226,236,225,227,107,128, 37,209,245,237,230,236,229,120,130, + 2,198, 68,182, 68,193,226,229,236,239,247,227,237, 98,128, 3, + 45,227,237, 98,128, 3, 2,108, 3, 68,207, 68,213, 69, 11,229, + 225,114,128, 35, 39,233,227,107, 4, 68,225, 68,236, 68,245, 68, + 255,225,236,246,229,239,236,225,114,128, 1,194,228,229,238,244, + 225,108,128, 1,192,236,225,244,229,242,225,108,128, 1,193,242, + 229,244,242,239,230,236,229,120,128, 1,195,245, 98,129, 38, 99, + 69, 18,243,245,233,116, 2, 69, 27, 69, 35,226,236,225,227,107, + 128, 38, 99,247,232,233,244,101,128, 38,103,109, 3, 69, 51, 69, + 65, 69, 76,227,245,226,229,228,243,241,245,225,242,101,128, 51, + 164,239,238,239,243,240,225,227,101,128,255, 67,243,241,245,225, + 242,229,228,243,241,245,225,242,101,128, 51,160,111, 8, 69,110, + 69,121, 69,208, 70,150, 71,179, 71,210, 72, 61, 72, 70,225,242, + 237,229,238,233,225,110,128, 5,129,236,239,110,131, 0, 58, 69, + 133, 69,158, 69,177,237,239,110, 2, 69,141, 69,149,229,244,225, + 242,121,128, 32,161,239,243,240,225,227,101,128,255, 26,115, 2, + 69,164, 69,170,233,231,110,128, 32,161,237,225,236,108,128,254, + 85,244,242,233,225,238,231,245,236,225,114, 2, 69,192, 69,202, + 232,225,236,230,237,239,100,128, 2,209,237,239,100,128, 2,208, + 109, 2, 69,214, 70,143,237, 97,134, 0, 44, 69,231, 70, 39, 70, + 50, 70, 62, 70, 92, 70,115, 97, 3, 69,239, 70, 9, 70, 17,226, + 239,246,101, 2, 69,248, 69,254,227,237, 98,128, 3, 19,242,233, + 231,232,244,227,237, 98,128, 3, 21,227,227,229,238,116,128,246, + 195,114, 2, 70, 23, 70, 30,225,226,233, 99,128, 6, 12,237,229, + 238,233,225,110,128, 5, 93,233,238,230,229,242,233,239,114,128, + 246,225,237,239,238,239,243,240,225,227,101,128,255, 12,242,229, + 246,229,242,243,229,100, 2, 70, 75, 70, 86,225,226,239,246,229, + 227,237, 98,128, 3, 20,237,239,100,128, 2,189,115, 2, 70, 98, + 70,105,237,225,236,108,128,254, 80,245,240,229,242,233,239,114, + 128,246,226,244,245,242,238,229,100, 2, 70,126, 70,137,225,226, + 239,246,229,227,237, 98,128, 3, 18,237,239,100,128, 2,187,240, + 225,243,115,128, 38, 60,110, 2, 70,156, 70,165,231,242,245,229, + 238,116,128, 34, 69,116, 2, 70,171, 70,185,239,245,242,233,238, + 244,229,231,242,225,108,128, 34, 46,242,239,108,142, 35, 3, 70, + 219, 70,225, 70,240, 70,255, 71, 43, 71, 88, 71,102, 71,107, 71, + 112, 71,117, 71,123, 71,128, 71,169, 71,174,193,195, 75,128, 0, + 6, 66, 2, 70,231, 70,236,197, 76,128, 0, 7, 83,128, 0, 8, + 67, 2, 70,246, 70,251,193, 78,128, 0, 24, 82,128, 0, 13, 68, + 3, 71, 7, 71, 33, 71, 38, 67, 4, 71, 17, 71, 21, 71, 25, 71, + 29, 49,128, 0, 17, 50,128, 0, 18, 51,128, 0, 19, 52,128, 0, + 20,197, 76,128, 0,127,204, 69,128, 0, 16, 69, 5, 71, 55, 71, + 59, 71, 64, 71, 69, 71, 74, 77,128, 0, 25,206, 81,128, 0, 5, + 207, 84,128, 0, 4,211, 67,128, 0, 27, 84, 2, 71, 80, 71, 84, + 66,128, 0, 23, 88,128, 0, 3, 70, 2, 71, 94, 71, 98, 70,128, + 0, 12, 83,128, 0, 28,199, 83,128, 0, 29,200, 84,128, 0, 9, + 204, 70,128, 0, 10,206,193, 75,128, 0, 21,210, 83,128, 0, 30, + 83, 5, 71,140, 71,144, 71,154, 71,159, 71,164, 73,128, 0, 15, + 79,129, 0, 14, 71,150, 84,128, 0, 2,212, 88,128, 0, 1,213, + 66,128, 0, 26,217, 78,128, 0, 22,213, 83,128, 0, 31,214, 84, + 128, 0, 11,240,249,242,233,231,232,116,129, 0,169, 71,191,115, + 2, 71,197, 71,203,225,238,115,128,248,233,229,242,233,102,128, + 246,217,114, 2, 71,216, 72, 44,238,229,242,226,242,225,227,235, + 229,116, 2, 71,231, 72, 9,236,229,230,116,130, 48, 12, 71,242, + 71,254,232,225,236,230,247,233,228,244,104,128,255, 98,246,229, + 242,244,233,227,225,108,128,254, 65,242,233,231,232,116,130, 48, + 13, 72, 21, 72, 33,232,225,236,230,247,233,228,244,104,128,255, + 99,246,229,242,244,233,227,225,108,128,254, 66,240,239,242,225, + 244,233,239,238,243,241,245,225,242,101,128, 51,127,243,241,245, + 225,242,101,128, 51,199,246,229,242,235,231,243,241,245,225,242, + 101,128, 51,198,240,225,242,229,110,128, 36,158,242,245,250,229, + 233,242,111,128, 32,162,243,244,242,229,244,227,232,229,100,128, + 2,151,245,114, 2, 72,121, 72,139,236,121, 2, 72,128, 72,134, + 225,238,100,128, 34,207,239,114,128, 34,206,242,229,238,227,121, + 128, 0,164,249,114, 4, 72,158, 72,166, 72,173, 72,181,194,242, + 229,246,101,128,246,209,198,236,229,120,128,246,210,226,242,229, + 246,101,128,246,212,230,236,229,120,128,246,213,100,146, 0,100, + 72,228, 74,110, 75,134, 75,194, 76,114, 77, 68, 77,130, 78, 59, + 78, 72, 78, 81, 78,107, 78,132, 78,141, 79,208, 79,216, 79,227, + 79,247, 80, 19, 97, 11, 72,252, 73, 7, 73, 17, 73, 89, 73,152, + 73,163, 73,174, 73,243, 74, 49, 74, 55, 74, 85,225,242,237,229, + 238,233,225,110,128, 5,100,226,229,238,231,225,236,105,128, 9, + 166,100, 5, 73, 29, 73, 38, 73, 44, 73, 58, 73, 74,225,242,225, + 226,233, 99,128, 6, 54,229,246, 97,128, 9, 38,230,233,238,225, + 236,225,242,225,226,233, 99,128,254,190,233,238,233,244,233,225, + 236,225,242,225,226,233, 99,128,254,191,237,229,228,233,225,236, + 225,242,225,226,233, 99,128,254,192,103, 3, 73, 97, 73,114, 73, + 128,229,243,104,129, 5,188, 73,105,232,229,226,242,229,119,128, + 5,188,231,229,114,129, 32, 32, 73,122,228,226,108,128, 32, 33, + 117, 2, 73,134, 73,143,234,225,242,225,244,105,128, 10,166,242, + 237,245,235,232,105,128, 10, 38,232,233,242,225,231,225,238, 97, + 128, 48, 96,235,225,244,225,235,225,238, 97,128, 48,192,108, 3, + 73,182, 73,191, 73,229,225,242,225,226,233, 99,128, 6, 47,229, + 116,130, 5,211, 73,200, 73,220,228,225,231,229,243,104,129,251, + 51, 73,211,232,229,226,242,229,119,128,251, 51,232,229,226,242, + 229,119,128, 5,211,230,233,238,225,236,225,242,225,226,233, 99, + 128,254,170,237,237, 97, 3, 73,253, 74, 6, 74, 18,225,242,225, + 226,233, 99,128, 6, 79,236,239,247,225,242,225,226,233, 99,128, + 6, 79,244,225,238, 97, 2, 74, 27, 74, 41,236,244,239,238,229, + 225,242,225,226,233, 99,128, 6, 76,242,225,226,233, 99,128, 6, + 76,238,228, 97,128, 9,100,242,231, 97, 2, 74, 63, 74, 72,232, + 229,226,242,229,119,128, 5,167,236,229,230,244,232,229,226,242, + 229,119,128, 5,167,243,233,225,240,238,229,245,237,225,244,225, + 227,249,242,233,236,236,233,227,227,237, 98,128, 4,133, 98, 3, + 74,118, 75,115, 75,125,108, 9, 74,138, 74,146, 75, 3, 75, 11, + 75, 27, 75, 38, 75, 56, 75, 70, 75, 81,199,242,225,246,101,128, + 246,211, 97, 2, 74,152, 74,209,238,231,236,229,226,242,225,227, + 235,229,116, 2, 74,168, 74,188,236,229,230,116,129, 48, 10, 74, + 177,246,229,242,244,233,227,225,108,128,254, 61,242,233,231,232, + 116,129, 48, 11, 74,198,246,229,242,244,233,227,225,108,128,254, + 62,114, 2, 74,215, 74,236,227,232,233,238,246,229,242,244,229, + 228,226,229,236,239,247,227,237, 98,128, 3, 43,242,239,119, 2, + 74,244, 74,251,236,229,230,116,128, 33,212,242,233,231,232,116, + 128, 33,210,228,225,238,228, 97,128, 9,101,231,242,225,246,101, + 129,246,214, 75, 21,227,237, 98,128, 3, 15,233,238,244,229,231, + 242,225,108,128, 34, 44,236,239,247,236,233,238,101,129, 32, 23, + 75, 50,227,237, 98,128, 3, 51,239,246,229,242,236,233,238,229, + 227,237, 98,128, 3, 63,240,242,233,237,229,237,239,100,128, 2, + 186,246,229,242,244,233,227,225,108, 2, 75, 94, 75,100,226,225, + 114,128, 32, 22,236,233,238,229,225,226,239,246,229,227,237, 98, + 128, 3, 14,239,240,239,237,239,230,111,128, 49, 9,243,241,245, + 225,242,101,128, 51,200, 99, 4, 75,144, 75,151, 75,160, 75,187, + 225,242,239,110,128, 1, 15,229,228,233,236,236, 97,128, 30, 17, + 233,242, 99, 2, 75,168, 75,173,236,101,128, 36,211,245,237,230, + 236,229,248,226,229,236,239,119,128, 30, 19,242,239,225,116,128, + 1, 17,100, 4, 75,204, 76, 29, 76, 39, 76, 90, 97, 4, 75,214, + 75,224, 75,231, 76, 0,226,229,238,231,225,236,105,128, 9,161, + 228,229,246, 97,128, 9, 33,231,117, 2, 75,238, 75,247,234,225, + 242,225,244,105,128, 10,161,242,237,245,235,232,105,128, 10, 33, + 108, 2, 76, 6, 76, 15,225,242,225,226,233, 99,128, 6,136,230, + 233,238,225,236,225,242,225,226,233, 99,128,251,137,228,232,225, + 228,229,246, 97,128, 9, 92,232, 97, 3, 76, 48, 76, 58, 76, 65, + 226,229,238,231,225,236,105,128, 9,162,228,229,246, 97,128, 9, + 34,231,117, 2, 76, 72, 76, 81,234,225,242,225,244,105,128, 10, + 162,242,237,245,235,232,105,128, 10, 34,239,116, 2, 76, 97, 76, + 106,225,227,227,229,238,116,128, 30, 11,226,229,236,239,119,128, + 30, 13,101, 8, 76,132, 76,185, 76,192, 76,217, 76,227, 76,238, + 77, 27, 77, 63, 99, 2, 76,138, 76,175,233,237,225,236,243,229, + 240,225,242,225,244,239,114, 2, 76,156, 76,165,225,242,225,226, + 233, 99,128, 6,107,240,229,242,243,233,225,110,128, 6,107,249, + 242,233,236,236,233, 99,128, 4, 52,231,242,229,101,128, 0,176, + 232,105, 2, 76,199, 76,208,232,229,226,242,229,119,128, 5,173, + 242,225,231,225,238, 97,128, 48,103,233,227,239,240,244,233, 99, + 128, 3,239,235,225,244,225,235,225,238, 97,128, 48,199,108, 2, + 76,244, 77, 11,229,244,101, 2, 76,252, 77, 3,236,229,230,116, + 128, 35, 43,242,233,231,232,116,128, 35, 38,244, 97,129, 3,180, + 77, 18,244,245,242,238,229,100,128, 1,141,238,239,237,233,238, + 225,244,239,242,237,233,238,245,243,239,238,229,238,245,237,229, + 242,225,244,239,242,226,229,238,231,225,236,105,128, 9,248,250, + 104,128, 2,164,104, 2, 77, 74, 77,124, 97, 3, 77, 82, 77, 92, + 77, 99,226,229,238,231,225,236,105,128, 9,167,228,229,246, 97, + 128, 9, 39,231,117, 2, 77,106, 77,115,234,225,242,225,244,105, + 128, 10,167,242,237,245,235,232,105,128, 10, 39,239,239,107,128, + 2, 87,105, 6, 77,144, 77,193, 77,253, 78, 8, 78, 19, 78, 29, + 97, 2, 77,150, 77,172,236,249,244,233,235,225,244,239,238,239, + 115,129, 3,133, 77,166,227,237, 98,128, 3, 68,237,239,238,100, + 129, 38,102, 77,181,243,245,233,244,247,232,233,244,101,128, 38, + 98,229,242,229,243,233,115,133, 0,168, 77,212, 77,220, 77,231, + 77,237, 77,245,225,227,245,244,101,128,246,215,226,229,236,239, + 247,227,237, 98,128, 3, 36,227,237, 98,128, 3, 8,231,242,225, + 246,101,128,246,216,244,239,238,239,115,128, 3,133,232,233,242, + 225,231,225,238, 97,128, 48, 98,235,225,244,225,235,225,238, 97, + 128, 48,194,244,244,239,237,225,242,107,128, 48, 3,246,105, 2, + 78, 36, 78, 47,228,101,129, 0,247, 78, 43,115,128, 34, 35,243, + 233,239,238,243,236,225,243,104,128, 34, 21,234,229,227,249,242, + 233,236,236,233, 99,128, 4, 82,235,243,232,225,228,101,128, 37, + 147,108, 2, 78, 87, 78, 98,233,238,229,226,229,236,239,119,128, + 30, 15,243,241,245,225,242,101,128, 51,151,109, 2, 78,113, 78, + 121,225,227,242,239,110,128, 1, 17,239,238,239,243,240,225,227, + 101,128,255, 68,238,226,236,239,227,107,128, 37,132,111, 10, 78, + 163, 78,175, 78,185, 78,196, 78,207, 79, 23, 79, 28, 79, 39, 79, + 154, 79,180,227,232,225,228,225,244,232,225,105,128, 14, 14,228, + 229,235,244,232,225,105,128, 14, 20,232,233,242,225,231,225,238, + 97,128, 48,105,235,225,244,225,235,225,238, 97,128, 48,201,236, + 236,225,114,132, 0, 36, 78,222, 78,233, 78,245, 79, 0,233,238, + 230,229,242,233,239,114,128,246,227,237,239,238,239,243,240,225, + 227,101,128,255, 4,239,236,228,243,244,249,236,101,128,247, 36, + 115, 2, 79, 6, 79, 13,237,225,236,108,128,254,105,245,240,229, + 242,233,239,114,128,246,228,238,103,128, 32,171,242,245,243,241, + 245,225,242,101,128, 51, 38,116, 6, 79, 53, 79, 70, 79, 92, 79, + 103, 79,135, 79,142,225,227,227,229,238,116,129, 2,217, 79, 64, + 227,237, 98,128, 3, 7,226,229,236,239,247, 99, 2, 79, 81, 79, + 86,237, 98,128, 3, 35,239,237, 98,128, 3, 35,235,225,244,225, + 235,225,238, 97,128, 48,251,236,229,243,115, 2, 79,112, 79,116, + 105,128, 1, 49,106,129,246,190, 79,122,243,244,242,239,235,229, + 232,239,239,107,128, 2,132,237,225,244,104,128, 34,197,244,229, + 228,227,233,242,227,236,101,128, 37,204,245,226,236,229,249,239, + 228,240,225,244,225,104,129,251, 31, 79,171,232,229,226,242,229, + 119,128,251, 31,247,238,244,225,227,107, 2, 79,191, 79,202,226, + 229,236,239,247,227,237, 98,128, 3, 30,237,239,100,128, 2,213, + 240,225,242,229,110,128, 36,159,243,245,240,229,242,233,239,114, + 128,246,235,116, 2, 79,233, 79,239,225,233,108,128, 2, 86,239, + 240,226,225,114,128, 1,140,117, 2, 79,253, 80, 8,232,233,242, + 225,231,225,238, 97,128, 48,101,235,225,244,225,235,225,238, 97, + 128, 48,197,122,132, 1,243, 80, 31, 80, 40, 80, 59, 80, 96,225, + 236,244,239,238,101,128, 2,163, 99, 2, 80, 46, 80, 53,225,242, + 239,110,128, 1,198,245,242,108,128, 2,165,101, 2, 80, 65, 80, + 85,225,226,235,232,225,243,233,225,238,227,249,242,233,236,236, + 233, 99,128, 4,225,227,249,242,233,236,236,233, 99,128, 4, 85, + 232,229,227,249,242,233,236,236,233, 99,128, 4, 95,101,151, 0, + 101, 80,159, 80,178, 80,212, 81,186, 81,248, 82, 25, 82, 37, 82, + 60, 82,113, 83,225, 84, 27, 84,129, 84,245, 85,124, 85,199, 85, + 230, 86, 36, 86, 89, 87, 24, 87,157, 87,177, 87,221, 88, 56, 97, + 2, 80,165, 80,172,227,245,244,101,128, 0,233,242,244,104,128, + 38, 65, 98, 3, 80,186, 80,195, 80,205,229,238,231,225,236,105, + 128, 9,143,239,240,239,237,239,230,111,128, 49, 28,242,229,246, + 101,128, 1, 21, 99, 5, 80,224, 81, 41, 81, 55, 81, 87, 81,176, + 97, 2, 80,230, 81, 35,238,228,242, 97, 3, 80,241, 80,248, 81, + 3,228,229,246, 97,128, 9, 13,231,245,234,225,242,225,244,105, + 128, 10,141,246,239,247,229,236,243,233,231,110, 2, 81, 17, 81, + 24,228,229,246, 97,128, 9, 69,231,245,234,225,242,225,244,105, + 128, 10,197,242,239,110,128, 1, 27,229,228,233,236,236,225,226, + 242,229,246,101,128, 30, 29,104, 2, 81, 61, 81, 72,225,242,237, + 229,238,233,225,110,128, 5,101,249,233,247,238,225,242,237,229, + 238,233,225,110,128, 5,135,233,242, 99, 2, 81, 95, 81,100,236, + 101,128, 36,212,245,237,230,236,229,120,134, 0,234, 81,121, 81, + 129, 81,137, 81,148, 81,156, 81,168,225,227,245,244,101,128, 30, + 191,226,229,236,239,119,128, 30, 25,228,239,244,226,229,236,239, + 119,128, 30,199,231,242,225,246,101,128, 30,193,232,239,239,235, + 225,226,239,246,101,128, 30,195,244,233,236,228,101,128, 30,197, + 249,242,233,236,236,233, 99,128, 4, 84,100, 4, 81,196, 81,206, + 81,212, 81,222,226,236,231,242,225,246,101,128, 2, 5,229,246, + 97,128, 9, 15,233,229,242,229,243,233,115,128, 0,235,239,116, + 130, 1, 23, 81,231, 81,240,225,227,227,229,238,116,128, 1, 23, + 226,229,236,239,119,128, 30,185,101, 2, 81,254, 82, 9,231,245, + 242,237,245,235,232,105,128, 10, 15,237,225,244,242,225,231,245, + 242,237,245,235,232,105,128, 10, 71,230,227,249,242,233,236,236, + 233, 99,128, 4, 68,103, 2, 82, 43, 82, 50,242,225,246,101,128, + 0,232,245,234,225,242,225,244,105,128, 10,143,104, 4, 82, 70, + 82, 81, 82, 92, 82,102,225,242,237,229,238,233,225,110,128, 5, + 103,226,239,240,239,237,239,230,111,128, 49, 29,233,242,225,231, + 225,238, 97,128, 48, 72,239,239,235,225,226,239,246,101,128, 30, + 187,105, 4, 82,123, 82,134, 83,192, 83,207,226,239,240,239,237, + 239,230,111,128, 49, 31,231,232,116,142, 0, 56, 82,168, 82,177, + 82,187, 82,217, 82,224, 83, 6, 83, 31, 83, 76, 83,110, 83,122, + 83,133, 83,166, 83,174, 83,185,225,242,225,226,233, 99,128, 6, + 104,226,229,238,231,225,236,105,128, 9,238,227,233,242,227,236, + 101,129, 36,103, 82,198,233,238,246,229,242,243,229,243,225,238, + 243,243,229,242,233,102,128, 39,145,228,229,246, 97,128, 9,110, + 229,229,110, 2, 82,232, 82,241,227,233,242,227,236,101,128, 36, + 113,112, 2, 82,247, 82,254,225,242,229,110,128, 36,133,229,242, + 233,239,100,128, 36,153,231,117, 2, 83, 13, 83, 22,234,225,242, + 225,244,105,128, 10,238,242,237,245,235,232,105,128, 10,110,104, + 2, 83, 37, 83, 63, 97, 2, 83, 43, 83, 54,227,235,225,242,225, + 226,233, 99,128, 6,104,238,231,250,232,239,117,128, 48, 40,238, + 239,244,229,226,229,225,237,229,100,128, 38,107,105, 2, 83, 82, + 83,100,228,229,239,231,242,225,240,232,233,227,240,225,242,229, + 110,128, 50, 39,238,230,229,242,233,239,114,128, 32,136,237,239, + 238,239,243,240,225,227,101,128,255, 24,239,236,228,243,244,249, + 236,101,128,247, 56,112, 2, 83,139, 83,146,225,242,229,110,128, + 36,123,229,114, 2, 83,153, 83,159,233,239,100,128, 36,143,243, + 233,225,110,128, 6,248,242,239,237,225,110,128, 33,119,243,245, + 240,229,242,233,239,114,128, 32,120,244,232,225,105,128, 14, 88, + 238,246,229,242,244,229,228,226,242,229,246,101,128, 2, 7,239, + 244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, 4, + 101,107, 2, 83,231, 83,255,225,244,225,235,225,238, 97,129, 48, + 168, 83,243,232,225,236,230,247,233,228,244,104,128,255,116,111, + 2, 84, 5, 84, 20,238,235,225,242,231,245,242,237,245,235,232, + 105,128, 10,116,242,229,225,110,128, 49, 84,108, 3, 84, 35, 84, + 46, 84,107,227,249,242,233,236,236,233, 99,128, 4, 59,101, 2, + 84, 52, 84, 59,237,229,238,116,128, 34, 8,246,229,110, 3, 84, + 69, 84, 78, 84, 99,227,233,242,227,236,101,128, 36,106,112, 2, + 84, 84, 84, 91,225,242,229,110,128, 36,126,229,242,233,239,100, + 128, 36,146,242,239,237,225,110,128, 33,122,236,233,240,243,233, + 115,129, 32, 38, 84,118,246,229,242,244,233,227,225,108,128, 34, + 238,109, 5, 84,141, 84,169, 84,180, 84,200, 84,211,225,227,242, + 239,110,130, 1, 19, 84,153, 84,161,225,227,245,244,101,128, 30, + 23,231,242,225,246,101,128, 30, 21,227,249,242,233,236,236,233, + 99,128, 4, 60,228,225,243,104,129, 32, 20, 84,189,246,229,242, + 244,233,227,225,108,128,254, 49,239,238,239,243,240,225,227,101, + 128,255, 69,112, 2, 84,217, 84,237,232,225,243,233,243,237,225, + 242,235,225,242,237,229,238,233,225,110,128, 5, 91,244,249,243, + 229,116,128, 34, 5,110, 6, 85, 3, 85, 14, 85, 25, 85, 69, 85, + 101, 85,116,226,239,240,239,237,239,230,111,128, 49, 35,227,249, + 242,233,236,236,233, 99,128, 4, 61,100, 2, 85, 31, 85, 50,225, + 243,104,129, 32, 19, 85, 39,246,229,242,244,233,227,225,108,128, + 254, 50,229,243,227,229,238,228,229,242,227,249,242,233,236,236, + 233, 99,128, 4,163,103,130, 1, 75, 85, 77, 85, 88,226,239,240, + 239,237,239,230,111,128, 49, 37,232,229,227,249,242,233,236,236, + 233, 99,128, 4,165,232,239,239,235,227,249,242,233,236,236,233, + 99,128, 4,200,243,240,225,227,101,128, 32, 2,111, 3, 85,132, + 85,140, 85,149,231,239,238,229,107,128, 1, 25,235,239,242,229, + 225,110,128, 49, 83,240,229,110,130, 2, 91, 85,159, 85,168,227, + 236,239,243,229,100,128, 2,154,242,229,246,229,242,243,229,100, + 130, 2, 92, 85,183, 85,192,227,236,239,243,229,100,128, 2, 94, + 232,239,239,107,128, 2, 93,112, 2, 85,205, 85,212,225,242,229, + 110,128, 36,160,243,233,236,239,110,129, 3,181, 85,222,244,239, + 238,239,115,128, 3,173,241,117, 2, 85,237, 86, 25,225,108,130, + 0, 61, 85,246, 86, 2,237,239,238,239,243,240,225,227,101,128, + 255, 29,115, 2, 86, 8, 86, 15,237,225,236,108,128,254,102,245, + 240,229,242,233,239,114,128, 32,124,233,246,225,236,229,238,227, + 101,128, 34, 97,114, 3, 86, 44, 86, 55, 86, 66,226,239,240,239, + 237,239,230,111,128, 49, 38,227,249,242,233,236,236,233, 99,128, + 4, 64,229,246,229,242,243,229,100,129, 2, 88, 86, 78,227,249, + 242,233,236,236,233, 99,128, 4, 77,115, 6, 86,103, 86,114, 86, + 134, 86,215, 87, 4, 87, 14,227,249,242,233,236,236,233, 99,128, + 4, 65,228,229,243,227,229,238,228,229,242,227,249,242,233,236, + 236,233, 99,128, 4,171,104,132, 2,131, 86,146, 86,153, 86,184, + 86,199,227,245,242,108,128, 2,134,239,242,116, 2, 86,161, 86, + 168,228,229,246, 97,128, 9, 14,246,239,247,229,236,243,233,231, + 238,228,229,246, 97,128, 9, 70,242,229,246,229,242,243,229,228, + 236,239,239,112,128, 1,170,243,241,245,225,244,242,229,246,229, + 242,243,229,100,128, 2,133,237,225,236,108, 2, 86,224, 86,235, + 232,233,242,225,231,225,238, 97,128, 48, 71,235,225,244,225,235, + 225,238, 97,129, 48,167, 86,248,232,225,236,230,247,233,228,244, + 104,128,255,106,244,233,237,225,244,229,100,128, 33, 46,245,240, + 229,242,233,239,114,128,246,236,116, 5, 87, 36, 87, 62, 87, 66, + 87, 83, 87,149, 97,130, 3,183, 87, 44, 87, 54,242,237,229,238, + 233,225,110,128, 5,104,244,239,238,239,115,128, 3,174,104,128, + 0,240,233,236,228,101,129, 30,189, 87, 75,226,229,236,239,119, + 128, 30, 27,238,225,232,244, 97, 3, 87, 95, 87,127, 87,136,230, + 239,245,235,104, 2, 87,105, 87,114,232,229,226,242,229,119,128, + 5,145,236,229,230,244,232,229,226,242,229,119,128, 5,145,232, + 229,226,242,229,119,128, 5,145,236,229,230,244,232,229,226,242, + 229,119,128, 5,145,245,242,238,229,100,128, 1,221,117, 2, 87, + 163, 87,172,235,239,242,229,225,110,128, 49, 97,242,111,128, 32, + 172,246,239,247,229,236,243,233,231,110, 3, 87,193, 87,203, 87, + 210,226,229,238,231,225,236,105,128, 9,199,228,229,246, 97,128, + 9, 71,231,245,234,225,242,225,244,105,128, 10,199,120, 2, 87, + 227, 88, 44,227,236,225,109,132, 0, 33, 87,242, 87,253, 88, 24, + 88, 36,225,242,237,229,238,233,225,110,128, 5, 92,100, 2, 88, + 3, 88, 8,226,108,128, 32, 60,239,247,110,129, 0,161, 88, 16, + 243,237,225,236,108,128,247,161,237,239,238,239,243,240,225,227, + 101,128,255, 1,243,237,225,236,108,128,247, 33,233,243,244,229, + 238,244,233,225,108,128, 34, 3,250,104,131, 2,146, 88, 67, 88, + 86, 88, 97, 99, 2, 88, 73, 88, 80,225,242,239,110,128, 1,239, + 245,242,108,128, 2,147,242,229,246,229,242,243,229,100,128, 1, + 185,244,225,233,108,128, 1,186,102,140, 0,102, 88,132, 88,214, + 88,225, 88,234, 88,246, 89, 93, 89,109, 91,117, 91,130, 91,156, + 93, 33, 93, 41, 97, 4, 88,142, 88,149, 88,160, 88,171,228,229, + 246, 97,128, 9, 94,231,245,242,237,245,235,232,105,128, 10, 94, + 232,242,229,238,232,229,233,116,128, 33, 9,244,232, 97, 3, 88, + 181, 88,190, 88,202,225,242,225,226,233, 99,128, 6, 78,236,239, + 247,225,242,225,226,233, 99,128, 6, 78,244,225,238,225,242,225, + 226,233, 99,128, 6, 75,226,239,240,239,237,239,230,111,128, 49, + 8,227,233,242,227,236,101,128, 36,213,228,239,244,225,227,227, + 229,238,116,128, 30, 31,101, 3, 88,254, 89, 76, 89, 86,104, 4, + 89, 8, 89, 31, 89, 45, 89, 61,225,114, 2, 89, 15, 89, 22,225, + 226,233, 99,128, 6, 65,237,229,238,233,225,110,128, 5,134,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,210,233,238,233, + 244,233,225,236,225,242,225,226,233, 99,128,254,211,237,229,228, + 233,225,236,225,242,225,226,233, 99,128,254,212,233,227,239,240, + 244,233, 99,128, 3,229,237,225,236,101,128, 38, 64,102,130,251, + 0, 89,101, 89,105,105,128,251, 3,108,128,251, 4,105,136,251, + 1, 89,129, 89,169, 89,180, 89,202, 90, 68, 90, 85, 90, 93, 90, + 106,230,244,229,229,110, 2, 89,139, 89,148,227,233,242,227,236, + 101,128, 36,110,112, 2, 89,154, 89,161,225,242,229,110,128, 36, + 130,229,242,233,239,100,128, 36,150,231,245,242,229,228,225,243, + 104,128, 32, 18,236,236,229,100, 2, 89,189, 89,195,226,239,120, + 128, 37,160,242,229,227,116,128, 37,172,238,225,108, 5, 89,216, + 89,255, 90, 16, 90, 33, 90, 49,235,225,102,130, 5,218, 89,226, + 89,246,228,225,231,229,243,104,129,251, 58, 89,237,232,229,226, + 242,229,119,128,251, 58,232,229,226,242,229,119,128, 5,218,237, + 229,109,129, 5,221, 90, 7,232,229,226,242,229,119,128, 5,221, + 238,245,110,129, 5,223, 90, 24,232,229,226,242,229,119,128, 5, + 223,240,101,129, 5,227, 90, 40,232,229,226,242,229,119,128, 5, + 227,244,243,225,228,105,129, 5,229, 90, 59,232,229,226,242,229, + 119,128, 5,229,242,243,244,244,239,238,229,227,232,233,238,229, + 243,101,128, 2,201,243,232,229,249,101,128, 37,201,244,225,227, + 249,242,233,236,236,233, 99,128, 4,115,246,101,142, 0, 53, 90, + 139, 90,148, 90,158, 90,188, 90,195, 90,205, 90,230, 91, 1, 91, + 35, 91, 47, 91, 58, 91, 91, 91, 99, 91,110,225,242,225,226,233, + 99,128, 6,101,226,229,238,231,225,236,105,128, 9,235,227,233, + 242,227,236,101,129, 36,100, 90,169,233,238,246,229,242,243,229, + 243,225,238,243,243,229,242,233,102,128, 39,142,228,229,246, 97, + 128, 9,107,229,233,231,232,244,232,115,128, 33, 93,231,117, 2, + 90,212, 90,221,234,225,242,225,244,105,128, 10,235,242,237,245, + 235,232,105,128, 10,107,232, 97, 2, 90,237, 90,248,227,235,225, + 242,225,226,233, 99,128, 6,101,238,231,250,232,239,117,128, 48, + 37,105, 2, 91, 7, 91, 25,228,229,239,231,242,225,240,232,233, + 227,240,225,242,229,110,128, 50, 36,238,230,229,242,233,239,114, + 128, 32,133,237,239,238,239,243,240,225,227,101,128,255, 21,239, + 236,228,243,244,249,236,101,128,247, 53,112, 2, 91, 64, 91, 71, + 225,242,229,110,128, 36,120,229,114, 2, 91, 78, 91, 84,233,239, + 100,128, 36,140,243,233,225,110,128, 6,245,242,239,237,225,110, + 128, 33,116,243,245,240,229,242,233,239,114,128, 32,117,244,232, + 225,105,128, 14, 85,108,129,251, 2, 91,123,239,242,233,110,128, + 1,146,109, 2, 91,136, 91,147,239,238,239,243,240,225,227,101, + 128,255, 70,243,241,245,225,242,101,128, 51,153,111, 4, 91,166, + 91,188, 91,200, 91,207,230, 97, 2, 91,173, 91,181,238,244,232, + 225,105,128, 14, 31,244,232,225,105,128, 14, 29,238,231,237,225, + 238,244,232,225,105,128, 14, 79,242,225,236,108,128, 34, 0,245, + 114,142, 0, 52, 91,240, 91,249, 92, 3, 92, 33, 92, 40, 92, 65, + 92, 92, 92,126, 92,138, 92,157, 92,168, 92,201, 92,209, 92,220, + 225,242,225,226,233, 99,128, 6,100,226,229,238,231,225,236,105, + 128, 9,234,227,233,242,227,236,101,129, 36, 99, 92, 14,233,238, + 246,229,242,243,229,243,225,238,243,243,229,242,233,102,128, 39, + 141,228,229,246, 97,128, 9,106,231,117, 2, 92, 47, 92, 56,234, + 225,242,225,244,105,128, 10,234,242,237,245,235,232,105,128, 10, + 106,232, 97, 2, 92, 72, 92, 83,227,235,225,242,225,226,233, 99, + 128, 6,100,238,231,250,232,239,117,128, 48, 36,105, 2, 92, 98, + 92,116,228,229,239,231,242,225,240,232,233,227,240,225,242,229, + 110,128, 50, 35,238,230,229,242,233,239,114,128, 32,132,237,239, + 238,239,243,240,225,227,101,128,255, 20,238,245,237,229,242,225, + 244,239,242,226,229,238,231,225,236,105,128, 9,247,239,236,228, + 243,244,249,236,101,128,247, 52,112, 2, 92,174, 92,181,225,242, + 229,110,128, 36,119,229,114, 2, 92,188, 92,194,233,239,100,128, + 36,139,243,233,225,110,128, 6,244,242,239,237,225,110,128, 33, + 115,243,245,240,229,242,233,239,114,128, 32,116,116, 2, 92,226, + 93, 8,229,229,110, 2, 92,234, 92,243,227,233,242,227,236,101, + 128, 36,109,112, 2, 92,249, 93, 0,225,242,229,110,128, 36,129, + 229,242,233,239,100,128, 36,149,104, 2, 93, 14, 93, 19,225,105, + 128, 14, 84,244,239,238,229,227,232,233,238,229,243,101,128, 2, + 203,240,225,242,229,110,128, 36,161,242, 97, 2, 93, 48, 93, 56, + 227,244,233,239,110,128, 32, 68,238, 99,128, 32,163,103,144, 0, + 103, 93, 97, 94, 43, 94, 66, 94,127, 94,144, 95, 65, 96, 58, 96, + 143, 96,156, 97, 14, 97, 39, 97, 67, 97, 89, 98, 34, 98, 56, 98, + 158, 97, 9, 93,117, 93,127, 93,134, 93,141, 93,205, 93,230, 93, + 241, 93,252, 94, 30,226,229,238,231,225,236,105,128, 9,151,227, + 245,244,101,128, 1,245,228,229,246, 97,128, 9, 23,102, 4, 93, + 151, 93,160, 93,174, 93,190,225,242,225,226,233, 99,128, 6,175, + 230,233,238,225,236,225,242,225,226,233, 99,128,251,147,233,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,251,148,237,229, + 228,233,225,236,225,242,225,226,233, 99,128,251,149,231,117, 2, + 93,212, 93,221,234,225,242,225,244,105,128, 10,151,242,237,245, + 235,232,105,128, 10, 23,232,233,242,225,231,225,238, 97,128, 48, + 76,235,225,244,225,235,225,238, 97,128, 48,172,237,237, 97,130, + 3,179, 94, 6, 94, 19,236,225,244,233,238,243,237,225,236,108, + 128, 2, 99,243,245,240,229,242,233,239,114,128, 2,224,238,231, + 233,225,227,239,240,244,233, 99,128, 3,235, 98, 2, 94, 49, 94, + 59,239,240,239,237,239,230,111,128, 49, 13,242,229,246,101,128, + 1, 31, 99, 4, 94, 76, 94, 83, 94, 92, 94,114,225,242,239,110, + 128, 1,231,229,228,233,236,236, 97,128, 1, 35,233,242, 99, 2, + 94,100, 94,105,236,101,128, 36,214,245,237,230,236,229,120,128, + 1, 29,239,237,237,225,225,227,227,229,238,116,128, 1, 35,228, + 239,116,129, 1, 33, 94,135,225,227,227,229,238,116,128, 1, 33, + 101, 6, 94,158, 94,169, 94,180, 94,191, 94,210, 95, 56,227,249, + 242,233,236,236,233, 99,128, 4, 51,232,233,242,225,231,225,238, + 97,128, 48, 82,235,225,244,225,235,225,238, 97,128, 48,178,239, + 237,229,244,242,233,227,225,236,236,249,229,241,245,225,108,128, + 34, 81,114, 3, 94,218, 95, 11, 95, 21,229,243,104, 3, 94,228, + 94,243, 94,252,225,227,227,229,238,244,232,229,226,242,229,119, + 128, 5,156,232,229,226,242,229,119,128, 5,243,237,245,241,228, + 225,237,232,229,226,242,229,119,128, 5,157,237,225,238,228,226, + 236,115,128, 0,223,243,232,225,249,233,109, 2, 95, 32, 95, 47, + 225,227,227,229,238,244,232,229,226,242,229,119,128, 5,158,232, + 229,226,242,229,119,128, 5,244,244,225,237,225,242,107,128, 48, + 19,104, 5, 95, 77, 95,210, 96, 17, 96, 42, 96, 48, 97, 4, 95, + 87, 95, 97, 95,120, 95,145,226,229,238,231,225,236,105,128, 9, + 152,100, 2, 95,103, 95,114,225,242,237,229,238,233,225,110,128, + 5,114,229,246, 97,128, 9, 24,231,117, 2, 95,127, 95,136,234, + 225,242,225,244,105,128, 10,152,242,237,245,235,232,105,128, 10, + 24,233,110, 4, 95,156, 95,165, 95,179, 95,195,225,242,225,226, + 233, 99,128, 6, 58,230,233,238,225,236,225,242,225,226,233, 99, + 128,254,206,233,238,233,244,233,225,236,225,242,225,226,233, 99, + 128,254,207,237,229,228,233,225,236,225,242,225,226,233, 99,128, + 254,208,101, 3, 95,218, 95,239, 96, 0,237,233,228,228,236,229, + 232,239,239,235,227,249,242,233,236,236,233, 99,128, 4,149,243, + 244,242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,147, + 245,240,244,245,242,238,227,249,242,233,236,236,233, 99,128, 4, + 145,232, 97, 2, 96, 24, 96, 31,228,229,246, 97,128, 9, 90,231, + 245,242,237,245,235,232,105,128, 10, 90,239,239,107,128, 2, 96, + 250,243,241,245,225,242,101,128, 51,147,105, 3, 96, 66, 96, 77, + 96, 88,232,233,242,225,231,225,238, 97,128, 48, 78,235,225,244, + 225,235,225,238, 97,128, 48,174,109, 2, 96, 94, 96,105,225,242, + 237,229,238,233,225,110,128, 5, 99,229,108,130, 5,210, 96,114, + 96,134,228,225,231,229,243,104,129,251, 50, 96,125,232,229,226, + 242,229,119,128,251, 50,232,229,226,242,229,119,128, 5,210,234, + 229,227,249,242,233,236,236,233, 99,128, 4, 83,236,239,244,244, + 225,108, 2, 96,167, 96,184,233,238,246,229,242,244,229,228,243, + 244,242,239,235,101,128, 1,190,243,244,239,112,132, 2,148, 96, + 199, 96,210, 96,216, 96,248,233,238,246,229,242,244,229,100,128, + 2,150,237,239,100,128, 2,192,242,229,246,229,242,243,229,100, + 130, 2,149, 96,231, 96,237,237,239,100,128, 2,193,243,245,240, + 229,242,233,239,114,128, 2,228,243,244,242,239,235,101,129, 2, + 161, 97, 3,242,229,246,229,242,243,229,100,128, 2,162,109, 2, + 97, 20, 97, 28,225,227,242,239,110,128, 30, 33,239,238,239,243, + 240,225,227,101,128,255, 71,111, 2, 97, 45, 97, 56,232,233,242, + 225,231,225,238, 97,128, 48, 84,235,225,244,225,235,225,238, 97, + 128, 48,180,240, 97, 2, 97, 74, 97, 80,242,229,110,128, 36,162, + 243,241,245,225,242,101,128, 51,172,114, 2, 97, 95, 97,192, 97, + 2, 97,101, 97,109,228,233,229,238,116,128, 34, 7,246,101,134, + 0, 96, 97,126, 97,137, 97,154, 97,161, 97,170, 97,182,226,229, + 236,239,247,227,237, 98,128, 3, 22, 99, 2, 97,143, 97,148,237, + 98,128, 3, 0,239,237, 98,128, 3, 0,228,229,246, 97,128, 9, + 83,236,239,247,237,239,100,128, 2,206,237,239,238,239,243,240, + 225,227,101,128,255, 64,244,239,238,229,227,237, 98,128, 3, 64, + 229,225,244,229,114,132, 0, 62, 97,208, 97,227, 97,239, 98, 26, + 229,241,245,225,108,129, 34,101, 97,218,239,242,236,229,243,115, + 128, 34,219,237,239,238,239,243,240,225,227,101,128,255, 30,111, + 2, 97,245, 98, 15,114, 2, 97,251, 98, 8,229,241,245,233,246, + 225,236,229,238,116,128, 34,115,236,229,243,115,128, 34,119,246, + 229,242,229,241,245,225,108,128, 34,103,243,237,225,236,108,128, + 254,101,115, 2, 98, 40, 98, 48,227,242,233,240,116,128, 2, 97, + 244,242,239,235,101,128, 1,229,117, 4, 98, 66, 98, 77, 98,134, + 98,145,232,233,242,225,231,225,238, 97,128, 48, 80,233,108, 2, + 98, 84, 98,109,236,229,237,239,116, 2, 98, 94, 98,101,236,229, + 230,116,128, 0,171,242,233,231,232,116,128, 0,187,243,233,238, + 231,108, 2, 98,119, 98,126,236,229,230,116,128, 32, 57,242,233, + 231,232,116,128, 32, 58,235,225,244,225,235,225,238, 97,128, 48, + 176,242,225,237,245,243,241,245,225,242,101,128, 51, 24,249,243, + 241,245,225,242,101,128, 51,201,104,144, 0,104, 98,204,101, 90, + 101,125,101,162,101,202,103, 90,103,110,104, 75,104, 87,104, 99, + 105,167,105,175,105,186,105,195,106, 19,106, 23, 97, 13, 98,232, + 99, 15, 99, 25, 99, 55, 99, 80, 99,158, 99,170, 99,195, 99,210, + 99,239, 99,252,100, 54,100, 63, 97, 2, 98,238, 99, 1,226,235, + 232,225,243,233,225,238,227,249,242,233,236,236,233, 99,128, 4, + 169,236,244,239,238,229,225,242,225,226,233, 99,128, 6,193,226, + 229,238,231,225,236,105,128, 9,185,228,101, 2, 99, 32, 99, 50, + 243,227,229,238,228,229,242,227,249,242,233,236,236,233, 99,128, + 4,179,246, 97,128, 9, 57,231,117, 2, 99, 62, 99, 71,234,225, + 242,225,244,105,128, 10,185,242,237,245,235,232,105,128, 10, 57, + 104, 4, 99, 90, 99, 99, 99,113, 99,143,225,242,225,226,233, 99, + 128, 6, 45,230,233,238,225,236,225,242,225,226,233, 99,128,254, + 162,105, 2, 99,119, 99,134,238,233,244,233,225,236,225,242,225, + 226,233, 99,128,254,163,242,225,231,225,238, 97,128, 48,111,237, + 229,228,233,225,236,225,242,225,226,233, 99,128,254,164,233,244, + 245,243,241,245,225,242,101,128, 51, 42,235,225,244,225,235,225, + 238, 97,129, 48,207, 99,183,232,225,236,230,247,233,228,244,104, + 128,255,138,236,225,238,244,231,245,242,237,245,235,232,105,128, + 10, 77,237,250, 97, 2, 99,218, 99,227,225,242,225,226,233, 99, + 128, 6, 33,236,239,247,225,242,225,226,233, 99,128, 6, 33,238, + 231,245,236,230,233,236,236,229,114,128, 49,100,114, 2,100, 2, + 100, 18,228,243,233,231,238,227,249,242,233,236,236,233, 99,128, + 4, 74,240,239,239,110, 2,100, 27,100, 40,236,229,230,244,226, + 225,242,226,245,112,128, 33,188,242,233,231,232,244,226,225,242, + 226,245,112,128, 33,192,243,241,245,225,242,101,128, 51,202,244, + 225,102, 3,100, 73,100,165,101, 0,240,225,244,225,104,134, 5, + 178,100, 93,100, 98,100,112,100,121,100,136,100,152,177, 54,128, + 5,178, 50, 2,100,104,100,108, 51,128, 5,178,102,128, 5,178, + 232,229,226,242,229,119,128, 5,178,238,225,242,242,239,247,232, + 229,226,242,229,119,128, 5,178,241,245,225,242,244,229,242,232, + 229,226,242,229,119,128, 5,178,247,233,228,229,232,229,226,242, + 229,119,128, 5,178,241,225,237,225,244,115,135, 5,179,100,188, + 100,193,100,198,100,203,100,212,100,227,100,243,177, 98,128, 5, + 179,178, 56,128, 5,179,179, 52,128, 5,179,232,229,226,242,229, + 119,128, 5,179,238,225,242,242,239,247,232,229,226,242,229,119, + 128, 5,179,241,245,225,242,244,229,242,232,229,226,242,229,119, + 128, 5,179,247,233,228,229,232,229,226,242,229,119,128, 5,179, + 243,229,231,239,108,135, 5,177,101, 22,101, 27,101, 32,101, 37, + 101, 46,101, 61,101, 77,177, 55,128, 5,177,178, 52,128, 5,177, + 179, 48,128, 5,177,232,229,226,242,229,119,128, 5,177,238,225, + 242,242,239,247,232,229,226,242,229,119,128, 5,177,241,245,225, + 242,244,229,242,232,229,226,242,229,119,128, 5,177,247,233,228, + 229,232,229,226,242,229,119,128, 5,177, 98, 3,101, 98,101,103, + 101,113,225,114,128, 1, 39,239,240,239,237,239,230,111,128, 49, + 15,242,229,246,229,226,229,236,239,119,128, 30, 43, 99, 2,101, + 131,101,140,229,228,233,236,236, 97,128, 30, 41,233,242, 99, 2, + 101,148,101,153,236,101,128, 36,215,245,237,230,236,229,120,128, + 1, 37,100, 2,101,168,101,178,233,229,242,229,243,233,115,128, + 30, 39,239,116, 2,101,185,101,194,225,227,227,229,238,116,128, + 30, 35,226,229,236,239,119,128, 30, 37,101,136, 5,212,101,222, + 101,255,102, 19,102,248,103, 8,103, 53,103, 62,103, 75,225,242, + 116,129, 38,101,101,230,243,245,233,116, 2,101,239,101,247,226, + 236,225,227,107,128, 38,101,247,232,233,244,101,128, 38, 97,228, + 225,231,229,243,104,129,251, 52,102, 10,232,229,226,242,229,119, + 128,251, 52,104, 6,102, 33,102, 61,102, 69,102,119,102,165,102, + 214, 97, 2,102, 39,102, 53,236,244,239,238,229,225,242,225,226, + 233, 99,128, 6,193,242,225,226,233, 99,128, 6, 71,229,226,242, + 229,119,128, 5,212,230,233,238,225,236, 97, 2,102, 80,102,111, + 236,116, 2,102, 87,102, 99,239,238,229,225,242,225,226,233, 99, + 128,251,167,244,247,239,225,242,225,226,233, 99,128,254,234,242, + 225,226,233, 99,128,254,234,232,225,237,250,225,225,226,239,246, + 101, 2,102,134,102,148,230,233,238,225,236,225,242,225,226,233, + 99,128,251,165,233,243,239,236,225,244,229,228,225,242,225,226, + 233, 99,128,251,164,105, 2,102,171,102,205,238,233,244,233,225, + 236, 97, 2,102,183,102,197,236,244,239,238,229,225,242,225,226, + 233, 99,128,251,168,242,225,226,233, 99,128,254,235,242,225,231, + 225,238, 97,128, 48,120,237,229,228,233,225,236, 97, 2,102,226, + 102,240,236,244,239,238,229,225,242,225,226,233, 99,128,251,169, + 242,225,226,233, 99,128,254,236,233,243,229,233,229,242,225,243, + 241,245,225,242,101,128, 51,123,107, 2,103, 14,103, 38,225,244, + 225,235,225,238, 97,129, 48,216,103, 26,232,225,236,230,247,233, + 228,244,104,128,255,141,245,244,225,225,242,245,243,241,245,225, + 242,101,128, 51, 54,238,231,232,239,239,107,128, 2,103,242,245, + 244,245,243,241,245,225,242,101,128, 51, 57,116,129, 5,215,103, + 81,232,229,226,242,229,119,128, 5,215,232,239,239,107,129, 2, + 102,103, 99,243,245,240,229,242,233,239,114,128, 2,177,105, 4, + 103,120,103,205,103,216,103,241,229,245,104, 4,103,132,103,167, + 103,182,103,191, 97, 2,103,138,103,153,227,233,242,227,236,229, + 235,239,242,229,225,110,128, 50,123,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 27,227,233,242,227,236,229,235,239,242, + 229,225,110,128, 50,109,235,239,242,229,225,110,128, 49, 78,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 13,232,233,242, + 225,231,225,238, 97,128, 48,114,235,225,244,225,235,225,238, 97, + 129, 48,210,103,229,232,225,236,230,247,233,228,244,104,128,255, + 139,242,233,113,134, 5,180,104, 3,104, 8,104, 22,104, 31,104, + 46,104, 62,177, 52,128, 5,180, 50, 2,104, 14,104, 18, 49,128, + 5,180,100,128, 5,180,232,229,226,242,229,119,128, 5,180,238, + 225,242,242,239,247,232,229,226,242,229,119,128, 5,180,241,245, + 225,242,244,229,242,232,229,226,242,229,119,128, 5,180,247,233, + 228,229,232,229,226,242,229,119,128, 5,180,236,233,238,229,226, + 229,236,239,119,128, 30,150,237,239,238,239,243,240,225,227,101, + 128,255, 72,111, 9,104,119,104,130,104,154,104,179,105, 11,105, + 24,105,110,105,150,105,161,225,242,237,229,238,233,225,110,128, + 5,112,232,105, 2,104,137,104,145,240,244,232,225,105,128, 14, + 43,242,225,231,225,238, 97,128, 48,123,235,225,244,225,235,225, + 238, 97,129, 48,219,104,167,232,225,236,230,247,233,228,244,104, + 128,255,142,236,225,109,135, 5,185,104,199,104,204,104,209,104, + 214,104,223,104,238,104,254,177, 57,128, 5,185,178, 54,128, 5, + 185,179, 50,128, 5,185,232,229,226,242,229,119,128, 5,185,238, + 225,242,242,239,247,232,229,226,242,229,119,128, 5,185,241,245, + 225,242,244,229,242,232,229,226,242,229,119,128, 5,185,247,233, + 228,229,232,229,226,242,229,119,128, 5,185,238,239,235,232,245, + 235,244,232,225,105,128, 14, 46,111, 2,105, 30,105,100,107, 4, + 105, 40,105, 52,105, 58,105, 80,225,226,239,246,229,227,239,237, + 98,128, 3, 9,227,237, 98,128, 3, 9,240,225,236,225,244,225, + 236,233,250,229,228,226,229,236,239,247,227,237, 98,128, 3, 33, + 242,229,244,242,239,230,236,229,248,226,229,236,239,247,227,237, + 98,128, 3, 34,238,243,241,245,225,242,101,128, 51, 66,114, 2, + 105,116,105,143,105, 2,105,122,105,131,227,239,240,244,233, 99, + 128, 3,233,250,239,238,244,225,236,226,225,114,128, 32, 21,238, + 227,237, 98,128, 3, 27,244,243,240,242,233,238,231,115,128, 38, + 104,245,243,101,128, 35, 2,240,225,242,229,110,128, 36,163,243, + 245,240,229,242,233,239,114,128, 2,176,244,245,242,238,229,100, + 128, 2,101,117, 4,105,205,105,216,105,229,105,254,232,233,242, + 225,231,225,238, 97,128, 48,117,233,233,244,239,243,241,245,225, + 242,101,128, 51, 51,235,225,244,225,235,225,238, 97,129, 48,213, + 105,242,232,225,236,230,247,233,228,244,104,128,255,140,238,231, + 225,242,245,237,236,225,245,116,129, 2,221,106, 13,227,237, 98, + 128, 3, 11,118,128, 1,149,249,240,232,229,110,132, 0, 45,106, + 39,106, 50,106, 62,106, 85,233,238,230,229,242,233,239,114,128, + 246,229,237,239,238,239,243,240,225,227,101,128,255, 13,115, 2, + 106, 68,106, 75,237,225,236,108,128,254, 99,245,240,229,242,233, + 239,114,128,246,230,244,247,111,128, 32, 16,105,149, 0,105,106, + 137,106,160,106,194,106,241,110,123,110,243,111, 24,111, 51,111, + 213,111,217,111,255,112, 21,112,105,113, 14,113, 89,113, 97,113, + 110,113,197,113,254,114, 26,114, 70,225, 99, 2,106,144,106,150, + 245,244,101,128, 0,237,249,242,233,236,236,233, 99,128, 4, 79, + 98, 3,106,168,106,177,106,187,229,238,231,225,236,105,128, 9, + 135,239,240,239,237,239,230,111,128, 49, 39,242,229,246,101,128, + 1, 45, 99, 3,106,202,106,209,106,231,225,242,239,110,128, 1, + 208,233,242, 99, 2,106,217,106,222,236,101,128, 36,216,245,237, + 230,236,229,120,128, 0,238,249,242,233,236,236,233, 99,128, 4, + 86,100, 4,106,251,107, 5,110, 80,110,113,226,236,231,242,225, + 246,101,128, 2, 9,101, 2,107, 11,110, 75,239,231,242,225,240, + 104, 7,107, 32,107, 46,107, 59,109,244,110, 19,110, 32,110, 44, + 229,225,242,244,232,227,233,242,227,236,101,128, 50,143,230,233, + 242,229,227,233,242,227,236,101,128, 50,139,233, 99, 14,107, 90, + 107,106,107,205,108, 3,108, 69,108, 98,108,114,108,171,108,220, + 108,232,109, 3,109, 70,109,208,109,237,225,236,236,233,225,238, + 227,229,240,225,242,229,110,128, 50, 63, 99, 4,107,116,107,127, + 107,141,107,148,225,236,236,240,225,242,229,110,128, 50, 58,229, + 238,244,242,229,227,233,242,227,236,101,128, 50,165,236,239,243, + 101,128, 48, 6,111, 3,107,156,107,171,107,191,237,237, 97,129, + 48, 1,107,164,236,229,230,116,128,255,100,238,231,242,225,244, + 245,236,225,244,233,239,238,240,225,242,229,110,128, 50, 55,242, + 242,229,227,244,227,233,242,227,236,101,128, 50,163,101, 3,107, + 213,107,225,107,242,225,242,244,232,240,225,242,229,110,128, 50, + 47,238,244,229,242,240,242,233,243,229,240,225,242,229,110,128, + 50, 61,248,227,229,236,236,229,238,244,227,233,242,227,236,101, + 128, 50,157,102, 2,108, 9,108, 24,229,243,244,233,246,225,236, + 240,225,242,229,110,128, 50, 64,105, 2,108, 30,108, 59,238,225, + 238,227,233,225,108, 2,108, 42,108, 51,227,233,242,227,236,101, + 128, 50,150,240,225,242,229,110,128, 50, 54,242,229,240,225,242, + 229,110,128, 50, 43,104, 2,108, 75,108, 86,225,246,229,240,225, + 242,229,110,128, 50, 50,233,231,232,227,233,242,227,236,101,128, + 50,164,233,244,229,242,225,244,233,239,238,237,225,242,107,128, + 48, 5,108, 3,108,122,108,148,108,160,225,226,239,114, 2,108, + 131,108,140,227,233,242,227,236,101,128, 50,152,240,225,242,229, + 110,128, 50, 56,229,230,244,227,233,242,227,236,101,128, 50,167, + 239,247,227,233,242,227,236,101,128, 50,166,109, 2,108,177,108, + 209,101, 2,108,183,108,198,228,233,227,233,238,229,227,233,242, + 227,236,101,128, 50,169,244,225,236,240,225,242,229,110,128, 50, + 46,239,239,238,240,225,242,229,110,128, 50, 42,238,225,237,229, + 240,225,242,229,110,128, 50, 52,112, 2,108,238,108,246,229,242, + 233,239,100,128, 48, 2,242,233,238,244,227,233,242,227,236,101, + 128, 50,158,114, 2,109, 9,109, 57,101, 3,109, 17,109, 28,109, + 43,225,227,232,240,225,242,229,110,128, 50, 67,240,242,229,243, + 229,238,244,240,225,242,229,110,128, 50, 57,243,239,245,242,227, + 229,240,225,242,229,110,128, 50, 62,233,231,232,244,227,233,242, + 227,236,101,128, 50,168,115, 5,109, 82,109,111,109,125,109,150, + 109,178,101, 2,109, 88,109,101,227,242,229,244,227,233,242,227, + 236,101,128, 50,153,236,230,240,225,242,229,110,128, 50, 66,239, + 227,233,229,244,249,240,225,242,229,110,128, 50, 51,112, 2,109, + 131,109,137,225,227,101,128, 48, 0,229,227,233,225,236,240,225, + 242,229,110,128, 50, 53,116, 2,109,156,109,167,239,227,235,240, + 225,242,229,110,128, 50, 49,245,228,249,240,225,242,229,110,128, + 50, 59,117, 2,109,184,109,193,238,240,225,242,229,110,128, 50, + 48,240,229,242,246,233,243,229,240,225,242,229,110,128, 50, 60, + 119, 2,109,214,109,226,225,244,229,242,240,225,242,229,110,128, + 50, 44,239,239,228,240,225,242,229,110,128, 50, 45,250,229,242, + 111,128, 48, 7,109, 2,109,250,110, 7,229,244,225,236,227,233, + 242,227,236,101,128, 50,142,239,239,238,227,233,242,227,236,101, + 128, 50,138,238,225,237,229,227,233,242,227,236,101,128, 50,148, + 243,245,238,227,233,242,227,236,101,128, 50,144,119, 2,110, 50, + 110, 63,225,244,229,242,227,233,242,227,236,101,128, 50,140,239, + 239,228,227,233,242,227,236,101,128, 50,141,246, 97,128, 9, 7, + 233,229,242,229,243,233,115,130, 0,239,110, 94,110,102,225,227, + 245,244,101,128, 30, 47,227,249,242,233,236,236,233, 99,128, 4, + 229,239,244,226,229,236,239,119,128, 30,203,101, 3,110,131,110, + 147,110,158,226,242,229,246,229,227,249,242,233,236,236,233, 99, + 128, 4,215,227,249,242,233,236,236,233, 99,128, 4, 53,245,238, + 103, 4,110,170,110,205,110,220,110,229, 97, 2,110,176,110,191, + 227,233,242,227,236,229,235,239,242,229,225,110,128, 50,117,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 21,227,233,242, + 227,236,229,235,239,242,229,225,110,128, 50,103,235,239,242,229, + 225,110,128, 49, 71,240,225,242,229,238,235,239,242,229,225,110, + 128, 50, 7,103, 2,110,249,111, 0,242,225,246,101,128, 0,236, + 117, 2,111, 6,111, 15,234,225,242,225,244,105,128, 10,135,242, + 237,245,235,232,105,128, 10, 7,104, 2,111, 30,111, 40,233,242, + 225,231,225,238, 97,128, 48, 68,239,239,235,225,226,239,246,101, + 128, 30,201,105, 8,111, 69,111, 79,111, 90,111, 97,111,122,111, + 138,111,153,111,169,226,229,238,231,225,236,105,128, 9,136,227, + 249,242,233,236,236,233, 99,128, 4, 56,228,229,246, 97,128, 9, + 8,231,117, 2,111,104,111,113,234,225,242,225,244,105,128, 10, + 136,242,237,245,235,232,105,128, 10, 8,237,225,244,242,225,231, + 245,242,237,245,235,232,105,128, 10, 64,238,246,229,242,244,229, + 228,226,242,229,246,101,128, 2, 11,243,232,239,242,244,227,249, + 242,233,236,236,233, 99,128, 4, 57,246,239,247,229,236,243,233, + 231,110, 3,111,185,111,195,111,202,226,229,238,231,225,236,105, + 128, 9,192,228,229,246, 97,128, 9, 64,231,245,234,225,242,225, + 244,105,128, 10,192,106,128, 1, 51,107, 2,111,223,111,247,225, + 244,225,235,225,238, 97,129, 48,164,111,235,232,225,236,230,247, + 233,228,244,104,128,255,114,239,242,229,225,110,128, 49, 99,108, + 2,112, 5,112, 10,228,101,128, 2,220,245,249,232,229,226,242, + 229,119,128, 5,172,109, 2,112, 27,112, 94, 97, 3,112, 35,112, + 55,112, 80,227,242,239,110,129, 1, 43,112, 44,227,249,242,233, + 236,236,233, 99,128, 4,227,231,229,239,242,225,240,240,242,239, + 248,233,237,225,244,229,236,249,229,241,245,225,108,128, 34, 83, + 244,242,225,231,245,242,237,245,235,232,105,128, 10, 63,239,238, + 239,243,240,225,227,101,128,255, 73,110, 5,112,117,112,127,112, + 136,112,148,112,232,227,242,229,237,229,238,116,128, 34, 6,230, + 233,238,233,244,121,128, 34, 30,233,225,242,237,229,238,233,225, + 110,128, 5,107,116, 2,112,154,112,222,101, 2,112,160,112,211, + 231,242,225,108,131, 34, 43,112,173,112,191,112,196, 98, 2,112, + 179,112,187,239,244,244,239,109,128, 35, 33,116,128, 35, 33,229, + 120,128,248,245,116, 2,112,202,112,207,239,112,128, 35, 32,112, + 128, 35, 32,242,243,229,227,244,233,239,110,128, 34, 41,233,243, + 241,245,225,242,101,128, 51, 5,118, 3,112,240,112,249,113, 2, + 226,245,236,236,229,116,128, 37,216,227,233,242,227,236,101,128, + 37,217,243,237,233,236,229,230,225,227,101,128, 38, 59,111, 3, + 113, 22,113, 33,113, 41,227,249,242,233,236,236,233, 99,128, 4, + 81,231,239,238,229,107,128, 1, 47,244, 97,131, 3,185,113, 52, + 113, 73,113, 81,228,233,229,242,229,243,233,115,129, 3,202,113, + 65,244,239,238,239,115,128, 3,144,236,225,244,233,110,128, 2, + 105,244,239,238,239,115,128, 3,175,240,225,242,229,110,128, 36, + 164,242,233,231,245,242,237,245,235,232,105,128, 10,114,115, 4, + 113,120,113,165,113,179,113,187,237,225,236,108, 2,113,129,113, + 140,232,233,242,225,231,225,238, 97,128, 48, 67,235,225,244,225, + 235,225,238, 97,129, 48,163,113,153,232,225,236,230,247,233,228, + 244,104,128,255,104,243,232,225,242,226,229,238,231,225,236,105, + 128, 9,250,244,242,239,235,101,128, 2,104,245,240,229,242,233, + 239,114,128,246,237,116, 2,113,203,113,237,229,242,225,244,233, + 239,110, 2,113,215,113,226,232,233,242,225,231,225,238, 97,128, + 48,157,235,225,244,225,235,225,238, 97,128, 48,253,233,236,228, + 101,129, 1, 41,113,246,226,229,236,239,119,128, 30, 45,117, 2, + 114, 4,114, 15,226,239,240,239,237,239,230,111,128, 49, 41,227, + 249,242,233,236,236,233, 99,128, 4, 78,246,239,247,229,236,243, + 233,231,110, 3,114, 42,114, 52,114, 59,226,229,238,231,225,236, + 105,128, 9,191,228,229,246, 97,128, 9, 63,231,245,234,225,242, + 225,244,105,128, 10,191,250,232,233,244,243, 97, 2,114, 81,114, + 92,227,249,242,233,236,236,233, 99,128, 4,117,228,226,236,231, + 242,225,246,229,227,249,242,233,236,236,233, 99,128, 4,119,106, + 138, 0,106,114,135,114,198,114,209,115, 3,115, 19,115,132,115, + 201,115,206,115,218,115,226, 97, 4,114,145,114,156,114,166,114, + 173,225,242,237,229,238,233,225,110,128, 5,113,226,229,238,231, + 225,236,105,128, 9,156,228,229,246, 97,128, 9, 28,231,117, 2, + 114,180,114,189,234,225,242,225,244,105,128, 10,156,242,237,245, + 235,232,105,128, 10, 28,226,239,240,239,237,239,230,111,128, 49, + 16, 99, 3,114,217,114,224,114,246,225,242,239,110,128, 1,240, + 233,242, 99, 2,114,232,114,237,236,101,128, 36,217,245,237,230, + 236,229,120,128, 1, 53,242,239,243,243,229,228,244,225,233,108, + 128, 2,157,228,239,244,236,229,243,243,243,244,242,239,235,101, + 128, 2, 95,101, 3,115, 27,115, 38,115,103,227,249,242,233,236, + 236,233, 99,128, 4, 88,229,109, 4,115, 49,115, 58,115, 72,115, + 88,225,242,225,226,233, 99,128, 6, 44,230,233,238,225,236,225, + 242,225,226,233, 99,128,254,158,233,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,254,159,237,229,228,233,225,236,225,242, + 225,226,233, 99,128,254,160,104, 2,115,109,115,118,225,242,225, + 226,233, 99,128, 6,152,230,233,238,225,236,225,242,225,226,233, + 99,128,251,139,104, 2,115,138,115,188, 97, 3,115,146,115,156, + 115,163,226,229,238,231,225,236,105,128, 9,157,228,229,246, 97, + 128, 9, 29,231,117, 2,115,170,115,179,234,225,242,225,244,105, + 128, 10,157,242,237,245,235,232,105,128, 10, 29,229,232,225,242, + 237,229,238,233,225,110,128, 5,123,233,115,128, 48, 4,237,239, + 238,239,243,240,225,227,101,128,255, 74,240,225,242,229,110,128, + 36,165,243,245,240,229,242,233,239,114,128, 2,178,107,146, 0, + 107,116, 21,118,110,118,121,118,183,118,194,119, 28,119, 42,120, + 150,121, 90,121,103,121,129,121,178,122, 60,122, 82,122, 95,122, + 118,122,160,122,170, 97, 12,116, 47,116, 79,116,101,116,131,116, + 245,117, 14,117, 44,117, 69,117,175,117,189,118, 56,118, 85, 98, + 2,116, 53,116, 70,225,243,232,235,233,242,227,249,242,233,236, + 236,233, 99,128, 4,161,229,238,231,225,236,105,128, 9,149, 99, + 2,116, 85,116, 91,245,244,101,128, 30, 49,249,242,233,236,236, + 233, 99,128, 4, 58,228,101, 2,116,108,116,126,243,227,229,238, + 228,229,242,227,249,242,233,236,236,233, 99,128, 4,155,246, 97, + 128, 9, 21,102,135, 5,219,116,149,116,158,116,178,116,192,116, + 201,116,217,116,232,225,242,225,226,233, 99,128, 6, 67,228,225, + 231,229,243,104,129,251, 59,116,169,232,229,226,242,229,119,128, + 251, 59,230,233,238,225,236,225,242,225,226,233, 99,128,254,218, + 232,229,226,242,229,119,128, 5,219,233,238,233,244,233,225,236, + 225,242,225,226,233, 99,128,254,219,237,229,228,233,225,236,225, + 242,225,226,233, 99,128,254,220,242,225,230,229,232,229,226,242, + 229,119,128,251, 77,231,117, 2,116,252,117, 5,234,225,242,225, + 244,105,128, 10,149,242,237,245,235,232,105,128, 10, 21,104, 2, + 117, 20,117, 30,233,242,225,231,225,238, 97,128, 48, 75,239,239, + 235,227,249,242,233,236,236,233, 99,128, 4,196,235,225,244,225, + 235,225,238, 97,129, 48,171,117, 57,232,225,236,230,247,233,228, + 244,104,128,255,118,112, 2,117, 75,117, 96,240, 97,129, 3,186, + 117, 82,243,249,237,226,239,236,231,242,229,229,107,128, 3,240, + 249,229,239,245,110, 3,117,108,117,122,117,156,237,233,229,245, + 237,235,239,242,229,225,110,128, 49,113,112, 2,117,128,117,143, + 232,233,229,245,240,232,235,239,242,229,225,110,128, 49,132,233, + 229,245,240,235,239,242,229,225,110,128, 49,120,243,243,225,238, + 231,240,233,229,245,240,235,239,242,229,225,110,128, 49,121,242, + 239,242,233,233,243,241,245,225,242,101,128, 51, 13,115, 5,117, + 201,117,245,118, 4,118, 12,118, 40,232,233,228,225,225,245,244, + 111, 2,117,214,117,223,225,242,225,226,233, 99,128, 6, 64,238, + 239,243,233,228,229,226,229,225,242,233,238,231,225,242,225,226, + 233, 99,128, 6, 64,237,225,236,236,235,225,244,225,235,225,238, + 97,128, 48,245,241,245,225,242,101,128, 51,132,242, 97, 2,118, + 19,118, 28,225,242,225,226,233, 99,128, 6, 80,244,225,238,225, + 242,225,226,233, 99,128, 6, 77,244,242,239,235,229,227,249,242, + 233,236,236,233, 99,128, 4,159,244,225,232,233,242,225,240,242, + 239,236,239,238,231,237,225,242,235,232,225,236,230,247,233,228, + 244,104,128,255,112,246,229,242,244,233,227,225,236,243,244,242, + 239,235,229,227,249,242,233,236,236,233, 99,128, 4,157,226,239, + 240,239,237,239,230,111,128, 49, 14, 99, 4,118,131,118,153,118, + 162,118,170, 97, 2,118,137,118,147,236,243,241,245,225,242,101, + 128, 51,137,242,239,110,128, 1,233,229,228,233,236,236, 97,128, + 1, 55,233,242,227,236,101,128, 36,218,239,237,237,225,225,227, + 227,229,238,116,128, 1, 55,228,239,244,226,229,236,239,119,128, + 30, 51,101, 4,118,204,118,231,119, 0,119, 12,104, 2,118,210, + 118,221,225,242,237,229,238,233,225,110,128, 5,132,233,242,225, + 231,225,238, 97,128, 48, 81,235,225,244,225,235,225,238, 97,129, + 48,177,118,244,232,225,236,230,247,233,228,244,104,128,255,121, + 238,225,242,237,229,238,233,225,110,128, 5,111,243,237,225,236, + 236,235,225,244,225,235,225,238, 97,128, 48,246,231,242,229,229, + 238,236,225,238,228,233, 99,128, 1, 56,104, 6,119, 56,119,185, + 119,196,119,221,120, 52,120,140, 97, 5,119, 68,119, 78,119, 89, + 119, 96,119,121,226,229,238,231,225,236,105,128, 9,150,227,249, + 242,233,236,236,233, 99,128, 4, 69,228,229,246, 97,128, 9, 22, + 231,117, 2,119,103,119,112,234,225,242,225,244,105,128, 10,150, + 242,237,245,235,232,105,128, 10, 22,104, 4,119,131,119,140,119, + 154,119,170,225,242,225,226,233, 99,128, 6, 46,230,233,238,225, + 236,225,242,225,226,233, 99,128,254,166,233,238,233,244,233,225, + 236,225,242,225,226,233, 99,128,254,167,237,229,228,233,225,236, + 225,242,225,226,233, 99,128,254,168,229,233,227,239,240,244,233, + 99,128, 3,231,232, 97, 2,119,203,119,210,228,229,246, 97,128, + 9, 89,231,245,242,237,245,235,232,105,128, 10, 89,233,229,245, + 235,104, 4,119,235,120, 14,120, 29,120, 38, 97, 2,119,241,120, + 0,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,120, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 24,227,233, + 242,227,236,229,235,239,242,229,225,110,128, 50,106,235,239,242, + 229,225,110,128, 49, 75,240,225,242,229,238,235,239,242,229,225, + 110,128, 50, 10,111, 4,120, 62,120,111,120,121,120,126,235,104, + 4,120, 73,120, 82,120, 91,120,101,225,233,244,232,225,105,128, + 14, 2,239,238,244,232,225,105,128, 14, 5,245,225,244,244,232, + 225,105,128, 14, 3,247,225,233,244,232,225,105,128, 14, 4,237, + 245,244,244,232,225,105,128, 14, 91,239,107,128, 1,153,242,225, + 235,232,225,238,231,244,232,225,105,128, 14, 6,250,243,241,245, + 225,242,101,128, 51,145,105, 4,120,160,120,171,120,196,120,245, + 232,233,242,225,231,225,238, 97,128, 48, 77,235,225,244,225,235, + 225,238, 97,129, 48,173,120,184,232,225,236,230,247,233,228,244, + 104,128,255,119,242,111, 3,120,205,120,220,120,236,231,245,242, + 225,237,245,243,241,245,225,242,101,128, 51, 21,237,229,229,244, + 239,242,245,243,241,245,225,242,101,128, 51, 22,243,241,245,225, + 242,101,128, 51, 20,249,229,239,107, 5,121, 4,121, 39,121, 54, + 121, 63,121, 77, 97, 2,121, 10,121, 25,227,233,242,227,236,229, + 235,239,242,229,225,110,128, 50,110,240,225,242,229,238,235,239, + 242,229,225,110,128, 50, 14,227,233,242,227,236,229,235,239,242, + 229,225,110,128, 50, 96,235,239,242,229,225,110,128, 49, 49,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 0,243,233,239, + 243,235,239,242,229,225,110,128, 49, 51,234,229,227,249,242,233, + 236,236,233, 99,128, 4, 92,108, 2,121,109,121,120,233,238,229, + 226,229,236,239,119,128, 30, 53,243,241,245,225,242,101,128, 51, + 152,109, 3,121,137,121,151,121,162,227,245,226,229,228,243,241, + 245,225,242,101,128, 51,166,239,238,239,243,240,225,227,101,128, + 255, 75,243,241,245,225,242,229,228,243,241,245,225,242,101,128, + 51,162,111, 5,121,190,121,216,121,254,122, 10,122, 24,104, 2, + 121,196,121,206,233,242,225,231,225,238, 97,128, 48, 83,237,243, + 241,245,225,242,101,128, 51,192,235, 97, 2,121,223,121,231,233, + 244,232,225,105,128, 14, 1,244,225,235,225,238, 97,129, 48,179, + 121,242,232,225,236,230,247,233,228,244,104,128,255,122,239,240, + 239,243,241,245,225,242,101,128, 51, 30,240,240,225,227,249,242, + 233,236,236,233, 99,128, 4,129,114, 2,122, 30,122, 50,229,225, + 238,243,244,225,238,228,225,242,228,243,249,237,226,239,108,128, + 50,127,239,238,233,243,227,237, 98,128, 3, 67,240, 97, 2,122, + 67,122, 73,242,229,110,128, 36,166,243,241,245,225,242,101,128, + 51,170,243,233,227,249,242,233,236,236,233, 99,128, 4,111,116, + 2,122,101,122,110,243,241,245,225,242,101,128, 51,207,245,242, + 238,229,100,128, 2,158,117, 2,122,124,122,135,232,233,242,225, + 231,225,238, 97,128, 48, 79,235,225,244,225,235,225,238, 97,129, + 48,175,122,148,232,225,236,230,247,233,228,244,104,128,255,120, + 246,243,241,245,225,242,101,128, 51,184,247,243,241,245,225,242, + 101,128, 51,190,108,146, 0,108,122,220,124,247,125, 20,125, 86, + 125,124,126, 20,126, 29,126, 45,126, 69,126, 87,126,205,126,246, + 127,125,127,133,127,166,127,175,127,183,127,245, 97, 7,122,236, + 122,246,122,253,123, 4,123, 29,123, 45,124,235,226,229,238,231, + 225,236,105,128, 9,178,227,245,244,101,128, 1, 58,228,229,246, + 97,128, 9, 50,231,117, 2,123, 11,123, 20,234,225,242,225,244, + 105,128, 10,178,242,237,245,235,232,105,128, 10, 50,235,235,232, + 225,238,231,249,225,239,244,232,225,105,128, 14, 69,109, 10,123, + 67,124, 6,124, 23,124, 61,124, 75,124, 94,124,110,124,130,124, + 150,124,173, 97, 2,123, 73,123,254,236,229,102, 4,123, 85,123, + 99,123,191,123,208,230,233,238,225,236,225,242,225,226,233, 99, + 128,254,252,232,225,237,250, 97, 2,123,109,123,150,225,226,239, + 246,101, 2,123,119,123,133,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,248,233,243,239,236,225,244,229,228,225,242,225, + 226,233, 99,128,254,247,226,229,236,239,119, 2,123,160,123,174, + 230,233,238,225,236,225,242,225,226,233, 99,128,254,250,233,243, + 239,236,225,244,229,228,225,242,225,226,233, 99,128,254,249,233, + 243,239,236,225,244,229,228,225,242,225,226,233, 99,128,254,251, + 237,225,228,228,225,225,226,239,246,101, 2,123,223,123,237,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,246,233,243,239, + 236,225,244,229,228,225,242,225,226,233, 99,128,254,245,242,225, + 226,233, 99,128, 6, 68,226,228, 97,129, 3,187,124, 14,243,244, + 242,239,235,101,128, 1,155,229,100,130, 5,220,124, 32,124, 52, + 228,225,231,229,243,104,129,251, 60,124, 43,232,229,226,242,229, + 119,128,251, 60,232,229,226,242,229,119,128, 5,220,230,233,238, + 225,236,225,242,225,226,233, 99,128,254,222,232,225,232,233,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,252,202,233,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,254,223,234,229, + 229,237,233,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 252,201,235,232,225,232,233,238,233,244,233,225,236,225,242,225, + 226,233, 99,128,252,203,236,225,237,232,229,232,233,243,239,236, + 225,244,229,228,225,242,225,226,233, 99,128,253,242,237,101, 2, + 124,180,124,193,228,233,225,236,225,242,225,226,233, 99,128,254, + 224,229,109, 2,124,200,124,219,232,225,232,233,238,233,244,233, + 225,236,225,242,225,226,233, 99,128,253,136,233,238,233,244,233, + 225,236,225,242,225,226,233, 99,128,252,204,242,231,229,227,233, + 242,227,236,101,128, 37,239, 98, 3,124,255,125, 4,125, 10,225, + 114,128, 1,154,229,236,116,128, 2,108,239,240,239,237,239,230, + 111,128, 49, 12, 99, 4,125, 30,125, 37,125, 46,125, 73,225,242, + 239,110,128, 1, 62,229,228,233,236,236, 97,128, 1, 60,233,242, + 99, 2,125, 54,125, 59,236,101,128, 36,219,245,237,230,236,229, + 248,226,229,236,239,119,128, 30, 61,239,237,237,225,225,227,227, + 229,238,116,128, 1, 60,228,239,116,130, 1, 64,125, 96,125,105, + 225,227,227,229,238,116,128, 1, 64,226,229,236,239,119,129, 30, + 55,125,115,237,225,227,242,239,110,128, 30, 57,101, 3,125,132, + 125,170,126, 15,230,116, 2,125,139,125,155,225,238,231,236,229, + 225,226,239,246,229,227,237, 98,128, 3, 26,244,225,227,235,226, + 229,236,239,247,227,237, 98,128, 3, 24,243,115,132, 0, 60,125, + 183,125,205,125,217,126, 7,229,241,245,225,108,129, 34,100,125, + 193,239,242,231,242,229,225,244,229,114,128, 34,218,237,239,238, + 239,243,240,225,227,101,128,255, 28,111, 2,125,223,125,252,114, + 2,125,229,125,242,229,241,245,233,246,225,236,229,238,116,128, + 34,114,231,242,229,225,244,229,114,128, 34,118,246,229,242,229, + 241,245,225,108,128, 34,102,243,237,225,236,108,128,254,100,250, + 104,128, 2,110,230,226,236,239,227,107,128, 37,140,232,239,239, + 235,242,229,244,242,239,230,236,229,120,128, 2,109,105, 2,126, + 51,126, 56,242, 97,128, 32,164,247,238,225,242,237,229,238,233, + 225,110,128, 5,108,106,129, 1,201,126, 75,229,227,249,242,233, + 236,236,233, 99,128, 4, 89,108,132,246,192,126, 99,126,123,126, + 134,126,143, 97, 2,126,105,126,112,228,229,246, 97,128, 9, 51, + 231,245,234,225,242,225,244,105,128, 10,179,233,238,229,226,229, + 236,239,119,128, 30, 59,236,225,228,229,246, 97,128, 9, 52,246, + 239,227,225,236,233, 99, 3,126,157,126,167,126,174,226,229,238, + 231,225,236,105,128, 9,225,228,229,246, 97,128, 9, 97,246,239, + 247,229,236,243,233,231,110, 2,126,188,126,198,226,229,238,231, + 225,236,105,128, 9,227,228,229,246, 97,128, 9, 99,109, 3,126, + 213,126,226,126,237,233,228,228,236,229,244,233,236,228,101,128, + 2,107,239,238,239,243,240,225,227,101,128,255, 76,243,241,245, + 225,242,101,128, 51,208,111, 6,127, 4,127, 16,127, 58,127, 69, + 127, 75,127,117,227,232,245,236,225,244,232,225,105,128, 14, 44, + 231,233,227,225,108, 3,127, 28,127, 34,127, 53,225,238,100,128, + 34, 39,238,239,116,129, 0,172,127, 42,242,229,246,229,242,243, + 229,100,128, 35, 16,239,114,128, 34, 40,236,233,238,231,244,232, + 225,105,128, 14, 37,238,231,115,128, 1,127,247,236,233,238,101, + 2,127, 85,127,108, 99, 2,127, 91,127,103,229,238,244,229,242, + 236,233,238,101,128,254, 78,237, 98,128, 3, 50,228,225,243,232, + 229,100,128,254, 77,250,229,238,231,101,128, 37,202,240,225,242, + 229,110,128, 36,167,115, 3,127,141,127,148,127,156,236,225,243, + 104,128, 1, 66,241,245,225,242,101,128, 33, 19,245,240,229,242, + 233,239,114,128,246,238,244,243,232,225,228,101,128, 37,145,245, + 244,232,225,105,128, 14, 38,246,239,227,225,236,233, 99, 3,127, + 197,127,207,127,214,226,229,238,231,225,236,105,128, 9,140,228, + 229,246, 97,128, 9, 12,246,239,247,229,236,243,233,231,110, 2, + 127,228,127,238,226,229,238,231,225,236,105,128, 9,226,228,229, + 246, 97,128, 9, 98,248,243,241,245,225,242,101,128, 51,211,109, + 144, 0,109,128, 35,130,144,130,169,130,196,130,221,132, 18,132, + 40,133, 95,133,125,133,174,134, 25,134, 47,134, 72,134, 81,135, + 108,135,136, 97, 12,128, 61,128, 71,128,135,128,142,128,167,128, + 215,130, 51,130, 76,130, 81,130, 95,130,107,130,112,226,229,238, + 231,225,236,105,128, 9,174, 99, 2,128, 77,128,129,242,239,110, + 132, 0,175,128, 91,128,102,128,108,128,117,226,229,236,239,247, + 227,237, 98,128, 3, 49,227,237, 98,128, 3, 4,236,239,247,237, + 239,100,128, 2,205,237,239,238,239,243,240,225,227,101,128,255, + 227,245,244,101,128, 30, 63,228,229,246, 97,128, 9, 46,231,117, + 2,128,149,128,158,234,225,242,225,244,105,128, 10,174,242,237, + 245,235,232,105,128, 10, 46,104, 2,128,173,128,205,225,240,225, + 235,104, 2,128,183,128,192,232,229,226,242,229,119,128, 5,164, + 236,229,230,244,232,229,226,242,229,119,128, 5,164,233,242,225, + 231,225,238, 97,128, 48,126,105, 5,128,227,129, 40,129,103,129, + 133,130, 39,227,232,225,244,244,225,247, 97, 3,128,242,129, 17, + 129, 24,236,239,119, 2,128,250,129, 5,236,229,230,244,244,232, + 225,105,128,248,149,242,233,231,232,244,244,232,225,105,128,248, + 148,244,232,225,105,128, 14, 75,245,240,240,229,242,236,229,230, + 244,244,232,225,105,128,248,147,229,107, 3,129, 49,129, 80,129, + 87,236,239,119, 2,129, 57,129, 68,236,229,230,244,244,232,225, + 105,128,248,140,242,233,231,232,244,244,232,225,105,128,248,139, + 244,232,225,105,128, 14, 72,245,240,240,229,242,236,229,230,244, + 244,232,225,105,128,248,138,232,225,238,225,235,225,116, 2,129, + 115,129,126,236,229,230,244,244,232,225,105,128,248,132,244,232, + 225,105,128, 14, 49,116, 3,129,141,129,169,129,232,225,233,235, + 232,117, 2,129,151,129,162,236,229,230,244,244,232,225,105,128, + 248,137,244,232,225,105,128, 14, 71,232,111, 3,129,178,129,209, + 129,216,236,239,119, 2,129,186,129,197,236,229,230,244,244,232, + 225,105,128,248,143,242,233,231,232,244,244,232,225,105,128,248, + 142,244,232,225,105,128, 14, 73,245,240,240,229,242,236,229,230, + 244,244,232,225,105,128,248,141,242,105, 3,129,241,130, 16,130, + 23,236,239,119, 2,129,249,130, 4,236,229,230,244,244,232,225, + 105,128,248,146,242,233,231,232,244,244,232,225,105,128,248,145, + 244,232,225,105,128, 14, 74,245,240,240,229,242,236,229,230,244, + 244,232,225,105,128,248,144,249,225,237,239,235,244,232,225,105, + 128, 14, 70,235,225,244,225,235,225,238, 97,129, 48,222,130, 64, + 232,225,236,230,247,233,228,244,104,128,255,143,236,101,128, 38, + 66,238,243,249,239,238,243,241,245,225,242,101,128, 51, 71,241, + 225,230,232,229,226,242,229,119,128, 5,190,242,115,128, 38, 66, + 115, 2,130,118,130,136,239,242,225,227,233,242,227,236,229,232, + 229,226,242,229,119,128, 5,175,241,245,225,242,101,128, 51,131, + 98, 2,130,150,130,160,239,240,239,237,239,230,111,128, 49, 7, + 243,241,245,225,242,101,128, 51,212, 99, 2,130,175,130,183,233, + 242,227,236,101,128, 36,220,245,226,229,228,243,241,245,225,242, + 101,128, 51,165,228,239,116, 2,130,204,130,213,225,227,227,229, + 238,116,128, 30, 65,226,229,236,239,119,128, 30, 67,101, 7,130, + 237,131,108,131,119,131,134,131,159,131,196,131,208,101, 2,130, + 243,131, 95,109, 4,130,253,131, 6,131, 20,131, 36,225,242,225, + 226,233, 99,128, 6, 69,230,233,238,225,236,225,242,225,226,233, + 99,128,254,226,233,238,233,244,233,225,236,225,242,225,226,233, + 99,128,254,227,237,101, 2,131, 43,131, 56,228,233,225,236,225, + 242,225,226,233, 99,128,254,228,229,237,105, 2,131, 64,131, 79, + 238,233,244,233,225,236,225,242,225,226,233, 99,128,252,209,243, + 239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 72,244, + 239,242,245,243,241,245,225,242,101,128, 51, 77,232,233,242,225, + 231,225,238, 97,128, 48,129,233,250,233,229,242,225,243,241,245, + 225,242,101,128, 51,126,235,225,244,225,235,225,238, 97,129, 48, + 225,131,147,232,225,236,230,247,233,228,244,104,128,255,146,109, + 130, 5,222,131,167,131,187,228,225,231,229,243,104,129,251, 62, + 131,178,232,229,226,242,229,119,128,251, 62,232,229,226,242,229, + 119,128, 5,222,238,225,242,237,229,238,233,225,110,128, 5,116, + 242,235,232, 97, 3,131,219,131,228,132, 5,232,229,226,242,229, + 119,128, 5,165,235,229,230,245,236, 97, 2,131,239,131,248,232, + 229,226,242,229,119,128, 5,166,236,229,230,244,232,229,226,242, + 229,119,128, 5,166,236,229,230,244,232,229,226,242,229,119,128, + 5,165,104, 2,132, 24,132, 30,239,239,107,128, 2,113,250,243, + 241,245,225,242,101,128, 51,146,105, 6,132, 54,132, 91,132,228, + 132,239,133, 8,133, 65,228,100, 2,132, 61,132, 86,236,229,228, + 239,244,235,225,244,225,235,225,238,225,232,225,236,230,247,233, + 228,244,104,128,255,101,239,116,128, 0,183,229,245,109, 5,132, + 105,132,140,132,155,132,164,132,215, 97, 2,132,111,132,126,227, + 233,242,227,236,229,235,239,242,229,225,110,128, 50,114,240,225, + 242,229,238,235,239,242,229,225,110,128, 50, 18,227,233,242,227, + 236,229,235,239,242,229,225,110,128, 50,100,235,239,242,229,225, + 110,128, 49, 65,112, 2,132,170,132,202, 97, 2,132,176,132,190, + 238,243,233,239,243,235,239,242,229,225,110,128, 49,112,242,229, + 238,235,239,242,229,225,110,128, 50, 4,233,229,245,240,235,239, + 242,229,225,110,128, 49,110,243,233,239,243,235,239,242,229,225, + 110,128, 49,111,232,233,242,225,231,225,238, 97,128, 48,127,235, + 225,244,225,235,225,238, 97,129, 48,223,132,252,232,225,236,230, + 247,233,228,244,104,128,255,144,238,117, 2,133, 15,133, 60,115, + 132, 34, 18,133, 27,133, 38,133, 47,133, 53,226,229,236,239,247, + 227,237, 98,128, 3, 32,227,233,242,227,236,101,128, 34,150,237, + 239,100,128, 2,215,240,236,245,115,128, 34, 19,244,101,128, 32, + 50,242,105, 2,133, 72,133, 86,226,225,225,242,245,243,241,245, + 225,242,101,128, 51, 74,243,241,245,225,242,101,128, 51, 73,108, + 2,133,101,133,116,239,238,231,236,229,231,244,245,242,238,229, + 100,128, 2,112,243,241,245,225,242,101,128, 51,150,109, 3,133, + 133,133,147,133,158,227,245,226,229,228,243,241,245,225,242,101, + 128, 51,163,239,238,239,243,240,225,227,101,128,255, 77,243,241, + 245,225,242,229,228,243,241,245,225,242,101,128, 51,159,111, 5, + 133,186,133,212,133,237,133,247,134, 0,104, 2,133,192,133,202, + 233,242,225,231,225,238, 97,128, 48,130,237,243,241,245,225,242, + 101,128, 51,193,235,225,244,225,235,225,238, 97,129, 48,226,133, + 225,232,225,236,230,247,233,228,244,104,128,255,147,236,243,241, + 245,225,242,101,128, 51,214,237,225,244,232,225,105,128, 14, 33, + 246,229,242,243,243,241,245,225,242,101,129, 51,167,134, 15,228, + 243,241,245,225,242,101,128, 51,168,240, 97, 2,134, 32,134, 38, + 242,229,110,128, 36,168,243,241,245,225,242,101,128, 51,171,115, + 2,134, 53,134, 62,243,241,245,225,242,101,128, 51,179,245,240, + 229,242,233,239,114,128,246,239,244,245,242,238,229,100,128, 2, + 111,117,141, 0,181,134,111,134,115,134,125,134,149,134,159,134, + 181,134,192,134,217,134,240,134,250,135, 24,135, 88,135, 98, 49, + 128, 0,181,225,243,241,245,225,242,101,128, 51,130,227,104, 2, + 134,132,134,142,231,242,229,225,244,229,114,128, 34,107,236,229, + 243,115,128, 34,106,230,243,241,245,225,242,101,128, 51,140,103, + 2,134,165,134,172,242,229,229,107,128, 3,188,243,241,245,225, + 242,101,128, 51,141,232,233,242,225,231,225,238, 97,128, 48,128, + 235,225,244,225,235,225,238, 97,129, 48,224,134,205,232,225,236, + 230,247,233,228,244,104,128,255,145,108, 2,134,223,134,232,243, + 241,245,225,242,101,128, 51,149,244,233,240,236,121,128, 0,215, + 237,243,241,245,225,242,101,128, 51,155,238,225,104, 2,135, 2, + 135, 11,232,229,226,242,229,119,128, 5,163,236,229,230,244,232, + 229,226,242,229,119,128, 5,163,115, 2,135, 30,135, 79,233, 99, + 3,135, 39,135, 56,135, 67,225,236,238,239,244,101,129, 38,106, + 135, 50,228,226,108,128, 38,107,230,236,225,244,243,233,231,110, + 128, 38,109,243,232,225,242,240,243,233,231,110,128, 38,111,243, + 241,245,225,242,101,128, 51,178,246,243,241,245,225,242,101,128, + 51,182,247,243,241,245,225,242,101,128, 51,188,118, 2,135,114, + 135,127,237,229,231,225,243,241,245,225,242,101,128, 51,185,243, + 241,245,225,242,101,128, 51,183,119, 2,135,142,135,155,237,229, + 231,225,243,241,245,225,242,101,128, 51,191,243,241,245,225,242, + 101,128, 51,189,110,150, 0,110,135,212,136, 90,136,114,136,180, + 136,205,137, 7,137, 17,137, 84,137,127,139,161,139,179,139,204, + 139,235,140, 5,140, 70,142, 52,142, 60,142, 85,142, 93,143, 61, + 143, 71,143, 81, 97, 8,135,230,135,250,136, 1,136, 8,136, 33, + 136, 44,136, 69,136, 81, 98, 2,135,236,135,245,229,238,231,225, + 236,105,128, 9,168,236, 97,128, 34, 7,227,245,244,101,128, 1, + 68,228,229,246, 97,128, 9, 40,231,117, 2,136, 15,136, 24,234, + 225,242,225,244,105,128, 10,168,242,237,245,235,232,105,128, 10, + 40,232,233,242,225,231,225,238, 97,128, 48,106,235,225,244,225, + 235,225,238, 97,129, 48,202,136, 57,232,225,236,230,247,233,228, + 244,104,128,255,133,240,239,243,244,242,239,240,232,101,128, 1, + 73,243,241,245,225,242,101,128, 51,129, 98, 2,136, 96,136,106, + 239,240,239,237,239,230,111,128, 49, 11,243,240,225,227,101,128, + 0,160, 99, 4,136,124,136,131,136,140,136,167,225,242,239,110, + 128, 1, 72,229,228,233,236,236, 97,128, 1, 70,233,242, 99, 2, + 136,148,136,153,236,101,128, 36,221,245,237,230,236,229,248,226, + 229,236,239,119,128, 30, 75,239,237,237,225,225,227,227,229,238, + 116,128, 1, 70,228,239,116, 2,136,188,136,197,225,227,227,229, + 238,116,128, 30, 69,226,229,236,239,119,128, 30, 71,101, 3,136, + 213,136,224,136,249,232,233,242,225,231,225,238, 97,128, 48,109, + 235,225,244,225,235,225,238, 97,129, 48,205,136,237,232,225,236, + 230,247,233,228,244,104,128,255,136,247,243,232,229,241,229,236, + 243,233,231,110,128, 32,170,230,243,241,245,225,242,101,128, 51, + 139,103, 2,137, 23,137, 73, 97, 3,137, 31,137, 41,137, 48,226, + 229,238,231,225,236,105,128, 9,153,228,229,246, 97,128, 9, 25, + 231,117, 2,137, 55,137, 64,234,225,242,225,244,105,128, 10,153, + 242,237,245,235,232,105,128, 10, 25,239,238,231,245,244,232,225, + 105,128, 14, 7,104, 2,137, 90,137,100,233,242,225,231,225,238, + 97,128, 48,147,239,239,107, 2,137,108,137,115,236,229,230,116, + 128, 2,114,242,229,244,242,239,230,236,229,120,128, 2,115,105, + 4,137,137,138, 50,138, 61,138,119,229,245,110, 7,137,155,137, + 190,137,222,137,236,137,245,138, 22,138, 35, 97, 2,137,161,137, + 176,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,111, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 15,227,105, + 2,137,197,137,209,229,245,227,235,239,242,229,225,110,128, 49, + 53,242,227,236,229,235,239,242,229,225,110,128, 50, 97,232,233, + 229,245,232,235,239,242,229,225,110,128, 49, 54,235,239,242,229, + 225,110,128, 49, 52,240, 97, 2,137,252,138, 10,238,243,233,239, + 243,235,239,242,229,225,110,128, 49,104,242,229,238,235,239,242, + 229,225,110,128, 50, 1,243,233,239,243,235,239,242,229,225,110, + 128, 49,103,244,233,235,229,245,244,235,239,242,229,225,110,128, + 49,102,232,233,242,225,231,225,238, 97,128, 48,107,107, 2,138, + 67,138, 91,225,244,225,235,225,238, 97,129, 48,203,138, 79,232, + 225,236,230,247,233,228,244,104,128,255,134,232,225,232,233,116, + 2,138,101,138,112,236,229,230,244,244,232,225,105,128,248,153, + 244,232,225,105,128, 14, 77,238,101,141, 0, 57,138,150,138,159, + 138,169,138,199,138,206,138,231,139, 2,139, 36,139, 48,139, 59, + 139, 92,139,100,139,111,225,242,225,226,233, 99,128, 6,105,226, + 229,238,231,225,236,105,128, 9,239,227,233,242,227,236,101,129, + 36,104,138,180,233,238,246,229,242,243,229,243,225,238,243,243, + 229,242,233,102,128, 39,146,228,229,246, 97,128, 9,111,231,117, + 2,138,213,138,222,234,225,242,225,244,105,128, 10,239,242,237, + 245,235,232,105,128, 10,111,232, 97, 2,138,238,138,249,227,235, + 225,242,225,226,233, 99,128, 6,105,238,231,250,232,239,117,128, + 48, 41,105, 2,139, 8,139, 26,228,229,239,231,242,225,240,232, + 233,227,240,225,242,229,110,128, 50, 40,238,230,229,242,233,239, + 114,128, 32,137,237,239,238,239,243,240,225,227,101,128,255, 25, + 239,236,228,243,244,249,236,101,128,247, 57,112, 2,139, 65,139, + 72,225,242,229,110,128, 36,124,229,114, 2,139, 79,139, 85,233, + 239,100,128, 36,144,243,233,225,110,128, 6,249,242,239,237,225, + 110,128, 33,120,243,245,240,229,242,233,239,114,128, 32,121,116, + 2,139,117,139,155,229,229,110, 2,139,125,139,134,227,233,242, + 227,236,101,128, 36,114,112, 2,139,140,139,147,225,242,229,110, + 128, 36,134,229,242,233,239,100,128, 36,154,232,225,105,128, 14, + 89,106,129, 1,204,139,167,229,227,249,242,233,236,236,233, 99, + 128, 4, 90,235,225,244,225,235,225,238, 97,129, 48,243,139,192, + 232,225,236,230,247,233,228,244,104,128,255,157,108, 2,139,210, + 139,224,229,231,242,233,231,232,244,236,239,238,103,128, 1,158, + 233,238,229,226,229,236,239,119,128, 30, 73,109, 2,139,241,139, + 252,239,238,239,243,240,225,227,101,128,255, 78,243,241,245,225, + 242,101,128, 51,154,110, 2,140, 11,140, 61, 97, 3,140, 19,140, + 29,140, 36,226,229,238,231,225,236,105,128, 9,163,228,229,246, + 97,128, 9, 35,231,117, 2,140, 43,140, 52,234,225,242,225,244, + 105,128, 10,163,242,237,245,235,232,105,128, 10, 35,238,225,228, + 229,246, 97,128, 9, 41,111, 6,140, 84,140, 95,140,120,140,161, + 141,113,142, 40,232,233,242,225,231,225,238, 97,128, 48,110,235, + 225,244,225,235,225,238, 97,129, 48,206,140,108,232,225,236,230, + 247,233,228,244,104,128,255,137,110, 3,140,128,140,144,140,153, + 226,242,229,225,235,233,238,231,243,240,225,227,101,128, 0,160, + 229,238,244,232,225,105,128, 14, 19,245,244,232,225,105,128, 14, + 25,239,110, 7,140,178,140,187,140,201,140,235,140,251,141, 36, + 141, 95,225,242,225,226,233, 99,128, 6, 70,230,233,238,225,236, + 225,242,225,226,233, 99,128,254,230,231,232,245,238,238, 97, 2, + 140,212,140,221,225,242,225,226,233, 99,128, 6,186,230,233,238, + 225,236,225,242,225,226,233, 99,128,251,159,233,238,233,244,233, + 225,236,225,242,225,226,233, 99,128,254,231,234,229,229,237,105, + 2,141, 5,141, 20,238,233,244,233,225,236,225,242,225,226,233, + 99,128,252,210,243,239,236,225,244,229,228,225,242,225,226,233, + 99,128,252, 75,237,101, 2,141, 43,141, 56,228,233,225,236,225, + 242,225,226,233, 99,128,254,232,229,237,105, 2,141, 64,141, 79, + 238,233,244,233,225,236,225,242,225,226,233, 99,128,252,213,243, + 239,236,225,244,229,228,225,242,225,226,233, 99,128,252, 78,238, + 239,239,238,230,233,238,225,236,225,242,225,226,233, 99,128,252, + 141,116, 7,141,129,141,140,141,169,141,204,141,216,141,236,142, + 6,227,239,238,244,225,233,238,115,128, 34, 12,101, 2,141,146, + 141,162,236,229,237,229,238,116,129, 34, 9,141,157,239,102,128, + 34, 9,241,245,225,108,128, 34, 96,231,242,229,225,244,229,114, + 129, 34,111,141,181,238,239,114, 2,141,189,141,197,229,241,245, + 225,108,128, 34,113,236,229,243,115,128, 34,121,233,228,229,238, + 244,233,227,225,108,128, 34, 98,236,229,243,115,129, 34,110,141, + 225,238,239,242,229,241,245,225,108,128, 34,112,112, 2,141,242, + 141,252,225,242,225,236,236,229,108,128, 34, 38,242,229,227,229, + 228,229,115,128, 34,128,243,117, 3,142, 15,142, 22,142, 31,226, + 243,229,116,128, 34,132,227,227,229,229,228,115,128, 34,129,240, + 229,242,243,229,116,128, 34,133,247,225,242,237,229,238,233,225, + 110,128, 5,118,240,225,242,229,110,128, 36,169,115, 2,142, 66, + 142, 75,243,241,245,225,242,101,128, 51,177,245,240,229,242,233, + 239,114,128, 32,127,244,233,236,228,101,128, 0,241,117,132, 3, + 189,142,105,142,116,142,197,143, 24,232,233,242,225,231,225,238, + 97,128, 48,108,107, 2,142,122,142,146,225,244,225,235,225,238, + 97,129, 48,204,142,134,232,225,236,230,247,233,228,244,104,128, + 255,135,244, 97, 3,142,155,142,165,142,172,226,229,238,231,225, + 236,105,128, 9,188,228,229,246, 97,128, 9, 60,231,117, 2,142, + 179,142,188,234,225,242,225,244,105,128, 10,188,242,237,245,235, + 232,105,128, 10, 60,109, 2,142,203,142,237,226,229,242,243,233, + 231,110,130, 0, 35,142,217,142,229,237,239,238,239,243,240,225, + 227,101,128,255, 3,243,237,225,236,108,128,254, 95,229,114, 2, + 142,244,143, 20,225,236,243,233,231,110, 2,142,255,143, 7,231, + 242,229,229,107,128, 3,116,236,239,247,229,242,231,242,229,229, + 107,128, 3,117,111,128, 33, 22,110,130, 5,224,143, 32,143, 52, + 228,225,231,229,243,104,129,251, 64,143, 43,232,229,226,242,229, + 119,128,251, 64,232,229,226,242,229,119,128, 5,224,246,243,241, + 245,225,242,101,128, 51,181,247,243,241,245,225,242,101,128, 51, + 187,249, 97, 3,143, 90,143,100,143,107,226,229,238,231,225,236, + 105,128, 9,158,228,229,246, 97,128, 9, 30,231,117, 2,143,114, + 143,123,234,225,242,225,244,105,128, 10,158,242,237,245,235,232, + 105,128, 10, 30,111,147, 0,111,143,174,143,196,144, 18,144,188, + 145, 4,145, 19,145, 59,145,182,145,203,145,241,145,252,146,174, + 148, 8,148, 72,148,105,148,151,149, 24,149, 71,149, 83, 97, 2, + 143,180,143,187,227,245,244,101,128, 0,243,238,231,244,232,225, + 105,128, 14, 45, 98, 4,143,206,143,248,144, 1,144, 11,225,242, + 242,229,100,130, 2,117,143,218,143,229,227,249,242,233,236,236, + 233, 99,128, 4,233,228,233,229,242,229,243,233,243,227,249,242, + 233,236,236,233, 99,128, 4,235,229,238,231,225,236,105,128, 9, + 147,239,240,239,237,239,230,111,128, 49, 27,242,229,246,101,128, + 1, 79, 99, 3,144, 26,144, 99,144,178, 97, 2,144, 32,144, 93, + 238,228,242, 97, 3,144, 43,144, 50,144, 61,228,229,246, 97,128, + 9, 17,231,245,234,225,242,225,244,105,128, 10,145,246,239,247, + 229,236,243,233,231,110, 2,144, 75,144, 82,228,229,246, 97,128, + 9, 73,231,245,234,225,242,225,244,105,128, 10,201,242,239,110, + 128, 1,210,233,242, 99, 2,144,107,144,112,236,101,128, 36,222, + 245,237,230,236,229,120,133, 0,244,144,131,144,139,144,150,144, + 158,144,170,225,227,245,244,101,128, 30,209,228,239,244,226,229, + 236,239,119,128, 30,217,231,242,225,246,101,128, 30,211,232,239, + 239,235,225,226,239,246,101,128, 30,213,244,233,236,228,101,128, + 30,215,249,242,233,236,236,233, 99,128, 4, 62,100, 4,144,198, + 144,221,144,227,144,250,226,108, 2,144,205,144,213,225,227,245, + 244,101,128, 1, 81,231,242,225,246,101,128, 2, 13,229,246, 97, + 128, 9, 19,233,229,242,229,243,233,115,129, 0,246,144,239,227, + 249,242,233,236,236,233, 99,128, 4,231,239,244,226,229,236,239, + 119,128, 30,205,101,129, 1, 83,145, 10,235,239,242,229,225,110, + 128, 49, 90,103, 3,145, 27,145, 42,145, 49,239,238,229,107,129, + 2,219,145, 36,227,237, 98,128, 3, 40,242,225,246,101,128, 0, + 242,245,234,225,242,225,244,105,128, 10,147,104, 4,145, 69,145, + 80,145, 90,145,168,225,242,237,229,238,233,225,110,128, 5,133, + 233,242,225,231,225,238, 97,128, 48, 74,111, 2,145, 96,145,106, + 239,235,225,226,239,246,101,128, 30,207,242,110,133, 1,161,145, + 121,145,129,145,140,145,148,145,160,225,227,245,244,101,128, 30, + 219,228,239,244,226,229,236,239,119,128, 30,227,231,242,225,246, + 101,128, 30,221,232,239,239,235,225,226,239,246,101,128, 30,223, + 244,233,236,228,101,128, 30,225,245,238,231,225,242,245,237,236, + 225,245,116,128, 1, 81,105,129, 1,163,145,188,238,246,229,242, + 244,229,228,226,242,229,246,101,128, 2, 15,107, 2,145,209,145, + 233,225,244,225,235,225,238, 97,129, 48,170,145,221,232,225,236, + 230,247,233,228,244,104,128,255,117,239,242,229,225,110,128, 49, + 87,236,229,232,229,226,242,229,119,128, 5,171,109, 6,146, 10, + 146, 38,146, 45,146,134,146,145,146,163,225,227,242,239,110,130, + 1, 77,146, 22,146, 30,225,227,245,244,101,128, 30, 83,231,242, + 225,246,101,128, 30, 81,228,229,246, 97,128, 9, 80,229,231, 97, + 133, 3,201,146, 61,146, 65,146, 76,146, 90,146,106, 49,128, 3, + 214,227,249,242,233,236,236,233, 99,128, 4, 97,236,225,244,233, + 238,227,236,239,243,229,100,128, 2,119,242,239,245,238,228,227, + 249,242,233,236,236,233, 99,128, 4,123,116, 2,146,112,146,127, + 233,244,236,239,227,249,242,233,236,236,233, 99,128, 4,125,239, + 238,239,115,128, 3,206,231,245,234,225,242,225,244,105,128, 10, + 208,233,227,242,239,110,129, 3,191,146,155,244,239,238,239,115, + 128, 3,204,239,238,239,243,240,225,227,101,128,255, 79,238,101, + 145, 0, 49,146,213,146,222,146,232,147, 6,147, 31,147, 40,147, + 49,147, 74,147,108,147,142,147,154,147,173,147,184,147,217,147, + 227,147,235,147,246,225,242,225,226,233, 99,128, 6, 97,226,229, + 238,231,225,236,105,128, 9,231,227,233,242,227,236,101,129, 36, + 96,146,243,233,238,246,229,242,243,229,243,225,238,243,243,229, + 242,233,102,128, 39,138,100, 2,147, 12,147, 18,229,246, 97,128, + 9,103,239,244,229,238,236,229,225,228,229,114,128, 32, 36,229, + 233,231,232,244,104,128, 33, 91,230,233,244,244,229,100,128,246, + 220,231,117, 2,147, 56,147, 65,234,225,242,225,244,105,128, 10, + 231,242,237,245,235,232,105,128, 10,103,232, 97, 3,147, 83,147, + 94,147, 99,227,235,225,242,225,226,233, 99,128, 6, 97,236,102, + 128, 0,189,238,231,250,232,239,117,128, 48, 33,105, 2,147,114, + 147,132,228,229,239,231,242,225,240,232,233,227,240,225,242,229, + 110,128, 50, 32,238,230,229,242,233,239,114,128, 32,129,237,239, + 238,239,243,240,225,227,101,128,255, 17,238,245,237,229,242,225, + 244,239,242,226,229,238,231,225,236,105,128, 9,244,239,236,228, + 243,244,249,236,101,128,247, 49,112, 2,147,190,147,197,225,242, + 229,110,128, 36,116,229,114, 2,147,204,147,210,233,239,100,128, + 36,136,243,233,225,110,128, 6,241,241,245,225,242,244,229,114, + 128, 0,188,242,239,237,225,110,128, 33,112,243,245,240,229,242, + 233,239,114,128, 0,185,244,104, 2,147,253,148, 2,225,105,128, + 14, 81,233,242,100,128, 33, 83,111, 3,148, 16,148, 50,148, 66, + 103, 2,148, 22,148, 40,239,238,229,107,129, 1,235,148, 31,237, + 225,227,242,239,110,128, 1,237,245,242,237,245,235,232,105,128, + 10, 19,237,225,244,242,225,231,245,242,237,245,235,232,105,128, + 10, 75,240,229,110,128, 2, 84,112, 3,148, 80,148, 87,148, 98, + 225,242,229,110,128, 36,170,229,238,226,245,236,236,229,116,128, + 37,230,244,233,239,110,128, 35, 37,114, 2,148,111,148,140,100, + 2,148,117,148,128,230,229,237,233,238,233,238,101,128, 0,170, + 237,225,243,227,245,236,233,238,101,128, 0,186,244,232,239,231, + 239,238,225,108,128, 34, 31,115, 5,148,163,148,195,148,212,149, + 1,149, 14,232,239,242,116, 2,148,172,148,179,228,229,246, 97, + 128, 9, 18,246,239,247,229,236,243,233,231,238,228,229,246, 97, + 128, 9, 74,236,225,243,104,129, 0,248,148,204,225,227,245,244, + 101,128, 1,255,237,225,236,108, 2,148,221,148,232,232,233,242, + 225,231,225,238, 97,128, 48, 73,235,225,244,225,235,225,238, 97, + 129, 48,169,148,245,232,225,236,230,247,233,228,244,104,128,255, + 107,244,242,239,235,229,225,227,245,244,101,128, 1,255,245,240, + 229,242,233,239,114,128,246,240,116, 2,149, 30,149, 41,227,249, + 242,233,236,236,233, 99,128, 4,127,233,236,228,101,130, 0,245, + 149, 52,149, 60,225,227,245,244,101,128, 30, 77,228,233,229,242, + 229,243,233,115,128, 30, 79,245,226,239,240,239,237,239,230,111, + 128, 49, 33,118, 2,149, 89,149,170,229,114, 2,149, 96,149,162, + 236,233,238,101,131, 32, 62,149,109,149,132,149,155, 99, 2,149, + 115,149,127,229,238,244,229,242,236,233,238,101,128,254, 74,237, + 98,128, 3, 5,100, 2,149,138,149,146,225,243,232,229,100,128, + 254, 73,226,236,247,225,246,121,128,254, 76,247,225,246,121,128, + 254, 75,243,227,239,242,101,128, 0,175,239,247,229,236,243,233, + 231,110, 3,149,185,149,195,149,202,226,229,238,231,225,236,105, + 128, 9,203,228,229,246, 97,128, 9, 75,231,245,234,225,242,225, + 244,105,128, 10,203,112,145, 0,112,149,251,152,123,152,134,152, + 143,152,155,154, 80,154, 90,155, 82,156,101,156,191,156,217,157, + 92,157,100,158, 2,158, 60,158, 88,158, 98, 97, 14,150, 25,150, + 57,150, 67,150, 74,150, 81,150,129,150,140,150,154,150,165,150, + 212,150,226,151,238,152, 21,152,111, 97, 2,150, 31,150, 43,237, + 240,243,243,241,245,225,242,101,128, 51,128,243,229,238,244,239, + 243,241,245,225,242,101,128, 51, 43,226,229,238,231,225,236,105, + 128, 9,170,227,245,244,101,128, 30, 85,228,229,246, 97,128, 9, + 42,103, 2,150, 87,150,105,101, 2,150, 93,150,100,228,239,247, + 110,128, 33,223,245,112,128, 33,222,117, 2,150,111,150,120,234, + 225,242,225,244,105,128, 10,170,242,237,245,235,232,105,128, 10, + 42,232,233,242,225,231,225,238, 97,128, 48,113,233,249,225,238, + 238,239,233,244,232,225,105,128, 14, 47,235,225,244,225,235,225, + 238, 97,128, 48,209,108, 2,150,171,150,196,225,244,225,236,233, + 250,225,244,233,239,238,227,249,242,233,236,236,233,227,227,237, + 98,128, 4,132,239,227,232,235,225,227,249,242,233,236,236,233, + 99,128, 4,192,238,243,233,239,243,235,239,242,229,225,110,128, + 49,127,114, 3,150,234,150,255,151,227, 97, 2,150,240,150,248, + 231,242,225,240,104,128, 0,182,236,236,229,108,128, 34, 37,229, + 110, 2,151, 6,151,116,236,229,230,116,136, 0, 40,151, 29,151, + 44,151, 49,151, 54,151, 65,151, 77,151,100,151,105,225,236,244, + 239,238,229,225,242,225,226,233, 99,128,253, 62,226,116,128,248, + 237,229,120,128,248,236,233,238,230,229,242,233,239,114,128, 32, + 141,237,239,238,239,243,240,225,227,101,128,255, 8,115, 2,151, + 83,151, 90,237,225,236,108,128,254, 89,245,240,229,242,233,239, + 114,128, 32,125,244,112,128,248,235,246,229,242,244,233,227,225, + 108,128,254, 53,242,233,231,232,116,136, 0, 41,151,140,151,155, + 151,160,151,165,151,176,151,188,151,211,151,216,225,236,244,239, + 238,229,225,242,225,226,233, 99,128,253, 63,226,116,128,248,248, + 229,120,128,248,247,233,238,230,229,242,233,239,114,128, 32,142, + 237,239,238,239,243,240,225,227,101,128,255, 9,115, 2,151,194, + 151,201,237,225,236,108,128,254, 90,245,240,229,242,233,239,114, + 128, 32,126,244,112,128,248,246,246,229,242,244,233,227,225,108, + 128,254, 54,244,233,225,236,228,233,230,102,128, 34, 2,115, 3, + 151,246,152, 1,152, 13,229,241,232,229,226,242,229,119,128, 5, + 192,232,244,225,232,229,226,242,229,119,128, 5,153,241,245,225, + 242,101,128, 51,169,244,225,104,134, 5,183,152, 39,152, 53,152, + 58,152, 67,152, 82,152, 98, 49, 2,152, 45,152, 49, 49,128, 5, + 183,100,128, 5,183,178, 97,128, 5,183,232,229,226,242,229,119, + 128, 5,183,238,225,242,242,239,247,232,229,226,242,229,119,128, + 5,183,241,245,225,242,244,229,242,232,229,226,242,229,119,128, + 5,183,247,233,228,229,232,229,226,242,229,119,128, 5,183,250, + 229,242,232,229,226,242,229,119,128, 5,161,226,239,240,239,237, + 239,230,111,128, 49, 6,227,233,242,227,236,101,128, 36,223,228, + 239,244,225,227,227,229,238,116,128, 30, 87,101,137, 5,228,152, + 177,152,188,152,208,152,220,152,240,153, 86,153, 97,153,118,154, + 73,227,249,242,233,236,236,233, 99,128, 4, 63,228,225,231,229, + 243,104,129,251, 68,152,199,232,229,226,242,229,119,128,251, 68, + 229,250,233,243,241,245,225,242,101,128, 51, 59,230,233,238,225, + 236,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 67, + 104, 5,152,252,153, 19,153, 27,153, 41,153, 71,225,114, 2,153, + 3,153, 10,225,226,233, 99,128, 6,126,237,229,238,233,225,110, + 128, 5,122,229,226,242,229,119,128, 5,228,230,233,238,225,236, + 225,242,225,226,233, 99,128,251, 87,105, 2,153, 47,153, 62,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,251, 88,242,225, + 231,225,238, 97,128, 48,122,237,229,228,233,225,236,225,242,225, + 226,233, 99,128,251, 89,235,225,244,225,235,225,238, 97,128, 48, + 218,237,233,228,228,236,229,232,239,239,235,227,249,242,233,236, + 236,233, 99,128, 4,167,114, 5,153,130,153,142,153,184,154, 49, + 154, 62,225,230,229,232,229,226,242,229,119,128,251, 78,227,229, + 238,116,131, 0, 37,153,155,153,164,153,176,225,242,225,226,233, + 99,128, 6,106,237,239,238,239,243,240,225,227,101,128,255, 5, + 243,237,225,236,108,128,254,106,105, 2,153,190,154, 31,239,100, + 134, 0, 46,153,207,153,218,153,229,153,241,153,252,154, 8,225, + 242,237,229,238,233,225,110,128, 5,137,227,229,238,244,229,242, + 229,100,128, 0,183,232,225,236,230,247,233,228,244,104,128,255, + 97,233,238,230,229,242,233,239,114,128,246,231,237,239,238,239, + 243,240,225,227,101,128,255, 14,115, 2,154, 14,154, 21,237,225, + 236,108,128,254, 82,245,240,229,242,233,239,114,128,246,232,243, + 240,239,237,229,238,233,231,242,229,229,235,227,237, 98,128, 3, + 66,240,229,238,228,233,227,245,236,225,114,128, 34,165,244,232, + 239,245,243,225,238,100,128, 32, 48,243,229,244, 97,128, 32,167, + 230,243,241,245,225,242,101,128, 51,138,104, 3,154, 98,154,148, + 155, 29, 97, 3,154,106,154,116,154,123,226,229,238,231,225,236, + 105,128, 9,171,228,229,246, 97,128, 9, 43,231,117, 2,154,130, + 154,139,234,225,242,225,244,105,128, 10,171,242,237,245,235,232, + 105,128, 10, 43,105,133, 3,198,154,162,154,166,154,252,155, 4, + 155, 15, 49,128, 3,213,229,245,240,104, 4,154,179,154,214,154, + 229,154,238, 97, 2,154,185,154,200,227,233,242,227,236,229,235, + 239,242,229,225,110,128, 50,122,240,225,242,229,238,235,239,242, + 229,225,110,128, 50, 26,227,233,242,227,236,229,235,239,242,229, + 225,110,128, 50,108,235,239,242,229,225,110,128, 49, 77,240,225, + 242,229,238,235,239,242,229,225,110,128, 50, 12,236,225,244,233, + 110,128, 2,120,238,244,232,245,244,232,225,105,128, 14, 58,243, + 249,237,226,239,236,231,242,229,229,107,128, 3,213,111, 3,155, + 37,155, 42,155, 68,239,107,128, 1,165,240,104, 2,155, 49,155, + 58,225,238,244,232,225,105,128, 14, 30,245,238,231,244,232,225, + 105,128, 14, 28,243,225,237,240,232,225,239,244,232,225,105,128, + 14, 32,105,133, 3,192,155, 96,156, 52,156, 63,156, 74,156, 88, + 229,245,112, 6,155,112,155,147,155,179,155,207,155,221,156, 17, + 97, 2,155,118,155,133,227,233,242,227,236,229,235,239,242,229, + 225,110,128, 50,115,240,225,242,229,238,235,239,242,229,225,110, + 128, 50, 19,227,105, 2,155,154,155,166,229,245,227,235,239,242, + 229,225,110,128, 49,118,242,227,236,229,235,239,242,229,225,110, + 128, 50,101,107, 2,155,185,155,199,233,249,229,239,235,235,239, + 242,229,225,110,128, 49,114,239,242,229,225,110,128, 49, 66,240, + 225,242,229,238,235,239,242,229,225,110,128, 50, 5,243,233,239, + 115, 2,155,230,156, 2,107, 2,155,236,155,250,233,249,229,239, + 235,235,239,242,229,225,110,128, 49,116,239,242,229,225,110,128, + 49, 68,244,233,235,229,245,244,235,239,242,229,225,110,128, 49, + 117,116, 2,156, 23,156, 38,232,233,229,245,244,232,235,239,242, + 229,225,110,128, 49,119,233,235,229,245,244,235,239,242,229,225, + 110,128, 49,115,232,233,242,225,231,225,238, 97,128, 48,116,235, + 225,244,225,235,225,238, 97,128, 48,212,243,249,237,226,239,236, + 231,242,229,229,107,128, 3,214,247,242,225,242,237,229,238,233, + 225,110,128, 5,131,236,245,115,132, 0, 43,156,115,156,126,156, + 135,156,168,226,229,236,239,247,227,237, 98,128, 3, 31,227,233, + 242,227,236,101,128, 34,149,109, 2,156,141,156,148,233,238,245, + 115,128, 0,177,111, 2,156,154,156,158,100,128, 2,214,238,239, + 243,240,225,227,101,128,255, 11,115, 2,156,174,156,181,237,225, + 236,108,128,254, 98,245,240,229,242,233,239,114,128, 32,122,109, + 2,156,197,156,208,239,238,239,243,240,225,227,101,128,255, 80, + 243,241,245,225,242,101,128, 51,216,111, 5,156,229,156,240,157, + 51,157, 62,157, 72,232,233,242,225,231,225,238, 97,128, 48,125, + 233,238,244,233,238,231,233,238,228,229,120, 4,157, 4,157, 16, + 157, 28,157, 41,228,239,247,238,247,232,233,244,101,128, 38, 31, + 236,229,230,244,247,232,233,244,101,128, 38, 28,242,233,231,232, + 244,247,232,233,244,101,128, 38, 30,245,240,247,232,233,244,101, + 128, 38, 29,235,225,244,225,235,225,238, 97,128, 48,221,240,236, + 225,244,232,225,105,128, 14, 27,243,244,225,236,237,225,242,107, + 129, 48, 18,157, 85,230,225,227,101,128, 48, 32,240,225,242,229, + 110,128, 36,171,114, 3,157,108,157,134,157,159,101, 2,157,114, + 157,122,227,229,228,229,115,128, 34,122,243,227,242,233,240,244, + 233,239,110,128, 33, 30,233,237,101, 2,157,142,157,148,237,239, + 100,128, 2,185,242,229,246,229,242,243,229,100,128, 32, 53,111, + 4,157,169,157,176,157,186,157,199,228,245,227,116,128, 34, 15, + 234,229,227,244,233,246,101,128, 35, 5,236,239,238,231,229,228, + 235,225,238, 97,128, 48,252,112, 2,157,205,157,242,101, 2,157, + 211,157,218,236,236,239,114,128, 35, 24,242,243,117, 2,157,226, + 157,233,226,243,229,116,128, 34,130,240,229,242,243,229,116,128, + 34,131,239,242,244,233,239,110,129, 34, 55,157,253,225,108,128, + 34, 29,115, 2,158, 8,158, 51,105,130, 3,200,158, 16,158, 27, + 227,249,242,233,236,236,233, 99,128, 4,113,236,233,240,238,229, + 245,237,225,244,225,227,249,242,233,236,236,233,227,227,237, 98, + 128, 4,134,243,241,245,225,242,101,128, 51,176,117, 2,158, 66, + 158, 77,232,233,242,225,231,225,238, 97,128, 48,119,235,225,244, + 225,235,225,238, 97,128, 48,215,246,243,241,245,225,242,101,128, + 51,180,247,243,241,245,225,242,101,128, 51,186,113,136, 0,113, + 158,128,159,177,159,188,159,197,159,204,159,216,159,254,160, 6, + 97, 4,158,138,158,161,158,225,159,160,100, 2,158,144,158,150, + 229,246, 97,128, 9, 88,237,225,232,229,226,242,229,119,128, 5, + 168,102, 4,158,171,158,180,158,194,158,210,225,242,225,226,233, + 99,128, 6, 66,230,233,238,225,236,225,242,225,226,233, 99,128, + 254,214,233,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 254,215,237,229,228,233,225,236,225,242,225,226,233, 99,128,254, + 216,237,225,244,115,136, 5,184,158,248,159, 12,159, 26,159, 31, + 159, 36,159, 45,159, 60,159,147, 49, 3,159, 0,159, 4,159, 8, + 48,128, 5,184, 97,128, 5,184, 99,128, 5,184, 50, 2,159, 18, + 159, 22, 55,128, 5,184, 57,128, 5,184,179, 51,128, 5,184,228, + 101,128, 5,184,232,229,226,242,229,119,128, 5,184,238,225,242, + 242,239,247,232,229,226,242,229,119,128, 5,184,113, 2,159, 66, + 159,132,225,244,225,110, 4,159, 79,159, 88,159,103,159,119,232, + 229,226,242,229,119,128, 5,184,238,225,242,242,239,247,232,229, + 226,242,229,119,128, 5,184,241,245,225,242,244,229,242,232,229, + 226,242,229,119,128, 5,184,247,233,228,229,232,229,226,242,229, + 119,128, 5,184,245,225,242,244,229,242,232,229,226,242,229,119, + 128, 5,184,247,233,228,229,232,229,226,242,229,119,128, 5,184, + 242,238,229,249,240,225,242,225,232,229,226,242,229,119,128, 5, + 159,226,239,240,239,237,239,230,111,128, 49, 17,227,233,242,227, + 236,101,128, 36,224,232,239,239,107,128, 2,160,237,239,238,239, + 243,240,225,227,101,128,255, 81,239,102,130, 5,231,159,225,159, + 245,228,225,231,229,243,104,129,251, 71,159,236,232,229,226,242, + 229,119,128,251, 71,232,229,226,242,229,119,128, 5,231,240,225, + 242,229,110,128, 36,172,117, 4,160, 16,160, 28,160,117,160,204, + 225,242,244,229,242,238,239,244,101,128, 38,105,226,245,244,115, + 135, 5,187,160, 49,160, 54,160, 59,160, 64,160, 73,160, 88,160, + 104,177, 56,128, 5,187,178, 53,128, 5,187,179, 49,128, 5,187, + 232,229,226,242,229,119,128, 5,187,238,225,242,242,239,247,232, + 229,226,242,229,119,128, 5,187,241,245,225,242,244,229,242,232, + 229,226,242,229,119,128, 5,187,247,233,228,229,232,229,226,242, + 229,119,128, 5,187,229,243,244,233,239,110,133, 0, 63,160,136, + 160,159,160,176,160,184,160,196,225,114, 2,160,143,160,150,225, + 226,233, 99,128, 6, 31,237,229,238,233,225,110,128, 5, 94,228, + 239,247,110,129, 0,191,160,168,243,237,225,236,108,128,247,191, + 231,242,229,229,107,128, 3,126,237,239,238,239,243,240,225,227, + 101,128,255, 31,243,237,225,236,108,128,247, 63,239,244,101, 4, + 160,216,161, 31,161, 51,161, 80,228,226,108,133, 0, 34,160,232, + 160,239,160,246,161, 2,161, 23,226,225,243,101,128, 32, 30,236, + 229,230,116,128, 32, 28,237,239,238,239,243,240,225,227,101,128, + 255, 2,240,242,233,237,101,129, 48, 30,161, 12,242,229,246,229, + 242,243,229,100,128, 48, 29,242,233,231,232,116,128, 32, 29,236, + 229,230,116,129, 32, 24,161, 40,242,229,246,229,242,243,229,100, + 128, 32, 27,114, 2,161, 57,161, 67,229,246,229,242,243,229,100, + 128, 32, 27,233,231,232,116,129, 32, 25,161, 76,110,128, 1, 73, + 243,233,238,231,108, 2,161, 90,161, 97,226,225,243,101,128, 32, + 26,101,129, 0, 39,161,103,237,239,238,239,243,240,225,227,101, + 128,255, 7,114,145, 0,114,161,153,162,157,162,168,162,215,163, + 10,164, 27,164, 51,164,146,166,180,166,217,166,229,167, 27,167, + 35,167,197,167,208,167,243,168, 87, 97, 11,161,177,161,188,161, + 198,161,205,162, 14,162, 30,162, 55,162, 66,162, 91,162,114,162, + 151,225,242,237,229,238,233,225,110,128, 5,124,226,229,238,231, + 225,236,105,128, 9,176,227,245,244,101,128, 1, 85,100, 4,161, + 215,161,221,161,235,162, 5,229,246, 97,128, 9, 48,233,227,225, + 108,129, 34, 26,161,230,229,120,128,248,229,239,246,229,242,243, + 243,241,245,225,242,101,129, 51,174,161,251,228,243,241,245,225, + 242,101,128, 51,175,243,241,245,225,242,101,128, 51,173,230,101, + 129, 5,191,162, 21,232,229,226,242,229,119,128, 5,191,231,117, + 2,162, 37,162, 46,234,225,242,225,244,105,128, 10,176,242,237, + 245,235,232,105,128, 10, 48,232,233,242,225,231,225,238, 97,128, + 48,137,235,225,244,225,235,225,238, 97,129, 48,233,162, 79,232, + 225,236,230,247,233,228,244,104,128,255,151,236,239,247,229,242, + 228,233,225,231,239,238,225,236,226,229,238,231,225,236,105,128, + 9,241,109, 2,162,120,162,143,233,228,228,236,229,228,233,225, + 231,239,238,225,236,226,229,238,231,225,236,105,128, 9,240,243, + 232,239,242,110,128, 2,100,244,233,111,128, 34, 54,226,239,240, + 239,237,239,230,111,128, 49, 22, 99, 4,162,178,162,185,162,194, + 162,202,225,242,239,110,128, 1, 89,229,228,233,236,236, 97,128, + 1, 87,233,242,227,236,101,128, 36,225,239,237,237,225,225,227, + 227,229,238,116,128, 1, 87,100, 2,162,221,162,231,226,236,231, + 242,225,246,101,128, 2, 17,239,116, 2,162,238,162,247,225,227, + 227,229,238,116,128, 30, 89,226,229,236,239,119,129, 30, 91,163, + 1,237,225,227,242,239,110,128, 30, 93,101, 6,163, 24,163, 69, + 163,104,163,159,163,184,163,217,102, 2,163, 30,163, 43,229,242, + 229,238,227,229,237,225,242,107,128, 32, 59,236,229,248,243,117, + 2,163, 53,163, 60,226,243,229,116,128, 34,134,240,229,242,243, + 229,116,128, 34,135,231,233,243,244,229,114, 2,163, 80,163, 85, + 229,100,128, 0,174,115, 2,163, 91,163, 97,225,238,115,128,248, + 232,229,242,233,102,128,246,218,104, 3,163,112,163,135,163,149, + 225,114, 2,163,119,163,126,225,226,233, 99,128, 6, 49,237,229, + 238,233,225,110,128, 5,128,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,174,233,242,225,231,225,238, 97,128, 48,140,235, + 225,244,225,235,225,238, 97,129, 48,236,163,172,232,225,236,230, + 247,233,228,244,104,128,255,154,243,104,130, 5,232,163,193,163, + 208,228,225,231,229,243,232,232,229,226,242,229,119,128,251, 72, + 232,229,226,242,229,119,128, 5,232,118, 3,163,225,163,238,164, + 14,229,242,243,229,228,244,233,236,228,101,128, 34, 61,233, 97, + 2,163,245,163,254,232,229,226,242,229,119,128, 5,151,237,245, + 231,242,225,243,232,232,229,226,242,229,119,128, 5,151,236,239, + 231,233,227,225,236,238,239,116,128, 35, 16,230,233,243,232,232, + 239,239,107,129, 2,126,164, 40,242,229,246,229,242,243,229,100, + 128, 2,127,104, 2,164, 57,164, 80, 97, 2,164, 63,164, 73,226, + 229,238,231,225,236,105,128, 9,221,228,229,246, 97,128, 9, 93, + 111,131, 3,193,164, 90,164,119,164,133,239,107,129, 2,125,164, + 97,244,245,242,238,229,100,129, 2,123,164,108,243,245,240,229, + 242,233,239,114,128, 2,181,243,249,237,226,239,236,231,242,229, + 229,107,128, 3,241,244,233,227,232,239,239,235,237,239,100,128, + 2,222,105, 6,164,160,165,204,165,250,166, 5,166, 30,166,166, + 229,245,108, 9,164,182,164,217,164,232,164,246,165, 36,165, 50, + 165,136,165,149,165,184, 97, 2,164,188,164,203,227,233,242,227, + 236,229,235,239,242,229,225,110,128, 50,113,240,225,242,229,238, + 235,239,242,229,225,110,128, 50, 17,227,233,242,227,236,229,235, + 239,242,229,225,110,128, 50, 99,232,233,229,245,232,235,239,242, + 229,225,110,128, 49, 64,107, 2,164,252,165, 28,233,249,229,239, + 107, 2,165, 6,165, 15,235,239,242,229,225,110,128, 49, 58,243, + 233,239,243,235,239,242,229,225,110,128, 49,105,239,242,229,225, + 110,128, 49, 57,237,233,229,245,237,235,239,242,229,225,110,128, + 49, 59,112, 3,165, 58,165, 90,165,105, 97, 2,165, 64,165, 78, + 238,243,233,239,243,235,239,242,229,225,110,128, 49,108,242,229, + 238,235,239,242,229,225,110,128, 50, 3,232,233,229,245,240,232, + 235,239,242,229,225,110,128, 49, 63,233,229,245,112, 2,165,114, + 165,123,235,239,242,229,225,110,128, 49, 60,243,233,239,243,235, + 239,242,229,225,110,128, 49,107,243,233,239,243,235,239,242,229, + 225,110,128, 49, 61,116, 2,165,155,165,170,232,233,229,245,244, + 232,235,239,242,229,225,110,128, 49, 62,233,235,229,245,244,235, + 239,242,229,225,110,128, 49,106,249,229,239,242,233,238,232,233, + 229,245,232,235,239,242,229,225,110,128, 49,109,231,232,116, 2, + 165,212,165,220,225,238,231,236,101,128, 34, 31,116, 2,165,226, + 165,240,225,227,235,226,229,236,239,247,227,237, 98,128, 3, 25, + 242,233,225,238,231,236,101,128, 34,191,232,233,242,225,231,225, + 238, 97,128, 48,138,235,225,244,225,235,225,238, 97,129, 48,234, + 166, 18,232,225,236,230,247,233,228,244,104,128,255,152,110, 2, + 166, 36,166,152,103,131, 2,218,166, 46,166, 57,166, 63,226,229, + 236,239,247,227,237, 98,128, 3, 37,227,237, 98,128, 3, 10,232, + 225,236,102, 2,166, 72,166,118,236,229,230,116,131, 2,191,166, + 85,166, 96,166,107,225,242,237,229,238,233,225,110,128, 5, 89, + 226,229,236,239,247,227,237, 98,128, 3, 28,227,229,238,244,229, + 242,229,100,128, 2,211,242,233,231,232,116,130, 2,190,166,130, + 166,141,226,229,236,239,247,227,237, 98,128, 3, 57,227,229,238, + 244,229,242,229,100,128, 2,210,246,229,242,244,229,228,226,242, + 229,246,101,128, 2, 19,244,244,239,242,245,243,241,245,225,242, + 101,128, 51, 81,108, 2,166,186,166,197,233,238,229,226,229,236, + 239,119,128, 30, 95,239,238,231,236,229,103,129, 2,124,166,208, + 244,245,242,238,229,100,128, 2,122,237,239,238,239,243,240,225, + 227,101,128,255, 82,111, 3,166,237,166,248,167, 17,232,233,242, + 225,231,225,238, 97,128, 48,141,235,225,244,225,235,225,238, 97, + 129, 48,237,167, 5,232,225,236,230,247,233,228,244,104,128,255, + 155,242,245,225,244,232,225,105,128, 14, 35,240,225,242,229,110, + 128, 36,173,114, 3,167, 43,167, 79,167,109, 97, 3,167, 51,167, + 61,167, 68,226,229,238,231,225,236,105,128, 9,220,228,229,246, + 97,128, 9, 49,231,245,242,237,245,235,232,105,128, 10, 92,229, + 104, 2,167, 86,167, 95,225,242,225,226,233, 99,128, 6,145,230, + 233,238,225,236,225,242,225,226,233, 99,128,251,141,246,239,227, + 225,236,233, 99, 4,167,125,167,135,167,142,167,153,226,229,238, + 231,225,236,105,128, 9,224,228,229,246, 97,128, 9, 96,231,245, + 234,225,242,225,244,105,128, 10,224,246,239,247,229,236,243,233, + 231,110, 3,167,169,167,179,167,186,226,229,238,231,225,236,105, + 128, 9,196,228,229,246, 97,128, 9, 68,231,245,234,225,242,225, + 244,105,128, 10,196,243,245,240,229,242,233,239,114,128,246,241, + 116, 2,167,214,167,222,226,236,239,227,107,128, 37,144,245,242, + 238,229,100,129, 2,121,167,232,243,245,240,229,242,233,239,114, + 128, 2,180,117, 4,167,253,168, 8,168, 33,168, 80,232,233,242, + 225,231,225,238, 97,128, 48,139,235,225,244,225,235,225,238, 97, + 129, 48,235,168, 21,232,225,236,230,247,233,228,244,104,128,255, + 153,112, 2,168, 39,168, 74,229,101, 2,168, 46,168, 60,237,225, + 242,235,226,229,238,231,225,236,105,128, 9,242,243,233,231,238, + 226,229,238,231,225,236,105,128, 9,243,233,225,104,128,246,221, + 244,232,225,105,128, 14, 36,246,239,227,225,236,233, 99, 4,168, + 103,168,113,168,120,168,131,226,229,238,231,225,236,105,128, 9, + 139,228,229,246, 97,128, 9, 11,231,245,234,225,242,225,244,105, + 128, 10,139,246,239,247,229,236,243,233,231,110, 3,168,147,168, + 157,168,164,226,229,238,231,225,236,105,128, 9,195,228,229,246, + 97,128, 9, 67,231,245,234,225,242,225,244,105,128, 10,195,115, + 147, 0,115,168,217,170,187,170,198,171, 68,171,107,174, 49,174, + 60,176,203,179, 85,179,131,179,158,180, 93,180,160,181,193,181, + 203,182,133,182,206,183,120,183,130, 97, 9,168,237,168,247,169, + 12,169, 84,169,109,169,120,169,145,169,177,169,217,226,229,238, + 231,225,236,105,128, 9,184,227,245,244,101,129, 1, 91,169, 0, + 228,239,244,225,227,227,229,238,116,128, 30,101,100, 5,169, 24, + 169, 33,169, 39,169, 53,169, 69,225,242,225,226,233, 99,128, 6, + 53,229,246, 97,128, 9, 56,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,186,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,254,187,237,229,228,233,225,236,225,242,225,226,233, + 99,128,254,188,231,117, 2,169, 91,169,100,234,225,242,225,244, + 105,128, 10,184,242,237,245,235,232,105,128, 10, 56,232,233,242, + 225,231,225,238, 97,128, 48, 85,235,225,244,225,235,225,238, 97, + 129, 48,181,169,133,232,225,236,230,247,233,228,244,104,128,255, + 123,236,236,225,236,236,225,232,239,245,225,236,225,249,232,229, + 247,225,243,225,236,236,225,237,225,242,225,226,233, 99,128,253, + 250,237,229,235,104,130, 5,225,169,188,169,208,228,225,231,229, + 243,104,129,251, 65,169,199,232,229,226,242,229,119,128,251, 65, + 232,229,226,242,229,119,128, 5,225,242, 97, 5,169,230,170, 48, + 170, 56,170,106,170,114, 97, 5,169,242,169,250,170, 2,170, 33, + 170, 41,225,244,232,225,105,128, 14, 50,229,244,232,225,105,128, + 14, 65,233,237,225,233,109, 2,170, 12,170, 23,225,236,225,233, + 244,232,225,105,128, 14, 68,245,225,238,244,232,225,105,128, 14, + 67,237,244,232,225,105,128, 14, 51,244,232,225,105,128, 14, 48, + 229,244,232,225,105,128, 14, 64,105, 3,170, 64,170, 88,170, 99, + 105, 2,170, 70,170, 81,236,229,230,244,244,232,225,105,128,248, + 134,244,232,225,105,128, 14, 53,236,229,230,244,244,232,225,105, + 128,248,133,244,232,225,105,128, 14, 52,239,244,232,225,105,128, + 14, 66,117, 3,170,122,170,172,170,179,101, 3,170,130,170,154, + 170,165,101, 2,170,136,170,147,236,229,230,244,244,232,225,105, + 128,248,136,244,232,225,105,128, 14, 55,236,229,230,244,244,232, + 225,105,128,248,135,244,232,225,105,128, 14, 54,244,232,225,105, + 128, 14, 56,245,244,232,225,105,128, 14, 57,226,239,240,239,237, + 239,230,111,128, 49, 25, 99, 5,170,210,170,231,170,240,171, 33, + 171, 55,225,242,239,110,129, 1, 97,170,219,228,239,244,225,227, + 227,229,238,116,128, 30,103,229,228,233,236,236, 97,128, 1, 95, + 232,247, 97,131, 2, 89,170,252,171, 7,171, 26,227,249,242,233, + 236,236,233, 99,128, 4,217,228,233,229,242,229,243,233,243,227, + 249,242,233,236,236,233, 99,128, 4,219,232,239,239,107,128, 2, + 90,233,242, 99, 2,171, 41,171, 46,236,101,128, 36,226,245,237, + 230,236,229,120,128, 1, 93,239,237,237,225,225,227,227,229,238, + 116,128, 2, 25,228,239,116, 2,171, 76,171, 85,225,227,227,229, + 238,116,128, 30, 97,226,229,236,239,119,129, 30, 99,171, 95,228, + 239,244,225,227,227,229,238,116,128, 30,105,101, 9,171,127,171, + 143,171,178,171,243,172, 90,172,117,172,142,172,223,172,250,225, + 231,245,236,236,226,229,236,239,247,227,237, 98,128, 3, 60, 99, + 2,171,149,171,171,239,238,100,129, 32, 51,171,157,244,239,238, + 229,227,232,233,238,229,243,101,128, 2,202,244,233,239,110,128, + 0,167,229,110, 4,171,189,171,198,171,212,171,228,225,242,225, + 226,233, 99,128, 6, 51,230,233,238,225,236,225,242,225,226,233, + 99,128,254,178,233,238,233,244,233,225,236,225,242,225,226,233, + 99,128,254,179,237,229,228,233,225,236,225,242,225,226,233, 99, + 128,254,180,231,239,108,135, 5,182,172, 7,172, 21,172, 26,172, + 35,172, 50,172, 66,172, 77, 49, 2,172, 13,172, 17, 51,128, 5, + 182,102,128, 5,182,178, 99,128, 5,182,232,229,226,242,229,119, + 128, 5,182,238,225,242,242,239,247,232,229,226,242,229,119,128, + 5,182,241,245,225,242,244,229,242,232,229,226,242,229,119,128, + 5,182,244,225,232,229,226,242,229,119,128, 5,146,247,233,228, + 229,232,229,226,242,229,119,128, 5,182,104, 2,172, 96,172,107, + 225,242,237,229,238,233,225,110,128, 5,125,233,242,225,231,225, + 238, 97,128, 48, 91,235,225,244,225,235,225,238, 97,129, 48,187, + 172,130,232,225,236,230,247,233,228,244,104,128,255,126,237,105, + 2,172,149,172,192,227,239,236,239,110,131, 0, 59,172,163,172, + 172,172,184,225,242,225,226,233, 99,128, 6, 27,237,239,238,239, + 243,240,225,227,101,128,255, 27,243,237,225,236,108,128,254, 84, + 246,239,233,227,229,228,237,225,242,235,235,225,238, 97,129, 48, + 156,172,211,232,225,236,230,247,233,228,244,104,128,255,159,238, + 116, 2,172,230,172,240,233,243,241,245,225,242,101,128, 51, 34, + 239,243,241,245,225,242,101,128, 51, 35,246,229,110,142, 0, 55, + 173, 28,173, 37,173, 47,173, 77,173, 84,173, 94,173,119,173,146, + 173,180,173,192,173,203,173,236,173,244,173,255,225,242,225,226, + 233, 99,128, 6,103,226,229,238,231,225,236,105,128, 9,237,227, + 233,242,227,236,101,129, 36,102,173, 58,233,238,246,229,242,243, + 229,243,225,238,243,243,229,242,233,102,128, 39,144,228,229,246, + 97,128, 9,109,229,233,231,232,244,232,115,128, 33, 94,231,117, + 2,173,101,173,110,234,225,242,225,244,105,128, 10,237,242,237, + 245,235,232,105,128, 10,109,232, 97, 2,173,126,173,137,227,235, + 225,242,225,226,233, 99,128, 6,103,238,231,250,232,239,117,128, + 48, 39,105, 2,173,152,173,170,228,229,239,231,242,225,240,232, + 233,227,240,225,242,229,110,128, 50, 38,238,230,229,242,233,239, + 114,128, 32,135,237,239,238,239,243,240,225,227,101,128,255, 23, + 239,236,228,243,244,249,236,101,128,247, 55,112, 2,173,209,173, + 216,225,242,229,110,128, 36,122,229,114, 2,173,223,173,229,233, + 239,100,128, 36,142,243,233,225,110,128, 6,247,242,239,237,225, + 110,128, 33,118,243,245,240,229,242,233,239,114,128, 32,119,116, + 2,174, 5,174, 43,229,229,110, 2,174, 13,174, 22,227,233,242, + 227,236,101,128, 36,112,112, 2,174, 28,174, 35,225,242,229,110, + 128, 36,132,229,242,233,239,100,128, 36,152,232,225,105,128, 14, + 87,230,244,232,249,240,232,229,110,128, 0,173,104, 7,174, 76, + 175, 50,175, 61,175, 75,176, 20,176, 33,176,197, 97, 6,174, 90, + 174,101,174,111,174,122,175, 9,175, 34,225,242,237,229,238,233, + 225,110,128, 5,119,226,229,238,231,225,236,105,128, 9,182,227, + 249,242,233,236,236,233, 99,128, 4, 72,100, 2,174,128,174,224, + 228, 97, 4,174,139,174,148,174,179,174,193,225,242,225,226,233, + 99,128, 6, 81,228,225,237,237, 97, 2,174,158,174,167,225,242, + 225,226,233, 99,128,252, 97,244,225,238,225,242,225,226,233, 99, + 128,252, 94,230,225,244,232,225,225,242,225,226,233, 99,128,252, + 96,235,225,243,242, 97, 2,174,203,174,212,225,242,225,226,233, + 99,128,252, 98,244,225,238,225,242,225,226,233, 99,128,252, 95, + 101,132, 37,146,174,236,174,243,174,251,175, 4,228,225,242,107, + 128, 37,147,236,233,231,232,116,128, 37,145,237,229,228,233,245, + 109,128, 37,146,246, 97,128, 9, 54,231,117, 2,175, 16,175, 25, + 234,225,242,225,244,105,128, 10,182,242,237,245,235,232,105,128, + 10, 54,236,243,232,229,236,229,244,232,229,226,242,229,119,128, + 5,147,226,239,240,239,237,239,230,111,128, 49, 21,227,232,225, + 227,249,242,233,236,236,233, 99,128, 4, 73,101, 4,175, 85,175, + 150,175,160,175,177,229,110, 4,175, 96,175,105,175,119,175,135, + 225,242,225,226,233, 99,128, 6, 52,230,233,238,225,236,225,242, + 225,226,233, 99,128,254,182,233,238,233,244,233,225,236,225,242, + 225,226,233, 99,128,254,183,237,229,228,233,225,236,225,242,225, + 226,233, 99,128,254,184,233,227,239,240,244,233, 99,128, 3,227, + 241,229,108,129, 32,170,175,168,232,229,226,242,229,119,128, 32, + 170,246, 97,134, 5,176,175,194,175,209,175,223,175,232,175,247, + 176, 7, 49, 2,175,200,175,205,177, 53,128, 5,176, 53,128, 5, + 176, 50, 2,175,215,175,219, 50,128, 5,176,101,128, 5,176,232, + 229,226,242,229,119,128, 5,176,238,225,242,242,239,247,232,229, + 226,242,229,119,128, 5,176,241,245,225,242,244,229,242,232,229, + 226,242,229,119,128, 5,176,247,233,228,229,232,229,226,242,229, + 119,128, 5,176,232,225,227,249,242,233,236,236,233, 99,128, 4, + 187,105, 2,176, 39,176, 50,237,225,227,239,240,244,233, 99,128, + 3,237,110,131, 5,233,176, 60,176,143,176,152,100, 2,176, 66, + 176,132,225,231,229,243,104,130,251, 73,176, 78,176, 87,232,229, + 226,242,229,119,128,251, 73,115, 2,176, 93,176,113,232,233,238, + 228,239,116,129,251, 44,176,104,232,229,226,242,229,119,128,251, + 44,233,238,228,239,116,129,251, 45,176,123,232,229,226,242,229, + 119,128,251, 45,239,244,232,229,226,242,229,119,128, 5,193,232, + 229,226,242,229,119,128, 5,233,115, 2,176,158,176,178,232,233, + 238,228,239,116,129,251, 42,176,169,232,229,226,242,229,119,128, + 251, 42,233,238,228,239,116,129,251, 43,176,188,232,229,226,242, + 229,119,128,251, 43,239,239,107,128, 2,130,105, 8,176,221,177, + 9,177, 20,177, 45,177, 75,177, 83,177, 96,178, 11,231,237, 97, + 131, 3,195,176,233,176,237,176,245, 49,128, 3,194,230,233,238, + 225,108,128, 3,194,236,245,238,225,244,229,243,249,237,226,239, + 236,231,242,229,229,107,128, 3,242,232,233,242,225,231,225,238, + 97,128, 48, 87,235,225,244,225,235,225,238, 97,129, 48,183,177, + 33,232,225,236,230,247,233,228,244,104,128,255,124,236,245,113, + 2,177, 53,177, 62,232,229,226,242,229,119,128, 5,189,236,229, + 230,244,232,229,226,242,229,119,128, 5,189,237,233,236,225,114, + 128, 34, 60,238,228,239,244,232,229,226,242,229,119,128, 5,194, + 239,115, 6,177,111,177,146,177,178,177,206,177,220,177,252, 97, + 2,177,117,177,132,227,233,242,227,236,229,235,239,242,229,225, + 110,128, 50,116,240,225,242,229,238,235,239,242,229,225,110,128, + 50, 20,227,105, 2,177,153,177,165,229,245,227,235,239,242,229, + 225,110,128, 49,126,242,227,236,229,235,239,242,229,225,110,128, + 50,102,107, 2,177,184,177,198,233,249,229,239,235,235,239,242, + 229,225,110,128, 49,122,239,242,229,225,110,128, 49, 69,238,233, + 229,245,238,235,239,242,229,225,110,128, 49,123,112, 2,177,226, + 177,239,225,242,229,238,235,239,242,229,225,110,128, 50, 6,233, + 229,245,240,235,239,242,229,225,110,128, 49,125,244,233,235,229, + 245,244,235,239,242,229,225,110,128, 49,124,120,141, 0, 54,178, + 41,178, 50,178, 60,178, 90,178, 97,178,122,178,149,178,183,178, + 195,178,206,178,239,178,247,179, 2,225,242,225,226,233, 99,128, + 6,102,226,229,238,231,225,236,105,128, 9,236,227,233,242,227, + 236,101,129, 36,101,178, 71,233,238,246,229,242,243,229,243,225, + 238,243,243,229,242,233,102,128, 39,143,228,229,246, 97,128, 9, + 108,231,117, 2,178,104,178,113,234,225,242,225,244,105,128, 10, + 236,242,237,245,235,232,105,128, 10,108,232, 97, 2,178,129,178, + 140,227,235,225,242,225,226,233, 99,128, 6,102,238,231,250,232, + 239,117,128, 48, 38,105, 2,178,155,178,173,228,229,239,231,242, + 225,240,232,233,227,240,225,242,229,110,128, 50, 37,238,230,229, + 242,233,239,114,128, 32,134,237,239,238,239,243,240,225,227,101, + 128,255, 22,239,236,228,243,244,249,236,101,128,247, 54,112, 2, + 178,212,178,219,225,242,229,110,128, 36,121,229,114, 2,178,226, + 178,232,233,239,100,128, 36,141,243,233,225,110,128, 6,246,242, + 239,237,225,110,128, 33,117,243,245,240,229,242,233,239,114,128, + 32,118,116, 2,179, 8,179, 79,229,229,110, 2,179, 16,179, 58, + 99, 2,179, 22,179, 30,233,242,227,236,101,128, 36,111,245,242, + 242,229,238,227,249,228,229,238,239,237,233,238,225,244,239,242, + 226,229,238,231,225,236,105,128, 9,249,112, 2,179, 64,179, 71, + 225,242,229,110,128, 36,131,229,242,233,239,100,128, 36,151,232, + 225,105,128, 14, 86,108, 2,179, 91,179,111,225,243,104,129, 0, + 47,179, 99,237,239,238,239,243,240,225,227,101,128,255, 15,239, + 238,103,129, 1,127,179,119,228,239,244,225,227,227,229,238,116, + 128, 30,155,109, 2,179,137,179,147,233,236,229,230,225,227,101, + 128, 38, 58,239,238,239,243,240,225,227,101,128,255, 83,111, 6, + 179,172,179,222,179,233,180, 2,180, 47,180, 58,102, 2,179,178, + 179,192,240,225,243,245,241,232,229,226,242,229,119,128, 5,195, + 116, 2,179,198,179,207,232,249,240,232,229,110,128, 0,173,243, + 233,231,238,227,249,242,233,236,236,233, 99,128, 4, 76,232,233, + 242,225,231,225,238, 97,128, 48, 93,235,225,244,225,235,225,238, + 97,129, 48,189,179,246,232,225,236,230,247,233,228,244,104,128, + 255,127,236,233,228,245,115, 2,180, 12,180, 29,236,239,238,231, + 239,246,229,242,236,225,249,227,237, 98,128, 3, 56,243,232,239, + 242,244,239,246,229,242,236,225,249,227,237, 98,128, 3, 55,242, + 245,243,233,244,232,225,105,128, 14, 41,115, 3,180, 66,180, 76, + 180, 84,225,236,225,244,232,225,105,128, 14, 40,239,244,232,225, + 105,128, 14, 11,245,225,244,232,225,105,128, 14, 42,240, 97, 3, + 180,102,180,122,180,154,227,101,129, 0, 32,180,109,232,225,227, + 235,225,242,225,226,233, 99,128, 0, 32,228,101,129, 38, 96,180, + 129,243,245,233,116, 2,180,138,180,146,226,236,225,227,107,128, + 38, 96,247,232,233,244,101,128, 38,100,242,229,110,128, 36,174, + 241,245,225,242,101, 11,180,188,180,199,180,213,180,238,180,255, + 181, 25,181, 40,181, 73,181,100,181,156,181,171,226,229,236,239, + 247,227,237, 98,128, 3, 59, 99, 2,180,205,180,209, 99,128, 51, + 196,109,128, 51,157,228,233,225,231,239,238,225,236,227,242,239, + 243,243,232,225,244,227,232,230,233,236,108,128, 37,169,232,239, + 242,233,250,239,238,244,225,236,230,233,236,108,128, 37,164,107, + 2,181, 5,181, 9,103,128, 51,143,109,129, 51,158,181, 15,227, + 225,240,233,244,225,108,128, 51,206,108, 2,181, 31,181, 35,110, + 128, 51,209,239,103,128, 51,210,109, 4,181, 50,181, 54,181, 59, + 181, 63,103,128, 51,142,233,108,128, 51,213,109,128, 51,156,243, + 241,245,225,242,229,100,128, 51,161,239,242,244,232,239,231,239, + 238,225,236,227,242,239,243,243,232,225,244,227,232,230,233,236, + 108,128, 37,166,245,240,240,229,114, 2,181,110,181,133,236,229, + 230,244,244,239,236,239,247,229,242,242,233,231,232,244,230,233, + 236,108,128, 37,167,242,233,231,232,244,244,239,236,239,247,229, + 242,236,229,230,244,230,233,236,108,128, 37,168,246,229,242,244, + 233,227,225,236,230,233,236,108,128, 37,165,247,232,233,244,229, + 247,233,244,232,243,237,225,236,236,226,236,225,227,107,128, 37, + 163,242,243,241,245,225,242,101,128, 51,219,115, 2,181,209,182, + 123, 97, 4,181,219,181,229,181,236,181,247,226,229,238,231,225, + 236,105,128, 9,183,228,229,246, 97,128, 9, 55,231,245,234,225, + 242,225,244,105,128, 10,183,238,103, 8,182, 10,182, 24,182, 38, + 182, 52,182, 67,182, 81,182, 95,182,108,227,233,229,245,227,235, + 239,242,229,225,110,128, 49, 73,232,233,229,245,232,235,239,242, + 229,225,110,128, 49,133,233,229,245,238,231,235,239,242,229,225, + 110,128, 49,128,235,233,249,229,239,235,235,239,242,229,225,110, + 128, 49, 50,238,233,229,245,238,235,239,242,229,225,110,128, 49, + 101,240,233,229,245,240,235,239,242,229,225,110,128, 49, 67,243, + 233,239,243,235,239,242,229,225,110,128, 49, 70,244,233,235,229, + 245,244,235,239,242,229,225,110,128, 49, 56,245,240,229,242,233, + 239,114,128,246,242,116, 2,182,139,182,162,229,242,236,233,238, + 103,129, 0,163,182,150,237,239,238,239,243,240,225,227,101,128, + 255,225,242,239,235,101, 2,182,171,182,188,236,239,238,231,239, + 246,229,242,236,225,249,227,237, 98,128, 3, 54,243,232,239,242, + 244,239,246,229,242,236,225,249,227,237, 98,128, 3, 53,117, 7, + 182,222,182,254,183, 20,183, 31,183, 72,183, 82,183, 86,226,243, + 229,116,130, 34,130,182,233,182,244,238,239,244,229,241,245,225, + 108,128, 34,138,239,242,229,241,245,225,108,128, 34,134, 99, 2, + 183, 4,183, 12,227,229,229,228,115,128, 34,123,232,244,232,225, + 116,128, 34, 11,232,233,242,225,231,225,238, 97,128, 48, 89,107, + 2,183, 37,183, 61,225,244,225,235,225,238, 97,129, 48,185,183, + 49,232,225,236,230,247,233,228,244,104,128,255,125,245,238,225, + 242,225,226,233, 99,128, 6, 82,237,237,225,244,233,239,110,128, + 34, 17,110,128, 38, 60,240,229,242,243,229,116,130, 34,131,183, + 99,183,110,238,239,244,229,241,245,225,108,128, 34,139,239,242, + 229,241,245,225,108,128, 34,135,246,243,241,245,225,242,101,128, + 51,220,249,239,245,247,225,229,242,225,243,241,245,225,242,101, + 128, 51,124,116,144, 0,116,183,183,184,192,184,213,185,100,185, + 140,187,188,191, 70,192,145,192,157,192,169,193,202,193,227,194, + 57,194,237,195,165,195,255, 97, 10,183,205,183,215,183,236,183, + 243,184, 12,184, 90,184,107,184,132,184,146,184,150,226,229,238, + 231,225,236,105,128, 9,164,227,107, 2,183,222,183,229,228,239, + 247,110,128, 34,164,236,229,230,116,128, 34,163,228,229,246, 97, + 128, 9, 36,231,117, 2,183,250,184, 3,234,225,242,225,244,105, + 128, 10,164,242,237,245,235,232,105,128, 10, 36,104, 4,184, 22, + 184, 31,184, 45,184, 75,225,242,225,226,233, 99,128, 6, 55,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,194,105, 2,184, + 51,184, 66,238,233,244,233,225,236,225,242,225,226,233, 99,128, + 254,195,242,225,231,225,238, 97,128, 48, 95,237,229,228,233,225, + 236,225,242,225,226,233, 99,128,254,196,233,243,249,239,245,229, + 242,225,243,241,245,225,242,101,128, 51,125,235,225,244,225,235, + 225,238, 97,129, 48,191,184,120,232,225,236,230,247,233,228,244, + 104,128,255,128,244,247,229,229,236,225,242,225,226,233, 99,128, + 6, 64,117,128, 3,196,118,130, 5,234,184,158,184,183,228,225, + 231,229,115,129,251, 74,184,168,104,129,251, 74,184,174,232,229, + 226,242,229,119,128,251, 74,232,229,226,242,229,119,128, 5,234, + 98, 2,184,198,184,203,225,114,128, 1,103,239,240,239,237,239, + 230,111,128, 49, 10, 99, 6,184,227,184,234,184,241,184,250,185, + 60,185, 87,225,242,239,110,128, 1,101,227,245,242,108,128, 2, + 168,229,228,233,236,236, 97,128, 1, 99,232,229,104, 4,185, 6, + 185, 15,185, 29,185, 45,225,242,225,226,233, 99,128, 6,134,230, + 233,238,225,236,225,242,225,226,233, 99,128,251,123,233,238,233, + 244,233,225,236,225,242,225,226,233, 99,128,251,124,237,229,228, + 233,225,236,225,242,225,226,233, 99,128,251,125,233,242, 99, 2, + 185, 68,185, 73,236,101,128, 36,227,245,237,230,236,229,248,226, + 229,236,239,119,128, 30,113,239,237,237,225,225,227,227,229,238, + 116,128, 1, 99,100, 2,185,106,185,116,233,229,242,229,243,233, + 115,128, 30,151,239,116, 2,185,123,185,132,225,227,227,229,238, + 116,128, 30,107,226,229,236,239,119,128, 30,109,101, 9,185,160, + 185,171,185,191,186,201,186,226,187, 34,187,101,187,106,187,158, + 227,249,242,233,236,236,233, 99,128, 4, 66,228,229,243,227,229, + 238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,173,104, + 7,185,207,185,216,185,230,186, 14,186, 44,186, 85,186,183,225, + 242,225,226,233, 99,128, 6, 42,230,233,238,225,236,225,242,225, + 226,233, 99,128,254,150,232,225,232,105, 2,185,239,185,254,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,252,162,243,239, + 236,225,244,229,228,225,242,225,226,233, 99,128,252, 12,105, 2, + 186, 20,186, 35,238,233,244,233,225,236,225,242,225,226,233, 99, + 128,254,151,242,225,231,225,238, 97,128, 48,102,234,229,229,237, + 105, 2,186, 54,186, 69,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,252,161,243,239,236,225,244,229,228,225,242,225,226, + 233, 99,128,252, 11,109, 2,186, 91,186,125,225,242,226,245,244, + 97, 2,186,102,186,111,225,242,225,226,233, 99,128, 6, 41,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,148,101, 2,186, + 131,186,144,228,233,225,236,225,242,225,226,233, 99,128,254,152, + 229,237,105, 2,186,152,186,167,238,233,244,233,225,236,225,242, + 225,226,233, 99,128,252,164,243,239,236,225,244,229,228,225,242, + 225,226,233, 99,128,252, 14,238,239,239,238,230,233,238,225,236, + 225,242,225,226,233, 99,128,252,115,235,225,244,225,235,225,238, + 97,129, 48,198,186,214,232,225,236,230,247,233,228,244,104,128, + 255,131,108, 2,186,232,186,251,229,240,232,239,238,101,129, 33, + 33,186,243,226,236,225,227,107,128, 38, 14,233,243,232, 97, 2, + 187, 4,187, 19,231,229,228,239,236,225,232,229,226,242,229,119, + 128, 5,160,241,229,244,225,238,225,232,229,226,242,229,119,128, + 5,169,110, 4,187, 44,187, 53,187, 72,187, 93,227,233,242,227, + 236,101,128, 36,105,233,228,229,239,231,242,225,240,232,233,227, + 240,225,242,229,110,128, 50, 41,112, 2,187, 78,187, 85,225,242, + 229,110,128, 36,125,229,242,233,239,100,128, 36,145,242,239,237, + 225,110,128, 33,121,243,104,128, 2,167,116,131, 5,216,187,116, + 187,136,187,145,228,225,231,229,243,104,129,251, 56,187,127,232, + 229,226,242,229,119,128,251, 56,232,229,226,242,229,119,128, 5, + 216,243,229,227,249,242,233,236,236,233, 99,128, 4,181,246,233, + 114, 2,187,166,187,175,232,229,226,242,229,119,128, 5,155,236, + 229,230,244,232,229,226,242,229,119,128, 5,155,104, 6,187,202, + 188, 98,188,220,189, 96,190, 3,191, 60, 97, 5,187,214,187,224, + 187,231,188, 0,188, 29,226,229,238,231,225,236,105,128, 9,165, + 228,229,246, 97,128, 9, 37,231,117, 2,187,238,187,247,234,225, + 242,225,244,105,128, 10,165,242,237,245,235,232,105,128, 10, 37, + 108, 2,188, 6,188, 15,225,242,225,226,233, 99,128, 6, 48,230, + 233,238,225,236,225,242,225,226,233, 99,128,254,172,238,244,232, + 225,235,232,225,116, 3,188, 44,188, 75,188, 82,236,239,119, 2, + 188, 52,188, 63,236,229,230,244,244,232,225,105,128,248,152,242, + 233,231,232,244,244,232,225,105,128,248,151,244,232,225,105,128, + 14, 76,245,240,240,229,242,236,229,230,244,244,232,225,105,128, + 248,150,101, 3,188,106,188,170,188,193,104, 4,188,116,188,125, + 188,139,188,155,225,242,225,226,233, 99,128, 6, 43,230,233,238, + 225,236,225,242,225,226,233, 99,128,254,154,233,238,233,244,233, + 225,236,225,242,225,226,233, 99,128,254,155,237,229,228,233,225, + 236,225,242,225,226,233, 99,128,254,156,242,101, 2,188,177,188, + 186,229,248,233,243,244,115,128, 34, 3,230,239,242,101,128, 34, + 52,244, 97,130, 3,184,188,202,188,206, 49,128, 3,209,243,249, + 237,226,239,236,231,242,229,229,107,128, 3,209,105, 2,188,226, + 189, 56,229,245,244,104, 4,188,239,189, 18,189, 33,189, 42, 97, + 2,188,245,189, 4,227,233,242,227,236,229,235,239,242,229,225, + 110,128, 50,121,240,225,242,229,238,235,239,242,229,225,110,128, + 50, 25,227,233,242,227,236,229,235,239,242,229,225,110,128, 50, + 107,235,239,242,229,225,110,128, 49, 76,240,225,242,229,238,235, + 239,242,229,225,110,128, 50, 11,242,244,229,229,110, 2,189, 66, + 189, 75,227,233,242,227,236,101,128, 36,108,112, 2,189, 81,189, + 88,225,242,229,110,128, 36,128,229,242,233,239,100,128, 36,148, + 111, 6,189,110,189,127,189,132,189,146,189,151,189,204,238,225, + 238,231,237,239,238,244,232,239,244,232,225,105,128, 14, 17,239, + 107,128, 1,173,240,232,245,244,232,225,239,244,232,225,105,128, + 14, 18,242,110,128, 0,254,244,104, 3,189,160,189,184,189,194, + 97, 2,189,166,189,176,232,225,238,244,232,225,105,128, 14, 23, + 238,244,232,225,105,128, 14, 16,239,238,231,244,232,225,105,128, + 14, 24,245,238,231,244,232,225,105,128, 14, 22,245,243,225,238, + 100, 2,189,214,189,225,227,249,242,233,236,236,233, 99,128, 4, + 130,243,243,229,240,225,242,225,244,239,114, 2,189,240,189,249, + 225,242,225,226,233, 99,128, 6,108,240,229,242,243,233,225,110, + 128, 6,108,242,229,101,144, 0, 51,190, 41,190, 50,190, 60,190, + 90,190, 97,190,107,190,132,190,159,190,193,190,205,190,224,190, + 235,191, 12,191, 34,191, 42,191, 53,225,242,225,226,233, 99,128, + 6, 99,226,229,238,231,225,236,105,128, 9,233,227,233,242,227, + 236,101,129, 36, 98,190, 71,233,238,246,229,242,243,229,243,225, + 238,243,243,229,242,233,102,128, 39,140,228,229,246, 97,128, 9, + 105,229,233,231,232,244,232,115,128, 33, 92,231,117, 2,190,114, + 190,123,234,225,242,225,244,105,128, 10,233,242,237,245,235,232, + 105,128, 10,105,232, 97, 2,190,139,190,150,227,235,225,242,225, + 226,233, 99,128, 6, 99,238,231,250,232,239,117,128, 48, 35,105, + 2,190,165,190,183,228,229,239,231,242,225,240,232,233,227,240, + 225,242,229,110,128, 50, 34,238,230,229,242,233,239,114,128, 32, + 131,237,239,238,239,243,240,225,227,101,128,255, 19,238,245,237, + 229,242,225,244,239,242,226,229,238,231,225,236,105,128, 9,246, + 239,236,228,243,244,249,236,101,128,247, 51,112, 2,190,241,190, + 248,225,242,229,110,128, 36,118,229,114, 2,190,255,191, 5,233, + 239,100,128, 36,138,243,233,225,110,128, 6,243,241,245,225,242, + 244,229,242,115,129, 0,190,191, 25,229,237,228,225,243,104,128, + 246,222,242,239,237,225,110,128, 33,114,243,245,240,229,242,233, + 239,114,128, 0,179,244,232,225,105,128, 14, 83,250,243,241,245, + 225,242,101,128, 51,148,105, 7,191, 86,191, 97,191,212,192, 54, + 192, 66,192,115,192,132,232,233,242,225,231,225,238, 97,128, 48, + 97,107, 2,191,103,191,127,225,244,225,235,225,238, 97,129, 48, + 193,191,115,232,225,236,230,247,233,228,244,104,128,255,129,229, + 245,116, 4,191,139,191,174,191,189,191,198, 97, 2,191,145,191, + 160,227,233,242,227,236,229,235,239,242,229,225,110,128, 50,112, + 240,225,242,229,238,235,239,242,229,225,110,128, 50, 16,227,233, + 242,227,236,229,235,239,242,229,225,110,128, 50, 98,235,239,242, + 229,225,110,128, 49, 55,240,225,242,229,238,235,239,242,229,225, + 110,128, 50, 2,236,228,101,133, 2,220,191,228,191,239,192, 0, + 192, 12,192, 40,226,229,236,239,247,227,237, 98,128, 3, 48, 99, + 2,191,245,191,250,237, 98,128, 3, 3,239,237, 98,128, 3, 3, + 228,239,245,226,236,229,227,237, 98,128, 3, 96,111, 2,192, 18, + 192, 28,240,229,242,225,244,239,114,128, 34, 60,246,229,242,236, + 225,249,227,237, 98,128, 3, 52,246,229,242,244,233,227,225,236, + 227,237, 98,128, 3, 62,237,229,243,227,233,242,227,236,101,128, + 34,151,112, 2,192, 72,192,102,229,232, 97, 2,192, 80,192, 89, + 232,229,226,242,229,119,128, 5,150,236,229,230,244,232,229,226, + 242,229,119,128, 5,150,240,233,231,245,242,237,245,235,232,105, + 128, 10,112,244,236,239,227,249,242,233,236,236,233,227,227,237, + 98,128, 4,131,247,238,225,242,237,229,238,233,225,110,128, 5, + 127,236,233,238,229,226,229,236,239,119,128, 30,111,237,239,238, + 239,243,240,225,227,101,128,255, 84,111, 7,192,185,192,196,192, + 207,192,232,193, 96,193,108,193,192,225,242,237,229,238,233,225, + 110,128, 5,105,232,233,242,225,231,225,238, 97,128, 48,104,235, + 225,244,225,235,225,238, 97,129, 48,200,192,220,232,225,236,230, + 247,233,228,244,104,128,255,132,110, 3,192,240,193, 82,193, 87, + 101, 4,192,250,193, 63,193, 70,193, 76,226,225,114, 4,193, 6, + 193, 35,193, 45,193, 54,229,248,244,242, 97, 2,193, 16,193, 26, + 232,233,231,232,237,239,100,128, 2,229,236,239,247,237,239,100, + 128, 2,233,232,233,231,232,237,239,100,128, 2,230,236,239,247, + 237,239,100,128, 2,232,237,233,228,237,239,100,128, 2,231,230, + 233,246,101,128, 1,189,243,233,120,128, 1,133,244,247,111,128, + 1,168,239,115,128, 3,132,243,241,245,225,242,101,128, 51, 39, + 240,225,244,225,235,244,232,225,105,128, 14, 15,242,244,239,233, + 243,229,243,232,229,236,236,226,242,225,227,235,229,116, 2,193, + 131,193,161,236,229,230,116,130, 48, 20,193,142,193,150,243,237, + 225,236,108,128,254, 93,246,229,242,244,233,227,225,108,128,254, + 57,242,233,231,232,116,130, 48, 21,193,173,193,181,243,237,225, + 236,108,128,254, 94,246,229,242,244,233,227,225,108,128,254, 58, + 244,225,239,244,232,225,105,128, 14, 21,240, 97, 2,193,209,193, + 221,236,225,244,225,236,232,239,239,107,128, 1,171,242,229,110, + 128, 36,175,114, 3,193,235,194, 10,194, 25,225,228,229,237,225, + 242,107,129, 33, 34,193,247,115, 2,193,253,194, 3,225,238,115, + 128,248,234,229,242,233,102,128,246,219,229,244,242,239,230,236, + 229,248,232,239,239,107,128, 2,136,233,225,103, 4,194, 37,194, + 42,194, 47,194, 52,228,110,128, 37,188,236,102,128, 37,196,242, + 116,128, 37,186,245,112,128, 37,178,115,132, 2,166,194, 69,194, + 108,194,214,194,227,225,228,105,130, 5,230,194, 79,194, 99,228, + 225,231,229,243,104,129,251, 70,194, 90,232,229,226,242,229,119, + 128,251, 70,232,229,226,242,229,119,128, 5,230,101, 2,194,114, + 194,125,227,249,242,233,236,236,233, 99,128, 4, 70,242,101,134, + 5,181,194,142,194,156,194,161,194,170,194,185,194,201, 49, 2, + 194,148,194,152, 50,128, 5,181,101,128, 5,181,178, 98,128, 5, + 181,232,229,226,242,229,119,128, 5,181,238,225,242,242,239,247, + 232,229,226,242,229,119,128, 5,181,241,245,225,242,244,229,242, + 232,229,226,242,229,119,128, 5,181,247,233,228,229,232,229,226, + 242,229,119,128, 5,181,232,229,227,249,242,233,236,236,233, 99, + 128, 4, 91,245,240,229,242,233,239,114,128,246,243,116, 4,194, + 247,195, 41,195,106,195,157, 97, 3,194,255,195, 9,195, 16,226, + 229,238,231,225,236,105,128, 9,159,228,229,246, 97,128, 9, 31, + 231,117, 2,195, 23,195, 32,234,225,242,225,244,105,128, 10,159, + 242,237,245,235,232,105,128, 10, 31,229,104, 4,195, 52,195, 61, + 195, 75,195, 91,225,242,225,226,233, 99,128, 6,121,230,233,238, + 225,236,225,242,225,226,233, 99,128,251,103,233,238,233,244,233, + 225,236,225,242,225,226,233, 99,128,251,104,237,229,228,233,225, + 236,225,242,225,226,233, 99,128,251,105,232, 97, 3,195,115,195, + 125,195,132,226,229,238,231,225,236,105,128, 9,160,228,229,246, + 97,128, 9, 32,231,117, 2,195,139,195,148,234,225,242,225,244, + 105,128, 10,160,242,237,245,235,232,105,128, 10, 32,245,242,238, + 229,100,128, 2,135,117, 3,195,173,195,184,195,209,232,233,242, + 225,231,225,238, 97,128, 48,100,235,225,244,225,235,225,238, 97, + 129, 48,196,195,197,232,225,236,230,247,233,228,244,104,128,255, + 130,243,237,225,236,108, 2,195,219,195,230,232,233,242,225,231, + 225,238, 97,128, 48, 99,235,225,244,225,235,225,238, 97,129, 48, + 195,195,243,232,225,236,230,247,233,228,244,104,128,255,111,119, + 2,196, 5,196,110,101, 2,196, 11,196, 59,236,246,101, 3,196, + 21,196, 30,196, 51,227,233,242,227,236,101,128, 36,107,112, 2, + 196, 36,196, 43,225,242,229,110,128, 36,127,229,242,233,239,100, + 128, 36,147,242,239,237,225,110,128, 33,123,238,244,121, 3,196, + 69,196, 78,196, 89,227,233,242,227,236,101,128, 36,115,232,225, + 238,231,250,232,239,117,128, 83, 68,112, 2,196, 95,196,102,225, + 242,229,110,128, 36,135,229,242,233,239,100,128, 36,155,111,142, + 0, 50,196,142,196,151,196,161,196,191,196,243,197, 12,197, 39, + 197, 73,197, 85,197,104,197,115,197,148,197,156,197,180,225,242, + 225,226,233, 99,128, 6, 98,226,229,238,231,225,236,105,128, 9, + 232,227,233,242,227,236,101,129, 36, 97,196,172,233,238,246,229, + 242,243,229,243,225,238,243,243,229,242,233,102,128, 39,139,100, + 2,196,197,196,203,229,246, 97,128, 9,104,239,116, 2,196,210, + 196,221,229,238,236,229,225,228,229,114,128, 32, 37,236,229,225, + 228,229,114,129, 32, 37,196,232,246,229,242,244,233,227,225,108, + 128,254, 48,231,117, 2,196,250,197, 3,234,225,242,225,244,105, + 128, 10,232,242,237,245,235,232,105,128, 10,104,232, 97, 2,197, + 19,197, 30,227,235,225,242,225,226,233, 99,128, 6, 98,238,231, + 250,232,239,117,128, 48, 34,105, 2,197, 45,197, 63,228,229,239, + 231,242,225,240,232,233,227,240,225,242,229,110,128, 50, 33,238, + 230,229,242,233,239,114,128, 32,130,237,239,238,239,243,240,225, + 227,101,128,255, 18,238,245,237,229,242,225,244,239,242,226,229, + 238,231,225,236,105,128, 9,245,239,236,228,243,244,249,236,101, + 128,247, 50,112, 2,197,121,197,128,225,242,229,110,128, 36,117, + 229,114, 2,197,135,197,141,233,239,100,128, 36,137,243,233,225, + 110,128, 6,242,242,239,237,225,110,128, 33,113,115, 2,197,162, + 197,170,244,242,239,235,101,128, 1,187,245,240,229,242,233,239, + 114,128, 0,178,244,104, 2,197,187,197,192,225,105,128, 14, 82, + 233,242,228,115,128, 33, 84,117,145, 0,117,197,237,197,245,198, + 30,198, 87,198,225,199, 6,199,129,199,145,199,196,200, 10,200, + 91,200,100,200,219,200,243,201, 95,201,123,201,237,225,227,245, + 244,101,128, 0,250, 98, 4,197,255,198, 4,198, 13,198, 23,225, + 114,128, 2,137,229,238,231,225,236,105,128, 9,137,239,240,239, + 237,239,230,111,128, 49, 40,242,229,246,101,128, 1,109, 99, 3, + 198, 38,198, 45,198, 77,225,242,239,110,128, 1,212,233,242, 99, + 2,198, 53,198, 58,236,101,128, 36,228,245,237,230,236,229,120, + 129, 0,251,198, 69,226,229,236,239,119,128, 30,119,249,242,233, + 236,236,233, 99,128, 4, 67,100, 5,198, 99,198,110,198,133,198, + 139,198,215,225,244,244,225,228,229,246, 97,128, 9, 81,226,108, + 2,198,117,198,125,225,227,245,244,101,128, 1,113,231,242,225, + 246,101,128, 2, 21,229,246, 97,128, 9, 9,233,229,242,229,243, + 233,115,133, 0,252,198,159,198,167,198,175,198,198,198,206,225, + 227,245,244,101,128, 1,216,226,229,236,239,119,128, 30,115, 99, + 2,198,181,198,188,225,242,239,110,128, 1,218,249,242,233,236, + 236,233, 99,128, 4,241,231,242,225,246,101,128, 1,220,237,225, + 227,242,239,110,128, 1,214,239,244,226,229,236,239,119,128, 30, + 229,103, 2,198,231,198,238,242,225,246,101,128, 0,249,117, 2, + 198,244,198,253,234,225,242,225,244,105,128, 10,137,242,237,245, + 235,232,105,128, 10, 9,104, 3,199, 14,199, 24,199,102,233,242, + 225,231,225,238, 97,128, 48, 70,111, 2,199, 30,199, 40,239,235, + 225,226,239,246,101,128, 30,231,242,110,133, 1,176,199, 55,199, + 63,199, 74,199, 82,199, 94,225,227,245,244,101,128, 30,233,228, + 239,244,226,229,236,239,119,128, 30,241,231,242,225,246,101,128, + 30,235,232,239,239,235,225,226,239,246,101,128, 30,237,244,233, + 236,228,101,128, 30,239,245,238,231,225,242,245,237,236,225,245, + 116,129, 1,113,199,118,227,249,242,233,236,236,233, 99,128, 4, + 243,233,238,246,229,242,244,229,228,226,242,229,246,101,128, 2, + 23,107, 3,199,153,199,177,199,188,225,244,225,235,225,238, 97, + 129, 48,166,199,165,232,225,236,230,247,233,228,244,104,128,255, + 115,227,249,242,233,236,236,233, 99,128, 4,121,239,242,229,225, + 110,128, 49, 92,109, 2,199,202,199,255, 97, 2,199,208,199,241, + 227,242,239,110,130, 1,107,199,219,199,230,227,249,242,233,236, + 236,233, 99,128, 4,239,228,233,229,242,229,243,233,115,128, 30, + 123,244,242,225,231,245,242,237,245,235,232,105,128, 10, 65,239, + 238,239,243,240,225,227,101,128,255, 85,110, 2,200, 16,200, 71, + 228,229,242,243,227,239,242,101,132, 0, 95,200, 35,200, 41,200, + 53,200, 64,228,226,108,128, 32, 23,237,239,238,239,243,240,225, + 227,101,128,255, 63,246,229,242,244,233,227,225,108,128,254, 51, + 247,225,246,121,128,254, 79,105, 2,200, 77,200, 82,239,110,128, + 34, 42,246,229,242,243,225,108,128, 34, 0,239,231,239,238,229, + 107,128, 1,115,112, 5,200,112,200,119,200,127,200,142,200,193, + 225,242,229,110,128, 36,176,226,236,239,227,107,128, 37,128,240, + 229,242,228,239,244,232,229,226,242,229,119,128, 5,196,243,233, + 236,239,110,131, 3,197,200,156,200,177,200,185,228,233,229,242, + 229,243,233,115,129, 3,203,200,169,244,239,238,239,115,128, 3, + 176,236,225,244,233,110,128, 2,138,244,239,238,239,115,128, 3, + 205,244,225,227,107, 2,200,202,200,213,226,229,236,239,247,227, + 237, 98,128, 3, 29,237,239,100,128, 2,212,114, 2,200,225,200, + 237,225,231,245,242,237,245,235,232,105,128, 10,115,233,238,103, + 128, 1,111,115, 3,200,251,201, 10,201, 55,232,239,242,244,227, + 249,242,233,236,236,233, 99,128, 4, 94,237,225,236,108, 2,201, + 19,201, 30,232,233,242,225,231,225,238, 97,128, 48, 69,235,225, + 244,225,235,225,238, 97,129, 48,165,201, 43,232,225,236,230,247, + 233,228,244,104,128,255,105,244,242,225,233,231,232,116, 2,201, + 67,201, 78,227,249,242,233,236,236,233, 99,128, 4,175,243,244, + 242,239,235,229,227,249,242,233,236,236,233, 99,128, 4,177,244, + 233,236,228,101,130, 1,105,201,107,201,115,225,227,245,244,101, + 128, 30,121,226,229,236,239,119,128, 30,117,117, 5,201,135,201, + 145,201,152,201,177,201,193,226,229,238,231,225,236,105,128, 9, + 138,228,229,246, 97,128, 9, 10,231,117, 2,201,159,201,168,234, + 225,242,225,244,105,128, 10,138,242,237,245,235,232,105,128, 10, + 10,237,225,244,242,225,231,245,242,237,245,235,232,105,128, 10, + 66,246,239,247,229,236,243,233,231,110, 3,201,209,201,219,201, + 226,226,229,238,231,225,236,105,128, 9,194,228,229,246, 97,128, + 9, 66,231,245,234,225,242,225,244,105,128, 10,194,246,239,247, + 229,236,243,233,231,110, 3,201,253,202, 7,202, 14,226,229,238, + 231,225,236,105,128, 9,193,228,229,246, 97,128, 9, 65,231,245, + 234,225,242,225,244,105,128, 10,193,118,139, 0,118,202, 51,202, + 199,202,208,202,219,203,148,203,155,203,253,204, 9,204,109,204, + 117,204,138, 97, 4,202, 61,202, 68,202, 93,202,104,228,229,246, + 97,128, 9, 53,231,117, 2,202, 75,202, 84,234,225,242,225,244, + 105,128, 10,181,242,237,245,235,232,105,128, 10, 53,235,225,244, + 225,235,225,238, 97,128, 48,247,118,132, 5,213,202,116,202,143, + 202,175,202,187,228,225,231,229,243,104,130,251, 53,202,129,202, + 134,182, 53,128,251, 53,232,229,226,242,229,119,128,251, 53,104, + 2,202,149,202,157,229,226,242,229,119,128, 5,213,239,236,225, + 109,129,251, 75,202,166,232,229,226,242,229,119,128,251, 75,246, + 225,246,232,229,226,242,229,119,128, 5,240,249,239,228,232,229, + 226,242,229,119,128, 5,241,227,233,242,227,236,101,128, 36,229, + 228,239,244,226,229,236,239,119,128, 30,127,101, 6,202,233,202, + 244,203, 52,203, 63,203, 69,203,136,227,249,242,233,236,236,233, + 99,128, 4, 50,104, 4,202,254,203, 7,203, 21,203, 37,225,242, + 225,226,233, 99,128, 6,164,230,233,238,225,236,225,242,225,226, + 233, 99,128,251,107,233,238,233,244,233,225,236,225,242,225,226, + 233, 99,128,251,108,237,229,228,233,225,236,225,242,225,226,233, + 99,128,251,109,235,225,244,225,235,225,238, 97,128, 48,249,238, + 245,115,128, 38, 64,242,244,233,227,225,108, 2,203, 80,203, 86, + 226,225,114,128, 0,124,236,233,238,101, 4,203, 99,203,110,203, + 121,203,130,225,226,239,246,229,227,237, 98,128, 3, 13,226,229, + 236,239,247,227,237, 98,128, 3, 41,236,239,247,237,239,100,128, + 2,204,237,239,100,128, 2,200,247,225,242,237,229,238,233,225, + 110,128, 5,126,232,239,239,107,128, 2,139,105, 3,203,163,203, + 174,203,213,235,225,244,225,235,225,238, 97,128, 48,248,242,225, + 237, 97, 3,203,185,203,195,203,202,226,229,238,231,225,236,105, + 128, 9,205,228,229,246, 97,128, 9, 77,231,245,234,225,242,225, + 244,105,128, 10,205,243,225,242,231, 97, 3,203,225,203,235,203, + 242,226,229,238,231,225,236,105,128, 9,131,228,229,246, 97,128, + 9, 3,231,245,234,225,242,225,244,105,128, 10,131,237,239,238, + 239,243,240,225,227,101,128,255, 86,111, 3,204, 17,204, 28,204, + 98,225,242,237,229,238,233,225,110,128, 5,120,233,227,229,100, + 2,204, 37,204, 73,233,244,229,242,225,244,233,239,110, 2,204, + 51,204, 62,232,233,242,225,231,225,238, 97,128, 48,158,235,225, + 244,225,235,225,238, 97,128, 48,254,237,225,242,235,235,225,238, + 97,129, 48,155,204, 86,232,225,236,230,247,233,228,244,104,128, + 255,158,235,225,244,225,235,225,238, 97,128, 48,250,240,225,242, + 229,110,128, 36,177,116, 2,204,123,204,130,233,236,228,101,128, + 30,125,245,242,238,229,100,128, 2,140,117, 2,204,144,204,155, + 232,233,242,225,231,225,238, 97,128, 48,148,235,225,244,225,235, + 225,238, 97,128, 48,244,119,143, 0,119,204,200,205,177,205,187, + 205,210,205,250,206, 61,206, 69,208, 40,208, 81,208, 93,208,168, + 208,176,208,183,208,194,208,203, 97, 8,204,218,204,225,204,235, + 204,246,205, 28,205, 60,205, 72,205,108,227,245,244,101,128, 30, + 131,229,235,239,242,229,225,110,128, 49, 89,232,233,242,225,231, + 225,238, 97,128, 48,143,107, 2,204,252,205, 20,225,244,225,235, + 225,238, 97,129, 48,239,205, 8,232,225,236,230,247,233,228,244, + 104,128,255,156,239,242,229,225,110,128, 49, 88,243,237,225,236, + 108, 2,205, 38,205, 49,232,233,242,225,231,225,238, 97,128, 48, + 142,235,225,244,225,235,225,238, 97,128, 48,238,244,244,239,243, + 241,245,225,242,101,128, 51, 87,118, 2,205, 78,205, 86,229,228, + 225,243,104,128, 48, 28,249,245,238,228,229,242,243,227,239,242, + 229,246,229,242,244,233,227,225,108,128,254, 52,119, 3,205,116, + 205,125,205,139,225,242,225,226,233, 99,128, 6, 72,230,233,238, + 225,236,225,242,225,226,233, 99,128,254,238,232,225,237,250,225, + 225,226,239,246,101, 2,205,154,205,163,225,242,225,226,233, 99, + 128, 6, 36,230,233,238,225,236,225,242,225,226,233, 99,128,254, + 134,226,243,241,245,225,242,101,128, 51,221,227,233,242, 99, 2, + 205,196,205,201,236,101,128, 36,230,245,237,230,236,229,120,128, + 1,117,100, 2,205,216,205,226,233,229,242,229,243,233,115,128, + 30,133,239,116, 2,205,233,205,242,225,227,227,229,238,116,128, + 30,135,226,229,236,239,119,128, 30,137,101, 4,206, 4,206, 15, + 206, 27,206, 51,232,233,242,225,231,225,238, 97,128, 48,145,233, + 229,242,243,244,242,225,243,115,128, 33, 24,107, 2,206, 33,206, + 43,225,244,225,235,225,238, 97,128, 48,241,239,242,229,225,110, + 128, 49, 94,239,235,239,242,229,225,110,128, 49, 93,231,242,225, + 246,101,128, 30,129,232,233,244,101, 8,206, 90,206, 99,206,183, + 207, 17,207,101,207,146,207,198,207,254,226,245,236,236,229,116, + 128, 37,230, 99, 2,206,105,206,125,233,242,227,236,101,129, 37, + 203,206,115,233,238,246,229,242,243,101,128, 37,217,239,242,238, + 229,242,226,242,225,227,235,229,116, 2,206,142,206,162,236,229, + 230,116,129, 48, 14,206,151,246,229,242,244,233,227,225,108,128, + 254, 67,242,233,231,232,116,129, 48, 15,206,172,246,229,242,244, + 233,227,225,108,128,254, 68,100, 2,206,189,206,230,233,225,237, + 239,238,100,129, 37,199,206,200,227,239,238,244,225,233,238,233, + 238,231,226,236,225,227,235,243,237,225,236,236,228,233,225,237, + 239,238,100,128, 37,200,239,247,238,240,239,233,238,244,233,238, + 103, 2,206,246,207, 6,243,237,225,236,236,244,242,233,225,238, + 231,236,101,128, 37,191,244,242,233,225,238,231,236,101,128, 37, + 189,236,101, 2,207, 24,207, 66,230,244,240,239,233,238,244,233, + 238,103, 2,207, 39,207, 55,243,237,225,236,236,244,242,233,225, + 238,231,236,101,128, 37,195,244,242,233,225,238,231,236,101,128, + 37,193,238,244,233,227,245,236,225,242,226,242,225,227,235,229, + 116, 2,207, 86,207, 93,236,229,230,116,128, 48, 22,242,233,231, + 232,116,128, 48, 23,242,233,231,232,244,240,239,233,238,244,233, + 238,103, 2,207,119,207,135,243,237,225,236,236,244,242,233,225, + 238,231,236,101,128, 37,185,244,242,233,225,238,231,236,101,128, + 37,183,115, 3,207,154,207,184,207,192,109, 2,207,160,207,172, + 225,236,236,243,241,245,225,242,101,128, 37,171,233,236,233,238, + 231,230,225,227,101,128, 38, 58,241,245,225,242,101,128, 37,161, + 244,225,114,128, 38, 6,116, 2,207,204,207,215,229,236,229,240, + 232,239,238,101,128, 38, 15,239,242,244,239,233,243,229,243,232, + 229,236,236,226,242,225,227,235,229,116, 2,207,239,207,246,236, + 229,230,116,128, 48, 24,242,233,231,232,116,128, 48, 25,245,240, + 240,239,233,238,244,233,238,103, 2,208, 13,208, 29,243,237,225, + 236,236,244,242,233,225,238,231,236,101,128, 37,181,244,242,233, + 225,238,231,236,101,128, 37,179,105, 2,208, 46,208, 57,232,233, + 242,225,231,225,238, 97,128, 48,144,107, 2,208, 63,208, 73,225, + 244,225,235,225,238, 97,128, 48,240,239,242,229,225,110,128, 49, + 95,237,239,238,239,243,240,225,227,101,128,255, 87,111, 4,208, + 103,208,114,208,139,208,157,232,233,242,225,231,225,238, 97,128, + 48,146,235,225,244,225,235,225,238, 97,129, 48,242,208,127,232, + 225,236,230,247,233,228,244,104,128,255,102,110,129, 32,169,208, + 145,237,239,238,239,243,240,225,227,101,128,255,230,247,225,229, + 238,244,232,225,105,128, 14, 39,240,225,242,229,110,128, 36,178, + 242,233,238,103,128, 30,152,243,245,240,229,242,233,239,114,128, + 2,183,244,245,242,238,229,100,128, 2,141,249,238,110,128, 1, + 191,120,137, 0,120,208,231,208,242,208,253,209, 6,209, 33,209, + 46,209, 50,209, 62,209, 70,225,226,239,246,229,227,237, 98,128, + 3, 61,226,239,240,239,237,239,230,111,128, 49, 18,227,233,242, + 227,236,101,128, 36,231,100, 2,209, 12,209, 22,233,229,242,229, + 243,233,115,128, 30,141,239,244,225,227,227,229,238,116,128, 30, + 139,229,232,225,242,237,229,238,233,225,110,128, 5,109,105,128, + 3,190,237,239,238,239,243,240,225,227,101,128,255, 88,240,225, + 242,229,110,128, 36,179,243,245,240,229,242,233,239,114,128, 2, + 227,121,143, 0,121,209,115,210, 74,210, 97,210,137,212,103,212, + 111,212,128,212,192,212,204,213,201,213,241,213,253,214, 8,214, + 29,215, 2, 97, 11,209,139,209,151,209,161,209,168,209,175,209, + 185,209,210,209,221,210, 3,210, 16,210, 62,225,228,239,243,241, + 245,225,242,101,128, 51, 78,226,229,238,231,225,236,105,128, 9, + 175,227,245,244,101,128, 0,253,228,229,246, 97,128, 9, 47,229, + 235,239,242,229,225,110,128, 49, 82,231,117, 2,209,192,209,201, + 234,225,242,225,244,105,128, 10,175,242,237,245,235,232,105,128, + 10, 47,232,233,242,225,231,225,238, 97,128, 48,132,107, 2,209, + 227,209,251,225,244,225,235,225,238, 97,129, 48,228,209,239,232, + 225,236,230,247,233,228,244,104,128,255,148,239,242,229,225,110, + 128, 49, 81,237,225,235,235,225,238,244,232,225,105,128, 14, 78, + 243,237,225,236,108, 2,210, 26,210, 37,232,233,242,225,231,225, + 238, 97,128, 48,131,235,225,244,225,235,225,238, 97,129, 48,227, + 210, 50,232,225,236,230,247,233,228,244,104,128,255,108,244,227, + 249,242,233,236,236,233, 99,128, 4, 99,227,233,242, 99, 2,210, + 83,210, 88,236,101,128, 36,232,245,237,230,236,229,120,128, 1, + 119,100, 2,210,103,210,113,233,229,242,229,243,233,115,128, 0, + 255,239,116, 2,210,120,210,129,225,227,227,229,238,116,128, 30, + 143,226,229,236,239,119,128, 30,245,101, 7,210,153,211,161,211, + 170,211,188,211,220,212, 40,212, 91,104, 8,210,171,210,180,210, + 214,210,228,211, 45,211, 61,211,120,211,138,225,242,225,226,233, + 99,128, 6, 74,226,225,242,242,229,101, 2,210,191,210,200,225, + 242,225,226,233, 99,128, 6,210,230,233,238,225,236,225,242,225, + 226,233, 99,128,251,175,230,233,238,225,236,225,242,225,226,233, + 99,128,254,242,232,225,237,250,225,225,226,239,246,101, 4,210, + 247,211, 0,211, 14,211, 30,225,242,225,226,233, 99,128, 6, 38, + 230,233,238,225,236,225,242,225,226,233, 99,128,254,138,233,238, + 233,244,233,225,236,225,242,225,226,233, 99,128,254,139,237,229, + 228,233,225,236,225,242,225,226,233, 99,128,254,140,233,238,233, + 244,233,225,236,225,242,225,226,233, 99,128,254,243,237,101, 2, + 211, 68,211, 81,228,233,225,236,225,242,225,226,233, 99,128,254, + 244,229,237,105, 2,211, 89,211,104,238,233,244,233,225,236,225, + 242,225,226,233, 99,128,252,221,243,239,236,225,244,229,228,225, + 242,225,226,233, 99,128,252, 88,238,239,239,238,230,233,238,225, + 236,225,242,225,226,233, 99,128,252,148,244,232,242,229,229,228, + 239,244,243,226,229,236,239,247,225,242,225,226,233, 99,128, 6, + 209,235,239,242,229,225,110,128, 49, 86,110,129, 0,165,211,176, + 237,239,238,239,243,240,225,227,101,128,255,229,111, 2,211,194, + 211,203,235,239,242,229,225,110,128, 49, 85,242,233,238,232,233, + 229,245,232,235,239,242,229,225,110,128, 49,134,114, 3,211,228, + 212, 8,212, 20,225,232,226,229,238,249,239,237,111, 2,211,242, + 211,251,232,229,226,242,229,119,128, 5,170,236,229,230,244,232, + 229,226,242,229,119,128, 5,170,233,227,249,242,233,236,236,233, + 99,128, 4, 75,245,228,233,229,242,229,243,233,243,227,249,242, + 233,236,236,233, 99,128, 4,249,243,233,229,245,238,103, 3,212, + 53,212, 62,212, 78,235,239,242,229,225,110,128, 49,129,240,225, + 238,243,233,239,243,235,239,242,229,225,110,128, 49,131,243,233, + 239,243,235,239,242,229,225,110,128, 49,130,244,233,246,232,229, + 226,242,229,119,128, 5,154,231,242,225,246,101,128, 30,243,232, + 239,239,107,129, 1,180,212,120,225,226,239,246,101,128, 30,247, + 105, 5,212,140,212,151,212,162,212,171,212,179,225,242,237,229, + 238,233,225,110,128, 5,117,227,249,242,233,236,236,233, 99,128, + 4, 87,235,239,242,229,225,110,128, 49, 98,238,249,225,238,103, + 128, 38, 47,247,238,225,242,237,229,238,233,225,110,128, 5,130, + 237,239,238,239,243,240,225,227,101,128,255, 89,111, 7,212,220, + 213, 34,213, 45,213, 55,213, 93,213,139,213,148,100,131, 5,217, + 212,230,212,250,213, 3,228,225,231,229,243,104,129,251, 57,212, + 241,232,229,226,242,229,119,128,251, 57,232,229,226,242,229,119, + 128, 5,217,249,239,100, 2,213, 11,213, 20,232,229,226,242,229, + 119,128, 5,242,240,225,244,225,232,232,229,226,242,229,119,128, + 251, 31,232,233,242,225,231,225,238, 97,128, 48,136,233,235,239, + 242,229,225,110,128, 49,137,107, 2,213, 61,213, 85,225,244,225, + 235,225,238, 97,129, 48,232,213, 73,232,225,236,230,247,233,228, + 244,104,128,255,150,239,242,229,225,110,128, 49, 91,243,237,225, + 236,108, 2,213,103,213,114,232,233,242,225,231,225,238, 97,128, + 48,135,235,225,244,225,235,225,238, 97,129, 48,231,213,127,232, + 225,236,230,247,233,228,244,104,128,255,110,244,231,242,229,229, + 107,128, 3,243,121, 2,213,154,213,191, 97, 2,213,160,213,170, + 229,235,239,242,229,225,110,128, 49,136,107, 2,213,176,213,184, + 239,242,229,225,110,128, 49,135,244,232,225,105,128, 14, 34,233, + 238,231,244,232,225,105,128, 14, 13,112, 2,213,207,213,214,225, + 242,229,110,128, 36,180,239,231,229,231,242,225,237,237,229,238, + 105,129, 3,122,213,230,231,242,229,229,235,227,237, 98,128, 3, + 69,114,129, 1,166,213,247,233,238,103,128, 30,153,243,245,240, + 229,242,233,239,114,128, 2,184,116, 2,214, 14,214, 21,233,236, + 228,101,128, 30,249,245,242,238,229,100,128, 2,142,117, 5,214, + 41,214, 52,214, 62,214,100,214,232,232,233,242,225,231,225,238, + 97,128, 48,134,233,235,239,242,229,225,110,128, 49,140,107, 2, + 214, 68,214, 92,225,244,225,235,225,238, 97,129, 48,230,214, 80, + 232,225,236,230,247,233,228,244,104,128,255,149,239,242,229,225, + 110,128, 49, 96,115, 3,214,108,214,146,214,187,226,233,103, 2, + 214,116,214,127,227,249,242,233,236,236,233, 99,128, 4,107,233, + 239,244,233,230,233,229,228,227,249,242,233,236,236,233, 99,128, + 4,109,236,233,244,244,236,101, 2,214,157,214,168,227,249,242, + 233,236,236,233, 99,128, 4,103,233,239,244,233,230,233,229,228, + 227,249,242,233,236,236,233, 99,128, 4,105,237,225,236,108, 2, + 214,196,214,207,232,233,242,225,231,225,238, 97,128, 48,133,235, + 225,244,225,235,225,238, 97,129, 48,229,214,220,232,225,236,230, + 247,233,228,244,104,128,255,109,249,101, 2,214,239,214,248,235, + 239,242,229,225,110,128, 49,139,239,235,239,242,229,225,110,128, + 49,138,249, 97, 2,215, 9,215, 19,226,229,238,231,225,236,105, + 128, 9,223,228,229,246, 97,128, 9, 95,122,142, 0,122,215, 58, + 216, 66,216, 77,216,120,216,147,217,182,218, 34,218, 76,218, 88, + 218,100,218,128,218,136,218,152,218,161, 97, 10,215, 80,215, 91, + 215, 98,215,105,215,116,215,194,215,224,215,235,216, 15,216, 27, + 225,242,237,229,238,233,225,110,128, 5,102,227,245,244,101,128, + 1,122,228,229,246, 97,128, 9, 91,231,245,242,237,245,235,232, + 105,128, 10, 91,104, 4,215,126,215,135,215,149,215,179,225,242, + 225,226,233, 99,128, 6, 56,230,233,238,225,236,225,242,225,226, + 233, 99,128,254,198,105, 2,215,155,215,170,238,233,244,233,225, + 236,225,242,225,226,233, 99,128,254,199,242,225,231,225,238, 97, + 128, 48, 86,237,229,228,233,225,236,225,242,225,226,233, 99,128, + 254,200,233,110, 2,215,201,215,210,225,242,225,226,233, 99,128, + 6, 50,230,233,238,225,236,225,242,225,226,233, 99,128,254,176, + 235,225,244,225,235,225,238, 97,128, 48,182,241,229,102, 2,215, + 243,216, 1,231,225,228,239,236,232,229,226,242,229,119,128, 5, + 149,241,225,244,225,238,232,229,226,242,229,119,128, 5,148,242, + 241,225,232,229,226,242,229,119,128, 5,152,249,233,110,130, 5, + 214,216, 37,216, 57,228,225,231,229,243,104,129,251, 54,216, 48, + 232,229,226,242,229,119,128,251, 54,232,229,226,242,229,119,128, + 5,214,226,239,240,239,237,239,230,111,128, 49, 23, 99, 3,216, + 85,216, 92,216,114,225,242,239,110,128, 1,126,233,242, 99, 2, + 216,100,216,105,236,101,128, 36,233,245,237,230,236,229,120,128, + 30,145,245,242,108,128, 2,145,228,239,116,130, 1,124,216,130, + 216,139,225,227,227,229,238,116,128, 1,124,226,229,236,239,119, + 128, 30,147,101, 6,216,161,216,172,216,215,216,226,216,237,217, + 177,227,249,242,233,236,236,233, 99,128, 4, 55,100, 2,216,178, + 216,197,229,243,227,229,238,228,229,242,227,249,242,233,236,236, + 233, 99,128, 4,153,233,229,242,229,243,233,243,227,249,242,233, + 236,236,233, 99,128, 4,223,232,233,242,225,231,225,238, 97,128, + 48, 92,235,225,244,225,235,225,238, 97,128, 48,188,242,111,140, + 0, 48,217, 10,217, 19,217, 29,217, 36,217, 61,217, 74,217, 85, + 217, 97,217,108,217,118,217,129,217,136,225,242,225,226,233, 99, + 128, 6, 96,226,229,238,231,225,236,105,128, 9,230,228,229,246, + 97,128, 9,102,231,117, 2,217, 43,217, 52,234,225,242,225,244, + 105,128, 10,230,242,237,245,235,232,105,128, 10,102,232,225,227, + 235,225,242,225,226,233, 99,128, 6, 96,233,238,230,229,242,233, + 239,114,128, 32,128,237,239,238,239,243,240,225,227,101,128,255, + 16,239,236,228,243,244,249,236,101,128,247, 48,240,229,242,243, + 233,225,110,128, 6,240,243,245,240,229,242,233,239,114,128, 32, + 112,244,232,225,105,128, 14, 80,247,233,228,244,104, 3,217,148, + 217,157,217,169,234,239,233,238,229,114,128,254,255,238,239,238, + 234,239,233,238,229,114,128, 32, 12,243,240,225,227,101,128, 32, + 11,244, 97,128, 3,182,104, 2,217,188,217,199,226,239,240,239, + 237,239,230,111,128, 49, 19,101, 4,217,209,217,220,217,236,217, + 247,225,242,237,229,238,233,225,110,128, 5,106,226,242,229,246, + 229,227,249,242,233,236,236,233, 99,128, 4,194,227,249,242,233, + 236,236,233, 99,128, 4, 54,100, 2,217,253,218, 16,229,243,227, + 229,238,228,229,242,227,249,242,233,236,236,233, 99,128, 4,151, + 233,229,242,229,243,233,243,227,249,242,233,236,236,233, 99,128, + 4,221,105, 3,218, 42,218, 53,218, 64,232,233,242,225,231,225, + 238, 97,128, 48, 88,235,225,244,225,235,225,238, 97,128, 48,184, + 238,239,242,232,229,226,242,229,119,128, 5,174,236,233,238,229, + 226,229,236,239,119,128, 30,149,237,239,238,239,243,240,225,227, + 101,128,255, 90,111, 2,218,106,218,117,232,233,242,225,231,225, + 238, 97,128, 48, 94,235,225,244,225,235,225,238, 97,128, 48,190, + 240,225,242,229,110,128, 36,181,242,229,244,242,239,230,236,229, + 248,232,239,239,107,128, 2,144,243,244,242,239,235,101,128, 1, + 182,117, 2,218,167,218,178,232,233,242,225,231,225,238, 97,128, + 48, 90,235,225,244,225,235,225,238, 97,128, 48,186 + } +#endif /* DEFINE_PS_TABLES_DATA */ + ; + + +#ifdef DEFINE_PS_TABLES + /* + * This function searches the compressed table efficiently. + */ + static unsigned long + ft_get_adobe_glyph_index( const char* name, + const char* limit ) + { + int c = 0; + int count, min, max; + const unsigned char* p = ft_adobe_glyph_list; + + + if ( name == 0 || name >= limit ) + goto NotFound; + + c = *name++; + count = p[1]; + p += 2; + + min = 0; + max = count; + + while ( min < max ) + { + int mid = ( min + max ) >> 1; + const unsigned char* q = p + mid * 2; + int c2; + + + q = ft_adobe_glyph_list + ( ( (int)q[0] << 8 ) | q[1] ); + + c2 = q[0] & 127; + if ( c2 == c ) + { + p = q; + goto Found; + } + if ( c2 < c ) + min = mid + 1; + else + max = mid; + } + goto NotFound; + + Found: + for (;;) + { + /* assert (*p & 127) == c */ + + if ( name >= limit ) + { + if ( (p[0] & 128) == 0 && + (p[1] & 128) != 0 ) + return (unsigned long)( ( (int)p[2] << 8 ) | p[3] ); + + goto NotFound; + } + c = *name++; + if ( p[0] & 128 ) + { + p++; + if ( c != (p[0] & 127) ) + goto NotFound; + + continue; + } + + p++; + count = p[0] & 127; + if ( p[0] & 128 ) + p += 2; + + p++; + + for ( ; count > 0; count--, p += 2 ) + { + int offset = ( (int)p[0] << 8 ) | p[1]; + const unsigned char* q = ft_adobe_glyph_list + offset; + + if ( c == ( q[0] & 127 ) ) + { + p = q; + goto NextIter; + } + } + goto NotFound; + + NextIter: + ; + } + + NotFound: + return 0; + } +#endif /* DEFINE_PS_TABLES */ + +#endif /* FT_CONFIG_OPTION_ADOBE_GLYPH_LIST */ + + +/* END */ diff --git a/vendor/FreeType2/src/raster/ftmisc.h b/vendor/FreeType2/src/raster/ftmisc.h new file mode 100644 index 0000000..7e40119 --- /dev/null +++ b/vendor/FreeType2/src/raster/ftmisc.h @@ -0,0 +1,142 @@ +/***************************************************************************/ +/* */ +/* ftmisc.h */ +/* */ +/* Miscellaneous macros for stand-alone rasterizer (specification */ +/* only). */ +/* */ +/* Copyright 2005-2018 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 file is *not* portable! You have to adapt */ + /* its definitions to your platform. */ + /* */ + /***************************************************/ + +#ifndef FTMISC_H_ +#define FTMISC_H_ + + + /* memset */ +#include FT_CONFIG_STANDARD_LIBRARY_H + +#define FT_BEGIN_HEADER +#define FT_END_HEADER + +#define FT_LOCAL_DEF( x ) static x + + + /* from include/freetype/fttypes.h */ + + typedef unsigned char FT_Byte; + typedef signed int FT_Int; + typedef unsigned int FT_UInt; + typedef signed long FT_Long; + typedef unsigned long FT_ULong; + typedef signed long FT_F26Dot6; + typedef int FT_Error; + +#define FT_MAKE_TAG( _x1, _x2, _x3, _x4 ) \ + ( ( (FT_ULong)_x1 << 24 ) | \ + ( (FT_ULong)_x2 << 16 ) | \ + ( (FT_ULong)_x3 << 8 ) | \ + (FT_ULong)_x4 ) + + + /* from include/freetype/ftsystem.h */ + + typedef struct FT_MemoryRec_* FT_Memory; + + typedef void* (*FT_Alloc_Func)( FT_Memory memory, + long size ); + + typedef void (*FT_Free_Func)( FT_Memory memory, + void* block ); + + typedef void* (*FT_Realloc_Func)( FT_Memory memory, + long cur_size, + long new_size, + void* block ); + + typedef struct FT_MemoryRec_ + { + void* user; + + FT_Alloc_Func alloc; + FT_Free_Func free; + FT_Realloc_Func realloc; + + } FT_MemoryRec; + + + /* from src/ftcalc.c */ + +#if ( defined _WIN32 || defined _WIN64 ) + + typedef __int64 FT_Int64; + +#else + +#include "inttypes.h" + + typedef int64_t FT_Int64; + +#endif + + + static FT_Long + FT_MulDiv( FT_Long a, + FT_Long b, + FT_Long c ) + { + FT_Int s; + FT_Long d; + + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + if ( c < 0 ) { c = -c; s = -s; } + + d = (FT_Long)( c > 0 ? ( (FT_Int64)a * b + ( c >> 1 ) ) / c + : 0x7FFFFFFFL ); + + return ( s > 0 ) ? d : -d; + } + + + static FT_Long + FT_MulDiv_No_Round( FT_Long a, + FT_Long b, + FT_Long c ) + { + FT_Int s; + FT_Long d; + + + s = 1; + if ( a < 0 ) { a = -a; s = -1; } + if ( b < 0 ) { b = -b; s = -s; } + if ( c < 0 ) { c = -c; s = -s; } + + d = (FT_Long)( c > 0 ? (FT_Int64)a * b / c + : 0x7FFFFFFFL ); + + return ( s > 0 ) ? d : -d; + } + +#endif /* FTMISC_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/raster/ftraster.c b/vendor/FreeType2/src/raster/ftraster.c new file mode 100644 index 0000000..4354730 --- /dev/null +++ b/vendor/FreeType2/src/raster/ftraster.c @@ -0,0 +1,3225 @@ +/***************************************************************************/ +/* */ +/* ftraster.c */ +/* */ +/* The FreeType glyph rasterizer (body). */ +/* */ +/* Copyright 1996-2018 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 file can be compiled without the rest of the FreeType engine, by */ + /* defining the STANDALONE_ macro when compiling it. You also need to */ + /* put the files `ftimage.h' and `ftmisc.h' into the $(incdir) */ + /* directory. Typically, you should do something like */ + /* */ + /* - copy `src/raster/ftraster.c' (this file) to your current directory */ + /* */ + /* - copy `include/freetype/ftimage.h' and `src/raster/ftmisc.h' to your */ + /* current directory */ + /* */ + /* - compile `ftraster' with the STANDALONE_ macro defined, as in */ + /* */ + /* cc -c -DSTANDALONE_ ftraster.c */ + /* */ + /* The renderer can be initialized with a call to */ + /* `ft_standard_raster.raster_new'; a bitmap can be generated */ + /* with a call to `ft_standard_raster.raster_render'. */ + /* */ + /* See the comments and documentation in the file `ftimage.h' for more */ + /* details on how the raster works. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* This is a rewrite of the FreeType 1.x scan-line converter */ + /* */ + /*************************************************************************/ + +#ifdef STANDALONE_ + + /* The size in bytes of the render pool used by the scan-line converter */ + /* to do all of its work. */ +#define FT_RENDER_POOL_SIZE 16384L + +#define FT_CONFIG_STANDARD_LIBRARY_H + +#include /* for memset */ + +#include "ftmisc.h" +#include "ftimage.h" + +#else /* !STANDALONE_ */ + +#include +#include "ftraster.h" +#include FT_INTERNAL_CALC_H /* for FT_MulDiv and FT_MulDiv_No_Round */ + +#include "rastpic.h" + +#endif /* !STANDALONE_ */ + + + /*************************************************************************/ + /* */ + /* A simple technical note on how the raster works */ + /* ----------------------------------------------- */ + /* */ + /* Converting an outline into a bitmap is achieved in several steps: */ + /* */ + /* 1 - Decomposing the outline into successive `profiles'. Each */ + /* profile is simply an array of scanline intersections on a given */ + /* dimension. A profile's main attributes are */ + /* */ + /* o its scanline position boundaries, i.e. `Ymin' and `Ymax' */ + /* */ + /* o an array of intersection coordinates for each scanline */ + /* between `Ymin' and `Ymax' */ + /* */ + /* o a direction, indicating whether it was built going `up' or */ + /* `down', as this is very important for filling rules */ + /* */ + /* o its drop-out mode */ + /* */ + /* 2 - Sweeping the target map's scanlines in order to compute segment */ + /* `spans' which are then filled. Additionally, this pass */ + /* performs drop-out control. */ + /* */ + /* The outline data is parsed during step 1 only. The profiles are */ + /* built from the bottom of the render pool, used as a stack. The */ + /* following graphics shows the profile list under construction: */ + /* */ + /* __________________________________________________________ _ _ */ + /* | | | | | */ + /* | profile | coordinates for | profile | coordinates for |--> */ + /* | 1 | profile 1 | 2 | profile 2 |--> */ + /* |_________|_________________|_________|_________________|__ _ _ */ + /* */ + /* ^ ^ */ + /* | | */ + /* start of render pool top */ + /* */ + /* The top of the profile stack is kept in the `top' variable. */ + /* */ + /* As you can see, a profile record is pushed on top of the render */ + /* pool, which is then followed by its coordinates/intersections. If */ + /* a change of direction is detected in the outline, a new profile is */ + /* generated until the end of the outline. */ + /* */ + /* Note that when all profiles have been generated, the function */ + /* Finalize_Profile_Table() is used to record, for each profile, its */ + /* bottom-most scanline as well as the scanline above its upmost */ + /* boundary. These positions are called `y-turns' because they (sort */ + /* of) correspond to local extrema. They are stored in a sorted list */ + /* built from the top of the render pool as a downwards stack: */ + /* */ + /* _ _ _______________________________________ */ + /* | | */ + /* <--| sorted list of | */ + /* <--| extrema scanlines | */ + /* _ _ __________________|____________________| */ + /* */ + /* ^ ^ */ + /* | | */ + /* maxBuff sizeBuff = end of pool */ + /* */ + /* This list is later used during the sweep phase in order to */ + /* optimize performance (see technical note on the sweep below). */ + /* */ + /* Of course, the raster detects whether the two stacks collide and */ + /* handles the situation properly. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** CONFIGURATION MACROS **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + /* define DEBUG_RASTER if you want to compile a debugging version */ +/* #define DEBUG_RASTER */ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** OTHER MACROS (do not change) **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* 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_raster + + +#ifdef STANDALONE_ + + /* Auxiliary macros for token concatenation. */ +#define FT_ERR_XCAT( x, y ) x ## y +#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) + + /* This macro is used to indicate that a function parameter is unused. */ + /* Its purpose is simply to reduce compiler warnings. Note also that */ + /* simply defining it as `(void)x' doesn't avoid warnings with certain */ + /* ANSI compilers (e.g. LCC). */ +#define FT_UNUSED( x ) (x) = (x) + + /* Disable the tracing mechanism for simplicity -- developers can */ + /* activate it easily by redefining these macros. */ +#ifndef FT_ERROR +#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */ +#endif + +#ifndef FT_TRACE +#define FT_TRACE( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE1( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE6( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE7( x ) do { } while ( 0 ) /* nothing */ +#endif + +#ifndef FT_THROW +#define FT_THROW( e ) FT_ERR_CAT( Raster_Err_, e ) +#endif + +#define Raster_Err_None 0 +#define Raster_Err_Not_Ini -1 +#define Raster_Err_Overflow -2 +#define Raster_Err_Neg_Height -3 +#define Raster_Err_Invalid -4 +#define Raster_Err_Unsupported -5 + +#define ft_memset memset + +#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, raster_new_, \ + raster_reset_, raster_set_mode_, \ + raster_render_, raster_done_ ) \ + const FT_Raster_Funcs class_ = \ + { \ + glyph_format_, \ + raster_new_, \ + raster_reset_, \ + raster_set_mode_, \ + raster_render_, \ + raster_done_ \ + }; + +#else /* !STANDALONE_ */ + + +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H /* for FT_TRACE, FT_ERROR, and FT_THROW */ + +#include "rasterrs.h" + +#define Raster_Err_None FT_Err_Ok +#define Raster_Err_Not_Ini Raster_Err_Raster_Uninitialized +#define Raster_Err_Overflow Raster_Err_Raster_Overflow +#define Raster_Err_Neg_Height Raster_Err_Raster_Negative_Height +#define Raster_Err_Invalid Raster_Err_Invalid_Outline +#define Raster_Err_Unsupported Raster_Err_Cannot_Render_Glyph + + +#endif /* !STANDALONE_ */ + + +#ifndef FT_MEM_SET +#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) +#endif + +#ifndef FT_MEM_ZERO +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) +#endif + +#ifndef FT_ZERO +#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) +#endif + + /* FMulDiv means `Fast MulDiv'; it is used in case where `b' is */ + /* typically a small value and the result of a*b is known to fit into */ + /* 32 bits. */ +#define FMulDiv( a, b, c ) ( (a) * (b) / (c) ) + + /* On the other hand, SMulDiv means `Slow MulDiv', and is used typically */ + /* for clipping computations. It simply uses the FT_MulDiv() function */ + /* defined in `ftcalc.h'. */ +#define SMulDiv FT_MulDiv +#define SMulDiv_No_Round FT_MulDiv_No_Round + + /* The rasterizer is a very general purpose component; please leave */ + /* the following redefinitions there (you never know your target */ + /* environment). */ + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#ifndef NULL +#define NULL (void*)0 +#endif + +#ifndef SUCCESS +#define SUCCESS 0 +#endif + +#ifndef FAILURE +#define FAILURE 1 +#endif + + +#define MaxBezier 32 /* The maximum number of stacked Bezier curves. */ + /* Setting this constant to more than 32 is a */ + /* pure waste of space. */ + +#define Pixel_Bits 6 /* fractional bits of *input* coordinates */ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** SIMPLE TYPE DECLARATIONS **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + typedef int Int; + typedef unsigned int UInt; + typedef short Short; + typedef unsigned short UShort, *PUShort; + typedef long Long, *PLong; + typedef unsigned long ULong; + + typedef unsigned char Byte, *PByte; + typedef char Bool; + + + typedef union Alignment_ + { + Long l; + void* p; + void (*f)(void); + + } Alignment, *PAlignment; + + + typedef struct TPoint_ + { + Long x; + Long y; + + } TPoint; + + + /* values for the `flags' bit field */ +#define Flow_Up 0x08U +#define Overshoot_Top 0x10U +#define Overshoot_Bottom 0x20U + + + /* States of each line, arc, and profile */ + typedef enum TStates_ + { + Unknown_State, + Ascending_State, + Descending_State, + Flat_State + + } TStates; + + + typedef struct TProfile_ TProfile; + typedef TProfile* PProfile; + + struct TProfile_ + { + FT_F26Dot6 X; /* current coordinate during sweep */ + PProfile link; /* link to next profile (various purposes) */ + PLong offset; /* start of profile's data in render pool */ + UShort flags; /* Bit 0-2: drop-out mode */ + /* Bit 3: profile orientation (up/down) */ + /* Bit 4: is top profile? */ + /* Bit 5: is bottom profile? */ + Long height; /* profile's height in scanlines */ + Long start; /* profile's starting scanline */ + + Int countL; /* number of lines to step before this */ + /* profile becomes drawable */ + + PProfile next; /* next profile in same contour, used */ + /* during drop-out control */ + }; + + typedef PProfile TProfileList; + typedef PProfile* PProfileList; + + + /* Simple record used to implement a stack of bands, required */ + /* by the sub-banding mechanism */ + typedef struct black_TBand_ + { + Short y_min; /* band's minimum */ + Short y_max; /* band's maximum */ + + } black_TBand; + + +#define AlignProfileSize \ + ( ( sizeof ( TProfile ) + sizeof ( Alignment ) - 1 ) / sizeof ( Long ) ) + + +#undef RAS_ARG +#undef RAS_ARGS +#undef RAS_VAR +#undef RAS_VARS + +#ifdef FT_STATIC_RASTER + + +#define RAS_ARGS /* void */ +#define RAS_ARG /* void */ + +#define RAS_VARS /* void */ +#define RAS_VAR /* void */ + +#define FT_UNUSED_RASTER do { } while ( 0 ) + + +#else /* !FT_STATIC_RASTER */ + + +#define RAS_ARGS black_PWorker worker, +#define RAS_ARG black_PWorker worker + +#define RAS_VARS worker, +#define RAS_VAR worker + +#define FT_UNUSED_RASTER FT_UNUSED( worker ) + + +#endif /* !FT_STATIC_RASTER */ + + + typedef struct black_TWorker_ black_TWorker, *black_PWorker; + + + /* prototypes used for sweep function dispatch */ + typedef void + Function_Sweep_Init( RAS_ARGS Short* min, + Short* max ); + + typedef void + Function_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ); + + typedef void + Function_Sweep_Step( RAS_ARG ); + + + /* NOTE: These operations are only valid on 2's complement processors */ +#undef FLOOR +#undef CEILING +#undef TRUNC +#undef SCALED + +#define FLOOR( x ) ( (x) & -ras.precision ) +#define CEILING( x ) ( ( (x) + ras.precision - 1 ) & -ras.precision ) +#define TRUNC( x ) ( (Long)(x) >> ras.precision_bits ) +#define FRAC( x ) ( (x) & ( ras.precision - 1 ) ) +#define SCALED( x ) ( ( (x) < 0 ? -( -(x) << ras.scale_shift ) \ + : ( (x) << ras.scale_shift ) ) \ + - ras.precision_half ) + +#define IS_BOTTOM_OVERSHOOT( x ) \ + (Bool)( CEILING( x ) - x >= ras.precision_half ) +#define IS_TOP_OVERSHOOT( x ) \ + (Bool)( x - FLOOR( x ) >= ras.precision_half ) + +#if FT_RENDER_POOL_SIZE > 2048 +#define FT_MAX_BLACK_POOL ( FT_RENDER_POOL_SIZE / sizeof ( Long ) ) +#else +#define FT_MAX_BLACK_POOL ( 2048 / sizeof ( Long ) ) +#endif + + /* The most used variables are positioned at the top of the structure. */ + /* Thus, their offset can be coded with less opcodes, resulting in a */ + /* smaller executable. */ + + struct black_TWorker_ + { + Int precision_bits; /* precision related variables */ + Int precision; + Int precision_half; + Int precision_shift; + Int precision_step; + Int precision_jitter; + + Int scale_shift; /* == precision_shift for bitmaps */ + /* == precision_shift+1 for pixmaps */ + + PLong buff; /* The profiles buffer */ + PLong sizeBuff; /* Render pool size */ + PLong maxBuff; /* Profiles buffer size */ + PLong top; /* Current cursor in buffer */ + + FT_Error error; + + Int numTurns; /* number of Y-turns in outline */ + + TPoint* arc; /* current Bezier arc pointer */ + + UShort bWidth; /* target bitmap width */ + PByte bTarget; /* target bitmap buffer */ + PByte gTarget; /* target pixmap buffer */ + + Long lastX, lastY; + Long minY, maxY; + + UShort num_Profs; /* current number of profiles */ + + Bool fresh; /* signals a fresh new profile which */ + /* `start' field must be completed */ + Bool joint; /* signals that the last arc ended */ + /* exactly on a scanline. Allows */ + /* removal of doublets */ + PProfile cProfile; /* current profile */ + PProfile fProfile; /* head of linked list of profiles */ + PProfile gProfile; /* contour's first profile in case */ + /* of impact */ + + TStates state; /* rendering state */ + + FT_Bitmap target; /* description of target bit/pixmap */ + FT_Outline outline; + + Long traceOfs; /* current offset in target bitmap */ + Long traceG; /* current offset in target pixmap */ + + Short traceIncr; /* sweep's increment in target bitmap */ + + /* dispatch variables */ + + Function_Sweep_Init* Proc_Sweep_Init; + Function_Sweep_Span* Proc_Sweep_Span; + Function_Sweep_Span* Proc_Sweep_Drop; + Function_Sweep_Step* Proc_Sweep_Step; + + Byte dropOutControl; /* current drop_out control method */ + + Bool second_pass; /* indicates whether a horizontal pass */ + /* should be performed to control */ + /* drop-out accurately when calling */ + /* Render_Glyph. */ + + TPoint arcs[3 * MaxBezier + 1]; /* The Bezier stack */ + + black_TBand band_stack[16]; /* band stack used for sub-banding */ + Int band_top; /* band stack top */ + + }; + + + typedef struct black_TRaster_ + { + void* memory; + + } black_TRaster, *black_PRaster; + +#ifdef FT_STATIC_RASTER + + static black_TWorker cur_ras; +#define ras cur_ras + +#else /* !FT_STATIC_RASTER */ + +#define ras (*worker) + +#endif /* !FT_STATIC_RASTER */ + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** PROFILES COMPUTATION **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* Set_High_Precision */ + /* */ + /* */ + /* Set precision variables according to param flag. */ + /* */ + /* */ + /* High :: Set to True for high precision (typically for ppem < 24), */ + /* false otherwise. */ + /* */ + static void + Set_High_Precision( RAS_ARGS Int High ) + { + /* + * `precision_step' is used in `Bezier_Up' to decide when to split a + * given y-monotonous Bezier arc that crosses a scanline before + * approximating it as a straight segment. The default value of 32 (for + * low accuracy) corresponds to + * + * 32 / 64 == 0.5 pixels, + * + * while for the high accuracy case we have + * + * 256 / (1 << 12) = 0.0625 pixels. + * + * `precision_jitter' is an epsilon threshold used in + * `Vertical_Sweep_Span' to deal with small imperfections in the Bezier + * decomposition (after all, we are working with approximations only); + * it avoids switching on additional pixels which would cause artifacts + * otherwise. + * + * The value of `precision_jitter' has been determined heuristically. + * + */ + + if ( High ) + { + ras.precision_bits = 12; + ras.precision_step = 256; + ras.precision_jitter = 30; + } + else + { + ras.precision_bits = 6; + ras.precision_step = 32; + ras.precision_jitter = 2; + } + + FT_TRACE6(( "Set_High_Precision(%s)\n", High ? "true" : "false" )); + + ras.precision = 1 << ras.precision_bits; + ras.precision_half = ras.precision / 2; + ras.precision_shift = ras.precision_bits - Pixel_Bits; + } + + + /*************************************************************************/ + /* */ + /* */ + /* New_Profile */ + /* */ + /* */ + /* Create a new profile in the render pool. */ + /* */ + /* */ + /* aState :: The state/orientation of the new profile. */ + /* */ + /* overshoot :: Whether the profile's unrounded start position */ + /* differs by at least a half pixel. */ + /* */ + /* */ + /* SUCCESS on success. FAILURE in case of overflow or of incoherent */ + /* profile. */ + /* */ + static Bool + New_Profile( RAS_ARGS TStates aState, + Bool overshoot ) + { + if ( !ras.fProfile ) + { + ras.cProfile = (PProfile)ras.top; + ras.fProfile = ras.cProfile; + ras.top += AlignProfileSize; + } + + if ( ras.top >= ras.maxBuff ) + { + ras.error = FT_THROW( Overflow ); + return FAILURE; + } + + ras.cProfile->flags = 0; + ras.cProfile->start = 0; + ras.cProfile->height = 0; + ras.cProfile->offset = ras.top; + ras.cProfile->link = (PProfile)0; + ras.cProfile->next = (PProfile)0; + ras.cProfile->flags = ras.dropOutControl; + + switch ( aState ) + { + case Ascending_State: + ras.cProfile->flags |= Flow_Up; + if ( overshoot ) + ras.cProfile->flags |= Overshoot_Bottom; + + FT_TRACE6(( " new ascending profile = %p\n", ras.cProfile )); + break; + + case Descending_State: + if ( overshoot ) + ras.cProfile->flags |= Overshoot_Top; + FT_TRACE6(( " new descending profile = %p\n", ras.cProfile )); + break; + + default: + FT_ERROR(( "New_Profile: invalid profile direction\n" )); + ras.error = FT_THROW( Invalid ); + return FAILURE; + } + + if ( !ras.gProfile ) + ras.gProfile = ras.cProfile; + + ras.state = aState; + ras.fresh = TRUE; + ras.joint = FALSE; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* */ + /* End_Profile */ + /* */ + /* */ + /* Finalize the current profile. */ + /* */ + /* */ + /* overshoot :: Whether the profile's unrounded end position differs */ + /* by at least a half pixel. */ + /* */ + /* */ + /* SUCCESS on success. FAILURE in case of overflow or incoherency. */ + /* */ + static Bool + End_Profile( RAS_ARGS Bool overshoot ) + { + Long h; + + + h = (Long)( ras.top - ras.cProfile->offset ); + + if ( h < 0 ) + { + FT_ERROR(( "End_Profile: negative height encountered\n" )); + ras.error = FT_THROW( Neg_Height ); + return FAILURE; + } + + if ( h > 0 ) + { + PProfile oldProfile; + + + FT_TRACE6(( " ending profile %p, start = %ld, height = %ld\n", + ras.cProfile, ras.cProfile->start, h )); + + ras.cProfile->height = h; + if ( overshoot ) + { + if ( ras.cProfile->flags & Flow_Up ) + ras.cProfile->flags |= Overshoot_Top; + else + ras.cProfile->flags |= Overshoot_Bottom; + } + + oldProfile = ras.cProfile; + ras.cProfile = (PProfile)ras.top; + + ras.top += AlignProfileSize; + + ras.cProfile->height = 0; + ras.cProfile->offset = ras.top; + + oldProfile->next = ras.cProfile; + ras.num_Profs++; + } + + if ( ras.top >= ras.maxBuff ) + { + FT_TRACE1(( "overflow in End_Profile\n" )); + ras.error = FT_THROW( Overflow ); + return FAILURE; + } + + ras.joint = FALSE; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Insert_Y_Turn */ + /* */ + /* */ + /* Insert a salient into the sorted list placed on top of the render */ + /* pool. */ + /* */ + /* */ + /* New y scanline position. */ + /* */ + /* */ + /* SUCCESS on success. FAILURE in case of overflow. */ + /* */ + static Bool + Insert_Y_Turn( RAS_ARGS Int y ) + { + PLong y_turns; + Int n; + + + n = ras.numTurns - 1; + y_turns = ras.sizeBuff - ras.numTurns; + + /* look for first y value that is <= */ + while ( n >= 0 && y < y_turns[n] ) + n--; + + /* if it is <, simply insert it, ignore if == */ + if ( n >= 0 && y > y_turns[n] ) + do + { + Int y2 = (Int)y_turns[n]; + + + y_turns[n] = y; + y = y2; + } while ( --n >= 0 ); + + if ( n < 0 ) + { + ras.maxBuff--; + if ( ras.maxBuff <= ras.top ) + { + ras.error = FT_THROW( Overflow ); + return FAILURE; + } + ras.numTurns++; + ras.sizeBuff[-ras.numTurns] = y; + } + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Finalize_Profile_Table */ + /* */ + /* */ + /* Adjust all links in the profiles list. */ + /* */ + /* */ + /* SUCCESS on success. FAILURE in case of overflow. */ + /* */ + static Bool + Finalize_Profile_Table( RAS_ARG ) + { + UShort n; + PProfile p; + + + n = ras.num_Profs; + p = ras.fProfile; + + if ( n > 1 && p ) + { + do + { + Int bottom, top; + + + if ( n > 1 ) + p->link = (PProfile)( p->offset + p->height ); + else + p->link = NULL; + + if ( p->flags & Flow_Up ) + { + bottom = (Int)p->start; + top = (Int)( p->start + p->height - 1 ); + } + else + { + bottom = (Int)( p->start - p->height + 1 ); + top = (Int)p->start; + p->start = bottom; + p->offset += p->height - 1; + } + + if ( Insert_Y_Turn( RAS_VARS bottom ) || + Insert_Y_Turn( RAS_VARS top + 1 ) ) + return FAILURE; + + p = p->link; + } while ( --n ); + } + else + ras.fProfile = NULL; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Split_Conic */ + /* */ + /* */ + /* Subdivide one conic Bezier into two joint sub-arcs in the Bezier */ + /* stack. */ + /* */ + /* */ + /* None (subdivided Bezier is taken from the top of the stack). */ + /* */ + /* */ + /* This routine is the `beef' of this component. It is _the_ inner */ + /* loop that should be optimized to hell to get the best performance. */ + /* */ + static void + Split_Conic( TPoint* base ) + { + Long a, b; + + + base[4].x = base[2].x; + b = base[1].x; + a = base[3].x = ( base[2].x + b ) / 2; + b = base[1].x = ( base[0].x + b ) / 2; + base[2].x = ( a + b ) / 2; + + base[4].y = base[2].y; + b = base[1].y; + a = base[3].y = ( base[2].y + b ) / 2; + b = base[1].y = ( base[0].y + b ) / 2; + base[2].y = ( a + b ) / 2; + + /* hand optimized. gcc doesn't seem to be too good at common */ + /* expression substitution and instruction scheduling ;-) */ + } + + + /*************************************************************************/ + /* */ + /* */ + /* Split_Cubic */ + /* */ + /* */ + /* Subdivide a third-order Bezier arc into two joint sub-arcs in the */ + /* Bezier stack. */ + /* */ + /* */ + /* This routine is the `beef' of the component. It is one of _the_ */ + /* inner loops that should be optimized like hell to get the best */ + /* performance. */ + /* */ + static void + Split_Cubic( TPoint* base ) + { + Long a, b, c, d; + + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = ( base[0].x + c + 1 ) >> 1; + base[5].x = b = ( base[3].x + d + 1 ) >> 1; + c = ( c + d + 1 ) >> 1; + base[2].x = a = ( a + c + 1 ) >> 1; + base[4].x = b = ( b + c + 1 ) >> 1; + base[3].x = ( a + b + 1 ) >> 1; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = ( base[0].y + c + 1 ) >> 1; + base[5].y = b = ( base[3].y + d + 1 ) >> 1; + c = ( c + d + 1 ) >> 1; + base[2].y = a = ( a + c + 1 ) >> 1; + base[4].y = b = ( b + c + 1 ) >> 1; + base[3].y = ( a + b + 1 ) >> 1; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Line_Up */ + /* */ + /* */ + /* Compute the x-coordinates of an ascending line segment and store */ + /* them in the render pool. */ + /* */ + /* */ + /* x1 :: The x-coordinate of the segment's start point. */ + /* */ + /* y1 :: The y-coordinate of the segment's start point. */ + /* */ + /* x2 :: The x-coordinate of the segment's end point. */ + /* */ + /* y2 :: The y-coordinate of the segment's end point. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Line_Up( RAS_ARGS Long x1, + Long y1, + Long x2, + Long y2, + Long miny, + Long maxy ) + { + Long Dx, Dy; + Int e1, e2, f1, f2, size; /* XXX: is `Short' sufficient? */ + Long Ix, Rx, Ax; + + PLong top; + + + Dx = x2 - x1; + Dy = y2 - y1; + + if ( Dy <= 0 || y2 < miny || y1 > maxy ) + return SUCCESS; + + if ( y1 < miny ) + { + /* Take care: miny-y1 can be a very large value; we use */ + /* a slow MulDiv function to avoid clipping bugs */ + x1 += SMulDiv( Dx, miny - y1, Dy ); + e1 = (Int)TRUNC( miny ); + f1 = 0; + } + else + { + e1 = (Int)TRUNC( y1 ); + f1 = (Int)FRAC( y1 ); + } + + if ( y2 > maxy ) + { + /* x2 += FMulDiv( Dx, maxy - y2, Dy ); UNNECESSARY */ + e2 = (Int)TRUNC( maxy ); + f2 = 0; + } + else + { + e2 = (Int)TRUNC( y2 ); + f2 = (Int)FRAC( y2 ); + } + + if ( f1 > 0 ) + { + if ( e1 == e2 ) + return SUCCESS; + else + { + x1 += SMulDiv( Dx, ras.precision - f1, Dy ); + e1 += 1; + } + } + else + if ( ras.joint ) + { + ras.top--; + ras.joint = FALSE; + } + + ras.joint = (char)( f2 == 0 ); + + if ( ras.fresh ) + { + ras.cProfile->start = e1; + ras.fresh = FALSE; + } + + size = e2 - e1 + 1; + if ( ras.top + size >= ras.maxBuff ) + { + ras.error = FT_THROW( Overflow ); + return FAILURE; + } + + if ( Dx > 0 ) + { + Ix = SMulDiv_No_Round( ras.precision, Dx, Dy ); + Rx = ( ras.precision * Dx ) % Dy; + Dx = 1; + } + else + { + Ix = -SMulDiv_No_Round( ras.precision, -Dx, Dy ); + Rx = ( ras.precision * -Dx ) % Dy; + Dx = -1; + } + + Ax = -Dy; + top = ras.top; + + while ( size > 0 ) + { + *top++ = x1; + + x1 += Ix; + Ax += Rx; + if ( Ax >= 0 ) + { + Ax -= Dy; + x1 += Dx; + } + size--; + } + + ras.top = top; + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Line_Down */ + /* */ + /* */ + /* Compute the x-coordinates of an descending line segment and store */ + /* them in the render pool. */ + /* */ + /* */ + /* x1 :: The x-coordinate of the segment's start point. */ + /* */ + /* y1 :: The y-coordinate of the segment's start point. */ + /* */ + /* x2 :: The x-coordinate of the segment's end point. */ + /* */ + /* y2 :: The y-coordinate of the segment's end point. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Line_Down( RAS_ARGS Long x1, + Long y1, + Long x2, + Long y2, + Long miny, + Long maxy ) + { + Bool result, fresh; + + + fresh = ras.fresh; + + result = Line_Up( RAS_VARS x1, -y1, x2, -y2, -maxy, -miny ); + + if ( fresh && !ras.fresh ) + ras.cProfile->start = -ras.cProfile->start; + + return result; + } + + + /* A function type describing the functions used to split Bezier arcs */ + typedef void (*TSplitter)( TPoint* base ); + + + /*************************************************************************/ + /* */ + /* */ + /* Bezier_Up */ + /* */ + /* */ + /* Compute the x-coordinates of an ascending Bezier arc and store */ + /* them in the render pool. */ + /* */ + /* */ + /* degree :: The degree of the Bezier arc (either 2 or 3). */ + /* */ + /* splitter :: The function to split Bezier arcs. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Bezier_Up( RAS_ARGS Int degree, + TSplitter splitter, + Long miny, + Long maxy ) + { + Long y1, y2, e, e2, e0; + Short f1; + + TPoint* arc; + TPoint* start_arc; + + PLong top; + + + arc = ras.arc; + y1 = arc[degree].y; + y2 = arc[0].y; + top = ras.top; + + if ( y2 < miny || y1 > maxy ) + goto Fin; + + e2 = FLOOR( y2 ); + + if ( e2 > maxy ) + e2 = maxy; + + e0 = miny; + + if ( y1 < miny ) + e = miny; + else + { + e = CEILING( y1 ); + f1 = (Short)( FRAC( y1 ) ); + e0 = e; + + if ( f1 == 0 ) + { + if ( ras.joint ) + { + top--; + ras.joint = FALSE; + } + + *top++ = arc[degree].x; + + e += ras.precision; + } + } + + if ( ras.fresh ) + { + ras.cProfile->start = TRUNC( e0 ); + ras.fresh = FALSE; + } + + if ( e2 < e ) + goto Fin; + + if ( ( top + TRUNC( e2 - e ) + 1 ) >= ras.maxBuff ) + { + ras.top = top; + ras.error = FT_THROW( Overflow ); + return FAILURE; + } + + start_arc = arc; + + do + { + ras.joint = FALSE; + + y2 = arc[0].y; + + if ( y2 > e ) + { + y1 = arc[degree].y; + if ( y2 - y1 >= ras.precision_step ) + { + splitter( arc ); + arc += degree; + } + else + { + *top++ = arc[degree].x + FMulDiv( arc[0].x - arc[degree].x, + e - y1, y2 - y1 ); + arc -= degree; + e += ras.precision; + } + } + else + { + if ( y2 == e ) + { + ras.joint = TRUE; + *top++ = arc[0].x; + + e += ras.precision; + } + arc -= degree; + } + } while ( arc >= start_arc && e <= e2 ); + + Fin: + ras.top = top; + ras.arc -= degree; + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Bezier_Down */ + /* */ + /* */ + /* Compute the x-coordinates of an descending Bezier arc and store */ + /* them in the render pool. */ + /* */ + /* */ + /* degree :: The degree of the Bezier arc (either 2 or 3). */ + /* */ + /* splitter :: The function to split Bezier arcs. */ + /* */ + /* miny :: A lower vertical clipping bound value. */ + /* */ + /* maxy :: An upper vertical clipping bound value. */ + /* */ + /* */ + /* SUCCESS on success, FAILURE on render pool overflow. */ + /* */ + static Bool + Bezier_Down( RAS_ARGS Int degree, + TSplitter splitter, + Long miny, + Long maxy ) + { + TPoint* arc = ras.arc; + Bool result, fresh; + + + arc[0].y = -arc[0].y; + arc[1].y = -arc[1].y; + arc[2].y = -arc[2].y; + if ( degree > 2 ) + arc[3].y = -arc[3].y; + + fresh = ras.fresh; + + result = Bezier_Up( RAS_VARS degree, splitter, -maxy, -miny ); + + if ( fresh && !ras.fresh ) + ras.cProfile->start = -ras.cProfile->start; + + arc[0].y = -arc[0].y; + return result; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Line_To */ + /* */ + /* */ + /* Inject a new line segment and adjust the Profiles list. */ + /* */ + /* */ + /* x :: The x-coordinate of the segment's end point (its start point */ + /* is stored in `lastX'). */ + /* */ + /* y :: The y-coordinate of the segment's end point (its start point */ + /* is stored in `lastY'). */ + /* */ + /* */ + /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ + /* profile. */ + /* */ + static Bool + Line_To( RAS_ARGS Long x, + Long y ) + { + /* First, detect a change of direction */ + + switch ( ras.state ) + { + case Unknown_State: + if ( y > ras.lastY ) + { + if ( New_Profile( RAS_VARS Ascending_State, + IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + else + { + if ( y < ras.lastY ) + if ( New_Profile( RAS_VARS Descending_State, + IS_TOP_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + break; + + case Ascending_State: + if ( y < ras.lastY ) + { + if ( End_Profile( RAS_VARS IS_TOP_OVERSHOOT( ras.lastY ) ) || + New_Profile( RAS_VARS Descending_State, + IS_TOP_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + break; + + case Descending_State: + if ( y > ras.lastY ) + { + if ( End_Profile( RAS_VARS IS_BOTTOM_OVERSHOOT( ras.lastY ) ) || + New_Profile( RAS_VARS Ascending_State, + IS_BOTTOM_OVERSHOOT( ras.lastY ) ) ) + return FAILURE; + } + break; + + default: + ; + } + + /* Then compute the lines */ + + switch ( ras.state ) + { + case Ascending_State: + if ( Line_Up( RAS_VARS ras.lastX, ras.lastY, + x, y, ras.minY, ras.maxY ) ) + return FAILURE; + break; + + case Descending_State: + if ( Line_Down( RAS_VARS ras.lastX, ras.lastY, + x, y, ras.minY, ras.maxY ) ) + return FAILURE; + break; + + default: + ; + } + + ras.lastX = x; + ras.lastY = y; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Conic_To */ + /* */ + /* */ + /* Inject a new conic arc and adjust the profile list. */ + /* */ + /* */ + /* cx :: The x-coordinate of the arc's new control point. */ + /* */ + /* cy :: The y-coordinate of the arc's new control point. */ + /* */ + /* x :: The x-coordinate of the arc's end point (its start point is */ + /* stored in `lastX'). */ + /* */ + /* y :: The y-coordinate of the arc's end point (its start point is */ + /* stored in `lastY'). */ + /* */ + /* */ + /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ + /* profile. */ + /* */ + static Bool + Conic_To( RAS_ARGS Long cx, + Long cy, + Long x, + Long y ) + { + Long y1, y2, y3, x3, ymin, ymax; + TStates state_bez; + + + ras.arc = ras.arcs; + ras.arc[2].x = ras.lastX; + ras.arc[2].y = ras.lastY; + ras.arc[1].x = cx; + ras.arc[1].y = cy; + ras.arc[0].x = x; + ras.arc[0].y = y; + + do + { + y1 = ras.arc[2].y; + y2 = ras.arc[1].y; + y3 = ras.arc[0].y; + x3 = ras.arc[0].x; + + /* first, categorize the Bezier arc */ + + if ( y1 <= y3 ) + { + ymin = y1; + ymax = y3; + } + else + { + ymin = y3; + ymax = y1; + } + + if ( y2 < ymin || y2 > ymax ) + { + /* this arc has no given direction, split it! */ + Split_Conic( ras.arc ); + ras.arc += 2; + } + else if ( y1 == y3 ) + { + /* this arc is flat, ignore it and pop it from the Bezier stack */ + ras.arc -= 2; + } + else + { + /* the arc is y-monotonous, either ascending or descending */ + /* detect a change of direction */ + state_bez = y1 < y3 ? Ascending_State : Descending_State; + if ( ras.state != state_bez ) + { + Bool o = ( state_bez == Ascending_State ) + ? IS_BOTTOM_OVERSHOOT( y1 ) + : IS_TOP_OVERSHOOT( y1 ); + + + /* finalize current profile if any */ + if ( ras.state != Unknown_State && + End_Profile( RAS_VARS o ) ) + goto Fail; + + /* create a new profile */ + if ( New_Profile( RAS_VARS state_bez, o ) ) + goto Fail; + } + + /* now call the appropriate routine */ + if ( state_bez == Ascending_State ) + { + if ( Bezier_Up( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) ) + goto Fail; + } + else + if ( Bezier_Down( RAS_VARS 2, Split_Conic, ras.minY, ras.maxY ) ) + goto Fail; + } + + } while ( ras.arc >= ras.arcs ); + + ras.lastX = x3; + ras.lastY = y3; + + return SUCCESS; + + Fail: + return FAILURE; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Cubic_To */ + /* */ + /* */ + /* Inject a new cubic arc and adjust the profile list. */ + /* */ + /* */ + /* cx1 :: The x-coordinate of the arc's first new control point. */ + /* */ + /* cy1 :: The y-coordinate of the arc's first new control point. */ + /* */ + /* cx2 :: The x-coordinate of the arc's second new control point. */ + /* */ + /* cy2 :: The y-coordinate of the arc's second new control point. */ + /* */ + /* x :: The x-coordinate of the arc's end point (its start point is */ + /* stored in `lastX'). */ + /* */ + /* y :: The y-coordinate of the arc's end point (its start point is */ + /* stored in `lastY'). */ + /* */ + /* */ + /* SUCCESS on success, FAILURE on render pool overflow or incorrect */ + /* profile. */ + /* */ + static Bool + Cubic_To( RAS_ARGS Long cx1, + Long cy1, + Long cx2, + Long cy2, + Long x, + Long y ) + { + Long y1, y2, y3, y4, x4, ymin1, ymax1, ymin2, ymax2; + TStates state_bez; + + + ras.arc = ras.arcs; + ras.arc[3].x = ras.lastX; + ras.arc[3].y = ras.lastY; + ras.arc[2].x = cx1; + ras.arc[2].y = cy1; + ras.arc[1].x = cx2; + ras.arc[1].y = cy2; + ras.arc[0].x = x; + ras.arc[0].y = y; + + do + { + y1 = ras.arc[3].y; + y2 = ras.arc[2].y; + y3 = ras.arc[1].y; + y4 = ras.arc[0].y; + x4 = ras.arc[0].x; + + /* first, categorize the Bezier arc */ + + if ( y1 <= y4 ) + { + ymin1 = y1; + ymax1 = y4; + } + else + { + ymin1 = y4; + ymax1 = y1; + } + + if ( y2 <= y3 ) + { + ymin2 = y2; + ymax2 = y3; + } + else + { + ymin2 = y3; + ymax2 = y2; + } + + if ( ymin2 < ymin1 || ymax2 > ymax1 ) + { + /* this arc has no given direction, split it! */ + Split_Cubic( ras.arc ); + ras.arc += 3; + } + else if ( y1 == y4 ) + { + /* this arc is flat, ignore it and pop it from the Bezier stack */ + ras.arc -= 3; + } + else + { + state_bez = ( y1 <= y4 ) ? Ascending_State : Descending_State; + + /* detect a change of direction */ + if ( ras.state != state_bez ) + { + Bool o = ( state_bez == Ascending_State ) + ? IS_BOTTOM_OVERSHOOT( y1 ) + : IS_TOP_OVERSHOOT( y1 ); + + + /* finalize current profile if any */ + if ( ras.state != Unknown_State && + End_Profile( RAS_VARS o ) ) + goto Fail; + + if ( New_Profile( RAS_VARS state_bez, o ) ) + goto Fail; + } + + /* compute intersections */ + if ( state_bez == Ascending_State ) + { + if ( Bezier_Up( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) ) + goto Fail; + } + else + if ( Bezier_Down( RAS_VARS 3, Split_Cubic, ras.minY, ras.maxY ) ) + goto Fail; + } + + } while ( ras.arc >= ras.arcs ); + + ras.lastX = x4; + ras.lastY = y4; + + return SUCCESS; + + Fail: + return FAILURE; + } + + +#undef SWAP_ +#define SWAP_( x, y ) do \ + { \ + Long swap = x; \ + \ + \ + x = y; \ + y = swap; \ + } while ( 0 ) + + + /*************************************************************************/ + /* */ + /* */ + /* Decompose_Curve */ + /* */ + /* */ + /* Scan the outline arrays in order to emit individual segments and */ + /* Beziers by calling Line_To() and Bezier_To(). It handles all */ + /* weird cases, like when the first point is off the curve, or when */ + /* there are simply no `on' points in the contour! */ + /* */ + /* */ + /* first :: The index of the first point in the contour. */ + /* */ + /* last :: The index of the last point in the contour. */ + /* */ + /* flipped :: If set, flip the direction of the curve. */ + /* */ + /* */ + /* SUCCESS on success, FAILURE on error. */ + /* */ + static Bool + Decompose_Curve( RAS_ARGS UShort first, + UShort last, + Int flipped ) + { + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* points; + FT_Vector* point; + FT_Vector* limit; + char* tags; + + UInt tag; /* current point's state */ + + + points = ras.outline.points; + limit = points + last; + + v_start.x = SCALED( points[first].x ); + v_start.y = SCALED( points[first].y ); + v_last.x = SCALED( points[last].x ); + v_last.y = SCALED( points[last].y ); + + if ( flipped ) + { + SWAP_( v_start.x, v_start.y ); + SWAP_( v_last.x, v_last.y ); + } + + v_control = v_start; + + point = points + first; + tags = ras.outline.tags + first; + + /* set scan mode if necessary */ + if ( tags[0] & FT_CURVE_TAG_HAS_SCANMODE ) + ras.dropOutControl = (Byte)tags[0] >> 5; + + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( ras.outline.tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + /* v_last = v_start; */ + } + point--; + tags--; + } + + ras.lastX = v_start.x; + ras.lastY = v_start.y; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + Long x, y; + + + x = SCALED( point->x ); + y = SCALED( point->y ); + if ( flipped ) + SWAP_( x, y ); + + if ( Line_To( RAS_VARS x, y ) ) + goto Fail; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point[0].x ); + v_control.y = SCALED( point[0].y ); + + if ( flipped ) + SWAP_( v_control.x, v_control.y ); + + Do_Conic: + if ( point < limit ) + { + FT_Vector v_middle; + Long x, y; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + x = SCALED( point[0].x ); + y = SCALED( point[0].y ); + + if ( flipped ) + SWAP_( x, y ); + + if ( tag == FT_CURVE_TAG_ON ) + { + if ( Conic_To( RAS_VARS v_control.x, v_control.y, x, y ) ) + goto Fail; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + x ) / 2; + v_middle.y = ( v_control.y + y ) / 2; + + if ( Conic_To( RAS_VARS v_control.x, v_control.y, + v_middle.x, v_middle.y ) ) + goto Fail; + + v_control.x = x; + v_control.y = y; + + goto Do_Conic; + } + + if ( Conic_To( RAS_VARS v_control.x, v_control.y, + v_start.x, v_start.y ) ) + goto Fail; + + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + Long x1, y1, x2, y2, x3, y3; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + x1 = SCALED( point[-2].x ); + y1 = SCALED( point[-2].y ); + x2 = SCALED( point[-1].x ); + y2 = SCALED( point[-1].y ); + + if ( flipped ) + { + SWAP_( x1, y1 ); + SWAP_( x2, y2 ); + } + + if ( point <= limit ) + { + x3 = SCALED( point[0].x ); + y3 = SCALED( point[0].y ); + + if ( flipped ) + SWAP_( x3, y3 ); + + if ( Cubic_To( RAS_VARS x1, y1, x2, y2, x3, y3 ) ) + goto Fail; + continue; + } + + if ( Cubic_To( RAS_VARS x1, y1, x2, y2, v_start.x, v_start.y ) ) + goto Fail; + goto Close; + } + } + } + + /* close the contour with a line segment */ + if ( Line_To( RAS_VARS v_start.x, v_start.y ) ) + goto Fail; + + Close: + return SUCCESS; + + Invalid_Outline: + ras.error = FT_THROW( Invalid ); + + Fail: + return FAILURE; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Convert_Glyph */ + /* */ + /* */ + /* Convert a glyph into a series of segments and arcs and make a */ + /* profiles list with them. */ + /* */ + /* */ + /* flipped :: If set, flip the direction of curve. */ + /* */ + /* */ + /* SUCCESS on success, FAILURE if any error was encountered during */ + /* rendering. */ + /* */ + static Bool + Convert_Glyph( RAS_ARGS Int flipped ) + { + Int i; + UInt start; + + + ras.fProfile = NULL; + ras.joint = FALSE; + ras.fresh = FALSE; + + ras.maxBuff = ras.sizeBuff - AlignProfileSize; + + ras.numTurns = 0; + + ras.cProfile = (PProfile)ras.top; + ras.cProfile->offset = ras.top; + ras.num_Profs = 0; + + start = 0; + + for ( i = 0; i < ras.outline.n_contours; i++ ) + { + PProfile lastProfile; + Bool o; + + + ras.state = Unknown_State; + ras.gProfile = NULL; + + if ( Decompose_Curve( RAS_VARS (UShort)start, + (UShort)ras.outline.contours[i], + flipped ) ) + return FAILURE; + + start = (UShort)ras.outline.contours[i] + 1; + + /* we must now check whether the extreme arcs join or not */ + if ( FRAC( ras.lastY ) == 0 && + ras.lastY >= ras.minY && + ras.lastY <= ras.maxY ) + if ( ras.gProfile && + ( ras.gProfile->flags & Flow_Up ) == + ( ras.cProfile->flags & Flow_Up ) ) + ras.top--; + /* Note that ras.gProfile can be nil if the contour was too small */ + /* to be drawn. */ + + lastProfile = ras.cProfile; + if ( ras.top != ras.cProfile->offset && + ( ras.cProfile->flags & Flow_Up ) ) + o = IS_TOP_OVERSHOOT( ras.lastY ); + else + o = IS_BOTTOM_OVERSHOOT( ras.lastY ); + if ( End_Profile( RAS_VARS o ) ) + return FAILURE; + + /* close the `next profile in contour' linked list */ + if ( ras.gProfile ) + lastProfile->next = ras.gProfile; + } + + if ( Finalize_Profile_Table( RAS_VAR ) ) + return FAILURE; + + return (Bool)( ras.top < ras.maxBuff ? SUCCESS : FAILURE ); + } + + + /*************************************************************************/ + /*************************************************************************/ + /** **/ + /** SCAN-LINE SWEEPS AND DRAWING **/ + /** **/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Init_Linked */ + /* */ + /* Initializes an empty linked list. */ + /* */ + static void + Init_Linked( TProfileList* l ) + { + *l = NULL; + } + + + /*************************************************************************/ + /* */ + /* InsNew */ + /* */ + /* Inserts a new profile in a linked list. */ + /* */ + static void + InsNew( PProfileList list, + PProfile profile ) + { + PProfile *old, current; + Long x; + + + old = list; + current = *old; + x = profile->X; + + while ( current ) + { + if ( x < current->X ) + break; + old = ¤t->link; + current = *old; + } + + profile->link = current; + *old = profile; + } + + + /*************************************************************************/ + /* */ + /* DelOld */ + /* */ + /* Removes an old profile from a linked list. */ + /* */ + static void + DelOld( PProfileList list, + PProfile profile ) + { + PProfile *old, current; + + + old = list; + current = *old; + + while ( current ) + { + if ( current == profile ) + { + *old = current->link; + return; + } + + old = ¤t->link; + current = *old; + } + + /* we should never get there, unless the profile was not part of */ + /* the list. */ + } + + + /*************************************************************************/ + /* */ + /* Sort */ + /* */ + /* Sorts a trace list. In 95%, the list is already sorted. We need */ + /* an algorithm which is fast in this case. Bubble sort is enough */ + /* and simple. */ + /* */ + static void + Sort( PProfileList list ) + { + PProfile *old, current, next; + + + /* First, set the new X coordinate of each profile */ + current = *list; + while ( current ) + { + current->X = *current->offset; + current->offset += ( current->flags & Flow_Up ) ? 1 : -1; + current->height--; + current = current->link; + } + + /* Then sort them */ + old = list; + current = *old; + + if ( !current ) + return; + + next = current->link; + + while ( next ) + { + if ( current->X <= next->X ) + { + old = ¤t->link; + current = *old; + + if ( !current ) + return; + } + else + { + *old = next; + current->link = next->link; + next->link = current; + + old = list; + current = *old; + } + + next = current->link; + } + } + + + /*************************************************************************/ + /* */ + /* Vertical Sweep Procedure Set */ + /* */ + /* These four routines are used during the vertical black/white sweep */ + /* phase by the generic Draw_Sweep() function. */ + /* */ + /*************************************************************************/ + + static void + Vertical_Sweep_Init( RAS_ARGS Short* min, + Short* max ) + { + Long pitch = ras.target.pitch; + + FT_UNUSED( max ); + + + ras.traceIncr = (Short)-pitch; + ras.traceOfs = -*min * pitch; + if ( pitch > 0 ) + ras.traceOfs += (Long)( ras.target.rows - 1 ) * pitch; + } + + + static void + Vertical_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2; + Byte* target; + + Int dropOutControl = left->flags & 7; + + FT_UNUSED( y ); + FT_UNUSED( left ); + FT_UNUSED( right ); + + + /* in high-precision mode, we need 12 digits after the comma to */ + /* represent multiples of 1/(1<<12) = 1/4096 */ + FT_TRACE7(( " y=%d x=[%.12f;%.12f], drop-out=%d", + y, + x1 / (double)ras.precision, + x2 / (double)ras.precision, + dropOutControl )); + + /* Drop-out control */ + + e1 = TRUNC( CEILING( x1 ) ); + + if ( dropOutControl != 2 && + x2 - x1 - ras.precision <= ras.precision_jitter ) + e2 = e1; + else + e2 = TRUNC( FLOOR( x2 ) ); + + if ( e2 >= 0 && e1 < ras.bWidth ) + { + Int c1, c2; + Byte f1, f2; + + + if ( e1 < 0 ) + e1 = 0; + if ( e2 >= ras.bWidth ) + e2 = ras.bWidth - 1; + + FT_TRACE7(( " -> x=[%d;%d]", e1, e2 )); + + c1 = (Short)( e1 >> 3 ); + c2 = (Short)( e2 >> 3 ); + + f1 = (Byte) ( 0xFF >> ( e1 & 7 ) ); + f2 = (Byte) ~( 0x7F >> ( e2 & 7 ) ); + + target = ras.bTarget + ras.traceOfs + c1; + c2 -= c1; + + if ( c2 > 0 ) + { + target[0] |= f1; + + /* memset() is slower than the following code on many platforms. */ + /* This is due to the fact that, in the vast majority of cases, */ + /* the span length in bytes is relatively small. */ + c2--; + while ( c2 > 0 ) + { + *(++target) = 0xFF; + c2--; + } + target[1] |= f2; + } + else + *target |= ( f1 & f2 ); + } + + FT_TRACE7(( "\n" )); + } + + + static void + Vertical_Sweep_Drop( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2, pxl; + Short c1, f1; + + + FT_TRACE7(( " y=%d x=[%.12f;%.12f]", + y, + x1 / (double)ras.precision, + x2 / (double)ras.precision )); + + /* Drop-out control */ + + /* e2 x2 x1 e1 */ + /* */ + /* ^ | */ + /* | | */ + /* +-------------+---------------------+------------+ */ + /* | | */ + /* | v */ + /* */ + /* pixel contour contour pixel */ + /* center center */ + + /* drop-out mode scan conversion rules (as defined in OpenType) */ + /* --------------------------------------------------------------- */ + /* 0 1, 2, 3 */ + /* 1 1, 2, 4 */ + /* 2 1, 2 */ + /* 3 same as mode 2 */ + /* 4 1, 2, 5 */ + /* 5 1, 2, 6 */ + /* 6, 7 same as mode 2 */ + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + pxl = e1; + + if ( e1 > e2 ) + { + Int dropOutControl = left->flags & 7; + + + FT_TRACE7(( ", drop-out=%d", dropOutControl )); + + if ( e1 == e2 + ras.precision ) + { + switch ( dropOutControl ) + { + case 0: /* simple drop-outs including stubs */ + pxl = e2; + break; + + case 4: /* smart drop-outs including stubs */ + pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + break; + + case 1: /* simple drop-outs excluding stubs */ + case 5: /* smart drop-outs excluding stubs */ + + /* Drop-out Control Rules #4 and #6 */ + + /* The specification neither provides an exact definition */ + /* of a `stub' nor gives exact rules to exclude them. */ + /* */ + /* Here the constraints we use to recognize a stub. */ + /* */ + /* upper stub: */ + /* */ + /* - P_Left and P_Right are in the same contour */ + /* - P_Right is the successor of P_Left in that contour */ + /* - y is the top of P_Left and P_Right */ + /* */ + /* lower stub: */ + /* */ + /* - P_Left and P_Right are in the same contour */ + /* - P_Left is the successor of P_Right in that contour */ + /* - y is the bottom of P_Left */ + /* */ + /* We draw a stub if the following constraints are met. */ + /* */ + /* - for an upper or lower stub, there is top or bottom */ + /* overshoot, respectively */ + /* - the covered interval is greater or equal to a half */ + /* pixel */ + + /* upper stub test */ + if ( left->next == right && + left->height <= 0 && + !( left->flags & Overshoot_Top && + x2 - x1 >= ras.precision_half ) ) + goto Exit; + + /* lower stub test */ + if ( right->next == left && + left->start == y && + !( left->flags & Overshoot_Bottom && + x2 - x1 >= ras.precision_half ) ) + goto Exit; + + if ( dropOutControl == 1 ) + pxl = e2; + else + pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + break; + + default: /* modes 2, 3, 6, 7 */ + goto Exit; /* no drop-out control */ + } + + /* undocumented but confirmed: If the drop-out would result in a */ + /* pixel outside of the bounding box, use the pixel inside of the */ + /* bounding box instead */ + if ( pxl < 0 ) + pxl = e1; + else if ( TRUNC( pxl ) >= ras.bWidth ) + pxl = e2; + + /* check that the other pixel isn't set */ + e1 = ( pxl == e1 ) ? e2 : e1; + + e1 = TRUNC( e1 ); + + c1 = (Short)( e1 >> 3 ); + f1 = (Short)( e1 & 7 ); + + if ( e1 >= 0 && e1 < ras.bWidth && + ras.bTarget[ras.traceOfs + c1] & ( 0x80 >> f1 ) ) + goto Exit; + } + else + goto Exit; + } + + e1 = TRUNC( pxl ); + + if ( e1 >= 0 && e1 < ras.bWidth ) + { + FT_TRACE7(( " -> x=%d (drop-out)", e1 )); + + c1 = (Short)( e1 >> 3 ); + f1 = (Short)( e1 & 7 ); + + ras.bTarget[ras.traceOfs + c1] |= (char)( 0x80 >> f1 ); + } + + Exit: + FT_TRACE7(( "\n" )); + } + + + static void + Vertical_Sweep_Step( RAS_ARG ) + { + ras.traceOfs += ras.traceIncr; + } + + + /***********************************************************************/ + /* */ + /* Horizontal Sweep Procedure Set */ + /* */ + /* These four routines are used during the horizontal black/white */ + /* sweep phase by the generic Draw_Sweep() function. */ + /* */ + /***********************************************************************/ + + static void + Horizontal_Sweep_Init( RAS_ARGS Short* min, + Short* max ) + { + /* nothing, really */ + FT_UNUSED_RASTER; + FT_UNUSED( min ); + FT_UNUSED( max ); + } + + + static void + Horizontal_Sweep_Span( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + FT_UNUSED( left ); + FT_UNUSED( right ); + + + if ( x2 - x1 < ras.precision ) + { + Long e1, e2; + + + FT_TRACE7(( " x=%d y=[%.12f;%.12f]", + y, + x1 / (double)ras.precision, + x2 / (double)ras.precision )); + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + + if ( e1 == e2 ) + { + e1 = TRUNC( e1 ); + + if ( e1 >= 0 && (ULong)e1 < ras.target.rows ) + { + Byte f1; + PByte bits; + PByte p; + + + FT_TRACE7(( " -> y=%d (drop-out)", e1 )); + + bits = ras.bTarget + ( y >> 3 ); + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + p = bits - e1 * ras.target.pitch; + + if ( ras.target.pitch > 0 ) + p += (Long)( ras.target.rows - 1 ) * ras.target.pitch; + + p[0] |= f1; + } + } + + FT_TRACE7(( "\n" )); + } + } + + + static void + Horizontal_Sweep_Drop( RAS_ARGS Short y, + FT_F26Dot6 x1, + FT_F26Dot6 x2, + PProfile left, + PProfile right ) + { + Long e1, e2, pxl; + PByte bits; + Byte f1; + + + FT_TRACE7(( " x=%d y=[%.12f;%.12f]", + y, + x1 / (double)ras.precision, + x2 / (double)ras.precision )); + + /* During the horizontal sweep, we only take care of drop-outs */ + + /* e1 + <-- pixel center */ + /* | */ + /* x1 ---+--> <-- contour */ + /* | */ + /* | */ + /* x2 <--+--- <-- contour */ + /* | */ + /* | */ + /* e2 + <-- pixel center */ + + e1 = CEILING( x1 ); + e2 = FLOOR ( x2 ); + pxl = e1; + + if ( e1 > e2 ) + { + Int dropOutControl = left->flags & 7; + + + FT_TRACE7(( ", dropout=%d", dropOutControl )); + + if ( e1 == e2 + ras.precision ) + { + switch ( dropOutControl ) + { + case 0: /* simple drop-outs including stubs */ + pxl = e2; + break; + + case 4: /* smart drop-outs including stubs */ + pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + break; + + case 1: /* simple drop-outs excluding stubs */ + case 5: /* smart drop-outs excluding stubs */ + /* see Vertical_Sweep_Drop for details */ + + /* rightmost stub test */ + if ( left->next == right && + left->height <= 0 && + !( left->flags & Overshoot_Top && + x2 - x1 >= ras.precision_half ) ) + goto Exit; + + /* leftmost stub test */ + if ( right->next == left && + left->start == y && + !( left->flags & Overshoot_Bottom && + x2 - x1 >= ras.precision_half ) ) + goto Exit; + + if ( dropOutControl == 1 ) + pxl = e2; + else + pxl = FLOOR( ( x1 + x2 - 1 ) / 2 + ras.precision_half ); + break; + + default: /* modes 2, 3, 6, 7 */ + goto Exit; /* no drop-out control */ + } + + /* undocumented but confirmed: If the drop-out would result in a */ + /* pixel outside of the bounding box, use the pixel inside of the */ + /* bounding box instead */ + if ( pxl < 0 ) + pxl = e1; + else if ( (ULong)( TRUNC( pxl ) ) >= ras.target.rows ) + pxl = e2; + + /* check that the other pixel isn't set */ + e1 = ( pxl == e1 ) ? e2 : e1; + + e1 = TRUNC( e1 ); + + bits = ras.bTarget + ( y >> 3 ); + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + + bits -= e1 * ras.target.pitch; + if ( ras.target.pitch > 0 ) + bits += (Long)( ras.target.rows - 1 ) * ras.target.pitch; + + if ( e1 >= 0 && + (ULong)e1 < ras.target.rows && + *bits & f1 ) + goto Exit; + } + else + goto Exit; + } + + e1 = TRUNC( pxl ); + + if ( e1 >= 0 && (ULong)e1 < ras.target.rows ) + { + FT_TRACE7(( " -> y=%d (drop-out)", e1 )); + + bits = ras.bTarget + ( y >> 3 ); + f1 = (Byte)( 0x80 >> ( y & 7 ) ); + bits -= e1 * ras.target.pitch; + + if ( ras.target.pitch > 0 ) + bits += (Long)( ras.target.rows - 1 ) * ras.target.pitch; + + bits[0] |= f1; + } + + Exit: + FT_TRACE7(( "\n" )); + } + + + static void + Horizontal_Sweep_Step( RAS_ARG ) + { + /* Nothing, really */ + FT_UNUSED_RASTER; + } + + + /*************************************************************************/ + /* */ + /* Generic Sweep Drawing routine */ + /* */ + /*************************************************************************/ + + static Bool + Draw_Sweep( RAS_ARG ) + { + Short y, y_change, y_height; + + PProfile P, Q, P_Left, P_Right; + + Short min_Y, max_Y, top, bottom, dropouts; + + Long x1, x2, xs, e1, e2; + + TProfileList waiting; + TProfileList draw_left, draw_right; + + + /* initialize empty linked lists */ + + Init_Linked( &waiting ); + + Init_Linked( &draw_left ); + Init_Linked( &draw_right ); + + /* first, compute min and max Y */ + + P = ras.fProfile; + max_Y = (Short)TRUNC( ras.minY ); + min_Y = (Short)TRUNC( ras.maxY ); + + while ( P ) + { + Q = P->link; + + bottom = (Short)P->start; + top = (Short)( P->start + P->height - 1 ); + + if ( min_Y > bottom ) + min_Y = bottom; + if ( max_Y < top ) + max_Y = top; + + P->X = 0; + InsNew( &waiting, P ); + + P = Q; + } + + /* check the Y-turns */ + if ( ras.numTurns == 0 ) + { + ras.error = FT_THROW( Invalid ); + return FAILURE; + } + + /* now initialize the sweep */ + + ras.Proc_Sweep_Init( RAS_VARS &min_Y, &max_Y ); + + /* then compute the distance of each profile from min_Y */ + + P = waiting; + + while ( P ) + { + P->countL = P->start - min_Y; + P = P->link; + } + + /* let's go */ + + y = min_Y; + y_height = 0; + + if ( ras.numTurns > 0 && + ras.sizeBuff[-ras.numTurns] == min_Y ) + ras.numTurns--; + + while ( ras.numTurns > 0 ) + { + /* check waiting list for new activations */ + + P = waiting; + + while ( P ) + { + Q = P->link; + P->countL -= y_height; + if ( P->countL == 0 ) + { + DelOld( &waiting, P ); + + if ( P->flags & Flow_Up ) + InsNew( &draw_left, P ); + else + InsNew( &draw_right, P ); + } + + P = Q; + } + + /* sort the drawing lists */ + + Sort( &draw_left ); + Sort( &draw_right ); + + y_change = (Short)ras.sizeBuff[-ras.numTurns--]; + y_height = (Short)( y_change - y ); + + while ( y < y_change ) + { + /* let's trace */ + + dropouts = 0; + + P_Left = draw_left; + P_Right = draw_right; + + while ( P_Left ) + { + x1 = P_Left ->X; + x2 = P_Right->X; + + if ( x1 > x2 ) + { + xs = x1; + x1 = x2; + x2 = xs; + } + + e1 = FLOOR( x1 ); + e2 = CEILING( x2 ); + + if ( x2 - x1 <= ras.precision && + e1 != x1 && e2 != x2 ) + { + if ( e1 > e2 || e2 == e1 + ras.precision ) + { + Int dropOutControl = P_Left->flags & 7; + + + if ( dropOutControl != 2 ) + { + /* a drop-out was detected */ + + P_Left ->X = x1; + P_Right->X = x2; + + /* mark profile for drop-out processing */ + P_Left->countL = 1; + dropouts++; + } + + goto Skip_To_Next; + } + } + + ras.Proc_Sweep_Span( RAS_VARS y, x1, x2, P_Left, P_Right ); + + Skip_To_Next: + + P_Left = P_Left->link; + P_Right = P_Right->link; + } + + /* handle drop-outs _after_ the span drawing -- */ + /* drop-out processing has been moved out of the loop */ + /* for performance tuning */ + if ( dropouts > 0 ) + goto Scan_DropOuts; + + Next_Line: + + ras.Proc_Sweep_Step( RAS_VAR ); + + y++; + + if ( y < y_change ) + { + Sort( &draw_left ); + Sort( &draw_right ); + } + } + + /* now finalize the profiles that need it */ + + P = draw_left; + while ( P ) + { + Q = P->link; + if ( P->height == 0 ) + DelOld( &draw_left, P ); + P = Q; + } + + P = draw_right; + while ( P ) + { + Q = P->link; + if ( P->height == 0 ) + DelOld( &draw_right, P ); + P = Q; + } + } + + /* for gray-scaling, flush the bitmap scanline cache */ + while ( y <= max_Y ) + { + ras.Proc_Sweep_Step( RAS_VAR ); + y++; + } + + return SUCCESS; + + Scan_DropOuts: + + P_Left = draw_left; + P_Right = draw_right; + + while ( P_Left ) + { + if ( P_Left->countL ) + { + P_Left->countL = 0; +#if 0 + dropouts--; /* -- this is useful when debugging only */ +#endif + ras.Proc_Sweep_Drop( RAS_VARS y, + P_Left->X, + P_Right->X, + P_Left, + P_Right ); + } + + P_Left = P_Left->link; + P_Right = P_Right->link; + } + + goto Next_Line; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Render_Single_Pass */ + /* */ + /* */ + /* Perform one sweep with sub-banding. */ + /* */ + /* */ + /* flipped :: If set, flip the direction of the outline. */ + /* */ + /* */ + /* Renderer error code. */ + /* */ + static int + Render_Single_Pass( RAS_ARGS Bool flipped ) + { + Short i, j, k; + + + while ( ras.band_top >= 0 ) + { + ras.maxY = (Long)ras.band_stack[ras.band_top].y_max * ras.precision; + ras.minY = (Long)ras.band_stack[ras.band_top].y_min * ras.precision; + + ras.top = ras.buff; + + ras.error = Raster_Err_None; + + if ( Convert_Glyph( RAS_VARS flipped ) ) + { + if ( ras.error != Raster_Err_Overflow ) + return FAILURE; + + ras.error = Raster_Err_None; + + /* sub-banding */ + +#ifdef DEBUG_RASTER + ClearBand( RAS_VARS TRUNC( ras.minY ), TRUNC( ras.maxY ) ); +#endif + + i = ras.band_stack[ras.band_top].y_min; + j = ras.band_stack[ras.band_top].y_max; + + k = (Short)( ( i + j ) / 2 ); + + if ( ras.band_top >= 7 || k < i ) + { + ras.band_top = 0; + ras.error = FT_THROW( Invalid ); + + return ras.error; + } + + ras.band_stack[ras.band_top + 1].y_min = k; + ras.band_stack[ras.band_top + 1].y_max = j; + + ras.band_stack[ras.band_top].y_max = (Short)( k - 1 ); + + ras.band_top++; + } + else + { + if ( ras.fProfile ) + if ( Draw_Sweep( RAS_VAR ) ) + return ras.error; + ras.band_top--; + } + } + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Render_Glyph */ + /* */ + /* */ + /* Render a glyph in a bitmap. Sub-banding if needed. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Render_Glyph( RAS_ARG ) + { + FT_Error error; + + + Set_High_Precision( RAS_VARS ras.outline.flags & + FT_OUTLINE_HIGH_PRECISION ); + ras.scale_shift = ras.precision_shift; + + if ( ras.outline.flags & FT_OUTLINE_IGNORE_DROPOUTS ) + ras.dropOutControl = 2; + else + { + if ( ras.outline.flags & FT_OUTLINE_SMART_DROPOUTS ) + ras.dropOutControl = 4; + else + ras.dropOutControl = 0; + + if ( !( ras.outline.flags & FT_OUTLINE_INCLUDE_STUBS ) ) + ras.dropOutControl += 1; + } + + ras.second_pass = (Bool)( !( ras.outline.flags & + FT_OUTLINE_SINGLE_PASS ) ); + + /* Vertical Sweep */ + FT_TRACE7(( "Vertical pass (ftraster)\n" )); + + ras.Proc_Sweep_Init = Vertical_Sweep_Init; + ras.Proc_Sweep_Span = Vertical_Sweep_Span; + ras.Proc_Sweep_Drop = Vertical_Sweep_Drop; + ras.Proc_Sweep_Step = Vertical_Sweep_Step; + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = (Short)( ras.target.rows - 1 ); + + ras.bWidth = (UShort)ras.target.width; + ras.bTarget = (Byte*)ras.target.buffer; + + if ( ( error = Render_Single_Pass( RAS_VARS 0 ) ) != 0 ) + return error; + + /* Horizontal Sweep */ + if ( ras.second_pass && ras.dropOutControl != 2 ) + { + FT_TRACE7(( "Horizontal pass (ftraster)\n" )); + + ras.Proc_Sweep_Init = Horizontal_Sweep_Init; + ras.Proc_Sweep_Span = Horizontal_Sweep_Span; + ras.Proc_Sweep_Drop = Horizontal_Sweep_Drop; + ras.Proc_Sweep_Step = Horizontal_Sweep_Step; + + ras.band_top = 0; + ras.band_stack[0].y_min = 0; + ras.band_stack[0].y_max = (Short)( ras.target.width - 1 ); + + if ( ( error = Render_Single_Pass( RAS_VARS 1 ) ) != 0 ) + return error; + } + + return Raster_Err_None; + } + + + static void + ft_black_init( black_PRaster raster ) + { + FT_UNUSED( raster ); + } + + + /**** RASTER OBJECT CREATION: In standalone mode, we simply use *****/ + /**** a static object. *****/ + + +#ifdef STANDALONE_ + + + static int + ft_black_new( void* memory, + FT_Raster *araster ) + { + static black_TRaster the_raster; + FT_UNUSED( memory ); + + + *araster = (FT_Raster)&the_raster; + FT_ZERO( &the_raster ); + ft_black_init( &the_raster ); + + return 0; + } + + + static void + ft_black_done( FT_Raster raster ) + { + /* nothing */ + FT_UNUSED( raster ); + } + + +#else /* !STANDALONE_ */ + + + static int + ft_black_new( FT_Memory memory, + black_PRaster *araster ) + { + FT_Error error; + black_PRaster raster = NULL; + + + *araster = 0; + if ( !FT_NEW( raster ) ) + { + raster->memory = memory; + ft_black_init( raster ); + + *araster = raster; + } + + return error; + } + + + static void + ft_black_done( black_PRaster raster ) + { + FT_Memory memory = (FT_Memory)raster->memory; + + + FT_FREE( raster ); + } + + +#endif /* !STANDALONE_ */ + + + static void + ft_black_reset( FT_Raster raster, + PByte pool_base, + ULong pool_size ) + { + FT_UNUSED( raster ); + FT_UNUSED( pool_base ); + FT_UNUSED( pool_size ); + } + + + static int + ft_black_set_mode( FT_Raster raster, + ULong mode, + void* args ) + { + FT_UNUSED( raster ); + FT_UNUSED( mode ); + FT_UNUSED( args ); + + return 0; + } + + + static int + ft_black_render( FT_Raster raster, + const FT_Raster_Params* params ) + { + const FT_Outline* outline = (const FT_Outline*)params->source; + const FT_Bitmap* target_map = params->target; + + black_TWorker worker[1]; + + Long buffer[FT_MAX_BLACK_POOL]; + + + if ( !raster ) + return FT_THROW( Not_Ini ); + + if ( !outline ) + return FT_THROW( Invalid ); + + /* return immediately if the outline is empty */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + return Raster_Err_None; + + if ( !outline->contours || !outline->points ) + return FT_THROW( Invalid ); + + if ( outline->n_points != + outline->contours[outline->n_contours - 1] + 1 ) + return FT_THROW( Invalid ); + + /* this version of the raster does not support direct rendering, sorry */ + if ( params->flags & FT_RASTER_FLAG_DIRECT ) + return FT_THROW( Unsupported ); + + if ( params->flags & FT_RASTER_FLAG_AA ) + return FT_THROW( Unsupported ); + + if ( !target_map ) + return FT_THROW( Invalid ); + + /* nothing to do */ + if ( !target_map->width || !target_map->rows ) + return Raster_Err_None; + + if ( !target_map->buffer ) + return FT_THROW( Invalid ); + + /* reject too large outline coordinates */ + { + FT_Vector* vec = outline->points; + FT_Vector* limit = vec + outline->n_points; + + + for ( ; vec < limit; vec++ ) + { + if ( vec->x < -0x1000000L || vec->x > 0x1000000L || + vec->y < -0x1000000L || vec->y > 0x1000000L ) + return FT_THROW( Invalid ); + } + } + + ras.outline = *outline; + ras.target = *target_map; + + worker->buff = buffer; + worker->sizeBuff = (&buffer)[1]; /* Points to right after buffer. */ + + return Render_Glyph( RAS_VAR ); + } + + + FT_DEFINE_RASTER_FUNCS( + ft_standard_raster, + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Raster_New_Func) ft_black_new, /* raster_new */ + (FT_Raster_Reset_Func) ft_black_reset, /* raster_reset */ + (FT_Raster_Set_Mode_Func)ft_black_set_mode, /* raster_set_mode */ + (FT_Raster_Render_Func) ft_black_render, /* raster_render */ + (FT_Raster_Done_Func) ft_black_done /* raster_done */ + ) + + +/* END */ diff --git a/vendor/FreeType2/src/raster/ftraster.h b/vendor/FreeType2/src/raster/ftraster.h new file mode 100644 index 0000000..40b5d6d --- /dev/null +++ b/vendor/FreeType2/src/raster/ftraster.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* ftraster.h */ +/* */ +/* The FreeType glyph rasterizer (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef FTRASTER_H_ +#define FTRASTER_H_ + + +#include +#include FT_CONFIG_CONFIG_H +#include FT_IMAGE_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* Uncomment the following line if you are using ftraster.c as a */ + /* standalone module, fully independent of FreeType. */ + /* */ +/* #define STANDALONE_ */ + + FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_standard_raster; + + +FT_END_HEADER + +#endif /* FTRASTER_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/raster/ftrend1.c b/vendor/FreeType2/src/raster/ftrend1.c new file mode 100644 index 0000000..a7ce973 --- /dev/null +++ b/vendor/FreeType2/src/raster/ftrend1.c @@ -0,0 +1,204 @@ +/***************************************************************************/ +/* */ +/* ftrend1.c */ +/* */ +/* The FreeType glyph rasterizer interface (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_OUTLINE_H +#include "ftrend1.h" +#include "ftraster.h" +#include "rastpic.h" + +#include "rasterrs.h" + + + /* initialize renderer -- init its raster */ + static FT_Error + ft_raster1_init( FT_Renderer render ) + { + render->clazz->raster_class->raster_reset( render->raster, NULL, 0 ); + + return FT_Err_Ok; + } + + + /* set render-specific mode */ + static FT_Error + ft_raster1_set_mode( FT_Renderer render, + FT_ULong mode_tag, + FT_Pointer data ) + { + /* we simply pass it to the raster */ + return render->clazz->raster_class->raster_set_mode( render->raster, + mode_tag, + data ); + } + + + /* transform a given glyph image */ + static FT_Error + ft_raster1_transform( FT_Renderer render, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_Error error = FT_Err_Ok; + + + if ( slot->format != render->glyph_format ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( matrix ) + FT_Outline_Transform( &slot->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &slot->outline, delta->x, delta->y ); + + Exit: + return error; + } + + + /* return the glyph's control box */ + static void + ft_raster1_get_cbox( FT_Renderer render, + FT_GlyphSlot slot, + FT_BBox* cbox ) + { + FT_ZERO( cbox ); + + if ( slot->format == render->glyph_format ) + FT_Outline_Get_CBox( &slot->outline, cbox ); + } + + + /* convert a slot's glyph image into a bitmap */ + static FT_Error + ft_raster1_render( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + FT_Error error = FT_Err_Ok; + FT_Outline* outline = &slot->outline; + FT_Bitmap* bitmap = &slot->bitmap; + FT_Memory memory = render->root.memory; + FT_Pos x_shift = 0; + FT_Pos y_shift = 0; + + FT_Raster_Params params; + + + /* check glyph image format */ + if ( slot->format != render->glyph_format ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* check rendering mode */ + if ( mode != FT_RENDER_MODE_MONO ) + { + /* raster1 is only capable of producing monochrome bitmaps */ + return FT_THROW( Cannot_Render_Glyph ); + } + + /* release old bitmap buffer */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + ft_glyphslot_preset_bitmap( slot, mode, origin ); + + /* allocate new one */ + if ( FT_ALLOC_MULT( bitmap->buffer, bitmap->rows, bitmap->pitch ) ) + goto Exit; + + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + x_shift = -slot->bitmap_left * 64; + y_shift = ( (FT_Int)bitmap->rows - slot->bitmap_top ) * 64; + + if ( origin ) + { + x_shift += origin->x; + y_shift += origin->y; + } + + /* translate outline to render it into the bitmap */ + if ( x_shift || y_shift ) + FT_Outline_Translate( outline, x_shift, y_shift ); + + /* set up parameters */ + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_DEFAULT; + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, ¶ms ); + + Exit: + if ( !error ) + /* everything is fine; the glyph is now officially a bitmap */ + slot->format = FT_GLYPH_FORMAT_BITMAP; + else if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + if ( x_shift || y_shift ) + FT_Outline_Translate( outline, -x_shift, -y_shift ); + + return error; + } + + + FT_DEFINE_RENDERER( + ft_raster1_renderer_class, + + FT_MODULE_RENDERER, + sizeof ( FT_RendererRec ), + + "raster1", + 0x10000L, + 0x20000L, + + NULL, /* module specific interface */ + + (FT_Module_Constructor)ft_raster1_init, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) NULL, /* get_interface */ + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_raster1_render, /* render_glyph */ + (FT_Renderer_TransformFunc)ft_raster1_transform, /* transform_glyph */ + (FT_Renderer_GetCBoxFunc) ft_raster1_get_cbox, /* get_glyph_cbox */ + (FT_Renderer_SetModeFunc) ft_raster1_set_mode, /* set_mode */ + + (FT_Raster_Funcs*)&FT_STANDARD_RASTER_GET /* raster_class */ + ) + + +/* END */ diff --git a/vendor/FreeType2/src/raster/ftrend1.h b/vendor/FreeType2/src/raster/ftrend1.h new file mode 100644 index 0000000..2abdf2d --- /dev/null +++ b/vendor/FreeType2/src/raster/ftrend1.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* ftrend1.h */ +/* */ +/* The FreeType glyph rasterizer interface (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef FTREND1_H_ +#define FTREND1_H_ + + +#include +#include FT_RENDER_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_RENDERER( ft_raster1_renderer_class ) + + +FT_END_HEADER + +#endif /* FTREND1_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/raster/raster.c b/vendor/FreeType2/src/raster/raster.c new file mode 100644 index 0000000..76edd21 --- /dev/null +++ b/vendor/FreeType2/src/raster/raster.c @@ -0,0 +1,27 @@ +/***************************************************************************/ +/* */ +/* raster.c */ +/* */ +/* FreeType monochrome rasterer module component (body only). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT +#include + +#include "ftraster.c" +#include "ftrend1.c" +#include "rastpic.c" + + +/* END */ diff --git a/vendor/FreeType2/src/raster/rasterrs.h b/vendor/FreeType2/src/raster/rasterrs.h new file mode 100644 index 0000000..22a3e15 --- /dev/null +++ b/vendor/FreeType2/src/raster/rasterrs.h @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* rasterrs.h */ +/* */ +/* monochrome renderer error codes (specification only). */ +/* */ +/* Copyright 2001-2018 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 file is used to define the monochrome renderer error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef RASTERRS_H_ +#define RASTERRS_H_ + +#include FT_MODULE_ERRORS_H + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX Raster_Err_ +#define FT_ERR_BASE FT_Mod_Err_Raster + +#include FT_ERRORS_H + +#endif /* RASTERRS_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/raster/rastpic.c b/vendor/FreeType2/src/raster/rastpic.c new file mode 100644 index 0000000..1dc8981 --- /dev/null +++ b/vendor/FreeType2/src/raster/rastpic.c @@ -0,0 +1,89 @@ +/***************************************************************************/ +/* */ +/* rastpic.c */ +/* */ +/* The FreeType position independent code services for raster module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "rastpic.h" +#include "rasterrs.h" + + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from ftraster.c */ + void + FT_Init_Class_ft_standard_raster( FT_Raster_Funcs* funcs ); + + + void + ft_raster1_renderer_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + + + if ( pic_container->raster ) + { + RasterPIC* container = (RasterPIC*)pic_container->raster; + + + if ( --container->ref_count ) + return; + FT_FREE( container ); + pic_container->raster = NULL; + } + } + + + FT_Error + ft_raster1_renderer_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + RasterPIC* container = NULL; + FT_Memory memory = library->memory; + + + /* XXX: since this function also served the no longer available */ + /* raster5 renderer it uses reference counting, which could */ + /* be removed now */ + if ( pic_container->raster ) + { + ((RasterPIC*)pic_container->raster)->ref_count++; + return error; + } + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof ( *container ) ); + pic_container->raster = container; + + container->ref_count = 1; + + /* initialize pointer table - */ + /* this is how the module usually expects this data */ + FT_Init_Class_ft_standard_raster( &container->ft_standard_raster ); + + return error; + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/vendor/FreeType2/src/raster/rastpic.h b/vendor/FreeType2/src/raster/rastpic.h new file mode 100644 index 0000000..6d0877c --- /dev/null +++ b/vendor/FreeType2/src/raster/rastpic.h @@ -0,0 +1,63 @@ +/***************************************************************************/ +/* */ +/* rastpic.h */ +/* */ +/* The FreeType position independent code services for raster module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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 RASTPIC_H_ +#define RASTPIC_H_ + + +#include FT_INTERNAL_PIC_H + + +FT_BEGIN_HEADER + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_STANDARD_RASTER_GET ft_standard_raster + +#else /* FT_CONFIG_OPTION_PIC */ + + typedef struct RasterPIC_ + { + int ref_count; + FT_Raster_Funcs ft_standard_raster; + + } RasterPIC; + + +#define GET_PIC( lib ) \ + ( (RasterPIC*)( (lib)->pic_container.raster ) ) +#define FT_STANDARD_RASTER_GET ( GET_PIC( library )->ft_standard_raster ) + + + /* see rastpic.c for the implementation */ + void + ft_raster1_renderer_class_pic_free( FT_Library library ); + + FT_Error + ft_raster1_renderer_class_pic_init( FT_Library library ); + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* RASTPIC_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/pngshim.c b/vendor/FreeType2/src/sfnt/pngshim.c new file mode 100644 index 0000000..1602026 --- /dev/null +++ b/vendor/FreeType2/src/sfnt/pngshim.c @@ -0,0 +1,456 @@ +/***************************************************************************/ +/* */ +/* pngshim.c */ +/* */ +/* PNG Bitmap glyph support. */ +/* */ +/* Copyright 2013-2018 by */ +/* Google, Inc. */ +/* Written by Stuart Gill and Behdad Esfahbod. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include FT_CONFIG_STANDARD_LIBRARY_H + + +#if defined( TT_CONFIG_OPTION_EMBEDDED_BITMAPS ) && \ + defined( FT_CONFIG_OPTION_USE_PNG ) + + /* We always include , so make libpng shut up! */ +#define PNG_SKIP_SETJMP_CHECK 1 +#include +#include "pngshim.h" + +#include "sferrors.h" + + + /* This code is freely based on cairo-png.c. There's so many ways */ + /* to call libpng, and the way cairo does it is defacto standard. */ + + static unsigned int + multiply_alpha( unsigned int alpha, + unsigned int color ) + { + unsigned int temp = alpha * color + 0x80; + + + return ( temp + ( temp >> 8 ) ) >> 8; + } + + + /* Premultiplies data and converts RGBA bytes => BGRA. */ + static void + premultiply_data( png_structp png, + png_row_infop row_info, + png_bytep data ) + { + unsigned int i = 0, limit; + + /* The `vector_size' attribute was introduced in gcc 3.1, which */ + /* predates clang; the `__BYTE_ORDER__' preprocessor symbol was */ + /* introduced in gcc 4.6 and clang 3.2, respectively. */ + /* `__builtin_shuffle' for gcc was introduced in gcc 4.7.0. */ +#if ( ( defined( __GNUC__ ) && \ + ( ( __GNUC__ >= 5 ) || \ + ( ( __GNUC__ == 4 ) && ( __GNUC_MINOR__ >= 7 ) ) ) ) || \ + ( defined( __clang__ ) && \ + ( ( __clang_major__ >= 4 ) || \ + ( ( __clang_major__ == 3 ) && ( __clang_minor__ >= 2 ) ) ) ) ) && \ + defined( __OPTIMIZE__ ) && \ + __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + +#ifdef __clang__ + /* the clang documentation doesn't cover the two-argument case of */ + /* `__builtin_shufflevector'; however, it is is implemented since */ + /* version 2.8 */ +#define vector_shuffle __builtin_shufflevector +#else +#define vector_shuffle __builtin_shuffle +#endif + + typedef unsigned short v82 __attribute__(( vector_size( 16 ) )); + + + if ( row_info->rowbytes > 15 ) + { + /* process blocks of 16 bytes in one rush, which gives a nice speed-up */ + limit = row_info->rowbytes - 16 + 1; + for ( ; i < limit; i += 16 ) + { + unsigned char* base = &data[i]; + + v82 s, s0, s1, a; + + /* clang <= 3.9 can't apply scalar values to vectors */ + /* (or rather, it needs a different syntax) */ + v82 n0x80 = { 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }; + v82 n0xFF = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; + v82 n8 = { 8, 8, 8, 8, 8, 8, 8, 8 }; + + v82 ma = { 1, 1, 3, 3, 5, 5, 7, 7 }; + v82 o1 = { 0, 0xFF, 0, 0xFF, 0, 0xFF, 0, 0xFF }; + v82 m0 = { 1, 0, 3, 2, 5, 4, 7, 6 }; + + + ft_memcpy( &s, base, 16 ); /* RGBA RGBA RGBA RGBA */ + s0 = s & n0xFF; /* R B R B R B R B */ + s1 = s >> n8; /* G A G A G A G A */ + + a = vector_shuffle( s1, ma ); /* A A A A A A A A */ + s1 |= o1; /* G 1 G 1 G 1 G 1 */ + s0 = vector_shuffle( s0, m0 ); /* B R B R B R B R */ + + s0 *= a; + s1 *= a; + s0 += n0x80; + s1 += n0x80; + s0 = ( s0 + ( s0 >> n8 ) ) >> n8; + s1 = ( s1 + ( s1 >> n8 ) ) >> n8; + + s = s0 | ( s1 << n8 ); + ft_memcpy( base, &s, 16 ); + } + } +#endif /* use `vector_size' */ + + FT_UNUSED( png ); + + limit = row_info->rowbytes; + for ( ; i < limit; i += 4 ) + { + unsigned char* base = &data[i]; + unsigned int alpha = base[3]; + + + if ( alpha == 0 ) + base[0] = base[1] = base[2] = base[3] = 0; + + else + { + unsigned int red = base[0]; + unsigned int green = base[1]; + unsigned int blue = base[2]; + + + if ( alpha != 0xFF ) + { + red = multiply_alpha( alpha, red ); + green = multiply_alpha( alpha, green ); + blue = multiply_alpha( alpha, blue ); + } + + base[0] = (unsigned char)blue; + base[1] = (unsigned char)green; + base[2] = (unsigned char)red; + base[3] = (unsigned char)alpha; + } + } + } + + + /* Converts RGBx bytes to BGRA. */ + static void + convert_bytes_to_data( png_structp png, + png_row_infop row_info, + png_bytep data ) + { + unsigned int i; + + FT_UNUSED( png ); + + + for ( i = 0; i < row_info->rowbytes; i += 4 ) + { + unsigned char* base = &data[i]; + unsigned int red = base[0]; + unsigned int green = base[1]; + unsigned int blue = base[2]; + + + base[0] = (unsigned char)blue; + base[1] = (unsigned char)green; + base[2] = (unsigned char)red; + base[3] = 0xFF; + } + } + + + /* Use error callback to avoid png writing to stderr. */ + static void + error_callback( png_structp png, + png_const_charp error_msg ) + { + FT_Error* error = (FT_Error*)png_get_error_ptr( png ); + + FT_UNUSED( error_msg ); + + + *error = FT_THROW( Out_Of_Memory ); +#ifdef PNG_SETJMP_SUPPORTED + ft_longjmp( png_jmpbuf( png ), 1 ); +#endif + /* if we get here, then we have no choice but to abort ... */ + } + + + /* Use warning callback to avoid png writing to stderr. */ + static void + warning_callback( png_structp png, + png_const_charp error_msg ) + { + FT_UNUSED( png ); + FT_UNUSED( error_msg ); + + /* Just ignore warnings. */ + } + + + static void + read_data_from_FT_Stream( png_structp png, + png_bytep data, + png_size_t length ) + { + FT_Error error; + png_voidp p = png_get_io_ptr( png ); + FT_Stream stream = (FT_Stream)p; + + + if ( FT_FRAME_ENTER( length ) ) + { + FT_Error* e = (FT_Error*)png_get_error_ptr( png ); + + + *e = FT_THROW( Invalid_Stream_Read ); + png_error( png, NULL ); + + return; + } + + ft_memcpy( data, stream->cursor, length ); + + FT_FRAME_EXIT(); + } + + + FT_LOCAL_DEF( FT_Error ) + Load_SBit_Png( FT_GlyphSlot slot, + FT_Int x_offset, + FT_Int y_offset, + FT_Int pix_bits, + TT_SBit_Metrics metrics, + FT_Memory memory, + FT_Byte* data, + FT_UInt png_len, + FT_Bool populate_map_and_metrics, + FT_Bool metrics_only ) + { + FT_Bitmap *map = &slot->bitmap; + FT_Error error = FT_Err_Ok; + FT_StreamRec stream; + + png_structp png; + png_infop info; + png_uint_32 imgWidth, imgHeight; + + int bitdepth, color_type, interlace; + FT_Int i; + png_byte* *rows = NULL; /* pacify compiler */ + + + if ( x_offset < 0 || + y_offset < 0 ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( !populate_map_and_metrics && + ( (FT_UInt)x_offset + metrics->width > map->width || + (FT_UInt)y_offset + metrics->height > map->rows || + pix_bits != 32 || + map->pixel_mode != FT_PIXEL_MODE_BGRA ) ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + FT_Stream_OpenMemory( &stream, data, png_len ); + + png = png_create_read_struct( PNG_LIBPNG_VER_STRING, + &error, + error_callback, + warning_callback ); + if ( !png ) + { + error = FT_THROW( Out_Of_Memory ); + goto Exit; + } + + info = png_create_info_struct( png ); + if ( !info ) + { + error = FT_THROW( Out_Of_Memory ); + png_destroy_read_struct( &png, NULL, NULL ); + goto Exit; + } + + if ( ft_setjmp( png_jmpbuf( png ) ) ) + { + error = FT_THROW( Invalid_File_Format ); + goto DestroyExit; + } + + png_set_read_fn( png, &stream, read_data_from_FT_Stream ); + + png_read_info( png, info ); + png_get_IHDR( png, info, + &imgWidth, &imgHeight, + &bitdepth, &color_type, &interlace, + NULL, NULL ); + + if ( error || + ( !populate_map_and_metrics && + ( (FT_Int)imgWidth != metrics->width || + (FT_Int)imgHeight != metrics->height ) ) ) + goto DestroyExit; + + if ( populate_map_and_metrics ) + { + metrics->width = (FT_UShort)imgWidth; + metrics->height = (FT_UShort)imgHeight; + + map->width = metrics->width; + map->rows = metrics->height; + map->pixel_mode = FT_PIXEL_MODE_BGRA; + map->pitch = (int)( map->width * 4 ); + map->num_grays = 256; + + /* reject too large bitmaps similarly to the rasterizer */ + if ( map->rows > 0x7FFF || map->width > 0x7FFF ) + { + error = FT_THROW( Array_Too_Large ); + goto DestroyExit; + } + } + + /* convert palette/gray image to rgb */ + if ( color_type == PNG_COLOR_TYPE_PALETTE ) + png_set_palette_to_rgb( png ); + + /* expand gray bit depth if needed */ + if ( color_type == PNG_COLOR_TYPE_GRAY ) + { +#if PNG_LIBPNG_VER >= 10209 + png_set_expand_gray_1_2_4_to_8( png ); +#else + png_set_gray_1_2_4_to_8( png ); +#endif + } + + /* transform transparency to alpha */ + if ( png_get_valid(png, info, PNG_INFO_tRNS ) ) + png_set_tRNS_to_alpha( png ); + + if ( bitdepth == 16 ) + png_set_strip_16( png ); + + if ( bitdepth < 8 ) + png_set_packing( png ); + + /* convert grayscale to RGB */ + if ( color_type == PNG_COLOR_TYPE_GRAY || + color_type == PNG_COLOR_TYPE_GRAY_ALPHA ) + png_set_gray_to_rgb( png ); + + if ( interlace != PNG_INTERLACE_NONE ) + png_set_interlace_handling( png ); + + png_set_filler( png, 0xFF, PNG_FILLER_AFTER ); + + /* recheck header after setting EXPAND options */ + png_read_update_info(png, info ); + png_get_IHDR( png, info, + &imgWidth, &imgHeight, + &bitdepth, &color_type, &interlace, + NULL, NULL ); + + if ( bitdepth != 8 || + !( color_type == PNG_COLOR_TYPE_RGB || + color_type == PNG_COLOR_TYPE_RGB_ALPHA ) ) + { + error = FT_THROW( Invalid_File_Format ); + goto DestroyExit; + } + + if ( metrics_only ) + goto DestroyExit; + + switch ( color_type ) + { + default: + /* Shouldn't happen, but fall through. */ + + case PNG_COLOR_TYPE_RGB_ALPHA: + png_set_read_user_transform_fn( png, premultiply_data ); + break; + + case PNG_COLOR_TYPE_RGB: + /* Humm, this smells. Carry on though. */ + png_set_read_user_transform_fn( png, convert_bytes_to_data ); + break; + } + + if ( populate_map_and_metrics ) + { + /* this doesn't overflow: 0x7FFF * 0x7FFF * 4 < 2^32 */ + FT_ULong size = map->rows * (FT_ULong)map->pitch; + + + error = ft_glyphslot_alloc_bitmap( slot, size ); + if ( error ) + goto DestroyExit; + } + + if ( FT_NEW_ARRAY( rows, imgHeight ) ) + { + error = FT_THROW( Out_Of_Memory ); + goto DestroyExit; + } + + for ( i = 0; i < (FT_Int)imgHeight; i++ ) + rows[i] = map->buffer + ( y_offset + i ) * map->pitch + x_offset * 4; + + png_read_image( png, rows ); + + FT_FREE( rows ); + + png_read_end( png, info ); + + DestroyExit: + png_destroy_read_struct( &png, &info, NULL ); + FT_Stream_Close( &stream ); + + Exit: + return error; + } + +#else /* !(TT_CONFIG_OPTION_EMBEDDED_BITMAPS && FT_CONFIG_OPTION_USE_PNG) */ + + /* ANSI C doesn't like empty source files */ + typedef int _pngshim_dummy; + +#endif /* !(TT_CONFIG_OPTION_EMBEDDED_BITMAPS && FT_CONFIG_OPTION_USE_PNG) */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/pngshim.h b/vendor/FreeType2/src/sfnt/pngshim.h new file mode 100644 index 0000000..194238c --- /dev/null +++ b/vendor/FreeType2/src/sfnt/pngshim.h @@ -0,0 +1,51 @@ +/***************************************************************************/ +/* */ +/* pngshim.h */ +/* */ +/* PNG Bitmap glyph support. */ +/* */ +/* Copyright 2013-2018 by */ +/* Google, Inc. */ +/* Written by Stuart Gill and Behdad Esfahbod. */ +/* */ +/* 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 PNGSHIM_H_ +#define PNGSHIM_H_ + + +#include +#include "ttload.h" + + +FT_BEGIN_HEADER + +#ifdef FT_CONFIG_OPTION_USE_PNG + + FT_LOCAL( FT_Error ) + Load_SBit_Png( FT_GlyphSlot slot, + FT_Int x_offset, + FT_Int y_offset, + FT_Int pix_bits, + TT_SBit_Metrics metrics, + FT_Memory memory, + FT_Byte* data, + FT_UInt png_len, + FT_Bool populate_map_and_metrics, + FT_Bool metrics_only ); + +#endif + +FT_END_HEADER + +#endif /* PNGSHIM_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/sfdriver.c b/vendor/FreeType2/src/sfnt/sfdriver.c new file mode 100644 index 0000000..303e1ca --- /dev/null +++ b/vendor/FreeType2/src/sfnt/sfdriver.c @@ -0,0 +1,1288 @@ +/***************************************************************************/ +/* */ +/* sfdriver.c */ +/* */ +/* High-level SFNT driver interface (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_OBJECTS_H +#include FT_TRUETYPE_IDS_H + +#include "sfdriver.h" +#include "ttload.h" +#include "sfobjs.h" +#include "sfntpic.h" + +#include "sferrors.h" + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#include "ttsbit.h" +#endif + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#include "ttpost.h" +#endif + +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.h" +#include FT_SERVICE_BDF_H +#endif + +#include "ttcmap.h" +#include "ttkern.h" +#include "ttmtx.h" + +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_TT_CMAP_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#endif + + + /*************************************************************************/ + /* */ + /* 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_sfdriver + + + /* + * SFNT TABLE SERVICE + * + */ + + static void* + get_sfnt_table( TT_Face face, + FT_Sfnt_Tag tag ) + { + void* table; + + + switch ( tag ) + { + case FT_SFNT_HEAD: + table = &face->header; + break; + + case FT_SFNT_HHEA: + table = &face->horizontal; + break; + + case FT_SFNT_VHEA: + table = face->vertical_info ? &face->vertical : NULL; + break; + + case FT_SFNT_OS2: + table = ( face->os2.version == 0xFFFFU ) ? NULL : &face->os2; + break; + + case FT_SFNT_POST: + table = &face->postscript; + break; + + case FT_SFNT_MAXP: + table = &face->max_profile; + break; + + case FT_SFNT_PCLT: + table = face->pclt.Version ? &face->pclt : NULL; + break; + + default: + table = NULL; + } + + return table; + } + + + static FT_Error + sfnt_table_info( TT_Face face, + FT_UInt idx, + FT_ULong *tag, + FT_ULong *offset, + FT_ULong *length ) + { + if ( !offset || !length ) + return FT_THROW( Invalid_Argument ); + + if ( !tag ) + *length = face->num_tables; + else + { + if ( idx >= face->num_tables ) + return FT_THROW( Table_Missing ); + + *tag = face->dir_tables[idx].Tag; + *offset = face->dir_tables[idx].Offset; + *length = face->dir_tables[idx].Length; + } + + return FT_Err_Ok; + } + + + FT_DEFINE_SERVICE_SFNT_TABLEREC( + sfnt_service_sfnt_table, + + (FT_SFNT_TableLoadFunc)tt_face_load_any, /* load_table */ + (FT_SFNT_TableGetFunc) get_sfnt_table, /* get_table */ + (FT_SFNT_TableInfoFunc)sfnt_table_info /* table_info */ + ) + + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + /* + * GLYPH DICT SERVICE + * + */ + + static FT_Error + sfnt_get_glyph_name( FT_Face face, + FT_UInt glyph_index, + FT_Pointer buffer, + FT_UInt buffer_max ) + { + FT_String* gname; + FT_Error error; + + + error = tt_face_get_ps_name( (TT_Face)face, glyph_index, &gname ); + if ( !error ) + FT_STRCPYN( buffer, gname, buffer_max ); + + return error; + } + + + static FT_UInt + sfnt_get_name_index( FT_Face face, + FT_String* glyph_name ) + { + TT_Face ttface = (TT_Face)face; + + FT_UInt i, max_gid = FT_UINT_MAX; + + + if ( face->num_glyphs < 0 ) + return 0; + else if ( (FT_ULong)face->num_glyphs < FT_UINT_MAX ) + max_gid = (FT_UInt)face->num_glyphs; + else + FT_TRACE0(( "Ignore glyph names for invalid GID 0x%08x - 0x%08x\n", + FT_UINT_MAX, face->num_glyphs )); + + for ( i = 0; i < max_gid; i++ ) + { + FT_String* gname; + FT_Error error = tt_face_get_ps_name( ttface, i, &gname ); + + + if ( error ) + continue; + + if ( !ft_strcmp( glyph_name, gname ) ) + return i; + } + + return 0; + } + + + FT_DEFINE_SERVICE_GLYPHDICTREC( + sfnt_service_glyph_dict, + + (FT_GlyphDict_GetNameFunc) sfnt_get_glyph_name, /* get_name */ + (FT_GlyphDict_NameIndexFunc)sfnt_get_name_index /* name_index */ + ) + +#endif /* TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + /* + * POSTSCRIPT NAME SERVICE + * + */ + + /* an array representing allowed ASCII characters in a PS string */ + static const unsigned char sfnt_ps_map[16] = + { + /* 4 0 C 8 */ + 0x00, 0x00, /* 0x00: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 */ + 0x00, 0x00, /* 0x10: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 */ + 0xDE, 0x7C, /* 0x20: 1 1 0 1 1 1 1 0 0 1 1 1 1 1 0 0 */ + 0xFF, 0xAF, /* 0x30: 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 1 */ + 0xFF, 0xFF, /* 0x40: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 */ + 0xFF, 0xD7, /* 0x50: 1 1 1 1 1 1 1 1 1 1 0 1 0 1 1 1 */ + 0xFF, 0xFF, /* 0x60: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 */ + 0xFF, 0x57 /* 0x70: 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 */ + }; + + + static int + sfnt_is_postscript( int c ) + { + unsigned int cc; + + + if ( c < 0 || c >= 0x80 ) + return 0; + + cc = (unsigned int)c; + + return sfnt_ps_map[cc >> 3] & ( 1 << ( cc & 0x07 ) ); + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + /* Only ASCII letters and digits are taken for a variation font */ + /* instance's PostScript name. */ + /* */ + /* `ft_isalnum' is a macro, but we need a function here, thus */ + /* this definition. */ + static int + sfnt_is_alphanumeric( int c ) + { + return ft_isalnum( c ); + } + + + /* the implementation of MurmurHash3 is taken and adapted from */ + /* https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp */ + +#define ROTL32( x, r ) ( x << r ) | ( x >> ( 32 - r ) ) + + + static FT_UInt32 + fmix32( FT_UInt32 h ) + { + h ^= h >> 16; + h *= 0x85ebca6b; + h ^= h >> 13; + h *= 0xc2b2ae35; + h ^= h >> 16; + + return h; + } + + + static void + murmur_hash_3_128( const void* key, + const unsigned int len, + FT_UInt32 seed, + void* out ) + { + const FT_Byte* data = (const FT_Byte*)key; + const int nblocks = (int)len / 16; + + FT_UInt32 h1 = seed; + FT_UInt32 h2 = seed; + FT_UInt32 h3 = seed; + FT_UInt32 h4 = seed; + + const FT_UInt32 c1 = 0x239b961b; + const FT_UInt32 c2 = 0xab0e9789; + const FT_UInt32 c3 = 0x38b34ae5; + const FT_UInt32 c4 = 0xa1e38b93; + + const FT_UInt32* blocks = (const FT_UInt32*)( data + nblocks * 16 ); + + int i; + + + for( i = -nblocks; i; i++ ) + { + FT_UInt32 k1 = blocks[i * 4 + 0]; + FT_UInt32 k2 = blocks[i * 4 + 1]; + FT_UInt32 k3 = blocks[i * 4 + 2]; + FT_UInt32 k4 = blocks[i * 4 + 3]; + + + k1 *= c1; + k1 = ROTL32( k1, 15 ); + k1 *= c2; + h1 ^= k1; + + h1 = ROTL32( h1, 19 ); + h1 += h2; + h1 = h1 * 5 + 0x561ccd1b; + + k2 *= c2; + k2 = ROTL32( k2, 16 ); + k2 *= c3; + h2 ^= k2; + + h2 = ROTL32( h2, 17 ); + h2 += h3; + h2 = h2 * 5 + 0x0bcaa747; + + k3 *= c3; + k3 = ROTL32( k3, 17 ); + k3 *= c4; + h3 ^= k3; + + h3 = ROTL32( h3, 15 ); + h3 += h4; + h3 = h3 * 5 + 0x96cd1c35; + + k4 *= c4; + k4 = ROTL32( k4, 18 ); + k4 *= c1; + h4 ^= k4; + + h4 = ROTL32( h4, 13 ); + h4 += h1; + h4 = h4 * 5 + 0x32ac3b17; + } + + { + const FT_Byte* tail = (const FT_Byte*)( data + nblocks * 16 ); + + FT_UInt32 k1 = 0; + FT_UInt32 k2 = 0; + FT_UInt32 k3 = 0; + FT_UInt32 k4 = 0; + + + switch ( len & 15 ) + { + case 15: + k4 ^= (FT_UInt32)tail[14] << 16; + case 14: + k4 ^= (FT_UInt32)tail[13] << 8; + case 13: + k4 ^= (FT_UInt32)tail[12]; + k4 *= c4; + k4 = ROTL32( k4, 18 ); + k4 *= c1; + h4 ^= k4; + + case 12: + k3 ^= (FT_UInt32)tail[11] << 24; + case 11: + k3 ^= (FT_UInt32)tail[10] << 16; + case 10: + k3 ^= (FT_UInt32)tail[9] << 8; + case 9: + k3 ^= (FT_UInt32)tail[8]; + k3 *= c3; + k3 = ROTL32( k3, 17 ); + k3 *= c4; + h3 ^= k3; + + case 8: + k2 ^= (FT_UInt32)tail[7] << 24; + case 7: + k2 ^= (FT_UInt32)tail[6] << 16; + case 6: + k2 ^= (FT_UInt32)tail[5] << 8; + case 5: + k2 ^= (FT_UInt32)tail[4]; + k2 *= c2; + k2 = ROTL32( k2, 16 ); + k2 *= c3; + h2 ^= k2; + + case 4: + k1 ^= (FT_UInt32)tail[3] << 24; + case 3: + k1 ^= (FT_UInt32)tail[2] << 16; + case 2: + k1 ^= (FT_UInt32)tail[1] << 8; + case 1: + k1 ^= (FT_UInt32)tail[0]; + k1 *= c1; + k1 = ROTL32( k1, 15 ); + k1 *= c2; + h1 ^= k1; + } + } + + h1 ^= len; + h2 ^= len; + h3 ^= len; + h4 ^= len; + + h1 += h2; + h1 += h3; + h1 += h4; + + h2 += h1; + h3 += h1; + h4 += h1; + + h1 = fmix32( h1 ); + h2 = fmix32( h2 ); + h3 = fmix32( h3 ); + h4 = fmix32( h4 ); + + h1 += h2; + h1 += h3; + h1 += h4; + + h2 += h1; + h3 += h1; + h4 += h1; + + ((FT_UInt32*)out)[0] = h1; + ((FT_UInt32*)out)[1] = h2; + ((FT_UInt32*)out)[2] = h3; + ((FT_UInt32*)out)[3] = h4; + } + + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + + typedef int (*char_type_func)( int c ); + + + /* handling of PID/EID 3/0 and 3/1 is the same */ +#define IS_WIN( n ) ( (n)->platformID == 3 && \ + ( (n)->encodingID == 1 || (n)->encodingID == 0 ) && \ + (n)->languageID == 0x409 ) + +#define IS_APPLE( n ) ( (n)->platformID == 1 && \ + (n)->encodingID == 0 && \ + (n)->languageID == 0 ) + + static char* + get_win_string( FT_Memory memory, + FT_Stream stream, + TT_Name entry, + char_type_func char_type, + FT_Bool report_invalid_characters ) + { + FT_Error error = FT_Err_Ok; + + char* result = NULL; + FT_String* r; + FT_Char* p; + FT_UInt len; + + FT_UNUSED( error ); + + + if ( FT_ALLOC( result, entry->stringLength / 2 + 1 ) ) + return NULL; + + if ( FT_STREAM_SEEK( entry->stringOffset ) || + FT_FRAME_ENTER( entry->stringLength ) ) + { + FT_FREE( result ); + entry->stringLength = 0; + entry->stringOffset = 0; + FT_FREE( entry->string ); + + return NULL; + } + + r = (FT_String*)result; + p = (FT_Char*)stream->cursor; + + for ( len = entry->stringLength / 2; len > 0; len--, p += 2 ) + { + if ( p[0] == 0 ) + { + if ( char_type( p[1] ) ) + *r++ = p[1]; + else + { + if ( report_invalid_characters ) + { + FT_TRACE0(( "get_win_string:" + " Character `%c' (0x%X) invalid in PS name string\n", + p[1], p[1] )); + /* it's not the job of FreeType to correct PS names... */ + *r++ = p[1]; + } + } + } + } + *r = '\0'; + + FT_FRAME_EXIT(); + + return result; + } + + + static char* + get_apple_string( FT_Memory memory, + FT_Stream stream, + TT_Name entry, + char_type_func char_type, + FT_Bool report_invalid_characters ) + { + FT_Error error = FT_Err_Ok; + + char* result = NULL; + FT_String* r; + FT_Char* p; + FT_UInt len; + + FT_UNUSED( error ); + + + if ( FT_ALLOC( result, entry->stringLength + 1 ) ) + return NULL; + + if ( FT_STREAM_SEEK( entry->stringOffset ) || + FT_FRAME_ENTER( entry->stringLength ) ) + { + FT_FREE( result ); + entry->stringOffset = 0; + entry->stringLength = 0; + FT_FREE( entry->string ); + + return NULL; + } + + r = (FT_String*)result; + p = (FT_Char*)stream->cursor; + + for ( len = entry->stringLength; len > 0; len--, p++ ) + { + if ( char_type( *p ) ) + *r++ = *p; + else + { + if ( report_invalid_characters ) + { + FT_TRACE0(( "get_apple_string:" + " Character `%c' (0x%X) invalid in PS name string\n", + *p, *p )); + /* it's not the job of FreeType to correct PS names... */ + *r++ = *p; + } + } + } + *r = '\0'; + + FT_FRAME_EXIT(); + + return result; + } + + + static FT_Bool + sfnt_get_name_id( TT_Face face, + FT_UShort id, + FT_Int *win, + FT_Int *apple ) + { + FT_Int n; + + + *win = -1; + *apple = -1; + + for ( n = 0; n < face->num_names; n++ ) + { + TT_Name name = face->name_table.names + n; + + + if ( name->nameID == id && name->stringLength > 0 ) + { + if ( IS_WIN( name ) ) + *win = n; + + if ( IS_APPLE( name ) ) + *apple = n; + } + } + + return ( *win >= 0 ) || ( *apple >= 0 ); + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + /* + The maximum length of an axis value descriptor. + + We need 65536 different values for the decimal fraction; this fits + nicely into five decimal places. Consequently, it consists of + + . the minus sign if the number is negative, + . up to five characters for the digits before the decimal point, + . the decimal point if there is a fractional part, and + . up to five characters for the digits after the decimal point. + + We also need one byte for the leading `_' character and up to four + bytes for the axis tag. + */ +#define MAX_VALUE_DESCRIPTOR_LEN ( 1 + 5 + 1 + 5 + 1 + 4 ) + + + /* the maximum length of PostScript font names */ +#define MAX_PS_NAME_LEN 127 + + + /* + * Find the shortest decimal representation of a 16.16 fixed point + * number. The function fills `buf' with the result, returning a pointer + * to the position after the representation's last byte. + */ + + static char* + fixed2float( FT_Int fixed, + char* buf ) + { + char* p; + char* q; + char tmp[5]; + + FT_Int int_part; + FT_Int frac_part; + + FT_Int i; + + + p = buf; + + if ( fixed == 0 ) + { + *p++ = '0'; + return p; + } + + if ( fixed < 0 ) + { + *p++ = '-'; + fixed = -fixed; + } + + int_part = ( fixed >> 16 ) & 0xFFFF; + frac_part = fixed & 0xFFFF; + + /* get digits of integer part (in reverse order) */ + q = tmp; + while ( int_part > 0 ) + { + *q++ = '0' + int_part % 10; + int_part /= 10; + } + + /* copy digits in correct order to buffer */ + while ( q > tmp ) + *p++ = *--q; + + if ( !frac_part ) + return p; + + /* save position of point */ + q = p; + *p++ = '.'; + + /* apply rounding */ + frac_part = frac_part * 10 + 5; + + /* get digits of fractional part */ + for ( i = 0; i < 5; i++ ) + { + *p++ = '0' + (char)( frac_part / 0x10000L ); + + frac_part %= 0x10000L; + if ( !frac_part ) + break; + + frac_part *= 10; + } + + /* + If the remainder stored in `frac_part' (after the last FOR loop) is + smaller than 34480*10, the resulting decimal value minus 0.00001 is + an equivalent representation of `fixed'. + + The above FOR loop always finds the larger of the two values; I + verified this by iterating over all possible fixed point numbers. + + If the remainder is 17232*10, both values are equally good, and we + take the next even number (following IEEE 754's `round to nearest, + ties to even' rounding rule). + + If the remainder is smaller than 17232*10, the lower of the two + numbers is nearer to the exact result (values 17232 and 34480 were + also found by testing all possible fixed point values). + + We use this to find a shorter decimal representation. If not ending + with digit zero, we take the representation with less error. + */ + p--; + if ( p - q == 5 ) /* five digits? */ + { + /* take the representation that has zero as the last digit */ + if ( frac_part < 34480 * 10 && + *p == '1' ) + *p = '0'; + + /* otherwise use the one with less error */ + else if ( frac_part == 17232 * 10 && + *p & 1 ) + *p -= 1; + + else if ( frac_part < 17232 * 10 && + *p != '0' ) + *p -= 1; + } + + /* remove trailing zeros */ + while ( *p == '0' ) + *p-- = '\0'; + + return p + 1; + } + + + static const char hexdigits[16] = + { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' + }; + + + static const char* + sfnt_get_var_ps_name( TT_Face face ) + { + FT_Error error; + FT_Memory memory = face->root.memory; + + FT_Service_MultiMasters mm = (FT_Service_MultiMasters)face->mm; + + FT_UInt num_coords; + FT_Fixed* coords; + FT_MM_Var* mm_var; + + FT_Int found, win, apple; + FT_UInt i, j; + + char* result = NULL; + char* p; + + + if ( !face->var_postscript_prefix ) + { + FT_UInt len; + + + /* check whether we have a Variations PostScript Name Prefix */ + found = sfnt_get_name_id( face, + TT_NAME_ID_VARIATIONS_PREFIX, + &win, + &apple ); + if ( !found ) + { + /* otherwise use the typographic family name */ + found = sfnt_get_name_id( face, + TT_NAME_ID_TYPOGRAPHIC_FAMILY, + &win, + &apple ); + } + + if ( !found ) + { + /* as a last resort we try the family name; note that this is */ + /* not in the Adobe TechNote, but GX fonts (which predate the */ + /* TechNote) benefit from this behaviour */ + found = sfnt_get_name_id( face, + TT_NAME_ID_FONT_FAMILY, + &win, + &apple ); + } + + if ( !found ) + { + FT_TRACE0(( "sfnt_get_var_ps_name:" + " Can't construct PS name prefix for font instances\n" )); + return NULL; + } + + /* prefer Windows entries over Apple */ + if ( win != -1 ) + result = get_win_string( face->root.memory, + face->name_table.stream, + face->name_table.names + win, + sfnt_is_alphanumeric, + 0 ); + else + result = get_apple_string( face->root.memory, + face->name_table.stream, + face->name_table.names + apple, + sfnt_is_alphanumeric, + 0 ); + + len = ft_strlen( result ); + + /* sanitize if necessary; we reserve space for 36 bytes (a 128bit */ + /* checksum as a hex number, preceded by `-' and followed by three */ + /* ASCII dots, to be used if the constructed PS name would be too */ + /* long); this is also sufficient for a single instance */ + if ( len > MAX_PS_NAME_LEN - ( 1 + 32 + 3 ) ) + { + len = MAX_PS_NAME_LEN - ( 1 + 32 + 3 ); + result[len] = '\0'; + + FT_TRACE0(( "sfnt_get_var_ps_name:" + " Shortening variation PS name prefix\n" + " " + " to %d characters\n", len )); + } + + face->var_postscript_prefix = result; + face->var_postscript_prefix_len = len; + } + + mm->get_var_blend( FT_FACE( face ), + &num_coords, + &coords, + NULL, + &mm_var ); + + if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) && + !FT_IS_VARIATION( FT_FACE( face ) ) ) + { + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + FT_Long instance = ( ( face->root.face_index & 0x7FFF0000L ) >> 16 ) - 1; + FT_UInt psid = mm_var->namedstyle[instance].psid; + + char* ps_name = NULL; + + + /* try first to load the name string with index `postScriptNameID' */ + if ( psid == 6 || + ( psid > 255 && psid < 32768 ) ) + (void)sfnt->get_name( face, (FT_UShort)psid, &ps_name ); + + if ( ps_name ) + { + result = ps_name; + p = result + ft_strlen( result ) + 1; + + goto check_length; + } + else + { + /* otherwise construct a name using `subfamilyNameID' */ + FT_UInt strid = mm_var->namedstyle[instance].strid; + + char* subfamily_name; + char* s; + + + (void)sfnt->get_name( face, (FT_UShort)strid, &subfamily_name ); + + if ( !subfamily_name ) + { + FT_TRACE1(( "sfnt_get_var_ps_name:" + " can't construct named instance PS name;\n" + " " + " trying to construct normal instance PS name\n" )); + goto construct_instance_name; + } + + /* after the prefix we have character `-' followed by the */ + /* subfamily name (using only characters a-z, A-Z, and 0-9) */ + if ( FT_ALLOC( result, face->var_postscript_prefix_len + + 1 + ft_strlen( subfamily_name ) + 1 ) ) + return NULL; + + ft_strcpy( result, face->var_postscript_prefix ); + + p = result + face->var_postscript_prefix_len; + *p++ = '-'; + + s = subfamily_name; + while ( *s ) + { + if ( ft_isalnum( *s ) ) + *p++ = *s; + s++; + } + *p++ = '\0'; + + FT_FREE( subfamily_name ); + } + } + else + { + FT_Var_Axis* axis; + + + construct_instance_name: + axis = mm_var->axis; + + if ( FT_ALLOC( result, + face->var_postscript_prefix_len + + num_coords * MAX_VALUE_DESCRIPTOR_LEN + 1 ) ) + return NULL; + + p = result; + + ft_strcpy( p, face->var_postscript_prefix ); + p += face->var_postscript_prefix_len; + + for ( i = 0; i < num_coords; i++, coords++, axis++ ) + { + char t; + + + /* omit axis value descriptor if it is identical */ + /* to the default axis value */ + if ( *coords == axis->def ) + continue; + + *p++ = '_'; + p = fixed2float( *coords, p ); + + t = (char)( axis->tag >> 24 ); + if ( t != ' ' && ft_isalnum( t ) ) + *p++ = t; + t = (char)( axis->tag >> 16 ); + if ( t != ' ' && ft_isalnum( t ) ) + *p++ = t; + t = (char)( axis->tag >> 8 ); + if ( t != ' ' && ft_isalnum( t ) ) + *p++ = t; + t = (char)axis->tag; + if ( t != ' ' && ft_isalnum( t ) ) + *p++ = t; + } + } + + check_length: + if ( p - result > MAX_PS_NAME_LEN ) + { + /* the PS name is too long; replace the part after the prefix with */ + /* a checksum; we use MurmurHash 3 with a hash length of 128 bit */ + + FT_UInt32 seed = 123456789; + + FT_UInt32 hash[4]; + FT_UInt32* h; + + + murmur_hash_3_128( result, p - result, seed, hash ); + + p = result + face->var_postscript_prefix_len; + *p++ = '-'; + + /* we convert the hash value to hex digits from back to front */ + p += 32 + 3; + h = hash + 3; + + *p-- = '\0'; + *p-- = '.'; + *p-- = '.'; + *p-- = '.'; + + for ( i = 0; i < 4; i++, h-- ) + { + FT_UInt32 v = *h; + + + for ( j = 0; j < 8; j++ ) + { + *p-- = hexdigits[v & 0xF]; + v >>= 4; + } + } + } + + return result; + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + + static const char* + sfnt_get_ps_name( TT_Face face ) + { + FT_Int found, win, apple; + const char* result = NULL; + + + if ( face->postscript_name ) + return face->postscript_name; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( face->blend && + ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) || + FT_IS_VARIATION( FT_FACE( face ) ) ) ) + { + face->postscript_name = sfnt_get_var_ps_name( face ); + return face->postscript_name; + } +#endif + + /* scan the name table to see whether we have a Postscript name here, */ + /* either in Macintosh or Windows platform encodings */ + found = sfnt_get_name_id( face, TT_NAME_ID_PS_NAME, &win, &apple ); + if ( !found ) + return NULL; + + /* prefer Windows entries over Apple */ + if ( win != -1 ) + result = get_win_string( face->root.memory, + face->name_table.stream, + face->name_table.names + win, + sfnt_is_postscript, + 1 ); + else + result = get_apple_string( face->root.memory, + face->name_table.stream, + face->name_table.names + apple, + sfnt_is_postscript, + 1 ); + + face->postscript_name = result; + + return result; + } + + + FT_DEFINE_SERVICE_PSFONTNAMEREC( + sfnt_service_ps_name, + + (FT_PsName_GetFunc)sfnt_get_ps_name /* get_ps_font_name */ + ) + + + /* + * TT CMAP INFO + */ + FT_DEFINE_SERVICE_TTCMAPSREC( + tt_service_get_cmap_info, + + (TT_CMap_Info_GetFunc)tt_get_cmap_info /* get_cmap_info */ + ) + + +#ifdef TT_CONFIG_OPTION_BDF + + static FT_Error + sfnt_get_charset_id( TT_Face face, + const char* *acharset_encoding, + const char* *acharset_registry ) + { + BDF_PropertyRec encoding, registry; + FT_Error error; + + + /* XXX: I don't know whether this is correct, since + * tt_face_find_bdf_prop only returns something correct if we have + * previously selected a size that is listed in the BDF table. + * Should we change the BDF table format to include single offsets + * for `CHARSET_REGISTRY' and `CHARSET_ENCODING'? + */ + error = tt_face_find_bdf_prop( face, "CHARSET_REGISTRY", ®istry ); + if ( !error ) + { + error = tt_face_find_bdf_prop( face, "CHARSET_ENCODING", &encoding ); + if ( !error ) + { + if ( registry.type == BDF_PROPERTY_TYPE_ATOM && + encoding.type == BDF_PROPERTY_TYPE_ATOM ) + { + *acharset_encoding = encoding.u.atom; + *acharset_registry = registry.u.atom; + } + else + error = FT_THROW( Invalid_Argument ); + } + } + + return error; + } + + + FT_DEFINE_SERVICE_BDFRec( + sfnt_service_bdf, + + (FT_BDF_GetCharsetIdFunc)sfnt_get_charset_id, /* get_charset_id */ + (FT_BDF_GetPropertyFunc) tt_face_find_bdf_prop /* get_property */ + ) + + +#endif /* TT_CONFIG_OPTION_BDF */ + + + /* + * SERVICE LIST + */ + +#if defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES && defined TT_CONFIG_OPTION_BDF + FT_DEFINE_SERVICEDESCREC5( + sfnt_services, + + FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_GLYPH_DICT, &SFNT_SERVICE_GLYPH_DICT_GET, + FT_SERVICE_ID_BDF, &SFNT_SERVICE_BDF_GET, + FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET ) +#elif defined TT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_DEFINE_SERVICEDESCREC4( + sfnt_services, + + FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_GLYPH_DICT, &SFNT_SERVICE_GLYPH_DICT_GET, + FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET ) +#elif defined TT_CONFIG_OPTION_BDF + FT_DEFINE_SERVICEDESCREC4( + sfnt_services, + + FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_BDF, &SFNT_SERVICE_BDF_GET, + FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET ) +#else + FT_DEFINE_SERVICEDESCREC3( + sfnt_services, + + FT_SERVICE_ID_SFNT_TABLE, &SFNT_SERVICE_SFNT_TABLE_GET, + FT_SERVICE_ID_POSTSCRIPT_FONT_NAME, &SFNT_SERVICE_PS_NAME_GET, + FT_SERVICE_ID_TT_CMAP, &TT_SERVICE_CMAP_INFO_GET ) +#endif + + + FT_CALLBACK_DEF( FT_Module_Interface ) + sfnt_get_interface( FT_Module module, + const char* module_interface ) + { + /* SFNT_SERVICES_GET dereferences `library' in PIC mode */ +#ifdef FT_CONFIG_OPTION_PIC + FT_Library library; + + + if ( !module ) + return NULL; + library = module->library; + if ( !library ) + return NULL; +#else + FT_UNUSED( module ); +#endif + + return ft_service_list_lookup( SFNT_SERVICES_GET, module_interface ); + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#define PUT_EMBEDDED_BITMAPS( a ) a +#else +#define PUT_EMBEDDED_BITMAPS( a ) NULL +#endif + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES +#define PUT_PS_NAMES( a ) a +#else +#define PUT_PS_NAMES( a ) NULL +#endif + + FT_DEFINE_SFNT_INTERFACE( + sfnt_interface, + + tt_face_goto_table, /* TT_Loader_GotoTableFunc goto_table */ + + sfnt_init_face, /* TT_Init_Face_Func init_face */ + sfnt_load_face, /* TT_Load_Face_Func load_face */ + sfnt_done_face, /* TT_Done_Face_Func done_face */ + sfnt_get_interface, /* FT_Module_Requester get_interface */ + + tt_face_load_any, /* TT_Load_Any_Func load_any */ + + tt_face_load_head, /* TT_Load_Table_Func load_head */ + tt_face_load_hhea, /* TT_Load_Metrics_Func load_hhea */ + tt_face_load_cmap, /* TT_Load_Table_Func load_cmap */ + tt_face_load_maxp, /* TT_Load_Table_Func load_maxp */ + tt_face_load_os2, /* TT_Load_Table_Func load_os2 */ + tt_face_load_post, /* TT_Load_Table_Func load_post */ + + tt_face_load_name, /* TT_Load_Table_Func load_name */ + tt_face_free_name, /* TT_Free_Table_Func free_name */ + + tt_face_load_kern, /* TT_Load_Table_Func load_kern */ + tt_face_load_gasp, /* TT_Load_Table_Func load_gasp */ + tt_face_load_pclt, /* TT_Load_Table_Func load_init */ + + /* see `ttload.h' */ + PUT_EMBEDDED_BITMAPS( tt_face_load_bhed ), + /* TT_Load_Table_Func load_bhed */ + PUT_EMBEDDED_BITMAPS( tt_face_load_sbit_image ), + /* TT_Load_SBit_Image_Func load_sbit_image */ + + /* see `ttpost.h' */ + PUT_PS_NAMES( tt_face_get_ps_name ), + /* TT_Get_PS_Name_Func get_psname */ + PUT_PS_NAMES( tt_face_free_ps_names ), + /* TT_Free_Table_Func free_psnames */ + + /* since version 2.1.8 */ + tt_face_get_kerning, /* TT_Face_GetKerningFunc get_kerning */ + + /* since version 2.2 */ + tt_face_load_font_dir, /* TT_Load_Table_Func load_font_dir */ + tt_face_load_hmtx, /* TT_Load_Metrics_Func load_hmtx */ + + /* see `ttsbit.h' and `sfnt.h' */ + PUT_EMBEDDED_BITMAPS( tt_face_load_sbit ), + /* TT_Load_Table_Func load_eblc */ + PUT_EMBEDDED_BITMAPS( tt_face_free_sbit ), + /* TT_Free_Table_Func free_eblc */ + + PUT_EMBEDDED_BITMAPS( tt_face_set_sbit_strike ), + /* TT_Set_SBit_Strike_Func set_sbit_strike */ + PUT_EMBEDDED_BITMAPS( tt_face_load_strike_metrics ), + /* TT_Load_Strike_Metrics_Func load_strike_metrics */ + + tt_face_get_metrics, /* TT_Get_Metrics_Func get_metrics */ + + tt_face_get_name, /* TT_Get_Name_Func get_name */ + sfnt_get_name_id /* TT_Get_Name_ID_Func get_name_id */ + ) + + + FT_DEFINE_MODULE( + sfnt_module_class, + + 0, /* not a font driver or renderer */ + sizeof ( FT_ModuleRec ), + + "sfnt", /* driver name */ + 0x10000L, /* driver version 1.0 */ + 0x20000L, /* driver requires FreeType 2.0 or higher */ + + (const void*)&SFNT_INTERFACE_GET, /* module specific interface */ + + (FT_Module_Constructor)NULL, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) sfnt_get_interface /* get_interface */ + ) + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/sfdriver.h b/vendor/FreeType2/src/sfnt/sfdriver.h new file mode 100644 index 0000000..81c22d2 --- /dev/null +++ b/vendor/FreeType2/src/sfnt/sfdriver.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* sfdriver.h */ +/* */ +/* High-level SFNT driver interface (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef SFDRIVER_H_ +#define SFDRIVER_H_ + + +#include +#include FT_MODULE_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_MODULE( sfnt_module_class ) + + +FT_END_HEADER + +#endif /* SFDRIVER_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/sferrors.h b/vendor/FreeType2/src/sfnt/sferrors.h new file mode 100644 index 0000000..74003d4 --- /dev/null +++ b/vendor/FreeType2/src/sfnt/sferrors.h @@ -0,0 +1,41 @@ +/***************************************************************************/ +/* */ +/* sferrors.h */ +/* */ +/* SFNT error codes (specification only). */ +/* */ +/* Copyright 2001-2018 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 file is used to define the SFNT error enumeration constants. */ + /* */ + /*************************************************************************/ + +#ifndef SFERRORS_H_ +#define SFERRORS_H_ + +#include FT_MODULE_ERRORS_H + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX SFNT_Err_ +#define FT_ERR_BASE FT_Mod_Err_SFNT + +#include FT_ERRORS_H + +#endif /* SFERRORS_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/sfnt.c b/vendor/FreeType2/src/sfnt/sfnt.c new file mode 100644 index 0000000..8b9a6b3 --- /dev/null +++ b/vendor/FreeType2/src/sfnt/sfnt.c @@ -0,0 +1,35 @@ +/***************************************************************************/ +/* */ +/* sfnt.c */ +/* */ +/* Single object library component. */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT +#include + +#include "pngshim.c" +#include "sfdriver.c" +#include "sfntpic.c" +#include "sfobjs.c" +#include "ttbdf.c" +#include "ttcmap.c" +#include "ttkern.c" +#include "ttload.c" +#include "ttmtx.c" +#include "ttpost.c" +#include "ttsbit.c" + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/sfntpic.c b/vendor/FreeType2/src/sfnt/sfntpic.c new file mode 100644 index 0000000..db2d816 --- /dev/null +++ b/vendor/FreeType2/src/sfnt/sfntpic.c @@ -0,0 +1,143 @@ +/***************************************************************************/ +/* */ +/* sfntpic.c */ +/* */ +/* The FreeType position independent code services for sfnt module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "sfntpic.h" +#include "sferrors.h" + + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from sfdriver.c */ + FT_Error + FT_Create_Class_sfnt_services( FT_Library library, + FT_ServiceDescRec** output_class ); + void + FT_Destroy_Class_sfnt_services( FT_Library library, + FT_ServiceDescRec* clazz ); + void + FT_Init_Class_sfnt_service_bdf( FT_Service_BDFRec* clazz ); + void + FT_Init_Class_sfnt_interface( FT_Library library, + SFNT_Interface* clazz ); + void + FT_Init_Class_sfnt_service_glyph_dict( + FT_Library library, + FT_Service_GlyphDictRec* clazz ); + void + FT_Init_Class_sfnt_service_ps_name( + FT_Library library, + FT_Service_PsFontNameRec* clazz ); + void + FT_Init_Class_tt_service_get_cmap_info( + FT_Library library, + FT_Service_TTCMapsRec* clazz ); + void + FT_Init_Class_sfnt_service_sfnt_table( + FT_Service_SFNT_TableRec* clazz ); + + + /* forward declaration of PIC init functions from ttcmap.c */ + FT_Error + FT_Create_Class_tt_cmap_classes( FT_Library library, + TT_CMap_Class** output_class ); + void + FT_Destroy_Class_tt_cmap_classes( FT_Library library, + TT_CMap_Class* clazz ); + + + void + sfnt_module_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + + + if ( pic_container->sfnt ) + { + sfntModulePIC* container = (sfntModulePIC*)pic_container->sfnt; + + + if ( container->sfnt_services ) + FT_Destroy_Class_sfnt_services( library, + container->sfnt_services ); + container->sfnt_services = NULL; + + if ( container->tt_cmap_classes ) + FT_Destroy_Class_tt_cmap_classes( library, + container->tt_cmap_classes ); + container->tt_cmap_classes = NULL; + + FT_FREE( container ); + pic_container->sfnt = NULL; + } + } + + + FT_Error + sfnt_module_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + sfntModulePIC* container = NULL; + FT_Memory memory = library->memory; + + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof ( *container ) ); + pic_container->sfnt = container; + + /* initialize pointer table - */ + /* this is how the module usually expects this data */ + error = FT_Create_Class_sfnt_services( library, + &container->sfnt_services ); + if ( error ) + goto Exit; + + error = FT_Create_Class_tt_cmap_classes( library, + &container->tt_cmap_classes ); + if ( error ) + goto Exit; + + FT_Init_Class_sfnt_service_glyph_dict( + library, &container->sfnt_service_glyph_dict ); + FT_Init_Class_sfnt_service_ps_name( + library, &container->sfnt_service_ps_name ); + FT_Init_Class_tt_service_get_cmap_info( + library, &container->tt_service_get_cmap_info ); + FT_Init_Class_sfnt_service_sfnt_table( + &container->sfnt_service_sfnt_table ); +#ifdef TT_CONFIG_OPTION_BDF + FT_Init_Class_sfnt_service_bdf( &container->sfnt_service_bdf ); +#endif + FT_Init_Class_sfnt_interface( library, &container->sfnt_interface ); + + Exit: + if ( error ) + sfnt_module_class_pic_free( library ); + return error; + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/sfntpic.h b/vendor/FreeType2/src/sfnt/sfntpic.h new file mode 100644 index 0000000..8f43122 --- /dev/null +++ b/vendor/FreeType2/src/sfnt/sfntpic.h @@ -0,0 +1,112 @@ +/***************************************************************************/ +/* */ +/* sfntpic.h */ +/* */ +/* The FreeType position independent code services for sfnt module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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 SFNTPIC_H_ +#define SFNTPIC_H_ + + +#include FT_INTERNAL_PIC_H + + +#ifndef FT_CONFIG_OPTION_PIC + +#define SFNT_SERVICES_GET sfnt_services +#define SFNT_SERVICE_GLYPH_DICT_GET sfnt_service_glyph_dict +#define SFNT_SERVICE_PS_NAME_GET sfnt_service_ps_name +#define TT_SERVICE_CMAP_INFO_GET tt_service_get_cmap_info +#define TT_CMAP_CLASSES_GET tt_cmap_classes +#define SFNT_SERVICE_SFNT_TABLE_GET sfnt_service_sfnt_table +#define SFNT_SERVICE_BDF_GET sfnt_service_bdf +#define SFNT_INTERFACE_GET sfnt_interface + +#else /* FT_CONFIG_OPTION_PIC */ + + /* some include files required for members of sfntModulePIC */ +#include FT_SERVICE_GLYPH_DICT_H +#include FT_SERVICE_POSTSCRIPT_NAME_H +#include FT_SERVICE_SFNT_H +#include FT_SERVICE_TT_CMAP_H + +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.h" +#include FT_SERVICE_BDF_H +#endif + +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include "ttcmap.h" + + +FT_BEGIN_HEADER + + typedef struct sfntModulePIC_ + { + FT_ServiceDescRec* sfnt_services; + FT_Service_GlyphDictRec sfnt_service_glyph_dict; + FT_Service_PsFontNameRec sfnt_service_ps_name; + FT_Service_TTCMapsRec tt_service_get_cmap_info; + TT_CMap_Class* tt_cmap_classes; + FT_Service_SFNT_TableRec sfnt_service_sfnt_table; +#ifdef TT_CONFIG_OPTION_BDF + FT_Service_BDFRec sfnt_service_bdf; +#endif + SFNT_Interface sfnt_interface; + + } sfntModulePIC; + + +#define GET_PIC( lib ) \ + ( (sfntModulePIC*)( (lib)->pic_container.sfnt ) ) + +#define SFNT_SERVICES_GET \ + ( GET_PIC( library )->sfnt_services ) +#define SFNT_SERVICE_GLYPH_DICT_GET \ + ( GET_PIC( library )->sfnt_service_glyph_dict ) +#define SFNT_SERVICE_PS_NAME_GET \ + ( GET_PIC( library )->sfnt_service_ps_name ) +#define TT_SERVICE_CMAP_INFO_GET \ + ( GET_PIC( library )->tt_service_get_cmap_info ) +#define TT_CMAP_CLASSES_GET \ + ( GET_PIC( library )->tt_cmap_classes ) +#define SFNT_SERVICE_SFNT_TABLE_GET \ + ( GET_PIC( library )->sfnt_service_sfnt_table ) +#define SFNT_SERVICE_BDF_GET \ + ( GET_PIC( library )->sfnt_service_bdf ) +#define SFNT_INTERFACE_GET \ + ( GET_PIC( library )->sfnt_interface ) + + + /* see sfntpic.c for the implementation */ + void + sfnt_module_class_pic_free( FT_Library library ); + + FT_Error + sfnt_module_class_pic_init( FT_Library library ); + + +FT_END_HEADER + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +#endif /* SFNTPIC_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/sfobjs.c b/vendor/FreeType2/src/sfnt/sfobjs.c new file mode 100644 index 0000000..6ba8509 --- /dev/null +++ b/vendor/FreeType2/src/sfnt/sfobjs.c @@ -0,0 +1,1804 @@ +/***************************************************************************/ +/* */ +/* sfobjs.c */ +/* */ +/* SFNT object management (base). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include "sfobjs.h" +#include "ttload.h" +#include "ttcmap.h" +#include "ttkern.h" +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_DEBUG_H +#include FT_TRUETYPE_IDS_H +#include FT_TRUETYPE_TAGS_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include FT_SFNT_NAMES_H +#include FT_GZIP_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_METRICS_VARIATIONS_H +#endif + +#include "sferrors.h" + +#ifdef TT_CONFIG_OPTION_BDF +#include "ttbdf.h" +#endif + + + /*************************************************************************/ + /* */ + /* 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_sfobjs + + + + /* convert a UTF-16 name entry to ASCII */ + static FT_String* + tt_name_ascii_from_utf16( TT_Name entry, + FT_Memory memory ) + { + FT_String* string = NULL; + FT_UInt len, code, n; + FT_Byte* read = (FT_Byte*)entry->string; + FT_Error error; + + + len = (FT_UInt)entry->stringLength / 2; + + if ( FT_NEW_ARRAY( string, len + 1 ) ) + return NULL; + + for ( n = 0; n < len; n++ ) + { + code = FT_NEXT_USHORT( read ); + + if ( code == 0 ) + break; + + if ( code < 32 || code > 127 ) + code = '?'; + + string[n] = (char)code; + } + + string[n] = 0; + + return string; + } + + + /* convert an Apple Roman or symbol name entry to ASCII */ + static FT_String* + tt_name_ascii_from_other( TT_Name entry, + FT_Memory memory ) + { + FT_String* string = NULL; + FT_UInt len, code, n; + FT_Byte* read = (FT_Byte*)entry->string; + FT_Error error; + + + len = (FT_UInt)entry->stringLength; + + if ( FT_NEW_ARRAY( string, len + 1 ) ) + return NULL; + + for ( n = 0; n < len; n++ ) + { + code = *read++; + + if ( code == 0 ) + break; + + if ( code < 32 || code > 127 ) + code = '?'; + + string[n] = (char)code; + } + + string[n] = 0; + + return string; + } + + + typedef FT_String* (*TT_Name_ConvertFunc)( TT_Name entry, + FT_Memory memory ); + + + /* documentation is in sfnt.h */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_get_name( TT_Face face, + FT_UShort nameid, + FT_String** name ) + { + FT_Memory memory = face->root.memory; + FT_Error error = FT_Err_Ok; + FT_String* result = NULL; + FT_UShort n; + TT_Name rec; + + FT_Int found_apple = -1; + FT_Int found_apple_roman = -1; + FT_Int found_apple_english = -1; + FT_Int found_win = -1; + FT_Int found_unicode = -1; + + FT_Bool is_english = 0; + + TT_Name_ConvertFunc convert; + + + FT_ASSERT( name ); + + rec = face->name_table.names; + for ( n = 0; n < face->num_names; n++, rec++ ) + { + /* According to the OpenType 1.3 specification, only Microsoft or */ + /* Apple platform IDs might be used in the `name' table. The */ + /* `Unicode' platform is reserved for the `cmap' table, and the */ + /* `ISO' one is deprecated. */ + /* */ + /* However, the Apple TrueType specification doesn't say the same */ + /* thing and goes to suggest that all Unicode `name' table entries */ + /* should be coded in UTF-16 (in big-endian format I suppose). */ + /* */ + if ( rec->nameID == nameid && rec->stringLength > 0 ) + { + switch ( rec->platformID ) + { + case TT_PLATFORM_APPLE_UNICODE: + case TT_PLATFORM_ISO: + /* there is `languageID' to check there. We should use this */ + /* field only as a last solution when nothing else is */ + /* available. */ + /* */ + found_unicode = n; + break; + + case TT_PLATFORM_MACINTOSH: + /* This is a bit special because some fonts will use either */ + /* an English language id, or a Roman encoding id, to indicate */ + /* the English version of its font name. */ + /* */ + if ( rec->languageID == TT_MAC_LANGID_ENGLISH ) + found_apple_english = n; + else if ( rec->encodingID == TT_MAC_ID_ROMAN ) + found_apple_roman = n; + break; + + case TT_PLATFORM_MICROSOFT: + /* we only take a non-English name when there is nothing */ + /* else available in the font */ + /* */ + if ( found_win == -1 || ( rec->languageID & 0x3FF ) == 0x009 ) + { + switch ( rec->encodingID ) + { + case TT_MS_ID_SYMBOL_CS: + case TT_MS_ID_UNICODE_CS: + case TT_MS_ID_UCS_4: + is_english = FT_BOOL( ( rec->languageID & 0x3FF ) == 0x009 ); + found_win = n; + break; + + default: + ; + } + } + break; + + default: + ; + } + } + } + + found_apple = found_apple_roman; + if ( found_apple_english >= 0 ) + found_apple = found_apple_english; + + /* some fonts contain invalid Unicode or Macintosh formatted entries; */ + /* we will thus favor names encoded in Windows formats if available */ + /* (provided it is an English name) */ + /* */ + convert = NULL; + if ( found_win >= 0 && !( found_apple >= 0 && !is_english ) ) + { + rec = face->name_table.names + found_win; + switch ( rec->encodingID ) + { + /* all Unicode strings are encoded using UTF-16BE */ + case TT_MS_ID_UNICODE_CS: + case TT_MS_ID_SYMBOL_CS: + convert = tt_name_ascii_from_utf16; + break; + + case TT_MS_ID_UCS_4: + /* Apparently, if this value is found in a name table entry, it is */ + /* documented as `full Unicode repertoire'. Experience with the */ + /* MsGothic font shipped with Windows Vista shows that this really */ + /* means UTF-16 encoded names (UCS-4 values are only used within */ + /* charmaps). */ + convert = tt_name_ascii_from_utf16; + break; + + default: + ; + } + } + else if ( found_apple >= 0 ) + { + rec = face->name_table.names + found_apple; + convert = tt_name_ascii_from_other; + } + else if ( found_unicode >= 0 ) + { + rec = face->name_table.names + found_unicode; + convert = tt_name_ascii_from_utf16; + } + + if ( rec && convert ) + { + if ( !rec->string ) + { + FT_Stream stream = face->name_table.stream; + + + if ( FT_QNEW_ARRAY ( rec->string, rec->stringLength ) || + FT_STREAM_SEEK( rec->stringOffset ) || + FT_STREAM_READ( rec->string, rec->stringLength ) ) + { + FT_FREE( rec->string ); + rec->stringLength = 0; + result = NULL; + goto Exit; + } + } + + result = convert( rec, memory ); + } + + Exit: + *name = result; + return error; + } + + + static FT_Encoding + sfnt_find_encoding( int platform_id, + int encoding_id ) + { + typedef struct TEncoding_ + { + int platform_id; + int encoding_id; + FT_Encoding encoding; + + } TEncoding; + + static + const TEncoding tt_encodings[] = + { + { TT_PLATFORM_ISO, -1, FT_ENCODING_UNICODE }, + + { TT_PLATFORM_APPLE_UNICODE, -1, FT_ENCODING_UNICODE }, + + { TT_PLATFORM_MACINTOSH, TT_MAC_ID_ROMAN, FT_ENCODING_APPLE_ROMAN }, + + { TT_PLATFORM_MICROSOFT, TT_MS_ID_SYMBOL_CS, FT_ENCODING_MS_SYMBOL }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_UCS_4, FT_ENCODING_UNICODE }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_UNICODE_CS, FT_ENCODING_UNICODE }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_SJIS, FT_ENCODING_SJIS }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_PRC, FT_ENCODING_PRC }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_BIG_5, FT_ENCODING_BIG5 }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_WANSUNG, FT_ENCODING_WANSUNG }, + { TT_PLATFORM_MICROSOFT, TT_MS_ID_JOHAB, FT_ENCODING_JOHAB } + }; + + const TEncoding *cur, *limit; + + + cur = tt_encodings; + limit = cur + sizeof ( tt_encodings ) / sizeof ( tt_encodings[0] ); + + for ( ; cur < limit; cur++ ) + { + if ( cur->platform_id == platform_id ) + { + if ( cur->encoding_id == encoding_id || + cur->encoding_id == -1 ) + return cur->encoding; + } + } + + return FT_ENCODING_NONE; + } + + +#define WRITE_USHORT( p, v ) \ + do \ + { \ + *(p)++ = (FT_Byte)( (v) >> 8 ); \ + *(p)++ = (FT_Byte)( (v) >> 0 ); \ + \ + } while ( 0 ) + +#define WRITE_ULONG( p, v ) \ + do \ + { \ + *(p)++ = (FT_Byte)( (v) >> 24 ); \ + *(p)++ = (FT_Byte)( (v) >> 16 ); \ + *(p)++ = (FT_Byte)( (v) >> 8 ); \ + *(p)++ = (FT_Byte)( (v) >> 0 ); \ + \ + } while ( 0 ) + + + static void + sfnt_stream_close( FT_Stream stream ) + { + FT_Memory memory = stream->memory; + + + FT_FREE( stream->base ); + + stream->size = 0; + stream->base = NULL; + stream->close = NULL; + } + + + FT_CALLBACK_DEF( int ) + compare_offsets( const void* a, + const void* b ) + { + WOFF_Table table1 = *(WOFF_Table*)a; + WOFF_Table table2 = *(WOFF_Table*)b; + + FT_ULong offset1 = table1->Offset; + FT_ULong offset2 = table2->Offset; + + + if ( offset1 > offset2 ) + return 1; + else if ( offset1 < offset2 ) + return -1; + else + return 0; + } + + + /* Replace `face->root.stream' with a stream containing the extracted */ + /* SFNT of a WOFF font. */ + + static FT_Error + woff_open_font( FT_Stream stream, + TT_Face face ) + { + FT_Memory memory = stream->memory; + FT_Error error = FT_Err_Ok; + + WOFF_HeaderRec woff; + WOFF_Table tables = NULL; + WOFF_Table* indices = NULL; + + FT_ULong woff_offset; + + FT_Byte* sfnt = NULL; + FT_Stream sfnt_stream = NULL; + + FT_Byte* sfnt_header; + FT_ULong sfnt_offset; + + FT_Int nn; + FT_ULong old_tag = 0; + + static const FT_Frame_Field woff_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE WOFF_HeaderRec + + FT_FRAME_START( 44 ), + FT_FRAME_ULONG ( signature ), + FT_FRAME_ULONG ( flavor ), + FT_FRAME_ULONG ( length ), + FT_FRAME_USHORT( num_tables ), + FT_FRAME_USHORT( reserved ), + FT_FRAME_ULONG ( totalSfntSize ), + FT_FRAME_USHORT( majorVersion ), + FT_FRAME_USHORT( minorVersion ), + FT_FRAME_ULONG ( metaOffset ), + FT_FRAME_ULONG ( metaLength ), + FT_FRAME_ULONG ( metaOrigLength ), + FT_FRAME_ULONG ( privOffset ), + FT_FRAME_ULONG ( privLength ), + FT_FRAME_END + }; + + + FT_ASSERT( stream == face->root.stream ); + FT_ASSERT( FT_STREAM_POS() == 0 ); + + if ( FT_STREAM_READ_FIELDS( woff_header_fields, &woff ) ) + return error; + + /* Make sure we don't recurse back here or hit TTC code. */ + if ( woff.flavor == TTAG_wOFF || woff.flavor == TTAG_ttcf ) + return FT_THROW( Invalid_Table ); + + /* Miscellaneous checks. */ + if ( woff.length != stream->size || + woff.num_tables == 0 || + 44 + woff.num_tables * 20UL >= woff.length || + 12 + woff.num_tables * 16UL >= woff.totalSfntSize || + ( woff.totalSfntSize & 3 ) != 0 || + ( woff.metaOffset == 0 && ( woff.metaLength != 0 || + woff.metaOrigLength != 0 ) ) || + ( woff.metaLength != 0 && woff.metaOrigLength == 0 ) || + ( woff.privOffset == 0 && woff.privLength != 0 ) ) + { + FT_ERROR(( "woff_font_open: invalid WOFF header\n" )); + return FT_THROW( Invalid_Table ); + } + + /* Don't trust `totalSfntSize' before thorough checks. */ + if ( FT_ALLOC( sfnt, 12 + woff.num_tables * 16UL ) || + FT_NEW( sfnt_stream ) ) + goto Exit; + + sfnt_header = sfnt; + + /* Write sfnt header. */ + { + FT_UInt searchRange, entrySelector, rangeShift, x; + + + x = woff.num_tables; + entrySelector = 0; + while ( x ) + { + x >>= 1; + entrySelector += 1; + } + entrySelector--; + + searchRange = ( 1 << entrySelector ) * 16; + rangeShift = woff.num_tables * 16 - searchRange; + + WRITE_ULONG ( sfnt_header, woff.flavor ); + WRITE_USHORT( sfnt_header, woff.num_tables ); + WRITE_USHORT( sfnt_header, searchRange ); + WRITE_USHORT( sfnt_header, entrySelector ); + WRITE_USHORT( sfnt_header, rangeShift ); + } + + /* While the entries in the sfnt header must be sorted by the */ + /* tag value, the tables themselves are not. We thus have to */ + /* sort them by offset and check that they don't overlap. */ + + if ( FT_NEW_ARRAY( tables, woff.num_tables ) || + FT_NEW_ARRAY( indices, woff.num_tables ) ) + goto Exit; + + FT_TRACE2(( "\n" + " tag offset compLen origLen checksum\n" + " -------------------------------------------\n" )); + + if ( FT_FRAME_ENTER( 20L * woff.num_tables ) ) + goto Exit; + + for ( nn = 0; nn < woff.num_tables; nn++ ) + { + WOFF_Table table = tables + nn; + + table->Tag = FT_GET_TAG4(); + table->Offset = FT_GET_ULONG(); + table->CompLength = FT_GET_ULONG(); + table->OrigLength = FT_GET_ULONG(); + table->CheckSum = FT_GET_ULONG(); + + FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx %08lx\n", + (FT_Char)( table->Tag >> 24 ), + (FT_Char)( table->Tag >> 16 ), + (FT_Char)( table->Tag >> 8 ), + (FT_Char)( table->Tag ), + table->Offset, + table->CompLength, + table->OrigLength, + table->CheckSum )); + + if ( table->Tag <= old_tag ) + { + FT_FRAME_EXIT(); + + FT_ERROR(( "woff_font_open: table tags are not sorted\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + old_tag = table->Tag; + indices[nn] = table; + } + + FT_FRAME_EXIT(); + + /* Sort by offset. */ + + ft_qsort( indices, + woff.num_tables, + sizeof ( WOFF_Table ), + compare_offsets ); + + /* Check offsets and lengths. */ + + woff_offset = 44 + woff.num_tables * 20L; + sfnt_offset = 12 + woff.num_tables * 16L; + + for ( nn = 0; nn < woff.num_tables; nn++ ) + { + WOFF_Table table = indices[nn]; + + + if ( table->Offset != woff_offset || + table->CompLength > woff.length || + table->Offset > woff.length - table->CompLength || + table->OrigLength > woff.totalSfntSize || + sfnt_offset > woff.totalSfntSize - table->OrigLength || + table->CompLength > table->OrigLength ) + { + FT_ERROR(( "woff_font_open: invalid table offsets\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + table->OrigOffset = sfnt_offset; + + /* The offsets must be multiples of 4. */ + woff_offset += ( table->CompLength + 3 ) & ~3U; + sfnt_offset += ( table->OrigLength + 3 ) & ~3U; + } + + /* + * Final checks! + * + * We don't decode and check the metadata block. + * We don't check table checksums either. + * But other than those, I think we implement all + * `MUST' checks from the spec. + */ + + if ( woff.metaOffset ) + { + if ( woff.metaOffset != woff_offset || + woff.metaOffset + woff.metaLength > woff.length ) + { + FT_ERROR(( "woff_font_open:" + " invalid `metadata' offset or length\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* We have padding only ... */ + woff_offset += woff.metaLength; + } + + if ( woff.privOffset ) + { + /* ... if it isn't the last block. */ + woff_offset = ( woff_offset + 3 ) & ~3U; + + if ( woff.privOffset != woff_offset || + woff.privOffset + woff.privLength > woff.length ) + { + FT_ERROR(( "woff_font_open: invalid `private' offset or length\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* No padding for the last block. */ + woff_offset += woff.privLength; + } + + if ( sfnt_offset != woff.totalSfntSize || + woff_offset != woff.length ) + { + FT_ERROR(( "woff_font_open: invalid `sfnt' table structure\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* Now use `totalSfntSize'. */ + if ( FT_REALLOC( sfnt, + 12 + woff.num_tables * 16UL, + woff.totalSfntSize ) ) + goto Exit; + + sfnt_header = sfnt + 12; + + /* Write the tables. */ + + for ( nn = 0; nn < woff.num_tables; nn++ ) + { + WOFF_Table table = tables + nn; + + + /* Write SFNT table entry. */ + WRITE_ULONG( sfnt_header, table->Tag ); + WRITE_ULONG( sfnt_header, table->CheckSum ); + WRITE_ULONG( sfnt_header, table->OrigOffset ); + WRITE_ULONG( sfnt_header, table->OrigLength ); + + /* Write table data. */ + if ( FT_STREAM_SEEK( table->Offset ) || + FT_FRAME_ENTER( table->CompLength ) ) + goto Exit; + + if ( table->CompLength == table->OrigLength ) + { + /* Uncompressed data; just copy. */ + ft_memcpy( sfnt + table->OrigOffset, + stream->cursor, + table->OrigLength ); + } + else + { +#ifdef FT_CONFIG_OPTION_USE_ZLIB + + /* Uncompress with zlib. */ + FT_ULong output_len = table->OrigLength; + + + error = FT_Gzip_Uncompress( memory, + sfnt + table->OrigOffset, &output_len, + stream->cursor, table->CompLength ); + if ( error ) + goto Exit; + if ( output_len != table->OrigLength ) + { + FT_ERROR(( "woff_font_open: compressed table length mismatch\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + +#else /* !FT_CONFIG_OPTION_USE_ZLIB */ + + error = FT_THROW( Unimplemented_Feature ); + goto Exit; + +#endif /* !FT_CONFIG_OPTION_USE_ZLIB */ + } + + FT_FRAME_EXIT(); + + /* We don't check whether the padding bytes in the WOFF file are */ + /* actually '\0'. For the output, however, we do set them properly. */ + sfnt_offset = table->OrigOffset + table->OrigLength; + while ( sfnt_offset & 3 ) + { + sfnt[sfnt_offset] = '\0'; + sfnt_offset++; + } + } + + /* Ok! Finally ready. Swap out stream and return. */ + FT_Stream_OpenMemory( sfnt_stream, sfnt, woff.totalSfntSize ); + sfnt_stream->memory = stream->memory; + sfnt_stream->close = sfnt_stream_close; + + FT_Stream_Free( + face->root.stream, + ( face->root.face_flags & FT_FACE_FLAG_EXTERNAL_STREAM ) != 0 ); + + face->root.stream = sfnt_stream; + + face->root.face_flags &= ~FT_FACE_FLAG_EXTERNAL_STREAM; + + Exit: + FT_FREE( tables ); + FT_FREE( indices ); + + if ( error ) + { + FT_FREE( sfnt ); + FT_Stream_Close( sfnt_stream ); + FT_FREE( sfnt_stream ); + } + + return error; + } + + +#undef WRITE_USHORT +#undef WRITE_ULONG + + + /* Fill in face->ttc_header. If the font is not a TTC, it is */ + /* synthesized into a TTC with one offset table. */ + static FT_Error + sfnt_open_font( FT_Stream stream, + TT_Face face ) + { + FT_Memory memory = stream->memory; + FT_Error error; + FT_ULong tag, offset; + + static const FT_Frame_Field ttc_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TTC_HeaderRec + + FT_FRAME_START( 8 ), + FT_FRAME_LONG( version ), + FT_FRAME_LONG( count ), /* this is ULong in the specs */ + FT_FRAME_END + }; + + + face->ttc_header.tag = 0; + face->ttc_header.version = 0; + face->ttc_header.count = 0; + + retry: + offset = FT_STREAM_POS(); + + if ( FT_READ_ULONG( tag ) ) + return error; + + if ( tag == TTAG_wOFF ) + { + FT_TRACE2(( "sfnt_open_font: file is a WOFF; synthesizing SFNT\n" )); + + if ( FT_STREAM_SEEK( offset ) ) + return error; + + error = woff_open_font( stream, face ); + if ( error ) + return error; + + /* Swap out stream and retry! */ + stream = face->root.stream; + goto retry; + } + + if ( tag != 0x00010000UL && + tag != TTAG_ttcf && + tag != TTAG_OTTO && + tag != TTAG_true && + tag != TTAG_typ1 && + tag != TTAG_0xA5kbd && + tag != TTAG_0xA5lst && + tag != 0x00020000UL ) + { + FT_TRACE2(( " not a font using the SFNT container format\n" )); + return FT_THROW( Unknown_File_Format ); + } + + face->ttc_header.tag = TTAG_ttcf; + + if ( tag == TTAG_ttcf ) + { + FT_Int n; + + + FT_TRACE3(( "sfnt_open_font: file is a collection\n" )); + + if ( FT_STREAM_READ_FIELDS( ttc_header_fields, &face->ttc_header ) ) + return error; + + FT_TRACE3(( " with %ld subfonts\n", + face->ttc_header.count )); + + if ( face->ttc_header.count == 0 ) + return FT_THROW( Invalid_Table ); + + /* a rough size estimate: let's conservatively assume that there */ + /* is just a single table info in each subfont header (12 + 16*1 = */ + /* 28 bytes), thus we have (at least) `12 + 4*count' bytes for the */ + /* size of the TTC header plus `28*count' bytes for all subfont */ + /* headers */ + if ( (FT_ULong)face->ttc_header.count > stream->size / ( 28 + 4 ) ) + return FT_THROW( Array_Too_Large ); + + /* now read the offsets of each font in the file */ + if ( FT_NEW_ARRAY( face->ttc_header.offsets, face->ttc_header.count ) ) + return error; + + if ( FT_FRAME_ENTER( face->ttc_header.count * 4L ) ) + return error; + + for ( n = 0; n < face->ttc_header.count; n++ ) + face->ttc_header.offsets[n] = FT_GET_ULONG(); + + FT_FRAME_EXIT(); + } + else + { + FT_TRACE3(( "sfnt_open_font: synthesize TTC\n" )); + + face->ttc_header.version = 1 << 16; + face->ttc_header.count = 1; + + if ( FT_NEW( face->ttc_header.offsets ) ) + return error; + + face->ttc_header.offsets[0] = offset; + } + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + sfnt_init_face( FT_Stream stream, + TT_Face face, + FT_Int face_instance_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Library library = face->root.driver->root.library; + SFNT_Service sfnt; + FT_Int face_index; + + + /* for now, parameters are unused */ + FT_UNUSED( num_params ); + FT_UNUSED( params ); + + + sfnt = (SFNT_Service)face->sfnt; + if ( !sfnt ) + { + sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); + if ( !sfnt ) + { + FT_ERROR(( "sfnt_init_face: cannot access `sfnt' module\n" )); + return FT_THROW( Missing_Module ); + } + + face->sfnt = sfnt; + face->goto_table = sfnt->goto_table; + } + + FT_FACE_FIND_GLOBAL_SERVICE( face, face->psnames, POSTSCRIPT_CMAPS ); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( !face->mm ) + { + /* we want the MM interface from the `truetype' module only */ + FT_Module tt_module = FT_Get_Module( library, "truetype" ); + + + face->mm = ft_module_get_service( tt_module, + FT_SERVICE_ID_MULTI_MASTERS, + 0 ); + } + + if ( !face->var ) + { + /* we want the metrics variations interface */ + /* from the `truetype' module only */ + FT_Module tt_module = FT_Get_Module( library, "truetype" ); + + + face->var = ft_module_get_service( tt_module, + FT_SERVICE_ID_METRICS_VARIATIONS, + 0 ); + } +#endif + + FT_TRACE2(( "SFNT driver\n" )); + + error = sfnt_open_font( stream, face ); + if ( error ) + return error; + + /* Stream may have changed in sfnt_open_font. */ + stream = face->root.stream; + + FT_TRACE2(( "sfnt_init_face: %08p, %d\n", face, face_instance_index )); + + face_index = FT_ABS( face_instance_index ) & 0xFFFF; + + /* value -(N+1) requests information on index N */ + if ( face_instance_index < 0 ) + face_index--; + + if ( face_index >= face->ttc_header.count ) + { + if ( face_instance_index >= 0 ) + return FT_THROW( Invalid_Argument ); + else + face_index = 0; + } + + if ( FT_STREAM_SEEK( face->ttc_header.offsets[face_index] ) ) + return error; + + /* check whether we have a valid TrueType file */ + error = sfnt->load_font_dir( face, stream ); + if ( error ) + return error; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + { + FT_Memory memory = face->root.memory; + + FT_ULong fvar_len; + + FT_ULong version; + FT_ULong offset; + + FT_UShort num_axes; + FT_UShort axis_size; + FT_UShort num_instances; + FT_UShort instance_size; + + FT_Int instance_index; + + FT_Byte* default_values = NULL; + FT_Byte* instance_values = NULL; + + + instance_index = FT_ABS( face_instance_index ) >> 16; + + /* test whether current face is a GX font with named instances */ + if ( face->goto_table( face, TTAG_fvar, stream, &fvar_len ) || + fvar_len < 20 || + FT_READ_ULONG( version ) || + FT_READ_USHORT( offset ) || + FT_STREAM_SKIP( 2 ) /* reserved */ || + FT_READ_USHORT( num_axes ) || + FT_READ_USHORT( axis_size ) || + FT_READ_USHORT( num_instances ) || + FT_READ_USHORT( instance_size ) ) + { + version = 0; + offset = 0; + num_axes = 0; + axis_size = 0; + num_instances = 0; + instance_size = 0; + } + + /* check that the data is bound by the table length */ + if ( version != 0x00010000UL || + axis_size != 20 || + num_axes == 0 || + /* `num_axes' limit implied by 16-bit `instance_size' */ + num_axes > 0x3FFE || + !( instance_size == 4 + 4 * num_axes || + instance_size == 6 + 4 * num_axes ) || + /* `num_instances' limit implied by limited range of name IDs */ + num_instances > 0x7EFF || + offset + + axis_size * num_axes + + instance_size * num_instances > fvar_len ) + num_instances = 0; + else + face->variation_support |= TT_FACE_FLAG_VAR_FVAR; + + /* + * As documented in the OpenType specification, an entry for the + * default instance may be omitted in the named instance table. In + * particular this means that even if there is no named instance + * table in the font we actually do have a named instance, namely the + * default instance. + * + * For consistency, we always want the default instance in our list + * of named instances. If it is missing, we try to synthesize it + * later on. Here, we have to adjust `num_instances' accordingly. + */ + + if ( ( face->variation_support & TT_FACE_FLAG_VAR_FVAR ) && + !( FT_ALLOC( default_values, num_axes * 4 ) || + FT_ALLOC( instance_values, num_axes * 4 ) ) ) + { + /* the current stream position is 16 bytes after the table start */ + FT_ULong array_start = FT_STREAM_POS() - 16 + offset; + FT_ULong default_value_offset, instance_offset; + + FT_Byte* p; + FT_UInt i; + + + default_value_offset = array_start + 8; + p = default_values; + + for ( i = 0; i < num_axes; i++ ) + { + (void)FT_STREAM_READ_AT( default_value_offset, p, 4 ); + + default_value_offset += axis_size; + p += 4; + } + + instance_offset = array_start + axis_size * num_axes + 4; + + for ( i = 0; i < num_instances; i++ ) + { + (void)FT_STREAM_READ_AT( instance_offset, + instance_values, + num_axes * 4 ); + + if ( !ft_memcmp( default_values, instance_values, num_axes * 4 ) ) + break; + + instance_offset += instance_size; + } + + if ( i == num_instances ) + { + /* no default instance in named instance table; */ + /* we thus have to synthesize it */ + num_instances++; + } + } + + FT_FREE( default_values ); + FT_FREE( instance_values ); + + /* we don't support Multiple Master CFFs yet; */ + /* note that `glyf' or `CFF2' have precedence */ + if ( face->goto_table( face, TTAG_glyf, stream, 0 ) && + face->goto_table( face, TTAG_CFF2, stream, 0 ) && + !face->goto_table( face, TTAG_CFF, stream, 0 ) ) + num_instances = 0; + + /* instance indices in `face_instance_index' start with index 1, */ + /* thus `>' and not `>=' */ + if ( instance_index > num_instances ) + { + if ( face_instance_index >= 0 ) + return FT_THROW( Invalid_Argument ); + else + num_instances = 0; + } + + face->root.style_flags = (FT_Long)num_instances << 16; + } +#endif + + face->root.num_faces = face->ttc_header.count; + face->root.face_index = face_instance_index; + + return error; + } + + +#define LOAD_( x ) \ + do \ + { \ + FT_TRACE2(( "`" #x "' " )); \ + FT_TRACE3(( "-->\n" )); \ + \ + error = sfnt->load_ ## x( face, stream ); \ + \ + FT_TRACE2(( "%s\n", ( !error ) \ + ? "loaded" \ + : FT_ERR_EQ( error, Table_Missing ) \ + ? "missing" \ + : "failed to load" )); \ + FT_TRACE3(( "\n" )); \ + } while ( 0 ) + +#define LOADM_( x, vertical ) \ + do \ + { \ + FT_TRACE2(( "`%s" #x "' ", \ + vertical ? "vertical " : "" )); \ + FT_TRACE3(( "-->\n" )); \ + \ + error = sfnt->load_ ## x( face, stream, vertical ); \ + \ + FT_TRACE2(( "%s\n", ( !error ) \ + ? "loaded" \ + : FT_ERR_EQ( error, Table_Missing ) \ + ? "missing" \ + : "failed to load" )); \ + FT_TRACE3(( "\n" )); \ + } while ( 0 ) + +#define GET_NAME( id, field ) \ + do \ + { \ + error = tt_face_get_name( face, TT_NAME_ID_ ## id, field ); \ + if ( error ) \ + goto Exit; \ + } while ( 0 ) + + + FT_LOCAL_DEF( FT_Error ) + sfnt_load_face( FT_Stream stream, + TT_Face face, + FT_Int face_instance_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_Error psnames_error; +#endif + FT_Bool has_outline; + FT_Bool is_apple_sbit; + FT_Bool is_apple_sbix; + FT_Bool has_CBLC; + FT_Bool has_CBDT; + FT_Bool ignore_typographic_family = FALSE; + FT_Bool ignore_typographic_subfamily = FALSE; + + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + FT_UNUSED( face_instance_index ); + + + /* Check parameters */ + + { + FT_Int i; + + + for ( i = 0; i < num_params; i++ ) + { + if ( params[i].tag == FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_FAMILY ) + ignore_typographic_family = TRUE; + else if ( params[i].tag == FT_PARAM_TAG_IGNORE_TYPOGRAPHIC_SUBFAMILY ) + ignore_typographic_subfamily = TRUE; + } + } + + /* Load tables */ + + /* We now support two SFNT-based bitmapped font formats. They */ + /* are recognized easily as they do not include a `glyf' */ + /* table. */ + /* */ + /* The first format comes from Apple, and uses a table named */ + /* `bhed' instead of `head' to store the font header (using */ + /* the same format). It also doesn't include horizontal and */ + /* vertical metrics tables (i.e. `hhea' and `vhea' tables are */ + /* missing). */ + /* */ + /* The other format comes from Microsoft, and is used with */ + /* WinCE/PocketPC. It looks like a standard TTF, except that */ + /* it doesn't contain outlines. */ + /* */ + + FT_TRACE2(( "sfnt_load_face: %08p\n\n", face )); + + /* do we have outlines in there? */ +#ifdef FT_CONFIG_OPTION_INCREMENTAL + has_outline = FT_BOOL( face->root.internal->incremental_interface || + tt_face_lookup_table( face, TTAG_glyf ) || + tt_face_lookup_table( face, TTAG_CFF ) || + tt_face_lookup_table( face, TTAG_CFF2 ) ); +#else + has_outline = FT_BOOL( tt_face_lookup_table( face, TTAG_glyf ) || + tt_face_lookup_table( face, TTAG_CFF ) || + tt_face_lookup_table( face, TTAG_CFF2 ) ); +#endif + + is_apple_sbit = 0; + is_apple_sbix = !face->goto_table( face, TTAG_sbix, stream, 0 ); + + /* Apple 'sbix' color bitmaps are rendered scaled and then the 'glyf' + * outline rendered on top. We don't support that yet, so just ignore + * the 'glyf' outline and advertise it as a bitmap-only font. */ + if ( is_apple_sbix ) + has_outline = FALSE; + + /* if this font doesn't contain outlines, we try to load */ + /* a `bhed' table */ + if ( !has_outline && sfnt->load_bhed ) + { + LOAD_( bhed ); + is_apple_sbit = FT_BOOL( !error ); + } + + /* load the font header (`head' table) if this isn't an Apple */ + /* sbit font file */ + if ( !is_apple_sbit || is_apple_sbix ) + { + LOAD_( head ); + if ( error ) + goto Exit; + } + + has_CBLC = !face->goto_table( face, TTAG_CBLC, stream, 0 ); + has_CBDT = !face->goto_table( face, TTAG_CBDT, stream, 0 ); + + /* Ignore outlines for CBLC/CBDT fonts. */ + if ( has_CBLC || has_CBDT ) + has_outline = FALSE; + + /* OpenType 1.8.2 introduced limits to this value; */ + /* however, they make sense for older SFNT fonts also */ + if ( face->header.Units_Per_EM < 16 || + face->header.Units_Per_EM > 16384 ) + { + error = FT_THROW( Invalid_Table ); + + goto Exit; + } + + /* the following tables are often not present in embedded TrueType */ + /* fonts within PDF documents, so don't check for them. */ + LOAD_( maxp ); + LOAD_( cmap ); + + /* the following tables are optional in PCL fonts -- */ + /* don't check for errors */ + LOAD_( name ); + LOAD_( post ); + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + psnames_error = error; +#endif + + /* do not load the metrics headers and tables if this is an Apple */ + /* sbit font file */ + if ( !is_apple_sbit ) + { + /* load the `hhea' and `hmtx' tables */ + LOADM_( hhea, 0 ); + if ( !error ) + { + LOADM_( hmtx, 0 ); + if ( FT_ERR_EQ( error, Table_Missing ) ) + { + error = FT_THROW( Hmtx_Table_Missing ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* If this is an incrementally loaded font and there are */ + /* overriding metrics, tolerate a missing `hmtx' table. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs-> + get_glyph_metrics ) + { + face->horizontal.number_Of_HMetrics = 0; + error = FT_Err_Ok; + } +#endif + } + } + else if ( FT_ERR_EQ( error, Table_Missing ) ) + { + /* No `hhea' table necessary for SFNT Mac fonts. */ + if ( face->format_tag == TTAG_true ) + { + FT_TRACE2(( "This is an SFNT Mac font.\n" )); + + has_outline = 0; + error = FT_Err_Ok; + } + else + { + error = FT_THROW( Horiz_Header_Missing ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* If this is an incrementally loaded font and there are */ + /* overriding metrics, tolerate a missing `hhea' table. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs-> + get_glyph_metrics ) + { + face->horizontal.number_Of_HMetrics = 0; + error = FT_Err_Ok; + } +#endif + + } + } + + if ( error ) + goto Exit; + + /* try to load the `vhea' and `vmtx' tables */ + LOADM_( hhea, 1 ); + if ( !error ) + { + LOADM_( hmtx, 1 ); + if ( !error ) + face->vertical_info = 1; + } + + if ( error && FT_ERR_NEQ( error, Table_Missing ) ) + goto Exit; + + LOAD_( os2 ); + if ( error ) + { + /* we treat the table as missing if there are any errors */ + face->os2.version = 0xFFFFU; + } + } + + /* the optional tables */ + + /* embedded bitmap support */ + if ( sfnt->load_eblc ) + LOAD_( eblc ); + + /* consider the pclt, kerning, and gasp tables as optional */ + LOAD_( pclt ); + LOAD_( gasp ); + LOAD_( kern ); + + face->root.num_glyphs = face->max_profile.numGlyphs; + + /* Bit 8 of the `fsSelection' field in the `OS/2' table denotes */ + /* a WWS-only font face. `WWS' stands for `weight', width', and */ + /* `slope', a term used by Microsoft's Windows Presentation */ + /* Foundation (WPF). This flag has been introduced in version */ + /* 1.5 of the OpenType specification (May 2008). */ + + face->root.family_name = NULL; + face->root.style_name = NULL; + if ( face->os2.version != 0xFFFFU && face->os2.fsSelection & 256 ) + { + if ( !ignore_typographic_family ) + GET_NAME( TYPOGRAPHIC_FAMILY, &face->root.family_name ); + if ( !face->root.family_name ) + GET_NAME( FONT_FAMILY, &face->root.family_name ); + + if ( !ignore_typographic_subfamily ) + GET_NAME( TYPOGRAPHIC_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name ) + GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); + } + else + { + GET_NAME( WWS_FAMILY, &face->root.family_name ); + if ( !face->root.family_name && !ignore_typographic_family ) + GET_NAME( TYPOGRAPHIC_FAMILY, &face->root.family_name ); + if ( !face->root.family_name ) + GET_NAME( FONT_FAMILY, &face->root.family_name ); + + GET_NAME( WWS_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name && !ignore_typographic_subfamily ) + GET_NAME( TYPOGRAPHIC_SUBFAMILY, &face->root.style_name ); + if ( !face->root.style_name ) + GET_NAME( FONT_SUBFAMILY, &face->root.style_name ); + } + + /* now set up root fields */ + { + FT_Face root = &face->root; + FT_Long flags = root->face_flags; + + + /*********************************************************************/ + /* */ + /* Compute face flags. */ + /* */ + if ( face->sbit_table_type == TT_SBIT_TABLE_TYPE_CBLC || + face->sbit_table_type == TT_SBIT_TABLE_TYPE_SBIX ) + flags |= FT_FACE_FLAG_COLOR; /* color glyphs */ + + if ( has_outline == TRUE ) + flags |= FT_FACE_FLAG_SCALABLE; /* scalable outlines */ + + /* The sfnt driver only supports bitmap fonts natively, thus we */ + /* don't set FT_FACE_FLAG_HINTER. */ + flags |= FT_FACE_FLAG_SFNT | /* SFNT file format */ + FT_FACE_FLAG_HORIZONTAL; /* horizontal data */ + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + if ( !psnames_error && + face->postscript.FormatType != 0x00030000L ) + flags |= FT_FACE_FLAG_GLYPH_NAMES; +#endif + + /* fixed width font? */ + if ( face->postscript.isFixedPitch ) + flags |= FT_FACE_FLAG_FIXED_WIDTH; + + /* vertical information? */ + if ( face->vertical_info ) + flags |= FT_FACE_FLAG_VERTICAL; + + /* kerning available ? */ + if ( TT_FACE_HAS_KERNING( face ) ) + flags |= FT_FACE_FLAG_KERNING; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* Don't bother to load the tables unless somebody asks for them. */ + /* No need to do work which will (probably) not be used. */ + if ( face->variation_support & TT_FACE_FLAG_VAR_FVAR ) + { + if ( tt_face_lookup_table( face, TTAG_glyf ) != 0 && + tt_face_lookup_table( face, TTAG_gvar ) != 0 ) + flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; + if ( tt_face_lookup_table( face, TTAG_CFF2 ) != 0 ) + flags |= FT_FACE_FLAG_MULTIPLE_MASTERS; + } +#endif + + root->face_flags = flags; + + /*********************************************************************/ + /* */ + /* Compute style flags. */ + /* */ + + flags = 0; + if ( has_outline == TRUE && face->os2.version != 0xFFFFU ) + { + /* We have an OS/2 table; use the `fsSelection' field. Bit 9 */ + /* indicates an oblique font face. This flag has been */ + /* introduced in version 1.5 of the OpenType specification. */ + + if ( face->os2.fsSelection & 512 ) /* bit 9 */ + flags |= FT_STYLE_FLAG_ITALIC; + else if ( face->os2.fsSelection & 1 ) /* bit 0 */ + flags |= FT_STYLE_FLAG_ITALIC; + + if ( face->os2.fsSelection & 32 ) /* bit 5 */ + flags |= FT_STYLE_FLAG_BOLD; + } + else + { + /* this is an old Mac font, use the header field */ + + if ( face->header.Mac_Style & 1 ) + flags |= FT_STYLE_FLAG_BOLD; + + if ( face->header.Mac_Style & 2 ) + flags |= FT_STYLE_FLAG_ITALIC; + } + + root->style_flags |= flags; + + /*********************************************************************/ + /* */ + /* Polish the charmaps. */ + /* */ + /* Try to set the charmap encoding according to the platform & */ + /* encoding ID of each charmap. Emulate Unicode charmap if one */ + /* is missing. */ + /* */ + + tt_face_build_cmaps( face ); /* ignore errors */ + + + /* set the encoding fields */ + { + FT_Int m; +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_Bool has_unicode = FALSE; +#endif + + + for ( m = 0; m < root->num_charmaps; m++ ) + { + FT_CharMap charmap = root->charmaps[m]; + + + charmap->encoding = sfnt_find_encoding( charmap->platform_id, + charmap->encoding_id ); + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + if ( charmap->encoding == FT_ENCODING_UNICODE || + charmap->encoding == FT_ENCODING_MS_SYMBOL ) /* PUA */ + has_unicode = TRUE; + } + + /* synthesize Unicode charmap if one is missing */ + if ( !has_unicode ) + { + FT_CharMapRec cmaprec; + + + cmaprec.face = root; + cmaprec.platform_id = TT_PLATFORM_MICROSOFT; + cmaprec.encoding_id = TT_MS_ID_UNICODE_CS; + cmaprec.encoding = FT_ENCODING_UNICODE; + + + error = FT_CMap_New( (FT_CMap_Class)&tt_cmap_unicode_class_rec, + NULL, &cmaprec, NULL ); + if ( error && + FT_ERR_NEQ( error, No_Unicode_Glyph_Name ) ) + goto Exit; + error = FT_Err_Ok; + +#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + } + } + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* + * Now allocate the root array of FT_Bitmap_Size records and + * populate them. Unfortunately, it isn't possible to indicate bit + * depths in the FT_Bitmap_Size record. This is a design error. + */ + { + FT_UInt count; + + + count = face->sbit_num_strikes; + + if ( count > 0 ) + { + FT_Memory memory = face->root.stream->memory; + FT_UShort em_size = face->header.Units_Per_EM; + FT_Short avgwidth = face->os2.xAvgCharWidth; + FT_Size_Metrics metrics; + + FT_UInt* sbit_strike_map = NULL; + FT_UInt strike_idx, bsize_idx; + + + if ( em_size == 0 || face->os2.version == 0xFFFFU ) + { + avgwidth = 1; + em_size = 1; + } + + /* to avoid invalid strike data in the `available_sizes' field */ + /* of `FT_Face', we map `available_sizes' indices to strike */ + /* indices */ + if ( FT_NEW_ARRAY( root->available_sizes, count ) || + FT_NEW_ARRAY( sbit_strike_map, count ) ) + goto Exit; + + bsize_idx = 0; + for ( strike_idx = 0; strike_idx < count; strike_idx++ ) + { + FT_Bitmap_Size* bsize = root->available_sizes + bsize_idx; + + + error = sfnt->load_strike_metrics( face, strike_idx, &metrics ); + if ( error ) + continue; + + bsize->height = (FT_Short)( metrics.height >> 6 ); + bsize->width = (FT_Short)( + ( avgwidth * metrics.x_ppem + em_size / 2 ) / em_size ); + + bsize->x_ppem = metrics.x_ppem << 6; + bsize->y_ppem = metrics.y_ppem << 6; + + /* assume 72dpi */ + bsize->size = metrics.y_ppem << 6; + + /* only use strikes with valid PPEM values */ + if ( bsize->x_ppem && bsize->y_ppem ) + sbit_strike_map[bsize_idx++] = strike_idx; + } + + /* reduce array size to the actually used elements */ + (void)FT_RENEW_ARRAY( sbit_strike_map, count, bsize_idx ); + + /* from now on, all strike indices are mapped */ + /* using `sbit_strike_map' */ + if ( bsize_idx ) + { + face->sbit_strike_map = sbit_strike_map; + + root->face_flags |= FT_FACE_FLAG_FIXED_SIZES; + root->num_fixed_sizes = (FT_Int)bsize_idx; + } + } + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* a font with no bitmaps and no outlines is scalable; */ + /* it has only empty glyphs then */ + if ( !FT_HAS_FIXED_SIZES( root ) && !FT_IS_SCALABLE( root ) ) + root->face_flags |= FT_FACE_FLAG_SCALABLE; + + + /*********************************************************************/ + /* */ + /* Set up metrics. */ + /* */ + if ( FT_IS_SCALABLE( root ) ) + { + /* XXX What about if outline header is missing */ + /* (e.g. sfnt wrapped bitmap)? */ + root->bbox.xMin = face->header.xMin; + root->bbox.yMin = face->header.yMin; + root->bbox.xMax = face->header.xMax; + root->bbox.yMax = face->header.yMax; + root->units_per_EM = face->header.Units_Per_EM; + + + /* XXX: Computing the ascender/descender/height is very different */ + /* from what the specification tells you. Apparently, we */ + /* must be careful because */ + /* */ + /* - not all fonts have an OS/2 table; in this case, we take */ + /* the values in the horizontal header. However, these */ + /* values very often are not reliable. */ + /* */ + /* - otherwise, the correct typographic values are in the */ + /* sTypoAscender, sTypoDescender & sTypoLineGap fields. */ + /* */ + /* However, certain fonts have these fields set to 0. */ + /* Rather, they have usWinAscent & usWinDescent correctly */ + /* set (but with different values). */ + /* */ + /* As an example, Arial Narrow is implemented through four */ + /* files ARIALN.TTF, ARIALNI.TTF, ARIALNB.TTF & ARIALNBI.TTF */ + /* */ + /* Strangely, all fonts have the same values in their */ + /* sTypoXXX fields, except ARIALNB which sets them to 0. */ + /* */ + /* On the other hand, they all have different */ + /* usWinAscent/Descent values -- as a conclusion, the OS/2 */ + /* table cannot be used to compute the text height reliably! */ + /* */ + + /* The ascender and descender are taken from the `hhea' table. */ + /* If zero, they are taken from the `OS/2' table. */ + + root->ascender = face->horizontal.Ascender; + root->descender = face->horizontal.Descender; + + root->height = root->ascender - root->descender + + face->horizontal.Line_Gap; + + if ( !( root->ascender || root->descender ) ) + { + if ( face->os2.version != 0xFFFFU ) + { + if ( face->os2.sTypoAscender || face->os2.sTypoDescender ) + { + root->ascender = face->os2.sTypoAscender; + root->descender = face->os2.sTypoDescender; + + root->height = root->ascender - root->descender + + face->os2.sTypoLineGap; + } + else + { + root->ascender = (FT_Short)face->os2.usWinAscent; + root->descender = -(FT_Short)face->os2.usWinDescent; + + root->height = root->ascender - root->descender; + } + } + } + + root->max_advance_width = + (FT_Short)face->horizontal.advance_Width_Max; + root->max_advance_height = + (FT_Short)( face->vertical_info ? face->vertical.advance_Height_Max + : root->height ); + + /* See https://www.microsoft.com/typography/otspec/post.htm -- */ + /* Adjust underline position from top edge to centre of */ + /* stroke to convert TrueType meaning to FreeType meaning. */ + root->underline_position = face->postscript.underlinePosition - + face->postscript.underlineThickness / 2; + root->underline_thickness = face->postscript.underlineThickness; + } + + } + + Exit: + FT_TRACE2(( "sfnt_load_face: done\n" )); + + return error; + } + + +#undef LOAD_ +#undef LOADM_ +#undef GET_NAME + + + FT_LOCAL_DEF( void ) + sfnt_done_face( TT_Face face ) + { + FT_Memory memory; + SFNT_Service sfnt; + + + if ( !face ) + return; + + memory = face->root.memory; + sfnt = (SFNT_Service)face->sfnt; + + if ( sfnt ) + { + /* destroy the postscript names table if it is loaded */ + if ( sfnt->free_psnames ) + sfnt->free_psnames( face ); + + /* destroy the embedded bitmaps table if it is loaded */ + if ( sfnt->free_eblc ) + sfnt->free_eblc( face ); + } + +#ifdef TT_CONFIG_OPTION_BDF + /* freeing the embedded BDF properties */ + tt_face_free_bdf_props( face ); +#endif + + /* freeing the kerning table */ + tt_face_done_kern( face ); + + /* freeing the collection table */ + FT_FREE( face->ttc_header.offsets ); + face->ttc_header.count = 0; + + /* freeing table directory */ + FT_FREE( face->dir_tables ); + face->num_tables = 0; + + { + FT_Stream stream = FT_FACE_STREAM( face ); + + + /* simply release the 'cmap' table frame */ + FT_FRAME_RELEASE( face->cmap_table ); + face->cmap_size = 0; + } + + face->horz_metrics_size = 0; + face->vert_metrics_size = 0; + + /* freeing vertical metrics, if any */ + if ( face->vertical_info ) + { + FT_FREE( face->vertical.long_metrics ); + FT_FREE( face->vertical.short_metrics ); + face->vertical_info = 0; + } + + /* freeing the gasp table */ + FT_FREE( face->gasp.gaspRanges ); + face->gasp.numRanges = 0; + + /* freeing the name table */ + if ( sfnt ) + sfnt->free_name( face ); + + /* freeing family and style name */ + FT_FREE( face->root.family_name ); + FT_FREE( face->root.style_name ); + + /* freeing sbit size table */ + FT_FREE( face->root.available_sizes ); + FT_FREE( face->sbit_strike_map ); + face->root.num_fixed_sizes = 0; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_FREE( face->postscript_name ); + FT_FREE( face->var_postscript_prefix ); +#endif + + face->sfnt = NULL; + } + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/sfobjs.h b/vendor/FreeType2/src/sfnt/sfobjs.h new file mode 100644 index 0000000..1b8d1be --- /dev/null +++ b/vendor/FreeType2/src/sfnt/sfobjs.h @@ -0,0 +1,59 @@ +/***************************************************************************/ +/* */ +/* sfobjs.h */ +/* */ +/* SFNT object management (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef SFOBJS_H_ +#define SFOBJS_H_ + + +#include +#include FT_INTERNAL_SFNT_H +#include FT_INTERNAL_OBJECTS_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + sfnt_init_face( FT_Stream stream, + TT_Face face, + FT_Int face_instance_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( FT_Error ) + sfnt_load_face( FT_Stream stream, + TT_Face face, + FT_Int face_instance_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + sfnt_done_face( TT_Face face ); + + FT_LOCAL( FT_Error ) + tt_face_get_name( TT_Face face, + FT_UShort nameid, + FT_String** name ); + + +FT_END_HEADER + +#endif /* SFDRIVER_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/ttbdf.c b/vendor/FreeType2/src/sfnt/ttbdf.c new file mode 100644 index 0000000..534201f --- /dev/null +++ b/vendor/FreeType2/src/sfnt/ttbdf.c @@ -0,0 +1,257 @@ +/***************************************************************************/ +/* */ +/* ttbdf.c */ +/* */ +/* TrueType and OpenType embedded BDF properties (body). */ +/* */ +/* Copyright 2005-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttbdf.h" + +#include "sferrors.h" + + +#ifdef TT_CONFIG_OPTION_BDF + + /*************************************************************************/ + /* */ + /* 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_ttbdf + + + FT_LOCAL_DEF( void ) + tt_face_free_bdf_props( TT_Face face ) + { + TT_BDF bdf = &face->bdf; + + + if ( bdf->loaded ) + { + FT_Stream stream = FT_FACE(face)->stream; + + + if ( bdf->table ) + FT_FRAME_RELEASE( bdf->table ); + + bdf->table_end = NULL; + bdf->strings = NULL; + bdf->strings_size = 0; + } + } + + + static FT_Error + tt_face_load_bdf_props( TT_Face face, + FT_Stream stream ) + { + TT_BDF bdf = &face->bdf; + FT_ULong length; + FT_Error error; + + + FT_ZERO( bdf ); + + error = tt_face_goto_table( face, TTAG_BDF, stream, &length ); + if ( error || + length < 8 || + FT_FRAME_EXTRACT( length, bdf->table ) ) + { + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + bdf->table_end = bdf->table + length; + + { + FT_Byte* p = bdf->table; + FT_UInt version = FT_NEXT_USHORT( p ); + FT_UInt num_strikes = FT_NEXT_USHORT( p ); + FT_ULong strings = FT_NEXT_ULONG ( p ); + FT_UInt count; + FT_Byte* strike; + + + if ( version != 0x0001 || + strings < 8 || + ( strings - 8 ) / 4 < num_strikes || + strings + 1 > length ) + { + goto BadTable; + } + + bdf->num_strikes = num_strikes; + bdf->strings = bdf->table + strings; + bdf->strings_size = length - strings; + + count = bdf->num_strikes; + p = bdf->table + 8; + strike = p + count * 4; + + + for ( ; count > 0; count-- ) + { + FT_UInt num_items = FT_PEEK_USHORT( p + 2 ); + + /* + * We don't need to check the value sets themselves, since this + * is done later. + */ + strike += 10 * num_items; + + p += 4; + } + + if ( strike > bdf->strings ) + goto BadTable; + } + + bdf->loaded = 1; + + Exit: + return error; + + BadTable: + FT_FRAME_RELEASE( bdf->table ); + FT_ZERO( bdf ); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_find_bdf_prop( TT_Face face, + const char* property_name, + BDF_PropertyRec *aprop ) + { + TT_BDF bdf = &face->bdf; + FT_Size size = FT_FACE(face)->size; + FT_Error error = FT_Err_Ok; + FT_Byte* p; + FT_UInt count; + FT_Byte* strike; + FT_Offset property_len; + + + aprop->type = BDF_PROPERTY_TYPE_NONE; + + if ( bdf->loaded == 0 ) + { + error = tt_face_load_bdf_props( face, FT_FACE( face )->stream ); + if ( error ) + goto Exit; + } + + count = bdf->num_strikes; + p = bdf->table + 8; + strike = p + 4 * count; + + error = FT_ERR( Invalid_Argument ); + + if ( !size || !property_name ) + goto Exit; + + property_len = ft_strlen( property_name ); + if ( property_len == 0 ) + goto Exit; + + for ( ; count > 0; count-- ) + { + FT_UInt _ppem = FT_NEXT_USHORT( p ); + FT_UInt _count = FT_NEXT_USHORT( p ); + + + if ( _ppem == size->metrics.y_ppem ) + { + count = _count; + goto FoundStrike; + } + + strike += 10 * _count; + } + goto Exit; + + FoundStrike: + p = strike; + for ( ; count > 0; count-- ) + { + FT_UInt type = FT_PEEK_USHORT( p + 4 ); + + + if ( ( type & 0x10 ) != 0 ) + { + FT_UInt32 name_offset = FT_PEEK_ULONG( p ); + FT_UInt32 value = FT_PEEK_ULONG( p + 6 ); + + /* be a bit paranoid for invalid entries here */ + if ( name_offset < bdf->strings_size && + property_len < bdf->strings_size - name_offset && + ft_strncmp( property_name, + (const char*)bdf->strings + name_offset, + bdf->strings_size - name_offset ) == 0 ) + { + switch ( type & 0x0F ) + { + case 0x00: /* string */ + case 0x01: /* atoms */ + /* check that the content is really 0-terminated */ + if ( value < bdf->strings_size && + ft_memchr( bdf->strings + value, 0, bdf->strings_size ) ) + { + aprop->type = BDF_PROPERTY_TYPE_ATOM; + aprop->u.atom = (const char*)bdf->strings + value; + error = FT_Err_Ok; + goto Exit; + } + break; + + case 0x02: + aprop->type = BDF_PROPERTY_TYPE_INTEGER; + aprop->u.integer = (FT_Int32)value; + error = FT_Err_Ok; + goto Exit; + + case 0x03: + aprop->type = BDF_PROPERTY_TYPE_CARDINAL; + aprop->u.cardinal = value; + error = FT_Err_Ok; + goto Exit; + + default: + ; + } + } + } + p += 10; + } + + Exit: + return error; + } + +#else /* !TT_CONFIG_OPTION_BDF */ + + /* ANSI C doesn't like empty source files */ + typedef int _tt_bdf_dummy; + +#endif /* !TT_CONFIG_OPTION_BDF */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/ttbdf.h b/vendor/FreeType2/src/sfnt/ttbdf.h new file mode 100644 index 0000000..809a663 --- /dev/null +++ b/vendor/FreeType2/src/sfnt/ttbdf.h @@ -0,0 +1,50 @@ +/***************************************************************************/ +/* */ +/* ttbdf.h */ +/* */ +/* TrueType and OpenType embedded BDF properties (specification). */ +/* */ +/* Copyright 2005-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTBDF_H_ +#define TTBDF_H_ + + +#include +#include "ttload.h" +#include FT_BDF_H + + +FT_BEGIN_HEADER + + +#ifdef TT_CONFIG_OPTION_BDF + + FT_LOCAL( void ) + tt_face_free_bdf_props( TT_Face face ); + + + FT_LOCAL( FT_Error ) + tt_face_find_bdf_prop( TT_Face face, + const char* property_name, + BDF_PropertyRec *aprop ); + +#endif /* TT_CONFIG_OPTION_BDF */ + + +FT_END_HEADER + +#endif /* TTBDF_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/ttcmap.c b/vendor/FreeType2/src/sfnt/ttcmap.c new file mode 100644 index 0000000..996e664 --- /dev/null +++ b/vendor/FreeType2/src/sfnt/ttcmap.c @@ -0,0 +1,3938 @@ +/***************************************************************************/ +/* */ +/* ttcmap.c */ +/* */ +/* TrueType character mapping table (cmap) support (body). */ +/* */ +/* Copyright 2002-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H + +#include "sferrors.h" /* must come before FT_INTERNAL_VALIDATE_H */ + +#include FT_INTERNAL_VALIDATE_H +#include FT_INTERNAL_STREAM_H +#include FT_SERVICE_POSTSCRIPT_CMAPS_H +#include "ttload.h" +#include "ttcmap.h" +#include "ttpost.h" +#include "sfntpic.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_ttcmap + + +#define TT_PEEK_SHORT FT_PEEK_SHORT +#define TT_PEEK_USHORT FT_PEEK_USHORT +#define TT_PEEK_UINT24 FT_PEEK_UOFF3 +#define TT_PEEK_LONG FT_PEEK_LONG +#define TT_PEEK_ULONG FT_PEEK_ULONG + +#define TT_NEXT_SHORT FT_NEXT_SHORT +#define TT_NEXT_USHORT FT_NEXT_USHORT +#define TT_NEXT_UINT24 FT_NEXT_UOFF3 +#define TT_NEXT_LONG FT_NEXT_LONG +#define TT_NEXT_ULONG FT_NEXT_ULONG + + + /* Too large glyph index return values are caught in `FT_Get_Char_Index' */ + /* and `FT_Get_Next_Char' (the latter calls the internal `next' function */ + /* again in this case). To mark character code return values as invalid */ + /* it is sufficient to set the corresponding glyph index return value to */ + /* zero. */ + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap_init( TT_CMap cmap, + FT_Byte* table ) + { + cmap->data = table; + return FT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 0 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 0 */ + /* length 2 USHORT table length in bytes */ + /* language 4 USHORT Mac language code */ + /* glyph_ids 6 BYTE[256] array of glyph indices */ + /* 262 */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_0 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap0_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_UInt length; + + + if ( table + 2 + 2 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 2; /* skip format */ + length = TT_NEXT_USHORT( p ); + + if ( table + length > valid->limit || length < 262 ) + FT_INVALID_TOO_SHORT; + + /* check glyph indices whenever necessary */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt n, idx; + + + p = table + 6; + for ( n = 0; n < 256; n++ ) + { + idx = *p++; + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap0_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + + + return char_code < 256 ? table[6 + char_code] : 0; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap0_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_Byte* table = cmap->data; + FT_UInt32 charcode = *pchar_code; + FT_UInt32 result = 0; + FT_UInt gindex = 0; + + + table += 6; /* go to glyph IDs */ + while ( ++charcode < 256 ) + { + gindex = table[charcode]; + if ( gindex != 0 ) + { + result = charcode; + break; + } + } + + *pchar_code = result; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap0_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 0; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap0_class_rec, + + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap0_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap0_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 0, + (TT_CMap_ValidateFunc)tt_cmap0_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap0_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_0 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 2 *****/ + /***** *****/ + /***** This is used for certain CJK encodings that encode text in a *****/ + /***** mixed 8/16 bits encoding along the following lines. *****/ + /***** *****/ + /***** * Certain byte values correspond to an 8-bit character code *****/ + /***** (typically in the range 0..127 for ASCII compatibility). *****/ + /***** *****/ + /***** * Certain byte values signal the first byte of a 2-byte *****/ + /***** character code (but these values are also valid as the *****/ + /***** second byte of a 2-byte character). *****/ + /***** *****/ + /***** The following charmap lookup and iteration functions all *****/ + /***** assume that the value `charcode' fulfills the following. *****/ + /***** *****/ + /***** - For one-byte characters, `charcode' is simply the *****/ + /***** character code. *****/ + /***** *****/ + /***** - For two-byte characters, `charcode' is the 2-byte *****/ + /***** character code in big endian format. More precisely: *****/ + /***** *****/ + /***** (charcode >> 8) is the first byte value *****/ + /***** (charcode & 0xFF) is the second byte value *****/ + /***** *****/ + /***** Note that not all values of `charcode' are valid according *****/ + /***** to these rules, and the function moderately checks the *****/ + /***** arguments. *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 2 */ + /* length 2 USHORT table length in bytes */ + /* language 4 USHORT Mac language code */ + /* keys 6 USHORT[256] sub-header keys */ + /* subs 518 SUBHEAD[NSUBS] sub-headers array */ + /* glyph_ids 518+NSUB*8 USHORT[] glyph ID array */ + /* */ + /* The `keys' table is used to map charcode high bytes to sub-headers. */ + /* The value of `NSUBS' is the number of sub-headers defined in the */ + /* table and is computed by finding the maximum of the `keys' table. */ + /* */ + /* Note that for any `n', `keys[n]' is a byte offset within the `subs' */ + /* table, i.e., it is the corresponding sub-header index multiplied */ + /* by 8. */ + /* */ + /* Each sub-header has the following format. */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* first 0 USHORT first valid low-byte */ + /* count 2 USHORT number of valid low-bytes */ + /* delta 4 SHORT see below */ + /* offset 6 USHORT see below */ + /* */ + /* A sub-header defines, for each high byte, the range of valid */ + /* low bytes within the charmap. Note that the range defined by `first' */ + /* and `count' must be completely included in the interval [0..255] */ + /* according to the specification. */ + /* */ + /* If a character code is contained within a given sub-header, then */ + /* mapping it to a glyph index is done as follows. */ + /* */ + /* * The value of `offset' is read. This is a _byte_ distance from the */ + /* location of the `offset' field itself into a slice of the */ + /* `glyph_ids' table. Let's call it `slice' (it is a USHORT[], too). */ + /* */ + /* * The value `slice[char.lo - first]' is read. If it is 0, there is */ + /* no glyph for the charcode. Otherwise, the value of `delta' is */ + /* added to it (modulo 65536) to form a new glyph index. */ + /* */ + /* It is up to the validation routine to check that all offsets fall */ + /* within the glyph IDs table (and not within the `subs' table itself or */ + /* outside of the CMap). */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_2 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap2_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_UInt length; + + FT_UInt n, max_subs; + FT_Byte* keys; /* keys table */ + FT_Byte* subs; /* sub-headers */ + FT_Byte* glyph_ids; /* glyph ID array */ + + + if ( table + 2 + 2 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 2; /* skip format */ + length = TT_NEXT_USHORT( p ); + + if ( table + length > valid->limit || length < 6 + 512 ) + FT_INVALID_TOO_SHORT; + + keys = table + 6; + + /* parse keys to compute sub-headers count */ + p = keys; + max_subs = 0; + for ( n = 0; n < 256; n++ ) + { + FT_UInt idx = TT_NEXT_USHORT( p ); + + + /* value must be multiple of 8 */ + if ( valid->level >= FT_VALIDATE_PARANOID && ( idx & 7 ) != 0 ) + FT_INVALID_DATA; + + idx >>= 3; + + if ( idx > max_subs ) + max_subs = idx; + } + + FT_ASSERT( p == table + 518 ); + + subs = p; + glyph_ids = subs + ( max_subs + 1 ) * 8; + if ( glyph_ids > valid->limit ) + FT_INVALID_TOO_SHORT; + + /* parse sub-headers */ + for ( n = 0; n <= max_subs; n++ ) + { + FT_UInt first_code, code_count, offset; + FT_Int delta; + + + first_code = TT_NEXT_USHORT( p ); + code_count = TT_NEXT_USHORT( p ); + delta = TT_NEXT_SHORT( p ); + offset = TT_NEXT_USHORT( p ); + + /* many Dynalab fonts have empty sub-headers */ + if ( code_count == 0 ) + continue; + + /* check range within 0..255 */ + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + if ( first_code >= 256 || code_count > 256 - first_code ) + FT_INVALID_DATA; + } + + /* check offset */ + if ( offset != 0 ) + { + FT_Byte* ids; + + + ids = p - 2 + offset; + if ( ids < glyph_ids || ids + code_count * 2 > table + length ) + FT_INVALID_OFFSET; + + /* check glyph IDs */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_Byte* limit = p + code_count * 2; + FT_UInt idx; + + + for ( ; p < limit; ) + { + idx = TT_NEXT_USHORT( p ); + if ( idx != 0 ) + { + idx = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU; + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + } + } + } + + return FT_Err_Ok; + } + + + /* return sub header corresponding to a given character code */ + /* NULL on invalid charcode */ + static FT_Byte* + tt_cmap2_get_subheader( FT_Byte* table, + FT_UInt32 char_code ) + { + FT_Byte* result = NULL; + + + if ( char_code < 0x10000UL ) + { + FT_UInt char_lo = (FT_UInt)( char_code & 0xFF ); + FT_UInt char_hi = (FT_UInt)( char_code >> 8 ); + FT_Byte* p = table + 6; /* keys table */ + FT_Byte* subs = table + 518; /* subheaders table */ + FT_Byte* sub; + + + if ( char_hi == 0 ) + { + /* an 8-bit character code -- we use subHeader 0 in this case */ + /* to test whether the character code is in the charmap */ + /* */ + sub = subs; /* jump to first sub-header */ + + /* check that the sub-header for this byte is 0, which */ + /* indicates that it is really a valid one-byte value; */ + /* otherwise, return 0 */ + /* */ + p += char_lo * 2; + if ( TT_PEEK_USHORT( p ) != 0 ) + goto Exit; + } + else + { + /* a 16-bit character code */ + + /* jump to key entry */ + p += char_hi * 2; + /* jump to sub-header */ + sub = subs + ( FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 8 ) ); + + /* check that the high byte isn't a valid one-byte value */ + if ( sub == subs ) + goto Exit; + } + + result = sub; + } + + Exit: + return result; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap2_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* subheader; + + + subheader = tt_cmap2_get_subheader( table, char_code ); + if ( subheader ) + { + FT_Byte* p = subheader; + FT_UInt idx = (FT_UInt)(char_code & 0xFF); + FT_UInt start, count; + FT_Int delta; + FT_UInt offset; + + + start = TT_NEXT_USHORT( p ); + count = TT_NEXT_USHORT( p ); + delta = TT_NEXT_SHORT ( p ); + offset = TT_PEEK_USHORT( p ); + + idx -= start; + if ( idx < count && offset != 0 ) + { + p += offset + 2 * idx; + idx = TT_PEEK_USHORT( p ); + + if ( idx != 0 ) + result = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU; + } + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap2_char_next( TT_CMap cmap, + FT_UInt32 *pcharcode ) + { + FT_Byte* table = cmap->data; + FT_UInt gindex = 0; + FT_UInt32 result = 0; + FT_UInt32 charcode = *pcharcode + 1; + FT_Byte* subheader; + + + while ( charcode < 0x10000UL ) + { + subheader = tt_cmap2_get_subheader( table, charcode ); + if ( subheader ) + { + FT_Byte* p = subheader; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_Int delta = TT_NEXT_SHORT ( p ); + FT_UInt offset = TT_PEEK_USHORT( p ); + FT_UInt char_lo = (FT_UInt)( charcode & 0xFF ); + FT_UInt pos, idx; + + + if ( char_lo >= start + count && charcode <= 0xFF ) + { + /* this happens only for a malformed cmap */ + charcode = 0x100; + continue; + } + + if ( offset == 0 ) + { + if ( charcode == 0x100 ) + goto Exit; /* this happens only for a malformed cmap */ + goto Next_SubHeader; + } + + if ( char_lo < start ) + { + char_lo = start; + pos = 0; + } + else + pos = (FT_UInt)( char_lo - start ); + + p += offset + pos * 2; + charcode = FT_PAD_FLOOR( charcode, 256 ) + char_lo; + + for ( ; pos < count; pos++, charcode++ ) + { + idx = TT_NEXT_USHORT( p ); + + if ( idx != 0 ) + { + gindex = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU; + if ( gindex != 0 ) + { + result = charcode; + goto Exit; + } + } + } + + /* if unsuccessful, avoid `charcode' leaving */ + /* the current 256-character block */ + if ( count ) + charcode--; + } + + /* If `charcode' is <= 0xFF, retry with `charcode + 1'. */ + /* Otherwise jump to the next 256-character block and retry. */ + Next_SubHeader: + if ( charcode <= 0xFF ) + charcode++; + else + charcode = FT_PAD_FLOOR( charcode, 0x100 ) + 0x100; + } + + Exit: + *pcharcode = result; + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap2_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 2; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap2_class_rec, + + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap2_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap2_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 2, + (TT_CMap_ValidateFunc)tt_cmap2_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap2_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_2 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 4 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 4 */ + /* length 2 USHORT table length */ + /* in bytes */ + /* language 4 USHORT Mac language code */ + /* */ + /* segCountX2 6 USHORT 2*NUM_SEGS */ + /* searchRange 8 USHORT 2*(1 << LOG_SEGS) */ + /* entrySelector 10 USHORT LOG_SEGS */ + /* rangeShift 12 USHORT segCountX2 - */ + /* searchRange */ + /* */ + /* endCount 14 USHORT[NUM_SEGS] end charcode for */ + /* each segment; last */ + /* is 0xFFFF */ + /* */ + /* pad 14+NUM_SEGS*2 USHORT padding */ + /* */ + /* startCount 16+NUM_SEGS*2 USHORT[NUM_SEGS] first charcode for */ + /* each segment */ + /* */ + /* idDelta 16+NUM_SEGS*4 SHORT[NUM_SEGS] delta for each */ + /* segment */ + /* idOffset 16+NUM_SEGS*6 SHORT[NUM_SEGS] range offset for */ + /* each segment; can be */ + /* zero */ + /* */ + /* glyphIds 16+NUM_SEGS*8 USHORT[] array of glyph ID */ + /* ranges */ + /* */ + /* Character codes are modelled by a series of ordered (increasing) */ + /* intervals called segments. Each segment has start and end codes, */ + /* provided by the `startCount' and `endCount' arrays. Segments must */ + /* not overlap, and the last segment should always contain the value */ + /* 0xFFFF for `endCount'. */ + /* */ + /* The fields `searchRange', `entrySelector' and `rangeShift' are better */ + /* ignored (they are traces of over-engineering in the TrueType */ + /* specification). */ + /* */ + /* Each segment also has a signed `delta', as well as an optional offset */ + /* within the `glyphIds' table. */ + /* */ + /* If a segment's idOffset is 0, the glyph index corresponding to any */ + /* charcode within the segment is obtained by adding the value of */ + /* `idDelta' directly to the charcode, modulo 65536. */ + /* */ + /* Otherwise, a glyph index is taken from the glyph IDs sub-array for */ + /* the segment, and the value of `idDelta' is added to it. */ + /* */ + /* */ + /* Finally, note that a lot of fonts contain an invalid last segment, */ + /* where `start' and `end' are correctly set to 0xFFFF but both `delta' */ + /* and `offset' are incorrect (e.g., `opens___.ttf' which comes with */ + /* OpenOffice.org). We need special code to deal with them correctly. */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_4 + + typedef struct TT_CMap4Rec_ + { + TT_CMapRec cmap; + FT_UInt32 cur_charcode; /* current charcode */ + FT_UInt cur_gindex; /* current glyph index */ + + FT_UInt num_ranges; + FT_UInt cur_range; + FT_UInt cur_start; + FT_UInt cur_end; + FT_Int cur_delta; + FT_Byte* cur_values; + + } TT_CMap4Rec, *TT_CMap4; + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_init( TT_CMap4 cmap, + FT_Byte* table ) + { + FT_Byte* p; + + + cmap->cmap.data = table; + + p = table + 6; + cmap->num_ranges = FT_PEEK_USHORT( p ) >> 1; + cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL; + cmap->cur_gindex = 0; + + return FT_Err_Ok; + } + + + static FT_Int + tt_cmap4_set_range( TT_CMap4 cmap, + FT_UInt range_index ) + { + FT_Byte* table = cmap->cmap.data; + FT_Byte* p; + FT_UInt num_ranges = cmap->num_ranges; + + + while ( range_index < num_ranges ) + { + FT_UInt offset; + + + p = table + 14 + range_index * 2; + cmap->cur_end = FT_PEEK_USHORT( p ); + + p += 2 + num_ranges * 2; + cmap->cur_start = FT_PEEK_USHORT( p ); + + p += num_ranges * 2; + cmap->cur_delta = FT_PEEK_SHORT( p ); + + p += num_ranges * 2; + offset = FT_PEEK_USHORT( p ); + + /* some fonts have an incorrect last segment; */ + /* we have to catch it */ + if ( range_index >= num_ranges - 1 && + cmap->cur_start == 0xFFFFU && + cmap->cur_end == 0xFFFFU ) + { + TT_Face face = (TT_Face)cmap->cmap.cmap.charmap.face; + FT_Byte* limit = face->cmap_table + face->cmap_size; + + + if ( offset && p + offset + 2 > limit ) + { + cmap->cur_delta = 1; + offset = 0; + } + } + + if ( offset != 0xFFFFU ) + { + cmap->cur_values = offset ? p + offset : NULL; + cmap->cur_range = range_index; + return 0; + } + + /* we skip empty segments */ + range_index++; + } + + return -1; + } + + + /* search the index of the charcode next to cmap->cur_charcode; */ + /* caller should call tt_cmap4_set_range with proper range */ + /* before calling this function */ + /* */ + static void + tt_cmap4_next( TT_CMap4 cmap ) + { + TT_Face face = (TT_Face)cmap->cmap.cmap.charmap.face; + FT_Byte* limit = face->cmap_table + face->cmap_size; + + FT_UInt charcode; + + + if ( cmap->cur_charcode >= 0xFFFFUL ) + goto Fail; + + charcode = (FT_UInt)cmap->cur_charcode + 1; + + if ( charcode < cmap->cur_start ) + charcode = cmap->cur_start; + + for (;;) + { + FT_Byte* values = cmap->cur_values; + FT_UInt end = cmap->cur_end; + FT_Int delta = cmap->cur_delta; + + + if ( charcode <= end ) + { + if ( values ) + { + FT_Byte* p = values + 2 * ( charcode - cmap->cur_start ); + + + /* if p > limit, the whole segment is invalid */ + if ( p > limit ) + goto Next_Segment; + + do + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + + + if ( gindex ) + { + gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU; + if ( gindex ) + { + cmap->cur_charcode = charcode; + cmap->cur_gindex = gindex; + return; + } + } + } while ( ++charcode <= end ); + } + else + { + do + { + FT_UInt gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU; + + + if ( gindex >= (FT_UInt)face->root.num_glyphs ) + { + /* we have an invalid glyph index; if there is an overflow, */ + /* we can adjust `charcode', otherwise the whole segment is */ + /* invalid */ + gindex = 0; + + if ( (FT_Int)charcode + delta < 0 && + (FT_Int)end + delta >= 0 ) + charcode = (FT_UInt)( -delta ); + + else if ( (FT_Int)charcode + delta < 0x10000L && + (FT_Int)end + delta >= 0x10000L ) + charcode = (FT_UInt)( 0x10000L - delta ); + + else + goto Next_Segment; + } + + if ( gindex ) + { + cmap->cur_charcode = charcode; + cmap->cur_gindex = gindex; + return; + } + } while ( ++charcode <= end ); + } + } + + Next_Segment: + /* we need to find another range */ + if ( tt_cmap4_set_range( cmap, cmap->cur_range + 1 ) < 0 ) + break; + + if ( charcode < cmap->cur_start ) + charcode = cmap->cur_start; + } + + Fail: + cmap->cur_charcode = (FT_UInt32)0xFFFFFFFFUL; + cmap->cur_gindex = 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_UInt length; + + FT_Byte *ends, *starts, *offsets, *deltas, *glyph_ids; + FT_UInt num_segs; + FT_Error error = FT_Err_Ok; + + + if ( table + 2 + 2 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 2; /* skip format */ + length = TT_NEXT_USHORT( p ); + + /* in certain fonts, the `length' field is invalid and goes */ + /* out of bound. We try to correct this here... */ + if ( table + length > valid->limit ) + { + if ( valid->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_TOO_SHORT; + + length = (FT_UInt)( valid->limit - table ); + } + + if ( length < 16 ) + FT_INVALID_TOO_SHORT; + + p = table + 6; + num_segs = TT_NEXT_USHORT( p ); /* read segCountX2 */ + + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + /* check that we have an even value here */ + if ( num_segs & 1 ) + FT_INVALID_DATA; + } + + num_segs /= 2; + + if ( length < 16 + num_segs * 2 * 4 ) + FT_INVALID_TOO_SHORT; + + /* check the search parameters - even though we never use them */ + /* */ + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + /* check the values of `searchRange', `entrySelector', `rangeShift' */ + FT_UInt search_range = TT_NEXT_USHORT( p ); + FT_UInt entry_selector = TT_NEXT_USHORT( p ); + FT_UInt range_shift = TT_NEXT_USHORT( p ); + + + if ( ( search_range | range_shift ) & 1 ) /* must be even values */ + FT_INVALID_DATA; + + search_range /= 2; + range_shift /= 2; + + /* `search range' is the greatest power of 2 that is <= num_segs */ + + if ( search_range > num_segs || + search_range * 2 < num_segs || + search_range + range_shift != num_segs || + search_range != ( 1U << entry_selector ) ) + FT_INVALID_DATA; + } + + ends = table + 14; + starts = table + 16 + num_segs * 2; + deltas = starts + num_segs * 2; + offsets = deltas + num_segs * 2; + glyph_ids = offsets + num_segs * 2; + + /* check last segment; its end count value must be 0xFFFF */ + if ( valid->level >= FT_VALIDATE_PARANOID ) + { + p = ends + ( num_segs - 1 ) * 2; + if ( TT_PEEK_USHORT( p ) != 0xFFFFU ) + FT_INVALID_DATA; + } + + { + FT_UInt start, end, offset, n; + FT_UInt last_start = 0, last_end = 0; + FT_Int delta; + FT_Byte* p_start = starts; + FT_Byte* p_end = ends; + FT_Byte* p_delta = deltas; + FT_Byte* p_offset = offsets; + + + for ( n = 0; n < num_segs; n++ ) + { + p = p_offset; + start = TT_NEXT_USHORT( p_start ); + end = TT_NEXT_USHORT( p_end ); + delta = TT_NEXT_SHORT( p_delta ); + offset = TT_NEXT_USHORT( p_offset ); + + if ( start > end ) + FT_INVALID_DATA; + + /* this test should be performed at default validation level; */ + /* unfortunately, some popular Asian fonts have overlapping */ + /* ranges in their charmaps */ + /* */ + if ( start <= last_end && n > 0 ) + { + if ( valid->level >= FT_VALIDATE_TIGHT ) + FT_INVALID_DATA; + else + { + /* allow overlapping segments, provided their start points */ + /* and end points, respectively, are in ascending order */ + /* */ + if ( last_start > start || last_end > end ) + error |= TT_CMAP_FLAG_UNSORTED; + else + error |= TT_CMAP_FLAG_OVERLAPPING; + } + } + + if ( offset && offset != 0xFFFFU ) + { + p += offset; /* start of glyph ID array */ + + /* check that we point within the glyph IDs table only */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + if ( p < glyph_ids || + p + ( end - start + 1 ) * 2 > table + length ) + FT_INVALID_DATA; + } + /* Some fonts handle the last segment incorrectly. In */ + /* theory, 0xFFFF might point to an ordinary glyph -- */ + /* a cmap 4 is versatile and could be used for any */ + /* encoding, not only Unicode. However, reality shows */ + /* that far too many fonts are sloppy and incorrectly */ + /* set all fields but `start' and `end' for the last */ + /* segment if it contains only a single character. */ + /* */ + /* We thus omit the test here, delaying it to the */ + /* routines that actually access the cmap. */ + else if ( n != num_segs - 1 || + !( start == 0xFFFFU && end == 0xFFFFU ) ) + { + if ( p < glyph_ids || + p + ( end - start + 1 ) * 2 > valid->limit ) + FT_INVALID_DATA; + } + + /* check glyph indices within the segment range */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt i, idx; + + + for ( i = start; i < end; i++ ) + { + idx = FT_NEXT_USHORT( p ); + if ( idx != 0 ) + { + idx = (FT_UInt)( (FT_Int)idx + delta ) & 0xFFFFU; + + if ( idx >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + } + } + else if ( offset == 0xFFFFU ) + { + /* some fonts (erroneously?) use a range offset of 0xFFFF */ + /* to mean missing glyph in cmap table */ + /* */ + if ( valid->level >= FT_VALIDATE_PARANOID || + n != num_segs - 1 || + !( start == 0xFFFFU && end == 0xFFFFU ) ) + FT_INVALID_DATA; + } + + last_start = start; + last_end = end; + } + } + + return error; + } + + + static FT_UInt + tt_cmap4_char_map_linear( TT_CMap cmap, + FT_UInt32* pcharcode, + FT_Bool next ) + { + TT_Face face = (TT_Face)cmap->cmap.charmap.face; + FT_Byte* limit = face->cmap_table + face->cmap_size; + + + FT_UInt num_segs2, start, end, offset; + FT_Int delta; + FT_UInt i, num_segs; + FT_UInt32 charcode = *pcharcode; + FT_UInt gindex = 0; + FT_Byte* p; + FT_Byte* q; + + + p = cmap->data + 6; + num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); + + num_segs = num_segs2 >> 1; + + if ( !num_segs ) + return 0; + + if ( next ) + charcode++; + + if ( charcode > 0xFFFFU ) + return 0; + + /* linear search */ + p = cmap->data + 14; /* ends table */ + q = cmap->data + 16 + num_segs2; /* starts table */ + + for ( i = 0; i < num_segs; i++ ) + { + end = TT_NEXT_USHORT( p ); + start = TT_NEXT_USHORT( q ); + + if ( charcode < start ) + { + if ( next ) + charcode = start; + else + break; + } + + Again: + if ( charcode <= end ) + { + FT_Byte* r; + + + r = q - 2 + num_segs2; + delta = TT_PEEK_SHORT( r ); + r += num_segs2; + offset = TT_PEEK_USHORT( r ); + + /* some fonts have an incorrect last segment; */ + /* we have to catch it */ + if ( i >= num_segs - 1 && + start == 0xFFFFU && end == 0xFFFFU ) + { + if ( offset && r + offset + 2 > limit ) + { + delta = 1; + offset = 0; + } + } + + if ( offset == 0xFFFFU ) + continue; + + if ( offset ) + { + r += offset + ( charcode - start ) * 2; + + /* if r > limit, the whole segment is invalid */ + if ( next && r > limit ) + continue; + + gindex = TT_PEEK_USHORT( r ); + if ( gindex ) + { + gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU; + if ( gindex >= (FT_UInt)face->root.num_glyphs ) + gindex = 0; + } + } + else + { + gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU; + + if ( next && gindex >= (FT_UInt)face->root.num_glyphs ) + { + /* we have an invalid glyph index; if there is an overflow, */ + /* we can adjust `charcode', otherwise the whole segment is */ + /* invalid */ + gindex = 0; + + if ( (FT_Int)charcode + delta < 0 && + (FT_Int)end + delta >= 0 ) + charcode = (FT_UInt)( -delta ); + + else if ( (FT_Int)charcode + delta < 0x10000L && + (FT_Int)end + delta >= 0x10000L ) + charcode = (FT_UInt)( 0x10000L - delta ); + + else + continue; + } + } + + if ( next && !gindex ) + { + if ( charcode >= 0xFFFFU ) + break; + + charcode++; + goto Again; + } + + break; + } + } + + if ( next ) + *pcharcode = charcode; + + return gindex; + } + + + static FT_UInt + tt_cmap4_char_map_binary( TT_CMap cmap, + FT_UInt32* pcharcode, + FT_Bool next ) + { + TT_Face face = (TT_Face)cmap->cmap.charmap.face; + FT_Byte* limit = face->cmap_table + face->cmap_size; + + FT_UInt num_segs2, start, end, offset; + FT_Int delta; + FT_UInt max, min, mid, num_segs; + FT_UInt charcode = (FT_UInt)*pcharcode; + FT_UInt gindex = 0; + FT_Byte* p; + + + p = cmap->data + 6; + num_segs2 = FT_PAD_FLOOR( TT_PEEK_USHORT( p ), 2 ); + + if ( !num_segs2 ) + return 0; + + num_segs = num_segs2 >> 1; + + /* make compiler happy */ + mid = num_segs; + end = 0xFFFFU; + + if ( next ) + charcode++; + + min = 0; + max = num_segs; + + /* binary search */ + while ( min < max ) + { + mid = ( min + max ) >> 1; + p = cmap->data + 14 + mid * 2; + end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + + if ( charcode < start ) + max = mid; + else if ( charcode > end ) + min = mid + 1; + else + { + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + /* some fonts have an incorrect last segment; */ + /* we have to catch it */ + if ( mid >= num_segs - 1 && + start == 0xFFFFU && end == 0xFFFFU ) + { + if ( offset && p + offset + 2 > limit ) + { + delta = 1; + offset = 0; + } + } + + /* search the first segment containing `charcode' */ + if ( cmap->flags & TT_CMAP_FLAG_OVERLAPPING ) + { + FT_UInt i; + + + /* call the current segment `max' */ + max = mid; + + if ( offset == 0xFFFFU ) + mid = max + 1; + + /* search in segments before the current segment */ + for ( i = max; i > 0; i-- ) + { + FT_UInt prev_end; + FT_Byte* old_p; + + + old_p = p; + p = cmap->data + 14 + ( i - 1 ) * 2; + prev_end = TT_PEEK_USHORT( p ); + + if ( charcode > prev_end ) + { + p = old_p; + break; + } + + end = prev_end; + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + if ( offset != 0xFFFFU ) + mid = i - 1; + } + + /* no luck */ + if ( mid == max + 1 ) + { + if ( i != max ) + { + p = cmap->data + 14 + max * 2; + end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + } + + mid = max; + + /* search in segments after the current segment */ + for ( i = max + 1; i < num_segs; i++ ) + { + FT_UInt next_end, next_start; + + + p = cmap->data + 14 + i * 2; + next_end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + next_start = TT_PEEK_USHORT( p ); + + if ( charcode < next_start ) + break; + + end = next_end; + start = next_start; + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + + if ( offset != 0xFFFFU ) + mid = i; + } + i--; + + /* still no luck */ + if ( mid == max ) + { + mid = i; + + break; + } + } + + /* end, start, delta, and offset are for the i'th segment */ + if ( mid != i ) + { + p = cmap->data + 14 + mid * 2; + end = TT_PEEK_USHORT( p ); + p += 2 + num_segs2; + start = TT_PEEK_USHORT( p ); + p += num_segs2; + delta = TT_PEEK_SHORT( p ); + p += num_segs2; + offset = TT_PEEK_USHORT( p ); + } + } + else + { + if ( offset == 0xFFFFU ) + break; + } + + if ( offset ) + { + p += offset + ( charcode - start ) * 2; + + /* if p > limit, the whole segment is invalid */ + if ( next && p > limit ) + break; + + gindex = TT_PEEK_USHORT( p ); + if ( gindex ) + { + gindex = (FT_UInt)( (FT_Int)gindex + delta ) & 0xFFFFU; + if ( gindex >= (FT_UInt)face->root.num_glyphs ) + gindex = 0; + } + } + else + { + gindex = (FT_UInt)( (FT_Int)charcode + delta ) & 0xFFFFU; + + if ( next && gindex >= (FT_UInt)face->root.num_glyphs ) + { + /* we have an invalid glyph index; if there is an overflow, */ + /* we can adjust `charcode', otherwise the whole segment is */ + /* invalid */ + gindex = 0; + + if ( (FT_Int)charcode + delta < 0 && + (FT_Int)end + delta >= 0 ) + charcode = (FT_UInt)( -delta ); + + else if ( (FT_Int)charcode + delta < 0x10000L && + (FT_Int)end + delta >= 0x10000L ) + charcode = (FT_UInt)( 0x10000L - delta ); + } + } + + break; + } + } + + if ( next ) + { + TT_CMap4 cmap4 = (TT_CMap4)cmap; + + + /* if `charcode' is not in any segment, then `mid' is */ + /* the segment nearest to `charcode' */ + + if ( charcode > end ) + { + mid++; + if ( mid == num_segs ) + return 0; + } + + if ( tt_cmap4_set_range( cmap4, mid ) ) + { + if ( gindex ) + *pcharcode = charcode; + } + else + { + cmap4->cur_charcode = charcode; + + if ( gindex ) + cmap4->cur_gindex = gindex; + else + { + cmap4->cur_charcode = charcode; + tt_cmap4_next( cmap4 ); + gindex = cmap4->cur_gindex; + } + + if ( gindex ) + *pcharcode = cmap4->cur_charcode; + } + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap4_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + if ( char_code >= 0x10000UL ) + return 0; + + if ( cmap->flags & TT_CMAP_FLAG_UNSORTED ) + return tt_cmap4_char_map_linear( cmap, &char_code, 0 ); + else + return tt_cmap4_char_map_binary( cmap, &char_code, 0 ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap4_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UInt gindex; + + + if ( *pchar_code >= 0xFFFFU ) + return 0; + + if ( cmap->flags & TT_CMAP_FLAG_UNSORTED ) + gindex = tt_cmap4_char_map_linear( cmap, pchar_code, 1 ); + else + { + TT_CMap4 cmap4 = (TT_CMap4)cmap; + + + /* no need to search */ + if ( *pchar_code == cmap4->cur_charcode ) + { + tt_cmap4_next( cmap4 ); + gindex = cmap4->cur_gindex; + if ( gindex ) + *pchar_code = cmap4->cur_charcode; + } + else + gindex = tt_cmap4_char_map_binary( cmap, pchar_code, 1 ); + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap4_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 4; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap4_class_rec, + + sizeof ( TT_CMap4Rec ), + + (FT_CMap_InitFunc) tt_cmap4_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap4_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap4_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 4, + (TT_CMap_ValidateFunc)tt_cmap4_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap4_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_4 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 6 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 6 */ + /* length 2 USHORT table length in bytes */ + /* language 4 USHORT Mac language code */ + /* */ + /* first 6 USHORT first segment code */ + /* count 8 USHORT segment size in chars */ + /* glyphIds 10 USHORT[count] glyph IDs */ + /* */ + /* A very simplified segment mapping. */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_6 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap6_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_UInt length, count; + + + if ( table + 10 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 2; + length = TT_NEXT_USHORT( p ); + + p = table + 8; /* skip language and start index */ + count = TT_NEXT_USHORT( p ); + + if ( table + length > valid->limit || length < 10 + count * 2 ) + FT_INVALID_TOO_SHORT; + + /* check glyph indices */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt gindex; + + + for ( ; count > 0; count-- ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap6_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* p = table + 6; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_UInt idx = (FT_UInt)( char_code - start ); + + + if ( idx < count ) + { + p += 2 * idx; + result = TT_PEEK_USHORT( p ); + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap6_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_Byte* table = cmap->data; + FT_UInt32 result = 0; + FT_UInt32 char_code = *pchar_code + 1; + FT_UInt gindex = 0; + + FT_Byte* p = table + 6; + FT_UInt start = TT_NEXT_USHORT( p ); + FT_UInt count = TT_NEXT_USHORT( p ); + FT_UInt idx; + + + if ( char_code >= 0x10000UL ) + return 0; + + if ( char_code < start ) + char_code = start; + + idx = (FT_UInt)( char_code - start ); + p += 2 * idx; + + for ( ; idx < count; idx++ ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex != 0 ) + { + result = char_code; + break; + } + + if ( char_code >= 0xFFFFU ) + return 0; + + char_code++; + } + + *pchar_code = result; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap6_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 4; + + + cmap_info->format = 6; + cmap_info->language = (FT_ULong)TT_PEEK_USHORT( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap6_class_rec, + + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap6_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap6_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 6, + (TT_CMap_ValidateFunc)tt_cmap6_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap6_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_6 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 8 *****/ + /***** *****/ + /***** It is hard to completely understand what the OpenType spec *****/ + /***** says about this format, but here is my conclusion. *****/ + /***** *****/ + /***** The purpose of this format is to easily map UTF-16 text to *****/ + /***** glyph indices. Basically, the `char_code' must be in one of *****/ + /***** the following formats. *****/ + /***** *****/ + /***** - A 16-bit value that isn't part of the Unicode Surrogates *****/ + /***** Area (i.e. U+D800-U+DFFF). *****/ + /***** *****/ + /***** - A 32-bit value, made of two surrogate values, i.e.. if *****/ + /***** `char_code = (char_hi << 16) | char_lo', then both *****/ + /***** `char_hi' and `char_lo' must be in the Surrogates Area. *****/ + /***** Area. *****/ + /***** *****/ + /***** The `is32' table embedded in the charmap indicates whether a *****/ + /***** given 16-bit value is in the surrogates area or not. *****/ + /***** *****/ + /***** So, for any given `char_code', we can assert the following. *****/ + /***** *****/ + /***** If `char_hi == 0' then we must have `is32[char_lo] == 0'. *****/ + /***** *****/ + /***** If `char_hi != 0' then we must have both *****/ + /***** `is32[char_hi] != 0' and `is32[char_lo] != 0'. *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 8 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* is32 12 BYTE[8192] 32-bitness bitmap */ + /* count 8204 ULONG number of groups */ + /* */ + /* This header is followed by `count' groups of the following format: */ + /* */ + /* start 0 ULONG first charcode */ + /* end 4 ULONG last charcode */ + /* startId 8 ULONG start glyph ID for the group */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_8 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap8_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 4; + FT_Byte* is32; + FT_UInt32 length; + FT_UInt32 num_groups; + + + if ( table + 16 + 8192 > valid->limit ) + FT_INVALID_TOO_SHORT; + + length = TT_NEXT_ULONG( p ); + if ( length > (FT_UInt32)( valid->limit - table ) || length < 8192 + 16 ) + FT_INVALID_TOO_SHORT; + + is32 = table + 12; + p = is32 + 8192; /* skip `is32' array */ + num_groups = TT_NEXT_ULONG( p ); + + /* p + num_groups * 12 > valid->limit ? */ + if ( num_groups > (FT_UInt32)( valid->limit - p ) / 12 ) + FT_INVALID_TOO_SHORT; + + /* check groups, they must be in increasing order */ + { + FT_UInt32 n, start, end, start_id, count, last = 0; + + + for ( n = 0; n < num_groups; n++ ) + { + FT_UInt hi, lo; + + + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( start > end ) + FT_INVALID_DATA; + + if ( n > 0 && start <= last ) + FT_INVALID_DATA; + + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt32 d = end - start; + + + /* start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ? */ + if ( d > TT_VALID_GLYPH_COUNT( valid ) || + start_id >= TT_VALID_GLYPH_COUNT( valid ) - d ) + FT_INVALID_GLYPH_ID; + + count = (FT_UInt32)( end - start + 1 ); + + if ( start & ~0xFFFFU ) + { + /* start_hi != 0; check that is32[i] is 1 for each i in */ + /* the `hi' and `lo' of the range [start..end] */ + for ( ; count > 0; count--, start++ ) + { + hi = (FT_UInt)( start >> 16 ); + lo = (FT_UInt)( start & 0xFFFFU ); + + if ( (is32[hi >> 3] & ( 0x80 >> ( hi & 7 ) ) ) == 0 ) + FT_INVALID_DATA; + + if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) == 0 ) + FT_INVALID_DATA; + } + } + else + { + /* start_hi == 0; check that is32[i] is 0 for each i in */ + /* the range [start..end] */ + + /* end_hi cannot be != 0! */ + if ( end & ~0xFFFFU ) + FT_INVALID_DATA; + + for ( ; count > 0; count--, start++ ) + { + lo = (FT_UInt)( start & 0xFFFFU ); + + if ( (is32[lo >> 3] & ( 0x80 >> ( lo & 7 ) ) ) != 0 ) + FT_INVALID_DATA; + } + } + } + + last = end; + } + } + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap8_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* p = table + 8204; + FT_UInt32 num_groups = TT_NEXT_ULONG( p ); + FT_UInt32 start, end, start_id; + + + for ( ; num_groups > 0; num_groups-- ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + break; + + if ( char_code <= end ) + { + if ( start_id > 0xFFFFFFFFUL - ( char_code - start ) ) + return 0; + + result = (FT_UInt)( start_id + ( char_code - start ) ); + break; + } + } + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap8_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_Face face = cmap->cmap.charmap.face; + FT_UInt32 result = 0; + FT_UInt32 char_code; + FT_UInt gindex = 0; + FT_Byte* table = cmap->data; + FT_Byte* p = table + 8204; + FT_UInt32 num_groups = TT_NEXT_ULONG( p ); + FT_UInt32 start, end, start_id; + + + if ( *pchar_code >= 0xFFFFFFFFUL ) + return 0; + + char_code = *pchar_code + 1; + + p = table + 8208; + + for ( ; num_groups > 0; num_groups-- ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + char_code = start; + + Again: + if ( char_code <= end ) + { + /* ignore invalid group */ + if ( start_id > 0xFFFFFFFFUL - ( char_code - start ) ) + continue; + + gindex = (FT_UInt)( start_id + ( char_code - start ) ); + + /* does first element of group point to `.notdef' glyph? */ + if ( gindex == 0 ) + { + if ( char_code >= 0xFFFFFFFFUL ) + break; + + char_code++; + goto Again; + } + + /* if `gindex' is invalid, the remaining values */ + /* in this group are invalid, too */ + if ( gindex >= (FT_UInt)face->num_glyphs ) + { + gindex = 0; + continue; + } + + result = char_code; + break; + } + } + + *pchar_code = result; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap8_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->format = 8; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap8_class_rec, + + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap8_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap8_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 8, + (TT_CMap_ValidateFunc)tt_cmap8_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap8_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_8 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 10 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 10 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* */ + /* start 12 ULONG first char in range */ + /* count 16 ULONG number of chars in range */ + /* glyphIds 20 USHORT[count] glyph indices covered */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_10 + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap10_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p = table + 4; + FT_ULong length, count; + + + if ( table + 20 > valid->limit ) + FT_INVALID_TOO_SHORT; + + length = TT_NEXT_ULONG( p ); + p = table + 16; + count = TT_NEXT_ULONG( p ); + + if ( length > (FT_ULong)( valid->limit - table ) || + /* length < 20 + count * 2 ? */ + length < 20 || + ( length - 20 ) / 2 < count ) + FT_INVALID_TOO_SHORT; + + /* check glyph indices */ + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt gindex; + + + for ( ; count > 0; count-- ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap10_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_Byte* table = cmap->data; + FT_UInt result = 0; + FT_Byte* p = table + 12; + FT_UInt32 start = TT_NEXT_ULONG( p ); + FT_UInt32 count = TT_NEXT_ULONG( p ); + FT_UInt32 idx; + + + if ( char_code < start ) + return 0; + + idx = char_code - start; + + if ( idx < count ) + { + p += 2 * idx; + result = TT_PEEK_USHORT( p ); + } + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap10_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_Byte* table = cmap->data; + FT_UInt32 char_code; + FT_UInt gindex = 0; + FT_Byte* p = table + 12; + FT_UInt32 start = TT_NEXT_ULONG( p ); + FT_UInt32 count = TT_NEXT_ULONG( p ); + FT_UInt32 idx; + + + if ( *pchar_code >= 0xFFFFFFFFUL ) + return 0; + + char_code = *pchar_code + 1; + + if ( char_code < start ) + char_code = start; + + idx = char_code - start; + p += 2 * idx; + + for ( ; idx < count; idx++ ) + { + gindex = TT_NEXT_USHORT( p ); + if ( gindex != 0 ) + break; + + if ( char_code >= 0xFFFFFFFFUL ) + return 0; + + char_code++; + } + + *pchar_code = char_code; + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap10_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->format = 10; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap10_class_rec, + + sizeof ( TT_CMapRec ), + + (FT_CMap_InitFunc) tt_cmap_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap10_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap10_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 10, + (TT_CMap_ValidateFunc)tt_cmap10_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap10_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_10 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 12 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 12 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* count 12 ULONG number of groups */ + /* 16 */ + /* */ + /* This header is followed by `count' groups of the following format: */ + /* */ + /* start 0 ULONG first charcode */ + /* end 4 ULONG last charcode */ + /* startId 8 ULONG start glyph ID for the group */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_12 + + typedef struct TT_CMap12Rec_ + { + TT_CMapRec cmap; + FT_Bool valid; + FT_ULong cur_charcode; + FT_UInt cur_gindex; + FT_ULong cur_group; + FT_ULong num_groups; + + } TT_CMap12Rec, *TT_CMap12; + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_init( TT_CMap12 cmap, + FT_Byte* table ) + { + cmap->cmap.data = table; + + table += 12; + cmap->num_groups = FT_PEEK_ULONG( table ); + + cmap->valid = 0; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_ULong length; + FT_ULong num_groups; + + + if ( table + 16 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 4; + length = TT_NEXT_ULONG( p ); + + p = table + 12; + num_groups = TT_NEXT_ULONG( p ); + + if ( length > (FT_ULong)( valid->limit - table ) || + /* length < 16 + 12 * num_groups ? */ + length < 16 || + ( length - 16 ) / 12 < num_groups ) + FT_INVALID_TOO_SHORT; + + /* check groups, they must be in increasing order */ + { + FT_ULong n, start, end, start_id, last = 0; + + + for ( n = 0; n < num_groups; n++ ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_NEXT_ULONG( p ); + + if ( start > end ) + FT_INVALID_DATA; + + if ( n > 0 && start <= last ) + FT_INVALID_DATA; + + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + FT_UInt32 d = end - start; + + + /* start_id + end - start >= TT_VALID_GLYPH_COUNT( valid ) ? */ + if ( d > TT_VALID_GLYPH_COUNT( valid ) || + start_id >= TT_VALID_GLYPH_COUNT( valid ) - d ) + FT_INVALID_GLYPH_ID; + } + + last = end; + } + } + + return FT_Err_Ok; + } + + + /* search the index of the charcode next to cmap->cur_charcode */ + /* cmap->cur_group should be set up properly by caller */ + /* */ + static void + tt_cmap12_next( TT_CMap12 cmap ) + { + FT_Face face = cmap->cmap.cmap.charmap.face; + FT_Byte* p; + FT_ULong start, end, start_id, char_code; + FT_ULong n; + FT_UInt gindex; + + + if ( cmap->cur_charcode >= 0xFFFFFFFFUL ) + goto Fail; + + char_code = cmap->cur_charcode + 1; + + for ( n = cmap->cur_group; n < cmap->num_groups; n++ ) + { + p = cmap->cmap.data + 16 + 12 * n; + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + start_id = TT_PEEK_ULONG( p ); + + if ( char_code < start ) + char_code = start; + + Again: + if ( char_code <= end ) + { + /* ignore invalid group */ + if ( start_id > 0xFFFFFFFFUL - ( char_code - start ) ) + continue; + + gindex = (FT_UInt)( start_id + ( char_code - start ) ); + + /* does first element of group point to `.notdef' glyph? */ + if ( gindex == 0 ) + { + if ( char_code >= 0xFFFFFFFFUL ) + goto Fail; + + char_code++; + goto Again; + } + + /* if `gindex' is invalid, the remaining values */ + /* in this group are invalid, too */ + if ( gindex >= (FT_UInt)face->num_glyphs ) + { + gindex = 0; + continue; + } + + cmap->cur_charcode = char_code; + cmap->cur_gindex = gindex; + cmap->cur_group = n; + + return; + } + } + + Fail: + cmap->valid = 0; + } + + + static FT_UInt + tt_cmap12_char_map_binary( TT_CMap cmap, + FT_UInt32* pchar_code, + FT_Bool next ) + { + FT_UInt gindex = 0; + FT_Byte* p = cmap->data + 12; + FT_UInt32 num_groups = TT_PEEK_ULONG( p ); + FT_UInt32 char_code = *pchar_code; + FT_UInt32 start, end, start_id; + FT_UInt32 max, min, mid; + + + if ( !num_groups ) + return 0; + + /* make compiler happy */ + mid = num_groups; + end = 0xFFFFFFFFUL; + + if ( next ) + { + if ( char_code >= 0xFFFFFFFFUL ) + return 0; + + char_code++; + } + + min = 0; + max = num_groups; + + /* binary search */ + while ( min < max ) + { + mid = ( min + max ) >> 1; + p = cmap->data + 16 + 12 * mid; + + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + max = mid; + else if ( char_code > end ) + min = mid + 1; + else + { + start_id = TT_PEEK_ULONG( p ); + + /* reject invalid glyph index */ + if ( start_id > 0xFFFFFFFFUL - ( char_code - start ) ) + gindex = 0; + else + gindex = (FT_UInt)( start_id + ( char_code - start ) ); + break; + } + } + + if ( next ) + { + FT_Face face = cmap->cmap.charmap.face; + TT_CMap12 cmap12 = (TT_CMap12)cmap; + + + /* if `char_code' is not in any group, then `mid' is */ + /* the group nearest to `char_code' */ + + if ( char_code > end ) + { + mid++; + if ( mid == num_groups ) + return 0; + } + + cmap12->valid = 1; + cmap12->cur_charcode = char_code; + cmap12->cur_group = mid; + + if ( gindex >= (FT_UInt)face->num_glyphs ) + gindex = 0; + + if ( !gindex ) + { + tt_cmap12_next( cmap12 ); + + if ( cmap12->valid ) + gindex = cmap12->cur_gindex; + } + else + cmap12->cur_gindex = gindex; + + *pchar_code = cmap12->cur_charcode; + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap12_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + return tt_cmap12_char_map_binary( cmap, &char_code, 0 ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap12_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + TT_CMap12 cmap12 = (TT_CMap12)cmap; + FT_UInt gindex; + + + /* no need to search */ + if ( cmap12->valid && cmap12->cur_charcode == *pchar_code ) + { + tt_cmap12_next( cmap12 ); + if ( cmap12->valid ) + { + gindex = cmap12->cur_gindex; + *pchar_code = (FT_UInt32)cmap12->cur_charcode; + } + else + gindex = 0; + } + else + gindex = tt_cmap12_char_map_binary( cmap, pchar_code, 1 ); + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap12_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->format = 12; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap12_class_rec, + + sizeof ( TT_CMap12Rec ), + + (FT_CMap_InitFunc) tt_cmap12_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap12_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap12_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 12, + (TT_CMap_ValidateFunc)tt_cmap12_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap12_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_12 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 13 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 13 */ + /* reserved 2 USHORT reserved */ + /* length 4 ULONG length in bytes */ + /* language 8 ULONG Mac language code */ + /* count 12 ULONG number of groups */ + /* 16 */ + /* */ + /* This header is followed by `count' groups of the following format: */ + /* */ + /* start 0 ULONG first charcode */ + /* end 4 ULONG last charcode */ + /* glyphId 8 ULONG glyph ID for the whole group */ + /* */ + +#ifdef TT_CONFIG_CMAP_FORMAT_13 + + typedef struct TT_CMap13Rec_ + { + TT_CMapRec cmap; + FT_Bool valid; + FT_ULong cur_charcode; + FT_UInt cur_gindex; + FT_ULong cur_group; + FT_ULong num_groups; + + } TT_CMap13Rec, *TT_CMap13; + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap13_init( TT_CMap13 cmap, + FT_Byte* table ) + { + cmap->cmap.data = table; + + table += 12; + cmap->num_groups = FT_PEEK_ULONG( table ); + + cmap->valid = 0; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap13_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_ULong length; + FT_ULong num_groups; + + + if ( table + 16 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 4; + length = TT_NEXT_ULONG( p ); + + p = table + 12; + num_groups = TT_NEXT_ULONG( p ); + + if ( length > (FT_ULong)( valid->limit - table ) || + /* length < 16 + 12 * num_groups ? */ + length < 16 || + ( length - 16 ) / 12 < num_groups ) + FT_INVALID_TOO_SHORT; + + /* check groups, they must be in increasing order */ + { + FT_ULong n, start, end, glyph_id, last = 0; + + + for ( n = 0; n < num_groups; n++ ) + { + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + glyph_id = TT_NEXT_ULONG( p ); + + if ( start > end ) + FT_INVALID_DATA; + + if ( n > 0 && start <= last ) + FT_INVALID_DATA; + + if ( valid->level >= FT_VALIDATE_TIGHT ) + { + if ( glyph_id >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + + last = end; + } + } + + return FT_Err_Ok; + } + + + /* search the index of the charcode next to cmap->cur_charcode */ + /* cmap->cur_group should be set up properly by caller */ + /* */ + static void + tt_cmap13_next( TT_CMap13 cmap ) + { + FT_Face face = cmap->cmap.cmap.charmap.face; + FT_Byte* p; + FT_ULong start, end, glyph_id, char_code; + FT_ULong n; + FT_UInt gindex; + + + if ( cmap->cur_charcode >= 0xFFFFFFFFUL ) + goto Fail; + + char_code = cmap->cur_charcode + 1; + + for ( n = cmap->cur_group; n < cmap->num_groups; n++ ) + { + p = cmap->cmap.data + 16 + 12 * n; + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + glyph_id = TT_PEEK_ULONG( p ); + + if ( char_code < start ) + char_code = start; + + if ( char_code <= end ) + { + gindex = (FT_UInt)glyph_id; + + if ( gindex && gindex < (FT_UInt)face->num_glyphs ) + { + cmap->cur_charcode = char_code; + cmap->cur_gindex = gindex; + cmap->cur_group = n; + + return; + } + } + } + + Fail: + cmap->valid = 0; + } + + + static FT_UInt + tt_cmap13_char_map_binary( TT_CMap cmap, + FT_UInt32* pchar_code, + FT_Bool next ) + { + FT_UInt gindex = 0; + FT_Byte* p = cmap->data + 12; + FT_UInt32 num_groups = TT_PEEK_ULONG( p ); + FT_UInt32 char_code = *pchar_code; + FT_UInt32 start, end; + FT_UInt32 max, min, mid; + + + if ( !num_groups ) + return 0; + + /* make compiler happy */ + mid = num_groups; + end = 0xFFFFFFFFUL; + + if ( next ) + { + if ( char_code >= 0xFFFFFFFFUL ) + return 0; + + char_code++; + } + + min = 0; + max = num_groups; + + /* binary search */ + while ( min < max ) + { + mid = ( min + max ) >> 1; + p = cmap->data + 16 + 12 * mid; + + start = TT_NEXT_ULONG( p ); + end = TT_NEXT_ULONG( p ); + + if ( char_code < start ) + max = mid; + else if ( char_code > end ) + min = mid + 1; + else + { + gindex = (FT_UInt)TT_PEEK_ULONG( p ); + + break; + } + } + + if ( next ) + { + FT_Face face = cmap->cmap.charmap.face; + TT_CMap13 cmap13 = (TT_CMap13)cmap; + + + /* if `char_code' is not in any group, then `mid' is */ + /* the group nearest to `char_code' */ + + if ( char_code > end ) + { + mid++; + if ( mid == num_groups ) + return 0; + } + + cmap13->valid = 1; + cmap13->cur_charcode = char_code; + cmap13->cur_group = mid; + + if ( gindex >= (FT_UInt)face->num_glyphs ) + gindex = 0; + + if ( !gindex ) + { + tt_cmap13_next( cmap13 ); + + if ( cmap13->valid ) + gindex = cmap13->cur_gindex; + } + else + cmap13->cur_gindex = gindex; + + *pchar_code = cmap13->cur_charcode; + } + + return gindex; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap13_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + return tt_cmap13_char_map_binary( cmap, &char_code, 0 ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap13_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + TT_CMap13 cmap13 = (TT_CMap13)cmap; + FT_UInt gindex; + + + /* no need to search */ + if ( cmap13->valid && cmap13->cur_charcode == *pchar_code ) + { + tt_cmap13_next( cmap13 ); + if ( cmap13->valid ) + { + gindex = cmap13->cur_gindex; + *pchar_code = cmap13->cur_charcode; + } + else + gindex = 0; + } + else + gindex = tt_cmap13_char_map_binary( cmap, pchar_code, 1 ); + + return gindex; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap13_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_Byte* p = cmap->data + 8; + + + cmap_info->format = 13; + cmap_info->language = (FT_ULong)TT_PEEK_ULONG( p ); + + return FT_Err_Ok; + } + + + FT_DEFINE_TT_CMAP( + tt_cmap13_class_rec, + + sizeof ( TT_CMap13Rec ), + + (FT_CMap_InitFunc) tt_cmap13_init, /* init */ + (FT_CMap_DoneFunc) NULL, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap13_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap13_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + 13, + (TT_CMap_ValidateFunc)tt_cmap13_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap13_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_13 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** FORMAT 14 *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* TABLE OVERVIEW */ + /* -------------- */ + /* */ + /* NAME OFFSET TYPE DESCRIPTION */ + /* */ + /* format 0 USHORT must be 14 */ + /* length 2 ULONG table length in bytes */ + /* numSelector 6 ULONG number of variation sel. records */ + /* */ + /* Followed by numSelector records, each of which looks like */ + /* */ + /* varSelector 0 UINT24 Unicode codepoint of sel. */ + /* defaultOff 3 ULONG offset to a default UVS table */ + /* describing any variants to be found in */ + /* the normal Unicode subtable. */ + /* nonDefOff 7 ULONG offset to a non-default UVS table */ + /* describing any variants not in the */ + /* standard cmap, with GIDs here */ + /* (either offset may be 0 NULL) */ + /* */ + /* Selectors are sorted by code point. */ + /* */ + /* A default Unicode Variation Selector (UVS) subtable is just a list of */ + /* ranges of code points which are to be found in the standard cmap. No */ + /* glyph IDs (GIDs) here. */ + /* */ + /* numRanges 0 ULONG number of ranges following */ + /* */ + /* A range looks like */ + /* */ + /* uniStart 0 UINT24 code point of the first character in */ + /* this range */ + /* additionalCnt 3 UBYTE count of additional characters in this */ + /* range (zero means a range of a single */ + /* character) */ + /* */ + /* Ranges are sorted by `uniStart'. */ + /* */ + /* A non-default Unicode Variation Selector (UVS) subtable is a list of */ + /* mappings from codepoint to GID. */ + /* */ + /* numMappings 0 ULONG number of mappings */ + /* */ + /* A range looks like */ + /* */ + /* uniStart 0 UINT24 code point of the first character in */ + /* this range */ + /* GID 3 USHORT and its GID */ + /* */ + /* Ranges are sorted by `uniStart'. */ + +#ifdef TT_CONFIG_CMAP_FORMAT_14 + + typedef struct TT_CMap14Rec_ + { + TT_CMapRec cmap; + FT_ULong num_selectors; + + /* This array is used to store the results of various + * cmap 14 query functions. The data is overwritten + * on each call to these functions. + */ + FT_UInt32 max_results; + FT_UInt32* results; + FT_Memory memory; + + } TT_CMap14Rec, *TT_CMap14; + + + FT_CALLBACK_DEF( void ) + tt_cmap14_done( TT_CMap14 cmap ) + { + FT_Memory memory = cmap->memory; + + + cmap->max_results = 0; + if ( memory && cmap->results ) + FT_FREE( cmap->results ); + } + + + static FT_Error + tt_cmap14_ensure( TT_CMap14 cmap, + FT_UInt32 num_results, + FT_Memory memory ) + { + FT_UInt32 old_max = cmap->max_results; + FT_Error error = FT_Err_Ok; + + + if ( num_results > cmap->max_results ) + { + cmap->memory = memory; + + if ( FT_QRENEW_ARRAY( cmap->results, old_max, num_results ) ) + return error; + + cmap->max_results = num_results; + } + + return error; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap14_init( TT_CMap14 cmap, + FT_Byte* table ) + { + cmap->cmap.data = table; + + table += 6; + cmap->num_selectors = FT_PEEK_ULONG( table ); + cmap->max_results = 0; + cmap->results = NULL; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap14_validate( FT_Byte* table, + FT_Validator valid ) + { + FT_Byte* p; + FT_ULong length; + FT_ULong num_selectors; + + + if ( table + 2 + 4 + 4 > valid->limit ) + FT_INVALID_TOO_SHORT; + + p = table + 2; + length = TT_NEXT_ULONG( p ); + num_selectors = TT_NEXT_ULONG( p ); + + if ( length > (FT_ULong)( valid->limit - table ) || + /* length < 10 + 11 * num_selectors ? */ + length < 10 || + ( length - 10 ) / 11 < num_selectors ) + FT_INVALID_TOO_SHORT; + + /* check selectors, they must be in increasing order */ + { + /* we start lastVarSel at 1 because a variant selector value of 0 + * isn't valid. + */ + FT_ULong n, lastVarSel = 1; + + + for ( n = 0; n < num_selectors; n++ ) + { + FT_ULong varSel = TT_NEXT_UINT24( p ); + FT_ULong defOff = TT_NEXT_ULONG( p ); + FT_ULong nondefOff = TT_NEXT_ULONG( p ); + + + if ( defOff >= length || nondefOff >= length ) + FT_INVALID_TOO_SHORT; + + if ( varSel < lastVarSel ) + FT_INVALID_DATA; + + lastVarSel = varSel + 1; + + /* check the default table (these glyphs should be reached */ + /* through the normal Unicode cmap, no GIDs, just check order) */ + if ( defOff != 0 ) + { + FT_Byte* defp = table + defOff; + FT_ULong numRanges; + FT_ULong i; + FT_ULong lastBase = 0; + + + if ( defp + 4 > valid->limit ) + FT_INVALID_TOO_SHORT; + + numRanges = TT_NEXT_ULONG( defp ); + + /* defp + numRanges * 4 > valid->limit ? */ + if ( numRanges > (FT_ULong)( valid->limit - defp ) / 4 ) + FT_INVALID_TOO_SHORT; + + for ( i = 0; i < numRanges; i++ ) + { + FT_ULong base = TT_NEXT_UINT24( defp ); + FT_ULong cnt = FT_NEXT_BYTE( defp ); + + + if ( base + cnt >= 0x110000UL ) /* end of Unicode */ + FT_INVALID_DATA; + + if ( base < lastBase ) + FT_INVALID_DATA; + + lastBase = base + cnt + 1U; + } + } + + /* and the non-default table (these glyphs are specified here) */ + if ( nondefOff != 0 ) + { + FT_Byte* ndp = table + nondefOff; + FT_ULong numMappings; + FT_ULong i, lastUni = 0; + + + if ( ndp + 4 > valid->limit ) + FT_INVALID_TOO_SHORT; + + numMappings = TT_NEXT_ULONG( ndp ); + + /* numMappings * 5 > (FT_ULong)( valid->limit - ndp ) ? */ + if ( numMappings > ( (FT_ULong)( valid->limit - ndp ) ) / 5 ) + FT_INVALID_TOO_SHORT; + + for ( i = 0; i < numMappings; i++ ) + { + FT_ULong uni = TT_NEXT_UINT24( ndp ); + FT_ULong gid = TT_NEXT_USHORT( ndp ); + + + if ( uni >= 0x110000UL ) /* end of Unicode */ + FT_INVALID_DATA; + + if ( uni < lastUni ) + FT_INVALID_DATA; + + lastUni = uni + 1U; + + if ( valid->level >= FT_VALIDATE_TIGHT && + gid >= TT_VALID_GLYPH_COUNT( valid ) ) + FT_INVALID_GLYPH_ID; + } + } + } + } + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap14_char_index( TT_CMap cmap, + FT_UInt32 char_code ) + { + FT_UNUSED( cmap ); + FT_UNUSED( char_code ); + + /* This can't happen */ + return 0; + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap14_char_next( TT_CMap cmap, + FT_UInt32 *pchar_code ) + { + FT_UNUSED( cmap ); + + /* This can't happen */ + *pchar_code = 0; + return 0; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap14_get_info( TT_CMap cmap, + TT_CMapInfo *cmap_info ) + { + FT_UNUSED( cmap ); + + cmap_info->format = 14; + /* subtable 14 does not define a language field */ + cmap_info->language = 0xFFFFFFFFUL; + + return FT_Err_Ok; + } + + + static FT_UInt + tt_cmap14_char_map_def_binary( FT_Byte *base, + FT_UInt32 char_code ) + { + FT_UInt32 numRanges = TT_PEEK_ULONG( base ); + FT_UInt32 max, min; + + + min = 0; + max = numRanges; + + base += 4; + + /* binary search */ + while ( min < max ) + { + FT_UInt32 mid = ( min + max ) >> 1; + FT_Byte* p = base + 4 * mid; + FT_ULong start = TT_NEXT_UINT24( p ); + FT_UInt cnt = FT_NEXT_BYTE( p ); + + + if ( char_code < start ) + max = mid; + else if ( char_code > start + cnt ) + min = mid + 1; + else + return TRUE; + } + + return FALSE; + } + + + static FT_UInt + tt_cmap14_char_map_nondef_binary( FT_Byte *base, + FT_UInt32 char_code ) + { + FT_UInt32 numMappings = TT_PEEK_ULONG( base ); + FT_UInt32 max, min; + + + min = 0; + max = numMappings; + + base += 4; + + /* binary search */ + while ( min < max ) + { + FT_UInt32 mid = ( min + max ) >> 1; + FT_Byte* p = base + 5 * mid; + FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p ); + + + if ( char_code < uni ) + max = mid; + else if ( char_code > uni ) + min = mid + 1; + else + return TT_PEEK_USHORT( p ); + } + + return 0; + } + + + static FT_Byte* + tt_cmap14_find_variant( FT_Byte *base, + FT_UInt32 variantCode ) + { + FT_UInt32 numVar = TT_PEEK_ULONG( base ); + FT_UInt32 max, min; + + + min = 0; + max = numVar; + + base += 4; + + /* binary search */ + while ( min < max ) + { + FT_UInt32 mid = ( min + max ) >> 1; + FT_Byte* p = base + 11 * mid; + FT_ULong varSel = TT_NEXT_UINT24( p ); + + + if ( variantCode < varSel ) + max = mid; + else if ( variantCode > varSel ) + min = mid + 1; + else + return p; + } + + return NULL; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap14_char_var_index( TT_CMap cmap, + TT_CMap ucmap, + FT_UInt32 charcode, + FT_UInt32 variantSelector ) + { + FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector ); + FT_ULong defOff; + FT_ULong nondefOff; + + + if ( !p ) + return 0; + + defOff = TT_NEXT_ULONG( p ); + nondefOff = TT_PEEK_ULONG( p ); + + if ( defOff != 0 && + tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) ) + { + /* This is the default variant of this charcode. GID not stored */ + /* here; stored in the normal Unicode charmap instead. */ + return ucmap->cmap.clazz->char_index( &ucmap->cmap, charcode ); + } + + if ( nondefOff != 0 ) + return tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, + charcode ); + + return 0; + } + + + FT_CALLBACK_DEF( FT_Int ) + tt_cmap14_char_var_isdefault( TT_CMap cmap, + FT_UInt32 charcode, + FT_UInt32 variantSelector ) + { + FT_Byte* p = tt_cmap14_find_variant( cmap->data + 6, variantSelector ); + FT_ULong defOff; + FT_ULong nondefOff; + + + if ( !p ) + return -1; + + defOff = TT_NEXT_ULONG( p ); + nondefOff = TT_NEXT_ULONG( p ); + + if ( defOff != 0 && + tt_cmap14_char_map_def_binary( cmap->data + defOff, charcode ) ) + return 1; + + if ( nondefOff != 0 && + tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, + charcode ) != 0 ) + return 0; + + return -1; + } + + + FT_CALLBACK_DEF( FT_UInt32* ) + tt_cmap14_variants( TT_CMap cmap, + FT_Memory memory ) + { + TT_CMap14 cmap14 = (TT_CMap14)cmap; + FT_UInt32 count = cmap14->num_selectors; + FT_Byte* p = cmap->data + 10; + FT_UInt32* result; + FT_UInt32 i; + + + if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) ) + return NULL; + + result = cmap14->results; + for ( i = 0; i < count; i++ ) + { + result[i] = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 8; + } + result[i] = 0; + + return result; + } + + + FT_CALLBACK_DEF( FT_UInt32 * ) + tt_cmap14_char_variants( TT_CMap cmap, + FT_Memory memory, + FT_UInt32 charCode ) + { + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 count = cmap14->num_selectors; + FT_Byte* p = cmap->data + 10; + FT_UInt32* q; + + + if ( tt_cmap14_ensure( cmap14, ( count + 1 ), memory ) ) + return NULL; + + for ( q = cmap14->results; count > 0; count-- ) + { + FT_UInt32 varSel = TT_NEXT_UINT24( p ); + FT_ULong defOff = TT_NEXT_ULONG( p ); + FT_ULong nondefOff = TT_NEXT_ULONG( p ); + + + if ( ( defOff != 0 && + tt_cmap14_char_map_def_binary( cmap->data + defOff, + charCode ) ) || + ( nondefOff != 0 && + tt_cmap14_char_map_nondef_binary( cmap->data + nondefOff, + charCode ) != 0 ) ) + { + q[0] = varSel; + q++; + } + } + q[0] = 0; + + return cmap14->results; + } + + + static FT_UInt + tt_cmap14_def_char_count( FT_Byte *p ) + { + FT_UInt32 numRanges = (FT_UInt32)TT_NEXT_ULONG( p ); + FT_UInt tot = 0; + + + p += 3; /* point to the first `cnt' field */ + for ( ; numRanges > 0; numRanges-- ) + { + tot += 1 + p[0]; + p += 4; + } + + return tot; + } + + + static FT_UInt32* + tt_cmap14_get_def_chars( TT_CMap cmap, + FT_Byte* p, + FT_Memory memory ) + { + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 numRanges; + FT_UInt cnt; + FT_UInt32* q; + + + cnt = tt_cmap14_def_char_count( p ); + numRanges = (FT_UInt32)TT_NEXT_ULONG( p ); + + if ( tt_cmap14_ensure( cmap14, ( cnt + 1 ), memory ) ) + return NULL; + + for ( q = cmap14->results; numRanges > 0; numRanges-- ) + { + FT_UInt32 uni = (FT_UInt32)TT_NEXT_UINT24( p ); + + + cnt = FT_NEXT_BYTE( p ) + 1; + do + { + q[0] = uni; + uni += 1; + q += 1; + + } while ( --cnt != 0 ); + } + q[0] = 0; + + return cmap14->results; + } + + + static FT_UInt32* + tt_cmap14_get_nondef_chars( TT_CMap cmap, + FT_Byte *p, + FT_Memory memory ) + { + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 numMappings; + FT_UInt i; + FT_UInt32 *ret; + + + numMappings = (FT_UInt32)TT_NEXT_ULONG( p ); + + if ( tt_cmap14_ensure( cmap14, ( numMappings + 1 ), memory ) ) + return NULL; + + ret = cmap14->results; + for ( i = 0; i < numMappings; i++ ) + { + ret[i] = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + } + ret[i] = 0; + + return ret; + } + + + FT_CALLBACK_DEF( FT_UInt32 * ) + tt_cmap14_variant_chars( TT_CMap cmap, + FT_Memory memory, + FT_UInt32 variantSelector ) + { + FT_Byte *p = tt_cmap14_find_variant( cmap->data + 6, + variantSelector ); + FT_Int i; + FT_ULong defOff; + FT_ULong nondefOff; + + + if ( !p ) + return NULL; + + defOff = TT_NEXT_ULONG( p ); + nondefOff = TT_NEXT_ULONG( p ); + + if ( defOff == 0 && nondefOff == 0 ) + return NULL; + + if ( defOff == 0 ) + return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff, + memory ); + else if ( nondefOff == 0 ) + return tt_cmap14_get_def_chars( cmap, cmap->data + defOff, + memory ); + else + { + /* Both a default and a non-default glyph set? That's probably not */ + /* good font design, but the spec allows for it... */ + TT_CMap14 cmap14 = (TT_CMap14) cmap; + FT_UInt32 numRanges; + FT_UInt32 numMappings; + FT_UInt32 duni; + FT_UInt32 dcnt; + FT_UInt32 nuni; + FT_Byte* dp; + FT_UInt di, ni, k; + + FT_UInt32 *ret; + + + p = cmap->data + nondefOff; + dp = cmap->data + defOff; + + numMappings = (FT_UInt32)TT_NEXT_ULONG( p ); + dcnt = tt_cmap14_def_char_count( dp ); + numRanges = (FT_UInt32)TT_NEXT_ULONG( dp ); + + if ( numMappings == 0 ) + return tt_cmap14_get_def_chars( cmap, cmap->data + defOff, + memory ); + if ( dcnt == 0 ) + return tt_cmap14_get_nondef_chars( cmap, cmap->data + nondefOff, + memory ); + + if ( tt_cmap14_ensure( cmap14, ( dcnt + numMappings + 1 ), memory ) ) + return NULL; + + ret = cmap14->results; + duni = (FT_UInt32)TT_NEXT_UINT24( dp ); + dcnt = FT_NEXT_BYTE( dp ); + di = 1; + nuni = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + ni = 1; + i = 0; + + for (;;) + { + if ( nuni > duni + dcnt ) + { + for ( k = 0; k <= dcnt; k++ ) + ret[i++] = duni + k; + + di++; + + if ( di > numRanges ) + break; + + duni = (FT_UInt32)TT_NEXT_UINT24( dp ); + dcnt = FT_NEXT_BYTE( dp ); + } + else + { + if ( nuni < duni ) + ret[i++] = nuni; + /* If it is within the default range then ignore it -- */ + /* that should not have happened */ + ni++; + if ( ni > numMappings ) + break; + + nuni = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + } + } + + if ( ni <= numMappings ) + { + /* If we get here then we have run out of all default ranges. */ + /* We have read one non-default mapping which we haven't stored */ + /* and there may be others that need to be read. */ + ret[i++] = nuni; + while ( ni < numMappings ) + { + ret[i++] = (FT_UInt32)TT_NEXT_UINT24( p ); + p += 2; + ni++; + } + } + else if ( di <= numRanges ) + { + /* If we get here then we have run out of all non-default */ + /* mappings. We have read one default range which we haven't */ + /* stored and there may be others that need to be read. */ + for ( k = 0; k <= dcnt; k++ ) + ret[i++] = duni + k; + + while ( di < numRanges ) + { + duni = (FT_UInt32)TT_NEXT_UINT24( dp ); + dcnt = FT_NEXT_BYTE( dp ); + + for ( k = 0; k <= dcnt; k++ ) + ret[i++] = duni + k; + di++; + } + } + + ret[i] = 0; + + return ret; + } + } + + + FT_DEFINE_TT_CMAP( + tt_cmap14_class_rec, + + sizeof ( TT_CMap14Rec ), + + (FT_CMap_InitFunc) tt_cmap14_init, /* init */ + (FT_CMap_DoneFunc) tt_cmap14_done, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap14_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap14_char_next, /* char_next */ + + /* Format 14 extension functions */ + (FT_CMap_CharVarIndexFunc) tt_cmap14_char_var_index, + (FT_CMap_CharVarIsDefaultFunc)tt_cmap14_char_var_isdefault, + (FT_CMap_VariantListFunc) tt_cmap14_variants, + (FT_CMap_CharVariantListFunc) tt_cmap14_char_variants, + (FT_CMap_VariantCharListFunc) tt_cmap14_variant_chars, + + 14, + (TT_CMap_ValidateFunc)tt_cmap14_validate, /* validate */ + (TT_CMap_Info_GetFunc)tt_cmap14_get_info /* get_cmap_info */ + ) + +#endif /* TT_CONFIG_CMAP_FORMAT_14 */ + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** SYNTHETIC UNICODE *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + /* This charmap is generated using postscript glyph names. */ + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + FT_CALLBACK_DEF( const char * ) + tt_get_glyph_name( TT_Face face, + FT_UInt idx ) + { + FT_String* PSname; + + + tt_face_get_ps_name( face, idx, &PSname ); + + return PSname; + } + + + FT_CALLBACK_DEF( FT_Error ) + tt_cmap_unicode_init( PS_Unicodes unicodes, + FT_Pointer pointer ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + FT_UNUSED( pointer ); + + + return psnames->unicodes_init( memory, + unicodes, + face->root.num_glyphs, + (PS_GetGlyphNameFunc)&tt_get_glyph_name, + (PS_FreeGlyphNameFunc)NULL, + (FT_Pointer)face ); + } + + + FT_CALLBACK_DEF( void ) + tt_cmap_unicode_done( PS_Unicodes unicodes ) + { + FT_Face face = FT_CMAP_FACE( unicodes ); + FT_Memory memory = FT_FACE_MEMORY( face ); + + + FT_FREE( unicodes->maps ); + unicodes->num_maps = 0; + } + + + FT_CALLBACK_DEF( FT_UInt ) + tt_cmap_unicode_char_index( PS_Unicodes unicodes, + FT_UInt32 char_code ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_char_index( unicodes, char_code ); + } + + + FT_CALLBACK_DEF( FT_UInt32 ) + tt_cmap_unicode_char_next( PS_Unicodes unicodes, + FT_UInt32 *pchar_code ) + { + TT_Face face = (TT_Face)FT_CMAP_FACE( unicodes ); + FT_Service_PsCMaps psnames = (FT_Service_PsCMaps)face->psnames; + + + return psnames->unicodes_char_next( unicodes, pchar_code ); + } + + + FT_DEFINE_TT_CMAP( + tt_cmap_unicode_class_rec, + + sizeof ( PS_UnicodesRec ), + + (FT_CMap_InitFunc) tt_cmap_unicode_init, /* init */ + (FT_CMap_DoneFunc) tt_cmap_unicode_done, /* done */ + (FT_CMap_CharIndexFunc)tt_cmap_unicode_char_index, /* char_index */ + (FT_CMap_CharNextFunc) tt_cmap_unicode_char_next, /* char_next */ + + (FT_CMap_CharVarIndexFunc) NULL, /* char_var_index */ + (FT_CMap_CharVarIsDefaultFunc)NULL, /* char_var_default */ + (FT_CMap_VariantListFunc) NULL, /* variant_list */ + (FT_CMap_CharVariantListFunc) NULL, /* charvariant_list */ + (FT_CMap_VariantCharListFunc) NULL, /* variantchar_list */ + + ~0U, + (TT_CMap_ValidateFunc)NULL, /* validate */ + (TT_CMap_Info_GetFunc)NULL /* get_cmap_info */ + ) + +#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + +#ifndef FT_CONFIG_OPTION_PIC + + static const TT_CMap_Class tt_cmap_classes[] = + { +#define TTCMAPCITEM( a ) &a, +#include "ttcmapc.h" + NULL, + }; + +#else /*FT_CONFIG_OPTION_PIC*/ + + void + FT_Destroy_Class_tt_cmap_classes( FT_Library library, + TT_CMap_Class* clazz ) + { + FT_Memory memory = library->memory; + + + if ( clazz ) + FT_FREE( clazz ); + } + + + FT_Error + FT_Create_Class_tt_cmap_classes( FT_Library library, + TT_CMap_Class** output_class ) + { + TT_CMap_Class* clazz = NULL; + TT_CMap_ClassRec* recs; + FT_Error error; + FT_Memory memory = library->memory; + + int i = 0; + + +#define TTCMAPCITEM( a ) i++; +#include "ttcmapc.h" + + /* allocate enough space for both the pointers */ + /* plus terminator and the class instances */ + if ( FT_ALLOC( clazz, sizeof ( *clazz ) * ( i + 1 ) + + sizeof ( TT_CMap_ClassRec ) * i ) ) + return error; + + /* the location of the class instances follows the array of pointers */ + recs = (TT_CMap_ClassRec*)( (char*)clazz + + sizeof ( *clazz ) * ( i + 1 ) ); + i = 0; + +#undef TTCMAPCITEM +#define TTCMAPCITEM( a ) \ + FT_Init_Class_ ## a( &recs[i] ); \ + clazz[i] = &recs[i]; \ + i++; +#include "ttcmapc.h" + + clazz[i] = NULL; + + *output_class = clazz; + return FT_Err_Ok; + } + +#endif /*FT_CONFIG_OPTION_PIC*/ + + + /* parse the `cmap' table and build the corresponding TT_CMap objects */ + /* in the current face */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_build_cmaps( TT_Face face ) + { + FT_Byte* table = face->cmap_table; + FT_Byte* limit = table + face->cmap_size; + FT_UInt volatile num_cmaps; + FT_Byte* volatile p = table; + FT_Library library = FT_FACE_LIBRARY( face ); + + FT_UNUSED( library ); + + + if ( !p || p + 4 > limit ) + return FT_THROW( Invalid_Table ); + + /* only recognize format 0 */ + if ( TT_NEXT_USHORT( p ) != 0 ) + { + FT_ERROR(( "tt_face_build_cmaps:" + " unsupported `cmap' table format = %d\n", + TT_PEEK_USHORT( p - 2 ) )); + return FT_THROW( Invalid_Table ); + } + + num_cmaps = TT_NEXT_USHORT( p ); + + for ( ; num_cmaps > 0 && p + 8 <= limit; num_cmaps-- ) + { + FT_CharMapRec charmap; + FT_UInt32 offset; + + + charmap.platform_id = TT_NEXT_USHORT( p ); + charmap.encoding_id = TT_NEXT_USHORT( p ); + charmap.face = FT_FACE( face ); + charmap.encoding = FT_ENCODING_NONE; /* will be filled later */ + offset = TT_NEXT_ULONG( p ); + + if ( offset && offset <= face->cmap_size - 2 ) + { + FT_Byte* volatile cmap = table + offset; + volatile FT_UInt format = TT_PEEK_USHORT( cmap ); + const TT_CMap_Class* volatile pclazz = TT_CMAP_CLASSES_GET; + TT_CMap_Class volatile clazz; + + + for ( ; *pclazz; pclazz++ ) + { + clazz = *pclazz; + if ( clazz->format == format ) + { + volatile TT_ValidatorRec valid; + volatile FT_Error error = FT_Err_Ok; + + + ft_validator_init( FT_VALIDATOR( &valid ), cmap, limit, + FT_VALIDATE_DEFAULT ); + + valid.num_glyphs = (FT_UInt)face->max_profile.numGlyphs; + + if ( ft_setjmp( FT_VALIDATOR( &valid )->jump_buffer) == 0 ) + { + /* validate this cmap sub-table */ + error = clazz->validate( cmap, FT_VALIDATOR( &valid ) ); + } + + if ( !valid.validator.error ) + { + FT_CMap ttcmap; + + + /* It might make sense to store the single variation */ + /* selector cmap somewhere special. But it would have to be */ + /* in the public FT_FaceRec, and we can't change that. */ + + if ( !FT_CMap_New( (FT_CMap_Class)clazz, + cmap, &charmap, &ttcmap ) ) + { + /* it is simpler to directly set `flags' than adding */ + /* a parameter to FT_CMap_New */ + ((TT_CMap)ttcmap)->flags = (FT_Int)error; + } + } + else + { + FT_TRACE0(( "tt_face_build_cmaps:" + " broken cmap sub-table ignored\n" )); + } + break; + } + } + + if ( !*pclazz ) + { + FT_TRACE0(( "tt_face_build_cmaps:" + " unsupported cmap sub-table ignored\n" )); + } + } + } + + return FT_Err_Ok; + } + + + FT_LOCAL( FT_Error ) + tt_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ) + { + FT_CMap cmap = (FT_CMap)charmap; + TT_CMap_Class clazz = (TT_CMap_Class)cmap->clazz; + + if ( clazz->get_cmap_info ) + return clazz->get_cmap_info( charmap, cmap_info ); + else + return FT_THROW( Invalid_CharMap_Format ); + } + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/ttcmap.h b/vendor/FreeType2/src/sfnt/ttcmap.h new file mode 100644 index 0000000..d264d99 --- /dev/null +++ b/vendor/FreeType2/src/sfnt/ttcmap.h @@ -0,0 +1,160 @@ +/***************************************************************************/ +/* */ +/* ttcmap.h */ +/* */ +/* TrueType character mapping table (cmap) support (specification). */ +/* */ +/* Copyright 2002-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTCMAP_H_ +#define TTCMAP_H_ + + +#include +#include FT_INTERNAL_TRUETYPE_TYPES_H +#include FT_INTERNAL_VALIDATE_H +#include FT_SERVICE_TT_CMAP_H + +FT_BEGIN_HEADER + + +#define TT_CMAP_FLAG_UNSORTED 1 +#define TT_CMAP_FLAG_OVERLAPPING 2 + + typedef struct TT_CMapRec_ + { + FT_CMapRec cmap; + FT_Byte* data; /* pointer to in-memory cmap table */ + FT_Int flags; /* for format 4 only */ + + } TT_CMapRec, *TT_CMap; + + typedef const struct TT_CMap_ClassRec_* TT_CMap_Class; + + + typedef FT_Error + (*TT_CMap_ValidateFunc)( FT_Byte* data, + FT_Validator valid ); + + typedef struct TT_CMap_ClassRec_ + { + FT_CMap_ClassRec clazz; + FT_UInt format; + TT_CMap_ValidateFunc validate; + TT_CMap_Info_GetFunc get_cmap_info; + + } TT_CMap_ClassRec; + + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_DEFINE_TT_CMAP( class_, \ + size_, \ + init_, \ + done_, \ + char_index_, \ + char_next_, \ + char_var_index_, \ + char_var_default_, \ + variant_list_, \ + charvariant_list_, \ + variantchar_list_, \ + format_, \ + validate_, \ + get_cmap_info_ ) \ + FT_CALLBACK_TABLE_DEF \ + const TT_CMap_ClassRec class_ = \ + { \ + { size_, \ + init_, \ + done_, \ + char_index_, \ + char_next_, \ + char_var_index_, \ + char_var_default_, \ + variant_list_, \ + charvariant_list_, \ + variantchar_list_ \ + }, \ + \ + format_, \ + validate_, \ + get_cmap_info_ \ + }; + +#else /* FT_CONFIG_OPTION_PIC */ + +#define FT_DEFINE_TT_CMAP( class_, \ + size_, \ + init_, \ + done_, \ + char_index_, \ + char_next_, \ + char_var_index_, \ + char_var_default_, \ + variant_list_, \ + charvariant_list_, \ + variantchar_list_, \ + format_, \ + validate_, \ + get_cmap_info_ ) \ + void \ + FT_Init_Class_ ## class_( TT_CMap_ClassRec* clazz ) \ + { \ + clazz->clazz.size = size_; \ + clazz->clazz.init = init_; \ + clazz->clazz.done = done_; \ + clazz->clazz.char_index = char_index_; \ + clazz->clazz.char_next = char_next_; \ + clazz->clazz.char_var_index = char_var_index_; \ + clazz->clazz.char_var_default = char_var_default_; \ + clazz->clazz.variant_list = variant_list_; \ + clazz->clazz.charvariant_list = charvariant_list_; \ + clazz->clazz.variantchar_list = variantchar_list_; \ + clazz->format = format_; \ + clazz->validate = validate_; \ + clazz->get_cmap_info = get_cmap_info_; \ + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + + typedef struct TT_ValidatorRec_ + { + FT_ValidatorRec validator; + FT_UInt num_glyphs; + + } TT_ValidatorRec, *TT_Validator; + + +#define TT_VALIDATOR( x ) ( (TT_Validator)( x ) ) +#define TT_VALID_GLYPH_COUNT( x ) TT_VALIDATOR( x )->num_glyphs + + + FT_CALLBACK_TABLE const TT_CMap_ClassRec tt_cmap_unicode_class_rec; + + FT_LOCAL( FT_Error ) + tt_face_build_cmaps( TT_Face face ); + + /* used in tt-cmaps service */ + FT_LOCAL( FT_Error ) + tt_get_cmap_info( FT_CharMap charmap, + TT_CMapInfo *cmap_info ); + + +FT_END_HEADER + +#endif /* TTCMAP_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/ttcmapc.h b/vendor/FreeType2/src/sfnt/ttcmapc.h new file mode 100644 index 0000000..4980e9d --- /dev/null +++ b/vendor/FreeType2/src/sfnt/ttcmapc.h @@ -0,0 +1,56 @@ +/***************************************************************************/ +/* */ +/* ttcmapc.h */ +/* */ +/* TT CMAP classes definitions (specification only). */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#ifdef TT_CONFIG_CMAP_FORMAT_0 + TTCMAPCITEM( tt_cmap0_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_2 + TTCMAPCITEM( tt_cmap2_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_4 + TTCMAPCITEM( tt_cmap4_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_6 + TTCMAPCITEM( tt_cmap6_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_8 + TTCMAPCITEM( tt_cmap8_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_10 + TTCMAPCITEM( tt_cmap10_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_12 + TTCMAPCITEM( tt_cmap12_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_13 + TTCMAPCITEM( tt_cmap13_class_rec ) +#endif + +#ifdef TT_CONFIG_CMAP_FORMAT_14 + TTCMAPCITEM( tt_cmap14_class_rec ) +#endif + + + /* END */ diff --git a/vendor/FreeType2/src/sfnt/ttkern.c b/vendor/FreeType2/src/sfnt/ttkern.c new file mode 100644 index 0000000..68f15a2 --- /dev/null +++ b/vendor/FreeType2/src/sfnt/ttkern.c @@ -0,0 +1,311 @@ +/***************************************************************************/ +/* */ +/* ttkern.c */ +/* */ +/* Load the basic TrueType kerning table. This doesn't handle */ +/* kerning data within the GPOS table at the moment. */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttkern.h" + +#include "sferrors.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_ttkern + + +#undef TT_KERN_INDEX +#define TT_KERN_INDEX( g1, g2 ) ( ( (FT_ULong)(g1) << 16 ) | (g2) ) + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_kern( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_ULong table_size; + FT_Byte* p; + FT_Byte* p_limit; + FT_UInt nn, num_tables; + FT_UInt32 avail = 0, ordered = 0; + + + /* the kern table is optional; exit silently if it is missing */ + error = face->goto_table( face, TTAG_kern, stream, &table_size ); + if ( error ) + goto Exit; + + if ( table_size < 4 ) /* the case of a malformed table */ + { + FT_ERROR(( "tt_face_load_kern:" + " kerning table is too small - ignored\n" )); + error = FT_THROW( Table_Missing ); + goto Exit; + } + + if ( FT_FRAME_EXTRACT( table_size, face->kern_table ) ) + { + FT_ERROR(( "tt_face_load_kern:" + " could not extract kerning table\n" )); + goto Exit; + } + + face->kern_table_size = table_size; + + p = face->kern_table; + p_limit = p + table_size; + + p += 2; /* skip version */ + num_tables = FT_NEXT_USHORT( p ); + + if ( num_tables > 32 ) /* we only support up to 32 sub-tables */ + num_tables = 32; + + for ( nn = 0; nn < num_tables; nn++ ) + { + FT_UInt num_pairs, length, coverage, format; + FT_Byte* p_next; + FT_UInt32 mask = (FT_UInt32)1UL << nn; + + + if ( p + 6 > p_limit ) + break; + + p_next = p; + + p += 2; /* skip version */ + length = FT_NEXT_USHORT( p ); + coverage = FT_NEXT_USHORT( p ); + + if ( length <= 6 + 8 ) + break; + + p_next += length; + + if ( p_next > p_limit ) /* handle broken table */ + p_next = p_limit; + + format = coverage >> 8; + + /* we currently only support format 0 kerning tables */ + if ( format != 0 ) + goto NextTable; + + /* only use horizontal kerning tables */ + if ( ( coverage & 3U ) != 0x0001 || + p + 8 > p_next ) + goto NextTable; + + num_pairs = FT_NEXT_USHORT( p ); + p += 6; + + if ( ( p_next - p ) < 6 * (int)num_pairs ) /* handle broken count */ + num_pairs = (FT_UInt)( ( p_next - p ) / 6 ); + + avail |= mask; + + /* + * Now check whether the pairs in this table are ordered. + * We then can use binary search. + */ + if ( num_pairs > 0 ) + { + FT_ULong count; + FT_ULong old_pair; + + + old_pair = FT_NEXT_ULONG( p ); + p += 2; + + for ( count = num_pairs - 1; count > 0; count-- ) + { + FT_UInt32 cur_pair; + + + cur_pair = FT_NEXT_ULONG( p ); + if ( cur_pair <= old_pair ) + break; + + p += 2; + old_pair = cur_pair; + } + + if ( count == 0 ) + ordered |= mask; + } + + NextTable: + p = p_next; + } + + face->num_kern_tables = nn; + face->kern_avail_bits = avail; + face->kern_order_bits = ordered; + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + tt_face_done_kern( TT_Face face ) + { + FT_Stream stream = face->root.stream; + + + FT_FRAME_RELEASE( face->kern_table ); + face->kern_table_size = 0; + face->num_kern_tables = 0; + face->kern_avail_bits = 0; + face->kern_order_bits = 0; + } + + + FT_LOCAL_DEF( FT_Int ) + tt_face_get_kerning( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ) + { + FT_Int result = 0; + FT_UInt count, mask; + FT_Byte* p = face->kern_table; + FT_Byte* p_limit = p + face->kern_table_size; + + + p += 4; + mask = 0x0001; + + for ( count = face->num_kern_tables; + count > 0 && p + 6 <= p_limit; + count--, mask <<= 1 ) + { + FT_Byte* base = p; + FT_Byte* next; + FT_UInt version = FT_NEXT_USHORT( p ); + FT_UInt length = FT_NEXT_USHORT( p ); + FT_UInt coverage = FT_NEXT_USHORT( p ); + FT_UInt num_pairs; + FT_Int value = 0; + + FT_UNUSED( version ); + + + next = base + length; + + if ( next > p_limit ) /* handle broken table */ + next = p_limit; + + if ( ( face->kern_avail_bits & mask ) == 0 ) + goto NextTable; + + FT_ASSERT( p + 8 <= next ); /* tested in tt_face_load_kern */ + + num_pairs = FT_NEXT_USHORT( p ); + p += 6; + + if ( ( next - p ) < 6 * (int)num_pairs ) /* handle broken count */ + num_pairs = (FT_UInt)( ( next - p ) / 6 ); + + switch ( coverage >> 8 ) + { + case 0: + { + FT_ULong key0 = TT_KERN_INDEX( left_glyph, right_glyph ); + + + if ( face->kern_order_bits & mask ) /* binary search */ + { + FT_UInt min = 0; + FT_UInt max = num_pairs; + + + while ( min < max ) + { + FT_UInt mid = ( min + max ) >> 1; + FT_Byte* q = p + 6 * mid; + FT_ULong key; + + + key = FT_NEXT_ULONG( q ); + + if ( key == key0 ) + { + value = FT_PEEK_SHORT( q ); + goto Found; + } + if ( key < key0 ) + min = mid + 1; + else + max = mid; + } + } + else /* linear search */ + { + FT_UInt count2; + + + for ( count2 = num_pairs; count2 > 0; count2-- ) + { + FT_ULong key = FT_NEXT_ULONG( p ); + + + if ( key == key0 ) + { + value = FT_PEEK_SHORT( p ); + goto Found; + } + p += 2; + } + } + } + break; + + /* + * We don't support format 2 because we haven't seen a single font + * using it in real life... + */ + + default: + ; + } + + goto NextTable; + + Found: + if ( coverage & 8 ) /* override or add */ + result = value; + else + result += value; + + NextTable: + p = next; + } + + return result; + } + +#undef TT_KERN_INDEX + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/ttkern.h b/vendor/FreeType2/src/sfnt/ttkern.h new file mode 100644 index 0000000..4e45d09 --- /dev/null +++ b/vendor/FreeType2/src/sfnt/ttkern.h @@ -0,0 +1,52 @@ +/***************************************************************************/ +/* */ +/* ttkern.h */ +/* */ +/* Load the basic TrueType kerning table. This doesn't handle */ +/* kerning data within the GPOS table at the moment. */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTKERN_H_ +#define TTKERN_H_ + + +#include +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_kern( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_done_kern( TT_Face face ); + + FT_LOCAL( FT_Int ) + tt_face_get_kerning( TT_Face face, + FT_UInt left_glyph, + FT_UInt right_glyph ); + +#define TT_FACE_HAS_KERNING( face ) ( (face)->kern_avail_bits != 0 ) + + +FT_END_HEADER + +#endif /* TTKERN_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/ttload.c b/vendor/FreeType2/src/sfnt/ttload.c new file mode 100644 index 0000000..a86a546 --- /dev/null +++ b/vendor/FreeType2/src/sfnt/ttload.c @@ -0,0 +1,1427 @@ +/***************************************************************************/ +/* */ +/* ttload.c */ +/* */ +/* Load the basic TrueType tables, i.e., tables that can be either in */ +/* TTF or OTF fonts (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include "ttload.h" + +#include "sferrors.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_ttload + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_lookup_table */ + /* */ + /* */ + /* Looks for a TrueType table by name. */ + /* */ + /* */ + /* face :: A face object handle. */ + /* */ + /* tag :: The searched tag. */ + /* */ + /* */ + /* A pointer to the table directory entry. 0 if not found. */ + /* */ + FT_LOCAL_DEF( TT_Table ) + tt_face_lookup_table( TT_Face face, + FT_ULong tag ) + { + TT_Table entry; + TT_Table limit; +#ifdef FT_DEBUG_LEVEL_TRACE + FT_Bool zero_length = FALSE; +#endif + + + FT_TRACE4(( "tt_face_lookup_table: %08p, `%c%c%c%c' -- ", + face, + (FT_Char)( tag >> 24 ), + (FT_Char)( tag >> 16 ), + (FT_Char)( tag >> 8 ), + (FT_Char)( tag ) )); + + entry = face->dir_tables; + limit = entry + face->num_tables; + + for ( ; entry < limit; entry++ ) + { + /* For compatibility with Windows, we consider */ + /* zero-length tables the same as missing tables. */ + if ( entry->Tag == tag ) + { + if ( entry->Length != 0 ) + { + FT_TRACE4(( "found table.\n" )); + return entry; + } +#ifdef FT_DEBUG_LEVEL_TRACE + zero_length = TRUE; +#endif + } + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( zero_length ) + FT_TRACE4(( "ignoring empty table\n" )); + else + FT_TRACE4(( "could not find table\n" )); +#endif + + return NULL; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_goto_table */ + /* */ + /* */ + /* Looks for a TrueType table by name, then seek a stream to it. */ + /* */ + /* */ + /* face :: A face object handle. */ + /* */ + /* tag :: The searched tag. */ + /* */ + /* stream :: The stream to seek when the table is found. */ + /* */ + /* */ + /* length :: The length of the table if found, undefined otherwise. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_goto_table( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ) + { + TT_Table table; + FT_Error error; + + + table = tt_face_lookup_table( face, tag ); + if ( table ) + { + if ( length ) + *length = table->Length; + + if ( FT_STREAM_SEEK( table->Offset ) ) + goto Exit; + } + else + error = FT_THROW( Table_Missing ); + + Exit: + return error; + } + + + /* Here, we */ + /* */ + /* - check that `num_tables' is valid (and adjust it if necessary); */ + /* also return the number of valid table entries */ + /* */ + /* - look for a `head' table, check its size, and parse it to check */ + /* whether its `magic' field is correctly set */ + /* */ + /* - errors (except errors returned by stream handling) */ + /* */ + /* SFNT_Err_Unknown_File_Format: */ + /* no table is defined in directory, it is not sfnt-wrapped */ + /* data */ + /* SFNT_Err_Table_Missing: */ + /* table directory is valid, but essential tables */ + /* (head/bhed/SING) are missing */ + /* */ + static FT_Error + check_table_dir( SFNT_Header sfnt, + FT_Stream stream, + FT_UShort* valid ) + { + FT_Error error; + FT_UShort nn, valid_entries = 0; + FT_UInt has_head = 0, has_sing = 0, has_meta = 0; + FT_ULong offset = sfnt->offset + 12; + + static const FT_Frame_Field table_dir_entry_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_TableRec + + FT_FRAME_START( 16 ), + FT_FRAME_ULONG( Tag ), + FT_FRAME_ULONG( CheckSum ), + FT_FRAME_ULONG( Offset ), + FT_FRAME_ULONG( Length ), + FT_FRAME_END + }; + + + if ( FT_STREAM_SEEK( offset ) ) + goto Exit; + + for ( nn = 0; nn < sfnt->num_tables; nn++ ) + { + TT_TableRec table; + + + if ( FT_STREAM_READ_FIELDS( table_dir_entry_fields, &table ) ) + { + nn--; + FT_TRACE2(( "check_table_dir:" + " can read only %d table%s in font (instead of %d)\n", + nn, nn == 1 ? "" : "s", sfnt->num_tables )); + sfnt->num_tables = nn; + break; + } + + /* we ignore invalid tables */ + + if ( table.Offset > stream->size ) + { + FT_TRACE2(( "check_table_dir: table entry %d invalid\n", nn )); + continue; + } + else if ( table.Length > stream->size - table.Offset ) + { + /* Some tables have such a simple structure that clipping its */ + /* contents is harmless. This also makes FreeType less sensitive */ + /* to invalid table lengths (which programs like Acroread seem to */ + /* ignore in general). */ + + if ( table.Tag == TTAG_hmtx || + table.Tag == TTAG_vmtx ) + valid_entries++; + else + { + FT_TRACE2(( "check_table_dir: table entry %d invalid\n", nn )); + continue; + } + } + else + valid_entries++; + + if ( table.Tag == TTAG_head || table.Tag == TTAG_bhed ) + { + FT_UInt32 magic; + + +#ifndef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + if ( table.Tag == TTAG_head ) +#endif + has_head = 1; + + /* + * The table length should be 0x36, but certain font tools make it + * 0x38, so we will just check that it is greater. + * + * Note that according to the specification, the table must be + * padded to 32-bit lengths, but this doesn't apply to the value of + * its `Length' field! + * + */ + if ( table.Length < 0x36 ) + { + FT_TRACE2(( "check_table_dir:" + " `head' or `bhed' table too small\n" )); + error = FT_THROW( Table_Missing ); + goto Exit; + } + + if ( FT_STREAM_SEEK( table.Offset + 12 ) || + FT_READ_ULONG( magic ) ) + goto Exit; + + if ( magic != 0x5F0F3CF5UL ) + FT_TRACE2(( "check_table_dir:" + " invalid magic number in `head' or `bhed' table\n")); + + if ( FT_STREAM_SEEK( offset + ( nn + 1 ) * 16 ) ) + goto Exit; + } + else if ( table.Tag == TTAG_SING ) + has_sing = 1; + else if ( table.Tag == TTAG_META ) + has_meta = 1; + } + + *valid = valid_entries; + + if ( !valid_entries ) + { + FT_TRACE2(( "check_table_dir: no valid tables found\n" )); + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + /* if `sing' and `meta' tables are present, there is no `head' table */ + if ( has_head || ( has_sing && has_meta ) ) + { + error = FT_Err_Ok; + goto Exit; + } + else + { + FT_TRACE2(( "check_table_dir:" )); +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + FT_TRACE2(( " neither `head', `bhed', nor `sing' table found\n" )); +#else + FT_TRACE2(( " neither `head' nor `sing' table found\n" )); +#endif + error = FT_THROW( Table_Missing ); + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_font_dir */ + /* */ + /* */ + /* Loads the header of a SFNT font file. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* */ + /* sfnt :: The SFNT header. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* The stream cursor must be at the beginning of the font directory. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_font_dir( TT_Face face, + FT_Stream stream ) + { + SFNT_HeaderRec sfnt; + FT_Error error; + FT_Memory memory = stream->memory; + FT_UShort nn, valid_entries = 0; + + static const FT_Frame_Field offset_table_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE SFNT_HeaderRec + + FT_FRAME_START( 8 ), + FT_FRAME_USHORT( num_tables ), + FT_FRAME_USHORT( search_range ), + FT_FRAME_USHORT( entry_selector ), + FT_FRAME_USHORT( range_shift ), + FT_FRAME_END + }; + + + FT_TRACE2(( "tt_face_load_font_dir: %08p\n", face )); + + /* read the offset table */ + + sfnt.offset = FT_STREAM_POS(); + + if ( FT_READ_ULONG( sfnt.format_tag ) || + FT_STREAM_READ_FIELDS( offset_table_fields, &sfnt ) ) + goto Exit; + + /* many fonts don't have these fields set correctly */ +#if 0 + if ( sfnt.search_range != 1 << ( sfnt.entry_selector + 4 ) || + sfnt.search_range + sfnt.range_shift != sfnt.num_tables << 4 ) + return FT_THROW( Unknown_File_Format ); +#endif + + /* load the table directory */ + + FT_TRACE2(( "-- Number of tables: %10u\n", sfnt.num_tables )); + FT_TRACE2(( "-- Format version: 0x%08lx\n", sfnt.format_tag )); + + if ( sfnt.format_tag != TTAG_OTTO ) + { + /* check first */ + error = check_table_dir( &sfnt, stream, &valid_entries ); + if ( error ) + { + FT_TRACE2(( "tt_face_load_font_dir:" + " invalid table directory for TrueType\n" )); + goto Exit; + } + } + else + valid_entries = sfnt.num_tables; + + face->num_tables = valid_entries; + face->format_tag = sfnt.format_tag; + + if ( FT_QNEW_ARRAY( face->dir_tables, face->num_tables ) ) + goto Exit; + + if ( FT_STREAM_SEEK( sfnt.offset + 12 ) || + FT_FRAME_ENTER( sfnt.num_tables * 16L ) ) + goto Exit; + + FT_TRACE2(( "\n" + " tag offset length checksum\n" + " ----------------------------------\n" )); + + valid_entries = 0; + for ( nn = 0; nn < sfnt.num_tables; nn++ ) + { + TT_TableRec entry; + FT_UShort i; + FT_Bool duplicate; + + + entry.Tag = FT_GET_TAG4(); + entry.CheckSum = FT_GET_ULONG(); + entry.Offset = FT_GET_ULONG(); + entry.Length = FT_GET_ULONG(); + + /* ignore invalid tables that can't be sanitized */ + + if ( entry.Offset > stream->size ) + continue; + else if ( entry.Length > stream->size - entry.Offset ) + { + if ( entry.Tag == TTAG_hmtx || + entry.Tag == TTAG_vmtx ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + FT_ULong old_length = entry.Length; +#endif + + + /* make metrics table length a multiple of 4 */ + entry.Length = ( stream->size - entry.Offset ) & ~3U; + + FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx" + " (sanitized; original length %08lx)", + (FT_Char)( entry.Tag >> 24 ), + (FT_Char)( entry.Tag >> 16 ), + (FT_Char)( entry.Tag >> 8 ), + (FT_Char)( entry.Tag ), + entry.Offset, + entry.Length, + entry.CheckSum, + old_length )); + } + else + continue; + } +#ifdef FT_DEBUG_LEVEL_TRACE + else + FT_TRACE2(( " %c%c%c%c %08lx %08lx %08lx", + (FT_Char)( entry.Tag >> 24 ), + (FT_Char)( entry.Tag >> 16 ), + (FT_Char)( entry.Tag >> 8 ), + (FT_Char)( entry.Tag ), + entry.Offset, + entry.Length, + entry.CheckSum )); +#endif + + /* ignore duplicate tables – the first one wins */ + duplicate = 0; + for ( i = 0; i < valid_entries; i++ ) + { + if ( face->dir_tables[i].Tag == entry.Tag ) + { + duplicate = 1; + break; + } + } + if ( duplicate ) + { + FT_TRACE2(( " (duplicate, ignored)\n" )); + continue; + } + else + { + FT_TRACE2(( "\n" )); + + /* we finally have a valid entry */ + face->dir_tables[valid_entries++] = entry; + } + } + + /* final adjustment to number of tables */ + face->num_tables = valid_entries; + + FT_FRAME_EXIT(); + + FT_TRACE2(( "table directory loaded\n\n" )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_any */ + /* */ + /* */ + /* Loads any font table into client memory. */ + /* */ + /* */ + /* face :: The face object to look for. */ + /* */ + /* tag :: The tag of table to load. Use the value 0 if you want */ + /* to access the whole font file, else set this parameter */ + /* to a valid TrueType table tag that you can forge with */ + /* the MAKE_TT_TAG macro. */ + /* */ + /* offset :: The starting offset in the table (or the file if */ + /* tag == 0). */ + /* */ + /* length :: The address of the decision variable: */ + /* */ + /* If length == NULL: */ + /* Loads the whole table. Returns an error if */ + /* `offset' == 0! */ + /* */ + /* If *length == 0: */ + /* Exits immediately; returning the length of the given */ + /* table or of the font file, depending on the value of */ + /* `tag'. */ + /* */ + /* If *length != 0: */ + /* Loads the next `length' bytes of table or font, */ + /* starting at offset `offset' (in table or font too). */ + /* */ + /* */ + /* buffer :: The address of target buffer. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_any( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ) + { + FT_Error error; + FT_Stream stream; + TT_Table table; + FT_ULong size; + + + if ( tag != 0 ) + { + /* look for tag in font directory */ + table = tt_face_lookup_table( face, tag ); + if ( !table ) + { + error = FT_THROW( Table_Missing ); + goto Exit; + } + + offset += table->Offset; + size = table->Length; + } + else + /* tag == 0 -- the user wants to access the font file directly */ + size = face->root.stream->size; + + if ( length && *length == 0 ) + { + *length = size; + + return FT_Err_Ok; + } + + if ( length ) + size = *length; + + stream = face->root.stream; + /* the `if' is syntactic sugar for picky compilers */ + if ( FT_STREAM_READ_AT( offset, buffer, size ) ) + goto Exit; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_generic_header */ + /* */ + /* */ + /* Loads the TrueType table `head' or `bhed'. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + tt_face_load_generic_header( TT_Face face, + FT_Stream stream, + FT_ULong tag ) + { + FT_Error error; + TT_Header* header; + + static const FT_Frame_Field header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_Header + + FT_FRAME_START( 54 ), + FT_FRAME_ULONG ( Table_Version ), + FT_FRAME_ULONG ( Font_Revision ), + FT_FRAME_LONG ( CheckSum_Adjust ), + FT_FRAME_LONG ( Magic_Number ), + FT_FRAME_USHORT( Flags ), + FT_FRAME_USHORT( Units_Per_EM ), + FT_FRAME_LONG ( Created[0] ), + FT_FRAME_LONG ( Created[1] ), + FT_FRAME_LONG ( Modified[0] ), + FT_FRAME_LONG ( Modified[1] ), + FT_FRAME_SHORT ( xMin ), + FT_FRAME_SHORT ( yMin ), + FT_FRAME_SHORT ( xMax ), + FT_FRAME_SHORT ( yMax ), + FT_FRAME_USHORT( Mac_Style ), + FT_FRAME_USHORT( Lowest_Rec_PPEM ), + FT_FRAME_SHORT ( Font_Direction ), + FT_FRAME_SHORT ( Index_To_Loc_Format ), + FT_FRAME_SHORT ( Glyph_Data_Format ), + FT_FRAME_END + }; + + + error = face->goto_table( face, tag, stream, 0 ); + if ( error ) + goto Exit; + + header = &face->header; + + if ( FT_STREAM_READ_FIELDS( header_fields, header ) ) + goto Exit; + + FT_TRACE3(( "Units per EM: %4u\n", header->Units_Per_EM )); + FT_TRACE3(( "IndexToLoc: %4d\n", header->Index_To_Loc_Format )); + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_head( TT_Face face, + FT_Stream stream ) + { + return tt_face_load_generic_header( face, stream, TTAG_head ); + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_bhed( TT_Face face, + FT_Stream stream ) + { + return tt_face_load_generic_header( face, stream, TTAG_bhed ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_maxp */ + /* */ + /* */ + /* Loads the maximum profile into a face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_maxp( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_MaxProfile* maxProfile = &face->max_profile; + + static const FT_Frame_Field maxp_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_MaxProfile + + FT_FRAME_START( 6 ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT( numGlyphs ), + FT_FRAME_END + }; + + static const FT_Frame_Field maxp_fields_extra[] = + { + FT_FRAME_START( 26 ), + FT_FRAME_USHORT( maxPoints ), + FT_FRAME_USHORT( maxContours ), + FT_FRAME_USHORT( maxCompositePoints ), + FT_FRAME_USHORT( maxCompositeContours ), + FT_FRAME_USHORT( maxZones ), + FT_FRAME_USHORT( maxTwilightPoints ), + FT_FRAME_USHORT( maxStorage ), + FT_FRAME_USHORT( maxFunctionDefs ), + FT_FRAME_USHORT( maxInstructionDefs ), + FT_FRAME_USHORT( maxStackElements ), + FT_FRAME_USHORT( maxSizeOfInstructions ), + FT_FRAME_USHORT( maxComponentElements ), + FT_FRAME_USHORT( maxComponentDepth ), + FT_FRAME_END + }; + + + error = face->goto_table( face, TTAG_maxp, stream, 0 ); + if ( error ) + goto Exit; + + if ( FT_STREAM_READ_FIELDS( maxp_fields, maxProfile ) ) + goto Exit; + + maxProfile->maxPoints = 0; + maxProfile->maxContours = 0; + maxProfile->maxCompositePoints = 0; + maxProfile->maxCompositeContours = 0; + maxProfile->maxZones = 0; + maxProfile->maxTwilightPoints = 0; + maxProfile->maxStorage = 0; + maxProfile->maxFunctionDefs = 0; + maxProfile->maxInstructionDefs = 0; + maxProfile->maxStackElements = 0; + maxProfile->maxSizeOfInstructions = 0; + maxProfile->maxComponentElements = 0; + maxProfile->maxComponentDepth = 0; + + if ( maxProfile->version >= 0x10000L ) + { + if ( FT_STREAM_READ_FIELDS( maxp_fields_extra, maxProfile ) ) + goto Exit; + + /* XXX: an adjustment that is necessary to load certain */ + /* broken fonts like `Keystrokes MT' :-( */ + /* */ + /* We allocate 64 function entries by default when */ + /* the maxFunctionDefs value is smaller. */ + + if ( maxProfile->maxFunctionDefs < 64 ) + maxProfile->maxFunctionDefs = 64; + + /* we add 4 phantom points later */ + if ( maxProfile->maxTwilightPoints > ( 0xFFFFU - 4 ) ) + { + FT_TRACE0(( "tt_face_load_maxp:" + " too much twilight points in `maxp' table;\n" + " " + " some glyphs might be rendered incorrectly\n" )); + + maxProfile->maxTwilightPoints = 0xFFFFU - 4; + } + } + + FT_TRACE3(( "numGlyphs: %u\n", maxProfile->numGlyphs )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_name */ + /* */ + /* */ + /* Loads the name records. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_name( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong table_pos, table_len; + FT_ULong storage_start, storage_limit; + TT_NameTable table; + + static const FT_Frame_Field name_table_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_NameTableRec + + FT_FRAME_START( 6 ), + FT_FRAME_USHORT( format ), + FT_FRAME_USHORT( numNameRecords ), + FT_FRAME_USHORT( storageOffset ), + FT_FRAME_END + }; + + static const FT_Frame_Field name_record_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_NameRec + + /* no FT_FRAME_START */ + FT_FRAME_USHORT( platformID ), + FT_FRAME_USHORT( encodingID ), + FT_FRAME_USHORT( languageID ), + FT_FRAME_USHORT( nameID ), + FT_FRAME_USHORT( stringLength ), + FT_FRAME_USHORT( stringOffset ), + FT_FRAME_END + }; + + static const FT_Frame_Field langTag_record_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_LangTagRec + + /* no FT_FRAME_START */ + FT_FRAME_USHORT( stringLength ), + FT_FRAME_USHORT( stringOffset ), + FT_FRAME_END + }; + + + table = &face->name_table; + table->stream = stream; + + error = face->goto_table( face, TTAG_name, stream, &table_len ); + if ( error ) + goto Exit; + + table_pos = FT_STREAM_POS(); + + if ( FT_STREAM_READ_FIELDS( name_table_fields, table ) ) + goto Exit; + + /* Some popular Asian fonts have an invalid `storageOffset' value (it */ + /* should be at least `6 + 12*numNameRecords'). However, the string */ + /* offsets, computed as `storageOffset + entry->stringOffset', are */ + /* valid pointers within the name table... */ + /* */ + /* We thus can't check `storageOffset' right now. */ + /* */ + storage_start = table_pos + 6 + 12 * table->numNameRecords; + storage_limit = table_pos + table_len; + + if ( storage_start > storage_limit ) + { + FT_ERROR(( "tt_face_load_name: invalid `name' table\n" )); + error = FT_THROW( Name_Table_Missing ); + goto Exit; + } + + /* `name' format 1 contains additional language tag records, */ + /* which we load first */ + if ( table->format == 1 ) + { + if ( FT_STREAM_SEEK( storage_start ) || + FT_READ_USHORT( table->numLangTagRecords ) ) + goto Exit; + + storage_start += 2 + 4 * table->numLangTagRecords; + + /* allocate language tag records array */ + if ( FT_NEW_ARRAY( table->langTags, table->numLangTagRecords ) || + FT_FRAME_ENTER( table->numLangTagRecords * 4 ) ) + goto Exit; + + /* load language tags */ + { + TT_LangTag entry = table->langTags; + TT_LangTag limit = entry + table->numLangTagRecords; + + + for ( ; entry < limit; entry++ ) + { + (void)FT_STREAM_READ_FIELDS( langTag_record_fields, entry ); + + /* check that the langTag string is within the table */ + entry->stringOffset += table_pos + table->storageOffset; + if ( entry->stringOffset < storage_start || + entry->stringOffset + entry->stringLength > storage_limit ) + { + /* invalid entry; ignore it */ + entry->stringLength = 0; + } + } + } + + FT_FRAME_EXIT(); + + (void)FT_STREAM_SEEK( table_pos + 6 ); + } + + /* allocate name records array */ + if ( FT_NEW_ARRAY( table->names, table->numNameRecords ) || + FT_FRAME_ENTER( table->numNameRecords * 12 ) ) + goto Exit; + + /* load name records */ + { + TT_Name entry = table->names; + FT_UInt count = table->numNameRecords; + + + for ( ; count > 0; count-- ) + { + if ( FT_STREAM_READ_FIELDS( name_record_fields, entry ) ) + continue; + + /* check that the name is not empty */ + if ( entry->stringLength == 0 ) + continue; + + /* check that the name string is within the table */ + entry->stringOffset += table_pos + table->storageOffset; + if ( entry->stringOffset < storage_start || + entry->stringOffset + entry->stringLength > storage_limit ) + { + /* invalid entry; ignore it */ + continue; + } + + /* assure that we have a valid language tag ID, and */ + /* that the corresponding langTag entry is valid, too */ + if ( table->format == 1 && entry->languageID >= 0x8000U ) + { + if ( entry->languageID - 0x8000U >= table->numLangTagRecords || + !table->langTags[entry->languageID - 0x8000U].stringLength ) + { + /* invalid entry; ignore it */ + continue; + } + } + + entry++; + } + + /* reduce array size to the actually used elements */ + count = (FT_UInt)( entry - table->names ); + (void)FT_RENEW_ARRAY( table->names, + table->numNameRecords, + count ); + table->numNameRecords = count; + } + + FT_FRAME_EXIT(); + + /* everything went well, update face->num_names */ + face->num_names = (FT_UShort)table->numNameRecords; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_free_name */ + /* */ + /* */ + /* Frees the name records. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + FT_LOCAL_DEF( void ) + tt_face_free_name( TT_Face face ) + { + FT_Memory memory = face->root.driver->root.memory; + TT_NameTable table = &face->name_table; + + + if ( table->names ) + { + TT_Name entry = table->names; + TT_Name limit = entry + table->numNameRecords; + + + for ( ; entry < limit; entry++ ) + FT_FREE( entry->string ); + + FT_FREE( table->names ); + } + + if ( table->langTags ) + { + TT_LangTag entry = table->langTags; + TT_LangTag limit = entry + table->numLangTagRecords; + + + for ( ; entry < limit; entry++ ) + FT_FREE( entry->string ); + + FT_FREE( table->langTags ); + } + + table->numNameRecords = 0; + table->numLangTagRecords = 0; + table->format = 0; + table->storageOffset = 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_cmap */ + /* */ + /* */ + /* Loads the cmap directory in a face object. The cmaps themselves */ + /* are loaded on demand in the `ttcmap.c' module. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_cmap( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + + + error = face->goto_table( face, TTAG_cmap, stream, &face->cmap_size ); + if ( error ) + goto Exit; + + if ( FT_FRAME_EXTRACT( face->cmap_size, face->cmap_table ) ) + face->cmap_size = 0; + + Exit: + return error; + } + + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_os2 */ + /* */ + /* */ + /* Loads the OS2 table. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_os2( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_OS2* os2; + + static const FT_Frame_Field os2_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_OS2 + + FT_FRAME_START( 78 ), + FT_FRAME_USHORT( version ), + FT_FRAME_SHORT ( xAvgCharWidth ), + FT_FRAME_USHORT( usWeightClass ), + FT_FRAME_USHORT( usWidthClass ), + FT_FRAME_SHORT ( fsType ), + FT_FRAME_SHORT ( ySubscriptXSize ), + FT_FRAME_SHORT ( ySubscriptYSize ), + FT_FRAME_SHORT ( ySubscriptXOffset ), + FT_FRAME_SHORT ( ySubscriptYOffset ), + FT_FRAME_SHORT ( ySuperscriptXSize ), + FT_FRAME_SHORT ( ySuperscriptYSize ), + FT_FRAME_SHORT ( ySuperscriptXOffset ), + FT_FRAME_SHORT ( ySuperscriptYOffset ), + FT_FRAME_SHORT ( yStrikeoutSize ), + FT_FRAME_SHORT ( yStrikeoutPosition ), + FT_FRAME_SHORT ( sFamilyClass ), + FT_FRAME_BYTE ( panose[0] ), + FT_FRAME_BYTE ( panose[1] ), + FT_FRAME_BYTE ( panose[2] ), + FT_FRAME_BYTE ( panose[3] ), + FT_FRAME_BYTE ( panose[4] ), + FT_FRAME_BYTE ( panose[5] ), + FT_FRAME_BYTE ( panose[6] ), + FT_FRAME_BYTE ( panose[7] ), + FT_FRAME_BYTE ( panose[8] ), + FT_FRAME_BYTE ( panose[9] ), + FT_FRAME_ULONG ( ulUnicodeRange1 ), + FT_FRAME_ULONG ( ulUnicodeRange2 ), + FT_FRAME_ULONG ( ulUnicodeRange3 ), + FT_FRAME_ULONG ( ulUnicodeRange4 ), + FT_FRAME_BYTE ( achVendID[0] ), + FT_FRAME_BYTE ( achVendID[1] ), + FT_FRAME_BYTE ( achVendID[2] ), + FT_FRAME_BYTE ( achVendID[3] ), + + FT_FRAME_USHORT( fsSelection ), + FT_FRAME_USHORT( usFirstCharIndex ), + FT_FRAME_USHORT( usLastCharIndex ), + FT_FRAME_SHORT ( sTypoAscender ), + FT_FRAME_SHORT ( sTypoDescender ), + FT_FRAME_SHORT ( sTypoLineGap ), + FT_FRAME_USHORT( usWinAscent ), + FT_FRAME_USHORT( usWinDescent ), + FT_FRAME_END + }; + + /* `OS/2' version 1 and newer */ + static const FT_Frame_Field os2_fields_extra1[] = + { + FT_FRAME_START( 8 ), + FT_FRAME_ULONG( ulCodePageRange1 ), + FT_FRAME_ULONG( ulCodePageRange2 ), + FT_FRAME_END + }; + + /* `OS/2' version 2 and newer */ + static const FT_Frame_Field os2_fields_extra2[] = + { + FT_FRAME_START( 10 ), + FT_FRAME_SHORT ( sxHeight ), + FT_FRAME_SHORT ( sCapHeight ), + FT_FRAME_USHORT( usDefaultChar ), + FT_FRAME_USHORT( usBreakChar ), + FT_FRAME_USHORT( usMaxContext ), + FT_FRAME_END + }; + + /* `OS/2' version 5 and newer */ + static const FT_Frame_Field os2_fields_extra5[] = + { + FT_FRAME_START( 4 ), + FT_FRAME_USHORT( usLowerOpticalPointSize ), + FT_FRAME_USHORT( usUpperOpticalPointSize ), + FT_FRAME_END + }; + + + /* We now support old Mac fonts where the OS/2 table doesn't */ + /* exist. Simply put, we set the `version' field to 0xFFFF */ + /* and test this value each time we need to access the table. */ + error = face->goto_table( face, TTAG_OS2, stream, 0 ); + if ( error ) + goto Exit; + + os2 = &face->os2; + + if ( FT_STREAM_READ_FIELDS( os2_fields, os2 ) ) + goto Exit; + + os2->ulCodePageRange1 = 0; + os2->ulCodePageRange2 = 0; + os2->sxHeight = 0; + os2->sCapHeight = 0; + os2->usDefaultChar = 0; + os2->usBreakChar = 0; + os2->usMaxContext = 0; + os2->usLowerOpticalPointSize = 0; + os2->usUpperOpticalPointSize = 0xFFFF; + + if ( os2->version >= 0x0001 ) + { + /* only version 1 tables */ + if ( FT_STREAM_READ_FIELDS( os2_fields_extra1, os2 ) ) + goto Exit; + + if ( os2->version >= 0x0002 ) + { + /* only version 2 tables */ + if ( FT_STREAM_READ_FIELDS( os2_fields_extra2, os2 ) ) + goto Exit; + + if ( os2->version >= 0x0005 ) + { + /* only version 5 tables */ + if ( FT_STREAM_READ_FIELDS( os2_fields_extra5, os2 ) ) + goto Exit; + } + } + } + + FT_TRACE3(( "sTypoAscender: %4d\n", os2->sTypoAscender )); + FT_TRACE3(( "sTypoDescender: %4d\n", os2->sTypoDescender )); + FT_TRACE3(( "usWinAscent: %4u\n", os2->usWinAscent )); + FT_TRACE3(( "usWinDescent: %4u\n", os2->usWinDescent )); + FT_TRACE3(( "fsSelection: 0x%2x\n", os2->fsSelection )); + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_postscript */ + /* */ + /* */ + /* Loads the Postscript table. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_post( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + TT_Postscript* post = &face->postscript; + + static const FT_Frame_Field post_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_Postscript + + FT_FRAME_START( 32 ), + FT_FRAME_LONG ( FormatType ), + FT_FRAME_LONG ( italicAngle ), + FT_FRAME_SHORT( underlinePosition ), + FT_FRAME_SHORT( underlineThickness ), + FT_FRAME_ULONG( isFixedPitch ), + FT_FRAME_ULONG( minMemType42 ), + FT_FRAME_ULONG( maxMemType42 ), + FT_FRAME_ULONG( minMemType1 ), + FT_FRAME_ULONG( maxMemType1 ), + FT_FRAME_END + }; + + + error = face->goto_table( face, TTAG_post, stream, 0 ); + if ( error ) + return error; + + if ( FT_STREAM_READ_FIELDS( post_fields, post ) ) + return error; + + /* we don't load the glyph names, we do that in another */ + /* module (ttpost). */ + + FT_TRACE3(( "FormatType: 0x%x\n", post->FormatType )); + FT_TRACE3(( "isFixedPitch: %s\n", post->isFixedPitch + ? " yes" : " no" )); + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_pclt */ + /* */ + /* */ + /* Loads the PCL 5 Table. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_pclt( TT_Face face, + FT_Stream stream ) + { + static const FT_Frame_Field pclt_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_PCLT + + FT_FRAME_START( 54 ), + FT_FRAME_ULONG ( Version ), + FT_FRAME_ULONG ( FontNumber ), + FT_FRAME_USHORT( Pitch ), + FT_FRAME_USHORT( xHeight ), + FT_FRAME_USHORT( Style ), + FT_FRAME_USHORT( TypeFamily ), + FT_FRAME_USHORT( CapHeight ), + FT_FRAME_USHORT( SymbolSet ), + FT_FRAME_BYTES ( TypeFace, 16 ), + FT_FRAME_BYTES ( CharacterComplement, 8 ), + FT_FRAME_BYTES ( FileName, 6 ), + FT_FRAME_CHAR ( StrokeWeight ), + FT_FRAME_CHAR ( WidthType ), + FT_FRAME_BYTE ( SerifStyle ), + FT_FRAME_BYTE ( Reserved ), + FT_FRAME_END + }; + + FT_Error error; + TT_PCLT* pclt = &face->pclt; + + + /* optional table */ + error = face->goto_table( face, TTAG_PCLT, stream, 0 ); + if ( error ) + goto Exit; + + if ( FT_STREAM_READ_FIELDS( pclt_fields, pclt ) ) + goto Exit; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_gasp */ + /* */ + /* */ + /* Loads the `gasp' table into a face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_gasp( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + + FT_UInt j,num_ranges; + TT_GaspRange gaspranges = NULL; + + + /* the gasp table is optional */ + error = face->goto_table( face, TTAG_gasp, stream, 0 ); + if ( error ) + goto Exit; + + if ( FT_FRAME_ENTER( 4L ) ) + goto Exit; + + face->gasp.version = FT_GET_USHORT(); + face->gasp.numRanges = FT_GET_USHORT(); + + FT_FRAME_EXIT(); + + /* only support versions 0 and 1 of the table */ + if ( face->gasp.version >= 2 ) + { + face->gasp.numRanges = 0; + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + num_ranges = face->gasp.numRanges; + FT_TRACE3(( "numRanges: %u\n", num_ranges )); + + if ( FT_QNEW_ARRAY( face->gasp.gaspRanges, num_ranges ) || + FT_FRAME_ENTER( num_ranges * 4L ) ) + goto Exit; + + gaspranges = face->gasp.gaspRanges; + + for ( j = 0; j < num_ranges; j++ ) + { + gaspranges[j].maxPPEM = FT_GET_USHORT(); + gaspranges[j].gaspFlag = FT_GET_USHORT(); + + FT_TRACE3(( "gaspRange %d: rangeMaxPPEM %5d, rangeGaspBehavior 0x%x\n", + j, + gaspranges[j].maxPPEM, + gaspranges[j].gaspFlag )); + } + + FT_FRAME_EXIT(); + + Exit: + return error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/ttload.h b/vendor/FreeType2/src/sfnt/ttload.h new file mode 100644 index 0000000..f94be8b --- /dev/null +++ b/vendor/FreeType2/src/sfnt/ttload.h @@ -0,0 +1,112 @@ +/***************************************************************************/ +/* */ +/* ttload.h */ +/* */ +/* Load the basic TrueType tables, i.e., tables that can be either in */ +/* TTF or OTF fonts (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTLOAD_H_ +#define TTLOAD_H_ + + +#include +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( TT_Table ) + tt_face_lookup_table( TT_Face face, + FT_ULong tag ); + + FT_LOCAL( FT_Error ) + tt_face_goto_table( TT_Face face, + FT_ULong tag, + FT_Stream stream, + FT_ULong* length ); + + + FT_LOCAL( FT_Error ) + tt_face_load_font_dir( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_any( TT_Face face, + FT_ULong tag, + FT_Long offset, + FT_Byte* buffer, + FT_ULong* length ); + + + FT_LOCAL( FT_Error ) + tt_face_load_head( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_cmap( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_maxp( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_name( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_os2( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_post( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_pclt( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_free_name( TT_Face face ); + + + FT_LOCAL( FT_Error ) + tt_face_load_gasp( TT_Face face, + FT_Stream stream ); + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + FT_LOCAL( FT_Error ) + tt_face_load_bhed( TT_Face face, + FT_Stream stream ); + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + +FT_END_HEADER + +#endif /* TTLOAD_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/ttmtx.c b/vendor/FreeType2/src/sfnt/ttmtx.c new file mode 100644 index 0000000..6ddda95 --- /dev/null +++ b/vendor/FreeType2/src/sfnt/ttmtx.c @@ -0,0 +1,326 @@ +/***************************************************************************/ +/* */ +/* ttmtx.c */ +/* */ +/* Load the metrics tables common to TTF and OTF fonts (body). */ +/* */ +/* Copyright 2006-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_SERVICE_METRICS_VARIATIONS_H +#endif + +#include "ttmtx.h" + +#include "sferrors.h" + + + /* IMPORTANT: The TT_HoriHeader and TT_VertHeader structures should */ + /* be identical except for the names of their fields, */ + /* which are different. */ + /* */ + /* This ensures that `tt_face_load_hmtx' is able to read */ + /* both the horizontal and vertical headers. */ + + + /*************************************************************************/ + /* */ + /* 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_ttmtx + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_hmtx */ + /* */ + /* */ + /* Load the `hmtx' or `vmtx' table into a face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load `vmtx'. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hmtx( TT_Face face, + FT_Stream stream, + FT_Bool vertical ) + { + FT_Error error; + FT_ULong tag, table_size; + FT_ULong* ptable_offset; + FT_ULong* ptable_size; + + + if ( vertical ) + { + tag = TTAG_vmtx; + ptable_offset = &face->vert_metrics_offset; + ptable_size = &face->vert_metrics_size; + } + else + { + tag = TTAG_hmtx; + ptable_offset = &face->horz_metrics_offset; + ptable_size = &face->horz_metrics_size; + } + + error = face->goto_table( face, tag, stream, &table_size ); + if ( error ) + goto Fail; + + *ptable_size = table_size; + *ptable_offset = FT_STREAM_POS(); + + Fail: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_hhea */ + /* */ + /* */ + /* Load the `hhea' or 'vhea' table into a face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: The input stream. */ + /* */ + /* vertical :: A boolean flag. If set, load `vhea'. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hhea( TT_Face face, + FT_Stream stream, + FT_Bool vertical ) + { + FT_Error error; + TT_HoriHeader* header; + + static const FT_Frame_Field metrics_header_fields[] = + { +#undef FT_STRUCTURE +#define FT_STRUCTURE TT_HoriHeader + + FT_FRAME_START( 36 ), + FT_FRAME_ULONG ( Version ), + FT_FRAME_SHORT ( Ascender ), + FT_FRAME_SHORT ( Descender ), + FT_FRAME_SHORT ( Line_Gap ), + FT_FRAME_USHORT( advance_Width_Max ), + FT_FRAME_SHORT ( min_Left_Side_Bearing ), + FT_FRAME_SHORT ( min_Right_Side_Bearing ), + FT_FRAME_SHORT ( xMax_Extent ), + FT_FRAME_SHORT ( caret_Slope_Rise ), + FT_FRAME_SHORT ( caret_Slope_Run ), + FT_FRAME_SHORT ( caret_Offset ), + FT_FRAME_SHORT ( Reserved[0] ), + FT_FRAME_SHORT ( Reserved[1] ), + FT_FRAME_SHORT ( Reserved[2] ), + FT_FRAME_SHORT ( Reserved[3] ), + FT_FRAME_SHORT ( metric_Data_Format ), + FT_FRAME_USHORT( number_Of_HMetrics ), + FT_FRAME_END + }; + + + if ( vertical ) + { + void *v = &face->vertical; + + + error = face->goto_table( face, TTAG_vhea, stream, 0 ); + if ( error ) + goto Fail; + + header = (TT_HoriHeader*)v; + } + else + { + error = face->goto_table( face, TTAG_hhea, stream, 0 ); + if ( error ) + goto Fail; + + header = &face->horizontal; + } + + if ( FT_STREAM_READ_FIELDS( metrics_header_fields, header ) ) + goto Fail; + + FT_TRACE3(( "Ascender: %5d\n", header->Ascender )); + FT_TRACE3(( "Descender: %5d\n", header->Descender )); + FT_TRACE3(( "number_Of_Metrics: %5u\n", header->number_Of_HMetrics )); + + header->long_metrics = NULL; + header->short_metrics = NULL; + + Fail: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_get_metrics */ + /* */ + /* */ + /* Return the horizontal or vertical metrics in font units for a */ + /* given glyph. The values are the left side bearing (top side */ + /* bearing for vertical metrics) and advance width (advance height */ + /* for vertical metrics). */ + /* */ + /* */ + /* face :: A pointer to the TrueType face structure. */ + /* */ + /* vertical :: If set to TRUE, get vertical metrics. */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* */ + /* abearing :: The bearing, either left side or top side. */ + /* */ + /* aadvance :: The advance width or advance height, depending on */ + /* the `vertical' flag. */ + /* */ + FT_LOCAL_DEF( void ) + tt_face_get_metrics( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short *abearing, + FT_UShort *aadvance ) + { + FT_Error error; + FT_Stream stream = face->root.stream; + TT_HoriHeader* header; + FT_ULong table_pos, table_size, table_end; + FT_UShort k; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Service_MetricsVariations var = + (FT_Service_MetricsVariations)face->var; +#endif + + + if ( vertical ) + { + void* v = &face->vertical; + + + header = (TT_HoriHeader*)v; + table_pos = face->vert_metrics_offset; + table_size = face->vert_metrics_size; + } + else + { + header = &face->horizontal; + table_pos = face->horz_metrics_offset; + table_size = face->horz_metrics_size; + } + + table_end = table_pos + table_size; + + k = header->number_Of_HMetrics; + + if ( k > 0 ) + { + if ( gindex < (FT_UInt)k ) + { + table_pos += 4 * gindex; + if ( table_pos + 4 > table_end ) + goto NoData; + + if ( FT_STREAM_SEEK( table_pos ) || + FT_READ_USHORT( *aadvance ) || + FT_READ_SHORT( *abearing ) ) + goto NoData; + } + else + { + table_pos += 4 * ( k - 1 ); + if ( table_pos + 4 > table_end ) + goto NoData; + + if ( FT_STREAM_SEEK( table_pos ) || + FT_READ_USHORT( *aadvance ) ) + goto NoData; + + table_pos += 4 + 2 * ( gindex - k ); + if ( table_pos + 2 > table_end ) + *abearing = 0; + else + { + if ( !FT_STREAM_SEEK( table_pos ) ) + (void)FT_READ_SHORT( *abearing ); + } + } + } + else + { + NoData: + *abearing = 0; + *aadvance = 0; + } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( var ) + { + FT_Face f = FT_FACE( face ); + FT_Int a = (FT_Int)*aadvance; + FT_Int b = (FT_Int)*abearing; + + + if ( vertical ) + { + if ( var->vadvance_adjust ) + var->vadvance_adjust( f, gindex, &a ); + if ( var->tsb_adjust ) + var->tsb_adjust( f, gindex, &b ); + } + else + { + if ( var->hadvance_adjust ) + var->hadvance_adjust( f, gindex, &a ); + if ( var->lsb_adjust ) + var->lsb_adjust( f, gindex, &b ); + } + + *aadvance = (FT_UShort)a; + *abearing = (FT_Short)b; + } +#endif + } + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/ttmtx.h b/vendor/FreeType2/src/sfnt/ttmtx.h new file mode 100644 index 0000000..ab00acd --- /dev/null +++ b/vendor/FreeType2/src/sfnt/ttmtx.h @@ -0,0 +1,55 @@ +/***************************************************************************/ +/* */ +/* ttmtx.h */ +/* */ +/* Load the metrics tables common to TTF and OTF fonts (specification). */ +/* */ +/* Copyright 2006-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTMTX_H_ +#define TTMTX_H_ + + +#include +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_hhea( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + FT_LOCAL( FT_Error ) + tt_face_load_hmtx( TT_Face face, + FT_Stream stream, + FT_Bool vertical ); + + + FT_LOCAL( void ) + tt_face_get_metrics( TT_Face face, + FT_Bool vertical, + FT_UInt gindex, + FT_Short* abearing, + FT_UShort* aadvance ); + +FT_END_HEADER + +#endif /* TTMTX_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/ttpost.c b/vendor/FreeType2/src/sfnt/ttpost.c new file mode 100644 index 0000000..6de99ef --- /dev/null +++ b/vendor/FreeType2/src/sfnt/ttpost.c @@ -0,0 +1,575 @@ +/***************************************************************************/ +/* */ +/* ttpost.c */ +/* */ +/* PostScript name table processing for TrueType and OpenType fonts */ +/* (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + /*************************************************************************/ + /* */ + /* The post table is not completely loaded by the core engine. This */ + /* file loads the missing PS glyph names and implements an API to access */ + /* them. */ + /* */ + /*************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H + + +#ifdef TT_CONFIG_OPTION_POSTSCRIPT_NAMES + +#include "ttpost.h" + +#include "sferrors.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_ttpost + + + /* If this configuration macro is defined, we rely on the `PSNames' */ + /* module to grab the glyph names. */ + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + +#include FT_SERVICE_POSTSCRIPT_CMAPS_H + +#define MAC_NAME( x ) (FT_String*)psnames->macintosh_name( (FT_UInt)(x) ) + + +#else /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + /* Otherwise, we ignore the `PSNames' module, and provide our own */ + /* table of Mac names. Thus, it is possible to build a version of */ + /* FreeType without the Type 1 driver & PSNames module. */ + +#define MAC_NAME( x ) (FT_String*)tt_post_default_names[x] + + /* the 258 default Mac PS glyph names; see file `tools/glnames.py' */ + + static const FT_String* const tt_post_default_names[258] = + { + /* 0 */ + ".notdef", ".null", "nonmarkingreturn", "space", "exclam", + "quotedbl", "numbersign", "dollar", "percent", "ampersand", + /* 10 */ + "quotesingle", "parenleft", "parenright", "asterisk", "plus", + "comma", "hyphen", "period", "slash", "zero", + /* 20 */ + "one", "two", "three", "four", "five", + "six", "seven", "eight", "nine", "colon", + /* 30 */ + "semicolon", "less", "equal", "greater", "question", + "at", "A", "B", "C", "D", + /* 40 */ + "E", "F", "G", "H", "I", + "J", "K", "L", "M", "N", + /* 50 */ + "O", "P", "Q", "R", "S", + "T", "U", "V", "W", "X", + /* 60 */ + "Y", "Z", "bracketleft", "backslash", "bracketright", + "asciicircum", "underscore", "grave", "a", "b", + /* 70 */ + "c", "d", "e", "f", "g", + "h", "i", "j", "k", "l", + /* 80 */ + "m", "n", "o", "p", "q", + "r", "s", "t", "u", "v", + /* 90 */ + "w", "x", "y", "z", "braceleft", + "bar", "braceright", "asciitilde", "Adieresis", "Aring", + /* 100 */ + "Ccedilla", "Eacute", "Ntilde", "Odieresis", "Udieresis", + "aacute", "agrave", "acircumflex", "adieresis", "atilde", + /* 110 */ + "aring", "ccedilla", "eacute", "egrave", "ecircumflex", + "edieresis", "iacute", "igrave", "icircumflex", "idieresis", + /* 120 */ + "ntilde", "oacute", "ograve", "ocircumflex", "odieresis", + "otilde", "uacute", "ugrave", "ucircumflex", "udieresis", + /* 130 */ + "dagger", "degree", "cent", "sterling", "section", + "bullet", "paragraph", "germandbls", "registered", "copyright", + /* 140 */ + "trademark", "acute", "dieresis", "notequal", "AE", + "Oslash", "infinity", "plusminus", "lessequal", "greaterequal", + /* 150 */ + "yen", "mu", "partialdiff", "summation", "product", + "pi", "integral", "ordfeminine", "ordmasculine", "Omega", + /* 160 */ + "ae", "oslash", "questiondown", "exclamdown", "logicalnot", + "radical", "florin", "approxequal", "Delta", "guillemotleft", + /* 170 */ + "guillemotright", "ellipsis", "nonbreakingspace", "Agrave", "Atilde", + "Otilde", "OE", "oe", "endash", "emdash", + /* 180 */ + "quotedblleft", "quotedblright", "quoteleft", "quoteright", "divide", + "lozenge", "ydieresis", "Ydieresis", "fraction", "currency", + /* 190 */ + "guilsinglleft", "guilsinglright", "fi", "fl", "daggerdbl", + "periodcentered", "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex", + /* 200 */ + "Ecircumflex", "Aacute", "Edieresis", "Egrave", "Iacute", + "Icircumflex", "Idieresis", "Igrave", "Oacute", "Ocircumflex", + /* 210 */ + "apple", "Ograve", "Uacute", "Ucircumflex", "Ugrave", + "dotlessi", "circumflex", "tilde", "macron", "breve", + /* 220 */ + "dotaccent", "ring", "cedilla", "hungarumlaut", "ogonek", + "caron", "Lslash", "lslash", "Scaron", "scaron", + /* 230 */ + "Zcaron", "zcaron", "brokenbar", "Eth", "eth", + "Yacute", "yacute", "Thorn", "thorn", "minus", + /* 240 */ + "multiply", "onesuperior", "twosuperior", "threesuperior", "onehalf", + "onequarter", "threequarters", "franc", "Gbreve", "gbreve", + /* 250 */ + "Idotaccent", "Scedilla", "scedilla", "Cacute", "cacute", + "Ccaron", "ccaron", "dcroat", + }; + + +#endif /* FT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + + static FT_Error + load_format_20( TT_Face face, + FT_Stream stream, + FT_ULong post_limit ) + { + FT_Memory memory = stream->memory; + FT_Error error; + + FT_Int num_glyphs; + FT_UShort num_names; + + FT_UShort* glyph_indices = NULL; + FT_Char** name_strings = NULL; + + + if ( FT_READ_USHORT( num_glyphs ) ) + goto Exit; + + /* UNDOCUMENTED! The number of glyphs in this table can be smaller */ + /* than the value in the maxp table (cf. cyberbit.ttf). */ + + /* There already exist fonts which have more than 32768 glyph names */ + /* in this table, so the test for this threshold has been dropped. */ + + if ( num_glyphs > face->max_profile.numGlyphs ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* load the indices */ + { + FT_Int n; + + + if ( FT_NEW_ARRAY ( glyph_indices, num_glyphs ) || + FT_FRAME_ENTER( num_glyphs * 2L ) ) + goto Fail; + + for ( n = 0; n < num_glyphs; n++ ) + glyph_indices[n] = FT_GET_USHORT(); + + FT_FRAME_EXIT(); + } + + /* compute number of names stored in table */ + { + FT_Int n; + + + num_names = 0; + + for ( n = 0; n < num_glyphs; n++ ) + { + FT_Int idx; + + + idx = glyph_indices[n]; + if ( idx >= 258 ) + { + idx -= 257; + if ( idx > num_names ) + num_names = (FT_UShort)idx; + } + } + } + + /* now load the name strings */ + { + FT_UShort n; + + + if ( FT_NEW_ARRAY( name_strings, num_names ) ) + goto Fail; + + for ( n = 0; n < num_names; n++ ) + { + FT_UInt len; + + + if ( FT_STREAM_POS() >= post_limit ) + break; + else + { + FT_TRACE6(( "load_format_20: %d byte left in post table\n", + post_limit - FT_STREAM_POS() )); + + if ( FT_READ_BYTE( len ) ) + goto Fail1; + } + + if ( len > post_limit || + FT_STREAM_POS() > post_limit - len ) + { + FT_Int d = (FT_Int)post_limit - (FT_Int)FT_STREAM_POS(); + + + FT_ERROR(( "load_format_20:" + " exceeding string length (%d)," + " truncating at end of post table (%d byte left)\n", + len, d )); + len = (FT_UInt)FT_MAX( 0, d ); + } + + if ( FT_NEW_ARRAY( name_strings[n], len + 1 ) || + FT_STREAM_READ( name_strings[n], len ) ) + goto Fail1; + + name_strings[n][len] = '\0'; + } + + if ( n < num_names ) + { + FT_ERROR(( "load_format_20:" + " all entries in post table are already parsed," + " using NULL names for gid %d - %d\n", + n, num_names - 1 )); + for ( ; n < num_names; n++ ) + if ( FT_NEW_ARRAY( name_strings[n], 1 ) ) + goto Fail1; + else + name_strings[n][0] = '\0'; + } + } + + /* all right, set table fields and exit successfully */ + { + TT_Post_20 table = &face->postscript_names.names.format_20; + + + table->num_glyphs = (FT_UShort)num_glyphs; + table->num_names = (FT_UShort)num_names; + table->glyph_indices = glyph_indices; + table->glyph_names = name_strings; + } + return FT_Err_Ok; + + Fail1: + { + FT_UShort n; + + + for ( n = 0; n < num_names; n++ ) + FT_FREE( name_strings[n] ); + } + + Fail: + FT_FREE( name_strings ); + FT_FREE( glyph_indices ); + + Exit: + return error; + } + + + static FT_Error + load_format_25( TT_Face face, + FT_Stream stream, + FT_ULong post_limit ) + { + FT_Memory memory = stream->memory; + FT_Error error; + + FT_Int num_glyphs; + FT_Char* offset_table = NULL; + + FT_UNUSED( post_limit ); + + + if ( FT_READ_USHORT( num_glyphs ) ) + goto Exit; + + /* check the number of glyphs */ + if ( num_glyphs > face->max_profile.numGlyphs || + num_glyphs > 258 || + num_glyphs < 1 ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( FT_NEW_ARRAY( offset_table, num_glyphs ) || + FT_STREAM_READ( offset_table, num_glyphs ) ) + goto Fail; + + /* now check the offset table */ + { + FT_Int n; + + + for ( n = 0; n < num_glyphs; n++ ) + { + FT_Long idx = (FT_Long)n + offset_table[n]; + + + if ( idx < 0 || idx > num_glyphs ) + { + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + } + } + + /* OK, set table fields and exit successfully */ + { + TT_Post_25 table = &face->postscript_names.names.format_25; + + + table->num_glyphs = (FT_UShort)num_glyphs; + table->offsets = offset_table; + } + + return FT_Err_Ok; + + Fail: + FT_FREE( offset_table ); + + Exit: + return error; + } + + + static FT_Error + load_post_names( TT_Face face ) + { + FT_Stream stream; + FT_Error error; + FT_Fixed format; + FT_ULong post_len; + FT_ULong post_limit; + + + /* get a stream for the face's resource */ + stream = face->root.stream; + + /* seek to the beginning of the PS names table */ + error = face->goto_table( face, TTAG_post, stream, &post_len ); + if ( error ) + goto Exit; + + post_limit = FT_STREAM_POS() + post_len; + + format = face->postscript.FormatType; + + /* go to beginning of subtable */ + if ( FT_STREAM_SKIP( 32 ) ) + goto Exit; + + /* now read postscript table */ + if ( format == 0x00020000L ) + error = load_format_20( face, stream, post_limit ); + else if ( format == 0x00025000L ) + error = load_format_25( face, stream, post_limit ); + else + error = FT_THROW( Invalid_File_Format ); + + face->postscript_names.loaded = 1; + + Exit: + return error; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_ps_names( TT_Face face ) + { + FT_Memory memory = face->root.memory; + TT_Post_Names names = &face->postscript_names; + FT_Fixed format; + + + if ( names->loaded ) + { + format = face->postscript.FormatType; + + if ( format == 0x00020000L ) + { + TT_Post_20 table = &names->names.format_20; + FT_UShort n; + + + FT_FREE( table->glyph_indices ); + table->num_glyphs = 0; + + for ( n = 0; n < table->num_names; n++ ) + FT_FREE( table->glyph_names[n] ); + + FT_FREE( table->glyph_names ); + table->num_names = 0; + } + else if ( format == 0x00025000L ) + { + TT_Post_25 table = &names->names.format_25; + + + FT_FREE( table->offsets ); + table->num_glyphs = 0; + } + } + names->loaded = 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_get_ps_name */ + /* */ + /* */ + /* Get the PostScript glyph name of a glyph. */ + /* */ + /* */ + /* face :: A handle to the parent face. */ + /* */ + /* idx :: The glyph index. */ + /* */ + /* */ + /* PSname :: The address of a string pointer. Undefined in case of */ + /* error, otherwise it is a pointer to the glyph name. */ + /* */ + /* You must not modify the returned string! */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_get_ps_name( TT_Face face, + FT_UInt idx, + FT_String** PSname ) + { + FT_Error error; + TT_Post_Names names; + FT_Fixed format; + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + FT_Service_PsCMaps psnames; +#endif + + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + + if ( idx >= (FT_UInt)face->max_profile.numGlyphs ) + return FT_THROW( Invalid_Glyph_Index ); + +#ifdef FT_CONFIG_OPTION_POSTSCRIPT_NAMES + psnames = (FT_Service_PsCMaps)face->psnames; + if ( !psnames ) + return FT_THROW( Unimplemented_Feature ); +#endif + + names = &face->postscript_names; + + /* `.notdef' by default */ + *PSname = MAC_NAME( 0 ); + + format = face->postscript.FormatType; + + if ( format == 0x00010000L ) + { + if ( idx < 258 ) /* paranoid checking */ + *PSname = MAC_NAME( idx ); + } + else if ( format == 0x00020000L ) + { + TT_Post_20 table = &names->names.format_20; + + + if ( !names->loaded ) + { + error = load_post_names( face ); + if ( error ) + goto End; + } + + if ( idx < (FT_UInt)table->num_glyphs ) + { + FT_UShort name_index = table->glyph_indices[idx]; + + + if ( name_index < 258 ) + *PSname = MAC_NAME( name_index ); + else + *PSname = (FT_String*)table->glyph_names[name_index - 258]; + } + } + else if ( format == 0x00025000L ) + { + TT_Post_25 table = &names->names.format_25; + + + if ( !names->loaded ) + { + error = load_post_names( face ); + if ( error ) + goto End; + } + + if ( idx < (FT_UInt)table->num_glyphs ) /* paranoid checking */ + *PSname = MAC_NAME( (FT_Int)idx + table->offsets[idx] ); + } + + /* nothing to do for format == 0x00030000L */ + + End: + return FT_Err_Ok; + } + +#else /* !TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + /* ANSI C doesn't like empty source files */ + typedef int _tt_post_dummy; + +#endif /* !TT_CONFIG_OPTION_POSTSCRIPT_NAMES */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/ttpost.h b/vendor/FreeType2/src/sfnt/ttpost.h new file mode 100644 index 0000000..3bec07e --- /dev/null +++ b/vendor/FreeType2/src/sfnt/ttpost.h @@ -0,0 +1,46 @@ +/***************************************************************************/ +/* */ +/* ttpost.h */ +/* */ +/* PostScript name table processing for TrueType and OpenType fonts */ +/* (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTPOST_H_ +#define TTPOST_H_ + + +#include +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_get_ps_name( TT_Face face, + FT_UInt idx, + FT_String** PSname ); + + FT_LOCAL( void ) + tt_face_free_ps_names( TT_Face face ); + + +FT_END_HEADER + +#endif /* TTPOST_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/ttsbit.c b/vendor/FreeType2/src/sfnt/ttsbit.c new file mode 100644 index 0000000..33b8640 --- /dev/null +++ b/vendor/FreeType2/src/sfnt/ttsbit.c @@ -0,0 +1,1682 @@ +/***************************************************************************/ +/* */ +/* ttsbit.c */ +/* */ +/* TrueType and OpenType embedded bitmap support (body). */ +/* */ +/* Copyright 2005-2018 by */ +/* David Turner, Robert Wilhelm, and Werner Lemberg. */ +/* */ +/* Copyright 2013 by Google, Inc. */ +/* Google Author(s): Behdad Esfahbod. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include FT_BITMAP_H + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + +#include "ttsbit.h" + +#include "sferrors.h" + +#include "ttmtx.h" +#include "pngshim.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_ttsbit + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_sbit( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_ULong table_size; + FT_ULong table_start; + + + face->sbit_table = NULL; + face->sbit_table_size = 0; + face->sbit_table_type = TT_SBIT_TABLE_TYPE_NONE; + face->sbit_num_strikes = 0; + + error = face->goto_table( face, TTAG_CBLC, stream, &table_size ); + if ( !error ) + face->sbit_table_type = TT_SBIT_TABLE_TYPE_CBLC; + else + { + error = face->goto_table( face, TTAG_EBLC, stream, &table_size ); + if ( error ) + error = face->goto_table( face, TTAG_bloc, stream, &table_size ); + if ( !error ) + face->sbit_table_type = TT_SBIT_TABLE_TYPE_EBLC; + } + + if ( error ) + { + error = face->goto_table( face, TTAG_sbix, stream, &table_size ); + if ( !error ) + face->sbit_table_type = TT_SBIT_TABLE_TYPE_SBIX; + } + if ( error ) + goto Exit; + + if ( table_size < 8 ) + { + FT_ERROR(( "tt_face_load_sbit_strikes: table too short\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + table_start = FT_STREAM_POS(); + + switch ( (FT_UInt)face->sbit_table_type ) + { + case TT_SBIT_TABLE_TYPE_EBLC: + case TT_SBIT_TABLE_TYPE_CBLC: + { + FT_Byte* p; + FT_Fixed version; + FT_ULong num_strikes; + FT_UInt count; + + + if ( FT_FRAME_EXTRACT( table_size, face->sbit_table ) ) + goto Exit; + + face->sbit_table_size = table_size; + + p = face->sbit_table; + + version = FT_NEXT_LONG( p ); + num_strikes = FT_NEXT_ULONG( p ); + + /* there's at least one font (FZShuSong-Z01, version 3) */ + /* that uses the wrong byte order for the `version' field */ + if ( ( (FT_ULong)version & 0xFFFF0000UL ) != 0x00020000UL && + ( (FT_ULong)version & 0x0000FFFFUL ) != 0x00000200UL && + ( (FT_ULong)version & 0xFFFF0000UL ) != 0x00030000UL && + ( (FT_ULong)version & 0x0000FFFFUL ) != 0x00000300UL ) + { + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + if ( num_strikes >= 0x10000UL ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* + * Count the number of strikes available in the table. We are a bit + * paranoid there and don't trust the data. + */ + count = (FT_UInt)num_strikes; + if ( 8 + 48UL * count > table_size ) + count = (FT_UInt)( ( table_size - 8 ) / 48 ); + + face->sbit_num_strikes = count; + } + break; + + case TT_SBIT_TABLE_TYPE_SBIX: + { + FT_UShort version; + FT_UShort flags; + FT_ULong num_strikes; + FT_UInt count; + + + if ( FT_FRAME_ENTER( 8 ) ) + goto Exit; + + version = FT_GET_USHORT(); + flags = FT_GET_USHORT(); + num_strikes = FT_GET_ULONG(); + + FT_FRAME_EXIT(); + + if ( version < 1 ) + { + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + /* Bit 0 must always be `1'. */ + /* Bit 1 controls the overlay of bitmaps with outlines. */ + /* All other bits should be zero. */ + if ( !( flags == 1 || flags == 3 ) || + num_strikes >= 0x10000UL ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* we currently don't support bit 1; however, it is better to */ + /* draw at least something... */ + if ( flags == 3 ) + FT_TRACE1(( "tt_face_load_sbit_strikes:" + " sbix overlay not supported yet\n" + " " + " expect bad rendering results\n" )); + + /* + * Count the number of strikes available in the table. We are a bit + * paranoid there and don't trust the data. + */ + count = (FT_UInt)num_strikes; + if ( 8 + 4UL * count > table_size ) + count = (FT_UInt)( ( table_size - 8 ) / 4 ); + + if ( FT_STREAM_SEEK( FT_STREAM_POS() - 8 ) ) + goto Exit; + + face->sbit_table_size = 8 + count * 4; + if ( FT_FRAME_EXTRACT( face->sbit_table_size, face->sbit_table ) ) + goto Exit; + + face->sbit_num_strikes = count; + } + break; + + default: + /* we ignore unknown table formats */ + error = FT_THROW( Unknown_File_Format ); + break; + } + + if ( !error ) + FT_TRACE3(( "tt_face_load_sbit_strikes: found %u strikes\n", + face->sbit_num_strikes )); + + face->ebdt_start = 0; + face->ebdt_size = 0; + + if ( face->sbit_table_type == TT_SBIT_TABLE_TYPE_SBIX ) + { + /* the `sbix' table is self-contained; */ + /* it has no associated data table */ + face->ebdt_start = table_start; + face->ebdt_size = table_size; + } + else if ( face->sbit_table_type != TT_SBIT_TABLE_TYPE_NONE ) + { + FT_ULong ebdt_size; + + + error = face->goto_table( face, TTAG_CBDT, stream, &ebdt_size ); + if ( error ) + error = face->goto_table( face, TTAG_EBDT, stream, &ebdt_size ); + if ( error ) + error = face->goto_table( face, TTAG_bdat, stream, &ebdt_size ); + + if ( !error ) + { + face->ebdt_start = FT_STREAM_POS(); + face->ebdt_size = ebdt_size; + } + } + + if ( !face->ebdt_size ) + { + FT_TRACE2(( "tt_face_load_sbit_strikes:" + " no embedded bitmap data table found;\n" + " " + " resetting number of strikes to zero\n" )); + face->sbit_num_strikes = 0; + } + + return FT_Err_Ok; + + Exit: + if ( error ) + { + if ( face->sbit_table ) + FT_FRAME_RELEASE( face->sbit_table ); + face->sbit_table_size = 0; + face->sbit_table_type = TT_SBIT_TABLE_TYPE_NONE; + } + + return error; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_sbit( TT_Face face ) + { + FT_Stream stream = face->root.stream; + + + FT_FRAME_RELEASE( face->sbit_table ); + face->sbit_table_size = 0; + face->sbit_table_type = TT_SBIT_TABLE_TYPE_NONE; + face->sbit_num_strikes = 0; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_set_sbit_strike( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ) + { + return FT_Match_Size( (FT_Face)face, req, 0, astrike_index ); + } + + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_strike_metrics( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ) + { + /* we have to test for the existence of `sbit_strike_map' */ + /* because the function gets also used at the very beginning */ + /* to construct `sbit_strike_map' itself */ + if ( face->sbit_strike_map ) + { + if ( strike_index >= (FT_ULong)face->root.num_fixed_sizes ) + return FT_THROW( Invalid_Argument ); + + /* map to real index */ + strike_index = face->sbit_strike_map[strike_index]; + } + else + { + if ( strike_index >= (FT_ULong)face->sbit_num_strikes ) + return FT_THROW( Invalid_Argument ); + } + + switch ( (FT_UInt)face->sbit_table_type ) + { + case TT_SBIT_TABLE_TYPE_EBLC: + case TT_SBIT_TABLE_TYPE_CBLC: + { + FT_Byte* strike; + FT_Char max_before_bl; + FT_Char min_after_bl; + + + strike = face->sbit_table + 8 + strike_index * 48; + + metrics->x_ppem = (FT_UShort)strike[44]; + metrics->y_ppem = (FT_UShort)strike[45]; + + metrics->ascender = (FT_Char)strike[16] * 64; /* hori.ascender */ + metrics->descender = (FT_Char)strike[17] * 64; /* hori.descender */ + + /* Due to fuzzy wording in the EBLC documentation, we find both */ + /* positive and negative values for `descender'. Additionally, */ + /* many fonts have both `ascender' and `descender' set to zero */ + /* (which is definitely wrong). MS Windows simply ignores all */ + /* those values... For these reasons we apply some heuristics */ + /* to get a reasonable, non-zero value for the height. */ + + max_before_bl = (FT_Char)strike[24]; + min_after_bl = (FT_Char)strike[25]; + + if ( metrics->descender > 0 ) + { + /* compare sign of descender with `min_after_bl' */ + if ( min_after_bl < 0 ) + metrics->descender = -metrics->descender; + } + + else if ( metrics->descender == 0 ) + { + if ( metrics->ascender == 0 ) + { + FT_TRACE2(( "tt_face_load_strike_metrics:" + " sanitizing invalid ascender and descender\n" + " " + " values for strike %d (%dppem, %dppem)\n", + strike_index, + metrics->x_ppem, metrics->y_ppem )); + + /* sanitize buggy ascender and descender values */ + if ( max_before_bl || min_after_bl ) + { + metrics->ascender = max_before_bl * 64; + metrics->descender = min_after_bl * 64; + } + else + { + metrics->ascender = metrics->y_ppem * 64; + metrics->descender = 0; + } + } + } + +#if 0 + else + ; /* if we have a negative descender, simply use it */ +#endif + + metrics->height = metrics->ascender - metrics->descender; + if ( metrics->height == 0 ) + { + FT_TRACE2(( "tt_face_load_strike_metrics:" + " sanitizing invalid height value\n" + " " + " for strike (%d, %d)\n", + metrics->x_ppem, metrics->y_ppem )); + metrics->height = metrics->y_ppem * 64; + metrics->descender = metrics->ascender - metrics->height; + } + + /* Is this correct? */ + metrics->max_advance = ( (FT_Char)strike[22] + /* min_origin_SB */ + strike[18] + /* max_width */ + (FT_Char)strike[23] /* min_advance_SB */ + ) * 64; + + /* set the scale values (in 16.16 units) so advances */ + /* from the hmtx and vmtx table are scaled correctly */ + metrics->x_scale = FT_MulDiv( metrics->x_ppem, + 64 * 0x10000, + face->header.Units_Per_EM ); + metrics->y_scale = FT_MulDiv( metrics->y_ppem, + 64 * 0x10000, + face->header.Units_Per_EM ); + + return FT_Err_Ok; + } + + case TT_SBIT_TABLE_TYPE_SBIX: + { + FT_Stream stream = face->root.stream; + FT_UInt offset; + FT_UShort upem, ppem, resolution; + TT_HoriHeader *hori; + FT_Pos ppem_; /* to reduce casts */ + + FT_Error error; + FT_Byte* p; + + + p = face->sbit_table + 8 + 4 * strike_index; + offset = FT_NEXT_ULONG( p ); + + if ( offset + 4 > face->ebdt_size ) + return FT_THROW( Invalid_File_Format ); + + if ( FT_STREAM_SEEK( face->ebdt_start + offset ) || + FT_FRAME_ENTER( 4 ) ) + return error; + + ppem = FT_GET_USHORT(); + resolution = FT_GET_USHORT(); + + FT_UNUSED( resolution ); /* What to do with this? */ + + FT_FRAME_EXIT(); + + upem = face->header.Units_Per_EM; + hori = &face->horizontal; + + metrics->x_ppem = ppem; + metrics->y_ppem = ppem; + + ppem_ = (FT_Pos)ppem; + + metrics->ascender = + FT_MulDiv( hori->Ascender, ppem_ * 64, upem ); + metrics->descender = + FT_MulDiv( hori->Descender, ppem_ * 64, upem ); + metrics->height = + FT_MulDiv( hori->Ascender - hori->Descender + hori->Line_Gap, + ppem_ * 64, upem ); + metrics->max_advance = + FT_MulDiv( hori->advance_Width_Max, ppem_ * 64, upem ); + + /* set the scale values (in 16.16 units) so advances */ + /* from the hmtx and vmtx table are scaled correctly */ + metrics->x_scale = FT_MulDiv( metrics->x_ppem, + 64 * 0x10000, + face->header.Units_Per_EM ); + metrics->y_scale = FT_MulDiv( metrics->y_ppem, + 64 * 0x10000, + face->header.Units_Per_EM ); + + return error; + } + + default: + return FT_THROW( Unknown_File_Format ); + } + } + + + typedef struct TT_SBitDecoderRec_ + { + TT_Face face; + FT_Stream stream; + FT_Bitmap* bitmap; + TT_SBit_Metrics metrics; + FT_Bool metrics_loaded; + FT_Bool bitmap_allocated; + FT_Byte bit_depth; + + FT_ULong ebdt_start; + FT_ULong ebdt_size; + + FT_ULong strike_index_array; + FT_ULong strike_index_count; + FT_Byte* eblc_base; + FT_Byte* eblc_limit; + + } TT_SBitDecoderRec, *TT_SBitDecoder; + + + static FT_Error + tt_sbit_decoder_init( TT_SBitDecoder decoder, + TT_Face face, + FT_ULong strike_index, + TT_SBit_MetricsRec* metrics ) + { + FT_Error error = FT_ERR( Table_Missing ); + FT_Stream stream = face->root.stream; + + + strike_index = face->sbit_strike_map[strike_index]; + + if ( !face->ebdt_size ) + goto Exit; + if ( FT_STREAM_SEEK( face->ebdt_start ) ) + goto Exit; + + decoder->face = face; + decoder->stream = stream; + decoder->bitmap = &face->root.glyph->bitmap; + decoder->metrics = metrics; + + decoder->metrics_loaded = 0; + decoder->bitmap_allocated = 0; + + decoder->ebdt_start = face->ebdt_start; + decoder->ebdt_size = face->ebdt_size; + + decoder->eblc_base = face->sbit_table; + decoder->eblc_limit = face->sbit_table + face->sbit_table_size; + + /* now find the strike corresponding to the index */ + { + FT_Byte* p; + + + if ( 8 + 48 * strike_index + 3 * 4 + 34 + 1 > face->sbit_table_size ) + { + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + p = decoder->eblc_base + 8 + 48 * strike_index; + + decoder->strike_index_array = FT_NEXT_ULONG( p ); + p += 4; + decoder->strike_index_count = FT_NEXT_ULONG( p ); + p += 34; + decoder->bit_depth = *p; + + /* decoder->strike_index_array + */ + /* 8 * decoder->strike_index_count > face->sbit_table_size ? */ + if ( decoder->strike_index_array > face->sbit_table_size || + decoder->strike_index_count > + ( face->sbit_table_size - decoder->strike_index_array ) / 8 ) + error = FT_THROW( Invalid_File_Format ); + } + + Exit: + return error; + } + + + static void + tt_sbit_decoder_done( TT_SBitDecoder decoder ) + { + FT_UNUSED( decoder ); + } + + + static FT_Error + tt_sbit_decoder_alloc_bitmap( TT_SBitDecoder decoder, + FT_Bool metrics_only ) + { + FT_Error error = FT_Err_Ok; + FT_UInt width, height; + FT_Bitmap* map = decoder->bitmap; + FT_ULong size; + + + if ( !decoder->metrics_loaded ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + width = decoder->metrics->width; + height = decoder->metrics->height; + + map->width = width; + map->rows = height; + + switch ( decoder->bit_depth ) + { + case 1: + map->pixel_mode = FT_PIXEL_MODE_MONO; + map->pitch = (int)( ( map->width + 7 ) >> 3 ); + map->num_grays = 2; + break; + + case 2: + map->pixel_mode = FT_PIXEL_MODE_GRAY2; + map->pitch = (int)( ( map->width + 3 ) >> 2 ); + map->num_grays = 4; + break; + + case 4: + map->pixel_mode = FT_PIXEL_MODE_GRAY4; + map->pitch = (int)( ( map->width + 1 ) >> 1 ); + map->num_grays = 16; + break; + + case 8: + map->pixel_mode = FT_PIXEL_MODE_GRAY; + map->pitch = (int)( map->width ); + map->num_grays = 256; + break; + + case 32: + map->pixel_mode = FT_PIXEL_MODE_BGRA; + map->pitch = (int)( map->width * 4 ); + map->num_grays = 256; + break; + + default: + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + size = map->rows * (FT_ULong)map->pitch; + + /* check that there is no empty image */ + if ( size == 0 ) + goto Exit; /* exit successfully! */ + + if ( metrics_only ) + goto Exit; /* only metrics are requested */ + + error = ft_glyphslot_alloc_bitmap( decoder->face->root.glyph, size ); + if ( error ) + goto Exit; + + decoder->bitmap_allocated = 1; + + Exit: + return error; + } + + + static FT_Error + tt_sbit_decoder_load_metrics( TT_SBitDecoder decoder, + FT_Byte* *pp, + FT_Byte* limit, + FT_Bool big ) + { + FT_Byte* p = *pp; + TT_SBit_Metrics metrics = decoder->metrics; + + + if ( p + 5 > limit ) + goto Fail; + + metrics->height = p[0]; + metrics->width = p[1]; + metrics->horiBearingX = (FT_Char)p[2]; + metrics->horiBearingY = (FT_Char)p[3]; + metrics->horiAdvance = p[4]; + + p += 5; + if ( big ) + { + if ( p + 3 > limit ) + goto Fail; + + metrics->vertBearingX = (FT_Char)p[0]; + metrics->vertBearingY = (FT_Char)p[1]; + metrics->vertAdvance = p[2]; + + p += 3; + } + else + { + /* avoid uninitialized data in case there is no vertical info -- */ + metrics->vertBearingX = 0; + metrics->vertBearingY = 0; + metrics->vertAdvance = 0; + } + + decoder->metrics_loaded = 1; + *pp = p; + return FT_Err_Ok; + + Fail: + FT_TRACE1(( "tt_sbit_decoder_load_metrics: broken table\n" )); + return FT_THROW( Invalid_Argument ); + } + + + /* forward declaration */ + static FT_Error + tt_sbit_decoder_load_image( TT_SBitDecoder decoder, + FT_UInt glyph_index, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count, + FT_Bool metrics_only ); + + typedef FT_Error (*TT_SBitDecoder_LoadFunc)( + TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* plimit, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count ); + + + static FT_Error + tt_sbit_decoder_load_byte_aligned( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* line; + FT_Int pitch, width, height, line_bits, h; + FT_UInt bit_height, bit_width; + FT_Bitmap* bitmap; + + FT_UNUSED( recurse_count ); + + + /* check that we can write the glyph into the bitmap */ + bitmap = decoder->bitmap; + bit_width = bitmap->width; + bit_height = bitmap->rows; + pitch = bitmap->pitch; + line = bitmap->buffer; + + width = decoder->metrics->width; + height = decoder->metrics->height; + + line_bits = width * decoder->bit_depth; + + if ( x_pos < 0 || (FT_UInt)( x_pos + width ) > bit_width || + y_pos < 0 || (FT_UInt)( y_pos + height ) > bit_height ) + { + FT_TRACE1(( "tt_sbit_decoder_load_byte_aligned:" + " invalid bitmap dimensions\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( p + ( ( line_bits + 7 ) >> 3 ) * height > limit ) + { + FT_TRACE1(( "tt_sbit_decoder_load_byte_aligned: broken bitmap\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + /* now do the blit */ + line += y_pos * pitch + ( x_pos >> 3 ); + x_pos &= 7; + + if ( x_pos == 0 ) /* the easy one */ + { + for ( h = height; h > 0; h--, line += pitch ) + { + FT_Byte* pwrite = line; + FT_Int w; + + + for ( w = line_bits; w >= 8; w -= 8 ) + { + pwrite[0] = (FT_Byte)( pwrite[0] | *p++ ); + pwrite += 1; + } + + if ( w > 0 ) + pwrite[0] = (FT_Byte)( pwrite[0] | ( *p++ & ( 0xFF00U >> w ) ) ); + } + } + else /* x_pos > 0 */ + { + for ( h = height; h > 0; h--, line += pitch ) + { + FT_Byte* pwrite = line; + FT_Int w; + FT_UInt wval = 0; + + + for ( w = line_bits; w >= 8; w -= 8 ) + { + wval = (FT_UInt)( wval | *p++ ); + pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) ); + pwrite += 1; + wval <<= 8; + } + + if ( w > 0 ) + wval = (FT_UInt)( wval | ( *p++ & ( 0xFF00U >> w ) ) ); + + /* all bits read and there are `x_pos + w' bits to be written */ + + pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) ); + + if ( x_pos + w > 8 ) + { + pwrite++; + wval <<= 8; + pwrite[0] = (FT_Byte)( pwrite[0] | ( wval >> x_pos ) ); + } + } + } + + Exit: + if ( !error ) + FT_TRACE3(( "tt_sbit_decoder_load_byte_aligned: loaded\n" )); + return error; + } + + + /* + * Load a bit-aligned bitmap (with pointer `p') into a line-aligned bitmap + * (with pointer `pwrite'). In the example below, the width is 3 pixel, + * and `x_pos' is 1 pixel. + * + * p p+1 + * | | | + * | 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 |... + * | | | + * +-------+ +-------+ +-------+ ... + * . . . + * . . . + * v . . + * +-------+ . . + * | | . + * | 7 6 5 4 3 2 1 0 | . + * | | . + * pwrite . . + * . . + * v . + * +-------+ . + * | | + * | 7 6 5 4 3 2 1 0 | + * | | + * pwrite+1 . + * . + * v + * +-------+ + * | | + * | 7 6 5 4 3 2 1 0 | + * | | + * pwrite+2 + * + */ + + static FT_Error + tt_sbit_decoder_load_bit_aligned( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count ) + { + FT_Error error = FT_Err_Ok; + FT_Byte* line; + FT_Int pitch, width, height, line_bits, h, nbits; + FT_UInt bit_height, bit_width; + FT_Bitmap* bitmap; + FT_UShort rval; + + FT_UNUSED( recurse_count ); + + + /* check that we can write the glyph into the bitmap */ + bitmap = decoder->bitmap; + bit_width = bitmap->width; + bit_height = bitmap->rows; + pitch = bitmap->pitch; + line = bitmap->buffer; + + width = decoder->metrics->width; + height = decoder->metrics->height; + + line_bits = width * decoder->bit_depth; + + if ( x_pos < 0 || (FT_UInt)( x_pos + width ) > bit_width || + y_pos < 0 || (FT_UInt)( y_pos + height ) > bit_height ) + { + FT_TRACE1(( "tt_sbit_decoder_load_bit_aligned:" + " invalid bitmap dimensions\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( p + ( ( line_bits * height + 7 ) >> 3 ) > limit ) + { + FT_TRACE1(( "tt_sbit_decoder_load_bit_aligned: broken bitmap\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + if ( !line_bits || !height ) + { + /* nothing to do */ + goto Exit; + } + + /* now do the blit */ + + /* adjust `line' to point to the first byte of the bitmap */ + line += y_pos * pitch + ( x_pos >> 3 ); + x_pos &= 7; + + /* the higher byte of `rval' is used as a buffer */ + rval = 0; + nbits = 0; + + for ( h = height; h > 0; h--, line += pitch ) + { + FT_Byte* pwrite = line; + FT_Int w = line_bits; + + + /* handle initial byte (in target bitmap) specially if necessary */ + if ( x_pos ) + { + w = ( line_bits < 8 - x_pos ) ? line_bits : 8 - x_pos; + + if ( h == height ) + { + rval = *p++; + nbits = x_pos; + } + else if ( nbits < w ) + { + if ( p < limit ) + rval |= *p++; + nbits += 8 - w; + } + else + { + rval >>= 8; + nbits -= w; + } + + *pwrite++ |= ( ( rval >> nbits ) & 0xFF ) & + ( ~( 0xFFU << w ) << ( 8 - w - x_pos ) ); + rval <<= 8; + + w = line_bits - w; + } + + /* handle medial bytes */ + for ( ; w >= 8; w -= 8 ) + { + rval |= *p++; + *pwrite++ |= ( rval >> nbits ) & 0xFF; + + rval <<= 8; + } + + /* handle final byte if necessary */ + if ( w > 0 ) + { + if ( nbits < w ) + { + if ( p < limit ) + rval |= *p++; + *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w ); + nbits += 8 - w; + + rval <<= 8; + } + else + { + *pwrite |= ( ( rval >> nbits ) & 0xFF ) & ( 0xFF00U >> w ); + nbits -= w; + } + } + } + + Exit: + if ( !error ) + FT_TRACE3(( "tt_sbit_decoder_load_bit_aligned: loaded\n" )); + return error; + } + + + static FT_Error + tt_sbit_decoder_load_compound( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count ) + { + FT_Error error = FT_Err_Ok; + FT_UInt num_components, nn; + + FT_Char horiBearingX = (FT_Char)decoder->metrics->horiBearingX; + FT_Char horiBearingY = (FT_Char)decoder->metrics->horiBearingY; + FT_Byte horiAdvance = (FT_Byte)decoder->metrics->horiAdvance; + FT_Char vertBearingX = (FT_Char)decoder->metrics->vertBearingX; + FT_Char vertBearingY = (FT_Char)decoder->metrics->vertBearingY; + FT_Byte vertAdvance = (FT_Byte)decoder->metrics->vertAdvance; + + + if ( p + 2 > limit ) + goto Fail; + + num_components = FT_NEXT_USHORT( p ); + if ( p + 4 * num_components > limit ) + { + FT_TRACE1(( "tt_sbit_decoder_load_compound: broken table\n" )); + goto Fail; + } + + FT_TRACE3(( "tt_sbit_decoder_load_compound: loading %d component%s\n", + num_components, + num_components == 1 ? "" : "s" )); + + for ( nn = 0; nn < num_components; nn++ ) + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + FT_Byte dx = FT_NEXT_BYTE( p ); + FT_Byte dy = FT_NEXT_BYTE( p ); + + + /* NB: a recursive call */ + error = tt_sbit_decoder_load_image( decoder, + gindex, + x_pos + dx, + y_pos + dy, + recurse_count + 1, + /* request full bitmap image */ + FALSE ); + if ( error ) + break; + } + + FT_TRACE3(( "tt_sbit_decoder_load_compound: done\n" )); + + decoder->metrics->horiBearingX = horiBearingX; + decoder->metrics->horiBearingY = horiBearingY; + decoder->metrics->horiAdvance = horiAdvance; + decoder->metrics->vertBearingX = vertBearingX; + decoder->metrics->vertBearingY = vertBearingY; + decoder->metrics->vertAdvance = vertAdvance; + decoder->metrics->width = (FT_Byte)decoder->bitmap->width; + decoder->metrics->height = (FT_Byte)decoder->bitmap->rows; + + Exit: + return error; + + Fail: + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + +#ifdef FT_CONFIG_OPTION_USE_PNG + + static FT_Error + tt_sbit_decoder_load_png( TT_SBitDecoder decoder, + FT_Byte* p, + FT_Byte* limit, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count ) + { + FT_Error error = FT_Err_Ok; + FT_ULong png_len; + + FT_UNUSED( recurse_count ); + + + if ( limit - p < 4 ) + { + FT_TRACE1(( "tt_sbit_decoder_load_png: broken bitmap\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + png_len = FT_NEXT_ULONG( p ); + if ( (FT_ULong)( limit - p ) < png_len ) + { + FT_TRACE1(( "tt_sbit_decoder_load_png: broken bitmap\n" )); + error = FT_THROW( Invalid_File_Format ); + goto Exit; + } + + error = Load_SBit_Png( decoder->face->root.glyph, + x_pos, + y_pos, + decoder->bit_depth, + decoder->metrics, + decoder->stream->memory, + p, + png_len, + FALSE, + FALSE ); + + Exit: + if ( !error ) + FT_TRACE3(( "tt_sbit_decoder_load_png: loaded\n" )); + return error; + } + +#endif /* FT_CONFIG_OPTION_USE_PNG */ + + + static FT_Error + tt_sbit_decoder_load_bitmap( TT_SBitDecoder decoder, + FT_UInt glyph_format, + FT_ULong glyph_start, + FT_ULong glyph_size, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count, + FT_Bool metrics_only ) + { + FT_Error error; + FT_Stream stream = decoder->stream; + FT_Byte* p; + FT_Byte* p_limit; + FT_Byte* data; + + + /* seek into the EBDT table now */ + if ( !glyph_size || + glyph_start + glyph_size > decoder->ebdt_size ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( FT_STREAM_SEEK( decoder->ebdt_start + glyph_start ) || + FT_FRAME_EXTRACT( glyph_size, data ) ) + goto Exit; + + p = data; + p_limit = p + glyph_size; + + /* read the data, depending on the glyph format */ + switch ( glyph_format ) + { + case 1: + case 2: + case 8: + case 17: + error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 0 ); + break; + + case 6: + case 7: + case 9: + case 18: + error = tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ); + break; + + default: + error = FT_Err_Ok; + } + + if ( error ) + goto Fail; + + { + TT_SBitDecoder_LoadFunc loader; + + + switch ( glyph_format ) + { + case 1: + case 6: + loader = tt_sbit_decoder_load_byte_aligned; + break; + + case 2: + case 7: + { + /* Don't trust `glyph_format'. For example, Apple's main Korean */ + /* system font, `AppleMyungJo.ttf' (version 7.0d2e6), uses glyph */ + /* format 7, but the data is format 6. We check whether we have */ + /* an excessive number of bytes in the image: If it is equal to */ + /* the value for a byte-aligned glyph, use the other loading */ + /* routine. */ + /* */ + /* Note that for some (width,height) combinations, where the */ + /* width is not a multiple of 8, the sizes for bit- and */ + /* byte-aligned data are equal, for example (7,7) or (15,6). We */ + /* then prefer what `glyph_format' specifies. */ + + FT_UInt width = decoder->metrics->width; + FT_UInt height = decoder->metrics->height; + + FT_UInt bit_size = ( width * height + 7 ) >> 3; + FT_UInt byte_size = height * ( ( width + 7 ) >> 3 ); + + + if ( bit_size < byte_size && + byte_size == (FT_UInt)( p_limit - p ) ) + loader = tt_sbit_decoder_load_byte_aligned; + else + loader = tt_sbit_decoder_load_bit_aligned; + } + break; + + case 5: + loader = tt_sbit_decoder_load_bit_aligned; + break; + + case 8: + if ( p + 1 > p_limit ) + goto Fail; + + p += 1; /* skip padding */ + /* fall-through */ + + case 9: + loader = tt_sbit_decoder_load_compound; + break; + + case 17: /* small metrics, PNG image data */ + case 18: /* big metrics, PNG image data */ + case 19: /* metrics in EBLC, PNG image data */ +#ifdef FT_CONFIG_OPTION_USE_PNG + loader = tt_sbit_decoder_load_png; + break; +#else + error = FT_THROW( Unimplemented_Feature ); + goto Fail; +#endif /* FT_CONFIG_OPTION_USE_PNG */ + + default: + error = FT_THROW( Invalid_Table ); + goto Fail; + } + + if ( !decoder->bitmap_allocated ) + { + error = tt_sbit_decoder_alloc_bitmap( decoder, metrics_only ); + + if ( error ) + goto Fail; + } + + if ( metrics_only ) + goto Fail; /* this is not an error */ + + error = loader( decoder, p, p_limit, x_pos, y_pos, recurse_count ); + } + + Fail: + FT_FRAME_RELEASE( data ); + + Exit: + return error; + } + + + static FT_Error + tt_sbit_decoder_load_image( TT_SBitDecoder decoder, + FT_UInt glyph_index, + FT_Int x_pos, + FT_Int y_pos, + FT_UInt recurse_count, + FT_Bool metrics_only ) + { + FT_Byte* p = decoder->eblc_base + decoder->strike_index_array; + FT_Byte* p_limit = decoder->eblc_limit; + FT_ULong num_ranges = decoder->strike_index_count; + FT_UInt start, end, index_format, image_format; + FT_ULong image_start = 0, image_end = 0, image_offset; + + + /* arbitrary recursion limit */ + if ( recurse_count > 100 ) + { + FT_TRACE4(( "tt_sbit_decoder_load_image:" + " recursion depth exceeded\n" )); + goto Failure; + } + + + /* First, we find the correct strike range that applies to this */ + /* glyph index. */ + for ( ; num_ranges > 0; num_ranges-- ) + { + start = FT_NEXT_USHORT( p ); + end = FT_NEXT_USHORT( p ); + + if ( glyph_index >= start && glyph_index <= end ) + goto FoundRange; + + p += 4; /* ignore index offset */ + } + goto NoBitmap; + + FoundRange: + image_offset = FT_NEXT_ULONG( p ); + + /* overflow check */ + p = decoder->eblc_base + decoder->strike_index_array; + if ( image_offset > (FT_ULong)( p_limit - p ) ) + goto Failure; + + p += image_offset; + if ( p + 8 > p_limit ) + goto NoBitmap; + + /* now find the glyph's location and extend within the ebdt table */ + index_format = FT_NEXT_USHORT( p ); + image_format = FT_NEXT_USHORT( p ); + image_offset = FT_NEXT_ULONG ( p ); + + switch ( index_format ) + { + case 1: /* 4-byte offsets relative to `image_offset' */ + p += 4 * ( glyph_index - start ); + if ( p + 8 > p_limit ) + goto NoBitmap; + + image_start = FT_NEXT_ULONG( p ); + image_end = FT_NEXT_ULONG( p ); + + if ( image_start == image_end ) /* missing glyph */ + goto NoBitmap; + break; + + case 2: /* big metrics, constant image size */ + { + FT_ULong image_size; + + + if ( p + 12 > p_limit ) + goto NoBitmap; + + image_size = FT_NEXT_ULONG( p ); + + if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) ) + goto NoBitmap; + + image_start = image_size * ( glyph_index - start ); + image_end = image_start + image_size; + } + break; + + case 3: /* 2-byte offsets relative to 'image_offset' */ + p += 2 * ( glyph_index - start ); + if ( p + 4 > p_limit ) + goto NoBitmap; + + image_start = FT_NEXT_USHORT( p ); + image_end = FT_NEXT_USHORT( p ); + + if ( image_start == image_end ) /* missing glyph */ + goto NoBitmap; + break; + + case 4: /* sparse glyph array with (glyph,offset) pairs */ + { + FT_ULong mm, num_glyphs; + + + if ( p + 4 > p_limit ) + goto NoBitmap; + + num_glyphs = FT_NEXT_ULONG( p ); + + /* overflow check for p + ( num_glyphs + 1 ) * 4 */ + if ( p + 4 > p_limit || + num_glyphs > (FT_ULong)( ( ( p_limit - p ) >> 2 ) - 1 ) ) + goto NoBitmap; + + for ( mm = 0; mm < num_glyphs; mm++ ) + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + + + if ( gindex == glyph_index ) + { + image_start = FT_NEXT_USHORT( p ); + p += 2; + image_end = FT_PEEK_USHORT( p ); + break; + } + p += 2; + } + + if ( mm >= num_glyphs ) + goto NoBitmap; + } + break; + + case 5: /* constant metrics with sparse glyph codes */ + case 19: + { + FT_ULong image_size, mm, num_glyphs; + + + if ( p + 16 > p_limit ) + goto NoBitmap; + + image_size = FT_NEXT_ULONG( p ); + + if ( tt_sbit_decoder_load_metrics( decoder, &p, p_limit, 1 ) ) + goto NoBitmap; + + num_glyphs = FT_NEXT_ULONG( p ); + + /* overflow check for p + 2 * num_glyphs */ + if ( num_glyphs > (FT_ULong)( ( p_limit - p ) >> 1 ) ) + goto NoBitmap; + + for ( mm = 0; mm < num_glyphs; mm++ ) + { + FT_UInt gindex = FT_NEXT_USHORT( p ); + + + if ( gindex == glyph_index ) + break; + } + + if ( mm >= num_glyphs ) + goto NoBitmap; + + image_start = image_size * mm; + image_end = image_start + image_size; + } + break; + + default: + goto NoBitmap; + } + + if ( image_start > image_end ) + goto NoBitmap; + + image_end -= image_start; + image_start = image_offset + image_start; + + FT_TRACE3(( "tt_sbit_decoder_load_image:" + " found sbit (format %d) for glyph index %d\n", + image_format, glyph_index )); + + return tt_sbit_decoder_load_bitmap( decoder, + image_format, + image_start, + image_end, + x_pos, + y_pos, + recurse_count, + metrics_only ); + + Failure: + return FT_THROW( Invalid_Table ); + + NoBitmap: + if ( recurse_count ) + { + FT_TRACE4(( "tt_sbit_decoder_load_image:" + " missing subglyph sbit with glyph index %d\n", + glyph_index )); + return FT_THROW( Invalid_Composite ); + } + + FT_TRACE4(( "tt_sbit_decoder_load_image:" + " no sbit found for glyph index %d\n", glyph_index )); + return FT_THROW( Missing_Bitmap ); + } + + + static FT_Error + tt_face_load_sbix_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics, + FT_Bool metrics_only ) + { + FT_UInt strike_offset, glyph_start, glyph_end; + FT_Int originOffsetX, originOffsetY; + FT_Tag graphicType; + FT_Int recurse_depth = 0; + + FT_Error error; + FT_Byte* p; + + FT_UNUSED( map ); +#ifndef FT_CONFIG_OPTION_USE_PNG + FT_UNUSED( metrics_only ); +#endif + + + strike_index = face->sbit_strike_map[strike_index]; + + metrics->width = 0; + metrics->height = 0; + + p = face->sbit_table + 8 + 4 * strike_index; + strike_offset = FT_NEXT_ULONG( p ); + + retry: + if ( glyph_index > (FT_UInt)face->root.num_glyphs ) + return FT_THROW( Invalid_Argument ); + + if ( strike_offset >= face->ebdt_size || + face->ebdt_size - strike_offset < 4 + glyph_index * 4 + 8 ) + return FT_THROW( Invalid_File_Format ); + + if ( FT_STREAM_SEEK( face->ebdt_start + + strike_offset + 4 + + glyph_index * 4 ) || + FT_FRAME_ENTER( 8 ) ) + return error; + + glyph_start = FT_GET_ULONG(); + glyph_end = FT_GET_ULONG(); + + FT_FRAME_EXIT(); + + if ( glyph_start == glyph_end ) + return FT_THROW( Missing_Bitmap ); + if ( glyph_start > glyph_end || + glyph_end - glyph_start < 8 || + face->ebdt_size - strike_offset < glyph_end ) + return FT_THROW( Invalid_File_Format ); + + if ( FT_STREAM_SEEK( face->ebdt_start + strike_offset + glyph_start ) || + FT_FRAME_ENTER( glyph_end - glyph_start ) ) + return error; + + originOffsetX = FT_GET_SHORT(); + originOffsetY = FT_GET_SHORT(); + + graphicType = FT_GET_TAG4(); + + switch ( graphicType ) + { + case FT_MAKE_TAG( 'd', 'u', 'p', 'e' ): + if ( recurse_depth < 4 ) + { + glyph_index = FT_GET_USHORT(); + FT_FRAME_EXIT(); + recurse_depth++; + goto retry; + } + error = FT_THROW( Invalid_File_Format ); + break; + + case FT_MAKE_TAG( 'p', 'n', 'g', ' ' ): +#ifdef FT_CONFIG_OPTION_USE_PNG + error = Load_SBit_Png( face->root.glyph, + 0, + 0, + 32, + metrics, + stream->memory, + stream->cursor, + glyph_end - glyph_start - 8, + TRUE, + metrics_only ); +#else + error = FT_THROW( Unimplemented_Feature ); +#endif + break; + + case FT_MAKE_TAG( 'j', 'p', 'g', ' ' ): + case FT_MAKE_TAG( 't', 'i', 'f', 'f' ): + case FT_MAKE_TAG( 'r', 'g', 'b', 'l' ): /* used on iOS 7.1 */ + error = FT_THROW( Unknown_File_Format ); + break; + + default: + error = FT_THROW( Unimplemented_Feature ); + break; + } + + FT_FRAME_EXIT(); + + if ( !error ) + { + FT_Short abearing; + FT_UShort aadvance; + + + tt_face_get_metrics( face, FALSE, glyph_index, &abearing, &aadvance ); + + metrics->horiBearingX = (FT_Short)originOffsetX; + metrics->horiBearingY = (FT_Short)( -originOffsetY + metrics->height ); + metrics->horiAdvance = (FT_UShort)( aadvance * + face->root.size->metrics.x_ppem / + face->header.Units_Per_EM ); + } + + return error; + } + + FT_LOCAL( FT_Error ) + tt_face_load_sbit_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics ) + { + FT_Error error = FT_Err_Ok; + + + switch ( (FT_UInt)face->sbit_table_type ) + { + case TT_SBIT_TABLE_TYPE_EBLC: + case TT_SBIT_TABLE_TYPE_CBLC: + { + TT_SBitDecoderRec decoder[1]; + + + error = tt_sbit_decoder_init( decoder, face, strike_index, metrics ); + if ( !error ) + { + error = tt_sbit_decoder_load_image( + decoder, + glyph_index, + 0, + 0, + 0, + ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) != 0 ); + tt_sbit_decoder_done( decoder ); + } + } + break; + + case TT_SBIT_TABLE_TYPE_SBIX: + error = tt_face_load_sbix_image( + face, + strike_index, + glyph_index, + stream, + map, + metrics, + ( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) != 0 ); + break; + + default: + error = FT_THROW( Unknown_File_Format ); + break; + } + + /* Flatten color bitmaps if color was not requested. */ + if ( !error && + !( load_flags & FT_LOAD_COLOR ) && + !( load_flags & FT_LOAD_BITMAP_METRICS_ONLY ) && + map->pixel_mode == FT_PIXEL_MODE_BGRA ) + { + FT_Bitmap new_map; + FT_Library library = face->root.glyph->library; + + + FT_Bitmap_Init( &new_map ); + + /* Convert to 8bit grayscale. */ + error = FT_Bitmap_Convert( library, map, &new_map, 1 ); + if ( error ) + FT_Bitmap_Done( library, &new_map ); + else + { + map->pixel_mode = new_map.pixel_mode; + map->pitch = new_map.pitch; + map->num_grays = new_map.num_grays; + + ft_glyphslot_set_bitmap( face->root.glyph, new_map.buffer ); + face->root.glyph->internal->flags |= FT_GLYPH_OWN_BITMAP; + } + } + + return error; + } + +#else /* !TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* ANSI C doesn't like empty source files */ + typedef int _tt_sbit_dummy; + +#endif /* !TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + +/* END */ diff --git a/vendor/FreeType2/src/sfnt/ttsbit.h b/vendor/FreeType2/src/sfnt/ttsbit.h new file mode 100644 index 0000000..ce2af3c --- /dev/null +++ b/vendor/FreeType2/src/sfnt/ttsbit.h @@ -0,0 +1,63 @@ +/***************************************************************************/ +/* */ +/* ttsbit.h */ +/* */ +/* TrueType and OpenType embedded bitmap support (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTSBIT_H_ +#define TTSBIT_H_ + + +#include +#include "ttload.h" + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_sbit( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( void ) + tt_face_free_sbit( TT_Face face ); + + + FT_LOCAL( FT_Error ) + tt_face_set_sbit_strike( TT_Face face, + FT_Size_Request req, + FT_ULong* astrike_index ); + + FT_LOCAL( FT_Error ) + tt_face_load_strike_metrics( TT_Face face, + FT_ULong strike_index, + FT_Size_Metrics* metrics ); + + FT_LOCAL( FT_Error ) + tt_face_load_sbit_image( TT_Face face, + FT_ULong strike_index, + FT_UInt glyph_index, + FT_UInt load_flags, + FT_Stream stream, + FT_Bitmap *map, + TT_SBit_MetricsRec *metrics ); + + +FT_END_HEADER + +#endif /* TTSBIT_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/smooth/ftgrays.c b/vendor/FreeType2/src/smooth/ftgrays.c new file mode 100644 index 0000000..803a19e --- /dev/null +++ b/vendor/FreeType2/src/smooth/ftgrays.c @@ -0,0 +1,2042 @@ +/***************************************************************************/ +/* */ +/* ftgrays.c */ +/* */ +/* A new `perfect' anti-aliasing renderer (body). */ +/* */ +/* Copyright 2000-2018 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 file can be compiled without the rest of the FreeType engine, by */ + /* defining the STANDALONE_ macro when compiling it. You also need to */ + /* put the files `ftgrays.h' and `ftimage.h' into the current */ + /* compilation directory. Typically, you could do something like */ + /* */ + /* - copy `src/smooth/ftgrays.c' (this file) to your current directory */ + /* */ + /* - copy `include/freetype/ftimage.h' and `src/smooth/ftgrays.h' to the */ + /* same directory */ + /* */ + /* - compile `ftgrays' with the STANDALONE_ macro defined, as in */ + /* */ + /* cc -c -DSTANDALONE_ ftgrays.c */ + /* */ + /* The renderer can be initialized with a call to */ + /* `ft_gray_raster.raster_new'; an anti-aliased bitmap can be generated */ + /* with a call to `ft_gray_raster.raster_render'. */ + /* */ + /* See the comments and documentation in the file `ftimage.h' for more */ + /* details on how the raster works. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* This is a new anti-aliasing scan-converter for FreeType 2. The */ + /* algorithm used here is _very_ different from the one in the standard */ + /* `ftraster' module. Actually, `ftgrays' computes the _exact_ */ + /* coverage of the outline on each pixel cell. */ + /* */ + /* It is based on ideas that I initially found in Raph Levien's */ + /* excellent LibArt graphics library (see http://www.levien.com/libart */ + /* for more information, though the web pages do not tell anything */ + /* about the renderer; you'll have to dive into the source code to */ + /* understand how it works). */ + /* */ + /* Note, however, that this is a _very_ different implementation */ + /* compared to Raph's. Coverage information is stored in a very */ + /* different way, and I don't use sorted vector paths. Also, it doesn't */ + /* use floating point values. */ + /* */ + /* This renderer has the following advantages: */ + /* */ + /* - It doesn't need an intermediate bitmap. Instead, one can supply a */ + /* callback function that will be called by the renderer to draw gray */ + /* spans on any target surface. You can thus do direct composition on */ + /* any kind of bitmap, provided that you give the renderer the right */ + /* callback. */ + /* */ + /* - A perfect anti-aliaser, i.e., it computes the _exact_ coverage on */ + /* each pixel cell. */ + /* */ + /* - It performs a single pass on the outline (the `standard' FT2 */ + /* renderer makes two passes). */ + /* */ + /* - It can easily be modified to render to _any_ number of gray levels */ + /* cheaply. */ + /* */ + /* - For small (< 20) pixel sizes, it is faster than the standard */ + /* renderer. */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* 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_smooth + + +#ifdef STANDALONE_ + + + /* The size in bytes of the render pool used by the scan-line converter */ + /* to do all of its work. */ +#define FT_RENDER_POOL_SIZE 16384L + + + /* Auxiliary macros for token concatenation. */ +#define FT_ERR_XCAT( x, y ) x ## y +#define FT_ERR_CAT( x, y ) FT_ERR_XCAT( x, y ) + +#define FT_BEGIN_STMNT do { +#define FT_END_STMNT } while ( 0 ) + +#define FT_MIN( a, b ) ( (a) < (b) ? (a) : (b) ) +#define FT_MAX( a, b ) ( (a) > (b) ? (a) : (b) ) +#define FT_ABS( a ) ( (a) < 0 ? -(a) : (a) ) + + + /* + * Approximate sqrt(x*x+y*y) using the `alpha max plus beta min' + * algorithm. We use alpha = 1, beta = 3/8, giving us results with a + * largest error less than 7% compared to the exact value. + */ +#define FT_HYPOT( x, y ) \ + ( x = FT_ABS( x ), \ + y = FT_ABS( y ), \ + x > y ? x + ( 3 * y >> 3 ) \ + : y + ( 3 * x >> 3 ) ) + + + /* define this to dump debugging information */ +/* #define FT_DEBUG_LEVEL_TRACE */ + + +#ifdef FT_DEBUG_LEVEL_TRACE +#include +#include +#endif + +#include +#include +#include +#include +#define FT_CHAR_BIT CHAR_BIT +#define FT_UINT_MAX UINT_MAX +#define FT_INT_MAX INT_MAX +#define FT_ULONG_MAX ULONG_MAX + +#define ADD_LONG( a, b ) \ + (long)( (unsigned long)(a) + (unsigned long)(b) ) +#define SUB_LONG( a, b ) \ + (long)( (unsigned long)(a) - (unsigned long)(b) ) +#define MUL_LONG( a, b ) \ + (long)( (unsigned long)(a) * (unsigned long)(b) ) +#define NEG_LONG( a ) \ + (long)( -(unsigned long)(a) ) + + +#define ft_memset memset + +#define ft_setjmp setjmp +#define ft_longjmp longjmp +#define ft_jmp_buf jmp_buf + +typedef ptrdiff_t FT_PtrDist; + + +#define ErrRaster_Invalid_Mode -2 +#define ErrRaster_Invalid_Outline -1 +#define ErrRaster_Invalid_Argument -3 +#define ErrRaster_Memory_Overflow -4 + +#define FT_BEGIN_HEADER +#define FT_END_HEADER + +#include "ftimage.h" +#include "ftgrays.h" + + + /* This macro is used to indicate that a function parameter is unused. */ + /* Its purpose is simply to reduce compiler warnings. Note also that */ + /* simply defining it as `(void)x' doesn't avoid warnings with certain */ + /* ANSI compilers (e.g. LCC). */ +#define FT_UNUSED( x ) (x) = (x) + + + /* we only use level 5 & 7 tracing messages; cf. ftdebug.h */ + +#ifdef FT_DEBUG_LEVEL_TRACE + + void + FT_Message( const char* fmt, + ... ) + { + va_list ap; + + + va_start( ap, fmt ); + vfprintf( stderr, fmt, ap ); + va_end( ap ); + } + + + /* empty function useful for setting a breakpoint to catch errors */ + int + FT_Throw( int error, + int line, + const char* file ) + { + FT_UNUSED( error ); + FT_UNUSED( line ); + FT_UNUSED( file ); + + return 0; + } + + + /* we don't handle tracing levels in stand-alone mode; */ +#ifndef FT_TRACE5 +#define FT_TRACE5( varformat ) FT_Message varformat +#endif +#ifndef FT_TRACE7 +#define FT_TRACE7( varformat ) FT_Message varformat +#endif +#ifndef FT_ERROR +#define FT_ERROR( varformat ) FT_Message varformat +#endif + +#define FT_THROW( e ) \ + ( FT_Throw( FT_ERR_CAT( ErrRaster, e ), \ + __LINE__, \ + __FILE__ ) | \ + FT_ERR_CAT( ErrRaster, e ) ) + +#else /* !FT_DEBUG_LEVEL_TRACE */ + +#define FT_TRACE5( x ) do { } while ( 0 ) /* nothing */ +#define FT_TRACE7( x ) do { } while ( 0 ) /* nothing */ +#define FT_ERROR( x ) do { } while ( 0 ) /* nothing */ +#define FT_THROW( e ) FT_ERR_CAT( ErrRaster_, e ) + + +#endif /* !FT_DEBUG_LEVEL_TRACE */ + + +#define FT_DEFINE_OUTLINE_FUNCS( class_, \ + move_to_, line_to_, \ + conic_to_, cubic_to_, \ + shift_, delta_ ) \ + static const FT_Outline_Funcs class_ = \ + { \ + move_to_, \ + line_to_, \ + conic_to_, \ + cubic_to_, \ + shift_, \ + delta_ \ + }; + +#define FT_DEFINE_RASTER_FUNCS( class_, glyph_format_, \ + raster_new_, raster_reset_, \ + raster_set_mode_, raster_render_, \ + raster_done_ ) \ + const FT_Raster_Funcs class_ = \ + { \ + glyph_format_, \ + raster_new_, \ + raster_reset_, \ + raster_set_mode_, \ + raster_render_, \ + raster_done_ \ + }; + + +#else /* !STANDALONE_ */ + + +#include +#include "ftgrays.h" +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_OUTLINE_H + +#include "ftsmerrs.h" + +#include "ftspic.h" + +#define Smooth_Err_Invalid_Mode Smooth_Err_Cannot_Render_Glyph +#define Smooth_Err_Memory_Overflow Smooth_Err_Out_Of_Memory +#define ErrRaster_Memory_Overflow Smooth_Err_Out_Of_Memory + + +#endif /* !STANDALONE_ */ + + +#ifndef FT_MEM_SET +#define FT_MEM_SET( d, s, c ) ft_memset( d, s, c ) +#endif + +#ifndef FT_MEM_ZERO +#define FT_MEM_ZERO( dest, count ) FT_MEM_SET( dest, 0, count ) +#endif + +#ifndef FT_ZERO +#define FT_ZERO( p ) FT_MEM_ZERO( p, sizeof ( *(p) ) ) +#endif + + /* as usual, for the speed hungry :-) */ + +#undef RAS_ARG +#undef RAS_ARG_ +#undef RAS_VAR +#undef RAS_VAR_ + +#ifndef FT_STATIC_RASTER + +#define RAS_ARG gray_PWorker worker +#define RAS_ARG_ gray_PWorker worker, + +#define RAS_VAR worker +#define RAS_VAR_ worker, + +#else /* FT_STATIC_RASTER */ + +#define RAS_ARG void +#define RAS_ARG_ /* empty */ +#define RAS_VAR /* empty */ +#define RAS_VAR_ /* empty */ + +#endif /* FT_STATIC_RASTER */ + + + /* must be at least 6 bits! */ +#define PIXEL_BITS 8 + +#undef FLOOR +#undef CEILING +#undef TRUNC +#undef SCALED + +#define ONE_PIXEL ( 1 << PIXEL_BITS ) +#define TRUNC( x ) ( (TCoord)( (x) >> PIXEL_BITS ) ) +#define SUBPIXELS( x ) ( (TPos)(x) * ONE_PIXEL ) +#define FLOOR( x ) ( (x) & -ONE_PIXEL ) +#define CEILING( x ) ( ( (x) + ONE_PIXEL - 1 ) & -ONE_PIXEL ) +#define ROUND( x ) ( ( (x) + ONE_PIXEL / 2 ) & -ONE_PIXEL ) + +#if PIXEL_BITS >= 6 +#define UPSCALE( x ) ( (x) * ( ONE_PIXEL >> 6 ) ) +#define DOWNSCALE( x ) ( (x) >> ( PIXEL_BITS - 6 ) ) +#else +#define UPSCALE( x ) ( (x) >> ( 6 - PIXEL_BITS ) ) +#define DOWNSCALE( x ) ( (x) * ( 64 >> PIXEL_BITS ) ) +#endif + + + /* Compute `dividend / divisor' and return both its quotient and */ + /* remainder, cast to a specific type. This macro also ensures that */ + /* the remainder is always positive. We use the remainder to keep */ + /* track of accumulating errors and compensate for them. */ +#define FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \ + FT_BEGIN_STMNT \ + (quotient) = (type)( (dividend) / (divisor) ); \ + (remainder) = (type)( (dividend) % (divisor) ); \ + if ( (remainder) < 0 ) \ + { \ + (quotient)--; \ + (remainder) += (type)(divisor); \ + } \ + FT_END_STMNT + +#ifdef __arm__ + /* Work around a bug specific to GCC which make the compiler fail to */ + /* optimize a division and modulo operation on the same parameters */ + /* into a single call to `__aeabi_idivmod'. See */ + /* */ + /* https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43721 */ +#undef FT_DIV_MOD +#define FT_DIV_MOD( type, dividend, divisor, quotient, remainder ) \ + FT_BEGIN_STMNT \ + (quotient) = (type)( (dividend) / (divisor) ); \ + (remainder) = (type)( (dividend) - (quotient) * (divisor) ); \ + if ( (remainder) < 0 ) \ + { \ + (quotient)--; \ + (remainder) += (type)(divisor); \ + } \ + FT_END_STMNT +#endif /* __arm__ */ + + + /* These macros speed up repetitive divisions by replacing them */ + /* with multiplications and right shifts. */ +#define FT_UDIVPREP( c, b ) \ + long b ## _r = c ? (long)( FT_ULONG_MAX >> PIXEL_BITS ) / ( b ) \ + : 0 +#define FT_UDIV( a, b ) \ + ( ( (unsigned long)( a ) * (unsigned long)( b ## _r ) ) >> \ + ( sizeof( long ) * FT_CHAR_BIT - PIXEL_BITS ) ) + + + /*************************************************************************/ + /* */ + /* TYPE DEFINITIONS */ + /* */ + + /* don't change the following types to FT_Int or FT_Pos, since we might */ + /* need to define them to "float" or "double" when experimenting with */ + /* new algorithms */ + + typedef long TPos; /* subpixel coordinate */ + typedef int TCoord; /* integer scanline/pixel coordinate */ + typedef int TArea; /* cell areas, coordinate products */ + + + typedef struct TCell_* PCell; + + typedef struct TCell_ + { + TCoord x; /* same with gray_TWorker.ex */ + TCoord cover; /* same with gray_TWorker.cover */ + TArea area; + PCell next; + + } TCell; + + typedef struct TPixmap_ + { + unsigned char* origin; /* pixmap origin at the bottom-left */ + int pitch; /* pitch to go down one row */ + + } TPixmap; + + /* maximum number of gray cells in the buffer */ +#if FT_RENDER_POOL_SIZE > 2048 +#define FT_MAX_GRAY_POOL ( FT_RENDER_POOL_SIZE / sizeof ( TCell ) ) +#else +#define FT_MAX_GRAY_POOL ( 2048 / sizeof ( TCell ) ) +#endif + + +#if defined( _MSC_VER ) /* Visual C++ (and Intel C++) */ + /* We disable the warning `structure was padded due to */ + /* __declspec(align())' in order to compile cleanly with */ + /* the maximum level of warnings. */ +#pragma warning( push ) +#pragma warning( disable : 4324 ) +#endif /* _MSC_VER */ + + typedef struct gray_TWorker_ + { + ft_jmp_buf jump_buffer; + + TCoord ex, ey; + TCoord min_ex, max_ex; + TCoord min_ey, max_ey; + + TArea area; + TCoord cover; + int invalid; + + PCell* ycells; + PCell cells; + FT_PtrDist max_cells; + FT_PtrDist num_cells; + + TPos x, y; + + FT_Outline outline; + TPixmap target; + + FT_Raster_Span_Func render_span; + void* render_span_data; + + } gray_TWorker, *gray_PWorker; + +#if defined( _MSC_VER ) +#pragma warning( pop ) +#endif + + +#ifndef FT_STATIC_RASTER +#define ras (*worker) +#else + static gray_TWorker ras; +#endif + + + typedef struct gray_TRaster_ + { + void* memory; + + } gray_TRaster, *gray_PRaster; + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* to be called while in the debugger -- */ + /* this function causes a compiler warning since it is unused otherwise */ + static void + gray_dump_cells( RAS_ARG ) + { + int y; + + + for ( y = ras.min_ey; y < ras.max_ey; y++ ) + { + PCell cell = ras.ycells[y - ras.min_ey]; + + + printf( "%3d:", y ); + + for ( ; cell != NULL; cell = cell->next ) + printf( " (%3d, c:%4d, a:%6d)", + cell->x, cell->cover, cell->area ); + printf( "\n" ); + } + } + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /* */ + /* Record the current cell in the table. */ + /* */ + static void + gray_record_cell( RAS_ARG ) + { + PCell *pcell, cell; + TCoord x = ras.ex; + + + pcell = &ras.ycells[ras.ey - ras.min_ey]; + for (;;) + { + cell = *pcell; + if ( !cell || cell->x > x ) + break; + + if ( cell->x == x ) + goto Found; + + pcell = &cell->next; + } + + if ( ras.num_cells >= ras.max_cells ) + ft_longjmp( ras.jump_buffer, 1 ); + + /* insert new cell */ + cell = ras.cells + ras.num_cells++; + cell->x = x; + cell->area = ras.area; + cell->cover = ras.cover; + + cell->next = *pcell; + *pcell = cell; + + return; + + Found: + /* update old cell */ + cell->area += ras.area; + cell->cover += ras.cover; + } + + + /*************************************************************************/ + /* */ + /* Set the current cell to a new position. */ + /* */ + static void + gray_set_cell( RAS_ARG_ TCoord ex, + TCoord ey ) + { + /* Move the cell pointer to a new position. We set the `invalid' */ + /* flag to indicate that the cell isn't part of those we're interested */ + /* in during the render phase. This means that: */ + /* */ + /* . the new vertical position must be within min_ey..max_ey-1. */ + /* . the new horizontal position must be strictly less than max_ex */ + /* */ + /* Note that if a cell is to the left of the clipping region, it is */ + /* actually set to the (min_ex-1) horizontal position. */ + + if ( ex < ras.min_ex ) + ex = ras.min_ex - 1; + + /* record the current one if it is valid and substantial */ + if ( !ras.invalid && ( ras.area || ras.cover ) ) + gray_record_cell( RAS_VAR ); + + ras.area = 0; + ras.cover = 0; + ras.ex = ex; + ras.ey = ey; + + ras.invalid = ( ey >= ras.max_ey || ey < ras.min_ey || + ex >= ras.max_ex ); + } + + +#ifndef FT_LONG64 + + /*************************************************************************/ + /* */ + /* Render a scanline as one or more cells. */ + /* */ + static void + gray_render_scanline( RAS_ARG_ TCoord ey, + TPos x1, + TCoord y1, + TPos x2, + TCoord y2 ) + { + TCoord ex1, ex2, fx1, fx2, first, dy, delta, mod; + TPos p, dx; + int incr; + + + ex1 = TRUNC( x1 ); + ex2 = TRUNC( x2 ); + + /* trivial case. Happens often */ + if ( y1 == y2 ) + { + gray_set_cell( RAS_VAR_ ex2, ey ); + return; + } + + fx1 = (TCoord)( x1 - SUBPIXELS( ex1 ) ); + fx2 = (TCoord)( x2 - SUBPIXELS( ex2 ) ); + + /* everything is located in a single cell. That is easy! */ + /* */ + if ( ex1 == ex2 ) + goto End; + + /* ok, we'll have to render a run of adjacent cells on the same */ + /* scanline... */ + /* */ + dx = x2 - x1; + dy = y2 - y1; + + if ( dx > 0 ) + { + p = ( ONE_PIXEL - fx1 ) * dy; + first = ONE_PIXEL; + incr = 1; + } + else + { + p = fx1 * dy; + first = 0; + incr = -1; + dx = -dx; + } + + FT_DIV_MOD( TCoord, p, dx, delta, mod ); + + ras.area += (TArea)( ( fx1 + first ) * delta ); + ras.cover += delta; + y1 += delta; + ex1 += incr; + gray_set_cell( RAS_VAR_ ex1, ey ); + + if ( ex1 != ex2 ) + { + TCoord lift, rem; + + + p = ONE_PIXEL * dy; + FT_DIV_MOD( TCoord, p, dx, lift, rem ); + + do + { + delta = lift; + mod += rem; + if ( mod >= (TCoord)dx ) + { + mod -= (TCoord)dx; + delta++; + } + + ras.area += (TArea)( ONE_PIXEL * delta ); + ras.cover += delta; + y1 += delta; + ex1 += incr; + gray_set_cell( RAS_VAR_ ex1, ey ); + } while ( ex1 != ex2 ); + } + + fx1 = ONE_PIXEL - first; + + End: + dy = y2 - y1; + + ras.area += (TArea)( ( fx1 + fx2 ) * dy ); + ras.cover += dy; + } + + + /*************************************************************************/ + /* */ + /* Render a given line as a series of scanlines. */ + /* */ + static void + gray_render_line( RAS_ARG_ TPos to_x, + TPos to_y ) + { + TCoord ey1, ey2, fy1, fy2, first, delta, mod; + TPos p, dx, dy, x, x2; + int incr; + + + ey1 = TRUNC( ras.y ); + ey2 = TRUNC( to_y ); /* if (ey2 >= ras.max_ey) ey2 = ras.max_ey-1; */ + + /* perform vertical clipping */ + if ( ( ey1 >= ras.max_ey && ey2 >= ras.max_ey ) || + ( ey1 < ras.min_ey && ey2 < ras.min_ey ) ) + goto End; + + fy1 = (TCoord)( ras.y - SUBPIXELS( ey1 ) ); + fy2 = (TCoord)( to_y - SUBPIXELS( ey2 ) ); + + /* everything is on a single scanline */ + if ( ey1 == ey2 ) + { + gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, to_x, fy2 ); + goto End; + } + + dx = to_x - ras.x; + dy = to_y - ras.y; + + /* vertical line - avoid calling gray_render_scanline */ + if ( dx == 0 ) + { + TCoord ex = TRUNC( ras.x ); + TCoord two_fx = (TCoord)( ( ras.x - SUBPIXELS( ex ) ) << 1 ); + TArea area; + + + if ( dy > 0) + { + first = ONE_PIXEL; + incr = 1; + } + else + { + first = 0; + incr = -1; + } + + delta = first - fy1; + ras.area += (TArea)two_fx * delta; + ras.cover += delta; + ey1 += incr; + + gray_set_cell( RAS_VAR_ ex, ey1 ); + + delta = first + first - ONE_PIXEL; + area = (TArea)two_fx * delta; + while ( ey1 != ey2 ) + { + ras.area += area; + ras.cover += delta; + ey1 += incr; + + gray_set_cell( RAS_VAR_ ex, ey1 ); + } + + delta = fy2 - ONE_PIXEL + first; + ras.area += (TArea)two_fx * delta; + ras.cover += delta; + + goto End; + } + + /* ok, we have to render several scanlines */ + if ( dy > 0) + { + p = ( ONE_PIXEL - fy1 ) * dx; + first = ONE_PIXEL; + incr = 1; + } + else + { + p = fy1 * dx; + first = 0; + incr = -1; + dy = -dy; + } + + FT_DIV_MOD( TCoord, p, dy, delta, mod ); + + x = ras.x + delta; + gray_render_scanline( RAS_VAR_ ey1, ras.x, fy1, x, first ); + + ey1 += incr; + gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 ); + + if ( ey1 != ey2 ) + { + TCoord lift, rem; + + + p = ONE_PIXEL * dx; + FT_DIV_MOD( TCoord, p, dy, lift, rem ); + + do + { + delta = lift; + mod += rem; + if ( mod >= (TCoord)dy ) + { + mod -= (TCoord)dy; + delta++; + } + + x2 = x + delta; + gray_render_scanline( RAS_VAR_ ey1, + x, ONE_PIXEL - first, + x2, first ); + x = x2; + + ey1 += incr; + gray_set_cell( RAS_VAR_ TRUNC( x ), ey1 ); + } while ( ey1 != ey2 ); + } + + gray_render_scanline( RAS_VAR_ ey1, + x, ONE_PIXEL - first, + to_x, fy2 ); + + End: + ras.x = to_x; + ras.y = to_y; + } + +#else + + /*************************************************************************/ + /* */ + /* Render a straight line across multiple cells in any direction. */ + /* */ + static void + gray_render_line( RAS_ARG_ TPos to_x, + TPos to_y ) + { + TPos dx, dy, fx1, fy1, fx2, fy2; + TCoord ex1, ex2, ey1, ey2; + + + ey1 = TRUNC( ras.y ); + ey2 = TRUNC( to_y ); + + /* perform vertical clipping */ + if ( ( ey1 >= ras.max_ey && ey2 >= ras.max_ey ) || + ( ey1 < ras.min_ey && ey2 < ras.min_ey ) ) + goto End; + + ex1 = TRUNC( ras.x ); + ex2 = TRUNC( to_x ); + + fx1 = ras.x - SUBPIXELS( ex1 ); + fy1 = ras.y - SUBPIXELS( ey1 ); + + dx = to_x - ras.x; + dy = to_y - ras.y; + + if ( ex1 == ex2 && ey1 == ey2 ) /* inside one cell */ + ; + else if ( dy == 0 ) /* ex1 != ex2 */ /* any horizontal line */ + { + ex1 = ex2; + gray_set_cell( RAS_VAR_ ex1, ey1 ); + } + else if ( dx == 0 ) + { + if ( dy > 0 ) /* vertical line up */ + do + { + fy2 = ONE_PIXEL; + ras.cover += ( fy2 - fy1 ); + ras.area += ( fy2 - fy1 ) * fx1 * 2; + fy1 = 0; + ey1++; + gray_set_cell( RAS_VAR_ ex1, ey1 ); + } while ( ey1 != ey2 ); + else /* vertical line down */ + do + { + fy2 = 0; + ras.cover += ( fy2 - fy1 ); + ras.area += ( fy2 - fy1 ) * fx1 * 2; + fy1 = ONE_PIXEL; + ey1--; + gray_set_cell( RAS_VAR_ ex1, ey1 ); + } while ( ey1 != ey2 ); + } + else /* any other line */ + { + TPos prod = dx * fy1 - dy * fx1; + FT_UDIVPREP( ex1 != ex2, dx ); + FT_UDIVPREP( ey1 != ey2, dy ); + + + /* The fundamental value `prod' determines which side and the */ + /* exact coordinate where the line exits current cell. It is */ + /* also easily updated when moving from one cell to the next. */ + do + { + if ( prod <= 0 && + prod - dx * ONE_PIXEL > 0 ) /* left */ + { + fx2 = 0; + fy2 = (TPos)FT_UDIV( -prod, -dx ); + prod -= dy * ONE_PIXEL; + ras.cover += ( fy2 - fy1 ); + ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); + fx1 = ONE_PIXEL; + fy1 = fy2; + ex1--; + } + else if ( prod - dx * ONE_PIXEL <= 0 && + prod - dx * ONE_PIXEL + dy * ONE_PIXEL > 0 ) /* up */ + { + prod -= dx * ONE_PIXEL; + fx2 = (TPos)FT_UDIV( -prod, dy ); + fy2 = ONE_PIXEL; + ras.cover += ( fy2 - fy1 ); + ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); + fx1 = fx2; + fy1 = 0; + ey1++; + } + else if ( prod - dx * ONE_PIXEL + dy * ONE_PIXEL <= 0 && + prod + dy * ONE_PIXEL >= 0 ) /* right */ + { + prod += dy * ONE_PIXEL; + fx2 = ONE_PIXEL; + fy2 = (TPos)FT_UDIV( prod, dx ); + ras.cover += ( fy2 - fy1 ); + ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); + fx1 = 0; + fy1 = fy2; + ex1++; + } + else /* ( prod + dy * ONE_PIXEL < 0 && + prod > 0 ) down */ + { + fx2 = (TPos)FT_UDIV( prod, -dy ); + fy2 = 0; + prod += dx * ONE_PIXEL; + ras.cover += ( fy2 - fy1 ); + ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); + fx1 = fx2; + fy1 = ONE_PIXEL; + ey1--; + } + + gray_set_cell( RAS_VAR_ ex1, ey1 ); + } while ( ex1 != ex2 || ey1 != ey2 ); + } + + fx2 = to_x - SUBPIXELS( ex2 ); + fy2 = to_y - SUBPIXELS( ey2 ); + + ras.cover += ( fy2 - fy1 ); + ras.area += ( fy2 - fy1 ) * ( fx1 + fx2 ); + + End: + ras.x = to_x; + ras.y = to_y; + } + +#endif + + static void + gray_split_conic( FT_Vector* base ) + { + TPos a, b; + + + base[4].x = base[2].x; + b = base[1].x; + a = base[3].x = ( base[2].x + b ) / 2; + b = base[1].x = ( base[0].x + b ) / 2; + base[2].x = ( a + b ) / 2; + + base[4].y = base[2].y; + b = base[1].y; + a = base[3].y = ( base[2].y + b ) / 2; + b = base[1].y = ( base[0].y + b ) / 2; + base[2].y = ( a + b ) / 2; + } + + + static void + gray_render_conic( RAS_ARG_ const FT_Vector* control, + const FT_Vector* to ) + { + FT_Vector bez_stack[16 * 2 + 1]; /* enough to accommodate bisections */ + FT_Vector* arc = bez_stack; + TPos dx, dy; + int draw, split; + + + arc[0].x = UPSCALE( to->x ); + arc[0].y = UPSCALE( to->y ); + arc[1].x = UPSCALE( control->x ); + arc[1].y = UPSCALE( control->y ); + arc[2].x = ras.x; + arc[2].y = ras.y; + + /* short-cut the arc that crosses the current band */ + if ( ( TRUNC( arc[0].y ) >= ras.max_ey && + TRUNC( arc[1].y ) >= ras.max_ey && + TRUNC( arc[2].y ) >= ras.max_ey ) || + ( TRUNC( arc[0].y ) < ras.min_ey && + TRUNC( arc[1].y ) < ras.min_ey && + TRUNC( arc[2].y ) < ras.min_ey ) ) + { + ras.x = arc[0].x; + ras.y = arc[0].y; + return; + } + + dx = FT_ABS( arc[2].x + arc[0].x - 2 * arc[1].x ); + dy = FT_ABS( arc[2].y + arc[0].y - 2 * arc[1].y ); + if ( dx < dy ) + dx = dy; + + /* We can calculate the number of necessary bisections because */ + /* each bisection predictably reduces deviation exactly 4-fold. */ + /* Even 32-bit deviation would vanish after 16 bisections. */ + draw = 1; + while ( dx > ONE_PIXEL / 4 ) + { + dx >>= 2; + draw <<= 1; + } + + /* We use decrement counter to count the total number of segments */ + /* to draw starting from 2^level. Before each draw we split as */ + /* many times as there are trailing zeros in the counter. */ + do + { + split = 1; + while ( ( draw & split ) == 0 ) + { + gray_split_conic( arc ); + arc += 2; + split <<= 1; + } + + gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); + arc -= 2; + + } while ( --draw ); + } + + + static void + gray_split_cubic( FT_Vector* base ) + { + TPos a, b, c, d; + + + base[6].x = base[3].x; + c = base[1].x; + d = base[2].x; + base[1].x = a = ( base[0].x + c ) / 2; + base[5].x = b = ( base[3].x + d ) / 2; + c = ( c + d ) / 2; + base[2].x = a = ( a + c ) / 2; + base[4].x = b = ( b + c ) / 2; + base[3].x = ( a + b ) / 2; + + base[6].y = base[3].y; + c = base[1].y; + d = base[2].y; + base[1].y = a = ( base[0].y + c ) / 2; + base[5].y = b = ( base[3].y + d ) / 2; + c = ( c + d ) / 2; + base[2].y = a = ( a + c ) / 2; + base[4].y = b = ( b + c ) / 2; + base[3].y = ( a + b ) / 2; + } + + + static void + gray_render_cubic( RAS_ARG_ const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to ) + { + FT_Vector bez_stack[16 * 3 + 1]; /* enough to accommodate bisections */ + FT_Vector* arc = bez_stack; + TPos dx, dy, dx_, dy_; + TPos dx1, dy1, dx2, dy2; + TPos L, s, s_limit; + + + arc[0].x = UPSCALE( to->x ); + arc[0].y = UPSCALE( to->y ); + arc[1].x = UPSCALE( control2->x ); + arc[1].y = UPSCALE( control2->y ); + arc[2].x = UPSCALE( control1->x ); + arc[2].y = UPSCALE( control1->y ); + arc[3].x = ras.x; + arc[3].y = ras.y; + + /* short-cut the arc that crosses the current band */ + if ( ( TRUNC( arc[0].y ) >= ras.max_ey && + TRUNC( arc[1].y ) >= ras.max_ey && + TRUNC( arc[2].y ) >= ras.max_ey && + TRUNC( arc[3].y ) >= ras.max_ey ) || + ( TRUNC( arc[0].y ) < ras.min_ey && + TRUNC( arc[1].y ) < ras.min_ey && + TRUNC( arc[2].y ) < ras.min_ey && + TRUNC( arc[3].y ) < ras.min_ey ) ) + { + ras.x = arc[0].x; + ras.y = arc[0].y; + return; + } + + for (;;) + { + /* Decide whether to split or draw. See `Rapid Termination */ + /* Evaluation for Recursive Subdivision of Bezier Curves' by Thomas */ + /* F. Hain, at */ + /* http://www.cis.southalabama.edu/~hain/general/Publications/Bezier/Camera-ready%20CISST02%202.pdf */ + + /* dx and dy are x and y components of the P0-P3 chord vector. */ + dx = dx_ = arc[3].x - arc[0].x; + dy = dy_ = arc[3].y - arc[0].y; + + L = FT_HYPOT( dx_, dy_ ); + + /* Avoid possible arithmetic overflow below by splitting. */ + if ( L > 32767 ) + goto Split; + + /* Max deviation may be as much as (s/L) * 3/4 (if Hain's v = 1). */ + s_limit = L * (TPos)( ONE_PIXEL / 6 ); + + /* s is L * the perpendicular distance from P1 to the line P0-P3. */ + dx1 = arc[1].x - arc[0].x; + dy1 = arc[1].y - arc[0].y; + s = FT_ABS( SUB_LONG( MUL_LONG( dy, dx1 ), MUL_LONG( dx, dy1 ) ) ); + + if ( s > s_limit ) + goto Split; + + /* s is L * the perpendicular distance from P2 to the line P0-P3. */ + dx2 = arc[2].x - arc[0].x; + dy2 = arc[2].y - arc[0].y; + s = FT_ABS( SUB_LONG( MUL_LONG( dy, dx2 ), MUL_LONG( dx, dy2 ) ) ); + + if ( s > s_limit ) + goto Split; + + /* Split super curvy segments where the off points are so far + from the chord that the angles P0-P1-P3 or P0-P2-P3 become + acute as detected by appropriate dot products. */ + if ( dx1 * ( dx1 - dx ) + dy1 * ( dy1 - dy ) > 0 || + dx2 * ( dx2 - dx ) + dy2 * ( dy2 - dy ) > 0 ) + goto Split; + + gray_render_line( RAS_VAR_ arc[0].x, arc[0].y ); + + if ( arc == bez_stack ) + return; + + arc -= 3; + continue; + + Split: + gray_split_cubic( arc ); + arc += 3; + } + } + + + static int + gray_move_to( const FT_Vector* to, + gray_PWorker worker ) + { + TPos x, y; + + + /* start to a new position */ + x = UPSCALE( to->x ); + y = UPSCALE( to->y ); + + gray_set_cell( RAS_VAR_ TRUNC( x ), TRUNC( y ) ); + + ras.x = x; + ras.y = y; + return 0; + } + + + static int + gray_line_to( const FT_Vector* to, + gray_PWorker worker ) + { + gray_render_line( RAS_VAR_ UPSCALE( to->x ), UPSCALE( to->y ) ); + return 0; + } + + + static int + gray_conic_to( const FT_Vector* control, + const FT_Vector* to, + gray_PWorker worker ) + { + gray_render_conic( RAS_VAR_ control, to ); + return 0; + } + + + static int + gray_cubic_to( const FT_Vector* control1, + const FT_Vector* control2, + const FT_Vector* to, + gray_PWorker worker ) + { + gray_render_cubic( RAS_VAR_ control1, control2, to ); + return 0; + } + + + static void + gray_hline( RAS_ARG_ TCoord x, + TCoord y, + TArea coverage, + TCoord acount ) + { + /* scale the coverage from 0..(ONE_PIXEL*ONE_PIXEL*2) to 0..256 */ + coverage >>= PIXEL_BITS * 2 + 1 - 8; + if ( coverage < 0 ) + coverage = -coverage - 1; + + /* compute the line's coverage depending on the outline fill rule */ + if ( ras.outline.flags & FT_OUTLINE_EVEN_ODD_FILL ) + { + coverage &= 511; + + if ( coverage >= 256 ) + coverage = 511 - coverage; + } + else + { + /* normal non-zero winding rule */ + if ( coverage >= 256 ) + coverage = 255; + } + + if ( ras.render_span ) /* for FT_RASTER_FLAG_DIRECT only */ + { + FT_Span span; + + + span.x = (short)x; + span.len = (unsigned short)acount; + span.coverage = (unsigned char)coverage; + + ras.render_span( y, 1, &span, ras.render_span_data ); + } + else + { + unsigned char* q = ras.target.origin - ras.target.pitch * y + x; + unsigned char c = (unsigned char)coverage; + + + /* For small-spans it is faster to do it by ourselves than + * calling `memset'. This is mainly due to the cost of the + * function call. + */ + switch ( acount ) + { + case 7: *q++ = c; + case 6: *q++ = c; + case 5: *q++ = c; + case 4: *q++ = c; + case 3: *q++ = c; + case 2: *q++ = c; + case 1: *q = c; + case 0: break; + default: + FT_MEM_SET( q, c, acount ); + } + } + } + + + static void + gray_sweep( RAS_ARG ) + { + int y; + + + for ( y = ras.min_ey; y < ras.max_ey; y++ ) + { + PCell cell = ras.ycells[y - ras.min_ey]; + TCoord x = ras.min_ex; + TArea cover = 0; + TArea area; + + + for ( ; cell != NULL; cell = cell->next ) + { + if ( cover != 0 && cell->x > x ) + gray_hline( RAS_VAR_ x, y, cover, cell->x - x ); + + cover += (TArea)cell->cover * ( ONE_PIXEL * 2 ); + area = cover - cell->area; + + if ( area != 0 && cell->x >= ras.min_ex ) + gray_hline( RAS_VAR_ cell->x, y, area, 1 ); + + x = cell->x + 1; + } + + if ( cover != 0 ) + gray_hline( RAS_VAR_ x, y, cover, ras.max_ex - x ); + } + } + + +#ifdef STANDALONE_ + + /*************************************************************************/ + /* */ + /* The following functions should only compile in stand-alone mode, */ + /* i.e., when building this component without the rest of FreeType. */ + /* */ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_Decompose */ + /* */ + /* */ + /* Walk over an outline's structure to decompose it into individual */ + /* segments and Bézier arcs. This function is also able to emit */ + /* `move to' and `close to' operations to indicate the start and end */ + /* of new contours in the outline. */ + /* */ + /* */ + /* outline :: A pointer to the source target. */ + /* */ + /* func_interface :: A table of `emitters', i.e., function pointers */ + /* called during decomposition to indicate path */ + /* operations. */ + /* */ + /* */ + /* user :: A typeless pointer which is passed to each */ + /* emitter during the decomposition. It can be */ + /* used to store the state during the */ + /* decomposition. */ + /* */ + /* */ + /* Error code. 0 means success. */ + /* */ + static int + FT_Outline_Decompose( const FT_Outline* outline, + const FT_Outline_Funcs* func_interface, + void* user ) + { +#undef SCALED +#define SCALED( x ) ( ( (x) << shift ) - delta ) + + FT_Vector v_last; + FT_Vector v_control; + FT_Vector v_start; + + FT_Vector* point; + FT_Vector* limit; + char* tags; + + int error; + + int n; /* index of contour in outline */ + int first; /* index of first point in contour */ + char tag; /* current point's state */ + + int shift; + TPos delta; + + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + if ( !func_interface ) + return FT_THROW( Invalid_Argument ); + + shift = func_interface->shift; + delta = func_interface->delta; + first = 0; + + for ( n = 0; n < outline->n_contours; n++ ) + { + int last; /* index of last point in contour */ + + + FT_TRACE5(( "FT_Outline_Decompose: Outline %d\n", n )); + + last = outline->contours[n]; + if ( last < 0 ) + goto Invalid_Outline; + limit = outline->points + last; + + v_start = outline->points[first]; + v_start.x = SCALED( v_start.x ); + v_start.y = SCALED( v_start.y ); + + v_last = outline->points[last]; + v_last.x = SCALED( v_last.x ); + v_last.y = SCALED( v_last.y ); + + v_control = v_start; + + point = outline->points + first; + tags = outline->tags + first; + tag = FT_CURVE_TAG( tags[0] ); + + /* A contour cannot start with a cubic control point! */ + if ( tag == FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + /* check first point to determine origin */ + if ( tag == FT_CURVE_TAG_CONIC ) + { + /* first point is conic control. Yes, this happens. */ + if ( FT_CURVE_TAG( outline->tags[last] ) == FT_CURVE_TAG_ON ) + { + /* start at last point if it is on the curve */ + v_start = v_last; + limit--; + } + else + { + /* if both first and last points are conic, */ + /* start at their middle and record its position */ + /* for closure */ + v_start.x = ( v_start.x + v_last.x ) / 2; + v_start.y = ( v_start.y + v_last.y ) / 2; + + v_last = v_start; + } + point--; + tags--; + } + + FT_TRACE5(( " move to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->move_to( &v_start, user ); + if ( error ) + goto Exit; + + while ( point < limit ) + { + point++; + tags++; + + tag = FT_CURVE_TAG( tags[0] ); + switch ( tag ) + { + case FT_CURVE_TAG_ON: /* emit a single line_to */ + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " line to (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0 )); + error = func_interface->line_to( &vec, user ); + if ( error ) + goto Exit; + continue; + } + + case FT_CURVE_TAG_CONIC: /* consume conic arcs */ + v_control.x = SCALED( point->x ); + v_control.y = SCALED( point->y ); + + Do_Conic: + if ( point < limit ) + { + FT_Vector vec; + FT_Vector v_middle; + + + point++; + tags++; + tag = FT_CURVE_TAG( tags[0] ); + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + if ( tag == FT_CURVE_TAG_ON ) + { + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + if ( tag != FT_CURVE_TAG_CONIC ) + goto Invalid_Outline; + + v_middle.x = ( v_control.x + vec.x ) / 2; + v_middle.y = ( v_control.y + vec.y ) / 2; + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_middle.x / 64.0, v_middle.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_middle, user ); + if ( error ) + goto Exit; + + v_control = vec; + goto Do_Conic; + } + + FT_TRACE5(( " conic to (%.2f, %.2f)" + " with control (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + v_control.x / 64.0, v_control.y / 64.0 )); + error = func_interface->conic_to( &v_control, &v_start, user ); + goto Close; + + default: /* FT_CURVE_TAG_CUBIC */ + { + FT_Vector vec1, vec2; + + + if ( point + 1 > limit || + FT_CURVE_TAG( tags[1] ) != FT_CURVE_TAG_CUBIC ) + goto Invalid_Outline; + + point += 2; + tags += 2; + + vec1.x = SCALED( point[-2].x ); + vec1.y = SCALED( point[-2].y ); + + vec2.x = SCALED( point[-1].x ); + vec2.y = SCALED( point[-1].y ); + + if ( point <= limit ) + { + FT_Vector vec; + + + vec.x = SCALED( point->x ); + vec.y = SCALED( point->y ); + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + vec.x / 64.0, vec.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &vec, user ); + if ( error ) + goto Exit; + continue; + } + + FT_TRACE5(( " cubic to (%.2f, %.2f)" + " with controls (%.2f, %.2f) and (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0, + vec1.x / 64.0, vec1.y / 64.0, + vec2.x / 64.0, vec2.y / 64.0 )); + error = func_interface->cubic_to( &vec1, &vec2, &v_start, user ); + goto Close; + } + } + } + + /* close the contour with a line segment */ + FT_TRACE5(( " line to (%.2f, %.2f)\n", + v_start.x / 64.0, v_start.y / 64.0 )); + error = func_interface->line_to( &v_start, user ); + + Close: + if ( error ) + goto Exit; + + first = last + 1; + } + + FT_TRACE5(( "FT_Outline_Decompose: Done\n", n )); + return 0; + + Exit: + FT_TRACE5(( "FT_Outline_Decompose: Error 0x%x\n", error )); + return error; + + Invalid_Outline: + return FT_THROW( Invalid_Outline ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* FT_Outline_Get_CBox */ + /* */ + /* */ + /* Return an outline's `control box'. The control box encloses all */ + /* the outline's points, including Bézier control points. Though it */ + /* coincides with the exact bounding box for most glyphs, it can be */ + /* slightly larger in some situations (like when rotating an outline */ + /* that contains Bézier outside arcs). */ + /* */ + /* Computing the control box is very fast, while getting the bounding */ + /* box can take much more time as it needs to walk over all segments */ + /* and arcs in the outline. To get the latter, you can use the */ + /* `ftbbox' component, which is dedicated to this single task. */ + /* */ + /* */ + /* outline :: A pointer to the source outline descriptor. */ + /* */ + /* */ + /* acbox :: The outline's control box. */ + /* */ + /* */ + /* See @FT_Glyph_Get_CBox for a discussion of tricky fonts. */ + /* */ + + static void + FT_Outline_Get_CBox( const FT_Outline* outline, + FT_BBox *acbox ) + { + TPos xMin, yMin, xMax, yMax; + + + if ( outline && acbox ) + { + if ( outline->n_points == 0 ) + { + xMin = 0; + yMin = 0; + xMax = 0; + yMax = 0; + } + else + { + FT_Vector* vec = outline->points; + FT_Vector* limit = vec + outline->n_points; + + + xMin = xMax = vec->x; + yMin = yMax = vec->y; + vec++; + + for ( ; vec < limit; vec++ ) + { + TPos x, y; + + + x = vec->x; + if ( x < xMin ) xMin = x; + if ( x > xMax ) xMax = x; + + y = vec->y; + if ( y < yMin ) yMin = y; + if ( y > yMax ) yMax = y; + } + } + acbox->xMin = xMin; + acbox->xMax = xMax; + acbox->yMin = yMin; + acbox->yMax = yMax; + } + } + +#endif /* STANDALONE_ */ + + + FT_DEFINE_OUTLINE_FUNCS( + func_interface, + + (FT_Outline_MoveTo_Func) gray_move_to, /* move_to */ + (FT_Outline_LineTo_Func) gray_line_to, /* line_to */ + (FT_Outline_ConicTo_Func)gray_conic_to, /* conic_to */ + (FT_Outline_CubicTo_Func)gray_cubic_to, /* cubic_to */ + + 0, /* shift */ + 0 /* delta */ + ) + + + static int + gray_convert_glyph_inner( RAS_ARG ) + { + + volatile int error = 0; + +#ifdef FT_CONFIG_OPTION_PIC + FT_Outline_Funcs func_interface; + Init_Class_func_interface(&func_interface); +#endif + + if ( ft_setjmp( ras.jump_buffer ) == 0 ) + { + error = FT_Outline_Decompose( &ras.outline, &func_interface, &ras ); + if ( !ras.invalid ) + gray_record_cell( RAS_VAR ); + + FT_TRACE7(( "band [%d..%d]: %d cell%s\n", + ras.min_ey, + ras.max_ey, + ras.num_cells, + ras.num_cells == 1 ? "" : "s" )); + } + else + { + error = FT_THROW( Memory_Overflow ); + + FT_TRACE7(( "band [%d..%d]: to be bisected\n", + ras.min_ey, ras.max_ey )); + } + + return error; + } + + + static int + gray_convert_glyph( RAS_ARG ) + { + const TCoord yMin = ras.min_ey; + const TCoord yMax = ras.max_ey; + const TCoord xMin = ras.min_ex; + const TCoord xMax = ras.max_ex; + + TCell buffer[FT_MAX_GRAY_POOL]; + size_t height = (size_t)( yMax - yMin ); + size_t n = FT_MAX_GRAY_POOL / 8; + TCoord y; + TCoord bands[32]; /* enough to accommodate bisections */ + TCoord* band; + + + /* set up vertical bands */ + if ( height > n ) + { + /* two divisions rounded up */ + n = ( height + n - 1 ) / n; + height = ( height + n - 1 ) / n; + } + + /* memory management */ + n = ( height * sizeof ( PCell ) + sizeof ( TCell ) - 1 ) / sizeof ( TCell ); + + ras.cells = buffer + n; + ras.max_cells = (FT_PtrDist)( FT_MAX_GRAY_POOL - n ); + ras.ycells = (PCell*)buffer; + + for ( y = yMin; y < yMax; ) + { + ras.min_ey = y; + y += height; + ras.max_ey = FT_MIN( y, yMax ); + + band = bands; + band[1] = xMin; + band[0] = xMax; + + do + { + TCoord width = band[0] - band[1]; + int error; + + + FT_MEM_ZERO( ras.ycells, height * sizeof ( PCell ) ); + + ras.num_cells = 0; + ras.invalid = 1; + ras.min_ex = band[1]; + ras.max_ex = band[0]; + + error = gray_convert_glyph_inner( RAS_VAR ); + + if ( !error ) + { + gray_sweep( RAS_VAR ); + band--; + continue; + } + else if ( error != ErrRaster_Memory_Overflow ) + return 1; + + /* render pool overflow; we will reduce the render band by half */ + width >>= 1; + + /* this should never happen even with tiny rendering pool */ + if ( width == 0 ) + { + FT_TRACE7(( "gray_convert_glyph: rotten glyph\n" )); + return 1; + } + + band++; + band[1] = band[0]; + band[0] += width; + } while ( band >= bands ); + } + + return 0; + } + + + static int + gray_raster_render( FT_Raster raster, + const FT_Raster_Params* params ) + { + const FT_Outline* outline = (const FT_Outline*)params->source; + const FT_Bitmap* target_map = params->target; + FT_BBox cbox, clip; + +#ifndef FT_STATIC_RASTER + gray_TWorker worker[1]; +#endif + + + if ( !raster ) + return FT_THROW( Invalid_Argument ); + + /* this version does not support monochrome rendering */ + if ( !( params->flags & FT_RASTER_FLAG_AA ) ) + return FT_THROW( Invalid_Mode ); + + if ( !outline ) + return FT_THROW( Invalid_Outline ); + + /* return immediately if the outline is empty */ + if ( outline->n_points == 0 || outline->n_contours <= 0 ) + return 0; + + if ( !outline->contours || !outline->points ) + return FT_THROW( Invalid_Outline ); + + if ( outline->n_points != + outline->contours[outline->n_contours - 1] + 1 ) + return FT_THROW( Invalid_Outline ); + + ras.outline = *outline; + + if ( params->flags & FT_RASTER_FLAG_DIRECT ) + { + if ( !params->gray_spans ) + return 0; + + ras.render_span = (FT_Raster_Span_Func)params->gray_spans; + ras.render_span_data = params->user; + } + else + { + /* if direct mode is not set, we must have a target bitmap */ + if ( !target_map ) + return FT_THROW( Invalid_Argument ); + + /* nothing to do */ + if ( !target_map->width || !target_map->rows ) + return 0; + + if ( !target_map->buffer ) + return FT_THROW( Invalid_Argument ); + + if ( target_map->pitch < 0 ) + ras.target.origin = target_map->buffer; + else + ras.target.origin = target_map->buffer + + ( target_map->rows - 1 ) * (unsigned int)target_map->pitch; + + ras.target.pitch = target_map->pitch; + + ras.render_span = (FT_Raster_Span_Func)NULL; + ras.render_span_data = NULL; + } + + FT_Outline_Get_CBox( outline, &cbox ); + + /* reject too large outline coordinates */ + if ( cbox.xMin < -0x1000000L || cbox.xMax > 0x1000000L || + cbox.yMin < -0x1000000L || cbox.yMax > 0x1000000L ) + return FT_THROW( Invalid_Outline ); + + /* truncate the bounding box to integer pixels */ + cbox.xMin = cbox.xMin >> 6; + cbox.yMin = cbox.yMin >> 6; + cbox.xMax = ( cbox.xMax + 63 ) >> 6; + cbox.yMax = ( cbox.yMax + 63 ) >> 6; + + /* compute clipping box */ + if ( !( params->flags & FT_RASTER_FLAG_DIRECT ) ) + { + /* compute clip box from target pixmap */ + clip.xMin = 0; + clip.yMin = 0; + clip.xMax = (FT_Pos)target_map->width; + clip.yMax = (FT_Pos)target_map->rows; + } + else if ( params->flags & FT_RASTER_FLAG_CLIP ) + clip = params->clip_box; + else + { + clip.xMin = -32768L; + clip.yMin = -32768L; + clip.xMax = 32767L; + clip.yMax = 32767L; + } + + /* clip to target bitmap, exit if nothing to do */ + ras.min_ex = FT_MAX( cbox.xMin, clip.xMin ); + ras.min_ey = FT_MAX( cbox.yMin, clip.yMin ); + ras.max_ex = FT_MIN( cbox.xMax, clip.xMax ); + ras.max_ey = FT_MIN( cbox.yMax, clip.yMax ); + + if ( ras.max_ex <= ras.min_ex || ras.max_ey <= ras.min_ey ) + return 0; + + return gray_convert_glyph( RAS_VAR ); + } + + + /**** RASTER OBJECT CREATION: In stand-alone mode, we simply use *****/ + /**** a static object. *****/ + +#ifdef STANDALONE_ + + static int + gray_raster_new( void* memory, + FT_Raster* araster ) + { + static gray_TRaster the_raster; + + FT_UNUSED( memory ); + + + *araster = (FT_Raster)&the_raster; + FT_ZERO( &the_raster ); + + return 0; + } + + + static void + gray_raster_done( FT_Raster raster ) + { + /* nothing */ + FT_UNUSED( raster ); + } + +#else /* !STANDALONE_ */ + + static int + gray_raster_new( FT_Memory memory, + FT_Raster* araster ) + { + FT_Error error; + gray_PRaster raster = NULL; + + + *araster = 0; + if ( !FT_ALLOC( raster, sizeof ( gray_TRaster ) ) ) + { + raster->memory = memory; + *araster = (FT_Raster)raster; + } + + return error; + } + + + static void + gray_raster_done( FT_Raster raster ) + { + FT_Memory memory = (FT_Memory)((gray_PRaster)raster)->memory; + + + FT_FREE( raster ); + } + +#endif /* !STANDALONE_ */ + + + static void + gray_raster_reset( FT_Raster raster, + unsigned char* pool_base, + unsigned long pool_size ) + { + FT_UNUSED( raster ); + FT_UNUSED( pool_base ); + FT_UNUSED( pool_size ); + } + + + static int + gray_raster_set_mode( FT_Raster raster, + unsigned long mode, + void* args ) + { + FT_UNUSED( raster ); + FT_UNUSED( mode ); + FT_UNUSED( args ); + + + return 0; /* nothing to do */ + } + + + FT_DEFINE_RASTER_FUNCS( + ft_grays_raster, + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Raster_New_Func) gray_raster_new, /* raster_new */ + (FT_Raster_Reset_Func) gray_raster_reset, /* raster_reset */ + (FT_Raster_Set_Mode_Func)gray_raster_set_mode, /* raster_set_mode */ + (FT_Raster_Render_Func) gray_raster_render, /* raster_render */ + (FT_Raster_Done_Func) gray_raster_done /* raster_done */ + ) + + +/* END */ + + +/* Local Variables: */ +/* coding: utf-8 */ +/* End: */ diff --git a/vendor/FreeType2/src/smooth/ftgrays.h b/vendor/FreeType2/src/smooth/ftgrays.h new file mode 100644 index 0000000..9e11ca6 --- /dev/null +++ b/vendor/FreeType2/src/smooth/ftgrays.h @@ -0,0 +1,58 @@ +/***************************************************************************/ +/* */ +/* ftgrays.h */ +/* */ +/* FreeType smooth renderer declaration */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef FTGRAYS_H_ +#define FTGRAYS_H_ + +#ifdef __cplusplus + extern "C" { +#endif + + +#ifdef STANDALONE_ +#include "ftimage.h" +#else +#include +#include FT_CONFIG_CONFIG_H /* for FT_CONFIG_OPTION_PIC */ +#include FT_IMAGE_H +#endif + + + /*************************************************************************/ + /* */ + /* To make ftgrays.h independent from configuration files we check */ + /* whether FT_EXPORT_VAR has been defined already. */ + /* */ + /* On some systems and compilers (Win32 mostly), an extra keyword is */ + /* necessary to compile the library as a DLL. */ + /* */ +#ifndef FT_EXPORT_VAR +#define FT_EXPORT_VAR( x ) extern x +#endif + + FT_EXPORT_VAR( const FT_Raster_Funcs ) ft_grays_raster; + + +#ifdef __cplusplus + } +#endif + +#endif /* FTGRAYS_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/smooth/ftsmerrs.h b/vendor/FreeType2/src/smooth/ftsmerrs.h new file mode 100644 index 0000000..226dc1b --- /dev/null +++ b/vendor/FreeType2/src/smooth/ftsmerrs.h @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* ftsmerrs.h */ +/* */ +/* smooth renderer error codes (specification only). */ +/* */ +/* Copyright 2001-2018 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 file is used to define the smooth renderer error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef FTSMERRS_H_ +#define FTSMERRS_H_ + +#include FT_MODULE_ERRORS_H + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX Smooth_Err_ +#define FT_ERR_BASE FT_Mod_Err_Smooth + +#include FT_ERRORS_H + +#endif /* FTSMERRS_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/smooth/ftsmooth.c b/vendor/FreeType2/src/smooth/ftsmooth.c new file mode 100644 index 0000000..ef176bd --- /dev/null +++ b/vendor/FreeType2/src/smooth/ftsmooth.c @@ -0,0 +1,464 @@ +/***************************************************************************/ +/* */ +/* ftsmooth.c */ +/* */ +/* Anti-aliasing renderer interface (body). */ +/* */ +/* Copyright 2000-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_OUTLINE_H +#include "ftsmooth.h" +#include "ftgrays.h" +#include "ftspic.h" + +#include "ftsmerrs.h" + + + /* initialize renderer -- init its raster */ + static FT_Error + ft_smooth_init( FT_Renderer render ) + { + render->clazz->raster_class->raster_reset( render->raster, NULL, 0 ); + + return 0; + } + + + /* sets render-specific mode */ + static FT_Error + ft_smooth_set_mode( FT_Renderer render, + FT_ULong mode_tag, + FT_Pointer data ) + { + /* we simply pass it to the raster */ + return render->clazz->raster_class->raster_set_mode( render->raster, + mode_tag, + data ); + } + + /* transform a given glyph image */ + static FT_Error + ft_smooth_transform( FT_Renderer render, + FT_GlyphSlot slot, + const FT_Matrix* matrix, + const FT_Vector* delta ) + { + FT_Error error = FT_Err_Ok; + + + if ( slot->format != render->glyph_format ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + if ( matrix ) + FT_Outline_Transform( &slot->outline, matrix ); + + if ( delta ) + FT_Outline_Translate( &slot->outline, delta->x, delta->y ); + + Exit: + return error; + } + + + /* return the glyph's control box */ + static void + ft_smooth_get_cbox( FT_Renderer render, + FT_GlyphSlot slot, + FT_BBox* cbox ) + { + FT_ZERO( cbox ); + + if ( slot->format == render->glyph_format ) + FT_Outline_Get_CBox( &slot->outline, cbox ); + } + + + /* convert a slot's glyph image into a bitmap */ + static FT_Error + ft_smooth_render_generic( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin, + FT_Render_Mode required_mode ) + { + FT_Error error = FT_Err_Ok; + FT_Outline* outline = &slot->outline; + FT_Bitmap* bitmap = &slot->bitmap; + FT_Memory memory = render->root.memory; + FT_Pos x_shift = 0; + FT_Pos y_shift = 0; + FT_Int hmul = ( mode == FT_RENDER_MODE_LCD ); + FT_Int vmul = ( mode == FT_RENDER_MODE_LCD_V ); + + FT_Raster_Params params; + + + /* check glyph image format */ + if ( slot->format != render->glyph_format ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + /* check mode */ + if ( mode != required_mode ) + { + error = FT_THROW( Cannot_Render_Glyph ); + goto Exit; + } + + /* release old bitmap buffer */ + if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + ft_glyphslot_preset_bitmap( slot, mode, origin ); + + /* allocate new one */ + if ( FT_ALLOC_MULT( bitmap->buffer, bitmap->rows, bitmap->pitch ) ) + goto Exit; + + slot->internal->flags |= FT_GLYPH_OWN_BITMAP; + + x_shift = 64 * -slot->bitmap_left; + y_shift = 64 * -slot->bitmap_top; + if ( bitmap->pixel_mode == FT_PIXEL_MODE_LCD_V ) + y_shift += 64 * (FT_Int)bitmap->rows / 3; + else + y_shift += 64 * (FT_Int)bitmap->rows; + + if ( origin ) + { + x_shift += origin->x; + y_shift += origin->y; + } + + /* translate outline to render it into the bitmap */ + if ( x_shift || y_shift ) + FT_Outline_Translate( outline, x_shift, y_shift ); + + /* set up parameters */ + params.target = bitmap; + params.source = outline; + params.flags = FT_RASTER_FLAG_AA; + +#ifdef FT_CONFIG_OPTION_SUBPIXEL_RENDERING + + /* implode outline if needed */ + { + FT_Vector* points = outline->points; + FT_Vector* points_end = points + outline->n_points; + FT_Vector* vec; + + + if ( hmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->x *= 3; + + if ( vmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->y *= 3; + } + + /* render outline into the bitmap */ + error = render->raster_render( render->raster, ¶ms ); + + /* deflate outline if needed */ + { + FT_Vector* points = outline->points; + FT_Vector* points_end = points + outline->n_points; + FT_Vector* vec; + + + if ( hmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->x /= 3; + + if ( vmul ) + for ( vec = points; vec < points_end; vec++ ) + vec->y /= 3; + } + + if ( error ) + goto Exit; + + /* finally apply filtering */ + if ( hmul || vmul ) + { + FT_Byte* lcd_weights; + FT_Bitmap_LcdFilterFunc lcd_filter_func; + + + /* Per-face LCD filtering takes priority if set up. */ + if ( slot->face && slot->face->internal->lcd_filter_func ) + { + lcd_weights = slot->face->internal->lcd_weights; + lcd_filter_func = slot->face->internal->lcd_filter_func; + } + else + { + lcd_weights = slot->library->lcd_weights; + lcd_filter_func = slot->library->lcd_filter_func; + } + + if ( lcd_filter_func ) + lcd_filter_func( bitmap, mode, lcd_weights ); + } + +#else /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + if ( hmul ) /* lcd */ + { + FT_Byte* line; + FT_Byte* temp = NULL; + FT_UInt i, j; + + unsigned int height = bitmap->rows; + unsigned int width = bitmap->width; + int pitch = bitmap->pitch; + + + /* Render 3 separate monochrome bitmaps, shifting the outline */ + /* by 1/3 pixel. */ + width /= 3; + + bitmap->buffer += width; + + error = render->raster_render( render->raster, ¶ms ); + if ( error ) + goto Exit; + + FT_Outline_Translate( outline, -21, 0 ); + x_shift -= 21; + bitmap->buffer += width; + + error = render->raster_render( render->raster, ¶ms ); + if ( error ) + goto Exit; + + FT_Outline_Translate( outline, 42, 0 ); + x_shift += 42; + bitmap->buffer -= 2 * width; + + error = render->raster_render( render->raster, ¶ms ); + if ( error ) + goto Exit; + + /* XXX: Rearrange the bytes according to FT_PIXEL_MODE_LCD. */ + /* XXX: It is more efficient to render every third byte above. */ + + if ( FT_ALLOC( temp, (FT_ULong)pitch ) ) + goto Exit; + + for ( i = 0; i < height; i++ ) + { + line = bitmap->buffer + i * (FT_ULong)pitch; + for ( j = 0; j < width; j++ ) + { + temp[3 * j ] = line[j]; + temp[3 * j + 1] = line[j + width]; + temp[3 * j + 2] = line[j + width + width]; + } + FT_MEM_COPY( line, temp, pitch ); + } + + FT_FREE( temp ); + } + else if ( vmul ) /* lcd_v */ + { + int pitch = bitmap->pitch; + + + /* Render 3 separate monochrome bitmaps, shifting the outline */ + /* by 1/3 pixel. Triple the pitch to render on each third row. */ + bitmap->pitch *= 3; + bitmap->rows /= 3; + + bitmap->buffer += pitch; + + error = render->raster_render( render->raster, ¶ms ); + if ( error ) + goto Exit; + + FT_Outline_Translate( outline, 0, 21 ); + y_shift += 21; + bitmap->buffer += pitch; + + error = render->raster_render( render->raster, ¶ms ); + if ( error ) + goto Exit; + + FT_Outline_Translate( outline, 0, -42 ); + y_shift -= 42; + bitmap->buffer -= 2 * pitch; + + error = render->raster_render( render->raster, ¶ms ); + if ( error ) + goto Exit; + + bitmap->pitch /= 3; + bitmap->rows *= 3; + } + else /* grayscale */ + error = render->raster_render( render->raster, ¶ms ); + +#endif /* !FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + Exit: + if ( !error ) + { + /* everything is fine; the glyph is now officially a bitmap */ + slot->format = FT_GLYPH_FORMAT_BITMAP; + } + else if ( slot->internal->flags & FT_GLYPH_OWN_BITMAP ) + { + FT_FREE( bitmap->buffer ); + slot->internal->flags &= ~FT_GLYPH_OWN_BITMAP; + } + + if ( x_shift || y_shift ) + FT_Outline_Translate( outline, -x_shift, -y_shift ); + + return error; + } + + + /* convert a slot's glyph image into a bitmap */ + static FT_Error + ft_smooth_render( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + if ( mode == FT_RENDER_MODE_LIGHT ) + mode = FT_RENDER_MODE_NORMAL; + + return ft_smooth_render_generic( render, slot, mode, origin, + FT_RENDER_MODE_NORMAL ); + } + + + /* convert a slot's glyph image into a horizontal LCD bitmap */ + static FT_Error + ft_smooth_render_lcd( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + return ft_smooth_render_generic( render, slot, mode, origin, + FT_RENDER_MODE_LCD ); + } + + + /* convert a slot's glyph image into a vertical LCD bitmap */ + static FT_Error + ft_smooth_render_lcd_v( FT_Renderer render, + FT_GlyphSlot slot, + FT_Render_Mode mode, + const FT_Vector* origin ) + { + return ft_smooth_render_generic( render, slot, mode, origin, + FT_RENDER_MODE_LCD_V ); + } + + + FT_DEFINE_RENDERER( + ft_smooth_renderer_class, + + FT_MODULE_RENDERER, + sizeof ( FT_RendererRec ), + + "smooth", + 0x10000L, + 0x20000L, + + NULL, /* module specific interface */ + + (FT_Module_Constructor)ft_smooth_init, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) NULL, /* get_interface */ + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_smooth_render, /* render_glyph */ + (FT_Renderer_TransformFunc)ft_smooth_transform, /* transform_glyph */ + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, /* get_glyph_cbox */ + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, /* set_mode */ + + (FT_Raster_Funcs*)&FT_GRAYS_RASTER_GET /* raster_class */ + ) + + + FT_DEFINE_RENDERER( + ft_smooth_lcd_renderer_class, + + FT_MODULE_RENDERER, + sizeof ( FT_RendererRec ), + + "smooth-lcd", + 0x10000L, + 0x20000L, + + NULL, /* module specific interface */ + + (FT_Module_Constructor)ft_smooth_init, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) NULL, /* get_interface */ + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_smooth_render_lcd, /* render_glyph */ + (FT_Renderer_TransformFunc)ft_smooth_transform, /* transform_glyph */ + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, /* get_glyph_cbox */ + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, /* set_mode */ + + (FT_Raster_Funcs*)&FT_GRAYS_RASTER_GET /* raster_class */ + ) + + + FT_DEFINE_RENDERER( + ft_smooth_lcdv_renderer_class, + + FT_MODULE_RENDERER, + sizeof ( FT_RendererRec ), + + "smooth-lcdv", + 0x10000L, + 0x20000L, + + NULL, /* module specific interface */ + + (FT_Module_Constructor)ft_smooth_init, /* module_init */ + (FT_Module_Destructor) NULL, /* module_done */ + (FT_Module_Requester) NULL, /* get_interface */ + + FT_GLYPH_FORMAT_OUTLINE, + + (FT_Renderer_RenderFunc) ft_smooth_render_lcd_v, /* render_glyph */ + (FT_Renderer_TransformFunc)ft_smooth_transform, /* transform_glyph */ + (FT_Renderer_GetCBoxFunc) ft_smooth_get_cbox, /* get_glyph_cbox */ + (FT_Renderer_SetModeFunc) ft_smooth_set_mode, /* set_mode */ + + (FT_Raster_Funcs*)&FT_GRAYS_RASTER_GET /* raster_class */ + ) + + +/* END */ diff --git a/vendor/FreeType2/src/smooth/ftsmooth.h b/vendor/FreeType2/src/smooth/ftsmooth.h new file mode 100644 index 0000000..c76ffc5 --- /dev/null +++ b/vendor/FreeType2/src/smooth/ftsmooth.h @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* ftsmooth.h */ +/* */ +/* Anti-aliasing renderer interface (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef FTSMOOTH_H_ +#define FTSMOOTH_H_ + + +#include +#include FT_RENDER_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_RENDERER( ft_smooth_renderer_class ) + + FT_DECLARE_RENDERER( ft_smooth_lcd_renderer_class ) + + FT_DECLARE_RENDERER( ft_smooth_lcdv_renderer_class ) + + +FT_END_HEADER + +#endif /* FTSMOOTH_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/smooth/ftspic.c b/vendor/FreeType2/src/smooth/ftspic.c new file mode 100644 index 0000000..10f04cf --- /dev/null +++ b/vendor/FreeType2/src/smooth/ftspic.c @@ -0,0 +1,118 @@ +/***************************************************************************/ +/* */ +/* ftspic.c */ +/* */ +/* The FreeType position independent code services for smooth module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "ftspic.h" +#include "ftsmerrs.h" + + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from ftgrays.c */ + void + FT_Init_Class_ft_grays_raster( FT_Raster_Funcs* funcs ); + + + void + ft_smooth_renderer_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + + + if ( pic_container->smooth ) + { + SmoothPIC* container = (SmoothPIC*)pic_container->smooth; + + + if ( --container->ref_count ) + return; + + FT_FREE( container ); + pic_container->smooth = NULL; + } + } + + + FT_Error + ft_smooth_renderer_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + SmoothPIC* container = NULL; + FT_Memory memory = library->memory; + + + /* since this function also serve smooth_lcd and smooth_lcdv renderers, + it implements reference counting */ + if ( pic_container->smooth ) + { + ((SmoothPIC*)pic_container->smooth)->ref_count++; + return error; + } + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof ( *container ) ); + pic_container->smooth = container; + + container->ref_count = 1; + + /* initialize pointer table - */ + /* this is how the module usually expects this data */ + FT_Init_Class_ft_grays_raster( &container->ft_grays_raster ); + + return error; + } + + + /* re-route these init and free functions to the above functions */ + FT_Error + ft_smooth_lcd_renderer_class_pic_init( FT_Library library ) + { + return ft_smooth_renderer_class_pic_init( library ); + } + + + void + ft_smooth_lcd_renderer_class_pic_free( FT_Library library ) + { + ft_smooth_renderer_class_pic_free( library ); + } + + + FT_Error + ft_smooth_lcdv_renderer_class_pic_init( FT_Library library ) + { + return ft_smooth_renderer_class_pic_init( library ); + } + + + void + ft_smooth_lcdv_renderer_class_pic_free( FT_Library library ) + { + ft_smooth_renderer_class_pic_free( library ); + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/vendor/FreeType2/src/smooth/ftspic.h b/vendor/FreeType2/src/smooth/ftspic.h new file mode 100644 index 0000000..80fb64c --- /dev/null +++ b/vendor/FreeType2/src/smooth/ftspic.h @@ -0,0 +1,75 @@ +/***************************************************************************/ +/* */ +/* ftspic.h */ +/* */ +/* The FreeType position independent code services for smooth module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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 FTSPIC_H_ +#define FTSPIC_H_ + + +#include FT_INTERNAL_PIC_H + + +FT_BEGIN_HEADER + +#ifndef FT_CONFIG_OPTION_PIC + +#define FT_GRAYS_RASTER_GET ft_grays_raster + +#else /* FT_CONFIG_OPTION_PIC */ + + typedef struct SmoothPIC_ + { + int ref_count; + FT_Raster_Funcs ft_grays_raster; + + } SmoothPIC; + + +#define GET_PIC( lib ) \ + ( (SmoothPIC*)( (lib)->pic_container.smooth ) ) +#define FT_GRAYS_RASTER_GET ( GET_PIC( library )->ft_grays_raster ) + + + /* see ftspic.c for the implementation */ + void + ft_smooth_renderer_class_pic_free( FT_Library library ); + + void + ft_smooth_lcd_renderer_class_pic_free( FT_Library library ); + + void + ft_smooth_lcdv_renderer_class_pic_free( FT_Library library ); + + FT_Error + ft_smooth_renderer_class_pic_init( FT_Library library ); + + FT_Error + ft_smooth_lcd_renderer_class_pic_init( FT_Library library ); + + FT_Error + ft_smooth_lcdv_renderer_class_pic_init( FT_Library library ); + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +FT_END_HEADER + +#endif /* FTSPIC_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/smooth/smooth.c b/vendor/FreeType2/src/smooth/smooth.c new file mode 100644 index 0000000..5249a89 --- /dev/null +++ b/vendor/FreeType2/src/smooth/smooth.c @@ -0,0 +1,27 @@ +/***************************************************************************/ +/* */ +/* smooth.c */ +/* */ +/* FreeType anti-aliasing rasterer module component (body only). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT +#include + +#include "ftgrays.c" +#include "ftsmooth.c" +#include "ftspic.c" + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/truetype.c b/vendor/FreeType2/src/truetype/truetype.c new file mode 100644 index 0000000..4843709 --- /dev/null +++ b/vendor/FreeType2/src/truetype/truetype.c @@ -0,0 +1,32 @@ +/***************************************************************************/ +/* */ +/* truetype.c */ +/* */ +/* FreeType TrueType driver component (body only). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#define FT_MAKE_OPTION_SINGLE_OBJECT +#include + +#include "ttdriver.c" /* driver interface */ +#include "ttgload.c" /* glyph loader */ +#include "ttgxvar.c" /* gx distortable font */ +#include "ttinterp.c" +#include "ttobjs.c" /* object manager */ +#include "ttpic.c" +#include "ttpload.c" /* tables loader */ +#include "ttsubpix.c" + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttdriver.c b/vendor/FreeType2/src/truetype/ttdriver.c new file mode 100644 index 0000000..820cafb --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttdriver.c @@ -0,0 +1,666 @@ +/***************************************************************************/ +/* */ +/* ttdriver.c */ +/* */ +/* TrueType font driver implementation (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_SERVICE_FONT_FORMAT_H + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include FT_MULTIPLE_MASTERS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_METRICS_VARIATIONS_H +#endif + +#include FT_SERVICE_TRUETYPE_ENGINE_H +#include FT_SERVICE_TRUETYPE_GLYF_H +#include FT_SERVICE_PROPERTIES_H +#include FT_DRIVER_H + +#include "ttdriver.h" +#include "ttgload.h" +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + +#include "tterrors.h" + +#include "ttpic.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_ttdriver + + + /* + * PROPERTY SERVICE + * + */ + static FT_Error + tt_property_set( FT_Module module, /* TT_Driver */ + const char* property_name, + const void* value, + FT_Bool value_is_string ) + { + FT_Error error = FT_Err_Ok; + TT_Driver driver = (TT_Driver)module; + +#ifndef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + FT_UNUSED( value_is_string ); +#endif + + + if ( !ft_strcmp( property_name, "interpreter-version" ) ) + { + FT_UInt interpreter_version; + + +#ifdef FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES + if ( value_is_string ) + { + const char* s = (const char*)value; + + + interpreter_version = (FT_UInt)ft_strtol( s, NULL, 10 ); + } + else +#endif + { + FT_UInt* iv = (FT_UInt*)value; + + + interpreter_version = *iv; + } + + if ( interpreter_version == TT_INTERPRETER_VERSION_35 +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + || interpreter_version == TT_INTERPRETER_VERSION_38 +#endif +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + || interpreter_version == TT_INTERPRETER_VERSION_40 +#endif + ) + driver->interpreter_version = interpreter_version; + else + error = FT_ERR( Unimplemented_Feature ); + + return error; + } + + FT_TRACE0(( "tt_property_set: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + + static FT_Error + tt_property_get( FT_Module module, /* TT_Driver */ + const char* property_name, + const void* value ) + { + FT_Error error = FT_Err_Ok; + TT_Driver driver = (TT_Driver)module; + + FT_UInt interpreter_version = driver->interpreter_version; + + + if ( !ft_strcmp( property_name, "interpreter-version" ) ) + { + FT_UInt* val = (FT_UInt*)value; + + + *val = interpreter_version; + + return error; + } + + FT_TRACE0(( "tt_property_get: missing property `%s'\n", + property_name )); + return FT_THROW( Missing_Property ); + } + + + FT_DEFINE_SERVICE_PROPERTIESREC( + tt_service_properties, + + (FT_Properties_SetFunc)tt_property_set, /* set_property */ + (FT_Properties_GetFunc)tt_property_get /* get_property */ + ) + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** F A C E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* tt_get_kerning */ + /* */ + /* */ + /* A driver method used to return the kerning vector between two */ + /* glyphs of the same face. */ + /* */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* left_glyph :: The index of the left glyph in the kern pair. */ + /* */ + /* right_glyph :: The index of the right glyph in the kern pair. */ + /* */ + /* */ + /* kerning :: The kerning vector. This is in font units for */ + /* scalable formats, and in pixels for fixed-sizes */ + /* formats. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Only horizontal layouts (left-to-right & right-to-left) are */ + /* supported by this function. Other layouts, or more sophisticated */ + /* kernings, are out of scope of this method (the basic driver */ + /* interface is meant to be simple). */ + /* */ + /* They can be implemented by format-specific interfaces. */ + /* */ + static FT_Error + tt_get_kerning( FT_Face ttface, /* TT_Face */ + FT_UInt left_glyph, + FT_UInt right_glyph, + FT_Vector* kerning ) + { + TT_Face face = (TT_Face)ttface; + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + + kerning->x = 0; + kerning->y = 0; + + if ( sfnt ) + kerning->x = sfnt->get_kerning( face, left_glyph, right_glyph ); + + return 0; + } + + + static FT_Error + tt_get_advances( FT_Face ttface, + FT_UInt start, + FT_UInt count, + FT_Int32 flags, + FT_Fixed *advances ) + { + FT_UInt nn; + TT_Face face = (TT_Face)ttface; + + + /* XXX: TODO: check for sbits */ + + if ( flags & FT_LOAD_VERTICAL_LAYOUT ) + { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* no fast retrieval for blended MM fonts without VVAR table */ + if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) && + !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) + return FT_THROW( Unimplemented_Feature ); +#endif + + for ( nn = 0; nn < count; nn++ ) + { + FT_Short tsb; + FT_UShort ah; + + + /* since we don't need `tsb', we use zero for `yMax' parameter */ + TT_Get_VMetrics( face, start + nn, 0, &tsb, &ah ); + advances[nn] = ah; + } + } + else + { +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* no fast retrieval for blended MM fonts without HVAR table */ + if ( ( FT_IS_NAMED_INSTANCE( ttface ) || FT_IS_VARIATION( ttface ) ) && + !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) + return FT_THROW( Unimplemented_Feature ); +#endif + + for ( nn = 0; nn < count; nn++ ) + { + FT_Short lsb; + FT_UShort aw; + + + TT_Get_HMetrics( face, start + nn, &lsb, &aw ); + advances[nn] = aw; + } + } + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** S I Z E S ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + static FT_Error + tt_size_select( FT_Size size, + FT_ULong strike_index ) + { + TT_Face ttface = (TT_Face)size->face; + TT_Size ttsize = (TT_Size)size; + FT_Error error = FT_Err_Ok; + + + ttsize->strike_index = strike_index; + + if ( FT_IS_SCALABLE( size->face ) ) + { + /* use the scaled metrics, even when tt_size_reset fails */ + FT_Select_Metrics( size->face, strike_index ); + + tt_size_reset( ttsize, 0 ); /* ignore return value */ + } + else + { + SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; + FT_Size_Metrics* size_metrics = &size->metrics; + + + error = sfnt->load_strike_metrics( ttface, + strike_index, + size_metrics ); + if ( error ) + ttsize->strike_index = 0xFFFFFFFFUL; + } + + return error; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + static FT_Error + tt_size_request( FT_Size size, + FT_Size_Request req ) + { + TT_Size ttsize = (TT_Size)size; + FT_Error error = FT_Err_Ok; + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + if ( FT_HAS_FIXED_SIZES( size->face ) ) + { + TT_Face ttface = (TT_Face)size->face; + SFNT_Service sfnt = (SFNT_Service)ttface->sfnt; + FT_ULong strike_index; + + + error = sfnt->set_sbit_strike( ttface, req, &strike_index ); + + if ( error ) + ttsize->strike_index = 0xFFFFFFFFUL; + else + return tt_size_select( size, strike_index ); + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + FT_Request_Metrics( size->face, req ); + + if ( FT_IS_SCALABLE( size->face ) ) + { + error = tt_size_reset( ttsize, 0 ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + /* for the `MPS' bytecode instruction we need the point size */ + if ( !error ) + { + FT_UInt resolution = + ttsize->metrics->x_ppem > ttsize->metrics->y_ppem + ? req->horiResolution + : req->vertResolution; + + + /* if we don't have a resolution value, assume 72dpi */ + if ( req->type == FT_SIZE_REQUEST_TYPE_SCALES || + !resolution ) + resolution = 72; + + ttsize->point_size = FT_MulDiv( ttsize->ttmetrics.ppem, + 64 * 72, + resolution ); + } +#endif + } + + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_glyph_load */ + /* */ + /* */ + /* A driver method used to load a glyph within a given glyph slot. */ + /* */ + /* */ + /* slot :: A handle to the target slot object where the glyph */ + /* will be loaded. */ + /* */ + /* size :: A handle to the source face size at which the glyph */ + /* must be scaled, loaded, etc. */ + /* */ + /* glyph_index :: The index of the glyph in the font file. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + tt_glyph_load( FT_GlyphSlot ttslot, /* TT_GlyphSlot */ + FT_Size ttsize, /* TT_Size */ + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + TT_GlyphSlot slot = (TT_GlyphSlot)ttslot; + TT_Size size = (TT_Size)ttsize; + FT_Face face = ttslot->face; + FT_Error error; + + + if ( !slot ) + return FT_THROW( Invalid_Slot_Handle ); + + if ( !size ) + return FT_THROW( Invalid_Size_Handle ); + + if ( !face ) + return FT_THROW( Invalid_Face_Handle ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( glyph_index >= (FT_UInt)face->num_glyphs && + !face->internal->incremental_interface ) +#else + if ( glyph_index >= (FT_UInt)face->num_glyphs ) +#endif + return FT_THROW( Invalid_Argument ); + + if ( load_flags & FT_LOAD_NO_HINTING ) + { + /* both FT_LOAD_NO_HINTING and FT_LOAD_NO_AUTOHINT */ + /* are necessary to disable hinting for tricky fonts */ + + if ( FT_IS_TRICKY( face ) ) + load_flags &= ~FT_LOAD_NO_HINTING; + + if ( load_flags & FT_LOAD_NO_AUTOHINT ) + load_flags |= FT_LOAD_NO_HINTING; + } + + if ( load_flags & ( FT_LOAD_NO_RECURSE | FT_LOAD_NO_SCALE ) ) + { + load_flags |= FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE; + + if ( !FT_IS_TRICKY( face ) ) + load_flags |= FT_LOAD_NO_HINTING; + } + + /* use hinted metrics only if we load a glyph with hinting */ + size->metrics = ( load_flags & FT_LOAD_NO_HINTING ) + ? &ttsize->metrics + : &size->hinted_metrics; + + /* now load the glyph outline if necessary */ + error = TT_Load_Glyph( size, slot, glyph_index, load_flags ); + + /* force drop-out mode to 2 - irrelevant now */ + /* slot->outline.dropout_mode = 2; */ + + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** ****/ + /**** D R I V E R I N T E R F A C E ****/ + /**** ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + /*************************************************************************/ + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + FT_DEFINE_SERVICE_MULTIMASTERSREC( + tt_service_gx_multi_masters, + + (FT_Get_MM_Func) NULL, /* get_mm */ + (FT_Set_MM_Design_Func) NULL, /* set_mm_design */ + (FT_Set_MM_Blend_Func) TT_Set_MM_Blend, /* set_mm_blend */ + (FT_Get_MM_Blend_Func) TT_Get_MM_Blend, /* get_mm_blend */ + (FT_Get_MM_Var_Func) TT_Get_MM_Var, /* get_mm_var */ + (FT_Set_Var_Design_Func)TT_Set_Var_Design, /* set_var_design */ + (FT_Get_Var_Design_Func)TT_Get_Var_Design, /* get_var_design */ + (FT_Set_Instance_Func) TT_Set_Named_Instance, /* set_instance */ + + (FT_Get_Var_Blend_Func) tt_get_var_blend, /* get_var_blend */ + (FT_Done_Blend_Func) tt_done_blend /* done_blend */ + ) + + FT_DEFINE_SERVICE_METRICSVARIATIONSREC( + tt_service_metrics_variations, + + (FT_HAdvance_Adjust_Func)tt_hadvance_adjust, /* hadvance_adjust */ + (FT_LSB_Adjust_Func) NULL, /* lsb_adjust */ + (FT_RSB_Adjust_Func) NULL, /* rsb_adjust */ + + (FT_VAdvance_Adjust_Func)tt_vadvance_adjust, /* vadvance_adjust */ + (FT_TSB_Adjust_Func) NULL, /* tsb_adjust */ + (FT_BSB_Adjust_Func) NULL, /* bsb_adjust */ + (FT_VOrg_Adjust_Func) NULL, /* vorg_adjust */ + + (FT_Metrics_Adjust_Func) tt_apply_mvar /* metrics_adjust */ + ) + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + + static const FT_Service_TrueTypeEngineRec tt_service_truetype_engine = + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_TRUETYPE_ENGINE_TYPE_PATENTED + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_TRUETYPE_ENGINE_TYPE_NONE + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + }; + + + FT_DEFINE_SERVICE_TTGLYFREC( + tt_service_truetype_glyf, + + (TT_Glyf_GetLocationFunc)tt_face_get_location /* get_location */ + ) + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_DEFINE_SERVICEDESCREC6( + tt_services, + + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TRUETYPE, + FT_SERVICE_ID_MULTI_MASTERS, &TT_SERVICE_GX_MULTI_MASTERS_GET, + FT_SERVICE_ID_METRICS_VARIATIONS, &TT_SERVICE_METRICS_VARIATIONS_GET, + FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, + FT_SERVICE_ID_TT_GLYF, &TT_SERVICE_TRUETYPE_GLYF_GET, + FT_SERVICE_ID_PROPERTIES, &TT_SERVICE_PROPERTIES_GET ) +#else + FT_DEFINE_SERVICEDESCREC4( + tt_services, + + FT_SERVICE_ID_FONT_FORMAT, FT_FONT_FORMAT_TRUETYPE, + FT_SERVICE_ID_TRUETYPE_ENGINE, &tt_service_truetype_engine, + FT_SERVICE_ID_TT_GLYF, &TT_SERVICE_TRUETYPE_GLYF_GET, + FT_SERVICE_ID_PROPERTIES, &TT_SERVICE_PROPERTIES_GET ) +#endif + + + FT_CALLBACK_DEF( FT_Module_Interface ) + tt_get_interface( FT_Module driver, /* TT_Driver */ + const char* tt_interface ) + { + FT_Library library; + FT_Module_Interface result; + FT_Module sfntd; + SFNT_Service sfnt; + + + /* TT_SERVICES_GET dereferences `library' in PIC mode */ +#ifdef FT_CONFIG_OPTION_PIC + if ( !driver ) + return NULL; + library = driver->library; + if ( !library ) + return NULL; +#endif + + result = ft_service_list_lookup( TT_SERVICES_GET, tt_interface ); + if ( result ) + return result; + +#ifndef FT_CONFIG_OPTION_PIC + if ( !driver ) + return NULL; + library = driver->library; + if ( !library ) + return NULL; +#endif + + /* only return the default interface from the SFNT module */ + sfntd = FT_Get_Module( library, "sfnt" ); + if ( sfntd ) + { + sfnt = (SFNT_Service)( sfntd->clazz->module_interface ); + if ( sfnt ) + return sfnt->get_interface( driver, tt_interface ); + } + + return 0; + } + + + /* The FT_DriverInterface structure is defined in ftdriver.h. */ + +#ifdef TT_USE_BYTECODE_INTERPRETER +#define TT_HINTER_FLAG FT_MODULE_DRIVER_HAS_HINTER +#else +#define TT_HINTER_FLAG 0 +#endif + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS +#define TT_SIZE_SELECT tt_size_select +#else +#define TT_SIZE_SELECT 0 +#endif + + FT_DEFINE_DRIVER( + tt_driver_class, + + FT_MODULE_FONT_DRIVER | + FT_MODULE_DRIVER_SCALABLE | + TT_HINTER_FLAG, + + sizeof ( TT_DriverRec ), + + "truetype", /* driver name */ + 0x10000L, /* driver version == 1.0 */ + 0x20000L, /* driver requires FreeType 2.0 or above */ + + NULL, /* module-specific interface */ + + tt_driver_init, /* FT_Module_Constructor module_init */ + tt_driver_done, /* FT_Module_Destructor module_done */ + tt_get_interface, /* FT_Module_Requester get_interface */ + + sizeof ( TT_FaceRec ), + sizeof ( TT_SizeRec ), + sizeof ( FT_GlyphSlotRec ), + + tt_face_init, /* FT_Face_InitFunc init_face */ + tt_face_done, /* FT_Face_DoneFunc done_face */ + tt_size_init, /* FT_Size_InitFunc init_size */ + tt_size_done, /* FT_Size_DoneFunc done_size */ + tt_slot_init, /* FT_Slot_InitFunc init_slot */ + NULL, /* FT_Slot_DoneFunc done_slot */ + + tt_glyph_load, /* FT_Slot_LoadFunc load_glyph */ + + tt_get_kerning, /* FT_Face_GetKerningFunc get_kerning */ + NULL, /* FT_Face_AttachFunc attach_file */ + tt_get_advances, /* FT_Face_GetAdvancesFunc get_advances */ + + tt_size_request, /* FT_Size_RequestFunc request_size */ + TT_SIZE_SELECT /* FT_Size_SelectFunc select_size */ + ) + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttdriver.h b/vendor/FreeType2/src/truetype/ttdriver.h new file mode 100644 index 0000000..707aa68 --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttdriver.h @@ -0,0 +1,38 @@ +/***************************************************************************/ +/* */ +/* ttdriver.h */ +/* */ +/* High-level TrueType driver interface (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTDRIVER_H_ +#define TTDRIVER_H_ + + +#include +#include FT_INTERNAL_DRIVER_H + + +FT_BEGIN_HEADER + + + FT_DECLARE_DRIVER( tt_driver_class ) + + +FT_END_HEADER + +#endif /* TTDRIVER_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/tterrors.h b/vendor/FreeType2/src/truetype/tterrors.h new file mode 100644 index 0000000..88bca3a --- /dev/null +++ b/vendor/FreeType2/src/truetype/tterrors.h @@ -0,0 +1,42 @@ +/***************************************************************************/ +/* */ +/* tterrors.h */ +/* */ +/* TrueType error codes (specification only). */ +/* */ +/* Copyright 2001-2018 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 file is used to define the TrueType error enumeration */ + /* constants. */ + /* */ + /*************************************************************************/ + +#ifndef TTERRORS_H_ +#define TTERRORS_H_ + +#include FT_MODULE_ERRORS_H + +#undef FTERRORS_H_ + +#undef FT_ERR_PREFIX +#define FT_ERR_PREFIX TT_Err_ +#define FT_ERR_BASE FT_Mod_Err_TrueType + +#include FT_ERRORS_H + +#endif /* TTERRORS_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttgload.c b/vendor/FreeType2/src/truetype/ttgload.c new file mode 100644 index 0000000..39d9c3f --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttgload.c @@ -0,0 +1,2906 @@ +/***************************************************************************/ +/* */ +/* ttgload.c */ +/* */ +/* TrueType Glyph Loader (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_TRUETYPE_TAGS_H +#include FT_OUTLINE_H +#include FT_DRIVER_H +#include FT_LIST_H + +#include "ttgload.h" +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + +#include "tterrors.h" +#include "ttsubpix.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_ttgload + + + /*************************************************************************/ + /* */ + /* Composite glyph flags. */ + /* */ +#define ARGS_ARE_WORDS 0x0001 +#define ARGS_ARE_XY_VALUES 0x0002 +#define ROUND_XY_TO_GRID 0x0004 +#define WE_HAVE_A_SCALE 0x0008 +/* reserved 0x0010 */ +#define MORE_COMPONENTS 0x0020 +#define WE_HAVE_AN_XY_SCALE 0x0040 +#define WE_HAVE_A_2X2 0x0080 +#define WE_HAVE_INSTR 0x0100 +#define USE_MY_METRICS 0x0200 +#define OVERLAP_COMPOUND 0x0400 +#define SCALED_COMPONENT_OFFSET 0x0800 +#define UNSCALED_COMPONENT_OFFSET 0x1000 + + + /*************************************************************************/ + /* */ + /* Return the horizontal metrics in font units for a given glyph. */ + /* */ + FT_LOCAL_DEF( void ) + TT_Get_HMetrics( TT_Face face, + FT_UInt idx, + FT_Short* lsb, + FT_UShort* aw ) + { + ( (SFNT_Service)face->sfnt )->get_metrics( face, 0, idx, lsb, aw ); + + FT_TRACE5(( " advance width (font units): %d\n", *aw )); + FT_TRACE5(( " left side bearing (font units): %d\n", *lsb )); + } + + + /*************************************************************************/ + /* */ + /* Return the vertical metrics in font units for a given glyph. */ + /* See function `tt_loader_set_pp' below for explanations. */ + /* */ + FT_LOCAL_DEF( void ) + TT_Get_VMetrics( TT_Face face, + FT_UInt idx, + FT_Pos yMax, + FT_Short* tsb, + FT_UShort* ah ) + { + if ( face->vertical_info ) + ( (SFNT_Service)face->sfnt )->get_metrics( face, 1, idx, tsb, ah ); + + else if ( face->os2.version != 0xFFFFU ) + { + *tsb = (FT_Short)( face->os2.sTypoAscender - yMax ); + *ah = (FT_UShort)FT_ABS( face->os2.sTypoAscender - + face->os2.sTypoDescender ); + } + + else + { + *tsb = (FT_Short)( face->horizontal.Ascender - yMax ); + *ah = (FT_UShort)FT_ABS( face->horizontal.Ascender - + face->horizontal.Descender ); + } + + FT_TRACE5(( " advance height (font units): %d\n", *ah )); + FT_TRACE5(( " top side bearing (font units): %d\n", *tsb )); + } + + + static FT_Error + tt_get_metrics( TT_Loader loader, + FT_UInt glyph_index ) + { + TT_Face face = loader->face; +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); +#endif + + FT_Error error; + FT_Stream stream = loader->stream; + + FT_Short left_bearing = 0, top_bearing = 0; + FT_UShort advance_width = 0, advance_height = 0; + + /* we must preserve the stream position */ + /* (which gets altered by the metrics functions) */ + FT_ULong pos = FT_STREAM_POS(); + + + TT_Get_HMetrics( face, glyph_index, + &left_bearing, + &advance_width ); + TT_Get_VMetrics( face, glyph_index, + loader->bbox.yMax, + &top_bearing, + &advance_height ); + + if ( FT_STREAM_SEEK( pos ) ) + return error; + + loader->left_bearing = left_bearing; + loader->advance = advance_width; + loader->top_bearing = top_bearing; + loader->vadvance = advance_height; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 && + loader->exec ) + { + loader->exec->sph_tweak_flags = 0; + + /* This may not be the right place for this, but it works... */ + /* Note that we have to unconditionally load the tweaks since */ + /* it is possible that glyphs individually switch ClearType's */ + /* backward compatibility mode on and off. */ + sph_set_tweaks( loader, glyph_index ); + } +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + if ( !loader->linear_def ) + { + loader->linear_def = 1; + loader->linear = advance_width; + } + + return FT_Err_Ok; + } + + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + static void + tt_get_metrics_incr_overrides( TT_Loader loader, + FT_UInt glyph_index ) + { + TT_Face face = loader->face; + + FT_Short left_bearing = 0, top_bearing = 0; + FT_UShort advance_width = 0, advance_height = 0; + + + /* If this is an incrementally loaded font check whether there are */ + /* overriding metrics for this glyph. */ + if ( face->root.internal->incremental_interface && + face->root.internal->incremental_interface->funcs->get_glyph_metrics ) + { + FT_Incremental_MetricsRec incr_metrics; + FT_Error error; + + + incr_metrics.bearing_x = loader->left_bearing; + incr_metrics.bearing_y = 0; + incr_metrics.advance = loader->advance; + incr_metrics.advance_v = 0; + + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, FALSE, &incr_metrics ); + if ( error ) + goto Exit; + + left_bearing = (FT_Short)incr_metrics.bearing_x; + advance_width = (FT_UShort)incr_metrics.advance; + +#if 0 + + /* GWW: Do I do the same for vertical metrics? */ + incr_metrics.bearing_x = 0; + incr_metrics.bearing_y = loader->top_bearing; + incr_metrics.advance = loader->vadvance; + + error = face->root.internal->incremental_interface->funcs->get_glyph_metrics( + face->root.internal->incremental_interface->object, + glyph_index, TRUE, &incr_metrics ); + if ( error ) + goto Exit; + + top_bearing = (FT_Short)incr_metrics.bearing_y; + advance_height = (FT_UShort)incr_metrics.advance; + +#endif /* 0 */ + + loader->left_bearing = left_bearing; + loader->advance = advance_width; + loader->top_bearing = top_bearing; + loader->vadvance = advance_height; + + if ( !loader->linear_def ) + { + loader->linear_def = 1; + loader->linear = advance_width; + } + } + + Exit: + return; + } + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + + /*************************************************************************/ + /* */ + /* The following functions are used by default with TrueType fonts. */ + /* However, they can be replaced by alternatives if we need to support */ + /* TrueType-compressed formats (like MicroType) in the future. */ + /* */ + /*************************************************************************/ + + FT_CALLBACK_DEF( FT_Error ) + TT_Access_Glyph_Frame( TT_Loader loader, + FT_UInt glyph_index, + FT_ULong offset, + FT_UInt byte_count ) + { + FT_Error error; + FT_Stream stream = loader->stream; + + /* for non-debug mode */ + FT_UNUSED( glyph_index ); + + + FT_TRACE4(( "Glyph %ld\n", glyph_index )); + + /* the following line sets the `error' variable through macros! */ + if ( FT_STREAM_SEEK( offset ) || FT_FRAME_ENTER( byte_count ) ) + return error; + + loader->cursor = stream->cursor; + loader->limit = stream->limit; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( void ) + TT_Forget_Glyph_Frame( TT_Loader loader ) + { + FT_Stream stream = loader->stream; + + + FT_FRAME_EXIT(); + } + + + FT_CALLBACK_DEF( FT_Error ) + TT_Load_Glyph_Header( TT_Loader loader ) + { + FT_Byte* p = loader->cursor; + FT_Byte* limit = loader->limit; + + + if ( p + 10 > limit ) + return FT_THROW( Invalid_Outline ); + + loader->n_contours = FT_NEXT_SHORT( p ); + + loader->bbox.xMin = FT_NEXT_SHORT( p ); + loader->bbox.yMin = FT_NEXT_SHORT( p ); + loader->bbox.xMax = FT_NEXT_SHORT( p ); + loader->bbox.yMax = FT_NEXT_SHORT( p ); + + FT_TRACE5(( " # of contours: %d\n", loader->n_contours )); + FT_TRACE5(( " xMin: %4d xMax: %4d\n", loader->bbox.xMin, + loader->bbox.xMax )); + FT_TRACE5(( " yMin: %4d yMax: %4d\n", loader->bbox.yMin, + loader->bbox.yMax )); + loader->cursor = p; + + return FT_Err_Ok; + } + + + FT_CALLBACK_DEF( FT_Error ) + TT_Load_Simple_Glyph( TT_Loader load ) + { + FT_Error error; + FT_Byte* p = load->cursor; + FT_Byte* limit = load->limit; + FT_GlyphLoader gloader = load->gloader; + FT_Int n_contours = load->n_contours; + FT_Outline* outline; + FT_UShort n_ins; + FT_Int n_points; + + FT_Byte *flag, *flag_limit; + FT_Byte c, count; + FT_Vector *vec, *vec_limit; + FT_Pos x; + FT_Short *cont, *cont_limit, prev_cont; + FT_Int xy_size = 0; + + + /* check that we can add the contours to the glyph */ + error = FT_GLYPHLOADER_CHECK_POINTS( gloader, 0, n_contours ); + if ( error ) + goto Fail; + + /* reading the contours' endpoints & number of points */ + cont = gloader->current.outline.contours; + cont_limit = cont + n_contours; + + /* check space for contours array + instructions count */ + if ( n_contours >= 0xFFF || p + ( n_contours + 1 ) * 2 > limit ) + goto Invalid_Outline; + + prev_cont = FT_NEXT_SHORT( p ); + + if ( n_contours > 0 ) + cont[0] = prev_cont; + + if ( prev_cont < 0 ) + goto Invalid_Outline; + + for ( cont++; cont < cont_limit; cont++ ) + { + cont[0] = FT_NEXT_SHORT( p ); + if ( cont[0] <= prev_cont ) + { + /* unordered contours: this is invalid */ + goto Invalid_Outline; + } + prev_cont = cont[0]; + } + + n_points = 0; + if ( n_contours > 0 ) + { + n_points = cont[-1] + 1; + if ( n_points < 0 ) + goto Invalid_Outline; + } + + /* note that we will add four phantom points later */ + error = FT_GLYPHLOADER_CHECK_POINTS( gloader, n_points + 4, 0 ); + if ( error ) + goto Fail; + + /* reading the bytecode instructions */ + load->glyph->control_len = 0; + load->glyph->control_data = NULL; + + if ( p + 2 > limit ) + goto Invalid_Outline; + + n_ins = FT_NEXT_USHORT( p ); + + FT_TRACE5(( " Instructions size: %u\n", n_ins )); + +#ifdef TT_USE_BYTECODE_INTERPRETER + + if ( IS_HINTED( load->load_flags ) ) + { + FT_ULong tmp; + + + /* check instructions size */ + if ( ( limit - p ) < n_ins ) + { + FT_TRACE1(( "TT_Load_Simple_Glyph: instruction count mismatch\n" )); + error = FT_THROW( Too_Many_Hints ); + goto Fail; + } + + /* we don't trust `maxSizeOfInstructions' in the `maxp' table */ + /* and thus update the bytecode array size by ourselves */ + + tmp = load->exec->glyphSize; + error = Update_Max( load->exec->memory, + &tmp, + sizeof ( FT_Byte ), + (void*)&load->exec->glyphIns, + n_ins ); + + load->exec->glyphSize = (FT_UShort)tmp; + if ( error ) + return error; + + load->glyph->control_len = n_ins; + load->glyph->control_data = load->exec->glyphIns; + + if ( n_ins ) + FT_MEM_COPY( load->exec->glyphIns, p, (FT_Long)n_ins ); + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + p += n_ins; + + outline = &gloader->current.outline; + + /* reading the point tags */ + flag = (FT_Byte*)outline->tags; + flag_limit = flag + n_points; + + FT_ASSERT( flag ); + + while ( flag < flag_limit ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + *flag++ = c = FT_NEXT_BYTE( p ); + if ( c & 8 ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + count = FT_NEXT_BYTE( p ); + if ( flag + (FT_Int)count > flag_limit ) + goto Invalid_Outline; + + for ( ; count > 0; count-- ) + *flag++ = c; + } + } + + /* reading the X coordinates */ + + vec = outline->points; + vec_limit = vec + n_points; + flag = (FT_Byte*)outline->tags; + x = 0; + + if ( p + xy_size > limit ) + goto Invalid_Outline; + + for ( ; vec < vec_limit; vec++, flag++ ) + { + FT_Pos y = 0; + FT_Byte f = *flag; + + + if ( f & 2 ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_BYTE( p ); + if ( ( f & 16 ) == 0 ) + y = -y; + } + else if ( ( f & 16 ) == 0 ) + { + if ( p + 2 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_SHORT( p ); + } + + x += y; + vec->x = x; + /* the cast is for stupid compilers */ + *flag = (FT_Byte)( f & ~( 2 | 16 ) ); + } + + /* reading the Y coordinates */ + + vec = gloader->current.outline.points; + vec_limit = vec + n_points; + flag = (FT_Byte*)outline->tags; + x = 0; + + for ( ; vec < vec_limit; vec++, flag++ ) + { + FT_Pos y = 0; + FT_Byte f = *flag; + + + if ( f & 4 ) + { + if ( p + 1 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_BYTE( p ); + if ( ( f & 32 ) == 0 ) + y = -y; + } + else if ( ( f & 32 ) == 0 ) + { + if ( p + 2 > limit ) + goto Invalid_Outline; + + y = (FT_Pos)FT_NEXT_SHORT( p ); + } + + x += y; + vec->y = x; + /* the cast is for stupid compilers */ + *flag = (FT_Byte)( f & FT_CURVE_TAG_ON ); + } + + outline->n_points = (FT_Short)n_points; + outline->n_contours = (FT_Short)n_contours; + + load->cursor = p; + + Fail: + return error; + + Invalid_Outline: + error = FT_THROW( Invalid_Outline ); + goto Fail; + } + + + FT_CALLBACK_DEF( FT_Error ) + TT_Load_Composite_Glyph( TT_Loader loader ) + { + FT_Error error; + FT_Byte* p = loader->cursor; + FT_Byte* limit = loader->limit; + FT_GlyphLoader gloader = loader->gloader; + FT_SubGlyph subglyph; + FT_UInt num_subglyphs; + + + num_subglyphs = 0; + + do + { + FT_Fixed xx, xy, yy, yx; + FT_UInt count; + + + /* check that we can load a new subglyph */ + error = FT_GlyphLoader_CheckSubGlyphs( gloader, num_subglyphs + 1 ); + if ( error ) + goto Fail; + + /* check space */ + if ( p + 4 > limit ) + goto Invalid_Composite; + + subglyph = gloader->current.subglyphs + num_subglyphs; + + subglyph->arg1 = subglyph->arg2 = 0; + + subglyph->flags = FT_NEXT_USHORT( p ); + subglyph->index = FT_NEXT_USHORT( p ); + + /* check space */ + count = 2; + if ( subglyph->flags & ARGS_ARE_WORDS ) + count += 2; + if ( subglyph->flags & WE_HAVE_A_SCALE ) + count += 2; + else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) + count += 4; + else if ( subglyph->flags & WE_HAVE_A_2X2 ) + count += 8; + + if ( p + count > limit ) + goto Invalid_Composite; + + /* read arguments */ + if ( subglyph->flags & ARGS_ARE_XY_VALUES ) + { + if ( subglyph->flags & ARGS_ARE_WORDS ) + { + subglyph->arg1 = FT_NEXT_SHORT( p ); + subglyph->arg2 = FT_NEXT_SHORT( p ); + } + else + { + subglyph->arg1 = FT_NEXT_CHAR( p ); + subglyph->arg2 = FT_NEXT_CHAR( p ); + } + } + else + { + if ( subglyph->flags & ARGS_ARE_WORDS ) + { + subglyph->arg1 = (FT_Int)FT_NEXT_USHORT( p ); + subglyph->arg2 = (FT_Int)FT_NEXT_USHORT( p ); + } + else + { + subglyph->arg1 = (FT_Int)FT_NEXT_BYTE( p ); + subglyph->arg2 = (FT_Int)FT_NEXT_BYTE( p ); + } + } + + /* read transform */ + xx = yy = 0x10000L; + xy = yx = 0; + + if ( subglyph->flags & WE_HAVE_A_SCALE ) + { + xx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; + yy = xx; + } + else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) + { + xx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; + yy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; + } + else if ( subglyph->flags & WE_HAVE_A_2X2 ) + { + xx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; + yx = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; + xy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; + yy = (FT_Fixed)FT_NEXT_SHORT( p ) * 4; + } + + subglyph->transform.xx = xx; + subglyph->transform.xy = xy; + subglyph->transform.yx = yx; + subglyph->transform.yy = yy; + + num_subglyphs++; + + } while ( subglyph->flags & MORE_COMPONENTS ); + + gloader->current.num_subglyphs = num_subglyphs; + FT_TRACE5(( " %d component%s\n", + num_subglyphs, + num_subglyphs > 1 ? "s" : "" )); + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_UInt i; + + + subglyph = gloader->current.subglyphs; + + for ( i = 0; i < num_subglyphs; i++ ) + { + if ( num_subglyphs > 1 ) + FT_TRACE7(( " subglyph %d:\n", i )); + + FT_TRACE7(( " glyph index: %d\n", subglyph->index )); + + if ( subglyph->flags & ARGS_ARE_XY_VALUES ) + FT_TRACE7(( " offset: x=%d, y=%d\n", + subglyph->arg1, + subglyph->arg2 )); + else + FT_TRACE7(( " matching points: base=%d, component=%d\n", + subglyph->arg1, + subglyph->arg2 )); + + if ( subglyph->flags & WE_HAVE_A_SCALE ) + FT_TRACE7(( " scaling: %f\n", + subglyph->transform.xx / 65536.0 )); + else if ( subglyph->flags & WE_HAVE_AN_XY_SCALE ) + FT_TRACE7(( " scaling: x=%f, y=%f\n", + subglyph->transform.xx / 65536.0, + subglyph->transform.yy / 65536.0 )); + else if ( subglyph->flags & WE_HAVE_A_2X2 ) + FT_TRACE7(( " scaling: xx=%f, yx=%f\n" + " xy=%f, yy=%f\n", + subglyph->transform.xx / 65536.0, + subglyph->transform.yx / 65536.0, + subglyph->transform.xy / 65536.0, + subglyph->transform.yy / 65536.0 )); + + subglyph++; + } + } +#endif /* FT_DEBUG_LEVEL_TRACE */ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + { + FT_Stream stream = loader->stream; + + + /* we must undo the FT_FRAME_ENTER in order to point */ + /* to the composite instructions, if we find some. */ + /* We will process them later. */ + /* */ + loader->ins_pos = (FT_ULong)( FT_STREAM_POS() + + p - limit ); + } + +#endif + + loader->cursor = p; + + Fail: + return error; + + Invalid_Composite: + error = FT_THROW( Invalid_Composite ); + goto Fail; + } + + + FT_LOCAL_DEF( void ) + TT_Init_Glyph_Loading( TT_Face face ) + { + face->access_glyph_frame = TT_Access_Glyph_Frame; + face->read_glyph_header = TT_Load_Glyph_Header; + face->read_simple_glyph = TT_Load_Simple_Glyph; + face->read_composite_glyph = TT_Load_Composite_Glyph; + face->forget_glyph_frame = TT_Forget_Glyph_Frame; + } + + + static void + tt_prepare_zone( TT_GlyphZone zone, + FT_GlyphLoad load, + FT_UInt start_point, + FT_UInt start_contour ) + { + zone->n_points = (FT_UShort)load->outline.n_points - + (FT_UShort)start_point; + zone->n_contours = load->outline.n_contours - + (FT_Short)start_contour; + zone->org = load->extra_points + start_point; + zone->cur = load->outline.points + start_point; + zone->orus = load->extra_points2 + start_point; + zone->tags = (FT_Byte*)load->outline.tags + start_point; + zone->contours = (FT_UShort*)load->outline.contours + start_contour; + zone->first_point = (FT_UShort)start_point; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Hint_Glyph */ + /* */ + /* */ + /* Hint the glyph using the zone prepared by the caller. Note that */ + /* the zone is supposed to include four phantom points. */ + /* */ + static FT_Error + TT_Hint_Glyph( TT_Loader loader, + FT_Bool is_composite ) + { +#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \ + defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + TT_Face face = loader->face; + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); +#endif + + TT_GlyphZone zone = &loader->zone; + +#ifdef TT_USE_BYTECODE_INTERPRETER + FT_Long n_ins; +#else + FT_UNUSED( is_composite ); +#endif + + +#ifdef TT_USE_BYTECODE_INTERPRETER + if ( loader->glyph->control_len > 0xFFFFL ) + { + FT_TRACE1(( "TT_Hint_Glyph: too long instructions" )); + FT_TRACE1(( " (0x%lx byte) is truncated\n", + loader->glyph->control_len )); + } + n_ins = loader->glyph->control_len; + + /* save original point position in org */ + if ( n_ins > 0 ) + FT_ARRAY_COPY( zone->org, zone->cur, zone->n_points ); + + /* Reset graphics state. */ + loader->exec->GS = loader->size->GS; + + /* XXX: UNDOCUMENTED! Hinting instructions of a composite glyph */ + /* completely refer to the (already) hinted subglyphs. */ + if ( is_composite ) + { + loader->exec->metrics.x_scale = 1 << 16; + loader->exec->metrics.y_scale = 1 << 16; + + FT_ARRAY_COPY( zone->orus, zone->cur, zone->n_points ); + } + else + { + loader->exec->metrics.x_scale = loader->size->metrics->x_scale; + loader->exec->metrics.y_scale = loader->size->metrics->y_scale; + } +#endif + + /* round phantom points */ + zone->cur[zone->n_points - 4].x = + FT_PIX_ROUND( zone->cur[zone->n_points - 4].x ); + zone->cur[zone->n_points - 3].x = + FT_PIX_ROUND( zone->cur[zone->n_points - 3].x ); + zone->cur[zone->n_points - 2].y = + FT_PIX_ROUND( zone->cur[zone->n_points - 2].y ); + zone->cur[zone->n_points - 1].y = + FT_PIX_ROUND( zone->cur[zone->n_points - 1].y ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + + if ( n_ins > 0 ) + { + FT_Error error; + + FT_GlyphLoader gloader = loader->gloader; + FT_Outline current_outline = gloader->current.outline; + + + TT_Set_CodeRange( loader->exec, tt_coderange_glyph, + loader->exec->glyphIns, n_ins ); + + loader->exec->is_composite = is_composite; + loader->exec->pts = *zone; + + error = TT_Run_Context( loader->exec ); + if ( error && loader->exec->pedantic_hinting ) + return error; + + /* store drop-out mode in bits 5-7; set bit 2 also as a marker */ + current_outline.tags[0] |= + ( loader->exec->GS.scan_type << 5 ) | FT_CURVE_TAG_HAS_SCANMODE; + } + +#endif + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* Save possibly modified glyph phantom points unless in v40 backward */ + /* compatibility mode, where no movement on the x axis means no reason */ + /* to change bearings or advance widths. */ + if ( !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && + loader->exec->backward_compatibility ) ) + { +#endif + loader->pp1 = zone->cur[zone->n_points - 4]; + loader->pp2 = zone->cur[zone->n_points - 3]; + loader->pp3 = zone->cur[zone->n_points - 2]; + loader->pp4 = zone->cur[zone->n_points - 1]; +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + } +#endif + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) + { + if ( loader->exec->sph_tweak_flags & SPH_TWEAK_DEEMBOLDEN ) + FT_Outline_EmboldenXY( &loader->gloader->current.outline, -24, 0 ); + + else if ( loader->exec->sph_tweak_flags & SPH_TWEAK_EMBOLDEN ) + FT_Outline_EmboldenXY( &loader->gloader->current.outline, 24, 0 ); + } +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Process_Simple_Glyph */ + /* */ + /* */ + /* Once a simple glyph has been loaded, it needs to be processed. */ + /* Usually, this means scaling and hinting through bytecode */ + /* interpretation. */ + /* */ + static FT_Error + TT_Process_Simple_Glyph( TT_Loader loader ) + { + FT_GlyphLoader gloader = loader->gloader; + FT_Error error = FT_Err_Ok; + FT_Outline* outline; + FT_Int n_points; + + + outline = &gloader->current.outline; + n_points = outline->n_points; + + /* set phantom points */ + + outline->points[n_points ] = loader->pp1; + outline->points[n_points + 1] = loader->pp2; + outline->points[n_points + 2] = loader->pp3; + outline->points[n_points + 3] = loader->pp4; + + outline->tags[n_points ] = 0; + outline->tags[n_points + 1] = 0; + outline->tags[n_points + 2] = 0; + outline->tags[n_points + 3] = 0; + + n_points += 4; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + if ( FT_IS_NAMED_INSTANCE( FT_FACE( loader->face ) ) || + FT_IS_VARIATION( FT_FACE( loader->face ) ) ) + { + /* Deltas apply to the unscaled data. */ + error = TT_Vary_Apply_Glyph_Deltas( loader->face, + loader->glyph_index, + outline, + (FT_UInt)n_points ); + + /* recalculate linear horizontal and vertical advances */ + /* if we don't have HVAR and VVAR, respectively */ + if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) + loader->linear = outline->points[n_points - 3].x - + outline->points[n_points - 4].x; + if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) + loader->vadvance = outline->points[n_points - 1].x - + outline->points[n_points - 2].x; + + if ( error ) + return error; + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + if ( IS_HINTED( loader->load_flags ) ) + { + tt_prepare_zone( &loader->zone, &gloader->current, 0, 0 ); + + FT_ARRAY_COPY( loader->zone.orus, loader->zone.cur, + loader->zone.n_points + 4 ); + } + + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + TT_Face face = loader->face; + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); + + FT_String* family = face->root.family_name; + FT_UInt ppem = loader->size->metrics->x_ppem; + FT_String* style = face->root.style_name; + FT_UInt x_scale_factor = 1000; +#endif + + FT_Vector* vec = outline->points; + FT_Vector* limit = outline->points + n_points; + + FT_Fixed x_scale = 0; /* pacify compiler */ + FT_Fixed y_scale = 0; + + FT_Bool do_scale = FALSE; + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) + { + /* scale, but only if enabled and only if TT hinting is being used */ + if ( IS_HINTED( loader->load_flags ) ) + x_scale_factor = sph_test_tweak_x_scaling( face, + family, + ppem, + style, + loader->glyph_index ); + /* scale the glyph */ + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 || + x_scale_factor != 1000 ) + { + x_scale = FT_MulDiv( loader->size->metrics->x_scale, + (FT_Long)x_scale_factor, 1000 ); + y_scale = loader->size->metrics->y_scale; + + /* compensate for any scaling by de/emboldening; */ + /* the amount was determined via experimentation */ + if ( x_scale_factor != 1000 && ppem > 11 ) + FT_Outline_EmboldenXY( outline, + FT_MulFix( 1280 * ppem, + 1000 - x_scale_factor ), + 0 ); + do_scale = TRUE; + } + } + else + +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + { + /* scale the glyph */ + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + x_scale = loader->size->metrics->x_scale; + y_scale = loader->size->metrics->y_scale; + + do_scale = TRUE; + } + } + + if ( do_scale ) + { + for ( ; vec < limit; vec++ ) + { + vec->x = FT_MulFix( vec->x, x_scale ); + vec->y = FT_MulFix( vec->y, y_scale ); + } + } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* if we have a HVAR table, `pp1' and/or `pp2' are already adjusted */ + if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) || + !IS_HINTED( loader->load_flags ) ) +#endif + { + loader->pp1 = outline->points[n_points - 4]; + loader->pp2 = outline->points[n_points - 3]; + } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /* if we have a VVAR table, `pp3' and/or `pp4' are already adjusted */ + if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) || + !IS_HINTED( loader->load_flags ) ) +#endif + { + loader->pp3 = outline->points[n_points - 2]; + loader->pp4 = outline->points[n_points - 1]; + } + } + + if ( IS_HINTED( loader->load_flags ) ) + { + loader->zone.n_points += 4; + + error = TT_Hint_Glyph( loader, 0 ); + } + + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Process_Composite_Component */ + /* */ + /* */ + /* Once a composite component has been loaded, it needs to be */ + /* processed. Usually, this means transforming and translating. */ + /* */ + static FT_Error + TT_Process_Composite_Component( TT_Loader loader, + FT_SubGlyph subglyph, + FT_UInt start_point, + FT_UInt num_base_points ) + { + FT_GlyphLoader gloader = loader->gloader; + FT_Outline current; + FT_Bool have_scale; + FT_Pos x, y; + + + current.points = gloader->base.outline.points + + num_base_points; + current.n_points = gloader->base.outline.n_points - + (short)num_base_points; + + have_scale = FT_BOOL( subglyph->flags & ( WE_HAVE_A_SCALE | + WE_HAVE_AN_XY_SCALE | + WE_HAVE_A_2X2 ) ); + + /* perform the transform required for this subglyph */ + if ( have_scale ) + FT_Outline_Transform( ¤t, &subglyph->transform ); + + /* get offset */ + if ( !( subglyph->flags & ARGS_ARE_XY_VALUES ) ) + { + FT_UInt num_points = (FT_UInt)gloader->base.outline.n_points; + FT_UInt k = (FT_UInt)subglyph->arg1; + FT_UInt l = (FT_UInt)subglyph->arg2; + FT_Vector* p1; + FT_Vector* p2; + + + /* match l-th point of the newly loaded component to the k-th point */ + /* of the previously loaded components. */ + + /* change to the point numbers used by our outline */ + k += start_point; + l += num_base_points; + if ( k >= num_base_points || + l >= num_points ) + return FT_THROW( Invalid_Composite ); + + p1 = gloader->base.outline.points + k; + p2 = gloader->base.outline.points + l; + + x = p1->x - p2->x; + y = p1->y - p2->y; + } + else + { + x = subglyph->arg1; + y = subglyph->arg2; + + if ( !x && !y ) + return FT_Err_Ok; + + /* Use a default value dependent on */ + /* TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED. This is useful for old */ + /* TT fonts which don't set the xxx_COMPONENT_OFFSET bit. */ + + if ( have_scale && +#ifdef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + !( subglyph->flags & UNSCALED_COMPONENT_OFFSET ) ) +#else + ( subglyph->flags & SCALED_COMPONENT_OFFSET ) ) +#endif + { + +#if 0 + + /*******************************************************************/ + /* */ + /* This algorithm is what Apple documents. But it doesn't work. */ + /* */ + int a = subglyph->transform.xx > 0 ? subglyph->transform.xx + : -subglyph->transform.xx; + int b = subglyph->transform.yx > 0 ? subglyph->transform.yx + : -subglyph->transform.yx; + int c = subglyph->transform.xy > 0 ? subglyph->transform.xy + : -subglyph->transform.xy; + int d = subglyph->transform.yy > 0 ? subglyph->transform.yy + : -subglyph->transform.yy; + int m = a > b ? a : b; + int n = c > d ? c : d; + + + if ( a - b <= 33 && a - b >= -33 ) + m *= 2; + if ( c - d <= 33 && c - d >= -33 ) + n *= 2; + x = FT_MulFix( x, m ); + y = FT_MulFix( y, n ); + +#else /* 1 */ + + /*******************************************************************/ + /* */ + /* This algorithm is a guess and works much better than the above. */ + /* */ + FT_Fixed mac_xscale = FT_Hypot( subglyph->transform.xx, + subglyph->transform.xy ); + FT_Fixed mac_yscale = FT_Hypot( subglyph->transform.yy, + subglyph->transform.yx ); + + + x = FT_MulFix( x, mac_xscale ); + y = FT_MulFix( y, mac_yscale ); + +#endif /* 1 */ + + } + + if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) + { + FT_Fixed x_scale = loader->size->metrics->x_scale; + FT_Fixed y_scale = loader->size->metrics->y_scale; + + + x = FT_MulFix( x, x_scale ); + y = FT_MulFix( y, y_scale ); + + if ( subglyph->flags & ROUND_XY_TO_GRID ) + { + TT_Face face = loader->face; + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); + + + if ( IS_HINTED( loader->load_flags ) ) + { + /* + * We round the horizontal offset only if there is hinting along + * the x axis; this corresponds to integer advance width values. + * + * Theoretically, a glyph's bytecode can toggle ClearType's + * `backward compatibility' mode, which would allow modification + * of the advance width. In reality, however, applications + * neither allow nor expect modified advance widths if subpixel + * rendering is active. + * + */ + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_35 ) + x = FT_PIX_ROUND( x ); + + y = FT_PIX_ROUND( y ); + } + } + } + } + + if ( x || y ) + FT_Outline_Translate( ¤t, x, y ); + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Process_Composite_Glyph */ + /* */ + /* */ + /* This is slightly different from TT_Process_Simple_Glyph, in that */ + /* its sole purpose is to hint the glyph. Thus this function is */ + /* only available when bytecode interpreter is enabled. */ + /* */ + static FT_Error + TT_Process_Composite_Glyph( TT_Loader loader, + FT_UInt start_point, + FT_UInt start_contour ) + { + FT_Error error; + FT_Outline* outline; + FT_UInt i; + + + outline = &loader->gloader->base.outline; + + /* make room for phantom points */ + error = FT_GLYPHLOADER_CHECK_POINTS( loader->gloader, + outline->n_points + 4, + 0 ); + if ( error ) + return error; + + outline->points[outline->n_points ] = loader->pp1; + outline->points[outline->n_points + 1] = loader->pp2; + outline->points[outline->n_points + 2] = loader->pp3; + outline->points[outline->n_points + 3] = loader->pp4; + + outline->tags[outline->n_points ] = 0; + outline->tags[outline->n_points + 1] = 0; + outline->tags[outline->n_points + 2] = 0; + outline->tags[outline->n_points + 3] = 0; + +#ifdef TT_USE_BYTECODE_INTERPRETER + + { + FT_Stream stream = loader->stream; + FT_UShort n_ins, max_ins; + FT_ULong tmp; + + + /* TT_Load_Composite_Glyph only gives us the offset of instructions */ + /* so we read them here */ + if ( FT_STREAM_SEEK( loader->ins_pos ) || + FT_READ_USHORT( n_ins ) ) + return error; + + FT_TRACE5(( " Instructions size = %d\n", n_ins )); + + /* check it */ + max_ins = loader->face->max_profile.maxSizeOfInstructions; + if ( n_ins > max_ins ) + { + /* don't trust `maxSizeOfInstructions'; */ + /* only do a rough safety check */ + if ( (FT_Int)n_ins > loader->byte_len ) + { + FT_TRACE1(( "TT_Process_Composite_Glyph:" + " too many instructions (%d) for glyph with length %d\n", + n_ins, loader->byte_len )); + return FT_THROW( Too_Many_Hints ); + } + + tmp = loader->exec->glyphSize; + error = Update_Max( loader->exec->memory, + &tmp, + sizeof ( FT_Byte ), + (void*)&loader->exec->glyphIns, + n_ins ); + + loader->exec->glyphSize = (FT_UShort)tmp; + if ( error ) + return error; + } + else if ( n_ins == 0 ) + return FT_Err_Ok; + + if ( FT_STREAM_READ( loader->exec->glyphIns, n_ins ) ) + return error; + + loader->glyph->control_data = loader->exec->glyphIns; + loader->glyph->control_len = n_ins; + } + +#endif + + tt_prepare_zone( &loader->zone, &loader->gloader->base, + start_point, start_contour ); + + /* Some points are likely touched during execution of */ + /* instructions on components. So let's untouch them. */ + for ( i = 0; i < loader->zone.n_points; i++ ) + loader->zone.tags[i] &= ~FT_CURVE_TAG_TOUCH_BOTH; + + loader->zone.n_points += 4; + + return TT_Hint_Glyph( loader, 1 ); + } + + + /* + * Calculate the phantom points + * + * Defining the right side bearing (rsb) as + * + * rsb = aw - (lsb + xmax - xmin) + * + * (with `aw' the advance width, `lsb' the left side bearing, and `xmin' + * and `xmax' the glyph's minimum and maximum x value), the OpenType + * specification defines the initial position of horizontal phantom points + * as + * + * pp1 = (round(xmin - lsb), 0) , + * pp2 = (round(pp1 + aw), 0) . + * + * Note that the rounding to the grid (in the device space) is not + * documented currently in the specification. + * + * However, the specification lacks the precise definition of vertical + * phantom points. Greg Hitchcock provided the following explanation. + * + * - a `vmtx' table is present + * + * For any glyph, the minimum and maximum y values (`ymin' and `ymax') + * are given in the `glyf' table, the top side bearing (tsb) and advance + * height (ah) are given in the `vmtx' table. The bottom side bearing + * (bsb) is then calculated as + * + * bsb = ah - (tsb + ymax - ymin) , + * + * and the initial position of vertical phantom points is + * + * pp3 = (x, round(ymax + tsb)) , + * pp4 = (x, round(pp3 - ah)) . + * + * See below for value `x'. + * + * - no `vmtx' table in the font + * + * If there is an `OS/2' table, we set + * + * DefaultAscender = sTypoAscender , + * DefaultDescender = sTypoDescender , + * + * otherwise we use data from the `hhea' table: + * + * DefaultAscender = Ascender , + * DefaultDescender = Descender . + * + * With these two variables we can now set + * + * ah = DefaultAscender - sDefaultDescender , + * tsb = DefaultAscender - yMax , + * + * and proceed as if a `vmtx' table was present. + * + * Usually we have + * + * x = aw / 2 , (1) + * + * but there is one compatibility case where it can be set to + * + * x = -DefaultDescender - + * ((DefaultAscender - DefaultDescender - aw) / 2) . (2) + * + * and another one with + * + * x = 0 . (3) + * + * In Windows, the history of those values is quite complicated, + * depending on the hinting engine (that is, the graphics framework). + * + * framework from to formula + * ---------------------------------------------------------- + * GDI Windows 98 current (1) + * (Windows 2000 for NT) + * GDI+ Windows XP Windows 7 (2) + * GDI+ Windows 8 current (3) + * DWrite Windows 7 current (3) + * + * For simplicity, FreeType uses (1) for grayscale subpixel hinting and + * (3) for everything else. + * + */ + static void + tt_loader_set_pp( TT_Loader loader ) + { + FT_Bool subpixel_hinting = 0; + FT_Bool grayscale = 0; + FT_Bool use_aw_2 = 0; + +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( loader->face ); +#endif + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) + { + subpixel_hinting = loader->exec ? loader->exec->subpixel_hinting + : 0; + grayscale = loader->exec ? loader->exec->grayscale + : 0; + } +#endif +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) + { + subpixel_hinting = loader->exec ? loader->exec->subpixel_hinting_lean + : 0; + grayscale = loader->exec ? loader->exec->grayscale_cleartype + : 0; + } +#endif + + use_aw_2 = (FT_Bool)( subpixel_hinting && grayscale ); + + loader->pp1.x = loader->bbox.xMin - loader->left_bearing; + loader->pp1.y = 0; + loader->pp2.x = loader->pp1.x + loader->advance; + loader->pp2.y = 0; + + loader->pp3.x = use_aw_2 ? loader->advance / 2 : 0; + loader->pp3.y = loader->bbox.yMax + loader->top_bearing; + loader->pp4.x = use_aw_2 ? loader->advance / 2 : 0; + loader->pp4.y = loader->pp3.y - loader->vadvance; + } + + + /* a utility function to retrieve i-th node from given FT_List */ + static FT_ListNode + ft_list_get_node_at( FT_List list, + FT_UInt idx ) + { + FT_ListNode cur; + + + if ( !list ) + return NULL; + + for ( cur = list->head; cur; cur = cur->next ) + { + if ( !idx ) + return cur; + + idx--; + } + + return NULL; + } + + + /*************************************************************************/ + /* */ + /* */ + /* load_truetype_glyph */ + /* */ + /* */ + /* Loads a given truetype glyph. Handles composites and uses a */ + /* TT_Loader object. */ + /* */ + static FT_Error + load_truetype_glyph( TT_Loader loader, + FT_UInt glyph_index, + FT_UInt recurse_count, + FT_Bool header_only ) + { + FT_Error error = FT_Err_Ok; + FT_Fixed x_scale, y_scale; + FT_ULong offset; + TT_Face face = loader->face; + FT_GlyphLoader gloader = loader->gloader; + FT_Bool opened_frame = 0; + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + FT_StreamRec inc_stream; + FT_Data glyph_data; + FT_Bool glyph_data_loaded = 0; +#endif + + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( recurse_count ) + FT_TRACE5(( " nesting level: %d\n", recurse_count )); +#endif + + /* some fonts have an incorrect value of `maxComponentDepth' */ + if ( recurse_count > face->max_profile.maxComponentDepth ) + { + FT_TRACE1(( "load_truetype_glyph: maxComponentDepth set to %d\n", + recurse_count )); + face->max_profile.maxComponentDepth = (FT_UShort)recurse_count; + } + +#ifndef FT_CONFIG_OPTION_INCREMENTAL + /* check glyph index */ + if ( glyph_index >= (FT_UInt)face->root.num_glyphs ) + { + error = FT_THROW( Invalid_Glyph_Index ); + goto Exit; + } +#endif + + loader->glyph_index = glyph_index; + + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + x_scale = loader->size->metrics->x_scale; + y_scale = loader->size->metrics->y_scale; + } + else + { + x_scale = 0x10000L; + y_scale = 0x10000L; + } + + /* Set `offset' to the start of the glyph relative to the start of */ + /* the `glyf' table, and `byte_len' to the length of the glyph in */ + /* bytes. */ + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + /* If we are loading glyph data via the incremental interface, set */ + /* the loader stream to a memory stream reading the data returned */ + /* by the interface. */ + if ( face->root.internal->incremental_interface ) + { + error = face->root.internal->incremental_interface->funcs->get_glyph_data( + face->root.internal->incremental_interface->object, + glyph_index, &glyph_data ); + if ( error ) + goto Exit; + + glyph_data_loaded = 1; + offset = 0; + loader->byte_len = glyph_data.length; + + FT_ZERO( &inc_stream ); + FT_Stream_OpenMemory( &inc_stream, + glyph_data.pointer, + (FT_ULong)glyph_data.length ); + + loader->stream = &inc_stream; + } + else + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + offset = tt_face_get_location( face, glyph_index, + (FT_UInt*)&loader->byte_len ); + + if ( loader->byte_len > 0 ) + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + /* for the incremental interface, `glyf_offset' is always zero */ + if ( !face->glyf_offset && + !face->root.internal->incremental_interface ) +#else + if ( !face->glyf_offset ) +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + { + FT_TRACE2(( "no `glyf' table but non-zero `loca' entry\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + error = face->access_glyph_frame( loader, glyph_index, + face->glyf_offset + offset, + (FT_UInt)loader->byte_len ); + if ( error ) + goto Exit; + + opened_frame = 1; + + /* read glyph header first */ + error = face->read_glyph_header( loader ); + if ( error ) + goto Exit; + + /* the metrics must be computed after loading the glyph header */ + /* since we need the glyph's `yMax' value in case the vertical */ + /* metrics must be emulated */ + error = tt_get_metrics( loader, glyph_index ); + if ( error ) + goto Exit; + + if ( header_only ) + goto Exit; + } + + if ( loader->byte_len == 0 || loader->n_contours == 0 ) + { + loader->bbox.xMin = 0; + loader->bbox.xMax = 0; + loader->bbox.yMin = 0; + loader->bbox.yMax = 0; + + error = tt_get_metrics( loader, glyph_index ); + if ( error ) + goto Exit; + + if ( header_only ) + goto Exit; + + /* must initialize points before (possibly) overriding */ + /* glyph metrics from the incremental interface */ + tt_loader_set_pp( loader ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + tt_get_metrics_incr_overrides( loader, glyph_index ); +#endif + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) || + FT_IS_VARIATION( FT_FACE( face ) ) ) + { + /* a small outline structure with four elements for */ + /* communication with `TT_Vary_Apply_Glyph_Deltas' */ + FT_Vector points[4]; + char tags[4] = { 1, 1, 1, 1 }; + short contours[4] = { 0, 1, 2, 3 }; + FT_Outline outline; + + + points[0].x = loader->pp1.x; + points[0].y = loader->pp1.y; + points[1].x = loader->pp2.x; + points[1].y = loader->pp2.y; + + points[2].x = loader->pp3.x; + points[2].y = loader->pp3.y; + points[3].x = loader->pp4.x; + points[3].y = loader->pp4.y; + + outline.n_points = 4; + outline.n_contours = 4; + outline.points = points; + outline.tags = tags; + outline.contours = contours; + + /* this must be done before scaling */ + error = TT_Vary_Apply_Glyph_Deltas( loader->face, + glyph_index, + &outline, + (FT_UInt)outline.n_points ); + if ( error ) + goto Exit; + + loader->pp1.x = points[0].x; + loader->pp1.y = points[0].y; + loader->pp2.x = points[1].x; + loader->pp2.y = points[1].y; + + loader->pp3.x = points[2].x; + loader->pp3.y = points[2].y; + loader->pp4.x = points[3].x; + loader->pp4.y = points[3].y; + + + /* recalculate linear horizontal and vertical advances */ + /* if we don't have HVAR and VVAR, respectively */ + if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) + loader->linear = loader->pp2.x - loader->pp1.x; + if ( !( loader->face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) + loader->vadvance = loader->pp4.x - loader->pp3.x; + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + /* scale phantom points, if necessary; */ + /* they get rounded in `TT_Hint_Glyph' */ + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); + loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); + /* pp1.y and pp2.y are always zero */ + + loader->pp3.x = FT_MulFix( loader->pp3.x, x_scale ); + loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); + loader->pp4.x = FT_MulFix( loader->pp4.x, x_scale ); + loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); + } + + error = FT_Err_Ok; + goto Exit; + } + + /* must initialize phantom points before (possibly) overriding */ + /* glyph metrics from the incremental interface */ + tt_loader_set_pp( loader ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + tt_get_metrics_incr_overrides( loader, glyph_index ); +#endif + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + /* if it is a simple glyph, load it */ + + if ( loader->n_contours > 0 ) + { + error = face->read_simple_glyph( loader ); + if ( error ) + goto Exit; + + /* all data have been read */ + face->forget_glyph_frame( loader ); + opened_frame = 0; + + error = TT_Process_Simple_Glyph( loader ); + if ( error ) + goto Exit; + + FT_GlyphLoader_Add( gloader ); + } + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + /* otherwise, load a composite! */ + else if ( loader->n_contours < 0 ) + { + FT_Memory memory = face->root.memory; + + FT_UInt start_point; + FT_UInt start_contour; + FT_ULong ins_pos; /* position of composite instructions, if any */ + + FT_ListNode node, node2; + + + /* normalize the `n_contours' value */ + loader->n_contours = -1; + + /* + * We store the glyph index directly in the `node->data' pointer, + * following the glib solution (cf. macro `GUINT_TO_POINTER') with a + * double cast to make this portable. Note, however, that this needs + * pointers with a width of at least 32 bits. + */ + + + /* clear the nodes filled by sibling chains */ + node = ft_list_get_node_at( &loader->composites, recurse_count ); + for ( node2 = node; node2; node2 = node2->next ) + node2->data = (void*)FT_ULONG_MAX; + + /* check whether we already have a composite glyph with this index */ + if ( FT_List_Find( &loader->composites, + FT_UINT_TO_POINTER( glyph_index ) ) ) + { + FT_TRACE1(( "TT_Load_Composite_Glyph:" + " infinite recursion detected\n" )); + error = FT_THROW( Invalid_Composite ); + goto Exit; + } + + else if ( node ) + node->data = FT_UINT_TO_POINTER( glyph_index ); + + else + { + if ( FT_NEW( node ) ) + goto Exit; + node->data = FT_UINT_TO_POINTER( glyph_index ); + FT_List_Add( &loader->composites, node ); + } + + start_point = (FT_UInt)gloader->base.outline.n_points; + start_contour = (FT_UInt)gloader->base.outline.n_contours; + + /* for each subglyph, read composite header */ + error = face->read_composite_glyph( loader ); + if ( error ) + goto Exit; + + /* store the offset of instructions */ + ins_pos = loader->ins_pos; + + /* all data we need are read */ + face->forget_glyph_frame( loader ); + opened_frame = 0; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) || + FT_IS_VARIATION( FT_FACE( face ) ) ) + { + short i, limit; + FT_SubGlyph subglyph; + + FT_Outline outline; + FT_Vector* points = NULL; + char* tags = NULL; + short* contours = NULL; + + + limit = (short)gloader->current.num_subglyphs; + + /* construct an outline structure for */ + /* communication with `TT_Vary_Apply_Glyph_Deltas' */ + outline.n_points = (short)( gloader->current.num_subglyphs + 4 ); + outline.n_contours = outline.n_points; + + outline.points = NULL; + outline.tags = NULL; + outline.contours = NULL; + + if ( FT_NEW_ARRAY( points, outline.n_points ) || + FT_NEW_ARRAY( tags, outline.n_points ) || + FT_NEW_ARRAY( contours, outline.n_points ) ) + goto Exit1; + + subglyph = gloader->current.subglyphs; + + for ( i = 0; i < limit; i++, subglyph++ ) + { + /* applying deltas for anchor points doesn't make sense, */ + /* but we don't have to specially check this since */ + /* unused delta values are zero anyways */ + points[i].x = subglyph->arg1; + points[i].y = subglyph->arg2; + tags[i] = 1; + contours[i] = i; + } + + points[i].x = loader->pp1.x; + points[i].y = loader->pp1.y; + tags[i] = 1; + contours[i] = i; + + i++; + points[i].x = loader->pp2.x; + points[i].y = loader->pp2.y; + tags[i] = 1; + contours[i] = i; + + i++; + points[i].x = loader->pp3.x; + points[i].y = loader->pp3.y; + tags[i] = 1; + contours[i] = i; + + i++; + points[i].x = loader->pp4.x; + points[i].y = loader->pp4.y; + tags[i] = 1; + contours[i] = i; + + outline.points = points; + outline.tags = tags; + outline.contours = contours; + + /* this call provides additional offsets */ + /* for each component's translation */ + if ( FT_SET_ERROR( TT_Vary_Apply_Glyph_Deltas( + face, + glyph_index, + &outline, + (FT_UInt)outline.n_points ) ) ) + goto Exit1; + + subglyph = gloader->current.subglyphs; + + for ( i = 0; i < limit; i++, subglyph++ ) + { + if ( subglyph->flags & ARGS_ARE_XY_VALUES ) + { + subglyph->arg1 = (FT_Int16)points[i].x; + subglyph->arg2 = (FT_Int16)points[i].y; + } + } + + loader->pp1.x = points[i + 0].x; + loader->pp1.y = points[i + 0].y; + loader->pp2.x = points[i + 1].x; + loader->pp2.y = points[i + 1].y; + + loader->pp3.x = points[i + 2].x; + loader->pp3.y = points[i + 2].y; + loader->pp4.x = points[i + 3].x; + loader->pp4.y = points[i + 3].y; + + /* recalculate linear horizontal and vertical advances */ + /* if we don't have HVAR and VVAR, respectively */ + if ( !( face->variation_support & TT_FACE_FLAG_VAR_HADVANCE ) ) + loader->linear = loader->pp2.x - loader->pp1.x; + if ( !( face->variation_support & TT_FACE_FLAG_VAR_VADVANCE ) ) + loader->vadvance = loader->pp4.x - loader->pp3.x; + + Exit1: + FT_FREE( outline.points ); + FT_FREE( outline.tags ); + FT_FREE( outline.contours ); + + if ( error ) + goto Exit; + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + /* scale phantom points, if necessary; */ + /* they get rounded in `TT_Hint_Glyph' */ + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + { + loader->pp1.x = FT_MulFix( loader->pp1.x, x_scale ); + loader->pp2.x = FT_MulFix( loader->pp2.x, x_scale ); + /* pp1.y and pp2.y are always zero */ + + loader->pp3.x = FT_MulFix( loader->pp3.x, x_scale ); + loader->pp3.y = FT_MulFix( loader->pp3.y, y_scale ); + loader->pp4.x = FT_MulFix( loader->pp4.x, x_scale ); + loader->pp4.y = FT_MulFix( loader->pp4.y, y_scale ); + } + + /* if the flag FT_LOAD_NO_RECURSE is set, we return the subglyph */ + /* `as is' in the glyph slot (the client application will be */ + /* responsible for interpreting these data)... */ + if ( loader->load_flags & FT_LOAD_NO_RECURSE ) + { + FT_GlyphLoader_Add( gloader ); + loader->glyph->format = FT_GLYPH_FORMAT_COMPOSITE; + + goto Exit; + } + + /*********************************************************************/ + /*********************************************************************/ + /*********************************************************************/ + + { + FT_UInt n, num_base_points; + FT_SubGlyph subglyph = NULL; + + FT_UInt num_points = start_point; + FT_UInt num_subglyphs = gloader->current.num_subglyphs; + FT_UInt num_base_subgs = gloader->base.num_subglyphs; + + FT_Stream old_stream = loader->stream; + FT_Int old_byte_len = loader->byte_len; + + + FT_GlyphLoader_Add( gloader ); + + /* read each subglyph independently */ + for ( n = 0; n < num_subglyphs; n++ ) + { + FT_Vector pp[4]; + + FT_Int linear_hadvance; + FT_Int linear_vadvance; + + + /* Each time we call load_truetype_glyph in this loop, the */ + /* value of `gloader.base.subglyphs' can change due to table */ + /* reallocations. We thus need to recompute the subglyph */ + /* pointer on each iteration. */ + subglyph = gloader->base.subglyphs + num_base_subgs + n; + + pp[0] = loader->pp1; + pp[1] = loader->pp2; + pp[2] = loader->pp3; + pp[3] = loader->pp4; + + linear_hadvance = loader->linear; + linear_vadvance = loader->vadvance; + + num_base_points = (FT_UInt)gloader->base.outline.n_points; + + error = load_truetype_glyph( loader, + (FT_UInt)subglyph->index, + recurse_count + 1, + FALSE ); + if ( error ) + goto Exit; + + /* restore subglyph pointer */ + subglyph = gloader->base.subglyphs + num_base_subgs + n; + + /* restore phantom points if necessary */ + if ( !( subglyph->flags & USE_MY_METRICS ) ) + { + loader->pp1 = pp[0]; + loader->pp2 = pp[1]; + loader->pp3 = pp[2]; + loader->pp4 = pp[3]; + + loader->linear = linear_hadvance; + loader->vadvance = linear_vadvance; + } + + num_points = (FT_UInt)gloader->base.outline.n_points; + + if ( num_points == num_base_points ) + continue; + + /* gloader->base.outline consists of three parts: */ + /* 0 -(1)-> start_point -(2)-> num_base_points -(3)-> n_points. */ + /* */ + /* (1): exists from the beginning */ + /* (2): components that have been loaded so far */ + /* (3): the newly loaded component */ + error = TT_Process_Composite_Component( loader, + subglyph, + start_point, + num_base_points ); + if ( error ) + goto Exit; + } + + loader->stream = old_stream; + loader->byte_len = old_byte_len; + + /* process the glyph */ + loader->ins_pos = ins_pos; + if ( IS_HINTED( loader->load_flags ) && +#ifdef TT_USE_BYTECODE_INTERPRETER + subglyph->flags & WE_HAVE_INSTR && +#endif + num_points > start_point ) + { + error = TT_Process_Composite_Glyph( loader, + start_point, + start_contour ); + if ( error ) + goto Exit; + } + } + } + + /***********************************************************************/ + /***********************************************************************/ + /***********************************************************************/ + + Exit: + + if ( opened_frame ) + face->forget_glyph_frame( loader ); + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + + if ( glyph_data_loaded ) + face->root.internal->incremental_interface->funcs->free_glyph_data( + face->root.internal->incremental_interface->object, + &glyph_data ); + +#endif + + return error; + } + + + static FT_Error + compute_glyph_metrics( TT_Loader loader, + FT_UInt glyph_index ) + { + TT_Face face = loader->face; +#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \ + defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( face ); +#endif + + FT_BBox bbox; + FT_Fixed y_scale; + TT_GlyphSlot glyph = loader->glyph; + TT_Size size = loader->size; + + + y_scale = 0x10000L; + if ( ( loader->load_flags & FT_LOAD_NO_SCALE ) == 0 ) + y_scale = size->metrics->y_scale; + + if ( glyph->format != FT_GLYPH_FORMAT_COMPOSITE ) + FT_Outline_Get_CBox( &glyph->outline, &bbox ); + else + bbox = loader->bbox; + + /* get the device-independent horizontal advance; it is scaled later */ + /* by the base layer. */ + glyph->linearHoriAdvance = loader->linear; + + glyph->metrics.horiBearingX = bbox.xMin; + glyph->metrics.horiBearingY = bbox.yMax; + glyph->metrics.horiAdvance = loader->pp2.x - loader->pp1.x; + + /* Adjust advance width to the value contained in the hdmx table */ + /* unless FT_LOAD_COMPUTE_METRICS is set or backward compatibility */ + /* mode of the v40 interpreter is active. See `ttinterp.h' for */ + /* details on backward compatibility mode. */ + if ( +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + !( driver->interpreter_version == TT_INTERPRETER_VERSION_40 && + ( loader->exec && loader->exec->backward_compatibility ) ) && +#endif + !face->postscript.isFixedPitch && + IS_HINTED( loader->load_flags ) && + !( loader->load_flags & FT_LOAD_COMPUTE_METRICS ) ) + { + FT_Byte* widthp; + + + widthp = tt_face_get_device_metrics( face, + size->metrics->x_ppem, + glyph_index ); + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) + { + FT_Bool ignore_x_mode; + + + ignore_x_mode = FT_BOOL( FT_LOAD_TARGET_MODE( loader->load_flags ) != + FT_RENDER_MODE_MONO ); + + if ( widthp && + ( ( ignore_x_mode && loader->exec->compatible_widths ) || + !ignore_x_mode || + SPH_OPTION_BITMAP_WIDTHS ) ) + glyph->metrics.horiAdvance = *widthp * 64; + } + else + +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + { + if ( widthp ) + glyph->metrics.horiAdvance = *widthp * 64; + } + } + + /* set glyph dimensions */ + glyph->metrics.width = SUB_LONG( bbox.xMax, bbox.xMin ); + glyph->metrics.height = SUB_LONG( bbox.yMax, bbox.yMin ); + + /* Now take care of vertical metrics. In the case where there is */ + /* no vertical information within the font (relatively common), */ + /* create some metrics manually */ + { + FT_Pos top; /* scaled vertical top side bearing */ + FT_Pos advance; /* scaled vertical advance height */ + + + /* Get the unscaled top bearing and advance height. */ + if ( face->vertical_info && + face->vertical.number_Of_VMetrics > 0 ) + { + top = (FT_Short)FT_DivFix( loader->pp3.y - bbox.yMax, + y_scale ); + + if ( loader->pp3.y <= loader->pp4.y ) + advance = 0; + else + advance = (FT_UShort)FT_DivFix( loader->pp3.y - loader->pp4.y, + y_scale ); + } + else + { + FT_Pos height; + + + /* XXX Compute top side bearing and advance height in */ + /* Get_VMetrics instead of here. */ + + /* NOTE: The OS/2 values are the only `portable' ones, */ + /* which is why we use them, if there is an OS/2 */ + /* table in the font. Otherwise, we use the */ + /* values defined in the horizontal header. */ + + height = (FT_Short)FT_DivFix( SUB_LONG( bbox.yMax, + bbox.yMin ), + y_scale ); + if ( face->os2.version != 0xFFFFU ) + advance = (FT_Pos)( face->os2.sTypoAscender - + face->os2.sTypoDescender ); + else + advance = (FT_Pos)( face->horizontal.Ascender - + face->horizontal.Descender ); + + top = ( advance - height ) / 2; + } + +#ifdef FT_CONFIG_OPTION_INCREMENTAL + { + FT_Incremental_InterfaceRec* incr; + FT_Incremental_MetricsRec incr_metrics; + FT_Error error; + + + incr = face->root.internal->incremental_interface; + + /* If this is an incrementally loaded font see if there are */ + /* overriding metrics for this glyph. */ + if ( incr && incr->funcs->get_glyph_metrics ) + { + incr_metrics.bearing_x = 0; + incr_metrics.bearing_y = top; + incr_metrics.advance = advance; + + error = incr->funcs->get_glyph_metrics( incr->object, + glyph_index, + TRUE, + &incr_metrics ); + if ( error ) + return error; + + top = incr_metrics.bearing_y; + advance = incr_metrics.advance; + } + } + + /* GWW: Do vertical metrics get loaded incrementally too? */ + +#endif /* FT_CONFIG_OPTION_INCREMENTAL */ + + glyph->linearVertAdvance = advance; + + /* scale the metrics */ + if ( !( loader->load_flags & FT_LOAD_NO_SCALE ) ) + { + top = FT_MulFix( top, y_scale ); + advance = FT_MulFix( advance, y_scale ); + } + + /* XXX: for now, we have no better algorithm for the lsb, but it */ + /* should work fine. */ + /* */ + glyph->metrics.vertBearingX = glyph->metrics.horiBearingX - + glyph->metrics.horiAdvance / 2; + glyph->metrics.vertBearingY = top; + glyph->metrics.vertAdvance = advance; + } + + return 0; + } + + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + static FT_Error + load_sbit_image( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + TT_Face face; + SFNT_Service sfnt; + FT_Stream stream; + FT_Error error; + TT_SBit_MetricsRec sbit_metrics; + + + face = (TT_Face)glyph->face; + sfnt = (SFNT_Service)face->sfnt; + stream = face->root.stream; + + error = sfnt->load_sbit_image( face, + size->strike_index, + glyph_index, + (FT_UInt)load_flags, + stream, + &glyph->bitmap, + &sbit_metrics ); + if ( !error ) + { + glyph->outline.n_points = 0; + glyph->outline.n_contours = 0; + + glyph->metrics.width = (FT_Pos)sbit_metrics.width * 64; + glyph->metrics.height = (FT_Pos)sbit_metrics.height * 64; + + glyph->metrics.horiBearingX = (FT_Pos)sbit_metrics.horiBearingX * 64; + glyph->metrics.horiBearingY = (FT_Pos)sbit_metrics.horiBearingY * 64; + glyph->metrics.horiAdvance = (FT_Pos)sbit_metrics.horiAdvance * 64; + + glyph->metrics.vertBearingX = (FT_Pos)sbit_metrics.vertBearingX * 64; + glyph->metrics.vertBearingY = (FT_Pos)sbit_metrics.vertBearingY * 64; + glyph->metrics.vertAdvance = (FT_Pos)sbit_metrics.vertAdvance * 64; + + glyph->format = FT_GLYPH_FORMAT_BITMAP; + + if ( load_flags & FT_LOAD_VERTICAL_LAYOUT ) + { + glyph->bitmap_left = sbit_metrics.vertBearingX; + glyph->bitmap_top = sbit_metrics.vertBearingY; + } + else + { + glyph->bitmap_left = sbit_metrics.horiBearingX; + glyph->bitmap_top = sbit_metrics.horiBearingY; + } + } + + return error; + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + + static FT_Error + tt_loader_init( TT_Loader loader, + TT_Size size, + TT_GlyphSlot glyph, + FT_Int32 load_flags, + FT_Bool glyf_table_only ) + { + TT_Face face; + FT_Stream stream; + +#ifdef TT_USE_BYTECODE_INTERPRETER + FT_Error error; + FT_Bool pedantic = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); +#if defined TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY || \ + defined TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( (TT_Face)glyph->face ); +#endif +#endif + + + face = (TT_Face)glyph->face; + stream = face->root.stream; + + FT_ZERO( loader ); + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /* load execution context */ + if ( IS_HINTED( load_flags ) && !glyf_table_only ) + { + TT_ExecContext exec; + FT_Bool grayscale = TRUE; +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + FT_Bool subpixel_hinting_lean; + FT_Bool grayscale_cleartype; +#endif + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + FT_Bool subpixel_hinting = FALSE; + +#if 0 + /* not used yet */ + FT_Bool compatible_widths; + FT_Bool symmetrical_smoothing; + FT_Bool bgr; + FT_Bool vertical_lcd; + FT_Bool subpixel_positioned; + FT_Bool gray_cleartype; +#endif +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + FT_Bool reexecute = FALSE; + + + if ( size->bytecode_ready < 0 || size->cvt_ready < 0 ) + { + error = tt_size_ready_bytecode( size, pedantic ); + if ( error ) + return error; + } + else if ( size->bytecode_ready ) + return size->bytecode_ready; + else if ( size->cvt_ready ) + return size->cvt_ready; + + /* query new execution context */ + exec = size->context; + if ( !exec ) + return FT_THROW( Could_Not_Find_Context ); + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) + { + subpixel_hinting_lean = + FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != + FT_RENDER_MODE_MONO ); + grayscale_cleartype = + FT_BOOL( subpixel_hinting_lean && + !( ( load_flags & + FT_LOAD_TARGET_LCD ) || + ( load_flags & + FT_LOAD_TARGET_LCD_V ) ) ); + exec->vertical_lcd_lean = + FT_BOOL( subpixel_hinting_lean && + ( load_flags & + FT_LOAD_TARGET_LCD_V ) ); + } + else + { + subpixel_hinting_lean = FALSE; + grayscale_cleartype = FALSE; + exec->vertical_lcd_lean = FALSE; + } +#endif + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) + { + subpixel_hinting = FT_BOOL( ( FT_LOAD_TARGET_MODE( load_flags ) != + FT_RENDER_MODE_MONO ) && + SPH_OPTION_SET_SUBPIXEL ); + + if ( subpixel_hinting ) + grayscale = FALSE; + else if ( SPH_OPTION_SET_GRAYSCALE ) + { + grayscale = TRUE; + subpixel_hinting = FALSE; + } + else + grayscale = FALSE; + + if ( FT_IS_TRICKY( glyph->face ) ) + subpixel_hinting = FALSE; + + exec->ignore_x_mode = subpixel_hinting || grayscale; + exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION; + if ( exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 ) + exec->rasterizer_version = TT_INTERPRETER_VERSION_35; + +#if 1 + exec->compatible_widths = SPH_OPTION_SET_COMPATIBLE_WIDTHS; + exec->symmetrical_smoothing = TRUE; + exec->bgr = FALSE; + exec->vertical_lcd = FALSE; + exec->subpixel_positioned = TRUE; + exec->gray_cleartype = FALSE; +#else /* 0 */ + exec->compatible_widths = + FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != + TT_LOAD_COMPATIBLE_WIDTHS ); + exec->symmetrical_smoothing = + FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != + TT_LOAD_SYMMETRICAL_SMOOTHING ); + exec->bgr = + FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != + TT_LOAD_BGR ); + exec->vertical_lcd = + FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != + TT_LOAD_VERTICAL_LCD ); + exec->subpixel_positioned = + FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != + TT_LOAD_SUBPIXEL_POSITIONED ); + exec->gray_cleartype = + FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != + TT_LOAD_GRAY_CLEARTYPE ); +#endif /* 0 */ + + } + else + +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) + grayscale = FT_BOOL( !subpixel_hinting_lean && + FT_LOAD_TARGET_MODE( load_flags ) != + FT_RENDER_MODE_MONO ); + else +#endif + grayscale = FT_BOOL( FT_LOAD_TARGET_MODE( load_flags ) != + FT_RENDER_MODE_MONO ); + + error = TT_Load_Context( exec, face, size ); + if ( error ) + return error; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 ) + { + /* a change from mono to subpixel rendering (and vice versa) */ + /* requires a re-execution of the CVT program */ + if ( subpixel_hinting != exec->subpixel_hinting ) + { + FT_TRACE4(( "tt_loader_init: subpixel hinting change," + " re-executing `prep' table\n" )); + + exec->subpixel_hinting = subpixel_hinting; + reexecute = TRUE; + } + + /* a change from mono to grayscale rendering (and vice versa) */ + /* requires a re-execution of the CVT program */ + if ( grayscale != exec->grayscale ) + { + FT_TRACE4(( "tt_loader_init: grayscale hinting change," + " re-executing `prep' table\n" )); + + exec->grayscale = grayscale; + reexecute = TRUE; + } + } + else + +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + { + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_40 ) + { + /* a change from mono to subpixel rendering (and vice versa) */ + /* requires a re-execution of the CVT program */ + if ( subpixel_hinting_lean != exec->subpixel_hinting_lean ) + { + FT_TRACE4(( "tt_loader_init: subpixel hinting change," + " re-executing `prep' table\n" )); + + exec->subpixel_hinting_lean = subpixel_hinting_lean; + reexecute = TRUE; + } + + /* a change from colored to grayscale subpixel rendering (and */ + /* vice versa) requires a re-execution of the CVT program */ + if ( grayscale_cleartype != exec->grayscale_cleartype ) + { + FT_TRACE4(( "tt_loader_init: grayscale subpixel hinting change," + " re-executing `prep' table\n" )); + + exec->grayscale_cleartype = grayscale_cleartype; + reexecute = TRUE; + } + } +#endif + + /* a change from mono to grayscale rendering (and vice versa) */ + /* requires a re-execution of the CVT program */ + if ( grayscale != exec->grayscale ) + { + FT_TRACE4(( "tt_loader_init: grayscale hinting change," + " re-executing `prep' table\n" )); + + exec->grayscale = grayscale; + reexecute = TRUE; + } + } + + if ( reexecute ) + { + FT_UInt i; + + + for ( i = 0; i < size->cvt_size; i++ ) + size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); + error = tt_size_run_prep( size, pedantic ); + if ( error ) + return error; + } + + /* check whether the cvt program has disabled hinting */ + if ( exec->GS.instruct_control & 1 ) + load_flags |= FT_LOAD_NO_HINTING; + + /* load default graphics state -- if needed */ + if ( exec->GS.instruct_control & 2 ) + exec->GS = tt_default_graphics_state; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + /* check whether we have a font hinted for ClearType -- */ + /* note that this flag can also be modified in a glyph's bytecode */ + if ( driver->interpreter_version == TT_INTERPRETER_VERSION_38 && + exec->GS.instruct_control & 4 ) + exec->ignore_x_mode = 0; +#endif + + exec->pedantic_hinting = FT_BOOL( load_flags & FT_LOAD_PEDANTIC ); + loader->exec = exec; + loader->instructions = exec->glyphIns; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + /* get face's glyph loader */ + if ( !glyf_table_only ) + { + FT_GlyphLoader gloader = glyph->internal->loader; + + + FT_GlyphLoader_Rewind( gloader ); + loader->gloader = gloader; + } + + loader->load_flags = (FT_ULong)load_flags; + + loader->face = face; + loader->size = size; + loader->glyph = (FT_GlyphSlot)glyph; + loader->stream = stream; + + loader->composites.head = NULL; + loader->composites.tail = NULL; + + return FT_Err_Ok; + } + + + static void + tt_loader_done( TT_Loader loader ) + { + FT_List_Finalize( &loader->composites, + NULL, + loader->face->root.memory, + NULL ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Glyph */ + /* */ + /* */ + /* A function used to load a single glyph within a given glyph slot, */ + /* for a given size. */ + /* */ + /* */ + /* glyph :: A handle to a target slot object where the glyph */ + /* will be loaded. */ + /* */ + /* size :: A handle to the source face size at which the glyph */ + /* must be scaled/loaded. */ + /* */ + /* glyph_index :: The index of the glyph in the font file. */ + /* */ + /* load_flags :: A flag indicating what to load for this glyph. The */ + /* FT_LOAD_XXX constants can be used to control the */ + /* glyph loading process (e.g., whether the outline */ + /* should be scaled, whether to load bitmaps or not, */ + /* whether to hint the outline, etc). */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Load_Glyph( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ) + { + FT_Error error; + TT_LoaderRec loader; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#define IS_DEFAULT_INSTANCE ( !( FT_IS_NAMED_INSTANCE( glyph->face ) || \ + FT_IS_VARIATION( glyph->face ) ) ) +#else +#define IS_DEFAULT_INSTANCE 1 +#endif + + + FT_TRACE1(( "TT_Load_Glyph: glyph index %d\n", glyph_index )); + +#ifdef TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + /* try to load embedded bitmap (if any) */ + if ( size->strike_index != 0xFFFFFFFFUL && + ( load_flags & FT_LOAD_NO_BITMAP ) == 0 && + IS_DEFAULT_INSTANCE ) + { + FT_Fixed x_scale = size->root.metrics.x_scale; + FT_Fixed y_scale = size->root.metrics.y_scale; + + + error = load_sbit_image( size, glyph, glyph_index, load_flags ); + if ( FT_ERR_EQ( error, Missing_Bitmap ) ) + { + /* the bitmap strike is incomplete and misses the requested glyph; */ + /* if we have a bitmap-only font, return an empty glyph */ + if ( !FT_IS_SCALABLE( glyph->face ) ) + { + TT_Face face = (TT_Face)glyph->face; + + FT_Short left_bearing = 0; + FT_Short top_bearing = 0; + + FT_UShort advance_width = 0; + FT_UShort advance_height = 0; + + + /* to return an empty glyph, however, we need metrics data */ + /* from the `hmtx' (or `vmtx') table; the assumption is that */ + /* empty glyphs are missing intentionally, representing */ + /* whitespace - not having at least horizontal metrics is */ + /* thus considered an error */ + if ( !face->horz_metrics_size ) + return error; + + /* we now construct an empty bitmap glyph */ + TT_Get_HMetrics( face, glyph_index, + &left_bearing, + &advance_width ); + TT_Get_VMetrics( face, glyph_index, + 0, + &top_bearing, + &advance_height ); + + glyph->outline.n_points = 0; + glyph->outline.n_contours = 0; + + glyph->metrics.width = 0; + glyph->metrics.height = 0; + + glyph->metrics.horiBearingX = FT_MulFix( left_bearing, x_scale ); + glyph->metrics.horiBearingY = 0; + glyph->metrics.horiAdvance = FT_MulFix( advance_width, x_scale ); + + glyph->metrics.vertBearingX = 0; + glyph->metrics.vertBearingY = FT_MulFix( top_bearing, y_scale ); + glyph->metrics.vertAdvance = FT_MulFix( advance_height, y_scale ); + + glyph->format = FT_GLYPH_FORMAT_BITMAP; + glyph->bitmap.pixel_mode = FT_PIXEL_MODE_MONO; + + glyph->bitmap_left = 0; + glyph->bitmap_top = 0; + + return FT_Err_Ok; + } + } + else if ( error ) + { + /* return error if font is not scalable */ + if ( !FT_IS_SCALABLE( glyph->face ) ) + return error; + } + else + { + if ( FT_IS_SCALABLE( glyph->face ) ) + { + /* for the bbox we need the header only */ + (void)tt_loader_init( &loader, size, glyph, load_flags, TRUE ); + (void)load_truetype_glyph( &loader, glyph_index, 0, TRUE ); + tt_loader_done( &loader ); + glyph->linearHoriAdvance = loader.linear; + glyph->linearVertAdvance = loader.vadvance; + + /* sanity checks: if `xxxAdvance' in the sbit metric */ + /* structure isn't set, use `linearXXXAdvance' */ + if ( !glyph->metrics.horiAdvance && glyph->linearHoriAdvance ) + glyph->metrics.horiAdvance = FT_MulFix( glyph->linearHoriAdvance, + x_scale ); + if ( !glyph->metrics.vertAdvance && glyph->linearVertAdvance ) + glyph->metrics.vertAdvance = FT_MulFix( glyph->linearVertAdvance, + y_scale ); + } + + return FT_Err_Ok; + } + } + +#endif /* TT_CONFIG_OPTION_EMBEDDED_BITMAPS */ + + /* if FT_LOAD_NO_SCALE is not set, `ttmetrics' must be valid */ + if ( !( load_flags & FT_LOAD_NO_SCALE ) && !size->ttmetrics.valid ) + { + error = FT_THROW( Invalid_Size_Handle ); + goto Exit; + } + + if ( load_flags & FT_LOAD_SBITS_ONLY ) + { + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + + error = tt_loader_init( &loader, size, glyph, load_flags, FALSE ); + if ( error ) + goto Exit; + + glyph->format = FT_GLYPH_FORMAT_OUTLINE; + glyph->num_subglyphs = 0; + glyph->outline.flags = 0; + + /* main loading loop */ + error = load_truetype_glyph( &loader, glyph_index, 0, FALSE ); + if ( !error ) + { + if ( glyph->format == FT_GLYPH_FORMAT_COMPOSITE ) + { + glyph->num_subglyphs = loader.gloader->base.num_subglyphs; + glyph->subglyphs = loader.gloader->base.subglyphs; + } + else + { + glyph->outline = loader.gloader->base.outline; + glyph->outline.flags &= ~FT_OUTLINE_SINGLE_PASS; + + /* Translate array so that (0,0) is the glyph's origin. Note */ + /* that this behaviour is independent on the value of bit 1 of */ + /* the `flags' field in the `head' table -- at least major */ + /* applications like Acroread indicate that. */ + if ( loader.pp1.x ) + FT_Outline_Translate( &glyph->outline, -loader.pp1.x, 0 ); + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + + if ( IS_HINTED( load_flags ) ) + { + if ( loader.exec->GS.scan_control ) + { + /* convert scan conversion mode to FT_OUTLINE_XXX flags */ + switch ( loader.exec->GS.scan_type ) + { + case 0: /* simple drop-outs including stubs */ + glyph->outline.flags |= FT_OUTLINE_INCLUDE_STUBS; + break; + case 1: /* simple drop-outs excluding stubs */ + /* nothing; it's the default rendering mode */ + break; + case 4: /* smart drop-outs including stubs */ + glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS | + FT_OUTLINE_INCLUDE_STUBS; + break; + case 5: /* smart drop-outs excluding stubs */ + glyph->outline.flags |= FT_OUTLINE_SMART_DROPOUTS; + break; + + default: /* no drop-out control */ + glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; + break; + } + } + else + glyph->outline.flags |= FT_OUTLINE_IGNORE_DROPOUTS; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + error = compute_glyph_metrics( &loader, glyph_index ); + } + + tt_loader_done( &loader ); + + /* Set the `high precision' bit flag. */ + /* This is _critical_ to get correct output for monochrome */ + /* TrueType glyphs at all sizes using the bytecode interpreter. */ + /* */ + if ( !( load_flags & FT_LOAD_NO_SCALE ) && + size->metrics->y_ppem < 24 ) + glyph->outline.flags |= FT_OUTLINE_HIGH_PRECISION; + + Exit: +#ifdef FT_DEBUG_LEVEL_TRACE + if ( error ) + FT_TRACE1(( " failed (error code 0x%x)\n", + error )); +#endif + + return error; + } + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttgload.h b/vendor/FreeType2/src/truetype/ttgload.h new file mode 100644 index 0000000..d237cfd --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttgload.h @@ -0,0 +1,62 @@ +/***************************************************************************/ +/* */ +/* ttgload.h */ +/* */ +/* TrueType Glyph Loader (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTGLOAD_H_ +#define TTGLOAD_H_ + + +#include +#include "ttobjs.h" + +#ifdef TT_USE_BYTECODE_INTERPRETER +#include "ttinterp.h" +#endif + + +FT_BEGIN_HEADER + + + FT_LOCAL( void ) + TT_Init_Glyph_Loading( TT_Face face ); + + FT_LOCAL( void ) + TT_Get_HMetrics( TT_Face face, + FT_UInt idx, + FT_Short* lsb, + FT_UShort* aw ); + + FT_LOCAL( void ) + TT_Get_VMetrics( TT_Face face, + FT_UInt idx, + FT_Pos yMax, + FT_Short* tsb, + FT_UShort* ah ); + + FT_LOCAL( FT_Error ) + TT_Load_Glyph( TT_Size size, + TT_GlyphSlot glyph, + FT_UInt glyph_index, + FT_Int32 load_flags ); + + +FT_END_HEADER + +#endif /* TTGLOAD_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttgxvar.c b/vendor/FreeType2/src/truetype/ttgxvar.c new file mode 100644 index 0000000..29ab2a4 --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttgxvar.c @@ -0,0 +1,4074 @@ +/***************************************************************************/ +/* */ +/* ttgxvar.c */ +/* */ +/* TrueType GX Font Variation loader */ +/* */ +/* Copyright 2004-2018 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg, and George Williams. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Apple documents the `fvar', `gvar', `cvar', and `avar' tables at */ + /* */ + /* https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6[fgca]var.html */ + /* */ + /* The documentation for `gvar' is not intelligible; `cvar' refers you */ + /* to `gvar' and is thus also incomprehensible. */ + /* */ + /* The documentation for `avar' appears correct, but Apple has no fonts */ + /* with an `avar' table, so it is hard to test. */ + /* */ + /* Many thanks to John Jenkins (at Apple) in figuring this out. */ + /* */ + /* */ + /* Apple's `kern' table has some references to tuple indices, but as */ + /* there is no indication where these indices are defined, nor how to */ + /* interpolate the kerning values (different tuples have different */ + /* classes) this issue is ignored. */ + /* */ + /*************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_CONFIG_CONFIG_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_TRUETYPE_TAGS_H +#include FT_TRUETYPE_IDS_H +#include FT_MULTIPLE_MASTERS_H +#include FT_LIST_H + +#include "ttpload.h" +#include "ttgxvar.h" + +#include "tterrors.h" + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + +#define FT_Stream_FTell( stream ) \ + (FT_ULong)( (stream)->cursor - (stream)->base ) +#define FT_Stream_SeekSet( stream, off ) \ + (stream)->cursor = \ + ( (off) < (FT_ULong)( (stream)->limit - (stream)->base ) ) \ + ? (stream)->base + (off) \ + : (stream)->limit + + + /*************************************************************************/ + /* */ + /* 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_ttgxvar + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** Internal Routines *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* The macro ALL_POINTS is used in `ft_var_readpackedpoints'. It */ + /* indicates that there is a delta for every point without needing to */ + /* enumerate all of them. */ + /* */ + + /* ensure that value `0' has the same width as a pointer */ +#define ALL_POINTS (FT_UShort*)~(FT_PtrDist)0 + + +#define GX_PT_POINTS_ARE_WORDS 0x80U +#define GX_PT_POINT_RUN_COUNT_MASK 0x7FU + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_readpackedpoints */ + /* */ + /* */ + /* Read a set of points to which the following deltas will apply. */ + /* Points are packed with a run length encoding. */ + /* */ + /* */ + /* stream :: The data stream. */ + /* */ + /* size :: The size of the table holding the data. */ + /* */ + /* */ + /* point_cnt :: The number of points read. A zero value means that */ + /* all points in the glyph will be affected, without */ + /* enumerating them individually. */ + /* */ + /* */ + /* An array of FT_UShort containing the affected points or the */ + /* special value ALL_POINTS. */ + /* */ + static FT_UShort* + ft_var_readpackedpoints( FT_Stream stream, + FT_ULong size, + FT_UInt *point_cnt ) + { + FT_UShort *points = NULL; + FT_UInt n; + FT_UInt runcnt; + FT_UInt i, j; + FT_UShort first; + FT_Memory memory = stream->memory; + FT_Error error = FT_Err_Ok; + + FT_UNUSED( error ); + + + *point_cnt = 0; + + n = FT_GET_BYTE(); + if ( n == 0 ) + return ALL_POINTS; + + if ( n & GX_PT_POINTS_ARE_WORDS ) + { + n &= GX_PT_POINT_RUN_COUNT_MASK; + n <<= 8; + n |= FT_GET_BYTE(); + } + + if ( n > size ) + { + FT_TRACE1(( "ft_var_readpackedpoints: number of points too large\n" )); + return NULL; + } + + /* in the nested loops below we increase `i' twice; */ + /* it is faster to simply allocate one more slot */ + /* than to add another test within the loop */ + if ( FT_NEW_ARRAY( points, n + 1 ) ) + return NULL; + + *point_cnt = n; + + first = 0; + i = 0; + while ( i < n ) + { + runcnt = FT_GET_BYTE(); + if ( runcnt & GX_PT_POINTS_ARE_WORDS ) + { + runcnt &= GX_PT_POINT_RUN_COUNT_MASK; + first += FT_GET_USHORT(); + points[i++] = first; + + /* first point not included in run count */ + for ( j = 0; j < runcnt; j++ ) + { + first += FT_GET_USHORT(); + points[i++] = first; + if ( i >= n ) + break; + } + } + else + { + first += FT_GET_BYTE(); + points[i++] = first; + + for ( j = 0; j < runcnt; j++ ) + { + first += FT_GET_BYTE(); + points[i++] = first; + if ( i >= n ) + break; + } + } + } + + return points; + } + + +#define GX_DT_DELTAS_ARE_ZERO 0x80U +#define GX_DT_DELTAS_ARE_WORDS 0x40U +#define GX_DT_DELTA_RUN_COUNT_MASK 0x3FU + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_readpackeddeltas */ + /* */ + /* */ + /* Read a set of deltas. These are packed slightly differently than */ + /* points. In particular there is no overall count. */ + /* */ + /* */ + /* stream :: The data stream. */ + /* */ + /* size :: The size of the table holding the data. */ + /* */ + /* delta_cnt :: The number of deltas to be read. */ + /* */ + /* */ + /* An array of FT_Short containing the deltas for the affected */ + /* points. (This only gets the deltas for one dimension. It will */ + /* generally be called twice, once for x, once for y. When used in */ + /* cvt table, it will only be called once.) */ + /* */ + static FT_Short* + ft_var_readpackeddeltas( FT_Stream stream, + FT_ULong size, + FT_UInt delta_cnt ) + { + FT_Short *deltas = NULL; + FT_UInt runcnt, cnt; + FT_UInt i, j; + FT_Memory memory = stream->memory; + FT_Error error = FT_Err_Ok; + + FT_UNUSED( error ); + + + if ( delta_cnt > size ) + { + FT_TRACE1(( "ft_var_readpackeddeltas: number of points too large\n" )); + return NULL; + } + + if ( FT_NEW_ARRAY( deltas, delta_cnt ) ) + return NULL; + + i = 0; + while ( i < delta_cnt ) + { + runcnt = FT_GET_BYTE(); + cnt = runcnt & GX_DT_DELTA_RUN_COUNT_MASK; + + if ( runcnt & GX_DT_DELTAS_ARE_ZERO ) + { + /* `runcnt' zeroes get added */ + for ( j = 0; j <= cnt && i < delta_cnt; j++ ) + deltas[i++] = 0; + } + else if ( runcnt & GX_DT_DELTAS_ARE_WORDS ) + { + /* `runcnt' shorts from the stack */ + for ( j = 0; j <= cnt && i < delta_cnt; j++ ) + deltas[i++] = FT_GET_SHORT(); + } + else + { + /* `runcnt' signed bytes from the stack */ + for ( j = 0; j <= cnt && i < delta_cnt; j++ ) + deltas[i++] = FT_GET_CHAR(); + } + + if ( j <= cnt ) + { + /* bad format */ + FT_FREE( deltas ); + return NULL; + } + } + + return deltas; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_load_avar */ + /* */ + /* */ + /* Parse the `avar' table if present. It need not be, so we return */ + /* nothing. */ + /* */ + /* */ + /* face :: The font face. */ + /* */ + static void + ft_var_load_avar( TT_Face face ) + { + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + GX_Blend blend = face->blend; + GX_AVarSegment segment; + FT_Error error = FT_Err_Ok; + FT_Long version; + FT_Long axisCount; + FT_Int i, j; + FT_ULong table_len; + + FT_UNUSED( error ); + + + FT_TRACE2(( "AVAR " )); + + blend->avar_loaded = TRUE; + error = face->goto_table( face, TTAG_avar, stream, &table_len ); + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + return; + } + + if ( FT_FRAME_ENTER( table_len ) ) + return; + + version = FT_GET_LONG(); + axisCount = FT_GET_LONG(); + + if ( version != 0x00010000L ) + { + FT_TRACE2(( "bad table version\n" )); + goto Exit; + } + + FT_TRACE2(( "loaded\n" )); + + if ( axisCount != (FT_Long)blend->mmvar->num_axis ) + { + FT_TRACE2(( "ft_var_load_avar: number of axes in `avar' and `fvar'\n" + " table are different\n" )); + goto Exit; + } + + if ( FT_NEW_ARRAY( blend->avar_segment, axisCount ) ) + goto Exit; + + segment = &blend->avar_segment[0]; + for ( i = 0; i < axisCount; i++, segment++ ) + { + FT_TRACE5(( " axis %d:\n", i )); + + segment->pairCount = FT_GET_USHORT(); + if ( (FT_ULong)segment->pairCount * 4 > table_len || + FT_NEW_ARRAY( segment->correspondence, segment->pairCount ) ) + { + /* Failure. Free everything we have done so far. We must do */ + /* it right now since loading the `avar' table is optional. */ + + for ( j = i - 1; j >= 0; j-- ) + FT_FREE( blend->avar_segment[j].correspondence ); + + FT_FREE( blend->avar_segment ); + blend->avar_segment = NULL; + goto Exit; + } + + for ( j = 0; j < segment->pairCount; j++ ) + { + /* convert to Fixed */ + segment->correspondence[j].fromCoord = FT_GET_SHORT() * 4; + segment->correspondence[j].toCoord = FT_GET_SHORT() * 4; + + FT_TRACE5(( " mapping %.5f to %.5f\n", + segment->correspondence[j].fromCoord / 65536.0, + segment->correspondence[j].toCoord / 65536.0 )); + } + + FT_TRACE5(( "\n" )); + } + + Exit: + FT_FRAME_EXIT(); + } + + + /* some macros we need */ +#define FT_FIXED_ONE ( (FT_Fixed)0x10000 ) + +#define FT_fdot14ToFixed( x ) \ + ( (FT_Fixed)( (FT_ULong)(x) << 2 ) ) +#define FT_intToFixed( i ) \ + ( (FT_Fixed)( (FT_ULong)(i) << 16 ) ) +#define FT_fixedToInt( x ) \ + ( (FT_Short)( ( (FT_UInt32)(x) + 0x8000U ) >> 16 ) ) + + + static FT_Error + ft_var_load_item_variation_store( TT_Face face, + FT_ULong offset, + GX_ItemVarStore itemStore ) + { + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + + FT_Error error; + FT_UShort format; + FT_ULong region_offset; + FT_UInt i, j, k; + FT_UInt shortDeltaCount; + + GX_Blend blend = face->blend; + GX_ItemVarData varData; + + FT_ULong* dataOffsetArray = NULL; + + + if ( FT_STREAM_SEEK( offset ) || + FT_READ_USHORT( format ) ) + goto Exit; + + if ( format != 1 ) + { + FT_TRACE2(( "ft_var_load_item_variation_store: bad store format %d\n", + format )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* read top level fields */ + if ( FT_READ_ULONG( region_offset ) || + FT_READ_USHORT( itemStore->dataCount ) ) + goto Exit; + + /* we need at least one entry in `itemStore->varData' */ + if ( !itemStore->dataCount ) + { + FT_TRACE2(( "ft_var_load_item_variation_store: missing varData\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* make temporary copy of item variation data offsets; */ + /* we will parse region list first, then come back */ + if ( FT_NEW_ARRAY( dataOffsetArray, itemStore->dataCount ) ) + goto Exit; + + for ( i = 0; i < itemStore->dataCount; i++ ) + { + if ( FT_READ_ULONG( dataOffsetArray[i] ) ) + goto Exit; + } + + /* parse array of region records (region list) */ + if ( FT_STREAM_SEEK( offset + region_offset ) ) + goto Exit; + + if ( FT_READ_USHORT( itemStore->axisCount ) || + FT_READ_USHORT( itemStore->regionCount ) ) + goto Exit; + + if ( itemStore->axisCount != (FT_Long)blend->mmvar->num_axis ) + { + FT_TRACE2(( "ft_var_load_item_variation_store:" + " number of axes in item variation store\n" + " " + " and `fvar' table are different\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( FT_NEW_ARRAY( itemStore->varRegionList, itemStore->regionCount ) ) + goto Exit; + + for ( i = 0; i < itemStore->regionCount; i++ ) + { + GX_AxisCoords axisCoords; + + + if ( FT_NEW_ARRAY( itemStore->varRegionList[i].axisList, + itemStore->axisCount ) ) + goto Exit; + + axisCoords = itemStore->varRegionList[i].axisList; + + for ( j = 0; j < itemStore->axisCount; j++ ) + { + FT_Short start, peak, end; + + + if ( FT_READ_SHORT( start ) || + FT_READ_SHORT( peak ) || + FT_READ_SHORT( end ) ) + goto Exit; + + axisCoords[j].startCoord = FT_fdot14ToFixed( start ); + axisCoords[j].peakCoord = FT_fdot14ToFixed( peak ); + axisCoords[j].endCoord = FT_fdot14ToFixed( end ); + } + } + + /* end of region list parse */ + + /* use dataOffsetArray now to parse varData items */ + if ( FT_NEW_ARRAY( itemStore->varData, itemStore->dataCount ) ) + goto Exit; + + for ( i = 0; i < itemStore->dataCount; i++ ) + { + varData = &itemStore->varData[i]; + + if ( FT_STREAM_SEEK( offset + dataOffsetArray[i] ) ) + goto Exit; + + if ( FT_READ_USHORT( varData->itemCount ) || + FT_READ_USHORT( shortDeltaCount ) || + FT_READ_USHORT( varData->regionIdxCount ) ) + goto Exit; + + /* check some data consistency */ + if ( shortDeltaCount > varData->regionIdxCount ) + { + FT_TRACE2(( "bad short count %d or region count %d\n", + shortDeltaCount, + varData->regionIdxCount )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( varData->regionIdxCount > itemStore->regionCount ) + { + FT_TRACE2(( "inconsistent regionCount %d in varData[%d]\n", + varData->regionIdxCount, + i )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* parse region indices */ + if ( FT_NEW_ARRAY( varData->regionIndices, + varData->regionIdxCount ) ) + goto Exit; + + for ( j = 0; j < varData->regionIdxCount; j++ ) + { + if ( FT_READ_USHORT( varData->regionIndices[j] ) ) + goto Exit; + + if ( varData->regionIndices[j] >= itemStore->regionCount ) + { + FT_TRACE2(( "bad region index %d\n", + varData->regionIndices[j] )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + } + + /* Parse delta set. */ + /* */ + /* On input, deltas are (shortDeltaCount + regionIdxCount) bytes */ + /* each; on output, deltas are expanded to `regionIdxCount' shorts */ + /* each. */ + if ( FT_NEW_ARRAY( varData->deltaSet, + varData->regionIdxCount * varData->itemCount ) ) + goto Exit; + + /* the delta set is stored as a 2-dimensional array of shorts; */ + /* sign-extend signed bytes to signed shorts */ + for ( j = 0; j < varData->itemCount * varData->regionIdxCount; ) + { + for ( k = 0; k < shortDeltaCount; k++, j++ ) + { + /* read the short deltas */ + FT_Short delta; + + + if ( FT_READ_SHORT( delta ) ) + goto Exit; + + varData->deltaSet[j] = delta; + } + + for ( ; k < varData->regionIdxCount; k++, j++ ) + { + /* read the (signed) byte deltas */ + FT_Char delta; + + + if ( FT_READ_CHAR( delta ) ) + goto Exit; + + varData->deltaSet[j] = delta; + } + } + } + + Exit: + FT_FREE( dataOffsetArray ); + + return error; + } + + + static FT_Error + ft_var_load_delta_set_index_mapping( TT_Face face, + FT_ULong offset, + GX_DeltaSetIdxMap map, + GX_ItemVarStore itemStore ) + { + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + + FT_Error error; + + FT_UShort format; + FT_UInt entrySize; + FT_UInt innerBitCount; + FT_UInt innerIndexMask; + FT_UInt i, j; + + + if ( FT_STREAM_SEEK( offset ) || + FT_READ_USHORT( format ) || + FT_READ_USHORT( map->mapCount ) ) + goto Exit; + + if ( format & 0xFFC0 ) + { + FT_TRACE2(( "bad map format %d\n", format )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* bytes per entry: 1, 2, 3, or 4 */ + entrySize = ( ( format & 0x0030 ) >> 4 ) + 1; + innerBitCount = ( format & 0x000F ) + 1; + innerIndexMask = ( 1 << innerBitCount ) - 1; + + if ( FT_NEW_ARRAY( map->innerIndex, map->mapCount ) ) + goto Exit; + + if ( FT_NEW_ARRAY( map->outerIndex, map->mapCount ) ) + goto Exit; + + for ( i = 0; i < map->mapCount; i++ ) + { + FT_UInt mapData = 0; + FT_UInt outerIndex, innerIndex; + + + /* read map data one unsigned byte at a time, big endian */ + for ( j = 0; j < entrySize; j++ ) + { + FT_Byte data; + + + if ( FT_READ_BYTE( data ) ) + goto Exit; + + mapData = ( mapData << 8 ) | data; + } + + outerIndex = mapData >> innerBitCount; + + if ( outerIndex >= itemStore->dataCount ) + { + FT_TRACE2(( "outerIndex[%d] == %d out of range\n", + i, + outerIndex )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + map->outerIndex[i] = outerIndex; + + innerIndex = mapData & innerIndexMask; + + if ( innerIndex >= itemStore->varData[outerIndex].itemCount ) + { + FT_TRACE2(( "innerIndex[%d] == %d out of range\n", + i, + innerIndex )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + map->innerIndex[i] = innerIndex; + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_load_hvvar */ + /* */ + /* */ + /* If `vertical' is zero, parse the `HVAR' table and set */ + /* `blend->hvar_loaded' to TRUE. On success, `blend->hvar_checked' */ + /* is set to TRUE. */ + /* */ + /* If `vertical' is not zero, parse the `VVAR' table and set */ + /* `blend->vvar_loaded' to TRUE. On success, `blend->vvar_checked' */ + /* is set to TRUE. */ + /* */ + /* Some memory may remain allocated on error; it is always freed in */ + /* `tt_done_blend', however. */ + /* */ + /* */ + /* face :: The font face. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + ft_var_load_hvvar( TT_Face face, + FT_Bool vertical ) + { + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + + GX_Blend blend = face->blend; + + GX_HVVarTable table; + + FT_Error error; + FT_UShort majorVersion; + FT_ULong table_len; + FT_ULong table_offset; + FT_ULong store_offset; + FT_ULong widthMap_offset; + + + if ( vertical ) + { + blend->vvar_loaded = TRUE; + + FT_TRACE2(( "VVAR " )); + + error = face->goto_table( face, TTAG_VVAR, stream, &table_len ); + } + else + { + blend->hvar_loaded = TRUE; + + FT_TRACE2(( "HVAR " )); + + error = face->goto_table( face, TTAG_HVAR, stream, &table_len ); + } + + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + goto Exit; + } + + table_offset = FT_STREAM_POS(); + + /* skip minor version */ + if ( FT_READ_USHORT( majorVersion ) || + FT_STREAM_SKIP( 2 ) ) + goto Exit; + + if ( majorVersion != 1 ) + { + FT_TRACE2(( "bad table version %d\n", majorVersion )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( FT_READ_ULONG( store_offset ) || + FT_READ_ULONG( widthMap_offset ) ) + goto Exit; + + if ( vertical ) + { + if ( FT_NEW( blend->vvar_table ) ) + goto Exit; + table = blend->vvar_table; + } + else + { + if ( FT_NEW( blend->hvar_table ) ) + goto Exit; + table = blend->hvar_table; + } + + error = ft_var_load_item_variation_store( + face, + table_offset + store_offset, + &table->itemStore ); + if ( error ) + goto Exit; + + if ( widthMap_offset ) + { + error = ft_var_load_delta_set_index_mapping( + face, + table_offset + widthMap_offset, + &table->widthMap, + &table->itemStore ); + if ( error ) + goto Exit; + } + + FT_TRACE2(( "loaded\n" )); + error = FT_Err_Ok; + + Exit: + if ( !error ) + { + if ( vertical ) + { + blend->vvar_checked = TRUE; + + /* FreeType doesn't provide functions to quickly retrieve */ + /* TSB, BSB, or VORG values; we thus don't have to implement */ + /* support for those three item variation stores. */ + + face->variation_support |= TT_FACE_FLAG_VAR_VADVANCE; + } + else + { + blend->hvar_checked = TRUE; + + /* FreeType doesn't provide functions to quickly retrieve */ + /* LSB or RSB values; we thus don't have to implement */ + /* support for those two item variation stores. */ + + face->variation_support |= TT_FACE_FLAG_VAR_HADVANCE; + } + } + + return error; + } + + + static FT_Int + ft_var_get_item_delta( TT_Face face, + GX_ItemVarStore itemStore, + FT_UInt outerIndex, + FT_UInt innerIndex ) + { + GX_ItemVarData varData; + FT_Short* deltaSet; + + FT_UInt master, j; + FT_Fixed netAdjustment = 0; /* accumulated adjustment */ + FT_Fixed scaledDelta; + FT_Fixed delta; + + + /* See pseudo code from `Font Variations Overview' */ + /* in the OpenType specification. */ + + varData = &itemStore->varData[outerIndex]; + deltaSet = &varData->deltaSet[varData->regionIdxCount * innerIndex]; + + /* outer loop steps through master designs to be blended */ + for ( master = 0; master < varData->regionIdxCount; master++ ) + { + FT_Fixed scalar = FT_FIXED_ONE; + FT_UInt regionIndex = varData->regionIndices[master]; + + GX_AxisCoords axis = itemStore->varRegionList[regionIndex].axisList; + + + /* inner loop steps through axes in this region */ + for ( j = 0; j < itemStore->axisCount; j++, axis++ ) + { + FT_Fixed axisScalar; + + + /* compute the scalar contribution of this axis; */ + /* ignore invalid ranges */ + if ( axis->startCoord > axis->peakCoord || + axis->peakCoord > axis->endCoord ) + axisScalar = FT_FIXED_ONE; + + else if ( axis->startCoord < 0 && + axis->endCoord > 0 && + axis->peakCoord != 0 ) + axisScalar = FT_FIXED_ONE; + + /* peak of 0 means ignore this axis */ + else if ( axis->peakCoord == 0 ) + axisScalar = FT_FIXED_ONE; + + /* ignore this region if coords are out of range */ + else if ( face->blend->normalizedcoords[j] < axis->startCoord || + face->blend->normalizedcoords[j] > axis->endCoord ) + axisScalar = 0; + + /* calculate a proportional factor */ + else + { + if ( face->blend->normalizedcoords[j] == axis->peakCoord ) + axisScalar = FT_FIXED_ONE; + else if ( face->blend->normalizedcoords[j] < axis->peakCoord ) + axisScalar = + FT_DivFix( face->blend->normalizedcoords[j] - axis->startCoord, + axis->peakCoord - axis->startCoord ); + else + axisScalar = + FT_DivFix( axis->endCoord - face->blend->normalizedcoords[j], + axis->endCoord - axis->peakCoord ); + } + + /* take product of all the axis scalars */ + scalar = FT_MulFix( scalar, axisScalar ); + + } /* per-axis loop */ + + /* get the scaled delta for this region */ + delta = FT_intToFixed( deltaSet[master] ); + scaledDelta = FT_MulFix( scalar, delta ); + + /* accumulate the adjustments from each region */ + netAdjustment = netAdjustment + scaledDelta; + + } /* per-region loop */ + + return FT_fixedToInt( netAdjustment ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_hvadvance_adjust */ + /* */ + /* */ + /* Apply `HVAR' advance width or `VVAR' advance height adjustment of */ + /* a given glyph. */ + /* */ + /* */ + /* gindex :: The glyph index. */ + /* */ + /* vertical :: If set, handle `VVAR' table. */ + /* */ + /* */ + /* face :: The font face. */ + /* */ + /* adelta :: Points to width or height value that gets modified. */ + /* */ + static FT_Error + tt_hvadvance_adjust( TT_Face face, + FT_UInt gindex, + FT_Int *avalue, + FT_Bool vertical ) + { + FT_Error error = FT_Err_Ok; + FT_UInt innerIndex, outerIndex; + FT_Int delta; + + GX_HVVarTable table; + + + if ( !face->doblend || !face->blend ) + goto Exit; + + if ( vertical ) + { + if ( !face->blend->vvar_loaded ) + { + /* initialize vvar table */ + face->blend->vvar_error = ft_var_load_hvvar( face, 1 ); + } + + if ( !face->blend->vvar_checked ) + { + error = face->blend->vvar_error; + goto Exit; + } + + table = face->blend->vvar_table; + } + else + { + if ( !face->blend->hvar_loaded ) + { + /* initialize hvar table */ + face->blend->hvar_error = ft_var_load_hvvar( face, 0 ); + } + + if ( !face->blend->hvar_checked ) + { + error = face->blend->hvar_error; + goto Exit; + } + + table = face->blend->hvar_table; + } + + /* advance width or height adjustments are always present in an */ + /* `HVAR' or `VVAR' table; no need to test for this capability */ + + if ( table->widthMap.innerIndex ) + { + FT_UInt idx = gindex; + + + if ( idx >= table->widthMap.mapCount ) + idx = table->widthMap.mapCount - 1; + + /* trust that HVAR parser has checked indices */ + outerIndex = table->widthMap.outerIndex[idx]; + innerIndex = table->widthMap.innerIndex[idx]; + } + else + { + GX_ItemVarData varData; + + + /* no widthMap data */ + outerIndex = 0; + innerIndex = gindex; + + varData = &table->itemStore.varData[outerIndex]; + if ( gindex >= varData->itemCount ) + { + FT_TRACE2(( "gindex %d out of range\n", gindex )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + } + + delta = ft_var_get_item_delta( face, + &table->itemStore, + outerIndex, + innerIndex ); + + FT_TRACE5(( "%s value %d adjusted by %d unit%s (%s)\n", + vertical ? "vertical height" : "horizontal width", + *avalue, + delta, + delta == 1 ? "" : "s", + vertical ? "VVAR" : "HVAR" )); + + *avalue += delta; + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_hadvance_adjust( TT_Face face, + FT_UInt gindex, + FT_Int *avalue ) + { + return tt_hvadvance_adjust( face, gindex, avalue, 0 ); + } + + + FT_LOCAL_DEF( FT_Error ) + tt_vadvance_adjust( TT_Face face, + FT_UInt gindex, + FT_Int *avalue ) + { + return tt_hvadvance_adjust( face, gindex, avalue, 1 ); + } + + +#define GX_VALUE_SIZE 8 + + /* all values are FT_Short or FT_UShort entities; */ + /* we treat them consistently as FT_Short */ +#define GX_VALUE_CASE( tag, dflt ) \ + case MVAR_TAG_ ## tag : \ + p = (FT_Short*)&face->dflt; \ + break + +#define GX_GASP_CASE( idx ) \ + case MVAR_TAG_GASP_ ## idx : \ + if ( idx < face->gasp.numRanges - 1 ) \ + p = (FT_Short*)&face->gasp.gaspRanges[idx].maxPPEM; \ + else \ + p = NULL; \ + break + + + static FT_Short* + ft_var_get_value_pointer( TT_Face face, + FT_ULong mvar_tag ) + { + FT_Short* p; + + + switch ( mvar_tag ) + { + GX_GASP_CASE( 0 ); + GX_GASP_CASE( 1 ); + GX_GASP_CASE( 2 ); + GX_GASP_CASE( 3 ); + GX_GASP_CASE( 4 ); + GX_GASP_CASE( 5 ); + GX_GASP_CASE( 6 ); + GX_GASP_CASE( 7 ); + GX_GASP_CASE( 8 ); + GX_GASP_CASE( 9 ); + + GX_VALUE_CASE( CPHT, os2.sCapHeight ); + GX_VALUE_CASE( HASC, os2.sTypoAscender ); + GX_VALUE_CASE( HCLA, os2.usWinAscent ); + GX_VALUE_CASE( HCLD, os2.usWinDescent ); + GX_VALUE_CASE( HCOF, horizontal.caret_Offset ); + GX_VALUE_CASE( HCRN, horizontal.caret_Slope_Run ); + GX_VALUE_CASE( HCRS, horizontal.caret_Slope_Rise ); + GX_VALUE_CASE( HDSC, os2.sTypoDescender ); + GX_VALUE_CASE( HLGP, os2.sTypoLineGap ); + GX_VALUE_CASE( SBXO, os2.ySubscriptXOffset); + GX_VALUE_CASE( SBXS, os2.ySubscriptXSize ); + GX_VALUE_CASE( SBYO, os2.ySubscriptYOffset ); + GX_VALUE_CASE( SBYS, os2.ySubscriptYSize ); + GX_VALUE_CASE( SPXO, os2.ySuperscriptXOffset ); + GX_VALUE_CASE( SPXS, os2.ySuperscriptXSize ); + GX_VALUE_CASE( SPYO, os2.ySuperscriptYOffset ); + GX_VALUE_CASE( SPYS, os2.ySuperscriptYSize ); + GX_VALUE_CASE( STRO, os2.yStrikeoutPosition ); + GX_VALUE_CASE( STRS, os2.yStrikeoutSize ); + GX_VALUE_CASE( UNDO, postscript.underlinePosition ); + GX_VALUE_CASE( UNDS, postscript.underlineThickness ); + GX_VALUE_CASE( VASC, vertical.Ascender ); + GX_VALUE_CASE( VCOF, vertical.caret_Offset ); + GX_VALUE_CASE( VCRN, vertical.caret_Slope_Run ); + GX_VALUE_CASE( VCRS, vertical.caret_Slope_Rise ); + GX_VALUE_CASE( VDSC, vertical.Descender ); + GX_VALUE_CASE( VLGP, vertical.Line_Gap ); + GX_VALUE_CASE( XHGT, os2.sxHeight ); + + default: + /* ignore unknown tag */ + p = NULL; + } + + return p; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_load_mvar */ + /* */ + /* */ + /* Parse the `MVAR' table. */ + /* */ + /* Some memory may remain allocated on error; it is always freed in */ + /* `tt_done_blend', however. */ + /* */ + /* */ + /* face :: The font face. */ + /* */ + static void + ft_var_load_mvar( TT_Face face ) + { + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + + GX_Blend blend = face->blend; + GX_ItemVarStore itemStore; + GX_Value value, limit; + + FT_Error error; + FT_UShort majorVersion; + FT_ULong table_len; + FT_ULong table_offset; + FT_UShort store_offset; + FT_ULong records_offset; + + + FT_TRACE2(( "MVAR " )); + + error = face->goto_table( face, TTAG_MVAR, stream, &table_len ); + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + return; + } + + table_offset = FT_STREAM_POS(); + + /* skip minor version */ + if ( FT_READ_USHORT( majorVersion ) || + FT_STREAM_SKIP( 2 ) ) + return; + + if ( majorVersion != 1 ) + { + FT_TRACE2(( "bad table version %d\n", majorVersion )); + return; + } + + if ( FT_NEW( blend->mvar_table ) ) + return; + + /* skip reserved entry and value record size */ + if ( FT_STREAM_SKIP( 4 ) || + FT_READ_USHORT( blend->mvar_table->valueCount ) || + FT_READ_USHORT( store_offset ) ) + return; + + records_offset = FT_STREAM_POS(); + + error = ft_var_load_item_variation_store( + face, + table_offset + store_offset, + &blend->mvar_table->itemStore ); + if ( error ) + return; + + if ( FT_NEW_ARRAY( blend->mvar_table->values, + blend->mvar_table->valueCount ) ) + return; + + if ( FT_STREAM_SEEK( records_offset ) || + FT_FRAME_ENTER( blend->mvar_table->valueCount * GX_VALUE_SIZE ) ) + return; + + value = blend->mvar_table->values; + limit = value + blend->mvar_table->valueCount; + itemStore = &blend->mvar_table->itemStore; + + for ( ; value < limit; value++ ) + { + value->tag = FT_GET_ULONG(); + value->outerIndex = FT_GET_USHORT(); + value->innerIndex = FT_GET_USHORT(); + + if ( value->outerIndex >= itemStore->dataCount || + value->innerIndex >= itemStore->varData[value->outerIndex] + .itemCount ) + { + error = FT_THROW( Invalid_Table ); + break; + } + } + + FT_FRAME_EXIT(); + + if ( error ) + return; + + FT_TRACE2(( "loaded\n" )); + + value = blend->mvar_table->values; + limit = value + blend->mvar_table->valueCount; + + /* save original values of the data MVAR is going to modify */ + for ( ; value < limit; value++ ) + { + FT_Short* p = ft_var_get_value_pointer( face, value->tag ); + + + if ( p ) + value->unmodified = *p; +#ifdef FT_DEBUG_LEVEL_TRACE + else + FT_TRACE1(( "ft_var_load_mvar: Ignoring unknown tag `%c%c%c%c'\n", + (FT_Char)( value->tag >> 24 ), + (FT_Char)( value->tag >> 16 ), + (FT_Char)( value->tag >> 8 ), + (FT_Char)( value->tag ) )); +#endif + } + + face->variation_support |= TT_FACE_FLAG_VAR_MVAR; + } + + + static FT_Error + tt_size_reset_iterator( FT_ListNode node, + void* user ) + { + TT_Size size = (TT_Size)node->data; + + FT_UNUSED( user ); + + + tt_size_reset( size, 1 ); + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_apply_mvar */ + /* */ + /* */ + /* Apply `MVAR' table adjustments. */ + /* */ + /* */ + /* face :: The font face. */ + /* */ + FT_LOCAL_DEF( void ) + tt_apply_mvar( TT_Face face ) + { + GX_Blend blend = face->blend; + GX_Value value, limit; + + + if ( !( face->variation_support & TT_FACE_FLAG_VAR_MVAR ) ) + return; + + value = blend->mvar_table->values; + limit = value + blend->mvar_table->valueCount; + + for ( ; value < limit; value++ ) + { + FT_Short* p = ft_var_get_value_pointer( face, value->tag ); + FT_Int delta; + + + delta = ft_var_get_item_delta( face, + &blend->mvar_table->itemStore, + value->outerIndex, + value->innerIndex ); + + if ( p ) + { + FT_TRACE5(( "value %c%c%c%c (%d unit%s) adjusted by %d unit%s (MVAR)\n", + (FT_Char)( value->tag >> 24 ), + (FT_Char)( value->tag >> 16 ), + (FT_Char)( value->tag >> 8 ), + (FT_Char)( value->tag ), + value->unmodified, + value->unmodified == 1 ? "" : "s", + delta, + delta == 1 ? "" : "s" )); + + /* since we handle both signed and unsigned values as FT_Short, */ + /* ensure proper overflow arithmetic */ + *p = (FT_Short)( value->unmodified + (FT_Short)delta ); + } + } + + /* adjust all derived values */ + { + FT_Face root = &face->root; + + + if ( face->os2.version != 0xFFFFU ) + { + if ( face->os2.sTypoAscender || face->os2.sTypoDescender ) + { + root->ascender = face->os2.sTypoAscender; + root->descender = face->os2.sTypoDescender; + + root->height = root->ascender - root->descender + + face->os2.sTypoLineGap; + } + else + { + root->ascender = (FT_Short)face->os2.usWinAscent; + root->descender = -(FT_Short)face->os2.usWinDescent; + + root->height = root->ascender - root->descender; + } + } + + root->underline_position = face->postscript.underlinePosition - + face->postscript.underlineThickness / 2; + root->underline_thickness = face->postscript.underlineThickness; + + /* iterate over all FT_Size objects and call `tt_size_reset' */ + /* to propagate the metrics changes */ + FT_List_Iterate( &root->sizes_list, + tt_size_reset_iterator, + NULL ); + } + } + + + typedef struct GX_GVar_Head_ + { + FT_Long version; + FT_UShort axisCount; + FT_UShort globalCoordCount; + FT_ULong offsetToCoord; + FT_UShort glyphCount; + FT_UShort flags; + FT_ULong offsetToData; + + } GX_GVar_Head; + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_load_gvar */ + /* */ + /* */ + /* Parse the `gvar' table if present. If `fvar' is there, `gvar' had */ + /* better be there too. */ + /* */ + /* */ + /* face :: The font face. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + ft_var_load_gvar( TT_Face face ) + { + FT_Stream stream = FT_FACE_STREAM( face ); + FT_Memory memory = stream->memory; + GX_Blend blend = face->blend; + FT_Error error; + FT_UInt i, j; + FT_ULong table_len; + FT_ULong gvar_start; + FT_ULong offsetToData; + GX_GVar_Head gvar_head; + + static const FT_Frame_Field gvar_fields[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE GX_GVar_Head + + FT_FRAME_START( 20 ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT( axisCount ), + FT_FRAME_USHORT( globalCoordCount ), + FT_FRAME_ULONG ( offsetToCoord ), + FT_FRAME_USHORT( glyphCount ), + FT_FRAME_USHORT( flags ), + FT_FRAME_ULONG ( offsetToData ), + FT_FRAME_END + }; + + + FT_TRACE2(( "GVAR " )); + + if ( FT_SET_ERROR( face->goto_table( face, + TTAG_gvar, + stream, + &table_len ) ) ) + { + FT_TRACE2(( "is missing\n" )); + goto Exit; + } + + gvar_start = FT_STREAM_POS( ); + if ( FT_STREAM_READ_FIELDS( gvar_fields, &gvar_head ) ) + goto Exit; + + if ( gvar_head.version != 0x00010000L ) + { + FT_TRACE1(( "bad table version\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + if ( gvar_head.axisCount != (FT_UShort)blend->mmvar->num_axis ) + { + FT_TRACE1(( "ft_var_load_gvar: number of axes in `gvar' and `cvar'\n" + " table are different\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* rough sanity check, ignoring offsets */ + if ( (FT_ULong)gvar_head.globalCoordCount * gvar_head.axisCount > + table_len / 2 ) + { + FT_TRACE1(( "ft_var_load_gvar:" + " invalid number of global coordinates\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + /* rough sanity check: offsets can be either 2 or 4 bytes */ + if ( (FT_ULong)gvar_head.glyphCount * + ( ( gvar_head.flags & 1 ) ? 4 : 2 ) > table_len ) + { + FT_TRACE1(( "ft_var_load_gvar: invalid number of glyphs\n" )); + error = FT_THROW( Invalid_Table ); + goto Exit; + } + + FT_TRACE2(( "loaded\n" )); + + blend->gvar_size = table_len; + blend->tuplecount = gvar_head.globalCoordCount; + blend->gv_glyphcnt = gvar_head.glyphCount; + offsetToData = gvar_start + gvar_head.offsetToData; + + FT_TRACE5(( "gvar: there %s %d shared coordinate%s:\n", + blend->tuplecount == 1 ? "is" : "are", + blend->tuplecount, + blend->tuplecount == 1 ? "" : "s" )); + + if ( FT_NEW_ARRAY( blend->glyphoffsets, blend->gv_glyphcnt + 1 ) ) + goto Exit; + + if ( gvar_head.flags & 1 ) + { + /* long offsets (one more offset than glyphs, to mark size of last) */ + if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 4L ) ) + goto Exit; + + for ( i = 0; i <= blend->gv_glyphcnt; i++ ) + blend->glyphoffsets[i] = offsetToData + FT_GET_ULONG(); + + FT_FRAME_EXIT(); + } + else + { + /* short offsets (one more offset than glyphs, to mark size of last) */ + if ( FT_FRAME_ENTER( ( blend->gv_glyphcnt + 1 ) * 2L ) ) + goto Exit; + + for ( i = 0; i <= blend->gv_glyphcnt; i++ ) + blend->glyphoffsets[i] = offsetToData + FT_GET_USHORT() * 2; + /* XXX: Undocumented: `*2'! */ + + FT_FRAME_EXIT(); + } + + if ( blend->tuplecount != 0 ) + { + if ( FT_NEW_ARRAY( blend->tuplecoords, + gvar_head.axisCount * blend->tuplecount ) ) + goto Exit; + + if ( FT_STREAM_SEEK( gvar_start + gvar_head.offsetToCoord ) || + FT_FRAME_ENTER( blend->tuplecount * gvar_head.axisCount * 2L ) ) + goto Exit; + + for ( i = 0; i < blend->tuplecount; i++ ) + { + FT_TRACE5(( " [ " )); + for ( j = 0; j < (FT_UInt)gvar_head.axisCount; j++ ) + { + blend->tuplecoords[i * gvar_head.axisCount + j] = + FT_GET_SHORT() * 4; /* convert to FT_Fixed */ + FT_TRACE5(( "%.5f ", + blend->tuplecoords[i * gvar_head.axisCount + j] / 65536.0 )); + } + FT_TRACE5(( "]\n" )); + } + + FT_TRACE5(( "\n" )); + + FT_FRAME_EXIT(); + } + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* ft_var_apply_tuple */ + /* */ + /* */ + /* Figure out whether a given tuple (design) applies to the current */ + /* blend, and if so, what is the scaling factor. */ + /* */ + /* */ + /* blend :: The current blend of the font. */ + /* */ + /* tupleIndex :: A flag saying whether this is an intermediate */ + /* tuple or not. */ + /* */ + /* tuple_coords :: The coordinates of the tuple in normalized axis */ + /* units. */ + /* */ + /* im_start_coords :: The initial coordinates where this tuple starts */ + /* to apply (for intermediate coordinates). */ + /* */ + /* im_end_coords :: The final coordinates after which this tuple no */ + /* longer applies (for intermediate coordinates). */ + /* */ + /* */ + /* An FT_Fixed value containing the scaling factor. */ + /* */ + static FT_Fixed + ft_var_apply_tuple( GX_Blend blend, + FT_UShort tupleIndex, + FT_Fixed* tuple_coords, + FT_Fixed* im_start_coords, + FT_Fixed* im_end_coords ) + { + FT_UInt i; + FT_Fixed apply = 0x10000L; + + + for ( i = 0; i < blend->num_axis; i++ ) + { + FT_TRACE6(( " axis coordinate %d (%.5f):\n", + i, blend->normalizedcoords[i] / 65536.0 )); + if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) ) + FT_TRACE6(( " intermediate coordinates %d (%.5f, %.5f):\n", + i, + im_start_coords[i] / 65536.0, + im_end_coords[i] / 65536.0 )); + + /* It's not clear why (for intermediate tuples) we don't need */ + /* to check against start/end -- the documentation says we don't. */ + /* Similarly, it's unclear why we don't need to scale along the */ + /* axis. */ + + if ( tuple_coords[i] == 0 ) + { + FT_TRACE6(( " tuple coordinate is zero, ignored\n", i )); + continue; + } + + if ( blend->normalizedcoords[i] == 0 ) + { + FT_TRACE6(( " axis coordinate is zero, stop\n" )); + apply = 0; + break; + } + + if ( blend->normalizedcoords[i] == tuple_coords[i] ) + { + FT_TRACE6(( " tuple coordinate value %.5f fits perfectly\n", + tuple_coords[i] / 65536.0 )); + /* `apply' does not change */ + continue; + } + + if ( !( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) ) + { + /* not an intermediate tuple */ + + if ( blend->normalizedcoords[i] < FT_MIN( 0, tuple_coords[i] ) || + blend->normalizedcoords[i] > FT_MAX( 0, tuple_coords[i] ) ) + { + FT_TRACE6(( " tuple coordinate value %.5f is exceeded, stop\n", + tuple_coords[i] / 65536.0 )); + apply = 0; + break; + } + + FT_TRACE6(( " tuple coordinate value %.5f fits\n", + tuple_coords[i] / 65536.0 )); + apply = FT_MulDiv( apply, + blend->normalizedcoords[i], + tuple_coords[i] ); + } + else + { + /* intermediate tuple */ + + if ( blend->normalizedcoords[i] < im_start_coords[i] || + blend->normalizedcoords[i] > im_end_coords[i] ) + { + FT_TRACE6(( " intermediate tuple range [%.5f;%.5f] is exceeded," + " stop\n", + im_start_coords[i] / 65536.0, + im_end_coords[i] / 65536.0 )); + apply = 0; + break; + } + + else if ( blend->normalizedcoords[i] < tuple_coords[i] ) + { + FT_TRACE6(( " intermediate tuple range [%.5f;%.5f] fits\n", + im_start_coords[i] / 65536.0, + im_end_coords[i] / 65536.0 )); + apply = FT_MulDiv( apply, + blend->normalizedcoords[i] - im_start_coords[i], + tuple_coords[i] - im_start_coords[i] ); + } + + else + { + FT_TRACE6(( " intermediate tuple range [%.5f;%.5f] fits\n", + im_start_coords[i] / 65536.0, + im_end_coords[i] / 65536.0 )); + apply = FT_MulDiv( apply, + im_end_coords[i] - blend->normalizedcoords[i], + im_end_coords[i] - tuple_coords[i] ); + } + } + } + + FT_TRACE6(( " apply factor is %.5f\n", apply / 65536.0 )); + + return apply; + } + + + /* convert from design coordinates to normalized coordinates */ + + static void + ft_var_to_normalized( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords, + FT_Fixed* normalized ) + { + GX_Blend blend; + FT_MM_Var* mmvar; + FT_UInt i, j; + FT_Var_Axis* a; + GX_AVarSegment av; + + + blend = face->blend; + mmvar = blend->mmvar; + + if ( num_coords > mmvar->num_axis ) + { + FT_TRACE2(( "ft_var_to_normalized:" + " only using first %d of %d coordinates\n", + mmvar->num_axis, num_coords )); + num_coords = mmvar->num_axis; + } + + /* Axis normalization is a two-stage process. First we normalize */ + /* based on the [min,def,max] values for the axis to be [-1,0,1]. */ + /* Then, if there's an `avar' table, we renormalize this range. */ + + a = mmvar->axis; + for ( i = 0; i < num_coords; i++, a++ ) + { + FT_Fixed coord = coords[i]; + + + FT_TRACE5(( " %d: %.5f\n", i, coord / 65536.0 )); + if ( coord > a->maximum || coord < a->minimum ) + { + FT_TRACE1(( + "ft_var_to_normalized: design coordinate %.5f\n" + " is out of range [%.5f;%.5f]; clamping\n", + coord / 65536.0, + a->minimum / 65536.0, + a->maximum / 65536.0 )); + + if ( coord > a->maximum ) + coord = a->maximum; + else + coord = a->minimum; + } + + if ( coord < a->def ) + normalized[i] = -FT_DivFix( coord - a->def, + a->minimum - a->def ); + else if ( coord > a->def ) + normalized[i] = FT_DivFix( coord - a->def, + a->maximum - a->def ); + else + normalized[i] = 0; + } + + FT_TRACE5(( "\n" )); + + for ( ; i < mmvar->num_axis; i++ ) + normalized[i] = 0; + + if ( blend->avar_segment ) + { + FT_TRACE5(( "normalized design coordinates" + " before applying `avar' data:\n" )); + + av = blend->avar_segment; + for ( i = 0; i < mmvar->num_axis; i++, av++ ) + { + for ( j = 1; j < (FT_UInt)av->pairCount; j++ ) + { + if ( normalized[i] < av->correspondence[j].fromCoord ) + { + FT_TRACE5(( " %.5f\n", normalized[i] / 65536.0 )); + + normalized[i] = + FT_MulDiv( normalized[i] - av->correspondence[j - 1].fromCoord, + av->correspondence[j].toCoord - + av->correspondence[j - 1].toCoord, + av->correspondence[j].fromCoord - + av->correspondence[j - 1].fromCoord ) + + av->correspondence[j - 1].toCoord; + break; + } + } + } + } + } + + + /* convert from normalized coordinates to design coordinates */ + + static void + ft_var_to_design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords, + FT_Fixed* design ) + { + GX_Blend blend; + FT_MM_Var* mmvar; + FT_Var_Axis* a; + + FT_UInt i, j, nc; + + + blend = face->blend; + + nc = num_coords; + if ( num_coords > blend->num_axis ) + { + FT_TRACE2(( "ft_var_to_design:" + " only using first %d of %d coordinates\n", + blend->num_axis, num_coords )); + nc = blend->num_axis; + } + + for ( i = 0; i < nc; i++ ) + design[i] = coords[i]; + + for ( ; i < num_coords; i++ ) + design[i] = 0; + + if ( blend->avar_segment ) + { + GX_AVarSegment av = blend->avar_segment; + + + FT_TRACE5(( "design coordinates" + " after removing `avar' distortion:\n" )); + + for ( i = 0; i < nc; i++, av++ ) + { + for ( j = 1; j < (FT_UInt)av->pairCount; j++ ) + { + if ( design[i] < av->correspondence[j].toCoord ) + { + design[i] = + FT_MulDiv( design[i] - av->correspondence[j - 1].toCoord, + av->correspondence[j].fromCoord - + av->correspondence[j - 1].fromCoord, + av->correspondence[j].toCoord - + av->correspondence[j - 1].toCoord ) + + av->correspondence[j - 1].fromCoord; + + FT_TRACE5(( " %.5f\n", design[i] / 65536.0 )); + break; + } + } + } + } + + mmvar = blend->mmvar; + a = mmvar->axis; + + for ( i = 0; i < nc; i++, a++ ) + { + if ( design[i] < 0 ) + design[i] = a->def + FT_MulFix( design[i], + a->def - a->minimum ); + else if ( design[i] > 0 ) + design[i] = a->def + FT_MulFix( design[i], + a->maximum - a->def ); + else + design[i] = a->def; + } + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** MULTIPLE MASTERS SERVICE FUNCTIONS *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + typedef struct GX_FVar_Head_ + { + FT_Long version; + FT_UShort offsetToData; + FT_UShort axisCount; + FT_UShort axisSize; + FT_UShort instanceCount; + FT_UShort instanceSize; + + } GX_FVar_Head; + + + typedef struct fvar_axis_ + { + FT_ULong axisTag; + FT_Fixed minValue; + FT_Fixed defaultValue; + FT_Fixed maxValue; + FT_UShort flags; + FT_UShort nameID; + + } GX_FVar_Axis; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Get_MM_Var */ + /* */ + /* */ + /* Check that the font's `fvar' table is valid, parse it, and return */ + /* those data. It also loads (and parses) the `MVAR' table, if */ + /* possible. */ + /* */ + /* */ + /* face :: The font face. */ + /* TT_Get_MM_Var initializes the blend structure. */ + /* */ + /* */ + /* master :: The `fvar' data (must be freed by caller). Can be NULL, */ + /* which makes this function simply load MM support. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Get_MM_Var( TT_Face face, + FT_MM_Var* *master ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = face->root.memory; + FT_ULong table_len; + FT_Error error = FT_Err_Ok; + FT_ULong fvar_start = 0; + FT_UInt i, j; + FT_MM_Var* mmvar = NULL; + FT_Fixed* next_coords; + FT_Fixed* nsc; + FT_String* next_name; + FT_Var_Axis* a; + FT_Fixed* c; + FT_Var_Named_Style* ns; + GX_FVar_Head fvar_head; + FT_Bool usePsName = 0; + FT_UInt num_instances; + FT_UInt num_axes; + FT_UShort* axis_flags; + + FT_Offset mmvar_size; + FT_Offset axis_flags_size; + FT_Offset axis_size; + FT_Offset namedstyle_size; + FT_Offset next_coords_size; + FT_Offset next_name_size; + + FT_Bool need_init; + + static const FT_Frame_Field fvar_fields[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE GX_FVar_Head + + FT_FRAME_START( 16 ), + FT_FRAME_LONG ( version ), + FT_FRAME_USHORT ( offsetToData ), + FT_FRAME_SKIP_SHORT, + FT_FRAME_USHORT ( axisCount ), + FT_FRAME_USHORT ( axisSize ), + FT_FRAME_USHORT ( instanceCount ), + FT_FRAME_USHORT ( instanceSize ), + FT_FRAME_END + }; + + static const FT_Frame_Field fvaraxis_fields[] = + { + +#undef FT_STRUCTURE +#define FT_STRUCTURE GX_FVar_Axis + + FT_FRAME_START( 20 ), + FT_FRAME_ULONG ( axisTag ), + FT_FRAME_LONG ( minValue ), + FT_FRAME_LONG ( defaultValue ), + FT_FRAME_LONG ( maxValue ), + FT_FRAME_USHORT( flags ), + FT_FRAME_USHORT( nameID ), + FT_FRAME_END + }; + + + /* read the font data and set up the internal representation */ + /* if not already done */ + + need_init = !face->blend; + + if ( need_init ) + { + FT_TRACE2(( "FVAR " )); + + /* both `fvar' and `gvar' must be present */ + if ( FT_SET_ERROR( face->goto_table( face, TTAG_gvar, + stream, &table_len ) ) ) + { + /* CFF2 is an alternate to gvar here */ + if ( FT_SET_ERROR( face->goto_table( face, TTAG_CFF2, + stream, &table_len ) ) ) + { + FT_TRACE1(( "\n" + "TT_Get_MM_Var: `gvar' or `CFF2' table is missing\n" )); + goto Exit; + } + } + + if ( FT_SET_ERROR( face->goto_table( face, TTAG_fvar, + stream, &table_len ) ) ) + { + FT_TRACE1(( "is missing\n" )); + goto Exit; + } + + fvar_start = FT_STREAM_POS( ); + + /* the validity of the `fvar' header data was already checked */ + /* in function `sfnt_init_face' */ + if ( FT_STREAM_READ_FIELDS( fvar_fields, &fvar_head ) ) + goto Exit; + + usePsName = FT_BOOL( fvar_head.instanceSize == + 6 + 4 * fvar_head.axisCount ); + + FT_TRACE2(( "loaded\n" )); + + FT_TRACE5(( "%d variation ax%s\n", + fvar_head.axisCount, + fvar_head.axisCount == 1 ? "is" : "es" )); + + if ( FT_NEW( face->blend ) ) + goto Exit; + + num_axes = fvar_head.axisCount; + face->blend->num_axis = num_axes; + } + else + num_axes = face->blend->num_axis; + + /* `num_instances' holds the number of all named instances, */ + /* including the default instance which might be missing */ + /* in fvar's table of named instances */ + num_instances = (FT_UInt)face->root.style_flags >> 16; + + /* prepare storage area for MM data; this cannot overflow */ + /* 32-bit arithmetic because of the size limits used in the */ + /* `fvar' table validity check in `sfnt_init_face' */ + + /* the various `*_size' variables, which we also use as */ + /* offsets into the `mmlen' array, must be multiples of the */ + /* pointer size (except the last one); without such an */ + /* alignment there might be runtime errors due to */ + /* misaligned addresses */ +#undef ALIGN_SIZE +#define ALIGN_SIZE( n ) \ + ( ( (n) + sizeof (void*) - 1 ) & ~( sizeof (void*) - 1 ) ) + + mmvar_size = ALIGN_SIZE( sizeof ( FT_MM_Var ) ); + axis_flags_size = ALIGN_SIZE( num_axes * + sizeof ( FT_UShort ) ); + axis_size = ALIGN_SIZE( num_axes * + sizeof ( FT_Var_Axis ) ); + namedstyle_size = ALIGN_SIZE( num_instances * + sizeof ( FT_Var_Named_Style ) ); + next_coords_size = ALIGN_SIZE( num_instances * + num_axes * + sizeof ( FT_Fixed ) ); + next_name_size = num_axes * 5; + + if ( need_init ) + { + face->blend->mmvar_len = mmvar_size + + axis_flags_size + + axis_size + + namedstyle_size + + next_coords_size + + next_name_size; + + if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) + goto Exit; + face->blend->mmvar = mmvar; + + /* set up pointers and offsets into the `mmvar' array; */ + /* the data gets filled in later on */ + + mmvar->num_axis = + num_axes; + mmvar->num_designs = + ~0U; /* meaningless in this context; each glyph */ + /* may have a different number of designs */ + /* (or tuples, as called by Apple) */ + mmvar->num_namedstyles = + num_instances; + + /* alas, no public field in `FT_Var_Axis' for axis flags */ + axis_flags = + (FT_UShort*)( (char*)mmvar + mmvar_size ); + mmvar->axis = + (FT_Var_Axis*)( (char*)axis_flags + axis_flags_size ); + mmvar->namedstyle = + (FT_Var_Named_Style*)( (char*)mmvar->axis + axis_size ); + + next_coords = (FT_Fixed*)( (char*)mmvar->namedstyle + + namedstyle_size ); + for ( i = 0; i < num_instances; i++ ) + { + mmvar->namedstyle[i].coords = next_coords; + next_coords += num_axes; + } + + next_name = (FT_String*)( (char*)mmvar->namedstyle + + namedstyle_size + next_coords_size ); + for ( i = 0; i < num_axes; i++ ) + { + mmvar->axis[i].name = next_name; + next_name += 5; + } + + /* now fill in the data */ + + if ( FT_STREAM_SEEK( fvar_start + fvar_head.offsetToData ) ) + goto Exit; + + a = mmvar->axis; + for ( i = 0; i < num_axes; i++ ) + { + GX_FVar_Axis axis_rec; + +#ifdef FT_DEBUG_LEVEL_TRACE + int invalid = 0; +#endif + + + if ( FT_STREAM_READ_FIELDS( fvaraxis_fields, &axis_rec ) ) + goto Exit; + a->tag = axis_rec.axisTag; + a->minimum = axis_rec.minValue; + a->def = axis_rec.defaultValue; + a->maximum = axis_rec.maxValue; + a->strid = axis_rec.nameID; + + a->name[0] = (FT_String)( a->tag >> 24 ); + a->name[1] = (FT_String)( ( a->tag >> 16 ) & 0xFF ); + a->name[2] = (FT_String)( ( a->tag >> 8 ) & 0xFF ); + a->name[3] = (FT_String)( ( a->tag ) & 0xFF ); + a->name[4] = '\0'; + + *axis_flags = axis_rec.flags; + + if ( a->minimum > a->def || + a->def > a->maximum ) + { + a->minimum = a->def; + a->maximum = a->def; + +#ifdef FT_DEBUG_LEVEL_TRACE + invalid = 1; +#endif + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( i == 0 ) + FT_TRACE5(( " idx tag " + /* " XXX `XXXX'" */ + " minimum default maximum flags\n" )); + /* " XXXX.XXXXX XXXX.XXXXX XXXX.XXXXX 0xXXXX" */ + + FT_TRACE5(( " %3d `%s'" + " %10.5f %10.5f %10.5f 0x%04X%s\n", + i, + a->name, + a->minimum / 65536.0, + a->def / 65536.0, + a->maximum / 65536.0, + *axis_flags, + invalid ? " (invalid, disabled)" : "" )); +#endif + + a++; + axis_flags++; + } + + FT_TRACE5(( "\n" )); + + /* named instance coordinates are stored as design coordinates; */ + /* we have to convert them to normalized coordinates also */ + if ( FT_NEW_ARRAY( face->blend->normalized_stylecoords, + num_axes * num_instances ) ) + goto Exit; + + if ( fvar_head.instanceCount && !face->blend->avar_loaded ) + { + FT_ULong offset = FT_STREAM_POS(); + + + ft_var_load_avar( face ); + + if ( FT_STREAM_SEEK( offset ) ) + goto Exit; + } + + FT_TRACE5(( "%d instance%s\n", + fvar_head.instanceCount, + fvar_head.instanceCount == 1 ? "" : "s" )); + + ns = mmvar->namedstyle; + nsc = face->blend->normalized_stylecoords; + for ( i = 0; i < fvar_head.instanceCount; i++, ns++ ) + { + /* PostScript names add 2 bytes to the instance record size */ + if ( FT_FRAME_ENTER( ( usePsName ? 6L : 4L ) + + 4L * num_axes ) ) + goto Exit; + + ns->strid = FT_GET_USHORT(); + (void) /* flags = */ FT_GET_USHORT(); + + c = ns->coords; + for ( j = 0; j < num_axes; j++, c++ ) + *c = FT_GET_LONG(); + + /* valid psid values are 6, [256;32767], and 0xFFFF */ + if ( usePsName ) + ns->psid = FT_GET_USHORT(); + else + ns->psid = 0xFFFF; + +#ifdef FT_DEBUG_LEVEL_TRACE + { + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + FT_String* strname = NULL; + FT_String* psname = NULL; + + FT_ULong pos; + + + pos = FT_STREAM_POS(); + + if ( ns->strid != 0xFFFF ) + { + (void)sfnt->get_name( face, + (FT_UShort)ns->strid, + &strname ); + if ( strname && !ft_strcmp( strname, ".notdef" ) ) + strname = NULL; + } + + if ( ns->psid != 0xFFFF ) + { + (void)sfnt->get_name( face, + (FT_UShort)ns->psid, + &psname ); + if ( psname && !ft_strcmp( psname, ".notdef" ) ) + psname = NULL; + } + + (void)FT_STREAM_SEEK( pos ); + + FT_TRACE5(( " instance %d (%s%s%s, %s%s%s)\n", + i, + strname ? "name: `" : "", + strname ? strname : "unnamed", + strname ? "'" : "", + psname ? "PS name: `" : "", + psname ? psname : "no PS name", + psname ? "'" : "" )); + + FT_FREE( strname ); + FT_FREE( psname ); + } +#endif /* FT_DEBUG_LEVEL_TRACE */ + + ft_var_to_normalized( face, num_axes, ns->coords, nsc ); + nsc += num_axes; + + FT_FRAME_EXIT(); + } + + if ( num_instances != fvar_head.instanceCount ) + { + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + FT_Int found, dummy1, dummy2; + FT_UInt strid = ~0U; + + + /* the default instance is missing in array the */ + /* of named instances; try to synthesize an entry */ + found = sfnt->get_name_id( face, + TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY, + &dummy1, + &dummy2 ); + if ( found ) + strid = TT_NAME_ID_TYPOGRAPHIC_SUBFAMILY; + else + { + found = sfnt->get_name_id( face, + TT_NAME_ID_FONT_SUBFAMILY, + &dummy1, + &dummy2 ); + if ( found ) + strid = TT_NAME_ID_FONT_SUBFAMILY; + } + + if ( found ) + { + found = sfnt->get_name_id( face, + TT_NAME_ID_PS_NAME, + &dummy1, + &dummy2 ); + if ( found ) + { + FT_TRACE5(( "TT_Get_MM_Var:" + " Adding default instance to named instances\n" )); + + ns = &mmvar->namedstyle[fvar_head.instanceCount]; + + ns->strid = strid; + ns->psid = TT_NAME_ID_PS_NAME; + + a = mmvar->axis; + c = ns->coords; + for ( j = 0; j < num_axes; j++, a++, c++ ) + *c = a->def; + } + } + } + + ft_var_load_mvar( face ); + } + + /* fill the output array if requested */ + + if ( master ) + { + FT_UInt n; + + + if ( FT_ALLOC( mmvar, face->blend->mmvar_len ) ) + goto Exit; + FT_MEM_COPY( mmvar, face->blend->mmvar, face->blend->mmvar_len ); + + axis_flags = + (FT_UShort*)( (char*)mmvar + mmvar_size ); + mmvar->axis = + (FT_Var_Axis*)( (char*)axis_flags + axis_flags_size ); + mmvar->namedstyle = + (FT_Var_Named_Style*)( (char*)mmvar->axis+ axis_size ); + + next_coords = (FT_Fixed*)( (char*)mmvar->namedstyle + + namedstyle_size ); + for ( n = 0; n < mmvar->num_namedstyles; n++ ) + { + mmvar->namedstyle[n].coords = next_coords; + next_coords += num_axes; + } + + a = mmvar->axis; + next_name = (FT_String*)( (char*)mmvar->namedstyle + + namedstyle_size + next_coords_size ); + for ( n = 0; n < num_axes; n++ ) + { + a->name = next_name; + + /* standard PostScript names for some standard apple tags */ + if ( a->tag == TTAG_wght ) + a->name = (char*)"Weight"; + else if ( a->tag == TTAG_wdth ) + a->name = (char*)"Width"; + else if ( a->tag == TTAG_opsz ) + a->name = (char*)"OpticalSize"; + else if ( a->tag == TTAG_slnt ) + a->name = (char*)"Slant"; + + next_name += 5; + a++; + } + + *master = mmvar; + } + + Exit: + return error; + } + + + static FT_Error + tt_set_mm_blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords, + FT_Bool set_design_coords ) + { + FT_Error error = FT_Err_Ok; + GX_Blend blend; + FT_MM_Var* mmvar; + FT_UInt i; + + FT_Bool all_design_coords = FALSE; + + FT_Memory memory = face->root.memory; + + enum + { + mcvt_retain, + mcvt_modify, + mcvt_load + + } manageCvt; + + + face->doblend = FALSE; + + if ( !face->blend ) + { + if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) + goto Exit; + } + + blend = face->blend; + mmvar = blend->mmvar; + + if ( num_coords > mmvar->num_axis ) + { + FT_TRACE2(( "TT_Set_MM_Blend:" + " only using first %d of %d coordinates\n", + mmvar->num_axis, num_coords )); + num_coords = mmvar->num_axis; + } + + FT_TRACE5(( "TT_Set_MM_Blend:\n" + " normalized design coordinates:\n" )); + + for ( i = 0; i < num_coords; i++ ) + { + FT_TRACE5(( " %.5f\n", coords[i] / 65536.0 )); + if ( coords[i] < -0x00010000L || coords[i] > 0x00010000L ) + { + FT_TRACE1(( "TT_Set_MM_Blend: normalized design coordinate %.5f\n" + " is out of range [-1;1]\n", + coords[i] / 65536.0 )); + error = FT_THROW( Invalid_Argument ); + goto Exit; + } + } + + FT_TRACE5(( "\n" )); + + if ( !face->is_cff2 && !blend->glyphoffsets ) + if ( FT_SET_ERROR( ft_var_load_gvar( face ) ) ) + goto Exit; + + if ( !blend->coords ) + { + if ( FT_NEW_ARRAY( blend->coords, mmvar->num_axis ) ) + goto Exit; + + /* the first time we have to compute all design coordinates */ + all_design_coords = TRUE; + } + + if ( !blend->normalizedcoords ) + { + if ( FT_NEW_ARRAY( blend->normalizedcoords, mmvar->num_axis ) ) + goto Exit; + + manageCvt = mcvt_modify; + + /* If we have not set the blend coordinates before this, then the */ + /* cvt table will still be what we read from the `cvt ' table and */ + /* we don't need to reload it. We may need to change it though... */ + } + else + { + FT_Bool have_diff = 0; + FT_UInt j; + FT_Fixed* c; + FT_Fixed* n; + + + manageCvt = mcvt_retain; + + for ( i = 0; i < num_coords; i++ ) + { + if ( blend->normalizedcoords[i] != coords[i] ) + { + manageCvt = mcvt_load; + have_diff = 1; + break; + } + } + + if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ) + { + FT_UInt idx = (FT_UInt)face->root.face_index >> 16; + + + c = blend->normalizedcoords + i; + n = blend->normalized_stylecoords + idx * mmvar->num_axis + i; + for ( j = i; j < mmvar->num_axis; j++, n++, c++ ) + if ( *c != *n ) + have_diff = 1; + } + else + { + c = blend->normalizedcoords + i; + for ( j = i; j < mmvar->num_axis; j++, c++ ) + if ( *c != 0 ) + have_diff = 1; + } + + /* return value -1 indicates `no change' */ + if ( !have_diff ) + return -1; + + for ( ; i < mmvar->num_axis; i++ ) + { + if ( blend->normalizedcoords[i] != 0 ) + { + manageCvt = mcvt_load; + break; + } + } + + /* If we don't change the blend coords then we don't need to do */ + /* anything to the cvt table. It will be correct. Otherwise we */ + /* no longer have the original cvt (it was modified when we set */ + /* the blend last time), so we must reload and then modify it. */ + } + + blend->num_axis = mmvar->num_axis; + FT_MEM_COPY( blend->normalizedcoords, + coords, + num_coords * sizeof ( FT_Fixed ) ); + + if ( set_design_coords ) + ft_var_to_design( face, + all_design_coords ? blend->num_axis : num_coords, + blend->normalizedcoords, + blend->coords ); + + face->doblend = TRUE; + + if ( face->cvt ) + { + switch ( manageCvt ) + { + case mcvt_load: + /* The cvt table has been loaded already; every time we change the */ + /* blend we may need to reload and remodify the cvt table. */ + FT_FREE( face->cvt ); + face->cvt = NULL; + + error = tt_face_load_cvt( face, face->root.stream ); + break; + + case mcvt_modify: + /* The original cvt table is in memory. All we need to do is */ + /* apply the `cvar' table (if any). */ + error = tt_face_vary_cvt( face, face->root.stream ); + break; + + case mcvt_retain: + /* The cvt table is correct for this set of coordinates. */ + break; + } + } + + /* enforce recomputation of the PostScript name; */ + FT_FREE( face->postscript_name ); + face->postscript_name = NULL; + + Exit: + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Set_MM_Blend */ + /* */ + /* */ + /* Set the blend (normalized) coordinates for this instance of the */ + /* font. Check that the `gvar' table is reasonable and does some */ + /* initial preparation. */ + /* */ + /* */ + /* face :: The font. */ + /* Initialize the blend structure with `gvar' data. */ + /* */ + /* */ + /* num_coords :: The number of available coordinates. If it is */ + /* larger than the number of axes, ignore the excess */ + /* values. If it is smaller than the number of axes, */ + /* use the default value (0) for the remaining axes. */ + /* */ + /* coords :: An array of `num_coords', each between [-1,1]. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_MM_Blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error; + + + error = tt_set_mm_blend( face, num_coords, coords, 1 ); + if ( error ) + return error; + + if ( num_coords ) + face->root.face_flags |= FT_FACE_FLAG_VARIATION; + else + face->root.face_flags &= ~FT_FACE_FLAG_VARIATION; + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Get_MM_Blend */ + /* */ + /* */ + /* Get the blend (normalized) coordinates for this instance of the */ + /* font. */ + /* */ + /* */ + /* face :: The font. */ + /* Initialize the blend structure with `gvar' data. */ + /* */ + /* */ + /* num_coords :: The number of available coordinates. If it is */ + /* larger than the number of axes, set the excess */ + /* values to 0. */ + /* */ + /* coords :: An array of `num_coords', each between [-1,1]. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Get_MM_Blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error = FT_Err_Ok; + GX_Blend blend; + FT_UInt i, nc; + + + if ( !face->blend ) + { + if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) + return error; + } + + blend = face->blend; + + if ( !blend->coords ) + { + /* select default instance coordinates */ + /* if no instance is selected yet */ + if ( FT_SET_ERROR( tt_set_mm_blend( face, 0, NULL, 1 ) ) ) + return error; + } + + nc = num_coords; + if ( num_coords > blend->num_axis ) + { + FT_TRACE2(( "TT_Get_MM_Blend:" + " only using first %d of %d coordinates\n", + blend->num_axis, num_coords )); + nc = blend->num_axis; + } + + if ( face->doblend ) + { + for ( i = 0; i < nc; i++ ) + coords[i] = blend->normalizedcoords[i]; + } + else + { + for ( i = 0; i < nc; i++ ) + coords[i] = 0; + } + + for ( ; i < num_coords; i++ ) + coords[i] = 0; + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Set_Var_Design */ + /* */ + /* */ + /* Set the coordinates for the instance, measured in the user */ + /* coordinate system. Parse the `avar' table (if present) to convert */ + /* from user to normalized coordinates. */ + /* */ + /* */ + /* face :: The font face. */ + /* Initialize the blend struct with `gvar' data. */ + /* */ + /* */ + /* num_coords :: The number of available coordinates. If it is */ + /* larger than the number of axes, ignore the excess */ + /* values. If it is smaller than the number of axes, */ + /* use the default values for the remaining axes. */ + /* */ + /* coords :: A coordinate array with `num_coords' elements. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_Var_Design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error = FT_Err_Ok; + GX_Blend blend; + FT_MM_Var* mmvar; + FT_UInt i; + FT_Memory memory = face->root.memory; + + FT_Fixed* c; + FT_Fixed* n; + FT_Fixed* normalized = NULL; + + FT_Bool have_diff = 0; + + + if ( !face->blend ) + { + if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) + goto Exit; + } + + blend = face->blend; + mmvar = blend->mmvar; + + if ( num_coords > mmvar->num_axis ) + { + FT_TRACE2(( "TT_Set_Var_Design:" + " only using first %d of %d coordinates\n", + mmvar->num_axis, num_coords )); + num_coords = mmvar->num_axis; + } + + if ( !blend->coords ) + { + if ( FT_NEW_ARRAY( blend->coords, mmvar->num_axis ) ) + goto Exit; + } + + c = blend->coords; + n = coords; + for ( i = 0; i < num_coords; i++, n++, c++ ) + { + if ( *c != *n ) + { + *c = *n; + have_diff = 1; + } + } + + if ( FT_IS_NAMED_INSTANCE( FT_FACE( face ) ) ) + { + FT_UInt instance_index; + FT_Var_Named_Style* named_style; + + + instance_index = (FT_UInt)face->root.face_index >> 16; + named_style = mmvar->namedstyle + instance_index - 1; + + n = named_style->coords + num_coords; + for ( ; i < mmvar->num_axis; i++, n++, c++ ) + { + if ( *c != *n ) + { + *c = *n; + have_diff = 1; + } + } + } + else + { + FT_Var_Axis* a; + + + a = mmvar->axis + num_coords; + for ( ; i < mmvar->num_axis; i++, a++, c++ ) + { + if ( *c != a->def ) + { + *c = a->def; + have_diff = 1; + } + } + } + + /* return value -1 indicates `no change'; */ + /* we can exit early if `normalizedcoords' is already computed */ + if ( blend->normalizedcoords && !have_diff ) + return -1; + + if ( FT_NEW_ARRAY( normalized, mmvar->num_axis ) ) + goto Exit; + + if ( !face->blend->avar_loaded ) + ft_var_load_avar( face ); + + FT_TRACE5(( "TT_Set_Var_Design:\n" + " normalized design coordinates:\n" )); + ft_var_to_normalized( face, num_coords, blend->coords, normalized ); + + error = tt_set_mm_blend( face, mmvar->num_axis, normalized, 0 ); + if ( error ) + goto Exit; + + if ( num_coords ) + face->root.face_flags |= FT_FACE_FLAG_VARIATION; + else + face->root.face_flags &= ~FT_FACE_FLAG_VARIATION; + + Exit: + FT_FREE( normalized ); + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Get_Var_Design */ + /* */ + /* */ + /* Get the design coordinates of the currently selected interpolated */ + /* font. */ + /* */ + /* */ + /* face :: A handle to the source face. */ + /* */ + /* num_coords :: The number of design coordinates to retrieve. If it */ + /* is larger than the number of axes, set the excess */ + /* values to~0. */ + /* */ + /* */ + /* coords :: The design coordinates array. */ + /* */ + /* */ + /* FreeType error code. 0~means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Get_Var_Design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ) + { + FT_Error error = FT_Err_Ok; + GX_Blend blend; + FT_UInt i, nc; + + + if ( !face->blend ) + { + if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) + return error; + } + + blend = face->blend; + + if ( !blend->coords ) + { + /* select default instance coordinates */ + /* if no instance is selected yet */ + if ( FT_SET_ERROR( tt_set_mm_blend( face, 0, NULL, 1 ) ) ) + return error; + } + + nc = num_coords; + if ( num_coords > blend->num_axis ) + { + FT_TRACE2(( "TT_Get_Var_Design:" + " only using first %d of %d coordinates\n", + blend->num_axis, num_coords )); + nc = blend->num_axis; + } + + if ( face->doblend ) + { + for ( i = 0; i < nc; i++ ) + coords[i] = blend->coords[i]; + } + else + { + for ( i = 0; i < nc; i++ ) + coords[i] = 0; + } + + for ( ; i < num_coords; i++ ) + coords[i] = 0; + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Set_Named_Instance */ + /* */ + /* */ + /* Set the given named instance, also resetting any further */ + /* variation. */ + /* */ + /* */ + /* face :: A handle to the source face. */ + /* */ + /* instance_index :: The instance index, starting with value 1. */ + /* Value 0 indicates to not use an instance. */ + /* */ + /* */ + /* FreeType error code. 0~means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Set_Named_Instance( TT_Face face, + FT_UInt instance_index ) + { + FT_Error error = FT_ERR( Invalid_Argument ); + GX_Blend blend; + FT_MM_Var* mmvar; + + FT_UInt num_instances; + + + if ( !face->blend ) + { + if ( FT_SET_ERROR( TT_Get_MM_Var( face, NULL ) ) ) + goto Exit; + } + + blend = face->blend; + mmvar = blend->mmvar; + + num_instances = (FT_UInt)face->root.style_flags >> 16; + + /* `instance_index' starts with value 1, thus `>' */ + if ( instance_index > num_instances ) + goto Exit; + + if ( instance_index > 0 && mmvar->namedstyle ) + { + FT_Memory memory = face->root.memory; + SFNT_Service sfnt = (SFNT_Service)face->sfnt; + + FT_Var_Named_Style* named_style; + FT_String* style_name; + + + named_style = mmvar->namedstyle + instance_index - 1; + + error = sfnt->get_name( face, + (FT_UShort)named_style->strid, + &style_name ); + if ( error ) + goto Exit; + + /* set (or replace) style name */ + FT_FREE( face->root.style_name ); + face->root.style_name = style_name; + + /* finally, select the named instance */ + error = TT_Set_Var_Design( face, + mmvar->num_axis, + named_style->coords ); + if ( error ) + goto Exit; + } + else + error = TT_Set_Var_Design( face, 0, NULL ); + + face->root.face_index = ( instance_index << 16 ) | + ( face->root.face_index & 0xFFFFL ); + face->root.face_flags &= ~FT_FACE_FLAG_VARIATION; + + Exit: + return error; + } + + + /*************************************************************************/ + /*************************************************************************/ + /***** *****/ + /***** GX VAR PARSING ROUTINES *****/ + /***** *****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_vary_cvt */ + /* */ + /* */ + /* Modify the loaded cvt table according to the `cvar' table and the */ + /* font's blend. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* Most errors are ignored. It is perfectly valid not to have a */ + /* `cvar' table even if there is a `gvar' and `fvar' table. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_vary_cvt( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong table_start; + FT_ULong table_len; + FT_UInt tupleCount; + FT_ULong offsetToData; + FT_ULong here; + FT_UInt i, j; + FT_Fixed* tuple_coords = NULL; + FT_Fixed* im_start_coords = NULL; + FT_Fixed* im_end_coords = NULL; + GX_Blend blend = face->blend; + FT_UInt point_count, spoint_count = 0; + FT_UShort* sharedpoints = NULL; + FT_UShort* localpoints = NULL; + FT_UShort* points; + FT_Short* deltas; + + + FT_TRACE2(( "CVAR " )); + + if ( !blend ) + { + FT_TRACE2(( "\n" + "tt_face_vary_cvt: no blend specified\n" )); + error = FT_Err_Ok; + goto Exit; + } + + if ( !face->cvt ) + { + FT_TRACE2(( "\n" + "tt_face_vary_cvt: no `cvt ' table\n" )); + error = FT_Err_Ok; + goto Exit; + } + + error = face->goto_table( face, TTAG_cvar, stream, &table_len ); + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + + error = FT_Err_Ok; + goto Exit; + } + + if ( FT_FRAME_ENTER( table_len ) ) + { + error = FT_Err_Ok; + goto Exit; + } + + table_start = FT_Stream_FTell( stream ); + if ( FT_GET_LONG() != 0x00010000L ) + { + FT_TRACE2(( "bad table version\n" )); + + error = FT_Err_Ok; + goto FExit; + } + + FT_TRACE2(( "loaded\n" )); + + if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) + goto FExit; + + tupleCount = FT_GET_USHORT(); + offsetToData = FT_GET_USHORT(); + + /* rough sanity test */ + if ( offsetToData + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) * 4 > + table_len ) + { + FT_TRACE2(( "tt_face_vary_cvt:" + " invalid CVT variation array header\n" )); + + error = FT_THROW( Invalid_Table ); + goto FExit; + } + + offsetToData += table_start; + + if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS ) + { + here = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, offsetToData ); + + sharedpoints = ft_var_readpackedpoints( stream, + table_len, + &spoint_count ); + offsetToData = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, here ); + } + + FT_TRACE5(( "cvar: there %s %d tuple%s:\n", + ( tupleCount & 0xFFF ) == 1 ? "is" : "are", + tupleCount & 0xFFF, + ( tupleCount & 0xFFF ) == 1 ? "" : "s" )); + + for ( i = 0; i < ( tupleCount & 0xFFF ); i++ ) + { + FT_UInt tupleDataSize; + FT_UInt tupleIndex; + FT_Fixed apply; + + + FT_TRACE6(( " tuple %d:\n", i )); + + tupleDataSize = FT_GET_USHORT(); + tupleIndex = FT_GET_USHORT(); + + if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) + { + for ( j = 0; j < blend->num_axis; j++ ) + tuple_coords[j] = FT_GET_SHORT() * 4; /* convert from */ + /* short frac to fixed */ + } + else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount ) + { + FT_TRACE2(( "tt_face_vary_cvt:" + " invalid tuple index\n" )); + + error = FT_THROW( Invalid_Table ); + goto Exit; + } + else + FT_MEM_COPY( + tuple_coords, + &blend->tuplecoords[( tupleIndex & 0xFFF ) * blend->num_axis], + blend->num_axis * sizeof ( FT_Fixed ) ); + + if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) + { + for ( j = 0; j < blend->num_axis; j++ ) + im_start_coords[j] = FT_GET_SHORT() * 4; + for ( j = 0; j < blend->num_axis; j++ ) + im_end_coords[j] = FT_GET_SHORT() * 4; + } + + apply = ft_var_apply_tuple( blend, + (FT_UShort)tupleIndex, + tuple_coords, + im_start_coords, + im_end_coords ); + + if ( apply == 0 ) /* tuple isn't active for our blend */ + { + offsetToData += tupleDataSize; + continue; + } + + here = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, offsetToData ); + + if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) + { + localpoints = ft_var_readpackedpoints( stream, + table_len, + &point_count ); + points = localpoints; + } + else + { + points = sharedpoints; + point_count = spoint_count; + } + + deltas = ft_var_readpackeddeltas( stream, + table_len, + point_count == 0 ? face->cvt_size + : point_count ); + + if ( !points || + !deltas || + ( localpoints == ALL_POINTS && point_count != face->cvt_size ) ) + ; /* failure, ignore it */ + + else if ( localpoints == ALL_POINTS ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + int count = 0; +#endif + + + FT_TRACE7(( " CVT deltas:\n" )); + + /* this means that there are deltas for every entry in cvt */ + for ( j = 0; j < face->cvt_size; j++ ) + { + FT_Long orig_cvt = face->cvt[j]; + + + face->cvt[j] = (FT_Short)( orig_cvt + + FT_MulFix( deltas[j], apply ) ); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( orig_cvt != face->cvt[j] ) + { + FT_TRACE7(( " %d: %d -> %d\n", + j, orig_cvt, face->cvt[j] )); + count++; + } +#endif + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !count ) + FT_TRACE7(( " none\n" )); +#endif + } + + else + { +#ifdef FT_DEBUG_LEVEL_TRACE + int count = 0; +#endif + + + FT_TRACE7(( " CVT deltas:\n" )); + + for ( j = 0; j < point_count; j++ ) + { + int pindex; + FT_Long orig_cvt; + + + pindex = points[j]; + if ( (FT_ULong)pindex >= face->cvt_size ) + continue; + + orig_cvt = face->cvt[pindex]; + face->cvt[pindex] = (FT_Short)( orig_cvt + + FT_MulFix( deltas[j], apply ) ); + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( orig_cvt != face->cvt[pindex] ) + { + FT_TRACE7(( " %d: %d -> %d\n", + pindex, orig_cvt, face->cvt[pindex] )); + count++; + } +#endif + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !count ) + FT_TRACE7(( " none\n" )); +#endif + } + + if ( localpoints != ALL_POINTS ) + FT_FREE( localpoints ); + FT_FREE( deltas ); + + offsetToData += tupleDataSize; + + FT_Stream_SeekSet( stream, here ); + } + + FT_TRACE5(( "\n" )); + + FExit: + FT_FRAME_EXIT(); + + Exit: + if ( sharedpoints != ALL_POINTS ) + FT_FREE( sharedpoints ); + FT_FREE( tuple_coords ); + FT_FREE( im_start_coords ); + FT_FREE( im_end_coords ); + + return error; + } + + + /* Shift the original coordinates of all points between indices `p1' */ + /* and `p2', using the same difference as given by index `ref'. */ + + /* modeled after `af_iup_shift' */ + + static void + tt_delta_shift( int p1, + int p2, + int ref, + FT_Vector* in_points, + FT_Vector* out_points ) + { + int p; + FT_Vector delta; + + + delta.x = out_points[ref].x - in_points[ref].x; + delta.y = out_points[ref].y - in_points[ref].y; + + if ( delta.x == 0 && delta.y == 0 ) + return; + + for ( p = p1; p < ref; p++ ) + { + out_points[p].x += delta.x; + out_points[p].y += delta.y; + } + + for ( p = ref + 1; p <= p2; p++ ) + { + out_points[p].x += delta.x; + out_points[p].y += delta.y; + } + } + + + /* Interpolate the original coordinates of all points with indices */ + /* between `p1' and `p2', using `ref1' and `ref2' as the reference */ + /* point indices. */ + + /* modeled after `af_iup_interp', `_iup_worker_interpolate', and */ + /* `Ins_IUP' */ + + static void + tt_delta_interpolate( int p1, + int p2, + int ref1, + int ref2, + FT_Vector* in_points, + FT_Vector* out_points ) + { + int p, i; + + FT_Pos out, in1, in2, out1, out2, d1, d2; + + + if ( p1 > p2 ) + return; + + /* handle both horizontal and vertical coordinates */ + for ( i = 0; i <= 1; i++ ) + { + /* shift array pointers so that we can access `foo.y' as `foo.x' */ + in_points = (FT_Vector*)( (FT_Pos*)in_points + i ); + out_points = (FT_Vector*)( (FT_Pos*)out_points + i ); + + if ( in_points[ref1].x > in_points[ref2].x ) + { + p = ref1; + ref1 = ref2; + ref2 = p; + } + + in1 = in_points[ref1].x; + in2 = in_points[ref2].x; + out1 = out_points[ref1].x; + out2 = out_points[ref2].x; + d1 = out1 - in1; + d2 = out2 - in2; + + /* If the reference points have the same coordinate but different */ + /* delta, inferred delta is zero. Otherwise interpolate. */ + if ( in1 != in2 || out1 == out2 ) + { + FT_Fixed scale = in1 != in2 ? FT_DivFix( out2 - out1, in2 - in1 ) + : 0; + + + for ( p = p1; p <= p2; p++ ) + { + out = in_points[p].x; + + if ( out <= in1 ) + out += d1; + else if ( out >= in2 ) + out += d2; + else + out = out1 + FT_MulFix( out - in1, scale ); + + out_points[p].x = out; + } + } + } + } + + + /* Interpolate points without delta values, similar to */ + /* the `IUP' hinting instruction. */ + + /* modeled after `Ins_IUP */ + + static void + tt_interpolate_deltas( FT_Outline* outline, + FT_Vector* out_points, + FT_Vector* in_points, + FT_Bool* has_delta ) + { + FT_Int first_point; + FT_Int end_point; + + FT_Int first_delta; + FT_Int cur_delta; + + FT_Int point; + FT_Short contour; + + + /* ignore empty outlines */ + if ( !outline->n_contours ) + return; + + contour = 0; + point = 0; + + do + { + end_point = outline->contours[contour]; + first_point = point; + + /* search first point that has a delta */ + while ( point <= end_point && !has_delta[point] ) + point++; + + if ( point <= end_point ) + { + first_delta = point; + cur_delta = point; + + point++; + + while ( point <= end_point ) + { + /* search next point that has a delta */ + /* and interpolate intermediate points */ + if ( has_delta[point] ) + { + tt_delta_interpolate( cur_delta + 1, + point - 1, + cur_delta, + point, + in_points, + out_points ); + cur_delta = point; + } + + point++; + } + + /* shift contour if we only have a single delta */ + if ( cur_delta == first_delta ) + tt_delta_shift( first_point, + end_point, + cur_delta, + in_points, + out_points ); + else + { + /* otherwise handle remaining points */ + /* at the end and beginning of the contour */ + tt_delta_interpolate( cur_delta + 1, + end_point, + cur_delta, + first_delta, + in_points, + out_points ); + + if ( first_delta > 0 ) + tt_delta_interpolate( first_point, + first_delta - 1, + cur_delta, + first_delta, + in_points, + out_points ); + } + } + contour++; + + } while ( contour < outline->n_contours ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Vary_Apply_Glyph_Deltas */ + /* */ + /* */ + /* Apply the appropriate deltas to the current glyph. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* glyph_index :: The index of the glyph being modified. */ + /* */ + /* n_points :: The number of the points in the glyph, including */ + /* phantom points. */ + /* */ + /* */ + /* outline :: The outline to change. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Vary_Apply_Glyph_Deltas( TT_Face face, + FT_UInt glyph_index, + FT_Outline* outline, + FT_UInt n_points ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = stream->memory; + GX_Blend blend = face->blend; + + FT_Vector* points_org = NULL; + FT_Vector* points_out = NULL; + FT_Bool* has_delta = NULL; + + FT_Error error; + FT_ULong glyph_start; + FT_UInt tupleCount; + FT_ULong offsetToData; + FT_ULong here; + FT_UInt i, j; + FT_Fixed* tuple_coords = NULL; + FT_Fixed* im_start_coords = NULL; + FT_Fixed* im_end_coords = NULL; + FT_UInt point_count, spoint_count = 0; + FT_UShort* sharedpoints = NULL; + FT_UShort* localpoints = NULL; + FT_UShort* points; + FT_Short *deltas_x, *deltas_y; + + + if ( !face->doblend || !blend ) + return FT_THROW( Invalid_Argument ); + + if ( glyph_index >= blend->gv_glyphcnt || + blend->glyphoffsets[glyph_index] == + blend->glyphoffsets[glyph_index + 1] ) + { + FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:" + " no variation data for this glyph\n" )); + return FT_Err_Ok; + } + + if ( FT_NEW_ARRAY( points_org, n_points ) || + FT_NEW_ARRAY( points_out, n_points ) || + FT_NEW_ARRAY( has_delta, n_points ) ) + goto Fail1; + + if ( FT_STREAM_SEEK( blend->glyphoffsets[glyph_index] ) || + FT_FRAME_ENTER( blend->glyphoffsets[glyph_index + 1] - + blend->glyphoffsets[glyph_index] ) ) + goto Fail1; + + glyph_start = FT_Stream_FTell( stream ); + + /* each set of glyph variation data is formatted similarly to `cvar' */ + + if ( FT_NEW_ARRAY( tuple_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_start_coords, blend->num_axis ) || + FT_NEW_ARRAY( im_end_coords, blend->num_axis ) ) + goto Fail2; + + tupleCount = FT_GET_USHORT(); + offsetToData = FT_GET_USHORT(); + + /* rough sanity test */ + if ( offsetToData + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) * 4 > + blend->gvar_size ) + { + FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:" + " invalid glyph variation array header\n" )); + + error = FT_THROW( Invalid_Table ); + goto Fail2; + } + + offsetToData += glyph_start; + + if ( tupleCount & GX_TC_TUPLES_SHARE_POINT_NUMBERS ) + { + here = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, offsetToData ); + + sharedpoints = ft_var_readpackedpoints( stream, + blend->gvar_size, + &spoint_count ); + offsetToData = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, here ); + } + + FT_TRACE5(( "gvar: there %s %d tuple%s:\n", + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "is" : "are", + tupleCount & GX_TC_TUPLE_COUNT_MASK, + ( tupleCount & GX_TC_TUPLE_COUNT_MASK ) == 1 ? "" : "s" )); + + for ( j = 0; j < n_points; j++ ) + points_org[j] = outline->points[j]; + + for ( i = 0; i < ( tupleCount & GX_TC_TUPLE_COUNT_MASK ); i++ ) + { + FT_UInt tupleDataSize; + FT_UInt tupleIndex; + FT_Fixed apply; + + + FT_TRACE6(( " tuple %d:\n", i )); + + tupleDataSize = FT_GET_USHORT(); + tupleIndex = FT_GET_USHORT(); + + if ( tupleIndex & GX_TI_EMBEDDED_TUPLE_COORD ) + { + for ( j = 0; j < blend->num_axis; j++ ) + tuple_coords[j] = FT_GET_SHORT() * 4; /* convert from */ + /* short frac to fixed */ + } + else if ( ( tupleIndex & GX_TI_TUPLE_INDEX_MASK ) >= blend->tuplecount ) + { + FT_TRACE2(( "TT_Vary_Apply_Glyph_Deltas:" + " invalid tuple index\n" )); + + error = FT_THROW( Invalid_Table ); + goto Fail2; + } + else + FT_MEM_COPY( + tuple_coords, + &blend->tuplecoords[( tupleIndex & 0xFFF ) * blend->num_axis], + blend->num_axis * sizeof ( FT_Fixed ) ); + + if ( tupleIndex & GX_TI_INTERMEDIATE_TUPLE ) + { + for ( j = 0; j < blend->num_axis; j++ ) + im_start_coords[j] = FT_GET_SHORT() * 4; + for ( j = 0; j < blend->num_axis; j++ ) + im_end_coords[j] = FT_GET_SHORT() * 4; + } + + apply = ft_var_apply_tuple( blend, + (FT_UShort)tupleIndex, + tuple_coords, + im_start_coords, + im_end_coords ); + + if ( apply == 0 ) /* tuple isn't active for our blend */ + { + offsetToData += tupleDataSize; + continue; + } + + here = FT_Stream_FTell( stream ); + + FT_Stream_SeekSet( stream, offsetToData ); + + if ( tupleIndex & GX_TI_PRIVATE_POINT_NUMBERS ) + { + localpoints = ft_var_readpackedpoints( stream, + blend->gvar_size, + &point_count ); + points = localpoints; + } + else + { + points = sharedpoints; + point_count = spoint_count; + } + + deltas_x = ft_var_readpackeddeltas( stream, + blend->gvar_size, + point_count == 0 ? n_points + : point_count ); + deltas_y = ft_var_readpackeddeltas( stream, + blend->gvar_size, + point_count == 0 ? n_points + : point_count ); + + if ( !points || !deltas_y || !deltas_x ) + ; /* failure, ignore it */ + + else if ( points == ALL_POINTS ) + { +#ifdef FT_DEBUG_LEVEL_TRACE + int count = 0; +#endif + + + FT_TRACE7(( " point deltas:\n" )); + + /* this means that there are deltas for every point in the glyph */ + for ( j = 0; j < n_points; j++ ) + { + FT_Pos delta_x = FT_MulFix( deltas_x[j], apply ); + FT_Pos delta_y = FT_MulFix( deltas_y[j], apply ); + + + if ( j < n_points - 4 ) + { + outline->points[j].x += delta_x; + outline->points[j].y += delta_y; + } + else + { + /* To avoid double adjustment of advance width or height, */ + /* adjust phantom points only if there is no HVAR or VVAR */ + /* support, respectively. */ + if ( j == ( n_points - 4 ) && + !( face->variation_support & + TT_FACE_FLAG_VAR_LSB ) ) + outline->points[j].x += delta_x; + + else if ( j == ( n_points - 3 ) && + !( face->variation_support & + TT_FACE_FLAG_VAR_HADVANCE ) ) + outline->points[j].x += delta_x; + + else if ( j == ( n_points - 2 ) && + !( face->variation_support & + TT_FACE_FLAG_VAR_TSB ) ) + outline->points[j].y += delta_y; + + else if ( j == ( n_points - 1 ) && + !( face->variation_support & + TT_FACE_FLAG_VAR_VADVANCE ) ) + outline->points[j].y += delta_y; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( delta_x || delta_y ) + { + FT_TRACE7(( " %d: (%d, %d) -> (%d, %d)\n", + j, + outline->points[j].x - delta_x, + outline->points[j].y - delta_y, + outline->points[j].x, + outline->points[j].y )); + count++; + } +#endif + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !count ) + FT_TRACE7(( " none\n" )); +#endif + } + + else + { +#ifdef FT_DEBUG_LEVEL_TRACE + int count = 0; +#endif + + + /* we have to interpolate the missing deltas similar to the */ + /* IUP bytecode instruction */ + for ( j = 0; j < n_points; j++ ) + { + has_delta[j] = FALSE; + points_out[j] = points_org[j]; + } + + for ( j = 0; j < point_count; j++ ) + { + FT_UShort idx = points[j]; + + + if ( idx >= n_points ) + continue; + + has_delta[idx] = TRUE; + + points_out[idx].x += FT_MulFix( deltas_x[j], apply ); + points_out[idx].y += FT_MulFix( deltas_y[j], apply ); + } + + /* no need to handle phantom points here, */ + /* since solitary points can't be interpolated */ + tt_interpolate_deltas( outline, + points_out, + points_org, + has_delta ); + + FT_TRACE7(( " point deltas:\n" )); + + for ( j = 0; j < n_points; j++ ) + { + FT_Pos delta_x = points_out[j].x - points_org[j].x; + FT_Pos delta_y = points_out[j].y - points_org[j].y; + + + if ( j < n_points - 4 ) + { + outline->points[j].x += delta_x; + outline->points[j].y += delta_y; + } + else + { + /* To avoid double adjustment of advance width or height, */ + /* adjust phantom points only if there is no HVAR or VVAR */ + /* support, respectively. */ + if ( j == ( n_points - 4 ) && + !( face->variation_support & + TT_FACE_FLAG_VAR_LSB ) ) + outline->points[j].x += delta_x; + + else if ( j == ( n_points - 3 ) && + !( face->variation_support & + TT_FACE_FLAG_VAR_HADVANCE ) ) + outline->points[j].x += delta_x; + + else if ( j == ( n_points - 2 ) && + !( face->variation_support & + TT_FACE_FLAG_VAR_TSB ) ) + outline->points[j].y += delta_y; + + else if ( j == ( n_points - 1 ) && + !( face->variation_support & + TT_FACE_FLAG_VAR_VADVANCE ) ) + outline->points[j].y += delta_y; + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( delta_x || delta_y ) + { + FT_TRACE7(( " %d: (%d, %d) -> (%d, %d)\n", + j, + outline->points[j].x - delta_x, + outline->points[j].y - delta_y, + outline->points[j].x, + outline->points[j].y )); + count++; + } +#endif + } + +#ifdef FT_DEBUG_LEVEL_TRACE + if ( !count ) + FT_TRACE7(( " none\n" )); +#endif + } + + if ( localpoints != ALL_POINTS ) + FT_FREE( localpoints ); + FT_FREE( deltas_x ); + FT_FREE( deltas_y ); + + offsetToData += tupleDataSize; + + FT_Stream_SeekSet( stream, here ); + } + + FT_TRACE5(( "\n" )); + + Fail2: + if ( sharedpoints != ALL_POINTS ) + FT_FREE( sharedpoints ); + FT_FREE( tuple_coords ); + FT_FREE( im_start_coords ); + FT_FREE( im_end_coords ); + + FT_FRAME_EXIT(); + + Fail1: + FT_FREE( points_org ); + FT_FREE( points_out ); + FT_FREE( has_delta ); + + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_get_var_blend */ + /* */ + /* */ + /* An extended internal version of `TT_Get_MM_Blend' that returns */ + /* pointers instead of copying data, without any initialization of */ + /* the MM machinery in case it isn't loaded yet. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_get_var_blend( TT_Face face, + FT_UInt *num_coords, + FT_Fixed* *coords, + FT_Fixed* *normalizedcoords, + FT_MM_Var* *mm_var ) + { + if ( face->blend ) + { + if ( num_coords ) + *num_coords = face->blend->num_axis; + if ( coords ) + *coords = face->blend->coords; + if ( normalizedcoords ) + *normalizedcoords = face->blend->normalizedcoords; + if ( mm_var ) + *mm_var = face->blend->mmvar; + } + else + { + if ( num_coords ) + *num_coords = 0; + if ( coords ) + *coords = NULL; + if ( mm_var ) + *mm_var = NULL; + } + + return FT_Err_Ok; + } + + + static void + ft_var_done_item_variation_store( TT_Face face, + GX_ItemVarStore itemStore ) + { + FT_Memory memory = FT_FACE_MEMORY( face ); + FT_UInt i; + + + if ( itemStore->varData ) + { + for ( i = 0; i < itemStore->dataCount; i++ ) + { + FT_FREE( itemStore->varData[i].regionIndices ); + FT_FREE( itemStore->varData[i].deltaSet ); + } + + FT_FREE( itemStore->varData ); + } + + if ( itemStore->varRegionList ) + { + for ( i = 0; i < itemStore->regionCount; i++ ) + FT_FREE( itemStore->varRegionList[i].axisList ); + + FT_FREE( itemStore->varRegionList ); + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_done_blend */ + /* */ + /* */ + /* Free the blend internal data structure. */ + /* */ + FT_LOCAL_DEF( void ) + tt_done_blend( TT_Face face ) + { + FT_Memory memory = FT_FACE_MEMORY( face ); + GX_Blend blend = face->blend; + + + if ( blend ) + { + FT_UInt i, num_axes; + + + /* blend->num_axis might not be set up yet */ + num_axes = blend->mmvar->num_axis; + + FT_FREE( blend->coords ); + FT_FREE( blend->normalizedcoords ); + FT_FREE( blend->normalized_stylecoords ); + FT_FREE( blend->mmvar ); + + if ( blend->avar_segment ) + { + for ( i = 0; i < num_axes; i++ ) + FT_FREE( blend->avar_segment[i].correspondence ); + FT_FREE( blend->avar_segment ); + } + + if ( blend->hvar_table ) + { + ft_var_done_item_variation_store( face, + &blend->hvar_table->itemStore ); + + FT_FREE( blend->hvar_table->widthMap.innerIndex ); + FT_FREE( blend->hvar_table->widthMap.outerIndex ); + FT_FREE( blend->hvar_table ); + } + + if ( blend->vvar_table ) + { + ft_var_done_item_variation_store( face, + &blend->vvar_table->itemStore ); + + FT_FREE( blend->vvar_table->widthMap.innerIndex ); + FT_FREE( blend->vvar_table->widthMap.outerIndex ); + FT_FREE( blend->vvar_table ); + } + + if ( blend->mvar_table ) + { + ft_var_done_item_variation_store( face, + &blend->mvar_table->itemStore ); + + FT_FREE( blend->mvar_table->values ); + FT_FREE( blend->mvar_table ); + } + + FT_FREE( blend->tuplecoords ); + FT_FREE( blend->glyphoffsets ); + FT_FREE( blend ); + } + } + +#else /* !TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + /* ANSI C doesn't like empty source files */ + typedef int _tt_gxvar_dummy; + +#endif /* !TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttgxvar.h b/vendor/FreeType2/src/truetype/ttgxvar.h new file mode 100644 index 0000000..a37bb90 --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttgxvar.h @@ -0,0 +1,453 @@ +/***************************************************************************/ +/* */ +/* ttgxvar.h */ +/* */ +/* TrueType GX Font Variation loader (specification) */ +/* */ +/* Copyright 2004-2018 by */ +/* David Turner, Robert Wilhelm, Werner Lemberg and George Williams. */ +/* */ +/* 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 TTGXVAR_H_ +#define TTGXVAR_H_ + + +#include +#include "ttobjs.h" + + +FT_BEGIN_HEADER + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + /*************************************************************************/ + /* */ + /* */ + /* GX_AVarCorrespondenceRec */ + /* */ + /* */ + /* A data structure representing `shortFracCorrespondence' in `avar' */ + /* table according to the specifications from Apple. */ + /* */ + typedef struct GX_AVarCorrespondenceRec_ + { + FT_Fixed fromCoord; + FT_Fixed toCoord; + + } GX_AVarCorrespondenceRec_, *GX_AVarCorrespondence; + + + /*************************************************************************/ + /* */ + /* */ + /* GX_AVarRec */ + /* */ + /* */ + /* Data from the segment field of `avar' table. */ + /* There is one of these for each axis. */ + /* */ + typedef struct GX_AVarSegmentRec_ + { + FT_UShort pairCount; + GX_AVarCorrespondence correspondence; /* array with pairCount entries */ + + } GX_AVarSegmentRec, *GX_AVarSegment; + + + typedef struct GX_ItemVarDataRec_ + { + FT_UInt itemCount; /* number of delta sets per item */ + FT_UInt regionIdxCount; /* number of region indices in this data */ + FT_UInt* regionIndices; /* array of `regionCount' indices; */ + /* these index `varRegionList' */ + FT_Short* deltaSet; /* array of `itemCount' deltas */ + /* use `innerIndex' for this array */ + + } GX_ItemVarDataRec, *GX_ItemVarData; + + + /* contribution of one axis to a region */ + typedef struct GX_AxisCoordsRec_ + { + FT_Fixed startCoord; + FT_Fixed peakCoord; /* zero means no effect (factor = 1) */ + FT_Fixed endCoord; + + } GX_AxisCoordsRec, *GX_AxisCoords; + + + typedef struct GX_VarRegionRec_ + { + GX_AxisCoords axisList; /* array of axisCount records */ + + } GX_VarRegionRec, *GX_VarRegion; + + + /* item variation store */ + typedef struct GX_ItemVarStoreRec_ + { + FT_UInt dataCount; + GX_ItemVarData varData; /* array of dataCount records; */ + /* use `outerIndex' for this array */ + FT_UShort axisCount; + FT_UInt regionCount; /* total number of regions defined */ + GX_VarRegion varRegionList; + + } GX_ItemVarStoreRec, *GX_ItemVarStore; + + + typedef struct GX_DeltaSetIdxMapRec_ + { + FT_UInt mapCount; + FT_UInt* outerIndex; /* indices to item var data */ + FT_UInt* innerIndex; /* indices to delta set */ + + } GX_DeltaSetIdxMapRec, *GX_DeltaSetIdxMap; + + + /*************************************************************************/ + /* */ + /* */ + /* GX_HVVarTableRec */ + /* */ + /* */ + /* Data from either the `HVAR' or `VVAR' table. */ + /* */ + typedef struct GX_HVVarTableRec_ + { + GX_ItemVarStoreRec itemStore; /* Item Variation Store */ + GX_DeltaSetIdxMapRec widthMap; /* Advance Width Mapping */ + +#if 0 + GX_DeltaSetIdxMapRec lsbMap; /* not implemented */ + GX_DeltaSetIdxMapRec rsbMap; /* not implemented */ + + GX_DeltaSetIdxMapRec tsbMap; /* not implemented */ + GX_DeltaSetIdxMapRec bsbMap; /* not implemented */ + GX_DeltaSetIdxMapRec vorgMap; /* not implemented */ +#endif + + } GX_HVVarTableRec, *GX_HVVarTable; + + +#define MVAR_TAG_GASP_0 FT_MAKE_TAG( 'g', 's', 'p', '0' ) +#define MVAR_TAG_GASP_1 FT_MAKE_TAG( 'g', 's', 'p', '1' ) +#define MVAR_TAG_GASP_2 FT_MAKE_TAG( 'g', 's', 'p', '2' ) +#define MVAR_TAG_GASP_3 FT_MAKE_TAG( 'g', 's', 'p', '3' ) +#define MVAR_TAG_GASP_4 FT_MAKE_TAG( 'g', 's', 'p', '4' ) +#define MVAR_TAG_GASP_5 FT_MAKE_TAG( 'g', 's', 'p', '5' ) +#define MVAR_TAG_GASP_6 FT_MAKE_TAG( 'g', 's', 'p', '6' ) +#define MVAR_TAG_GASP_7 FT_MAKE_TAG( 'g', 's', 'p', '7' ) +#define MVAR_TAG_GASP_8 FT_MAKE_TAG( 'g', 's', 'p', '8' ) +#define MVAR_TAG_GASP_9 FT_MAKE_TAG( 'g', 's', 'p', '9' ) + +#define MVAR_TAG_CPHT FT_MAKE_TAG( 'c', 'p', 'h', 't' ) +#define MVAR_TAG_HASC FT_MAKE_TAG( 'h', 'a', 's', 'c' ) +#define MVAR_TAG_HCLA FT_MAKE_TAG( 'h', 'c', 'l', 'a' ) +#define MVAR_TAG_HCLD FT_MAKE_TAG( 'h', 'c', 'l', 'd' ) +#define MVAR_TAG_HCOF FT_MAKE_TAG( 'h', 'c', 'o', 'f' ) +#define MVAR_TAG_HCRN FT_MAKE_TAG( 'h', 'c', 'r', 'n' ) +#define MVAR_TAG_HCRS FT_MAKE_TAG( 'h', 'c', 'r', 's' ) +#define MVAR_TAG_HDSC FT_MAKE_TAG( 'h', 'd', 's', 'c' ) +#define MVAR_TAG_HLGP FT_MAKE_TAG( 'h', 'l', 'g', 'p' ) +#define MVAR_TAG_SBXO FT_MAKE_TAG( 's', 'b', 'x', 'o' ) +#define MVAR_TAG_SBXS FT_MAKE_TAG( 's', 'b', 'x', 's' ) +#define MVAR_TAG_SBYO FT_MAKE_TAG( 's', 'b', 'y', 'o' ) +#define MVAR_TAG_SBYS FT_MAKE_TAG( 's', 'b', 'y', 's' ) +#define MVAR_TAG_SPXO FT_MAKE_TAG( 's', 'p', 'x', 'o' ) +#define MVAR_TAG_SPXS FT_MAKE_TAG( 's', 'p', 'x', 's' ) +#define MVAR_TAG_SPYO FT_MAKE_TAG( 's', 'p', 'y', 'o' ) +#define MVAR_TAG_SPYS FT_MAKE_TAG( 's', 'p', 'y', 's' ) +#define MVAR_TAG_STRO FT_MAKE_TAG( 's', 't', 'r', 'o' ) +#define MVAR_TAG_STRS FT_MAKE_TAG( 's', 't', 'r', 's' ) +#define MVAR_TAG_UNDO FT_MAKE_TAG( 'u', 'n', 'd', 'o' ) +#define MVAR_TAG_UNDS FT_MAKE_TAG( 'u', 'n', 'd', 's' ) +#define MVAR_TAG_VASC FT_MAKE_TAG( 'v', 'a', 's', 'c' ) +#define MVAR_TAG_VCOF FT_MAKE_TAG( 'v', 'c', 'o', 'f' ) +#define MVAR_TAG_VCRN FT_MAKE_TAG( 'v', 'c', 'r', 'n' ) +#define MVAR_TAG_VCRS FT_MAKE_TAG( 'v', 'c', 'r', 's' ) +#define MVAR_TAG_VDSC FT_MAKE_TAG( 'v', 'd', 's', 'c' ) +#define MVAR_TAG_VLGP FT_MAKE_TAG( 'v', 'l', 'g', 'p' ) +#define MVAR_TAG_XHGT FT_MAKE_TAG( 'x', 'h', 'g', 't' ) + + + typedef struct GX_ValueRec_ + { + FT_ULong tag; + FT_UShort outerIndex; + FT_UShort innerIndex; + + FT_Short unmodified; /* values are either FT_Short or FT_UShort */ + + } GX_ValueRec, *GX_Value; + + + /*************************************************************************/ + /* */ + /* */ + /* GX_MVarTableRec */ + /* */ + /* */ + /* Data from the `MVAR' table. */ + /* */ + typedef struct GX_MVarTableRec_ + { + FT_UShort valueCount; + + GX_ItemVarStoreRec itemStore; /* Item Variation Store */ + GX_Value values; /* Value Records */ + + } GX_MVarTableRec, *GX_MVarTable; + + + /*************************************************************************/ + /* */ + /* */ + /* GX_BlendRec */ + /* */ + /* */ + /* Data for interpolating a font from a distortable font specified */ + /* by the GX *var tables ([fgcahvm]var). */ + /* */ + /* */ + /* num_axis :: */ + /* The number of axes along which interpolation may happen. */ + /* */ + /* coords :: */ + /* An array of design coordinates (in user space) indicating the */ + /* contribution along each axis to the final interpolated font. */ + /* `normalizedcoords' holds the same values. */ + /* */ + /* normalizedcoords :: */ + /* An array of normalized values (between [-1,1]) indicating the */ + /* contribution along each axis to the final interpolated font. */ + /* `coords' holds the same values. */ + /* */ + /* mmvar :: */ + /* Data from the `fvar' table. */ + /* */ + /* mmvar_len :: */ + /* The length of the `mmvar' structure. */ + /* */ + /* normalized_stylecoords :: */ + /* A two-dimensional array that holds the named instance data from */ + /* `mmvar' as normalized values. */ + /* */ + /* avar_loaded :: */ + /* A Boolean; if set, FreeType tried to load (and parse) the `avar' */ + /* table. */ + /* */ + /* avar_segment :: */ + /* Data from the `avar' table. */ + /* */ + /* hvar_loaded :: */ + /* A Boolean; if set, FreeType tried to load (and parse) the `hvar' */ + /* table. */ + /* */ + /* hvar_checked :: */ + /* A Boolean; if set, FreeType successfully loaded and parsed the */ + /* `hvar' table. */ + /* */ + /* hvar_error :: */ + /* If loading and parsing of the `hvar' table failed, this field */ + /* holds the corresponding error code. */ + /* */ + /* hvar_table :: */ + /* Data from the `hvar' table. */ + /* */ + /* vvar_loaded :: */ + /* A Boolean; if set, FreeType tried to load (and parse) the `vvar' */ + /* table. */ + /* */ + /* vvar_checked :: */ + /* A Boolean; if set, FreeType successfully loaded and parsed the */ + /* `vvar' table. */ + /* */ + /* vvar_error :: */ + /* If loading and parsing of the `vvar' table failed, this field */ + /* holds the corresponding error code. */ + /* */ + /* vvar_table :: */ + /* Data from the `vvar' table. */ + /* */ + /* mvar_table :: */ + /* Data from the `mvar' table. */ + /* */ + /* tuplecount :: */ + /* The number of shared tuples in the `gvar' table. */ + /* */ + /* tuplecoords :: */ + /* A two-dimensional array that holds the shared tuple coordinates */ + /* in the `gvar' table. */ + /* */ + /* gv_glyphcnt :: */ + /* The number of glyphs handled in the `gvar' table. */ + /* */ + /* glyphoffsets :: */ + /* Offsets into the glyph variation data array. */ + /* */ + /* gvar_size :: */ + /* The size of the `gvar' table. */ + /* */ + typedef struct GX_BlendRec_ + { + FT_UInt num_axis; + FT_Fixed* coords; + FT_Fixed* normalizedcoords; + + FT_MM_Var* mmvar; + FT_Offset mmvar_len; + + FT_Fixed* normalized_stylecoords; + /* normalized_stylecoords[num_namedstyles][num_axis] */ + + FT_Bool avar_loaded; + GX_AVarSegment avar_segment; /* avar_segment[num_axis] */ + + FT_Bool hvar_loaded; + FT_Bool hvar_checked; + FT_Error hvar_error; + GX_HVVarTable hvar_table; + + FT_Bool vvar_loaded; + FT_Bool vvar_checked; + FT_Error vvar_error; + GX_HVVarTable vvar_table; + + GX_MVarTable mvar_table; + + FT_UInt tuplecount; + FT_Fixed* tuplecoords; /* tuplecoords[tuplecount][num_axis] */ + + FT_UInt gv_glyphcnt; + FT_ULong* glyphoffsets; /* glyphoffsets[gv_glyphcnt + 1] */ + + FT_ULong gvar_size; + + } GX_BlendRec; + + + /*************************************************************************/ + /* */ + /* */ + /* GX_TupleCountFlags */ + /* */ + /* */ + /* Flags used within the `TupleCount' field of the `gvar' table. */ + /* */ + typedef enum GX_TupleCountFlags_ + { + GX_TC_TUPLES_SHARE_POINT_NUMBERS = 0x8000, + GX_TC_RESERVED_TUPLE_FLAGS = 0x7000, + GX_TC_TUPLE_COUNT_MASK = 0x0FFF + + } GX_TupleCountFlags; + + + /*************************************************************************/ + /* */ + /* */ + /* GX_TupleIndexFlags */ + /* */ + /* */ + /* Flags used within the `TupleIndex' field of the `gvar' and `cvar' */ + /* tables. */ + /* */ + typedef enum GX_TupleIndexFlags_ + { + GX_TI_EMBEDDED_TUPLE_COORD = 0x8000, + GX_TI_INTERMEDIATE_TUPLE = 0x4000, + GX_TI_PRIVATE_POINT_NUMBERS = 0x2000, + GX_TI_RESERVED_TUPLE_FLAG = 0x1000, + GX_TI_TUPLE_INDEX_MASK = 0x0FFF + + } GX_TupleIndexFlags; + + +#define TTAG_wght FT_MAKE_TAG( 'w', 'g', 'h', 't' ) +#define TTAG_wdth FT_MAKE_TAG( 'w', 'd', 't', 'h' ) +#define TTAG_opsz FT_MAKE_TAG( 'o', 'p', 's', 'z' ) +#define TTAG_slnt FT_MAKE_TAG( 's', 'l', 'n', 't' ) + + + FT_LOCAL( FT_Error ) + TT_Set_MM_Blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Get_MM_Blend( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Set_Var_Design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Get_MM_Var( TT_Face face, + FT_MM_Var* *master ); + + FT_LOCAL( FT_Error ) + TT_Get_Var_Design( TT_Face face, + FT_UInt num_coords, + FT_Fixed* coords ); + + FT_LOCAL( FT_Error ) + TT_Set_Named_Instance( TT_Face face, + FT_UInt instance_index ); + + FT_LOCAL( FT_Error ) + tt_face_vary_cvt( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + TT_Vary_Apply_Glyph_Deltas( TT_Face face, + FT_UInt glyph_index, + FT_Outline* outline, + FT_UInt n_points ); + + FT_LOCAL( FT_Error ) + tt_hadvance_adjust( TT_Face face, + FT_UInt gindex, + FT_Int *adelta ); + + FT_LOCAL( FT_Error ) + tt_vadvance_adjust( TT_Face face, + FT_UInt gindex, + FT_Int *adelta ); + + FT_LOCAL( void ) + tt_apply_mvar( TT_Face face ); + + FT_LOCAL( FT_Error ) + tt_get_var_blend( TT_Face face, + FT_UInt *num_coords, + FT_Fixed* *coords, + FT_Fixed* *normalizedcoords, + FT_MM_Var* *mm_var ); + + FT_LOCAL( void ) + tt_done_blend( TT_Face face ); + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + +FT_END_HEADER + + +#endif /* TTGXVAR_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttinterp.c b/vendor/FreeType2/src/truetype/ttinterp.c new file mode 100644 index 0000000..da9b595 --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttinterp.c @@ -0,0 +1,8551 @@ +/***************************************************************************/ +/* */ +/* ttinterp.c */ +/* */ +/* TrueType bytecode interpreter (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +/* Greg Hitchcock from Microsoft has helped a lot in resolving unclear */ +/* issues; many thanks! */ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_TRIGONOMETRY_H +#include FT_SYSTEM_H +#include FT_DRIVER_H +#include FT_MULTIPLE_MASTERS_H + +#include "ttinterp.h" +#include "tterrors.h" +#include "ttsubpix.h" +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + + /*************************************************************************/ + /* */ + /* 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_ttinterp + + +#define NO_SUBPIXEL_HINTING \ + ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \ + TT_INTERPRETER_VERSION_35 ) + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY +#define SUBPIXEL_HINTING_INFINALITY \ + ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \ + TT_INTERPRETER_VERSION_38 ) +#endif + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL +#define SUBPIXEL_HINTING_MINIMAL \ + ( ((TT_Driver)FT_FACE_DRIVER( exc->face ))->interpreter_version == \ + TT_INTERPRETER_VERSION_40 ) +#endif + +#define PROJECT( v1, v2 ) \ + exc->func_project( exc, \ + SUB_LONG( (v1)->x, (v2)->x ), \ + SUB_LONG( (v1)->y, (v2)->y ) ) + +#define DUALPROJ( v1, v2 ) \ + exc->func_dualproj( exc, \ + SUB_LONG( (v1)->x, (v2)->x ), \ + SUB_LONG( (v1)->y, (v2)->y ) ) + +#define FAST_PROJECT( v ) \ + exc->func_project( exc, (v)->x, (v)->y ) + +#define FAST_DUALPROJ( v ) \ + exc->func_dualproj( exc, (v)->x, (v)->y ) + + + /*************************************************************************/ + /* */ + /* Two simple bounds-checking macros. */ + /* */ +#define BOUNDS( x, n ) ( (FT_UInt)(x) >= (FT_UInt)(n) ) +#define BOUNDSL( x, n ) ( (FT_ULong)(x) >= (FT_ULong)(n) ) + + +#undef SUCCESS +#define SUCCESS 0 + +#undef FAILURE +#define FAILURE 1 + + + /*************************************************************************/ + /* */ + /* CODERANGE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Goto_CodeRange */ + /* */ + /* */ + /* Switches to a new code range (updates the code related elements in */ + /* `exec', and `IP'). */ + /* */ + /* */ + /* range :: The new execution code range. */ + /* */ + /* IP :: The new IP in the new code range. */ + /* */ + /* */ + /* exec :: The target execution context. */ + /* */ + FT_LOCAL_DEF( void ) + TT_Goto_CodeRange( TT_ExecContext exec, + FT_Int range, + FT_Long IP ) + { + TT_CodeRange* coderange; + + + FT_ASSERT( range >= 1 && range <= 3 ); + + coderange = &exec->codeRangeTable[range - 1]; + + FT_ASSERT( coderange->base ); + + /* NOTE: Because the last instruction of a program may be a CALL */ + /* which will return to the first byte *after* the code */ + /* range, we test for IP <= Size instead of IP < Size. */ + /* */ + FT_ASSERT( IP <= coderange->size ); + + exec->code = coderange->base; + exec->codeSize = coderange->size; + exec->IP = IP; + exec->curRange = range; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Set_CodeRange */ + /* */ + /* */ + /* Sets a code range. */ + /* */ + /* */ + /* range :: The code range index. */ + /* */ + /* base :: The new code base. */ + /* */ + /* length :: The range size in bytes. */ + /* */ + /* */ + /* exec :: The target execution context. */ + /* */ + FT_LOCAL_DEF( void ) + TT_Set_CodeRange( TT_ExecContext exec, + FT_Int range, + void* base, + FT_Long length ) + { + FT_ASSERT( range >= 1 && range <= 3 ); + + exec->codeRangeTable[range - 1].base = (FT_Byte*)base; + exec->codeRangeTable[range - 1].size = length; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Clear_CodeRange */ + /* */ + /* */ + /* Clears a code range. */ + /* */ + /* */ + /* range :: The code range index. */ + /* */ + /* */ + /* exec :: The target execution context. */ + /* */ + FT_LOCAL_DEF( void ) + TT_Clear_CodeRange( TT_ExecContext exec, + FT_Int range ) + { + FT_ASSERT( range >= 1 && range <= 3 ); + + exec->codeRangeTable[range - 1].base = NULL; + exec->codeRangeTable[range - 1].size = 0; + } + + + /*************************************************************************/ + /* */ + /* EXECUTION CONTEXT ROUTINES */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Done_Context */ + /* */ + /* */ + /* Destroys a given context. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* memory :: A handle to the parent memory object. */ + /* */ + /* */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_LOCAL_DEF( void ) + TT_Done_Context( TT_ExecContext exec ) + { + FT_Memory memory = exec->memory; + + + /* points zone */ + exec->maxPoints = 0; + exec->maxContours = 0; + + /* free stack */ + FT_FREE( exec->stack ); + exec->stackSize = 0; + + /* free call stack */ + FT_FREE( exec->callStack ); + exec->callSize = 0; + exec->callTop = 0; + + /* free glyph code range */ + FT_FREE( exec->glyphIns ); + exec->glyphSize = 0; + + exec->size = NULL; + exec->face = NULL; + + FT_FREE( exec ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* Init_Context */ + /* */ + /* */ + /* Initializes a context object. */ + /* */ + /* */ + /* memory :: A handle to the parent memory object. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + static FT_Error + Init_Context( TT_ExecContext exec, + FT_Memory memory ) + { + FT_Error error; + + + FT_TRACE1(( "Init_Context: new object at 0x%08p\n", exec )); + + exec->memory = memory; + exec->callSize = 32; + + if ( FT_NEW_ARRAY( exec->callStack, exec->callSize ) ) + goto Fail_Memory; + + /* all values in the context are set to 0 already, but this is */ + /* here as a remainder */ + exec->maxPoints = 0; + exec->maxContours = 0; + + exec->stackSize = 0; + exec->glyphSize = 0; + + exec->stack = NULL; + exec->glyphIns = NULL; + + exec->face = NULL; + exec->size = NULL; + + return FT_Err_Ok; + + Fail_Memory: + FT_ERROR(( "Init_Context: not enough memory for %p\n", exec )); + TT_Done_Context( exec ); + + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Update_Max */ + /* */ + /* */ + /* Checks the size of a buffer and reallocates it if necessary. */ + /* */ + /* */ + /* memory :: A handle to the parent memory object. */ + /* */ + /* multiplier :: The size in bytes of each element in the buffer. */ + /* */ + /* new_max :: The new capacity (size) of the buffer. */ + /* */ + /* */ + /* size :: The address of the buffer's current size expressed */ + /* in elements. */ + /* */ + /* buff :: The address of the buffer base pointer. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + Update_Max( FT_Memory memory, + FT_ULong* size, + FT_ULong multiplier, + void* _pbuff, + FT_ULong new_max ) + { + FT_Error error; + void** pbuff = (void**)_pbuff; + + + if ( *size < new_max ) + { + if ( FT_REALLOC( *pbuff, *size * multiplier, new_max * multiplier ) ) + return error; + *size = new_max; + } + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Load_Context */ + /* */ + /* */ + /* Prepare an execution context for glyph hinting. */ + /* */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* size :: A handle to the source size object. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Load_Context( TT_ExecContext exec, + TT_Face face, + TT_Size size ) + { + FT_Int i; + FT_ULong tmp; + TT_MaxProfile* maxp; + FT_Error error; + + + exec->face = face; + maxp = &face->max_profile; + exec->size = size; + + if ( size ) + { + exec->numFDefs = size->num_function_defs; + exec->maxFDefs = size->max_function_defs; + exec->numIDefs = size->num_instruction_defs; + exec->maxIDefs = size->max_instruction_defs; + exec->FDefs = size->function_defs; + exec->IDefs = size->instruction_defs; + exec->pointSize = size->point_size; + exec->tt_metrics = size->ttmetrics; + exec->metrics = *size->metrics; + + exec->maxFunc = size->max_func; + exec->maxIns = size->max_ins; + + for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) + exec->codeRangeTable[i] = size->codeRangeTable[i]; + + /* set graphics state */ + exec->GS = size->GS; + + exec->cvtSize = size->cvt_size; + exec->cvt = size->cvt; + + exec->storeSize = size->storage_size; + exec->storage = size->storage; + + exec->twilight = size->twilight; + + /* In case of multi-threading it can happen that the old size object */ + /* no longer exists, thus we must clear all glyph zone references. */ + FT_ZERO( &exec->zp0 ); + exec->zp1 = exec->zp0; + exec->zp2 = exec->zp0; + } + + /* XXX: We reserve a little more elements on the stack to deal safely */ + /* with broken fonts like arialbs, courbs, timesbs, etc. */ + tmp = (FT_ULong)exec->stackSize; + error = Update_Max( exec->memory, + &tmp, + sizeof ( FT_F26Dot6 ), + (void*)&exec->stack, + maxp->maxStackElements + 32 ); + exec->stackSize = (FT_Long)tmp; + if ( error ) + return error; + + tmp = exec->glyphSize; + error = Update_Max( exec->memory, + &tmp, + sizeof ( FT_Byte ), + (void*)&exec->glyphIns, + maxp->maxSizeOfInstructions ); + exec->glyphSize = (FT_UShort)tmp; + if ( error ) + return error; + + exec->pts.n_points = 0; + exec->pts.n_contours = 0; + + exec->zp1 = exec->pts; + exec->zp2 = exec->pts; + exec->zp0 = exec->pts; + + exec->instruction_trap = FALSE; + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Save_Context */ + /* */ + /* */ + /* Saves the code ranges in a `size' object. */ + /* */ + /* */ + /* exec :: A handle to the source execution context. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + /* */ + /* Only the glyph loader and debugger should call this function. */ + /* */ + FT_LOCAL_DEF( void ) + TT_Save_Context( TT_ExecContext exec, + TT_Size size ) + { + FT_Int i; + + + /* XXX: Will probably disappear soon with all the code range */ + /* management, which is now rather obsolete. */ + /* */ + size->num_function_defs = exec->numFDefs; + size->num_instruction_defs = exec->numIDefs; + + size->max_func = exec->maxFunc; + size->max_ins = exec->maxIns; + + for ( i = 0; i < TT_MAX_CODE_RANGES; i++ ) + size->codeRangeTable[i] = exec->codeRangeTable[i]; + } + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Run_Context */ + /* */ + /* */ + /* Executes one or more instructions in the execution context. */ + /* */ + /* */ + /* debug :: A Boolean flag. If set, the function sets some internal */ + /* variables and returns immediately, otherwise TT_RunIns() */ + /* is called. */ + /* */ + /* This is commented out currently. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* */ + /* TrueType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + TT_Run_Context( TT_ExecContext exec ) + { + TT_Goto_CodeRange( exec, tt_coderange_glyph, 0 ); + + exec->zp0 = exec->pts; + exec->zp1 = exec->pts; + exec->zp2 = exec->pts; + + exec->GS.gep0 = 1; + exec->GS.gep1 = 1; + exec->GS.gep2 = 1; + + exec->GS.projVector.x = 0x4000; + exec->GS.projVector.y = 0x0000; + + exec->GS.freeVector = exec->GS.projVector; + exec->GS.dualVector = exec->GS.projVector; + + exec->GS.round_state = 1; + exec->GS.loop = 1; + + /* some glyphs leave something on the stack. so we clean it */ + /* before a new execution. */ + exec->top = 0; + exec->callTop = 0; + + return exec->face->interpreter( exec ); + } + + + /* The default value for `scan_control' is documented as FALSE in the */ + /* TrueType specification. This is confusing since it implies a */ + /* Boolean value. However, this is not the case, thus both the */ + /* default values of our `scan_type' and `scan_control' fields (which */ + /* the documentation's `scan_control' variable is split into) are */ + /* zero. */ + + const TT_GraphicsState tt_default_graphics_state = + { + 0, 0, 0, + { 0x4000, 0 }, + { 0x4000, 0 }, + { 0x4000, 0 }, + + 1, 64, 1, + TRUE, 68, 0, 0, 9, 3, + 0, FALSE, 0, 1, 1, 1 + }; + + + /* documentation is in ttinterp.h */ + + FT_EXPORT_DEF( TT_ExecContext ) + TT_New_Context( TT_Driver driver ) + { + FT_Memory memory; + FT_Error error; + + TT_ExecContext exec = NULL; + + + if ( !driver ) + goto Fail; + + memory = driver->root.root.memory; + + /* allocate object */ + if ( FT_NEW( exec ) ) + goto Fail; + + /* initialize it; in case of error this deallocates `exec' too */ + error = Init_Context( exec, memory ); + if ( error ) + goto Fail; + + return exec; + + Fail: + return NULL; + } + + + /*************************************************************************/ + /* */ + /* Before an opcode is executed, the interpreter verifies that there are */ + /* enough arguments on the stack, with the help of the `Pop_Push_Count' */ + /* table. */ + /* */ + /* For each opcode, the first column gives the number of arguments that */ + /* are popped from the stack; the second one gives the number of those */ + /* that are pushed in result. */ + /* */ + /* Opcodes which have a varying number of parameters in the data stream */ + /* (NPUSHB, NPUSHW) are handled specially; they have a negative value in */ + /* the `opcode_length' table, and the value in `Pop_Push_Count' is set */ + /* to zero. */ + /* */ + /*************************************************************************/ + + +#undef PACK +#define PACK( x, y ) ( ( x << 4 ) | y ) + + + static + const FT_Byte Pop_Push_Count[256] = + { + /* opcodes are gathered in groups of 16 */ + /* please keep the spaces as they are */ + + /* SVTCA y */ PACK( 0, 0 ), + /* SVTCA x */ PACK( 0, 0 ), + /* SPvTCA y */ PACK( 0, 0 ), + /* SPvTCA x */ PACK( 0, 0 ), + /* SFvTCA y */ PACK( 0, 0 ), + /* SFvTCA x */ PACK( 0, 0 ), + /* SPvTL // */ PACK( 2, 0 ), + /* SPvTL + */ PACK( 2, 0 ), + /* SFvTL // */ PACK( 2, 0 ), + /* SFvTL + */ PACK( 2, 0 ), + /* SPvFS */ PACK( 2, 0 ), + /* SFvFS */ PACK( 2, 0 ), + /* GPv */ PACK( 0, 2 ), + /* GFv */ PACK( 0, 2 ), + /* SFvTPv */ PACK( 0, 0 ), + /* ISECT */ PACK( 5, 0 ), + + /* SRP0 */ PACK( 1, 0 ), + /* SRP1 */ PACK( 1, 0 ), + /* SRP2 */ PACK( 1, 0 ), + /* SZP0 */ PACK( 1, 0 ), + /* SZP1 */ PACK( 1, 0 ), + /* SZP2 */ PACK( 1, 0 ), + /* SZPS */ PACK( 1, 0 ), + /* SLOOP */ PACK( 1, 0 ), + /* RTG */ PACK( 0, 0 ), + /* RTHG */ PACK( 0, 0 ), + /* SMD */ PACK( 1, 0 ), + /* ELSE */ PACK( 0, 0 ), + /* JMPR */ PACK( 1, 0 ), + /* SCvTCi */ PACK( 1, 0 ), + /* SSwCi */ PACK( 1, 0 ), + /* SSW */ PACK( 1, 0 ), + + /* DUP */ PACK( 1, 2 ), + /* POP */ PACK( 1, 0 ), + /* CLEAR */ PACK( 0, 0 ), + /* SWAP */ PACK( 2, 2 ), + /* DEPTH */ PACK( 0, 1 ), + /* CINDEX */ PACK( 1, 1 ), + /* MINDEX */ PACK( 1, 0 ), + /* AlignPTS */ PACK( 2, 0 ), + /* INS_$28 */ PACK( 0, 0 ), + /* UTP */ PACK( 1, 0 ), + /* LOOPCALL */ PACK( 2, 0 ), + /* CALL */ PACK( 1, 0 ), + /* FDEF */ PACK( 1, 0 ), + /* ENDF */ PACK( 0, 0 ), + /* MDAP[0] */ PACK( 1, 0 ), + /* MDAP[1] */ PACK( 1, 0 ), + + /* IUP[0] */ PACK( 0, 0 ), + /* IUP[1] */ PACK( 0, 0 ), + /* SHP[0] */ PACK( 0, 0 ), /* loops */ + /* SHP[1] */ PACK( 0, 0 ), /* loops */ + /* SHC[0] */ PACK( 1, 0 ), + /* SHC[1] */ PACK( 1, 0 ), + /* SHZ[0] */ PACK( 1, 0 ), + /* SHZ[1] */ PACK( 1, 0 ), + /* SHPIX */ PACK( 1, 0 ), /* loops */ + /* IP */ PACK( 0, 0 ), /* loops */ + /* MSIRP[0] */ PACK( 2, 0 ), + /* MSIRP[1] */ PACK( 2, 0 ), + /* AlignRP */ PACK( 0, 0 ), /* loops */ + /* RTDG */ PACK( 0, 0 ), + /* MIAP[0] */ PACK( 2, 0 ), + /* MIAP[1] */ PACK( 2, 0 ), + + /* NPushB */ PACK( 0, 0 ), + /* NPushW */ PACK( 0, 0 ), + /* WS */ PACK( 2, 0 ), + /* RS */ PACK( 1, 1 ), + /* WCvtP */ PACK( 2, 0 ), + /* RCvt */ PACK( 1, 1 ), + /* GC[0] */ PACK( 1, 1 ), + /* GC[1] */ PACK( 1, 1 ), + /* SCFS */ PACK( 2, 0 ), + /* MD[0] */ PACK( 2, 1 ), + /* MD[1] */ PACK( 2, 1 ), + /* MPPEM */ PACK( 0, 1 ), + /* MPS */ PACK( 0, 1 ), + /* FlipON */ PACK( 0, 0 ), + /* FlipOFF */ PACK( 0, 0 ), + /* DEBUG */ PACK( 1, 0 ), + + /* LT */ PACK( 2, 1 ), + /* LTEQ */ PACK( 2, 1 ), + /* GT */ PACK( 2, 1 ), + /* GTEQ */ PACK( 2, 1 ), + /* EQ */ PACK( 2, 1 ), + /* NEQ */ PACK( 2, 1 ), + /* ODD */ PACK( 1, 1 ), + /* EVEN */ PACK( 1, 1 ), + /* IF */ PACK( 1, 0 ), + /* EIF */ PACK( 0, 0 ), + /* AND */ PACK( 2, 1 ), + /* OR */ PACK( 2, 1 ), + /* NOT */ PACK( 1, 1 ), + /* DeltaP1 */ PACK( 1, 0 ), + /* SDB */ PACK( 1, 0 ), + /* SDS */ PACK( 1, 0 ), + + /* ADD */ PACK( 2, 1 ), + /* SUB */ PACK( 2, 1 ), + /* DIV */ PACK( 2, 1 ), + /* MUL */ PACK( 2, 1 ), + /* ABS */ PACK( 1, 1 ), + /* NEG */ PACK( 1, 1 ), + /* FLOOR */ PACK( 1, 1 ), + /* CEILING */ PACK( 1, 1 ), + /* ROUND[0] */ PACK( 1, 1 ), + /* ROUND[1] */ PACK( 1, 1 ), + /* ROUND[2] */ PACK( 1, 1 ), + /* ROUND[3] */ PACK( 1, 1 ), + /* NROUND[0] */ PACK( 1, 1 ), + /* NROUND[1] */ PACK( 1, 1 ), + /* NROUND[2] */ PACK( 1, 1 ), + /* NROUND[3] */ PACK( 1, 1 ), + + /* WCvtF */ PACK( 2, 0 ), + /* DeltaP2 */ PACK( 1, 0 ), + /* DeltaP3 */ PACK( 1, 0 ), + /* DeltaCn[0] */ PACK( 1, 0 ), + /* DeltaCn[1] */ PACK( 1, 0 ), + /* DeltaCn[2] */ PACK( 1, 0 ), + /* SROUND */ PACK( 1, 0 ), + /* S45Round */ PACK( 1, 0 ), + /* JROT */ PACK( 2, 0 ), + /* JROF */ PACK( 2, 0 ), + /* ROFF */ PACK( 0, 0 ), + /* INS_$7B */ PACK( 0, 0 ), + /* RUTG */ PACK( 0, 0 ), + /* RDTG */ PACK( 0, 0 ), + /* SANGW */ PACK( 1, 0 ), + /* AA */ PACK( 1, 0 ), + + /* FlipPT */ PACK( 0, 0 ), /* loops */ + /* FlipRgON */ PACK( 2, 0 ), + /* FlipRgOFF */ PACK( 2, 0 ), + /* INS_$83 */ PACK( 0, 0 ), + /* INS_$84 */ PACK( 0, 0 ), + /* ScanCTRL */ PACK( 1, 0 ), + /* SDPvTL[0] */ PACK( 2, 0 ), + /* SDPvTL[1] */ PACK( 2, 0 ), + /* GetINFO */ PACK( 1, 1 ), + /* IDEF */ PACK( 1, 0 ), + /* ROLL */ PACK( 3, 3 ), + /* MAX */ PACK( 2, 1 ), + /* MIN */ PACK( 2, 1 ), + /* ScanTYPE */ PACK( 1, 0 ), + /* InstCTRL */ PACK( 2, 0 ), + /* INS_$8F */ PACK( 0, 0 ), + + /* INS_$90 */ PACK( 0, 0 ), + /* GETVAR */ PACK( 0, 0 ), /* will be handled specially */ + /* GETDATA */ PACK( 0, 1 ), + /* INS_$93 */ PACK( 0, 0 ), + /* INS_$94 */ PACK( 0, 0 ), + /* INS_$95 */ PACK( 0, 0 ), + /* INS_$96 */ PACK( 0, 0 ), + /* INS_$97 */ PACK( 0, 0 ), + /* INS_$98 */ PACK( 0, 0 ), + /* INS_$99 */ PACK( 0, 0 ), + /* INS_$9A */ PACK( 0, 0 ), + /* INS_$9B */ PACK( 0, 0 ), + /* INS_$9C */ PACK( 0, 0 ), + /* INS_$9D */ PACK( 0, 0 ), + /* INS_$9E */ PACK( 0, 0 ), + /* INS_$9F */ PACK( 0, 0 ), + + /* INS_$A0 */ PACK( 0, 0 ), + /* INS_$A1 */ PACK( 0, 0 ), + /* INS_$A2 */ PACK( 0, 0 ), + /* INS_$A3 */ PACK( 0, 0 ), + /* INS_$A4 */ PACK( 0, 0 ), + /* INS_$A5 */ PACK( 0, 0 ), + /* INS_$A6 */ PACK( 0, 0 ), + /* INS_$A7 */ PACK( 0, 0 ), + /* INS_$A8 */ PACK( 0, 0 ), + /* INS_$A9 */ PACK( 0, 0 ), + /* INS_$AA */ PACK( 0, 0 ), + /* INS_$AB */ PACK( 0, 0 ), + /* INS_$AC */ PACK( 0, 0 ), + /* INS_$AD */ PACK( 0, 0 ), + /* INS_$AE */ PACK( 0, 0 ), + /* INS_$AF */ PACK( 0, 0 ), + + /* PushB[0] */ PACK( 0, 1 ), + /* PushB[1] */ PACK( 0, 2 ), + /* PushB[2] */ PACK( 0, 3 ), + /* PushB[3] */ PACK( 0, 4 ), + /* PushB[4] */ PACK( 0, 5 ), + /* PushB[5] */ PACK( 0, 6 ), + /* PushB[6] */ PACK( 0, 7 ), + /* PushB[7] */ PACK( 0, 8 ), + /* PushW[0] */ PACK( 0, 1 ), + /* PushW[1] */ PACK( 0, 2 ), + /* PushW[2] */ PACK( 0, 3 ), + /* PushW[3] */ PACK( 0, 4 ), + /* PushW[4] */ PACK( 0, 5 ), + /* PushW[5] */ PACK( 0, 6 ), + /* PushW[6] */ PACK( 0, 7 ), + /* PushW[7] */ PACK( 0, 8 ), + + /* MDRP[00] */ PACK( 1, 0 ), + /* MDRP[01] */ PACK( 1, 0 ), + /* MDRP[02] */ PACK( 1, 0 ), + /* MDRP[03] */ PACK( 1, 0 ), + /* MDRP[04] */ PACK( 1, 0 ), + /* MDRP[05] */ PACK( 1, 0 ), + /* MDRP[06] */ PACK( 1, 0 ), + /* MDRP[07] */ PACK( 1, 0 ), + /* MDRP[08] */ PACK( 1, 0 ), + /* MDRP[09] */ PACK( 1, 0 ), + /* MDRP[10] */ PACK( 1, 0 ), + /* MDRP[11] */ PACK( 1, 0 ), + /* MDRP[12] */ PACK( 1, 0 ), + /* MDRP[13] */ PACK( 1, 0 ), + /* MDRP[14] */ PACK( 1, 0 ), + /* MDRP[15] */ PACK( 1, 0 ), + + /* MDRP[16] */ PACK( 1, 0 ), + /* MDRP[17] */ PACK( 1, 0 ), + /* MDRP[18] */ PACK( 1, 0 ), + /* MDRP[19] */ PACK( 1, 0 ), + /* MDRP[20] */ PACK( 1, 0 ), + /* MDRP[21] */ PACK( 1, 0 ), + /* MDRP[22] */ PACK( 1, 0 ), + /* MDRP[23] */ PACK( 1, 0 ), + /* MDRP[24] */ PACK( 1, 0 ), + /* MDRP[25] */ PACK( 1, 0 ), + /* MDRP[26] */ PACK( 1, 0 ), + /* MDRP[27] */ PACK( 1, 0 ), + /* MDRP[28] */ PACK( 1, 0 ), + /* MDRP[29] */ PACK( 1, 0 ), + /* MDRP[30] */ PACK( 1, 0 ), + /* MDRP[31] */ PACK( 1, 0 ), + + /* MIRP[00] */ PACK( 2, 0 ), + /* MIRP[01] */ PACK( 2, 0 ), + /* MIRP[02] */ PACK( 2, 0 ), + /* MIRP[03] */ PACK( 2, 0 ), + /* MIRP[04] */ PACK( 2, 0 ), + /* MIRP[05] */ PACK( 2, 0 ), + /* MIRP[06] */ PACK( 2, 0 ), + /* MIRP[07] */ PACK( 2, 0 ), + /* MIRP[08] */ PACK( 2, 0 ), + /* MIRP[09] */ PACK( 2, 0 ), + /* MIRP[10] */ PACK( 2, 0 ), + /* MIRP[11] */ PACK( 2, 0 ), + /* MIRP[12] */ PACK( 2, 0 ), + /* MIRP[13] */ PACK( 2, 0 ), + /* MIRP[14] */ PACK( 2, 0 ), + /* MIRP[15] */ PACK( 2, 0 ), + + /* MIRP[16] */ PACK( 2, 0 ), + /* MIRP[17] */ PACK( 2, 0 ), + /* MIRP[18] */ PACK( 2, 0 ), + /* MIRP[19] */ PACK( 2, 0 ), + /* MIRP[20] */ PACK( 2, 0 ), + /* MIRP[21] */ PACK( 2, 0 ), + /* MIRP[22] */ PACK( 2, 0 ), + /* MIRP[23] */ PACK( 2, 0 ), + /* MIRP[24] */ PACK( 2, 0 ), + /* MIRP[25] */ PACK( 2, 0 ), + /* MIRP[26] */ PACK( 2, 0 ), + /* MIRP[27] */ PACK( 2, 0 ), + /* MIRP[28] */ PACK( 2, 0 ), + /* MIRP[29] */ PACK( 2, 0 ), + /* MIRP[30] */ PACK( 2, 0 ), + /* MIRP[31] */ PACK( 2, 0 ) + }; + + +#ifdef FT_DEBUG_LEVEL_TRACE + + /* the first hex digit gives the length of the opcode name; the space */ + /* after the digit is here just to increase readability of the source */ + /* code */ + + static + const char* const opcode_name[256] = + { + "7 SVTCA y", + "7 SVTCA x", + "8 SPvTCA y", + "8 SPvTCA x", + "8 SFvTCA y", + "8 SFvTCA x", + "8 SPvTL ||", + "7 SPvTL +", + "8 SFvTL ||", + "7 SFvTL +", + "5 SPvFS", + "5 SFvFS", + "3 GPv", + "3 GFv", + "6 SFvTPv", + "5 ISECT", + + "4 SRP0", + "4 SRP1", + "4 SRP2", + "4 SZP0", + "4 SZP1", + "4 SZP2", + "4 SZPS", + "5 SLOOP", + "3 RTG", + "4 RTHG", + "3 SMD", + "4 ELSE", + "4 JMPR", + "6 SCvTCi", + "5 SSwCi", + "3 SSW", + + "3 DUP", + "3 POP", + "5 CLEAR", + "4 SWAP", + "5 DEPTH", + "6 CINDEX", + "6 MINDEX", + "8 AlignPTS", + "7 INS_$28", + "3 UTP", + "8 LOOPCALL", + "4 CALL", + "4 FDEF", + "4 ENDF", + "7 MDAP[0]", + "7 MDAP[1]", + + "6 IUP[0]", + "6 IUP[1]", + "6 SHP[0]", + "6 SHP[1]", + "6 SHC[0]", + "6 SHC[1]", + "6 SHZ[0]", + "6 SHZ[1]", + "5 SHPIX", + "2 IP", + "8 MSIRP[0]", + "8 MSIRP[1]", + "7 AlignRP", + "4 RTDG", + "7 MIAP[0]", + "7 MIAP[1]", + + "6 NPushB", + "6 NPushW", + "2 WS", + "2 RS", + "5 WCvtP", + "4 RCvt", + "5 GC[0]", + "5 GC[1]", + "4 SCFS", + "5 MD[0]", + "5 MD[1]", + "5 MPPEM", + "3 MPS", + "6 FlipON", + "7 FlipOFF", + "5 DEBUG", + + "2 LT", + "4 LTEQ", + "2 GT", + "4 GTEQ", + "2 EQ", + "3 NEQ", + "3 ODD", + "4 EVEN", + "2 IF", + "3 EIF", + "3 AND", + "2 OR", + "3 NOT", + "7 DeltaP1", + "3 SDB", + "3 SDS", + + "3 ADD", + "3 SUB", + "3 DIV", + "3 MUL", + "3 ABS", + "3 NEG", + "5 FLOOR", + "7 CEILING", + "8 ROUND[0]", + "8 ROUND[1]", + "8 ROUND[2]", + "8 ROUND[3]", + "9 NROUND[0]", + "9 NROUND[1]", + "9 NROUND[2]", + "9 NROUND[3]", + + "5 WCvtF", + "7 DeltaP2", + "7 DeltaP3", + "A DeltaCn[0]", + "A DeltaCn[1]", + "A DeltaCn[2]", + "6 SROUND", + "8 S45Round", + "4 JROT", + "4 JROF", + "4 ROFF", + "7 INS_$7B", + "4 RUTG", + "4 RDTG", + "5 SANGW", + "2 AA", + + "6 FlipPT", + "8 FlipRgON", + "9 FlipRgOFF", + "7 INS_$83", + "7 INS_$84", + "8 ScanCTRL", + "9 SDPvTL[0]", + "9 SDPvTL[1]", + "7 GetINFO", + "4 IDEF", + "4 ROLL", + "3 MAX", + "3 MIN", + "8 ScanTYPE", + "8 InstCTRL", + "7 INS_$8F", + + "7 INS_$90", +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + "6 GETVAR", + "7 GETDATA", +#else + "7 INS_$91", + "7 INS_$92", +#endif + "7 INS_$93", + "7 INS_$94", + "7 INS_$95", + "7 INS_$96", + "7 INS_$97", + "7 INS_$98", + "7 INS_$99", + "7 INS_$9A", + "7 INS_$9B", + "7 INS_$9C", + "7 INS_$9D", + "7 INS_$9E", + "7 INS_$9F", + + "7 INS_$A0", + "7 INS_$A1", + "7 INS_$A2", + "7 INS_$A3", + "7 INS_$A4", + "7 INS_$A5", + "7 INS_$A6", + "7 INS_$A7", + "7 INS_$A8", + "7 INS_$A9", + "7 INS_$AA", + "7 INS_$AB", + "7 INS_$AC", + "7 INS_$AD", + "7 INS_$AE", + "7 INS_$AF", + + "8 PushB[0]", + "8 PushB[1]", + "8 PushB[2]", + "8 PushB[3]", + "8 PushB[4]", + "8 PushB[5]", + "8 PushB[6]", + "8 PushB[7]", + "8 PushW[0]", + "8 PushW[1]", + "8 PushW[2]", + "8 PushW[3]", + "8 PushW[4]", + "8 PushW[5]", + "8 PushW[6]", + "8 PushW[7]", + + "8 MDRP[00]", + "8 MDRP[01]", + "8 MDRP[02]", + "8 MDRP[03]", + "8 MDRP[04]", + "8 MDRP[05]", + "8 MDRP[06]", + "8 MDRP[07]", + "8 MDRP[08]", + "8 MDRP[09]", + "8 MDRP[10]", + "8 MDRP[11]", + "8 MDRP[12]", + "8 MDRP[13]", + "8 MDRP[14]", + "8 MDRP[15]", + + "8 MDRP[16]", + "8 MDRP[17]", + "8 MDRP[18]", + "8 MDRP[19]", + "8 MDRP[20]", + "8 MDRP[21]", + "8 MDRP[22]", + "8 MDRP[23]", + "8 MDRP[24]", + "8 MDRP[25]", + "8 MDRP[26]", + "8 MDRP[27]", + "8 MDRP[28]", + "8 MDRP[29]", + "8 MDRP[30]", + "8 MDRP[31]", + + "8 MIRP[00]", + "8 MIRP[01]", + "8 MIRP[02]", + "8 MIRP[03]", + "8 MIRP[04]", + "8 MIRP[05]", + "8 MIRP[06]", + "8 MIRP[07]", + "8 MIRP[08]", + "8 MIRP[09]", + "8 MIRP[10]", + "8 MIRP[11]", + "8 MIRP[12]", + "8 MIRP[13]", + "8 MIRP[14]", + "8 MIRP[15]", + + "8 MIRP[16]", + "8 MIRP[17]", + "8 MIRP[18]", + "8 MIRP[19]", + "8 MIRP[20]", + "8 MIRP[21]", + "8 MIRP[22]", + "8 MIRP[23]", + "8 MIRP[24]", + "8 MIRP[25]", + "8 MIRP[26]", + "8 MIRP[27]", + "8 MIRP[28]", + "8 MIRP[29]", + "8 MIRP[30]", + "8 MIRP[31]" + }; + +#endif /* FT_DEBUG_LEVEL_TRACE */ + + + static + const FT_Char opcode_length[256] = + { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + -1,-2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 3, 5, 7, 9, 11,13,15,17, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + }; + +#undef PACK + + +#ifndef FT_CONFIG_OPTION_NO_ASSEMBLER + +#if defined( __arm__ ) && \ + ( defined( __thumb2__ ) || !defined( __thumb__ ) ) + +#define TT_MulFix14 TT_MulFix14_arm + + static FT_Int32 + TT_MulFix14_arm( FT_Int32 a, + FT_Int b ) + { + FT_Int32 t, t2; + + +#if defined( __CC_ARM ) || defined( __ARMCC__ ) + + __asm + { + smull t2, t, b, a /* (lo=t2,hi=t) = a*b */ + mov a, t, asr #31 /* a = (hi >> 31) */ + add a, a, #0x2000 /* a += 0x2000 */ + adds t2, t2, a /* t2 += a */ + adc t, t, #0 /* t += carry */ + mov a, t2, lsr #14 /* a = t2 >> 14 */ + orr a, a, t, lsl #18 /* a |= t << 18 */ + } + +#elif defined( __GNUC__ ) + + __asm__ __volatile__ ( + "smull %1, %2, %4, %3\n\t" /* (lo=%1,hi=%2) = a*b */ + "mov %0, %2, asr #31\n\t" /* %0 = (hi >> 31) */ +#if defined( __clang__ ) && defined( __thumb2__ ) + "add.w %0, %0, #0x2000\n\t" /* %0 += 0x2000 */ +#else + "add %0, %0, #0x2000\n\t" /* %0 += 0x2000 */ +#endif + "adds %1, %1, %0\n\t" /* %1 += %0 */ + "adc %2, %2, #0\n\t" /* %2 += carry */ + "mov %0, %1, lsr #14\n\t" /* %0 = %1 >> 16 */ + "orr %0, %0, %2, lsl #18\n\t" /* %0 |= %2 << 16 */ + : "=r"(a), "=&r"(t2), "=&r"(t) + : "r"(a), "r"(b) + : "cc" ); + +#endif + + return a; + } + +#endif /* __arm__ && ( __thumb2__ || !__thumb__ ) */ + +#endif /* !FT_CONFIG_OPTION_NO_ASSEMBLER */ + + +#if defined( __GNUC__ ) && \ + ( defined( __i386__ ) || defined( __x86_64__ ) ) + +#define TT_MulFix14 TT_MulFix14_long_long + + /* Temporarily disable the warning that C90 doesn't support `long long'. */ +#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406 +#pragma GCC diagnostic push +#endif +#pragma GCC diagnostic ignored "-Wlong-long" + + /* This is declared `noinline' because inlining the function results */ + /* in slower code. The `pure' attribute indicates that the result */ + /* only depends on the parameters. */ + static __attribute__(( noinline )) + __attribute__(( pure )) FT_Int32 + TT_MulFix14_long_long( FT_Int32 a, + FT_Int b ) + { + + long long ret = (long long)a * b; + + /* The following line assumes that right shifting of signed values */ + /* will actually preserve the sign bit. The exact behaviour is */ + /* undefined, but this is true on x86 and x86_64. */ + long long tmp = ret >> 63; + + + ret += 0x2000 + tmp; + + return (FT_Int32)( ret >> 14 ); + } + +#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406 +#pragma GCC diagnostic pop +#endif + +#endif /* __GNUC__ && ( __i386__ || __x86_64__ ) */ + + +#ifndef TT_MulFix14 + + /* Compute (a*b)/2^14 with maximum accuracy and rounding. */ + /* This is optimized to be faster than calling FT_MulFix() */ + /* for platforms where sizeof(int) == 2. */ + static FT_Int32 + TT_MulFix14( FT_Int32 a, + FT_Int b ) + { + FT_Int32 sign; + FT_UInt32 ah, al, mid, lo, hi; + + + sign = a ^ b; + + if ( a < 0 ) + a = -a; + if ( b < 0 ) + b = -b; + + ah = (FT_UInt32)( ( a >> 16 ) & 0xFFFFU ); + al = (FT_UInt32)( a & 0xFFFFU ); + + lo = al * b; + mid = ah * b; + hi = mid >> 16; + mid = ( mid << 16 ) + ( 1 << 13 ); /* rounding */ + lo += mid; + if ( lo < mid ) + hi += 1; + + mid = ( lo >> 14 ) | ( hi << 18 ); + + return sign >= 0 ? (FT_Int32)mid : -(FT_Int32)mid; + } + +#endif /* !TT_MulFix14 */ + + +#if defined( __GNUC__ ) && \ + ( defined( __i386__ ) || \ + defined( __x86_64__ ) || \ + defined( __arm__ ) ) + +#define TT_DotFix14 TT_DotFix14_long_long + +#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406 +#pragma GCC diagnostic push +#endif +#pragma GCC diagnostic ignored "-Wlong-long" + + static __attribute__(( pure )) FT_Int32 + TT_DotFix14_long_long( FT_Int32 ax, + FT_Int32 ay, + FT_Int bx, + FT_Int by ) + { + /* Temporarily disable the warning that C90 doesn't support */ + /* `long long'. */ + + long long temp1 = (long long)ax * bx; + long long temp2 = (long long)ay * by; + + + temp1 += temp2; + temp2 = temp1 >> 63; + temp1 += 0x2000 + temp2; + + return (FT_Int32)( temp1 >> 14 ); + + } + +#if ( __GNUC__ * 100 + __GNUC_MINOR__ ) >= 406 +#pragma GCC diagnostic pop +#endif + +#endif /* __GNUC__ && (__arm__ || __i386__ || __x86_64__) */ + + +#ifndef TT_DotFix14 + + /* compute (ax*bx+ay*by)/2^14 with maximum accuracy and rounding */ + static FT_Int32 + TT_DotFix14( FT_Int32 ax, + FT_Int32 ay, + FT_Int bx, + FT_Int by ) + { + FT_Int32 m, s, hi1, hi2, hi; + FT_UInt32 l, lo1, lo2, lo; + + + /* compute ax*bx as 64-bit value */ + l = (FT_UInt32)( ( ax & 0xFFFFU ) * bx ); + m = ( ax >> 16 ) * bx; + + lo1 = l + ( (FT_UInt32)m << 16 ); + hi1 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo1 < l ); + + /* compute ay*by as 64-bit value */ + l = (FT_UInt32)( ( ay & 0xFFFFU ) * by ); + m = ( ay >> 16 ) * by; + + lo2 = l + ( (FT_UInt32)m << 16 ); + hi2 = ( m >> 16 ) + ( (FT_Int32)l >> 31 ) + ( lo2 < l ); + + /* add them */ + lo = lo1 + lo2; + hi = hi1 + hi2 + ( lo < lo1 ); + + /* divide the result by 2^14 with rounding */ + s = hi >> 31; + l = lo + (FT_UInt32)s; + hi += s + ( l < lo ); + lo = l; + + l = lo + 0x2000U; + hi += ( l < lo ); + + return (FT_Int32)( ( (FT_UInt32)hi << 18 ) | ( l >> 14 ) ); + } + +#endif /* TT_DotFix14 */ + + + /*************************************************************************/ + /* */ + /* */ + /* Current_Ratio */ + /* */ + /* */ + /* Returns the current aspect ratio scaling factor depending on the */ + /* projection vector's state and device resolutions. */ + /* */ + /* */ + /* The aspect ratio in 16.16 format, always <= 1.0 . */ + /* */ + static FT_Long + Current_Ratio( TT_ExecContext exc ) + { + if ( !exc->tt_metrics.ratio ) + { + if ( exc->GS.projVector.y == 0 ) + exc->tt_metrics.ratio = exc->tt_metrics.x_ratio; + + else if ( exc->GS.projVector.x == 0 ) + exc->tt_metrics.ratio = exc->tt_metrics.y_ratio; + + else + { + FT_F26Dot6 x, y; + + + x = TT_MulFix14( exc->tt_metrics.x_ratio, + exc->GS.projVector.x ); + y = TT_MulFix14( exc->tt_metrics.y_ratio, + exc->GS.projVector.y ); + exc->tt_metrics.ratio = FT_Hypot( x, y ); + } + } + return exc->tt_metrics.ratio; + } + + + FT_CALLBACK_DEF( FT_Long ) + Current_Ppem( TT_ExecContext exc ) + { + return exc->tt_metrics.ppem; + } + + + FT_CALLBACK_DEF( FT_Long ) + Current_Ppem_Stretched( TT_ExecContext exc ) + { + return FT_MulFix( exc->tt_metrics.ppem, Current_Ratio( exc ) ); + } + + + /*************************************************************************/ + /* */ + /* Functions related to the control value table (CVT). */ + /* */ + /*************************************************************************/ + + + FT_CALLBACK_DEF( FT_F26Dot6 ) + Read_CVT( TT_ExecContext exc, + FT_ULong idx ) + { + return exc->cvt[idx]; + } + + + FT_CALLBACK_DEF( FT_F26Dot6 ) + Read_CVT_Stretched( TT_ExecContext exc, + FT_ULong idx ) + { + return FT_MulFix( exc->cvt[idx], Current_Ratio( exc ) ); + } + + + FT_CALLBACK_DEF( void ) + Write_CVT( TT_ExecContext exc, + FT_ULong idx, + FT_F26Dot6 value ) + { + exc->cvt[idx] = value; + } + + + FT_CALLBACK_DEF( void ) + Write_CVT_Stretched( TT_ExecContext exc, + FT_ULong idx, + FT_F26Dot6 value ) + { + exc->cvt[idx] = FT_DivFix( value, Current_Ratio( exc ) ); + } + + + FT_CALLBACK_DEF( void ) + Move_CVT( TT_ExecContext exc, + FT_ULong idx, + FT_F26Dot6 value ) + { + exc->cvt[idx] += value; + } + + + FT_CALLBACK_DEF( void ) + Move_CVT_Stretched( TT_ExecContext exc, + FT_ULong idx, + FT_F26Dot6 value ) + { + exc->cvt[idx] += FT_DivFix( value, Current_Ratio( exc ) ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* GetShortIns */ + /* */ + /* */ + /* Returns a short integer taken from the instruction stream at */ + /* address IP. */ + /* */ + /* */ + /* Short read at code[IP]. */ + /* */ + /* */ + /* This one could become a macro. */ + /* */ + static FT_Short + GetShortIns( TT_ExecContext exc ) + { + /* Reading a byte stream so there is no endianness (DaveP) */ + exc->IP += 2; + return (FT_Short)( ( exc->code[exc->IP - 2] << 8 ) + + exc->code[exc->IP - 1] ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* Ins_Goto_CodeRange */ + /* */ + /* */ + /* Goes to a certain code range in the instruction stream. */ + /* */ + /* */ + /* aRange :: The index of the code range. */ + /* */ + /* aIP :: The new IP address in the code range. */ + /* */ + /* */ + /* SUCCESS or FAILURE. */ + /* */ + static FT_Bool + Ins_Goto_CodeRange( TT_ExecContext exc, + FT_Int aRange, + FT_Long aIP ) + { + TT_CodeRange* range; + + + if ( aRange < 1 || aRange > 3 ) + { + exc->error = FT_THROW( Bad_Argument ); + return FAILURE; + } + + range = &exc->codeRangeTable[aRange - 1]; + + if ( !range->base ) /* invalid coderange */ + { + exc->error = FT_THROW( Invalid_CodeRange ); + return FAILURE; + } + + /* NOTE: Because the last instruction of a program may be a CALL */ + /* which will return to the first byte *after* the code */ + /* range, we test for aIP <= Size, instead of aIP < Size. */ + + if ( aIP > range->size ) + { + exc->error = FT_THROW( Code_Overflow ); + return FAILURE; + } + + exc->code = range->base; + exc->codeSize = range->size; + exc->IP = aIP; + exc->curRange = aRange; + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Direct_Move */ + /* */ + /* */ + /* Moves a point by a given distance along the freedom vector. The */ + /* point will be `touched'. */ + /* */ + /* */ + /* point :: The index of the point to move. */ + /* */ + /* distance :: The distance to apply. */ + /* */ + /* */ + /* zone :: The affected glyph zone. */ + /* */ + /* */ + /* See `ttinterp.h' for details on backward compatibility mode. */ + /* `Touches' the point. */ + /* */ + static void + Direct_Move( TT_ExecContext exc, + TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_F26Dot6 v; + + + v = exc->GS.freeVector.x; + + if ( v != 0 ) + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + ( !exc->ignore_x_mode || + ( exc->sph_tweak_flags & SPH_TWEAK_ALLOW_X_DMOVE ) ) ) + zone->cur[point].x = ADD_LONG( zone->cur[point].x, + FT_MulDiv( distance, + v, + exc->F_dot_P ) ); + else +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* Exception to the post-IUP curfew: Allow the x component of */ + /* diagonal moves, but only post-IUP. DejaVu tries to adjust */ + /* diagonal stems like on `Z' and `z' post-IUP. */ + if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility ) + zone->cur[point].x = ADD_LONG( zone->cur[point].x, + FT_MulDiv( distance, + v, + exc->F_dot_P ) ); + else +#endif + + if ( NO_SUBPIXEL_HINTING ) + zone->cur[point].x = ADD_LONG( zone->cur[point].x, + FT_MulDiv( distance, + v, + exc->F_dot_P ) ); + + zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + + v = exc->GS.freeVector.y; + + if ( v != 0 ) + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( !( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && + exc->iupy_called ) ) +#endif + zone->cur[point].y = ADD_LONG( zone->cur[point].y, + FT_MulDiv( distance, + v, + exc->F_dot_P ) ); + + zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* Direct_Move_Orig */ + /* */ + /* */ + /* Moves the *original* position of a point by a given distance along */ + /* the freedom vector. Obviously, the point will not be `touched'. */ + /* */ + /* */ + /* point :: The index of the point to move. */ + /* */ + /* distance :: The distance to apply. */ + /* */ + /* */ + /* zone :: The affected glyph zone. */ + /* */ + static void + Direct_Move_Orig( TT_ExecContext exc, + TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_F26Dot6 v; + + + v = exc->GS.freeVector.x; + + if ( v != 0 ) + zone->org[point].x = ADD_LONG( zone->org[point].x, + FT_MulDiv( distance, + v, + exc->F_dot_P ) ); + + v = exc->GS.freeVector.y; + + if ( v != 0 ) + zone->org[point].y = ADD_LONG( zone->org[point].y, + FT_MulDiv( distance, + v, + exc->F_dot_P ) ); + } + + + /*************************************************************************/ + /* */ + /* Special versions of Direct_Move() */ + /* */ + /* The following versions are used whenever both vectors are both */ + /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ + /* See `ttinterp.h' for details on backward compatibility mode. */ + /* */ + /*************************************************************************/ + + + static void + Direct_Move_X( TT_ExecContext exc, + TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && !exc->ignore_x_mode ) + zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance ); + else +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( SUBPIXEL_HINTING_MINIMAL && !exc->backward_compatibility ) + zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance ); + else +#endif + + if ( NO_SUBPIXEL_HINTING ) + zone->cur[point].x = ADD_LONG( zone->cur[point].x, distance ); + + zone->tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + + + static void + Direct_Move_Y( TT_ExecContext exc, + TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED( exc ); + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( !( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && exc->iupy_called ) ) +#endif + zone->cur[point].y = ADD_LONG( zone->cur[point].y, distance ); + + zone->tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + + + /*************************************************************************/ + /* */ + /* Special versions of Direct_Move_Orig() */ + /* */ + /* The following versions are used whenever both vectors are both */ + /* along one of the coordinate unit vectors, i.e. in 90% of the cases. */ + /* */ + /*************************************************************************/ + + + static void + Direct_Move_Orig_X( TT_ExecContext exc, + TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED( exc ); + + zone->org[point].x = ADD_LONG( zone->org[point].x, distance ); + } + + + static void + Direct_Move_Orig_Y( TT_ExecContext exc, + TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ) + { + FT_UNUSED( exc ); + + zone->org[point].y = ADD_LONG( zone->org[point].y, distance ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_None */ + /* */ + /* */ + /* Does not round, but adds engine compensation. */ + /* */ + /* */ + /* distance :: The distance (not) to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* The compensated distance. */ + /* */ + /* */ + /* The TrueType specification says very few about the relationship */ + /* between rounding and engine compensation. However, it seems from */ + /* the description of super round that we should add the compensation */ + /* before rounding. */ + /* */ + static FT_F26Dot6 + Round_None( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED( exc ); + + + if ( distance >= 0 ) + { + val = ADD_LONG( distance, compensation ); + if ( val < 0 ) + val = 0; + } + else + { + val = SUB_LONG( distance, compensation ); + if ( val > 0 ) + val = 0; + } + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_To_Grid */ + /* */ + /* */ + /* Rounds value to grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_To_Grid( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED( exc ); + + + if ( distance >= 0 ) + { + val = FT_PIX_ROUND_LONG( ADD_LONG( distance, compensation ) ); + if ( val < 0 ) + val = 0; + } + else + { + val = NEG_LONG( FT_PIX_ROUND_LONG( SUB_LONG( compensation, + distance ) ) ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_To_Half_Grid */ + /* */ + /* */ + /* Rounds value to half grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_To_Half_Grid( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED( exc ); + + + if ( distance >= 0 ) + { + val = ADD_LONG( FT_PIX_FLOOR( ADD_LONG( distance, compensation ) ), + 32 ); + if ( val < 0 ) + val = 32; + } + else + { + val = NEG_LONG( ADD_LONG( FT_PIX_FLOOR( SUB_LONG( compensation, + distance ) ), + 32 ) ); + if ( val > 0 ) + val = -32; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_Down_To_Grid */ + /* */ + /* */ + /* Rounds value down to grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_Down_To_Grid( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED( exc ); + + + if ( distance >= 0 ) + { + val = FT_PIX_FLOOR( ADD_LONG( distance, compensation ) ); + if ( val < 0 ) + val = 0; + } + else + { + val = NEG_LONG( FT_PIX_FLOOR( SUB_LONG( compensation, distance ) ) ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_Up_To_Grid */ + /* */ + /* */ + /* Rounds value up to grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_Up_To_Grid( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED( exc ); + + + if ( distance >= 0 ) + { + val = FT_PIX_CEIL_LONG( ADD_LONG( distance, compensation ) ); + if ( val < 0 ) + val = 0; + } + else + { + val = NEG_LONG( FT_PIX_CEIL_LONG( SUB_LONG( compensation, + distance ) ) ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_To_Double_Grid */ + /* */ + /* */ + /* Rounds value to double grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + static FT_F26Dot6 + Round_To_Double_Grid( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + FT_UNUSED( exc ); + + + if ( distance >= 0 ) + { + val = FT_PAD_ROUND_LONG( ADD_LONG( distance, compensation ), 32 ); + if ( val < 0 ) + val = 0; + } + else + { + val = NEG_LONG( FT_PAD_ROUND_LONG( SUB_LONG( compensation, distance ), + 32 ) ); + if ( val > 0 ) + val = 0; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_Super */ + /* */ + /* */ + /* Super-rounds value to grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + /* */ + /* The TrueType specification says very little about the relationship */ + /* between rounding and engine compensation. However, it seems from */ + /* the description of super round that we should add the compensation */ + /* before rounding. */ + /* */ + static FT_F26Dot6 + Round_Super( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = ADD_LONG( distance, + exc->threshold - exc->phase + compensation ) & + -exc->period; + val = ADD_LONG( val, exc->phase ); + if ( val < 0 ) + val = exc->phase; + } + else + { + val = NEG_LONG( SUB_LONG( exc->threshold - exc->phase + compensation, + distance ) & + -exc->period ); + val = SUB_LONG( val, exc->phase ); + if ( val > 0 ) + val = -exc->phase; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Round_Super_45 */ + /* */ + /* */ + /* Super-rounds value to grid after adding engine compensation. */ + /* */ + /* */ + /* distance :: The distance to round. */ + /* */ + /* compensation :: The engine compensation. */ + /* */ + /* */ + /* Rounded distance. */ + /* */ + /* */ + /* There is a separate function for Round_Super_45() as we may need */ + /* greater precision. */ + /* */ + static FT_F26Dot6 + Round_Super_45( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_F26Dot6 compensation ) + { + FT_F26Dot6 val; + + + if ( distance >= 0 ) + { + val = ( ADD_LONG( distance, + exc->threshold - exc->phase + compensation ) / + exc->period ) * exc->period; + val = ADD_LONG( val, exc->phase ); + if ( val < 0 ) + val = exc->phase; + } + else + { + val = NEG_LONG( ( SUB_LONG( exc->threshold - exc->phase + compensation, + distance ) / + exc->period ) * exc->period ); + val = SUB_LONG( val, exc->phase ); + if ( val > 0 ) + val = -exc->phase; + } + + return val; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Compute_Round */ + /* */ + /* */ + /* Sets the rounding mode. */ + /* */ + /* */ + /* round_mode :: The rounding mode to be used. */ + /* */ + static void + Compute_Round( TT_ExecContext exc, + FT_Byte round_mode ) + { + switch ( round_mode ) + { + case TT_Round_Off: + exc->func_round = (TT_Round_Func)Round_None; + break; + + case TT_Round_To_Grid: + exc->func_round = (TT_Round_Func)Round_To_Grid; + break; + + case TT_Round_Up_To_Grid: + exc->func_round = (TT_Round_Func)Round_Up_To_Grid; + break; + + case TT_Round_Down_To_Grid: + exc->func_round = (TT_Round_Func)Round_Down_To_Grid; + break; + + case TT_Round_To_Half_Grid: + exc->func_round = (TT_Round_Func)Round_To_Half_Grid; + break; + + case TT_Round_To_Double_Grid: + exc->func_round = (TT_Round_Func)Round_To_Double_Grid; + break; + + case TT_Round_Super: + exc->func_round = (TT_Round_Func)Round_Super; + break; + + case TT_Round_Super_45: + exc->func_round = (TT_Round_Func)Round_Super_45; + break; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* SetSuperRound */ + /* */ + /* */ + /* Sets Super Round parameters. */ + /* */ + /* */ + /* GridPeriod :: The grid period. */ + /* */ + /* selector :: The SROUND opcode. */ + /* */ + static void + SetSuperRound( TT_ExecContext exc, + FT_F2Dot14 GridPeriod, + FT_Long selector ) + { + switch ( (FT_Int)( selector & 0xC0 ) ) + { + case 0: + exc->period = GridPeriod / 2; + break; + + case 0x40: + exc->period = GridPeriod; + break; + + case 0x80: + exc->period = GridPeriod * 2; + break; + + /* This opcode is reserved, but... */ + case 0xC0: + exc->period = GridPeriod; + break; + } + + switch ( (FT_Int)( selector & 0x30 ) ) + { + case 0: + exc->phase = 0; + break; + + case 0x10: + exc->phase = exc->period / 4; + break; + + case 0x20: + exc->phase = exc->period / 2; + break; + + case 0x30: + exc->phase = exc->period * 3 / 4; + break; + } + + if ( ( selector & 0x0F ) == 0 ) + exc->threshold = exc->period - 1; + else + exc->threshold = ( (FT_Int)( selector & 0x0F ) - 4 ) * exc->period / 8; + + /* convert to F26Dot6 format */ + exc->period >>= 8; + exc->phase >>= 8; + exc->threshold >>= 8; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Project */ + /* */ + /* */ + /* Computes the projection of vector given by (v2-v1) along the */ + /* current projection vector. */ + /* */ + /* */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Project( TT_ExecContext exc, + FT_Pos dx, + FT_Pos dy ) + { + return TT_DotFix14( dx, dy, + exc->GS.projVector.x, + exc->GS.projVector.y ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* Dual_Project */ + /* */ + /* */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* current dual vector. */ + /* */ + /* */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Dual_Project( TT_ExecContext exc, + FT_Pos dx, + FT_Pos dy ) + { + return TT_DotFix14( dx, dy, + exc->GS.dualVector.x, + exc->GS.dualVector.y ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* Project_x */ + /* */ + /* */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* horizontal axis. */ + /* */ + /* */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Project_x( TT_ExecContext exc, + FT_Pos dx, + FT_Pos dy ) + { + FT_UNUSED( exc ); + FT_UNUSED( dy ); + + return dx; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Project_y */ + /* */ + /* */ + /* Computes the projection of the vector given by (v2-v1) along the */ + /* vertical axis. */ + /* */ + /* */ + /* v1 :: First input vector. */ + /* v2 :: Second input vector. */ + /* */ + /* */ + /* The distance in F26dot6 format. */ + /* */ + static FT_F26Dot6 + Project_y( TT_ExecContext exc, + FT_Pos dx, + FT_Pos dy ) + { + FT_UNUSED( exc ); + FT_UNUSED( dx ); + + return dy; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Compute_Funcs */ + /* */ + /* */ + /* Computes the projection and movement function pointers according */ + /* to the current graphics state. */ + /* */ + static void + Compute_Funcs( TT_ExecContext exc ) + { + if ( exc->GS.freeVector.x == 0x4000 ) + exc->F_dot_P = exc->GS.projVector.x; + else if ( exc->GS.freeVector.y == 0x4000 ) + exc->F_dot_P = exc->GS.projVector.y; + else + exc->F_dot_P = + ( (FT_Long)exc->GS.projVector.x * exc->GS.freeVector.x + + (FT_Long)exc->GS.projVector.y * exc->GS.freeVector.y ) >> 14; + + if ( exc->GS.projVector.x == 0x4000 ) + exc->func_project = (TT_Project_Func)Project_x; + else if ( exc->GS.projVector.y == 0x4000 ) + exc->func_project = (TT_Project_Func)Project_y; + else + exc->func_project = (TT_Project_Func)Project; + + if ( exc->GS.dualVector.x == 0x4000 ) + exc->func_dualproj = (TT_Project_Func)Project_x; + else if ( exc->GS.dualVector.y == 0x4000 ) + exc->func_dualproj = (TT_Project_Func)Project_y; + else + exc->func_dualproj = (TT_Project_Func)Dual_Project; + + exc->func_move = (TT_Move_Func)Direct_Move; + exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig; + + if ( exc->F_dot_P == 0x4000L ) + { + if ( exc->GS.freeVector.x == 0x4000 ) + { + exc->func_move = (TT_Move_Func)Direct_Move_X; + exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_X; + } + else if ( exc->GS.freeVector.y == 0x4000 ) + { + exc->func_move = (TT_Move_Func)Direct_Move_Y; + exc->func_move_orig = (TT_Move_Func)Direct_Move_Orig_Y; + } + } + + /* at small sizes, F_dot_P can become too small, resulting */ + /* in overflows and `spikes' in a number of glyphs like `w'. */ + + if ( FT_ABS( exc->F_dot_P ) < 0x400L ) + exc->F_dot_P = 0x4000L; + + /* Disable cached aspect ratio */ + exc->tt_metrics.ratio = 0; + } + + + /*************************************************************************/ + /* */ + /* */ + /* Normalize */ + /* */ + /* */ + /* Norms a vector. */ + /* */ + /* */ + /* Vx :: The horizontal input vector coordinate. */ + /* Vy :: The vertical input vector coordinate. */ + /* */ + /* */ + /* R :: The normed unit vector. */ + /* */ + /* */ + /* Returns FAILURE if a vector parameter is zero. */ + /* */ + /* */ + /* In case Vx and Vy are both zero, `Normalize' returns SUCCESS, and */ + /* R is undefined. */ + /* */ + static FT_Bool + Normalize( FT_F26Dot6 Vx, + FT_F26Dot6 Vy, + FT_UnitVector* R ) + { + FT_Vector V; + + + if ( Vx == 0 && Vy == 0 ) + { + /* XXX: UNDOCUMENTED! It seems that it is possible to try */ + /* to normalize the vector (0,0). Return immediately. */ + return SUCCESS; + } + + V.x = Vx; + V.y = Vy; + + FT_Vector_NormLen( &V ); + + R->x = (FT_F2Dot14)( V.x / 4 ); + R->y = (FT_F2Dot14)( V.y / 4 ); + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* Here we start with the implementation of the various opcodes. */ + /* */ + /*************************************************************************/ + + +#define ARRAY_BOUND_ERROR \ + do \ + { \ + exc->error = FT_THROW( Invalid_Reference ); \ + return; \ + } while (0) + + + /*************************************************************************/ + /* */ + /* MPPEM[]: Measure Pixel Per EM */ + /* Opcode range: 0x4B */ + /* Stack: --> Euint16 */ + /* */ + static void + Ins_MPPEM( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = exc->func_cur_ppem( exc ); + } + + + /*************************************************************************/ + /* */ + /* MPS[]: Measure Point Size */ + /* Opcode range: 0x4C */ + /* Stack: --> Euint16 */ + /* */ + static void + Ins_MPS( TT_ExecContext exc, + FT_Long* args ) + { + if ( NO_SUBPIXEL_HINTING ) + { + /* Microsoft's GDI bytecode interpreter always returns value 12; */ + /* we return the current PPEM value instead. */ + args[0] = exc->func_cur_ppem( exc ); + } + else + { + /* A possible practical application of the MPS instruction is to */ + /* implement optical scaling and similar features, which should be */ + /* based on perceptual attributes, thus independent of the */ + /* resolution. */ + args[0] = exc->pointSize; + } + } + + + /*************************************************************************/ + /* */ + /* DUP[]: DUPlicate the stack's top element */ + /* Opcode range: 0x20 */ + /* Stack: StkElt --> StkElt StkElt */ + /* */ + static void + Ins_DUP( FT_Long* args ) + { + args[1] = args[0]; + } + + + /*************************************************************************/ + /* */ + /* POP[]: POP the stack's top element */ + /* Opcode range: 0x21 */ + /* Stack: StkElt --> */ + /* */ + static void + Ins_POP( void ) + { + /* nothing to do */ + } + + + /*************************************************************************/ + /* */ + /* CLEAR[]: CLEAR the entire stack */ + /* Opcode range: 0x22 */ + /* Stack: StkElt... --> */ + /* */ + static void + Ins_CLEAR( TT_ExecContext exc ) + { + exc->new_top = 0; + } + + + /*************************************************************************/ + /* */ + /* SWAP[]: SWAP the stack's top two elements */ + /* Opcode range: 0x23 */ + /* Stack: 2 * StkElt --> 2 * StkElt */ + /* */ + static void + Ins_SWAP( FT_Long* args ) + { + FT_Long L; + + + L = args[0]; + args[0] = args[1]; + args[1] = L; + } + + + /*************************************************************************/ + /* */ + /* DEPTH[]: return the stack DEPTH */ + /* Opcode range: 0x24 */ + /* Stack: --> uint32 */ + /* */ + static void + Ins_DEPTH( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = exc->top; + } + + + /*************************************************************************/ + /* */ + /* LT[]: Less Than */ + /* Opcode range: 0x50 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_LT( FT_Long* args ) + { + args[0] = ( args[0] < args[1] ); + } + + + /*************************************************************************/ + /* */ + /* LTEQ[]: Less Than or EQual */ + /* Opcode range: 0x51 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_LTEQ( FT_Long* args ) + { + args[0] = ( args[0] <= args[1] ); + } + + + /*************************************************************************/ + /* */ + /* GT[]: Greater Than */ + /* Opcode range: 0x52 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_GT( FT_Long* args ) + { + args[0] = ( args[0] > args[1] ); + } + + + /*************************************************************************/ + /* */ + /* GTEQ[]: Greater Than or EQual */ + /* Opcode range: 0x53 */ + /* Stack: int32? int32? --> bool */ + /* */ + static void + Ins_GTEQ( FT_Long* args ) + { + args[0] = ( args[0] >= args[1] ); + } + + + /*************************************************************************/ + /* */ + /* EQ[]: EQual */ + /* Opcode range: 0x54 */ + /* Stack: StkElt StkElt --> bool */ + /* */ + static void + Ins_EQ( FT_Long* args ) + { + args[0] = ( args[0] == args[1] ); + } + + + /*************************************************************************/ + /* */ + /* NEQ[]: Not EQual */ + /* Opcode range: 0x55 */ + /* Stack: StkElt StkElt --> bool */ + /* */ + static void + Ins_NEQ( FT_Long* args ) + { + args[0] = ( args[0] != args[1] ); + } + + + /*************************************************************************/ + /* */ + /* ODD[]: Is ODD */ + /* Opcode range: 0x56 */ + /* Stack: f26.6 --> bool */ + /* */ + static void + Ins_ODD( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 127 ) == 64 ); + } + + + /*************************************************************************/ + /* */ + /* EVEN[]: Is EVEN */ + /* Opcode range: 0x57 */ + /* Stack: f26.6 --> bool */ + /* */ + static void + Ins_EVEN( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = ( ( exc->func_round( exc, args[0], 0 ) & 127 ) == 0 ); + } + + + /*************************************************************************/ + /* */ + /* AND[]: logical AND */ + /* Opcode range: 0x5A */ + /* Stack: uint32 uint32 --> uint32 */ + /* */ + static void + Ins_AND( FT_Long* args ) + { + args[0] = ( args[0] && args[1] ); + } + + + /*************************************************************************/ + /* */ + /* OR[]: logical OR */ + /* Opcode range: 0x5B */ + /* Stack: uint32 uint32 --> uint32 */ + /* */ + static void + Ins_OR( FT_Long* args ) + { + args[0] = ( args[0] || args[1] ); + } + + + /*************************************************************************/ + /* */ + /* NOT[]: logical NOT */ + /* Opcode range: 0x5C */ + /* Stack: StkElt --> uint32 */ + /* */ + static void + Ins_NOT( FT_Long* args ) + { + args[0] = !args[0]; + } + + + /*************************************************************************/ + /* */ + /* ADD[]: ADD */ + /* Opcode range: 0x60 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_ADD( FT_Long* args ) + { + args[0] = ADD_LONG( args[0], args[1] ); + } + + + /*************************************************************************/ + /* */ + /* SUB[]: SUBtract */ + /* Opcode range: 0x61 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_SUB( FT_Long* args ) + { + args[0] = SUB_LONG( args[0], args[1] ); + } + + + /*************************************************************************/ + /* */ + /* DIV[]: DIVide */ + /* Opcode range: 0x62 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_DIV( TT_ExecContext exc, + FT_Long* args ) + { + if ( args[1] == 0 ) + exc->error = FT_THROW( Divide_By_Zero ); + else + args[0] = FT_MulDiv_No_Round( args[0], 64L, args[1] ); + } + + + /*************************************************************************/ + /* */ + /* MUL[]: MULtiply */ + /* Opcode range: 0x63 */ + /* Stack: f26.6 f26.6 --> f26.6 */ + /* */ + static void + Ins_MUL( FT_Long* args ) + { + args[0] = FT_MulDiv( args[0], args[1], 64L ); + } + + + /*************************************************************************/ + /* */ + /* ABS[]: ABSolute value */ + /* Opcode range: 0x64 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_ABS( FT_Long* args ) + { + if ( args[0] < 0 ) + args[0] = NEG_LONG( args[0] ); + } + + + /*************************************************************************/ + /* */ + /* NEG[]: NEGate */ + /* Opcode range: 0x65 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_NEG( FT_Long* args ) + { + args[0] = NEG_LONG( args[0] ); + } + + + /*************************************************************************/ + /* */ + /* FLOOR[]: FLOOR */ + /* Opcode range: 0x66 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_FLOOR( FT_Long* args ) + { + args[0] = FT_PIX_FLOOR( args[0] ); + } + + + /*************************************************************************/ + /* */ + /* CEILING[]: CEILING */ + /* Opcode range: 0x67 */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_CEILING( FT_Long* args ) + { + args[0] = FT_PIX_CEIL_LONG( args[0] ); + } + + + /*************************************************************************/ + /* */ + /* RS[]: Read Store */ + /* Opcode range: 0x43 */ + /* Stack: uint32 --> uint32 */ + /* */ + static void + Ins_RS( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong I = (FT_ULong)args[0]; + + + if ( BOUNDSL( I, exc->storeSize ) ) + { + if ( exc->pedantic_hinting ) + ARRAY_BOUND_ERROR; + else + args[0] = 0; + } + else + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + /* subpixel hinting - avoid Typeman Dstroke and */ + /* IStroke and Vacuform rounds */ + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + ( ( I == 24 && + ( exc->face->sph_found_func_flags & + ( SPH_FDEF_SPACING_1 | + SPH_FDEF_SPACING_2 ) ) ) || + ( I == 22 && + ( exc->sph_in_func_flags & + SPH_FDEF_TYPEMAN_STROKES ) ) || + ( I == 8 && + ( exc->face->sph_found_func_flags & + SPH_FDEF_VACUFORM_ROUND_1 ) && + exc->iup_called ) ) ) + args[0] = 0; + else +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + args[0] = exc->storage[I]; + } + } + + + /*************************************************************************/ + /* */ + /* WS[]: Write Store */ + /* Opcode range: 0x42 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_WS( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong I = (FT_ULong)args[0]; + + + if ( BOUNDSL( I, exc->storeSize ) ) + { + if ( exc->pedantic_hinting ) + ARRAY_BOUND_ERROR; + } + else + exc->storage[I] = args[1]; + } + + + /*************************************************************************/ + /* */ + /* WCVTP[]: Write CVT in Pixel units */ + /* Opcode range: 0x44 */ + /* Stack: f26.6 uint32 --> */ + /* */ + static void + Ins_WCVTP( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong I = (FT_ULong)args[0]; + + + if ( BOUNDSL( I, exc->cvtSize ) ) + { + if ( exc->pedantic_hinting ) + ARRAY_BOUND_ERROR; + } + else + exc->func_write_cvt( exc, I, args[1] ); + } + + + /*************************************************************************/ + /* */ + /* WCVTF[]: Write CVT in Funits */ + /* Opcode range: 0x70 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_WCVTF( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong I = (FT_ULong)args[0]; + + + if ( BOUNDSL( I, exc->cvtSize ) ) + { + if ( exc->pedantic_hinting ) + ARRAY_BOUND_ERROR; + } + else + exc->cvt[I] = FT_MulFix( args[1], exc->tt_metrics.scale ); + } + + + /*************************************************************************/ + /* */ + /* RCVT[]: Read CVT */ + /* Opcode range: 0x45 */ + /* Stack: uint32 --> f26.6 */ + /* */ + static void + Ins_RCVT( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong I = (FT_ULong)args[0]; + + + if ( BOUNDSL( I, exc->cvtSize ) ) + { + if ( exc->pedantic_hinting ) + ARRAY_BOUND_ERROR; + else + args[0] = 0; + } + else + args[0] = exc->func_read_cvt( exc, I ); + } + + + /*************************************************************************/ + /* */ + /* AA[]: Adjust Angle */ + /* Opcode range: 0x7F */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_AA( void ) + { + /* intentionally no longer supported */ + } + + + /*************************************************************************/ + /* */ + /* DEBUG[]: DEBUG. Unsupported. */ + /* Opcode range: 0x4F */ + /* Stack: uint32 --> */ + /* */ + /* Note: The original instruction pops a value from the stack. */ + /* */ + static void + Ins_DEBUG( TT_ExecContext exc ) + { + exc->error = FT_THROW( Debug_OpCode ); + } + + + /*************************************************************************/ + /* */ + /* ROUND[ab]: ROUND value */ + /* Opcode range: 0x68-0x6B */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_ROUND( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = exc->func_round( + exc, + args[0], + exc->tt_metrics.compensations[exc->opcode - 0x68] ); + } + + + /*************************************************************************/ + /* */ + /* NROUND[ab]: No ROUNDing of value */ + /* Opcode range: 0x6C-0x6F */ + /* Stack: f26.6 --> f26.6 */ + /* */ + static void + Ins_NROUND( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = Round_None( + exc, + args[0], + exc->tt_metrics.compensations[exc->opcode - 0x6C] ); + } + + + /*************************************************************************/ + /* */ + /* MAX[]: MAXimum */ + /* Opcode range: 0x8B */ + /* Stack: int32? int32? --> int32 */ + /* */ + static void + Ins_MAX( FT_Long* args ) + { + if ( args[1] > args[0] ) + args[0] = args[1]; + } + + + /*************************************************************************/ + /* */ + /* MIN[]: MINimum */ + /* Opcode range: 0x8C */ + /* Stack: int32? int32? --> int32 */ + /* */ + static void + Ins_MIN( FT_Long* args ) + { + if ( args[1] < args[0] ) + args[0] = args[1]; + } + + + /*************************************************************************/ + /* */ + /* MINDEX[]: Move INDEXed element */ + /* Opcode range: 0x26 */ + /* Stack: int32? --> StkElt */ + /* */ + static void + Ins_MINDEX( TT_ExecContext exc, + FT_Long* args ) + { + FT_Long L, K; + + + L = args[0]; + + if ( L <= 0 || L > exc->args ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + } + else + { + K = exc->stack[exc->args - L]; + + FT_ARRAY_MOVE( &exc->stack[exc->args - L ], + &exc->stack[exc->args - L + 1], + ( L - 1 ) ); + + exc->stack[exc->args - 1] = K; + } + } + + + /*************************************************************************/ + /* */ + /* CINDEX[]: Copy INDEXed element */ + /* Opcode range: 0x25 */ + /* Stack: int32 --> StkElt */ + /* */ + static void + Ins_CINDEX( TT_ExecContext exc, + FT_Long* args ) + { + FT_Long L; + + + L = args[0]; + + if ( L <= 0 || L > exc->args ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + args[0] = 0; + } + else + args[0] = exc->stack[exc->args - L]; + } + + + /*************************************************************************/ + /* */ + /* ROLL[]: ROLL top three elements */ + /* Opcode range: 0x8A */ + /* Stack: 3 * StkElt --> 3 * StkElt */ + /* */ + static void + Ins_ROLL( FT_Long* args ) + { + FT_Long A, B, C; + + + A = args[2]; + B = args[1]; + C = args[0]; + + args[2] = C; + args[1] = A; + args[0] = B; + } + + + /*************************************************************************/ + /* */ + /* MANAGING THE FLOW OF CONTROL */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* SLOOP[]: Set LOOP variable */ + /* Opcode range: 0x17 */ + /* Stack: int32? --> */ + /* */ + static void + Ins_SLOOP( TT_ExecContext exc, + FT_Long* args ) + { + if ( args[0] < 0 ) + exc->error = FT_THROW( Bad_Argument ); + else + { + /* we heuristically limit the number of loops to 16 bits */ + exc->GS.loop = args[0] > 0xFFFFL ? 0xFFFFL : args[0]; + } + } + + + static FT_Bool + SkipCode( TT_ExecContext exc ) + { + exc->IP += exc->length; + + if ( exc->IP < exc->codeSize ) + { + exc->opcode = exc->code[exc->IP]; + + exc->length = opcode_length[exc->opcode]; + if ( exc->length < 0 ) + { + if ( exc->IP + 1 >= exc->codeSize ) + goto Fail_Overflow; + exc->length = 2 - exc->length * exc->code[exc->IP + 1]; + } + + if ( exc->IP + exc->length <= exc->codeSize ) + return SUCCESS; + } + + Fail_Overflow: + exc->error = FT_THROW( Code_Overflow ); + return FAILURE; + } + + + /*************************************************************************/ + /* */ + /* IF[]: IF test */ + /* Opcode range: 0x58 */ + /* Stack: StkElt --> */ + /* */ + static void + Ins_IF( TT_ExecContext exc, + FT_Long* args ) + { + FT_Int nIfs; + FT_Bool Out; + + + if ( args[0] != 0 ) + return; + + nIfs = 1; + Out = 0; + + do + { + if ( SkipCode( exc ) == FAILURE ) + return; + + switch ( exc->opcode ) + { + case 0x58: /* IF */ + nIfs++; + break; + + case 0x1B: /* ELSE */ + Out = FT_BOOL( nIfs == 1 ); + break; + + case 0x59: /* EIF */ + nIfs--; + Out = FT_BOOL( nIfs == 0 ); + break; + } + } while ( Out == 0 ); + } + + + /*************************************************************************/ + /* */ + /* ELSE[]: ELSE */ + /* Opcode range: 0x1B */ + /* Stack: --> */ + /* */ + static void + Ins_ELSE( TT_ExecContext exc ) + { + FT_Int nIfs; + + + nIfs = 1; + + do + { + if ( SkipCode( exc ) == FAILURE ) + return; + + switch ( exc->opcode ) + { + case 0x58: /* IF */ + nIfs++; + break; + + case 0x59: /* EIF */ + nIfs--; + break; + } + } while ( nIfs != 0 ); + } + + + /*************************************************************************/ + /* */ + /* EIF[]: End IF */ + /* Opcode range: 0x59 */ + /* Stack: --> */ + /* */ + static void + Ins_EIF( void ) + { + /* nothing to do */ + } + + + /*************************************************************************/ + /* */ + /* JMPR[]: JuMP Relative */ + /* Opcode range: 0x1C */ + /* Stack: int32 --> */ + /* */ + static void + Ins_JMPR( TT_ExecContext exc, + FT_Long* args ) + { + if ( args[0] == 0 && exc->args == 0 ) + { + exc->error = FT_THROW( Bad_Argument ); + return; + } + + exc->IP += args[0]; + if ( exc->IP < 0 || + ( exc->callTop > 0 && + exc->IP > exc->callStack[exc->callTop - 1].Def->end ) ) + { + exc->error = FT_THROW( Bad_Argument ); + return; + } + + exc->step_ins = FALSE; + + if ( args[0] < 0 ) + { + if ( ++exc->neg_jump_counter > exc->neg_jump_counter_max ) + exc->error = FT_THROW( Execution_Too_Long ); + } + } + + + /*************************************************************************/ + /* */ + /* JROT[]: Jump Relative On True */ + /* Opcode range: 0x78 */ + /* Stack: StkElt int32 --> */ + /* */ + static void + Ins_JROT( TT_ExecContext exc, + FT_Long* args ) + { + if ( args[1] != 0 ) + Ins_JMPR( exc, args ); + } + + + /*************************************************************************/ + /* */ + /* JROF[]: Jump Relative On False */ + /* Opcode range: 0x79 */ + /* Stack: StkElt int32 --> */ + /* */ + static void + Ins_JROF( TT_ExecContext exc, + FT_Long* args ) + { + if ( args[1] == 0 ) + Ins_JMPR( exc, args ); + } + + + /*************************************************************************/ + /* */ + /* DEFINING AND USING FUNCTIONS AND INSTRUCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* FDEF[]: Function DEFinition */ + /* Opcode range: 0x2C */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_FDEF( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong n; + TT_DefRecord* rec; + TT_DefRecord* limit; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + /* arguments to opcodes are skipped by `SKIP_Code' */ + FT_Byte opcode_pattern[9][12] = { + /* #0 inline delta function 1 */ + { + 0x4B, /* PPEM */ + 0x53, /* GTEQ */ + 0x23, /* SWAP */ + 0x4B, /* PPEM */ + 0x51, /* LTEQ */ + 0x5A, /* AND */ + 0x58, /* IF */ + 0x38, /* SHPIX */ + 0x1B, /* ELSE */ + 0x21, /* POP */ + 0x21, /* POP */ + 0x59 /* EIF */ + }, + /* #1 inline delta function 2 */ + { + 0x4B, /* PPEM */ + 0x54, /* EQ */ + 0x58, /* IF */ + 0x38, /* SHPIX */ + 0x1B, /* ELSE */ + 0x21, /* POP */ + 0x21, /* POP */ + 0x59 /* EIF */ + }, + /* #2 diagonal stroke function */ + { + 0x20, /* DUP */ + 0x20, /* DUP */ + 0xB0, /* PUSHB_1 */ + /* 1 */ + 0x60, /* ADD */ + 0x46, /* GC_cur */ + 0xB0, /* PUSHB_1 */ + /* 64 */ + 0x23, /* SWAP */ + 0x42 /* WS */ + }, + /* #3 VacuFormRound function */ + { + 0x45, /* RCVT */ + 0x23, /* SWAP */ + 0x46, /* GC_cur */ + 0x60, /* ADD */ + 0x20, /* DUP */ + 0xB0 /* PUSHB_1 */ + /* 38 */ + }, + /* #4 TTFautohint bytecode (old) */ + { + 0x20, /* DUP */ + 0x64, /* ABS */ + 0xB0, /* PUSHB_1 */ + /* 32 */ + 0x60, /* ADD */ + 0x66, /* FLOOR */ + 0x23, /* SWAP */ + 0xB0 /* PUSHB_1 */ + }, + /* #5 spacing function 1 */ + { + 0x01, /* SVTCA_x */ + 0xB0, /* PUSHB_1 */ + /* 24 */ + 0x43, /* RS */ + 0x58 /* IF */ + }, + /* #6 spacing function 2 */ + { + 0x01, /* SVTCA_x */ + 0x18, /* RTG */ + 0xB0, /* PUSHB_1 */ + /* 24 */ + 0x43, /* RS */ + 0x58 /* IF */ + }, + /* #7 TypeMan Talk DiagEndCtrl function */ + { + 0x01, /* SVTCA_x */ + 0x20, /* DUP */ + 0xB0, /* PUSHB_1 */ + /* 3 */ + 0x25, /* CINDEX */ + }, + /* #8 TypeMan Talk Align */ + { + 0x06, /* SPVTL */ + 0x7D, /* RDTG */ + }, + }; + FT_UShort opcode_patterns = 9; + FT_UShort opcode_pointer[9] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + FT_UShort opcode_size[9] = { 12, 8, 8, 6, 7, 4, 5, 4, 2 }; + FT_UShort i; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + + /* FDEF is only allowed in `prep' or `fpgm' */ + if ( exc->curRange == tt_coderange_glyph ) + { + exc->error = FT_THROW( DEF_In_Glyf_Bytecode ); + return; + } + + /* some font programs are broken enough to redefine functions! */ + /* We will then parse the current table. */ + + rec = exc->FDefs; + limit = rec + exc->numFDefs; + n = (FT_ULong)args[0]; + + for ( ; rec < limit; rec++ ) + { + if ( rec->opc == n ) + break; + } + + if ( rec == limit ) + { + /* check that there is enough room for new functions */ + if ( exc->numFDefs >= exc->maxFDefs ) + { + exc->error = FT_THROW( Too_Many_Function_Defs ); + return; + } + exc->numFDefs++; + } + + /* Although FDEF takes unsigned 32-bit integer, */ + /* func # must be within unsigned 16-bit integer */ + if ( n > 0xFFFFU ) + { + exc->error = FT_THROW( Too_Many_Function_Defs ); + return; + } + + rec->range = exc->curRange; + rec->opc = (FT_UInt16)n; + rec->start = exc->IP + 1; + rec->active = TRUE; + rec->inline_delta = FALSE; + rec->sph_fdef_flags = 0x0000; + + if ( n > exc->maxFunc ) + exc->maxFunc = (FT_UInt16)n; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + /* We don't know for sure these are typeman functions, */ + /* however they are only active when RS 22 is called */ + if ( n >= 64 && n <= 66 ) + rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_STROKES; +#endif + + /* Now skip the whole function definition. */ + /* We don't allow nested IDEFS & FDEFs. */ + + while ( SkipCode( exc ) == SUCCESS ) + { + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + + if ( SUBPIXEL_HINTING_INFINALITY ) + { + for ( i = 0; i < opcode_patterns; i++ ) + { + if ( opcode_pointer[i] < opcode_size[i] && + exc->opcode == opcode_pattern[i][opcode_pointer[i]] ) + { + opcode_pointer[i] += 1; + + if ( opcode_pointer[i] == opcode_size[i] ) + { + FT_TRACE6(( "sph: Function %d, opcode ptrn: %d, %s %s\n", + i, n, + exc->face->root.family_name, + exc->face->root.style_name )); + + switch ( i ) + { + case 0: + rec->sph_fdef_flags |= SPH_FDEF_INLINE_DELTA_1; + exc->face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_1; + break; + + case 1: + rec->sph_fdef_flags |= SPH_FDEF_INLINE_DELTA_2; + exc->face->sph_found_func_flags |= SPH_FDEF_INLINE_DELTA_2; + break; + + case 2: + switch ( n ) + { + /* needs to be implemented still */ + case 58: + rec->sph_fdef_flags |= SPH_FDEF_DIAGONAL_STROKE; + exc->face->sph_found_func_flags |= SPH_FDEF_DIAGONAL_STROKE; + } + break; + + case 3: + switch ( n ) + { + case 0: + rec->sph_fdef_flags |= SPH_FDEF_VACUFORM_ROUND_1; + exc->face->sph_found_func_flags |= SPH_FDEF_VACUFORM_ROUND_1; + } + break; + + case 4: + /* probably not necessary to detect anymore */ + rec->sph_fdef_flags |= SPH_FDEF_TTFAUTOHINT_1; + exc->face->sph_found_func_flags |= SPH_FDEF_TTFAUTOHINT_1; + break; + + case 5: + switch ( n ) + { + case 0: + case 1: + case 2: + case 4: + case 7: + case 8: + rec->sph_fdef_flags |= SPH_FDEF_SPACING_1; + exc->face->sph_found_func_flags |= SPH_FDEF_SPACING_1; + } + break; + + case 6: + switch ( n ) + { + case 0: + case 1: + case 2: + case 4: + case 7: + case 8: + rec->sph_fdef_flags |= SPH_FDEF_SPACING_2; + exc->face->sph_found_func_flags |= SPH_FDEF_SPACING_2; + } + break; + + case 7: + rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; + exc->face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; + break; + + case 8: +#if 0 + rec->sph_fdef_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; + exc->face->sph_found_func_flags |= SPH_FDEF_TYPEMAN_DIAGENDCTRL; +#endif + break; + } + opcode_pointer[i] = 0; + } + } + + else + opcode_pointer[i] = 0; + } + + /* Set sph_compatibility_mode only when deltas are detected */ + exc->face->sph_compatibility_mode = + ( ( exc->face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_1 ) | + ( exc->face->sph_found_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ); + } + +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + switch ( exc->opcode ) + { + case 0x89: /* IDEF */ + case 0x2C: /* FDEF */ + exc->error = FT_THROW( Nested_DEFS ); + return; + + case 0x2D: /* ENDF */ + rec->end = exc->IP; + return; + } + } + } + + + /*************************************************************************/ + /* */ + /* ENDF[]: END Function definition */ + /* Opcode range: 0x2D */ + /* Stack: --> */ + /* */ + static void + Ins_ENDF( TT_ExecContext exc ) + { + TT_CallRec* pRec; + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + exc->sph_in_func_flags = 0x0000; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + if ( exc->callTop <= 0 ) /* We encountered an ENDF without a call */ + { + exc->error = FT_THROW( ENDF_In_Exec_Stream ); + return; + } + + exc->callTop--; + + pRec = &exc->callStack[exc->callTop]; + + pRec->Cur_Count--; + + exc->step_ins = FALSE; + + if ( pRec->Cur_Count > 0 ) + { + exc->callTop++; + exc->IP = pRec->Def->start; + } + else + /* Loop through the current function */ + Ins_Goto_CodeRange( exc, pRec->Caller_Range, pRec->Caller_IP ); + + /* Exit the current call frame. */ + + /* NOTE: If the last instruction of a program is a */ + /* CALL or LOOPCALL, the return address is */ + /* always out of the code range. This is a */ + /* valid address, and it is why we do not test */ + /* the result of Ins_Goto_CodeRange() here! */ + } + + + /*************************************************************************/ + /* */ + /* CALL[]: CALL function */ + /* Opcode range: 0x2B */ + /* Stack: uint32? --> */ + /* */ + static void + Ins_CALL( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong F; + TT_CallRec* pCrec; + TT_DefRecord* def; + + + /* first of all, check the index */ + + F = (FT_ULong)args[0]; + if ( BOUNDSL( F, exc->maxFunc + 1 ) ) + goto Fail; + + /* Except for some old Apple fonts, all functions in a TrueType */ + /* font are defined in increasing order, starting from 0. This */ + /* means that we normally have */ + /* */ + /* exc->maxFunc+1 == exc->numFDefs */ + /* exc->FDefs[n].opc == n for n in 0..exc->maxFunc */ + /* */ + /* If this isn't true, we need to look up the function table. */ + + def = exc->FDefs + F; + if ( exc->maxFunc + 1 != exc->numFDefs || def->opc != F ) + { + /* look up the FDefs table */ + TT_DefRecord* limit; + + + def = exc->FDefs; + limit = def + exc->numFDefs; + + while ( def < limit && def->opc != F ) + def++; + + if ( def == limit ) + goto Fail; + } + + /* check that the function is active */ + if ( !def->active ) + goto Fail; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + ( ( exc->iup_called && + ( exc->sph_tweak_flags & SPH_TWEAK_NO_CALL_AFTER_IUP ) ) || + ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) ) ) + goto Fail; + else + exc->sph_in_func_flags = def->sph_fdef_flags; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + /* check the call stack */ + if ( exc->callTop >= exc->callSize ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + pCrec = exc->callStack + exc->callTop; + + pCrec->Caller_Range = exc->curRange; + pCrec->Caller_IP = exc->IP + 1; + pCrec->Cur_Count = 1; + pCrec->Def = def; + + exc->callTop++; + + Ins_Goto_CodeRange( exc, def->range, def->start ); + + exc->step_ins = FALSE; + + return; + + Fail: + exc->error = FT_THROW( Invalid_Reference ); + } + + + /*************************************************************************/ + /* */ + /* LOOPCALL[]: LOOP and CALL function */ + /* Opcode range: 0x2A */ + /* Stack: uint32? Eint16? --> */ + /* */ + static void + Ins_LOOPCALL( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong F; + TT_CallRec* pCrec; + TT_DefRecord* def; + + + /* first of all, check the index */ + F = (FT_ULong)args[1]; + if ( BOUNDSL( F, exc->maxFunc + 1 ) ) + goto Fail; + + /* Except for some old Apple fonts, all functions in a TrueType */ + /* font are defined in increasing order, starting from 0. This */ + /* means that we normally have */ + /* */ + /* exc->maxFunc+1 == exc->numFDefs */ + /* exc->FDefs[n].opc == n for n in 0..exc->maxFunc */ + /* */ + /* If this isn't true, we need to look up the function table. */ + + def = exc->FDefs + F; + if ( exc->maxFunc + 1 != exc->numFDefs || def->opc != F ) + { + /* look up the FDefs table */ + TT_DefRecord* limit; + + + def = exc->FDefs; + limit = def + exc->numFDefs; + + while ( def < limit && def->opc != F ) + def++; + + if ( def == limit ) + goto Fail; + } + + /* check that the function is active */ + if ( !def->active ) + goto Fail; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + ( def->sph_fdef_flags & SPH_FDEF_VACUFORM_ROUND_1 ) ) + goto Fail; + else + exc->sph_in_func_flags = def->sph_fdef_flags; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + /* check stack */ + if ( exc->callTop >= exc->callSize ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + if ( args[0] > 0 ) + { + pCrec = exc->callStack + exc->callTop; + + pCrec->Caller_Range = exc->curRange; + pCrec->Caller_IP = exc->IP + 1; + pCrec->Cur_Count = (FT_Int)args[0]; + pCrec->Def = def; + + exc->callTop++; + + Ins_Goto_CodeRange( exc, def->range, def->start ); + + exc->step_ins = FALSE; + + exc->loopcall_counter += (FT_ULong)args[0]; + if ( exc->loopcall_counter > exc->loopcall_counter_max ) + exc->error = FT_THROW( Execution_Too_Long ); + } + + return; + + Fail: + exc->error = FT_THROW( Invalid_Reference ); + } + + + /*************************************************************************/ + /* */ + /* IDEF[]: Instruction DEFinition */ + /* Opcode range: 0x89 */ + /* Stack: Eint8 --> */ + /* */ + static void + Ins_IDEF( TT_ExecContext exc, + FT_Long* args ) + { + TT_DefRecord* def; + TT_DefRecord* limit; + + + /* we enable IDEF only in `prep' or `fpgm' */ + if ( exc->curRange == tt_coderange_glyph ) + { + exc->error = FT_THROW( DEF_In_Glyf_Bytecode ); + return; + } + + /* First of all, look for the same function in our table */ + + def = exc->IDefs; + limit = def + exc->numIDefs; + + for ( ; def < limit; def++ ) + if ( def->opc == (FT_ULong)args[0] ) + break; + + if ( def == limit ) + { + /* check that there is enough room for a new instruction */ + if ( exc->numIDefs >= exc->maxIDefs ) + { + exc->error = FT_THROW( Too_Many_Instruction_Defs ); + return; + } + exc->numIDefs++; + } + + /* opcode must be unsigned 8-bit integer */ + if ( 0 > args[0] || args[0] > 0x00FF ) + { + exc->error = FT_THROW( Too_Many_Instruction_Defs ); + return; + } + + def->opc = (FT_Byte)args[0]; + def->start = exc->IP + 1; + def->range = exc->curRange; + def->active = TRUE; + + if ( (FT_ULong)args[0] > exc->maxIns ) + exc->maxIns = (FT_Byte)args[0]; + + /* Now skip the whole function definition. */ + /* We don't allow nested IDEFs & FDEFs. */ + + while ( SkipCode( exc ) == SUCCESS ) + { + switch ( exc->opcode ) + { + case 0x89: /* IDEF */ + case 0x2C: /* FDEF */ + exc->error = FT_THROW( Nested_DEFS ); + return; + case 0x2D: /* ENDF */ + def->end = exc->IP; + return; + } + } + } + + + /*************************************************************************/ + /* */ + /* PUSHING DATA ONTO THE INTERPRETER STACK */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* NPUSHB[]: PUSH N Bytes */ + /* Opcode range: 0x40 */ + /* Stack: --> uint32... */ + /* */ + static void + Ins_NPUSHB( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort L, K; + + + L = (FT_UShort)exc->code[exc->IP + 1]; + + if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + for ( K = 1; K <= L; K++ ) + args[K - 1] = exc->code[exc->IP + K + 1]; + + exc->new_top += L; + } + + + /*************************************************************************/ + /* */ + /* NPUSHW[]: PUSH N Words */ + /* Opcode range: 0x41 */ + /* Stack: --> int32... */ + /* */ + static void + Ins_NPUSHW( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort L, K; + + + L = (FT_UShort)exc->code[exc->IP + 1]; + + if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + exc->IP += 2; + + for ( K = 0; K < L; K++ ) + args[K] = GetShortIns( exc ); + + exc->step_ins = FALSE; + exc->new_top += L; + } + + + /*************************************************************************/ + /* */ + /* PUSHB[abc]: PUSH Bytes */ + /* Opcode range: 0xB0-0xB7 */ + /* Stack: --> uint32... */ + /* */ + static void + Ins_PUSHB( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort L, K; + + + L = (FT_UShort)( exc->opcode - 0xB0 + 1 ); + + if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + for ( K = 1; K <= L; K++ ) + args[K - 1] = exc->code[exc->IP + K]; + } + + + /*************************************************************************/ + /* */ + /* PUSHW[abc]: PUSH Words */ + /* Opcode range: 0xB8-0xBF */ + /* Stack: --> int32... */ + /* */ + static void + Ins_PUSHW( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort L, K; + + + L = (FT_UShort)( exc->opcode - 0xB8 + 1 ); + + if ( BOUNDS( L, exc->stackSize + 1 - exc->top ) ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + exc->IP++; + + for ( K = 0; K < L; K++ ) + args[K] = GetShortIns( exc ); + + exc->step_ins = FALSE; + } + + + /*************************************************************************/ + /* */ + /* MANAGING THE GRAPHICS STATE */ + /* */ + /*************************************************************************/ + + + static FT_Bool + Ins_SxVTL( TT_ExecContext exc, + FT_UShort aIdx1, + FT_UShort aIdx2, + FT_UnitVector* Vec ) + { + FT_Long A, B, C; + FT_Vector* p1; + FT_Vector* p2; + + FT_Byte opcode = exc->opcode; + + + if ( BOUNDS( aIdx1, exc->zp2.n_points ) || + BOUNDS( aIdx2, exc->zp1.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return FAILURE; + } + + p1 = exc->zp1.cur + aIdx2; + p2 = exc->zp2.cur + aIdx1; + + A = SUB_LONG( p1->x, p2->x ); + B = SUB_LONG( p1->y, p2->y ); + + /* If p1 == p2, SPvTL and SFvTL behave the same as */ + /* SPvTCA[X] and SFvTCA[X], respectively. */ + /* */ + /* Confirmed by Greg Hitchcock. */ + + if ( A == 0 && B == 0 ) + { + A = 0x4000; + opcode = 0; + } + + if ( ( opcode & 1 ) != 0 ) + { + C = B; /* counter clockwise rotation */ + B = A; + A = NEG_LONG( C ); + } + + Normalize( A, B, Vec ); + + return SUCCESS; + } + + + /*************************************************************************/ + /* */ + /* SVTCA[a]: Set (F and P) Vectors to Coordinate Axis */ + /* Opcode range: 0x00-0x01 */ + /* Stack: --> */ + /* */ + /* SPvTCA[a]: Set PVector to Coordinate Axis */ + /* Opcode range: 0x02-0x03 */ + /* Stack: --> */ + /* */ + /* SFvTCA[a]: Set FVector to Coordinate Axis */ + /* Opcode range: 0x04-0x05 */ + /* Stack: --> */ + /* */ + static void + Ins_SxyTCA( TT_ExecContext exc ) + { + FT_Short AA, BB; + + FT_Byte opcode = exc->opcode; + + + AA = (FT_Short)( ( opcode & 1 ) << 14 ); + BB = (FT_Short)( AA ^ 0x4000 ); + + if ( opcode < 4 ) + { + exc->GS.projVector.x = AA; + exc->GS.projVector.y = BB; + + exc->GS.dualVector.x = AA; + exc->GS.dualVector.y = BB; + } + + if ( ( opcode & 2 ) == 0 ) + { + exc->GS.freeVector.x = AA; + exc->GS.freeVector.y = BB; + } + + Compute_Funcs( exc ); + } + + + /*************************************************************************/ + /* */ + /* SPvTL[a]: Set PVector To Line */ + /* Opcode range: 0x06-0x07 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_SPVTL( TT_ExecContext exc, + FT_Long* args ) + { + if ( Ins_SxVTL( exc, + (FT_UShort)args[1], + (FT_UShort)args[0], + &exc->GS.projVector ) == SUCCESS ) + { + exc->GS.dualVector = exc->GS.projVector; + Compute_Funcs( exc ); + } + } + + + /*************************************************************************/ + /* */ + /* SFvTL[a]: Set FVector To Line */ + /* Opcode range: 0x08-0x09 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_SFVTL( TT_ExecContext exc, + FT_Long* args ) + { + if ( Ins_SxVTL( exc, + (FT_UShort)args[1], + (FT_UShort)args[0], + &exc->GS.freeVector ) == SUCCESS ) + { + Compute_Funcs( exc ); + } + } + + + /*************************************************************************/ + /* */ + /* SFvTPv[]: Set FVector To PVector */ + /* Opcode range: 0x0E */ + /* Stack: --> */ + /* */ + static void + Ins_SFVTPV( TT_ExecContext exc ) + { + exc->GS.freeVector = exc->GS.projVector; + Compute_Funcs( exc ); + } + + + /*************************************************************************/ + /* */ + /* SPvFS[]: Set PVector From Stack */ + /* Opcode range: 0x0A */ + /* Stack: f2.14 f2.14 --> */ + /* */ + static void + Ins_SPVFS( TT_ExecContext exc, + FT_Long* args ) + { + FT_Short S; + FT_Long X, Y; + + + /* Only use low 16bits, then sign extend */ + S = (FT_Short)args[1]; + Y = (FT_Long)S; + S = (FT_Short)args[0]; + X = (FT_Long)S; + + Normalize( X, Y, &exc->GS.projVector ); + + exc->GS.dualVector = exc->GS.projVector; + Compute_Funcs( exc ); + } + + + /*************************************************************************/ + /* */ + /* SFvFS[]: Set FVector From Stack */ + /* Opcode range: 0x0B */ + /* Stack: f2.14 f2.14 --> */ + /* */ + static void + Ins_SFVFS( TT_ExecContext exc, + FT_Long* args ) + { + FT_Short S; + FT_Long X, Y; + + + /* Only use low 16bits, then sign extend */ + S = (FT_Short)args[1]; + Y = (FT_Long)S; + S = (FT_Short)args[0]; + X = S; + + Normalize( X, Y, &exc->GS.freeVector ); + Compute_Funcs( exc ); + } + + + /*************************************************************************/ + /* */ + /* GPv[]: Get Projection Vector */ + /* Opcode range: 0x0C */ + /* Stack: ef2.14 --> ef2.14 */ + /* */ + static void + Ins_GPV( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = exc->GS.projVector.x; + args[1] = exc->GS.projVector.y; + } + + + /*************************************************************************/ + /* */ + /* GFv[]: Get Freedom Vector */ + /* Opcode range: 0x0D */ + /* Stack: ef2.14 --> ef2.14 */ + /* */ + static void + Ins_GFV( TT_ExecContext exc, + FT_Long* args ) + { + args[0] = exc->GS.freeVector.x; + args[1] = exc->GS.freeVector.y; + } + + + /*************************************************************************/ + /* */ + /* SRP0[]: Set Reference Point 0 */ + /* Opcode range: 0x10 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SRP0( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.rp0 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SRP1[]: Set Reference Point 1 */ + /* Opcode range: 0x11 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SRP1( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.rp1 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SRP2[]: Set Reference Point 2 */ + /* Opcode range: 0x12 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SRP2( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.rp2 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SMD[]: Set Minimum Distance */ + /* Opcode range: 0x1A */ + /* Stack: f26.6 --> */ + /* */ + static void + Ins_SMD( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.minimum_distance = args[0]; + } + + + /*************************************************************************/ + /* */ + /* SCVTCI[]: Set Control Value Table Cut In */ + /* Opcode range: 0x1D */ + /* Stack: f26.6 --> */ + /* */ + static void + Ins_SCVTCI( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.control_value_cutin = (FT_F26Dot6)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SSWCI[]: Set Single Width Cut In */ + /* Opcode range: 0x1E */ + /* Stack: f26.6 --> */ + /* */ + static void + Ins_SSWCI( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.single_width_cutin = (FT_F26Dot6)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SSW[]: Set Single Width */ + /* Opcode range: 0x1F */ + /* Stack: int32? --> */ + /* */ + static void + Ins_SSW( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.single_width_value = FT_MulFix( args[0], + exc->tt_metrics.scale ); + } + + + /*************************************************************************/ + /* */ + /* FLIPON[]: Set auto-FLIP to ON */ + /* Opcode range: 0x4D */ + /* Stack: --> */ + /* */ + static void + Ins_FLIPON( TT_ExecContext exc ) + { + exc->GS.auto_flip = TRUE; + } + + + /*************************************************************************/ + /* */ + /* FLIPOFF[]: Set auto-FLIP to OFF */ + /* Opcode range: 0x4E */ + /* Stack: --> */ + /* */ + static void + Ins_FLIPOFF( TT_ExecContext exc ) + { + exc->GS.auto_flip = FALSE; + } + + + /*************************************************************************/ + /* */ + /* SANGW[]: Set ANGle Weight */ + /* Opcode range: 0x7E */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SANGW( void ) + { + /* instruction not supported anymore */ + } + + + /*************************************************************************/ + /* */ + /* SDB[]: Set Delta Base */ + /* Opcode range: 0x5E */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SDB( TT_ExecContext exc, + FT_Long* args ) + { + exc->GS.delta_base = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SDS[]: Set Delta Shift */ + /* Opcode range: 0x5F */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SDS( TT_ExecContext exc, + FT_Long* args ) + { + if ( (FT_ULong)args[0] > 6UL ) + exc->error = FT_THROW( Bad_Argument ); + else + exc->GS.delta_shift = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* RTHG[]: Round To Half Grid */ + /* Opcode range: 0x19 */ + /* Stack: --> */ + /* */ + static void + Ins_RTHG( TT_ExecContext exc ) + { + exc->GS.round_state = TT_Round_To_Half_Grid; + exc->func_round = (TT_Round_Func)Round_To_Half_Grid; + } + + + /*************************************************************************/ + /* */ + /* RTG[]: Round To Grid */ + /* Opcode range: 0x18 */ + /* Stack: --> */ + /* */ + static void + Ins_RTG( TT_ExecContext exc ) + { + exc->GS.round_state = TT_Round_To_Grid; + exc->func_round = (TT_Round_Func)Round_To_Grid; + } + + + /*************************************************************************/ + /* RTDG[]: Round To Double Grid */ + /* Opcode range: 0x3D */ + /* Stack: --> */ + /* */ + static void + Ins_RTDG( TT_ExecContext exc ) + { + exc->GS.round_state = TT_Round_To_Double_Grid; + exc->func_round = (TT_Round_Func)Round_To_Double_Grid; + } + + + /*************************************************************************/ + /* RUTG[]: Round Up To Grid */ + /* Opcode range: 0x7C */ + /* Stack: --> */ + /* */ + static void + Ins_RUTG( TT_ExecContext exc ) + { + exc->GS.round_state = TT_Round_Up_To_Grid; + exc->func_round = (TT_Round_Func)Round_Up_To_Grid; + } + + + /*************************************************************************/ + /* */ + /* RDTG[]: Round Down To Grid */ + /* Opcode range: 0x7D */ + /* Stack: --> */ + /* */ + static void + Ins_RDTG( TT_ExecContext exc ) + { + exc->GS.round_state = TT_Round_Down_To_Grid; + exc->func_round = (TT_Round_Func)Round_Down_To_Grid; + } + + + /*************************************************************************/ + /* */ + /* ROFF[]: Round OFF */ + /* Opcode range: 0x7A */ + /* Stack: --> */ + /* */ + static void + Ins_ROFF( TT_ExecContext exc ) + { + exc->GS.round_state = TT_Round_Off; + exc->func_round = (TT_Round_Func)Round_None; + } + + + /*************************************************************************/ + /* */ + /* SROUND[]: Super ROUND */ + /* Opcode range: 0x76 */ + /* Stack: Eint8 --> */ + /* */ + static void + Ins_SROUND( TT_ExecContext exc, + FT_Long* args ) + { + SetSuperRound( exc, 0x4000, args[0] ); + + exc->GS.round_state = TT_Round_Super; + exc->func_round = (TT_Round_Func)Round_Super; + } + + + /*************************************************************************/ + /* */ + /* S45ROUND[]: Super ROUND 45 degrees */ + /* Opcode range: 0x77 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_S45ROUND( TT_ExecContext exc, + FT_Long* args ) + { + SetSuperRound( exc, 0x2D41, args[0] ); + + exc->GS.round_state = TT_Round_Super_45; + exc->func_round = (TT_Round_Func)Round_Super_45; + } + + + /*************************************************************************/ + /* */ + /* GC[a]: Get Coordinate projected onto */ + /* Opcode range: 0x46-0x47 */ + /* Stack: uint32 --> f26.6 */ + /* */ + /* XXX: UNDOCUMENTED: Measures from the original glyph must be taken */ + /* along the dual projection vector! */ + /* */ + static void + Ins_GC( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong L; + FT_F26Dot6 R; + + + L = (FT_ULong)args[0]; + + if ( BOUNDSL( L, exc->zp2.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + R = 0; + } + else + { + if ( exc->opcode & 1 ) + R = FAST_DUALPROJ( &exc->zp2.org[L] ); + else + R = FAST_PROJECT( &exc->zp2.cur[L] ); + } + + args[0] = R; + } + + + /*************************************************************************/ + /* */ + /* SCFS[]: Set Coordinate From Stack */ + /* Opcode range: 0x48 */ + /* Stack: f26.6 uint32 --> */ + /* */ + /* Formula: */ + /* */ + /* OA := OA + ( value - OA.p )/( f.p ) * f */ + /* */ + static void + Ins_SCFS( TT_ExecContext exc, + FT_Long* args ) + { + FT_Long K; + FT_UShort L; + + + L = (FT_UShort)args[0]; + + if ( BOUNDS( L, exc->zp2.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + K = FAST_PROJECT( &exc->zp2.cur[L] ); + + exc->func_move( exc, &exc->zp2, L, SUB_LONG( args[1], K ) ); + + /* UNDOCUMENTED! The MS rasterizer does that with */ + /* twilight points (confirmed by Greg Hitchcock) */ + if ( exc->GS.gep2 == 0 ) + exc->zp2.org[L] = exc->zp2.cur[L]; + } + + + /*************************************************************************/ + /* */ + /* MD[a]: Measure Distance */ + /* Opcode range: 0x49-0x4A */ + /* Stack: uint32 uint32 --> f26.6 */ + /* */ + /* XXX: UNDOCUMENTED: Measure taken in the original glyph must be along */ + /* the dual projection vector. */ + /* */ + /* XXX: UNDOCUMENTED: Flag attributes are inverted! */ + /* 0 => measure distance in original outline */ + /* 1 => measure distance in grid-fitted outline */ + /* */ + /* XXX: UNDOCUMENTED: `zp0 - zp1', and not `zp2 - zp1! */ + /* */ + static void + Ins_MD( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort K, L; + FT_F26Dot6 D; + + + K = (FT_UShort)args[1]; + L = (FT_UShort)args[0]; + + if ( BOUNDS( L, exc->zp0.n_points ) || + BOUNDS( K, exc->zp1.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + D = 0; + } + else + { + if ( exc->opcode & 1 ) + D = PROJECT( exc->zp0.cur + L, exc->zp1.cur + K ); + else + { + /* XXX: UNDOCUMENTED: twilight zone special case */ + + if ( exc->GS.gep0 == 0 || exc->GS.gep1 == 0 ) + { + FT_Vector* vec1 = exc->zp0.org + L; + FT_Vector* vec2 = exc->zp1.org + K; + + + D = DUALPROJ( vec1, vec2 ); + } + else + { + FT_Vector* vec1 = exc->zp0.orus + L; + FT_Vector* vec2 = exc->zp1.orus + K; + + + if ( exc->metrics.x_scale == exc->metrics.y_scale ) + { + /* this should be faster */ + D = DUALPROJ( vec1, vec2 ); + D = FT_MulFix( D, exc->metrics.x_scale ); + } + else + { + FT_Vector vec; + + + vec.x = FT_MulFix( vec1->x - vec2->x, exc->metrics.x_scale ); + vec.y = FT_MulFix( vec1->y - vec2->y, exc->metrics.y_scale ); + + D = FAST_DUALPROJ( &vec ); + } + } + } + } + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + /* Disable Type 2 Vacuform Rounds - e.g. Arial Narrow */ + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + FT_ABS( D ) == 64 ) + D += 1; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + args[0] = D; + } + + + /*************************************************************************/ + /* */ + /* SDPvTL[a]: Set Dual PVector to Line */ + /* Opcode range: 0x86-0x87 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_SDPVTL( TT_ExecContext exc, + FT_Long* args ) + { + FT_Long A, B, C; + FT_UShort p1, p2; /* was FT_Int in pas type ERROR */ + + FT_Byte opcode = exc->opcode; + + + p1 = (FT_UShort)args[1]; + p2 = (FT_UShort)args[0]; + + if ( BOUNDS( p2, exc->zp1.n_points ) || + BOUNDS( p1, exc->zp2.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + { + FT_Vector* v1 = exc->zp1.org + p2; + FT_Vector* v2 = exc->zp2.org + p1; + + + A = SUB_LONG( v1->x, v2->x ); + B = SUB_LONG( v1->y, v2->y ); + + /* If v1 == v2, SDPvTL behaves the same as */ + /* SVTCA[X], respectively. */ + /* */ + /* Confirmed by Greg Hitchcock. */ + + if ( A == 0 && B == 0 ) + { + A = 0x4000; + opcode = 0; + } + } + + if ( ( opcode & 1 ) != 0 ) + { + C = B; /* counter clockwise rotation */ + B = A; + A = NEG_LONG( C ); + } + + Normalize( A, B, &exc->GS.dualVector ); + + { + FT_Vector* v1 = exc->zp1.cur + p2; + FT_Vector* v2 = exc->zp2.cur + p1; + + + A = SUB_LONG( v1->x, v2->x ); + B = SUB_LONG( v1->y, v2->y ); + + if ( A == 0 && B == 0 ) + { + A = 0x4000; + opcode = 0; + } + } + + if ( ( opcode & 1 ) != 0 ) + { + C = B; /* counter clockwise rotation */ + B = A; + A = NEG_LONG( C ); + } + + Normalize( A, B, &exc->GS.projVector ); + Compute_Funcs( exc ); + } + + + /*************************************************************************/ + /* */ + /* SZP0[]: Set Zone Pointer 0 */ + /* Opcode range: 0x13 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZP0( TT_ExecContext exc, + FT_Long* args ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + exc->zp0 = exc->twilight; + break; + + case 1: + exc->zp0 = exc->pts; + break; + + default: + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + exc->GS.gep0 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SZP1[]: Set Zone Pointer 1 */ + /* Opcode range: 0x14 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZP1( TT_ExecContext exc, + FT_Long* args ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + exc->zp1 = exc->twilight; + break; + + case 1: + exc->zp1 = exc->pts; + break; + + default: + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + exc->GS.gep1 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SZP2[]: Set Zone Pointer 2 */ + /* Opcode range: 0x15 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZP2( TT_ExecContext exc, + FT_Long* args ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + exc->zp2 = exc->twilight; + break; + + case 1: + exc->zp2 = exc->pts; + break; + + default: + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + exc->GS.gep2 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* SZPS[]: Set Zone PointerS */ + /* Opcode range: 0x16 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SZPS( TT_ExecContext exc, + FT_Long* args ) + { + switch ( (FT_Int)args[0] ) + { + case 0: + exc->zp0 = exc->twilight; + break; + + case 1: + exc->zp0 = exc->pts; + break; + + default: + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + exc->zp1 = exc->zp0; + exc->zp2 = exc->zp0; + + exc->GS.gep0 = (FT_UShort)args[0]; + exc->GS.gep1 = (FT_UShort)args[0]; + exc->GS.gep2 = (FT_UShort)args[0]; + } + + + /*************************************************************************/ + /* */ + /* INSTCTRL[]: INSTruction ConTRoL */ + /* Opcode range: 0x8E */ + /* Stack: int32 int32 --> */ + /* */ + static void + Ins_INSTCTRL( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong K, L, Kf; + + + K = (FT_ULong)args[1]; + L = (FT_ULong)args[0]; + + /* selector values cannot be `OR'ed; */ + /* they are indices starting with index 1, not flags */ + if ( K < 1 || K > 3 ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + /* convert index to flag value */ + Kf = 1 << ( K - 1 ); + + if ( L != 0 ) + { + /* arguments to selectors look like flag values */ + if ( L != Kf ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + } + + exc->GS.instruct_control &= ~(FT_Byte)Kf; + exc->GS.instruct_control |= (FT_Byte)L; + + if ( K == 3 ) + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + /* INSTCTRL modifying flag 3 also has an effect */ + /* outside of the CVT program */ + if ( SUBPIXEL_HINTING_INFINALITY ) + exc->ignore_x_mode = FT_BOOL( L == 4 ); +#endif + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* Native ClearType fonts sign a waiver that turns off all backward */ + /* compatibility hacks and lets them program points to the grid like */ + /* it's 1996. They might sign a waiver for just one glyph, though. */ + if ( SUBPIXEL_HINTING_MINIMAL ) + exc->backward_compatibility = !FT_BOOL( L == 4 ); +#endif + } + } + + + /*************************************************************************/ + /* */ + /* SCANCTRL[]: SCAN ConTRoL */ + /* Opcode range: 0x85 */ + /* Stack: uint32? --> */ + /* */ + static void + Ins_SCANCTRL( TT_ExecContext exc, + FT_Long* args ) + { + FT_Int A; + + + /* Get Threshold */ + A = (FT_Int)( args[0] & 0xFF ); + + if ( A == 0xFF ) + { + exc->GS.scan_control = TRUE; + return; + } + else if ( A == 0 ) + { + exc->GS.scan_control = FALSE; + return; + } + + if ( ( args[0] & 0x100 ) != 0 && exc->tt_metrics.ppem <= A ) + exc->GS.scan_control = TRUE; + + if ( ( args[0] & 0x200 ) != 0 && exc->tt_metrics.rotated ) + exc->GS.scan_control = TRUE; + + if ( ( args[0] & 0x400 ) != 0 && exc->tt_metrics.stretched ) + exc->GS.scan_control = TRUE; + + if ( ( args[0] & 0x800 ) != 0 && exc->tt_metrics.ppem > A ) + exc->GS.scan_control = FALSE; + + if ( ( args[0] & 0x1000 ) != 0 && exc->tt_metrics.rotated ) + exc->GS.scan_control = FALSE; + + if ( ( args[0] & 0x2000 ) != 0 && exc->tt_metrics.stretched ) + exc->GS.scan_control = FALSE; + } + + + /*************************************************************************/ + /* */ + /* SCANTYPE[]: SCAN TYPE */ + /* Opcode range: 0x8D */ + /* Stack: uint16 --> */ + /* */ + static void + Ins_SCANTYPE( TT_ExecContext exc, + FT_Long* args ) + { + if ( args[0] >= 0 ) + exc->GS.scan_type = (FT_Int)args[0] & 0xFFFF; + } + + + /*************************************************************************/ + /* */ + /* MANAGING OUTLINES */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* FLIPPT[]: FLIP PoinT */ + /* Opcode range: 0x80 */ + /* Stack: uint32... --> */ + /* */ + static void + Ins_FLIPPT( TT_ExecContext exc ) + { + FT_UShort point; + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* See `ttinterp.h' for details on backward compatibility mode. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && + exc->iupy_called ) + goto Fail; +#endif + + if ( exc->top < exc->GS.loop ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Too_Few_Arguments ); + goto Fail; + } + + while ( exc->GS.loop > 0 ) + { + exc->args--; + + point = (FT_UShort)exc->stack[exc->args]; + + if ( BOUNDS( point, exc->pts.n_points ) ) + { + if ( exc->pedantic_hinting ) + { + exc->error = FT_THROW( Invalid_Reference ); + return; + } + } + else + exc->pts.tags[point] ^= FT_CURVE_TAG_ON; + + exc->GS.loop--; + } + + Fail: + exc->GS.loop = 1; + exc->new_top = exc->args; + } + + + /*************************************************************************/ + /* */ + /* FLIPRGON[]: FLIP RanGe ON */ + /* Opcode range: 0x81 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_FLIPRGON( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort I, K, L; + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* See `ttinterp.h' for details on backward compatibility mode. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && + exc->iupy_called ) + return; +#endif + + K = (FT_UShort)args[1]; + L = (FT_UShort)args[0]; + + if ( BOUNDS( K, exc->pts.n_points ) || + BOUNDS( L, exc->pts.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + for ( I = L; I <= K; I++ ) + exc->pts.tags[I] |= FT_CURVE_TAG_ON; + } + + + /*************************************************************************/ + /* */ + /* FLIPRGOFF: FLIP RanGe OFF */ + /* Opcode range: 0x82 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_FLIPRGOFF( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort I, K, L; + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* See `ttinterp.h' for details on backward compatibility mode. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && + exc->iupy_called ) + return; +#endif + + K = (FT_UShort)args[1]; + L = (FT_UShort)args[0]; + + if ( BOUNDS( K, exc->pts.n_points ) || + BOUNDS( L, exc->pts.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + for ( I = L; I <= K; I++ ) + exc->pts.tags[I] &= ~FT_CURVE_TAG_ON; + } + + + static FT_Bool + Compute_Point_Displacement( TT_ExecContext exc, + FT_F26Dot6* x, + FT_F26Dot6* y, + TT_GlyphZone zone, + FT_UShort* refp ) + { + TT_GlyphZoneRec zp; + FT_UShort p; + FT_F26Dot6 d; + + + if ( exc->opcode & 1 ) + { + zp = exc->zp0; + p = exc->GS.rp1; + } + else + { + zp = exc->zp1; + p = exc->GS.rp2; + } + + if ( BOUNDS( p, zp.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + *refp = 0; + return FAILURE; + } + + *zone = zp; + *refp = p; + + d = PROJECT( zp.cur + p, zp.org + p ); + + *x = FT_MulDiv( d, (FT_Long)exc->GS.freeVector.x, exc->F_dot_P ); + *y = FT_MulDiv( d, (FT_Long)exc->GS.freeVector.y, exc->F_dot_P ); + + return SUCCESS; + } + + + /* See `ttinterp.h' for details on backward compatibility mode. */ + static void + Move_Zp2_Point( TT_ExecContext exc, + FT_UShort point, + FT_F26Dot6 dx, + FT_F26Dot6 dy, + FT_Bool touch ) + { + if ( exc->GS.freeVector.x != 0 ) + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( !( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility ) ) +#endif + exc->zp2.cur[point].x = ADD_LONG( exc->zp2.cur[point].x, dx ); + + if ( touch ) + exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_X; + } + + if ( exc->GS.freeVector.y != 0 ) + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( !( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility && + exc->iupx_called && + exc->iupy_called ) ) +#endif + exc->zp2.cur[point].y = ADD_LONG( exc->zp2.cur[point].y, dy ); + + if ( touch ) + exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_Y; + } + } + + + /*************************************************************************/ + /* */ + /* SHP[a]: SHift Point by the last point */ + /* Opcode range: 0x32-0x33 */ + /* Stack: uint32... --> */ + /* */ + static void + Ins_SHP( TT_ExecContext exc ) + { + TT_GlyphZoneRec zp; + FT_UShort refp; + + FT_F26Dot6 dx, dy; + FT_UShort point; + + + if ( exc->top < exc->GS.loop ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) ) + return; + + while ( exc->GS.loop > 0 ) + { + exc->args--; + point = (FT_UShort)exc->stack[exc->args]; + + if ( BOUNDS( point, exc->zp2.n_points ) ) + { + if ( exc->pedantic_hinting ) + { + exc->error = FT_THROW( Invalid_Reference ); + return; + } + } + else +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + /* doesn't follow Cleartype spec but produces better result */ + if ( SUBPIXEL_HINTING_INFINALITY && exc->ignore_x_mode ) + Move_Zp2_Point( exc, point, 0, dy, TRUE ); + else +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + Move_Zp2_Point( exc, point, dx, dy, TRUE ); + + exc->GS.loop--; + } + + Fail: + exc->GS.loop = 1; + exc->new_top = exc->args; + } + + + /*************************************************************************/ + /* */ + /* SHC[a]: SHift Contour */ + /* Opcode range: 0x34-35 */ + /* Stack: uint32 --> */ + /* */ + /* UNDOCUMENTED: According to Greg Hitchcock, there is one (virtual) */ + /* contour in the twilight zone, namely contour number */ + /* zero which includes all points of it. */ + /* */ + static void + Ins_SHC( TT_ExecContext exc, + FT_Long* args ) + { + TT_GlyphZoneRec zp; + FT_UShort refp; + FT_F26Dot6 dx, dy; + + FT_Short contour, bounds; + FT_UShort start, limit, i; + + + contour = (FT_Short)args[0]; + bounds = ( exc->GS.gep2 == 0 ) ? 1 : exc->zp2.n_contours; + + if ( BOUNDS( contour, bounds ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) ) + return; + + if ( contour == 0 ) + start = 0; + else + start = (FT_UShort)( exc->zp2.contours[contour - 1] + 1 - + exc->zp2.first_point ); + + /* we use the number of points if in the twilight zone */ + if ( exc->GS.gep2 == 0 ) + limit = exc->zp2.n_points; + else + limit = (FT_UShort)( exc->zp2.contours[contour] - + exc->zp2.first_point + 1 ); + + for ( i = start; i < limit; i++ ) + { + if ( zp.cur != exc->zp2.cur || refp != i ) + Move_Zp2_Point( exc, i, dx, dy, TRUE ); + } + } + + + /*************************************************************************/ + /* */ + /* SHZ[a]: SHift Zone */ + /* Opcode range: 0x36-37 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_SHZ( TT_ExecContext exc, + FT_Long* args ) + { + TT_GlyphZoneRec zp; + FT_UShort refp; + FT_F26Dot6 dx, + dy; + + FT_UShort limit, i; + + + if ( BOUNDS( args[0], 2 ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + if ( Compute_Point_Displacement( exc, &dx, &dy, &zp, &refp ) ) + return; + + /* XXX: UNDOCUMENTED! SHZ doesn't move the phantom points. */ + /* Twilight zone has no real contours, so use `n_points'. */ + /* Normal zone's `n_points' includes phantoms, so must */ + /* use end of last contour. */ + if ( exc->GS.gep2 == 0 ) + limit = (FT_UShort)exc->zp2.n_points; + else if ( exc->GS.gep2 == 1 && exc->zp2.n_contours > 0 ) + limit = (FT_UShort)( exc->zp2.contours[exc->zp2.n_contours - 1] + 1 ); + else + limit = 0; + + /* XXX: UNDOCUMENTED! SHZ doesn't touch the points */ + for ( i = 0; i < limit; i++ ) + { + if ( zp.cur != exc->zp2.cur || refp != i ) + Move_Zp2_Point( exc, i, dx, dy, FALSE ); + } + } + + + /*************************************************************************/ + /* */ + /* SHPIX[]: SHift points by a PIXel amount */ + /* Opcode range: 0x38 */ + /* Stack: f26.6 uint32... --> */ + /* */ + static void + Ins_SHPIX( TT_ExecContext exc, + FT_Long* args ) + { + FT_F26Dot6 dx, dy; + FT_UShort point; +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + FT_Int B1, B2; +#endif +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + FT_Bool in_twilight = FT_BOOL( exc->GS.gep0 == 0 || + exc->GS.gep1 == 0 || + exc->GS.gep2 == 0 ); +#endif + + + + if ( exc->top < exc->GS.loop + 1 ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + dx = TT_MulFix14( args[0], exc->GS.freeVector.x ); + dy = TT_MulFix14( args[0], exc->GS.freeVector.y ); + + while ( exc->GS.loop > 0 ) + { + exc->args--; + + point = (FT_UShort)exc->stack[exc->args]; + + if ( BOUNDS( point, exc->zp2.n_points ) ) + { + if ( exc->pedantic_hinting ) + { + exc->error = FT_THROW( Invalid_Reference ); + return; + } + } + else +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY ) + { + /* If not using ignore_x_mode rendering, allow ZP2 move. */ + /* If inline deltas aren't allowed, skip ZP2 move. */ + /* If using ignore_x_mode rendering, allow ZP2 point move if: */ + /* - freedom vector is y and sph_compatibility_mode is off */ + /* - the glyph is composite and the move is in the Y direction */ + /* - the glyph is specifically set to allow SHPIX moves */ + /* - the move is on a previously Y-touched point */ + + if ( exc->ignore_x_mode ) + { + /* save point for later comparison */ + if ( exc->GS.freeVector.y != 0 ) + B1 = exc->zp2.cur[point].y; + else + B1 = exc->zp2.cur[point].x; + + if ( !exc->face->sph_compatibility_mode && + exc->GS.freeVector.y != 0 ) + { + Move_Zp2_Point( exc, point, dx, dy, TRUE ); + + /* save new point */ + if ( exc->GS.freeVector.y != 0 ) + { + B2 = exc->zp2.cur[point].y; + + /* reverse any disallowed moves */ + if ( ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) && + ( B1 & 63 ) != 0 && + ( B2 & 63 ) != 0 && + B1 != B2 ) + Move_Zp2_Point( exc, + point, + NEG_LONG( dx ), + NEG_LONG( dy ), + TRUE ); + } + } + else if ( exc->face->sph_compatibility_mode ) + { + if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) + { + dx = FT_PIX_ROUND( B1 + dx ) - B1; + dy = FT_PIX_ROUND( B1 + dy ) - B1; + } + + /* skip post-iup deltas */ + if ( exc->iup_called && + ( ( exc->sph_in_func_flags & SPH_FDEF_INLINE_DELTA_1 ) || + ( exc->sph_in_func_flags & SPH_FDEF_INLINE_DELTA_2 ) ) ) + goto Skip; + + if ( !( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) && + ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) || + ( exc->zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y ) || + ( exc->sph_tweak_flags & SPH_TWEAK_DO_SHPIX ) ) ) + Move_Zp2_Point( exc, point, 0, dy, TRUE ); + + /* save new point */ + if ( exc->GS.freeVector.y != 0 ) + { + B2 = exc->zp2.cur[point].y; + + /* reverse any disallowed moves */ + if ( ( B1 & 63 ) == 0 && + ( B2 & 63 ) != 0 && + B1 != B2 ) + Move_Zp2_Point( exc, point, 0, NEG_LONG( dy ), TRUE ); + } + } + else if ( exc->sph_in_func_flags & SPH_FDEF_TYPEMAN_DIAGENDCTRL ) + Move_Zp2_Point( exc, point, dx, dy, TRUE ); + } + else + Move_Zp2_Point( exc, point, dx, dy, TRUE ); + } + else +#endif +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility ) + { + /* Special case: allow SHPIX to move points in the twilight zone. */ + /* Otherwise, treat SHPIX the same as DELTAP. Unbreaks various */ + /* fonts such as older versions of Rokkitt and DTL Argo T Light */ + /* that would glitch severely after calling ALIGNRP after a */ + /* blocked SHPIX. */ + if ( in_twilight || + ( !( exc->iupx_called && exc->iupy_called ) && + ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) || + ( exc->zp2.tags[point] & FT_CURVE_TAG_TOUCH_Y ) ) ) ) + Move_Zp2_Point( exc, point, 0, dy, TRUE ); + } + else +#endif + Move_Zp2_Point( exc, point, dx, dy, TRUE ); + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + Skip: +#endif + exc->GS.loop--; + } + + Fail: + exc->GS.loop = 1; + exc->new_top = exc->args; + } + + + /*************************************************************************/ + /* */ + /* MSIRP[a]: Move Stack Indirect Relative Position */ + /* Opcode range: 0x3A-0x3B */ + /* Stack: f26.6 uint32 --> */ + /* */ + static void + Ins_MSIRP( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort point = 0; + FT_F26Dot6 distance; +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + FT_F26Dot6 control_value_cutin = 0; + FT_F26Dot6 delta; + + + if ( SUBPIXEL_HINTING_INFINALITY ) + { + control_value_cutin = exc->GS.control_value_cutin; + + if ( exc->ignore_x_mode && + exc->GS.freeVector.x != 0 && + !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) + control_value_cutin = 0; + } +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, exc->zp1.n_points ) || + BOUNDS( exc->GS.rp0, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + /* UNDOCUMENTED! The MS rasterizer does that with */ + /* twilight points (confirmed by Greg Hitchcock) */ + if ( exc->GS.gep1 == 0 ) + { + exc->zp1.org[point] = exc->zp0.org[exc->GS.rp0]; + exc->func_move_orig( exc, &exc->zp1, point, args[1] ); + exc->zp1.cur[point] = exc->zp1.org[point]; + } + + distance = PROJECT( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 ); + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + delta = SUB_LONG( distance, args[1] ); + if ( delta < 0 ) + delta = NEG_LONG( delta ); + + /* subpixel hinting - make MSIRP respect CVT cut-in; */ + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->GS.freeVector.x != 0 && + delta >= control_value_cutin ) + distance = args[1]; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + exc->func_move( exc, + &exc->zp1, + point, + SUB_LONG( args[1], distance ) ); + + exc->GS.rp1 = exc->GS.rp0; + exc->GS.rp2 = point; + + if ( ( exc->opcode & 1 ) != 0 ) + exc->GS.rp0 = point; + } + + + /*************************************************************************/ + /* */ + /* MDAP[a]: Move Direct Absolute Point */ + /* Opcode range: 0x2E-0x2F */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_MDAP( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort point; + FT_F26Dot6 cur_dist; + FT_F26Dot6 distance; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + if ( ( exc->opcode & 1 ) != 0 ) + { + cur_dist = FAST_PROJECT( &exc->zp0.cur[point] ); +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->GS.freeVector.x != 0 ) + distance = SUB_LONG( + Round_None( exc, + cur_dist, + exc->tt_metrics.compensations[0] ), + cur_dist ); + else +#endif + distance = SUB_LONG( + exc->func_round( exc, + cur_dist, + exc->tt_metrics.compensations[0] ), + cur_dist ); + } + else + distance = 0; + + exc->func_move( exc, &exc->zp0, point, distance ); + + exc->GS.rp0 = point; + exc->GS.rp1 = point; + } + + + /*************************************************************************/ + /* */ + /* MIAP[a]: Move Indirect Absolute Point */ + /* Opcode range: 0x3E-0x3F */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_MIAP( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong cvtEntry; + FT_UShort point; + FT_F26Dot6 distance; + FT_F26Dot6 org_dist; + FT_F26Dot6 control_value_cutin; + + + control_value_cutin = exc->GS.control_value_cutin; + cvtEntry = (FT_ULong)args[1]; + point = (FT_UShort)args[0]; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->GS.freeVector.x != 0 && + exc->GS.freeVector.y == 0 && + !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) + control_value_cutin = 0; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + if ( BOUNDS( point, exc->zp0.n_points ) || + BOUNDSL( cvtEntry, exc->cvtSize ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + /* UNDOCUMENTED! */ + /* */ + /* The behaviour of an MIAP instruction is quite different when used */ + /* in the twilight zone. */ + /* */ + /* First, no control value cut-in test is performed as it would fail */ + /* anyway. Second, the original point, i.e. (org_x,org_y) of */ + /* zp0.point, is set to the absolute, unrounded distance found in the */ + /* CVT. */ + /* */ + /* This is used in the CVT programs of the Microsoft fonts Arial, */ + /* Times, etc., in order to re-adjust some key font heights. It */ + /* allows the use of the IP instruction in the twilight zone, which */ + /* otherwise would be invalid according to the specification. */ + /* */ + /* We implement it with a special sequence for the twilight zone. */ + /* This is a bad hack, but it seems to work. */ + /* */ + /* Confirmed by Greg Hitchcock. */ + + distance = exc->func_read_cvt( exc, cvtEntry ); + + if ( exc->GS.gep0 == 0 ) /* If in twilight zone */ + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + /* Only adjust if not in sph_compatibility_mode or ignore_x_mode. */ + /* Determined via experimentation and may be incorrect... */ + if ( !( SUBPIXEL_HINTING_INFINALITY && + ( exc->ignore_x_mode && + exc->face->sph_compatibility_mode ) ) ) +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + exc->zp0.org[point].x = TT_MulFix14( distance, + exc->GS.freeVector.x ); + exc->zp0.org[point].y = TT_MulFix14( distance, + exc->GS.freeVector.y ), + exc->zp0.cur[point] = exc->zp0.org[point]; + } +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + ( exc->sph_tweak_flags & SPH_TWEAK_MIAP_HACK ) && + distance > 0 && + exc->GS.freeVector.y != 0 ) + distance = 0; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + org_dist = FAST_PROJECT( &exc->zp0.cur[point] ); + + if ( ( exc->opcode & 1 ) != 0 ) /* rounding and control cut-in flag */ + { + FT_F26Dot6 delta; + + + delta = SUB_LONG( distance, org_dist ); + if ( delta < 0 ) + delta = NEG_LONG( delta ); + + if ( delta > control_value_cutin ) + distance = org_dist; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->GS.freeVector.x != 0 ) + distance = Round_None( exc, + distance, + exc->tt_metrics.compensations[0] ); + else +#endif + distance = exc->func_round( exc, + distance, + exc->tt_metrics.compensations[0] ); + } + + exc->func_move( exc, &exc->zp0, point, SUB_LONG( distance, org_dist ) ); + + Fail: + exc->GS.rp0 = point; + exc->GS.rp1 = point; + } + + + /*************************************************************************/ + /* */ + /* MDRP[abcde]: Move Direct Relative Point */ + /* Opcode range: 0xC0-0xDF */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_MDRP( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort point = 0; + FT_F26Dot6 org_dist, distance, minimum_distance; + + + minimum_distance = exc->GS.minimum_distance; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->GS.freeVector.x != 0 && + !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) + minimum_distance = 0; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, exc->zp1.n_points ) || + BOUNDS( exc->GS.rp0, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + /* XXX: Is there some undocumented feature while in the */ + /* twilight zone? */ + + /* XXX: UNDOCUMENTED: twilight zone special case */ + + if ( exc->GS.gep0 == 0 || exc->GS.gep1 == 0 ) + { + FT_Vector* vec1 = &exc->zp1.org[point]; + FT_Vector* vec2 = &exc->zp0.org[exc->GS.rp0]; + + + org_dist = DUALPROJ( vec1, vec2 ); + } + else + { + FT_Vector* vec1 = &exc->zp1.orus[point]; + FT_Vector* vec2 = &exc->zp0.orus[exc->GS.rp0]; + + + if ( exc->metrics.x_scale == exc->metrics.y_scale ) + { + /* this should be faster */ + org_dist = DUALPROJ( vec1, vec2 ); + org_dist = FT_MulFix( org_dist, exc->metrics.x_scale ); + } + else + { + FT_Vector vec; + + + vec.x = FT_MulFix( SUB_LONG( vec1->x, vec2->x ), + exc->metrics.x_scale ); + vec.y = FT_MulFix( SUB_LONG( vec1->y, vec2->y ), + exc->metrics.y_scale ); + + org_dist = FAST_DUALPROJ( &vec ); + } + } + + /* single width cut-in test */ + + /* |org_dist - single_width_value| < single_width_cutin */ + if ( exc->GS.single_width_cutin > 0 && + org_dist < exc->GS.single_width_value + + exc->GS.single_width_cutin && + org_dist > exc->GS.single_width_value - + exc->GS.single_width_cutin ) + { + if ( org_dist >= 0 ) + org_dist = exc->GS.single_width_value; + else + org_dist = -exc->GS.single_width_value; + } + + /* round flag */ + + if ( ( exc->opcode & 4 ) != 0 ) + { +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->GS.freeVector.x != 0 ) + distance = Round_None( + exc, + org_dist, + exc->tt_metrics.compensations[exc->opcode & 3] ); + else +#endif + distance = exc->func_round( + exc, + org_dist, + exc->tt_metrics.compensations[exc->opcode & 3] ); + } + else + distance = Round_None( + exc, + org_dist, + exc->tt_metrics.compensations[exc->opcode & 3] ); + + /* minimum distance flag */ + + if ( ( exc->opcode & 8 ) != 0 ) + { + if ( org_dist >= 0 ) + { + if ( distance < minimum_distance ) + distance = minimum_distance; + } + else + { + if ( distance > NEG_LONG( minimum_distance ) ) + distance = NEG_LONG( minimum_distance ); + } + } + + /* now move the point */ + + org_dist = PROJECT( exc->zp1.cur + point, exc->zp0.cur + exc->GS.rp0 ); + + exc->func_move( exc, &exc->zp1, point, SUB_LONG( distance, org_dist ) ); + + Fail: + exc->GS.rp1 = exc->GS.rp0; + exc->GS.rp2 = point; + + if ( ( exc->opcode & 16 ) != 0 ) + exc->GS.rp0 = point; + } + + + /*************************************************************************/ + /* */ + /* MIRP[abcde]: Move Indirect Relative Point */ + /* Opcode range: 0xE0-0xFF */ + /* Stack: int32? uint32 --> */ + /* */ + static void + Ins_MIRP( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort point; + FT_ULong cvtEntry; + + FT_F26Dot6 cvt_dist, + distance, + cur_dist, + org_dist, + control_value_cutin, + minimum_distance; +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + FT_Int B1 = 0; /* pacify compiler */ + FT_Int B2 = 0; + FT_Bool reverse_move = FALSE; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + + minimum_distance = exc->GS.minimum_distance; + control_value_cutin = exc->GS.control_value_cutin; + point = (FT_UShort)args[0]; + cvtEntry = (FT_ULong)( ADD_LONG( args[1], 1 ) ); + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->GS.freeVector.x != 0 && + !( exc->sph_tweak_flags & SPH_TWEAK_NORMAL_ROUND ) ) + control_value_cutin = minimum_distance = 0; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + /* XXX: UNDOCUMENTED! cvt[-1] = 0 always */ + + if ( BOUNDS( point, exc->zp1.n_points ) || + BOUNDSL( cvtEntry, exc->cvtSize + 1 ) || + BOUNDS( exc->GS.rp0, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + if ( !cvtEntry ) + cvt_dist = 0; + else + cvt_dist = exc->func_read_cvt( exc, cvtEntry - 1 ); + + /* single width test */ + + if ( FT_ABS( cvt_dist - exc->GS.single_width_value ) < + exc->GS.single_width_cutin ) + { + if ( cvt_dist >= 0 ) + cvt_dist = exc->GS.single_width_value; + else + cvt_dist = -exc->GS.single_width_value; + } + + /* UNDOCUMENTED! The MS rasterizer does that with */ + /* twilight points (confirmed by Greg Hitchcock) */ + if ( exc->GS.gep1 == 0 ) + { + exc->zp1.org[point].x = exc->zp0.org[exc->GS.rp0].x + + TT_MulFix14( cvt_dist, + exc->GS.freeVector.x ); + exc->zp1.org[point].y = exc->zp0.org[exc->GS.rp0].y + + TT_MulFix14( cvt_dist, + exc->GS.freeVector.y ); + exc->zp1.cur[point] = exc->zp1.org[point]; + } + + org_dist = DUALPROJ( &exc->zp1.org[point], &exc->zp0.org[exc->GS.rp0] ); + cur_dist = PROJECT ( &exc->zp1.cur[point], &exc->zp0.cur[exc->GS.rp0] ); + + /* auto-flip test */ + + if ( exc->GS.auto_flip ) + { + if ( ( org_dist ^ cvt_dist ) < 0 ) + cvt_dist = -cvt_dist; + } + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->GS.freeVector.y != 0 && + ( exc->sph_tweak_flags & SPH_TWEAK_TIMES_NEW_ROMAN_HACK ) ) + { + if ( cur_dist < -64 ) + cvt_dist -= 16; + else if ( cur_dist > 64 && cur_dist < 84 ) + cvt_dist += 32; + } +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + /* control value cut-in and round */ + + if ( ( exc->opcode & 4 ) != 0 ) + { + /* XXX: UNDOCUMENTED! Only perform cut-in test when both points */ + /* refer to the same zone. */ + + if ( exc->GS.gep0 == exc->GS.gep1 ) + { + FT_F26Dot6 delta; + + + /* XXX: According to Greg Hitchcock, the following wording is */ + /* the right one: */ + /* */ + /* When the absolute difference between the value in */ + /* the table [CVT] and the measurement directly from */ + /* the outline is _greater_ than the cut_in value, the */ + /* outline measurement is used. */ + /* */ + /* This is from `instgly.doc'. The description in */ + /* `ttinst2.doc', version 1.66, is thus incorrect since */ + /* it implies `>=' instead of `>'. */ + + delta = SUB_LONG( cvt_dist, org_dist ); + if ( delta < 0 ) + delta = NEG_LONG( delta ); + + if ( delta > control_value_cutin ) + cvt_dist = org_dist; + } + + distance = exc->func_round( + exc, + cvt_dist, + exc->tt_metrics.compensations[exc->opcode & 3] ); + } + else + { + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + /* do cvt cut-in always in MIRP for sph */ + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->GS.gep0 == exc->GS.gep1 ) + { + FT_F26Dot6 delta; + + + delta = SUB_LONG( cvt_dist, org_dist ); + if ( delta < 0 ) + delta = NEG_LONG( delta ); + + if ( delta > control_value_cutin ) + cvt_dist = org_dist; + } +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + distance = Round_None( + exc, + cvt_dist, + exc->tt_metrics.compensations[exc->opcode & 3] ); + } + + /* minimum distance test */ + + if ( ( exc->opcode & 8 ) != 0 ) + { + if ( org_dist >= 0 ) + { + if ( distance < minimum_distance ) + distance = minimum_distance; + } + else + { + if ( distance > NEG_LONG( minimum_distance ) ) + distance = NEG_LONG( minimum_distance ); + } + } + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY ) + { + B1 = exc->zp1.cur[point].y; + + /* Round moves if necessary */ + if ( exc->ignore_x_mode && + exc->GS.freeVector.y != 0 && + ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) ) + distance = FT_PIX_ROUND( B1 + distance - cur_dist ) - B1 + cur_dist; + + if ( exc->ignore_x_mode && + exc->GS.freeVector.y != 0 && + ( exc->opcode & 16 ) == 0 && + ( exc->opcode & 8 ) == 0 && + ( exc->sph_tweak_flags & SPH_TWEAK_COURIER_NEW_2_HACK ) ) + distance += 64; + } +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + exc->func_move( exc, + &exc->zp1, + point, + SUB_LONG( distance, cur_dist ) ); + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY ) + { + B2 = exc->zp1.cur[point].y; + + /* Reverse move if necessary */ + if ( exc->ignore_x_mode ) + { + if ( exc->face->sph_compatibility_mode && + exc->GS.freeVector.y != 0 && + ( B1 & 63 ) == 0 && + ( B2 & 63 ) != 0 ) + reverse_move = TRUE; + + if ( ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES ) && + exc->GS.freeVector.y != 0 && + ( B2 & 63 ) != 0 && + ( B1 & 63 ) != 0 ) + reverse_move = TRUE; + } + + if ( reverse_move ) + exc->func_move( exc, + &exc->zp1, + point, + SUB_LONG( cur_dist, distance ) ); + } + +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + Fail: + exc->GS.rp1 = exc->GS.rp0; + + if ( ( exc->opcode & 16 ) != 0 ) + exc->GS.rp0 = point; + + exc->GS.rp2 = point; + } + + + /*************************************************************************/ + /* */ + /* ALIGNRP[]: ALIGN Relative Point */ + /* Opcode range: 0x3C */ + /* Stack: uint32 uint32... --> */ + /* */ + static void + Ins_ALIGNRP( TT_ExecContext exc ) + { + FT_UShort point; + FT_F26Dot6 distance; + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->iup_called && + ( exc->sph_tweak_flags & SPH_TWEAK_NO_ALIGNRP_AFTER_IUP ) ) + { + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + if ( exc->top < exc->GS.loop || + BOUNDS( exc->GS.rp0, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + while ( exc->GS.loop > 0 ) + { + exc->args--; + + point = (FT_UShort)exc->stack[exc->args]; + + if ( BOUNDS( point, exc->zp1.n_points ) ) + { + if ( exc->pedantic_hinting ) + { + exc->error = FT_THROW( Invalid_Reference ); + return; + } + } + else + { + distance = PROJECT( exc->zp1.cur + point, + exc->zp0.cur + exc->GS.rp0 ); + + exc->func_move( exc, &exc->zp1, point, NEG_LONG( distance ) ); + } + + exc->GS.loop--; + } + + Fail: + exc->GS.loop = 1; + exc->new_top = exc->args; + } + + + /*************************************************************************/ + /* */ + /* ISECT[]: moves point to InterSECTion */ + /* Opcode range: 0x0F */ + /* Stack: 5 * uint32 --> */ + /* */ + static void + Ins_ISECT( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort point, + a0, a1, + b0, b1; + + FT_F26Dot6 discriminant, dotproduct; + + FT_F26Dot6 dx, dy, + dax, day, + dbx, dby; + + FT_F26Dot6 val; + + FT_Vector R; + + + point = (FT_UShort)args[0]; + + a0 = (FT_UShort)args[1]; + a1 = (FT_UShort)args[2]; + b0 = (FT_UShort)args[3]; + b1 = (FT_UShort)args[4]; + + if ( BOUNDS( b0, exc->zp0.n_points ) || + BOUNDS( b1, exc->zp0.n_points ) || + BOUNDS( a0, exc->zp1.n_points ) || + BOUNDS( a1, exc->zp1.n_points ) || + BOUNDS( point, exc->zp2.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + /* Cramer's rule */ + + dbx = SUB_LONG( exc->zp0.cur[b1].x, exc->zp0.cur[b0].x ); + dby = SUB_LONG( exc->zp0.cur[b1].y, exc->zp0.cur[b0].y ); + + dax = SUB_LONG( exc->zp1.cur[a1].x, exc->zp1.cur[a0].x ); + day = SUB_LONG( exc->zp1.cur[a1].y, exc->zp1.cur[a0].y ); + + dx = SUB_LONG( exc->zp0.cur[b0].x, exc->zp1.cur[a0].x ); + dy = SUB_LONG( exc->zp0.cur[b0].y, exc->zp1.cur[a0].y ); + + discriminant = ADD_LONG( FT_MulDiv( dax, NEG_LONG( dby ), 0x40 ), + FT_MulDiv( day, dbx, 0x40 ) ); + dotproduct = ADD_LONG( FT_MulDiv( dax, dbx, 0x40 ), + FT_MulDiv( day, dby, 0x40 ) ); + + /* The discriminant above is actually a cross product of vectors */ + /* da and db. Together with the dot product, they can be used as */ + /* surrogates for sine and cosine of the angle between the vectors. */ + /* Indeed, */ + /* dotproduct = |da||db|cos(angle) */ + /* discriminant = |da||db|sin(angle) . */ + /* We use these equations to reject grazing intersections by */ + /* thresholding abs(tan(angle)) at 1/19, corresponding to 3 degrees. */ + if ( MUL_LONG( 19, FT_ABS( discriminant ) ) > FT_ABS( dotproduct ) ) + { + val = ADD_LONG( FT_MulDiv( dx, NEG_LONG( dby ), 0x40 ), + FT_MulDiv( dy, dbx, 0x40 ) ); + + R.x = FT_MulDiv( val, dax, discriminant ); + R.y = FT_MulDiv( val, day, discriminant ); + + /* XXX: Block in backward_compatibility and/or post-IUP? */ + exc->zp2.cur[point].x = ADD_LONG( exc->zp1.cur[a0].x, R.x ); + exc->zp2.cur[point].y = ADD_LONG( exc->zp1.cur[a0].y, R.y ); + } + else + { + /* else, take the middle of the middles of A and B */ + + /* XXX: Block in backward_compatibility and/or post-IUP? */ + exc->zp2.cur[point].x = + ADD_LONG( ADD_LONG( exc->zp1.cur[a0].x, exc->zp1.cur[a1].x ), + ADD_LONG( exc->zp0.cur[b0].x, exc->zp0.cur[b1].x ) ) / 4; + exc->zp2.cur[point].y = + ADD_LONG( ADD_LONG( exc->zp1.cur[a0].y, exc->zp1.cur[a1].y ), + ADD_LONG( exc->zp0.cur[b0].y, exc->zp0.cur[b1].y ) ) / 4; + } + + exc->zp2.tags[point] |= FT_CURVE_TAG_TOUCH_BOTH; + } + + + /*************************************************************************/ + /* */ + /* ALIGNPTS[]: ALIGN PoinTS */ + /* Opcode range: 0x27 */ + /* Stack: uint32 uint32 --> */ + /* */ + static void + Ins_ALIGNPTS( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort p1, p2; + FT_F26Dot6 distance; + + + p1 = (FT_UShort)args[0]; + p2 = (FT_UShort)args[1]; + + if ( BOUNDS( p1, exc->zp1.n_points ) || + BOUNDS( p2, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + distance = PROJECT( exc->zp0.cur + p2, exc->zp1.cur + p1 ) / 2; + + exc->func_move( exc, &exc->zp1, p1, distance ); + exc->func_move( exc, &exc->zp0, p2, NEG_LONG( distance ) ); + } + + + /*************************************************************************/ + /* */ + /* IP[]: Interpolate Point */ + /* Opcode range: 0x39 */ + /* Stack: uint32... --> */ + /* */ + + /* SOMETIMES, DUMBER CODE IS BETTER CODE */ + + static void + Ins_IP( TT_ExecContext exc ) + { + FT_F26Dot6 old_range, cur_range; + FT_Vector* orus_base; + FT_Vector* cur_base; + FT_Int twilight; + + + if ( exc->top < exc->GS.loop ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + /* + * We need to deal in a special way with the twilight zone. + * Otherwise, by definition, the value of exc->twilight.orus[n] is (0,0), + * for every n. + */ + twilight = ( exc->GS.gep0 == 0 || + exc->GS.gep1 == 0 || + exc->GS.gep2 == 0 ); + + if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + goto Fail; + } + + if ( twilight ) + orus_base = &exc->zp0.org[exc->GS.rp1]; + else + orus_base = &exc->zp0.orus[exc->GS.rp1]; + + cur_base = &exc->zp0.cur[exc->GS.rp1]; + + /* XXX: There are some glyphs in some braindead but popular */ + /* fonts out there (e.g. [aeu]grave in monotype.ttf) */ + /* calling IP[] with bad values of rp[12]. */ + /* Do something sane when this odd thing happens. */ + if ( BOUNDS( exc->GS.rp1, exc->zp0.n_points ) || + BOUNDS( exc->GS.rp2, exc->zp1.n_points ) ) + { + old_range = 0; + cur_range = 0; + } + else + { + if ( twilight ) + old_range = DUALPROJ( &exc->zp1.org[exc->GS.rp2], orus_base ); + else if ( exc->metrics.x_scale == exc->metrics.y_scale ) + old_range = DUALPROJ( &exc->zp1.orus[exc->GS.rp2], orus_base ); + else + { + FT_Vector vec; + + + vec.x = FT_MulFix( SUB_LONG( exc->zp1.orus[exc->GS.rp2].x, + orus_base->x ), + exc->metrics.x_scale ); + vec.y = FT_MulFix( SUB_LONG( exc->zp1.orus[exc->GS.rp2].y, + orus_base->y ), + exc->metrics.y_scale ); + + old_range = FAST_DUALPROJ( &vec ); + } + + cur_range = PROJECT( &exc->zp1.cur[exc->GS.rp2], cur_base ); + } + + for ( ; exc->GS.loop > 0; exc->GS.loop-- ) + { + FT_UInt point = (FT_UInt)exc->stack[--exc->args]; + FT_F26Dot6 org_dist, cur_dist, new_dist; + + + /* check point bounds */ + if ( BOUNDS( point, exc->zp2.n_points ) ) + { + if ( exc->pedantic_hinting ) + { + exc->error = FT_THROW( Invalid_Reference ); + return; + } + continue; + } + + if ( twilight ) + org_dist = DUALPROJ( &exc->zp2.org[point], orus_base ); + else if ( exc->metrics.x_scale == exc->metrics.y_scale ) + org_dist = DUALPROJ( &exc->zp2.orus[point], orus_base ); + else + { + FT_Vector vec; + + + vec.x = FT_MulFix( SUB_LONG( exc->zp2.orus[point].x, + orus_base->x ), + exc->metrics.x_scale ); + vec.y = FT_MulFix( SUB_LONG( exc->zp2.orus[point].y, + orus_base->y ), + exc->metrics.y_scale ); + + org_dist = FAST_DUALPROJ( &vec ); + } + + cur_dist = PROJECT( &exc->zp2.cur[point], cur_base ); + + if ( org_dist ) + { + if ( old_range ) + new_dist = FT_MulDiv( org_dist, cur_range, old_range ); + else + { + /* This is the same as what MS does for the invalid case: */ + /* */ + /* delta = (Original_Pt - Original_RP1) - */ + /* (Current_Pt - Current_RP1) ; */ + /* */ + /* In FreeType speak: */ + /* */ + /* delta = org_dist - cur_dist . */ + /* */ + /* We move `point' by `new_dist - cur_dist' after leaving */ + /* this block, thus we have */ + /* */ + /* new_dist - cur_dist = delta , */ + /* new_dist - cur_dist = org_dist - cur_dist , */ + /* new_dist = org_dist . */ + + new_dist = org_dist; + } + } + else + new_dist = 0; + + exc->func_move( exc, + &exc->zp2, + (FT_UShort)point, + SUB_LONG( new_dist, cur_dist ) ); + } + + Fail: + exc->GS.loop = 1; + exc->new_top = exc->args; + } + + + /*************************************************************************/ + /* */ + /* UTP[a]: UnTouch Point */ + /* Opcode range: 0x29 */ + /* Stack: uint32 --> */ + /* */ + static void + Ins_UTP( TT_ExecContext exc, + FT_Long* args ) + { + FT_UShort point; + FT_Byte mask; + + + point = (FT_UShort)args[0]; + + if ( BOUNDS( point, exc->zp0.n_points ) ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + return; + } + + mask = 0xFF; + + if ( exc->GS.freeVector.x != 0 ) + mask &= ~FT_CURVE_TAG_TOUCH_X; + + if ( exc->GS.freeVector.y != 0 ) + mask &= ~FT_CURVE_TAG_TOUCH_Y; + + exc->zp0.tags[point] &= mask; + } + + + /* Local variables for Ins_IUP: */ + typedef struct IUP_WorkerRec_ + { + FT_Vector* orgs; /* original and current coordinate */ + FT_Vector* curs; /* arrays */ + FT_Vector* orus; + FT_UInt max_points; + + } IUP_WorkerRec, *IUP_Worker; + + + static void + _iup_worker_shift( IUP_Worker worker, + FT_UInt p1, + FT_UInt p2, + FT_UInt p ) + { + FT_UInt i; + FT_F26Dot6 dx; + + + dx = SUB_LONG( worker->curs[p].x, worker->orgs[p].x ); + if ( dx != 0 ) + { + for ( i = p1; i < p; i++ ) + worker->curs[i].x = ADD_LONG( worker->curs[i].x, dx ); + + for ( i = p + 1; i <= p2; i++ ) + worker->curs[i].x = ADD_LONG( worker->curs[i].x, dx ); + } + } + + + static void + _iup_worker_interpolate( IUP_Worker worker, + FT_UInt p1, + FT_UInt p2, + FT_UInt ref1, + FT_UInt ref2 ) + { + FT_UInt i; + FT_F26Dot6 orus1, orus2, org1, org2, cur1, cur2, delta1, delta2; + + + if ( p1 > p2 ) + return; + + if ( BOUNDS( ref1, worker->max_points ) || + BOUNDS( ref2, worker->max_points ) ) + return; + + orus1 = worker->orus[ref1].x; + orus2 = worker->orus[ref2].x; + + if ( orus1 > orus2 ) + { + FT_F26Dot6 tmp_o; + FT_UInt tmp_r; + + + tmp_o = orus1; + orus1 = orus2; + orus2 = tmp_o; + + tmp_r = ref1; + ref1 = ref2; + ref2 = tmp_r; + } + + org1 = worker->orgs[ref1].x; + org2 = worker->orgs[ref2].x; + cur1 = worker->curs[ref1].x; + cur2 = worker->curs[ref2].x; + delta1 = SUB_LONG( cur1, org1 ); + delta2 = SUB_LONG( cur2, org2 ); + + if ( cur1 == cur2 || orus1 == orus2 ) + { + + /* trivial snap or shift of untouched points */ + for ( i = p1; i <= p2; i++ ) + { + FT_F26Dot6 x = worker->orgs[i].x; + + + if ( x <= org1 ) + x = ADD_LONG( x, delta1 ); + + else if ( x >= org2 ) + x = ADD_LONG( x, delta2 ); + + else + x = cur1; + + worker->curs[i].x = x; + } + } + else + { + FT_Fixed scale = 0; + FT_Bool scale_valid = 0; + + + /* interpolation */ + for ( i = p1; i <= p2; i++ ) + { + FT_F26Dot6 x = worker->orgs[i].x; + + + if ( x <= org1 ) + x = ADD_LONG( x, delta1 ); + + else if ( x >= org2 ) + x = ADD_LONG( x, delta2 ); + + else + { + if ( !scale_valid ) + { + scale_valid = 1; + scale = FT_DivFix( SUB_LONG( cur2, cur1 ), + SUB_LONG( orus2, orus1 ) ); + } + + x = ADD_LONG( cur1, + FT_MulFix( SUB_LONG( worker->orus[i].x, orus1 ), + scale ) ); + } + worker->curs[i].x = x; + } + } + } + + + /*************************************************************************/ + /* */ + /* IUP[a]: Interpolate Untouched Points */ + /* Opcode range: 0x30-0x31 */ + /* Stack: --> */ + /* */ + static void + Ins_IUP( TT_ExecContext exc ) + { + IUP_WorkerRec V; + FT_Byte mask; + + FT_UInt first_point; /* first point of contour */ + FT_UInt end_point; /* end point (last+1) of contour */ + + FT_UInt first_touched; /* first touched point in contour */ + FT_UInt cur_touched; /* current touched point in contour */ + + FT_UInt point; /* current point */ + FT_Short contour; /* current contour */ + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* See `ttinterp.h' for details on backward compatibility mode. */ + /* Allow IUP until it has been called on both axes. Immediately */ + /* return on subsequent ones. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility ) + { + if ( exc->iupx_called && exc->iupy_called ) + return; + + if ( exc->opcode & 1 ) + exc->iupx_called = TRUE; + else + exc->iupy_called = TRUE; + } +#endif + + /* ignore empty outlines */ + if ( exc->pts.n_contours == 0 ) + return; + + if ( exc->opcode & 1 ) + { + mask = FT_CURVE_TAG_TOUCH_X; + V.orgs = exc->pts.org; + V.curs = exc->pts.cur; + V.orus = exc->pts.orus; + } + else + { + mask = FT_CURVE_TAG_TOUCH_Y; + V.orgs = (FT_Vector*)( (FT_Pos*)exc->pts.org + 1 ); + V.curs = (FT_Vector*)( (FT_Pos*)exc->pts.cur + 1 ); + V.orus = (FT_Vector*)( (FT_Pos*)exc->pts.orus + 1 ); + } + V.max_points = exc->pts.n_points; + + contour = 0; + point = 0; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode ) + { + exc->iup_called = TRUE; + if ( exc->sph_tweak_flags & SPH_TWEAK_SKIP_IUP ) + return; + } +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + do + { + end_point = exc->pts.contours[contour] - exc->pts.first_point; + first_point = point; + + if ( BOUNDS( end_point, exc->pts.n_points ) ) + end_point = exc->pts.n_points - 1; + + while ( point <= end_point && ( exc->pts.tags[point] & mask ) == 0 ) + point++; + + if ( point <= end_point ) + { + first_touched = point; + cur_touched = point; + + point++; + + while ( point <= end_point ) + { + if ( ( exc->pts.tags[point] & mask ) != 0 ) + { + _iup_worker_interpolate( &V, + cur_touched + 1, + point - 1, + cur_touched, + point ); + cur_touched = point; + } + + point++; + } + + if ( cur_touched == first_touched ) + _iup_worker_shift( &V, first_point, end_point, cur_touched ); + else + { + _iup_worker_interpolate( &V, + (FT_UShort)( cur_touched + 1 ), + end_point, + cur_touched, + first_touched ); + + if ( first_touched > 0 ) + _iup_worker_interpolate( &V, + first_point, + first_touched - 1, + cur_touched, + first_touched ); + } + } + contour++; + } while ( contour < exc->pts.n_contours ); + } + + + /*************************************************************************/ + /* */ + /* DELTAPn[]: DELTA exceptions P1, P2, P3 */ + /* Opcode range: 0x5D,0x71,0x72 */ + /* Stack: uint32 (2 * uint32)... --> */ + /* */ + static void + Ins_DELTAP( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong nump, k; + FT_UShort A; + FT_ULong C, P; + FT_Long B; +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + FT_UShort B1, B2; + + + if ( SUBPIXEL_HINTING_INFINALITY && + exc->ignore_x_mode && + exc->iup_called && + ( exc->sph_tweak_flags & SPH_TWEAK_NO_DELTAP_AFTER_IUP ) ) + goto Fail; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + P = (FT_ULong)exc->func_cur_ppem( exc ); + nump = (FT_ULong)args[0]; /* some points theoretically may occur more + than once, thus UShort isn't enough */ + + for ( k = 1; k <= nump; k++ ) + { + if ( exc->args < 2 ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Too_Few_Arguments ); + exc->args = 0; + goto Fail; + } + + exc->args -= 2; + + A = (FT_UShort)exc->stack[exc->args + 1]; + B = exc->stack[exc->args]; + + /* XXX: Because some popular fonts contain some invalid DeltaP */ + /* instructions, we simply ignore them when the stacked */ + /* point reference is off limit, rather than returning an */ + /* error. As a delta instruction doesn't change a glyph */ + /* in great ways, this shouldn't be a problem. */ + + if ( !BOUNDS( A, exc->zp0.n_points ) ) + { + C = ( (FT_ULong)B & 0xF0 ) >> 4; + + switch ( exc->opcode ) + { + case 0x5D: + break; + + case 0x71: + C += 16; + break; + + case 0x72: + C += 32; + break; + } + + C += exc->GS.delta_base; + + if ( P == C ) + { + B = ( (FT_ULong)B & 0xF ) - 8; + if ( B >= 0 ) + B++; + B *= 1L << ( 6 - exc->GS.delta_shift ); + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + + if ( SUBPIXEL_HINTING_INFINALITY ) + { + /* + * Allow delta move if + * + * - not using ignore_x_mode rendering, + * - glyph is specifically set to allow it, or + * - glyph is composite and freedom vector is not in subpixel + * direction. + */ + if ( !exc->ignore_x_mode || + ( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_DO_DELTAP ) || + ( exc->is_composite && exc->GS.freeVector.y != 0 ) ) + exc->func_move( exc, &exc->zp0, A, B ); + + /* Otherwise, apply subpixel hinting and compatibility mode */ + /* rules, always skipping deltas in subpixel direction. */ + else if ( exc->ignore_x_mode && exc->GS.freeVector.y != 0 ) + { + /* save the y value of the point now; compare after move */ + B1 = (FT_UShort)exc->zp0.cur[A].y; + + /* Standard subpixel hinting: Allow y move for y-touched */ + /* points. This messes up DejaVu ... */ + if ( !exc->face->sph_compatibility_mode && + ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) ) + exc->func_move( exc, &exc->zp0, A, B ); + + /* compatibility mode */ + else if ( exc->face->sph_compatibility_mode && + !( exc->sph_tweak_flags & SPH_TWEAK_ALWAYS_SKIP_DELTAP ) ) + { + if ( exc->sph_tweak_flags & SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES ) + B = FT_PIX_ROUND( B1 + B ) - B1; + + /* Allow delta move if using sph_compatibility_mode, */ + /* IUP has not been called, and point is touched on Y. */ + if ( !exc->iup_called && + ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) ) + exc->func_move( exc, &exc->zp0, A, B ); + } + + B2 = (FT_UShort)exc->zp0.cur[A].y; + + /* Reverse this move if it results in a disallowed move */ + if ( exc->GS.freeVector.y != 0 && + ( ( exc->face->sph_compatibility_mode && + ( B1 & 63 ) == 0 && + ( B2 & 63 ) != 0 ) || + ( ( exc->sph_tweak_flags & + SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP ) && + ( B1 & 63 ) != 0 && + ( B2 & 63 ) != 0 ) ) ) + exc->func_move( exc, &exc->zp0, A, NEG_LONG( B ) ); + } + } + else +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + { + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* See `ttinterp.h' for details on backward compatibility */ + /* mode. */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->backward_compatibility ) + { + if ( !( exc->iupx_called && exc->iupy_called ) && + ( ( exc->is_composite && exc->GS.freeVector.y != 0 ) || + ( exc->zp0.tags[A] & FT_CURVE_TAG_TOUCH_Y ) ) ) + exc->func_move( exc, &exc->zp0, A, B ); + } + else +#endif + exc->func_move( exc, &exc->zp0, A, B ); + } + } + } + else + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Invalid_Reference ); + } + + Fail: + exc->new_top = exc->args; + } + + + /*************************************************************************/ + /* */ + /* DELTACn[]: DELTA exceptions C1, C2, C3 */ + /* Opcode range: 0x73,0x74,0x75 */ + /* Stack: uint32 (2 * uint32)... --> */ + /* */ + static void + Ins_DELTAC( TT_ExecContext exc, + FT_Long* args ) + { + FT_ULong nump, k; + FT_ULong A, C, P; + FT_Long B; + + + P = (FT_ULong)exc->func_cur_ppem( exc ); + nump = (FT_ULong)args[0]; + + for ( k = 1; k <= nump; k++ ) + { + if ( exc->args < 2 ) + { + if ( exc->pedantic_hinting ) + exc->error = FT_THROW( Too_Few_Arguments ); + exc->args = 0; + goto Fail; + } + + exc->args -= 2; + + A = (FT_ULong)exc->stack[exc->args + 1]; + B = exc->stack[exc->args]; + + if ( BOUNDSL( A, exc->cvtSize ) ) + { + if ( exc->pedantic_hinting ) + { + exc->error = FT_THROW( Invalid_Reference ); + return; + } + } + else + { + C = ( (FT_ULong)B & 0xF0 ) >> 4; + + switch ( exc->opcode ) + { + case 0x73: + break; + + case 0x74: + C += 16; + break; + + case 0x75: + C += 32; + break; + } + + C += exc->GS.delta_base; + + if ( P == C ) + { + B = ( (FT_ULong)B & 0xF ) - 8; + if ( B >= 0 ) + B++; + B *= 1L << ( 6 - exc->GS.delta_shift ); + + exc->func_move_cvt( exc, A, B ); + } + } + } + + Fail: + exc->new_top = exc->args; + } + + + /*************************************************************************/ + /* */ + /* MISC. INSTRUCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* GETINFO[]: GET INFOrmation */ + /* Opcode range: 0x88 */ + /* Stack: uint32 --> uint32 */ + /* */ + /* XXX: UNDOCUMENTED: Selector bits higher than 9 are currently (May */ + /* 2015) not documented in the OpenType specification. */ + /* */ + /* Selector bit 11 is incorrectly described as bit 8, while the */ + /* real meaning of bit 8 (vertical LCD subpixels) stays */ + /* undocumented. The same mistake can be found in Greg Hitchcock's */ + /* whitepaper. */ + /* */ + static void + Ins_GETINFO( TT_ExecContext exc, + FT_Long* args ) + { + FT_Long K; + TT_Driver driver = (TT_Driver)FT_FACE_DRIVER( exc->face ); + + + K = 0; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + /********************************/ + /* RASTERIZER VERSION */ + /* Selector Bit: 0 */ + /* Return Bit(s): 0-7 */ + /* */ + if ( SUBPIXEL_HINTING_INFINALITY && + ( args[0] & 1 ) != 0 && + exc->subpixel_hinting ) + { + if ( exc->ignore_x_mode ) + { + /* if in ClearType backward compatibility mode, */ + /* we sometimes change the TrueType version dynamically */ + K = exc->rasterizer_version; + FT_TRACE6(( "Setting rasterizer version %d\n", + exc->rasterizer_version )); + } + else + K = TT_INTERPRETER_VERSION_38; + } + else +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + if ( ( args[0] & 1 ) != 0 ) + K = driver->interpreter_version; + + /********************************/ + /* GLYPH ROTATED */ + /* Selector Bit: 1 */ + /* Return Bit(s): 8 */ + /* */ + if ( ( args[0] & 2 ) != 0 && exc->tt_metrics.rotated ) + K |= 1 << 8; + + /********************************/ + /* GLYPH STRETCHED */ + /* Selector Bit: 2 */ + /* Return Bit(s): 9 */ + /* */ + if ( ( args[0] & 4 ) != 0 && exc->tt_metrics.stretched ) + K |= 1 << 9; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + /********************************/ + /* VARIATION GLYPH */ + /* Selector Bit: 3 */ + /* Return Bit(s): 10 */ + /* */ + /* XXX: UNDOCUMENTED! */ + if ( (args[0] & 8 ) != 0 && exc->face->blend ) + K |= 1 << 10; +#endif + + /********************************/ + /* BI-LEVEL HINTING AND */ + /* GRAYSCALE RENDERING */ + /* Selector Bit: 5 */ + /* Return Bit(s): 12 */ + /* */ + if ( ( args[0] & 32 ) != 0 && exc->grayscale ) + K |= 1 << 12; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* Toggle the following flags only outside of monochrome mode. */ + /* Otherwise, instructions may behave weirdly and rendering results */ + /* may differ between v35 and v40 mode, e.g., in `Times New Roman */ + /* Bold Italic'. */ + if ( SUBPIXEL_HINTING_MINIMAL && exc->subpixel_hinting_lean ) + { + /********************************/ + /* HINTING FOR SUBPIXEL */ + /* Selector Bit: 6 */ + /* Return Bit(s): 13 */ + /* */ + /* v40 does subpixel hinting by default. */ + if ( ( args[0] & 64 ) != 0 ) + K |= 1 << 13; + + /********************************/ + /* VERTICAL LCD SUBPIXELS? */ + /* Selector Bit: 8 */ + /* Return Bit(s): 15 */ + /* */ + if ( ( args[0] & 256 ) != 0 && exc->vertical_lcd_lean ) + K |= 1 << 15; + + /********************************/ + /* SUBPIXEL POSITIONED? */ + /* Selector Bit: 10 */ + /* Return Bit(s): 17 */ + /* */ + /* XXX: FreeType supports it, dependent on what client does? */ + if ( ( args[0] & 1024 ) != 0 ) + K |= 1 << 17; + + /********************************/ + /* SYMMETRICAL SMOOTHING */ + /* Selector Bit: 11 */ + /* Return Bit(s): 18 */ + /* */ + /* The only smoothing method FreeType supports unless someone sets */ + /* FT_LOAD_TARGET_MONO. */ + if ( ( args[0] & 2048 ) != 0 && exc->subpixel_hinting_lean ) + K |= 1 << 18; + + /********************************/ + /* CLEARTYPE HINTING AND */ + /* GRAYSCALE RENDERING */ + /* Selector Bit: 12 */ + /* Return Bit(s): 19 */ + /* */ + /* Grayscale rendering is what FreeType does anyway unless someone */ + /* sets FT_LOAD_TARGET_MONO or FT_LOAD_TARGET_LCD(_V) */ + if ( ( args[0] & 4096 ) != 0 && exc->grayscale_cleartype ) + K |= 1 << 19; + } +#endif + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + + if ( SUBPIXEL_HINTING_INFINALITY && + exc->rasterizer_version >= TT_INTERPRETER_VERSION_35 ) + { + + if ( exc->rasterizer_version >= 37 ) + { + /********************************/ + /* HINTING FOR SUBPIXEL */ + /* Selector Bit: 6 */ + /* Return Bit(s): 13 */ + /* */ + if ( ( args[0] & 64 ) != 0 && exc->subpixel_hinting ) + K |= 1 << 13; + + /********************************/ + /* COMPATIBLE WIDTHS ENABLED */ + /* Selector Bit: 7 */ + /* Return Bit(s): 14 */ + /* */ + /* Functionality still needs to be added */ + if ( ( args[0] & 128 ) != 0 && exc->compatible_widths ) + K |= 1 << 14; + + /********************************/ + /* VERTICAL LCD SUBPIXELS? */ + /* Selector Bit: 8 */ + /* Return Bit(s): 15 */ + /* */ + /* Functionality still needs to be added */ + if ( ( args[0] & 256 ) != 0 && exc->vertical_lcd ) + K |= 1 << 15; + + /********************************/ + /* HINTING FOR BGR? */ + /* Selector Bit: 9 */ + /* Return Bit(s): 16 */ + /* */ + /* Functionality still needs to be added */ + if ( ( args[0] & 512 ) != 0 && exc->bgr ) + K |= 1 << 16; + + if ( exc->rasterizer_version >= 38 ) + { + /********************************/ + /* SUBPIXEL POSITIONED? */ + /* Selector Bit: 10 */ + /* Return Bit(s): 17 */ + /* */ + /* Functionality still needs to be added */ + if ( ( args[0] & 1024 ) != 0 && exc->subpixel_positioned ) + K |= 1 << 17; + + /********************************/ + /* SYMMETRICAL SMOOTHING */ + /* Selector Bit: 11 */ + /* Return Bit(s): 18 */ + /* */ + /* Functionality still needs to be added */ + if ( ( args[0] & 2048 ) != 0 && exc->symmetrical_smoothing ) + K |= 1 << 18; + + /********************************/ + /* GRAY CLEARTYPE */ + /* Selector Bit: 12 */ + /* Return Bit(s): 19 */ + /* */ + /* Functionality still needs to be added */ + if ( ( args[0] & 4096 ) != 0 && exc->gray_cleartype ) + K |= 1 << 19; + } + } + } + +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + args[0] = K; + } + + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + /*************************************************************************/ + /* */ + /* GETVARIATION[]: get normalized variation (blend) coordinates */ + /* Opcode range: 0x91 */ + /* Stack: --> f2.14... */ + /* */ + /* XXX: UNDOCUMENTED! There is no official documentation from Apple for */ + /* this bytecode instruction. Active only if a font has GX */ + /* variation axes. */ + /* */ + static void + Ins_GETVARIATION( TT_ExecContext exc, + FT_Long* args ) + { + FT_UInt num_axes = exc->face->blend->num_axis; + FT_Fixed* coords = exc->face->blend->normalizedcoords; + + FT_UInt i; + + + if ( BOUNDS( num_axes, exc->stackSize + 1 - exc->top ) ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + if ( coords ) + { + for ( i = 0; i < num_axes; i++ ) + args[i] = coords[i] >> 2; /* convert 16.16 to 2.14 format */ + } + else + { + for ( i = 0; i < num_axes; i++ ) + args[i] = 0; + } + } + + + /*************************************************************************/ + /* */ + /* GETDATA[]: no idea what this is good for */ + /* Opcode range: 0x92 */ + /* Stack: --> 17 */ + /* */ + /* XXX: UNDOCUMENTED! There is no documentation from Apple for this */ + /* very weird bytecode instruction. */ + /* */ + static void + Ins_GETDATA( FT_Long* args ) + { + args[0] = 17; + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + + static void + Ins_UNKNOWN( TT_ExecContext exc ) + { + TT_DefRecord* def = exc->IDefs; + TT_DefRecord* limit = def + exc->numIDefs; + + + for ( ; def < limit; def++ ) + { + if ( (FT_Byte)def->opc == exc->opcode && def->active ) + { + TT_CallRec* call; + + + if ( exc->callTop >= exc->callSize ) + { + exc->error = FT_THROW( Stack_Overflow ); + return; + } + + call = exc->callStack + exc->callTop++; + + call->Caller_Range = exc->curRange; + call->Caller_IP = exc->IP + 1; + call->Cur_Count = 1; + call->Def = def; + + Ins_Goto_CodeRange( exc, def->range, def->start ); + + exc->step_ins = FALSE; + return; + } + } + + exc->error = FT_THROW( Invalid_Opcode ); + } + + + /*************************************************************************/ + /* */ + /* RUN */ + /* */ + /* This function executes a run of opcodes. It will exit in the */ + /* following cases: */ + /* */ + /* - Errors (in which case it returns FALSE). */ + /* */ + /* - Reaching the end of the main code range (returns TRUE). */ + /* Reaching the end of a code range within a function call is an */ + /* error. */ + /* */ + /* - After executing one single opcode, if the flag `Instruction_Trap' */ + /* is set to TRUE (returns TRUE). */ + /* */ + /* On exit with TRUE, test IP < CodeSize to know whether it comes from */ + /* an instruction trap or a normal termination. */ + /* */ + /* */ + /* Note: The documented DEBUG opcode pops a value from the stack. This */ + /* behaviour is unsupported; here a DEBUG opcode is always an */ + /* error. */ + /* */ + /* */ + /* THIS IS THE INTERPRETER'S MAIN LOOP. */ + /* */ + /*************************************************************************/ + + + /* documentation is in ttinterp.h */ + + FT_EXPORT_DEF( FT_Error ) + TT_RunIns( TT_ExecContext exc ) + { + FT_ULong ins_counter = 0; /* executed instructions counter */ + FT_ULong num_twilight_points; + FT_UShort i; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + FT_Byte opcode_pattern[1][2] = { + /* #8 TypeMan Talk Align */ + { + 0x06, /* SPVTL */ + 0x7D, /* RDTG */ + }, + }; + FT_UShort opcode_patterns = 1; + FT_UShort opcode_pointer[1] = { 0 }; + FT_UShort opcode_size[1] = { 1 }; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + exc->iup_called = FALSE; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* + * Toggle backward compatibility according to what font wants, except + * when + * + * 1) we have a `tricky' font that heavily relies on the interpreter to + * render glyphs correctly, for example DFKai-SB, or + * 2) FT_RENDER_MODE_MONO (i.e, monochome rendering) is requested. + * + * In those cases, backward compatibility needs to be turned off to get + * correct rendering. The rendering is then completely up to the + * font's programming. + * + */ + if ( SUBPIXEL_HINTING_MINIMAL && + exc->subpixel_hinting_lean && + !FT_IS_TRICKY( &exc->face->root ) ) + exc->backward_compatibility = !( exc->GS.instruct_control & 4 ); + else + exc->backward_compatibility = FALSE; + + exc->iupx_called = FALSE; + exc->iupy_called = FALSE; +#endif + + /* We restrict the number of twilight points to a reasonable, */ + /* heuristic value to avoid slow execution of malformed bytecode. */ + num_twilight_points = FT_MAX( 30, + 2 * ( exc->pts.n_points + exc->cvtSize ) ); + if ( exc->twilight.n_points > num_twilight_points ) + { + if ( num_twilight_points > 0xFFFFU ) + num_twilight_points = 0xFFFFU; + + FT_TRACE5(( "TT_RunIns: Resetting number of twilight points\n" + " from %d to the more reasonable value %d\n", + exc->twilight.n_points, + num_twilight_points )); + exc->twilight.n_points = (FT_UShort)num_twilight_points; + } + + /* Set up loop detectors. We restrict the number of LOOPCALL loops */ + /* and the number of JMPR, JROT, and JROF calls with a negative */ + /* argument to values that depend on various parameters like the */ + /* size of the CVT table or the number of points in the current */ + /* glyph (if applicable). */ + /* */ + /* The idea is that in real-world bytecode you either iterate over */ + /* all CVT entries (in the `prep' table), or over all points (or */ + /* contours, in the `glyf' table) of a glyph, and such iterations */ + /* don't happen very often. */ + exc->loopcall_counter = 0; + exc->neg_jump_counter = 0; + + /* The maximum values are heuristic. */ + if ( exc->pts.n_points ) + exc->loopcall_counter_max = FT_MAX( 50, + 10 * exc->pts.n_points ) + + FT_MAX( 50, + exc->cvtSize / 10 ); + else + exc->loopcall_counter_max = 300 + 8 * exc->cvtSize; + + /* as a protection against an unreasonable number of CVT entries */ + /* we assume at most 100 control values per glyph for the counter */ + if ( exc->loopcall_counter_max > + 100 * (FT_ULong)exc->face->root.num_glyphs ) + exc->loopcall_counter_max = 100 * (FT_ULong)exc->face->root.num_glyphs; + + FT_TRACE5(( "TT_RunIns: Limiting total number of loops in LOOPCALL" + " to %d\n", exc->loopcall_counter_max )); + + exc->neg_jump_counter_max = exc->loopcall_counter_max; + FT_TRACE5(( "TT_RunIns: Limiting total number of backward jumps" + " to %d\n", exc->neg_jump_counter_max )); + + /* set PPEM and CVT functions */ + exc->tt_metrics.ratio = 0; + if ( exc->metrics.x_ppem != exc->metrics.y_ppem ) + { + /* non-square pixels, use the stretched routines */ + exc->func_cur_ppem = Current_Ppem_Stretched; + exc->func_read_cvt = Read_CVT_Stretched; + exc->func_write_cvt = Write_CVT_Stretched; + exc->func_move_cvt = Move_CVT_Stretched; + } + else + { + /* square pixels, use normal routines */ + exc->func_cur_ppem = Current_Ppem; + exc->func_read_cvt = Read_CVT; + exc->func_write_cvt = Write_CVT; + exc->func_move_cvt = Move_CVT; + } + + Compute_Funcs( exc ); + Compute_Round( exc, (FT_Byte)exc->GS.round_state ); + + do + { + exc->opcode = exc->code[exc->IP]; + +#ifdef FT_DEBUG_LEVEL_TRACE + { + FT_Long cnt = FT_MIN( 8, exc->top ); + FT_Long n; + + + /* if tracing level is 7, show current code position */ + /* and the first few stack elements also */ + FT_TRACE6(( " " )); + FT_TRACE7(( "%06d ", exc->IP )); + FT_TRACE6(( opcode_name[exc->opcode] + 2 )); + FT_TRACE7(( "%*s", *opcode_name[exc->opcode] == 'A' + ? 2 + : 12 - ( *opcode_name[exc->opcode] - '0' ), + "#" )); + for ( n = 1; n <= cnt; n++ ) + FT_TRACE7(( " %d", exc->stack[exc->top - n] )); + FT_TRACE6(( "\n" )); + } +#endif /* FT_DEBUG_LEVEL_TRACE */ + + if ( ( exc->length = opcode_length[exc->opcode] ) < 0 ) + { + if ( exc->IP + 1 >= exc->codeSize ) + goto LErrorCodeOverflow_; + + exc->length = 2 - exc->length * exc->code[exc->IP + 1]; + } + + if ( exc->IP + exc->length > exc->codeSize ) + goto LErrorCodeOverflow_; + + /* First, let's check for empty stack and overflow */ + exc->args = exc->top - ( Pop_Push_Count[exc->opcode] >> 4 ); + + /* `args' is the top of the stack once arguments have been popped. */ + /* One can also interpret it as the index of the last argument. */ + if ( exc->args < 0 ) + { + if ( exc->pedantic_hinting ) + { + exc->error = FT_THROW( Too_Few_Arguments ); + goto LErrorLabel_; + } + + /* push zeroes onto the stack */ + for ( i = 0; i < Pop_Push_Count[exc->opcode] >> 4; i++ ) + exc->stack[i] = 0; + exc->args = 0; + } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( exc->opcode == 0x91 ) + { + /* this is very special: GETVARIATION returns */ + /* a variable number of arguments */ + + /* it is the job of the application to `activate' GX handling, */ + /* this is, calling any of the GX API functions on the current */ + /* font to select a variation instance */ + if ( exc->face->blend ) + exc->new_top = exc->args + exc->face->blend->num_axis; + } + else +#endif + exc->new_top = exc->args + ( Pop_Push_Count[exc->opcode] & 15 ); + + /* `new_top' is the new top of the stack, after the instruction's */ + /* execution. `top' will be set to `new_top' after the `switch' */ + /* statement. */ + if ( exc->new_top > exc->stackSize ) + { + exc->error = FT_THROW( Stack_Overflow ); + goto LErrorLabel_; + } + + exc->step_ins = TRUE; + exc->error = FT_Err_Ok; + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + + if ( SUBPIXEL_HINTING_INFINALITY ) + { + for ( i = 0; i < opcode_patterns; i++ ) + { + if ( opcode_pointer[i] < opcode_size[i] && + exc->opcode == opcode_pattern[i][opcode_pointer[i]] ) + { + opcode_pointer[i] += 1; + + if ( opcode_pointer[i] == opcode_size[i] ) + { + FT_TRACE6(( "sph: opcode ptrn: %d, %s %s\n", + i, + exc->face->root.family_name, + exc->face->root.style_name )); + + switch ( i ) + { + case 0: + break; + } + opcode_pointer[i] = 0; + } + } + else + opcode_pointer[i] = 0; + } + } + +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + { + FT_Long* args = exc->stack + exc->args; + FT_Byte opcode = exc->opcode; + + + switch ( opcode ) + { + case 0x00: /* SVTCA y */ + case 0x01: /* SVTCA x */ + case 0x02: /* SPvTCA y */ + case 0x03: /* SPvTCA x */ + case 0x04: /* SFvTCA y */ + case 0x05: /* SFvTCA x */ + Ins_SxyTCA( exc ); + break; + + case 0x06: /* SPvTL // */ + case 0x07: /* SPvTL + */ + Ins_SPVTL( exc, args ); + break; + + case 0x08: /* SFvTL // */ + case 0x09: /* SFvTL + */ + Ins_SFVTL( exc, args ); + break; + + case 0x0A: /* SPvFS */ + Ins_SPVFS( exc, args ); + break; + + case 0x0B: /* SFvFS */ + Ins_SFVFS( exc, args ); + break; + + case 0x0C: /* GPv */ + Ins_GPV( exc, args ); + break; + + case 0x0D: /* GFv */ + Ins_GFV( exc, args ); + break; + + case 0x0E: /* SFvTPv */ + Ins_SFVTPV( exc ); + break; + + case 0x0F: /* ISECT */ + Ins_ISECT( exc, args ); + break; + + case 0x10: /* SRP0 */ + Ins_SRP0( exc, args ); + break; + + case 0x11: /* SRP1 */ + Ins_SRP1( exc, args ); + break; + + case 0x12: /* SRP2 */ + Ins_SRP2( exc, args ); + break; + + case 0x13: /* SZP0 */ + Ins_SZP0( exc, args ); + break; + + case 0x14: /* SZP1 */ + Ins_SZP1( exc, args ); + break; + + case 0x15: /* SZP2 */ + Ins_SZP2( exc, args ); + break; + + case 0x16: /* SZPS */ + Ins_SZPS( exc, args ); + break; + + case 0x17: /* SLOOP */ + Ins_SLOOP( exc, args ); + break; + + case 0x18: /* RTG */ + Ins_RTG( exc ); + break; + + case 0x19: /* RTHG */ + Ins_RTHG( exc ); + break; + + case 0x1A: /* SMD */ + Ins_SMD( exc, args ); + break; + + case 0x1B: /* ELSE */ + Ins_ELSE( exc ); + break; + + case 0x1C: /* JMPR */ + Ins_JMPR( exc, args ); + break; + + case 0x1D: /* SCVTCI */ + Ins_SCVTCI( exc, args ); + break; + + case 0x1E: /* SSWCI */ + Ins_SSWCI( exc, args ); + break; + + case 0x1F: /* SSW */ + Ins_SSW( exc, args ); + break; + + case 0x20: /* DUP */ + Ins_DUP( args ); + break; + + case 0x21: /* POP */ + Ins_POP(); + break; + + case 0x22: /* CLEAR */ + Ins_CLEAR( exc ); + break; + + case 0x23: /* SWAP */ + Ins_SWAP( args ); + break; + + case 0x24: /* DEPTH */ + Ins_DEPTH( exc, args ); + break; + + case 0x25: /* CINDEX */ + Ins_CINDEX( exc, args ); + break; + + case 0x26: /* MINDEX */ + Ins_MINDEX( exc, args ); + break; + + case 0x27: /* ALIGNPTS */ + Ins_ALIGNPTS( exc, args ); + break; + + case 0x28: /* RAW */ + Ins_UNKNOWN( exc ); + break; + + case 0x29: /* UTP */ + Ins_UTP( exc, args ); + break; + + case 0x2A: /* LOOPCALL */ + Ins_LOOPCALL( exc, args ); + break; + + case 0x2B: /* CALL */ + Ins_CALL( exc, args ); + break; + + case 0x2C: /* FDEF */ + Ins_FDEF( exc, args ); + break; + + case 0x2D: /* ENDF */ + Ins_ENDF( exc ); + break; + + case 0x2E: /* MDAP */ + case 0x2F: /* MDAP */ + Ins_MDAP( exc, args ); + break; + + case 0x30: /* IUP */ + case 0x31: /* IUP */ + Ins_IUP( exc ); + break; + + case 0x32: /* SHP */ + case 0x33: /* SHP */ + Ins_SHP( exc ); + break; + + case 0x34: /* SHC */ + case 0x35: /* SHC */ + Ins_SHC( exc, args ); + break; + + case 0x36: /* SHZ */ + case 0x37: /* SHZ */ + Ins_SHZ( exc, args ); + break; + + case 0x38: /* SHPIX */ + Ins_SHPIX( exc, args ); + break; + + case 0x39: /* IP */ + Ins_IP( exc ); + break; + + case 0x3A: /* MSIRP */ + case 0x3B: /* MSIRP */ + Ins_MSIRP( exc, args ); + break; + + case 0x3C: /* AlignRP */ + Ins_ALIGNRP( exc ); + break; + + case 0x3D: /* RTDG */ + Ins_RTDG( exc ); + break; + + case 0x3E: /* MIAP */ + case 0x3F: /* MIAP */ + Ins_MIAP( exc, args ); + break; + + case 0x40: /* NPUSHB */ + Ins_NPUSHB( exc, args ); + break; + + case 0x41: /* NPUSHW */ + Ins_NPUSHW( exc, args ); + break; + + case 0x42: /* WS */ + Ins_WS( exc, args ); + break; + + case 0x43: /* RS */ + Ins_RS( exc, args ); + break; + + case 0x44: /* WCVTP */ + Ins_WCVTP( exc, args ); + break; + + case 0x45: /* RCVT */ + Ins_RCVT( exc, args ); + break; + + case 0x46: /* GC */ + case 0x47: /* GC */ + Ins_GC( exc, args ); + break; + + case 0x48: /* SCFS */ + Ins_SCFS( exc, args ); + break; + + case 0x49: /* MD */ + case 0x4A: /* MD */ + Ins_MD( exc, args ); + break; + + case 0x4B: /* MPPEM */ + Ins_MPPEM( exc, args ); + break; + + case 0x4C: /* MPS */ + Ins_MPS( exc, args ); + break; + + case 0x4D: /* FLIPON */ + Ins_FLIPON( exc ); + break; + + case 0x4E: /* FLIPOFF */ + Ins_FLIPOFF( exc ); + break; + + case 0x4F: /* DEBUG */ + Ins_DEBUG( exc ); + break; + + case 0x50: /* LT */ + Ins_LT( args ); + break; + + case 0x51: /* LTEQ */ + Ins_LTEQ( args ); + break; + + case 0x52: /* GT */ + Ins_GT( args ); + break; + + case 0x53: /* GTEQ */ + Ins_GTEQ( args ); + break; + + case 0x54: /* EQ */ + Ins_EQ( args ); + break; + + case 0x55: /* NEQ */ + Ins_NEQ( args ); + break; + + case 0x56: /* ODD */ + Ins_ODD( exc, args ); + break; + + case 0x57: /* EVEN */ + Ins_EVEN( exc, args ); + break; + + case 0x58: /* IF */ + Ins_IF( exc, args ); + break; + + case 0x59: /* EIF */ + Ins_EIF(); + break; + + case 0x5A: /* AND */ + Ins_AND( args ); + break; + + case 0x5B: /* OR */ + Ins_OR( args ); + break; + + case 0x5C: /* NOT */ + Ins_NOT( args ); + break; + + case 0x5D: /* DELTAP1 */ + Ins_DELTAP( exc, args ); + break; + + case 0x5E: /* SDB */ + Ins_SDB( exc, args ); + break; + + case 0x5F: /* SDS */ + Ins_SDS( exc, args ); + break; + + case 0x60: /* ADD */ + Ins_ADD( args ); + break; + + case 0x61: /* SUB */ + Ins_SUB( args ); + break; + + case 0x62: /* DIV */ + Ins_DIV( exc, args ); + break; + + case 0x63: /* MUL */ + Ins_MUL( args ); + break; + + case 0x64: /* ABS */ + Ins_ABS( args ); + break; + + case 0x65: /* NEG */ + Ins_NEG( args ); + break; + + case 0x66: /* FLOOR */ + Ins_FLOOR( args ); + break; + + case 0x67: /* CEILING */ + Ins_CEILING( args ); + break; + + case 0x68: /* ROUND */ + case 0x69: /* ROUND */ + case 0x6A: /* ROUND */ + case 0x6B: /* ROUND */ + Ins_ROUND( exc, args ); + break; + + case 0x6C: /* NROUND */ + case 0x6D: /* NROUND */ + case 0x6E: /* NRRUND */ + case 0x6F: /* NROUND */ + Ins_NROUND( exc, args ); + break; + + case 0x70: /* WCVTF */ + Ins_WCVTF( exc, args ); + break; + + case 0x71: /* DELTAP2 */ + case 0x72: /* DELTAP3 */ + Ins_DELTAP( exc, args ); + break; + + case 0x73: /* DELTAC0 */ + case 0x74: /* DELTAC1 */ + case 0x75: /* DELTAC2 */ + Ins_DELTAC( exc, args ); + break; + + case 0x76: /* SROUND */ + Ins_SROUND( exc, args ); + break; + + case 0x77: /* S45Round */ + Ins_S45ROUND( exc, args ); + break; + + case 0x78: /* JROT */ + Ins_JROT( exc, args ); + break; + + case 0x79: /* JROF */ + Ins_JROF( exc, args ); + break; + + case 0x7A: /* ROFF */ + Ins_ROFF( exc ); + break; + + case 0x7B: /* ???? */ + Ins_UNKNOWN( exc ); + break; + + case 0x7C: /* RUTG */ + Ins_RUTG( exc ); + break; + + case 0x7D: /* RDTG */ + Ins_RDTG( exc ); + break; + + case 0x7E: /* SANGW */ + Ins_SANGW(); + break; + + case 0x7F: /* AA */ + Ins_AA(); + break; + + case 0x80: /* FLIPPT */ + Ins_FLIPPT( exc ); + break; + + case 0x81: /* FLIPRGON */ + Ins_FLIPRGON( exc, args ); + break; + + case 0x82: /* FLIPRGOFF */ + Ins_FLIPRGOFF( exc, args ); + break; + + case 0x83: /* UNKNOWN */ + case 0x84: /* UNKNOWN */ + Ins_UNKNOWN( exc ); + break; + + case 0x85: /* SCANCTRL */ + Ins_SCANCTRL( exc, args ); + break; + + case 0x86: /* SDPvTL */ + case 0x87: /* SDPvTL */ + Ins_SDPVTL( exc, args ); + break; + + case 0x88: /* GETINFO */ + Ins_GETINFO( exc, args ); + break; + + case 0x89: /* IDEF */ + Ins_IDEF( exc, args ); + break; + + case 0x8A: /* ROLL */ + Ins_ROLL( args ); + break; + + case 0x8B: /* MAX */ + Ins_MAX( args ); + break; + + case 0x8C: /* MIN */ + Ins_MIN( args ); + break; + + case 0x8D: /* SCANTYPE */ + Ins_SCANTYPE( exc, args ); + break; + + case 0x8E: /* INSTCTRL */ + Ins_INSTCTRL( exc, args ); + break; + + case 0x8F: /* ADJUST */ + case 0x90: /* ADJUST */ + Ins_UNKNOWN( exc ); + break; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + case 0x91: + /* it is the job of the application to `activate' GX handling, */ + /* this is, calling any of the GX API functions on the current */ + /* font to select a variation instance */ + if ( exc->face->blend ) + Ins_GETVARIATION( exc, args ); + else + Ins_UNKNOWN( exc ); + break; + + case 0x92: + /* there is at least one MS font (LaoUI.ttf version 5.01) that */ + /* uses IDEFs for 0x91 and 0x92; for this reason we activate */ + /* GETDATA for GX fonts only, similar to GETVARIATION */ + if ( exc->face->blend ) + Ins_GETDATA( args ); + else + Ins_UNKNOWN( exc ); + break; +#endif + + default: + if ( opcode >= 0xE0 ) + Ins_MIRP( exc, args ); + else if ( opcode >= 0xC0 ) + Ins_MDRP( exc, args ); + else if ( opcode >= 0xB8 ) + Ins_PUSHW( exc, args ); + else if ( opcode >= 0xB0 ) + Ins_PUSHB( exc, args ); + else + Ins_UNKNOWN( exc ); + } + } + + if ( exc->error ) + { + switch ( exc->error ) + { + /* looking for redefined instructions */ + case FT_ERR( Invalid_Opcode ): + { + TT_DefRecord* def = exc->IDefs; + TT_DefRecord* limit = def + exc->numIDefs; + + + for ( ; def < limit; def++ ) + { + if ( def->active && exc->opcode == (FT_Byte)def->opc ) + { + TT_CallRec* callrec; + + + if ( exc->callTop >= exc->callSize ) + { + exc->error = FT_THROW( Invalid_Reference ); + goto LErrorLabel_; + } + + callrec = &exc->callStack[exc->callTop]; + + callrec->Caller_Range = exc->curRange; + callrec->Caller_IP = exc->IP + 1; + callrec->Cur_Count = 1; + callrec->Def = def; + + if ( Ins_Goto_CodeRange( exc, + def->range, + def->start ) == FAILURE ) + goto LErrorLabel_; + + goto LSuiteLabel_; + } + } + } + + exc->error = FT_THROW( Invalid_Opcode ); + goto LErrorLabel_; + +#if 0 + break; /* Unreachable code warning suppression. */ + /* Leave to remind in case a later change the editor */ + /* to consider break; */ +#endif + + default: + goto LErrorLabel_; + +#if 0 + break; +#endif + } + } + + exc->top = exc->new_top; + + if ( exc->step_ins ) + exc->IP += exc->length; + + /* increment instruction counter and check if we didn't */ + /* run this program for too long (e.g. infinite loops). */ + if ( ++ins_counter > TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES ) + return FT_THROW( Execution_Too_Long ); + + LSuiteLabel_: + if ( exc->IP >= exc->codeSize ) + { + if ( exc->callTop > 0 ) + { + exc->error = FT_THROW( Code_Overflow ); + goto LErrorLabel_; + } + else + goto LNo_Error_; + } + } while ( !exc->instruction_trap ); + + LNo_Error_: + FT_TRACE4(( " %d instruction%s executed\n", + ins_counter, + ins_counter == 1 ? "" : "s" )); + return FT_Err_Ok; + + LErrorCodeOverflow_: + exc->error = FT_THROW( Code_Overflow ); + + LErrorLabel_: + if ( exc->error && !exc->instruction_trap ) + FT_TRACE1(( " The interpreter returned error 0x%x\n", exc->error )); + + return exc->error; + } + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + /* ANSI C doesn't like empty source files */ + typedef int _tt_interp_dummy; + +#endif /* !TT_USE_BYTECODE_INTERPRETER */ + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttinterp.h b/vendor/FreeType2/src/truetype/ttinterp.h new file mode 100644 index 0000000..2966439 --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttinterp.h @@ -0,0 +1,539 @@ +/***************************************************************************/ +/* */ +/* ttinterp.h */ +/* */ +/* TrueType bytecode interpreter (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTINTERP_H_ +#define TTINTERP_H_ + +#include +#include "ttobjs.h" + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* Rounding mode constants. */ + /* */ +#define TT_Round_Off 5 +#define TT_Round_To_Half_Grid 0 +#define TT_Round_To_Grid 1 +#define TT_Round_To_Double_Grid 2 +#define TT_Round_Up_To_Grid 4 +#define TT_Round_Down_To_Grid 3 +#define TT_Round_Super 6 +#define TT_Round_Super_45 7 + + + /*************************************************************************/ + /* */ + /* Function types used by the interpreter, depending on various modes */ + /* (e.g. the rounding mode, whether to render a vertical or horizontal */ + /* line etc). */ + /* */ + /*************************************************************************/ + + /* Rounding function */ + typedef FT_F26Dot6 + (*TT_Round_Func)( TT_ExecContext exc, + FT_F26Dot6 distance, + FT_F26Dot6 compensation ); + + /* Point displacement along the freedom vector routine */ + typedef void + (*TT_Move_Func)( TT_ExecContext exc, + TT_GlyphZone zone, + FT_UShort point, + FT_F26Dot6 distance ); + + /* Distance projection along one of the projection vectors */ + typedef FT_F26Dot6 + (*TT_Project_Func)( TT_ExecContext exc, + FT_Pos dx, + FT_Pos dy ); + + /* getting current ppem. Take care of non-square pixels if necessary */ + typedef FT_Long + (*TT_Cur_Ppem_Func)( TT_ExecContext exc ); + + /* reading a cvt value. Take care of non-square pixels if necessary */ + typedef FT_F26Dot6 + (*TT_Get_CVT_Func)( TT_ExecContext exc, + FT_ULong idx ); + + /* setting or moving a cvt value. Take care of non-square pixels */ + /* if necessary */ + typedef void + (*TT_Set_CVT_Func)( TT_ExecContext exc, + FT_ULong idx, + FT_F26Dot6 value ); + + + /*************************************************************************/ + /* */ + /* This structure defines a call record, used to manage function calls. */ + /* */ + typedef struct TT_CallRec_ + { + FT_Int Caller_Range; + FT_Long Caller_IP; + FT_Long Cur_Count; + + TT_DefRecord *Def; /* either FDEF or IDEF */ + + } TT_CallRec, *TT_CallStack; + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + + /*************************************************************************/ + /* */ + /* These structures define rules used to tweak subpixel hinting for */ + /* various fonts. "", 0, "", NULL value indicates to match any value. */ + /* */ + +#define SPH_MAX_NAME_SIZE 32 +#define SPH_MAX_CLASS_MEMBERS 100 + + typedef struct SPH_TweakRule_ + { + const char family[SPH_MAX_NAME_SIZE]; + const FT_UInt ppem; + const char style[SPH_MAX_NAME_SIZE]; + const FT_ULong glyph; + + } SPH_TweakRule; + + + typedef struct SPH_ScaleRule_ + { + const char family[SPH_MAX_NAME_SIZE]; + const FT_UInt ppem; + const char style[SPH_MAX_NAME_SIZE]; + const FT_ULong glyph; + const FT_ULong scale; + + } SPH_ScaleRule; + + + typedef struct SPH_Font_Class_ + { + const char name[SPH_MAX_NAME_SIZE]; + const char member[SPH_MAX_CLASS_MEMBERS][SPH_MAX_NAME_SIZE]; + + } SPH_Font_Class; + +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + + /*************************************************************************/ + /* */ + /* The main structure for the interpreter which collects all necessary */ + /* variables and states. */ + /* */ + typedef struct TT_ExecContextRec_ + { + TT_Face face; + TT_Size size; + FT_Memory memory; + + /* instructions state */ + + FT_Error error; /* last execution error */ + + FT_Long top; /* top of exec. stack */ + + FT_Long stackSize; /* size of exec. stack */ + FT_Long* stack; /* current exec. stack */ + + FT_Long args; + FT_Long new_top; /* new top after exec. */ + + TT_GlyphZoneRec zp0, /* zone records */ + zp1, + zp2, + pts, + twilight; + + FT_Long pointSize; /* in 26.6 format */ + FT_Size_Metrics metrics; + TT_Size_Metrics tt_metrics; /* size metrics */ + + TT_GraphicsState GS; /* current graphics state */ + + FT_Int curRange; /* current code range number */ + FT_Byte* code; /* current code range */ + FT_Long IP; /* current instruction pointer */ + FT_Long codeSize; /* size of current range */ + + FT_Byte opcode; /* current opcode */ + FT_Int length; /* length of current opcode */ + + FT_Bool step_ins; /* true if the interpreter must */ + /* increment IP after ins. exec */ + FT_ULong cvtSize; + FT_Long* cvt; + + FT_UInt glyphSize; /* glyph instructions buffer size */ + FT_Byte* glyphIns; /* glyph instructions buffer */ + + FT_UInt numFDefs; /* number of function defs */ + FT_UInt maxFDefs; /* maximum number of function defs */ + TT_DefArray FDefs; /* table of FDefs entries */ + + FT_UInt numIDefs; /* number of instruction defs */ + FT_UInt maxIDefs; /* maximum number of ins defs */ + TT_DefArray IDefs; /* table of IDefs entries */ + + FT_UInt maxFunc; /* maximum function index */ + FT_UInt maxIns; /* maximum instruction index */ + + FT_Int callTop, /* top of call stack during execution */ + callSize; /* size of call stack */ + TT_CallStack callStack; /* call stack */ + + FT_UShort maxPoints; /* capacity of this context's `pts' */ + FT_Short maxContours; /* record, expressed in points and */ + /* contours. */ + + TT_CodeRangeTable codeRangeTable; /* table of valid code ranges */ + /* useful for the debugger */ + + FT_UShort storeSize; /* size of current storage */ + FT_Long* storage; /* storage area */ + + FT_F26Dot6 period; /* values used for the */ + FT_F26Dot6 phase; /* `SuperRounding' */ + FT_F26Dot6 threshold; + + FT_Bool instruction_trap; /* If `True', the interpreter will */ + /* exit after each instruction */ + + TT_GraphicsState default_GS; /* graphics state resulting from */ + /* the prep program */ + FT_Bool is_composite; /* true if the glyph is composite */ + FT_Bool pedantic_hinting; /* true if pedantic interpretation */ + + /* latest interpreter additions */ + + FT_Long F_dot_P; /* dot product of freedom and projection */ + /* vectors */ + TT_Round_Func func_round; /* current rounding function */ + + TT_Project_Func func_project, /* current projection function */ + func_dualproj, /* current dual proj. function */ + func_freeProj; /* current freedom proj. func */ + + TT_Move_Func func_move; /* current point move function */ + TT_Move_Func func_move_orig; /* move original position function */ + + TT_Cur_Ppem_Func func_cur_ppem; /* get current proj. ppem value */ + + TT_Get_CVT_Func func_read_cvt; /* read a cvt entry */ + TT_Set_CVT_Func func_write_cvt; /* write a cvt entry (in pixels) */ + TT_Set_CVT_Func func_move_cvt; /* incr a cvt entry (in pixels) */ + + FT_Bool grayscale; /* bi-level hinting and */ + /* grayscale rendering */ + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + /* + * FreeType supports ClearType-like hinting of TrueType fonts through + * the version 40 interpreter. This is achieved through several hacks + * in the base (v35) interpreter, as detailed below. + * + * ClearType is an umbrella term for several rendering techniques + * employed by Microsoft's various GUI and rendering toolkit + * implementations, most importantly: subpixel rendering for using the + * RGB subpixels of LCDs to approximately triple the perceived + * resolution on the x-axis and subpixel hinting for positioning stems + * on subpixel borders. TrueType programming is explicit, i.e., fonts + * must be programmed to take advantage of ClearType's possibilities. + * + * When ClearType was introduced, it seemed unlikely that all fonts + * would be reprogrammed, so Microsoft decided to implement a backward + * compatibility mode. It employs several simple to complicated + * assumptions and tricks, many of them font-dependent, that modify the + * interpretation of the bytecode contained in these fonts to retrofit + * them into a ClearType-y look. The quality of the results varies. + * Most (web)fonts that were released since then have come to rely on + * these hacks to render correctly, even some of Microsoft's flagship + * fonts (e.g., Calibri, Cambria, Segoe UI). + * + * FreeType's minimal subpixel hinting code (interpreter version 40) + * employs a small list of font-agnostic hacks loosely based on the + * public information available on Microsoft's compatibility mode[2]. + * The focus is on modern (web)fonts rather than legacy fonts that were + * made for monochrome rendering. It will not match ClearType rendering + * exactly. Unlike the `Infinality' code (interpreter version 38) that + * came before, it will not try to toggle hacks for specific fonts for + * performance and complexity reasons. It will fall back to version 35 + * behavior for tricky fonts[1] or when monochrome rendering is + * requested. + * + * Major hacks + * + * - Any point movement on the x axis is ignored (cf. `Direct_Move' and + * `Direct_Move_X'). This has the smallest code footprint and single + * biggest effect. The ClearType way to increase resolution is + * supersampling the x axis, the FreeType way is ignoring instructions + * on the x axis, which gives the same result in the majority of + * cases. + * + * - Points are not moved post-IUP (neither on the x nor on the y axis), + * except the x component of diagonal moves post-IUP (cf. + * `Direct_Move', `Direct_Move_Y', `Move_Zp2_Point'). Post-IUP + * changes are commonly used to `fix' pixel patterns which has little + * use outside monochrome rendering. + * + * - SHPIX and DELTAP don't execute unless moving a composite on the + * y axis or moving a previously y touched point. SHPIX additionally + * denies movement on the x axis (cf. `Ins_SHPIX' and `Ins_DELTAP'). + * Both instructions are commonly used to `fix' pixel patterns for + * monochrome or Windows's GDI rendering but make little sense for + * FreeType rendering. Both can distort the outline. See [2] for + * details. + * + * - The hdmx table and modifications to phantom points are ignored. + * Bearings and advance widths remain unchanged (except rounding them + * outside the interpreter!), cf. `compute_glyph_metrics' and + * `TT_Hint_Glyph'. Letting non-native-ClearType fonts modify spacing + * might mess up spacing. + * + * Minor hacks + * + * - FLIPRGON, FLIPRGOFF, and FLIPPT don't execute post-IUP. This + * prevents dents in e.g. Arial-Regular's `D' and `G' glyphs at + * various sizes. + * + * (Post-IUP is the state after both IUP[x] and IUP[y] have been + * executed.) + * + * The best results are achieved for fonts that were from the outset + * designed with ClearType in mind, meaning they leave the x axis mostly + * alone and don't mess with the `final' outline to produce more + * pleasing pixel patterns. The harder the designer tried to produce + * very specific patterns (`superhinting') for pre-ClearType-displays, + * the worse the results. + * + * Microsoft defines a way to turn off backward compatibility and + * interpret instructions as before (called `native ClearType')[2][3]. + * The font designer then regains full control and is responsible for + * making the font work correctly with ClearType without any + * hand-holding by the interpreter or rasterizer[4]. The v40 + * interpreter assumes backward compatibility by default, which can be + * turned off the same way by executing the following in the control + * program (cf. `Ins_INSTCTRL'). + * + * #PUSH 4,3 + * INSTCTRL[] + * + * [1] Tricky fonts as FreeType defines them rely on the bytecode + * interpreter to display correctly. Hacks can interfere with them, + * so they get treated like native ClearType fonts (v40 with + * backward compatibility turned off). Cf. `TT_RunIns'. + * + * [2] Proposed by Microsoft's Greg Hitchcock in + * https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx + * + * [3] Beat Stamm describes it in more detail: + * http://www.beatstamm.com/typography/RTRCh4.htm#Sec12 + * + * [4] The list of `native ClearType' fonts is small at the time of this + * writing; I found the following on a Windows 10 Update 1511 + * installation: Constantia, Corbel, Sitka, Malgun Gothic, Microsoft + * JhengHei (Bold and UI Bold), Microsoft YaHei (Bold and UI Bold), + * SimSun, NSimSun, and Yu Gothic. + * + */ + + /* Using v40 implies subpixel hinting, unless FT_RENDER_MODE_MONO has been + * requested. Used to detect interpreter */ + /* version switches. `_lean' to differentiate from the Infinality */ + /* `subpixel_hinting', which is managed differently. */ + FT_Bool subpixel_hinting_lean; + + /* Long side of a LCD subpixel is vertical (e.g., screen is rotated). */ + /* `_lean' to differentiate from the Infinality `vertical_lcd', which */ + /* is managed differently. */ + FT_Bool vertical_lcd_lean; + + /* Default to backward compatibility mode in v40 interpreter. If */ + /* this is false, it implies the interpreter is in v35 or in native */ + /* ClearType mode. */ + FT_Bool backward_compatibility; + + /* Useful for detecting and denying post-IUP trickery that is usually */ + /* used to fix pixel patterns (`superhinting'). */ + FT_Bool iupx_called; + FT_Bool iupy_called; + + /* ClearType hinting and grayscale rendering, as used by Universal */ + /* Windows Platform apps (Windows 8 and above). Like the standard */ + /* colorful ClearType mode, it utilizes a vastly increased virtual */ + /* resolution on the x axis. Different from bi-level hinting and */ + /* grayscale rendering, the old mode from Win9x days that roughly */ + /* adheres to the physical pixel grid on both axes. */ + FT_Bool grayscale_cleartype; +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL */ + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + TT_Round_Func func_round_sphn; /* subpixel rounding function */ + + FT_Bool subpixel_hinting; /* Using subpixel hinting? */ + FT_Bool ignore_x_mode; /* Standard rendering mode for */ + /* subpixel hinting. On if gray */ + /* or subpixel hinting is on. */ + + /* The following 6 aren't fully implemented but here for MS rasterizer */ + /* compatibility. */ + FT_Bool compatible_widths; /* compatible widths? */ + FT_Bool symmetrical_smoothing; /* symmetrical_smoothing? */ + FT_Bool bgr; /* bgr instead of rgb? */ + FT_Bool vertical_lcd; /* long side of LCD subpixel */ + /* rectangles is horizontal */ + FT_Bool subpixel_positioned; /* subpixel positioned */ + /* (DirectWrite ClearType)? */ + FT_Bool gray_cleartype; /* ClearType hinting but */ + /* grayscale rendering */ + + FT_Int rasterizer_version; /* MS rasterizer version */ + + FT_Bool iup_called; /* IUP called for glyph? */ + + FT_ULong sph_tweak_flags; /* flags to control */ + /* hint tweaks */ + + FT_ULong sph_in_func_flags; /* flags to indicate if in */ + /* special functions */ + +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + /* We maintain two counters (in addition to the instruction counter) */ + /* that act as loop detectors for LOOPCALL and jump opcodes with */ + /* negative arguments. */ + FT_ULong loopcall_counter; + FT_ULong loopcall_counter_max; + FT_ULong neg_jump_counter; + FT_ULong neg_jump_counter_max; + + } TT_ExecContextRec; + + + extern const TT_GraphicsState tt_default_graphics_state; + + +#ifdef TT_USE_BYTECODE_INTERPRETER + FT_LOCAL( void ) + TT_Goto_CodeRange( TT_ExecContext exec, + FT_Int range, + FT_Long IP ); + + FT_LOCAL( void ) + TT_Set_CodeRange( TT_ExecContext exec, + FT_Int range, + void* base, + FT_Long length ); + + FT_LOCAL( void ) + TT_Clear_CodeRange( TT_ExecContext exec, + FT_Int range ); + + + FT_LOCAL( FT_Error ) + Update_Max( FT_Memory memory, + FT_ULong* size, + FT_ULong multiplier, + void* _pbuff, + FT_ULong new_max ); +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_New_Context */ + /* */ + /* */ + /* Queries the face context for a given font. Note that there is */ + /* now a _single_ execution context in the TrueType driver which is */ + /* shared among faces. */ + /* */ + /* */ + /* face :: A handle to the source face object. */ + /* */ + /* */ + /* A handle to the execution context. Initialized for `face'. */ + /* */ + /* */ + /* Only the glyph loader and debugger should call this function. */ + /* (And right now only the glyph loader uses it.) */ + /* */ + FT_EXPORT( TT_ExecContext ) + TT_New_Context( TT_Driver driver ); + + +#ifdef TT_USE_BYTECODE_INTERPRETER + FT_LOCAL( void ) + TT_Done_Context( TT_ExecContext exec ); + + FT_LOCAL( FT_Error ) + TT_Load_Context( TT_ExecContext exec, + TT_Face face, + TT_Size size ); + + FT_LOCAL( void ) + TT_Save_Context( TT_ExecContext exec, + TT_Size ins ); + + FT_LOCAL( FT_Error ) + TT_Run_Context( TT_ExecContext exec ); +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* */ + /* TT_RunIns */ + /* */ + /* */ + /* Executes one or more instruction in the execution context. This */ + /* is the main function of the TrueType opcode interpreter. */ + /* */ + /* */ + /* exec :: A handle to the target execution context. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + /* */ + /* Only the object manager and debugger should call this function. */ + /* */ + /* This function is publicly exported because it is directly */ + /* invoked by the TrueType debugger. */ + /* */ + FT_EXPORT( FT_Error ) + TT_RunIns( TT_ExecContext exec ); + + +FT_END_HEADER + +#endif /* TTINTERP_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttobjs.c b/vendor/FreeType2/src/truetype/ttobjs.c new file mode 100644 index 0000000..6685dc8 --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttobjs.c @@ -0,0 +1,1440 @@ +/***************************************************************************/ +/* */ +/* ttobjs.c */ +/* */ +/* Objects manager (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H +#include FT_INTERNAL_SFNT_H +#include FT_DRIVER_H + +#include "ttgload.h" +#include "ttpload.h" + +#include "tterrors.h" + +#ifdef TT_USE_BYTECODE_INTERPRETER +#include "ttinterp.h" +#endif + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + + /*************************************************************************/ + /* */ + /* 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_ttobjs + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /*************************************************************************/ + /* */ + /* GLYPH ZONE FUNCTIONS */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* */ + /* tt_glyphzone_done */ + /* */ + /* */ + /* Deallocate a glyph zone. */ + /* */ + /* */ + /* zone :: A pointer to the target glyph zone. */ + /* */ + FT_LOCAL_DEF( void ) + tt_glyphzone_done( TT_GlyphZone zone ) + { + FT_Memory memory = zone->memory; + + + if ( memory ) + { + FT_FREE( zone->contours ); + FT_FREE( zone->tags ); + FT_FREE( zone->cur ); + FT_FREE( zone->org ); + FT_FREE( zone->orus ); + + zone->max_points = zone->n_points = 0; + zone->max_contours = zone->n_contours = 0; + zone->memory = NULL; + } + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_glyphzone_new */ + /* */ + /* */ + /* Allocate a new glyph zone. */ + /* */ + /* */ + /* memory :: A handle to the current memory object. */ + /* */ + /* maxPoints :: The capacity of glyph zone in points. */ + /* */ + /* maxContours :: The capacity of glyph zone in contours. */ + /* */ + /* */ + /* zone :: A pointer to the target glyph zone record. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_glyphzone_new( FT_Memory memory, + FT_UShort maxPoints, + FT_Short maxContours, + TT_GlyphZone zone ) + { + FT_Error error; + + + FT_ZERO( zone ); + zone->memory = memory; + + if ( FT_NEW_ARRAY( zone->org, maxPoints ) || + FT_NEW_ARRAY( zone->cur, maxPoints ) || + FT_NEW_ARRAY( zone->orus, maxPoints ) || + FT_NEW_ARRAY( zone->tags, maxPoints ) || + FT_NEW_ARRAY( zone->contours, maxContours ) ) + { + tt_glyphzone_done( zone ); + } + else + { + zone->max_points = maxPoints; + zone->max_contours = maxContours; + } + + return error; + } +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /* Compare the face with a list of well-known `tricky' fonts. */ + /* This list shall be expanded as we find more of them. */ + + static FT_Bool + tt_check_trickyness_family( FT_String* name ) + { + +#define TRICK_NAMES_MAX_CHARACTERS 19 +#define TRICK_NAMES_COUNT 26 + + static const char trick_names[TRICK_NAMES_COUNT] + [TRICK_NAMES_MAX_CHARACTERS + 1] = + { + /* + PostScript names are given in brackets if they differ from the + family name. The version numbers, together with the copyright or + release year data, are taken from fonts available to the + developers. + + Note that later versions of the fonts might be no longer tricky; + for example, `MingLiU' version 7.00 (file `mingliu.ttc' from + Windows 7) is an ordinary TTC with non-tricky subfonts. + */ + + "cpop", /* dftt-p7.ttf; version 1.00, 1992 [DLJGyShoMedium] */ + "DFGirl-W6-WIN-BF", /* dftt-h6.ttf; version 1.00, 1993 */ + "DFGothic-EB", /* DynaLab Inc. 1992-1995 */ + "DFGyoSho-Lt", /* DynaLab Inc. 1992-1995 */ + "DFHei-Md-HK-BF", /* maybe DynaLab Inc. */ + "DFHSGothic-W5", /* DynaLab Inc. 1992-1995 */ + "DFHSMincho-W3", /* DynaLab Inc. 1992-1995 */ + "DFHSMincho-W7", /* DynaLab Inc. 1992-1995 */ + "DFKaiSho-SB", /* dfkaisb.ttf */ + "DFKaiShu", + "DFKaiShu-Md-HK-BF", /* maybe DynaLab Inc. */ + "DFKai-SB", /* kaiu.ttf; version 3.00, 1998 [DFKaiShu-SB-Estd-BF] */ + "DFMing-Bd-HK-BF", /* maybe DynaLab Inc. */ + "DLC", /* dftt-m7.ttf; version 1.00, 1993 [DLCMingBold] */ + /* dftt-f5.ttf; version 1.00, 1993 [DLCFongSung] */ + "DLCHayMedium", /* dftt-b5.ttf; version 1.00, 1993 */ + "DLCHayBold", /* dftt-b7.ttf; version 1.00, 1993 */ + "DLCKaiMedium", /* dftt-k5.ttf; version 1.00, 1992 */ + "DLCLiShu", /* dftt-l5.ttf; version 1.00, 1992 */ + "DLCRoundBold", /* dftt-r7.ttf; version 1.00, 1993 */ + "HuaTianKaiTi?", /* htkt2.ttf */ + "HuaTianSongTi?", /* htst3.ttf */ + "Ming(for ISO10646)", /* hkscsiic.ttf; version 0.12, 2007 [Ming] */ + /* iicore.ttf; version 0.07, 2007 [Ming] */ + "MingLiU", /* mingliu.ttf */ + /* mingliu.ttc; version 3.21, 2001 */ + "MingMedium", /* dftt-m5.ttf; version 1.00, 1993 [DLCMingMedium] */ + "PMingLiU", /* mingliu.ttc; version 3.21, 2001 */ + "MingLi43", /* mingli.ttf; version 1.00, 1992 */ + }; + + int nn; + + + for ( nn = 0; nn < TRICK_NAMES_COUNT; nn++ ) + if ( ft_strstr( name, trick_names[nn] ) ) + return TRUE; + + return FALSE; + } + + + /* XXX: This function should be in the `sfnt' module. */ + + /* Some PDF generators clear the checksums in the TrueType header table. */ + /* For example, Quartz ContextPDF clears all entries, or Bullzip PDF */ + /* Printer clears the entries for subsetted subtables. We thus have to */ + /* recalculate the checksums where necessary. */ + + static FT_UInt32 + tt_synth_sfnt_checksum( FT_Stream stream, + FT_ULong length ) + { + FT_Error error; + FT_UInt32 checksum = 0; + FT_UInt i; + + + if ( FT_FRAME_ENTER( length ) ) + return 0; + + for ( ; length > 3; length -= 4 ) + checksum += (FT_UInt32)FT_GET_ULONG(); + + for ( i = 3; length > 0; length--, i-- ) + checksum += (FT_UInt32)FT_GET_BYTE() << ( i * 8 ); + + FT_FRAME_EXIT(); + + return checksum; + } + + + /* XXX: This function should be in the `sfnt' module. */ + + static FT_ULong + tt_get_sfnt_checksum( TT_Face face, + FT_UShort i ) + { +#if 0 /* if we believe the written value, use following part. */ + if ( face->dir_tables[i].CheckSum ) + return face->dir_tables[i].CheckSum; +#endif + + if ( !face->goto_table ) + return 0; + + if ( face->goto_table( face, + face->dir_tables[i].Tag, + face->root.stream, + NULL ) ) + return 0; + + return (FT_ULong)tt_synth_sfnt_checksum( face->root.stream, + face->dir_tables[i].Length ); + } + + + typedef struct tt_sfnt_id_rec_ + { + FT_ULong CheckSum; + FT_ULong Length; + + } tt_sfnt_id_rec; + + + static FT_Bool + tt_check_trickyness_sfnt_ids( TT_Face face ) + { +#define TRICK_SFNT_IDS_PER_FACE 3 +#define TRICK_SFNT_IDS_NUM_FACES 29 + + static const tt_sfnt_id_rec sfnt_id[TRICK_SFNT_IDS_NUM_FACES] + [TRICK_SFNT_IDS_PER_FACE] = { + +#define TRICK_SFNT_ID_cvt 0 +#define TRICK_SFNT_ID_fpgm 1 +#define TRICK_SFNT_ID_prep 2 + + { /* MingLiU 1995 */ + { 0x05BCF058UL, 0x000002E4UL }, /* cvt */ + { 0x28233BF1UL, 0x000087C4UL }, /* fpgm */ + { 0xA344A1EAUL, 0x000001E1UL } /* prep */ + }, + { /* MingLiU 1996- */ + { 0x05BCF058UL, 0x000002E4UL }, /* cvt */ + { 0x28233BF1UL, 0x000087C4UL }, /* fpgm */ + { 0xA344A1EBUL, 0x000001E1UL } /* prep */ + }, + { /* DFGothic-EB */ + { 0x12C3EBB2UL, 0x00000350UL }, /* cvt */ + { 0xB680EE64UL, 0x000087A7UL }, /* fpgm */ + { 0xCE939563UL, 0x00000758UL } /* prep */ + }, + { /* DFGyoSho-Lt */ + { 0x11E5EAD4UL, 0x00000350UL }, /* cvt */ + { 0xCE5956E9UL, 0x0000BC85UL }, /* fpgm */ + { 0x8272F416UL, 0x00000045UL } /* prep */ + }, + { /* DFHei-Md-HK-BF */ + { 0x1257EB46UL, 0x00000350UL }, /* cvt */ + { 0xF699D160UL, 0x0000715FUL }, /* fpgm */ + { 0xD222F568UL, 0x000003BCUL } /* prep */ + }, + { /* DFHSGothic-W5 */ + { 0x1262EB4EUL, 0x00000350UL }, /* cvt */ + { 0xE86A5D64UL, 0x00007940UL }, /* fpgm */ + { 0x7850F729UL, 0x000005FFUL } /* prep */ + }, + { /* DFHSMincho-W3 */ + { 0x122DEB0AUL, 0x00000350UL }, /* cvt */ + { 0x3D16328AUL, 0x0000859BUL }, /* fpgm */ + { 0xA93FC33BUL, 0x000002CBUL } /* prep */ + }, + { /* DFHSMincho-W7 */ + { 0x125FEB26UL, 0x00000350UL }, /* cvt */ + { 0xA5ACC982UL, 0x00007EE1UL }, /* fpgm */ + { 0x90999196UL, 0x0000041FUL } /* prep */ + }, + { /* DFKaiShu */ + { 0x11E5EAD4UL, 0x00000350UL }, /* cvt */ + { 0x5A30CA3BUL, 0x00009063UL }, /* fpgm */ + { 0x13A42602UL, 0x0000007EUL } /* prep */ + }, + { /* DFKaiShu, variant */ + { 0x11E5EAD4UL, 0x00000350UL }, /* cvt */ + { 0xA6E78C01UL, 0x00008998UL }, /* fpgm */ + { 0x13A42602UL, 0x0000007EUL } /* prep */ + }, + { /* DFKaiShu-Md-HK-BF */ + { 0x11E5EAD4UL, 0x00000360UL }, /* cvt */ + { 0x9DB282B2UL, 0x0000C06EUL }, /* fpgm */ + { 0x53E6D7CAUL, 0x00000082UL } /* prep */ + }, + { /* DFMing-Bd-HK-BF */ + { 0x1243EB18UL, 0x00000350UL }, /* cvt */ + { 0xBA0A8C30UL, 0x000074ADUL }, /* fpgm */ + { 0xF3D83409UL, 0x0000037BUL } /* prep */ + }, + { /* DLCLiShu */ + { 0x07DCF546UL, 0x00000308UL }, /* cvt */ + { 0x40FE7C90UL, 0x00008E2AUL }, /* fpgm */ + { 0x608174B5UL, 0x0000007AUL } /* prep */ + }, + { /* DLCHayBold */ + { 0xEB891238UL, 0x00000308UL }, /* cvt */ + { 0xD2E4DCD4UL, 0x0000676FUL }, /* fpgm */ + { 0x8EA5F293UL, 0x000003B8UL } /* prep */ + }, + { /* HuaTianKaiTi */ + { 0xFFFBFFFCUL, 0x00000008UL }, /* cvt */ + { 0x9C9E48B8UL, 0x0000BEA2UL }, /* fpgm */ + { 0x70020112UL, 0x00000008UL } /* prep */ + }, + { /* HuaTianSongTi */ + { 0xFFFBFFFCUL, 0x00000008UL }, /* cvt */ + { 0x0A5A0483UL, 0x00017C39UL }, /* fpgm */ + { 0x70020112UL, 0x00000008UL } /* prep */ + }, + { /* NEC fadpop7.ttf */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x40C92555UL, 0x000000E5UL }, /* fpgm */ + { 0xA39B58E3UL, 0x0000117CUL } /* prep */ + }, + { /* NEC fadrei5.ttf */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x33C41652UL, 0x000000E5UL }, /* fpgm */ + { 0x26D6C52AUL, 0x00000F6AUL } /* prep */ + }, + { /* NEC fangot7.ttf */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x6DB1651DUL, 0x0000019DUL }, /* fpgm */ + { 0x6C6E4B03UL, 0x00002492UL } /* prep */ + }, + { /* NEC fangyo5.ttf */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x40C92555UL, 0x000000E5UL }, /* fpgm */ + { 0xDE51FAD0UL, 0x0000117CUL } /* prep */ + }, + { /* NEC fankyo5.ttf */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x85E47664UL, 0x000000E5UL }, /* fpgm */ + { 0xA6C62831UL, 0x00001CAAUL } /* prep */ + }, + { /* NEC fanrgo5.ttf */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x2D891CFDUL, 0x0000019DUL }, /* fpgm */ + { 0xA0604633UL, 0x00001DE8UL } /* prep */ + }, + { /* NEC fangot5.ttc */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x40AA774CUL, 0x000001CBUL }, /* fpgm */ + { 0x9B5CAA96UL, 0x00001F9AUL } /* prep */ + }, + { /* NEC fanmin3.ttc */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x0D3DE9CBUL, 0x00000141UL }, /* fpgm */ + { 0xD4127766UL, 0x00002280UL } /* prep */ + }, + { /* NEC FA-Gothic, 1996 */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x4A692698UL, 0x000001F0UL }, /* fpgm */ + { 0x340D4346UL, 0x00001FCAUL } /* prep */ + }, + { /* NEC FA-Minchou, 1996 */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0xCD34C604UL, 0x00000166UL }, /* fpgm */ + { 0x6CF31046UL, 0x000022B0UL } /* prep */ + }, + { /* NEC FA-RoundGothicB, 1996 */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0x5DA75315UL, 0x0000019DUL }, /* fpgm */ + { 0x40745A5FUL, 0x000022E0UL } /* prep */ + }, + { /* NEC FA-RoundGothicM, 1996 */ + { 0x00000000UL, 0x00000000UL }, /* cvt */ + { 0xF055FC48UL, 0x000001C2UL }, /* fpgm */ + { 0x3900DED3UL, 0x00001E18UL } /* prep */ + }, + { /* MINGLI.TTF, 1992 */ + { 0x00170003UL, 0x00000060UL }, /* cvt */ + { 0xDBB4306EUL, 0x000058AAUL }, /* fpgm */ + { 0xD643482AUL, 0x00000035UL } /* prep */ + } + }; + + FT_ULong checksum; + int num_matched_ids[TRICK_SFNT_IDS_NUM_FACES]; + FT_Bool has_cvt, has_fpgm, has_prep; + FT_UShort i; + int j, k; + + + FT_MEM_SET( num_matched_ids, 0, + sizeof ( int ) * TRICK_SFNT_IDS_NUM_FACES ); + has_cvt = FALSE; + has_fpgm = FALSE; + has_prep = FALSE; + + for ( i = 0; i < face->num_tables; i++ ) + { + checksum = 0; + + switch( face->dir_tables[i].Tag ) + { + case TTAG_cvt: + k = TRICK_SFNT_ID_cvt; + has_cvt = TRUE; + break; + + case TTAG_fpgm: + k = TRICK_SFNT_ID_fpgm; + has_fpgm = TRUE; + break; + + case TTAG_prep: + k = TRICK_SFNT_ID_prep; + has_prep = TRUE; + break; + + default: + continue; + } + + for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ ) + if ( face->dir_tables[i].Length == sfnt_id[j][k].Length ) + { + if ( !checksum ) + checksum = tt_get_sfnt_checksum( face, i ); + + if ( sfnt_id[j][k].CheckSum == checksum ) + num_matched_ids[j]++; + + if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE ) + return TRUE; + } + } + + for ( j = 0; j < TRICK_SFNT_IDS_NUM_FACES; j++ ) + { + if ( !has_cvt && !sfnt_id[j][TRICK_SFNT_ID_cvt].Length ) + num_matched_ids[j]++; + if ( !has_fpgm && !sfnt_id[j][TRICK_SFNT_ID_fpgm].Length ) + num_matched_ids[j]++; + if ( !has_prep && !sfnt_id[j][TRICK_SFNT_ID_prep].Length ) + num_matched_ids[j]++; + if ( num_matched_ids[j] == TRICK_SFNT_IDS_PER_FACE ) + return TRUE; + } + + return FALSE; + } + + + static FT_Bool + tt_check_trickyness( FT_Face face ) + { + if ( !face ) + return FALSE; + + /* For first, check the face name for quick check. */ + if ( face->family_name && + tt_check_trickyness_family( face->family_name ) ) + return TRUE; + + /* Type42 fonts may lack `name' tables, we thus try to identify */ + /* tricky fonts by checking the checksums of Type42-persistent */ + /* sfnt tables (`cvt', `fpgm', and `prep'). */ + if ( tt_check_trickyness_sfnt_ids( (TT_Face)face ) ) + return TRUE; + + return FALSE; + } + + + /* Check whether `.notdef' is the only glyph in the `loca' table. */ + static FT_Bool + tt_check_single_notdef( FT_Face ttface ) + { + FT_Bool result = FALSE; + + TT_Face face = (TT_Face)ttface; + FT_UInt asize; + FT_ULong i; + FT_ULong glyph_index = 0; + FT_UInt count = 0; + + + for( i = 0; i < face->num_locations; i++ ) + { + tt_face_get_location( face, i, &asize ); + if ( asize > 0 ) + { + count += 1; + if ( count > 1 ) + break; + glyph_index = i; + } + } + + /* Only have a single outline. */ + if ( count == 1 ) + { + if ( glyph_index == 0 ) + result = TRUE; + else + { + /* FIXME: Need to test glyphname == .notdef ? */ + FT_Error error; + char buf[8]; + + + error = FT_Get_Glyph_Name( ttface, glyph_index, buf, 8 ); + if ( !error && + buf[0] == '.' && !ft_strncmp( buf, ".notdef", 8 ) ) + result = TRUE; + } + } + + return result; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_init */ + /* */ + /* */ + /* Initialize a given TrueType face object. */ + /* */ + /* */ + /* stream :: The source font stream. */ + /* */ + /* face_index :: The index of the TrueType font, if we are opening a */ + /* collection, in bits 0-15. The numbered instance */ + /* index~+~1 of a GX (sub)font, if applicable, in bits */ + /* 16-30. */ + /* */ + /* num_params :: Number of additional generic parameters. Ignored. */ + /* */ + /* params :: Additional generic parameters. Ignored. */ + /* */ + /* */ + /* face :: The newly built face object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_init( FT_Stream stream, + FT_Face ttface, /* TT_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ) + { + FT_Error error; + FT_Library library; + SFNT_Service sfnt; + TT_Face face = (TT_Face)ttface; + + + FT_TRACE2(( "TTF driver\n" )); + + library = ttface->driver->root.library; + + sfnt = (SFNT_Service)FT_Get_Module_Interface( library, "sfnt" ); + if ( !sfnt ) + { + FT_ERROR(( "tt_face_init: cannot access `sfnt' module\n" )); + error = FT_THROW( Missing_Module ); + goto Exit; + } + + /* create input stream from resource */ + if ( FT_STREAM_SEEK( 0 ) ) + goto Exit; + + /* check that we have a valid TrueType file */ + FT_TRACE2(( " " )); + error = sfnt->init_face( stream, face, face_index, num_params, params ); + + /* Stream may have changed. */ + stream = face->root.stream; + + if ( error ) + goto Exit; + + /* We must also be able to accept Mac/GX fonts, as well as OT ones. */ + /* The 0x00020000 tag is completely undocumented; some fonts from */ + /* Arphic made for Chinese Windows 3.1 have this. */ + if ( face->format_tag != 0x00010000L && /* MS fonts */ + face->format_tag != 0x00020000L && /* CJK fonts for Win 3.1 */ + face->format_tag != TTAG_true && /* Mac fonts */ + face->format_tag != TTAG_0xA5kbd && /* `Keyboard.dfont' (legacy Mac OS X) */ + face->format_tag != TTAG_0xA5lst ) /* `LastResort.dfont' (legacy Mac OS X) */ + { + FT_TRACE2(( " not a TTF font\n" )); + goto Bad_Format; + } + +#ifdef TT_USE_BYTECODE_INTERPRETER + ttface->face_flags |= FT_FACE_FLAG_HINTER; +#endif + + /* If we are performing a simple font format check, exit immediately. */ + if ( face_index < 0 ) + return FT_Err_Ok; + + /* Load font directory */ + error = sfnt->load_face( stream, face, face_index, num_params, params ); + if ( error ) + goto Exit; + + if ( tt_check_trickyness( ttface ) ) + ttface->face_flags |= FT_FACE_FLAG_TRICKY; + + error = tt_face_load_hdmx( face, stream ); + if ( error ) + goto Exit; + + if ( FT_IS_SCALABLE( ttface ) ) + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( !ttface->internal->incremental_interface ) +#endif + { + error = tt_face_load_loca( face, stream ); + + /* having a (non-zero) `glyf' table without */ + /* a `loca' table is not valid */ + if ( face->glyf_len && FT_ERR_EQ( error, Table_Missing ) ) + goto Exit; + if ( error ) + goto Exit; + } + + /* `fpgm', `cvt', and `prep' are optional */ + error = tt_face_load_cvt( face, stream ); + if ( error && FT_ERR_NEQ( error, Table_Missing ) ) + goto Exit; + + error = tt_face_load_fpgm( face, stream ); + if ( error && FT_ERR_NEQ( error, Table_Missing ) ) + goto Exit; + + error = tt_face_load_prep( face, stream ); + if ( error && FT_ERR_NEQ( error, Table_Missing ) ) + goto Exit; + + /* Check the scalable flag based on `loca'. */ +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( !ttface->internal->incremental_interface ) +#endif + { + if ( ttface->num_fixed_sizes && + face->glyph_locations && + tt_check_single_notdef( ttface ) ) + { + FT_TRACE5(( "tt_face_init:" + " Only the `.notdef' glyph has an outline.\n" + " " + " Resetting scalable flag to FALSE.\n" )); + + ttface->face_flags &= ~FT_FACE_FLAG_SCALABLE; + } + } + } + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + + { + FT_UInt instance_index = (FT_UInt)face_index >> 16; + + + if ( FT_HAS_MULTIPLE_MASTERS( ttface ) && + instance_index > 0 ) + { + error = TT_Set_Named_Instance( face, instance_index ); + if ( error ) + goto Exit; + + tt_apply_mvar( face ); + } + } + +#endif /* TT_CONFIG_OPTION_GX_VAR_SUPPORT */ + + /* initialize standard glyph loading routines */ + TT_Init_Glyph_Loading( face ); + + Exit: + return error; + + Bad_Format: + error = FT_THROW( Unknown_File_Format ); + goto Exit; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_done */ + /* */ + /* */ + /* Finalize a given face object. */ + /* */ + /* */ + /* face :: A pointer to the face object to destroy. */ + /* */ + FT_LOCAL_DEF( void ) + tt_face_done( FT_Face ttface ) /* TT_Face */ + { + TT_Face face = (TT_Face)ttface; + FT_Memory memory; + FT_Stream stream; + SFNT_Service sfnt; + + + if ( !face ) + return; + + memory = ttface->memory; + stream = ttface->stream; + sfnt = (SFNT_Service)face->sfnt; + + /* for `extended TrueType formats' (i.e. compressed versions) */ + if ( face->extra.finalizer ) + face->extra.finalizer( face->extra.data ); + + if ( sfnt ) + sfnt->done_face( face ); + + /* freeing the locations table */ + tt_face_done_loca( face ); + + tt_face_free_hdmx( face ); + + /* freeing the CVT */ + FT_FREE( face->cvt ); + face->cvt_size = 0; + + /* freeing the programs */ + FT_FRAME_RELEASE( face->font_program ); + FT_FRAME_RELEASE( face->cvt_program ); + face->font_program_size = 0; + face->cvt_program_size = 0; + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + tt_done_blend( face ); + face->blend = NULL; +#endif + } + + + /*************************************************************************/ + /* */ + /* SIZE FUNCTIONS */ + /* */ + /*************************************************************************/ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + /*************************************************************************/ + /* */ + /* */ + /* tt_size_run_fpgm */ + /* */ + /* */ + /* Run the font program. */ + /* */ + /* */ + /* size :: A handle to the size object. */ + /* */ + /* pedantic :: Set if bytecode execution should be pedantic. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_run_fpgm( TT_Size size, + FT_Bool pedantic ) + { + TT_Face face = (TT_Face)size->root.face; + TT_ExecContext exec; + FT_Error error; + + + exec = size->context; + + error = TT_Load_Context( exec, face, size ); + if ( error ) + return error; + + exec->callTop = 0; + exec->top = 0; + + exec->period = 64; + exec->phase = 0; + exec->threshold = 0; + + exec->instruction_trap = FALSE; + exec->F_dot_P = 0x4000L; + + exec->pedantic_hinting = pedantic; + + { + FT_Size_Metrics* size_metrics = &exec->metrics; + TT_Size_Metrics* tt_metrics = &exec->tt_metrics; + + + size_metrics->x_ppem = 0; + size_metrics->y_ppem = 0; + size_metrics->x_scale = 0; + size_metrics->y_scale = 0; + + tt_metrics->ppem = 0; + tt_metrics->scale = 0; + tt_metrics->ratio = 0x10000L; + } + + /* allow font program execution */ + TT_Set_CodeRange( exec, + tt_coderange_font, + face->font_program, + (FT_Long)face->font_program_size ); + + /* disable CVT and glyph programs coderange */ + TT_Clear_CodeRange( exec, tt_coderange_cvt ); + TT_Clear_CodeRange( exec, tt_coderange_glyph ); + + if ( face->font_program_size > 0 ) + { + TT_Goto_CodeRange( exec, tt_coderange_font, 0 ); + + FT_TRACE4(( "Executing `fpgm' table.\n" )); + error = face->interpreter( exec ); +#ifdef FT_DEBUG_LEVEL_TRACE + if ( error ) + FT_TRACE4(( " interpretation failed with error code 0x%x\n", + error )); +#endif + } + else + error = FT_Err_Ok; + + size->bytecode_ready = error; + + if ( !error ) + TT_Save_Context( exec, size ); + + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_size_run_prep */ + /* */ + /* */ + /* Run the control value program. */ + /* */ + /* */ + /* size :: A handle to the size object. */ + /* */ + /* pedantic :: Set if bytecode execution should be pedantic. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_run_prep( TT_Size size, + FT_Bool pedantic ) + { + TT_Face face = (TT_Face)size->root.face; + TT_ExecContext exec; + FT_Error error; + + + exec = size->context; + + error = TT_Load_Context( exec, face, size ); + if ( error ) + return error; + + exec->callTop = 0; + exec->top = 0; + + exec->instruction_trap = FALSE; + + exec->pedantic_hinting = pedantic; + + TT_Set_CodeRange( exec, + tt_coderange_cvt, + face->cvt_program, + (FT_Long)face->cvt_program_size ); + + TT_Clear_CodeRange( exec, tt_coderange_glyph ); + + if ( face->cvt_program_size > 0 ) + { + TT_Goto_CodeRange( exec, tt_coderange_cvt, 0 ); + + FT_TRACE4(( "Executing `prep' table.\n" )); + error = face->interpreter( exec ); +#ifdef FT_DEBUG_LEVEL_TRACE + if ( error ) + FT_TRACE4(( " interpretation failed with error code 0x%x\n", + error )); +#endif + } + else + error = FT_Err_Ok; + + size->cvt_ready = error; + + /* UNDOCUMENTED! The MS rasterizer doesn't allow the following */ + /* graphics state variables to be modified by the CVT program. */ + + exec->GS.dualVector.x = 0x4000; + exec->GS.dualVector.y = 0; + exec->GS.projVector.x = 0x4000; + exec->GS.projVector.y = 0x0; + exec->GS.freeVector.x = 0x4000; + exec->GS.freeVector.y = 0x0; + + exec->GS.rp0 = 0; + exec->GS.rp1 = 0; + exec->GS.rp2 = 0; + + exec->GS.gep0 = 1; + exec->GS.gep1 = 1; + exec->GS.gep2 = 1; + + exec->GS.loop = 1; + + /* save as default graphics state */ + size->GS = exec->GS; + + TT_Save_Context( exec, size ); + + return error; + } + + + static void + tt_size_done_bytecode( FT_Size ftsize ) + { + TT_Size size = (TT_Size)ftsize; + TT_Face face = (TT_Face)ftsize->face; + FT_Memory memory = face->root.memory; + + if ( size->context ) + { + TT_Done_Context( size->context ); + size->context = NULL; + } + + FT_FREE( size->cvt ); + size->cvt_size = 0; + + /* free storage area */ + FT_FREE( size->storage ); + size->storage_size = 0; + + /* twilight zone */ + tt_glyphzone_done( &size->twilight ); + + FT_FREE( size->function_defs ); + FT_FREE( size->instruction_defs ); + + size->num_function_defs = 0; + size->max_function_defs = 0; + size->num_instruction_defs = 0; + size->max_instruction_defs = 0; + + size->max_func = 0; + size->max_ins = 0; + + size->bytecode_ready = -1; + size->cvt_ready = -1; + } + + + /* Initialize bytecode-related fields in the size object. */ + /* We do this only if bytecode interpretation is really needed. */ + static FT_Error + tt_size_init_bytecode( FT_Size ftsize, + FT_Bool pedantic ) + { + FT_Error error; + TT_Size size = (TT_Size)ftsize; + TT_Face face = (TT_Face)ftsize->face; + FT_Memory memory = face->root.memory; + + FT_UShort n_twilight; + TT_MaxProfile* maxp = &face->max_profile; + + + /* clean up bytecode related data */ + FT_FREE( size->function_defs ); + FT_FREE( size->instruction_defs ); + FT_FREE( size->cvt ); + FT_FREE( size->storage ); + + if ( size->context ) + TT_Done_Context( size->context ); + tt_glyphzone_done( &size->twilight ); + + size->bytecode_ready = -1; + size->cvt_ready = -1; + + size->context = TT_New_Context( (TT_Driver)face->root.driver ); + + size->max_function_defs = maxp->maxFunctionDefs; + size->max_instruction_defs = maxp->maxInstructionDefs; + + size->num_function_defs = 0; + size->num_instruction_defs = 0; + + size->max_func = 0; + size->max_ins = 0; + + size->cvt_size = face->cvt_size; + size->storage_size = maxp->maxStorage; + + /* Set default metrics */ + { + TT_Size_Metrics* tt_metrics = &size->ttmetrics; + + + tt_metrics->rotated = FALSE; + tt_metrics->stretched = FALSE; + + /* set default engine compensation */ + tt_metrics->compensations[0] = 0; /* gray */ + tt_metrics->compensations[1] = 0; /* black */ + tt_metrics->compensations[2] = 0; /* white */ + tt_metrics->compensations[3] = 0; /* reserved */ + } + + /* allocate function defs, instruction defs, cvt, and storage area */ + if ( FT_NEW_ARRAY( size->function_defs, size->max_function_defs ) || + FT_NEW_ARRAY( size->instruction_defs, size->max_instruction_defs ) || + FT_NEW_ARRAY( size->cvt, size->cvt_size ) || + FT_NEW_ARRAY( size->storage, size->storage_size ) ) + goto Exit; + + /* reserve twilight zone */ + n_twilight = maxp->maxTwilightPoints; + + /* there are 4 phantom points (do we need this?) */ + n_twilight += 4; + + error = tt_glyphzone_new( memory, n_twilight, 0, &size->twilight ); + if ( error ) + goto Exit; + + size->twilight.n_points = n_twilight; + + size->GS = tt_default_graphics_state; + + /* set `face->interpreter' according to the debug hook present */ + { + FT_Library library = face->root.driver->root.library; + + + face->interpreter = (TT_Interpreter) + library->debug_hooks[FT_DEBUG_HOOK_TRUETYPE]; + if ( !face->interpreter ) + face->interpreter = (TT_Interpreter)TT_RunIns; + } + + /* Fine, now run the font program! */ + + /* In case of an error while executing `fpgm', we intentionally don't */ + /* clean up immediately – bugs in the `fpgm' are so fundamental that */ + /* all following hinting calls should fail. Additionally, `fpgm' is */ + /* to be executed just once; calling it again is completely useless */ + /* and might even lead to extremely slow behaviour if it is malformed */ + /* (containing an infinite loop, for example). */ + error = tt_size_run_fpgm( size, pedantic ); + return error; + + Exit: + if ( error ) + tt_size_done_bytecode( ftsize ); + + return error; + } + + + FT_LOCAL_DEF( FT_Error ) + tt_size_ready_bytecode( TT_Size size, + FT_Bool pedantic ) + { + FT_Error error = FT_Err_Ok; + + + if ( size->bytecode_ready < 0 ) + error = tt_size_init_bytecode( (FT_Size)size, pedantic ); + else + error = size->bytecode_ready; + + if ( error ) + goto Exit; + + /* rescale CVT when needed */ + if ( size->cvt_ready < 0 ) + { + FT_UInt i; + TT_Face face = (TT_Face)size->root.face; + + + /* Scale the cvt values to the new ppem. */ + /* We use by default the y ppem to scale the CVT. */ + for ( i = 0; i < size->cvt_size; i++ ) + size->cvt[i] = FT_MulFix( face->cvt[i], size->ttmetrics.scale ); + + /* all twilight points are originally zero */ + for ( i = 0; i < (FT_UInt)size->twilight.n_points; i++ ) + { + size->twilight.org[i].x = 0; + size->twilight.org[i].y = 0; + size->twilight.cur[i].x = 0; + size->twilight.cur[i].y = 0; + } + + /* clear storage area */ + for ( i = 0; i < (FT_UInt)size->storage_size; i++ ) + size->storage[i] = 0; + + size->GS = tt_default_graphics_state; + + error = tt_size_run_prep( size, pedantic ); + } + else + error = size->cvt_ready; + + Exit: + return error; + } + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + /*************************************************************************/ + /* */ + /* */ + /* tt_size_init */ + /* */ + /* */ + /* Initialize a new TrueType size object. */ + /* */ + /* */ + /* size :: A handle to the size object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_init( FT_Size ttsize ) /* TT_Size */ + { + TT_Size size = (TT_Size)ttsize; + FT_Error error = FT_Err_Ok; + + +#ifdef TT_USE_BYTECODE_INTERPRETER + size->bytecode_ready = -1; + size->cvt_ready = -1; +#endif + + size->ttmetrics.valid = FALSE; + size->strike_index = 0xFFFFFFFFUL; + + return error; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_size_done */ + /* */ + /* */ + /* The TrueType size object finalizer. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + FT_LOCAL_DEF( void ) + tt_size_done( FT_Size ttsize ) /* TT_Size */ + { + TT_Size size = (TT_Size)ttsize; + + +#ifdef TT_USE_BYTECODE_INTERPRETER + tt_size_done_bytecode( ttsize ); +#endif + + size->ttmetrics.valid = FALSE; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_size_reset */ + /* */ + /* */ + /* Reset a TrueType size when resolutions and character dimensions */ + /* have been changed. */ + /* */ + /* */ + /* size :: A handle to the target size object. */ + /* */ + /* only_height :: Only recompute ascender, descender, and height; */ + /* this flag is used for variation fonts where */ + /* `tt_size_reset' is used as an iterator function. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_size_reset( TT_Size size, + FT_Bool only_height ) + { + TT_Face face; + FT_Size_Metrics* size_metrics; + + + face = (TT_Face)size->root.face; + + /* nothing to do for CFF2 */ + if ( face->is_cff2 ) + return FT_Err_Ok; + + size->ttmetrics.valid = FALSE; + + size_metrics = &size->hinted_metrics; + + /* copy the result from base layer */ + *size_metrics = size->root.metrics; + + if ( size_metrics->x_ppem < 1 || size_metrics->y_ppem < 1 ) + return FT_THROW( Invalid_PPem ); + + /* This bit flag, if set, indicates that the ppems must be */ + /* rounded to integers. Nearly all TrueType fonts have this bit */ + /* set, as hinting won't work really well otherwise. */ + /* */ + if ( face->header.Flags & 8 ) + { + /* the TT spec always asks for ROUND, not FLOOR or CEIL */ + size_metrics->ascender = FT_PIX_ROUND( + FT_MulFix( face->root.ascender, + size_metrics->y_scale ) ); + size_metrics->descender = FT_PIX_ROUND( + FT_MulFix( face->root.descender, + size_metrics->y_scale ) ); + size_metrics->height = FT_PIX_ROUND( + FT_MulFix( face->root.height, + size_metrics->y_scale ) ); + } + + size->ttmetrics.valid = TRUE; + + if ( only_height ) + { + /* we must not recompute the scaling values here since */ + /* `tt_size_reset' was already called (with only_height = 0) */ + return FT_Err_Ok; + } + + if ( face->header.Flags & 8 ) + { + /* base scaling values on integer ppem values, */ + /* as mandated by the TrueType specification */ + size_metrics->x_scale = FT_DivFix( size_metrics->x_ppem << 6, + face->root.units_per_EM ); + size_metrics->y_scale = FT_DivFix( size_metrics->y_ppem << 6, + face->root.units_per_EM ); + + size_metrics->max_advance = FT_PIX_ROUND( + FT_MulFix( face->root.max_advance_width, + size_metrics->x_scale ) ); + } + + /* compute new transformation */ + if ( size_metrics->x_ppem >= size_metrics->y_ppem ) + { + size->ttmetrics.scale = size_metrics->x_scale; + size->ttmetrics.ppem = size_metrics->x_ppem; + size->ttmetrics.x_ratio = 0x10000L; + size->ttmetrics.y_ratio = FT_DivFix( size_metrics->y_ppem, + size_metrics->x_ppem ); + } + else + { + size->ttmetrics.scale = size_metrics->y_scale; + size->ttmetrics.ppem = size_metrics->y_ppem; + size->ttmetrics.x_ratio = FT_DivFix( size_metrics->x_ppem, + size_metrics->y_ppem ); + size->ttmetrics.y_ratio = 0x10000L; + } + + size->metrics = size_metrics; + +#ifdef TT_USE_BYTECODE_INTERPRETER + size->cvt_ready = -1; +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_driver_init */ + /* */ + /* */ + /* Initialize a given TrueType driver object. */ + /* */ + /* */ + /* driver :: A handle to the target driver object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_driver_init( FT_Module ttdriver ) /* TT_Driver */ + { + +#ifdef TT_USE_BYTECODE_INTERPRETER + + TT_Driver driver = (TT_Driver)ttdriver; + + driver->interpreter_version = TT_INTERPRETER_VERSION_35; +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + driver->interpreter_version = TT_INTERPRETER_VERSION_38; +#endif +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL + driver->interpreter_version = TT_INTERPRETER_VERSION_40; +#endif + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( ttdriver ); + +#endif /* !TT_USE_BYTECODE_INTERPRETER */ + + return FT_Err_Ok; + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_driver_done */ + /* */ + /* */ + /* Finalize a given TrueType driver. */ + /* */ + /* */ + /* driver :: A handle to the target TrueType driver. */ + /* */ + FT_LOCAL_DEF( void ) + tt_driver_done( FT_Module ttdriver ) /* TT_Driver */ + { + FT_UNUSED( ttdriver ); + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_slot_init */ + /* */ + /* */ + /* Initialize a new slot object. */ + /* */ + /* */ + /* slot :: A handle to the slot object. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_slot_init( FT_GlyphSlot slot ) + { + return FT_GlyphLoader_CreateExtra( slot->internal->loader ); + } + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttobjs.h b/vendor/FreeType2/src/truetype/ttobjs.h new file mode 100644 index 0000000..38fa30e --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttobjs.h @@ -0,0 +1,425 @@ +/***************************************************************************/ +/* */ +/* ttobjs.h */ +/* */ +/* Objects manager (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTOBJS_H_ +#define TTOBJS_H_ + + +#include +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + /*************************************************************************/ + /* */ + /* */ + /* TT_Driver */ + /* */ + /* */ + /* A handle to a TrueType driver object. */ + /* */ + typedef struct TT_DriverRec_* TT_Driver; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_GlyphSlot */ + /* */ + /* */ + /* A handle to a TrueType glyph slot object. */ + /* */ + /* */ + /* This is a direct typedef of FT_GlyphSlot, as there is nothing */ + /* specific about the TrueType glyph slot. */ + /* */ + typedef FT_GlyphSlot TT_GlyphSlot; + + + /*************************************************************************/ + /* */ + /* */ + /* TT_GraphicsState */ + /* */ + /* */ + /* The TrueType graphics state used during bytecode interpretation. */ + /* */ + typedef struct TT_GraphicsState_ + { + FT_UShort rp0; + FT_UShort rp1; + FT_UShort rp2; + + FT_UnitVector dualVector; + FT_UnitVector projVector; + FT_UnitVector freeVector; + + FT_Long loop; + FT_F26Dot6 minimum_distance; + FT_Int round_state; + + FT_Bool auto_flip; + FT_F26Dot6 control_value_cutin; + FT_F26Dot6 single_width_cutin; + FT_F26Dot6 single_width_value; + FT_UShort delta_base; + FT_UShort delta_shift; + + FT_Byte instruct_control; + /* According to Greg Hitchcock from Microsoft, the `scan_control' */ + /* variable as documented in the TrueType specification is a 32-bit */ + /* integer; the high-word part holds the SCANTYPE value, the low-word */ + /* part the SCANCTRL value. We separate it into two fields. */ + FT_Bool scan_control; + FT_Int scan_type; + + FT_UShort gep0; + FT_UShort gep1; + FT_UShort gep2; + + } TT_GraphicsState; + + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_LOCAL( void ) + tt_glyphzone_done( TT_GlyphZone zone ); + + FT_LOCAL( FT_Error ) + tt_glyphzone_new( FT_Memory memory, + FT_UShort maxPoints, + FT_Short maxContours, + TT_GlyphZone zone ); + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + + + /*************************************************************************/ + /* */ + /* EXECUTION SUBTABLES */ + /* */ + /* These sub-tables relate to instruction execution. */ + /* */ + /*************************************************************************/ + + +#define TT_MAX_CODE_RANGES 3 + + + /*************************************************************************/ + /* */ + /* There can only be 3 active code ranges at once: */ + /* - the Font Program */ + /* - the CVT Program */ + /* - a glyph's instructions set */ + /* */ + typedef enum TT_CodeRange_Tag_ + { + tt_coderange_none = 0, + tt_coderange_font, + tt_coderange_cvt, + tt_coderange_glyph + + } TT_CodeRange_Tag; + + + typedef struct TT_CodeRange_ + { + FT_Byte* base; + FT_Long size; + + } TT_CodeRange; + + typedef TT_CodeRange TT_CodeRangeTable[TT_MAX_CODE_RANGES]; + + + /*************************************************************************/ + /* */ + /* Defines a function/instruction definition record. */ + /* */ + typedef struct TT_DefRecord_ + { + FT_Int range; /* in which code range is it located? */ + FT_Long start; /* where does it start? */ + FT_Long end; /* where does it end? */ + FT_UInt opc; /* function #, or instruction code */ + FT_Bool active; /* is it active? */ + FT_Bool inline_delta; /* is function that defines inline delta? */ + FT_ULong sph_fdef_flags; /* flags to identify special functions */ + + } TT_DefRecord, *TT_DefArray; + + + /*************************************************************************/ + /* */ + /* Subglyph transformation record. */ + /* */ + typedef struct TT_Transform_ + { + FT_Fixed xx, xy; /* transformation matrix coefficients */ + FT_Fixed yx, yy; + FT_F26Dot6 ox, oy; /* offsets */ + + } TT_Transform; + + + /*************************************************************************/ + /* */ + /* A note regarding non-squared pixels: */ + /* */ + /* (This text will probably go into some docs at some time; for now, it */ + /* is kept here to explain some definitions in the TT_Size_Metrics */ + /* record). */ + /* */ + /* The CVT is a one-dimensional array containing values that control */ + /* certain important characteristics in a font, like the height of all */ + /* capitals, all lowercase letter, default spacing or stem width/height. */ + /* */ + /* These values are found in FUnits in the font file, and must be scaled */ + /* to pixel coordinates before being used by the CVT and glyph programs. */ + /* Unfortunately, when using distinct x and y resolutions (or distinct x */ + /* and y pointsizes), there are two possible scalings. */ + /* */ + /* A first try was to implement a `lazy' scheme where all values were */ + /* scaled when first used. However, while some values are always used */ + /* in the same direction, some others are used under many different */ + /* circumstances and orientations. */ + /* */ + /* I have found a simpler way to do the same, and it even seems to work */ + /* in most of the cases: */ + /* */ + /* - All CVT values are scaled to the maximum ppem size. */ + /* */ + /* - When performing a read or write in the CVT, a ratio factor is used */ + /* to perform adequate scaling. Example: */ + /* */ + /* x_ppem = 14 */ + /* y_ppem = 10 */ + /* */ + /* We choose ppem = x_ppem = 14 as the CVT scaling size. All cvt */ + /* entries are scaled to it. */ + /* */ + /* x_ratio = 1.0 */ + /* y_ratio = y_ppem/ppem (< 1.0) */ + /* */ + /* We compute the current ratio like: */ + /* */ + /* - If projVector is horizontal, */ + /* ratio = x_ratio = 1.0 */ + /* */ + /* - if projVector is vertical, */ + /* ratio = y_ratio */ + /* */ + /* - else, */ + /* ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */ + /* */ + /* Reading a cvt value returns */ + /* ratio * cvt[index] */ + /* */ + /* Writing a cvt value in pixels: */ + /* cvt[index] / ratio */ + /* */ + /* The current ppem is simply */ + /* ratio * ppem */ + /* */ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Metrics used by the TrueType size and context objects. */ + /* */ + typedef struct TT_Size_Metrics_ + { + /* for non-square pixels */ + FT_Long x_ratio; + FT_Long y_ratio; + + FT_UShort ppem; /* maximum ppem size */ + FT_Long ratio; /* current ratio */ + FT_Fixed scale; + + FT_F26Dot6 compensations[4]; /* device-specific compensations */ + + FT_Bool valid; + + FT_Bool rotated; /* `is the glyph rotated?'-flag */ + FT_Bool stretched; /* `is the glyph stretched?'-flag */ + + } TT_Size_Metrics; + + + /*************************************************************************/ + /* */ + /* TrueType size class. */ + /* */ + typedef struct TT_SizeRec_ + { + FT_SizeRec root; + + /* we have our own copy of metrics so that we can modify */ + /* it without affecting auto-hinting (when used) */ + FT_Size_Metrics* metrics; /* for the current rendering mode */ + FT_Size_Metrics hinted_metrics; /* for the hinted rendering mode */ + + TT_Size_Metrics ttmetrics; + + FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Long point_size; /* for the `MPS' bytecode instruction */ + + FT_UInt num_function_defs; /* number of function definitions */ + FT_UInt max_function_defs; + TT_DefArray function_defs; /* table of function definitions */ + + FT_UInt num_instruction_defs; /* number of ins. definitions */ + FT_UInt max_instruction_defs; + TT_DefArray instruction_defs; /* table of ins. definitions */ + + FT_UInt max_func; + FT_UInt max_ins; + + TT_CodeRangeTable codeRangeTable; + + TT_GraphicsState GS; + + FT_ULong cvt_size; /* the scaled control value table */ + FT_Long* cvt; + + FT_UShort storage_size; /* The storage area is now part of */ + FT_Long* storage; /* the instance */ + + TT_GlyphZoneRec twilight; /* The instance's twilight zone */ + + TT_ExecContext context; + + /* if negative, `fpgm' (resp. `prep'), wasn't executed yet; */ + /* otherwise it is the returned error code */ + FT_Error bytecode_ready; + FT_Error cvt_ready; + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + } TT_SizeRec; + + + /*************************************************************************/ + /* */ + /* TrueType driver class. */ + /* */ + typedef struct TT_DriverRec_ + { + FT_DriverRec root; + + TT_GlyphZoneRec zone; /* glyph loader points zone */ + + FT_UInt interpreter_version; + + } TT_DriverRec; + + + /* Note: All of the functions below (except tt_size_reset()) are used */ + /* as function pointers in a FT_Driver_ClassRec. Therefore their */ + /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face, */ + /* TT_Size, etc., so that the compiler can confirm that the types and */ + /* number of parameters are correct. In all cases the FT_xxx types are */ + /* cast to their TT_xxx counterparts inside the functions since FreeType */ + /* will always use the TT driver to create them. */ + + + /*************************************************************************/ + /* */ + /* Face functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_face_init( FT_Stream stream, + FT_Face ttface, /* TT_Face */ + FT_Int face_index, + FT_Int num_params, + FT_Parameter* params ); + + FT_LOCAL( void ) + tt_face_done( FT_Face ttface ); /* TT_Face */ + + + /*************************************************************************/ + /* */ + /* Size functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_size_init( FT_Size ttsize ); /* TT_Size */ + + FT_LOCAL( void ) + tt_size_done( FT_Size ttsize ); /* TT_Size */ + +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_LOCAL( FT_Error ) + tt_size_run_fpgm( TT_Size size, + FT_Bool pedantic ); + + FT_LOCAL( FT_Error ) + tt_size_run_prep( TT_Size size, + FT_Bool pedantic ); + + FT_LOCAL( FT_Error ) + tt_size_ready_bytecode( TT_Size size, + FT_Bool pedantic ); + +#endif /* TT_USE_BYTECODE_INTERPRETER */ + + FT_LOCAL( FT_Error ) + tt_size_reset( TT_Size size, + FT_Bool only_height ); + + + /*************************************************************************/ + /* */ + /* Driver functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_driver_init( FT_Module ttdriver ); /* TT_Driver */ + + FT_LOCAL( void ) + tt_driver_done( FT_Module ttdriver ); /* TT_Driver */ + + + /*************************************************************************/ + /* */ + /* Slot functions */ + /* */ + FT_LOCAL( FT_Error ) + tt_slot_init( FT_GlyphSlot slot ); + + + /* auxiliary */ +#define IS_HINTED( flags ) ( ( flags & FT_LOAD_NO_HINTING ) == 0 ) + + +FT_END_HEADER + +#endif /* TTOBJS_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttpic.c b/vendor/FreeType2/src/truetype/ttpic.c new file mode 100644 index 0000000..cdbb806 --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttpic.c @@ -0,0 +1,101 @@ +/***************************************************************************/ +/* */ +/* ttpic.c */ +/* */ +/* The FreeType position independent code services for truetype module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_FREETYPE_H +#include FT_INTERNAL_OBJECTS_H +#include "ttpic.h" +#include "tterrors.h" + + +#ifdef FT_CONFIG_OPTION_PIC + + /* forward declaration of PIC init functions from ttdriver.c */ + FT_Error + FT_Create_Class_tt_services( FT_Library library, + FT_ServiceDescRec** output_class ); + void + FT_Destroy_Class_tt_services( FT_Library library, + FT_ServiceDescRec* clazz ); + void + FT_Init_Class_tt_service_gx_multi_masters( + FT_Service_MultiMastersRec* sv_mm ); + void + FT_Init_Class_tt_service_truetype_glyf( + FT_Service_TTGlyfRec* sv_ttglyf ); + + + void + tt_driver_class_pic_free( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Memory memory = library->memory; + + + if ( pic_container->truetype ) + { + TTModulePIC* container = (TTModulePIC*)pic_container->truetype; + + + if ( container->tt_services ) + FT_Destroy_Class_tt_services( library, container->tt_services ); + container->tt_services = NULL; + FT_FREE( container ); + pic_container->truetype = NULL; + } + } + + + FT_Error + tt_driver_class_pic_init( FT_Library library ) + { + FT_PIC_Container* pic_container = &library->pic_container; + FT_Error error = FT_Err_Ok; + TTModulePIC* container = NULL; + FT_Memory memory = library->memory; + + + /* allocate pointer, clear and set global container pointer */ + if ( FT_ALLOC( container, sizeof ( *container ) ) ) + return error; + FT_MEM_SET( container, 0, sizeof ( *container ) ); + pic_container->truetype = container; + + /* initialize pointer table - this is how the module usually */ + /* expects this data */ + error = FT_Create_Class_tt_services( library, + &container->tt_services ); + if ( error ) + goto Exit; +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Init_Class_tt_service_gx_multi_masters( + &container->tt_service_gx_multi_masters ); +#endif + FT_Init_Class_tt_service_truetype_glyf( + &container->tt_service_truetype_glyf ); + + Exit: + if ( error ) + tt_driver_class_pic_free( library ); + return error; + } + +#endif /* FT_CONFIG_OPTION_PIC */ + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttpic.h b/vendor/FreeType2/src/truetype/ttpic.h new file mode 100644 index 0000000..df878ae --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttpic.h @@ -0,0 +1,88 @@ +/***************************************************************************/ +/* */ +/* ttpic.h */ +/* */ +/* The FreeType position independent code services for truetype module. */ +/* */ +/* Copyright 2009-2018 by */ +/* Oran Agra and Mickey Gabel. */ +/* */ +/* 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 TTPIC_H_ +#define TTPIC_H_ + + +#include FT_INTERNAL_PIC_H + + +#ifndef FT_CONFIG_OPTION_PIC + +#define TT_SERVICES_GET tt_services +#define TT_SERVICE_GX_MULTI_MASTERS_GET tt_service_gx_multi_masters +#define TT_SERVICE_METRICS_VARIATIONS_GET tt_service_metrics_variations +#define TT_SERVICE_TRUETYPE_GLYF_GET tt_service_truetype_glyf +#define TT_SERVICE_PROPERTIES_GET tt_service_properties + +#else /* FT_CONFIG_OPTION_PIC */ + +#include FT_MULTIPLE_MASTERS_H +#include FT_SERVICE_MULTIPLE_MASTERS_H +#include FT_SERVICE_METRICS_VARIATIONS_H +#include FT_SERVICE_TRUETYPE_GLYF_H +#include FT_SERVICE_PROPERTIES_H + + +FT_BEGIN_HEADER + + typedef struct TTModulePIC_ + { + FT_ServiceDescRec* tt_services; +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + FT_Service_MultiMastersRec tt_service_gx_multi_masters; + FT_Service_MetricsVariationsRec tt_service_metrics_variations; +#endif + FT_Service_TTGlyfRec tt_service_truetype_glyf; + FT_Service_PropertiesRec tt_service_properties; + + } TTModulePIC; + + +#define GET_PIC( lib ) \ + ( (TTModulePIC*)((lib)->pic_container.truetype) ) +#define TT_SERVICES_GET \ + ( GET_PIC( library )->tt_services ) +#define TT_SERVICE_METRICS_VARIATIONS_GET \ + ( GET_PIC( library )->tt_service_metrics_variations ) +#define TT_SERVICE_GX_MULTI_MASTERS_GET \ + ( GET_PIC( library )->tt_service_gx_multi_masters ) +#define TT_SERVICE_TRUETYPE_GLYF_GET \ + ( GET_PIC( library )->tt_service_truetype_glyf ) +#define TT_SERVICE_PROPERTIES_GET \ + ( GET_PIC( library )->tt_service_properties ) + + + /* see ttpic.c for the implementation */ + void + tt_driver_class_pic_free( FT_Library library ); + + FT_Error + tt_driver_class_pic_init( FT_Library library ); + +FT_END_HEADER + +#endif /* FT_CONFIG_OPTION_PIC */ + + /* */ + +#endif /* TTPIC_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttpload.c b/vendor/FreeType2/src/truetype/ttpload.c new file mode 100644 index 0000000..d9526ad --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttpload.c @@ -0,0 +1,642 @@ +/***************************************************************************/ +/* */ +/* ttpload.c */ +/* */ +/* TrueType-specific tables loader (body). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_OBJECTS_H +#include FT_INTERNAL_STREAM_H +#include FT_TRUETYPE_TAGS_H + +#include "ttpload.h" + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT +#include "ttgxvar.h" +#endif + +#include "tterrors.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_ttpload + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_loca */ + /* */ + /* */ + /* Load the locations table. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: The input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_loca( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_ULong table_len; + FT_Int shift; + + + /* we need the size of the `glyf' table for malformed `loca' tables */ + error = face->goto_table( face, TTAG_glyf, stream, &face->glyf_len ); + + /* it is possible that a font doesn't have a glyf table at all */ + /* or its size is zero */ + if ( FT_ERR_EQ( error, Table_Missing ) ) + { + face->glyf_len = 0; + face->glyf_offset = 0; + } + else if ( error ) + goto Exit; + else + { +#ifdef FT_CONFIG_OPTION_INCREMENTAL + if ( face->root.internal->incremental_interface ) + face->glyf_offset = 0; + else +#endif + face->glyf_offset = FT_STREAM_POS(); + } + + FT_TRACE2(( "Locations " )); + error = face->goto_table( face, TTAG_loca, stream, &table_len ); + if ( error ) + { + error = FT_THROW( Locations_Missing ); + goto Exit; + } + + if ( face->header.Index_To_Loc_Format != 0 ) + { + shift = 2; + + if ( table_len >= 0x40000L ) + { + FT_TRACE2(( "table too large\n" )); + table_len = 0x3FFFFL; + } + face->num_locations = table_len >> shift; + } + else + { + shift = 1; + + if ( table_len >= 0x20000L ) + { + FT_TRACE2(( "table too large\n" )); + table_len = 0x1FFFFL; + } + face->num_locations = table_len >> shift; + } + + if ( face->num_locations != (FT_ULong)face->root.num_glyphs + 1 ) + { + FT_TRACE2(( "glyph count mismatch! loca: %d, maxp: %d\n", + face->num_locations - 1, face->root.num_glyphs )); + + /* we only handle the case where `maxp' gives a larger value */ + if ( face->num_locations <= (FT_ULong)face->root.num_glyphs ) + { + FT_ULong new_loca_len = + ( (FT_ULong)face->root.num_glyphs + 1 ) << shift; + + TT_Table entry = face->dir_tables; + TT_Table limit = entry + face->num_tables; + + FT_Long pos = (FT_Long)FT_STREAM_POS(); + FT_Long dist = 0x7FFFFFFFL; + FT_Bool found = 0; + + + /* compute the distance to next table in font file */ + for ( ; entry < limit; entry++ ) + { + FT_Long diff = (FT_Long)entry->Offset - pos; + + + if ( diff > 0 && diff < dist ) + { + dist = diff; + found = 1; + } + } + + if ( !found ) + { + /* `loca' is the last table */ + dist = (FT_Long)stream->size - pos; + } + + if ( new_loca_len <= (FT_ULong)dist ) + { + face->num_locations = (FT_ULong)face->root.num_glyphs + 1; + table_len = new_loca_len; + + FT_TRACE2(( "adjusting num_locations to %d\n", + face->num_locations )); + } + else + { + face->root.num_glyphs = face->num_locations + ? (FT_Long)face->num_locations - 1 : 0; + + FT_TRACE2(( "adjusting num_glyphs to %d\n", + face->root.num_glyphs )); + } + } + } + + /* + * Extract the frame. We don't need to decompress it since + * we are able to parse it directly. + */ + if ( FT_FRAME_EXTRACT( table_len, face->glyph_locations ) ) + goto Exit; + + FT_TRACE2(( "loaded\n" )); + + Exit: + return error; + } + + + FT_LOCAL_DEF( FT_ULong ) + tt_face_get_location( TT_Face face, + FT_UInt gindex, + FT_UInt *asize ) + { + FT_ULong pos1, pos2; + FT_Byte* p; + FT_Byte* p_limit; + + + pos1 = pos2 = 0; + + if ( gindex < face->num_locations ) + { + if ( face->header.Index_To_Loc_Format != 0 ) + { + p = face->glyph_locations + gindex * 4; + p_limit = face->glyph_locations + face->num_locations * 4; + + pos1 = FT_NEXT_ULONG( p ); + pos2 = pos1; + + if ( p + 4 <= p_limit ) + pos2 = FT_NEXT_ULONG( p ); + } + else + { + p = face->glyph_locations + gindex * 2; + p_limit = face->glyph_locations + face->num_locations * 2; + + pos1 = FT_NEXT_USHORT( p ); + pos2 = pos1; + + if ( p + 2 <= p_limit ) + pos2 = FT_NEXT_USHORT( p ); + + pos1 <<= 1; + pos2 <<= 1; + } + } + + /* Check broken location data. */ + if ( pos1 > face->glyf_len ) + { + FT_TRACE1(( "tt_face_get_location:" + " too large offset (0x%08lx) found for glyph index %ld,\n" + " " + " exceeding the end of `glyf' table (0x%08lx)\n", + pos1, gindex, face->glyf_len )); + *asize = 0; + return 0; + } + + if ( pos2 > face->glyf_len ) + { + /* We try to sanitize the last `loca' entry. */ + if ( gindex == face->num_locations - 2 ) + { + FT_TRACE1(( "tt_face_get_location:" + " too large size (%ld bytes) found for glyph index %ld,\n" + " " + " truncating at the end of `glyf' table to %ld bytes\n", + pos2 - pos1, gindex, face->glyf_len - pos1 )); + pos2 = face->glyf_len; + } + else + { + FT_TRACE1(( "tt_face_get_location:" + " too large offset (0x%08lx) found for glyph index %ld,\n" + " " + " exceeding the end of `glyf' table (0x%08lx)\n", + pos2, gindex + 1, face->glyf_len )); + *asize = 0; + return 0; + } + } + + /* The `loca' table must be ordered; it refers to the length of */ + /* an entry as the difference between the current and the next */ + /* position. However, there do exist (malformed) fonts which */ + /* don't obey this rule, so we are only able to provide an */ + /* upper bound for the size. */ + /* */ + /* We get (intentionally) a wrong, non-zero result in case the */ + /* `glyf' table is missing. */ + if ( pos2 >= pos1 ) + *asize = (FT_UInt)( pos2 - pos1 ); + else + *asize = (FT_UInt)( face->glyf_len - pos1 ); + + return pos1; + } + + + FT_LOCAL_DEF( void ) + tt_face_done_loca( TT_Face face ) + { + FT_Stream stream = face->root.stream; + + + FT_FRAME_RELEASE( face->glyph_locations ); + face->num_locations = 0; + } + + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_cvt */ + /* */ + /* */ + /* Load the control value table into a face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_cvt( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Error error; + FT_Memory memory = stream->memory; + FT_ULong table_len; + + + FT_TRACE2(( "CVT " )); + + error = face->goto_table( face, TTAG_cvt, stream, &table_len ); + if ( error ) + { + FT_TRACE2(( "is missing\n" )); + + face->cvt_size = 0; + face->cvt = NULL; + error = FT_Err_Ok; + + goto Exit; + } + + face->cvt_size = table_len / 2; + + if ( FT_NEW_ARRAY( face->cvt, face->cvt_size ) ) + goto Exit; + + if ( FT_FRAME_ENTER( face->cvt_size * 2L ) ) + goto Exit; + + { + FT_Short* cur = face->cvt; + FT_Short* limit = cur + face->cvt_size; + + + for ( ; cur < limit; cur++ ) + *cur = FT_GET_SHORT(); + } + + FT_FRAME_EXIT(); + FT_TRACE2(( "loaded\n" )); + +#ifdef TT_CONFIG_OPTION_GX_VAR_SUPPORT + if ( face->doblend ) + error = tt_face_vary_cvt( face, stream ); +#endif + + Exit: + return error; + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return FT_Err_Ok; + +#endif + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_fpgm */ + /* */ + /* */ + /* Load the font program. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_fpgm( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Error error; + FT_ULong table_len; + + + FT_TRACE2(( "Font program " )); + + /* The font program is optional */ + error = face->goto_table( face, TTAG_fpgm, stream, &table_len ); + if ( error ) + { + face->font_program = NULL; + face->font_program_size = 0; + error = FT_Err_Ok; + + FT_TRACE2(( "is missing\n" )); + } + else + { + face->font_program_size = table_len; + if ( FT_FRAME_EXTRACT( table_len, face->font_program ) ) + goto Exit; + + FT_TRACE2(( "loaded, %12d bytes\n", face->font_program_size )); + } + + Exit: + return error; + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return FT_Err_Ok; + +#endif + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_prep */ + /* */ + /* */ + /* Load the cvt program. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + FT_LOCAL_DEF( FT_Error ) + tt_face_load_prep( TT_Face face, + FT_Stream stream ) + { +#ifdef TT_USE_BYTECODE_INTERPRETER + + FT_Error error; + FT_ULong table_len; + + + FT_TRACE2(( "Prep program " )); + + error = face->goto_table( face, TTAG_prep, stream, &table_len ); + if ( error ) + { + face->cvt_program = NULL; + face->cvt_program_size = 0; + error = FT_Err_Ok; + + FT_TRACE2(( "is missing\n" )); + } + else + { + face->cvt_program_size = table_len; + if ( FT_FRAME_EXTRACT( table_len, face->cvt_program ) ) + goto Exit; + + FT_TRACE2(( "loaded, %12d bytes\n", face->cvt_program_size )); + } + + Exit: + return error; + +#else /* !TT_USE_BYTECODE_INTERPRETER */ + + FT_UNUSED( face ); + FT_UNUSED( stream ); + + return FT_Err_Ok; + +#endif + } + + + /*************************************************************************/ + /* */ + /* */ + /* tt_face_load_hdmx */ + /* */ + /* */ + /* Load the `hdmx' table into the face object. */ + /* */ + /* */ + /* face :: A handle to the target face object. */ + /* */ + /* stream :: A handle to the input stream. */ + /* */ + /* */ + /* FreeType error code. 0 means success. */ + /* */ + + FT_LOCAL_DEF( FT_Error ) + tt_face_load_hdmx( TT_Face face, + FT_Stream stream ) + { + FT_Error error; + FT_Memory memory = stream->memory; + FT_UInt nn, num_records; + FT_ULong table_size, record_size; + FT_Byte* p; + FT_Byte* limit; + + + /* this table is optional */ + error = face->goto_table( face, TTAG_hdmx, stream, &table_size ); + if ( error || table_size < 8 ) + return FT_Err_Ok; + + if ( FT_FRAME_EXTRACT( table_size, face->hdmx_table ) ) + goto Exit; + + p = face->hdmx_table; + limit = p + table_size; + + /* Given that `hdmx' tables are losing its importance (for example, */ + /* variation fonts introduced in OpenType 1.8 must not have this */ + /* table) we no longer test for a correct `version' field. */ + p += 2; + num_records = FT_NEXT_USHORT( p ); + record_size = FT_NEXT_ULONG( p ); + + /* The maximum number of bytes in an hdmx device record is the */ + /* maximum number of glyphs + 2; this is 0xFFFF + 2, thus */ + /* explaining why `record_size' is a long (which we read as */ + /* unsigned long for convenience). In practice, two bytes are */ + /* sufficient to hold the size value. */ + /* */ + /* There are at least two fonts, HANNOM-A and HANNOM-B version */ + /* 2.0 (2005), which get this wrong: The upper two bytes of */ + /* the size value are set to 0xFF instead of 0x00. We catch */ + /* and fix this. */ + + if ( record_size >= 0xFFFF0000UL ) + record_size &= 0xFFFFU; + + /* The limit for `num_records' is a heuristic value. */ + if ( num_records > 255 || + ( num_records > 0 && + ( record_size > 0x10001L || + record_size < 4 ) ) ) + { + error = FT_THROW( Invalid_File_Format ); + goto Fail; + } + + if ( FT_NEW_ARRAY( face->hdmx_record_sizes, num_records ) ) + goto Fail; + + for ( nn = 0; nn < num_records; nn++ ) + { + if ( p + record_size > limit ) + break; + + face->hdmx_record_sizes[nn] = p[0]; + p += record_size; + } + + face->hdmx_record_count = nn; + face->hdmx_table_size = table_size; + face->hdmx_record_size = record_size; + + Exit: + return error; + + Fail: + FT_FRAME_RELEASE( face->hdmx_table ); + face->hdmx_table_size = 0; + goto Exit; + } + + + FT_LOCAL_DEF( void ) + tt_face_free_hdmx( TT_Face face ) + { + FT_Stream stream = face->root.stream; + FT_Memory memory = stream->memory; + + + FT_FREE( face->hdmx_record_sizes ); + FT_FRAME_RELEASE( face->hdmx_table ); + } + + + /*************************************************************************/ + /* */ + /* Return the advance width table for a given pixel size if it is found */ + /* in the font's `hdmx' table (if any). */ + /* */ + FT_LOCAL_DEF( FT_Byte* ) + tt_face_get_device_metrics( TT_Face face, + FT_UInt ppem, + FT_UInt gindex ) + { + FT_UInt nn; + FT_Byte* result = NULL; + FT_ULong record_size = face->hdmx_record_size; + FT_Byte* record = face->hdmx_table + 8; + + + for ( nn = 0; nn < face->hdmx_record_count; nn++ ) + if ( face->hdmx_record_sizes[nn] == ppem ) + { + gindex += 2; + if ( gindex < record_size ) + result = record + nn * record_size + gindex; + break; + } + + return result; + } + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttpload.h b/vendor/FreeType2/src/truetype/ttpload.h new file mode 100644 index 0000000..fa12527 --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttpload.h @@ -0,0 +1,75 @@ +/***************************************************************************/ +/* */ +/* ttpload.h */ +/* */ +/* TrueType-specific tables loader (specification). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTPLOAD_H_ +#define TTPLOAD_H_ + + +#include +#include FT_INTERNAL_TRUETYPE_TYPES_H + + +FT_BEGIN_HEADER + + + FT_LOCAL( FT_Error ) + tt_face_load_loca( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( FT_ULong ) + tt_face_get_location( TT_Face face, + FT_UInt gindex, + FT_UInt *asize ); + + FT_LOCAL( void ) + tt_face_done_loca( TT_Face face ); + + FT_LOCAL( FT_Error ) + tt_face_load_cvt( TT_Face face, + FT_Stream stream ); + + FT_LOCAL( FT_Error ) + tt_face_load_fpgm( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_prep( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( FT_Error ) + tt_face_load_hdmx( TT_Face face, + FT_Stream stream ); + + + FT_LOCAL( void ) + tt_face_free_hdmx( TT_Face face ); + + + FT_LOCAL( FT_Byte* ) + tt_face_get_device_metrics( TT_Face face, + FT_UInt ppem, + FT_UInt gindex ); + +FT_END_HEADER + +#endif /* TTPLOAD_H_ */ + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttsubpix.c b/vendor/FreeType2/src/truetype/ttsubpix.c new file mode 100644 index 0000000..d94bcc8 --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttsubpix.c @@ -0,0 +1,1014 @@ +/***************************************************************************/ +/* */ +/* ttsubpix.c */ +/* */ +/* TrueType Subpixel Hinting. */ +/* */ +/* Copyright 2010-2018 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. */ +/* */ +/***************************************************************************/ + +#include +#include FT_INTERNAL_DEBUG_H +#include FT_INTERNAL_CALC_H +#include FT_INTERNAL_STREAM_H +#include FT_INTERNAL_SFNT_H +#include FT_TRUETYPE_TAGS_H +#include FT_OUTLINE_H +#include FT_DRIVER_H + +#include "ttsubpix.h" + + +#if defined( TT_USE_BYTECODE_INTERPRETER ) && \ + defined( TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY ) + + /*************************************************************************/ + /* */ + /* These rules affect how the TT Interpreter does hinting, with the */ + /* goal of doing subpixel hinting by (in general) ignoring x moves. */ + /* Some of these rules are fixes that go above and beyond the */ + /* stated techniques in the MS whitepaper on Cleartype, due to */ + /* artifacts in many glyphs. So, these rules make some glyphs render */ + /* better than they do in the MS rasterizer. */ + /* */ + /* "" string or 0 int/char indicates to apply to all glyphs. */ + /* "-" used as dummy placeholders, but any non-matching string works. */ + /* */ + /* Some of this could arguably be implemented in fontconfig, however: */ + /* */ + /* - Fontconfig can't set things on a glyph-by-glyph basis. */ + /* - The tweaks that happen here are very low-level, from an average */ + /* user's point of view and are best implemented in the hinter. */ + /* */ + /* The goal is to make the subpixel hinting techniques as generalized */ + /* as possible across all fonts to prevent the need for extra rules such */ + /* as these. */ + /* */ + /* The rule structure is designed so that entirely new rules can easily */ + /* be added when a new compatibility feature is discovered. */ + /* */ + /* The rule structures could also use some enhancement to handle ranges. */ + /* */ + /* ****************** WORK IN PROGRESS ******************* */ + /* */ + + /* These are `classes' of fonts that can be grouped together and used in */ + /* rules below. A blank entry "" is required at the end of these! */ +#define FAMILY_CLASS_RULES_SIZE 7 + + static const SPH_Font_Class FAMILY_CLASS_Rules + [FAMILY_CLASS_RULES_SIZE] = + { + { "MS Legacy Fonts", + { "Aharoni", + "Andale Mono", + "Andalus", + "Angsana New", + "AngsanaUPC", + "Arabic Transparent", + "Arial Black", + "Arial Narrow", + "Arial Unicode MS", + "Arial", + "Batang", + "Browallia New", + "BrowalliaUPC", + "Comic Sans MS", + "Cordia New", + "CordiaUPC", + "Courier New", + "DFKai-SB", + "David Transparent", + "David", + "DilleniaUPC", + "Estrangelo Edessa", + "EucrosiaUPC", + "FangSong_GB2312", + "Fixed Miriam Transparent", + "FrankRuehl", + "Franklin Gothic Medium", + "FreesiaUPC", + "Garamond", + "Gautami", + "Georgia", + "Gulim", + "Impact", + "IrisUPC", + "JasmineUPC", + "KaiTi_GB2312", + "KodchiangUPC", + "Latha", + "Levenim MT", + "LilyUPC", + "Lucida Console", + "Lucida Sans Unicode", + "MS Gothic", + "MS Mincho", + "MV Boli", + "Mangal", + "Marlett", + "Microsoft Sans Serif", + "Mingliu", + "Miriam Fixed", + "Miriam Transparent", + "Miriam", + "Narkisim", + "Palatino Linotype", + "Raavi", + "Rod Transparent", + "Rod", + "Shruti", + "SimHei", + "Simplified Arabic Fixed", + "Simplified Arabic", + "Simsun", + "Sylfaen", + "Symbol", + "Tahoma", + "Times New Roman", + "Traditional Arabic", + "Trebuchet MS", + "Tunga", + "Verdana", + "Webdings", + "Wingdings", + "", + }, + }, + { "Core MS Legacy Fonts", + { "Arial Black", + "Arial Narrow", + "Arial Unicode MS", + "Arial", + "Comic Sans MS", + "Courier New", + "Garamond", + "Georgia", + "Impact", + "Lucida Console", + "Lucida Sans Unicode", + "Microsoft Sans Serif", + "Palatino Linotype", + "Tahoma", + "Times New Roman", + "Trebuchet MS", + "Verdana", + "", + }, + }, + { "Apple Legacy Fonts", + { "Geneva", + "Times", + "Monaco", + "Century", + "Chalkboard", + "Lobster", + "Century Gothic", + "Optima", + "Lucida Grande", + "Gill Sans", + "Baskerville", + "Helvetica", + "Helvetica Neue", + "", + }, + }, + { "Legacy Sans Fonts", + { "Andale Mono", + "Arial Unicode MS", + "Arial", + "Century Gothic", + "Comic Sans MS", + "Franklin Gothic Medium", + "Geneva", + "Lucida Console", + "Lucida Grande", + "Lucida Sans Unicode", + "Lucida Sans Typewriter", + "Microsoft Sans Serif", + "Monaco", + "Tahoma", + "Trebuchet MS", + "Verdana", + "", + }, + }, + + { "Misc Legacy Fonts", + { "Dark Courier", "", }, }, + { "Verdana Clones", + { "DejaVu Sans", + "Bitstream Vera Sans", "", }, }, + { "Verdana and Clones", + { "DejaVu Sans", + "Bitstream Vera Sans", + "Verdana", "", }, }, + }; + + + /* Define this to force natural (i.e. not bitmap-compatible) widths. */ + /* The default leans strongly towards natural widths except for a few */ + /* legacy fonts where a selective combination produces nicer results. */ +/* #define FORCE_NATURAL_WIDTHS */ + + + /* Define `classes' of styles that can be grouped together and used in */ + /* rules below. A blank entry "" is required at the end of these! */ +#define STYLE_CLASS_RULES_SIZE 5 + + static const SPH_Font_Class STYLE_CLASS_Rules + [STYLE_CLASS_RULES_SIZE] = + { + { "Regular Class", + { "Regular", + "Book", + "Medium", + "Roman", + "Normal", + "", + }, + }, + { "Regular/Italic Class", + { "Regular", + "Book", + "Medium", + "Italic", + "Oblique", + "Roman", + "Normal", + "", + }, + }, + { "Bold/BoldItalic Class", + { "Bold", + "Bold Italic", + "Black", + "", + }, + }, + { "Bold/Italic/BoldItalic Class", + { "Bold", + "Bold Italic", + "Black", + "Italic", + "Oblique", + "", + }, + }, + { "Regular/Bold Class", + { "Regular", + "Book", + "Medium", + "Normal", + "Roman", + "Bold", + "Black", + "", + }, + }, + }; + + + /* Force special legacy fixes for fonts. */ +#define COMPATIBILITY_MODE_RULES_SIZE 1 + + static const SPH_TweakRule COMPATIBILITY_MODE_Rules + [COMPATIBILITY_MODE_RULES_SIZE] = + { + { "Verdana Clones", 0, "", 0 }, + }; + + + /* Don't do subpixel (ignore_x_mode) hinting; do normal hinting. */ +#define PIXEL_HINTING_RULES_SIZE 2 + + static const SPH_TweakRule PIXEL_HINTING_Rules + [PIXEL_HINTING_RULES_SIZE] = + { + /* these characters are almost always safe */ + { "Courier New", 12, "Italic", 'z' }, + { "Courier New", 11, "Italic", 'z' }, + }; + + + /* Subpixel hinting ignores SHPIX rules on X. Force SHPIX for these. */ +#define DO_SHPIX_RULES_SIZE 1 + + static const SPH_TweakRule DO_SHPIX_Rules + [DO_SHPIX_RULES_SIZE] = + { + { "-", 0, "", 0 }, + }; + + + /* Skip Y moves that start with a point that is not on a Y pixel */ + /* boundary and don't move that point to a Y pixel boundary. */ +#define SKIP_NONPIXEL_Y_MOVES_RULES_SIZE 4 + + static const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_Rules + [SKIP_NONPIXEL_Y_MOVES_RULES_SIZE] = + { + /* fix vwxyz thinness*/ + { "Consolas", 0, "", 0 }, + /* Fix thin middle stems */ + { "Core MS Legacy Fonts", 0, "Regular", 0 }, + /* Cyrillic small letter I */ + { "Legacy Sans Fonts", 0, "", 0 }, + /* Fix artifacts with some Regular & Bold */ + { "Verdana Clones", 0, "", 0 }, + }; + + +#define SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1 + + static const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_Rules_Exceptions + [SKIP_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] = + { + /* Fixes < and > */ + { "Courier New", 0, "Regular", 0 }, + }; + + + /* Skip Y moves that start with a point that is not on a Y pixel */ + /* boundary and don't move that point to a Y pixel boundary. */ +#define SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE 2 + + static const SPH_TweakRule SKIP_NONPIXEL_Y_MOVES_DELTAP_Rules + [SKIP_NONPIXEL_Y_MOVES_DELTAP_RULES_SIZE] = + { + /* Maintain thickness of diagonal in 'N' */ + { "Times New Roman", 0, "Regular/Bold Class", 'N' }, + { "Georgia", 0, "Regular/Bold Class", 'N' }, + }; + + + /* Skip Y moves that move a point off a Y pixel boundary. */ +#define SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE 1 + + static const SPH_TweakRule SKIP_OFFPIXEL_Y_MOVES_Rules + [SKIP_OFFPIXEL_Y_MOVES_RULES_SIZE] = + { + { "-", 0, "", 0 }, + }; + + +#define SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1 + + static const SPH_TweakRule SKIP_OFFPIXEL_Y_MOVES_Rules_Exceptions + [SKIP_OFFPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] = + { + { "-", 0, "", 0 }, + }; + + + /* Round moves that don't move a point to a Y pixel boundary. */ +#define ROUND_NONPIXEL_Y_MOVES_RULES_SIZE 2 + + static const SPH_TweakRule ROUND_NONPIXEL_Y_MOVES_Rules + [ROUND_NONPIXEL_Y_MOVES_RULES_SIZE] = + { + /* Droid font instructions don't snap Y to pixels */ + { "Droid Sans", 0, "Regular/Italic Class", 0 }, + { "Droid Sans Mono", 0, "", 0 }, + }; + + +#define ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE 1 + + static const SPH_TweakRule ROUND_NONPIXEL_Y_MOVES_Rules_Exceptions + [ROUND_NONPIXEL_Y_MOVES_RULES_EXCEPTIONS_SIZE] = + { + { "-", 0, "", 0 }, + }; + + + /* Allow a Direct_Move along X freedom vector if matched. */ +#define ALLOW_X_DMOVE_RULES_SIZE 1 + + static const SPH_TweakRule ALLOW_X_DMOVE_Rules + [ALLOW_X_DMOVE_RULES_SIZE] = + { + /* Fixes vanishing diagonal in 4 */ + { "Verdana", 0, "Regular", '4' }, + }; + + + /* Return MS rasterizer version 35 if matched. */ +#define RASTERIZER_35_RULES_SIZE 8 + + static const SPH_TweakRule RASTERIZER_35_Rules + [RASTERIZER_35_RULES_SIZE] = + { + /* This seems to be the only way to make these look good */ + { "Times New Roman", 0, "Regular", 'i' }, + { "Times New Roman", 0, "Regular", 'j' }, + { "Times New Roman", 0, "Regular", 'm' }, + { "Times New Roman", 0, "Regular", 'r' }, + { "Times New Roman", 0, "Regular", 'a' }, + { "Times New Roman", 0, "Regular", 'n' }, + { "Times New Roman", 0, "Regular", 'p' }, + { "Times", 0, "", 0 }, + }; + + + /* Don't round to the subpixel grid. Round to pixel grid. */ +#define NORMAL_ROUND_RULES_SIZE 1 + + static const SPH_TweakRule NORMAL_ROUND_Rules + [NORMAL_ROUND_RULES_SIZE] = + { + /* Fix serif thickness for certain ppems */ + /* Can probably be generalized somehow */ + { "Courier New", 0, "", 0 }, + }; + + + /* Skip IUP instructions if matched. */ +#define SKIP_IUP_RULES_SIZE 1 + + static const SPH_TweakRule SKIP_IUP_Rules + [SKIP_IUP_RULES_SIZE] = + { + { "Arial", 13, "Regular", 'a' }, + }; + + + /* Skip MIAP Twilight hack if matched. */ +#define MIAP_HACK_RULES_SIZE 1 + + static const SPH_TweakRule MIAP_HACK_Rules + [MIAP_HACK_RULES_SIZE] = + { + { "Geneva", 12, "", 0 }, + }; + + + /* Skip DELTAP instructions if matched. */ +#define ALWAYS_SKIP_DELTAP_RULES_SIZE 23 + + static const SPH_TweakRule ALWAYS_SKIP_DELTAP_Rules + [ALWAYS_SKIP_DELTAP_RULES_SIZE] = + { + { "Georgia", 0, "Regular", 'k' }, + /* fix various problems with e in different versions */ + { "Trebuchet MS", 14, "Regular", 'e' }, + { "Trebuchet MS", 13, "Regular", 'e' }, + { "Trebuchet MS", 15, "Regular", 'e' }, + { "Trebuchet MS", 0, "Italic", 'v' }, + { "Trebuchet MS", 0, "Italic", 'w' }, + { "Trebuchet MS", 0, "Regular", 'Y' }, + { "Arial", 11, "Regular", 's' }, + /* prevent problems with '3' and others */ + { "Verdana", 10, "Regular", 0 }, + { "Verdana", 9, "Regular", 0 }, + /* Cyrillic small letter short I */ + { "Legacy Sans Fonts", 0, "", 0x438 }, + { "Legacy Sans Fonts", 0, "", 0x439 }, + { "Arial", 10, "Regular", '6' }, + { "Arial", 0, "Bold/BoldItalic Class", 'a' }, + /* Make horizontal stems consistent with the rest */ + { "Arial", 24, "Bold", 'a' }, + { "Arial", 25, "Bold", 'a' }, + { "Arial", 24, "Bold", 's' }, + { "Arial", 25, "Bold", 's' }, + { "Arial", 34, "Bold", 's' }, + { "Arial", 35, "Bold", 's' }, + { "Arial", 36, "Bold", 's' }, + { "Arial", 25, "Regular", 's' }, + { "Arial", 26, "Regular", 's' }, + }; + + + /* Always do DELTAP instructions if matched. */ +#define ALWAYS_DO_DELTAP_RULES_SIZE 1 + + static const SPH_TweakRule ALWAYS_DO_DELTAP_Rules + [ALWAYS_DO_DELTAP_RULES_SIZE] = + { + { "-", 0, "", 0 }, + }; + + + /* Don't allow ALIGNRP after IUP. */ +#define NO_ALIGNRP_AFTER_IUP_RULES_SIZE 1 + + static const SPH_TweakRule NO_ALIGNRP_AFTER_IUP_Rules + [NO_ALIGNRP_AFTER_IUP_RULES_SIZE] = + { + /* Prevent creation of dents in outline */ + { "-", 0, "", 0 }, + }; + + + /* Don't allow DELTAP after IUP. */ +#define NO_DELTAP_AFTER_IUP_RULES_SIZE 1 + + static const SPH_TweakRule NO_DELTAP_AFTER_IUP_Rules + [NO_DELTAP_AFTER_IUP_RULES_SIZE] = + { + { "-", 0, "", 0 }, + }; + + + /* Don't allow CALL after IUP. */ +#define NO_CALL_AFTER_IUP_RULES_SIZE 1 + + static const SPH_TweakRule NO_CALL_AFTER_IUP_Rules + [NO_CALL_AFTER_IUP_RULES_SIZE] = + { + /* Prevent creation of dents in outline */ + { "-", 0, "", 0 }, + }; + + + /* De-embolden these glyphs slightly. */ +#define DEEMBOLDEN_RULES_SIZE 9 + + static const SPH_TweakRule DEEMBOLDEN_Rules + [DEEMBOLDEN_RULES_SIZE] = + { + { "Courier New", 0, "Bold", 'A' }, + { "Courier New", 0, "Bold", 'W' }, + { "Courier New", 0, "Bold", 'w' }, + { "Courier New", 0, "Bold", 'M' }, + { "Courier New", 0, "Bold", 'X' }, + { "Courier New", 0, "Bold", 'K' }, + { "Courier New", 0, "Bold", 'x' }, + { "Courier New", 0, "Bold", 'z' }, + { "Courier New", 0, "Bold", 'v' }, + }; + + + /* Embolden these glyphs slightly. */ +#define EMBOLDEN_RULES_SIZE 2 + + static const SPH_TweakRule EMBOLDEN_Rules + [EMBOLDEN_RULES_SIZE] = + { + { "Courier New", 0, "Regular", 0 }, + { "Courier New", 0, "Italic", 0 }, + }; + + + /* This is a CVT hack that makes thick horizontal stems on 2, 5, 7 */ + /* similar to Windows XP. */ +#define TIMES_NEW_ROMAN_HACK_RULES_SIZE 12 + + static const SPH_TweakRule TIMES_NEW_ROMAN_HACK_Rules + [TIMES_NEW_ROMAN_HACK_RULES_SIZE] = + { + { "Times New Roman", 16, "Italic", '2' }, + { "Times New Roman", 16, "Italic", '5' }, + { "Times New Roman", 16, "Italic", '7' }, + { "Times New Roman", 16, "Regular", '2' }, + { "Times New Roman", 16, "Regular", '5' }, + { "Times New Roman", 16, "Regular", '7' }, + { "Times New Roman", 17, "Italic", '2' }, + { "Times New Roman", 17, "Italic", '5' }, + { "Times New Roman", 17, "Italic", '7' }, + { "Times New Roman", 17, "Regular", '2' }, + { "Times New Roman", 17, "Regular", '5' }, + { "Times New Roman", 17, "Regular", '7' }, + }; + + + /* This fudges distance on 2 to get rid of the vanishing stem issue. */ + /* A real solution to this is certainly welcome. */ +#define COURIER_NEW_2_HACK_RULES_SIZE 15 + + static const SPH_TweakRule COURIER_NEW_2_HACK_Rules + [COURIER_NEW_2_HACK_RULES_SIZE] = + { + { "Courier New", 10, "Regular", '2' }, + { "Courier New", 11, "Regular", '2' }, + { "Courier New", 12, "Regular", '2' }, + { "Courier New", 13, "Regular", '2' }, + { "Courier New", 14, "Regular", '2' }, + { "Courier New", 15, "Regular", '2' }, + { "Courier New", 16, "Regular", '2' }, + { "Courier New", 17, "Regular", '2' }, + { "Courier New", 18, "Regular", '2' }, + { "Courier New", 19, "Regular", '2' }, + { "Courier New", 20, "Regular", '2' }, + { "Courier New", 21, "Regular", '2' }, + { "Courier New", 22, "Regular", '2' }, + { "Courier New", 23, "Regular", '2' }, + { "Courier New", 24, "Regular", '2' }, + }; + + +#ifndef FORCE_NATURAL_WIDTHS + + /* Use compatible widths with these glyphs. Compatible widths is always */ + /* on when doing B/W TrueType instructing, but is used selectively here, */ + /* typically on glyphs with 3 or more vertical stems. */ +#define COMPATIBLE_WIDTHS_RULES_SIZE 38 + + static const SPH_TweakRule COMPATIBLE_WIDTHS_Rules + [COMPATIBLE_WIDTHS_RULES_SIZE] = + { + { "Arial Unicode MS", 12, "Regular Class", 'm' }, + { "Arial Unicode MS", 14, "Regular Class", 'm' }, + /* Cyrillic small letter sha */ + { "Arial", 10, "Regular Class", 0x448 }, + { "Arial", 11, "Regular Class", 'm' }, + { "Arial", 12, "Regular Class", 'm' }, + /* Cyrillic small letter sha */ + { "Arial", 12, "Regular Class", 0x448 }, + { "Arial", 13, "Regular Class", 0x448 }, + { "Arial", 14, "Regular Class", 'm' }, + /* Cyrillic small letter sha */ + { "Arial", 14, "Regular Class", 0x448 }, + { "Arial", 15, "Regular Class", 0x448 }, + { "Arial", 17, "Regular Class", 'm' }, + { "DejaVu Sans", 15, "Regular Class", 0 }, + { "Microsoft Sans Serif", 11, "Regular Class", 0 }, + { "Microsoft Sans Serif", 12, "Regular Class", 0 }, + { "Segoe UI", 11, "Regular Class", 0 }, + { "Monaco", 0, "Regular Class", 0 }, + { "Segoe UI", 12, "Regular Class", 'm' }, + { "Segoe UI", 14, "Regular Class", 'm' }, + { "Tahoma", 11, "Regular Class", 0 }, + { "Times New Roman", 16, "Regular Class", 'c' }, + { "Times New Roman", 16, "Regular Class", 'm' }, + { "Times New Roman", 16, "Regular Class", 'o' }, + { "Times New Roman", 16, "Regular Class", 'w' }, + { "Trebuchet MS", 11, "Regular Class", 0 }, + { "Trebuchet MS", 12, "Regular Class", 0 }, + { "Trebuchet MS", 14, "Regular Class", 0 }, + { "Trebuchet MS", 15, "Regular Class", 0 }, + { "Ubuntu", 12, "Regular Class", 'm' }, + /* Cyrillic small letter sha */ + { "Verdana", 10, "Regular Class", 0x448 }, + { "Verdana", 11, "Regular Class", 0x448 }, + { "Verdana and Clones", 12, "Regular Class", 'i' }, + { "Verdana and Clones", 12, "Regular Class", 'j' }, + { "Verdana and Clones", 12, "Regular Class", 'l' }, + { "Verdana and Clones", 12, "Regular Class", 'm' }, + { "Verdana and Clones", 13, "Regular Class", 'i' }, + { "Verdana and Clones", 13, "Regular Class", 'j' }, + { "Verdana and Clones", 13, "Regular Class", 'l' }, + { "Verdana and Clones", 14, "Regular Class", 'm' }, + }; + + + /* Scaling slightly in the x-direction prior to hinting results in */ + /* more visually pleasing glyphs in certain cases. */ + /* This sometimes needs to be coordinated with compatible width rules. */ + /* A value of 1000 corresponds to a scaled value of 1.0. */ + +#define X_SCALING_RULES_SIZE 50 + + static const SPH_ScaleRule X_SCALING_Rules[X_SCALING_RULES_SIZE] = + { + { "DejaVu Sans", 12, "Regular Class", 'm', 950 }, + { "Verdana and Clones", 12, "Regular Class", 'a', 1100 }, + { "Verdana and Clones", 13, "Regular Class", 'a', 1050 }, + { "Arial", 11, "Regular Class", 'm', 975 }, + { "Arial", 12, "Regular Class", 'm', 1050 }, + /* Cyrillic small letter el */ + { "Arial", 13, "Regular Class", 0x43B, 950 }, + { "Arial", 13, "Regular Class", 'o', 950 }, + { "Arial", 13, "Regular Class", 'e', 950 }, + { "Arial", 14, "Regular Class", 'm', 950 }, + /* Cyrillic small letter el */ + { "Arial", 15, "Regular Class", 0x43B, 925 }, + { "Bitstream Vera Sans", 10, "Regular/Italic Class", 0, 1100 }, + { "Bitstream Vera Sans", 12, "Regular/Italic Class", 0, 1050 }, + { "Bitstream Vera Sans", 16, "Regular Class", 0, 1050 }, + { "Bitstream Vera Sans", 9, "Regular/Italic Class", 0, 1050 }, + { "DejaVu Sans", 12, "Regular Class", 'l', 975 }, + { "DejaVu Sans", 12, "Regular Class", 'i', 975 }, + { "DejaVu Sans", 12, "Regular Class", 'j', 975 }, + { "DejaVu Sans", 13, "Regular Class", 'l', 950 }, + { "DejaVu Sans", 13, "Regular Class", 'i', 950 }, + { "DejaVu Sans", 13, "Regular Class", 'j', 950 }, + { "DejaVu Sans", 10, "Regular/Italic Class", 0, 1100 }, + { "DejaVu Sans", 12, "Regular/Italic Class", 0, 1050 }, + { "Georgia", 10, "", 0, 1050 }, + { "Georgia", 11, "", 0, 1100 }, + { "Georgia", 12, "", 0, 1025 }, + { "Georgia", 13, "", 0, 1050 }, + { "Georgia", 16, "", 0, 1050 }, + { "Georgia", 17, "", 0, 1030 }, + { "Liberation Sans", 12, "Regular Class", 'm', 1100 }, + { "Lucida Grande", 11, "Regular Class", 'm', 1100 }, + { "Microsoft Sans Serif", 11, "Regular Class", 'm', 950 }, + { "Microsoft Sans Serif", 12, "Regular Class", 'm', 1050 }, + { "Segoe UI", 12, "Regular Class", 'H', 1050 }, + { "Segoe UI", 12, "Regular Class", 'm', 1050 }, + { "Segoe UI", 14, "Regular Class", 'm', 1050 }, + { "Tahoma", 11, "Regular Class", 'i', 975 }, + { "Tahoma", 11, "Regular Class", 'l', 975 }, + { "Tahoma", 11, "Regular Class", 'j', 900 }, + { "Tahoma", 11, "Regular Class", 'm', 918 }, + { "Verdana", 10, "Regular/Italic Class", 0, 1100 }, + { "Verdana", 12, "Regular Class", 'm', 975 }, + { "Verdana", 12, "Regular/Italic Class", 0, 1050 }, + { "Verdana", 13, "Regular/Italic Class", 'i', 950 }, + { "Verdana", 13, "Regular/Italic Class", 'j', 950 }, + { "Verdana", 13, "Regular/Italic Class", 'l', 950 }, + { "Verdana", 16, "Regular Class", 0, 1050 }, + { "Verdana", 9, "Regular/Italic Class", 0, 1050 }, + { "Times New Roman", 16, "Regular Class", 'm', 918 }, + { "Trebuchet MS", 11, "Regular Class", 'm', 800 }, + { "Trebuchet MS", 12, "Regular Class", 'm', 800 }, + }; + +#else + +#define COMPATIBLE_WIDTHS_RULES_SIZE 1 + + static const SPH_TweakRule COMPATIBLE_WIDTHS_Rules + [COMPATIBLE_WIDTHS_RULES_SIZE] = + { + { "-", 0, "", 0 }, + }; + + +#define X_SCALING_RULES_SIZE 1 + + static const SPH_ScaleRule X_SCALING_Rules + [X_SCALING_RULES_SIZE] = + { + { "-", 0, "", 0, 1000 }, + }; + +#endif /* FORCE_NATURAL_WIDTHS */ + + + static FT_Bool + is_member_of_family_class( const FT_String* detected_font_name, + const FT_String* rule_font_name ) + { + FT_UInt i, j; + + + /* Does font name match rule family? */ + if ( ft_strcmp( detected_font_name, rule_font_name ) == 0 ) + return TRUE; + + /* Is font name a wildcard ""? */ + if ( ft_strcmp( rule_font_name, "" ) == 0 ) + return TRUE; + + /* Is font name contained in a class list? */ + for ( i = 0; i < FAMILY_CLASS_RULES_SIZE; i++ ) + { + if ( ft_strcmp( FAMILY_CLASS_Rules[i].name, rule_font_name ) == 0 ) + { + for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ ) + { + if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j], "" ) == 0 ) + continue; + if ( ft_strcmp( FAMILY_CLASS_Rules[i].member[j], + detected_font_name ) == 0 ) + return TRUE; + } + } + } + + return FALSE; + } + + + static FT_Bool + is_member_of_style_class( const FT_String* detected_font_style, + const FT_String* rule_font_style ) + { + FT_UInt i, j; + + + /* Does font style match rule style? */ + if ( ft_strcmp( detected_font_style, rule_font_style ) == 0 ) + return TRUE; + + /* Is font style a wildcard ""? */ + if ( ft_strcmp( rule_font_style, "" ) == 0 ) + return TRUE; + + /* Is font style contained in a class list? */ + for ( i = 0; i < STYLE_CLASS_RULES_SIZE; i++ ) + { + if ( ft_strcmp( STYLE_CLASS_Rules[i].name, rule_font_style ) == 0 ) + { + for ( j = 0; j < SPH_MAX_CLASS_MEMBERS; j++ ) + { + if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j], "" ) == 0 ) + continue; + if ( ft_strcmp( STYLE_CLASS_Rules[i].member[j], + detected_font_style ) == 0 ) + return TRUE; + } + } + } + + return FALSE; + } + + + FT_LOCAL_DEF( FT_Bool ) + sph_test_tweak( TT_Face face, + const FT_String* family, + FT_UInt ppem, + const FT_String* style, + FT_UInt glyph_index, + const SPH_TweakRule* rule, + FT_UInt num_rules ) + { + FT_UInt i; + + + /* rule checks may be able to be optimized further */ + for ( i = 0; i < num_rules; i++ ) + { + if ( family && + ( is_member_of_family_class ( family, rule[i].family ) ) ) + if ( rule[i].ppem == 0 || + rule[i].ppem == ppem ) + if ( style && + is_member_of_style_class ( style, rule[i].style ) ) + if ( rule[i].glyph == 0 || + FT_Get_Char_Index( (FT_Face)face, + rule[i].glyph ) == glyph_index ) + return TRUE; + } + + return FALSE; + } + + + static FT_UInt + scale_test_tweak( TT_Face face, + const FT_String* family, + FT_UInt ppem, + const FT_String* style, + FT_UInt glyph_index, + const SPH_ScaleRule* rule, + FT_UInt num_rules ) + { + FT_UInt i; + + + /* rule checks may be able to be optimized further */ + for ( i = 0; i < num_rules; i++ ) + { + if ( family && + ( is_member_of_family_class ( family, rule[i].family ) ) ) + if ( rule[i].ppem == 0 || + rule[i].ppem == ppem ) + if ( style && + is_member_of_style_class( style, rule[i].style ) ) + if ( rule[i].glyph == 0 || + FT_Get_Char_Index( (FT_Face)face, + rule[i].glyph ) == glyph_index ) + return rule[i].scale; + } + + return 1000; + } + + + FT_LOCAL_DEF( FT_UInt ) + sph_test_tweak_x_scaling( TT_Face face, + const FT_String* family, + FT_UInt ppem, + const FT_String* style, + FT_UInt glyph_index ) + { + return scale_test_tweak( face, family, ppem, style, glyph_index, + X_SCALING_Rules, X_SCALING_RULES_SIZE ); + } + + +#define TWEAK_RULES( x ) \ + if ( sph_test_tweak( face, family, ppem, style, glyph_index, \ + x##_Rules, x##_RULES_SIZE ) ) \ + loader->exec->sph_tweak_flags |= SPH_TWEAK_##x; + +#define TWEAK_RULES_EXCEPTIONS( x ) \ + if ( sph_test_tweak( face, family, ppem, style, glyph_index, \ + x##_Rules_Exceptions, x##_RULES_EXCEPTIONS_SIZE ) ) \ + loader->exec->sph_tweak_flags &= ~SPH_TWEAK_##x; + + + FT_LOCAL_DEF( void ) + sph_set_tweaks( TT_Loader loader, + FT_UInt glyph_index ) + { + TT_Face face = loader->face; + FT_String* family = face->root.family_name; + FT_UInt ppem = loader->size->metrics->x_ppem; + FT_String* style = face->root.style_name; + + + /* don't apply rules if style isn't set */ + if ( !face->root.style_name ) + return; + +#ifdef SPH_DEBUG_MORE_VERBOSE + printf( "%s,%d,%s,%c=%d ", + family, ppem, style, glyph_index, glyph_index ); +#endif + + TWEAK_RULES( PIXEL_HINTING ); + + if ( loader->exec->sph_tweak_flags & SPH_TWEAK_PIXEL_HINTING ) + { + loader->exec->ignore_x_mode = FALSE; + return; + } + + TWEAK_RULES( ALLOW_X_DMOVE ); + TWEAK_RULES( ALWAYS_DO_DELTAP ); + TWEAK_RULES( ALWAYS_SKIP_DELTAP ); + TWEAK_RULES( DEEMBOLDEN ); + TWEAK_RULES( DO_SHPIX ); + TWEAK_RULES( EMBOLDEN ); + TWEAK_RULES( MIAP_HACK ); + TWEAK_RULES( NORMAL_ROUND ); + TWEAK_RULES( NO_ALIGNRP_AFTER_IUP ); + TWEAK_RULES( NO_CALL_AFTER_IUP ); + TWEAK_RULES( NO_DELTAP_AFTER_IUP ); + TWEAK_RULES( RASTERIZER_35 ); + TWEAK_RULES( SKIP_IUP ); + + TWEAK_RULES( SKIP_OFFPIXEL_Y_MOVES ); + TWEAK_RULES_EXCEPTIONS( SKIP_OFFPIXEL_Y_MOVES ); + + TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES_DELTAP ); + + TWEAK_RULES( SKIP_NONPIXEL_Y_MOVES ); + TWEAK_RULES_EXCEPTIONS( SKIP_NONPIXEL_Y_MOVES ); + + TWEAK_RULES( ROUND_NONPIXEL_Y_MOVES ); + TWEAK_RULES_EXCEPTIONS( ROUND_NONPIXEL_Y_MOVES ); + + if ( loader->exec->sph_tweak_flags & SPH_TWEAK_RASTERIZER_35 ) + { + if ( loader->exec->rasterizer_version != TT_INTERPRETER_VERSION_35 ) + { + loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35; + loader->exec->size->cvt_ready = -1; + + tt_size_ready_bytecode( + loader->exec->size, + FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) ); + } + else + loader->exec->rasterizer_version = TT_INTERPRETER_VERSION_35; + } + else + { + if ( loader->exec->rasterizer_version != + SPH_OPTION_SET_RASTERIZER_VERSION ) + { + loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION; + loader->exec->size->cvt_ready = -1; + + tt_size_ready_bytecode( + loader->exec->size, + FT_BOOL( loader->load_flags & FT_LOAD_PEDANTIC ) ); + } + else + loader->exec->rasterizer_version = SPH_OPTION_SET_RASTERIZER_VERSION; + } + + if ( IS_HINTED( loader->load_flags ) ) + { + TWEAK_RULES( TIMES_NEW_ROMAN_HACK ); + TWEAK_RULES( COURIER_NEW_2_HACK ); + } + + if ( sph_test_tweak( face, family, ppem, style, glyph_index, + COMPATIBILITY_MODE_Rules, COMPATIBILITY_MODE_RULES_SIZE ) ) + loader->exec->face->sph_compatibility_mode = TRUE; + + + if ( IS_HINTED( loader->load_flags ) ) + { + if ( sph_test_tweak( face, family, ppem, style, glyph_index, + COMPATIBLE_WIDTHS_Rules, COMPATIBLE_WIDTHS_RULES_SIZE ) ) + loader->exec->compatible_widths |= TRUE; + } + } + +#else /* !(TT_USE_BYTECODE_INTERPRETER && */ + /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */ + + /* ANSI C doesn't like empty source files */ + typedef int _tt_subpix_dummy; + +#endif /* !(TT_USE_BYTECODE_INTERPRETER && */ + /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY) */ + + +/* END */ diff --git a/vendor/FreeType2/src/truetype/ttsubpix.h b/vendor/FreeType2/src/truetype/ttsubpix.h new file mode 100644 index 0000000..1070bb0 --- /dev/null +++ b/vendor/FreeType2/src/truetype/ttsubpix.h @@ -0,0 +1,111 @@ +/***************************************************************************/ +/* */ +/* ttsubpix.h */ +/* */ +/* TrueType Subpixel Hinting. */ +/* */ +/* Copyright 2010-2018 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. */ +/* */ +/***************************************************************************/ + + +#ifndef TTSUBPIX_H_ +#define TTSUBPIX_H_ + +#include +#include "ttobjs.h" +#include "ttinterp.h" + + +FT_BEGIN_HEADER + + +#ifdef TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY + + /*************************************************************************/ + /* */ + /* ID flags to identify special functions at FDEF and runtime. */ + /* */ + /* */ +#define SPH_FDEF_INLINE_DELTA_1 0x0000001 +#define SPH_FDEF_INLINE_DELTA_2 0x0000002 +#define SPH_FDEF_DIAGONAL_STROKE 0x0000004 +#define SPH_FDEF_VACUFORM_ROUND_1 0x0000008 +#define SPH_FDEF_TTFAUTOHINT_1 0x0000010 +#define SPH_FDEF_SPACING_1 0x0000020 +#define SPH_FDEF_SPACING_2 0x0000040 +#define SPH_FDEF_TYPEMAN_STROKES 0x0000080 +#define SPH_FDEF_TYPEMAN_DIAGENDCTRL 0x0000100 + + + /*************************************************************************/ + /* */ + /* Tweak flags that are set for each glyph by the below rules. */ + /* */ + /* */ +#define SPH_TWEAK_ALLOW_X_DMOVE 0x0000001UL +#define SPH_TWEAK_ALWAYS_DO_DELTAP 0x0000002UL +#define SPH_TWEAK_ALWAYS_SKIP_DELTAP 0x0000004UL +#define SPH_TWEAK_COURIER_NEW_2_HACK 0x0000008UL +#define SPH_TWEAK_DEEMBOLDEN 0x0000010UL +#define SPH_TWEAK_DO_SHPIX 0x0000020UL +#define SPH_TWEAK_EMBOLDEN 0x0000040UL +#define SPH_TWEAK_MIAP_HACK 0x0000080UL +#define SPH_TWEAK_NORMAL_ROUND 0x0000100UL +#define SPH_TWEAK_NO_ALIGNRP_AFTER_IUP 0x0000200UL +#define SPH_TWEAK_NO_CALL_AFTER_IUP 0x0000400UL +#define SPH_TWEAK_NO_DELTAP_AFTER_IUP 0x0000800UL +#define SPH_TWEAK_PIXEL_HINTING 0x0001000UL +#define SPH_TWEAK_RASTERIZER_35 0x0002000UL +#define SPH_TWEAK_ROUND_NONPIXEL_Y_MOVES 0x0004000UL +#define SPH_TWEAK_SKIP_IUP 0x0008000UL +#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES 0x0010000UL +#define SPH_TWEAK_SKIP_OFFPIXEL_Y_MOVES 0x0020000UL +#define SPH_TWEAK_TIMES_NEW_ROMAN_HACK 0x0040000UL +#define SPH_TWEAK_SKIP_NONPIXEL_Y_MOVES_DELTAP 0x0080000UL + + + FT_LOCAL( FT_Bool ) + sph_test_tweak( TT_Face face, + const FT_String* family, + FT_UInt ppem, + const FT_String* style, + FT_UInt glyph_index, + const SPH_TweakRule* rule, + FT_UInt num_rules ); + + FT_LOCAL( FT_UInt ) + sph_test_tweak_x_scaling( TT_Face face, + const FT_String* family, + FT_UInt ppem, + const FT_String* style, + FT_UInt glyph_index ); + + FT_LOCAL( void ) + sph_set_tweaks( TT_Loader loader, + FT_UInt glyph_index ); + + + /* These macros are defined absent a method for setting them */ +#define SPH_OPTION_BITMAP_WIDTHS FALSE +#define SPH_OPTION_SET_SUBPIXEL TRUE +#define SPH_OPTION_SET_GRAYSCALE FALSE +#define SPH_OPTION_SET_COMPATIBLE_WIDTHS FALSE +#define SPH_OPTION_SET_RASTERIZER_VERSION 38 + +#endif /* TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY */ + + +FT_END_HEADER + +#endif /* TTSUBPIX_H_ */ + + +/* END */ From cb2ea423dc2c5b8713dfc05323f813325536b380 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 7 Jan 2020 06:14:47 +0100 Subject: [PATCH 011/361] FreeType2: move out our own config to ftspectre directory (makes it esier to upgrade FT). --- .../include/freetype/config/ftmodule.h | 56 +- .../include/freetype/config/ftoption.h | 10 +- vendor/FreeType2/include/ft2build.h | 14 +- vendor/FreeType2/include/ftspectre/modules.h | 34 + vendor/FreeType2/include/ftspectre/options.h | 925 ++++++++++++++++++ 5 files changed, 998 insertions(+), 41 deletions(-) create mode 100644 vendor/FreeType2/include/ftspectre/modules.h create mode 100644 vendor/FreeType2/include/ftspectre/options.h diff --git a/vendor/FreeType2/include/freetype/config/ftmodule.h b/vendor/FreeType2/include/freetype/config/ftmodule.h index 8eacc38..76d271a 100644 --- a/vendor/FreeType2/include/freetype/config/ftmodule.h +++ b/vendor/FreeType2/include/freetype/config/ftmodule.h @@ -1,34 +1,32 @@ /* - * Spectre FreeType2 module config. * This file registers the FreeType modules compiled into the library. + * + * If you use GNU make, this file IS NOT USED! Instead, it is created in + * the objects directory (normally `/objs/') based on information + * from `/modules.cfg'. + * + * Please read `docs/INSTALL.ANY' and `docs/CUSTOMIZE' how to compile + * FreeType without GNU make. + * */ -/* - * Drivers - */ -FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) -FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) -/* FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) */ -/* FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) */ -/* FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) */ -/* FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) */ -/* FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) */ -/* FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) */ -/* FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) */ - -/* - * Rendering - */ -FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) /* Monochrome */ -FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) /* AntiAlias */ -/* FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) */ -/* FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) */ - -/* - * Dependancies - */ FT_USE_MODULE( FT_Module_Class, autofit_module_class ) -FT_USE_MODULE( FT_Module_Class, psaux_module_class ) /* needed by CFF/OpenType driver */ -FT_USE_MODULE( FT_Module_Class, psnames_module_class ) /* needed by CFF/OpenType & TrueType driver */ -FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) /* needed by CFF/OpenType driver */ -FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) /* needed by TrueType driver */ +FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) +FT_USE_MODULE( FT_Module_Class, psaux_module_class ) +FT_USE_MODULE( FT_Module_Class, psnames_module_class ) +FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) +FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) +FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) + +/* EOF */ diff --git a/vendor/FreeType2/include/freetype/config/ftoption.h b/vendor/FreeType2/include/freetype/config/ftoption.h index a393549..4bcab2a 100644 --- a/vendor/FreeType2/include/freetype/config/ftoption.h +++ b/vendor/FreeType2/include/freetype/config/ftoption.h @@ -105,7 +105,7 @@ FT_BEGIN_HEADER /* cff:no-stem-darkening=1 \ */ /* autofitter:warping=1 */ /* */ -/* #define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES */ +#define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES /*************************************************************************/ @@ -178,7 +178,7 @@ FT_BEGIN_HEADER /* */ /* Define this macro if you want to enable this `feature'. */ /* */ -/* #define FT_CONFIG_OPTION_USE_LZW */ +#define FT_CONFIG_OPTION_USE_LZW /*************************************************************************/ @@ -193,7 +193,7 @@ FT_BEGIN_HEADER /* Define this macro if you want to enable this `feature'. See also */ /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ /* */ -/* #define FT_CONFIG_OPTION_USE_ZLIB */ +#define FT_CONFIG_OPTION_USE_ZLIB /*************************************************************************/ @@ -658,8 +658,8 @@ FT_BEGIN_HEADER /* [1] https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */ /* */ /* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 1 */ -/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2 */ -#define TT_CONFIG_OPTION_SUBPIXEL_HINTING ( 1 | 2 ) +#define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2 +/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING ( 1 | 2 ) */ /*************************************************************************/ diff --git a/vendor/FreeType2/include/ft2build.h b/vendor/FreeType2/include/ft2build.h index e7ce99b..9aac5dd 100644 --- a/vendor/FreeType2/include/ft2build.h +++ b/vendor/FreeType2/include/ft2build.h @@ -2,7 +2,7 @@ /* */ /* ft2build.h */ /* */ -/* FreeType 2 build and setup macros. */ +/* Spectre FreeType 2 build and setup macros. */ /* */ /* Copyright 1996-2018 by */ /* David Turner, Robert Wilhelm, and Werner Lemberg. */ @@ -31,12 +31,12 @@ /*************************************************************************/ -#ifndef FT2BUILD_H_ -#define FT2BUILD_H_ +#ifndef SPECTRE_FT2BUILD_H_ +#define SPECTRE_FT2BUILD_H_ + +#define FT_CONFIG_OPTIONS_H +#define FT_CONFIG_MODULES_H #include -#endif /* FT2BUILD_H_ */ - - -/* END */ +#endif /* SPECTRE_FT2BUILD_H_ */ diff --git a/vendor/FreeType2/include/ftspectre/modules.h b/vendor/FreeType2/include/ftspectre/modules.h new file mode 100644 index 0000000..8eacc38 --- /dev/null +++ b/vendor/FreeType2/include/ftspectre/modules.h @@ -0,0 +1,34 @@ +/* + * Spectre FreeType2 module config. + * This file registers the FreeType modules compiled into the library. + */ + +/* + * Drivers + */ +FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class ) +FT_USE_MODULE( FT_Driver_ClassRec, cff_driver_class ) +/* FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, t1cid_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, pfr_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, t42_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, winfnt_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class ) */ +/* FT_USE_MODULE( FT_Driver_ClassRec, bdf_driver_class ) */ + +/* + * Rendering + */ +FT_USE_MODULE( FT_Renderer_Class, ft_raster1_renderer_class ) /* Monochrome */ +FT_USE_MODULE( FT_Renderer_Class, ft_smooth_renderer_class ) /* AntiAlias */ +/* FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcd_renderer_class ) */ +/* FT_USE_MODULE( FT_Renderer_Class, ft_smooth_lcdv_renderer_class ) */ + +/* + * Dependancies + */ +FT_USE_MODULE( FT_Module_Class, autofit_module_class ) +FT_USE_MODULE( FT_Module_Class, psaux_module_class ) /* needed by CFF/OpenType driver */ +FT_USE_MODULE( FT_Module_Class, psnames_module_class ) /* needed by CFF/OpenType & TrueType driver */ +FT_USE_MODULE( FT_Module_Class, pshinter_module_class ) /* needed by CFF/OpenType driver */ +FT_USE_MODULE( FT_Module_Class, sfnt_module_class ) /* needed by TrueType driver */ diff --git a/vendor/FreeType2/include/ftspectre/options.h b/vendor/FreeType2/include/ftspectre/options.h new file mode 100644 index 0000000..8d16b6a --- /dev/null +++ b/vendor/FreeType2/include/ftspectre/options.h @@ -0,0 +1,925 @@ +/***************************************************************************/ +/* */ +/* Spectre FreeType2 Options config */ +/* */ +/* User-selectable configuration macros (specification only). */ +/* */ +/* Copyright 1996-2018 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. */ +/* */ +/***************************************************************************/ + +#ifndef SPECTRE_FTOPTION_H_ +#define SPECTRE_FTOPTION_H_ + + +#include + + +FT_BEGIN_HEADER + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** G E N E R A L F R E E T Y P E 2 C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*#***********************************************************************/ + /* */ + /* If you enable this configuration option, FreeType recognizes an */ + /* environment variable called `FREETYPE_PROPERTIES', which can be used */ + /* to control the various font drivers and modules. The controllable */ + /* properties are listed in the section @properties. */ + /* */ + /* You have to undefine this configuration option on platforms that lack */ + /* the concept of environment variables (and thus don't have the */ + /* `getenv' function), for example Windows CE. */ + /* */ + /* `FREETYPE_PROPERTIES' has the following syntax form (broken here into */ + /* multiple lines for better readability). */ + /* */ + /* { */ + /* */ + /* ':' */ + /* '=' */ + /* */ + /* ':' */ + /* '=' */ + /* ... */ + /* } */ + /* */ + /* Example: */ + /* */ + /* FREETYPE_PROPERTIES=truetype:interpreter-version=35 \ */ + /* cff:no-stem-darkening=1 \ */ + /* autofitter:warping=1 */ + /* */ +/* #define FT_CONFIG_OPTION_ENVIRONMENT_PROPERTIES */ + + + /*************************************************************************/ + /* */ + /* Uncomment the line below if you want to activate LCD rendering */ + /* technology similar to ClearType in this build of the library. This */ + /* technology triples the resolution in the direction color subpixels. */ + /* To mitigate color fringes inherent to this technology, you also need */ + /* to explicitly set up LCD filtering. */ + /* */ + /* Note that this feature is covered by several Microsoft patents */ + /* and should not be activated in any default build of the library. */ + /* When this macro is not defined, FreeType offers alternative LCD */ + /* rendering technology that produces excellent output without LCD */ + /* filtering. */ + /* */ +/* #define FT_CONFIG_OPTION_SUBPIXEL_RENDERING */ + + + /*************************************************************************/ + /* */ + /* Many compilers provide a non-ANSI 64-bit data type that can be used */ + /* by FreeType to speed up some computations. However, this will create */ + /* some problems when compiling the library in strict ANSI mode. */ + /* */ + /* For this reason, the use of 64-bit integers is normally disabled when */ + /* the __STDC__ macro is defined. You can however disable this by */ + /* defining the macro FT_CONFIG_OPTION_FORCE_INT64 here. */ + /* */ + /* For most compilers, this will only create compilation warnings when */ + /* building the library. */ + /* */ + /* ObNote: The compiler-specific 64-bit integers are detected in the */ + /* file `ftconfig.h' either statically or through the */ + /* `configure' script on supported platforms. */ + /* */ +#undef FT_CONFIG_OPTION_FORCE_INT64 + + + /*************************************************************************/ + /* */ + /* If this macro is defined, do not try to use an assembler version of */ + /* performance-critical functions (e.g. FT_MulFix). You should only do */ + /* that to verify that the assembler function works properly, or to */ + /* execute benchmark tests of the various implementations. */ +/* #define FT_CONFIG_OPTION_NO_ASSEMBLER */ + + + /*************************************************************************/ + /* */ + /* If this macro is defined, try to use an inlined assembler version of */ + /* the `FT_MulFix' function, which is a `hotspot' when loading and */ + /* hinting glyphs, and which should be executed as fast as possible. */ + /* */ + /* Note that if your compiler or CPU is not supported, this will default */ + /* to the standard and portable implementation found in `ftcalc.c'. */ + /* */ +#define FT_CONFIG_OPTION_INLINE_MULFIX + + + /*************************************************************************/ + /* */ + /* LZW-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `compress' program. This is mostly used to parse many of the PCF */ + /* files that come with various X11 distributions. The implementation */ + /* uses NetBSD's `zopen' to partially uncompress the file on the fly */ + /* (see src/lzw/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. */ + /* */ +/* #define FT_CONFIG_OPTION_USE_LZW */ + + + /*************************************************************************/ + /* */ + /* Gzip-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `gzip' program. This is mostly used to parse many of the PCF files */ + /* that come with XFree86. The implementation uses `zlib' to */ + /* partially uncompress the file on the fly (see src/gzip/ftgzip.c). */ + /* */ + /* Define this macro if you want to enable this `feature'. See also */ + /* the macro FT_CONFIG_OPTION_SYSTEM_ZLIB below. */ + /* */ +/* #define FT_CONFIG_OPTION_USE_ZLIB */ + + + /*************************************************************************/ + /* */ + /* ZLib library selection */ + /* */ + /* This macro is only used when FT_CONFIG_OPTION_USE_ZLIB is defined. */ + /* It allows FreeType's `ftgzip' component to link to the system's */ + /* installation of the ZLib library. This is useful on systems like */ + /* Unix or VMS where it generally is already available. */ + /* */ + /* If you let it undefined, the component will use its own copy */ + /* of the zlib sources instead. These have been modified to be */ + /* included directly within the component and *not* export external */ + /* function names. This allows you to link any program with FreeType */ + /* _and_ ZLib without linking conflicts. */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ + /* If you use a build system like cmake or the `configure' script, */ + /* options set by those programs have precendence, overwriting the */ + /* value here with the configured one. */ + /* */ +/* #define FT_CONFIG_OPTION_SYSTEM_ZLIB */ + + + /*************************************************************************/ + /* */ + /* Bzip2-compressed file support. */ + /* */ + /* FreeType now handles font files that have been compressed with the */ + /* `bzip2' program. This is mostly used to parse many of the PCF */ + /* files that come with XFree86. The implementation uses `libbz2' to */ + /* partially uncompress the file on the fly (see src/bzip2/ftbzip2.c). */ + /* Contrary to gzip, bzip2 currently is not included and need to use */ + /* the system available bzip2 implementation. */ + /* */ + /* Define this macro if you want to enable this `feature'. */ + /* */ + /* If you use a build system like cmake or the `configure' script, */ + /* options set by those programs have precendence, overwriting the */ + /* value here with the configured one. */ + /* */ +/* #define FT_CONFIG_OPTION_USE_BZIP2 */ + + + /*************************************************************************/ + /* */ + /* Define to disable the use of file stream functions and types, FILE, */ + /* fopen() etc. Enables the use of smaller system libraries on embedded */ + /* systems that have multiple system libraries, some with or without */ + /* file stream support, in the cases where file stream support is not */ + /* necessary such as memory loading of font files. */ + /* */ +/* #define FT_CONFIG_OPTION_DISABLE_STREAM_SUPPORT */ + + + /*************************************************************************/ + /* */ + /* PNG bitmap support. */ + /* */ + /* FreeType now handles loading color bitmap glyphs in the PNG format. */ + /* This requires help from the external libpng library. Uncompressed */ + /* color bitmaps do not need any external libraries and will be */ + /* supported regardless of this configuration. */ + /* */ + /* Define this macro if you want to enable this `feature'. */ + /* */ + /* If you use a build system like cmake or the `configure' script, */ + /* options set by those programs have precendence, overwriting the */ + /* value here with the configured one. */ + /* */ +/* #define FT_CONFIG_OPTION_USE_PNG */ + + + /*************************************************************************/ + /* */ + /* HarfBuzz support. */ + /* */ + /* FreeType uses the HarfBuzz library to improve auto-hinting of */ + /* OpenType fonts. If available, many glyphs not directly addressable */ + /* by a font's character map will be hinted also. */ + /* */ + /* Define this macro if you want to enable this `feature'. */ + /* */ + /* If you use a build system like cmake or the `configure' script, */ + /* options set by those programs have precendence, overwriting the */ + /* value here with the configured one. */ + /* */ +/* #define FT_CONFIG_OPTION_USE_HARFBUZZ */ + + + /*************************************************************************/ + /* */ + /* Glyph Postscript Names handling */ + /* */ + /* By default, FreeType 2 is compiled with the `psnames' module. This */ + /* module is in charge of converting a glyph name string into a */ + /* Unicode value, or return a Macintosh standard glyph name for the */ + /* use with the TrueType `post' table. */ + /* */ + /* Undefine this macro if you do not want `psnames' compiled in your */ + /* build of FreeType. This has the following effects: */ + /* */ + /* - The TrueType driver will provide its own set of glyph names, */ + /* if you build it to support postscript names in the TrueType */ + /* `post' table, but will not synthesize a missing Unicode charmap. */ + /* */ + /* - The Type 1 driver will not be able to synthesize a Unicode */ + /* charmap out of the glyphs found in the fonts. */ + /* */ + /* You would normally undefine this configuration macro when building */ + /* a version of FreeType that doesn't contain a Type 1 or CFF driver. */ + /* */ +#define FT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Postscript Names to Unicode Values support */ + /* */ + /* By default, FreeType 2 is built with the `PSNames' module compiled */ + /* in. Among other things, the module is used to convert a glyph name */ + /* into a Unicode value. This is especially useful in order to */ + /* synthesize on the fly a Unicode charmap from the CFF/Type 1 driver */ + /* through a big table named the `Adobe Glyph List' (AGL). */ + /* */ + /* Undefine this macro if you do not want the Adobe Glyph List */ + /* compiled in your `PSNames' module. The Type 1 driver will not be */ + /* able to synthesize a Unicode charmap out of the glyphs found in the */ + /* fonts. */ + /* */ +#define FT_CONFIG_OPTION_ADOBE_GLYPH_LIST + + + /*************************************************************************/ + /* */ + /* Support for Mac fonts */ + /* */ + /* Define this macro if you want support for outline fonts in Mac */ + /* format (mac dfont, mac resource, macbinary containing a mac */ + /* resource) on non-Mac platforms. */ + /* */ + /* Note that the `FOND' resource isn't checked. */ + /* */ +#define FT_CONFIG_OPTION_MAC_FONTS + + + /*************************************************************************/ + /* */ + /* Guessing methods to access embedded resource forks */ + /* */ + /* Enable extra Mac fonts support on non-Mac platforms (e.g. */ + /* GNU/Linux). */ + /* */ + /* Resource forks which include fonts data are stored sometimes in */ + /* locations which users or developers don't expected. In some cases, */ + /* resource forks start with some offset from the head of a file. In */ + /* other cases, the actual resource fork is stored in file different */ + /* from what the user specifies. If this option is activated, */ + /* FreeType tries to guess whether such offsets or different file */ + /* names must be used. */ + /* */ + /* Note that normal, direct access of resource forks is controlled via */ + /* the FT_CONFIG_OPTION_MAC_FONTS option. */ + /* */ +#ifdef FT_CONFIG_OPTION_MAC_FONTS +#define FT_CONFIG_OPTION_GUESSING_EMBEDDED_RFORK +#endif + + + /*************************************************************************/ + /* */ + /* Allow the use of FT_Incremental_Interface to load typefaces that */ + /* contain no glyph data, but supply it via a callback function. */ + /* This is required by clients supporting document formats which */ + /* supply font data incrementally as the document is parsed, such */ + /* as the Ghostscript interpreter for the PostScript language. */ + /* */ +#define FT_CONFIG_OPTION_INCREMENTAL + + + /*************************************************************************/ + /* */ + /* The size in bytes of the render pool used by the scan-line converter */ + /* to do all of its work. */ + /* */ +#define FT_RENDER_POOL_SIZE 16384L + + + /*************************************************************************/ + /* */ + /* FT_MAX_MODULES */ + /* */ + /* The maximum number of modules that can be registered in a single */ + /* FreeType library object. 32 is the default. */ + /* */ +#define FT_MAX_MODULES 32 + + + /*************************************************************************/ + /* */ + /* Debug level */ + /* */ + /* FreeType can be compiled in debug or trace mode. In debug mode, */ + /* errors are reported through the `ftdebug' component. In trace */ + /* mode, additional messages are sent to the standard output during */ + /* execution. */ + /* */ + /* Define FT_DEBUG_LEVEL_ERROR to build the library in debug mode. */ + /* Define FT_DEBUG_LEVEL_TRACE to build it in trace mode. */ + /* */ + /* Don't define any of these macros to compile in `release' mode! */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +/* #define FT_DEBUG_LEVEL_ERROR */ +/* #define FT_DEBUG_LEVEL_TRACE */ + + + /*************************************************************************/ + /* */ + /* Autofitter debugging */ + /* */ + /* If FT_DEBUG_AUTOFIT is defined, FreeType provides some means to */ + /* control the autofitter behaviour for debugging purposes with global */ + /* boolean variables (consequently, you should *never* enable this */ + /* while compiling in `release' mode): */ + /* */ + /* _af_debug_disable_horz_hints */ + /* _af_debug_disable_vert_hints */ + /* _af_debug_disable_blue_hints */ + /* */ + /* Additionally, the following functions provide dumps of various */ + /* internal autofit structures to stdout (using `printf'): */ + /* */ + /* af_glyph_hints_dump_points */ + /* af_glyph_hints_dump_segments */ + /* af_glyph_hints_dump_edges */ + /* af_glyph_hints_get_num_segments */ + /* af_glyph_hints_get_segment_offset */ + /* */ + /* As an argument, they use another global variable: */ + /* */ + /* _af_debug_hints */ + /* */ + /* Please have a look at the `ftgrid' demo program to see how those */ + /* variables and macros should be used. */ + /* */ + /* Do not #undef these macros here since the build system might define */ + /* them for certain configurations only. */ + /* */ +/* #define FT_DEBUG_AUTOFIT */ + + + /*************************************************************************/ + /* */ + /* Memory Debugging */ + /* */ + /* FreeType now comes with an integrated memory debugger that is */ + /* capable of detecting simple errors like memory leaks or double */ + /* deletes. To compile it within your build of the library, you */ + /* should define FT_DEBUG_MEMORY here. */ + /* */ + /* Note that the memory debugger is only activated at runtime when */ + /* when the _environment_ variable `FT2_DEBUG_MEMORY' is defined also! */ + /* */ + /* Do not #undef this macro here since the build system might define */ + /* it for certain configurations only. */ + /* */ +/* #define FT_DEBUG_MEMORY */ + + + /*************************************************************************/ + /* */ + /* Module errors */ + /* */ + /* If this macro is set (which is _not_ the default), the higher byte */ + /* of an error code gives the module in which the error has occurred, */ + /* while the lower byte is the real error code. */ + /* */ + /* Setting this macro makes sense for debugging purposes only, since */ + /* it would break source compatibility of certain programs that use */ + /* FreeType 2. */ + /* */ + /* More details can be found in the files ftmoderr.h and fterrors.h. */ + /* */ +#undef FT_CONFIG_OPTION_USE_MODULE_ERRORS + + + /*************************************************************************/ + /* */ + /* Position Independent Code */ + /* */ + /* If this macro is set (which is _not_ the default), FreeType2 will */ + /* avoid creating constants that require address fixups. Instead the */ + /* constants will be moved into a struct and additional intialization */ + /* code will be used. */ + /* */ + /* Setting this macro is needed for systems that prohibit address */ + /* fixups, such as BREW. [Note that standard compilers like gcc or */ + /* clang handle PIC generation automatically; you don't have to set */ + /* FT_CONFIG_OPTION_PIC, which is only necessary for very special */ + /* compilers.] */ + /* */ + /* Note that FT_CONFIG_OPTION_PIC support is not available for all */ + /* modules (see `modules.cfg' for a complete list). For building with */ + /* FT_CONFIG_OPTION_PIC support, do the following. */ + /* */ + /* 0. Clone the repository. */ + /* 1. Define FT_CONFIG_OPTION_PIC. */ + /* 2. Remove all subdirectories in `src' that don't have */ + /* FT_CONFIG_OPTION_PIC support. */ + /* 3. Comment out the corresponding modules in `modules.cfg'. */ + /* 4. Compile. */ + /* */ +/* #define FT_CONFIG_OPTION_PIC */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** S F N T D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_EMBEDDED_BITMAPS if you want to support */ + /* embedded bitmaps in all formats using the SFNT module (namely */ + /* TrueType & OpenType). */ + /* */ +#define TT_CONFIG_OPTION_EMBEDDED_BITMAPS + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_POSTSCRIPT_NAMES if you want to be able to */ + /* load and enumerate the glyph Postscript names in a TrueType or */ + /* OpenType file. */ + /* */ + /* Note that when you do not compile the `PSNames' module by undefining */ + /* the above FT_CONFIG_OPTION_POSTSCRIPT_NAMES, the `sfnt' module will */ + /* contain additional code used to read the PS Names table from a font. */ + /* */ + /* (By default, the module uses `PSNames' to extract glyph names.) */ + /* */ +#define TT_CONFIG_OPTION_POSTSCRIPT_NAMES + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_SFNT_NAMES if your applications need to */ + /* access the internal name table in a SFNT-based format like TrueType */ + /* or OpenType. The name table contains various strings used to */ + /* describe the font, like family name, copyright, version, etc. It */ + /* does not contain any glyph name though. */ + /* */ + /* Accessing SFNT names is done through the functions declared in */ + /* `ftsnames.h'. */ + /* */ +#define TT_CONFIG_OPTION_SFNT_NAMES + + + /*************************************************************************/ + /* */ + /* TrueType CMap support */ + /* */ + /* Here you can fine-tune which TrueType CMap table format shall be */ + /* supported. */ +#define TT_CONFIG_CMAP_FORMAT_0 +#define TT_CONFIG_CMAP_FORMAT_2 +#define TT_CONFIG_CMAP_FORMAT_4 +#define TT_CONFIG_CMAP_FORMAT_6 +#define TT_CONFIG_CMAP_FORMAT_8 +#define TT_CONFIG_CMAP_FORMAT_10 +#define TT_CONFIG_CMAP_FORMAT_12 +#define TT_CONFIG_CMAP_FORMAT_13 +#define TT_CONFIG_CMAP_FORMAT_14 + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T R U E T Y P E D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BYTECODE_INTERPRETER if you want to compile */ + /* a bytecode interpreter in the TrueType driver. */ + /* */ + /* By undefining this, you will only compile the code necessary to load */ + /* TrueType glyphs without hinting. */ + /* */ + /* Do not #undef this macro here, since the build system might */ + /* define it for certain configurations only. */ + /* */ +#define TT_CONFIG_OPTION_BYTECODE_INTERPRETER + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_SUBPIXEL_HINTING if you want to compile */ + /* subpixel hinting support into the TrueType driver. This modifies the */ + /* TrueType hinting mechanism when anything but FT_RENDER_MODE_MONO is */ + /* requested. */ + /* */ + /* In particular, it modifies the bytecode interpreter to interpret (or */ + /* not) instructions in a certain way so that all TrueType fonts look */ + /* like they do in a Windows ClearType (DirectWrite) environment. See */ + /* [1] for a technical overview on what this means. See `ttinterp.h' */ + /* for more details on the LEAN option. */ + /* */ + /* There are three possible values. */ + /* */ + /* Value 1: */ + /* This value is associated with the `Infinality' moniker, */ + /* contributed by an individual nicknamed Infinality with the goal of */ + /* making TrueType fonts render better than on Windows. A high */ + /* amount of configurability and flexibility, down to rules for */ + /* single glyphs in fonts, but also very slow. Its experimental and */ + /* slow nature and the original developer losing interest meant that */ + /* this option was never enabled in default builds. */ + /* */ + /* The corresponding interpreter version is v38. */ + /* */ + /* Value 2: */ + /* The new default mode for the TrueType driver. The Infinality code */ + /* base was stripped to the bare minimum and all configurability */ + /* removed in the name of speed and simplicity. The configurability */ + /* was mainly aimed at legacy fonts like Arial, Times New Roman, or */ + /* Courier. Legacy fonts are fonts that modify vertical stems to */ + /* achieve clean black-and-white bitmaps. The new mode focuses on */ + /* applying a minimal set of rules to all fonts indiscriminately so */ + /* that modern and web fonts render well while legacy fonts render */ + /* okay. */ + /* */ + /* The corresponding interpreter version is v40. */ + /* */ + /* Value 3: */ + /* Compile both, making both v38 and v40 available (the latter is the */ + /* default). */ + /* */ + /* By undefining these, you get rendering behavior like on Windows */ + /* without ClearType, i.e., Windows XP without ClearType enabled and */ + /* Win9x (interpreter version v35). Or not, depending on how much */ + /* hinting blood and testing tears the font designer put into a given */ + /* font. If you define one or both subpixel hinting options, you can */ + /* switch between between v35 and the ones you define (using */ + /* `FT_Property_Set'). */ + /* */ + /* This option requires TT_CONFIG_OPTION_BYTECODE_INTERPRETER to be */ + /* defined. */ + /* */ + /* [1] https://www.microsoft.com/typography/cleartype/truetypecleartype.aspx */ + /* */ +/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 1 */ +/* #define TT_CONFIG_OPTION_SUBPIXEL_HINTING 2 */ +#define TT_CONFIG_OPTION_SUBPIXEL_HINTING ( 1 | 2 ) + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED to compile the */ + /* TrueType glyph loader to use Apple's definition of how to handle */ + /* component offsets in composite glyphs. */ + /* */ + /* Apple and MS disagree on the default behavior of component offsets */ + /* in composites. Apple says that they should be scaled by the scaling */ + /* factors in the transformation matrix (roughly, it's more complex) */ + /* while MS says they should not. OpenType defines two bits in the */ + /* composite flags array which can be used to disambiguate, but old */ + /* fonts will not have them. */ + /* */ + /* https://www.microsoft.com/typography/otspec/glyf.htm */ + /* https://developer.apple.com/fonts/TrueType-Reference-Manual/RM06/Chap6glyf.html */ + /* */ +#undef TT_CONFIG_OPTION_COMPONENT_OFFSET_SCALED + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_GX_VAR_SUPPORT if you want to include */ + /* support for Apple's distortable font technology (fvar, gvar, cvar, */ + /* and avar tables). This has many similarities to Type 1 Multiple */ + /* Masters support. */ + /* */ +#define TT_CONFIG_OPTION_GX_VAR_SUPPORT + + + /*************************************************************************/ + /* */ + /* Define TT_CONFIG_OPTION_BDF if you want to include support for */ + /* an embedded `BDF ' table within SFNT-based bitmap formats. */ + /* */ +#define TT_CONFIG_OPTION_BDF + + + /*************************************************************************/ + /* */ + /* Option TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES controls the maximum */ + /* number of bytecode instructions executed for a single run of the */ + /* bytecode interpreter, needed to prevent infinite loops. You don't */ + /* want to change this except for very special situations (e.g., making */ + /* a library fuzzer spend less time to handle broken fonts). */ + /* */ + /* It is not expected that this value is ever modified by a configuring */ + /* script; instead, it gets surrounded with #ifndef ... #endif so that */ + /* the value can be set as a preprocessor option on the compiler's */ + /* command line. */ + /* */ +#ifndef TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES +#define TT_CONFIG_OPTION_MAX_RUNNABLE_OPCODES 1000000L +#endif + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** T Y P E 1 D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* T1_MAX_DICT_DEPTH is the maximum depth of nest dictionaries and */ + /* arrays in the Type 1 stream (see t1load.c). A minimum of 4 is */ + /* required. */ + /* */ +#define T1_MAX_DICT_DEPTH 5 + + + /*************************************************************************/ + /* */ + /* T1_MAX_SUBRS_CALLS details the maximum number of nested sub-routine */ + /* calls during glyph loading. */ + /* */ +#define T1_MAX_SUBRS_CALLS 16 + + + /*************************************************************************/ + /* */ + /* T1_MAX_CHARSTRING_OPERANDS is the charstring stack's capacity. A */ + /* minimum of 16 is required. */ + /* */ + /* The Chinese font MingTiEG-Medium (CNS 11643 character set) needs 256. */ + /* */ +#define T1_MAX_CHARSTRINGS_OPERANDS 256 + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of `t1afm', which is in charge of reading Type 1 AFM */ + /* files into an existing face. Note that if set, the T1 driver will be */ + /* unable to produce kerning distances. */ + /* */ +#undef T1_CONFIG_OPTION_NO_AFM + + + /*************************************************************************/ + /* */ + /* Define this configuration macro if you want to prevent the */ + /* compilation of the Multiple Masters font support in the Type 1 */ + /* driver. */ + /* */ +#undef T1_CONFIG_OPTION_NO_MM_SUPPORT + + + /*************************************************************************/ + /* */ + /* T1_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe Type 1 */ + /* engine gets compiled into FreeType. If defined, it is possible to */ + /* switch between the two engines using the `hinting-engine' property of */ + /* the type1 driver module. */ + /* */ +/* #define T1_CONFIG_OPTION_OLD_ENGINE */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** C F F D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Using CFF_CONFIG_OPTION_DARKENING_PARAMETER_{X,Y}{1,2,3,4} it is */ + /* possible to set up the default values of the four control points that */ + /* define the stem darkening behaviour of the (new) CFF engine. For */ + /* more details please read the documentation of the */ + /* `darkening-parameters' property (file `ftdriver.h'), which allows the */ + /* control at run-time. */ + /* */ + /* Do *not* undefine these macros! */ + /* */ +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 500 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 400 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 1000 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 275 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 1667 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 275 + +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 2333 +#define CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 0 + + + /*************************************************************************/ + /* */ + /* CFF_CONFIG_OPTION_OLD_ENGINE controls whether the pre-Adobe CFF */ + /* engine gets compiled into FreeType. If defined, it is possible to */ + /* switch between the two engines using the `hinting-engine' property of */ + /* the cff driver module. */ + /* */ +/* #define CFF_CONFIG_OPTION_OLD_ENGINE */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** P C F D R I V E R C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* There are many PCF fonts just called `Fixed' which look completely */ + /* different, and which have nothing to do with each other. When */ + /* selecting `Fixed' in KDE or Gnome one gets results that appear rather */ + /* random, the style changes often if one changes the size and one */ + /* cannot select some fonts at all. This option makes the PCF module */ + /* prepend the foundry name (plus a space) to the family name. */ + /* */ + /* We also check whether we have `wide' characters; all put together, we */ + /* get family names like `Sony Fixed' or `Misc Fixed Wide'. */ + /* */ + /* If this option is activated, it can be controlled with the */ + /* `no-long-family-names' property of the pcf driver module. */ + /* */ +/* #define PCF_CONFIG_OPTION_LONG_FAMILY_NAMES */ + + + /*************************************************************************/ + /*************************************************************************/ + /**** ****/ + /**** A U T O F I T M O D U L E C O N F I G U R A T I O N ****/ + /**** ****/ + /*************************************************************************/ + /*************************************************************************/ + + + /*************************************************************************/ + /* */ + /* Compile autofit module with CJK (Chinese, Japanese, Korean) script */ + /* support. */ + /* */ +#define AF_CONFIG_OPTION_CJK + + /*************************************************************************/ + /* */ + /* Compile autofit module with fallback Indic script support, covering */ + /* some scripts that the `latin' submodule of the autofit module doesn't */ + /* (yet) handle. */ + /* */ +#define AF_CONFIG_OPTION_INDIC + + /*************************************************************************/ + /* */ + /* Compile autofit module with warp hinting. The idea of the warping */ + /* code is to slightly scale and shift a glyph within a single dimension */ + /* so that as much of its segments are aligned (more or less) on the */ + /* grid. To find out the optimal scaling and shifting value, various */ + /* parameter combinations are tried and scored. */ + /* */ + /* This experimental option is active only if the rendering mode is */ + /* FT_RENDER_MODE_LIGHT; you can switch warping on and off with the */ + /* `warping' property of the auto-hinter (see file `ftdriver.h' for more */ + /* information; by default it is switched off). */ + /* */ +#define AF_CONFIG_OPTION_USE_WARPER + + /*************************************************************************/ + /* */ + /* Use TrueType-like size metrics for `light' auto-hinting. */ + /* */ + /* It is strongly recommended to avoid this option, which exists only to */ + /* help some legacy applications retain its appearance and behaviour */ + /* with respect to auto-hinted TrueType fonts. */ + /* */ + /* The very reason this option exists at all are GNU/Linux distributions */ + /* like Fedora that did not un-patch the following change (which was */ + /* present in FreeType between versions 2.4.6 and 2.7.1, inclusive). */ + /* */ + /* 2011-07-16 Steven Chu */ + /* */ + /* [truetype] Fix metrics on size request for scalable fonts. */ + /* */ + /* This problematic commit is now reverted (more or less). */ + /* */ +/* #define AF_CONFIG_OPTION_TT_SIZE_METRICS */ + + /* */ + + + /* + * This macro is defined if native TrueType hinting is requested by the + * definitions above. + */ +#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER +#define TT_USE_BYTECODE_INTERPRETER + +#ifdef TT_CONFIG_OPTION_SUBPIXEL_HINTING +#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 1 +#define TT_SUPPORT_SUBPIXEL_HINTING_INFINALITY +#endif + +#if TT_CONFIG_OPTION_SUBPIXEL_HINTING & 2 +#define TT_SUPPORT_SUBPIXEL_HINTING_MINIMAL +#endif +#endif +#endif + + + /* + * Check CFF darkening parameters. The checks are the same as in function + * `cff_property_set' in file `cffdrivr.c'. + */ +#if CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 < 0 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 < 0 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 < 0 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X1 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X2 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X3 > \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_X4 || \ + \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y1 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y2 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y3 > 500 || \ + CFF_CONFIG_OPTION_DARKENING_PARAMETER_Y4 > 500 +#error "Invalid CFF darkening parameters!" +#endif + +FT_END_HEADER + + +#endif /* SPECTRE_FTOPTION_H_ */ From b53ddfb3fa86fa8e4a41a8fbd39ae0019a8d8ecd Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 7 Jan 2020 06:25:11 +0100 Subject: [PATCH 012/361] vendor/FreeType2/build.lua: Pass full path to include directory (as it's relative to root dir). --- vendor/FreeType2/build.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/FreeType2/build.lua b/vendor/FreeType2/build.lua index 316b427..b526917 100644 --- a/vendor/FreeType2/build.lua +++ b/vendor/FreeType2/build.lua @@ -27,7 +27,7 @@ settings = TableDeepCopy(global_settings) settings.labelprefix = "[FT2] " -- Compile flags -settings.cc.includes:Add("include") +settings.cc.includes:Add(PathJoin(basepath, "include")) settings.cc.flags:Add("-DFT2_BUILD_LIBRARY") -- Build target From b564758ff67af53c54bd44aa9ae0c92d0ddf9df2 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 7 Jan 2020 06:28:24 +0100 Subject: [PATCH 013/361] bam.lua: call TableDeepCopy() when copying global_settings as just assigning it to a variable only creates a reference. --- bam.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bam.lua b/bam.lua index 47fdaca..2060260 100644 --- a/bam.lua +++ b/bam.lua @@ -74,7 +74,7 @@ end -- -- -------------------------------- -local settings = global_settings +local settings = TableDeepCopy(global_settings) settings.cc.includes:Add("include/") settings.cc.includes:Add("source/") @@ -219,7 +219,7 @@ local libspectre = StaticLibrary(settings, -- -- -------------------------------- -local example_settings = global_settings +local example_settings = TableDeepCopy(global_settings) -- Include spectre headers. example_settings.cc.includes:Add("include/") From ce575cc122dc38e4d44236ee546c78d53e472004 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 7 Jan 2020 06:33:50 +0100 Subject: [PATCH 014/361] .bam/functions.lua: whitespace fixes. --- .bam/functions.lua | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.bam/functions.lua b/.bam/functions.lua index 1232174..bbbaee6 100644 --- a/.bam/functions.lua +++ b/.bam/functions.lua @@ -3,7 +3,7 @@ local _systems = { "Win32", -- "Linux" } - + -- Returns a string of all supported systems function supported_systems() @@ -15,11 +15,11 @@ end function system() local win = os.getenv('OS') - + if win:lower():match('windows') then return _systems[1] end - + return nil end @@ -35,13 +35,13 @@ function Module(path, src) end -- Copy a directory src to dst --- src = "path/to/a", dest = "path/to/b" -> the whole content +-- src = "path/to/a", dest = "path/to/b" -> the whole content -- of "a" will be copied to "path/to/b" function CopyDir(dst, src) local r = {} local base = PathDir(src) local files = CollectRecursive(Path(src) .. "/*") - + for k, v in pairs(files) do local rdir = PathDir(v:sub(base:len() + 1)) r[k] = CopyToDirectory(PathJoin(dst, rdir), v) @@ -55,13 +55,13 @@ end function BuildExample(settings, name, dependencies) Import("examples/" .. name .. "/bam.lua") - + exe = Link(settings, "examples/" .. name, Compile(settings, src)) - + if dependencies ~= nil and #dependencies > 0 then AddDependency(exe, dependencies) end - + return exe end @@ -74,4 +74,4 @@ function BuildExamples(settings, names, dependencies) r[i] = BuildExample(settings, names[i], dependencies) end return r -end \ No newline at end of file +end From ddd41971e145298dfb51b6efd1f104d18ec48c4c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 7 Jan 2020 06:34:40 +0100 Subject: [PATCH 015/361] .bam/functions.lua: adding CopySettings functions --- .bam/functions.lua | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.bam/functions.lua b/.bam/functions.lua index bbbaee6..1312770 100644 --- a/.bam/functions.lua +++ b/.bam/functions.lua @@ -23,6 +23,15 @@ function system() return nil end +-- Copy settings with a optional label prefix. +function CopySettings(settings, prefix) + local n = TableDeepCopy(settings) + if prefix ~= nil then + n.labelprefix = string.format("[%s] ", prefix) + end + return n +end + -- Defines a module -- path: base path to source files. -- src: table of source files. From f3cada7ac8a71d44ec82bc43eba89cb0b127e770 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 7 Jan 2020 06:35:00 +0100 Subject: [PATCH 016/361] bam.lua: use CopySettings() function. --- bam.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bam.lua b/bam.lua index 2060260..a169c2d 100644 --- a/bam.lua +++ b/bam.lua @@ -74,7 +74,7 @@ end -- -- -------------------------------- -local settings = TableDeepCopy(global_settings) +local settings = CopySettings(global_settings, "Engine") settings.cc.includes:Add("include/") settings.cc.includes:Add("source/") @@ -219,7 +219,7 @@ local libspectre = StaticLibrary(settings, -- -- -------------------------------- -local example_settings = TableDeepCopy(global_settings) +local example_settings = CopySettings(global_settings, "Example") -- Include spectre headers. example_settings.cc.includes:Add("include/") From e4c086a1ebf444bdc926557da45c9e4f6fa45623 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 7 Jan 2020 06:54:50 +0100 Subject: [PATCH 017/361] bam: move examples stuff to it's own file. --- bam.lua | 31 +++---------------------------- examples/build.lua | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 28 deletions(-) create mode 100644 examples/build.lua diff --git a/bam.lua b/bam.lua index a169c2d..e2d9f73 100644 --- a/bam.lua +++ b/bam.lua @@ -207,36 +207,11 @@ local obj = Compile(settings, { scene_module }) -local libspectre = StaticLibrary(settings, +libspectre = StaticLibrary(settings, "spectre", obj, ft2_obj ) --------------------------------- --- -- --- Examples -- --- -- --------------------------------- - -local example_settings = CopySettings(global_settings, "Example") - --- Include spectre headers. -example_settings.cc.includes:Add("include/") - --- Link with spectre. -example_settings.link.extrafiles:Add(libspectre) - -if TARGET_OS == "Win32" then - - -- Windows needs to link against these. - example_settings.link.libs:Add("opengl32", "gdi32", "user32") -end - --- For now, to get examples working --- we copy the whole assets directory. -assets = CopyDir(PathJoin(paths.build, paths.examples), "assets") - -BuildExamples(example_settings, { - "text" -}, assets) +-- Examples +Import("examples/build.lua") diff --git a/examples/build.lua b/examples/build.lua new file mode 100644 index 0000000..d60361d --- /dev/null +++ b/examples/build.lua @@ -0,0 +1,27 @@ +-------------------------------- +-- -- +-- Examples -- +-- -- +-------------------------------- + +local example_settings = CopySettings(global_settings, "Example") + +-- Include spectre headers. +example_settings.cc.includes:Add("include/") + +-- Link with spectre. +example_settings.link.extrafiles:Add(libspectre) + +if TARGET_OS == "Win32" then + + -- Windows needs to link against these. + example_settings.link.libs:Add("opengl32", "gdi32", "user32") +end + +-- For now, to get examples working +-- we copy the whole assets directory. +assets = CopyDir(PathJoin(paths.build, paths.examples), "assets") + +BuildExamples(example_settings, { + "text" +}, assets) From a19944437bcd654a6fbc96e0ca9d37da4f6b5341 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 7 Jan 2020 06:57:56 +0100 Subject: [PATCH 018/361] bam: Define engine library as default target and add "examples" pseudo target. --- bam.lua | 2 ++ examples/build.lua | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/bam.lua b/bam.lua index e2d9f73..c077eec 100644 --- a/bam.lua +++ b/bam.lua @@ -213,5 +213,7 @@ libspectre = StaticLibrary(settings, ft2_obj ) +DefaultTarget(libspectre) + -- Examples Import("examples/build.lua") diff --git a/examples/build.lua b/examples/build.lua index d60361d..dd839cb 100644 --- a/examples/build.lua +++ b/examples/build.lua @@ -22,6 +22,8 @@ end -- we copy the whole assets directory. assets = CopyDir(PathJoin(paths.build, paths.examples), "assets") -BuildExamples(example_settings, { +examples = BuildExamples(example_settings, { "text" }, assets) + +PseudoTarget("examples", examples) From 66f3bb30d91679262e2a6b8cbd7c7432365dce61 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 7 Jan 2020 07:11:02 +0100 Subject: [PATCH 019/361] bam: Move library build to engine.build.lua file. --- bam.lua | 148 ++--------------------------------------------- engine.build.lua | 148 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+), 143 deletions(-) create mode 100644 engine.build.lua diff --git a/bam.lua b/bam.lua index c077eec..8dbb3c0 100644 --- a/bam.lua +++ b/bam.lua @@ -70,150 +70,12 @@ end -------------------------------- -- -- --- Engine configuration -- +-- Build Targets -- -- -- -------------------------------- -local settings = CopySettings(global_settings, "Engine") - -settings.cc.includes:Add("include/") -settings.cc.includes:Add("source/") - --- FreeType2 -settings.cc.includes:Add("vendor/FreeType2/include") - --- STB -settings.cc.includes:Add("vendor/stb/include") - --- Source files --------------------------------- - -local system_module = Module("source/System", { - "File.cpp", - "MessageHandler.cpp", - "MessageQueue.cpp", - "SystemEvent.cpp", - "Log.cpp" -}) - -local platform_common_module = Module("source/Platform", { - "PlatformDisplay.cpp" -}) - - --- if TARGET_OS == "Win32" then -- Needed later for unix. -platform_spec_module = Module("source/Platform/Win32", { - "Win32Application.cpp", - "Win32Display.cpp", - "Win32GLContext.cpp", - "Win32Input.cpp", - "Win32Internal.cpp", - "Win32Keyboard.cpp", - "Win32Misc.cpp", - "Win32Mouse.cpp", - "Win32MsgBuffer.cpp", - "Win32System.cpp", - "glad_wgl.c" -}) ---end - -local input_module = Module("source/Input", { - "InputDevice.cpp", - "InputEvent.cpp", - "InputListener.cpp", - "InputModule.cpp", - "Keyboard.cpp", - "Mouse.cpp" -}) - -local display_module = Module("source/Display", { - "Display.cpp", - "DisplayDescription.cpp", - "DisplayMode.cpp", - "GLContext.cpp" -}) - -local graphics_module = Module("source/Graphics", { - -- Primitives - "Vertex2D.cpp", - "Transformable.cpp", - "Sprite.cpp", - - -- Rendering - "BatchRenderer2D.cpp", - "DefaultRenderer2D.cpp", - "Renderable2D.cpp", - "Renderer2D.cpp", - "RenderState.cpp", - "Shader.cpp", - "ShaderProgram.cpp", - "Texture.cpp", - - -- Text - "Font/Engine/FreeTypeEngine.cpp", - "Font/Engine/FreeTypeError.cpp", - "Font/Engine/FreeTypeLib.cpp", - "Font/FontDescription.cpp", - "Font.cpp", - "Text.cpp", - - -- Image - "Image.cpp", - "ImageLoader.cpp", - - "OpenGL.cpp", - "GL/glad.c", - "GL/CheckError.cpp", -}) - -local core_module = Module("source/Core", { - "String.cpp" -}) - -local math_module = Module("source/Math", { - "Color.cpp", - "Logarithm.cpp", - "Math.cpp", - "Transform.cpp" -}) - -local game_module = Module("source", { - "Game/FPSCounter.cpp", - "Game/GameTime.cpp", - "Game.cpp", -}) - -local scene_module = Module("source/Scene", { - "Camera2D.cpp" -}) - --- Build target --------------------------------- - --- Dependancies -Import("vendor/FreeType2/build.lua") - --- engine -local obj = Compile(settings, { - system_module, - platform_common_module, - platform_spec_module, - input_module, - display_module, - graphics_module, - core_module, - math_module, - game_module, - scene_module -}) - -libspectre = StaticLibrary(settings, - "spectre", - obj, - ft2_obj -) - -DefaultTarget(libspectre) - --- Examples +Import("engine.build.lua") Import("examples/build.lua") + +-- Set engine library as default target +DefaultTarget(libspectre) diff --git a/engine.build.lua b/engine.build.lua new file mode 100644 index 0000000..b3e3f7c --- /dev/null +++ b/engine.build.lua @@ -0,0 +1,148 @@ +----------------------------------------------------------- +-- -- +-- Engine configuration -- +-- -- +-- Builds Spectre engine as static library. -- +-- -- +-- Output variables: -- +-- libspectre = path to .lib file -- +----------------------------------------------------------- + +local settings = CopySettings(global_settings, "Engine") + +settings.cc.includes:Add("include/") +settings.cc.includes:Add("source/") + +-- FreeType2 +settings.cc.includes:Add("vendor/FreeType2/include") + +-- STB +settings.cc.includes:Add("vendor/stb/include") + +-- Source files +----------------------------------------------------------- + +local system_module = Module("source/System", { + "File.cpp", + "MessageHandler.cpp", + "MessageQueue.cpp", + "SystemEvent.cpp", + "Log.cpp" +}) + +local platform_common_module = Module("source/Platform", { + "PlatformDisplay.cpp" +}) + + +-- if TARGET_OS == "Win32" then -- Needed later for unix. +local platform_spec_module = Module("source/Platform/Win32", { + "Win32Application.cpp", + "Win32Display.cpp", + "Win32GLContext.cpp", + "Win32Input.cpp", + "Win32Internal.cpp", + "Win32Keyboard.cpp", + "Win32Misc.cpp", + "Win32Mouse.cpp", + "Win32MsgBuffer.cpp", + "Win32System.cpp", + "glad_wgl.c" +}) +--end + +local input_module = Module("source/Input", { + "InputDevice.cpp", + "InputEvent.cpp", + "InputListener.cpp", + "InputModule.cpp", + "Keyboard.cpp", + "Mouse.cpp" +}) + +local display_module = Module("source/Display", { + "Display.cpp", + "DisplayDescription.cpp", + "DisplayMode.cpp", + "GLContext.cpp" +}) + +local graphics_module = Module("source/Graphics", { + -- Primitives + "Vertex2D.cpp", + "Transformable.cpp", + "Sprite.cpp", + + -- Rendering + "BatchRenderer2D.cpp", + "DefaultRenderer2D.cpp", + "Renderable2D.cpp", + "Renderer2D.cpp", + "RenderState.cpp", + "Shader.cpp", + "ShaderProgram.cpp", + "Texture.cpp", + + -- Text + "Font/Engine/FreeTypeEngine.cpp", + "Font/Engine/FreeTypeError.cpp", + "Font/Engine/FreeTypeLib.cpp", + "Font/FontDescription.cpp", + "Font.cpp", + "Text.cpp", + + -- Image + "Image.cpp", + "ImageLoader.cpp", + + "OpenGL.cpp", + "GL/glad.c", + "GL/CheckError.cpp", +}) + +local core_module = Module("source/Core", { + "String.cpp" +}) + +local math_module = Module("source/Math", { + "Color.cpp", + "Logarithm.cpp", + "Math.cpp", + "Transform.cpp" +}) + +local game_module = Module("source", { + "Game/FPSCounter.cpp", + "Game/GameTime.cpp", + "Game.cpp", +}) + +local scene_module = Module("source/Scene", { + "Camera2D.cpp" +}) + +-- Build target +----------------------------------------------------------- + +-- Dependancies +Import("vendor/FreeType2/build.lua") + +-- engine +local obj = Compile(settings, { + system_module, + platform_common_module, + platform_spec_module, + input_module, + display_module, + graphics_module, + core_module, + math_module, + game_module, + scene_module +}) + +libspectre = StaticLibrary(settings, + "spectre", + obj, + ft2_obj +) From 1a218532c039639c96d19dc1da609fe5a900a78e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 10 Jan 2020 00:45:11 +0100 Subject: [PATCH 020/361] source/System/File.cpp: move path stuff to Path.cpp --- engine.build.lua | 1 + include/Spectre/System/File.h | 6 ------ include/Spectre/System/Path.h | 19 +++++++++++++++++++ source/Graphics/ImageLoader.cpp | 4 ++-- source/Graphics/Shader.cpp | 4 ++-- source/Graphics/ShaderProgram.cpp | 4 ++-- source/System/File.cpp | 18 ------------------ source/System/Path.cpp | 24 ++++++++++++++++++++++++ 8 files changed, 50 insertions(+), 30 deletions(-) create mode 100644 include/Spectre/System/Path.h create mode 100644 source/System/Path.cpp diff --git a/engine.build.lua b/engine.build.lua index b3e3f7c..d2ddd58 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -24,6 +24,7 @@ settings.cc.includes:Add("vendor/stb/include") local system_module = Module("source/System", { "File.cpp", + "Path.cpp", "MessageHandler.cpp", "MessageQueue.cpp", "SystemEvent.cpp", diff --git a/include/Spectre/System/File.h b/include/Spectre/System/File.h index d3bad58..210f12d 100644 --- a/include/Spectre/System/File.h +++ b/include/Spectre/System/File.h @@ -7,12 +7,6 @@ namespace sp { namespace file { - std::string getBasename(const std::string& path); - - std::string getExtension(const std::string& path); - - std::string getPathname(const std::string& path); - std::vector read(const std::string& path); } } diff --git a/include/Spectre/System/Path.h b/include/Spectre/System/Path.h new file mode 100644 index 0000000..a6fa1bd --- /dev/null +++ b/include/Spectre/System/Path.h @@ -0,0 +1,19 @@ + +#ifndef SYSTEM_PATH_H +#define SYSTEM_PATH_H + +#include + +namespace sp { + +class Path +{ +public : + static std::string getBasename(const std::string& path); + + static std::string getExtension(const std::string& path); +}; + +} // namespace sp + +#endif /* SYSTEM_PATH_H */ diff --git a/source/Graphics/ImageLoader.cpp b/source/Graphics/ImageLoader.cpp index b3af11f..6827c57 100644 --- a/source/Graphics/ImageLoader.cpp +++ b/source/Graphics/ImageLoader.cpp @@ -1,5 +1,5 @@ -#include +#include #include #include #include "ImageLoader.h" @@ -61,7 +61,7 @@ bool ImageLoader::loadFromMemory(const void *data, unsigned size, Image& img) // TODO: Support more formats. bool ImageLoader::saveToFile(const Image& img, const char *filename) { - std::string ext = file::getExtension(filename); + std::string ext = Path::getExtension(filename); std::vector encoded_data; if (ext == "png") { diff --git a/source/Graphics/Shader.cpp b/source/Graphics/Shader.cpp index 6fdee60..47f1016 100644 --- a/source/Graphics/Shader.cpp +++ b/source/Graphics/Shader.cpp @@ -1,6 +1,6 @@ #include -#include +#include #include #include @@ -37,7 +37,7 @@ bool Shader::loadFromFile(const std::string& file) // If this shader does not have a name, pick the filename. if (m_name.length() < 1) { - m_name = file::getBasename(file); + m_name = Path::getBasename(file); } // Load file into memory. diff --git a/source/Graphics/ShaderProgram.cpp b/source/Graphics/ShaderProgram.cpp index c8baf0b..0a0da3f 100644 --- a/source/Graphics/ShaderProgram.cpp +++ b/source/Graphics/ShaderProgram.cpp @@ -1,7 +1,7 @@ #include #include -#include +#include #include namespace sp { @@ -38,7 +38,7 @@ void ShaderProgram::addShader(const Shader& shader) bool ShaderProgram::loadFromFile(const std::string& filename) { - std::string extension = file::getExtension(filename); + std::string extension = Path::getExtension(filename); // Meta file. load real shaders. if (extension == "shader.glsl") { diff --git a/source/System/File.cpp b/source/System/File.cpp index 9d6f31d..f2d82d7 100644 --- a/source/System/File.cpp +++ b/source/System/File.cpp @@ -5,24 +5,6 @@ namespace sp { namespace file { - std::string getBasename(const std::string& path) { - - size_t p = path.find_last_of('/'); - - if (p == std::string::npos) - return path; - return path.substr(p + 1); - } - - std::string getExtension(const std::string& path) { - - std::string base_name = getBasename(path); - size_t p = base_name.find_first_of('.'); - if (p == std::string::npos) - return ""; - return base_name.substr(p + 1); - } - std::vector read(const std::string& path) { std::vector buf; diff --git a/source/System/Path.cpp b/source/System/Path.cpp new file mode 100644 index 0000000..6e53da2 --- /dev/null +++ b/source/System/Path.cpp @@ -0,0 +1,24 @@ + +#include + +namespace sp { + +std::string Path::getBasename(const std::string& path) +{ + size_t p = path.find_last_of('/'); + + if (p == std::string::npos) + return path; + return path.substr(p + 1); +} + +std::string Path::getExtension(const std::string& path) +{ + std::string base_name = getBasename(path); + size_t p = base_name.find_first_of('.'); + if (p == std::string::npos) + return ""; + return base_name.substr(p + 1); +} + +} // namespace sp From 624a979356d13a7616de76a81a6d659d10e8d1cf Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 15 Jan 2020 19:49:44 +0100 Subject: [PATCH 021/361] Spectre/System/File: implement File class. --- include/Spectre/System/File.h | 105 +++++++++++++++++++++++- source/System/File.cpp | 147 +++++++++++++++++++++++++++++++--- 2 files changed, 236 insertions(+), 16 deletions(-) diff --git a/include/Spectre/System/File.h b/include/Spectre/System/File.h index 210f12d..adfc611 100644 --- a/include/Spectre/System/File.h +++ b/include/Spectre/System/File.h @@ -2,12 +2,109 @@ #ifndef SPECTRE_SYSTEM_FILE_H #define SPECTRE_SYSTEM_FILE_H -#include +#include #include -namespace sp { namespace file +namespace sp { + +class File { - std::vector read(const std::string& path); -} } +public : + + enum struct Access { + READ = 1 << 0, + WRITE = 1 << 1, + READ_WRITE = READ | WRITE, + }; + + // NOTE: These are ignored atm. as implementation uses stdio.h + enum OpenMode { + // Only open if file exists and + // in overwrite mode if write is enabled. + DEFAULT = 0, + // Create file if it does not exist (ignored in read-only mode) + CREATE = 1 << 0, + // If file exists any write calls will + // append to the file. (ignored in read-only mode) + APPEND = 1 << 1, + // If file exists it's content are discarded + // resulting in an empty file. (ignored in read-only mode) + TRUNCATE = 1 << 2 + }; + +// Methods. +public : + File(); + + // see `open()` + File(const std::string& filename, + Access access = Access::READ, + unsigned int mode = DEFAULT); + + ~File(); + + // Opens a file (default in read-only) + bool open(const std::string& filename, + Access access = Access::READ, + unsigned int mode = DEFAULT); + + // Returns true if the file is open, false otherwise. + bool isOpen() const; + + // Close the file. + void close(); + + // Get the current position in the file. + size_t pos(); + + // Set the file stream position. + // if `from_end` is true. `offset` will be applied from the end of file, otherwise from beginning. + // Returns true if the position was updated, false otherwise. + bool set(long int pos = 0, bool from_end = false); + + // Move the current file stream position with `offset` bytes. + // This is equivalent to calling set(pos() + offset) + // Returns true if the position was updated, false otherwise. + bool seek(long int offset); + + // Get the size of the file (in bytes) + size_t size() const; + + // Read `size` data from file at the current position. + // Content is stored in `ptr` and must be alteast `size` bytes. + // Returns -1 if an error occured. Otherwice the number of bytes read is returned. + size_t read(void *ptr, size_t size); + + // Read all remaining data from file at the current position. Content is stored in `buffer`. + // Returns true if exactly all data could be read from file. false otherwise. + template + inline bool read(buffer_t& buffer) + { + size_t s = size(); + buffer.resize(s); + return read((void*) &buffer[0], s) == s; + } + + // Write data to file at the current position. + // Returns -1 if an error occured. Otherwice the number of bytes written is returned. + size_t write(const void *ptr, size_t size); + + // Write data to file at the current position. + // Returns true if exactly all data could be written from `buffer`. false otherwise. + template + inline bool write(const buffer_t& buffer) + { + return write((const void*) &buffer[0], buffer.size()) == buffer.size(); + } + + // Flush any buffered data to the file. + bool flush(); + +private : + + FILE *m_handle; +}; + +} //namespace sp #endif /* SPECTRE_SYSTEM_FILE_H */ diff --git a/source/System/File.cpp b/source/System/File.cpp index f2d82d7..acc6870 100644 --- a/source/System/File.cpp +++ b/source/System/File.cpp @@ -3,20 +3,143 @@ #include #include -namespace sp { namespace file +namespace sp { + +File::File() : +m_handle (NULL) { - std::vector read(const std::string& path) { +} - std::vector buf; - FILE *fd = fopen(path.c_str(), "rb"); +File::File(const std::string& filename, Access access, unsigned int mode) : +m_handle (NULL) +{ + open(filename, access, mode); +} - if (fd) { - fseek(fd, 0, SEEK_END); - buf.resize(ftell(fd)); - rewind(fd); - fread(&buf[0], 1, buf.size(), fd); - fclose(fd); +File::~File() +{ + close(); +} + +bool File::open(const std::string& filename, Access access, unsigned int mode) +{ + std::string m; + + close(); + + if (access == Access::READ) { + m = "rb"; + } else if (access == Access::WRITE) { + if (mode & TRUNCATE) { + m = "wb"; + } else { + // NOTE: this is append mode. but stdio does only + // have "a" and "w". and "w" will truncate. + // So we need to handle append with fseek() later. + m = "ab"; } - return buf; } -} } // namespace sp::file + // Read + Write + else if (mode & TRUNCATE) { + m = "wb+"; + } else if (mode & APPEND) { + m = "ab+"; + } else { + m = "rb+"; + } + + // HACK. stdio does not have a mode for strictly create new files + // independant of access (read/write). So we will fake it by open the + // file in append mode and close it. creating the file if did not exist. + if (mode & CREATE && (access == Access::WRITE || access == Access::READ_WRITE)) { + m_handle = fopen(filename.c_str(), "a"); + if (!m_handle) { + return false; + } + fclose(m_handle); + } + + m_handle = fopen(filename.c_str(), m.c_str()); + + if (m_handle) { + + // Hack, if we opened the file in "a" mode, but did not + // have the append flag. seek to the beginning. + if (m == "ab" && mode & ~APPEND) { + fseek(m_handle, 0, SEEK_SET); + } + return true; + } + return false; +} + +bool File::isOpen() const +{ + return m_handle != NULL; +} + +void File::close() +{ + if (m_handle) { + fclose(m_handle); + m_handle = NULL; + } +} + +size_t File::pos() +{ + if (isOpen()) { + return ftell(m_handle); + } + return -1; +} + +bool File::set(long int offset, bool from_end) +{ + if (isOpen()) { + return fseek(m_handle, offset, from_end ? SEEK_END : SEEK_SET) == 0; + } + return false; +} + +bool File::seek(long int offset) +{ + if (isOpen()) { + return fseek(m_handle, offset, SEEK_CUR) == 0; + } + return false; +} + +size_t File::size() const +{ + size_t s = 0; + while(::getc(m_handle) != EOF) s++; + ::rewind(m_handle); + return s; +} + +size_t File::read(void *ptr, size_t size) +{ + if (isOpen()) { + return fread(ptr, 1, size, m_handle); + } + return -1; +} + +size_t File::write(const void *ptr, size_t size) +{ + if (isOpen()) { + return fwrite(ptr, 1, size, m_handle); + } + return -1; +} + +bool File::flush() +{ + if (isOpen()) { + return fflush(m_handle) == 0; + } + return false; +} + +} // namespace sp From 59a4f1347a20c1ba9e9dfab63593f9dcb2f2f305 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Jan 2020 21:38:10 +0100 Subject: [PATCH 022/361] source/Graphics/Shader.cpp: use the new File API --- source/Graphics/Shader.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/source/Graphics/Shader.cpp b/source/Graphics/Shader.cpp index 47f1016..e24eb1f 100644 --- a/source/Graphics/Shader.cpp +++ b/source/Graphics/Shader.cpp @@ -1,6 +1,6 @@ -#include #include +#include #include #include @@ -30,26 +30,26 @@ const std::string& Shader::getName() const return m_name; } -bool Shader::loadFromFile(const std::string& file) +bool Shader::loadFromFile(const std::string& filename) { std::string src; - std::ifstream strm; + File file; // If this shader does not have a name, pick the filename. if (m_name.length() < 1) { - m_name = Path::getBasename(file); + m_name = Path::getBasename(filename); } - // Load file into memory. - strm.open(file.c_str(), std::fstream::in); - if (!strm.is_open()) { - m_error = "Can't open file: " + file; + if (!file.open(filename)) { + m_error = "Can't open file: " + filename; return false; } - src.assign(std::istreambuf_iterator(strm), std::istreambuf_iterator()); - - strm.close(); + // Load file into memory. + if (!file.read(src)) { + m_error = "Could not read file: " + filename; + return false; + } return loadFromMemory(src); } From dc04a129229f5840bdb5629d186f64962a1838c1 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Jan 2020 22:16:47 +0100 Subject: [PATCH 023/361] Spectre/System/File: add getErrorMessage() --- include/Spectre/System/File.h | 6 ++++++ source/System/File.cpp | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/include/Spectre/System/File.h b/include/Spectre/System/File.h index adfc611..5adb044 100644 --- a/include/Spectre/System/File.h +++ b/include/Spectre/System/File.h @@ -4,6 +4,7 @@ #include #include +#include namespace sp { @@ -54,6 +55,8 @@ public : // Close the file. void close(); + std::string getErrorMessage() const; + // Get the current position in the file. size_t pos(); @@ -103,6 +106,9 @@ public : private : FILE *m_handle; + + // Error + mutable std::error_condition m_error; }; } //namespace sp diff --git a/source/System/File.cpp b/source/System/File.cpp index acc6870..2cc24d3 100644 --- a/source/System/File.cpp +++ b/source/System/File.cpp @@ -1,6 +1,7 @@ #include #include +#include #include namespace sp { @@ -54,6 +55,7 @@ bool File::open(const std::string& filename, Access access, unsigned int mode) if (mode & CREATE && (access == Access::WRITE || access == Access::READ_WRITE)) { m_handle = fopen(filename.c_str(), "a"); if (!m_handle) { + m_error.assign(errno, std::generic_category()); return false; } fclose(m_handle); @@ -70,12 +72,18 @@ bool File::open(const std::string& filename, Access access, unsigned int mode) } return true; } + + m_error.assign(errno, std::generic_category()); return false; } bool File::isOpen() const { - return m_handle != NULL; + if (m_handle == NULL) { + m_error = std::errc::bad_file_descriptor; + return false; + } + return true; } void File::close() @@ -84,6 +92,12 @@ void File::close() fclose(m_handle); m_handle = NULL; } + m_error.clear(); +} + +std::string File::getErrorMessage() const +{ + return m_error.message(); } size_t File::pos() From 1a43bcd77a5684a228a047bd18275ae6b749df40 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 19 Jan 2020 21:14:44 +0100 Subject: [PATCH 024/361] source/Graphics/ImageLoader.cpp: use the new File API --- source/Graphics/ImageLoader.cpp | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/source/Graphics/ImageLoader.cpp b/source/Graphics/ImageLoader.cpp index 6827c57..a84ef74 100644 --- a/source/Graphics/ImageLoader.cpp +++ b/source/Graphics/ImageLoader.cpp @@ -1,4 +1,5 @@ +#include #include #include #include @@ -18,22 +19,17 @@ #include #include -#include #include namespace sp { bool ImageLoader::loadFromFile(const char *filename, Image& img) { - FILE *fd = fopen(filename, "rb"); + File file(filename); - if (fd) { + if (file.isOpen()) { std::vector buf; - fseek(fd, 0, SEEK_END); - buf.resize(ftell(fd)); - rewind(fd); - fread(&buf[0], 1, buf.size(), fd); - fclose(fd); + file.read(buf); // loaded into memory. now decode. if (decode((const char*)&buf[0], buf.size(), img) == false) { @@ -45,7 +41,7 @@ bool ImageLoader::loadFromFile(const char *filename, Image& img) } Log::warn("ImageLoader: could not open file '%s'. Reason: %s", - filename, strerror(errno)); + filename, file.getErrorMessage().c_str()); return false; } @@ -78,10 +74,9 @@ bool ImageLoader::saveToFile(const Image& img, const char *filename) if (encoded_data.size() > 0) { - FILE *fd = fopen(filename, "wb"); - if (fd) { - fwrite(&encoded_data[0], 1, encoded_data.size(), fd); - fclose(fd); + File file(filename, File::Access::WRITE); + if (file.isOpen()) { + file.write(encoded_data); } return true; } From 29749e945a8f3563909f06fd4d60a7cc1976c05c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 19 Jan 2020 21:57:50 +0100 Subject: [PATCH 025/361] Remove FT2 lib files (we compile our own). --- vendor/FreeType2/lib/x64/freetype-d-s.lib | Bin 3407294 -> 0 bytes vendor/FreeType2/lib/x64/freetype-s.lib | Bin 1741018 -> 0 bytes vendor/FreeType2/lib/x86/freetype-d-s.lib | Bin 3000666 -> 0 bytes vendor/FreeType2/lib/x86/freetype-s.lib | Bin 1080592 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 vendor/FreeType2/lib/x64/freetype-d-s.lib delete mode 100644 vendor/FreeType2/lib/x64/freetype-s.lib delete mode 100644 vendor/FreeType2/lib/x86/freetype-d-s.lib delete mode 100644 vendor/FreeType2/lib/x86/freetype-s.lib diff --git a/vendor/FreeType2/lib/x64/freetype-d-s.lib b/vendor/FreeType2/lib/x64/freetype-d-s.lib deleted file mode 100644 index 19c86a23b9dd54a7c007db5246814dd1a693e2f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3407294 zcmY$iNi0gvu;bEKKm~@TMrMX4CKe`!sNx1tuA!;9nFW}gz{SA8RL8(j`-gb^EQ^7$ z=^q2rf>jKxvO6#^cjOTUWXvOdhk;luFin90gay~=G2p^NUw<%wu*i%n4CG?TO%V(r zEbVB*Ad_!^iBD%S$ehk%kbQfLL0+y71uLnPFp!ItPpUD%uxj-k2G!XjsQ9=IgDMQa zy1}6O>IQ?FAQM%vy3Z~KIId7(PzT{DUJU9Wye)%4odm2QWy64i1Jf8Zka5*J1`T}p zK@Wo_;|vB(B@+bpXJOF9h4-Ce&;;S92@G1|U88t33`Wy{co&2I)NP}9Gz>=5z-SsE zCk@!g`xlgC=I0d$m*f{Erl&gC8`|5)$LHiHC+5T#m!xFo#}^c3=9Q$y=R?#vI9NJZ zGPs4r`=%BbC#I)@m;s4-naLnVNJde9IRifJ4Dn@YPy=%q;>(Kj;GDFQ_>|P7()9Su zyv!1Yw37IeqQvCX_?*#ku+UB^mKK$tm$gsd*`>MR13v zmBb??%W%u0X)6Z#I5$6~G$$421oFTT*C`rsqNi0f%DglLUVoH8eYJ7T5WkE)K zPG&JU#pEU?$LA&HrWS(~6lbO&aY~>DKr}!U6%>Q%c+>zjj8Cm7NG&RfPt8ltPsz+n zXDBfQMLEO)aKVD&_>9cFlH&Npf`Xh%hJs=cFSQ8OFleeWPD4voiD|j<1&Kw)sYUT= zrFqH449RI}@kynbIVmV2DXE}9f~hGeMpIHyjA}?haePT)Qcfz=%!1;?(h5}flo+BJ zQDO*AK9CqnEe3fNly>5iON&eLb0Nau=z%GOh7CBop-2?NLKssDGqOtzQEG89NC?RukSs%qVRB{)s%xNeZDL@NW`b0NfTI>1 zrm&=g6sn+T2g_jw5l9N9Y;y~7j(7G=EO1Ut&Pa{-$xO?E(A?WP)8QUyXK`} zG0U~0AioHl6JbU{L=Y~8iMywkKm?uhOY=%#ITh?s_tX+hL7&XLR8&WTk_e<60qY6? z70S>cLiS!zYI$Z}3bIHrw5&)ii4SlKig!#YOUwi32vEp^g}hUX@<7!GEOEF6#rvj~ z6lErZ-3iJ8@y;2k$=M-ArKus61*rjvC8Udw@_^?D!4hK8R*EilNCp9l6-Z?+NC?zv5u_P7j6i|vr zQ(2l*k{Ry{X~;m`AC_1Y?^uyp9PgHsm=4zm62)mKNYW*>I5RyD-OAw95|HDt>V(SS z)(FZ-De<0ppehFvFGf&B&!K2QLILK+nBo_U!i z;1Guifb4{63@FM6H5oD?;pq%&i)JQ+;vcL7q#aodIhtUR?;ZhHiX?=r66_*yo(7o* ziZcWUT)sHx7l6wXurN5not^S4z>2~0A^Gu6nI*Z2pjrc3B!v_u<`t*q7v+K~!X&UH zv`Gc7#X+L^(DDM(aDoU!Q-phBF~qFYl6bdZP`IF`4QEf6c(x$@5D$Uc^JS@!A_Fc02@EI~6nLPJfO3(`Qm7Cpevwo_%LQ;)f{S1O@;v0=OD&0a za&e1y&Hxn{CGp_83>@YlQD|}i#|E@8fyhDQ!!fx8TyMlfYs+|0B7`J9kP{s9(sNSd zT{6=^^m4CnNPPj42Q?1BbqkyW^@MY3W{z7XIOv`8 zA*nmF3@QK$n0Qce1JVTMz`YC?@ySdoN`%x^U==V|gS3JC1qy_)#G=f^yb^dEW0Na} zW*3mb$nwShX;AIRGEkx5)ST4hlKdjDyJ5PZa>f2>AiLqZpy3Y9hHg3e`9)A~g3=RO z5e?;n%>_w=gU>C$C^r$Dvfx5KiFxUziRr0GaSXCF9`04J%8bOK+{6M@LAT7J;u3HY z0l5&Q4BU`FwF4a7@t`6NrU+DSK#O{i9z?o8@F4jn4blVyMFH3VRNMVhD^M*D$S*D_ zPAJ_uZ-GzsEEPo(Bk zNKs;Pc08ItVZ~m&YhF62fdVQ|V5USE8bTUjNMQ#m(|qzlEj3W~0joq30@tho`Jf&e zR;gg9yCBhztTDf!5{JH`)Wnih*NT#&M06uT*#cb*n)$%Khq^PMD77H52%LM7g<&mU zNI3~ri)e9pR2JlelO!}B#s{aC_#~&eW#)i}8QenRv5AMLW~OIAT0}7Eu+*aB%zSYB z(I>OG1Qu#wwp(UiVh*I~9uE@$7sOzWXI?S1bcJwBQj4Ii3@{(kqzCyQ%nb!s3LtO5 z(>|C3_A*#iequ^II0eCz3ZzdFkDL~LT}@W;~rkhg0#SjP*BqiE&;15z-bqx87=^=*%B#t2am`3C?cN_8n9Nslx#k zfoTUdU%~Ylx&YjOl6V*Jc&tZ$em2OlARPgj6{$Jk+y*WEudJ~%qSZAwtT z3RIbZb2+^K9GnR*f*|ddc;_5wGKTV9K@CE;qQqQq+J*^MWR_rxfyRe1gh5Squwx+u zL!e$@2BZfBHOoDI{V>4m82w3`FM?H1-5C5G;nG9h&N)Hh{7@ zq!d6hECA9LgDMG1O$3)gNL)v7sgEQ8iZ3JsKw8`~Q*%-vaRKo$ND$qFa4{4of<-aB z2o?qV2hFBXuppWVIjM=ospwG?oSF(rFc237XJ>+I1gJ+siYh^NfJ_fb1Sf?sa03t0 zRS3w>fkYQn&?hx79Wv4Y74XY1%JqSafb8_;N z;~`xvkO|=K6j&y$C^Z$U1ZeOvwFIkFF^YIbVsS=%UTH3T<^)LqTydwB#KVPhAOnXm zq2iLFc#sP~ZUUYDs)?YEfBcGI-3l0MZ|? zj4v)J0(BZe1G}Ip7l;b*d_g?I1I3kjB^jy3nN_Lrpk_lRXzD8$I#QEX5?=-xRmm@k zPc16S2T$xEgkV915Gg9nV*riJ!<>+wT7tp{xg{|zJ~1UHH$EjTrzF0(q!K=z1Cz+h z&r3=yP6f@A6eZ@Rrxr87WS}j0NJktdSeloKq^u}03A@Q43G60=WH3wy38I;tn}@^X z+`M=kCg?VUGu$v5$!7v#lh-z|9X(}{HgA+s&5+BrvNd!$I zWu#!Yyfh;PdlV&sWH2lT38Gk@oS2P0!Ga~QdJ8OrZZcR9&E&jdtZq(D%qzz3X0QyV z$$7=7$tpRqC=-XtMVYuvF3QA6uwZjg-JFqHgxzG21oqGX$zZq{B#3HqR(5=OQ6^}# zH@>*CxFi)i4F@U#lJg6&X9utZc3VMOFl+@0qS{(egu`Tz1a^}_G8iU<1W`?{EXs*b zHcBo)FX)mX62-|_C9oBZU>(@q0x~PVC?yZ8Sp~_7*lovfJ;<2i%)B(L#uVq`@I-NG z5@=NbN-++0YjJ4-c8QYA643GrOdTjemy%kRh&7RcC9nnrSO(o&U_n%qi*ZDE3P=LG z$sidFlR<*0CYR>sR^m*+sU;cMGbC67tG!?ubbG;qDE6kO=4WFKE3gDslfg3RCW8gh zO~#(p(^K<{uoog=87w9jp%zc+If>Y73a|urH-ofbm<$p`bu(z)3AQYh4wArbGDrr) zWRM`L$wjHzShI6FL;^EAgC(%K1*8MJTR<|{vNPB$Y}pwsf#G_PG1#&*L^YP|43WT+ zouLw#*%>T>EjxoHP=l^C3r9i%Nnj5MkPL>mK!Ru{7h!MAq?ZP(& zMq(cJ3=5XP>SnMEy2)Tc6gOw2CSeZ^umpCKL0T|O1_`2=oSB!BnT)dt%1+F|?jx`S zR(ruR==OpIQS8mm$i?m>umpCKL0T|O1_`2@jJ<`Foso;9g#?ztVlr9_DLXF(dldtg z!0u*{77UX?f+%jzNzBJu9)rZOnhTOZHx?v@W@-uc&P`5YNfP#y4wk_*xFiWRrROA; zWai;aH93hTd02}*s03!Q2bREA?13e4gg{ANJhoyFtOZ-K2bRF%x4d|4#U4a8mSPVg zfu-1kN?;ayUCa0VIJvh(R(K0R|F8 zb#rDh_5w8rB!R=^;!;dEgOsC~oSRdLy&DCVz-lsB2HnkIK~$3~aTGtfAPMXygJdvF z1_`2=oR^)CJuibLu$l~(K{pvJh-z|vUMkkKkq45%ZZb#)!(@;kiplvo$=KV2URawm?l>yqUMzR;&klc z43@y|W{?&PlR<*0ZZ6Kn;bxEo4wG{eF>*>iNI8nh#fhcZt5dK9R+GUp=xzoJqM8hu z1qY9zL59|fGZG6@i{g_?)8doC)4ZVGHj-dUYH>+XekGD9Xv8r&rxd)@J25RDsunDo zUzQ45N{^;EH77L}DpZa&`4nd)mSc}(undN`K*~|Qm6?Y1O2E$~KAgalT zAxda?fd#39KfAWzbCq3!<4^hJ7rhB(bandklkRFikEiLCwY`sX5rIC9ni`H-ofbm<$p` zb#oeyLCX@51a^}_G8iU<1W`@SNW|XWE&)kkHyI>@VKPV%)#S`19N`R-z-}@~2E$~K zAd1OliJ92l43@xZGFS%PWUwHL$=F8rKv@bh{*Ag?pX5E=CT6Ba&^_Ji3=9l^Y8e=^ zo-r`|Yhq+rwSb9Xhb$|@kw|WaJJLK13eyA_^wtP6{P-%waAk%FL&PRY1`|hV27`PV zhOE;v47c9OGStb*GnA+(F{qtXX1G(W${;dZmBHq?D#MLestinmY7D!4)EQJN)ET^{ zs54}2Q)jS|(qKpn)L?j5rNPkiK!afhqb7rik|qO-zb3<}eVPmjPc<33#I+c)!vKOJVD$)57)zW%oI#mEoI}jR+zf&Yf?$#p znu`(Xo(&_N@-aXlCx(m~ST_fQ8UrT-8yIpjfOs&|co}#Yco?`DxWH*tje#4?=44<8 zy8*<5VHO5X22KV624)6!ED(~;85x)u$liB3x(NuffWa-qIUcdo2eN(;ypj*J-2qt& zx)KNLnrrBSWatVl@G=^zEX9T_nxoyabnseb7wCdNFbC>O_Q-7SvY866>Lc^ z$Y#VMHUtm01`;fSv<6RbDYkU(6;*pkLgZ6NMgg`6B$y^?f zWy=V0OXiXGoq*Tgg4U9O+z95NEN(|zV@|>jDDb)>n8A=0oRAfo;H4?h9WdZE#Ay4Z zz^mfn$r9u&%$4}$Y#0NX1lwQ;TbPP0Mrbc0Snbf=0sz{KY*>gm1GyrEG zP#I3-UQ@7Aw0%*a1&{HBcA`PHZ-O%ySUrRf*~y6z#k*e(lmRifX=C4S3*SHi+Cc!` zW(TXtpmo&fjtbLw8tte+91=p)%@v?j1KL>tS!4}gl@AhvwJbnuutD(-P5>bFZ~^39 zmLNg6cG#YU!L%WRlug?(_k)T%C+OZo6fy9QPjFa3cX@(T4&J>Tuw!Q6n>ySfo3P>h z(M=xU-ICx98lY$e?Z*JMA~6K;Zt{TjilD&?-A)NI3s?IIDu;cCHAoWFD8k&bP4aG% z)DqBs_INV3c_X%)jrffy;DiC$ngJ^9z~`BOw(1~+Ku4*dia^R$B%Pz1S0Ig+(GxM? zhj~B?U+AVD$WdT!A@Q(%y@XFVfNs74cV@wxdO+z7DmZ}qfbg6dhWnT_*nwggM?c}( zRRkADJ3a_5j&_7pJnTfYc(ilWkPo~8?VuRlXM(&p1~Sh!y3eEpatak_@;+&FpULPx zlhJ)9(8CBpIRd`uAvf` z3$DQu*cM!aB~Y?PI%t0g)_?#>U=Ik842HKrf@mg>?lVDbv>x4Ol9(1hy3Yi*J%4nc z324OusQm=q1A=Y0EJOlJu?LmFEcU<>*or-{1WMrq-XDUk*aJ&oE%v}N=*1pb5Y=SR z{t&DtgCww<43fbx86=2i^5{MjM1cz4AA&8M!4g=*87zYy&R{{5a0YKD!D=#S;|O+> zK{6O7g9K4b2Ja8SW-?d;tI1#)bd$k?s3wE&AVD;fNB5Z^QXP1I z2)1wrOJEIWunc-Qg9TB-8CeBrkvDvs$ml*3P&EPGmVz2!;B6(y`*Oenqx(z})8a?> znG_%mT7tKwprjq}b`osa7%YJ`8-rz#Gbt!lf(21c2JH{QYBERyyU8FK43j~EC?TzunfA%U_lgOD{@9 zxeW${uko>mf% z<1{$PJv~^jo568T9LkL{)V|vXbUs}PmRo9&#UV}xg)o6L>p*8?!tYKZ^9(!m>sCM) zvVgNZxPHcQM+=raYCsp`Ag;;5xUvQwJJ=4&BYdR|_KSD0UhRWl@mK#^Fr zc_kS{Dh1z$M4Z|J;!;Rj3FN9D;tb6%DND>DPHAo~aq2*gW8ze%R}gJExTQ^`sfooz zCFr!0v|>;SAkNg}%oO4jLi!g(swFm6Cne<*Rf?pQfKK}*#&T$X4Xjijc9}b*@=<`) zQ^uy|Xm`FF8W@{-F#Ew;3QnFQq6oxuh%=!ed~F zV_;wqVTJLaG?xH_9=Hxu35JR=7??0H6tOZeEV6`%C^0ZFI4}q}LDhvoL>U-BjBi#j z9)yOdODsu*aKYpvHU9S#fu2lPO9cBAnzkxXjaGWMHWF zWnftD2T_O1JXZz=hVy<53?lvzb-4U{hk=1X&Yywd7gQZC^8y(d7?c7S7>WZ3n^zma zzz_-2z`(!&H?JZEC4xB^7#JF%Y9J;uFgOSpIOu^c^*~ApJPZsBoq-GtQ=w{^!Qp4% zpohi0%}_Oj%-bEvz;GO@7N2=fp=t=3_coA$;U`orKJ&zbU?xFmT>h00VqnmQs>NrX zCsYl@G~D4A7{tI33snm@uLw0h4lpn zJLhIrW#*+TIOpdUWP&(E=U=9&)03|p#28M=A1_lOq28M<*1_lNX28M=u1_lOC28ITZ-={M$FzBKA zy$R~~8U_XiHWa@@uC}I;&tYj0?sIg1gWQGg??9-(!=U~SXJBXmRU8ov3=NvU z2nvEUm4NC^M#$v|f((L!5)2Fs5HZkAqo5-?1VKdyG+}_QuLDIh$gdtqW`f)T@++v; zwSkJKGB7lN+?U3{&>+UZz>v+Xaz>vYf&;UwDSquyfAh%~j{piogz+j9Pw^>XK z45ADS3@Jkq9CO{<6Ne4j&F$O_oACwqDZYpOGWnhLIXvD<8U&ODgz-NE@S}lL9T`H3sAJhGBPkQfhuTFLf28Klp3=Q)b7#Nl^Ff@S7TE@W8aFBt4VL1as!vzKghLsEq4WQP^Dh7szhYSo1 zYZw?BK%uk_lnxjf7}kUAVPs&~#K6!1^2`=c+Gk{7*v`PvP{GK+u#+mjz;K>{p+Sm?f#DJZ zLxU+31H)woh6XPt28JsP3=KX^3=G#87#iZ47#MCcFf@SD-)(3*)z@TT5My8$lmR6R z1{c?0XKznGmv}#aKUW4Rs5m1++%4448Kj6o5-P`pkPCAR0!zWPF(afxA_H8V{e1%% z6rkEz5OSWr0Y0A2o*|9_0sc;249X1bf)W~_n$gMA&m}m-F(foN-p$j`#naC{$TiqM zG|1VNK@O^ji2+HGv%jC8t8<8_pF4v*RGt}GKFHO@GYG0c6{>&*S%H(QyQiOvf4HBI zzoUzbV~8W%F|5eSU@AQQ+))&?QmF}5$%(8I$!;X2uz=-4RvH=%GSAW3!_~#vKOmAp32GiUvZ7#D zXy^xqx(0_Zs6f^5AggiqaSRUjba4!G^z?Cb@^NK=g)lF&Dql}uS5R6&DAR%(#)quT z8RQ^0PajuMg9V{h4XTzOSuHpWgCqT%{R3Qs978<){ooE1Kvw7K=YpyV79N7gs=%g& z2EY@5BGgJDWJM5pSoFh`2qPcx!0!Kc~DiLHQ0YUyD{?7hB(2!%0fm$VstjN{R z*&meh8FZntV#u;#u0ft|o~|yK!3s-3;>gM&HbIh+kH0e{uwd3oAggq7g<1;>a!F)a zQ0RF2xr1!=aP)KWaSdY7fjUnLS)H@LUx=$;h>K@%fPb(jC~6!-LL8kv;OSc$S+$#| zPl#(!kZXW{PzcCqPyhng#ctkT&h*we+?(GQ#>{6ah(LlDVL7FnTZsGql=f4Cna z3Bd{uIb>y!VgXc=zzYs}WceV+aJYkD8AJhDK|qjyM5K#r2()kk6>^{=Oc7a)qqDPX zKuD0IpSx=?+!`fh70&+t-kz@U!LEKG46x!t8C8LAfTMFre1N}?r*mX{kgKz+XPB!C zJgcdoDu$RA8W0fV8XWBE0uOanY|26$LtNvb!37U>HJmCTzJV)L$Eh&L)yvg61g=m6 zr^0|Bf8T%*23UgA#HrB7)iKzE0ak8k;Zz4Ie%*r{U0mUzt&OY}8i*c2u5R$^LtD}o+5Ii!J3gM&T&{o$u$U^k3rIm3`o*0u0F0Iu22=AdKsjG30Xz3 zYX~R<1%sP7AX#QKSr>ojP+wQS5J=rF4Rr(yvMP61Ki42fAF$s+MzA7FdisSq`gpp4 zYE)1y29jq(mWR03&C%1x)dk#dFo5{cGa%l@GuS)cE!4*c+;0GhGcq`P2E>D^is0aQ z7gs+|R~H6QYY8OB1eWu24R;NS4+9mB{(kYU5uU*z!EhzaU?u)OE|^L{T?~*ZEMO&| zAc=SO_jB{{bPi!KWMCHr$+3dvLV`krLqIlox_LrcJn`^0alEf*FsS_tF5f{~*uYv` zBS4j~k6V0@t2?O7hO{cpvpJM6I@e))bKH&s0j^r z4T=Z(60U$BRe^_pa7aA3!2}8!kO@Ml3Zg*$IZ&U?0qz2@9$1Yp%D^rNl41mF153I1 z1%qQ4B+P^m_6!I!fr~Svh?{{^{V@Rs29}26%&cO!ka$;U`!zn;%QF}pbP#C;g`{+3 z>3|?emVwBcre`K0%Q|_wn}V|pM7lUHu^d@C+|e&M)XyE9q9H00GxD>LRe1S(I65&H zGq4Ll@Tb-c)G_2J3IRMc>1}<`v%bOC!aI3y?(Vm8cA91vB`{=Q(xgT@9xnmHlDu<`}&PA*h& zNFoGvzd@R~(Inl19NodDf(kbkZ~#X5`hda-ly>7m3{c}2lukjij10)K;NXF2WI~aG zITlptf;2Lt$im$Ws>eanEU3~UF5oBv$*`ix1bBkIDS|W_0Ztu|R$(wWMS>(@qYz+8 zP;nO!0&bTCgYyGO1#BDwtim-SB*-y7G{^^>A3)NuQ3$ZKkE5S^sH3|pToyL?0G0(6 z1>lkZ6cQl4uu%uFY=C2MaJYYv3*2JZa06I2)GCNsFU+c^Ge_r z!iF7Snw0jvw; ziFikMP+WsrfFOC;fCE?_8iugK1JYjtse%nTfK>&63Oz{c8(g@86u?Fs5DLH<2-Hdh zM>0qaY^VXO1{4jT3<{EfjVpj9JUv~&y%vxJY#;$F;pXG$9uMj)f(m_qCvf)$<_p+Z z0$5={NDxFFsA&$$+n~-T$T-+w0$5dqOHjOjkf*z+A3Qz5MiRjCpl%GP!yVul;sGxH zK_WtDhbcjpmGbOiw!E_=;!R= z9|UehfP~qh!r-*z8t)k#AL{2C?Ccl-=@x>Na6pxS2R*<_pb9`)45WY)ssI!P@oqu> zzTlvS$#OwuLxX%Ek|1Ra!VK(!AidmBS#S!3xs?Yh2<|5Yf$I&BT3(p2vxlp%Bisl+ zn6PJvD_kusZ(-f%NHp^~1#@!*~|q!$j-#)Xgpk45?T zxVpIdg#- z!UKR0NygF56`bBdhVeti!G?Kw28Z|uMY@68(BP2Q0Ox2oSI3ahAlG_%`Y}6d2 zfRO>F0Mu**Rm)+J{sbs7ffO*o6@Zd;Ja`ZgWB^Q_8C59L`8&r4_y>dr_&WMIx2SLLRpyC%?n}ST^gsX#P zBPT~c$iNy%nhP!s^H02^bBJe{YXmfPz%As4tAus8;As+Ewtz;#Kqm6Q)xk{!72+UA zf$9Wstb^3?!qqvtxcK|UBZU$uPlA;2!Ii)Up5x*E(`R581gYVNtMLd434qrH@vvqE zsE-Eg>$`vsnnP z$lWyr6a?`u{=VP}3sjnd%4|?a0y+Q&GF2F^A;i(i$<-y^Dabz@+?fNlSV1a8;3~ia zO5hPgkhmyZ9F`>f9K%4x0cbEU*gw?IB^cZx1gRCnQ0wFB?&ur|?n8oxRYB7Yu*edJ zD|Yh_a(0b(ba4racl2|KhfHFDGd0Li3AnllUms9FgGXjTGLmo^nA1XBef(U(Ls5_v z3-g>5T&0_JtPAw`+EpjX<$jMAjEXm9V z&CIe327={0Q*u&+GfGQR^2_tUMZODII5fxyTpWP2NIW!;fD18@JR<{4-qQ~>%Iym2 z3WKDW;8NhuxGSXO1IaMMWxyRSKUYZq#~azcAXj&I{R3*igCyaWfh0Y=eSE=*%?VsH zfzlwjKmt!RfyNyIT>V^J{hTAgxkU$TwzEH|P2}Vl>>BSI>J#D_;t>QI>4mhL#lT7e zJY9T)J)vj)Xy07)}4ph>%ig9{0e921&cK#;4Cr!Tm14U%R?lXeMmbPEAH z4J6BgChO@3AB6+cfk;|eaVK*G#W zVQ>z0b99EZ?m;pvP#Jh6gZvGWV1-IJ`-6wu!ASxn&IT2C^zn3r^g%(Q>`>8AKTu%` zN+>3fU~rCic5!v~0lOO{#Khq29PbfPXt_jum}gK(sG|=!n}LKG8Nk8;p`gqOkpiV9kQ5U{%Fo{qrU}##2gxu)WI$Dk zr!zQm6u>rwIR?cCfCjCCLmWXvKp@wHWEdGhGEn89VQi2f6IjsM-w!&Ae_b84&LSir z9^`Q+M`uve$kQL(A%hlppjmv7DrN?(s$e5uG7KDoAZ78`R56G#aDc0plEiday#hM^ zoI!|zLl6|GC5h=E2RQrtg@MIDsiGt?9hA#J36+75fkRN4fq|i@II}7>zJx)9fkP0~ zIf*YxOb-YS1+}sK{TTQeI0S_m7#Mu~{oLaNz$FofAgGsHl9&#v6hJLZKX(QJs9~XS zb%G2Wf}q-{BrzRYhcQSna0nh(XJ7~b`NzlA(JwS0-aW`aG=M>#fdf3c93SuN>EaXb z>71XE>X}zul9-bdZ(v|x$iTzEAqZM#7~t&T2r3OZz^hr{ZU8N30eccukAWIGpgJ|k z)gA0fMFs|j^5l%fqWBU9ZUzoP5Fb380}6qEAonBt0qCpy&pk6d+ zrWZUA2y%oF8v{cC$dh2BK~5@5jL*p|h8PW62ImwR;>y6wzyV%67vKyw85D}3kz>vf$Y7h&cJ{Y&#s`v>hBjH2AYrJ05>E-F#|3z{9HqzeF-1W;1IB7 zpqLEyjBcC*ok|@xS3dEgYwcz;j_Xnj#uwxEG)q*k( z*fY>r06PX$$$&EusD=Y;|EA8s;1d8zJRt9ZN`sQb^f1RDa1H~d7iLfZg!y~AfHi>9 zKx$D@UVeNDI0gzC7#PCANgAY90i+h3d_Z{{)b9kvIJg_@9{?Vz7H8l9Pbk3h31~jU zz`y|1g5VGYr6-Rd*WgeeP|Jry5Y%#mDRfUQamvg~@kq=|$w`G|DPaZYsW$FXXDxwS=;Bozu#B>*bU%&j6RIoBo_!NS| z2b`ZkWff=^4dgEPL?Ad*83-^ifSL>pp!fhyGJ=Z7$Y5}MfD$Cg44(k7A)rhNN-UwC zej(tZ4J2?BngRm+{Xy*k4na`HL{6X36amVYppq6;ixJp!p_P^g-j<5F9@sH$%&8Sq2V4Q1hlFG2PwA z-^tO(KOiLD)gvBkUobd{fflerG9W0Vg+W0GDs;?DzzGr**D&vc5*=u`z9ca{!WT5l z;tQE~00kQ;SmQJEK})(pMJQ-VH#pgX^neD!KnWE*DhaJNKtUs;!N35DMd<2B22g3C z3(C;QsiYu3Gp{7IsF;BPw426)5ma?DFbFW3*ExQ<_3WqJ3dt?+&nwO6U|;}k#t~p# zIz26D3(MQPdl#$ypEadpF$2SV29SE)xXig9_uZI(=FEBC^G7BGFfhCTi>o-_mb`Pc z^)bgc-u3TgeS8=gtQbM+nPdAt)di@r^OXg>5-t~6z`!sGEH0{a#F}ZMW>r%N|AEHB z2PO;*XTjnYSxT!@{ASKjIDSa~TU*An!3iv` zJIQA6Bkvub#Q$+F{eGiUlYwC>Sp3e>hkbyyj8D#!D`|=f5ORpFmbC}}WGO_I+14AfS{IIs{zRMdw{Fs`4V~*BZ z=ZOpqpBWe!rh~SCBwNK46y>KECFUxmW#*(7D`-?$m}$n8XXd5kmlrE!XO0wfT@+b)Sq$jF+Z z)`N7H6sM43JJf*k%slY63B3%+z8ug_CpHEj!Bi;*h7F+IZww3!+zeZwEG`CaM(~<* z25ts^D2t0hl97R-6Rb`a%Hm=$fwH(6KqV$fmWyExBLhPhSltFFi;DrYmL0U-o|}P_ z3ACYzfq{zww5}bZPMis%gNs22%Hn1)fU>w4mM}3efOal&GpvBJxELguVPY~+78gSY zGXn!??+G_U50u5l@EFSCW_S)|aWP1-z|_e>SzHX=P!=~sKa|DAZ~)5UW;g<6aWRBR zFff3^j+-G0%Hm?sm11DH2==cbl*I+!k?6-DD$4g`dAeHFRG0o&w=FAgcy0w1i^T86 zDoTZ%jZl!1#PI1OXlX)nVh(7_4MQ&EQcH$n@Lehl44L^14B*B;0|NtSe>G@Q4|LiC zn1)=r!~otR4cgn1lb@K9TEqZ3{D6T0a;yRaLvAhuLy3tILs4RKa%yog1Nh_@1_lPm zhGhnZf@07KD#Z-oJ^2g_48>`XLN)YCj7$&BH_7;^GLd*f#RZ@};=9H9xYiv*x zfT6??q8}n(0F?*rA1`7kF+`YGP>iI`5NeKLL1IyHDo7ppz$lOz1;xqvd7w>Q3=9m( zX=y1iiGt#cqEv7UfWjjqF(*AAEDt_91*8$89%3-4yO)`lmIrEVL&U-EN=}0WR&rVz z#9~kwr=;a%CP55HPBTi%DNP0MU`$L)&dP=eGbE=OfzFkHikBxAfqf2gpAjM;K=x#& zAUq7=!`%ZiDmgO+;*QJ|a9|{7roi0+k}pU`idfLDy5zK?)Wj5qq!d)~{E{-rnHV5V z3=9nUC1uI^xw-kUZPWQBWuS5kB%Yp%mk7Zsdq4gwjP3H4=^(@@Poxpfcg+% z)&*t;22dA~k>Lh21A`D)>;W?a1E^!j$nb)hfdO>t0wco*X2>o}Mus2EpuKG%^FYg@Hi|%mQtVmIkvlSQr>&z$^n61_oI$%Yuc00kr3n zk->q5fk7TD=D`9w=>cR%01E>HXuytL_~SVo2gEDQ|VV6hb} z3=E)ss*DU9SRlKl85wr4fc6uE+yZKu=!4arU;*u~28mr@VPG%>i``&>Y!GE+c)$YM zr3#XL!NR}*+LzAA@PUPa!4$0S2MYs(8JNYu%D@2H+04km!OFk@+8WBpAi&DN06J!a zkwJo$fdO=w1|x$4D`-bK$UF^J1_m3jUISJJ23s)8f|Y^64$N|3Wni!evpiTqCv<>x z1h6tNfR5Q=3=E)iB^VhhSQ!}Hz_Jaj;9b@X zj0_#D;C7> zVFxP%1L!~tMur2d3=E*7C>R+|utN5KGcsIYWncguufWJ~gOz~+bdUif!vj_Z2GCA# zMur!xkW)n%89uNwFoc3#^@EjxAq>o7U}Ini2eUZX7#JeJECDtK2GIE(j0_TN3=E+C z(u@qCaW&BHR7M63Ht>FF21W)0HU@@Runr40$Vn)S3=V7z4Dnzw4>ktS4txeih5$AO z2GEfej0_QM3=E*A0wY5L8v_HVF~Z1@!N$Ol0@eW<2?iak!pKm;#=rn-TQM>;uz`0p zgTjvuyr-Fgk-?+WM}@*i_TpV!RMFmt8LG;*w z_1JW~s5n@O0)+2`*^sl50)^!W_o=Brn*!HRdwru zQm{KZT~s_?v%bvy|NlS86IddmL=`Ln^8O2hP8SuI<{A|jh8lJd#a_n&^Ja66iU&hY zFi4c4#s|zRH9GF1g5A%xq9EtM{M#L(;?gP7`1;msVUVx~G#H@5FK_+*|KFqeNJ9K! zP-)x%I$Hx=#x;Xkpd$y)gIS=mp$*IeHC!QLpeAiESge(Sfng7r1?riDPv~HH!T{;9 zvoO45U|@jg{QwvH#=yV;(aXumz|aoXD-7A;&cMPT!3aI)gQ0^FynCI2g`t;`fuRGe zZZ8w0=gh*emKoBoW??u2XE}s>^nwqCia!jZ&VaSR4mW9G097KW2aAA?Ujh|RoS@D) zs0ahM#vI}y69Ms%!LWj&%)FAc`1}IUvY289(0L4CWf+8lgCK(p0}ps=5+WH7I_M-n zuQ<3QzbG+16?}#W=+FWKh%}f4xd9Z|ppHJMK>!l;1RW~C0Ir%EKyLG4U}ykU?x4d$ zxEVmYK`br?P=6ETOKyfL1_lNYi;H0f0|Ns{mYZP?l*PpWE~~-i5xD#Ymz1E=#Q;>g zfLdL!(xux+#Q{>bbo+qHZyyx}A5d`)DkMEXxxm4rn**Yt`G`UMVLhl7EZ~&Wh!WuI z7(nd{)Bp$7Z=jP=Ky{=%Jir-{Z;S+mFUW_Wa6rYN@D*VY6a<|hp$9(71$4n@YGN(} zNECF|L?lGiEx#x?5i~6fIrc>zBI=W$oS2i!Aj%*p2&!;F)t*0Nykk+i4`>b)bnXWO z_(Tb0%R%l1@sT5^jtO$QOFa_<_*9n$CP?IfiW^AefLL4%M;I6wKrC+1Sq)$o?ufuz zheE=+o57>`1S62F*1p1`M@a$6ZuRK!xOM zj&2tfP$^^5?V@4=sX7r+2TFaQ+`$5B6*GViqItjoY7nAE9cVxe6m_5suYw$P#d**i zk^{~gpx8l;HxLgNcc7zl5+L#6RGOBSTErj;jSmK7QD^Y}15mVr9ETaL84L^zn9&Lv z-aw01kP)B=w1t=+lv-SxQv%P2;8GOiJO;?%AV?*sya44jkZ>j|B&xGm85%%V=CLv~ zfc&4&3W;(M8xrLp78iIT2*l!M_`$%y0Ahin+(ktKHQOnGvK?qp5GmUkfbyAxtMLI) zTv~u4*#Hv%%|{gC4_iai5+aJGVmUJh)Cvam6+kU%Hc$r!8=0A|(#1rurK5y)L2laX^#4-@2^oL(k|29SIEpt%TC`#^#e z#Nq;-ufhOgaf3&lK`g96inSyI)vy7e8ehTH_#`N!cz7H?1j-Mf;DwfR;9|@j8e8~- z7u47X1utkij~yv^VMjHCf*0gX-wT2Pk>KbW8@z zg6x2>KsrFj@IdV-g4h8ni(ooH2XHZiOD+ftqytp-Ff)Md2!hxF3L}^fP}YIyfUrP1 zKoc3v42fX(z|=uH-XK|o2x%-(cL7-k%zSilm>N*(qQpK>M`0JZQwOTyc7s_UFM+Be zMsO4AFjx#6Uqzw?aGH;ifv<5d18W^CX&6q(&JOhLU8k#u+`o`svpd^@{6rZyzpH$x@o1=s93kkOI6s%$X8FU#G5nv^U5uaWaCR|lJ&94O02MX%ywSk z(9fLZ8du`K=6f8EIGtb$yys#nt(BB2uOZfRs{2^xI@=XGWVsE9epED(l^Sb)+SiijmB zwIPX^85n?u@=!z!L1_*}1hhH@*)B5!V^ArJqQ(SNHKK@^g35Rl5i?Nvjv`_XD%(*+ zEI|1cMZ^-+@Ie+aGyt_gP(%ztc^gH<2sCAeB4P~b*n#359AajMCXlWal87lNr=aLE z1C{G2BIZkAu>%QtGee6t=pvS&QWRO2kpZM@h_K7Z5L6bSs4)WdTTn!dub`Q1WCCgn zp{OzCV1yjw3XOL&BQpVX5p&Q%Z78}dG|<&p8lZ_78-SMcAnP(V1Wi?=h!_Q+>oWd> z=4N9P8FV$K5$Gaj3Fso`pnQR1mxT+u8p|9s5fg(JbP>Y|=psg-W9N`fHZfj-uEqp( z^c;#B(-Y`w%r2mdn7=?5v0z|AjU5w92{aK?1JLjzvR$Tz8t7__EYL-aJUh!F!bYJ8a+bD)cu2%w9Yf)-UE``z430bPx` z2D*ra0lJ8#1)7M3fdjgTp$EE%Q2@G#aRR!C$rrTvvM|j+S7TOyE@IAu7Csgh4d`kt zC%{FJ58(!lJ25kYj{gSLIo|tLt%uZK$Z9~xh%z&R#(h9_?H`XOU(o5Y3=GiP6Erpg zK2DaI5!40(sRo(B2AXqWKsE=|!eV9wwYNd_@f(+nGnnRpMvs^oVI>;K91aX~xIk?w zMo^m?WR9~2rxB((AlEW8f{ytH#W%wGlE*|AakDH%vHoR2Q(RoY7QUR9FU2ikO$Fh3<{uP2s{i0;)5_u1T?V( z;)5pZK)!}dy?{hGz`EdlW(Lr-Bup1*C={dyp$l|oDM*A1q6^j)1Rq`t(v?~PTC@UE z0m2}W^wg46*g_G6IiSH)kP23?Ic_2G;M082uL-k|5CsRQv(uN z3?iTy;xAAQ3=sg?4q}0pRe@-P?e`#D&|&cmObjYMe$ZAI18AO#fel3jl;m=o5O#_7Z@G@hxyzt-fz_bc1)7*g*cI`)XC^||cBn3}8U{V2 zBjiDYG|Y^kL*zlFR=r2(SCE?^7<8yEhy_*yVlaT}c2H_Uhy6VIL~na2cK z27$1B9aIFN<_HsH$pS*nO{iTUTbLO1k`RaJgBD0IGctfWLm){M3~EP!1i)%Q35$PxwyhFWF@(A{?^N8R9^Mv9M5 z1T8Pm%uk9>E6q!0h=%A!43+nI%q%#iHr!ghKu7wC=oF@cMl&}N{&bOf44i<$aM6f6*H|v`iL+=@a zP=sz9GBGePg6II4g(2*DwZ?oS)L2?wjt1}f~SlO44j}v zO`!d$py4+hw++>T7BqnjhhhhiI;5%#B%Hv`z;Mxtfx!^8SP68~4cNQ@2jorwNZl4y z28LE|1_n#eraT4)22k@FeA^Jxz#2#$BPRpHMbIT5APy9RZ!bc-wFXqhTxw!q2m(#F zfCo`QYqBtJQvnSU#WXW8{D7(htylx!rUJVC1QcCRJ3x)Ix>g2;HqeY1%sc_?x1>yH zWnh?rt`4aH1{nz&EL#Ls1LA`*mRnNb_nv@i5zxFQXmreq)C*3K?ti1?eiM-W%Nan+ z>)b$%Pq3Ro#8c2!M+^)M_Zb)%Nw)t@mhwLCrzvibmY1qnzHw3go=dIbr{P*AMcNP;3NBNe=>0%_6|v`7XNt{@EZ zCn&r@?Jv+66G#kni34c)=v4-W2GG(?(4`Ha#q)O=7#cvU{2wqdG=S#j9y2gB>||g7 zEyQWK#sH4H2GCV%FBljaKy8 z85uwu^BTGs85q7YFf`0$WMKHlz|gRqk%8em14F}BMh4IYexR>0e{ zz!@DhRe+MGk#B!-4a&d5wF0jGJ;bO31b$Dgq%wKzUMEv+~eA_1Befam}hUyzd|B^U$+LA%BvI=~W8 zEy#9*riMX#O&LJTxdjDxFhCYi`!hle0nL?zW*8u*gLVhTXQse!gh4jQhl7Ek3N*mL z0CwvSMh1o+u%A;hi{exBN{T9t!4jY`>8TKj#F9ja41)}Vpr8p8WW}~WV^My7Njyj! z)V-kPDxk$3lfc>vQjLw^X$Ry<(1=|>LJAtqplfyQCVp*Y zWM}}TYfVOm27N{b25m-$hI~c_23mjHo{@pUoROhn7bAF6b;Bb@@P$DQ>P!p__KXY-piPC2j0_ESObiTOj0_FlObiS@ zj0_FMObiUZj0_E+5q>{Lh6Ye#4QFI%SkA=25W&dMu$hU0A(D}y0W_8$&B)Mjiiv?C zmXVd`YYGzc>@FeEWDG>9@YFr+dvG?;^WkBkfrHp~nR8H@}KZp;h} zS&R$~G0Y4MIgAVqEzArIxr_`A3z-=h@)#K!mN7Fh6f-h3>}FA?04>IBP-O)d5)Ia@ z3=9()85&$!85kym;*XVqVG1KdLpm!1!&F9w22dVc$jH#Jh?Rk1F(X66BUT26rHl*> z&siB5mV^Aq#=x+dk)dH48w0~OMuvucYzz$B85tUGvoSF2U}R``z{bF^n~|a69UB9~ zUPgunRdxo3{frC^p6m<^2SMqEoq^#nBSXVXb_RwMj0_Dc*%=s4F)}o)W@lhH&B)NO zfgQXFzTpNt1H(B+hK8@~3=HQP85(}EGca6YWN6UhU|_hy$k33*!N710lzuoE7;Z2! zG}Ll1Fx+BfXz1i%V7Sf5&@cze-^angaF>yxfrpcU;Q=ED1NvY7=AG_G^B7bF#KU;XlUeOVED_((9i}NU}a)xn8C%s zz{JGRu#t;_fsKiw;U53#Vc);UR4VpX* z4Dw724edM(4C+h_4fA*y7&Ms}8cy&qFlaF`G@RvO0By)^_|C(?pwGn6Ak53aV93PK zV8F}3V8q1GV9v|HV8X=Ekj=}$V8+DIP{7N;V9vzQP{hl?V9CVLu#lI5!Ip`kVLLAa zgFO>N!yaA+1_vgFhJ(Be4310;4aayH7+jbb8ZPrPFt{->H2mgeU~p$*XprDzVDMmK zXprJ#VDJVl&*WoZ@MU6X@Zw`&@MB_V@Zn=%2nH?JatIX?x`lL7e$BAyO09TE)SZ~(R2 zLGmCBavvxhkS}Ab0HuG><(5ng4WR8)HB1Z*pat)>Opujvpyj)uRVs~43=JTEH9`Fk zT47{?*7pGQRX}07nt_3#3YY)$QY%15XA23Clqf)rEwJ~&H&PZL{0|BjP`pC?j}Qm7 z5J6QbM7#*HuoWZ-3J8cGN??KNWY9VfkTeK``~nIq&`cVr2?`SHfTo#FCdlQ5T}+V6 z^17jE2ee2Nv^8o16Qo}^5tNre>-?A?b@x;z2Jpp})0h|vQ5w-mX$;iBh8YiX7bx67GpnF< z0}|iN1iAci3ln73TInHU;C+t&6nF@P_`+|LB*uN`25TmX6y8V*rR znBxP_*+F6q4ENX>7;3PD189s491e(SJ&=>&*g+7b4}-l^0}24pqHmPmE~vc?T6cpQ ze4x$_sGkbz&cM4Y#U+V|&JHLkgPO=Tq z>kK$mCV_Q>#6TGZ(#WoiFG?*2U!V!fun@5duo&nHOk`uL85kIzgGvF=W>-N$P;X5H z9JruzA~&%BwOI}>FF~s>K)wTEP}%~eWzd#D6^QE?PBAewfTnFvGch!PGS68i$XLz= zCWZ#k7Q>573=R1V3=CI5?FR-1hHFd=4WPp;ZZa`6JY!&BxWxo%pWkL;XaKE=y354S z01Ey`ObiX6Inu{W3=N=zjGi(vGXXiNg+4$znc6GOu_Mh1r8ObiXL zKw}b23=Kj|3=IE3^&k@i!+$1*22l5ol^N2$XJck)@MmIR;9_QIhz8A+F*7veF)=Xk zGcz=_fab}V85*WDF)#=*Gc77=Dqh6Yel@n&Xd_{74%;LFU= z@P~zg!H=1tfep01m6@SIn3aJckeQ)D5wwk!nV~@kw276Op}~@sfgysKp&^Wwfgy&O zp&^!)fgzTep&^Ntfgy>Rp#ik>epFfcHz zV`gXo`F}k$oIqohW@zDL%Lo~>HD_dCsKXLYL8*nMsl||hLT=ANod}|!0R^flkOB&H zp)kmU&fr3?D76q=YJ$QVxpXBq%s{0uXhAQeDng8}fi{amM(8q9Gt)C51LUBv1r2F| z90$T6KZ3#*w2}ifI0h2i$_#0PZ)0X?06A(qGeZMtebf$6S_iccKzWvdfnhH*Lj&kA zxP8nF4Qm+~7!EKqG=N5u4l_e88$QC!&;Sb8qs)*p_5?FS186D3NoIzIzYGivrL7S0*;R>h>Vq{>r3XLPsg~29hakPXD($1I-%4?`` zhCiQXwc|Lfnsj ztu<(1d^4nu23Z1XB%riaK$d_q6vTPuMVTe3;8YB1XFyCW$Sg_D06QDhZh)vu&d({$ z1)b84xaS+x7$Ckqvmc=JD}Xd)4vK$J`UP#qVu6a^ zWrnl`?lD8!uMe0ZeWu6E3=N?2;{`KA1851$D`tiU(B{wA%nS{nJw)$7Wi0~(=;)0G zP-^+i%+PR_fq~%*Geg5A1_p-jpgN3^f#D}JLj&mGuwS6MjFExi52$QsWMKFQDsw>d z2+Rx(?VxMOSs1|c3@j`R4SyIJ7}!`C8dR7V7}!}D8XQ4uP*@lm+?W^`xLF`|I4=uB z!+cQP&BD+CIs#0Pg`q(lbTkMHLqj;|I1m61hE>cA43aDi z4eLR5Hw#09Vafuj zqs>?t8bC*IShFxRyk}uxuwh|nkO3Wy!NSns!pZV_*nj zVQ6Rp9YDbXscR!a{$pTZ0PWE+M=Kvd^Le2C$)LID21NM)nH`M>&Bj0nyFopF&;l-K zv4BiL3vp2Xgfyx_&3$k;4V0rG^;aU)7*IX~=|#$C;2s$$-GZu1kQ@ku+yzRvpo9;a zn*)i(gVF~B1L(Mw29Q`X3qu1)O)3jR1IYbpP=A6}U848#LHQlj#|O>fH)8c?acWUn zW-_Gn2`Ya;Hlkq%L2z~jdGsZ?=z|^{1uC{cUIm>*?9T`_2r`QS%9J3#fuv!kf!qRe zH>mW`feO~KK|_1L$5W zkT45ExVR*-s04iUIY@#7A(2#Bk_tYc9wg3(5HBsx$OoO2o5}#XZUrPMgd~}hpO+q= zlM1&<0wD)7uo!NWBtoJ%JF|d6fq_@h8&oWTeF;rekVDDhlXDV_i@~?nEmZ@p>;eq| zxE2+~hvsGH<(KEhyJhC2#zXgfgKm@osbXe;sq)M#OU%hkK~V*|bP}YB4MUY`^ zYF-Hg=n@Z*5_Y(f(7eptf}B*4Y-&opTWVrSX;CTz=qhiJI&rujlrRPPZV_Y4QP1~=wh~bU(j`ezW#px3cr zNht=amA`<{#wi7!vQ~8RF|0zyPuh&7^qnTq|fc4eDkM1|Gp_sJ0>0fG6r;R%$Zv z2%`9|AQh?-K63|Cs>r}2xD0fT5-cDN zcY(_Uw~%=7dFw&0fuXL@dqU&={Cz$B9DTs)9;A#B6bhKif?OSa;$1v_8RQvw1i3-$ zkHLWq3SrRLHYBgcgHAk@X5bN=3y%d<1z_DC@WK_E-C@NcNH^#l4NlO~2e9#|3W~uu zK!A=3q3rQ`8ng%*@`aMJ%bmj!; zgmADnAqEb?pAd17Enu5LM_wb@3_cJ3Iz$cBok6L^sU={wAakEXaXsh=a%`>#M^6iy79<-%aeE6Y4M_^Y zsU^PoDXC!lK&Bc%WWjxVxIaM>+7JnFX%3grWZ)1?g-9R=fO~2QIIN)o0X7`unJW;b z(2(#;EeFeh!ssjLWcZMH-~5!)oYZ)i)Z&t&(&Uo-BJg4BrVwqxIr$}sum`26#}Elv zN&_p_fQW(J2^u(tTQL_R0d`n?Kv8NzViCgI_aTx{mx1&YLvq4r6o)zI=fPbDioJbM zZLruw4o#4}n-vZzX5dmw54D5hi3c5ic9U_Gs z%OE*WB9CVP-B1yWsQ{J?K#PV!iowVJqq>9vbXkC|FgTQ)eG?0yxf7J&K&vmpGxGvm zZ9KP-co*>Tw-En;Tn_TmR*3oFBnV2)V3&Zr1nMfdL1ulx@d#SJ z6rP#q=Nb=5FkpqCpqdIX0bEw4f{JqREQ(#I83lR0^%u9gWfG9-U-zF6=vWN zd=CjvNZtcE6_iyMLo5P2HQqVDpc3pqP*U=P$UsV!R7egDgNT6>jwk5KfV{*UaBK%d zB-~T;K=+$~uf^$y2nD4k=H%ojLlQQ6*n$ET8onrDdl#w~Qg*?MAyCMaK%|1fhd+bE zOOb&?5O3)Wsm(yEqma^BVo9PaX!#T- zLKG7WpqP<|*o#yofip2QSG$6*@&RRY&^Q^Ws{|?pz=bPl^%^+Fjg1g)0Egddh>;Ml zfUaeMRmC9tLF1!tA@M%>dFkMoMJg>AK-X|UE%wYS0Xr`cVwO*4Qc+@2B{;l6rhvw~ zK;aEi2J*EdL>b6&pbEkJaqWmcr7fRh1eKoge8K!p`JKi`L>N04hl(J#foAy@=)ASC0(JLlvV zL#kC!DS}ex!Yd?Dg2!x<#e+*eBSa)4>Uxm-K%CNijz1zLd!PGYdi3#Ckf#sQ=V1vPq7!9_?L#A1jr)H@(MK@EP;MwcScq5yCx zSwK{Rq9q>WcW`n5T`k3ol!u^&sAsWDYFc7x4x}Ls3QEvI9Z-e!p77`C~H=<$%6$RN4vz;2j6Cha&Yj$ib-%>7Q^B)F&R|6LEHfvGY7RVz z50u|QaSgjw3gjkCr$Q1wXlT$a1l-l~3xO6(V8VjNQO8V`y)aHayakidq6 z;u@tL8P5PJ)bO+x!AS`vb%F1Oi-6b$%5>no21*QV&D{st+5Pg?SY1XpdJT%ZzeQ}gEA33q(Mu)!Nrxa zQG76Dp8!}6be$CFb}8_sU7&IeG;RV-bMa7z#e=Q@gOt0Vp*>JJ0v;9wbt~h+ak~WK zAAiW58}Z;f@Dw5Ohn%{=IT18m4z?OpP=N-+jCDns10OeMs$Ojk8pqW>YW~BZFSo|&2F(7ehPZt~)FCpUKi~<`AhzCdP zM~Dn4k;6g{>{n1yM6FpN;aP-HzJhZX?iOo2xFEnDo8XKG>d?4_#QQ@wGk|J4sE?7| z1ddT~aG)kyi0N1h{dn*#k)Y$~L1_)#k;_Od3QH{V1Z@rh7ZsqkAC@4C2e+M|t&f2G zVz4t&ayPgX#1^Pvogg1UduSjV?n2TUxDW&&sG>0U>n6+f4STM7N-L9r4|Dy$$*%%n4!I!~d zUN)Bk7RS77ZW~yf8RN1!KG3`>u3mzcBemxxQe!w*7byzXr+m7-Qb7Im; zK=)yR?lc3Ra|~Kn4Z75WWmkg3}tbF4*mgOo59V%0$L@&0J=voShTPoNg*Klw%)IeEW3?4k7`DD;FEj~~d7sCxGi<{vN zl*Ppm!3()ug_|J;%Hm>p0A+DAJb|*f7$W#UoAN;B#XwnH3_ScWF##xxi{S`A{-xUE;j>s&x&W@W+;HNxELCxVCq_-EG~vuP!>1CJ1C2bK}H&;P65i|VhE9iTxY}0 z5CLUzF1C7AT90VU;{6WrE^-9hAkza9RPx z2jTNj78k=?1;|M?+zcO~EG`CqMaXqP+zi4{78irDBIIHqZU%EGi;JOF5pqQkH$x+o z#l^5tk%0l!#OG#M3T1IIoK}RK?8MD*9?Ifk_@)TjaSC$FFDQ$PAzB%7A`Ul0Je0-7 zP@@dFB8VHj1OqgG$;B{J8FY>oNbg)Ii;H2GGGwnOH^V+Ci;IC(1$Hh!CzOTz(mzmj zN$#b8j7*RVc|dIo2nMw*Kqf+XxJb~7ebBlZ5RFR>HN{yN92h`t2}vu^9yEmeSQs=Q z;z|q*d`wIXd`zI#FQ9XOelQ5JfW%lB_?XxjBzZt=4hBgk5Y5FPna98&#KOZM#3H~T z30mFXBlGZVzlgYKRNv602$ zJC#8a3=9mQRVd&UCZK~9konN-`{44R%@81Y_&O7a0ibg*AS?(8+i@WQY9B*{z$9q% zIjEfh<}iTwmx3<@h4DdKvXSLMd#j;I6RZSuW-Kxvv=bbe56Z9bbr=i`;L9eE`Jinj zurnk<275);i;UnKc|d2~F*1NoxdgTQ z7#TpPJcAa=GJ^J5L$3}5osa@rpvA}lItv1H-XbGt_cH_N3`Ir;(D5dq^|y=+pmT~L z7Y2gPAptG1Vq^dvKLQ$-VFc}~fnEUD!3?_;ZU!^#qBzhsi=bVyj0`)NVHe7Q`XZ1^ z=0F!ILN1;IU7rX#xd(D-B53tIBLfEu?9w{W1&NT0>_FEdLN2!hU4{tS56Q>?+O-3^ zf|rp2bY36mtRO}P4t53x&`C9n3=-@N;CqW086wyj7(hFYp;ya+E+oQw4-VuSkM0K0 zf_Ct29xwq=aDoKD_nQTHbT`~!U|;|V7d@C;?qiWCN<8UV|JVCo+F~ak;1IX9_?9r|Qmh%87W1sE=Af85d01IjY z0N*i)aZ%!#GoV`uL03p|gnKl;0TnEu3yDCdxxp_a>QMoeEgs#VRrL%W#z#ClTU0JYi0d5;RHlwznA>TUtEzTfC^tz~&U`zWD1tqL63waqBK$q!(5(EEs7nKrQ-zWwK z{#MYjNW{hxNM9MGsDS4_hy|r8KD{j}pcIVP5pQ^q9Rbl`>*oq`2dKyeo6oEh?Z5WX1>5I$KmgTlS8(sDKJ3Py!{^$=y@HW?&06P5$jIDxiph*{FRGtKUjk zUz+eRFd&QoIR{j`gY<*w<{tueB72(n8Xz?-9Ga)9Jw z4Uk=23=A;yvk#Pk-D2&?QAV=yWmt`mMl#-`8O8R0pU^`#Y(0!v61tWkoM{*53r zL468n9I}Dqke!Qx0hAwIc7b95;g!SbOP6meT7I5a~>FxoC z9`lKA>`AdyY8R-x1u_#7^dJji232z+ryc(72SDi>ls+#%fLq<&39`Bqe2pH&1ib1R zLE1q@YJ^9(gM~-)0S>U$pfmtxK>Zb>5&g9=>Y!7} zh|Ry?A^~f*gcLcT9h7*BoJtM`@cqviwR$8dS%Eg;fr1IN>ym%_6qR!f3=A$H3D8|E zF5NvUAkVmT`lwidIH2oTKpfBwf*PP}e_gsybx%=&xB+ycKjhwCa1)`saSvDmRjUuW+8SQ!K~liq5`_22GlSD zg&_+g1A|LvcIOfG4Mb##ivV&>!N$J)nb07#J8DS`U=MOS&gm z15y^DgMZft`OX#3{|yhzS+xMhQaD(S(>1c!Cf#f`-?*vCIt6Lcs%GD1cbdAOtZ% zK?tFHRHi^v;WT&%a3PXf)3+;t&df!FfLse5h3&c0L&Ymj4y-#{{R1y`_KRX zFAx6$-7F6APO}9=Dak!fcWi0uwHv}>Xq42*!zvYDkPh@#-)j*_*zm$!32p&_L*$1? z_Zescg9si6sR4H)jn9BZJQ|OHI-l`}k%mUVOw{oa0Z{K0RByq1r#>nQpw^j!M>m5< zCyRoCP#C2OdLG=ys6k_EFK$J^{Y59_$8%ZU-6Az4pbNpy7xA z2Rd0)KyJom9})hCT6o+=1r#!1i#56#z<1e${SR`5rHcwjxhNHDxmSq z*VZt>ZXXp6s6%1eKn~?7mV~Kbc2VH~Y3+7V;Q%`vB%#smqr%e3fy)ojv4!S0IIrb( z07Z`iXqZlcp_J*hFUU{@55yQB_?m0z;99qfii1aY0C>C&F;wT^aohnh=5`BYfWvVI z(8w%<2l!H7a7uy@pvJ3$ODEbz%#CkAZBbC-0-X^6Ph34Jpw=lUBY+Yq$ejit!wryJ z7t!4UZoqXyD3DrkyRH*b3}VgfSVq&D_o#qQQiF_$fLP!W5zqyR;1Lm!NN0-*h~EvN zAR{6!Dhb_Fz&b&R7;;TCqFKfdHsH`&|IUEz)&X(D{nqyD{mmB4eQG%tRT0!sK8vqzuh6B^#JL;?|&dmFj~rO zaML?oR0=>ogV_V}bp=SEpxZ|!q0@r}!gkfF z2B5({&=@BuT|;Oe6_7tt(mFkuKsrEOF&0f@l<#AOVH&p4NHgf(^xhT~kOt#R9^Hrr96T47u)YKh;X=Y-n*+FB zt>EA0nPGjfmgK=I(3w1#eFbpa85~K-=4&5pJ^;%G0$}UG39{Rh!_uRqh-9llmq21# z4Z8dc+3b>T2M%q}04-?305t5)z`*eT0JuN}r9arnAlM}yosFPTTUd!@1Zk>*G=inO zJxf5tkrf`yU7(S47tk2~MW|gJAdTQe0<{CI!=t+sBz}yA5u8;kJh~C;JpLc>==A{= z1wJa^y0ZeR8dMc4xOATYjXi+u-UW(Yka37Yp#sgNpnL&xNC8M0!W<89;n#<@NwvL1W(0)#9}}K8vNTmeY6jLzkyHyZUTZ7Bq78Mz|BnqBu7J$kiF$4jlaJ z9R->XsLb36Dy_c%>~v9acnz+DK$0LHs3F$rqGAJ@qia5(aPS9c;MWFhMmM5fFX03w zdBzfj*XAH815osW6#-a9~J0GbMuh^tO1Iv{RhfUpuh#4tppF;9u?4ub)a$< zJirM_BcQ+ott4OoiG$^v4`hJSM+T@3YrudQGI|AaG-%%i)X~bIqVnZGc#8rtOKkzt zYQaz<2nq;;ZU+I&78OuJE`oRbKZDFd?{dA|#EP|J&R7HLPl619W;(C~z=N_EoA-cC zW+(&Ay@8bcKhX)X43aA?__sM^K}A5Wu|Uk=avf_?0Tob;uQ{MB2L5djp$-?763|p` zN$Y_U-s3Ic87GiyUvon_psq`D2s7e7<;$XEP4s`N2fqy;3Vck98Y6mom z0cwOH>jh1^fQ$y~1#v)=dthgGJ8(3=VA6(6n_0T36p&sKu(MzrY_S84aJhimf<7u1 z9?XrP5CKJh1jyP54^UMEnhFJ1o*vl;AQKJz+gup`9elt6ZjgCopJV_P_!0cue7OE` zALQSD0G#nU9a&(0%ZC{Tp7f7^8O97!7XdQt&%p;0FvFPOhW$DCP=Na&Oq>x}oC6__ zu>24AK~RW7rkBZeJIDl(b1k|ZILHfV&>|Ad8uuy_q+t(Af#4=)2Bb}yam+!A5tjLm zgHIp@4eo=Tz`xxg0Myt6<;%`SP^y9}bVw*J$xH&N%IJ1rfwu6#>Kwtnx{PiH6hRZL zN*xg9fy*u!w;O!AIf?}~xrw2##9x#icL>XCve?3R{!EPUw0#KF$ zB`FKCCKMg8<_|eW1_lqzz6jWUmu?PMW6&rd#Hl_i72vP{IU&QN(@_9aU4Z%{x1ep* z43BOH0Z=;?)DU^C3~d5|ODu>9kY+xp$ z5&YXYJ2+l%eCZFKA%;a=1E>ps+yOKXgs1TWs)bOiEkykv23i#*0ji@w1uMLc@&R>x z5xrl;AXtrxg-34z%TCZ@j?YWLZ48O{IP?KFg!v%j6+p&=mbGCT-wC!O1Y{_p?eEci zL?Qk#Xk``X{vH3{x(=F!!IcrRww{H-A9TwOc*Qknp%Ca? ze-?&WjG!yYK&!jwGcquM>R}d!HH-`lAk$eucfT;`f_3OJK~~SRFjz4$Ff@V1?3rLX ze3%#*Kz9(bFn~_*hUmBp*YS#pfdRC7fQ8{bT*n_K1_sbc{wxgKpfk3?=BYBn+zh%| z-V!V}o0)-OFPNpp0+V%Q0j>52x!D_ZMkiPnbaM{GM-xDI=zzthvcTN82CnxQ3uK1_ z3&RDtUNcsh-<(+)7}~*lJy>CS<5^+$cCa!qn1f|O_vu)JS;ygeudp&OfYLS#!%eu} zXRHhionUoeSs9=q$;}43YYpUjJvb|#je)@otZowPaMnf+n43>=K=xd*Fnr^HxrLdNfuSF49tS7P_41rB zlPx(RyGvLYKzH_l4ti!`Nalp;-OI_q0LtPl42R%)g}7j{@>~oIpxgFX7*x1mCL3}w zFo15kVqtLLf`!WhF34^b7KT+^3=9xEPQgw2#l^rd8SK9Qa8q=+VRl$@GcbTEG!_Os zZkQe3+zbq$8#7oKqPSspl)-g$b2Bi2))BEVOn~bE-R}d*jR(0QyJT1xKuc~QZt>)S zg+?+DWWNjxLoN@@rBiqy=fSctEarjP_5-d%h!ETWxO!+Ho#@C^D=-} z#Ii6v2HPrEH!Nwfaw73Hk%FBaZv!K;~iXYu8!Wp>0%pp32?hqxf;Se1EfO$SeT1u%k%Z}3 zDGAwq#lo;ol7RuVO@oEui6qRFkCF@wOTi|8lZ2VVEXBY8I-8z_K}ZVb`gkdrjvOfl z2GEVHEDVKGFdcPL3=E*&2n$0mT*nzHSh$EuGcbVe5Mp7llV)Jh0^3$54fET2X$FRs zV6nT>3=FHltoPCk44|8CSQrFkAbU(%7?fooyBJv*jAa-YKzC`dFj&ZdnuMTIdASVa z9Cj84Avp#H&}r~242p6v*E`EW_6xEw9G7EYSO>P_8eCRbo`C^$PXP;qk~~a@ojlCH zLGla?ptc4JL%2N5zZnWJ*-`}t2GE^AEDTi&Fxhqm1_sa_d@Kyp6kz6ERD|icr^vvt z8SH|`iZC4?6d4#m1BWaO{}o|6o+>dgfM!@&7&??;dZ#KgFl+_uouv%ZyIh%p0W?m@ z!mv#lruU;VEObApFo4(8voL&BfrZslRmeU&7KT--3=E)+JS+^Lz16y)11=LmJ6#wU z!ZY(y^2>`A-26bR(-{~*XNBhHm4L2G1$7`W_zDVn`6UX83P}1C(lT>WL3bvAG!VV3 z8>ASt--^oSMJFfbsh22ZB<7{$q$-qwk01hhP66cc;#in78Ax@fZo0tQ=<`t}o3v8UR5tyT+Pz1XBwk)%#q%<)n zJ~1VwD7Cm4W*1lvWEMmK9JrvX7~t`dkyxydn5O^>zyMbT$RW!Rm86CPXy2ZKs-8u$ zjzU=?#7c-)U~I^p3=kd{149Yi9oW(ZYMKBAB&qHJX90K`E>?gBG1!S9AChVwt<^)^ z3n~N@lvQ&|brg`p3pFH@3lvmyNype>opX>TP76@DpV^lKDL^iO z0hvUqIie)VS&cLKvz*SGk|s*fDU+FQ|D7+Jwr?0NSnzVSz5`0Yy7AcuOeA zwag44cR*MmQ;WcQL7Ox|TU41DK&l}uQ1cmtnZeC&&{kGvh8oa?++ZD`f!0be3pBI_ zy261OJp2Swc?seW#mmxfX0@d3^ukihL;@t3~mV3;qkX^o5)X&i-ff?T}L&&*zlWyH0fR z>wL|WI4bmKf=93Ry7i$2Ul%rVSHWnI$sp{IoS$2umziRd&cX=VX~xXpkd~TQqGw<* zfsvsBBBGa4l$u;pmI_i2nmA`>1ReST;vukJN@`MRx=Jue1T+!F%&20+zyJzYkO%}r z)qtW1v@Mc>nGwu{NJ2@yB2YUS!U4^0F*7ExLvEor$`%3jiy%_q^a^5v)PU@R98&`6 zv@(EAhjgewvm78bkWdDtC(yDjga~K@uK**c%L&s3+O%tcA_5vz4L}hA4NN4Uh=2xt z8{i^(C8-r9D!HJ&z6_wvgUpOuR2djRi(rj{IzV^of}GC4zyP{3Qa}iFf{_B$&G#7? z7#5(2d}d$(AF0F208_)p$iM(vVT|yFBqIZOGc`g4w3g|DFtW*@?E?uS$RaL`3=9D> z$RZ)2w<}xgGw2Q2q+j=g6x932V#ze z1!w>sq9!*rH@N_mNkNJk6d0Hoic5+>*OP(ypkr$w=?AoX0U`ua17aNmC3X-4tP6C! zZbnf)XsK(SsImFf)Sc3Q)8kZ(9JW z9w5=iuo&uQuo?!v0)#G5Jqfg%FB z&g}(?$WEw{P>O+p;U)_Mg9J0O?LS$-7r%nba)>V^Ss55CP}G1fUG+c_iGp0iilnQW zm4TrFMa>*m28Ik2k^QWYL32d-++~H-8Hn)t#mWF~w;**l zgqj#O$WR|bO*tE6*d3u}B2)ySW;tk~F-n~7VPjzUf)c7%AXmd8`TY$W149EFa;UO` zjATa^QDA3a0JWb$5|D57@JyHfG%$Yw;I8A8Jn4aS{KM_%q%m|)R-GAKo>E)fG%PVs+5q; zu`n=T0+m>xwhhEC3&Q|(5fjiM2gtfC4M2xAqKKGWK+|Puk-&^Hs1+n#CI&{J z<5f^ZOhHGgpoo}(R=}W$Sa`6Ym~3Kbl7S{-WH19=#Owr`h_T@hbP;m{R#cOXEd$U* zOpFT9MT}RViV`2*0T8w0lxsk;N zR5j+th7Zt1j0HGQ++%KRVSp}T>47FtxO8oW>H@0)8+aNj0^%?+=p|=l z7n^}5eIQFEm>EHRQji=1-{pWz#^ja6L&oPIm&bu7WZ-AR#Y682EYHk?pAUy520jxG zGU$vh3LUOR5r$qEm|28F6nq>UHaYmwZ%C4$8|_f728n<#!OP6cEMb82KnKG?uQNs! z%S)|5RtCCx4SaJRLKR2|a(xEqatqLnJ_sJ@plvV@d^kDeLMj9wdi*?C0CWci&)0Av#A*!_6F)N&9T;v?7*@nB7rc_kUCpc#qy zvecrI%;dzJ_}o^F3!U_r2H=pI%nDoOTB%uQ7>z#brQc|!v7 zMg-)I3CNoekT)eDZ$?1goPfLq0eMRT@`eNh5Kjn(B^H4$s=;jqIOT&bI6+Mt=&{Lw z9PyZvNNEL8U?OQj5=2*uRGOk|K$gO)4P4-2)di7(Y68s|fUigZ7r0RMsDf}FC^y2B zrUAIP1#3kSH^dZ&1vG|1m;sEU1QxJpf=Dh$t`3mgjv|b%99CPPtA~k$Y(vx{X#Pc& zK=v4_40fL()F68eSrqD6XsrY)Bq7x zg}@FB0SAyrkw7w_ap|;=3=Gpi_gjGH1wj5Va6le60;vOyL@)Tnz@PxSR|7QL#Q;@@ z)E)+@12tD4d}m;I@g2m2%se;E$P7F<3F!2!ci{E-(l)@G;n=Gs0=#%;ci{;{3D{1&tt01^5u4Z6($_^RExy{Z1USS872{AE>hnH>)G7Lfjps{wSBr@e7 z$iUCQ3ic9cfE(1nVi0B!6a?L(0J;RspRpL+9%B$;5ES%aWMBYY@#)W4VqyeZd&3~k zASehL7XZyZ`7?rqpzUXn1n7Vqh(um#ZhQgwUShD}pjio3K?VkYMyQ}5$VLX3;YIoR zC1CqNEPuva$bDEK z*MLS~nAt$q#Fyk2#4|84u%Vc7n}LC0E~EArZVhq*C85tPu*GMo>kZn^?dg$si~Q8Us294he9jo($^Jq(aPRVgRj;1?A@p5O;vX2bA_e z6IGzuh9gk%l?)6GpkQ0Yz|i2x0ABal;LQMD>(~G~xpo5sLj!1zZW9AT188C2W(I}^ z(A3oy28IUE+Uo5L3=N<)sXG`L8bCq6i-Dm5YNU}%`f$iQ%#fuUh3 zBLl-328M=Jj0_Ct85kP2FfuS)U|?tf?aR8%z|e4#k%8eV14F}AMh1p!3=9pQ7#SF@ zGcYuKXJlZw&%n^Y#l*nyfPtYwjERBaAp=8$5)%W%V+Mu>&@nvE85kNs$2GlRU}y*j z9a+S{(2&iY{a$j|^9isocwXb1-lt}`+;Br`KG@G>$q6f!d~@G&wp6f-k02r@D>R4_9z2s1J? zR53F!h%+)YbTTtANH8)q%wuL?kYQwKSjEi1Aj`C#U85tU$F*7iz zGcq*%VrF2_U}R_johhZo$j~4L+C{<0(4fx3z@W>>&|u2Kz@W#-(BR6#z+lM8&`=KA zTfxZCP{+c+V8+PM0NROR!N|}s8??WIk)dHX3j>2KBSXU#76t};MuvvBEDWIATpHL| z85kTv{$yofaAss^uwZ3iaA9O<2xMhoa0B^|m4U&Xk)ffKm4U&Fk)ffHm4U&Vk)ff7 zm4U&Bk)dHeE4VUk*vbmZGz<+VSQ!`s85tVxu`)0OF)}oO4n7NIWM}~8ng~XQ20k_h zh8RYM25B}1hImGX1`Rd_h6Ip**cccR85tTJ*ccd+85tUq*ccd67#SKW*%%noK>lK5 zU`S_VXlP?&V8~)*Xqe2#z>p2HpN)Yb7Zh%63=9Pz``8#53K#moZJCjwL7N>sVcKBN&cIN~$k5=(&cIN^$k5=!&cIO1$j}hU&cIN| z$k31r+Reep(2&p0z|aJWPj&`|W=4jFc6J7a7Et)IGca^BGBhj$?e$<}XaEg%gC@>T zurn}B1i6QS0lXi`m;tqJQD%nRHzLc-!0;5*iUH?(26){9Zghj{7SOmfL=J^?5CoSt zpn@2+)&P~8pt3lDa48O|0+32^P}Kw~v2O@~qB0kJ1uz4sbOM!4$aOl%?Vz#=w0zH;E&~Cz7hj;pA-JCb>ivM* z2Oy6^!wH#k5Cm7IpgIb4Pp3a4Xix_nt)MD57+mF+m>9uDLE#Chh+$0xP?UkTsYA4v zlz^3j>M>9XfTRm>oefG9pf)aY1r3T>aM=lJHo=_*@)Ia-L4&0r9UzJC(762pjoY8l zIQ_-Q&;VNY^BSaPICQzXUx*Z(cohi=AFM;R1aB#T>7Q!B2 zutE*0y#%Zj6l5U(5>u#w@+s)v37D%u{sM&~XgMQjvKl1r3=KyYXgInuF*Jboe!4L+ zG=QpH4`|x+W@2anm4kjv3=JSZ`7<#zfEKj{F)=iNmiGlSF*Ja7vxPA+G=O%9g+s#^ z)PA-=%fB^DkR4Q|ObiU~afL5v%m*C4pdJy(rD)he5Ztu_xdjqH;FY}K&;|J!l1RZN zn*@WPAZX1As0j9F1S^APX;23eRB1s9IM8Txd|FOodNH`}0i|Hfx(Ae8QPVXj@<1U4 zx}n&gv7`ji1p>trB$h$77bxyQ^$(~FfmjIXAo4L-3Nk^5Za{aHBkChiT)}(|3NsKN zwAd7MDlVZ$<`&IZO-X3uo6@c zGBJSeKx_cT`C4e&04?H0PaB|m6qK()`>o&NN*nOP3KU16kU+!Gnh+E#khB2{e^BlL zg+C-#z!?e>+@QV_11Jn(CV|`m3UAQ33~0G7NIV9bS7M=gC4q^d0p!j^sDD6ZI(l6N zDr-Rg0WFJthUy>4y|v&ga={55w`V{l0mw5b0|TNAf`XtF1`#YNfsPk|)PlU|4=!FH zQ>oxm6|;>4avR8x$ZecE&^FFpXdCAtBP2~dVq|Cl-Iw@;k)Z*!RP-sRugAc^@Pd({ z0kr@A6(d6f$d9j~?L^RuPxP<=U0e*BFb6GUe2z6N;1LT7ZYO5{i(2KE^w4N5Kr3K- z7#JE9LG?4#PoObN8#F(GHh+N97H9*>0}MZ9Bo@abGEp(n?G=SVR4eEAKTiq7T?VxxC#UUu(9%8s1RFr~KMnO?#Sz<{l5sn81KT?cH zLCcJ*NHGF44CFENI03l_-CuK{>1-}Eoy~`)vjtFpfzp{dn!i9xNkQ=o+7R>z;V;nG zm3wMQJmUI!P{sk}15lzu!_XQHl%-K>G?1S_c|!&~2nDKgGC_+~z?BC!KY`qW?x%y$ zG7dCu4eC#V#;ZYYJqq;`Xif~hj=snQ*=v6qv|JtGCy)aQ5{rsci{in{nLs`Q73pZc z0daB7_JD@yY`~2Yh(X|*98^rBOaXzaKTwYfW$+EuYzB3Bk>^lAO*zmc0H}b2ju?TI zf$Dik-GOLbM}eHhz`#%-2U_UrF9=Ex3eXleNDAaMQmY$%t3&bz2AVQ5zrV5dK#&N_K!jREYLX{pzs211vfDQO~8TD z2zXr+D2;&9HB=gzf~I;<3c^Sdpp1eN`=AaIsNn-Lphp%Gh2XLZ6lWko5C*vk#0Qm; zplx#?vAYbAF@k&0w$CF5h6a!vXdVTWoSrf;G=Ti@4C>eYOrUvA)Ug22#4PB_S8)~w zh96k+LwrhRGGrV8bOs>ERy2$)JAl$IXvH*A^$tq+po@}B!8ruf6-_MycV4U5e!O)AifYJ02p9= zB{Y6N8h>sS~XIGGq2Hn2d(AvUrwG)OZsFl+(& z6LhjW3qu2Fqu6d1hK49628KN>3=N=7VS8B^z~d78SQr{W>mLrVFf{ZrF)$orVQ2uQ zty3%v4WPtxhJ~TwI}-!LSr&!{F3{E}kbjvO7%s9fG>9`ZFkE3_XlP|-V7S4;0G`*p z&BD;Im6?Iz4#*$O3=DTc;l<3raG!;t;TSUm!$TH^2GDJ*PgoclKo|c#WnpM|%*?>> zjD?}$DKi7ZOOXGV85mx%K;}W;vM@9-u`n>aV}bP9K>MK3%Vtpf3)Ch7we^3ZmRFEM z1yO&4$_!8vLBr6p8B|bU6h@%Z0IARdr#MKT1XO3k3<9|Ul;)7f6~3@Q`deRFAY%IKUf$VK%1<8vM@A&HhceJVQ2u2P5xzJXaKEI`o{tpul*18^I-kbg3e;xxFG$S;FX#ccz(M<5Kn_F0xT>=UObiT2DFamf zfOgX$&%S~J6O^i~k*he6An5)ijLK^Y=wez1P%Qyz$bl4s8Y(DF1CTYKZF|TKL*&IZ zpv|O9Aw?)?xD2$L2U0tL)}$nZ<{Lm=)B{Wm43Kgk(T8FHO`3rkL=g3vDWFw5f`WVC zuF6fUhzFU%05TZVVuC2l&CG)dGs9LqF|;x=FhF;NiZKWZg63Nx_JIt5j0Yep8c6%} z1GKCL1wSaxK;u}T`7_WJWFRp`Xg@^-v^Ir-fk72Io}fX-3=9ojpi^F3v}85kNsL0!SX(7?&ez);D+(4fuC zz);P=(BRI@06MauA&i-Up_YN6p^q7S{#e6CX7CB44WO-~;Bf_J@OHWe5f<=ynGHIi z)1E~hA=L0r?P5}k=J3({9p!p0-w0&PsE&Py$g`k6 z892d$#ZP#mNUJb(x)i$HxBP`UzPkbR)^2I}8~`Zgf3 zH0aoO1``8#zAc*xvi2&63DPghh0by3GeOFx0_dD%ArnIb=uE&OCP-OT44s20VPXKM zzfvZKhKCFc3}s9V4WNEf1!yjTfq|it3DTyhf{v{#GlEX~L@oEvGJ(Vx7(m(dGitbi zyO@ySw%o*$qRa|#$bc#)kY~`as~`gxgB5s=$e)oB+!O>g=8=jsP~ihQQURrM0EH%~ z$TpJ!l~N_Cxdq@ZEhzX=N;8mVP*YqEyq*r~9FQO=Dw@Ild&mhq44}dYbRGw!aSt*v zzBoBCClzcisK){+V~SFXOLIyXK=lx)$qMq#EaZL>s4f8sf-oqIK#l|*00O$E8zcr= z7X~UzzCp)6LF>an>*he~!$9Nq{}>?i$_$JQ4WP3_LF>Ul`Y=WY1|CL+24m0x3ZV5wp!0qi85%$r4}#W#wKFm>h=A68 zF)}cSGBPxrWn^Fw1Fdaggscx!W@2EFVuY-7lLoCrVuGv_1C zsFegQ-%E?YaR-WNlr#aVxDY)iNcRjR28t?Nl^JN~Hnbf9>gs?-BOvJ^4?GhJYE3}+ z;4}9aWEcbmK{GO-^ytr+pO;e^pP8GRnv$7Vl3EN-YM?gTS#U21To08bCgr4pjRF}1 z!v2hix)+rEQ0iV#3I>hooL2-Te{e9SqIAtb%RWF$h(N177z71DNfk0&pO;^fl9~qY z_aRr-TNxP`IzVH;4B$EylvyE;0J#oaStF|kO@i7&mY{;d9CRu!qKAm6P1(TN1hg6y z6sNFm8tCk45Wf%Fd;`sDg7`3b6-b+b0oJ^`0_DF}gLKQRq1~=)Q2n7$K1}~Qh&LEu z<{yRfVe%;uhr_#ZN1%L|c|M?F45V&e4iX>Sd<6INK-WNlTn)mYbPh^9p!FdlP}hLg zO@hWcH5nmu`r4p1V4yYuBcz{a09rf709iK)3Oggvx<&>D1`|;J0=2UlA?ss7>nK4d zds>6mO)@~%Pd;aWte^Y^TI#^a&;VN4>jaupV}z`ilm)d77$N;YPez6YT}H^dNzj^a z(7H({Mg|67&|D%TWSwLJsExqL(2&E(zz_nmpOJw9v|bX_KLo9p1dV+~GBPx5WMp87 zVq|F8#>l`B3tBJA2w6Y*0(3kJXq_VyWc?)Qgz!|*oFx-vz2rkC$U4clObiS;j0_E* zm>}yUK?xMJJ`%LPwUm*e!H$`Mp^TBC0d&kp4|JVtFDSg285sH*85**gA?q0{m>C$R zFfugEWrnQv1Fct`1+pJhw=*&{$bjm0MurAO76yj-pmLD~vgR+01+wNZnT3I2F(~|5 z7#Nl_GBkh^K4@*<6c)(ZzJ)9d44}1rpj)RvYx_W(xO#LqG^G@NH;U^vgn&~S^Df#CupL&JSm28N5EgOFGm7%nq1 zG;p#pFkE3|XaJobewC4-L7a_&;XY{HEE@yE1CTq|7#Kiv#`bLB4JQr$Yzz#~7#SL( z*ccd|Gcq)Q&KL*H8RxSxFo5QaOV}6~-a^;4zJso7eb30y0NMurm64(0FdG8{X#L$S zHU08YI~n82*CNH9G?XX#HITI|Bm~6GKA^=vW14+hGPXsGWe?c9_fs zsTaDq7#Kh&1cUMr@)#z#5no(Vl$nbVLf#4G2(m52_g;WiV*W zDIQV=g9VKoD+rZ|LDGl2Ya8;$=1%7^&}bkqUJ zeK7s0paBO41_l^^GaCOV8s8o?sDq@w2aSIdjSo5tAKAVf&=~eX8M4MtfEhAgDa_2! z06L&dl$oIcbh5V?GeZODfIvxRh6YeOR+^ci;WPsSgDf*c185zf95X`$XiiL?8L|&V ziJ74Rw6#TrnV|u6gM}(HLxUwF1A`hfLxUY71A{s3zpc^ol85(3kZB%B+ehy2Jf0!5;Y(eHRF)%nVGc@=y zF)%nXGc-gpF)%nWGc?38F)%nYGc@FZE>C7=XsBjlU~prGj8A$nGc?R&VqoxOW@rE% zQ{~0X(6Eb%fx(BFq2UY@1A{L!WZcq^nW5n}69Yp4Geg5`CI*H;X2?E|AZCV!-%Jb) z!ORQ|+{_FNAt3)UGcbfQGc*V>GcZIjGc5x_XaKc%qL?A|Vl2qt%nS_iAb&G6 zFeHHd&CI}%2=X^G14BA9Lj&jtluTxZhAGSp4B5;K;68Q^Geg5RW(J0QW`>44%nS@g z%nS{n@y=pqh6d1aD5cB{4SXyN3>C}_4WcXz43*3b4N@!&40X&54dyHi4E3OJVgVm< z)Zom*z|h3Z&;Yt~qYvZ`P#>I`p#gM2%0y;{h7wR;oSC5kbVSn(W`>6QEDQ{@m>C+L zfa+&vhK7%z`WX}sEDQ|um>IzPKjwq%Wo2Mk$js27$jZR52xK2C1L$a~2GCs`OF{9& z%D}LUnV}(=m4RUeGeZNY>{-ps&@h>mfngmpL&G^%28IpHka}|?Geg67RtAPm%nS{G zSQ!|$GDGUkZJ>0(#=x+hnV~_Aje%hYGed&`8w0~GkhyFO47-^j_2eFANIkh9OE_McnE6fZHV(bhISD6_ajM*6&t}!z-SgFA`?w9tPwWf~ zcbFL(%Geng?t;=CI|IXgW`>5T>bMvfj6q}7Tnr2*(6MS>@C`Dk?GATNNV~(1 zlY!wYw*F{w8t627(A+8LVm45bh=$Qx9N^uQ$lEL7O%TwKFxnUfXc`P<3P+xi9f>8WDc}kdRHsAQ3!te#PzwaqD1fYt&tm}T1a&VVe9*xj@!-|Apo$+fm;})Y zX+gy&m8O9^mY^mKWN-sgn}hnOpxPZ`NPbRAJX8bNC{Pa*)IP#!$$%;di1~Sc5(zDg|0S0IBssaR!=HhJ+Qw4p74fgh7o3&;$#}-LS?6 z==4lv{&MIbG)x|}sSqST1={TeZ4w0WVT}vexq~qE=b()T5Fb?8gVtLzFfbf|wuwMm zLHPj`ouHQ47O1!|6QsTufv!atWnyRmt#1MC4FMgwE6K#r09w-_%f!$CIw%*kZvr%K z1=Vrb9@ zjeRpQG?+6oFo5<3*n>94Gchy-F)}cK*2II>X1Fs!`lp^u3=Q?5{wxziLklAV188l0 zC#XNm#Lxh`!3wlC9<=W>fQg|2G^i2C#Lxh`Xf=e1q2VT|U&{oUzXYw32kp^{0IkCY zje#>UH1IJofNre<&r^cd8wY{L!a@E8je&#qG=TcIObp<$@FXUNh8dtSaVCa_#Y_wg zDNGCvpxF@6SS=`>fyQV-a}A)eS2>%y5C80wf98gfBn=%Bp-pfPkN$oywB6J&oU zXgxY;eQ^&C_IrZXqwfXv zuR;E0VPIGdG9T2x2E{k1z6Py#XJuem4_e0!s;8M48md?s7&e3a!3rK%ZkWx=z_1N8 zb`82^lZl~WA1edHP9}zi+pG)>yFl>>>UV?I-?K3=>|3$C zvokQfeF-p0^JqB0J?VvwSEJwiv=ARoej$C zsP$WBaeQ$>VlrfbA82j?l>gDNgCGN_&;nIQAnebW44$EY%rS%N0+@P`J)m*}RAhkG ze1XJYGcYuO?0y4UL&ds`hGjmdIQkSL(>@<7`~&r6Esf_TN?u&6$aHH zAoI~Mwu%^31ArEnpw+veu}_qG7gYU#Mid~6P{7BUfj6Cidj0dj^91=xS*gh-kSYw+ za|acW{*0hmN0QYg9UtAKuT$DZe=_~J$M{666%EzF;J~yDF|AD z1`=8hEzrxL1wM!mDX>BPGf))*QU$`Ga06KYT6YYpz(8Wwp!O1IJP^9B#F+&$H{{9! z>7Ti=Ff@SDgF6dk?~pGGWL_bFg`oj-LsB3MLj&kmq!1Q{hJ6eS452Ix4WMOD5iF2> zDv>M<4ObZ$7-Co;`}E^k7#cwCN@Rh|Stdi*m!v`0mt?U(%H?cmJ50@pfkBpmU2s2W zp(^M^E_a{E0FQV#{~%w-ka$0TKUW4726n+*bW0^von= zStn0-QwD_X#d(S4$kO4Ce!-!B?hJBp;}bLTvyfGI`Fl7zF{s1ko%~%Kk>wp-{GD9m zgF_tsTpWX37*yd3U7fHgbd3mb4GKY0=8RRDb7*jgzb`oIAc107l9+>Ot&d}fr(e7w zgE9k;pfM$ow@DkzQzFY1?M z;1MhU9juJ5qL@LJfmhHQzK8+jkd&g#veY8z$&8>xtg8+>D<{M--W8SvLLviP;~j&7 z93vT&7}y0t3YZu$6u^U68LEaEQ;lb^KR8GX!BGw}hy_y-Gzvi3`;aJTxkEs3yo;xE zNW5o=qmQR^yrZAHk1IIA1t^0Ke+@B=5ApYQ^@~Sxr!)h*U@d3?5y*HqPgfroh%C5d zfJriV~D4}U%a!YOT4F_n?Kk+AVo+)2v_9h?-v4&FmNscsX_`% zR8_7KAwiCC!;pd$RTy(_3+98RoLt@fgTUoM zPzZx014NjS0V*8g=;Y%X@8TK6APSXYV(<^~a1DwF%YceG4#9L;22j{}WagC=#|NjD z1ec`d8oQO|B{K*za0tE;2g?RPcRmO)a0ph*Ffcf~xy6G{PD?CFWRPUw5X?k2Bq+5w zwFGPeNb0)`14D>WJk

    )ZAjQ6h8xpU>uSz22lnM!3wC+jun~3&iUY#zaSgW%P=qm z1bf80=j10P<`gr?F>napL=}s7Ni8lZ%C7{QEsW{Pcm{a}4#8_^nn2zKEnfiZl3?Hv z+=r$BBvB0ZVGfd8;~fhMav)YoGhh!vkVXb61`ff?XeRolmV@O$8vh~(jdOk}X#WIQ z5)^JJ$QC;1753J5Mua?8&v2}(_7 z5M$sF{0S9ybAg<101}sB;1K*L$N*~71SJ-iq!z_HWtIe|mc)Zh1RJIg)#aQ4+Pwib zOoV|$@UJKXLr6$`Kz?yaypbu$D3BGH2?XK~CXi!c{s0*baV*FmXCM&(2`t2p7myto zfdUT1M37l9kNX#-=7G#(0D0s##3)!g1p5JE5y&)9D>uY2J^}Qf44|a{4kQe9Fat<8=o%t$t_m*6FG>aZ7nJ>&!1<9&-L_z|kmygI&aIb;_S{oWGuF%CNAP0exo-ouJkPQKe znMGh*KptWe0!MOiL1G>xk(@v_8{%=0!I;q<&j2zQOX7(KXCUnH7tbKez#;etJ!OTY z7DJO3NSa#=oQ8s(GE3rpGV@Y>A&2jR`~q^yc3Dt1ig!r`HBF1+qd-U9f{$7%H{x@6YrCl zmmZRs4h|`hPj5klL5*Ordawj232;Nh79NFQQ%*vZyH=zoJLl(tZmR)@7dW+r#0Mv3 zmViwOsVqokP-5T^`~^wAPNkVSDXB&A!6k`BCGi3InR(EF0TrIO116q9nSnzvLKc$2 zVTL%Sq{M?P&o3?n5tLLoAkpHUSX=;!dw!_LL4}ED zURpjlMEDpu1X&;|{ez7lY3dRrEIjgyG9i%@&!E7-A^08DT99jzJPa!MK@CyRsmhSD zGCrUfWECg|KxqL~U8q6RJ4hUCJt!eCK&*$9K?Y!9P&{D>Gbmz)JKPb5kPriDyaRE* zZ(>D2Q9kI7R&Zd4p#?TZjDgbXdx%zW{|S^(LGA__`4J)xa$<3EQDy;X4-JPPmfRZ; zj-UWEyTC^;LsCaE#GRn}_9rA;f$}mqF@wZV%j0+kP@wTb;|*3AfD`6Rgp0r(Jx~D& zF7h5jC7gXi;=x6ppd7eu0Zn8eAA#Z=sUTqhS^OB1%RuKif@1(Ab_WvS;KQmx`al)! zb%>*(wM-Da4FW2-Z-|3)x_fE~D1M=h8L-ztVTh66!R5|YNa+A|9XN2nUIE#48O1zT z&^BGLX`s|Cj+BzXCG%d0zrm$YFsQWw_J%40hu|HkQdkKD+LH;6;dtl7oSdY@E7Vhv2m+f6 ziU5?<01g;7Nbv3`i$YTZ zas{}205v>X&;kW1szAljEvPi4K^&Y~;+vlW$&#R={wXAbz_Ku?v}e#{;1EoO=t537 z?x`iV(KyCn+tQaj1aD}}S#b9s}>4l~SP`U*tZcw#{Q7%Jb`XwYw1r&oKD;`vq zf;x$y#E(?6gR__&M5RY!aYlA(C8Vxsfn;fL>j`cXMuiBm=?cWB&~y&#F@d6(4=qW9 zO#(^OK%)aC)IbFsYMKRCMBPZ928RL*v>pTH2~hh3+_t=mlH6SLQotb%4q{MV@J9F% zd@L9!=CHKv!1?Mricz3z77%8EN|VD7d2k5^&ggR?0RUDNA5fH9kXQssAE4;L$Q_UX zc7YaEun-0pw&-mOctVD@N(iwb(lFq^HdXS$$ zCCh0@$pR@uz$Sr0AP_Y!!Q!BNiYt#p0vxR(fiy+&H8df?f?9ck%cpyg_y>1R3yM-p zQX!#r8zPKoIDpf}KZx(3)fc>70%=L>L4p#Lox#U8fuaK(8K4ykpos%W7=m-@Q;1rh z%wk9l07}&lAh{Hr5U<%)RMZ$a1n)yL5G=E~6{V&^t2%hY1=REOgy;mj z1~Mc7b`PjQo(_>hF3do3pb|8m0c1xkrUF=L2fEGyq!?UO8;XGYo#3njs?5M`PS3oQ zR7kZ2a)uisdgFb-cej9bgVF=&1ZlUBcu?0j-mxgX7}DkRMA85{dmNVgK;=GYtQw^! z0V*&+K?N#oP=gfQf&ll^4C7(_XmB?TWHV@WX+W@JX$5=$2P6tQquMPb9(=D1q$UNW zPt5U_cyOa*jsV#2PEPq1;JO_&(Ft-}W>soD^f*qiPeD#Y>U6rmj!1?(CKHO z3<)`74LleJn#phriHC?l8n~c%0aB8g-E3U@IhSz?maBCm)i} zLFR$Zrf~~_?4<>TFZNa;*iSgh8*s&mR$M@8??`n9@YElwt)SFB72+IlYaCR{#e;he z)euog1p=-nRzuSbI2(i08mQBSJ$N8-4w{O03yF8CECFpr;}Cog$r+HjN>CtzvJsZh zU;y1?o|>0hlnEI@?S}{jK`x;Jn~sqdL5UEW9^q*b6g=2#JxGms7iun~!3pn< zfa0VCA_W;>1cx=Kv;Zvy0Hsc7egKVc;O)0S{13{~pxLd=;8GB&Ihf>%ADV){6$94Nd%$xlj+4=zao4F-cY zeSrLgsA5cv;z5xG8t(%w3It{9ON!v~9ai-Or6$82`2vzZAVm#W6x5UhEkA&FS|KY6 zAO-n3NC<#@gIWiGJUkI1=?gxF9BdY-Km~=dTSz?QnlW%~Wh@L1Wl*987anII`oQ4? z)&?>RwDlg5@IYY#YAt{!n?Yd>9lir=0af;3ZJ==vv;iSVsxO0B0F74X#N-U{xH>3f zqgH*8!Q>SX{lAjB{pJTe8Y>p{bVXgk`D7*)B^FhJg+cxUtqcOC1(02!gb7;Q0}CX`dB0#Nz~ z2}MBs2dYCrLZITl2r2}g7=nzngZ&FCn%+a?Kxxb`KLwQNArXhttpuHU57&V?v<4Y+ zdyZ0!f+G}EP#7T+EMjmARCs|F{DNW{oa#VPJpAU7JH!}T#6u$!Vn!Rp zEfBTP00B7zw8{x|b$t=&0y?lWEFdaDNdsKEgX0TSy*WaXBB24IC4RW4Ro%n8))VgJY@G<6we&qm5&{)&kTz{9q-F&b!!pp41UiunuJ21AZE9$#4Qeoe zl03*^=OA{1yaaLvsNC;?1P~}3AT={65rUR1!ipDg6Bc_#0BItF)=_{86j0)XR-TY% zDN>wM9b_bEa{{Ocv4bcCWubV-l9I&a3~)*Zl|#QEDFV{Whomk@qO*g9 z7;MA<9!u&B9D)fD^N?!Scu@L*L~CM6BG`0L;tGXkUQk4Wg8`HXQAR@`!{&I#GQidO zJ4ojh)XxU>TtUeh&A|A>M!{HgMsH-l_wae2tJW zf_5|F-7@nMb26(^i@-SpM>82*KZ-ysfMz$4t3l-kXw4EV8TjNUCzgQMl7KQZ=nUO} z;CPrf!Irx~;sI7=qK-*{PD4dhz+jJ}_K6@(D$t5VP_qYG7DIgh7UC;tO9NbUgYHNJ zr5k7?5!#9eJL4}>eFgH5Uup#;y@48+UTAJaQ2>e$(6OhW>H)Iw6_g0{5$1uy1ytvP z4%bKPyn{n=HKe-;Z{tInrYn&}!6g?cSA&DV4^sYt2G7AM0+dt?AW;EIh=}?Y%w}f(i@mVh`R@&2VHIhlE>kfjHT5a%H0 zPH>qCI#(7P9-ySQ5uzv<+V=wYkqKx7mql2z95_%wOGrUUCnLWIQfOf*Simj@`3Wg4 zf(->-S_9IIH0lNxe+zXaNE|vr!vM-bFCpUK@&-2b2Pw5aLS#Tu0~^1Cdl|J=2&r+4 zAV~$OssyL@uaIDcMjUuyTq&rU21mCk)Q+6|5=2r0H7Tr7vOzpzni!PMKx1m4aniK3 z;#5e33K|l~ZjA@WGN|N4PxRoh1Kptl>X2j>mw;NOVAp6sTmw#g@CGR;hEa1EB-3DR z89+LyI0oJzWAg4OJ}Zs~WpMD&61b!X6#)#$wO&SIQCMOTLIEguV;14@;K~kkdK{=U z%+G@?yucFY@!;MTwCNAJ-5betaIYA}FT}Yfm1F|Hw zC@(PwT=@h-D>0<5KB$cZ+WrA520$9XroA>;|p>TvC%t(>?O@v%#e;xblNGbfM0Lmonh?Eo#vO4slS?6`z?8+9?VOaZm;T zMSW&!P716d1cx|Ay$PwYP}RfB>WJB%8gDymx#O|HrxX`;AUb$i5{3#+O@pOy_aLg zB*4HR4L%=BH!gGT$9*^EpE+}$_xzCw0pPp-7z7wqoNr6sIokS|;~Ve#_p&}d;4@zs z1Q?lP`##kLsIl{v1-ue27g@l-0NO7oz&NQj_{T2Eo(Trq;umsf+g@T|h+tx15McbX z@1&eM0xXRxt%d`RPT8xeB1QRmBP#6&7ZiF`x_K^UI4BvNKDH zV+;*qGV_viN>fr}3=Q-Q^b8G*Obql4VoH;XN@5_pZ}l=5C^jiMzbG}is3bl&H8;7S zGQOCaW|qU9nQ9f21e%+TNh?ZC1>FK`6jNN390OvR7{!#B7=h22(@Un@KgA^}nfX-q z1eHw$J25^vKQApaofp6=PQiOOvpOi~)DO^AdAn z(n^vObCUHk7{GTQgSI-dG584nmt~x+IbCPae?k%WdM~++zg=8uRts= z(Ah%_AX#n(MkWR@i;KY#%Hjs?9EOU4&ai~2107-tVsSBSf~(sGWpOcp&Z7d!ax;KV z@dB~97&zD&7(n+$a5L~gSzHXD{h$!B4REnD91IMgdltAEE~0z5*R@GK_|6< zWVsjwxEL6C!D1p%78k=7D2tn62b9IdV8adCB?!{%0A+D8ynwQ}8QwryTnq&~3=I5W z^GcvBE(Q@^n3x2V#l4N_yc8eGcbrlWVsk(#6kNaL2gcfvbY#7Kv~=jSD-8|1_KGm z`J>znCQud^Ll2b2%`gGV;$nCs!N35z&xD)d1C+(ZkRk~a%Yd@D7>-Cn&cNViI00pG zF<3~!#B87}E`}LW;B#LYxEba^SzHVkr5G4MV@KQ!SD`E}h8Ss>x&$bTi=hO{;%2CT zvbY%b$S^Q~&d1|sH~?jFG04lp#FU{dE(QxIi<`j)%Hm>JAV0 zEd$5L6IliZ5Q~eUR}Q9bB9z6&uno%MX4nN~aWOoAvbY(ZKv`T2!tyY^;!qYBgAJ6$ z&ENoKaWN!AS=FD2tonHI&80@EywHX7~+daWSwfz}(CYWpOcxLs{Gm(ohx`gF2MO&7cisaWR-f zS=5G`iy;8Y;${ee zvbY#Bv_TsvLFGXXl*PrMt^*U(hO)RAu0vVe47Z^yE(Ug8m^yAKi;KY&%Hn3QgtE98 z;-D;Uh9oG9iy;rn;$|p!2)d zhD}fw7sEa%i<{vPl*Pqx4$9(YxCCW!G2DZ)xEUTnSzHY7pe$~NPf!*Y!#^mCn}JCW z;&UzrJ}8TuK?us?VvvKfxEYk7EG`BMD2toH2Fl`MXfR}803Ddh&Cmj6aWU*SWMBZD zTF1?B7|P;e;5CM+6NIw37;K;{ZUzS^i;JNG%Hn3IfwH(5I-o3Wh8`%3i(v+o#mz7W z%Hm>J0cCMBtbww)71C87Pa3;Rck&&2R_G;$nCKWpOjSfwH(5 zen45=41b_3E(Q)0nBRDyEG`BKD2tmx2Fl`M(15bI8FZj5E(QxIi<`j)%Hm@1fU>w5 ze4s2Yh6pH&n;{0u;$p~vvbY&?pe!zi3Mh-4p$5w0V(5UfxEXq&EG~u_P!>1C94L#6 zVFi@M&9DZ_;$qkVWpOj?fwH(5PC!}Q3}>J$E`}RW7B|BkD2t2X1(e0j@CM4_0$qXt zO)o5_kWk}d_+iPwpbxH({yjo8b+V#l;|M15+mnWpOe1L0Q}kK~NSKLn)NS%}@ztaWS+)S=4N&~Su_=|EXr;DancXA5yNv^X*_fLL4%yBxvi$un>> z?1Qqn7}A^|vfK<=P!<7o52Rk;$nz*V_*OcEpam>Ls?u5jc$

    6F@8j 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�E`vOJ8zKzuZGhW4;1b{?vgQ5-sd-?# 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%0Dw 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⊀_C41<6o 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%0AreKI=@~E? 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�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
    ;$o% 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ℑ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

    )sFJqU3UeB10;IgkeF{1o0CXT_ z-1AbVwW(|KU?ss@SV@rkB9Uor-P%sXR8cx?mPkF5Y3+=)t1xDX)Znv3?MUGuj+hcM zFJM}GaqSJr1WeV_BBr(X*FFVL3H3pyguX*3g391^fkJr+(>m65+Mx9)>v-2eu765x zP$?*2S|_tk8DdlmbUn%p@OqT+XJ1}`4+m*rSewDV&S$;RdfWBh8$>oJZaA9Awk~R2 z>bm@ORqHv|D|t(&(F zc3JqJM8sCaKXK1MB^XrkpM=*BKYvPOT6cQg6_`*GlH&N(7S&1X-mLq)?)Q3@C!ov2 zR42ayb=VqICxWuY*W3oxNuXV*X3tBR)(fncghkahSX7z4`TXMPo2T$a=93Y{j_BhT zNYf6UsVwV5*H2r&VEx9Yc`WM_)@QCSU*8UO6q^Z37Tt!HMYn_8g1G&B2mB=2#~+{O zG%BoGzXF;Y6;^#qY-8Q9{?Pi1>+i3BvHtr8c0;E1C)S_cXxhNK0fdd1)?Z(L+o*wc zLuv!-2B4MuMt!j7wXo7c?xa)Zr={tYuym^L_V zXaQY^p3(H%bA#W8aHw^^J&Tz(#BL~j@$wz$fXClD8!})rI#40q4b?Cq-S_aoJqQ(J zeOb)3Vcv#KFaxwU!1w=ZK@HH}um`I6w>EgOa#JS9hPxX%H;Qc3-RQkBcw@pQ?&oh4 zo0$)9c)8*2hOdSV%!fd6kki0?=*`!655GJ`>4SViw1vVE#nbkU$af*ty!l$lw9#}U zeC73CP#pzz1?%3oFG1IgDcQVxg7DCx_r+`*^EXb~xM}0LjdwQwNo3ksy0HaZiop9O zC7^~Td>ymM<4mTFGdC_p8vdH?;X zk2bzX?iH~iFOsfB9r>-P=w&e5q`Apxlg*~6O^KVTHcj2MebeDh=Qh3H^nEiEEFq`C zGc)w`kVci%P41Y5VLzlW%z0kQv?*f~{QQeIuzZ#CB9UoRt7N9lVw>flV+#3SKY<1Sem;2$zY7NL`=13&n;kYo&;MS`Jl7o8T2@?xD1!!x-aPyX?%i2{Mq|DpinhiQ3aV7@Eqk^c-*R=!yDk5>N^aHI>bW&#>zu8t5$z`HWTq`=w_HqaFg}vo zU_2K#==Av0`_G?WJpA(b#j}@havD@uz5rd{4q9*rIs`GNL3K$s(^l54oaqh5{ke_C z^S1Ioe)!?#mxnnG#^-XFw#si+&TBBf_&&YC_);#*R->(ETdlX+r#Be)z07GazM9)$ zJO?~-_B5rzc;Wj`(B%tn&~04?+Duc#v^8&QE2zBq@*X@e2I>NTfjDb9m<<&NDS-&D z0QG@E*G@vXOF;qi^!v*%FF;(i}owtj~v z)$Ne1XpZPdZGV@}v5jk+#5T2UCfl611#XMqmh<=}Qjz0{GP2MLDpsDu1}++2qZB?y zD1}Zc%6SFO$io_LsO60XY!>I+rxK=Z-P;yD1zo6>-pH_c8}jjS4?n$soyxRr^|n3e z$SKV$4UsJVnyCG86sr~v6Rw@R)eG6Kckk_CjnAf0Y z0~r}?Qfl6wygd(Lb2r@PcKH0rouBW&et(E`6k$!t1cs9B+jkt;adl_P&Ys#xjOxy2m ze+n8tZ%_hlk}GLYf-dJ(d0xu2{nrj=SW9OKtVCAHVA&zILw<+u4sV#Z%t1Bg8z}GJ zp-iS7#ygx)=D`0QhRuP;qqbp=y!`z0{Z}M^)gnru{W~gF*YF3ZNGflTD@5uaGA5@m?abO)0$qmKAUFMe3DeH%oh`8LVm4G$ zZYt-_1v^*o+`sGOu1C9-cBk&n+C2|Zm^)#)IAd)F`_A(_Z|r=wi*J|CuFzfEVII*! ziMVMm9=^zA+WCIxKa{xpvj}auGEXMcE|FczD2o0~hedE2WWn?R=hsAW)|6DHUCp~DAn&W20a{nRYsRkSs5UG?vw;s|T{Zlo z`9_0dyRIRnuI3!3T`zY1e){3X`**30ii*2FLrP9HzL%e0Br@%0*)9D1>67B}^4kK+V7>7fY2ohHZ!e3Ob}!q#9ws{*R6D>q z8Em^x?Md2mXK%tj=KVH_th=x6ez5!b9)>-#@Pc3|r07?DUdpul-ER2(e@kI`UNwhl z58EF2{eK21@v{bWlE>>84@;Q$=|K@y3W!kfG&#tFG zUVi>k+@Qq#474mx$>d976Z4Ker}msPY+$~K(xktb$+YLuUW=z+zhtoNdB0a^ui{>< zM5aAo_p*Q^65jrB8O(bZ z?A@{VP$JXbWqUWgfDOlqgQ6s}fluH)Z1sr*d>x7ycqtCk-fMf2dZkUD!6!e0u3l%_ z`(f`-SlH))s;HNsI~8+2Jx!g!V7yOrpV2;>eNp=o_hs*E**AaR!F^}g7*ZPky_Wnm`i5AAvy=f1x))s?)w3WpR%V#O#A-tX9af- zx*(kca6{_L(@({X4Ey#=K79+mZROiNXeKU#cNrKqLsEJ$e0S`WO!oa@`xEzHIbe3c z=|J&;7DNjoF`H?B`u=)&3*zAZVx+>U@#)tRmi^uP*X`fC|5zf^{)zh+fCCktHVaTv zodBw25-e?+qo`tf^CY#E>CXNq``;g6IKXp216032#up8enf8C({|mJ0lo@=ME%TH2 zpnC?v&HaRYrUOC;WIlk7>ja%}U<1116xtOqfwe`!D(&7rg|>-1BEIzoj-X?*06- zqJgm$bnGqTiuc70%q`%wl-gjd4muVcx^bTW)0g)zKR*QxC%u7PZF{i!;6l*US(Aat z!M=mjKrQ>6hJUfp(9UW2X9+4{OPUNs53W796)GKvkhb~)TX!bUjAuo#l|~A+1CDhfJR2HK^`+lh&YmaMQ^4XT@pTbPy|ay^uD=-Q#j51(W< zu|7NGe<&GNwYeRNf~JJuZcqm6vs9)-MTcq;EgH8^sco!V5A_|Ib7-3*62H5IYq>c6J}00<&`g%uWUH^j!l}dnxnbwTE{c zzKBTZDTsuAHAAW{Vos3X@`0!^W)%oR2M_7;Kr7|7iK4SgmTPpJr z(Iaw4U`PF`WEU_UQ8}UwDKhJ!RoY}|fmr?SOC|FW*CT#MBEiK{YJ*Dgi-*vXJJ_Xw z=}7#MG>F!AsMgu}eGEoN`i@LLvhc|MBcG4*992K+c{KEB#?j)VQ;yC#x&;=pN$@a& zo+I3-l6Yhd<{(pd3e%CJM^1z1=rZ1yFdeycBz66 z@cz#WSa4^&NMt%Hd{hom4<$i;W1y7DbX51KJw`pG2(O2lkjg3{%zEf6q8>6TU^-fP zv;h(_rB92PjnT{?xx(c*GA+>>VH!K-5Z2FSHbaeO81EAd- zK`%c&DQ-{hL@PcX%oq8Gavw?Y}OEZ_RQ}VLg_7EbmzBvF>BnL8q@kQhMN{9HwKX$7&(&U@U~L z&JhL2A1Abf)XMPZ*!*M5kF7s;?ASS|${V06th_<4IGO3#)?<4h&bbA*?jyt?#yil( zJdD@io4cN-GaY+=>>XtD*3VL=V_%N_g=Mr(Sj=-~FdyeTE^#~!K1Jo0&vabwxCVUp z)^pJAtqsS`kJ}&jIv#X94&pAkmx$e4P&dfE2CZa)?pb>aS$8A%9%=VhBV*z5GDI2p z8Jws=_mqRT-!X}2GasLMeB<#w@D{_e<4cipY%xM>C3Ms`CYR~>spJ0>nT}sL{t>i$ zs);fC`0eA*5Gvn8r#Fim5)=ygPlHHPLfoe((T{^aQ=@P?BXhWHc8Cp1r(o^W^q zx*$*-DSg``GLtc6lZt;P(+S@bLGSY#l(ax6N`Qu07(knOo@O^N78kIdC^%7mqW(nR ziGz@2zX7^Hq2a^RPe`NXN5D5%HZvbRG3Ug_6FXt9Ze%`vVkLAp*aqmL?Jg+)?3ag+ zvzbnuI&l@0L?EpkS#aHarHJXo!xL{GB35SQ&UgPh3>$(`u@$s+{WMDr2;^CB0}-Ur-yG7nNROLefTtD|JPYaEchbg z?(FA>pPnZ&pMH4y^=ZVp(ajKb%m{VJeW$Q|<}-q4WX>cZ+SL^=A3sfDI-`2V^Ck2M z|2(EM#%Jsh`C}f!Y5x#Y@Uzc^A!QXLHNQaJl)MI&jU`NHs?RimcGNY<)j}INJ*7-% zCY+g#FnkKa@Gs^44CQA|oZWbK_t{Hlf1R^E=XycoLg0ni3o9;cxUl`gp$n%IInLZV z^YF~;GvCh2oV7XYaW)6E#HT^78P=6Dj6@jSpUrgU&sh<85&Qlu2a=2DK+Dw#NK@*p z+F3({);@%*-hDw_u@PRzbk^@|803ad1DT&+-$4sf&@y3g>S*|9QqFv~Ka6cOQeQ$UVcgCI2Uy;`P}yNg6C7uPdb0>{6F{x&}61_ndfT3 zQ)-Q>r_U9GYrM~(qu1YmdiV4btSfY`?;PmZvyw&wzH`$NHHC*P&P$wkdiDjb;k^2Jb2JTy5gHD@`vTq$1^37Ku=BB?E?t9x7})6z z2I3$Z$-MIO?P%uhM3}d|nECvy^E=KT$Ynae;QX40Z{9#7Ty^zJ(2;}BK-Wd6S%JDg zsSTi7Un9q~x*gz$Wp3+We%E_7d*i_ka;mVp`# zK3%9s%64gajS4F-OhnTE?E6F5aUkl@qGQu1P#rEe13nnTv>mqMv-jt_yavYo6`c$f z7oK1Ebm8wswu_1v^)4D+w7ckrD1&Vg>o*_=j-@uJJWpY|$a7H)o@aXBe}QF}ZsbGO zb2A&5_aQkj0_v*G2}ROFSbWLrQsSk~E9qDAuQXgaaOKR^lUF}p{dGvo|iIR zJaF+OtkPW%t911dLEVzgbn)@U-_ST}G5|kX zRfIXsh$wq}$q31a9HjOW=o0v3rc1$>B0$B_3s`Yfp2Bn~{Zb(;Xc_*$FJZb=aj6j& zzWvbR=xZwbrJ0u(US4&1&*eK;G_FKva9mn_Y0IT+m!4eKy=;5A;&KC*m7CtzZikPFG*D7U8m`-CW1SuTCQ%y60SvK&mG8nV8BU8oiRziyO@|6dQ9^yjy! zOqX3Q2O>{kd;v{hT#me)fjWV47i|I~0%HPW%9j_Po`RY$pFtt=9p=D`u);PhuaRNt zNi~=a)~vzDsAmVtU2yiXY6%#t#os*1tC+Pxm%`c?oZ;&4ShxpFvHV zM#e2yDnJ=BwL$KCChL`+E7Pwmy0ZGpW<=AY6wxjZhgp{N?&rgI=?!Z7$is!m-R{VI z_A7U;DqYpRYJN5LYWLMCDb1`muROc*>nbyBSjzGWY~{pnOISGE{P{kG=_>bC5tzWI z4-daQgzbs=Esw|t9WP;S>C9%jYI`*lp0i$D^+d`R)1Wyk8j_i=re7^W7}Ac&OwX?( zmw$O*pnID>S2A6lb#;Ft)71r6SHUxUM>f;d4Oe$Sjc$hwK`Xt4O#|>2FkL-=^%|sm zwdMWur_Vn(kT@!^g$$mnc zWPPQq*EFx0T(i5Dat-M$g*JFF^kg$#bGa4+4~A#g0+51XD%7nB#mv`ou1&hO`_apE zrfVhF>JgEf{qp^nm(N~4eS#3mee?3mmp7?Q*XCYZfe=l{RG10wuw6TH?K~oITM>c# z^cwQ`Z|=`jrfcu7{eVSaH@p$k^)r#_I_Gs^c!_%-Qq;y*^)Xakx4PkU!}mtTjmbB+ z-BP;cb1ULj%B_Z59k*uOTA0XnJ>Yuu^`z^W*GsM+y8ht$>l^$xq!DR24P0_FRzZx5 zMs!1?Ggz+IU2nfW_4?+A&;z(p*Owp5WV$~4`YMzX*P99@F)c*WtS( zjZjLo4X^-dFxd9-X&Te@&o>yKKYa2Ywil3f>c@v)9=?Mm{VAV5!skI}{Ct_$#Cq+9 z>J3X+_A$F*09Et(8!0!y_dmacRtRzvzkbST zV44U%A-m>A(~WLuO~6t^W9#G5%c%WgK_?105Z0z4%= zgG620^HQdp+Bf0npFM+BwP{G}nb;EG8|xJskP2x5#K0fusxHU~-v@ZcQz(FBb0uSVXGzIQ2i4Dx#GMH}exp^EB^1`VsH!t42 zbMwtjq<&-;X!i`#V8kIrP@1JM-TZq?05d43V+7^hOy*l!w@hz2Ac8ak5u`iby@%h~ zx(;dTW-3w;MCCKx%DPpG&>x4;zYp4i+6p@q5jy=a0X&kD+Q7K2l91_?8iAafWXfQ^BHfro*CL6m`kL56{WL79PpL5+cd z!IXi4!J2`A!2_aNl{{adQN3QMtn|YaY=k}Nn%NAF|v3u$RRTr z7#K7_3@DC33_de32!mM` zpBWg$!7PW*3}Cg43?82u7$m`B0iPKdq`<6*&kPLGU{=Cs1_nMbE8{Z*13#Em@R@-@ z0nDoS42g3_h7+F|7~H^OH$F2kxPn^O7g%$d)tJ-U5V0*Q2{eO{vYt@bWsV|!3auu*#{UwCJOLxV`1!cQDFfo5%6d} zzywkwaNI=&6mAUNE-EaYE-F0TE-E~hE-D=Sz1tZWK%zX|J}Ml{C%O+_{L$&6BGK)l zB60D7#|*HM9?T~^x(|ZPQGnUS0FqDu*>&&%$4-a?PBMCQho~sXh3=FLYNq7DqGssT@5I?<)V`N}> z84k4+UsQmD2W%9~7DGsUK%z_lW+g&h^MiUz7L^j#mp>R77+$LX|Noz`22eC(ngp|v z4`Ki;1weRE`(J}1nC1TokO>e8n6l;?6&8lNd`x4J!UP=8&@kzAQPJ^81`+7dZGd8i z0Vu6NJPC&mnQ%I|2ID1(R{=q{xB$moH=s_o^=vHSqGHck+Mz! zitz>f`&by8f0XjKax*e8z@)&D4VB8{Z~Xwue2}zy036v+sZ9RXs|*Yb$6Zt)nX%hN zrNE>405iyi8pmB!6hOt}Yw>Ou6$NmRDS(1Z1DgFbnrl=P80r$iV*J|}I$Tr?__w*J z7&N~y=yXvrX|7Q*;VROA3OT}r*owH0yQr9e%7fS3-5_-bxL|SuMNF>+yIoXN4nAOE zc2P0ubWu@x-3Yd)R3Bo`K2W0O1gUx115J+_{QDT1f9RF+f<*auy^w!dgcKCulm_*0 zDSzt~h<|OsITY+)NXl?H?xJD=s^!4mwE%n90%WBF)VmJNH7XWR?>a!d>jCnc2gJKR z%{3}MQ15y)zW{j`EClhc58S&x&0z0>|G0{da!pL_~G8Qc{vwU z*mb+8fCORQwE=s#87fl%injod<1Q+os*d3`FUb7?Q1=IbIbZ`z)M0FpIT9dF0l2&^ z1D8VqAY&q4Grc|lDv=`?N`*m1K>(qBa0I!oUMs!drk`z~Rx&qSDR4zw3iMxOV7vQQ?4dMY>&7L@ZrY1WL_7 z%0Ld`=;pNKDB}cYf!7|dWl+S6Id}XAWjBM@EXD_3YrWQh>4#|$e=Q0Vf~jSB%>>Su z3K*X9>GV-i07aJsN=0V?@))RKH|~Yq5>+wV9ENpi%JYA6&`m{Nr2KRP&xxj=RoNKC|v@jE1+}@ zi1z4iQITL|U^wmoDqtC4T#w@p;P~opQBh!IU}!$T<p<~?AVfxl%P0|SFkua8QE zPj8C~s1e+a&A?aM@n}B40rM%yX$GJ)S|aYzJq7GaBu{{3UjF&_|Nn7_XF*}|8Y4iO_kcam zRU82gs^*%O2*y&7bs(FesS;#7*gY(bolH=LAgjP)EiIt1=yb&D#@Bryqrg!Iilgox zutz<#!R^0;KbSjPR8BB3Ff{K0Qw*h12;~6^AS*y=79L1obD-(S_(1D{(u<(VkfBuG z2h!Z#)xyZYuyZj30|QtKFNg)I17A*LU|=x51daWjpbYi>qb0=Z;y{mH7f?EMQPDtH z4oXihDhe*$Jz$5qK(*penV|X?6wKWalYJl!7{?u;vHf1w4QKL;qb6zQQ>a~#W1|wN5r1T#UBtYEa1kx0I0GN==M?Zu;hTW z$pk}jYny9SB%s|JiEam$*Rc8pvy4VAC7a)1uU4S_Cy)!e8Nj^+7Fb^g4XfSn2H%m{!S_cHGP|NqT4 zDhwq|uicKjsDNrAaBmOfdQdN|*Z@@PgKBpNk8TWiIj}(63kX+$dw(GHES;db3r7tI zuKF5lR0Nn985oKg~5j%GM2-_aF3mVK?E%8#=*bphkY8Llw)Gx+Qe1><{NPrFzPTd zNCb%#Fe)-J@Ck7hNV+mJ$S^7}h=Q9S3=E)Rkx_|>fiH*)q9=&EfRUAvfwh2v0ZxO= zHsUS-jZ1;Xbs*zEmJkZ$T!uZM8Uf5=U^ob+LDX6h0mb095R{EPyd?;#fuZ95NNh8x z7>F_g5l{>o(}6OEFf0bzmcbOP%InGYJ{VrBrT zhOj^`_5{mJEU0A(8Z%>N07Wc>1!`Ref@MMNOVDT>GXtoF31NZ8VS>T3u+Rk2 zdf;&~5DSL&!6K>0ZgyVNw(eia_Wh^+R}tRLERXMBT#+xeCADcrLP^K&NG}F~iD@xc zSD%>{Z4+wTa&D0)i~H40%NH-X^>znObjJG7g0Bl3xvO9_%yft3{M-V)%oLk+7RLYo zK{4l$mYP_iXJ9aak)Z)1qL)&Xnp{$r3ep2gAk2)QumSN9ST7|tsWe>$z8Gf~wPr6iUlLWDr2J~QKlFANNV3=9l0t5<-c6Cwpp zb08*24ah!7%z@$vAp$BNF7QFdav^F!>Fa?2vIr>VKL{g>fXw(HiYx*u7Cwl>MD$8h zD@s&y^FX$Px+2VsDf|o!atsU%`}geq1rmkeb_NCp2WAEaRt5#IZy6XsjSx^u1-TI9 ze+GsP3=9k#K0!=|h#X~LVBq+SEbVF4eq zh$$lj!vho%Uq%K7(C9G2J@JeT450B{h=?8{Di}Z`Ak2(j5U(+;H;*faFja!xjZ7^p z!36|Z4OqB3jd zg@FN73L?~eXJG)>P6#!ktPBjGQVF5Ph!vs>p(coxfdNzpA=DJILRxDGHK0Bws3wA_ z0q05!BNI@)3(1vwMJ359p1x6_nB)YfACO8=`T>bBKvO&e!wOKb$H2eJ_+6#~)4 zg-6#us4lP?uz^>gA|MVEgI;n*cCi_#PKUJEm>EH}Fh~x8pRqD9KpS82kfv9Ba!z7# zF+&=7vM(;E|gXhpO})LlnON#G_S}|P#j;HmzkWOk{Vx@m{XbxvL1Qz5h@9G7P2_p8R&xX z`DtmzsU^ioCKtzN=4F@@sBtZhTQ{ zVopweGK>pqAcNRYt&sWGoc#Rk(gKh$$bdwoV1)Pr)b>a$N(BXGJh=H?P#m9}k(!(x zj~+lEPhiSG!lvfoC@IuXOxztDw45$L1dJM!u zV6Zx*t^!C#w2Fb@+2ZjI# zsSss85KGr<0YEkEfHfZ-|Q$c>4Jx0|P@91E>|o z2TwP!gX5eG6 zNoR!9zM08I`NjEZB?=lrnhO2}C7HRIRhfC|3eNet1(`XipcO|TH-LIAHVkfHH-H_^ zz`$V60BVmzRzZCMkA#C|3W_u0({u8Z5_5{<(@OJ_A;lbn41*A8zz(bgjc^cT5MmG% z1WE6cVPNoQ1Z!hpV(=FP^#Va-955XqJ3(wvRohUOy1IQU-%nS{n z5jSyWh6d0IEeU3Z29O`_gI8;z`azNrGKwe6$iVO!q#0y5sQHEPLvdh=D6sSea z%+PR?fq{XGnW5nYXk{ETL&J9l1_oYch6YeL@rt#~0@%7Q`2qq~?M{8{|W%5@ZURU_fzE3-&))FM}w9pde`I0pwACMvx)# zCHVzlVNk>%2`A;3Fo-b-3W8#$9&AElPG)*uZfaf$I4OcG+W;0XNleN~1&e{o15ohz zGbZPk=9MrALX+$^u)3=JJcu&T3^*jJAkhc11~euBu{|$8zBnU4zoZxvUEuiQ0F^8t z8yOfFK;Z*of<{{YfEb`vd(ikYU}9(hrGFzPh6d0|GgBsp22dh0V`69kb!W_(7#h+U z7#J*>7#ey&X`P9oVF9S@U}9+4%)r24%f!&Im4Si5o{6F190LP`BNIczGX@3*XC_Ge zxiB#_uro3+xG^y_fW}%pm>3%P7#SG6nHU;m85tOSm>3$=85tOSnHU;u85tP-nHU<9 z7#SD>nHU;M7#SFXm>3#BQv$(E3=N%(3=E-63=K;d85qKu7#j9~Di|h)hO>+e3{gxB z4R;wC7-Ei`kn}XtaP%(#8 z#1Kv~i^1^)*2W+VO))nFK)EP4H8;Pg5*#z2d<05L5Nn`4Tt-N58I*TG;wH=t4Inp} zLdzL5W`+ik`^=%~ADcfq86cx*phYV}Sp1O!N=Bff5|p+c2uzT0@JcX;A-x$_-hB|4Iy@@dPf}A)P*uFF|ewIROnreF+MK*WlO!YXe6N z0|PkEfC@yICXk&VKY@DcphgNvyo?3nr*amC29Pn8EDQ~xK&xVbANNB2xDV>b z{ZKz1fco(u)Q?%01S2B@KLabweDIJSxKN(J$iM(e#jtz~t}bUVGB7LxXUP20lAO%ERIum* zMg|7dsufhSu3%(ffRwDD3=JACft13a#UZ8OUC#AMJfYmHc(J7f{}p%Qs#pj3MpXypyn^U zc8;$Ed%^>*5Y`d^HGDt|S`aEL7$g`31q0wJ^K(+-VX8spRSaAvEwiK~H3h6Z1TF|t zj@+Q|fy*F^CVAfg84OhRf#MAslMJA=09qgeD)(}ru`R{H&;VKi zEyKak5X8X1pvu9}0Lm+B91IPh(KkyDhK3~!3=CEr3=N?cOp#ik$(uo6F z=WsAI@GvqkxNlQZj)CeJ4u*znpgIO*KB$i2U}#WcVql2pU}!L8Vqi$%U}$h)Vqi$( zU}&fTjYe}YH0)qvV94NLXn4iMz>vkk&>+gpz>v$q(4fi8z)--!&|t>Qz);M=&``|G zz);D-(9q7zz);1(&@hpifuWj%pW~#rG5bE1^M9;0|Ucl zEPentx8mWoAjqL0E6_018z6_-fV~0MhPyV0)ES_8Oqf9+cYrWxoE9|O4-$8T`ooEV zp}`Z>E@EJ40L|gMFfcSEF@V?pH*_$7SNVg}v2nZ{Oyp1il_((ZfUH1ntAg6EhzLfCUr?6= zqydCM?gNDjNHJ*k7$g?R0I5rZ7#JErsU(&1X0IF{z7$EJ=NCt)m&@5sU z1Ee1j4Gjm-?7uZyIP@_>c5`$vGB8}l84g9M$@xVo-~1Eeg?WMF70 zV_;y&WngG%Wnf^)V_<0L0(F)c7#cusEoES6Sk1t|P{zQ}0NTz`#lX-2S`Jvvz|ioN zfq|ixfuRA^hp1;@Xy9jLU}$83wBwr?7#ct`r!5SSGPj+9p}~lefuVzep#fAcbTKeA zfa0YaDgGSL;_nb>(1U@2VGjcX!!?knAbtY%{WCK2O5(v8G9D6t@wth`*zgfJ9_YW^QH)11MpD$}Nbp zvcw#)2qL;cNd-3U0BR3Hyv4u(@-Ha1_p-73=9p93=9m@85kNs zd1odALqiq=1H)`+e9nc&-#i9}hDi(z3=0_;8Wu4yFf3wVXaLQTFM*aPOBom%K;gO! z8vaYM^rMBC85lrzaxyb8T*n#y;K>zGI~&<6FfW0Iy#z5EW}r|5wce4l6G#j+uOAAJ ziDCwE20=kk@6r)229D=q1}O$XLC|mkL;{?DQj4H+pr`|R6{Vj7G93{EU=83J3DiG< z#1m!%tdW6%0ow8e^}|6;`Eam9ic%9H%`Z^Ofn?Y6qRf(1aQg;1$AfAE9>{Dj$OI4< zlF-0u2b7PIRfGD~-4NBFBn0X*K#~P&|Rs4XA$w%8MZJ4bb$m zg@K{LnSp^}I|D-lXa&t~XujObz|f$=$iT24nlBG9Ff@S1NDneFG$b;D(_#Z??ZIIN zh6Yd=9A{u?n8?V$Z~~N`7#SE&GcYt3vtF)%cMX8Lb4Ff`aRF)-W(l?O}=4EGoq8cLWL7#=Y&G;}jD zFg#~qXxPle!0?iRq2VAC1H&tjJxmM?uNfE`J~1&cyk}r&_{IcY^#vYxyTi!9;DlCw zcr!uP!nrarFx#FAR9n+8ziZMoXCKzvYr7Pjv$qwyaO5r zL2@6cl?F^B0JrJ($P zsM)~E5IG9uOha&vf|Zq^{uaoQAPkCIP?`tTZ88vdFnnWRXaMb){SIwA{9u5LVf}%& zvHmhJG{iD6F#Ly>nT(8(F)U_AhK9)u3=FJ{3=L~QV~~st4WRmylaZkTv?QIIk)Z*! zc8HIWp#jv+kY{9Q0BxmH0*TWM~j#WMEKbWN1)gWMEKZWN2__WMI%>WN64| zWMI%^WN4^lWMI%|WN4@ZtrTKpXaI$sIU_^EJVpiv8%BnP1B?s|c8m-Sml+ut>_PT0 zGB7wYGBhwVF)%nYGBgM?F)+9=GBk)XF)+9>Lh_J1BSV87Xzv3fq`%?G$j|^v>)woz zw(&(!>5G;pbQvM5M?qt3H&OEhyu%t_Selqul3A4+pOcyg&Jnm9hoFKAlz8D?OK@EW zsyQKjRgejwt|qAL1*!9AOvwk2zZQU22_UCJkZVEvoT05FP$WZ)fDCbh3QJHzfR4?8 z#)LsiKp5mFP+9=3B)kI>U|?W~W@Kmpt&)vlWM}}b1dL^5XaJd>z{t=5N@K~43=MG% z3=AoZkp4s(BSQnI-;u${&;aTeWim1}fX1=17#SKsTLy9&85(9YFfimZGBhj&wT~Df z^=T0!L&G)(28LorhKAz|3=E}=3=L;N?IlKrhFc5_3>AzF4WLaRm5dAxph=(_Mo4?9 zmXV?19|HqJJtL%V+60PQ&}JA$h6ZIu28LFU`xzM++Msa>8dG&fi_2Ny)l&=%pk?Q` zP~#GmdBDL89_EfO&P+*#j_HGHYQoV83HgHjVl2@KDkDIl3{eA)9Yb(K6|~k3Nf1KvM`!XS5p;tP3va0Men11Np0WMpUntu|c62x;G}g~r1=M#z}i21bSk zkbgHq!v$1Fn4pD=D;s27Nr#Pr;Wn0V0T082(>17>0CEu;hK?(N8W{eJjNqaQ)Xqi} zU*K^TP|<)nSOnS#11b36`3YRGfjo>nSOhBKL4zGg0R~ow$U2ZA6U+>ToN1a_85lsp z$pBg%E+`0EM+Gr3EwcoidqLKK3iK9m!v*4VP<{keLQrQSb~M#vn?Sw@BiF-8W4bBqiPs-QL*sJ>uiV7SQ0(BRC-z;K3woGBPwwWny6X268781H&&yhKAKl z3=Drk_AxOqurM(+9Ajc&U}a)xc)`TLz{SMS@Rx~!ft!h;L716=frp8qL64b%fscuy z!IPPRfuD(?A(5GZL5PW=p@5lzL70i5p`Mw6L6V7~VH#+{or$4gA!v0Y6GOuaW(Edb zCWeN+%nS^AObiW2nHd=LnHU;Qfz~=QF*JbU-vKl?#SEFF`oqk?;KanxAjAThs{*ZD z1kF)du`n>WGch!HfmR?gF*Jm*Ffe#BF*Jb2ti3>UQY?_Ut40>coK+7C1A`wELqi`6 zWUgusXjLK;Lj!09BWR9lGYbPlEE7Y+WfsVs)FT!Kh9oA2hPNyX3@JVra+#t>a^2XsBjoU?^l_ zXlP(%U?^c?Xy|8UU?^o`Xqd>#z);D=&@h>mfuWX(pK|qTtKy~IF zEM+aEj}9((zypZI;BpsK#(% zumu&YNX=SssSc`fAO#kv!h{Z2f%7KFKA7V`egx%B(ELBBgawHQF*7uP{GH7VX;j8o+^L)sAq(0Qy)j0_Cu_4ipO$jKtdLH!`qumevh#DkWfm6oK&XXd5l zq=FBdfdn6@7z8;24LhLrw1cxV3&2$hs7yi*4L<0!J|r~qP}=nsObiUrwdt^`qa0Fo zq?M#XMnFKragZV|GcUdpTpWT{M?>NvzbG>`uOvRXvh!JU-d6~r-sgSNWC<#II7ndX!L1xrJQ4A4F z%PcB}48(vcI*3?m9z-W7aUd*#jM{+`5=1OBFTMia>wt{ug33r(P=n$Olomj3lqt}D z#{y=C2GCBFCCm&Bps-uX44JQ3%goS_%fP^}j+vn$pMim4BQvDGv6&e%XTFUYGH4tMh1q< z%nS`v85tO^Ff%mF1&xt1GcC-4 zm>3v7Gcz>gfa(Wkh6Yf2`wnsssD1#shlzpVH#0-Sd?p5lKg4yljK*sMxSQr{W zeQhxohK9oo3=HBd3=QW&yQ^3j8bE%Mg8Ch_uFe##9Sl+ja^pz`28R2neutGTDVas! z0vV(X=3FEiT%tfmsv)@}r2^c$2W2X#KqXiJ(ezJ*2!ITMs7R~;=XcOxKO`F$r52aw zlt2qxP~QN#I0LyE6jt1zz8T06P#=c{(l=0Ify@o4vOw~g8Ve+UX|OPW*A8g2Ff@Qh z5Or7}?IK+k$o!xI3uNxZn1!JM6c#4XFayn}pwAhA`f8vt1yJAZ0cw~*%H*8<#FY4g z{LH)(NLh?KH|N-7S6?qWvR&F3<^n*C(tmC>; zK<2elSRifsG!}*iP_HMQ1v1`{$pRT?$Yz0zMdh$S>H^Rj5>QIQyfmsQ{&FP~t*P)u09%Xg~&aK?P{p18BGm z%jyfz=oxBj4rDB-p9zUD$XGn6j0Hs^N*RmXk?VpCu7O+)iday^4vScjUQpu$DXSEN zd+nftxf0x>NzTtJ$uC8;X`os`+dn|A0W}FALXgG;vc;g8Eby5ykeNJC0R~YD$+;ly zp#CkA<L6-269WTiVE}Z62PiEeX(?s^c?wjZLCnqrCrwae6iE?yd>sOK=iR=ecIgIjALji6-~P-PVmji7;2 zmJdjvBv|Q?CVQ2uwdp~qd z(IggzhQFZQb}S4HpoQMkSQr{W=YLFRVQA1}WMG)Z!q8yG$iOh01v2hBhlQa5v|469 z3qu1amX@+GG|XmXU|7b&(6E}3fnfy;WF5y!7KVmPj0_B`Ss-f#*Rn7)d}U-{SkJ=H zz|X|Muz`i4L6(VuVG}6tGBGf00hNr?3KZRkSQr}4FflM32G!wA3=BtD7#cw53Y=hJ zXaGglDHetX(7wIXEDR0R%nS_YLFF$q1H%OtNWb(MX6KG5ut!;9G39?2J z)Q)?Mt!#p|P(b^aQgai*trSq70hCbCu!A6jFv`-elA_ey(p;2jN6@At6ajee2%OKs z1p>H&2WL8v1+YwqoSi`HoS=>X<#ABm56O#(;NB6a&;ivZ5HX~F4Wd4QlqDd|p!x)& z5LS_+77n1p=0Lqh=y*7&)c{eBunSZtLd1~lLUe)<=7MS~%)SgL4nTPjxi7=T3R#E2 z&k9+~D9Fmt5D7Y!lohguQH+(L0kmFUf)!FxI2o z85%&R+4-?T<}rg<85%&L8_o*p+eENJ<})K%A$^-@R)z-9I_Y?jyBHZ55?CQ~F^Q}U z4IE4i49Tnv4N^=D4C$;44H}@eU91cZCQJ+rnXC*Apnc2PtdKrW9xFpbJ`)2&AuB^e zGZO)bmaCEsEz_9YcvdPKY^+q`4pv0U7Q3tAiL0KGPWD2~oh%#b?IW-EJs^JB7QyIWrBhX3^tTy#A zfQKYO!2z-fl$nuj0_9@@Hd%oNjvzLH8e5 zL?Ab@0-_E%ut6c<0%=6wbXG`Tdj=~*!#f5BhFPo(4WK#a*{lo= zI*beqb6FW0%o!ON=Cd+1fRfk}R)z*p5?aQ}&`{0Dz_6T^p#iiuYZWU)!zxAwhBd4V z4Tl*S7}l~v+8yga=7QQCtPBmHHqu5`NIPT`D?v$69dBmR)&TNObiSMLG~~)FdSlKXxI&EXF$uCqtG(uIH=5HVqiE0 zvY&~8;Q}i|!*eDEhD)pr4eyy47%qd#JSGN)E36C+KbaU9uCp>UFfubR+yIr$%nS^- zSs5CXm>C%EvNAM)63Ts6hK5jP28IW$3=J8~3=EH185&xc85o|jGBnI%W?*>63R%DU zoRy*B1TzD}3s%TD{3}+5hV#q}46j)k8m=%iFuY-9Xn4!a!0?Whp#hYHKCm)0fHtUo zWQD9_{ld!75YEED@QszBp^$}v;X5lsLlX-F!w*)5hS@9(3_n>J8s@SvF#Kj^XjsI; z!0?Zipt<1~(((aTLR#LJ^eX(J-_a2DQeKJ652w z5j6S(DeMr#1t4)yK7{0AP?-r@Hc|{Oc0nm0q8?G~g4Bb?Rw3euVj5Ivg32A_q92s+ zKqU!eJqyTOaK8hzPzqulq6ve@+=#hKPzFaV20$(uKs^RfbDRNm3XPy3C~rdy1a}sY zRe~BE&|Re<7lKBYAu1u24oD2tje|6Oz*PX&?o~KwZ7`$^0BHf$fau0x>!l&P1T^&z z%2Loq7^s>=Hv+wygcMMqiEmK526@d2D9wP%CeZj2sQdt>0eLpan3ggdWd1;f4YEE# zl?^hFpvDFnJ6307XaM!hG}#y$K<83vu`x7&dhL2_3=N?1MSV7ghL;Qs3~2 zBQ|4WXz&BA?PFtT04?gbVuSRFY}gnY4uRU`Yzz&cpmt z5@%imZO=n)@PN`aD1^~4G^c@b5AwD?Pyzwv9OT>wT78IUCxFdIBtVd{$h-GI*#^{% zLEEW^=ng>ADQNB;)J%b-B1lmIF%&u3=`b-cK#y($Rl$fx2xv+Ku|otjC3w=vN1H2GBGf$V`FIO z0F4*0F*NitF)(aoV`u=S)lJYe?ZU{w;E9%|L3s{T4uJNPJja%%!5ga!@^cbPQn9q= zL8UAx3eYe#af6Fia0?rpz`)f4sKA62|A=Y?l;}ZgP#}pBk_S?1Wt4 zf<}cv=@NTcZ_LQR0BQ+B%X(0Kg4B*fPL!a{!=Pa)Xrct=OI(Q(lqNyzaA2MWg&`&~7e>4ipl)mtTjR8tvyTAzy($OrAHvkW=f=bXy$l~Cp11R<(af(Pzpb=msW5HvQpd^M!PN0(V z31~$fcn2A%jRUm{JW2^lCn)2>pu!q7+KgmqaXe_s7df$k8Zn?T9B5(#4cJ5S1Z2P& zRQe$+2Q5jw4(SVmf&w(=2=QHJUU6y>XbKB;$Yv1}149F(=L8C7P~8u44r0hgfsug$ zA_g6@0d+<}y8t115ZpsU6!4%Ce$Yw~21sWLRPaIqvJ~Fn0hiX0u^rGj1T5-7X$h1! zKzoH{AZ;LqH*5?Ip!D^TjiDi)fq~%@8$$!=@V(D$3=N<)z+XY-7y|>tcQ(ja&QCVT ze9tdvx%{6EGXKoT&d?yr$iTqF4p~>k%nsSJ&B_iLn_**zjK^}ZGcvc22iLA zvP0&bh1eMyK-)4!*&*YyV(bhJpkS6}XJ~lI$iN`O&d~6hk%2*u9Wu6}z|PR%3tB6| z&d}fwY74M4G*mJ%FsQIIG*mM&FsQOKG=SpaV6b3kXh>&fV6b9m zXaGg0Gsrw<1_l>)hK94u3=FR93=J1S<1_3G4Y!#Y7(Ce-8on|!FnF^wH0XiW|FAPO z7_%@i1cKbl!oUy=axZ8d5IdxQ63Widu#km;A)Fo3KZyjH%fi4A&Cbxk#>&7D#|~Nl zlfur>pbT0E#Lm!Q%F4iy$o_HPtZCbc7_H{HU@?= zc7_HeHU@?YP`t1)FjRru!^Xf+&Cbve$i~1>&kpI=#Dmrjqt#0{p#2(9zw9NUGAO?! zBee**2m%cc!BQX+?I6e?jx<0E8jFp0hR(i#G76|ugkBzj>I6vMMATQHc_vUHfjWN! zG67VJL2?FUu^>ncy%xi)u|Nyg7X$Gr zXoX{961ao~1r$UOH1Gx4S`3;^gouF@CWF_~fch^GF>py7pO^$LOhIh}h%iVy)XW@k zAqn066rTuI2YgD9qLxgcIvcrM0;MnXa;XiJ&lwmP+Cll8fq|ieouL8L zTkT|roDI;$4jF6i29+NS3=DnjkhRwn*clr3GB7YqV~3m-GMyc=PJaeFL&Gc3I1M{P z1L)BB+3b+LXmdgN0o4A3mQxGZ85*oX?LT(NKH#P73=N>R+H!V=25-@$XN0*c1Sz(IH){jVqiD{awii5!%23A22jjj0=W}39>Wgl zYh7h$Xb5IvV7SK4(2xompJ9iL|J(qTGfWH&x7i_M%y-xs8YY5<2-z7L7K8TKutWM_ z57`+S4uJOButV0*JO-6xObiT9q2=WZP%)s!2ouQ$PnStRqDBPGC82+*|G%R3dVE7M;H)aL~ zW)6miU7*u9IUwUeoE(sGATH>>WYF4FJG62MbOs2hy$tHZzD6&XAm;!i+P@zQV z+A>h-1ksKt7eE;vl0U#M1UGe1Th5?j0aOk_OauD>r2qmgA_FC8Xfpt`*#=@@IoNHW zLI%Q5$t;GnO2DlGP~HQL5x{&83PTVZboei54=0GN4c#BA!vN{K=`ujZA@rd8#q=2< zZ3P1cNW0mP0kZergaL9+hZzH;ZwK0+y%99t!T?#r2HKwuT5Ds&zyQvRpncDv)(mLh zGia|2XumV4>F)~K-w2woVSvo@fc86EGJ@A2g4@%eea@gYY(5N-@e4obenn6}4Sh`s zXf--$O{ODg?HOts0d?Ms<3Xn^fzHqYHCI9VAV6Ub3IsHaw(J2sQwS=0LE#J;Gbl+c zN>7EX5C@Hcfnw92F|#-xTp>cXErJpsBqe}$3&ul|1E@*>6}E!lh{s5IVs* z2Q&ZzsmV4AGC)SbhZ&_4=t!&JO#QxY#KDJgZ9#bf&#Qx7St|Y4BGq1z`y|7D?5#WfdRBv z7BoV;f`Or79|Hr!N(P1o&{=h>7$D;os~H%;dwExgE%8(PbTO*iX99L4NjnXgMpy|bZ$Iok7ghv0|RJ}CMYOCdo)4w2}eMC zd_n6z86fitpgozO)&XcwCg?0A(4I`t8O~=I7#ct)H-q+ME(ERnXJBYp%*eoSiGiU3 zbbj+?(B5s(dQS$(e8V-+9&Sbkh8qkF4XjKI3^zf0xk2>^14Dx(sNP^;Xi#TjV7Sk~ z&;S~ldI;KI2dY0ndy$zK7#>6OWG55mSzK`}3=E(ntwHM&-r~)Z;2D104M0BY!g#?g_~!SX7on+Y0JfG7uN;CP58P~rvc@qr}2 zw9=|7a2p6zqC$ldb2D=)!8sCC7a$uBO8lT42`XW*JNze5_m~~ zoI7@d4wQ!UNI}j6RV_$)3t1)TkOa_#IJgxjCMNQ z!wAXqywE*30*sJz5QG>Z>lj2CA?p>S7#SM!Kz&|DhKA{k3=FcM{e_^uFC#<4Mn(n( zMd;p8&|XteA6c0ZGET3~$j|_aD@{hoc)boILjx#A3>hKo5R4fa8e&0bE-^ARWHT`^ zm@-1zh!%_t4Q-%&%E-_FTBBse$j|^9wgBxh-2mNV3Ys%?1MOb~^$!^#dvm-QA#;HK zj0_FD%nS^Hj0_F7%nS^{j0_FI%nS@6j0_FQ%nS@+pgl^=3=H9*y+q6m3{jx{kIaz$ zn2ex3FN~16y?92325A-s2GD*?&>SCVKc+co?+YVCgDVRI186^H01E>{IwNFF6KFps z=zK*``x(97XJUceWdb^p{2kUZ26VDwJhS)F+^Gf4Z%b5bzW&MxF`Zuh|nAjKjjZpB|=m|Do*4~2x{Dc4uXKz z$DjfMlDHAGcIf#QG_(g=BZD;9ij-~8RYx;2FwBHxM365)B^N?9WFsf2ut0JjL=aRQ zKs*8&dIT4Spqvj8OoJ4LAR|#rCCDKrpiLu4MjD~CZ$VwvJjA#es3d>{EabjrkPjdj za#kmDo(9D|C>oLTbRi>TZ%zp#KG$K!%xuu4Mv6r8Bo6uv_B8j z?_*?Wh+<-3IK#-$0J_cK3Mfy3&Qf4xXaL=1aFdat0ThFv{ducE^)GZk-4jNJhEt$^ z93y0X;R{BFhWns?93$k+gg1-~4WJ7&-h#>|P(O~5p}_#ue*@VIIslguvd<2*Uk?-= zzd?JUnHd=VfcD^m`f;Fr@}PbkBV-*SBNIcz4rT@hCML+dJ~I1wK{oA0m>+ezX zbaG-&a(r%LMSMmoXul>nM}u0Fpk#oC9R$IRQbc|OyX3tK*0cV3L1uXn?dCTYPT7= z^a35D0J?+-+Ij~CJjy6NJTO3gQ&43NvjpTu5Strm-$xD;WG!MYXx}3P149w?Y|>&T zh6d10LZE$)$)LUVObp;PiRDZT4WK|)RF;>cwH3-CAWg2%rfv$ z9B2*w1@I}piO@&@&!AuiFQ`NXm7b7V05Va59ON@VwJO9dAge%yC!{S4?p}g)gW4~+ zQZT5G4(jWGuEt>y6a+;HVhRSN8Po`aj!R%Y;^sN%kY-3D3)C0`RjsH7fYwLgGXONH zVFW4sK`mfV?F%XVL0KG9+k)nHK%4#{c?%?tlDA+DK2VxMK2s1Br=WlV^&vsycpx@t zPb(;%JE3W*mkDwX#AGJOT*!1L$a>ZpOptR1W-~D~fW|fEFhRyO<}pFeUz-owD+@Yb z3A9%h(zFGi0kW8hp#e0|tbJ*ucclFpH6a zVIycyE~t;l#L#eok%3_g6GOuzP@TiX(D03sfngiS9?)8ICWZ#kqW+zryurl4uotw~ z88nv2#Lxf=#S=^n4ff0o45y)cq|ZV3L|+8Co0);(3KK&EGYbR5O^|-j8gY<&SQr@Y zGch#OfYydHF*HnKVPJT~#L%#sg@NHQ6GOuh76yhVp!0ND7#N;{+{41a@CM`#(Asb& zh6XOs+Hh$30~)GA--iM^-wss%fZEkxk@FUKrDtjpF-P%%3T;rqbQ?V22D!0>0X)hD zDOW-H1{A*_46+ZDY?06J)`Xrfr^NtSs{k7J0^MN+8t($R3pCyZDjPrr7`ppGhj4=2 z4_ZR{4V(Mn`)EKe1i1hWLyHEG8&TX3n)?IQM9kpfpn?o=lL||j2|X_WlsRE0gWLr2 zBXW5O8j}OL(-hQC2cPW-neVe?fXsngGcYuO%1c}5nQwLs3=QDBwHP4l9zkPtptIhb z85kNseg%!ufx-l|Ck%bxH|QQZ(0*u8mi&$!CK=#`3-O=}6rklASwzUqptBA^?f{*22y#mZbR30{n}6bRvk~px3_5oa1?PS6i2~r90vcRFscLbQ2OxKV z&Pzis4?uYZ@$#WL8%+L#s-yspqdrMx3Jkzh(gejyr3p4NEB(scWODP zsSIw&g2tRcNz0!R(ue?u7AT#9nhY?vf&2yvE9AY(4xsTr&{^)#Gvz>I_@I_AsGI-| z*Sax4+GC(INFRF#N$4 zrjUD*KqL2{~&DdiyX$F@C5ZzQNj}x@SvV=6gZhBf(kOQW>66W z31dia9n{JKITdmiAY2)!+{OrA@E8g3eb3l~p|q3=N<()eD{T=mX6)fc88vK=yZm=0rf}PfmfJ_c|4NPAKS{ zQP5n+3}{$_)(N4X84Wt48)PS_EclNZmL;jhCGkm_B?MXkpwI-h0FXix)S&=PJVCM* zR{le9lADKWGyJ zdOHVn_6Deo1j#XBh9kJaf+#6*2PMeAppb(cY75o|Zs&l44ke&K3PAw_2~X5o2`Sh? z6+9@cklP<1w}Qe7`5p_<{2$2upfg%QVFj88v}Ism0G-ha3Zpv=kUa>XGg?8n(u3v! zL3P>#2FN;Y(0m{$jS*@qG2;pwqDotkr$Mof96BH|x)rzJx*WN@1?4GFSc1wK(0V0M zdIX(U3(8ZV^J+n7Cxgzb1+|slK+oX?om&eUy8_KSf!a!+Ky$SW3=E&4_wUt0aOrU%Mx+jSRSC~@NRzePAP*%m70zvsV7SdJ%wFSU!B_dKKD9%7lD)d|p z>Boa6T0r3l!XSTw!WUG;f)3mRiGk+dKz?Tcja`H8^Jaw9Yb=bAwi4(JS5R9CG#>|w z6VQAdXeyKoGbwpuB+| z9iVVVFC;(>FQh^OWCtkLFrx#U-a)ww=2DP9LGc0FehX?}fyCt)A^Vp=XX1iNHqcqP zp!5zp3l}sp4w|O~-5Uiu3m3E}1T8iUYcgp6y0<}E=z8_?Ofy`cR|(DPP7^O&IY z4_e!SekUAg{1#*vX#GDMuJDG|UXYbwps)eC77gPHbC843!yGh>c}x&Agj<|nT9gdA zF9y_lfP`;SW=TBgyiCv#CMXRfL?Oj9C>MdsOq6H?Rh2|U2l8ky=*(`=rZnhWA1Gr& zs!RB2FDQLMBC`mdEkTJ0B32F-12wEbqrwm|&T@1S4$rW@qB>0QG|$Wix{HMovIht>zih|Izz_kl4|Ep`bUqz)-Y;lA z9dzDrDI)^|Xr38#{sd^A8FX9>Xr38#ZX4*_U(lH#pm}D{{XU?1<_(~wP@uCk85tNr z=lz1tKFfpVd(b{#^z+3*Yjr?ny(c3B13RvC2yXp?$Ha;i}YsFZ~Y zKy-nMG$fy*$78pJv!q__snIYHtAEC`8fQ2PU=JOO25 zPy&EtYe<6`rSM>2U;tgZ1}!`g5m%C$3+j5H?q+!b+BygE2&nV|6;u!>Af+r&Qbwc) z$Vu;@1PpNjWL*TvRiLzlPzOmjpyoJ|fv8IYK>O@JLo5fCl4#`|sQdyAXF;@s%3Y8p zpbP;?!HDt;+52IjH5G`J51?Aq51cDfN^^5TSMq@-l0X>R#{{jbfH;AH;SMPNL1(*z z?mC1_cQH(7gq))WT2BC~^X4!@?zCG7Iv*Ew=LV=u0`)mT=i-9a4?@=pfz}s*&J178 z2$@S-!^qHZmw|x+wB7);-3oNJHOTLvbALhGJ3;FSK7^YnVXm0ikP*K<5L4&U1VOIx`)*-k=GzHy3m+G3Xpf zM##AXp!Ej(nHU&A>kUA4Ip{u5TeQA5Xx|>F?*Y2MixY4DicieR0S_U7(i|*WkZ4?a z43r$v^B5>Oq2wG;0!QQ=a2|ssQcxa&BxbN6B!z=gGei)Q$3T@NXg?L`z7QlAf&2z4 z^N`Pj1Ffw9`S%Ct41dsACp69cV`OLmB}fM7ygq0R1?aqa(3%O*{Vkw16QK4b=xk(A z*~bf-_XDj5XM*gh6=Z_6UqR~!Kw%APuAq-=fW~(~c7xhsTqt1;-(rL4rh-BP$uBUb zgCKalBPb45K=Ka!nmbS!f(i+gfCU8&s4f7-0?Z7MJ3!%rJYJ*31ldch%miuAt1v;% z=uicn`OLt;paz{^1hwVS{RO&D5;QiV32NWt@E3fF4(13n8tN}lC5Y}XkQcyhVPrpm z>_qp24ror40dnp%XnYrR?zAlAke3FK+dy}#g5n0W#~FQ23RK^L#&bYNAMoJtLuy_M zcw`2g3qUSK^8<*BwBiNs4{(fu(k!I71Q`R_W&|oUL7E`q;9?zRc?;+=4NxZ*T3?_x zBcLm>VPz%A94H3)1r#=*H~|&%AmISed^iK-9#_y>><}hM*%=01%Mr;08HbF9#xrPs z6TPee-4hCGZ-Lgs@Zt!gqEt}BAJohNhZ1s>ft&%w&`<(Z7^tBHY63$-0})D~bPZ}i zqoiw4r34C6M5P8Ex&x;ZP$qy{!~k+LC@errgFx#LK;octzCr%TWP;os4O-^{atdgj z3n+bn_AH^#w}R%^K;Z@&f91pBcbLyXW0R164{q;c+?5HcQbCSDga^pqpzuKH^?;UQ zfC2*&NRX}&xZ?v_M-3{#P$ZHvOCTGDK^-uN3~IQ7x|b;73QCfo!Uer}1(hKn=Yhfx zghAl}3RmPiBtYwaKw$(r=N!~J0G)FVYVLr}IR}loG=a`ZXJBAxgO;)F(6k1sGttx9 zU(kImpuMn+3=I4@!aFe~CBDS47@Z^&`D5`9UGuR9bz7&;zDj6 zS%FSSgt#4)xIu{+DRF~@K#2iq(hKB3P%uL*0S#t@L_k$5LzH`0r(C8 z22lKg$~@RvC=;0&8bITZlR#@`KzE&i*0O-^Is={m&j4Pv3cd?)7Ie)HXiW}izs6i9 z$XV;4H94R$ghfn{bAUl>aX@wDN+!q|s;fZv0D#(A(0E@DI$s~U21f+C1_yLs0%+|G zXblf&%?;=r?d?pEbDeg8$|}%44JL*L&??&9OptS)_AoItl!5m3F+uh-9|WDV54uAO zdN=hECWZ#kHk+d$`$6q9(7F4d^SVK6au^vHPBJkxJOJIL1-+vhv}OlX4uIT*z7H-J zdbfExBLjl~o^%N=%u^wUJ0s^CSonjk20}e99z0nJia}8JMkGv7h6LqnNU{OVc0ziG zpwx~KgS3l4xfvm53{J41WR8+xK?WkyCfJ?e^opJ~K@-`CLz2^geUYIw#O{_$?;Ld4{){AmbAcm>^@?p!H3l`+Pv_nm}h8KVxEO zSjoV^@RA9#$MiKQjzHraOpraMZV%2LHDJ3ntCWs^MK_?!7Cdfgd2@MKl3R>}jN?1e`gT|~tAq~m4s0B2r20@8F zaBB!MRtwStGaTeLP#hrFa{|neJD7x^cbAKT&VdK@!JvKwo#=;t2RrC4N>G^qN?sx; zegq}G;`sam=#^BsJqSu*AP+*$9R_Oyw}3#-MWoL7lF9 zQ2s>s8z_fDq7UAb2WKi!Fhcwc&Ol%>P%ae$*A^fPAvZjM!V8fgkgEky6$H&xAj=Vf z2&q9p)en|50_{aZ(g~=}f~6Bs7=XeS)O>}F>H9K6&cF|3W@rHI&ja190ctmfGDFtw zhePjAh-8MW>x~253jkUN!OYMAa#}JoByXlML(XIY-N^yEdo-6Ba`qMI4vr{B28Kdr z$R5&SX2>0fCD6D69ae)rrwuw+!kz(qHw%Lpmbik{`^Ml#CaC&_`45SP9=rnbJ?P*S zKhclh=hPYc0uJZXc;ra4h9BLn1SL}l7WE%wB`aNUc=1L01C%i zX2@N94a|^sels&C+(Kxa5HGc;I$&Te96XmA0Y`OFO2V-LEk15_7-%6#-R0vf9U zl~thq3*uPQ2)H)_P9va*0)+<}Mr$0x(*-C?p{EN_1VZvSqKF1XET|-eL@Z_+01Y94 zmVH3iylTI9cv8PZn=-Ae*GxbrYG z`0 zNe|k8#KO=3>TAifK<-FYVS(&@2i?WO!^ps(1v(p^k%0kpCkyDTD9~LjpmVzQSr{5( zL3g0CK*p+#SRi$=Dd;X2Mg|5mXgq`NUqN592P!K->s5<~DBZIasCak8L>1f;zU?j?Zg6i}eR{0OoO zS#V`bIQo&@3M#k}(T`|z zfl5zM?uWFwlJoP6QXnNaC|W;>f;J6bRG+& z?Nh)4xfiSu>UTo%B!}d8BhusP9eCFniSg6}y{`&%HwP%K^g-PUYMY_wQ_vg}sO(t7 z$iN_v#jTJ~1NBltD|}$71Br&VoI&%Opq4WzAA;JM$PNcZ8mNr|$+L(^1E~ca0|?5S z{*2&qA3O{Jnh!>aNYG-#J&3DLz}G&2CTu{JpFd+IxOEOnyd2=rf;bsuIH+|FF}x(d zBryjZ`Ovu^0pTD0g z*li$ThKBzz@z4OU2SK7B;~|P&{KNgg9s~(9H2i}p_HlI!fs2DIg(wg5boU5hP-I{i zj8tS`U<2FfT2vJ8nOByWlbI6lSd?Cx3%cZ12;@&tf0n^5Bp#%~KO5}#V*(5eEDgn( zS;Zi6KWBdzPe1qgU@y;L1{nr+L5Q@1LQ*=ibU=_Zl4jHN%p_!4Cr@`%1_ik0;=IIi zWa)56zu-_mcLq7Qio}fkEMyg4{vM7_U<=NQf`Z;HBtFR1&&4$;-q+v7HQop8XOQba z(o7%^Axr!E`}s3SGq4MSWSP-reVkq3CbM9Xj1OawXW$V$16no&&g=!nph76M2y(7z zT4Hi4gAxO;;4g4kf>gj2K=y;hC+8#<7c)pRa0r5Opj$|MFzAx7}SX`1?6z`N-5}aBR?^c?Z%plIdA!q=R1zYNppO*@k(1u93fieT>3D{v!o55y)9PJEI3N{?-BL! z;qC$XKm#HHcBp4wW(nAKkOUT6AVy&cONc~1#HiqsqSVCPc+Y&eQF>4bP}IQfkYwNx z^hA;fP6b_P3f3dfz#*6pkwOk9kQ^vp;u+K!I0R!c6~F@0C9xzCq?m!9fkTi<2psjn z1&Mj_;9vrcz@a4+xZ)EKLqP__GsrS<2>yWxAfi76l&-+)MHn~)r$VFy5{nXZQ$Yy? zY=bvM)TJo1EVU@!8I(lf5fKKF14pW7UP)?EUSbXd$fy#i1UU4-$`uJE(0B$>1`fd^ z$QoTzi<9HQ=DiRA`y1j2uz8>mFM}#hEh@`QPIXR9&PWBNbdWjn5GhYYUSQy3;1EO# z5(YU24naqVGH`-%Pc3mwDND>tPAvup2`I#@QRTf;i}Et_(!tUoZ(_I>9AZTfP0*y{ z3~IH5b%2uldx)G*W^svMehSFB@eD!?9D+X~;-H8Hs|9&)21E>;ok00KwFvBUkoTTJ z!UIW)L6`wE2Ek>?WQZ{+kpwmf6d*_m3hegl5XI0W5(JuU2D=B8i7X&;!Juphat~NS zkby(+9K4s3=sw!4^K>>a%~4hA}BR4 zCABEEC_bbpF|Rl+zbF^%009OL!CMdqKtddxj@Cl-fCC7UXc;6JI0P9W`3LGfa7r(Z z2bV*bj)If}#t?&`u7VaRppd%)wKKCSl>ro6b`XW&q~usql9-$UcAh!|hhPFk$`g?o z(k^9$dhH(*w4+0!P&ohyx*o0W@+!nY9JY zD2Sb4n?RM{EvPi4@(WHa@y$!kZCqhuQ4Gu?;2RA|#1(zm)!;L|S zutsoTUxDa@hMHe$IoMGk6QLEoYhH4GN@iXx`#C-EpN^?@zqmZog;dmBfdDPQC)mfEZRwYuOW3~FG4+NNL+f!vZB&j8A(s5XJCtT_sE+E}2<5nU7#noy*9q~4V@^(fGQ@MBhSLRzD6HrO#}uduhVC;+t$9-hlsi4* z-E+X!L(0B?Q%S=sBp>pmq&5C%}c_f8=WLPmcb?1PJ5m*`KSWu7yiA|6zZe!B~icwGk0S(cB zZA~tT_fD-WhO|KgArAM+Oe#u*#v90_bYx3FzAZ_Gv@${d0gc6hA{FFTP$B}IbpsmP zfmFwkj1SHgtHFU8j~eVCx4aPtCCm7LqRg_y5>R#n`wVLn2vVAY&S``t5YQoR9D<-@ z9-x*&QZBeifW{{{b;Y}Zu1+Zdms-#$aLcSnO##QjB}gd+RtPFX!R7g7wD5y9P(W!2 zrAYwq?}Bn9W)mCYX3$|+AUA`HRB*H6FLF8WoL>s+DS{#v>_pHE04P+!$pn;llm!?V z;&bvr=`0?SD4fCJ=>e|4Af5(AE+`7H)xzLv2s8@}s^!7i66|wO5WxekvH-NfjYIGR z)MT(*K~)8~@LCQQ1zQIe12qjm+EHt4aKN`g(h;l}2WK#lCqQG5ZXuxDo16-1yQLr} zEkvgfR0l(wB;e*jD(J#)4#8GPJcXr#+G`L4wt`&+sny`20BJql1xtY)oLU5GPJr5b zV7GvZo*sxBL0t|=c?xnMQerkX0%yHn$gu=!4}hZxlx#r5S;=Q07oP|_(21qpfO5l6CYBozlFpvwEO|<&V%X(`y8wr z6i=W7qu`zZ2Zs+>9k}iSr&c#GAL0yHzQ9%|fO7%5CE)!31L7D+2^J3>ZA&czYd|wS z9_$3r2&P*|JgA)v4hhg~BQz3=8Mr}1i69d_eO$o~Tms^R#QT?)u zvtaLnDkji;0w{ri>rGH8gC!EdsSj(b5>l&zM%|&Vi3bguLSi-%InwE9C2PfRapd5yh?!aEbTD--B0~RzT1Z(Vr z`$^a;C}XfsKp7Ri4GIYl(C#2;6CYA;fa4I>e$CI%0jGSdnF8!=j9Lqlgi)gvoOwYi zLkwZ{8@PZhf<`p7B?gXYP`!e!1qR8TUqGP*D_0N&C8)7r0IC`?^OH)`z!7H!H5-)U z!3KkRlDZ%@@ySIcusQ_17bLZ)80^cB$cDpH0RzJq1_lPunrP70Hvz`3Jv?!3CM*Ab z&G~!a;K!5O7#KkNVFVb>>m0w_diK+9h2)m^=auGjFff3MQ31wDt-(KbN%l-I*cQK# zJKOdW1H*psp8KWK(}K3JyuG`3vD*JxQ#uwiFo4#G2r%kSvf2B{d&ej7f1FFd-{{l? zp9jq#z&O=xd-O9Q`%5Pbu1`2)?HkF!&<|P%&8QofIrrnf8}rYcInR6k$b|D{=KY^4+8_}jBEi$=GeYZbpdMZd}RTzgv&)1Fff4juL&?Zp4JUW znJ{;*$?3(5^^-5WVPIIp#K0iH$jcWr<;(85zf!-4-K&~bJ{^2MB7*><`nM%91#>c@ zOe6X)yMDK@0-xi+zzv$Wixo5~EX*`x$}{s)^2>`AvNKDHV+;*qGV_viN>fr}3=Q-Q^b8G* zObql4VoH;XN@9w^wS`^=n3`sm!#zwyAm`?% zP$!I2GV`hI2`ZadT#}NR54yoBEi+v&gMo;!0Zr}dC1XsON0Ge31_mXlmya3$>$H2hA#qfri0V?(Z z%Hm>>VP#+dZE53XP=KJ!Op+{+W*JRum;NFVqoEbiE%(#Tns%N3=E)kmD~&y zpe!zi3mgm#pfk|88LmKCTnzI$Vd@q`SzO@5t{{3_xFE7z3<^Aua+#Y!1w43ix4SB~TU@!x1Qpo8bhM#l^5jfPn$D2Z)w4-iRRkN};-2MT8vD2t1s56a?Zm;_~UG3ji{Y>|Ozb$6#l_$x0~2$DvbY%Xpe$~NA}EWC z;Rlq(&F}}x;$mo!h3Rd9vbY!m6c`vlYv#BaLZB=z1{p<|m;#i=#n7Y3zyMl@$jvYT z%Hm?UtO#jOa5G$ovbY#Tlwj&4pe!y14P}^^4wS{k@Ii%v0kpS(o8b$T#l;Y#3KL6! zvbY%Ds4_5sR@QPee1NjJ7&_EoVm(k67lVR2=&l=3IIBQeTnrbWEN+G?P!<4e+zij5EG~uu9hlw{D2t1sLyv(0wEu#ep$E$1VmPhG zzyLbGg`43#l*PsHK#zd|w6d9-;R%$*#qd#&fdRCJiJRdol*Pqhqz^OC49enSmU}Ec_EG~w(P!>1CM<|PnLDU$g zP7=!EVhD$_xEZ3MEG~w6D2tn+8Oq{fI0$8NGaQAoxERDuVCG3fSzHXEP!=~sB$UO) zFd53?W|$6TaWR~LvbY(}Kv`T29_9=Tpfjks8GN8DE{1#ym{>8C#lU5wiE{0`L7B|BxD2t0B!wse`2g>4N*x|vz06LSBn_&->#l^7F6DGD6%Hm>p z0%dVCynwQ}818s6Fo4z+ax*-DvbY$ey%`v)!C@s2WpOdE`oPq2LRnl4Q=u$whM7 zG0aF}U;u5Y;bxcvWpOcFO=4gGohiu8a1+YnV#r8_smp<~xEKsl7#Kk35O6b?Kv`T2 zGoUPPhB;6c7XwEs_^fOOZU!DGi;Lk1l*P?(0?OiI2uWjL0Nq`{%@6@)aWU+HvbY%z zKv`T2D(MUipnU?|3>r`t7sDJVi<@Bql*Prslfl3M+Uvp1AOK}?F}P+hFo5ox;b!oJ zvbY%bKxMfZ4nSF43?Z2e44|{SxEUg#EG~u@P!>1C8z_s5p&*NaAs8ILB~TU@gGn|_ z%mT{dVmOk`zyLarotxnVl*Prsn8UyTI-{DKffdT)VwjQxQ#S+3;$jHNWnciEJ;%)u z0cCM9Ovq(m0G*w|%`gSZ;$l$AgQ?SivbY$I9G3XS)#0;P;E(V`M1_sc1v)l{;P!<?X1E!yLRnl4AEC0`3}2xvE(ZA$m|kTli;H0nl*P@k0LtQG_yA>bGkk%v zxEK^lVR}`dEG~u#Weg0Ub7;63ra)O-3>VA5=V~)>GhBtTxEMmpVd^5FEG~vWgU;wSJ=VmwnWpOb?RKvt#pe!zi9o68o)fu=M z_CQ%&41cN_7(n~exxrZ*#NuMuPyAfwH(5@>&@f+Q9Y} zL0Mc3_o1@f43D8KE(Vu2m|hPki;Kahoq+*#?hiLZ0F=eW(ALht0J^_~o1qKJ;$nCV zmE~r54rOsM2z0>oia=Rh3^zK!=j1bRGu(l)xEKUG85lrkuy8YoLRnl4vpQkw=0RCp z3@lwRF%Bq;i{VNa0|V$>D{h7xP!<=1KsN(JC)mFtP!<e7)E0o2>@CM4_X7~VQ zaWU-aVPF95594My0A+D8IP}8AT%as2@FqNnx)!*YKp*5vUv35wD2t0B1>3nPa|r;CaL$U24Y z2GF(KmM$tDrGiia&>kpD7nO(-Er@`RibrP$NEM75(b)k~V|)p0AZSYz1I!Laun;ag z0?_S9DDi|D8h~m?0>qA8pvfPwnP6)`iXA*y7cep~xOBUyBy@+U1bB3xfXFo;F@T4V z5BBg;0EG`|To@^Q3_yl@90zUwU;r@<__sAEa4;}{0vF8p=wwmx=w?yr1_^P1SRTy> zSU^E2@LHnVMTO)4iB1<4XlykfPyov`*QjtX@V9}^(FYkK(Cxs}?W1C$eWLqdr;7>? zNX($SL572Y;rk6s7Zsjbrq_`mL4j@u4v>Ehm>WTomM$t5_14WbDiREkurugxkl1lH017RI9iTB`lcL1eIaQbtArA6fQ40jI> zuYtx7F}(&WSs+D;0lcK~5CB<<#Fs$hgUbdac?~pq0}qtYLJF@z>OOFJ=>yKvNGYZ9 z4d|?IP?-Q~|G>+H9+e4<3=AIKppCQ)9>zyJI$Kmg(?K4+E-DTn4(L=dkM0%~&`qoS z`yH5C50vmD_zbNFO4*GMyu8lLz~Ix}qXH_ee7akphE4(N^62hS0ht0$hn+1d28;|0 z&3nKULka844rY-3Enp=c-3}T%Aw~E}29I7B4i1nLEWj?rRKW;W;Q&PfCM{RR6qwr9cxiZ0F}etQ^2Ai{UASecPwFK zV1W4`0%8b=YCfRQ{NO-mi%JZ{S0IXkzhxE!*cuSevPA`?kiP}gHiH_^=+X@l?VbYG z*xduR4Q4*bJx~Rf5R+>ap^l!p6Lj7C_n+N8VE=*3ScrFyyQqNHR4}+2p9Gl>He(7{ z5y%su2=M6k&;VNj6F3Gw--i*w1sy5D*t|ytbYwSEi3pU%T*7s%MFn&PFT-mNC=0HM ze_Ib&s-xo^12|q$^|FBV7J`BltQW*W(F+pj=s1ti%Lvv1I+TJDtOLYifH@Il8%Us| z1GKmKc#Db&$YcfvhSvh!5YB&4WPn7Q_kbmt_8WOtwjtUm6>Vmj1*#!@+u<3WiCQki>nPl2X&NSTREFC}99+aO7} z^+1U>TABbQ@a`$#R1b0!$XD<*@p8{UQ00k~Rl6Zs)ua1|NB0?zUhqa_X!1D@3IuR5 zVSEN6)OZ9`yuhj`P>T$XQR^!KP!R-bX2OdgA5i__qN30ZZnP;dJFfXI_?0@Wni|)aR*R^2(HQuJh}tGl|QO>&{8#I?H=6$ z;5HAcDsY8}VhJdOAm$>q);x|ofDYkfK&_GB^(DTb1viDj4PggxiQo zD7ry`fE3*U-7YE-9@z)Lp&j7C>DZ1~vC0iVSyv0>C5tfG)HmZ?<7%s1fK6 zQHg*GfFlVUWLI7afs21o5(2rHrS(7w>&t%(plSswb^@HF6rjEc@aT4s0C^T%)dzGt zuyleON1)(=hA_BUXaH{Pg4@g*9?b{9uGDC*Q88dBv)KWPGFVGU!=syp5oDkRs5N8( z3NZz+`&ti_fWu7zBxK>y=^^o&>Ge`j+6e%O1axy+daxAhfd#r9z>W;?==Ov*nmR=e z!ess*0ITnGWO=QDHE4J+g5`!s^AQJZ84@)=VvQhJxpCY@1)RS?&WP{;HP<^`RKTGY z0q!A~9CuLx=YZE-pzQMh04N~4T~tggT~rK;gPLnp6c|duiAjTh8>ma60y0U%fo6&2+Z-3MC_l<;+jK-#JS;6Mb)Ui<;-#l4<|%}?O|54QFWI0gIx z?Ga&sr@kH)(20AX(hqbr6R33ora=uHP?ZgGqXEb(%m+MreN* ztMP$d;HdBJQ2{Nq0lN@X8iI}ObQEZ=QE_45Zv|EMpf;2X*rP}$_^23w%m5WDAZ^&p z-~gLZ>IQO0uL}bsZkK>E7A{jjDb)qkz&Z!c9W7vwcl)RqbaH?U25AGkx!Y5~qnG6% zoZsmv0SX?F+;Im`E(BM;5H7UngP4UV{h)kk`iKB&2OY}?OE3wq)j&2Pa#IAXw21&E zhXjx213aK$N`T}oaE6NjrT2txPRK|Bl;_FP>A?ch0^@UZdI-E;?9seO1$;P2Ne0Mj z5EEuKTmYP04M5T$pMX3IR@UiZfu7YfJem)HONR`Ib3{OSIs>Ewq!S$9ug@YI1QG^k z7r6lEZiNUQh;jv&2ASJ7mQlD`?yEr z5m0VI&-1AHy#Q1ogU*OR$`T-5ur!Xy@+~T$(K=X2YJj{95&(xJDC2|rVGJObfwY6e z1z%~v-wZmhh`bVkzXf!5EGS4IwMLH$$Vynn;Q&ez4&cg)rS(8*{c#r+&~zX}bB&4z zLumnA7E%c~fGdF(unFMG#-doY+eO6!<`EB2e&`MXb$&z+f+WE4VL^Pcizu#MegikD zpmzDFSb$S6gzM4mAOK498OL3~O@Bz_`+zO;0a20cD2_k8YNO zAWae7E-F6Y>=Xb_GXW5GbB#&>LrnlkJ-B*-t4{!hK?2B#h;B|xj#{SI+TAWH0sjwp z%m4{yfKqsZ2dKJ9b^#4C`KW+}B0xf~=f6w_4XZRCDL_wH&^DG!2l~())`m!Pjf#dt zJ@0WB6%EkJg_jo@7#Mbd#_wRYs6w|3BS*K7iUzn-!=eIeiPUm*v#5N((Fx{h)T&}? z098mJqYY{~Kt_XVqsAH)4bW+xwaMKsDjLlX>^oUhAS_V*q|t1n!c{8>8szd((O`xQ zQfa(4ZMIQSsO1H#JHQ1p^|ey7jfxpe$P6sRkFJdmq5<3qbWzdZ-{zuX0ItG7HbeS` zE-D%zML1hbp!O1Eh_v|)ddPMAs3?FE6r`J}?V_Rp@rwc|oO)e2K=y(}wOv#+I$cy) zz+uJ>2{RWJj@RtnEGnP@yXG1d7KU1$ZWk4n?>9h$a<4&^0I1yq663LSQQ@cuseR4% zngyf?*|9$G@kQj4r11@?>H-xepz{ln3KLMsqmCzlYuMx#6;PMWBl7^bf8X7s0vcBZ z^{~M0Dsbx$IzkHyX;6w)=xzY1>2y)i0Tn(VgTc9+qxArPYcneYLw5+MG18&}mf-*w zLCh{HI^aeKvXlo4SgzAW#iV%;*cl9^!XP6-$6WJo1NVYk50uD4B^gWokt9KV;?@JD zHXtFeMW8AaG|B|E*GI*q(}M>t>mbm4f&)~TfYf$63cS3<0`3-rJdbKCsK4BLpi~QP zE3%V79pcslrM$;mR6tcJsP*xh8_EH7d7%xKP8SsmPMFrV`Hk}?kuwoEYz<{)a z%8X7Il>oSP)^In2OL35U!F?=f%rqVZ^;vy-eN;R^T~?5^OE**Z1#nPyyQqNLPN1u% zn)j%HD8>>oD2u5?1Il79F?t={?V@7S?W5uY%GHQ);dt2&8lmlm2Vy{{2gl1|OfgVF zg{htAr3aEySbILhqq#;UgMq&VbPOse1!cg}OQ{m58xM+ZP&XbF7a%`@QWv-Y1p5i9 zf#u>4uoyFArwgd&by3OacHn^tI&yTnsFc7%&H=2t2b==I8Y;S7R0_I%R4PE;1*K2u zh<&GvN=-Ki`>2$F%A9T=6_blU!Gp=*RtYG0yD?H0C>}v}fgH}itpVij)&u-4vY@f1 z8Wj@<{{Fw9fs+~)6NMTjP&&By17rxu0???Gi;BT<7Znq5aSJ*nw7Evbgn_>gbnz;v zGKCZ>osbF%Bmi<0v{316Q31`df<+v_8&jsoT6*WBF@w}3f(AQwR$?xJGw zTGZ9}KzE3W2`I`SeJ)Tg2Z?|j2#!|}0~8`ii4PQ}&=3b@-sTz=3kLoc&?QiC83#~A zBcjHE2V^cN03B+%V1fD?TmiQp zQmVWJ#Q~bw>*CjiXhI;vnjbi{9w?ClF;Nmh^8p2Lz=__y&EiQ((PaZ77YQn z5KGycYg9rQN|uAv7=WyRw4gyOuw}669yhjKr9cC8gNi}zyby=4tA_ZDX1lw0jeb-YC)5cNMQqZ zFE~9|;B@aS-0n?ju2D&0;BP7U|NlRDUe-q?#TYzrQ40<*gKh_jW=LPd0Nj@b2N`74 z4II1{px84gy$o_37R6v+f)zr1+3li|0tzP3pc!(AK&!gP|Nj4fnezAle-B(ObkGeRWOHoyUMl_JdOC64bnl9jhPzU&E1ZZXoI!=e0lOY`vn$>*Z|Zz?sie(0rfdR^#WLh1z3duxYcaY>7pV4TFn4zaA&)yu<%&3 zsMIQhjjI9G4I-e`60bptP~;yZk%)lW;IFl_SyXteT~t_V6~Q$QSg{0nJQbu^0+eFA zL47F~6;SJ(19g}e;<+ zj*$Sk6a^1dg2sUzK$#0R_s;=Z5zt(tBEV3V2#QIL;|`#~18|IRctD58!M-V#2g`$| z*Sk48J;09O0P{e@HYTrS5z-(5BzewG50jUm?1bIJp!g&%4I{h70XeiPI6d4$Uq9D(K z5}yZ1DY!!cHl))LG@5C`Q0j&-h5@%JpzM#;6wtV;31~EPHY;dczeNRP4cJB95HEoi zguq1M)^|Fx9CuLxEzSiGVuD=+9i>bFxd$o$P7|P!7|;??$Vf~CxS9tKWr7qzs`&{1 zW^>S7B53-ey9ew9&}cpXeilct@(@sKquWO%1k{)U^&UWckL&{uATK3&FrV<~J_urF zKo@#sbo;0jbb5e7sDOdL4csCH4Zxu3=yXv5bt^&;CiS{7f+qwjpaxYyP4y4}w^0hf z8M>gkMx}tUED)5aDm7X1gLRC_!x@P~enEBa5710)-&Rp`DHruXABi{QE#PRu8!M$iL51(fVL% zAd;M7^ADC%brqstgy{o00L8kOyFhIvXbJ&21LSm%P7iR49+EtJ zRKUeyr-ueci3urdKw21JYn{M>4muMZG?rzt6Epzn0nTGnR3M^0TpGI|qL&yz!4DGk z>h2 z^;S@U25u{W+dSZ+3cM;z0#qb`7fyi}3tGCUNR+a^l!SJ&BtV6%K)0uXrH4Vu1&|pM zkYWnj!T_5CE&#zSaAy_X1_ARpKrMfTQr4GK!Bdl<`DRe#0&3)WsF6M@P)lmXKqBC| zW0(ljYmwLX=%RJHAQ1sj>*EBtsuAdPlmQE&xK9COy8xu$p@8gD$a=?@PXGV^e>v^n z|NmGUN1&N`P~!-6egGuI!B)Yi?-5;BaLW$SiPZqP3p_XhZa^A9ZHB4>O%#{1zT658 z5O6nAqubNO(!&H2#yEPukbx0s&ljcv9D>M3)Ph|Fo{)#CsRM^8$W8paUa*5=RHM^T z<~6u4iLA3u4HSULI%`EhB2b;+H5?$FFK>WqHk6rm@cKLOdS&GC^5!?Vh8I9Z6}S!r zPYHn<>yWw;vMzxGT<3v`?*At`VH2&8VKU@8uXzu+a$(?ao5=zmhycy3fEzuaVz%1> z)U6Q!*#zN2+o?>i7sJFrg|9WF%0QH!AVJWoKG03AH?0qr3L&cob(CJ)A&Dqr)31oE zAMOJFeGZBs{mnHhJPiCTpf!ly5X&uHRCxGXH!*-cAp)-SL2C;{zzr-BP`IF-RuvW&mX>XcJ5UTCIWxX=+13V=v!tSVJo2T5yvT79JfRgQT7Zn=@M$ig8kO+tc5&_A;k_LGE#X&~- zAZY9w8nd8I3Z$iN0uB_=*eNJbOyDtVf*dH|krf9-pme&ZfJ_Iq072{d!GYm{JuvV@ zpaaOyAag*G3o52i5&Zv-NK zBfwsY!09Di(HKC;OQ86L`NpHULW7|+4K$n$&uD1TQ4A{dP}~ohOa@P#3)FxUYeF}8 zI4FVH5i}MmP!FER0tG3^YY89+y=Hp70S$4W))!zA@KA@taTm}Qb8rdvtDs>Q@Z1`R z0~)%4F3td@F;GZ>?df*V05#-6Iz2K^f~PPc%acL~gS%b1#LR2&%j+swcNsx9DVbh8Bmf14^;09>a*78ik5l?ar9gA?S4 zZidbl70_*gulYf-V$tm&02Szlht|3BF6rQt|U0?*Vzf)du| z0e4%$@edo1gqs9PFbJy(Kvsc!&=3Vk#zHD$m;l6NNT~>}l|h9ZxK;)+K&rrr9z1*l zQPsQ$yv~H73_Ljtk*&~RDA9%~1{FG>5u;M14vS1PYB4m;qwxqRTfiF6sI3aD+n_*+ zzyqA@!7W_)Ah`s1)&yz1PXf}0a8Z!}kMZ%h8G=iG7tq+0gF^EUrV<^HSrVXzK=Y4( zC2}yHB1jHwI7m(rBnNIxxTr|L{8Ym9dJX6Ev0xjFIKXZb z0jE`PQwuZ}32vH##z#aL_}k_|(<(d<;S`;74kmlo;Ye3y;lrc)A^1S&?0H`nrHRIrgxsM8@1_AB$@JI#?DxsC9 z;Dmy<6eIzhUchNF0g??tlfM$(E-E_U1Ot{afF)*w<{A|p2L3kCb`VgwfJy;qhXg!S z&EFykEou$A9b{BN7uvQSC=rD!^-;0t_T=dFuy_gT0fPm>s#q8pK#N2`0v6DOWx?#o z11_UF9W7phS~eg_a5uuDn-ew{=Kw0M80zK0s{wpe9Kh8ANS6g@<#V@>ib1EN1tbD3 zAmfY`7bxceEelQnRY4xFT|9bQR9HZ1 z5xnLJwgwY4#syLgS||)zYz$8}phija9i;v>6V(76YUTQbn?q$iS3<1VCPg zNP>nlOPF3a!eqgQIYXgoKf7(DnJ z0g8hM3atl9WI$^mJs3*CbIB3lY6i4Q1w6=-@Oo!+jYkjC4fa?bN5LGuw1flylq$>%!6coI0r%t3hLy#oO zt}Owr0_yfrDS`HRDw=ClDj4deL7@#=Z3;G|+eak_)C>fzHGLi5?V^%l>7r6mV+mc7 z3Xy}Xr36jpc891`pf)2ROF7|2$aGHucVDqu01AwVZXcBzXnz5|Jq+w@NZRCYwFFmW zpfM6q!v&-V9KRm?txW&^|9`m;R8BM=0cB!%_C{Ubk^suwpiPhP%Ur6qw zQUIFh0;d8#ASRhM2p`zd^AJD)GcoP$7IW~0TAh<&dWrMtqPy=2oR94iD zW=$t}qlXLVoCy}#nrG1TIe6J#Eoc}#0K5(*2*?c#ue~s} zfuW9gzI0Es=&Ru1s_C1Rl7EJ(Z#9IJ5giq{R`*#oEx znrl=<7|Qg!T~tKCEuriKAeAB>*(Vi116c~7-9riRFu;R~AlHCoJv^WX?SS?}LDnKVQFfcGMmO1YLtuF)R9&l7cRvv_? zcz{xYhhsMnM>h)-xc&m?Tu_M>VClgENnv0fcuyL*)&bT0oZzi2pve`;Ze$N;aFzkB z?0K008F_VKK==YwqJdKfXh)h0USELPF5pZP0d+f8UqBM9NA^iZP+E=v`62?@7vP~I zP_>g_>A?cYKVTlz7vO!N5uoLV;6gb9JOJXO5&`i=M5iMU*cYHs1vS;cP6sWmf+0__}l!Ujgt!KJ|^%{KcMie=md=jffj6mHxOi? zM<}>|1Byg=6vKjpzwI%otc67<*syLFM$o>498g^js@1U8*rVVfxiyWX<67NoSSP@R9N_%eL+2O7ZuQkK=9f?h7!=K$^ym`(BOXo zQ;FJZOPG1!Lh`jOoC_~mHC}_uXpj#PWwgd?@EjFH5LQZq3ry5z7oaO@g5`qy%2tfu_jk{rmqPS6DOgH-m;OyCGp+(p;lb!cfBW zS_vMUo!}Lu(A6C9sxINR8e9cDz`;vUQ9~9|2*MgI;7SH^976!Or2^dz4Dz!Btm*)b zK?gAKw;h32KcGGL;L;DgZ2~g79s<@K0*)8(ehZ|E2ee^?zYTO+D#X}saAncW0Ipg< z8|5H245o6b#vf@d(QX3vkm8 z9K2AUHNFA0hCl@_Xqh8YfeTvl2RF~B*F_~{*9lIL1A4%la3S_}x~PCsX9xp->kJl< zBsdj7RCsi9z=8qX4gv2t0r&L4+xiP&d7uK;zy}WugVwt9Z+Bq?&*@fx7KXd1fa)V~ z|EvO(#Xu@NSV4&gRM3GBi2w=lZ*!>WbWuqGH-eF?|1$6(O9uabaAaUH(nST-P-X&~ z1{oxVnFl$!rJ$1$<`J+FFpoe+1wc*$I|ke)giIY{^-&e5b^%QzgFFRM2RS?g%I==;IAR+#34z<|52A=(cc&!J#^cI)dD1O|DY%s`=kOl`tFUUghcD(K$ zuzUEod2)hA9U<-u|akT z7sw@`rWv|RK-~k7OF#=n2)G2K9pVy@CYVchfOMuo*J>a+iwDVB94`FZA*(n%pnI&b zXwX2?z)6e-8zc=}#ArYXDV!Sk_d}f8ePQPdX2iL8;A#q*2D>5cElZCa(85Vby6kqy zfv#wZC*9#o$|Dp=4aBTxq(a;g-#cLqA4zyvZ%i1i>Llu<&k ze~{~Y96L#2v)7;+AGCZA97vGe+Mp$`(8aGHZ-WLbK?`7uz=Ktwp1umG$qiYc04mwR z{eTjt*Pfszv`6*<@FEKbk8V#6&`|FecnD}9#&tAcu>m@31-jc5VwaB!bhrw9D2|2) z`1~scEC~_Pojil;RT`uhQ0yLe0Bv<+z_#NN9NxsIpXLMX2VXFQ#=$_T2+jkY&;+`< z2DBO70GyT*Nlr_kY71Xl;s=>{@BuR@@(MZ~L4(eOlN0jzJ}A$F$4w=QSd0(62JQNm zIQWAZax9SmD8Bi(u`qV~s7N$FWZwl!(wBdApHe=ElEYDg3jF{bkki1OOvr$&MiJ9% zZ%_(3_<|YIz*m4QNn}w0SJIHPh)@mSI`~9Nw!JXhB0k2UIQ2}k(#B%B+X8d6- znBmz4R0x9u!K26!w1VRQ0no5l0H_%On=nPr6QDJgpab+k>)JXQK^owGae(;6MMVS2 zGd`eGiNJyAf$SS@WWR){XmqfE<`=MK3)K98)i02Y1|H-F2R3N?Ex4HuIi>-ruMZj! z0FSDJj;B*#C=&$be()q63B8O;bfQ5!Pg1szTSy9v!RtS^nA zL(vw{ot~W>(55xCSb%iu5X%fe4OvjzuK5A`PEd*3>7$atzwHEQi1{+8kpZ44fUlyD z04+)YDFY8&gF0H^fol+>88U*(z~8nWG;j?m86h_>L_o{W1W=g?>UN@(M;;(qWfzqI z(DA6Cslsj_l@xBsih~psl@a{gLR3;ZL_oz{0Qd~h0PtLBDR`}>2dEeX%`1cUc!S&s zG7GE?VG>Y|#OsCN zV|7YF)wDTSHKeNaQNd|0sBf_AKLY~;sLlo@1RPB+ANc$;Jdne}JsRJD(imt^33R70 z(x4KkV-3st(Bs1_A)UxF&}ui(gj}bK3Wy2nh(Y_CpzPiWJ!=d?LG|!AGlCbSK=uxR zcZ`Fy@i)H$4VFX9g+w6g1_sb#G>}4Ua*zcF;HU!^CXmTMo8}r78wUQicc8&-7ZnRj z7Zsbb5YPa`36Mw#=m0k#6-X_JTo8Z`-Ul5B30eUR9++|g7u=xMzKx}eic2x*RAd)W z*#Ob|`VJ@-K}(*&H86O9R|A&5Ku0gzz}tu}Q1d`{dVnSSg8UAd9|0YG>3~qt8={io(QCu#(ftW(0;uo< zC7^DG|0h62FNodA_}UzHaH|gV7-jHr)6$>`UQi@=PXP~1K;^(CFt`{fUU`fz<-YzPTTCm0e zltNS>9eY?ivh_fTI%ssu10<)=9ioET?*f+_pn9I|HPh?$uP1;S%9xoJwQ9!GKLSl# zgVs?Z4+nszUBRcRSfGlcs6*{gLn~BJUjdPb1mKCtMMVI5COb;601@KwQU%og$J0M> z5C9$d13La(4YI)*+&ED10G-F(>%s_b9Dt{l!H1M~dI%sNl8LYm(tbg)6zj%z@LA^Y zgRnp`9pKS?KmgP_&;T`x6A%IP17n5cacl=+L*0O@J%ZI0psq#*0QmBGf87Y7k`@^P) zBA{kNTGSvO$lI_b5Z$2h4#@eWU>`u!lm%{+nO=j(!9mt`hk$kv`lvvzCjgZ?;F6|< z>9r)5kOS>IfsCdQ*^~mOP(=Df$s|Oy@f|=%8G^Tafi?j_cJzQF1X}Qc0v`=(#{%XP^Au1gK9OhN^j8FJPar*k(`9A5_D8p1w)M#l9}LnEr@qO zDsfdpNL>_gxWfo={|Y7Ov6kVG5*fDg02H*KvKzd{%mJ1knIW06&#@Kr3zZ%Q=^i>Smukh zIRI*BWni=cu7Kmb1a#Dw2dE1KKI#j+KM9n>J3*(%f+o(g4}iCYB|tm{Dl5SW7kW|? z$Qhs+N^pw}w6?c^fxi!SNJs+o#0&?Rs~C5Jj;{kR^@0_api12VR2)~hbh9vljq4Tx zkDx#rMx8Dyp!{ILP-2V46j1U<(FeIq3!FVbW+g!42Xq;k2V@Z`yz>j|uOp=={F}JD z!L!iNo2EcT4rpc#TrxwOgP_>pZ@mld)j}GGF#k920XM@K%i>{vKxwWC<7%c|glc3c z0d4sPWlV5HfsRuKaX^;C&YOia_`4yL2RPE8?fzaDMo6&&Dy~7z#^wqEM*dbVM({xu z;0S*$2a0lV>l|ExfSQhwdqW_tThO6!%>2EelPf?CRS%C|mzD_Fp;fRr1)tLc(%H?! z1&)A&KR~;@K_xs)2?MAoM^gf7%z`F{!8J5EH9#leT)GcJMiSu#2E1~wd+GE4|9@Cm zGQo^z+yzNqpwo(6R2)FX1*pzv0Uf5w6VV+a0$yc@X`KFRZRFhH(+iI2T`QRx7{*4`5GQ zbb}XVd%y(29)k*kf&!G_JU|UD(3KS>@PY~@d&+|jAP21*0;vP-F#_FdfmG0ddsIhX zf+7}X4a9Ef&=qLB8536oK$253A1FQgB!2942cw}>Y zKvC!c3VN(2;SG9llLo2k!ExUds16H&EJ1}drb|n}Ldba?)cFEu0|S`T!Ku#xl4d}O z9F*UYdpl60G-2w&X$+rwP(uw%zYUbA!RMc0ZHDav)m5OjDWoDtZ|q>He{lo?tegjX zE1{c*5mvjv%6*1T7asWKQee+uQ^g2U1-cbL!x21Ggx-xsEx4PpTtP*^zu?^<-SBoN z>R13M!hOJ*zY}y&E@B|1@eOF9257htbQ}-Ta3N?x0P0S3@NgSsM>lkI@OX>L7Emhy zbe2A(jlsa*2O3w0HUyx%#hdqlH;oI_fm#lrqx3)%9LHN!_CWQ5hsZ&k|DZbvK@8}| z@rw^EA*yPfK!@0XWI**bc<&@jV|NeOc2Kd{32_Ki1QtP{gJ(c`I$e4UUe7_cP_P?f zE@=HCgoRuH~6aA_{=xq{+ni~{P@rObCiaZ$@7+4r&85kHq^HeMh zx}Z83ECyP?;|yjQGcqthSfC~MZeX!SW(EdvFzY!p149&;#m)j_#jwC+Ggu%Ob+a&3 zut2W%W?|@Hfn31N!T?%q2)aU@g<%B?+Fqnc_pE(#9?7%E(P6h^hFiW44fdRB&lZC;V zlYzkzEEdkmz~BUCWpgqxSbXqr)a`R$n?12~njFkBXbnesr0fdO<71q;JdA($!OL}BrkDF%zJRygZ| zI0J(!*yJS=3=E+1hJ}Gq5~eO&ih%)iM=J|MjT8feF<9MWX$A(+!~_e&3u%~Jen`W@ zxkmI4hzEzIP14OEEW_MV5}+1uyp@H85VwKDlk^MIs*gf z!Y&qur*KxT1_J}A9n8XTOoM^J5^V2f4F(1?Fe^lpfdRChmxbXeob^+af#D=r_Maxq zAHR$k7^J{r3MLE;hG3SX2?K*InAHszTLTvpw1kCK9Gul<3Cjz=En#8rVGVQr6I+;$ zJ$5kGetVb>J_lGBs5>w)+yvXJ;{bD?jRP#4S2)7-{)V#@oMEm{b%x0*fbzWx`qAaMn6F>%Tut-Ks#CKcs>f7(mCYvoMr| zFfh1+ee@5`G6`j1a0iQ}!dcVctmAOj<4~C29)&S5yaDTY9tH~+?{EeNb+Fi)a0Uj@ zBpVCE{%{5cWw6+#a0Uj@A}$t&Z{Z9KnqaX_5is{vN5W!ec_ahFU$E?&NSMjmQ49>; zV6jJ0FdfIEVLHA=Gcd4$bM5bFm=60`1_nQ{4$U|Q2467CE)J%bJ07OjJf49;7_8SO z9;SD9JOe{8SVvO=0|V$B8Wx6=2@DKUV0GsbVCvKo85lyr>iiR7wk=FzV2}r^Tb2Y< zr=JRw%}!-t0G%Dq!jPWEz#s_%w%AQ0kdo}VLtNAWMBZ*g)9ty znJ|;rWHK?*oRyQyzyLZtf`y?l7iRLoT$n$u=Q1!vg6(k3V_=8| zvtr<^{dur3y^zPikOg+%)jU|3Hsmuf#DjHg&1Yc92Fvcshsg>Qz)Fkw0+=bq1q=*1 zV09G*Fm=|23=Gm>Q{v#P&O(^UHwqaTKu0gIFuW^dV8{jQ{agss`>T+FArCCZS;WAg z1U5ywh=Cy=ET&KdQ)gMkz~BuQvnzsyfnO1<^m$kWi!GsI7)zs=fdO={HVcD!G0fzD z#V~)!l`t@XuE%C!P%eSlkzK;T5C?X_W;m;|6sBWlDFXxOdTbVkd8IHNPfB4r^vYnY zi)9Q9iC|M0%V8|fat4MZu-MFUSXk|cvtE=lFeHOzKb12uM1g(zy&UFC%LVArY+iMY-`09HnNPGvzxQ7XvU zV0ln0=?0iZ9s#lyS!ZfdQGO9<7cR0O0|P^1PG))@1FUX9lO%x)8dL-==OsZ4ic(_T z3-br0C4*uFNu1)6qWrw{;&@Q20i=-y9Md2c1cP!IY`_&FLR%6&g~0rYD_kIT2l;M- zv<1l5kIP-S#3{9pQvK-e%1tcJ2KgSBIH>&z-oyq{Lps^H2a8FJY zEC#Yy5X=I_05_Ngs{6RWEKsTjU)ae2+DkJREC!lP0$rxT$N;JzSA)esHSRVrD}s@M zVLO-wYO8>T&lnjxK=WQ;u^WsG4A;S|7mN%Hppyg{86ub%z$P&=6fiL`yavm5FflN^ z0<%sqF);iFvpAR;82*4+3d{@)tc;-Jkt~=Q7(g`#BSQr<1A`z~YzH#~gAkZ?fti5; zba*Et18CzJ$c>B)8Y~P9vS3-zh>skY)xg5Q0GiNc1dsEmfW>aGFfbT`S)h>|(D)uB zc>Kl^ECw3C0Ua31$gqQzfx!wac7v6H!4AxlU}Ipg2eUNT7#KXktPC~=1}`wHfsKJ7 z63m*x#=rmyFGhwNYzz$XU@-}H1_sc6a7KoL;*3mi76C;i0|SU34-$zlNleN~jW0?~ z&M!)_Qpn6JOU%hkQ2M$S@i(h!#K`Qvu3+AU#6dsCtFi z3K*4`82E~~AmT;b1&qc_3^JcY3mDay82B%77cikgt^!Fbken7+4&*b?G82e;A+Q+OFPpdu7$@2q#1=6L_p^0GBJpK;s^UlL`VPYM5XwP_+mV1L*_}(1U0Y232?<8iYaX(m^x`gF1*H z8iYZY7J_IHo(3YI7@1uQTG#;<&wq$!zNWha_Jxfia`@YP$qb255@-f9-$o2jb>0L z!(Sx3K!bBIanPV9j9ms}FhC}SVBBgX_kbrRN!piJ1XZx`5os3@+s$EKr|yG1y0-?jdNhmzkl40Wu-S%mC^rflfYV zW&mC71)36M2A35O7AO>#gY|+!3^WnQ%mDH~gaz`=O0X=bV*~2`K+0MO3v{{SI;>xuO~Zrg0%nFU3=9kq7HHwXey}X4^8|`*W>C)wJi*5d?mQg?%W^P6ruCQ^ zc;GD1{cWJ~iJ3u!5i&K*%mC^}fhLJT?GpxuqhP(D+1E8Cfm>FCcA(Pn544{?_ zXgZsj!H1Cn9CFMIprf8a6Wh!TA&ihIZf0Jr%A7)HosH#4|H1?to?Gk{L)1BEp+ zcp4Wp0nQ8_{)ezYUDjJ*y(Ns0NpWTdP~Hbkk25pWFfxGSgqfiMy3l}`p#{zYb#m{4 z_4Y7AhI5%2Kv$K4au74a6h;OHP%JVtfVOCX%2;NGIgF6$I%WpYSxlfhjhSHyBLf3y z;Q}+m3OH*GBLg_znHe@PLMHQ=8MeS#poKNh!1nF|Ez$$C4!~JQ7$IvZnHf$nGBAJ^ zQ7|)rYBUJz0wV*%Td)FCs21)OEW#K6D=mUUoa08cS8Gq}K6pn9DhEbGGrnFM2I09}0s znhs-T2w`Gi-~`KphBH9rA~Qn_6J$z|nIVCRfq@$=o5BQ{7-MG0fU|O#7#MiLvY-JF z&{Q8YLkSaP(vO*;f{B5FA1n)M{edPgnHd_GAk&!43@uCy;JnGq02(p@4N5aJ^e{oD z;g}gFFflNQf%Q&df=uu+Gl1GQptc1w!yG0C25GSD0w&0mATz@fIBNwH0|O{uGc&AV zf=o&>Gi-pfwlFa;D1r5Y&Yl7dwlOp8VS-FqGBX@tVqj1Q%N}8ZOy)5&fZAQ4X+36! zGfWH&parGO3>TOn3vrkkuE1G0m>3we!FoZh1JLvzGs6QW$V4DB!xJV322jh9nc)Q! zWWtb{;SHSifr)`ZAFTHa6J*+qnc)YV^@oW8T<$P~5&(E&jG2Lj88Xeq%m5l*0^PF3 z%)rA8nd)O^5P-8pm>Iz36ElMZGi3UYnL!550u4wxg6&mdhD?z$GibnBI?N0V&R|&s zX2{eRGlL171scL~1AqcD&G_VG$ ztC<;Um?2A=m>C+F8NekjGeZkAWZ4umLkFDI!_2@C2G%=)8M1(inPCc?HG`Rf0kmJ8 znPCnyWU&-8!vZ)9bPQcASnmpE$g(MBhBa{322iMhWnnEU5Dl6>LuyztFfinUhY3@U z-R!)kZQXyf>%LB8mTUHAmdE!muE>{?(A9KwUNQeqzxk{sl}S01G}nkvJYl<)p@%iJ zCN*@={D<@Z@+HUIH(noF@O5D$cNL5V*#*K5$@#ejdYLIU=`4)@|AP{fLt1KLiJpPM z1V)Aih=^VaXppQd6{H^IHfGS89}ou#>!qY7m8PqJvNWhbWMF12*}%ZS1}dZAs-S8> z8Jhvr;b3M2GvV?ehF(c(MTtr-C>X%)NoGdTDo9Bty4DiZgaj!9PscKVGcpT<0@y4_ zUm_tKwB!sX0-CT^h(Hzr)y)nlA|MARz(w?mQW8r*^TP}b4501{Gou1Kq@Ct*Bp<0` zkqLDLSPhsBYR`eDOh6(`40;G-7(m@DW=2(zhZz_cm-07s)PAs|z9sa-myDd`L!7emOz}#1aQ3C2&l_ z;!6+O#zDj>sKo>tKt_mwhL}Mm1wsV0unv^x5F()VjsXjDyo1^^7f?h%?Ue#nh#E*D zT@7*%7eoXSS)evZ1BwW!jgi2OtOhhH@c~5y6iE|!k<~~uF)$?XA&clUF)%a;B8!0P z;RnLVBI%$yOB7k8m5G7j0E!5xCKQlCR{v;FgRo&tN99Y zA&Lk$8w0}!6cJ@M28M!6WLw8yDMA+6$Hu^rP>d{c4y3CDS>z!|O&PMt2Q~%qz(e;_p|B0TI2 z3<4F%YNXg17y?j4G}%EZ4TM4EDu}kl5b?$kiNp}eLJ?7Mt;j4Teg21H~SR^<*vp~hzGzna`fJGo`jNfX)%mKNuiJgHVSsNyz;s>hV zO$^r{M8M{l7~KVz8z6H)y877}7^J|t8ziCvR%2wm6P%a9B4E2r8Ct=)30Y(%I2Ry` zaDvk_Ld1+=1Dc4T;Z$%6N2oC}xSa-fGuSRe!(HI?j8J33@EV*l5h8}B53cnqAPkVPE9DGDT_SAl3=fFhEa5!CkpwLE&+ zCxg}+fdY_$fnfnil7WE%L@_hy6(Dqh#^;zBw=gq+d(4eW)qPMc3=9nWLCP5zz*Fsz zdhjkgga?v~Aj^~yYW$%h2sNo3kfr$uHB}s-)(Fha zAfqR6K$c@8)GXzIEYU@na}c^^0HNj%R2M?c4-N+KxF14|Feju>3ko@izjQbu{UL;i z8z%#J_5vZ2#0gnYjxf2B6VgXTnB30^>8~Tytbm$~P;&sP3!&x?C#08vQ1hJ=(l11) zk>p}v0F5Fd)L3yr`ceor5nK%5u|$NLQZ9(e2sJaf7#Kh!iU>8kxEL5fZA64mZ*W1z zrVt|Exgg8=5h4=Y3=E(KD#BzFZUzQWdlX@^KQ{w-yc40Ogqs1p2m_&J1~!Vsaxo0owBG}?(! zlgJD47eY-XFJ!?8LJg>m3GyjI%{pEN2GGbSLd|JjNDLy>yyS(9u^`m2@j(`8AVNc) zj{!U?h!C;lgKQN+h=lS%{Ejd=hYvEwf-t#>58`)(nk9S;44@HIgqov#kOle(HShTt zz~iV0H4^*`;4xr?8e4t_@MtPRO(H+In+z@MK;=dYKO~kBYL@Xs!Uti_C4L45(8wx6 z&0l^72GEEj!l&8-4B&B7gh-?S0|TfhfDq{rU;vMwAw+fxFff2p9m1}s0+297*d-vy z03KsTsIeAgU;y=A5Nc8d8NegW2sLejkk~<}StbYxF@%~Uf(#6xkz0hChk}q0L#X*H z$N(O{MW~Swf`k}CjhPSwcoY|*CRhlv%m<++Ux)!bmWxo+B?L)P2sO)u7#KjkDTJDX zAT>Cz zP?Imr03HEHsA&^sU;vE_Bh<_hW&n?fBh>5{W?%q~4#=rm?$401`D#pM7nk_)6 z*&xOMUe1S5b4rW>JSK|p#Y>PHl#u5XXJ7!0@gdY`i!(5Q<{S_vdx$eIfJVX*CZ~u) z(ilQbgE#|tJRG5Bwm1XB0TjD-h%+!eKoPkn&cJX2MdX_}0|RI#17WhD1Oo$T1OZ{P zwgdwMXe|K3%{~$g3<@mB`7}?0fgu4!WRe5}cs>MS@!sPQ3kTj1_^F@LI zJQ|NsBO%GaP=I2xnIr?l1Qd}_Ne1wyR)h=7BpDb$vn&XcCrL6efJX8WCa;xb0ME4` z)SQ)MU;vHhBhUtF@QJZB7CtPWEYB0FG(>l2(TiD{C6n^@C*;aWN~Q*2GHyP!eldPNZvuH zi3IKbVTQEeA+6kMX$A%b6qDylGcbU*_9EP~Uz&lz07cCsX$FQ3C?f1K3=H6zBzS3~ zF2ewxaX`4oO@@Kt0E(_m83u+6C?dTw3=9Hn$UfaH1F26DzPKU-DK`)%f02RYZiE_M zSq28soCQLSsw@L|z6znnS{70wA=CuOGJxl=5Ngt785ltG7YH@gvJ4C-P~1FCmVrS5 z#m$>QcAdAog<^85JOcx0HV&btTAl$sw}Not1bGIA z4iuAD$}=!rKoL1C&%hwSj+~C330nNT6i5QuffO=%eA{Hi~o)kjF+|0m^))raB%mOr@iY#Jj2%4FMi0BoS zB&&G(f=(D<-~{Dv@EuH`0dh$2Kt{|N7-XO!23ErW))fNL1)g=sq00!W3#1S`?p>pO*?-)0|oq4_f98TKWxMavqpVlv1g&_d_bqWIkWl+v8k_~e|#;$jB3 zka*wH9GA>8D9bIg0>pC3EQ7Lw@=NnlKl1k1m z%1bSZ&o9bM%_~VP$;{6~63r}*Ps>Rx0omf4T3no%4t5%by452)5C_+?}7-5RR7egl&6y#KbLL00mKEEur zC?~N1Apl;y4U0UK1^y|i;I;LMB@kDF!W+7#z6iWk0No6TD0uBXx)dxiK->Va5@t9; z1AL`@d|_!~UP)$EYJ5&=9>Oem2*np?rliKFq~??)B4i;OAJH}`fCa&}f>T_4I%rpB zJZQePv?Mh?GcPSCH5nA6$g<#Y2AKm>mXcWnwg#d(CqFSIz92s{uLN0Babj62rYPLs z5Unr+Q!7e}Qge~q4hfO8%)FF%$Ua6)qX2l8gOwvGsUZJA(l$&iFSQ(&eV}O-8k^uW02NBjD=sYpC2C|r zNY;n#9f9crZA^$qs0VXPQj1IClQKb$0jJ&g0t#q|J0QYf=YeCiI5inv4|q2WD1;zB0b2(a1C@jzaYP=3xfUS; zP0jHLk<`2tu+^wKi&8;O1KEHo4ig0h71-4XgA!9x;vw5$P_=->p_@5SB~tTJKmwpb zsW?8r09;H!d7#ZS2swzU#>fI-_aO-w!JG;)t;7h)Mu<>yPJVGJ1H9}7+Xv@??Sq%W z5II5rzvp545y-1QsTA|q*Ubi7>#E^n( zgGMAcy}>o02%;+mCsuT&5J9L?cywWg09GlOHdstz(S}6|wc1rFDoOTB%uQ7>K%_Qs zeGHNaODu9pEl$QF<5rZIo9Y5u1cQh{sPDnL5uuMN3Ux9lxI|;kr(9|FW5u%7iX;UE?gG&XH zAz;^FZG9n`gIf_iw85=0Yyl0IzzAcw44&WxtHB6as3^KOATbV>gybF!jaXD58G_o9 zLvBGLg#{i(7)GIIH;7({D3W4W+Y!_lMY0J+7)d$A6y&xlk|r#Y7+R4Vv=~~EB|)(Z zF%XoB(P9@>0y%b3Ww6ICLJe{xA&X)-8x|h0CN_rCF%%#f0Zzh@=*QCBMlyT^pZZ+5q0#%%_);E%)kc>f5fnf-^afr1`fMFVLrO44?^+w4qBu(l8{<@>0t& z(kqG#YHCA~!j-b%ijYGK<_J(%7106%*F~^VG`N#dMd6-=34;n;gwd#?aK)gqDzym9 z2prrN+$yjc0w1fxrXL}RRV!>j535$VBwQ=lN6=0?q(X$XN-<=h4R5GoNVgg#K9O}G zq!E#dT^?J^VyZ-o0~ALflO=&1+EKM*NY4}k`cK=F^& zJ1|M?o`J~{@(M^Dc8`E%P~8KKt74pPLRNs?UC1g3xecZkyZaEbSc4jzbivIK@NgPh zGKItyni^Ekf``{|`V=mU-J5V}LVg4*#O^_;6jtAX<-lWqSUrX$jnIzhFrwuubO~%) z(5fti7Kj8kE$~4`gcA|k;F1N!NaK>=5k7F~hZ^t*eW)ss0w0$WtPy}sF;XO8m&WEt zP$C3p;-t)yVyq^hszC8AXpj^#%!$jlSX6*o*+?OVssd|xpei8{9tg!)eS;*8;T7oU zD?YyKEQmr#k^oB~1rmlF*1$ngh2aFK$(VjCF$Cu;EE=HV=sqlgjJ=}=2TT}K zIXoUvT7t##h(UX_Hg$14Wbhu{3aBX52KW##c=#Tw7F7_=1H}qbcw>me0vkgDGo(?J zz(Ng85avSIXfuinQ3T<05Fi&KSFV^6a5usXfNR0xNE9`2SE7ohmBg16B_@MrY|Bz} z(55%QixNOf8Nd@EuxSpkC}^ny^6Um=UV}^D#K=Se2^g9hnHicGo0=OU2`VTk7#bLu znVBgl7#o`yni_%R61Y;@_!xqvzDNBDW?|p~t)*aKU_jnJ3tGScx&r~U6(7WgV=e&( z==NC9j#RL)&kjb0SSALBmEfCD7#N;_Hc&ALI6>9H_s)VC6Tc!BXMi+2fYc#vW(A3X z4%2`7m6748B4qi7EqJ?SfCKWDTadbE<%|sOdQ1$u%OK0eqS--PG6E8iH?@M)ows6O z*!>=&2E+$p2Zn$H$lFsuVjAoW3|(3*44Vu=`|2PEC^#?}I3RCG0jaCtWMD8cVqsWg z4N(`z1UmA{`fFw`M7%z%`F77Eos)qwaQ3^5N=T?;mKNXuG4dO=5C^`NN(om-)x zprG&K>gE{g6XN6PWToWe>E!Gi;-UmvhRFarr2@2(){=n{bkZe*E9L=v`AJ#DF%@Pe zF)pAj*$Tm+bt9l7_YzAh^zxIk7_1m<1VN|RTwoAp;A5~!XN1$fnaM@@#rbI^3K~J0 z3jPHpnYo!&po0sY^K%O_b5e^K!1jZVjx}U(1KSVs2nd5t1_2%14?5Mv2()AhB**|> zniA|3pJ{Ai#vsEWBmi1E1(87}6&wT^_!tBQK}SuLGB7asGgdGNF$fBRjtc^9;`V1O z&qyswWng0P2U+@w0kQ)JW(3G?(AsTKG=omu0g2}`GBkkPQ_RTF06H6}l#!tUbXHFp zBSQly3@T8F*JZqqf%mGXqX7P ztcHo90d#4KDicEk=o}$6CWZ#kIX~)53=PK^7#K8}7#cu3QnZ*LVcd)*j6oLyfUZ^n zonRG=HH^Uxdr%mI4lx2b7Y#$h7?hGQ!Wa}zC}9i_6VO>fFoQsD0EG#1deLWMXaKp( zfC-XLjF}i3KyEaF`h}YbbUg@adilfx5@TQh(NS3a0*-!g!UydIf!U8ly9zRJF<1$L zcJ25xGBWTo@PHCHOaU5~pMe!7tK#ElY{-BrU}T9dV1_PWf-Yc$E?|HrU}%9ZV2UCD z+R_L~qM(EQkkh;XgPp!LJ~MAYhlDN$QsabUZ8`={24)OwnQ12VZj7GVg+>E69Z^3 zqM#sX$6Ku;I3Hys7Nw@dmnG&DGazdKRi>bGKo~$r`3MSv4m*H2A&-HHfeniN1sOp3 z475K37FD1$07_G!6P!SMJ3!*`%#i$*z|7D9ItM9{nV|uc_L7(x8bB92q%t!!fKG?Y zU}k6lo$`^%%+S!wz`&5r%+LTjzafX2q2VF}14AA&Lj&mSq5@`y29Re;nHd^Dr;b!G zGcH$;=E5eM}6Xb5RC*enHd-s zGcz=#GBYqNVP~*r#LU339OO@C28Pwl3=RFv3=Hd-85%$A{mcvvKbRR9jxaMc{AFffIL^$_pv(f^N710q!oYBfnV}(+g@NHTGebin3j@Ph zW`>4L76yj%%nS{=pc4X^A>|%ur-~I?{RmoZ3p&vaMEhecD~eJRq3ID+_#v0!ptJiWY7mSOj-w z2c06!2WsUpfQt`AQG+NxKnsb{DhNoX=3}rF1f8A*3TJjX(E4wGK~NqCmCPV95C+8^ zD362c3DEg-AhB{rh6Yf)RxmO&fbxDVBSQn|JhD1Qh6a$^8yFcHK;CI)gw&yJj0_E+ zD_7eYA$4dcBSQn|G`wy`h6d2-bUloaI<$|Gp#gNp8t4=rke{Y9GBkh=_@2qg&;U9^ zX*MH61L%3u~F)}o`GJ*Gaf%EuwMuvtkCI*I`j0_D?ObiUWpzWr844{+s zQ0qa^8FrvHmK!4jLjcyaotIis5)Y~ZKuH@^bAy5o4MXd7P@rKXJ5aQNQjI@jPG(*z zI2nN2SfIlpAZ0!%setMaL}df3EKm{}xH$kWyFvSHVGaPf9~7_B43Pb*An}9HcH<#N zh6d2Ng@+j#8bEE^W1#S70Pi_$0A1X4nvtOabQ0JZMurAZ`a8!6Da+3@GBngNFfd$Z zWM}~GhQ11l7X}7~>x>Kypd539k)dG`0|UcNMurB^IgNK185%&x&);WcXaF5P|A3L9 z0d(^0BSwY>(CLAX85tTt?b7Fr3=NzE+>=|QKYMI+)bAQ-fuuPi>eq^Kl62i%Im z9d&$2Z4;-&6mUKVMP;@SsIW*bEh^400_RF_RI-5tAU}yl{kDkrI(6F8Xe3cNmjgZg4&;UBIv4DZ00d(0w zAp@k%P{II752XwY4WKq?1p}lUsbpYi0G+o~&A`wA@?Zl4L&Hi?TY&-6R%m8mXgCgP zD=;uL+y=E37#JErSCe-zFf{yUWMJrIU}ylH?$ylzDL;A`7#ie3Z3PB~2GALW6F~lC z0-sd{ZaYk7U}#7MwFwv)8uCDG0tSW#&}o1(85kPsn7}6nfZGmp85kNs>2Mwcq%PeG zK6Mtgym`(5xvcFW0|P@0W_k_D_slB+Cs$Ac1O+}ChL$v-RELo~LA^9cN`j;tP{9I9 z_3(59PH&)?gs3V2cjG{H9)zDuORWI3=9pRrt2~W zh6YgjT*JW706LL$Ei@ghXMnU7H!wiTmrV=|4WP5ewlFX>fKI;N#=y`pnE`xF1-Sg! z$-vM6y0T&y1EgNr%K)iQ_A@XvfX*mA01a2rc#$buIl#&aDF^7zFp{W$8B`EkAp+_lW5g1A9~qRpK`kao zEEVLJrxwMRq~yBRZ4P2ExYz)dBxvaXR1|?4KTy4?$(gx{ISkSaf`Xu`1ELq~s8V>iAQwKM zQ&gcRk%JryI-C=^@Ih7zYGN#c4C{gX0ZRA~OH(Tf^7B&jN|1^xaCrqfNfH)$pm+zR zOHkh*bP^ay{5Z6{IswYZ3=9mXq2<*X28IUEiLYltU9Q&hIUYW2P$V67#MCdK6HpsKC$#Z0GBkirI^_qo^O(SwG&X=DLV}T@0dy9d6eB~! zPRQA$4WP3^Wf>V7K&OJrF)}pVXJTMbWMpV~2|0hX0d(T0G9yF7FDCH05DkpX;7b)7 z#F@coj5dJwwrVpnG#D|1PtjVg{cS+ThL%J}aUDbUvOT$eqmKs}mdI znHd;N85tTfnHd<&7#SM!m>C$%85tVNnHd-?85tTt*9u!RGBkiry|iIuXy|2TV6bIm zXqd|kz67RWKIkksMo1saiIJfJbSaH9BSXV3W(EdVMuvtXkaIm7t}ruzPBw11#|*wG zrr{+s_*%e*pUmJ&v;lNgu^%Ht0}l)MoQVb*76yhuPvbEZv4BrNZ`cRA z^q7&M;Q$Nx+QfzzEZ}Pq8(y)1uQ&vc|AEemwLvTYRxv`(dIX(Y9EVx{IR-m>dU~W* zxTGfMr=)_5K~NS3D8=E3=N<(02{{yo#1PUmR3L~ zf`j}HvM(Mpt+=LEq$UqQLIG7mpu)cp+`=wSO@*Wc+-av6Z%P4;hJkt~(9Sp_iIpYh zfHfl0P7-R`0rhb}X#|8pVFgM%piw!{+4UeX(D*7S{LGjb8bBw_Su;WE65PJ3#$XF0 z6*Mguw6iodF*hDO#s%7|4H^dkIUA}3nSurys7yo&G*C+%6q1lGK4@$Sxd8;ap#yXh zI0FNGEEy?uL1R3S@f^@C1u)w{?gfRfI0FOtZUc}ws6PbqLp`+p1L_xn?mTFOhA*gJ z1UkFDm4TrFWM4Z2q<`PVz|a741E@a)x^n^49|E1P+Xrob_cJgwfNl@~^@~95@QDlz z4WKzFP`~It1NihYaJy$J149F7&So04oj!vB($5F=lm0U>FwACPXaL;?1L`M%!Wq_2 z0^Qz$FCF_~O~>H)C@ukAP6kfLRE?5G2FNk(_@V^d7A2JCmq63}3TT|HWMF6j#mOpY zoPhdFpf~~bl|XT_5gI3;J`yNSKz$_8n96nrh6d1O^g9?B8g@bMr~uDb?Pg$T0Ntao zhk>C1bdBFWP@k890d%q)IL#k~#s%o68zZ!O;3~8)3c9%`5H*ZT^0QO(GOHjh1>7ME zO4p#oE(4w$1PzjbL=d$ObiVm(^!}w{YOxp2fF=)or$3VbpHki6J$J+lZl}L zR330MLDDZT6GH>YuYAz*6I7OSCpzs0JhM>+HNZg7E z5vNUlR_XMx-V#n8DyQ0)nt8$=%HhtIl!ZXQPo9Z*n!QWK<< z1f?cW+CdD3=YfkyP-=uvwSj6QP^*+%4m2uPk_{eX1EmcR_Gc`~EdYyvLJ}0KkO5cZ zvKKTy1)8^FfQ-9?s(6T2#JD@?@+*vScVsg_V^5&lSfCSipi5_}!LeD4G*JhcfdeId zaJk`u6mFm}2gNPumLSmGE1)n0)%~D&0M-4Vv9%y3h6Ye4I*f^-0d$ysI1@ud76SuA zBs5N=m>3#Bw<*OiF*JZ~i;81{%*TP+3ZOD71=_|)WrDOzGng0}KyJ=uVrVD@O@A^m zG}JRPFcg9GF)}a|GchzwVq{<_WrB>Ym4osYBlr}zhKr0043$g_4Nn;v7^;{U8h(Q2 z@0b`Gc$pX&YC!YzObiUQObiW1ObiV5ObiX4pcBKH7#b3p7#JFv7#b>>7#NyB^YTm# z49y_(nHU&anHU;YGcho9f#&6z7#O-i_JPLam>3%NgXZg)7#a?O=IcQ7^`NmhCWeNG zps_e;UIvXbqt_vzF-K6WgCZ~tH7$d7vn3X#g41z)L1JbRq%8z0r$C{PhM`M5Kq-$0 zT+$_i8<3!c2jM4yQyEAXFE}A)7eMBrKy53?B9Khbg`kFDWuPn!Q)UDnYzDPNk(3!h ziU4pr0rfRN=7KQDKcIBN%>X$y6(qI@S_Uj;VrT%31uucFi&)0Q&;Y7emNPLlfQq42 z(DbsJiJ<|sB54g1LqjbC1H)P-h6Yesx1Nci0TfOfpyA2L1iEJkb?g$vfEPBP8;__}*uWwW9Gjrh z0)**R*oZMPfUkan7FeJj4%B*3m5tI@2HlWW2Z;kvK?>?RLzEUVNH7Qrg32k(1qG0D z3exCgV1T4Sh#BDM1I0Zk4T9<$&>c=7!L86Vw~Yxh53mbbR_%k9Rr{f7?;y0SIs`4N zjzG(*W1unzG%p3}!!j^{?xg|uht5LFsteGv>Jk%V-2W;QLj%ZP_d#ivk%8eM6GOu^ zMh1pQObiXP85uweCmJ>}GB7*?l@*K(49}Su8g7B^Ut(ftc*n@V@REt4feCc6F%v@r z=$@k2Aaj`*K=;=)7&9?2ya(kSCI*HNObiW4ObiSknHU;CcLRN9f{gorVPa?i&8L0^ zm61#gpqp(PRxvR!`~>A4CI*JTAa{fAFaoVf09|s!%+R35%)r3L%+LV3-H;QyW`Kv8 zp+S$Cfq{>ip}`n*Z89@MgCFS9WawNxXq*SVeFB=R0k!c#bOg>k2wv2OzkPz1&(OGN z*$#cVj-deq@_4t8p9LBpbt)g83qd6jMlJ-keh^hYXc-x(7>1-&NG%L%7=Q{}P+<oP;(rq;07KT8F{_K8FuH=WWakX=9o(L;CU-%#gVXYi3BF z-Ub?%pni`nTKgMxw-#ug4b&%%#1fZ9(7rn4s3mZ73wL`HImU2@H>ex{H$cHNmU-ZE z093_5LmPCC64W+On1kX05i=kW)L1}n1c71^)S!lzOQ5L(h@s%F1bl!66lb8>4p4l7 zFenT_afZCc&zTvr?$Lu8GC%DFTBE|iz~IdcS&!hu3|Zsn%goRKTF>dv%+LU`IuNvm zh5>v6A$VOvC^W9Zm>C*Cck4wmGcZf;3H#7RLhbaNtT z_bDi2fm)Ox_oHEKlSrTx4GQD4;1y=zoloG|WKj195=7v|`QVlSC}>dHnjp=f8DWS* zNOk}veo#0f&(DF}4Qiht&(C>5`<#9ZkZ~%128ISuUptV2p#d~E8O#6)mk;cXDg8J{Ed0)_&Wh?_j1L*v}I0l9W(531Lp!pO=@O@k0 zeg!D4qlYVKJ{HtIImpPskc=f<6H_3QbD%tm7N#JsgCID_K*=9D7(q!A6cdop$xNvL z2O_AHVFvfG@{_VslOfAcL8%@xQk;{TmtK;AQd5Ffeu8Fr7#J8pQ&6C^3@K~!Qp@9u zLH%G*Jbj#=E1>LL)>i>gW2AUfM&7FhhMAtGfFo62`puR0= zZWPq^1@-emb8bf&AY+HepmXM+xiHY2(@E%D(?Q8$of0bTo@=0Z$QTtK$;5jnC!F#{S}fJ_VI=cL4gS6qN%20e#>CMH0!g_4y(*#_L6 z0cA3nl_0l*;sm+;0nNvO+z*gW`CgLYJZ{QX#W`)8o*as$Y0P)7we*1!sy>tbMF0L>|a!i19%GS|<| z2)?KXbXREuXk7qkP7yS2#RpvrBmng*DBoD4`4zNQ0OVIt?B$^N72KVGRey+~YEYEI z9En6jM_WKnZUdLG5bfYz6sY_HNx+nY>;&;a8!1geQ4B9OT_P&NQXIVhk}R@Fn=@St17Kz;>bkRL!{09yM8x=R%#_8%I*pfNR2 z+a5Hg2AbPoV`69krFqa;8ptDD&~^5pF*VRw9B3>Jbo;mfs4dRGz#s^1%Y)YGgW6RR zObiX6@=B74p#gL!uMDU^54uZ^iJ<{>J1l6OKIn2f&^mq4f@KvZ$ov>+eLiUIAZUF) zs2!}q#Lyti$iM)a*8=tBbeI?#K;;)`?Yk2r1A`%`&%wyRV8q1G0BTQw*1m&oBLL0O zOk`wWFo*ULESVUOvGBGrOZoUMK&-`Oz0Np#qyW|z!qrv;T#iWZ4k(wTx@BpB%i2cg*6p{(g&yxoCD4wkkpAiWg(@a z+@#bLaK($B+Tdj==q6lH`T=2(`$6dnG`3#B zg*j+k2{g|N8czbPD+i4yf!17r#*sj6JJ2{1Xe}aW90}Bc1&tSh=FVC`<3S7z3~fx1 z@$Ysfh6Ygm*8v^p>H+n^7#J9OnHU;CbHV*g3=P7J44|7>8x$EC7$!0?G^jB$fNo)J zFk)n2n90P@V8zJ5Fbgzh%E-Vl7c^eQ$iOg8zk%3`8sPD(fz_5^sp18AHD6b7Jimc5|0s-QVNMg|7Zc*{A^npGx-hL?f~=`~0G(R~jeUUH zGoY~#&^Y#ECWZ!3oIGcOtf6}Wo%47FDz6wIV;i8kWzg6LsGSZP+h7CT5e+S0L1P=B z^#|XW7#i#u85q8U%6~@4*aoOv{SD0rf0!5=IvE)l{z21|7z^fj;S)~Cz1kqU2;@1C z$G}HlLn`Qa@G)y?nW;IDwm)e70z?T42^}v4rAjR0g~)ZNkDn>}rXW+)@jxFx6ZEkR zW7M$EDQ}Z85tOySQr{Wsn3Olq2UuF1A`k2L&HBt1_nvto&;YtrI*Em$0dx;;Dhoq{DCn+n76$NI%uE)B2GEV@SuBvT=v)?t z25V*phI|%=22gq~0l9;jfuWRzp&^?Yd|wTCtz{((Lj&mE@mf&0GlLd#Ff>eNW?*P! zVQ2u|VBEyQ(6ES^fuWg&pVIB)ZLp2Kn!$MHJvM?|#Vqs|5 z#KOR^goUBu918=(QWl1Whb#;X%UKv2zOXPbtOS|M!oaYOg`t6ym4RUs3qu3wHrXv8 zb6FV}wy`iYc(XDv>;U=EVa7%%Gx=5pxMXs5AoIrjAi7a)43+TCFGmN--FD zpxr{Cu`1A#T4Ndqs;zOjJE^h+x`q?fKLOcdB zX?GweY*1SPxo-pt2T*u|f&kVx%4CI{0g(ktC!js%tdRYy`K$~Lpz+E=R>(e%B36b5 z&=^$-D`X!>87o6W6$1l91uJCDLnSLi185y-6)U9ARLcsP7inOH%!9PDGJxkn+F2PI zm_Yl+SQ#2XV^UqL3=N=l)!iU>FfuUofzl~xOo0`$zjX>LLxVRX1H)8k{DSs6p~o+1 zj32b*1GKiM4CFaT)D;xRL;FT0`SEG+ElZ%Vf+#>Cp}lNS__Tow8i-zSlNc1>kl;mZ zDMBhcK+-U?KyCqIH-5GeKuh zl;iMIa(;eM3exxii9Q1*K9JKPJ_996uz`>P0Z_>*2rh}Cf;jvOawocfm$E|U9G9^& zG#D~4Ff50bnJc0G1+6PY_b+H=8Yqv0_6Jnp@Gm$Hk^Bp?7Z&bFG&CkbK0t{{kbglV z6$t;9C4z1}0(XT#xgOHEhYEtSENG+yqMBg5gWL~t4|2S3gvR$KR>=7en^__4@U75r zSjhkyBSKvl1X_0n@;<0NUkPGBJcdZi;4=zAL*Wn!3=-;l(7YIm??L@VPy&Gz9Prs5 z(7+Ew2wcQ~!vf?Flnx70+=GGyW+%w4Ahn?G3#hCBiJxa>XaG6;0yNEEWQFW!yaX+$ zFN5+k0|UbqR>*wxRaVFvs%y|N0gYFp?@I=CB|&FsfmVQ3feZ&(ggo{Ep9F(QV35!- z0qI8x6C{6u`~lMkvJb=uHL_sy8n;;)8bEHi1FEMP7#QwC-3vO81AYG_XdVDG9{?H` ztVX!E#4tXoG&3h96?!olC=x;W4`wYA?H~x=ZwN}1ufc^8R3o@|3yOkM;65Vw7BW!8 zf-0daU?KPfE2s*(1Qr6H$qqITG;C!hfZh+4=Ex}fj^r8(GKEE5~#JOpMo$lMkS8$*LLXwHib(tcuRgN(g# zutDOVi;bZHWH}ETWGx9l8$$zV3`2koGS4o^23Z>-#0FV+EW*an0Gi_vWrMV>#n~Wp zwGwQQv1w^Gh6Z^?1_l{6Nc|$m2I-T^gWSOgzOxZLN2|yNIYUL64YGDq1!^9sKa3u) zpn#WWU|;~1$u(Hx6`l}5K>-UMBpMp8puj?nS5WH|qz*a8z^M~dhl5HokR%9$+yK%J z8kPW!X@bPeKz?OlU@&Kc)Gt= zWn-W;3$h+$EgFXU4dhr%zah$9$ha5WZ^(v$+ydew=R0RMNZske#?SzAqbt-epf&{h zdTY=y6sQgX&0T=*^MyJPDc^yP`~>?1+(rdC6{-fAf_elq^MOWuK;aK6A3#Twf%u@D z2jN2w@&aW$P|opZ1Pu*>a~+7g2%M4fOH07#Rv-@mffg8hL#zi4)PejDDUXx$^Gb^H zbHGzZpi;USYy`yhkTD_Hco4`=hza0*u?!$HKzAyF_VI$m{h;Z>ADS0~*cci>R)(-a z&K(Mc=Di3uhK5O?b(eo z!NcAV9QYtdf*gm2p@9#I8q`z-3T#j+f&_L2c+oH@iXi+-a4>;F8d6^)H-o|b3XoQq zRUo&5tOu3nHc-J-Hb|Q#6B>IyY&OUkS}v%Z0JV>yVE|eyhrUJ{G{z6=A6YUo zKq^6q*=Xqx6tDTEMPvm6D20GLiJF{1g$F2wpnDxub|9~70=W<5Z{&4NC2WxXR4Fu# zRIx$k?Q7T|Yy4{2AZ?ZgHb{TBi4Ag|Ni!Q{?Oz)k&=!V)>3f!qoT zOXPeu6Pku*u`x7&=4a_1q>206=NB^yHn$nUG5 zVFcRmj^0iN?Y{-3G0>cF6V@;SA1WJ9X(|IHUCdMlYUx2zSz2aMaS2NE0konXv?7jy z0bc5%7G$9PC7^l{T9AQemjnetZ8E5UA)lqjrc0k(}d)XKoKzn}nvq8pY4zNMir5=U0EsnD>G=Rq8Pe9ug zC)pSpKx_2Qu`z(>x6gyxGK}E6g~4a(TxNreXJ2PyXaLOs++>67AHD^OKSlYrL7oEzJOe{=S{i0!5xES5Co6!jKz_pfq~`Jc1<}(Fs67H}leS<_KO{6tQPU5oUI7Iya>@WT z+(2;ws-Qt~APjN?C@zrOq|WRN4Ip>9utVCU?(C2@sRuix{qKp#PoQ=ntWDaA>L)T9 zqnLgIj}`~>m?$Uh(qas!Bu+!hUBhqOfl*&%JwAgCXh85tPR+e4r|y`Z)z zsQuK2>IZ1{jE6Ufz*QM22Z1a`!_dqPatf+PKvfy2_XuhKK-xo~NP+MnjZu(CLFOVg zMnT4-mg~ql6%;C<*$8ME4l0~c%WzPV0969eA{%rAF*Kh-`-PzL24n{agTeshaO65N z8k!zr*dgnvWS=-y;Vu z2Wm%v+M?|Q!k*a1C}!Y;0v8h4kiaLdF$zj&Af2G_0b!6^L1Bd47HwdMv_)IkA${jo zc1T;ajUCb!?O5VBW1p+7xK(!Uf{~!!< zD<}*=x5tC_*n-5?Lc?GkJESeOiJhSV)K=fZ4w>8D3MxxMbv-*n1L%7C?d*{KxVzXP z`x<2wf^Frf|osof|1ADxI%2d*tzL>EF z3Utg^1GQQpv4+vN1ht+(VF|(@H-f?#dGCEcG>j)e%f2blvTqtYWR7JzC=3`F7-q3U z&Lx=5&d>l_(>j-(p#jv+n#a!209sPBke#6cRM#wFXJ`P0!BS{gfyB_qs-`nBFlaJ> z*Jv_yBf_en7_(UkszpFfN5c++;KhWXVr?yW3=*Li+`tFb`jDL=&1E?P&%>g-=Q-%X_POBUTBp=9gK-z?g91IO& zj0_A)9FXxyWe$c0(3)!%4#?UVHITiG3=HZV3=JTUYH=`t&nD94fSl*5#{p>*>T@tO zOa-+GIT#w2gVtzsFf{B0t^>!Ep>~=71zY7?cV@ag5yd3L)UqpqPFGWdlfQf@p$*{RZ+2$X_4~atnx$ z+y+hNfV4qVI3R7%RH$FDjfaBTU$8c4A6CDBic83dB4}V2lp#U(qG6;aD5^&WVG|S_ zhJ@OndC+u`&jD$J7I8q@pd}oTHfSj*4=^w=Oyq#HK__uQ+MrW7AZ^fT9FR8XbZFQU z8V~KqANIsHK`{d#l!{1if`Y>cq!kv=*xI1;IUsG&#T<|}=n_zQ#lXO@6jV-u=5#qA zZO|3aFd#G@Iss=GkXBuz1_G#&1xmHVRo9^Q5U8II^EbBf&~+S;_RxB08ri}D84umY z0U1l!&H)(@-NgYJ58cB784umd0T~ZHz`+1MclRJPTn=+U#zT*Q@+~6+!*LGCc<3om z+5_z!gsQ{Vj{&udL3J0X4L=cU_>ta(M-4wv4hE$J(i0IVEJ1ZWEG$881(j9EZTQR3 zG<1an(uTjm0cpeE;()Z_Z*xG-IKIOHX~W+I)p?+^KRF<6_=nK2Av6v;32WGp(}YJ2 z9Z>25`42O7fx5tu;v0Jtp1$Lt&!K7d1qY-J|Aqt7hJVWe83%jM0cpd3;ed>Te&c|Q zgMR0LjD!B+fXuP}BDkB3!0w+VmXV4yYP6qJZ0?DBC z!^FUl!pYEJ$;7~r%E{2+&&0rx#tAtKJe`xFp_Yk(A%l~lVKNf~Ll!3k_zaM2PRKb$ zxtt6Q*O?d?@;MnA-ZL>U6mT*$fYM13G(CaN!AI}^__9FKlRFCo!xTh%Dlv@DP0UV> zFD^|=%O`j`IBaPJ+G-0>`{JrNXaK#SD6*G zoRGU`IzVC1z`)SS$3vla6h9jUf%)-EMl#`)BlZAodI4B%h7#L1M(;%d+j=Gi$R6m0HnxOHi zsVHeMB{jLIvH)^8Jt(&`U;^lxB~Wn&83BSG2@G1A11icOXDUF?UjQXkP)Vi;USA4L z9iZg_;IL<`VCaA9kIzw<8 z!cU;mttc@sB|jHDm<=)&3x=Nk1sYa{q+`&cBFNbeATPmmfb0Od5qV7XHYY;^$lkl4 z^a9$u#|f$H?sG!c|32h|?CpC5bvtMt#vN_k4>V2!>f3?t%UFhRdx>FuPJVuNX+b=A z@+&^6GQPMZB{?Ip2z0)4d;#P*Gf+gp9Ee0iJ4c|vhtxW-G9EOk1?rqanh7w|z{?gu zSsvp5JaFLw@~bkq@F*zGOUzA$?BWC!9+0yjA_@QSR6Rs|1w} zpv!DP7fXTMJ53sLnGN(DDo|br34<^wTtIhNA&*&s&NT&v73iJ^&>m#aIi{d^>1BY- zrGd^d1+5XE#K6!1a>Nt{$X+4PIi;Yns#y#S4WO}C&^e``c{|WKrJ!(!om1+}gt_Kb znv;P6G#3h@m!rfFG*BVydE=oshJjNWXqFP>2Q-X%KN8+UnM_bOA^P|kqu-%sjDG)_ zu{nbj$~MKsiO;=Dc4;f#BjjDi(2~gsD3U0+z zfezpWjVFUr8pMvw0`MRnC_zF5Ad5ml8}LBsAEeixF)2R>B^`RRfsdUB#Q?}OP*#8> z`h3WNk)W&%Sz23?4>2D!$PZBhUTlkE8fas-5-6ubj*mfPA<*LZ#G>?K=zJ5>yzmFe zg$E!9Fo4nyC@q8LN1i~%8$t8;pgN5WGUnF-UE2a$n-a^wz|hAAS5?a8`Ie!=PAqpt+xZU^FZr7K>ORFYYOLq)>VP_x3e*T=XpWvJwWRN zK{CC?#?T-L+E>m7*|Py!hXC5Ieu|BuL5qoj;S3w3P6Vw( zux4UlxCmM=!o|=GXukaHim{!W(EdEcF5fUOzaE|eas9Dtn3U8%b6J%K=baKnHd;3 zLF3rW3=E)o_KVC647}_N4O}b?4E*d24bChK3__s!coqf*(0qFU3j+gae!YN&fdMqX zUdqD2pvcb9(7*zjH($!az@W;`(6Et(fkBO(pf1A`W5Je-ArL6;q}FAX$bF3ZZm zpbwg#Wo2M6Vu$QgGX>2Ju`)22voka_vNAAOuroBYu`)2&uroBQWo2Nn1aUHhA_|^ z2pa=KBs)XHT{Z>=(A?%rHU@@Rc7_HXb_NE}+@?M|0|RJI(}SIXA(@?_A(5SdA%mTv zA%mTPA)B3{p@N-(A(x$@p^BY>0W{ZH&(6RAn(JK7&cFbg>pafRz);Q3(C~zvfuRmG zx5CcAP!ApVpN6F$1v+mCREC1iSy+L!423Ts2W2gAo8{VLnHdHaFy#*>sUxJrk=H{oA=A?q%4U&iSC*w z`T^D3==~;8Jb~s$L1$dA#F~EKWBQ;V1bG7uL(>n)L#XKo6q2AwMcG;aYNEgrVxs`0 zi2~}+fNBw#!5}w*!j7GRfdSM80f}#e&Z&XseL-jJ>;n0jfq`KUXsr$COfPoGINg4B zh6a#dK=YiSvjIWppP-+o25O^&)+nfh&H_jHIXTTJzBsi6Qf-6A$3gaD!O%0JKrstB zTmv#e2zR=Ej_5HkG=SWs&j7i<*nj~t9%~3a zD-3l0k2zZV7IbeQXrCJ>jjTiUM`BS?aS5n}0?+-Rn1DF|iFObKZ>$8x?S1gZN|;XY z&Jd8RQKApzNl;89dmPmA1=abG9tx;X@GMEq1)m@V8SelUEifxVZU)WSA)mu*!vNWn zW(&Rh%7FngF7F7sGmL?O!3lczl{55=Fc$`fhH0R24+h8{G&csw`Ym?`$R11&XqbWK zd(hYEfabwL=^b>R@p>F#mX?{9m;*Yv4wMK$Ap>(f5)BPEP*`9IH&9@sgc~>^fYJdh z?SqU0xdjv!pwUIxei~osnfIV`2SMo^blxCn{{iT{LC{_)(0PNPeW;-G20?{0=zKwt zUm~G?2IU=eKZEXa21O2Nzr{uzelAWean3J=j*x(y4{{(HhWZ&4B4~aF9f=D{DZ9*zXNnX0_gm8P=5pD z574~`p!^NmH-)}G5VS`P6vv=&+l0fv$vLTskTuyPdluv+aCr~%F)WBcc7ptboTukQ z<8lE5WIgaA2FUo`VrX0yf%b5qCga68CO zbhm@B-ULGC&NWiIkO z07_5DVGptw-Tk05AVF@~3=R9OpmR1s>xZCW4?6DxeJ&VuJPIfcg38*hxZNKBS_PL1 zNj#vu080W$G&HAxN(ZzU0ClYpg(c{)7g#k3X5DXd~+C@Z$M{Qf)*Bm&aecXZ3H^I5_Fav=pHwa|3GI~g5nXh4jR2)0o^YG zG7~gTunk8z6qFWcfYTu15I`#{U?BiG{k@zDumqiFiN0PJR33xUA*fBl4!Up#l1e~rjik~v@P!yo zl_kX96=JFc8ih_OO#|1ipnQN_u7d0Wr7h%g6;ywK>|>sQd+`k9r10p!kGtPBjtP}4AU zxCJ`6gcwMHjQfF3+sX=A@>8C%ZuNLlC>c{WZuil`4avAgGZ6u`4e>zPKbc zH$Ek?2z0?sUV3~=QD#{xXoyQt5VSV{q95#bBk&LxXyOEQiWStY18wt=11IE?qQt!7 zwEUu624x08LC}$fpp@g!h-nkpPawyG^7d=+{syS!pyC9SfStf5g0coknF!pEpsr(T z3beNd8GHT!oo55ZEGV6T_O^o7hCP9bgYHNKr5(^6iJ&wHx*HJ`y!OyLok4dYg6>*% zf!^Ki#>fD^!^snRUaJoyLj&l15r0O=JZc~#LxVMFK8+D_zGfIBLqi)Q zj0_E+{Vp+#3=N?1qF6@gyc+0ENJa*RR7QpdKG6Ib=$<Hyts4LVMn3;hAbO(6@GXukPMuvtSW(I~Cj0_DkK<5sD?yhELV3@_o z&~S;FfnhEqWG)4CCpj+*1H%H)9onGthZq?eVnOE*F)}o?vM?|#W@Kns3p#-YZT?;J^yGv)qRja%Xu4D+9xN&>h>X;JqLXrK}7Ln?ZM~vqJ7J zU&PA5u$7UaVI?aA1LzL(!=Uqt7#SLlvNAC2hQ;~+PH?i>fTWsZREcxPZ>I0|() zXpcO4Sq$m}fb@XOJAvWuFz_jQ;QE<7XM@`w$Zaf;edz86-GL5r1LzKPkh?*5po824 zx&s|lhk)Ac=;I9_b3l4P>P}*~+c&WS+-)V_<)Au|kh?+mSAyJdjgbL-=Qim6N|1X% z_g8}44Z7zFy=@4Za|Vr@gVv^;!f>}=eo-#C%a{_Dnp~0(X&Zuy5VXVs;zAP)sNzOV zFrbnQRLqoukKq7S3Lp_sSw9gx7FCv-3_cG4l+=*6c!9>?K|Xeq0JRNra~VKGETCWj zS=J~68Das)C&+M+AP9r}1By@Nwj}6YPLLm8F+$eofbQc26|HYTqfr&A}xpVc}GBGsrGShJ#8KQ+-oQiZYWS4Kq>;GEh?klsX_oRY^IesllM;4)}l{P}W2e&&W&z?QInl z1l9HkaktW{DsV#^+CBxzg3=iXgWL{^H{>~MP0)G643KlSL6fzhbGAWa9iVfzLHip( z=WK(<>Ogm(g5nW0UX0%N0*Qh0AZTCyd8}a)206qAfA<;GJ_VH%s3i=j?Fb4IWpD`t zS(5^4JA#4(QpSKUzX8=;pu7bV2Kg0)LGA+i7c^4`8Z8Hj*)T!YDS^%b2lb!qLFd~t zFff4b(gV34beA46{=9(UPydpP)FMy`&0S<)Aq6VuJJ&eW3mX-7^RBr$01} zgXR#?(>N&HKzc#yE@Jr8EipGUr;;ung{EObaSFO459D6ZS?r)VjfDCYbQU|v51>2p zKyeBhb40Hrk^OoJhhOOzvyic8LjDEaR{-*F3N&uhp#Dt<-A~29z>o=zTTtHy{rnN+ zw#;P=|N126rI#kAr@9yAmlja1z5v+?%7@5xTpqOS&4-q~h0wdhK&&f|p%n3?O&&hM`RwP*|fDIG|z(RBD1k z&!4flG^xn1G#5Mw0BZgq1_3|~9Z>lWS=#^_6@!&Qp#C1rHjtY^en%e5sb+%AlYq{+ z2aP*|?nnf+7{KecL3br`gU+o0-N6Vt zj}98&p#AIU@qHe2)-40%B;>28VFv0eq$Vai=jRsW=cPi2(UIK_^8=`OgdFw+YOSD# z7N{r&wYMOl1zL;*4l2;F4kD;P+oC{aIQkd^c#aaZf(xP>+zSV52Zbv{EIl&?ECO1N z0U3kSAOQvjhUrWU4O*ac?V#xn zbk0BM@?X$7|DgF9@cI6ry#t{8C>aEA0CGR*PCrn7-ps(jfWF7|8fZ@$ z0|Nu-tn!C*CcTl)7Gc787Mx`%LPyy9@Jh3^%riThJAW!iA!o)VrfnZctkCNYV`ofPEgn(*8`xt-9YXD z-R%bIkAv=Z1Gx!ww;L$k5OVu%47dB`=Yr-!>EL$IJ#!$phciR^JfQpLKyHtQhC8Sn zK%Z~whL*>zj0_CdG29+vh?%)bEs;UR6jT8wfX6ILDhpB#!99CWRk;%~hMSlSS#^RwCX76; z3ub3Y!fj|j5OmiDDD**hZGi4#1Kq8$kpXg_C}_{~ z8z#sd?C+Q$`)Wb=h`s=|S(z9bWEdG3V0UYP?hOTn? z)adO}&|PYvauswx-wo7s0;&VBB@|F_fdT^!Lu&z$M=)yv&`3F=764V|pn3rk`QT^= z34y8?q$mc}7002LtbqkQsICB|B&aw8$o-&jM;@zTWQN>d4!Rc=G=~Mc7Zo%I&CLus zV+wRXDroHs=zdgCImyoqxyM}?nx8;rD0<%$G#?GhgP?JoJE-9VJ;^S3-`AE@sM zstI8ZM53V~1gh$Ez^NOm6FeUP@;qv|ftq>XbOuWLFk?XO0QncWZ=C?Wi!>2*|10Qj zJZ8xL?KEb{x}OYY$bE8|c>D)iD**BzXgu{UcK?Alk%0?o8u}094s`$JLH(Bx^rf;f+K?qYqR# zLAEhLC(FRa6DUn04LpL9Gbo=Roh=0t0u@7$ZQS6+fS@h_D8GQ>-XDGrDQIv8lwUwq z5=0cTybpASJg8v|YKZzXrl*!57WYXp2nvGAVo;OHpAnRC5ptli7ZhRQ;8pd>X^8nz zkR>qxfx-v0RvmfWJ7~`wXbkEd2V`HtCl1J&ZC{~#5`RF?1Nh0o&;V-p{^DS00QIMS zb1*dAVqjnZ?VWqcz`(%B3EB6_#L3Vg$jHFJ4BeM757gE`o14^Qg6vfS&0DU;9!~{D zsRfBekZEC17{k1PL}NRk92VG^aR&+qq=*7lY@l$)tk^(CfD#8Ac!6bdS{mpySa5X* z3Sju2CwP8_9M6yhIp`Lw4pikKA_7#`fyzNhOhdXQ$dwpqLmFuDBj^kU2FM5;B&npO zK&x70)u62jk&tOR&@>+?okG^4A{{LTN~SoD76TQxpjZS2;~hol&^WmK0o64iQ4j{j z4=9~TF)%QI`YRwY9_W55UQWn7I%p3hXs;kYC*+JC&|XMTzZ0|v5|rGoA?K&af%Y>oFfho2_Cql+FepIxTq;BNTB>p~G`ND=@|+9}AdhNtGBhNE+Buw% zJ5uyG85%%$qZonqGchtS7;`c->;jz!0o`W>+B^6cl;$`g=Rkn=4ubCKwgb7JiGjf$ znl3@N{~D(LPcM#$Oa>p*k03=9k#86ju2Y=X`af#&8wy=%~%9LV9v86j&B zPeSKLPBAhxfX28%b7G+Jg|m#1J9I#EVxV>jC`{4k9zkQlpmqspE;$hq-o>Ed=y>=A z7of@(6fPhipke4rR8Zg}-&P6=U{IEWwDF#lEDDki=4>-+54Tv06B{fv}OZT7UeTQ z_Ffb~?^7;hfZP>c1YOesS|osee>-T+4Jf=oc{K?UUPY;iIXU^si6yD=C5A|srhp0u zkbluIG|)gEK@T)g)djM^pAmj{F(@oSsSrz8f`-9CNdb0aC@9=O5rwi`1JuAlPlq6X zfWi$q9accYt&#zf4yza-^-(=^Eo>tLnoyel5^gOD6+E1L$6X zE(Qkh-RhuyTNgoV%^4UPK<9!?fQD;70|Nv4937}V0`fK}|D++pwKzMoAU-)i7j%US zIFo}C3R+--xDJBg)&a=tkR+1`yQTsWaFCP*s-{6YAb|-|1qvQ;`3s5;kQ4}m+ye?9 zxVE=>a44A<@ z0~yNz-m?iBlLC3npD`I_?GQ*AL=|Kl80211p8|Go5NNFrDC~lu=`@%TQVxbNLhf0K zV1(?a1g-grWME(bt@Q!bEAfmB4WNEc1|vfQXzNNABSQnIS(L*FIUB5;5z>FFV1%4a zTEhrAcdCvNvZueE5wcGkwAKgI&TV33XaLW9a>N`dTh8|Ep0*!|=GBkvN?tBHU1!81in8e7?kPh0<%?LTe6tpG?RIh<{ z?x5!<(0Om5FaYgI$wW&(Na=040wi#(12avvz(kjF7VYnMQ7o(Iie zpfyaOgtrK^wu*s)0n|ZAZ|W zB~X2}fsvsBbPfinT>(1F4YYO%v`7uKW(jns?lx%rfYvU7!WFbG7rngzIx80B##%-O zhAgyjEhx%QPE9F=b{TL7Eg#Z8RnYD$P>+qQq6^fnM+$0q9s>m$avlSh@Q}GUP@fl; zcR+pt#Q|u?4D1dG(7Gp(|Bf+2_IiWbSfBj9nD3tHFnnSp@;w5|uVPUSWuL&JB_UUF!jxev`Vj~F3mwLONe z*Lwy^1E8}BLF?BT85rI$GBnsQGBCVlgtW;)>tE6s85lt8UqI(&z}CNj?m9$Y?*y7R z0r?YDmgXbkte`l)Bp-a!4&pjsv_=(2N&n$)}$@U5-P zf-oOEhb+1WaY0>6M4bp~mx2m!kO81kPLK|N#+1_B+)8+f3rRPi^YcLZK^PXEpmYMd zHw`4l#SEzvL1SN_ln)yF0*xmLFhlxgg3OS%rzkT+1E`571|3V0U}k6l?PHK+hMegH zntK2Rp)_c20CXQFGo+0Vnu`G4b*0G6(69|U*8r+RHJKrIyJ;~)&RNl6W@vcJz`&r# z3^^wnGzS4XSKNr1p#iiG-Gmvk9uzbe0h)2MWM*gpEh4sIW@rH2Ap@F&XklbvuxEy> z4|QN>XaLg2pyMcX*^i z(pA!hs+RJVXy1X~qB^H?CA;3adQ3<1fBnZ@y` z6$Pn9CEzhYP>`Z-tOgkX3O=N14oD*a)D8o+p+I2=!XWp8>VM>Zo+<<6yh}9(NcgEk z_j+hS_l9aSK+13(2FMu>y3lh-K>KAu{)X+B1?3y`@Byvy2hAyfs;e2;!w0_E8RR}J z7@D*|2@ffJAl?J_<3RNeOdrTTkpDn-+CT-(7$EnGnKLjnfJzbz2FSVjmJE=yORX3n zXH;54`|D3&n29#Jp<9QH;V0(~_OlDwU zfMz*RI{{=m)Cl;YH?aB3FsRRbVAE*e_<(8#%YniT6d%a>6|~0~6qcYp#-OzW`Nv#8OOlT0E!>b zJ}X#z9(`>J=uR0>83%IXEIjd;ms&yS=qRi$L{O|FrBYC95R^P2>&pue5euqlk>VgD zu_zuK5m+M}DXoLt4Gvfa1_qE{(8CtAmki{;GzLg}9yB%xib2p=Am}_P&^|8EmMk1KnSsv!6h2n*;S1X#X>)+ym`@2Dx`3)L)?UJJ9_F>LY{ng6?vgi|McA(&Cc* zT!gMrCC z8pypM|09plf%f2n{BVc?(jNis#RWO#C;tt)(bubGLFbx4V_)-ex*uFdK^EMAsxeTt z3v&<>4UKhBtReXVRH`AWAh1dBQVpaTQsY3YF_4$R^#v%MfMh`!0XkO&G)B7+5!MC8iKP|sp!EfiDMWB< z0+hr+e!_yGNemPVNCg9^`vCGhB=lg*mci)=xqt$>0i+ChFS81042pq)0W^;Ra+?~| z51=*$x*uji(+lYQo<#^hz}oetd6}SujVK&J?K$jz0F`;57Ptv`odi^4F}NKM8W=$> zAVI|@s0hGp-Ge-b6bztt0;o1bnfL-twSyKOfgIuwZ<2w-2HAZezk$LAdCxj%&IXiz zKyx-AtMnKl_u=R>Lgso586o32pt%rGm{>u>ZY~1@1A5qjx-6jZ1+AA{j63Y$1trKn zkdx6c(t!?WVF#-(kWR@0g$F3Np@avxgn`tf$Yl)3eIWlMmocDy#vnI4K*vErb2y;# z2Q+sB+E)acy8-#f4eD=D8H2vQA2gl-YS)6!Kv{y@-{2gNC}2tUJ*bccc?XgMz@~xH zA~;2Xf&eq^fHDJ8+5sgK=(Gz%2sD|1${0|>gT(>JFQ70&u6saxtU>DFZU~6AxPM3La4ag#jep zfR1_uZ4QA91cHo$Xhf=?M-k*8<$!Sy5En1 zfdO=X;|ApLF#=sw58k{CIz-H`G#7pZ5~x}M1t-XfXc%n`S87EjWFI1^#fNrm3TVX^ zXyF7XV*MHOkjzK!FN2l^dO|D#B{NX!foe!C4+b4+1?okE#-kts3|Wo^Dz88(6|KC2 zp127qvq0@rh`Hc>_za+NIZ&GqbcPj3JQ3Qb0i7oTasa6B2g-+_z8|Rn3|bEYifqss z9-#B^Kz%<@^#EE20$Tq9>g$2#P>Vt5pfNHqlrS(fNH8)mfcko%Icm_l2++D;(7K33 zMh1pz28M=IMg|5@9}0BVT?+$bj2yHsVhSSzLp!wX3_4#NeI6~B2Xa?Z3J(LrcGNfo zZ4)g<)TE%%d64hWFmwqC=rE6u;NAmR8+iU2G+vK%3+6f5V-w7%{Ksf}W6LfZ~M`~tzMhRFG=%jCmL~de5RDND6 zR8E0GP!N=>;RZrB7$R-D1EmU39zk7(3vvi3cfs``=>Rzd)Z2lK&F3R_W`bvjpxMEn zF%vw-0~&6ICi~&U27kuXT&MgBr~HzV{9FcE20=kk>_W7pfpn%9~4HQcLFdsfV_;}7W@2Di&cM*%#Kgd`nt`DqjfsH)boLkMTv^cBTI-n@7(i!h?PFqK z*v`PvaEgh6VJ8Da!+9nKhJ6eS4J^zI3JHUhK4>i1_o}>IU{Tg41A1`b7A=z85$n3F))aO&TnC3V31;DXaFTP z1VTFo4=j6FC_eKxVqho&t&QMfV3^Fv&~S?ja<0rXF7W*s4N}|;44`^fo11|F zwC2K!n}Gqe#=@7Ifnf!xz0b|Suokq&i5p!1G;H98oCCwa!@vMqI}yMGIp-ymhk;=a zw0#5G*NMKz;V$&vk?YJ13_Gxu{mF?1C4`qzfT~eY<;nuy;{Yn_iottuK(i#A5HWBG z=aHFL0xk$ZWgw^#0Ff-oFM!K{i~^0mLQ0O5V!zaK@Y$P)!at?hH@_?uyetV+mw>8K zP3$o znHd;BXEDSxL(XCV-3I|Wiy@7ffdOO?;#L&>n%)nsA#LzI4nSsHA ziJ<{>UY0czL&Fwk1_sdC1}B&q80?rJXB>gfGytU?XXu_&Z1YT@zM32Z1A`d@1H(hq zGzL12Dn7F~EHNjO&{1iyjwLHNIe|2S7c+tOL@_|_`vAok2!rec(V%Jrl#)Q~+t9No zL1)^5+yN>xL2X*l{&Dp75U8&OaxbWj`~<6eK@}^g8H>BckIS{7GzUtwAUA<9$Sx3# z>{d`Y46^?d1LVG&FVMCdsE>=De?j^|YC&#&iq);qrUiM<1&>ba-U}@5&B;&B2G3=K0tE|38hC;f9Y_fQJ#0aCfs8;7 zTTopDvR{Cap#kIuL1@_sYN(<2{XlDDLF2rjCf7?$w}R%7;roX`B@Dfg&>nN6LWkM3&5R2P_r1)0|I#%RQ^Fu4+j;xkdmz! ze3}brSOpXgpn@0X7LY$cY|uPD>|9+?9SriDG;|%N9CTg3JaoMjSMb2AvNC zs-r>S02-$Q#qDV(1_t!Bc#)lf0d!8`c6J7a_t?V=ye|eEzcU~Q@PXWgjG^ZWb})ge zV@7a$a|06t10+m9UIzsps2#imbihBjvyl;8l9~&uJ{*gR5-Y*g&H=b&8LA|xjyS=@ zz|akk4By1!Y;aTk0u#8G#Q@oUKh z0NSVp3iF9zgG*9#!4(?VaFCs#P6)(|+{EH+C(sF(AYsrNABYJ_nb7lwK^+oMDu67( z0I3F@e+nv2KuG{8xgd9QL8BPZ)A~TwCumbSH`pPFOmKk#AZ5%V?{y5Nj zDA1j^Da;HFpml$sby1)@r9kVUK(P;6_w*68j*Xe2K?IbVnHd_)nHU(VL1zUpF)-9J zL+-R~W@c!($i%?V#mvwk1UlD{8FEL|OlF3LMrH;E&^n}f%nS_knHd^3Ff%YLVrFRA z%gn&Am>F_c)DmWfhU3f(49l1y{gma*3=N>R(|*u8DrN?TW6TTF0Fg#*r zXaFUM=OBNuGBCVjW@xAY^-DnE!pgt^S_`zCm4V?8Geg4`RtAQ@%nS{CSQ!}pfzChx z4UV!fG@NH;U|?inXt=`4z`(-7(4fi2z`()6&|t>Kz#ziH(BRC*z#zuL(2x!4pRh1A zRIo8HNV70Bbg(fn$g(gr9AaZ&kY{0N03{=37KR2fb_NCw7KR3EP=AGmp&=I3UtwWr zsAXqh&;{vZXJF80VQA=OXJ9a9VQ84i&cI;C!qBjSoq@re1#QrbCG5T<1&U7w1_mEcJTfpa1hOzRTxDQj2xEbq znGwyx&;YtmE|Gs&8@cV(4DvSv149c7WKUNs)ZL){TIlms zpfe6Y{VvcwX5VqSJ2$^9H6$P0oB*|@K=z?wsH;J(By?AUYH(1E4M~6%;O-d9ZK*?W+X24-G@Z;Q|8# z1GaDg?L>h18xjtnRTmI`CAdBZ&EP}%{%L8TBM(50RnWd~P-+2h4+J&9K#f(<@tdI1 zqZOP}0}R0WL91gR`YWLNLCQecAF9j{l6xUz>!8t9nEOHg2eFa&9&ciU;*4Z`mMsHGW`Y zXqdss!0?F;a<@F_KB#Ssko%xO>%xDqF*H12WMKHk#?YY7#K7>E4RU8Z=-#JvCI$vJ zc7_Jfy;Gq3pC&LdFmQnGg90^B*clo&GePcw;%0{2_oTqgz#sy;pNW})K@@rq4QT%g z`g$$UIG+&%1H%W3?Ko} znLv=3s)Pt+z{hnfjKC^Da{y2k5CKrL4kAzix<*b=5HyAY5vVi<4@+YtA49M(Myi0= z2pX-1CJTrKpuQPYzyPcfbdW#90%&rASOc1Sfe2SZQW?ZKpaFHLc8CBdeL)3K(j90l z7#4h>@CUKw85kH?ARFu%6hQZ5F+lF&0F)}cC zuroA(#(cck85+cxAop;oGC}U)vSEVU!v(rOHi(^}VHy(yLnu2#!*M3ay<69q7#QN% z85&+NLGIuB&&0rx05XS}fgzEdp+T1!avv9{JV|9|XaJ1~rLi+KY-eTw-@|o=nSmjX zouT0&GXq0DEPaCZO`^^FfzEmW)hkyR7#M!xOrJUV#i{-Usd)j3C4_EA0JTOy{T}q< z2~@d2$9O>P8c>{oFvxxojlA9rbZ;2QO{LIys$qxh83x@O20DwNnVq2lG(XV7&d>l# zE8Xmndvbc%A$!((*&+J_K=)FC{51jUe?1&~LP2}64lpt>>_PK?YKePJWkH62X$h!c z23Jp@rW44yXc*gkC#a_cYA+$R)IfzTsIY{brh}L}2DkP=O(g|z)sBN*P20ELtGKIf=#4`=CJ0H&E>f z$wy$Dk(*)QaU60kp@Lg^8g7)a(R}m4ep)gT_ihXAbZ%F*JbAtmbEe?D>=cor%cE zz#z%Q(4fi4zyLa%*OZZg0dzL6IU@suJQL&&U(ngSUW^P3Dol`lZJ@DJ(A=sz6GH=N z?~oP~WM7gV6J(zUXv`F}-w1Sm?OM>86VNeG&>BYcu@O+`9n{kYt@HhjnqEL{Ur;|E z(Yy!64q8e9aiNQDK+P;fV;ZCr+++r|fFSV=nZ<@=98miOBm>e9!XS5?U}Rtb^|L{P zSj>dL0{Vn8pi~!>i~^c{=?zs;?xr2 z9gUWHV9WME$M~CAmgc^b^f67K~P@={oFC+u>X(4 zAL*$jpg}Xxm=|#ofaVuasz-M>$X;}JgVtey!XLB-9~Aze^%x*`gUS)~@K=IP>Vw+; zOrS`BBnQx)HL&CgTI1rF1KEXz9Q6>DU=o^WKy@6Nn?Xe{C|`o|pg$vgBoNd=0YwQ! zI1}832X%=++0ma7obN%tg|wML^WK1kGK8_KASztU>+FfR(`;GHeK-Lj3=E+0Wf0AV z8cvycC8W7uV8j;_WOLyZZB8WTfwUB;FeA{cHq z#&C}jhA)ha(akZ!u*(p`E<+3#8e;gu5W^e;408<7-E3lsZnBA`DVhsSEYbaCVu7K? z0>fmC*fB9j4-FG@^f)y!NB4z^8HO&5I5jat4-FGj43kYUTxfz}vI(Xd48I#=m~4!p z3nL|%V59^SBMdiV#IlJ2dT1D1qQ|K*MhqHb#Go-oZZft&_l2=JdP*=hM~`J=bM(|} zj1gbPW*9ESh(TjB43kYUd}@N>LK6(zF>j7#TSY$CUK)N2F>!iRv zf-D9G^kHLAkH8~~fdMi^i`*js=?KVzO`@gbXXd4Yj-mxuXc1YkS-0fUq6n~104!$oQw2TmRBQB&@g6I%==B1=ofM@eS{X2*(WYKJVa$X5of`bX>8H6_Q z=(Yjqrf^&nilAYghhRyx(QVLLQBc1WVi$N0HWEDK1*%+87Zrkn0n{mj)ZgHxvEU`B zAaT$DCBz6s7Ynoq5hMn}pgX{jj~)g!89-fp$aEv96#{BCF{nc?D1&Ip&dV>)iwCbz z1g$0p9adVJQvwbNke#3_%0TT4f5x1|qV&}G%sj{rW>AOnF1RtCUl0tsG#7k|A!vXN zqB_685WG+kbTk9RFPVA8B}Jv+A$gz7+{_XNIR-&N(5XET4bZ9Vc+iA-QEFleWK0n> zNN4~KQb-IHgL|`};U*1b(ByAgPHF|@+9puS0(E~Oz5;m`d8z<3I*Z)z0mTTYHH5Ny z7vx_DW(I~WV1I!-#NaUr&}=JcP*fdkWpPPk4XFGJq5F79Uvp2F(eB=Npk#Z)Id)sD-Eo8NS1ZfdLYvd7#Cw zsd*{I7+OH1SJObl9t_}a-vPK5$oV6n47&#|2HAtdhH?`)DBhYuM?W!uBle6B%tM*Q z5nv-vz_lZcJOUR38HwzLRSXOa-k>eSkX_Cf;2tgmI~{$NHy1P@$_HwIf$h2iHy2^o z4Y(M(U7!;NWq*?Uv2Wk6Ep0+Siu=%9g zwv%*ipj-U9AUz0BJahQMGEo_1h?oZ<0ICZG1qI;2lvx}G9;RkNC@}y>BXX>OhT|@S zy0ef>DgjrUSdZooBwT?{Ubo*;}ZPJ)yWa8-#Qe}VmKfGP&{D{>5j=4Zdi zg3~L=su#Wt441$&QsA;5yeRa8F9X9fuo&n_-_#;-dHutefng)~eEQk0~{z^zJ2&4C_X8{o&lAR+_G)=4>_5C;{XF>rNxkQHqa2!Ybv zc<^xz#o$6S0WOi73(g}MZ~^EcRLCg@G{<@!wBa6-UUT4XFUc(cyB$4&fLfOFpj9pq z_gA2~6%^S8a6>?KKe_>+w%!$p0iYDt09TBX=v&Z*F%vz=AWJ=PssSbX9wZ$oiM|6a zfh*C24&s{!F$t6?CcrhMC4z3gGz51Brl5&pItbKc^FgH&D3cz6 zi-GG~kUeMMLLg<3jC%ksmROXInQ=kg0dLT{7HGp0t{SsM0nHLUKq$QeSDJ}6oq`ti zJpwi4Aqo2iTsf%G21=!O;3C+95VUSK5wuwVqWuA0#h^m-5=1d59NxecgTeuF4ay6+ z7(BQ>z=c4{Ai?znE`~L@KsPT=1WoTig6j)hHD+*u8Yj}ARq~J`@dsQfa+>~wCW@J+ zL3f5tf*1n|GzNcIl?W=wkqZ*gAqRIL3PH((#UE5YfXc9<{Cvm;P!6~d=p<^eFsN(* zVPu0q3k@bhmL7p@^?13>8n*`=Vlsf!T3peC9ETyJ_&JV-6bu^^1B2b8WnK?mc2f=5tL18z8^ zP6An|0vE$&2xw4$3uu)-ByJ7-v9(@w;KqPjFPJSA(Cyr_L0j+`z_r8_xN>L%6I7Mc-Z~CcGGTV0@uH;A`-;4XlAYYIXD z;;k8Q0jRfH-~v!@b-)Fn-kN|A!0s*3#qmO3@Yq^_>H|n@%|R6ek58@0fDH^J=9Hus zGA}epHx|r3i16J6fuag$e9jw9ELmO%nZ@oQ$N&_w zQqW28+Ym~x;86-{#+3Sl;{{~u4LnLgYvz$*XS3>zL%Fs((Ky%;;GGOO}3DBG@XigZk zZa4%g4m$4{G++A=bjCSoeKaHFEJ@IL&y@@e44^%Yp!OtaPa~)W1-b_vbdlp*MurB^ zJUQt8bI{$3p!1(W1KXgzj-Y#>zk&8PGB7aw0PX(;+0Mk!02;MqWnyUf!oa`)TCW2- z2UwVip#gN}H|RcZ(7GH^CdmE>(0U!vz6j9z9MIxI(7K$djF7#I%RzTKF)=hqgVx0{ zF*F1*F))Dc9|rBm2Hn-Wh>3wAf{CHwAQJ-v=#E~{o=DIgy)QxQ3#nu`n>qW@2cV&%(ekkBOn- zE(-(0Qc(D@FfgoOVrbxIWnfsv#Lytl%D@1+FI0w=fngI9LxUPC1H)z}h6Zg`1_sc* zq1LRBdqZ7W85njjF*GExGBAMd4^3xfU;y14I-iw+;Sdu;!$npGhQlEDu`)1#?%Vvw z%D`}fiJ^gyje+4L6GMYA8w0~>CWZ#kpyfFxh6V>V28Q!Y3=N!v=N+hHp#^4WPYbpu6q%urn}#?zFqW&cN^obSEA=1H(Vi zURibqhW|_q4NM#i3{0T&c{vyuSeO|aj5rt=KzG5Jb1*P~&cp8IU|;~9gFTmnfdO<5 z_C^i{1|epKhMOD=3?j@74fi-07(nM|1UI2GBksXKn_DV9@!< z+zbq%%nS|b+zbq$yCF-t85km%85$;XGcbV8QwGfp#4|HAtm0;1NMdGaxWvuC0NO7E z+7}KwKUs~3fdRB%2(&*ObY5}}4+BFEGebim4+8_}yyQ9_28IG=h6d0C0qBmk={yV! z6`*}TJdk}vQoN9TM4%CW&^gIzybKJWbCQdA85ltOih6k&7(nMFFXLrkXa|KaF9QSU zyyUOEko`u#co`T#=O(lBF))D6P3GZaV3^Fz(4fG_z%YfGp+TFEfnhpm9}*t}!z^Zo z2GD3fXdlupJ_d#b%nS_=_!t-#GBY%=^F#I}>G4DMC57@cFo5YipJW&qY*-l@{>d;f*t0S;NXs%XIIuD_D9AD}xUe!b*vc|6 zxU(`e1j{loc(F1xB+4={c!T^S%fR5n%Fs|K%fJx8%Fxg$%fJxC%FwV-mVqIRm7!s) zECWLXD?`IUSq6q^R)&UqvJ4C{tPBm0Wf>TfK>m|uU`SzQXke9NU`S zU?^v0XqY9(z)-=;(6CaDfuWL>p<%Ba149ifL&G^a28LQzhKBoc3=DOw3=M4Z3=H)k z|H(5jG_f)?7|Am*G=uDsXJBYyWoU?zXJBY!WoXEgXJF`HWoRgtXJF`OWoT%WXJD8J z@}E2d!xT_>$}=!bV`XUACeOey9Tbo93=A__85)=r7#J3^GBk)NFfc4*WoXb)U|?9z z%Ftk=z`(GQm7&2~fq`KaD?>xH0t3T(R)&UZ1qOyqtPBmU3JeTeSQ#27C@?T=Wo2lX zs=&aoot2^CtpWqXepZHt{|XEYM_3segcTVWjmoK$3BxXH@U@I;Y;;WjHn z!w*FUhC8eb4LnK=4EI8$$zV%7lxJp`lWlfq{pOp`llqfq|Eep<$si0|P%BL&G6u z1_og^h6d1#h%_5R!+T{023a3=L~l7#Pgh7#a?$Fff?2 zF*ICNVPLRgV`%uU!oXn1#?Szo_i$xnXi!mQU~mW7qsqYG$;Qy&s>;CN#m3MOsmj3M z!^Y51sLH_L$HveAn)(Q1V`!MC%D@o8#?Y`ym4P9WjiKR~Dg#3_8$$z=8UsTt8$$!T z8UsTD$o*;z42f(E4WJp1bdY&!3=COp3=NHH3=BDJ3=LD&7#MQd7#dcpF)&oIF*NK| zV_>LeV`zA-241Mpz^~50P!BQ(bPzooLxYk!0|RLPTckPz!*n)=hGcaHh8b)O4H@bT z44{2*z3L1M^Vk>~W~wtVfcC#_Q)ggU$i~pHTb+Sn85={xd36Sc^oYrDskYs0QxUR*(Aj8hk@I{M(L6)7N;inb@cwdu=HUonaJ3~XDHUony zJ3~XPHUonOJ3~X2HUonuJ3~XgHUonVJ43?^Z3YI=zNTf`3=DQ4^RyxRnm%bWFu1TY zG^pu7_A#y3f$Up)sl&kF!_Ls~P6x7oiC-78e@RN0fgzBcp#d}<6wS`iV5|$-x8$J< z*|+4Y3)!!fsLQ~R%+AoztINOu+NU&0mw_RJouT2pE@ZzFXf~*vouT2LE(1daJ43@` zT?U3Kc7}%Ux(p1}>UovrK)4Sf0x z4BOZl8ie&37%InaJXeFlaL>)MsG0 z0ty#>28L_w3=K>M3=B6x`^pR$7#^}SG)NmTFg#&rXfQBfV0a4Jk7&Ta@SL5Y!P9_& z;UzmmL%IP2!)uWJ1`G^u*%=xp7%(ur2gSbu1H(slh6d0K4;KeR!*T-#25t_9hBXEZ z47?l+4F?Pu82C6C8m<^HFz|CQG`uiiU=ZM7X!v8mz#s&=Q`nG!L4<>$!Of6?L5zc; z0W^W5z`@WEYRJH#$idJMWyrvw%E8c3Wyrvw!NJh5*pPuin}eZYyCDOE4hKWSenSQZ zJr0J3BZdqNh8zqHpjjO=4u*!`h71gL91IPtMhp!091INtMhpxN91IO|Mhpy2AbX4$ z7@Rp68p@0q7~D7*8Y+w!7`!Iv3*lEhZuz`c2;if4A!)6YK1|~BGhHV@S4Ps^t3_Ca&8bH%V2RIlSoXr>*4skFv zgqtxi9OhtX$TnkOILg7$&}+uPaDs!O0W>dk9u&@I3=9`J7#hx*F)&=>U}ykM16|`_ zXb>@HV7SY{&|q!Oz;F)~f94Df_c<6Ee9ajc9&j);M4K}(Jmg?#h&5+mcmy)voPpsn z2SY=yIRnE}Q2d%RFgypj-<*NrCCL5e3=AJY?l)&(0NrVQ)|`Ri3kO5PLvscO(B0Nw z%^4WJgTloea)-5&1>_EEGYbX=&>hxZ77Pq5oD217z8;P8a7)nFo5nnK5oIlAi~Me0Gi{G=45ENZNb0*y7Tz01p|XD=x%Ha1_sdG z$6S_>JC7AD85oo}85&$H85q<#85%(IJo=mr4TY8r42GNx4Xu_844^xXXIe5an1Jq1 zwq#&11Ko9O$-rRA$85%OI7#K1*85(k}7#OlS85(M>7#MOm85%%SM8%v84R@><7)m)A z8eUp4FqCsLG_Y7RFjR0dG>BU>FjR3eG-z8hFw}4|H27IFFw}E0G=y0*Ftl(oG^ANG zFtlsd zL#!8kXBKFkIziXgFfaz;F#@k1YekP0*dzwhRonKzB>qGBDiX zWN2WuV_>+;$X3=Nm;7#Kc);=_)C;S=a?YdZ#p&zuYmZ|oQtzJlCs&%p2(6u7qFa&|@cVu7)<6>y|?a06o!Nt(P?Zm(k$;Hqh;KaZX&Bf55@5I0m!^P0x=fuDe z$HmYPi5>%_p2!o|?A)QN#1jf=p43=COZ3=Kb> z7#Om-7#hT!85r`p7#if985jz=7#j4P85oMV7#fV785l~q7#f0{85qjA7#b3s85qjB z7#eDv85kib!kK}gnTw&}zB2pXfMx|JgTm8=fnf?4L&IJd28O9z z3=L0Q7#OC3{O`)ZFrAB`!N`??VFnjNL!>JM!z?a_hIy_G40Ax?=*qw_my4lcmn#Fq zJT8WY)2<8*^SKxrF1Ru$w;j%-k3lHgYjE#JMprZ02HU08Q)d;9_X#c4J`J#l_ID){TK-56FFP3=Dg@ z7#jAwF)-}sVrV$)#=vlpi=pAY8w0~3E`|nCcLs*TTnr61?hFh^xELC|+!+{-axpX% zx-&2w=VEBs=FY%yl8d3?h&uzrDK3VFOYRH|r@0s!9=kIzoZ(_sU28It@3=JWk3=AK+7#gZQ85llsF*I~~GBAAMVrV$$$-wZ9i=p9;Cj-NGE{29z zo(v2>KH2!FlcZyG|2ccFlci#G-&xSFz9eIH2C;1 zFz9kKG!*$TFz9hJG|cp2V9@7gXaFrEH{@n$xbDNiV9d?X@Xv>V!IYb!fzOwL!Hk=s z0kpu@f}5d1&X<9~3glm31_oPhhK6ik1_pa>hK5RC1_lRihK6=u1_noNhK3oSHJ{uJ z4Rd`N7+km+8dmu-Ft~9uG=S#*e7G4J4*N1N_=4>7Wnc*4W@rE{#ti0WXpr|~U@2GH7_0&a$eSAGl(h1?7coc;_9McfPxQvM7KCEN@Rp8gCB z<=hMnvHlDU72FIBN&XBBRon~>psBxlZiWWXDuxDbhKA|>3=ECj3=J#&85o*C@!-$E z(9F%yaND1Op_QAVfh&N4p#u~?0SpYC+zbt%`M`c|h6eKh28IdT3=Q4^3=9)N=^}uE zVG=h(Lva8D!&H#F0~i=qax*k+4q#wd&CSqoHh_U)EjL5MwEzZ&b=(XMPXZViHiFVk z00YAoZiWVlKn8|w+zbsmfeZ}WxfvSt0vQ-~aWgdJ2Qo11;bv%P4rE|Bz|GLm5y-%B zgqxvZY9Ir{F>Z#2S%C};C%G9K4h1qWoa1I_xDd#|aDkhl;Z`66!$nZI1TipN;bv$M z3u0in3UYrC1H(0Lh6aNm28QdPbQ#3JaD$tn!7GS?;T9q9H)x$0=$P#w&@oZqMZTcPOo(VfL252|IvsT40z{~|BsCYZ zb{TZ0A9&vhc;`_H*u9Rq`K5U!;PuiQ7+|YAlJav>QuC0cK(nEcy)PisAU;h^0qX)C z&;!}70x>Wku_!UO7`&kdqyxJ4FzqLhVbzisscKA0I~uF zwAc)y9?4M98ZD?G*ig_;BnThLP>^dOTerdIWUPSr9vnrWd;>Zs19bM!9H=#kUIfZGcYjJ zGcYuO=I0w27#eOfFff4bSp%Iz)x^Ni06H5Qbk7>-9$wJh0oIHR3_T1C4e^W&450hV zK%0g@_m_1;&qW8Fm$aCHpk z7#P-p?yzKHU;v$$ZU#Ls-GYgMVJibeLopNN-1G|Qx#^(D1MNYd2|Yi3B@+X~eg??7 z>YzR7pz{llFfcS+W@2DC#=y|P$IQS0x<^bHdVV@6p3XBcG?*|mFo5n21D$ts5p+ia zGXn$Yo~|6|dFpx4^VC-|GcbV82nLc@O3r@2GGjvvuq3uyHU%#wEVmh(D?wR1>mD#Kr11@QH@G~OFBV821b4|oABHAbXYNcj^1z6t@9)IkM_KVwE>aadweCaBcQgWPF^NbwLIk>Evhpdt=( zJ3wB3QEp;RW>soR7`XHV<$KgUjG(1-pz;D@LtbiXifctlQDSgvNofIi7bR$Y4`j7f zPHLVXnt7niAOpT?skk)BEkCaWoJByHISagGy$rMgFBM!wgVsYs@(s9%Mqb2|#|S^l z4-^cbvX)I2v|2PdEe*7j1H7acSpz>ac#ano-k^0hN8lw3tIJj&D9We#5t`vGB zg=;Q22*AZP1IYB$Tu221%DkW@IP0Lf6Sf5BA(Stv#J~W_+@Li$4v<0!WH$pSjeznt zXlA7k)Z*!_6Bs`FX((S(0yE>Q(ZxKQGw1h1f9tb+Rgwv zgP)NJa`rwi69a=aBSV8469a=CBSV8V69WV2?k3P09njrOpz~EhXYCg(pn3{)h7RZ; zyKqomVPs$c-9ZaJql5wTjA~H%1PU|Iz2W;%!>ky3ZWpBS2RfbvcaVV!9#D|!fR_~K zLr?kwl`ernAV6USQVt3e5C*vo6jq@9z@Ro5NDOqI4#>Trdvig~ z0o`!|I(ry&#|h{%V9>onAisdlvjO=T)F?$idkS=SAn05)&@%h|sD4f>N(F8FE-nFY zBgF4#(E4(apP{$nl|VMkf&BIgyp0=F&!KF00-d=Aax(*@y##8eqHM|rm87760EGjn z5&-!ZghB2Fg#&0!BdDbb5(C}Y0`fyH1LQsi(4Dv-vq5bl&_Z-jTL=^$p!<LAHQgfQFIs4f;t4pcW@6Uai52 zqX5#t2c-j02%v5i1c`z|5H%fv0tI^J9jH2o*$i?wC|r=wac_m5>jS#q3A8Z^bcYQn z-1`_98bCYjCqVCKp3DHbXMG9-Lj%a)Q=x5{lMDcCM~Ev3%aWn)Q$z6D+)S8 z3Di&kouPD%0n(0r%D@1=_vbkS0|V#`B{oI|hTRMd4ZMsD450Qa=w2bv8A{-=#1rPt z&@czpwTG~Wd2(qI?3CBR7v`W=7$|H(7~~gFn1gniuK@`#Ffbg4rc=<}MxZbUwar0c z4r-f&(kbYUBT$%MVPI$gg*oWXTu_*U+T@@x2i?~J3iErQyNwticOAU~tyyMZXaJp? z3u>!_&glf*Hw)UA2)gS?krC2%2lZ({cOE%1Lhd>O^=UpaFf@R|8g%z6sGI=Zr;2|6 zLpK8h11RxOuF!rZPb8YXY^=L2XHp-#~3iP#A#r zGohc^25KvU;_E8|1H%#2Fi1}=0oVJEc`2aHG;TSG>EMP2C}+Z)i9{n^g@IZZf&vH> z6cArm#214b6ChDUSX4qqLBR&{66AIS&`}_%kQ;tL~{I;b84l|@G}!ZQ@n`2f|$q=qC?y#We3kl#QU zWGBeapd;}?qdy=qEk=e0kUKzkZGplL)UK~*fZVwSavSJwS&$zF+>ncI!F)%QI#`e-vOP~je`sU}R=9QE}+MZAq=oI+)Q$ayc*$gSlq1#G87kEMh zpo2%CfPe@<$E-lf93oH&+7tn~XC9QxU{-+K2x5bVYd`~MAU3F-334~6T?ukKs9g#2 zBj|iT^m}StnIPx!+k$YR|yH06JF@bUO*C{g%nVz>o(T>tSGE0JYmd2M~eAvOwt#)P4iqZ4GL_ zfy!b~`wf)#Kx0~<_6lfB3$)h+G=>E_iU>4@1!}v1#;ibF8bM=Lp#ClBzRQ;k3=AC% z3=N?3XF+3EKN%Pp<}oldfcg%gIv=#>1a!xr7$XA%sP0!|WMBZ*{h&KKKy|+{BLf4d z&IjEA1{$;SVPs$c)%~D*8#XXN&V~iu^#{6Va|`J1dT5>B3OWlIRDUr-?)=-%2pO|F z%m}&r4|LxbXzc1aBjoNs&{zOy>R*(@$=@k+0APG=hgD}WG5RII-K=n4r4WO|# zkXq1Pg&_BW#w<+H$`4Sc0I3DlQID{>w>Tg%vk2^3P|*Og3JpVZ7buycT?YnAqagcX z8bEe|*vM{u1icFkbUz}<4WPCI$gQBWq0!sIApJ16KE~-*+TI5S8g~S_;WhL=Fi=|t z?l)_8FB`~NA2iZ^5LPn^O$8SJ(LNV0ApeZ%f>$pHOG@zOb)TV@7#E7_9wv-XF zf0_YuV+4fh%Q9rBn6az7U2UXTt@askzs zAa(#FLj%YUp!-TeX%=)}DJTp>85tTt#)IxF1szWk18v8G#!f-~G|>H|ph55yMurB^ z_*yC>L&G};28MLd{j3ZO44I6ObJKG`{RYr|Qj81@pz*bGM#w!Gwa~l)8plQNFNAYK z?s>H1WMFuUJzNu0vPz3fKwSpNwdtVCMnK*{!_Y&3L4((zLx4e{3aZdi!x|QR&_)w@ zUoEI@2;pa;gt`(tJSl>@5uj)Vg}gswCZxVWo-!zBW?%rF6v@B#abj62_;yo}`JfaE(E}Px3WZ$x2b#7+2!bbsK_j0Kq0$00 zlR=Gjh!p6?BbWSg$nia(BnJ^LEdbpF2$uj2mO&)I&de`M4J`n-{lMKT@GJ(%pwI%a zyAf#=VhmIml!73JfZPo>8#ECP8jyqt!^{RtAqN`h#FWpVgXI~(Q|h4eHJZUC8z@{- zKrRJO%|Mbk>XA>ejNs+Wpd4hh8K(s4GJs_44^&Osw@l)puN}GEDQ{v7#SLhSr`~VcP7kb zVPN>m2-!3I3v>@H3j+h_4uv%=3=E(<5mXb*NhE95@eORSJP53#j*ccd;L3@TlbDm5L4UgFv z7(n;Q3a~RU=z{J>0Ns7Y#LzIEoq@rWiJ@T*I|G9y6GOvUb_NE}J+dF!85r!D7#bKs zcQS+SspVh*^(7iAI2ahbm>3$Cb1*RYg7ye=FfjNtF*LmAU|neV$;~flD4x zDFrd8I2Cl%58M_|cM(+5K_t^Miy%cR*agU$5_CB+Xfr%$9D_kn5Rr{D5_8fZQyrij zhbSR(GgAukL1)2&@+q=Os!R+FUqS5;$T0_?;sfGl@Btj)J}RhWf{0}X7bSy*KxGnC z$fdXhS^z-$>!5rE3vp1Kf!Lrq&_B?=WGoXy1E_DA$OO4BED3Zz0BE3riJ`$8)VE|} zXaF5ol>^#m&cMKs&&1HMi2<@-e>(#MLm?AG1L%Ml(7t`p*j6d%&SKCy2`0$>TcCaW zpt~49!do4fc!-46RI%`VX{!e<33SLnjkM z!!Je#h8duJ`AiH9b3pftFflO9WnyU1V`5-fz{JoH%EZ91h>4*giV3ohA9Q!~GA4$G zW+uo!{w<(;Ql0 zp#gL+9B7|CXdS~HCWeMSW(J14ObiW^nHd;B`|d&K5QGch!PBK9K_LjxPAY++((umqJYpt6C5fdRDtK7xgT;U^PA zLjwx~!!OVs(JTxMf0-B>=CMHb;Xh?zU|fq?JO#>=ki$6(K&c&6VS(E6pxgp;5Xes;HmL0m%8wv6XfHEp+yu0j z88k)<+QST*=byvE(6E<*fngyFLj!1hdl~f3JkZ#LJ6gZ`Ju3qPs1AO{%E0g$S6D$; z-+6*AWGGGrpVjOY2lGKq3`pP?gO{>^*dXlBn39^8 zpPQMNSdw1^RtXA!h)&R{Fp%;Gx#0;4JCN5whr)vHegd&U`@uosc^$Oxn}LDh1`DJO zaT9d!A_HW9H>jMs&BD-doq>Vj4hy6$0ovycnsa!-!q5Pk_jw4q?~sv!;W236I3okY zQx=8>Q2Ftkg`wdV=x%rxh6d0*a-e82+*_G;9VHysVIW zR~bS3WI=U1D?>vO3j+fOD?`I+Q2t_t+;98jErYD<5{WYFbeV1=N%%LQx~bgmU- zBq*Okj4UWhErS{f%B)C&hT!xEs>mVsprk+08S|i)BE+`R;#8C@16lzz3EBp=gC4@u z0*WIB1_l^^I;1TO=7T!*pmG3t{1g-ippXRBaj@}I(4KivyqJLYY%?%0n6ff7fabL= zSRwOb)~pN-pnDf>L1_VG7b`;p=q@ySR)&T<3=9lTtPBmH`&yhqd&3zS7(7`aY0#II zp#ik6CzzF?p^TA%A)J+=p^Xu;SAG^F14At6OaMj(h6GlI2GE_tpuO^-I}g)Y85%(2 zkvXi8bv^m4kUL62d*Dl%Aba1ZGBGezgZ9FM?igleXjsR@z|a8NtIh=3>;91mvbSA_ znSr5~m7yUWbmuTDLqj_=1H)8Sh6d0bt+QAmchG_MvL9w}O$MIK;}(u!{w`UPl&C<72s)kxO5Px05C*v)L?hq#a~^cI0RscW zWmbj;P=yHEn-A)I-e85?fd|@y4;p8G$jZtM52epM>vobV@GeY*> zgTjrOk%7SxtqjR#W?%rNT~J%(8?JDJ);Ev~8NoFTs7VWQE*gf`G$6;K2NH$^W5P?b~a3uf=H0UfNm=B652p>{+gR(kALrMj>G6yx* zp#sngVL^EqlrLb82ZaHM4LX()ly5+6Mm9*h6?EPJsD5W=gWNC7!N$-4nqTB%V`#`^ zU|`^8V`u=4FY>WL?z0mB?UM%$l!5m1gXSOEAoYqQ8)TdYbRNN51_lOsHb_0A#0F^- zD6=s%@PqEHV`FF#WMp7a1?@{`WMI%>V`$K4WMI%_V`u=)eQU8XG=PSl^g!-lgq%+R zx|b4kE&=GyP75}MhHgd%25UBkhH0RF73f?9Mg|63Him}9jF9sQHZw9XII=M`fbR2i zVq<8y4Z6RQ4YKYRbY8(vP?-a|*A{eNB^yHnXig)5jiCY5c?e;H+;<$##?Sy-7YRDA z0CcxH=)8h3(0N^Kkg^4IUIA!5a2#mAJLn!uHim|FCI*INkUN+d7*g378ul|WFl4YX zG#p`qoL2x^2VB6$&~T55fuWF%q2Ut~149uTL&F!)eafKo8$joEu`x7AGBYrgvoSPi zgYH)b-6IP+w~GzZ7q0`IS^Tlcoxt#RhA444WP^kT5k?Y&vu}>F7Vx-3=L_Zx&<`X#lXPe z#sE404Rk*s=>AjCyeg;$2d&!!)j^>7RnT}MXnqy6z8th}4^)QCVZdBB4Z0-+H0};+ z>vCZWPtXcA0>uW%`=DY2+55;H*Feynt&nH{wG2SH93|*M9bHh-3d-A{V1y_Iub*cC zg%xr;9kkXE9LBO-1mLBn%9oyJfkt z`5Dro230gLr=Zaeg5YUd&|omKr$L^8)(@a~glPiV2l5A~c>*fYK;ocvgCKu_=4nCh zNQb%?G+cnbeh_rS2WXrbG#|@@&Ap&@qGw(SIGRAA3$g$WLtPAV7P5;$eJoJ52PtIB z;8zcV$M`@6I?Nc58$fG86b5WXl@y_HWDj)9>828%!!+pn#hDBY4f`1w7(i?JK<)?4^Mm{eDl*aMa6xSskR70PV*EJ#iHK5A5{0=K ziH0U%^l}E|Q*?iV>_hh_Xq^Gb4WM-fAb*0^8G!t`oPnVMvI(z&U14Ba+17z?;-H-bhr?lUknfcyg5 ziv;pBsGdY$qXb&J2MSlvx-B7WelEy|Oz2YL-@MXX8MspiKFA%pAp*Ks^&iBopd3o~Hjg`hqdL?r_Q zC_F&n47$z+bbc;K9JFo~6h_}cd4qw00krlLGL>m81R`Xr1D4WKq1Xul6=988@NGOnP($j|_Cx-Muw zjFEu>v_25D&K5K$FU82fV93bO09rp~!pP9z!pOh?nxpq)WMD7@?ayIkU;xe4r!zwK z36(Q4Fjz4%H1vV`8jK7LOF?}N&^{edUxSgM0W_xr+CKzJ_nu)cOUPw3 z$UUI5ppolgP#X%QIiG={0d%DcXnh_i{S-4WG=L7+2DP0)f_j0BWOv_TNrtU}yl9{j(S#>xDsW6VPDhTn2^)(3(TgT0{v( z1_sa?L{M0)gqDS%b@PU3eFbsQ9y$i_JT3z>YM73|{n{|O1f^q8QUWCt&~hBqWCB`33Yt-cBn9}5uAs^cE))q~90J zESkay-na=0El{|CG6Td8P+P&XI09@lsC0zb0TK-ZcXc7F-$3OvXrB^DKL~^336$PI zB@-x(fW$y+xxuE)lK>KhjKuo@1--GIT(3l#? zTp?xIQe9eYnXi3=I7s^(+hwp!GWjtPBj(85tUESt0v!Ls%IY zW-&4}WV13bfcEEt>KQ9g+XF3~r$Or((B4y4^mOh7z7`EMwgSqwprA#=(6#}nY55Ku z-H?maKoJWnM^O_zsGI|py^y4WxU>~ixq!+kh&UuEf{Hf?KMP!1fszP>4>`jEl*kYz zSW;p!%rSDNczkXn=ox)m0=XalX~1GT9^)8q_-f}o;pg)pe8TArGjo>2l$ z&!7qulKP6l4SGn*V*rpR9%vHmFo`gzge24s4wytxkaK7d z*cO-+CrrxO$3NILz%j&wK?16a3ohm8;}aa}6vQ9~mEnfT1i6NU2Kg}vL&bSu;;zBY z3?fiLUYMXquoLK{14wA_!9-pCT%0`|gW%rghe?D5d-}P!M!3L7l7R-1 z3{1*3BE;3t#nr{n*C`0DQ5Gia?C9g;4vuG-b#gGNFu0j8DS4Qb2izr~eB%MnH>t(R zF8(3GuFfHz{(j(;1CoQ}o7CcDaEKVg#UU9dwKy3ZQO4jD1yT>mG^xeOj(#o-LJaJJ zAVEl$Ni9zH4}vR%Ht@mlRe#BeS%%#;*gvG zGTzb8#orfh2qYt<7AO0L`oP@+$pIk6u!7gf6z+UT761itU=YGFkkk+IR4BrykaQ0U zu?S}ma5(}B6i9jpIT2jEfQl)QFeI&mEcN$6I0cf-L836H7#qUfsQ}IcD3V4DpiBoc zPZ1^=>>A=68WiN}7ZMNxcZ3p5*2B%m71TI`q-U=^XFq=kDXmpvJ&1xL=fkfu*4! zH$T}eB;MU8GQcC=%|FQ3F(lsE-#5TN*fYcxoESm(jxaE|g~YoS6~+5!gN;5W0Mc8W znNUvcuWYW+6{p4rgV)}GN)3<%ILIIp9*JeC z@!+uqaDakj!C`_V3+}RlGJq4R#iZ7Vrd1qKncyu z&dV>)i+9V+NsV^{o!(W#pv=H72vWz!fKca|SC*KQnG)|_7upt1xPAETl^BiF32wer?NzNkOqeYxjOpB2ZuO@ga*g^ z`3LzrLXt5^2_#femALvlgHsDg9ultT@(BHqfJK*g14lXN!Vm^<$U(BTW3V%*`3A`& zAW1$XNf%d`EGUnFWCf9Ap{;CR*N`Aj=U}i0K}tkWmALu)g}{`6k`+jaD5?@~*C0O^ z#}G$wAcEw@Fy#XrJ%fVb3dB(rgakP{dxK1Ydr=BW0mud5+yqLsAminbBt3(jJzYR5 zz||;7RtZVgI{@6;012z02uHxhRZ+wv!I1<~uYn{E^?$HyNH93vf#h|O~b zRw7FlfC|eZsH`jlui!tpY>6S7$sp{5*SczeLGHAOj==`aa z#G;h=pxP-_H9oeBfHpqnxS z12coOn-RE3gcWtjMItCofmE?!sDc-WpwbnjgdMH~dvOTL=^%9+aCI;XL%{K@3U!bW zhP-=DWkCk4kcPQi1w$EV(OA4kVqOY3(Lj9X09WN-S`zP{7Vn#yn_pDPpb51s6fO^Q zOmIn2YGQ6Yc=!oCFb}GmK<;jWD-AA5OwNw?FH0>-%gHYX*KHsL3lIt_^Ge{QJg996 zl3s|A2I~*aOMw~ys;)sQ7Qt0`rsw4sfs#JN7faw0ke~?3&yRP?Oa~7pxPY?_C=UHf zbCXhwAj>;IMuKD*!8)NbMTyDaG72QYgd_o4`2y;2M=66EQy`;2HNHQ1$7M)9xCalC zf@pzA`DEsSPH2MZVgZ{5k#dF{-UP}WRq)&a%F-x#3zYLfH z!ocAMQjt~?51K=R6b#^U_6S(BTS&Zrkf*C(h$CohAwDE1)D_g?WdIeTAQg*lINPtUvc>0AvG{q}3FdRS;k9T!(cLnthIRyU+g1eJJiNz(UMe$CV zCBdmB@ouGg$qdpA9D<-BW4Dlaa3KKkJBR6N+bplZu4Bp#sy_wZz#ezXGfYWa3|8un!=f&qyrtORa!}CCJT(&@@AQ14<$ckdy#*2*fww z6w!jF1<8#v3><>Dpwf_38Jt?;o1X&l9>`P!h%7i&!u<`B(1u93fyNr(5}?=y6^oFh z3f{#7E)Yc+I0XNSg2N&pzqlmc$P^TzApcx}7z1@REHw%;a0sGCBsf{{p#^79YH~aS z$WCX7DPUJZ^A0#we#8_9>j4GxR{?M^`$EcPm(=2tqS9p09yXBgOraWc@=FlW4RSB& zlFSgpc+lS9Vo)8O2aYyL1`a_`WfEeDlx9S=66zsRrG9t(vkOoKw z(17RwhpuN{CM5nrt_Ia;pf)YIcU%N6Js`T|K?zy}>?L^02}>;U%u7i{B(1p+V<8zK zpeVH_aTzdr~tbMl6?-#fb%cJ&tP$ICV2-EHi85N*h}fMNa})9OF(NTj6v$b zvY%1H+c`fECBVNUC3?7r?O@ zv%vudP8y)2Roz13q0x^>s-UFzMjY&sfTGN@#FA77Q0#s|@@%{_Xg?g-W1zH>4{;&1 z-R7AOmH=7)5m}FaK`JDzfV4bRWB^wZjzvY_wj4ZBf?E3_hVf3&vr$1tL82F=OAl&M zW>soDJd8l;>nTJ6l)k_w2{3R7Wauy5S+(?Q*%<2A&C-{?$RMro_Wbd;4z5A z9B?>8Tn@4$7E^&c^ax;=#F9jiHyJ?XsYQ8-Iber@5`QLg#zw8%^`U+NWj*k^-{g3( zd7#F#vl~*X0(F%^&H{z(M`-eQ0*@bqT(lJtVZkLS;8q7Tup#}R{339X0}^u!iTBJa zF*X9%2%t5c@Hm3>GUCB;y%KbJad13FF$rojoq+fil=9*kKmiYG;T9ExvQ-J#)SpmK zxw$|RIyfLet(-I9fCHt>)FO~8Qj0*=ANxgiN7*eSCl z9@I(lO)V+POa^5|23`gZK^BO#e=ul6IEUbOx$u)9)LI%lp?^1#tz|#?9@td zxb1|*8dwRa970W3keX~OB(T8+N^nko2{eBqYwqBpa((>4DJ!}kfkZ0BIg0b8Q>uR zunC}iI~C$+a3d-e)K~{cUNuA%Qb96+)UAfP4P48Db%WAZ93&-xl1VW*zPuqCU5YZx zQi~u>V6bA4cR@>2+(P1=DoawqMc{jg_aXHXD8qol3QHg|fNGe<5QD*i8}FQ7PzjDb zP*nIqWFT$5)FN;}3L1q92#yDP6`UkNsUn^MRLh=)L^dQ{#=Ga2M zqv1_rkntrDDM$+eY^fpxhu}kqC~~do3(u^Oo)>7;15~_01~wqAu?lFYfx0)~^Ugps zb{v97Af`d=a7itOwv02N5m%a1k{Ry{b{jY!Ak{UHCN!4TA2^Afh2(KWRSI@LDDl`N zDho7}8e#~m6~UYwWpEIKjA@6KFJMtn=?RWIQ1F60;078`110}okl=$=J>aP}NYw-O z1vtdGpveXrTVOG6r04)e1*jyzU4KBTxd>>i!z^=5Nr?w#gZxrRZv-3_uTdNXE@5t> z##lVK!<7#yut0^T2v{CkFoPPEKGL9(ig?GA{3OuqVM=^3c#S!vf&x_xmmnz<)*1^+ zO@@ct3rHafDR9A}psqqBBrmw9mc)l87D23n1ds{?hu}vPH$&R^s6GR=!9j}$K+6V@ zMuZ^^o^#MB1oaqE3N%nWPJ~E8#(u%>0TrsCH02f&9~zvIUsM8)S)^87Jh(PE1JMYM zf3QAK6gfbn4O%Y2atkQ+fi>NM_{1$UH75nE2^3mo5R;$@);Tdb1Dxj}5i*Rl z0-_vjG1@2#C_5CeF))-R#^+=fmw+om7ij7N*Q;PVLD>(KP(uvk!43hJ0U(E@D1(X( zqj;FJ!Idm%#Fayk4YMr-FTz2#Y9X4_;QD|cT5N-wyqDSX$TMMkF*W zK*RPRf1ZYfL`Z&iY981%Ab0LV^9ab&VsJC+wGcRCLoz40VUhze08}6s$2%4jHkpn6nK#dGgnNyjQ8qWZ#uF(ovP`L+=Z$n7rfegI^NjkoX6#+&0X_+~x;ATW1 zBno^olZq0HD#0!QjpSe(Edd1*xHA!kR?1=&>7eKXEma1UAE0;u4gErs7HCu%!1jj=MX+SOp zc@pdRXgoOGB`QLC>0yaErKw;eK0>?=N;SpFMVSR9;P~=^Bmz)1;p+>DT#)myj5R#@XScOFQ}~xY3f2kju~2Hf`%Kw*$-43JcpDy(B=?W802G60D_{$ z&Ctvxzr@fCT+bLG>K(*rFsSB49n*%CxPOtm)ZmSVsYT#44hmt=eqB(O1sAy>`*@*M z7$`G7 z5!oOfRP2Ep5+K(;hDtd5gg}}j=>1}Fqvb484;q}&lm!?V;&bvr)mA*Dc_1hU9-4yI zm7r7rN;Q)q-UKBK$Y2U=%n1~J}0Y=?;SieL<(ba0s?RTmTVHEdqxK$Ovm_`vF?GfPDp8ujm#6Y6~T&#)G3N1(Jjy z)fOTVgM!ooVlXJr#Dl^boB%*3gAQZ^r7w^s-$c+#NDe`aVGMA0#1T>kfQDni@d=6< zurZ*T<_R=OgU2Sp&ITo>Z^+|npilj2^4fa5OGjwBTBBf5RW>!xPg5LidY4(J3+CRS_GSm1=l4`&=_$l zO-lo(Byiri1xX^{7BIMlfxQ_HNy#Aq<61ythE=4p4guG@t?rFzDPSXbdMF z+@pac2~hq;YwLnz3G28TxY)sHU_jF9dDNaOIHk-1MUr7W*n418vCV4Ag71+?@Rx$6aKNu7km45VcUnvMs@HYjS{LgE8Tid;bbIZ({pg5(^?XcD;j z>nQ`SLmKlMX3o>>!B+Hbn(5dDR&>1QQ_UA@w4`GiKld1=QCBn+__!P$u9Y@vaEXwBX=N zg^Z(OX?jBx?}H=~ki)^g21Sb_%mDDtN>F<@50Vx@1rlVM0aSTInnieK<-m#aojAB3 z2Fj71kj^tWr#L|EfYyCryFsA^+QJR0xj?f7AnV`~4-w{oZzu*!fLx1Gf`dy2)TSV0 z^5qyLmB7oM*N^~)7D?dt3+SXqkkzO|24H(YX&tn=86*vk15lS3++Ic>0|Hm7(D`8K z;B>rOW*+zw<|1&}jAH;0T>6MWTm`L4K(z+AG(dPA6olY$0ldSyU`Mz>k{7HjLd@lY zlFe0!k7oz7gyUX#WJ-&w*rYaOws540RMAVjXCM z3TOxfI@t>8<$Qw-gu1!JL*~lB6+GA&kZ;~XawD|w3l3%M^Er@$R~cd$bdU-*stQgz z|3$zvXP~?Yj(AW55=YY}o&hwH;)NE9;lL4%|E8YDr6r52SyDnM|w zPJ)zwpf&@n&lwMzi-J@Qpyd7%;#bJb4LB=dnMVW{xcZ3x1SlneTzd)9v;`RtYFL0a zOMsIzI3z(eHDeH*e7;IP56$^snxphe*Duz}P*Pa(x9tdR;D0|6)2ACTaM z#A!Tq5|IbJ zr5D{W4oXj;>;)NT z!!{BOHXdcN7UFEsa$(SN;-bvdyplxFvT}&OyOB~B18DT+CBz-zvL_zu5J=gKeeDC- zkEkO;kmSJv9oPUx0l01ijZj`iDdk-AQo#0ryahJL8b zNeMLf49aI1y&~|`({&VEgHjWbtOb?5c;-_eLps(dRY^QJbAlZWD)vE(M?gWFmR6h! znZ-E_u@Btt1^WxNyoaQ0&>gj)Mhi5nfa@4{6nl!}K~)xbX#v{ zz~hGC5CM%C!3HwG!_uG%40OR1C?r7X&^NyfGWuQs4GYM8Jt*oyO3`aTaN6U97A6qa zgZ&B$U?!+Aq;Ci=zd&cVgKUCz6(CFKL1BtHT?|exSO$b39ZwABL5e}_%SezL)Syvt z&}Las9}SYOK-ObSS3p`V*C2@p(tZO+z-dVH6Veg{dlgg+2BH>?U~y0opjNox(gtlv z0~~;$EDj15#2f{JV zp!uDg#B|6wJX-e`(tp6&w*%)!P%9)pGe4;`4V;QmN0z|x2eJ<~(BYGx46fV2UdHIL zK{5i$KqJHnx}fpu_~fDz*q}A|Ql``*$ikX?kkTBSvkQtqtHHpbj5fs#j=I|rrHFx1 zutT;(I`W_eBEcn)33&$4*^(MepxsUk3<8X8JI_}upFX|zaBPa);V0XcfOheN!~?`0 zc&ugGyfs0m0w_diK+9h2)m^ z=auGjfbXPc5MW$7JuPSp%iFtq7pwiBHKk)Q149!d$lmu(M`qtTT9V&Z-*IdA!+&SN zcegPJFzQaS+55X~EvKGg-NvGbJ$yb>-KS-`+x!wfRty}CipAxWEcfkBP} zlgbGj28Lv?_>_fNb8LNHcKRsGUo2g;A&Y^b8!Z0*qHEfs?f;jaUo`txeb?4c3=EsV z;;g3m2WBkRYE|&54^QU38N|SF11xT3zIl=UuU5M&RvtH{|M{O`VE7LfpCrEh&6E!o zi&C!sG0;717RbP$#sYE=FJI7tSXS=Tg-Eop?6$9RV8Us44y`-`r)hMR8 zC^-ha$1J9x7<}-8UNQq-WhI87ouGtNK~94ptO|5^oL(|RvQWGp0N}Ij1xwHOA0D&p^-6z{tcv&mg8Wxu_&2Hxaa0 zN-u+QlOTstQp2R={G!z4qLTRB)ZFBP%J^cv4E!NmPz=5ifEvL8v$`Da8@zE^P@Gmm zD6Zfqe^A4H#U&}3`P2;Ka;lpMHZVRpKQApaop8)078Ml}48p`T(6)i%R6;>rPz*jB zg|ITv(JF*hf$yFmtSmFHq^JP9GFZNY6&o?&-Ku$sIWcJ^$%#41gu^E-KaXJWzz&_! z1KpzpIx`S-hX5OckD!(~_?~x$L!fhy89;YifmmD&pfe~zEN%wSP4OTW7efK4t^unn zfwH(jcV04p20XYK3_vA60|NsW!xbjbMaK*b+zdCMEG`BIW|$c0_C8Rro{M1tGw2pY zkUG#!eW3mW7sD%N1_sa_^V|&Ype!zipUeylpu2au8U8|9TnsEM3=E*N4Y?UOpe!y1 zQ5FVqh9yuI7ehHOOkFjU#l^4y z%Hn2N0%dVANboZ-fbL@BW{`ohxEOXoS=$aWg!DvbY#T6k+Nlpe!zi79|D-&>f)M3>{Dw7lVy5OboQF4!_T~*u+B2X3=!y+h)n_(H0#l`Rk%Hjr{$_LiL#qdX$fgv624+cF5i;H0b zl*P?31+Ipe!y1Nkaw((4B1D46;xb7ek97OkD?*#l>J^%)kITbDo>Q0?OiIxC3Qz zGdzH@xEQvWGBD(T?brcjaWRyb!Ne+{EG~veP!>1CGboFTLBt%UP6Eo}VqmdgU;y3C zz|Ft`WpObCSwQ;a+zeq*78gUT1p`ADINlPWEG~vT3-Gzm4BQMwP!<w5u0UB_3@kPI~t%YE(QY^ zm^u?Ei;F?Qm4TrUoc>gxEG~vAP!>1C3@D3>;fpH+LlIcr4=9U^p~Vd*)&XU4F+6c& zU;y2n$j$Hq%Hm?^afgXbfU>w4-nc`?p|}}7Kv`T24IVJD7AT90fx(l30W?C)&A zaWOg+BvBHQ0_dP!<=1 zK>$q51j^!KcoD$BPy<%?2Fl`Ms0oCLH9%Qh3_L-Qd-b>(1fVP~hFMS+H^V$Ai;Lk6 zl*P^P0m|ZHxD(9406OcQo8bYJ#l_GO0u$?jvbY$wKv~=jJD@BshCfgiHv>Z`Lgb z0J@ipn_&l(#l;X80TWAtvbY!)Kv~=jOQ0++27^cjh9I} z#lQf%$A_E20?OiII00pGGn|34xEKPW85lr!7;rO$Kv`T2_n|CqhR0AA7lT0zOq~go z#l^r8%fJA-4Nm;z;SGt7XpxEM_07#P~XZnl83xES_8S=5*Zk-fz=g2SzHVcpe$~N zCr}m_gGCYp1L$6EZU!4Di;LkQl*P^P6w2aaP)UZV(}1$L7`7xcFo5p5;AYqXWpOch zq`<^{pe!zi9VrY9H^FY%17&eBIHbbFT%as2h99X644`|Oxf%XISzHV~X)v(~P!<=1 zNILi~Fa~Z02`Gz;VG)$Y&9Ds0;$rv$WpOk7fU>w4o@6jEfbO^8W_ST*aWUj%!o&)o zEG~uxP!>1C5-5v{;R=++&2R(C;$kq#W?<+9`^^H%;$nCUWpOingtE98BywQtWS}fA zh8?*K3|(Nod!Q^X29rFPm<5!@#n6+-z|aj=Hv!7xVz>ciaWmY3vbY#L@);OFcZ+f} z_&`})4BQ1UF@7kEi$NF4;$|>}vbY#Lpe$|%A1I59;Y9)Dt~hRnH&7NAgI*!{{s{(d z1|ukoi@~-Kd=~`+H-jUT#l_%J$iM))@`Ibf2g>4Nh%97am<+B5W1%cAhO9ychDl(t zJSdBcp}LTPVIo+p9?Ifk=qY3X-E+af%`gGV;$m1)$iM))gO{6O4V1;jaIlbpVJcYf zQ7DUxVR8}7AJd^ME{2Ct7B|CFD2t0hq!^}70?OiI&?#eJ0Nvrl&0qj!aWPny!^CW% zEG~vLD2tmR3(DeRSOaBoGi-pexEOLO7#KkJ`EfH8Kv`T27oaR|hAU7O7sCrEi<{vM zl*Pr6P|3h>7n}}Kpe!zi6Hpd6!x<=xi$SA`f#Duloeq@6#c%}5;$}DjWpOdYR5LK# z2dhhfvbY#7Kv~=jSD-8|hJYFd2GET++zcU578k<_D2ton43x#i;84rJ@DOaC3zWsh zFbB%wW>^4aaWVX{8L82ZeCIe-0 zF;vt;=Eb-fYM?AGaK!_fE8}KhX@JObF*GzVFgyjD*8*j6F?@isxEa1cSzHVzjWBf< zP!<=%nMMYNXJEY-pe!y1g(jGo3Y5jgFr$fq;W=2{94L#6;SH3<&F}%r;$m=VW?%r_ zyTi@k0cCM9xU|5EG`CxZkU(~l*Pr+(9OW`7Hmfgl*Pqx z1{8;YAMv!+WrKZ=ftLhMr!S*aRqx zi{Vc%0|V%;CT?)n2C=vpYWiSe4Nw*r!;?M+2GIC8H^U1ki;E$pA10OoWpOc_>4)4K z!_9C3%Hm=Om;e(CfwH(5c1(cG5ppx^fwH(5945lVT%as2h7}VTz;n;s3~Qh)E(VrK zFfk4&i;E#;5(C3muzxe4EG`Cy$uKb%D2t0>#$*PDZ(wzEpe!ziq$x15G$@OUp$5w0 zW@v!2xEOqkWXixEMA=S=n3w>R#l?^_gMr}}SX}{>#l>&}%Hn1?17&eB zXv}0__zhO417&eB$jpL?DL`3V3~5jnH$xVb#l_G7WpOjKKv`T20kgsPNiuLVgg{wb z4ELcdZidHD78k=0D2ton50u5lP%(#r0d!9-H$x4S#l`Rf%Hn2t17&eBM9gJi0Np3a z%@6}+aWR~LvbY(}Kv`T27W2UO>M?LL*g#oa3=Z>QVlGe?7sG@3;JbktxEY>6SzHXV z3&8hAF>o^|LRnl44;R4HJ%zHk82A^$#Dt+NE(Sj+i<=<`%Hm?kfU>w5a-b|OhKfZD z4FADlUjt=vF=#A?iRnODTnr9S7B_J$E{1|-3=B+QbtO<17sCrEi<{vMl*PqRu$+MbbVo5a zLkX0{#qa{k;%0aQWpRNo2xS4A*Rq0v0mR~BIJg3Q2Nwf3!%--Ui{Ziw@O@ki+zeNs zEG~xID;OB&fc4&ovbY#BS3*qTX2^xIxELltS=#mWpOdM>||hA2zH+bl*Prc1B*~7p9%8=X)8c-G&Lk*P0 z&Cmd4aWOpE!@vN#r<|MN1(e0bP_P#!Rsv;lF+AAIz_1MLk0($T7lYD128Ko8Fi?ZC zxEQAFgQ=SVWpOe1>}O!$2CEBzvbY#_Kv~=jd!Q^X27v<%49mfGh(K9f3_GDLZic;3 z78k=6D2ton29(9c;B%0H0d!F(H$woF#l>(1%Hn3Y0cCM9xEx|&SP8bn1IprJcmQQ_ zGdzK^xEOvwS=UK5r`}og9wzx%^(3~aWT{! zVPN0^hd~3B#l^sL6ecDBWpOdgIm*Dm3s$!P%Hm>pc$9%*F<9&=l*PrMe+;J17|P;e z=zy}g8G4{BE{25T3=E(=9NHMTntB`EN+Gq zP!<=1%tZzU&|S^k3<^*d7efh@#m!IwWpOc_xyZmE3^wlql*PrMa0w=+0%dVAR9s>J zuZ-YksDZM$7&I=!#B`u6E`}AC85l&t=B(c>ohjfU>w4raWX|kOrGK z1IprJ_yc8egS(j^SuTbtj~EzaAnKqjE{2Pb7#Kize{wTig|fI9);xx(+W=*8F&ufq zz#t3OdjiVhVla6M6SIJ_xEQ89Wnhp4tD6C3aWQ;>vbY(3Kv`T2KF=5!0IOqp&cFa-aWND?S=q(BVmeS3 z7em7f1_mXtc`Z;D7lXu0n3xQd#l^7VB?E&pSlt>Zi;LmMOUS+J+zfx9EG`E2R}2ih z!0Nc6EG`DIR}2iB!D3QS78ir+D+UJ89p>B¬%OgUKrf2GBj{+zb{_78is4D+Y!S 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

    <(cx0J#cO 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%0ArNu$XrUka6kif(@XbmAYCxdTLCf3#9K`PK( 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

    fuR9(NCIf?8npfd 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%0DG(Du?U)lB3=ELw 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ȧfz~7#Kh*gOd}Xu?^*C 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 Z*EfK;sK2BIcmc1r!kr(3k;= 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

    ^#D~Z4iFD_6RLed^*@pAvu+0s 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

    fL_U>4{&dyr2V!Q-1N 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

    m!NBHK;v2=Afr)Rp$3Rn zsE-QF?LI0NkP$7gqn9%bsR2)kWWETHvDrw6#wvOpSD0EHaH zr`@1>i-Gw>_d!Uj(Et_@kf`wi4VwCZmN$feMl_LZ=yXvDfdnAaYdM%Eh?$Vi8_15% zM$kZdw~I;$_DQzpBLyh6*O@ae=u2U6j8cNKZvj%$vH&%|VeQ$1ZifPB!vxfW0;L)k zPznK01{Qd9duD)mko4lBQsC0t>gomh9fFvP9z)%UWz%dp^a9HU~#y1PV8RgGT z&~zSB9t7RQf;!YRgOPy&)Vu&yf(#4{-7PAh;e<{I1zG_F(!v00pSP%hm>$g*3?(w) zA^|e0*8>sm=7f&uz&l;n(GxeQzr@JE@Nyp5ZBXN2Q=u&?pfiC$=@v})_NahP#)GC? znA#o{kj34eJe?j2pyUO15G-{=@|l81BdGt&$iPr!(LDw18E8QcHVc;Xp5byFBO@dW zA(<}#N-K~I2kH$ffF|1=U?XhE4uyKKd5;R{ln+oTvW$U&p?Qx=3L^spKYuG|wi`Aa z#|>U&;gNlk0pw?pUp=~6nE3axaDc}D7{M_CIvc6^g)>y3d5;Q6K({=^Be@04gnEpB zTMIb$x?38-iJkf2{|B(pIqskU>c+l?d*`@=0%*?ZHF!xEDEy8)D1cfU9>^X6B~*|T z(C5IrkAsR>P?ACJ=QA=e#2*IPjDneAfRUM*3C2dy3~(k$9$Jw=Da7~y${;lM+4XMF zYa5y1-O!%(ih?I#6v0 zQ`35&LgS&d5^#b5t7^wUQ592{b`5*&O8el6y6*wfZgC{5R3bNCN396VtG<#9q9SOy;d zPrzLa9zHt=(gM}43}QnyC_x(F7#ctso52HVQWKgMKoqX=bVv<{bv+~~{evnSq}l*9 z$^kmN0aV6;mP2&5sDLPhO6bxF$ht&uX#w$4bB&4t1Aog$a2o{_U7-0)SgQd#cjy4} zqC>X>2WTM-Xt4}qi8P2};%@;B7=f6~{4Jm%s+X{iuY*T7WJVY=Y7I8P17$`SRQ!TQ z(HKfxA;AM3KL?3HO4|}0P+=4TDndYlpqd3{8fap((@_9Y9kagd;9y{Qtpm!wAcYX$ zf$H&2M}gO(ScPAPa)5?AA&o6a%?}-N0F`496TtZn96qJKKG1dE(675w`YWbJ6lm+M(-G852RE4t z*cljJ$H5Xow?hQ>2Bl{LqICeV-KEtXzJ;2`zax5$hvV+njC~bqXAgDY{$12l$pu`WW z1ZcR^1cwZ7i4+bQPH;aFbXyW+gdhi0-jAw?djZSDbbASl!LbT@)ZIM6sD zD4d}UCFI;#1RbyjsqS`&L29Hs#yElwZ)1S9bMS=-56D8SA%Y@<93m(ZC?SF-gA^iY zGLR4fk6VMsObVbOQov9u0SggOf#}ffDbVSm@v;p(S;$RfEOX=Z6N(J7pHL)F{DdZh z&4h@ZgozF-fkoVAtC-D3R*iWGLJ;+ZLSp8)1@*X2-Qg

  1. u%Ivz!!oaW-Z8dGk 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

    3gm7pvx26rfno535( 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

    oT0@AhB|ZsXf{U|#^6JzSG z(S^ZhULy;NB6IMtLHm&KNW-N-dz0WCBnEmogZ3*SN#kUK_Aud;M3MmQYeM4UWP7M3R8@YmkJnGC_N%uu7l_g7#CP31Q`e_E=$+KobP*yFwGf z$_4Gk!YY9#2-=^8CWMu%id7U-5VVgAQxsDKw6_aW6jKD$zr+;96ak$Dk12{N0@@db zDT*lq+AD@BiYWrxKZYraDFWJ4hAE0E0@`PWDT*lq+Ixm6iYWrxkA^9VDFWJ~hAE0E z0@}BRDT*m#j46aw1hl^ms|1=LXwMs(5LPZ|9~@Q*G(phbI5Z)wT+n_wtP)rRk;_hE z>sc(uj0z3n5CFw741?N)uy_WwOF`lw8q^kpiG$jqAaM{4YKy?cLG4bEIEV(d6=32Z zGeP1Y8dR6V#6j&!kT{42)r~N5P&*PN4x&MI4NM%=ZUl*gXiyms69>5sBo3lMWgJW# zM1#aZG^h*$(V%DmwF5!oAR3ehVd9{6A4nWTTQM+z_j`lXgW7o@aS#pK-w6@}VNkmc zSscU$iG$j4AT~@rDEvU;ps+#~2ZbL<9Mn!j76*kBNF3BILly^x6G$8sw#ee3Z~}>g z+Fi)vpl||-gW6fh;-GK>iG$(-SsWG)pmr2U9OOUHzEYStsNDn-2l)@Q?-M2tYA1oj zLH+~n)r5(I+C?C7kpDpYFk#}LxCV)X{1=53&Y*S=NF3xp(Edc2dQdwDBo6W)Xip(b z9MrA>iG%zH+Aj$569|LaG05T|Hb@+lmOyNndRV-G+9}B5uy_HrOOVB3@d9dxAdAD| z1(YU{#bNORYG)ve!{PP=*ESbTx@nj?$D{0k~WK;oeE z2-?2}69?@%2Z@8yBk25Hm^f(PIY=Co9zo~s!Nfs(&q3m#^a#2u0wxaHe-07{rAN?S zGnhE2i~@;+(j#bp7)%_r4;>V)p!5iun}CUf_M(H-gVG~tUl&Xqv>zQL4oZ)pJzFqw z(4KUVI4C`W_G7`sLHp7{;-K^h+6M&_2bCcpaZq{$?Qw#MgZ8I`#6js1G)Dpx2klV@ ziG$K3Xnzq*95ki_5(lM6&^{rUIB2grNF0l=F01^kKM`UqOSqjPvp!5jZ69Y4!;UyzOJm>-@ zkYW&KV_^8t#=sE3&cN`Woq=Hi2Lr=@4hDvR-wX`@|1vNX{9|DF58BA`j*;O%=xPLz zo>4p+0z)JO3|JW$`dJwmgnu(Ih=VqBLER0?lOW~-P=NtrkcdHf3#8=(D1(6*WMZqJZ)nI2joJ!zv#J1_lRl28MW0zu;tQA<8ScX-qZt?&76>yi{1;|mC|J$FuphK(8mg{Ahk@Zgs4#}| zL7T?xK^w_V|DZ-cD+7Z*D+9v=T?U5#x(o~s%NQ8uFJoY6kYQlx2Q?C4>Ny!0 ztT`DNY&jVi0yr5Mf;kx&k~tX|(l{9y>Ny!0b}B&dgB1)6|3L@J!}PH*GWdfwz`^)J z3=H+c3=9pz3=E(-fCgO#hWnt(VKoDTK9c({2rw}G7hqtRAj810AITjH1Q;03f*P&5 z3=Fy;eK2!%7#QL~{(Zp6pbxrm2`X;D%*fym+LQ<77cet0{09}#@(c|BL6tmIyn%~> z;Xk}khBUD1k@yo>85sVvGBC*gW?=9~O1Gdx@%2Fm%~v81{i0i?R$1 z+OiA`*|H1_<+2P6m9h*B^|A~M4YCXjvt$_<4#+Yv{0B7#_)XI3UBoa2_e0fX;RYVbC6bP&*5>zaF%o9<<(J z2k6!MN(WcZJiuNqhw8P+57S1>T#N6Lo* zEQ}2G$nv}l4F8eb*TBud@E_EkDQK| zGBDU9m4Bea#r%=-0q796dL;W8RxmK=Be@rJsM>!}rxofR&|-l9f(#4|dJGKzL5)Uz z28R3k3=ALi85sV98jA)D4E6>L3=Rei4D$^b7#0{XF#HEK77ZB~^bHvp3=A0<`VAQv zCKxg>%r|6USYXJ&u-}k@;ea6n!+S#ph7X1e4F5rmNMiE-;#PI$#69dB!CIb3|?sMMpiZk1_3q(1}QcM z25&Y7hIlpxh5{(Q#>T*KhmC>ZKIrB*HU@_0Yz*ML-(ImXFuY}BV7S7;!0?cRf#EW= zy}9W(1H-}JkoG31%~|x1fdPa|{xL9saM?cw1`w|J$G`x>RsR?mK)B`~0|N-x{bOJN zVTfxP7$R927~)}_JJ5VGT7CIp83V&dr1Sz>9|FRl+u=YMw0`6WCj-M-D1OAr!0?!p zf#Dw%!|VwXXJ80MDt|%sDw7~1gSsFigNYy`gBujX)Z?Px>o72U1eIfG3Yu9M7&=)H z^=1At28Q}&3=H$2^(I_7Cj$c$Cj)~O6gzSF!(|-sQwJ+WMD{w)}x?$6Lk7H zsO|(|xH(WptS|#ZJZO*w%EzG4>OGizBNqch6Bh%+9w1iU!H;Ctvmz6dwB+i zzw!(W|B&ia(0U#wE(Qi0D0bvxUeW^6MoD;O9W zS1>SaS;4??6uJI@8gPo2fdPa;>y@q{`47}?Xp&}NSSZcFuog5(236n0&A{#6VN2ca0I9#n6FFbfX@ z0|?vkFfcgqFfh3BFffGiFfb(XFfb$|r7xI1&`p#eY{JLDV8zG4;LgXu;D;rhDM&If zC`mFfs7o?1m`E}(m`gG+SR>W5jG*;y+zbphP;Af5zyQLI+zbpZ+zbr9+zbq1+zbp! z+zbrKNcAz(3I+xcW?R9)0K(iW7#KiUbp->18d5lG889&D8zAacnENI885kt_85m5V z*qon%0fa&8u|U|4pMk-ipMjx}pMjx{pMjx)pMjx;pMjx`pMjyBpMjy5pMhZyQvDBV zvV+W~w0{ROgBln#eg|r!gPO*m;0BFzgPaSBN>H}}RMmlMcT(;8|NsC0fB*mg|NZ~} z{~!PV|NjQXZ~p)P55kZB|NoDSL1G{bQwP!m(hD*JWEQFRgVclE4RSxoA0YpL`~~tK z$e$qpg8W^cky->gKM;nxG zfZT>6Ndkx3?uEGv-5)S<&^Rk4;R70%q(nb1ci|GJ)ILh}qq_@y!#V>41NdHa1_lPm zMbz<0rD^dDDFqA+d8N7WnJE=ux;!(bBm;DaBbN1Yi791?dC92^DY*>bb5LMO26Rsv za`-;UL6uifVPHTWn*xo?9{?2sFat&yjS~Ku>6s^G2`ic`~bQ}ap~ic`};y;AV`q@XekBnQGEHf+uc#HTez^duoR zrKY5Vi*xjRSDsi@kXpn5KC_S#_Z256=720nNzEw%%@d=i575vFa+ra_12ne=aoyk} zVeJu^%V6aSwtN9n11q0ksO57C8s7ws4=TTr+m0i> z{06n}K;a9+X_+}Wpei#hClOSXGvt?+waHo8@ku$QsquM+6RJGuzGTo`G)NAF4Hy}~=Wv49APkBh(0nwAJ&Fm30Bn5( zOeL=JJUufnCAEU`@*HLkdOZS5KcMr9k;`+?`Ps;Pm^*1j7v-1cr4%#ZOvjb+`Dtmz zsUT;8od8S6;Iv(wUsRHs!T_uLKngA}Gl0*u2eCm|1ueaU<`R(o2ijkW%pXnfpimn) z3|l7zbHQ+LkAVGG#K2HoQkjz)pPO1zl$i`F-!t>dQj3aH8IqFnK}XOtl$E6>m*f{Q zWH2%?Ah+*8`0F4X4)Q>b8y*@22NeKhpJ5gMc;sK^X z?cey6{PMi`+{BWiOmN^s*9swrReDZ-QesXq_J`7|&vKfPc4O&Nm zoIXf(6M8=c7A`Ovw3Gqae9)QT$mtK19+BlqwV&4N(fbcDe`RFmf!kl8wU)^42i;eK z%%`>c(ChV_{KOPcKM-BKI61#4wU~jyKn1ma1g)E+=lBR{un=i_o8;g@Pj4PF3=D_B zXE8*`Fff2l)n#NzkYNDdsm92V0a}#;mMxHB0N=;P$WS4}0KT<=5xjN=v~Giup+km& z0d%qiBX}JP=v-e$h7~dl;8`F>h7B?d;Pb^9!K)V(!RB3%VF2H0z{qezh5>xiI3vRg z83qO=uR2Jr0$j0~X5wLt3~85sm*85oqovI?>c;Cl`j88l=Wz^9KhGFZqmFsOiK zJ!BccHy$uD1jsTlfX*RjWJr)@U{D3i7RWMy?>=AzuY>@tm}F$=kY!*{1Ix~kWdPrT zz{s#bmH~V=IU~acSq27muqGJKF_ z0H0UR$N;(qOcN|CAjbf{BY}}YLXH7^aycV|h8zQf7FgCo4$@L(WN?sU0H0yb$PggM zz@QD5O^{;%-%yA;-V~I?scV;f5Ro_*Ml*h6i#C;Iqyd89vA{FzAEzf-Wor zt;JzJOhI%SoVWF1Nd$RMus2q4B!*f85uYf z7#PgJvJwgm;9D9P859&4z-Om3G8iZ@Fqng79TXVA_cbswcqlM{Pf=%Nh)`f)0JRYq z88Q?Y7(h2SFoM_2fR;KiGBhYKFj#{1PEcR~-{HW>FauOPgT+=TFfdqwS)i3fppu)B z;eY}I_>6T%h6@S|4Ax-T2MP?}dmR`VUMMhtPg`eX_@ThSU;~!rP-Fn#@W99*pvV9| zcb$!5p~wI}m7S4ch9U!l16X#2A_Mp)2u6ktiVWcM*%=uQC^9fOf@Lo# zGJx-dU}U(V$N*Y&$H2(&LXm;N2`u|VkpX-=1S13J;yTco?TicpN(>CnU|9tv2Jk%* zj0_q|4B*q-85t~;7#Li@vK~qd;2R?t83L3Tz~{I#G9)N5Ft~zc3zQhZcSkTXR46fk z77H;jGIS_0FnEAvXDBg%Z;@bRSfIoJKHHsz~8NesRGcue|W?%>a%id6C0N+Z% z$nZd!0en_GBf|$}28KYeEa);o(ESvQ3>+%pDX(s4#%flxJj^ zpu)fq3f8+og#mnz1tY@>6$bF>@{9~SR2Ue-z_KS)7{E7LFfv?FVE~^q&&cpVg@GX) zEc-!)0erUwBf}3B2JngVj0_yA3=E)ih8P(nR2jgxTre^ys4{@ho@Zn*P-S3<1nYHB zWdPrI!N}mD$^brvo{=F!m4P7&ESsUq0KWNxk)c490el`kBSV8K14A@ec7ZAb_|8j4 zh83y|phZ~>j0_u88Nl~jGBWH?g`CpD$Z$ZF0eqJwBf|+*2Jj7*j0_i48Nl~eGBVsy zWdPq+$;j|Pl>vN5B_qQNRR-|Ql#C1?R2jhcQ8F_8P-Oru6a&rrsWE`>o@8X;P-6h! zILXK$pvJ%eS`x>|AfX1X06{n0s(~vL21W)AH3m?@%)rQCpavOxVq~yTV*uY8$;jZK z2F`K}j0_%X;N%NRiE0d>q`<()5TV8Zz73L*Awi7+d9h&;9DLU85-0Wz;`<`GIXdhfNykUWSF4F0KUhOkzs}!1NinvMur7y4B$H(85vfn zF@SGsWMtT&#sI#bk&$7C8Uy%NMn;AMY7F4J7#SH(s4;+VU}R*tpvC~ccaf3dh8hF- zwnavU2WkuqpgjkS3@_9ez&9&0GJH^D0NGBQZ0Gk|YLWMoiKX8_-c$jG3f&H%m%k&(ebodJCRAtQr@I^;wxMg|9U2Jl^n zj0_&?4B#6M85si98Nl}%GBQM{Gk|Y1WMoKCX8_+}$jH#3&j7xqkddK7p8C zeFpH2gp3R`^cleS5Hd0>&}U$P?BZCV&j7x2kda}7J_GosK}Loh`V8Rv1sNF*=tEkV zj0`9A85ltOFBlmv=re$C5M*Syq0a!mH;|Fxfj$HHwm?RP7y1m~I|3QOs{}ze12QuF z&}RVO2gnGHf(UR4!ePJwzWa}nLBN0keB&P@gMpRu;5+>o z84L^<7(gq07#S=K7{K@UF@jeff>!)6GI$s;fbZ&KWC$=|0N>EZ$Pi(`0KS)xks-l= z0el-DBSVG(1NaU;Muq|d2Jp>$j0_b93=E+A_81u&3>d(->@hNQ7{Jakn_$2IzEO{n zVTJ(%_#Qn*@JdI}?Rkt0D-0OGcjhrNY%pK|-;~G5u)}}>d_Nu|!vO;Z@T?Of!wCZh z2GCu2j0_hH7{E8+F*4jRU;y8H$H?%&fB}5l9V5dF0|xLNcZ>`l3>d&S+c7fyFkk@R zXU7OmxS(DvBLjya1NiPbMg{>x2Jnq_j0_Tn4B&g}7#S1{8Nj#GF*0ZvGJx--V+60p z1g(r>WUw$~0N+2y$lzee0KRpOk-@`|0esgSBSU~81NeqHMurGO2JpRdj0_2e4B*@3 z7#T7Q8NheQF)|bwGJtQ6V`Qi>WB}h6$H>rN$N;`2j*+3mkO6!*93y!3C+Gw?Mur)N z4B&g<7{Mz+K|ACa8CDoFfbV=`WY}QH0KVyskzogD-6%MffL4lvZgpd1IAO>DzRQh~ z;esIp_y#vdh8upJVZ;EwXN{2|z=(liG1vtWMhpy~c``P_81H&4yx*tXi44{2%j0^=13=E(JtBed44h#&SC98}K9S#f(kQ3}CI5045 z0^2*ofq`K&n6q*bFo4djV`SLj#K4dY7W?7Ez>orF2{o49xQIWMDW7W<_{1 zFdPB1GCUa=4ue@1UJMM!!K?}|28Q!sR)-e@!#OZ(h8F|FSuksb7X!l?Fl&bw1H)+u z%bS4#a#A3N4+Fz(u$Y7o1H&yaOT&kO;U<`6;lsdi1I+U9VPLopW<~fgFkAz(I(!)z z?tobfd>I&Cf>}F!85mxGS)dAl6?}T2gdYO~3z((h$H2f0X1(xZV2}s1e)usk$bnfL z{tOJVV3veG1A`2hrQy%O068ns!k>Xb3M}T~&%huFW~~TdU{C9n88B$iUzRX1xexU~mPqegrZwxPVz4K@1Ge5LPe) zg9n)95X`_32xdhDGcW{zSsB3$4E|tNMKA+{ADAT(!oUy;W<`WBFoc0w6(I}^F<@3l z2m?bjm^CAWfguXavIu2hhy}AELKzs6z^sf=28Kj1>qaO8Lo%54Ar!I;gpq+GjDaB! zEG7}gz>o`Ob%Zf66oXkO!WbAzz$}snQbsk5h5#Ky0Cw*b=x$JuwKrQ7Zmd;&h1w?2il(wzKH^K3&jfPRSYYa zF+5zif#KDXUeL`33=fwtRCu_26$AKIgiUK0@)i6+4O#}sIra?txZkaC9~7XVQ_n$R{AlYG(8=MTL%t`2+7zJsmp@E^oDdEg z_XP35CwVUhU8geIRV^0eKlh;mhzaSa17?y#70j$0_GY@p823)>47uCGt(j?GaA40yg0EJ(YSpw=Yz~zy` zHzl7`ky{wpm)NlzK6NhtE!i8(0Y zlbw-^DxZ;ylAf~jQc%J>Covy6co=dLOY)Gz2g-+s515Y>K43ml_<;FH;RE3#!Uw`f zgb$Pt4<9feDSW_ur0~f}EJ4YSIf*3&$R5baEJg{h+?-03{FPgY8a{d1`6vO9m!Fr4 zY+im&GD`Z&FUm$qPx-~^sOpPzQNp)4u@ogfiZc?+keBkSCHsJP2R480uInE{2l)0tN*I)fA9hAs*3W z0C@|vmPer~KQFZy*++Oh!NtXplwVSkpUc3IlbQyua*8t3Ge8WuSzvoqi#4sdz-LV< zC`9LjR#ar<=a(pyCFYc-7RQ3zub>cJl$w@Wl$w{EiYgBCb!lE=Sz=~RVp2{j7XyO= zJT#I)zRt`mR>;d&&?qei$!jV=m*W+KjE33^HOERJDYdvHz97F?!B#=lG$(}%yzWjx zAvL$4q!O$i6#gjgDb7vI$w@6zD9K37Q-C{PN1-G!J2Nj`AvZNK58`I9SD^MODCpWL zApB&jpqi7yr2qkNGeB+tIf21I!BD|S!C1jW!BoLa!Cb*Y!4hl^c>S*x$VChc`l=~l z_kq$Oa(sjMp!icQRsbzyQvl70gWQFZ6hVqW=gHeCBqo<+mZd6ybRfl2vT91SYEFv2 zYEDY56~vuIscBXU3JS@kMYgJXMrjIZnI&KbM79_dg;rQ(8B~j{;O*=zgM(dzLOlKb6x((;R7E(OUeC}@C+RB#>x z@wp(`I~f#%iRr0mnS%?Ygh4?Als*yqK>01zDkiBkGbaUp53Es4aZz#%w0Mb0OiKqZ zWYGh)YjhMC7znBdMRGA%IRmZLgU&iiEG`C>DEWB`X^ELRsVNHid7y|(1!eDiP}0ar zRZuPFV&KY2EXmBHX$fg-%f&@e`3Op#$ms~Y_K|^sK|w>c7!=WsG z{vo!+1iKw%9$Y6RYcmv=CMkf@NnUDcNl{`B1GvZmi!d5@^&W=ad$gq!xjqw5SABtdwV#WDs5Y!rcokcPl|9o@owfI}6A< z1`_SVFhxNF9D6zn#o3vlTn>sq(3)DX;h;E0D%U|`DD@9GkYVLIyr{-mu0!;bR<47} z32;dX(#*iX0JjCoN2CLg%ACXkD}}_AtkPm|NUIiu;s8`Ig6jy77HstdNF0U})8fHN z6Sjmg9=xzIJ|#2PN})m_BNbFVD;hiVF_;Q)>>gfCQ!xfBp>7zJEvpw41YP(ZD`HOQ&B85ju0gMtETC5~(lz6u{77y*RSH>5omRKox=9MMpWTrs+W1!3kYS6=!fGaw1z!MAy zG<#A~(-KQ_N?^_;*`1kr$wjG&#i_a#x{yj36dA;XFPb|*du%fE(n+>IC9x$(2-;Gbcr7SxZ)EQKXCV>g*P$&O9!Q6D)}!HnjJFpQZkcMi$QI?+{`>%)f9!? z#0p#06di?%3PW4foD_wM3L_A$!=<25VF*?O5;O!W%K@n~f(sf!1;IIqA%+pO#1^#J zJ{HUZZNrEIvm_W87~;V!&|206FblMaF%irH?dwhgvp}04lEEy{HpUb%3$&p*70d!H zjZXu!K+BKP!7R|iA^FWw@na)&&LzhB7bbeJw8XOw%mOWbYzMPI zanS*0fkLqp%mVqp3(Nw!yc^5{+1UeTfmHW`SrZr;82Z30&?SxiVAcXg1_qEgBf|+fQf-&9+)M;#K15g%u--tU;w$1 zkwJrrfngz7%z%l3VG)=G+HANO%yM92U|0fXc`z|BECsVbM?@|Ivm!v}&VgA8OblS3 zGJ+S$k)4NMFSYrw1yCI*JJVAcdC28MND7HEOYdN8ZgM};HY zqxp@4NB5tdpbWI*%$YN1KCkZfQ3>dFQ3>GRd!W-rMWq{re|U7C@#qB|@D5H~4Bf{) znvXcd9|q}wVUNxb6#~%OBNOW=4J*4 zhHe&>P8SuH*IeB$DlGp`fY{A7Dl80TDIkGv9~GAWC%aF2bcd*D_;kCdXgGHBbXf8< z)iAww1}X69_EFL3W@+qnQQ-jb|DWhS0Mdl4fu*67r3)qr(Ga4-(J9jSy8C6u|Ns9z znvVz|{N&QCP@ez;C78Ot- z;L+UzmT9(NEM+|ZU##i6$Sq0N1(89QBeSeJy@Lz zI51S2YgAMi_}f4Skb$DaBl`ePw~vYnI8d@r@_2MlQ2~`1KHV)~+OeC5!;*)ohV>q@taiUNxE5EY$n7Dnwu)-5WaaOrkhZMS_kdsCQENN7rCJhaU17CN;o$sTf(aC{Urht+FINKPXc>!vHc{CmY zWw-b^Xer~;;iID9gPJMBJ-S^~1Ux!HL^n9Qf(Wn=IzhQMwD0J z0uXKhx*9~*$7&0Pfj*ts+=p4dg7QuP$lVbh-3|sG-3%b-D;#%G0Uu=vl1KoF7=Ty- z{QDT1e<+mlgE=1m4|sICs06%z0_O5>W9W2I(EzhyQjIk#8lXVrZ|Y`XU;yzz&4Oal z<1Q+o8XJ`0HJTsDgY>;N0!f2f2oPx|NWr7g{D2=UEez5F+5-tnSj`XE!GfUFZvifl zEShUnEEvkvL9z!Quz`KWzmK!|p*=S!eWN<-^$Ftxtq1s9T|lKQxN-sei@)U}0|Nut z1N{3KS`YBI9E9`1p3?!#A$d**#dA6jK*vmhJO|ou1oE5?#B(}e&*{KDX9M+|4#aah zuR)%(fqG5{;yE2~X=?-aoK16$iVehbI#@i1>MUf>y_Ea^|9^9hiVj1G1jy|M$3aOM z?8OWS^R)t~3Ihd~0wkGt`=}UnGJ+Im90#?{z={Jf>sKF8`a-LeK=ro)s6qmj;qVH{ zN5uhToC9+D0tt9@gA)uW{6Wdcqq#;Uf}upxr`ty*!f^*P2Ll6|)0%5k5*SLjL3$G) zt_Q`oNAnQ_jMRVT3`W*$eiHz48t6zVB&Q{K9CuLxwYkCmOz`M#0OfK}y0!q@)9oPO z(c8lCfQf;@rx(=rxBv<(3rJXXx~MpSE5Z`im$0Pc0FqDe0F@^$AdmZ~By@WUbb4@r zjC1f{1(^g=;^5KgC;$=b_E9PD=959Ai^U7#i9J3%LyfL-5wg00g<#pNYv`&o01iiSf8Hz;NNKhXRm zq(-XSMWq7dhXRjoPXYezERL%G?HRyH&m$RBVD*9z`Sj>!IS7w-3y)+677tVj1BhyH zWOch7Q~)Vf03})l2L4u14+s=+1)u^Hk%l5bX~qR4VbC4G0dhnH*uh}E%{3}63?-~D zK?k3Jlqi7YEubj}%qj5b^Z*yU1|H270t_XQAY}y}-2xz$3LuWb{{R7y*CA$Ef`vSq zD-;+?c#+j8fZCm4Bcb+#YFN7$N0>{4#_V`c0 z694cRM{m%Bj0*sTTL1%p3+Q4NkfQ@o!wppbfE#4sLJ(SEgJL#>zj-ROVt|=*P=TSO z9u(ae@dawSV2Ma@#E3~$>T06pl%|lZqk5uc|cv8*I)_I>7NkA z5Gf6?lpRC}p&!(81BoFk0_z8zAPNeh?>8V)piTn|xYtz61M25|ztQQU!t)wbkg$MQ z*)A$Pe3mRK^&B8)fx2hiE-DE0n%(CRI3k4 zXaye46&wtua!~dG4N!y?cyu~~%jbgQ4lJPi%3gv-3?NEC`Mukd#gc=+2eii+EZFS; zazD6R+UcSaa@<8FqEO~IW4DV+gr$p0K#dZtm;&9=v=dajfOCEG35QM>6_b~;j0~U% z2s!wJsoO^-q}PQJWLyZSBD8c-38?|KYCr~s)PaI30%Qf)T90O!b1fY?N)tVLT~tg! zC5Z;eui(_^0y59l_`oiZ&p|$`09y=Vf&JKAqhbOoa%O{T1Q(S8kdcl%1Xw|J%>{@h z-5wlZO|PAiEa(QQ?RMY*S*HND#RcSC{Pr-tHUk?8a#W`W3z+SZ%;1rIzysnUW=F7r z9$=YnhX3HouK?8gfYbvZRUVL<$AnPH18$F_);D3GyiozFa6o6!!YiB}70~z>mUPkr zmT0aJ;Hk9*^$kGEJen&c7)mwaTviKkSV7G2=ya5T$sBhO0kwKwf<~)gVxT?*$dGPN z5lasN{vOZ>A55;>L8Q|~B?6RYI$cy^j=QKNK+{lyrHe`gA`O9>n3!oOkqMlJVjyWK z2AYOqK*m|RsKkKN5Xhhya2iSgSpl=z1Jw_fjuNH$NKp-|8bGlegGft|VFhr?fO!k# zeOQXR$OuY8kPw7e;J71!867wGn-v(-=^KWZW0gZyT z9w;&20nSR<2mXT-BmaIDM(Y+8P#dw1>$r;wXrz|mHK_aoujlA?QAz1^QOS61ic?!H zNE>KC7NQNjs=C`nB?qLfxke>}p@ivmK2F`G;1L9HnsQLEY*7J?+LkiCwu5Wf332X8 z22hRf0UDYD4SH~S_L?w&r9LkKWi}6w<`*8I;PwCyf55`0+d%-72O)_Y+&qPh-hjQ1 zHy>8O`^B&V8@a#Q{6+zk3qb?q@LcGlV&J%=L6CvL_!7u?18~X!xy=B?1vi75k0>A- z7Rcs-Dol_n36IW>0zptB1NXRnR3y4RRXRH|1Q{3*8letC*5CLBG^z`75@-}1?xY?S z&;TyHU;w2|P)Y5;0m`W0FamQy4Xzjjm#5Q3B>}+&qe;uYk+3kmdu-%@6*7t2#ur28{u5#}PDu0xFV1KxIR~E|9gL zB#;43H;}jkxeZn#-Qxo#j23X5LTVrlkj0QdaA0aazy!7pYDc$&1gH}V3Wx-hfKWgQ zhy&o%2Dc2{Mh1oBaR&)dQoI1MDbnd-99P_ogO@(hy_JMw~tB+tO5Y# zqlOC5t+e3A4n+I$h8i>xk8THWn0mm>Xs(c9C}n*)p9c|Y9?1?e9@z)LC6foD-l%|S z@#t=V6hjUi{M#KepabsNkVcG%@ui)hgYv$A>}*kKfw~10Iv(KmREr9vkJX|A6%zmr z*n>)V(4|xGVgVxQDZ#&;g(IyKQUiJL?}swb-3F-`K+XeI5Fi6V)!A{#1OTYt2P$a6 z6+ppjQxF@}5HtW)2n8TbU>7wX-~ed^vq6~zNA24^esDRRN^Byq8 zP{IRcF_j3umIF-%GJtYyL0Tu{Ye`5fgL)YtE*E3~2qXm#QU3i7JfJWHMIZluPaf@q zoh>S$?Qt+!J|tN_uq0#OOl3RVf4 z90jWciFCH8fcV`|st0TiXx_jYlAdcNLB0pOa63cu2?dyo(m)M)XnccYJvu$WB`}x` z@~}sz2Y3*p0F=%kqR@m3N>`;N&4GEh?ayaF9I20icF#iwbB& z$oK%r8K61w*I=K6^+59#nB5Ig=h1wC2^0n(Js@+y=2=4QEe-^yK#(D5MbJ)g9hePj z>P-PpFL`vba6yt&_5pAK4l)naV*L+y$IH_H|NnPG;;q+(;eTg~3h0hqkfmS`Lp=v( zcY7MZJP68Ha5bQ5g3cBd&|vp#a9bP1@_>2^%1%Owd6C6d0hvXSf2(78MYmzvVKh7y{*LSk3?o!*T{_;Q&g`fXYI0h6p1A zL-QULkRnKW2eH8E9n_2mr+1J@XA8Jl-@Hc!qyeH5!~&}XEfxT)1c`LEsDSw0P^t&4 z51KPT!CJ%gS`Fj{kSpMYE11)b@Z(Ey@YoS31Ug|M0Hr%yR6vU&Kt@359!RihgL^JB zcY^Ew?>|Aw5hM@oje?ln4ievQfW$$;+vzBCyanQI1_p-XEf9Z!0}^2oXhjCdA}|e! z50I0>HY@T|ZSaA!r$_SvSZf2(i~y}F0?YDmXJ~#P(0ZVR>Geg3 zz&;12<{vElt)MgFU?R+55zwiCU=fdG2MJgKSpaLJwWxrW2*KpxZ8#)(3s@@wlB#>a z^OBH+-PxidgCq;CX+g>%skyTSym$f>!XP^!+Tod^vqc58x&%oUIVW_ssDPIXKooWN zfbB6p(S5M>Kuu0JRI&$bK2$Ue><3W5oB$90LmCJzVAq0T666GIF$r=nv{(Q!;l%<- zeW#<$%e;TY#tvwe6WkG~u>*=O=GFs{DaHa+N4^9dkq6PY&w&|I8tn6AvOdV)Dh&_Z zeGZ_=EMa=R53CYLR6;T-s8B*`jw3}SXuTIGz(MNJiXKo9L4-YdKm#KM{QHA=v`@j9 ze4u42AnmRoeU91}K;tF_AP$dDcaI8G#*@cY`=Co_iwY>Ax^$m#=|0#E;dGw>=k?YD zCE#8JNIlF(Y>@(zheisB36B(z3qg^x_22*huVukO!N1Re2^MI~-)~wUEM zc;E%X1224#c&+Zy&7uOy;1E*;AZ-JvN(t!nIe0#r!^4tArMLoQmw-n%j|ym}6g&_Q z<%xiYjagJcY3c!E>wyxH9iZ6<4{-a&M@8Zo3nRm86Oe^q6--!FFufMS(8UOuu|XPP z0?ntu=d7^KEP&?7Dm*d|fJbYG+yt283$SrCkPzC zP8I>lcz~S@o*#N^-4(Cwp=0Z9!#;8~jPKmlm&3{wwHBG44iPzo-713(F^(?bBV z`~}Jbmpq_s!VPM^f))vY`U(?30|bpnKt%|06^m59G`}eT%`Je2`jHA3a416;xWEc4 z@c1!U0$$PjsGt-s2o2!!96a(4)u00kacCFaMa80d4|r6Kp)?4zq6t)XfMN?Wwh1XA zJYXdRxQNvNm!HK-AXVVv7PR1?(*s=p!1yek9x|_wybb`F2rGj~Gf@Q1L=K3F;6OKk zH4MN-B)AGP;BN+@ zl?oc7Wducq2mf{!MyTBoGvVP4sjb1z1{abDHz7F$1=wboTJW+sh{-P%{{82B4l|cZf;?v{+&W*PEb4myQCjkGuw_cH&I}4W45$ zN#ykr^z}yYwk>uaH`k~HK-X3Vcr;spW0qrOAC&+P)Fu#Q$tK7|gX0dM@(ElqgF*`2KsE5NbmS;e1Iv3rSIa?HQh^t89d`hg zK#L*Z31AE zmLNY^IvPL>2=M3*0OvY{0RbM+8BB-)Aj<=eJAfCiLD`@NCfI=i9;}f0KZuzM2s6RU z@=(nLPX?lx33evbOi;Z7H4_@77@J?toH>Kq-@~~o*TbW`0W^66Dipyv+XFO%1qvsJ zPDhJf$(ebjAdUyP0Bk)_stYO>z!?>?nv^gX>_3Qp;{!Mr>teVU>v{o@|G_a}(d{V# zojZW=J-RtPKodIPgwpM!V$tm>)9In&3Ytv`0d-Y}>1L_vYlGqlN8zAZ47L_L;y0b;) zM-F%tnIjjJcOZs=l|aXeK_`kIZ&3l=lmJoy@&-rqLItM0NQ8Jq5`rUqyi)Y)dpfV?g7hyT1fm&M?iZHAOfIiiDJ3q zEh+}Npskt=pq0iTBS7o(A%?wnhw23la>A8@R!?_B6oA(1Ls+jt!|5P{z$^A4VxUF) z5Y}sfZiqGiPjo^U&3nMsGL)G?jRLRX?}7LRwnqV?8H<-*ZvZ6+{?p*l#s`SkXv zfbO3Ljaz|Y!=w8GsCf$tIB)_2#WRQl8a4-cxQz8>DUx>hdO=s?li)lu1stay&?*Tu z?VtjlDgnn~3DaxVmu6t?Fm*jDpo9sws(BA2rb}60)-&Ts_0ldNkE<{+bWZ_C4>Wy& z^@BWDdJ>W^LDDLq1chXNXNw98#4#X>p;R0cL?GKex*aO`_cwsfX>C1F&-#*)nSsG^ z2k6Fa<4YdBJu0C4TfsJfG=MTgw}S;}Vis%xBpZOM6h`n;15mCw?!W^|93b@&F0^`q zDTdZC5H2XZ!Oj4!^oIx?hb@|iaUmsj?-a0G5cwBu0XRiFRCut0^LF!3#RFt73sM3W1`Xzdq%A!Z_*+{+ZI*7R(UuU6WyK)1AmjM=gGOF^ zz{c_K_hbUkt(WA2vjvD^s0HP75DPpn2x2tvQ2~XUK(StT3z+4ReE>Xr4+`+^DJmc} zogs`oP+4&7fi%42|NsBL@ult-70?YaJ3%W6zkdX!FOWWu=7T&g-3L6nFM<*^NI5)F zgQUBAz&3SyaJ+o}_y7OnkeCNW9lliZmWWhR0Sc(@78MW;S~FcHw*$1m6;|(ngu7iB zc{*EECV*m09u#n(Y?kd{VKlSx(SLRZ2IfNte{e$;fR>QtGJxj88gjwKFNm7C6I5$L zW-vhpb~b`;@CBI!;&u0^fE0ChfabAbg2x)JfP9CwcC~}%1IAK856DIlP?DYjavndL z0C-RVde3=UIpQM3%J$x<-uyC;AhgRbk;@fMX9P)Q5Ro*)i5fr9_s9~BpHtr-H^R|M%FLszIY?*VVI2KAmQ z{{R2azs*I(p!GnBFlb?)rHhJ72|LJ_46j9A^LD$afL5!Afc(z*(hJ=602>IIAcnZ7 z8#1BJzs*O*umiMu24&kjsE7asA5xrvf*oTiE~q(s2HxuhM-S+n0Z{amp+*nrfB}$) zAv9!B8>r_88sq)}Dl=fcyB-y=5?BWhJRuDhf$SeOIPRhXUcm|qHPBcqxQ>M=a4-M` zGkCRXgI!bu0$S1Aq5=}{Y*7I%vgw9U z@P#ohDjJ|#23+ogf`Ea)bvm@-fci%Plqf|#HodW5jd>s2o&fwY5+0YwzFEe=W#*qj9x zhdT?jBn9FuusGCNV0JfT;SH$D1@R%y0mFz~k=X9x8(AgVyCzoCn`Adzed;njjxOM;eoLDzyn zBONMRha?L+NCOrC-3~IHE#T!x&}3l=;nga3Ll{V_LqLw^-_8I^3!pRtO*v2vbx0aO zX%}VzR0AjxAqh1IV}+aRn%8Lk$J{3A8q<6O!(_A*)EBvS2?!WkKl>W*R8M ztRag9A$w53F%Dgj#NS#48Y*wz1Ia5T;7LReQ0WB9J09Jh4jz^s7W^%sYYRc;F<1)Z zbB|6B2WXf=SHXZ5Y+d{T9&$?SbYz0&xo*f}7|_HHLXriPkwAgQzr9BV6c*eE!9h@> z3(Zm8kkvdOUDhq&^@_ES(PI8>49zDXWA+{3t?nKmBR~a3TBipa*o7bgP>`o}LUwL@ z@b7nkOh5DQ_hbW2PWh;Kq;)!SfmMT28OWx!k&r=avTNnKA&ax22^ka-ppp$U z6@yk<*MU@n7@&b1P+71YvJ@Gl8We5N*s_GIF9y2{wB8sad4d*cg53pTbV5=sD0xEs z4e>AT1l0pho4C^yTpnk#GKD%6OR@rY4?ymKr7VbP9gMHRTP-}7$WgO#lYzgVlFHRLU^E5`0^@fKOiJhpzGa1$-ebKtt>REkVL@+FK8h2wIrrw zXNw9*3L4?vJ>ZpUNM?cDiX;j)3v^u@*eo>3&K4DrR5ygOgqY0V2ihM5>UT3TfYxz? z(j++2K@3FB0VO_5NF57~bWi~ct!!~bI!FhogU`so04qg$kRu(G*t>hc)iuaJpn?Q0 z&+-y{7FHbL6LphL2HL%>H}F@jF70?9!4ae@~1f>xS$ctGkgQ27FOMyCgO`V^(6 z^?+B<;DsEZX=D#r%>~L+AdQfg5GY=u^)j@2K*)pIHlV@@+Ejs70Wf)_rU|H40G02c zavoGoBPoH@(-PR*+^@l_A|Q?dSq5r`KpQF0IsuvnK&^S0q2NX*G~7$;z?l(LvVzK# zv`!Di>geqZ5W8_T1YiNkzui*?-WWg=EhBp{7M$aaqw6_5->1X>z`D9aY` z7E1o!)zCISNFO-3LEF&4wzYtFPj&Zz6< zsf$0E!K=TZEhvc1u;2nI2e}VKclW4(-QXcprv>%||9%IAnNz@$-JUYqs3yJy-DL_g z0@A6httGf)sO&Ut zT7bs0P)2vUk9#y80gcmOAI|}=X8<2^1RvP}9e03ZA()=14S-q zsts~Xo(g!aB6yAh6jcS#U6I`m76%_Nql^fOz;HYCx7+Xuwv^g4eo&SI%niH=hG1Ocxam{(TONprysujtV7A zug`&823~iIv`_<_kHBk?z`70in?Xl^f>dgNW&t|E%bQ(PKr1&udxmWwGGKFkR1Em{ zc``B|1RW;^Y8r!9Mq9e5*zor`!CkQ50dzbO_z*0RfuQAnkTZe!_dBpzx~MqR@`8*6 znGaV8;(*RPa;byMf%SnFfp+_-xPV$Ppwa+zTnsql_gsRUi(}F4qhbS<^?{u8KP{kYoYH@)#ErSk#>2@#x?F6rt0(naVviTYuzR-mpu(^8_ zbp}Z4AoU_>f8fh-&}w%P@a!YucrSJb+X%^^pryCXH7W)SCE$}^pk`WnD3r)UR2_E! zFSLMgx_v+^bv+e8yA)r~M_)aB1~GmLI(QRQt$~J5eNcx_LG66dP${UT3D0YgHYRBD z4ZJiKF*FLA2m_}P@R55Cpppb^0CY2PGGya{N9IZJBwnuzhYe^T99-TbtAmWVg4e|b zc%V<-yQoAQb5ThE=P%G2WN^|4FF`Ya*El{Z8L;XGw2l+Bh61{>rg;x|sEeT#yv+|} zDQN9y3%E=08oWFdA|?Rs*&&()pi%*&rb03G4S)iJ=dkXjj)19E`f;5&|RKVwmLc~E4=+WH)nmU5Xf)>sw~4>^Z=3o*#}x3{hIZqJ7^@Xc@Owp9R~i^uizGhiwZa}K*dG{XlB);7jjlCXa-3G z)GBrWu@qcDvmOa9-3Piaf|Nqm?|{l;@JWv)tS_Ijf+qYyjbYG4K@a#ySa5`bTnO5@ z4ANHN0d5H+&M^TAfb$w$1^+fr#tsi&6kYt=J(!Ph$0^qkY74|L99>ABavAj3#^1b;K=bjaf^;N8-oh(6w;0y)VS)Nq119MmxY z?YjiEt|m8e1t2RRaHA1>4c@FsJx39xO*{4KDVJ&+Q9$aVyf z3RvO>b&H$#fcIrW5;sTyoVY;@uw|eIBPawwty)mw23|G-8WwBb1Ktq|(FYO$>jN>M z9c@d<6jCiXv4OOEfX*I;ZmEXMqM?f-c@;ce2y!;aa*&%r?HEvaf!O@p9C(^ffXjUl zx5JSKVjh}$NY#ZqS@O4@0+&UQWOU4d2eg|Wlu{V#w7Mbb47yLhMhav#$asj=;01{w zZigfItQHUxQUQXOjX=2y44@R$P1L#0Rl*O%}I!pk*=o+iFpae4r z*WZGV&C>uiZ$Y(FDlLdB52xyNglTD{12X+~UPDdV?40y7~0qmr17mywS>@p6Wj^JHCpaKPy z4nR@l(A@w!Q4Dl$E^GxnD0wiIu!AV(Qf^R}r}+dU=+s(}2vmXvCIRX*YJemdON2la za|u)jXzv_Yf(fP+)WrjxoUYP*0wf9YAn1U6(7D_VpyPr0w>c=Z9ssLWX+8l`4OZd+ zI(i>+?is|vpaac2azKZx;aqX;1KJM(>c>GY6@VNi+V}=sqjmq;X@lt5boYR36U=2h zpgayPlAwhvbge)qr1k-=umY7fpaKb0h=VFK&?u(?q)*2B@;bQl1E~cdLEH?gh)T^N z%{i=k7Bez1fD_yl@H8%p*&yeDG{MYbYCTYDy9+W%2pN{gZ~|yn3YJ>2m0JOyvWE4Yb zDahTRUAnJ+QA0YuY8hw8RqN37 zN{fmDR0vF?53#hUXn>@9TU1OyG-z@xmH~9iPDCuI0S++?tOU9yD*z%5URw{!)1W!n zSOx~@Vnx{g2#_k!X<|PVASDcl58dbhVnX&ufLNfuQw7Lo&{|!PIom*sY(bWTiW0C4 zX#Z}D3W(XbM+GDU8lHjgj{pgPx?|u?4-K)PCGg+{x*&1L{s<5YygvfO0OeS?Qt18& zkT_(21c(LR9|1B5x<3LW2H770Vu8CAAX)JK2oR%rj|zx_?2iB`f$on0IT(J2Lkrm9 zSiFS3KLQl5pdvCQmVp7ZKf(hXHsJjcpx^@60iZAgaX>4!K^{ih9|6)1n#ln*ZWs{z zBOspg`zG*)9Rf6-e79AYAx%2?!T7z6M_C3E_g)=EAw4 z>H+Kw(4b0-3Pc5TR~w9rXS)PgYd6ieOMuG<(D6;6Vx`xG5xiZZ1C)SpY?qh-$;(@y zS)KCj5+DO%+a+dzEC#Kc2hoV_5@2EY+RX*Aur?%T>_*Jb-M&eIXK&Z z$_G$wAgZ%P z8ok$a*~6C9Z%9UeM?oXdexT1CC%20~A?c&EV}4AQ8lN2^4FTyIWL1 z(y)XB)*l6c1J1z;H$m6RIR zmriWp%ZfnfhNOV=2D6Jw2q+DJ!nKpJJ46K}1v#r4MG7*308-V>(EQ*4Tnp$r3P?0` zJFqk#ut$*t523;IJV59HpNb3?cMxbk06vEm!~+j$APjqeqys!?4pP(YAc3L-d=xZD z0%khs3JedCI`A@VG;#33x)Af>syQt^Bx=DuV-&@l&}k1;LFi#XkVM|;2u|G~70ne2 z4)x&qCJ+x{HZ}`E(=Kq|z?FK6bUR3Z7VE;yRsp3e6w^Efx*cSYm1uyraxpM4fLb#! z)r}PjpeA#@3RDifPoW#)=jIB9gnHN%BY4j@R02B3*zKTzFy7Kpr50TDgWP~kL8l|! ziQNtg%#f2>Vg9jn)Ton%xd~Ic(-FK62V``%g97u+=10t+9eChzUyvZka(LikRe@xC zwu1sI785k;kWIi;f#im62hbIoIpB<#1I~y!2)Aokx~Syv_osrUQ(@r+>bF4Vz91nB zx@M(C1#;>UOhf^suLitJ6Xd0C2Ze4Ql^oD|2hf@x1_lNY6SU@LAQed_+V0yCEz6t==Oo8wm~{ylWL_1Xx$V814Eq^+)4)#BsYQ<3?ZBgvL8tu zx(7h(WI?Wg9JLJg6V&|-+6O^rML~8#fF&4^ECER&jAgNe_^wt7F4hAMUT_8kooELR z0?JROUcd&jf%D`G!VI_XW7?m>~*4`4CivbvA;| zl?NRXgRUG}#G@+*9XbyRb8!6zIhYF44+2+lJz(2AIXoJVfNFoFMgnv$14JRlTfpOC z72tE-{_MPm7^elfZUR^sd8j1=EYhL^kzoKe`60)wwWxsTZU@i~-U3iIOm0yD(~u?} z?C59EO}?Pvkrt2=P|z{q7`nmImV(SOflYw!{Q|Q=0~JgR42>3513jHlqkRk@WF?Mfqe(-uz{{Rek})+2M_jO$RlkB z2Hlv4#05>DB5^^(?nqqF^?k6-v?#4Z7f}3yya06~C^jHmPnPC~jNAvi5BPMq906Mf zn(+gz*Pj5IIfwceoK(S0>II-VThPD?Jc)5hnnE$Zh(|P$CW@#$hZ=S1xhIz(8L3xA?I!wAc;V=fg~IEsDNZZl_Y#z z2_yg?S2AISk1K)1A>&FQ7I<6<#DI@0fs}&04?0EzG-C3AA9RieGXn#7TnQu#9ajSB zf{ZJHSm1FbkSusy3B+jLqXMEJ<4PbU&~YV@gOSFSKr*1f0tq8|34L4%6ei#Sxtdas zV=XG6xPYJWf|3&O#0AuNkWnvVz=P+Ij0qaA5@CjnSAnj?hHgv-sRO4AP+WjGpz}OH z0a?cSQWi-&mhmcxDe&>CFHGQ`IEZ2>HNl#MguADJ;}9b~UVORn@BjahX_D?KDj+jJ ziF*b!bkG+x`vc9QATiKD6X>V{(3RrgJDoRxmMek#GoP1$mfwTowv-oi_ktD3RX>>O zNp_F|v_uD8Rt^dq2GDKREh>MQ7(ll>fxs85LYNNBa0M2iL%70(3n(|9%$7&K4Dr1>G$wAY&{c zyn3eB^FXN!QWiiRDWlSiVG;wgSy8c2Dp0+VnE$%36ZZ4 zXx;<%I75vLXvq#p1;|mLAnBf>0tyF9k%M&_-4NxSkWj)<$pX4q0;Kr$gqNUPObbWU zlHv%+ii#E$v;b-c)zgpwCN_YA-~l9y;caLDg&bt5(w%aU7+&|iY@(Gj zYDsd2<6p$l4k%?1cnBF3owzdfNzmF6P#M;GphN|2GlB91 zi1At#v{MF2O-~DG=>=2}oHRl8)XVmt;G_RQY=%JODgJt=fH!!8c2_Y$OC3<20#)?g4d6;N`+y86)q_MldRrJldtyKZg8(S2 zf=*EY(V(S{AR5MRKEMM~vjHjw(hD&SatRuU-`NN<9W;gyDo;u+!Kbu<{InCq|Naql zFiVdL$b@c}76;IUCoL)~z~(_kIXgLCwn5fcg0wL}jQ|A@rV%aRK*es#YiI0sgKUG? z4VEWtFvzi>paN^;wB+D#IScJ8fki-_Fb`-Y4^r9<67XRLk3oXOEn8GTyjsx8F3<&k zkd<8^7IEA}uT zHWh)=1}Nr{4rD@dNb7+T@QpPf6`*ks=)x!_28K>Y39MEqf(!&X%cUDUp#csk0gQ_B z@JrsWptYJ)R3No)j|!+h1gBuE#$rkTSWaC5H{cPcu7Dc;$m?i8eFG52GL#4^$3e?@ zKvP*rLy4gNQu7}0(Yg$fp+ryx4O-a^I_DC4G%sXiF$6M{2$2Vk9fF4vAzbiKBd9}tghTtoEK@9lCQz4+WxEbK3z0jjMGa!q4L8Evemt=H%@PH!~GLq+` zk^w$~7@=4IJU|69)Ip*dwC5MB1bnbA_%iK`ZcmXfV$0~3yS4$IfES7?K&B}{r`v)TKf)#`eN;4HeRmfXgKqGd zMm{Q#b9y>K=Tz6ISTK}uf;LLMya+d5rT9KcJP|ABIbLkA;x-%<=r4s!H!i7&`V z(8fsciMwDU5r)KocSDtOHrJ@cfUYk9`x>GVwAle_0puJBkOlK!+Jeq;1Fg72xp@Fo zI-fz^KLjo#yZ`J2ZI(kSnL%k9RHA}5S|IHo0t=H7_8`wGfX+DrZ(xHQk%Vtk9;hb) zvKqSI2V^a%R)7rHy@v1a096eTG3aUWpgE`R5S5Ufpha!4vLys$JK=Z*t!GqE+DxixJ0xVrrQuup7!-$}5b_XATFU4`l_B7zM zK3EH~H3CVD-TGh+c>fS+iD!zXhe<8?fMgIa0z6meq5@*4bb6S8w1Rg-c!2iJA(`!g z#cYrm+-y)-AT?e^SBLh@W zWiUX_Kn7QdpaWtQAdQ0zlqj-3SkLqtd}lGppCOhW1~p8tr+`c&oIqf^I6=_?zC{Nd z>DCA9c|iI-K*`9V6ng0pybve=xvc=|HtsaXt-nDs|L;>6~#FqV&^STc9crv{)K6nvW;N6z75* z3M$*7#d33viU&hU5J(gfaG)3|aRTw-mVh{*=Dz8B&6d;w?U}0E!jk4bp zECX6o2zChUb~4C0d&!W~iaat;f?Lu^`#nJ$S;2S3g4^dH9-^*Ay2c#b);2(F-2}M` zT9kwAg%stWwZf3193lpq-vWt&dh(z)1gNnY0=dZrWlN=t3i#d?fjW`y5S5Ibpvh5K zNuL8bQO~2h0ki|N(?tcG@W6NZBtWY41Xz_0E=a)__ayK)>x24;usd3gyQozB{|~zQ zTBQcm`U1D-A|2Dfk^>k1&3H9=;dU?&zrr9oXP_=+r$7-&TnC>%;^K|TVd zPngR=H8iA@sZ+)!2i|oAY7@Q&cU>V`Am`aajDntL3sTbEq5`5iA?*XGZ$Wi`4by8q zkOfe;fp^eB*ht=iZ9i=_11&0dQOSW`N?*hJ()u6xs!>oFc7j@x&_xxX%wOl}mH9}Ukz=R-uM{wE$6;B|mBwmAe1SWv^1&BS3;LX>N4UJ$`AU)s; z2*h)Exfyit47f$y4Y^?!G?@regR+|uEC^p52%265MIl%edcY-QQVuk%1<94r9hgW5 zGJ@nFyBR?&NU8MZ!l_ww?oM2!McL4VXz(q>}xXBONfC1Xg2+{=}nglVx(?cN5U=a`l6m|)a zU1;Fliy$w6cQ1ln58J&6+QI@E;{vf5K*OdWMhE1WPM8@A43OQ5pfV9Oj^7I|7T_)f z?^Xm&a6!~Viwe-529S9WO_1G+5J!Lpno<1--mM5Wp?QxAh-Tn#0qybt#V*Lb(A|n4 z8Q5+`(9XQ(J>b1NkkywU0dTPfVt`!&D^tKO+3(3@eGs&~!$k$0zClq8lK>Yepj%cU z140mCP=VqDQVT6jK=R!!;44r;%aB1uC1fj*C1i6TWNRZxFKlZg$hna8h%Sm0F5s<= zAU}c}1kwR&bb$N~Vng;9f|s~}xbUrwXzCTf-o>3p`CIpb8z+z$gKljEB^$`rMo@Br zUSH#!#w&DuK!aDFb)kn~xYE*>>g(mhnVT)d3n$#L;U7Ew4ao1%av%&^RDC zcY?zoG-3e01P?rhqJY?hjXGoiYEePW0=I;^dsILb7|1N}m?HRKD+}<&?JfR@XhE-Eg~H7YI&b)b`GTtEY%kQNE*p)ueFvj%_j15mC#?xF%d z=mdH|bHs5M70>_^1Gq)v0dA3iyP+2FQAQ8Qfic~nHI2|wMhg%4Bm}7B1XXUJ@gMO1 zHm29xz^M@|09wibIuyEs@ipr)7tr;P+gwyCI>3X8kkf0xhb$;qJ1Ufd)Kx;%RWg9i zmagn@QON``GC*e~WP(Q4`JpWikY3ORW*?OVZAQq+u_!{|0l^y3(Pk*ZouGCVsEH0P zPe7U-d0G$Df}8&uNMhh(1k{FlEe`SvvJ|wh0j=#VT~uo7z#F?kjX)l7<^LLdXl4SK zjjX#s8?=WK+|GmyTjqdWnFEecAC(+XISJZ9m;>tETDqv@)Cz%`E3h%00+4|LFT2^_Jv2;-psRbzojj*$Tw16ynJ+IqEg#$j`$^+to&JL;(?{-n)X+8itamS&S10)RY zkBfqZUx0<{;KHEegRowAa|XO$8l34-0wDmD;Xyk&;N2b{6-ZSJ9Z3QOx&mlfZ3cV} z0Ca^NWGxQp=sp*ff=(9|P&Wv)o|vJzMkRw0oRl3PN!bCMlpQ);R4hOv%AlqqH0?lB z5-5ozbT@#uvo=3qX+2O18apg_*#KHR06N|WoC*rS;Rm(_wE7p6DJ)tKlz@+UgKGw5 zHf5+3e`_u%w}W#g)NIfUd}}yVR0Fh#pTDgiw7v>)?}3ksMz;$iC=LxkaoBpGRtf1= z1T-JGG0L`L-G`;KtU3^ocVgMSCi;4||c>tuaxkkl?3mkkl$ogLg zf+WOhL1)w(G#>yh@-ujC3lh`9q8PN*)y52_*bHRuYf$P%G4kbJaB~JUYSDav2Q*v` zIgY72kOO|}4CsWdZ7wRHXj26F+o1+zj6w4Of#wHb=Yq%h4IDs=HVRP^1xM?F5{MS? z`~*Y^Xnw)~o?i@J+kwn9sO1Oy|A52AA7GbiG}fpXfI z4USjPYD5E%<|6?pwI+1%;LMpbKJfk3#N{XO*h@jTCkuEnCMXMoyjTHhWPtk#{M$T1 zlRFA7-6ui8=K$(`fFu%Nr6Tx9v4U;~4rUh>7m!Q^XlFclL2~v1nJ2+F$$;**^XT^B z3INSJRCs7#^yoh2(S6WkCV2G3fDg ziu)?h<1Q*Opri_9UM6v<5mSGlwTFel4pd=oH?kV8uUywA&?ck8^ zbOG%XhYWOdJFtM{K*lgTvVaR1X2`e&Xa)y#?>JZtbkiEB7=#upCZMC|poNe_w~LBR z^MeB*A*d2?vV{maK!tpEfPzpPautRLj01`V(3PX$8$dwKHwN%g3qA~`tS{q1y$Tl< z&~^@!dR>r9EL~K5YUMyj+<~S6>Onaalng?^?KK~8UJZE(I6alilp7rHPQ0(x++z*~* z0<{LaeNfUvq6F|n7bpZ0z;`-=r2@cGDPXAp=&qI&(EK>qB#`0|xLgP*rGiog za*9@Hu2Bi$10NL_0=kRiH9tt;6S!sy`2-pI2?515H2Q5ohJaEYEE$3KkFeB&HzY zxQhztHYbK-E-D!e$6Zu%ppxKgsj*FO*TgmNQ2{vz^$H`S2J$WDjP!NOqys(B? zH`0!IpKg|epgntFb!f$DX`AtZ<{ymwEw0do7vLUR0Hk9CxI%?R8K7hX@**hAKr-NQ4^Y&BCRHjJO86lX(1zV>573Fk zAZdmYTaa%+OpoRY35F8zz$2Io9_)e+AA$v-n&Bpa1wmWLK^B*?z61?KVhdXSp4rfn z6XZ(J0s+wEKYW1zsCM%Ji9iwyvzP?xXy0C=V|z|xVU22^k^`Qvg_SEM#-O|y!BDCVI#3ssXIza> z!rTvPvIT&=4^I`HE-DGHL8p6x3MJ5B5$H&)1l;PO+0sP?JR61XZ%`To`4K6Nfw&!x zJWxkNOLqs*?0L@14e+!D>NI0S2k87;sJ9sSThlHA5c0N?)9^IaxHajFrOQC~*ATt|0m>3u!tHmrj8$ld!Y=PEWbT=q4Bgug{ zAeV#eKuUTbE~wb-hB(v%>=^LQH;@cyIu1=S$SEC;Jk2#KDWJA!9Vo`Z=>dPyR~!j) z7$h%%1~5vPUS9!=K*otJL2W&7bql&;8ax95&wgNKa96+!kCgu>K&`mfy)dVI2FD{P zP2+b8fAdMGN)+cnt8&ooz|iD*0z`L0_j-3j>E;*U`vO423LuABfQl>-rwDv66^I3P zD%6imuaAKO9c&UPX~9hgO@2e~{VE3Q1S!GL3G$33#NuM`Ep84V>%dBz|ASly4tbag zd1xR`Q30s{Wh{6Y!dIEW4JbmW200p4HSD%PkU8KH&mQoud;a~L)(1gH@qj1cA!3jU z`E?1*o2be`NwWv)oGD;4x`Q}C8RQhWnC0Iu1S&>B4shk)&)}$ip>v7~Xx%z^db1mH z*AjFb8{|TeLTDd0pwp4#rR2Z=|G^Wer5af4GAyf$iB;#(cm&j9M(HLKF^Z848nuQs zqd~)jkTx`niU(*c6xxvE0CV8yullHPAXW{|zsR1%T z0W^IFxjz6jS_PWK1Pv5HTn0W+6g+Yz0gij{Sc3uoc7|q1-ENT9$@p3slsAwRfe#df zC<5Og1yTf30=fhO+`u*{WqJ)U2~_5QdSeE!`(Y{&6DAOMT7t&wTjT%#|NnA7G#7xc zwTBFLaDcZ1g9}NJ@!*!d1H|o`AQK(B9R!#`ISW*wLYFN&Al&Z&a=$uMp$L*fupb}_ z!F~WK1Stbq0`>!FAr;sU@MSv=uiIfNu=^n#qB|=^+BXon8T!=s|-J zkfS*uMZ)KG#E>A%O z`oU_@He`ecXe7Rr>Ge`j1P3%%2ypSYf{$Sbosk310^qYTL5>XQc95}jVq z7W~^;992PqXA2@qK{Hb&P>B!~hqO)+N6@W5B^V}WKuiWtRV8#gfM$O(%9vi;!J-lp zJEYn4ddf>-aIXg(gpj0w$Mee2f)M0+$bl2xQ^3dLgWL}d0?3y8<~`u^0vJldkevsS zD|UkJ%LnN~1PA|i9~B4dgQcKNW{{AO@GVbc`IOt59(qh~yzS<7)FBdFt*W!RU;I%j)223NwN{~ox zEofv8#Dd$2l)a)cB^eI<|L>991MWJ(orF*Zi7b!qPVk2Q?htSybmDfDz|iv&RJp>M zO0m#jZnj}$sln2uI!;8K^S6L*3I zMJPC?!2=P8j<tp*tc4qwpfAaMAC7^vY365;QC1}Zy~A-Yh*7?h4cR$4Rix9(;D zoe&7^0qg{w2>tzI_o3DUh*l?|Aj0Y`&~9^(GoT@Y@W(}{RbZ!s+PvUxjUWbDmcRT2 zY9>Pt&SD_m&Dbn0fw!{>`S|4r@W4d~=tdbI6-X`vRs7hF#BDqRs_4N~%XH7L@+3v0lw7z5B1TcFd9K&u6sYg9NudsYfSb*6$xCyUB! z9&p1Oe77^GMGk5kfz~OAfP}jpWSBv>>vZ#|bUI4Bz6#Q1-~m;OsZ+zll0~H)yUyk# z0+^mbnGZ#6+2LGZkO3NdPAFr2c@J7Wf!9J-bbHEJddSqtft(0l@c|A2@BuL}&w@vb zT~rDn2aAEn^eP~1@FheA-3}6v$u1YrhBFWwwDLfw+egI&I(T6Nn&t(y9HD$rTgJlD zMa859JS%MJqN2m!3fij=as_xHivpylp#TXqXdeXZ1%>h`kSYa;3qYrP>wwzu^`I64 zXpUS1G{pfr*5);6?FeYShDHrY4z%9^AqQ&Fn1ED4%mN+o?IH2H=jB1rc#(?=$noG6 z2_R2^3OA&acR-5_K)MLJ6MR}55$?1Hg$~FMSlp@H4RMSHDC9u(473Leau>{_Ajg1? zZPMuUka(E~YN%l80HCH4^tLxB>4T4&Bk}xv$bt|LkK^DrGq|jj163A~Z3W;`2n!cH zn+$2cgF6YRE9F3$@yr=i_Y&1#X+8q)ZBVWsvEBge5=d{N`3<^5x_wj(K;z3Ephg4u zKzz`JVbBf~vV${Hwb?bpm`z z^q-wZj3`HQKL86uCc%u4fJU@8urM&}0N*&4eE__+6|4lZoU26zbS470Edka?-f2>h zHJcz~L2EWav&r8-f+qDqqp6_wKZpi3ijfYQii9>3z-NSGX@x=75QFykd*C@}YOO4& zYuf@oQUrAS8KemX8-8j5ALDSWMFn&K6#Qf#6q~`vnu3C$8~e#kr$9jias}uND9|{P zDG7c+)(crPVgzeBp*RAI_o0qveC>>C2xz^V0jY+d8UdQ>O#v;&28BxN0Yn>!keev8 z7PO*k0IU^gJx~%uOWzV3D#WV8epDFf4lvO9B#>U$87LDJv7kdNpa+5-5QCg4208}` zNeX^27)UAfyebeAaxfT(1u7*#2O)tpfoRCVV4#zaU?Na$Aj!r(;4_gxlg{vi!9Yqu z{Y&sE@}TpIKr1$(ry4askcS?l1U?uHq!cue4_6BE3tTDaU@(vh@WEgpgFt?P%d*1^ zf}fyt0(xXn^B(ZgN|1xWKn6e$1_L=5>0mIB3>Gh;9}EU6$v_8qsX!0#0-X*5TEzzH z9>Y(o0nPk@7Od`30VzW|g9{}efqF$?TOmagxIF^y-CcZX2P*DSPQe3hbKyPSqQU|4 zH3LJ#YtSL2AkP2)|Lc#ps0cvB8Nj_k5C`0)0x>{$bu)vn^aJtun;k{KNda`O3;28! zkdHt|cs&6Z#Xc$u;7wN$6G5vTAU=d2E_MatF%U(D$3VSp_~Bw8GeEu17c9_Yevl3q z1BsDwxL7&p<}J{nX{Cl(a~19|e{GIc1NdwuP%L#%0f#ZPZbC%X$(P;G$U-}x40LoF zcr>;}1$2}SsQG!k1$^cblnFY(49X0F#@_K3l?c#jWS~J@$hkTo1+PJ;mVw1VCp3Z7 zf^LxjsRQvr$Lt`TS_bC!%7TvDX#pSK*4d&G1KNC<3^5QC;7DhffsE~LQ2`lh39-DM z>GcFqMu1gq;OYr-wE#j0bgfN`8>ndp(c9Ug0y+!`occfvaOwjwx*>*ILge}Tc_FjR zpul0M0Uyx?QU!7p^b9jlSXqLO=&J38=;?%b12njUq7-sO7f5+`iwY?5cK3h-8r1Os zO*k?!Fw}tx1JEIipnE!47#LnlVk(77fsQBw-Id#-0#g4v1)Fuu5PK|JR6wOHc=ITT z(b=Nn12S9*j~=L+Ziv!OhzT#x|NH;{r6Vmvv6jM61o;oyqX8g~Vh=@-6ewLnLJ_2q zP$+^z8aawWK!y_tMUWa$dWF~mG65Wl-H=3X2}vs@G9V?)44{=;;B(O+i4b}m-ph4= z{{L^@1I`=_{5^a57#Kh?2TGFgbO=5nF9jtN6`=4+pjis03$!AEe;*5D^8@DQAB?4P z-4K_6?sP}dR|7ibPwaS$3g~DjXz>6N12GYLK*vCJx2S-q&K8v%hzTH{SV9ErKsz2m zvf$${L5$aY-H^lnIw2}RJ_3oueKZA}Il5gAvS=S_Jy5HGR{?mbNdzc5RPd_nY*7KJ z0%dYYgfxK8@Z6&UqFC#|gSu#r0Ea2dL9iRtv6u~)2Rk7K)TdsILX!cYqeQIP99TfhR)*n!3Xe`^+G$1|uD zw}iw|Ehtt%kp(XOKn!rKfZ`1riy&8k#PP-oP6gl~NdN^2I970~0~N+B;4|Dnib1_C zj95X_3lH_y1GV5-!6grNLJG(U;8?+>tg}T0qzEZiKwN07fHZZssK9a%hzkl2EU^NT zf`)$c9&nC<#0pd#6kCW`0SQ841-14P0QJo(I6wp2APG=&2h7Jqjs*gOn_kihcp7Y%-hqMp29;h`2#UU|j!9kS)3MzeKwSe+2B;r8&pb-bU zMiR>H~rptp`feKx;=K6$eNmDB{30sBOUnI!hU)ga=81PRT|w85D-EK_xsW zTtUS;G+aTz?JP%wasagdWh>)uXu zgOa5d0VUwnSO7|mY6Mhvwy1#AfsT8EBs&nVju+~5hL@78kopqht{!l>VnmP6d6sUM zLoDDNV+yj6IMrZRmVjJoNW3OcSpvy5Af3=$16m`_%)r3P-?s)j^M%(1X!)BMwP3ea zfZPhs-^6GEwFXctE0F$rMA+_ymPKI0KoN|Z=0G(SND6d>J)}qnr7=jE2o(njfPxN` zG(nS{AYqKy;W-b>JT>sl17d+Q4~WsxqOuU#DakmZncQG&AT`)P8bBLGA+3xh%nV?s zg4_r?X%v*vtq=0Ig4Spvic7Gno-EKZ6iCyEr0fO`I9&dwBzd=h{7zc(25ABL3*r0b zJt`pYvGVs_geGrL^#_V@aKsa+zKBr^PTn0Lw}O*5F!2oYkp6n3Zb-Km8vNk4 zD=2iqZC4NjT-t%!QP6T3+;#&=K+`!WJ%hM7S_vR2sLJL&;8R#Jazu9vxLSw0fWP%M zXv#JjQYU~+g_WtG&LB!*4z6We!1pPDiW!I;D35`%GK2>z@1c#9*COZ^E&K^S76+|+ z3bh74R$+;I=mFfnodOGU%cVkVeo&8TiI74#HYh{5{(s2W^5|zWhC) zwJD%b2XR4(3e?iVQi`CoiHK1PPE0ueKf0_LTac(z?Vh1D}1d*Un?O_BnP<;+lk~abzg$J?2uEn&EZFM z6CVjDpMs7W$8xfGFX#XfRmK!c}f zM~xqVih=Y(jt{|d)HuXPHsB>FpwK`$Cmdu#H}W~*5Nmo=z!IR-#+xD87NnD*)C_D2 z$V5z2;0KnY8-eSnagaKEM~#D>fb2Gq04S)y8o@`6vx3)hKmrGRviJ&6n*y}t2b3s4 zgEMO&MJPzzvPA{N1Ly1o@Kyzn)(9{DceS%Es?oj~=8H1b8;3LXGuITOoy8<+Z2;TGz@({>lkR!@LUW18rb9QoI zEq$>R0kD+P-2)z7gx-q=N;};>;IYI`5AYpqAQAWpjgYBJ(BvX`1Qz)ibA@K)W6Z&K zbfNejO)YqPAINOzb!!NTtklvX!IXE#13*BDE~C?0PVnJ;BPU9oDsGK)NcbtEvP#Q;(&`2 z5Cf(IlH)8}R6v5oI^7V4NA>}X{0zD#6qKwwTh3en6^Cmi;L8mh(3^F@igr7NGP9b4Yi~5s)45wF;m+7eJ~@^mHnXOjsJu9K!VTPhj2kReL~OUhX{aH zry$9LP74YFwQfKLd1M{{ui*gQWeh5EA?r85%fTV%=LcAJfG#|T9JvcRcp${GLq~-H zw5^Sw8?;OUs;m>N476ektf&*L2xWZ;$ocTIxiUao;K94wVO!wAD|CD)?I_LZ(MS z(Za~z+RVhj09pfH(LDux2r1}ZJa9SE30e9MDq%nl?{=^NwR1sJ_%135;L-(j;so}P zzS@o2F9Gaj5EI_Se&@F_ZLJ_p>xwAzDwBGbJ=o||S#ZXD;QIJsUQ6i$dg%Pw7 z`1=hk=3W66zOvYrcebd2q(S%fGJxk`KyG=d1KH~ix^xe;H2^ed*?pnAM+GDa4inI< z1ZZzGbe{mG0&wpER1||3PvSNRdiG^^3wZB6s8b0FFUW4=<_8T>0r;`4t)S}wvDRPt zpfjqvA?L?}oRfVZW#;!970~GckoZG6Q6~U#;Xn^G!Et&db9(fG&l3Rc65`jm0X`Lg zU*jT(zTnXGQ6Ao&S=AFqc5!{h`bC|_l3hvM=tb1D?w1swg3shj6?AW>`)7^0(2ks z;wo?=Kzj;6M_M*70>wFKXL9xd9?*)q2vD&Fz5)oeiy3q|2FO}48+NHij|zwjJ=PV( z1XVF08gi^FR&N@^OaYxS0XjSayu6NI;{r5-AqVMTY4mJ->GYrYItk)lP%+&B%F*Eb z()>dMJOB>jKnB1;ECz67gGR+byp9e~PJ{|IfY_}EN+?fI(70vfZ#@rgB!CXqhqTbB zU^wo$1$W6nC)w~f9{|;wkmyx`Mla$bDDb9ra76*x3f~QhVaOFOkR9>RSO%#C#WIM7 z#4;qLq57b845~)(&C4JS2#t_SV4#{nt55&IP@j$`B=;Eh?b#Y^X}e*#IB`aM1{2H17c`P^blUfItG^%0vk&YycMqpNV~JISGE?Lv0AU_Uvx5;U*{+H4HUOUFPb=t5R`gA4;rt%I7?=qK}rfQ}G@ zoXi^nDtka17D3v<$-|B+v;0382GxlR$^@mhyu5iJ;X6(x6@#(!shB;InR1z~^^>Pn}DF9MJ|n>lSh; zHt39xZWomh(3LUZljl-ESM7k@5&_yg-~l$h1GIMYFCsv;27n4W z_#Oyw9tEFe8PV;+WCJ==6FK+7WgI#kd64oE*!U0?s2&0AG7jMS5Y&WoPyiK7Add%h zH)IGhfcBH99CuLx3dNc7VJ9(gEUXbasHw?gj6ha)8GZczguqP!aU4N}#v^9q2ov&Rb3Z zB~%I2J)YowjRmk{{=f+(88pNJ8{_Y3y_X`ECHY7p~1fm);-{X4rshg1g$XuAG$0G6#^GqplC7yncWP&+zou{ zGTcDWE)>w|ycP`nt^c9LAY2lB=JHEWp$_R5K`wWffS4l)I-D2O7OG``c?op!t{!MD z4yYjvD&|TAK_~hKfX|?W9Qg}6l+wTgA^D-$XVPr zU_aS_1c*ME*%)-8J@m-sTF?RI29RSz!8=Jo14Aw<1|S2m9k*-&l2E8cIc}M_Qi7a>a@}zdH9G(L6Ws@A?gSkR{{1JY?bTeP;s6Od2XNSd_RE6yuY$Lv zBF$Ag3Zuga)0+3fevi8usaQQSoW6QSpIz8gdjXSU{i#G;#^5ok7uU zU;v9%*m=|7{lkb5!F8%M<^_U2l%6LI+4~GCR3WEKLyigpUmJ&U%CrW^GSEqXCZM58 z&?S!GTiW1fO+!lz@LAK~6L^r%nns?`=I;TuKfq^ATcC`L86ZZ+T)?Ae_|BRJU%cr6 zJ7gZ*5RjRW${ z8XmCyji6@YanL!mkTL^g6?n4`*tBlQ9b}NJ$-w)-D?HH8#}GaPRL57UB5 z9Bkc1@Ikg9ccUI;>%hpsfYRXu34r=xXs&>tbpadm1FJ*ppp~{Y?*WGmW2rF63{a-! z-{v6E0dXQslE3v0GXn$k%-e^cX+2O*24zvCGjYIY-hvMV0^jhNz~8(bsxkrGd;y-PZ#?x)d~~0TFR?5afC(@Y$HK5pl@Ly$PVnMUd}bd&9j3SqKBN z59}?-LFZsDI7vc=*x@b)EsX_-1jr)jm17{IK!$?mo^qkxfD8uy)|;SK5NLkXBl`eq znF0=5a3q3@0qqkg=gWJ5)>46T4)h$%PyAYrpdkbBFf1r=KtB7#ujL661Rv)L5(K&6 z6TemEIL7s$_`&;uWS2OjAIxdEI~Pk@&cfViN91U_c=S_TJCU_o!_0w*-s!ARiqh@l4|zg_`yBt*JGf`Pwf60SG}A3x#& z@*h|=dRoPGq%io1U62m!0R+ptpiuWw0p;Cpw4iy(46e*-R6tot9$c0|21P;XIsxg# zSxEB5c^ z@WHvvkfCE(3Id&uF9u4+pwrJF;enz9RIg=#Ey!jdvtspF!O zfKlXtQY6}$=+GhuB!gb$fJ$OemlN#3PyAYupppuFxjIP112p22fa}zBlnX*Yo(CD^ z(|wX(<1+5zRpS5u|DX~E%|}4ki*@fu?(K5>?WMGz(!yx2s6X>AY zi!2PF&gl~d28IOwUMtW-zZMlx&_GgeC*&r@<~?BdLdp-&Gytg3INqWHS`q?cg3Aw( zIJEo#iG#`y&`NSp0nwuZsyjd#2zpc=h}qc!zT*LQWg>XnDrmw0oR2{a(5@SVZcwzL z>IN;L0PPC}HTS@}K>}diAO>ik5@?wR#1?QV0CHhB!YxqGfp-~$Tnv>0Sp<~=Z9isU zV1ShZFi*fj4~sNNGblrV5;*DpIka}1zN4GNpV zmrJ2*OHdLuH1@#d0w`udQKt<_{KO>98<3<4Djs@WI6(8P+K>{Vvqj|%NDjgS8xP{6 z8V^dLM5kTQ^e4!LppBxSJ{oAJE67MFA6#m5_oyU*?uho_fN&i+K-=Fztz*zp7ob5S zN382#=}^mn&*P^?Y6KZXOlpKyB8ZkKC}DyNXhf3?Rusd9AqV<{+Q;C|3wYT=+fznJ z?+!Gu)_S1CWe4cCNssIU|3S$-0bECRyD)KBI&##3Ch!Xw89-B!4B*o~Kparf1lnT) zikTLb5>Vth;Wh(2+h2if28aVS1H=UFX@MNb05Xb!zr_`t(Lwz+(E0fMEv9gOw}S%Y zPOt2f{~_-5;o<;SIIRb2!LvBv-Z2g};8L^(Jy1X3@+-?tH0Ydam) z=b(WnMx>4uW|M}Zs;?4DR|(YtkYI6P;s8~Ig`Yu7nxQrZU^bROOJ*Pg8Vvlc;461P z*R4RWvxwl~Z)FFSfM7Ambrv3=1{Nqafbye<2mCq<(1q?$A<(KrkSfqpEy#5i9+1P( zAvg0vRe@4HNEMPs*mV{lji7`Kk?H|oCk$&LfevQ@rv}K{Fi@ogQidcg18LKPsU8*3 zx>abk400EA$q=M@4H5t+2@nG+!@=JRx>FcteK+jV36Phemrj732Rc*#MEAkY78THm zaUj)T(H<}toE||g1Bro~)lkQRQgewqOtlB->Ip15KvzD1bb&&hr_>G{Ufoc2NEc9e zATFQ)*#&Y3@*NZ&osFs0;=#-~_QekVHYw@c`Yr0g`}R@&RIjQzWP#Qo{5ae8~qW z3ZOT9SilVfv0z0Fm9xsXB9a4L%a)0 z3!s>X4g`YhjvjD8phrF^wNC(t10=P3f-(*?i$Fw3O8+3&f{g>s1Q8xIGy>%T$QU;$ zvbsUb`Js1Gg70sA0BX!+5b!!((m!zxH&8&6)jXSl+_VC5piL_f6SN~4lsyPF&lVt? z0pdW-05PFvH1AQF1DbEAar0~m$hpKc&p--68_*dU7=~)|3{==b28yjg7q&GsgU;>* zS0&)(bv`Ny{M%d@dB9gt^S9t?wS$kvMQOEzTih#FKB!XGJMA4#sI1YK&^JrvQisR!v#F^ZvomY2)?4?04Ud3bO(U( zkVh|Mcpns63ZQdAmoR|Z1K``0r+|anqZf8h5NJUSXrvBwDg#JacL?YXW~A79ng1Vr z%a;iQ$l0i&2-?;!19Bo`X(YN!K>M9tFiayu;N?5ej4bG+OK{*KISsTp2HS-O&;eAW zy^)|ai;=*=sTzDfHO~8;9Cv_Lseu*}`=}Uz6E7&WfiF9-@Br;e!hc>l#)VCwHi!f4 z+9HrqkV`~8I>F;vP)>IzXadRudViDysqxlHRG4jx$0Iw=J4l3EfyLJRTjyrIG zcpwLWIG{DG3>blV=FAyv_m_iD{sy%?KqW>RD8E5U3{b)c)f%Wp2B@tHN=Kmb2)Z^5 zl!n2+0^RckURDmiUL2yr0etBKv_R-?0L3y$J@{CD2hheX$SSWE6^K=kYls3s+oc&8 zKv|Iiw24!Lp;XSN7hH1f0*yEB1a0L7$93}wm6r>-7#JLPfQJ8#FM)DR23Q6Z76#1~ z0t_Xf&Cj6DE>p~OxZ1_p-D;L|d| zUg~sF0Z*M7bUT1{+ZG&mQK^6hzCpJGXoqbHXp<;N3^e=5$iM)x8Fa!FWLgunT@)k@ zn%@SS**!&N2Q=$|!U607&=OA2f?H4-yo-~80aQwW7HNQr0nm*%-BVOffc3z_&I7Vr z30YqgxE~K&G6Ft{9g^Ch+f$MqSfC4>KiGe9W-WTOZ4-~q54XokK- z%A+>~6be1ytwtdAAi4hm60gBKP{5jceN-|$dMh|Qx7T&oKb2E`KpHV4Jl1EsQ{*n_x# z3fMAGaDjpiY$-@FhyzM)4xowh4iE5o3m`Gbs_2p$6g3{b6)GORg#tT4nHLmR;8j}= z3NTYWIvq_wwFYRoA1>DY!=txQ1*WAJGOq}>zx6;V_-F`_eICsROh9K7K(s}s$)vm+18hE7ND1$3xd z!OPby`1d!=VgOgwtS_PGAAr{ucr;g7K(_~g1~DZ-Grgc#0=Er9R6x6bVc7vjOG zcmPczB1AwF(BQd4$QGvV9`KwfbQ~2l6be!ba!WUOLIz}9XNw98WWXF`ltisyH)OcC z`31-@kRIs75JU>B_5er<#Db|k0Ge<@M3)WdOdgP-XyWi_ggVU9!=^?Vb}e%q_;?Ud zBzHU5G{0~_G7jWwkOW8w?0QcQOAnWNkXDcv7?8EPK=1bksYgmU&<0+&gAM4eRUZ|L z&PLE&8O-GF9&jjhJGj85LCxZqumKj3Y26Msoh{(A7vQ=aT;LZz+{WWvkbVs3f|eE`90zhPXp9vh0&=bnWSku& z0hxdVg(}E@osOV*14*NcBRdPE50A4z+R>f$S{7Dq|7K)h*vZZSJ+Qs`1Usmd2ZalG zWw1rJrv+Fq=;Tmv1^{26=c8iL?P=5P-~rA8IbaD$W!4=a(A}c~nvnpP8*ptfS&{A@ z6_9$EEQk#Y3}}gF3FCV-gU)vGQStC-J}BYQeF3ZoRq_JppnJG&FuCRm8-@~isow2i z^Zf>>00W!jYJ3205@?*L`G5qd2!;$2LWTXf70p*Np2Td6_KR5t26x09#g(p-ssw8NgCb)LxZvicyhsLl2XvPmbC{n5q zucBeK1hn14zwJQlffDdpC7|+}f185_>;yFszdHcD-^8LDsj9H(bOhHU7RMVvSsK)& z0$X^z0hEP7+}Ge4MvLYO2c(#SC3|q%f@gb>QSjsgHm2Ld2bvZ@rG}#qM9{$jmPx>( z5C?QS_@IbF)E;+80M)4AmOMr;$fNr>$RXecwecBnfbTGbWHV@U53!fy-~$0$1_l-e@VFCr)PjM9;k7Kt z1V{rBei+KZ2LjL)P|!iqP8SvM;$o0G{_PGKX`l^a{M%hrG!8xx=)SNMG(iOR4QO`} zXq!Yo69YpnyYYdSvCItcD|5irt3tO6Bj|=E57H`yH0wp|{XaG!<8Cf(0 zCJMe;38ppzCd!JeHU=ijhAf%@6JdVx?NO2cdS{wmIs|k#=yV; z3LzI2lkN}|1JDI#Fu#MY%(8%RAWL(*eN=S7{O%qV(E3a|IW9W8KiRt!HNr4JM!xQ8ekbj}=UAWU)R6xr!pv_6p#fr|Lq7qaZLa(ar z?g6WSxfFDM49M4LE(Hn0T>4rJv?mrdC_r%yO>B@>Gb=*_1H-`=0y8`skAR8?M9&{% zKT6{pP{{}?KR{dGkjf8m#~fvF5Y$^hjDtX$mEfCIK=~b1P(ZXefNx0#_xM50NZ6PF z=t^|x242u;N(iVhKJKDY0-{0XDCnASP)0N0-`;tEiGjiTUOtERKBqyz~B(3k*7qeFK93+QM%SX--m3V06=G_iutoCH@9F5uECq_YEL z3rHV$)Wd;)J7-#F2Pj6mA(aLqadrEs7<4v*F6aP72$Hi)82I}@@dGxcy8(2$hNX*2 z34aUdT3C>?OYk@wv|<~i(V;tl1G=~x>?sUqgL-Qqg`h&Vq_YEL3z!Q^MX1gOsYG`+ z=w`BR$TD$O1_lmLTOE{HK^YsGa-abOGR~m05pu_ni;4!U%j=_J;L_a)G6t-odm< z&>&_3C=r8O=A&|ysQKJEliP*@-hVJ5&vlORKw;Nh!MUQk$ow+32xbb{_ORPey? zKBzH-<$h0>4j&Z-EQOc@xGV5yCurywsSpFL{ze_H1U0bXfdRT@2BZ;OfI&{z0_7vn z+EQ?m19ihe{cBM22DN@$50t=%9YLk|PBuiyvAtZ$4q8pq0$%M13OLaAW>BFDx!&Fa zJUIZmGS&hXCZOx>OF)}m;UeIhy}{!=V8TbmpqtaugQHXu6k-nGOTNKZzH5N0m`)Fg z*G#XMbc2c+=s+>Z#L{3`!zB!AQL_yrLyaV8bPD7%&@`0+R0ixz@Ks@_VJTuJC`F+7 z>mnNisEwoW@&p?L!^JKu0_aXAXwZX)Z@_DXJi0kM zJwQ8Q6<)@G?BWBd#2PQ9<=E^3ojr|emng^tB)bAYiC6=ah`~d)0Upp3oj|Q(Na6%{ zD!_>|0K8vG0+c&no@HfVcv%m+umG!b_*+3|XCOJL0912;mc4=!LWScF&<)s-DTxYj zn1e>yK=VU;z^C~!lyZY2SmT(30>f)#XnTPXA;|a|p6o!yDykQaSQ!{zDnEo}gHQhajZZKi;AOT44vOEWwAD zf;iwctsqA89j59A0}cbwdEg)ooh?0}tu-JYfYk8sV`%=N zQz``GgI4E&YB|QPG~&< zI?ezxN(Xk40zMc0!f+AjFn7@CEZA7+L4mKq2Yx|P1*8W6%cXwk*vh|>rHprEh5aD{0#yu*a!280;z)-K= zxCh+E19PMrAxE8oIlPT~R6sreaq8f?jvq8wg;FT)0i6s1Nj{K~VU2D`rQR9Br~(Ta zaPJi)0kRlb0^ETGNq~HSECKGrf+RpOhAaW@#)2e3@r5h_?#Y5AKw*n40q)F#BtW5n zECKG%f+Rrx1WAAkhS#8G?Oaex5J$n#2$~St)&d@5Yduin1InMUvoi6NVUz^-mRQ0fl~ zbWk%NWRe5CE(4!n<$zh2flpKc&rnBrbbAVbrl&!{__CUrf#IbtXzeK?u0d9SFleoV z9kMkUpecK3djT>j=%NBXTLxT77Jw>Aa2xKWD#+C9ppFrCQ`L}7g`5@u8XkeP0AD_5 zVqkbV6SwXdglWt^-MeT4b1EAcm0Y0k^ulJtaClATBNj*{O=#PVfvLB)B1^ z2*@l@1_YheWzhjKL=R-h15hoA)!Y27B_KJ_`Agt&Wzdzbpj_4s+5QEpsz5DmSi)w2 z)kzGXL=BPwwc9{h*s+_1p_7FRrjQY)kdc5wCYVAd0t%U73YiHgWPvGUA)t^IrjV6@ zLN=H}HUbLSVG7xCCP{IabP~rxUY=ce&Q|y54kwruWxVr9!92y8Z z`V`c2gv2wxvIk@|G>3qg45($#d{E^0xC(6${NtB3*@2R<~LZ+x&oCO2B7i) zd=?q3D*<+g2l7%Eka1_=y+i>}kp-&1;6)bbJSb4;d33UVc1ypIm1Q}t1pm|J~AQMawv}FJ$$P5z{MygX;V1mtT zh%sVTm>{xBHkhC+CqgAVOc2yo0G}ZyfEKdg;DCh(c>PSLiwcG!Z0lpfcPvnWPFs0s zKLCZJ2FPZRfuC1{DyXv zDlwpd0k5Hp0e6#Qnrl>I9BcVOhxf!BcWD71JM;PhDCoeeJsdzILoXN^7(l}{o!|rN zq02oSK$8a--VPvgILD&LnVt_9n zf*36UOLY(~XpIth#1_H@Eo0IERZyVafi5cGBnApP(9m57_*`T3hE~H%B_?nZ$B0Q# zuM9G58N=WEA5@?uyQsu?WFG*ZZovS$mu|lcBZo(_4@mSR`0Nyjs1Fw#IJiIs2sk02 zYhr@#(}xb!F}J9Is$tMH1Sn2G2PFEa1b_k$GzG!PzyOLLQ11#N8vtDt555!|v@9On zg9R}_$Eh$fFo5}>={InIw}6+<*IR?`N&qYBQ31&{KeYEqJ_)UAx_P?z*Y~J^9L(&~ zQqXb1uuXC zr-2@@#!e3txT+o%km2B&VQ9|k0UyHB>7fHY3KhjkpojnkH!LG{IvTv>2XFbuxDsOr zD6=BwJ3-5@;tv}$Ffe#CfhHtDBWTKC7HHx~mIWl%&ceVD1{MR|;RTVM!@|Iz0Tyd! zXJ9zZ2vR4eg{HFo3QLWMSCM z4KvS`2c|cU2c~x+4@}2dIO_r*0|RJV7z@LFKA61`{0t1BQ?XbWdifa`j)3hr02k8` zU|=W(yIxlSW}Ap01H&?AP#7o+!c18%2s7omAj}j6A(+?(VFrdOuqj)GVWu#OFfbei z+h!>SQ|BZOV_g+zU;wStW?|rzVqiE2R_6w1T~=UVcmo#Oufo7^8_cp-Wnci^WWmDV zq6)J^SBHV&JXkhX2WCp29s|R2u41_sa- zLo5ul;9|$%tS<&I^Xv>^EO8@Ph-brDYv3#fW0>p$V+MwkVB0nuGcbTM7z@K8V+ICc zu)PUi1H&`0Si3m`!*eiei#Y=W zXj=&j!)0@r$?we>7*>JJ`(h3=PsD%g*G;j(|=vI@2g4C}$Ns;qFl+?dp&JLYqb&{=mn-97ak)K?f#DC> z6oq(L8aIw-U;v%5%EI6j&%nS4HYG5gf#DxmT|zu8jUSI^U|<5v-hs2^5@2a)Ng^yH zA0@(4lUNc10~=U}T@nKWXeT-gLn>Ts0$j{BnSlXR>$5PVB{ML51KV4Z%)r14*4vxR zz`zG)%}Zur0QE9h7}h5$sWBzyO-5WMR0M3=4w~$*`EQO@X}qnb)5RGw)z3EO$Rjg_-;}6_#Qp z(qOq;IgNp#5^S4B8Z2eIr@?af`ZQQN$jpGbWqAh7EmtyNZehxVnJkydz)%G?PdO82 zo^vKFceiH3(uP&cfghmpxbolRa0(z|aZSd$|gxSF#$GuEMKf>8hd{rlY5tfuRemV`4Q- z$F^!%YT~Scsgtc?VCV*`Q>uZfbFGKTCe|}BfG!MXVMwco$-aWiey?X>=mqQj1DBO( zU|;~X5?L5@;4FhCn0dBM3=Dl>9ZpR!^CrV(w>B{_^n+!0!DVkX!E(wgxVrC63=E)4 zeOVa(z}4|IGceo*rx(FySb9-xhNYLL7Fg`BhqHdcS=Ozvl#|;EQ`guEbMvHD28Kys zS50q)x%muS_HHW!!(_1RBe<-58%%F_8v}zRxNVyWXH~;ly>QmaHU64u>_s!~uxo>knOw4Q&tp13e1S=zUPJ*dpp3cDV3LGvR(_!J_Go66}w4s%S zA$2+f1L!_b7KY;K3=FJbb%8TrdR1n@Sbyg-Fo5n5Wnr+I&%nS5R+ls%=F6)2Fkg1S zS+n4*HEEUS@YqnpUW5+W`gzpTL#lxyPSc63+$ts6);m)u3%u81y;9i z1x(%56)<%gD`Bk3D;XGgz>VT7*V0FObO|bfM(Pmf+;O1sn@8mt4#jyoe zGfm$D>rs8&!oY9_?5bH?VPaC-U}C$rF)%y^%ih}tGw%bOrM?{|YqA|C>kAhv+YU2t z_70eTSL|S5m<#sr+8r?eUfKcE`vT75-wD&9z7rPvMmrf8=7IH^?}X{y2Um9*qz)_# zTAvDOaX*90{@TgF0J;jEh2cM3uk|jN9Ui+F7(f@svoQGXf|*awVL7~m@oAXF)(Zb zyT$kr%$KEyV71z8xVmkJ7#KE#)$N9>dkUBRbclfgv>Atm;X7Pb;V{e&-NOtFTfusb z4#Vt7h07KlW?3)vf4*r_F5ca zVAu(kwLJo}HyAFPaD;(j7g#nGF1rXWyZ#6R!)~zb7P#ywxa{>K3=Dg~vUlLJpWw3p zk1#Oo1V!|gYW9K?Fm){_7#I$M)peeLnYR!wyY~bG!y&NjA-Jr}O_*Mb zn+yzx!LqhDVR}R1vXwU(7>)^5%Zo%~4y~V(A6fFDb7EJG7xUAT128Lr`S@qit z49CGNyW0#5C%`P{+b|uWcVOlv-C-JBD+P8ug0)cGpTJ6izfWK_gy1un zm=T;61!v8B2D9zVGX@43a4X{$ob~=0tih&%h>Iv%pMFV}Y40zzQ?jjumEd3Mi;sg5d^{TqgD?lolx-X^7hL9qnfHkk zW*!R{j3o(Y1;ANzxEL8;f?c(c3uc}z56qN!9+=)jIBO{nBf~4Oj#WG`9Uu7_86?5+ z!6*RJD=PrgYYb;)z*(yW7#UuJP1zs-Gvzm2udpCYuPU4sDagnGy1{{kAx;pcKRX8hBgpuJLSVx=)OvfEj zm~H<=VLAlFU@R9gMuzub9iCz^9iPQvIz%O4>eS(^XbDD!4`3Y$5-=T`C15%ZNH8*d z1j`k_0H8Kl6nh0=@+pTT;Yq#2>(b(5tT86e|zYo!^X<8^zb85yj=ZaE~) z2%UGiBFzY$$5E7Fgw8%}m0@H6%|Eg*Jd|OC&e@d9!rc5%mXYBz*c4tlM(9k9x*SaJ z3pqvx8L+DqL_p?2aNMbgpBoDkH-eu)RlAVfKos!DNl#tTZ)7hRa~RO=>XnHmJeOJE_LV za1ktfL!FV~HJHV&0W+lt&N{5Y$lwXK?Suv_tZr+-!fK@^BXkyJsTNG{CM`yWJ7Dt; z!C9Z+vZC5B9f@#Ohc+yK%!iA8gR^9HV6rAUFufDutmAOmdvGyEU6?u{I4e;X7H=AQ zFxfsmSbPZSGcw47W6MAv<_|l4n7Wg2+2?TCuW;FT1DLug28;|>z&<}{01Nwz28;|r z;PAU<01Lkt2C(q6He_V@3YPUUgvDizAuQD`F@&YM3x?A?1EAwMuzWTu@)nk$vcb~q4S8R;4Cgvb@O<#S(S zMuwkYu^3~Rd6mYD48Oo)ZN@Nr=NdCI{057yfvbCJ%*gNuEcOYmj?;vZ0kr0ug+amu zW}b@)BZDG17D`MQ8UBHFG@8In-eSVYa2)KnHzte>|G~1q;d*UN!BPw?3|^)%9Xm{6 zIzE^(GBAQ$p#M!_wpp3MWSh(w8JNJb6U|_$ zm??iOVc{oe#mK-4Rwrf!3qNHmMg}&pn2{CCJSQtghB&Z4+^t}-8f67b8@H_(8Q8%( zURc3w6R?Jbkdrkd0|!{v-x?;HZ4Had8P<#poM73daM^3tj0{|0vBz*R5gV9!UN(#j z++f*o8<=_hHjE5BV6i!HF?l;i241k3jvY*0g&oZ2y>^TYd|=s0b}*mMw_{}B2aBz< zgZX@)9V0^u*yo4sU_KYMXJpt7jzlSYMuuBpR<#2obS86-11z;aa$tncP=0Y>WB{E! z%)+4I$jBfEPC1s2j1011ma`)xbS5s?k&&SQY+HmQ%(g5?SU7J5=>WS=)EVZFDrZIp z0kBxTGt3_xF0hiJ%Y~8QFxY+DTp1Zk!6xr^g_(TX6=pJ{3=;!q5o-aXA`=6j5Lbbu zBMXBBqcDSDfj|OiG*D5EGNgJ=N*10x$F0~?6uW@O+7(Yj0wl0~8gj37Elw182A zi9uwNKmnr;6NAJikpf0JCI+q|wgN^jMg}gBdIcs1ULj71x=jKFj0VgMl8;0SL=qSn z7?qhA_>H&=7-42>GBXG<8bIuU$tf{0@NMEMVANn{5M&gCn5oLdz;}rYVrLPOogh6y z+yyXmB^{X=BpA2xg4_-A*MeLI21y$h24O~d2A%?LuwOyzkQp^u7=#$D8Mq6$65##- z+ouMx59GHX5s0}U^HrD`1e_oyfb9z6E|7F)W{_r-V-Nwa&0+v`ma*Ceank{An43Pt zGB7Y2Gc(9Aih#o#;=X*i`!bjr7#Q`K7{osb6o6WX0-!KO2@@fR8^P{Xfv`dHL0kol zddv*sj6w`xJ?cyh!bbd%Fq>f!6klSRyY*3m4?MQ^>0ZCU-JZgaB5hMp%We?FS z1y&EY6O>1U*bsJlGczbLPGJG%H;_Ki8be7JP^c87AfdXMxH=h&s?HI)nvUa{yt1 z-01=$pcu4L7|I0CpTXGRTQ#8^&{daECW9i3!N9-}!i3=TBbW^Npqj`+9LY>OgfMty7sho3O*KO~iAZKvLB&8+B8Y%t zB=>+$G=K?%X0~B$(264%8??3#8`~2m$iRRS4&F#^E<;Mt*O1(a9Bzh4{+)@W7dcE6 zkqdekhXx*`1)hpD=Mf7=wXSwT%mB)c5EiJ^2m;H3 zZgd8%yJBVlm4px$=;XX`uq^1zLrpLXbo2{^rNh9$5D69otu@yIvp^*VgawN4Xs{UQ zAXsfM3shb~SRfz9g2g~(h7OqJ!@$4*VS#p5$AiT{M>pt#SrH5j3=kG**)J%CGBbcG z5l~;9nIQ$VIU2Myl_7(Hfgug7BL}q03@ip}Hh_BL%nYC-AhN--pkot3D>9iGY8W7E zGnqjrSuo^+WkClFfcnSG44^%&5Ekg9ntZSTm4RhJGh?8YRm=>aO>__zXvP83)wCA-8tQU0h+gGp-&|wo0 z7U-0=9T?K_-Od!^ps}6f6tc$`4wX$jlJJ2wCsI%n-rIz_1!D8^Z`$&BV+AY88N1 zEiyBtFfuT#1aLRP;qGk`9^*#wpawH`ntUCa!in`|H~(2X%$z_OrI z5SM}d3tFTPVS!p1+rYA*eFLBwR%Qm!qHhRm3TPV(SQfNE9F(@089*z>A*=*5NM4bGs6?m z5Fc0!l%F4fS)d#SItY&$ylxc20;Ro2U|DdCf?43u2D3o6KLNAA>qo#W@Cp$y3$!NU z8JGoH#|v6l!VF$T3t@rA>|cXrK_hseb%e~|F**oKg^7XTEm#(`?i;kWkQrQ7L0AS% z3=HqVvL;NBH7U#t7I2mg69dCXu&e_UWL*g}gA1JH!NkDu87%9=1X;ns%n$%)fm&~0 z!LkudkaZi(3^8z40uuwncd%><6J*T?GeZWPmBYlq@DnUszyw*{$jndzXH_sUF#HC~ z)-XXyeul6>x${3*7L?aO#}P0yfLgu~7HIt|BQq%1 zE&%Pg0ILJ7VFj&(XJ%Nz#K6D~mR-XHSy9c*umR2j<%W#%4=qZJ#ZFiy(KqT z7Ibb5DAh89*GxiKpfgc;!Lp!(QZ|B1Bv2}Zus{cr@q=aWFflM}0?UHZ8H5E&HG*K- z7fcKco58Yg;H(c!3=G0x*)L2C;5@?2@B_{Qwe&^7vJA|Sd0J)$7C4K8nSntZEX%_T zS<}tTAOL5HFf%YHfn_C_A#1vs8D!ur(2YDQU|A5k73?ZdZvw*70re)pvIfiy;IVRM z1`{~Tf|-EvMrLF>{%BlyhV6`v3mXk8}A2h8BLi`&6&2CYAYut016K&@J4@H#ut7!WgfeHw%X zT76{;HW}2T0_9<5@VXiZ3$(k!9xMx5;SU-sVg|1xhp<3BFGsK}X#EIiOo!-4GUNPC6K@7c>tH8s}sN&&)zt zpcze2xH5xh5kVy`Gk69K!UD}G#e?;N=3hW(%rk@M03a;TSZyj;7BtGb7aUfgW*>wF z8nH|V%Yw!W_km?Wqk0e)Xp}1xEGxpoz_1@ID*`VvI;B=;4+_?K?TmzU}0b= z1k38MK-RG`GZ?^GCM*mLWnfvPrYZxd^h9c|GB7ZJHbTQh0zl0|1_p)?4yng(c3#uA z?ibiJ^Y7Hp%wL=YW-7lCS9bi!zwN^vw#U0JL^zkF*?r#l@<^V^lXG`KCt-lCS!#LA z&hUN-&z~m^rEBlr^j#lX@O5D$cNL6Y`)qY!Uxse;H0{|QzWeyR!J0rvd?)AU7U*TB z*rc;C{{Iguu^iG;6HD|A3??u#G(bf3Qi@WOOUl4qE|80v86{!b;j~^#YEo&s3TO)} zs0w0WW;B?^$l!+5dt+dLssS}-MqB}MdTj?1H%Ip5zyva z4mo7IKBijxd ztM)(<0kw4sP((mGWM-gXrPFkW@2CnKoJ4emK7)>pq9x36cH|F28I(T zBA|=CKcI+!N_Yt+WZOY=jSeUxpc#@36p>aKoL32!oVP)ifq>n76t|j6p^zL>$-{7%EUiBH0)iCZLEEu`w{L zKoRL?V_-OdBC>>yf#C*<$X+%Eh7Twr*Vq^sI5d%c@t%!=K>BU zB|8IyfEKbZm^c_1G*CpOIT#omP((~P7#Jc@M0`0I7z$8C(l{6xI#5LFIT#ogpooA@ z!ry@+vXO&<;R1@tDGmmP7bqf+LBn0z$Zr0_!N4GaA|lGkz+iwPq6fOE0!74~lYt=t zMI?cffuRCLq>__?VFHTCBu)l~6(}OBIT;uZpokpiWMH^~B65e5f#Cy+$X8AV1`Zu$ zU+{4;FespisB%Y!o|R_0Yzjl z7X!ly6p?FO3=9uYMBZ~TF#JFf;oxRq5YR>Tg(5ctg9eI-6*mKe1Bys6Hv>ZiibxJO z1499dNGmr3LkEh;JZ=Vt1t=ohxfvLCpom=HW?;C0BJz@(f#C&;2oq?KR1ewB(mV_d z5-1`jJPZs5C?dW*3=AG9B56Df3<)SA^*js=6(}Mzco-NaponbbVPIH+B65m{f#Cp( z$YUM`h8rj%e|Q)eKA?z*@-i@R=p*|=kC%Z#0Y$`}mw}-HE~1BMcrt*BU}nbmG7Jo$ z7U~n3L*kIuCWwpxZA52a0ILBtA{ZFbc^McSj9_-@m84dbsO08>)Pl}1V`jYJ$_So| zaC|lw)BpuZfNsvi(bG!@;7vhlBJOZhS zM;7_c%fRpfMTC=&fuSG~S&a-I1A{<2vWPh!1H%CnyFx)~HX*CY9|Hqu_cx;Tehg%nF)R#0=G@?8U{F92dBw-TV1Od> zhmV250Y!w59}=nvlNIKoJS!XJ7#BN=KNJ!Oy_30Yyy} zKLZ13M>;}H4?hEggbA`Q=J7KyXrPE}0J#uFk^NOB zz`&q^BGMtiz+izQGE;zoApk{WwEzP{gc-6qdj%L6CZLF%2TjeGBdd8Rz`!7YBJx>) zfk6R9gjJA%!2v}?T#$jm1I2btK?a5Z6gAd@3=9b!601sNC)pr|=5$iQ#`MdYp^1H%Ipk@tcO3?EQL z7(tU_7RVtcEX2SdfFhzQ#K53{B4RGYz+iwP;wi+y;D90$EyTbOfFhDB#K4e%B2q8J zz))a`Z2L?h28IR{k3=|Q6 zVFrdBC?c7{3=9WQM4E*e7*3#w%oS!}xPT(EU6_I40gA{)VFrd5C?ct60hmQle0l zf#C&;nl4cW2FOJhurZk>q6`ci;HxiSBKt%c7-pb|+z@48Sb!q(31mBp2#**8!vz!( zH8BPT3p-?=I*2ha1fYmSi7_xlpoo-+F)$>ci1djuFl3;JtPo>hC_oW8B*wr{fg*B8 zjDcYSipV!H28J0ZA_C$J3>#2Hw8R-0PN0amh%+#}KoN-(XJC-9NA_2RI0J(RipV5! z28I9>ku~BB3*h%28JIfYCI$u z7!u%WRD#`&%q`7LK{FrVb`%3t#0)gYfg)lKn%6)Pu>j3#pomz4W-X9KEDS)SFeoC1 zpcxAk5hKui1&W9K7NA)d6cJ0%ECaHL zr2%L@0Y$_RG%tf9Vg#B?KoKzpt=>ctF#*jFpoo})#(+>n%s}%1C?e*d-L)tp7N9u* z6cJ0%JPbm_!oa`)w4)P6#1J$GgCb%Cnh!t`F$T>Bpoo}&W?xW5OhM$N)4egCb%Gnj1k8G4en&$H+JUUBm=5+kv9X6tr>%MZ_!vU6(m%?gK@Q z1!$H7MZ_`%O_#Aj3A%`31-gi31Dc45!31;>!v*LfMxa%k$hMmpA3#@Qasge$^Z~kv z*#~qHb5OSq#bgTsR@B%ru~a}4F*Pti7cq1|7cmMz7covi7cnV77cp%>7crZFE@Hj_ zUBqGox`^cgG!Zj{3+N(-570%7KA?*jGq9nChM9=~x`?R)x`>$px`;VwED|}K%`5`Y z)mSE=iI^J{poDyfG%RP0bRuO0J@0T1#}Vf2k0UeAJ9cC8Q4+7$HG7W zUBplUUBt)$UBuV{UBn~+UBom2UBs*aUBtWrUBqGnx`^chG!aXK4d^0<2hc@~K%=F| zF=%Q009}pA2Xqlr1`gElu{0Av7co~r7qKuv7qJ9gxQt}Gp@BgFsv1KB!vu5@qXKjh z;|6pQlL_b|rVG$T%r>Blm>)nFvABRPV)+0~#L(aax`-hICrbDj8X5_pix?}Qi^hrbP>Y^=psfN;3A-UG!4{-+=o1lR3pK_ zZ~#SQGHCJTeq=SvB^VeSP(=1fFfdF&5xFVBz_8&RvaW9u3=9FEkVUv885jg48Ii`> z*3n+G-1o;B0 zhM6HZH8;5czIa=Kfe9p1oC;d(35o&+kVtV!QF1P5AtXuUAPoM34N2GGh;gh)P$$sk>I(hLlsb`(erWE^`cNDV6_??6OWfy_Y>IRLT? zMdTXD9Cl<~FF|TJAR>^w^H-XI0hD?{c0oiWWf&Mhvk?dpJsAdu4?M`a++`RT40w@6 zVq_Q?6!?%u%48TA90ZU>dO;=&Ba18q=@LN}*&)Ngkboj`4kV(Atmcsn14DxvvIw&* zWJVR?W;Iy`h66gtYTQ9;43I?es`6q(Ru|-z19;C}2S>(Jd1A{>z zvd9}*28IP8$ReC_3=9D%vjZA(3=9G($ZA~V7#KFBB8$Y!F))0{Ll!BNV_;AyM;7Up zV_W4hi&V)oFc>UA7MTRng(9*{o`E4?39_0U@(c_M)+38tlxJXI z*o-XlL!N;_U^lV|s{#YV0~8Tq1qOx>D0P#X0s}+9L1bM{3JeSv9wCdwDljkzyhj$P z2buF3S!6Ou>afBJu+yB8^S z$RdlVfz+UgSSy0&`jORyD>5(`=pu`N*2plR)UZ<(85kNIk=1Mj*##<}WL z{ac`38(hQ`WICvA3>9&$$ShGYW0=YbG8KeXz#@hwlej@V5Qd5HfXgU^h>^(@a2W*> z0h!9B#K3Sw8Ny>@fao$eF$R}N5K#sO86^gW0&r;q6VXv(U2V6awVU^oRA zftq9NW(`vV5wS4;6M!mWW-J3PH$b8gHHM~VlR-QXhKQJ(l;(hVAPf;PwfH^_#Dic4 z25%(>h6UhU2@-**F*fg74B~+>M8v|#6rAIbM9hwE2k{`7fgwtXf#KT^2oDw-hGrYV zsTU&3z>ulLz;Ip_l%hZ)5R;89w`sscK%rWt#K3Su8(E}PiGd+j2U!HPqUtkT1Y(Y% z(NP0rHM5l%7(O^cMnNI<*G44<1_mc&krPS`3=VJ+y$Zy1GH5{tGb3m;4K(e!#^o`5 z)g}YOLy$QPpc^qkYcKT*5V}Ac=$IKnqeXm-3=HzUj!4^}zCv|@)qp(809xS%vIm4A zE|gJbU;s_!Bh=_CGcW|eT?o<^s?5MpfFe?(%)k(VBC=GO0lZrZVe(031_n@b9bxht zWd;V&{wRbRZWV|KLXD;h0|RKk6he)g3IhXZ-xNYkk_rO@X#W&KO@j&p18CA5p=K^r z1fga(=sFGt22j@tG|0=qz;Hu_fdRC?3Zdq+3S=%HVGge<149OiPqkGU7&f4Yc&Rcl zd_WP&R%KxDfyWmp4BJ&1z`L*zCNENDU|?`YNgJvR3<@YB?^PKXI8a0+)F3WIxYXhXw<~4ipg`4F>Q&HH69D8jw>K5hiD9Fo1WfA=I>LFff32lp)kC(17?9p=Q4Z z0|RJZ8A8on4F-l2D7OFAU|7O$LSl6cI;F2Jjv@gvs%m3=E(>X$X^RG#MB` z`?L^hKr7ckJJS$qHfu6~cg7*q+|guU0PRmhsA189_zR&%UyA{}OAVnWQVZfQgqkKT z1_sbxHH4Z~S_}-J{c{L4r?nUuKs(kDYF=wGFo5>cA=I#IGcbVmts&GXX)`c@e1TBo zpbhDRAk@TaL(VNgsHxFrU;yo5L#Uah&A^a=5~>Ha85lB9L|$k!FchGO@ar%zG@yu> z=`b*KpooC(JJ^6C(yGJ2Fat$oy$DFUlFhCL6rpLgr0Y&7o9s_t+BEs+7`V0)9eSiqNjPw~8WEf$!6{z$J*Joe= z?FK}ssn%y;IDlgEB7Fvi2Ph(-7Rm_}kuUlT44@s32-_tM7#Ki12@xjS8ZdzOIU>}g z7%(t^_7fu1bQwV63!!G20RsbQS0O^pK?4Q`&^}0nntKKe44}P*2sOV97#KjiArWds z3>g?eI}8zObPX98ZlL(W%aDOV!2>x4(+wFIG*CoZ3>g>Gzf0|RIWBf|FYpysJ3vR$%93=AA7BF;t(3?e8ZnMMo@3MeA|MhpxFC?eZHB3{TQ z-#3E91;Rbd#taOgJ!c5_s2MXbXrP$mZOp*nfMQO8F$04KipW%B28IX}kzK|N3<)SA z_l+4C3Q$B?O&Az9cq6+|*Mxxqw4VXt!T=Kn2GG7ugbRyI7{L2R5o&r&Am_6p)GRe& zU^swc@=1^y6p^QDF}`(lwP14Dx^ zvdBqO2JmiHgqvTRGJyA#BHYYl28j!V8eKEUIjjgZzGe&zpgmOxH3epnecK2%lguD{ zoe*kvm_cr1L8!TF1_?2Q8V1l>B+y#2Ha?KeSW}t{n zHHY{MVe$@h$nHpl?YGP!{z9nvZ_WTdZw{eG*@6LldL2TIw*}-hSA?1(3&_0|2sJ$x z3=E*1s|YnqEg*ZB5o(TGFff4kufl!$0<;new96GP!fDCC0NTZhFh|o8vM&{3j;AF9 z186TRLQRGxWalG7O^YQ1187GpLd|?jh))q}c3LtpfcCW_)LgQJ_!Ob$vn2xqXm=|@ zjj$C118BD{LXEx^0|RJ}D?*Kz6$51VF5F+~RtyZFovsKq%~lKyD^Ox^ixmUI2NaQ~ zRtyXRe#q%r+?s*m2Z|bRYe=Xf+*4)EzyMl3g0O3aH6&CKYW7+)Fo1T?BGg>8hMe?* zQ1jfHfdRCK7NO>kH3N9>FhY%#4Fdyc%?Uz{xeX-b5o*G07#KkNX%T8lY#10ody5fj zCfG1AfOgd))U38)0Pi(Ms5xQ7zyMmQf>86s1`<06HJr8#44@sh2sOI43=E*X$Otta zwvcE+s7bPAVBkOr=MGy2h6yMl>uebqW}t{%v1MRbfFkk>bng#}h=Lsh!vPc#H#-J~ z6DT4%b_@&;P(&u%F)%C$K#uo4b`0R%(+FQYuw!5V?FUBqg4rGt?+7(&_6!W5H8}`1 zpmk56ct@zowP#=etxG|unP|_z0NO>3P_x^ffdRB`2chPPJp*`GH9`%80|R)UFhY&A z10-!A)R;RkFo1RoBh&;rFff4D{~*+qIWU0t3?tOcbYNfrt@c5v+2g>#09x&XP;<`# zl70|s7#tbE`-c%~6df5DK)bXNYHS@LC;TGRL^v`qTtSJ8az_S+4JdIj&5?m&2a3p6 zM+SxiC?Z!K85kM@kz???BLf3yRTaW^5hutED+t>SKz(Iq|f2$Ay7G0YzlG3j;#{ipXIX1_lchk&iBr^o+1w$`x{6I>Loct_%zw zD7rFT85jgYkbOGQm4P7uMPxTf1SOUqxI#|(Mwrav#=ww(qD#(=fuRPa-(&&m{eUo} zIAdU72y$a!C_vGb>&C!f5Q^-cE;j}S(2jA0zZSVc&Y(uvzSE6?Ap^yn%Wez|4k+fl zbz@)%KoQ|^XJEL1BBJUJ$%6>HY~2~aX8|MZ3UPZl7WnpA&_y9$Xg^{r_3%ZE;7Ia;fN61Qwt*#3m;T9 z#)f7RsA`N&Ej-XfEG;TfMJx=BR-lU*gLY3LQj~?Ixg`TXitUybmY^L?$Z9MtW}vCD zv|NEAVrgJtZ~|S#=mxroNeoJeSsECa<)DjL+(8vFGB$aEYL1by8R)K6gbOW=j4fGE zd}?WAVl09#VrC(L>{Cl4Qv(+?HKs?VF zSS&&Fm$_L2nl1~&3Um?k3Fso02T(k=$cyWOxEijgc{EKOTx2vj=Euj1442P;EB> z9mED&4$1&o*KKKPVrqe|#tgL12C>fE($vJ<16_?p1G0#*fq|LX1ym73OLGZPB-@P* z3@t4*&_ygGP<0s@niQa_F)}o>Koc=CK7b}-Z2ACQ#L_?v#daeT%LFtLQ{xTjBIXR@ zsJhHe4bVj_L3>@`A#ZG8WMRGmO^t=+4>S==V*?3PlP%2?P(_Rl3?`t97^xuVFJl8! zL*oUgYD`TGE})8-SsF1&qS$3_W@LaaV&Z@^+KozktFnWM4Vk#hwV!MTbxdWPrp>YJdh)DyQh^g@g zbP@9tXd-3?H_%0lU!aSagAVRQN-Y-V1{^Y|E;Kh%Ko>EwKo>DhKoK#tG%=n47tt#! zNmlXn1s}W$x^tA75!BWNor?q-`-JUkV_@iowsOI07{IzhAiB6g{T&>-7DIJ`)iCHG zorVOO%ZJznvge3Q`Wb{>JE6KjYM4-Tfwq(*bm=ZgNJ8kk2-O8r11g6Y7+yj}KsGQj z#HZzyloqFg4i*IoFfcLbftK5tfoA9#7(iJ>ANx>>W#BWaqhQze^q@2>!_~MeH z%)Insbbe|{F+*Z$Nq$;pNqla8N@-4Nd~!}=F<4!BQD#YIUV40SWpPPrE<`*PER&d$ zlN(>0T$EW*0ucron^=^Xghenn4^yzLxCBEmDKWPcQ!o`|Kbl2Jr5Pz0Dw7klF`bm0 zm{*KNWl<)kU`A>YreJ;nraO}him(V)7Uf`QPf0CH#1t&XqCK@F1Jg9zt z#xOHICovsUFux=NQ?Mu%i}uniEEbg(VMa$rY7(Z(?8F>Q$7g5cVo{lqiy0l+c`2Bo zl#`f`;r5)w63nEOlURb8=yDQE3NW>27GruSH>VOa)#O%UaeH2NKBklM^7B$LEXvPG z#th^9qHN6A$S+REqP;j5GdzkDOEH79I3uwf!}j9LJWPvL06K7C2N*sBx0t8vcybG!JN!o%!tb`s>I^=${fs)FUd^8bZ16l9;QXe#S~KM zm6DcI5?@?WiCo};OEBybxq0zeB|s$^HVJTPhE)PoqG6Q)m1@`|z$F`YiM(R0u1ZcU z%ET@KD&?>m1uE&VN`Oi`tP-FSFWD%$06h?sAri&OSS9j{Qu44$6eK5NH>x-@FAb}X z;#?e-7ndd#W7knyfL)>_vm^(r4s1RL7wcFhKt($?32^a_O#)oRl)#spk z4ZB29Db~;h*KgQ#fa^G{5}XMv*u_io;;}^_xI#=e!i+$$1hxnS zOJIvYumrXUgh*hCK!^mE2!u*tMj%)MTLgk7aQHk4YdnD~c&s`=l{_{Ha7B+*0#w;! zlK@xvSS3J}J~jz(#gA12RQY3-05t%xOXMbE^*Oj9fK3OuF@RM9)F8kr0csRrlK?ji zuuGJcV09I^fq+#9sF8qG0@P5zCIN0NV3Pnh7_doz8x7bbia`wrY!cwc12ze80|J`_ zQbPgKhJXm$BrN;1G5yp+=1+)A9z zfXG5jgZTzo3~mFspIDlgS(KQU4hbl56AMiwH!mJl1k|WP5dpWRP(?t^C{z(p`w2w^ z+;Bn@$ty;+3*1yfRRd}xp^AVSN2ns8RuQTQsMUia0&XUtih$Y&C?ep70g4E?MSw1n zjp}A_8vs=esPab@0afm(BB0t3O{Az4)nst}hoS~t@u7-be3xK@*yrjh9R8+Tv3j!Q6xq0!}Wk3Z3RvB;sfn5ev zP+*q<6&P4$zy${mnY?1`ZUYx2*!6%46znpff(5$_sDQyP11e~+%76@uK&2dfOY z0KzH*E{Jf+WMdBlaKVIK52%2`E(0p4u*-l7EF3aLrPy5nF2Jzr0T*Q0Wk3ZQE*TuL z4KCoY>H!sWI3!ANBx`WNhf7ZZc8`J!Lachg1tNACP{D{*23$a5mjM-&SY^NkCUzN6 z!HHc4RDj};$xX!WQ*eQbRS&pe#V!LXV6n@93RB_@O0@6g$llGGx2OCL!nB|i^cRZf0lN_=`wWkCk0 zQI4b*#n|%1qJq?-`0~`u^o){X2DgxSACNwGus*kt_~6u>)Z~(Q=ZwUn+{6Nqd~hlX z*B#1@_smO4tpF(iiTI^fKvaPQd`oj&GRvSWw@k1im&`IKD=am+B)=#=q$n}3I4!>@ z7o^U=v?M1pFEt)yl(SPlSO-iDtS~3BBo$d9SP)&eYi?40PD*NCL?p6OkeU8PnW=dt zi6xo&c_1m@#FC=Sig?ewvecpyhP0CS+|=Co#GIV`WEiI?6@{Btl$r{Xg2q^UPG)gQ zd`^CTc4+}fI61#44-`+u@o71UC14wZo#Hc%EzH2|)Z*gAbZ~SP=NFa47vzIu9L!G4 zONlQmP0TCFtV)ITo7_Uc;oz83mY4@g3&k0UphyFyk>vcc)FPN^5aFcKwD{zrR8R;d zro}_mf&^1ii%W{~!F@ESDA3rX%>@a8l3#p!PJU8iPH}u*YB`1& z$Ovc-#gGFBQ({^?iXoZB@hO?2A~&?PmcCE!3wtjH{m&j9x_^HR&> zi&N8cQ}e*t22Cb41rmzjL=M#f>o+2c6{W%p2~=TF76CaLS+qE@4D1SIvBaFr^t^bG zb@2uHAcvuAf+zrmZeBWGCFQA!**Fw{-58&e2@ZB-+hKVdQqn-f8e9m#Qb=N2JgQ`J zMrv|4B$&Zz3nB{%Q)o!T!WBb4Co?Y_rzA`>C@e5^rlgjD$_mi!LZwBJA`LV=0CO?A zqmbo5(T3z3XsHCX4HViKib1o_U>6|EpoAev0=JhDvKSslNI@L{j(WId5HoRj79t7L z2XZ8;=Hk4>0*FUpzJjR*PlkhsN?N0#*cfKg3v23?ijOlq`yH5_ld9sffueEr>79$V>xgM-T^GnG}E=21#SZpb`z_ zZG;dk{=sn!k^;K~q8uiN5^)fz3{Xacl?#x?1|T;hX+{l8h%SWFQ*#mF43UF)94$PN zrBFi@A_H;;BK$xl2B>6*jkV<`rlc0d7o|e$d8jlz$3mn*qKKLp#7ixLdn_ffC_6PT zGcO$+U=R(d(25J9DLykVzBnfz9OTFi36x?Lq#HHY#DiPAMHO>n29@BF{G!x&2;bO{LB%yM#W_E(B)_ys#l(z3 z1=KKr^UWDlTtFRxaL@puiirUV*VLFn#UnGXB;FS?z^P(v!JraSR2g4ktYTycWtylM z88N7Y7N^Enny45VgR56)RjX1|lI)k5o2p`fE*h3tn41YG!}J3l4KP39 zRf6P4Nb>?z;lo=UNZ!RJi=i3R41u;yFtj4eVbut0zhKn~m&DKtb}+P&gP|2g6025l zO9-nzunc$_P6a zNdqoNqbNZ{1B%DMtw}^gV3EV25#Hj&p&22MFaWbBN-6t_{`= zKtv?6PMB*O=!*p_gb)f z3?hX+NFXgDP*}s7g4oT#q7I*ds2w4EMxv?2XDD*l37?TD>aZJ#Xl-IQ2uU8h0pJE6 zcD)cOgf>Vk5?c6zdu>P&j7<`kRV?Q+bOb?J1=0*IMoq(*Hlr&u1T`rMD>EWa znK5z7Ob9AN%4T>Shc&n1)PXZxkpd9YX^^&X3TQL~Z}4JOhb4Tms>2e%Sk++(VRUsk z!wy{`5rK!S1!w4?D1s+WNXZKCsX@kfum&Ijl}JH|TP234aVy2+ZS0ybJdR5ldZvb` z19e3aLoJB%1d>d#slgG3pc0&j0E8VALEY{dWQ-{?fU}uAhKagTrAS35(OfTV81@{|XRd7$@RRu2g@VN^uOmG>7GjOnJ zKno?TN}v%BlLMs^^eWZ>JxsAF!U!yEiZH?on<9*$!lnpZ10#ngnj##*iKdERXdp2b zA_uOBxVQl;M+#nyBmq@`h#6!R;NlWInSrM`g~+2C02&A=E8m3kXokfexvoMlGtNk(HquhcxhyY5=kXsuq~tNV6=cTCpiWH3HHJ z21PV%ItJAQEb`b4K$>L0rXN`vp&b-5D6=~Vt(Z~>ZLmnh8QL%jR4ovnfRY5}umH$N zEb<5gkXP)2N>rp|hbe_!8>GE~@FKE4h#dL=CnENcXRJ^&8_Iwo0S(}CpGXZzIh9Bq zSaU5AdXa*XDAkD21x?jK=Is!niX?`r5IU!asuCuMq!he%2f2NN?8nIS8@RAVXU94&l20^-Y#h|GoP}zp$ zV{{pKHxD@g!E>NkdwFOG!s=&<{f~vp`8G@?JK+PR|s*v&? zK4n-l94-wQ@q!s}$Q323G2qk+Y1qIM2Tm2}Nds&8K{E!c8gzp)aLt_~l03vwxD{eI z60JZ-HUuJtt_`_HM)L`>6uLG<@eH5FM|V0lCFsULDk|(%HpJ~%RA4s*xn4%|2*eCz z1?WbAf*DrTqG?8wg6DdWSaCeKAVRIeAa2Gcjg-%^Nh4)&G--?+geH$C>maGb$TKK% zNWlSF-~dT0h>$=Q#ZU}cU4az+5YB!F>B zLjoA5G^FUnDGezzu}LFG4>o!1(SxoMIeIYVFoF=4wGeAlFhUu?;R6a9qL-MAie2I&>LqeuHYl?;X%mEJSieHWt*Ffb-LFIvQC9)zMHH zY)*qp;ddHn^*0u$frSy75LCm1Tic*EK2l_$i6b9Kf+OR diff --git a/vendor/FreeType2/lib/x64/freetype-s.lib b/vendor/FreeType2/lib/x64/freetype-s.lib deleted file mode 100644 index a8e71330d3daf262f100cca855fbd62cd6fd3b5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1741018 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%0Dm7(7f0xjCFW=)r3Xj)Is~|T1o$|)IXOTtb_h;I zn~)^#o?ACpP|@w<3`%$*MTyDTpwx#Ft9}k{e!i~$e%@{%H7=P&smUei<92=yo?f1g z&W?_rAT=N(0unRPDp)@UuYdq24-XGF=&CKq3HxYv`8fGH2Y5Sz#{qp43m}&gpsS(d z-Mk(FEvIrsPJp|+e}Id3fCFSK z0832xJ2-p!IJx`!xq}x8K%zars1hYA{2g2z{hYo0{2U!%x58r<;QkIS9*!>F?vCCL zxuCmu>@9P_S68A|7XA({-ku)*9&X+a!KFz>zF4E)pQ`sD6Lo=`n+vtBOLq5i^$zg# zZ~=|y7nOkW2u30APvo7-j!wRgKF%JXyyl#rTL2nKM{Aq=I}mm8GBMZF`8#+A_y;(; z`TIFIhPehgx?{W4o_cpU`#bo#IJtQQcsV=xCKiB>I1f(FNX+)c)7THxHx+| zfG!>@O-xU9FUl`1KuMhe4o*I<{w_ZLjt-74F7d%3kv^`N$&=VSqg`BmoI&*;B>J!y zm4t5cgN{E1IJo$^d$@dSZqD95;KCea6|{=MP({rB*lqzXo~~Zr-pFH*zG&xX z2ROL9`T4qgJA>Olpbi>#8;QDW+siM&$KTHv@5DRDyMuf?5YX z6M2!im$QqPv$r24t%8ag%<7n0helK5(sFz7FchH!sO`zS+uSY0IUaOXqjO?%Mru6d z-Z%zSLC6(N&hehPiRq~r>M%sX*TjLYKSa?1GsHJBFEKr}2zIfib39A{Vm0)-ICNo9 z9}Mg&m}+$6AUBACbc64aMd*iJ2Iw5`m!FavADUN`3c3c=IX>7avjoF4=z>UoK}bRD zj(5a%>nQX}PUux;;QOXPH!mY@HUswyNWY8}a=RSuZs`Rj0a%=X(?dMem&li$<|Gyu z6L~2!5f`I^ZXg4d7oa<qDZhJ%UV3!4gMUXCx1M?C0enYtM3+%yMXp#Y6Jcs{Y zbLib?&`VI^_mF}T6X^OoQ0WJgqxY4oiOH#;>nSm>U3UwKC-FX3(5=cKuN33GYZ-Ju zA?RXh8ecjMw#GNHARg%g($o@2!hA^IipAkB#M3Fd(>=7JdvDG(r68G_HUhuuyK>I0zNUJn}TB6Jt6 zTTndo0$!L60d7I)SHgmXpiKw3s$j@Pu%1ZQ$p%2h0*b)5Dx)g}k1)dp;mgiYLJ9e< zLy+gex08Y*b`V{H844A6zTkh?{}Z337OtepV5dK6N96s1D$(k)2M z0}F&D=47TougwLif@_Ce)jOE(A@8YTowt3mmt zc`5Y1(iqmYf!-9InF=lnK{pxu;%Edx<*?V7AW2ZmCMDi8uec;JFBzQaK%ykyot#<{ z52~55R@)#0L6SHeF?#JX=xSzAsRl}u(3^)rTu@zzCgc+pjwS*rPLTvhuWE+0Jc{C- zQqwc@f=iPE5=%0m0hFJeS_JCBXC{Z_qX?BIp$ma}u*gbW^HQ*w~GCbj~l$D}iL(k|MAcQ12H*&?hr571fc@;Q*L{0f|M$sn8k#*`YzH<(YY~ z`?9^0|PM4fc0{@M5t0Yg{sT~E)HRUO#+#Sq|7`mEe#|KqSMmS z(m;A(G(s6nCrBkS28%(LwSP;TLa9PnELx;8zpB((@U3NU)3 zT{`Od*2p*5fzl8%fAmJXcp|6E8T5my!GfqJgKnb3YBERy zyU8FK43j~Es3wozXa~Ai4r|zgB(R4qNCw+oFyM>ju-yd%mcWP&kTKZqf`O>Uau*Cl z0?S=6PzlVtV89aC?t%eJpd3u8$^#AF7ssdNB!bmJMe>U>Q}ar| z=i7kPfz2w;$uEgd%*n}5hMI;dlU9_PidCYZC>69|6XF6?J!s-ZiIv6iMc}`<5TkUQc(n8#==!(=A+1i{SOk!O-zml9hy=M=A`CALKDVG zfjB=mH5cx35W5f@OxNz(Bl9qLZRM0XIc!rmd`MF4?8BAen z1;`UvB;av{2sM}<%mT2)Fdnu10|_7(wIzn}P@7;SE68bZJCFpEGgDAY=@JtoG=UPZ z9}SQl4G}WLCT4_1oiP?M6HGBITCu1y!_;VjDFm8)1l16zGSI2~`1GR0f{e`M;&^ab z#!ym%>SfTu$9ZUCT>ARp>sR4~p{bFXp^2%1r6F7h%rF3x3JQkiMn({30+*g%3My%=1IAi) z8WO1#dYUP5sv(6Qk!sWON{CYlDTs+vTTq+}F8Ya84JwRMi-=X7SXx1((llbtOim-t z#I%x}s&ZnLrdMSa5T_QDYz&h#Q;1WYoJO>3lR>-Fh%+@Qg=kYr$q{KKV9ycfhP0C6 z%HopLT;f&dm1GdD7`$+cSk(o@rk%8sg2a+kVslYiNq$LLVh*vc$R#=`K+OeWO--*L z!3p4IIMF62789A|(@N5cK`Db+lZnn9X(fschx&r91gUp=NA_fL!_B2s-sr^y~_dV-{GymQOxdVh9 zKwDe%GE;2QSs4HSXJBAva7ar{EYUMCn83);01-hBYEXzUGlBveq#J>egPDnefq|J3 z6wnBH5DPhonZas6feeyCU{H8*>6^gf9+CtIr4>Un3v);^0;LrPa9Z)!VqmxrH5b_f zAR&;oB3vLA62_5MbkNj+(@IfFVo4%G?*b+UhAmtS3?aM_F#!e!1_y=!2R+b&P?g*~ zh$sVtG6Ms{7pNMTn1Vn+0=ha-DiP;{sesVf)EO`^FlZ2=&W?eBA%c&AVH#8|D1xw= zH;tKrVHF<(gM$#nP7noFhvr{U9{d85geU`(4gwAidT8o+7#JA-5TTBhfq{WT7;Frj za1b!SFpr&qfq@sBI<#>1XJB9u5oTaWhN=Z6TChLR)Lmd;V8|6_V6YW|Sc^+tG7|%X zy9firDlv#UT;W&Dz`(E%ss^HxfdOnUmT)l?hpB+jxWdnt2z8tc3=E#w)S>wo6dyt2 z3=DBlwYdDj!p^`@B+kH4CI@jFs8j^|1I@fT1_p*Y1qOyc3J`UmOpQ(5O$G)ADMbc` z&x#Orp!f!>t3b_1pnRjM1W^Mc!Rep?RUOD5rb-M9j!?BAd%^0km=_OKL&&^*B?g9S zs9Id+$uKZ5%v54v*a}q#N-to0vAA!)5(C3&s5)Hcfy$wmN(>B)pn?HZAcD#bP`bxr zp1d*xgEqQ4EdKRWW?+a!SBJ&Ca%BdFW^{FE=7IA0LZ})-;kQzmfnh6DEiV6pve{*2 z28QS8>ae(vRfT~;Pz7QuF7rU?MPG%1!5&>57V~0N7#K3q)uH(pWL`T|4a8;!23+ww zU4?;RF;p!s_krT~pb7)SO>}iw-1l9Dfq_{SVk<85K;fsT%D`ZXt`3WN!Kw@l@#yNX z__tP-fuR>&9TxLet1>WbM^}f%ysN4V3{TP3VKI+cje&t*4ZnXu`CJ#O2BH#od|0Y6 zFt|e1;tD^IdC5>Ugv`rVV_>L;s>NsCOsE<{<}FoYVAu#%i_1Jv`Ep*3f#Ef}IxOMG zsm{P4st&OgmwBM{Y^=_};Eb*gi+PFa3=FyG>d@jBadu1RGoq0BDy*> z^FZnOy*dK}vj&I()21`v%~74>9T7#tY*m>3u&tr!@D zm=Nw`VbFkxD={$eF)=alF@Zvsfq{kL2ZIm`NQ{MnkBN;zk_W`*V31@2(Oe9Yc?=9f zEIbTCECLLY83=cR%#+|?V31@1$#WpofD$wV$Xo%ixk4-;b2%9Jn7A1Dn0OfYm>>;Y z76yD6vM#57{|cJl)%8pl*GWnn8Lupn99Jx zn8v`tn9jh*l))gxlEWaxQota@QoO1(!jvS)WX2W)W*Qa)WIOc)Wskn zfZCIVHm?v4rZWrF4sc;$U|?hb^*G$YEDr_-22gX3ks*MAfdSM|WMrsdU|=u<%g$h6 zU@!)=7BDb?bultjFfuSmfyE@47#J+UEDa_G22dlNk->tAfdSNXW@K;xr7*B;0TTlQ zsPDqaP{G8&;0P9LU}9i^xTS-Mfx!wa=F!dQ(LLb?0|Nv9Hm8hEM+q1HZBCgk+6Rme zIQ~E2(&;F3SUXU{)%bvQpiHk5qa(lbfy3QQF5Qk2{|~rypK!E3P|oSn$+QEM>kd0= zAFy_mDP{v{%4e zCqA7yDiyB1IVy}cOr-@ry%3eVc7Qqu-RHr&J-SbLbhd*6sv9EPdVs(6D=0)e^*y?; zxpXRayK!_ju3%tb0IP@F#^1V>iGcxRBPc*x-j>o%t-C{v7<<-O|!5-BL=~noolGE*5EFB`hwS`8+!m zm>C$-EZw4tSepHLm|TqyctCyN(dnY1;o5!Hv->>As|t?20Rmvxd34_Z1+t6f5^$LC zw}Q%1m(F|*{_TD#X`LQS{M-FP(wO}c(mFZ#xBGb=e8|@6!NR{i&(EiGi%J6n14CNt z+fvrOprp*d-OVSh^*|}>4iL|UfBOeVFw3#~8rZJp0}9O#4s<&6@Nf4^IQWpw`e2=~ zYxl8EZ=PKs4PZ5$&Me*DED(MC+pmJfe7YevLG**%Z_(+@(NGuT>(N=GVo=I=+(pGA zFSjT$&80I(#m3e6q))Glih=PZk6!RV0oV|vXpmzBC33$^{%vj1B3PpSVHjZKHnS42sY27vuy(d0|O%9PB1VqbcdCI zk_YoNP>yx!J_=FU4N=*V!ph)r{J{VJ|Nr}R_klF0O>nhHVPy2^bzm(0>e1T+jslnN zqaK|;DjJU6SA9UK+q3(;ORootrQK7&DqAm=hIRY%cyzi;c=Uq$gA5*>?h4-yGL^_W zww#3tLBha;-{nO2A&*Xfh1WhvlKd|23Ls70hhCdPQzNJ$}=wpe7UxgEcb)gDzMsiJ5@`Qj+8`GcZ6(lAzRd&~4capi|Bj zAcvfT*$hxNsKnv`6*3AQ-9L>ld31Anbk79kQg9seZ+8wj_<*g`U4?(Ua{~YN-~jCl z2OqI@hHLO|cTV%@j!`iHOM}WZcwrU-b_~K`pKd{q?w{RW0zTcRx`Q|zcYuZ%JiBLs zZ1L@mGH5+nBF?}5)DFwO#}>^8RldJG_=~0c(7_k-%oiNHIhzkD9Q?)Bda}f{`6pwE zh~o~>NDsIe1QoSlOZm5ZCm0{FzUavBdcdXoK#3&SVUW_*vD=xa`GCT~A8ghaN>3PH z^6Wl^)o0!T+9yDTfIlvu&1PU=fcVTI7*Z@7cyu$l8vl3ctWgPY?7j&q_FE5>@;dgq zD|<8_F>s8Jk3Q_vS)!8R)4c)g*Vb?RE&QMo)!IRTznPVZfx)%)Knbhk{}ZoSUHP}U zWx4Wi_hWI~%>XLyT&+)gbmpi;IPL;9R6IIMR1$W8O4OZG7#J8FyD#y(T-Z?tV)C!Q zkmhQAn&0K%PEdse3N$wkkccC{%PH-H%`cd&FYq@{U}RwMgk)g;ZC;H0+n5eM7N5qS}MW6&54D7TNdlVrySfb__sMRgBhn*y&GY&ptgT&0P$71|VM;Ji$g*!)gc~0{&_U^l$%=18nk4JY0C*6Q0%=ie7sDKiGWif9XMw?)DE13=GE|I6!R%kS!kF zB`OIX-8m`|KHViM8Suoh15_rxeh3x>$1Pk2G@B6$&PIFSrHV&)BPbQ|3plXw3o`Kw zc!=-|dI|6gIH>RoIw|lAc$n}DdKvHwIJoc&IyvwQc!cl^dIj(cIHd3kIwkN6c$Dx9 zdKK^sG=O}`FW3aCpf%A;P`H6SV-0pQs7)9IW;uighlM+aIEH%k=BQlsXnX_mfk!u_ zP&Yo}(djDh(cK8L&87R1NB2xf6o2&Sbe(VfA5^aI1ZkM*(S6$ZkoFHf}q0qih@(ObZ}L)#%rTD8&Tr?7(Z0Ho#U!oU4TTJsM9 z{`P1jQIKHkff7rYvv+bdFfgQ9|Kx8`1Y3W=qnF3QqnD=_T!t`uTfh`TG?pGW{tpvL zYyHpP@}C7%CVk^?`NjhB*!k>(W!BCd{O!+K7#KSFTw9;;cl>5yU~sX1$=`gR1>`#4 z`Jlj805>JU-s=ugQSj(&1I1hGCH~e6EDQ`zy)3z)c=6~y?Z|x8u~(!GtP&Iupcq`p z!obiQzyos#Ot=ed{%J@4?f=2b`L|!_KJU>DHu>@+kM7f*kft7{_=FXp?BDEc!2#Cj z(cK4fjYs!oFt_^x$cC4E5aao`{{V}+bQfE=Xcs#;HXmbgVgB&)>A(N~_XoIwLi0F( z>qBNxaD-w>9v?uh>|WRPXvqU)1tbNYXJ%lqtXyK>)NeF=XQZI=1UKdROof&K!&(aA7Usd9Ux~Pga`P*e)r|&-|ouo(p`H! z&80I%MUD9cf6Hl54c2`mEe&3Dy7oFSd32w4?iD!>4poFHCzwFl)O9*ew=V~E2YhF@ zp5*VW1Tkx`^Y8j7&-}B~cXs#n&f0EFmzP3}e2>$}5GGKp`TphK?)n?-Y88;HKQb~f zxON`_7v)g*I$^pO)DQLPb?wJ#_;*GIhHl@!bH(Tq0 zQg(25c`f5&{i23_7pTGYTA=k(36DqjIk3w>#T%&O2ChrGA$3XjA&+ifc@N_=U=<#X zM?l4mW2|FLd|Y(wVbDnb9dK<3s?o#1tRe;m2GGnL3qv^r14ArWY%2o;14Q;BWN4Cs zh2a`pR)7&EYrx3B5CPWV#>l`B17^j*SvhdlR5)unBLhPuSlxR@SU&?a&IYl~fC*-v z2NTS^1UL)SZ-?lezy#~*EMsC|2nU;Yg$d@W4@?XU++Z=#m;uB`G0Y4MpwToI22jZb z5u3^k)3K46fdSNyWntLH3=4xla9Ih^*dW+ESr(YAKMPE6HVaH|0bF(sT=oQ9?^(Dk zsAhxsSDF>3SAi8~attfX2GB?$3qvhjb^~1Y45-EiyXqob_B$&qOikEeA#{!n z))V`{#sFHF!N9@*?ht|6@dD897Py-Q>NRw41hs%XT5p$ldh|{Pw}G0i7(i*R6U2d} zs_x04t~D$fdURj*INl5rfmE!J#OZMyJb(ic0(FnNOH?c%{UFe2STxw>o(!!A|S9iVm*q)UcykK+zdF9+O%NprM5u?y4+<##z`>BdoXKF!hkWGO#rn5+$y z{X5%0L!RH@1QYa7Vt16Br&ds z%N}K5V2A<-40Vps*li45|gh3r_W(H7u3c><4cGJKUwAgfl zrnf=5Ko}I<5SZ#l*m6 z#0Cy?|CLK1dd#4&(+13*=vj4v@LFAZ1Vt zkq5a3!UE|A`3vDokPeVyR5cLQAR8d&g3JUBNP|>@Fhm|z52%a9%m7X&Mcf}a3pf(k z1K2?0<_w^LLXa*H1`VA@wP84}r7jr&s|nHp!k|eHh%N{Vq-z&M z7bgn?XAtWL<^m>=febnz3Mf;XDFD6@EZBT#wXWK-TG&km;^@a~WA2qw~bMM^@ z^BcE9)mrjaKYL)Xnl*&yRKtOji;1#60Ciz=oRH>ct%SpdHYQ=XhT~U{7(ZO=t*~~(H$H$E1 z^B1mgbuLcNbd^^+wto3}7=Pv|<_iZBwZ1Fl<*d{<^)bmY%-Hqk^XyHDu})rz%}n=q zuT#4?pI=Dt`&rk3a|%gq=uS!-i^K?CT(gk%Ui(y#yjwU??&PU?84p`l z8~^_08hb>IQ|KRm?Uuk@w;B#VzgK&8t^`l;(?U0Ht1TDv?EjwUzVKpqXl2GBOTR;w z!JpPOZ!gvOIb-ubP^ti7^47+Jav(@I0u!}17HNqfs7PdH1WgivQtk6i5vLJmfzm06 z2T}vcARzl7r6g$eE=UfPk0EItCgQ-rzyL|pFcDBQ8PweXnFGQM44}~)P`3lb17QY+ zW(Ed^07i%ohzMvRBmqTa52&vR7eQXg3UVnkY-Jn6!wvdNKoiIy_c1VlIzJ#53xfg! zGXt_N(5N9ZWSKMr14Fs*EeV7!*m7Q03|*iG4KpLSSY=>fxL?*MfY1f%zk=*y1M32_ z7#SEq6%@j#fZ?=2Gs>pgQ^Q;3o|1qOhCFm zEDV{8(6tb%3#5h#B~C%L7BeHLZUrehyC}&C5gPkILZD^6kkCL{U<)y0ot7bu@GGlG`yg8XH;b6*KU z*E^^#0kAHRJSb8?Lr0L*0um8sVqhp>g5?zC*a0o&M#PT4eQzux#FRl!WME(bsX+~A zP^v-b`hJGxHbR#>R2N7MsxHt%3T8%73IVw(&Bgd6LRU6a7f20i?10)15W7H1I;JZ` zA^hG25&|uz2Kya3g@eZ6nHfPXe$e9J#GOAqAi9v%fR=MGGeTPZ3=9I(_Jv}q0ZkJ! zGlF_hptNY1V(ki11M-Tkr(S@Hh{HwhK}AI2B43~) zh%jUY71bc^;Bd}O%}p+-1alc6YV?qn?SX0=W=2qc0jXHt=>JxX0Tgo}9%v8;M1$2Z z=pilQlLY5VP{{zYd{OhQod{jVP}{+37?AA(Et)~KOB`;O2UHhW4T@c$(Evz#2H9nv z8zhO)6$jM?R)b;}XlWxeBZvfLcm3z0i$&pf6+?A_WSLRyl11^C(9GY55V|Hpb%E8O z*ahx2GD1R$fuZT;Br$}pbx>VkH7It;qu3QYZ~hvDF3=DdDCEIvQ0xLN9fO1+C^Y^R zuc=1pdIPl!tOms{aE}RGr+{?X$9&*J=;DS(H&_jdU7*$Oi2CdIPx)+ico=Fyb%E8O z*acb(j)<=lG6yCibU8qEfz_bc1sd~UW(1dA3=9nG4!a5>bcI57fz_bc1zMMku^( zLYE>`7g!C7U3y>_g32gR>YcE*^aetg1ymPU4T`@&d)g3o8O(ptfzag-)dg0AVi%~* z35hR|U0aOxoe{dypt`_nQ0xMYQzGnQ;o1;@&{Yf71y+M%ml4=spi&f+HdN0>s`A3q z#uTV7uo@J*z~d0`yzF>k?+1jgHBen(H7It0YITSUVRrGs?K%wA1y+M%mnqzZpwN&h zlVwBbx&ze(R)b;}xCah)A;_-i)DRASxLseMy1;5s>@r8OOS1gtI)pB6XcHBz2E{JW zGHXaV4{~A4arKi3U5Zd$U^OUqfflPmLIb30udC%^gf2^{F0dLDyFkP7h_vx_Zl5?p zS0GduSPhC@pyd?^yY3xxLULgyR2Ntcid{C~(16rX3=Ge{Kj=l+)dD5R`gBVYnys&02)6lTck? zHK0Vm@DM5j;xI8F?;Hj7WtkbF4MLDK6n|!C0Iyj=KX0QvGcUI)J|i_T1$10gW@=7K zF-TorDyCRLs<9Cc(c;u((ES|oX>bDyQsaw?i<0A0GK+ACrskCtRbrD%EJ=(1{f&<1!0I4?OPu_!(>FD11CO)L*|`v^iA{FEzHAqLQegy4%zAvenSg@7+F ziwE6X#{j)=+uY5~Bf!bc-`fGYvJmAWYhMQ!H)l^zw*V&x(1JsIQ^+bq6g4I;o&g>n zo*rHhB`S`N4lu*b0s?$JJe@q89FX;aTm`zzDn2+hCpEbQ>`E{ndeIeFz$ZU31$tc; zXmwIvNj&HPCP=7(;uPdl*x5;-qraevphCqk7x+5(d3k#{y88toG>8Xv8`Nshr8d5$IWC!H zpp%e5$57!rbqcgC9Hb7a8RZx#w-CscsIbd-z@ZfnyBI93Bp%7IYdbSbuOA9#3BO~ zG+~JIFoYqh4Y8}n5JqMNEl$M#}tRCHw6bJrg{u<6(hFK4vqp%4ffqC~#sFD2 z1KtOZrfx1H14FAA1A`K1jDUfG0o0YjrViA|Is{S!8arWt4EAAD2O8QJkz`%^9K*5a7eJ>dq7sZAf+iA9psB-l-UVn-`7#meK>6VX z5$ZtcBfB8V;4zS38#V=ZXfZQ#Hp$;?rK;a^bp$;?rKgLFLOc zBGiEQ zBr!2C9Jgj*&;&K0kjpEii7t@SLCuVOs2UI-gu&%FxCIR2K`+p{-Cg5S_TsGudm$z;F_(7MFRTrr&cr28RFW>ae&^)}Dbu6Vz~nmZ#X<2dY=y z?HL%t(bZuwuhgD_p%GmjntwszG9RjjkbhU(Gcat2s>S7Bko&Ge)eti8sXYV3N2pqS z=JA8Z6Jdsd>jeV`F7rU{<8@+S&~yTs z1X+%P%RF}{28LjCb!hn)lwJy*7#KRy)nQ4`%bge)HlwRUGY=FW7o8Xwo}#P6Vji1_n*2TDW;==R?h4W?*oK zs)3jW*-?P&OjpqQ2nx=J0v+uNJu=;jlCxWpb`^mR4Uq^1ZMJp{a}4+Be&f;nrof~7 zmQU{{&<-5qOOD+iJUhi4H!wo?@3?}_sp$soNjMHVDue;L&j>66RpQavJOi}LvipHY zw0xiaB{l?!hp9yr3%C{1Z-U_yt zlR(=#n?Y;DjlXp|3v@ek@Cq_9Fmx7!jy>rtW^u6C%)-dPP{P)Hf~C`$gMZfx?oMY8 z*m)n_lRtoV^>zkJcyu}|c(h(B3G(P}2D#az^*~7&|2B@6lO_HWT==&!Ia-}4<@fl1 z$m9P3uyE7-uXNk^Y4R}Zt8+des!{)f_0Z^+QDMVafcyu?f0G)8t>3X8Oc>~B-t`}Te z|Cb1Obh`#L`yLSR=yd(z(pmcfYKBK|=mFpEbD-l1U;zsWxm?gW4c&Ym-JK1vlXg72 z*<5<-8TkbqBKQTJBRsp=__upxq;+~{K$ux+o!(gxW=>kCcMgP^m)7Z>2VoYZb$S;- zm_=!w-bMV|o7q4+jXRx7__sHMjwwj%bS~>Y)>+JBxtReJ1?(=J)jW>f$346GzB%$R zm2ftnVCr<{0dqMNN?4k`ITUfqDsy1}C}c7v<&$>Xkjm>C!uj4vH` z-I1J`SL(PAl;=FU{Ukt<#Q^eV35U&M{#MYb5#8Mn7#SFhFM&_>=>C<~>AI)+C1Z&* zh|mKO;>|x9OQVmw?r?Q-aZGdRtlj6)?Z@%j?6~U=!;-|DG?&g&kch-g=hErhHF-8Uk&~7sp2GE+*vtY5cObiT{!7R{WE)bSS>q-8W$&3sP z!H|QcN8@(>fcCkue`3)nW0JWLd{cow1-Bo7n)0m_tMwIF$zC}^S|q820%69s2r zuv(BjM6`1=OtgD4D4#+^yC(}UgU&Dj`4~yGM#aLTb2CV)b2A4>L1(dqM`y7D=ok+J z&~D1;!=S}JpbauC;4{cTOV(Mydv_r$(55~J3zWnmEKr0&SfK4i5Ekf+6A0@T17zVl z3j-*OA!48`3Soi9&>$=$MwmJeI4cg$DuJ^=`#E9TOn-XxhJexzrw1gxK>hBcVgNcL z%ijUa?>_9&9Ru4d3L2sYZPQ@^pDT0@oG?Kqav<+sH3aWm^>py)z6CbHqq`5B8lk5w zv>qtc^yr=j67uN=pEcshFW?}-FX%4u$&p{cL*o;_pudJ=w}(NezX8Z@15ofnH>-ji z0I?RdHVm{263g~km;+Glr-t>Qwlc(e&=R-fVE;QnvLWa+xtku{9Uy;sbO$?lG#&(v z>_bAJ^+1WBN4Ga5L_Ll>gS$VF1Or-q35sM$kV0}j%*a3vkM5fu%~cf)9^G9agG+@y zx&tdf`(G!6vsv>Ih3LcJScKTq?W1Dg(b>(>cSV)49N-)49TFt!1-u*_ z`33zQy1fD%JN*N?y+Ry2{X@E)5*$0-6Zi$d$J{vb3$}wYC%-@!$jy%Yg8d-+6Td(c z$km@f@*oDkfKvv@)C_(BuL_W<6(A)b=Yy4i7~M@EZ#Z_ggQ)H%(3WP$&UO&h-30QQ zV`n>v^5|{?`Oveo9YlF_H-S9r+1U=Fx|=}$b%Y$m2R-G=0d#bb2Pk_4fD#j^YKlJ$ z+U^J{KUf$*yYoSsSQtFIJ3;;jpT@(%z`$@FCFS0PwPauo4p94zdk1Ks5@c-jVUKPG zP^=msfN()QP|(I^76#DV3#9To#K7Ru{6?eukZ<<|kM4<}g4?zGplA0fk8Y7e;6ww~ zt#KH%iW;;F4>LuAYqR7=P&3fg__hZqQNC>K@(4 ze6)`tju_$JCg8-sjfX+|Vkx`F{{yWjOW(F$Dp7O%f7tW?LC@wx96r{kYYrJ7fR-sa zDi)xSa{&1%{;)@PFDTI)U-C>o3`+0twEp@6XqPG^K;g~*LBarS#Q_&3aQA>Zcc2L- zxBym$1gP!;$$*rDXgXt1vk$uH7j82sS;9GJ40QD%wIGb949-PY59;!hq8`-6B}F}G zEj%Ih$gu)iiw)`~!X1pp0J$GIYCv@zG9OJj=)43_iv}*N2c5o#3!pJT<|DfYG-HO$ zM^g?q8(kiqkE{peR?zS}Tny<77PuG^1Ee0=ybeahejX%ca3;F?P9oHU{0uVybY?5Q z@CT($(6kgxJ%}cx9#mR_)DeS0<_{+I#JCxz2DBr95qzNzBvpd)7HIuABlz+g(0mIc z11LX$RyH#-fKobW1u^6hV9>}qBLk?!0*&D?f=?3wHJBmC0Yi=m1|47nT3OBrK2Q_1 z7=)1lbjmYG7b64c00>{unS$VBgF#1OFfxGZXwc47Mh4KSC!k#)j0~W988ipY$N;KW zK}Tsag7>n5aw#JNsA~fXe@5`g253Tw5!}26?JHvhAB+uJdjd&RAipp&fV#qE`jD3l3iIj}G=ECaIwSQr>U-4R9x&_OvX z!D0<83=E(HOc@y#urM&J0gG*5VPF8A*1^c&(cK8@D;?$+03SDKe1IQx*kC89a)+EZ z*a&K4fQ}se#4peZ3b9Y1a|aLeZ*K%`8cyqEGCpt^l=T=6do&&d9U;Xpzz8aANHx9^0BD#QDET6!q>bV-91oyJe zIrav!{SV7%{=vrIvlDb6uaAmO_s!Oml}z7nx8CM&S<1k`(D)lvoR-9P`=}^DdqLek zDk|NVL5Hw`qK~25M@0k7Re^C0z+4R&*96Qp0CSsbRCE}+FYI7o`2T+=$Yg$>6R%mi zLsU$W%>&j|n*$(;@yaXlfR8t_TbG;G~n_MrNh}G z{cy2)a26;%J_73ibyyWZCk}IjLXMz>c7+T)x>rI5Fn{`V7YTTP+OD_$2U&P@TYFmn z;|CwI$G?rg*YQI04=(idy1R=Ne0o=da)YbUlZKzsr6L}^?u^G>R4PCNdmf$4j$0UCOL=sk{vQlFJiEdc zB+TCr+5_y8;+jkwx+Ku91{8wq?sjGH={^QJ>DjaUZ1>gw0-XpOKqnkHc7JbuTPHig zaVMx&@qrvj-F?lo`>f;t(18EPtiRSgfdraIx3Q=7H-7NgD*rY<&mD|rpnL-wVfxqb zGo@71qc@D%)B0MmLPH&6YN=F19aCDV2>&)F8-;RS{%r?5`4=DHZ`uz|aIyR?pquFU zw;gPLVbJ`8t4Q3nbH*dmAKY6%AZR*=Hit*$LkN;o{atsT4HzZL^adw6u8?tbw< z7?h$ttiP9Jc=Y-+d0L+<4s)@tQK_i)Z?M-d_44=+K1QTg^l4Q^Z)<tU$0p_dg~a$$>ewgC`W)Aa~_@6uX#G1C0?^1cZL=NbHFElL(aX0 zjJU?f#U2KAJ2!!IG3b7@!(bMu{s$eA$HD-r_aI`RPARAjz`_9PYeK{#;e%i$aMp1~ z(A9XL%ONX)+oKmMAv;ip}RJXjS(6XGORqUQ zcZ00)=+yS;-3{`kNAGHox4?Pd7j$ZAsRVzk3)q1yD!$#vyC;Lycc1?+0Lp%#gF`*L zkz_!b94sS>&;vQVy8A3d%O7wFb=sx-88mtJf|jE(fXiLbafLqJ?>u_lnLT#Gat^2< zRBf=YN%&Q0c9BmXqNHdUwn|i33MQJgS{Ppiw!tKp9UvsZcpoT{LQVP z>m)z{-U2!cbeq0I!(aUpE{BG{8vLz)KubCr{%Ux1ALE~Lz@zy9lLzy0aP0Ym-1+~w zWA_#9^FH0jLCRfvEC0LjyZ-d(?FJa8Pq`Z>Sob!>@Z<( zu-7ZK@_>kWbf5F;7SVv6FAbg1;@`%?;qm{Vl?&JZQUQ(BTJayWFDu)A0<2E}8o5ZE|SDFF)qrsjYD|3i;+_UT;>@*^}oxO9TmJ6M#cB=EPG zfaj-NHGH}mVE*CX#$xF4|Cpndi^2a=Zja`F9Hnnwf*O9F-L9b93cAm_baO!6^os#> z4D4o*dv}3~1kY|a1CQ>rzTIvbF5Miy-3(B5p#1EUT%(c!s^Azv26^?`>;?5se7jvW zyn0Rkg4iJccJo;HcC#2j^?};SATvRkgaKqKx{}grk8W23$L{Ms-L4v-G7fAjsFZ6x zP#TXSch05TgT=Sofy42C80e&MN06-XCAdZp4&QDE0jO3LWJ!=t9^Y;U38+r?*Bs!p zzB`>IK*Lf6pus56Fdk@z2~^(IGQ!HDVtA><%M23(l}~7mm;{e*Ck4=`ad(w~@mo+E zrqe|w05mz|;nV#JbZ)$ZtMPw_jx{QvvCRKL7M|U%3?A0U`I|wf5c6;2@c4hgv(uHK z;b$~|>jZFi1yyGjzTKq^uEqykji0!5wy1!LR^xA-IVvVT-RFI*zwwQ<#h@FwgZq_ zwK%h34_GS$e`_ANwF3$T52)8c^`Y|%A+@n5ghc6 z)+hMetU%Y&^m;IQFrV`5^ko25g$^Dd?;C?8z8zpJ5qIqM`0vqup}~fc!G+)DAk2}j zAXT8rLC}=_OGoWohRzTb1F$IQBv+sA502euTw9-%h&R7vFVgf}7weP!{h-Oy<^#;0{|_`j_~X%hNWg{p1l0Y$)`w~~f?WtpTA(DO;o5y1 zIzR8Y2h=imJotdc@&7@`<^wz+c?HMb5EaN7TeI;I7f=2rtkmbO_O2{G}-7mm`yq>*ojG%lB)&on+CA^Rz=!RS~ycX-iZ&Ze~s;m>Hg$nVwO?0NJ$bn3tZD%8*&?mRXUS5|CMvoWT&9my%kPlbM$qkYAh$ z+AEC^3CYMz&dy6ME@p5G2KBia-175Ez=j4SX6BW^g}{tp@MY%VnJFb1V0BJT`4wP> zZ(>PNW(9+5UUGg)W?njjb4FrOa7j^SUV1S@aavwUF@vgNK(KB|QE4j3Adnpl!6k`# zDTzfXa80fi1*t_PaIR;tzfWRGW}YEj1fk3e|>pthwnQP$EnR~*eGxvpKZzzvT=UPzF=hB%Q0M2!uoo%4J?P9qWq=CQn95Vxh z&a4U&`c)m<_ECK?h~yCN>w^*4|sHk?(j%H?!kNr zR3~YG$_oP!OQEwD6alYwT`Y2sl!}3sK|99~(?MYgQ3LXmIA~;~_JB{f>kiOFu7XSV zc~7YFPH@zNEaY$f0J>VGVP7H>1A|rxk4xuXkR2~?fsUGYHE^*6Ck4mOHqhi5xIw}1 zasrw_9GmxnyICIHt)QNgXJ;E|{e(w%D`+^(v$G8}?d8$k3Mz&@JKI3jnn$;*g=c3Q zsL$rn?V8}(*#?@O^nJtMrw8f_buLi> zjq*S{#lGE7K~u|Zpl*7aQ>TcAXLlQ@$L-t6!s5~G`opu^hQ$MP%LHh_jBEEikS|=i zPr0_<=I=WQUPrVI2;20H`qN;CmLVsK9%Oy$%Am32n(uxj?iYgBe-482X2?YhM4+V9zr`>-|s%` z$nSgHrTd5V%^J>LZ$?PK{6Fm3e3Z$v`3Q$~>>K``kN^Jv_vwZNk*o3BZr2lzoo%4; z4%g0oZ$J^<*$0YmQ27kXras+}tm)AWYF%$p0S%^kbnj6C4WD^{t_lN{EUgDh*gSfD zFZ{pY(cKDKD*_r`;q>V31w}eo5R^wif*@rUU=h$L21o>?43tyvLaXv zR7ikM)n;J;9gq)U=`u1fKvm46EQ`N8uG0xZMnDkUZqTbDC1 zFgWf2^G)eghe(6FSPo#)!lT>Rqx+wy^|xYg$UQa$wyKE|%F6{HFRZ70z00Qk%6JXUZ1}eH1OxqTh0i&-J#R?e=yVvc2HrXt^Kao^?&mZ5&rh4 zpdK4&I1m(F9=)I=UqDwSxqybX#6g3CM*Q2DEZ9o5K^MFo2VVonFAo}xWAONYz{Ns` zsr0*#^?_3O1q!VPO87jQj~jSe|Ebyg5_EKYcQ{Y;FYZ!4kM7H!-RJ*@3v@e6yp91~ z4fv9&L;|!3khS?IQwjSH&?<-5JUePYBgw2gK%H1m=HsBN4HZC5cF^<+>_WRTytZK!huQ6aT;e|GS+fK&t}-Ji9?_ z1G61GyNf-L)&|BO_GVyU0G$lU0-jF+4cM`OFLZ#6L~RFM`3_FSprJa57^pQ4(J_gU zf#ES&mQkLELB2$cK|V#4LEc1!LH?4&2eAht7laN7fTq5{mnVRFyC4jzP9Y~XLs%dZ zbeA7910x?31D_EWXp$FvfdNQ02y-)l7W;#Smmw^Wj<;Yj@M+>D>EZa98lLCq!hYQ6XGI>N|5=Wb5#*1bAxn%6r;KUq8elu#9WY> zpv~~6@(-0bj^xuH9pK$^flhqwl0D>HZo^FKrvmUI0Q*o+`&dV@+(m=4ekBt!>< z1=1mip#wB43ezD4_5&z1AS{p$&?PR+42%+73=%0^3=$!n3=$?B3=&2nAA}wVfTmCx zK%3`bCdk4~fUrO&$YR(D+8z(n0h(ilxDvtw=}?B~U}0onfo{|Q&A-BQfM$&$Iv^~N z4o!#-5e^2C6b=TF5OxL;6E+4BBZvz@!xJ#wpqXZfZU_scTOXoZhKE5WMVLV*M2JDg zM1VnN5U*n;T-t=xs^g0Mik ztiiezmDm`Rp7=6|m-sWVq<}Rtz;uH02Shzc1i}KXDuL((iGgkn#Ak;i#10u22AMBD z3>+q5V6$PmK)C~ADymHoT_9DUkq~_5gKqtSp6h?aj{#W+$cGTKQEh?f0GX==N^VfY zAu2%v5Ee+cFU0K(3@GNJs)48m*#I#YWM&XZ2_AEU;pQTTAV?F$G?3j87RX#kSb)rg zoy7?<8X}LX2Q)K)D3w5FgH)obf#?I73yDLJnV_wsAeA5tkw?`N4|cDl92*0F3NHh{ z2@eB*5#-(wP;LUn+(U5Q1L+4XQaf z)Rizezc#v+m6piExjuT%hCkC5D7;y_ok343b)Wl=+imNUt^fF4&+d0U?tA&uDchyr z8+13z`*B8Ax=BuX%lgi6>aJ&Vt6xbedr!akZAlbY@80Rps#~^eUCBQQJ7fRlslaEN zzV9!>&em6NJtFGELQc$~E2iz`%q-V3w0t$C>My?X+R+%J3q9LkaF%YtraRN8 z=5})w&p0if&@$C?eR|9)zx`Qe!KtMO_DeccY{>XJi#hPgH#znwJ-6r5-oG?+(&jSu zbqcr|Z+LCs&@#u1d(ZP4!~3&#?B4(Df4u3Z%@I5F7kuM*+8$wM^F&R`&DuingYQ;> zk6Ai1HZW{TI5J`4+CYX-pA!A>;P)jFP0N1<%wq4V5Iie3KB_VVukT5V5HFFN?L^xBVr z?K=Bqr>|ql|LwS(Yg+n-%fgnIetfFCcj0l2WY$9Atxg9Pew*=IzCb``p<3suHxfMG z^JEvxYpK|Ye?4o;a=feS=GOEFKf{W8?jL(M$>4bG!fkE)Zh7xRpEB!c%Eeyb8wGdb2^Y zxad{c>vk{Q@Gy(~pf^naRdNq`!1$ZXnjXjM_B?CK3krC!{hGw;4+V$2W~(W}t>h1~y@_ne7a)+`)ZugtZ@K1tbVeM_h34b@qbv?SX58{VFO?31%!)9Bdp zqc3hB7j{>X59;3M^uK0y>zsYY6VHn*|Fvo7yt9usH7=??q9zjdt$F!rsU@LX&fHvS z=vkZ@z~$sIbEEtb&6kFUb2D0}%PiRY@t|keOvhw#Lr}*HoM-8JcLCBdAE4n*W=7CK zN1*amYayuT2Wv>e3KVAWS=4$+xH43#pB14CbRIs)F6cb~NTC7Rc*e{KY8iq;?#IF1DhOSmT}mKb zoETvUIxK^k5!4z4+0`Jmxh0{KDY%AK6@2pm(kSF0)#Hm{SP3!xH0Sk z#Vs=0|07yg4EuV13$(Hbq!D@#0Ma2apw!3A2s)k#v~F?# zf*8;OMUYYk1_n^q7{mmtLAl>R5LENS?`^o1aB&&JE>JHCq)QO&FAxi~dI@9(2&3LL z0ZQqJTP)PqYQ8|21G?%Jq+1AV4syyA2HOq_TaY}*=a4ppF4$cY!Wg^Lcz<@Yu9<;s-)KZ4{6r`h{ zkpaAB6e5CrPXg#fG-gInY6PjH@h5axO1O-YRHKFhUpXwg-?JR9&ER(I98#f^?zYDfNQ3G$C&1_!MTu zkFX20_6wv7qy}Ur0|RK(4>XPliVIXXgZqwfH$RfB;zpP=6QY>`qy|+N_{4hn%`MY! z-Cl>#1={cgvK^!bRTpT_6e1n|jT37|=z0XT3#0~B7ic9f;-q=hn^OKkb%E5N>H?ow z55FJdm$mO_gk3VwVhN-MH7-DBv@tV++Vr40fGb$>Ga}7{c5;IJr38r!q%s`bn`Q*H z<3VX!>~RNDeGv$?OBq9#3OFx=+U_7F-+XP;5O$@2gcukYR4{abPB>#`1hv;e_2~WZ zhs6k8RZv~3U|k@$b}=)6S2=^?of+jO8BiI^43Br){hziX!UuLA1xO8QsH%hA3D!in{EE=E6>2+34XQ5CYI4L~C1QJzxFK|1g6aaPLDdBwae$W+$5w5(L+JVl)df<6 zs!I#Sg*IFH8xgvMK|#jAzyMN%sta^R86*#a{Pkat6Dcxh|t9j8VYA%U;wE>)dkvvfUqm-;IayYE_J9bkQ!87pc)$yU*8zr-XnCmL3M%D zpy~qcszlh;8DbTI(3J_*1yX~m3v>n+qPAjM6QzmJ)dAH7QiG}sw4(xHS4Hl}0EDhp zP+cH3sJcLV(-HpCj#z&Vq3a}67f21NE>PPHQLb`Nzb=l@^#-a7qy|+NXr~7=JRPpN zSucpt#Q|+BfYhMs0-s?IFZu7S3;&DIWeL>;SMJ5*d!RFV%G_yIW_d_NC}@d;`>DY!0a3=wS%5mO8i zXAF@j43RVpkzx#y77USz7$OTWMAl%4?8Xo|jv;a%Lj)A#;J|=~1{-J?3@ii+XAnaI zL&Oj&;sCEb9iSqJkoSd(*u&LCLq!m3vM@v{F+@5rMCM|MY{U>bgdzgEy9u6rz&_1Q z%`HwX0r?JuK|V#kVF|R+1#%k(NcQ}`xVg-r&JT#ga0_ZOSPjZe4xmW^NQnfha(C=n zsf*C{0jdkE2IbZW&>2XG)`hZ5^eGm&U96xkF9QPuSPhC@pxtE%yNraoL=n2Ap}N3o zQ0xMo@q@V8#+b!V5uwWfstc?J#V$8+I|1Cc1>Jd8nQ4yDH@1lu?w`d8{w~$yH@T(=qiQk0;@r>%MH@1lu?uwZI;vfq@Gx|O>H@1lu`3A0U#jeY^$4m9tOms{&}mPQv;nf~-H(&Y5W0Rsb%E8O*p-4}*G&hZ zR)j7AkP{df7{F>!>`Ddeg7nZC7%ts$oQ=?>4%G!#gJKtGM-?IrH&2+n5TVNsstc?J z#jbP|yG~45d<3B@6silX2E{JWK5m3vg{++05V~@py1;5s>;lh$f^Uxmg`w@$WsV44 z%}`xnH7Isvfn5la2I+dM5k3#0YZgeDfq?<62E{JWSUsdX1Px5C@?E$^37+ORLUn=F zpx6a!Y9su0K|i?{q3b+U7g!C7U7*lX@8Wg)g``!?CmEPRA z0ilZ>I)ngLgJKtW4i|iDAIPrDy+6%V;C3lOb%E8O*ahlSAne+*Ebu8pmpxP$SPhC@ zpdGmgfBk#^+ZH@++6~^{9U}<91uJA?JYs}*;|5~fvVim!PU{<)8F085k)!3 z2`CDQx!ud$-OI_*$J@^Vv{As`)Wis40yv^mL9t$vT9lTUoC@=fnY*92lZU&9iv#2+ z0Elu>*rh;XJUJ(^818vrx03_-gaH&e{CBij_H=UIE@d4$w^{5SyW%H}mpv zclPvf@o<1_H9?WIa0_s8c5`?2aDZ(l%@CSvP8+>01iV8D-7cXBgHy=L- z$Zi!BNnZy~A7>XQ5BC7*&2!*QEGSC+9Q*@(`~v)a9FVuRpeS*2c5rs~^!4-!aCN}g z@`9?;#lhRj)7i_##}}azz7+;VshOLnr=Pozi>m`L?>F(};wDShl1Xm|t zU!MR!Pp|_(`*BdDeH?uJoSprhot(h(kZn3BDlA;R96dbUoxL1j+iXyzeH~oAJ>A@$ ze0&^`_Vl1AF?I9u_xAO2^KbwsJQO)6X9rI&FCTv|Cw~Wf6=yel6=$b_V0%mCjX=OwN`D7u zFCQm&Uq5$nK*4tzp(rx-b@BA_@o;r?0Pj75$hn2Y`xm679w#8+?Yu6HHDyx2z)aixCH~f&J9fvdi5Jz6ciW?=t?1ikc-v~Rj{hX z5QeBW!mb)a7|9u+6bNbiAUOj`5M3!Wr6M~TtQszkt^tzLG1S9^(Un6y4?b%h>>04( z5J4oR@brV>baWZ4n!wFLB>y5bL1d6LL0g09af%`gRSv3HL5(kP;|bE*gW7>j22B&F z?F4O3qG>{wLDGbjH;^`m61fnhah?h=oAMyw1B`>h!m zK7!@~p<7e1na9e+z%bj9fnfn?ZUnr%3VO#`NoqxjN-k)80OSn@&=6>m3j@PR&};}E zdqIOrccE&)8gbmM20EbbEfMNK;m`=0OMw}N!@LG228I?_1_l<;tOj&T5jOvVHi;H_ zFfbT{<}tv>)3=9mQWhUV8L(3naMUgwoVIcycvE8`|8o548ggVeD z<_#j$fo9&HV5q~qn+{YCy~a?7c{d%%eZPrN2Z~>|3Wz^pBsTwo7J=|#Q-_vbK>n4f zU|`UIss*ho1cx)4x`hl33^q_TFnhu3(BcD>4(_6<1K(wXrVbQ-kBLwRGVc`;>OlVZ zfT7L-4#dIpArpbUV=JWzRXAF2l8LfrYB6;vp|6yb0mXwxBYBLjm?6GR~>{b2L2 z4GRN9PZI;fi8hEjP zggQ{XSrefSw7k=o2z8)vNx)EtJzUZ;)M17TDE}8=sKYc5RGyY$sKYc56dx@_r~}Q- z_Y$dYIuYtX_AVqs9VlO~B2wK}BGiG>%K;+Pfy#q3M5qJB$6X9{nDGHp_m~KEApgF^ zP=^_Bp!oPgq`H4Zr~}pe9FvhUFF5~Vw^xD)b)fiFB0?R=AKFBy1DR(^ggQ|C+7Y1+ zWS$oh>OkdbFortJ_yws8Cqf;l9E!$JhZ)YGbdW)WI*>n#iBJbhe>E8DF#Q1vza|WI znC=7B3w=bW1GRUj5upxLudXIi-7X^3fx`JD5$ZtpUL!&sDEyvcsKX3DPR(WK#Y2QTkUwNG)M5Gq6u-(C>M;EQ>bGlSsKYc5WUm1c z>Ok>fhM^AAUQqsU#ikCuox{Mu5HN*-VF^?%Xj}x`PDE4ph=qaS5J=rjNI-+q4>omD zObiTavltj0=0Mbe@(VU~piK%p<}ffQf{q7gU|<0G3!6I7Vz=#!7#R3L_XyzWPlGm) zN-kz#U;-UCkEb6W&cwiAvXp_L8+1Mra=Q-Azn}x8ZZBtG*a+H-iG0^KnmW*ivhPqe z5FcZ2--FI&5?RT>a0GPE0Um#Vj^a57RfEsG-OLOO6IU@X_<*i#V_;yw70#e5GLNid zV2IfWF%6W?u!S?|oYWZ`85mqZXItZO-wZ|u2ER=V49_-0%md{=Z03Ouqj1>5z#t7e z7aQ3;w7X_O`A8M224W)ayIgg*GB8*|)q>I~xP6ai9%zGT_*MpnY;<+tp?R1Mknrl< z%D^xcT^*Wvpn8AvRtAQ{=<2YT_i!r%!&`K9Sj^*w?f->32kZ|l=1Fg3U{Hsu#pPd6 zyt_ixK#gO-WnSPm28LLuT3qIVwjWk+V_=vKRR>yxhReLA+ZY%&Le=3i546bf{5A%L z=jiIN_?LA%1A`#wWGZNX8f-6?@YCPUz+jKA4vTrQ+Zh-#(bb`u2TFhKP&I_YuYWrO z!)&NpeE!|Joq^#Zx;iZGd%vB5;WxTEH1~nhpX3e(22Id`$H?J=#XR>N3=F~O>d?#s zrI$je8bbc9-NC@n2~~^BzaaCLL)8#6Z}ScYhW${rxXc4BEWW#gf#D~*IxPMb-^swB z47zdzIb6{E3n~vBcQP=9qN~GVUhz%_hI({$Xy$?9WA07{hPCMGu$XsxCj-NEbahzF z`?`~Xfpr%o^x)xw#XRL*3=I0{>advS3snO#5qEhSyNiJ#6RH+&FPeFv@N0*vA!Od{ zT?`D%p=xoN2PzMa?qXoLi>?lfe}C^{U|*51Rw zU=CG>%RG>OL-#N+d@Q= z3cvXM3=H|`>ah5?cRvHeOmuZ<=7I9ZcBmRc{yo2+f#Eh(EiV6p-1ifzhLCxj2N)Pc zL1!c*hYOnfK=EOGfPujsT^$zxrXFBmC`4C>#k~Fl3=E6W)nPI3-~k4Pv*_y3%md}$ z*9RCF*g+HI$o{}$p6Wpc219gpXy$>!&;K9;Lp-`VEauf7WMJq-SBJ&CT5V91B6!&lx{9%5i< zg{p(wi)J1uy(~V&z_1-%9TxXpJ;cE95M3Rbc_8=wKg7Tw4(hlPh+osg3=EFw>d?#s zxi9`O14A*oIxOy+c$k4wIw242wB7SMh?uKHK}Cd^cPir=|M85q{0 ztHWa6>7xt`*U{CXnFmVGUym{{@E(JN9=`l0evE-Z8LAGie~&RRgrcj%;=bZz3=H+? z>d@Q=>YvX&#=x)_T^$zlZXaV{c#f_P%{)-}u^wk&5CvT&Par)TA7@~&M^}f%yx8Lm z47up)u(+@LI0M6UbaiOvf%@lLp=uy8f;&C$Jzod^|tS!0;QY4qyDTo?u`Q z1l>x294=_?1Em-J6ATRQ=<2ZeH}wPqLm|34H1k09W&a5VhSlimu$Xu91OvlWbaiOv zf#Ub`2?hpc=;?9raKU1p;z| zq3ZC($H|in3|FD*;Ql}}4^)4AKFPqq4!VC2Io`0iPxTZ7gCV*)Eav&2Vqi!{SBJ&C z##0Ooz3A%D%mc;8>Qf91yV2EQG4JLn28O5T>adu{e42ql7k!KhfQlV<$_M({w3cqHk8bapvpJ8B_4ONTF zJW%o}8hs!)r_%%Y+Ky1bxAH8Q87-mA%;xZ2ue%qmH2$^^OECa)Bs9Id+fy$SkP&I_i z<2}c~AbAd=3ZHrAP&E*hxc%#Wj)5T@suq`dApe%0V_@h-SBE8ktUkxUupM0;T6zZM zx2xwE7@nf5!(txuc?Jf4&@Cy*AAouB>XJBxJs>7FF{LeEmL_^i#@-Ha;Ri0;H zn2D|qi~F{pXJ9ytt`5z8Apbr*&%p2zT^$zl_%ARpNQ15^Bj8`l3k(c_P<8nH8-0O+ zAswm?mw!R)pIa|5FswvZhsAxzFEB7%MpuW$zaK9!Fff8{vO)F-7W3pUGB9YPt3xvn zadvCeUX7-I=VVE^FZ;j^&$hqQFL`!%zJ#1f#E&6IyCb@>5umk1A{8) z-aZ2T8U0HP4AxL}_~Ik-5(7gmx;iZGn|+CaVL7@wH1~o0d-M_m!&P*3Sj_u;iGkri zx;ixTKDkK+3=h%OVKMLjWd;Ur&;?z{=@iX8Q21$HVPLRCSBJ&C@GA@q$>{2^nAdoPfng%L zIxOa`zrw(<8(kfmc^nK33^$=_ATffwynlFwf#EGwEw1Zd@Q=s(%}= zGcYWKs>7FFR$pge*bY^P%Y7jKUWKZG_yl))`FNdy;V)DzF7rU`NommKTrk7H>oyG> z^sx9>{RRVrF;p!s^FZ+%c!Pl<6P z3o>(3L1+FjI0Sn%zfth$cC-LpZQX3aP!i+O%?P^^ud_zQz@xhZbS}9^_YMZ|o%fy` z;HyeOw;L*YwEi!V@#qHMNhjjbed7NmkT91=x3`5yH|PHV0mu!dAX6aYQlMM7qYs15 zWe431!~)(fH664?jsbdeV2O%AxJUCF1CS%SZ+dipf;k1ZE5t#r5Q4gb3*w6IAFr8= z|9f+KRZk8WlV z$L{|H5M}Ps&F|CeqGI6DJ5dC5YhZWh33pp z#G|uy0~<)-);>@X=h*$D)5wK?+c9{scY`7y5`^7gHcY0o8MFq^r~83NH!MkXHiIwQ z?f&7>dZ3h}H;n5g=T@kc)xA)%b0vGlxrOHj7W^78TI`MHh?J zpk0zBY|STFI-NOuELT5ZVqhp?=il{$qtltgqkA&w5>KCA&{9tZkIrBTpU!Lr(5;G* z9^Ks_w|KOkEK%g&#@KS8M9hVM8+#yeMxo@H zjc&;!$A%vYC2WojKXgl3J^mkheZ{rqKteZ@fsuisgsrof$EEw6Pd8YdZ|i}QSkLaW(4dFj^$5E* z6?|(dhez{I*3vhx^*p=J`an|SF3_6Dv^4m&t}ykEU=6$;)~8C}I5wYTa_RKuap}y~ z@afDp;NRa|2M*^57ykX-O-u|7{M(%~TspmDT)HQ>fNoK5JoNuR1B2tiUjiBztT#KB)oj@l=?4;_3V&wPP@|Dm+b;5_StwVY|L+6O_}^3q&7g9|($x6Ar; zZw93>(4DCTplg90z&B1dgW}iK_<&1ij*5jx_hsMiFbS8A92EnQ5)F^;W)ILcuAMF_ z3XcDUKzAoUV_;x#?Ec%`4B9={+4_VPlmVJGz^YnbKzIfa-UkQ|a-VeT4+!rEL~a5b zC|!PFVqkFSC_U%c{k5}o1{(u|OGoY*7t7V4^jepS6#hQFJ}LnqcLjj5dqnqjus1*n zjsbM>G3d7X3Xkp%P{-Dz+cN-^3i-ihONdGYD3ARQ;OKVU(E7iG#rjwsQ}>7e$E|mR zEU8)M+3h9)HVmZX9N5HzKLpY`oeTK4JLfreUrpECy%?RBqV3%m3nmhOStrw{R7+4 zeWCS035U&M{#MY&v+i!tWym`~8=ulTT~tyWyRSNGpDXbM5r!Z_($V@{X$r_BS0@+8 zG?&g2l{AlTe~#BSATh&|#GEv!ki=_EkdTu2%vJa7hKF4p8+cY-T%wM!NB0rcmz}&I>tN3#K*-R2Hl6T znFX||8gvRk47i*JosK&n%mSSm3c7cWg#mPS;5@JxXon4?+y&k92N46^rM(3#3%VsH z3Cz06$iM))XO4y84Gu>a%KjG9bmDa%nS_Ez^qsn1_sa#Oe_pv z;4E=g28KgmS&!C}{4Kv385p3|_e5}#?7r#IS)yWK{LQ1Y29y(af+`YF$tLR2eIDZR z&dnf|otr_a)&qL|wnyh?P!96wKJU>z8PpDgDD9s7fB}>-&UjuSU zXR(AwXR!jPfnoq^0Yo1*VPIgG1x^m2!x=zFMzb)0jzWNlfi|Q=SfJbqVS#o>Ls+2Y zxeyj;&=upsl0sMzGrB4xoEY7!G@M`lxV#3K46Y9Rr%#Kyo1#-@R)AR&KHd94^|@!ay9cN#9O~2U=K!k6 z6nwhfEIhiy4E_s1jRn;;r8dxJ04SM&D|ZWs;?5Ek2ap;617OO*;t(N@?kQj=`*hc+ z1T_3&Dh+Yz_TzAD{>fJ61+vDmp@Na6*xr$Un*)m@|27ZSgAX~lPk^}0a26AUWqq<# z+^74nNB1>Y*6h9jbzkeH(hPn9XBJ0(L9n;^_dBz7x<~NucjoGJkLh;iVFfji4*n46 zbWiAZ7C`V)x}8N>85$TEz%{meR=2YR5;w=iGTEYpui2l&!J~6NC}KRj@4!MF8W%p@ zC7=ev9u;uz=-#3Nx^A1?=!cr=(R?JqF(x+pFzA4NNPY!Xe-IX^`h&1K85kHqJ7-uJ zKo`cX24^wQrONBUtl5kV44@0@KzLcG=D1V*R6*t=nZc$7@ZOZkOFWuGT;5KzxDMlHDP@ z1suE2YlrOS&_3a!eE^&tm|b>rICirAKW1I3QMADWl!ib>ivy?__5gLkP+bB#ZfG*t zql~N!4A8SzpyL6cLIree1(b_};sD(T#lXM-x@sMVl2PFS3;|HX7~FYAasz1a8^#62 zGK>wP(ba?0f-p!9gbAq!_3TMe4;pwQMLlQ;gphjVR12ytL4#Kyw}UV?_alpeZr4KQ zBeOyJLE(dJKIDchkPHM9QV*)pk@cgi2g!jj#54$r%tu!b@*A=|NC!v^M1wHMy&xKf zL2}6IL3|K~$s@~w#6WV$Vxav%ATf{}2qVjZ_#ioCG0?sOkQhh~gpuVye2^RngV-Pp zIv@*~k4-(Y80ge-Qq+SkvmvA&w3!m*77zvvT!ZWbZG;A;I}jTr4#Oa`kky0I8%PZo z0|Ns{9K?pH1<~m0A-7F2Fo4Vl=^>;Zv=JAi2Ba3WxfsL-nG3_{=7Y}e0jYtd8xR|& z7DS_~2c6#oQbVkI(7JPwdJqPg2cto35Jop2)EWb+0fj5*3?L92qz;DB)z5++Mh8+~ z3uVL9f@qL>&GpivT#dqDLDsH+bO511T?2B`<7a}XOFrnP$HumIUl z$UUU0r?vYBoB8PB0}4}OFeu!6!1)c-0sw9IXJi1CwICiN1E^L7ov_8o06HHMbjSoF z1L!^_&@>z)1E|adm9LBppgUkdCNYBBx}dv#85uw|2bru*I zK%EoNZLEw8pzaE!bpRTs0;Net2GEHEpxd4p89)aMfNoV{WB}EWVPKbn%0|#!3?l<* zbuj3zKSl=7aH$1Y7S#C#o$|@Z02-G99mL1T0BXa7Zu??n0Co03=Vvl9fJUD{x2Q2P zfCfQ9!zPU2);4Hvhmk>ok%0kp<|HG70wV(h=(ZY01`S5YtuTxX28;|0ppzFF89-wM zphM6Y!MC@9Zr);K@BsC9!EOm)WMBZD1qU43v=pG(-Zror4iP{s%fIlaZkS zG}sT;QNhT-06JHXk)eT+fdN!&FfxG3I#3^ikpVRJ04l8+!QCy;IgE@9pm``z>Ceaj z>P>?V++<_`^{_$rgfoK26G8FB$Z&y?fdRC-m=RpqfW~?m89*appp{^Z44{MIKx=In z8743>F!Y1na)60}0kjT*kpVPJ2ntt51_fpY2GHRLj0^$H3=H?c>Kd3C7#@OI8<-gw zo`6{om>C$JgINMB3=FTpEC&__hPPl=0Sf~-CKwq&H==@W<7Q;Iz{0@r4J->f4HPu= z#K>U4%E0gkESA8^!0;c;n!w7yzyvPM53n*Yu!32j;dxLjGBPNzF)(n0#RAwE82G@f z1~vu;PE0<#?085m^2tO9lhaJ(}zfbKq228&%_ zXJAkRvp};;nqZaz2Lpo+n3cf6zyLbDj*(#k2Lpo%qv- zz{$Yi2o{^b$-n>_b7o}Nz{$Yi0v0>K$-poVY{vsm1_pPq*auDq22lQDWDwwDU;qu+ zF)}D{F))CJ0vQ<`xEL6G!Ri9I7#Nm-^*RKDrVPUz!?8>jwy11iXJGK@-lHPG!NB0s z{m7$xCuju6qx+_7_Xo#s2L(zbTw4$Dx1=zFrdZB-cKSz7lXR>}G^bE;xh+hlM+aLS~JB`~c4ygZ%8#4Ql*AXN^Jm$fvuK!?F8@PxmXZ z|2?`tdUm%%l0$`rtF^m8k%VV=JJ{3B6#)#TTsuH5zn7pxYeAE>KiENOP2vR>-IeW8lH56 zj12P&fDHhPIPeR)3wU(KD;#s@VSM=vH01fcBoF5?i7`j*4w45uB}f>L|nU%bYJ#_4yrT8 zIk+&U`8a+%##qAMP@@vSP*U7bqY}vA(e1jxrF$7D1-o>w13B2EJA$Kx-J`ko0Yj;= z3;+HCCfC+)b(;M04Bgz0-B%!v@@8@DzS_wQ<~aU8*XhjS(HqU-+WM{jR=1x6T$!H_ zNEyPZ9=%g9fTFt>oC(0XUAkLALfupEfM%&%Z-A1N_5qhpH;Ya;gYHAxtykC>7@BKT zA{aW|Ogh7CN_e`%d^~#n44}GGR6;;A(it9|ZJ-R??V?i9*#>F~z;blA2e=qhhE7pu zfF@-A2XGi4fa-v#e$D(poWrsEh)*{p&w!?6LHXXJyBAb~AQf7m62>v!F*ZIfIu^Y4 z22yB&>QP9c1sYd{^v*uP3oX#}8DzdxjR{tenZQ~3a8@mx^^l2yVLNz)_B|5=!xS(J zG{ppAsWUS$fRF5EC}W1nHp5wS;jGng)2sRHv)hBCThO^P2eS1B@F7)knknreq`r^?WB+$*+>GTFPee$B) zr}0mx*9Xt$SB#~Xx^q+vx{tkP0nwlm6;y<=GchpqhBAWc0?>Kt2OqJ53Q`46=)AN~ z_lIs56$Ow=(ENF~i;9V3ryGlBubYBL=NuJKDdXAcCg9Pz2V849cIr8HmT`D?mPxd} z3$1a^wa$hx<-ay-hqK%z6IQ2^6d5#@a%R``Qg#Y!tdGb zCg9l3qjK<}K&Oud2ZZaR!UEw7fYf%oSPC$^SaQtNK6LR%r;8;INYQZ@3yJ^#|Nn=w zMIh`r0T1T;KHbcqg*^El-RHpJhqNAt^M5J7NApki($~kGMM^T#%U^qXbRTo%-^Rn> z@&ACMl@AkG!4EdDf{c=s^4A*B>d&+L1USb+y$1DH>w!}CI+ch`F5J9fXV|<+7kEEyQ4902K^V!2?#m7#SE&fU_VYv|Gc%z`?}808tmi#K5ozEDI_aKrJ5@ zhLcRN_77+Z2{H@a{mY~KCfIMS2TH}ey*auM^6&b<&%f&>f9rpKmlMVZI=#Uw2f;J) z@rOZ!E_=b|f~KStKr`76$Qcp5l&=$%3q89(fabGKma_Ibvb~OU>2_oRqnrx3hJ-B z@Vh@UzTJ9>zXi0Y0Mwucl|sJVFF@({6A=YqUhyoW|!`duB|64>|9&FRdPA< zZ)5IuY5()u&@=g%M=wt+sDSWHKIqcTV%RNW>7p&t=AzBg=Gc8oTcjNv1FzY;S^8fy zb+dy!-RUyN;QwLkTl`J7;Ov$I3Y;zATm#Ajpdk=YJ09%k?lmf)U;q_-2C!BID1(4P zto1;tlw-FqQmS)peF9E)j-9?79^F1F1xWb?6hoj2)G-E}4k59t!pOh?syJB~3KZm2c}eP!e!sdkH!T%d@)=oSb_@R1{ph-B`dAvp$_QDv(x|qxFmKqoBm? zYW%+y6hobJR6wEQ+5H!kfg&8c@B4J7sCc+^{{R)?3f&)kwVxt7Ufm)#p1pm@MG&~q zVTTky?-)z(`gEtLc!1_=BS2vaGTO!ZZ?U*z_i;z<_n-xpHjt=g{tN1+f|dw?*8tb3 z1b{-<03N!a>F_wm*jS`|1G>r_l5gfSFfc&M5YR9NEM!3|Zy{L+WG!kbP_P#?MC;l8 z!TPFC_e*}aSFLYL)IjS+6uSRW9duZ?!Dl! zhUYXra8Em&#rhSfUjj-tF5Qn@_}!jD@)~HQ29}|a79$douUxuA<|u%2)S%5*kSv9g zby^RUN;r0ha&({K-}RB7f7dI1aF)5~*cr+Js`o(Q1BzPYj01`vP{xUmi$(4(gO)x( z+LoZv6-Xv3foGzni0*PQXsiUhihd?2YJ5Pez&C<2wMXl1{uXoa&_}R_NB23<@&<=) zZBQog0Hx~ypUx7M2$$|+7H~|v8b9&rOx9@r%UH(a(OYd`e4y9&|7VZY9^I2cBYd!B zA0FM4K|_-s-RFEd7lS0gnmxLqOWHu9AbGH;Pv>G#53}`ciK<6$GiYoRyaZ?g$jd&R z3O=0+z+$})93IUt8B3pfbWaB7SLm7^pU%Y~u21J;P%FT-^;?OPM{hNUXZJhMa(lQU zb&uY94$tOyjHNF;dUu0HFi@pkI?{i5^wvv&n*vWfyQhPK3FaN>@|7A;KFv{a@aZi0#2aDoc6_1c8~uDT2Gd~ZM{?? z0UnS=Y{s`eyMMO6<@b2)(_8$%`Ijz#yBTP` zZt@{$v$q>`2?zs&2lJ`_4?$%wgGcLs{uUt)1_tZb{7qaO3=I6++CX!Ejvb6Ie}e{^ znt!nHH-7{T^&Q>~Dt*Bk9~8CU^19#_Hh@$iSqK_n2DvZ;pM{`Ne2^8+AkA%{ zg;OA&DVPV!@F1Q#m0GdVs1;ZE65JC4e&|rjT_dQrz z_4t3d!A6Rq^!xwA;2=521__d5pr!1f^aoiZ`*Ir_0|O%9K%-J1e}IOny4`F*ZkURq zpdD&VJ!tr$4YcAJq^1yLs5O|&-<$$=Pa9|s#IyUJWA_PWRIxeO1)v!wkP9@y_Dlm!DS5PB z0*$UgdVwCGv3DM@xeTv)U98(c8u*)kv4B>Rwt?oNP{ZXR3nW}_vcSRxG;{Ux@xTB7 zcY|gY!GX62s%Q%fXgf$7XhlF8$Pr6e7#I+$ra@KpK~#axMFy*?1E~U)JYcgx6F{JJ zlL1n-&CLarE@Pl<7wZH3&HfhT_kyZ)f|v(7YZ&BoV+0p$yfVm5@GudDYT`w>9<;d_Z2V6~R^0%1x3*@sG@xkMWEgc$PJ*St&Yt=I2-KVeln{I(_D%kF(2hOmd zAr^!Z(3zefLqHn___wq1|CL3sJH(4|354*mvC9XE@JEU z({SwM1T7b~XuS>U20DNmS00Z1F84q+NsJ13+{Q8PFuy#ghd(5-69WUoCh(>u&@PaZ zj0_CS44WAl7$74#&P*`YWH?Kd873CV%)kIj#w-joI2agCf%VSeU|={6W`U-$&wyD= zI2ahtf>|p#7#Ki1H<%gLa4;}{Zu4Yj*ucR6USz<`u!Vzx;UZYw4h{x}OJLR>4hDwH zU>0aH9F)hH8IEu;Fo1@1nHf%SFfd#L%bww2V7Lxufu_nqtzBk@D;x|AH^E{zI2agi zfmwGr7#Qw=Sr0fE818{tPdFGD?t@t`I2af}`_Pyf-f%E5JOqn@Cfpx^SzkC97(khx znc)Wq1H)~w*dGoChPz-EXno-mFpGtgf#E5b#lgwI0Gjb)X5isuV0aD|6X0ZE0PR^} zW)R_IV0Zx*li*}vcm-z3a56A}3K(Yar2ZSQm3sQ?pGE<8gvQvxlGV{_Ia!YecGIetki%U|AiWxj0+h<>bvJ7bXTsC;r6|@v+ z4tN9++{!n;?c06Rvs2Qg`;td@;|kCgtJVW08IA`Z3Al1!@ac9i=ytI1IQW3Yx7Xu? z5Az9M>x1R)kX-HAeb7_;fXBffEFLpGv=4b)`~gzu$$X$&;NT+x?f@1?>r0>^6ORu* z{LUvmnhyv#T3_TtIQc#M|Av6H*ogU9%QW2ZOEVek%m zhVazP^o$aQ@XVBw3GQIRUMu^5_O{+wT#es? zCOJS>dvu?6?R6FSA6x;7vDO2XJjb0O@dXGPiwbC*0VHMsifGUn0w}>~v>xE^ z11*DcHU972%Tn*S1KdpLg{%Yd=;b-+(ai`-X$l^l%%Fk)0FQ1*4iC`Qd1sJ=K?CkK z-8m`>y{`Y8e=zg6gO){ghp4EybRUKFD_lTpQ21Lxo1T5Tw}YJ1?W3Xq8hSE#%>!au zpXF}_Rr}EH<1ae0AX^(Dq4v$Wd3j(~meg0^G z26z4+^X)BTaqM*A`(s_AqEK_er8`AM161EyIQ~E4`TscBzu;uU-y`t<|9{Z*vIE#W z7ZneXX)c}F5}^4YP)LEs>Odh1N=2X$2BjiUn1fOgDDXh32pp}jsg1@Xpm=wTjgLOu z=`8Vj`*CLpP-=X=4#qeO8pwtWii5^KK#|JA0BRS)25iGX3!W~33Mr&@E-fmM^(^4= zJWxbfcy!-74qBlEYT$SO1dU-hz+x>#CBdWn^#5RR*0%s6u31ZqcuO8`hul^GQFpnwAH(sdR9txyR7WiQaO z5ChN@DQLMDG`YDN|97#hQL*6f1MNTtjhturXg~Dn%~474(SGUCyAzb^K~ak|AneuM zq8|X7t?2bpF#*L&?-Ui#pp9pDiw#KJaR+GaCnDv!bo;27IQBaJZ~h_7-wry>$)nkx zfxi`WuBWT<0nlJJc#EEfEAvUv&?oG)4aeR9$Y>|1RPs?VXg$f_3Yu>6NDfgkF@D<- z{==h}Wr9biJ4frKI)CGDKD}F@?qCC14l2!K{K1+l+y!AFNjnLN>HF7 zOwf8+Nb1`P+E&TPz`())>IuvQvjX9hj}F10i34y_1P>e|CR$olK;uFlkXd|CQdIEh zzGeK@qx&PMU@-9LKJC)|*9BgXDYPD_UZ-P0*VHZSw5Z0pz;B1V`sJiXdWA6rAueE#7l$!|NnP7OT5(h|NlQ?+88uY3CZW6 zHItCM51IV(038l+)7AJSbQbKy|A36nX3)|r(CBmY;pVPAObiT+;9*M%P;OTU_h^2D zHmhsl(ftWri#qNE6*}N^V9q)A1~UH-%V_?=#@_>4f7|V&qSJk|^<*W}_uHU}0Z=+< z{0&;cRFd0$c_(OJF*rkmisbIgX`SvFFs@4XWl+Tr<7$ApDlo1Am!gY)@fgU;x#5o$a7LdAEy-MrV5lM9cs* z@6=zw#K3Uymq6$A3ec$_?Vuj~Yxd)A;Gz|jT`b@;WZf|;37{TU24sF2be}FHxq~jW zpUMbI?xhS23=kG*!3Bf`s^%dqPy-3V0$u3_VS&c(A<+h^IXQwu!=YP413bD{f(mAz z?vFm*RRSKM!TVePgDgC{tv#*(7YV}>cJq+{&>qqF*yzLj+xUAOFEsz);%@?-Mbz*! zn!g2fiHAq8yP&7_@nQqV9iZuZ==d_M@&wKMJ05QXbt%AIeIx@tdfoY<8bO&Gw?=T4 zj;c`zsu7ezaccypB_xf|-0XoQ1WJ(}Mh85)ixogKN)A4tGf;ebSA&Y~ju!A_YQxXy zQhCQcptk2RhzO%cuREhl=MwPDvqvZMYk6?l=>bs$TKWoVep(;tKHk{(IHwOW98Tzz~s>jX>+@DE(VP=foeVtQ0oQO zWbJ`Wtamnotm=lS1(i{t&KkHTf(U{2K@11$cI*v+o@CVxHv!}@BojbgV~=iE2A}R@ zj@?&44h8Km2TgT=%x?!3k=@^1Tc6a)O>o=^>ihUWj;ZOs=GlGL@qcK*|6`8UUuqsh zg3qJd*wgwue=}(9H~%&yve!-hJhv{G$H{%sr$KW)l+`L`YPj9^MmXoEn{M!zBbf0d1VbJ`8t4Qd7utRgT1OtC7=wgVMQJ@tTpsMtA_ly6* zplsw}{k^0fru{XWN4K?O_dAbXcP3EEjcc&iFO77u-U3cRwf-LekAo`bPV4`{4iIk^ z=Yvcy&D8$xYW<~F&863m(Wm=(_f=@XbUI749w_zp>~_`gNWSXP&2r%w3mb#u|6?yN z{QLjEFvlX%{ z+ov0J3=mQt0d0WP^*fCK`$@ABqcSCA-E(lFD0=k#WgQEKLyl*cC7$) zso`ADV1J*)lFU3qxCo?-124S>t+H_N>D~w`<2<^5`gCV0cyylv)uo`BTaRu?S;y>Q z?JQ7i)?g7`Y6wna4q(y(bif!$hO@yUmcIp5SR=|q2gf)^&>G9b;0Vi6u>iH8l3#SL z0q3ID1CVmzpV53XxiKWP%7)$&F0bD4eBKLb|3A&`X98=7;GMBjKrgx8&o{?Ii1cn=Whm$^YU-wY<_9b{F95n z88o*BR^Z{$eY*PtIQR3e&g@RW@KRS)c)gJ1^QXa5Eh{G*>y1}6eT4N~S*nQ2n`z&;k zvSarjC}_P-SfWfxiiqMZnPoF22Cw0l+sncajjI2XK}p)P z`?_cMSx{VqtpVBbTGFNa98{5S_mS?a5S1V`tp`fwJ-WFa{~z;!2M4HMS@2Tp-~a#M zNCmanRY09#d1%6YEe7>+DKE5E>I5GH1}Y{DK3{DH1>{jX}2uu`qxVDMT!UiGcw$7t6xX#{@ePV>Nuh^(*{< zis^@C4$mVi(1CP*ri^6A|L8u$0; zKIqX2TDUUasCde!Gxvf=cLOMZJvv=C7#-+vUE|uS1-~Ujj>kH6`6KI~w#WG!jzqOQ^fx*RcIcR2~G|8ts_dst1 zn@6|n22d`$?Ad+JqnqKsK&R^hQ08$1nTe1)k1VGJm2>P3QDO1zKI+li5316Um9T@A zoOkVh^FQ3equcj_N4LC(^-ccfm*8%3>IsitXJ*eGj0_Cmiqc~jyrQ%|SR4ec4>|d_ z9rWN|e5gneS{GVED#!!H2K?KYZBj}_8>$&oOZgkBnbJx*U0dJsw}MU~u}LizXsBk) zE9GjaW=i32(E*n*=l_R0KpbN3Vf~T688oN>36?k}28IS}eg0O^K(0rxGn0q)L4NS5 zgdW|lJ3Rg$_UWz{@aR6T{n?|t0aSu`bUOribhwlR+-lANkuryYW1_eGmBbx-M{p9nIPOp&OE#KxI(yrh0Ur z2ge~ic{Zi~{r}&!^=*l(OXqq}K5?-~UBcf2Y6*Zs722Tp>1Kd0RdnLt#-il;|A@1d zi^Bg>ThHb{9Hp;c^Z8h&J}BjYlwj@>9^Jkl5dEn+D&R!acmz}`fI2abv5-^hJiFZu zJbJf-@)BrZ_?$~O$Nw-$%$Dx->~=E%H7pr?yWK!b&Rn`Ve7hOo@-uysQ&;Q)^<==N zfHp_DYk2j_fSN-LF5NuLe!V83RwaXfHwzm~7k_I!cwlHfD2R7~>QK*aR|5}_W>*c6 zCRD{n;ITb71IO+wKHY8_o}i=+as*QP<40F=)}`Bn#kbpm1Jr5;M+JZDtAC&|LN^2B zOK@X6IDESu1dt3mhNcE&4v%lQg9OMNPyw~{-~azF7ykn-$cKlTZ@0UK@ulOgFS@@! zna&qbQUo0%BE z`=?nLK&J^o>NHjOq+c#G>&h!I~F+mPJ2G2c$4jO>;%0LGVKv)6rHKL$dNCD(#7Wic8ji4U9@ok^(S3cc| z3Lf1*J7ZJ|EM|h5#{4ayg9u@jk4yKD&iSAW0-plug=~ufZQS^R0=@n;PJPD#`=wKzs&vr|39ehW(*#QxDK-g zp-vuT?sSm3poV>cXE)^d)9w(J0*_AcPA-t`pgpmmDTB`aAeEqb0WAJ?wv>(o*SaI;USp_-|pl&7JZIkl9np_(PRM8)I(VGrwD zMVG);8EBntMfV}lk>ALbtVi=427J0dfCkSbeY%hC0&V4i z9p&m{{h^%2=;Ujrjf@`F_xPJ7|Ns9FY6L5k2-t9z@U)yPVX@&YVX@&VzyJSVt9f*T z-S2ArADXy)I`@N2ap~L-GW1wGXuyThqc@njb3G`fd01cLZw86+Z{vmx%@&FDI?iwY z!B)i6>$t!92OEF$bkNGAZQhJfc>$*J-b~wj)BgG{~urg>pOx~gBGZQGtDs;Muyiy9^H`LZ{3$&ps@l;$c{S- zZ-V;6U|Glip$g65e8s}w)D5oEAx1DLcyvQp4vYvU6N1UC0JQ+(RB(th9|R>1k4}FM zk52xVj(`9Ew`O2qSP33ok7rj&)fFW`QQ-KnsRh7(i3!%fVuxqe>x7f?!6N z4$y*Ghz?NOaTQqIRVD_8!(i51I4hJH*164QVPF8Qkb|s^SAdkUpqUW`&u&K!-|inC z-Jg8BPe3PCZvGbl_f$7e0L_|024Gw|7lTrT2Y4F;B$+G*r3%pc2|m!y1_lO(G?&iB zpkmpjV=*Y5fRkRQi%I~f6fDuQVd8HEoihQ_!37$0h8T>Zioex~k%0l+PDT^g0(HJX z=P!UpgA+Wu&pGmMf8*Hw2du0+L?r@RylJ2m>0+R{wg^~B3sMFu%zuCibI?YHgw7C^ z08p6ERN_pwYp!r;Izjj1E3*BSJ!S2mhN+|ttU&YKurdu!Gi9C9?b{XJ$hLj94$-^l<@pN=xBYi=%q*Z zq1XHf^P0iVYCTZm<D(P@Nxeh-L0TF^5|>^Z3p(~ZUv31^6>XLfR3W-T%rQ% z0KI@hQ`7ArghO(cMV(5L$yKj@U)<{zM&0h~HbK({4;Cc!*AMOZw#T_t?GO;~(E zXW)R2By#DV4O)8R0*dw9{C%51&g!-$p?M9MUHuPAM@=#;}6V>PX{nuVX#B!R~>Jbe~Ie>*Rqs&9_s8g?}3hm&gBukee*{Jeq%U zl)ix&^I9H4J6it-ZJYKz?$Z6k`ezMiuRkLseEuKzY(C25*?fekF68-JlhmpjAhpQ0{C7jk9)*^bkrw-=OBz=EK<5F`jv76BFk zZIl6tfRusC9G~Eg}P_X0Wn` z+NTU2ouxNQ1w6V#;ROK!*OsE0W^)j3Csf3 z)BC|JP+<;Qh|IzOTAmIO1MMyWow&vVKD`XW0xjkR4V|$t2s6XR9za84pa5WD02PD~ z78fh**m+4-*a(IpoaGK@fjWKQ?fV9xMKS^4qlrLOB&eqc_Gr^1-#}R zGzQPY;M0A_voo5*vol-5v$I$s9DIHPXo9Etje$?MmxZhGTc7SA2hZ*oKHW(MKHVQ( zJF^8mdmU3ftq<|H-vD*w`L{VHyYg>yOz}MUfWwFTfG_hw&)x>m5IR^5cmoRmHjgq# z{%sDWX$K#2q;a1}YyK(3-vr*8$iJ-tw5Q#Xf7=ew3635IpL2L{|8V5r)&QF5L*jzY z350SznSXj(|Kx80^$0wAjYe`-DrUuZ2@D52z8x z;K6*_)A|&DJLrS~SI~7NVxZa1UT09Wcy>BpaO@2g@a#V0+nEj7ng&`9o#D~_!K2gF z0JO%r6}0TN+ttFidmm^P5pMVV_PdIj;_3Ug`1haS-{#EZ(R`Q%dG>#B>(h@Q< z;nIBoWT$KEfl`C+Pz&hUD<0jx&_zU$^y{LM(R!ei|Fx=P_tDo1$6ZuFORE?>xes7NCMT0W>LD02<<|0F^oLw0Ia4wvaLsbd1A9aQO z9)I%@P?sYv`mh)S0|TV1U=QyMr!X)uKspkjR0fd+4Jtq`D**ZQ2so5LJJCQpZ9$!j zgAW9_9a*}$4n7p%_F}OBJEg*RxBRO2w{?ia{fI`D30wr)q3PNu`44Q!=C-HtrWATF5Z z=yYNMi8Gh#c00;2JBl#FWo5uj4rWJ*PA8UbM*(K2yhNuH$Kh^A9cD)rm=MT7W=9id zN1IM2u#60|qXt;J1+yauv!e}$Ar@fe1~4g(Zbt=XsF51XjtJRKCm!$`OaV~BlmMkk z1rN}bEyyLTf-7jL+Dl*N2R@xlppv#TNx-A~luKupgh%%+2cvJW6@q{Gn=P0b7(DmE z=94`^%@a^hZ9#*5YN@wJuREKk^^p?QVh8?h{;Z%?SD;yDPyWTn;IqtXkXh#A#j=h& zKvh4qxr$gg$lr1WG-Yg`3^tDoVIC(z^FRkWV==DiLFxMwikW&_WuJ8J*f5-QXsW zM|Va5c$FD5XkAP*XlEJ!Hu$VKXrUE&T?=SQjYl$QO$}%<4Jhk^nk3r4JpP~eu>Q{9 z3rg4Uxp4S;8qnAPs2B}+3F-rRS|2GEY51vI%J0zft%R$gp0S3%CHw#X{|!I&`CCEz zB_V6tj_@~wwodr;mNSB#Y7F--=&+)0ZAa~Q;4Ky+{OzEj9Un_&{$|k1Igf5zP=m#z z7j)h*WcNL2XvdX*n_b!j7c2Wx4bV=E;|D;a3KKm3A84>)XDI#dV|}2M-vhJ=22!82 z9w^c9=&m#HXg+4((fYsi7}x`dM2SeKuk*UQL6O#du=xSw{{yXV8YP#%9b_sI#z-!u zyTOL|facQAdO$k^;B|K;%WM{v+8uWWT@}IbdL~#Ik`2&BMW6sJ6?HKB2968Rl0Z-E zKm1L1{`~*n?JNN*ZX!TB;fsF3WiWV-`Y`C87TD5xP)nZS^#xGg0yX|wz(+iT)*rBd z4*~|YI9R|(GDE~baTW$HkU=}wA!5^*7#NO$7vao>vp}Phkb+wtw8t5&19W&FXe5S( z!H$`M0hEj&qmxKQ25kMXfk!v^tQJ?}|32N|y&aC-FF=cEK7!^K0z6u8m+FD~3<0}9 zJ!V)7!lV0!izVnfqgK!fpDvv{K)ptf&Nk3U257H0=<2I(W>7N(blw4I@S@iRG#clk zqT$kg-V-#^S)&3P$AGkcJvy5~lebVKLAe05Ya+k}GzI3OqTyvV2>H#$g@K_@N(*hb8fNDu&1l^el-k%WwUJ~ol%VUq^G}z{hX3%;D`2T=McgtZ=Kh~r9fQ3hA%VjXTyX7?41XhsOL84$@cgtyzNuYgx zATbcz#rk;J#!lqtovp!nFb=*Y-w2_|Sb#-SpOSg6F|B|Ba zVwTo#CD}ff)f%O#pdbcC4JhnD<4Z35>(5~c17{6z0F;`7M#UMdf0gO@^g0`W2RmS6 z9Uk4z8os>_9Nnk>AL3ts&ZC#7!?V-lhxPTMr`@2q?~Vc8&6J}8&n5<-MqT`2&|Y28 z;1mn^aAr_EvM_)O76=P;;5CE=n%aY~%$XP%AS_Tjfdf&4h15iO=0cvzW_E&>;PB_LL?mqnbA!yA% zBo~8R4RJ7Nn!o_GcjcQ$_e43y3kb^9y1)fdq87k44%v<{y+3=JP0~6 z2b7x~d_bG?y3hHxUgB>7bz&U5xqN$@K18B4hbmJs5_*nWs;GM=jj0_B*MQqIA z1M2^S#Xy}65t&ceJ`ybK1z`yuDztaV9^8J6O z=)wdB&+GDX?W z+ED`ucL)n)CaAV%W>A!8VUT~qz{qjsA4n4eOcyA`A!H1| z7#JY(AfG~5AoD>hf)Qa4(g9M9ss^GOWEaF-keNoHegjA;4s$_EQkfYT`Is2^jJUul z4CHU91_qEDAwGq$KrS%?hn^x23ju1q zxCX)k*#z1Yz|6qN&BDOFiTwa;01G&bK)1_7H8Fs08iDA7ut2&%hs!WCCOp>iut0u==me=c2(y5J0jnLL!C7Voa8Cci1vVF^1LOjT ziJ%aIut4@fbbwTafMyJ!=0oH`;R|7bbccb%3Y624U4p6xq8ela#9WY>wn%XRkw?`7 zIusWXw;;1YjzCod(FZaY5*8pc8wi-21a>c^1Yu|3H(_JoH-eNPAs`E&7_{yR5>pTs z$fuz3GG+!w8x95=P}vj04bu66^8q_(cN>E8-yY9ps;|jKxTmk>Ji}u(g9M5ss^GOWEaF- zkeQ%32B`#Lh&-yEDzLj5rMMWRN;ny$QaBi-Lf9FkOxPHtjKn}EDKLNprG z_#DClxeOE|%nXb&JPa}^{0uT7d<-%sJPa~H5+B4Kh+GglAOJ3jL7SIACV=opa9Ij+ z2ZRMOr48&3NhNj$0mdH;oFCX9upVG8fYfx5QWz9oh*DS-Dc$P8OLhngWL^*0JVgN( z27wetMvf5BhC~Jim@ZHlLDYic1HuBC577lu1zH#Yaw`Z!TYLHzJb3tZ;4zU5L1Yw9gsvgk9GBbmuCI^EABO@c{2lflB1uO~7229}k=m9$e zxFkk|18Bq%WEKd679~Pr2f_lma~>odIG7kXo`4$qkh_IIszI_4bs!f)SfJ2==m41u z>Mw#+f-poLj^q#JZ81T%vo$m}BwjL14bvJiEsWs|>W{_f3H4xPxbD?3u z!obiBQUX$n!`y9P_c97_FbJ6NG6)!pA!z0j5=#&k$W@?07HA3n1Y|D*155`< z7NQO$4q<^}38Dj}3UsRw)L{$|d5}{fERgO)V3&bPaF8mH4iJs12BI2d1H@dAnV_~2 zNF@kET4|72!RRAOULdJ@kdekFl{<47U{ zvQCg&A+83MM-UdMH2~2GGT#F!R3Y*p0SF7^!ed~q8Wchhb3taNfs{ZU z50M86Kv*DiL9T@49OO_$RRd8CG8YmiATw8hl;AP<6WqNZMIf_5G)NP~G?3j87RX#k zJc7*3L~74M+-hd2+Vu(D*oe&mCHw!bkpC-b> zAW|a6z+oZ>HXEi3)l`TskP9HXK&n7XETP6TK;%))=Yp6Ia{Cog24o!|+aWqoZGq?j znQMvE+JdM=H5;@x1Cl0?%|%rM(Fd{tVlK$ctpv;!gSeRi63!sAK|aJ~E+i~KX6_|m zt_<8<~y#`p9q$CRiR|+o! zR}rMo3hGvXLJN^PLGz1HV;De7a3SVESRixsz~+G4|0bXwF#`ik2S^s84rC&P1xlR| z9UxVpK^=T%n?THlDgo&LF+m{)F%8uQh`As$K|}B$l^_gJiK@p6Y_6mXD+4d12m{*( zmJ3Yab~Xd}Mn{kv5&nm@c0p#@!P|Ne7RY|k8YgINU;^n$z;u9QA?iT>hp<3qLv(;t zMS={4Vu(D*oe&mCH)zi(GlQZs2ZQnx0S4(3K?dOzAqI{RVFqN~pd1O&11hT_EExs{ z28eEu9iS0Rs5J}_c~pCRz~KR^rIF1=RRhrn@(ILTkeQ80?O=#Js-7UYxggs?W`k%{ zH4uFub0OgZG81$!5lAHnL*!BQfR2!5Mj4M%0V#!I(2bXnR0?5%LNX5Q5^!qY#P)#Y z0;DX)Ozki?f{X&)p$Rbu!UCC-0yYQS)B3`}z*+*@wt(8xf~W<>GlT_-9f&TF*-0RS zp%@|$@)?8$GCvDqz62YC#1T#gffQ~A4iiCeY{PV-nheniig$=kkSfpuMyM4G5P4KP z3LthcK->+|0aA^s2BHrXD-d%*X1)a}gJOt0svgiiQjqc(qzL3&5RIw^q7P&)BuqeN zvLK}*h&-yE8nAmM;Qx5FH>@patY0b3quQ64mTJh}jGbDCVN7f#?I-05KP2Cg_+-keMJ1kw?`t1#T`# z1<02m8dVKMAIMxtSb)p~ul)ciWnf@{$fN3+1vZzFlZAoPi1h<=0wlh)pgKSlXjLR6 zb|5TJ7%c$nQWWE05PQPSAb5m}fv1F%fi(mq$G`y74T^Dy9#Gncus~%VL^ntk=x_;; z9Uu&m2e}Ty0+|Im)EbdmK{`MxQPn_HgM1A!7i4BKQfh_Bqv}}$c0VHvBLfTQyjlhZ z2GGa{$ZQY>-S`XfF@yzj$tH*n@aPQ_1FH$df<};XCTWg@P6Qa zz=mV_{~3))qm`gs?znf>ymUGeBA|91L7Rkah^@K3|wF zP&$L?g0MikE`VLaD8a=bk;2O$5yHbDVZzNI5hU_K=mBKR2Q-!eGXXTI2{8e}0-10P zVnP`^LsAJkCJtaACSZhjl}ALs%f)cObe!<8>vR416Kn417jhA2=Sc zfv$;W0Ntko(+#>%2%;Op0_lDP)(x&jjv&VCV7fr*4WbrQ_CQ#m^bXMlQUyB93!nL* zMcIh74blNp4N9jF(?D*3ut0V}%mtYVy7d^O5(FUfsCqyL$}=-a%7fZXVhn5#SPnq) zGz0jCYmjRZ@g4;-1d2g>W*}hzVS()b0to{J4hDrUA`B8Gq6`8lvJ4y{pj^zr0MiZf zH$)F8RY6!F6%gGZRiHcxwFW%FjBd{_h&@mxARQnk$X^iCKyHDsKw$wjmyv-1v{4nL z5`-c0sCqyXUd#-Va;ywIj6Mvk7ZBrxpxIE=umIgy4KfFWL8tOT+z4TT>}O*E_rlz{ z7~H>jFjzhDWRN=I#UPa8&A<@?%JB>gFcUzb0MQ2u1qcgtk2%BykSfrb9Uyx^7$OgH zH-rVU3$%zBkv2d&Kq^tyKvaXm17a@7OirX;2t*!L59mSykhxq83|~AL7@l}CFdXq> zU`X+1U?9m4AbZ3K*d+l8FOb6-5MhJr9*7$eegK&Xnva5NVt~k_>X8GRD=Ev$z|9!N zz)}FKvltja>)27_G#O?P1LP)ZNSuNeH&>@F~euGL2d@AL{$UP2Qn8D79cZ0S0{i}f-poLRgWLoy~uO+$n6l& z{pXO_fv`Z~69Ulzp8w`z;5Xrf&wqoK?||$9VbEeTh)xI#q%#VvQ&J8zbI!}aZ^FaC zUj&)=0*yC-ViS=@KsU&P%mHE091+AU2n%FZ0@y4@0X7DKNjx989&i+}2e5%UY7C&o zDCpB*%(Bxurml8;b34*0WB|Ofa?Ug1fm|4t{^N>?t|zA znGcFLkoh1Ckq3n;gaxuA2jRLRo(EhPz_ayW*A;@aKrv{AHNMlyhUrjW3Put4F_1vZmWk%vJsg_l7w zgoi=VgquOpNcMyD1IY{G2Sh4k0I34a$w5qJV1USj!V1Cy>7E02 z5oFB+7dUkz>q0dZq6-w;5M3a%D`18*U^jme#C*`U$Pz9FWV1oGLrg@q1!6YHT+os} znDG#msBQ<1nj_K=$ZU{mR5cKNAR8cI0x}bHu?(;OI>wWmqwAfYua0biNC3bw3>sITi2_&$&2Ni9d8nyM6`35<;lZRFZ)e9)kdOV47 zkM|Y(+JCL6S~qi!rYwe9qqHy=0Dm5ArO;*-g&e&e3`T|rc}=61T{U%r`9 zA|CgIFX|c0x2-#Ub7N@utm0qijhBS!sLYwHsuj(<*->!eOxummOItiR7#!9+PP12t ziE1mpyk&Zjw{pvc5B%y34Sf zb+O3vC%Z3xTN1_9yLbAtxz(?vl)a}LFP?YM{==cIf+=6cT!Pp5J*#fnu5~5%oS4#Y=gGNo7J62U$nM-I>&a82(2$ZH>!;8{c-!Q za^39MjaQC)oQ=Pfy5+IdsLe{blL39|7BS z_RCIR$CCfsaXHtt^bMDVEiYXh zNx4~D2!8P0D)2E&XT}DGO$kRPOk5k-u=LuF)#Xo@Mg6&d>wEL(B@Z2{riwehwSN%8 zk>L6{!}NIf*+fegizJtmImUORHy?d@s-izBW6Acim$kc96_WRM{(sFk)pnlHQQO4< zb(x}R@k_US^?(a3}n4R7vZQLs2*!}cqmqpH5w_LePMn}@uJY6pMea~Mmhd*1rj;s{xbSSIU z{L6DJ%_@gKtbEPsj7y9&I|7Xzh38ITp2c&yv)brc{8Fj!Y#9$6TpQG5rj{CnuF}5b z9DV3tQqumF3zBPmxi%dz^Rg|}+k9`kXZ$u3Ll z@{PNgQPH6B;pyxNQEYE!$fuk>XS;ZwN%vE2`2q{k#5)Uuo~ro#mbuJYUfpDVii7DS zuaxpfFA2~8VSBd(_KO|xndX}|bK>?LE7f<$JQtchamJj3LO*%-AHA~kMn;Kln0P|3 zLD$y6kbsT0E=>o&|Cu75Dlg^u;#6L2>i7I3d~4L^zGr&f?xhQ2G$F_TN@&R#O}6!V1xiCW*iD!a_}qr#6IW>uf}pkpQ5%PE`8 z?@f^1eXO+c`o0jgk_SJ-ihAxJd$%xZ>a`PpSfBn}-pr82Tdz0O`}*G~<{ro7v;2Ac zb3XMQo4(mjfcx`aOV=0`pUYS7t!55c`m*kk+KxYtFVc)B^!`d{KBS$Zy>Zb;cg42- zm+Tkxs2p5a$F$^JJj)WF{gO`7Q#UU=y+zsXY0y9GZ>zQbU#eZ(!Z=N(-=X!!3q`Rh zM^3F)lr|P+=TAO=;R;vh;&huguk_ZvbYd1a-WoIIuC7`0?5vLr?+V&=r|2!PpYwKd z!|w|*sl3T78`Ew}HEesF?r|hH?}WUsZw1fpHPXFbZf}&uZt~Fz%`v*Y;%@W}QdAz1QEBXj<}eb-UtGHqNVJo}b=q6q~R; zxR*7VQ`$Ad?at1U^=v(AmV0geoERHh_e@Z+ZoKsR^JU!?;$mCgswAg%E2+0W$d}+s z_S)1s;h_FE|K#>#6S#|ne@@poyj@l}Kg99ztUH2_yR5t)J~yxtJs%J-`Kk3v-vg)2 z3JYy@B=_}duPof>v_#ISOusv4>g$d5c@E!Y%wGzH$Ir0+`jpwAMOlGq|3(d!@AD-1 z&9Vi)?NF-|H;9coX1P-3g8#}$w~ygfck;^PxSd|<1jOw8xlirlvaf=d`TA#0YMiLT zt`+Q<|6cdz(pkH<{Lf*^eaGts7{{~yyU*;jn|}JQp;zq0YMG2avla71uTSR)c=0|h)q%O< z@W-#F``)*2{`zaj1P+ICsE5B*{?OFH4;`I;y zq6p*WX-~N7Jap=_tY!Dr?$z{LefpHy(OE9A^rgS}9jExGJ3+2O7G@K!f8Q7MhUvdb z?jeu*Q|EsD{a81-j74hERiEZXtUQ~(9QK@8eeRr$NSL{*kmYw;2;rw)1dh(fK zEmGVOwH%f|A9r)-GPp66NN}~@b-n)qo*tjq{MY%BuX*wO)I}eDeeMbtIAoLSo;k@* zVb-eVKPp`I2dzq~Ykyo{_D}K3I<;Q;Eim&X&xnYgUhVAIv*}A6Q{>SbjK6KBKVxV- zE8fla^yX_vd*-sdIZGZX99hD4^Lo?i*{f#PpV8g?d}?XB(2*q^`Hy9P9NwE`bzG3k z-TtFhNy^=>@<}^?y>T<0)bJ|0=ttiUp)6~j^RI3B&rCgdwSjZdsh5w7#FmS!kej4% zd6sg4FiS+`^VoXDo&{pM9qAu5KF|AFdr-fvV2c@GQUQ=YFHuI3d>Kb zJJ-ZAAKR?6=Ci5R$DRBh3H9>N5B$qL zeH}JC3x8>Mvd2GCzTcRGXE)E?GY%PwUn`lSQ`|?QLWEo@BIS<)oY6y)vzq<#c85KN^^^Pi<4kwC>|S zS%NC!4DTO{Oa3E~d(!v&>(GS17b6#+)(crX&v@c_k>$TO`EeQ+SHv9dnEH0cTGuI>?)yXe-~Q44w?Xyv(wP#x z3?)xXQZ{cs|8xBX^~rm;_RTX=I4AU)$D{MaXRZS;s%)Q&ZO)v|*BZYpMSl9Nj#?>6E{0w!osaaOc^~2ktJJ_LKj>l{FdbeWm~VoV0zs)>n{*aN(DoZ<28XoN#1cINg9(fb4Gis zbd_L`2x!ocnGrO958@%PUP)?2iAruBNCebnV`c=cjEwDVP*ua;s@E)wKn$xLKkSR9Aq0S zhFzepDKjHzy*tQc{U$Xpgf2ah76t|eHVj>$5dmgKRwf1pQ3eKvhdhl62wk8R3?Pl{ z7`i~cGG<25+HsHz*Em>6Aar?vv@kF*aA4>HjfpTbf_k1HCGVd36e4uN#>Y7^bb)5N znHfPBUxIYi$i&`8=mH&j1rp`L&;?o%!psPYHITfXllCNpE?8pX#?S@o0Wvd!*7kz* zXRz)?3i&ROK@1EGJQ%t_TYs4uL2C>_smW(2L~6k%Xs*#GT%3BrZvp}GVxbb-KagS>betzhmneoV&>B5vM$mc>P%K#+A09ucUo|nNpDL|95plKV1N`nc%5V}Ce=7H=I$FK`jUNJL*W*tGXyzK*nG0Z`szOjU7#HZAYIa6 zT_6@{W)^fbDJadOmZG5931&u+pFrwvC0tyFFb8x|Do9iYZVu?8QP2rb5OY9s9~c=J zK+CKkBFHWT?cri(1P`M!FfgdE)qH_488jaR(k%-%8CjPc*k7Pr50dBj9MXo+B?~GL z85kJkFm!>gzh!0wmC_(xi?pYlMCbzT;sJ@uW9S0S$1sBqIRr^FEKa=JiO>Z)77Qe; zfT0UiOE5En=HWr>5La35n}g654|Sm;SQkh?XqN?OQzj&QKqBo-3=E(3v9 z8^;kMpf%+IjL>q7K@X{91C6mUGlFs%$gGDqneH+`Qy2pSXr(ns6r_d;MHhJA3nQq^ z0Lkw&56nX7dJT0mNDZnkP<~`)1eMz$UHb3vr} zE=e0Hgs$08T_826x-`Ldf#L|{FCztaNrW!&wP_3t3?MbAbqZ(=3M33c!Q3%jAqtUN z?nCX;0;d+_T%ZlM3p4`+va3F4p9n%1==4R9s5V3wQrZBG1|xDoPcnZy!i7Jfc7fEO z`b!sV7c9PPw(>V3bcuoraRvqkkQ!87pjHpUE|wg_^9Wr=P+cH3sJg)WAmAx#qebX( zgf7tB7RX;9HK<_-DnpnVL38(@9G>?-r3Vojg;2W;AfbU&FB^jW1)3cOd7Xc+<`IOh z4yZ0e3|&TGU7$HskdhBK^m7opmV$&B7#NH&bb(HiV`c=+-hu4mye5uRSMGu8GRDva zI$#u1@`L=H$P-zMu_X7o7pUDV`@8QSA`DkTb=hEq2IznlW=3cbGe~ZB zJc+PtD^wRq4XO*lD`eriu5Jq}Lg+dV)df<6>O#>ei zLXf|IvqCOD2bF2eDD{N{*ry;fKSgGLBQ4XQ5CAs&d3 zS29gNiZ5%ZE|3~jUEuYR@V3^*-`mp=c11yTfz+Vt@&<H?`j)dkvmiAcS_TOHORbV)+99Y_tTu0XI0K_xNB zUl)(P*oM$$4b=rwgQ^R()(p}D0qI)McqIp+D;BB?qy|+NXz+%a5mp-4PG5x7Vr+ow z0;xgO1=Kgo?y5wU_ZhxSal6jgQ^R(;}+4Y-KiS03ZY9Ln#DnCP<4UUxgy$ro3@IS zBXs#db%E5N>dFH93)W(Eyr44&p{oe03#0~BS2kD|ES5RWRplde&4B6xsX^5R8s9^> zaKW5YJqTTUpt?Y6P<7>k?Shqu9QW5ON9cM4)df<6stYufjwm-g_q=08==ulM1yX~m z3v`AKGb5~Ce)sAtJ3^NnG_!)#py~oGwL+xBcTcBWLFjUZ>H?`j)dgB#hNx4f-@1)d z>m@;Tfz+VtDnbd3zj0#C2)lZqxF3? z6(s`$!|VdkB^#iAJ4oOdR2N7MsxHvX1tNb%qy+>bT=)>G3#0~BR~guauyokAvo8gq z>n~InNDZp4am0*)W zJM2NmEYY1U2I)H>tEmF30qx@lIk50k;0;VQpcw#WM$lerkl*&~VuOx&Ae&PIHV0H= zg2p^GuiSw4Q;^lvg4KX_nt@yBu>{4mhq+*DaVTiP2h|IzeSql}ZfcNP4LPZd~+H-`f>p~t|$Py-hchl;eoMKqxzjc^fjs7MoB!~-hQ z4i|}linPH+GN2;OaFJrDNIhJn4Jv~0*K`z-+|=CU3{V9Kj~$Q*JmZ4XDoCUNRKO#v z$<2pMBA}5(&?$y+5hKv(XCx!U9I!4U&=_SMiU`Q)J;)-)Ad^9} zP;hgMK_j+|Oi1Q{9LNxiA_6jJF|vpW$eiOSBA_u`&@H2IlTAP)t)9$CCYyrnT7e=0 z^2Iq65s)uHJI>(dn1XB<3^X?Fg(3p7Jr6|$Wcwr(5l|RzLlFUuhu%OIF$cMj zhZV^#bC3)5P((oHB%z3a%xOUuu>hH~8$|?U&I1$?kU3IpNOoC(%&|unu>_e@i6R0r zXC8_OD8vqMs-#P&x$d%ZKYS z0*Qc58iR=FRUlSSfL81v#_$)fxcP;d0n`oy6(H-OR!(5vVS(8U|#$K&wBP8NurfK zy1;5s>;j#93K^3D=@L8lG7h1O1v=aXR)b;}XeU3yuHKxoeF$ArP+ed(D0YEX8A0p< zg_?_WbR!Eq3=N>Vz-mzJ>Ib)1L2W~j3wt&%%|+<)fa(IPL9q*T0ujW8AiEmmSl_Y2 z?TUx$0;@r>Ya)tWFQ#vFL+C1j>H@1lu?xKBiV-w>4r(zTN><*?2DhsNstc?J#V*ht zOAr@={AHdSB#F>97pe=a2E{JW+9b#tGmx&Q4SiP;x;8>}fz_bcH5J8QLN;%i5W0>- zb%E8O*af=v9THz4yKc9$EYbn@; zu=x6(B((>j%N(i;tOmudWnf*fw4qV;Y92yY08|%P4T@dM!Mb2}nY~<6j?k3})dg0A zVi#z&6Cy9aIk5N^LRS-17g!C7T`N)Sx*_E!hR`(|stc?J#V+tZSNPh?<&FMtE8uBk z3se_a4T@c>QS7q$n{yGN>kL#ESPhC@pjsbNSAx>vo3k7^( zpmfN0RA@Ou7x?&3(0xN7_n_Fd4kQ9z-wV=}J-KNULYEAvx(3}%1X6=y7ifJYA|1NS zE2u%}vV!UYt3j~~G_Hb(uSfc>atK`!P+ed(D0XcG*$(&D1?jUY2wi1RU0^jRc7bkw zgp`M%Fbv&(@lY!~45vVKfz_bcwHd{(!=E1gMd(@y)dg0AV%HY1E>KAGgL}wC0*B_`|U^OUqfmQ)R!Vr`;G;DSWAan^sm#2Z%px6aE9}nTLqkFgx zA#~|Lb%E8O*tHAnLRh&Wey>^^q01Gj3#v!s3{?I#X)s})u7k~-pvdT z!{!;yWdiUpEQjg>t3k1AFN$4`>lTI}bV2SdVqgHPL9q*TItwH(gThc>MDQ&_*CME0 zU^OUqfmR|T!f>ixXbD2sPN*)h8Wg)gYcvsdZS1yNj?i@hstc?J#V*jgYlK~kj#cU- zbUlaa0;@r>>kv3JVDVLXh3PCp*FUH(uo@J*K%=GzyJFwDX(Duqf))rfFff4Cpx6bv zW(84htabT@6oxubU0^jRc7b=5!^@5PO=X)9b~!_Jfz_bc1-irs5{96>%<<>6S`|EP zL_u|d)u7mQ92^?3bhy%;XB$FS0aO=Q4T@bSz`8)$50p0UhAmJ*=xT-P0;@r>>m*ng z%r1>hybTClbD+AwYEbL~U9*k|L)W#@{0Lo}p}N3oQ0zL5V%PL%uCWMRr=YsPYEbL~ z?f!<88=x?}ST}WcB|HotLUn=FpxAX5#V&rfU8V?Kf1$d-YEbMt2i65jhakJ$1C0Jv z!|jp)EgolJU;wK@u?w_jACV5%SX|kK(4`C21y+M%7wEJRNZJ6!SH+axPJ}K;s4lP? z6uUro%p&ZP&OEvRp(`A!3#S1wc+SPhC@pwR(@T@ByU^OUqT?OlcrNb?6Z%#z$S`XC)R)b;}XpRPv z4s&Ey`XO{3h3W#UL9y#Pid~ECYf})qZbNl})u7k~x>E;X*Z1a0k_cTNp}N3oQ0xNT zje!V5horz?2wm);jRg!0;CnfkQS7<}b|EMog2K?@QZq9`mn>8lSPhC@pcxs2UBRmR zgAuxnp}N3oQ0%$`whJT;Y6E0nV7p-H@QBWQ1B9*;s4lP?6ua(&b-~g`bg+djLRU9b7g!C7U7(8tAms)q4F5WP zpMlV|2&xOL2F0$2D0Yb!-;qS<+6mPKR)b>KBd{)*zkXc`+KA9~0jdkE2F0$&U|leO zZQd!m9ii(vR2Ntcid|2@x?pMJ=gjT}2wnf6y1;5s?0O2;1+!~kP3jGVE>X}{6$S;jGTBl1^*`nv*z zt|+K3uo@J*UZU8wV%E_*gswuUF0dLDyI#R{fy#N%IDjxb&38a`fz_bc^%|}Vl%lr! z^NJvJEr99*t3j~~baFJLoCoEv=~K-`MBsL9hw1{WL9q*TA}S((U37dKgV1#zstc?J z#jbZ?7sArvn|G745xSm1b%E8O*!3Q)3l?8e=E=_xy8c6Tfz_bc^#QC4mNslx?|O>R zB>~!^#J~W)@Q@kBF3_Gcguf>JYdeF`WeC*;R)b>KC$L?h#0?6=?h?QCqVO>Eg6aaR zL9q*T-!j53P#+edD;cT_tOms{(B18j_yWc96o(6%2wl}sU0^jRc6|lA5Eh1Sd#CUs zbWMfo0;@r>>l;`XXj~Lz*R}`o!3bUJp}N3oQ0)2+)&;Xm{laP%gsziNU0^jRc7ZM~ zN8~TY^ut>ax*kJyfz_bc^%KReW8P-h5W4BLKz-mzJ`Ulnp%3q*#$d>GJM;vZf9aI-s4T@c$9h0c(5TR=ZR2Ntcid~@FVi5IL z#{5fc2wfYYy1;5s>|zAnaRKkA96Mxu6`|`4R2Ntcid{@#U9dLW^SXJm2wl&iy1;5s z>|zG%f`#Fc-TL1Ux|l$QfkO*)rX}*+4QM_Ikv6n6QgRTwWTCpiYEbL~-BpVS!wvH< zT|nrvfa(IPLGc$G*oCk%3X~2Jx`Ls)z-mzJVh8Jj`OAZy{R=`@9#j`t4T@c$>q8M^ zDe1cRDiwmp^lnz1V#&ZMacL-g3pt`_n zQ0(Fc>w@{KL96IJLf3VuF0dLDyLiC5V0K-0`N5CS^$DsAtOms{Ua&5hUEw$9T}9~P zg)W-{t3k1g53CCoUpWUk`Gke9{5W1Y9y1;5s>;mnvM5M#E zQs0RPU2#xdU^OUq34&b+^H=J%smBqzDxtc-YEbMFg6jg6QRljj%$J0xjVVxFU^OUq zfo{J*_-kI>whV->RZv}EH7It0Zlz@g&$WTl#sV$=*$7?xp}N3oQ0xND=_2e>zCL{d zLf18@F0dLDyTri$g2h+Sl!q4)y52%{fz_bcB@WgF3q!|)7vCdvv4FPoGB7ZJ)u7k~ zI+qbKzkJd1D8Cdu45gvEz-mzJl0>oVVz#6`LYFC27g!C7U7)*%AfW+@uh7EGozif- z{GhtPYEbNwMzPDKb>e)4t_-Lyuo@J*WWc&WZ5yy%+b^!J`N+^$_vU0^jRc7b-`LqY?TqJ*A5PebTB2h{~u zgJKuxzAQ*O1l5(ZqQllVT!)*v%zEE9YH7It0PIHCS%OJZJCR7(#4T@c$ zRnm|!1ckgK$JS7Ut`AUMU^OUqX`|THdQC|Np^FpLh-P450INZF2b%E8O*ag~S zi^yMm@1Gq(=qiTl0;@r>3v|i_B!7Xz@Y}OvUl6(`LUn=Fpx9*yb|K7P*Te2^LFn2D z)dg0AVi)K>bVObGh;?HvLf1v8F0dLDyFgcYBm6btpMp3-*GH%>uo@J*K$j3e(gr9D z6?eNQ8N$O*5VS;&fq?<62E{H@6n{BSKdc zR2Ntcie2VlU9d2mn;XfE(A5Cd1y+M%7w7~BL>SftelA1kS_ahxR)b=fC5l}~uBXgL z=sE+{1y+M%mlaqS%wOM98LlF9eS+!&t3k2L8mtTEFYi?w@JkRDan)b%E8O*kudW1+(kyIaWV}T`5pqU^OUq*@1Pz^4E6O3#H@1lu?uwe3?gl8@il&q(8UfqW`lu&0jvhaE@u?GHlMh$9idAdstc?J#V*jP;fQ{U zz=8G_V|W<4Lv?}GpxEV#V%OmtV)GEXlA*f5YEbNQ1M33C7bpxLo38zb&{YT31y+M% zmpfP&EWTbu1iV7%nhn(jR)b=f2Ur)V{sP$*8u0uJLe~zcF0dLDyF9_VV0L{8`reMv zbrq@$tOms{FR(6HnrGR>9*ofS391XM2E{IKur8QgPku;VMCjrNWmX0T2Cy0wyTE5e zfY*wE{H1T?sE*L31JwmqgJPF2id~WY>$DKMJfXV4YEbO*1M7md4?$xoCh)Y82Gs>t zgJPFISQpG+pf)x_R~=LrSPhC@pwns~X&%(Jc~oq$unlh4RH!bn8Wg(%QSAD#L?{ZO zYb{h4SPhC@L10~=bO@?bR{1X6Vg|SC2viqX4T@dCU|leO`Bf{nA#^>2>H@1lu?ut} z6vAKLvob`@;dcFn>H@1lu`3kCE-gh(PJ}KI(BU@>3=Cj3D0YQ`b%8qJptLdLBVPqV zmljkPSPhC@;b2`be?3;){uZIj391XM2F0!jur5%V2gO&s^;97nxWA&Hy1;5s>;kRV zN3;R>CjLr5=*olY0;@r>3v`;?+&~*T+3#rwUE zn+RQ3p}N3oQ0$5a>w?*}WX-xhgsxXmU0^jRb|rvyftp#MG%q1H@1lu?uuI8X|4v zTqxOv(B%r%1y+M%R|?oJkPAU}?cR02s2*-tI8+x{4T@c)IjnGvD)dg0A zVi)L~HbgqqTUERXp{oa~3#WnT&A#|;P>H@1lu?uvQBBb35a^Z(Q8&ia? zBT!vnH7IsvqSzH9)0c$M^#H01tOmudEU+$EUHK%uyAGl24^$Ue4T@c$TjUV&RkYNf zAE8SEbZ8a>0|QtMid{KiyI^Vlcs~mhLYE0t7g!C7UAbUgpjZZl2G^@QQxUoXpt`_n zK#71M2Py*MKz83&por)tXJi+ffp$DFFyw(vE`V)_1!)1}E_DWm5X1Q3%&OFQm;Ag` zI43Bzur#%}1kU%&%LH@W5|dNoQ8+Md?m3kO8NoUEC2(nk2uzJjQD#|c5nKV33zH2> zO-zaRO)V+POfCjl?4DW@A5xT`3s zkbRpT2fFPUr>}^kXlqy84ub@hRjb-EdhBlJ+&l09TcAN zd5O8HFcAEVP#h1k zH!VM}BtA1QEgxMhwW6db5h|FGSPZoo5m{STCL~<6)CYVq* zBC26R(9p_E1=|A^EoQK{k9T&6H*j)uaCZst@^|rab129!E-6kf$}A|cw*>ja-V)?I zdlg4V2bgjnhX8+PFApzoKL>CK+gpNy4n>KtgP)hThoie+fCI#kwEUvn#1a%WW?s%t z{!SjAjt(J}1*!I?hA6U5jt;Jl{+|BsUXCbk0(llip^t;Jr-!$vtDB<(!j~v2%sn0b zom{+}d>x=6gCgti;Ns!v;_dF}?EsEXdrN49LR5irkY`>=YEfEZaw-Fe2g^y&z%%vr za&dO?^K*14sVqoE^@N$fi`n6WOHxwPAnu1sJ2^S{`nY;{J9_y#1eYY{r6d-mxI&FU zQ5fLh)PSQR-rJNSEe_;~vS1UPsG`}-u8Wab&7s)PhkacNQ!JmDKV zc?5WSxdeDSq?8t*SZeI;>+k2~?&9uHPzsGUh<;F*6qgib=B0zPQg&)(d45p}+(dKd z0OtU&0B;|MvecsD%=|nQQ_Z|Q+?_o=Ts$27@=G$4Q&A)>+yY#j-P~P09NbECa{Ll= zQKfwxyuEz`{9XOr9NZFfGjl32RQNi0`Z&8ddAJ8Sc$OsQWF|Z2rRSg;;^*KW;NutI z@8ghJ?3P)Pni7y%l8l=4oSYq;ojrX$eF9t^Li18mi*hpaQUjnV3B|!qE)L#Kp3Yt_ zKE4Q*AsLy;*?FnO#VAV6+&n$~+jhe zYwGOj>Fw?2@8^({n&%mYBIoZA;N{}(;o|J=;FFk_UYeMm>RyzO7MB)&J|0d1uI>R2 z1&PJQpy)y|!_qUr(cRP4$=$&zr!+Mi8T|9k#{5`?)VW0vWHE?_!oSnTKJw1J$9sEl&Qj0*&Kvm)E z;O`mW@8jv>2#tG8B~DHbZoWRwUS2K%P&GKrG7a!>b#`*|adQYRN%06rajU7nQ-HUZ zk8c1-E(}%9$HC9rJ;2%D&(Fa(GtVtGv81#JHE~(`IeR<0xOszgr{)IdB^G#~m~QFr z@8sz1;ph-t0+B|IOD9K%0B?6sH%C8bP)<+G17#n#L{OoGYK)VMi>G6NuY+5DQF5wN zeohLCw1uy?n~T4eqISiCb10gbMbU>_i%RzNX*PD!Ay+qPHv9Q-i{FM7}CBD z?mq6mE}ri04#6cw`Pr$MWw(W^ldrE&fS)JW0ZvZ&6)5gAcJX&~_H%T0aqx3N4FF?b zUw2PO&j5c1XEYf700&45DGXdzqnPXC;N$1)?C%Up2>E#>zTl!6MTLc{ zm!pTLyR(-AYQYFi$EGeGZhrpGE?y47pfVCgtFMErx2K!ClaG&sb4FrOFr)xPQDW}w z=IQ6IJtUzI0g9nIe;665P!hR71ZP&;NTYE;_2$;?TxI~Hxadn z4sh^sb#!$0b@PI#a;(TK2E`YuS$+;)0Rc`P9v*JcIv7jP1vq%S`n$V3`gl4xf$BYw z7afa=5-U->VCwJX<>cw)=IW4|T9KNJB4_F3<>lk-;FOb?oQVB-4{COSxbdFgrn_56yl-iaOJ*4Zgyoi5 z0b;pimO)uT`K5U&P&P=fZ+=Q?PAWrMNqlZn;UAeT9_>9EjjQG6L-1tmTKN2QTTv8Mdb2E~P;?$xN zkh|eRP&bDdg8Qg&Ye7L>Qk0sQ8y}pSnhkPTFqE5}3HBkB8<1a&Bnj$eB5_?oN!6_g z)XhSe=US0jf-VNq7aE)aI@<@K5G?4EpO^0A3hEhw`cIG!8t9IY#G=%AP@_G*AThHD z+&Kj)j}LJ31@$BSQp@85K&?@5Hxv{B(4r^a1=N=dF^u;wNX?4}b+|#!^)D>}wPhfw z$tfS4W?*6=MTvREIiL=gTSz>LAgJd8vJ7kyq+1;Cn3n=EB_pvY9#R;hDFJx}oUjs0 zplx-A++0X=y)+M$s&jMWA?@zsc!)rWA*d@GpPLJ5+Jg+p0d>ToElg-58`RTcNX|%2 z&IUL84dX%1ODtiCk9QCDNX$#gNiA{)$uh*p7pEqd7G;)H#zT}R=jUfesuo=o%>mGyz<}lkxG@W2V0T8J1z zAt=HjBP0lgNMcBiMG}R04D47WQHWY2kjIcjA!^Y@(HsC8uR!t@SUW@vVkp8Yh$zHR zbWw;}gjL9D(M1ss0FT}vMv@T0fG&a10?t^lp(BI_RAD67ph`d-4|Wi$1Vo21C;(9< zAUd!}Ky;Yk(t$++qQexI4lEJ~Z-c@UUK}F4jVg>#4k~0&2hx*IKy<)^0^J5I5(p03}J|Bu=_Ao zV+cc3gJTU-HHI+4i%2yc!i&g)5QD*fK^8{xBC;?SOK;hO$K5IHW`Q>aLi!UgG~ma z2OK|G^O`KRHP_=;O-k|f9s9KOE5Lz&23K6=n$U!xNk{E1K3#uMP z2&yc^5YpMk(+7s?CPpPzLy<~4r0zDn&stM{IBsi78Pk${?y+UbTWM-zl9Mel$^ z6=MiPl7Nv4h6E%LV3C06Fvg_=iv-k3kSQmOsXnO7aLK}~!zB-Kr?Cnyd5C@!obnL; zxaF}p9%Dihix)7}U~>qjDs0ZdR0T216vb1Rsvu?&QUx)~j3~1Rse+hgPLx@MRN)SI z(1;W6AP37r9D*9F&;SC>(^4L>wVh?{Xp zLUbD8(}_b8q7#;Zu-b`35~33ph*)*vkVFX{#Oypu&>#szm6sUCqYNTKm177altT&y zx_aO*Z%e@gP+U4A|6xPSoctVPKGes>Nk5Xq$r)R1L&5?B;=04D2@w3Yq80LUZ*~Syjpo^RyRWL9d2i+jT zz`y`n5RJ_|kiGXC7#KE!ZV16+FX&K+qm2vi#t`FtCAc6oFpujm>?att$e}3=C1ATSf5L3%cB;391GX(%9YihLM5cPYVOX3(%?I z3=H7&L$TQl3XTo!3=D>#j0ZYA0+#NPt_lU&16sK34^;!=gD|#y1iHX5xr2dWHB>EV zX)rc>L6_(5hpGXY1;W_WEoNk3ctwOd(6u?eT?`BlL1&QTiC@s61Yf%t7+65(hchrR zfR0PYW-sV~X0sj!hVxK$@c2aw7tnI)n@}|%KY%beT+q~ku6B7!ggQP328MS;r~{oM z`-cd1phe*Ppi|F54ufKB?gOP$c_P$-)^Mw1Q&*B&QKFIyy1NQ&3+U=Aqh1Dv`B1f> zt5w0_j214S@IMY!1J($-v{b+VqZ|i?-x&;b4jAe{Z=5Ay`9oJ0%1BnAeCYoN34 z38=dTx?p}P1A`Fg{CGU&&}}9L2A3HO4Dz5;+!+`cK=;VV91}%z;FX}0z01g z1y$wWplV=F#Acos69YrmJO+j>p!3r4m^Yb;f#K2u28L8nK;lUUOBop$Di<>_$bn8A z$75bD69a?IQU->V%OS4Am7WEe7#Q|0XJ9x7I_Vpay{nlR7#=~@KupA5U$QVUF!Zir zV3-IxPaBVUpu-%Ou47~1H*Hu zT3q1*iiY1%H83Nw#V@FxI1hB{HcSx?dqL&)LL$_G^7&FC)PXLJ-?Wi|;UQElE`Na9 z2VbFTU{1v54^aDA0dx*HOc4%$fG#_>CPE$PGTK%m)PXJsx=o}y9?*&71l$L@>d2M| zbs&3liBJbRs&pO^>OfazRBT~j-~*jhjwd~XE`62Q%D_+tRfj9yK$p36ZDn8(1)X7z zryUEb&uzCcFt|b0!P{48<>_Z;28Mub3=Gbov%~S^%PC9@4B@*N7+!7YFAK+i+lV9bi~zu zS4M`XptC~o*t?pMfkE7zk>L>NoDV$y6=G#zc;Lav@CkGR1_J{F=p0jQ?rUOXVEE?8 z$WQ?~hXPN&1U2b;0vH)gK_^e(Q3o1!@eE{SI0ID&>ThDR7j&4~zd%L?SM8# zk%7TFn2|vlbTR}Ub=E8l4343U3^kFEa0cB7gw0-1SHS>ut^&A3gAmx%F)%YQ9EoCN zI08E108hUWbcnh}93#Vj(3u8!^6xoT1_tYRMg~sM4tzZ0ot2>YO=D!30NOo|Cx3v> z_kWPi$nXuS4&-ZW{x}Sh$Y5kR4B8=&TuvfgYX=GiQ2IR!RRiLKumfmZ06Y{A;z2M- z-OWr!hNn=qpmr@-9h!Nd@hj#mMh0=v9(!oKfz@F#&oqmX!4X{@nt7o1KztS>Lq57X zEavrQF*3|VSBGXEXncG-R1L&u3=Fv3cRq`e;Wkt)KL7sAVr1aW1_e0iKv>-7X=gJs zn4_yhb05gRq1lWKsp#sk__sNmk)a=59h!Nde(YMP8bbcvn$5^?5ULiJe?fZm*i~D4A7#TD{=N}-a12p%6{Og{>$PkXM4vTrEIgAXA=<3kS1NnD8R1G2jF3(|P z*bG&R%fF!Xd=aXKkaNjx*P&{0nFq>m zU-K9lMDrnG2qJNnSMvFc4BAk2xXc5^hbL4GA@@b*Gcu$?)#5S_ae80 zo%xImN72=xr9Y7S9_KSMd`4G?#XP|RMh00>!xA|kVKL7ds)mq%y$cu_!l7z$`4^mC z3K$tW(bZvb-|_-RhRx{eu(7V|WrY6$t)vXGI% z6{;4Wf0GLt8OqVsVR7HoLPmy#=<2YzZ+{^p!+CUdSj>A{$jI;$T^*WvpmvFP5hP3q z`B%A!kwG7-7MFiP>CYFchLCx&MT`uYP_?+s1ErVtB1VSU=<2ZecV`hJ!%=i~X#NGc z?{N_$!)J7LSj-bFW@L~phJ+0+_kredt)XfN`8T|nks%qX7N2>I#f%Jdq3S@k<0`L~ z7c(+!hN{D59;ke|Sj@=q5?vh@|FV}bG6T!WblNl#T6f*^p{@F$WV>04vYI{mNPOeMOTOBK9GM8moqY4 zMpuW$ypQFK41dwpp_vDApL7KygMI~CxL`5Qw}O!&5?vh@^U9%W2!&sF1tY_Bs9Id% z2a1oa6^smL(bZvb-|GrShVSU=(A)&3(?h~nFk8L{Z)(%=h4++G4E{^Bg0R0by&<3uV!RW zuO{qY*J?(FKy-Cz=7GxRe5e{i@ljpP$j}Z|iz_}r>2GN@Bg0;Fby)m+yPA>VIl4MD z_krSrwT6*FvWBpK&1)DLoYB>xnForG#2QA1LUeUl+}B^j$S@mS9h!L{_wB4{&UP&I_&x3QLyp%_k_G#k}ivj0}&_)uEXO3O~kr;{3~5 z&&VJORg2HR#!xkc!q2^)ks%nW7MFRT^il{_L&&_^dPas$s9Id+fx>S&R1G2Xw%0Q< z9EPgJXWqklMuv}2b)b;M)&KZi&&a^u08)XwzW_=vstt?`mgwrR#BX>5BSSK}I<)u& z`M0rwkzpdbIxOa`Z(wBDjjj%hc{ibI2!-Fv21bUjP_?+i4^-X@H$uXMka^mTj11;b zwYba!)#ss5HH6G7Y-D7pg{sA69wwt`3WN51Sbo-lD5RGY{lG?iNM{`4)(u;r_s4o^1;wgD1K=Eas)RFfvr5tHWa6 z%oaw5rReIgn0L5^k>NVJIxOaWZDC|!Y(?`2nt7o3m2YKa&_`E?#XR3uMutdqb!g^+ zZV4!FWn`EQRR^*iSNXiOm62g1R2@8=(aZy<=T=6B*HCr%%=_BP$iUbJQh~p`mv3Wa zFh*C0#lL}Vj0~~p>d@Q=N-x!Ij12wg>adu%wvCZtC%QT`^FZ-&y^WFKIl4M5=CQUj zG6=Tg_bBSSw_Ew1zeir=+8j0^|S)nW1P{T@b!*XZid z+y^p`vzL)U7PP>WfPbxf85!Ks)nPF&wU?2h5?vh@_f79*WLS)@4$VAJdO6t3$Z!!| z9TxN6_cAj4MpuW$Jjp&r2F*T59)^cA7W3Tu7#V`m)nPHOu#b_U5nUY?^XB(4GOR{d zhsC^;P&I_o%gsJUhNn=qaDSkg2Z~?jentlIe!~7W?Pp|gL|2Dq9;ked?`LGFMpuW$ zzcc$88J41}Lo*K)zlZx787`x%!(!gYeny7B=<2YTCq03YL3;vW|9VbfWC%r9hsC^N zs2W1?(L8~Xp&zOiSA2lV`?V7o8IGc>!{Xn^6BrrZqpL%6A1Ho#Co(c9P9*GK`-zMU z-stMk%mc+o=0rw@N_2Ht+&6t9Bg0~Jby&Cqev5 zC_XeNF*2A!)#8c|(E69)NsJ7|=<2YzZ{j3IhPmkKu()scBu0kQ=<2YT_i_>=!&h{5 zSj-ciOq_p}Co?kWL)GH)FDQO}p=t<)U+iQ?hD@khT;_q&bNggQhWY5~u=scHWJZRQ z=<3k?3rf$=Co?kqMpuW$Jjp4H460KgVS~$kApbf~VPptKSBJ&C!YPalwdm^5+y^pm z_7p~j)#&Q5n0ImtBg0j6b!g^+#$!K2)ewr0-%}VF*r($6FQ|N0oyy4I2vrACjjR9b zJ(ZCm9I6gi_<`c1bSfi5C%QT;{#`zmkzq5sIyC=+!tdf#Muvyz>advie<~vb_cV|X z@b{-Rp=t<)pY1e822ZG3T>b^6=k#fe4E5;hu()sTG)9J%=<2Ze_xLnMhU@6+u$cFC z8Y2Vabo~AWxlevNBZE1*IxOaePG@9DL|2E!ef85B8T!%HVKHy*bVi1q=<3kS1ErVi zP&I_&JcE&8 zJ-RwH^FZnO>M-4IyCoz(zEa^Mh5L!XyJmzJkME-458@i z(98qHNAWC1hGukiSj<~Ei;-b1x;iZ8ou0+Wa2s767W012Vq{>Qjph$D^FaPphN>YH zAJ(%O8Qh_2am5E{zAP20hLCxMvl$s`p=xoN2ReUe_H0Im!|3X;`1j##MuxZO>d^cP ziVyBNj11Cq(82|ad6sh+8C=oTp_vErZ!%O3A^+yjVPvR=s>SEunR6H!4x+2W;=cQH z7#Uupt3z`i$iJL(85tz!685k8Tt)_GbaiOvfznGNR1G2jR?cN)Xoaf9 zA@f$xWn|b6Rg23!Q2BgyE+fNBbahz5k9{5^gYZ1GaKYkV!+DGhp6KeZn3q0}k)aq} z9h!Nd_?S44kzpaaIxObxpU22>8eJWld7$un2~|TV{65ZOWcUkJi!1y<=~;R{BuogI zr#_#N!5FF*mw6!n213;kGB0sHBSS7!EiUsw?(2rCA!Oe4`HT#Up=xoN2TIQep=t=3 zcXK`?!&9hQeC9DPATIo*7cerYL)GFk4-~(yP&I_y=evNBArh(Qjgv{HxfRSM@R4qR9ZbQ`&GVk#MMuzuLwYba!r5E0X#Kni?LPiEvs9Id+ zfzpffLPmyYbahzrZ{~AHp=t<) zANwLk2H{1Ju)*bDP^h+T^$zpB`;!R$VXR)=01>rdlxY>%tcp+#k}2%7#WVE zt3xvnd@Q=ir?u=7#WtMtHWa6(It!w7tz&WG4K5nMuz|B>adt6yOfbZ6LcUDa=f9L2P#k9 zp=t=F7yqS<4AD@v_|i+|QbvYebahzVw|Xff!*+CaXzl~0m#a$|8D65R!(tx$GDZgB zWrX9`a2X?mC%QT;=A|!VWGF^ghsAvpmoYLdMOTN#yu-^F8P21t!(!gsWsD4r%hCLS z#XR}tj11c7>d?#sr9aQ*j0}adtszMPSv8C@Nkd7$!TAyf^a^s;t2Bg0OpT3qP` zlz*=;XJq({t`3X)1XnOJ$gV&O7c}>Q{A;~}k--~X9TxL4S1>Y^qN_tQ59Hs;P&I`7 zJAVZu!)mBnT>b^6=aVZK8SbL1!{WZ*D;OErSK{|CDEw4cGBP-#tHWYm{7OcKY;<*K z{spNPHIyCb@@$qyeBg0p8by&<3Ud6~DzY4#9LFU=6Vr1|| zSBJ&C>{W~m<>>0LxNqtzMuw&6>adu1coieVd31GX=7G}7Tc{dB>E-7tMg~^U!5(AHN{~Id@Q=N-vAoFfwdLSBJ&Ci)$De z?xL&1V&3mHj11gs(fonMJk7O?45sMn(98p+mtd$GLg^)bEh9rVR4uOZ1vEa?xt5V( zBf2^)?mNGhk>NJFIyCoz!tdu=Mh4Dxg#D|&j*-C_T^*Wvp!f}hsv+dx%yoC@Fx>@%+fZz)-`$z+lI~2s$>6!PP1TeC#B`AJ#DF%@PeF+r(0sfop@3c)3bC7H=FB}JvFAQgJ~Nm&e53^sxcNem1Z z7=#)47;MrR;k0jNa#4P9ep-owMv$h0e?duRZe~?xUb=#Fer`c#PHGWDazTCp+`UkS zi<^69QI2l7nQpkJpRSV|NZ7^AJ-;L)Gg;Tw3B(0s7dQ9H{NRjyT_4aXwqPL!7dMa8 zOkLj;T@P=lP6m)zFjRLq=-gD0N*6beVBgHVG1U2F24|qU&&L^jlQ*(%kJ7}D%)~tJ#LSRP&^d`9Q=wwP`FZJZ zL6D0z((;QGJcIoW4a`i;G#MB`Vm_InAT4kV5<_(f1495v5KSRO$OIPbVEs&Bl7S)O z!yeWrObiSkt(7&7v@vYpD39*N24ym>C#S-ZgAn-p;^~JazK92zCaB zE3cjkg2Z2jMV@Qj!@wZ+rKri3fq}v8bvRgk!o`{2;tLrVGQKKZ+QZDi;P*NSES?gZ z^}?Z&fkE?oK*fJn1_rLzx?u4xBQe|Atqcs-hwWFMW@2DadmRrJZ#ubV>BBk(hG`RL zPLO9o*lT^tAS!tR0|S%V65%=qgg9f*^JOzSQN|L`d2<%+V_*V3@Wl zX7()5Wg1Ya(=Tm#9T^!I(#nOdG$=s@85kI5sAYP6U}Ru$bLKTUg`}S4n912Rkhs9- zoDE3oMT3{eg6xftDsgy#B<}Gi^ur-W28PS`7%U~^K=q9{LjnT>L!QBw+p8iN7_>Z` zuffU`knN1D3=9n*1{{OxDOl=;3t})PurM%yhQxnh$k0ZBg+YWtkcEMPhlz!Ohl!0r zfQ5sBhlz)Qhl!6tfCW_Bq1fvHI))#L89+V)34mx2c0p3g2|Ab%%4cK%K_~}}Vqp+~ z+YdS`8sr8ZCXgGr!0td(K4Q6`coJY?U=U9f}nz+prC@HA|oRM zgMcC!2nq@?C@KmH2!Q#5NI(IsSwH}!n*n4Vh#{b$ASht0s3-th1qn(KFn3|nj7-cd ztZeKYFdAwcP72~P+$1A~;Qv1g4IoiF)cc&wtn8fJy!?VBYR6E1f`x%W4Sa6q4HgCl z(CMa(3?En^_ueov{9s{V02O|W;EPRa!RjPfL1}}5fssLhm4N|tZwMoU1}g&t=)_J& z1_M^eS-Xr37OV^mpn{N*!Go0nT;?${1h6tNfNoY{WJq9TUiV%Of_$`sje)@tEVhA- zfguCT+QG)akPT)XU}InaT}Z;naDt72ArUNgfsKIybj1@R!wohDP$QOsk>LRw0|Tf< z$;j}6je#KAw7jFo}G_>yP$Ij~IkkJbbHt(RCC7<{_-sDR9I?LOnueblG3Mn%D+`?6>E zx&L7tKHZx^S2RErFJ)z5=x+YNz`$S&3Z4=*ThIx=CGxhZr9~wr61FKx*-J|VZA*%C zmX>hs2h~z9i&z;L8ofC{7fZChtzf%?xQf91Rz#8u`)1tbQepw z8vplb{Z?Y;*!|z9R~6(Fet8FmG=6!=10eMsS|MBMkQZ)}f zx=(}s*m9tR9b~%#1A}L`n}JWSkBWhB_c4!77ZrwbD-{$w{;6o0_gU>l!xPS0(bNkDEf`6Oazk?4sz>NQ3M&nNghX4Qh zw;$wpI@sx=V&d5NA9PU^e>>>91=rU9C49{X{@DKg&%nUn4vHv`ZXXp3k6ss*3RmL; zAkS#HcAxh+?xF%JFc}2oYJ31>mVrxmjEaeGFORXW z^_g-R{%vfY-5))=yFtnvyDvC)uy8p3Kj3P8yy!N_fY+>G_1!Ki2Cl~cJDWLJ7#LhS zn|Z+0Y*1bDTJ^Y#N(HDV>CrnG6cVst0%>GpnJ4dCU^*?`WJTn8sYi7sp z|KFTB82MWiz(Lr2fq{X+qq!o0p;XPY`x-0)n|B`o8QlG&gu|wfzeRaz9!RKn&c(gk)erYEc2Qfx742%p6{4KW_85mmM^0!<9 zgq&1%G=VD3rUKL7F_ePkVG1 zNO*LINqDqgDv9#x?!Ex_tcyy8Pxo%n#W613Up)^#WAS1B^=_?VDRX6QK^0AB_XLmb0uBD{3?98a4j#QaeIC|diygYf zV4n2s4o~ptKJCK4-H*+q`4EQ-|8_SPpY9J}3w>L^m2mTK_v1)oK9T0w$>-60jK{5)$X7k1q--V1RZP5!T`F>2y~z= z3j?Uw0rlrt7(geMgAO5QVK8Q7V0gd?x~mSfDHC)cAq#^c69WV22yhmLji5jT%YI>E zU;u5uXJL>6WmB+NHZubQM8|$O3v}lOs1MGigLQ0Vfz;eA42R(? zaaINf&;&9Ig9$4G184~V3&T-X1_sb%A`8P)Rt5&p_Bs}ZH>?Z{pp7~#48K?z7(iP! zSQt3i7#Khs8CV#^*ccc<%llavRM;38KpR|G7(7}}^0)9XGBAMZQw5Li#tqD%y!jJU z-x_#y&jjTNP_=8}(Y+FsBRo1wR2)3IH-hR!pUx5$50BOZC7d4Johv{We_Zfry7e4)rE~iiuzlVJ5Cy%{LFK1U=XQ`R zEP;D;PoDu+brz-wRABjZZik4TbLreZfti5;CJ8Ee;B{j6d6&-ZpkmFXb342w^5_P8 zB1gr-qdP{$z^8LNs66oL26?CXh(i3~Oa=x9&_RqW44`|sAn^inIYbO}?GQu^bU6q_ z40LZ1gasM}1huGG7(9+Qf>xjZ|NsBL@quHF;9K^NH-ave0|^~=2=-`xqu|kf6YTI~ z&0u+t<|7Kxhe5ZNJp!kOfz=!$J!3P{3%;#LVFYs@3F=BE&_=p3_W`?p| zyHEL8A1u#t?@8Pk;peA+i5M*{>aYS%h5pw}}{d^oFr?pWxr- zV!-IZd=X?`FOR(o_XQ8;bFST|JghI43%Kxa^ZLiX%?YO2mHCn@^GQ%73OII82Gx%) z)|bi+U93-)arL_Yv%XQP>e7A6QTvi(_en?XQ;yw-T&+*>JDma*f8C&FWOt20peQu(=$;Q!<!VYQN|{>(Oh|W_;lDYEY2Gs2F&3gEI&ytAH~FXcP+6xquXxFki-~ z2!OmQ0rIK>sA(PwZJZnUbT0&z7_P?u9gM!Ybk?XOcy`|ad)~(q92lj-&@kw9QAq%W z1LzDEpYHXbAn@%jm2mCmbF_Zx$nXBr*RqzQR2S6N>vd5{05|wNp)F{~-T)SG2J-B5 z<#4gAQAyx$1zk?!+3m{V+I_tBZHY?vRhRCgY5ejo3=G}emK-Ilog5C^7(JQ~vv@Qg zVDV^v#aQ~h+n>d?o6n{D>i2^T4FBs(Y`QOccKbbpI#~_UP^hg;ztR0YfPV zET#B%yK?w;pYOg36L9Pnb2UEc+kG4+015I^k#2X6*0&{W{JUQ8zh(g??M`7L!^9RE)PcX(W%arsbvnefo2;OgsPA8&Uf1cpBE6s@hkv^-v-K&DZr}C0Ks_7&DXz02A@4ig zv$GB4oz|25tqWKg7+mn^=v+<;K_UfhxQ=TAn z(xcNu!L$3cXE#`JcYp%S7e3u5JUU&EgM4v{1=MTl19{4)H$lOtJM_Lw_hFAtM+uK^ z-}9c#XIwfpJUTrDjyte`@oUcDj$t+z|`e0o{HccgiCpNAKA zp52ZT9=)Cd9-SeKA3T{acr?FeEPVwQ?e=}{!FZ2rUxF)2U$IvUoe)wPxNB4PXw4-Xi%FMvf?aJNl%iihC(e29L>CDsZD%|NTz`xy9veQ|@qno+Y zTjbzNi4G3_ZO&pI-P|3HjQrc2MZqj4{%y`8U>37SH?vDe1q=UnSMfB*P8OAJXC6yu zj(S#WXMsAlPG^ozX917q!wR0wN0|N}bF}`--<10Q|9_Wm-|Zf~uG2v&3{<9cx~OP? zhaM0GXE!)TJUSgg$qE!tO3dJ7%9z%Avcw7+qb?Q|2Bo^N6z$o4uKNbqpWT;XV({R4 z%mmR6)#=e4dmNM{9lO7JbO&hobSF!AbcSwEbFu!(-+UO<1=!{~+o_i&qxk?6^MOv+ z{b>`rFJKtj2WsO(D?#lj@PO2NbbEtRYKf{x^Fbb;?qi_gBiQIs zH={?dr$Q$asDS`Z`tM*~@AjSU(OvuAqxC<3i!>uByMpsGIIDO2u1Ct(9^E%UY2_Q} zLb&c}pgir-eZr^PNx`E#NCF&YpiB+Uz|990e7b$_doZ8&U_R*4=`G;V=?u!x94?mC z9Azf39F5X=k#Ouj@A&_?2lGjfPLUIy%okj&t2v6EfqdoB?JVKb?fTq@`G7C;K~Ti! z`SgM&Js5l-Lx4WL;F&IjdEJ2`KAnt>ze+OF%S%~(IyqnKHU7#dNda>NUn@5LswytX z2gyjj7HRxdl9y8q?T32uyB_f9Wb|x4zzV6e-!YbM1O-y3yhk^r)b;3w6tmq2J-U76 zJ&YkWr$^%vP!$HRDPs?VuH<^p4(di8Wnf?c-E+ahaG8ODp%r}n9H;{UIzyL*0d!*? z=oTs#hO3}U@4yZGNlXk3kPhl8(8X|I9p{-C7$7<-nPFA$T4tEZ+nFH~U@Qy=nPGax zSQr>U_bRY3XtOXdfKDQ3VE|pE1!4KHFff2l;bvh-gUfcaFfc%>?RhK=44}IQSQy$^ z85lsTc3BwKf`+QW?gNdYJ_EB{*ccc(!S3^BV_*Pvc32pK*ccc<_b0P3Oapa1!LsMs z7#N;{b%2_W1Kd*P0A&Q)wv-)$LHz&?kM5h@zjlK2Cv@lvWxNX9<^WwE3?8rg!QZ|c z)C}s(QSkt^uLD3mZUs=*1YIld0UO3bjA7*>jbS->bg!NPYW;M72aREQbe~2W#%euK zsty{&^5};4tGiu5UHj7>sDoIbMiQvu7XWGkdVo5~3LeczG~%NVLpvvsk>_3`e5P_>|Yv?1+8&`sHp-ZQAM)CVVqI}ETf4_D)p;Jz(rJq>8-KMRB7 zMn*Id2T({Vd~bw}mw9ymNA?g4s6}yFDwS#AOSb|6Qc^Cfe-msxGXBH3WP#S1Bo{N9GH+U!wG?I3h z$HV$=(Lqq)IDo>%16r?uyG=1F25FY zge@E-3{slb>7K*Cy&rjm%|DNSdp~@HtsUzKn}3N%Z$D&&4Xhxo)4dGbNd<={m~|L* z8!u#Bsh9yat^_LeA>&G*D-j{%N*>*fppf+Gz6cub@d6E(vUD?aGWoV1DB*)jf@WMi zJ2`w?PnPg`b~l04dvtpUcy@Anbcd*Dfb{4i#6kV;POihoCqd#&om?Q3m_0i=KqILd zAWN7%IysCF9Cio}a}0xwlgtDe37Y5W-Uv$99<8_eTMmF?y&F{Xo%84p<^UBX4xrXe zK(_|83JMkg&7^dn^XaUHG!{I%gEc(Bd;ype2?!sq#lokv8ayWK)%v!?3N)_b;n@8j z+=2Ay4z}>}^IOK!I}kNBDju*=D4))13y|FfN4(f=ngJ``Prj; zGH8?)60!wgB_7?EeL8nTMZqFI-8Cu!prq&+7Z-gPH2VlC8T=SvJwwpF$Ph8mOe2H^ zDjy-NgK%}A>JzlQlZD|mT#OmszZ8eFK-Zc=)Y-trLg1_nIIEG7fdQfpG@c5v4OAXM zSfD;EgmnV012ioG5d#h7fRiF}t=4_Wqx+>t_X%hp!I6L4N6+pb#<#)Y(0ZWM(4pm9 ziGcAXmtJQsSaI~4shhp|hjIyD^AC*@&fTCMTKD1CJe{r;-G^VZ?f|VJhm1X;jnsf< z!F<65s~!Ub!%J{23tFrd4rXQMm82FG6s4A=7U`Cy78Pga=P`ht3@%nZKo0$haHuD= zo!@$(RH)m%qLUdmIs_gQ0$UGp2$&C=^oH0h2e%nE&e;eWOZM!(>1uq^r;{6$$2tB_ z02NSRGr{AY4#A;e;o$sk(Cx_L*!@BkG#KO3{mG;IrsKDR0{ktkpvj*DrJUa#IY8@z zN_fA4s{sN27Dh$}2IK#ru9*+GP}rgZN@<|NAj5G#sA}SuXK2_x0koW=L>E+df;tqv zKA;&w9~A|+UKVpu71`^flCX*K|AYsiwT1lKT~sPw=clsN{{79M zk{L9}cp|McL?wZL`=K;P?E`5p+J{|Rl+r+2>=+ps9IY>a zHB|C|)It^Ura5X~Z~>Xo8KP3*$iMx-|Kpu(9?i#CtpD;ix&QzFACyrtj1PdvUgF~8 zVxteYA_amZBoLTN1$Kba2$CvLfRxySTBxAFn1I*Y#+M-82KyT9fZj3|>%T>(Q0#@p z=1q@o&d$l8_T4u}4#pC3a5_fJyn*#7L>~rK4&cs^v&8=ipuw2d10`I?n?d?Oy&O>9 zk3KBPz`y{yZVnSp@;bW%QO{1kO$5mW~lzxC(_+3V5$tNZIWM-HYERk-;sDhB^2 zfag%Vxw}8K9w>1`vZebv*m)k^%-t19v8fq{Xc`xq!sSwN}^#Eb-J%||vk`=-N#XeK<^K-1)qV0*{F zzyP`umxaNnJCMVt`<6%dMc>xjrL2y<&MJp}TQ7lFPRfT}t(^plL_qa1sDTNdc4h;u z>|i+T`0XH5iGpLd6Nh8>$>xWDRT&f*7##UsPP%lTznI0b`6QF$_k)Zq3=Abg zj?E`I9ltwqfK-)2q`n*G%fgVBpI4%r zmS2>cSi%reRGJ!6S&+(*TbfgnshgWvT#{N;%#fQ}Qk0ootXq~?l$ltPnV(n809z}q zo0^xNnU~5?QlgulQ<=t4P?TSgT2zvmT8vVh-Sp`Gy3^04;ou0Y_YMT3!j<@eJXqnduoN4B?q6B^eB$mE6gRIl-A#sSLq6iFqXq z{M#GPfr^V=3=W|6DF@RWtq+xQ^6#Grx>)_Sjtl?x&I_Qa;{6lPfL3d|TAwNr=ilE6 zlAXc7{)8j{{)7DMFEC#`_>0f6bAkkD`V2ai3h5%Jxmr#DDK2I8=sxjU7{mn`1Pv$; zewS08ogEs?3=AL{(52-iU^SrX4%##J;CDIX+1X%#Fxs=T!2yNm0bUx=0J0tAe0Pvp zAYYY=L+$bG?11P1_ugO2gA{ zW`PE3K&?v_22e9%KUhqVk%8eLn8m-n5j3uiHiyT*9ehkg_XSWwi3TTj&`cg^8vzRg zXh;Hd5j6_~r2o?02=aqR_fOC;GpIk8X4wdGSgBAqc-pWNA`h-s`L{QMA`8@GvFP3i zI_f5^^+2g`=SGkbpc11*#R6n!{Ne6S(3B(p{tKWQ9nz-c-#;B>E@H&)0(5Z@sGu!lK3k8XC4?hcT-&6O1z zrP2-i!G@LyHS8||nO?%#u)h?AOH;taL)}i z;nfXly*D2L%@TsDYbJ z3+@DFgpa^#;I2d{0l5;?uSGQSkX#39)GkM#(g3j=csMwabv9R3Xq0L|Be6ujVJ9TK#Ts^k!y7c%3fCwAasbps zpA#$~BO7=)1P+5k(1m}0C#Xbm?7qRjzY$c*@NYlGzy8F*UjqE=FSzn=zv0q->EJH` z$AgaqT$nGqSYK?u#Nf)m{^r4-^2`?x{uXfLUw_m1WcT5N4+I>U4?9{P=AU%Xt(Qf> z)%sBLMFz)%zvU197GS=`eA9*bHYkcY9J@~+{3-9$E5hh#eZfWeX7{PaL!g?=`l4g= zWrl;V_#6*D7INXf<=A}~;zUr75~Udrnh^d!5wsPe+Z&E^G}+KwX+L<^9}|E29M-J{M#l=FoBiSFY}gHsrc#H7-6Ej;QNoqh zyc?9O7)tp(x}6h1QT~mEQJ_TLqZicKJ^g<&sE~dw(6Cz+te*Y2vqT#M1H=F0*8lk1 z*#7_j|5_Yb4pf*OcQybO&)v=joz5nppvRa_?sfX#{DY}Hz$5vPNAm%7$QbrPpKj0y zLMhjAM+wj@=my5aF4hhlbs#>dfwqD1uuo?vs4?E{z|q+#!oFmfl&Ljs*a`EIBiKg}=N@kcsR4Bq zKn^be6^rm;+_>1o#+TA8C;kDgoRChlocIsK5K6P0$N*Xg#MynyqccP$<2Bb#u>MXT zl??vv&7d6*Y1YmzMS>QSK{l35g9hR2UKjrDA6ieAu=#W+d%R}x=}wOD=yne9>(%+d zzrFbgsBX7z2Kk4-c`vxdc%k)ViIhh-c(sU2x61_E!C9N<3%KFKzkM>uy6zty-Q6G~ zx_vIPIBWZSVd(hpYS(tQBj8u~vORPFO`?*{2`0cioZU0u3ePOx-~obc#A?W*m{ z;;0?U@P9I>5doTQe$DRE{R`ArYTgYBUIzZYzJLG!gT~)rvl1T3-Uhvn|2v%xJi47V zx^p`IfP#R5fx-Gkkt8&M@wb2+0u8;FG5`Mm_h_zB$p9@L>~01X&@SCBFQDEOc>(rk zxJP$0sOQl=85$%ntie9Q3=!RKPIz#5ba#U_{eXDC+vg=DG(grfpoRm;|EED+D^Q;i zWPP{D3snDie`x(*A`V)7D$*UIlHl5X96FQL{o^&0@qg`q9=(%6C4&oi?C~ggi6tn{ z{qF_^6)eE|Z~y!M|7FDA|NpfZ85kgK2|qZ?k_jdT8cT%8&S!%41{^{`qi7i}{M&&7tzuk)^&Bgixe=|ra|8_5dH0u-m&7kQ9{_Sm`beHA=5@=)s&p$hH zq`6oh;BPKsVqi$KUUvkPBAZje(|rd$y8Qw`rFsIWO%UPHYXh3)VDRZoQ3>dd;b(E= z-+l1N?~?bhLU)IQqTq5@h4<=E}Q&!T<9qq`4Oy@O^fL49J! z9iUAzKD{bngB|&|AN1)pfv~$-cpSS$__PmohNvhwc8Bn>IClH+uxOv^3{lbP>;W(C z?mqqfW@n2EC~0^4sHk*b>^=dG%kC)}2?TiqK?#mD=VME^+K71_9Cp@~_Kypr|~CxmGrjgH+ed@PR4E<7MYoQ2s%oCQ;d%SjfG?l#aU3utJ= z0yKQ?09qjJ;ncvxA>q@Vq7ndFmlXjjffGEMk7UHf9&XqNDmxiU*pIt`OKYgG7$Yo^ zo55Lua8?eS1v;Gr(m(>WG$5>-aM_P=mSdPl;~P-t4cu7z=mBZGf*U;+uttwQtkJ^@ zZS?TBsxUDyd}{>N>Wn3v#~MMEE#qtUV~wE7mNBh)CmX0j;BWcM2v_FQ-N*s1j2b0C zROcKO(5eCJm6W7CxOWDh8m&O~nKc{{1IByW2Dv85mr; zU-NGl@o?nd-e$naz@U8r!~z*%eWADFKflv2>-+repdkj&?mp16b?}gQ_hFY78;(-$ z|A(#bmwkG99#ml8=Wjm_8q9dz{TU=&?vRFkp1L<{Xv0*Nea_M#c-x;H#&>P0+ z(tXaO*GC1?X@Te~yX?~q$+Fg8OP#xqId+R2anu$$P?GCn{jONdrTdt7FV7oS?W2r> z9=)C%;Hm5{y?%_==gYm}i$fe4Mb7*`Xnnry+iSC4H%8DN68`NMz*f0{n%l?0d8qYm ziG)k9>wl0m%q5Q9SHW`Kkf4LPCG9^fFw-2Z+d%Qk-?RN6WRNZZl!zlh={EtCeltMb zs{+tqP6cSX7#zQiM?i_oG4609BLf3y4HOFls8I)D@iD=~x|w{s54IjCWwmrPD2ZhR zH*s9LJ3%d-3O|qJ#tbIVR)9J&(5i6H?uG);aAvp9i61W3o*ebMj>j4lKW+Cn$Y*bg#St zYK6F1Zv-jfZ@vc_cG%tt>Kmt7`@8TrgZkQO&HF(uBJjYA11JRtfKnMa!7A{#OaQHw zY2FWNDlzc4fVSg$bZ-Y0V%^h0Rk9=h_GA3pPr^!ek8bw}Pv$Q^y*4MTr-Pavpyixy zEFRtGyTx3!-B}#9#s5zSwLc)bp~d*?q;5V(ZGK36`LT50aMbo^=?3cui-D?a&{7qM z*4HK;-P1u;4gdC&AnTFr_HgTVQDSlG7EyB1b~(YK4QkGuhv@2_{sOeh>I10AQfR$Y zC)?fshLM4xmqpO}L#;sfLG44ZwEO_ zL|VU9a9ZEx_kG=c_ci&a4t(!ryTg%bWp=s90$1nqkOkU;_vr2hWe%@y zmIq#)ED!m&cSFo|_JG7ExS8+KecG+taH z|Mq5(|I;j+LD}1p-{n95wu9Z*n;$TPcARv#G=oz0|H+Vq3^t|v!)q1(ZICn%mTmnH zO4U}NRQ=&Kr}nSb|NQ>{Knv+=R1!c5Thz7ne+8%YSAO4j-Cw~e`zycyS4ZtH9=*X8 zF5Txq2^Jh}khEH(q5w*;;Bl)6%s%P2W{_7vJ!eorf(l~|Q0W_x)(Po^xpZ!ZC)mv( zB_7R3EF9ya5AT5wc0Go(K+RbN@T?gBb|#PRoBZ2$f=o}dZiFOA(8hOg3);FH(i8^m z7xCzx3`z~4HEN)h2%y5y!2{Y*b?FW*k_|F+|f-6vESL1Xcb+Lu}mIP$w(XuVX*(t5JQ zs?$fs1YD(chQMl27Zn3|6D_T?8Pw?Mc2O}w76T2wK$9T6|KelF;@W+%Tg0&22jrZC z+9DdD!odL)j25kzN_jzU;{cCKI~e_UXn4-peaMmD<$$C1Nr#sI{4S?Jd9C#T*hvNu zC%LGYfb#=r4;`}gpfOE!CxM14q2uiypq_U;co-Gh`zwJBJ%CCoi1gu|3=9nE;6Yi? zydQ)Gx+L*DSj-_f)T8-LMq2YuP-(#cip1?&rR?C|`D=Fm?VZO!b(8hWB59}<{4M%S z3=Gf?Ca8rO8+{m(s2D-(X&XR0Lj?H+oGtjbZw3{C`~uz{uZ8#poGbXZgOe7&0Jt>Z z*K`5xB6U&G@HqHFfnU={#URc4Ly)=H1}n zEah?m4I3~pFuaz4Ds|)EF5-~p0#)kx|4^Ev^(Fphki$WJeb53W1_lOS>yM?JY1W_k zTjqnpzj-&PaAhcQ^yp?r9=(!=ja~_PbT@-K3!q6-rv@Gdj@MEkraPm}L8uHwlm#RT z8_p_m!)YAGU>H9%{qt`><-!;P8mI)@2QpOvgz|n$Vz|(_&dnYKNffAWx z1;0Qiq;%;76=PTv*@+@~cp?KepJ0irJ4OYxct0WTuur#-iUGL%fg~tUWmy19P!=xT zE{rVQB8;xuE}Sfm+9I5!CMf7yDd>=eOZN#-E4YBa540)++*|NS4mRlZ`rqko;L+_3 zYG}Gl1dWY0g9^|hA(+EkL6hDuLDQOPu(aWd7MW78v>^yh0gn9JFEsE7aJ-g>#wAFA z(c}VD8Y~4GhPXgZ`Vc^vdBTMeJdzDgAPqbM0%)T&Qvd(|$2O1%4Sdi_6-ejv6MU}L zA=oiIt$8P?j%6s3Ol#f=s&pAj_+iCX39GBo|JTfp+ZnrOf<}ZuttE+GXGYKLA1P;CuaBMsP8bx^|mbe7KhB`(6J1ji8oM z_XU^k1K)3@ff@uC_}Bm9U;nB5_`&A_jmJSo9DE_b{N4IHDAj1V^ae1x@H<~P_>Rx< z;3FXy?rWfmNWs`A9mOhtpV8s9^!N9 zzL3^>5?mL8+kvlj(wcuVmMZgaZw9w6S`XBTg9cfkHKYswb{~&_X^#I7zGimmK9%NZ zeUZO;B4{WTv_s9O8@w;x)A~gzYnt_^l00|;sDM@gazYEhQg;6Bhg=y=4#3MbD>Rje zY7~FH7jl9HQrBJNZz=(0D$t1qKHXcuO%ZU=L&E$Syx{r=XMxj&f@k+l7yfNCA+6+z zpv=eLycAT!yTIDapixhc?nY2Ag@5}cSN`n>+`4@Zu=w?g9DpWA*KQ^kZI%n&J{MRV zyDw^A1hqGLTQ8MzLfXNuMzCxR7 z0bbU`66Dp(bHKy;V6luN|F(%Bk6Q%rl(IEc2r!fic{Cr8@UT8u^v3bHqXZ~n9`;S1 z2pYI?wVs&6#K2I)36cN}h#dCp?gS0tc=w6~`Sh|}bnNwFbnNT|sden`1Wjx?c5*mE zhJQRe9R&U#bnNtCaXjt-8bM_6NEUGEc3^={sU>;zI;ndwAMotvIq1=PvQz+M31~LW zv7-|-D0JA>+T|ceoghfKnSp`9@mM2BnBlM|WNOW^+vOmKBV=~X6*9Nx*a@CogR2B- z1@(d80v_Fs8lZjmms}WGCV*$&IKUkz4~V#9_mA#N9=$RXATe?Q+K&cJ@Pnqd!HXQE z85kHKOC>-%O`{n>J0(D^Ck_|>{hgq00c4sO)M*$@)5P6}4m)-q04;Qb1VA^6|3M3| zenLI%(cKPK!ZQQZeSz#42KR12r$|A3t_>d|X}we-;MB{*1gb+AnjaqE_dR&nMf;HP z0mtSC2OPiOaBV%{!tZ|oWVP{u)=L#!AjPdG`8^LFcGSMmdWqlvLieG=-Ho8L5nQ?_ zf(}e@>Fzwj#K7SA{g$Kl!PZL^BE39Jj?5<ew8=-vo)nOoAApeGqD9>!k`Ah%wy^P>aJzaI2@DL^gR`QZQm{~#^h2OYH!fCk$R!dzsJ-2!`%YE&1w zcAs!;d2TXE1Hve=emEzxj=ruq8{zJ?MUUTs8KQvSO(8V8}jiA_Y z>^{)^z@Q|!`G-J>dGim268YvI2Bm)8V98z<2Y8Xy*$9fY*Cr4ds0m;pMW_&LA_l6G z>o`~kc>Wz6@s7<8_)A%Po&LWTaO`#X!@vH}%;rbzpt&37PH+M_xD(_ej)OZv#&R6o z2}(2^kX+o|C<7i@z6cqC_DKehK)ZBL6k%duaJ4>Fo8Zws6Eq?3$iIz6vI9H;0$Sw^ z-nr|-zmJ8{rLzfSglp@8N@d4hM@C2ML$%tD{M%e486El8A8-Vn?7`roeE_P?xt9f` zq@Kg*04SSqfVb&$Y+yX@BmpX{4%;y>FuVnCqXHKWpazBjw5W;H01aAqp9VEdyFY?+ zUF(5THN~K6sn+h6JlXYfJZkY|2EJvYme>~pt{+k+fkr<2WSSo^?#kb3;*`UEexPduoFQE z-J`n`ls!BTK46Br+?m6pyBoyj7ia*D5%3E(g2p%a1vy?=$;I6mPfaTL$@PKXA{UYk8Y52k;FMVn?QzobT@+x;@{p4Hnvyf zM7PU{2h9f*njakKbb5eQ`UOn-1y<=VFzGK?rT@UB|Fr(+?}LoSIZJ@H=|Vzt7pVWn zFW^z&(cK767@ds^Kr3B#g3rc*jLq;1`luKPyvl)Jumh9{pmFHY4Yq|}pb@0qqq7l|y}KJhcJd2! zf((JQ4fq8eEsld1CW6K%yTL4e0q|sIC%C7{FX-vf30c=A&MGvjz8s29x0z{mi#E3Ff}w1!{Mv7&P#Xp#(O#Y9logkKOm9^%sJD8mo2 z!=)2EHO4R42%2Gn+QBc_2@Vm6^Z5lE!65>1E5BeTDB(c0^9weDQa!(5Cn(+gpRfRQ zl+S?@5op*z+lc(FpjFJU;NI5p1Kh84Q8761khS3?3kOGYZG{G?g9RQwYuEwqPnIU3 zC4z3B6AwH(y(2J%UwCwSCtwPH@aXIYXCY`3g(O%H(6paNXE!K9A>~*CsLv0bdu%=u z5Pul7Cj+uS6STq=!U7d$pdIik9HC*3@C8yH-7`Vi()gQC_fAlh`E+MWfQAVoK$9s6 z{PGSAu;n_vd5oUjXQ5N1E|5j^pmwB3uQ!XQ^?Ckw&|IcV_c4#&U>47V4_J-A`7*bH zWCXe1Imb8NpIQaLU;NRxN$bG`G(*v~e{vTY>`9JrG*Dn0~m>fGD zIQaK@F}^kiX;ua)2kGYD#szU2Sflqp{%y{XQ|w;z^KXM_+UCXR(Hq6&*y+Ku3tUun zU-IZa?9u((rTbo*YwME|dH!t-9?gfDAeLU>-{#K9ec|9ECYSC@FMB~va*)^5__r~` z6*z+rECC(C;|zAH3;+HLAe&!@gZv)Hzl|9b?#Rk}BUwPo9bw9E@NaYc@4|h9e;Xr2 z*$4h@j*Q$N91lKb;@{@TbnqG2IS_*#nL)1MzTkN95mWbX$Ib$g?yruW0Rpa_5fZMQ z0Wyx?4l3}s{`?Et{$8RI;Mlnql-oSI{UAHU9JT*@bj|}MBjC~2RZzROyI~3g14Cz{1B3%|P-mkHgagX`osFR0n`3vw8n80Z?n}?^22hIh z=xp?00&RA004)ml=mdA}9J?DpHDPCC1tVw!gn&Z|s7!&dJxV|&3L^uxizAdcGuc25e3 z!!OVPu7d;{8=zd!vK)TF#tBd^XoQJh5L`fmtVXJA9Z_prkSw^YfK<02Sx|gH>sv?U z3fHl_!GsYMa-g|Y&+Y~bP-)f)?$9~%Z*KtY15N8}1f8qq+1=m)kp#8cj1Pb;2>>k! z5Nrf#0$Bn&k&0ii6Qm3zTL6&-og@j81=YX&f}NnnJ0Un)> z5gwh62_Bt}86KUE1@Q52LC~UXc0d<$gA78f)0u6-VJKLS^q1x_UQH&K(e6woJV&v zs492qJ`S$kk&OjQz)k+=*nNzD`}xjpkWnD>mxI<9c5Vi($Ke-f24yOjj?HI4tM3H5 zLA5f!pmPPkKr^Ts;1`5ULJ4$(%5Z)`@S;$tCVs(gP;TIdX=(iKk(`P+5GE2e@h%_ zo5{Ch9Q>^zpzSB!{v6*OSwI^H`CFZt85p2j1^HXem_b`<8bKM}r?(fBw;j9VWjuP_ zGkm%yf;K0*cIPYjfCi9UyU&5*MFX@-O2M`JNN0?SkK_MIAT8Y&KvA&_l+L#If)4I- z;osj18X9V@9zbbP~8VR!K+^mK49x~ zw{Yw}0A|?mZ*K(^SzwNXWA{NY!v!?-4pQgAzr7W-cLgl!bKE_lxFj>l@!K(h5&@Ua zevr#tI;Vq7f6WWywu87H-Q^q&zvl9{f=)X8=ElLu->L`dxfy>;a{-;-2PR#>qz{;M zaIxI>2DC7x#S|=&Exubbo!_$`1JaKH#WO=AAxNcbg|e5+E!Vj23kZ2>b3Ox zs5rnCyLfb;bL~C?+f@0w9K1_D&9V*Dsw^?#-`)n=QkmB2qT<58zYoNA;osi|Dyh3K zI%;3w-+mCfv+`i;CGgJ5*ZTb1+dz9Np?ao)_Em!PfW%y^4^?u5wo`(3SvtJtg730) z;NS0~;?aHC1rqi?o#l{)X8hZIRD8NGce-1+be7wI5;y}$rHfXpkl+Lw-=)RB84V4{1GF!tDrc(}Df?vJ_lleQSQkSSsjfu^lw5UdquMr}7fC zsK=3i*E7CiuHB#mEnb4si);6}W1wSreY%f>o#_ePdf9yg6cC`(f?bVI9(Pa3DJji& zH9pYU4yx@OyRUS%gGwQ=7OOuRv8|xDaa`Tf*r9p@OW^_9SK=gQYgKCR*P-*qr z0W`j!;nCX<@^N?Q3Vs0x34TFFegO{+enC%xPy7N77N7V99TggvgKYW#_y7OaOC?<2 zZ@C&D0NdvH?HCj2L|0#nhMiwQeXbId?oLpfzV&2@V)IMJ5}oFk%q4uFQGMy=evlag zuO%T2gVzEOhQe!h2!q41`wFs0@J3DRw^C8hZg+>Y<_ac>Vy;H8;h;Vtxds0=C!|I@D_GEmf148hEmdh3A_T}S@? z?g@_k`@Fgz2PjamrC?OK237u-|sKQe7yM} z3-bv_Yk!V1(CCCGbod_X)89;>^Q>LF-+(r`ft=#fxd7B|0C9af7l0bD9@h8x+s}fU zD%+~T9j3H{&pFb#e|&RQVB&8DO^JJSA9LZ~{@g?Ru&4ErT5iX^prZs{f<`-hy4Qj- zsSE%1?~dJTL5(3t>vzR2p549z9=(v&!Qjf;wfmfBcPpfAbrh{_<=F|9SOeYw;M)4O zl+CgGovZO%{_STyy4Qf`@jSX)K^Ap(fb0Mr^46*ds?9(<_c}K~JOozY0kXNf0c4X$ zXCugaX|4Z3Tl{)K+I_o^cz_N?>jcSz1QqGqQHH-`l4lVyn`1rRS^yvQO*nQHI`QqnQp4OL&R)H+_?e@>`>s7hS0NU>U*1y+; z2OJNsjGzTL=lGjJ=QR2B1~d8eMl&MTXS?ukV>15l`0W5wiHZ*>-b6v|T9DfgcmMSG zfB5@-&;N%U`L`WV5#V?I`C8lY+W~=6RUhkX{O#aX9^05fX#kW7J(~|R@$diP2}*+7 zod0wGV1Dn|@Zhaur>1A~K@OJ=CXfGze67zF^+FsQpJ5Dgq>Qiiz2YjLUT-F!-eAVG z32^tYfZTJ9za4a77C5X9!QFEZ>>dS>d(<7j9Z)D$^szoy9uMjjLwng^M}XXN5Oky- z%q@(Lo!Km&&4=NRxmPp+y4pL-GH3W$^70o`Wd(K!QDl)Pqh+zTqj9J`N# z7ZHLEmc)47#KhuNyv6&$S5|bJ){7?86v==yHdij`-2Prwj>sx?oW>0 zH+{N)dUU%h`1Fe0@aYUu(cs_iE|un}eGt@&RB~*1a-xLKqxp~ksOE-r^FT*yg4ZP% ztY9j2aO@7_V7_L3xmd@w+l_~Rzq^zR^I;e31I02P-Tn&QIu|{9MJ{$1u{de#9CXqy zImq%7G>8ly@OTMY0`1tH$Klvr#?$(?l%w?<$xg z?Dm5kOXS!cCeeMvvD;4u9HiZsyU#+`>UCf5KG*#MBKpDco4W#IsgGy3I|q1-JCdV2 zkOj7j=rUZP<2N@JmhKNF${_Vjr81t#o2Qja*_w|kG(SDid`zMF*@4!#r7W%AO8CJ; zcRnf#(AFR*I&)MCKo?cy<>Xcy?D?z|U4c9KpcA0P6g*FkE9`U;uUTSr|Zf zQbAatkqSt=$oh%nUkVF$aI$bVuAc-`ChEPC)0?2}(E;dL|!h?UmpOih#h7py= zgd)f6(_O96JsH%4hgGF8XZ{5Bxq3rDS8YIA6a3pRbVI#x7bMrson}1|6w3TOLrTNe1Enn8@4AnJmSI_dTn-xu2i2uHDix3#6yod> z9kA1oU6s~)sZLUxrWj3-JB{_Xx-4<1AjCEH6Q#9^LKbjGMaHXnUE#8jFKx(p*J&84#)l3Cmm(mLBgaqrRH21@vTy(~vT^_&N^|Jfau z;n6uA6#dZcj~<=1T)Cq=6r*=BC zcr+j8@U*^PbhkTP!Ka(O`4JOn)Eqou4i5{a5>PW;0Tdoy-8?TmI{hOcY@Zh#9-aOP z@Gt|bQ-R3|cy#uIq7%lK@aXIZMQ7`!QjxS~a5%Am*0w>4pY9jkM`7c53Xr~MeB9xc z3=9mQ)W^aA+Fl81%789#b2aEX375{* zpgnSFt(QvFdwC`~?l1z~{(ExA*)wO(I9i`@SoUN5J<7USjN%W4H9_G)(xgX8NUuxazoDFNprF62DRIvN7Z(AgZAQi z^n!9ag9pFM50}o>;ImjDs-Y(ndGNbjfS!nhIDO{?l%2z8FVCtN9S(P<|dEM z$)GzhJvzHHz%GNd%J{c6gQicRMndg}9+eAqfDg=8(1l?PKD|&1d^(RuuP&$`(fotG zJgB<|)COnpU_Sf*p-*QwX#3A=TaQlgKA_hoK2V0XPv>l~l#)m1ZZJdAr?VN%5b)^S z3}&$VKp5SVLA$#g_k+%k@JRmUxDPZ2;=v3)cg+!U67n|o4)Eq4m+k}n`+7jPVlZ@e zgI1Qbo~%^tbz-z`1}#b9@4YS0zyO+11Fuj%seJ;X2((ELqM(15JZL^=8^nn2V43cN z2VbygU+4@rsC0L+SPk0z#@{*{tZ4hyZwEh=X{Aj7ok+mH{Z!ijLoS^<9sJwCF5%zS z0(QoM7cBhS4y0LMD7xX&nQh?Meboi3!m;7UM9}#&pj{21<10N{PnNK{baTEIcj@*v zc`X6zwz%*^o#NR1kl%&*luM_#Nq4n^i}iW_e$Z`mKHbq89?6GX`L|s-)(o0pWpwGx zmhkK~X?AS<1sZ|oZ=WT@z~GsD2sv6nCWANWs4((xJCSzqAs=WY)%cKO!w;5XnY7Ms z&^o%b&SucUy0p%2(C(nL&SuaO1W?b9zZG=EKw4)vXzj8`_vy6GX3!#Ma9Q=zNfvw< z0Gm%Q*bx5hVJsfdBZXQH@V6?q6n%b>ZY z2CEGjAR96|T~u;lHe?{126A_|i%Jf%7${(1{(q?kHWh4NCma8MaPW4zvApDih=cTl z#X*`t;@_lE0t+M$w)o{;X;5guZ}@t7RvL7uI$K(2GiYJW%YASzXifFY^>8j|MfJ-C zAXE8TPnLK#|70wY1D{g^OW7?Q((wIFFKa;hpwm0B`5 zL9i;&tRBB0c=iX>$mbV?%>M9i2e}ipj^m{m%q2$6KNa{wC zl^}%>D`B%+5L+R$ThM7Ou-%~j6E9~;F)(z4LctVl_czdSBWQlbJ@@rm3*CB{TBr*^ z%>sUbZm0`D%>md18Q2A&g-kCcU@p)HyPyP%3&7zBs(+#32pV%FF|jzQ@^$J)m#2;X_7@hz{AtW+E0SaM(J!UV-z|hSGPFJl5DtV4O zOMvFUU+PLSFzf`?$kqq>{SS76&(V1)A<4i1Rtc@II(LJsAxKT|@|Oey160DLb2YNe zZ3&Paoz0-_=P%DmKn>xS2TgG>z%rZ-BY(>#2~dF#-hJBqGNObNG)&L-|NLvF|HoVZ zmtK8232G2%L-EU2C=1#tsQXsvM`UJjl z(Xsn%C*Mm3kW4q5YwH32zW6`?|GQWp;_nap^Z&miRKHELXD?5)W3R)1pX39*PK+MO z7d#I>VDju00WVu)03DSBs**ZuI{v)eBn~PX^wO+XgCc>ynfDLqF2ypIH0xp){^tL` zL2ER?=ktKZI(uzScyv1l@NYkdbXt##wmXZqIOMDz7yj*_18BfEwgp#Q{Nd7lqWcHr z2&nJ(K_@~%4yic?-Wdkkll#&LY(HO`wYLj@^Mv33|EIZFt_GE4yZ(cxNl)$o-Dd}C zrGO3>X1>V3?FVQxtIB(jI#5B#zwHFS%XtN^moLOXXHYbQmPK^eu{i!e;As7WzZtaM zz^A(#v_iw9m#4nF8MMH|vsdJ#i#6zYgesmA4agw~7d?AfPWo7%DCVDFS;bSr>Ct>h z!o&JP(I*e<3;f`nhAtLa0{kuDwOh%}pp}=_&7h&K8c+%bP2#;w1G&IbkH0Tg43sW; z96Y+g16&@xJSV!FK?~J78M~W7ZI%BAIvrWM*+7d>Is*kjp#e6~rQ3<6TL_$(Tsl^R zs%voC?`C5JU$fW^Cas%6EkypdzoOux7<353%a0H?=wPjv4@42+UY-dKp8Cv z_%K4CWFg4+C9^#sJ_kDs-TOJB1bp3D$pQAb2Yx@lR0jK?8x&xU%|Dq-K>-Y!6@SSJ zvY~r7C^B6jG1<-M-OJ+O(JOM?!}?dTcp5)w8;qqtIR1`Hcv$}e#ow<|VHfLW(9~+N zuw$uyl$ zDr4)M45DGh2&mnXErN8T3v^F>^Glr)P0$3OSo6=A5_yF3l6x<$ML<P__m&!nKcsZX-Pk$=jf{c!<26)(PGupVkT9>-^F~7}O|% zHqoq+IeK6YqPZf6#^*!h{}Vzo>7x+H4|ZwRyCDUb&v#G(25#tpPEF%)w*LPAzfW&* z1^;$%nE|SdO5LHyDY)=&KMp$21$=Tk%LUNgso+73(=Oe9EdM8i4h%&-Y{8?O<%LHl z%S-<4U>o?ig9}7Z2KVR&7n3f~GrU~19a*#mK{*?Ih#AN{kYz5~CqR~fF3trNf6&e0 zP}5-N40P@WHN^N^#Do|a(mHp8+iYAy3=G}i!_T@;Sys#N_kb=EL^;3$w7>(j5*V~T z2UNs^QVZlXH2&=+9e>gwCt(!v!`gDKr+@$d|Jn_4Y(#(uxO@kD19uS*K3Rc(`?2pg zz^6EzfRyf#ZLBVqt3m5(>l?a*4ZuZ2C)mZE!6q;L1sNE+FGB5x*Juz$!6p!OFSP_2 z7(i>o7&@W7O;%8^(F0oBvkQV^TF<3>GpI67v(9$mZ$1Y)C@74@dNQcv&fmPB0h}`a zPX_g5yMOR+{|c%mKrN9{Yxu5qaQO;4UZa!cBj%YKoh~0)JizI}JHVrx<%35j%SVrH z=K!#8T|TgMi+q6O258)Y2F6_=8Ke8SHYoK&Prx_^I;!G2U8Aa{v*xt{{iOn9?2K^xA`zJcKYo5 zljdrDsO&nZp9wb2xtB$<)7j)@CqLA7aE}|sb|#SR2wS8085nwMam zQ_%L8Pcm54qqmI3qZ`so?{$DGb>!bBV&TZY{}})J3!r@-7K~}khh}uT{qbym$yj<6 zC}6 zvpXp1b+WyT1j+Eh4k0{IBn7n$p7tHPk9M-XG~#1maQt?F5mY~b7uO@TtRN>PcCx+X zg*Xc|f`}pwI;^3S?d3aOP{sfifsjp;o}WNP;BoMg^pHdDprgsI-7ah_j@=?`kQ59m zlwgMkYJYDS(y@(pq`vXkwl6fXk<$bL}XSTMlhKGT{v71lZ7jhA-W49km_YZAf+{agTvc0U}0fmXP2k6uX(Akxs zS{PbcbPMrsKaV&8>NGqeU3f4vI3yitflWL8e==w&4&;9@A2jp>S{K$_S)mNt5rB~Y z#SLmefL0fGvb}uE&A@Q18MHBm@#RBq1_qao)gaExtK8sr1!zOh%ab4tZY+-7XD!+I z=N#HrV22^SqTaFlDF2iLoop`^xuKmk7fU_`Z*`Taqi(rl1gJ8SUxIe+tsxBvflL%PO(kPB8ly1PN!S36mD zzI5OOh{hq%GbP(VKP-_N!HZtf;50CC@=-J3F-9G() zT&%l6RX1m(FSl(4a0@7ILh| zOE-{$ZZ`1nDlAz;$1skATRouVkgz6?2vo77E-1_(ZD$n4;43?z?W5=Hpp>4+!ryY2 z9i$u)#AjhLt%uQMHiP((fqRJUpcWU*_G##nEDQ_`Fv&`ENoFL;7?32|aXc;-t3k6a zB|GMX&ZvtklgIxQwzO8=>fTQ z8v<(Gf@g7%lEK>#|Np<{^XP5{Ew|y{eyYKQgAuirx&z)yg*QM~g0EvmDs?qVTdqlQZ`WDuVdlg-VB;UN&^izoOuPRe8tj0=i(lC_5XjG^>zMsA2tRC#3Ct# zqtgB#YT#jHOtZdT_Ua|*x>&Ts7w}pB1AHGWs^$JjmOH~NKhFwE4X|(kS*gPK4`SsO zR#4k%2Y9Gu+ePaOr98))L2FnUU(RA>U}!nX-vXK=aBMwSBErAD8FXub^`UZ3sG4p* z{#_3_i$U=Tx&WaBMVt#P4!RBjRh+vRVNw~VOUG)EbzqZtz&ao%A&c|!H}isSu(enX zGL6550mOmmd-(-?xhf)|KVboNa@ica&w6wVgWDZk9^Fl#8noM^!lU~TXnLZA$Hihb z*cxU>?sJac4zQGfViaU}2@C(Omz<8@4setRcyu4~v0Me3cL9rXIet5!09FXP5FRYV z;{n;^1DV$@Ijjt-@1<}j-%Dl|28QO{ppg-zVUc&> ziMrjOT~FPUL5tr#dRc-zdU=j}SpO^*?q;)ehmVK+1dWIMEETn$4BElO-wbM4^*S+j zLaroY+X+eu)(839Ye0i<+YWTP!v{h--C3YxSnS8#1sJ>8teZibj>4Ca_OZ!Gq}|P z+RFA)7oUY?dR*h>e_mVzl9yNi>vvUKvA7z zuhW0fh3lTZEDavkAIe!ht$!3}xOSg%Y<~CwxDZ0qt9`1q3Tf`Flb4MS%5o;~2n38_Go*xVB*|HE`*!mUs!;&(!T~ z(&;SYVgVk@F5&5J1|@7paNs-sKjPT<$H9r8p*$Eefp0w-GzVX6;bO5Gv@xyJ0=jD8 zrN)E*|DgxbIqnB_{$4vCcLpDc@z+K!-9KLIx>&9Tjhfa=86SA9yaO~Y{#pha z-j4ghq0Z&FA9M@^s8!(zy3RgE1>=GS(16n@9t{C{ga9ie0|V$bNEQYWMh1q>;FWiZ zj0_B*HBc-J#*7RM+reU1j0_B*I*Ek=wE7;jJAs7(bY3awAW{|v(8Y{f!0PH585kfZ zmx69yJq#8DZ5alw&tPEy?Y;q>5y`@^h>?K-G{Vfn09to-9IOs>U*!of3uNa>FbmWq z0*y@i$ShZQDk!^*$_x=oXX zft`ba0TKoZ95DZea4;}{CJk8_7IVN>4|{VmFgypl z3=EL44-kOem6Zx-MT@}PmkVb#!dYx$FjujPGccrq&65#lfZpD>UmT|QrZ@uw=*)E% zhPx6B44@@0EDTR17#JWi%_RvF6O?3NfW*0tBm)B|j#(JO;H)G`1_nqvsF!45fTX55 zk__Nf!NQ;_!@zJE?1I&@FjqZ;vp5wP7(f>#urSCgFff3o<5?K^6d4%qgLSM_goWg9 zMFs{)3d>PqU;quJFf$Y=F)+LZr?nC#1_sb23(O1^N(>C3qq>xVqo|NHf05z zwML17;X7Dt1Dv%*iGcyso@8d&p~S!dT8GWdut$l3;TKrl0VM{8-(c1eB?bo2h$b_` z2_*&w&~*;X3}=)W82*7}FDNlE{0FnHC^0aAMqZg2ZYVJ@FfxJi)*U4V1|~4;ff54) zGnn;6iGcy!8DMy!#K6D`7JH+_z`zD(eNbXx05uw!8NMhnFo32Bm>GU3F)(m~W&bEK zFn~G>%nS_53=CXgF&1S825vBmLz#hr2h8G8W?OHDkOiyDfU|Ox85rciVgZ85lIdVoQ`67_`8w6>!!XWd;V&ZeV7H4ay7*I$+r?aMliG z1_oWQ*dApD2GDM8W`+aG3=E)yshJs$C^ImC*6=ekoKR+90Cho_8O|s(Fc^V#Tu^3U zFb1=(C^ImafLS+`85m5#tUJmK3}#@~17!vVb1>_PG6Mr>nLRVZ3uOid&@DpD3~!Vf z7_7juAK>Zbi!uX)HCXJ2G6RDRnDs}Qfx#BcVo+gV@CLJ3R2UfSz$^|G1_paDi${fl z0kmj?nL$8>fx!_hCZfW?09qf+%pjq{z~BrPlTl${0L}3;GbpGqFn|txVP;TKVPJ3r z%W9}FFt~$RIw}kdpcMqn3IKWvhaFz$0<)gyD;00C}0QW}- zoE4$Mz~BRxje)Zg;H(rC1_ocSY=#O018Dy`GeeFF1A{+UtU!f<0n~G3W++i%0N1z7 z3>7M{+*6~%zz_^p*Pz0{0P4;&Gqk9{a%cyf)uY0|5DHc|L4|<)*P+?$*2eXc-Fff3YPB1f^fZKKk&bpw&z>o-5cSVJP0n~|RX7K1f;?wCM z;nC>D>9+9=s59f!y%4m?*|+20d*lj7cK{YL>xdOpe~h*MdL}(&f1n74h9Af(5|aw z5Ti3fz@xL`gmqX2f3qJ*pt}#GAGFM>*9J6b&(M9yqgMvPV&S)B;pT5q1F7qEQ894s zhU|oM>tfJFJ#Q?NnMiyC? zUmH`wA2!e&N{osH*r_hve8&GBwPjR5@c_Dc3*_d`8Wn}!aOf-mXeW+kjfw$(YbzUQ zq>c})5A4O>aPaOckaGCd@t|98Q=30@}vM>DYb1lbJ>3HLE8`%Cpl&#R9ZbGN5}JXz>m#SY5kaR4iPz zSyUXmK?g!;^QeG)?f^F4`erdl_i0aN99E#=C<2e1?%so#I%;6tWPpScYG4_nI>y#Vcd293nL z*6%(K2}^6g4F2YsETDNP{`DtZx(|T%y?_=Tdi08PfX-hifLOEZIbU&fH=FV8)&nIP zpi4F?;BErj;Rvy$o6Y)0(Nmx9H7cMDCt%g8pg;iSHgpX<^B|4_dm6UWmVf(opKj0< z?cL{mK-E$bRYKYJ_9NXKxG?P0>lBIE!BO(7gP{|`dc0#5A=YC6jk|zu%Xk z`vaWYeZkTCUa_EOw=V~y2|t)};b(cB;L+Wq0*d@nA;{(NETx>D-L4#rCKj(<9DCjW zTHk=lFd<~L9DCjWS>Gt-gy>Ny5p?Wz|8ISxR1hK{P|5)|B*cQ{|6z~jqf8#n$2lCW z@AEfBfUiz~l;|&KFoF)^2~qI?WeZPGx=QfuzU0&013qZlxBIw{_DQ7tag2$)$;*nvXMi zG{0jk-2qF=KHU(Xz;X~MT|i2SvmV_sDhWQIy^-K^av&E48eam(BFM4ECtZ8P|M+y@ z_R+o%T}$K9%fj#0%_8B}?IXeBqRrrYf8W zA_0`5FZo?Fg~<^Wl`yd+@ENDqL`!m zAW{j72s=ov4lZ%KV^ku#AqCq1!;CH}CY>=V5!Nv(G5k$zprvjcuyP$-$a^&Z`d`BP zn%SfKI?P&-cmXn}0>POAKIH+%hvj&X!y$2Z4jk(s6B1yGKpYPk2Xv4)=oUB7SzDkO z2aQ5|G#&vpV<0=@9AiM&!yb5jYX^7&7()tl_9A2lyA*uurazoj$jHC|+2T2g5q97# zs6!9Y0qUAUSfH*3gav9ymw`Lspynxr1vM&3!L?j zje%i3SnqLm1_sEcBlr$*>ks_R{h z%6W8)gAUa!aOoEL=-7S8rJLuatMx_K?uU;2eg|Fo{T_kZPTfcO{f_bbeRb*P`Q*{d z1DYOS05y43e0o{H#TRIQscW~4fJusYo>Ji4KGNOii~ICi@w zIBL5^fKKeHt2FTUCKHbYe6WFe;2TD9Zj`Zp7lK@S?^KTd6muGO|-^Rn0=4gGY zg!BI)N9zkk?_Mi8_WCk8TAwbKbmU)u8B}$6GGFmvzF5M^zm4f2=%hLaP{@K@uc7Ut zqR{DX(Cwn4qwS)i(&=u}un%-n97Bm~TJt{8AUH#rwPSZ5DCix#uY>No1^I>nD#XA4 zg=2RcXf2}kiFy{}+pnXwPdGx)6XV~0<29&hr~}cb0@laB{{(nP0PJu%0e;9qa{T+} zf%@gI`S|y@fewq~-#-s@R-E>Y?!(##!3U~?QfnV%Y2+4gwdT?7835X>Y3GXF2owNZuK@WEDSM!kw zNc|EY8+{lws|q>tE1iLX0d$rn3qvs@tT+N~{f8vt)o?M8*C89TL0x_b3v{0|KiP}3H)Il|HUU`bS(YwMp_yf zKIE!>Q2T;o_bG7vyL4apf7n`{zo{H_u7CF-P(pM7xzGbtng@XPv4c*cQE-fpk2`F9 z;PrjS?nAGifa-6^g-oEZ-~fdM@{uy2GF`!=dnKgNbIYSUh{M(Rn@8)Vk_^Z0Z!VU` zWg&3CcL#HT&N~L}8VWhZ;n8bz78Dd7(75*ipF4imr?bR@!=pQx!=pRI3Ub&BNap`B zkc5D>anTNlb2heRx;M?>Z;|@o|&yX*Lvp{7Sq|QDD z7kdb2IfTN`m;fDS>Cyel_>xcePnYgjF5RDeKwEpdT{+ykLk_Tju1fLhb~zy6+I*Y_}sv_b=D(XHMNb z3p~1AB|N%iPNZ3f3h+0BHc_}5KY=f0aOoEAc4l$0zEGd!((TRRXnn9g(zW$cC97-e z$$J0R10~*`-Tk1Ur|#>ZTG^$WWumL~p&A2M>x1>$F4hN1v}=VNwGX*!AL_o~2wiXd zTE?;aqARF4I;njD9IUUo9J`OaX59gDT=xa&0W{qo{vYSx?keEXe3-}j2Y*xH|NsA8 zyPtuI^o;IvPW<~t5)M9sB>^851sCQQj{lGCVgMcVYF)^}-y{I;Hl?T-fTE}Z6j=qJ zxJz*CZDnX+U^w_fU-R@gTDnd z3Dfw?prAOtT&qN&@mEPkL2{|AM{gr&1n)5a_QqdK3=IEIv>vGA@aS%2U}j)AY<%Ew zs+OGX9;{uXUU28PB%=lgqRH2>l#e*hXo69xICy9YFJ&)~s)>if@siKF^C4uAs=r1 zRa}&uQKABhkCY6M-h%X;4F1+gh+fbvFGwwDrU*oPLCpfq(Hw64m7kJV%HIyUhmpSp zbPZMGui}b=;&Sg2$HrI16-mV)hy4Lvd#Tv`iUnl&pMSgz{H=dLXMguLf~HwOhKevj z90;1^0r5doMj#qAt#i2XReohbafu$t0L8{ve||7Cln8=WSG8_~m;#!50jUN}vVdsN zBoBxNP1t~F(79m{Z0Sr*FzBF45WfoQR!|QIoQPAvW)!67fXygL&Um4TQ68tMk=SpYQy)E5Gs=LJgH zcyT5JY&Nt2w2lirCJx#!mJVjQFf%ZKR=O}VfHtUQg2jB885pv_EYJpmY%nW?nSlYc zLzS5!f|-EqjL_p58(kC z@y>ycG%IXl{9L+UH2wyaeEhATsJ0W>;X;M#o_G<2uY8!iAI zSFTY}fOWq;!A;y7mNhB`{H>s#HKq3_Xs-{at87UQ>`-QgA>hjfQXL5BG~n%^^ecDq}6^hSU1=**Fj zsJ!!<39b(8PS4JK3s9vDZn7A_90TqEfrcGGqoy9sM?4(kL8reS_J`j}14>`z;LdOr z0|NtuwUq&OHq;XaSf?Iz$^c~G0Cd_rq@xcyvlqewo$(5(1!n@eff63^yoh8+x^3%yB2bkGAzM#gX(b58D^mNR0XW{!@vDTH}oL0RJa0Y%Lo*! zAW7Fweo#sTr6Eu+3gqJ*2mXV)DoemagP^qGkk)zwl2Tmww?780sbO&J{$hOl;5!z_ z<|q8k&zN0}5BxvY8_eR^>!ZR5TJ3-S{|V4^2skN%lL*LRka1+sPIm#2%^+(*Hwn9T z^COh?21DjEVn8?fLe4|->~!aVsRuP@L8ob1%Ja9?f{xg{ZT!FWTZtB^ISlI96~Mi| z?F2+mY2?Aj9RH8=Z#&3+!}?#*t?tVZH@Q2R(LP8FVjNFHewTrw9XR z9MD?kM6sA>x4VGj|6`7wG7PTP=0$xVQ(v?008Mm&h9p75SgDJ43MdPMb|^uPT7;h96z0+W#-sU70&<7g z^@9(r-0{8Q0V#HTA%#x5Z+Dsjw5)LjAD<4Is|HV=?E#N9f>Xawuj>uaWK%D=(cl6- z?64D};U}nVQF{YY#DG@%cy#+q@NW;jlV&Z*-wH~m{M&u+@ozuW9eRa-{fX{F7hhPP z;BN;l5$E6T`;33P>yze(jQsh|AX+^JFtsAI@>`hv>W2YFwot-uFn`fyU%rp zSCrWGicAIVwE(Mx`U12Z%=k8RWCb>=*ehb-(G51JQ)I^f!`AT?WlvsP^ooGydm&rd zpt?arKcK!DWSEkF`+;5&H*}p3VWxJwXMlQKpphMrf9|*%A8_Gce*#n_^}1ewc&Rsl z1>HmL1yJ9BLZ&`O0^PIw9RK?84CYHn5>dwAEXy;>9Qn7q-r)!B z;0I6lXv5qC(#F63nhXE_10LP(1&#+FFfm{Le;70@2hw4Eqv-1YW7g#vMJHf7x?L~8 zlQtxocy#-I@PKuSyXQdq>CHzH9OFO*V(eit1_lO5*EoiOfdO)PNEQPF18DOW3quhD z14A{ql;ndCxq?o#0S&vdFn~^vgOr@0(hwpBD#t)P7VuCgq#OjTd4l8&P{SFLmq4pt zAUZ&6CLlUMbv8st7ZU>mq^s=^915zX!H2PS?*x^h{M%kZr@cM8Z-Odp$jm{yLCd8Q z?qhBNjJtvy!@^#39&>X5Gd-ZW$VCMdyRD$p$3WwD1s>h!K}93v?iEncli>ln;u~^A zfD8Zj58Y55pbkQB0Fwvw*ga6U3smxfW}4C*oBuJEaDfYxm!Li|*c{MspaM*}OZN|$ zL5n~;g?d9&Ko)^h0cg7y)DqD0UeKgkhG+Mg-T=s~lt=duhnBY`Y#yC%5wBT1I_toF zpwR|p(jW|oK))S+WM_T+^5%F!KeGYbFYY=2UNcGK&j?&7nKZ9+Y4kO z?=iPP#^!F&Y5EkgPPRK#Dp!J;#!Rj0t8Ne$sSr|G)R0KkU!S^UZ3daCwacF!S z8pFQbFF?gxXY2#dZZ`vuPFLtf0h3mXOk*`v+J<5L6mw3aDOn?et{;OPaDUfM$_P;fASzRCoJ&c=Wm& zfLc(X>3&dW+XGxZf=WMd%z|bdJ6#`u%>Z2t;b>$ z85sT_cC?OVD7w=fYvI{_u2)1JY)&V{rz=4_U63?`w52(Ax(e{O_F<8NdO?K06|`x` zquWmcRKy5aBLzx0NLzO;*dNBoNGZ`wAe&l^wf}gNw}VCp|z1ZbN1YK>-Ce-my1;2Q)wdZ9{bXN_cd# zaD#lp-wL`y(X-nX7dzPw7}rseuKZY4x2

    ~R=A(LY#&lLXsr@<_rDJ+hiE>k!hLEf?cSk&p!UF+fa z|M)&oesQ&~72$7E1Z{VWwQ%kBWdL~y98{noX3)Zx5^%E_a`IWt)!8 zwV>4=&-mLwS3OSvHA%qt9Pk8r^n!M7yMpS9ZjlMhmyshIv=ABDEMoPa?WfP?nTgN7ypkp`8JUBbWp1bA8jya33f+l`}>hY4ag z$ZHRjxnnA{aQvA)LT`v6V`9RJvz72OsC#3P%8_WdK%;3@KCIEH_ zXpppc9X0p=AxI>;wWv|@P|XjTVSA9q3x0xb_uYyQp1-wIm3 z4yt++Ji5>J20*%Ho}KOq5JOr)I~8_;TBYbFKr&;93dmxxt)AWf32B{-P<^%F9El_i z5eF4iptJ3v%@2rmzTNH#9^L2ow_o;bKEUC~e8r{v1K3EIYeD0Lp55UIpng^YD6fL* z9gps_@V2N6|8_1=2@BQ*a)?K#qXxvr)_0(y8nlxP(j9}D2})L;V2jW5Zx=ZD2zrn% zG<-lEJJ0U?1dr}m4gT$}44`dMKD{R0p4Rt@{a``i(S5!XqRpfGd|Ib7q~PG+?#+_c z>C9&B%TX*1E^@aY0Nwv!&2q6AbnOO@r}e#}J+DFQ5)we&Fqmmz=axEy+~m{kp~1f$ zY^iUrNT;v$sbWRPZb4Z89yE8y!M~j$&9T#w!?XDykFWKqqWg_~pcV~ifextUVgTyM z6@aEQK)pE&(ELU0VNgbcG;%@BT}YxWXJBA}G+{vH3#7RM@;yZC54Vfjvh{TMngr0c6G&4TbjBN`xeMB^0bzm0{U8lr&=TQgj0_Ac z3=UzAuvMSUZw!386AfIA-@0_>sAM>He*jGtfG)EDjaY+{M22hk32^D@*c-~^YJ33H zz=e+%`E-A9vCL7);BUPQYJh?!3LLxdf<}lSa|NKKRiK;BVaKZTZ#&@F{kQu?^Hckl z1C=t+u9x+_;+XEk|BwGaoaWl8<7WN0?Cop+6%Hlp2zeWr3Eii`>Kr>+{H*_$J$

    wEl7W#9qhW1uk|$gn+R6u#|RxK1dYK#>OG(C z2cU>c;BVawn%w9#cI>|E$iMxsD=5ZhgX0nut?~{GF#Gtoz3}Wl4+>e&UK1CGmbaBA zU?-b&n}YR#PUnSbYkgay zfUx5Lsy2SGwg--&*n_Nw%2CPi>^}0E$@l;$`+=hoHIOtJ7#JXN5CUg`>N`jV0AuL$@fvOY*P%wMAfZ}T*XdKtG`)2nqM{5xkSAKUJ6<6bv zpjLyNNB3#h?(;s{haJ1Gr%eFu+y$?aV*&5l{orDKzL?ih`)Bug;{#s3Hr=0Bdx9^y z1_eB52o=0C4b(*j@S+a_avHk6y?`q?@*nIE$OMi#Us8_em#h5pi%dfSOLsEc}k0 zY@W@>SUj4K33xQWWh|WwD&oMivkso!E-DhBfcEg{t`GqE&eo&(IFDoZ_ipaila+kk z;@aVVz-BSCzZRkenphM3LF{+g+qy_4Ca`M82d^I;b7g1u9qG>w?@1=SLenO;zK zfy{)1#$+HYSipxkhCwF6J-RzVf$rP=5L5;wfYzvY`hZr0g02=}x4z)n9WTJ|e!=*E z_xILICApw8+d*L%;j8_!`;%|?$L?3o-8_2T!5r47>bbg^txwdlb)R_6)P1VknZ^1< zEq}ML_6g|h;rAP_`Rll~FKC|td+s$;_i@KgHjn1R3XqU`%UHVE5p-vVj|w=TB0!zm z1nUpQl87c__c74OpiPToH@o$RqK_Wkg%%#I-%3hb50n&wnutgd8Rpu}v&XmBWDh7p zVYAnuSYDA6cN=IKNN0$O2dI0~xkUxESkc&z7s$z1}i|zBwZ(TfA{Ego#D~xy1=8; zb%jT#>jsZb*Bu_6t_M6iT~By)x?VWuqGH16(&=mfj&+Y-*9jh-&Kj@ze0rVXBLUqX zT)MptK+C_uOZ*+XryT)ZNqwnQ+Or$7WW};Fppfb@WLbaF5- zxVF6IZ*AaUV6dz<;BQ$1It#_J+JwJl7WlLk$jJ|&0E3Rw@NaiENoze&=L&Mf|7i!H zmOxx!1aX1m|7jaQEnuh?kZllobq>(7e@LnRQjCLvfxlA=yc3`ev<746|NsC0r*(Rp zc=UFI?u-Yu6+o+vd^}oDma=+ue+OL$Xt)cc3Y7dsAxkA%50vnEbeC~3AM$AZR{GJS z`@2W?F_644MBbw_K)|Ehfy1NqKyW+yJzmLIc#I?)Fg$;156WnZMpupx2EBbT?82=$<1R(41IWrz=-lrz=OV8;eUf zXkx?xBo7(N@acX5*?Ixm8wOgZ=KyMw8GyYDG8o)c2kq~0>t;~(E%PsUCr z&_;=FM&I5brcS3n9=)Clj>jDTGp4zAI{gD3ftcoEeXQnEw{wI?cc_62=q67aPtY7+ zXQ+fvXRd%_r^{J}Zs!;f&2o%I5TudC8>F$@IRPZd(e0c9qIr(F2r`0XUA&pV(%_4L zKr#Z|&EWNFoi1lZj=2ajK@_n-6oIDLK#C-~n?dW=Kuj6W?!(7i1eqBfyRW3VcDi`8 z`SiMiwhn<3ZiGjtDh@e{=l9 zRKml*pQ)3Pf4>t;rz49;^C1q8=7S30y(14i`S+i6?e;m#;L_{a{@?!r_(vbwL9djfJ^6OP&))9CejJKxz*6%i;EchtVrIT_TKc+CS^jpNguD*#FvpcN|tp50gBot^Gb_{1itq>O+` zz%mbL-#Dmw((SCUg0U35oZrQ<`%1TW1UM6QdnY({U+Hv)^12}oztZWP0Fe$+@#yXb zMNcO2`)C&SaXN4Ix^OZOqqZubaRa)Dn6agprX~Gvl(QIPiJ<7EC2p{scsh)4;Skf zC5oU0y%sLrCpO9c(wVlqOrJ@O);Np+J6}0wa2dD=OaxQ-hXg4xwqmPUA3;s4pS>vLT(tQC|TY-x* zgO{&BhuZk47`y~s`~a$vI;$-_x=(v_Ry%;B1Q9Br6_Vg;4Rn?Q%oLCgXoZBW$o&gC zoy9rAr`Pp?M>n_QPS99Nrz_~j*KX&SPFJ38=Y&pIfo|uNPFIm`a1!ivm4Fl&ovt$7 z;I!81ssJe+I$c#fdR;j@I$d9YN?8k!PS+0}y{@3Sfgi_RR4f=785xhe8h|D}kGq;M zF)%Y6cYVOZzyh5WbWt&YL@#JtLANW9Pq(m3w=YL`sDMkit3~x2s5}b4s_X z3?%J$yQ)AEIjB_V3{G%?#Cj(8Lfrid1z-=|ydR)+4y}@fH&^5HMmYlBzd=9bk2&jn(>x;)n#~zl3Pa%R5UJiKl z0(69t8Utt?1GIJ-w1}UD0klM77FhN)BLf3SoP_~&003x|gay1I9yCnN!Y~nZa1~hH zekKM6$au^>CI*HcuvjyE*l{bI1=@`P={o*pfnBl$+QSIx+`ngq4LkmUvy|bxEDYf+ zCpaq{&dP?f8sMzyYzzz#mtKOi{Mlg_10Q8)U;s6LSs3g%7#L=P-JHt7zyJw@77hjm zNEq~Uz`{U}6Xxa}oUmOWN8zliaMmk0>o1%o#0Aq)zy+H!1@)&C!k`^81LV$t3uv>$ z#4pUCvqk^A8hqx&Uz6)EU~C714*2S5`;pdCb@1`c?Yvhe{|;{&eNr}&#e z6MG)rdw+lqIkRjvVq{<_$%QQ{a^c_RV!`Oq8_&^w!l_pTbX@=g|27s259XT(A8>du zUw7d?z`xDKlF9Ml0}d#g8OnC-KHy<}3v~6U_h0^P&VLR*;NU*Uzs>s}jPW1Lcx~t0 z%fbn_h^704bFYXHx+PGEl2CaWjv0(PXAo2Pn60y zb{}@MK2XdIqO}izny&wkHUDEQ=XdS?==lF2$k$DOKq~^fYg7_I{j-SXe~hIeuC3on z*&O({9eeHT2<}9Hnzag!pfOg+3gp%UrTPsuDhhg~8ZNyK93GGb8lVOzq~+3jz>$C3 zdGKm}ewS1H+YY{Fapd229MopifM>Pt92HP^5InXNhqQG~IAV(Uw^g5M*ix}f? zMweWT4s?X5D7YG(bm?$WQRLr#%%#IeMG4e6R!MWT-U=F<;co^lc>`C^@cP+>fBS>( zf1cf~plM)V<|j_wJP#UwDwLEZmzXvF%uO#yE0JydS&&*(z~3qdx-oqtqff7`0BEcW zWd3V8#|P$vy+@oU~qAU&XK}K0dC0@x3R=q1`k%jb zCV1Mn6|`~>)LCKg{`V3z;qKHe^3c`zq;GdCs5$M~efIx_?tiTZN^_xZ_Uv8@lJMw0 z>(m|dfTtTWP1ky$)TjA3bD4B+@t=e5nEoGwEm>mz(R}z1cnsxj>+KS`eV|?rOs@MJ z|F#2{A2c8P0aEq9^f^qz_?x4peJQKcf0r!=PR%u244C;_K$Gg8|Brb#AD8fK{wK@d zqXfDFXuFGwO4|PeuwZWm2Yb_W(ET{uLR1t$`9ej}g@2omiV~=5H1O!<1*Hw2UQy8W zD!)8K%cW9|=E@%orA+@BTw4y5vNu~o*(X5~9AHkf1#^j@NAp1m&;nym>r*u+jSjqK z+Q10gFbYeZKD~2PK&i;HJKDmtJKMptyV%3C`!T#?I1D<<1+uclfdO`ZI_MTbPH=h! z9dHX_fd-f$tYG+XIj9nW43~pa6=aMLG|UbeBxhn`V1VcVo#+B#flh0Hq8v>6(|z6e zfKT#CP^;9yGx>#2r;mz8+615OIpF=vKFl9{m~Z%WZUJYN?(06C5OK$Do_EgHJl7og z{Vurh`yKBL0qsWm;n987rL#o^bQ*&vzuzSve!r_8ogpd~KAj;d4zArc*BrZfE_Yva z?l!sRsD0hJTj#P%_gfe3cb!wfd*B?cznAh_zvOT22M-lLd94iEv~yM)di5bhkxTaj z(0(2bm=iscfBRUUuaEH6{_Nc=bJ|n;r^o-}j@>MB*2n5u9hr~57I(BhUcRd`Xe9732WZu0=}D-;P~SrKw|4IV`v=qjH304MwE(3N7to$7&~Uv2 zIN&^*f3WcP9sl?LKWH)(ybT;O@CF*8%mDRm3P8J9!TGBBNJV_~VbE=mkfAL-_+ood z(WMX?28uibkM1f1(EMP8NB1kA?nApk1&BxYN64}syCkxp7C+9he2KJ2vDX7a5X;Qc=093r5d35!p=UBCa`Uey#bJ}wnt|h$N*65 z8q~Q2O^tL<11sx33tPSgwzIUzqkA7nDQEyV!KHf}NRd}BOSy;j40v^24e5!4z3`!pQdHc;>Z?KSBH)%ZT$hdjD}?n1$L`~=l|X?3s&+iO!FPK4SXKm-u!3Yj9docZK(XY|*$x_O z11)1rOwP~o=sy2{I;h-jJy0UD12Q8XqXHdXc8rTZ+#RFhkmh2!AKaRd0B;-G>jpV0tYMl3@bLFfxG7e`DYW$y|KV8KdIR*$!&bbcYML^g1y*S|8wV z0i`a`{1|BL3seDmICkIQ-@YDHVqSg>UQtv68WY|QsxCYZK4tM>eh2n|tI+|_AXvSJ z_19t*Q03C?$Dw_q^<*8V^{HCc?u(8a7(t`89@bxro`OnHHqZ^%+802n8a%`dYQ+e4 zy9@k3fNBNfr@w$tZ#$?Vh1e$!idv+A0j)8GOfpI{!dB*i z8kV4qYoL{-Au0l(PAvy$1yu-iH&Jhn%1w{PH=sfdI++gIcGX>E-~lTAO0WBXhUH7| zyLP|x=`4Nj(^>o7rL%OqPiN_RpU%?rzODaDIbAwS%RRfVzAo~yTnS3sCGUKCed~R? z4}+G%CqoiPr)zoZfzqqpq4lsXAVlOaXo(f5!~C zde909h}zQY;7#cquyGC4v5)&OVUO<6=P-7+Yq>|`5s*J&6%J@Yg)3+wvTHef&<(Wk z9_vk*& zza280-yK>HURZcc6?6zor|WUYUY<7VQ)N8IUCTkOoR@e0{r~U642qQH{JWm<7l(FN zTXZ`+Xj^MDyI6lH=5Xvj=E2PTngzV;wAXdJN2fEWqYe({Zf^&d?qUlUZDVb2k51S1 zE}f;zt$!A?cc1rQ<_2l;cIb9J?$POOaoiQW83VM|H5=4=kaqzclnrq$KWM7{bf@cQ zu$lbZKY-n#Z2aHR(!R_a7JvM(6HE3o{67wwyLk3mzxy2IJQPQ3{|x?S&>kqqZg$9t zD4yN!1+WuQJfS5a|E_0z#bJ)!?8g6F50ohTbf?}&H=Sn>sP0!bh|$H?LO+$?R%ep`!&$5*qyKwhdN#NgZ#Y|G~(fG zq0QXw?V!!w>H6Nq`XeZK&%whA6j1!Tp79pTb%)mb^t$ebxvsl*w@3E}k51R~KHV=~ z^L5v5_vy}E@6la)zO#0B>;Fbp7w!`j)>1RN;ZoF#$Dw zJevRgFHLa-o%q1az+n9oa)gPi@i)-fHK5(2F5S8NeY$^mcDJa2@}qaJiJ24sejYo= z?yLOUZP>u^~06y*?k$wrhbq}8Z&4`6`yDG zF(%LEH;knRJi24^K{i2xzw|uFTO~ps-M-g7pw~5n=XcI~bcg;2iGrOCO4`ibzVEG1 z6tj09gr{tm?$YHx-MQ?b)ZJZs*oC?D^Z(!^Jo%|-iQ>!maoe$NAGphh*w(XT=JZ9sSK z!1YfDab5WL_k;GUL-slIZ$FggsC_WaMf;R%>j97npq)_A^Ab?H>(&j`Aq@QcTflo} z__zD07<4*&@b7m~Dd=nlZL#9t4)GymShv&LrwbNCu*6Zi@} zhhUH9Hx8%+F$Nypj4s``z>zcI0%$Eqw-*?e zK)17xWA|m)d{Tn(|IQi}mChQ_Q4pRSj{h&U9w=1-IavYZ^zAMx8lBEQ9-X^E&Udh= z4uQHDbf*`1G{Z;50M?uHXg=Z)eHhf0dJjJC7PPYw(wzde7$HZ0cyxo)QtSVcWRLDZ z1JD}Z&Jq>qG;DXUhVeJBP%&IY0>X!`uljDe&qo3ykIUty8 zoH$&KFIig@T?X6a*z3dw3RP%;Ix#RXfHw26Ff_thph5t2i8>2|Pxl?)PGAuL{vIBIOeP^_Q@d3}y>=)fPJUgo&bpP<}OupgUS$x8` zGaI~J#sWO;=E1-Jf@imrgb)9Im4NQ!pveT!?l+#+ck0E!@=gsl)(oXw|Brk8KkQ+B zx9+{8^&kFz(14Ij_j{M_?=Xpaf6#s{P!|HMqeQ+p{68p;H5_~W7(t7E6u<#<4CE6A zBz<)kK&NDZ^tp6D1)WFa(+xS*$kqC5X^Lm^IhSshbKN25SX{MPPC9CboCIG+!~r_9 zA2e>{F~h_9V67Bl&4>#l%Q41~V=Ny34|rG~toh*B>&EDje8R)}Y<&)>&)~wya*i?N z9E->QgC5pr>pr{=Lvp2$ih^tRG1u<1j?npX*Veans-RQ3Kn`^54gKHk13EDAELe|g z_c3t63-%Js*)ZRLy5SaS{||svSfn{xGx7IK1b4ejR2)D{T|7WN?f}s8Iq;!&384Lu zpe;%s%||jE1f-V%+Jyt{Wi-EW@a!(& zaOL0j(6{>s=wKZMkM3V!2Rk-AX#mw1^T58@0h%iC>0Y-0ya4qj$Vda9?vJ3AK^86@ zOA!0mT#XMnd^^g--6Z) zDCj;|P%8;EZq$A7WiIGgJN|7~V9QBejSqlSg@FwL>pQ^TsmRE{(7Yd1HZwSa)=}D* znL~Q$u%=FUN%uYe{XCG#QjhL_&~~T)$2wVNT5kvGD!LBNP@rLi?h9!y*6lHj3=GBY zX%o5+{XgW<%L6@Dr#*oYbg3!}qenNC>B7k3(cKQZ`P!uuEDT|~FtYG(2ODC2p=h@w z#7t1I6>EUf5+c=kbhm>p5$`_r|By>3O9%h$u>fTPgXW3~jZ!rit7YJuXt-QD zzzoN&j4oFDK+UNVE|(54!*MI4)jZIim=cZ-F#Vd zwSlIleY*F62Mitfw;cuLdJC0?jy6$d1_sa0Z6H^Bbhm*{Dh8GQ8lIhPpyctI%f$kc z#XyH4K~s!`2XqS86;!6jNjP@qDS%jJo}G0ZzMXXfzMXj*zMXBLWa8V|2Feyl1&RZ# z8x9(l0`1}lT@}v40NOzV+WNx6zz84OTgwPOc$fRYwN317nwP=aD8VRhU9PUi=@ zJuO^~FF9&^dN_7F`Z#uaMlhe4>Dn0>qkYJ+(=*}X57(9huAPA?uHB8Gc9!$Hf>vJ~29=irps5znNGN>rrumJ7PxnsH z$d>V2-|h$9zdX8ccIK!UICQK5A2$Hnre)#Ku@cne@vvM8YQK~ULz^U^x)+o(LHjE` zx;KO5y07|l=SetP*D^TryVo+b{x4Ah9UBW86X<4S1r6PRb25KBXbm#>+(Q=Y>qSo- zELMZIeU!?2Sgr%5|56cH`hnR2I_KNNGLNIw3bJd;MFqZL4%{Qp0dJdv49s|Rx^aMN zW{}%J$EqBIw6z(1y2}K7TfddMz>NS^b{dYoVUSJcIVzxaC!kmYZxVtT0a~Tdo5A=J zl-PHGjum_fnum2YI%#~V^*?B@IcVuF_|k6hG^JBFi=vYyi(x6p|3lW-i(b6u0QJ=v z95*s{JG1!qvP^UBj%9G^zO<5o;eUOJhokl7;>?3D1RVL-9|pCE+%!CyPq}tq_UX0h z01r+2YX5N2zLYk>xtoRE(UQTp*MY^Af7?kHe%F&e+80Y-fCk1bUaNu3QFQIT4A$eK zeQAPYvjv9Y*RCxmOSyJ{R_46~4ef$7!ItDZHrq^NDCGp5GIqJ>(`#0UtGitpJiD)e zc0Rdu9|w)PbV9}m8Xy~j8A{|D_J9)#LkUy2olmzPNB4D~Za2_v?2v%$o;-sYbgw2T z0WpG(P;zX3%UGh>{FkxR9JUDD<9IVj5ojt7v{0mbGN_6NYk$q}0pTI12aoQ_J3vJe zbPFvgo;;2>gM=U^%mMehK%Efea>S2;fx!q|K5SxO0N>fc!T`G09?};Foj3=3dJ5n}$!>adcYiVuF!@ z0hB<%EfYuwK%0Sq0W?j_!r%z+6ve_>pdBxu%9DiwGz$s|2+&3I5Edv%1V9_KLZIzE z@WBNJKHZuw{M#ORbWa31&I8mP*a`|9*uGhh?&%uA!2R8~qe)jF&3o5aFTmP37`gYd~ z`1HC)cy^!P1zL0l*4kVf!Qjz-qcqs3vjTLG%JBx!HgiyG2viF7x`Jn|KqDofKDJA* zheB@vq=VXA>j1j+u>f>$T1y+aJp}1+fh71_Kyw_MkMIO=fvm&#Wa7bDQHm&|MtD0L<<@zbmK^KY(CE7(dh=X<32;(zQ}F0? z)9~m7Z3cI<@IXYLBmegMF5RbnI?X_#pa4H89vq2o0{q}L2q5(?pml97Dxf95#s|P= zx~QNlm*8(b2^x~=b#)*{xdMMH=+ZAdrbEUPKnVxr{L*}oQqa;H&`^%6@d0Fqz~&&` z47yz%S`U;uyBdE>bLp((NOS2d<9hAnYW&}&b2sR0CzsA@1((j2`H+HU8G=8UU(iL3aeDxpeLabzpqDkHg!d z;PxQAE!s~?_rbHf6_go0x;;QAo`I5sM=viZfqJwa@Zfhj=-Jr{N>U!(<{sVPJcD$< z9b{Ra7P#BA8MJ5HrL$PZ<9IV@89bpt}=ly>X!+CUB)li4q9KqFVGBf8owZT(v@GJ8RRs6!FJFkL4dkA(qr79c1vSr|aWWRUfD%<$tsK7IMxUnGhyHtWd6i2;HmM6U(j2i+tHxYSt703nvuT=6dq~K)l7{1 zO@g4)Y}!CAc#aZ#{{4Pg-NBG!6uN^snhz*|?wxk#;ot9<1Fo2m1O@o_`{jWJVah~~ zwS%l>bO3E30i7H24Qj3x|8{Qv?O_=QA3|Dn{M)^mI-OaNg}Q@TI-NQA_xnLE9)KAs z!N1*^Db13(NV(gYrPIBHe>-zpr+W_g@WoE|6#nhPAhW=(c&*g!%mG&7%mh-yzde|V ze>*o=uG2jQswKmtGv48NJ7{DDR1?ETA#+rqCuD*LZ+A>*U|@Lt1ay)NWXl+6CliDP zYH~nWpd&vaOF%%$8o~n2&Ol_97-2`Xf(G^>vL4NEG(aa$LWgRNL0dpI4s$awFx0^# z8hP!TNAnv6k8VqFM9&0O*B;#;eLzcGufy7@pfa(9k%7UXV>PHm0j=pUa5ets(g`n( zTsk&`3LlT|c2Mi0yC0NbJvzbJv$Gqs;Bc|r4pKp&-~jDS|34kM;OGN|C}@C{A+56+ z)Wz=vUlZ-pxfwJ{04mo&IS({YVQ{<|bSoL?VAD&<*Nv^9%NY3wMF$2cQuKL2wG=7w86!Fz^fZfyag*_Jce9&|<6&sTgZR zD#qGC4H;-L)&?rZx)1Wh3bHnof(*Ru7+#RIfnpp~azT!91GQUq&t# z1}+nJ1}-Bu(7A04GN5uEib3TBGw3*GaEZap0GdY!bpx0g6j_-VSW`gVKL)rCkSs(8 zXlWdT1sW%V=m41uZd>6o8&vZ$Gk^{=2Pp#S0MVc|?GV#YZGe~yGP4<^42mHtQT2ch zFJWe26ystL3lU@xGZA1AD-!x3@PO|CPXTuVNF!+A14M%`$juO6Ls%eNTfm1Jf_;63 z52Oe@R03jvWFhK6zJ{1eIzbpT3D~e{8>$4P1H?pC15pjK0b(x5OiA13_>Q{3_?MC4`4YLbO9(xCkTV`4n#ME1=4*99FB}4Tnr*6d?0^*;CsMx zf$IQA0eb>l07%yj6%Yx*sbJM0mqS<}6K;UTBz3tMWEjmEct3DI;JmsW`&uAAhOj^``Uchs&Sjv6FOm+BEJPj1Ef5yS-w+)jb3uptK#gXA z$b(!3VS#l2ftU?d0@49uqN;(Y2H5~H7i1>rm}8Ji5QfO3>H(dV%*?>Z!^Xg4!pp!D zgh*}cKw6*}G;{{>ErbPf5eGAMzt>5CxG3 zxeCGp>E?r&4Uz`UPeN%_H4xPx8zAO_%mf`$1yu|l?n8I82-sXmOM(sFlCXtoVPIeY z9ZCVw1z~|)BL&d~E=xEV_(Ry?B?7qUhU(UVm)Z~(NGIqbU}zfzS~tOTfMg-+Kt6!5 zKw$*Y0aA4cYA%R^$b*XEHOK~txgaw^XW4*Mf-poLO%KGk zGCT}2Df|pFA$$xnCcF$XK@uOt9*A5JIsmD0K-aQ@OaNhhxX&Rhkn4=Vrbw!CFo-is zGH`$3e87Hz^#F4Lq#Ob@6T!J1oUcJ<*dx`%py6If96(qg^DMyTDax}j$frm!aF~EL z7BDctbb)*bQ40z~2n%FBL>EZaQAo81vI;z$jBY;Ya4SS;f^>kCfZ z(!Yf10{If678H&U7AQABbb(a80~rFf03r`^9fSpv0!`L|LX?Gpp+tg#fh6-mW`6=1 zg2#N&lsd?Kh!T*CKrB=@KwJaz3&hCxtQ<6< z0xk_eIzW97NZ)@ISO=s;;bh=K>Knpzg2E7@9u$TU7N|sl=me>9hgpEbjtvkyK;?4^ z2LrMWP%uGE1o;!f0@(-A0Wudfd;&8bB9H3+Z4k2=7*NbbRRhrnvH@Z)$jpr}Lvgry z58PakLXew5G%j-?VF5A|bWSKpB?v?8Mb&c%Y%U`w3j?PS>jUNlNXZWxy8-C{VUVvO z=^erXg%N0=m6<^iG_Lan)I$J?F)+Y%fqVv03ko|33lvunT_9D+qbU%1kgFgpkXh%z zt^&7EOE|&i!gPRSA?i?Vf#?9K+6!_t6hl;^ntcUgHUq@HARQpZsA?ekKsG?k1(^w2 z?GI83!Vq~>J-49dGBGfG;Q}cFyBoy7Afz5@CO2Av!>+KxcNsjEBgB!Vba$>1JU8 z_oARmKsrE7R5cLQAR8d&g3JW1+y$uwVTe4c9?)h1W(H`P32xwlLIR{3ghAWNAmIaH zfm|X0b_paFF-MsAkli^xIe@U z4X_#Dcr5{iE&~Hh2gn?VI*>So1&UXQ4v;EP3kGI9L>?6W5Ee+c9>i>@5|9oM6IBgF zHOK~txgaxFf|NlqL>^U-3D{i7xEAW@R2)@;RRuVOmKjhV8X*-a)gILzl57X%!HRg z%m_R}eSs$d(rTOnn#_QjG8OI)2n%Ei=r}IexE>#aNC+>3hzSpa$RtR=@-t{k7pfa{ zCm+NO5Ee+c55x_Epb=jl20}=^Faq5BU(Tp9UzscY9OjXc0tSq znF%_A8Ke?~A@Znt;vl|G<6%e(;bV|25oC}|5nzxs;b)MX1a7y3=2jSbk@6^L-WlS1 z2n*yoQ2av2dWtwMupMA2fYsEM$BB;GjlG{P%!d!vNY=|pJHydOwXod}BE(l|DcN3ZJ2ATT}DGy>Z z8+05uBAtR_3FHdYaD(Urg+C-NL1uzR3qdMD7$T3Vrw{CA$$8ui^HPi%Bp5Xqcs_7F zfTlI*7&HR|XiW%c9tM>1A=$khk`Y11GR%gT84wmIjZA@w z0I9kQGZ=^2pbIIWV}3`tz~;hq;4&Mc1Ek6tn(9GTKIzTE> z)j(8(Tn{l9WF|9GdVt8I>RAIf7i1pDmmnHd4MZQvTu4}e%$!WX+)ZF}8RfVbw#h{zSAt@We z0=eh{Sf`>88-q{@KLc+F9|Nli$ZiG(m`;!nA?iUXAHo9ld?7kPsz9q*pjLqIEl0QG z8pI9;HU@?geg=jRJ_ZJo>;Rb$YQy5Q;||mgh#HWqKrB$mLR<{;D})8|9mMS*GeM~x zq!NT7@~C;Ov z5FH>@w_ye|Fkm(N3&QLW4)BUDm=0WKLv(;tokdEk5LckO`xnG)1_l&!QPn{7fm{zU z7i1>r3{#l1A@Znt7+7IFBjnISRRhrnG8YmSATvRioZ&N<4Q?(-707H5jmum}{DI8; zL?9e^z~(Z7a^58H%xeOh0V}wS%LiEi#h?R>ASnyN0);rXfb>K1^q61{^dL$o1>;{Drgay(q zhcNpK2LrMWkSs(Us=FaNK;~Wt83lDXL?uW7!UE}5ftby}fMPDH8i;C;4G?odW`fEM zsIlNX8PLN+3vMoQSl}`j5*8pcL4*7F%r$_U3sMC#8${zW7ZQJ9Gm%D=A^t(tV+J-C zUS3^*&7eVA03bU+7<3RP#HSDzC9k-!VgjeZi|2zAX$hyP}o6Opi~9X0jm8A zLCT;QA`fyEgay*=1TkBRjX~-O2ZQJlK?aT#0kHWnognid>OrL-gaxW)AUZ*+wjrf1 zh&-wt9uPaAZ5@yfkb_XwK=grp0WlY3=57M!`oYZwnFsPMh{k0uBuqeNf*09=lrk`Y zuP#Fm?+~!L(D5b6staffH594~M1jU_AUYu|P-sShbt>|*Fz`NMWnhJ_+k)u=`3|BM z6s8asC`=)`K&rNY42EKeJjgc?7RdYri20zJ;Ov5FH?MK?krwjRx-) zM|XP~#B2rz6mwDSN7w){7i1=A-3vZ*bKvHJRDs+KqH&oE2@8;!pz}dNDnS@xFRGp* zu({yX9Z4J?*dDN4fXqlUFa(0MKrv{sIK-zA7ATx5z&aH{E3l5RG4Pl0GjOFKT30aL zpqPQ^0i|{b3)I(v=mx0*EiZ*y!vK*7xe&qv*;5Cx2dV_51H?pC15pi%Gl;n$GeMUw zf>eSqL>^U73)oz2BS)ZXq(Hhr7<48M#ODwe$VFWcom{L8TuE#nz@rA>dX0erbQvm0 z7YHwhx4j`Okj@EUo#2#xgr9-c1hOI#rVHeLh+0s}hOj{42hjym#fFrZA@U$UL0BO3 zr$NjIrR*ncVAsHOfMg-+P;G(e0I344n*zBTgdr+X&7K1>n*riWkPeVaR5cKNAR8d& zg3JV6D-BW!!Vq~>J&WMxf>eNf38GQeK=gskg@gsj%u1xb7DOIZ&kC@)j4X@{ETE$u z7#J8p*Ls4?24T=)h>&=Nut4Fn4y;2`k%K|lM1(j18mJ6Xgv!|H|WlD zh;9fAr280HH@Hvmgp+~w2uO^90j3M&5{O!mUm+||h(dIMRDm`!;xqpY#C)g{kPZ+N z;t4zyQ+$l7*-Pi9=YRID_Z_sRA7}1Mv+514JI=G6)N#`xV0M5N@!!FdZOS zh&oiWAv!>+*1`;Cz;5;jh}jGf_kwhQG@#m#umNH&$V~8{Fi0s5bHBmO1t|jg5=7%N z7ZMgAGeLWWKq^5PVlS#5&@l@MdWBt#zMDhLatn*(Atc$^tB+l;IW z)l`TsP+o=T0+|g;pJ2lou)CcPVm<={1G2fOZh)8zvI}A^$V|{yA$;bFz|94z0+|h> zahVGV50IIlEixdLAPlh=RgVJw{-28HJb`gbwk2;DL@J!B*yibb z>r#~CVUWAR3GO|K9pPdSDB)({3gKa3F%bl5gs(IPwHzUOLB5BuK)#2V0y@ATvQncYsuaFhm|zj|2n$p?Ky-jqfo^&PYhhqufXIXV17U%5he6EdV`1O} zt+qrnAJtTdE>KE>m=7`=wDlUF`7sdlp-Mn50x?nD05KP27sOnUnV@}`AeA5tkw?{& z1U46Wo*%Mm45XfcVGBGIAuNzjGax!Z4$vw9m^GjsdJr8D7D&eohz_KcFQ8Fcm=4egC`1Q@1=2AOq5~WQobXle z$nka=?t2IeqziOa8Fa2Zg@b`L1d`)mxa=Hxd_4n>D~h|8>$4P z1H?pC15pjK0b(x5Owh$WAeA5tkw?{Y2y8BRwe=yyY$)hacERYI_4v;F)h!DtJ5QfNuTm)f(bf1Hm4Vr5w$!w6hu-P+Q zW?zArt;EKl^o55(;E50eM~NTaC1SS z2Z|{Wjmum}e1go(C1CCwu({ycWfNqT6>>ds4W7CnEKmyg1l9r0M=6j|XP6F;@~GysfL#J! zDe^=R#cW(|hnNjA7vxirxgdWnOCXh~euKCP6h@G^ z1epms4g;hTgdy^%dc?qPW;A7CFb!d5VEF(^UEpRQNDBi4!*zJ-g0Mj0Bm>q3p51=J z#=u*`%D@U*)WpER0MiLdQ4sZ@_<^uMWdKAcNR>HKe*q#7av6jLvO@`C2hmmu<}dNjc1GIB68a5%9%V1gP9$s-^eAZwl=^%7`(5Tv)H2i677 zPtbiOFdZPbLezoW0bzlB577Zq1zM>MF&VqrCJ?hhZMq}ekbO5M91O@hLFPeB28AYs z1qw}wPLTPaQ9^unSV8OnwV}R1&Y^4nK^S5$s-7UQx!{zQ#PR@=lNcBvGsz%53=B8nc?rS-gOc%&!5VfE*0AYdB07Mr^RWw*Vgn-C{Tm@l)%#VYZ4~qE|Zm?@$IzX}zb*Q#L zbbwSPL5u~H5S6HAgSuzX9b;cu7`TqGF|d~KFd*whbv48cP|Ahq1ewo^6k8B^R6DXD z?gzI8SQr?Nu%Vcb>T-yFQ20R12bql=YY=%<^9!KnLt+Z#c93^b)j;%t?1F?1$joK} z?kdCuLEKqR0&82h>5BOq8el~#9WY>w~;~>B9E%44{R>J-TAkWOt=jX2?z`1 zvMCS~gxMH`i})Y#f=Ai7z++~xz7NQyci=i9ERfDwV4aH7*%+pOVPojO!p^{Y1ky)= z=>(;AhOgs?!V9ikJY3Uo>V$b1ln$btqaz`^8Bnwdo3NZ)^WFN$A zkh%Mj%4vu^s@cn+W`pczU;w!W#6ndA(Fd{tVlK!`@L@I}r3?%V5P4KRYry6*axyV+ zeqsWTIe|{Hf@)y63lB*M3*?VYU>%ATd<+#K{0tgjxEPeLa5IP>;b9Oe;bq`W;bY)1 z0fis~1I#2)I)vy4r9%h{G>Qf>38X3>Dc&LSAXh?IAUk(J?1VZCqyxl6RRd8C@;$^{ zkeQhT%-shz7qVXibJq>>7(M7XT}ZnE!UDPK2w1nIAuoe`iXwx2hysJWi9CZmqXYx$ zK5qsF&?$hRP(aKBf=;Oc`2mDMV}%g2AuN#Dryyp_vN7<5@WNIwg2zWeAqPr32(zG5 zl^~-S9>QY`!UCCf0c@5cXzZedhk?}ubhr}(156hv#2{)xrb1Yt_=D&IsY*sln-F@gco2F)H~{SFWvj2qFwh8$NX3ck%uXg zMt_^VSWZvKi8*w|w0+Nuf2T8eM7KSBKRc!Te@9E(w@>$%iTOJmx_@BDJ|)+!+f!Y+ z6|cs-Zae+v&BqOOB_Z{Ta_)GyJIMdD6_}m$>qNWnlfK_bIN`f%Fa_B?80fb?zi1Cz7@QJ-ZMUI zIxn47mK`W4;L+D==Hg{uBA>{ z@=9`;=QqavXZ^(9jQ?GA&3&^3>whkpccwc{=+pwW-cxrq zS#GQpGAt9ErCYG+&h)7@hWBUf*uDQ(*3-}c{_yOys-p1Te=GPhEkAtS^>4mVYgo(O zle@Yf9C*IGZTIXi2aY{%srzK_ng1l`={~N9@7=Pq+E}MB2AuuX-*N556;oILudUiO zYPq$Ea{S@fEM#W|{1V>y`o^QoO+H>8Jqfdqw3WWk z6TYc+c5ui4Vs4NZ(|aCbWdHgZ)Ay5=Kc6la7oK`%x9o+tbx$3FE2H=3WFM+ooxpg- zBLlGbR`QNP0)J2nwxUF!96p^|s=-I^8dym-(-7zrI`6 z=V|0ahV(_#-YFl{vTQbp4`rX$%it^U__4U?CMesgs|ImHw^Xs}v8Z&NBb^2t! zDNX0P`D4y~ng>2OO}28qE}&<`Cm!7UD!M9aV*AX4Y;tU>-#C?Du{lWpjmY~^@oMF( z>wZgjMyR*h^*b9&?wcKEu_1fH=DqSJ^P7Ymr-gbPSaERK^o?s?+_?IBO8VJP{5z%z znyLz3Jy9FA(Nr-ni(B|V%i>2l8zke>?2kzM+MPR|@#dajb+GyCDTdL48WZiFx8E-5 zJT6^%ZsG5fGX+&PYj|_7oETmdZ0L3|o;M_2MK9#)9mWe`Yb{hyPvrRFTe2kmX^cfq z^Jm%2qw8EdLh5}U?6{q$+txGxyHkQM!9< z+D!gw%_iwue%{&PmDfto+M~90s`q4EyynklH+!JBc1Oy|8^sf)Jf1yF{q%Nxxqm>sT9jIB(U`c|{m*KgtLTTU4>-7dV9@^{$zdREKg9s8mj zmK{2+aXrVYhvC8AIZi7s7f+vcGH>FR9an{q@jUyJHS_F`z6($HY&q!Jbyss?+@~2+ zRwewslyGf6L$Pi7?klznU(D0#ss8ouWB5js4c;o&H$6k&WY+B2*2~g%Wn#$QYe51h z{tB_}mzdPdJ|*wYBN5>~cT4|U``lOkP`{C6keLQ=k;Jnp7&aNu7NtK{<+u5fiOPCu`3=x5GyjVrG`H7Z;= z{>)F$*=W=35kb3g8$Ywd)a zGfnp<$Jd%vcxc9XF3aS3D6?|vacRli8JkCE-dd%?cRs%?{m`&K+IVt9XG*Y{bQohFFQou*}} zv9-(Xn&ejDOI!+CXScB1MA&8g&#GS}m%51gXMo$Je_xu}VDfLp>LiUzyL~HIq8P6m zZ(sKC#`oR6{h`?jr3dybNqpY{-=zN) z_Zo7Ac3Aq@2z&l9lyy;68)_E{k9gAtO*tOxmLCRM^4$#w&>-bcFilj{#1bb z*Wb-Wb003@;?n5xnWx#r)c-$9(&=To%8H-~PAXH?Q>8y>w!R<=;EJhMoWF zq^7{^Yj_>%#wJj_s&?6&B+(-~&&~8tzkgD$B%prxvDX^if-c=f@t;mDJ(u<1(moa! zwYi(Slf7mMox1b(XQIVIg~IJS=b6q?E#75a0?W@Q1sje;n;C^ITcGgEKH1gkSZ~Y5 z-u+MPetWOJZ$lt0d`TO)oZNGQ=T*pt%n)j{SbMDboyNk}bN5)J!qcm;OodxdG zn&#;v$N`_Y;AsDekqgw#uJZ!^#6B0 z?Ywg0^(!p%D<5ox@fki_J+!*5CIRCgTl@N3nB#J(gh&jwx7mN%IpcNgl^O0ue>XK1t~V`HH#}n&QMT%z{=*-l8k>{1={K@m zs+A7xWt^)q``zt(Hz&I;SS+}GBBz7p#9j5zF4V93eN5Ypb%x5zwHk^!8h-mWr}uq| z_nPv#>FmC<406(+uiiMrQzifN(`5&*;*t>Wn({-X>=#AiqCL-FW}hSz^KOwe^N)+x ze}6t_m0``0&^d95cW;w}aK)xWC;K{Vb{76plXkr!^egD2^b_M9X5yubD&iwO?|r;< z{BxJGeB;!Nc^2tC7M8PJZf0g2+a|*}d3BRf;5s#*87YRsYLzDfol@sJ*A;7*`g+}2 z^=P4*XZY%#qc>&*Y|>Xs&+({I=0DOZEW~N;T6$I@H9}i2?Vp#u<|H1)d-X!T4Hdr0gbmuyGJl~1w@}jV7>^_sc z4$E8SoeO;UnQPu>10$v2G>!Kh6HfL2y}dbEEUUuv(htuItKLg>N`2(0DBsO;)8DXY z>Pkb_pG#gwe-bhaofh%_ZZO-0WoM2*lznEtqFJKyY-EgDndhQ~UEg%;SkGO(w=qQ6 zp=rh3N7;|I3c%v)x=w1?)9chw}qom#sdrb-ssl(Z^?ekyk38ZaWug zS=#QhcXPgqaY)p&Yco_oWYseD`1S|-*FSDMYwgBhDlTy8CqMPY8 zSpH)w7LWg+@t|@`Q-yiZZC!?t(--rMb|i*5PF3~~=+Ds?PIzLq?(4jd@0ln2XNKQq zKK>^7{?5bgck{EPTn&S!*qy#9D6QV9%JV0)%a~6&#)$Fd>POtZ1}?fC=^r#c&-*HF z5F2&Oa;1vUiFAQCmwgRk<-;e>T0^EQo*5P~W@Y@G9DcC!;i%3>+oa|b=Okn71$@@7 zX?gQ1uVLHosvhlzCHlWs)EtPuqM68CTz8mNwMa1hOYhXJTeiR9)9>4M_u!UI^@e`h zX}j07XTO|y7bfp|`_zZUuU%6o9#dd@AXzO4YoGAOdVOxXJE6w(dfvbM4cE8$dF*cA z{y1UXqpaUeLTS$wN(7iE{{1FoI-hgd%lLAS%^T(}neaooz5D#_v%C7;G%wD4{O{a} zUEk#STYN8GKA`7Poql+?v36K~s#}N2jYlfN#p#o-{eAM$&756v{_fZn-OqnITOKSc zRYp+O#J#gh)nS8v0XZITE-mf<&Z3ua4`kZGqtUi=F z*V4H&HSAY%n*W=Nk#mzLXzu@WH1DhEaj}!ZqM^Q$Okwu5Z-cZI+C^;SjUBpTUaXMc zXuD^*2(11{wwQYQ`zJGDSbYJDKUjJTdc*WzCHIgAOdgh>VD4GS{BO^-;EOIWevV@!OFAg%VE!n)xPUAttAVBANgGi6??LoY2wnqbKKo)3m-5Yboz4b zTKVfNu9evZEzSF)CZ^k0^eBCpWVSGQm9|J$^%iND?dK9D4c!>qt*0d4)MItGsVw6Y za^F?%n^wN}UOt~nz*)ByOiUN^j>KArMQuLSt1)%6_(`7ZjpF>We@s_)_D%|u?^gVM zxp+p|8BfY5ljfQu_Cl9?#C7nSEF0IBgTwJrp)EAZSL&Iav5+ zJ(y6^bggwxc_rJV)ma<*^V#ebvL3tMODNB%(3vYEQ_!n;_*CRyg@)eWtsfrr&U$VW zC;759xka91I`di1nO?s#|Ky6^U%K?jfzw|0E)G#EtG3JS z^*X;%{7$)O-G8+!XTQptu4xOn`&Fo(w~KX!xiS9(=>xa)uTRQMdC;|e|BHr-19!iK zA5oF$tOK6kI~L zZqHZNGuSD_r2BEL+e22RnC6tJZ z`w5&o*wx5#L3-QkoJ&^MBVAA4sC;&AxvkUg8*W$a4l3@-waU#5yLJ9juV2<{rTkUJ zyJ{{Sn2?eG>8O0#rmyQ^{gahv_nqFnCN5%HYRjv&hl!wLX8GD{ES2 zw7#=v%kOrHy2|n{uK4dunF5c&(x>vOc7ce$JtxC5FL_E%UA}Ua{73m`cmGyS$l!9F zdg^QA_Q>dXy_ebN+G?UYB2W1n1-ag_jOku}emAs#CBb*$TA_U1HmjJ=`uS`#W?Fpz zTK7t(*Iz%`Qf0EtJ--!f*3o;K^H1kyL>tVKFxA`lKxOvQnPPL!D8DvuX`0+I>u}Mj z7=C_hSbh$Bw1>Ya>DL{l@+93kwLHnEj@|xdlr|rB*cF3Aa(-@sUS^6-It%0f|Dg2& z4r!^0C3*%16Brp9AR>AxMXAXpWvQTXI?wst^MMGou4119)}kQKv%CBos&y0|RJ|3Csd5xCLPb@LoF5 z#S$PMGXt_Yps`72M$kAPNXsM1DsBd_{UBZnh=7_089oM`Oa<8;4N|37l3G!slA8xo z1{y?UW(2Lm1g-qOn$lLn06GaCB*icpOfoRAGAJ-GGa%~%o&Leh2wH~)S`X&Z4ceIn z3L%gN&?Peqy8kl9QIhVu`u+aq)x2WeqoVBo~i1yaw<2nubG5%XvN|J@S1z{xB!hUGc&@@>U}gdYdOLk z(A97t-8^7(kmCZh7Mz(8bb2kw_J9pmvk|&LS6qU0@nYx#%^Wc^f===Tr4Wu{;}Zy7 zh9H9&7#R34bbx*Vap_%U>WM&+3qL1(0bX7)~(FN{Oz0$tb% za-jf*F3=iigbS}OzBLb_3v^K*NS7dnF3?OTGb8BCOHdAZ{k|(6p{p3`LLm%Y!r&ML zr8JO|DKoFWM(FAU34za$N6!VIIR;1`1S!e+u(lVW3v^Bf$b}*pc7aaFWM%}Nr3Z3h z36nNb7_J8y#K6EHilGa%i;J1D3S=Y$14FY;(M5z^ptY(X2{8;^;$VM)PHqFam9bag z8bTNNY6u1f25}5spi+*R5p-f3C@0ihdFqJJ1)6~a*(Cwdg;cVEidJSukUb#zM3Y^T zp!5x5GcbT$0AhjEFrkzrQeYQ?&Upi+Ly_Nqk#e^rNQi-fK?-aaNWUf%1H%hw-a##q zK;;87Bkc6In!OJU5N@`Inj;N12RZM6(jzk?Xoo1sbg89NZ4kOZH;{uwWiWKfg53-{ zNeyIh!oJJ55V}C?^gy~~F?7j+b%9P$1C_ZKUl>;+bir2O$zkXMm6ptmpet8FNuz|n z-4LOx7GymG1A{zR7s%FbCI$w`ehg5J1`=7$#K2GhUeyK@Im*PqzyUr-947LBiGkq+ z`1}T#$WJB)2FMCpkO*?U1DXS5W(1W~Ak+Qrdt(u?%nC{_3=9k)HB2bA6=>xcGb5-> z2I-2OR=WYAOB1RKqy|+N=yYdhMo>uw(q*LJj+CN2pt?Y6P<4T>_+(}T#nLG1#mLDi)Sj#E&%0n)XIF>5D6*I}qG zkQ!87;1k#xLA3@*m-8v6JqTTopt?Y6P;-hp*e=jndZ2Pc&OH7HA|-&%4+NQ|4o(Tk z@dcV|Wd>c|36f@z$WUF0unTm15=a=N2Gxb&Q_tb?^~>7#GeQ^WekG7DkQzt=1l_X) z*?|m7Eg(72X6JR=EGgX}^ru)jd{2}qsIR{lnWU57wkWnf?csX=ui zD5oH?`j)ujt|AKgVFK0vW{MRWzUMTBe)=!P(6M$nE3 zkeZ4)-`FtCF#($cYIT6zZ2B(C3sVhfUk4)R7OPl$W2!L&n_~qsgn@x!=81)mG1ZuZ z)%ZizytDiPt<90$3_jDEaWPcQ&3)R_G0g$(v|(n1t%fk2HT4{(8jwqv8DY)w6>B!| zV5$L~=FQ9qTH^yM!?SV=&SR>v0lOKrk_c2T^qq8sme|N{2DR3h89{41K=E~m)dJe; zMpgsb6VA+70`=G1NU?fMyFjaGm>EIq!9eC1G8MC9ssY`Y$IJ*?*9D5xr$=^t!&C!W z!^zAD+EW2ChgDL_2vZGc9R)KZsHOs$6V&b|j;Y2O>~}#XNd92GRlXEc4QS^oGb3!B zY~hs)(AF}t-(A7xfL0HK?2?YSo`-3U8(7V428c}QJ=xO`7P2|ub7~o-KvgFL1H+qD z*1Iv)fZ862v>Jc3%?VSDC)h4fss_2|_YGS{Of}%MY~kr}ivJ=kY0MjJ4k(O4(YpN7 zK`~5oK^26U<|Gh-M?0q8WB z`m2*M)quLu%#5JY45Z97c7q$H8c@3nq2{Vb^cPGup#CT`BdFvAnUnd{IR{e>$R!AK z4rrz3W2yn4smpi^WC#NTLjwDfm6&Qkr;;%=)NM5nmd+)Sn@mQ+$?5B(CtB>mQ!BKH!NioXvr5dBlvc0 z1_p+F*Qvso{sIk-Ff)P{@q_%%A1T9(sRmRsGc$sG2a1l%vt+kos!0a>3v{;=D32}W z4Tg>|AeRZC(Gg}w&?%{)@|kBcXfG-#G?CSShJ2VALFZh8YJIyyHC>o?fmW3=GsZB1 z#zzY@iZA<=yg!&~vcYOVD=I;1mMr>;r7e*IRs*UpK;aX2UAQ0998fEinGtkO z11RLSt?>=SR0A4bVg?;V!T_o(3l8%aVyXe1kj2ahIcE6<+_)c=77$HVrB%L%?48A;a0l~Qw`|aNoGdS`AwiW&9Lh_fT^Y!?03*#ekf1R9wOVTqrW(+Vg3OGdvm`<8nYQAQD5e_F$py@eptAr#`J&MO(jH7Tps@u= z8wsR_Z-zXUHb6Dl&7gByL4AhUo#on?=G1`IfL2C=+?+VA9!nVxKKq-oj){Q*)RTM} zJ`GD*R|hr+wErHIR_9fSLPw2|^JzU;jT$2)586Iwip6wK16U2@gbD_RbuT_|!c+qu z>tF<(#|9dYC@ZmCg{h_qY!2u|a*%sCp4zEmssW9&GBbis?*^&azFTS{rkWP8IUtpw z@UbzoScs{n6|4qyA`>VsI;y{8spCNRwKFq(&h(Uu*%E`I$aesF4nsE zE0*>uXuO)45p-_^xLp1Gmjly1onZHXPJ#gSWfsaj#Zn%EdJW8s*BKZACAD2pFs_6r( z0o^YMQe&|p(;uRyxTL7K1XLJ+yvv}#z{F5oQk0jR3o2(oLQs*Cd{99M5&)|KF|0rl z24cWPd@w}9FhoG7oq;vMb!B0w0rj3y)wE)$nSvn#8bwCcwHrgtMGTQQ7$RJt0ugKw z$nPMAEQW{)hKM_gh+9a!M`b}isBi?20D;m!14AT=8j#6_7$VIWBGWKLR%3|l!Vo!$ zA#xo<O0I(&4%cp(62c zHTF=E2DnHdRHPm*k^~iLgo_kIMKa(beNYiZ_$UHGTqGGPQVtiXhKdxz zMS7qjrErn8P>~|I$VI3~30&kcR3slR@)Ii33K!u8HSEAUd_l7?pfs-r6)A(OF^7uu z!bSX`BE@i#c&JD&T%-spQUw=jhl*6fMP@)nI^iNKpdxi}k-bonHn_-Ts7M}MZ>+v4V?qLPd<=B2%Fv#&D5kP!Th@$QG!G zIb7rrRKx@>auq6K3Kw|+6$yZge1?jIz(p9L10kVs5fP|}KU_o|DiQ`4v4DyM!$o|d zB7ty`NT^5r@USJVW7?wfRSinV^p(5UJkzS~X4_stAR74Lf z5}ch`;GCZV>WDH#fJHp>isQX}13<$l40d1I*>!Bi!U=fh6U=Pq34g-TT zk_c#|4z$w=l*S-xK;sV#46a}`Ad`1N&2a&XfYkW91c42*M~HYrL>#~(AYDhGx@^EA zAYGndJq!%iU=fg-b5J$eU=gsIP>3R1un0)aGpHI%xX4GSh&x>5FI1!!E+Pf(BGZjfM57X{OU1{}5H#uyG6pnK!N#EC<7Z)E#=wxH#J~U^D*%ZY85l8uceR29$Reho(KikjBsHd>aXrw@MR1c%L30w*P}G2C zAl{&efaV)mSdq;Ejl;^Ih=4-X6h#CybKr_10&;T*iU`Qf$;cvRAU7AGh=AM-I>`|3 zW;2kRE7*|SV+L~bFBB1wn=i8?s{y(BKZ*#*&9WTGYCvu_M-c(J*#%j|9OS|V6cLaM zdr?F{E}VrT0&?Ld6cLbn_MnJ>+;bE~1mvD8C?X*D+(Quog`p59k}oVkE=)iX0lDV^ ziU`O(T3pDwKp|$tjVuCkA*jBDhdd~wFnr`eRs(WjEHAPM$c3j+L_jXQjx1sca^Vvc z5l|R{E_H+3WeIXK3m=lnmLNBapooCntcW54ax(`%vMx}lzC{rMxtUu4Sq;d|0)ogQ zAUF3Rix?UhFfb?yA*nGmFl1nGM-?$*V5mnGF=k+xk1Arqz_1fl#FT+SMHt0oGX{o* zs3PVJ3@=1b)L1Yu{6H14WMEJgMOI^Iz`$ULDq_gMV2dhZ#K7Q*Dq_sQ5REEg!oZM= zDq_mOP>(8N#=tNURm7ZuVKJ(R1p~uYR1r%ChASu{Mg|NFA5le&7#JMIko{$3%)pR| zDq_OGFcDP*6o#lG<_ruQP(>^l7_Oj-STZo&LlH4HU|@KGDq_gMARvzH9%Ca026a>s zV+IC$R1p&f1}{_*QwD}0R1q@zEMjP4!oc8)Dq_mO5RWQi&cINEDq_LFFcU=t zR26MQ6)|F9$df{{-O$vSf#Ef(h$#a@oHU9WGX@4Z859w71_nJ;5eo(eepwVXmJAI4 zQA9u$kBA(y8Z$!%25nRkBL)U1R1sqahImvFQwD}(s3H~&3=idzO*Xe+VBk_j60tNk zV_*g@4T@c$7()2Vxb)M1gf1@70#DGrk0AG;*ae!uL#%%;oPJ~?D?AKUp}N3o zQ0xNDiX!a#(D%#|q00)Y3#_&Q(~B z&~+ZF3#@cJl_uAl2IW*~Guh3W#UL9uH-*oB}OGmx&L1Ds+AUB98az-mzJ z0<9BA#Ft6gG*5&sL6BjfTdY7Pqu8|&Bm!UezIesWFC6eNREO#Ut3k1A5m*;23~O~S zDk5~*Ky`uDpx6akQ-oO2dQ;0fxDReu08|%P4T@c$lRXjsDn4ZX6rn2jB6KxEb%E8O*tHC-3+At>tYw=Jx@JRlfz_bcwH&MqBn^tM`5Fl^2whu2 z!VC-yU^OUqtpMwS*|qGmI1@tGd8jV18Wg)gb76=uYpxT%SPhC@tHHXU(hNmeX(y85c8P!{SwSb@gVdndwFV>tPxBl6PVPbI(uV2+ zt3j~~v|j;IZh)$h<&FMtqu_QqLUn=FpxCtz#jc*2fqV#Ekx*S=H7It0YEVQNs)_h~ zii6u#0M!LngJKux#2!RC+#J&Fh|tvm)dg0AVi)M1cSJdVx%a18I^3@LP+ed(D0Xc^ z@t0Zw*E@u+jZj@+H7Is%2I~TqQJ@*RmgNtlFHBXr$> z>H@1lv1=>XE?C-Fq?tXt0dCh@s4lP?6uY*8b-~j7O5rDk2wm);DOCmr2Cy0wyS9UM zfmhKpFfg2L{yzbsO9842tOmud9bjEBy98$*J&4d{4b=r!gJRcCur83lKzZ5q=jIa# zU13mNU^OUqf%eTH!tiEA*KUNaLZ~jV8Wg*B!|ej4c`adfXC8PM_CR%k)u7n52doR` zug8^>wGg^iLUn=FpxCt+tP55it~sl0i_moxstc?J#jbr|T`;@S7fJp@=z0v*1y+M% z*M6`rSQzq8J~A1h3$~CPtOms{&>a|vFr3Vh$cWG-4_$r^R)b>KLAYI@F#N*qn_3SK zLtCgWuo@J*4uN&S{I&1v@%;#0VNhLQH7Ir+2J3=_;i)Itx(Ho)P+ed(D0UqI>w?)e zH*Mutgsu*#F0dLDyN-f&!NM>|egYdp*CMDcuo@J*z$>-jW$*lcA7_NFJy2a>H7It0 z_HRK#9u$VEXCqa4;bC|Ustc?J#V*jzgb-bzoU+F4gd9TGJE$(O8Wg)u!u z>mpbe$SzQwqU)6FC;+$XG*lN@4T@c$eQ=2QO7)uc3!&>FR2Ntcid~n%cEQT|U2f(R z5W2oWb%E8O*mVW03+AsoTuZ+pbn${VhcPfPfYqSbbrq}&7GIqU&N?G>sX%ps)u7k~ z+Ovr8S50+L2SS%MR2Ntcid~>JJczapD9sDP!!QV{3#jDK9EX^ZywL*1))u7k~T9J$J7bwjmbS;4D0;@r>3$#`o;xCY0pfr!rwHvAn ztOmudJ75>W`~^z$2wm5py1;5s>;m1&4RIkT&EGM&Qz!%vL(uplNEECF#jblOc4_-B zzk$%j4_fZTz`y`jgJRcxur5%V2l?xw@XHj0E*+>Yuo@J*Ku2XlTnN%tbYPPQLYFsG z7g!C7T@S%_!P4RJr5_Rzy0W0Uz-mzJdIZ)53&Xr8Hg^%aI-$D2YEbNY4Auqnm(ADb zyAZloKy`uDpxE^UtP5t>#b0Vd2wlgay1;5s>;mo6MWhW>e?5ch0;@r>3v|mGA`FFm zfA=EnVigC)F#`iw4T@dQ!7c=q8z2?eYl1#C!qbKdR2Ntcid`?jx?uh)+xz|{LYFO6 z7g!C7U7(RQNZ$bz%X=;)dg0AV%K}HE|6WI_&S%-q>=%Tua8h&U^OUqeE{o%*;O`Ox(lI8 z1RD8ZH7Is{1nUAxgW~In>%TaJE;EoY0|NtC4T@c$U0sOyTH5(+J3?0!R2Ntcid~;k z?D{@utvEtg9aI-s4T@b~z`9`mdYp4?Dni#Hs4lP?6uZ8Hb-~j{t&cH6*D@qvQXa+*pE2u888Wg*}gLT2i*^FPZHi^RHix0FQn}LA=tOmudA7EWDyBM^- zBqMaGKy`uDpxE^jtP55~-MX^w?);^2G2xLRTGB7g!C7U7$PZ5anU%w|(3QT~ndD zz-mzJ`iEjyRDNqILf0CoF0dLDyFk135q7;fu=o~2*I}qGuo@J*K*v-d(!A7x#E%GF zx1hSfYEbNA1f4Dn?s0(fvX89Fe{p!)_z2YnR)b;}Xr}|hu9Sj5ZxFiJK}*IN7#P56 zQ0!s`+XYIdp!nLf+gTBzO9rY7tOms{(2Z#byY6>w(Lv}khUx;VL9vS!Y!@tT7|n_^ zKH@1lv5O6?3zjz0>Q+S|bR|M{fz_bc#SYd5%ge?IkEbGZRX}xt)u7k~n$bb{ zi(h@_GlZ^ws4lP?6uUUVcESAR`c%0Mp=%jb7g!C7U0h&YFn@)9iw`6MPQ9QM<H2Ous4*#+t^OTq0jgz5sT zL9t5!#jc2(6~7R=JfXV4YEbMF1nYv8y`b@VX}DbpP+ed(D0T^fb;06`p-yHALRUFd z7g!C7UBX~pp!fp$>xi7?SsA!py-;0XH7It8fOWy_+Wm!D9H9%ej{syASPhC@qF`O1 z_yUFex7mkc5W4n2?EueaVav=F-3K@}7O0|QtMid~XmUC8kz3lBpDs4lP?6uUq>Y7zdj z`I~bQq01bq3#GTkhUl&j6w4$a&WtRp}N3oQ0$TcyAb9t3CZw!gsxPmF0dLD zyJX?IKz4!BygJ;j8mKO?8Wg+a;JQE|pSAU!H$vA`s4lP?6uZFtbl_)42v1z<-2}I5 zEmRj+4T@a~D0T^VW^PC5Is(-NR)b;}=tLh#T?rcB*jnsu*9^Do7E~8l4T@b#D0ZoS zS$P|wive_;2?GNISPhC@%3xivG{3a#fipsvDpVI(4T@bVU|q2I>N4e8gwW*!)dg0A zVwWmd7c9-6l>3*2&{Yi81y+M%7ii}fA{|EGeqe^sH4CZ>tOms{&`JVG7=qFUXznHw z9)<^@y1;5s?9u?c5azEh57#&#blr#Q0;@r>OB1XM)CK_ArJiSPhC@I$&KeyOdUk z+8}g=LUn=FpxC7g)&)u%Ab}^)dg0AVwWk{E?C+)q1#)V0uRF^s4lP?6uZp8x?uj=Kie}8p{o$_i2T)Yt$boC+^+RdU0^jRc3Gg<1r{4Nvn+pt`_nQ0xM&U_<2P-phS|5xNdQb%E8O*yRqk z3zU~Zb{)}AwatOsbsMS+tOms{53nwnza(RI&mwgFgz5sTL9xpdtP7SlUitJ?A#{m> z4&P#6U;wK@u?uv%9l~EXl_m)ybeTeRfz_bc<&9!jtDEI#gsu>%F0dLDyFlk9BJ7%5 zaCi?wS20u_?lc2i5YEbO*1M7l?Aw#t4UWBfVP+ed(D0caS zb;0cVy1l9dq3Z%v7g!C7T>)TSFuS-;CP^Z6y@%=ot3k0V5UdN<-nhCW{$x8mZSaAP zJ!4>C0INZw@_!#h+;-Lf34lF0dLD zyTZY`VDS}Xnv#mpwFjyTtOmud2(T`gUFD50r4hRBLUn=Fpx6}&)&;T)6owaB{bbAG zVfYWK3#3v{j*q`d*MYd+HydxWloP+ed(D0U^F*tPP>-)jh6kD$81YEbL~ojeM$ z3lv{dR^}fsgvS>%=l~Z61_rPi6uXj8?8D;=y0mY40O9(jS#H3zB-tOmud46rU(+SqX7R~ACoHmEMJ8Wg)S!MZ^C z3lxUeH*AhT=(+&a1y+M%R~A?o%&ylpr`{rTy@Kijt3k0V8>|avS6<0I8H6qt(1DH& z3=Cj3D0bz5b;0ba56+H5=#qo#0;@r>D;KN_W>*_`peaI^1ymPU4T@cPU|le~RCISe zL+A>E>H@1lu`3^}3uG54&6j>nw=0FG`5dS&uo@J*Kqt~5>Sggwr#TV2rb2ar)u7l_ z2(}BBHe}0BF(GvAh3W#UL9wd{tPAF^-|JgHBXm87>H@1lu?ut_Fe1&@yz|dR=n@1S zx5>c309J!yR|$$;RRNot5xT6Qy1;5s>?#H8g83^d@PZFQS1ME&SPhC@Wnf(}f9+pi zZH&;>57h-$gJM@XSQjY1Kxuy3uBTQAT|1$=z-mzJssQVP*|qQmgDpbWW2i2$8Wg)g z=d?h|Ly%qKu9v(Jx_Ci{1Tio$fYqSbRfS?#I?FC8gf4TaF0dLDyQ;yuVE+0YF=qop zS0YpwSPhC@HDFyZe{D)BT8Yrr4b=r!gJM@LSQp4HP?|q=;Z{o#Jk4)~>H@1lv8xWO z3uYInjg8Rt5ULBT2F0#=ur65Iu&@317@>;?bj&IP0|QtMid~>PR}uM3>O#RAgf2^{ zF0dLDyBfiE!RqBSnK``(U1?BVU^OUqflfU_*u^i&$cfN38LA7c2F0#suw9@q1f`8{ zR_dV$T?e4Lz-mzJY60tlg<<2PZRH4EZ=t%tYEbNI1?z&@^>uqy2|||?==fL$1_rPi z6ua8Mx?pzcrTg4N=yHeZ0;@r>s~xNhWEUuHq|Z6wUjk1XB~V>pH7Is-`kX@j(@#^sAZ~5@FQ4iGxR)b>KB(N@+T@jyqW+HUWh3W#UL9uHx zSQluh1>`T+|5ua|x^_Wzfz_bcH3h5-X4l@P&6)^ZH=(+~YEbN&3f2Yk7s#$HlD8EQ zx_&@)fz_bcH4Ur_W>@j|Cw>TB;-G_;85kJAYEbN&4%P*-3lxT+@%dJG7@9$Kfz_bc zH3O^*W|y(X8)k&AAgC^|8Wg)`f_1^{T6TI;YZ=_GT&OOv8Wg)`fpx*`@^^HffY8+j z)dg0AV%Kc2E>Pbb6owqrjxI##ng`VdR)b;}=q3R~{?dHTFc+a~2UHhW4T@cJ!FIvw zlw&%x?;>H@1lv1>k97bpxt{yNGVu7c3T209p< zfq?<62F0!gU|le~o->{-L+Da~>H@1lv1=h%7tF53s|7R>x~!nOz-mzJS_IYwvrFru zmKs7=2viqX4T@c$djXi?d(AFd9_8!P3Sf1qEh=t~*d& zU^OUqtpMwSg<+9&%2|Z2Z%|!eH7Iti1nYvu7ieA&p-TXCL^=Zl16U1;U8}&lV0NYL zOka)Ar3KXmR)b;}_>4#JzEM!Qv7b+LaxOd!U7)(aYEbN2gJRdOf-nVyu6U>}uo@J* z)`E4x^0J1$n=3+BB~%w!4T@dsz`9`m%FmF}N9dXg)dg0AVi)LE5JX)mHj8m4Lf1y9 zF0dLDyFlmKBFc@-l|AkVU1y=Xz-mzJ0-d*sXm5nyUwsdu>m^hdSPhC@n^62Echzez zLKiFO2x`Duo@J*wu5zn>;jdCH|E}|N9dXa z)dg0AV%H9^E|^_UTVpREbZvm@0;@r>YbRJ2%r5JEnWYF_=b*a4YEbOj1=a<#>r$OA z6GGP;s4lP?6uWkVb;06`GoLFHp^FQ2s0srE16U1;U3H@1lv1>nA7sxJ9+E@}3;#&z% z8%zErbv8oRY^W}<8Wg(@f_1^-D=g$ZD?-<1s4lP?6uSp4^xSPhC@M^Nngx2yLqLKp04cCZ>0yN-f& zfx-}!=65DOpMuaO4LX{Efq?<62E{JWY0QW+D)s6+281ry85CeOD0Ur3vCH;b%DxxP}=yuX6n99c-m-&>H@1lu?uv< zHo{+XrCt~!bj^n90;@r>>onLdkPAU}Mcl7%se{|K391XM2F0#3a9yB~zi9vQ2SV3* zs4lP?6uZuXb%BN?K)S?I))gXjy@u)nt3j~~bY~R8UlX|J*CTXsf{yKAU|;~NL9y#R z*e+Pwu)Vs>5ur;Rstc?J#jXorU7*kaxo~B)Hzz`uD^wR)4T@bC;krO!s9vr;xeXqM z$xvNjH7Isng6jg=1=^#E(A5al1y+M%*JZFSSQuXYx0xBCYaUb=SPhC@SHQYp{<_>e z%Nn6;FH{#;4T@b?!Mb2!2->5H&~*o@3#A>6KP zs4lP?6uWMLb;0}<=Fv0@p{o(93#&uU^OUq z-3RM}rHx&St|}vReS+!&t3k2r0azEzF2$gm0SH~3prg$g7#P56Q0#gL)&+|%(E45j zczh{9b%E8O*!2jk3uf1eq&ubvUG`92U^OUqflfSxgghuOgVu2R!R?BL>H@1lvFizn zU7+?nLRSS;7g!C7T~EQfKw${73pD1C1-EMwR2Ntcie1mZx?ujg==e4Up=%vf7g!C7 zUC-gVKz4!rH@1lu?uuJAS9MS zIYnsZ??VV(c2HelH7Ity1=|HnhrCRG?|H%P3WMqbt3k2r9atC4U-=IXsUUQvL3M%E zpxE^utP9yL3%FgSP+ed(D0Y1S>q52*p{on33#Pkh1|oE=hw1{WL9y#Iid~?*>;|`MKU5c34T@b~z`9`m^2#cYM(DZ-)dg0AVi)LS zQiuyd>F`56{}o5LU5}u;z-mzJ`i5c`D1RYzeTC`*t3k2rJ6IPe9fDGn#x_T9gf4c_ zfsCO2Um!IocKrZ}!1Gt`EV(L#E@`MPuo@J*eu8y@$_H@1lvFjID z7c2}LN(<8vx}2f9z-mzJ`VH3w3PaB6SN=J}!!R7G3#HAQzUsWYu8a;=2uJ8DgX#jSL9q*T+AJiNL3aJvYO@fbs~xHftOmud|6sddVK|F9 zU^+tA45%)!8Wg)g*BvA5S|B9x3ZZKyR2Ntcid~GLn=iq!3<^W7uiO?+@G#s3)dg0A zViyx!7sy|Wt{c@Mbe)3g0;@r>iy5p77KUD)_7@PkZbEf|)u7k~y7dgE1) z2?~vq-`Cwj=#qu%0;@r>3w-A&IOIXPzI<7R6oz_GU0^jRc5#AT2+PYn6YkAJ*kupZ z1y+M%7Z+F;%wOVr*@_Xm0-(CUYEbOr2J3>Q!;|4XLI_=nP+ed(D0cCHb;0a9)?v$o z&{YK01y+M%7cW>B%q~CM)Z++U%}`xnH7IuRfpx*`%DPhIjLj+dASPhC@ zLSPrd{8jNm)fJ)ZDpVI(4T@dDU|q2MWz}?VDMHsXs4lP?6uU&gx?pzMC`a8u==u)T z1y+M%mnc{lEFDhXZyANq#Q{2u5_D@bNDYczVjvNCnzvqhtrVe45~>TV2E{IMur8Rt zF6-sqN9fXm>H@1lu}cE13+Auqlfr)?bXh}nfz_bc1v=>)5noPE&L2VO@`36Ct3k0# z3dOEYHk%NHu2`rpuo@J*q`|siX&yA*i_nz^)dg0AVwVh97tCLhf1lSQbk#$3fz_bc zB@5RDD(64OOIEtT)BFUeF0dLDyX4@yKxNc~i2-X6x)woofz_bcB@fmGTT`(yQe-+p z*Jh|Luo@J*6u`P*{!+PM%8Sr-45|yP2E{H#ur62_)>N~LB6Qt^>H@1lu}cZ83uf1j zSM3K8y52x_fz_bcr3}{v3d4IobKC9VVfY`a3#gP#CTeQn-oGB>+0?m4Sf) ztOms{Rj@8tn!j(u?~Bl-0M!LngJPE&SQpG+OtFinBXk)-b%E8O*rg8E1&gn(8y9OK zbh$uvfz_bcr2*Cjvn!J0!9RqqFsLrD8Wg)gH^jPH zP#&SH3aSgN2E{IIur65I*!pO@J3?0vR2Ntcid{NjT`+%TeGG3w=$Z%B1y+M%mo8Wr z%&vFazvv-!ZGh?mt3k0#53CDj*IuW?CJ0@Jpt`_nQ0&qN>w?+k@S{8dq3a4%7g!C7 zT?SxXFuPW)*wBg4^$e;DtOms{L%1$bns55C%fbPk=6^tSfz_bcWdzp+O7mf6^Xw41 zI6)T+GcYiK)u7mA4Aup!Q%-)fnu*XQ3DpHwgJPEnSQpG+pXcPiKH@1lvC9;! z3zonBT<;7-=(2_C0;@r>%M7dwX4jEO_4^22{!m?DH7ItOgLT33*LfDfa|m6DP+ed( zD0W$Zb;0b)|MvL=LRT?V7g!C7U6x>7urTBZU%`dY)e6-GR)b=f6<8O{F6DB@mk3?c zp}N3oQ0%e>>w=|2`7#TnFkA`M1y+M%mkn4K%r1vgVI+U;hUx;VL9xpgtP5t>t~)2& z5iUFn)dg0AVwW9Q7tF3#%a&Fmblr#Q0;@r>%O0)^l;(Td{$8|!r}>XiU0^jRb~(Ux zfzrIq$`&z%E@se0*$fN}U^OUqIf8Y;#>_t~+;j<{O9ZM5tOms{C$KJH@1lvC9Rl3uf0@MYZDyUA|CVU^OUqxq@|p(jh1e zLFcAg!^1EEstc?J#V$9nE|^_^tDP7Sy7HmAz-mzJatG@I`3q#1kW$#|Y`9&uP+ed( zD0X>(b;0Zcjin%T&4ua$t3k2L6RZoCmnDvEj6>+!1JwmqgJKu>Msj$&S6cn!WQ4A} zP+ed(D0X>+?Shq2R=+GCBXs?P>H@1lvC9Xn3+Au+^)EOOy5vEZu`@6*fYqSbjnxMMC zYEbM70PBL;)j4D8GK8*4P+ed(D0T&cb%B;@f&5jy`ARTC*FvZ+uo@J*g21|9c3I5u z_D1O11l0vrgJM@OSQjh|Q;QDCBXk{x>H@1lu`2|u3uYJVwHYn7PhtQ=D)dg0AVpk+s7pU9-*`=p{(WwS*S1?o;SPhC@ zQD9v#yCxjnk&Vz*1l0vrgJM@SSQp4HP}*3{Wy*ulH36y%tOms{&<)p!ae(GlZxw{D z4NzTRH7It)g6)E(jT-&;mk_!xKy`uDpx6}$)&=udr|4S~gsu-zU0^jRcEy8rf$Rds z4QTGB3m%37b|5hZ2Cy0wyAr^=VrHhTG*0 z)dg0AVpkGa7tF3jRU)GcYhDgKd|9o^cD(0l^3D7#QqJiZYY4A@RYfCGoz#@lH9Zc_|>iI~pG(AC_1Y?~+=anGV(gRS}k01XGVH57Ob6 zn46js@0nLzl9-nawmc&-r3}Q5PfW=wEe89&3{xnvpdhC*KDR8f2oxS5x0WRq#V3Is z2MWskyi^3QpeVl}wWy>r9&|CCJtQ8STpj$qyd2#eom?C;^GZ^S3W`!oQj6>@%TkMq zGxPJ{u>#keo(gtMacWUnW^!sgR6H{k99JM0WTzJ8W#*;B90YYVSQ;Eh#i==ATq*uh}mgbaX#^)v$m!uX!41(I8n+i&m#qni{ zMVa6zLXj;gDorh^EJ%${%}dXOCK;$kxKw&hWg3!g#SGAZ@pbU?^7e3a_X}`H%g-yZ zw@k|~%1tbRga=fOg}0ZdkB6V5uR};tX=+GiK`M&0zk`d1ql>q@qqhUt1NN3sAE2mm za&d5Vb9Hz1a`bb6ddJ=p;U84Bjt(v!K0Zz^PEHOmAJ|($e21dY+}Xv)!`aEj)uE)s z-V)?T6los^XHO4rPggfb2SofqRFss&gCY@}7C;#Q79J*Ejsc$Tjse~dp!^I`3kwE+ zZyz5&M{gg5o4|S5J{^=8(=t<&)Apv=tR7837Un&XmL24%Tr zR)AP8nPpHG*o*lor8%h#X(jQwsk!lqIXU^sFiue_3OB7NH5H^EY=cjJVoGXJymL`% zVo9oNMM+U2x>QhVd1hV;x~Ma#91qCP%quCzDivIs1U4T-)-fdoUng>#Z@NT>(sGI?(EjLhk3MviaeIXec zq%sInARr3`mlUNY=EnOMq~`gi=H?ewg496;gHuzpk-6EKU`Ih^1M;Nrm9DIc7JU}7Of ziFw62psLy}BpyW&R8oUN)d!SJ-JtmZ%mJliw~%-++p{FK2&x;*cgxI6%*m_*SH7SU z5Ly<4{D8!b&&*3Miq9`gEh@@PNdzd-rZmLf z5>U1VISbT8h%YE$0M*6uu$m?woT?a-^K%PIOHv`cc%)zgDNZedG_0USeNk#+NR2*bPd?KhhgDj9)l9~&uIUrShd~r#B5xCF<)f-?PU_-!e&df_m zt%%P}EGPgqL68l}C_^$96g6N|!8$>4oPplDg6ajSEKAHOO^pZpAhifo5W+2nwY(6S zDLxaNuJTdUfoeOLMo62jq_hB1@`KDO$&b$iH7`Kv4_wkh1ydl6NKjKLwIn__7txjj zyE`6SOBdvWb3qBHNegPgfw}Qu1;sEsL8So5WthPj07?~aKUzC}SA`pSXi$vjp6vv|~01HJjfUBu^KTt0M!VJle zcQ49Jfl7qr$9p8^q#+BrV3t-MdRb$gFO=SQgTv@!0ix* z`1s<~WkH$M=;1y+m@hqwY9WN0!FS7Vcb z=m7^3Rz28c&>fZvY6hXZ3L*$qiq=Mgsznz?C`M^PAylIZBb0+12CxPfLOH51LOHbk zg-{3+Kqvugg;eVZWype1r6nct;KTv0NWrZ(sB$b4NI{KV4>+vRr69VD;7JR^Cah9u z&I8rMAlHG%VbENNDhII+oKnCpL6t>HM_6PbdJ(?BrWcninuEc<1T}Hd9E%W#ScY&Y zLI&ND2pNbTgcA@l5IxvrpbkSHyn?z5Ll~hP+-HN0bs?0a3PW6Epn~X)L&nCS>aj>b zbQt2&fkgu0B+y_P((oD75~v@LB@kMm&IOIXA(SHvV!8)OEwXFC!VuL)NUjG9LxLYe z7}Xib4uoich8nU2!~%G@AxlB@V3mUCg1Z(|7gi~R^FRR$8n{3jg+zoFHc5zuU=L%H zhBy_cG(@*CC=_w)#wiWaZGvAnPHBj4Q~bJdN<)JTRyx9ave3}N6o*)c$mZxeu*pF5 zATl$$9&9oYJ&3XtT@N-HsAur>!lB;6rvhRzIDO&j%R^1UuLfccIMNB2gI^8A9B}j# zFbBUHXyBBT#6!Al;LaY@Cuo8YE5RX*sTM;Rq8i)+!&HqS3{eekgJG)15QeBW1y#0~ zsxgESUIeubq1{V_7m)=a27?nGvM?l{V+cc3gME&v8bcVO8tijS)fmDM)nK1vs>Tq8 zs0RBSQ#FP#B0!)6SiU5hU2);R&?@Lm67I<5C7O4Ib9GltD}*s0`}O zkdSyRqmoeX;gCdV1$PoqMidb`vB;rm1dUc8k6EJW#gIm5M;h8hXhIf5D1{AR;&3H) zX;@H)gn))yFvm@ymVzrOd?tV!HP{tEq6v=zOfMh;1k3^t(L!B<ozV=r+Qy8>cixw=sU*IHjRMhL{vV8|njvGk9z@vjje937s{-nD>B&FivTR zOAS?UDu9GC9t98+j0l;4M*-Bo7*2prCE)S`Od6*HUfS7lQy9y6S7!zP0zpusb8@TD)%c|I%wk6j(a5e6uZz^)P!F~q2Z zn28#N_{=0mCB#hBD8^?dF)ATuq9y@+W)hw2i3`7rV%p&W-CIis}4=fCqVUvOAfd>(W9&9qu0Dw)G7lGy*L5nns z5=-)nVDXJh7OELJl)#HjpdpSa4sjuBd4{Y5n+!w`YPcfn!6t+1Fvu7rWU&jX(@e@JK|FgXqI92hj(QNG$rW%R%(PBNK~0>~g4qg1X!XHCWK(AQr;o z22B>?MO?BFz3_m;su!0mL@zw>u zU@{Or$j*n!K=fdff#^YYHmV+MG7vrR6j72NkE#co3^V{h*&cbx7u5e4!U*NyS^{N7 z7(x#gIf&aJ4r(Ckk~^sX(F7qbH&8(nhWHml7^2!3 zyJ`$!h-wq;sxgGo91U6-h_sLo&GqQAP|aAD3_>+xlYwf&wv-U63#$}V8)yL`+VVuG zE^IPTO~{K6p{h}YFqJ{pC1R?DibFL(7xcj@b~qO*jj{|7W)||&K-jvt;Oxu-&{9d5 zK?pw7B*Y3qs4++a$Vwnf2a(l4MIed7Pz9_HDh5eysA3RxMp)FLiXmI-5dd>H*mMvV zVvGUA7?1$OE+hen3aI4>6-WXoRyd&DufR)1`?DI5r|#LA`mqY+mY2Ei$K&s>_%3DECNvj336mL$RZFm zkU&RPgDe730|``QHOL~!9`{7^IG7JH1d`u;!6FckBa1-PK;jo!4YCMC4b%%r<{*ne z)Ihy}qy||8q6X>(BsIt)5H*mDgX|t;5hRa87EL3ShEM^BF%Snrg&=-M5rU|KI1xn^ ziV(7OD9Ot+06v3&YuPr`WjLiFE-+HTsQ}_?JPIHtm=H1nj{=AZri4tuqX0RCLQ#VV z#D!P@4O5T+#8XHD5EYPg;E7OyB!FZEbQwG}Xh9VcOa!V3+vaEZqIjq_{A$n*LR~2$N;7VyrXKuF))CRd{7VwNI+Kyy7yOAkb%L2fI85zEJ1<{40#09 z$ulr8R0uLKOh;E&l#*DI2yqLD1YO^=P>_Ma6M9sD9Owuih5!e2_cb#yFqDcgF#He$ z>0$sMfPl>(pa9YmXJDumhp5BlUv35lhIVlVhDij}fsU=1162btk%0l5y&!e-iBJc+ zI&BdV>OfI@hzNBN3=9mH#2Fa0KnaI|0d)E-R`-E!Tep*7V2FpR!xb)|bdV{*z|ccL z9Vi;6NiZ<1Awu0Y2?mBU=<3kY0XqW&!!@WHSU5Wf7&z#msRPB^T?};&80tU=U%bGk z4lRE)voJ7xkzimbmxb8M&wxFCK?hRu$}upgfg+HBfq@N&x-13;h9m_BhBHugEI8Du zFfuTFQD9(@fL^N(@)x#rwTpp)p-qW_!2uL847l?z=zwl7Wd;Uo=vBd>^oY$o9%crH zNL2=gRM1&743OhJu&Fa=W?*R6U|@h<>IXVX2%9?40oq(T3=IFF*Ky&pcOe4L%A`tKMr zFuZ`O1-TEb4$VAJeq)1PPXW^nR)@trF(U>BC8%0l=7Ex)15^zm^CFBG7*e2WahV4? zhN#JifngfDIxOznV#L6309_px|K2lVV0eeF4vTp_#taM+&`TX~xepY6W>7VR{Oe}S zzz_sgi_1Kae+!Hm7+TQPVR7FgV+MwG=<3k?3yP03#taNk(A8lvkI96Afe(670WSA} z{HtTaz+i)}4vTqFCJYQ|=<3ki2Qsh4gn?lSx;iZ8Z8BkC*oUqT%{)-?bH{{%;SW?D zD8J!K&upd)46rK}aQPP$eg>ut3?9%U@bQ@!WXix02UUm5JkV|THKq&<3((bJ@$WuU z28L7U>d^cP3cnYo3=BWe)nPGD%#49S33@;|F86`VbAYNLl%5037#L!pYH^tdDzB=b zY6zLvWX8bI2UUyDyfsiYgv{Gw#=vj@surJl_n>MBnfJ_$f#DNWEk5%EphsI1GEc&s zfk6eT7MFRTa@+~3hLCxF<_ru`P_?+s1Es$Ta|VVv=<2YfmtE!z49C#bVM%{a%o!NI zpsT}To{$9tgBnwPArv1ctQZ)sK-Jdl23=9la3=9l542mlVgf=^YcqG^zxIk7_1m<1R0VT z7%ngfGw?Ckq%*>4-^}Eq{Nnty5(SMQO$E>?Rk@i}nR)37pjGmjIjKbq3=AHfF)AD$ zoh2#);U3Lz6uK=vx<7SCvUqf#JNTTb`})DhOfKDr5B}nCJotm-1<0eF^L!W?7>o~i zbjPR|bnf$DWMJ^W@YXg;D4e;CwzNMm4NU}5lRexu>i?a1QMeW+W|qx;0cM@)_f zA25NWeXS>7(i`AMg~wwf-atAWM}}Ll@68#4Xc4pvSnnL zz`(%Z3KmN>Y&s(YD9J%g`2aWN2Ll5G#1znY8^ja|Mg|5Kuqg(N zFt-FSGBAMhJ|jZ}BLf4(lmtcw22h`jks*T-W=a7g%q{dUW>g0BPj^e}aGg1rO$n9-UJ`0^QCWovomF z_vqXTwxn|_$O4bv5ETPYXo2I>?W1Dg*!Yuyf#E-Y&n*T9hHf7f3oxINzyB0yq_*2d z#l*1@lrH}B_khiHQL(WFMI?X!N|1uy2z$qaKiRt71zdUq?Hv#PVskwBo6Ygy4>p%h z9~A?aP8Ssum(CCs3zyCq6`K`IrJUWtEZxVtxnJw9U@76|7jSpr7j#ikc+Ho_pAU}G z&;0c+Dhk~tDhk~$Dk|L}DjMBBDmpIK=N$R{Ke|{S=q&Yc0c(5a4A=Lq>s^EMHO7@^p$9S;dAyD0P7*zRqbURA8 zg6b*H1mjCS-5v>!{{sb}H4jM6quVn9B<%S=QNke@T=_XFcy`~kbV?}UhJ;J=5ryc( zpzLPg(YtE~0|SF^>wyw(&+ZEz-RHqB_h`Lc!spWM%;M2~zFQa~)Lo-u0JcUU`Y@=| zo&t84JLoW7Fw6LWXD5Sarvpc~qk^SVLMgvTZx_gH&+ZFgzZ?b)%_o7CdNjYWaO^&C z+(iXcLNK@*A87u;=)&)M0Af?~5sSm1LIhL?fh$}KkV;TX1|iSOz`%ei52_xq$wQhH z3=m2;CpiU)S;pWH8XOkx7~&Y}80Hx6(VL_4(xdSWI3pnyJg)yex_^3fhA#K$_7w2w zjmmH}esbJJ1$gY_;mmB==5y|g|@gOIJkX!H-W+dltm0) z&SGX@aIr3}FA;YH7gi{ewalPKM-!-^{^r2JSR&!k9V`I$lTT-|fM<6*NTxY~E`z6bx|?s4(0$S4BvK-P8SsopUxB&1+Z>VLNxH`bQW-JJ;2`z8e)Z+ z<-x(|+Pxf9qPcdrPXQHQ-|uvDJAS|6c<>3E`{H>*+;*Pn~buy?>bM4=;dey2`-;-Hfx<7gJ zhOT$K_|CEWn+IdDfJe7~!vFA$P8Ssem+k`~FM+PJ=nZ)7+1n4Y6KoY&VQ=VqkYdN? zH=?K-K)0&(252E`aPDO>b8J4M<)P^;0J0CH@qc)RN4IagOZNegWgweCS8sbHm-d4) zx< zn1cmeTfdd~dUk(u?v*i1DJ34?bv<5vDcH)QTv!U8PO zoeuJeNB4EG1lY+w-L=bK-Umf`^FJ2;*2ADWD!G^g6mq>RWu49(kQh+D_^MMFDMUa) z0S)(q3=9m$mt1?@1d&4$WB^RPWAjm@p!bC&3Q$1yg0;HzI$ZPYJ_mMFFOQjH^II*C z;TYxj4B0TeX9Crq_-WZ^=pbQ8OKTu-la&3KE%IesC z;I)L~_q&eY@3?j!b?m+Z^HaBrih)PB?|)bwyAuMaP26MM(9t zn1O)-Qrv@T^aOBO`H+EuAr8#SVq{=Q2D3o7T0>Z%n+PE+(7hs%`r{T8149W|-Df74 zc>&BYz3p%osILaGEt&-;o6Q2N;v7Q5K*i#Y9S#iOHY9_G_5&?m436DLT)HQ6FfuS`A9d-T$-~IN;FEj;)G$y0H4IdII(<|$Jez-pmg#u* zdWLxHICua8Jib5l>~;L_(S6GJlE=Z9Y#z)9J-&bR={^B2$~-#fsJw7sVDRhJISa~0 zp1r=}9-VtsJ~%Kicz{#ss#U92`E+hk`2iC7{?MnlMFrFv^Xc59vH>J?@D+;(RLrBZ zO#|fSUY;P|UX~L(S1~a#cxa#U>1+eFd_6k*Ky5Hb>o@$ppr#Ql<94nC`Ol*_M#aF9 z`6b9lCXUu`K%O#i>^{QpbF{M!6cX@^?$O-`vc;#jn#Hx-+_(E^x3%#la60$sKId_~ z%>mREV_;x7-lo6^nKpCj+y)A`&V8Uz1FLL3P|D{4%^e=iuUTG8HUDrZEqB!ZckzEo zfnzU=ooi<~i(@CdXZL+@4d7vYqqxnd+ebyir8`7L!KFJ!MFr%O9=rel{~I6h>4t=c zPd7B6x}ibX4GCV4?jCTgBBfSP^n+4rTq(#FLyp}CeY!7xzu?I4dGK2!sBgnmBD@Q9 z+p6**?F+V`E)&1gh1dLGR`-RS{}~t<_cFzL!d3;-Mml*JGcToxGKJDAx1?v2y zfvbLSjnNUJVzLVqj%l4PDn^d~FN2zb(T5$on?M2Q+uc>c$iTqA{;)^#2_Nl~zRV|l zl3i2+9Giczmpl4ELdLnfrwJ57p3JBIKXmL6^!$I2APKRBf7>O`?vr3PxJ3qL9Zmz) z{vZQ!;&luR458q*@HPephH~(%EU2phiE$Q228MdD7%27Dfmu9^3=Fkk7AVuyfLWm2 zQ4MB+x|*QzA!Y^{Mh1pTuox(MK^wJ3*oDk$l0UyAhJB zST1;Uvt00KJy0UzV#!g@Un1|*>mcCK?I7UMdZ6@;Pxnkv2J^9=3Chg1QLiPsJ3-bm zdT=;)cY&;B^k4xG)_8U|fwH}KFHf{bugD3{US~$n&L)s%mrgFn?k13~PA3k>?k13~ zPA3-6ZU&D|Cjrk+0kD2>Y=V>HnXL>A3^Cv|2O5160F6FDI<<~r9*u86Mxqv=AbTCV z89-%UJMbe5=S9Q?)M(#rxC1*Jb7>x(raj@<_i{@}1aSi|MmeGts5mFw;U z1+n$TT6LIgtt?zt*rjtG$YCy>(?G6z`HF#o!MT^mtoyq5MeXyB+NUASH|ERy9v7W^ zc^F)~54va{bksiSsC~+n`H&00$3aKy3oiV=ha8)KIMj*r%Qt}h<9P4~6Z3zNQ2iHv zc?SkZa40&q{36T8L(Cy9P%6zHYS)kKdf%)J}?L!xTxO5-rbe3@JW#R7j7Ma=U ztpXD4bmnkmKH$>r%mY@_=`7&VeZ#4jg%Qe?=|0iz%;Ly=0Ltfq8rJD7;?aCqz@_zi z$rMO8=Nzn?)BIYX`8^|lYbIz6qPs^06iKl15Y&SNMWbhTw1g+32k97hSek)>0aOUG zFl=LFV1Nw%U1o&WrNQBjp&pHIK!XmbNniu0wb&iV0!{<2-I6}tFCDuXT)RD3y1iIj zyIVnt;NSx$P;`ru6`Ur1 z)M_~%{K?^BeWF(J;7<b)RtT zK4g4K`_xRA?gK8yhg`G|Ia;5n<96<4aX9#cnfc&r&R!PJgFl!ZnGe|huV-N3?_UZU zn&@`s=+5SG)jsT!{X@%9`<-L=f$p=8{Ob=n@~=OseQ>7nA&^1G>#Mt~1-gqx9JPNt zYJclK4pPy54oyvX_gPSrTlZzg-7#iiI;r;|NnRC4(0&)y4zd8rPJHMxtB#4oFu`i zn!~Y|g%ip>(dn$=)XO61(j5#*)7>Xv$rr3v0HoHX+gk>d3$zcpbb6ay{L$&G08`ZI zEaB39!?~A53~JzkPG=sF9x%7lS;wXO1ju|a7h!g%vxp0*s{wUKr?U#eKpBtb!xAq& z{{8Ph<1}$KM1cF1u9YY+$JeuDmxO7hhC41NI58aKR{NULA>fm1v*X{?72mf(^ zMgnhIzo_AKvHrl{dz*=Yp&MLfSih(R3-z1;2^|HM#Sz_`!D+Vp)WHWFj@@Tmv`;v8 zA3OMfL;D112+Ps>U8xkPdFs-AtTRMK!K3?h_f>GbzN`nCamuGNM-|vO-f!0gi z*IoGiemF9}b?iRx(z!hUZ=|0H6{+LJiX~t$y)dO~bTdztj11J@B zE>Qv1)-L?(pE+8;E3t9u-UAkZw>n)I7lU*;GQV|U+zm3#rTb|2by$N5-~ zeN+q@4}y$!WIhkJ6k;R96)%ez85mkGfnD#~eH`X^7k5vtfO@2$k;!f!6^nxpI3Py3^g8@^;rBe?*2|;h!tZ$s zB&6V{ZUscMsTIF4{jq6%4Eu@7Qa?2#VwGUyjyaT)WSAUv=d7 z`Qg!h+NHY%9FmUAKj6-SIuqo!{~Ra*=>m4uF{mAm+DAY`tTv9;U-*5Ffh-3F^b}~^ zyykGxhQuk}hP zmX!%6+sOnITMQQiWkZN54#D8gA9zfx`Hcn0RUo&zcK>wge&yKxp?eBAuw1)OxO9Iy z_>TjW6Fs_bx?2A!l>~QyuX!{dv4Hh*kwt2kPJ<8J{q z_PbAcbmpiOIBK7Sro20lrh%*WeNYt7Q2{j{T=@Mi7{3MaLsS%YfHEGx-%%IsQ=O0~ zY(3fi5-jS-@AuMC`#|eSM}EHpj{NHn&;0(k^-|{)70@h7ug8CW&lAvChopH&<^%le z4>~e`a$)}I+I_V98fq>CI}#KO-7R2efKnvLz+N6LP%`XI_}>jN+J)cqLF=W?9cl~k6R1gxJfYeMYVCuP!Y_~Ro7NXB;~7fD zn|FdrA%;@U=A9sm7)n^d-Y`DUxf>K+9-ZK_t#dP|m2bTnRH)agS#JilIcnsrcY}Km zVx7$(!#qIKv7p2cornc9kAtN^MW=nJ``p2woUJFj4}QM@ z>QOdBdX(a-pdKZ-4_PF#6U5d&(S7hWCs@Rh-}ksr_iR{yQq8Bk8`P0>?7jx>OD1)n z1@$Hq(m>6-gbo*#6vzLUUuSlAgF2Bu-QAE*AuTavtJ(;ikf8^M~2<|=-AYb$OCLi$ZKFPoB0yrMK-B}Jk;AH;LeN5Y(gTG}CXp}RV z-^IEc6ioa*AoCCY;A}krYEpc^04l7%L47Uj*!TeCSI}G&sCg{01I*I~DSgci6?NtJ zJ?_!n4DvmwgQu1TD%&$0yRSimq5G^$hl@%MC=%u9?-#s z|3|G?gOg3q-@l-iPmPL!4`@ArPj`xn11LXLfRbW?NAnSn*yzKcS{W3oII$kQ53R_^ z0G`lgW{72EV1V?YLD&0cgUjy{CI$vj@x;tf!NkDO4(=P*FflN+fmsbq3=E(i9Wz4< z69WTiM46ePgNcEm87$kw#J~U=8enFaz{J4N2o_^xVPs%&f;bDbRvW^CjD9dPfaXj< zd4?H0QQZyE!OzCPpTf?-Z^FjFZ^R9nk7fX^j)v(36$cQV5Ef|K3snCwGcZPRGDMZI zG4LmGf8cz;eu4D>a{?21l7xW))bod#0IFjkCO}vq6Q+ahR%B&jU=0CHlOuG1WFhK6 zYp@_J&~Pk72gux$pnMB893l_$7lZ}UJr`m&R0T)}h>5BOq8ela#9WY>pgBO0N)U#~ zqv`<-*D^COim)+=Y!Z0DcYvpWJAe!9U(l`xkS-7gbp|26g|I*_0!^thGk|@Y0$Lux zzyQ+$l7*-Pxdp-k`4*xBqzaVVK<0ulL>}ZS2n(cpJ;b*>EDStfI2l;4aDmN+=|VLX zq6;)S2GIplB?+2n0~yW$>ByqH9W=_p%mCW2f$SPoH$cn<*#$8dWTqSeb9Y1B4Ye6$ zHi(JKTu69;%mnQO0I39Fh`p$KKywt#43b)$3=$=}3=%0i3=$^V3=)hQ41%E9VFm^U zP!}JxC{dxRRt6qMD+bmJ%muJ?4(j%R;tOHc zQ;;E03|htmF$=;1nFSiqW@b>-;9}7DV!@#B#F9bch$DkQiUR{jh&@;z%mk1dA^Jd5 zsSuU|0|NuZ1dyr^;F)N!CI*N+C@df>kX@jDDJ1SdYCt+bG^!eiYEaxk%mtYVnlc2b z1Yw9gs-BzR@LgD@y>Ky*M@ARQoA zqv`;K21qpsgUSww4hRdR<2A%}NF^a?_ZLVt2!od5Ky*M@ARV9;Y|IRdY)lMnMv#~V z?S}!W24PT14bcH%fpmO_*ul=sz~00h0MWz1fb25RSU5x%gay*|7pzNBjf+9;3mb#< z6LtpvBODA|CHxGmDIoVFOaR3_L?6gZ2n!VV5EH;+NO2F52gMPD1+t5o5wx2Ily5

    Gs}-sXtOms{&!>;kuw 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Ȩ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 z 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 RW`HXLbD>hm6j+>r3jin^NFo3L diff --git a/vendor/FreeType2/lib/x86/freetype-d-s.lib b/vendor/FreeType2/lib/x86/freetype-d-s.lib deleted file mode 100644 index 4c51f4f836515b6e2f741023715a60ad57beba42..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3000666 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%0AwPuBc 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%0A_h?HBY-3fIYk=T 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�t6hGMJU2 z;S?hSLntdl!&^oMhHzGfhWCsN3{k8M;CoV|Ss5CHL1%HYGBjv`&fH{WXaKDxOJ;?v zB?I0428!QoEO&>2?yvxP7u0(J(V#Q~%6G6b<0u2>ST9HqNDXMO!wZx&lb%`<4_c!H zSy&57HXt*xU~I_-)J_Lw-BK0?2GG<3bXg9lAOV#cpo3eXLZBs6AP0kl5UV$#k|6aU zM}gO5<$|08DPz`&5f&(Hum>nD>R za&KN1KV)tyo1dWpw2vT%AJTrzMhWEcz%Y4 zY6b>|QhtU8&>oU9e#rT*<@^i{pgn69{E&Ogs`(*jiPT^z=e3wY1CWR#Za{Gcnn!}g z8EAhZdOio~0jZGzovQ%~9*}3j`~JY&YY`C!3Tm(%DuFG+V0jpkt3hE8%I8QuDCE2e z+Q1IlIL*KS?lFTpWuWQ-6xrZqa-cO+pn?M=mP| zhKBv1GgSB??e@F;3=NFT3=H@985%%w_y9|~0PQsbWeZpog3<-(jw@KY0QEP}*Xo1x zfYh8~U|?8{k}e90@(WUnN-E<)%fUcd8DumlsL?ReRpqRL3=FyXDWy4(6@8%0ECU)r zfSClInggX8kPCSP7#JWWKWKF%$Z${<0~Uz~EoUqNAKC*-QJ{JP>6$E%0iZ+%sskXC z2gqp*w8$8gF&P-Z2Uo+B6X+1?f}+%t)S~#Z)S}|d{5+H)dr+GKRHh@s=>Bf#orj>aGC+57g3iPM z)tZ?M3=J&|3=E*NFhKLEptCSQWeez>u5Anq3`GnK4WRf2orQtE7XajDaO{8_2yH`v z$_-c=0!0G%r$2imv90NI;U#{ii-0i7=b zvIca%2xz|==zI~-`GBDNEJ5q^K<9~o>Wf~`xg`t?450fh(c`QPy6ylLxEImRumkOl zN54M^qz6>5f$p|iixOv`Iy^hIC=YhPA!Mov;vG;bfUp>lq72l&Dk%Z&KL!sRg0elR z1P33!1s>l7kC=g62NEs9g10-*d3ADIPBVS%za z$R!QXS$t4_L*5?+@*gNJKm%7WwV?YQL4F3E;{j^torUH%&^aEU{>Meo`56oh44`v7 zKx-$jK=T*q91l=9UB_~E3TV$hXkP@#7a;eb@10r7h#^ zpm8L)uRyU0ie7kZqU|z7E^D#?I4}7^Cm%q*kGOIV4dJr2Bdw6yfy(8KcF-O8Z`xtDS})AI->;?caInt z8bIqqKxeUlEPKrWx$g^fFCeHa{=fiPR|`6W1=P0u!2ns;@e_0o4`|$w0kY2aKLcdH zIp|Cl(EWWZpz}r;A!o7ZGeXW{0i6}Y!^qHJ$H>6I&j>lsUjWN_0*4qF7(g)qiad~8 zU$ZbUNF$v;!p{gg(+hRZ2BZg+7dC^|n1CV+q!HXM1Z~NVFHX%#O@kg} zjnpvw0J_~cvnmz5U;&g|Kpk?>TJ7vq=;|R*(gH<3=(xg?5|9nxNe@`=h87~AlmsfK zK`9Bdf(Mn7&|88*X$h1l;6(*!-T+i1W4Roi4SYZ*Xp9=<@HS|%0iO2;-R}kx1YuBk zfZ`mKwn67TfW%axcf5hlfC2TDL1(~dGB7ZJ&VT`x8`_Kv4WK=&x{Q!DKn9Eq4WKiz zj2I#3XBsmyG=N-e#t2#aV-7uY#EOvtyynLiboK`W1A`s(Oae#Hoqr4r3{F_$xDhlj z4K43MZbLs~CJjq@1JVQ9s{^7pV8(G#YGG+Abbtpo+yXM1g7O9wF`!fkPZ6L@2ucz0 zf(#5rsfF-ZM@k5wSO=vI?6D3Sg9q(cfOhLqVjYyKK7$IvVKviVxfdjdk)eSNbj}&H94Q5*T}B3ma?m*$ zj0_BQj0_E+bJOavq^(LuNcjOu`yjWY_a8uGNa+1akRDL~0kp1SBTCu=*YNS61B@7m z>pg&uEG;PkU8xRE9-!m`N zkcEtpwmj&37*IcEG3cI8(6|C4Wb6oZE(~bz^-9n=K%l-BBV>MQ4I^Y833N^jsO=8A z*K;apogX6u_+HWNjF9t&b}~ZF+}+0rsV_kHc)ns_U^vJKx%cG|BSXVq1_lPueV(8; zI_Mrx&~-PUdpzYC85ltKcxr(9p^T7wU@n8oBt`}X(77p~xC5P=g5ItKos$9za!^hN z`5S%RGAK;U(9Spj=>a7J&>fDOKn##ZaD4)5S7w5GVc@_9B?*w(U}=mR1(c&fwt_m8 zDMguOsYUQQ1=K4mDTzmz1ZqQqVwzJBG}@R{lvq>=o~Q;zCA?w)#VshZK?WA5<&~s> zlNcyHfG)i*N(G;00LtZ{b6i1g5)oto4;z8nmB{r2$bX=?2e}(F6f zU~q)qqYOH?19YYt=-dul1_lPuxgDT9@5TgK&kQ=h1Ju?Bo!lBt2UW>pFBnFiQpyC0&EC8)r1}%#KH|;PF z5C$!kM3zDvAPh=BpxOhRG(mL-s1X5fFd`oy3~~u55h1O10J#KIXMog}Ae|`;N^hXl zg(yovH6UnN2B=1Y?0)kHX#%A$)cpjt8$s+E28ISu{M0f))*gfUilF+u zl>u^hF{sZ7x^otE2BjYZ0|Th92)bi+0t4jis;QuJ|3G&YGcYtP2CYqIfUL6vojnN} zpPt3Q&;UBm0CWcBMNrwqz|e4qfq`Ky17yuH=xj;Q9a9@Y=MI9(CM^9RP?-o?0|-lZ zpz~rCk@gUS_Jld3l@%a8p!fjM+i<13_{_ZIqWJu>)S{xylvGHs2xJi`U_cmVA%%O2 z(U${*;u>T$k*N;U)&O}0+RZ^ewi=X_kfji*4wOJpQXMF9ff5C{=Zt)8HK;5DNgyXN zymqzKTe1khnc(36(_3NkQ&gASH|K}izS??EI$9W81!WjW!?#>7>EMJ z4~Pb(LD*`oUC=Qr(D|aEw(wpC$k`&Gb4EdB++haDI*C&Zkb8bXeQ(fOQc&N!m4Sf) z)b|FJpXV7E8bEe|&d>ynyMp@Op#37CGc-YCW}v<|sGfPn0J%>a)XxH)YX>^}5_C>1 zsK3Pr+Q-iT8K(u^!wx#<33Ly;7HGdAmb3~g!$ENiD#Jnk0=08MO$bnl25RGg&hkNCLPXL6r9zM^L4^in z=@fW`1>_J=*_TvVk_ugW1X2k~Pe^4GD8fMn8*+rh%N$TW19KY4Zy+{k8a@WZV1V>L zLDqo!ouD;+pnfN)?<2$rStlb3y008`A_XJlo;uJOp`f}`l98cd9_W5&Xx|2ORw#PA zLJwNsgTfnR9Vq-kV`d;eDEvX`13mmfdO&JGZL1w9;qR7T1ZrA$wkpVnM2I>!k&bl#$o~;S$7k>lIlY;t4j0_AGjF9!(p#E_mXx|j5ufxc|0O}{d z1D%h?$j|^<+y?3=gTe$`KRJY*fdNz^g2EN#wl;p$b`a={W%O_c=>e5-AbJ;OI0t9u z7UZNtf*TypAoD?HgD}he>N}+tf%l=nPO(V_ z^FR$M&;O^4XXN(*TRAl6f6l9fQu{8=o`#Zs9Qi~6R5TW2}9Bu z$kCvx65CL=?G9Q0gUHR!pv+MtE0jF5R$(D}BY^KT0o85(AT?vMf1 z8=!O9L1SRhaSPCSJC&ewI-%#_9%5u*s9|JixDGm}9dr&abX)^;w?z{pLxU+314A<- zLxVLF149dFycBd^J0oQ8Mh7E9Ljvf$cF;MYObiU&j0_D0ObiUYj0_EnK!gZA2S2PCPs#a2h0o%pnm=<(7El5 z3=N-|85s63GBo^QW?Lp>`4!$(kfvNAAyW@KpC!OFn!jgg_@ zAS(mIcTjw>GBErEjeoH+F#KX47!0-=rra3DE!+%D|IRy+%3=Kb685kIu7#jYw zGB7YRLGEc~WnyShV`E@oV`6B~V`E_81l_I0#=yYM#L(cx#=rnN6V#oJfdO26p#pNnGc$f0@X2R1sND%=AabrQ&|`o z>>#BmNH=J}0Aw$uvI9+2fvO@<@mo;=p8W?^ryy=+C727Ui9y^72p3fEfw+|w7*&G< z69a=5qG|xuXCR9pi(Zf`1JHnc7Nk4}1sJHtLTRMJ7PNutfCG@*NWks~#Vd#bnnT_K z6*pjlj3XE^LFxd|IkccUzyy@$85kHq<5(cygT}2u<5A8`kb4b4<5!?151{d?EC$GV zv!K1qUQCdEe4z0v(A+<0yy`du0|RKh3N#iO#01%^3>vQjt=|ESS4o1_u`xmJs0N)k z3pySw9CRKnBLhPO^jzFXCWeME(E2tehK6|1S?Zv?#>l_`I-eDEw+HBa)_O(;2GF^z z-JrA7nHU;CbwVl=CKYnT3I21`|WWV-^O6Sxk`ogl01_H0ZE0Ff3tWXfS1EU|7b)&=AbZ zz_5aep&^o$fng=+OjT9}hSf|A4a->>7}hc|G;C&NU|7e*(D0O%fngI9LxU(A1H(2Z zh6Y7828QiS3=Iiv3=BJ=W!)|&$eq-CLFW*I?yP2FXoz8FU^ogo&zPNo;TR~s*clkk zGC}s+U14Hq=woMKxW&ZKFpHgm;Vu(H!+drIh6hXx4LjKx7#=b)G=R#VM_9@<@SX|= z$a*(WdIt5EKusD@!2{|qt;KRbA4m^K4X9tT7g45_l*EHhMo%nCjjzhjO9eOKK}KT1 zNRyiTRT&t-%0X>P(4b=gbQ}_8Q3H5V9J28XysH}24FY9oh&ZSbnO|B29#DqfvxD6K z2DumH2;~0vS0>0h#Bb0usegddE@<8ulvfxS7=ANB_SXIZ#SH@k!(UL^VPIhR#{^kd z_@4=KUOfXd<~s2&p#2|6bBLg^I^?^ZKwFW~=XpSSKx=$J^gcwGhJ?g>WagD1b&7C| z&5?RW1*ot?s~te&vY-e6b*(dtMei=em$VNh6tXwX=$3-sP4erCuzMj>X%St!EH3=N?51!Bw$4WRQh z6_^2z8d8`U81k4Qd!h5085-6wGceRM zGc>GYW&mZ92J|tOY0Qv&SU_b2D16c9$U*a;=H&%qYg@1poEK@v_N8@w2R!O1|?rmVg+f2^j?wE zD(HF(W<*+rH&LLMErK+I8c?8)E~Kjsnu-9WP>=|$2MuewR6=!u+4Q8E!l3X2(MF(q520zfpBb{AaRM{s&XtMGkhAHgF+CI$vh7KVl-(EUm*3=N>W!gyI2z;}f4u`o0& zWny69XJKeq4m$glg`wdP=-wq3hK4=EPi3=N?6h8zpz3|A!z5Pbk^9)Y*^2ui1*N&%%w51N$&c??kl z7l6)b0UuQYtC>N4iKN8hR7j;=4DNfN=S9${4XhDg0q$>rdIX?K1avS6w;(KofRB4F zhF^CI%7I8V14<7AwDuQtA0Bl1Fld+#lno1vz{Z2d+CYxZ0e2@rBUoTbL+~&fsKNnB zf?N*v52OnO>Jos2voSgupil>;f9Tp4&>$Je?YW7`@s$wQf(G3{!(A}p3WzW$pCgwr zy$lQt+aQ@5R6K!BU;*hszTy=$4h9l~l^@93L37`1p!@;3qHqoJZLOf95;PQsR1bq} zhhTp}@ERM?J$|5+1Hz!R2ckh|OoQ$~1+g7iApIIg7D%1x&H_0L(~||VU&n`qp}`-t zo|*-+<|2p%vNt1?1+sTH9F$)`cR8^zG=RJs$pSeGGl>PV<|dhip#iimFogxOW-pBe za*kLA3uJyYlZ64i$2XgWq2WIR149lALj!0|Dwlx;J0=bWofngyF_s@s!qDIh+KT{k2NMIs6&A=I<7+Go4XL2=4oms*3v^~Cc!UxZ0}KpeXm{U$?xjV) z{{o~3)P@An2MLrP;OQK26CJd|4q^v2FTnw&JG3eqRBC{V5>RG>wA;bC4BVbaElptU zc~JQPsz^aPGQlMXsEQ}P<^~-ylZD7vpgI^dQ=FSv0UqfF)!d-61SE!NwSww$q#*!M zWezH%K!dulL1<886Iw@u+H$ba1BE+?4QfyNK&)kW0ZJPT3=HpBAbZ_DvOvzx`@+J| z0GjXl$^u!V_?-n(7yn>kXt>S5!0;2A)_;NYF)}dxVPR-6VPs(V%fbLYd*>euq#gMm zl-C#;7+6>#?MZG{hK4na3=F)i3=N?BH~Co^8g4T(FbJ_i+LgkrkiNS(D?4JS*h9SkT@)(71>; zD?`I^CI$vwR)&U;pndVI3=Ka)`{G#{!1rhxvNANNfX+2zWoU2(o%_nl(2xe&56{Zb z(8bKaV8;qM2iAd=pOvpdou7KxHD#Eg*k@*q}N9G+zK> z&tiql1I`A8EvS9R3hB$tWrgg`TEGfv53XZ{vh6d0YxBVdV7#SE2fc9g8+H_vUi7U{48c@7|$^ejC zL2(6|Uj~VR;tJF!w?u3Ifb@XWxG^v=97e=d8fb#8xFjAl3!Rsrk{X`~Y4m`M0vU~l zk;WEuML|o}ic7$ATCk!AbY2E1Q-c~Kpi9g_w;@6@G^qcGJZ=DT56E!jaf6er3=JSR zo@Hfd08L_@V}n6ECqcfY0i>%nDhve3cclfAJbCLj!29(G6C}8s?i=!t97J zcwPs59}LLe6MU%m1RQ5&U_cKukRDLK3Pc}4gc)eIF}|dzG_|C%AT=I5pbJjopeuYq zMuRXcYA9UULsAQqii(kr90DCUXox%j4iW&bKm_>_Hkq4R1Rhd?r2}xFK-bNK2Ek!f zP*G}fX;Cq3-3O@B0ySwtWeDhi{nVoP{Jfk>aAgFlnn3vxxt#_Yu}1E0f?9x}LyDe& z=YT5$|tbsNCKqUsK+5*)` z&_yetnheybMRZ_6gE_aMWlnxUYF=ted|DA??F_fzbf^R*2tW>kl!hrNO=(cm1au8N z1LVAT(7`m9^XUIqhGBA`Rrb8O|7XSbM2er(R&ut3%|NnmrXdEX$uLL~h z3~GBKH(!Ie85p!7L-3&1FX%XVkk>NvisL~G`9MLX04hEO85ls>9~`d+sMooGVhMEg zJ*c68-n0N6VUG}pH7!6P20F_gR04oZHA3uAQvm3?g=Y{SfsCI6wHGwpmskWpCD0RT( zH-ZWp1_lP0{1i}zMdF`_@^`{EH-PFI1E?mDL7?&*M1zi3P=SiSVug(FyoS~-?^q#w zt=~h>N%+7D8LRxt3ONt*7b`;p=w7|wptc|b1H*q-$lX_rYz*N36*C({187YFKO5xE zT|qX;7^W~AC0H zG7c01vKKTK%Er)8!NkB2!N$-~2O1M)gN%{Ju`x7EV`5;4XM>EDCa^IyEM#I}NMd7X zSjoh|kj%!=0BYl=u|e*L&tQYhPi3+(G~5EsbFncrJYiyB$Yx_`c*n%Rkjnv=dxf7v~4btWQU$HSXq_Z$EOa+BIXda7=p`o6IfnhouLqj(U1H&vfhKBVl3=H$w zAa@?jXJcsC#lpa_kd2|?JPQNEB9K2>7#J3_F*JbIAS_{H0H0sE4CD`128QKq3=KA* z`7V$@K=WN}3=KJ;`7Jhvh8k7|hV^U=;4`H*utCnT+z5(SRtAP0Yzz%2SQ!|0u`x6} zWMyF3&BoC1iw`>dy_dwyu z#=!7^jiG@7G%v=+(7?vd!0-r^uGtwFp0F`Ah_f>=JY{2OkYQ(Fc*Dlf0IHbYfx?-c zf#C-mLxUqb0|PTVLqjY(0|N^?Lqjt=0|P5NL&GF?1_lmxhK4ol3=G`t3=QYl85nrk z85&-&GcfS6Gc>$qXJFuGXJ~lO&cGnZ&d~6Koq<7!ouPq^gMmSeouNUUgMmSuouNU8 zgMmSUouR>kgMmSkouMIsgMmQ?WFH3ugDg8kLly@Eg91B4Lk9-~gCgi|4-N(fCD7d- z91IMq>o_vpND}Vj~#M%Lq5nJ9tMVDc7}#D9tMUAc7}#*9tMUgc7}#>9tMUQc7}$nJPZtV z>ck?nZfbO6EbVm=0j+3XArm3#~gbJ!Ug z>i8HK7PB)n^ztzz_6X2p#jt&Il#`)P{_}~aEP6up_ZS4 z;V?TxLnl82!x46dhN=7v49D0R8W!?1FdPTPH$MZzDRzd2o%{?8XW1DVK-K?Ec7_HH z0S1QKp!^`fz;K71p}|dnf#EJF-3u@vLC76Civ$@MzOyqltP_OXrL$L%f#EkhL&GUS28O>N^930gKzHig6=Yyw z<6vlD6k=fD;$UcC7h+)G2HgoG#K6GA!O*}b#K6GE!O$Qj#K6GM!O);4#K0iL!O&nT z#K0iR!O)N(1i53UR)~Q?gM*==RfvH>lY^mQfe-_OF6eF^AqMarI=6)w7)&@A8tw@} z?#@An+yzGd<+c8`$9kqVbIrlgY+meFff4Vqli8uXu`L&1ln7Shiz*B zt+fYP0BW3oFw7$A_8LL0Y>>%B^wmJEX3#VNXy+lg0|Rc4g9h(WwjP3dSD-|Zl$2iq zRskAhfp@n+_JKM~NTV*Gz6WTa57bhFb+wQisi2uR&?(r^?ht5N0JORmyxj!S;6zpp zy0Z{;9t;BmxDN-KY5*Aw-M<1JkN{0afW%7jLCbiVL8A$v00u9seg4D zNCh42fH4UHYM=)}TCbosJ7}yQV`~bi3k8~nFoAR~i@etVdxsbx_c?(=%ms8G5@>H82W0#MbdMA0 z&Tmi9eM}6H`r6=#F%7>_7<6-bB!T0nkVXNMtQ9YFQD2Wp6u34=7$i^f5$P0Ulo}PRcBa&&*9s zhphDh84WTPgh6>3L{nHwfD$gqD0t2WWq!~A4kGh|y8a*!fx5up;s83N0~$~P4cvf| zIM}tICHauPJ1FDBcdml0z$h9((+r>vF?19Ll(9fX!+&W82C%1Lg(Jv0piv-@C6Igs z%0IB3>{Zat9;mMe+G7O`5C%|Kg4oFWn}2}rxdI7tLhh6X-7f_?%8Q8;GRMZk$vDJ~J;9GW-iN8DuI5gVG3y#<@HM6w9D=gOZRy$p(>-a3mPefCR`LpaH=2oXWI# z$h{xnK|qkHpkZW`Y6X;-kkSsQ2nQt*q?!hlYCvfak!nCAB%lBP{|~aHAT=d1uOu@W zWk3qF>;QBnIRgWO0t2_;GpJhh*@XC<)Wke+Z3h}OEEQ*9NUcas1|QV*6sjd1Hdhg! zoRgYZ1R5U(A5#7tT^=k78fOGKswfp?P-#gjs;fYQ43Nr#hk;uVRON!QA!L;;s5U{a z5kb4#o`IGPLTW_xfl`oi$S^#3PC5f(EI3j@X#&ImjmO78#XkMQ4ESA!A@* z$mE3V;mzWNoD+}@%}+U;kn;j^IT;#2_lo6lGBiA8U|=ZZgp8FGaWXV~2c1U<%|B(F zkbA=`K>3)FfuWj{p&^%%fuWI;pib zkC}nNiHo5DlxkeK7#cw9`P{h}8W>m@7(BQb8aP=P7`(Y4=V<$KF*Hbl&dcUvXi#Qh zVDRUH+~pC##n501IyW11Up(mCY%Ycdf6%$vTnr7MGA4`*bNwdhSR_z-gH14j=B_{q z7sLn6U4hb(3EJEhNDoL2sIEK#Dlb3=fX`(BRX(Xj@t|WM!Ba3`2}}a}EF(Bafa(wA zS$dFNAOk@5!4}CybAguXF)+k{?x|;BU`W8?uP)I1Ez+6-Yc|w9d!V%}=QsRNjJ0 zanSSt_>2(|25v!6DGoXz5Ioo%pPW|$o*)1f%SiV;fQlzj!3-*%^1w@hKvg`5mkH*9 zN@x%-3*0mY6`r7oOv@}PE&+>xN-IQh4RRW&WJEfK6C?yG(?Nz5mF9t*0gpT6^);Yy z1g%j;US9(`ZvYg=Eew#e^g9_KXX%5^8vv>6fu2Lq4?VYVA_HV?@+1a^2GBl&$qbNt ze?aFDfX*eD&H%X!Z3Y9R%>X)w0JQFA4g*62=W-a&iYw}aLPGC;e$$(Wmj` z1@OVikdqW(*%O)vU=+ElwTa3LpwkgS*S~=C0x03*O6s6la9ElJC0I}z2IU*jBo)*T zpr#6_T1QR$p!|WB_Fb~vfxeyvqzBaQ0nukL(jcg=iBBv`gzQsC z-be;2NkQRFMnQ~LY9sBL22Znt3T2S#@J2AGPzIHkpg{}Jjp>jpbwI-_pp*m>g&hzJ zN}Qm66)1H<%3;vJ4v3cp9yI|aTsAcZhT_!pT+mWiSOP`L2A~8AO2ddVl0nvk24_H( z1f;E=lbQ!E#6igxWH_X!1~LqkYLOB$sPhK8tQ!j)5L2wFF<>|7#SM)KyzN8GY3F>yg=t_F)=U{F+%nq6hrs*g3dt$-G@@f z$k1>Ww6_bizm zhKAjsxiCh^99S2YbJU9185lt4I)R!3pa`jEM{UP|)~mUpmE9mcpgI;rpT(YUGD}jy z$C+m)g3hIjFD}V1f(&ec>;l;X!l3#AM3a$^2xc5miUj!ylyad9J3xsU)W8u}V_*Qe zFBt47&~g<}`vat~C^bDZKQA7t9@JX}Wg1B}&=I^vpsSML%_y|o1{!HaYT*@!XO)LSor$D(HWO6n*5HzZ)pvJ%e zDP{7DQb0=(5Cf^8GcZ7Bc{4D8yTqUoP|zT2L24qzS)h?skN|ka2zW>qw1gWZlA4zS z9%u!1N|Egc)licmO94Oy4``t_NIAH&1ZzN73|%(>QoQ;9|No$LC-n_oq1=?z`y`H>kc%A3fc<~ zx;tqDBSQn|Od!x6c+k02TNoj0Ot&&JG=R?G1f6*Yx-)4vBSXVK1_lPu*>|9`4G)0K z2erRId*2xu7(i#=xidoczJtoU6QH~g>YFk$H1skuFo5>HgVvma_P&GaLeSoK&>g>^ zJ@4lk85k}xLgw?Yfa+Q%28L^(x)yX6JLn8Q(Ebiah6WEN28Mf}I+h8t*FBvHvd4V_ z69dCzMh5U&RM1{`Q0#;Dwu8M za4<16aIr8jaDn!HvOxB(gYIks?OE?)f$UZ9XJKFv2JOFOf$U8`&ceVT!34RZNs#$X;~N9(@fahK4*=2Jl|=e$Z{JObiWM zSQ!{}LHjvb85s1L7#hy9GB6l2F*N*PWncj9GZtfGU;ynimS$sMFk@n9P+((Vuw`Os z@MmLSuxDau2w`Jj0PQy}V1t~K2TH}>ObiWc*%%l=`-|7JF))Dk7aw4Q>@PmV#=sB= zaz7gb18Dy+Xsp)h4FrABWP)i%+Q%yAnhTOyg@X#7)R1~vVhZoR!d8tKCnI({- z8?>?uR#<0(WWZP4`6d=;qm;IgQXN+QXMsyoP=g++1jkZdg9<0q5*nlktrP}TL{Ff1 z@}=gL6jg%n^F=Q1K&L5#Zdrkr&7cwCeGPso`c58yO(B2g$hK7rb3=E4wWfLO zo^yF7$ewc*CI*HzpuO@;kiF)hMQ$6IAm_4x_MBHSF)(apVrZDc1lfB&jR~^n9JDtM zwC8*kXb%e$L&I7o28MlD@@xb%q`v}c?SsM+y}tr-r#V`l1?d5`i$U~x?0Gh$Y=Ao~ zpwV|wy9?BAFH0>d$xKenVF1nffHEVfVUwGfm0uJFz10FF0ZOr;#uvDa2y1)6@)3s` zXhm#NPAYi8A}Ak#l!E7peG>~{szG@SEpLJh!0gL_no=MG5Pcbt3qbh@Aqs8%feZjO z#t>~SkS%CA8Pv&X0!1I_7Ha5nM$k!sAR$Dj2b7nP_n(5|50sZcbGmb&dF(cH@BAH5 zeZv4bcL3Dqxeq!Qfq{YHH4~%{{}yy!0|NuYdnU+v-5;448bIf;ePUv00Nt4e+KWGn zfq~&W6J$TaPbSDc)S$ihpmQ-nd+tGJtAqC3gASc%VrFPiW@KPsWoBpq%~`TDGc-gp zGB9v5L;C34%nS{nIW`{9o^8-x80bD!0cM7VTcEu#%nS|pL4A5=$i6Pn-fvJ|5@%*; z0F5(AK=)otGDFrI$}lrD7&9?2$TCCrpUN>aG&nLbFeoxJG(fEJX3_K1VV`}CO^8bIwB17?PXNlXk3pgrQCGebao#6jm^fcAzTWMW{jWQLrL z1lk*Zfr){^kr{H2HE3@*Xbj$!8M5vWv?rXInSlYcC!CELvL_sUYyq?%7Sull)jFV< zJ%-jtI?c$yfW9sSqz6>Lg4R}Ez{snh?H8af2=oeDP>l+*0Ax4_qt>XPf*MpzpbQFt z@)&B32P*wRF2pGPxdlPhBS;vj{s1LrQ2qc3=Oz}HKu@#*C41h8f$N=#6%@lB-3Z;s= z0_sVFLIJW=9#n3?lqVK}J0GB24C|_Zjf7R_kp3HHtp{323%WD_TAf~jIuz8^2~JMT zNd%pC0Xm!pgrWO5LH&P-BfxDm22g%Q9&3wWhV0{v1)V7Xn)_mg>=R03hU`(vgzgj1 zW`^wF1f3B8Ix{;DbT$C!UK?hH29T2~nIZdyszLdQfq|h8x=*};88S}X%*@ch$;iOa z0?I#(3=Hke3=N=qxf7aS`OFr85tNr``1DD!-Mv(gU*?m%FNL4nUR43 zv~L}>&l0p>otp`=PaU*B9JEhekBNa{3247N69dCCW`+h(UAKZ6GVZ$)%b6UxpnQpR z&I$V52gn`hduu>?K=~n#iGkrFB0qrcZiKBnk4L(^5%;_Y(LH}qlErpxl6{qd+2{+ybgIz^!L+j~$e!Kq8Q#GUR3+sH4dX zsQ^H&T2RgaTb+V=2oq?Y475HRx&{iA*O2omO1llTW(SsbLE#QcyQ&Nf44^%aAn_y6 zw0jhqcF%y~9(2wvDDD{;7|t_8))!r5hMe<%1#~6>0|Uc#X2|)eH<=k4KnhHZRbOB>@0Rsl4 z{HWsNXAUl)L4gFXtw1>qR9k^sSfCp^<4Y3L!96Wdz5vw@pap;MvwlJG2KEC30|O}B zKxtPSGz$aCCJf#z3=N<#^@pBY5y-;OP{YK)0NN+NiHU(B7_`5f34EVYYqKygM6ob5fYwIDurM?fu`n>ivM@9> zu`n>iu`o1DW?^86XJKeq!ot9iz{1e51#~AYXkR-E0|RK^{WTT_2GG8H(B09XefOZd zqf=QJ8aP0ALbEV5NU$<6q_Z$IXoBv9W?^Ws0^JGC!qDKw%D|8XN_(sf450n^pmqPC z{rI4D|DgT&y{rrjc`T51|M@Ho4Xarh7z$Vz8g{Zm_UD84FcyLK)w41%fcEKw?wBrN zVQBck%D_;{!qD)Sm4Ts*g`t6)je(&YbQdcd14A_nWIUq|v=^FkQPc0wrvuVFHjMQ1yWr=mi;u+UWpItAN}K>)}8;C`erqP%{WoiGXYY zRa8jxEg)M!wGqfE;9>=(QB}^sz)%ZX;{e&`1|GfzUs4OII6%D^&=@Bu9$>u|P@e^K z*E>iIghBBN%8Q^Qvq0mMAhAi%{rHnXX^Me?VG1aXgU;?}ft;_t2vjbE*0qB25(5Ln zQWk~=&^R*atcX<%3=E*NBG!Y>@MnR{orBJd0Ij0~of!c-H+>T*4Kpw>Y+-?{mjj&{ z0U8I`0m}P~3=E(%BS2>ZfX<2l^`rK)Ff=R#jkQ9{`@<}de*SS5$oZ=$Kxfo|##%vn zf{B6Q3=3r4&p8%ITjv4`qu2~d9@bjHL)&{!)A?`VUTr$Kr^ zYCvmbt|9VtNeTGi;`pM};?$D(%#zfi#FBi-EGft|km+a`X&X6gk0`jF096a1J55T9 zQz0#TP|krbD@2S#AsGj96DS>mCJt<%;vCR@SNqf%AgZ){L~m2K+cQ@ZN&y3+5;Pj0gFN=azOn*P|*W!mV#?-SYHd&8{`r6 z28{=T{Rh^RmYJH9QVbp|1r<+dg&?T>L@fkCJuy&W3n}i<3qeTn7m^Pi+ys?xprRJF z5CoO0NQEG%B&!8Ghk*fBl0ojulYq|ufFwcj21-MqHI1ONvOr=ztdM(6d!cEij}>xX zNk4Rd=t@?GhD1zFVPIg`0X_F& z7b`=97-*diD?XrC$Qu3lEi{>~GukTdO0vobX7 zWn^GD%L*yWKxZY~VPs$cosGZ*TC)f`w*oXD#LCcM2Ra7_w4W6;AH>Q4J{RW>=)4Lh z28O$=4B-8o_dxc5=7(4r8oEJi;aMT$AU8^_AP0NQukz{UXl%F4h1 z+J6f=KU9hha(<{B8$-i3R`B8F7-#Y^u|m%91hq3kX#@Q(DNx;HfmT+6^ni+j&!F?C zK@5;a21aO^0J)#Oq_iLhG7AnGrvWQKYGpxMK%is}Dkl*61l0Qk6_lV72W$dld;`>4 z02u?iuo5gB54}?yG$jmjIY=TiHy)giVRE3!Zjj@ka;bSKFd0xr2bI2%j1F=IC@VIWuIxFlZm~ zG&Y6?6&A?8;2IVNhPiBz{sL$p@J<#62GIWB4=fA}p#8s~v;x}yi$2~6nm+}dp96|s zP?(+u?N3EI?+&y#2mL+>kRDJ9na|9?a0?UxAdT?!SCSu(xO*Pl1_zlBR)UcNF@_sq z2@sSt@=9}IDF)OA1-THEmY_)wq!O0&kn97cEl@!XG9VLNiGXSX5HAaS)&Qtj2Q5uX zEQ61iAd){UDJDxWFyw-}5Fq0~E!{>528KkGRxYUX54z9=JT}EG2pS{-rC_k@pwnBR zjwUD_gZ5j%{0|B{P&x)JFa)i^1c`(8S%boJCmZDMW6(Zp&>oUKY>@MRK>MsgcWQw4 zRfDRe6QF(73=9k>*&uhcpJrod0L^usgQoNIYzz&oj0_AHLHoNwciFKqG=Rp*K>Mqk z7#SFDgZ7g%LiSaI*0SGcgParn5VZfA5wfrPJ0oO2H4761!!tI922Lghh8LiH)l3Ww zuR!i%Vqka;+P}`k!0?uhp#ikM|2=fy{wL6R0Za@GpF!?oVqo~n#?Ww)iGkre8$-hz zCI*I|Yzz&Wpz@iGp~GHJyTZ zdC5elQ&6(UOsAj$T+jhqpuI;7kaP-7|Df&|yxj|0O9={35C(-8D2;;VSy`ZCA)vkQ zpfCjOZ3j*4O0z@SETBE^wxB!ZL3_9vAbZ;jL2+YY*uPo15iVH4y~2=5s&;*P#9vB<;cqWf2B;!5DCxJU6+lB)%xMBr!7&yhH-jZU+@qxrup+ z>8Z|TB@8gNj0|A4x%nxXX_esO8B`#HT$0HEvJJMIDKRG}9@REb*$m1sh|*dJYCjXi zOi*74oL4}N36SlOF>sJRP}V|}>7d*Q>SrLe<&g)ZO7%0PQ~IT;#2F|~`6p`o6Mf#CorLqi)A1H&QEUMwaC zh9jH|4cnO*7>;o=H0%TIJK%(zAAEw7q2UM<1H&m!$e!IZoD2=1HGAhc85%%q`YwX@ zSTZp%T;gPC;9_QA0PWc_XJ%jk?b&i>W?;C=$NzK5&Fl+KhK7^O z3=FS8d)1g37(RjaeljyKdk`LcA^w$-W{|r6`U#=7(o3YJlDgdjbQ1}vBgGxt`TS21vr6sUqkU>QOsLuk@47m;tR2VG~U|<0I1>R=?jXA=c5AruC z@A5G)Fo4!`g2Z`w85%%gBE${8<#-tyc7t}6@2YC{iF1ep&q8-zho0it1*7-Y;G9D*2; z1L_GNMGk0+2~ziflozF@8G)k<7eTccln?P5sDc3r zq=3$-Ml5Y!1X>;p2@_Do1e!7csRFN0fcF|ebpR+oLDYfo;sUP;0NpnU8V>-8oA5&J zL$Kn7ob7DQ%g_MoQ`qrB`V5Y|3=KXE3=B@t^yI<|xp&l!7gFZC^FsERdGJE+s`2K9 z+^6ot3pwN2mzSXdAFGB<9yy`Sw$ojerUWNuxTFbxf8r^pyUKf z=-`cuP;t=48&I+WEmVh{eh4xFlrTYRlS_-BDnTg;l$b%H;Q3u}UV$ZN(7+2s6m;YQ zEEz*=f{24U0iZMonlFcW7!+=xvI|sJf%X`J#LGZ&%)r3V#0xp!u9+9I4yBcsp#ikM ztc@3Pc4`+d4*G%RCaV3@}X*#owO7t$VC&I>tfc?B;+!(GrgDKBI%_ZnV?2GBWtTX`88 zKzHix0lANnfnhH+%^l^1oGEgg7qXZ81eP=w4w~CXx&sE3#z1ifOJkru4Ei1wkRFg4 zPeulYm+Ad(kiAY*_#u1rrt&j1Xn@Xa;b&+7h0RQU%sR;q zv}OV=yg_LW7T%yckB!jAKS6pxYC!aRM0k7VWtPM{=jWBARzO-6puht83k{Rnst{#> zFLnT3&=&8Tnwwu#2`=_Qu?Ih`0o1PmS&0<(pqvSc98d^Dx+9?20Od8%cn!>5Ab)`J z9`fDhp#6#Sr@T+6AEfil8T<*@FxW44}JbLHAPXL-$jH?x1}L>UT3j@(}3mSAbSka;tr$-qz1GW`zs>uLPFwwOLN>ZD-2CA zhG9TPLve!;xGn}+2ny0fFb@>wAYKxj&$3=H2;;>;z#1QBN-V?joOFenLtXw0TxBIJfZSfnLFt^@=* z2Ndv05Lr-Z3g%XVqX`siAZ|t`=(K3Wfh9TlkcJ&7k|FZo1OZC|Iba?r3PF;P8*)L7 zLQsU}ovPs85%%q z;Xw0!p!yLs&j-3k5H!!1#lXNYiIt%Nv`%v}Dx z1_lPu`S76j-#k{xy*~3n^N67SHR!xqMh1pOpm{{lUISLh`s$_7^WK+XNe7^ni0AbcGdi=Ezl6h6a%Rpfm2#%XU~l4&(=r9&|r}!X14L2S^Xd z9?*$FKe78MKDeYPwIn$sHH8e{f$B|Uzk%#S_uFl#-#~NFAa{V~pwayXN)I4Eff6E! zM)wqko^a;6WxEW zp#B4$Ee&$Z8!YJ&bRQnbU%31S8jC=mQwHe)`46-h`ZuQk$c{H`K1Gj5klpD11kLe- z+yk292f67B7Jq`qB|!cJg(QeZkH=QfyaHN0g7kpQ6$PD1f$(Q|5$G;o$|Dlg-~-iV zps0bYjDuuLaJ_*Xw;*?*`x&%e0pzwn(7P%AV(~L*O&rLtxcm%SD~-M$9;63kE@*A* zUo3v6TIAyJJ$ihD+=K3S7B)zk1X_~;awi)bW?un3*8n;L1QY-a3=HV;-NL}YfSzwb zdO&^$m3{vZe)r8UOQk}-#qMEr|AO3r?qAT_5|FzlsiT4Z4d3Js*SgfXZypa{vFB{>2m3AYCBaAWb$`yI4S24tH!8$$!gouKtH=za&ycYs_2QU{{Z<2sdrfdRdp3ep1#Q_wl3 z44^|AK^hqt-BU|~K}RZh=0Qeyz@nH0&MFn0caa;nAbUW50=W%T2Z7Aefu>*38Tz1L z2c4l0atG)PeRRKp+HfGfpzs9g1^ErsW&w$T;&mYdXuqZ#Xy6AV4aOinAT^--9T^dR z^UN!bch4`$k9W>bNexQOgC6M#G6}2=mB8XfSf>@#LQaGj0E%i@8J6f70G?9=HO9)+ z7#NDcRv?vW3y^F8xe*jDAcuqcq97>`&>9!$S{zWB2f72m64XZlts!7wU;y0#02(6# z-2ni)moJPBdiNY?Edc`q1L*93(0*Rfnw-@P3=E((IiPjCpfx$5J1|q(AY((Iv;RTu zzjV+U_@HwD*%%r?VU>lY90Bby1ceaDlOQ+haxpOQBCR6C7|*KGzI{*i~;0UP&^>dJG8Sw+Ipb1MWFSny`Z&2ps_V* zJb>;JCUV9Dn~(Ug?50>reI@exW>Q$z8l~%XbmFhOn%TBM9`fApmoupy9*d0 zcL9LH26P7idU^-lMGXoVkncclL=SIJe+qrg21pMmyg~P!GGh(zc>kiz^Z^TWP?&?# zE66_}4010h%t4V38g~bYf!5oA`~bSg02Jn+bvB@}570dZpgsraz5>uX&*z|f9~dC( zYe4=5-CuwnhM+tEG7}btpfUqg)`7wmRAzwISfKaUKzcxGKu067U=PCxZ~%e~#)7dF z7v!c|aESp5Gf-ZKSp{+*D9k{22*LJg{D+pKptV1s^(Uaa89;qz9(Krl2Iy`E(A+iX zP6m*_1hA~rfQ@sK5>_BRps=cAU|?Xy9#)a`4l55>K!HjS1_lODSRt=P2i-RTax-X6 z4kxHR#15J72i-FPS_=-kUjpPGWh`L?YEy%Z#}!6Pu+%{yJs|r)?HM-gVFb#P@$^ho zpfrVCH-p>=3MWv$fYr^W?2xu4=-v!aI9Y)1iC}=-pMjpwK>H6!4Hu9eP`H5XX2%mQ z^h`kL;R13adbohrP=VYHx*r4-E}%73AU}Za2|*7RP+A0qDX7W z2GC6isd>eqai~1-P!qhOOw55)mEg7<=sa$iZ6G&-!Ube5XpJRE9CRNE$la-+dp{T; z_l|(tE};8HK;<{+z7bG6IENiFz6-i{1k`6KU}pf|Ay^2yrvkL^8k!$V*dcpdOR?lb z(4ZG61VHwK>_!h)(3yznN$H2g_5KGvC>Ss_8;0jyNzA*Iu6G#upeW3c83rpB~B<7?IQ~-nWG;-Pn zxfMNpcYxMIGB7aghKBDxcE~yb&>b(Ja{CbI4ja%to$Qb~3D6xcpz)XE&@>9V+XZx9 z_i1*9hCl`ehI8zYvue*{313k7lN!DtJ)rRQ1MQtc4_}x3^1S$gOTg&i3vw%Z_&$S% zFX*lsP(SAlG<@H&L+%NF&kh;$2i;i%s((JRL+%#^-Bkl>$9#o`^EY;e22eWw$qqRa z_!pM&1?3-n;R_m{MsGKR^nk(_R5tLShi_=XfQ2r4*n-@N9=3uU4B$IjMK~D1ceILg zK+>)x2V}j06!eY~X%0x)Aj1J!cOcIJDH{|yAYrP+0Vx|)IUr{WsA0KN17ttGum#;+ zg1#0Cqz4wZyy#&Yk{|DqUz(JYIxwXJG2v?q4POUn_&P(w*A*JRZqV>`hlVfc&KFSG z>kSQG&>b(JH0uWq-#}>i24M+b(3&B9;R`y~5WSBL(gO-#P`S*99=^e)1<+#)K*plg zXdo_aYBf-}g8Bv^8$cN3Mo_v1_3J=mCLpnVXt)+b!?lzHvJR$#gP{S`zNqAY%-vT( z@6M^_fUNPWZ`RJkTuThI3RQB8#y3*C_(rBfX3CfLc?|&^j@N!91IPh@YsbVj6v(%Kp_F@(}Us} zy=?|M+X}sH2GRoxV-PKX2xI5`+yc-YUEsDafgna(-j8~;h9PKWBz!#z=p+sFV=*il zkahs5`1o0%@y*frW@vm4bB>~;31X{O#nFDgJ(G}?3Q`ez!dxHbAP6Bkt z5~zQBhl8O3bO+Ua4#>Irpu3hpYi1vFK-M%q;eebW1G;kwbdLTD4#-(DuQ?!RHNV3W z=b(EJX2c!l>3nJn?IJE>^Xd&VpWH2aD&@ibBlJF-G zjB`^k&R(HO5`rx5MNcB2CK9MS5|CPynV$kas0%dW07?zTsX3|1pw0a7u_4g-Ei7n2 zVF^k%ps{q&`R^cc(49)4aApSW4`5(mU<0kc2b~em$pF4TmkYEGAJneogxsqDx?>4+ zmJvVb?iT3XN>$LiltAa!NrCn&fYw%XGBm6N?O_7#3t(Vi0NtT+7kkXn#+ zAR1JTg3N&V6*S(AzCHq^2c!mMrZB>Ni0f6yKrbpL|V zD9E3<{M(3SUK*qaq6^=fiUpGwyO6m$~D zA&|QoIT;#2V?<4y3=N<)C7``SAh&||AY24 zf&9M^OWtN=0?pGxFen&7=^fN2fTj0z1_lQ7Is~K#q~?H$T=Zruz~htflhuu$jQ(ET1yJr zmjyZp^e`vn9MGejkn<^ygYLXyWMBa8%L1J{2ilhfIu{hQFDsjofdRBH3v`dec}|7~ z(A@{1yR<;}k%RVWf$reC3~~=6WPjEs(EeslhK9$Cko{MnduZ-+GBkj~6|@fvJ*|S) zxq-?(?OlENU(F>u=&x~LB95|Eog@z2G;zz_o#f$Sp# z`3JOr476s7l?&3}=HP_AM0d&_GXl#g&i=hFu&Q5>}az3membgE&I+_sGqETg zv<}o#5VT$sq~)k8||TA!R?PZwe9xVUQa@{zaZ&0^RKfa+fvet~SuR zWiH5i4F@jB`eo3aZXh>%VhIOOIs%ys(hs81!vWN8M-K;(9*}xazd{N%99%*J2!sPD zmO+UO9?Rh351jsy>vWJEAb%pqYX}!Z1IXS`E`|n>-PrDy1J#Kjf50%POb3|((g!Lh zK=}dPKOj9IH6SdF>Yo6AO#i@)2F>;fL9;K|{h&D+m?X$dko!SffkA8ULE?$fJLHnF z!~>|V0;vJH6GWrCI~hy)2GRp^GiZ!M2G!lpKCX^I7%>4d7>cpvKX62#=P!^QAb)`D zf#t6}s6X<#AZry0u=vLxI_?4U&oeI2DRYQ5QK0@G`Wi5h9#EkP8rPOZ^-plPBP1eV z=7GF{#75eO15a4Ui<5nj;|aMf1+o+5KTv#u*1Lhst>$8A0J)={3$nkafeSKD)W`)H zA8NwlUzl@2NgHGadi;ULpwP=tkRDLDg35F`5C^1@fe}=Gy0`{}c#s%>pqvGAHaq}8 z5sDt4AZtMW1=$OW&pv2;_H#kTaVKE$A80)QD7--!y6jA--PRsb& z3iZ!6sDHMT;U7ZrqlE4s8ph8dsDBPa{d0s2{}75FWmNx==^IFUf>3%p5B1LlsDCb! z;U8@62ITysg6bbXay^7zzJcsOFAwfO{c{)UpLWEi}70G(S1nwbQ-W*@Zmiy40)H=z6X71Y14 zxgh5gzQN*O&>fHX{0lml4ZZvW=>a(r)CN^U^{;D~s~=4~j2^!rH=z6X2h_hmxfmKi zZu^DBzo0o{kbglK6r!N|nH$rp{_GRA4mV`ooh~GmS<_*S#Xq29o0^H z9*`Q)9e_Hh{&DdP!|)HtSSZHQ+rlXCAq`wm`a|xYfb0bM54nHh4vjAlZpb+Rp4 zxw=y)o&Pgu8;vbk=T>b%#OQQFSL3%*;fYxprp!&zn#~)f% zfdU5$#uZbbe1)9uKz5+}rylB`25yE1kll?~`~zD12(lKJe?WVP(bvm>^nm=M3fc>W z>K|uUPajV|D#a1V9&|tTK>gIq4O#Ejhs95zHRK@wfU+ydZ|H4b&>SavTLPp9)D{HY zcW;F1ryxjH0+|Rh4TO={#1w_FksDAXctS>QK=B7!O8_zrghBR${0f@u0*!5g#Ab0r z#%*SEGcYS@I+Dr`V&OhI7)!XW!WVFPkAY>&$cXxN;DhRqph*qnog&3SIf z8jTCkFuKIe&;WA(Wh`L=+DitCQIPo{`_R+NBrIc}v=7n)axbW!v_N&Ui>p&8p;{8Xi~u({LHV0G8dLd(c=%4cG33{f%JgF71U?8 zLiMj7b`OJWfMQ}i431IEF))z5=za`_#%Tx-WUpNW7C(aA39=m)?8NkGL3%*yL3;$O zQT^!ah`FH-q!eTYz9|53xq{q>0NDZZ4@fht50MOwvlJdk+ccGjp#kKEG#dEJ2F+id zkfA-OKfn~oXxI&@~W+KQ`Buq@21T{QhhaP!@mv+E5v!Tp6BCqWLxd{}% z$ZI3D6x?7-w2eK!vlLxYPql<^30c2J$4?_d!R-1kv$hmQoc^Dc% zew>OW+(7H8L16^*C3<@eG}enAZXi9N`WDmW_Q-lH z;REtN$geOTfYKG{Og|7Gl&(N)lF{2EAUz;8puUkkYWM{C`#=UqKxV>12Z_ekMFpiI z(2^j~dLd_&ROATe!BUtLq&Ea91CiToAoqa63KYk%HvcXj$Qj1_ply)-&@ei{16hZA zhzGI;|1b|^+~^1oLj%Y^N3nzv=-dKOc!10Y`2`e4pmr)q3=~G#=C?t5Kx#m1c^y#0 zDA>mzy0QXf0LVZzOiU62RR^FngFIdavJ(^zp!N@FECyuk4IapN`b{24+w~R?WKY69 z9>^IM53u-G2zs9a%y}UHg6cL9ALL)q`I_iy0;C6|26Q*CBf`JI*_j2PV?PMAy2R0r zukvp3p>^Oh9)HywGUXKyWUt^G zXuQ9LhQoUvNMGgy4`iRqM;?ZTBMb}-Uw9zv1i$h?&Yt|q!_dIa$iVQ62XYVbZ!F<= z2z=iP4a5@E<2{I22;|OWYfCPmjsGfr92iXY3=E(%vO(u>g3iVU`2ln`Hu`!|Q2vM64WdEe0?M1P zZ~?W+(Z}~edO&JG*aaeLNj}yi~+I@=R`ETyg}ak1+o+5 zFVNaEP!K; z=Moq5GBmtpU|=Zah1`z^I?o#9w+bxb1O==9{Uf)1L3V<|3*;_Xo4y5_4nXH}gYqNjTyBt?+G*fVcMN|* zN>nU<1PM{qpP=)@LE#NLKOE%Gsn9dblwW8e|w57|i(?8Wb5B7_9gh8bJ4RS@S{eShwMW z+#_Sl$IuYO$iQI7$It*;_ixX~(2&f?z~IQo&``+8z~IEk&``(7z~INn&@hpaf#Coj zL&HW!28JVi3=NkV85oZ8F*IBS?H}M{Xn4ZNz;Kd}q2U=L1H)-Ph6YgFo#DeAD+HYz z4~lyb28AUke}l>x5Fg|RY~>+H4@eE@Y-LZ>^x*2}0!a@b{UGzuFpl&9ivHcI3=9Q9 z$nlHZ{sP$vieKdR*L6NfyYoIDWL@P$PL=VNF9?SFg82WgMK z=7a1ve#^(u0P1_Z=Y!nw@PQA~4*1B&(69~EF5`ooAN?0gxNRqpj~-w-gAt?$l#f<2 zGB9|dhMTh^v`>RCAHlb~f{tIuXtsg|2~f&OP`-iXq?FV&a6bnW(4c(g2F_=oTm=qx zXHdREzWm9Zfq?2kxHj~x zeI0&CzubVIp#ju}G~{P!I1XBy&kwm1!I2+wHnbBzWY3K&KV*-hJIEcNa*Us$0d%LM zCqLvq4ljO&246-71|NQg2GIH5exNh{85tM?_#u03g7_hK!-n!RG=SnS49gk*pt~GNkzP}Ho2b3n{m>3wmQPTvd3pZrbg#@$=1|7pE(E^49aq7Ira8ldT-5t=SQcQt_Sq-cSriw#F&pF#Mh1qt{E#wvK0iZ)E$A$9e#reS3;7{s@FISOh8#u)h9&$A z4ULQp49oZ#8fGyvFs$HbXjsC?z_5y+q2UN41H)>5hK3uA3=C`dA$NSO=Vxg6!^ps} ziJzeX6vvyfq#Fe$(As^}z8q-m15}2B%3#pkDSDj@(gRW>1iI4?HQji^>SR!901AIJ zjH3(&sfM?)KxGH0tN>+tP}u=G<`h&~fcUUN0CZF{xSx!CXCla5ptuH|SqHl_aX&v~ zoa87!WIxq$&^;Io3=AiraeS7ap&<%%#tuJ21L!>X3;d9=w~PFce)1)LNd0>S8t2#f z85%%yLpS*u8m=-hFx=v2Xt>3|z;K73p#gN4{R7bb9iaO=`579_7#SEI^D{J9Gcqtd z<7a39-SzPtn#W&&(iZ5h5`M_Nps)EE8YVC@FudVsXjs9>!0?fup81H)%fnZn4x z@Ew$P7#SFT@I&rx`^C@Dz{kYE@S7iU=i*;}h6Yf4{KFE*ptB=E#|#ApApJ~H0mykY;sTJnyd(u6_curhK|Hw8bI^bHUf~l&g=vr`%LWxAnD%$OZb7#gaw5i z2!rfI4?oZv2K4zskRDL@fzFlnM-4x^BsWld0(s08o#KVUz<6qdaIBC8DgY^0%LN!3 zK>n-15@w)rP|#Tvpmq){%s^{_VC5Ldedy^5qz9~qk%1u)HOzu5!a^W}`5;3<2BKjs z#TckA0%c23IhE*{Qeg;g%YqyP6M@`o2Z|=phTyQ&WN_OT)E34z{tr3<0(5f<=#sJm z$VDok_AZ!f2);?`HFR7vzaSZOzzeJx02v0GFaY@*bbb!Z`5-@o;sxXg&=?~~yj=jY zW}!y_a%Mt5G~Z7WfSk`YSpd@ioFV`@w`DrCyqqDx&;Z)6JWGI~0dywwYypM_(0=Si z0t^kH^Es9XFf^QHU|?7(z|e4!fq`L#0Hi)#CBV=C>W8crfSdunMu4H=9q0^W0Z5y8 zqX6X2x=mQ(8Pui*1u`gJL2d`-4N!Xn#D}#>(C4&3dO&JGW2r&t@mv|=3|SWeG8JSZ z8paaQpojrgPoTq7oSeWh@f|fLKq^4Z6p#u>N65$kWbOvJ?+9`iC@zrujzn zO#y}m(3tWq0fq+9xj%OWAbrVuSi%;xh7sg@XIg&Sy$6*kxNN&vDZee}T@h2jyDi_ygs0n7=?}6MA|D=>e$$-Psz3=C6P-H^?$gkfES} zLc_$QSL8A{0$jYq%7I`o4_4SmLJI{@+D2~2g4_oR6XbTRq9CM9P#1*Ed20wl$^=b8 z$oX|zf(#9y{meRokTn8&f{^hfeL+ZD!vIUzfz}{`yh%#ff%JgF4pa_=qlKN@0EHcL zyA0$$P}qU|1Z$VsK*P=n8g|amuycWiohvl#+@WFTA;{1G@}DP`Fawptpd;#1aC?CMei%@933WJ76xFFd#cDKhvQ8OvmC+(A+pE9&yDdwlQXq9#DLO#uB4Y{TUn-U;ysP zfy~5$i77rn#Uyy_0(tEs$WBmvg6sv&6M@VwhWfKa5VE$Rlm`Bb#_*pZ-Tc=G^arni~m4r3>4S6(kHg^2BZg+PC)lr#G?7n7qWL1WF!_$ zbn?VVpCCKY)8|~M|K=kXUKPfZ;#tL?F8VKz5?X-*Kq_P6$Hwzn;S4KhQZiApe2tQV@+^=VNO-gY z2U;VMi0VH#AI|`P%w@G8lc5+(HUw1)=>7rOf$pEHQ2$&Lgq+WFoeckg*3}rIo#z6w z3+A6BEdFtWOszsafKK7?5OmE9avB8LgYKtCP(M9}`soQ4KY{vz$hM-#Q81Q$NgzES zKY?&Es-J=#{oEnrWyppiv0h3*8B0pu0qFs`8B|83pt;)x zGVl&E5(~x>4|v*H$ngTQ6Fpx3LjCm*T7Uh=;y=*b3CJO&_z$E9k^2K6J3#&exeL}GkcRqCMu?#SG(;&Y1Q`RA zBg0>yGbhm3)Pd}T`70gWU*vgMu7M_$v#|UoJHCS0L11K~R4ML;V#( z1Ak?s`OBZo3YnO67!UPV0@PoLP=6(1@s}H@Foe!!ftcv^GPd?TNDrvo0G;iUgX*tf zYVRdOt^+{!g33tbIv@|~*L)$!I=w<6$UJh95aj%qVlw;;TK|o{)&^uZ%+I-Kel{_s zp07diOUTdlP(L?7{oDlgb2HS>Em-_4$Ou^@0;}gQGBYrUG9b=;1l_%ezUCjK2Q znoIwlK2#;9iqF*JbgZkiIQ`)$S)vFW+;Qg6|zbL6w06p10QfGgQjjl#==7R z3W&qNz;Fl_%AoX!ye0wUM^G3euSwVm4dZ=6ka_h3LJSR{y|0IaAZun13qj_;jtDU{ zfa2x25ae!_lR}U=#*2jV90@SdD4zqwvg!-5PW-=uGqTLUHpG$ON2L(JN8enq_F7TuelJj9eUPuXA zUn~n*^9Je#z$TWz8M(6%S3Pd|NkF!7Ow{ahQC4#4Z4gB4F5ppF)}bP z3NthmgYG33W@rEf8>=uwLkA-R1Dh~I1L%BoPGN?IHH-`lJi-hOj~E#kc!e1nels#K z@CifCMHdlfXpm)MU=S5%Xs~BuU=SB(Xh>yZU{DoiXeeW1U{Djr?2DXWWMBaGO<^g| znvH=$45>_ZVq{=IpYsFh5d)nc&&a?~h?=H@UEq_sAXA|Mh<4H`QArh+IMH`If~L$t zi4K%hkybl^xkRjXKu(^Z{{C!;6G5iJQ==gRi2DGRI5E>TNF#KSK1k&qm`aF7P-+Dy zbBIRJs0?JBPy?DgK~{po5R}e9RS#%wJxI(*n4tj_u4clJJ=~VUkoh|+VaWWQjWA@L zzr8SI?#V%zph?ibyl9jko9R^!jSd-fx-+8p!HnA!VC?s z7#J8rgc-o=DI$a!8oo0yFhqgU5d#B5v@qmelo(-#25v?MhInCy29S4?gc%x47#SFn zg&}K>(}Wos0vQ)OtYcsI7b+=F0nwEp`n41fuTs4p`neDfuUHK zp`nM7fuTg0pCg-Zbv(32mS78Y;!OmJ)p5QP&HnJ zmQJIfb1+DC8CvN}FqMKM7QJo)*$IkQd(XzrgANV)7SA4=8{A2kphf2p`BG9LP*i z*#^Qevmvb;;`0}1ttUu72!red~2t$J?BLjn>2txxX>`X*3+cg;k_Q`@y|3Z%skREWk4XTq+<0IJF z(GMOUpg0AE0~#hJK0woXDC_+|Yvf_(f!qNKb5L6VbcZ5H+(87gSIkuevd+m}1kx7u z6oKq1_Y#5ZOY#lPXw~w%U^_{0dx*jkO-vh5G(>&qZuj!**g{{!q5O( z=NTcw&~Sl)fgw@^vIa9+grVUd=#Ci?h6d36LvbPu4LYDUfe2)8LZS#mLlh$eLy`zX z1E~3(j3q8W=V^lcfSfl#;~1cD1mz8EV;vwpAT^-*g$m5L2#E}U>_Z2civ<%C7x4NU zc}x{#FDUFmZiDsA@GIfb@be$X%dv0F&ejD z(;z({HF2P}52{~5^MC<_jw(jFClc$GBPkMh34_)pt6OLfnlWx zLxTfof0778gDWEg!&(u@9@BLq3=N?0T8||Tv_O3%wDCmHdNf!ZfcCzk=Y5bKkQz{1 zyb3c8g506Av7m7sP`IFBV$vI^EQXDIKsw;CNbv+0#h{WI6h*M27(9=GJhlXKBPf1A zZUBv8fZVWK1hVGuun1(Y=ur{KowO%JAbVC$Li71)Xg)tD!q5OJ-_MIMG+bg}V7MT{ z&;S~6xh%ra@Qs0i;fe@kukTed!WC4eF+WM*U)f%2MyQv&~W_-4c9NwaQzAm*Kg2p{Rs`%U(j&?u|NlWbp#a=s0rjV6h%+!$6@Z5eK_e(2_k#v`z(qJXpMcUd zNEC!YVFJo0$ZZxDQOFn$mndWmmPZtFeipANFQOKSK1yP0u(0Hm6$R0)p24zu(h8RW$ z231i=xuqtG*=FH|jt_u>3*-+_-2titVdWO+4rvp#bO6!=QUmIz*CNt^Z+=;7d{lu^ zJUAhM$H_q^V!>E47^uDgMJG54KnV#P4d5tcU|@h=G754eIL0c$+gCs_3fdoAl3$vf zfmFXB=QEI7LGc1I8&-Z9h(hXCLs7_G@g|~>H8$p=kTVV}MIm>a^X2GAOLP!N|bSj3r&X zV`N|ejX1+f#5^9gQlou%C@g)o) z25v!6N&xLhO3u$K$uBJeZ(LgO|NnoGSQ6--@M3T&JqMa#GQkDF5-6{@B(bOjEV2M9 z0@-g3vKT4FfwV}pv{Gr5A#9gD(DPvQONwx zB2h>?bg?L;uenSVawf)dQOMZnN>PS}!wd`zt3)Av&NZS84IsNVh(h{18=>XMW@tLv zCJGtr+#$-)0P3IZ6lG{=W@KR4B?>uTVK zn;A3n;!Daib28I2AU#V^JpmfGfjJB07f?J&fzCL93Vw&S$Nqux6$1kUs~AHAXiX`* z7()YSET2P+0et2@rx;{kB99nD!+r(^23|3S2GBVq{9+6ZUl!0bbJiR1t58N zy8yIj6eI}3Aisd(8MX#USV0tBL)pYc7jonzmlnmRWEMjzRm?a9DGbt~_ndHACkLj!29-Dfe# ze*FK?uxAm6%r~-$L+V-%afSv>Mg|5hafSwSMg|6MamZK?k2q%DGGSt10QEIs$)A;% zfk6%_t`Zp;7|_?Zfb@XYCaW?rFtnh>l_xZ=KxTph2!v59RYFZ|(8>l-OoO_+;A^Sn z7$D0cK#>A!LKWrb#Fr)Jl%~cfmzHGaF@WM06pcy@3=GL-C9ZiTMU`Md(BcY^ru?FG zM1+H~C~Bs~h;ZaNZP0oR(B10LgRekKENAj-ggE3}Sp{*(Shb=!WNcbV9CBust~g|j z%0L`)&Z(g|WIn)19MZ@36o=$_Z*j<&bci^l%nt{d1Db~xXJ{y6WMD`YhqS@6#2Fg; z7#SF{#Ubb5hV`N~+7iVZ##>l`>CC<=rn~{N`UYwzUlZk<$Nt~fUoQZ*< zS)8E(oJO#uI|&xhItWO)4)U8A+87NV6K1*t=>gT@Ai5PT-MK)EbkO)V$UG2+rD-xc zk0d8jX$HutXrRQAo0*rHTbc__bKnvLltMx24kU?^7(vOFgv1ECn0_P3XOQ(jpk*82 zg%PmDL!i_N6@aXjKu*b@L8q-j5+W#z!B=O%G{e_tfL0zMYXtSX=0Y@r2CA;$SUd!p z)d0B-Rz!kU-XQZqCo&@QXCo~h0%e*+(69@1F%gJA3Cf38i{SPuXdMs86c7fb15h3T z%`1S$+CgFyKxvPGfnlOJWL^DKP+7>pz%XANGN-ms9CB~U5^+e`x)hYQ85kIri9^~) z>%T z85s79Gc+`T&SC`RJw^tGgW?PgpujsW&d{(IbOxh1L&JSW28J`@3=OPI3=CJrA#00n zg34$n28LVW3=P3d3=DU~85$Cq7#JRkGc*)1F)+LpXJ}Z(#K7=ToS|V269dC%kh_=| z7=DQ}G(2NsVE7}>(C~(df#Dx0Pctzv{1<0v_yr1K35JG0ObiUn5)2J&%nS@H5)2J| z%nS@%5)2Im%nS@X5)2LVm>C%OB^VkuF*7g-NH8=UU}j(tl3-{!&&(t1KI?lQSOWgs|1Ioj?EDQ{7Xn7dcEJI%Dgqnv*&X%CM1C-K1IS*Ui z0m`44{DPzDF(Mvx$Z<^`-$f;TTfdSO*ia#;zu)IeFh2Pz;K zA(;Wx>IAKh0@;IF1w92Ne$W|es-Pu)mV(}(xJSxOYti_=5Ch>$`yN60u-pdfbAZ;! zL5*bq#TzKEfy&n&NMXRBAORTzHk5#@(>9V|XaJojZ7cyM8*lGjIc?H3kL-PYK8vuNNrIF)%RrNI>eP011W$BSr>>U#6ppnSt4iJ2GoL)R(8+FIy+B+yto`u;+Y z9#9`?JtG4{J8E8Z^zn4}gI1|XSrB7M7ye!`D7j)*aj=>Yo&!LoJ!no6l-6LiM*%dA zA*V;=u`H0=LFo~BEK6Jx(kD`vgp~DKl8`ZPZAr)&mX0JtLm_BSq9o+5HA6{;22dN_ zSQ2sNCjDv2w6l5FEt^CoPZiqmY4$`TSZN!AkTvaQz6zuX5jWf zn>|60$rw=i$N){Fpr8iD2`D{+_7j4}Q9xqhl92K-T@un>&y`l*(Lv^{DhA!B28k_-)gpmw(;Lj!0~p;3~d zp$jtJ0X~zqMG{gTwn;KHFfuVPOq673uwr6hm@LWAkj})wFin!7p^k}xVY(zk!&D{) zhFOvf4V#!47-mZ{G+bn2V3-5a&&0s6ND@-sEd{xgnSo)IBtyeYW(J1UP_XbKkAie=N1A{Emntsr^oak!>Kzcyo23mX6iJGp#f>V-^^;)N~#KR3%1_sa=0<1m=K-*i91>Spsy0-$P z2UNa*=q}WF@PrJQflP#Y0<9`QD?Ui#5^B|nAdRenT31DhdFiR(NCOo>prv2%;Zjgz z3RJv+dO;wiNr}a&3?TiW*ak&!eojg}L_bIr6zL$P`9-D0@nE&c9Uss*jTxlf1WI6_ zate9Z1hP`l(4{e?2?cTjtjt1bAi@eRkh?&2AGqKF6*Hjyc!)7XSoxQiT8`NktN}HT zAaM$E5@_ZL*-4-cBcOD-9a=KM(k*DD6%=nU{%VM?;H|&EX#5)xufXN4Ay&fqJJI-m z(fCQA?R>~vj==c>)E@x30)#3vjr6BD_1u2FGP@+(hVrU3wW?)d4VrWQaW?;~i zVrVF2W?;~kVrZDm%)p={1!*tpNij6cWoBS7lwxRD%*?=GB*oD1hM9rESc;(mG~j6> z#n9lx!oXl9#n4d3!oXlF#n7;bg@M6QilN~I3j>1-$X-?k1~(~&1|e1k1`jEQ1_@RM z22Ux5218Z`h8QV^26I*hhBzsP21`~3h6E{w1_xFKh9r=GSs578q!=2CSs55Ir5G9- zSQ!|yq!=1{SQ!|yr7+u@pfPt)i3`G@xC5=N0JX(H2>~=F4?3e7eJ&292c!mcmS{I> z`4S4fkrrkg$Veni%n&bVPy=@1P;O#zHaL5MvOTC30LfmEA{v|)k?&RkxeJsQc^McO zK&1)D;&Lg-+Qb?u$h>YNXO9mMbBLE-0cv9tHVH2s|YXl3l09zyQ$(ZmEH4TyW_GX+(h>2Id-p zC#*qn3Fd;;f~r?g37Z0GFM&cHB$f(A2er#*c+?H#K2&S z7M37Ap#BgG69Ypp_OQ&%D@iRX$j?bENd?axgRB4<55g3NC@B5HLbNC~4YC~&H2ez+ z#iG7)Jg3RMxlY;D3yDkOkyWWt3^j&XCLB{xRf$A&< z28P>Gkaa$Hr6BXX52YaU?T@7(>$;vvF*FD>GB7*`xf^u$y%c1=_Z2AbF)}c`1=Sgh z3=Hq37{FsMAEY4bem;Wy!N|byMG7(&^HqwWA%c;C;inWs11Ly;gYqb7FQybjLpLJ> z!+(%_L3=W#85-t+_GC&!?#*D6hTK`hAq|;tGc#w$Kb2-^FbA!FkY;GGWny6HmS$*(VPasIB+bx} z0qUzuL;C1bp#B1tt)K)6!b_Pz^XiB>w9_0642no|x1hUK(Dz1w^ne;f)0h|-`cc!p zi>prvboLfB6A!Whgi(_|p}ra@C4*WG@Y!2XN(9wFph0wJaD4=-uRy%K(p<=5Wl)s` zauek0RZy}8Ne6%{H&C?$;$?$*uqww1ys!c^77cRYQRtYr6touu>z%tJ@j(e1l%7Fz zH6T483^r0x8d^bnwxuC^ zNOytCF$M;P-O%*9Pa1M3!vSf?zMq5A3=N=#ASXfP83O~uX=#QAK1K$Hv(gL=pnc32 zq#^4pFH18tfXb^Y(DZp-nxVmtk%8ehC|@x$Fx-`f><_vx4H^4>07@r}3=9vYA$Nj3 zl7`IHs>v`kY+z(y(3F9sHys&<22h(vSB9ZMgNcE`Kn60;WGutb5X!{BU@F7Vkj%uu zU?#)R(8|QXU@pVZ(8a{SU?s!Q07@&?GMMEqXiN!|Qb27uP}rfTzdsD1IbPH;29O?5 zTz_I@V3>d<{W*i1RUlJACW0`1(jO>|QJVfhcddb3d>VSt1}MELK$;gIVFr-jLFoC^3?#h;$Uw@=AQ?z{3jxIo=nhL6NO}vCfy`5e%RtJcn4 zi;-by0Ieg4m4WO@kC%b0?@5$lXkcSxU`PhVKd9W3ft;0)CIgvc$&`WY3(A&(q^~>~ z$ol$18HR>b&|Y&Hh6d2GhEf@Z2GH1ir3_>bdbJGXOodt*$lmihPkV#;gUY5wstgP% zMVV!(pmwakAh>UdyjBn7E>N5!uhm;31L<2XlVNB8o!7P!ls7?bL>b7Q!^1L=`Lk1? zJP9f*plRWf3_}Cx-rCDDkaZn*WFUJa?#e*w!e=rJ4KEoO7@o^O=Fi^AFf@Sf-TEfO z(4Y;vuSf>69_XJ8WZdIFG)~!NA@dj6Kzcxa0;La_pFqp4(ES9`15y*q$iOfK)lZ>*-hTe!ki%a=NfTrw8pe|ULBp${ z)UpYkVR->d z{D3y-fZ_s#L4F3s4`_Y^#0RB0(EShS`|Ch@Kx*6=7#L` zGB35bI6f^gH#4UaoCHB8f^0y;NJ+4Og@GY2F*lV#f`LcyAm}tOuv)Nj@gRv}@Zc0E zCP71cd3liGC~!IL0agkjK<)#z4cQnV<3=FS$qbM^;wKm&efg6NkUsn=2FMuT83xE6 zx3dhG;RPcdg1!Ro?1GgY7^iqq8 z@{#H}555p}6NO^dN0doG%0|v-?#fJ=#w$5V)NV)ig0kSvn83UwE z{hR?Zrty*ivbXj%17vLD4VG{Qt%n8q9v04RYz*KY5Gdt<(jw?SS1Yvo2BZfh586vN z3niS>Q%kUfGRS-w2I+&cky7Cu5e9~|#N;86kJHGc!W^)2xh`X%M`21*sg( zI@7FAbK`R*nm?6ay|to$IO&sa7u(7ItOw-EG`%r7+QrG zxEQR!2}q2AiL@mMpn?=+6g+T2>9Z0#N|KRS9A8kB3h6+WK(|t4g2TVy|NsA>yq?7% z!oVYV8eS$q-OC`wz%AJD|NsBvY77jZc0g`oNpePNN<7FbAS*znJSdNVJq*eMJPh1| zIZ#8h!Sjw)NUlgLNY7;e4eC@Q2_~08wr+sq8Z<5j3KtLtg)1noL2KMV>jgn#LX42I zemf(itl!B9DQ9*uLeART%?Mc!zLya)2DqP*0em*VK}N`4t0Rn%d;g9yLhhSB#t5kc zPBKE)t(;$puEpy>kFpP@%7f<|(i1sE8TN+C@|&@d~g z@PSp8pu-hG7vqB3exODoD3m}L6uzJ|0BVE7&IaLOVrT$`JueeO1E{^s&jeXFB*etf zV8{TTcW3~Gwipv+K3swcGUq7C1nE~uGchz&GcYj7FhSP0$udFa$>f+I<%I$hWUN)0 ziJ<{>zpN?~NO5#DG9iNh)ml~f`S&|CAToIJSKo&q% zAyY`roDZNJR|3)wj$%-QrAVBC0WJV4(^29alnA~EFfin%=H?ewLTYAE9D&a2f!P6a zCn%0U{g@+A!N<&yHq8@e$hgf@X2`zTXUvfC?-$IFvilV?q;2z>8M0>K9W!J;_&qZu z>_0I>&Y=Cw3>nY<#tiA>{a}X7&-`SDoDuk&nV~_Ck%8e4Go)Sqml-nu@{gIJArv&W z!~$8nz{tYTkk81#z{~>a%d@aBG=RdFl?Ah0xW|lt-8Se9LG(BS=>dfUh+d3RE`Y)~ zJ~J<~1U1e;6&y6oC|N3mG~Vo5ky!$6#DW?HND&UIvq32YlywSHQxfw^GLzve0~Hw< z7?8G8g4z_I(P)&!0m|&~!~s$Pnh|-W%)pSFSWy7)_#tvNsLTM3L?fjic z3=%AmwPunmkoiO@7Rb39(kzg4D9Zv_OC!eu8B3C9fs7w2vOwkwl~@=WKx3OKEReO? zYAld+sm=nK2h@b7OD$-+)Pbf;U1+-0XJKdnt#LJAfs8eout4Vj%vl&3_AoLqSgsG~5T> zfzHCv@QR6n!H)&9mfN3&p+Nw&=9Yz_L5P`wAqeDtW(I~37KR2;&_}Q^G&nLdFhsLJ z)^x|RFf?Q^Gcd%lFf^1hGcaU=+|A6ukj28#(8tWckjui*Fol_cA&-TjVF5D(Ljen9 z%}yZ;q>aU>$G{-Xz$5q_-uw*6FNhB)EzXE{2G>NO{^}37B;+PpaEFyaih)P)C%O!@ z!zRkWE?5A{hYV>Y@o7bgxvBA~c_|FyP+=B?Fy!0-X{ZDbLZY-dBfqF5J}H$!3M$Eq zki?J^K**Km^hrYX2_ocRQXu=<#TghF8QenR13V*Ked2xnU0maR{r&tI)EL+W zKZ-Cgurw6p<|n&_#Jl@M26)7~`3LzrhQvGj`v&+2dxp3&D8tnimt-cPt8?-U@pTMf zP=PDTDJjiISL7cW;^XP(${@tRE_e^LYz5>V*P^0$|7-?X26n+m0w8A;XJ!?N)o z;)6Y-T;qdW14CVdL*hY4xWxxMJNmdn{Gbl*aJq%W2f6yWxCSA`11OR}vdo}BL6-G# zb^+TDl4QXm86O5tX-@<|^NuA&iOH$)B_+_&Z!rdTL6C$j156@4CqEIAG(qBWaPds= z8X5*rQU*!L!zJ>QvWgjC<|x303&7^U#1-M<=@n&(MGPWPd*h(ukanI71FxVgXg&Z` zCW4YF#8Ek^WvMyE44Mq=f|cT+{&?2{oFnMTp{5Y;27fS7vc)KxQ$mZ z9W+%BHmIZ|9^&2jKTF}03^kXDg|!HGN>`|3f=$}*>D?E(-KQ_O5)Rt5(_dilZ)evOF+wyv>Dh1U#KxK zFf}kVxJSf?ILC*C2KcxJ#|L{j2D!!u_K794 z>lp0Kpvu55_zuZ5&v;i~Cs!92R~Lw}@y`DKK`so6P-P4bAagw9J^eylgM3|GJRL(^ zAqv4M6l4;E0z^qbkY^Z37Sll>RS*YxLiEOa`nkA9KpX@r1YUt0#1Ik^56ZcrdD(gS z<$3XLnK`NPZuv#Ii6!8Y0;Gr;rpPm|EHNiD1w|1kPl6P&p(}DMN-qT;HVlG377aMl1Re1*&u0dn6z(ZF{rx~@0*`e znv)7H8$j|r=<)$Y`30#(C6(Y<0;v#zseoDFUs{rrnU@L2QaC?~%J zrU+Erfn3~xuE-y9cRDCRf#e%u@*wBBrIyFTBBvN0u1zo{!6k{w+425msYPiy`Q`9v zX@0Uf3)*2yTvC%t)8qXMK<V15e-NX>;ic_vKOIlnX~CEhQ;B;GAEFD2eNKd&UUq6A#zfZQ<$ zrq0C`9K`N9m1*%#u%09=Db9tdg1R%_DYGOuv4BB|fk$vUyv_jiMpKK*GLuu|3n2M3 zGqspOgMmjd7qlo7RyY?!)udO%=a%M_WX9(v7MG+J6*Fit@CcS+Qwi+^#Fr%&WkN!O zL7jm|uo$!&4c*j|qSDlo$^uX$FCCQsRT+2$zrve_NKS++OwXxI1J8wg!=kJhTn0UW zwTJwJJYD@lz;mncT95&hlt3!LEjVNq0sg@u!OlUR;Nw#{1f_%+z%2x@cR@iIoLUkO zN=Xd-3><=T5ZT~@#JqUW{vSaJh(Hirc}Qw8RJ}3-2iW(Z1`RYcLyAgMLn;eWUGqTR z4oXc1n~^91wi0AfSYlDUOKNdudLG11aRv^-Du}c%I2wE*7BPr2a0tdhB-~R=;(dJ~ z>SY)>1VJ4-Q2mc$7syryc?J$}N1qk!Ii!%z)Slaw{m? zfQ|ux*et}rAt(w73{dERLyQkK#2BO)I0Qcnf;|fju%Oi9)Do~-1qKemD^R)Ayp+_U z)S~#1qQt!7wEUu6unI{A4ncQ_3K!5&ic=0~T_9KrWcdt;%Y1#~9V;@6_TYF`9g*Y;vG}6N?{oV1m zd@_qmf>M*?83Y(O1Y04BeG^NHGAkHBwx&Wvz}kaTb5fHb27n5jW{8w$UUCt*;hC5N zE-)ZbpvJ%nZidT*d^A2_^0jnCA022f%{bs@Nr0kyzE zt@P4@oK#QH0J>XFVtO$|IcO`0XJ|ltICvKc1E`GJE&xt^PEPq1VC_i|7lC~flv-Gt zS`6_H$hM7;%;KI{TmVWYpolhuCk4 z0&xf^)Z!U<88`%|2{16k$LAUvS%5Wyx?dq7@$S$LS1`E01quMrlt2-9z!Nl0z#;fr z1f0lx@)J{1i@@1;3&h*OPMIa~KACx`(0mMXImn{55NZElBXDv6^(@^&;$6TC$l}4} z7f2<@D$syrNJu;=uo#3HI0Qk9T0=tO!3WWTqZ*VNFG4&5P6NR?`H++c(hZs_af9jx zRe|%t_BzLd0w=Wy9uWUTz~KhYbKrp72r&>`)TfrD7R7^|`Cl6BO|YksJOoPO(;*rl zg$lT|%Y-Nfg$da8;8YAwF4%nwiRea1^t+^{1*InE7p2656C7wr*DVCxgaZcxH^eqb zhYA!@plV=0L=YSZ@y_`LmEhn3<;g6F45W}xEdrNDpn3R^ka&>uKvhb9Nj|vu2G#@e zP%ETd@b!%kON8jCLh=we2t0EW(^Dbd0!2a*#1?QafF)~ihRcUYxTof&7J-MPIRuZ1 zfkVcv$iTn+b~QwGc^P@GKZu6qE-*f#Vhu9~ulADF(+2QfUs!nYyCjssL2ofpg{y zh(U;8QX!&M4+*R;HLy{kd6^|)smUezMc^`L62!n@NRPldF*zd@l;LF=I0TPCq`-Ee zwS7Se71TdN4p2~k0MVQQmn)!EV`Yi)IiOPjLGcXQ7abB3A5fH^m6{CgmVlCuJ0u>% zK&Q=tLkE=KT_A$Ku($Oat~Dw1p9b*7yJ=OhgR< zX_{991qB2}s28Wrk3Pw<>O zhahMK)eUU9p&2+YfQGn11KgR(CGp;=mC%03N{DA6Eo=jDz=BdKhA_A~nFYxYpu7Mo zAXDOlODc0xA!(`=VvuiQML(h-$Zch1XNDuLPEj^ zGU*1lI~1bF4P*@{0w7KL^{U`<9Nt<1hXy!lftm=QyaVz%DBwXS?StA9pnMsXp9fCF zpdus|VjZY{2enTfQ_4Vn#A0yRgW@wBRo*+bC@(WF9V`tB5{z;coD0)nu?)>N;KYWt zn*^!Yq3O^EEgga^m<0(zP*i|Ub15hRTYw%K;F32Vk}N<~YP@4!B_vUR8q%E*2~e7Z z7HbeWP)i6JP9cfu;0ghnULffZQhb369%vGD%dALE0lVNGqzwvI2rARSsR^2YgFuIA zL#zPh$KMd8pdbbn9iZ4~fiyF~bv4vU;HtU=651efkW!H2`=CPL5xRKiocv-)R|=F? zFmn^w6WoYCfM0$JD5@c;1*KaC?=^tjgW2(h^qHU$;{i<;DBTcH{g2uejR)rk?5#9N zaRFKn14@}R(L{b4aRX|-9aOCws zC7gXi;=z%J-n;}?<;tMOcTPTd*KP?o96{%3g7QpiNxXAd2qZ#59fLgv_^tNh}NQj-}#A;l~T&Z*Eu0O^;3Chpxr;vuyj*bAU7WFaB(&ZR~10R^eK z5Gz61Kmn5dK|>|ZknI7WdI7z)3U2B^lQ5*U3GR1+J+lbnXoxU0m_d~+XzmL<`~(_z z2RkAJq7sySTShfH7I^diZb)k!9h6< zQ5S-eDkRf8LEHdty?|3FMwt$2V`JtVNVtI3jzg>gEguI(f;7xTXpb6P?#My}pbCnt6)Ga22gfMEh@^(kB3w(jgUYD*QDUs1l5vI{bAV3K~VXL8Bvg~ zKWNDv$myV&C{RHLPB9=`LF?m`U~ z2GD>j-i|0Z2vCXzu;bQ4LJB+@1)ebjRSl^9b4dJPX&^wVF3^e*P=h-!IX@*cFC8KX z+T#PNHWG7kz>|{TwghPDmRm?Xv>^$OfxVD!Kd6}sPTHWFr5@s>u+*XwNWlSiI_N+} zP}KyPG6v;2^ximlcH$lKz*BrM=#CI@@&hM5P{v?@q)|v;6Owqr0f9cu299ZL6*#15 z5Qn4z;Nc}^+3`9 zsEG&)9Z1B3B%tHq;EV|$od7jYpq&tq7*g{Dl$X^}91F^cU`K%(b0QG?p?MiPR+(A^ zF28CKP6!AFH((&H&}85cY=r1T&g!r+S7=fNhd3xcF@|=)F~12CP#}+k9RsQxu84sv zNw*@<@-4T_)SMJ>UMYpR1DqY8hC>_zDz`v$c5Wf@pz0GGpwA&@fcoF@o+YV8iJ*Qn zNFh?2i-DVgL(l+}13i5}w>xqOf>sVeOTTz%AjE^lNg!QK(84XyvaQUD)Esd81yVBY z2bmBO4_$*0&j6aQv&9S-aCHXiSi=2@(Fuc?cNU@-HmCwF3J917_VRW}hJoi{usxvR zTxjPKGFkx|DG`7q1kgyBbAC}#YH>k+UJ7`w9+Wk(lKbGz`JwoRAU}6w|O`3~U6-fFdMUf#z4;LgM|4GE?(Pz;nQmegZ4R2yjk@nE@$i zK)oJVi3@5xfD;J6Be1`??L1?5z*X`qY;|_!z+K8Ekc92A9SE>lpb`#Cf`QCNK>NG_ z`NiNW0i|jN`vO}!0T;^#h*3G@7=iV-p)(gC%YQ;LH8da~b1~rY@n%RV6r5TT59t?_ z6oD#ca0G%vpa>!lE~UVs1u3IIDFw4!i)Y|r;1KKrb@1YI%}l_R4QSyTsLlj+kU>>( zd`MzCWY7j&~7*5HChy1_-be*vWJfTimKX-I#91U4is zfi1^15(UZaT#z&aA7KP1Nc6@YBzZv_Sl}f`9{Ks%kk|m_G-wwN>OXkt3=R&|A|0Gt z(0UNy0;V4l^zh2r(*LDYjxgwC;mHGmw4F^nA#TFnDG3mA02 z8E8L%0Aq%bom1B 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%0A{>bM|%k_IkFpQMQk(kE%* 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%0DxvbY!~@IwxkVQ07lWpOh+fU>w4CJI1g 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 z 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 z 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

    #M`O)pc)9D2||E;-70zS+H+5&}| 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�=THnaKF)}nvVrF0f?cD^`YoIaz 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

      UvEDOmqpu_k;yb5p*0^L^#%0UHS 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

      y-1T!P(5EjswC`g0>d@dJ=B`O9Y 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

      fM9e`ur%^;KKs$<2L@aHXP-Dm30JJL* zS&g|NXonw)h!JQ!4n@QmwC@c?#00cw3Pr>ewEGA}#0<2X1x3Uhw5tF`!~(SH9Yw?v zv_cJ8#KNEl%@-Dipt*AtHAV~IYV?wdi$N_^5C)x3$P8L63F07ONLsZp1_^=HK+~ax z3243$#bi^^s3MAp8E8%dMZ_Gm>j*`}0<_B4PxZOGFVd2F-Axh?vAMqoijuL(>d&5wj9> z5%UIg5sMyl5z859B1Q(F^9PV^H!=jBLx3V;v-n@i4VGnX#~26Sqi#{c>%hJMGd-$We1vw ziNO?f5yJ)OB1UV_MT|jbEF0`ybQ)6b(f-YhRI-eR@ zmzmKVbT!5+&_ztPpo^FuKo>DPgDzrz16{=83A%_S=u8h}_m~^}K~rOH2pTs>QDY>+ zh8h><#tP^nCOYUMrWWWTW-jO=<^kv;7BT1|mKkUw76v8gB8CmD$VMh&TOJf1J2&f*dlw@E? z=tUk!njp!*@Bu|+g(L%mKp(Q2y^;(J1}GwzLFS-{d<3c4f~<>Qih<$5He?YMDF%iG zmykuQq!<_+o*|2POEEAUc!Mkw13Jms0@5}H%~dln6iYEMaKJ@Wg58Y`O$`lYP<+}T z#lWEO0oj~MQVa|MC?d;1YCa;X*(JrmV1OcWMT&tz0%{i%s0CtdXliPrfnwKNDFy}& zs2XO5_}tXouz|g>nEYb@S;X)Q!F3Z5M0Yzjl z$YgG0H8*4#7z}ukMLvM+;zt%?m1AJ|fFdF*$G{*UfUL$uj)7r+lK^7@eU|^U~h%7Qefq~%zipWNgIVH$y zKy&y9P(1_p*! zWRV(>u5M(JE=2~03n(Hp6&V;7pwvxkK_dOgx=txFFet1+7I~(~z)*lve{m`?FgWZ$ zRwJjxz`(E*S;Sh2fx%!8vPifR14F`IWRW5z28IbJBJCh^t|F_M4l)NtWQ7s~!v++Q z9ZC!g4^TwTfy}v&Y|d*X28Mt~$RfPT3=9QNkwvtX85kTsA&Yn@gUUbN)X92Q(0aOHR zJIG)L&^iXVT_A%Qwjk7i%`r5$1ecIda|}U>QlKJWa|}VY=b(syJXV1aftvG(2V@2a ztN8eV&EWx;nNWX$%@IKn0hyzK5CNNGWL^X=MWN<^Lt_C{1neFokb733h=9!50v7>= z#ByZ@26HKp86d0zHrd?V5nT3yMST3sLFQyYMZhMTgUl&F5dlS54O|3d@=j$221#&f z3^E5Ka#ERrK?z(M!$fWs$h=7uU3bKeHNTfm^$#!sjf#!GMsm0KUfq~&PiW-o6 z_M?b^LTm?$2*^F486T)Q;E=a8TxJ8Y3+#7G0|o|$3s4cT-z`9)aRWsJ;6bWvfa=KWEr@|hq}iQ6wno@B9;scMJOUh1`G^Ys3L|83~{I;MhpxA zs3OJ;3?2v(aQK)RdV*U8AUA>14=8*Jpd#S(V+u+M6(}Mgf3?6xKqbHnWd;U4a618P z4%lR4^8-~N9tcBA03%Ou8vr36k3W?>vIgr5sSp?j!^ZAPG9+1%?C?X)E6W}7Cc(+gikq`_XlQA+ku`sZJkI8^$j?7Ig z4dL+IK^HN+fi7b71YN}B1G_HPTH++FEV#dOW z;&(F(69IG)b02gOOVB!3B%hiaSb)YHkVVXlr=aRGH#1*=CSq=|0!75a(AWaBsuf|5 zg^`&V4;QivEsV^}Q_w{$3eZH%&8DD-%f-Yio0$s%T3c85t19TDd59lJ6U(iG>4MC?~BSPNN!qEH= zsu~MJOAB5U7g`t@d7z7!`Jjtf2B3);8%Lmvn8u)sSf-$fm>6cDi^`poy57EI<=6H`swLV#L6Q5*n69=1)-7SQ=Rdps6u7nSd^023o_46!MnF z=4;T^SZqNPF|pW#CSq!K0!_rsh=m{3h2{n(=pu#==psfw=prT+Xd;%zHOL~y28M=4 zpf#*;Uw}kR6alLKo_xGgC=5RumfGh=mNTk$qRH5^EYTB#)b-lsJ5G!f_C`9 zS3VdU7@C;bpsO(ljq{?YvG71wW0`;|VrFi>169Prz#;@)#BvRqh@k<45Q+;ej7$U2 zMa&nVi5Q#QKoc=B`++86YM_E9VrEbvjB1ye$pLf`3l}sI3o`)`R9%(^5$GZo6HrAg z4GeCeie5bEa#w#m>L*vK^HMTfi7b50Y${f)Z9ct66R*TqLO44PhZe>S5PyOfteAs5*U=% zVJ%t+?Fnt=f-ae6W&rC7f#~7{9X*FbR{~TQSPj^qa;ON111c>T7`jkIkoWn5P6uXY z1lb5ueMBbx34>TkU9&KV^ z0BxILW=sGXiGq))Ffha?ro|`al%~cPmlS2@r59req?UlhN=x$7GE3rf^HWN5Qsa|z z5{p5iY4PPnnI)Nd>G8#t#U-h^5Q$WXRANd_ZhUcaQD#92L>z2%Vo_oeHqqQXETUz_ zC77Z~iMgd%L{mYoK({TaG$RF5ZE|8Z7MCR_<`rX8Ta<}KG$XYLi)elU7WXC>6k!vs zEXu(&Atkje5sPRsHWN}yGO)NTJvAST%hFTxvoXz0&q++jBAQ>4fkm_^6`KjAS=ekV zEy5B*8L3HF)Mh8{aG!IM0DoM=6lBi1(%dljClGGe5Az6}!EgP3)Bw|S+s zL~}B8vBYM6Q6;u;sLa6<7bTfVSlpYDn1{tS@uJ-5UUKh9Kg)0hN!~O#_vY*kwTFBz754 zS($8$TmcS*GjXh4mwFP!Ppc(_a45-$?8guCo87wgemcbfx zU>U422bRGaa}XJ9F$a;s7IRP;EHMX`!5VX58SG&Isv~j86qRBRYj9nORS&qn#4ZD> zGjYk_$id*c6RRFj{fR@OBrhIol!9y5WFst53YNhdrC=GXQ3{s98l?~!Y*7l4!4{=Z z87xr>mcbgOU>RItkc2(rz^w-CdO$4)tTN!%19llu3j(VQxD|n22Go+kDg$m!V3z^4 zD6q?bS`|2CauczK0l0O6RS&p@fn5gF%D^rIYH47V0k<}A$dr{}cN@6Xfn5)%<$+xW z)cU|G18#v}l>xUxu*!g2B3NaLL9G$2GT;^oRvB=s1gi{E;{)0-fr#WK=0f>7i6xnN zSbK2bo*G0tH?^cFGr2fEGcU6Qi*RvrVooYpJUJ^Hw^<-b43m%rQOyBgJBzRqq!1#M zSWu8t3AZji71YK`%u7iuN{KJeOex8L^gL5ab8{RF%a%8WI=>2;67|=US?5Z zUOF_?z>PR`q1?Q9G$By44OIx-UPBWCHPq0AKrJ*>A#l?ST_~>@%|>uz3{4fN6^14R zYJQ;!f!bYYLZD_9st~ySfhGiMc%TY_TO6oD;HCzKP&S(D!Ho+vRiIV{nh>bbfF=a0 zUD1V#O3{o5*Qcnez!fQ)5U2*l5JC@VaGi;&3RGF5iGz5U46Z6#~}*XhNXEA592U>Z1$gCZahNT+XAa0vGUTLZFfzO$bz^ zqY8n`a&)1x5;PmZr8k-?P_d0B1S+plg}?zX zRe;0C;1U$OE^tYTLkd))VwVD!tT?1VB`kI+a7l|p3RL3akOGywxTJCuad;VA5@Xi| zE|GCafl6i^QlJtVyA-&j#wAr&g2RR2k{gFEPzjDh3RIF~mjajQ*rmWFJ9a5>36EV0 zT+(Bg0+;yMrNAXWcB#y~l+0w@tx$+GMxz*27||?-h@&-Hkp&TrR){FB#xbN>k6#we z8i*E%Ai|o0qWpr?qLRvZ(1ttEG!k4OJr&YbC{8UZ%S=vIl3503x@4BQWkS@2r6!l;7sZDZCFT{U3eN*SM+larqe=M|-*^3#e^Q^AtZ_>0fUEG~)9$@hO?<&|Y^+Cg?co%>2A~(Am|cp!ATK7N1y= zSsb5{nO6d~HNH4CJvTKElK0T0Qd2+yotOs6B~U%^&M!FYKn06Z5rqz_I4GBa9gi$r zoLC0Qj>v+EIhpBs@gO_n3-UqE!_Wp%0SfHAbo^?{QxmgssQ|k)J|z2rh} z)D_^wfUpo^EG}O|WMMi%PDRsRoR?St@iE+YFxB8?2;i|GxD+I8zUSBo(x1TjxtLN;)^pf(;zt( z!~<7X1z`6<(q1vB3n=_Lwr1_-Qi$jU}}I25aMab!Uhan08lJL AfdBvi diff --git a/vendor/FreeType2/lib/x86/freetype-s.lib b/vendor/FreeType2/lib/x86/freetype-s.lib deleted file mode 100644 index dcdd0f72dc6c2b8571e9599acf7a5fe731c59a28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1080592 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

      jFYeauBgm_hqr^Ffx@10{iJ6RZtu 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⪚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 z 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�QJ8cbQu`# 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 Date: Sun, 19 Jan 2020 22:00:56 +0100 Subject: [PATCH 026/361] Graphics/ImageLoader: move decode() to loadFromMemory() --- source/Graphics/ImageLoader.cpp | 47 +++++++++++++-------------------- source/Graphics/ImageLoader.h | 2 -- 2 files changed, 18 insertions(+), 31 deletions(-) diff --git a/source/Graphics/ImageLoader.cpp b/source/Graphics/ImageLoader.cpp index 6827c57..3f7cac5 100644 --- a/source/Graphics/ImageLoader.cpp +++ b/source/Graphics/ImageLoader.cpp @@ -35,8 +35,7 @@ bool ImageLoader::loadFromFile(const char *filename, Image& img) fread(&buf[0], 1, buf.size(), fd); fclose(fd); - // loaded into memory. now decode. - if (decode((const char*)&buf[0], buf.size(), img) == false) { + if (loadFromMemory(&buf[0], buf.size(), img) == false) { Log::warn("ImageLoader: could not load file '%s'. Reason: %s", filename, m_error); return false; @@ -51,11 +50,25 @@ bool ImageLoader::loadFromFile(const char *filename, Image& img) bool ImageLoader::loadFromMemory(const void *data, unsigned size, Image& img) { - //std::vector buf; + // width, height, num components. + int w, h, n_comp; + const stbi_uc *ptr = (const stbi_uc *) data; - //buf.assign(((unsigned char*) data), ((unsigned char*) data) + size); + unsigned char *pixels = stbi_load_from_memory(ptr, size, &w, &h, &n_comp, 4); - return decode((const char*) data, size, img); + if (pixels) { + + unsigned int len = w * h * 4; + + img.create(w, h, pixels); + + stbi_image_free(pixels); + + return true; + } + + m_error = stbi_failure_reason(); + return false; } // TODO: Support more formats. @@ -89,30 +102,6 @@ bool ImageLoader::saveToFile(const Image& img, const char *filename) return false; } - -bool ImageLoader::decode(const char *data, unsigned int size, Image& img) -{ - // width, height, num components. - int w, h, n_comp; - const stbi_uc *ptr = (const stbi_uc *) data; - - unsigned char *pixels = stbi_load_from_memory(ptr, size, &w, &h, &n_comp, 4); - - if (pixels) { - - unsigned int len = w * h * 4; - - img.create(w, h, pixels); - - stbi_image_free(pixels); - - return true; - } - - m_error = stbi_failure_reason(); - return false; -} - bool ImageLoader::encodePNG(const Image& img, std::vector& data) { int buf_len; diff --git a/source/Graphics/ImageLoader.h b/source/Graphics/ImageLoader.h index 908b42e..a1374c6 100644 --- a/source/Graphics/ImageLoader.h +++ b/source/Graphics/ImageLoader.h @@ -19,8 +19,6 @@ public : protected : - bool decode(const char* data, unsigned int len, Image& img); - bool encode(Image& img, std::vector& data); bool encodeJPEG(const Image& img, std::vector& data); From 9e581ef859f1d181d7440672e892c2357f51b99a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 19 Jan 2020 22:01:26 +0100 Subject: [PATCH 027/361] source/Graphics/ImageLoader.h: remove unimplemented methods. --- source/Graphics/ImageLoader.h | 4 ---- 1 file changed, 4 deletions(-) diff --git a/source/Graphics/ImageLoader.h b/source/Graphics/ImageLoader.h index a1374c6..3fd4d02 100644 --- a/source/Graphics/ImageLoader.h +++ b/source/Graphics/ImageLoader.h @@ -19,10 +19,6 @@ public : protected : - bool encode(Image& img, std::vector& data); - - bool encodeJPEG(const Image& img, std::vector& data); - bool encodePNG(const Image& img, std::vector& data); protected : From a1e4f9347a067eb2b6acc7ba81dfae71e84bd14c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Feb 2020 15:45:23 +0100 Subject: [PATCH 028/361] examples/text/Game.h: no need to extend sp::InputListener --- examples/text/Game.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/examples/text/Game.h b/examples/text/Game.h index f0cd6ba..d06f0da 100644 --- a/examples/text/Game.h +++ b/examples/text/Game.h @@ -3,10 +3,9 @@ #define TEXT_GAME_H #include -#include #include -class TextExample : public sp::Game, public sp::InputListener +class TextExample : public sp::Game { protected : @@ -17,4 +16,4 @@ protected : void render(); }; -#endif /* TEXT_GAME_H*/ \ No newline at end of file +#endif /* TEXT_GAME_H*/ From 52fe72f31f54adc64c3292f99b679a83b6148990 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Feb 2020 15:46:29 +0100 Subject: [PATCH 029/361] examples/text/Game.h: no need to include Vector2 --- examples/text/Game.h | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/text/Game.h b/examples/text/Game.h index d06f0da..f491084 100644 --- a/examples/text/Game.h +++ b/examples/text/Game.h @@ -2,7 +2,6 @@ #ifndef TEXT_GAME_H #define TEXT_GAME_H -#include #include class TextExample : public sp::Game From 3477b723715dcd2340140bf62fbff82272250a92 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 24 Jan 2020 13:52:30 +0100 Subject: [PATCH 030/361] source/Input/InputModule.cpp: should not call m_platform->update() in update(). --- source/Input/InputModule.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/Input/InputModule.cpp b/source/Input/InputModule.cpp index 3f5f3ec..076d1c0 100644 --- a/source/Input/InputModule.cpp +++ b/source/Input/InputModule.cpp @@ -66,11 +66,8 @@ void InputModule::update() { InputDeviceVec::iterator it; - m_platform->update(); - // Update all devices. for(it = m_devices.begin(); it != m_devices.end(); it++) { - (*it)->update(this); } From da76c4b4d15816f0484d7bca40293f14e0eeca69 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 24 Jan 2020 15:35:07 +0100 Subject: [PATCH 031/361] Adding Win32EventQueue --- source/Platform/Win32/Win32EventQueue.cpp | 79 +++++++++++++++++++++++ source/Platform/Win32/Win32EventQueue.h | 22 +++++++ 2 files changed, 101 insertions(+) create mode 100644 source/Platform/Win32/Win32EventQueue.cpp create mode 100644 source/Platform/Win32/Win32EventQueue.h diff --git a/source/Platform/Win32/Win32EventQueue.cpp b/source/Platform/Win32/Win32EventQueue.cpp new file mode 100644 index 0000000..12af985 --- /dev/null +++ b/source/Platform/Win32/Win32EventQueue.cpp @@ -0,0 +1,79 @@ + +#include +#include "Win32Keyboard.h" +#include "Win32Mouse.h" +#include "Win32EventQueue.h" + +namespace sp { + +bool Win32EventQueue::poll(SysEvent& event) +{ + MSG msg; + + if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { + TranslateMessage(&msg); + if (processMessage(msg, event) == 0) { + return true; + } + } + return false; +} + +LRESULT Win32EventQueue::processMessage(MSG msg, SysEvent& event) +{ + switch(msg.message) { + case WM_QUIT : + event.type = SysEvent::Quit; + return 0; + // Input, Forward to devices. + case WM_KEYDOWN : + case WM_KEYUP : + OutputDebugString("WM_KEYDOWN\n"); + //SetCapture(msg.hwnd); + + if (Win32Keyboard::handleMessage(msg)) { + // Keyboard did handle the message. + return 0; + } + break; + case WM_MOUSEMOVE : + case WM_MOUSELEAVE : + + if (Win32Mouse::handleMessage(msg)) { + // Mouse did handle the message. + return 0; + } + break; + case WM_LBUTTONDOWN : + case WM_RBUTTONDOWN : + case WM_MBUTTONDOWN : + case WM_XBUTTONDOWN : + + SetCapture(msg.hwnd); + + if (Win32Mouse::handleMessage(msg)) { + // Mouse did handle the message. + return 0; + } + break; + case WM_LBUTTONUP : + case WM_RBUTTONUP : + case WM_MBUTTONUP : + case WM_XBUTTONUP : + + ReleaseCapture(); + + if (Win32Mouse::handleMessage(msg)) { + // Mouse did handle the message. + return 0; + } + break; + default : + break; + } + + // Message was not intercepted. Pass down to window. + return DispatchMessage(&msg); +} + +} // namespace sp diff --git a/source/Platform/Win32/Win32EventQueue.h b/source/Platform/Win32/Win32EventQueue.h new file mode 100644 index 0000000..9b3578d --- /dev/null +++ b/source/Platform/Win32/Win32EventQueue.h @@ -0,0 +1,22 @@ +#ifndef PLATFORM_WIN32_EVENT_QUEUE_H +#define PLATFORM_WIN32_EVENT_QUEUE_H + +#include +#include +#include + +namespace sp { + +class Win32EventQueue : public PlatformEventQueue +{ +public : + virtual bool poll(SysEvent& event); + +private : + + LRESULT processMessage(MSG msg, SysEvent& event); +}; + +} // namespace sp + +#endif /* PLATFORM_WIN32_MESSAGE_QUEUE_H */ From e6718e7ef1980681b30522ecd36121fde6e53946 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 24 Jan 2020 15:35:48 +0100 Subject: [PATCH 032/361] Adding source/Platform/PlatformEventQueue.h --- source/Platform/PlatformEventQueue.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 source/Platform/PlatformEventQueue.h diff --git a/source/Platform/PlatformEventQueue.h b/source/Platform/PlatformEventQueue.h new file mode 100644 index 0000000..d6c92a6 --- /dev/null +++ b/source/Platform/PlatformEventQueue.h @@ -0,0 +1,19 @@ +#ifndef PLATFORM_MESSAGE_QUEUE_H +#define PLATFORM_MESSAGE_QUEUE_H + +namespace sp { + +// Interface for platform specific event queue. +class PlatformEventQueue +{ +public : + + // Poll one event from the platform's event queue. + // Returns false if there was no events. + // NOTE: This method is guaranteed to be non-blocking. + virtual bool poll(SysEvent& event) = 0; +}; + +} // namespace sp + +#endif /* PLATFORM_MESSAGE_QUEUE_H */ From fb58490bfea0bb99cde63310f941811f8742d09c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 24 Jan 2020 15:37:06 +0100 Subject: [PATCH 033/361] System/MessageQueue: Use PlatformEventQueue --- engine.build.lua | 1 + include/Spectre/System/MessageQueue.h | 7 +++++++ source/System/MessageQueue.cpp | 23 +++++++++++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/engine.build.lua b/engine.build.lua index d2ddd58..ba05810 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -46,6 +46,7 @@ local platform_spec_module = Module("source/Platform/Win32", { "Win32Keyboard.cpp", "Win32Misc.cpp", "Win32Mouse.cpp", + "Win32EventQueue.cpp", "Win32MsgBuffer.cpp", "Win32System.cpp", "glad_wgl.c" diff --git a/include/Spectre/System/MessageQueue.h b/include/Spectre/System/MessageQueue.h index e1fcb34..de89c04 100644 --- a/include/Spectre/System/MessageQueue.h +++ b/include/Spectre/System/MessageQueue.h @@ -7,9 +7,14 @@ namespace sp { +class PlatformEventQueue; + class MessageQueue { public : + MessageQueue(); + ~MessageQueue(); + void postEvent(SysEvent event); bool pollEvent(SysEvent& event); @@ -18,6 +23,8 @@ public : protected : std::deque m_queue; + + PlatformEventQueue* m_impl; }; } // namespace sp diff --git a/source/System/MessageQueue.cpp b/source/System/MessageQueue.cpp index 4054c1e..b8d76c4 100644 --- a/source/System/MessageQueue.cpp +++ b/source/System/MessageQueue.cpp @@ -1,8 +1,26 @@ #include +#ifdef _WIN32 +#include +typedef sp::Win32EventQueue ImplType; +#else +#error "No MessageQueue implementation exists" +#endif + + namespace sp { +MessageQueue::MessageQueue() +{ + m_impl = new ImplType(); +} + +MessageQueue::~MessageQueue() +{ + delete m_impl; +} + void MessageQueue::postEvent(SysEvent event) { m_queue.push_back(event); @@ -10,6 +28,11 @@ void MessageQueue::postEvent(SysEvent event) bool MessageQueue::pollEvent(SysEvent& event) { + // Process platform events first. + if (m_impl->poll(event)) { + return true; + } + if (!isEmpty()) { event = m_queue.front(); m_queue.pop_front(); From 801ab1033fe1b66dd268a735406e76458aa0a626 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 24 Jan 2020 15:38:35 +0100 Subject: [PATCH 034/361] source/Game.cpp: in processEvents() no need to call platform->update() anymore. (messages are pumped in MessageQueue) --- source/Game.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/Game.cpp b/source/Game.cpp index f395494..4178c46 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -73,8 +73,6 @@ void Game::processEvents() MessageQueue& queue = m_platform->getMessageQueue(); SysEvent event; - m_platform->update(); - while(queue.pollEvent(event)) { if (event.type == SysEvent::Quit) { From f526b598e257b15ed8777513da089888535ea2df Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 24 Jan 2020 15:39:30 +0100 Subject: [PATCH 035/361] source/Platform/PlatformApplication.h: remove update(). platform event queue is handled in MessageQueue class. --- source/Platform/PlatformApplication.h | 2 - source/Platform/Win32/Win32Application.cpp | 70 ---------------------- source/Platform/Win32/Win32Application.h | 6 -- 3 files changed, 78 deletions(-) diff --git a/source/Platform/PlatformApplication.h b/source/Platform/PlatformApplication.h index 21315e8..800bf31 100644 --- a/source/Platform/PlatformApplication.h +++ b/source/Platform/PlatformApplication.h @@ -20,8 +20,6 @@ public : virtual PlatformInput& getInput() = 0; virtual MessageQueue& getMessageQueue() = 0; - - virtual void update() = 0; }; } // namespace sp diff --git a/source/Platform/Win32/Win32Application.cpp b/source/Platform/Win32/Win32Application.cpp index 20124e5..b125c7f 100644 --- a/source/Platform/Win32/Win32Application.cpp +++ b/source/Platform/Win32/Win32Application.cpp @@ -1,7 +1,4 @@ -#include -#include "Win32Keyboard.h" -#include "Win32Mouse.h" #include "Win32Application.h" namespace sp { @@ -30,71 +27,4 @@ MessageQueue& Win32Application::getMessageQueue() return m_messageQueue; } -void Win32Application::update() -{ - MSG msg; - - while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) { - TranslateMessage(&msg); - processMessage(msg); - } -} - -LRESULT Win32Application::processMessage(MSG msg) -{ - switch(msg.message) { - case WM_QUIT : - m_messageQueue.postEvent(SysEvent(SysEvent::Quit)); - return 0; - // Input, Forward to devices. - case WM_KEYDOWN : - case WM_KEYUP : - OutputDebugString("WM_KEYDOWN\n"); - //SetCapture(msg.hwnd); - - if (Win32Keyboard::handleMessage(msg)) { - // Keyboard did handle the message. - return 0; - } - break; - case WM_MOUSEMOVE : - case WM_MOUSELEAVE : - - if (Win32Mouse::handleMessage(msg)) { - // Mouse did handle the message. - return 0; - } - break; - case WM_LBUTTONDOWN : - case WM_RBUTTONDOWN : - case WM_MBUTTONDOWN : - case WM_XBUTTONDOWN : - - SetCapture(msg.hwnd); - - if (Win32Mouse::handleMessage(msg)) { - // Mouse did handle the message. - return 0; - } - break; - case WM_LBUTTONUP : - case WM_RBUTTONUP : - case WM_MBUTTONUP : - case WM_XBUTTONUP : - - ReleaseCapture(); - - if (Win32Mouse::handleMessage(msg)) { - // Mouse did handle the message. - return 0; - } - break; - default : - break; - } - - // Message was not intercepted. Pass down to window. - return DispatchMessage(&msg); -} - } // namespace sp diff --git a/source/Platform/Win32/Win32Application.h b/source/Platform/Win32/Win32Application.h index c1e02b8..51ed8ab 100644 --- a/source/Platform/Win32/Win32Application.h +++ b/source/Platform/Win32/Win32Application.h @@ -24,12 +24,6 @@ public : virtual MessageQueue& getMessageQueue(); - virtual void update(); - -protected : - - LRESULT processMessage(MSG msg); - protected : //Win32Display m_display; From b2ca926a00214ef9f319fd56cfba79aa0eacaf7b Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 24 Jan 2020 17:16:55 +0100 Subject: [PATCH 036/361] include/Spectre/Input/InputDevice.h: do not include "InputModule.h" --- include/Spectre/Input/InputDevice.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/Spectre/Input/InputDevice.h b/include/Spectre/Input/InputDevice.h index 543cdb2..ddace17 100644 --- a/include/Spectre/Input/InputDevice.h +++ b/include/Spectre/Input/InputDevice.h @@ -2,10 +2,10 @@ #ifndef SPECTRE_INTPUT_DEVICE_H #define SPECTRE_INTPUT_DEVICE_H -#include "InputModule.h" - namespace sp { +class InputMudule; + class InputDevice { friend class InputModule; From 762d26f36846d0c60d440c414ac322e7b52ce897 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 24 Jan 2020 17:23:44 +0100 Subject: [PATCH 037/361] include/Spectre/Input/InputEvent.h: Move MouseButton::Type to Mouse class. --- include/Spectre/Input/InputEvent.h | 16 ++-------------- include/Spectre/Input/Mouse.h | 18 ++++++++++++++---- source/Input/Mouse.cpp | 14 +++++++------- source/Platform/Win32/Win32Mouse.cpp | 20 ++++++++++---------- source/Platform/Win32/Win32Mouse.h | 4 ++-- 5 files changed, 35 insertions(+), 37 deletions(-) diff --git a/include/Spectre/Input/InputEvent.h b/include/Spectre/Input/InputEvent.h index aef33bd..5bf5e6e 100644 --- a/include/Spectre/Input/InputEvent.h +++ b/include/Spectre/Input/InputEvent.h @@ -4,22 +4,10 @@ #include #include +#include namespace sp { -namespace MouseButton { - - enum Type { - Unknown, - Left, - Right, - Middle, - Button1, - Button2, - NUM_MBUTTONS, - }; -}; - namespace Key { enum Type { @@ -130,7 +118,7 @@ typedef struct InputEvent }; struct MouseButtonEvent { - MouseButton::Type button; + Mouse::Button button; bool pressed; /* true if pressed, false if released. */ std::string getName() const; diff --git a/include/Spectre/Input/Mouse.h b/include/Spectre/Input/Mouse.h index 4268536..a560426 100644 --- a/include/Spectre/Input/Mouse.h +++ b/include/Spectre/Input/Mouse.h @@ -4,13 +4,23 @@ #include #include -#include "InputEvent.h" #include "InputDevice.h" namespace sp { class Mouse : public InputDevice { +public : + enum Button { + Unknown, + Left, + Right, + Middle, + Button1, + Button2, + NUM_MBUTTONS + }; + public : virtual ~Mouse(); @@ -19,11 +29,11 @@ public : //virtual Vector2i getPositionAbs() const = 0; - virtual bool isButtonDown(MouseButton::Type button) const = 0; + virtual bool isButtonDown(Button button) const = 0; - static std::string getButtonName(MouseButton::Type button); + static std::string getButtonName(Button button); }; -} // namespace sp +}; // namespace sp #endif /* SPECTRE_INPUT_MOUSE_H */ diff --git a/source/Input/Mouse.cpp b/source/Input/Mouse.cpp index 45edde6..3b58f0e 100644 --- a/source/Input/Mouse.cpp +++ b/source/Input/Mouse.cpp @@ -7,15 +7,15 @@ Mouse::~Mouse() { } -std::string Mouse::getButtonName(MouseButton::Type button) +std::string Mouse::getButtonName(Button button) { switch(button) { - case MouseButton::Button1 : return "Button1"; - case MouseButton::Button2 : return "Button2"; - case MouseButton::Left : return "Left"; - case MouseButton::Right : return "Right"; - case MouseButton::Middle : return "Middle"; - case MouseButton::Unknown : + case Button::Button1 : return "Button1"; + case Button::Button2 : return "Button2"; + case Button::Left : return "Left"; + case Button::Right : return "Right"; + case Button::Middle : return "Middle"; + case Button::Unknown : default: return "Unknown"; } diff --git a/source/Platform/Win32/Win32Mouse.cpp b/source/Platform/Win32/Win32Mouse.cpp index 3675486..d1aba97 100644 --- a/source/Platform/Win32/Win32Mouse.cpp +++ b/source/Platform/Win32/Win32Mouse.cpp @@ -29,7 +29,7 @@ static RECT GetClientArea(HWND hwnd) { void Win32Mouse::init() { - memset(m_state, 0, MouseButton::NUM_MBUTTONS); + memset(m_state, 0, Mouse::Button::NUM_MBUTTONS); m_tracked = false; } @@ -38,7 +38,7 @@ Vector2f Win32Mouse::getPosition() const return m_position; } -bool Win32Mouse::isButtonDown(MouseButton::Type button) const +bool Win32Mouse::isButtonDown(Mouse::Button button) const { return m_state[button]; } @@ -53,26 +53,26 @@ void Win32Mouse::update(InputModule *input) if (msg.message == WM_LBUTTONDOWN || msg.message == WM_LBUTTONUP) { InputEvent event(InputEvent::MouseButton); - event.mouseButton.button = MouseButton::Left; + event.mouseButton.button = Mouse::Button::Left; event.mouseButton.pressed = msg.message == WM_LBUTTONDOWN; - m_state[MouseButton::Left] = event.mouseButton.pressed; + m_state[Mouse::Button::Left] = event.mouseButton.pressed; input->postInputEvent(event); } else if (msg.message == WM_RBUTTONDOWN || msg.message == WM_RBUTTONUP) { InputEvent event(InputEvent::MouseButton); - event.mouseButton.button = MouseButton::Right; + event.mouseButton.button = Mouse::Button::Right; event.mouseButton.pressed = msg.message == WM_RBUTTONDOWN; - m_state[MouseButton::Right] = event.mouseButton.pressed; + m_state[Mouse::Button::Right] = event.mouseButton.pressed; input->postInputEvent(event); } else if (msg.message == WM_MBUTTONDOWN || msg.message == WM_MBUTTONUP) { InputEvent event(InputEvent::MouseButton); - event.mouseButton.button = MouseButton::Middle; + event.mouseButton.button = Mouse::Button::Middle; event.mouseButton.pressed = msg.message == WM_MBUTTONDOWN; - m_state[MouseButton::Middle] = event.mouseButton.pressed; + m_state[Mouse::Button::Middle] = event.mouseButton.pressed; input->postInputEvent(event); } else if (msg.message == WM_XBUTTONDOWN || msg.message == WM_XBUTTONUP) { @@ -80,10 +80,10 @@ void Win32Mouse::update(InputModule *input) int btn = GET_XBUTTON_WPARAM(msg.wParam); InputEvent event(InputEvent::MouseButton); - event.mouseButton.button = btn == XBUTTON1 ? MouseButton::Button1 : MouseButton::Button2; + event.mouseButton.button = btn == XBUTTON1 ? Mouse::Button::Button1 : Mouse::Button::Button2; event.mouseButton.pressed = msg.message == WM_XBUTTONDOWN; - m_state[MouseButton::Button1] = event.mouseButton.pressed; + m_state[Mouse::Button::Button1] = event.mouseButton.pressed; input->postInputEvent(event); } else if (msg.message == WM_MOUSEMOVE) { diff --git a/source/Platform/Win32/Win32Mouse.h b/source/Platform/Win32/Win32Mouse.h index 290103a..dfccf59 100644 --- a/source/Platform/Win32/Win32Mouse.h +++ b/source/Platform/Win32/Win32Mouse.h @@ -17,7 +17,7 @@ public : // Get mouse position virtual Vector2f getPosition() const; - virtual bool isButtonDown(MouseButton::Type button) const; + virtual bool isButtonDown(Mouse::Button button) const; static bool handleMessage(MSG message); @@ -28,7 +28,7 @@ protected : protected : Vector2f m_position; - bool m_state[MouseButton::NUM_MBUTTONS]; + bool m_state[Mouse::Button::NUM_MBUTTONS]; bool m_tracked; }; From 24c3f14c8c1fbc6d9e4aba908e0dbd39bb967748 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 24 Jan 2020 17:33:17 +0100 Subject: [PATCH 038/361] include/Spectre/Input/InputEvent.h: Move Key::Type to Keyboard class --- include/Spectre/Input/InputEvent.h | 97 +------------ include/Spectre/Input/Keyboard.h | 95 ++++++++++++- source/Input/Keyboard.cpp | 174 ++++++++++++------------ source/Platform/Win32/Win32Keyboard.cpp | 72 +++++----- source/Platform/Win32/Win32Keyboard.h | 4 +- 5 files changed, 220 insertions(+), 222 deletions(-) diff --git a/include/Spectre/Input/InputEvent.h b/include/Spectre/Input/InputEvent.h index 5bf5e6e..947e38c 100644 --- a/include/Spectre/Input/InputEvent.h +++ b/include/Spectre/Input/InputEvent.h @@ -5,101 +5,10 @@ #include #include #include +#include namespace sp { -namespace Key { - - enum Type { - Unknown, - A, - B, - C, - D, - E, - F, - G, - H, - I, - J, - K, - L, - M, - N, - O, - P, - Q, - R, - S, - T, - U, - V, - W, - X, - Y, - Z, - One, - Two, - Three, - Four, - Five, - Six, - Seven, - Eight, - Nine, - Zero, - Period, - Comma, - Enter, - Backspace, - Escape, - Space, - Capslock, - Up, - Down, - Left, - Right, - NUMPAD_1, - NUMPAD_2, - NUMPAD_3, - NUMPAD_4, - NUMPAD_5, - NUMPAD_6, - NUMPAD_7, - NUMPAD_8, - NUMPAD_9, - NUMPAD_0, - NUMPAD_Enter, - Home, - End, - Insert, - Delete, - PageUp, - PageDown, - Pause, - F1, - F2, - F3, - F4, - F5, - F6, - F7, - F8, - F9, - F10, - F11, - F12, - Tab, - LShift, - RShift, - LCtrl, - RCtrl, - LAlt, - RAlt, - NUM_KEYS, - }; -} - typedef struct InputEvent { enum Type @@ -111,8 +20,8 @@ typedef struct InputEvent }; struct KeyEvent { - Key::Type code; - bool pressed; /* true if pressed, false if released. */ + Keyboard::Key code; + bool pressed; /* true if pressed, false if released. */ std::string getKeyName() const; /* Get the key name */ }; diff --git a/include/Spectre/Input/Keyboard.h b/include/Spectre/Input/Keyboard.h index fe993f2..1d9f998 100644 --- a/include/Spectre/Input/Keyboard.h +++ b/include/Spectre/Input/Keyboard.h @@ -3,19 +3,108 @@ #define SPECTRE_INPUT_KEYBOARD_H #include -#include "InputEvent.h" #include "InputDevice.h" namespace sp { class Keyboard : public InputDevice { +public : + enum Key { + Unknown, + A, + B, + C, + D, + E, + F, + G, + H, + I, + J, + K, + L, + M, + N, + O, + P, + Q, + R, + S, + T, + U, + V, + W, + X, + Y, + Z, + One, + Two, + Three, + Four, + Five, + Six, + Seven, + Eight, + Nine, + Zero, + Period, + Comma, + Enter, + Backspace, + Escape, + Space, + Capslock, + Up, + Down, + Left, + Right, + NUMPAD_1, + NUMPAD_2, + NUMPAD_3, + NUMPAD_4, + NUMPAD_5, + NUMPAD_6, + NUMPAD_7, + NUMPAD_8, + NUMPAD_9, + NUMPAD_0, + NUMPAD_Enter, + Home, + End, + Insert, + Delete, + PageUp, + PageDown, + Pause, + F1, + F2, + F3, + F4, + F5, + F6, + F7, + F8, + F9, + F10, + F11, + F12, + Tab, + LShift, + RShift, + LCtrl, + RCtrl, + LAlt, + RAlt, + NUM_KEYS, + }; + public : virtual ~Keyboard() {}; - virtual bool isKeyDown(Key::Type key) = 0; + virtual bool isKeyDown(Key key) = 0; - static std::string getKeyName(Key::Type key); + static std::string getKeyName(Key key); }; } // namespace sp diff --git a/source/Input/Keyboard.cpp b/source/Input/Keyboard.cpp index 6c64bf5..de07b14 100644 --- a/source/Input/Keyboard.cpp +++ b/source/Input/Keyboard.cpp @@ -5,107 +5,107 @@ namespace sp { struct keyentry { - Key::Type type; + Keyboard::Key type; const char *name; }; #define MapSym(key, name) { key, name } struct keyentry table[] = { - MapSym(Key::Unknown, "Unknown"), - MapSym(Key::A, "A"), - MapSym(Key::B, "B"), - MapSym(Key::C, "C"), - MapSym(Key::D, "D"), - MapSym(Key::E, "E"), - MapSym(Key::F, "F"), - MapSym(Key::G, "G"), - MapSym(Key::H, "H"), - MapSym(Key::I, "I"), - MapSym(Key::J, "J"), - MapSym(Key::K, "K"), - MapSym(Key::L, "L"), - MapSym(Key::M, "M"), - MapSym(Key::N, "N"), - MapSym(Key::O, "O"), - MapSym(Key::P, "P"), - MapSym(Key::Q, "Q"), - MapSym(Key::R, "R"), - MapSym(Key::S, "S"), - MapSym(Key::T, "T"), - MapSym(Key::U, "U"), - MapSym(Key::V, "V"), - MapSym(Key::W, "W"), - MapSym(Key::X, "X"), - MapSym(Key::Y, "Y"), - MapSym(Key::Z, "Z"), - MapSym(Key::One, "1"), - MapSym(Key::Two, "2"), - MapSym(Key::Three, "3"), - MapSym(Key::Four, "4"), - MapSym(Key::Five, "5"), - MapSym(Key::Six, "6"), - MapSym(Key::Seven, "7"), - MapSym(Key::Eight, "8"), - MapSym(Key::Nine, "9"), - MapSym(Key::Zero, "0"), - MapSym(Key::Period, "Period"), - MapSym(Key::Comma, "Comma"), - MapSym(Key::Enter, "Enter"), - MapSym(Key::Backspace, "Backspace"), - MapSym(Key::Escape, "Escape"), - MapSym(Key::Space, "Space"), - MapSym(Key::Capslock, "Capslock"), - MapSym(Key::Up, "Up"), - MapSym(Key::Down, "Down"), - MapSym(Key::Left, "Left"), - MapSym(Key::Right, "Right"), + MapSym(Keyboard::Key::Unknown, "Unknown"), + MapSym(Keyboard::Key::A, "A"), + MapSym(Keyboard::Key::B, "B"), + MapSym(Keyboard::Key::C, "C"), + MapSym(Keyboard::Key::D, "D"), + MapSym(Keyboard::Key::E, "E"), + MapSym(Keyboard::Key::F, "F"), + MapSym(Keyboard::Key::G, "G"), + MapSym(Keyboard::Key::H, "H"), + MapSym(Keyboard::Key::I, "I"), + MapSym(Keyboard::Key::J, "J"), + MapSym(Keyboard::Key::K, "K"), + MapSym(Keyboard::Key::L, "L"), + MapSym(Keyboard::Key::M, "M"), + MapSym(Keyboard::Key::N, "N"), + MapSym(Keyboard::Key::O, "O"), + MapSym(Keyboard::Key::P, "P"), + MapSym(Keyboard::Key::Q, "Q"), + MapSym(Keyboard::Key::R, "R"), + MapSym(Keyboard::Key::S, "S"), + MapSym(Keyboard::Key::T, "T"), + MapSym(Keyboard::Key::U, "U"), + MapSym(Keyboard::Key::V, "V"), + MapSym(Keyboard::Key::W, "W"), + MapSym(Keyboard::Key::X, "X"), + MapSym(Keyboard::Key::Y, "Y"), + MapSym(Keyboard::Key::Z, "Z"), + MapSym(Keyboard::Key::One, "1"), + MapSym(Keyboard::Key::Two, "2"), + MapSym(Keyboard::Key::Three, "3"), + MapSym(Keyboard::Key::Four, "4"), + MapSym(Keyboard::Key::Five, "5"), + MapSym(Keyboard::Key::Six, "6"), + MapSym(Keyboard::Key::Seven, "7"), + MapSym(Keyboard::Key::Eight, "8"), + MapSym(Keyboard::Key::Nine, "9"), + MapSym(Keyboard::Key::Zero, "0"), + MapSym(Keyboard::Key::Period, "Period"), + MapSym(Keyboard::Key::Comma, "Comma"), + MapSym(Keyboard::Key::Enter, "Enter"), + MapSym(Keyboard::Key::Backspace, "Backspace"), + MapSym(Keyboard::Key::Escape, "Escape"), + MapSym(Keyboard::Key::Space, "Space"), + MapSym(Keyboard::Key::Capslock, "Capslock"), + MapSym(Keyboard::Key::Up, "Up"), + MapSym(Keyboard::Key::Down, "Down"), + MapSym(Keyboard::Key::Left, "Left"), + MapSym(Keyboard::Key::Right, "Right"), // Numpad - MapSym(Key::NUMPAD_1, "Numpad 1"), - MapSym(Key::NUMPAD_2, "Numpad 2"), - MapSym(Key::NUMPAD_3, "Numpad 3"), - MapSym(Key::NUMPAD_4, "Numpad 4"), - MapSym(Key::NUMPAD_5, "Numpad 5"), - MapSym(Key::NUMPAD_6, "Numpad 6"), - MapSym(Key::NUMPAD_7, "Numpad 7"), - MapSym(Key::NUMPAD_8, "Numpad 8"), - MapSym(Key::NUMPAD_9, "Numpad 9"), - MapSym(Key::NUMPAD_0, "Numpad 0"), - MapSym(Key::NUMPAD_Enter, "Numpad Enter"), + MapSym(Keyboard::Key::NUMPAD_1, "Numpad 1"), + MapSym(Keyboard::Key::NUMPAD_2, "Numpad 2"), + MapSym(Keyboard::Key::NUMPAD_3, "Numpad 3"), + MapSym(Keyboard::Key::NUMPAD_4, "Numpad 4"), + MapSym(Keyboard::Key::NUMPAD_5, "Numpad 5"), + MapSym(Keyboard::Key::NUMPAD_6, "Numpad 6"), + MapSym(Keyboard::Key::NUMPAD_7, "Numpad 7"), + MapSym(Keyboard::Key::NUMPAD_8, "Numpad 8"), + MapSym(Keyboard::Key::NUMPAD_9, "Numpad 9"), + MapSym(Keyboard::Key::NUMPAD_0, "Numpad 0"), + MapSym(Keyboard::Key::NUMPAD_Enter, "Numpad Enter"), - MapSym(Key::Home, "Home"), - MapSym(Key::End, "End"), - MapSym(Key::Insert, "Insert"), - MapSym(Key::Delete, "Delete"), - MapSym(Key::PageUp, "Page up"), - MapSym(Key::PageDown, "Page down"), - MapSym(Key::Pause, "Pause"), + MapSym(Keyboard::Key::Home, "Home"), + MapSym(Keyboard::Key::End, "End"), + MapSym(Keyboard::Key::Insert, "Insert"), + MapSym(Keyboard::Key::Delete, "Delete"), + MapSym(Keyboard::Key::PageUp, "Page up"), + MapSym(Keyboard::Key::PageDown, "Page down"), + MapSym(Keyboard::Key::Pause, "Pause"), // Function keys. - MapSym(Key::F1, "F1"), - MapSym(Key::F2, "F2"), - MapSym(Key::F3, "F3"), - MapSym(Key::F4, "F4"), - MapSym(Key::F5, "F5"), - MapSym(Key::F6, "F6"), - MapSym(Key::F7, "F7"), - MapSym(Key::F8, "F8"), - MapSym(Key::F9, "F9"), - MapSym(Key::F10, "F10"), - MapSym(Key::F11, "F11"), - MapSym(Key::F12, "F12"), + MapSym(Keyboard::Key::F1, "F1"), + MapSym(Keyboard::Key::F2, "F2"), + MapSym(Keyboard::Key::F3, "F3"), + MapSym(Keyboard::Key::F4, "F4"), + MapSym(Keyboard::Key::F5, "F5"), + MapSym(Keyboard::Key::F6, "F6"), + MapSym(Keyboard::Key::F7, "F7"), + MapSym(Keyboard::Key::F8, "F8"), + MapSym(Keyboard::Key::F9, "F9"), + MapSym(Keyboard::Key::F10, "F10"), + MapSym(Keyboard::Key::F11, "F11"), + MapSym(Keyboard::Key::F12, "F12"), - MapSym(Key::Tab, "Tab"), - MapSym(Key::LShift, "Left Shift"), - MapSym(Key::RShift, "Right Shift"), - MapSym(Key::LCtrl, "Left Control"), - MapSym(Key::RCtrl, "Right Control"), - MapSym(Key::LAlt, "Left Alt"), - MapSym(Key::RAlt, "Right Alt"), + MapSym(Keyboard::Key::Tab, "Tab"), + MapSym(Keyboard::Key::LShift, "Left Shift"), + MapSym(Keyboard::Key::RShift, "Right Shift"), + MapSym(Keyboard::Key::LCtrl, "Left Control"), + MapSym(Keyboard::Key::RCtrl, "Right Control"), + MapSym(Keyboard::Key::LAlt, "Left Alt"), + MapSym(Keyboard::Key::RAlt, "Right Alt"), }; -std::string Keyboard::getKeyName(Key::Type key) +std::string Keyboard::getKeyName(Key key) { if (key >= Key::NUM_KEYS) { key = Key::Unknown; diff --git a/source/Platform/Win32/Win32Keyboard.cpp b/source/Platform/Win32/Win32Keyboard.cpp index 8cbd4ee..8d37970 100644 --- a/source/Platform/Win32/Win32Keyboard.cpp +++ b/source/Platform/Win32/Win32Keyboard.cpp @@ -11,54 +11,54 @@ namespace sp { static Win32MsgBuffer msg_buf; -static const Key::Type deviceToKey[256] = { +static const Keyboard::Key deviceToKey[256] = { /* 0 1 2 3 4 5 6 7 */ /* 8 9 A B C D E F */ // 00-0F - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Backspace, Key::Tab, Key::Unknown, Key::Unknown, Key::Unknown, Key::Enter, Key::Unknown, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Backspace, Keyboard::Key::Tab, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Enter, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 10-1F - Key::Unknown, Key::Unknown, Key::Unknown, Key::Pause, Key::Capslock, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Escape, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Pause, Keyboard::Key::Capslock, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Escape, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 20-2F - Key::Space, Key::PageUp, Key::PageDown, Key::End, Key::Home, Key::Left, Key::Up, Key::Right, - Key::Down, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Insert, Key::Delete, Key::Unknown, + Keyboard::Key::Space, Keyboard::Key::PageUp, Keyboard::Key::PageDown, Keyboard::Key::End, Keyboard::Key::Home, Keyboard::Key::Left, Keyboard::Key::Up, Keyboard::Key::Right, + Keyboard::Key::Down, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Insert, Keyboard::Key::Delete, Keyboard::Key::Unknown, // 30-3F - Key::Zero, Key::One, Key::Two, Key::Three, Key::Four, Key::Five, Key::Six, Key::Seven, - Key::Eight, Key::Nine, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::Zero, Keyboard::Key::One, Keyboard::Key::Two, Keyboard::Key::Three, Keyboard::Key::Four, Keyboard::Key::Five, Keyboard::Key::Six, Keyboard::Key::Seven, + Keyboard::Key::Eight, Keyboard::Key::Nine, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 40-4F - Key::Unknown, Key::A, Key::B, Key::C, Key::D, Key::E, Key::F, Key::G, - Key::H, Key::I, Key::J, Key::K, Key::L, Key::M, Key::N, Key::O, + Keyboard::Key::Unknown, Keyboard::Key::A, Keyboard::Key::B, Keyboard::Key::C, Keyboard::Key::D, Keyboard::Key::E, Keyboard::Key::F, Keyboard::Key::G, + Keyboard::Key::H, Keyboard::Key::I, Keyboard::Key::J, Keyboard::Key::K, Keyboard::Key::L, Keyboard::Key::M, Keyboard::Key::N, Keyboard::Key::O, // 50-5F - Key::P, Key::Q, Key::R, Key::S, Key::T, Key::U, Key::V, Key::W, - Key::X, Key::Y, Key::Z, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::P, Keyboard::Key::Q, Keyboard::Key::R, Keyboard::Key::S, Keyboard::Key::T, Keyboard::Key::U, Keyboard::Key::V, Keyboard::Key::W, + Keyboard::Key::X, Keyboard::Key::Y, Keyboard::Key::Z, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 60-6F - Key::NUMPAD_0, Key::NUMPAD_1, Key::NUMPAD_2, Key::NUMPAD_3, Key::NUMPAD_4, Key::NUMPAD_5, Key::NUMPAD_6, Key::NUMPAD_7, - Key::NUMPAD_8, Key::NUMPAD_9, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::NUMPAD_0, Keyboard::Key::NUMPAD_1, Keyboard::Key::NUMPAD_2, Keyboard::Key::NUMPAD_3, Keyboard::Key::NUMPAD_4, Keyboard::Key::NUMPAD_5, Keyboard::Key::NUMPAD_6, Keyboard::Key::NUMPAD_7, + Keyboard::Key::NUMPAD_8, Keyboard::Key::NUMPAD_9, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 70-7F - Key::F1, Key::F2, Key::F3, Key::F4, Key::F5, Key::F6, Key::F7, Key::F8, - Key::F9, Key::F10, Key::F11, Key::F12, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::F1, Keyboard::Key::F2, Keyboard::Key::F3, Keyboard::Key::F4, Keyboard::Key::F5, Keyboard::Key::F6, Keyboard::Key::F7, Keyboard::Key::F8, + Keyboard::Key::F9, Keyboard::Key::F10, Keyboard::Key::F11, Keyboard::Key::F12, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 80-8F - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 90-9F - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // A0-AF - Key::LShift, Key::RShift, Key::LCtrl, Key::RCtrl, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::LShift, Keyboard::Key::RShift, Keyboard::Key::LCtrl, Keyboard::Key::RCtrl, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // B0-BF - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Comma, Key::Unknown, Key::Period, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Comma, Keyboard::Key::Unknown, Keyboard::Key::Period, Keyboard::Key::Unknown, // C0-CF - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // E0-EF - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // F0-FF - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, - Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, }; void Win32Keyboard::init() @@ -68,7 +68,7 @@ void Win32Keyboard::init() memset(m_btnState, 0, sizeof(m_btnState) / sizeof(m_btnState[0])); } -bool Win32Keyboard::isKeyDown(Key::Type key) +bool Win32Keyboard::isKeyDown(Keyboard::Key key) { return m_btnState[key]; } @@ -81,11 +81,11 @@ void Win32Keyboard::update(InputModule *input) if (msg.message == WM_KILLFOCUS) { - for(int i = 0; i < Key::NUM_KEYS; i++) { + for(int i = 0; i < Keyboard::Key::NUM_KEYS; i++) { if (m_btnState[i]) { InputEvent event(InputEvent::Key); - event.key.code = (Key::Type) i; + event.key.code = (Keyboard::Key) i; event.key.pressed = msg.message == WM_KEYDOWN; m_btnState[i] = false; @@ -100,9 +100,9 @@ void Win32Keyboard::update(InputModule *input) continue; } - Key::Type key = deviceToKey[msg.wParam % 0xFF]; + Keyboard::Key key = deviceToKey[msg.wParam % 0xFF]; - if (key != Key::Unknown) { + if (key != Keyboard::Key::Unknown) { InputEvent event(InputEvent::Key); event.key.code = key; event.key.pressed = msg.message == WM_KEYDOWN; diff --git a/source/Platform/Win32/Win32Keyboard.h b/source/Platform/Win32/Win32Keyboard.h index 80cbd13..1280532 100644 --- a/source/Platform/Win32/Win32Keyboard.h +++ b/source/Platform/Win32/Win32Keyboard.h @@ -12,7 +12,7 @@ class Win32Keyboard : public Keyboard public : void init(); - bool isKeyDown(Key::Type key); + bool isKeyDown(Keyboard::Key key); static bool handleMessage(MSG message); @@ -22,7 +22,7 @@ protected : protected : - bool m_btnState[Key::NUM_KEYS]; + bool m_btnState[Keyboard::Key::NUM_KEYS]; bool m_hasFocus; }; From 4d54968f831d6d3cf34b7535cdf35466b3254c51 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 28 Jan 2020 00:35:58 +0100 Subject: [PATCH 039/361] Display/Display: No need to include System/SystemEvent. --- include/Spectre/Display/Display.h | 1 - source/Display/Display.cpp | 1 - 2 files changed, 2 deletions(-) diff --git a/include/Spectre/Display/Display.h b/include/Spectre/Display/Display.h index 305623b..6f5965f 100644 --- a/include/Spectre/Display/Display.h +++ b/include/Spectre/Display/Display.h @@ -5,7 +5,6 @@ #include "DisplayMode.h" #include "DisplayDescription.h" #include -#include #include namespace sp { diff --git a/source/Display/Display.cpp b/source/Display/Display.cpp index 6895d06..f70078f 100644 --- a/source/Display/Display.cpp +++ b/source/Display/Display.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include namespace sp { From ffb97d2b3ac9639ad854a28d283aa3a3c56612ce Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 28 Jan 2020 00:42:43 +0100 Subject: [PATCH 040/361] source/Platform/Win32/Win32Display.cpp: No need to include Spectre/System/SystemEvent.h --- source/Platform/Win32/Win32Display.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index 9527585..f8bbe49 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -3,7 +3,6 @@ #include -#include #include #include "Win32Application.h" #include "Win32Internal.h" From 858e721451f94daa6d2ba9fd8f1b5f9e65583218 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 28 Jan 2020 00:46:04 +0100 Subject: [PATCH 041/361] source/Platform/PlatformEventQueue.h: need to forward declare sp::SysEvent --- source/Platform/PlatformEventQueue.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/Platform/PlatformEventQueue.h b/source/Platform/PlatformEventQueue.h index d6c92a6..8a443e6 100644 --- a/source/Platform/PlatformEventQueue.h +++ b/source/Platform/PlatformEventQueue.h @@ -3,6 +3,8 @@ namespace sp { +struct SysEvent; + // Interface for platform specific event queue. class PlatformEventQueue { From 10198484e7296553733a0f62b53328ab8a63108a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 30 Jan 2020 22:40:09 +0100 Subject: [PATCH 042/361] System/SystemEvent: Merge with Input/InputEvent into just Event. --- engine.build.lua | 2 +- include/Spectre/System/Event.h | 74 +++++++++++++++++++++++ include/Spectre/System/MessageHandler.h | 2 +- include/Spectre/System/MessageQueue.h | 8 +-- include/Spectre/System/SystemEvent.h | 41 ------------- source/Game.cpp | 9 ++- source/Platform/PlatformEventQueue.h | 4 +- source/Platform/Win32/Win32EventQueue.cpp | 6 +- source/Platform/Win32/Win32EventQueue.h | 6 +- source/System/Event.cpp | 56 +++++++++++++++++ source/System/MessageQueue.cpp | 4 +- source/System/SystemEvent.cpp | 20 ------ 12 files changed, 152 insertions(+), 80 deletions(-) create mode 100644 include/Spectre/System/Event.h delete mode 100644 include/Spectre/System/SystemEvent.h create mode 100644 source/System/Event.cpp delete mode 100644 source/System/SystemEvent.cpp diff --git a/engine.build.lua b/engine.build.lua index ba05810..a6ddf21 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -27,7 +27,7 @@ local system_module = Module("source/System", { "Path.cpp", "MessageHandler.cpp", "MessageQueue.cpp", - "SystemEvent.cpp", + "Event.cpp", "Log.cpp" }) diff --git a/include/Spectre/System/Event.h b/include/Spectre/System/Event.h new file mode 100644 index 0000000..657e461 --- /dev/null +++ b/include/Spectre/System/Event.h @@ -0,0 +1,74 @@ + +#ifndef SPECTRE_SYSTEM_EVENT_H +#define SPECTRE_SYSTEM_EVENT_H + +#include +#include + +namespace sp { + +class Display; + +struct Event +{ +public : + + enum Type { + None, + Quit, + Size, + Key, + MouseButton, + MouseMove + }; + + struct KeyEvent { + Keyboard::Key code; + bool pressed; /* true if pressed, false if released. */ + + std::string getKeyName() const; /* Get the key name */ + }; + + struct MouseButtonEvent { + Mouse::Button button; + bool pressed; /* true if pressed, false if released. */ + + std::string getName() const; + }; + + struct MouseMoveEvent { + unsigned int x; + unsigned int y; + }; + + struct SizeEvent + { + Display *display; + int width; + int height; + }; + + Type type; + union { + struct SizeEvent size; + struct KeyEvent key; + struct MouseMoveEvent mouseMove; + struct MouseButtonEvent mouseButton; + }; + + Event(Type type = None); + + // Helper methods + + static Event createSize(Display *display, int width, int height); + + static Event createKey(Keyboard::Key code, bool pressed); + + static Event createMouseButton(Mouse::Button button, bool pressed); + + static Event createMouseMove(unsigned int x, unsigned int y); +}; + +} // namespace sp + +#endif /* SPECTRE_SYSTEM_EVENT_H */ diff --git a/include/Spectre/System/MessageHandler.h b/include/Spectre/System/MessageHandler.h index 759ae3e..9b593f3 100644 --- a/include/Spectre/System/MessageHandler.h +++ b/include/Spectre/System/MessageHandler.h @@ -2,7 +2,7 @@ #ifndef SPECTRE_SYSTEM_MESSAGEHANDLER_H #define SPECTRE_SYSTEM_MESSAGEHANDLER_H -#include "SystemEvent.h" +#include namespace sp { diff --git a/include/Spectre/System/MessageQueue.h b/include/Spectre/System/MessageQueue.h index de89c04..c105889 100644 --- a/include/Spectre/System/MessageQueue.h +++ b/include/Spectre/System/MessageQueue.h @@ -2,7 +2,7 @@ #ifndef SPECTRE_MESSAGE_QUEUE_H #define SPECTRE_MESSAGE_QUEUE_H -#include +#include #include namespace sp { @@ -15,14 +15,14 @@ public : MessageQueue(); ~MessageQueue(); - void postEvent(SysEvent event); + void postEvent(Event event); - bool pollEvent(SysEvent& event); + bool pollEvent(Event& event); bool isEmpty() const; protected : - std::deque m_queue; + std::deque m_queue; PlatformEventQueue* m_impl; }; diff --git a/include/Spectre/System/SystemEvent.h b/include/Spectre/System/SystemEvent.h deleted file mode 100644 index e802634..0000000 --- a/include/Spectre/System/SystemEvent.h +++ /dev/null @@ -1,41 +0,0 @@ - -#ifndef SYSTEM_EVENT_H -#define SYSTEM_EVENT_H - -namespace sp { - -class Display; - -struct SysEvent -{ -public : - - enum Type { - None, - Quit, - Size, - }; - - Type type; - - struct Size - { - Display *display; - int width; - int height; - }; - - union { - struct Size size; - }; - - SysEvent(Type type = None); - - // Helper methods - - static SysEvent sizeEvent(Display *display, int width, int height); -}; - -} // namespace sp - -#endif /* SYSTEM_EVENT_H */ diff --git a/source/Game.cpp b/source/Game.cpp index 4178c46..1d408ee 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -56,6 +56,9 @@ void Game::gameLoop() processEvents(); + // Update input. + getInput()->update(); + if (time.beginFrame()) { while(time.tick()) { @@ -71,18 +74,18 @@ void Game::gameLoop() void Game::processEvents() { MessageQueue& queue = m_platform->getMessageQueue(); - SysEvent event; + Event event; while(queue.pollEvent(event)) { - if (event.type == SysEvent::Quit) { + if (event.type == Event::Quit) { exit(); break; } // Call message handler. - if (event.type == SysEvent::Size) { + if (event.type == Event::Size) { m_messageHandler->onSizeChanged(event.size.display, event.size.width, event.size.height); } } diff --git a/source/Platform/PlatformEventQueue.h b/source/Platform/PlatformEventQueue.h index 8a443e6..706a816 100644 --- a/source/Platform/PlatformEventQueue.h +++ b/source/Platform/PlatformEventQueue.h @@ -3,7 +3,7 @@ namespace sp { -struct SysEvent; +struct Event; // Interface for platform specific event queue. class PlatformEventQueue @@ -13,7 +13,7 @@ public : // Poll one event from the platform's event queue. // Returns false if there was no events. // NOTE: This method is guaranteed to be non-blocking. - virtual bool poll(SysEvent& event) = 0; + virtual bool poll(Event& event) = 0; }; } // namespace sp diff --git a/source/Platform/Win32/Win32EventQueue.cpp b/source/Platform/Win32/Win32EventQueue.cpp index 12af985..c2b6b74 100644 --- a/source/Platform/Win32/Win32EventQueue.cpp +++ b/source/Platform/Win32/Win32EventQueue.cpp @@ -6,7 +6,7 @@ namespace sp { -bool Win32EventQueue::poll(SysEvent& event) +bool Win32EventQueue::poll(Event& event) { MSG msg; @@ -19,11 +19,11 @@ bool Win32EventQueue::poll(SysEvent& event) return false; } -LRESULT Win32EventQueue::processMessage(MSG msg, SysEvent& event) +LRESULT Win32EventQueue::processMessage(MSG msg, Event& event) { switch(msg.message) { case WM_QUIT : - event.type = SysEvent::Quit; + event.type = Event::Quit; return 0; // Input, Forward to devices. case WM_KEYDOWN : diff --git a/source/Platform/Win32/Win32EventQueue.h b/source/Platform/Win32/Win32EventQueue.h index 9b3578d..503f5fc 100644 --- a/source/Platform/Win32/Win32EventQueue.h +++ b/source/Platform/Win32/Win32EventQueue.h @@ -2,7 +2,7 @@ #define PLATFORM_WIN32_EVENT_QUEUE_H #include -#include +#include #include namespace sp { @@ -10,11 +10,11 @@ namespace sp { class Win32EventQueue : public PlatformEventQueue { public : - virtual bool poll(SysEvent& event); + virtual bool poll(Event& event); private : - LRESULT processMessage(MSG msg, SysEvent& event); + LRESULT processMessage(MSG msg, Event& event); }; } // namespace sp diff --git a/source/System/Event.cpp b/source/System/Event.cpp new file mode 100644 index 0000000..43dee46 --- /dev/null +++ b/source/System/Event.cpp @@ -0,0 +1,56 @@ + +#include + +namespace sp { + +Event::Event(Type type) : +type (type) +{ +} + +std::string Event::KeyEvent::getKeyName() const +{ + return Keyboard::getKeyName(code); +} + +std::string Event::MouseButtonEvent::getName() const +{ + return Mouse::getButtonName(button); +} + +// Helper methods + +Event Event::createSize(Display *display, int width, int height) +{ + Event event(Size); + event.size.display = display; + event.size.width = width; + event.size.height = height; + return event; +} + +Event Event::createKey(Keyboard::Key code, bool pressed) +{ + Event event(Key); + event.key.code = code; + event.key.pressed = pressed; + return event; +} + +Event Event::createMouseButton(Mouse::Button button, bool pressed) +{ + Event event(MouseButton); + event.mouseButton.button = button; + event.mouseButton.pressed = pressed; + return event; +} + +Event Event::createMouseMove(unsigned int x, unsigned int y) +{ + Event event(MouseMove); + event.mouseMove.x = x; + event.mouseMove.y = y; + return event; +} + +} // namespace sp diff --git a/source/System/MessageQueue.cpp b/source/System/MessageQueue.cpp index b8d76c4..8ff7a3b 100644 --- a/source/System/MessageQueue.cpp +++ b/source/System/MessageQueue.cpp @@ -21,12 +21,12 @@ MessageQueue::~MessageQueue() delete m_impl; } -void MessageQueue::postEvent(SysEvent event) +void MessageQueue::postEvent(Event event) { m_queue.push_back(event); } -bool MessageQueue::pollEvent(SysEvent& event) +bool MessageQueue::pollEvent(Event& event) { // Process platform events first. if (m_impl->poll(event)) { diff --git a/source/System/SystemEvent.cpp b/source/System/SystemEvent.cpp deleted file mode 100644 index 2d625be..0000000 --- a/source/System/SystemEvent.cpp +++ /dev/null @@ -1,20 +0,0 @@ - -#include - -namespace sp { - -SysEvent::SysEvent(Type type) : -type (type) -{ -} - -SysEvent SysEvent::sizeEvent(Display *display, int width, int height) -{ - SysEvent event(Size); - event.size.display = display; - event.size.width = width; - event.size.height = height; - return event; -} - -} // namespace sp From cd32d0b7c257e7726f8ef43b739af9618eae9e2c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 30 Jan 2020 23:52:16 +0100 Subject: [PATCH 043/361] Adding System/EventListener --- engine.build.lua | 1 + include/Spectre/System/EventListener.h | 23 +++++++++++++++++++++++ source/System/EventListener.cpp | 14 ++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 include/Spectre/System/EventListener.h create mode 100644 source/System/EventListener.cpp diff --git a/engine.build.lua b/engine.build.lua index a6ddf21..85adcc3 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -28,6 +28,7 @@ local system_module = Module("source/System", { "MessageHandler.cpp", "MessageQueue.cpp", "Event.cpp", + "EventListener.cpp", "Log.cpp" }) diff --git a/include/Spectre/System/EventListener.h b/include/Spectre/System/EventListener.h new file mode 100644 index 0000000..5b18d6b --- /dev/null +++ b/include/Spectre/System/EventListener.h @@ -0,0 +1,23 @@ + +#ifndef SYSTEM_EVENT_LISTENER_H +#define SYSTEM_EVENT_LISTENER_H + +#include +#include +#include + +namespace sp { + +class Display; + +class EventListener +{ +public : + virtual void onSizeChanged(Display* display, int width, int height); + + virtual void onEvent(const Event& event); +}; + +} // namespace sp + +#endif /* SYSTEM_EVENT_LISTENER_H */ diff --git a/source/System/EventListener.cpp b/source/System/EventListener.cpp new file mode 100644 index 0000000..d2d6875 --- /dev/null +++ b/source/System/EventListener.cpp @@ -0,0 +1,14 @@ +#include +#include + +namespace sp { + +void EventListener::onSizeChanged(Display* display, int width, int height) +{ +} + +void EventListener::onEvent(const Event& event) +{ +} + +} // namespace sp From a30fd370326e8383eee1e87486c532fd8f04b200 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 30 Jan 2020 23:54:43 +0100 Subject: [PATCH 044/361] System/MessageHandler: Make this class useful by implementing EventListener and also add a vector of listeners with register/unregister methods. --- include/Spectre/System/MessageHandler.h | 17 ++++++++++--- source/System/MessageHandler.cpp | 34 +++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/include/Spectre/System/MessageHandler.h b/include/Spectre/System/MessageHandler.h index 9b593f3..4ca39bc 100644 --- a/include/Spectre/System/MessageHandler.h +++ b/include/Spectre/System/MessageHandler.h @@ -2,16 +2,25 @@ #ifndef SPECTRE_SYSTEM_MESSAGEHANDLER_H #define SPECTRE_SYSTEM_MESSAGEHANDLER_H -#include +#include +#include "EventListener.h" namespace sp { -class Display; - -class MessageHandler +class MessageHandler : public EventListener { public : + + void registerListener(EventListener *listener); + + void unregisterListener(EventListener *listener); + virtual void onSizeChanged(Display* display, int width, int height); + + virtual void onEvent(const Event& event); + +protected : + std::vector m_listeners; }; } // namespace sp diff --git a/source/System/MessageHandler.cpp b/source/System/MessageHandler.cpp index 6965904..f0eb45f 100644 --- a/source/System/MessageHandler.cpp +++ b/source/System/MessageHandler.cpp @@ -4,8 +4,42 @@ namespace sp { +void MessageHandler::registerListener(EventListener *listener) +{ + for(auto it = m_listeners.begin(); it != m_listeners.end(); it++) { + + if (listener == *it) { + // Already in vector. nothing to do. + return; + } + } + + m_listeners.push_back(listener); +} + +void MessageHandler::unregisterListener(EventListener *listener) +{ + for(auto it = m_listeners.begin(); it != m_listeners.end(); it++) { + + if (listener == *it) { + m_listeners.erase(it); + break; + } + } +} + void MessageHandler::onSizeChanged(Display* display, int width, int height) { + for(EventListener* listener : m_listeners) { + listener->onSizeChanged(display, width, height); + } +} + +void MessageHandler::onEvent(const Event& event) +{ + for(EventListener* listener : m_listeners) { + listener->onEvent(event); + } } } // namespace sp From 81b64e18d44f29836dbf23a464e7ebab941b0cf7 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 30 Jan 2020 23:55:26 +0100 Subject: [PATCH 045/361] Game: add getMessageHandler() method. --- include/Spectre/Game.h | 2 ++ source/Game.cpp | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/include/Spectre/Game.h b/include/Spectre/Game.h index 41cb59d..4036bf6 100644 --- a/include/Spectre/Game.h +++ b/include/Spectre/Game.h @@ -37,6 +37,8 @@ protected : FPSCounter& getFpsCounter(); + MessageHandler* getMessageHandler() const; + private : void setup(); diff --git a/source/Game.cpp b/source/Game.cpp index 1d408ee..ae5a098 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -111,4 +111,9 @@ FPSCounter& Game::getFpsCounter() return m_fpsCounter; } +MessageHandler* Game::getMessageHandler() const +{ + return m_messageHandler; +} + } From e75d373933ae1216addc8cff1dbc0c168c4a9c37 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 30 Jan 2020 23:56:33 +0100 Subject: [PATCH 046/361] Game: call MessageHandler::onEvent() --- source/Game.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/Game.cpp b/source/Game.cpp index ae5a098..1f7772f 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -88,6 +88,8 @@ void Game::processEvents() if (event.type == Event::Size) { m_messageHandler->onSizeChanged(event.size.display, event.size.width, event.size.height); } + + m_messageHandler->onEvent(event); } } From 390be8f7403261705b85da0b65070e50e2c35c00 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Feb 2020 11:26:37 +0100 Subject: [PATCH 047/361] Platform/Win32/Win32Keyboard: skip Win32MsgBuffer and handle event directly in handleMessage() --- source/Platform/Win32/Win32EventQueue.cpp | 2 +- source/Platform/Win32/Win32Keyboard.cpp | 57 +++++------------------ source/Platform/Win32/Win32Keyboard.h | 4 +- 3 files changed, 16 insertions(+), 47 deletions(-) diff --git a/source/Platform/Win32/Win32EventQueue.cpp b/source/Platform/Win32/Win32EventQueue.cpp index c2b6b74..bf7a77e 100644 --- a/source/Platform/Win32/Win32EventQueue.cpp +++ b/source/Platform/Win32/Win32EventQueue.cpp @@ -31,7 +31,7 @@ LRESULT Win32EventQueue::processMessage(MSG msg, Event& event) OutputDebugString("WM_KEYDOWN\n"); //SetCapture(msg.hwnd); - if (Win32Keyboard::handleMessage(msg)) { + if (Win32Keyboard::handleMessage(msg, event)) { // Keyboard did handle the message. return 0; } diff --git a/source/Platform/Win32/Win32Keyboard.cpp b/source/Platform/Win32/Win32Keyboard.cpp index 8d37970..13fd328 100644 --- a/source/Platform/Win32/Win32Keyboard.cpp +++ b/source/Platform/Win32/Win32Keyboard.cpp @@ -1,15 +1,13 @@ #include -#include +#include #include #include "Win32Input.h" #include "Win32Keyboard.h" -#include "Win32MsgBuffer.h" namespace sp { -static Win32MsgBuffer msg_buf; static const Keyboard::Key deviceToKey[256] = { /* 0 1 2 3 4 5 6 7 */ @@ -63,8 +61,6 @@ static const Keyboard::Key deviceToKey[256] = { void Win32Keyboard::init() { - Win32Input::inputMsgBuffer.enabled = true; - memset(m_btnState, 0, sizeof(m_btnState) / sizeof(m_btnState[0])); } @@ -75,49 +71,20 @@ bool Win32Keyboard::isKeyDown(Keyboard::Key key) void Win32Keyboard::update(InputModule *input) { - for(int i = 0; i < msg_buf.index; i++) { - - MSG msg = msg_buf.messages[i]; - - if (msg.message == WM_KILLFOCUS) { - - for(int i = 0; i < Keyboard::Key::NUM_KEYS; i++) { - - if (m_btnState[i]) { - InputEvent event(InputEvent::Key); - event.key.code = (Keyboard::Key) i; - event.key.pressed = msg.message == WM_KEYDOWN; - - m_btnState[i] = false; - input->postInputEvent(event); - } - } - - continue; - } - - if (msg.message != WM_KEYDOWN && msg.message != WM_KEYUP) { - continue; - } - - Keyboard::Key key = deviceToKey[msg.wParam % 0xFF]; - - if (key != Keyboard::Key::Unknown) { - InputEvent event(InputEvent::Key); - event.key.code = key; - event.key.pressed = msg.message == WM_KEYDOWN; - - m_btnState[key] = event.key.pressed; - input->postInputEvent(event); - } - } - - msg_buf.index = 0; } -bool Win32Keyboard::handleMessage(MSG message) +bool Win32Keyboard::handleMessage(MSG msg, Event& event) { - return msg_buf.postMessage(message); + Keyboard::Key key = deviceToKey[msg.wParam % 0xFF]; + + if (key != Keyboard::Key::Unknown) { + event.type = Event::Key; + event.key.code = key; + event.key.pressed = msg.message == WM_KEYDOWN; + return true; + } + + return false; } } // namespace sp diff --git a/source/Platform/Win32/Win32Keyboard.h b/source/Platform/Win32/Win32Keyboard.h index 1280532..8da6718 100644 --- a/source/Platform/Win32/Win32Keyboard.h +++ b/source/Platform/Win32/Win32Keyboard.h @@ -3,6 +3,7 @@ #define PLATFORM_WIN32_KEYBOARD_H #include +#include #include namespace sp { @@ -14,7 +15,8 @@ public : bool isKeyDown(Keyboard::Key key); - static bool handleMessage(MSG message); + // Translate a Win32 Event to sp::Event, Called from Win32EventQueue + static bool handleMessage(MSG message, Event& event); protected : From 2e9701a15bb1b297c6febbd405a53867c5580ba9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Feb 2020 11:28:32 +0100 Subject: [PATCH 048/361] Platform/Win32/Win32Keyboard: implement isKeyDown() using GetAsyncKeyState() and remove m_bufState and m_focus. --- source/Platform/Win32/Win32Keyboard.cpp | 98 ++++++++++++++++++++++++- source/Platform/Win32/Win32Keyboard.h | 6 -- 2 files changed, 96 insertions(+), 8 deletions(-) diff --git a/source/Platform/Win32/Win32Keyboard.cpp b/source/Platform/Win32/Win32Keyboard.cpp index 13fd328..64d1304 100644 --- a/source/Platform/Win32/Win32Keyboard.cpp +++ b/source/Platform/Win32/Win32Keyboard.cpp @@ -8,6 +8,101 @@ namespace sp { +static const BYTE keyToWin32[Keyboard::Key::NUM_KEYS] = { + 0x0, // Unknown + + 0x41, // A + 0x42, // B + 0x43, // C + 0x42, // D + 0x43, // E + 0x44, // F + 0x45, // G + 0x46, // H + 0x47, // I + 0x48, // J + 0x49, // K + 0x50, // L + 0x51, // M + 0x52, // N + 0x53, // O + 0x54, // P + 0x55, // Q + 0x56, // R + 0x57, // S + 0x58, // T + 0x59, // U + 0x60, // V + 0x61, // W + 0x62, // X + 0x63, // Y + 0x64, // Z + + 0x30, // One + 0x31, // Two + 0x32, // Three + 0x33, // Four + 0x34, // Five + 0x35, // Six + 0x36, // Seven + 0x37, // Eight + 0x38, // Nine + 0x39, // Zero + + VK_OEM_PERIOD, // Period + VK_OEM_COMMA, // Comma + VK_RETURN, // Enter + VK_BACK, // Backspace + VK_ESCAPE, // Escape + VK_SPACE, // Space + VK_CAPITAL, // Capslock + + VK_UP, // Up + VK_DOWN, // Down + VK_LEFT, // Left + VK_RIGHT, // Right + + VK_NUMPAD1, // NUMPAD_1 + VK_NUMPAD2, // NUMPAD_2 + VK_NUMPAD3, // NUMPAD_3 + VK_NUMPAD4, // NUMPAD_4 + VK_NUMPAD5, // NUMPAD_5 + VK_NUMPAD6, // NUMPAD_6 + VK_NUMPAD7, // NUMPAD_7 + VK_NUMPAD8, // NUMPAD_8 + VK_NUMPAD9, // NUMPAD_9 + VK_NUMPAD0, // NUMPAD_0 + 0x0, // NUMPAD_Enter + + VK_HOME, // Home + VK_END, // End + VK_INSERT, // Insert + VK_DELETE, // Delete + VK_PRIOR, // PageUp + VK_NEXT, // PageDown + VK_PAUSE, // Pause + + VK_F1, // F1 + VK_F2, // F2 + VK_F3, // F3 + VK_F4, // F4 + VK_F5, // F5 + VK_F6, // F6 + VK_F7, // F7 + VK_F8, // F8 + VK_F9, // F9 + VK_F10, // F10 + VK_F11, // F11 + VK_F12, // F12 + + VK_TAB, // Tab + VK_LSHIFT, // LShift + VK_RSHIFT, // RShift + VK_LCONTROL, // LCtrl + VK_RCONTROL, // RCtrl + VK_MENU, // LAlt + 0x0 // RAlt +}; static const Keyboard::Key deviceToKey[256] = { /* 0 1 2 3 4 5 6 7 */ @@ -61,12 +156,11 @@ static const Keyboard::Key deviceToKey[256] = { void Win32Keyboard::init() { - memset(m_btnState, 0, sizeof(m_btnState) / sizeof(m_btnState[0])); } bool Win32Keyboard::isKeyDown(Keyboard::Key key) { - return m_btnState[key]; + return ::GetAsyncKeyState(keyToWin32[key]) & 0x8000; } void Win32Keyboard::update(InputModule *input) diff --git a/source/Platform/Win32/Win32Keyboard.h b/source/Platform/Win32/Win32Keyboard.h index 8da6718..f7017ed 100644 --- a/source/Platform/Win32/Win32Keyboard.h +++ b/source/Platform/Win32/Win32Keyboard.h @@ -21,12 +21,6 @@ public : protected : void update(InputModule *input); - -protected : - - bool m_btnState[Keyboard::Key::NUM_KEYS]; - - bool m_hasFocus; }; } // namespace sp From 3c209ba01b48aa3bdf8743e64a2566b418a173fa Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Feb 2020 15:38:27 +0100 Subject: [PATCH 049/361] Platform/Win32/Win32Mouse: skip Win32MsgBuffer and handle event directly in handleMessage() --- source/Platform/Win32/Win32EventQueue.cpp | 6 +- source/Platform/Win32/Win32Mouse.cpp | 127 ++++++++++------------ source/Platform/Win32/Win32Mouse.h | 3 +- 3 files changed, 63 insertions(+), 73 deletions(-) diff --git a/source/Platform/Win32/Win32EventQueue.cpp b/source/Platform/Win32/Win32EventQueue.cpp index bf7a77e..38ab96d 100644 --- a/source/Platform/Win32/Win32EventQueue.cpp +++ b/source/Platform/Win32/Win32EventQueue.cpp @@ -39,7 +39,7 @@ LRESULT Win32EventQueue::processMessage(MSG msg, Event& event) case WM_MOUSEMOVE : case WM_MOUSELEAVE : - if (Win32Mouse::handleMessage(msg)) { + if (Win32Mouse::handleMessage(msg, event)) { // Mouse did handle the message. return 0; } @@ -51,7 +51,7 @@ LRESULT Win32EventQueue::processMessage(MSG msg, Event& event) SetCapture(msg.hwnd); - if (Win32Mouse::handleMessage(msg)) { + if (Win32Mouse::handleMessage(msg, event)) { // Mouse did handle the message. return 0; } @@ -63,7 +63,7 @@ LRESULT Win32EventQueue::processMessage(MSG msg, Event& event) ReleaseCapture(); - if (Win32Mouse::handleMessage(msg)) { + if (Win32Mouse::handleMessage(msg, event)) { // Mouse did handle the message. return 0; } diff --git a/source/Platform/Win32/Win32Mouse.cpp b/source/Platform/Win32/Win32Mouse.cpp index d1aba97..da586ae 100644 --- a/source/Platform/Win32/Win32Mouse.cpp +++ b/source/Platform/Win32/Win32Mouse.cpp @@ -2,14 +2,11 @@ #include #include #include -#include "Win32MsgBuffer.h" #include "Win32Input.h" #include "Win32Mouse.h" namespace sp { -static Win32MsgBuffer msg_buf; - static Vector2f _normalizePos(int x, int y, RECT area) { Vector2f out; @@ -45,75 +42,67 @@ bool Win32Mouse::isButtonDown(Mouse::Button button) const void Win32Mouse::update(InputModule *input) { - // TODO: Clean this. - for(int i = 0; i < msg_buf.index; i++) { - - MSG msg = msg_buf.messages[i]; - - if (msg.message == WM_LBUTTONDOWN || msg.message == WM_LBUTTONUP) { - InputEvent event(InputEvent::MouseButton); - - event.mouseButton.button = Mouse::Button::Left; - event.mouseButton.pressed = msg.message == WM_LBUTTONDOWN; - - m_state[Mouse::Button::Left] = event.mouseButton.pressed; - input->postInputEvent(event); - } else if (msg.message == WM_RBUTTONDOWN || msg.message == WM_RBUTTONUP) { - InputEvent event(InputEvent::MouseButton); - - event.mouseButton.button = Mouse::Button::Right; - event.mouseButton.pressed = msg.message == WM_RBUTTONDOWN; - - m_state[Mouse::Button::Right] = event.mouseButton.pressed; - input->postInputEvent(event); - } else if (msg.message == WM_MBUTTONDOWN || msg.message == WM_MBUTTONUP) { - InputEvent event(InputEvent::MouseButton); - - event.mouseButton.button = Mouse::Button::Middle; - event.mouseButton.pressed = msg.message == WM_MBUTTONDOWN; - - m_state[Mouse::Button::Middle] = event.mouseButton.pressed; - input->postInputEvent(event); - - } else if (msg.message == WM_XBUTTONDOWN || msg.message == WM_XBUTTONUP) { - - int btn = GET_XBUTTON_WPARAM(msg.wParam); - InputEvent event(InputEvent::MouseButton); - - event.mouseButton.button = btn == XBUTTON1 ? Mouse::Button::Button1 : Mouse::Button::Button2; - event.mouseButton.pressed = msg.message == WM_XBUTTONDOWN; - - m_state[Mouse::Button::Button1] = event.mouseButton.pressed; - input->postInputEvent(event); - - } else if (msg.message == WM_MOUSEMOVE) { - - InputEvent event(InputEvent::MousePosition); - RECT area = GetClientArea(msg.hwnd); - - int x = LOWORD(msg.lParam); - int y = HIWORD(msg.lParam); - - // Do not forward the message if mouse is outside client area. - if ((x < area.left) || (x > area.right) || (y < area.top) || (y > area.bottom)) { - continue; - } - - event.mouse.x = x; - event.mouse.y = y; - - input->postInputEvent(event); - - m_position = _normalizePos(x, y, area); - } - } - - msg_buf.index = 0; } -bool Win32Mouse::handleMessage(MSG message) +bool Win32Mouse::handleMessage(MSG msg, Event& event) { - return msg_buf.postMessage(message); + switch(msg.message) { + case WM_LBUTTONUP : + case WM_LBUTTONDOWN : + case WM_RBUTTONUP : + case WM_RBUTTONDOWN : + case WM_MBUTTONUP : + case WM_MBUTTONDOWN : + case WM_XBUTTONUP : + case WM_XBUTTONDOWN : + event.type = Event::MouseButton; + break; + } + + switch(msg.message) { + case WM_LBUTTONUP : + case WM_LBUTTONDOWN : + event.mouseButton.button = Mouse::Button::Left; + event.mouseButton.pressed = msg.message == WM_LBUTTONDOWN; + return true; + + case WM_RBUTTONUP : + case WM_RBUTTONDOWN : + event.mouseButton.button = Mouse::Button::Right; + event.mouseButton.pressed = msg.message == WM_RBUTTONDOWN; + return true; + + case WM_MBUTTONUP : + case WM_MBUTTONDOWN : + event.mouseButton.button = Mouse::Button::Right; + event.mouseButton.pressed = msg.message == WM_MBUTTONDOWN; + return true; + + case WM_XBUTTONUP : + case WM_XBUTTONDOWN : + event.mouseButton.button = GET_XBUTTON_WPARAM(msg.wParam) == XBUTTON1 + ? Mouse::Button::Button1 : Mouse::Button::Button2; + event.mouseButton.pressed = msg.message == WM_XBUTTONDOWN; + return true; + + case WM_MOUSEMOVE : + RECT area = GetClientArea(msg.hwnd); + int x = LOWORD(msg.lParam); + int y = HIWORD(msg.lParam); + + // Do not forward the message if mouse is outside client area. + if ( (x < area.left) || (x > area.right) + || (y < area.top) || (y > area.bottom) ) { + return false; + } + + event.type = Event::MouseMove; + event.mouseMove.x = x; + event.mouseMove.y = y; + return true; + } + + return false; } } // namespace sp diff --git a/source/Platform/Win32/Win32Mouse.h b/source/Platform/Win32/Win32Mouse.h index dfccf59..33994c4 100644 --- a/source/Platform/Win32/Win32Mouse.h +++ b/source/Platform/Win32/Win32Mouse.h @@ -3,6 +3,7 @@ #define PLATFORM_WIN32_MOUSE_H #include +#include #include namespace sp { @@ -19,7 +20,7 @@ public : virtual bool isButtonDown(Mouse::Button button) const; - static bool handleMessage(MSG message); + static bool handleMessage(MSG msg, Event& event); protected : From cdaed77bf7222e2fa018662c59d643da0c0f02b5 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Feb 2020 15:47:55 +0100 Subject: [PATCH 050/361] Input: remove InputEvent and InputListener and related code. Those are handled in System/Event --- engine.build.lua | 2 - include/Spectre/Game.h | 1 - include/Spectre/Input/InputEvent.h | 54 --------------------------- include/Spectre/Input/InputListener.h | 17 --------- include/Spectre/Input/InputModule.h | 14 ------- source/Input/InputEvent.cpp | 23 ------------ source/Input/InputListener.cpp | 10 ----- source/Input/InputModule.cpp | 40 -------------------- 8 files changed, 161 deletions(-) delete mode 100644 include/Spectre/Input/InputEvent.h delete mode 100644 include/Spectre/Input/InputListener.h delete mode 100644 source/Input/InputEvent.cpp delete mode 100644 source/Input/InputListener.cpp diff --git a/engine.build.lua b/engine.build.lua index 85adcc3..c4a7b84 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -56,8 +56,6 @@ local platform_spec_module = Module("source/Platform/Win32", { local input_module = Module("source/Input", { "InputDevice.cpp", - "InputEvent.cpp", - "InputListener.cpp", "InputModule.cpp", "Keyboard.cpp", "Mouse.cpp" diff --git a/include/Spectre/Game.h b/include/Spectre/Game.h index 4036bf6..9279c69 100644 --- a/include/Spectre/Game.h +++ b/include/Spectre/Game.h @@ -3,7 +3,6 @@ #define SPECTRE_GAME_H #include -#include #include class InputModule; diff --git a/include/Spectre/Input/InputEvent.h b/include/Spectre/Input/InputEvent.h deleted file mode 100644 index 947e38c..0000000 --- a/include/Spectre/Input/InputEvent.h +++ /dev/null @@ -1,54 +0,0 @@ - -#ifndef SPECTRE_INPUT_EVENT_H -#define SPECTRE_INPUT_EVENT_H - -#include -#include -#include -#include - -namespace sp { - -typedef struct InputEvent -{ - enum Type - { - None, - Key, - MouseButton, - MousePosition - }; - - struct KeyEvent { - Keyboard::Key code; - bool pressed; /* true if pressed, false if released. */ - - std::string getKeyName() const; /* Get the key name */ - }; - - struct MouseButtonEvent { - Mouse::Button button; - bool pressed; /* true if pressed, false if released. */ - - std::string getName() const; - }; - - struct MouseEvent { - unsigned int x; - unsigned int y; - }; - - Type type; - union { - struct KeyEvent key; - struct MouseEvent mouse; - struct MouseButtonEvent mouseButton; - }; - - InputEvent(Type type = None); - -} InputEvent; - -} // namespace sp - -#endif /* SPECTRE_INPUT_EVENT_H */ diff --git a/include/Spectre/Input/InputListener.h b/include/Spectre/Input/InputListener.h deleted file mode 100644 index c15a7ae..0000000 --- a/include/Spectre/Input/InputListener.h +++ /dev/null @@ -1,17 +0,0 @@ - -#ifndef SPECTRE_INPUT_LISTENER_H -#define SPECTRE_INPUT_LISTENER_H - -#include "InputEvent.h" - -namespace sp { - -class InputListener -{ -public : - virtual void onInputEvent(const InputEvent& event); -}; - -} // namespace sp - -#endif /* SPECTRE_INPUT_LISTENER_H */ diff --git a/include/Spectre/Input/InputModule.h b/include/Spectre/Input/InputModule.h index c3eb2e7..e30a93d 100644 --- a/include/Spectre/Input/InputModule.h +++ b/include/Spectre/Input/InputModule.h @@ -5,9 +5,6 @@ #include #include -#include "InputListener.h" -#include "InputEvent.h" - namespace sp { class Mouse; @@ -28,12 +25,6 @@ public : void addInputDevice(InputDevice *device); - void registerListener(InputListener* listener); - - void removeListener(InputListener* listener); - - void postInputEvent(const InputEvent& event); - // NOTE: Update devices here! (for winapi, process keyboard/mouse messages) void update(); @@ -48,11 +39,6 @@ protected : Keyboard *m_keyboard; - // Buffered input queue. - std::deque m_buffer; - - std::vector m_listeners; - PlatformInput *m_platform; }; diff --git a/source/Input/InputEvent.cpp b/source/Input/InputEvent.cpp deleted file mode 100644 index 4bc80c4..0000000 --- a/source/Input/InputEvent.cpp +++ /dev/null @@ -1,23 +0,0 @@ - -#include -#include -#include - -namespace sp { - -InputEvent::InputEvent(Type type) : -type (type) -{ -} - -std::string InputEvent::KeyEvent::getKeyName() const -{ - return Keyboard::getKeyName(code); -} - -std::string InputEvent::MouseButtonEvent::getName() const -{ - return Mouse::getButtonName(button); -} - -} // namespace sp diff --git a/source/Input/InputListener.cpp b/source/Input/InputListener.cpp deleted file mode 100644 index 2310737..0000000 --- a/source/Input/InputListener.cpp +++ /dev/null @@ -1,10 +0,0 @@ - -#include - -namespace sp { - -void InputListener::onInputEvent(const InputEvent& event) -{ -} - -} // namespace sp diff --git a/source/Input/InputModule.cpp b/source/Input/InputModule.cpp index 076d1c0..cde426d 100644 --- a/source/Input/InputModule.cpp +++ b/source/Input/InputModule.cpp @@ -2,7 +2,6 @@ #include #include #include -#include #include #include @@ -35,16 +34,6 @@ void InputModule::addInputDevice(InputDevice *device) m_devices.push_back(device); } -void InputModule::registerListener(InputListener* listener) -{ - m_listeners.push_back(listener); -} - -void InputModule::removeListener(InputListener* listener) -{ - -} - Mouse* InputModule::getMouse() { return m_mouse; @@ -55,13 +44,6 @@ Keyboard* InputModule::getKeyboard() return m_keyboard; } -void InputModule::postInputEvent(const InputEvent& event) -{ - if (m_buffer.size() < 128) { - m_buffer.push_back(event); - } -} - void InputModule::update() { InputDeviceVec::iterator it; @@ -70,28 +52,6 @@ void InputModule::update() for(it = m_devices.begin(); it != m_devices.end(); it++) { (*it)->update(this); } - - // Dispatch all events to listeners. - dispatch(); -} - -void InputModule::dispatch() -{ - std::deque::iterator it; - - for(it = m_buffer.begin(); it != m_buffer.end(); it++) { - - const InputEvent& event = *it; - - // Call listeners. - std::vector::iterator it; - for(it = m_listeners.begin(); it != m_listeners.end(); it++) { - - (*it)->onInputEvent(event); - } - } - - m_buffer.clear(); } } // namespace sp From c7c1ff68fdb671a2313a8e4338d3b46ec422a21b Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Feb 2020 16:43:10 +0100 Subject: [PATCH 051/361] Platform/Win32: remove Win32MsgBuffer --- engine.build.lua | 1 - source/Platform/Win32/Win32MsgBuffer.cpp | 22 ---------------------- source/Platform/Win32/Win32MsgBuffer.h | 22 ---------------------- 3 files changed, 45 deletions(-) delete mode 100644 source/Platform/Win32/Win32MsgBuffer.cpp delete mode 100644 source/Platform/Win32/Win32MsgBuffer.h diff --git a/engine.build.lua b/engine.build.lua index c4a7b84..37958dc 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -48,7 +48,6 @@ local platform_spec_module = Module("source/Platform/Win32", { "Win32Misc.cpp", "Win32Mouse.cpp", "Win32EventQueue.cpp", - "Win32MsgBuffer.cpp", "Win32System.cpp", "glad_wgl.c" }) diff --git a/source/Platform/Win32/Win32MsgBuffer.cpp b/source/Platform/Win32/Win32MsgBuffer.cpp deleted file mode 100644 index a1d6693..0000000 --- a/source/Platform/Win32/Win32MsgBuffer.cpp +++ /dev/null @@ -1,22 +0,0 @@ - -#include -#include "Win32MsgBuffer.h" - -namespace sp { - -Win32MsgBuffer::Win32MsgBuffer() : -index (0) -{ -} - -bool Win32MsgBuffer::postMessage(MSG msg) -{ - if (index < WIN32_MSG_BUFFER_MAX_SIZE) { - messages[index++] = msg; - return true; - } - Log::warn("Win32MsgBuffer: Queue overflow\n"); - return false; -} - -} // namespace sp diff --git a/source/Platform/Win32/Win32MsgBuffer.h b/source/Platform/Win32/Win32MsgBuffer.h deleted file mode 100644 index e7bf87b..0000000 --- a/source/Platform/Win32/Win32MsgBuffer.h +++ /dev/null @@ -1,22 +0,0 @@ - -#ifndef PLATFORM_WIN32_MSG_BUFFER_H -#define PLATFORM_WIN32_MSG_BUFFER_H - -#include - -namespace sp { - -#define WIN32_MSG_BUFFER_MAX_SIZE 64 - -struct Win32MsgBuffer { - int index; - MSG messages[WIN32_MSG_BUFFER_MAX_SIZE]; - - Win32MsgBuffer(); - - bool postMessage(MSG msg); -}; - -} // namespace sp - -#endif /* PLATFORM_WIN32_MSG_BUFFER_H */ From 290c6643f531a30dd1218aae1f550ea822bc2d4b Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Feb 2020 22:28:21 +0100 Subject: [PATCH 052/361] Platform/Win32/Win32Mouse: implement isButtonDown() using GetAsyncKeyState() and remove m_state and m_tracked. --- source/Platform/Win32/Win32Mouse.cpp | 15 ++++++++++++--- source/Platform/Win32/Win32Mouse.h | 4 ---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/source/Platform/Win32/Win32Mouse.cpp b/source/Platform/Win32/Win32Mouse.cpp index da586ae..74b2d83 100644 --- a/source/Platform/Win32/Win32Mouse.cpp +++ b/source/Platform/Win32/Win32Mouse.cpp @@ -26,8 +26,6 @@ static RECT GetClientArea(HWND hwnd) { void Win32Mouse::init() { - memset(m_state, 0, Mouse::Button::NUM_MBUTTONS); - m_tracked = false; } Vector2f Win32Mouse::getPosition() const @@ -37,7 +35,18 @@ Vector2f Win32Mouse::getPosition() const bool Win32Mouse::isButtonDown(Mouse::Button button) const { - return m_state[button]; + int btn; + + switch(button) { + case Mouse::Left : btn = VK_LBUTTON; break; + case Mouse::Right : btn = VK_RBUTTON; break; + case Mouse::Middle : btn = VK_MBUTTON; break; + case Mouse::Button1 : btn = VK_XBUTTON1; break; + case Mouse::Button2 : btn = VK_XBUTTON2; break; + default: btn = 0; + } + + return ::GetAsyncKeyState(btn) & 0x8000; } void Win32Mouse::update(InputModule *input) diff --git a/source/Platform/Win32/Win32Mouse.h b/source/Platform/Win32/Win32Mouse.h index 33994c4..730e01c 100644 --- a/source/Platform/Win32/Win32Mouse.h +++ b/source/Platform/Win32/Win32Mouse.h @@ -28,10 +28,6 @@ protected : protected : Vector2f m_position; - - bool m_state[Mouse::Button::NUM_MBUTTONS]; - - bool m_tracked; }; } // namespace sp From fa0fc72eb08a8ec3fa4930b84be6165aee51e9b8 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Feb 2020 22:30:10 +0100 Subject: [PATCH 053/361] Platform/Win32/Win32Mouse: add getAbsPosition() and update the position variables in update() --- source/Platform/Win32/Win32Mouse.cpp | 19 +++++++++++++++++++ source/Platform/Win32/Win32Mouse.h | 6 ++++++ 2 files changed, 25 insertions(+) diff --git a/source/Platform/Win32/Win32Mouse.cpp b/source/Platform/Win32/Win32Mouse.cpp index 74b2d83..4fa338d 100644 --- a/source/Platform/Win32/Win32Mouse.cpp +++ b/source/Platform/Win32/Win32Mouse.cpp @@ -33,6 +33,11 @@ Vector2f Win32Mouse::getPosition() const return m_position; } +Vector2f Win32Mouse::getAbsPosition() const +{ + return m_abs_position; +} + bool Win32Mouse::isButtonDown(Mouse::Button button) const { int btn; @@ -51,6 +56,20 @@ bool Win32Mouse::isButtonDown(Mouse::Button button) const void Win32Mouse::update(InputModule *input) { + HWND handle; + POINT p; + + // Update absolute position + GetCursorPos(&p); + m_abs_position = Vector2f(p.x, p.y); + + // Update relative position + handle = ::GetCapture(); + if (handle) { + // Translate position to focued window. + ScreenToClient(handle, &p); + m_position = Vector2f(p.x, p.y); + } } bool Win32Mouse::handleMessage(MSG msg, Event& event) diff --git a/source/Platform/Win32/Win32Mouse.h b/source/Platform/Win32/Win32Mouse.h index 730e01c..b304aa7 100644 --- a/source/Platform/Win32/Win32Mouse.h +++ b/source/Platform/Win32/Win32Mouse.h @@ -18,6 +18,8 @@ public : // Get mouse position virtual Vector2f getPosition() const; + virtual Vector2f getAbsPosition() const; + virtual bool isButtonDown(Mouse::Button button) const; static bool handleMessage(MSG msg, Event& event); @@ -27,7 +29,11 @@ protected : virtual void update(InputModule *input); protected : + // position in relative (focused window) coordinates. Vector2f m_position; + + // position in absolute (screen) coordinates. + Vector2f m_abs_position; }; } // namespace sp From e0d95a1135a20ba999298cc22fd3de8f5a9a9b7c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Feb 2020 22:40:14 +0100 Subject: [PATCH 054/361] include/Spectre/Input/Mouse.h: add getPositionAbs() to the interface. --- include/Spectre/Input/Mouse.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/include/Spectre/Input/Mouse.h b/include/Spectre/Input/Mouse.h index a560426..8d62feb 100644 --- a/include/Spectre/Input/Mouse.h +++ b/include/Spectre/Input/Mouse.h @@ -24,10 +24,13 @@ public : public : virtual ~Mouse(); - // Get mouse position + // Get the position in relative (focused window) coordinates. + // coordinates are relative to the window's top-left corner. virtual Vector2f getPosition() const = 0; - //virtual Vector2i getPositionAbs() const = 0; + // Get the position in absolute (screen) coordinates. + // 0,0 is located at the screen's top-left corner. + virtual Vector2f getAbsPosition() const = 0; virtual bool isButtonDown(Button button) const = 0; From 7c6cf45d3ca015be74ef021ed6978dd74f527223 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Feb 2020 00:34:13 +0100 Subject: [PATCH 055/361] include/Spectre/Input/Keyboard.h: Fix CamelCase for some enum values. --- include/Spectre/Input/Keyboard.h | 22 ++++++++++----------- source/Input/Keyboard.cpp | 22 ++++++++++----------- source/Platform/Win32/Win32Keyboard.cpp | 26 ++++++++++++------------- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/include/Spectre/Input/Keyboard.h b/include/Spectre/Input/Keyboard.h index 1d9f998..b6ce394 100644 --- a/include/Spectre/Input/Keyboard.h +++ b/include/Spectre/Input/Keyboard.h @@ -59,17 +59,17 @@ public : Down, Left, Right, - NUMPAD_1, - NUMPAD_2, - NUMPAD_3, - NUMPAD_4, - NUMPAD_5, - NUMPAD_6, - NUMPAD_7, - NUMPAD_8, - NUMPAD_9, - NUMPAD_0, - NUMPAD_Enter, + Numpad1, + Numpad2, + Numpad3, + Numpad4, + Numpad5, + Numpad6, + Numpad7, + Numpad8, + Numpad9, + Numpad0, + NumpadEnter, Home, End, Insert, diff --git a/source/Input/Keyboard.cpp b/source/Input/Keyboard.cpp index de07b14..0b200fb 100644 --- a/source/Input/Keyboard.cpp +++ b/source/Input/Keyboard.cpp @@ -62,17 +62,17 @@ struct keyentry table[] = { MapSym(Keyboard::Key::Right, "Right"), // Numpad - MapSym(Keyboard::Key::NUMPAD_1, "Numpad 1"), - MapSym(Keyboard::Key::NUMPAD_2, "Numpad 2"), - MapSym(Keyboard::Key::NUMPAD_3, "Numpad 3"), - MapSym(Keyboard::Key::NUMPAD_4, "Numpad 4"), - MapSym(Keyboard::Key::NUMPAD_5, "Numpad 5"), - MapSym(Keyboard::Key::NUMPAD_6, "Numpad 6"), - MapSym(Keyboard::Key::NUMPAD_7, "Numpad 7"), - MapSym(Keyboard::Key::NUMPAD_8, "Numpad 8"), - MapSym(Keyboard::Key::NUMPAD_9, "Numpad 9"), - MapSym(Keyboard::Key::NUMPAD_0, "Numpad 0"), - MapSym(Keyboard::Key::NUMPAD_Enter, "Numpad Enter"), + MapSym(Keyboard::Key::Numpad1, "Numpad 1"), + MapSym(Keyboard::Key::Numpad2, "Numpad 2"), + MapSym(Keyboard::Key::Numpad3, "Numpad 3"), + MapSym(Keyboard::Key::Numpad4, "Numpad 4"), + MapSym(Keyboard::Key::Numpad5, "Numpad 5"), + MapSym(Keyboard::Key::Numpad6, "Numpad 6"), + MapSym(Keyboard::Key::Numpad7, "Numpad 7"), + MapSym(Keyboard::Key::Numpad8, "Numpad 8"), + MapSym(Keyboard::Key::Numpad9, "Numpad 9"), + MapSym(Keyboard::Key::Numpad0, "Numpad 0"), + MapSym(Keyboard::Key::NumpadEnter, "Numpad Enter"), MapSym(Keyboard::Key::Home, "Home"), MapSym(Keyboard::Key::End, "End"), diff --git a/source/Platform/Win32/Win32Keyboard.cpp b/source/Platform/Win32/Win32Keyboard.cpp index 64d1304..ec53e9c 100644 --- a/source/Platform/Win32/Win32Keyboard.cpp +++ b/source/Platform/Win32/Win32Keyboard.cpp @@ -62,17 +62,17 @@ static const BYTE keyToWin32[Keyboard::Key::NUM_KEYS] = { VK_LEFT, // Left VK_RIGHT, // Right - VK_NUMPAD1, // NUMPAD_1 - VK_NUMPAD2, // NUMPAD_2 - VK_NUMPAD3, // NUMPAD_3 - VK_NUMPAD4, // NUMPAD_4 - VK_NUMPAD5, // NUMPAD_5 - VK_NUMPAD6, // NUMPAD_6 - VK_NUMPAD7, // NUMPAD_7 - VK_NUMPAD8, // NUMPAD_8 - VK_NUMPAD9, // NUMPAD_9 - VK_NUMPAD0, // NUMPAD_0 - 0x0, // NUMPAD_Enter + VK_NUMPAD1, // Numpad1 + VK_NUMPAD2, // Numpad2 + VK_NUMPAD3, // Numpad3 + VK_NUMPAD4, // Numpad4 + VK_NUMPAD5, // Numpad5 + VK_NUMPAD6, // Numpad6 + VK_NUMPAD7, // Numpad7 + VK_NUMPAD8, // Numpad8 + VK_NUMPAD9, // Numpad9 + VK_NUMPAD0, // Numpad0 + 0x0, // NumpadEnter VK_HOME, // Home VK_END, // End @@ -126,8 +126,8 @@ static const Keyboard::Key deviceToKey[256] = { Keyboard::Key::P, Keyboard::Key::Q, Keyboard::Key::R, Keyboard::Key::S, Keyboard::Key::T, Keyboard::Key::U, Keyboard::Key::V, Keyboard::Key::W, Keyboard::Key::X, Keyboard::Key::Y, Keyboard::Key::Z, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 60-6F - Keyboard::Key::NUMPAD_0, Keyboard::Key::NUMPAD_1, Keyboard::Key::NUMPAD_2, Keyboard::Key::NUMPAD_3, Keyboard::Key::NUMPAD_4, Keyboard::Key::NUMPAD_5, Keyboard::Key::NUMPAD_6, Keyboard::Key::NUMPAD_7, - Keyboard::Key::NUMPAD_8, Keyboard::Key::NUMPAD_9, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Numpad0, Keyboard::Key::Numpad1, Keyboard::Key::Numpad2, Keyboard::Key::Numpad3, Keyboard::Key::Numpad4, Keyboard::Key::Numpad5, Keyboard::Key::Numpad6, Keyboard::Key::Numpad7, + Keyboard::Key::Numpad8, Keyboard::Key::Numpad9, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 70-7F Keyboard::Key::F1, Keyboard::Key::F2, Keyboard::Key::F3, Keyboard::Key::F4, Keyboard::Key::F5, Keyboard::Key::F6, Keyboard::Key::F7, Keyboard::Key::F8, Keyboard::Key::F9, Keyboard::Key::F10, Keyboard::Key::F11, Keyboard::Key::F12, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, From 3364b921de4b097490eeb9c0156c7ce3eef3f7e8 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Feb 2020 00:38:30 +0100 Subject: [PATCH 056/361] include/Spectre/Input/Keyboard.h: remove NumpadEnter (this is usually the same as regular enter). --- include/Spectre/Input/Keyboard.h | 1 - source/Input/Keyboard.cpp | 1 - source/Platform/Win32/Win32Keyboard.cpp | 1 - 3 files changed, 3 deletions(-) diff --git a/include/Spectre/Input/Keyboard.h b/include/Spectre/Input/Keyboard.h index b6ce394..cfc13ba 100644 --- a/include/Spectre/Input/Keyboard.h +++ b/include/Spectre/Input/Keyboard.h @@ -69,7 +69,6 @@ public : Numpad8, Numpad9, Numpad0, - NumpadEnter, Home, End, Insert, diff --git a/source/Input/Keyboard.cpp b/source/Input/Keyboard.cpp index 0b200fb..dd47b23 100644 --- a/source/Input/Keyboard.cpp +++ b/source/Input/Keyboard.cpp @@ -72,7 +72,6 @@ struct keyentry table[] = { MapSym(Keyboard::Key::Numpad8, "Numpad 8"), MapSym(Keyboard::Key::Numpad9, "Numpad 9"), MapSym(Keyboard::Key::Numpad0, "Numpad 0"), - MapSym(Keyboard::Key::NumpadEnter, "Numpad Enter"), MapSym(Keyboard::Key::Home, "Home"), MapSym(Keyboard::Key::End, "End"), diff --git a/source/Platform/Win32/Win32Keyboard.cpp b/source/Platform/Win32/Win32Keyboard.cpp index ec53e9c..c54ef39 100644 --- a/source/Platform/Win32/Win32Keyboard.cpp +++ b/source/Platform/Win32/Win32Keyboard.cpp @@ -72,7 +72,6 @@ static const BYTE keyToWin32[Keyboard::Key::NUM_KEYS] = { VK_NUMPAD8, // Numpad8 VK_NUMPAD9, // Numpad9 VK_NUMPAD0, // Numpad0 - 0x0, // NumpadEnter VK_HOME, // Home VK_END, // End From 24fa1e140eb1451af8cae7d78cf1a1fc0cb42ab2 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Feb 2020 00:42:00 +0100 Subject: [PATCH 057/361] source/Platform/Win32/Win32Keyboard.cpp: define LAlt and RAlt keys. --- source/Platform/Win32/Win32Keyboard.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/Platform/Win32/Win32Keyboard.cpp b/source/Platform/Win32/Win32Keyboard.cpp index c54ef39..e309675 100644 --- a/source/Platform/Win32/Win32Keyboard.cpp +++ b/source/Platform/Win32/Win32Keyboard.cpp @@ -99,8 +99,8 @@ static const BYTE keyToWin32[Keyboard::Key::NUM_KEYS] = { VK_RSHIFT, // RShift VK_LCONTROL, // LCtrl VK_RCONTROL, // RCtrl - VK_MENU, // LAlt - 0x0 // RAlt + VK_LMENU, // LAlt + VK_RMENU // RAlt }; static const Keyboard::Key deviceToKey[256] = { @@ -137,7 +137,7 @@ static const Keyboard::Key deviceToKey[256] = { Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // A0-AF - Keyboard::Key::LShift, Keyboard::Key::RShift, Keyboard::Key::LCtrl, Keyboard::Key::RCtrl, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::LShift, Keyboard::Key::RShift, Keyboard::Key::LCtrl, Keyboard::Key::RCtrl, Keyboard::Key::LAlt, Keyboard::Key::RAlt, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // B0-BF Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, From e888626b03aaf252c8907e7a72784b774f44e8fa Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Feb 2020 09:56:03 +0100 Subject: [PATCH 058/361] Update icon. --- assets/app.ico | Bin 32038 -> 103459 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/app.ico b/assets/app.ico index c9bf794bb0123a3ee85fa978c12cc220ba0c7847..865d5641de2be4edb186bf60219ad25fb7665add 100644 GIT binary patch literal 103459 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 RAkuX|Kx58O{KuYw0RUUa0sQ~~ literal 32038 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 From eef2690adacd4df6f1b4b131ebc17fd4702ae3c5 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Feb 2020 18:58:06 +0100 Subject: [PATCH 059/361] source/Platform/Win32/Win32Mouse.cpp: in isButtonDown() use SM_SWAPBUTTON to determine if buttons are swapped or not. --- source/Platform/Win32/Win32Mouse.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Platform/Win32/Win32Mouse.cpp b/source/Platform/Win32/Win32Mouse.cpp index 4fa338d..3ad6a41 100644 --- a/source/Platform/Win32/Win32Mouse.cpp +++ b/source/Platform/Win32/Win32Mouse.cpp @@ -43,8 +43,8 @@ bool Win32Mouse::isButtonDown(Mouse::Button button) const int btn; switch(button) { - case Mouse::Left : btn = VK_LBUTTON; break; - case Mouse::Right : btn = VK_RBUTTON; break; + case Mouse::Left : btn = GetSystemMetrics(SM_SWAPBUTTON) ? VK_RBUTTON : VK_LBUTTON; break; + case Mouse::Right : btn = GetSystemMetrics(SM_SWAPBUTTON) ? VK_LBUTTON : VK_RBUTTON; break; case Mouse::Middle : btn = VK_MBUTTON; break; case Mouse::Button1 : btn = VK_XBUTTON1; break; case Mouse::Button2 : btn = VK_XBUTTON2; break; From c0f44016c692df733a60c7f5d7ef3210336a1f44 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 12 Feb 2020 08:52:08 +0100 Subject: [PATCH 060/361] Math/Vector2: inline toString() --- include/Spectre/Math/Vector2.h | 2 +- include/Spectre/Math/Vector2.inl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/Spectre/Math/Vector2.h b/include/Spectre/Math/Vector2.h index e259c96..a1849cf 100644 --- a/include/Spectre/Math/Vector2.h +++ b/include/Spectre/Math/Vector2.h @@ -39,7 +39,7 @@ struct Vector2 inline Vector2& reflect(const Vector2& n); - std::string toString() const; + inline std::string toString() const; }; // ------------ diff --git a/include/Spectre/Math/Vector2.inl b/include/Spectre/Math/Vector2.inl index 819695a..241a405 100644 --- a/include/Spectre/Math/Vector2.inl +++ b/include/Spectre/Math/Vector2.inl @@ -58,7 +58,7 @@ inline Vector2& Vector2::reflect(const Vector2& n) } template -std::string Vector2::toString() const +inline std::string Vector2::toString() const { return core::to_string(x) + ", " + core::to_string(y); } From 72e1bfdadee477d106c3758285b0182fe41af253 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 12 Feb 2020 08:54:03 +0100 Subject: [PATCH 061/361] Math: indent fixes. --- include/Spectre/Math/Vector2.h | 12 ++++++------ include/Spectre/Math/Vector3.h | 12 ++++++------ include/Spectre/Math/Vector4.h | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/include/Spectre/Math/Vector2.h b/include/Spectre/Math/Vector2.h index a1849cf..06fd97e 100644 --- a/include/Spectre/Math/Vector2.h +++ b/include/Spectre/Math/Vector2.h @@ -182,14 +182,14 @@ inline std::ostream& operator<<(std::ostream &s, const Vector2& v); // Common specialization types // ----------------------------- -typedef Vector2 Vector2f; -typedef Vector2 Vector2i; -typedef Vector2 Vector2u; +typedef Vector2 Vector2f; +typedef Vector2 Vector2i; +typedef Vector2 Vector2u; typedef Vector2 Vector2b; -typedef Vector2 vec2f; -typedef Vector2 vec2i; -typedef Vector2 vec2u; +typedef Vector2 vec2f; +typedef Vector2 vec2i; +typedef Vector2 vec2u; typedef Vector2 vec2b; } // namespace sp diff --git a/include/Spectre/Math/Vector3.h b/include/Spectre/Math/Vector3.h index 27e0a37..a641fbd 100644 --- a/include/Spectre/Math/Vector3.h +++ b/include/Spectre/Math/Vector3.h @@ -159,14 +159,14 @@ inline std::ostream& operator<<(std::ostream &s, const Vector3& v); // Common specialization types // ----------------------------- -typedef Vector3 Vector3f; -typedef Vector3 Vector3i; -typedef Vector3 Vector3u; +typedef Vector3 Vector3f; +typedef Vector3 Vector3i; +typedef Vector3 Vector3u; typedef Vector3 Vector3b; -typedef Vector3 vec3f; -typedef Vector3 vec3i; -typedef Vector3 vec3u; +typedef Vector3 vec3f; +typedef Vector3 vec3i; +typedef Vector3 vec3u; typedef Vector3 vec3b; } // namespace sp diff --git a/include/Spectre/Math/Vector4.h b/include/Spectre/Math/Vector4.h index 0a9ac6c..e73dcf3 100644 --- a/include/Spectre/Math/Vector4.h +++ b/include/Spectre/Math/Vector4.h @@ -145,14 +145,14 @@ inline bool operator>=(T s, const Vector4& v); template inline std::ostream& operator<<(std::ostream &s, const Vector4& v); -typedef Vector4 Vector4f; -typedef Vector4 Vector4i; -typedef Vector4 Vector4u; +typedef Vector4 Vector4f; +typedef Vector4 Vector4i; +typedef Vector4 Vector4u; typedef Vector4 Vector4b; -typedef Vector4 vec4f; -typedef Vector4 vec4i; -typedef Vector4 vec4u; +typedef Vector4 vec4f; +typedef Vector4 vec4i; +typedef Vector4 vec4u; typedef Vector4 vec4b; } // namespace sp From 11941286277c8bee703154df2bf3c1392f760301 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 12 Feb 2020 19:20:20 +0100 Subject: [PATCH 062/361] Math/Transform.cpp: indent fixes. --- source/Math/Transform.cpp | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/source/Math/Transform.cpp b/source/Math/Transform.cpp index 4d54068..ef3ace4 100644 --- a/source/Math/Transform.cpp +++ b/source/Math/Transform.cpp @@ -10,9 +10,9 @@ m_matrix (Matrix4f::Identity) } Transform::Transform( float a00, float a01, float a02, - float a10, float a11, float a12, - float a20, float a21, float a22) : -m_matrix (a00, a01, 0.0f, a02, + float a10, float a11, float a12, + float a20, float a21, float a22) : +m_matrix (a00, a01, 0.0f, a02, a10, a11, 0.0f, a12, 0.0f, 0.0f, 1.0f, 0.0f, a20, a21, 0.0f, a22) @@ -52,9 +52,10 @@ Vector2f Transform::getRightVector() const Transform& Transform::translate(float x, float y) { - Transform t( 1, 0, x, - 0, 1, y, - 0, 0, 1); + Transform t(1, 0, x, + 0, 1, y, + 0, 0, 1); + return multiply(t); } @@ -65,23 +66,24 @@ Transform& Transform::translate(Vector2f vec) Transform& Transform::rotate(float theta) { - float r = math::deg2rad(theta); - float c = std::cos(r); - float s = std::sin(r); + float a = math::deg2rad(theta); + float c = std::cos(a); + float s = std::sin(a); // Always rotate along z-axis in 2D. - Transform rot( c, -s, 0, - s, c, 0, - 0, 0, 1); + Transform r(c, -s, 0, + s, c, 0, + 0, 0, 1); - return multiply(rot); + return multiply(r); } Transform& Transform::scale(float x, float y) { - Transform s( x, 0, 0, - 0, y, 0, - 0, 0, 1); + Transform s(x, 0, 0, + 0, y, 0, + 0, 0, 1); + return multiply(s); } From 76d175ffd96b718d986fd98c82b5c39897b1cfb6 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 12 Feb 2020 19:27:41 +0100 Subject: [PATCH 063/361] Math/Transform: rename multiply() to combine() --- include/Spectre/Math/Transform.h | 2 +- source/Math/Transform.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/Spectre/Math/Transform.h b/include/Spectre/Math/Transform.h index dfed6b4..51ddf88 100644 --- a/include/Spectre/Math/Transform.h +++ b/include/Spectre/Math/Transform.h @@ -53,7 +53,7 @@ public : Transform& scale(Vector2f offset); Transform& scale(float s); - Transform& multiply(const Transform& other); + Transform& combine(const Transform& other); Vector2f transformPoint(float x, float y) const; diff --git a/source/Math/Transform.cpp b/source/Math/Transform.cpp index ef3ace4..85db5be 100644 --- a/source/Math/Transform.cpp +++ b/source/Math/Transform.cpp @@ -56,7 +56,7 @@ Transform& Transform::translate(float x, float y) 0, 1, y, 0, 0, 1); - return multiply(t); + return combine(t); } Transform& Transform::translate(Vector2f vec) @@ -75,7 +75,7 @@ Transform& Transform::rotate(float theta) s, c, 0, 0, 0, 1); - return multiply(r); + return combine(r); } Transform& Transform::scale(float x, float y) @@ -84,7 +84,7 @@ Transform& Transform::scale(float x, float y) 0, y, 0, 0, 0, 1); - return multiply(s); + return combine(s); } Transform& Transform::scale(Vector2f vec) @@ -97,7 +97,7 @@ Transform& Transform::scale(float s) return scale(s, s); } -Transform& Transform::multiply(const Transform& other) +Transform& Transform::combine(const Transform& other) { m_matrix *= other.m_matrix; return *this; @@ -152,7 +152,7 @@ Transform operator*(const Transform& a, const Transform& b) Transform& operator*=(Transform& a, const Transform& other) { - a.multiply(other); + a.combine(other); return a; } From 18ea713445b6d3bd332f320cafa6a997715a14de Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 12 Feb 2020 19:29:02 +0100 Subject: [PATCH 064/361] Math/Transform.cpp: minor fixes. --- source/Math/Transform.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/source/Math/Transform.cpp b/source/Math/Transform.cpp index 85db5be..1a14d2b 100644 --- a/source/Math/Transform.cpp +++ b/source/Math/Transform.cpp @@ -24,10 +24,10 @@ m_matrix (matrix) { } -void Transform::set(Vector2f _translate, float _rotate, Vector2f _scale) +void Transform::set(Vector2f t, float r, Vector2f s) { reset(); - translate(_translate).rotate(_rotate).scale(_scale); + translate(t).rotate(r).scale(s); } void Transform::setMatrix(const Matrix4f& matrix) @@ -150,10 +150,9 @@ Transform operator*(const Transform& a, const Transform& b) return Transform(a.getMatrix() * b.getMatrix()); } -Transform& operator*=(Transform& a, const Transform& other) +Transform& operator*=(Transform& a, const Transform& b) { - a.combine(other); - return a; + return a.combine(b); } Vector2f operator*(const Transform& transform, const Vector2f& vec) From 532c6dafaf83dcf826562bae228e058607055b1c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 12 Feb 2020 19:42:50 +0100 Subject: [PATCH 065/361] Math/Math: translate/scale functions should not accept vectors, but rather individual parameters. This is "low level" functions. Used by other math classes/functions. --- include/Spectre/Math/Math.h | 4 ++-- source/Math/Math.cpp | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/include/Spectre/Math/Math.h b/include/Spectre/Math/Math.h index c888b36..d8aebe4 100644 --- a/include/Spectre/Math/Math.h +++ b/include/Spectre/Math/Math.h @@ -36,10 +36,10 @@ namespace sp { namespace math Matrix4f rotation(float theta); // Create a 2D translation matrix. - Matrix4f translate(const Vector2f& v); + Matrix4f translate(float x, float y); // Create a 2D scale matrix. - Matrix4f scale(const Vector2f& f); + Matrix4f scale(float x, float y); // Get translation part of a matrix. Vector3f getTranslate(const Matrix4f matrix); diff --git a/source/Math/Math.cpp b/source/Math/Math.cpp index 2cfdf76..120b7bc 100644 --- a/source/Math/Math.cpp +++ b/source/Math/Math.cpp @@ -60,21 +60,21 @@ namespace sp { namespace math 0.0f, 0.0f, 0.0f, 1.0f); } - Matrix4f translate(const Vector2f& v) { + + Matrix4f translate(float x, float y) { return Matrix4f( - 1.0f, 0.0f, 0.0f, v.x, - 0.0f, 1.0f, 0.0f, v.y, + 1.0f, 0.0f, 0.0f, x, + 0.0f, 1.0f, 0.0f, y, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); - } - Matrix4f scale(const Vector2f& f) { + Matrix4f scale(float x, float y) { return Matrix4f( - f.x , 0.0f, 0.0f, 0.0f, - 0.0f, f.y , 0.0f, 0.0f, + x , 0.0f, 0.0f, 0.0f, + 0.0f, y , 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f); } From a6e6b915e63162347b7a8848d27d47d72a6017a3 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 12 Feb 2020 19:54:52 +0100 Subject: [PATCH 066/361] Math/Math: Remove getTranslate(), getUpVector() and getForwardVector() as they are not used. --- include/Spectre/Math/Math.h | 7 ------- source/Math/Math.cpp | 16 ---------------- 2 files changed, 23 deletions(-) diff --git a/include/Spectre/Math/Math.h b/include/Spectre/Math/Math.h index d8aebe4..34f725c 100644 --- a/include/Spectre/Math/Math.h +++ b/include/Spectre/Math/Math.h @@ -41,13 +41,6 @@ namespace sp { namespace math // Create a 2D scale matrix. Matrix4f scale(float x, float y); - // Get translation part of a matrix. - Vector3f getTranslate(const Matrix4f matrix); - - Vector3f getUpVector(const Matrix4f matrix); - - Vector3f getForwardVector(const Matrix4f matrix); - } } // namespace sp #endif /* SPECTRE_MATH_MATH_H */ diff --git a/source/Math/Math.cpp b/source/Math/Math.cpp index 120b7bc..2be138a 100644 --- a/source/Math/Math.cpp +++ b/source/Math/Math.cpp @@ -79,20 +79,4 @@ namespace sp { namespace math 0.0f, 0.0f, 0.0f, 1.0f); } - Vector3f getTranslate(const Matrix4f matrix) { - - return Vector3f(matrix.e[12], matrix.e[13], matrix.e[14]); - } - - - Vector3f getUpVector(const Matrix4f matrix) { - - return Vector3f(matrix.e[4], matrix.e[5], matrix.e[6]); - } - - Vector3f getForwardVector(const Matrix4f matrix) { - - return Vector3f(matrix.e[8], matrix.e[9], matrix.e[10]); - } - } } // namespace sp::math From a4a691fd48f0de62db17afebefad853a14dd9529 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 14 Feb 2020 23:31:15 +0100 Subject: [PATCH 067/361] Math/Transform.cpp: use transform/scale/ratation functions from Math.h --- source/Math/Transform.cpp | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/source/Math/Transform.cpp b/source/Math/Transform.cpp index 1a14d2b..189ef8c 100644 --- a/source/Math/Transform.cpp +++ b/source/Math/Transform.cpp @@ -52,11 +52,8 @@ Vector2f Transform::getRightVector() const Transform& Transform::translate(float x, float y) { - Transform t(1, 0, x, - 0, 1, y, - 0, 0, 1); - - return combine(t); + m_matrix *= math::translate(x, y); + return *this; } Transform& Transform::translate(Vector2f vec) @@ -66,25 +63,14 @@ Transform& Transform::translate(Vector2f vec) Transform& Transform::rotate(float theta) { - float a = math::deg2rad(theta); - float c = std::cos(a); - float s = std::sin(a); - - // Always rotate along z-axis in 2D. - Transform r(c, -s, 0, - s, c, 0, - 0, 0, 1); - - return combine(r); + m_matrix *= math::rotation(theta); + return *this; } Transform& Transform::scale(float x, float y) { - Transform s(x, 0, 0, - 0, y, 0, - 0, 0, 1); - - return combine(s); + m_matrix *= math::scale(x, y); + return *this; } Transform& Transform::scale(Vector2f vec) From 92a561648ec529692e663e2ac3fa747fe81a1d14 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 15 Feb 2020 15:41:53 +0100 Subject: [PATCH 068/361] Platform/Win32/Win32Input.cpp: remove Win32InputMsgBuffer --- source/Platform/Win32/Win32Input.cpp | 8 -------- source/Platform/Win32/Win32Input.h | 16 +--------------- 2 files changed, 1 insertion(+), 23 deletions(-) diff --git a/source/Platform/Win32/Win32Input.cpp b/source/Platform/Win32/Win32Input.cpp index 40cc230..6ee30ad 100644 --- a/source/Platform/Win32/Win32Input.cpp +++ b/source/Platform/Win32/Win32Input.cpp @@ -6,14 +6,6 @@ namespace sp { -Win32InputMsgBuffer Win32Input::inputMsgBuffer; - -Win32InputMsgBuffer::Win32InputMsgBuffer() : -index (0), -enabled (false) -{ -} - Keyboard* Win32Input::createKeyboard() { return new Win32Keyboard(); diff --git a/source/Platform/Win32/Win32Input.h b/source/Platform/Win32/Win32Input.h index 21ad632..9ec3630 100644 --- a/source/Platform/Win32/Win32Input.h +++ b/source/Platform/Win32/Win32Input.h @@ -7,18 +7,6 @@ namespace sp { -#define WIN32_INPUT_BUFFER_QUEUE_MAX_SIZE 64 - -struct Win32InputMsgBuffer { - int index; - MSG messages[WIN32_INPUT_BUFFER_QUEUE_MAX_SIZE]; - bool enabled; - - Win32InputMsgBuffer(); - - bool postMessage(MSG msg); -}; - class Win32Input : public PlatformInput { public : @@ -27,10 +15,8 @@ public : virtual Mouse* createMouse(); virtual void update(); - - static Win32InputMsgBuffer inputMsgBuffer; }; } // namespace sp -#endif /* PLATFORM_WIN32_INPUT_H */ \ No newline at end of file +#endif /* PLATFORM_WIN32_INPUT_H */ From 6805e392a78396b7ca0de0d63116b7d6948c02d0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 20 Sep 2020 16:42:44 +0200 Subject: [PATCH 069/361] source/Platform/Win32/Win32GLContext.cpp: in createGLContext() delete temporary context as the last step. --- source/Platform/Win32/Win32GLContext.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/Platform/Win32/Win32GLContext.cpp b/source/Platform/Win32/Win32GLContext.cpp index 13bb7d4..4215580 100644 --- a/source/Platform/Win32/Win32GLContext.cpp +++ b/source/Platform/Win32/Win32GLContext.cpp @@ -105,10 +105,6 @@ void Win32GLContext::createGLContext() ensureExtensionsLoaded(m_deviceContext); - // Dont need to old one anymore. - wglMakeCurrent(m_deviceContext, NULL); - ::wglDeleteContext(tmpDC); - // TODO: For now.. We force 3.2 Core but this should not be implementation specific. // The Display class should force that for all GLContext Implementations. @@ -121,6 +117,10 @@ void Win32GLContext::createGLContext() // Create real context. m_renderContext = ::wglCreateContextAttribsARB(m_deviceContext, 0, attriblist); + + // Dont need the old one anymore. + wglMakeCurrent(m_deviceContext, NULL); + ::wglDeleteContext(tmpDC); } bool Win32GLContext::activate() From e3c01d4897b6aeeec963e36d9be0a2dd6a96e3f1 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 20 Sep 2020 16:45:58 +0200 Subject: [PATCH 070/361] source/Platform/Win32/Win32GLContext.cpp: make ensureExtensionsLoaded() return bool. --- source/Platform/Win32/Win32GLContext.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/Platform/Win32/Win32GLContext.cpp b/source/Platform/Win32/Win32GLContext.cpp index 4215580..bc5e860 100644 --- a/source/Platform/Win32/Win32GLContext.cpp +++ b/source/Platform/Win32/Win32GLContext.cpp @@ -17,21 +17,25 @@ static GLADapiproc func_loader(const char *name) { } // Ensure that OpenGL extensions are loaded. -static void ensureExtensionsLoaded(HDC dc) +static bool ensureExtensionsLoaded(HDC dc) { static bool init = false; if (!init) { - init = true; if (!gladLoadWGL(dc, func_loader)) { Log::error("WGL: Could not load WGL extensions"); + return false; } if (!gladLoaderLoadGL()) { Log::error("WGL: Could not load OpenGL extensions"); + return false; } + + init = true; } + return true; } Win32GLContext::Win32GLContext() : From a96e78bca5f63309e83b9885ca78f6aa2a5ea630 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 20 Sep 2020 16:46:51 +0200 Subject: [PATCH 071/361] source/Platform/Win32/Win32GLContext.cpp: in createGLContext() check return value from ensureExtensionsLoaded() --- source/Platform/Win32/Win32GLContext.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/Platform/Win32/Win32GLContext.cpp b/source/Platform/Win32/Win32GLContext.cpp index bc5e860..a7153b7 100644 --- a/source/Platform/Win32/Win32GLContext.cpp +++ b/source/Platform/Win32/Win32GLContext.cpp @@ -107,7 +107,9 @@ void Win32GLContext::createGLContext() tmpDC = ::wglCreateContext(m_deviceContext); ::wglMakeCurrent(m_deviceContext, tmpDC); - ensureExtensionsLoaded(m_deviceContext); + if (!ensureExtensionsLoaded(m_deviceContext)) { + goto err; + } // TODO: For now.. We force 3.2 Core but this should not be implementation specific. // The Display class should force that for all GLContext Implementations. @@ -122,6 +124,7 @@ void Win32GLContext::createGLContext() // Create real context. m_renderContext = ::wglCreateContextAttribsARB(m_deviceContext, 0, attriblist); +err: // Dont need the old one anymore. wglMakeCurrent(m_deviceContext, NULL); ::wglDeleteContext(tmpDC); From d8af1006916f533ece89a9a9f57f95991f2558dc Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 21 Sep 2020 17:57:34 +0200 Subject: [PATCH 072/361] GLAD WGL: Update to new version. --- source/Platform/Win32/glad_wgl.c | 127 +++++++------ source/Platform/Win32/glad_wgl.h | 314 ++++++++++++++++--------------- 2 files changed, 232 insertions(+), 209 deletions(-) diff --git a/source/Platform/Win32/glad_wgl.c b/source/Platform/Win32/glad_wgl.c index b5543aa..c0ff712 100644 --- a/source/Platform/Win32/glad_wgl.c +++ b/source/Platform/Win32/glad_wgl.c @@ -14,6 +14,11 @@ #endif /* GLAD_IMPL_UTIL_C_ */ +#ifdef __cplusplus +extern "C" { +#endif + + int GLAD_WGL_VERSION_1_0 = 0; int GLAD_WGL_ARB_create_context = 0; @@ -32,21 +37,21 @@ PFNWGLSWAPINTERVALEXTPROC glad_wglSwapIntervalEXT = NULL; static void glad_wgl_load_WGL_ARB_create_context(GLADuserptrloadfunc load, void *userptr) { - if (!GLAD_WGL_ARB_create_context) return; - glad_wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC)load(userptr, "wglCreateContextAttribsARB"); + if(!GLAD_WGL_ARB_create_context) return; + glad_wglCreateContextAttribsARB = (PFNWGLCREATECONTEXTATTRIBSARBPROC) load(userptr, "wglCreateContextAttribsARB"); } static void glad_wgl_load_WGL_ARB_extensions_string(GLADuserptrloadfunc load, void *userptr) { - if (!GLAD_WGL_ARB_extensions_string) return; - glad_wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)load(userptr, "wglGetExtensionsStringARB"); + if(!GLAD_WGL_ARB_extensions_string) return; + glad_wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) load(userptr, "wglGetExtensionsStringARB"); } static void glad_wgl_load_WGL_EXT_extensions_string(GLADuserptrloadfunc load, void *userptr) { - if (!GLAD_WGL_EXT_extensions_string) return; - glad_wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)load(userptr, "wglGetExtensionsStringEXT"); + if(!GLAD_WGL_EXT_extensions_string) return; + glad_wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) load(userptr, "wglGetExtensionsStringEXT"); } static void glad_wgl_load_WGL_EXT_swap_control(GLADuserptrloadfunc load, void *userptr) { - if (!GLAD_WGL_EXT_swap_control) return; - glad_wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC)load(userptr, "wglGetSwapIntervalEXT"); - glad_wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC)load(userptr, "wglSwapIntervalEXT"); + if(!GLAD_WGL_EXT_swap_control) return; + glad_wglGetSwapIntervalEXT = (PFNWGLGETSWAPINTERVALEXTPROC) load(userptr, "wglGetSwapIntervalEXT"); + glad_wglSwapIntervalEXT = (PFNWGLSWAPINTERVALEXTPROC) load(userptr, "wglSwapIntervalEXT"); } @@ -54,85 +59,93 @@ static void glad_wgl_resolve_aliases(void) { } static int glad_wgl_has_extension(HDC hdc, const char *ext) { - const char *terminator; - const char *loc; - const char *extensions; + const char *terminator; + const char *loc; + const char *extensions; - if (wglGetExtensionsStringEXT == NULL && wglGetExtensionsStringARB == NULL) - return 0; + if(wglGetExtensionsStringEXT == NULL && wglGetExtensionsStringARB == NULL) + return 0; - if (wglGetExtensionsStringARB == NULL || hdc == INVALID_HANDLE_VALUE) - extensions = wglGetExtensionsStringEXT(); - else - extensions = wglGetExtensionsStringARB(hdc); + if(wglGetExtensionsStringARB == NULL || hdc == INVALID_HANDLE_VALUE) + extensions = wglGetExtensionsStringEXT(); + else + extensions = wglGetExtensionsStringARB(hdc); - if (extensions == NULL || ext == NULL) - return 0; + if(extensions == NULL || ext == NULL) + return 0; - while (1) { - loc = strstr(extensions, ext); - if (loc == NULL) - break; + while(1) { + loc = strstr(extensions, ext); + if(loc == NULL) + break; - terminator = loc + strlen(ext); - if ((loc == extensions || *(loc - 1) == ' ') && - (*terminator == ' ' || *terminator == '\0')) - { - return 1; - } - extensions = terminator; - } + terminator = loc + strlen(ext); + if((loc == extensions || *(loc - 1) == ' ') && + (*terminator == ' ' || *terminator == '\0')) + { + return 1; + } + extensions = terminator; + } - return 0; + return 0; } static GLADapiproc glad_wgl_get_proc_from_userptr(void *userptr, const char* name) { - - return (GLAD_GNUC_EXTENSION(GLADapiproc(*)(const char *name)) userptr)(name); + return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); } static int glad_wgl_find_extensions_wgl(HDC hdc) { - GLAD_WGL_ARB_create_context = glad_wgl_has_extension(hdc, "WGL_ARB_create_context"); - GLAD_WGL_ARB_create_context_profile = glad_wgl_has_extension(hdc, "WGL_ARB_create_context_profile"); - GLAD_WGL_ARB_extensions_string = glad_wgl_has_extension(hdc, "WGL_ARB_extensions_string"); - GLAD_WGL_EXT_extensions_string = glad_wgl_has_extension(hdc, "WGL_EXT_extensions_string"); - GLAD_WGL_EXT_swap_control = glad_wgl_has_extension(hdc, "WGL_EXT_swap_control"); - return 1; + GLAD_WGL_ARB_create_context = glad_wgl_has_extension(hdc, "WGL_ARB_create_context"); + GLAD_WGL_ARB_create_context_profile = glad_wgl_has_extension(hdc, "WGL_ARB_create_context_profile"); + GLAD_WGL_ARB_extensions_string = glad_wgl_has_extension(hdc, "WGL_ARB_extensions_string"); + GLAD_WGL_EXT_extensions_string = glad_wgl_has_extension(hdc, "WGL_EXT_extensions_string"); + GLAD_WGL_EXT_swap_control = glad_wgl_has_extension(hdc, "WGL_EXT_swap_control"); + return 1; } static int glad_wgl_find_core_wgl(void) { - int major = 1, minor = 0; - GLAD_WGL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; - return GLAD_MAKE_VERSION(major, minor); + int major = 1, minor = 0; + GLAD_WGL_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; + return GLAD_MAKE_VERSION(major, minor); } int gladLoadWGLUserPtr(HDC hdc, GLADuserptrloadfunc load, void *userptr) { - int version; - wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC)load(userptr, "wglGetExtensionsStringARB"); - wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC)load(userptr, "wglGetExtensionsStringEXT"); - if (wglGetExtensionsStringARB == NULL && wglGetExtensionsStringEXT == NULL) return 0; - version = glad_wgl_find_core_wgl(); + int version; + wglGetExtensionsStringARB = (PFNWGLGETEXTENSIONSSTRINGARBPROC) load(userptr, "wglGetExtensionsStringARB"); + wglGetExtensionsStringEXT = (PFNWGLGETEXTENSIONSSTRINGEXTPROC) load(userptr, "wglGetExtensionsStringEXT"); + if(wglGetExtensionsStringARB == NULL && wglGetExtensionsStringEXT == NULL) return 0; + version = glad_wgl_find_core_wgl(); - if (!glad_wgl_find_extensions_wgl(hdc)) return 0; - glad_wgl_load_WGL_ARB_create_context(load, userptr); - glad_wgl_load_WGL_ARB_extensions_string(load, userptr); - glad_wgl_load_WGL_EXT_extensions_string(load, userptr); - glad_wgl_load_WGL_EXT_swap_control(load, userptr); + if (!glad_wgl_find_extensions_wgl(hdc)) return 0; + glad_wgl_load_WGL_ARB_create_context(load, userptr); + glad_wgl_load_WGL_ARB_extensions_string(load, userptr); + glad_wgl_load_WGL_EXT_extensions_string(load, userptr); + glad_wgl_load_WGL_EXT_swap_control(load, userptr); - return version; + return version; } int gladLoadWGL(HDC hdc, GLADloadfunc load) { - return gladLoadWGLUserPtr(hdc, glad_wgl_get_proc_from_userptr, GLAD_GNUC_EXTENSION(void*) load); + return gladLoadWGLUserPtr(hdc, glad_wgl_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); } #ifdef GLAD_WGL +static GLADapiproc glad_wgl_get_proc(void *vuserptr, const char* name) { + (void) vuserptr; + return GLAD_GNUC_EXTENSION (GLADapiproc) wglGetProcAddress(name); +} + int gladLoaderLoadWGL(HDC hdc) { - return gladLoadWGLUserPtr(hdc, glad_wgl_get_proc_from_userptr, GLAD_GNUC_EXTENSION(void*) wglGetProcAddress); + return gladLoadWGLUserPtr(hdc, glad_wgl_get_proc, NULL); } #endif /* GLAD_WGL */ + +#ifdef __cplusplus +} +#endif diff --git a/source/Platform/Win32/glad_wgl.h b/source/Platform/Win32/glad_wgl.h index daa6c29..268ea72 100644 --- a/source/Platform/Win32/glad_wgl.h +++ b/source/Platform/Win32/glad_wgl.h @@ -1,29 +1,29 @@ /** -* Loader generated by glad 2.0.0-beta on Sun Dec 22 19:55:16 2019 -* -* Generator: C/C++ -* Specification: wgl -* Extensions: 5 -* -* APIs: -* - wgl=1.0 -* -* Options: -* - MX_GLOBAL = False -* - ON_DEMAND = False -* - LOADER = True -* - ALIAS = True -* - HEADER_ONLY = False -* - DEBUG = False -* - MX = False -* -* Commandline: -* --api='wgl=1.0' --extensions='WGL_ARB_create_context,WGL_ARB_create_context_profile,WGL_ARB_extensions_string,WGL_EXT_extensions_string,WGL_EXT_swap_control' c --loader --alias -* -* Online: -* http://glad.sh/#api=wgl%3D1.0&extensions=WGL_ARB_create_context%2CWGL_ARB_create_context_profile%2CWGL_ARB_extensions_string%2CWGL_EXT_extensions_string%2CWGL_EXT_swap_control&generator=c&options=LOADER%2CALIAS -* -*/ + * Loader generated by glad 2.0.0-beta on Mon Sep 21 17:37:19 2020 + * + * Generator: C/C++ + * Specification: wgl + * Extensions: 5 + * + * APIs: + * - wgl=1.0 + * + * Options: + * - MX_GLOBAL = False + * - ON_DEMAND = False + * - LOADER = True + * - ALIAS = True + * - HEADER_ONLY = False + * - DEBUG = False + * - MX = False + * + * Commandline: + * --api='wgl=1.0' --extensions='WGL_ARB_create_context,WGL_ARB_create_context_profile,WGL_ARB_extensions_string,WGL_EXT_extensions_string,WGL_EXT_swap_control' c --loader --alias + * + * Online: + * http://glad.sh/#api=wgl%3D1.0&extensions=WGL_ARB_create_context%2CWGL_ARB_create_context_profile%2CWGL_ARB_extensions_string%2CWGL_EXT_extensions_string%2CWGL_EXT_swap_control&generator=c&options=LOADER%2CALIAS + * + */ #ifndef GLAD_WGL_H_ #define GLAD_WGL_H_ @@ -43,90 +43,90 @@ extern "C" { #define GLAD_PLATFORM_H_ #ifndef GLAD_PLATFORM_WIN32 -#if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) -#define GLAD_PLATFORM_WIN32 1 -#else -#define GLAD_PLATFORM_WIN32 0 -#endif + #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) + #define GLAD_PLATFORM_WIN32 1 + #else + #define GLAD_PLATFORM_WIN32 0 + #endif #endif #ifndef GLAD_PLATFORM_APPLE -#ifdef __APPLE__ -#define GLAD_PLATFORM_APPLE 1 -#else -#define GLAD_PLATFORM_APPLE 0 -#endif + #ifdef __APPLE__ + #define GLAD_PLATFORM_APPLE 1 + #else + #define GLAD_PLATFORM_APPLE 0 + #endif #endif #ifndef GLAD_PLATFORM_EMSCRIPTEN -#ifdef __EMSCRIPTEN__ -#define GLAD_PLATFORM_EMSCRIPTEN 1 -#else -#define GLAD_PLATFORM_EMSCRIPTEN 0 -#endif + #ifdef __EMSCRIPTEN__ + #define GLAD_PLATFORM_EMSCRIPTEN 1 + #else + #define GLAD_PLATFORM_EMSCRIPTEN 0 + #endif #endif #ifndef GLAD_PLATFORM_UWP -#if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) -#ifdef __has_include -#if __has_include() -#define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 -#endif -#elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ -#define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 -#endif -#endif + #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) + #ifdef __has_include + #if __has_include() + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #endif -#ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY -#include -#if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) -#define GLAD_PLATFORM_UWP 1 -#endif -#endif + #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY + #include + #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + #define GLAD_PLATFORM_UWP 1 + #endif + #endif -#ifndef GLAD_PLATFORM_UWP -#define GLAD_PLATFORM_UWP 0 -#endif + #ifndef GLAD_PLATFORM_UWP + #define GLAD_PLATFORM_UWP 0 + #endif #endif #ifdef __GNUC__ -#define GLAD_GNUC_EXTENSION __extension__ + #define GLAD_GNUC_EXTENSION __extension__ #else -#define GLAD_GNUC_EXTENSION + #define GLAD_GNUC_EXTENSION #endif #ifndef GLAD_API_CALL -#if defined(GLAD_API_CALL_EXPORT) -#if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) -#if defined(GLAD_API_CALL_EXPORT_BUILD) -#if defined(__GNUC__) -#define GLAD_API_CALL __attribute__ ((dllexport)) extern -#else -#define GLAD_API_CALL __declspec(dllexport) extern -#endif -#else -#if defined(__GNUC__) -#define GLAD_API_CALL __attribute__ ((dllimport)) extern -#else -#define GLAD_API_CALL __declspec(dllimport) extern -#endif -#endif -#elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) -#define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern -#else -#define GLAD_API_CALL extern -#endif -#else -#define GLAD_API_CALL extern -#endif + #if defined(GLAD_API_CALL_EXPORT) + #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) + #if defined(GLAD_API_CALL_EXPORT_BUILD) + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllexport)) extern + #else + #define GLAD_API_CALL __declspec(dllexport) extern + #endif + #else + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllimport)) extern + #else + #define GLAD_API_CALL __declspec(dllimport) extern + #endif + #endif + #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) + #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern + #else + #define GLAD_API_CALL extern + #endif + #else + #define GLAD_API_CALL extern + #endif #endif #ifdef APIENTRY -#define GLAD_API_PTR APIENTRY + #define GLAD_API_PTR APIENTRY #elif GLAD_PLATFORM_WIN32 -#define GLAD_API_PTR __stdcall + #define GLAD_API_PTR __stdcall #else -#define GLAD_API_PTR + #define GLAD_API_PTR #endif #ifndef GLAPI @@ -143,13 +143,13 @@ extern "C" { #define GLAD_GENERATOR_VERSION "2.0.0-beta" - typedef void(*GLADapiproc)(void); +typedef void (*GLADapiproc)(void); - typedef GLADapiproc(*GLADloadfunc)(const char *name); - typedef GLADapiproc(*GLADuserptrloadfunc)(void *userptr, const char *name); +typedef GLADapiproc (*GLADloadfunc)(const char *name); +typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name); - typedef void(*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); - typedef void(*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); +typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); +typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); #endif /* GLAD_PLATFORM_H_ */ @@ -229,91 +229,101 @@ extern "C" { - struct _GPU_DEVICE { - DWORD cb; - CHAR DeviceName[32]; - CHAR DeviceString[128]; - DWORD Flags; - RECT rcVirtualScreen; - }; - DECLARE_HANDLE(HPBUFFERARB); - DECLARE_HANDLE(HPBUFFEREXT); - DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); - DECLARE_HANDLE(HPVIDEODEV); - DECLARE_HANDLE(HPGPUNV); - DECLARE_HANDLE(HGPUNV); - DECLARE_HANDLE(HVIDEOINPUTDEVICENV); - typedef struct _GPU_DEVICE GPU_DEVICE; - typedef struct _GPU_DEVICE *PGPU_DEVICE; +struct _GPU_DEVICE { + DWORD cb; + CHAR DeviceName[32]; + CHAR DeviceString[128]; + DWORD Flags; + RECT rcVirtualScreen; +}; + +DECLARE_HANDLE(HPBUFFERARB); + +DECLARE_HANDLE(HPBUFFEREXT); + +DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); + +DECLARE_HANDLE(HPVIDEODEV); + +DECLARE_HANDLE(HPGPUNV); + +DECLARE_HANDLE(HGPUNV); + +DECLARE_HANDLE(HVIDEOINPUTDEVICENV); + +typedef struct _GPU_DEVICE GPU_DEVICE; + +typedef struct _GPU_DEVICE *PGPU_DEVICE; + #define WGL_VERSION_1_0 1 - GLAD_API_CALL int GLAD_WGL_VERSION_1_0; +GLAD_API_CALL int GLAD_WGL_VERSION_1_0; #define WGL_ARB_create_context 1 - GLAD_API_CALL int GLAD_WGL_ARB_create_context; +GLAD_API_CALL int GLAD_WGL_ARB_create_context; #define WGL_ARB_create_context_profile 1 - GLAD_API_CALL int GLAD_WGL_ARB_create_context_profile; +GLAD_API_CALL int GLAD_WGL_ARB_create_context_profile; #define WGL_ARB_extensions_string 1 - GLAD_API_CALL int GLAD_WGL_ARB_extensions_string; +GLAD_API_CALL int GLAD_WGL_ARB_extensions_string; #define WGL_EXT_extensions_string 1 - GLAD_API_CALL int GLAD_WGL_EXT_extensions_string; +GLAD_API_CALL int GLAD_WGL_EXT_extensions_string; #define WGL_EXT_swap_control 1 - GLAD_API_CALL int GLAD_WGL_EXT_swap_control; +GLAD_API_CALL int GLAD_WGL_EXT_swap_control; - typedef int (GLAD_API_PTR *PFNCHOOSEPIXELFORMATPROC)(HDC hDc, const PIXELFORMATDESCRIPTOR * pPfd); - typedef int (GLAD_API_PTR *PFNDESCRIBEPIXELFORMATPROC)(HDC hdc, int ipfd, UINT cjpfd, const PIXELFORMATDESCRIPTOR * ppfd); - typedef UINT(GLAD_API_PTR *PFNGETENHMETAFILEPIXELFORMATPROC)(HENHMETAFILE hemf, const PIXELFORMATDESCRIPTOR * ppfd); - typedef int (GLAD_API_PTR *PFNGETPIXELFORMATPROC)(HDC hdc); - typedef BOOL(GLAD_API_PTR *PFNSETPIXELFORMATPROC)(HDC hdc, int ipfd, const PIXELFORMATDESCRIPTOR * ppfd); - typedef BOOL(GLAD_API_PTR *PFNSWAPBUFFERSPROC)(HDC hdc); - typedef BOOL(GLAD_API_PTR *PFNWGLCOPYCONTEXTPROC)(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask); - typedef HGLRC(GLAD_API_PTR *PFNWGLCREATECONTEXTPROC)(HDC hDc); - typedef HGLRC(GLAD_API_PTR *PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC hDC, HGLRC hShareContext, const int * attribList); - typedef HGLRC(GLAD_API_PTR *PFNWGLCREATELAYERCONTEXTPROC)(HDC hDc, int level); - typedef BOOL(GLAD_API_PTR *PFNWGLDELETECONTEXTPROC)(HGLRC oldContext); - typedef BOOL(GLAD_API_PTR *PFNWGLDESCRIBELAYERPLANEPROC)(HDC hDc, int pixelFormat, int layerPlane, UINT nBytes, const LAYERPLANEDESCRIPTOR * plpd); - typedef HGLRC(GLAD_API_PTR *PFNWGLGETCURRENTCONTEXTPROC)(void); - typedef HDC(GLAD_API_PTR *PFNWGLGETCURRENTDCPROC)(void); - typedef const char * (GLAD_API_PTR *PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc); - typedef const char * (GLAD_API_PTR *PFNWGLGETEXTENSIONSSTRINGEXTPROC)(void); - typedef int (GLAD_API_PTR *PFNWGLGETLAYERPALETTEENTRIESPROC)(HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF * pcr); - typedef PROC(GLAD_API_PTR *PFNWGLGETPROCADDRESSPROC)(LPCSTR lpszProc); - typedef int (GLAD_API_PTR *PFNWGLGETSWAPINTERVALEXTPROC)(void); - typedef BOOL(GLAD_API_PTR *PFNWGLMAKECURRENTPROC)(HDC hDc, HGLRC newContext); - typedef BOOL(GLAD_API_PTR *PFNWGLREALIZELAYERPALETTEPROC)(HDC hdc, int iLayerPlane, BOOL bRealize); - typedef int (GLAD_API_PTR *PFNWGLSETLAYERPALETTEENTRIESPROC)(HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF * pcr); - typedef BOOL(GLAD_API_PTR *PFNWGLSHARELISTSPROC)(HGLRC hrcSrvShare, HGLRC hrcSrvSource); - typedef BOOL(GLAD_API_PTR *PFNWGLSWAPINTERVALEXTPROC)(int interval); - typedef BOOL(GLAD_API_PTR *PFNWGLSWAPLAYERBUFFERSPROC)(HDC hdc, UINT fuFlags); - typedef BOOL(GLAD_API_PTR *PFNWGLUSEFONTBITMAPSPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase); - typedef BOOL(GLAD_API_PTR *PFNWGLUSEFONTBITMAPSAPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase); - typedef BOOL(GLAD_API_PTR *PFNWGLUSEFONTBITMAPSWPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase); - typedef BOOL(GLAD_API_PTR *PFNWGLUSEFONTOUTLINESPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); - typedef BOOL(GLAD_API_PTR *PFNWGLUSEFONTOUTLINESAPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); - typedef BOOL(GLAD_API_PTR *PFNWGLUSEFONTOUTLINESWPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); +typedef int (GLAD_API_PTR *PFNCHOOSEPIXELFORMATPROC)(HDC hDc, const PIXELFORMATDESCRIPTOR * pPfd); +typedef int (GLAD_API_PTR *PFNDESCRIBEPIXELFORMATPROC)(HDC hdc, int ipfd, UINT cjpfd, const PIXELFORMATDESCRIPTOR * ppfd); +typedef UINT (GLAD_API_PTR *PFNGETENHMETAFILEPIXELFORMATPROC)(HENHMETAFILE hemf, const PIXELFORMATDESCRIPTOR * ppfd); +typedef int (GLAD_API_PTR *PFNGETPIXELFORMATPROC)(HDC hdc); +typedef BOOL (GLAD_API_PTR *PFNSETPIXELFORMATPROC)(HDC hdc, int ipfd, const PIXELFORMATDESCRIPTOR * ppfd); +typedef BOOL (GLAD_API_PTR *PFNSWAPBUFFERSPROC)(HDC hdc); +typedef BOOL (GLAD_API_PTR *PFNWGLCOPYCONTEXTPROC)(HGLRC hglrcSrc, HGLRC hglrcDst, UINT mask); +typedef HGLRC (GLAD_API_PTR *PFNWGLCREATECONTEXTPROC)(HDC hDc); +typedef HGLRC (GLAD_API_PTR *PFNWGLCREATECONTEXTATTRIBSARBPROC)(HDC hDC, HGLRC hShareContext, const int * attribList); +typedef HGLRC (GLAD_API_PTR *PFNWGLCREATELAYERCONTEXTPROC)(HDC hDc, int level); +typedef BOOL (GLAD_API_PTR *PFNWGLDELETECONTEXTPROC)(HGLRC oldContext); +typedef BOOL (GLAD_API_PTR *PFNWGLDESCRIBELAYERPLANEPROC)(HDC hDc, int pixelFormat, int layerPlane, UINT nBytes, const LAYERPLANEDESCRIPTOR * plpd); +typedef HGLRC (GLAD_API_PTR *PFNWGLGETCURRENTCONTEXTPROC)(void); +typedef HDC (GLAD_API_PTR *PFNWGLGETCURRENTDCPROC)(void); +typedef const char * (GLAD_API_PTR *PFNWGLGETEXTENSIONSSTRINGARBPROC)(HDC hdc); +typedef const char * (GLAD_API_PTR *PFNWGLGETEXTENSIONSSTRINGEXTPROC)(void); +typedef int (GLAD_API_PTR *PFNWGLGETLAYERPALETTEENTRIESPROC)(HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF * pcr); +typedef PROC (GLAD_API_PTR *PFNWGLGETPROCADDRESSPROC)(LPCSTR lpszProc); +typedef int (GLAD_API_PTR *PFNWGLGETSWAPINTERVALEXTPROC)(void); +typedef BOOL (GLAD_API_PTR *PFNWGLMAKECURRENTPROC)(HDC hDc, HGLRC newContext); +typedef BOOL (GLAD_API_PTR *PFNWGLREALIZELAYERPALETTEPROC)(HDC hdc, int iLayerPlane, BOOL bRealize); +typedef int (GLAD_API_PTR *PFNWGLSETLAYERPALETTEENTRIESPROC)(HDC hdc, int iLayerPlane, int iStart, int cEntries, const COLORREF * pcr); +typedef BOOL (GLAD_API_PTR *PFNWGLSHARELISTSPROC)(HGLRC hrcSrvShare, HGLRC hrcSrvSource); +typedef BOOL (GLAD_API_PTR *PFNWGLSWAPINTERVALEXTPROC)(int interval); +typedef BOOL (GLAD_API_PTR *PFNWGLSWAPLAYERBUFFERSPROC)(HDC hdc, UINT fuFlags); +typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTBITMAPSPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase); +typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTBITMAPSAPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase); +typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTBITMAPSWPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase); +typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTOUTLINESPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); +typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTOUTLINESAPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); +typedef BOOL (GLAD_API_PTR *PFNWGLUSEFONTOUTLINESWPROC)(HDC hDC, DWORD first, DWORD count, DWORD listBase, FLOAT deviation, FLOAT extrusion, int format, LPGLYPHMETRICSFLOAT lpgmf); - GLAD_API_CALL PFNWGLCREATECONTEXTATTRIBSARBPROC glad_wglCreateContextAttribsARB; +GLAD_API_CALL PFNWGLCREATECONTEXTATTRIBSARBPROC glad_wglCreateContextAttribsARB; #define wglCreateContextAttribsARB glad_wglCreateContextAttribsARB - GLAD_API_CALL PFNWGLGETEXTENSIONSSTRINGARBPROC glad_wglGetExtensionsStringARB; +GLAD_API_CALL PFNWGLGETEXTENSIONSSTRINGARBPROC glad_wglGetExtensionsStringARB; #define wglGetExtensionsStringARB glad_wglGetExtensionsStringARB - GLAD_API_CALL PFNWGLGETEXTENSIONSSTRINGEXTPROC glad_wglGetExtensionsStringEXT; +GLAD_API_CALL PFNWGLGETEXTENSIONSSTRINGEXTPROC glad_wglGetExtensionsStringEXT; #define wglGetExtensionsStringEXT glad_wglGetExtensionsStringEXT - GLAD_API_CALL PFNWGLGETSWAPINTERVALEXTPROC glad_wglGetSwapIntervalEXT; +GLAD_API_CALL PFNWGLGETSWAPINTERVALEXTPROC glad_wglGetSwapIntervalEXT; #define wglGetSwapIntervalEXT glad_wglGetSwapIntervalEXT - GLAD_API_CALL PFNWGLSWAPINTERVALEXTPROC glad_wglSwapIntervalEXT; +GLAD_API_CALL PFNWGLSWAPINTERVALEXTPROC glad_wglSwapIntervalEXT; #define wglSwapIntervalEXT glad_wglSwapIntervalEXT - GLAD_API_CALL int gladLoadWGLUserPtr(HDC hdc, GLADuserptrloadfunc load, void *userptr); - GLAD_API_CALL int gladLoadWGL(HDC hdc, GLADloadfunc load); +GLAD_API_CALL int gladLoadWGLUserPtr(HDC hdc, GLADuserptrloadfunc load, void *userptr); +GLAD_API_CALL int gladLoadWGL(HDC hdc, GLADloadfunc load); #ifdef GLAD_WGL - GLAD_API_CALL int gladLoaderLoadWGL(HDC hdc); +GLAD_API_CALL int gladLoaderLoadWGL(HDC hdc); #endif #ifdef __cplusplus From 2c76d3bc875a558495e8d725759c8a0d271ab7a5 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 21 Sep 2020 18:00:08 +0200 Subject: [PATCH 073/361] source/Platform/Win32/Win32GLContext.cpp: no need to have our own wgl extension loader (fixed in latest glad2) --- source/Platform/Win32/Win32GLContext.cpp | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/source/Platform/Win32/Win32GLContext.cpp b/source/Platform/Win32/Win32GLContext.cpp index a7153b7..475394a 100644 --- a/source/Platform/Win32/Win32GLContext.cpp +++ b/source/Platform/Win32/Win32GLContext.cpp @@ -9,13 +9,6 @@ namespace sp { -// Can't use GLAD's standard loader function because it -// calls wglGetProcAddress without __stdcall -// that results in some runtime exception. -static GLADapiproc func_loader(const char *name) { - return (GLADapiproc) wglGetProcAddress(name); -} - // Ensure that OpenGL extensions are loaded. static bool ensureExtensionsLoaded(HDC dc) { @@ -23,7 +16,7 @@ static bool ensureExtensionsLoaded(HDC dc) if (!init) { - if (!gladLoadWGL(dc, func_loader)) { + if (!gladLoaderLoadWGL(dc)) { Log::error("WGL: Could not load WGL extensions"); return false; } From 0f08f10a0de443f621594a40b6eff611f68dc4ae Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 23 Sep 2020 00:00:31 +0200 Subject: [PATCH 074/361] source/Game.cpp: don't need to call setClearColor() here. it is done as part of the graphics module setup. --- source/Game.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/Game.cpp b/source/Game.cpp index 1f7772f..2bbd8a0 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -34,8 +34,6 @@ void Game::setup() { m_graphics->init(); - m_graphics->setClearColor(0.0f, 0.0f, 0.0f); - init(); } From d58c49421eb0fc057d14e819e6e2165bb2907ce2 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 23 Sep 2020 12:41:22 +0200 Subject: [PATCH 075/361] source/Graphics/OpenGL.cpp: in init() return false if display fails to be created. --- source/Graphics/OpenGL.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/Graphics/OpenGL.cpp b/source/Graphics/OpenGL.cpp index 6a1e6ff..ef7383d 100644 --- a/source/Graphics/OpenGL.cpp +++ b/source/Graphics/OpenGL.cpp @@ -26,7 +26,9 @@ bool Graphics::init() desc.decoration = DisplayDecorate::Menu | DisplayDecorate::Close | DisplayDecorate::Resize; - m_display->create(desc); + if (!m_display->create(desc)) { + return false; + } setClearColor(0.0f, 0.0f, 0.0f); From 2a1851efb51071bfa8695227a5b89f2126c8b184 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 23 Sep 2020 16:55:42 +0200 Subject: [PATCH 076/361] Game: remove setup() method. do setup in run() instead. --- include/Spectre/Game.h | 2 -- source/Game.cpp | 7 +------ 2 files changed, 1 insertion(+), 8 deletions(-) diff --git a/include/Spectre/Game.h b/include/Spectre/Game.h index 9279c69..4c7b5b8 100644 --- a/include/Spectre/Game.h +++ b/include/Spectre/Game.h @@ -40,8 +40,6 @@ protected : private : - void setup(); - void gameLoop(); void processEvents(); diff --git a/source/Game.cpp b/source/Game.cpp index 2bbd8a0..2a3f9e9 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -30,16 +30,11 @@ Game::~Game() delete m_messageHandler; } -void Game::setup() +void Game::run() { m_graphics->init(); init(); -} - -void Game::run() -{ - setup(); gameLoop(); } From 976ddecd1060f0de4b77e68628f2d64fa6bb82a4 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 23 Sep 2020 16:56:28 +0200 Subject: [PATCH 077/361] source/Game.cpp: in run() exit if graphics could not be initialized. --- source/Game.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/Game.cpp b/source/Game.cpp index 2a3f9e9..dcb271d 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -32,7 +32,9 @@ Game::~Game() void Game::run() { - m_graphics->init(); + if (!m_graphics->init()) { + return; + } init(); From 18880ef17e3c0f1caff393c60c75611167191489 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 24 Sep 2020 16:33:30 +0200 Subject: [PATCH 078/361] source/Game.cpp: minor fixes. --- source/Game.cpp | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/source/Game.cpp b/source/Game.cpp index dcb271d..5213c50 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -11,14 +11,12 @@ namespace sp { -Game::Game() +Game::Game() : +m_running(false) { m_platform = new Win32Application(); - - m_running = false; m_graphics = new Graphics(m_platform); m_input = new InputModule(&m_platform->getInput()); - m_messageHandler = new MessageHandler(); } @@ -113,4 +111,4 @@ MessageHandler* Game::getMessageHandler() const return m_messageHandler; } -} +} // namespace sp From 32fddcd99d7af9f1994d8eaeb787c46857e2ebfe Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 24 Sep 2020 17:39:48 +0200 Subject: [PATCH 079/361] include/Spectre/Input/Mouse.h: don't use relative path in include. --- include/Spectre/Input/Mouse.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Spectre/Input/Mouse.h b/include/Spectre/Input/Mouse.h index 8d62feb..9140b7a 100644 --- a/include/Spectre/Input/Mouse.h +++ b/include/Spectre/Input/Mouse.h @@ -4,7 +4,7 @@ #include #include -#include "InputDevice.h" +#include namespace sp { From eb1f6303f10588196faed2cf80db4e0127810cec Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 24 Sep 2020 18:30:53 +0200 Subject: [PATCH 080/361] include/Spectre/Input/InputDevice.h: typo fix. --- include/Spectre/Input/InputDevice.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Spectre/Input/InputDevice.h b/include/Spectre/Input/InputDevice.h index ddace17..1ac9e75 100644 --- a/include/Spectre/Input/InputDevice.h +++ b/include/Spectre/Input/InputDevice.h @@ -4,7 +4,7 @@ namespace sp { -class InputMudule; +class InputModule; class InputDevice { From 1a6cee0b25b4c9435482f85fa4ea2ffa19380e1f Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 13 Oct 2020 18:06:21 +0200 Subject: [PATCH 081/361] Spectre/System/Log: adding debug method. --- include/Spectre/System/Log.h | 3 +++ source/System/Log.cpp | 19 +++++++++++++++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/include/Spectre/System/Log.h b/include/Spectre/System/Log.h index b10bf94..26d2ac1 100644 --- a/include/Spectre/System/Log.h +++ b/include/Spectre/System/Log.h @@ -15,6 +15,7 @@ public : T_WARNING = 1 << 0, T_CRITICAL = 1 << 1, T_ERROR = 1 << 2, + T_DEBUG = 1 << 3 }; static void info(const char *message, ...); @@ -23,6 +24,8 @@ public : static int error(const char *message, ...); + static void debug(const char *message, ...); + private : static void writeln(Type type, const char *fmt, va_list args); diff --git a/source/System/Log.cpp b/source/System/Log.cpp index 257351c..47a5210 100644 --- a/source/System/Log.cpp +++ b/source/System/Log.cpp @@ -35,6 +35,17 @@ int Log::error(const char *message, ...) return 1; } +void Log::debug(const char *message, ...) +{ +#ifdef SPECTRE_DEBUG + va_list vl; + + va_start(vl, message); + writeln(T_DEBUG, message, vl); + va_end(vl); +#endif /* SPECTRE_DEBUG */ +} + void Log::writeln(Type type, const char *message, va_list args) { FILE *fd = stderr; @@ -52,8 +63,12 @@ void Log::writeln(Type type, const char *message, va_list args) case T_CRITICAL: prefix = "CRIT"; break; - default : - case T_ERROR : +#ifdef SPECTRE_DEBUG + case T_DEBUG: + prefix = "DEBUG"; + break; +#endif /* SPECTRE_DEBUG */ + case T_ERROR : default : prefix = "ERROR"; break; } From ec8eb971a5601bba91ef04a11f2f703aed370640 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 13 Oct 2020 18:06:57 +0200 Subject: [PATCH 082/361] engine.build.lua: define "SPECTRE_DEBUG" when building in debug mode. --- engine.build.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engine.build.lua b/engine.build.lua index 37958dc..ea06e71 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -13,6 +13,10 @@ local settings = CopySettings(global_settings, "Engine") settings.cc.includes:Add("include/") settings.cc.includes:Add("source/") +if global_settings.debug then + settings.cc.flags:Add("-DSPECTRE_DEBUG") +end + -- FreeType2 settings.cc.includes:Add("vendor/FreeType2/include") From 49f42e98f4dc5892daad76715be8d0ffd4a92987 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 14 Oct 2020 13:20:55 +0200 Subject: [PATCH 083/361] Adding Event example --- examples/build.lua | 3 ++- examples/events/EventsExample.cpp | 28 ++++++++++++++++++++++++++++ examples/events/EventsExample.h | 22 ++++++++++++++++++++++ examples/events/bam.lua | 7 +++++++ examples/events/main.cpp | 11 +++++++++++ 5 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 examples/events/EventsExample.cpp create mode 100644 examples/events/EventsExample.h create mode 100644 examples/events/bam.lua create mode 100644 examples/events/main.cpp diff --git a/examples/build.lua b/examples/build.lua index dd839cb..5505fed 100644 --- a/examples/build.lua +++ b/examples/build.lua @@ -23,7 +23,8 @@ end assets = CopyDir(PathJoin(paths.build, paths.examples), "assets") examples = BuildExamples(example_settings, { - "text" + "text", + "events" }, assets) PseudoTarget("examples", examples) diff --git a/examples/events/EventsExample.cpp b/examples/events/EventsExample.cpp new file mode 100644 index 0000000..d9859aa --- /dev/null +++ b/examples/events/EventsExample.cpp @@ -0,0 +1,28 @@ + +#include +#include +#include "EventsExample.h" + +void EventsExample::init() +{ + getMessageHandler()->registerListener(this); +} + +void EventsExample::onEvent(const sp::Event& event) +{ + if (event.type == sp::Event::Key) { + const char* name = event.key.getKeyName().c_str(); + const char* pressed = event.key.pressed ? "pressed" : "released"; + sp::Log::info("Key: %s %s", name, pressed); + } +} + +void EventsExample::update(double dt) +{ + // Nothing to do +} + +void EventsExample::render() +{ + // Nothing to do +} diff --git a/examples/events/EventsExample.h b/examples/events/EventsExample.h new file mode 100644 index 0000000..ed9f8b2 --- /dev/null +++ b/examples/events/EventsExample.h @@ -0,0 +1,22 @@ + +#ifndef EVENTS_EXAMPLE_H +#define EVENTS_EXAMPLE_H + +#include +#include + +class EventsExample : public sp::Game, sp::EventListener +{ +public : + void onEvent(const sp::Event& event); + +protected : + + void init(); + + void update(double dt); + + void render(); +}; + +#endif /* EVENTS_EXAMPLE_H */ diff --git a/examples/events/bam.lua b/examples/events/bam.lua new file mode 100644 index 0000000..fa428ca --- /dev/null +++ b/examples/events/bam.lua @@ -0,0 +1,7 @@ + +local base = PathDir(ModuleFilename()) + +src ={ + base .. "/main.cpp", + base .. "/EventsExample.cpp" +} diff --git a/examples/events/main.cpp b/examples/events/main.cpp new file mode 100644 index 0000000..9dead5e --- /dev/null +++ b/examples/events/main.cpp @@ -0,0 +1,11 @@ + +#include "EventsExample.h" + +int main(int argc, char **argv) { + + EventsExample game; + + game.run(); + + return 0; +} From c09febc4d81ddb3be971917c5bd6b0d3b31c43ec Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 14 Oct 2020 13:50:52 +0200 Subject: [PATCH 084/361] examples/events/EventsExample.cpp: store std::string instead of char pointer. Some compilers (ehm, microsoft) returns a temporary variable for event.key.getKeyName() that is only valid during the statement and not scope. Fix this by storing std::string instead. So the object's lifetime is the entire if statement. --- examples/events/EventsExample.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/events/EventsExample.cpp b/examples/events/EventsExample.cpp index d9859aa..0538d26 100644 --- a/examples/events/EventsExample.cpp +++ b/examples/events/EventsExample.cpp @@ -11,9 +11,9 @@ void EventsExample::init() void EventsExample::onEvent(const sp::Event& event) { if (event.type == sp::Event::Key) { - const char* name = event.key.getKeyName().c_str(); + std::string name = event.key.getKeyName(); const char* pressed = event.key.pressed ? "pressed" : "released"; - sp::Log::info("Key: %s %s", name, pressed); + sp::Log::info("Key: %s %s", name.c_str(), pressed); } } From 133292117486e22863fd03527bd8c347c030472e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 16 Oct 2020 19:30:07 +0200 Subject: [PATCH 085/361] examples/events/EventsExample.cpp: handle mouse button events also. --- examples/events/EventsExample.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/events/EventsExample.cpp b/examples/events/EventsExample.cpp index 0538d26..d229cf7 100644 --- a/examples/events/EventsExample.cpp +++ b/examples/events/EventsExample.cpp @@ -15,6 +15,12 @@ void EventsExample::onEvent(const sp::Event& event) const char* pressed = event.key.pressed ? "pressed" : "released"; sp::Log::info("Key: %s %s", name.c_str(), pressed); } + + if (event.type == sp::Event::MouseButton) { + std::string name = event.mouseButton.getName(); + const char* pressed = event.mouseButton.pressed ? "pressed" : "released"; + sp::Log::info("MouseButton: %s %s", name.c_str(), pressed); + } } void EventsExample::update(double dt) From b0d14b91e081096493197305a1268924e678a7e6 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 16 Oct 2020 19:37:18 +0200 Subject: [PATCH 086/361] Adding Input Example. --- examples/build.lua | 3 +- examples/input/InputExample.cpp | 65 +++++++++++++++++++++++++++++++++ examples/input/InputExample.h | 34 +++++++++++++++++ examples/input/bam.lua | 7 ++++ examples/input/main.cpp | 11 ++++++ 5 files changed, 119 insertions(+), 1 deletion(-) create mode 100644 examples/input/InputExample.cpp create mode 100644 examples/input/InputExample.h create mode 100644 examples/input/bam.lua create mode 100644 examples/input/main.cpp diff --git a/examples/build.lua b/examples/build.lua index 5505fed..92d04a1 100644 --- a/examples/build.lua +++ b/examples/build.lua @@ -24,7 +24,8 @@ assets = CopyDir(PathJoin(paths.build, paths.examples), "assets") examples = BuildExamples(example_settings, { "text", - "events" + "events", + "input" }, assets) PseudoTarget("examples", examples) diff --git a/examples/input/InputExample.cpp b/examples/input/InputExample.cpp new file mode 100644 index 0000000..0dc73e0 --- /dev/null +++ b/examples/input/InputExample.cpp @@ -0,0 +1,65 @@ + +#include +#include +#include + +#include +#include +#include "InputExample.h" + +void InputExample::init() +{ + m_renderer = new sp::BatchRenderer2D(); + + m_tux_texture.create("assets/textures/tux.png"); + + m_kb_sprite.setTexture(m_tux_texture); + m_kb_sprite.setColor(sp::Color::Green); + m_kb_sprite.setSize(sp::vec2f(100, 100)); + + m_mouse_sprite.setTexture(m_tux_texture); + m_mouse_sprite.setColor(sp::Color::Red); + m_mouse_sprite.setSize(sp::vec2f(100, 100)); + m_mouse_sprite.setPosition(sp::vec2f(50, 50)); + + m_renderer->setCamera(m_camera); +} + +void InputExample::update(double dt) +{ + sp::Keyboard* keyboard = getInput()->getKeyboard(); + sp::Mouse* mouse = getInput()->getMouse(); + double delta = 0.3 * dt; + + // Handle keyboard input. + if (keyboard->isKeyDown(sp::Keyboard::Left)) { + m_kb_sprite.move(sp::vec2f(-delta, 0)); + } else if (keyboard->isKeyDown(sp::Keyboard::Right)) { + m_kb_sprite.move(sp::vec2f( delta, 0)); + } + + if (keyboard->isKeyDown(sp::Keyboard::Up)) { + m_kb_sprite.move(sp::vec2f(0, -delta)); + } else if (keyboard->isKeyDown(sp::Keyboard::Down)) { + m_kb_sprite.move(sp::vec2f(0, delta)); + } + + // Handle mouse input. + if (mouse->isButtonDown(sp::Mouse::Left)) { + m_mouse_sprite.setPosition(mouse->getPosition()); + } +} + +void InputExample::render() +{ + sp::Graphics* g = getGraphics(); + + g->clearBuffer(); + + m_renderer->begin(); + m_renderer->submit(m_mouse_sprite); + m_renderer->submit(m_kb_sprite); + m_renderer->render(); + + g->swapBuffers(); +} diff --git a/examples/input/InputExample.h b/examples/input/InputExample.h new file mode 100644 index 0000000..e227a8d --- /dev/null +++ b/examples/input/InputExample.h @@ -0,0 +1,34 @@ + +#ifndef INPUT_EXAMPLE_H +#define INPUT_EXAMPLE_H + +#include +#include +#include +#include + +namespace sp { + class Renderer2D; +} + +class InputExample : public sp::Game +{ +protected : + + void init(); + + void update(double dt); + + void render(); + +private : + sp::Camera2D m_camera; + sp::Renderer2D *m_renderer; + + sp::Sprite m_kb_sprite; + sp::Sprite m_mouse_sprite; + + sp::Texture m_tux_texture; +}; + +#endif /* INPUT_EXAMPLE_H*/ diff --git a/examples/input/bam.lua b/examples/input/bam.lua new file mode 100644 index 0000000..6cf60e3 --- /dev/null +++ b/examples/input/bam.lua @@ -0,0 +1,7 @@ + +local base = PathDir(ModuleFilename()) + +src ={ + base .. "/main.cpp", + base .. "/InputExample.cpp" +} diff --git a/examples/input/main.cpp b/examples/input/main.cpp new file mode 100644 index 0000000..513d592 --- /dev/null +++ b/examples/input/main.cpp @@ -0,0 +1,11 @@ + +#include "InputExample.h" + +int main(int argc, char **argv) { + + InputExample game; + + game.run(); + + return 0; +} From 6f9b33be8fcb85f5b8c29176b56352d2189fe347 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 21 Oct 2020 11:14:17 +0200 Subject: [PATCH 087/361] Adding Spectre/System/ByteOrder --- engine.build.lua | 1 + include/Spectre/System/ByteOrder.h | 15 +++++++++++++++ source/System/ByteOrder.cpp | 20 ++++++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 include/Spectre/System/ByteOrder.h create mode 100644 source/System/ByteOrder.cpp diff --git a/engine.build.lua b/engine.build.lua index ea06e71..35a8e2a 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -27,6 +27,7 @@ settings.cc.includes:Add("vendor/stb/include") ----------------------------------------------------------- local system_module = Module("source/System", { + "ByteOrder.cpp", "File.cpp", "Path.cpp", "MessageHandler.cpp", diff --git a/include/Spectre/System/ByteOrder.h b/include/Spectre/System/ByteOrder.h new file mode 100644 index 0000000..ff89d6f --- /dev/null +++ b/include/Spectre/System/ByteOrder.h @@ -0,0 +1,15 @@ + +#ifndef SPECTRE_SYSTEM_BYTEORDER_H +#define SPECTRE_SYSTEM_BYTEORDER_H + +#include + +namespace sp { namespace system +{ + uint16_t ltoh16(const uint8_t* bytes); + + uint32_t ltoh32(const uint8_t* bytes); + +} } // namespace sp::system + +#endif /* SPECTRE_SYSTEM_BYTEORDER_H */ diff --git a/source/System/ByteOrder.cpp b/source/System/ByteOrder.cpp new file mode 100644 index 0000000..71886b9 --- /dev/null +++ b/source/System/ByteOrder.cpp @@ -0,0 +1,20 @@ + +#include + +namespace sp { namespace system +{ + +uint16_t ltoh16(const uint8_t* bytes) +{ + return bytes[0] | (bytes[1] << 8); +} + +uint32_t ltoh32(const uint8_t* bytes) +{ + return bytes[0] + | (bytes[1] << 8) + | (bytes[2] << 16) + | (bytes[3] << 24); +} + +} } // namespace sp::system From f7fcc2633c03c1a5cfa2a548c11c6a0e076ba274 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 22 Oct 2020 13:05:41 +0200 Subject: [PATCH 088/361] Graphics/Image: dont store PixelFormat, instead define a new enum for number of channels. The image class has a strict internal representation so we dont need "format". PixelFormat enum can be passed to functions that modify the pixel data (like setPixels()) so that a proper convertion can be done. --- include/Spectre/Graphics/Image.h | 19 ++-- .../Graphics/Font/Engine/FreeTypeEngine.cpp | 5 +- source/Graphics/Image.cpp | 101 +++++++----------- source/Graphics/Texture.cpp | 14 +-- 4 files changed, 53 insertions(+), 86 deletions(-) diff --git a/include/Spectre/Graphics/Image.h b/include/Spectre/Graphics/Image.h index 11af7dc..51fd3ab 100644 --- a/include/Spectre/Graphics/Image.h +++ b/include/Spectre/Graphics/Image.h @@ -13,13 +13,16 @@ namespace sp { class Image { public : + enum Channels { + Alpha, + RGB, + RGBA + }; + Image(); - void create(unsigned width, unsigned height, const Color& color = Color::Black); - - void create(unsigned width, unsigned height, const void* pixels); - void create(PixelFormat format, unsigned width, unsigned height, const Color& color = Color::Black); - void create(PixelFormat format, unsigned width, unsigned height, const void* pixels); + void create(unsigned width, unsigned height, const Color& color = Color::Black, enum Channels comp = Channels::RGBA); + void create(unsigned width, unsigned height, const void* pixels, PixelFormat format = PixelFormat::PF_RGBA); const Vector2u& getSize() const; @@ -27,7 +30,7 @@ public : unsigned int getHeight() const; - unsigned int getBpp() const; + unsigned int getNumChannels() const; unsigned int getStride() const; @@ -46,7 +49,7 @@ public : Color getPixel(unsigned x, unsigned y) const; - void setPixels(const void* pixels); + void setPixels(const void* pixels, PixelFormat format = PixelFormat::PF_RGBA); const unsigned char* getPixels() const; @@ -56,7 +59,7 @@ private : Vector2u m_size; - PixelFormat m_format; + enum Channels m_channels; std::vector m_pixels; }; diff --git a/source/Graphics/Font/Engine/FreeTypeEngine.cpp b/source/Graphics/Font/Engine/FreeTypeEngine.cpp index e82e73b..2c546b9 100644 --- a/source/Graphics/Font/Engine/FreeTypeEngine.cpp +++ b/source/Graphics/Font/Engine/FreeTypeEngine.cpp @@ -99,10 +99,7 @@ Glyph FreeTypeEngine::loadGlyph(unsigned int codepoint, Image& img, unsigned int FT_Glyph_To_Bitmap(&glyph_info, FT_RENDER_MODE_NORMAL, 0, true); FT_Bitmap& bmp = reinterpret_cast(glyph_info)->bitmap; - img.create(PixelFormat::PF_Alpha, - bmp.width, - bmp.rows, - bmp.buffer); + img.create(bmp.width, bmp.rows, bmp.buffer, PixelFormat::PF_Alpha); glyph.offset.x = static_cast(metrics.horiBearingX / (1 << 6)); glyph.offset.y = static_cast(metrics.horiBearingY / (1 << 6)); diff --git a/source/Graphics/Image.cpp b/source/Graphics/Image.cpp index f04de34..f01c9c5 100644 --- a/source/Graphics/Image.cpp +++ b/source/Graphics/Image.cpp @@ -10,17 +10,17 @@ static ImageLoader _loader; Image::Image() : m_size (0, 0), -m_format (PF_Unknown) +m_channels (RGBA) { } -void Image::create(unsigned width, unsigned height, const Color& color) +void Image::create(unsigned width, unsigned height, const Color& color, enum Channels comp) { m_size.x = width; m_size.y = height; - m_format = PixelFormat::PF_RGBA; + m_channels = comp; - m_pixels.resize(m_size.x * m_size.y * (getBpp() / 8)); + m_pixels.resize(m_size.x * m_size.y * getNumChannels()); for(size_t i = 0; i < m_pixels.size(); i += 4) { @@ -31,48 +31,12 @@ void Image::create(unsigned width, unsigned height, const Color& color) } } -void Image::create(unsigned width, unsigned height, const void* pixels) -{ - create(PixelFormat::PF_RGBA, width, height, pixels); -} - -void Image::create(PixelFormat format, unsigned width, unsigned height, const Color& color) +void Image::create(unsigned width, unsigned height, const void* pixels, PixelFormat format) { m_size.x = width; m_size.y = height; - m_format = format; - m_pixels.resize(m_size.x * m_size.y * (getBpp() / 8)); - - if (getBpp() == 32) { - for(size_t i = 0; i < m_pixels.size(); i += 4) { - - m_pixels[i+0] = color.r; - m_pixels[i+1] = color.g; - m_pixels[i+2] = color.b; - m_pixels[i+3] = color.a; - } - } else if (getBpp() == 24) { - for(size_t i = 0; i < m_pixels.size(); i += 3) { - - m_pixels[i+0] = color.r; - m_pixels[i+1] = color.g; - m_pixels[i+2] = color.b; - } - } else { - for(size_t i = 0; i < m_pixels.size(); i += 1) { - m_pixels[i] = color.a; - } - } -} - -void Image::create(PixelFormat format, unsigned width, unsigned height, const void* pixels) -{ - m_size.x = width; - m_size.y = height; - m_format = format; - - setPixels(pixels); + setPixels(pixels, format); } const Vector2u& Image::getSize() const @@ -90,31 +54,36 @@ unsigned int Image::getHeight() const return m_size.y; } -unsigned int Image::getBpp() const +unsigned int Image::getNumChannels() const { - switch(m_format) { - case PixelFormat::PF_RGBA : return 32; - case PixelFormat::PF_RGB : return 24; - case PixelFormat::PF_Alpha : return 8; - case PixelFormat::PF_Unknown : + switch(m_channels) { + case Channels::RGBA : return 4; + case Channels::RGB : return 3; + case Channels::Alpha : default : break; } - return 0; + return 1; } unsigned int Image::getStride() const { - return m_size.x * (getBpp() / 8); + return m_size.x * getNumChannels(); } PixelFormat Image::getFormat() const { - return m_format; + switch(m_channels) { + case Channels::RGBA : return PixelFormat::PF_RGBA; + case Channels::RGB : return PixelFormat::PF_RGB; + case Channels::Alpha : + default : break; + } + return PixelFormat::PF_Alpha; } bool Image::hasAlpha() const { - return m_format == PixelFormat::PF_RGBA || m_format == PixelFormat::PF_Alpha; + return m_channels != Channels::RGB; } bool Image::loadFromFile(const std::string& filename) @@ -138,17 +107,17 @@ void Image::saveToFile(const std::string& filename) const void Image::setPixel(unsigned x, unsigned y, const Color& c) { - unsigned char *base = m_pixels.data() + ((getBpp() / 8) * ((y * m_size.x) + x)); + unsigned char *base = m_pixels.data() + (getNumChannels() * ((y * m_size.x) + x)); - if (m_format == PixelFormat::PF_RGB || m_format == PixelFormat::PF_RGBA) { + if (m_channels == RGB || m_channels == RGBA) { base[0] = c.r; base[1] = c.g; base[2] = c.b; - if (m_format == PixelFormat::PF_RGBA) { + if (m_channels == RGBA) { base[3] = c.a; } } - else if (m_format == PixelFormat::PF_Alpha) { + else if (m_channels == Alpha) { base[0] = c.a; } } @@ -156,21 +125,21 @@ void Image::setPixel(unsigned x, unsigned y, const Color& c) Color Image::getPixel(unsigned x, unsigned y) const { Color c; - const unsigned char *base = m_pixels.data() + ((getBpp() / 8) * ((y * m_size.x) + x)); + const unsigned char *base = m_pixels.data() + (getNumChannels() * ((y * m_size.x) + x)); // RGB / RGBA formats. - if (m_format == PixelFormat::PF_RGB || m_format == PixelFormat::PF_RGBA) { + if (m_channels == RGB || m_channels == RGBA) { c.r = base[0]; c.g = base[1]; c.b = base[2]; - if (m_format == PixelFormat::PF_RGBA) { + if (m_channels == RGBA) { c.a = base[3]; } else { c.a = 255; } } // Alpha, single channel format. - else if (m_format == PixelFormat::PF_Alpha) { + else if (m_channels == Alpha) { c = Color(0, 0, 0, base[0]); } return c; @@ -194,11 +163,17 @@ void Image::flipY() } } -void Image::setPixels(const void *pixels) +void Image::setPixels(const void *pixels, PixelFormat format) { - unsigned int size = m_size.y * getStride(); + if (format == PixelFormat::PF_RGB) { + m_channels = RGB; + } else if (format == PixelFormat::PF_RGBA) { + m_channels = RGBA; + } else if (format == PixelFormat::PF_Alpha) { + m_channels = Alpha; + } - m_pixels.resize(size); + m_pixels.resize(m_size.y * getStride()); memcpy(&m_pixels[0], pixels, m_pixels.size()); } diff --git a/source/Graphics/Texture.cpp b/source/Graphics/Texture.cpp index ddf8397..b9afffe 100644 --- a/source/Graphics/Texture.cpp +++ b/source/Graphics/Texture.cpp @@ -89,11 +89,7 @@ void Texture::create(const Image& image) enable(); - if (image.getBpp() == 32) { - glPixelStorei(GL_UNPACK_ALIGNMENT, 4); - } else { - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - } + glPixelStorei(GL_UNPACK_ALIGNMENT, image.getNumChannels()); srcFormat = pixelFormatToGL(image.getFormat()); glFormat = pixelFormatToInternal(image.getFormat()); @@ -149,11 +145,7 @@ void Texture::update(vec2u pos, const Image& image) enable(); - if (image.getFormat() == PixelFormat::PF_RGBA) { - glPixelStorei(GL_UNPACK_ALIGNMENT, 4); - } else { - glPixelStorei(GL_UNPACK_ALIGNMENT, 1); - } + glPixelStorei(GL_UNPACK_ALIGNMENT, image.getNumChannels()); format = pixelFormatToGL(image.getFormat()); @@ -185,7 +177,7 @@ Image Texture::copyToImage() const GL_UNSIGNED_BYTE, &pixels[0]); - img.create(m_format, m_size.x, m_size.y, &pixels[0]); + img.create(m_size.x, m_size.y, &pixels[0], m_format); disable(); } From 4f04a8e7c99331c427d4bbc863dc0addc61a685f Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 22 Oct 2020 13:07:40 +0200 Subject: [PATCH 089/361] include/Spectre/Graphics/PixelFormat.h: Define 32BRG and 32BRGA formats. --- include/Spectre/Graphics/PixelFormat.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/include/Spectre/Graphics/PixelFormat.h b/include/Spectre/Graphics/PixelFormat.h index c46c0f9..8eda43d 100644 --- a/include/Spectre/Graphics/PixelFormat.h +++ b/include/Spectre/Graphics/PixelFormat.h @@ -8,7 +8,9 @@ enum PixelFormat PF_Unknown = 0, PF_RGB = 1, PF_RGBA = 2, - PF_Alpha = 3, // 1 byte alpha channel. + PF_32BGR = 3, // 32 bits per pixel, 8 bits are used for blue, green, red. Last 8 bits are unused. + PF_32BGRA = 4, // 32 bits per pixel, 8 bits are used for blue, green, red, alpha. + PF_Alpha = 5, // 8 bit alpha channel. }; } // namespace From 02912b857b8bc9826269996e7938519cebf67378 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 22 Oct 2020 16:52:54 +0200 Subject: [PATCH 090/361] source/Graphics/Image.cpp: in setPixels() do proper conversion. --- source/Graphics/Image.cpp | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/source/Graphics/Image.cpp b/source/Graphics/Image.cpp index f01c9c5..6228e5f 100644 --- a/source/Graphics/Image.cpp +++ b/source/Graphics/Image.cpp @@ -165,16 +165,36 @@ void Image::flipY() void Image::setPixels(const void *pixels, PixelFormat format) { - if (format == PixelFormat::PF_RGB) { + switch(format) { + case PixelFormat::PF_RGB : + case PixelFormat::PF_32BGR : m_channels = RGB; - } else if (format == PixelFormat::PF_RGBA) { + break; + case PixelFormat::PF_RGBA : + case PixelFormat::PF_32BGRA : m_channels = RGBA; - } else if (format == PixelFormat::PF_Alpha) { + break; + default : m_channels = Alpha; } m_pixels.resize(m_size.y * getStride()); - memcpy(&m_pixels[0], pixels, m_pixels.size()); + + if (format == PixelFormat::PF_32BGR || format == PixelFormat::PF_32BGRA) { + const uint8_t *ptr = (const uint8_t *) pixels; + + for(int i = 0; i < m_pixels.size(); i += 4) { + m_pixels[i+0] = ptr[2]; + m_pixels[i+1] = ptr[1]; + m_pixels[i+2] = ptr[0]; + if (format == PixelFormat::PF_32BGRA) { + m_pixels[i+3] = ptr[3]; + } + ptr += 4; + } + } else { + memcpy(&m_pixels[0], pixels, m_pixels.size()); + } } const unsigned char* Image::getPixels() const From b78531a570db64dc1e5f7b8237ede9f299a035fb Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 22 Oct 2020 17:07:06 +0200 Subject: [PATCH 091/361] Adding source/Graphics/Image/Format/ico.h --- source/Graphics/Image/Format/ico.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 source/Graphics/Image/Format/ico.h diff --git a/source/Graphics/Image/Format/ico.h b/source/Graphics/Image/Format/ico.h new file mode 100644 index 0000000..3df9739 --- /dev/null +++ b/source/Graphics/Image/Format/ico.h @@ -0,0 +1,19 @@ + +#ifndef SPECTRE_GRAPHICS_IMAGE_FORMAT_ICO_H +#define SPECTRE_GRAPHICS_IMAGE_FORMAT_ICO_H + +#include + +typedef struct _ICONDIRENTRY { + uint8_t width; // width, in pixels. + uint8_t height; // height, in pixels + uint8_t num_colors; // Number of colors (0 if >= 8bpp) + uint16_t color_planes; // Color planes + uint16_t bpp; // Bits per pixel + uint32_t size; // size of the image, in bytes. + uint32_t offset; // offset from the start of ICO +} ICONDIRENTRY; + +#define ICONDIRENTRY_SIZE 16 /* Size as stored on disk (no padding) */ + +#endif /* SPECTRE_GRAPHICS_IMAGE_FORMAT_ICO_H */ From 37d495fca3506f63e36ff49e8d67efc136e5079e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 22 Oct 2020 17:07:42 +0200 Subject: [PATCH 092/361] Adding source/Graphics/Image/IcoFormat --- engine.build.lua | 1 + source/Graphics/Image/IcoFormat.cpp | 76 +++++++++++++++++++++++++++++ source/Graphics/Image/IcoFormat.h | 19 ++++++++ 3 files changed, 96 insertions(+) create mode 100644 source/Graphics/Image/IcoFormat.cpp create mode 100644 source/Graphics/Image/IcoFormat.h diff --git a/engine.build.lua b/engine.build.lua index 35a8e2a..64a7ecb 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -99,6 +99,7 @@ local graphics_module = Module("source/Graphics", { -- Image "Image.cpp", "ImageLoader.cpp", + "Image/IcoFormat.cpp", "OpenGL.cpp", "GL/glad.c", diff --git a/source/Graphics/Image/IcoFormat.cpp b/source/Graphics/Image/IcoFormat.cpp new file mode 100644 index 0000000..721a106 --- /dev/null +++ b/source/Graphics/Image/IcoFormat.cpp @@ -0,0 +1,76 @@ + +#include "IcoFormat.h" +#include +#include +#include + +#include "Format/ico.h" + +namespace sp { +namespace image { + +ICONDIRENTRY* findLargestImage(ICONDIRENTRY *ent, uint16_t size) { + + uint32_t idx = 0, lgsz = 0, sz; + + for (int i = 0; i < size; i++) { + sz = ent[i].width * ent[i].height; + if (sz > lgsz) { + lgsz = sz; + idx = i; + } + } + return ent + idx; +} + +bool IcoFormat::decode(Image& img, const unsigned char *data, unsigned size) +{ + uint8_t *pixels; + PixelFormat format; + ICONDIRENTRY *ent; + ICONDIRENTRY *largest; + uint16_t type; + uint16_t num_ent; + + type = system::ltoh16(data + 2); + num_ent = system::ltoh16(data + 4); + + // Type: 1 = ICO, 2 = CUR + if (type != 0x0001 || num_ent < 1) { + return false; + } + + // Allocate ICONDIRENT for all images in the file. + ent = (ICONDIRENTRY *) malloc(sizeof(ICONDIRENTRY) * num_ent); + if (!ent) { + return false; + } + + for (int i = 0; i < num_ent; i++) { + unsigned int p = 6 + (i * ICONDIRENTRY_SIZE); + ent[i].width = data[p + 0]; + ent[i].height = data[p + 1]; + ent[i].num_colors = data[p + 2]; + ent[i].color_planes = data[p + 4]; + ent[i].bpp = data[p + 6]; + ent[i].size = system::ltoh32(data + p + 8); + ent[i].offset = system::ltoh32(data + p + 12); + } + + // Find Largest image + largest = findLargestImage(ent, num_ent); + + if (largest->bpp == 32) { + format = PixelFormat::PF_32BGRA; + } else { + format = PixelFormat::PF_32BGR; + } + + // NOTE: plus 40 bytes here to skip over the DIB header. + img.create(largest->width, largest->height, data + largest->offset + 40, format); + free(ent); + + return true; +} + +}} // namespace sp::image diff --git a/source/Graphics/Image/IcoFormat.h b/source/Graphics/Image/IcoFormat.h new file mode 100644 index 0000000..bd8c729 --- /dev/null +++ b/source/Graphics/Image/IcoFormat.h @@ -0,0 +1,19 @@ + +#ifndef SPECTRE_GRAPHICS_IMAGE_ICOFORMAT_H +#define SPECTRE_GRAPHICS_IMAGE_ICOFORMAT_H + +#include + +namespace sp { +namespace image { + +class IcoFormat +{ +public : + + bool decode(Image& img, const unsigned char *data, unsigned size); +}; + +}} // namespace sp::image + +#endif /* SPECTRE_GRAPHICS_IMAGE_ICOFORMAT_H */ From acf96a0971e1a8dd39d949cc1546b4309ad64158 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 22 Oct 2020 17:08:16 +0200 Subject: [PATCH 093/361] source/Graphics/ImageLoader.cpp: load .ico files. --- source/Graphics/ImageLoader.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/source/Graphics/ImageLoader.cpp b/source/Graphics/ImageLoader.cpp index fc44b3f..243af4d 100644 --- a/source/Graphics/ImageLoader.cpp +++ b/source/Graphics/ImageLoader.cpp @@ -5,6 +5,8 @@ #include #include "ImageLoader.h" +#include "Image/IcoFormat.h" + // Disable some file formats that we don't use. #define STBI_NO_PSD #define STBI_NO_PIC @@ -50,6 +52,15 @@ bool ImageLoader::loadFromMemory(const void *data, unsigned size, Image& img) int w, h, n_comp; const stbi_uc *ptr = (const stbi_uc *) data; + if (ptr[0] == 0x0) { + image::IcoFormat ico; + bool ret = ico.decode(img, ptr, size); + if (!ret) { + m_error = stbi_failure_reason(); + } + return ret; + } + unsigned char *pixels = stbi_load_from_memory(ptr, size, &w, &h, &n_comp, 4); if (pixels) { @@ -103,7 +114,7 @@ bool ImageLoader::encodePNG(const Image& img, std::vector& data) unsigned char *raw = (unsigned char*) img.getPixels(); unsigned char *buf; - buf = stbi_write_png_to_mem(raw, img.getStride(), img.getWidth(), img.getHeight(), img.getBpp() / 8, &buf_len); + buf = stbi_write_png_to_mem(raw, img.getStride(), img.getWidth(), img.getHeight(), img.getNumChannels(), &buf_len); if (buf && buf_len > 0) { data.resize(buf_len); From 391d6171171946be633f3d3b26c9b45fec66dd04 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 22 Oct 2020 17:10:09 +0200 Subject: [PATCH 094/361] Adding assets/debug_icon.ico --- assets/debug_icon.ico | Bin 0 -> 1086 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assets/debug_icon.ico diff --git a/assets/debug_icon.ico b/assets/debug_icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e9888695d0d79e0c913176f824817f6f57ec16ac GIT binary patch literal 1086 zcmZQzU}Ruq5D);-3Je-73=Con3=A3!3=9Gc3=9ek5OD?^;2*=kxToL{Qu8@1!EJ$q8pnsuo##?GkBo&6YVBYI8hQNgH%6Sbbx~cOkj~9 JHm-(}egG^YAl(1} literal 0 HcmV?d00001 From fadd24fa5120177e48d77280ad78c498e8b571c9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 22 Oct 2020 17:16:27 +0200 Subject: [PATCH 095/361] include/Spectre/Graphics/PixelFormat.h: Some documentation --- include/Spectre/Graphics/PixelFormat.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/Spectre/Graphics/PixelFormat.h b/include/Spectre/Graphics/PixelFormat.h index 8eda43d..b2a1ac4 100644 --- a/include/Spectre/Graphics/PixelFormat.h +++ b/include/Spectre/Graphics/PixelFormat.h @@ -6,8 +6,8 @@ namespace sp { enum PixelFormat { PF_Unknown = 0, - PF_RGB = 1, - PF_RGBA = 2, + PF_RGB = 1, // Standard RGB: 24 bits per pixel, 8 bits are used for red, green, blue. + PF_RGBA = 2, // Standard RGBA: 32 bits per pixel, 8 bits are used for red, green, blue, alpha. PF_32BGR = 3, // 32 bits per pixel, 8 bits are used for blue, green, red. Last 8 bits are unused. PF_32BGRA = 4, // 32 bits per pixel, 8 bits are used for blue, green, red, alpha. PF_Alpha = 5, // 8 bit alpha channel. From 5d391ef70cacd97003b370a74e2a39816c205773 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 22 Oct 2020 17:16:39 +0200 Subject: [PATCH 096/361] source/Graphics/Texture.cpp: minor fix. --- source/Graphics/Texture.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/Graphics/Texture.cpp b/source/Graphics/Texture.cpp index b9afffe..d275ce6 100644 --- a/source/Graphics/Texture.cpp +++ b/source/Graphics/Texture.cpp @@ -29,8 +29,9 @@ namespace { } Texture::Texture() : -m_id (0), -m_size (0, 0) +m_id (0), +m_size (0, 0), +m_format (PixelFormat::PF_Unknown) { } From a72ebf3d15ae8981f04fc3c441aa848427ec858b Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 22 Oct 2020 17:18:06 +0200 Subject: [PATCH 097/361] include/Spectre/Graphics/Texture.h: indentation fix. --- include/Spectre/Graphics/Texture.h | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/include/Spectre/Graphics/Texture.h b/include/Spectre/Graphics/Texture.h index d90dd92..3829bec 100644 --- a/include/Spectre/Graphics/Texture.h +++ b/include/Spectre/Graphics/Texture.h @@ -16,19 +16,19 @@ class Texture : public NonCopyable { public: enum Filter { - Nearest = 0x2600, - Linear = 0x2601, + Nearest = 0x2600, + Linear = 0x2601, NearestMipmapNearest = 0x2700, - NearestMipmapLinear = 0x2702, - LinearMipmapNearest = 0x2701, - LinearMipmapLinear = 0x2703, + NearestMipmapLinear = 0x2702, + LinearMipmapNearest = 0x2701, + LinearMipmapLinear = 0x2703, }; enum WrapMode { Repeat = 0x2901, - RepeatMirror = 0x8370, + RepeatMirror = 0x8370, ClampToEdge = 0x812F, - ClampToBorder = 0x812D, + ClampToBorder = 0x812D, }; Texture(); @@ -85,9 +85,9 @@ protected : unsigned int m_id; - Vector2u m_size; + Vector2u m_size; - PixelFormat m_format; + PixelFormat m_format; }; } // namespace sp From 60653509fa1a896677d9049dd36336bc871b6258 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 3 Nov 2020 11:25:48 +0100 Subject: [PATCH 098/361] source/Platform/PlatformDisplay.h: change setIcon() parameters to take a pixel array instead of filename --- source/Platform/PlatformDisplay.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/Platform/PlatformDisplay.h b/source/Platform/PlatformDisplay.h index f805732..2c88416 100644 --- a/source/Platform/PlatformDisplay.h +++ b/source/Platform/PlatformDisplay.h @@ -4,9 +4,10 @@ #include #include +#include +#include // Low-level platform dependant API. -#include namespace sp { @@ -36,7 +37,7 @@ public : virtual void setCaption(const std::string& caption) = 0; - virtual void setIcon(const std::string& icon) = 0; + virtual void setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) = 0; virtual void showCursor(bool value) = 0; From 2be3c66a2dae0a4fa63141b1f2c975413e4a6d2b Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 3 Nov 2020 11:26:59 +0100 Subject: [PATCH 099/361] Platform/Win32/Win32Display: implement the new setIcon() with pixel array. --- source/Platform/Win32/Win32Display.cpp | 70 ++++++++++++++++++++++---- source/Platform/Win32/Win32Display.h | 3 +- 2 files changed, 62 insertions(+), 11 deletions(-) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index f8bbe49..c24b61a 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -127,21 +127,71 @@ void Win32Display::showCursor(bool value) ::SetCursor(m_cursor); } -void Win32Display::setIcon(const std::string& icon) +void Win32Display::setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) { - HICON hIcon = (HICON) ::LoadImage(0, icon.c_str(), IMAGE_ICON, - 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE); + ::HDC hdc; + ::ICONINFO ii; + ::BITMAPV5HEADER bi; + ::HBITMAP bmp_color, bmp_mask; + unsigned char *bmp_data = NULL; - if (hIcon) { + ::ZeroMemory(&bi, sizeof(bi)); + bi.bV5Size = sizeof(bi); + bi.bV5Width = width; + bi.bV5Height = height; + bi.bV5Planes = 1; + bi.bV5BitCount = 32; + bi.bV5Compression = BI_RGB; + bi.bV5CSType = LCS_WINDOWS_COLOR_SPACE; + bi.bV5Intent = LCS_GM_IMAGES; - if (m_icon) { - DestroyIcon(m_icon); - } - m_icon = hIcon; + hdc = ::GetDC(NULL); + bmp_color = ::CreateDIBSection(hdc, reinterpret_cast(&bi), + DIB_RGB_COLORS, (void **) &bmp_data, NULL, 0); + ::ReleaseDC(NULL, hdc); - ::SendMessage(m_handle, WM_SETICON, ICON_SMALL, (LPARAM) hIcon); - ::SendMessage(m_handle, WM_SETICON, ICON_BIG, (LPARAM) hIcon); + if (!bmp_color) { + Log::error("Win32Display::setIcon() - Failed to create RGBA bitmap"); + return; } + + bmp_mask = CreateBitmap(width, height, 1, 1, NULL); + if (!bmp_mask) { + Log::error("Win32Display::setIcon() - Failed to create mask bitmap"); + ::DeleteObject(bmp_color); + return; + } + + // pixels are always RGBA, WinApi wants BGRA + for(int i = 0; i < width * height; i++) { + bmp_data[i * 4 + 0] = pixels[i * 4 + 2]; // R <- B + bmp_data[i * 4 + 1] = pixels[i * 4 + 1]; // G <- G + bmp_data[i * 4 + 2] = pixels[i * 4 + 0]; // B <- R + bmp_data[i * 4 + 3] = pixels[i * 4 + 3]; // A <- A + } + + ::ZeroMemory(&ii, sizeof(ii)); + ii.fIcon = TRUE; + ii.xHotspot = 0; + ii.yHotspot = 0; + ii.hbmColor = bmp_color; + ii.hbmMask = bmp_mask; + + if (m_icon) { + ::DestroyIcon(m_icon); + } + + m_icon = CreateIconIndirect(&ii); + + if (m_icon) { + ::SendMessage(m_handle, WM_SETICON, ICON_SMALL, (LPARAM) m_icon); + ::SendMessage(m_handle, WM_SETICON, ICON_BIG, (LPARAM) m_icon); + } else { + Log::error("Win32Display::setIcon() - Failed to create icon"); + } + + ::DeleteObject(bmp_color); + ::DeleteObject(bmp_mask); } void Win32Display::registerClass() diff --git a/source/Platform/Win32/Win32Display.h b/source/Platform/Win32/Win32Display.h index 7a08cb4..d022da1 100644 --- a/source/Platform/Win32/Win32Display.h +++ b/source/Platform/Win32/Win32Display.h @@ -4,6 +4,7 @@ #include "Win32GLContext.h" #include +#include #include namespace sp { @@ -30,7 +31,7 @@ public : virtual void setCaption(const std::string& caption); - virtual void setIcon(const std::string& icon); + virtual void setIcon(unsigned int width, unsigned int height, const uint8_t *pixels); virtual void showCursor(bool value); From 82add501579b597bd555f3d0575f92baf6c94847 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 3 Nov 2020 11:28:08 +0100 Subject: [PATCH 100/361] Spectre/Display/Display: implement setIcon() with pixel array parameter. --- include/Spectre/Display/Display.h | 3 +++ source/Display/Display.cpp | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/include/Spectre/Display/Display.h b/include/Spectre/Display/Display.h index 6f5965f..2f5271e 100644 --- a/include/Spectre/Display/Display.h +++ b/include/Spectre/Display/Display.h @@ -5,6 +5,7 @@ #include "DisplayMode.h" #include "DisplayDescription.h" #include +#include #include namespace sp { @@ -38,6 +39,8 @@ public : void setIcon(const std::string& filename); + void setIcon(unsigned int width, unsigned int height, const uint8_t *pixels); + void setDisplayMode(const DisplayMode& mode); const DisplayMode& getDisplayMode() const; diff --git a/source/Display/Display.cpp b/source/Display/Display.cpp index f70078f..050b737 100644 --- a/source/Display/Display.cpp +++ b/source/Display/Display.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include namespace sp { @@ -75,7 +76,16 @@ const std::string& Display::getCaption() const void Display::setIcon(const std::string& filename) { - m_impl->setIcon(filename); + Image img; + + if (img.loadFromFile(filename)) { + setIcon(img.getWidth(), img.getHeight(), img.getPixels()); + } +} + +void Display::setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) +{ + m_impl->setIcon(width, height, pixels); } void Display::setSize(unsigned int width, unsigned int height) From c731cda1a2ec83fa03fb3d5e01fb55c655c1a620 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 3 Nov 2020 14:20:36 +0100 Subject: [PATCH 101/361] Spectre/Graphics/PixelFormat: Rework source/Graphics/Image/IcoFormat.cpp: use new PixelFormat. source/Graphics/Image.cpp: update to confirm with new PixelFormat Spectre/Graphics/PixelFormat: add PF_getNumChannels() Spectre/Graphics/PixelFormat: Rework the enum with proper naming convention and documentation. --- engine.build.lua | 1 + include/Spectre/Graphics/PixelFormat.h | 41 ++++++++++++++++++++++---- source/Graphics/Image.cpp | 17 +++++------ source/Graphics/Image/IcoFormat.cpp | 4 +-- source/Graphics/PixelFormat.cpp | 26 ++++++++++++++++ 5 files changed, 73 insertions(+), 16 deletions(-) create mode 100644 source/Graphics/PixelFormat.cpp diff --git a/engine.build.lua b/engine.build.lua index 64a7ecb..9d3f97b 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -100,6 +100,7 @@ local graphics_module = Module("source/Graphics", { "Image.cpp", "ImageLoader.cpp", "Image/IcoFormat.cpp", + "PixelFormat.cpp", "OpenGL.cpp", "GL/glad.c", diff --git a/include/Spectre/Graphics/PixelFormat.h b/include/Spectre/Graphics/PixelFormat.h index b2a1ac4..c39e311 100644 --- a/include/Spectre/Graphics/PixelFormat.h +++ b/include/Spectre/Graphics/PixelFormat.h @@ -1,18 +1,49 @@ #ifndef SPECTRE_GRAPHICS_PIXELFORMAT_H #define SPECTRE_GRAPHICS_PIXELFORMAT_H +#include + namespace sp { enum PixelFormat { PF_Unknown = 0, - PF_RGB = 1, // Standard RGB: 24 bits per pixel, 8 bits are used for red, green, blue. - PF_RGBA = 2, // Standard RGBA: 32 bits per pixel, 8 bits are used for red, green, blue, alpha. - PF_32BGR = 3, // 32 bits per pixel, 8 bits are used for blue, green, red. Last 8 bits are unused. - PF_32BGRA = 4, // 32 bits per pixel, 8 bits are used for blue, green, red, alpha. - PF_Alpha = 5, // 8 bit alpha channel. + PF_Alpha = 1, // 8 bit alpha channel. + + // Byte-order formats. + // Pixels are always ordered with the first channel at the first byte, second channel at the second byte. + // --------------------------- + + PF_RGB = 2, // Standard RGB: 24 bits per pixel, 8 bits are used for red, green, blue. + PF_RGBX = 3, // 32 bits per pixel, 8 bits are used for red, green, Last 8 bits are unused. + PF_RGBA = 4, // Standard RGBA: 32 bits per pixel, 8 bits are used for red, green, blue, alpha. + PF_BGR = 5, // 24 bits per pixel, 8 bits are used for blue, green, red. + PF_BGRX = 6, // 32 bits per pixel, 8 bits are used for blue, green, red. Last 8 bits are unused. + PF_BGRA = 7, // 32 bits per pixel, 8 bits are used for blue, green, red, alpha. + + // Packed formats. + // --------------------------- + + // 32-bit: Pixels are in ordered in 32-bit words. where the first channel is stored at the most significant byte (MSB). + // these formats are architecture dependant (litte/big-endian). + // (MSB) | byte 0 | byte 1 | byte 2 | byte 3 | (LSB) + PF_RGBX32 = 8, // | rrrr rrrr | gggg gggg | bbbb bbbb | xxxx xxxx | + PF_RGBA32 = 9, // | rrrr rrrr | gggg gggg | bbbb bbbb | aaaa aaaa | + PF_BGRX32 = 10, // | bbbb bbbb | gggg gggg | rrrr rrrr | xxxx xxxx | + PF_BGRA32 = 11, // | bbbb bbbb | gggg gggg | rrrr rrrr | aaaa aaaa | + + // 24-bit (unsuppored for now) + //PF_RGB24 = 12, // | rrrr rrrr | gggg gggg | bbbb bbbb | + //PF_BGR24 = 13, // | bbbb bbbb | gggg gggg | rrrr rrrr | + + // 16-bit (unsuppored for now) + //PF_RGB565 = 14, // | rrrr rggg | gggb bbbb | + //PF_RGBA5551 = 15 // | rrrr rggg | ggb bbbba | + //PF_RGBX5551 = 16 // | rrrr rggg | ggb bbbbx | }; +uint8_t PF_getNumChannels(enum PixelFormat format); + } // namespace #endif /* SPECTRE_GRAPHICS_PIXELFORMAT_H */ diff --git a/source/Graphics/Image.cpp b/source/Graphics/Image.cpp index 6228e5f..cb469b1 100644 --- a/source/Graphics/Image.cpp +++ b/source/Graphics/Image.cpp @@ -165,29 +165,28 @@ void Image::flipY() void Image::setPixels(const void *pixels, PixelFormat format) { - switch(format) { - case PixelFormat::PF_RGB : - case PixelFormat::PF_32BGR : - m_channels = RGB; - break; - case PixelFormat::PF_RGBA : - case PixelFormat::PF_32BGRA : + switch(PF_getNumChannels(format)) { + case 4: m_channels = RGBA; break; + case 3: + m_channels = RGB; + break; default : m_channels = Alpha; } m_pixels.resize(m_size.y * getStride()); - if (format == PixelFormat::PF_32BGR || format == PixelFormat::PF_32BGRA) { + // TODO: Move pixel format convertion to it's own function(s) + if (format == PixelFormat::PF_BGR || format == PixelFormat::PF_BGRA) { const uint8_t *ptr = (const uint8_t *) pixels; for(int i = 0; i < m_pixels.size(); i += 4) { m_pixels[i+0] = ptr[2]; m_pixels[i+1] = ptr[1]; m_pixels[i+2] = ptr[0]; - if (format == PixelFormat::PF_32BGRA) { + if (format == PixelFormat::PF_BGRA) { m_pixels[i+3] = ptr[3]; } ptr += 4; diff --git a/source/Graphics/Image/IcoFormat.cpp b/source/Graphics/Image/IcoFormat.cpp index 721a106..14ec25b 100644 --- a/source/Graphics/Image/IcoFormat.cpp +++ b/source/Graphics/Image/IcoFormat.cpp @@ -61,9 +61,9 @@ bool IcoFormat::decode(Image& img, const unsigned char *data, unsigned size) largest = findLargestImage(ent, num_ent); if (largest->bpp == 32) { - format = PixelFormat::PF_32BGRA; + format = PixelFormat::PF_BGRA; } else { - format = PixelFormat::PF_32BGR; + format = PixelFormat::PF_BGR; } // NOTE: plus 40 bytes here to skip over the DIB header. diff --git a/source/Graphics/PixelFormat.cpp b/source/Graphics/PixelFormat.cpp new file mode 100644 index 0000000..1bdee3f --- /dev/null +++ b/source/Graphics/PixelFormat.cpp @@ -0,0 +1,26 @@ + +#include + +namespace sp { + +uint8_t PF_getNumChannels(enum PixelFormat format) +{ + switch(format) { + case PixelFormat::PF_RGBA : + case PixelFormat::PF_RGBA32 : + case PixelFormat::PF_BGRA : + case PixelFormat::PF_BGRA32 : + return 4; + case PixelFormat::PF_RGB : + case PixelFormat::PF_RGBX : + case PixelFormat::PF_RGBX32 : + case PixelFormat::PF_BGR : + case PixelFormat::PF_BGRX : + case PixelFormat::PF_BGRX32 : + return 3; + default : + return 1; + } +} + +} // namespace sp From 66a4011f4b12dc2fdc74dee5caedec26edfac143 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 5 Dec 2020 15:06:22 +0100 Subject: [PATCH 102/361] Spectre/Core/String: Adding to_string() for signed int. --- include/Spectre/Core/String.h | 2 ++ source/Core/String.cpp | 7 +++++++ 2 files changed, 9 insertions(+) diff --git a/include/Spectre/Core/String.h b/include/Spectre/Core/String.h index 5d16471..6699263 100644 --- a/include/Spectre/Core/String.h +++ b/include/Spectre/Core/String.h @@ -10,6 +10,8 @@ namespace sp { namespace core { // Convertion functions from standard c/c++ types. + std::string to_string(int value); + std::string to_string(unsigned int value); std::string to_string(float value); diff --git a/source/Core/String.cpp b/source/Core/String.cpp index 7e8c092..6bd8a74 100644 --- a/source/Core/String.cpp +++ b/source/Core/String.cpp @@ -4,6 +4,13 @@ namespace sp { +std::string core::to_string(int value) +{ + char buf[32]; + sprintf(buf, "%i", value); + return std::string(buf); +} + std::string core::to_string(unsigned int value) { char buf[32]; From 92f42a08fb6cb533daba8bcb9063b17dafb35bc1 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 5 Dec 2020 15:19:18 +0100 Subject: [PATCH 103/361] Spectre/System/Event: Adding toString() --- include/Spectre/System/Event.h | 2 ++ source/System/Event.cpp | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/include/Spectre/System/Event.h b/include/Spectre/System/Event.h index 657e461..70a39e0 100644 --- a/include/Spectre/System/Event.h +++ b/include/Spectre/System/Event.h @@ -58,6 +58,8 @@ public : Event(Type type = None); + std::string toString() const; + // Helper methods static Event createSize(Display *display, int width, int height); diff --git a/source/System/Event.cpp b/source/System/Event.cpp index 43dee46..33b252a 100644 --- a/source/System/Event.cpp +++ b/source/System/Event.cpp @@ -1,5 +1,6 @@ #include +#include namespace sp { @@ -8,6 +9,23 @@ type (type) { } +std::string Event::toString() const +{ + switch(type) { + case Type::Quit : + return "Quit"; + case Type::Size : + return "Size (" + core::to_string(size.width) + ", " + core::to_string(size.height) + ")"; + case Type::Key : + return "Key '" + key.getKeyName() + "' " + (key.pressed ? "pressed" : "released"); + case Type::MouseButton : + return "MouseButton '" + mouseButton.getName() + "' " + (mouseButton.pressed ? "pressed" : "released"); + case Type::MouseMove : + return "MouseMove (" + core::to_string(mouseMove.x) + ", " + core::to_string(mouseMove.y) + ")"; + } + return "Unknown"; +} + std::string Event::KeyEvent::getKeyName() const { return Keyboard::getKeyName(code); From 363afe111b198930e961a1900e1965267b62ca5b Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 5 Dec 2020 15:22:48 +0100 Subject: [PATCH 104/361] source/Platform/Win32/Win32EventQueue.cpp: should not return status from DispatchMessage() this can falsely signal that we have translated a win32 event to engine event when in fact we have not. --- source/Platform/Win32/Win32EventQueue.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/Platform/Win32/Win32EventQueue.cpp b/source/Platform/Win32/Win32EventQueue.cpp index 38ab96d..8340521 100644 --- a/source/Platform/Win32/Win32EventQueue.cpp +++ b/source/Platform/Win32/Win32EventQueue.cpp @@ -73,7 +73,8 @@ LRESULT Win32EventQueue::processMessage(MSG msg, Event& event) } // Message was not intercepted. Pass down to window. - return DispatchMessage(&msg); + DispatchMessage(&msg); + return 1; } } // namespace sp From 0a1c18548d1af872c29047aefe4206385460e9c6 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 3 Nov 2020 17:04:18 +0100 Subject: [PATCH 105/361] source/Platform/PlatformDisplay.h: add grabCursor() to the interface. --- source/Platform/PlatformDisplay.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/Platform/PlatformDisplay.h b/source/Platform/PlatformDisplay.h index 2c88416..eaafe28 100644 --- a/source/Platform/PlatformDisplay.h +++ b/source/Platform/PlatformDisplay.h @@ -41,6 +41,8 @@ public : virtual void showCursor(bool value) = 0; + virtual void grabCursor(bool value) = 0; + protected : PlatformDisplay(); From e64d9cdce0e63159980227c893c044a8bc0f9e5d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 3 Nov 2020 17:05:06 +0100 Subject: [PATCH 106/361] Platform/Win32/Win32Display: implement grabCursor() --- source/Platform/Win32/Win32Display.cpp | 12 ++++++++++++ source/Platform/Win32/Win32Display.h | 2 ++ 2 files changed, 14 insertions(+) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index c24b61a..8d23e8b 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -127,6 +127,18 @@ void Win32Display::showCursor(bool value) ::SetCursor(m_cursor); } +void Win32Display::grabCursor(bool value) +{ + if (value) { + RECT rect; + GetClientRect(m_handle, &rect); + MapWindowPoints(m_handle, NULL, reinterpret_cast(&rect), 2); + ClipCursor(&rect); + } else { + ClipCursor(NULL); + } +} + void Win32Display::setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) { ::HDC hdc; diff --git a/source/Platform/Win32/Win32Display.h b/source/Platform/Win32/Win32Display.h index d022da1..83f7dda 100644 --- a/source/Platform/Win32/Win32Display.h +++ b/source/Platform/Win32/Win32Display.h @@ -35,6 +35,8 @@ public : virtual void showCursor(bool value); + virtual void grabCursor(bool value); + protected : void registerClass(); From 0a5681c87117758eb3a3f6f38492605b1cbe82a3 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 4 Nov 2020 16:34:53 +0100 Subject: [PATCH 107/361] Spectre/Display/Display: implement grabCursor() --- include/Spectre/Display/Display.h | 2 ++ source/Display/Display.cpp | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/include/Spectre/Display/Display.h b/include/Spectre/Display/Display.h index 2f5271e..cc7a687 100644 --- a/include/Spectre/Display/Display.h +++ b/include/Spectre/Display/Display.h @@ -51,6 +51,8 @@ public : void showCursor(bool value); + void grabCursor(bool value); + bool activate(bool value); // Enable/Disable Vertical Sync. diff --git a/source/Display/Display.cpp b/source/Display/Display.cpp index 050b737..43584c9 100644 --- a/source/Display/Display.cpp +++ b/source/Display/Display.cpp @@ -134,6 +134,11 @@ void Display::showCursor(bool value) m_impl->showCursor(value); } +void Display::grabCursor(bool value) +{ + m_impl->grabCursor(value); +} + bool Display::activate(bool value) { if (value) { From 33270d9f7bfdbafe9fbc3b08c5985a3c5383f353 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 4 Nov 2020 16:35:53 +0100 Subject: [PATCH 108/361] source/Platform/PlatformDisplay.h: add minimize() and maximize() to the interface --- source/Platform/PlatformDisplay.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/Platform/PlatformDisplay.h b/source/Platform/PlatformDisplay.h index eaafe28..c1505b6 100644 --- a/source/Platform/PlatformDisplay.h +++ b/source/Platform/PlatformDisplay.h @@ -35,6 +35,10 @@ public : virtual void setPosition(unsigned int x, unsigned int y) = 0; + virtual void minimize() = 0; + + virtual void maximize() = 0; + virtual void setCaption(const std::string& caption) = 0; virtual void setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) = 0; From 70f73c1d52195eb84c6874274bf016f21a6ddc97 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 4 Nov 2020 16:43:56 +0100 Subject: [PATCH 109/361] source/Platform/PlatformDisplay.h: add getPosition() to the intreface --- source/Platform/PlatformDisplay.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/Platform/PlatformDisplay.h b/source/Platform/PlatformDisplay.h index c1505b6..5e9d9f7 100644 --- a/source/Platform/PlatformDisplay.h +++ b/source/Platform/PlatformDisplay.h @@ -35,6 +35,8 @@ public : virtual void setPosition(unsigned int x, unsigned int y) = 0; + virtual Vector2u getPosition() const = 0; + virtual void minimize() = 0; virtual void maximize() = 0; From d7d8a23dc22551f3f5784bd9f36a88d1475db898 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 4 Nov 2020 19:27:24 +0100 Subject: [PATCH 110/361] Platform/Win32/Win32Display: implement getPosition() --- source/Platform/Win32/Win32Display.cpp | 7 +++++++ source/Platform/Win32/Win32Display.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index 8d23e8b..943f086 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -111,6 +111,13 @@ void Win32Display::setPosition(unsigned int x, unsigned int y) ::SetWindowPos(m_handle, NULL, x, y, 0, 0, SWP_NOSIZE); } +Vector2u Win32Display::getPosition() const +{ + RECT r; + GetWindowRect(m_handle, &r); + return Vector2u(r.left, r.top); +} + void Win32Display::setCaption(const std::string& caption) { ::SetWindowText(m_handle, caption.c_str()); diff --git a/source/Platform/Win32/Win32Display.h b/source/Platform/Win32/Win32Display.h index 83f7dda..2e968a2 100644 --- a/source/Platform/Win32/Win32Display.h +++ b/source/Platform/Win32/Win32Display.h @@ -29,6 +29,8 @@ public : virtual void setPosition(unsigned int x, unsigned int y); + virtual Vector2u getPosition() const; + virtual void setCaption(const std::string& caption); virtual void setIcon(unsigned int width, unsigned int height, const uint8_t *pixels); From 17759992c8620cb94d67456eba0843433a1235ed Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 4 Nov 2020 19:28:50 +0100 Subject: [PATCH 111/361] Platform/Win32/Win32Display: implement maximize() and minimize() --- source/Platform/Win32/Win32Display.cpp | 10 ++++++++++ source/Platform/Win32/Win32Display.h | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index 943f086..ae24aaa 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -118,6 +118,16 @@ Vector2u Win32Display::getPosition() const return Vector2u(r.left, r.top); } +void Win32Display::minimize() +{ + ::ShowWindow(m_handle, SW_MINIMIZE); +} + +void Win32Display::maximize() +{ + ::ShowWindow(m_handle, SW_MAXIMIZE); +} + void Win32Display::setCaption(const std::string& caption) { ::SetWindowText(m_handle, caption.c_str()); diff --git a/source/Platform/Win32/Win32Display.h b/source/Platform/Win32/Win32Display.h index 2e968a2..f5a357f 100644 --- a/source/Platform/Win32/Win32Display.h +++ b/source/Platform/Win32/Win32Display.h @@ -31,6 +31,10 @@ public : virtual Vector2u getPosition() const; + virtual void minimize(); + + virtual void maximize(); + virtual void setCaption(const std::string& caption); virtual void setIcon(unsigned int width, unsigned int height, const uint8_t *pixels); From 48b501e355cdca115971555803a824d427e8d966 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 4 Nov 2020 19:51:09 +0100 Subject: [PATCH 112/361] source/Platform/PlatformDisplay.h: add setVisible() to the interface --- source/Platform/PlatformDisplay.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/Platform/PlatformDisplay.h b/source/Platform/PlatformDisplay.h index 5e9d9f7..2147230 100644 --- a/source/Platform/PlatformDisplay.h +++ b/source/Platform/PlatformDisplay.h @@ -37,6 +37,8 @@ public : virtual Vector2u getPosition() const = 0; + virtual void setVisible(bool visible) = 0; + virtual void minimize() = 0; virtual void maximize() = 0; From 04db63aa49d1e837169d0fa3f9f5a38852d46ee0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 4 Nov 2020 19:52:20 +0100 Subject: [PATCH 113/361] Platform/Win32/Win32Display: implement setVisible() --- source/Platform/Win32/Win32Display.cpp | 5 +++++ source/Platform/Win32/Win32Display.h | 2 ++ 2 files changed, 7 insertions(+) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index ae24aaa..885f5a4 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -118,6 +118,11 @@ Vector2u Win32Display::getPosition() const return Vector2u(r.left, r.top); } +void Win32Display::setVisible(bool visible) +{ + ::ShowWindow(m_handle, visible ? SW_SHOW : SW_HIDE); +} + void Win32Display::minimize() { ::ShowWindow(m_handle, SW_MINIMIZE); diff --git a/source/Platform/Win32/Win32Display.h b/source/Platform/Win32/Win32Display.h index f5a357f..0e4ec85 100644 --- a/source/Platform/Win32/Win32Display.h +++ b/source/Platform/Win32/Win32Display.h @@ -31,6 +31,8 @@ public : virtual Vector2u getPosition() const; + virtual void setVisible(bool visible); + virtual void minimize(); virtual void maximize(); From f0d769c92372b79def49fa3b1aacb7127f093de6 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 4 Nov 2020 21:02:10 +0100 Subject: [PATCH 114/361] Platform/Win32/Win32Display: minor fix. --- source/Platform/Win32/Win32Display.cpp | 14 ++++++++------ source/Platform/Win32/Win32Display.h | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index 885f5a4..57c0d0a 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -37,18 +37,18 @@ Win32Display::~Win32Display() bool Win32Display::create(DisplayDescription description) { DWORD flags = getWin32Flags(description.decoration); - int x, y; + Vector2i pos; if (firstTime) { registerClass(); firstTime = false; } - centerWindow(x, y, description.mode.width, description.mode.height); + pos = centerWindow(description.mode.width, description.mode.height); // Create window. m_handle = CreateWindowExA(0, WND_CLASSNAME, "", flags, - x, y, description.mode.width, description.mode.height, + pos.x, pos.y, description.mode.width, description.mode.height, NULL, NULL, GetModuleHandle(NULL), (LPVOID) this); if (!m_handle) { @@ -264,10 +264,12 @@ DWORD Win32Display::getWin32Flags(unsigned int flags) return win32_flags; } -void Win32Display::centerWindow(int &x, int &y, int width, int height) +Vector2i Win32Display::centerWindow(int width, int height) { - x = (::GetSystemMetrics(SM_CXSCREEN) - width) / 2; - y = (::GetSystemMetrics(SM_CYSCREEN) - height) / 2; + Vector2i v; + v.x = (::GetSystemMetrics(SM_CXSCREEN) - width) / 2; + v.y = (::GetSystemMetrics(SM_CYSCREEN) - height) / 2; + return v; } void Win32Display::processResizeMessage(const Vector2u& new_size) diff --git a/source/Platform/Win32/Win32Display.h b/source/Platform/Win32/Win32Display.h index 0e4ec85..80c7cc3 100644 --- a/source/Platform/Win32/Win32Display.h +++ b/source/Platform/Win32/Win32Display.h @@ -51,7 +51,7 @@ protected : DWORD getWin32Flags(unsigned int flags); - void centerWindow(int &x, int &y, int width, int height); + Vector2i centerWindow(int width, int height); void processMessage(UINT message, WPARAM wParam, LPARAM lParam); From 2da0f7e71204190f6df24663de5304dfe3d20bd1 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 6 Nov 2020 11:10:38 +0100 Subject: [PATCH 115/361] Platform/Win32/Win32Display.cpp: change OutputDebugString() to Log::debug() --- source/Platform/Win32/Win32Display.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index 57c0d0a..f9bc72c 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -296,10 +296,10 @@ void Win32Display::processMessage(UINT message, WPARAM wParam, LPARAM lParam) PostQuitMessage(0); break; case WM_SETFOCUS : - OutputDebugString("WM_SETFOCUS\n"); + Log::debug("WM_SETFOCUS"); break; case WM_KILLFOCUS : - OutputDebugString("WM_KILLFOCUS\n"); + Log::debug("WM_KILLFOCUS"); break; case WM_SIZE : From 5d433a7b806891f5914fe3bf23a01031896d90cd Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 13 Nov 2020 00:11:40 +0100 Subject: [PATCH 116/361] source/Platform/Win32/Win32Display.cpp: don't call destroy() on WM_DESTROY as the window is already destroyed if we get this event. --- source/Platform/Win32/Win32Display.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index f9bc72c..de68f77 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -292,7 +292,6 @@ void Win32Display::processMessage(UINT message, WPARAM wParam, LPARAM lParam) } break; case WM_DESTROY : - destroy(); PostQuitMessage(0); break; case WM_SETFOCUS : From fc1fc7001a8fc9738382e1a45a9e55ef65ef891e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 13 Nov 2020 00:03:29 +0100 Subject: [PATCH 117/361] Spectre/Display/Display: Adding setVisible() --- include/Spectre/Display/Display.h | 2 ++ source/Display/Display.cpp | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/include/Spectre/Display/Display.h b/include/Spectre/Display/Display.h index cc7a687..0985945 100644 --- a/include/Spectre/Display/Display.h +++ b/include/Spectre/Display/Display.h @@ -49,6 +49,8 @@ public : enum Mode getVideoMode() const; + void setVisible(bool visible); + void showCursor(bool value); void grabCursor(bool value); diff --git a/source/Display/Display.cpp b/source/Display/Display.cpp index 43584c9..24ced50 100644 --- a/source/Display/Display.cpp +++ b/source/Display/Display.cpp @@ -129,6 +129,11 @@ enum Display::Mode Display::getVideoMode() const return m_fmode; } +void Display::setVisible(bool visible) +{ + m_impl->setVisible(visible); +} + void Display::showCursor(bool value) { m_impl->showCursor(value); From 3f38286049e33fbc4c134e6d98841ca901afec09 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 13 Nov 2020 00:23:10 +0100 Subject: [PATCH 118/361] source/Platform/Win32/Win32EventQueue.cpp: change OutputDebugString() to Log::debug() --- source/Platform/Win32/Win32EventQueue.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/Platform/Win32/Win32EventQueue.cpp b/source/Platform/Win32/Win32EventQueue.cpp index 8340521..40a878d 100644 --- a/source/Platform/Win32/Win32EventQueue.cpp +++ b/source/Platform/Win32/Win32EventQueue.cpp @@ -3,6 +3,7 @@ #include "Win32Keyboard.h" #include "Win32Mouse.h" #include "Win32EventQueue.h" +#include namespace sp { @@ -28,8 +29,8 @@ LRESULT Win32EventQueue::processMessage(MSG msg, Event& event) // Input, Forward to devices. case WM_KEYDOWN : case WM_KEYUP : - OutputDebugString("WM_KEYDOWN\n"); - //SetCapture(msg.hwnd); + + Log::debug("WM_KEY"); if (Win32Keyboard::handleMessage(msg, event)) { // Keyboard did handle the message. From c2b0d73888b87c5cefa282b682c43dddfe22cdd4 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 5 Nov 2020 12:36:42 +0100 Subject: [PATCH 119/361] source/Display/DisplayMode.cpp: initialize bpp to zero. --- source/Display/DisplayMode.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Display/DisplayMode.cpp b/source/Display/DisplayMode.cpp index 4973d08..61fe62d 100644 --- a/source/Display/DisplayMode.cpp +++ b/source/Display/DisplayMode.cpp @@ -22,14 +22,14 @@ struct DisplayModeCmp DisplayMode::DisplayMode() : width (0), height (0), -bpp (32) +bpp (0) { } DisplayMode::DisplayMode(unsigned int width, unsigned int height, unsigned int bpp) : width (width), height (height), -bpp (bpp) +bpp (bpp) { } From b43f2fcca82467f42760a33751529ede49338bd7 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 5 Nov 2020 17:01:25 +0100 Subject: [PATCH 120/361] Display/DisplayMode: adding empty() --- include/Spectre/Display/DisplayMode.h | 9 +++++++++ source/Display/DisplayMode.cpp | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/include/Spectre/Display/DisplayMode.h b/include/Spectre/Display/DisplayMode.h index 70f62a0..81f0eaf 100644 --- a/include/Spectre/Display/DisplayMode.h +++ b/include/Spectre/Display/DisplayMode.h @@ -16,6 +16,15 @@ public : static DisplayMode getDesktopMode(); + // Returns true if width hight and bpp are not set (eg. zero) + // useful to determine if a DisplayMode object is set or not. + // this is equal to: + // DisplayMode a; + // if (a == DisplayMode()) { + // // empty + // } + bool empty() const; + inline bool operator==(const DisplayMode& other) { return width == other.width diff --git a/source/Display/DisplayMode.cpp b/source/Display/DisplayMode.cpp index 61fe62d..13128c8 100644 --- a/source/Display/DisplayMode.cpp +++ b/source/Display/DisplayMode.cpp @@ -55,4 +55,9 @@ DisplayMode DisplayMode::getDesktopMode() return PlatformMisc::GetDesktopMode(); } +bool DisplayMode::empty() const +{ + return (width + height + bpp) == 0; +} + } // namespace sp From 4d69ff3a18e83900cd767546619a2b64da120e54 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 13 Nov 2020 00:26:08 +0100 Subject: [PATCH 121/361] Adding Display Example --- examples/build.lua | 3 +- examples/display/DisplayExample.cpp | 58 +++++++++++++++++++++++++++++ examples/display/DisplayExample.h | 34 +++++++++++++++++ examples/display/bam.lua | 7 ++++ examples/display/main.cpp | 11 ++++++ 5 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 examples/display/DisplayExample.cpp create mode 100644 examples/display/DisplayExample.h create mode 100644 examples/display/bam.lua create mode 100644 examples/display/main.cpp diff --git a/examples/build.lua b/examples/build.lua index 92d04a1..552dea1 100644 --- a/examples/build.lua +++ b/examples/build.lua @@ -25,7 +25,8 @@ assets = CopyDir(PathJoin(paths.build, paths.examples), "assets") examples = BuildExamples(example_settings, { "text", "events", - "input" + "input", + "display" }, assets) PseudoTarget("examples", examples) diff --git a/examples/display/DisplayExample.cpp b/examples/display/DisplayExample.cpp new file mode 100644 index 0000000..2cbe330 --- /dev/null +++ b/examples/display/DisplayExample.cpp @@ -0,0 +1,58 @@ + +#include +#include +#include +#include +#include "DisplayExample.h" + +void DisplayExample::init() +{ + m_renderer = new sp::BatchRenderer2D(); + m_mode = sp::Display::WINDOWED; + getMessageHandler()->registerListener(this); + + m_texture.create("assets/textures/tux.png"); + + m_sprite.setTexture(m_texture); + m_sprite.setPosition(sp::vec2f(50, 50)); + m_sprite.setSize(sp::vec2f(100, 100)); + + m_renderer->setCamera(m_camera); +} + +void DisplayExample::onEvent(const sp::Event& event) +{ + if (event.type == sp::Event::Key && event.key.pressed == false) { + + if (event.key.code == sp::Keyboard::Space) { + + if (m_mode == sp::Display::WINDOWED) { + m_mode = sp::Display::FULLSCREEN; + sp::Log::info("Fullscreen"); + } else { + m_mode = sp::Display::WINDOWED; + sp::Log::info("Windowed"); + } + + getGraphics()->setDisplayMode(m_mode); + } + } +} + +void DisplayExample::update(double dt) +{ + // Nothing to do +} + +void DisplayExample::render() +{ + sp::Graphics* g = getGraphics(); + + g->clearBuffer(); + + m_renderer->begin(); + m_renderer->submit(m_sprite); + m_renderer->render(); + + g->swapBuffers(); +} diff --git a/examples/display/DisplayExample.h b/examples/display/DisplayExample.h new file mode 100644 index 0000000..68de736 --- /dev/null +++ b/examples/display/DisplayExample.h @@ -0,0 +1,34 @@ + +#ifndef DISPLAY_EXAMPLE_H +#define DISPLAY_EXAMPLE_H + +#include +#include +#include +#include +#include + +class DisplayExample : public sp::Game, sp::EventListener +{ +public : + void onEvent(const sp::Event& event); + +protected : + + void init(); + + void update(double dt); + + void render(); + +protected : + + sp::Display::Mode m_mode; + + sp::Camera2D m_camera; + sp::Renderer2D *m_renderer; + sp::Texture m_texture; + sp::Sprite m_sprite; +}; + +#endif /* DISPLAY_EXAMPLE_H */ diff --git a/examples/display/bam.lua b/examples/display/bam.lua new file mode 100644 index 0000000..8e16b24 --- /dev/null +++ b/examples/display/bam.lua @@ -0,0 +1,7 @@ + +local base = PathDir(ModuleFilename()) + +src ={ + base .. "/main.cpp", + base .. "/DisplayExample.cpp" +} diff --git a/examples/display/main.cpp b/examples/display/main.cpp new file mode 100644 index 0000000..5959143 --- /dev/null +++ b/examples/display/main.cpp @@ -0,0 +1,11 @@ + +#include "DisplayExample.h" + +int main(int argc, char **argv) { + + DisplayExample game; + + game.run(); + + return 0; +} From 02567eb225c430df3d5432e7f0b1f930417ce136 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 5 Dec 2020 17:24:24 +0100 Subject: [PATCH 122/361] source/Platform/PlatformDisplay.h: Adding setDecoration() --- source/Platform/PlatformDisplay.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/Platform/PlatformDisplay.h b/source/Platform/PlatformDisplay.h index 2147230..ea97578 100644 --- a/source/Platform/PlatformDisplay.h +++ b/source/Platform/PlatformDisplay.h @@ -39,6 +39,8 @@ public : virtual void setVisible(bool visible) = 0; + virtual void setDecoration(unsigned decoration) = 0; + virtual void minimize() = 0; virtual void maximize() = 0; From ebe3a648c56f1f50ba9bebbcd7e26a85f40ce43c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 5 Dec 2020 17:25:15 +0100 Subject: [PATCH 123/361] Platform/Win32/Win32Display: Implement setDecoration() --- source/Platform/Win32/Win32Display.cpp | 5 +++++ source/Platform/Win32/Win32Display.h | 2 ++ 2 files changed, 7 insertions(+) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index de68f77..c38004c 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -123,6 +123,11 @@ void Win32Display::setVisible(bool visible) ::ShowWindow(m_handle, visible ? SW_SHOW : SW_HIDE); } +void Win32Display::setDecoration(unsigned decoration) +{ + ::SetWindowLong(m_handle, GWL_STYLE, getWin32Flags(decoration)); +} + void Win32Display::minimize() { ::ShowWindow(m_handle, SW_MINIMIZE); diff --git a/source/Platform/Win32/Win32Display.h b/source/Platform/Win32/Win32Display.h index 80c7cc3..ccdaecc 100644 --- a/source/Platform/Win32/Win32Display.h +++ b/source/Platform/Win32/Win32Display.h @@ -33,6 +33,8 @@ public : virtual void setVisible(bool visible); + virtual void setDecoration(unsigned decoration); + virtual void minimize(); virtual void maximize(); From ca5e2a399c80a52258114c8d40c769215094b56f Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 5 Dec 2020 18:19:07 +0100 Subject: [PATCH 124/361] Platform/PlatformDisplay: adding enterFullscreen() and exitFullscreen() --- source/Platform/PlatformDisplay.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/Platform/PlatformDisplay.h b/source/Platform/PlatformDisplay.h index ea97578..3fff71f 100644 --- a/source/Platform/PlatformDisplay.h +++ b/source/Platform/PlatformDisplay.h @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -45,6 +46,10 @@ public : virtual void maximize() = 0; + virtual void enterFullscreen(DisplayMode mode) = 0; + + virtual void exitFullscreen() = 0; + virtual void setCaption(const std::string& caption) = 0; virtual void setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) = 0; From 304e345a79e117477fa13117156a889795eeadc9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 5 Dec 2020 18:19:52 +0100 Subject: [PATCH 125/361] Platform/Win32/Win32Display: Implementing true fullscreen with enterFullscreen() and exitFullscreen() --- source/Platform/Win32/Win32Display.cpp | 88 +++++++++++++++++++++++++- source/Platform/Win32/Win32Display.h | 7 ++ 2 files changed, 92 insertions(+), 3 deletions(-) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index c38004c..18e50e6 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -36,7 +36,7 @@ Win32Display::~Win32Display() bool Win32Display::create(DisplayDescription description) { - DWORD flags = getWin32Flags(description.decoration); + DWORD flags; Vector2i pos; if (firstTime) { @@ -44,7 +44,18 @@ bool Win32Display::create(DisplayDescription description) firstTime = false; } - pos = centerWindow(description.mode.width, description.mode.height); + if (description.decoration & DisplayDecorate::Fullscreen) { + m_fs_mode = description.mode; + } + + if (m_fs_mode.empty() == false) { + // Only set these flags for fullscreen (borderless) + flags = WS_VISIBLE | WS_POPUP; + } else { + // Set window to center and set decorator flags for windowed displays. + pos = centerWindow(description.mode.width, description.mode.height); + flags = getWin32Flags(description.decoration); + } // Create window. m_handle = CreateWindowExA(0, WND_CLASSNAME, "", flags, @@ -56,7 +67,11 @@ bool Win32Display::create(DisplayDescription description) return false; } - setSize(description.mode.width, description.mode.height); + if (m_fs_mode.empty() == false) { + enterFullscreen(m_fs_mode); + } else { + setSize(description.mode.width, description.mode.height); + } // Store the size for use later. m_size = getSize(); @@ -277,6 +292,60 @@ Vector2i Win32Display::centerWindow(int width, int height) return v; } +void Win32Display::enterFullscreen(DisplayMode mode) +{ + LONG rc; + ::DEVMODEW dev; + dev.dmSize = sizeof(dev); + dev.dmPelsWidth = mode.width; + dev.dmPelsHeight = mode.height; + dev.dmBitsPerPel = mode.bpp; + dev.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL; + + rc = ::ChangeDisplaySettingsW(&dev, CDS_FULLSCREEN); + if (rc != DISP_CHANGE_SUCCESSFUL) { + const char *msg; + + switch(rc) { + case DISP_CHANGE_BADDUALVIEW : + msg = "The system is DualView capable"; break; + case DISP_CHANGE_BADFLAGS : + msg = "Invalid flags given"; break; + case DISP_CHANGE_BADPARAM : + msg = "Invalid parameter"; break; + case DISP_CHANGE_BADMODE : + msg = "Resolution not supported"; break; + case DISP_CHANGE_FAILED : + msg = "Display driver failed to set mode"; break; + case DISP_CHANGE_NOTUPDATED : + msg = "Unable to write settings to the registry"; break; + case DISP_CHANGE_RESTART : + msg = "System restart required"; break; + default : + msg = "Unkown error"; + } + + sp::Log::error("Win32: Failed to switch to fullscreen mode: %s.", msg); + return; + } + + ::SetWindowLong(m_handle, GWL_STYLE, WS_VISIBLE | WS_POPUP); + ::SetWindowPos(m_handle, HWND_TOP, 0, 0, mode.width, mode.height, SWP_FRAMECHANGED | SWP_SHOWWINDOW); + + grabCursor(true); + + m_fs_mode = mode; +} + +void Win32Display::exitFullscreen() +{ + if (!m_fs_mode.empty()) { + // Restore to previous mode. + ::ChangeDisplaySettingsW(NULL, 0); + m_fs_mode = DisplayMode(); + } +} + void Win32Display::processResizeMessage(const Vector2u& new_size) { // Check if the size has actually changed. @@ -301,9 +370,22 @@ void Win32Display::processMessage(UINT message, WPARAM wParam, LPARAM lParam) break; case WM_SETFOCUS : Log::debug("WM_SETFOCUS"); + if (m_fs_mode.empty() == false) { + enterFullscreen(m_fs_mode); + } break; case WM_KILLFOCUS : Log::debug("WM_KILLFOCUS"); + // If in fullscreen mode. + if (m_fs_mode.empty() == false) { + // Switch to window mode. + ::ChangeDisplaySettingsW(NULL, 0); + + // also minimize the window to get it out of the way. + minimize(); + } + + grabCursor(false); break; case WM_SIZE : diff --git a/source/Platform/Win32/Win32Display.h b/source/Platform/Win32/Win32Display.h index ccdaecc..510c275 100644 --- a/source/Platform/Win32/Win32Display.h +++ b/source/Platform/Win32/Win32Display.h @@ -35,6 +35,10 @@ public : virtual void setDecoration(unsigned decoration); + virtual void enterFullscreen(DisplayMode mode); + + virtual void exitFullscreen(); + virtual void minimize(); virtual void maximize(); @@ -76,6 +80,9 @@ protected : Vector2u m_size; Vector2u m_minSize; + + // Fullscreen mode. + DisplayMode m_fs_mode; }; } // namespace sp From ea91d50a84b374314e8ae7c0392d6b96b5fa7e8d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 5 Dec 2020 18:20:20 +0100 Subject: [PATCH 126/361] source/Graphics/OpenGL.cpp: minor fix. no need to set window decoration (default is fine) --- source/Graphics/OpenGL.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/Graphics/OpenGL.cpp b/source/Graphics/OpenGL.cpp index ef7383d..da752dd 100644 --- a/source/Graphics/OpenGL.cpp +++ b/source/Graphics/OpenGL.cpp @@ -24,8 +24,6 @@ bool Graphics::init() DisplayMode mode(m_width, m_height); DisplayDescription desc(mode); - desc.decoration = DisplayDecorate::Menu | DisplayDecorate::Close | DisplayDecorate::Resize; - if (!m_display->create(desc)) { return false; } From 74a2ff028c1c9687a08ff8b672ff48f27aa5cda9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 5 Dec 2020 18:21:34 +0100 Subject: [PATCH 127/361] source/Display/Display.cpp: Use the new display api that does not require recreating the display. --- source/Display/Display.cpp | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/source/Display/Display.cpp b/source/Display/Display.cpp index 24ced50..0691360 100644 --- a/source/Display/Display.cpp +++ b/source/Display/Display.cpp @@ -98,28 +98,29 @@ void Display::setSize(unsigned int width, unsigned int height) void Display::setVideoMode(Mode mode) { - DisplayDescription desc; - if (m_fmode == mode) { return; } - if (mode == FULLSCREEN || mode == WINDOWEDFULLSCREEN) { - - // True fullscreen - if (mode == FULLSCREEN) { - desc.mode = m_description.mode; - } else { - desc.mode = DisplayMode::getDesktopMode(); - m_cacheDesc = m_description; - } - - desc.decoration = DisplayDecorate::None; - } else { - desc = m_cacheDesc; + if (mode != FULLSCREEN) { + m_impl->exitFullscreen(); } - create(desc); + // True fullscreen + if (mode == FULLSCREEN) { + m_impl->enterFullscreen(m_description.mode); + } + // Windowed fullscreen. + else if (mode == WINDOWEDFULLSCREEN) { + DisplayMode desktop = DisplayMode::getDesktopMode(); + m_impl->setDecoration(DisplayDecorate::None); + m_impl->setSize(desktop.width, desktop.height); + } + // Window mode. + else { + // Set stored decoration. + m_impl->setDecoration(m_description.decoration); + } m_fmode = mode; } From d34d20361dee647c8ee10e894e2483949967bff3 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 5 Nov 2020 10:09:27 +0100 Subject: [PATCH 128/361] include/Spectre/Display/DisplayDescription.h: adding Fullscreen flag. --- include/Spectre/Display/DisplayDescription.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/Spectre/Display/DisplayDescription.h b/include/Spectre/Display/DisplayDescription.h index 0d6539b..ee1b468 100644 --- a/include/Spectre/Display/DisplayDescription.h +++ b/include/Spectre/Display/DisplayDescription.h @@ -13,6 +13,7 @@ namespace DisplayDecorate { Menu = 1 << 0, Resize = 1 << 1, Close = 1 << 2, + Fullscreen = 1 << 3, Default = Menu | Resize | Close, }; }; From 6de6028ba4174a1b055a21240cef59948387e6c0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 13 Dec 2020 17:29:29 +0100 Subject: [PATCH 129/361] Adding Spectre/Math/Time --- engine.build.lua | 3 +- include/Spectre/Math/Time.h | 50 ++++++++++++++++++ source/Math/Time.cpp | 101 ++++++++++++++++++++++++++++++++++++ 3 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 include/Spectre/Math/Time.h create mode 100644 source/Math/Time.cpp diff --git a/engine.build.lua b/engine.build.lua index 9d3f97b..95f5af9 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -115,7 +115,8 @@ local math_module = Module("source/Math", { "Color.cpp", "Logarithm.cpp", "Math.cpp", - "Transform.cpp" + "Transform.cpp", + "Time.cpp" }) local game_module = Module("source", { diff --git a/include/Spectre/Math/Time.h b/include/Spectre/Math/Time.h new file mode 100644 index 0000000..9abb7d3 --- /dev/null +++ b/include/Spectre/Math/Time.h @@ -0,0 +1,50 @@ + +#ifndef SPECTRE_MATH_TIME_H +#define SPECTRE_MATH_TIME_H + +namespace sp { + +class Time { +public : + Time(long value = 0); + + double seconds() const; + + int milliseconds() const; + + long microseconds() const; + + // ---------------------------- + // Helper construct functions + // ---------------------------- + static Time seconds(double value); + static Time milliseconds(int value); + static Time microseconds(long value); + +private : + + // In microseconds. + long m_value; +}; + +// ---------------------------- +// Compare +// ---------------------------- +bool operator ==(const Time& a, const Time& b); +bool operator !=(const Time& a, const Time& b); +bool operator <(const Time& a, const Time& b); +bool operator <=(const Time& a, const Time& b); +bool operator >(const Time& a, const Time& b); +bool operator >=(const Time& a, const Time& b); + +// ---------------------------- +// Arithmetic +// ---------------------------- +Time operator +(const Time& a, const Time& b); +Time& operator +=(Time& a, const Time& b); +Time operator -(const Time& a, const Time& b); +Time& operator -=(Time& a, const Time& b); + +}; // namespace sp + +#endif /* SPECTRE_MATH_TIME_H */ diff --git a/source/Math/Time.cpp b/source/Math/Time.cpp new file mode 100644 index 0000000..2e62b4c --- /dev/null +++ b/source/Math/Time.cpp @@ -0,0 +1,101 @@ + +#include +#include + +namespace sp { + +Time::Time(long value) : +m_value(value) +{ +} + +double Time::seconds() const +{ + return ((double) m_value) / 1000000.0f; +} + +int Time::milliseconds() const +{ + return ((double) m_value) / 1000; +} + +long Time::microseconds() const +{ + return m_value; +} + +// ---------------------------- +// Helper construct functions +// ---------------------------- +Time Time::seconds(double value) +{ + return Time((long) std::round(value * 1000000.0f)); +} + +Time Time::milliseconds(int value) +{ + return Time((long) (value * 1000)); +} + +Time Time::microseconds(long value) +{ + return Time(value); +} + +// ---------------------------- +// Compare +// ---------------------------- +bool operator ==(const Time& a, const Time& b) +{ + return a.microseconds() == b.microseconds(); +} + +bool operator !=(const Time& a, const Time& b) +{ + return a.microseconds() != b.microseconds(); +} + +bool operator <(const Time& a, const Time& b) +{ + return a.microseconds() < b.microseconds(); +} + +bool operator <=(const Time& a, const Time& b) +{ + return a.microseconds() <= b.microseconds(); +} + +bool operator >(const Time& a, const Time& b) +{ + return a.microseconds() > b.microseconds(); +} + +bool operator >=(const Time& a, const Time& b) +{ + return a.microseconds() >= b.microseconds(); +} + +// ---------------------------- +// Arithmetic +// ---------------------------- +Time operator +(const Time& a, const Time& b) +{ + return Time(a.microseconds() + b.microseconds()); +} + +Time& operator +=(Time& a, const Time& b) +{ + return a = a + b; +} + +Time operator -(const Time& a, const Time& b) +{ + return Time(a.microseconds() - b.microseconds()); +} + +Time& operator -=(Time& a, const Time& b) +{ + return a = a - b; +} + +} // namespace sp From 919aa7740a69984eed76ede69bd275946f28e44b Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 14 Dec 2020 18:27:18 +0100 Subject: [PATCH 130/361] Spectre/Game/FPSCounter: Use sp::Time --- include/Spectre/Game/FPSCounter.h | 16 +++++++++------- source/Game/FPSCounter.cpp | 21 ++++++++++----------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/include/Spectre/Game/FPSCounter.h b/include/Spectre/Game/FPSCounter.h index 7e3511b..3c42141 100644 --- a/include/Spectre/Game/FPSCounter.h +++ b/include/Spectre/Game/FPSCounter.h @@ -2,6 +2,8 @@ #ifndef SPECTRE_FPS_COUNTER_H #define SPECTRE_FPS_COUNTER_H +#include + // Simple FPS counter. namespace sp { @@ -19,7 +21,7 @@ public : // Set the update rate (in seconds). // How often the FPS should be sampled and calculated. - void setUpdateRate(unsigned int seconds); + void setUpdateRate(unsigned int rate); // Update the internal time measurment. bool update(); @@ -29,16 +31,16 @@ public : private : - // Frame counter. + // Number of frames since last update. unsigned int m_count; - // time (in ms) - unsigned int m_time; + // Last time we updated the counter. + Time m_time; - // Update rate (in ms) - unsigned int m_updateRate; + // Update rate (at what interval should we update) + Time m_updateRate; - // Calculated fps. + // Calculated Frames per second. float m_fps; }; diff --git a/source/Game/FPSCounter.cpp b/source/Game/FPSCounter.cpp index 84fa6b0..c4212a4 100644 --- a/source/Game/FPSCounter.cpp +++ b/source/Game/FPSCounter.cpp @@ -5,9 +5,9 @@ namespace sp { FPSCounter::FPSCounter() : -m_fps (60.0f), -m_updateRate (2000) +m_fps (60.0f) { + m_updateRate = Time::seconds(2); reset(); } @@ -21,14 +21,14 @@ float FPSCounter::getFPS() const return m_fps; } -void FPSCounter::setUpdateRate(unsigned int ups) +void FPSCounter::setUpdateRate(unsigned int rate) { // Clamp to 1. - if (ups < 1) { - ups = 1; + if (rate < 1) { + rate = 1; } - m_updateRate = ups * 1000; + m_updateRate = Time::seconds(rate); // Must reset the counter. reset(); @@ -36,12 +36,11 @@ void FPSCounter::setUpdateRate(unsigned int ups) bool FPSCounter::update() { - unsigned int current = system::getMilliseconds(); - unsigned int elapsed = current - m_time; + Time current = Time::milliseconds(system::getMilliseconds()); + Time elapsed = current - m_time; if (elapsed >= m_updateRate) { - float fraction = m_count / ((float) elapsed); - m_fps = fraction * 1000.f; + m_fps = m_count / elapsed.seconds(); m_time = current; m_count = 0; @@ -52,7 +51,7 @@ bool FPSCounter::update() void FPSCounter::reset() { - m_time = system::getMilliseconds(); + m_time = Time::milliseconds(system::getMilliseconds()); m_count = 0; } From f62373dcbc6051973a8b2f1a6f0ec9b73ab29840 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 14 Dec 2020 19:09:17 +0100 Subject: [PATCH 131/361] Adding Spectre/System/Stopwatch --- engine.build.lua | 3 ++- include/Spectre/System/Stopwatch.h | 27 +++++++++++++++++++++++++++ source/System/Stopwatch.cpp | 25 +++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 include/Spectre/System/Stopwatch.h create mode 100644 source/System/Stopwatch.cpp diff --git a/engine.build.lua b/engine.build.lua index 95f5af9..a7920b3 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -34,7 +34,8 @@ local system_module = Module("source/System", { "MessageQueue.cpp", "Event.cpp", "EventListener.cpp", - "Log.cpp" + "Log.cpp", + "Stopwatch.cpp" }) local platform_common_module = Module("source/Platform", { diff --git a/include/Spectre/System/Stopwatch.h b/include/Spectre/System/Stopwatch.h new file mode 100644 index 0000000..2a5cc4e --- /dev/null +++ b/include/Spectre/System/Stopwatch.h @@ -0,0 +1,27 @@ + +#ifndef SPECTRE_SYSTEM_STOPWATCH_H +#define SPECTRE_SYSTEM_STOPWATCH_H + +#include + +namespace sp { + +class Stopwatch { +public : + Stopwatch(); + + // Restart the watch. also returns the elapsed time before + // the watch was restarted. + Time restart(); + + // Get the elapsed time since the watch was restarted. + Time elapsed() const; + +private : + + Time m_start; +}; + +} // namespace sp + +#endif /* SPECTRE_SYSTEM_STOPWATCH_H */ diff --git a/source/System/Stopwatch.cpp b/source/System/Stopwatch.cpp new file mode 100644 index 0000000..cee21e2 --- /dev/null +++ b/source/System/Stopwatch.cpp @@ -0,0 +1,25 @@ + +#include +#include + +namespace sp { + +Stopwatch::Stopwatch() +{ + m_start = Time::milliseconds(system::getMilliseconds()); +} + +Time Stopwatch::restart() +{ + Time now = Time::milliseconds(system::getMilliseconds()); + Time elapsed = now - m_start; + m_start = now; + return elapsed; +} + +Time Stopwatch::elapsed() const +{ + return Time::milliseconds(system::getMilliseconds()) - m_start; +} + +} // namespace sp From 3855cdd541137db238e8471c0e70c4290a2e77f3 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 16 Dec 2020 16:32:34 +0100 Subject: [PATCH 132/361] Game/FPSCounter: Use sp::Stopwatch --- include/Spectre/Game/FPSCounter.h | 5 +++-- source/Game/FPSCounter.cpp | 8 +++----- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/include/Spectre/Game/FPSCounter.h b/include/Spectre/Game/FPSCounter.h index 3c42141..9566fc2 100644 --- a/include/Spectre/Game/FPSCounter.h +++ b/include/Spectre/Game/FPSCounter.h @@ -2,7 +2,7 @@ #ifndef SPECTRE_FPS_COUNTER_H #define SPECTRE_FPS_COUNTER_H -#include +#include // Simple FPS counter. @@ -35,7 +35,8 @@ private : unsigned int m_count; // Last time we updated the counter. - Time m_time; + //Time m_time; + Stopwatch m_watch; // Update rate (at what interval should we update) Time m_updateRate; diff --git a/source/Game/FPSCounter.cpp b/source/Game/FPSCounter.cpp index c4212a4..70b713c 100644 --- a/source/Game/FPSCounter.cpp +++ b/source/Game/FPSCounter.cpp @@ -36,14 +36,12 @@ void FPSCounter::setUpdateRate(unsigned int rate) bool FPSCounter::update() { - Time current = Time::milliseconds(system::getMilliseconds()); - Time elapsed = current - m_time; + Time elapsed = m_watch.elapsed(); if (elapsed >= m_updateRate) { m_fps = m_count / elapsed.seconds(); - m_time = current; - m_count = 0; + reset(); return true; } return false; @@ -51,7 +49,7 @@ bool FPSCounter::update() void FPSCounter::reset() { - m_time = Time::milliseconds(system::getMilliseconds()); + m_watch.restart(); m_count = 0; } From 6ee1752735a4a4a16c51a6f30cc5d4750187f01c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 16 Dec 2020 16:35:14 +0100 Subject: [PATCH 133/361] include/Spectre/Game.h: Remove unused variable. --- include/Spectre/Game.h | 2 -- 1 file changed, 2 deletions(-) diff --git a/include/Spectre/Game.h b/include/Spectre/Game.h index 4c7b5b8..5c6dec3 100644 --- a/include/Spectre/Game.h +++ b/include/Spectre/Game.h @@ -56,8 +56,6 @@ private : FPSCounter m_fpsCounter; - double m_timestep; - bool m_running; }; From d49d91a294caf4dbe14ff3639c1d411d74270301 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 16 Dec 2020 16:36:19 +0100 Subject: [PATCH 134/361] Spectre/Game/GameTime: Use sp::Time and sp::Stopwatch --- include/Spectre/Game/GameTime.h | 16 +++++++++------- source/Game/GameTime.cpp | 33 +++++++++------------------------ 2 files changed, 18 insertions(+), 31 deletions(-) diff --git a/include/Spectre/Game/GameTime.h b/include/Spectre/Game/GameTime.h index c1d322b..aa85f17 100644 --- a/include/Spectre/Game/GameTime.h +++ b/include/Spectre/Game/GameTime.h @@ -2,6 +2,9 @@ #ifndef SPECTRE_GAME_TIME_H #define SPECTRE_GAME_TIME_H +#include +#include + namespace sp { class GameTime @@ -13,7 +16,7 @@ public : double getTimeStep() const; - unsigned long getElapsed() const; + Time getElapsed() const; //bool shouldTick(); @@ -33,13 +36,12 @@ protected : // TODO: min,max framerates - // Time(in ms) when the last update occured. - unsigned long m_current; - unsigned long m_lastUpdate; - double m_acc; + Stopwatch m_watch; - // timeslice in ms. - double m_slice; + Time m_acc; + + // Timeslice. + Time m_slice; bool m_inLoop; }; diff --git a/source/Game/GameTime.cpp b/source/Game/GameTime.cpp index f5a1d18..fa98d35 100644 --- a/source/Game/GameTime.cpp +++ b/source/Game/GameTime.cpp @@ -7,32 +7,29 @@ namespace sp { GameTime::GameTime(unsigned long updates_per_sec) { - m_acc = 0; - m_current = system::getMilliseconds(); - m_lastUpdate = m_current; setTimeStep(updates_per_sec); } double GameTime::getTimeStep() const { - return m_slice; + return m_slice.milliseconds(); } void GameTime::setTimeStep(unsigned long updates_per_sec) { - m_slice = (1000.0f / ((double) updates_per_sec)); + m_slice = Time::seconds(1.0f / ((double) updates_per_sec)); reset(); } -unsigned long GameTime::getElapsed() const +Time GameTime::getElapsed() const { - return m_current - m_lastUpdate; + return m_watch.elapsed(); } bool GameTime::beginFrame() { - reset(); + m_inLoop = false; accumulateTime(); @@ -53,27 +50,15 @@ bool GameTime::tick() void GameTime::reset() { - m_lastUpdate = m_current; + m_watch.restart(); m_inLoop = false; } void GameTime::accumulateTime() { - updateTime(); - - m_acc += (double) (m_current - m_lastUpdate); - if (m_acc > (1000.f / m_slice)) { - m_acc = 1000.f / m_slice; - } -} - -void GameTime::updateTime() -{ - m_current = system::getMilliseconds(); - - // Just to be safe. check so we don't get a negative interval. - if (m_current < m_lastUpdate) { - m_lastUpdate = m_current; + m_acc += m_watch.restart(); + if (m_acc.seconds() > (1.0f / m_slice.seconds())) { + m_acc = Time::seconds(1.0f / m_slice.seconds()); } } From ed876ca64d65d54be4fb7a6d1c6117a8d0c2e67c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 16 Dec 2020 16:39:06 +0100 Subject: [PATCH 135/361] Spectre/Game/GameTime: remove useless m_inLoop variable. --- include/Spectre/Game/GameTime.h | 2 -- source/Game/GameTime.cpp | 9 ++------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/include/Spectre/Game/GameTime.h b/include/Spectre/Game/GameTime.h index aa85f17..39cfcea 100644 --- a/include/Spectre/Game/GameTime.h +++ b/include/Spectre/Game/GameTime.h @@ -42,8 +42,6 @@ protected : // Timeslice. Time m_slice; - - bool m_inLoop; }; } // namespace sp diff --git a/source/Game/GameTime.cpp b/source/Game/GameTime.cpp index fa98d35..c6d8061 100644 --- a/source/Game/GameTime.cpp +++ b/source/Game/GameTime.cpp @@ -29,14 +29,10 @@ Time GameTime::getElapsed() const bool GameTime::beginFrame() { - m_inLoop = false; - accumulateTime(); - if (m_acc > m_slice) { - m_inLoop = true; - } - return m_inLoop; + // Signal if we should tick + return m_acc > m_slice; } bool GameTime::tick() @@ -51,7 +47,6 @@ bool GameTime::tick() void GameTime::reset() { m_watch.restart(); - m_inLoop = false; } void GameTime::accumulateTime() From 2a608805b50663355e23f3837d93b4c13d7ed6d9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 16 Dec 2020 16:47:13 +0100 Subject: [PATCH 136/361] Spectre/Game/GameTime: add shouldTick() --- include/Spectre/Game/GameTime.h | 4 ++-- source/Game/GameTime.cpp | 8 +++++++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/Spectre/Game/GameTime.h b/include/Spectre/Game/GameTime.h index 39cfcea..37aa167 100644 --- a/include/Spectre/Game/GameTime.h +++ b/include/Spectre/Game/GameTime.h @@ -18,10 +18,10 @@ public : Time getElapsed() const; - //bool shouldTick(); - bool beginFrame(); + bool shouldTick() const; + bool tick(); void reset(); diff --git a/source/Game/GameTime.cpp b/source/Game/GameTime.cpp index c6d8061..f8e2b64 100644 --- a/source/Game/GameTime.cpp +++ b/source/Game/GameTime.cpp @@ -32,12 +32,18 @@ bool GameTime::beginFrame() accumulateTime(); // Signal if we should tick + return shouldTick(); +} + +bool GameTime::shouldTick() const +{ + // if acc is larger than one slice, we have atleast one tick. return m_acc > m_slice; } bool GameTime::tick() { - if (m_acc > m_slice) { + if (shouldTick()) { m_acc -= m_slice; return true; } From db695f11f6d74c9ea9be6b325f857cbbf98c72cd Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 18 Dec 2020 18:26:22 +0100 Subject: [PATCH 137/361] Spectre/Game/GameTime: Store max accumulated time in a member variable and calculate it once in setTimeStep() --- include/Spectre/Game/GameTime.h | 1 + source/Game/GameTime.cpp | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/include/Spectre/Game/GameTime.h b/include/Spectre/Game/GameTime.h index 37aa167..861c2d3 100644 --- a/include/Spectre/Game/GameTime.h +++ b/include/Spectre/Game/GameTime.h @@ -39,6 +39,7 @@ protected : Stopwatch m_watch; Time m_acc; + Time m_max_acc; // Timeslice. Time m_slice; diff --git a/source/Game/GameTime.cpp b/source/Game/GameTime.cpp index f8e2b64..f20b3e4 100644 --- a/source/Game/GameTime.cpp +++ b/source/Game/GameTime.cpp @@ -18,6 +18,7 @@ double GameTime::getTimeStep() const void GameTime::setTimeStep(unsigned long updates_per_sec) { m_slice = Time::seconds(1.0f / ((double) updates_per_sec)); + m_max_acc = Time::seconds(1.0f / m_slice.seconds()); reset(); } @@ -58,8 +59,8 @@ void GameTime::reset() void GameTime::accumulateTime() { m_acc += m_watch.restart(); - if (m_acc.seconds() > (1.0f / m_slice.seconds())) { - m_acc = Time::seconds(1.0f / m_slice.seconds()); + if (m_acc > m_max_acc) { + m_acc = m_max_acc; } } From 646483815910c3f5b12a4f18886b15ff52f4c5a0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Jun 2019 01:13:44 +0200 Subject: [PATCH 138/361] source/Platform/Unix: stub implementation --- source/Display/GLContext.cpp | 3 ++ source/Game.cpp | 14 +++++- source/Platform/PlatformDisplay.cpp | 3 ++ source/Platform/Unix/GLXContext.cpp | 61 ++++++++++++++++++++++++ source/Platform/Unix/GLXContext.h | 39 +++++++++++++++ source/Platform/Unix/UnixApplication.cpp | 26 ++++++++++ source/Platform/Unix/UnixApplication.h | 30 ++++++++++++ source/Platform/Unix/UnixMisc.cpp | 15 ++++++ source/Platform/Unix/UnixSystem.cpp | 31 ++++++++++++ source/Platform/Unix/X11Display.cpp | 56 ++++++++++++++++++++++ source/Platform/Unix/X11Display.h | 40 ++++++++++++++++ source/Platform/Unix/X11EventQueue.cpp | 11 +++++ source/Platform/Unix/X11EventQueue.h | 18 +++++++ source/Platform/Unix/X11Input.cpp | 22 +++++++++ source/Platform/Unix/X11Input.h | 21 ++++++++ source/Platform/Unix/X11Keyboard.cpp | 20 ++++++++ source/Platform/Unix/X11Keyboard.h | 25 ++++++++++ source/Platform/Unix/X11Mouse.cpp | 31 ++++++++++++ source/Platform/Unix/X11Mouse.h | 31 ++++++++++++ source/System/MessageQueue.cpp | 3 ++ 20 files changed, 498 insertions(+), 2 deletions(-) create mode 100644 source/Platform/Unix/GLXContext.cpp create mode 100644 source/Platform/Unix/GLXContext.h create mode 100644 source/Platform/Unix/UnixApplication.cpp create mode 100644 source/Platform/Unix/UnixApplication.h create mode 100644 source/Platform/Unix/UnixMisc.cpp create mode 100644 source/Platform/Unix/UnixSystem.cpp create mode 100644 source/Platform/Unix/X11Display.cpp create mode 100644 source/Platform/Unix/X11Display.h create mode 100644 source/Platform/Unix/X11EventQueue.cpp create mode 100644 source/Platform/Unix/X11EventQueue.h create mode 100644 source/Platform/Unix/X11Input.cpp create mode 100644 source/Platform/Unix/X11Input.h create mode 100644 source/Platform/Unix/X11Keyboard.cpp create mode 100644 source/Platform/Unix/X11Keyboard.h create mode 100644 source/Platform/Unix/X11Mouse.cpp create mode 100644 source/Platform/Unix/X11Mouse.h diff --git a/source/Display/GLContext.cpp b/source/Display/GLContext.cpp index cd26ca8..912c9ff 100644 --- a/source/Display/GLContext.cpp +++ b/source/Display/GLContext.cpp @@ -4,6 +4,9 @@ #ifdef _WIN32 #include typedef sp::Win32GLContext ContextType; +#elif defined(__linux__) || defined(unix) || defined(__unix) || defined(__unix__) +#include +typedef sp::GLXContext ContextType; #else #error "No GLContext implementation exists" #endif diff --git a/source/Game.cpp b/source/Game.cpp index 5213c50..01cccc1 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -4,17 +4,27 @@ #include #include #include +#include #include + +// TODO: move this to Application::create() +#ifdef _WIN32 #include -#include +typedef sp::Win32Application ApplicationType; +#elif defined(__linux__) || defined(unix) || defined(__unix) || defined(__unix__) +#include +typedef sp::UnixApplication ApplicationType; +#else +#error "No Application implementation exists" +#endif namespace sp { Game::Game() : m_running(false) { - m_platform = new Win32Application(); + m_platform = new ApplicationType(); m_graphics = new Graphics(m_platform); m_input = new InputModule(&m_platform->getInput()); m_messageHandler = new MessageHandler(); diff --git a/source/Platform/PlatformDisplay.cpp b/source/Platform/PlatformDisplay.cpp index 154930e..3298b98 100644 --- a/source/Platform/PlatformDisplay.cpp +++ b/source/Platform/PlatformDisplay.cpp @@ -5,6 +5,9 @@ #ifdef _WIN32 #include typedef sp::Win32Display DisplayType; +#elif defined(__linux__) || defined(unix) || defined(__unix) || defined(__unix__) +#include +typedef sp::X11Display DisplayType; #else #error "No Display implementation exists" #endif diff --git a/source/Platform/Unix/GLXContext.cpp b/source/Platform/Unix/GLXContext.cpp new file mode 100644 index 0000000..a488bdd --- /dev/null +++ b/source/Platform/Unix/GLXContext.cpp @@ -0,0 +1,61 @@ + +#include "GLXContext.h" + +namespace sp { + +GLXContext::GLXContext() +{ + +} + +GLXContext::~GLXContext() +{ + +} + +bool GLXContext::create(const PlatformDisplay* display) +{ + return true; +} + +void GLXContext::destroy() +{ + +} + +bool GLXContext::activate() +{ + return true; +} + +bool GLXContext::deactivate() +{ + return true; +} + +bool GLXContext::isActive() const +{ + return true; +} + +bool GLXContext::setSwapInterval(int interval) +{ + return true; +} + +void GLXContext::setSize(unsigned int width, unsigned int height) +{ + +} + +void GLXContext::setSize(const Vector2u size) +{ + setSize(size.x, size.y); +} + +void GLXContext::swapBuffers() +{ + +} + +} // namespace sp diff --git a/source/Platform/Unix/GLXContext.h b/source/Platform/Unix/GLXContext.h new file mode 100644 index 0000000..3a5dcbe --- /dev/null +++ b/source/Platform/Unix/GLXContext.h @@ -0,0 +1,39 @@ + +#ifndef PLATFORM_UNIX_GLXCONTEXT_H +#define PLATFORM_UNIX_GLXCONTEXT_H + +// X11 OpenGL Context (glx) + +#include + +namespace sp { + +class GLXContext : public GLContext +{ +public : + GLXContext(); + ~GLXContext(); + + // Create a context associated with a display. + bool create(const PlatformDisplay* display); + + void destroy(); + + bool activate(); + + bool deactivate(); + + bool isActive() const; + + bool setSwapInterval(int interval); + + void setSize(unsigned int width, unsigned int height); + + void setSize(const Vector2u size); + + void swapBuffers(); +}; + +} // namespace sp + +#endif /* PLATFORM_UNIX_GLXCONTEXT_H */ diff --git a/source/Platform/Unix/UnixApplication.cpp b/source/Platform/Unix/UnixApplication.cpp new file mode 100644 index 0000000..a8925d4 --- /dev/null +++ b/source/Platform/Unix/UnixApplication.cpp @@ -0,0 +1,26 @@ + +#include "UnixApplication.h" + +namespace sp { + +void UnixApplication::init() +{ + // TODO +} + +void UnixApplication::shutdown() +{ + // TODO +} + +PlatformInput& UnixApplication::getInput() +{ + return m_input; +} + +MessageQueue& UnixApplication::getMessageQueue() +{ + return m_messageQueue; +} + +} // namespace sp diff --git a/source/Platform/Unix/UnixApplication.h b/source/Platform/Unix/UnixApplication.h new file mode 100644 index 0000000..1f5c2dc --- /dev/null +++ b/source/Platform/Unix/UnixApplication.h @@ -0,0 +1,30 @@ + +#ifndef PLATFORM_UNIX_APPLICATION_H +#define PLATFORM_UNIX_APPLICATION_H + +#include +#include +#include "X11Input.h" + +namespace sp { + +class UnixApplication : public PlatformApplication +{ +public : + virtual void init(); + + virtual void shutdown(); + + virtual PlatformInput& getInput(); + + virtual MessageQueue& getMessageQueue(); + +protected : + + X11Input m_input; + MessageQueue m_messageQueue; +}; + +} // namespace sp + +#endif /* PLATFORM_UNIX_APPLICATION_H */ diff --git a/source/Platform/Unix/UnixMisc.cpp b/source/Platform/Unix/UnixMisc.cpp new file mode 100644 index 0000000..c168588 --- /dev/null +++ b/source/Platform/Unix/UnixMisc.cpp @@ -0,0 +1,15 @@ + +#include + +namespace sp { + +void PlatformMisc::GetDisplayModes(std::vector& modes) +{ +} + +DisplayMode PlatformMisc::GetDesktopMode() +{ + return DisplayMode(); +} + +} // namespace sp diff --git a/source/Platform/Unix/UnixSystem.cpp b/source/Platform/Unix/UnixSystem.cpp new file mode 100644 index 0000000..68d5384 --- /dev/null +++ b/source/Platform/Unix/UnixSystem.cpp @@ -0,0 +1,31 @@ + +#include +#include +#include + +namespace sp { + +unsigned long system::getMilliseconds() +{ + struct timespec tv; + clock_gettime(CLOCK_REALTIME, &tv); + return (tv.tv_sec * 1000ul) + (tv.tv_nsec / 1000000ul); + +} + +void system::sleep(int milliseconds) +{ + struct timespec req, rem; + req.tv_sec = milliseconds / 1000ul; + req.tv_nsec = (milliseconds - (req.tv_sec * 1000ul)) * 1000000ul; + +_start: + // Try again if we get interrupted. + if (clock_nanosleep(CLOCK_REALTIME, 0, &req, &rem) == EINTR) { + // Update req with remaining time. + req = rem; + goto _start; + } +} + +} // namespace sp diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp new file mode 100644 index 0000000..eb32495 --- /dev/null +++ b/source/Platform/Unix/X11Display.cpp @@ -0,0 +1,56 @@ + +#include "X11Display.h" + +namespace sp { + +bool X11Display::create(DisplayDescription description) +{ + return true; +} + +void X11Display::destroy() +{ + +} + +bool X11Display::isValid() +{ + return true; +} + +void* X11Display::getHandle() const +{ + return NULL; +} + +void X11Display::setSize(unsigned int width, unsigned int height) +{ + m_size = Vector2u(width, height); +} + +Vector2u X11Display::getSize() const +{ + return m_size; +} + +void X11Display::setPosition(unsigned int x, unsigned int y) +{ + +} + +void X11Display::setCaption(const std::string& caption) +{ + +} + +void X11Display::setIcon(const std::string& icon) +{ + +} + +void X11Display::showCursor(bool value) +{ + +} + +} // namespace sp diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Display.h new file mode 100644 index 0000000..5e1724d --- /dev/null +++ b/source/Platform/Unix/X11Display.h @@ -0,0 +1,40 @@ + +#ifndef PLATFORM_UNIX_X11DISPLAY_H +#define PLATFORM_UNIX_X11DISPLAY_H + +#include + +namespace sp { + +class X11Display : public PlatformDisplay +{ +public : + + virtual bool create(DisplayDescription description); + + virtual void destroy(); + + virtual bool isValid(); + + virtual void* getHandle() const; + + virtual void setSize(unsigned int width, unsigned int height); + + virtual Vector2u getSize() const; + + virtual void setPosition(unsigned int x, unsigned int y); + + virtual void setCaption(const std::string& caption); + + virtual void setIcon(const std::string& icon); + + virtual void showCursor(bool value); + +protected : + + Vector2u m_size; +}; + +} // namespace sp + +#endif /* PLATFORM_UNIX_X11DISPLAY_H */ diff --git a/source/Platform/Unix/X11EventQueue.cpp b/source/Platform/Unix/X11EventQueue.cpp new file mode 100644 index 0000000..d71faaa --- /dev/null +++ b/source/Platform/Unix/X11EventQueue.cpp @@ -0,0 +1,11 @@ + +#include "X11EventQueue.h" + +namespace sp { + +bool X11EventQueue::poll(Event& event) +{ + return false; +} + +} //namespace sp diff --git a/source/Platform/Unix/X11EventQueue.h b/source/Platform/Unix/X11EventQueue.h new file mode 100644 index 0000000..9239694 --- /dev/null +++ b/source/Platform/Unix/X11EventQueue.h @@ -0,0 +1,18 @@ + +#ifndef PLATFORM_UNIX_X11_EVENT_QUEUE_H +#define PLATFORM_UNIX_X11_EVENT_QUEUE_H + +#include +#include + +namespace sp { + +class X11EventQueue : public PlatformEventQueue +{ +public : + virtual bool poll(Event& event); +}; + +} // namespace sp + +#endif /* PLATFORM_UNIX_X11_EVENT_QUEUE_H */ diff --git a/source/Platform/Unix/X11Input.cpp b/source/Platform/Unix/X11Input.cpp new file mode 100644 index 0000000..2af3f10 --- /dev/null +++ b/source/Platform/Unix/X11Input.cpp @@ -0,0 +1,22 @@ + +#include "X11Keyboard.h" +#include "X11Mouse.h" +#include "X11Input.h" + +namespace sp { + +Keyboard* X11Input::createKeyboard() +{ + return new X11Keyboard(); +} + +Mouse* X11Input::createMouse() +{ + return new X11Mouse(); +} + +void X11Input::update() +{ +} + +} // namespace sp diff --git a/source/Platform/Unix/X11Input.h b/source/Platform/Unix/X11Input.h new file mode 100644 index 0000000..6bb7439 --- /dev/null +++ b/source/Platform/Unix/X11Input.h @@ -0,0 +1,21 @@ + +#ifndef PLATFORM_UNIX_X11INPUT_H +#define PLATFORM_UNIX_X11INPUT_H + +#include + +namespace sp { + +class X11Input : public PlatformInput +{ +public : + virtual Keyboard* createKeyboard(); + + virtual Mouse* createMouse(); + + virtual void update(); +}; + +} // namespace sp + +#endif /* PLATFORM_UNIX_X11INPUT_H */ diff --git a/source/Platform/Unix/X11Keyboard.cpp b/source/Platform/Unix/X11Keyboard.cpp new file mode 100644 index 0000000..adc7e08 --- /dev/null +++ b/source/Platform/Unix/X11Keyboard.cpp @@ -0,0 +1,20 @@ +#include "X11Keyboard.h" + +namespace sp { + +void X11Keyboard::init() +{ + +} + +bool X11Keyboard::isKeyDown(Keyboard::Key key) +{ + return false; +} + +void X11Keyboard::update(InputModule *input) +{ + +} + +} // namespace sp diff --git a/source/Platform/Unix/X11Keyboard.h b/source/Platform/Unix/X11Keyboard.h new file mode 100644 index 0000000..7f7485c --- /dev/null +++ b/source/Platform/Unix/X11Keyboard.h @@ -0,0 +1,25 @@ + +#ifndef PLATFORM_UNIX_X11KEYBOARD_H +#define PLATFORM_UNIX_X11KEYBOARD_H + +#include + +namespace sp { + +class X11Keyboard : public Keyboard +{ +public : + virtual ~X11Keyboard() {} + + void init(); + + bool isKeyDown(Keyboard::Key key); + +protected : + + virtual void update(InputModule *input); +}; + +} // namespace sp + +#endif /* PLATFORM_UNIX_X11KEYBOARD_H */ diff --git a/source/Platform/Unix/X11Mouse.cpp b/source/Platform/Unix/X11Mouse.cpp new file mode 100644 index 0000000..48ef3bc --- /dev/null +++ b/source/Platform/Unix/X11Mouse.cpp @@ -0,0 +1,31 @@ + +#include "X11Mouse.h" + +namespace sp { + +void X11Mouse::init() +{ + +} + +Vector2f X11Mouse::getPosition() const +{ + return m_position; +} + +Vector2f X11Mouse::getAbsPosition() const +{ + return m_position; +} + +bool X11Mouse::isButtonDown(Mouse::Button button) const +{ + return false; +} + +void X11Mouse::update(InputModule *input) +{ + +} + +} // namespace sp diff --git a/source/Platform/Unix/X11Mouse.h b/source/Platform/Unix/X11Mouse.h new file mode 100644 index 0000000..55c044e --- /dev/null +++ b/source/Platform/Unix/X11Mouse.h @@ -0,0 +1,31 @@ + +#ifndef PLATFORM_UNIX_X11MOUSE_H +#define PLATFORM_UNIX_X11MOUSE_H + +#include + +namespace sp { + +class X11Mouse : public Mouse +{ +public : + virtual void init(); + + // Get mouse position + virtual Vector2f getPosition() const; + + virtual Vector2f getAbsPosition() const; + + virtual bool isButtonDown(Mouse::Button button) const; + +protected : + + virtual void update(InputModule *input); + +protected : + Vector2f m_position; +}; + +} // namespace sp + +#endif /* PLATFORM_UNIX_X11MOUSE_H */ diff --git a/source/System/MessageQueue.cpp b/source/System/MessageQueue.cpp index 8ff7a3b..3550e36 100644 --- a/source/System/MessageQueue.cpp +++ b/source/System/MessageQueue.cpp @@ -4,6 +4,9 @@ #ifdef _WIN32 #include typedef sp::Win32EventQueue ImplType; +#elif defined(__linux__) || defined(unix) || defined(__unix) || defined(__unix__) +#include +typedef sp::X11EventQueue ImplType; #else #error "No MessageQueue implementation exists" #endif From 1cfd4adca463e487ca74a32ac8c153f992ad33d4 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 24 Dec 2019 21:07:21 +0100 Subject: [PATCH 139/361] bam: adding unix support. --- .bam/functions.lua | 17 +++++++++----- .gitignore | 1 + engine.build.lua | 56 +++++++++++++++++++++++++++++++--------------- examples/build.lua | 4 ++++ 4 files changed, 55 insertions(+), 23 deletions(-) diff --git a/.bam/functions.lua b/.bam/functions.lua index 1312770..5a796da 100644 --- a/.bam/functions.lua +++ b/.bam/functions.lua @@ -1,7 +1,7 @@ local _systems = { "Win32", - -- "Linux" + "Unix" } @@ -14,12 +14,19 @@ end -- Detect what system we currently are on. function system() - local win = os.getenv('OS') - - if win:lower():match('windows') then - return _systems[1] + if family ~= nil then + if family == "windows" then + return _systems[1] + end + if family == "unix" then + return _systems[2] + end end + local win = os.getenv('OS') + if win ~= nil and win:lower():match('windows') then + return _systems[1] + end return nil end diff --git a/.gitignore b/.gitignore index bcd7a8c..6977329 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ +# Build system related files build/ .bam/* !.bam/*.lua diff --git a/engine.build.lua b/engine.build.lua index 9d3f97b..817560b 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -18,7 +18,14 @@ if global_settings.debug then end -- FreeType2 -settings.cc.includes:Add("vendor/FreeType2/include") +if TARGET_OS == "Win32" then + settings.cc.includes:Add("vendor/FreeType2/include") + + -- Staticly link freetype on windows. + settings.link.libpath:Add("vendor/FreeType2/lib/x86") +else + settings.cc.includes:Add("/usr/include/freetype2") +end -- STB settings.cc.includes:Add("vendor/stb/include") @@ -41,22 +48,33 @@ local platform_common_module = Module("source/Platform", { "PlatformDisplay.cpp" }) - --- if TARGET_OS == "Win32" then -- Needed later for unix. -local platform_spec_module = Module("source/Platform/Win32", { - "Win32Application.cpp", - "Win32Display.cpp", - "Win32GLContext.cpp", - "Win32Input.cpp", - "Win32Internal.cpp", - "Win32Keyboard.cpp", - "Win32Misc.cpp", - "Win32Mouse.cpp", - "Win32EventQueue.cpp", - "Win32System.cpp", - "glad_wgl.c" -}) ---end +if TARGET_OS == "Win32" then + local platform_spec_module = Module("source/Platform/Win32", { + "Win32Application.cpp", + "Win32Display.cpp", + "Win32GLContext.cpp", + "Win32Input.cpp", + "Win32Internal.cpp", + "Win32Keyboard.cpp", + "Win32Misc.cpp", + "Win32Mouse.cpp", + "Win32EventQueue.cpp", + "Win32System.cpp", + "glad_wgl.c" + }) +elseif TARGET_OS == "Unix" then + platform_spec_module = Module("source/Platform/Unix", { + "UnixApplication.cpp", + "X11Display.cpp", + "GLXContext.cpp", + "X11Input.cpp", + "X11Keyboard.cpp", + "X11Mouse.cpp", + "X11EventQueue.cpp", + "UnixMisc.cpp", + "UnixSystem.cpp" + }) +end local input_module = Module("source/Input", { "InputDevice.cpp", @@ -132,7 +150,9 @@ local scene_module = Module("source/Scene", { ----------------------------------------------------------- -- Dependancies -Import("vendor/FreeType2/build.lua") +if TARGET_OS == "Win32" then + Import("vendor/FreeType2/build.lua") +end -- engine local obj = Compile(settings, { diff --git a/examples/build.lua b/examples/build.lua index 552dea1..2445a86 100644 --- a/examples/build.lua +++ b/examples/build.lua @@ -16,6 +16,10 @@ if TARGET_OS == "Win32" then -- Windows needs to link against these. example_settings.link.libs:Add("opengl32", "gdi32", "user32") +elseif TARGET_OS == "Unix" then + + -- Unix nees dl and X11 libs. + example_settings.link.libs:Add("dl", 'X11', 'freetype') end -- For now, to get examples working From 7fd1ee54453802aaa47ad38f5eed1a153149b7ef Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 24 Dec 2019 21:22:37 +0100 Subject: [PATCH 140/361] assets: bam does not like whitespace in file names. --- .../fonts/{Anonymous Pro.ttf => Anonymous-Pro.ttf} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename assets/fonts/{Anonymous Pro.ttf => Anonymous-Pro.ttf} (100%) diff --git a/assets/fonts/Anonymous Pro.ttf b/assets/fonts/Anonymous-Pro.ttf similarity index 100% rename from assets/fonts/Anonymous Pro.ttf rename to assets/fonts/Anonymous-Pro.ttf From c41fb6c013262dcac2b8018015b9c7668dbf2b3e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 24 Dec 2019 21:30:13 +0100 Subject: [PATCH 141/361] Adding glad GLX --- engine.build.lua | 3 +- source/Platform/Unix/glad_glx.c | 382 ++++++++++++++++++++ source/Platform/Unix/glad_glx.h | 602 ++++++++++++++++++++++++++++++++ 3 files changed, 986 insertions(+), 1 deletion(-) create mode 100644 source/Platform/Unix/glad_glx.c create mode 100644 source/Platform/Unix/glad_glx.h diff --git a/engine.build.lua b/engine.build.lua index 817560b..24c1821 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -72,7 +72,8 @@ elseif TARGET_OS == "Unix" then "X11Mouse.cpp", "X11EventQueue.cpp", "UnixMisc.cpp", - "UnixSystem.cpp" + "UnixSystem.cpp", + "glad_glx.c" }) end diff --git a/source/Platform/Unix/glad_glx.c b/source/Platform/Unix/glad_glx.c new file mode 100644 index 0000000..c9af335 --- /dev/null +++ b/source/Platform/Unix/glad_glx.c @@ -0,0 +1,382 @@ +#include +#include +#include +#include "glad_glx.h" + +#ifndef GLAD_IMPL_UTIL_C_ +#define GLAD_IMPL_UTIL_C_ + +#ifdef _MSC_VER +#define GLAD_IMPL_UTIL_SSCANF sscanf_s +#else +#define GLAD_IMPL_UTIL_SSCANF sscanf +#endif + +#endif /* GLAD_IMPL_UTIL_C_ */ + + +int GLAD_GLX_VERSION_1_0 = 0; +int GLAD_GLX_VERSION_1_1 = 0; +int GLAD_GLX_VERSION_1_2 = 0; +int GLAD_GLX_VERSION_1_3 = 0; +int GLAD_GLX_VERSION_1_4 = 0; +int GLAD_GLX_ARB_create_context = 0; +int GLAD_GLX_ARB_create_context_profile = 0; +int GLAD_GLX_ARB_get_proc_address = 0; +int GLAD_GLX_EXT_swap_control = 0; +int GLAD_GLX_MESA_swap_control = 0; +int GLAD_GLX_SGI_swap_control = 0; + + + +PFNGLXCHOOSEFBCONFIGPROC glad_glXChooseFBConfig = NULL; +PFNGLXCHOOSEVISUALPROC glad_glXChooseVisual = NULL; +PFNGLXCOPYCONTEXTPROC glad_glXCopyContext = NULL; +PFNGLXCREATECONTEXTPROC glad_glXCreateContext = NULL; +PFNGLXCREATECONTEXTATTRIBSARBPROC glad_glXCreateContextAttribsARB = NULL; +PFNGLXCREATEGLXPIXMAPPROC glad_glXCreateGLXPixmap = NULL; +PFNGLXCREATENEWCONTEXTPROC glad_glXCreateNewContext = NULL; +PFNGLXCREATEPBUFFERPROC glad_glXCreatePbuffer = NULL; +PFNGLXCREATEPIXMAPPROC glad_glXCreatePixmap = NULL; +PFNGLXCREATEWINDOWPROC glad_glXCreateWindow = NULL; +PFNGLXDESTROYCONTEXTPROC glad_glXDestroyContext = NULL; +PFNGLXDESTROYGLXPIXMAPPROC glad_glXDestroyGLXPixmap = NULL; +PFNGLXDESTROYPBUFFERPROC glad_glXDestroyPbuffer = NULL; +PFNGLXDESTROYPIXMAPPROC glad_glXDestroyPixmap = NULL; +PFNGLXDESTROYWINDOWPROC glad_glXDestroyWindow = NULL; +PFNGLXGETCLIENTSTRINGPROC glad_glXGetClientString = NULL; +PFNGLXGETCONFIGPROC glad_glXGetConfig = NULL; +PFNGLXGETCURRENTCONTEXTPROC glad_glXGetCurrentContext = NULL; +PFNGLXGETCURRENTDISPLAYPROC glad_glXGetCurrentDisplay = NULL; +PFNGLXGETCURRENTDRAWABLEPROC glad_glXGetCurrentDrawable = NULL; +PFNGLXGETCURRENTREADDRAWABLEPROC glad_glXGetCurrentReadDrawable = NULL; +PFNGLXGETFBCONFIGATTRIBPROC glad_glXGetFBConfigAttrib = NULL; +PFNGLXGETFBCONFIGSPROC glad_glXGetFBConfigs = NULL; +PFNGLXGETPROCADDRESSPROC glad_glXGetProcAddress = NULL; +PFNGLXGETPROCADDRESSARBPROC glad_glXGetProcAddressARB = NULL; +PFNGLXGETSELECTEDEVENTPROC glad_glXGetSelectedEvent = NULL; +PFNGLXGETSWAPINTERVALMESAPROC glad_glXGetSwapIntervalMESA = NULL; +PFNGLXGETVISUALFROMFBCONFIGPROC glad_glXGetVisualFromFBConfig = NULL; +PFNGLXISDIRECTPROC glad_glXIsDirect = NULL; +PFNGLXMAKECONTEXTCURRENTPROC glad_glXMakeContextCurrent = NULL; +PFNGLXMAKECURRENTPROC glad_glXMakeCurrent = NULL; +PFNGLXQUERYCONTEXTPROC glad_glXQueryContext = NULL; +PFNGLXQUERYDRAWABLEPROC glad_glXQueryDrawable = NULL; +PFNGLXQUERYEXTENSIONPROC glad_glXQueryExtension = NULL; +PFNGLXQUERYEXTENSIONSSTRINGPROC glad_glXQueryExtensionsString = NULL; +PFNGLXQUERYSERVERSTRINGPROC glad_glXQueryServerString = NULL; +PFNGLXQUERYVERSIONPROC glad_glXQueryVersion = NULL; +PFNGLXSELECTEVENTPROC glad_glXSelectEvent = NULL; +PFNGLXSWAPBUFFERSPROC glad_glXSwapBuffers = NULL; +PFNGLXSWAPINTERVALEXTPROC glad_glXSwapIntervalEXT = NULL; +PFNGLXSWAPINTERVALMESAPROC glad_glXSwapIntervalMESA = NULL; +PFNGLXSWAPINTERVALSGIPROC glad_glXSwapIntervalSGI = NULL; +PFNGLXUSEXFONTPROC glad_glXUseXFont = NULL; +PFNGLXWAITGLPROC glad_glXWaitGL = NULL; +PFNGLXWAITXPROC glad_glXWaitX = NULL; + + +static void glad_glx_load_GLX_VERSION_1_0( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GLX_VERSION_1_0) return; + glad_glXChooseVisual = (PFNGLXCHOOSEVISUALPROC) load(userptr, "glXChooseVisual"); + glad_glXCopyContext = (PFNGLXCOPYCONTEXTPROC) load(userptr, "glXCopyContext"); + glad_glXCreateContext = (PFNGLXCREATECONTEXTPROC) load(userptr, "glXCreateContext"); + glad_glXCreateGLXPixmap = (PFNGLXCREATEGLXPIXMAPPROC) load(userptr, "glXCreateGLXPixmap"); + glad_glXDestroyContext = (PFNGLXDESTROYCONTEXTPROC) load(userptr, "glXDestroyContext"); + glad_glXDestroyGLXPixmap = (PFNGLXDESTROYGLXPIXMAPPROC) load(userptr, "glXDestroyGLXPixmap"); + glad_glXGetConfig = (PFNGLXGETCONFIGPROC) load(userptr, "glXGetConfig"); + glad_glXGetCurrentContext = (PFNGLXGETCURRENTCONTEXTPROC) load(userptr, "glXGetCurrentContext"); + glad_glXGetCurrentDrawable = (PFNGLXGETCURRENTDRAWABLEPROC) load(userptr, "glXGetCurrentDrawable"); + glad_glXIsDirect = (PFNGLXISDIRECTPROC) load(userptr, "glXIsDirect"); + glad_glXMakeCurrent = (PFNGLXMAKECURRENTPROC) load(userptr, "glXMakeCurrent"); + glad_glXQueryExtension = (PFNGLXQUERYEXTENSIONPROC) load(userptr, "glXQueryExtension"); + glad_glXQueryVersion = (PFNGLXQUERYVERSIONPROC) load(userptr, "glXQueryVersion"); + glad_glXSwapBuffers = (PFNGLXSWAPBUFFERSPROC) load(userptr, "glXSwapBuffers"); + glad_glXUseXFont = (PFNGLXUSEXFONTPROC) load(userptr, "glXUseXFont"); + glad_glXWaitGL = (PFNGLXWAITGLPROC) load(userptr, "glXWaitGL"); + glad_glXWaitX = (PFNGLXWAITXPROC) load(userptr, "glXWaitX"); +} +static void glad_glx_load_GLX_VERSION_1_1( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GLX_VERSION_1_1) return; + glad_glXGetClientString = (PFNGLXGETCLIENTSTRINGPROC) load(userptr, "glXGetClientString"); + glad_glXQueryExtensionsString = (PFNGLXQUERYEXTENSIONSSTRINGPROC) load(userptr, "glXQueryExtensionsString"); + glad_glXQueryServerString = (PFNGLXQUERYSERVERSTRINGPROC) load(userptr, "glXQueryServerString"); +} +static void glad_glx_load_GLX_VERSION_1_2( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GLX_VERSION_1_2) return; + glad_glXGetCurrentDisplay = (PFNGLXGETCURRENTDISPLAYPROC) load(userptr, "glXGetCurrentDisplay"); +} +static void glad_glx_load_GLX_VERSION_1_3( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GLX_VERSION_1_3) return; + glad_glXChooseFBConfig = (PFNGLXCHOOSEFBCONFIGPROC) load(userptr, "glXChooseFBConfig"); + glad_glXCreateNewContext = (PFNGLXCREATENEWCONTEXTPROC) load(userptr, "glXCreateNewContext"); + glad_glXCreatePbuffer = (PFNGLXCREATEPBUFFERPROC) load(userptr, "glXCreatePbuffer"); + glad_glXCreatePixmap = (PFNGLXCREATEPIXMAPPROC) load(userptr, "glXCreatePixmap"); + glad_glXCreateWindow = (PFNGLXCREATEWINDOWPROC) load(userptr, "glXCreateWindow"); + glad_glXDestroyPbuffer = (PFNGLXDESTROYPBUFFERPROC) load(userptr, "glXDestroyPbuffer"); + glad_glXDestroyPixmap = (PFNGLXDESTROYPIXMAPPROC) load(userptr, "glXDestroyPixmap"); + glad_glXDestroyWindow = (PFNGLXDESTROYWINDOWPROC) load(userptr, "glXDestroyWindow"); + glad_glXGetCurrentReadDrawable = (PFNGLXGETCURRENTREADDRAWABLEPROC) load(userptr, "glXGetCurrentReadDrawable"); + glad_glXGetFBConfigAttrib = (PFNGLXGETFBCONFIGATTRIBPROC) load(userptr, "glXGetFBConfigAttrib"); + glad_glXGetFBConfigs = (PFNGLXGETFBCONFIGSPROC) load(userptr, "glXGetFBConfigs"); + glad_glXGetSelectedEvent = (PFNGLXGETSELECTEDEVENTPROC) load(userptr, "glXGetSelectedEvent"); + glad_glXGetVisualFromFBConfig = (PFNGLXGETVISUALFROMFBCONFIGPROC) load(userptr, "glXGetVisualFromFBConfig"); + glad_glXMakeContextCurrent = (PFNGLXMAKECONTEXTCURRENTPROC) load(userptr, "glXMakeContextCurrent"); + glad_glXQueryContext = (PFNGLXQUERYCONTEXTPROC) load(userptr, "glXQueryContext"); + glad_glXQueryDrawable = (PFNGLXQUERYDRAWABLEPROC) load(userptr, "glXQueryDrawable"); + glad_glXSelectEvent = (PFNGLXSELECTEVENTPROC) load(userptr, "glXSelectEvent"); +} +static void glad_glx_load_GLX_VERSION_1_4( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GLX_VERSION_1_4) return; + glad_glXGetProcAddress = (PFNGLXGETPROCADDRESSPROC) load(userptr, "glXGetProcAddress"); +} +static void glad_glx_load_GLX_ARB_create_context( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GLX_ARB_create_context) return; + glad_glXCreateContextAttribsARB = (PFNGLXCREATECONTEXTATTRIBSARBPROC) load(userptr, "glXCreateContextAttribsARB"); +} +static void glad_glx_load_GLX_ARB_get_proc_address( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GLX_ARB_get_proc_address) return; + glad_glXGetProcAddressARB = (PFNGLXGETPROCADDRESSARBPROC) load(userptr, "glXGetProcAddressARB"); +} +static void glad_glx_load_GLX_EXT_swap_control( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GLX_EXT_swap_control) return; + glad_glXSwapIntervalEXT = (PFNGLXSWAPINTERVALEXTPROC) load(userptr, "glXSwapIntervalEXT"); +} +static void glad_glx_load_GLX_MESA_swap_control( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GLX_MESA_swap_control) return; + glad_glXGetSwapIntervalMESA = (PFNGLXGETSWAPINTERVALMESAPROC) load(userptr, "glXGetSwapIntervalMESA"); + glad_glXSwapIntervalMESA = (PFNGLXSWAPINTERVALMESAPROC) load(userptr, "glXSwapIntervalMESA"); +} +static void glad_glx_load_GLX_SGI_swap_control( GLADuserptrloadfunc load, void* userptr) { + if(!GLAD_GLX_SGI_swap_control) return; + glad_glXSwapIntervalSGI = (PFNGLXSWAPINTERVALSGIPROC) load(userptr, "glXSwapIntervalSGI"); +} + + + +static int glad_glx_has_extension(Display *display, int screen, const char *ext) { +#ifndef GLX_VERSION_1_1 + (void) display; + (void) screen; + (void) ext; +#else + const char *terminator; + const char *loc; + const char *extensions; + + if (glXQueryExtensionsString == NULL) { + return 0; + } + + extensions = glXQueryExtensionsString(display, screen); + + if(extensions == NULL || ext == NULL) { + return 0; + } + + while(1) { + loc = strstr(extensions, ext); + if(loc == NULL) + break; + + terminator = loc + strlen(ext); + if((loc == extensions || *(loc - 1) == ' ') && + (*terminator == ' ' || *terminator == '\0')) { + return 1; + } + extensions = terminator; + } +#endif + + return 0; +} + +static GLADapiproc glad_glx_get_proc_from_userptr(void *userptr, const char* name) { + return (GLAD_GNUC_EXTENSION (GLADapiproc (*)(const char *name)) userptr)(name); +} + +static int glad_glx_find_extensions(Display *display, int screen) { + GLAD_GLX_ARB_create_context = glad_glx_has_extension(display, screen, "GLX_ARB_create_context"); + GLAD_GLX_ARB_create_context_profile = glad_glx_has_extension(display, screen, "GLX_ARB_create_context_profile"); + GLAD_GLX_ARB_get_proc_address = glad_glx_has_extension(display, screen, "GLX_ARB_get_proc_address"); + GLAD_GLX_EXT_swap_control = glad_glx_has_extension(display, screen, "GLX_EXT_swap_control"); + GLAD_GLX_MESA_swap_control = glad_glx_has_extension(display, screen, "GLX_MESA_swap_control"); + GLAD_GLX_SGI_swap_control = glad_glx_has_extension(display, screen, "GLX_SGI_swap_control"); + return 1; +} + +static int glad_glx_find_core_glx(Display **display, int *screen) { + int major = 0, minor = 0; + if(*display == NULL) { +#ifdef GLAD_GLX_NO_X11 + (void) screen; + return 0; +#else + *display = XOpenDisplay(0); + if (*display == NULL) { + return 0; + } + *screen = XScreenNumberOfScreen(XDefaultScreenOfDisplay(*display)); +#endif + } + glXQueryVersion(*display, &major, &minor); + GLAD_GLX_VERSION_1_0 = (major == 1 && minor >= 0) || major > 1; + GLAD_GLX_VERSION_1_1 = (major == 1 && minor >= 1) || major > 1; + GLAD_GLX_VERSION_1_2 = (major == 1 && minor >= 2) || major > 1; + GLAD_GLX_VERSION_1_3 = (major == 1 && minor >= 3) || major > 1; + GLAD_GLX_VERSION_1_4 = (major == 1 && minor >= 4) || major > 1; + return GLAD_MAKE_VERSION(major, minor); +} + +int gladLoadGLXUserPtr(Display *display, int screen, GLADuserptrloadfunc load, void *userptr) { + int version; + glXQueryVersion = (PFNGLXQUERYVERSIONPROC) load(userptr, "glXQueryVersion"); + if(glXQueryVersion == NULL) return 0; + version = glad_glx_find_core_glx(&display, &screen); + + glad_glx_load_GLX_VERSION_1_0(load, userptr); + glad_glx_load_GLX_VERSION_1_1(load, userptr); + glad_glx_load_GLX_VERSION_1_2(load, userptr); + glad_glx_load_GLX_VERSION_1_3(load, userptr); + glad_glx_load_GLX_VERSION_1_4(load, userptr); + + if (!glad_glx_find_extensions(display, screen)) return 0; + glad_glx_load_GLX_ARB_create_context(load, userptr); + glad_glx_load_GLX_ARB_get_proc_address(load, userptr); + glad_glx_load_GLX_EXT_swap_control(load, userptr); + glad_glx_load_GLX_MESA_swap_control(load, userptr); + glad_glx_load_GLX_SGI_swap_control(load, userptr); + + return version; +} + +int gladLoadGLX(Display *display, int screen, GLADloadfunc load) { + return gladLoadGLXUserPtr(display, screen, glad_glx_get_proc_from_userptr, GLAD_GNUC_EXTENSION (void*) load); +} + + + +#ifdef GLAD_GLX + +#ifndef GLAD_LOADER_LIBRARY_C_ +#define GLAD_LOADER_LIBRARY_C_ + +#include +#include + +#if GLAD_PLATFORM_WIN32 +#include +#else +#include +#endif + + +static void* glad_get_dlopen_handle(const char *lib_names[], int length) { + void *handle = NULL; + int i; + + for (i = 0; i < length; ++i) { +#if GLAD_PLATFORM_WIN32 + #if GLAD_PLATFORM_UWP + size_t buffer_size = (strlen(lib_names[i]) + 1) * sizeof(WCHAR); + LPWSTR buffer = (LPWSTR) malloc(buffer_size); + if (buffer != NULL) { + int ret = MultiByteToWideChar(CP_ACP, 0, lib_names[i], -1, buffer, buffer_size); + if (ret != 0) { + handle = (void*) LoadPackagedLibrary(buffer, 0); + } + free((void*) buffer); + } + #else + handle = (void*) LoadLibraryA(lib_names[i]); + #endif +#else + handle = dlopen(lib_names[i], RTLD_LAZY | RTLD_LOCAL); +#endif + if (handle != NULL) { + return handle; + } + } + + return NULL; +} + +static void glad_close_dlopen_handle(void* handle) { + if (handle != NULL) { +#if GLAD_PLATFORM_WIN32 + FreeLibrary((HMODULE) handle); +#else + dlclose(handle); +#endif + } +} + +static GLADapiproc glad_dlsym_handle(void* handle, const char *name) { + if (handle == NULL) { + return NULL; + } + +#if GLAD_PLATFORM_WIN32 + return (GLADapiproc) GetProcAddress((HMODULE) handle, name); +#else + return GLAD_GNUC_EXTENSION (GLADapiproc) dlsym(handle, name); +#endif +} + +#endif /* GLAD_LOADER_LIBRARY_C_ */ + +typedef void* (GLAD_API_PTR *GLADglxprocaddrfunc)(const char*); + +static GLADapiproc glad_glx_get_proc(void *userptr, const char *name) { + return GLAD_GNUC_EXTENSION ((GLADapiproc (*)(const char *name)) userptr)(name); +} + +static void* _glx_handle; + +static void* glad_glx_dlopen_handle(void) { + static const char *NAMES[] = { +#if defined __CYGWIN__ + "libGL-1.so", +#endif + "libGL.so.1", + "libGL.so" + }; + + if (_glx_handle == NULL) { + _glx_handle = glad_get_dlopen_handle(NAMES, sizeof(NAMES) / sizeof(NAMES[0])); + } + + return _glx_handle; +} + +int gladLoaderLoadGLX(Display *display, int screen) { + int version = 0; + void *handle = NULL; + int did_load = 0; + GLADglxprocaddrfunc loader; + + did_load = _glx_handle == NULL; + handle = glad_glx_dlopen_handle(); + if (handle != NULL) { + loader = (GLADglxprocaddrfunc) glad_dlsym_handle(handle, "glXGetProcAddressARB"); + if (loader != NULL) { + version = gladLoadGLXUserPtr(display, screen, glad_glx_get_proc, GLAD_GNUC_EXTENSION (void*) loader); + } + + if (!version && did_load) { + gladLoaderUnloadGLX(); + } + } + + return version; +} + + +void gladLoaderUnloadGLX() { + if (_glx_handle != NULL) { + glad_close_dlopen_handle(_glx_handle); + _glx_handle = NULL; + } +} + +#endif /* GLAD_GLX */ diff --git a/source/Platform/Unix/glad_glx.h b/source/Platform/Unix/glad_glx.h new file mode 100644 index 0000000..d6ffe96 --- /dev/null +++ b/source/Platform/Unix/glad_glx.h @@ -0,0 +1,602 @@ +/** + * Loader generated by glad 2.0.0-beta on Sat Dec 21 20:36:57 2019 + * + * Generator: C/C++ + * Specification: glx + * Extensions: 6 + * + * APIs: + * - glx=1.4 + * + * Options: + * - MX_GLOBAL = False + * - ON_DEMAND = False + * - LOADER = True + * - ALIAS = False + * - HEADER_ONLY = False + * - DEBUG = False + * - MX = False + * + * Commandline: + * --api='glx=1.4' --extensions='GLX_ARB_create_context,GLX_ARB_create_context_profile,GLX_ARB_get_proc_address,GLX_EXT_swap_control,GLX_MESA_swap_control,GLX_SGI_swap_control' c --loader + * + * Online: + * http://glad.sh/#api=glx%3D1.4&extensions=GLX_ARB_create_context%2CGLX_ARB_create_context_profile%2CGLX_ARB_get_proc_address%2CGLX_EXT_swap_control%2CGLX_MESA_swap_control%2CGLX_SGI_swap_control&generator=c&options=LOADER + * + */ + +#ifndef GLAD_GLX_H_ +#define GLAD_GLX_H_ + +#ifdef GLX_H + #error GLX header already included (API: glx), remove previous include! +#endif +#define GLX_H 1 + + +#include +#include +#include + +#include + +#define GLAD_GLX +#define GLAD_OPTION_GLX_LOADER + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef GLAD_PLATFORM_H_ +#define GLAD_PLATFORM_H_ + +#ifndef GLAD_PLATFORM_WIN32 + #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__MINGW32__) + #define GLAD_PLATFORM_WIN32 1 + #else + #define GLAD_PLATFORM_WIN32 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_APPLE + #ifdef __APPLE__ + #define GLAD_PLATFORM_APPLE 1 + #else + #define GLAD_PLATFORM_APPLE 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_EMSCRIPTEN + #ifdef __EMSCRIPTEN__ + #define GLAD_PLATFORM_EMSCRIPTEN 1 + #else + #define GLAD_PLATFORM_EMSCRIPTEN 0 + #endif +#endif + +#ifndef GLAD_PLATFORM_UWP + #if defined(_MSC_VER) && !defined(GLAD_INTERNAL_HAVE_WINAPIFAMILY) + #ifdef __has_include + #if __has_include() + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #elif _MSC_VER >= 1700 && !_USING_V110_SDK71_ + #define GLAD_INTERNAL_HAVE_WINAPIFAMILY 1 + #endif + #endif + + #ifdef GLAD_INTERNAL_HAVE_WINAPIFAMILY + #include + #if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) + #define GLAD_PLATFORM_UWP 1 + #endif + #endif + + #ifndef GLAD_PLATFORM_UWP + #define GLAD_PLATFORM_UWP 0 + #endif +#endif + +#ifdef __GNUC__ + #define GLAD_GNUC_EXTENSION __extension__ +#else + #define GLAD_GNUC_EXTENSION +#endif + +#ifndef GLAD_API_CALL + #if defined(GLAD_API_CALL_EXPORT) + #if GLAD_PLATFORM_WIN32 || defined(__CYGWIN__) + #if defined(GLAD_API_CALL_EXPORT_BUILD) + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllexport)) extern + #else + #define GLAD_API_CALL __declspec(dllexport) extern + #endif + #else + #if defined(__GNUC__) + #define GLAD_API_CALL __attribute__ ((dllimport)) extern + #else + #define GLAD_API_CALL __declspec(dllimport) extern + #endif + #endif + #elif defined(__GNUC__) && defined(GLAD_API_CALL_EXPORT_BUILD) + #define GLAD_API_CALL __attribute__ ((visibility ("default"))) extern + #else + #define GLAD_API_CALL extern + #endif + #else + #define GLAD_API_CALL extern + #endif +#endif + +#ifdef APIENTRY + #define GLAD_API_PTR APIENTRY +#elif GLAD_PLATFORM_WIN32 + #define GLAD_API_PTR __stdcall +#else + #define GLAD_API_PTR +#endif + +#ifndef GLAPI +#define GLAPI GLAD_API_CALL +#endif + +#ifndef GLAPIENTRY +#define GLAPIENTRY GLAD_API_PTR +#endif + +#define GLAD_MAKE_VERSION(major, minor) (major * 10000 + minor) +#define GLAD_VERSION_MAJOR(version) (version / 10000) +#define GLAD_VERSION_MINOR(version) (version % 10000) + +#define GLAD_GENERATOR_VERSION "2.0.0-beta" + +typedef void (*GLADapiproc)(void); + +typedef GLADapiproc (*GLADloadfunc)(const char *name); +typedef GLADapiproc (*GLADuserptrloadfunc)(void *userptr, const char *name); + +typedef void (*GLADprecallback)(const char *name, GLADapiproc apiproc, int len_args, ...); +typedef void (*GLADpostcallback)(void *ret, const char *name, GLADapiproc apiproc, int len_args, ...); + +#endif /* GLAD_PLATFORM_H_ */ + +#define GLX_ACCUM_ALPHA_SIZE 17 +#define GLX_ACCUM_BLUE_SIZE 16 +#define GLX_ACCUM_BUFFER_BIT 0x00000080 +#define GLX_ACCUM_GREEN_SIZE 15 +#define GLX_ACCUM_RED_SIZE 14 +#define GLX_ALPHA_SIZE 11 +#define GLX_AUX_BUFFERS 7 +#define GLX_AUX_BUFFERS_BIT 0x00000010 +#define GLX_BACK_LEFT_BUFFER_BIT 0x00000004 +#define GLX_BACK_RIGHT_BUFFER_BIT 0x00000008 +#define GLX_BAD_ATTRIBUTE 2 +#define GLX_BAD_CONTEXT 5 +#define GLX_BAD_ENUM 7 +#define GLX_BAD_SCREEN 1 +#define GLX_BAD_VALUE 6 +#define GLX_BAD_VISUAL 4 +#define GLX_BLUE_SIZE 10 +#define GLX_BUFFER_SIZE 2 +#define GLX_BufferSwapComplete 1 +#define GLX_COLOR_INDEX_BIT 0x00000002 +#define GLX_COLOR_INDEX_TYPE 0x8015 +#define GLX_CONFIG_CAVEAT 0x20 +#define GLX_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 +#define GLX_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 +#define GLX_CONTEXT_DEBUG_BIT_ARB 0x00000001 +#define GLX_CONTEXT_FLAGS_ARB 0x2094 +#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002 +#define GLX_CONTEXT_MAJOR_VERSION_ARB 0x2091 +#define GLX_CONTEXT_MINOR_VERSION_ARB 0x2092 +#define GLX_CONTEXT_PROFILE_MASK_ARB 0x9126 +#define GLX_DAMAGED 0x8020 +#define GLX_DEPTH_BUFFER_BIT 0x00000020 +#define GLX_DEPTH_SIZE 12 +#define GLX_DIRECT_COLOR 0x8003 +#define GLX_DONT_CARE 0xFFFFFFFF +#define GLX_DOUBLEBUFFER 5 +#define GLX_DRAWABLE_TYPE 0x8010 +#define GLX_EVENT_MASK 0x801F +#define GLX_EXTENSIONS 0x3 +#define GLX_EXTENSION_NAME "GLX" +#define GLX_FBCONFIG_ID 0x8013 +#define GLX_FRONT_LEFT_BUFFER_BIT 0x00000001 +#define GLX_FRONT_RIGHT_BUFFER_BIT 0x00000002 +#define GLX_GRAY_SCALE 0x8006 +#define GLX_GREEN_SIZE 9 +#define GLX_HEIGHT 0x801E +#define GLX_LARGEST_PBUFFER 0x801C +#define GLX_LEVEL 3 +#define GLX_MAX_PBUFFER_HEIGHT 0x8017 +#define GLX_MAX_PBUFFER_PIXELS 0x8018 +#define GLX_MAX_PBUFFER_WIDTH 0x8016 +#define GLX_MAX_SWAP_INTERVAL_EXT 0x20F2 +#define GLX_NONE 0x8000 +#define GLX_NON_CONFORMANT_CONFIG 0x800D +#define GLX_NO_EXTENSION 3 +#define GLX_PBUFFER 0x8023 +#define GLX_PBUFFER_BIT 0x00000004 +#define GLX_PBUFFER_CLOBBER_MASK 0x08000000 +#define GLX_PBUFFER_HEIGHT 0x8040 +#define GLX_PBUFFER_WIDTH 0x8041 +#define GLX_PIXMAP_BIT 0x00000002 +#define GLX_PRESERVED_CONTENTS 0x801B +#define GLX_PSEUDO_COLOR 0x8004 +#define GLX_PbufferClobber 0 +#define GLX_RED_SIZE 8 +#define GLX_RENDER_TYPE 0x8011 +#define GLX_RGBA 4 +#define GLX_RGBA_BIT 0x00000001 +#define GLX_RGBA_TYPE 0x8014 +#define GLX_SAMPLES 100001 +#define GLX_SAMPLE_BUFFERS 100000 +#define GLX_SAVED 0x8021 +#define GLX_SCREEN 0x800C +#define GLX_SLOW_CONFIG 0x8001 +#define GLX_STATIC_COLOR 0x8005 +#define GLX_STATIC_GRAY 0x8007 +#define GLX_STENCIL_BUFFER_BIT 0x00000040 +#define GLX_STENCIL_SIZE 13 +#define GLX_STEREO 6 +#define GLX_SWAP_INTERVAL_EXT 0x20F1 +#define GLX_TRANSPARENT_ALPHA_VALUE 0x28 +#define GLX_TRANSPARENT_BLUE_VALUE 0x27 +#define GLX_TRANSPARENT_GREEN_VALUE 0x26 +#define GLX_TRANSPARENT_INDEX 0x8009 +#define GLX_TRANSPARENT_INDEX_VALUE 0x24 +#define GLX_TRANSPARENT_RED_VALUE 0x25 +#define GLX_TRANSPARENT_RGB 0x8008 +#define GLX_TRANSPARENT_TYPE 0x23 +#define GLX_TRUE_COLOR 0x8002 +#define GLX_USE_GL 1 +#define GLX_VENDOR 0x1 +#define GLX_VERSION 0x2 +#define GLX_VISUAL_ID 0x800B +#define GLX_WIDTH 0x801D +#define GLX_WINDOW 0x8022 +#define GLX_WINDOW_BIT 0x00000001 +#define GLX_X_RENDERABLE 0x8012 +#define GLX_X_VISUAL_TYPE 0x22 +#define __GLX_NUMBER_EVENTS 17 + + +#ifndef GLEXT_64_TYPES_DEFINED +/* This code block is duplicated in glext.h, so must be protected */ +#define GLEXT_64_TYPES_DEFINED +/* Define int32_t, int64_t, and uint64_t types for UST/MSC */ +/* (as used in the GLX_OML_sync_control extension). */ +#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L +#include +#elif defined(__sun__) || defined(__digital__) +#include +#if defined(__STDC__) +#if defined(__arch64__) || defined(_LP64) +typedef long int int64_t; +typedef unsigned long int uint64_t; +#else +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#endif /* __arch64__ */ +#endif /* __STDC__ */ +#elif defined( __VMS ) || defined(__sgi) +#include +#elif defined(__SCO__) || defined(__USLC__) +#include +#elif defined(__UNIXOS2__) || defined(__SOL64__) +typedef long int int32_t; +typedef long long int int64_t; +typedef unsigned long long int uint64_t; +#elif defined(_WIN32) && defined(__GNUC__) +#include +#elif defined(_WIN32) +typedef __int32 int32_t; +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; +#else +/* Fallback if nothing above works */ +#include +#endif +#endif + + + + + + + + + + + + + + + + +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) + +#else + +#endif + +#if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ > 1060) + +#else + +#endif + + + + + + + +typedef XID GLXFBConfigID; +typedef struct __GLXFBConfigRec *GLXFBConfig; +typedef XID GLXContextID; +typedef struct __GLXcontextRec *GLXContext; +typedef XID GLXPixmap; +typedef XID GLXDrawable; +typedef XID GLXWindow; +typedef XID GLXPbuffer; +typedef void (GLAD_API_PTR *__GLXextFuncPtr)(void); +typedef XID GLXVideoCaptureDeviceNV; +typedef unsigned int GLXVideoDeviceNV; +typedef XID GLXVideoSourceSGIX; +typedef XID GLXFBConfigIDSGIX; +typedef struct __GLXFBConfigRec *GLXFBConfigSGIX; +typedef XID GLXPbufferSGIX; +typedef struct { + int event_type; /* GLX_DAMAGED or GLX_SAVED */ + int draw_type; /* GLX_WINDOW or GLX_PBUFFER */ + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came for SendEvent request */ + Display *display; /* display the event was read from */ + GLXDrawable drawable; /* XID of Drawable */ + unsigned int buffer_mask; /* mask indicating which buffers are affected */ + unsigned int aux_buffer; /* which aux buffer was affected */ + int x, y; + int width, height; + int count; /* if nonzero, at least this many more */ +} GLXPbufferClobberEvent; +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came from a SendEvent request */ + Display *display; /* Display the event was read from */ + GLXDrawable drawable; /* drawable on which event was requested in event mask */ + int event_type; + int64_t ust; + int64_t msc; + int64_t sbc; +} GLXBufferSwapComplete; +typedef union __GLXEvent { + GLXPbufferClobberEvent glxpbufferclobber; + GLXBufferSwapComplete glxbufferswapcomplete; + long pad[24]; +} GLXEvent; +typedef struct { + int type; + unsigned long serial; + Bool send_event; + Display *display; + int extension; + int evtype; + GLXDrawable window; + Bool stereo_tree; +} GLXStereoNotifyEventEXT; +typedef struct { + int type; + unsigned long serial; /* # of last request processed by server */ + Bool send_event; /* true if this came for SendEvent request */ + Display *display; /* display the event was read from */ + GLXDrawable drawable; /* i.d. of Drawable */ + int event_type; /* GLX_DAMAGED_SGIX or GLX_SAVED_SGIX */ + int draw_type; /* GLX_WINDOW_SGIX or GLX_PBUFFER_SGIX */ + unsigned int mask; /* mask indicating which buffers are affected*/ + int x, y; + int width, height; + int count; /* if nonzero, at least this many more */ +} GLXBufferClobberEventSGIX; +typedef struct { + char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ + int networkId; +} GLXHyperpipeNetworkSGIX; +typedef struct { + char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ + int channel; + unsigned int participationType; + int timeSlice; +} GLXHyperpipeConfigSGIX; +typedef struct { + char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ + int srcXOrigin, srcYOrigin, srcWidth, srcHeight; + int destXOrigin, destYOrigin, destWidth, destHeight; +} GLXPipeRect; +typedef struct { + char pipeName[80]; /* Should be [GLX_HYPERPIPE_PIPE_NAME_LENGTH_SGIX] */ + int XOrigin, YOrigin, maxHeight, maxWidth; +} GLXPipeRectLimits; + + +#define GLX_VERSION_1_0 1 +GLAD_API_CALL int GLAD_GLX_VERSION_1_0; +#define GLX_VERSION_1_1 1 +GLAD_API_CALL int GLAD_GLX_VERSION_1_1; +#define GLX_VERSION_1_2 1 +GLAD_API_CALL int GLAD_GLX_VERSION_1_2; +#define GLX_VERSION_1_3 1 +GLAD_API_CALL int GLAD_GLX_VERSION_1_3; +#define GLX_VERSION_1_4 1 +GLAD_API_CALL int GLAD_GLX_VERSION_1_4; +#define GLX_ARB_create_context 1 +GLAD_API_CALL int GLAD_GLX_ARB_create_context; +#define GLX_ARB_create_context_profile 1 +GLAD_API_CALL int GLAD_GLX_ARB_create_context_profile; +#define GLX_ARB_get_proc_address 1 +GLAD_API_CALL int GLAD_GLX_ARB_get_proc_address; +#define GLX_EXT_swap_control 1 +GLAD_API_CALL int GLAD_GLX_EXT_swap_control; +#define GLX_MESA_swap_control 1 +GLAD_API_CALL int GLAD_GLX_MESA_swap_control; +#define GLX_SGI_swap_control 1 +GLAD_API_CALL int GLAD_GLX_SGI_swap_control; + + +typedef GLXFBConfig * (GLAD_API_PTR *PFNGLXCHOOSEFBCONFIGPROC)(Display * dpy, int screen, const int * attrib_list, int * nelements); +typedef XVisualInfo * (GLAD_API_PTR *PFNGLXCHOOSEVISUALPROC)(Display * dpy, int screen, int * attribList); +typedef void (GLAD_API_PTR *PFNGLXCOPYCONTEXTPROC)(Display * dpy, GLXContext src, GLXContext dst, unsigned long mask); +typedef GLXContext (GLAD_API_PTR *PFNGLXCREATECONTEXTPROC)(Display * dpy, XVisualInfo * vis, GLXContext shareList, Bool direct); +typedef GLXContext (GLAD_API_PTR *PFNGLXCREATECONTEXTATTRIBSARBPROC)(Display * dpy, GLXFBConfig config, GLXContext share_context, Bool direct, const int * attrib_list); +typedef GLXPixmap (GLAD_API_PTR *PFNGLXCREATEGLXPIXMAPPROC)(Display * dpy, XVisualInfo * visual, Pixmap pixmap); +typedef GLXContext (GLAD_API_PTR *PFNGLXCREATENEWCONTEXTPROC)(Display * dpy, GLXFBConfig config, int render_type, GLXContext share_list, Bool direct); +typedef GLXPbuffer (GLAD_API_PTR *PFNGLXCREATEPBUFFERPROC)(Display * dpy, GLXFBConfig config, const int * attrib_list); +typedef GLXPixmap (GLAD_API_PTR *PFNGLXCREATEPIXMAPPROC)(Display * dpy, GLXFBConfig config, Pixmap pixmap, const int * attrib_list); +typedef GLXWindow (GLAD_API_PTR *PFNGLXCREATEWINDOWPROC)(Display * dpy, GLXFBConfig config, Window win, const int * attrib_list); +typedef void (GLAD_API_PTR *PFNGLXDESTROYCONTEXTPROC)(Display * dpy, GLXContext ctx); +typedef void (GLAD_API_PTR *PFNGLXDESTROYGLXPIXMAPPROC)(Display * dpy, GLXPixmap pixmap); +typedef void (GLAD_API_PTR *PFNGLXDESTROYPBUFFERPROC)(Display * dpy, GLXPbuffer pbuf); +typedef void (GLAD_API_PTR *PFNGLXDESTROYPIXMAPPROC)(Display * dpy, GLXPixmap pixmap); +typedef void (GLAD_API_PTR *PFNGLXDESTROYWINDOWPROC)(Display * dpy, GLXWindow win); +typedef const char * (GLAD_API_PTR *PFNGLXGETCLIENTSTRINGPROC)(Display * dpy, int name); +typedef int (GLAD_API_PTR *PFNGLXGETCONFIGPROC)(Display * dpy, XVisualInfo * visual, int attrib, int * value); +typedef GLXContext (GLAD_API_PTR *PFNGLXGETCURRENTCONTEXTPROC)(void); +typedef Display * (GLAD_API_PTR *PFNGLXGETCURRENTDISPLAYPROC)(void); +typedef GLXDrawable (GLAD_API_PTR *PFNGLXGETCURRENTDRAWABLEPROC)(void); +typedef GLXDrawable (GLAD_API_PTR *PFNGLXGETCURRENTREADDRAWABLEPROC)(void); +typedef int (GLAD_API_PTR *PFNGLXGETFBCONFIGATTRIBPROC)(Display * dpy, GLXFBConfig config, int attribute, int * value); +typedef GLXFBConfig * (GLAD_API_PTR *PFNGLXGETFBCONFIGSPROC)(Display * dpy, int screen, int * nelements); +typedef __GLXextFuncPtr (GLAD_API_PTR *PFNGLXGETPROCADDRESSPROC)(const GLubyte * procName); +typedef __GLXextFuncPtr (GLAD_API_PTR *PFNGLXGETPROCADDRESSARBPROC)(const GLubyte * procName); +typedef void (GLAD_API_PTR *PFNGLXGETSELECTEDEVENTPROC)(Display * dpy, GLXDrawable draw, unsigned long * event_mask); +typedef int (GLAD_API_PTR *PFNGLXGETSWAPINTERVALMESAPROC)(void); +typedef XVisualInfo * (GLAD_API_PTR *PFNGLXGETVISUALFROMFBCONFIGPROC)(Display * dpy, GLXFBConfig config); +typedef Bool (GLAD_API_PTR *PFNGLXISDIRECTPROC)(Display * dpy, GLXContext ctx); +typedef Bool (GLAD_API_PTR *PFNGLXMAKECONTEXTCURRENTPROC)(Display * dpy, GLXDrawable draw, GLXDrawable read, GLXContext ctx); +typedef Bool (GLAD_API_PTR *PFNGLXMAKECURRENTPROC)(Display * dpy, GLXDrawable drawable, GLXContext ctx); +typedef int (GLAD_API_PTR *PFNGLXQUERYCONTEXTPROC)(Display * dpy, GLXContext ctx, int attribute, int * value); +typedef void (GLAD_API_PTR *PFNGLXQUERYDRAWABLEPROC)(Display * dpy, GLXDrawable draw, int attribute, unsigned int * value); +typedef Bool (GLAD_API_PTR *PFNGLXQUERYEXTENSIONPROC)(Display * dpy, int * errorb, int * event); +typedef const char * (GLAD_API_PTR *PFNGLXQUERYEXTENSIONSSTRINGPROC)(Display * dpy, int screen); +typedef const char * (GLAD_API_PTR *PFNGLXQUERYSERVERSTRINGPROC)(Display * dpy, int screen, int name); +typedef Bool (GLAD_API_PTR *PFNGLXQUERYVERSIONPROC)(Display * dpy, int * maj, int * min); +typedef void (GLAD_API_PTR *PFNGLXSELECTEVENTPROC)(Display * dpy, GLXDrawable draw, unsigned long event_mask); +typedef void (GLAD_API_PTR *PFNGLXSWAPBUFFERSPROC)(Display * dpy, GLXDrawable drawable); +typedef void (GLAD_API_PTR *PFNGLXSWAPINTERVALEXTPROC)(Display * dpy, GLXDrawable drawable, int interval); +typedef int (GLAD_API_PTR *PFNGLXSWAPINTERVALMESAPROC)(unsigned int interval); +typedef int (GLAD_API_PTR *PFNGLXSWAPINTERVALSGIPROC)(int interval); +typedef void (GLAD_API_PTR *PFNGLXUSEXFONTPROC)(Font font, int first, int count, int list); +typedef void (GLAD_API_PTR *PFNGLXWAITGLPROC)(void); +typedef void (GLAD_API_PTR *PFNGLXWAITXPROC)(void); + +GLAD_API_CALL PFNGLXCHOOSEFBCONFIGPROC glad_glXChooseFBConfig; +#define glXChooseFBConfig glad_glXChooseFBConfig +GLAD_API_CALL PFNGLXCHOOSEVISUALPROC glad_glXChooseVisual; +#define glXChooseVisual glad_glXChooseVisual +GLAD_API_CALL PFNGLXCOPYCONTEXTPROC glad_glXCopyContext; +#define glXCopyContext glad_glXCopyContext +GLAD_API_CALL PFNGLXCREATECONTEXTPROC glad_glXCreateContext; +#define glXCreateContext glad_glXCreateContext +GLAD_API_CALL PFNGLXCREATECONTEXTATTRIBSARBPROC glad_glXCreateContextAttribsARB; +#define glXCreateContextAttribsARB glad_glXCreateContextAttribsARB +GLAD_API_CALL PFNGLXCREATEGLXPIXMAPPROC glad_glXCreateGLXPixmap; +#define glXCreateGLXPixmap glad_glXCreateGLXPixmap +GLAD_API_CALL PFNGLXCREATENEWCONTEXTPROC glad_glXCreateNewContext; +#define glXCreateNewContext glad_glXCreateNewContext +GLAD_API_CALL PFNGLXCREATEPBUFFERPROC glad_glXCreatePbuffer; +#define glXCreatePbuffer glad_glXCreatePbuffer +GLAD_API_CALL PFNGLXCREATEPIXMAPPROC glad_glXCreatePixmap; +#define glXCreatePixmap glad_glXCreatePixmap +GLAD_API_CALL PFNGLXCREATEWINDOWPROC glad_glXCreateWindow; +#define glXCreateWindow glad_glXCreateWindow +GLAD_API_CALL PFNGLXDESTROYCONTEXTPROC glad_glXDestroyContext; +#define glXDestroyContext glad_glXDestroyContext +GLAD_API_CALL PFNGLXDESTROYGLXPIXMAPPROC glad_glXDestroyGLXPixmap; +#define glXDestroyGLXPixmap glad_glXDestroyGLXPixmap +GLAD_API_CALL PFNGLXDESTROYPBUFFERPROC glad_glXDestroyPbuffer; +#define glXDestroyPbuffer glad_glXDestroyPbuffer +GLAD_API_CALL PFNGLXDESTROYPIXMAPPROC glad_glXDestroyPixmap; +#define glXDestroyPixmap glad_glXDestroyPixmap +GLAD_API_CALL PFNGLXDESTROYWINDOWPROC glad_glXDestroyWindow; +#define glXDestroyWindow glad_glXDestroyWindow +GLAD_API_CALL PFNGLXGETCLIENTSTRINGPROC glad_glXGetClientString; +#define glXGetClientString glad_glXGetClientString +GLAD_API_CALL PFNGLXGETCONFIGPROC glad_glXGetConfig; +#define glXGetConfig glad_glXGetConfig +GLAD_API_CALL PFNGLXGETCURRENTCONTEXTPROC glad_glXGetCurrentContext; +#define glXGetCurrentContext glad_glXGetCurrentContext +GLAD_API_CALL PFNGLXGETCURRENTDISPLAYPROC glad_glXGetCurrentDisplay; +#define glXGetCurrentDisplay glad_glXGetCurrentDisplay +GLAD_API_CALL PFNGLXGETCURRENTDRAWABLEPROC glad_glXGetCurrentDrawable; +#define glXGetCurrentDrawable glad_glXGetCurrentDrawable +GLAD_API_CALL PFNGLXGETCURRENTREADDRAWABLEPROC glad_glXGetCurrentReadDrawable; +#define glXGetCurrentReadDrawable glad_glXGetCurrentReadDrawable +GLAD_API_CALL PFNGLXGETFBCONFIGATTRIBPROC glad_glXGetFBConfigAttrib; +#define glXGetFBConfigAttrib glad_glXGetFBConfigAttrib +GLAD_API_CALL PFNGLXGETFBCONFIGSPROC glad_glXGetFBConfigs; +#define glXGetFBConfigs glad_glXGetFBConfigs +GLAD_API_CALL PFNGLXGETPROCADDRESSPROC glad_glXGetProcAddress; +#define glXGetProcAddress glad_glXGetProcAddress +GLAD_API_CALL PFNGLXGETPROCADDRESSARBPROC glad_glXGetProcAddressARB; +#define glXGetProcAddressARB glad_glXGetProcAddressARB +GLAD_API_CALL PFNGLXGETSELECTEDEVENTPROC glad_glXGetSelectedEvent; +#define glXGetSelectedEvent glad_glXGetSelectedEvent +GLAD_API_CALL PFNGLXGETSWAPINTERVALMESAPROC glad_glXGetSwapIntervalMESA; +#define glXGetSwapIntervalMESA glad_glXGetSwapIntervalMESA +GLAD_API_CALL PFNGLXGETVISUALFROMFBCONFIGPROC glad_glXGetVisualFromFBConfig; +#define glXGetVisualFromFBConfig glad_glXGetVisualFromFBConfig +GLAD_API_CALL PFNGLXISDIRECTPROC glad_glXIsDirect; +#define glXIsDirect glad_glXIsDirect +GLAD_API_CALL PFNGLXMAKECONTEXTCURRENTPROC glad_glXMakeContextCurrent; +#define glXMakeContextCurrent glad_glXMakeContextCurrent +GLAD_API_CALL PFNGLXMAKECURRENTPROC glad_glXMakeCurrent; +#define glXMakeCurrent glad_glXMakeCurrent +GLAD_API_CALL PFNGLXQUERYCONTEXTPROC glad_glXQueryContext; +#define glXQueryContext glad_glXQueryContext +GLAD_API_CALL PFNGLXQUERYDRAWABLEPROC glad_glXQueryDrawable; +#define glXQueryDrawable glad_glXQueryDrawable +GLAD_API_CALL PFNGLXQUERYEXTENSIONPROC glad_glXQueryExtension; +#define glXQueryExtension glad_glXQueryExtension +GLAD_API_CALL PFNGLXQUERYEXTENSIONSSTRINGPROC glad_glXQueryExtensionsString; +#define glXQueryExtensionsString glad_glXQueryExtensionsString +GLAD_API_CALL PFNGLXQUERYSERVERSTRINGPROC glad_glXQueryServerString; +#define glXQueryServerString glad_glXQueryServerString +GLAD_API_CALL PFNGLXQUERYVERSIONPROC glad_glXQueryVersion; +#define glXQueryVersion glad_glXQueryVersion +GLAD_API_CALL PFNGLXSELECTEVENTPROC glad_glXSelectEvent; +#define glXSelectEvent glad_glXSelectEvent +GLAD_API_CALL PFNGLXSWAPBUFFERSPROC glad_glXSwapBuffers; +#define glXSwapBuffers glad_glXSwapBuffers +GLAD_API_CALL PFNGLXSWAPINTERVALEXTPROC glad_glXSwapIntervalEXT; +#define glXSwapIntervalEXT glad_glXSwapIntervalEXT +GLAD_API_CALL PFNGLXSWAPINTERVALMESAPROC glad_glXSwapIntervalMESA; +#define glXSwapIntervalMESA glad_glXSwapIntervalMESA +GLAD_API_CALL PFNGLXSWAPINTERVALSGIPROC glad_glXSwapIntervalSGI; +#define glXSwapIntervalSGI glad_glXSwapIntervalSGI +GLAD_API_CALL PFNGLXUSEXFONTPROC glad_glXUseXFont; +#define glXUseXFont glad_glXUseXFont +GLAD_API_CALL PFNGLXWAITGLPROC glad_glXWaitGL; +#define glXWaitGL glad_glXWaitGL +GLAD_API_CALL PFNGLXWAITXPROC glad_glXWaitX; +#define glXWaitX glad_glXWaitX + + + + + +GLAD_API_CALL int gladLoadGLXUserPtr(Display *display, int screen, GLADuserptrloadfunc load, void *userptr); +GLAD_API_CALL int gladLoadGLX(Display *display, int screen, GLADloadfunc load); + +#ifdef GLAD_GLX + +GLAD_API_CALL int gladLoaderLoadGLX(Display *display, int screen); + +GLAD_API_CALL void gladLoaderUnloadGLX(void); + +#endif +#ifdef __cplusplus +} +#endif +#endif From bd38e9e98f97f8389aba2aad58da1bbe7f5c90ff Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 24 Dec 2019 21:31:08 +0100 Subject: [PATCH 142/361] Adding source/Platform/Unix/X11SharedDisplay.cpp --- engine.build.lua | 1 + source/Platform/Unix/X11SharedDisplay.cpp | 32 +++++++++++++++++++++++ source/Platform/Unix/X11SharedDisplay.h | 15 +++++++++++ 3 files changed, 48 insertions(+) create mode 100644 source/Platform/Unix/X11SharedDisplay.cpp create mode 100644 source/Platform/Unix/X11SharedDisplay.h diff --git a/engine.build.lua b/engine.build.lua index 24c1821..55ff80f 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -65,6 +65,7 @@ if TARGET_OS == "Win32" then elseif TARGET_OS == "Unix" then platform_spec_module = Module("source/Platform/Unix", { "UnixApplication.cpp", + "X11SharedDisplay.cpp", "X11Display.cpp", "GLXContext.cpp", "X11Input.cpp", diff --git a/source/Platform/Unix/X11SharedDisplay.cpp b/source/Platform/Unix/X11SharedDisplay.cpp new file mode 100644 index 0000000..bb76064 --- /dev/null +++ b/source/Platform/Unix/X11SharedDisplay.cpp @@ -0,0 +1,32 @@ + +#include "X11SharedDisplay.h" + +namespace sp { + +// Define a global display (for simplicity, we always connect to local one.) +::Display* sharedDisplay = NULL; +unsigned int refcount = 0; + +::Display* XGetDisplay() { + + // Create if we dont have any references. + if (refcount == 0) { + sharedDisplay = XOpenDisplay(NULL); + } + + refcount++; + return sharedDisplay; +} + +void XReleaseDisplay() { + + if (refcount < 1) { + return; + } + + if (--refcount == 0) { + XCloseDisplay(sharedDisplay); + } +} + +} // namespace sp diff --git a/source/Platform/Unix/X11SharedDisplay.h b/source/Platform/Unix/X11SharedDisplay.h new file mode 100644 index 0000000..91de116 --- /dev/null +++ b/source/Platform/Unix/X11SharedDisplay.h @@ -0,0 +1,15 @@ + +#ifndef SPECTRE_PLATFORM_UNIX_X11SHAREDDISPLAY_H +#define SPECTRE_PLATFORM_UNIX_X11SHAREDDISPLAY_H + +#include + +namespace sp { + +::Display* XGetDisplay(); + +void XReleaseDisplay(); + +} // namespace sp + +#endif /* SPECTRE_PLATFORM_UNIX_X11SHAREDDISPLAY_H */ From b65cb9c2d27a7d5edae45c6dcd25aa15a5b1dbd3 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 24 Dec 2019 21:32:05 +0100 Subject: [PATCH 143/361] source/Platform/Unix/X11Display.cpp: Initial implementation --- source/Platform/Unix/X11Display.cpp | 64 +++++++++++++++++++++++++---- source/Platform/Unix/X11Display.h | 13 ++++++ 2 files changed, 70 insertions(+), 7 deletions(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index eb32495..92f2bfb 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -1,31 +1,81 @@ +#include // Prevents conflict with X.h defining "None" +#include +#include "X11SharedDisplay.h" +#include "GLXContext.h" #include "X11Display.h" namespace sp { +X11Display:: +X11Display() : +m_screen (0), +m_disp (NULL), +m_size (200,200) +{ +} + bool X11Display::create(DisplayDescription description) { + XSetWindowAttributes attr; + XVisualInfo* vi; + + m_disp = XGetDisplay(); + if (m_disp == NULL) { + Log::warn("X11: Could not open display"); + return false; + } + + m_screen = DefaultScreen(m_disp); + + attr.border_pixel = BlackPixel(m_disp, m_screen); + attr.background_pixel = WhitePixel(m_disp, m_screen); + //attr.override_redirect = True; + attr.colormap = ::XCreateColormap(m_disp, RootWindow(m_disp, m_screen), DefaultVisual(m_disp, m_screen), AllocNone); + attr.event_mask = ExposureMask; + + m_win = XCreateWindow(m_disp, + RootWindow(m_disp, m_screen), + 0, 0, + m_size.x, m_size.y, 0, DefaultDepth(m_disp, m_screen), + InputOutput, DefaultVisual(m_disp, m_screen), + CWBackPixel | CWColormap | CWBorderPixel | CWEventMask, &attr); + + + XMapWindow(m_disp, m_win); + + // Clear and take focus + XClearWindow(m_disp, m_win); + XMapRaised(m_disp, m_win); + + Log::info("X11: Created display"); + return true; } void X11Display::destroy() { - + if (m_disp) { + XReleaseDisplay(); + m_disp = NULL; + } } bool X11Display::isValid() { - return true; + return m_disp && m_win; } void* X11Display::getHandle() const { - return NULL; + return (void*) m_win; } void X11Display::setSize(unsigned int width, unsigned int height) { m_size = Vector2u(width, height); + + ::XResizeWindow(m_disp, m_win, m_size.x, m_size.y); } Vector2u X11Display::getSize() const @@ -35,22 +85,22 @@ Vector2u X11Display::getSize() const void X11Display::setPosition(unsigned int x, unsigned int y) { - + ::XMoveWindow(m_disp, m_win, x, y); } void X11Display::setCaption(const std::string& caption) { - + ::XStoreName(m_disp, m_win, caption.c_str()); } void X11Display::setIcon(const std::string& icon) { - + // TODO: Implement } void X11Display::showCursor(bool value) { - + // TODO: Implement } } // namespace sp diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Display.h index 5e1724d..28818b8 100644 --- a/source/Platform/Unix/X11Display.h +++ b/source/Platform/Unix/X11Display.h @@ -2,6 +2,10 @@ #ifndef PLATFORM_UNIX_X11DISPLAY_H #define PLATFORM_UNIX_X11DISPLAY_H +#include // Prevents conflict with X.h defining "None" +#include +#include +#include #include namespace sp { @@ -9,6 +13,7 @@ namespace sp { class X11Display : public PlatformDisplay { public : + X11Display(); virtual bool create(DisplayDescription description); @@ -32,6 +37,14 @@ public : protected : + ::Display* m_disp; + + ::Window m_win; + + int m_screen; + + //GC m_GC; + Vector2u m_size; }; From 7dedabba572614ffdd31a8d68c513d5f1e82e7cf Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 24 Dec 2019 21:32:38 +0100 Subject: [PATCH 144/361] source/Platform/Unix/GLXContext: Initial implementation --- source/Platform/Unix/GLXContext.cpp | 178 ++++++++++++++++++++++++++-- source/Platform/Unix/GLXContext.h | 12 ++ 2 files changed, 181 insertions(+), 9 deletions(-) diff --git a/source/Platform/Unix/GLXContext.cpp b/source/Platform/Unix/GLXContext.cpp index a488bdd..b00db35 100644 --- a/source/Platform/Unix/GLXContext.cpp +++ b/source/Platform/Unix/GLXContext.cpp @@ -1,51 +1,211 @@ +#include +#include +#include + +#include "glad_glx.h" +#include "X11SharedDisplay.h" #include "GLXContext.h" namespace sp { -GLXContext::GLXContext() -{ +static bool loadGL() { + static bool init = false; + if (!init) { + int ver; + init = true; + + ver = gladLoaderLoadGL(); + if (!ver) { + return false; + } + + Log::info("GLX: Opengl Version %d.%d loaded.", + GLAD_VERSION_MAJOR(ver), GLAD_VERSION_MINOR(ver)); + } + + return true; +} + +// Ensure that OpenGL extensions are loaded. +static bool ensureExtensionsLoaded(::Display* disp, int screen) +{ + char msg[1024]; + static bool init = false; + + if (!init) { + int ver; + init = true; + + ver = gladLoaderLoadGLX(disp, screen); + if (!ver) { + Log::warn("GLX: Could not load GLX extensions"); + return false; + } + + snprintf(msg, 1024, "GLX: GLX Version %d.%d loaded", + GLAD_VERSION_MAJOR(ver), GLAD_VERSION_MINOR(ver)); + + // Check for atleast version 1.4 + if (ver < 10004) { + Log::error("%s but atleast version 1.4 is needed.", msg); + return false; + } + + Log::info("%s.", msg); + } + + return true; +} + +GLXContext::GLXContext() : +m_disp (NULL), +m_win (0), +m_ctx (NULL) +{ } GLXContext::~GLXContext() { - + destroy(); } bool GLXContext::create(const PlatformDisplay* display) { + // Destroy any previous context first. + destroy(); + + m_disp = XGetDisplay(); + if (m_disp == NULL) { + destroy(); + Log::warn("X11: Could not open display"); + return false; + } + + m_win = (::Window) display->getHandle(); + + if (!createGLContext()) { + destroy(); + return false; + } + + return true; +} + +bool GLXContext::createGLContext() +{ + ::GLXFBConfig *fbc; + ::XVisualInfo *info; + int fbcount; + + GLint vi_attr[] = { + GLX_RGBA, + GLX_DEPTH_SIZE, 24, + GLX_DOUBLEBUFFER, 1, + GLX_RED_SIZE, 1, + GLX_GREEN_SIZE, 1, + GLX_BLUE_SIZE, 1, + None + }; + + GLint ctx_attr[] = { + GLX_CONTEXT_MAJOR_VERSION_ARB, 3, + GLX_CONTEXT_MINOR_VERSION_ARB, 2, + GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, + None + }; + + // Ensure glx extensions are loaded. + if (!ensureExtensionsLoaded(m_disp, DefaultScreen(m_disp))) { + return false; + } + + info = ::glXChooseVisual(m_disp, DefaultScreen(m_disp), vi_attr); + if (info == NULL) { + Log::warn("GLX: Could not find a valid VisualInfo."); + return false; + } + + // Setup GL settings. + fbc = glXChooseFBConfig(m_disp, DefaultScreen(m_disp), (const int*) info->visual, &fbcount); + if (fbc == NULL) { + Log::warn("GLX: Could not find FB Config."); + return false; + } + + // Create context. + m_ctx = glXCreateContextAttribsARB(m_disp, fbc[0], NULL, GL_TRUE, ctx_attr); + if (m_ctx == NULL) { + Log::warn("GLX: Failed to create context."); + return false; + } + + glXMakeCurrent(m_disp, m_win, m_ctx); + + // Load OpenGL + if (!loadGL()) { + Log::warn("GLX: Could not load OpenGL"); + return false; + } + return true; } void GLXContext::destroy() { + if (m_ctx) { + ::glXDestroyContext(m_disp, m_ctx); + m_ctx = NULL; + } + if (m_disp) { + XReleaseDisplay(); + m_disp = NULL; + } + + m_win = None; } bool GLXContext::activate() { - return true; + if (m_win && m_ctx) { + return ::glXMakeCurrent(m_disp, m_win, m_ctx); + } + return false; } bool GLXContext::deactivate() { - return true; + return ::glXMakeCurrent(m_disp, None, NULL); } bool GLXContext::isActive() const { - return true; + return ::glXGetCurrentContext() == m_ctx; } bool GLXContext::setSwapInterval(int interval) { - return true; + ensureExtensionsLoaded(m_disp, DefaultScreen(m_disp)); + + if (GLAD_GLX_MESA_swap_control) { + return glXSwapIntervalMESA(interval); + } + + if (GLAD_GLX_SGI_swap_control) { + return glXSwapIntervalSGI(interval); + } + + return false; } void GLXContext::setSize(unsigned int width, unsigned int height) { - + // TODO: Not GLX specific! move to generic GLContext class. + if (activate()) { + glViewport(0, 0, width, height); + } } void GLXContext::setSize(const Vector2u size) @@ -55,7 +215,7 @@ void GLXContext::setSize(const Vector2u size) void GLXContext::swapBuffers() { - + glXSwapBuffers(m_disp, m_win); } } // namespace sp diff --git a/source/Platform/Unix/GLXContext.h b/source/Platform/Unix/GLXContext.h index 3a5dcbe..305d789 100644 --- a/source/Platform/Unix/GLXContext.h +++ b/source/Platform/Unix/GLXContext.h @@ -4,6 +4,7 @@ // X11 OpenGL Context (glx) +#include "glad_glx.h" #include namespace sp { @@ -32,6 +33,17 @@ public : void setSize(const Vector2u size); void swapBuffers(); + +private : + bool createGLContext(); + +private : + + ::Display* m_disp; + + ::Window m_win; + + ::GLXContext m_ctx; }; } // namespace sp From 5e27f820de7ddcb44dc2d6a417677ae8fbce3e3a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 25 Dec 2019 22:39:10 +0100 Subject: [PATCH 145/361] source/Platform/Unix/X11Display.cpp: in create() set the attr.event_mask to include some interesting events. --- source/Platform/Unix/X11Display.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 92f2bfb..fc6f700 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -32,7 +32,10 @@ bool X11Display::create(DisplayDescription description) attr.background_pixel = WhitePixel(m_disp, m_screen); //attr.override_redirect = True; attr.colormap = ::XCreateColormap(m_disp, RootWindow(m_disp, m_screen), DefaultVisual(m_disp, m_screen), AllocNone); - attr.event_mask = ExposureMask; + // We want Keyboard,Mouse,Resize,Exposure (repaint) events. + attr.event_mask = KeyPressMask | KeyReleaseMask + | ButtonPressMask | ButtonReleaseMask | PointerMotionMask + | ResizeRedirectMask | ExposureMask; m_win = XCreateWindow(m_disp, RootWindow(m_disp, m_screen), From f8188c4358a0ceecc385e2bc3798b9300e7b9ff9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 25 Dec 2019 22:40:00 +0100 Subject: [PATCH 146/361] source/Platform/Unix/UnixEventQueue.cpp: implement a poll method (only log events for now) --- source/Platform/Unix/X11EventQueue.cpp | 40 ++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/source/Platform/Unix/X11EventQueue.cpp b/source/Platform/Unix/X11EventQueue.cpp index d71faaa..0e81cbe 100644 --- a/source/Platform/Unix/X11EventQueue.cpp +++ b/source/Platform/Unix/X11EventQueue.cpp @@ -1,10 +1,50 @@ +#include #include "X11EventQueue.h" +#include "X11SharedDisplay.h" namespace sp { bool X11EventQueue::poll(Event& event) { + XEvent xevent; + int num_events; + ::Display* disp; + + disp = XGetDisplay(); + if (disp == NULL) { + return false; + } + + num_events = XEventsQueued(disp, QueuedAlready); + + for(int i = 0; i < num_events; i++) { + + XNextEvent(disp, &xevent); + + switch(xevent.type) { + case ResizeRequest: + Log::info("X11: Resize event"); + break; + case KeyPress: + case KeyRelease: + Log::info("X11: KeyEvent"); + break; + case ButtonPress: + case ButtonRelease: + Log::info("X11: MouseButtonEvent"); + break; + case MotionNotify: + // This generates alot of events :) + //Log::info("X11: MouseMotionEvent"); + break; + default: + Log::info("Unknown event"); + } + } + + XReleaseDisplay(); + return false; } From d94c7fcf9a5eb59e2116666fe2d3742c8e148ea6 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 26 Dec 2019 07:48:53 +0100 Subject: [PATCH 147/361] Platform/Unix/X11SharedDisplay: adding getAtom() --- source/Platform/Unix/X11SharedDisplay.cpp | 5 +++++ source/Platform/Unix/X11SharedDisplay.h | 3 +++ 2 files changed, 8 insertions(+) diff --git a/source/Platform/Unix/X11SharedDisplay.cpp b/source/Platform/Unix/X11SharedDisplay.cpp index bb76064..a7c691d 100644 --- a/source/Platform/Unix/X11SharedDisplay.cpp +++ b/source/Platform/Unix/X11SharedDisplay.cpp @@ -29,4 +29,9 @@ void XReleaseDisplay() { } } +Atom getAtom(const std::string& name, bool onlyIfExists) { + + return XInternAtom(sharedDisplay, name.c_str(), onlyIfExists); +} + } // namespace sp diff --git a/source/Platform/Unix/X11SharedDisplay.h b/source/Platform/Unix/X11SharedDisplay.h index 91de116..fed3a05 100644 --- a/source/Platform/Unix/X11SharedDisplay.h +++ b/source/Platform/Unix/X11SharedDisplay.h @@ -2,6 +2,7 @@ #ifndef SPECTRE_PLATFORM_UNIX_X11SHAREDDISPLAY_H #define SPECTRE_PLATFORM_UNIX_X11SHAREDDISPLAY_H +#include #include namespace sp { @@ -10,6 +11,8 @@ namespace sp { void XReleaseDisplay(); +Atom getAtom(const std::string& name, bool onlyIfExists = false); + } // namespace sp #endif /* SPECTRE_PLATFORM_UNIX_X11SHAREDDISPLAY_H */ From 46bf27f4a4b17c77a4c50906812db098fa4db1e0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 27 Dec 2019 22:21:46 +0100 Subject: [PATCH 148/361] source/Platform/Unix/X11Display.cpp: call XSetWMProtocols with "WM_DELETE_WINDOW" flag. --- source/Platform/Unix/X11Display.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index fc6f700..1c825f6 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -19,6 +19,7 @@ bool X11Display::create(DisplayDescription description) { XSetWindowAttributes attr; XVisualInfo* vi; + Atom protocols; m_disp = XGetDisplay(); if (m_disp == NULL) { @@ -44,6 +45,11 @@ bool X11Display::create(DisplayDescription description) InputOutput, DefaultVisual(m_disp, m_screen), CWBackPixel | CWColormap | CWBorderPixel | CWEventMask, &attr); + // X11 does not handle pressing the X button on a window. + // that is the job of the window manager. + // Here we can request the WM to send us a delete event so we can handle it ourself. + protocols = getAtom("WM_DELETE_WINDOW"); + XSetWMProtocols(m_disp, m_win, &protocols, 1); XMapWindow(m_disp, m_win); From 035dd333dad4e35d896c0c16a9854cf1a713e788 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 27 Dec 2019 22:23:00 +0100 Subject: [PATCH 149/361] source/Platform/Unix/X11EventQueue.cpp: log "WM_DESTROY_WINDOW" message. --- source/Platform/Unix/X11EventQueue.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/source/Platform/Unix/X11EventQueue.cpp b/source/Platform/Unix/X11EventQueue.cpp index 0e81cbe..ded3920 100644 --- a/source/Platform/Unix/X11EventQueue.cpp +++ b/source/Platform/Unix/X11EventQueue.cpp @@ -10,6 +10,8 @@ bool X11EventQueue::poll(Event& event) XEvent xevent; int num_events; ::Display* disp; + Atom del_win = getAtom("WM_DELETE_WINDOW"); + Atom wm_proto = getAtom("WM_PROTOCOLS"); disp = XGetDisplay(); if (disp == NULL) { @@ -23,6 +25,15 @@ bool X11EventQueue::poll(Event& event) XNextEvent(disp, &xevent); switch(xevent.type) { + case ClientMessage: + Log::info("X11: ClientMessage"); + + if (xevent.xclient.message_type == wm_proto + && xevent.xclient.data.l[0] == del_win) { + + Log::info("X11: Delete window"); + } + break; case ResizeRequest: Log::info("X11: Resize event"); break; From 9b5bd9dcd07279d545068d93c226054bce37b370 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 28 Dec 2019 21:19:30 +0100 Subject: [PATCH 150/361] source/Platform/Unix/X11EventQueue.cpp: post quit event on "WM_DELETE_WINDOW". --- source/Platform/Unix/X11EventQueue.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11EventQueue.cpp b/source/Platform/Unix/X11EventQueue.cpp index ded3920..63b2aae 100644 --- a/source/Platform/Unix/X11EventQueue.cpp +++ b/source/Platform/Unix/X11EventQueue.cpp @@ -31,7 +31,8 @@ bool X11EventQueue::poll(Event& event) if (xevent.xclient.message_type == wm_proto && xevent.xclient.data.l[0] == del_win) { - Log::info("X11: Delete window"); + event.type = Event::Quit; + return true; } break; case ResizeRequest: From 96b61f0ee39eecbb91670ab5b7504b80fd80b8ec Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 30 Dec 2019 05:06:32 +0100 Subject: [PATCH 151/361] source/Platform/Unix/X11Display.cpp: in create() call setSize() --- source/Platform/Unix/X11Display.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 1c825f6..7e57b76 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -53,6 +53,8 @@ bool X11Display::create(DisplayDescription description) XMapWindow(m_disp, m_win); + setSize(description.mode.width, description.mode.height); + // Clear and take focus XClearWindow(m_disp, m_win); XMapRaised(m_disp, m_win); From f07be50bd358dc972308527a902c4136e6e8155f Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 30 Dec 2019 05:30:31 +0100 Subject: [PATCH 152/361] source/Platform/Unix/X11Display.cpp: Replace ResizeRedirectMask with StructureNotifyMask ResizeRedirectMask is broken (will not update the window size). We use StrucutreNotifyMask instead and capture the window size from CaptureNotify event instead. --- source/Platform/Unix/X11Display.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 7e57b76..a98ccd3 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -36,7 +36,7 @@ bool X11Display::create(DisplayDescription description) // We want Keyboard,Mouse,Resize,Exposure (repaint) events. attr.event_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask - | ResizeRedirectMask | ExposureMask; + | StructureNotifyMask | ExposureMask; m_win = XCreateWindow(m_disp, RootWindow(m_disp, m_screen), From 7a694e8fd0b8b3fc0b5171d5502b543b3e1e56da Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 30 Dec 2019 05:32:31 +0100 Subject: [PATCH 153/361] Platform/Unix/X11Display: Adding processEvent() to handle resize. --- source/Platform/Unix/X11Display.cpp | 18 ++++++++++++++++++ source/Platform/Unix/X11Display.h | 2 ++ 2 files changed, 20 insertions(+) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index a98ccd3..217c21c 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -114,4 +114,22 @@ void X11Display::showCursor(bool value) // TODO: Implement } +void X11Display::processEvent(const ::XEvent& event) +{ + Vector2u size; + + switch(event.xany.type) { + case ConfigureNotify: + size.x = event.xconfigure.width; + size.y = event.xconfigure.height; + + if (m_size != size) { + m_size = size; + Log::info("X11: Resize event"); + onReshape(size.x, size.y); + } + break; + } +} + } // namespace sp diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Display.h index 28818b8..330ffba 100644 --- a/source/Platform/Unix/X11Display.h +++ b/source/Platform/Unix/X11Display.h @@ -35,6 +35,8 @@ public : virtual void showCursor(bool value); + void processEvent(const ::XEvent& event); + protected : ::Display* m_disp; From 7402896ce69e03d0218d7803f3f5c851b66207bb Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 30 Dec 2019 05:33:14 +0100 Subject: [PATCH 154/361] Adding Platform/Unix/X11WindowEventHandler --- engine.build.lua | 1 + .../Platform/Unix/X11WindowEventHandler.cpp | 52 +++++++++++++++++++ source/Platform/Unix/X11WindowEventHandler.h | 29 +++++++++++ 3 files changed, 82 insertions(+) create mode 100644 source/Platform/Unix/X11WindowEventHandler.cpp create mode 100644 source/Platform/Unix/X11WindowEventHandler.h diff --git a/engine.build.lua b/engine.build.lua index 55ff80f..831d539 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -72,6 +72,7 @@ elseif TARGET_OS == "Unix" then "X11Keyboard.cpp", "X11Mouse.cpp", "X11EventQueue.cpp", + "X11WindowEventHandler.cpp", "UnixMisc.cpp", "UnixSystem.cpp", "glad_glx.c" diff --git a/source/Platform/Unix/X11WindowEventHandler.cpp b/source/Platform/Unix/X11WindowEventHandler.cpp new file mode 100644 index 0000000..a4ec542 --- /dev/null +++ b/source/Platform/Unix/X11WindowEventHandler.cpp @@ -0,0 +1,52 @@ + +#include +#include "X11Display.h" +#include "X11SharedDisplay.h" +#include "X11WindowEventHandler.h" +#include + +namespace sp { + +// Context used to store X11Display pointer. +::XContext X11WindowEventHandler::win_context = None; + +void X11WindowEventHandler::registerHandler(::Display* disp, ::Window window, X11Display *ptr) +{ + // Initialize context before use. + if (win_context == None) { + win_context = XUniqueContext(); + } + + // Save pointer to window. + XSaveContext(disp, window, win_context, (XPointer) ptr); +} + +void X11WindowEventHandler::unregisterHandler(::Display* disp, ::Window window) +{ + // No context. nothing to do. + if (win_context == None) { + return; + } + + XDeleteContext(disp, window, win_context); +} + +void X11WindowEventHandler::process(::Display* disp, const ::XEvent& event) +{ + XPointer ptr; + + // No context. nothing to do. + if (win_context == None) { + return; + } + + // Get the pointer for window ID. + if (XFindContext(disp, event.xany.window, win_context, &ptr) == 0) { + X11Display* disp_ptr = (X11Display*) ptr; + + // Delegate + disp_ptr->processEvent(event); + } +} + +} // namespace sp diff --git a/source/Platform/Unix/X11WindowEventHandler.h b/source/Platform/Unix/X11WindowEventHandler.h new file mode 100644 index 0000000..79f6ed2 --- /dev/null +++ b/source/Platform/Unix/X11WindowEventHandler.h @@ -0,0 +1,29 @@ + +#ifndef PLATFORM_UNIX_X11_WINDOW_EVENT_HANDLER_H +#define PLATFORM_UNIX_X11_WINDOW_EVENT_HANDLER_H + +#include +#include + +namespace sp { + +class X11Display; + +class X11WindowEventHandler +{ +public: + + static void registerHandler(::Display* disp, ::Window window, X11Display *ptr); + + static void unregisterHandler(::Display* disp, ::Window window); + + static void process(::Display* disp, const ::XEvent& event); + +protected : + + static ::XContext win_context; +}; + +} // namespace sp + +#endif /* PLATFORM_UNIX_WINDOW_EVENT_HANDLER_H */ From 2b14977eeda7f835aaf1c75ea8ccee9e97defb81 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 30 Dec 2019 05:34:01 +0100 Subject: [PATCH 155/361] source/Platform/Unix/X11Display.cpp: register with X11WindowEventHandler --- source/Platform/Unix/X11Display.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 217c21c..21308a1 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -1,6 +1,7 @@ #include // Prevents conflict with X.h defining "None" #include +#include "X11WindowEventHandler.h" #include "X11SharedDisplay.h" #include "GLXContext.h" #include "X11Display.h" @@ -45,6 +46,9 @@ bool X11Display::create(DisplayDescription description) InputOutput, DefaultVisual(m_disp, m_screen), CWBackPixel | CWColormap | CWBorderPixel | CWEventMask, &attr); + // Register event handler + X11WindowEventHandler::registerHandler(m_disp, m_win, this); + // X11 does not handle pressing the X button on a window. // that is the job of the window manager. // Here we can request the WM to send us a delete event so we can handle it ourself. @@ -66,6 +70,10 @@ bool X11Display::create(DisplayDescription description) void X11Display::destroy() { + if (m_win) { + X11WindowEventHandler::unregisterHandler(m_disp, m_win); + } + if (m_disp) { XReleaseDisplay(); m_disp = NULL; From c5648a51054ac4d81d243df739b0e53fd76bce21 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 30 Dec 2019 05:34:50 +0100 Subject: [PATCH 156/361] Platform/Unix/X11EventQueue: redirect unkown events to X11WindowEventHandler. --- source/Platform/Unix/X11EventQueue.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11EventQueue.cpp b/source/Platform/Unix/X11EventQueue.cpp index 63b2aae..be51bac 100644 --- a/source/Platform/Unix/X11EventQueue.cpp +++ b/source/Platform/Unix/X11EventQueue.cpp @@ -2,6 +2,7 @@ #include #include "X11EventQueue.h" #include "X11SharedDisplay.h" +#include "X11WindowEventHandler.h" namespace sp { @@ -51,7 +52,8 @@ bool X11EventQueue::poll(Event& event) //Log::info("X11: MouseMotionEvent"); break; default: - Log::info("Unknown event"); + // Pass to window. + X11WindowEventHandler::process(disp, xevent); } } From 7648c23e438b290bab90c7ce39ad731789a8b450 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 25 Sep 2020 18:17:36 +0200 Subject: [PATCH 157/361] Platform/Unix/X11EventQueue: get and release display handle in constructor/destructor instead of every call to poll() Should be fine as the display should never change during runtime. --- source/Platform/Unix/X11EventQueue.cpp | 24 ++++++++++++++++-------- source/Platform/Unix/X11EventQueue.h | 7 +++++++ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/source/Platform/Unix/X11EventQueue.cpp b/source/Platform/Unix/X11EventQueue.cpp index be51bac..6a4e73f 100644 --- a/source/Platform/Unix/X11EventQueue.cpp +++ b/source/Platform/Unix/X11EventQueue.cpp @@ -6,24 +6,34 @@ namespace sp { +X11EventQueue::X11EventQueue() +{ + m_disp = XGetDisplay(); +} + +X11EventQueue::~X11EventQueue() +{ + if (m_disp) { + XReleaseDisplay(); + } +} + bool X11EventQueue::poll(Event& event) { XEvent xevent; int num_events; - ::Display* disp; Atom del_win = getAtom("WM_DELETE_WINDOW"); Atom wm_proto = getAtom("WM_PROTOCOLS"); - disp = XGetDisplay(); - if (disp == NULL) { + if (m_disp == NULL) { return false; } - num_events = XEventsQueued(disp, QueuedAlready); + num_events = XEventsQueued(m_disp, QueuedAlready); for(int i = 0; i < num_events; i++) { - XNextEvent(disp, &xevent); + XNextEvent(m_disp, &xevent); switch(xevent.type) { case ClientMessage: @@ -53,12 +63,10 @@ bool X11EventQueue::poll(Event& event) break; default: // Pass to window. - X11WindowEventHandler::process(disp, xevent); + X11WindowEventHandler::process(m_disp, xevent); } } - XReleaseDisplay(); - return false; } diff --git a/source/Platform/Unix/X11EventQueue.h b/source/Platform/Unix/X11EventQueue.h index 9239694..73b363f 100644 --- a/source/Platform/Unix/X11EventQueue.h +++ b/source/Platform/Unix/X11EventQueue.h @@ -4,13 +4,20 @@ #include #include +#include namespace sp { class X11EventQueue : public PlatformEventQueue { public : + X11EventQueue(); + virtual ~X11EventQueue(); + virtual bool poll(Event& event); + +private : + ::Display* m_disp; }; } // namespace sp From 23cf17f9af177f34bdacfc855251b12b10c7c3ac Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 25 Sep 2020 18:24:12 +0200 Subject: [PATCH 158/361] Platform/Unix/X11EventQueue.cpp: Only process one event per call to poll(). Confirming to Platform API. --- source/Platform/Unix/X11EventQueue.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/source/Platform/Unix/X11EventQueue.cpp b/source/Platform/Unix/X11EventQueue.cpp index 6a4e73f..a552643 100644 --- a/source/Platform/Unix/X11EventQueue.cpp +++ b/source/Platform/Unix/X11EventQueue.cpp @@ -20,8 +20,6 @@ X11EventQueue::~X11EventQueue() bool X11EventQueue::poll(Event& event) { - XEvent xevent; - int num_events; Atom del_win = getAtom("WM_DELETE_WINDOW"); Atom wm_proto = getAtom("WM_PROTOCOLS"); @@ -29,9 +27,8 @@ bool X11EventQueue::poll(Event& event) return false; } - num_events = XEventsQueued(m_disp, QueuedAlready); - - for(int i = 0; i < num_events; i++) { + if (XEventsQueued(m_disp, QueuedAlready)) { + XEvent xevent; XNextEvent(m_disp, &xevent); From 30dc11f0d5e0277451393edb3e1a8cf4c2518bf0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 25 Sep 2020 18:24:49 +0200 Subject: [PATCH 159/361] Platform/Unix/X11Display.h: Some documentation. --- source/Platform/Unix/X11Display.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Display.h index 330ffba..9343705 100644 --- a/source/Platform/Unix/X11Display.h +++ b/source/Platform/Unix/X11Display.h @@ -10,6 +10,8 @@ namespace sp { +// NOTE: This class wraps a X11 Window and Screen handle +// and is NOT a Class wrapper around X11's `Display` type. class X11Display : public PlatformDisplay { public : From 9954c45fe98ab9fc7a2b33ce87b0060e9f56ee2e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 13 Oct 2020 18:12:59 +0200 Subject: [PATCH 160/361] Platform/Unix/X11Keyboard: Implement handleMessage() --- source/Platform/Unix/X11Keyboard.cpp | 212 ++++++++++++++++++++++++++- source/Platform/Unix/X11Keyboard.h | 6 +- 2 files changed, 216 insertions(+), 2 deletions(-) diff --git a/source/Platform/Unix/X11Keyboard.cpp b/source/Platform/Unix/X11Keyboard.cpp index adc7e08..e2184ad 100644 --- a/source/Platform/Unix/X11Keyboard.cpp +++ b/source/Platform/Unix/X11Keyboard.cpp @@ -1,7 +1,204 @@ + #include "X11Keyboard.h" +#include +#include +#include namespace sp { +static Keyboard::Key KeySymToKeyboardKey(KeySym key) { + + switch(key) { + // Letters + case XK_A: case XK_a: + return Keyboard::Key::A; + case XK_B: case XK_b: + return Keyboard::Key::B; + case XK_C: case XK_c: + return Keyboard::Key::C; + case XK_D: case XK_d: + return Keyboard::Key::D; + case XK_E: case XK_e: + return Keyboard::Key::E; + case XK_F: case XK_f: + return Keyboard::Key::F; + case XK_G: case XK_g: + return Keyboard::Key::G; + case XK_H: case XK_h: + return Keyboard::Key::H; + case XK_I: case XK_i: + return Keyboard::Key::I; + case XK_J: case XK_j: + return Keyboard::Key::J; + case XK_K: case XK_k: + return Keyboard::Key::K; + case XK_L: case XK_l: + return Keyboard::Key::L; + case XK_M: case XK_m: + return Keyboard::Key::M; + case XK_N: case XK_n: + return Keyboard::Key::N; + case XK_O: case XK_o: + return Keyboard::Key::O; + case XK_P: case XK_p: + return Keyboard::Key::P; + case XK_Q: case XK_q: + return Keyboard::Key::Q; + case XK_R: case XK_r: + return Keyboard::Key::R; + case XK_S: case XK_s: + return Keyboard::Key::S; + case XK_T: case XK_t: + return Keyboard::Key::T; + case XK_U: case XK_u: + return Keyboard::Key::U; + case XK_V: case XK_v: + return Keyboard::Key::V; + case XK_W: case XK_w: + return Keyboard::Key::W; + case XK_X: case XK_x: + return Keyboard::Key::X; + case XK_Y: case XK_y: + return Keyboard::Key::Y; + case XK_Z: case XK_z: + return Keyboard::Key::Z; + + // Numbers + case XK_1: + return Keyboard::Key::One; + case XK_2: + return Keyboard::Key::Two; + case XK_3: + return Keyboard::Key::Three; + case XK_4: + return Keyboard::Key::Four; + case XK_5: + return Keyboard::Key::Five; + case XK_6: + return Keyboard::Key::Six; + case XK_7: + return Keyboard::Key::Seven; + case XK_8: + return Keyboard::Key::Eight; + case XK_9: + return Keyboard::Key::Nine; + case XK_0: + return Keyboard::Key::Zero; + + case XK_period : + return Keyboard::Key::Period; + case XK_comma : + return Keyboard::Key::Comma; + case XK_Return : + return Keyboard::Key::Enter; + case XK_BackSpace : + return Keyboard::Key::Backspace; + case XK_Escape : + return Keyboard::Key::Escape; + case XK_space : + return Keyboard::Key::Space; + case XK_Caps_Lock : + return Keyboard::Key::Capslock; + + // Arrows + case XK_Up : + return Keyboard::Key::Up; + case XK_Down : + return Keyboard::Key::Down; + case XK_Left : + return Keyboard::Key::Left; + case XK_Right : + return Keyboard::Key::Right; + + // Numpad + + case XK_KP_1 : case XK_KP_End : + return Keyboard::Key::Numpad1; + case XK_KP_2 : case XK_KP_Down : + return Keyboard::Key::Numpad2; + case XK_KP_3 : case XK_KP_Page_Down : + return Keyboard::Key::Numpad3; + case XK_KP_4 : case XK_KP_Left : + return Keyboard::Key::Numpad4; + case XK_KP_5 : case XK_KP_Begin : + return Keyboard::Key::Numpad5; + case XK_KP_6 : case XK_KP_Right : + return Keyboard::Key::Numpad6; + case XK_KP_7 : case XK_KP_Home : + return Keyboard::Key::Numpad7; + case XK_KP_8 : case XK_KP_Up : + return Keyboard::Key::Numpad8; + case XK_KP_9 : case XK_KP_Page_Up : + return Keyboard::Key::Numpad9; + case XK_KP_0 : case XK_KP_Insert : + return Keyboard::Key::Numpad0; + + case XK_Home : + return Keyboard::Key::Home; + case XK_End : + return Keyboard::Key::End; + case XK_Insert : + return Keyboard::Key::Insert; + case XK_Delete : + return Keyboard::Key::Delete; + case XK_Page_Up : + return Keyboard::Key::PageUp; + case XK_Page_Down : + return Keyboard::Key::PageDown; + case XK_Pause : + return Keyboard::Key::Pause; + + + // Function keys + case XK_F1 : + return Keyboard::Key::F1; + case XK_F2 : + return Keyboard::Key::F2; + case XK_F3 : + return Keyboard::Key::F3; + case XK_F4 : + return Keyboard::Key::F4; + case XK_F5 : + return Keyboard::Key::F5; + case XK_F6 : + return Keyboard::Key::F6; + case XK_F7 : + return Keyboard::Key::F7; + case XK_F8 : + return Keyboard::Key::F8; + case XK_F9 : + return Keyboard::Key::F9; + case XK_F10 : + return Keyboard::Key::F10; + case XK_F11 : + return Keyboard::Key::F11; + case XK_F12 : + return Keyboard::Key::F12; + + case XK_Tab : + return Keyboard::Key::Tab; + case XK_Shift_L : + return Keyboard::Key::LShift; + case XK_Shift_R : + return Keyboard::Key::RShift; + case XK_Control_L : + return Keyboard::Key::LCtrl; + case XK_Control_R : + return Keyboard::Key::RCtrl; + case XK_Alt_L : + return Keyboard::Key::LAlt; + case XK_Alt_R : +#ifdef XK_XKB_KEYS + case XK_ISO_Level3_Shift : +#endif /* XK_XKB_KEYS */ + return Keyboard::Key::RAlt; + + default: + sp::Log::debug("X11Keyboard - Unknown keycode: 0x%X", key); + return Keyboard::Key::Unknown; + }; +} + void X11Keyboard::init() { @@ -12,9 +209,22 @@ bool X11Keyboard::isKeyDown(Keyboard::Key key) return false; } +bool X11Keyboard::handleMessage(XKeyEvent* xkeyevent, Event& event) +{ + KeySym sym = ::XLookupKeysym(xkeyevent, 0); + Keyboard::Key code = KeySymToKeyboardKey(sym); + + if (code != Keyboard::Key::Unknown) { + event.type = Event::Key; + event.key.code = code; + event.key.pressed = xkeyevent->type == KeyPress; + return true; + } + return false; +} + void X11Keyboard::update(InputModule *input) { - } } // namespace sp diff --git a/source/Platform/Unix/X11Keyboard.h b/source/Platform/Unix/X11Keyboard.h index 7f7485c..c0cda41 100644 --- a/source/Platform/Unix/X11Keyboard.h +++ b/source/Platform/Unix/X11Keyboard.h @@ -2,8 +2,9 @@ #ifndef PLATFORM_UNIX_X11KEYBOARD_H #define PLATFORM_UNIX_X11KEYBOARD_H +#include #include - +#include namespace sp { class X11Keyboard : public Keyboard @@ -15,6 +16,9 @@ public : bool isKeyDown(Keyboard::Key key); + // Translate a XKeyEvent to sp::Event, Called from X11EventQueue + static bool handleMessage(XKeyEvent* xkeyevent, Event& event); + protected : virtual void update(InputModule *input); From 4193b3b7196007c55c696e00dca65120bacc96e1 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 13 Oct 2020 18:14:10 +0200 Subject: [PATCH 161/361] Platform/Unix/X11EventQueue: send KeyPress and KeyRelease events to X11Keyboard::handleMessage() --- source/Platform/Unix/X11EventQueue.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11EventQueue.cpp b/source/Platform/Unix/X11EventQueue.cpp index a552643..06438e4 100644 --- a/source/Platform/Unix/X11EventQueue.cpp +++ b/source/Platform/Unix/X11EventQueue.cpp @@ -2,6 +2,7 @@ #include #include "X11EventQueue.h" #include "X11SharedDisplay.h" +#include "X11Keyboard.h" #include "X11WindowEventHandler.h" namespace sp { @@ -48,7 +49,9 @@ bool X11EventQueue::poll(Event& event) break; case KeyPress: case KeyRelease: - Log::info("X11: KeyEvent"); + if (X11Keyboard::handleMessage(&xevent.xkey, event)) { + return true; + } break; case ButtonPress: case ButtonRelease: From 7356bdebdda2894758f1171d4775a6cccd0cca16 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 14 Oct 2020 13:18:18 +0200 Subject: [PATCH 162/361] Platform/Unix/X11EventQueue: Fix bug where messeges where not flushed to the event queue. XEventsQueued(disp, QueuedAlready) only returns the number of events currently in the queue and does not flush new events. So this must happen elsewhere and if it does not we will never see any events. i noticed this bug when removing the call to glXSwapBuffers(). Fix this by using XPending() instead as this flushes new events if the queue is empty before returning the length. see https://tronche.com/gui/x/xlib/event-handling/XEventsQueued.html and https://tronche.com/gui/x/xlib/event-handling/XPending.html --- source/Platform/Unix/X11EventQueue.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11EventQueue.cpp b/source/Platform/Unix/X11EventQueue.cpp index 06438e4..19f4177 100644 --- a/source/Platform/Unix/X11EventQueue.cpp +++ b/source/Platform/Unix/X11EventQueue.cpp @@ -28,7 +28,7 @@ bool X11EventQueue::poll(Event& event) return false; } - if (XEventsQueued(m_disp, QueuedAlready)) { + if (XPending(m_disp)) { XEvent xevent; XNextEvent(m_disp, &xevent); @@ -63,6 +63,7 @@ bool X11EventQueue::poll(Event& event) break; default: // Pass to window. + Log::info("X11: Window Event"); X11WindowEventHandler::process(m_disp, xevent); } } From cfe064f02cb7a78e01278d1134d6967b42268da8 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 16 Oct 2020 14:41:41 +0200 Subject: [PATCH 163/361] Platform/Unix/X11Keyboard: implement isKeyDown() --- source/Platform/Unix/X11Keyboard.cpp | 129 ++++++++++++++++++++++++++- source/Platform/Unix/X11Keyboard.h | 10 ++- 2 files changed, 137 insertions(+), 2 deletions(-) diff --git a/source/Platform/Unix/X11Keyboard.cpp b/source/Platform/Unix/X11Keyboard.cpp index e2184ad..9121ebe 100644 --- a/source/Platform/Unix/X11Keyboard.cpp +++ b/source/Platform/Unix/X11Keyboard.cpp @@ -1,5 +1,7 @@ +#include #include "X11Keyboard.h" +#include "X11SharedDisplay.h" #include #include #include @@ -199,13 +201,136 @@ static Keyboard::Key KeySymToKeyboardKey(KeySym key) { }; } +X11Keyboard::X11Keyboard() : +m_disp(NULL) +{ + memset(m_key_state, 0, sizeof(m_key_state) / sizeof(m_key_state[0])); +} + +X11Keyboard::~X11Keyboard() +{ + if (m_disp) { + XReleaseDisplay(); + } +} + void X11Keyboard::init() { - + m_disp = XGetDisplay(); } bool X11Keyboard::isKeyDown(Keyboard::Key key) { + KeySym sym; + + switch(key) { + // Letters + case Keyboard::Key::A : sym = XK_a; break; + case Keyboard::Key::B : sym = XK_b; break; + case Keyboard::Key::C : sym = XK_c; break; + case Keyboard::Key::D : sym = XK_d; break; + case Keyboard::Key::E : sym = XK_e; break; + case Keyboard::Key::F : sym = XK_f; break; + case Keyboard::Key::G : sym = XK_g; break; + case Keyboard::Key::H : sym = XK_h; break; + case Keyboard::Key::I : sym = XK_i; break; + case Keyboard::Key::J : sym = XK_j; break; + case Keyboard::Key::K : sym = XK_k; break; + case Keyboard::Key::L : sym = XK_l; break; + case Keyboard::Key::M : sym = XK_m; break; + case Keyboard::Key::N : sym = XK_n; break; + case Keyboard::Key::O : sym = XK_o; break; + case Keyboard::Key::P : sym = XK_p; break; + case Keyboard::Key::Q : sym = XK_q; break; + case Keyboard::Key::R : sym = XK_r; break; + case Keyboard::Key::S : sym = XK_s; break; + case Keyboard::Key::T : sym = XK_t; break; + case Keyboard::Key::U : sym = XK_u; break; + case Keyboard::Key::V : sym = XK_v; break; + case Keyboard::Key::W : sym = XK_w; break; + case Keyboard::Key::X : sym = XK_x; break; + case Keyboard::Key::Y : sym = XK_y; break; + case Keyboard::Key::Z : sym = XK_z; break; + + // Numbers + case Keyboard::Key::One : sym = XK_1; break; + case Keyboard::Key::Two : sym = XK_2; break; + case Keyboard::Key::Three : sym = XK_3; break; + case Keyboard::Key::Four : sym = XK_4; break; + case Keyboard::Key::Five : sym = XK_5; break; + case Keyboard::Key::Six : sym = XK_6; break; + case Keyboard::Key::Seven : sym = XK_7; break; + case Keyboard::Key::Eight : sym = XK_8; break; + case Keyboard::Key::Nine : sym = XK_9; break; + case Keyboard::Key::Zero : sym = XK_0; break; + + case Keyboard::Key::Period : sym = XK_period; break; + case Keyboard::Key::Comma : sym = XK_comma; break; + case Keyboard::Key::Enter : sym = XK_Return; break; + case Keyboard::Key::Backspace : sym = XK_BackSpace; break; + case Keyboard::Key::Escape : sym = XK_Escape; break; + case Keyboard::Key::Space : sym = XK_space; break; + case Keyboard::Key::Capslock : sym = XK_Caps_Lock; break; + + // Arrows + case Keyboard::Key::Up : sym = XK_Up; break; + case Keyboard::Key::Down : sym = XK_Down; break; + case Keyboard::Key::Left : sym = XK_Left; break; + case Keyboard::Key::Right : sym = XK_Right; break; + + // Numpad + case Keyboard::Key::Numpad1 : sym = XK_KP_1; break; + case Keyboard::Key::Numpad2 : sym = XK_KP_2; break; + case Keyboard::Key::Numpad3 : sym = XK_KP_3; break; + case Keyboard::Key::Numpad4 : sym = XK_KP_4; break; + case Keyboard::Key::Numpad5 : sym = XK_KP_5; break; + case Keyboard::Key::Numpad6 : sym = XK_KP_6; break; + case Keyboard::Key::Numpad7 : sym = XK_KP_7; break; + case Keyboard::Key::Numpad8 : sym = XK_KP_8; break; + case Keyboard::Key::Numpad9 : sym = XK_KP_9; break; + case Keyboard::Key::Numpad0 : sym = XK_KP_0; break; + + case Keyboard::Key::Home : sym = XK_Home; break; + case Keyboard::Key::End : sym = XK_End; break; + case Keyboard::Key::Insert : sym = XK_Insert; break; + case Keyboard::Key::Delete : sym = XK_Delete; break; + case Keyboard::Key::PageUp : sym = XK_Page_Up; break; + case Keyboard::Key::PageDown : sym = XK_Page_Down; break; + case Keyboard::Key::Pause : sym = XK_Pause; break; + + // Function keys + case Keyboard::Key::F1 : sym = XK_F1; break; + case Keyboard::Key::F2 : sym = XK_F2; break; + case Keyboard::Key::F3 : sym = XK_F3; break; + case Keyboard::Key::F4 : sym = XK_F4; break; + case Keyboard::Key::F5 : sym = XK_F5; break; + case Keyboard::Key::F6 : sym = XK_F6; break; + case Keyboard::Key::F7 : sym = XK_F7; break; + case Keyboard::Key::F8 : sym = XK_F8; break; + case Keyboard::Key::F9 : sym = XK_F9; break; + case Keyboard::Key::F10 : sym = XK_F10; break; + case Keyboard::Key::F11 : sym = XK_F11; break; + case Keyboard::Key::F12 : sym = XK_F12; break; + + case Keyboard::Key::Tab : sym = XK_Tab; break; + case Keyboard::Key::LShift : sym = XK_Shift_L; break; + case Keyboard::Key::RShift : sym = XK_Shift_R; break; + case Keyboard::Key::LCtrl : sym = XK_Control_L; break; + case Keyboard::Key::RCtrl : sym = XK_Control_R; break; + case Keyboard::Key::LAlt : sym = XK_Alt_L; break; +#ifdef XK_XKB_KEYS + case Keyboard::Key::RAlt : sym = XK_ISO_Level3_Shift; break; +#else + case Keyboard::Key::RAlt : sym = XK_Alt_R; break; +#endif /* XK_XKB_KEYS */ + default : sym = 0; break; + } + + KeyCode keycode = ::XKeysymToKeycode(m_disp, sym); + + if (keycode) { + return m_key_state[keycode / 8] & (1 << (keycode % 8)); + } return false; } @@ -225,6 +350,8 @@ bool X11Keyboard::handleMessage(XKeyEvent* xkeyevent, Event& event) void X11Keyboard::update(InputModule *input) { + // Query keyboard state. + ::XQueryKeymap(m_disp, m_key_state); } } // namespace sp diff --git a/source/Platform/Unix/X11Keyboard.h b/source/Platform/Unix/X11Keyboard.h index c0cda41..4684bba 100644 --- a/source/Platform/Unix/X11Keyboard.h +++ b/source/Platform/Unix/X11Keyboard.h @@ -5,12 +5,14 @@ #include #include #include + namespace sp { class X11Keyboard : public Keyboard { public : - virtual ~X11Keyboard() {} + X11Keyboard(); + ~X11Keyboard(); void init(); @@ -22,6 +24,12 @@ public : protected : virtual void update(InputModule *input); + +private : + ::Display* m_disp; + + // Cached keyboard state. + char m_key_state[32]; }; } // namespace sp From 816cf3a072a26e3b3f396a9d8047ae551f5f9f5c Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 16 Oct 2020 19:35:32 +0200 Subject: [PATCH 164/361] Platform/Unix/X11Mouse: adding a basic implementation to get things going. --- source/Platform/Unix/X11Mouse.cpp | 76 ++++++++++++++++++++++++++++++- source/Platform/Unix/X11Mouse.h | 12 +++++ 2 files changed, 87 insertions(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11Mouse.cpp b/source/Platform/Unix/X11Mouse.cpp index 48ef3bc..35bf945 100644 --- a/source/Platform/Unix/X11Mouse.cpp +++ b/source/Platform/Unix/X11Mouse.cpp @@ -1,15 +1,33 @@ +#include +#include #include "X11Mouse.h" +#include "X11SharedDisplay.h" + namespace sp { +X11Mouse::X11Mouse() : +m_disp(NULL), +m_btn_state(0) +{ +} + +X11Mouse::~X11Mouse() +{ + if (m_disp) { + XReleaseDisplay(); + } +} + void X11Mouse::init() { - + m_disp = XGetDisplay(); } Vector2f X11Mouse::getPosition() const { + // TODO: Translate to window. return m_position; } @@ -20,12 +38,68 @@ Vector2f X11Mouse::getAbsPosition() const bool X11Mouse::isButtonDown(Mouse::Button button) const { + // TODO: Button1 and 2 is defined in x11 and + // therefore clashes with Mouse::Button::Button1 and 2. + switch(button) { + case Mouse::Button::Left : + return m_btn_state & Button1Mask; + case Mouse::Button::Right : + return m_btn_state & Button3Mask; + case Mouse::Button::Middle : + return m_btn_state & Button2Mask; + default : + return false; + } return false; } void X11Mouse::update(InputModule *input) { + ::Window root, child; + int rx, ry, x = 0, y = 0; + // Query position and button state. + XQueryPointer(m_disp, ::XDefaultRootWindow(m_disp), + &root, &child, + &rx, &ry, + &x, &y, &m_btn_state); + + // Update position + m_position.x = x; + m_position.y = y; +} + +bool X11Mouse::handleMessage(XEvent* xevent, Event& event) +{ + if (xevent->type == MotionNotify) { + event.type = Event::MouseMove; + event.mouseMove.x = xevent->xmotion.x; + event.mouseMove.y = xevent->xmotion.y; + return true; + } + + if (xevent->type == ButtonPress || xevent->type == ButtonRelease) { + + Mouse::Button trans = Mouse::Button::Unknown; + + switch(xevent->xbutton.button) { + case Button1 : trans = Mouse::Button::Left; break; + case Button2 : trans = Mouse::Button::Middle; break; + case Button3 : trans = Mouse::Button::Right; break; + // TODO: name clash, need to rename Mouse::Button enums. + // case Button4 : trans = Mouse::Button::Button1; break; // clashes with X11's "Button1" define. + // case Button5 : trans = Mouse::Button::Button2; break; // clashes with X11's "Button2" define. + } + + if (trans != Mouse::Button::Unknown) { + event.type = Event::MouseButton; + event.mouseButton.pressed = xevent->type == ButtonPress; + event.mouseButton.button = trans; + return true; + } + } + + return false; } } // namespace sp diff --git a/source/Platform/Unix/X11Mouse.h b/source/Platform/Unix/X11Mouse.h index 55c044e..84c326c 100644 --- a/source/Platform/Unix/X11Mouse.h +++ b/source/Platform/Unix/X11Mouse.h @@ -3,12 +3,16 @@ #define PLATFORM_UNIX_X11MOUSE_H #include +#include namespace sp { class X11Mouse : public Mouse { public : + X11Mouse(); + ~X11Mouse(); + virtual void init(); // Get mouse position @@ -18,12 +22,20 @@ public : virtual bool isButtonDown(Mouse::Button button) const; + // Translate a XEvent to sp::Event, Called from X11EventQueue + static bool handleMessage(XEvent* xevent, Event& event); + protected : virtual void update(InputModule *input); protected : + ::Display* m_disp; + ::Window m_win; + Vector2f m_position; + + unsigned int m_btn_state; }; } // namespace sp From 03186ebea021cd9cb2720ae9ebd4a08240e3ba09 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 16 Oct 2020 19:36:22 +0200 Subject: [PATCH 165/361] Platform/Unix/X11EventQueue.cpp: pass ButtonPress/ButtonRelease/MotionNotify events to X11Mouse --- source/Platform/Unix/X11EventQueue.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/source/Platform/Unix/X11EventQueue.cpp b/source/Platform/Unix/X11EventQueue.cpp index 19f4177..adcce7f 100644 --- a/source/Platform/Unix/X11EventQueue.cpp +++ b/source/Platform/Unix/X11EventQueue.cpp @@ -3,6 +3,7 @@ #include "X11EventQueue.h" #include "X11SharedDisplay.h" #include "X11Keyboard.h" +#include "X11Mouse.h" #include "X11WindowEventHandler.h" namespace sp { @@ -55,11 +56,10 @@ bool X11EventQueue::poll(Event& event) break; case ButtonPress: case ButtonRelease: - Log::info("X11: MouseButtonEvent"); - break; case MotionNotify: - // This generates alot of events :) - //Log::info("X11: MouseMotionEvent"); + if (X11Mouse::handleMessage(&xevent, event)) { + return true; + } break; default: // Pass to window. From dfe29acc1e50aadf9da1d0312fcf2044a347303e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 17 Oct 2020 14:06:46 +0200 Subject: [PATCH 166/361] Platform/Unix/UnixMisc.cpp: implement display mode lookups using xrandr extension. --- source/Platform/Unix/UnixMisc.cpp | 102 +++++++++++++++++++++++++++++- 1 file changed, 101 insertions(+), 1 deletion(-) diff --git a/source/Platform/Unix/UnixMisc.cpp b/source/Platform/Unix/UnixMisc.cpp index c168588..9f88478 100644 --- a/source/Platform/Unix/UnixMisc.cpp +++ b/source/Platform/Unix/UnixMisc.cpp @@ -1,15 +1,115 @@ +#include #include +#include "X11SharedDisplay.h" +#include +#include +#include namespace sp { +// Code "borrowed" from SFML :) +// see: https://github.com/SFML/SFML/blob/master/src/SFML/Window/Unix/VideoModeImpl.cpp + void PlatformMisc::GetDisplayModes(std::vector& modes) { + ::Display *disp = XGetDisplay(); + + if (disp) { + int scr = DefaultScreen(disp); + + // Check for XRandR. + int ver; + if (XQueryExtension(disp, "RANDR", &ver, &ver, &ver)) { + + XRRScreenConfiguration* config = ::XRRGetScreenInfo(disp, RootWindow(disp, scr)); + if (config) { + int nbSizes; + XRRScreenSize* sizes = ::XRRConfigSizes(config, &nbSizes); + if (sizes && nbSizes > 0) { + int nbDepths = 0; + int* depths = XListDepths(disp, scr, &nbDepths); + if (depths && nbDepths > 0) { + + for(int i = 0; i < nbDepths; i++) { + for(int j = 0; j < nbSizes; j++) { + DisplayMode mode(sizes[j].width, sizes[j].height, depths[i]); + + ::Rotation rot; + XRRConfigRotations(config, &rot); + + if (rot == RR_Rotate_90 || rot == RR_Rotate_270) { + std::swap(mode.width, mode.height); + } + + if (std::find(modes.begin(), modes.end(), mode) == modes.end()) { + modes.push_back(mode); + } + } + } + + XFree(depths); + } + } + } else { + Log::error("Failed to get screen configuration while trying to get display modes."); + } + + XRRFreeScreenConfigInfo(config); + } else { + Log::error("Failed to use XRandR extension while trying to get display modes."); + } + + XReleaseDisplay(); + } else { + Log::error("Failed to connect to the X server while trying to get display modes."); + } } DisplayMode PlatformMisc::GetDesktopMode() { - return DisplayMode(); + DisplayMode mode; + + ::Display *disp = XGetDisplay(); + + if (disp) { + int scr = DefaultScreen(disp); + + // Check for XRandR. + int ver; + if (XQueryExtension(disp, "RANDR", &ver, &ver, &ver)) { + + XRRScreenConfiguration* config = ::XRRGetScreenInfo(disp, RootWindow(disp, scr)); + if (config) { + int nbSizes; + ::Rotation rot; + int current = XRRConfigCurrentConfiguration(config, &rot); + + XRRScreenSize* sizes = ::XRRConfigSizes(config, &nbSizes); + if (sizes && nbSizes > 0) { + + mode = DisplayMode(sizes[current].width, sizes[current].height, DefaultDepth(disp, scr)); + + XRRConfigRotations(config, &rot); + if (rot == RR_Rotate_90 || rot == RR_Rotate_270) { + std::swap(mode.width, mode.height); + } + } + } else { + Log::error("Failed to get screen configuration while trying to get desktop display mode."); + } + + XRRFreeScreenConfigInfo(config); + } else { + Log::error("Failed to use XRandR extension while trying to get desktop display mode."); + } + + XReleaseDisplay(); + } else { + Log::error("Failed to connect to the X server while trying to get desktop display mode."); + } + + return mode; } } // namespace sp From 421bf819d5571842d0b3ba25dc3cf9745b744a6a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 17 Oct 2020 14:10:33 +0200 Subject: [PATCH 167/361] examples/build.lua: Unix systems needs to link with xrandr. --- examples/build.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/build.lua b/examples/build.lua index 2445a86..381f5e3 100644 --- a/examples/build.lua +++ b/examples/build.lua @@ -19,7 +19,7 @@ if TARGET_OS == "Win32" then elseif TARGET_OS == "Unix" then -- Unix nees dl and X11 libs. - example_settings.link.libs:Add("dl", 'X11', 'freetype') + example_settings.link.libs:Add("dl", 'X11', 'Xrandr', 'freetype') end -- For now, to get examples working From d73c787f40bda183075208b48793aa82331a3dea Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 17 Oct 2020 14:18:41 +0200 Subject: [PATCH 168/361] Platform/Unix/X11SharedDisplay: pass a pointer to the display to XReleaseDisplay() just to be sure client code has a valid pointer --- source/Platform/Unix/GLXContext.cpp | 2 +- source/Platform/Unix/UnixMisc.cpp | 4 ++-- source/Platform/Unix/X11Display.cpp | 2 +- source/Platform/Unix/X11EventQueue.cpp | 2 +- source/Platform/Unix/X11Keyboard.cpp | 2 +- source/Platform/Unix/X11Mouse.cpp | 2 +- source/Platform/Unix/X11SharedDisplay.cpp | 5 ++++- source/Platform/Unix/X11SharedDisplay.h | 2 +- 8 files changed, 12 insertions(+), 9 deletions(-) diff --git a/source/Platform/Unix/GLXContext.cpp b/source/Platform/Unix/GLXContext.cpp index b00db35..53465a5 100644 --- a/source/Platform/Unix/GLXContext.cpp +++ b/source/Platform/Unix/GLXContext.cpp @@ -160,7 +160,7 @@ void GLXContext::destroy() } if (m_disp) { - XReleaseDisplay(); + XReleaseDisplay(m_disp); m_disp = NULL; } diff --git a/source/Platform/Unix/UnixMisc.cpp b/source/Platform/Unix/UnixMisc.cpp index 9f88478..afe2deb 100644 --- a/source/Platform/Unix/UnixMisc.cpp +++ b/source/Platform/Unix/UnixMisc.cpp @@ -60,7 +60,7 @@ void PlatformMisc::GetDisplayModes(std::vector& modes) Log::error("Failed to use XRandR extension while trying to get display modes."); } - XReleaseDisplay(); + XReleaseDisplay(disp); } else { Log::error("Failed to connect to the X server while trying to get display modes."); } @@ -104,7 +104,7 @@ DisplayMode PlatformMisc::GetDesktopMode() Log::error("Failed to use XRandR extension while trying to get desktop display mode."); } - XReleaseDisplay(); + XReleaseDisplay(disp); } else { Log::error("Failed to connect to the X server while trying to get desktop display mode."); } diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 21308a1..ed93a7a 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -75,7 +75,7 @@ void X11Display::destroy() } if (m_disp) { - XReleaseDisplay(); + XReleaseDisplay(m_disp); m_disp = NULL; } } diff --git a/source/Platform/Unix/X11EventQueue.cpp b/source/Platform/Unix/X11EventQueue.cpp index adcce7f..d251eab 100644 --- a/source/Platform/Unix/X11EventQueue.cpp +++ b/source/Platform/Unix/X11EventQueue.cpp @@ -16,7 +16,7 @@ X11EventQueue::X11EventQueue() X11EventQueue::~X11EventQueue() { if (m_disp) { - XReleaseDisplay(); + XReleaseDisplay(m_disp); } } diff --git a/source/Platform/Unix/X11Keyboard.cpp b/source/Platform/Unix/X11Keyboard.cpp index 9121ebe..5a7b059 100644 --- a/source/Platform/Unix/X11Keyboard.cpp +++ b/source/Platform/Unix/X11Keyboard.cpp @@ -210,7 +210,7 @@ m_disp(NULL) X11Keyboard::~X11Keyboard() { if (m_disp) { - XReleaseDisplay(); + XReleaseDisplay(m_disp); } } diff --git a/source/Platform/Unix/X11Mouse.cpp b/source/Platform/Unix/X11Mouse.cpp index 35bf945..c6c846d 100644 --- a/source/Platform/Unix/X11Mouse.cpp +++ b/source/Platform/Unix/X11Mouse.cpp @@ -16,7 +16,7 @@ m_btn_state(0) X11Mouse::~X11Mouse() { if (m_disp) { - XReleaseDisplay(); + XReleaseDisplay(m_disp); } } diff --git a/source/Platform/Unix/X11SharedDisplay.cpp b/source/Platform/Unix/X11SharedDisplay.cpp index a7c691d..51f0d10 100644 --- a/source/Platform/Unix/X11SharedDisplay.cpp +++ b/source/Platform/Unix/X11SharedDisplay.cpp @@ -1,4 +1,5 @@ +#include #include "X11SharedDisplay.h" namespace sp { @@ -18,7 +19,9 @@ unsigned int refcount = 0; return sharedDisplay; } -void XReleaseDisplay() { +void XReleaseDisplay(::Display* disp) { + + assert(disp == sharedDisplay); if (refcount < 1) { return; diff --git a/source/Platform/Unix/X11SharedDisplay.h b/source/Platform/Unix/X11SharedDisplay.h index fed3a05..b662afc 100644 --- a/source/Platform/Unix/X11SharedDisplay.h +++ b/source/Platform/Unix/X11SharedDisplay.h @@ -9,7 +9,7 @@ namespace sp { ::Display* XGetDisplay(); -void XReleaseDisplay(); +void XReleaseDisplay(::Display* disp); Atom getAtom(const std::string& name, bool onlyIfExists = false); From 3d9dda64cacab090881bcc4fb461125ae9025faa Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 17 Oct 2020 15:07:20 +0200 Subject: [PATCH 169/361] Platform/Unix/X11Display: Implement showCursor() --- source/Platform/Unix/X11Display.cpp | 30 +++++++++++++++++++++++++---- source/Platform/Unix/X11Display.h | 7 ++++++- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index ed93a7a..968a9c3 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -10,9 +10,11 @@ namespace sp { X11Display:: X11Display() : -m_screen (0), -m_disp (NULL), -m_size (200,200) +m_screen (0), +m_disp (NULL), +m_size (200,200), +m_cur_last (0), +m_cur_hidden (0) { } @@ -65,6 +67,8 @@ bool X11Display::create(DisplayDescription description) Log::info("X11: Created display"); + createHiddenCursor(); + return true; } @@ -117,9 +121,27 @@ void X11Display::setIcon(const std::string& icon) // TODO: Implement } +void X11Display::createHiddenCursor() +{ + XColor c; + Pixmap pix = ::XCreatePixmap(m_disp, m_win, 1, 1, 1); + GC gc = ::XCreateGC(m_disp, pix, 0, NULL); + + // Draw transparent pixel. + ::XDrawPoint(m_disp, pix, gc, 0, 0); + + c.red = c.green = c.blue = 0; + c.flags = DoRed | DoGreen | DoBlue; + m_cur_hidden = XCreatePixmapCursor(m_disp, pix, pix, &c, &c, 0, 0); + + // Free GC and pixmap. + ::XFreePixmap(m_disp, pix); + ::XFreeGC(m_disp, gc); +} + void X11Display::showCursor(bool value) { - // TODO: Implement + XDefineCursor(m_disp, m_win, value ? m_cur_last : m_cur_hidden); } void X11Display::processEvent(const ::XEvent& event) diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Display.h index 9343705..ec4c094 100644 --- a/source/Platform/Unix/X11Display.h +++ b/source/Platform/Unix/X11Display.h @@ -39,6 +39,10 @@ public : void processEvent(const ::XEvent& event); +protected : + + void createHiddenCursor(); + protected : ::Display* m_disp; @@ -47,7 +51,8 @@ protected : int m_screen; - //GC m_GC; + ::Cursor m_cur_hidden; + ::Cursor m_cur_last; Vector2u m_size; }; From f5d80aa46f100a5fd76955998341fad7c3f42a47 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 27 Oct 2020 17:04:10 +0100 Subject: [PATCH 170/361] Platform/Unix/X11Display: Implement setIcon() --- source/Platform/Unix/X11Display.cpp | 35 ++++++++++++++++++++++++++++- source/Platform/Unix/X11Display.h | 3 +++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 968a9c3..94cea38 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -1,6 +1,7 @@ #include // Prevents conflict with X.h defining "None" #include +#include #include "X11WindowEventHandler.h" #include "X11SharedDisplay.h" #include "GLXContext.h" @@ -116,9 +117,41 @@ void X11Display::setCaption(const std::string& caption) ::XStoreName(m_disp, m_win, caption.c_str()); } +// TODO: Move this up to the non-platform layer. void X11Display::setIcon(const std::string& icon) { - // TODO: Implement + Image img; + + if (img.loadFromFile(icon)) { + setIcon(img.getWidth(), img.getHeight(), img.getPixels()); + } +} + +void X11Display::setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) +{ + ::Atom net_wm_icon = getAtom("_NET_WM_ICON", False); + ::Atom cardinal = getAtom("CARDINAL", False); + std::vector buffer(2 + width * height); + uint64_t *ptr = &buffer[0]; + + *ptr++ = width; + *ptr++ = height; + + // TODO: Conversion between differnet formats should be defined as functions in Graphics/PixelFormat.h + for (std::size_t i = 0; i < width * height; i++) { + *ptr++ = (pixels[i * 4 + 2] << 0) + | (pixels[i * 4 + 1] << 8) + | (pixels[i * 4 + 0] << 16) + | (pixels[i * 4 + 3] << 24); + } + + ::XChangeProperty(m_disp, m_win, + net_wm_icon, cardinal, 32, + PropModeReplace, + reinterpret_cast(&buffer[0]), + 2 + width * height); + + XFlush(m_disp); } void X11Display::createHiddenCursor() diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Display.h index ec4c094..538e5c0 100644 --- a/source/Platform/Unix/X11Display.h +++ b/source/Platform/Unix/X11Display.h @@ -6,6 +6,7 @@ #include #include #include +#include #include namespace sp { @@ -35,6 +36,8 @@ public : virtual void setIcon(const std::string& icon); + virtual void setIcon(unsigned int width, unsigned int height, const uint8_t *pixels); + virtual void showCursor(bool value); void processEvent(const ::XEvent& event); From 61b233f708810d45e8d7243793dc83c0953bf3e2 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 27 Oct 2020 18:47:26 +0100 Subject: [PATCH 171/361] Platform/Unix/X11Display.cpp: Minor cleanup. --- source/Platform/Unix/X11Display.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 94cea38..ef67380 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -24,6 +24,8 @@ bool X11Display::create(DisplayDescription description) XSetWindowAttributes attr; XVisualInfo* vi; Atom protocols; + Visual* visual; + Window root_win; m_disp = XGetDisplay(); if (m_disp == NULL) { @@ -32,21 +34,22 @@ bool X11Display::create(DisplayDescription description) } m_screen = DefaultScreen(m_disp); + root_win = XRootWindow(m_disp, m_screen); + visual = DefaultVisual(m_disp, m_screen); attr.border_pixel = BlackPixel(m_disp, m_screen); attr.background_pixel = WhitePixel(m_disp, m_screen); //attr.override_redirect = True; - attr.colormap = ::XCreateColormap(m_disp, RootWindow(m_disp, m_screen), DefaultVisual(m_disp, m_screen), AllocNone); + attr.colormap = ::XCreateColormap(m_disp, root_win, visual, AllocNone); // We want Keyboard,Mouse,Resize,Exposure (repaint) events. attr.event_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask | ExposureMask; - m_win = XCreateWindow(m_disp, - RootWindow(m_disp, m_screen), + m_win = XCreateWindow(m_disp, root_win, 0, 0, m_size.x, m_size.y, 0, DefaultDepth(m_disp, m_screen), - InputOutput, DefaultVisual(m_disp, m_screen), + InputOutput, visual, CWBackPixel | CWColormap | CWBorderPixel | CWEventMask, &attr); // Register event handler From 0d029817fec4634c7f965af6cd4f4265fe1d8e54 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 27 Oct 2020 18:49:17 +0100 Subject: [PATCH 172/361] source/Platform/Unix/X11Display.cpp: in destroy() call XDestroyWindow() --- source/Platform/Unix/X11Display.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index ef67380..083546e 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -80,6 +80,7 @@ void X11Display::destroy() { if (m_win) { X11WindowEventHandler::unregisterHandler(m_disp, m_win); + ::XDestroyWindow(m_disp, m_win); } if (m_disp) { From 50439a58bd85302379365bfbb89178db5f6180a3 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 27 Oct 2020 18:50:33 +0100 Subject: [PATCH 173/361] source/Platform/Unix/X11Display.cpp: in destroy() make sure m_disp is valid before calling functions that needs it. --- source/Platform/Unix/X11Display.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 083546e..f2f5289 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -78,12 +78,13 @@ bool X11Display::create(DisplayDescription description) void X11Display::destroy() { - if (m_win) { - X11WindowEventHandler::unregisterHandler(m_disp, m_win); - ::XDestroyWindow(m_disp, m_win); - } - if (m_disp) { + + if (m_win) { + X11WindowEventHandler::unregisterHandler(m_disp, m_win); + ::XDestroyWindow(m_disp, m_win); + } + XReleaseDisplay(m_disp); m_disp = NULL; } From 0c76864b40b0d11b14e07d12a92bad477b00c334 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 27 Oct 2020 19:39:25 +0100 Subject: [PATCH 174/361] Platform/Unix/X11Display: in setSize() check if width or height is zero before calling XResizeWindow() --- source/Platform/Unix/X11Display.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index f2f5289..9b54150 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -102,8 +102,16 @@ void* X11Display::getHandle() const void X11Display::setSize(unsigned int width, unsigned int height) { - m_size = Vector2u(width, height); + // X11 does not like if width or height is zero. + if (width == 0) { + width = 1; + } + if (height == 0) { + height = 1; + } + + m_size = Vector2u(width, height); ::XResizeWindow(m_disp, m_win, m_size.x, m_size.y); } From 40e4f954529dae76260b57a925355e94b4420c0f Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 28 Oct 2020 11:00:45 +0100 Subject: [PATCH 175/361] Platform/Unix/X11Display.cpp: minor stuff. --- source/Platform/Unix/X11Display.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 9b54150..b9e73ac 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -46,9 +46,9 @@ bool X11Display::create(DisplayDescription description) | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask | ExposureMask; - m_win = XCreateWindow(m_disp, root_win, - 0, 0, - m_size.x, m_size.y, 0, DefaultDepth(m_disp, m_screen), + m_win = ::XCreateWindow(m_disp, root_win, + 0, 0, /* Position */ + m_size.x, m_size.y, 0 /* Border width */, DefaultDepth(m_disp, m_screen), InputOutput, visual, CWBackPixel | CWColormap | CWBorderPixel | CWEventMask, &attr); From 56c24f7118750fd2fe41a98c0abcf1bd2673e626 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 20 Dec 2020 13:42:30 +0100 Subject: [PATCH 176/361] Platform/Unix/X11Display: Implement missing interface functions. * getPosition * setVisible * minimize * maximize * grabCursor (only stub. to get the code to compile) --- source/Platform/Unix/X11Display.cpp | 55 ++++++++++++++++++++++++++++- source/Platform/Unix/X11Display.h | 10 ++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index b9e73ac..2cbb3d0 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -7,6 +7,11 @@ #include "GLXContext.h" #include "X11Display.h" +// Sometimes not defined in headers. +#ifndef _NET_WM_STATE_TOGGLE +#define _NET_WM_STATE_TOGGLE 2 +#endif + namespace sp { X11Display:: @@ -61,7 +66,7 @@ bool X11Display::create(DisplayDescription description) protocols = getAtom("WM_DELETE_WINDOW"); XSetWMProtocols(m_disp, m_win, &protocols, 1); - XMapWindow(m_disp, m_win); + setVisible(true); setSize(description.mode.width, description.mode.height); @@ -125,6 +130,49 @@ void X11Display::setPosition(unsigned int x, unsigned int y) ::XMoveWindow(m_disp, m_win, x, y); } +Vector2u X11Display::getPosition() const +{ + Vector2u pos(0, 0); + XWindowAttributes attr; + + if (XGetWindowAttributes(m_disp, m_win, &attr)) { + pos.x = attr.x; + pos.y = attr.y; + } + return pos; +} + +void X11Display::setVisible(bool visible) +{ + if (visible) { + ::XMapWindow(m_disp, m_win); + } else { + ::XUnmapWindow(m_disp, m_win); + } +} + +void X11Display::minimize() +{ + ::XIconifyWindow(m_disp, m_win, m_screen); +} + +void X11Display::maximize() +{ + ::XClientMessageEvent ev = {}; + + ev.type = ClientMessage; + ev.window = m_win; + ev.message_type = getAtom("_NET_WM_STATE"); + ev.format = 32; + ev.data.l[0] = _NET_WM_STATE_TOGGLE; + ev.data.l[1] = getAtom("_NET_WM_STATE_MAXIMIZED_HORZ"); + ev.data.l[2] = getAtom("_NET_WM_STATE_MAXIMIZED_VERT"); + ev.data.l[3] = 1; + + ::XSendEvent(m_disp, DefaultRootWindow(m_disp), False, + SubstructureNotifyMask, (XEvent*) &ev); +} + void X11Display::setCaption(const std::string& caption) { ::XStoreName(m_disp, m_win, caption.c_str()); @@ -190,6 +238,11 @@ void X11Display::showCursor(bool value) XDefineCursor(m_disp, m_win, value ? m_cur_last : m_cur_hidden); } +void X11Display::grabCursor(bool value) +{ + // TODO (this is abit harder on X11 than windows.) +} + void X11Display::processEvent(const ::XEvent& event) { Vector2u size; diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Display.h index 538e5c0..b62a372 100644 --- a/source/Platform/Unix/X11Display.h +++ b/source/Platform/Unix/X11Display.h @@ -32,6 +32,14 @@ public : virtual void setPosition(unsigned int x, unsigned int y); + virtual Vector2u getPosition() const; + + virtual void setVisible(bool visible); + + virtual void minimize(); + + virtual void maximize(); + virtual void setCaption(const std::string& caption); virtual void setIcon(const std::string& icon); @@ -40,6 +48,8 @@ public : virtual void showCursor(bool value); + virtual void grabCursor(bool value); + void processEvent(const ::XEvent& event); protected : From d971cd6cb2640ac5d810a9037b5562d4c32e803e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 20 Dec 2020 13:55:56 +0100 Subject: [PATCH 177/361] Platform/Unix/X11Display.cpp: Capture input focus events (just log for now). --- source/Platform/Unix/X11Display.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 2cbb3d0..435ab82 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -46,8 +46,9 @@ bool X11Display::create(DisplayDescription description) attr.background_pixel = WhitePixel(m_disp, m_screen); //attr.override_redirect = True; attr.colormap = ::XCreateColormap(m_disp, root_win, visual, AllocNone); - // We want Keyboard,Mouse,Resize,Exposure (repaint) events. - attr.event_mask = KeyPressMask | KeyReleaseMask + // We want InputFocus,Keyboard,Mouse,Resize,Exposure (repaint) events. + attr.event_mask = FocusChangeMask + | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask | ExposureMask; @@ -258,6 +259,15 @@ void X11Display::processEvent(const ::XEvent& event) onReshape(size.x, size.y); } break; + case MotionNotify : + // Generates to much events to log :) + break; + case FocusIn: + Log::debug("X11: FocusIn"); + break; + case FocusOut: + Log::debug("X11: FocusOut"); + break; } } From d9f54b08ca5c4a8155e5649ad593cf00de7a07a2 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 20 Dec 2020 16:01:37 +0100 Subject: [PATCH 178/361] Platform/Unix/X11Display: Adding getFocused() --- source/Platform/Unix/X11Display.cpp | 11 +++++++++++ source/Platform/Unix/X11Display.h | 3 +++ 2 files changed, 14 insertions(+) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 435ab82..556e601 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -14,6 +14,17 @@ namespace sp { +namespace _priv { + + // Pointer to the display that has focus (or NULL if none have). + X11Display* focused_display = NULL; +} + +X11Display* X11Display::getFocused() +{ + return _priv::focused_display; +} + X11Display:: X11Display() : m_screen (0), diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Display.h index b62a372..1816c37 100644 --- a/source/Platform/Unix/X11Display.h +++ b/source/Platform/Unix/X11Display.h @@ -16,6 +16,9 @@ namespace sp { class X11Display : public PlatformDisplay { public : + + static X11Display* getFocused(); + X11Display(); virtual bool create(DisplayDescription description); From 227d58725d36800bff642dfa507c262bd3cc6729 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 20 Dec 2020 16:03:05 +0100 Subject: [PATCH 179/361] Platform/Unix/X11Display.cpp: Set and unset focused_display variable when the display receives FocusIn/Out events. --- source/Platform/Unix/X11Display.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 556e601..c3eecf4 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -275,9 +275,11 @@ void X11Display::processEvent(const ::XEvent& event) break; case FocusIn: Log::debug("X11: FocusIn"); + _priv::focused_display = this; break; case FocusOut: Log::debug("X11: FocusOut"); + _priv::focused_display = NULL; break; } } From f71cfa86f2696344be75bcddfcfbbc1d4f076dc0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 20 Dec 2020 16:09:16 +0100 Subject: [PATCH 180/361] Platform/Unix/X11Mouse: use X11Display::getFocused() to get the coordinates relative to the focused window. --- source/Platform/Unix/X11Mouse.cpp | 28 ++++++++++++++++++++++------ source/Platform/Unix/X11Mouse.h | 6 +++++- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/source/Platform/Unix/X11Mouse.cpp b/source/Platform/Unix/X11Mouse.cpp index c6c846d..850eec0 100644 --- a/source/Platform/Unix/X11Mouse.cpp +++ b/source/Platform/Unix/X11Mouse.cpp @@ -1,6 +1,7 @@ #include #include +#include "X11Display.h" #include "X11Mouse.h" #include "X11SharedDisplay.h" @@ -23,17 +24,17 @@ X11Mouse::~X11Mouse() void X11Mouse::init() { m_disp = XGetDisplay(); + updateFocusedWindow(); } Vector2f X11Mouse::getPosition() const { - // TODO: Translate to window. return m_position; } Vector2f X11Mouse::getAbsPosition() const { - return m_position; + return m_abs_position; } bool X11Mouse::isButtonDown(Mouse::Button button) const @@ -58,15 +59,30 @@ void X11Mouse::update(InputModule *input) ::Window root, child; int rx, ry, x = 0, y = 0; + updateFocusedWindow(); + // Query position and button state. - XQueryPointer(m_disp, ::XDefaultRootWindow(m_disp), + XQueryPointer(m_disp, + m_win ? m_win : ::XDefaultRootWindow(m_disp), &root, &child, &rx, &ry, &x, &y, &m_btn_state); - // Update position - m_position.x = x; - m_position.y = y; + // Update abs position (relative to root). + m_abs_position.x = rx; + m_abs_position.y = ry; + + // Update window position. + if (m_win) { + m_position.x = x; + m_position.y = y; + } +} + +void X11Mouse::updateFocusedWindow() +{ + X11Display *focus = X11Display::getFocused(); + m_win = focus ? (::Window) focus->getHandle() : 0; } bool X11Mouse::handleMessage(XEvent* xevent, Event& event) diff --git a/source/Platform/Unix/X11Mouse.h b/source/Platform/Unix/X11Mouse.h index 84c326c..26717c2 100644 --- a/source/Platform/Unix/X11Mouse.h +++ b/source/Platform/Unix/X11Mouse.h @@ -29,12 +29,16 @@ protected : virtual void update(InputModule *input); + void updateFocusedWindow(); + protected : ::Display* m_disp; - ::Window m_win; + ::Window m_win; // Focused window. Vector2f m_position; + Vector2f m_abs_position; + unsigned int m_btn_state; }; From 6c96a3d9a13d5c1390b4cc2ae66055ebab173eba Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 20 Dec 2020 16:28:25 +0100 Subject: [PATCH 181/361] Platform/Unix/X11Mouse.cpp: in isButtonDown() check if we have a focused window. --- source/Platform/Unix/X11Mouse.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/source/Platform/Unix/X11Mouse.cpp b/source/Platform/Unix/X11Mouse.cpp index 850eec0..9ef045a 100644 --- a/source/Platform/Unix/X11Mouse.cpp +++ b/source/Platform/Unix/X11Mouse.cpp @@ -39,6 +39,12 @@ Vector2f X11Mouse::getAbsPosition() const bool X11Mouse::isButtonDown(Mouse::Button button) const { + // Only signal that a button is down + // if we have focus on a window. + if (!m_win) { + return false; + } + // TODO: Button1 and 2 is defined in x11 and // therefore clashes with Mouse::Button::Button1 and 2. switch(button) { From 080c4f77c3a15883a5e6ef705e55a7c1588eb7bd Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 20 Dec 2020 16:29:12 +0100 Subject: [PATCH 182/361] Platform/Unix/X11Keyboard: only update state and signal key down if we have a focused window. --- source/Platform/Unix/X11Keyboard.cpp | 23 ++++++++++++++++++++--- source/Platform/Unix/X11Keyboard.h | 1 + 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/source/Platform/Unix/X11Keyboard.cpp b/source/Platform/Unix/X11Keyboard.cpp index 5a7b059..5843f94 100644 --- a/source/Platform/Unix/X11Keyboard.cpp +++ b/source/Platform/Unix/X11Keyboard.cpp @@ -1,6 +1,9 @@ +#include // FIXME: Weird name clashes with Xlib.h + #include #include "X11Keyboard.h" +#include "X11Display.h" #include "X11SharedDisplay.h" #include #include @@ -202,7 +205,8 @@ static Keyboard::Key KeySymToKeyboardKey(KeySym key) { } X11Keyboard::X11Keyboard() : -m_disp(NULL) +m_disp(NULL), +m_win(0) { memset(m_key_state, 0, sizeof(m_key_state) / sizeof(m_key_state[0])); } @@ -223,6 +227,12 @@ bool X11Keyboard::isKeyDown(Keyboard::Key key) { KeySym sym; + // Only signal that a button is down + // if we have focus on a window. + if (!m_win) { + return false; + } + switch(key) { // Letters case Keyboard::Key::A : sym = XK_a; break; @@ -350,8 +360,15 @@ bool X11Keyboard::handleMessage(XKeyEvent* xkeyevent, Event& event) void X11Keyboard::update(InputModule *input) { - // Query keyboard state. - ::XQueryKeymap(m_disp, m_key_state); + X11Display *focus = X11Display::getFocused(); + m_win = focus ? (::Window) focus->getHandle() : 0; + + // If we have focus. + if (m_win) { + + // Query keyboard state. + ::XQueryKeymap(m_disp, m_key_state); + } } } // namespace sp diff --git a/source/Platform/Unix/X11Keyboard.h b/source/Platform/Unix/X11Keyboard.h index 4684bba..3140160 100644 --- a/source/Platform/Unix/X11Keyboard.h +++ b/source/Platform/Unix/X11Keyboard.h @@ -27,6 +27,7 @@ protected : private : ::Display* m_disp; + ::Window m_win; // Focused window // Cached keyboard state. char m_key_state[32]; From 12b2413e232dea129109c94d4b40abffa90280a9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 23 Dec 2020 14:34:12 +0100 Subject: [PATCH 183/361] include/Spectre/Display/DisplayDescription.h: Rename DisplayDecorate::None to Empty (None clashes with X11) --- include/Spectre/Display/DisplayDescription.h | 2 +- source/Display/Display.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/include/Spectre/Display/DisplayDescription.h b/include/Spectre/Display/DisplayDescription.h index 0d6539b..06067e0 100644 --- a/include/Spectre/Display/DisplayDescription.h +++ b/include/Spectre/Display/DisplayDescription.h @@ -9,7 +9,7 @@ namespace sp { namespace DisplayDecorate { enum Type { - None = 0, + Empty = 0, Menu = 1 << 0, Resize = 1 << 1, Close = 1 << 2, diff --git a/source/Display/Display.cpp b/source/Display/Display.cpp index 24ced50..bd13bd6 100644 --- a/source/Display/Display.cpp +++ b/source/Display/Display.cpp @@ -114,7 +114,7 @@ void Display::setVideoMode(Mode mode) m_cacheDesc = m_description; } - desc.decoration = DisplayDecorate::None; + desc.decoration = DisplayDecorate::Empty; } else { desc = m_cacheDesc; } From 197b4df87ffe3d697c1172c26ab3c8339da1188d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 23 Dec 2020 14:36:38 +0100 Subject: [PATCH 184/361] Unix: Remove unnecessary includes of Spectre/Display/DisplayDescription.h --- source/Platform/Unix/X11Display.cpp | 1 - source/Platform/Unix/X11Display.h | 1 - source/Platform/Unix/X11Keyboard.cpp | 2 -- 3 files changed, 4 deletions(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index c3eecf4..577ee10 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -1,5 +1,4 @@ -#include // Prevents conflict with X.h defining "None" #include #include #include "X11WindowEventHandler.h" diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Display.h index 1816c37..708e4ca 100644 --- a/source/Platform/Unix/X11Display.h +++ b/source/Platform/Unix/X11Display.h @@ -2,7 +2,6 @@ #ifndef PLATFORM_UNIX_X11DISPLAY_H #define PLATFORM_UNIX_X11DISPLAY_H -#include // Prevents conflict with X.h defining "None" #include #include #include diff --git a/source/Platform/Unix/X11Keyboard.cpp b/source/Platform/Unix/X11Keyboard.cpp index 5843f94..a7e30df 100644 --- a/source/Platform/Unix/X11Keyboard.cpp +++ b/source/Platform/Unix/X11Keyboard.cpp @@ -1,6 +1,4 @@ -#include // FIXME: Weird name clashes with Xlib.h - #include #include "X11Keyboard.h" #include "X11Display.h" From 60dd9bacb02de61ae5513cdb510471bc1e770235 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 25 Dec 2020 17:13:47 +0100 Subject: [PATCH 185/361] source/Game.cpp: make sure we call init() and shutdown() for platform --- source/Game.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/source/Game.cpp b/source/Game.cpp index 01cccc1..e8ff9c2 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -34,12 +34,17 @@ Game::~Game() { delete m_input; delete m_graphics; - delete m_platform; delete m_messageHandler; + + // TODO: This is abit ugly tbh. + m_platform->shutdown(); + delete m_platform; } void Game::run() { + m_platform->init(); + if (!m_graphics->init()) { return; } From 090646b61aee413cff7e20a75f553702c01dbeba Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 25 Dec 2020 17:17:51 +0100 Subject: [PATCH 186/361] Platform/Unix: Rename X11SharedDisplay to Xlib, and remove Display member variable from all classes. We now initialize/destroy the display in Xlib::init/shutdown that is called in UnixApplication::init/shutdown and therefore is valid through the whole lifetime. So no need for classes to keep references. --- engine.build.lua | 2 +- source/Platform/Unix/GLXContext.cpp | 37 +++---- source/Platform/Unix/GLXContext.h | 2 - source/Platform/Unix/UnixApplication.cpp | 5 +- source/Platform/Unix/UnixMisc.cpp | 13 +-- source/Platform/Unix/X11Display.cpp | 98 +++++++++---------- source/Platform/Unix/X11Display.h | 2 - source/Platform/Unix/X11EventQueue.cpp | 30 ++---- source/Platform/Unix/X11EventQueue.h | 5 - source/Platform/Unix/X11Keyboard.cpp | 10 +- source/Platform/Unix/X11Mouse.cpp | 17 +--- source/Platform/Unix/X11Mouse.h | 2 - source/Platform/Unix/X11SharedDisplay.cpp | 40 -------- source/Platform/Unix/X11SharedDisplay.h | 18 ---- .../Platform/Unix/X11WindowEventHandler.cpp | 1 - source/Platform/Unix/Xlib.cpp | 34 +++++++ source/Platform/Unix/Xlib.h | 22 +++++ 17 files changed, 137 insertions(+), 201 deletions(-) delete mode 100644 source/Platform/Unix/X11SharedDisplay.cpp delete mode 100644 source/Platform/Unix/X11SharedDisplay.h create mode 100644 source/Platform/Unix/Xlib.cpp create mode 100644 source/Platform/Unix/Xlib.h diff --git a/engine.build.lua b/engine.build.lua index 831d539..c050a73 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -64,8 +64,8 @@ if TARGET_OS == "Win32" then }) elseif TARGET_OS == "Unix" then platform_spec_module = Module("source/Platform/Unix", { + "Xlib.cpp", "UnixApplication.cpp", - "X11SharedDisplay.cpp", "X11Display.cpp", "GLXContext.cpp", "X11Input.cpp", diff --git a/source/Platform/Unix/GLXContext.cpp b/source/Platform/Unix/GLXContext.cpp index 53465a5..ea93438 100644 --- a/source/Platform/Unix/GLXContext.cpp +++ b/source/Platform/Unix/GLXContext.cpp @@ -4,7 +4,7 @@ #include #include "glad_glx.h" -#include "X11SharedDisplay.h" +#include "Xlib.h" #include "GLXContext.h" namespace sp { @@ -60,7 +60,6 @@ static bool ensureExtensionsLoaded(::Display* disp, int screen) } GLXContext::GLXContext() : -m_disp (NULL), m_win (0), m_ctx (NULL) { @@ -76,13 +75,6 @@ bool GLXContext::create(const PlatformDisplay* display) // Destroy any previous context first. destroy(); - m_disp = XGetDisplay(); - if (m_disp == NULL) { - destroy(); - Log::warn("X11: Could not open display"); - return false; - } - m_win = (::Window) display->getHandle(); if (!createGLContext()) { @@ -95,6 +87,7 @@ bool GLXContext::create(const PlatformDisplay* display) bool GLXContext::createGLContext() { + ::Display* disp = Xlib::getDisplay(); ::GLXFBConfig *fbc; ::XVisualInfo *info; int fbcount; @@ -117,31 +110,31 @@ bool GLXContext::createGLContext() }; // Ensure glx extensions are loaded. - if (!ensureExtensionsLoaded(m_disp, DefaultScreen(m_disp))) { + if (!ensureExtensionsLoaded(disp, DefaultScreen(disp))) { return false; } - info = ::glXChooseVisual(m_disp, DefaultScreen(m_disp), vi_attr); + info = ::glXChooseVisual(disp, DefaultScreen(disp), vi_attr); if (info == NULL) { Log::warn("GLX: Could not find a valid VisualInfo."); return false; } // Setup GL settings. - fbc = glXChooseFBConfig(m_disp, DefaultScreen(m_disp), (const int*) info->visual, &fbcount); + fbc = glXChooseFBConfig(disp, DefaultScreen(disp), (const int*) info->visual, &fbcount); if (fbc == NULL) { Log::warn("GLX: Could not find FB Config."); return false; } // Create context. - m_ctx = glXCreateContextAttribsARB(m_disp, fbc[0], NULL, GL_TRUE, ctx_attr); + m_ctx = glXCreateContextAttribsARB(disp, fbc[0], NULL, GL_TRUE, ctx_attr); if (m_ctx == NULL) { Log::warn("GLX: Failed to create context."); return false; } - glXMakeCurrent(m_disp, m_win, m_ctx); + glXMakeCurrent(disp, m_win, m_ctx); // Load OpenGL if (!loadGL()) { @@ -155,29 +148,24 @@ bool GLXContext::createGLContext() void GLXContext::destroy() { if (m_ctx) { - ::glXDestroyContext(m_disp, m_ctx); + ::glXDestroyContext(Xlib::getDisplay(), m_ctx); m_ctx = NULL; } - if (m_disp) { - XReleaseDisplay(m_disp); - m_disp = NULL; - } - m_win = None; } bool GLXContext::activate() { if (m_win && m_ctx) { - return ::glXMakeCurrent(m_disp, m_win, m_ctx); + return ::glXMakeCurrent(Xlib::getDisplay(), m_win, m_ctx); } return false; } bool GLXContext::deactivate() { - return ::glXMakeCurrent(m_disp, None, NULL); + return ::glXMakeCurrent(Xlib::getDisplay(), None, NULL); } bool GLXContext::isActive() const @@ -187,7 +175,8 @@ bool GLXContext::isActive() const bool GLXContext::setSwapInterval(int interval) { - ensureExtensionsLoaded(m_disp, DefaultScreen(m_disp)); + ::Display *disp = Xlib::getDisplay(); + ensureExtensionsLoaded(disp, DefaultScreen(disp)); if (GLAD_GLX_MESA_swap_control) { return glXSwapIntervalMESA(interval); @@ -215,7 +204,7 @@ void GLXContext::setSize(const Vector2u size) void GLXContext::swapBuffers() { - glXSwapBuffers(m_disp, m_win); + glXSwapBuffers(Xlib::getDisplay(), m_win); } } // namespace sp diff --git a/source/Platform/Unix/GLXContext.h b/source/Platform/Unix/GLXContext.h index 305d789..878a6f7 100644 --- a/source/Platform/Unix/GLXContext.h +++ b/source/Platform/Unix/GLXContext.h @@ -39,8 +39,6 @@ private : private : - ::Display* m_disp; - ::Window m_win; ::GLXContext m_ctx; diff --git a/source/Platform/Unix/UnixApplication.cpp b/source/Platform/Unix/UnixApplication.cpp index a8925d4..f2c175f 100644 --- a/source/Platform/Unix/UnixApplication.cpp +++ b/source/Platform/Unix/UnixApplication.cpp @@ -1,16 +1,17 @@ #include "UnixApplication.h" +#include "Xlib.h" namespace sp { void UnixApplication::init() { - // TODO + Xlib::init(); } void UnixApplication::shutdown() { - // TODO + Xlib::shutdown(); } PlatformInput& UnixApplication::getInput() diff --git a/source/Platform/Unix/UnixMisc.cpp b/source/Platform/Unix/UnixMisc.cpp index afe2deb..fd557f2 100644 --- a/source/Platform/Unix/UnixMisc.cpp +++ b/source/Platform/Unix/UnixMisc.cpp @@ -1,8 +1,7 @@ #include #include -#include "X11SharedDisplay.h" -#include +#include "Xlib.h" #include #include @@ -13,7 +12,7 @@ namespace sp { void PlatformMisc::GetDisplayModes(std::vector& modes) { - ::Display *disp = XGetDisplay(); + ::Display *disp = Xlib::getDisplay(); if (disp) { int scr = DefaultScreen(disp); @@ -28,7 +27,7 @@ void PlatformMisc::GetDisplayModes(std::vector& modes) XRRScreenSize* sizes = ::XRRConfigSizes(config, &nbSizes); if (sizes && nbSizes > 0) { int nbDepths = 0; - int* depths = XListDepths(disp, scr, &nbDepths); + int* depths = ::XListDepths(disp, scr, &nbDepths); if (depths && nbDepths > 0) { for(int i = 0; i < nbDepths; i++) { @@ -59,8 +58,6 @@ void PlatformMisc::GetDisplayModes(std::vector& modes) } else { Log::error("Failed to use XRandR extension while trying to get display modes."); } - - XReleaseDisplay(disp); } else { Log::error("Failed to connect to the X server while trying to get display modes."); } @@ -70,7 +67,7 @@ DisplayMode PlatformMisc::GetDesktopMode() { DisplayMode mode; - ::Display *disp = XGetDisplay(); + ::Display *disp = Xlib::getDisplay(); if (disp) { int scr = DefaultScreen(disp); @@ -103,8 +100,6 @@ DisplayMode PlatformMisc::GetDesktopMode() } else { Log::error("Failed to use XRandR extension while trying to get desktop display mode."); } - - XReleaseDisplay(disp); } else { Log::error("Failed to connect to the X server while trying to get desktop display mode."); } diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 577ee10..d960670 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -2,7 +2,7 @@ #include #include #include "X11WindowEventHandler.h" -#include "X11SharedDisplay.h" +#include "Xlib.h" #include "GLXContext.h" #include "X11Display.h" @@ -27,7 +27,6 @@ X11Display* X11Display::getFocused() X11Display:: X11Display() : m_screen (0), -m_disp (NULL), m_size (200,200), m_cur_last (0), m_cur_hidden (0) @@ -41,49 +40,44 @@ bool X11Display::create(DisplayDescription description) Atom protocols; Visual* visual; Window root_win; + ::Display* disp = Xlib::getDisplay(); - m_disp = XGetDisplay(); - if (m_disp == NULL) { - Log::warn("X11: Could not open display"); - return false; - } + m_screen = DefaultScreen(disp); + root_win = XRootWindow(disp, m_screen); + visual = DefaultVisual(disp, m_screen); - m_screen = DefaultScreen(m_disp); - root_win = XRootWindow(m_disp, m_screen); - visual = DefaultVisual(m_disp, m_screen); - - attr.border_pixel = BlackPixel(m_disp, m_screen); - attr.background_pixel = WhitePixel(m_disp, m_screen); + attr.border_pixel = BlackPixel(disp, m_screen); + attr.background_pixel = WhitePixel(disp, m_screen); //attr.override_redirect = True; - attr.colormap = ::XCreateColormap(m_disp, root_win, visual, AllocNone); + attr.colormap = ::XCreateColormap(disp, root_win, visual, AllocNone); // We want InputFocus,Keyboard,Mouse,Resize,Exposure (repaint) events. attr.event_mask = FocusChangeMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask | ExposureMask; - m_win = ::XCreateWindow(m_disp, root_win, + m_win = ::XCreateWindow(disp, root_win, 0, 0, /* Position */ - m_size.x, m_size.y, 0 /* Border width */, DefaultDepth(m_disp, m_screen), + m_size.x, m_size.y, 0 /* Border width */, DefaultDepth(disp, m_screen), InputOutput, visual, CWBackPixel | CWColormap | CWBorderPixel | CWEventMask, &attr); // Register event handler - X11WindowEventHandler::registerHandler(m_disp, m_win, this); + X11WindowEventHandler::registerHandler(disp, m_win, this); // X11 does not handle pressing the X button on a window. // that is the job of the window manager. // Here we can request the WM to send us a delete event so we can handle it ourself. - protocols = getAtom("WM_DELETE_WINDOW"); - XSetWMProtocols(m_disp, m_win, &protocols, 1); + protocols = Xlib::getAtom("WM_DELETE_WINDOW"); + XSetWMProtocols(disp, m_win, &protocols, 1); setVisible(true); setSize(description.mode.width, description.mode.height); // Clear and take focus - XClearWindow(m_disp, m_win); - XMapRaised(m_disp, m_win); + XClearWindow(disp, m_win); + XMapRaised(disp, m_win); Log::info("X11: Created display"); @@ -94,21 +88,16 @@ bool X11Display::create(DisplayDescription description) void X11Display::destroy() { - if (m_disp) { - - if (m_win) { - X11WindowEventHandler::unregisterHandler(m_disp, m_win); - ::XDestroyWindow(m_disp, m_win); - } - - XReleaseDisplay(m_disp); - m_disp = NULL; + if (m_win) { + ::Display* disp = Xlib::getDisplay(); + X11WindowEventHandler::unregisterHandler(disp, m_win); + ::XDestroyWindow(disp, m_win); } } bool X11Display::isValid() { - return m_disp && m_win; + return m_win; } void* X11Display::getHandle() const @@ -128,7 +117,7 @@ void X11Display::setSize(unsigned int width, unsigned int height) } m_size = Vector2u(width, height); - ::XResizeWindow(m_disp, m_win, m_size.x, m_size.y); + ::XResizeWindow(Xlib::getDisplay(), m_win, m_size.x, m_size.y); } Vector2u X11Display::getSize() const @@ -138,7 +127,7 @@ Vector2u X11Display::getSize() const void X11Display::setPosition(unsigned int x, unsigned int y) { - ::XMoveWindow(m_disp, m_win, x, y); + ::XMoveWindow(Xlib::getDisplay(), m_win, x, y); } Vector2u X11Display::getPosition() const @@ -146,7 +135,7 @@ Vector2u X11Display::getPosition() const Vector2u pos(0, 0); XWindowAttributes attr; - if (XGetWindowAttributes(m_disp, m_win, &attr)) { + if (XGetWindowAttributes(Xlib::getDisplay(), m_win, &attr)) { pos.x = attr.x; pos.y = attr.y; } @@ -156,37 +145,38 @@ Vector2u X11Display::getPosition() const void X11Display::setVisible(bool visible) { if (visible) { - ::XMapWindow(m_disp, m_win); + ::XMapWindow(Xlib::getDisplay(), m_win); } else { - ::XUnmapWindow(m_disp, m_win); + ::XUnmapWindow(Xlib::getDisplay(), m_win); } } void X11Display::minimize() { - ::XIconifyWindow(m_disp, m_win, m_screen); + ::XIconifyWindow(Xlib::getDisplay(), m_win, m_screen); } void X11Display::maximize() { ::XClientMessageEvent ev = {}; + ::Display* disp = Xlib::getDisplay(); ev.type = ClientMessage; ev.window = m_win; - ev.message_type = getAtom("_NET_WM_STATE"); + ev.message_type = Xlib::getAtom("_NET_WM_STATE"); ev.format = 32; ev.data.l[0] = _NET_WM_STATE_TOGGLE; - ev.data.l[1] = getAtom("_NET_WM_STATE_MAXIMIZED_HORZ"); - ev.data.l[2] = getAtom("_NET_WM_STATE_MAXIMIZED_VERT"); + ev.data.l[1] = Xlib::getAtom("_NET_WM_STATE_MAXIMIZED_HORZ"); + ev.data.l[2] = Xlib::getAtom("_NET_WM_STATE_MAXIMIZED_VERT"); ev.data.l[3] = 1; - ::XSendEvent(m_disp, DefaultRootWindow(m_disp), False, + ::XSendEvent(disp, DefaultRootWindow(disp), False, SubstructureNotifyMask, (XEvent*) &ev); } void X11Display::setCaption(const std::string& caption) { - ::XStoreName(m_disp, m_win, caption.c_str()); + ::XStoreName(Xlib::getDisplay(), m_win, caption.c_str()); } // TODO: Move this up to the non-platform layer. @@ -201,8 +191,9 @@ void X11Display::setIcon(const std::string& icon) void X11Display::setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) { - ::Atom net_wm_icon = getAtom("_NET_WM_ICON", False); - ::Atom cardinal = getAtom("CARDINAL", False); + ::Display* disp = Xlib::getDisplay(); + ::Atom net_wm_icon = Xlib::getAtom("_NET_WM_ICON", False); + ::Atom cardinal = Xlib::getAtom("CARDINAL", False); std::vector buffer(2 + width * height); uint64_t *ptr = &buffer[0]; @@ -217,36 +208,37 @@ void X11Display::setIcon(unsigned int width, unsigned int height, const uint8_t | (pixels[i * 4 + 3] << 24); } - ::XChangeProperty(m_disp, m_win, + ::XChangeProperty(disp, m_win, net_wm_icon, cardinal, 32, PropModeReplace, reinterpret_cast(&buffer[0]), 2 + width * height); - XFlush(m_disp); + XFlush(disp); } void X11Display::createHiddenCursor() { + ::Display* disp = Xlib::getDisplay(); XColor c; - Pixmap pix = ::XCreatePixmap(m_disp, m_win, 1, 1, 1); - GC gc = ::XCreateGC(m_disp, pix, 0, NULL); + Pixmap pix = ::XCreatePixmap(disp, m_win, 1, 1, 1); + GC gc = ::XCreateGC(disp, pix, 0, NULL); // Draw transparent pixel. - ::XDrawPoint(m_disp, pix, gc, 0, 0); + ::XDrawPoint(disp, pix, gc, 0, 0); c.red = c.green = c.blue = 0; c.flags = DoRed | DoGreen | DoBlue; - m_cur_hidden = XCreatePixmapCursor(m_disp, pix, pix, &c, &c, 0, 0); + m_cur_hidden = XCreatePixmapCursor(disp, pix, pix, &c, &c, 0, 0); // Free GC and pixmap. - ::XFreePixmap(m_disp, pix); - ::XFreeGC(m_disp, gc); + ::XFreePixmap(disp, pix); + ::XFreeGC(disp, gc); } void X11Display::showCursor(bool value) { - XDefineCursor(m_disp, m_win, value ? m_cur_last : m_cur_hidden); + XDefineCursor(Xlib::getDisplay(), m_win, value ? m_cur_last : m_cur_hidden); } void X11Display::grabCursor(bool value) diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Display.h index 708e4ca..403aaaf 100644 --- a/source/Platform/Unix/X11Display.h +++ b/source/Platform/Unix/X11Display.h @@ -60,8 +60,6 @@ protected : protected : - ::Display* m_disp; - ::Window m_win; int m_screen; diff --git a/source/Platform/Unix/X11EventQueue.cpp b/source/Platform/Unix/X11EventQueue.cpp index d251eab..86931f8 100644 --- a/source/Platform/Unix/X11EventQueue.cpp +++ b/source/Platform/Unix/X11EventQueue.cpp @@ -1,38 +1,24 @@ #include + #include "X11EventQueue.h" -#include "X11SharedDisplay.h" +#include "Xlib.h" #include "X11Keyboard.h" #include "X11Mouse.h" #include "X11WindowEventHandler.h" namespace sp { -X11EventQueue::X11EventQueue() -{ - m_disp = XGetDisplay(); -} - -X11EventQueue::~X11EventQueue() -{ - if (m_disp) { - XReleaseDisplay(m_disp); - } -} - bool X11EventQueue::poll(Event& event) { - Atom del_win = getAtom("WM_DELETE_WINDOW"); - Atom wm_proto = getAtom("WM_PROTOCOLS"); + ::Display* disp = Xlib::getDisplay(); + Atom del_win = Xlib::getAtom("WM_DELETE_WINDOW"); + Atom wm_proto = Xlib::getAtom("WM_PROTOCOLS"); - if (m_disp == NULL) { - return false; - } - - if (XPending(m_disp)) { + if (XPending(disp)) { XEvent xevent; - XNextEvent(m_disp, &xevent); + XNextEvent(disp, &xevent); switch(xevent.type) { case ClientMessage: @@ -64,7 +50,7 @@ bool X11EventQueue::poll(Event& event) default: // Pass to window. Log::info("X11: Window Event"); - X11WindowEventHandler::process(m_disp, xevent); + X11WindowEventHandler::process(disp, xevent); } } diff --git a/source/Platform/Unix/X11EventQueue.h b/source/Platform/Unix/X11EventQueue.h index 73b363f..b34c3dc 100644 --- a/source/Platform/Unix/X11EventQueue.h +++ b/source/Platform/Unix/X11EventQueue.h @@ -11,13 +11,8 @@ namespace sp { class X11EventQueue : public PlatformEventQueue { public : - X11EventQueue(); - virtual ~X11EventQueue(); virtual bool poll(Event& event); - -private : - ::Display* m_disp; }; } // namespace sp diff --git a/source/Platform/Unix/X11Keyboard.cpp b/source/Platform/Unix/X11Keyboard.cpp index a7e30df..b345ecb 100644 --- a/source/Platform/Unix/X11Keyboard.cpp +++ b/source/Platform/Unix/X11Keyboard.cpp @@ -2,7 +2,7 @@ #include #include "X11Keyboard.h" #include "X11Display.h" -#include "X11SharedDisplay.h" +#include "Xlib.h" #include #include #include @@ -211,14 +211,10 @@ m_win(0) X11Keyboard::~X11Keyboard() { - if (m_disp) { - XReleaseDisplay(m_disp); - } } void X11Keyboard::init() { - m_disp = XGetDisplay(); } bool X11Keyboard::isKeyDown(Keyboard::Key key) @@ -334,7 +330,7 @@ bool X11Keyboard::isKeyDown(Keyboard::Key key) default : sym = 0; break; } - KeyCode keycode = ::XKeysymToKeycode(m_disp, sym); + KeyCode keycode = ::XKeysymToKeycode(Xlib::getDisplay(), sym); if (keycode) { return m_key_state[keycode / 8] & (1 << (keycode % 8)); @@ -365,7 +361,7 @@ void X11Keyboard::update(InputModule *input) if (m_win) { // Query keyboard state. - ::XQueryKeymap(m_disp, m_key_state); + ::XQueryKeymap(Xlib::getDisplay(), m_key_state); } } diff --git a/source/Platform/Unix/X11Mouse.cpp b/source/Platform/Unix/X11Mouse.cpp index 9ef045a..cabbedc 100644 --- a/source/Platform/Unix/X11Mouse.cpp +++ b/source/Platform/Unix/X11Mouse.cpp @@ -1,29 +1,19 @@ #include #include +#include "Xlib.h" #include "X11Display.h" #include "X11Mouse.h" -#include "X11SharedDisplay.h" - namespace sp { X11Mouse::X11Mouse() : -m_disp(NULL), m_btn_state(0) { } -X11Mouse::~X11Mouse() -{ - if (m_disp) { - XReleaseDisplay(m_disp); - } -} - void X11Mouse::init() { - m_disp = XGetDisplay(); updateFocusedWindow(); } @@ -62,14 +52,15 @@ bool X11Mouse::isButtonDown(Mouse::Button button) const void X11Mouse::update(InputModule *input) { + ::Display* disp = Xlib::getDisplay(); ::Window root, child; int rx, ry, x = 0, y = 0; updateFocusedWindow(); // Query position and button state. - XQueryPointer(m_disp, - m_win ? m_win : ::XDefaultRootWindow(m_disp), + XQueryPointer(disp, + m_win ? m_win : ::XDefaultRootWindow(disp), &root, &child, &rx, &ry, &x, &y, &m_btn_state); diff --git a/source/Platform/Unix/X11Mouse.h b/source/Platform/Unix/X11Mouse.h index 26717c2..9cb0872 100644 --- a/source/Platform/Unix/X11Mouse.h +++ b/source/Platform/Unix/X11Mouse.h @@ -11,7 +11,6 @@ class X11Mouse : public Mouse { public : X11Mouse(); - ~X11Mouse(); virtual void init(); @@ -32,7 +31,6 @@ protected : void updateFocusedWindow(); protected : - ::Display* m_disp; ::Window m_win; // Focused window. Vector2f m_position; diff --git a/source/Platform/Unix/X11SharedDisplay.cpp b/source/Platform/Unix/X11SharedDisplay.cpp deleted file mode 100644 index 51f0d10..0000000 --- a/source/Platform/Unix/X11SharedDisplay.cpp +++ /dev/null @@ -1,40 +0,0 @@ - -#include -#include "X11SharedDisplay.h" - -namespace sp { - -// Define a global display (for simplicity, we always connect to local one.) -::Display* sharedDisplay = NULL; -unsigned int refcount = 0; - -::Display* XGetDisplay() { - - // Create if we dont have any references. - if (refcount == 0) { - sharedDisplay = XOpenDisplay(NULL); - } - - refcount++; - return sharedDisplay; -} - -void XReleaseDisplay(::Display* disp) { - - assert(disp == sharedDisplay); - - if (refcount < 1) { - return; - } - - if (--refcount == 0) { - XCloseDisplay(sharedDisplay); - } -} - -Atom getAtom(const std::string& name, bool onlyIfExists) { - - return XInternAtom(sharedDisplay, name.c_str(), onlyIfExists); -} - -} // namespace sp diff --git a/source/Platform/Unix/X11SharedDisplay.h b/source/Platform/Unix/X11SharedDisplay.h deleted file mode 100644 index b662afc..0000000 --- a/source/Platform/Unix/X11SharedDisplay.h +++ /dev/null @@ -1,18 +0,0 @@ - -#ifndef SPECTRE_PLATFORM_UNIX_X11SHAREDDISPLAY_H -#define SPECTRE_PLATFORM_UNIX_X11SHAREDDISPLAY_H - -#include -#include - -namespace sp { - -::Display* XGetDisplay(); - -void XReleaseDisplay(::Display* disp); - -Atom getAtom(const std::string& name, bool onlyIfExists = false); - -} // namespace sp - -#endif /* SPECTRE_PLATFORM_UNIX_X11SHAREDDISPLAY_H */ diff --git a/source/Platform/Unix/X11WindowEventHandler.cpp b/source/Platform/Unix/X11WindowEventHandler.cpp index a4ec542..fa6eb45 100644 --- a/source/Platform/Unix/X11WindowEventHandler.cpp +++ b/source/Platform/Unix/X11WindowEventHandler.cpp @@ -1,7 +1,6 @@ #include #include "X11Display.h" -#include "X11SharedDisplay.h" #include "X11WindowEventHandler.h" #include diff --git a/source/Platform/Unix/Xlib.cpp b/source/Platform/Unix/Xlib.cpp new file mode 100644 index 0000000..32e36fb --- /dev/null +++ b/source/Platform/Unix/Xlib.cpp @@ -0,0 +1,34 @@ + +#include +#include "Xlib.h" + +namespace sp { namespace Xlib { + +namespace _priv { + // Define a global display (for simplicity, we always connect to local one.) + ::Display* display = NULL; +}; + +void init() +{ + _priv::display = XOpenDisplay(NULL); +} + +void shutdown() +{ + XCloseDisplay(_priv::display); + _priv::display = NULL; +} + +::Display* getDisplay() +{ + assert(_priv::display != NULL); + return _priv::display; +} + +::Atom getAtom(const std::string& name, bool onlyIfExists) +{ + return XInternAtom(getDisplay(), name.c_str(), onlyIfExists); +} + +} } // namespace sp::Xlib diff --git a/source/Platform/Unix/Xlib.h b/source/Platform/Unix/Xlib.h new file mode 100644 index 0000000..cc5cb2d --- /dev/null +++ b/source/Platform/Unix/Xlib.h @@ -0,0 +1,22 @@ + +#ifndef SPECTRE_PLATFORM_UNIX_XLIB_H +#define SPECTRE_PLATFORM_UNIX_XLIB_H + +#include +#include + +// Wrapper for some Xlib functions. + +namespace sp { namespace Xlib { + +void init(); + +void shutdown(); + +::Display* getDisplay(); + +::Atom getAtom(const std::string& name, bool onlyIfExists = false); + +} } // namespace sp::xlib + +#endif /* SPECTRE_PLATFORM_UNIX_XLIB_H */ From 0540f5d2018a5db7c35efb8590436a1adee9ca0d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 26 Dec 2020 15:53:52 +0100 Subject: [PATCH 187/361] engine.build.lua: add platform defines. --- engine.build.lua | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/engine.build.lua b/engine.build.lua index c050a73..ffce57e 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -17,6 +17,13 @@ if global_settings.debug then settings.cc.flags:Add("-DSPECTRE_DEBUG") end +-- Platform +if TARGET_OS == "Win32" then + settings.cc.defines:Add("SPECTRE_PLATFORM_WIN=1") +elseif TARGET_OS == "Unix" then + settings.cc.defines:Add("SPECTRE_PLATFORM_UNIX=1") +end + -- FreeType2 if TARGET_OS == "Win32" then settings.cc.includes:Add("vendor/FreeType2/include") From b91b9f37684954ecb5e22347f994c4650ccc3e27 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 26 Dec 2020 17:20:05 +0100 Subject: [PATCH 188/361] Platform/PlatformApplication: adding create() method. --- engine.build.lua | 1 + source/Platform/PlatformApplication.cpp | 21 +++++++++++++++++++++ source/Platform/PlatformApplication.h | 2 ++ 3 files changed, 24 insertions(+) create mode 100644 source/Platform/PlatformApplication.cpp diff --git a/engine.build.lua b/engine.build.lua index ffce57e..82f6200 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -52,6 +52,7 @@ local system_module = Module("source/System", { }) local platform_common_module = Module("source/Platform", { + "PlatformApplication.cpp", "PlatformDisplay.cpp" }) diff --git a/source/Platform/PlatformApplication.cpp b/source/Platform/PlatformApplication.cpp new file mode 100644 index 0000000..02076a0 --- /dev/null +++ b/source/Platform/PlatformApplication.cpp @@ -0,0 +1,21 @@ + +#include "PlatformApplication.h" + +#ifdef _WIN32 +#include +typedef sp::Win32Application ApplicationType; +#elif defined(__linux__) || defined(unix) || defined(__unix) || defined(__unix__) +#include +typedef sp::UnixApplication ApplicationType; +#else +#error "No Application implementation exists" +#endif + +namespace sp { + +PlatformApplication* PlatformApplication::create() +{ + return new ApplicationType; +} + +} // namespace sp diff --git a/source/Platform/PlatformApplication.h b/source/Platform/PlatformApplication.h index 800bf31..d094ca3 100644 --- a/source/Platform/PlatformApplication.h +++ b/source/Platform/PlatformApplication.h @@ -11,6 +11,8 @@ class MessageQueue; class PlatformApplication { public : + static PlatformApplication* create(); + virtual void init() = 0; virtual void shutdown() = 0; From 2eec1c9f755cac2ca180383632e76c663b01d801 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 26 Dec 2020 17:20:30 +0100 Subject: [PATCH 189/361] source/Game.cpp: use PlatformApplication::create() --- source/Game.cpp | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/source/Game.cpp b/source/Game.cpp index e8ff9c2..573b5af 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -4,27 +4,18 @@ #include #include #include +#include #include +#include #include -// TODO: move this to Application::create() -#ifdef _WIN32 -#include -typedef sp::Win32Application ApplicationType; -#elif defined(__linux__) || defined(unix) || defined(__unix) || defined(__unix__) -#include -typedef sp::UnixApplication ApplicationType; -#else -#error "No Application implementation exists" -#endif - namespace sp { Game::Game() : m_running(false) { - m_platform = new ApplicationType(); + m_platform = PlatformApplication::create(); m_graphics = new Graphics(m_platform); m_input = new InputModule(&m_platform->getInput()); m_messageHandler = new MessageHandler(); From 81c7e34c581749558164bfad370d35d0442592b9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 26 Dec 2020 17:25:25 +0100 Subject: [PATCH 190/361] Use SPECTRE_PLATFORM_* defines instead of raw compiler ones. --- source/Display/GLContext.cpp | 4 ++-- source/Platform/PlatformApplication.cpp | 4 ++-- source/Platform/PlatformDisplay.cpp | 4 ++-- source/System/MessageQueue.cpp | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/source/Display/GLContext.cpp b/source/Display/GLContext.cpp index 912c9ff..2c812dc 100644 --- a/source/Display/GLContext.cpp +++ b/source/Display/GLContext.cpp @@ -1,10 +1,10 @@ #include -#ifdef _WIN32 +#ifdef SPECTRE_PLATFORM_WIN #include typedef sp::Win32GLContext ContextType; -#elif defined(__linux__) || defined(unix) || defined(__unix) || defined(__unix__) +#elif SPECTRE_PLATFORM_UNIX #include typedef sp::GLXContext ContextType; #else diff --git a/source/Platform/PlatformApplication.cpp b/source/Platform/PlatformApplication.cpp index 02076a0..9bd32b3 100644 --- a/source/Platform/PlatformApplication.cpp +++ b/source/Platform/PlatformApplication.cpp @@ -1,10 +1,10 @@ #include "PlatformApplication.h" -#ifdef _WIN32 +#ifdef SPECTRE_PLATFORM_WIN #include typedef sp::Win32Application ApplicationType; -#elif defined(__linux__) || defined(unix) || defined(__unix) || defined(__unix__) +#elif SPECTRE_PLATFORM_UNIX #include typedef sp::UnixApplication ApplicationType; #else diff --git a/source/Platform/PlatformDisplay.cpp b/source/Platform/PlatformDisplay.cpp index 3298b98..4cfb3c7 100644 --- a/source/Platform/PlatformDisplay.cpp +++ b/source/Platform/PlatformDisplay.cpp @@ -2,10 +2,10 @@ #include #include "PlatformDisplay.h" -#ifdef _WIN32 +#ifdef SPECTRE_PLATFORM_WIN #include typedef sp::Win32Display DisplayType; -#elif defined(__linux__) || defined(unix) || defined(__unix) || defined(__unix__) +#elif SPECTRE_PLATFORM_UNIX #include typedef sp::X11Display DisplayType; #else diff --git a/source/System/MessageQueue.cpp b/source/System/MessageQueue.cpp index 3550e36..57f4fa4 100644 --- a/source/System/MessageQueue.cpp +++ b/source/System/MessageQueue.cpp @@ -1,10 +1,10 @@ #include -#ifdef _WIN32 +#ifdef SPECTRE_PLATFORM_WIN #include typedef sp::Win32EventQueue ImplType; -#elif defined(__linux__) || defined(unix) || defined(__unix) || defined(__unix__) +#elif SPECTRE_PLATFORM_UNIX #include typedef sp::X11EventQueue ImplType; #else From 7e79663dcebc49f5085ae9dafd48b76086a28b10 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 26 Dec 2020 17:30:32 +0100 Subject: [PATCH 191/361] include/Spectre/Input/Mouse.h rename Button1,Button2 to XButton1 and XButton2 Button1 and Button2 are defined by Xlib. So lets change our ones to avoid headache. --- include/Spectre/Input/Mouse.h | 4 ++-- source/Input/Mouse.cpp | 4 ++-- source/Platform/Win32/Win32Mouse.cpp | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/Spectre/Input/Mouse.h b/include/Spectre/Input/Mouse.h index 9140b7a..949638e 100644 --- a/include/Spectre/Input/Mouse.h +++ b/include/Spectre/Input/Mouse.h @@ -16,8 +16,8 @@ public : Left, Right, Middle, - Button1, - Button2, + XButton1, + XButton2, NUM_MBUTTONS }; diff --git a/source/Input/Mouse.cpp b/source/Input/Mouse.cpp index 3b58f0e..e939583 100644 --- a/source/Input/Mouse.cpp +++ b/source/Input/Mouse.cpp @@ -10,8 +10,8 @@ Mouse::~Mouse() std::string Mouse::getButtonName(Button button) { switch(button) { - case Button::Button1 : return "Button1"; - case Button::Button2 : return "Button2"; + case Button::XButton1 : return "XButton1"; + case Button::XButton2 : return "XButton2"; case Button::Left : return "Left"; case Button::Right : return "Right"; case Button::Middle : return "Middle"; diff --git a/source/Platform/Win32/Win32Mouse.cpp b/source/Platform/Win32/Win32Mouse.cpp index 3ad6a41..61a49da 100644 --- a/source/Platform/Win32/Win32Mouse.cpp +++ b/source/Platform/Win32/Win32Mouse.cpp @@ -46,8 +46,8 @@ bool Win32Mouse::isButtonDown(Mouse::Button button) const case Mouse::Left : btn = GetSystemMetrics(SM_SWAPBUTTON) ? VK_RBUTTON : VK_LBUTTON; break; case Mouse::Right : btn = GetSystemMetrics(SM_SWAPBUTTON) ? VK_LBUTTON : VK_RBUTTON; break; case Mouse::Middle : btn = VK_MBUTTON; break; - case Mouse::Button1 : btn = VK_XBUTTON1; break; - case Mouse::Button2 : btn = VK_XBUTTON2; break; + case Mouse::XButton1 : btn = VK_XBUTTON1; break; + case Mouse::XButton2 : btn = VK_XBUTTON2; break; default: btn = 0; } @@ -109,7 +109,7 @@ bool Win32Mouse::handleMessage(MSG msg, Event& event) case WM_XBUTTONUP : case WM_XBUTTONDOWN : event.mouseButton.button = GET_XBUTTON_WPARAM(msg.wParam) == XBUTTON1 - ? Mouse::Button::Button1 : Mouse::Button::Button2; + ? Mouse::Button::XButton1 : Mouse::Button::XButton2; event.mouseButton.pressed = msg.message == WM_XBUTTONDOWN; return true; From c0827008915805915d7a4d2cd13017eca818906e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 26 Dec 2020 17:30:32 +0100 Subject: [PATCH 192/361] include/Spectre/Input/Mouse.h rename Button1,Button2 to XButton1 and XButton2 Button1 and Button2 are defined by Xlib. So lets change our ones to avoid headache. --- include/Spectre/Input/Mouse.h | 4 ++-- source/Input/Mouse.cpp | 4 ++-- source/Platform/Win32/Win32Mouse.cpp | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/include/Spectre/Input/Mouse.h b/include/Spectre/Input/Mouse.h index 9140b7a..949638e 100644 --- a/include/Spectre/Input/Mouse.h +++ b/include/Spectre/Input/Mouse.h @@ -16,8 +16,8 @@ public : Left, Right, Middle, - Button1, - Button2, + XButton1, + XButton2, NUM_MBUTTONS }; diff --git a/source/Input/Mouse.cpp b/source/Input/Mouse.cpp index 3b58f0e..e939583 100644 --- a/source/Input/Mouse.cpp +++ b/source/Input/Mouse.cpp @@ -10,8 +10,8 @@ Mouse::~Mouse() std::string Mouse::getButtonName(Button button) { switch(button) { - case Button::Button1 : return "Button1"; - case Button::Button2 : return "Button2"; + case Button::XButton1 : return "XButton1"; + case Button::XButton2 : return "XButton2"; case Button::Left : return "Left"; case Button::Right : return "Right"; case Button::Middle : return "Middle"; diff --git a/source/Platform/Win32/Win32Mouse.cpp b/source/Platform/Win32/Win32Mouse.cpp index 3ad6a41..61a49da 100644 --- a/source/Platform/Win32/Win32Mouse.cpp +++ b/source/Platform/Win32/Win32Mouse.cpp @@ -46,8 +46,8 @@ bool Win32Mouse::isButtonDown(Mouse::Button button) const case Mouse::Left : btn = GetSystemMetrics(SM_SWAPBUTTON) ? VK_RBUTTON : VK_LBUTTON; break; case Mouse::Right : btn = GetSystemMetrics(SM_SWAPBUTTON) ? VK_LBUTTON : VK_RBUTTON; break; case Mouse::Middle : btn = VK_MBUTTON; break; - case Mouse::Button1 : btn = VK_XBUTTON1; break; - case Mouse::Button2 : btn = VK_XBUTTON2; break; + case Mouse::XButton1 : btn = VK_XBUTTON1; break; + case Mouse::XButton2 : btn = VK_XBUTTON2; break; default: btn = 0; } @@ -109,7 +109,7 @@ bool Win32Mouse::handleMessage(MSG msg, Event& event) case WM_XBUTTONUP : case WM_XBUTTONDOWN : event.mouseButton.button = GET_XBUTTON_WPARAM(msg.wParam) == XBUTTON1 - ? Mouse::Button::Button1 : Mouse::Button::Button2; + ? Mouse::Button::XButton1 : Mouse::Button::XButton2; event.mouseButton.pressed = msg.message == WM_XBUTTONDOWN; return true; From f6aa0246d30c69db4f20f4ed3212a8af942330fc Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 27 Dec 2020 18:12:09 +0100 Subject: [PATCH 193/361] source/Platform/Unix/X11Mouse.cpp: implement hack for XButton1 and 2. --- source/Platform/Unix/X11Mouse.cpp | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/source/Platform/Unix/X11Mouse.cpp b/source/Platform/Unix/X11Mouse.cpp index cabbedc..f4bd651 100644 --- a/source/Platform/Unix/X11Mouse.cpp +++ b/source/Platform/Unix/X11Mouse.cpp @@ -5,8 +5,17 @@ #include "X11Display.h" #include "X11Mouse.h" +#define XBUTTON1BIT (1<<0) +#define XBUTTON2BIT (1<<1) + namespace sp { +namespace _priv { + + // Variable to handle extra button state (not queryable in xlib) + unsigned int xstate = 0; +} + X11Mouse::X11Mouse() : m_btn_state(0) { @@ -35,8 +44,6 @@ bool X11Mouse::isButtonDown(Mouse::Button button) const return false; } - // TODO: Button1 and 2 is defined in x11 and - // therefore clashes with Mouse::Button::Button1 and 2. switch(button) { case Mouse::Button::Left : return m_btn_state & Button1Mask; @@ -44,6 +51,10 @@ bool X11Mouse::isButtonDown(Mouse::Button button) const return m_btn_state & Button3Mask; case Mouse::Button::Middle : return m_btn_state & Button2Mask; + case Mouse::Button::XButton1 : + return _priv::xstate & XBUTTON1BIT; + case Mouse::Button::XButton2 : + return _priv::xstate & XBUTTON2BIT; default : return false; } @@ -82,6 +93,11 @@ void X11Mouse::updateFocusedWindow() m_win = focus ? (::Window) focus->getHandle() : 0; } +#define SETXSTATE(bit) \ + _priv::xstate = (xevent->type == ButtonPress) \ + ? _priv::xstate | (bit) \ + : _priv::xstate & ~(bit) + bool X11Mouse::handleMessage(XEvent* xevent, Event& event) { if (xevent->type == MotionNotify) { @@ -99,9 +115,10 @@ bool X11Mouse::handleMessage(XEvent* xevent, Event& event) case Button1 : trans = Mouse::Button::Left; break; case Button2 : trans = Mouse::Button::Middle; break; case Button3 : trans = Mouse::Button::Right; break; - // TODO: name clash, need to rename Mouse::Button enums. - // case Button4 : trans = Mouse::Button::Button1; break; // clashes with X11's "Button1" define. - // case Button5 : trans = Mouse::Button::Button2; break; // clashes with X11's "Button2" define. + // Xlib do not support querying of button 8 and 9. + // so we have to fake it. + case 8 : trans = Mouse::Button::XButton1; SETXSTATE(XBUTTON1BIT); break; + case 9 : trans = Mouse::Button::XButton2; SETXSTATE(XBUTTON2BIT); break; } if (trans != Mouse::Button::Unknown) { From 845b93fb4844e7d69ebde312de6013c7dc138cc9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 28 Dec 2020 18:38:27 +0100 Subject: [PATCH 194/361] source/Platform/Win32/Win32Display.cpp: DisplayDecorate::None has changed to DisplayDecorate::Empty --- source/Platform/Win32/Win32Display.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index de68f77..89bedd0 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -246,7 +246,7 @@ DWORD Win32Display::getWin32Flags(unsigned int flags) { DWORD win32_flags = WS_VISIBLE; - if (flags == DisplayDecorate::None) { + if (flags == DisplayDecorate::Empty) { win32_flags |= WS_POPUP; } else { if (flags & DisplayDecorate::Menu) { From d48cc650a8afbf2842c3390a466afcd7dd4be3d2 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 28 Dec 2020 18:39:16 +0100 Subject: [PATCH 195/361] source/Platform/PlatformApplication.cpp: ApplicationType is defined by some Win32 headers. --- source/Platform/PlatformApplication.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/Platform/PlatformApplication.cpp b/source/Platform/PlatformApplication.cpp index 9bd32b3..f50e54b 100644 --- a/source/Platform/PlatformApplication.cpp +++ b/source/Platform/PlatformApplication.cpp @@ -3,10 +3,10 @@ #ifdef SPECTRE_PLATFORM_WIN #include -typedef sp::Win32Application ApplicationType; +typedef sp::Win32Application ApplicationImpl; #elif SPECTRE_PLATFORM_UNIX #include -typedef sp::UnixApplication ApplicationType; +typedef sp::UnixApplication ApplicationImpl; #else #error "No Application implementation exists" #endif @@ -15,7 +15,7 @@ namespace sp { PlatformApplication* PlatformApplication::create() { - return new ApplicationType; + return new ApplicationImpl; } } // namespace sp From a172fbb323e8af2e1636da5bb2d4c541e297d597 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 28 Dec 2020 18:41:16 +0100 Subject: [PATCH 196/361] engine.build.lua: Fix local variable inside if statement. --- engine.build.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine.build.lua b/engine.build.lua index 82f6200..ef73c5d 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -57,7 +57,7 @@ local platform_common_module = Module("source/Platform", { }) if TARGET_OS == "Win32" then - local platform_spec_module = Module("source/Platform/Win32", { + platform_spec_module = Module("source/Platform/Win32", { "Win32Application.cpp", "Win32Display.cpp", "Win32GLContext.cpp", From 36e4894dc783942cc58069aa1b8663b5edafe465 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 28 Dec 2020 18:47:28 +0100 Subject: [PATCH 197/361] bam.lua: allow paths.build variable to be set from CLI --- bam.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bam.lua b/bam.lua index 8dbb3c0..82ebed9 100644 --- a/bam.lua +++ b/bam.lua @@ -22,7 +22,7 @@ end -- paths used when building. paths = { - build = "build", + build = ScriptArgs.build_dir or "build", object = "obj", examples = "examples" } From bb28f5658f722e219a05ef45349546c257501ea9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 28 Dec 2020 18:58:40 +0100 Subject: [PATCH 198/361] Adding .bam/utils.lua --- .bam/utils.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .bam/utils.lua diff --git a/.bam/utils.lua b/.bam/utils.lua new file mode 100644 index 0000000..ff4957f --- /dev/null +++ b/.bam/utils.lua @@ -0,0 +1,10 @@ + +-- Returns True if 'table' contains the value 'val'. False otherwise. +function contains(table, val) + for i=1, #table do + if table[i] == val then + return true + end + end + return false +end From 707cd7732c1e0092b014ce6ca8349b2df0ffd586 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 28 Dec 2020 19:03:16 +0100 Subject: [PATCH 199/361] .bam/functions.lua: adding valid_system() --- .bam/functions.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.bam/functions.lua b/.bam/functions.lua index 5a796da..8c0020f 100644 --- a/.bam/functions.lua +++ b/.bam/functions.lua @@ -1,4 +1,6 @@ +Import(".bam/utils.lua") + local _systems = { "Win32", "Unix" @@ -11,6 +13,12 @@ function supported_systems() end +-- Return True if 'value' is a supported system. False otherwise. +function valid_system(value) + return contains(_systems, value) +end + + -- Detect what system we currently are on. function system() From d9697e2eaed73c04e6e3b8c0854fb39675ced9fd Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 28 Dec 2020 19:10:10 +0100 Subject: [PATCH 200/361] bam.lua: allow TARGET_OS to be set from CLI, fallback on host. --- bam.lua | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/bam.lua b/bam.lua index 82ebed9..8807518 100644 --- a/bam.lua +++ b/bam.lua @@ -3,6 +3,7 @@ -- Spectre build config -- -- -- -------------------------------- +Import(".bam/utils.lua") Import(".bam/functions.lua") CheckVersion("0.5") @@ -12,9 +13,10 @@ CheckVersion("0.5") -- -- -------------------------------- --- OS Detection -TARGET_OS = system() -if TARGET_OS == nil then +-- Target specified on command line or get host system. +TARGET_OS = ScriptArgs.target or system() + +if not valid_system(TARGET_OS) then print ("System not supported" ) print ("Supported systems are: " .. supported_systems() ) return 1 From 543542625d37c1d6db415f905894c93078fffcd4 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 28 Dec 2020 19:11:13 +0100 Subject: [PATCH 201/361] .bam/functions.lua: rename system() to host_system() --- .bam/functions.lua | 5 +++-- bam.lua | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.bam/functions.lua b/.bam/functions.lua index 8c0020f..2012809 100644 --- a/.bam/functions.lua +++ b/.bam/functions.lua @@ -19,8 +19,9 @@ function valid_system(value) end --- Detect what system we currently are on. -function system() +-- Find what host system we are on. +-- Returns nil if system could not be determined. +function host_system() if family ~= nil then if family == "windows" then diff --git a/bam.lua b/bam.lua index 8807518..d4b62ae 100644 --- a/bam.lua +++ b/bam.lua @@ -14,7 +14,7 @@ CheckVersion("0.5") -------------------------------- -- Target specified on command line or get host system. -TARGET_OS = ScriptArgs.target or system() +TARGET_OS = ScriptArgs.target or host_system() if not valid_system(TARGET_OS) then print ("System not supported" ) From cbd26a211d2777457e28a89f75ab604eff62af68 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 28 Dec 2020 19:27:39 +0100 Subject: [PATCH 202/361] .bam/functions.lua: in host_system() switch from 'family' to 'platform' variable. family == "unix" contains FreeBSD and MacOS. that we dont have support for. --- .bam/functions.lua | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/.bam/functions.lua b/.bam/functions.lua index 2012809..2a501b7 100644 --- a/.bam/functions.lua +++ b/.bam/functions.lua @@ -23,13 +23,12 @@ end -- Returns nil if system could not be determined. function host_system() - if family ~= nil then - if family == "windows" then - return _systems[1] - end - if family == "unix" then - return _systems[2] - end + -- Check "platform" variable set by bam first. + if platform == "win32" or platform == "win64" then + return _systems[1] + end + if platform == "linux" then + return _systems[2] end local win = os.getenv('OS') From 0a75f0c2ed644d9d87164a8c7526d2a4ca35a270 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 28 Dec 2020 19:28:27 +0100 Subject: [PATCH 203/361] .bam/functions.lua: adding documentation to host_system() --- .bam/functions.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.bam/functions.lua b/.bam/functions.lua index 2a501b7..f04bfa3 100644 --- a/.bam/functions.lua +++ b/.bam/functions.lua @@ -31,10 +31,13 @@ function host_system() return _systems[2] end + -- next, check if we are on windows by checking + -- the 'OS' environment variable local win = os.getenv('OS') if win ~= nil and win:lower():match('windows') then return _systems[1] end + return nil end From b984f3096838fadd4c23177ddd6ba333562d85c8 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 29 Dec 2020 17:45:32 +0100 Subject: [PATCH 204/361] Platform/Win32/Win32Display.cpp: for WM_SIZE event we can use lParam variable to get the size. --- source/Platform/Win32/Win32Display.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index 89bedd0..90271a0 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -303,7 +303,8 @@ void Win32Display::processMessage(UINT message, WPARAM wParam, LPARAM lParam) case WM_SIZE : if (!m_inResizeModalLoop && (wParam == SIZE_MAXIMIZED || wParam == SIZE_RESTORED)) { - processResizeMessage(getSize()); + Vector2u size(LOWORD(lParam), HIWORD(lParam)); + processResizeMessage(size); } break; case WM_GETMINMAXINFO : From 46af40bbb768e1d5c30ccbd6076d94477f321bf8 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 29 Dec 2020 19:54:49 +0100 Subject: [PATCH 205/361] source/Platform/PlatformApplication.h: extend NonCopyable --- source/Platform/PlatformApplication.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/Platform/PlatformApplication.h b/source/Platform/PlatformApplication.h index d094ca3..d59046d 100644 --- a/source/Platform/PlatformApplication.h +++ b/source/Platform/PlatformApplication.h @@ -2,13 +2,15 @@ #ifndef SPECTRE_PLATFORM_H #define SPECTRE_PLATFORM_H +#include + namespace sp { class PlatformInput; class PlatformDisplay; class MessageQueue; -class PlatformApplication +class PlatformApplication : NonCopyable { public : static PlatformApplication* create(); From e97844a6e6f6669fa141d5d5af67f4524856f248 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 29 Dec 2020 20:07:12 +0100 Subject: [PATCH 206/361] Spectre/Core/NonCopyable.h: Updated make use of C++11 default and delete keywords. --- include/Spectre/Core/NonCopyable.h | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/include/Spectre/Core/NonCopyable.h b/include/Spectre/Core/NonCopyable.h index 95c5db4..3eb8210 100644 --- a/include/Spectre/Core/NonCopyable.h +++ b/include/Spectre/Core/NonCopyable.h @@ -8,13 +8,12 @@ class NonCopyable { protected : - NonCopyable() {} + NonCopyable() = default; + ~NonCopyable() = default; -private : - - // Skip implementation to trigger compiler error. - NonCopyable(const NonCopyable&); - NonCopyable& operator =(const NonCopyable&); + // Delete Copy constructor and assignment. + NonCopyable(const NonCopyable&) = delete; + NonCopyable& operator =(const NonCopyable&) = delete; }; } // namespace sp From 8d57b3a72cc826c587de9571e721da7b82b01562 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 13:59:40 +0200 Subject: [PATCH 207/361] source/Platform/Win32/Win32Display.cpp: Use SetWindowLongPtr/GetWindowLongPtr as LONG_PTR supports 64bit addresses. --- source/Platform/Win32/Win32Display.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index 90271a0..67993fa 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -333,11 +333,11 @@ LRESULT CALLBACK Win32Display::staticWndProc(HWND handle, UINT message, WPARAM w if (message == WM_NCCREATE) { LONG_PTR ptr = (LONG_PTR) ((LPCREATESTRUCT)lParam)->lpCreateParams; - ::SetWindowLong(handle, GWL_USERDATA, ptr); + ::SetWindowLongPtr(handle, GWL_USERDATA, ptr); display = (Win32Display*) ptr; } else { - display = (Win32Display*) ::GetWindowLong(handle, GWL_USERDATA); + display = (Win32Display*) ::GetWindowLongPtr(handle, GWL_USERDATA); } if (display) { From 9621ea19bb833c576d235c376a9d7f18042ecf5b Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 14:00:43 +0200 Subject: [PATCH 208/361] source/Platform/Win32/Win32Display.cpp: on x64, windows headers undefine GWL_USERDATA, So we define it again. --- source/Platform/Win32/Win32Display.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index 67993fa..887688c 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -12,6 +12,11 @@ namespace sp { #define WND_CLASSNAME "SPECTRE_WIN32_WNDCLASS" +#if defined(_WIN64) && !defined(GWL_USERDATA) +// x64 undefines this. So we define it again. +#define GWL_USERDATA GWLP_USERDATA +#endif /* defined(_WIN64) && !defined(GWL_USERDATA) */ + static bool firstTime = true; Win32Display::Win32Display() : From 03cbba9a6c152b465ce0d8664715168c463f7f74 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 14:10:11 +0200 Subject: [PATCH 209/361] include/Spectre/Core/NonCopyable.h: Destructor needs to be virtual. Otherwise deleting a NonCopyable pointer wont call the child class destructor --- include/Spectre/Core/NonCopyable.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Spectre/Core/NonCopyable.h b/include/Spectre/Core/NonCopyable.h index 3eb8210..5efd853 100644 --- a/include/Spectre/Core/NonCopyable.h +++ b/include/Spectre/Core/NonCopyable.h @@ -9,7 +9,7 @@ class NonCopyable protected : NonCopyable() = default; - ~NonCopyable() = default; + virtual ~NonCopyable() = default; // Delete Copy constructor and assignment. NonCopyable(const NonCopyable&) = delete; From 1902b9221014ac194770af9119a68516a474305d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 15:20:08 +0200 Subject: [PATCH 210/361] bam.lua: Add "intermediate" directory to paths and use it when building object files. --- bam.lua | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/bam.lua b/bam.lua index d4b62ae..8838de9 100644 --- a/bam.lua +++ b/bam.lua @@ -24,9 +24,15 @@ end -- paths used when building. paths = { - build = ScriptArgs.build_dir or "build", - object = "obj", - examples = "examples" + -- Root build directory. + build = ScriptArgs.build_dir or "build", + + -- Directory where internal object/libs files are + -- stored to produce the final library. + intermediate = PathJoin("spectre", TARGET_OS), + + object = "obj", + examples = "examples" } -------------------------------- @@ -59,7 +65,8 @@ global_settings.link.Output = function(settings, input) end global_settings.cc.Output = function(settings, input) - return Path(PathJoin(PathJoin(paths.build, paths.object), PathBase(input))) + local path = PathJoin(paths.build, paths.intermediate) + return Path(PathJoin(PathJoin(path, paths.object), PathBase(input))) end -- Compiler configuration From 6a84af227cdaeb9a7f7977845af62da92545046d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 19:53:13 +0200 Subject: [PATCH 211/361] bam.lua: append "_" to examples output directory. --- bam.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bam.lua b/bam.lua index 8838de9..33ad3bd 100644 --- a/bam.lua +++ b/bam.lua @@ -32,7 +32,7 @@ paths = { intermediate = PathJoin("spectre", TARGET_OS), object = "obj", - examples = "examples" + examples = "examples_" .. TARGET_OS } -------------------------------- From 54805c07f42658a6bc9a13dbca21fa5cae0691ba Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 19:57:40 +0200 Subject: [PATCH 212/361] .bam/functions.lua: use paths.examples in BuildExample() to get the correct path. --- .bam/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bam/functions.lua b/.bam/functions.lua index f04bfa3..6240a18 100644 --- a/.bam/functions.lua +++ b/.bam/functions.lua @@ -83,7 +83,7 @@ function BuildExample(settings, name, dependencies) Import("examples/" .. name .. "/bam.lua") - exe = Link(settings, "examples/" .. name, Compile(settings, src)) + exe = Link(settings, PathJoin(paths.examples, name), Compile(settings, src)) if dependencies ~= nil and #dependencies > 0 then AddDependency(exe, dependencies) From e9ebb3809031fce61cd571acb012d95de9271b3d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 19:59:38 +0200 Subject: [PATCH 213/361] vendor/FreeType2/src/base/module.lua: basepath to Module() should be relative to the script's directory. --- vendor/FreeType2/src/base/module.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/vendor/FreeType2/src/base/module.lua b/vendor/FreeType2/src/base/module.lua index 2197a30..e6309d5 100644 --- a/vendor/FreeType2/src/base/module.lua +++ b/vendor/FreeType2/src/base/module.lua @@ -1,7 +1,5 @@ -local basepath = PathDir(ModuleFilename()) - -src = Module(basepath, { +src = Module(".", { "ftbase.c", "ftinit.c", "ftsystem.c", From 01b626d44ee31dabdc854de5655a18685178377a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 20:02:34 +0200 Subject: [PATCH 214/361] Adding .bam/path.lua --- .bam/path.lua | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .bam/path.lua diff --git a/.bam/path.lua b/.bam/path.lua new file mode 100644 index 0000000..b798e61 --- /dev/null +++ b/.bam/path.lua @@ -0,0 +1,11 @@ + +-- Like ModuleFilename but only return the directory path +function ModuleDir() + return PathDir(ModuleFilename()) +end + +-- Make the path relative to the current working directory +-- and ModuleDir() +function RelPath(path) + return PathJoin(ModuleDir(), path) +end From 788e3f697e7c62aec4fe4539e54639d7b196734b Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 20:05:55 +0200 Subject: [PATCH 215/361] bam.lua: Adding descriptive comment to global_settings.lib.prefix --- bam.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bam.lua b/bam.lua index 33ad3bd..dc868cd 100644 --- a/bam.lua +++ b/bam.lua @@ -58,6 +58,8 @@ end -- Output configuration -------------------------------- + +-- Output path for static libraries. global_settings.lib.prefix = Path(paths.build) .. "/" global_settings.link.Output = function(settings, input) From de789ad77ed29a150677821a39e6cdffd813e972 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 21:14:21 +0200 Subject: [PATCH 216/361] .bam/functions.lua: Imports() should be relative to the current script. --- .bam/functions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.bam/functions.lua b/.bam/functions.lua index 6240a18..38ff1d6 100644 --- a/.bam/functions.lua +++ b/.bam/functions.lua @@ -1,5 +1,5 @@ -Import(".bam/utils.lua") +Import("utils.lua") local _systems = { "Win32", From 315f2e9c41f2ee43f3566dced6c140fdc31f5e2a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 21:31:48 +0200 Subject: [PATCH 217/361] examples/build.lua: skip using BuildExamples(). just run the code directly here as we wont need it anywhere else. --- examples/build.lua | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/examples/build.lua b/examples/build.lua index 381f5e3..0b5b1ad 100644 --- a/examples/build.lua +++ b/examples/build.lua @@ -26,11 +26,12 @@ end -- we copy the whole assets directory. assets = CopyDir(PathJoin(paths.build, paths.examples), "assets") -examples = BuildExamples(example_settings, { - "text", - "events", - "input", - "display" -}, assets) +examples = {} +for k, name in pairs(CollectDirs("examples/*")) do + Import(PathJoin(name, "bam.lua")) + exe = Link(example_settings, PathJoin(paths.examples, name), Compile(example_settings, src)) + AddDependency(exe, assets) + table.insert(examples, exe) +end PseudoTarget("examples", examples) From b913c2024d1c7c06c72f701d9d254d0fd2399c3a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 21:35:39 +0200 Subject: [PATCH 218/361] .bam/functions.lua: delete BuildExample() and BuildExamples() --- .bam/functions.lua | 27 --------------------------- 1 file changed, 27 deletions(-) diff --git a/.bam/functions.lua b/.bam/functions.lua index 38ff1d6..40ffc04 100644 --- a/.bam/functions.lua +++ b/.bam/functions.lua @@ -75,30 +75,3 @@ function CopyDir(dst, src) end return r end - --- Build example binary. --- This function Imports "examples//bam.lua" --- that file must define a table "src" that contains the source files. -function BuildExample(settings, name, dependencies) - - Import("examples/" .. name .. "/bam.lua") - - exe = Link(settings, PathJoin(paths.examples, name), Compile(settings, src)) - - if dependencies ~= nil and #dependencies > 0 then - AddDependency(exe, dependencies) - end - - return exe -end - --- Build examples binaries. --- Just a wrapper for BuildExample. taking a table of names instead. -function BuildExamples(settings, names, dependencies) - - local r = {} - for i = 1, #names do - r[i] = BuildExample(settings, names[i], dependencies) - end - return r -end From 0ce1d25594f239673e67bbc9a628108ec6ea78e2 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 21:37:22 +0200 Subject: [PATCH 219/361] examples/build.lua: rename example_settings to just settings as it's a locale variable anyway. --- examples/build.lua | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/build.lua b/examples/build.lua index 0b5b1ad..24ce852 100644 --- a/examples/build.lua +++ b/examples/build.lua @@ -4,22 +4,22 @@ -- -- -------------------------------- -local example_settings = CopySettings(global_settings, "Example") +local settings = CopySettings(global_settings, "Example") -- Include spectre headers. -example_settings.cc.includes:Add("include/") +settings.cc.includes:Add("include/") -- Link with spectre. -example_settings.link.extrafiles:Add(libspectre) +settings.link.extrafiles:Add(libspectre) if TARGET_OS == "Win32" then -- Windows needs to link against these. - example_settings.link.libs:Add("opengl32", "gdi32", "user32") + settings.link.libs:Add("opengl32", "gdi32", "user32") elseif TARGET_OS == "Unix" then -- Unix nees dl and X11 libs. - example_settings.link.libs:Add("dl", 'X11', 'Xrandr', 'freetype') + settings.link.libs:Add("dl", 'X11', 'Xrandr', 'freetype') end -- For now, to get examples working @@ -29,7 +29,7 @@ assets = CopyDir(PathJoin(paths.build, paths.examples), "assets") examples = {} for k, name in pairs(CollectDirs("examples/*")) do Import(PathJoin(name, "bam.lua")) - exe = Link(example_settings, PathJoin(paths.examples, name), Compile(example_settings, src)) + exe = Link(settings, PathJoin(paths.examples, name), Compile(settings, src)) AddDependency(exe, assets) table.insert(examples, exe) end From d35ba0730eccd83f643506e0f956be41a325ffe0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 21:39:05 +0200 Subject: [PATCH 220/361] .bam/functions.lua: use RelPath() in module to get the correct paths. --- .bam/functions.lua | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.bam/functions.lua b/.bam/functions.lua index 40ffc04..e5203e0 100644 --- a/.bam/functions.lua +++ b/.bam/functions.lua @@ -1,4 +1,5 @@ +Import("path.lua") Import("utils.lua") local _systems = { @@ -54,9 +55,10 @@ end -- path: base path to source files. -- src: table of source files. function Module(path, src) + path = RelPath(path) local r = {} for k, v in pairs(src) do - r[k] = path .. "/" .. v + r[k] = PathJoin(path, v) end return r end From fd108cc391362a880e7ca468d93c020d86c82976 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 21:43:01 +0200 Subject: [PATCH 221/361] engine.build.lua: remove linkage with freetype2 as we build it ourself on windows. --- engine.build.lua | 3 --- 1 file changed, 3 deletions(-) diff --git a/engine.build.lua b/engine.build.lua index 1d2978d..9ea2b6d 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -27,9 +27,6 @@ end -- FreeType2 if TARGET_OS == "Win32" then settings.cc.includes:Add("vendor/FreeType2/include") - - -- Staticly link freetype on windows. - settings.link.libpath:Add("vendor/FreeType2/lib/x86") else settings.cc.includes:Add("/usr/include/freetype2") end From fc64fedb0eacc560f4e62d6dde8c9c8c4af03f01 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 21:43:50 +0200 Subject: [PATCH 222/361] engine.build.lua: use RelPath() "everywhere" --- engine.build.lua | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/engine.build.lua b/engine.build.lua index 9ea2b6d..9b29f92 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -7,11 +7,16 @@ -- Output variables: -- -- libspectre = path to .lib file -- ----------------------------------------------------------- +Import(".bam/path.lua") -local settings = CopySettings(global_settings, "Engine") +local settings = CopySettings(global_settings, "Spectre") -settings.cc.includes:Add("include/") -settings.cc.includes:Add("source/") +settings.cc.includes:Add( + RelPath("include/"), + RelPath("source/"), + -- STB + RelPath("vendor/stb/include") +) if global_settings.debug then settings.cc.flags:Add("-DSPECTRE_DEBUG") @@ -26,14 +31,11 @@ end -- FreeType2 if TARGET_OS == "Win32" then - settings.cc.includes:Add("vendor/FreeType2/include") + settings.cc.includes:Add(RelPath("vendor/FreeType2/include")) else settings.cc.includes:Add("/usr/include/freetype2") end --- STB -settings.cc.includes:Add("vendor/stb/include") - -- Source files ----------------------------------------------------------- From 7967eaea2a781b802a9ea1689eefaca227c42cdb Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 21:45:41 +0200 Subject: [PATCH 223/361] bam.lua: import .bam/path.lua --- bam.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/bam.lua b/bam.lua index dc868cd..8cf94db 100644 --- a/bam.lua +++ b/bam.lua @@ -3,6 +3,7 @@ -- Spectre build config -- -- -- -------------------------------- +Import(".bam/path.lua") Import(".bam/utils.lua") Import(".bam/functions.lua") CheckVersion("0.5") From 82cfe55a916ecf6280b936df0d77eca9593cce52 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 10 Sep 2022 21:47:00 +0200 Subject: [PATCH 224/361] vendor/FreeType2/build.lua: use RelPath() "everywhere" --- vendor/FreeType2/build.lua | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/vendor/FreeType2/build.lua b/vendor/FreeType2/build.lua index b526917..6d6d6e0 100644 --- a/vendor/FreeType2/build.lua +++ b/vendor/FreeType2/build.lua @@ -3,7 +3,6 @@ -- FreeType2 build config -- -- -- -------------------------------- -local basepath = PathDir(ModuleFilename()) -- Modules -------------------------------- @@ -27,7 +26,7 @@ settings = TableDeepCopy(global_settings) settings.labelprefix = "[FT2] " -- Compile flags -settings.cc.includes:Add(PathJoin(basepath, "include")) +settings.cc.includes:Add(RelPath("include")) settings.cc.flags:Add("-DFT2_BUILD_LIBRARY") -- Build target @@ -37,7 +36,7 @@ local obj = {} -- Compile each module to object files. for k,name in pairs(ft_modules) do - local mod_base = PathJoin(basepath, string.format("src/%s/", name)) + local mod_base = RelPath("src/" .. name) local module_file = PathJoin(mod_base, "module.lua") -- Check if we have a module.lua file From 0170e8181b962c79e57c34d4f9330e81c9d2d231 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 11 Sep 2022 15:09:15 +0200 Subject: [PATCH 225/361] engine.build.lua: export settings. --- engine.build.lua | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/engine.build.lua b/engine.build.lua index 9b29f92..d5d98ae 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -185,3 +185,21 @@ libspectre = StaticLibrary(settings, obj, ft2_obj ) + +-- Export settings +----------------------------------------------------------- +local exp = NewSettings() + +-- Headers +exp.cc.includes:Add(RelPath("include")) + +-- Additional libraries. +if TARGET_OS == "Win32" then + -- Windows needs to link against these. + exp.link.libs:Add("opengl32", "gdi32", "user32") +elseif TARGET_OS == "Unix" then + -- Unix nees dl and X11 libs and freetype + exp.link.libs:Add("dl", 'X11', 'Xrandr', 'freetype') +end + +libspectre_settings = exp From 80823098964a51b2c1e077b8d88f492c42197483 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 12 Sep 2022 19:32:44 +0200 Subject: [PATCH 226/361] .bam/functions.lua: Adding SetSettingsPrefix() --- .bam/functions.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.bam/functions.lua b/.bam/functions.lua index e5203e0..3159891 100644 --- a/.bam/functions.lua +++ b/.bam/functions.lua @@ -42,11 +42,15 @@ function host_system() return nil end +function SetSettingsPrefix(settings, prefix) + settings.labelprefix = string.format("[%s] ", prefix) +end + -- Copy settings with a optional label prefix. function CopySettings(settings, prefix) local n = TableDeepCopy(settings) if prefix ~= nil then - n.labelprefix = string.format("[%s] ", prefix) + SetSettingsPrefix(n, prefix) end return n end From 9dc3a4920762758997e4fec01098294a46fced6a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 12 Sep 2022 19:34:10 +0200 Subject: [PATCH 227/361] .bam/utils.lua: Adding TableMerge() --- .bam/utils.lua | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/.bam/utils.lua b/.bam/utils.lua index ff4957f..be68000 100644 --- a/.bam/utils.lua +++ b/.bam/utils.lua @@ -8,3 +8,15 @@ function contains(table, val) end return false end + +function TableMerge(a, b) + local r = TableDeepCopy(a) + for k,v in pairs(b) do + if IsTable(v) then + r[k] = TableMerge(r[k] or {}, v) + else + r[k] = v + end + end + return r +end From 4222d89eb23d6e12900c0ab815f4a9ecadf3b0a8 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 12 Sep 2022 19:34:48 +0200 Subject: [PATCH 228/361] examples/build.lua: Use libspectre_settings. --- examples/build.lua | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/examples/build.lua b/examples/build.lua index 24ce852..8300bce 100644 --- a/examples/build.lua +++ b/examples/build.lua @@ -4,24 +4,13 @@ -- -- -------------------------------- -local settings = CopySettings(global_settings, "Example") --- Include spectre headers. -settings.cc.includes:Add("include/") +local settings = TableMerge(libspectre_settings, global_settings) +SetSettingsPrefix(settings, "Examples") -- Link with spectre. settings.link.extrafiles:Add(libspectre) -if TARGET_OS == "Win32" then - - -- Windows needs to link against these. - settings.link.libs:Add("opengl32", "gdi32", "user32") -elseif TARGET_OS == "Unix" then - - -- Unix nees dl and X11 libs. - settings.link.libs:Add("dl", 'X11', 'Xrandr', 'freetype') -end - -- For now, to get examples working -- we copy the whole assets directory. assets = CopyDir(PathJoin(paths.build, paths.examples), "assets") From 397120a973850a29824b56950f195c8f728f934d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 12 Sep 2022 19:37:04 +0200 Subject: [PATCH 229/361] examples/build.lua: use PathFilename(name) as name contains a directory. --- examples/build.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/build.lua b/examples/build.lua index 8300bce..546e0f4 100644 --- a/examples/build.lua +++ b/examples/build.lua @@ -18,7 +18,7 @@ assets = CopyDir(PathJoin(paths.build, paths.examples), "assets") examples = {} for k, name in pairs(CollectDirs("examples/*")) do Import(PathJoin(name, "bam.lua")) - exe = Link(settings, PathJoin(paths.examples, name), Compile(settings, src)) + exe = Link(settings, PathJoin(paths.examples, PathFilename(name)), Compile(settings, src)) AddDependency(exe, assets) table.insert(examples, exe) end From 2f39299fc6b10e988fd2efc0b2ebf39901f1cd3f Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 12 Sep 2022 19:41:07 +0200 Subject: [PATCH 230/361] vendor/FreeType2/build.lua: use SetSettingsPrefix() --- vendor/FreeType2/build.lua | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/vendor/FreeType2/build.lua b/vendor/FreeType2/build.lua index 6d6d6e0..1a9edca 100644 --- a/vendor/FreeType2/build.lua +++ b/vendor/FreeType2/build.lua @@ -21,9 +21,8 @@ local ft_modules = { -- Settings -------------------------------- -settings = TableDeepCopy(global_settings) - -settings.labelprefix = "[FT2] " +local settings = TableDeepCopy(global_settings) +SetSettingsPrefix(settings, "FT2") -- Compile flags settings.cc.includes:Add(RelPath("include")) From c2c201c9e4de59b7bab49c2b6e0ed98084096d8a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 12 Sep 2022 19:41:36 +0200 Subject: [PATCH 231/361] vendor/FreeType2/build.lua: build a static lib. --- engine.build.lua | 2 +- vendor/FreeType2/build.lua | 16 +++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/engine.build.lua b/engine.build.lua index d5d98ae..c63b6e7 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -183,7 +183,7 @@ local obj = Compile(settings, { libspectre = StaticLibrary(settings, "spectre", obj, - ft2_obj + libfreetype ) -- Export settings diff --git a/vendor/FreeType2/build.lua b/vendor/FreeType2/build.lua index 1a9edca..0540587 100644 --- a/vendor/FreeType2/build.lua +++ b/vendor/FreeType2/build.lua @@ -1,8 +1,10 @@ --------------------------------- --- -- --- FreeType2 build config -- --- -- --------------------------------- +----------------------------------------------------------- +-- -- +-- FreeType2 build config -- +-- -- +-- Output variables: -- +-- libfreetype = path to .lib file -- +----------------------------------------------------------- -- Modules -------------------------------- @@ -52,5 +54,5 @@ for k,name in pairs(ft_modules) do PseudoTarget("ft2_" .. name, obj[name]) end -ft2_obj = TableFlatten(obj) -PseudoTarget("ft2", ft2_obj) +libfreetype = StaticLibrary(settings, "freetype", obj) +PseudoTarget("ft2", libfreetype) From c83337b6a68be51242cee25802fa75143fc335de Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 12 Sep 2022 19:55:34 +0200 Subject: [PATCH 232/361] .bam/path.lua: Adding ModuleRelative() --- .bam/path.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.bam/path.lua b/.bam/path.lua index b798e61..bcfd657 100644 --- a/.bam/path.lua +++ b/.bam/path.lua @@ -4,6 +4,11 @@ function ModuleDir() return PathDir(ModuleFilename()) end +-- Strip ModuleDir() of the beginning of path +function ModuleRelative(path) + return string.gsub(path, "^" .. ModuleDir() .. "/", "") +end + -- Make the path relative to the current working directory -- and ModuleDir() function RelPath(path) From d678f3c7a082cb7112de7b1bc1a66129f15639e2 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 12 Sep 2022 19:56:21 +0200 Subject: [PATCH 233/361] Adding .bam/compilers.lua --- .bam/compilers.lua | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .bam/compilers.lua diff --git a/.bam/compilers.lua b/.bam/compilers.lua new file mode 100644 index 0000000..8545c8b --- /dev/null +++ b/.bam/compilers.lua @@ -0,0 +1,33 @@ + +Import("path.lua") + +function CustomCompileC(settings, input) + local cc = settings.cc + local outname = cc.Output(settings, input) .. cc.extension + cc.DriverC(settings.labelprefix .. "c " .. ModuleRelative(input), outname, input, settings) + AddDependency(outname, input) + if not IsOutput(input) then + bam_add_dependency_cpp(input) + end + return outname +end + +function CustomCompileCXX(settings, input) + local cc = settings.cc + local outname = cc.Output(settings, input) .. cc.extension + cc.DriverCXX(settings.labelprefix .. "c++ " .. ModuleRelative(input), outname, input, settings) + AddDependency(outname, input) + if not IsOutput(input) then + bam_add_dependency_cpp(input) + end + return outname +end + +function SetCompilers(settings) + settings.compile.mappings["c"] = CustomCompileC + + settings.compile.mappings["cpp"] = CustomCompileCXX + settings.compile.mappings["cxx"] = CustomCompileCXX + settings.compile.mappings["c++"] = CustomCompileCXX + settings.compile.mappings["cc"] = CustomCompileCXX +end From 859e95eea813b73be6eeef92bb9e5127bcfdb923 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 12 Sep 2022 19:57:10 +0200 Subject: [PATCH 234/361] bam.lua: Set custom compiler functions. --- bam.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/bam.lua b/bam.lua index 8cf94db..3f6a260 100644 --- a/bam.lua +++ b/bam.lua @@ -6,6 +6,7 @@ Import(".bam/path.lua") Import(".bam/utils.lua") Import(".bam/functions.lua") +Import(".bam/compilers.lua") CheckVersion("0.5") -------------------------------- @@ -57,6 +58,10 @@ if ScriptArgs.type ~= nil and ScriptArgs.type:match("^release") then end +-- Compilers +-------------------------------- +SetCompilers(global_settings) + -- Output configuration -------------------------------- From c7d380c4b0f63e5150530dfac0ef969713f1de8e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 12 Sep 2022 21:12:32 +0200 Subject: [PATCH 235/361] source/Platform/PlatformApplication: rename create() to get() and just return a statically allocated implementation. As we just this throughout the whole program. and platform can be determined at compile time. we might as well allocate it statically. --- source/Platform/PlatformApplication.cpp | 5 +++-- source/Platform/PlatformApplication.h | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/source/Platform/PlatformApplication.cpp b/source/Platform/PlatformApplication.cpp index f50e54b..21148f5 100644 --- a/source/Platform/PlatformApplication.cpp +++ b/source/Platform/PlatformApplication.cpp @@ -13,9 +13,10 @@ typedef sp::UnixApplication ApplicationImpl; namespace sp { -PlatformApplication* PlatformApplication::create() +PlatformApplication* PlatformApplication::get() { - return new ApplicationImpl; + static ApplicationImpl inst; + return &inst; } } // namespace sp diff --git a/source/Platform/PlatformApplication.h b/source/Platform/PlatformApplication.h index d59046d..cfd3331 100644 --- a/source/Platform/PlatformApplication.h +++ b/source/Platform/PlatformApplication.h @@ -13,7 +13,7 @@ class MessageQueue; class PlatformApplication : NonCopyable { public : - static PlatformApplication* create(); + static PlatformApplication* get(); virtual void init() = 0; From 83f4d05df84a6e2ae0984a2f52956c61a490a6f6 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 12 Sep 2022 21:13:04 +0200 Subject: [PATCH 236/361] source/Game.cpp: call PlatformApplication::get() and dont delete the pointer. --- source/Game.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/Game.cpp b/source/Game.cpp index 573b5af..6c6162e 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -15,7 +15,7 @@ namespace sp { Game::Game() : m_running(false) { - m_platform = PlatformApplication::create(); + m_platform = PlatformApplication::get(); m_graphics = new Graphics(m_platform); m_input = new InputModule(&m_platform->getInput()); m_messageHandler = new MessageHandler(); @@ -29,7 +29,6 @@ Game::~Game() // TODO: This is abit ugly tbh. m_platform->shutdown(); - delete m_platform; } void Game::run() From d12d60b1ba7bf990a37646f171b73ab744dc3bae Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 12 Sep 2022 22:24:19 +0200 Subject: [PATCH 237/361] Display/Display: Cache position when entering fullscreen and restore when entering window mode again. --- include/Spectre/Display/Display.h | 5 +++++ source/Display/Display.cpp | 8 ++++++++ 2 files changed, 13 insertions(+) diff --git a/include/Spectre/Display/Display.h b/include/Spectre/Display/Display.h index 0985945..073fd0d 100644 --- a/include/Spectre/Display/Display.h +++ b/include/Spectre/Display/Display.h @@ -4,6 +4,7 @@ #include "DisplayMode.h" #include "DisplayDescription.h" +#include #include #include #include @@ -71,6 +72,10 @@ protected : protected : enum Mode m_fmode; + // Cache window position when entering fullscreen + // So it can be restored when returning to window mode. + Vector2u m_cachePos; + DisplayDescription m_description; DisplayDescription m_cacheDesc; diff --git a/source/Display/Display.cpp b/source/Display/Display.cpp index 0691360..ac28096 100644 --- a/source/Display/Display.cpp +++ b/source/Display/Display.cpp @@ -106,6 +106,11 @@ void Display::setVideoMode(Mode mode) m_impl->exitFullscreen(); } + // Cache window position when entering fullscreen. + if (mode == FULLSCREEN || mode == WINDOWEDFULLSCREEN) { + m_cachePos = m_impl->getPosition(); + } + // True fullscreen if (mode == FULLSCREEN) { m_impl->enterFullscreen(m_description.mode); @@ -120,6 +125,9 @@ void Display::setVideoMode(Mode mode) else { // Set stored decoration. m_impl->setDecoration(m_description.decoration); + + // Restore position. + m_impl->setPosition(m_cachePos.x, m_cachePos.y); } m_fmode = mode; From fc38bb59a905cc297cce76c3080b2bcf68c73021 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 12 Sep 2022 22:25:15 +0200 Subject: [PATCH 238/361] source/Display/Display.cpp: restore size when entering window mode. --- source/Display/Display.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/Display/Display.cpp b/source/Display/Display.cpp index ac28096..08529f3 100644 --- a/source/Display/Display.cpp +++ b/source/Display/Display.cpp @@ -126,7 +126,8 @@ void Display::setVideoMode(Mode mode) // Set stored decoration. m_impl->setDecoration(m_description.decoration); - // Restore position. + // Restore size and position. + m_impl->setSize(m_description.mode.width, m_description.mode.height); m_impl->setPosition(m_cachePos.x, m_cachePos.y); } From 3c6a842c9d7c76f3c74f5365dc7b6ecadb13e7db Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 12 Sep 2022 22:27:08 +0200 Subject: [PATCH 239/361] Platform/Win32/Win32Display.cpp: remove fullscreen stuff in create() --- source/Platform/Win32/Win32Display.cpp | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index 18e50e6..8ecc4a9 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -44,18 +44,9 @@ bool Win32Display::create(DisplayDescription description) firstTime = false; } - if (description.decoration & DisplayDecorate::Fullscreen) { - m_fs_mode = description.mode; - } - - if (m_fs_mode.empty() == false) { - // Only set these flags for fullscreen (borderless) - flags = WS_VISIBLE | WS_POPUP; - } else { - // Set window to center and set decorator flags for windowed displays. - pos = centerWindow(description.mode.width, description.mode.height); - flags = getWin32Flags(description.decoration); - } + // Set window to center and set decoration flags. + pos = centerWindow(description.mode.width, description.mode.height); + flags = getWin32Flags(description.decoration); // Create window. m_handle = CreateWindowExA(0, WND_CLASSNAME, "", flags, @@ -67,11 +58,7 @@ bool Win32Display::create(DisplayDescription description) return false; } - if (m_fs_mode.empty() == false) { - enterFullscreen(m_fs_mode); - } else { - setSize(description.mode.width, description.mode.height); - } + setSize(description.mode.width, description.mode.height); // Store the size for use later. m_size = getSize(); From 4761473e86ebb14751e6adcb588f77f6f9478b3a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 12 Sep 2022 22:45:54 +0200 Subject: [PATCH 240/361] include/Spectre/Display/DisplayDescription.h: remove fullscreen here as it is not a decorator flag. --- include/Spectre/Display/DisplayDescription.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/Spectre/Display/DisplayDescription.h b/include/Spectre/Display/DisplayDescription.h index ee1b468..0d6539b 100644 --- a/include/Spectre/Display/DisplayDescription.h +++ b/include/Spectre/Display/DisplayDescription.h @@ -13,7 +13,6 @@ namespace DisplayDecorate { Menu = 1 << 0, Resize = 1 << 1, Close = 1 << 2, - Fullscreen = 1 << 3, Default = Menu | Resize | Close, }; }; From 1c27fce58c98fb269e20b7788742de624e6761a4 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 13 Sep 2022 19:35:46 +0200 Subject: [PATCH 241/361] examples/display/DisplayExample.cpp: make "W" key switch to windowed fullscreen. --- examples/display/DisplayExample.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/examples/display/DisplayExample.cpp b/examples/display/DisplayExample.cpp index 2cbe330..8a430ae 100644 --- a/examples/display/DisplayExample.cpp +++ b/examples/display/DisplayExample.cpp @@ -24,7 +24,19 @@ void DisplayExample::onEvent(const sp::Event& event) { if (event.type == sp::Event::Key && event.key.pressed == false) { - if (event.key.code == sp::Keyboard::Space) { + if (event.key.code == sp::Keyboard::W) { + + if (m_mode == sp::Display::WINDOWED) { + m_mode = sp::Display::WINDOWEDFULLSCREEN; + sp::Log::info("Windowed Fullscreen"); + } else { + m_mode = sp::Display::WINDOWED; + sp::Log::info("Windowed"); + } + + getGraphics()->setDisplayMode(m_mode); + + } else if (event.key.code == sp::Keyboard::Space) { if (m_mode == sp::Display::WINDOWED) { m_mode = sp::Display::FULLSCREEN; From 7c23f5dfd94fb6b0e9e5ec8a04d65b5f73df20dd Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 13 Sep 2022 19:43:26 +0200 Subject: [PATCH 242/361] include/Spectre/Display/DisplayDescription.h: change Empty to None --- include/Spectre/Display/DisplayDescription.h | 2 +- source/Display/Display.cpp | 2 +- source/Platform/Win32/Win32Display.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/Spectre/Display/DisplayDescription.h b/include/Spectre/Display/DisplayDescription.h index 06067e0..0d6539b 100644 --- a/include/Spectre/Display/DisplayDescription.h +++ b/include/Spectre/Display/DisplayDescription.h @@ -9,7 +9,7 @@ namespace sp { namespace DisplayDecorate { enum Type { - Empty = 0, + None = 0, Menu = 1 << 0, Resize = 1 << 1, Close = 1 << 2, diff --git a/source/Display/Display.cpp b/source/Display/Display.cpp index bd13bd6..24ced50 100644 --- a/source/Display/Display.cpp +++ b/source/Display/Display.cpp @@ -114,7 +114,7 @@ void Display::setVideoMode(Mode mode) m_cacheDesc = m_description; } - desc.decoration = DisplayDecorate::Empty; + desc.decoration = DisplayDecorate::None; } else { desc = m_cacheDesc; } diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index 887688c..25544e2 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -251,7 +251,7 @@ DWORD Win32Display::getWin32Flags(unsigned int flags) { DWORD win32_flags = WS_VISIBLE; - if (flags == DisplayDecorate::Empty) { + if (flags == DisplayDecorate::None) { win32_flags |= WS_POPUP; } else { if (flags & DisplayDecorate::Menu) { From deb9918b9bb847ac4b055ac7ffbb811987581afa Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 13 Sep 2022 19:52:34 +0200 Subject: [PATCH 243/361] source/Display/Display.cpp: Need to set position to 0,0 in window fullscreen, otherwise it wont stick to the top-left of the monitor. --- source/Display/Display.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Display/Display.cpp b/source/Display/Display.cpp index 08529f3..b7a3135 100644 --- a/source/Display/Display.cpp +++ b/source/Display/Display.cpp @@ -120,6 +120,7 @@ void Display::setVideoMode(Mode mode) DisplayMode desktop = DisplayMode::getDesktopMode(); m_impl->setDecoration(DisplayDecorate::None); m_impl->setSize(desktop.width, desktop.height); + m_impl->setPosition(0, 0); } // Window mode. else { From ab11f7b9dbdc39e38a3e84607986fcf87598199a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 17 Sep 2022 12:06:00 +0200 Subject: [PATCH 244/361] Adding include/Spectre/GfxDriver/GfxDriver.h --- include/Spectre/GfxDriver/GfxDriver.h | 37 +++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 include/Spectre/GfxDriver/GfxDriver.h diff --git a/include/Spectre/GfxDriver/GfxDriver.h b/include/Spectre/GfxDriver/GfxDriver.h new file mode 100644 index 0000000..3ddb730 --- /dev/null +++ b/include/Spectre/GfxDriver/GfxDriver.h @@ -0,0 +1,37 @@ + +#ifndef SPECTRE_GFXDRIVER_GFXDRIVER_H +#define SPECTRE_GFXDRIVER_GFXDRIVER_H + +#include + +namespace sp { + +class GfxDriver +{ +public: + enum BufferFlags { + CLEAR_BUFFER_BIT, + }; + +public: + virtual std::string getVendor() const = 0; + + virtual void setViewport(int x, int y, int width, int height) = 0; + + virtual void setClearColor(float r, float g, float b, float a) = 0; + + virtual void clearBuffer(BufferFlags flags) = 0; + + virtual void clearColorBuffer() = 0; + + // Resources. + + // CreateIndexBuffer() + // CreateVertexBuffer() + + // Draw calls +}; + +} // namespace sp + +#endif /* SPECTRE_GFXDRIVER_GFXDRIVER_H */ From d3debea41acdca0eb4bc4ff6b21bc8417b711f89 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 17 Sep 2022 12:06:47 +0200 Subject: [PATCH 245/361] Adding OpenGL Driver. --- source/GfxDriver/OpenGL/OpenGLDrv.cpp | 53 +++++++++++++++++++++++++++ source/GfxDriver/OpenGL/OpenGLDrv.h | 25 +++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 source/GfxDriver/OpenGL/OpenGLDrv.cpp create mode 100644 source/GfxDriver/OpenGL/OpenGLDrv.h diff --git a/source/GfxDriver/OpenGL/OpenGLDrv.cpp b/source/GfxDriver/OpenGL/OpenGLDrv.cpp new file mode 100644 index 0000000..ead2e2a --- /dev/null +++ b/source/GfxDriver/OpenGL/OpenGLDrv.cpp @@ -0,0 +1,53 @@ + +#include "OpenGLDrv.h" +#include + +namespace sp { + +std::string OpenGLDrv::getVendor() const +{ + char buf[512]; + + std::string prof = "Compability"; + char *ver = (char*) glGetString(GL_VERSION); + char *ven = (char*) glGetString(GL_VENDOR); + char *ren = (char*) glGetString(GL_RENDERER); + GLint flags; + + glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &flags); + if (flags & GL_CONTEXT_CORE_PROFILE_BIT) { + prof = "Core"; + } + + snprintf(buf, sizeof(buf), "OpenGL %s %s profile - %s %s", ver, prof.c_str(), ren, ven); + + return std::string(buf); +} + +void OpenGLDrv::setViewport(int x, int y, int width, int height) +{ + glViewport(x, y, width, height); +} + +void OpenGLDrv::setClearColor(float r, float g, float b, float a) +{ + glClearColor(r, g, b, 1.0f); +} + +void OpenGLDrv::clearBuffer(GfxDriver::BufferFlags flags) +{ + int glFlags = 0; + + if (flags == GfxDriver::CLEAR_BUFFER_BIT) { + glFlags |= GL_COLOR_BUFFER_BIT; + } + + glClear(glFlags); +} + +void OpenGLDrv::clearColorBuffer() +{ + glClear(GL_COLOR_BUFFER_BIT); +} + +} // namespace sp diff --git a/source/GfxDriver/OpenGL/OpenGLDrv.h b/source/GfxDriver/OpenGL/OpenGLDrv.h new file mode 100644 index 0000000..c993fb0 --- /dev/null +++ b/source/GfxDriver/OpenGL/OpenGLDrv.h @@ -0,0 +1,25 @@ + +#ifndef SPECTRE_GFXDRIVER_OPENGL_OPENGLDRV_H +#define SPECTRE_GFXDRIVER_OPENGL_OPENGLDRV_H + +#include + +namespace sp { + +class OpenGLDrv : public GfxDriver +{ +public: + virtual std::string getVendor() const; + + virtual void setViewport(int x, int y, int width, int height); + + virtual void setClearColor(float r, float g, float b, float a); + + virtual void clearBuffer(GfxDriver::BufferFlags flags); + + virtual void clearColorBuffer(); +}; + +} // namespace sp + +#endif /* SPECTRE_GFXDRIVER_GFXDRIVER_H */ From 4dad1a5d750c8ddfaca64cf4056a56d7c6f1d1bb Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 17 Sep 2022 12:07:28 +0200 Subject: [PATCH 246/361] Graphics class: use GfxDriver API. --- include/Spectre/Graphics.h | 6 +++++ source/Graphics/{OpenGL.cpp => Graphics.cpp} | 28 ++++++-------------- 2 files changed, 14 insertions(+), 20 deletions(-) rename source/Graphics/{OpenGL.cpp => Graphics.cpp} (63%) diff --git a/include/Spectre/Graphics.h b/include/Spectre/Graphics.h index 6999ec1..ceb35fb 100644 --- a/include/Spectre/Graphics.h +++ b/include/Spectre/Graphics.h @@ -2,6 +2,7 @@ #ifndef GRAPHICS_H #define GRAPHICS_H +#include #include namespace sp { @@ -42,12 +43,17 @@ public : void swapBuffers(); + GfxDriver* getDriver(); + protected : int m_width; int m_height; Display *m_display; + + // Graphics Driver. OpenGL/Vulcan/DirectX etc. + GfxDriver *m_gfxdrv; }; } // namespace sp diff --git a/source/Graphics/OpenGL.cpp b/source/Graphics/Graphics.cpp similarity index 63% rename from source/Graphics/OpenGL.cpp rename to source/Graphics/Graphics.cpp index da752dd..1c246bb 100644 --- a/source/Graphics/OpenGL.cpp +++ b/source/Graphics/Graphics.cpp @@ -1,6 +1,6 @@ +#include "GfxDriver/OpenGL/OpenGLDrv.h" #include -#include #include namespace sp { @@ -11,6 +11,9 @@ Graphics::Graphics(PlatformApplication *platform) m_height = 600; m_display = new Display(); + + // Only have OpenGL atm. + m_gfxdrv = new OpenGLDrv(); } Graphics::~Graphics() @@ -42,22 +45,7 @@ void Graphics::shutdown() std::string Graphics::getVersion() const { - char buf[512]; - - std::string prof = "Compability"; - char *ver = (char*) glGetString(GL_VERSION); - char *ven = (char*) glGetString(GL_VENDOR); - char *ren = (char*) glGetString(GL_RENDERER); - GLint flags; - - glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &flags); - if (flags & GL_CONTEXT_CORE_PROFILE_BIT) { - prof = "Core"; - } - - snprintf(buf, sizeof(buf), "OpenGL %s %s profile - %s %s", ver, prof.c_str(), ren, ven); - - return std::string(buf); + return m_gfxdrv->getVendor(); } void Graphics::setDisplayMode(Display::Mode mode) @@ -72,17 +60,17 @@ void Graphics::setSize(int width, int height) void Graphics::setViewport(int x, int y, int width, int height) { - glViewport(x, y, width, height); + m_gfxdrv->setViewport(x, y, width, height); } void Graphics::setClearColor(float r, float g, float b) { - glClearColor(r, g, b, 1.0f); + m_gfxdrv->setClearColor(r, g, b, 1.0f); } void Graphics::clearBuffer() { - glClear(GL_COLOR_BUFFER_BIT); + m_gfxdrv->clearColorBuffer(); } void Graphics::swapBuffers() From 038d9974219083273e8c7c881808ed5c16229525 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 18 Sep 2022 12:22:19 +0200 Subject: [PATCH 247/361] engine.build.lua: build OpenGL gfx driver. --- engine.build.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engine.build.lua b/engine.build.lua index c63b6e7..25dcff9 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -136,6 +136,10 @@ local graphics_module = Module("source/Graphics", { "GL/CheckError.cpp", }) +local gfxdrv_opengl_module = Module("source/GfxDriver/OpenGL", { + "OpenGLDrv.cpp" +}) + local core_module = Module("source/Core", { "String.cpp" }) @@ -174,6 +178,7 @@ local obj = Compile(settings, { input_module, display_module, graphics_module, + gfxdrv_opengl_module, core_module, math_module, game_module, From b91bc22db1fa710047d47d023e8ff37570dc8c02 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 18 Sep 2022 12:24:44 +0200 Subject: [PATCH 248/361] engine.build.lua: Graphics module: OpenGL.cpp is now called Graphics.cpp --- engine.build.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engine.build.lua b/engine.build.lua index 25dcff9..fb19659 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -131,9 +131,10 @@ local graphics_module = Module("source/Graphics", { "Image/IcoFormat.cpp", "PixelFormat.cpp", - "OpenGL.cpp", "GL/glad.c", "GL/CheckError.cpp", + + "Graphics.cpp", }) local gfxdrv_opengl_module = Module("source/GfxDriver/OpenGL", { From cd9114bfd0ea23fcf6ea9f38621099113352e9c6 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 18 Sep 2022 12:26:01 +0200 Subject: [PATCH 249/361] Adding Spectre/GfxDriver/ShaderProgram base class. --- include/Spectre/GfxDriver/ShaderProgram.h | 77 +++++++++++++++++++++++ source/GfxDriver/ShaderProgram.cpp | 69 ++++++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 include/Spectre/GfxDriver/ShaderProgram.h create mode 100644 source/GfxDriver/ShaderProgram.cpp diff --git a/include/Spectre/GfxDriver/ShaderProgram.h b/include/Spectre/GfxDriver/ShaderProgram.h new file mode 100644 index 0000000..872e137 --- /dev/null +++ b/include/Spectre/GfxDriver/ShaderProgram.h @@ -0,0 +1,77 @@ + +#ifndef SPECTRE_GFXDRIVER_SHADERPROGRAM_H +#define SPECTRE_GFXDRIVER_SHADERPROGRAM_H + +#include +#include + +namespace sp { + +enum ShaderType { + Vertex, + Fragment +}; + +class ShaderProgram +{ +public: + virtual ~ShaderProgram(); + + // Load a shader program from file. + virtual bool loadFromFile(const std::string& filename); + + // Load a shader from file. + virtual bool loadFromFile(const std::string& filename, ShaderType type); + + // Load a shader from memory. + virtual bool loadFromMemory(const std::string& source, ShaderType type) = 0; + + // Link the program. + virtual bool link() = 0; + + // Returns true if the program was linked successfully + virtual bool isLinked() const; + + // Enable this shader + // All shader operations after this call will affect this shader. + virtual void enable() const = 0; + + // Disable this shader + // Operations will no longer affect this shader after this call. + virtual void disable() const = 0; + + // Get the last shader error. + virtual std::string getLastError() const; + + // --------------------- + // Variables. + // --------------------- + // TODO: Move this to a ShaderParameter class + + virtual bool setMVPMatrix(const Matrix4f& matrix) = 0; + + // --------------------- + // General Variables. + // --------------------- + + virtual bool setAttribute(const std::string& name, float value) const = 0; + + virtual bool setAttribute(const std::string& name, const Matrix4f& matrix) const = 0; + + virtual bool setUniform(const std::string& name, const Matrix4f& matrix) const = 0; + + virtual bool setUniform(const std::string& name, const Color& color) const = 0; + + +protected: + + std::string m_extension; + + mutable std::string m_error; + + bool m_linked; +}; + +} // namespace sp + +#endif /* SECTRE_GRAPHICS_SHADERPROGRAM_H */ diff --git a/source/GfxDriver/ShaderProgram.cpp b/source/GfxDriver/ShaderProgram.cpp new file mode 100644 index 0000000..61ed11a --- /dev/null +++ b/source/GfxDriver/ShaderProgram.cpp @@ -0,0 +1,69 @@ + +#include +#include +#include +#include + +namespace sp +{ + +ShaderProgram::~ShaderProgram() +{ +} + +bool ShaderProgram::loadFromFile(const std::string& filename) +{ + std::string extension = Path::getExtension(filename); + + // Meta file. load real shaders. + if (extension == "shader." + m_extension) { + + // FIXME: This is ugly :) + std::string base_name = filename.substr(0, filename.length() - extension.length()); + + // vert and frag are not optional. they must exist. + return loadFromFile(base_name + "vert." + m_extension, ShaderType::Vertex) && + loadFromFile(base_name + "frag." + m_extension, ShaderType::Fragment); + + } else if (extension == "vert." + m_extension) { + return loadFromFile(filename, ShaderType::Vertex); + } else if (extension == "frag." + m_extension) { + return loadFromFile(filename, ShaderType::Fragment); + } + + m_error = "Invalid file extension: " + extension; + + return false; +} + +bool ShaderProgram::loadFromFile(const std::string& filename, ShaderType type) +{ + std::string src; + File file; + + if (!file.open(filename)) { + m_error = "Can't open file: " + filename; + return false; + } + + // Load file into memory. + if (!file.read(src)) { + m_error = "Could not read file: " + filename; + return false; + } + + return loadFromMemory(src, type); +} + + +bool ShaderProgram::isLinked() const +{ + return m_linked; +} + +std::string ShaderProgram::getLastError() const +{ + return m_error; +} + +} // namespace sp \ No newline at end of file From 69e5ae22d2d150bb027e71a375ad1e117e25e1a5 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 18 Sep 2022 12:26:31 +0200 Subject: [PATCH 250/361] Adding GfxDriver/OpenGL/OpenGLShaderProgram class --- .../GfxDriver/OpenGL/OpenGLShaderProgram.cpp | 186 ++++++++++++++++++ source/GfxDriver/OpenGL/OpenGLShaderProgram.h | 70 +++++++ 2 files changed, 256 insertions(+) create mode 100644 source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp create mode 100644 source/GfxDriver/OpenGL/OpenGLShaderProgram.h diff --git a/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp b/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp new file mode 100644 index 0000000..f9bb0ad --- /dev/null +++ b/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp @@ -0,0 +1,186 @@ + +#include "OpenGLShaderProgram.h" + +namespace sp { + +OpenGLShaderProgram::OpenGLShaderProgram() +{ + m_extension = "glsl"; + m_id = glCreateProgram(); +} + + +OpenGLShaderProgram::~OpenGLShaderProgram() +{ + if (m_id > 0) { + glDeleteProgram(m_id); + } +} + +bool OpenGLShaderProgram::loadFromMemory(const std::string& source, ShaderType type) +{ + const char *s = source.c_str(); + + GLuint shader_id = glCreateShader(type == ShaderType::Vertex + ? GL_VERTEX_SHADER : GL_FRAGMENT_SHADER); + + glShaderSource(shader_id, 1, &s, NULL); + + if (!compileShader(shader_id)) { + return false; + } + + return attachShader(shader_id); +} + +bool OpenGLShaderProgram::link() +{ + GLint status; + + glLinkProgram(m_id); + + // Query OpenGL for link status. + glGetProgramiv(m_id, GL_LINK_STATUS, &status); + m_linked = status == GL_TRUE; + + if (!m_linked) { + m_error = fetchErrorLog(); + } + return m_linked; +} + +// Enable this shader +// All shader operations after this call will affect this shader. +void OpenGLShaderProgram::enable() const +{ + glUseProgram(m_id); +} + +// Disable this shader +// Operations will no longer affect this shader after this call. +void OpenGLShaderProgram::disable() const +{ + glUseProgram(0); +} + +// --------------------- +// Variables. +// --------------------- + +bool OpenGLShaderProgram::setMVPMatrix(const Matrix4f& matrix) +{ + return setUniform("u_MVP", matrix); +} + +// --------------------- +// General Variables. +// --------------------- + +bool OpenGLShaderProgram::setAttribute(const std::string& name, float value) const +{ + int loc; + if (getAttribLoc(name, loc)) { + glVertexAttrib1f(loc, value); + return true; + } + return false; +} + +bool OpenGLShaderProgram::setAttribute(const std::string& name, const Matrix4f& matrix) const +{ + int loc; + if (getAttribLoc(name, loc)) { + glVertexAttrib4fv(loc, matrix.e); + return true; + } + return false; +} + +bool OpenGLShaderProgram::setUniform(const std::string& name, const Matrix4f& matrix) const +{ + int loc; + if (getUniformLoc(name, loc)) { + glUniformMatrix4fv(loc, 1, GL_FALSE, matrix.e); + return true; + } + return false; +} + +bool OpenGLShaderProgram::setUniform(const std::string& name, const Color& color) const +{ + int loc; + if (getUniformLoc(name, loc)) { + Vector4f c = color.toRGBAf(); + + glUniform4f(loc, c.x, c.y, c.z, c.w); + return true; + } + return false; +} + +bool OpenGLShaderProgram::getAttribLoc(const std::string& name, int& loc) const +{ + loc = glGetAttribLocation(m_id, name.c_str()); + if (loc < 0) { + m_error = "Attribute variable '" + name + "' was not found in shader."; + return false; + } + return true; +} + +bool OpenGLShaderProgram::getUniformLoc(const std::string& name, int& loc) const +{ + loc = glGetUniformLocation(m_id, name.c_str()); + if (loc < 0) { + m_error = std::string("Uniform variable '" + name + "' was not found in shader."); + return false; + } + return true; +} + +std::string OpenGLShaderProgram::fetchErrorLog() const +{ + GLchar buf[4096] = { '\0' }; + + glGetProgramInfoLog(m_id, sizeof(buf), NULL, buf); + + return std::string(buf); +} + +bool OpenGLShaderProgram::compileShader(GLuint id) +{ + glCompileShader(id); + GLenum err; + + // Query OpenGL for status. + GLint status; + glGetShaderiv(id, GL_COMPILE_STATUS, &status); + if (status == GL_FALSE) { + GLchar buf[4096] = { '\0' }; + glGetShaderInfoLog(id, sizeof(buf), NULL, buf); + m_error = std::string(buf); + return false; + } + return true; +} + +bool OpenGLShaderProgram::attachShader(GLuint id) +{ + GLenum err; + + glAttachShader(m_id, id); + err = glGetError(); + if (err == GL_INVALID_VALUE) { + m_error = "Invalid Value"; + return false; + } else if (err == GL_INVALID_OPERATION) { + m_error = "Invalid operation"; + return false; + } else if (err != GL_NO_ERROR) { + m_error = "Unkown Error"; + return false; + } + return true; +} + +} // namespace sp diff --git a/source/GfxDriver/OpenGL/OpenGLShaderProgram.h b/source/GfxDriver/OpenGL/OpenGLShaderProgram.h new file mode 100644 index 0000000..4d8c650 --- /dev/null +++ b/source/GfxDriver/OpenGL/OpenGLShaderProgram.h @@ -0,0 +1,70 @@ + +#ifndef SPECTRE_GFXDRIVER_OPENGL_OPENGLSHADERPROGRAM_H +#define SPECTRE_GFXDRIVER_OPENGL_OPENGLSHADERPROGRAM_H + +#include +#include + +namespace sp { + +class OpenGLShaderProgram : public ShaderProgram +{ +public: + OpenGLShaderProgram(); + virtual ~OpenGLShaderProgram(); + + // Load a shader from memory. + virtual bool loadFromMemory(const std::string& source, ShaderType type); + + // Link the program. + virtual bool link(); + + // Enable this shader + // All shader operations after this call will affect this shader. + virtual void enable() const; + + // Disable this shader + // Operations will no longer affect this shader after this call. + virtual void disable() const; + + // --------------------- + // Variables. + // --------------------- + + virtual bool setMVPMatrix(const Matrix4f& matrix); + + // --------------------- + // General Variables. + // --------------------- + + virtual bool setAttribute(const std::string& name, float value) const; + + virtual bool setAttribute(const std::string& name, const Matrix4f& matrix) const; + + virtual bool setUniform(const std::string& name, const Matrix4f& matrix) const; + + virtual bool setUniform(const std::string& name, const Color& color) const; + +protected : + + // Compile a shader. + bool compileShader(GLuint id); + + // Attach shader to program. + bool attachShader(GLuint id); + + bool getAttribLoc(const std::string& name, int& loc) const; + + bool getUniformLoc(const std::string& name, int& loc) const; + + std::string fetchErrorLog() const; + +protected : + + // Program ID + GLuint m_id; +}; + +} // namespace sp + +#endif /* SPECTRE_GFXDRIVER_OPENGL_OPENGLSHADERPROGRAM_H */ From b85b4ab601deaf3e36752ad60e5250c2f0a23367 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 18 Sep 2022 13:51:18 +0200 Subject: [PATCH 251/361] include/Spectre/Graphics/Renderer2D.h: Dont have to include ShaderProgram here. --- include/Spectre/Graphics/Renderer2D.h | 1 - 1 file changed, 1 deletion(-) diff --git a/include/Spectre/Graphics/Renderer2D.h b/include/Spectre/Graphics/Renderer2D.h index f5192b3..b0f0499 100644 --- a/include/Spectre/Graphics/Renderer2D.h +++ b/include/Spectre/Graphics/Renderer2D.h @@ -3,7 +3,6 @@ #define SPECTRE_GRAPHICS_RENDERER2D_H #include -#include #include namespace sp { From cc1f287a3a60e097203f11dcac777d4c46ae93b7 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 18 Sep 2022 13:53:48 +0200 Subject: [PATCH 252/361] source/Graphics/RenderState.cpp: Use GfxDriver/ShaderProgram instead of Graphics/ShaderProgram. --- source/Graphics/RenderState.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/Graphics/RenderState.cpp b/source/Graphics/RenderState.cpp index b6330b8..70a045f 100644 --- a/source/Graphics/RenderState.cpp +++ b/source/Graphics/RenderState.cpp @@ -1,8 +1,7 @@ - -#include #include #include +#include namespace sp { From 9bea188686cd1f00a3c11151feb95b356c0a7225 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 18 Sep 2022 13:54:32 +0200 Subject: [PATCH 253/361] Graphics/BatchRenderer2D: use GfxDriver/ShaderProgram instead of Graphics/ShaderProgram --- include/Spectre/Graphics/BatchRenderer2D.h | 4 +- source/Graphics/BatchRenderer2D.cpp | 43 ++++++++++++---------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/include/Spectre/Graphics/BatchRenderer2D.h b/include/Spectre/Graphics/BatchRenderer2D.h index 448a503..79bcd17 100644 --- a/include/Spectre/Graphics/BatchRenderer2D.h +++ b/include/Spectre/Graphics/BatchRenderer2D.h @@ -67,8 +67,8 @@ protected : unsigned short m_size; - ShaderProgram m_textShader; - ShaderProgram m_spriteShader; + ShaderProgram* m_textShader; + ShaderProgram* m_spriteShader; }; } // namespace diff --git a/source/Graphics/BatchRenderer2D.cpp b/source/Graphics/BatchRenderer2D.cpp index 0d3161a..3eaed60 100644 --- a/source/Graphics/BatchRenderer2D.cpp +++ b/source/Graphics/BatchRenderer2D.cpp @@ -2,10 +2,10 @@ #include #include #include -#include #include #include #include +#include #include #include @@ -49,22 +49,24 @@ BatchRenderer2D::BatchRenderer2D() glEnableVertexAttribArray(VertexAttribTexCoord0); glVertexAttribPointer(VertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex2D), (void*)24); - m_textShader.create(); - if (!m_textShader.loadFromFile("assets/shaders/text.shader.glsl")) { - std::cout << "Failed to load shader: " << m_textShader.getLastError() << std::endl; + m_textShader = new OpenGLShaderProgram(); + + if (!m_textShader->loadFromFile("assets/shaders/text.shader.glsl")) { + std::cout << "Failed to load shader: " << m_textShader->getLastError() << std::endl; } - if (!m_textShader.link()) { - std::cout << "Failed to link shader: " << m_textShader.getLastError() << std::endl; + if (!m_textShader->link()) { + std::cout << "Failed to link shader: " << m_textShader->getLastError() << std::endl; } - m_spriteShader.create(); - if (!m_spriteShader.loadFromFile("assets/shaders/standard.shader.glsl")) { - std::cout << "Failed to load shader: " << m_spriteShader.getLastError() << std::endl; + m_spriteShader = new OpenGLShaderProgram(); + + if (!m_spriteShader->loadFromFile("assets/shaders/standard.shader.glsl")) { + std::cout << "Failed to load shader: " << m_spriteShader->getLastError() << std::endl; } - if (!m_spriteShader.link()) { - std::cout << "Failed to link shader: " << m_spriteShader.getLastError() << std::endl; + if (!m_spriteShader->link()) { + std::cout << "Failed to link shader: " << m_spriteShader->getLastError() << std::endl; } } @@ -73,6 +75,9 @@ BatchRenderer2D::~BatchRenderer2D() glDeleteBuffers(1, &m_VBO); glDeleteBuffers(1, &m_IBO); glDeleteVertexArrays(1, &m_VAO); + + delete m_textShader; + delete m_spriteShader; } void BatchRenderer2D::setBatchSize(unsigned short size) @@ -146,13 +151,13 @@ void BatchRenderer2D::render() glBindVertexArray(m_VAO); // Set shader uniforms. - m_textShader.enable(); - m_textShader.setUniform("u_MVP", MVP); - m_textShader.disable(); + m_textShader->enable(); + m_textShader->setUniform("u_MVP", MVP); + m_textShader->disable(); - m_spriteShader.enable(); - m_spriteShader.setUniform("u_MVP", MVP); - m_spriteShader.disable(); + m_spriteShader->enable(); + m_spriteShader->setUniform("u_MVP", MVP); + m_spriteShader->disable(); prepareQueue(); @@ -242,9 +247,9 @@ void BatchRenderer2D::drawBatch(Batch& batch) glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - shader = &m_textShader; + shader = m_textShader; } else { - shader = &m_spriteShader; + shader = m_spriteShader; } // enable shader. From 82e08d07852fbb9a479ff3f06869d8f4340f63ae Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 18 Sep 2022 13:55:43 +0200 Subject: [PATCH 254/361] Graphics/DefaultRenderer2D: use GfxDriver/ShaderProgram instead of Graphics/ShaderProgram --- include/Spectre/Graphics/DefaultRenderer2D.h | 4 +++- source/Graphics/DefaultRenderer2D.cpp | 17 +++++++++-------- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/include/Spectre/Graphics/DefaultRenderer2D.h b/include/Spectre/Graphics/DefaultRenderer2D.h index 6ef367a..129eb16 100644 --- a/include/Spectre/Graphics/DefaultRenderer2D.h +++ b/include/Spectre/Graphics/DefaultRenderer2D.h @@ -7,6 +7,8 @@ namespace sp { +class ShaderProgram; + class DefaultRenderer2D : public Renderer2D { public : @@ -21,7 +23,7 @@ protected : std::vector m_queue; - ShaderProgram m_shader; + ShaderProgram* m_shader; }; } // namespace diff --git a/source/Graphics/DefaultRenderer2D.cpp b/source/Graphics/DefaultRenderer2D.cpp index 112854e..8a396f5 100644 --- a/source/Graphics/DefaultRenderer2D.cpp +++ b/source/Graphics/DefaultRenderer2D.cpp @@ -2,19 +2,20 @@ #include #include #include +#include #include namespace sp { DefaultRenderer2D::DefaultRenderer2D() { - m_shader.create(); - if (!m_shader.loadFromFile("assets/shaders/standard.shader.glsl")) { - std::cout << "Failed to load shader: " << m_shader.getLastError() << std::endl; + m_shader = new OpenGLShaderProgram(); + if (!m_shader->loadFromFile("assets/shaders/standard.shader.glsl")) { + std::cout << "Failed to load shader: " << m_shader->getLastError() << std::endl; } - if (!m_shader.link()) { - std::cout << "Failed to link shader: " << m_shader.getLastError() << std::endl; + if (!m_shader->link()) { + std::cout << "Failed to link shader: " << m_shader->getLastError() << std::endl; } } @@ -33,7 +34,7 @@ void DefaultRenderer2D::render() viewMatrix = Matrix4f::Identity; } - m_shader.enable(); + m_shader->enable(); glEnableVertexAttribArray(VertexAttribPosition); glEnableVertexAttribArray(VertexAttribColor0); @@ -48,7 +49,7 @@ void DefaultRenderer2D::render() const Texture *tex = obj->getTexture(); Matrix4f modelViewMatrix = viewMatrix * obj->getTransform().getMatrix(); - m_shader.setMVPMatrix(modelViewMatrix); + m_shader->setMVPMatrix(modelViewMatrix); glVertexAttribPointer(VertexAttribPosition, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex2D), data + 0); glVertexAttribPointer(VertexAttribColor0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex2D), data + 8); @@ -69,7 +70,7 @@ void DefaultRenderer2D::render() glDisableVertexAttribArray(VertexAttribColor0); glDisableVertexAttribArray(VertexAttribTexCoord0); - m_shader.disable(); + m_shader->disable(); m_queue.clear(); } From 81f3e1e39979a51cdcfaa653a12e107cb8e48c1b Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 18 Sep 2022 13:56:37 +0200 Subject: [PATCH 255/361] Graphics: Remove Shader and ShaderProgram classes. they are combined into GfxDriver/ShaderProgram. --- engine.build.lua | 2 - include/Spectre/Graphics/Shader.h | 58 ------- include/Spectre/Graphics/ShaderProgram.h | 90 ----------- source/Graphics/Shader.cpp | 104 ------------ source/Graphics/ShaderProgram.cpp | 197 ----------------------- 5 files changed, 451 deletions(-) delete mode 100644 include/Spectre/Graphics/Shader.h delete mode 100644 include/Spectre/Graphics/ShaderProgram.h delete mode 100644 source/Graphics/Shader.cpp delete mode 100644 source/Graphics/ShaderProgram.cpp diff --git a/engine.build.lua b/engine.build.lua index fb19659..18fe860 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -113,8 +113,6 @@ local graphics_module = Module("source/Graphics", { "Renderable2D.cpp", "Renderer2D.cpp", "RenderState.cpp", - "Shader.cpp", - "ShaderProgram.cpp", "Texture.cpp", -- Text diff --git a/include/Spectre/Graphics/Shader.h b/include/Spectre/Graphics/Shader.h deleted file mode 100644 index 66e9a5a..0000000 --- a/include/Spectre/Graphics/Shader.h +++ /dev/null @@ -1,58 +0,0 @@ - -#ifndef SPECTRE_GRAPHICS_SHADER_H -#define SPECTRE_GRAPHICS_SHADER_H - -#include - -namespace sp { - -class Shader -{ -public : - enum Type { - Vertex, - Fragment - }; - - Shader(Type type, const std::string& name = ""); - ~Shader(); - - unsigned int getHandle() const; - - const std::string& getName() const; - - // Load shader from file. - bool loadFromFile(const std::string& file); - - // Load shader from memory - bool loadFromMemory(const std::string& source); - - const std::string& getError() const; - - // Is this shader compiled? - bool isCompiled() const; - -protected : - - // Compile the shader. - // Returns true if the shader compiled without errors. false otherwise. - bool compile(); - - std::string fetchErrorLog(); - -protected : - - // Type of shader. Vertex, fragment, geometry etc. - Type m_type; - - unsigned int m_handle; // Shader id. - - // A name for the shader (usually the filename if loaded from file). - std::string m_name; - - std::string m_error; -}; - -} // namespace sp - -#endif /* SPECTRE_GRAPHICS_SHADER_H */ diff --git a/include/Spectre/Graphics/ShaderProgram.h b/include/Spectre/Graphics/ShaderProgram.h deleted file mode 100644 index f11d769..0000000 --- a/include/Spectre/Graphics/ShaderProgram.h +++ /dev/null @@ -1,90 +0,0 @@ - -#ifndef SPECTRE_GRAPHICS_SHADER_PROGRAM_H -#define SPECTRE_GRAPHICS_SHADER_PROGRAM_H - -#include -#include -#include "Shader.h" - -namespace sp { - -struct Color; - -class ShaderProgram -{ -public : - ShaderProgram(); - ~ShaderProgram(); - - void create(); - - void destroy(); - - void addShader(const Shader& shader); - - // Load a shader program from file. - // - // The following naming conventions are supported: - // .glsl - Virtual file, will load all real shader files with the same name. - // .vert.glsl - Vertex shader. - // .frag.glsl - Fragment shader. - bool loadFromFile(const std::string& filename); - - // Load a shader from file. - bool loadFromFile(const std::string& filename, Shader::Type type); - - // Load a shader from memory. - bool loadFromMemory(const std::string& source, Shader::Type type); - - // Link the program. - bool link(); - - // Returns true if the program was linked successfully - bool isLinked() const; - - // Enable this shader - // All shader operations after this call will affect this shader. - void enable() const; - - // Disable this shader - // Operations will no longer affect this shader after this call. - void disable() const; - - // Get the last shader error. - std::string getLastError() const; - - // --------------------- - // Variables. - // --------------------- - - bool setMVPMatrix(const Matrix4f& matrix); - - // --------------------- - // General Variables. - // --------------------- - - bool setAttribute(const std::string& name, float value) const; - - bool setAttribute(const std::string& name, const Matrix4f& matrix) const; - - bool setUniform(const std::string& name, const Matrix4f& matrix) const; - - bool setUniform(const std::string& name, const Color& color) const; - -protected : - - bool getAttribLoc(const std::string& name, int& loc) const; - bool getUniformLoc(const std::string& name, int& loc) const; - - std::string fetchErrorLog(); - -protected : - - unsigned int m_id; // program id - - mutable std::string m_error; -}; - -} // namespace sp - -#endif /* SPECTRE_GRAPHICS_SHADER_PROGRAM_H */ diff --git a/source/Graphics/Shader.cpp b/source/Graphics/Shader.cpp deleted file mode 100644 index e24eb1f..0000000 --- a/source/Graphics/Shader.cpp +++ /dev/null @@ -1,104 +0,0 @@ - -#include -#include -#include -#include - -namespace sp { - -Shader::Shader(Type type, const std::string& name) : -m_name (name) -{ - GLenum internal_type = type == Vertex ? GL_VERTEX_SHADER : GL_FRAGMENT_SHADER; - m_handle = glCreateShader(internal_type); -} - -Shader::~Shader() -{ - if (m_handle) { - glDeleteShader(m_handle); - } -} - -unsigned int Shader::getHandle() const -{ - return m_handle; -} - -const std::string& Shader::getName() const -{ - return m_name; -} - -bool Shader::loadFromFile(const std::string& filename) -{ - std::string src; - File file; - - // If this shader does not have a name, pick the filename. - if (m_name.length() < 1) { - m_name = Path::getBasename(filename); - } - - if (!file.open(filename)) { - m_error = "Can't open file: " + filename; - return false; - } - - // Load file into memory. - if (!file.read(src)) { - m_error = "Could not read file: " + filename; - return false; - } - - return loadFromMemory(src); -} - -bool Shader::loadFromMemory(const std::string& source) -{ - const char *s = source.c_str(); - - glShaderSource(m_handle, 1, &s, NULL); - - return compile(); -} - -const std::string& Shader::getError() const -{ - return m_error; -} - -bool Shader::isCompiled() const -{ - // A shader without handle is not compiled. - if (m_handle) { - - // Query OpenGL for status. - GLint status; - glGetShaderiv(m_handle, GL_COMPILE_STATUS, &status); - return status == GL_TRUE; - } - return false; -} - -bool Shader::compile() -{ - glCompileShader(m_handle); - - if (!isCompiled()) { - m_error = fetchErrorLog(); - return false; - } - return true; -} - -std::string Shader::fetchErrorLog() -{ - GLchar buf[4096] = { '\0' }; - - glGetShaderInfoLog(m_handle, sizeof(buf), NULL, buf); - - return std::string(buf); -} - -} // namespace sp diff --git a/source/Graphics/ShaderProgram.cpp b/source/Graphics/ShaderProgram.cpp deleted file mode 100644 index 0a0da3f..0000000 --- a/source/Graphics/ShaderProgram.cpp +++ /dev/null @@ -1,197 +0,0 @@ - -#include -#include -#include -#include - -namespace sp { - -ShaderProgram::ShaderProgram() : -m_id (0) -{ -} - -ShaderProgram::~ShaderProgram() -{ - destroy(); -} - -void ShaderProgram::create() -{ - destroy(); - - m_id = glCreateProgram(); -} - -void ShaderProgram::destroy() -{ - if (m_id > 0) { - glDeleteProgram(m_id); - m_id = 0; - } -} - -void ShaderProgram::addShader(const Shader& shader) -{ - glAttachShader(m_id, shader.getHandle()); -} - -bool ShaderProgram::loadFromFile(const std::string& filename) -{ - std::string extension = Path::getExtension(filename); - - // Meta file. load real shaders. - if (extension == "shader.glsl") { - - // FIXME: This is ugly :) - std::string base_name = filename.substr(0, filename.length() - extension.length()); - - // vert and frag are not optional. they must exist. - return loadFromFile(base_name + "vert.glsl", Shader::Type::Vertex) && - loadFromFile(base_name + "frag.glsl", Shader::Type::Fragment); - - } else if (extension == "vert.glsl") { - return loadFromFile(filename, Shader::Type::Vertex); - } else if (extension == "frag.glsl") { - return loadFromFile(filename, Shader::Type::Fragment); - } - - m_error = "Invalid file extension: " + extension; - - return false; -} - -bool ShaderProgram::loadFromFile(const std::string& filename, Shader::Type type) -{ - Shader shader(type); - - if (!shader.loadFromFile(filename)) { - m_error = shader.getName() + ": " + shader.getError(); - return false; - } - - addShader(shader); - - return true; -} - -bool ShaderProgram::loadFromMemory(const std::string& source, Shader::Type type) -{ - Shader shader(type); - - if (!shader.loadFromMemory(source)) { - m_error = shader.getError(); - return false; - } - - addShader(shader); - - return true; -} - -bool ShaderProgram::link() -{ - glLinkProgram(m_id); - - if (!isLinked()) { - m_error = fetchErrorLog(); - return false; - } - return true; -} - -bool ShaderProgram::isLinked() const -{ - // Make sure we have a id first. - if (m_id) { - - // Query OpenGL for link status. - GLint status; - glGetProgramiv(m_id, GL_LINK_STATUS, &status); - return status == GL_TRUE; - } - return false; -} - -void ShaderProgram::enable() const -{ - glUseProgram(m_id); -} - -void ShaderProgram::disable() const -{ - glUseProgram(0); -} - -std::string ShaderProgram::getLastError() const -{ - return m_error; -} - -bool ShaderProgram::setMVPMatrix(const Matrix4f& matrix) -{ - return setUniform("u_MVP", matrix); -} - -bool ShaderProgram::setUniform(const std::string& name, const Matrix4f& matrix) const -{ - int loc; - if (getUniformLoc(name, loc)) { - glUniformMatrix4fv(loc, 1, GL_FALSE, matrix.e); - return true; - } - return false; -} - -bool ShaderProgram::setAttribute(const std::string& name, const Matrix4f& matrix) const -{ - int loc; - if (getAttribLoc(name, loc)) { - glVertexAttrib4fv(loc, matrix.e); - return true; - } - return false; -} - -bool ShaderProgram::setUniform(const std::string& name, const Color& color) const -{ - int loc; - if (getUniformLoc(name, loc)) { - Vector4f c = color.toRGBAf(); - - glUniform4f(loc, c.x, c.y, c.z, c.w); - return true; - } - return false; -} - -bool ShaderProgram::getAttribLoc(const std::string& name, int& loc) const -{ - loc = glGetAttribLocation(m_id, name.c_str()); - if (loc < 0) { - m_error = "Attribute variable '" + name + "' was not found in shader."; - return false; - } - return true; -} - -bool ShaderProgram::getUniformLoc(const std::string& name, int& loc) const -{ - loc = glGetUniformLocation(m_id, name.c_str()); - if (loc < 0) { - m_error = "Uniform variable '" + name + "' was not found in shader."; - return false; - } - return true; -} - -std::string ShaderProgram::fetchErrorLog() -{ - GLchar buf[4096] = { '\0' }; - - glGetProgramInfoLog(m_id, sizeof(buf), NULL, buf); - - return std::string(buf); -} - -} // namespace sp From bb205c6ad14a14dcc68f59660c6ac1c5e927b32d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 18 Sep 2022 13:57:20 +0200 Subject: [PATCH 256/361] engine.build.lua: compile GfxDriver/ShaderProgram --- engine.build.lua | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/engine.build.lua b/engine.build.lua index 18fe860..3493812 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -135,6 +135,10 @@ local graphics_module = Module("source/Graphics", { "Graphics.cpp", }) +local gfxdrv_module = Module("source/GfxDriver", { + "ShaderProgram.cpp", +}) + local gfxdrv_opengl_module = Module("source/GfxDriver/OpenGL", { "OpenGLDrv.cpp" }) @@ -177,6 +181,7 @@ local obj = Compile(settings, { input_module, display_module, graphics_module, + gfxdrv_module, gfxdrv_opengl_module, core_module, math_module, From d7889ebac04041f46cd0f5d83cc00c305e9713b2 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 18 Sep 2022 13:58:10 +0200 Subject: [PATCH 257/361] engine.build.lua: include OpenGLShaderProgam in gfxdriver_opengl_module --- engine.build.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engine.build.lua b/engine.build.lua index 3493812..7c052de 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -140,7 +140,8 @@ local gfxdrv_module = Module("source/GfxDriver", { }) local gfxdrv_opengl_module = Module("source/GfxDriver/OpenGL", { - "OpenGLDrv.cpp" + "OpenGLDrv.cpp", + "OpenGLShaderProgram.cpp" }) local core_module = Module("source/Core", { From 99ae7f2236fe43b312b743c48479a93adf01aa24 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 18 Sep 2022 13:59:57 +0200 Subject: [PATCH 258/361] .gitignore: Add VS Code stuffs. --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 6977329..d8f3ddd 100644 --- a/.gitignore +++ b/.gitignore @@ -26,6 +26,9 @@ Thumbs.db !vsproj/* +# Visual Studio Code +.vscode/ + # Compiled Object files *.slo *.lo From c11d71aaaa4304945ab84c98f2855e57e18d854b Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 25 Sep 2022 16:31:45 +0200 Subject: [PATCH 259/361] Spectre/System/File: adding readString() --- include/Spectre/System/File.h | 3 +++ source/System/File.cpp | 15 +++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/include/Spectre/System/File.h b/include/Spectre/System/File.h index 5adb044..bc97da5 100644 --- a/include/Spectre/System/File.h +++ b/include/Spectre/System/File.h @@ -88,6 +88,9 @@ public : return read((void*) &buffer[0], s) == s; } + // Read contents into str until null (\0) + size_t readString(std::string &str); + // Write data to file at the current position. // Returns -1 if an error occured. Otherwice the number of bytes written is returned. size_t write(const void *ptr, size_t size); diff --git a/source/System/File.cpp b/source/System/File.cpp index 2cc24d3..c42e851 100644 --- a/source/System/File.cpp +++ b/source/System/File.cpp @@ -140,6 +140,21 @@ size_t File::read(void *ptr, size_t size) return -1; } +size_t File::readString(std::string &str) +{ + if (isOpen()) { + for(;;) { + int c = ::getc(m_handle); + if (c == EOF || c == '\0') { + break; + } + str.push_back(c); + } + return str.length(); + } + return -1; +} + size_t File::write(const void *ptr, size_t size) { if (isOpen()) { From 50e9300667c8aa50871929e02389723f36122c05 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 26 Sep 2022 12:03:54 +0200 Subject: [PATCH 260/361] Game/FPSCounter: change m_fps variable and getFPS() return value from float to double. MSVC complains about loss of information because sp::Time::seconds() returns double. --- include/Spectre/Game/FPSCounter.h | 4 ++-- source/Game/FPSCounter.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/Spectre/Game/FPSCounter.h b/include/Spectre/Game/FPSCounter.h index 9566fc2..4233d9e 100644 --- a/include/Spectre/Game/FPSCounter.h +++ b/include/Spectre/Game/FPSCounter.h @@ -17,7 +17,7 @@ public : // Should be called whenever a frame has been rendered. void addFrame(); - float getFPS() const; + double getFPS() const; // Set the update rate (in seconds). // How often the FPS should be sampled and calculated. @@ -42,7 +42,7 @@ private : Time m_updateRate; // Calculated Frames per second. - float m_fps; + double m_fps; }; } // namespace sp diff --git a/source/Game/FPSCounter.cpp b/source/Game/FPSCounter.cpp index 70b713c..3de2b38 100644 --- a/source/Game/FPSCounter.cpp +++ b/source/Game/FPSCounter.cpp @@ -16,7 +16,7 @@ void FPSCounter::addFrame() m_count++; } -float FPSCounter::getFPS() const +double FPSCounter::getFPS() const { return m_fps; } From 736f30c33acfb499a2990bf21d6e9ba03f0b5247 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 26 Sep 2022 14:11:17 +0200 Subject: [PATCH 261/361] source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp: remove unused variable --- source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp b/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp index f9bb0ad..af6017c 100644 --- a/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp +++ b/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp @@ -150,7 +150,6 @@ std::string OpenGLShaderProgram::fetchErrorLog() const bool OpenGLShaderProgram::compileShader(GLuint id) { glCompileShader(id); - GLenum err; // Query OpenGL for status. GLint status; From b6446e129b018c22c2c4613db9a85da38a22af6d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 26 Sep 2022 14:11:38 +0200 Subject: [PATCH 262/361] source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp: Whitespace fix. --- source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp b/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp index af6017c..f5f7111 100644 --- a/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp +++ b/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp @@ -10,7 +10,7 @@ OpenGLShaderProgram::OpenGLShaderProgram() } -OpenGLShaderProgram::~OpenGLShaderProgram() +OpenGLShaderProgram::~OpenGLShaderProgram() { if (m_id > 0) { glDeleteProgram(m_id); @@ -178,7 +178,7 @@ bool OpenGLShaderProgram::attachShader(GLuint id) } else if (err != GL_NO_ERROR) { m_error = "Unkown Error"; return false; - } + } return true; } From cb4274bb1cbd0c138b22ac1ca14bada7be588564 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 26 Sep 2022 14:12:47 +0200 Subject: [PATCH 263/361] source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp: Indent fix. --- .../GfxDriver/OpenGL/OpenGLShaderProgram.cpp | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp b/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp index f5f7111..829bf8b 100644 --- a/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp +++ b/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp @@ -151,16 +151,16 @@ bool OpenGLShaderProgram::compileShader(GLuint id) { glCompileShader(id); - // Query OpenGL for status. - GLint status; - glGetShaderiv(id, GL_COMPILE_STATUS, &status); - if (status == GL_FALSE) { - GLchar buf[4096] = { '\0' }; - glGetShaderInfoLog(id, sizeof(buf), NULL, buf); - m_error = std::string(buf); - return false; - } - return true; + // Query OpenGL for status. + GLint status; + glGetShaderiv(id, GL_COMPILE_STATUS, &status); + if (status == GL_FALSE) { + GLchar buf[4096] = { '\0' }; + glGetShaderInfoLog(id, sizeof(buf), NULL, buf); + m_error = std::string(buf); + return false; + } + return true; } bool OpenGLShaderProgram::attachShader(GLuint id) From 2dc8050ce33cd3100b360cccf2e43d61344b1c4d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 26 Sep 2022 22:22:25 +0200 Subject: [PATCH 264/361] Adding CMake again :) --- CMakeLists.txt | 42 ++++++ cmake/Macros.cmake | 7 + cmake/SpectreConfig.cmake.in | 31 +++++ engine.cmake | 224 ++++++++++++++++++++++++++++++++ examples/CMakeLists.txt | 7 + examples/display/CMakeLists.txt | 12 ++ examples/events/CMakeLists.txt | 7 + examples/input/CMakeLists.txt | 7 + examples/text/CMakeLists.txt | 7 + vendor/FreeType2/CMakeLists.txt | 40 ++++++ 10 files changed, 384 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 cmake/Macros.cmake create mode 100644 cmake/SpectreConfig.cmake.in create mode 100644 engine.cmake create mode 100644 examples/CMakeLists.txt create mode 100644 examples/display/CMakeLists.txt create mode 100644 examples/events/CMakeLists.txt create mode 100644 examples/input/CMakeLists.txt create mode 100644 examples/text/CMakeLists.txt create mode 100644 vendor/FreeType2/CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..1b32dec --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,42 @@ +# ------------------------------------------------------------ +# +# Spectre main Cmake config +# +# ------------------------------------------------------------ +cmake_minimum_required(VERSION 3.15) +cmake_policy(SET CMP0091 NEW) + + +# set the project name +project(Spectre + VERSION 0.0.1 + DESCRIPTION "" + HOMEPAGE_URL "") + +set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_LIST_DIR}/cmake" ) + +include(GNUInstallDirs) + +# Compiler +# ------------------------------- + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED True) +set(CMAKE_CXX_EXTENSIONS OFF) + +if (MSVC) + add_definitions("/EHsc -D_CRT_SECURE_NO_WARNINGS") + + # Staticly link with MSVCR + set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") +endif (MSVC) + + +# Variables +# ------------------------------- + +# Include engine +include(engine.cmake) + +# Include examples +add_subdirectory(examples) \ No newline at end of file diff --git a/cmake/Macros.cmake b/cmake/Macros.cmake new file mode 100644 index 0000000..3419cd0 --- /dev/null +++ b/cmake/Macros.cmake @@ -0,0 +1,7 @@ + +function(spectre_example NAME) + add_executable(example_${NAME} ${ARGN}) + target_link_libraries(example_${NAME} PRIVATE Spectre) + set_target_properties(example_${NAME} PROPERTIES VS_GLOBAL_IgnoreImportLibrary "true") + #set_target_properties(${NAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}") +endfunction() \ No newline at end of file diff --git a/cmake/SpectreConfig.cmake.in b/cmake/SpectreConfig.cmake.in new file mode 100644 index 0000000..3b3cf18 --- /dev/null +++ b/cmake/SpectreConfig.cmake.in @@ -0,0 +1,31 @@ +# This script provides the spectre as an import target +# ---------------------------------------------------------- +# +# Use find_package() so cmake will find spectre: +# +# find_package(spectre) # No specific version +# find_package(spectre REQUIRED) # No specific version, but the library must be found. +# find_package(spectre 0.1) # any 0.1.x, but the library is optional. +# find_package(spectre 0.1.0) # 0.1.0 or greater, but the library is optional. +# +# Then you just link your target with spectre: +# +# target_link_libraries( ${PROGRAM_EXE} PUBLIC spectre ) +# +# if you do not specify REQUIRED. you must check the variable spectre_FOUND +# and and only link to it if it's defined: +# +# if (spectre_FOUND) +# ... +# target_link_libraries( ${PROGRAM_EXE} PUBLIC spectre ) +# .. +# endif() + +@PACKAGE_INIT@ + +find_package(OpenGL) + +set_and_check( SPECTRE_ASSETS "@PACKAGE_ASSETS_DIR@" ) + +include("${CMAKE_CURRENT_LIST_DIR}/SpectreTargets.cmake") +check_required_components(Spectre) \ No newline at end of file diff --git a/engine.cmake b/engine.cmake new file mode 100644 index 0000000..ed62b4e --- /dev/null +++ b/engine.cmake @@ -0,0 +1,224 @@ +# ------------------------------------------------------------ +# +# Engine library build config +# +# ------------------------------------------------------------ + +# Source +# ------------------------------------------------------------ + +set( ENGINE_SRC + # Core + source/Core/String.cpp + + # System + source/System/ByteOrder.cpp + source/System/Event.cpp + source/System/EventListener.cpp + source/System/File.cpp + source/System/Log.cpp + source/System/MessageHandler.cpp + source/System/MessageQueue.cpp + source/System/Path.cpp + source/System/Stopwatch.cpp + + # Platform + source/Platform/PlatformApplication.cpp + source/Platform/PlatformDisplay.cpp + + # Math + source/Math/Color.cpp + source/Math/Logarithm.cpp + source/Math/Time.cpp + source/Math/Transform.cpp + source/Math/Math.cpp + + # Input + source/Input/InputDevice.cpp + source/Input/InputModule.cpp + source/Input/Keyboard.cpp + source/Input/Mouse.cpp + + # Display + source/Display/Display.cpp + source/Display/DisplayDescription.cpp + source/Display/DisplayMode.cpp + source/Display/GLContext.cpp + + # GfxDriver + source/GfxDriver/ShaderProgram.cpp + + # Graphics + source/Graphics/BatchRenderer2D.cpp + source/Graphics/DefaultRenderer2D.cpp + source/Graphics/Renderable2D.cpp + source/Graphics/Renderer2D.cpp + source/Graphics/RenderState.cpp + source/Graphics/Sprite.cpp + source/Graphics/Text.cpp + source/Graphics/Texture.cpp + source/Graphics/Transformable.cpp + source/Graphics/Vertex2D.cpp + source/Graphics/Graphics.cpp + + # Graphics - Font + source/Graphics/Font/Engine/FreeTypeEngine.cpp + source/Graphics/Font/Engine/FreeTypeError.cpp + source/Graphics/Font/Engine/FreeTypeLib.cpp + source/Graphics/Font/FontDescription.cpp + source/Graphics/Font.cpp + + # Graphics - Image + source/Graphics/Image/IcoFormat.cpp + source/Graphics/ImageLoader.cpp + source/Graphics/PixelFormat.cpp + source/Graphics/Image.cpp + + # Graphics - GL + source/Graphics/GL/glad.c + source/Graphics/GL/CheckError.cpp + + # Scene + source/Scene/Camera2D.cpp + + # Game + source/Game/FPSCounter.cpp + source/Game/GameTime.cpp + source/Game.cpp +) + +set(ENGINE_GFXDRIVER_OPENGL_SRC + source/GfxDriver/OpenGL/OpenGLDrv.cpp + source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp +) + +set(ENGINE_PLATFORM_WIN32_SRC + source/Platform/Win32/Win32Application.cpp + source/Platform/Win32/Win32Display.cpp + source/Platform/Win32/Win32GLContext.cpp + source/Platform/Win32/Win32Input.cpp + source/Platform/Win32/Win32Internal.cpp + source/Platform/Win32/Win32Keyboard.cpp + source/Platform/Win32/Win32Misc.cpp + source/Platform/Win32/Win32Mouse.cpp + source/Platform/Win32/Win32EventQueue.cpp + source/Platform/Win32/Win32System.cpp + source/Platform/Win32/glad_wgl.c +) + +set(ENGINE_PLATFORM_UNIX_SRC + source/Platform/X11/Xlib.cpp + source/Platform/X11/UnixApplication.cpp + source/Platform/X11/X11Display.cpp + source/Platform/X11/GLXContext.cpp + source/Platform/X11/X11Input.cpp + source/Platform/X11/X11Keyboard.cpp + source/Platform/X11/X11Mouse.cpp + source/Platform/X11/X11EventQueue.cpp + source/Platform/X11/X11WindowEventHandler.cpp + source/Platform/X11/UnixMisc.cpp + source/Platform/X11/UnixSystem.cpp + source/Platform/X11/glad_glx.c +) + + +# Library +# ------------------------------------------------------------ + +add_library( Spectre STATIC ${ENGINE_SRC} ) +target_include_directories(Spectre + PUBLIC + $ + $ + PRIVATE + ${CMAKE_CURRENT_LIST_DIR}/source +) + +if (WIN32) + target_compile_options(Spectre PRIVATE "-DSPECTRE_PLATFORM_WIN=1") +else() + target_compile_options(Spectre PRIVATE "-DSPECTRE_PLATFORM_UNIX=1") +endif() + + +# Dependancies +# ------------------------------------------------------------ + +# Select platform. +if (WIN32) + target_sources(Spectre PRIVATE ${ENGINE_PLATFORM_WIN32_SRC}) +else() + target_sources(Spectre PRIVATE ${ENGINE_PLATFORM_UNIX_SRC}) +endif (WIN32) + +# Select graphics API + +# Only OpenGL Driver for now +find_package(OpenGL REQUIRED) +target_sources(Spectre PRIVATE ${ENGINE_GFXDRIVER_OPENGL_SRC}) +target_link_libraries(Spectre PRIVATE OpenGL::GL) + +# FreeType +add_subdirectory(vendor/FreeType2) +target_sources(Spectre PRIVATE $) +target_include_directories(Spectre PRIVATE $) + +# STB +target_include_directories(Spectre PRIVATE ${CMAKE_CURRENT_LIST_DIR}/vendor/stb/include) + +# Install +# ------------------------------------------------------------ + +# Includes +install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/Spectre TYPE INCLUDE) + +# Assets +install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/assets DESTINATION ${CMAKE_INSTALL_DATADIR}) + + +# Install - CMake targets +# ------------------------------------------------------------ + +install(TARGETS Spectre + EXPORT SpectreTargets + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} +) + +install(EXPORT SpectreTargets + FILE SpectreTargets.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Spectre +) + +# Build directory target +export(EXPORT SpectreTargets + FILE "${CMAKE_CURRENT_BINARY_DIR}/SpectreTargets.cmake" +) + +# CMake config +# ------------------------------------------------------------ + +# Version +include(CMakePackageConfigHelpers) +write_basic_package_version_file(SpectreConfigVersion.cmake COMPATIBILITY SameMajorVersion) + +set (ASSETS_DIR ${CMAKE_INSTALL_DATADIR}/assets) +configure_package_config_file(cmake/SpectreConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/cmake/SpectreConfig.cmake + INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Spectre + PATH_VARS ASSETS_DIR) + +install(FILES ${CMAKE_CURRENT_BINARY_DIR}/cmake/SpectreConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/SpectreConfigVersion.cmake + DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Spectre) + +# CMake config - build directory +# ------------------------------------------------------------ +set (ASSETS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/assets) +configure_package_config_file(cmake/SpectreConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/SpectreConfig.cmake + INSTALL_DESTINATION ${CMAKE_CURRENT_BINARY_DIR} + INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR} + PATH_VARS ASSETS_DIR) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 0000000..a9890c3 --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,7 @@ + +include("Macros") + +add_subdirectory(display) +add_subdirectory(events) +add_subdirectory(input) +add_subdirectory(text) \ No newline at end of file diff --git a/examples/display/CMakeLists.txt b/examples/display/CMakeLists.txt new file mode 100644 index 0000000..05e659d --- /dev/null +++ b/examples/display/CMakeLists.txt @@ -0,0 +1,12 @@ + +#find_package(Spectre REQUIRED) + +set (SOURCE + DisplayExample.cpp + main.cpp +) + +spectre_example(display + main.cpp + DisplayExample.cpp +) diff --git a/examples/events/CMakeLists.txt b/examples/events/CMakeLists.txt new file mode 100644 index 0000000..f8d92bf --- /dev/null +++ b/examples/events/CMakeLists.txt @@ -0,0 +1,7 @@ + +#find_package(Spectre REQUIRED) + +spectre_example(events + main.cpp + EventsExample.cpp +) diff --git a/examples/input/CMakeLists.txt b/examples/input/CMakeLists.txt new file mode 100644 index 0000000..e4a0184 --- /dev/null +++ b/examples/input/CMakeLists.txt @@ -0,0 +1,7 @@ + +#find_package(Spectre REQUIRED) + +spectre_example(input + main.cpp + InputExample.cpp +) diff --git a/examples/text/CMakeLists.txt b/examples/text/CMakeLists.txt new file mode 100644 index 0000000..31f56d1 --- /dev/null +++ b/examples/text/CMakeLists.txt @@ -0,0 +1,7 @@ + +#find_package(Spectre REQUIRED) + +spectre_example(text + main.cpp + Game.cpp +) diff --git a/vendor/FreeType2/CMakeLists.txt b/vendor/FreeType2/CMakeLists.txt new file mode 100644 index 0000000..d6636e0 --- /dev/null +++ b/vendor/FreeType2/CMakeLists.txt @@ -0,0 +1,40 @@ +# ------------------------------------------------------------ +# +# Spectre FreeType config +# +# ------------------------------------------------------------ + +set(FT2_SOURCE + src/autofit/autofit.c + src/base/ftbase.c + src/base/ftbbox.c + src/base/ftbdf.c + src/base/ftbitmap.c + src/base/ftcid.c + src/base/ftfstype.c + src/base/ftgasp.c + src/base/ftglyph.c + src/base/ftgxval.c + src/base/ftinit.c + src/base/ftmm.c + src/base/ftotval.c + src/base/ftpatent.c + src/base/ftpfr.c + src/base/ftstroke.c + src/base/ftsynth.c + src/base/ftsystem.c + src/base/fttype1.c + src/base/ftwinfnt.c + src/cff/cff.c + src/psaux/psaux.c + src/pshinter/pshinter.c + src/psnames/psnames.c + src/raster/raster.c + src/sfnt/sfnt.c + src/smooth/smooth.c + src/truetype/truetype.c +) + +add_library( freetype OBJECT ${FT2_SOURCE} ) +target_include_directories(freetype PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include) +target_compile_definitions(freetype PRIVATE FT2_BUILD_LIBRARY) From 0406a38895d3391ce66a67445df30551242671a7 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 26 Sep 2022 22:23:43 +0200 Subject: [PATCH 265/361] vendor/stb/include/stb_image_write.h: Remove _CTR_SECURE_NO_WARNINGS as we define it in cmake. --- vendor/stb/include/stb_image_write.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/vendor/stb/include/stb_image_write.h b/vendor/stb/include/stb_image_write.h index e1a31cb..6f0804b 100644 --- a/vendor/stb/include/stb_image_write.h +++ b/vendor/stb/include/stb_image_write.h @@ -98,12 +98,12 @@ CREDITS: github:Chribba Guillaume Chereau github:jry2 - + LICENSE This software is in the public domain. Where that dedication is not recognized, you are granted a perpetual, irrevocable license to copy, -distribute, and modify this file as you see fit. +distribute, and modify this file as you see fit. */ @@ -144,7 +144,7 @@ STBIWDEF int stbi_write_hdr_to_func(stbi_write_func *func, void *context, int w, #ifdef STB_IMAGE_WRITE_IMPLEMENTATION #ifdef _WIN32 - #define _CRT_SECURE_NO_WARNINGS + // #define _CRT_SECURE_NO_WARNINGS #define _CRT_NONSTDC_NO_DEPRECATE #endif From 36af790293cf6402cbc8f25f65c96a7e39fadbb0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 26 Sep 2022 22:31:43 +0200 Subject: [PATCH 266/361] Remove bam --- .bam/compilers.lua | 33 ---- .bam/functions.lua | 83 ----------- .bam/path.lua | 16 -- .bam/utils.lua | 22 --- .gitignore | 2 - bam.lua | 98 ------------ engine.build.lua | 215 --------------------------- examples/build.lua | 26 ---- examples/display/bam.lua | 7 - examples/events/bam.lua | 7 - examples/input/bam.lua | 7 - examples/text/bam.lua | 7 - vendor/FreeType2/build.lua | 58 -------- vendor/FreeType2/src/base/module.lua | 10 -- 14 files changed, 591 deletions(-) delete mode 100644 .bam/compilers.lua delete mode 100644 .bam/functions.lua delete mode 100644 .bam/path.lua delete mode 100644 .bam/utils.lua delete mode 100644 bam.lua delete mode 100644 engine.build.lua delete mode 100644 examples/build.lua delete mode 100644 examples/display/bam.lua delete mode 100644 examples/events/bam.lua delete mode 100644 examples/input/bam.lua delete mode 100644 examples/text/bam.lua delete mode 100644 vendor/FreeType2/build.lua delete mode 100644 vendor/FreeType2/src/base/module.lua diff --git a/.bam/compilers.lua b/.bam/compilers.lua deleted file mode 100644 index 8545c8b..0000000 --- a/.bam/compilers.lua +++ /dev/null @@ -1,33 +0,0 @@ - -Import("path.lua") - -function CustomCompileC(settings, input) - local cc = settings.cc - local outname = cc.Output(settings, input) .. cc.extension - cc.DriverC(settings.labelprefix .. "c " .. ModuleRelative(input), outname, input, settings) - AddDependency(outname, input) - if not IsOutput(input) then - bam_add_dependency_cpp(input) - end - return outname -end - -function CustomCompileCXX(settings, input) - local cc = settings.cc - local outname = cc.Output(settings, input) .. cc.extension - cc.DriverCXX(settings.labelprefix .. "c++ " .. ModuleRelative(input), outname, input, settings) - AddDependency(outname, input) - if not IsOutput(input) then - bam_add_dependency_cpp(input) - end - return outname -end - -function SetCompilers(settings) - settings.compile.mappings["c"] = CustomCompileC - - settings.compile.mappings["cpp"] = CustomCompileCXX - settings.compile.mappings["cxx"] = CustomCompileCXX - settings.compile.mappings["c++"] = CustomCompileCXX - settings.compile.mappings["cc"] = CustomCompileCXX -end diff --git a/.bam/functions.lua b/.bam/functions.lua deleted file mode 100644 index 3159891..0000000 --- a/.bam/functions.lua +++ /dev/null @@ -1,83 +0,0 @@ - -Import("path.lua") -Import("utils.lua") - -local _systems = { - "Win32", - "Unix" -} - - --- Returns a string of all supported systems -function supported_systems() - return table.concat(_systems, ', ') -end - - --- Return True if 'value' is a supported system. False otherwise. -function valid_system(value) - return contains(_systems, value) -end - - --- Find what host system we are on. --- Returns nil if system could not be determined. -function host_system() - - -- Check "platform" variable set by bam first. - if platform == "win32" or platform == "win64" then - return _systems[1] - end - if platform == "linux" then - return _systems[2] - end - - -- next, check if we are on windows by checking - -- the 'OS' environment variable - local win = os.getenv('OS') - if win ~= nil and win:lower():match('windows') then - return _systems[1] - end - - return nil -end - -function SetSettingsPrefix(settings, prefix) - settings.labelprefix = string.format("[%s] ", prefix) -end - --- Copy settings with a optional label prefix. -function CopySettings(settings, prefix) - local n = TableDeepCopy(settings) - if prefix ~= nil then - SetSettingsPrefix(n, prefix) - end - return n -end - --- Defines a module --- path: base path to source files. --- src: table of source files. -function Module(path, src) - path = RelPath(path) - local r = {} - for k, v in pairs(src) do - r[k] = PathJoin(path, v) - end - return r -end - --- Copy a directory src to dst --- src = "path/to/a", dest = "path/to/b" -> the whole content --- of "a" will be copied to "path/to/b" -function CopyDir(dst, src) - local r = {} - local base = PathDir(src) - local files = CollectRecursive(Path(src) .. "/*") - - for k, v in pairs(files) do - local rdir = PathDir(v:sub(base:len() + 1)) - r[k] = CopyToDirectory(PathJoin(dst, rdir), v) - end - return r -end diff --git a/.bam/path.lua b/.bam/path.lua deleted file mode 100644 index bcfd657..0000000 --- a/.bam/path.lua +++ /dev/null @@ -1,16 +0,0 @@ - --- Like ModuleFilename but only return the directory path -function ModuleDir() - return PathDir(ModuleFilename()) -end - --- Strip ModuleDir() of the beginning of path -function ModuleRelative(path) - return string.gsub(path, "^" .. ModuleDir() .. "/", "") -end - --- Make the path relative to the current working directory --- and ModuleDir() -function RelPath(path) - return PathJoin(ModuleDir(), path) -end diff --git a/.bam/utils.lua b/.bam/utils.lua deleted file mode 100644 index be68000..0000000 --- a/.bam/utils.lua +++ /dev/null @@ -1,22 +0,0 @@ - --- Returns True if 'table' contains the value 'val'. False otherwise. -function contains(table, val) - for i=1, #table do - if table[i] == val then - return true - end - end - return false -end - -function TableMerge(a, b) - local r = TableDeepCopy(a) - for k,v in pairs(b) do - if IsTable(v) then - r[k] = TableMerge(r[k] or {}, v) - else - r[k] = v - end - end - return r -end diff --git a/.gitignore b/.gitignore index d8f3ddd..3ff3458 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,6 @@ # Build system related files build/ -.bam/* -!.bam/*.lua # Thumbnail databases (Windows) Thumbs.db diff --git a/bam.lua b/bam.lua deleted file mode 100644 index 3f6a260..0000000 --- a/bam.lua +++ /dev/null @@ -1,98 +0,0 @@ --------------------------------- --- -- --- Spectre build config -- --- -- --------------------------------- -Import(".bam/path.lua") -Import(".bam/utils.lua") -Import(".bam/functions.lua") -Import(".bam/compilers.lua") -CheckVersion("0.5") - --------------------------------- --- -- --- Environment Setup -- --- -- --------------------------------- - --- Target specified on command line or get host system. -TARGET_OS = ScriptArgs.target or host_system() - -if not valid_system(TARGET_OS) then - print ("System not supported" ) - print ("Supported systems are: " .. supported_systems() ) - return 1 -end - --- paths used when building. -paths = { - -- Root build directory. - build = ScriptArgs.build_dir or "build", - - -- Directory where internal object/libs files are - -- stored to produce the final library. - intermediate = PathJoin("spectre", TARGET_OS), - - object = "obj", - examples = "examples_" .. TARGET_OS -} - --------------------------------- --- -- --- Global Build Settings -- --- -- --------------------------------- - -global_settings = NewSettings(); - --- Build type --------------------------------- -global_settings.debug = 1 -global_settings.optimize = 0 - -if ScriptArgs.type ~= nil and ScriptArgs.type:match("^release") then - global_settings.debug = 0 - if ScriptArgs.type == "release-fast" then - global_settings.optimize = 1 - end -end - - --- Compilers --------------------------------- -SetCompilers(global_settings) - --- Output configuration --------------------------------- - --- Output path for static libraries. -global_settings.lib.prefix = Path(paths.build) .. "/" - -global_settings.link.Output = function(settings, input) - return Path(PathJoin(paths.build, input)) -end - -global_settings.cc.Output = function(settings, input) - local path = PathJoin(paths.build, paths.intermediate) - return Path(PathJoin(PathJoin(path, paths.object), PathBase(input))) -end - --- Compiler configuration --------------------------------- - --- MSVC complains about exception handler without this flag. -if global_settings.cc.exe_cxx == "cl" then - global_settings.cc.flags:Add('/EHsc') -end - --------------------------------- --- -- --- Build Targets -- --- -- --------------------------------- - -Import("engine.build.lua") -Import("examples/build.lua") - --- Set engine library as default target -DefaultTarget(libspectre) diff --git a/engine.build.lua b/engine.build.lua deleted file mode 100644 index 7c052de..0000000 --- a/engine.build.lua +++ /dev/null @@ -1,215 +0,0 @@ ------------------------------------------------------------ --- -- --- Engine configuration -- --- -- --- Builds Spectre engine as static library. -- --- -- --- Output variables: -- --- libspectre = path to .lib file -- ------------------------------------------------------------ -Import(".bam/path.lua") - -local settings = CopySettings(global_settings, "Spectre") - -settings.cc.includes:Add( - RelPath("include/"), - RelPath("source/"), - -- STB - RelPath("vendor/stb/include") -) - -if global_settings.debug then - settings.cc.flags:Add("-DSPECTRE_DEBUG") -end - --- Platform -if TARGET_OS == "Win32" then - settings.cc.defines:Add("SPECTRE_PLATFORM_WIN=1") -elseif TARGET_OS == "Unix" then - settings.cc.defines:Add("SPECTRE_PLATFORM_UNIX=1") -end - --- FreeType2 -if TARGET_OS == "Win32" then - settings.cc.includes:Add(RelPath("vendor/FreeType2/include")) -else - settings.cc.includes:Add("/usr/include/freetype2") -end - --- Source files ------------------------------------------------------------ - -local system_module = Module("source/System", { - "ByteOrder.cpp", - "File.cpp", - "Path.cpp", - "MessageHandler.cpp", - "MessageQueue.cpp", - "Event.cpp", - "EventListener.cpp", - "Log.cpp", - "Stopwatch.cpp" -}) - -local platform_common_module = Module("source/Platform", { - "PlatformApplication.cpp", - "PlatformDisplay.cpp" -}) - -if TARGET_OS == "Win32" then - platform_spec_module = Module("source/Platform/Win32", { - "Win32Application.cpp", - "Win32Display.cpp", - "Win32GLContext.cpp", - "Win32Input.cpp", - "Win32Internal.cpp", - "Win32Keyboard.cpp", - "Win32Misc.cpp", - "Win32Mouse.cpp", - "Win32EventQueue.cpp", - "Win32System.cpp", - "glad_wgl.c" - }) -elseif TARGET_OS == "Unix" then - platform_spec_module = Module("source/Platform/Unix", { - "Xlib.cpp", - "UnixApplication.cpp", - "X11Display.cpp", - "GLXContext.cpp", - "X11Input.cpp", - "X11Keyboard.cpp", - "X11Mouse.cpp", - "X11EventQueue.cpp", - "X11WindowEventHandler.cpp", - "UnixMisc.cpp", - "UnixSystem.cpp", - "glad_glx.c" - }) -end - -local input_module = Module("source/Input", { - "InputDevice.cpp", - "InputModule.cpp", - "Keyboard.cpp", - "Mouse.cpp" -}) - -local display_module = Module("source/Display", { - "Display.cpp", - "DisplayDescription.cpp", - "DisplayMode.cpp", - "GLContext.cpp" -}) - -local graphics_module = Module("source/Graphics", { - -- Primitives - "Vertex2D.cpp", - "Transformable.cpp", - "Sprite.cpp", - - -- Rendering - "BatchRenderer2D.cpp", - "DefaultRenderer2D.cpp", - "Renderable2D.cpp", - "Renderer2D.cpp", - "RenderState.cpp", - "Texture.cpp", - - -- Text - "Font/Engine/FreeTypeEngine.cpp", - "Font/Engine/FreeTypeError.cpp", - "Font/Engine/FreeTypeLib.cpp", - "Font/FontDescription.cpp", - "Font.cpp", - "Text.cpp", - - -- Image - "Image.cpp", - "ImageLoader.cpp", - "Image/IcoFormat.cpp", - "PixelFormat.cpp", - - "GL/glad.c", - "GL/CheckError.cpp", - - "Graphics.cpp", -}) - -local gfxdrv_module = Module("source/GfxDriver", { - "ShaderProgram.cpp", -}) - -local gfxdrv_opengl_module = Module("source/GfxDriver/OpenGL", { - "OpenGLDrv.cpp", - "OpenGLShaderProgram.cpp" -}) - -local core_module = Module("source/Core", { - "String.cpp" -}) - -local math_module = Module("source/Math", { - "Color.cpp", - "Logarithm.cpp", - "Math.cpp", - "Transform.cpp", - "Time.cpp" -}) - -local game_module = Module("source", { - "Game/FPSCounter.cpp", - "Game/GameTime.cpp", - "Game.cpp", -}) - -local scene_module = Module("source/Scene", { - "Camera2D.cpp" -}) - --- Build target ------------------------------------------------------------ - --- Dependancies -if TARGET_OS == "Win32" then - Import("vendor/FreeType2/build.lua") -end - --- engine -local obj = Compile(settings, { - system_module, - platform_common_module, - platform_spec_module, - input_module, - display_module, - graphics_module, - gfxdrv_module, - gfxdrv_opengl_module, - core_module, - math_module, - game_module, - scene_module -}) - -libspectre = StaticLibrary(settings, - "spectre", - obj, - libfreetype -) - --- Export settings ------------------------------------------------------------ -local exp = NewSettings() - --- Headers -exp.cc.includes:Add(RelPath("include")) - --- Additional libraries. -if TARGET_OS == "Win32" then - -- Windows needs to link against these. - exp.link.libs:Add("opengl32", "gdi32", "user32") -elseif TARGET_OS == "Unix" then - -- Unix nees dl and X11 libs and freetype - exp.link.libs:Add("dl", 'X11', 'Xrandr', 'freetype') -end - -libspectre_settings = exp diff --git a/examples/build.lua b/examples/build.lua deleted file mode 100644 index 546e0f4..0000000 --- a/examples/build.lua +++ /dev/null @@ -1,26 +0,0 @@ --------------------------------- --- -- --- Examples -- --- -- --------------------------------- - - -local settings = TableMerge(libspectre_settings, global_settings) -SetSettingsPrefix(settings, "Examples") - --- Link with spectre. -settings.link.extrafiles:Add(libspectre) - --- For now, to get examples working --- we copy the whole assets directory. -assets = CopyDir(PathJoin(paths.build, paths.examples), "assets") - -examples = {} -for k, name in pairs(CollectDirs("examples/*")) do - Import(PathJoin(name, "bam.lua")) - exe = Link(settings, PathJoin(paths.examples, PathFilename(name)), Compile(settings, src)) - AddDependency(exe, assets) - table.insert(examples, exe) -end - -PseudoTarget("examples", examples) diff --git a/examples/display/bam.lua b/examples/display/bam.lua deleted file mode 100644 index 8e16b24..0000000 --- a/examples/display/bam.lua +++ /dev/null @@ -1,7 +0,0 @@ - -local base = PathDir(ModuleFilename()) - -src ={ - base .. "/main.cpp", - base .. "/DisplayExample.cpp" -} diff --git a/examples/events/bam.lua b/examples/events/bam.lua deleted file mode 100644 index fa428ca..0000000 --- a/examples/events/bam.lua +++ /dev/null @@ -1,7 +0,0 @@ - -local base = PathDir(ModuleFilename()) - -src ={ - base .. "/main.cpp", - base .. "/EventsExample.cpp" -} diff --git a/examples/input/bam.lua b/examples/input/bam.lua deleted file mode 100644 index 6cf60e3..0000000 --- a/examples/input/bam.lua +++ /dev/null @@ -1,7 +0,0 @@ - -local base = PathDir(ModuleFilename()) - -src ={ - base .. "/main.cpp", - base .. "/InputExample.cpp" -} diff --git a/examples/text/bam.lua b/examples/text/bam.lua deleted file mode 100644 index 20b54a5..0000000 --- a/examples/text/bam.lua +++ /dev/null @@ -1,7 +0,0 @@ - -local base = PathDir(ModuleFilename()) - -src ={ - base .. "/main.cpp", - base .. "/Game.cpp" -} \ No newline at end of file diff --git a/vendor/FreeType2/build.lua b/vendor/FreeType2/build.lua deleted file mode 100644 index 0540587..0000000 --- a/vendor/FreeType2/build.lua +++ /dev/null @@ -1,58 +0,0 @@ ------------------------------------------------------------ --- -- --- FreeType2 build config -- --- -- --- Output variables: -- --- libfreetype = path to .lib file -- ------------------------------------------------------------ - --- Modules --------------------------------- -local ft_modules = { - "base", - "autofit", - "cff", - "psaux", - "pshinter", - "psnames", - "raster", - "sfnt", - "smooth", - "truetype", -} - --- Settings --------------------------------- -local settings = TableDeepCopy(global_settings) -SetSettingsPrefix(settings, "FT2") - --- Compile flags -settings.cc.includes:Add(RelPath("include")) -settings.cc.flags:Add("-DFT2_BUILD_LIBRARY") - --- Build target --------------------------------- - -local obj = {} - --- Compile each module to object files. -for k,name in pairs(ft_modules) do - local mod_base = RelPath("src/" .. name) - local module_file = PathJoin(mod_base, "module.lua") - - -- Check if we have a module.lua file - -- that defines the modules sources - local f = io.open(module_file) - if f then - Import(module_file) - else - -- Otherwise, We assume there is a .c - src = PathJoin(mod_base, string.format("%s.c", name)) - end - - obj[name] = Compile(settings, src) - PseudoTarget("ft2_" .. name, obj[name]) -end - -libfreetype = StaticLibrary(settings, "freetype", obj) -PseudoTarget("ft2", libfreetype) diff --git a/vendor/FreeType2/src/base/module.lua b/vendor/FreeType2/src/base/module.lua deleted file mode 100644 index e6309d5..0000000 --- a/vendor/FreeType2/src/base/module.lua +++ /dev/null @@ -1,10 +0,0 @@ - -src = Module(".", { - "ftbase.c", - "ftinit.c", - "ftsystem.c", - "ftmm.c", - "ftstroke.c", - "ftglyph.c", - "ftbitmap.c" -}) From 6007f52194d595b4d6d7d382a3bb1fcbfdc10955 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 26 Sep 2022 22:41:45 +0200 Subject: [PATCH 267/361] README.md: Update with cmake info. --- README.md | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 61e911d..c79c540 100644 --- a/README.md +++ b/README.md @@ -4,17 +4,37 @@ A simple 2D Game engine from scratch! ## Compiling -This project uses [bam](http://matricks.github.io/bam/) build system -(Version 0.5 or greater) to compile the engine. +This project uses [cmake](https://cmake.org) build system +(Version 3.15 or greater) to compile the engine. -Just running `bam` in this directory will start build the source. +### Linux with make. +``` +$ mkdir build +$ cd build +$ cmake .. -G "Unix Makefiles" +$ make +``` + +### Windows using NMake +``` +$ mkdir build +$ cd build +$ cmake .. -G "NMake Makefiles" +$ nmake +``` + +### Or the best way (in my opinion) +install [Ninja](https://ninja-build.org) and run +``` +$ mkdir build +$ cd build +$ cmake .. -G Ninja +$ ninja +``` The build will produce `spectre.lib` in the `build` directory that should be used when linking. -You will also need to link against `FreeType2` that is located in -`vendor/FreeType2/lib/x<86|64>/freetype-s.lib` (or `freetype-d-s.lib` -for debug version) ## Author From f2fc9d46b8a57c98f5350d9d7959b56f972a3626 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 30 Sep 2022 23:35:36 +0200 Subject: [PATCH 268/361] Revert "include/Spectre/Display/DisplayDescription.h: change Empty to None" This reverts commit 7c23f5dfd94fb6b0e9e5ec8a04d65b5f73df20dd. `None` is defined in X11. --- include/Spectre/Display/DisplayDescription.h | 2 +- source/Display/Display.cpp | 2 +- source/Platform/Win32/Win32Display.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/Spectre/Display/DisplayDescription.h b/include/Spectre/Display/DisplayDescription.h index 0d6539b..06067e0 100644 --- a/include/Spectre/Display/DisplayDescription.h +++ b/include/Spectre/Display/DisplayDescription.h @@ -9,7 +9,7 @@ namespace sp { namespace DisplayDecorate { enum Type { - None = 0, + Empty = 0, Menu = 1 << 0, Resize = 1 << 1, Close = 1 << 2, diff --git a/source/Display/Display.cpp b/source/Display/Display.cpp index b7a3135..3c9202b 100644 --- a/source/Display/Display.cpp +++ b/source/Display/Display.cpp @@ -118,7 +118,7 @@ void Display::setVideoMode(Mode mode) // Windowed fullscreen. else if (mode == WINDOWEDFULLSCREEN) { DisplayMode desktop = DisplayMode::getDesktopMode(); - m_impl->setDecoration(DisplayDecorate::None); + m_impl->setDecoration(DisplayDecorate::Empty); m_impl->setSize(desktop.width, desktop.height); m_impl->setPosition(0, 0); } diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index 294b9a0..d98bc40 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -258,7 +258,7 @@ DWORD Win32Display::getWin32Flags(unsigned int flags) { DWORD win32_flags = WS_VISIBLE; - if (flags == DisplayDecorate::None) { + if (flags == DisplayDecorate::Empty) { win32_flags |= WS_POPUP; } else { if (flags & DisplayDecorate::Menu) { From 54aefa4bddec90bf71508f77efb36b043020c803 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Oct 2022 15:21:22 +0200 Subject: [PATCH 269/361] engine.cmake: fix ENGINE_PLATFORM_UNIX_SRC. they are in Unix directory not X11 --- engine.cmake | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/engine.cmake b/engine.cmake index ed62b4e..33b0776 100644 --- a/engine.cmake +++ b/engine.cmake @@ -107,18 +107,18 @@ set(ENGINE_PLATFORM_WIN32_SRC ) set(ENGINE_PLATFORM_UNIX_SRC - source/Platform/X11/Xlib.cpp - source/Platform/X11/UnixApplication.cpp - source/Platform/X11/X11Display.cpp - source/Platform/X11/GLXContext.cpp - source/Platform/X11/X11Input.cpp - source/Platform/X11/X11Keyboard.cpp - source/Platform/X11/X11Mouse.cpp - source/Platform/X11/X11EventQueue.cpp - source/Platform/X11/X11WindowEventHandler.cpp - source/Platform/X11/UnixMisc.cpp - source/Platform/X11/UnixSystem.cpp - source/Platform/X11/glad_glx.c + source/Platform/Unix/Xlib.cpp + source/Platform/Unix/UnixApplication.cpp + source/Platform/Unix/X11Display.cpp + source/Platform/Unix/GLXContext.cpp + source/Platform/Unix/X11Input.cpp + source/Platform/Unix/X11Keyboard.cpp + source/Platform/Unix/X11Mouse.cpp + source/Platform/Unix/X11EventQueue.cpp + source/Platform/Unix/X11WindowEventHandler.cpp + source/Platform/Unix/UnixMisc.cpp + source/Platform/Unix/UnixSystem.cpp + source/Platform/Unix/glad_glx.c ) From a4f7c90f6335f070f3201cf96c14150da7240b60 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Oct 2022 15:22:13 +0200 Subject: [PATCH 270/361] engine.cmake: Unix systems needs to link with X11 and Xrandr --- engine.cmake | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/engine.cmake b/engine.cmake index 33b0776..5633125 100644 --- a/engine.cmake +++ b/engine.cmake @@ -149,6 +149,10 @@ if (WIN32) target_sources(Spectre PRIVATE ${ENGINE_PLATFORM_WIN32_SRC}) else() target_sources(Spectre PRIVATE ${ENGINE_PLATFORM_UNIX_SRC}) + + # Unix needs to link against X11 + find_package(X11 REQUIRED COMPONENTS Xrandr) + target_link_libraries(Spectre PRIVATE X11::X11 X11::Xrandr) endif (WIN32) # Select graphics API From 7f141a89308895a52fd2ab6c427add6318a471f5 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Oct 2022 15:23:05 +0200 Subject: [PATCH 271/361] engine.cmake: OpenGL on unix needs to link with GLX. --- engine.cmake | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/engine.cmake b/engine.cmake index 5633125..be98085 100644 --- a/engine.cmake +++ b/engine.cmake @@ -158,9 +158,14 @@ endif (WIN32) # Select graphics API # Only OpenGL Driver for now -find_package(OpenGL REQUIRED) target_sources(Spectre PRIVATE ${ENGINE_GFXDRIVER_OPENGL_SRC}) -target_link_libraries(Spectre PRIVATE OpenGL::GL) +if (WIN32) + find_package(OpenGL REQUIRED COMPONENTS OpenGL) + target_link_libraries(Spectre PRIVATE OpenGL::GL) +else() + find_package(OpenGL REQUIRED COMPONENTS OpenGL GLX) + target_link_libraries(Spectre PRIVATE OpenGL::OpenGL OpenGL::GLX) +endif() # FreeType add_subdirectory(vendor/FreeType2) From 05b59a467727c3c66e9af353b3d9d4aae1752f6f Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Oct 2022 15:23:24 +0200 Subject: [PATCH 272/361] engine.cmake: Small comment fix. --- engine.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine.cmake b/engine.cmake index be98085..3c7bb22 100644 --- a/engine.cmake +++ b/engine.cmake @@ -144,7 +144,7 @@ endif() # Dependancies # ------------------------------------------------------------ -# Select platform. +# Platform specific if (WIN32) target_sources(Spectre PRIVATE ${ENGINE_PLATFORM_WIN32_SRC}) else() From 46bc8eb5d8d290ffa63968183b70343fdb5f1f35 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Oct 2022 16:00:57 +0200 Subject: [PATCH 273/361] Platform/Unix/Xlib: Adding getParentWindow() --- source/Platform/Unix/Xlib.cpp | 16 ++++++++++++++++ source/Platform/Unix/Xlib.h | 2 ++ 2 files changed, 18 insertions(+) diff --git a/source/Platform/Unix/Xlib.cpp b/source/Platform/Unix/Xlib.cpp index 32e36fb..bde34f8 100644 --- a/source/Platform/Unix/Xlib.cpp +++ b/source/Platform/Unix/Xlib.cpp @@ -26,6 +26,22 @@ void shutdown() return _priv::display; } +// Implementation borrowed from SFML :) +::Window getParentWindow(::Window win) +{ + ::Window root, parent; + ::Window* children = nullptr; + unsigned int numChildren; + + ::XQueryTree(getDisplay(), win, &root, &parent, &children, &numChildren); + + // Children information is not used, so must be freed. + if (children != nullptr) + XFree(children); + + return parent; +} + ::Atom getAtom(const std::string& name, bool onlyIfExists) { return XInternAtom(getDisplay(), name.c_str(), onlyIfExists); diff --git a/source/Platform/Unix/Xlib.h b/source/Platform/Unix/Xlib.h index cc5cb2d..53a9d7e 100644 --- a/source/Platform/Unix/Xlib.h +++ b/source/Platform/Unix/Xlib.h @@ -15,6 +15,8 @@ void shutdown(); ::Display* getDisplay(); +::Window getParentWindow(::Window win); + ::Atom getAtom(const std::string& name, bool onlyIfExists = false); } } // namespace sp::xlib From 1c7cc31b52a6c2e8224da23e33d296f6fe495995 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 1 Oct 2022 16:02:10 +0200 Subject: [PATCH 274/361] source/Platform/Unix/X11Display.cpp: Fix getPosition() as it did not take border width into account. --- source/Platform/Unix/X11Display.cpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index d960670..9e087f6 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -132,14 +132,20 @@ void X11Display::setPosition(unsigned int x, unsigned int y) Vector2u X11Display::getPosition() const { - Vector2u pos(0, 0); - XWindowAttributes attr; + int x, y; + unsigned int w, h, bw, d; + ::Display* disp = Xlib::getDisplay(); + ::Window ancestor = m_win; + ::Window root = DefaultRootWindow(disp); - if (XGetWindowAttributes(Xlib::getDisplay(), m_win, &attr)) { - pos.x = attr.x; - pos.y = attr.y; + while (Xlib::getParentWindow(ancestor) != root) { + // Next window up (parent window). + ancestor = Xlib::getParentWindow(ancestor); } - return pos; + + ::XGetGeometry(disp, ancestor, &root, &x, &y, &w, &h, &bw, &d); + + return Vector2u(x, y); } void X11Display::setVisible(bool visible) From c20c79cfd367c2a68d5fcc1eb822143b9023727e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Oct 2022 17:00:45 +0200 Subject: [PATCH 275/361] Adding source/Platform/Unix/wm_hints.h --- source/Platform/Unix/wm_hints.h | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 source/Platform/Unix/wm_hints.h diff --git a/source/Platform/Unix/wm_hints.h b/source/Platform/Unix/wm_hints.h new file mode 100644 index 0000000..6e9e470 --- /dev/null +++ b/source/Platform/Unix/wm_hints.h @@ -0,0 +1,32 @@ + +#ifndef SPECTRE_PLATFORM_UNIX_WM_HINTS_H +#define SPECTRE_PLATFORM_UNIX_WM_HINTS_H + +#define MWM_HINTS_FUNCTIONS (1 << 0) +#define MWM_HINTS_DECORATIONS (1 << 1) + +#define MWM_DECOR_BORDER (1 << 1) +#define MWM_DECOR_RESIZEH (1 << 2) +#define MWM_DECOR_TITLE (1 << 3) +#define MWM_DECOR_MENU (1 << 4) +#define MWM_DECOR_MINIMIZE (1 << 5) +#define MWM_DECOR_MAXIMIZE (1 << 6) + +#define MWM_FUNC_RESIZE (1 << 1) +#define MWM_FUNC_MOVE (1 << 2) +#define MWM_FUNC_MINIMIZE (1 << 3) +#define MWM_FUNC_MAXIMIZE (1 << 4) +#define MWM_FUNC_CLOSE (1 << 5) + +// Number of elements in WMHints struct. +#define WMHINTS_NUM_ELEMENTS (sizeof(struct WMHints) / sizeof(long)) + +struct WMHints{ + unsigned long flags; + unsigned long functions; + unsigned long decorations; + long inputMode; + unsigned long state; +}; + +#endif /* SPECTRE_PLATFORM_UNIX_WM_HINTS_H */ From b78ddba11e9c830ce793fb76326cf497b6cbfd71 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Oct 2022 17:01:40 +0200 Subject: [PATCH 276/361] Platform/Unix/X11Display: implement setDecoration() --- source/Platform/Unix/X11Display.cpp | 39 +++++++++++++++++++++++++++++ source/Platform/Unix/X11Display.h | 2 ++ 2 files changed, 41 insertions(+) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 9e087f6..dea7205 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -1,8 +1,10 @@ +#include #include #include #include "X11WindowEventHandler.h" #include "Xlib.h" +#include "wm_hints.h" #include "GLXContext.h" #include "X11Display.h" @@ -157,6 +159,43 @@ void X11Display::setVisible(bool visible) } } +void X11Display::setDecoration(unsigned decoration) +{ + Atom WMHintsAtom = Xlib::getAtom("_MOTIF_WM_HINTS", false); + + Log::info("X11: Decoration"); + + if (WMHintsAtom) { + WMHints hints; + std::memset(&hints, 0, sizeof(hints)); + hints.flags = MWM_HINTS_FUNCTIONS | MWM_HINTS_DECORATIONS; + hints.decorations = 0; + hints.functions = 0; + + if (decoration & DisplayDecorate::Menu) { + Log::info("X11: Decoration Menu"); + hints.decorations |= MWM_DECOR_BORDER | MWM_DECOR_TITLE | MWM_DECOR_MINIMIZE | MWM_DECOR_MENU; + hints.functions |= MWM_FUNC_MOVE | MWM_FUNC_MINIMIZE; + } + + if (decoration & DisplayDecorate::Resize) { + Log::info("X11: Decoration Resize"); + hints.decorations |= MWM_DECOR_MAXIMIZE | MWM_DECOR_RESIZEH; + hints.functions |= MWM_FUNC_MAXIMIZE | MWM_FUNC_RESIZE; + } + + if (decoration & DisplayDecorate::Close) { + Log::info("X11: Decoration Close"); + hints.decorations |= 0; + hints.functions |= MWM_FUNC_CLOSE; + } + + + ::XChangeProperty(Xlib::getDisplay(), m_win, WMHintsAtom, WMHintsAtom, + 32, PropModeReplace, (const unsigned char*)&hints, WMHINTS_NUM_ELEMENTS); + } +} + void X11Display::minimize() { ::XIconifyWindow(Xlib::getDisplay(), m_win, m_screen); diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Display.h index 403aaaf..04ee0e9 100644 --- a/source/Platform/Unix/X11Display.h +++ b/source/Platform/Unix/X11Display.h @@ -38,6 +38,8 @@ public : virtual void setVisible(bool visible); + virtual void setDecoration(unsigned decoration); + virtual void minimize(); virtual void maximize(); From a8fa3981f4581e82dab5cd932c9d446de55156a3 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Oct 2022 17:02:10 +0200 Subject: [PATCH 277/361] source/Platform/Unix/Xlib.cpp: assert _priv::display in shutdown() --- source/Platform/Unix/Xlib.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Platform/Unix/Xlib.cpp b/source/Platform/Unix/Xlib.cpp index bde34f8..41559e8 100644 --- a/source/Platform/Unix/Xlib.cpp +++ b/source/Platform/Unix/Xlib.cpp @@ -16,6 +16,7 @@ void init() void shutdown() { + assert(_priv::display != NULL); XCloseDisplay(_priv::display); _priv::display = NULL; } From 36c6024649acf051d194eb47e476ab74fd5bf73f Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Oct 2022 17:06:02 +0200 Subject: [PATCH 278/361] Platform/Unix/X11Display: remove setIcon(const std::string&) as this exists in Generic Display class. --- source/Platform/Unix/X11Display.cpp | 10 ---------- source/Platform/Unix/X11Display.h | 2 -- 2 files changed, 12 deletions(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index dea7205..a2f157a 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -224,16 +224,6 @@ void X11Display::setCaption(const std::string& caption) ::XStoreName(Xlib::getDisplay(), m_win, caption.c_str()); } -// TODO: Move this up to the non-platform layer. -void X11Display::setIcon(const std::string& icon) -{ - Image img; - - if (img.loadFromFile(icon)) { - setIcon(img.getWidth(), img.getHeight(), img.getPixels()); - } -} - void X11Display::setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) { ::Display* disp = Xlib::getDisplay(); diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Display.h index 04ee0e9..b2bdeb3 100644 --- a/source/Platform/Unix/X11Display.h +++ b/source/Platform/Unix/X11Display.h @@ -46,8 +46,6 @@ public : virtual void setCaption(const std::string& caption); - virtual void setIcon(const std::string& icon); - virtual void setIcon(unsigned int width, unsigned int height, const uint8_t *pixels); virtual void showCursor(bool value); From 605e0df90292c46fd5db49102b2a2bef33106aff Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Oct 2022 17:07:14 +0200 Subject: [PATCH 279/361] source/Platform/Unix/X11Display.cpp: call setDecoration() in create() --- source/Platform/Unix/X11Display.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index a2f157a..7b9bdfa 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -77,6 +77,8 @@ bool X11Display::create(DisplayDescription description) setSize(description.mode.width, description.mode.height); + setDecoration(description.decoration); + // Clear and take focus XClearWindow(disp, m_win); XMapRaised(disp, m_win); From 84f0a83bee1ce416b791ee6c44e10e6325542f07 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Oct 2022 17:11:27 +0200 Subject: [PATCH 280/361] source/Platform/Unix/X11Display.cpp: Whitespace fix. --- source/Platform/Unix/X11Display.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 7b9bdfa..b481019 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -230,7 +230,7 @@ void X11Display::setIcon(unsigned int width, unsigned int height, const uint8_t { ::Display* disp = Xlib::getDisplay(); ::Atom net_wm_icon = Xlib::getAtom("_NET_WM_ICON", False); - ::Atom cardinal = Xlib::getAtom("CARDINAL", False); + ::Atom cardinal = Xlib::getAtom("CARDINAL", False); std::vector buffer(2 + width * height); uint64_t *ptr = &buffer[0]; @@ -265,8 +265,8 @@ void X11Display::createHiddenCursor() ::XDrawPoint(disp, pix, gc, 0, 0); c.red = c.green = c.blue = 0; - c.flags = DoRed | DoGreen | DoBlue; - m_cur_hidden = XCreatePixmapCursor(disp, pix, pix, &c, &c, 0, 0); + c.flags = DoRed | DoGreen | DoBlue; + m_cur_hidden = XCreatePixmapCursor(disp, pix, pix, &c, &c, 0, 0); // Free GC and pixmap. ::XFreePixmap(disp, pix); From 0a5eb397c7003f82248161a7262ba6a09a9e3f2e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 2 Oct 2022 23:31:46 +0200 Subject: [PATCH 281/361] Platform/Unix/X11Display: Adding stub for enterFullscreen and exitFullscreen --- source/Platform/Unix/X11Display.cpp | 10 ++++++++++ source/Platform/Unix/X11Display.h | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index b481019..bb3be61 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -221,6 +221,16 @@ void X11Display::maximize() SubstructureNotifyMask, (XEvent*) &ev); } +void X11Display::enterFullscreen(DisplayMode mode) +{ + +} + +void X11Display::exitFullscreen() +{ + +} + void X11Display::setCaption(const std::string& caption) { ::XStoreName(Xlib::getDisplay(), m_win, caption.c_str()); diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Display.h index b2bdeb3..ae2d327 100644 --- a/source/Platform/Unix/X11Display.h +++ b/source/Platform/Unix/X11Display.h @@ -44,6 +44,10 @@ public : virtual void maximize(); + virtual void enterFullscreen(DisplayMode mode); + + virtual void exitFullscreen(); + virtual void setCaption(const std::string& caption); virtual void setIcon(unsigned int width, unsigned int height, const uint8_t *pixels); From 82343f0835d690c03ba9ed3ea03ee0cc8e849dbe Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 3 Oct 2022 22:11:26 +0200 Subject: [PATCH 282/361] source/Graphics/Image.cpp: minor style fix. --- source/Graphics/Image.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/source/Graphics/Image.cpp b/source/Graphics/Image.cpp index cb469b1..cb111b1 100644 --- a/source/Graphics/Image.cpp +++ b/source/Graphics/Image.cpp @@ -198,10 +198,7 @@ void Image::setPixels(const void *pixels, PixelFormat format) const unsigned char* Image::getPixels() const { - if (m_pixels.size()) { - return &m_pixels[0]; - } - return NULL; + return m_pixels.size() ? &m_pixels[0] : NULL; } } // namespace sp From 3c7a5d148db5108bfc45d9dc3a018e763e942af7 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 3 Oct 2022 22:11:39 +0200 Subject: [PATCH 283/361] include/Spectre/Graphics/PixelFormat.h: Whitespace fix. --- include/Spectre/Graphics/PixelFormat.h | 32 +++++++++++++------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/include/Spectre/Graphics/PixelFormat.h b/include/Spectre/Graphics/PixelFormat.h index c39e311..363bab6 100644 --- a/include/Spectre/Graphics/PixelFormat.h +++ b/include/Spectre/Graphics/PixelFormat.h @@ -7,37 +7,37 @@ namespace sp { enum PixelFormat { - PF_Unknown = 0, - PF_Alpha = 1, // 8 bit alpha channel. + PF_Unknown = 0, + PF_Alpha = 1, // 8 bit alpha channel. // Byte-order formats. // Pixels are always ordered with the first channel at the first byte, second channel at the second byte. // --------------------------- - PF_RGB = 2, // Standard RGB: 24 bits per pixel, 8 bits are used for red, green, blue. - PF_RGBX = 3, // 32 bits per pixel, 8 bits are used for red, green, Last 8 bits are unused. - PF_RGBA = 4, // Standard RGBA: 32 bits per pixel, 8 bits are used for red, green, blue, alpha. - PF_BGR = 5, // 24 bits per pixel, 8 bits are used for blue, green, red. - PF_BGRX = 6, // 32 bits per pixel, 8 bits are used for blue, green, red. Last 8 bits are unused. - PF_BGRA = 7, // 32 bits per pixel, 8 bits are used for blue, green, red, alpha. + PF_RGB = 2, // Standard RGB: 24 bits per pixel, 8 bits are used for red, green, blue. + PF_RGBX = 3, // 32 bits per pixel, 8 bits are used for red, green, Last 8 bits are unused. + PF_RGBA = 4, // Standard RGBA: 32 bits per pixel, 8 bits are used for red, green, blue, alpha. + PF_BGR = 5, // 24 bits per pixel, 8 bits are used for blue, green, red. + PF_BGRX = 6, // 32 bits per pixel, 8 bits are used for blue, green, red. Last 8 bits are unused. + PF_BGRA = 7, // 32 bits per pixel, 8 bits are used for blue, green, red, alpha. // Packed formats. // --------------------------- // 32-bit: Pixels are in ordered in 32-bit words. where the first channel is stored at the most significant byte (MSB). // these formats are architecture dependant (litte/big-endian). - // (MSB) | byte 0 | byte 1 | byte 2 | byte 3 | (LSB) - PF_RGBX32 = 8, // | rrrr rrrr | gggg gggg | bbbb bbbb | xxxx xxxx | - PF_RGBA32 = 9, // | rrrr rrrr | gggg gggg | bbbb bbbb | aaaa aaaa | - PF_BGRX32 = 10, // | bbbb bbbb | gggg gggg | rrrr rrrr | xxxx xxxx | - PF_BGRA32 = 11, // | bbbb bbbb | gggg gggg | rrrr rrrr | aaaa aaaa | + // (MSB) | byte 0 | byte 1 | byte 2 | byte 3 | (LSB) + PF_RGBX32 = 8, // | rrrr rrrr | gggg gggg | bbbb bbbb | xxxx xxxx | + PF_RGBA32 = 9, // | rrrr rrrr | gggg gggg | bbbb bbbb | aaaa aaaa | + PF_BGRX32 = 10, // | bbbb bbbb | gggg gggg | rrrr rrrr | xxxx xxxx | + PF_BGRA32 = 11, // | bbbb bbbb | gggg gggg | rrrr rrrr | aaaa aaaa | // 24-bit (unsuppored for now) - //PF_RGB24 = 12, // | rrrr rrrr | gggg gggg | bbbb bbbb | - //PF_BGR24 = 13, // | bbbb bbbb | gggg gggg | rrrr rrrr | + //PF_RGB24 = 12, // | rrrr rrrr | gggg gggg | bbbb bbbb | + //PF_BGR24 = 13, // | bbbb bbbb | gggg gggg | rrrr rrrr | // 16-bit (unsuppored for now) - //PF_RGB565 = 14, // | rrrr rggg | gggb bbbb | + //PF_RGB565 = 14, // | rrrr rggg | gggb bbbb | //PF_RGBA5551 = 15 // | rrrr rggg | ggb bbbba | //PF_RGBX5551 = 16 // | rrrr rggg | ggb bbbbx | }; From d70ca4a6c1767833e3bb86db118d1de8c9f856c9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Oct 2022 14:54:40 +0200 Subject: [PATCH 284/361] include/Spectre/System/Log.h: Whitespace fix. --- include/Spectre/System/Log.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/Spectre/System/Log.h b/include/Spectre/System/Log.h index 26d2ac1..6908134 100644 --- a/include/Spectre/System/Log.h +++ b/include/Spectre/System/Log.h @@ -15,7 +15,7 @@ public : T_WARNING = 1 << 0, T_CRITICAL = 1 << 1, T_ERROR = 1 << 2, - T_DEBUG = 1 << 3 + T_DEBUG = 1 << 3 }; static void info(const char *message, ...); From 9b683e9a5cb8a3d5f24b7c292e7b7b1da7088d58 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Oct 2022 16:49:04 +0200 Subject: [PATCH 285/361] source/Graphics/Graphics.cpp: should delete m_gfxdrv in destructor. --- source/Graphics/Graphics.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/source/Graphics/Graphics.cpp b/source/Graphics/Graphics.cpp index 1c246bb..0430e26 100644 --- a/source/Graphics/Graphics.cpp +++ b/source/Graphics/Graphics.cpp @@ -20,6 +20,7 @@ Graphics::~Graphics() { shutdown(); delete m_display; + delete m_gfxdrv; } bool Graphics::init() From 9c4c6152c9705039b183cc664aba0671b37db48f Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 8 Oct 2022 17:29:27 +0200 Subject: [PATCH 286/361] source/Platform/Win32/Win32Display.cpp: Whitespace fix. --- source/Platform/Win32/Win32Display.cpp | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index d98bc40..a426c7c 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -182,18 +182,18 @@ void Win32Display::setIcon(unsigned int width, unsigned int height, const uint8_ unsigned char *bmp_data = NULL; ::ZeroMemory(&bi, sizeof(bi)); - bi.bV5Size = sizeof(bi); - bi.bV5Width = width; - bi.bV5Height = height; - bi.bV5Planes = 1; - bi.bV5BitCount = 32; - bi.bV5Compression = BI_RGB; - bi.bV5CSType = LCS_WINDOWS_COLOR_SPACE; - bi.bV5Intent = LCS_GM_IMAGES; + bi.bV5Size = sizeof(bi); + bi.bV5Width = width; + bi.bV5Height = height; + bi.bV5Planes = 1; + bi.bV5BitCount = 32; + bi.bV5Compression = BI_RGB; + bi.bV5CSType = LCS_WINDOWS_COLOR_SPACE; + bi.bV5Intent = LCS_GM_IMAGES; hdc = ::GetDC(NULL); bmp_color = ::CreateDIBSection(hdc, reinterpret_cast(&bi), - DIB_RGB_COLORS, (void **) &bmp_data, NULL, 0); + DIB_RGB_COLORS, (void **) &bmp_data, NULL, 0); ::ReleaseDC(NULL, hdc); if (!bmp_color) { @@ -217,10 +217,10 @@ void Win32Display::setIcon(unsigned int width, unsigned int height, const uint8_ } ::ZeroMemory(&ii, sizeof(ii)); - ii.fIcon = TRUE; - ii.xHotspot = 0; - ii.yHotspot = 0; - ii.hbmColor = bmp_color; + ii.fIcon = TRUE; + ii.xHotspot = 0; + ii.yHotspot = 0; + ii.hbmColor = bmp_color; ii.hbmMask = bmp_mask; if (m_icon) { From d57d01c4b4fd934be31c59f4c8fb340183b20725 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Feb 2023 13:04:05 +0100 Subject: [PATCH 287/361] README.md: Add "sh" to code blocks. --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c79c540..e1a511b 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ This project uses [cmake](https://cmake.org) build system (Version 3.15 or greater) to compile the engine. ### Linux with make. -``` +```sh $ mkdir build $ cd build $ cmake .. -G "Unix Makefiles" @@ -16,7 +16,7 @@ $ make ``` ### Windows using NMake -``` +```sh $ mkdir build $ cd build $ cmake .. -G "NMake Makefiles" @@ -25,7 +25,7 @@ $ nmake ### Or the best way (in my opinion) install [Ninja](https://ninja-build.org) and run -``` +```sh $ mkdir build $ cd build $ cmake .. -G Ninja From 07f32ee1293924ffaff96a4c147c1ab590d36551 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Feb 2023 13:05:07 +0100 Subject: [PATCH 288/361] include/Spectre/Graphics.h: Adding getDisplay() --- include/Spectre/Graphics.h | 2 ++ source/Graphics/Graphics.cpp | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/include/Spectre/Graphics.h b/include/Spectre/Graphics.h index ceb35fb..ce2e75a 100644 --- a/include/Spectre/Graphics.h +++ b/include/Spectre/Graphics.h @@ -45,6 +45,8 @@ public : GfxDriver* getDriver(); + Display* getDisplay(); + protected : int m_width; diff --git a/source/Graphics/Graphics.cpp b/source/Graphics/Graphics.cpp index 0430e26..ece6e87 100644 --- a/source/Graphics/Graphics.cpp +++ b/source/Graphics/Graphics.cpp @@ -79,4 +79,9 @@ void Graphics::swapBuffers() m_display->swapBuffers(); } +Display* Graphics::getDisplay() +{ + return m_display; +} + } // namespace sp From a024e7015d9345aea02d1e79a53fc52b973f7d48 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Feb 2023 13:06:02 +0100 Subject: [PATCH 289/361] Whitespace fixes. --- include/Spectre/Graphics.h | 2 +- source/Graphics/Texture.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/include/Spectre/Graphics.h b/include/Spectre/Graphics.h index ce2e75a..df6f125 100644 --- a/include/Spectre/Graphics.h +++ b/include/Spectre/Graphics.h @@ -2,7 +2,7 @@ #ifndef GRAPHICS_H #define GRAPHICS_H -#include +#include #include namespace sp { diff --git a/source/Graphics/Texture.cpp b/source/Graphics/Texture.cpp index d275ce6..545c805 100644 --- a/source/Graphics/Texture.cpp +++ b/source/Graphics/Texture.cpp @@ -27,7 +27,6 @@ namespace { } } } - Texture::Texture() : m_id (0), m_size (0, 0), @@ -37,7 +36,7 @@ m_format (PixelFormat::PF_Unknown) Texture::~Texture() { - destroy(); + destroy(); } void Texture::create(unsigned width, unsigned heigth, PixelFormat format) From dcbce9a153d691d60cd59b67da30d2b1c9d2cf9b Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Feb 2023 13:06:43 +0100 Subject: [PATCH 290/361] .gitignore: Ignore VS debug files. --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 3ff3458..b6d5515 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,9 @@ Thumbs.db # Visual Studio Code .vscode/ +# Debug files +*.pdb + # Compiled Object files *.slo *.lo From 8a0946eb3a028c6e0db8c9e727a3b1f218ac750e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Feb 2023 13:07:01 +0100 Subject: [PATCH 291/361] .gitattributes: add more filetypes. --- .gitattributes | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitattributes b/.gitattributes index 524cf90..22c2e7c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -5,8 +5,12 @@ *.sh text eol=lf *.ini text eol=lf *.xml text eol=lf +*.h eol=lf +*.hpp eol=lf +*.hxx eol=lf *.c text eol=lf *.cpp text eol=lf +*.cxx text eol=lf *.htext eol=lf *.txt text eol=lf *.glsl text eol=lf From 869b41c38acc3743a1ed494b101c4731a82d19a6 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Feb 2023 13:08:03 +0100 Subject: [PATCH 292/361] source/Platform/Unix/UnixMisc.cpp: tab indentation fix. --- source/Platform/Unix/UnixMisc.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Platform/Unix/UnixMisc.cpp b/source/Platform/Unix/UnixMisc.cpp index fd557f2..10bace4 100644 --- a/source/Platform/Unix/UnixMisc.cpp +++ b/source/Platform/Unix/UnixMisc.cpp @@ -24,7 +24,7 @@ void PlatformMisc::GetDisplayModes(std::vector& modes) XRRScreenConfiguration* config = ::XRRGetScreenInfo(disp, RootWindow(disp, scr)); if (config) { int nbSizes; - XRRScreenSize* sizes = ::XRRConfigSizes(config, &nbSizes); + XRRScreenSize* sizes = ::XRRConfigSizes(config, &nbSizes); if (sizes && nbSizes > 0) { int nbDepths = 0; int* depths = ::XListDepths(disp, scr, &nbDepths); @@ -82,7 +82,7 @@ DisplayMode PlatformMisc::GetDesktopMode() ::Rotation rot; int current = XRRConfigCurrentConfiguration(config, &rot); - XRRScreenSize* sizes = ::XRRConfigSizes(config, &nbSizes); + XRRScreenSize* sizes = ::XRRConfigSizes(config, &nbSizes); if (sizes && nbSizes > 0) { mode = DisplayMode(sizes[current].width, sizes[current].height, DefaultDepth(disp, scr)); From 2bb0cbaf6b216fa8e4c64f8c54cd99568ff8da84 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Feb 2023 13:10:43 +0100 Subject: [PATCH 293/361] source/Graphics/Graphics.cpp: implement getDriver() --- source/Graphics/Graphics.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/source/Graphics/Graphics.cpp b/source/Graphics/Graphics.cpp index ece6e87..641a25c 100644 --- a/source/Graphics/Graphics.cpp +++ b/source/Graphics/Graphics.cpp @@ -79,6 +79,11 @@ void Graphics::swapBuffers() m_display->swapBuffers(); } +GfxDriver* Graphics::getDriver() +{ + return m_gfxdrv; +} + Display* Graphics::getDisplay() { return m_display; From 9928a3599ef85498a3364bcbf69a6c817f3cb2d8 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Feb 2023 13:49:50 +0100 Subject: [PATCH 294/361] include/Spectre/System/Log.h: Change message variable name to format. --- include/Spectre/System/Log.h | 8 ++++---- source/System/Log.cpp | 28 ++++++++++++++-------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/include/Spectre/System/Log.h b/include/Spectre/System/Log.h index 6908134..51c0e14 100644 --- a/include/Spectre/System/Log.h +++ b/include/Spectre/System/Log.h @@ -18,13 +18,13 @@ public : T_DEBUG = 1 << 3 }; - static void info(const char *message, ...); + static void info(const char *format, ...); - static void warn(const char *message, ...); + static void warn(const char *format, ...); - static int error(const char *message, ...); + static int error(const char *format, ...); - static void debug(const char *message, ...); + static void debug(const char *format, ...); private : diff --git a/source/System/Log.cpp b/source/System/Log.cpp index 47a5210..52bfe92 100644 --- a/source/System/Log.cpp +++ b/source/System/Log.cpp @@ -6,47 +6,47 @@ namespace sp { -void Log::info(const char *message, ...) { +void Log::info(const char *format, ...) { va_list vl; - va_start(vl, message); - writeln(T_INFO, message, vl); + va_start(vl, format); + writeln(T_INFO, format, vl); va_end(vl); } -void Log::warn(const char *message, ...) +void Log::warn(const char *format, ...) { va_list vl; - va_start(vl, message); - writeln(T_WARNING, message, vl); + va_start(vl, format); + writeln(T_WARNING, format, vl); va_end(vl); } -int Log::error(const char *message, ...) +int Log::error(const char *format, ...) { va_list vl; - va_start(vl, message); - writeln(T_ERROR, message, vl); + va_start(vl, format); + writeln(T_ERROR, format, vl); va_end(vl); return 1; } -void Log::debug(const char *message, ...) +void Log::debug(const char *format, ...) { #ifdef SPECTRE_DEBUG va_list vl; - va_start(vl, message); - writeln(T_DEBUG, message, vl); + va_start(vl, format); + writeln(T_DEBUG, format, vl); va_end(vl); #endif /* SPECTRE_DEBUG */ } -void Log::writeln(Type type, const char *message, va_list args) +void Log::writeln(Type type, const char *format, va_list args) { FILE *fd = stderr; static char buf[4096]; @@ -73,7 +73,7 @@ void Log::writeln(Type type, const char *message, va_list args) break; } - vsnprintf(buf, sizeof(buf), message, args); + vsnprintf(buf, sizeof(buf), format, args); fprintf(fd, "%s: %s\n", prefix, buf); } From 173aea31c98e71155a77e902ff25f6d98fdd159b Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Feb 2023 13:50:34 +0100 Subject: [PATCH 295/361] Adding include/Spectre/System/Log/Writer.h interface. --- include/Spectre/System/Log/Writer.h | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 include/Spectre/System/Log/Writer.h diff --git a/include/Spectre/System/Log/Writer.h b/include/Spectre/System/Log/Writer.h new file mode 100644 index 0000000..9ecefaf --- /dev/null +++ b/include/Spectre/System/Log/Writer.h @@ -0,0 +1,17 @@ +#ifndef SPECTRE_SYSTEM_LOG_WRITER_H +#define SPECTRE_SYSTEM_LOG_WRITER_H + +namespace sp { namespace log { + +class Writer +{ +public: + virtual ~Writer() {} + + virtual size_t write(const void *data, size_t len) = 0; +}; + + +} } // sp::log + +#endif /* SPECTRE_SYSTEM_LOG_WRITER_H */ \ No newline at end of file From 8db01a09576edf5084d3e2b86e999422efb879ac Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Feb 2023 13:52:54 +0100 Subject: [PATCH 296/361] Adding Spectre/System/Log/FileWriter class. --- engine.cmake | 1 + include/Spectre/System/Log/FileWriter.h | 30 +++++++++++ source/System/Log/FileWriter.cpp | 66 +++++++++++++++++++++++++ 3 files changed, 97 insertions(+) create mode 100644 include/Spectre/System/Log/FileWriter.h create mode 100644 source/System/Log/FileWriter.cpp diff --git a/engine.cmake b/engine.cmake index 3c7bb22..f8d1494 100644 --- a/engine.cmake +++ b/engine.cmake @@ -21,6 +21,7 @@ set( ENGINE_SRC source/System/MessageQueue.cpp source/System/Path.cpp source/System/Stopwatch.cpp + source/System/Log/FileWriter.cpp # Platform source/Platform/PlatformApplication.cpp diff --git a/include/Spectre/System/Log/FileWriter.h b/include/Spectre/System/Log/FileWriter.h new file mode 100644 index 0000000..3034243 --- /dev/null +++ b/include/Spectre/System/Log/FileWriter.h @@ -0,0 +1,30 @@ +#ifndef SPECTRE_SYSTEM_LOG_FILEWRITER_H +#define SPECTRE_SYSTEM_LOG_FILEWRITER_H + +#include +#include +#include + +namespace sp { namespace log { + +class FileWriter : public Writer +{ +public: + FileWriter(const std::string file = ""); + ~FileWriter(); + + bool open(const std::string file); + + bool close(); + + size_t write(const void *data, size_t len); + +protected: + + FILE *m_fd; +}; + + +} } // sp::log + +#endif /* SPECTRE_SYSTEM_LOG_FILEWRITER_H */ \ No newline at end of file diff --git a/source/System/Log/FileWriter.cpp b/source/System/Log/FileWriter.cpp new file mode 100644 index 0000000..d050f85 --- /dev/null +++ b/source/System/Log/FileWriter.cpp @@ -0,0 +1,66 @@ + +#include + +namespace sp { namespace log { + +FileWriter::FileWriter(const std::string file) : +m_fd (NULL) +{ + if (file.length() > 0) { + open(file); + } +} + +FileWriter::~FileWriter() +{ + if (m_fd) { + close(); + } +} + +bool FileWriter::open(const std::string file) +{ + if (!close()) { + return false; + } + + if (file == "stderr") { + m_fd = stderr; + return true; + } + + if (file == "stdout") { + m_fd = stdout; + return true; + } + + m_fd = fopen(file.c_str(), "a"); + if (m_fd == NULL) { + return false; + } + + return true; +} + +bool FileWriter::close() +{ + if (m_fd) { + // stdout and stderr can not be closed. + if (m_fd == stdout || m_fd == stderr) { + m_fd = NULL; + return true; + } + if (fclose(m_fd) < 0) { + return false; + } + m_fd = NULL; + } + return true; +} + +size_t FileWriter::write(const void *data, size_t len) +{ + return fwrite(data, 1, len, m_fd); +} + +} } // sp::log \ No newline at end of file From faed79c653c53d749b70825de7d47ac7c9a39f1a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Feb 2023 13:54:57 +0100 Subject: [PATCH 297/361] Spectre/System/Log: Support Writer interface. --- include/Spectre/System/Log.h | 6 ++++++ source/System/Log.cpp | 18 ++++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/include/Spectre/System/Log.h b/include/Spectre/System/Log.h index 51c0e14..b1adc0a 100644 --- a/include/Spectre/System/Log.h +++ b/include/Spectre/System/Log.h @@ -7,6 +7,8 @@ namespace sp { +namespace log { class Writer; } + class Log { public : @@ -18,6 +20,8 @@ public : T_DEBUG = 1 << 3 }; + static void setWriter(log::Writer* writer); + static void info(const char *format, ...); static void warn(const char *format, ...); @@ -29,6 +33,8 @@ public : private : static void writeln(Type type, const char *fmt, va_list args); + + static log::Writer* _writer; }; } // namespace sp diff --git a/source/System/Log.cpp b/source/System/Log.cpp index 52bfe92..b2d9226 100644 --- a/source/System/Log.cpp +++ b/source/System/Log.cpp @@ -2,10 +2,18 @@ #include #include #include +#include namespace sp { +log::Writer* Log::_writer; + +void Log::setWriter(log::Writer* writer) +{ + _writer = writer; +} + void Log::info(const char *format, ...) { va_list vl; @@ -48,13 +56,13 @@ void Log::debug(const char *format, ...) void Log::writeln(Type type, const char *format, va_list args) { - FILE *fd = stderr; + int len; + static char msg[4096]; static char buf[4096]; const char *prefix; switch(type) { case T_INFO : - fd = stdout; prefix = "INFO"; break; case T_WARNING : @@ -73,8 +81,10 @@ void Log::writeln(Type type, const char *format, va_list args) break; } - vsnprintf(buf, sizeof(buf), format, args); - fprintf(fd, "%s: %s\n", prefix, buf); + vsnprintf(msg, sizeof(msg), format, args); + len = sprintf(buf, "%s: %s\n", prefix, msg); + + _writer->write(buf, len); } } // namespace sp From ba504c7efc31dfd684f753866e6c699bf8dd4506 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Feb 2023 13:57:54 +0100 Subject: [PATCH 298/361] Spectre/Game: Set default log writer. --- include/Spectre/Game.h | 5 +++++ source/Game.cpp | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/include/Spectre/Game.h b/include/Spectre/Game.h index 5c6dec3..b289389 100644 --- a/include/Spectre/Game.h +++ b/include/Spectre/Game.h @@ -12,6 +12,8 @@ class PlatformApplication; namespace sp { +namespace log { class Writer; } + class Game { public : @@ -54,8 +56,11 @@ private : MessageHandler* m_messageHandler; + log::Writer* m_log_writer; + FPSCounter m_fpsCounter; + bool m_running; }; diff --git a/source/Game.cpp b/source/Game.cpp index 6c6162e..c22e241 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include #include #include @@ -19,6 +21,10 @@ m_running(false) m_graphics = new Graphics(m_platform); m_input = new InputModule(&m_platform->getInput()); m_messageHandler = new MessageHandler(); + + // Setup log + m_log_writer = new log::FileWriter("stdout"); + Log::setWriter(m_log_writer); } Game::~Game() From c1cc47609409018f1d96900b8b2f9daa2ac76b3d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 18 Feb 2023 14:03:14 +0100 Subject: [PATCH 299/361] source/Platform/Win32/Win32Display.cpp: Tab indentation fix. --- source/Platform/Win32/Win32Display.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index a426c7c..7e89676 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -165,9 +165,9 @@ void Win32Display::grabCursor(bool value) { if (value) { RECT rect; - GetClientRect(m_handle, &rect); - MapWindowPoints(m_handle, NULL, reinterpret_cast(&rect), 2); - ClipCursor(&rect); + GetClientRect(m_handle, &rect); + MapWindowPoints(m_handle, NULL, reinterpret_cast(&rect), 2); + ClipCursor(&rect); } else { ClipCursor(NULL); } From ff44ec7b7a1098e4f5d8748a6902017f6ee8c542 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 30 Apr 2023 15:55:20 +0200 Subject: [PATCH 300/361] source/Math/Logarithm.cpp: c++11/C99 has log2 in cmath. not sure why i didnt use it. --- source/Math/Logarithm.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/source/Math/Logarithm.cpp b/source/Math/Logarithm.cpp index 9aa7f03..4fe83eb 100644 --- a/source/Math/Logarithm.cpp +++ b/source/Math/Logarithm.cpp @@ -5,8 +5,6 @@ namespace sp { -#define LOG2INBASE10 0.30102999566f - double math::log(double base, double value) { return ::log10(value) / ::log10(base); @@ -14,7 +12,7 @@ double math::log(double base, double value) { double math::log2(double value) { - return ::log10(value) / LOG2INBASE10; + return ::log2(value); } } // namespace sp From b9936e5867dbd90fa761939984ee18406ca99886 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 30 Apr 2023 15:58:29 +0200 Subject: [PATCH 301/361] source/Math/Logarithm.cpp: include cmath directly instead of cstdlib --- source/Math/Logarithm.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Math/Logarithm.cpp b/source/Math/Logarithm.cpp index 4fe83eb..2d6c6ad 100644 --- a/source/Math/Logarithm.cpp +++ b/source/Math/Logarithm.cpp @@ -1,6 +1,6 @@ // Logarithmic functions. -#include +#include #include namespace sp { From 4a6a20342de1c1702beb87d77488678c51d3eee2 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 30 Apr 2023 23:02:16 +0200 Subject: [PATCH 302/361] Spectre/Math/Time: minor fixes and documentation --- include/Spectre/Math/Time.h | 4 ++-- source/Math/Time.cpp | 12 ++++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/include/Spectre/Math/Time.h b/include/Spectre/Math/Time.h index 9abb7d3..a2753c5 100644 --- a/include/Spectre/Math/Time.h +++ b/include/Spectre/Math/Time.h @@ -23,8 +23,8 @@ public : private : - // In microseconds. - long m_value; + // Microseconds (us) + long m_us; }; // ---------------------------- diff --git a/source/Math/Time.cpp b/source/Math/Time.cpp index 2e62b4c..f380817 100644 --- a/source/Math/Time.cpp +++ b/source/Math/Time.cpp @@ -5,23 +5,27 @@ namespace sp { Time::Time(long value) : -m_value(value) +m_us(value) { } double Time::seconds() const { - return ((double) m_value) / 1000000.0f; + // Faster way of calling milliseconds() / 1000 as + // ms = us / 1000 + // s = ms / 1000 = us / 1000 / 1000 = us / 10000000 + return ((double) m_us) / 1000000.0f; } int Time::milliseconds() const { - return ((double) m_value) / 1000; + // ms = us / 1000 + return ((double) m_us) / 1000; } long Time::microseconds() const { - return m_value; + return m_us; } // ---------------------------- From 43354fc9b4d28ec6914d0f5f8f845c569435ad98 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 30 Apr 2023 23:07:25 +0200 Subject: [PATCH 303/361] Spectre/Math: rename all vector length() and normalize() functions to len() and normal() --- include/Spectre/Math/Vector2.h | 4 ++-- include/Spectre/Math/Vector2.inl | 6 +++--- include/Spectre/Math/Vector3.h | 4 ++-- include/Spectre/Math/Vector3.inl | 6 +++--- include/Spectre/Math/Vector4.h | 4 ++-- include/Spectre/Math/Vector4.inl | 6 +++--- source/Math/Transform.cpp | 4 ++-- 7 files changed, 17 insertions(+), 17 deletions(-) diff --git a/include/Spectre/Math/Vector2.h b/include/Spectre/Math/Vector2.h index 06fd97e..1def70e 100644 --- a/include/Spectre/Math/Vector2.h +++ b/include/Spectre/Math/Vector2.h @@ -30,9 +30,9 @@ struct Vector2 // Named operations. // ----------------- - inline float length() const; + inline float len() const; - inline Vector2& normalize(); + inline Vector2& normal(); // Dot product inline T dot(const Vector2& vec) const; diff --git a/include/Spectre/Math/Vector2.inl b/include/Spectre/Math/Vector2.inl index 241a405..fcc0f6e 100644 --- a/include/Spectre/Math/Vector2.inl +++ b/include/Spectre/Math/Vector2.inl @@ -31,15 +31,15 @@ inline Vector2::Vector2(const Vector2& vec) } template -inline float Vector2::length() const +inline float Vector2::len() const { return std::sqrt((x * x) + (y * y)); } template -inline Vector2& Vector2::normalize() +inline Vector2& Vector2::normal() { - float il = 1.0f / length(); + float il = 1.0f / len(); x *= il; y *= il; return *this; } diff --git a/include/Spectre/Math/Vector3.h b/include/Spectre/Math/Vector3.h index a641fbd..2bf87d4 100644 --- a/include/Spectre/Math/Vector3.h +++ b/include/Spectre/Math/Vector3.h @@ -35,9 +35,9 @@ struct Vector3 // Named operations. // ----------------- - inline float length() const; + inline float len() const; - inline Vector3& normalize(); + inline Vector3& normal(); inline Vector2 toVec2(); }; diff --git a/include/Spectre/Math/Vector3.inl b/include/Spectre/Math/Vector3.inl index 1b1d2a4..bc9496d 100644 --- a/include/Spectre/Math/Vector3.inl +++ b/include/Spectre/Math/Vector3.inl @@ -43,7 +43,7 @@ inline Vector3::Vector3(const Vector2& vec) } template -inline float Vector3::length() const +inline float Vector3::len() const { return std::sqrt((x * x) + (y * y) + (z * z)); } @@ -55,9 +55,9 @@ Vector2 Vector3::toVec2() } template -inline Vector3& Vector3::normalize() +inline Vector3& Vector3::normal() { - float il = 1.0f / length(); + float il = 1.0f / len(); x *= il; y *= il; z *= il; return *this; } diff --git a/include/Spectre/Math/Vector4.h b/include/Spectre/Math/Vector4.h index e73dcf3..622e4b3 100644 --- a/include/Spectre/Math/Vector4.h +++ b/include/Spectre/Math/Vector4.h @@ -29,9 +29,9 @@ struct Vector4 // Named operations - inline float length() const; + inline float len() const; - inline Vector4& normalize(); + inline Vector4& normal(); }; // --------- diff --git a/include/Spectre/Math/Vector4.inl b/include/Spectre/Math/Vector4.inl index c759fb7..e825150 100644 --- a/include/Spectre/Math/Vector4.inl +++ b/include/Spectre/Math/Vector4.inl @@ -36,15 +36,15 @@ Vector4::Vector4(const Vector4& vec) } template -float Vector4::length() const +float Vector4::len() const { return std::sqrt((x * x) + (y * y) + (z * z) + (w * w)); } template -Vector4& Vector4::normalize() +Vector4& Vector4::normal() { - float il = 1.0f / length(); + float il = 1.0f / len(); x *= il; y *= il; z *= il; w *= il; return *this; } diff --git a/source/Math/Transform.cpp b/source/Math/Transform.cpp index 189ef8c..4854eb2 100644 --- a/source/Math/Transform.cpp +++ b/source/Math/Transform.cpp @@ -42,12 +42,12 @@ void Transform::reset() Vector2f Transform::getUpVector() const { - return Vector2f(m_matrix.e[4], m_matrix.e[5]).normalize(); + return Vector2f(m_matrix.e[4], m_matrix.e[5]).normal(); } Vector2f Transform::getRightVector() const { - return Vector2f(m_matrix.e[0], m_matrix.e[1]).normalize(); + return Vector2f(m_matrix.e[0], m_matrix.e[1]).normal(); } Transform& Transform::translate(float x, float y) From 5c5d9fe09a90e0a5000bae60a47a642024daa9ef Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 1 May 2023 17:46:37 +0200 Subject: [PATCH 304/361] GfxDriver: add getName() getVersion() and getCardName() --- include/Spectre/GfxDriver/GfxDriver.h | 12 ++++++++++-- source/GfxDriver/OpenGL/OpenGLDrv.cpp | 24 +++++++++++++++++------- source/GfxDriver/OpenGL/OpenGLDrv.h | 6 ++++++ 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/include/Spectre/GfxDriver/GfxDriver.h b/include/Spectre/GfxDriver/GfxDriver.h index 3ddb730..d6b331f 100644 --- a/include/Spectre/GfxDriver/GfxDriver.h +++ b/include/Spectre/GfxDriver/GfxDriver.h @@ -14,8 +14,16 @@ public: }; public: + // Get the name of the driver. + virtual std::string getName() const = 0; + + // Get the version of the driver + virtual std::string getVersion() const = 0; + virtual std::string getVendor() const = 0; + virtual std::string getCardName() const = 0; + virtual void setViewport(int x, int y, int width, int height) = 0; virtual void setClearColor(float r, float g, float b, float a) = 0; @@ -25,10 +33,10 @@ public: virtual void clearColorBuffer() = 0; // Resources. - + // CreateIndexBuffer() // CreateVertexBuffer() - + // Draw calls }; diff --git a/source/GfxDriver/OpenGL/OpenGLDrv.cpp b/source/GfxDriver/OpenGL/OpenGLDrv.cpp index ead2e2a..f313608 100644 --- a/source/GfxDriver/OpenGL/OpenGLDrv.cpp +++ b/source/GfxDriver/OpenGL/OpenGLDrv.cpp @@ -4,14 +4,14 @@ namespace sp { -std::string OpenGLDrv::getVendor() const -{ - char buf[512]; +std::string OpenGLDrv::getName() const { + return "OpenGL"; +} +std::string OpenGLDrv::getVersion() const { + + char buf[512]; std::string prof = "Compability"; - char *ver = (char*) glGetString(GL_VERSION); - char *ven = (char*) glGetString(GL_VENDOR); - char *ren = (char*) glGetString(GL_RENDERER); GLint flags; glGetIntegerv(GL_CONTEXT_PROFILE_MASK, &flags); @@ -19,11 +19,21 @@ std::string OpenGLDrv::getVendor() const prof = "Core"; } - snprintf(buf, sizeof(buf), "OpenGL %s %s profile - %s %s", ver, prof.c_str(), ren, ven); + snprintf(buf, sizeof(buf), "%s %s", prof.c_str(), glGetString(GL_VERSION)); return std::string(buf); } +std::string OpenGLDrv::getVendor() const +{ + return std::string((char*)glGetString(GL_VENDOR)); +} + +std::string OpenGLDrv::getCardName() const +{ + return std::string((char*)glGetString(GL_RENDERER)); +} + void OpenGLDrv::setViewport(int x, int y, int width, int height) { glViewport(x, y, width, height); diff --git a/source/GfxDriver/OpenGL/OpenGLDrv.h b/source/GfxDriver/OpenGL/OpenGLDrv.h index c993fb0..583d695 100644 --- a/source/GfxDriver/OpenGL/OpenGLDrv.h +++ b/source/GfxDriver/OpenGL/OpenGLDrv.h @@ -9,8 +9,14 @@ namespace sp { class OpenGLDrv : public GfxDriver { public: + virtual std::string getName() const; + + virtual std::string getVersion() const; + virtual std::string getVendor() const; + virtual std::string getCardName() const; + virtual void setViewport(int x, int y, int width, int height); virtual void setClearColor(float r, float g, float b, float a); From 5144c197d58e11df205ead336cb5d97048a42eea Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 1 May 2023 17:48:02 +0200 Subject: [PATCH 305/361] Style fixes. --- include/Spectre/Graphics/BatchRenderer2D.h | 8 ++++---- source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/Spectre/Graphics/BatchRenderer2D.h b/include/Spectre/Graphics/BatchRenderer2D.h index 79bcd17..9fca51e 100644 --- a/include/Spectre/Graphics/BatchRenderer2D.h +++ b/include/Spectre/Graphics/BatchRenderer2D.h @@ -39,10 +39,10 @@ protected : struct Batch { - RenderType type; - const Texture* texture; - unsigned int count; - unsigned int offset; + RenderType type; + const Texture* texture; + unsigned int count; + unsigned int offset; }; typedef std::vector BatchQueue; diff --git a/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp b/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp index 829bf8b..3837e6d 100644 --- a/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp +++ b/source/GfxDriver/OpenGL/OpenGLShaderProgram.cpp @@ -6,7 +6,7 @@ namespace sp { OpenGLShaderProgram::OpenGLShaderProgram() { m_extension = "glsl"; - m_id = glCreateProgram(); + m_id = glCreateProgram(); } From c87bed2a590dc9941dd695dfad930b6ab580080d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 25 Jul 2023 18:55:47 +0200 Subject: [PATCH 306/361] include/Spectre/GfxDriver/GfxDriver.h: add createShaderProgram() --- include/Spectre/GfxDriver/GfxDriver.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/Spectre/GfxDriver/GfxDriver.h b/include/Spectre/GfxDriver/GfxDriver.h index d6b331f..cdfed1e 100644 --- a/include/Spectre/GfxDriver/GfxDriver.h +++ b/include/Spectre/GfxDriver/GfxDriver.h @@ -6,6 +6,8 @@ namespace sp { +class ShaderProgram; + class GfxDriver { public: @@ -34,6 +36,8 @@ public: // Resources. + virtual ShaderProgram* createShaderProgram() = 0; + // CreateIndexBuffer() // CreateVertexBuffer() From 043afc4e3dcf35dbabbcb42a40db41de733e536a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 25 Jul 2023 18:56:38 +0200 Subject: [PATCH 307/361] source/GfxDriver/OpenGL/OpenGLDrv.h: Adding createShaderProgram() --- source/GfxDriver/OpenGL/OpenGLDrv.cpp | 5 +++++ source/GfxDriver/OpenGL/OpenGLDrv.h | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/source/GfxDriver/OpenGL/OpenGLDrv.cpp b/source/GfxDriver/OpenGL/OpenGLDrv.cpp index f313608..312bf3c 100644 --- a/source/GfxDriver/OpenGL/OpenGLDrv.cpp +++ b/source/GfxDriver/OpenGL/OpenGLDrv.cpp @@ -1,5 +1,6 @@ #include "OpenGLDrv.h" +#include #include namespace sp { @@ -60,4 +61,8 @@ void OpenGLDrv::clearColorBuffer() glClear(GL_COLOR_BUFFER_BIT); } +ShaderProgram* OpenGLDrv::createShaderProgram() { + return new OpenGLShaderProgram(); +} + } // namespace sp diff --git a/source/GfxDriver/OpenGL/OpenGLDrv.h b/source/GfxDriver/OpenGL/OpenGLDrv.h index 583d695..6f81f14 100644 --- a/source/GfxDriver/OpenGL/OpenGLDrv.h +++ b/source/GfxDriver/OpenGL/OpenGLDrv.h @@ -6,6 +6,8 @@ namespace sp { +class ShaderProgram; + class OpenGLDrv : public GfxDriver { public: @@ -24,6 +26,8 @@ public: virtual void clearBuffer(GfxDriver::BufferFlags flags); virtual void clearColorBuffer(); + + virtual ShaderProgram* createShaderProgram(); }; } // namespace sp From 75a53f635d3f7bd17cdb189169a06a49de345d84 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 25 Jul 2023 19:23:36 +0200 Subject: [PATCH 308/361] source/Platform/Unix/X11EventQueue.cpp: Remove ResizeRequest. --- source/Platform/Unix/X11EventQueue.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/source/Platform/Unix/X11EventQueue.cpp b/source/Platform/Unix/X11EventQueue.cpp index 86931f8..c0be4b1 100644 --- a/source/Platform/Unix/X11EventQueue.cpp +++ b/source/Platform/Unix/X11EventQueue.cpp @@ -31,9 +31,6 @@ bool X11EventQueue::poll(Event& event) return true; } break; - case ResizeRequest: - Log::info("X11: Resize event"); - break; case KeyPress: case KeyRelease: if (X11Keyboard::handleMessage(&xevent.xkey, event)) { From ff5d719fcfeaf19c114df77317768ba006b94df1 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 25 Jul 2023 19:45:48 +0200 Subject: [PATCH 309/361] source/Platform/Unix/X11Display.cpp: Do not capture Pointer motions. --- source/Platform/Unix/X11Display.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index bb3be61..884fb40 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -55,7 +55,7 @@ bool X11Display::create(DisplayDescription description) // We want InputFocus,Keyboard,Mouse,Resize,Exposure (repaint) events. attr.event_mask = FocusChangeMask | KeyPressMask | KeyReleaseMask - | ButtonPressMask | ButtonReleaseMask | PointerMotionMask + | ButtonPressMask | ButtonReleaseMask | StructureNotifyMask | ExposureMask; m_win = ::XCreateWindow(disp, root_win, From 53d8248b8c6b4c4fa2e2e0d94e8cf5c4e1d179bc Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 25 Jul 2023 21:24:58 +0200 Subject: [PATCH 310/361] source/Platform/Unix/X11Display.cpp: typofix. --- source/Platform/Unix/X11Display.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 884fb40..e8e5770 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -247,7 +247,7 @@ void X11Display::setIcon(unsigned int width, unsigned int height, const uint8_t *ptr++ = width; *ptr++ = height; - // TODO: Conversion between differnet formats should be defined as functions in Graphics/PixelFormat.h + // TODO: Conversion between different formats should be defined as functions in Graphics/PixelFormat.h for (std::size_t i = 0; i < width * height; i++) { *ptr++ = (pixels[i * 4 + 2] << 0) | (pixels[i * 4 + 1] << 8) From 35a6b38d1626f14385fb0dcf121444800a572900 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 2 Aug 2023 00:32:35 +0200 Subject: [PATCH 311/361] source/Platform/Unix/X11Mouse.cpp: minor whitespace fix. --- source/Platform/Unix/X11Mouse.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11Mouse.cpp b/source/Platform/Unix/X11Mouse.cpp index f4bd651..3c7ccb5 100644 --- a/source/Platform/Unix/X11Mouse.cpp +++ b/source/Platform/Unix/X11Mouse.cpp @@ -49,7 +49,7 @@ bool X11Mouse::isButtonDown(Mouse::Button button) const return m_btn_state & Button1Mask; case Mouse::Button::Right : return m_btn_state & Button3Mask; - case Mouse::Button::Middle : + case Mouse::Button::Middle : return m_btn_state & Button2Mask; case Mouse::Button::XButton1 : return _priv::xstate & XBUTTON1BIT; From 1854c4cb51785fa89ba949db3c7f46a660d80c31 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 2 Aug 2023 00:34:56 +0200 Subject: [PATCH 312/361] source/Platform/Unix/GLXContext.cpp: Whitespace fix. --- source/Platform/Unix/GLXContext.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/source/Platform/Unix/GLXContext.cpp b/source/Platform/Unix/GLXContext.cpp index ea93438..74b6700 100644 --- a/source/Platform/Unix/GLXContext.cpp +++ b/source/Platform/Unix/GLXContext.cpp @@ -103,11 +103,11 @@ bool GLXContext::createGLContext() }; GLint ctx_attr[] = { - GLX_CONTEXT_MAJOR_VERSION_ARB, 3, - GLX_CONTEXT_MINOR_VERSION_ARB, 2, - GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, - None - }; + GLX_CONTEXT_MAJOR_VERSION_ARB, 3, + GLX_CONTEXT_MINOR_VERSION_ARB, 2, + GLX_CONTEXT_PROFILE_MASK_ARB, GLX_CONTEXT_CORE_PROFILE_BIT_ARB, + None + }; // Ensure glx extensions are loaded. if (!ensureExtensionsLoaded(disp, DefaultScreen(disp))) { @@ -121,7 +121,7 @@ bool GLXContext::createGLContext() } // Setup GL settings. - fbc = glXChooseFBConfig(disp, DefaultScreen(disp), (const int*) info->visual, &fbcount); + fbc = glXChooseFBConfig(disp, DefaultScreen(disp), (const int*) info->visual, &fbcount); if (fbc == NULL) { Log::warn("GLX: Could not find FB Config."); return false; @@ -134,7 +134,7 @@ bool GLXContext::createGLContext() return false; } - glXMakeCurrent(disp, m_win, m_ctx); + glXMakeCurrent(disp, m_win, m_ctx); // Load OpenGL if (!loadGL()) { From ea0edcf07fcdf4496f00f1563483d857124e947f Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 2 Aug 2023 00:35:11 +0200 Subject: [PATCH 313/361] source/Platform/Unix/GLXContext.h: Whitespace fix. --- source/Platform/Unix/GLXContext.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Platform/Unix/GLXContext.h b/source/Platform/Unix/GLXContext.h index 878a6f7..65d940b 100644 --- a/source/Platform/Unix/GLXContext.h +++ b/source/Platform/Unix/GLXContext.h @@ -39,7 +39,7 @@ private : private : - ::Window m_win; + ::Window m_win; ::GLXContext m_ctx; }; From 8ff2a3d37f3cb66f4a593be2197ac8a71a3dde5e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 2 Aug 2023 00:49:43 +0200 Subject: [PATCH 314/361] engine.cmake: sort unix files abit. --- engine.cmake | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/engine.cmake b/engine.cmake index f8d1494..f12044a 100644 --- a/engine.cmake +++ b/engine.cmake @@ -108,18 +108,22 @@ set(ENGINE_PLATFORM_WIN32_SRC ) set(ENGINE_PLATFORM_UNIX_SRC - source/Platform/Unix/Xlib.cpp source/Platform/Unix/UnixApplication.cpp - source/Platform/Unix/X11Display.cpp + source/Platform/Unix/UnixSystem.cpp + source/Platform/Unix/UnixMisc.cpp + + # GLContext source/Platform/Unix/GLXContext.cpp + source/Platform/Unix/glad_glx.c + + # X11 + source/Platform/Unix/Xlib.cpp + source/Platform/Unix/X11Display.cpp source/Platform/Unix/X11Input.cpp source/Platform/Unix/X11Keyboard.cpp source/Platform/Unix/X11Mouse.cpp source/Platform/Unix/X11EventQueue.cpp source/Platform/Unix/X11WindowEventHandler.cpp - source/Platform/Unix/UnixMisc.cpp - source/Platform/Unix/UnixSystem.cpp - source/Platform/Unix/glad_glx.c ) From 57d4e44bbef03d0bd31731b4f2da2eeee1aa5017 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 2 Aug 2023 05:19:15 +0200 Subject: [PATCH 315/361] source/Platform/Unix/X11Display.cpp: make getSize() query X11 and dont just return cached value. --- source/Platform/Unix/X11Display.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index e8e5770..1f5144c 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -126,7 +126,20 @@ void X11Display::setSize(unsigned int width, unsigned int height) Vector2u X11Display::getSize() const { - return m_size; + int x, y; + unsigned int w, h, bw, d; + ::Display* disp = Xlib::getDisplay(); + ::Window ancestor = m_win; + ::Window root = DefaultRootWindow(disp); + + while (Xlib::getParentWindow(ancestor) != root) { + // Next window up (parent window). + ancestor = Xlib::getParentWindow(ancestor); + } + + ::XGetGeometry(disp, ancestor, &root, &x, &y, &w, &h, &bw, &d); + + return Vector2u(w, h); } void X11Display::setPosition(unsigned int x, unsigned int y) From 624871486f2fe1f90ed1c19de153ba4b45dd08bb Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 2 Aug 2023 05:19:59 +0200 Subject: [PATCH 316/361] source/Platform/Unix/X11Display.cpp: Improve logging. --- source/Platform/Unix/X11Display.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 1f5144c..8b87b2e 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -111,6 +111,8 @@ void* X11Display::getHandle() const void X11Display::setSize(unsigned int width, unsigned int height) { + Log::info("X11: Set size %dx%d", width, height); + // X11 does not like if width or height is zero. if (width == 0) { width = 1; @@ -317,7 +319,7 @@ void X11Display::processEvent(const ::XEvent& event) if (m_size != size) { m_size = size; - Log::info("X11: Resize event"); + Log::info("X11: Resize event %dx%d", m_size.x, m_size.y); onReshape(size.x, size.y); } break; From 186a6e0f14d75d57859a8c7fe946abed08108c06 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 2 Aug 2023 05:21:35 +0200 Subject: [PATCH 317/361] Unix: Adding FindMode() XRandR helper function. --- engine.cmake | 1 + source/Platform/Unix/XRandR.cpp | 34 +++++++++++++++++++++++++++++++++ source/Platform/Unix/XRandR.h | 18 +++++++++++++++++ 3 files changed, 53 insertions(+) create mode 100644 source/Platform/Unix/XRandR.cpp create mode 100644 source/Platform/Unix/XRandR.h diff --git a/engine.cmake b/engine.cmake index f12044a..5af28f1 100644 --- a/engine.cmake +++ b/engine.cmake @@ -118,6 +118,7 @@ set(ENGINE_PLATFORM_UNIX_SRC # X11 source/Platform/Unix/Xlib.cpp + source/Platform/Unix/XRandR.cpp source/Platform/Unix/X11Display.cpp source/Platform/Unix/X11Input.cpp source/Platform/Unix/X11Keyboard.cpp diff --git a/source/Platform/Unix/XRandR.cpp b/source/Platform/Unix/XRandR.cpp new file mode 100644 index 0000000..c934218 --- /dev/null +++ b/source/Platform/Unix/XRandR.cpp @@ -0,0 +1,34 @@ +#include "XRandR.h" +#include +#include + +namespace sp { + +bool XRandR::FindMode(::Display* disp, unsigned int width, unsigned int height, unsigned int bpp, SizeID *id, short *rate) +{ + ::XRRScreenSize *xrrs; + int num_sizes; + + xrrs = XRRSizes(disp, 0, &num_sizes); + for(int i = 0; i < num_sizes; i++) { + + Log::debug("Mode %dx%d", xrrs[i].width, xrrs[i].height); + + if (xrrs[i].width != width && xrrs[i].height != height) { + continue; + } + + short *rates; + int num_rates; + + rates = XRRRates(disp, 0, i, &num_rates); + if (num_rates > 0) { + *id = i; + *rate = rates[num_rates - 1]; + return true; + } + } + return false; +} + +} // namespace sp \ No newline at end of file diff --git a/source/Platform/Unix/XRandR.h b/source/Platform/Unix/XRandR.h new file mode 100644 index 0000000..6faac86 --- /dev/null +++ b/source/Platform/Unix/XRandR.h @@ -0,0 +1,18 @@ + +#ifndef PLATFORM_UNIX_XRANDR_H +#define PLATFORM_UNIX_XRANDR_H + +#include + +namespace sp { namespace XRandR { + +struct VideoMode { + SizeID size; + short rate; +}; + +bool FindMode(::Display* disp, unsigned int width, unsigned int height, unsigned int bpp, SizeID *id, short *rate); + +} } // sp::XRandR + +#endif /* PLATFORM_UNIX_XRANDR_H */ From 2cf035089ba7ff29dd01e26a3aa3e16da212ba06 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 2 Aug 2023 06:01:33 +0200 Subject: [PATCH 318/361] source/Platform/Unix/X11Display.cpp: implement fullscreen somewhat correctly :) --- source/Platform/Unix/X11Display.cpp | 74 ++++++++++++++++++++++++++++- source/Platform/Unix/X11Display.h | 9 ++++ 2 files changed, 82 insertions(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index 8b87b2e..d255d58 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include "XRandR.h" #include "X11WindowEventHandler.h" #include "Xlib.h" #include "wm_hints.h" @@ -238,14 +240,75 @@ void X11Display::maximize() void X11Display::enterFullscreen(DisplayMode mode) { + if (!XRandR::FindMode(Xlib::getDisplay(), mode.width, mode.height, mode.bpp, &m_fullscreen_mode.size, &m_fullscreen_mode.rate)) { + Log::warn("X11: Failed to find a mode"); + return; + } + toggleFullscreen(true); +} + +void X11Display::toggleFullscreen(bool enable) +{ + ::Display* disp = Xlib::getDisplay(); + ::Window root; + ::XRRScreenConfiguration *conf; + XRandR::VideoMode *mode = &m_desktop_mode; + + root = RootWindow(disp, 0); + conf = XRRGetScreenInfo(disp, root); + + if (enable) { + if (m_desktop_mode.rate < 1) { + Rotation r; + m_desktop_mode.rate = XRRConfigCurrentRate(conf); + m_desktop_mode.size = XRRConfigCurrentConfiguration(conf, &r); + } + + mode = &m_fullscreen_mode; + } + + wm_fullscreen(enable); + XRRSetScreenConfigAndRate(disp, conf, root, mode->size, RR_Rotate_0, mode->rate, CurrentTime); } void X11Display::exitFullscreen() { - + if (m_fullscreen_mode.rate > 0) { + toggleFullscreen(false); + m_fullscreen_mode.rate = 0; + m_fullscreen_mode.size = 0; + m_desktop_mode.rate = 0; + m_desktop_mode.size = 0; + } } +#define _NET_WM_STATE_REMOVE 0 /* remove/unset property */ +#define _NET_WM_STATE_ADD 1 /* add/set property */ + +void X11Display::wm_fullscreen(bool enabled) { + + ::Display* disp = sp::Xlib::getDisplay(); + + XEvent xev; + Atom wm_state = sp::Xlib::getAtom("_NET_WM_STATE", False); + Atom wm_fs = sp::Xlib::getAtom("_NET_WM_STATE_FULLSCREEN", False); + + memset(&xev, 0, sizeof(xev)); + xev.type = ClientMessage; + xev.xclient.window = m_win; + xev.xclient.message_type = wm_state; + xev.xclient.format = 32; + xev.xclient.data.l[0] = enabled ? _NET_WM_STATE_ADD : _NET_WM_STATE_REMOVE; + xev.xclient.data.l[1] = wm_fs; + xev.xclient.data.l[2] = 0; + + ::XSendEvent(disp, ::XDefaultRootWindow(disp), False, + SubstructureRedirectMask | SubstructureNotifyMask, + &xev); +} + + void X11Display::setCaption(const std::string& caption) { ::XStoreName(Xlib::getDisplay(), m_win, caption.c_str()); @@ -329,10 +392,19 @@ void X11Display::processEvent(const ::XEvent& event) case FocusIn: Log::debug("X11: FocusIn"); _priv::focused_display = this; + + if (m_fullscreen_mode.rate > 0) { + toggleFullscreen(true); + } + break; case FocusOut: Log::debug("X11: FocusOut"); _priv::focused_display = NULL; + if (m_fullscreen_mode.rate > 0) { + toggleFullscreen(false); + minimize(); + } break; } } diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Display.h index ae2d327..2c2ca79 100644 --- a/source/Platform/Unix/X11Display.h +++ b/source/Platform/Unix/X11Display.h @@ -7,6 +7,7 @@ #include #include #include +#include "Xrandr.h" namespace sp { @@ -62,6 +63,10 @@ protected : void createHiddenCursor(); + void toggleFullscreen(bool enabled); + + void wm_fullscreen(bool enabled); + protected : ::Window m_win; @@ -72,6 +77,10 @@ protected : ::Cursor m_cur_last; Vector2u m_size; + + XRandR::VideoMode m_fullscreen_mode; + + XRandR::VideoMode m_desktop_mode; }; } // namespace sp From d601d95d40248195132f5bfffaa28f1c1fb138b3 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 2 Aug 2023 20:16:36 +0200 Subject: [PATCH 319/361] source/Platform/Unix/X11Display.cpp: Tell window to generate pointer events. --- source/Platform/Unix/X11Display.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index d255d58..f4f2222 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -57,7 +57,7 @@ bool X11Display::create(DisplayDescription description) // We want InputFocus,Keyboard,Mouse,Resize,Exposure (repaint) events. attr.event_mask = FocusChangeMask | KeyPressMask | KeyReleaseMask - | ButtonPressMask | ButtonReleaseMask + | ButtonPressMask | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask | ExposureMask; m_win = ::XCreateWindow(disp, root_win, From 085d593b66ca6cc871a59413cb1ff0b130068197 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 2 Aug 2023 20:29:39 +0200 Subject: [PATCH 320/361] source/Platform/Unix/X11Display.cpp: implement grabCursor() --- source/Platform/Unix/X11Display.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Display.cpp index f4f2222..2fba1b7 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Display.cpp @@ -368,7 +368,16 @@ void X11Display::showCursor(bool value) void X11Display::grabCursor(bool value) { - // TODO (this is abit harder on X11 than windows.) + if (value) { + int result = ::XGrabPointer(Xlib::getDisplay(), m_win, True, None, + GrabModeAsync, GrabModeAsync, m_win, None, CurrentTime); + + if (result != GrabSuccess) { + Log::info("X11: Cursor Grab failed"); + } + } else { + ::XUngrabPointer(Xlib::getDisplay(), CurrentTime); + } } void X11Display::processEvent(const ::XEvent& event) From 962c18fcaccf3f53daac36654235dd3616512391 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 2 Aug 2023 20:32:46 +0200 Subject: [PATCH 321/361] examples/input/InputExample: Adding support for Event based mouse movement. --- examples/input/InputExample.cpp | 26 ++++++++++++++++++++++++++ examples/input/InputExample.h | 10 +++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/examples/input/InputExample.cpp b/examples/input/InputExample.cpp index 0dc73e0..4820bd6 100644 --- a/examples/input/InputExample.cpp +++ b/examples/input/InputExample.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include #include @@ -11,6 +13,8 @@ void InputExample::init() { m_renderer = new sp::BatchRenderer2D(); + getMessageHandler()->registerListener(this); + m_tux_texture.create("assets/textures/tux.png"); m_kb_sprite.setTexture(m_tux_texture); @@ -22,6 +26,13 @@ void InputExample::init() m_mouse_sprite.setSize(sp::vec2f(100, 100)); m_mouse_sprite.setPosition(sp::vec2f(50, 50)); + m_mouse_event_sprite.setTexture(m_tux_texture); + m_mouse_event_sprite.setColor(sp::Color::Blue); + m_mouse_event_sprite.setSize(sp::vec2f(100, 100)); + m_mouse_event_sprite.setPosition(sp::vec2f(50, 50)); + + m_right_mouse_down = false; + m_renderer->setCamera(m_camera); } @@ -50,6 +61,20 @@ void InputExample::update(double dt) } } +void InputExample::onSizeChanged(sp::Display* display, int width, int height) +{ + +} + +void InputExample::onEvent(const sp::Event& event) +{ + if (event.type == event.MouseButton && event.mouseButton.button == sp::Mouse::Right) { + m_right_mouse_down = event.mouseButton.pressed; + } else if (event.type == event.MouseMove && m_right_mouse_down) { + m_mouse_event_sprite.setPosition(event.mouseMove.x, event.mouseMove.y); + } +} + void InputExample::render() { sp::Graphics* g = getGraphics(); @@ -58,6 +83,7 @@ void InputExample::render() m_renderer->begin(); m_renderer->submit(m_mouse_sprite); + m_renderer->submit(m_mouse_event_sprite); m_renderer->submit(m_kb_sprite); m_renderer->render(); diff --git a/examples/input/InputExample.h b/examples/input/InputExample.h index e227a8d..8c95e5d 100644 --- a/examples/input/InputExample.h +++ b/examples/input/InputExample.h @@ -5,13 +5,14 @@ #include #include #include +#include #include namespace sp { class Renderer2D; } -class InputExample : public sp::Game +class InputExample : public sp::Game, sp::EventListener { protected : @@ -21,12 +22,19 @@ protected : void render(); + void onSizeChanged(sp::Display* display, int width, int height); + + void onEvent(const sp::Event& event); + private : sp::Camera2D m_camera; sp::Renderer2D *m_renderer; sp::Sprite m_kb_sprite; sp::Sprite m_mouse_sprite; + sp::Sprite m_mouse_event_sprite; + + bool m_right_mouse_down; sp::Texture m_tux_texture; }; From f240d140520a29df498d979601f846b618624f2f Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 2 Aug 2023 20:34:38 +0200 Subject: [PATCH 322/361] examples/input/InputExample.cpp: Also test mouse grab. --- examples/input/InputExample.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/examples/input/InputExample.cpp b/examples/input/InputExample.cpp index 4820bd6..76b1233 100644 --- a/examples/input/InputExample.cpp +++ b/examples/input/InputExample.cpp @@ -68,7 +68,15 @@ void InputExample::onSizeChanged(sp::Display* display, int width, int height) void InputExample::onEvent(const sp::Event& event) { - if (event.type == event.MouseButton && event.mouseButton.button == sp::Mouse::Right) { + if (event.type == event.Key && !event.key.pressed) { + if (event.key.code == sp::Keyboard::G) { + getGraphics()->getDisplay()->grabCursor(true); + sp::Log::info("Mouse Grabbed"); + } else if (event.key.code == sp::Keyboard::U) { + getGraphics()->getDisplay()->grabCursor(false); + sp::Log::info("Mouse Released"); + } + } else if (event.type == event.MouseButton && event.mouseButton.button == sp::Mouse::Right) { m_right_mouse_down = event.mouseButton.pressed; } else if (event.type == event.MouseMove && m_right_mouse_down) { m_mouse_event_sprite.setPosition(event.mouseMove.x, event.mouseMove.y); From 60333f6d0285811fc1547872ef5891c5621d31d3 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 2 Aug 2023 22:18:33 +0200 Subject: [PATCH 323/361] include/Spectre/Display/Display.h: Adding getSize() --- include/Spectre/Display/Display.h | 2 ++ source/Display/Display.cpp | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/include/Spectre/Display/Display.h b/include/Spectre/Display/Display.h index 073fd0d..e953f72 100644 --- a/include/Spectre/Display/Display.h +++ b/include/Spectre/Display/Display.h @@ -34,6 +34,8 @@ public : void setSize(unsigned int width, unsigned int height); + sp::Vector2u getSize() const; + void setCaption(const std::string& title); const std::string& getCaption() const; diff --git a/source/Display/Display.cpp b/source/Display/Display.cpp index 3c9202b..c86f21f 100644 --- a/source/Display/Display.cpp +++ b/source/Display/Display.cpp @@ -96,6 +96,11 @@ void Display::setSize(unsigned int width, unsigned int height) m_impl->setSize(width, height); } +sp::Vector2u Display::getSize() const +{ + return m_impl->getSize(); +} + void Display::setVideoMode(Mode mode) { if (m_fmode == mode) { From c1f1dd75bdd8efb9a51ddbadf6f9f9e3b6caca57 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 2 Aug 2023 22:30:45 +0200 Subject: [PATCH 324/361] GLContext: remove setSize() and set glViewport() in Display::onReshape() --- include/Spectre/Display/GLContext.h | 3 --- source/Display/Display.cpp | 10 ++++++++-- source/Platform/Unix/GLXContext.cpp | 13 ------------- source/Platform/Unix/GLXContext.h | 4 ---- source/Platform/Win32/Win32GLContext.cpp | 7 ------- source/Platform/Win32/Win32GLContext.h | 4 ---- 6 files changed, 8 insertions(+), 33 deletions(-) diff --git a/include/Spectre/Display/GLContext.h b/include/Spectre/Display/GLContext.h index 9f2acba..837d629 100644 --- a/include/Spectre/Display/GLContext.h +++ b/include/Spectre/Display/GLContext.h @@ -38,9 +38,6 @@ public : // This is usually refered to as enabling/disabling vertical synchronization. virtual bool setSwapInterval(int interval) = 0; - // Set the size of the pixel buffer. - virtual void setSize(unsigned int width, unsigned int height) = 0; - // Swap front with back buffer and vice versa. virtual void swapBuffers() = 0; }; diff --git a/source/Display/Display.cpp b/source/Display/Display.cpp index c86f21f..2d57402 100644 --- a/source/Display/Display.cpp +++ b/source/Display/Display.cpp @@ -5,6 +5,8 @@ #include #include +#include + namespace sp { #define CAPTION_DEFAULT "Spectre" @@ -182,8 +184,12 @@ void Display::swapBuffers() void Display::onReshape(int width, int height) { - // Resize context if the windows resizes. - m_context->setSize(width, height); + // TODO: This should even not be here. + // Generic Display should not have any GL calls. + // But it's better to have it here then in the platform specific GLContext + if (activate(true)) { + glViewport(0, 0, width, height); + } } } // namespace sp diff --git a/source/Platform/Unix/GLXContext.cpp b/source/Platform/Unix/GLXContext.cpp index 74b6700..0fee7bc 100644 --- a/source/Platform/Unix/GLXContext.cpp +++ b/source/Platform/Unix/GLXContext.cpp @@ -189,19 +189,6 @@ bool GLXContext::setSwapInterval(int interval) return false; } -void GLXContext::setSize(unsigned int width, unsigned int height) -{ - // TODO: Not GLX specific! move to generic GLContext class. - if (activate()) { - glViewport(0, 0, width, height); - } -} - -void GLXContext::setSize(const Vector2u size) -{ - setSize(size.x, size.y); -} - void GLXContext::swapBuffers() { glXSwapBuffers(Xlib::getDisplay(), m_win); diff --git a/source/Platform/Unix/GLXContext.h b/source/Platform/Unix/GLXContext.h index 65d940b..7941e5b 100644 --- a/source/Platform/Unix/GLXContext.h +++ b/source/Platform/Unix/GLXContext.h @@ -28,10 +28,6 @@ public : bool setSwapInterval(int interval); - void setSize(unsigned int width, unsigned int height); - - void setSize(const Vector2u size); - void swapBuffers(); private : diff --git a/source/Platform/Win32/Win32GLContext.cpp b/source/Platform/Win32/Win32GLContext.cpp index 475394a..c9b1c25 100644 --- a/source/Platform/Win32/Win32GLContext.cpp +++ b/source/Platform/Win32/Win32GLContext.cpp @@ -149,13 +149,6 @@ bool Win32GLContext::setSwapInterval(int interval) return wglSwapIntervalEXT(interval); } -void Win32GLContext::setSize(unsigned int width, unsigned int height) -{ - if (activate()) { - glViewport(0, 0, width, height); - } -} - void Win32GLContext::swapBuffers() { if (m_deviceContext) { diff --git a/source/Platform/Win32/Win32GLContext.h b/source/Platform/Win32/Win32GLContext.h index 6525c1e..b91807e 100644 --- a/source/Platform/Win32/Win32GLContext.h +++ b/source/Platform/Win32/Win32GLContext.h @@ -28,10 +28,6 @@ public : bool setSwapInterval(int interval); - void setSize(unsigned int width, unsigned int height); - - void setSize(const Vector2u size); - void swapBuffers(); private : From 76aa838e8efd36213e7b3e26d248e4f20b46a0b2 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 2 Aug 2023 22:48:40 +0200 Subject: [PATCH 325/361] source/Platform/Win32/Win32GLContext.cpp: in isActive() make sure this function returns false if m_renderContext is null. --- source/Platform/Win32/Win32GLContext.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/Platform/Win32/Win32GLContext.cpp b/source/Platform/Win32/Win32GLContext.cpp index c9b1c25..5a02f8a 100644 --- a/source/Platform/Win32/Win32GLContext.cpp +++ b/source/Platform/Win32/Win32GLContext.cpp @@ -139,7 +139,7 @@ bool Win32GLContext::deactivate() bool Win32GLContext::isActive() const { - return ::wglGetCurrentContext() == m_renderContext; + return m_renderContext != NULL && ::wglGetCurrentContext() == m_renderContext; } bool Win32GLContext::setSwapInterval(int interval) From 80591ff6ee8a107207ae007b45a63d6d1e21ff94 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 3 Aug 2023 15:23:19 +0200 Subject: [PATCH 326/361] source/Platform/Win32/Win32Display: Adding calculateSize() --- source/Platform/Win32/Win32Display.cpp | 7 +++++++ source/Platform/Win32/Win32Display.h | 2 ++ 2 files changed, 9 insertions(+) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index 7e89676..eeecffe 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -284,6 +284,13 @@ Vector2i Win32Display::centerWindow(int width, int height) return v; } +Vector2u Win32Display::calculateSize(DWORD flags, LONG width, LONG height) +{ + RECT r = {0, 0, width, height}; + AdjustWindowRect(&r, flags, false); + return Vector2u(r.right - r.left, r.bottom - r.top); +} + void Win32Display::enterFullscreen(DisplayMode mode) { LONG rc; diff --git a/source/Platform/Win32/Win32Display.h b/source/Platform/Win32/Win32Display.h index 510c275..5d7b4fe 100644 --- a/source/Platform/Win32/Win32Display.h +++ b/source/Platform/Win32/Win32Display.h @@ -55,6 +55,8 @@ protected : void registerClass(); + Vector2u calculateSize(DWORD flags, LONG width, LONG height); + DWORD getWin32Flags(unsigned int flags); Vector2i centerWindow(int width, int height); From ea4267ef2d08e429a938963dc33c067dac0fb3ce Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 3 Aug 2023 15:24:11 +0200 Subject: [PATCH 327/361] source/Platform/Win32/Win32Display.cpp: Use calculateSize() in setSize() --- source/Platform/Win32/Win32Display.cpp | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index eeecffe..78f4be0 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -91,14 +91,8 @@ bool Win32Display::isValid() void Win32Display::setSize(unsigned int width, unsigned int height) { - int w, h; - RECT rect = {0, 0, (LONG) width, (LONG) height}; - AdjustWindowRect(&rect, GetWindowLong(m_handle, GWL_STYLE), false); - - w = rect.right - rect.left; - h = rect.bottom - rect.top; - - ::SetWindowPos(m_handle, NULL, 0, 0, w, h, SWP_NOMOVE | SWP_NOZORDER); + Vector2i s = calculateSize(GetWindowLong(m_handle, GWL_STYLE), width, height); + ::SetWindowPos(m_handle, NULL, 0, 0, s.x, s.y, SWP_NOMOVE | SWP_NOZORDER); } Vector2u Win32Display::getSize() const From fcc292a40ffbe7ff57ec1fb93c666eb260a8c42a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Thu, 3 Aug 2023 15:43:18 +0200 Subject: [PATCH 328/361] source/Platform/Win32/Win32Display.cpp: in create() fix a bug where window size was initially not setup correctly causing two resize events. --- source/Platform/Win32/Win32Display.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Display.cpp index 78f4be0..23f53c7 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Display.cpp @@ -42,20 +42,26 @@ Win32Display::~Win32Display() bool Win32Display::create(DisplayDescription description) { DWORD flags; - Vector2i pos; + Vector2i pos, actual_size; if (firstTime) { registerClass(); firstTime = false; } + // Store the size for use later. + m_size = Vector2u(description.mode.width, description.mode.height); + // Set window to center and set decoration flags. pos = centerWindow(description.mode.width, description.mode.height); flags = getWin32Flags(description.decoration); + // Calculate the actuall window size (with borders and stuff) + actual_size = calculateSize(flags, description.mode.width, description.mode.height); + // Create window. m_handle = CreateWindowExA(0, WND_CLASSNAME, "", flags, - pos.x, pos.y, description.mode.width, description.mode.height, + pos.x, pos.y, actual_size.x, actual_size.y, NULL, NULL, GetModuleHandle(NULL), (LPVOID) this); if (!m_handle) { @@ -63,11 +69,6 @@ bool Win32Display::create(DisplayDescription description) return false; } - setSize(description.mode.width, description.mode.height); - - // Store the size for use later. - m_size = getSize(); - return true; } From 7b46a85cec1c0e7cd5a605c1eb476fe0aff9e354 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 4 Aug 2023 03:43:26 +0200 Subject: [PATCH 329/361] source/Platform/Win32/Win32Keyboard.cpp: Fixing some keycodes that where wrong. --- source/Platform/Win32/Win32Keyboard.cpp | 46 ++++++++++++------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/source/Platform/Win32/Win32Keyboard.cpp b/source/Platform/Win32/Win32Keyboard.cpp index e309675..a9697e1 100644 --- a/source/Platform/Win32/Win32Keyboard.cpp +++ b/source/Platform/Win32/Win32Keyboard.cpp @@ -14,29 +14,29 @@ static const BYTE keyToWin32[Keyboard::Key::NUM_KEYS] = { 0x41, // A 0x42, // B 0x43, // C - 0x42, // D - 0x43, // E - 0x44, // F - 0x45, // G - 0x46, // H - 0x47, // I - 0x48, // J - 0x49, // K - 0x50, // L - 0x51, // M - 0x52, // N - 0x53, // O - 0x54, // P - 0x55, // Q - 0x56, // R - 0x57, // S - 0x58, // T - 0x59, // U - 0x60, // V - 0x61, // W - 0x62, // X - 0x63, // Y - 0x64, // Z + 0x44, // D + 0x45, // E + 0x46, // F + 0x47, // G + 0x48, // H + 0x49, // I + 0x4A, // J + 0x4B, // K + 0x4C, // L + 0x4D, // M + 0x4E, // N + 0x4F, // O + 0x50, // P + 0x51, // Q + 0x52, // R + 0x53, // S + 0x54, // T + 0x55, // U + 0x56, // V + 0x57, // W + 0x58, // X + 0x59, // Y + 0x5A, // Z 0x30, // One 0x31, // Two From c313c5134f119d5187974815a949aa82cb9c2d53 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 4 Aug 2023 03:43:46 +0200 Subject: [PATCH 330/361] source/Platform/Win32/Win32Keyboard.cpp: Minor style fixes. --- source/Platform/Win32/Win32Keyboard.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/source/Platform/Win32/Win32Keyboard.cpp b/source/Platform/Win32/Win32Keyboard.cpp index a9697e1..d038ee7 100644 --- a/source/Platform/Win32/Win32Keyboard.cpp +++ b/source/Platform/Win32/Win32Keyboard.cpp @@ -104,26 +104,26 @@ static const BYTE keyToWin32[Keyboard::Key::NUM_KEYS] = { }; static const Keyboard::Key deviceToKey[256] = { - /* 0 1 2 3 4 5 6 7 */ - /* 8 9 A B C D E F */ + /* 0 1 2 3 4 5 6 7 */ + /* 8 9 A B C D E F */ // 00-0F Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Backspace, Keyboard::Key::Tab, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Enter, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 10-1F - Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Pause, Keyboard::Key::Capslock, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Pause, Keyboard::Key::Capslock,Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Escape, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 20-2F - Keyboard::Key::Space, Keyboard::Key::PageUp, Keyboard::Key::PageDown, Keyboard::Key::End, Keyboard::Key::Home, Keyboard::Key::Left, Keyboard::Key::Up, Keyboard::Key::Right, + Keyboard::Key::Space, Keyboard::Key::PageUp, Keyboard::Key::PageDown,Keyboard::Key::End, Keyboard::Key::Home, Keyboard::Key::Left, Keyboard::Key::Up, Keyboard::Key::Right, Keyboard::Key::Down, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Insert, Keyboard::Key::Delete, Keyboard::Key::Unknown, // 30-3F Keyboard::Key::Zero, Keyboard::Key::One, Keyboard::Key::Two, Keyboard::Key::Three, Keyboard::Key::Four, Keyboard::Key::Five, Keyboard::Key::Six, Keyboard::Key::Seven, Keyboard::Key::Eight, Keyboard::Key::Nine, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 40-4F - Keyboard::Key::Unknown, Keyboard::Key::A, Keyboard::Key::B, Keyboard::Key::C, Keyboard::Key::D, Keyboard::Key::E, Keyboard::Key::F, Keyboard::Key::G, - Keyboard::Key::H, Keyboard::Key::I, Keyboard::Key::J, Keyboard::Key::K, Keyboard::Key::L, Keyboard::Key::M, Keyboard::Key::N, Keyboard::Key::O, + Keyboard::Key::Unknown, Keyboard::Key::A, Keyboard::Key::B, Keyboard::Key::C, Keyboard::Key::D, Keyboard::Key::E, Keyboard::Key::F, Keyboard::Key::G, + Keyboard::Key::H, Keyboard::Key::I, Keyboard::Key::J, Keyboard::Key::K, Keyboard::Key::L, Keyboard::Key::M, Keyboard::Key::N, Keyboard::Key::O, // 50-5F - Keyboard::Key::P, Keyboard::Key::Q, Keyboard::Key::R, Keyboard::Key::S, Keyboard::Key::T, Keyboard::Key::U, Keyboard::Key::V, Keyboard::Key::W, - Keyboard::Key::X, Keyboard::Key::Y, Keyboard::Key::Z, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, + Keyboard::Key::P, Keyboard::Key::Q, Keyboard::Key::R, Keyboard::Key::S, Keyboard::Key::T, Keyboard::Key::U, Keyboard::Key::V, Keyboard::Key::W, + Keyboard::Key::X, Keyboard::Key::Y, Keyboard::Key::Z, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, // 60-6F Keyboard::Key::Numpad0, Keyboard::Key::Numpad1, Keyboard::Key::Numpad2, Keyboard::Key::Numpad3, Keyboard::Key::Numpad4, Keyboard::Key::Numpad5, Keyboard::Key::Numpad6, Keyboard::Key::Numpad7, Keyboard::Key::Numpad8, Keyboard::Key::Numpad9, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, Keyboard::Key::Unknown, From 6e8f06088233328d45382b77b4ac0f7366215e88 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 4 Aug 2023 03:48:03 +0200 Subject: [PATCH 331/361] include/Spectre/Math/Matrix3.h: Adding multiplication and division scalar operations. --- include/Spectre/Math/Matrix3.h | 11 ++++++++++- include/Spectre/Math/Matrix3.inl | 33 ++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/include/Spectre/Math/Matrix3.h b/include/Spectre/Math/Matrix3.h index d962cee..04c47d0 100644 --- a/include/Spectre/Math/Matrix3.h +++ b/include/Spectre/Math/Matrix3.h @@ -58,7 +58,16 @@ struct Matrix3 inline Matrix3 operator*(const Matrix3& mat) const; inline Matrix3 operator*=(const Matrix3& mat); - // Need scalar, vector arithmetic? + + // ----------------- + // Arithmetic: Scalar + // ----------------- + + inline Matrix3 operator/(T value) const; + inline Matrix3 operator/=(T value); + + inline Matrix3 operator*(T value) const; + inline Matrix3 operator*=(T value); // ----------------- // Named operations. diff --git a/include/Spectre/Math/Matrix3.inl b/include/Spectre/Math/Matrix3.inl index f63cdab..465f770 100644 --- a/include/Spectre/Math/Matrix3.inl +++ b/include/Spectre/Math/Matrix3.inl @@ -87,6 +87,39 @@ inline Matrix3 Matrix3::operator*=(const Matrix3& mat) return *this; } +template +inline Matrix3 Matrix3::operator/(T value) const +{ + return Matrix3( + v[0] / value, v[1] / value, v[2] / value, + v[3] / value, v[4] / value, v[5] / value, + v[6] / value, v[7] / value, v[8] / value); +} + +template +inline Matrix3 Matrix3::operator/=(T value) +{ + *this = *this / value; + return *this; +} + +template +inline Matrix3 Matrix3::operator*(T value) const +{ + return Matrix3( + v[0] * value, v[1] * value, v[2] * value, + v[3] * value, v[4] * value, v[5] * value, + v[6] * value, v[7] * value, v[8] * value); +} + +template +inline Matrix3 Matrix3::operator*=(T value) +{ + *this = *this * value; + return *this; +} + + template float Matrix3::det() const { From 910bad0fb7e5b0cd9377dacd82119dd751fe1974 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 4 Aug 2023 17:34:26 +0200 Subject: [PATCH 332/361] source/Math/Transform.cpp: Style fixes. --- source/Math/Transform.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/Math/Transform.cpp b/source/Math/Transform.cpp index 4854eb2..ab4835b 100644 --- a/source/Math/Transform.cpp +++ b/source/Math/Transform.cpp @@ -10,12 +10,12 @@ m_matrix (Matrix4f::Identity) } Transform::Transform( float a00, float a01, float a02, - float a10, float a11, float a12, - float a20, float a21, float a22) : + float a10, float a11, float a12, + float a20, float a21, float a22) : m_matrix (a00, a01, 0.0f, a02, - a10, a11, 0.0f, a12, - 0.0f, 0.0f, 1.0f, 0.0f, - a20, a21, 0.0f, a22) + a10, a11, 0.0f, a12, + 0.0f, 0.0f, 1.0f, 0.0f, + a20, a21, 0.0f, a22) { } From d8db86e40c571bf140dc0ff6844eaaa70e2c78e0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 18 Aug 2023 17:54:19 +0200 Subject: [PATCH 333/361] include/Spectre/Math/Matrix3.h: Add inverse() --- include/Spectre/Math/Matrix3.h | 3 +++ include/Spectre/Math/Matrix3.inl | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/include/Spectre/Math/Matrix3.h b/include/Spectre/Math/Matrix3.h index 04c47d0..1576348 100644 --- a/include/Spectre/Math/Matrix3.h +++ b/include/Spectre/Math/Matrix3.h @@ -78,6 +78,9 @@ struct Matrix3 // Transpose matrix. Matrix3 transpose() const; + + // Inverse + Matrix3 inverse() const; }; template diff --git a/include/Spectre/Math/Matrix3.inl b/include/Spectre/Math/Matrix3.inl index 465f770..9425c89 100644 --- a/include/Spectre/Math/Matrix3.inl +++ b/include/Spectre/Math/Matrix3.inl @@ -136,6 +136,30 @@ float Matrix3::det() const return det; } +template +Matrix3 Matrix3::inverse() const +{ + float d = det(); + + if (d != 0.0f) { + float a00 = (v[4] * v[8]) - (v[7] * v[5]); + float a01 = -((v[1] * v[8]) - (v[7] * v[2])); + float a02 = (v[1] * v[5]) - (v[4] * v[2]); + + float a10 = -((v[3] * v[8]) - (v[6] * v[5])); + float a11 = (v[0] * v[8]) - (v[6] * v[2]); + float a12 = -((v[0] * v[5]) - (v[3] * v[2])); + + float a20 = (v[3] * v[7]) - (v[6] * v[4]); + float a21 = -((v[0] * v[7]) - (v[6] * v[1])); + float a22 = (v[0] * v[4]) - (v[3] * v[1]); + + return Matrix3(a00, a01, a02, a10, a11, a12, a20, a21, a22) / d; + } + + return Matrix3::Identity; +} + template Matrix3 Matrix3::transpose() const { From 0f7a4bbabccd4dfbd1b4c1d34042b0b98b3db928 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 4 Aug 2023 17:32:07 +0200 Subject: [PATCH 334/361] include/Spectre/Math/Transform.h: Adding inverse() --- include/Spectre/Math/Transform.h | 4 ++++ source/Math/Transform.cpp | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/include/Spectre/Math/Transform.h b/include/Spectre/Math/Transform.h index 51ddf88..f29fa9c 100644 --- a/include/Spectre/Math/Transform.h +++ b/include/Spectre/Math/Transform.h @@ -53,6 +53,10 @@ public : Transform& scale(Vector2f offset); Transform& scale(float s); + // Inverse + + Transform inverse(); + Transform& combine(const Transform& other); Vector2f transformPoint(float x, float y) const; diff --git a/source/Math/Transform.cpp b/source/Math/Transform.cpp index ab4835b..35a7793 100644 --- a/source/Math/Transform.cpp +++ b/source/Math/Transform.cpp @@ -1,5 +1,6 @@ #include +#include #include namespace sp { @@ -83,6 +84,23 @@ Transform& Transform::scale(float s) return scale(s, s); } +Transform Transform::inverse() +{ + // Because a 2D Transform matrix is really just a 3x3 matrix. + // We can cheat here :) + Matrix3f m(m_matrix.e[0], m_matrix.e[1], m_matrix.e[3], + m_matrix.e[4], m_matrix.e[5], m_matrix.e[7], + m_matrix.e[12], m_matrix.e[13], m_matrix.e[15]); + + m = m.inverse(); + + return Transform( + m.v[0], m.v[3], m.v[6], + m.v[1], m.v[4], m.v[7], + m.v[2], m.v[5], m.v[8] + ); +} + Transform& Transform::combine(const Transform& other) { m_matrix *= other.m_matrix; From 8dbb0e02115a3ec88bdb1eb950f15e436d32ab24 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 20 Aug 2023 21:05:51 +0200 Subject: [PATCH 335/361] include/Spectre/System/Log/Writer.h: Adding flush() --- include/Spectre/System/Log/Writer.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/include/Spectre/System/Log/Writer.h b/include/Spectre/System/Log/Writer.h index 9ecefaf..7e7e247 100644 --- a/include/Spectre/System/Log/Writer.h +++ b/include/Spectre/System/Log/Writer.h @@ -9,6 +9,8 @@ public: virtual ~Writer() {} virtual size_t write(const void *data, size_t len) = 0; + + virtual bool flush() = 0; }; From 7b0cf72ac442642356b678c52679f2149d4711d9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 20 Aug 2023 21:06:39 +0200 Subject: [PATCH 336/361] Spectre/System/Log/FileWriter: Implement flush() --- include/Spectre/System/Log/FileWriter.h | 2 ++ source/System/Log/FileWriter.cpp | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/include/Spectre/System/Log/FileWriter.h b/include/Spectre/System/Log/FileWriter.h index 3034243..28c8cf7 100644 --- a/include/Spectre/System/Log/FileWriter.h +++ b/include/Spectre/System/Log/FileWriter.h @@ -19,6 +19,8 @@ public: size_t write(const void *data, size_t len); + virtual bool flush(); + protected: FILE *m_fd; diff --git a/source/System/Log/FileWriter.cpp b/source/System/Log/FileWriter.cpp index d050f85..0ab15e7 100644 --- a/source/System/Log/FileWriter.cpp +++ b/source/System/Log/FileWriter.cpp @@ -63,4 +63,8 @@ size_t FileWriter::write(const void *data, size_t len) return fwrite(data, 1, len, m_fd); } +bool FileWriter::flush() { + return fflush(m_fd) == 0; +} + } } // sp::log \ No newline at end of file From 813c0dab174924791ef5b1b207c4151c49ee8ecb Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sun, 20 Aug 2023 21:07:13 +0200 Subject: [PATCH 337/361] source/System/Log.cpp: make sure the writer is flushed after we write a line. --- source/System/Log.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/source/System/Log.cpp b/source/System/Log.cpp index b2d9226..30fb38f 100644 --- a/source/System/Log.cpp +++ b/source/System/Log.cpp @@ -85,6 +85,7 @@ void Log::writeln(Type type, const char *format, va_list args) len = sprintf(buf, "%s: %s\n", prefix, msg); _writer->write(buf, len); + _writer->flush(); } } // namespace sp From 416a71f744c8071c94f0257cb7d3a35b2593f051 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Mon, 21 Aug 2023 07:05:34 +0200 Subject: [PATCH 338/361] Spectre/Math: Adding Vector2UnProject() --- include/Spectre/Math/Math.h | 5 +++++ source/Math/Math.cpp | 11 +++++++++++ 2 files changed, 16 insertions(+) diff --git a/include/Spectre/Math/Math.h b/include/Spectre/Math/Math.h index 34f725c..24839f9 100644 --- a/include/Spectre/Math/Math.h +++ b/include/Spectre/Math/Math.h @@ -2,6 +2,8 @@ #ifndef SPECTRE_MATH_MATH_H #define SPECTRE_MATH_MATH_H +#include "Transform.h" +#include "Vector4.h" #include "Vector3.h" #include "Vector2.h" #include "Matrix4.h" @@ -32,6 +34,9 @@ namespace sp { namespace math float bottom, float top, float zNear = -1.0f, float zFar = 1.0f); + // + Vector2f Vector2UnProject(Vector2f point, Transform InverseMVP, Vector4u screen); + // Create a 2D rotation matrix. (rotation around Z-axis) Matrix4f rotation(float theta); diff --git a/source/Math/Math.cpp b/source/Math/Math.cpp index 2be138a..5f984c7 100644 --- a/source/Math/Math.cpp +++ b/source/Math/Math.cpp @@ -1,5 +1,6 @@ #include +#include #include namespace sp { namespace math @@ -47,6 +48,16 @@ namespace sp { namespace math ); } + Vector2f Vector2UnProject(Vector2f point, Transform InverseMVP, Vector4u screen) { + + // Convert to NDC from pixel cordinates first using screen size + point.x = -1.f + 2.f * (point.x - screen.x) / screen.z; + point.y = 1.f - 2.f * (point.y - screen.y) / screen.w; + + // Then transform the point using the inverse MVP matrix. + return InverseMVP.transformPoint(point); + } + Matrix4f rotation(float theta) { float r = deg2rad(theta); From 24da7f45e0a2229ea3db8e9dae908ea0713bb67d Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 22 Aug 2023 07:12:47 +0200 Subject: [PATCH 339/361] Rename Display to Window. It makes more sense to be consistent and always call it window. --- engine.cmake | 14 +-- examples/display/DisplayExample.cpp | 20 ++--- examples/display/DisplayExample.h | 2 +- examples/input/InputExample.cpp | 6 +- examples/input/InputExample.h | 2 +- include/Spectre/Display/DisplayDescription.h | 34 -------- include/Spectre/Graphics.h | 8 +- include/Spectre/System/Event.h | 6 +- include/Spectre/System/EventListener.h | 4 +- include/Spectre/System/MessageHandler.h | 2 +- .../Spectre/{Display => Window}/DisplayMode.h | 0 .../Spectre/{Display => Window}/GLContext.h | 12 +-- .../{Display/Display.h => Window/Window.h} | 28 +++--- include/Spectre/Window/WindowDescription.h | 34 ++++++++ source/Display/DisplayDescription.cpp | 18 ---- source/Game.cpp | 2 +- source/Graphics/Graphics.cpp | 22 ++--- source/Platform/PlatformDisplay.cpp | 39 --------- source/Platform/PlatformMisc.h | 2 +- source/Platform/PlatformWindow.cpp | 39 +++++++++ .../{PlatformDisplay.h => PlatformWindow.h} | 22 ++--- source/Platform/Win32/Win32Application.h | 2 +- source/Platform/Win32/Win32GLContext.cpp | 6 +- source/Platform/Win32/Win32GLContext.h | 4 +- .../{Win32Display.cpp => Win32Window.cpp} | 85 +++++++++---------- .../Win32/{Win32Display.h => Win32Window.h} | 10 +-- source/System/Event.cpp | 4 +- source/System/EventListener.cpp | 4 +- source/System/MessageHandler.cpp | 6 +- source/{Display => Window}/DisplayMode.cpp | 2 +- source/{Display => Window}/GLContext.cpp | 2 +- .../Display.cpp => Window/Window.cpp} | 53 ++++++------ source/Window/WindowDescription.cpp | 18 ++++ 33 files changed, 257 insertions(+), 255 deletions(-) delete mode 100644 include/Spectre/Display/DisplayDescription.h rename include/Spectre/{Display => Window}/DisplayMode.h (100%) rename include/Spectre/{Display => Window}/GLContext.h (80%) rename include/Spectre/{Display/Display.h => Window/Window.h} (74%) create mode 100644 include/Spectre/Window/WindowDescription.h delete mode 100644 source/Display/DisplayDescription.cpp delete mode 100644 source/Platform/PlatformDisplay.cpp create mode 100644 source/Platform/PlatformWindow.cpp rename source/Platform/{PlatformDisplay.h => PlatformWindow.h} (74%) rename source/Platform/Win32/{Win32Display.cpp => Win32Window.cpp} (79%) rename source/Platform/Win32/{Win32Display.h => Win32Window.h} (90%) rename source/{Display => Window}/DisplayMode.cpp (96%) rename source/{Display => Window}/GLContext.cpp (91%) rename source/{Display/Display.cpp => Window/Window.cpp} (69%) create mode 100644 source/Window/WindowDescription.cpp diff --git a/engine.cmake b/engine.cmake index 5af28f1..deeeda0 100644 --- a/engine.cmake +++ b/engine.cmake @@ -25,7 +25,7 @@ set( ENGINE_SRC # Platform source/Platform/PlatformApplication.cpp - source/Platform/PlatformDisplay.cpp + source/Platform/PlatformWindow.cpp # Math source/Math/Color.cpp @@ -40,11 +40,11 @@ set( ENGINE_SRC source/Input/Keyboard.cpp source/Input/Mouse.cpp - # Display - source/Display/Display.cpp - source/Display/DisplayDescription.cpp - source/Display/DisplayMode.cpp - source/Display/GLContext.cpp + # Window + source/Window/Window.cpp + source/Window/WindowDescription.cpp + source/Window/DisplayMode.cpp + source/Window/GLContext.cpp # GfxDriver source/GfxDriver/ShaderProgram.cpp @@ -95,7 +95,7 @@ set(ENGINE_GFXDRIVER_OPENGL_SRC set(ENGINE_PLATFORM_WIN32_SRC source/Platform/Win32/Win32Application.cpp - source/Platform/Win32/Win32Display.cpp + source/Platform/Win32/Win32Window.cpp source/Platform/Win32/Win32GLContext.cpp source/Platform/Win32/Win32Input.cpp source/Platform/Win32/Win32Internal.cpp diff --git a/examples/display/DisplayExample.cpp b/examples/display/DisplayExample.cpp index 8a430ae..26a16ec 100644 --- a/examples/display/DisplayExample.cpp +++ b/examples/display/DisplayExample.cpp @@ -1,5 +1,5 @@ -#include +#include #include #include #include @@ -8,7 +8,7 @@ void DisplayExample::init() { m_renderer = new sp::BatchRenderer2D(); - m_mode = sp::Display::WINDOWED; + m_mode = sp::Window::WINDOWED; getMessageHandler()->registerListener(this); m_texture.create("assets/textures/tux.png"); @@ -26,27 +26,27 @@ void DisplayExample::onEvent(const sp::Event& event) if (event.key.code == sp::Keyboard::W) { - if (m_mode == sp::Display::WINDOWED) { - m_mode = sp::Display::WINDOWEDFULLSCREEN; + if (m_mode == sp::Window::WINDOWED) { + m_mode = sp::Window::WINDOWEDFULLSCREEN; sp::Log::info("Windowed Fullscreen"); } else { - m_mode = sp::Display::WINDOWED; + m_mode = sp::Window::WINDOWED; sp::Log::info("Windowed"); } - getGraphics()->setDisplayMode(m_mode); + getGraphics()->setWindowMode(m_mode); } else if (event.key.code == sp::Keyboard::Space) { - if (m_mode == sp::Display::WINDOWED) { - m_mode = sp::Display::FULLSCREEN; + if (m_mode == sp::Window::WINDOWED) { + m_mode = sp::Window::FULLSCREEN; sp::Log::info("Fullscreen"); } else { - m_mode = sp::Display::WINDOWED; + m_mode = sp::Window::WINDOWED; sp::Log::info("Windowed"); } - getGraphics()->setDisplayMode(m_mode); + getGraphics()->setWindowMode(m_mode); } } } diff --git a/examples/display/DisplayExample.h b/examples/display/DisplayExample.h index 68de736..7351124 100644 --- a/examples/display/DisplayExample.h +++ b/examples/display/DisplayExample.h @@ -23,7 +23,7 @@ protected : protected : - sp::Display::Mode m_mode; + sp::Window::Mode m_mode; sp::Camera2D m_camera; sp::Renderer2D *m_renderer; diff --git a/examples/input/InputExample.cpp b/examples/input/InputExample.cpp index 76b1233..c18f942 100644 --- a/examples/input/InputExample.cpp +++ b/examples/input/InputExample.cpp @@ -61,7 +61,7 @@ void InputExample::update(double dt) } } -void InputExample::onSizeChanged(sp::Display* display, int width, int height) +void InputExample::onSizeChanged(sp::Window* Window, int width, int height) { } @@ -70,10 +70,10 @@ void InputExample::onEvent(const sp::Event& event) { if (event.type == event.Key && !event.key.pressed) { if (event.key.code == sp::Keyboard::G) { - getGraphics()->getDisplay()->grabCursor(true); + getGraphics()->getWindow()->grabCursor(true); sp::Log::info("Mouse Grabbed"); } else if (event.key.code == sp::Keyboard::U) { - getGraphics()->getDisplay()->grabCursor(false); + getGraphics()->getWindow()->grabCursor(false); sp::Log::info("Mouse Released"); } } else if (event.type == event.MouseButton && event.mouseButton.button == sp::Mouse::Right) { diff --git a/examples/input/InputExample.h b/examples/input/InputExample.h index 8c95e5d..6e9281c 100644 --- a/examples/input/InputExample.h +++ b/examples/input/InputExample.h @@ -22,7 +22,7 @@ protected : void render(); - void onSizeChanged(sp::Display* display, int width, int height); + void onSizeChanged(sp::Window* display, int width, int height); void onEvent(const sp::Event& event); diff --git a/include/Spectre/Display/DisplayDescription.h b/include/Spectre/Display/DisplayDescription.h deleted file mode 100644 index 06067e0..0000000 --- a/include/Spectre/Display/DisplayDescription.h +++ /dev/null @@ -1,34 +0,0 @@ - -#ifndef SPECTRE_DISPLAY_DISPLAYDESCRIPTION_H -#define SPECTRE_DISPLAY_DISPLAYDESCRIPTION_H - -#include "DisplayMode.h" - -namespace sp { - -namespace DisplayDecorate { - - enum Type { - Empty = 0, - Menu = 1 << 0, - Resize = 1 << 1, - Close = 1 << 2, - Default = Menu | Resize | Close, - }; -}; - -struct DisplayDescription -{ -public : - DisplayDescription(); - DisplayDescription(DisplayMode mode, unsigned decoration = DisplayDecorate::Default); - -public : - DisplayMode mode; - - unsigned int decoration; -}; - -} // namespace sp - -#endif /* SPECTRE_DISPLAY_DISPLAYDESCRIPTION_H */ diff --git a/include/Spectre/Graphics.h b/include/Spectre/Graphics.h index df6f125..0720285 100644 --- a/include/Spectre/Graphics.h +++ b/include/Spectre/Graphics.h @@ -3,7 +3,7 @@ #define GRAPHICS_H #include -#include +#include namespace sp { @@ -31,7 +31,7 @@ public : std::string getVersion() const; - void setDisplayMode(Display::Mode mode); + void setWindowMode(Window::Mode mode); void setSize(int width, int height); @@ -45,14 +45,14 @@ public : GfxDriver* getDriver(); - Display* getDisplay(); + Window* getWindow(); protected : int m_width; int m_height; - Display *m_display; + Window *m_window; // Graphics Driver. OpenGL/Vulcan/DirectX etc. GfxDriver *m_gfxdrv; diff --git a/include/Spectre/System/Event.h b/include/Spectre/System/Event.h index 70a39e0..4577c5f 100644 --- a/include/Spectre/System/Event.h +++ b/include/Spectre/System/Event.h @@ -7,7 +7,7 @@ namespace sp { -class Display; +class Window; struct Event { @@ -43,7 +43,7 @@ public : struct SizeEvent { - Display *display; + Window *window; int width; int height; }; @@ -62,7 +62,7 @@ public : // Helper methods - static Event createSize(Display *display, int width, int height); + static Event createSize(Window *window, int width, int height); static Event createKey(Keyboard::Key code, bool pressed); diff --git a/include/Spectre/System/EventListener.h b/include/Spectre/System/EventListener.h index 5b18d6b..7dfbc53 100644 --- a/include/Spectre/System/EventListener.h +++ b/include/Spectre/System/EventListener.h @@ -8,12 +8,12 @@ namespace sp { -class Display; +class Window; class EventListener { public : - virtual void onSizeChanged(Display* display, int width, int height); + virtual void onSizeChanged(Window* window, int width, int height); virtual void onEvent(const Event& event); }; diff --git a/include/Spectre/System/MessageHandler.h b/include/Spectre/System/MessageHandler.h index 4ca39bc..b3081c7 100644 --- a/include/Spectre/System/MessageHandler.h +++ b/include/Spectre/System/MessageHandler.h @@ -15,7 +15,7 @@ public : void unregisterListener(EventListener *listener); - virtual void onSizeChanged(Display* display, int width, int height); + virtual void onSizeChanged(Window* window, int width, int height); virtual void onEvent(const Event& event); diff --git a/include/Spectre/Display/DisplayMode.h b/include/Spectre/Window/DisplayMode.h similarity index 100% rename from include/Spectre/Display/DisplayMode.h rename to include/Spectre/Window/DisplayMode.h diff --git a/include/Spectre/Display/GLContext.h b/include/Spectre/Window/GLContext.h similarity index 80% rename from include/Spectre/Display/GLContext.h rename to include/Spectre/Window/GLContext.h index 837d629..4a08b93 100644 --- a/include/Spectre/Display/GLContext.h +++ b/include/Spectre/Window/GLContext.h @@ -1,12 +1,12 @@ -#ifndef DISPLAY_GLCONTEXT_H -#define DISPLAY_GLCONTEXT_H +#ifndef SPECTRE_WINDOW_GLCONTEXT_H +#define SPECTRE_WINDOW_GLCONTEXT_H #include namespace sp { -class PlatformDisplay; +class PlatformWindow; // Platform independant interface for OpenGL Contexts. @@ -17,8 +17,8 @@ public : virtual ~GLContext(); - // Create a GLContext for this perticular display. - virtual bool create(const PlatformDisplay* display) = 0; + // Create a GLContext for this perticular window. + virtual bool create(const PlatformWindow* window) = 0; virtual void destroy() = 0; @@ -44,4 +44,4 @@ public : } // namespace sp -#endif /* DISPLAY_GLCONTEXT_H */ +#endif /* SPECTRE_WINDOW_GLCONTEXT_H */ diff --git a/include/Spectre/Display/Display.h b/include/Spectre/Window/Window.h similarity index 74% rename from include/Spectre/Display/Display.h rename to include/Spectre/Window/Window.h index e953f72..41a7074 100644 --- a/include/Spectre/Display/Display.h +++ b/include/Spectre/Window/Window.h @@ -1,22 +1,22 @@ -#ifndef SPECTRE_DISPLAY_DISPLAY_H -#define SPECTRE_DISPLAY_DISPLAY_H +#ifndef SPECTRE_WINDOW_WINDOW_H +#define SPECTRE_WINDOW_WINDOW_H #include "DisplayMode.h" -#include "DisplayDescription.h" +#include "WindowDescription.h" #include -#include +#include #include #include namespace sp { -class PlatformDisplay; +class PlatformWindow; class GLContext; -class Display +class Window { -friend class PlatformDisplay; +friend class PlatformWindow; public : enum Mode { WINDOWED = 0, @@ -25,10 +25,10 @@ public : }; public : - Display(); - virtual ~Display(); + Window(); + virtual ~Window(); - bool create(DisplayDescription decription); + bool create(WindowDescription decription); void destroy(); @@ -78,16 +78,16 @@ protected : // So it can be restored when returning to window mode. Vector2u m_cachePos; - DisplayDescription m_description; - DisplayDescription m_cacheDesc; + WindowDescription m_description; + WindowDescription m_cacheDesc; std::string m_caption; - PlatformDisplay* m_impl; + PlatformWindow* m_impl; GLContext* m_context; }; } // namepsace sp -#endif /* SPECTRE_DISPLAY_DISPLAY_H */ +#endif /* SPECTRE_WINDOW_WINDOW_H */ diff --git a/include/Spectre/Window/WindowDescription.h b/include/Spectre/Window/WindowDescription.h new file mode 100644 index 0000000..9ea0de1 --- /dev/null +++ b/include/Spectre/Window/WindowDescription.h @@ -0,0 +1,34 @@ + +#ifndef SPECTRE_WINDOW_WINDOWDESCRIPTION_H +#define SPECTRE_WINDOW_WINDOWDESCRIPTION_H + +#include "DisplayMode.h" + +namespace sp { + +namespace WindowDecorate { + + enum Type { + Empty = 0, + Menu = 1 << 0, + Resize = 1 << 1, + Close = 1 << 2, + Default = Menu | Resize | Close, + }; +}; + +struct WindowDescription +{ +public : + WindowDescription(); + WindowDescription(DisplayMode mode, unsigned decoration = WindowDecorate::Default); + +public : + DisplayMode mode; + + unsigned int decoration; +}; + +} // namespace sp + +#endif /* SPECTRE_WINDOW_WINDOWDESCRIPTION_H */ diff --git a/source/Display/DisplayDescription.cpp b/source/Display/DisplayDescription.cpp deleted file mode 100644 index 0f6a72d..0000000 --- a/source/Display/DisplayDescription.cpp +++ /dev/null @@ -1,18 +0,0 @@ - -#include - -namespace sp { - -DisplayDescription::DisplayDescription() : -mode (), -decoration (DisplayDecorate::Default) -{ -} - -DisplayDescription::DisplayDescription(DisplayMode mode, unsigned decoration) : -mode (mode), -decoration (decoration) -{ -} - -} // namespace sp diff --git a/source/Game.cpp b/source/Game.cpp index c22e241..9842a64 100644 --- a/source/Game.cpp +++ b/source/Game.cpp @@ -90,7 +90,7 @@ void Game::processEvents() // Call message handler. if (event.type == Event::Size) { - m_messageHandler->onSizeChanged(event.size.display, event.size.width, event.size.height); + m_messageHandler->onSizeChanged(event.size.window, event.size.width, event.size.height); } m_messageHandler->onEvent(event); diff --git a/source/Graphics/Graphics.cpp b/source/Graphics/Graphics.cpp index 641a25c..63cfc4e 100644 --- a/source/Graphics/Graphics.cpp +++ b/source/Graphics/Graphics.cpp @@ -10,7 +10,7 @@ Graphics::Graphics(PlatformApplication *platform) m_width = 800; m_height = 600; - m_display = new Display(); + m_window = new Window(); // Only have OpenGL atm. m_gfxdrv = new OpenGLDrv(); @@ -19,16 +19,16 @@ Graphics::Graphics(PlatformApplication *platform) Graphics::~Graphics() { shutdown(); - delete m_display; + delete m_window; delete m_gfxdrv; } bool Graphics::init() { DisplayMode mode(m_width, m_height); - DisplayDescription desc(mode); + WindowDescription desc(mode); - if (!m_display->create(desc)) { + if (!m_window->create(desc)) { return false; } @@ -41,7 +41,7 @@ bool Graphics::init() void Graphics::shutdown() { - m_display->destroy(); + m_window->destroy(); } std::string Graphics::getVersion() const @@ -49,14 +49,14 @@ std::string Graphics::getVersion() const return m_gfxdrv->getVendor(); } -void Graphics::setDisplayMode(Display::Mode mode) +void Graphics::setWindowMode(Window::Mode mode) { - m_display->setVideoMode(mode); + m_window->setVideoMode(mode); } void Graphics::setSize(int width, int height) { - m_display->setSize(width, height); + m_window->setSize(width, height); } void Graphics::setViewport(int x, int y, int width, int height) @@ -76,7 +76,7 @@ void Graphics::clearBuffer() void Graphics::swapBuffers() { - m_display->swapBuffers(); + m_window->swapBuffers(); } GfxDriver* Graphics::getDriver() @@ -84,9 +84,9 @@ GfxDriver* Graphics::getDriver() return m_gfxdrv; } -Display* Graphics::getDisplay() +Window* Graphics::getWindow() { - return m_display; + return m_window; } } // namespace sp diff --git a/source/Platform/PlatformDisplay.cpp b/source/Platform/PlatformDisplay.cpp deleted file mode 100644 index 4cfb3c7..0000000 --- a/source/Platform/PlatformDisplay.cpp +++ /dev/null @@ -1,39 +0,0 @@ - -#include -#include "PlatformDisplay.h" - -#ifdef SPECTRE_PLATFORM_WIN -#include -typedef sp::Win32Display DisplayType; -#elif SPECTRE_PLATFORM_UNIX -#include -typedef sp::X11Display DisplayType; -#else -#error "No Display implementation exists" -#endif - -namespace sp { - -PlatformDisplay* PlatformDisplay::make(Display* parent) -{ - DisplayType* disp = new DisplayType(); - disp->m_parent = parent; - return disp; -} - -PlatformDisplay::PlatformDisplay() -{ -} - -PlatformDisplay::~PlatformDisplay() -{ - // Nothing to do. -} - -void PlatformDisplay::onReshape(int width, int height) -{ - // Forward to parent. - m_parent->onReshape(width, height); -} - -} // namespace sp diff --git a/source/Platform/PlatformMisc.h b/source/Platform/PlatformMisc.h index 55d484b..70c7b1e 100644 --- a/source/Platform/PlatformMisc.h +++ b/source/Platform/PlatformMisc.h @@ -2,7 +2,7 @@ #ifndef PLATFORM_MISC_H #define PLATFORM_MISC_H -#include +#include #include namespace sp { diff --git a/source/Platform/PlatformWindow.cpp b/source/Platform/PlatformWindow.cpp new file mode 100644 index 0000000..90db860 --- /dev/null +++ b/source/Platform/PlatformWindow.cpp @@ -0,0 +1,39 @@ + +#include +#include "PlatformWindow.h" + +#ifdef SPECTRE_PLATFORM_WIN +#include +typedef sp::Win32Window WindowType; +#elif SPECTRE_PLATFORM_UNIX +#include +typedef sp::X11Window WindowType; +#else +#error "No Window implementation exists" +#endif + +namespace sp { + +PlatformWindow* PlatformWindow::make(Window* parent) +{ + WindowType* disp = new WindowType(); + disp->m_parent = parent; + return disp; +} + +PlatformWindow::PlatformWindow() +{ +} + +PlatformWindow::~PlatformWindow() +{ + // Nothing to do. +} + +void PlatformWindow::onReshape(int width, int height) +{ + // Forward to parent. + m_parent->onReshape(width, height); +} + +} // namespace sp diff --git a/source/Platform/PlatformDisplay.h b/source/Platform/PlatformWindow.h similarity index 74% rename from source/Platform/PlatformDisplay.h rename to source/Platform/PlatformWindow.h index 3fff71f..1ce10d5 100644 --- a/source/Platform/PlatformDisplay.h +++ b/source/Platform/PlatformWindow.h @@ -1,10 +1,10 @@ -#ifndef SPECTRE_PLATFORM_DISPLAY_H -#define SPECTRE_PLATFORM_DISPLAY_H +#ifndef SPECTRE_PLATFORM_WINDOW_H +#define SPECTRE_PLATFORM_WINDOW_H #include -#include -#include +#include +#include #include #include @@ -12,17 +12,17 @@ namespace sp { -class Display; +class Window; -class PlatformDisplay +class PlatformWindow { public : // Factory method. - static PlatformDisplay* make(Display* parent); + static PlatformWindow* make(Window* parent); - virtual ~PlatformDisplay(); + virtual ~PlatformWindow(); - virtual bool create(DisplayDescription description) = 0; + virtual bool create(WindowDescription description) = 0; virtual void destroy() = 0; @@ -60,13 +60,13 @@ public : protected : - PlatformDisplay(); + PlatformWindow(); void onReshape(int width, int height); private : - Display * m_parent; + Window * m_parent; }; } // namespace sp diff --git a/source/Platform/Win32/Win32Application.h b/source/Platform/Win32/Win32Application.h index 51ed8ab..9fe035d 100644 --- a/source/Platform/Win32/Win32Application.h +++ b/source/Platform/Win32/Win32Application.h @@ -4,7 +4,7 @@ #include -#include "Win32Display.h" +#include "Win32Window.h" #include "Win32Input.h" #include #include diff --git a/source/Platform/Win32/Win32GLContext.cpp b/source/Platform/Win32/Win32GLContext.cpp index 5a02f8a..cfc59bc 100644 --- a/source/Platform/Win32/Win32GLContext.cpp +++ b/source/Platform/Win32/Win32GLContext.cpp @@ -1,7 +1,7 @@ #include "glad_wgl.h" -#include +#include #include #include "Win32Internal.h" @@ -43,12 +43,12 @@ Win32GLContext::~Win32GLContext() destroy(); } -bool Win32GLContext::create(const PlatformDisplay* display) +bool Win32GLContext::create(const PlatformWindow* window) { // If created. destroy old handles. destroy(); - m_wnd = (HWND) display->getHandle(); + m_wnd = (HWND) window->getHandle(); // Should have a valid handle here. trigger error. if (!m_wnd) { diff --git a/source/Platform/Win32/Win32GLContext.h b/source/Platform/Win32/Win32GLContext.h index b91807e..9601cb8 100644 --- a/source/Platform/Win32/Win32GLContext.h +++ b/source/Platform/Win32/Win32GLContext.h @@ -5,7 +5,7 @@ // Win32 OpenGL Context (wgl) #include -#include +#include namespace sp { @@ -16,7 +16,7 @@ public : ~Win32GLContext(); // Create a context associated with a display. - bool create(const PlatformDisplay* display); + bool create(const PlatformWindow* window); void destroy(); diff --git a/source/Platform/Win32/Win32Display.cpp b/source/Platform/Win32/Win32Window.cpp similarity index 79% rename from source/Platform/Win32/Win32Display.cpp rename to source/Platform/Win32/Win32Window.cpp index 23f53c7..a3cce29 100644 --- a/source/Platform/Win32/Win32Display.cpp +++ b/source/Platform/Win32/Win32Window.cpp @@ -1,12 +1,11 @@ #include - -#include +#include #include #include "Win32Application.h" #include "Win32Internal.h" -#include "Win32Display.h" +#include "Win32Window.h" namespace sp { @@ -19,7 +18,7 @@ namespace sp { static bool firstTime = true; -Win32Display::Win32Display() : +Win32Window::Win32Window() : m_handle (NULL), m_icon (0), m_cursor (0), @@ -28,7 +27,7 @@ m_minSize (200, 200) { } -Win32Display::~Win32Display() +Win32Window::~Win32Window() { if (m_icon) { DestroyIcon(m_icon); @@ -39,7 +38,7 @@ Win32Display::~Win32Display() } } -bool Win32Display::create(DisplayDescription description) +bool Win32Window::create(WindowDescription description) { DWORD flags; Vector2i pos, actual_size; @@ -72,7 +71,7 @@ bool Win32Display::create(DisplayDescription description) return true; } -void Win32Display::destroy() +void Win32Window::destroy() { if (m_handle) { DestroyWindow(m_handle); @@ -80,23 +79,23 @@ void Win32Display::destroy() } } -void* Win32Display::getHandle() const +void* Win32Window::getHandle() const { return m_handle; } -bool Win32Display::isValid() +bool Win32Window::isValid() { return m_handle != NULL; } -void Win32Display::setSize(unsigned int width, unsigned int height) +void Win32Window::setSize(unsigned int width, unsigned int height) { Vector2i s = calculateSize(GetWindowLong(m_handle, GWL_STYLE), width, height); ::SetWindowPos(m_handle, NULL, 0, 0, s.x, s.y, SWP_NOMOVE | SWP_NOZORDER); } -Vector2u Win32Display::getSize() const +Vector2u Win32Window::getSize() const { RECT rect; Vector2u size; @@ -108,44 +107,44 @@ Vector2u Win32Display::getSize() const return size; } -void Win32Display::setPosition(unsigned int x, unsigned int y) +void Win32Window::setPosition(unsigned int x, unsigned int y) { ::SetWindowPos(m_handle, NULL, x, y, 0, 0, SWP_NOSIZE); } -Vector2u Win32Display::getPosition() const +Vector2u Win32Window::getPosition() const { RECT r; GetWindowRect(m_handle, &r); return Vector2u(r.left, r.top); } -void Win32Display::setVisible(bool visible) +void Win32Window::setVisible(bool visible) { ::ShowWindow(m_handle, visible ? SW_SHOW : SW_HIDE); } -void Win32Display::setDecoration(unsigned decoration) +void Win32Window::setDecoration(unsigned decoration) { ::SetWindowLong(m_handle, GWL_STYLE, getWin32Flags(decoration)); } -void Win32Display::minimize() +void Win32Window::minimize() { ::ShowWindow(m_handle, SW_MINIMIZE); } -void Win32Display::maximize() +void Win32Window::maximize() { ::ShowWindow(m_handle, SW_MAXIMIZE); } -void Win32Display::setCaption(const std::string& caption) +void Win32Window::setCaption(const std::string& caption) { ::SetWindowText(m_handle, caption.c_str()); } -void Win32Display::showCursor(bool value) +void Win32Window::showCursor(bool value) { if (value) { m_cursor = ::LoadCursor(NULL, IDC_ARROW); @@ -156,7 +155,7 @@ void Win32Display::showCursor(bool value) ::SetCursor(m_cursor); } -void Win32Display::grabCursor(bool value) +void Win32Window::grabCursor(bool value) { if (value) { RECT rect; @@ -168,7 +167,7 @@ void Win32Display::grabCursor(bool value) } } -void Win32Display::setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) +void Win32Window::setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) { ::HDC hdc; ::ICONINFO ii; @@ -192,13 +191,13 @@ void Win32Display::setIcon(unsigned int width, unsigned int height, const uint8_ ::ReleaseDC(NULL, hdc); if (!bmp_color) { - Log::error("Win32Display::setIcon() - Failed to create RGBA bitmap"); + Log::error("Win32Window::setIcon() - Failed to create RGBA bitmap"); return; } bmp_mask = CreateBitmap(width, height, 1, 1, NULL); if (!bmp_mask) { - Log::error("Win32Display::setIcon() - Failed to create mask bitmap"); + Log::error("Win32Window::setIcon() - Failed to create mask bitmap"); ::DeleteObject(bmp_color); return; } @@ -228,50 +227,50 @@ void Win32Display::setIcon(unsigned int width, unsigned int height, const uint8_ ::SendMessage(m_handle, WM_SETICON, ICON_SMALL, (LPARAM) m_icon); ::SendMessage(m_handle, WM_SETICON, ICON_BIG, (LPARAM) m_icon); } else { - Log::error("Win32Display::setIcon() - Failed to create icon"); + Log::error("Win32Window::setIcon() - Failed to create icon"); } ::DeleteObject(bmp_color); ::DeleteObject(bmp_mask); } -void Win32Display::registerClass() +void Win32Window::registerClass() { WNDCLASSA wndcl; ZeroMemory(&wndcl, sizeof(wndcl)); wndcl.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; - wndcl.lpfnWndProc = Win32Display::staticWndProc; + wndcl.lpfnWndProc = Win32Window::staticWndProc; wndcl.hInstance = ::GetModuleHandle(NULL); wndcl.lpszClassName = WND_CLASSNAME; ::RegisterClass(&wndcl); } -DWORD Win32Display::getWin32Flags(unsigned int flags) +DWORD Win32Window::getWin32Flags(unsigned int flags) { DWORD win32_flags = WS_VISIBLE; - if (flags == DisplayDecorate::Empty) { + if (flags == WindowDecorate::Empty) { win32_flags |= WS_POPUP; } else { - if (flags & DisplayDecorate::Menu) { + if (flags & WindowDecorate::Menu) { win32_flags |= WS_CAPTION | WS_MINIMIZEBOX; } - if (flags & DisplayDecorate::Resize) { + if (flags & WindowDecorate::Resize) { win32_flags |= WS_THICKFRAME | WS_MAXIMIZEBOX; } - if (flags & DisplayDecorate::Close) { + if (flags & WindowDecorate::Close) { win32_flags |= WS_SYSMENU; } } return win32_flags; } -Vector2i Win32Display::centerWindow(int width, int height) +Vector2i Win32Window::centerWindow(int width, int height) { Vector2i v; v.x = (::GetSystemMetrics(SM_CXSCREEN) - width) / 2; @@ -279,14 +278,14 @@ Vector2i Win32Display::centerWindow(int width, int height) return v; } -Vector2u Win32Display::calculateSize(DWORD flags, LONG width, LONG height) +Vector2u Win32Window::calculateSize(DWORD flags, LONG width, LONG height) { RECT r = {0, 0, width, height}; AdjustWindowRect(&r, flags, false); return Vector2u(r.right - r.left, r.bottom - r.top); } -void Win32Display::enterFullscreen(DisplayMode mode) +void Win32Window::enterFullscreen(DisplayMode mode) { LONG rc; ::DEVMODEW dev; @@ -331,7 +330,7 @@ void Win32Display::enterFullscreen(DisplayMode mode) m_fs_mode = mode; } -void Win32Display::exitFullscreen() +void Win32Window::exitFullscreen() { if (!m_fs_mode.empty()) { // Restore to previous mode. @@ -340,7 +339,7 @@ void Win32Display::exitFullscreen() } } -void Win32Display::processResizeMessage(const Vector2u& new_size) +void Win32Window::processResizeMessage(const Vector2u& new_size) { // Check if the size has actually changed. if (m_size != new_size) { @@ -351,7 +350,7 @@ void Win32Display::processResizeMessage(const Vector2u& new_size) } } -void Win32Display::processMessage(UINT message, WPARAM wParam, LPARAM lParam) +void Win32Window::processMessage(UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_SETCURSOR : @@ -407,22 +406,22 @@ void Win32Display::processMessage(UINT message, WPARAM wParam, LPARAM lParam) } } -LRESULT CALLBACK Win32Display::staticWndProc(HWND handle, UINT message, WPARAM wParam, LPARAM lParam) +LRESULT CALLBACK Win32Window::staticWndProc(HWND handle, UINT message, WPARAM wParam, LPARAM lParam) { - Win32Display *display; + Win32Window *win; if (message == WM_NCCREATE) { LONG_PTR ptr = (LONG_PTR) ((LPCREATESTRUCT)lParam)->lpCreateParams; ::SetWindowLongPtr(handle, GWL_USERDATA, ptr); - display = (Win32Display*) ptr; + win = (Win32Window*) ptr; } else { - display = (Win32Display*) ::GetWindowLongPtr(handle, GWL_USERDATA); + win = (Win32Window*) ::GetWindowLongPtr(handle, GWL_USERDATA); } - if (display) { - display->processMessage(message, wParam, lParam); + if (win) { + win->processMessage(message, wParam, lParam); } return DefWindowProc(handle, message, wParam, lParam); } diff --git a/source/Platform/Win32/Win32Display.h b/source/Platform/Win32/Win32Window.h similarity index 90% rename from source/Platform/Win32/Win32Display.h rename to source/Platform/Win32/Win32Window.h index 5d7b4fe..ee87398 100644 --- a/source/Platform/Win32/Win32Display.h +++ b/source/Platform/Win32/Win32Window.h @@ -3,19 +3,19 @@ #define PLATFORM_WIN32_DISPLAY_H #include "Win32GLContext.h" -#include +#include #include #include namespace sp { -class Win32Display : public PlatformDisplay +class Win32Window : public PlatformWindow { public : - Win32Display(); - virtual ~Win32Display(); + Win32Window(); + virtual ~Win32Window(); - virtual bool create(DisplayDescription description); + virtual bool create(WindowDescription description); virtual void destroy(); diff --git a/source/System/Event.cpp b/source/System/Event.cpp index 33b252a..e985db9 100644 --- a/source/System/Event.cpp +++ b/source/System/Event.cpp @@ -38,10 +38,10 @@ std::string Event::MouseButtonEvent::getName() const // Helper methods -Event Event::createSize(Display *display, int width, int height) +Event Event::createSize(Window *window, int width, int height) { Event event(Size); - event.size.display = display; + event.size.window = window; event.size.width = width; event.size.height = height; return event; diff --git a/source/System/EventListener.cpp b/source/System/EventListener.cpp index d2d6875..69accc0 100644 --- a/source/System/EventListener.cpp +++ b/source/System/EventListener.cpp @@ -1,9 +1,9 @@ -#include +#include #include namespace sp { -void EventListener::onSizeChanged(Display* display, int width, int height) +void EventListener::onSizeChanged(Window* window, int width, int height) { } diff --git a/source/System/MessageHandler.cpp b/source/System/MessageHandler.cpp index f0eb45f..faa48d0 100644 --- a/source/System/MessageHandler.cpp +++ b/source/System/MessageHandler.cpp @@ -1,5 +1,5 @@ -#include +#include #include namespace sp { @@ -28,10 +28,10 @@ void MessageHandler::unregisterListener(EventListener *listener) } } -void MessageHandler::onSizeChanged(Display* display, int width, int height) +void MessageHandler::onSizeChanged(Window* window, int width, int height) { for(EventListener* listener : m_listeners) { - listener->onSizeChanged(display, width, height); + listener->onSizeChanged(window, width, height); } } diff --git a/source/Display/DisplayMode.cpp b/source/Window/DisplayMode.cpp similarity index 96% rename from source/Display/DisplayMode.cpp rename to source/Window/DisplayMode.cpp index 13128c8..b092298 100644 --- a/source/Display/DisplayMode.cpp +++ b/source/Window/DisplayMode.cpp @@ -1,5 +1,5 @@ -#include +#include #include #include diff --git a/source/Display/GLContext.cpp b/source/Window/GLContext.cpp similarity index 91% rename from source/Display/GLContext.cpp rename to source/Window/GLContext.cpp index 2c812dc..7d9cb84 100644 --- a/source/Display/GLContext.cpp +++ b/source/Window/GLContext.cpp @@ -1,5 +1,5 @@ -#include +#include #ifdef SPECTRE_PLATFORM_WIN #include diff --git a/source/Display/Display.cpp b/source/Window/Window.cpp similarity index 69% rename from source/Display/Display.cpp rename to source/Window/Window.cpp index 2d57402..6efe7b7 100644 --- a/source/Display/Display.cpp +++ b/source/Window/Window.cpp @@ -1,9 +1,12 @@ #include -#include -#include +#include +#include +#include +#include +#include #include -#include +#include #include @@ -12,22 +15,22 @@ namespace sp { #define CAPTION_DEFAULT "Spectre" #define ICON_DEFAULT "./assets/app.ico" -Display::Display() +Window::Window() { m_caption = CAPTION_DEFAULT; m_fmode = WINDOWED; m_context = GLContext::create(); - m_impl = PlatformDisplay::make(this); + m_impl = PlatformWindow::make(this); } -Display::~Display() +Window::~Window() { delete m_context; delete m_impl; } -bool Display::create(DisplayDescription description) +bool Window::create(WindowDescription description) { destroy(); @@ -46,7 +49,7 @@ bool Display::create(DisplayDescription description) return true; } -void Display::init() +void Window::init() { m_impl->setCaption(m_caption); @@ -58,25 +61,25 @@ void Display::init() showCursor(true); } -void Display::destroy() +void Window::destroy() { m_context->destroy(); m_impl->destroy(); } -void Display::setCaption(const std::string& caption) +void Window::setCaption(const std::string& caption) { m_caption = caption; m_impl->setCaption(m_caption); } -const std::string& Display::getCaption() const +const std::string& Window::getCaption() const { return m_caption; } -void Display::setIcon(const std::string& filename) +void Window::setIcon(const std::string& filename) { Image img; @@ -85,12 +88,12 @@ void Display::setIcon(const std::string& filename) } } -void Display::setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) +void Window::setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) { m_impl->setIcon(width, height, pixels); } -void Display::setSize(unsigned int width, unsigned int height) +void Window::setSize(unsigned int width, unsigned int height) { m_description.mode.width = width; m_description.mode.height = height; @@ -98,12 +101,12 @@ void Display::setSize(unsigned int width, unsigned int height) m_impl->setSize(width, height); } -sp::Vector2u Display::getSize() const +sp::Vector2u Window::getSize() const { return m_impl->getSize(); } -void Display::setVideoMode(Mode mode) +void Window::setVideoMode(Mode mode) { if (m_fmode == mode) { return; @@ -125,7 +128,7 @@ void Display::setVideoMode(Mode mode) // Windowed fullscreen. else if (mode == WINDOWEDFULLSCREEN) { DisplayMode desktop = DisplayMode::getDesktopMode(); - m_impl->setDecoration(DisplayDecorate::Empty); + m_impl->setDecoration(WindowDecorate::Empty); m_impl->setSize(desktop.width, desktop.height); m_impl->setPosition(0, 0); } @@ -142,27 +145,27 @@ void Display::setVideoMode(Mode mode) m_fmode = mode; } -enum Display::Mode Display::getVideoMode() const +enum Window::Mode Window::getVideoMode() const { return m_fmode; } -void Display::setVisible(bool visible) +void Window::setVisible(bool visible) { m_impl->setVisible(visible); } -void Display::showCursor(bool value) +void Window::showCursor(bool value) { m_impl->showCursor(value); } -void Display::grabCursor(bool value) +void Window::grabCursor(bool value) { m_impl->grabCursor(value); } -bool Display::activate(bool value) +bool Window::activate(bool value) { if (value) { return m_context->activate(); @@ -170,19 +173,19 @@ bool Display::activate(bool value) return m_context->deactivate(); } -bool Display::enableVSync(bool value) +bool Window::enableVSync(bool value) { return m_context->setSwapInterval(value ? 1 : 0); } -void Display::swapBuffers() +void Window::swapBuffers() { if (activate(true)) { m_context->swapBuffers(); } } -void Display::onReshape(int width, int height) +void Window::onReshape(int width, int height) { // TODO: This should even not be here. // Generic Display should not have any GL calls. diff --git a/source/Window/WindowDescription.cpp b/source/Window/WindowDescription.cpp new file mode 100644 index 0000000..c7c49d5 --- /dev/null +++ b/source/Window/WindowDescription.cpp @@ -0,0 +1,18 @@ + +#include + +namespace sp { + +WindowDescription::WindowDescription() : +mode (), +decoration (WindowDecorate::Default) +{ +} + +WindowDescription::WindowDescription(DisplayMode mode, unsigned decoration) : +mode (mode), +decoration (decoration) +{ +} + +} // namespace sp From 8901257bb69b0a0745a5a850a94556ac7ea7734a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 22 Aug 2023 07:17:51 +0200 Subject: [PATCH 340/361] Rename DisplayExample to WindowExample --- examples/CMakeLists.txt | 2 +- examples/display/CMakeLists.txt | 12 ------------ examples/window/CMakeLists.txt | 7 +++++++ .../DisplayExample.cpp => window/WindowExample.cpp} | 10 +++++----- .../DisplayExample.h => window/WindowExample.h} | 2 +- examples/window/main.cpp | 11 +++++++++++ 6 files changed, 25 insertions(+), 19 deletions(-) delete mode 100644 examples/display/CMakeLists.txt create mode 100644 examples/window/CMakeLists.txt rename examples/{display/DisplayExample.cpp => window/WindowExample.cpp} (88%) rename examples/{display/DisplayExample.h => window/WindowExample.h} (90%) create mode 100644 examples/window/main.cpp diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index a9890c3..77f155e 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -1,7 +1,7 @@ include("Macros") -add_subdirectory(display) +add_subdirectory(window) add_subdirectory(events) add_subdirectory(input) add_subdirectory(text) \ No newline at end of file diff --git a/examples/display/CMakeLists.txt b/examples/display/CMakeLists.txt deleted file mode 100644 index 05e659d..0000000 --- a/examples/display/CMakeLists.txt +++ /dev/null @@ -1,12 +0,0 @@ - -#find_package(Spectre REQUIRED) - -set (SOURCE - DisplayExample.cpp - main.cpp -) - -spectre_example(display - main.cpp - DisplayExample.cpp -) diff --git a/examples/window/CMakeLists.txt b/examples/window/CMakeLists.txt new file mode 100644 index 0000000..334ff52 --- /dev/null +++ b/examples/window/CMakeLists.txt @@ -0,0 +1,7 @@ + +#find_package(Spectre REQUIRED) + +spectre_example(window + main.cpp + WindowExample.cpp +) diff --git a/examples/display/DisplayExample.cpp b/examples/window/WindowExample.cpp similarity index 88% rename from examples/display/DisplayExample.cpp rename to examples/window/WindowExample.cpp index 26a16ec..d629df3 100644 --- a/examples/display/DisplayExample.cpp +++ b/examples/window/WindowExample.cpp @@ -3,9 +3,9 @@ #include #include #include -#include "DisplayExample.h" +#include "WindowExample.h" -void DisplayExample::init() +void WindowExample::init() { m_renderer = new sp::BatchRenderer2D(); m_mode = sp::Window::WINDOWED; @@ -20,7 +20,7 @@ void DisplayExample::init() m_renderer->setCamera(m_camera); } -void DisplayExample::onEvent(const sp::Event& event) +void WindowExample::onEvent(const sp::Event& event) { if (event.type == sp::Event::Key && event.key.pressed == false) { @@ -51,12 +51,12 @@ void DisplayExample::onEvent(const sp::Event& event) } } -void DisplayExample::update(double dt) +void WindowExample::update(double dt) { // Nothing to do } -void DisplayExample::render() +void WindowExample::render() { sp::Graphics* g = getGraphics(); diff --git a/examples/display/DisplayExample.h b/examples/window/WindowExample.h similarity index 90% rename from examples/display/DisplayExample.h rename to examples/window/WindowExample.h index 7351124..b60aada 100644 --- a/examples/display/DisplayExample.h +++ b/examples/window/WindowExample.h @@ -8,7 +8,7 @@ #include #include -class DisplayExample : public sp::Game, sp::EventListener +class WindowExample : public sp::Game, sp::EventListener { public : void onEvent(const sp::Event& event); diff --git a/examples/window/main.cpp b/examples/window/main.cpp new file mode 100644 index 0000000..10a0fdf --- /dev/null +++ b/examples/window/main.cpp @@ -0,0 +1,11 @@ + +#include "WindowExample.h" + +int main(int argc, char **argv) { + + WindowExample game; + + game.run(); + + return 0; +} From 96f6725428b37d2a7204e6d3623f18e98c87541a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 22 Aug 2023 10:02:07 +0200 Subject: [PATCH 341/361] include/Spectre/Math/Matrix3.inl: make Identity work for all template specializations. not just float. --- include/Spectre/Math/Matrix3.inl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/Spectre/Math/Matrix3.inl b/include/Spectre/Math/Matrix3.inl index 9425c89..8ee358a 100644 --- a/include/Spectre/Math/Matrix3.inl +++ b/include/Spectre/Math/Matrix3.inl @@ -4,8 +4,8 @@ namespace sp { -template <> -Matrix3f Matrix3f::Identity( +template +sp::Matrix3 sp::Matrix3::Identity( 1, 0, 0, 0, 1, 0, 0, 0, 1 From 45d3bff62010e84471e18f0b62739588e73a2df5 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 22 Aug 2023 10:06:19 +0200 Subject: [PATCH 342/361] Unix: Rename X11Display to X11Window and make it work again with Spectre/Window/Window --- engine.cmake | 2 +- source/Platform/Unix/GLXContext.cpp | 6 +- source/Platform/Unix/GLXContext.h | 6 +- source/Platform/Unix/X11Keyboard.cpp | 4 +- source/Platform/Unix/X11Mouse.cpp | 4 +- .../Unix/{X11Display.cpp => X11Window.cpp} | 70 +++++++++---------- .../Unix/{X11Display.h => X11Window.h} | 18 +++-- .../Platform/Unix/X11WindowEventHandler.cpp | 8 +-- source/Platform/Unix/X11WindowEventHandler.h | 4 +- 9 files changed, 60 insertions(+), 62 deletions(-) rename source/Platform/Unix/{X11Display.cpp => X11Window.cpp} (86%) rename source/Platform/Unix/{X11Display.h => X11Window.h} (75%) diff --git a/engine.cmake b/engine.cmake index deeeda0..bf11d58 100644 --- a/engine.cmake +++ b/engine.cmake @@ -119,7 +119,7 @@ set(ENGINE_PLATFORM_UNIX_SRC # X11 source/Platform/Unix/Xlib.cpp source/Platform/Unix/XRandR.cpp - source/Platform/Unix/X11Display.cpp + source/Platform/Unix/X11Window.cpp source/Platform/Unix/X11Input.cpp source/Platform/Unix/X11Keyboard.cpp source/Platform/Unix/X11Mouse.cpp diff --git a/source/Platform/Unix/GLXContext.cpp b/source/Platform/Unix/GLXContext.cpp index 0fee7bc..a39f77b 100644 --- a/source/Platform/Unix/GLXContext.cpp +++ b/source/Platform/Unix/GLXContext.cpp @@ -1,6 +1,6 @@ #include -#include +#include #include #include "glad_glx.h" @@ -70,12 +70,12 @@ GLXContext::~GLXContext() destroy(); } -bool GLXContext::create(const PlatformDisplay* display) +bool GLXContext::create(const PlatformWindow* window) { // Destroy any previous context first. destroy(); - m_win = (::Window) display->getHandle(); + m_win = (::Window) window->getHandle(); if (!createGLContext()) { destroy(); diff --git a/source/Platform/Unix/GLXContext.h b/source/Platform/Unix/GLXContext.h index 7941e5b..ec0c4f6 100644 --- a/source/Platform/Unix/GLXContext.h +++ b/source/Platform/Unix/GLXContext.h @@ -5,7 +5,7 @@ // X11 OpenGL Context (glx) #include "glad_glx.h" -#include +#include namespace sp { @@ -15,8 +15,8 @@ public : GLXContext(); ~GLXContext(); - // Create a context associated with a display. - bool create(const PlatformDisplay* display); + // Create a context associated with a window. + bool create(const PlatformWindow* window); void destroy(); diff --git a/source/Platform/Unix/X11Keyboard.cpp b/source/Platform/Unix/X11Keyboard.cpp index b345ecb..d1f0b90 100644 --- a/source/Platform/Unix/X11Keyboard.cpp +++ b/source/Platform/Unix/X11Keyboard.cpp @@ -1,7 +1,7 @@ #include #include "X11Keyboard.h" -#include "X11Display.h" +#include "X11Window.h" #include "Xlib.h" #include #include @@ -354,7 +354,7 @@ bool X11Keyboard::handleMessage(XKeyEvent* xkeyevent, Event& event) void X11Keyboard::update(InputModule *input) { - X11Display *focus = X11Display::getFocused(); + X11Window *focus = X11Window::getFocused(); m_win = focus ? (::Window) focus->getHandle() : 0; // If we have focus. diff --git a/source/Platform/Unix/X11Mouse.cpp b/source/Platform/Unix/X11Mouse.cpp index 3c7ccb5..201ac13 100644 --- a/source/Platform/Unix/X11Mouse.cpp +++ b/source/Platform/Unix/X11Mouse.cpp @@ -2,7 +2,7 @@ #include #include #include "Xlib.h" -#include "X11Display.h" +#include "X11Window.h" #include "X11Mouse.h" #define XBUTTON1BIT (1<<0) @@ -89,7 +89,7 @@ void X11Mouse::update(InputModule *input) void X11Mouse::updateFocusedWindow() { - X11Display *focus = X11Display::getFocused(); + X11Window *focus = X11Window::getFocused(); m_win = focus ? (::Window) focus->getHandle() : 0; } diff --git a/source/Platform/Unix/X11Display.cpp b/source/Platform/Unix/X11Window.cpp similarity index 86% rename from source/Platform/Unix/X11Display.cpp rename to source/Platform/Unix/X11Window.cpp index 2fba1b7..cf33c80 100644 --- a/source/Platform/Unix/X11Display.cpp +++ b/source/Platform/Unix/X11Window.cpp @@ -8,7 +8,7 @@ #include "Xlib.h" #include "wm_hints.h" #include "GLXContext.h" -#include "X11Display.h" +#include "X11Window.h" // Sometimes not defined in headers. #ifndef _NET_WM_STATE_TOGGLE @@ -19,17 +19,17 @@ namespace sp { namespace _priv { - // Pointer to the display that has focus (or NULL if none have). - X11Display* focused_display = NULL; + // Pointer to the window that has focus (or NULL if none have). + X11Window* focused_window = NULL; } -X11Display* X11Display::getFocused() +X11Window* X11Window::getFocused() { - return _priv::focused_display; + return _priv::focused_window; } -X11Display:: -X11Display() : +X11Window:: +X11Window() : m_screen (0), m_size (200,200), m_cur_last (0), @@ -37,13 +37,13 @@ m_cur_hidden (0) { } -bool X11Display::create(DisplayDescription description) +bool X11Window::create(WindowDescription description) { XSetWindowAttributes attr; XVisualInfo* vi; Atom protocols; Visual* visual; - Window root_win; + ::Window root_win; ::Display* disp = Xlib::getDisplay(); m_screen = DefaultScreen(disp); @@ -92,7 +92,7 @@ bool X11Display::create(DisplayDescription description) return true; } -void X11Display::destroy() +void X11Window::destroy() { if (m_win) { ::Display* disp = Xlib::getDisplay(); @@ -101,17 +101,17 @@ void X11Display::destroy() } } -bool X11Display::isValid() +bool X11Window::isValid() { return m_win; } -void* X11Display::getHandle() const +void* X11Window::getHandle() const { return (void*) m_win; } -void X11Display::setSize(unsigned int width, unsigned int height) +void X11Window::setSize(unsigned int width, unsigned int height) { Log::info("X11: Set size %dx%d", width, height); @@ -128,7 +128,7 @@ void X11Display::setSize(unsigned int width, unsigned int height) ::XResizeWindow(Xlib::getDisplay(), m_win, m_size.x, m_size.y); } -Vector2u X11Display::getSize() const +Vector2u X11Window::getSize() const { int x, y; unsigned int w, h, bw, d; @@ -146,12 +146,12 @@ Vector2u X11Display::getSize() const return Vector2u(w, h); } -void X11Display::setPosition(unsigned int x, unsigned int y) +void X11Window::setPosition(unsigned int x, unsigned int y) { ::XMoveWindow(Xlib::getDisplay(), m_win, x, y); } -Vector2u X11Display::getPosition() const +Vector2u X11Window::getPosition() const { int x, y; unsigned int w, h, bw, d; @@ -169,7 +169,7 @@ Vector2u X11Display::getPosition() const return Vector2u(x, y); } -void X11Display::setVisible(bool visible) +void X11Window::setVisible(bool visible) { if (visible) { ::XMapWindow(Xlib::getDisplay(), m_win); @@ -178,7 +178,7 @@ void X11Display::setVisible(bool visible) } } -void X11Display::setDecoration(unsigned decoration) +void X11Window::setDecoration(unsigned decoration) { Atom WMHintsAtom = Xlib::getAtom("_MOTIF_WM_HINTS", false); @@ -191,19 +191,19 @@ void X11Display::setDecoration(unsigned decoration) hints.decorations = 0; hints.functions = 0; - if (decoration & DisplayDecorate::Menu) { + if (decoration & WindowDecorate::Menu) { Log::info("X11: Decoration Menu"); hints.decorations |= MWM_DECOR_BORDER | MWM_DECOR_TITLE | MWM_DECOR_MINIMIZE | MWM_DECOR_MENU; hints.functions |= MWM_FUNC_MOVE | MWM_FUNC_MINIMIZE; } - if (decoration & DisplayDecorate::Resize) { + if (decoration & WindowDecorate::Resize) { Log::info("X11: Decoration Resize"); hints.decorations |= MWM_DECOR_MAXIMIZE | MWM_DECOR_RESIZEH; hints.functions |= MWM_FUNC_MAXIMIZE | MWM_FUNC_RESIZE; } - if (decoration & DisplayDecorate::Close) { + if (decoration & WindowDecorate::Close) { Log::info("X11: Decoration Close"); hints.decorations |= 0; hints.functions |= MWM_FUNC_CLOSE; @@ -215,12 +215,12 @@ void X11Display::setDecoration(unsigned decoration) } } -void X11Display::minimize() +void X11Window::minimize() { ::XIconifyWindow(Xlib::getDisplay(), m_win, m_screen); } -void X11Display::maximize() +void X11Window::maximize() { ::XClientMessageEvent ev = {}; ::Display* disp = Xlib::getDisplay(); @@ -238,7 +238,7 @@ void X11Display::maximize() SubstructureNotifyMask, (XEvent*) &ev); } -void X11Display::enterFullscreen(DisplayMode mode) +void X11Window::enterFullscreen(DisplayMode mode) { if (!XRandR::FindMode(Xlib::getDisplay(), mode.width, mode.height, mode.bpp, &m_fullscreen_mode.size, &m_fullscreen_mode.rate)) { Log::warn("X11: Failed to find a mode"); @@ -248,7 +248,7 @@ void X11Display::enterFullscreen(DisplayMode mode) toggleFullscreen(true); } -void X11Display::toggleFullscreen(bool enable) +void X11Window::toggleFullscreen(bool enable) { ::Display* disp = Xlib::getDisplay(); ::Window root; @@ -272,7 +272,7 @@ void X11Display::toggleFullscreen(bool enable) XRRSetScreenConfigAndRate(disp, conf, root, mode->size, RR_Rotate_0, mode->rate, CurrentTime); } -void X11Display::exitFullscreen() +void X11Window::exitFullscreen() { if (m_fullscreen_mode.rate > 0) { toggleFullscreen(false); @@ -286,7 +286,7 @@ void X11Display::exitFullscreen() #define _NET_WM_STATE_REMOVE 0 /* remove/unset property */ #define _NET_WM_STATE_ADD 1 /* add/set property */ -void X11Display::wm_fullscreen(bool enabled) { +void X11Window::wm_fullscreen(bool enabled) { ::Display* disp = sp::Xlib::getDisplay(); @@ -309,12 +309,12 @@ void X11Display::wm_fullscreen(bool enabled) { } -void X11Display::setCaption(const std::string& caption) +void X11Window::setCaption(const std::string& caption) { ::XStoreName(Xlib::getDisplay(), m_win, caption.c_str()); } -void X11Display::setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) +void X11Window::setIcon(unsigned int width, unsigned int height, const uint8_t *pixels) { ::Display* disp = Xlib::getDisplay(); ::Atom net_wm_icon = Xlib::getAtom("_NET_WM_ICON", False); @@ -342,7 +342,7 @@ void X11Display::setIcon(unsigned int width, unsigned int height, const uint8_t XFlush(disp); } -void X11Display::createHiddenCursor() +void X11Window::createHiddenCursor() { ::Display* disp = Xlib::getDisplay(); XColor c; @@ -361,12 +361,12 @@ void X11Display::createHiddenCursor() ::XFreeGC(disp, gc); } -void X11Display::showCursor(bool value) +void X11Window::showCursor(bool value) { XDefineCursor(Xlib::getDisplay(), m_win, value ? m_cur_last : m_cur_hidden); } -void X11Display::grabCursor(bool value) +void X11Window::grabCursor(bool value) { if (value) { int result = ::XGrabPointer(Xlib::getDisplay(), m_win, True, None, @@ -380,7 +380,7 @@ void X11Display::grabCursor(bool value) } } -void X11Display::processEvent(const ::XEvent& event) +void X11Window::processEvent(const ::XEvent& event) { Vector2u size; @@ -400,7 +400,7 @@ void X11Display::processEvent(const ::XEvent& event) break; case FocusIn: Log::debug("X11: FocusIn"); - _priv::focused_display = this; + _priv::focused_window = this; if (m_fullscreen_mode.rate > 0) { toggleFullscreen(true); @@ -409,7 +409,7 @@ void X11Display::processEvent(const ::XEvent& event) break; case FocusOut: Log::debug("X11: FocusOut"); - _priv::focused_display = NULL; + _priv::focused_window = NULL; if (m_fullscreen_mode.rate > 0) { toggleFullscreen(false); minimize(); diff --git a/source/Platform/Unix/X11Display.h b/source/Platform/Unix/X11Window.h similarity index 75% rename from source/Platform/Unix/X11Display.h rename to source/Platform/Unix/X11Window.h index 2c2ca79..612619a 100644 --- a/source/Platform/Unix/X11Display.h +++ b/source/Platform/Unix/X11Window.h @@ -1,27 +1,25 @@ -#ifndef PLATFORM_UNIX_X11DISPLAY_H -#define PLATFORM_UNIX_X11DISPLAY_H +#ifndef PLATFORM_UNIX_X11WINDOW_H +#define PLATFORM_UNIX_X11WINDOW_H #include #include #include #include -#include +#include #include "Xrandr.h" namespace sp { -// NOTE: This class wraps a X11 Window and Screen handle -// and is NOT a Class wrapper around X11's `Display` type. -class X11Display : public PlatformDisplay +class X11Window : public PlatformWindow { public : - static X11Display* getFocused(); + static X11Window* getFocused(); - X11Display(); + X11Window(); - virtual bool create(DisplayDescription description); + virtual bool create(WindowDescription description); virtual void destroy(); @@ -85,4 +83,4 @@ protected : } // namespace sp -#endif /* PLATFORM_UNIX_X11DISPLAY_H */ +#endif /* PLATFORM_UNIX_X11WINDOW_H */ diff --git a/source/Platform/Unix/X11WindowEventHandler.cpp b/source/Platform/Unix/X11WindowEventHandler.cpp index fa6eb45..afae0eb 100644 --- a/source/Platform/Unix/X11WindowEventHandler.cpp +++ b/source/Platform/Unix/X11WindowEventHandler.cpp @@ -1,15 +1,15 @@ #include -#include "X11Display.h" +#include "X11Window.h" #include "X11WindowEventHandler.h" #include namespace sp { -// Context used to store X11Display pointer. +// Context used to store X11Window pointer. ::XContext X11WindowEventHandler::win_context = None; -void X11WindowEventHandler::registerHandler(::Display* disp, ::Window window, X11Display *ptr) +void X11WindowEventHandler::registerHandler(::Display* disp, ::Window window, X11Window *ptr) { // Initialize context before use. if (win_context == None) { @@ -41,7 +41,7 @@ void X11WindowEventHandler::process(::Display* disp, const ::XEvent& event) // Get the pointer for window ID. if (XFindContext(disp, event.xany.window, win_context, &ptr) == 0) { - X11Display* disp_ptr = (X11Display*) ptr; + X11Window* disp_ptr = (X11Window*) ptr; // Delegate disp_ptr->processEvent(event); diff --git a/source/Platform/Unix/X11WindowEventHandler.h b/source/Platform/Unix/X11WindowEventHandler.h index 79f6ed2..ce6f594 100644 --- a/source/Platform/Unix/X11WindowEventHandler.h +++ b/source/Platform/Unix/X11WindowEventHandler.h @@ -7,13 +7,13 @@ namespace sp { -class X11Display; +class X11Window; class X11WindowEventHandler { public: - static void registerHandler(::Display* disp, ::Window window, X11Display *ptr); + static void registerHandler(::Display* disp, ::Window window, X11Window *ptr); static void unregisterHandler(::Display* disp, ::Window window); From afc08450064199e795ed57b01cc0e32d828cf713 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 22 Aug 2023 17:10:08 +0200 Subject: [PATCH 343/361] source/Platform/PlatformWindow.h: rename parent to owner as the generic window is not really a parent to the platform one. --- source/Platform/PlatformWindow.cpp | 6 +++--- source/Platform/PlatformWindow.h | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/source/Platform/PlatformWindow.cpp b/source/Platform/PlatformWindow.cpp index 90db860..c1bdd26 100644 --- a/source/Platform/PlatformWindow.cpp +++ b/source/Platform/PlatformWindow.cpp @@ -14,10 +14,10 @@ typedef sp::X11Window WindowType; namespace sp { -PlatformWindow* PlatformWindow::make(Window* parent) +PlatformWindow* PlatformWindow::make(Window* owner) { WindowType* disp = new WindowType(); - disp->m_parent = parent; + disp->m_owner = owner; return disp; } @@ -33,7 +33,7 @@ PlatformWindow::~PlatformWindow() void PlatformWindow::onReshape(int width, int height) { // Forward to parent. - m_parent->onReshape(width, height); + m_owner->onReshape(width, height); } } // namespace sp diff --git a/source/Platform/PlatformWindow.h b/source/Platform/PlatformWindow.h index 1ce10d5..963fa69 100644 --- a/source/Platform/PlatformWindow.h +++ b/source/Platform/PlatformWindow.h @@ -18,7 +18,7 @@ class PlatformWindow { public : // Factory method. - static PlatformWindow* make(Window* parent); + static PlatformWindow* make(Window* owner); virtual ~PlatformWindow(); @@ -66,7 +66,7 @@ protected : private : - Window * m_parent; + Window * m_owner; }; } // namespace sp From a3c63e6e968662b82c621a63455642ef20f4efe9 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 22 Aug 2023 17:10:44 +0200 Subject: [PATCH 344/361] remove examples/display/main.cpp --- examples/display/main.cpp | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 examples/display/main.cpp diff --git a/examples/display/main.cpp b/examples/display/main.cpp deleted file mode 100644 index 5959143..0000000 --- a/examples/display/main.cpp +++ /dev/null @@ -1,11 +0,0 @@ - -#include "DisplayExample.h" - -int main(int argc, char **argv) { - - DisplayExample game; - - game.run(); - - return 0; -} From 5a7a5e3f7c3f41a09928aac1fc456acdceeb4f13 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 22 Aug 2023 17:12:36 +0200 Subject: [PATCH 345/361] source/Platform/Win32/Win32Window.h: fix header guard. --- source/Platform/Win32/Win32Window.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/source/Platform/Win32/Win32Window.h b/source/Platform/Win32/Win32Window.h index ee87398..b2cbb2d 100644 --- a/source/Platform/Win32/Win32Window.h +++ b/source/Platform/Win32/Win32Window.h @@ -1,6 +1,6 @@ -#ifndef PLATFORM_WIN32_DISPLAY_H -#define PLATFORM_WIN32_DISPLAY_H +#ifndef PLATFORM_WIN32_WINDOW_H +#define PLATFORM_WIN32_WINDOW_H #include "Win32GLContext.h" #include @@ -89,4 +89,4 @@ protected : } // namespace sp -#endif /* PLATFORM_WIN32_DISPLAY_H */ +#endif /* PLATFORM_WIN32_WINDOW_H */ From 1288ef88b8d7579d16da4a759b732d61347b31be Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 22 Aug 2023 17:18:39 +0200 Subject: [PATCH 346/361] Platform/PlatformWindow: pass owner in constructor instead of setting the variable directly on the object. it is cleaner. --- source/Platform/PlatformWindow.cpp | 7 +++---- source/Platform/PlatformWindow.h | 2 +- source/Platform/Unix/X11Window.cpp | 4 ++-- source/Platform/Unix/X11Window.h | 4 +++- source/Platform/Win32/Win32Window.cpp | 3 ++- source/Platform/Win32/Win32Window.h | 4 +++- 6 files changed, 14 insertions(+), 10 deletions(-) diff --git a/source/Platform/PlatformWindow.cpp b/source/Platform/PlatformWindow.cpp index c1bdd26..c09411f 100644 --- a/source/Platform/PlatformWindow.cpp +++ b/source/Platform/PlatformWindow.cpp @@ -16,12 +16,11 @@ namespace sp { PlatformWindow* PlatformWindow::make(Window* owner) { - WindowType* disp = new WindowType(); - disp->m_owner = owner; - return disp; + return new WindowType(owner); } -PlatformWindow::PlatformWindow() +PlatformWindow::PlatformWindow(Window* owner) : +m_owner (owner) { } diff --git a/source/Platform/PlatformWindow.h b/source/Platform/PlatformWindow.h index 963fa69..95d09e5 100644 --- a/source/Platform/PlatformWindow.h +++ b/source/Platform/PlatformWindow.h @@ -60,7 +60,7 @@ public : protected : - PlatformWindow(); + PlatformWindow(Window* owner); void onReshape(int width, int height); diff --git a/source/Platform/Unix/X11Window.cpp b/source/Platform/Unix/X11Window.cpp index cf33c80..7f9f87d 100644 --- a/source/Platform/Unix/X11Window.cpp +++ b/source/Platform/Unix/X11Window.cpp @@ -28,8 +28,8 @@ X11Window* X11Window::getFocused() return _priv::focused_window; } -X11Window:: -X11Window() : +X11Window::X11Window(Window *owner) : +PlatformWindow (owner), m_screen (0), m_size (200,200), m_cur_last (0), diff --git a/source/Platform/Unix/X11Window.h b/source/Platform/Unix/X11Window.h index 612619a..7b8fcaf 100644 --- a/source/Platform/Unix/X11Window.h +++ b/source/Platform/Unix/X11Window.h @@ -11,13 +11,15 @@ namespace sp { +class Window; + class X11Window : public PlatformWindow { public : static X11Window* getFocused(); - X11Window(); + X11Window(Window *owner); virtual bool create(WindowDescription description); diff --git a/source/Platform/Win32/Win32Window.cpp b/source/Platform/Win32/Win32Window.cpp index a3cce29..b6dd5e4 100644 --- a/source/Platform/Win32/Win32Window.cpp +++ b/source/Platform/Win32/Win32Window.cpp @@ -18,7 +18,8 @@ namespace sp { static bool firstTime = true; -Win32Window::Win32Window() : +Win32Window::Win32Window(Window* owner) : +PlatformWindow (owner), m_handle (NULL), m_icon (0), m_cursor (0), diff --git a/source/Platform/Win32/Win32Window.h b/source/Platform/Win32/Win32Window.h index b2cbb2d..15a9201 100644 --- a/source/Platform/Win32/Win32Window.h +++ b/source/Platform/Win32/Win32Window.h @@ -9,10 +9,12 @@ namespace sp { +class Window; + class Win32Window : public PlatformWindow { public : - Win32Window(); + Win32Window(Window* owner); virtual ~Win32Window(); virtual bool create(WindowDescription description); From cadbbf9d8ba435ac8860509ac0aac1a83d12e6a0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 22 Aug 2023 17:51:24 +0200 Subject: [PATCH 347/361] Platform/PlatformWindow: adding getOwner() --- source/Platform/PlatformWindow.cpp | 5 +++++ source/Platform/PlatformWindow.h | 2 ++ 2 files changed, 7 insertions(+) diff --git a/source/Platform/PlatformWindow.cpp b/source/Platform/PlatformWindow.cpp index c09411f..be55b43 100644 --- a/source/Platform/PlatformWindow.cpp +++ b/source/Platform/PlatformWindow.cpp @@ -29,6 +29,11 @@ PlatformWindow::~PlatformWindow() // Nothing to do. } +Window* PlatformWindow::getOwner() +{ + return m_owner; +} + void PlatformWindow::onReshape(int width, int height) { // Forward to parent. diff --git a/source/Platform/PlatformWindow.h b/source/Platform/PlatformWindow.h index 95d09e5..42be1ab 100644 --- a/source/Platform/PlatformWindow.h +++ b/source/Platform/PlatformWindow.h @@ -22,6 +22,8 @@ public : virtual ~PlatformWindow(); + Window* getOwner(); + virtual bool create(WindowDescription description) = 0; virtual void destroy() = 0; From 4380f1ed013d1569788c7339d7361bae8dc3bc01 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 22 Aug 2023 20:01:46 +0200 Subject: [PATCH 348/361] include/Spectre/System/Event.h: Change "None" to "Unkown" as None is a macro in X11 --- include/Spectre/System/Event.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/Spectre/System/Event.h b/include/Spectre/System/Event.h index 4577c5f..e595e77 100644 --- a/include/Spectre/System/Event.h +++ b/include/Spectre/System/Event.h @@ -14,7 +14,7 @@ struct Event public : enum Type { - None, + Unknown, Quit, Size, Key, @@ -56,7 +56,7 @@ public : struct MouseButtonEvent mouseButton; }; - Event(Type type = None); + Event(Type type = Unknown); std::string toString() const; From 2ac3b5b8cce87f72f1a96c3eb786198417509533 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Tue, 22 Aug 2023 20:24:59 +0200 Subject: [PATCH 349/361] Platform/PlatformApplication: define getMessageQueue() here as it is not platform specific. --- source/Platform/PlatformApplication.cpp | 5 +++++ source/Platform/PlatformApplication.h | 9 +++++++-- source/Platform/Unix/UnixApplication.cpp | 5 ----- source/Platform/Unix/UnixApplication.h | 3 --- source/Platform/Win32/Win32Application.cpp | 5 ----- source/Platform/Win32/Win32Application.h | 3 --- 6 files changed, 12 insertions(+), 18 deletions(-) diff --git a/source/Platform/PlatformApplication.cpp b/source/Platform/PlatformApplication.cpp index 21148f5..7e707f9 100644 --- a/source/Platform/PlatformApplication.cpp +++ b/source/Platform/PlatformApplication.cpp @@ -19,4 +19,9 @@ PlatformApplication* PlatformApplication::get() return &inst; } +MessageQueue& PlatformApplication::getMessageQueue() +{ + return m_messageQueue; +} + } // namespace sp diff --git a/source/Platform/PlatformApplication.h b/source/Platform/PlatformApplication.h index cfd3331..a141f08 100644 --- a/source/Platform/PlatformApplication.h +++ b/source/Platform/PlatformApplication.h @@ -2,13 +2,13 @@ #ifndef SPECTRE_PLATFORM_H #define SPECTRE_PLATFORM_H +#include #include namespace sp { class PlatformInput; class PlatformDisplay; -class MessageQueue; class PlatformApplication : NonCopyable { @@ -23,7 +23,12 @@ public : virtual PlatformInput& getInput() = 0; - virtual MessageQueue& getMessageQueue() = 0; + MessageQueue& getMessageQueue(); + +protected : + + MessageQueue m_messageQueue; + }; } // namespace sp diff --git a/source/Platform/Unix/UnixApplication.cpp b/source/Platform/Unix/UnixApplication.cpp index f2c175f..e9835ff 100644 --- a/source/Platform/Unix/UnixApplication.cpp +++ b/source/Platform/Unix/UnixApplication.cpp @@ -19,9 +19,4 @@ PlatformInput& UnixApplication::getInput() return m_input; } -MessageQueue& UnixApplication::getMessageQueue() -{ - return m_messageQueue; -} - } // namespace sp diff --git a/source/Platform/Unix/UnixApplication.h b/source/Platform/Unix/UnixApplication.h index 1f5c2dc..173aeb1 100644 --- a/source/Platform/Unix/UnixApplication.h +++ b/source/Platform/Unix/UnixApplication.h @@ -17,12 +17,9 @@ public : virtual PlatformInput& getInput(); - virtual MessageQueue& getMessageQueue(); - protected : X11Input m_input; - MessageQueue m_messageQueue; }; } // namespace sp diff --git a/source/Platform/Win32/Win32Application.cpp b/source/Platform/Win32/Win32Application.cpp index b125c7f..c4e5c99 100644 --- a/source/Platform/Win32/Win32Application.cpp +++ b/source/Platform/Win32/Win32Application.cpp @@ -22,9 +22,4 @@ PlatformInput& Win32Application::getInput() return m_input; } -MessageQueue& Win32Application::getMessageQueue() -{ - return m_messageQueue; -} - } // namespace sp diff --git a/source/Platform/Win32/Win32Application.h b/source/Platform/Win32/Win32Application.h index 9fe035d..e95e697 100644 --- a/source/Platform/Win32/Win32Application.h +++ b/source/Platform/Win32/Win32Application.h @@ -22,13 +22,10 @@ public : virtual PlatformInput& getInput(); - virtual MessageQueue& getMessageQueue(); - protected : //Win32Display m_display; Win32Input m_input; - MessageQueue m_messageQueue; }; } // namespace sp From a8f65e54ac8f2635a887903106d90ffe4b243e53 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 23 Aug 2023 15:06:54 +0200 Subject: [PATCH 350/361] Platform/PlatformApplication: Adding createWindow() --- source/Platform/PlatformApplication.h | 5 ++++- source/Platform/Unix/UnixApplication.cpp | 6 ++++++ source/Platform/Unix/UnixApplication.h | 2 ++ source/Platform/Win32/Win32Application.cpp | 8 ++++---- source/Platform/Win32/Win32Application.h | 2 +- 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/source/Platform/PlatformApplication.h b/source/Platform/PlatformApplication.h index a141f08..f6d12e0 100644 --- a/source/Platform/PlatformApplication.h +++ b/source/Platform/PlatformApplication.h @@ -7,6 +7,9 @@ namespace sp { +class Window; + +class PlatformWindow; class PlatformInput; class PlatformDisplay; @@ -19,7 +22,7 @@ public : virtual void shutdown() = 0; - //virtual PlatformDisplay& getDisplay() = 0; + virtual PlatformWindow* createWindow(Window* window) = 0; virtual PlatformInput& getInput() = 0; diff --git a/source/Platform/Unix/UnixApplication.cpp b/source/Platform/Unix/UnixApplication.cpp index e9835ff..08ad5d6 100644 --- a/source/Platform/Unix/UnixApplication.cpp +++ b/source/Platform/Unix/UnixApplication.cpp @@ -1,4 +1,5 @@ +#include "X11Window.h" #include "UnixApplication.h" #include "Xlib.h" @@ -14,6 +15,11 @@ void UnixApplication::shutdown() Xlib::shutdown(); } +PlatformWindow* UnixApplication::createWindow(Window* window) +{ + return new X11Window(window); +} + PlatformInput& UnixApplication::getInput() { return m_input; diff --git a/source/Platform/Unix/UnixApplication.h b/source/Platform/Unix/UnixApplication.h index 173aeb1..b1d37f4 100644 --- a/source/Platform/Unix/UnixApplication.h +++ b/source/Platform/Unix/UnixApplication.h @@ -15,6 +15,8 @@ public : virtual void shutdown(); + virtual PlatformWindow* createWindow(Window* window); + virtual PlatformInput& getInput(); protected : diff --git a/source/Platform/Win32/Win32Application.cpp b/source/Platform/Win32/Win32Application.cpp index c4e5c99..09dd3b4 100644 --- a/source/Platform/Win32/Win32Application.cpp +++ b/source/Platform/Win32/Win32Application.cpp @@ -1,4 +1,5 @@ +#include "Win32Window.h" #include "Win32Application.h" namespace sp { @@ -11,11 +12,10 @@ void Win32Application::shutdown() { } -/* -PlatformDisplay& Win32Application::getDisplay() +PlatformWindow* Win32Application::createWindow(Window* window) { - return m_display; -} */ + return new Win32Window(window); +} PlatformInput& Win32Application::getInput() { diff --git a/source/Platform/Win32/Win32Application.h b/source/Platform/Win32/Win32Application.h index e95e697..ea1e074 100644 --- a/source/Platform/Win32/Win32Application.h +++ b/source/Platform/Win32/Win32Application.h @@ -18,7 +18,7 @@ public : virtual void shutdown(); - //virtual PlatformDisplay& getDisplay(); + virtual PlatformWindow* createWindow(Window* window); virtual PlatformInput& getInput(); From f5db354aecba8371a1b41a4f33caca98ac74df17 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 23 Aug 2023 15:07:51 +0200 Subject: [PATCH 351/361] source/Window/Window.cpp: call PlatformApplication::createWindow() instead of PlatformWindow::make() --- source/Window/Window.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/Window/Window.cpp b/source/Window/Window.cpp index 6efe7b7..96d4e96 100644 --- a/source/Window/Window.cpp +++ b/source/Window/Window.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include @@ -21,7 +22,7 @@ Window::Window() m_fmode = WINDOWED; m_context = GLContext::create(); - m_impl = PlatformWindow::make(this); + m_impl = PlatformApplication::get()->createWindow(this); } Window::~Window() From 2de3bd93f7b457959d2e3bb9987f4088aeb07f0e Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 23 Aug 2023 15:08:21 +0200 Subject: [PATCH 352/361] Platform/PlatformWindow: remove make() --- source/Platform/PlatformWindow.cpp | 15 --------------- source/Platform/PlatformWindow.h | 3 --- 2 files changed, 18 deletions(-) diff --git a/source/Platform/PlatformWindow.cpp b/source/Platform/PlatformWindow.cpp index be55b43..1224b1d 100644 --- a/source/Platform/PlatformWindow.cpp +++ b/source/Platform/PlatformWindow.cpp @@ -2,23 +2,8 @@ #include #include "PlatformWindow.h" -#ifdef SPECTRE_PLATFORM_WIN -#include -typedef sp::Win32Window WindowType; -#elif SPECTRE_PLATFORM_UNIX -#include -typedef sp::X11Window WindowType; -#else -#error "No Window implementation exists" -#endif - namespace sp { -PlatformWindow* PlatformWindow::make(Window* owner) -{ - return new WindowType(owner); -} - PlatformWindow::PlatformWindow(Window* owner) : m_owner (owner) { diff --git a/source/Platform/PlatformWindow.h b/source/Platform/PlatformWindow.h index 42be1ab..8b10852 100644 --- a/source/Platform/PlatformWindow.h +++ b/source/Platform/PlatformWindow.h @@ -17,9 +17,6 @@ class Window; class PlatformWindow { public : - // Factory method. - static PlatformWindow* make(Window* owner); - virtual ~PlatformWindow(); Window* getOwner(); From b1ccea139707a6a4193c5a89b9873da726b3379b Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 23 Aug 2023 19:28:24 +0200 Subject: [PATCH 353/361] Spectre/Window/Window: refactor out GLContext specific code to its own class (GLWindow) --- engine.cmake | 1 + include/Spectre/Graphics.h | 6 +-- include/Spectre/Window/GLWindow.h | 41 ++++++++++++++++++ include/Spectre/Window/Window.h | 16 ++----- source/Graphics/Graphics.cpp | 4 +- source/Window/GLWindow.cpp | 70 +++++++++++++++++++++++++++++++ source/Window/Window.cpp | 37 ---------------- 7 files changed, 120 insertions(+), 55 deletions(-) create mode 100644 include/Spectre/Window/GLWindow.h create mode 100644 source/Window/GLWindow.cpp diff --git a/engine.cmake b/engine.cmake index bf11d58..3758ad7 100644 --- a/engine.cmake +++ b/engine.cmake @@ -44,6 +44,7 @@ set( ENGINE_SRC source/Window/Window.cpp source/Window/WindowDescription.cpp source/Window/DisplayMode.cpp + source/Window/GLWindow.cpp source/Window/GLContext.cpp # GfxDriver diff --git a/include/Spectre/Graphics.h b/include/Spectre/Graphics.h index 0720285..18ea850 100644 --- a/include/Spectre/Graphics.h +++ b/include/Spectre/Graphics.h @@ -3,7 +3,7 @@ #define GRAPHICS_H #include -#include +#include namespace sp { @@ -45,14 +45,14 @@ public : GfxDriver* getDriver(); - Window* getWindow(); + GLWindow* getWindow(); protected : int m_width; int m_height; - Window *m_window; + GLWindow *m_window; // Graphics Driver. OpenGL/Vulcan/DirectX etc. GfxDriver *m_gfxdrv; diff --git a/include/Spectre/Window/GLWindow.h b/include/Spectre/Window/GLWindow.h new file mode 100644 index 0000000..26d9203 --- /dev/null +++ b/include/Spectre/Window/GLWindow.h @@ -0,0 +1,41 @@ + +#ifndef SPECTRE_WINDOW_GLWINDOW_H +#define SPECTRE_WINDOW_GLWINDOW_H + +#include +#include + +namespace sp { + +class GLContext; + +// GLWindow represents a window that has an OpenGL context attached to it. +class GLWindow : public Window +{ +public: + GLWindow(); + virtual ~GLWindow(); + + virtual bool create(WindowDescription decription); + + virtual void destroy(); + + bool activate(bool value); + + // Enable/Disable Vertical Sync. + bool enableVSync(bool value); + + void swapBuffers(); + +protected: + + virtual void onReshape(int width, int height); + +private: + + GLContext* m_context; +}; + +} // namepsace sp + +#endif /* SPECTRE_WINDOW_GLWINDOW_H */ diff --git a/include/Spectre/Window/Window.h b/include/Spectre/Window/Window.h index 41a7074..f26939f 100644 --- a/include/Spectre/Window/Window.h +++ b/include/Spectre/Window/Window.h @@ -5,7 +5,6 @@ #include "DisplayMode.h" #include "WindowDescription.h" #include -#include #include #include @@ -28,9 +27,9 @@ public : Window(); virtual ~Window(); - bool create(WindowDescription decription); + virtual bool create(WindowDescription decription); - void destroy(); + virtual void destroy(); void setSize(unsigned int width, unsigned int height); @@ -58,18 +57,11 @@ public : void grabCursor(bool value); - bool activate(bool value); - - // Enable/Disable Vertical Sync. - bool enableVSync(bool value); - - void swapBuffers(); - protected : void init(); - void onReshape(int width, int height); + virtual void onReshape(int width, int height); protected : enum Mode m_fmode; @@ -84,8 +76,6 @@ protected : std::string m_caption; PlatformWindow* m_impl; - - GLContext* m_context; }; } // namepsace sp diff --git a/source/Graphics/Graphics.cpp b/source/Graphics/Graphics.cpp index 63cfc4e..8972e4d 100644 --- a/source/Graphics/Graphics.cpp +++ b/source/Graphics/Graphics.cpp @@ -10,7 +10,7 @@ Graphics::Graphics(PlatformApplication *platform) m_width = 800; m_height = 600; - m_window = new Window(); + m_window = new GLWindow(); // Only have OpenGL atm. m_gfxdrv = new OpenGLDrv(); @@ -84,7 +84,7 @@ GfxDriver* Graphics::getDriver() return m_gfxdrv; } -Window* Graphics::getWindow() +GLWindow* Graphics::getWindow() { return m_window; } diff --git a/source/Window/GLWindow.cpp b/source/Window/GLWindow.cpp new file mode 100644 index 0000000..b299440 --- /dev/null +++ b/source/Window/GLWindow.cpp @@ -0,0 +1,70 @@ + +#include +#include +#include + +namespace sp { + +GLWindow::GLWindow() +{ + m_context = GLContext::create(); +} + +GLWindow::~GLWindow() +{ + delete m_context; +} + +bool GLWindow::create(WindowDescription description) +{ + if (!Window::create(description)) { + return false; + } + + if (!m_context->create(m_impl)) { + return false; + } + + enableVSync(false); + + return activate(true); +} + +void GLWindow::destroy() +{ + m_context->destroy(); + + Window::destroy(); +} + +bool GLWindow::activate(bool value) +{ + if (value) { + return m_context->activate(); + } + return m_context->deactivate(); +} + +bool GLWindow::enableVSync(bool value) +{ + return m_context->setSwapInterval(value ? 1 : 0); +} + +void GLWindow::swapBuffers() +{ + if (activate(true)) { + m_context->swapBuffers(); + } +} + +void GLWindow::onReshape(int width, int height) +{ + // TODO: This should even not be here. + // Generic Display should not have any GL calls. + // But it's better to have it here then in the platform specific GLContext + if (activate(true)) { + glViewport(0, 0, width, height); + } +} + +} // namespace \ No newline at end of file diff --git a/source/Window/Window.cpp b/source/Window/Window.cpp index 96d4e96..78bf657 100644 --- a/source/Window/Window.cpp +++ b/source/Window/Window.cpp @@ -21,13 +21,11 @@ Window::Window() m_caption = CAPTION_DEFAULT; m_fmode = WINDOWED; - m_context = GLContext::create(); m_impl = PlatformApplication::get()->createWindow(this); } Window::~Window() { - delete m_context; delete m_impl; } @@ -39,10 +37,6 @@ bool Window::create(WindowDescription description) return false; } - if (!m_context->create(m_impl)) { - return false; - } - init(); m_description = description; @@ -56,16 +50,11 @@ void Window::init() setIcon(ICON_DEFAULT); - activate(true); - - enableVSync(false); showCursor(true); } void Window::destroy() { - m_context->destroy(); - m_impl->destroy(); } @@ -166,34 +155,8 @@ void Window::grabCursor(bool value) m_impl->grabCursor(value); } -bool Window::activate(bool value) -{ - if (value) { - return m_context->activate(); - } - return m_context->deactivate(); -} - -bool Window::enableVSync(bool value) -{ - return m_context->setSwapInterval(value ? 1 : 0); -} - -void Window::swapBuffers() -{ - if (activate(true)) { - m_context->swapBuffers(); - } -} - void Window::onReshape(int width, int height) { - // TODO: This should even not be here. - // Generic Display should not have any GL calls. - // But it's better to have it here then in the platform specific GLContext - if (activate(true)) { - glViewport(0, 0, width, height); - } } } // namespace sp From b3003102396b12e99fb8cd378ba09f80e3f05235 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 23 Aug 2023 19:43:22 +0200 Subject: [PATCH 354/361] Platform/PlatformApplication: add createGLContext() --- source/Platform/PlatformApplication.h | 3 +++ source/Platform/Unix/UnixApplication.cpp | 6 ++++++ source/Platform/Unix/UnixApplication.h | 2 ++ source/Platform/Win32/Win32Application.cpp | 6 ++++++ source/Platform/Win32/Win32Application.h | 2 ++ 5 files changed, 19 insertions(+) diff --git a/source/Platform/PlatformApplication.h b/source/Platform/PlatformApplication.h index f6d12e0..2c0dbbb 100644 --- a/source/Platform/PlatformApplication.h +++ b/source/Platform/PlatformApplication.h @@ -8,6 +8,7 @@ namespace sp { class Window; +class GLContext; class PlatformWindow; class PlatformInput; @@ -24,6 +25,8 @@ public : virtual PlatformWindow* createWindow(Window* window) = 0; + virtual GLContext* createGLContext() = 0; + virtual PlatformInput& getInput() = 0; MessageQueue& getMessageQueue(); diff --git a/source/Platform/Unix/UnixApplication.cpp b/source/Platform/Unix/UnixApplication.cpp index 08ad5d6..4778465 100644 --- a/source/Platform/Unix/UnixApplication.cpp +++ b/source/Platform/Unix/UnixApplication.cpp @@ -1,5 +1,6 @@ #include "X11Window.h" +#include "GLXContext.h" #include "UnixApplication.h" #include "Xlib.h" @@ -20,6 +21,11 @@ PlatformWindow* UnixApplication::createWindow(Window* window) return new X11Window(window); } +GLContext* UnixApplication::createGLContext() +{ + return new GLXContext(); +} + PlatformInput& UnixApplication::getInput() { return m_input; diff --git a/source/Platform/Unix/UnixApplication.h b/source/Platform/Unix/UnixApplication.h index b1d37f4..c9585ad 100644 --- a/source/Platform/Unix/UnixApplication.h +++ b/source/Platform/Unix/UnixApplication.h @@ -17,6 +17,8 @@ public : virtual PlatformWindow* createWindow(Window* window); + virtual GLContext* createGLContext(); + virtual PlatformInput& getInput(); protected : diff --git a/source/Platform/Win32/Win32Application.cpp b/source/Platform/Win32/Win32Application.cpp index 09dd3b4..3acb5c9 100644 --- a/source/Platform/Win32/Win32Application.cpp +++ b/source/Platform/Win32/Win32Application.cpp @@ -1,5 +1,6 @@ #include "Win32Window.h" +#include "Win32GLContext.h" #include "Win32Application.h" namespace sp { @@ -17,6 +18,11 @@ PlatformWindow* Win32Application::createWindow(Window* window) return new Win32Window(window); } +GLContext* Win32Application::createGLContext() +{ + return new Win32GLContext(); +} + PlatformInput& Win32Application::getInput() { return m_input; diff --git a/source/Platform/Win32/Win32Application.h b/source/Platform/Win32/Win32Application.h index ea1e074..c1929e6 100644 --- a/source/Platform/Win32/Win32Application.h +++ b/source/Platform/Win32/Win32Application.h @@ -20,6 +20,8 @@ public : virtual PlatformWindow* createWindow(Window* window); + virtual GLContext* createGLContext(); + virtual PlatformInput& getInput(); protected : From f35658a971a1b52da577abdc2744fed38c6968f6 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 23 Aug 2023 19:43:59 +0200 Subject: [PATCH 355/361] source/Window/GLWindow.cpp: use PlatformApplication::createGLContext() instead of GLContext::create() --- source/Window/GLWindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/Window/GLWindow.cpp b/source/Window/GLWindow.cpp index b299440..9b6ef32 100644 --- a/source/Window/GLWindow.cpp +++ b/source/Window/GLWindow.cpp @@ -1,5 +1,5 @@ -#include +#include #include #include @@ -7,7 +7,7 @@ namespace sp { GLWindow::GLWindow() { - m_context = GLContext::create(); + m_context = PlatformApplication::get()->createGLContext(); } GLWindow::~GLWindow() From ea763a9f38857379c975150dd95e033a9a02d107 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 23 Aug 2023 19:45:01 +0200 Subject: [PATCH 356/361] Spectre/Window/GLContext: remove static create() method. --- include/Spectre/Window/GLContext.h | 2 -- source/Window/GLContext.cpp | 16 ---------------- 2 files changed, 18 deletions(-) diff --git a/include/Spectre/Window/GLContext.h b/include/Spectre/Window/GLContext.h index 4a08b93..e3bb423 100644 --- a/include/Spectre/Window/GLContext.h +++ b/include/Spectre/Window/GLContext.h @@ -13,8 +13,6 @@ class PlatformWindow; class GLContext { public : - static GLContext* create(); - virtual ~GLContext(); // Create a GLContext for this perticular window. diff --git a/source/Window/GLContext.cpp b/source/Window/GLContext.cpp index 7d9cb84..95d538e 100644 --- a/source/Window/GLContext.cpp +++ b/source/Window/GLContext.cpp @@ -1,23 +1,7 @@ - #include -#ifdef SPECTRE_PLATFORM_WIN -#include -typedef sp::Win32GLContext ContextType; -#elif SPECTRE_PLATFORM_UNIX -#include -typedef sp::GLXContext ContextType; -#else -#error "No GLContext implementation exists" -#endif - namespace sp { -GLContext* GLContext::create() -{ - return new ContextType(); -} - GLContext::~GLContext() { // Nothing to do. From f6c44a223bff84c00fc153d4feb3cb4fee15fa3a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Wed, 23 Aug 2023 20:05:54 +0200 Subject: [PATCH 357/361] source/Platform/Win32/Win32Mouse.cpp: in update() call GetActiveWindow() instead of GetCapture() We want the currently focused window whether it is captured or not. --- source/Platform/Win32/Win32Mouse.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/source/Platform/Win32/Win32Mouse.cpp b/source/Platform/Win32/Win32Mouse.cpp index 61a49da..d1ef2e4 100644 --- a/source/Platform/Win32/Win32Mouse.cpp +++ b/source/Platform/Win32/Win32Mouse.cpp @@ -64,9 +64,10 @@ void Win32Mouse::update(InputModule *input) m_abs_position = Vector2f(p.x, p.y); // Update relative position - handle = ::GetCapture(); + // Get the active window. + handle = ::GetActiveWindow(); if (handle) { - // Translate position to focued window. + // Translate position to the active window. ScreenToClient(handle, &p); m_position = Vector2f(p.x, p.y); } From 0596e1ba3bf446025c4142ff469423ea1d4c896a Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 22 Jun 2024 19:49:55 +0200 Subject: [PATCH 358/361] .gitignore: adding LSP files --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index b6d5515..06e03d9 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,10 @@ # Build system related files build/ +# LSP related files +.ccls-cache/ +compile_commands.json + # Thumbnail databases (Windows) Thumbs.db From ca46bd0ef74a9038f1fc23ddc2940fcd2d44a3c0 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 22 Jun 2024 19:50:05 +0200 Subject: [PATCH 359/361] adding .clang-format --- .clang-format | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .clang-format diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..bba54fd --- /dev/null +++ b/.clang-format @@ -0,0 +1,6 @@ +BasedOnStyle: LLVM +UseTab: Always +TabWidth: 8 +IndentWidth: 8 + +BreakBeforeBraces: Linux From f71fdea46391c780acb14799205988d1a84024ef Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Sat, 22 Jun 2024 19:53:16 +0200 Subject: [PATCH 360/361] source/Platform/Unix: Rename XRandR to Xrandr --- engine.cmake | 2 +- source/Platform/Unix/X11Window.cpp | 6 +++--- source/Platform/Unix/X11Window.h | 4 ++-- source/Platform/Unix/{XRandR.cpp => Xrandr.cpp} | 6 +++--- source/Platform/Unix/{XRandR.h => Xrandr.h} | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) rename source/Platform/Unix/{XRandR.cpp => Xrandr.cpp} (85%) rename source/Platform/Unix/{XRandR.h => Xrandr.h} (85%) diff --git a/engine.cmake b/engine.cmake index 3758ad7..6152e64 100644 --- a/engine.cmake +++ b/engine.cmake @@ -119,7 +119,7 @@ set(ENGINE_PLATFORM_UNIX_SRC # X11 source/Platform/Unix/Xlib.cpp - source/Platform/Unix/XRandR.cpp + source/Platform/Unix/Xrandr.cpp source/Platform/Unix/X11Window.cpp source/Platform/Unix/X11Input.cpp source/Platform/Unix/X11Keyboard.cpp diff --git a/source/Platform/Unix/X11Window.cpp b/source/Platform/Unix/X11Window.cpp index 7f9f87d..5f45d53 100644 --- a/source/Platform/Unix/X11Window.cpp +++ b/source/Platform/Unix/X11Window.cpp @@ -3,7 +3,7 @@ #include #include #include -#include "XRandR.h" +#include "Xrandr.h" #include "X11WindowEventHandler.h" #include "Xlib.h" #include "wm_hints.h" @@ -240,7 +240,7 @@ void X11Window::maximize() void X11Window::enterFullscreen(DisplayMode mode) { - if (!XRandR::FindMode(Xlib::getDisplay(), mode.width, mode.height, mode.bpp, &m_fullscreen_mode.size, &m_fullscreen_mode.rate)) { + if (!Xrandr::FindMode(Xlib::getDisplay(), mode.width, mode.height, mode.bpp, &m_fullscreen_mode.size, &m_fullscreen_mode.rate)) { Log::warn("X11: Failed to find a mode"); return; } @@ -253,7 +253,7 @@ void X11Window::toggleFullscreen(bool enable) ::Display* disp = Xlib::getDisplay(); ::Window root; ::XRRScreenConfiguration *conf; - XRandR::VideoMode *mode = &m_desktop_mode; + Xrandr::VideoMode *mode = &m_desktop_mode; root = RootWindow(disp, 0); conf = XRRGetScreenInfo(disp, root); diff --git a/source/Platform/Unix/X11Window.h b/source/Platform/Unix/X11Window.h index 7b8fcaf..944f1a8 100644 --- a/source/Platform/Unix/X11Window.h +++ b/source/Platform/Unix/X11Window.h @@ -78,9 +78,9 @@ protected : Vector2u m_size; - XRandR::VideoMode m_fullscreen_mode; + Xrandr::VideoMode m_fullscreen_mode; - XRandR::VideoMode m_desktop_mode; + Xrandr::VideoMode m_desktop_mode; }; } // namespace sp diff --git a/source/Platform/Unix/XRandR.cpp b/source/Platform/Unix/Xrandr.cpp similarity index 85% rename from source/Platform/Unix/XRandR.cpp rename to source/Platform/Unix/Xrandr.cpp index c934218..9f0b68e 100644 --- a/source/Platform/Unix/XRandR.cpp +++ b/source/Platform/Unix/Xrandr.cpp @@ -1,10 +1,10 @@ -#include "XRandR.h" +#include "Xrandr.h" #include #include namespace sp { -bool XRandR::FindMode(::Display* disp, unsigned int width, unsigned int height, unsigned int bpp, SizeID *id, short *rate) +bool Xrandr::FindMode(::Display* disp, unsigned int width, unsigned int height, unsigned int bpp, SizeID *id, short *rate) { ::XRRScreenSize *xrrs; int num_sizes; @@ -31,4 +31,4 @@ bool XRandR::FindMode(::Display* disp, unsigned int width, unsigned int height, return false; } -} // namespace sp \ No newline at end of file +} // namespace sp diff --git a/source/Platform/Unix/XRandR.h b/source/Platform/Unix/Xrandr.h similarity index 85% rename from source/Platform/Unix/XRandR.h rename to source/Platform/Unix/Xrandr.h index 6faac86..32c616a 100644 --- a/source/Platform/Unix/XRandR.h +++ b/source/Platform/Unix/Xrandr.h @@ -4,7 +4,7 @@ #include -namespace sp { namespace XRandR { +namespace sp { namespace Xrandr { struct VideoMode { SizeID size; @@ -13,6 +13,6 @@ struct VideoMode { bool FindMode(::Display* disp, unsigned int width, unsigned int height, unsigned int bpp, SizeID *id, short *rate); -} } // sp::XRandR +} } // sp::Xrandr #endif /* PLATFORM_UNIX_XRANDR_H */ From e73d1f7f90f29e19dcc6bf545b71dcddc60fb210 Mon Sep 17 00:00:00 2001 From: Henrik Hautakoski Date: Fri, 5 Jul 2024 01:02:59 +0200 Subject: [PATCH 361/361] source/Platform/Win32/Win32GLContext.cpp: skip goto in createGLContext() --- source/Platform/Win32/Win32GLContext.cpp | 29 +++++++++++------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/source/Platform/Win32/Win32GLContext.cpp b/source/Platform/Win32/Win32GLContext.cpp index cfc59bc..9ca4b0c 100644 --- a/source/Platform/Win32/Win32GLContext.cpp +++ b/source/Platform/Win32/Win32GLContext.cpp @@ -100,24 +100,21 @@ void Win32GLContext::createGLContext() tmpDC = ::wglCreateContext(m_deviceContext); ::wglMakeCurrent(m_deviceContext, tmpDC); - if (!ensureExtensionsLoaded(m_deviceContext)) { - goto err; + if (ensureExtensionsLoaded(m_deviceContext)) { + // TODO: For now.. We force 3.2 Core but this should not be implementation specific. + // The Display class should force that for all GLContext Implementations. + + int attriblist[] = { + WGL_CONTEXT_MAJOR_VERSION_ARB, 3, + WGL_CONTEXT_MINOR_VERSION_ARB, 2, + WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, + 0, 0 + }; + + // Create real context. + m_renderContext = ::wglCreateContextAttribsARB(m_deviceContext, 0, attriblist); } - // TODO: For now.. We force 3.2 Core but this should not be implementation specific. - // The Display class should force that for all GLContext Implementations. - - int attriblist[] = { - WGL_CONTEXT_MAJOR_VERSION_ARB, 3, - WGL_CONTEXT_MINOR_VERSION_ARB, 2, - WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_CORE_PROFILE_BIT_ARB, - 0, 0 - }; - - // Create real context. - m_renderContext = ::wglCreateContextAttribsARB(m_deviceContext, 0, attriblist); - -err: // Dont need the old one anymore. wglMakeCurrent(m_deviceContext, NULL); ::wglDeleteContext(tmpDC);

      CWq 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 z

    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

  2. 7SUEh@?{0*}D*F<1&RL$)|GFo7;TV}RboQ2^-{ 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�&%| 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