1727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/***************************************************************************/ 2727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* */ 3727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* cf2ft.c */ 4727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* */ 5727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* FreeType Glue Component to Adobe's Interpreter (body). */ 6727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* */ 79c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod/* Copyright 2013-2014 Adobe Systems Incorporated. */ 8727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* */ 9727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* This software, and all works of authorship, whether in source or */ 10727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* object code form as indicated by the copyright notice(s) included */ 11727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* herein (collectively, the "Work") is made available, and may only be */ 12727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* used, modified, and distributed under the FreeType Project License, */ 13727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* LICENSE.TXT. Additionally, subject to the terms and conditions of the */ 14727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* FreeType Project License, each contributor to the Work hereby grants */ 15727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* to any individual or legal entity exercising permissions granted by */ 16727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* the FreeType Project License and this section (hereafter, "You" or */ 17727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* "Your") a perpetual, worldwide, non-exclusive, no-charge, */ 18727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* royalty-free, irrevocable (except as stated in this section) patent */ 19727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* license to make, have made, use, offer to sell, sell, import, and */ 20727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* otherwise transfer the Work, where such license applies only to those */ 21727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* patent claims licensable by such contributor that are necessarily */ 22727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* infringed by their contribution(s) alone or by combination of their */ 23727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* contribution(s) with the Work to which such contribution(s) was */ 24727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* submitted. If You institute patent litigation against any entity */ 25727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* (including a cross-claim or counterclaim in a lawsuit) alleging that */ 26727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* the Work or a contribution incorporated within the Work constitutes */ 27727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* direct or contributory patent infringement, then any patent licenses */ 28727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* granted to You under this License for that Work shall terminate as of */ 29727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* the date such litigation is filed. */ 30727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* */ 31727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* By using, modifying, or distributing the Work you indicate that you */ 32727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* have read and understood the terms and conditions of the */ 33727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* FreeType Project License as well as those provided in this section, */ 34727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* and you accept them fully. */ 35727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* */ 36727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/***************************************************************************/ 37727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 38727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 39727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include "cf2ft.h" 40727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include FT_INTERNAL_DEBUG_H 41727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 42727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include "cf2font.h" 43727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#include "cf2error.h" 44727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 45727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 46727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease#define CF2_MAX_SIZE cf2_intToFixed( 2000 ) /* max ppem */ 47727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 48727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 49727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* 50727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease * This check should avoid most internal overflow cases. Clients should 51727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease * generally respond to `Glyph_Too_Big' by getting a glyph outline 52727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease * at EM size, scaling it and filling it as a graphics operation. 53727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease * 54727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease */ 55727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease static FT_Error 56727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_checkTransform( const CF2_Matrix* transform, 57727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Int unitsPerEm ) 58727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 59727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Fixed maxScale; 60727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 61727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 62727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( unitsPerEm > 0 ); 63727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 649c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod if ( transform->a <= 0 || transform->d <= 0 ) 659c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod return FT_THROW( Invalid_Size_Handle ); 669c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod 67727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( transform->b == 0 && transform->c == 0 ); 68727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( transform->tx == 0 && transform->ty == 0 ); 69727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 70727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( unitsPerEm > 0x7FFF ) 71727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_THROW( Glyph_Too_Big ); 72727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 73727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease maxScale = FT_DivFix( CF2_MAX_SIZE, cf2_intToFixed( unitsPerEm ) ); 74727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 75727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( transform->a > maxScale || transform->d > maxScale ) 76727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_THROW( Glyph_Too_Big ); 77727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 78727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 79727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 80727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 81727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 82727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease static void 83727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_setGlyphWidth( CF2_Outline outline, 84727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Fixed width ) 85727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 86727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CFF_Decoder* decoder = outline->decoder; 87727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 88727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 89727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder ); 90727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 91727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease decoder->glyph_width = cf2_fixedToInt( width ); 92727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 93727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 94727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 95727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Clean up font instance. */ 96727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease static void 97727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_free_instance( void* ptr ) 98727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 99727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Font font = (CF2_Font)ptr; 100727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 101727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 102727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( font ) 103727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 104727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Memory memory = font->memory; 105727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 106727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 107727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (void)memory; 108727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 109727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 110727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 111727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 112727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /********************************************/ 113727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 114727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* functions for handling client outline; */ 115727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* FreeType uses coordinates in 26.6 format */ 116727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* */ 117727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /********************************************/ 118727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 119727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease static void 120727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_builder_moveTo( CF2_OutlineCallbacks callbacks, 121727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease const CF2_CallbackParams params ) 122727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 123727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* downcast the object pointer */ 124727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Outline outline = (CF2_Outline)callbacks; 125727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CFF_Builder* builder; 126727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 127727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (void)params; /* only used in debug mode */ 128727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 129727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 130727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( outline && outline->decoder ); 131727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( params->op == CF2_PathOpMoveTo ); 132727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 133727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease builder = &outline->decoder->builder; 134727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 135727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* note: two successive moves simply close the contour twice */ 136727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cff_builder_close_contour( builder ); 137727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease builder->path_begun = 0; 138727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 139727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 140727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 141727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease static void 142727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_builder_lineTo( CF2_OutlineCallbacks callbacks, 143727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease const CF2_CallbackParams params ) 144727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 145727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* downcast the object pointer */ 146727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Outline outline = (CF2_Outline)callbacks; 147727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CFF_Builder* builder; 148727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 149727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 150727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( outline && outline->decoder ); 151727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( params->op == CF2_PathOpLineTo ); 152727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 153727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease builder = &outline->decoder->builder; 154727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 155727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( !builder->path_begun ) 156727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 157727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* record the move before the line; also check points and set */ 158727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* `path_begun' */ 159727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cff_builder_start_point( builder, 160727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease params->pt0.x, 161727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease params->pt0.y ); 162727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 163727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 164727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* `cff_builder_add_point1' includes a check_points call for one point */ 165727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cff_builder_add_point1( builder, 166727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease params->pt1.x, 167727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease params->pt1.y ); 168727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 169727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 170727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 171727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease static void 172727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_builder_cubeTo( CF2_OutlineCallbacks callbacks, 173727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease const CF2_CallbackParams params ) 174727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 175727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* downcast the object pointer */ 176727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Outline outline = (CF2_Outline)callbacks; 177727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CFF_Builder* builder; 178727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 179727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 180727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( outline && outline->decoder ); 181727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( params->op == CF2_PathOpCubeTo ); 182727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 183727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease builder = &outline->decoder->builder; 184727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 185727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( !builder->path_begun ) 186727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 187727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* record the move before the line; also check points and set */ 188727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* `path_begun' */ 189727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cff_builder_start_point( builder, 190727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease params->pt0.x, 191727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease params->pt0.y ); 192727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 193727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 194727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* prepare room for 3 points: 2 off-curve, 1 on-curve */ 195727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cff_check_points( builder, 3 ); 196727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 197727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cff_builder_add_point( builder, 198727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease params->pt1.x, 199727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease params->pt1.y, 0 ); 200727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cff_builder_add_point( builder, 201727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease params->pt2.x, 202727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease params->pt2.y, 0 ); 203727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cff_builder_add_point( builder, 204727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease params->pt3.x, 205727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease params->pt3.y, 1 ); 206727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 207727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 208727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 209727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease static void 210727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_outline_init( CF2_Outline outline, 211727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Memory memory, 212727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error* error ) 213727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 214727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_MEM_ZERO( outline, sizeof ( CF2_OutlineRec ) ); 215727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 216727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease outline->root.memory = memory; 217727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease outline->root.error = error; 218727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 219727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease outline->root.moveTo = cf2_builder_moveTo; 220727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease outline->root.lineTo = cf2_builder_lineTo; 221727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease outline->root.cubeTo = cf2_builder_cubeTo; 222727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 223727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 224727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 225727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* get scaling and hint flag from GlyphSlot */ 226727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease static void 227727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getScaleAndHintFlag( CFF_Decoder* decoder, 228727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Fixed* x_scale, 229727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Fixed* y_scale, 230727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Bool* hinted, 231727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Bool* scaled ) 232727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 233727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder && decoder->builder.glyph ); 234727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 235727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* note: FreeType scale includes a factor of 64 */ 236727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *hinted = decoder->builder.glyph->hint; 237727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *scaled = decoder->builder.glyph->scaled; 238727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 239727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( *hinted ) 240727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 2419c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod *x_scale = ( decoder->builder.glyph->x_scale + 32 ) / 64; 2429c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod *y_scale = ( decoder->builder.glyph->y_scale + 32 ) / 64; 243727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 244727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease else 245727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 246727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* for unhinted outlines, `cff_slot_load' does the scaling, */ 247727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* thus render at `unity' scale */ 248727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 249727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *x_scale = 0x0400; /* 1/64 as 16.16 */ 250727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *y_scale = 0x0400; 251727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 252727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 253727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 254727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 255727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* get units per em from `FT_Face' */ 256727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* TODO: should handle font matrix concatenation? */ 257727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease static FT_UShort 258727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getUnitsPerEm( CFF_Decoder* decoder ) 259727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 260727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder && decoder->builder.face ); 261727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder->builder.face->root.units_per_EM ); 262727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 263727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return decoder->builder.face->root.units_per_EM; 264727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 265727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 266727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 267727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* Main entry point: Render one glyph. */ 268727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( FT_Error ) 269727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_decoder_parse_charstrings( CFF_Decoder* decoder, 270727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Byte* charstring_base, 271727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ULong charstring_len ) 272727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 273727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Memory memory; 274727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error = FT_Err_Ok; 275727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Font font; 276727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 277727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 278727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder && decoder->cff ); 279727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 280727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease memory = decoder->builder.memory; 281727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 282727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* CF2 data is saved here across glyphs */ 283727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease font = (CF2_Font)decoder->cff->cf2_instance.data; 284727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 285727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* on first glyph, allocate instance structure */ 286727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( decoder->cff->cf2_instance.data == NULL ) 287727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 288727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease decoder->cff->cf2_instance.finalizer = 289727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Generic_Finalizer)cf2_free_instance; 290727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 291727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( FT_ALLOC( decoder->cff->cf2_instance.data, 292727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease sizeof ( CF2_FontRec ) ) ) 293727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_THROW( Out_Of_Memory ); 294727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 295727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease font = (CF2_Font)decoder->cff->cf2_instance.data; 296727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 297727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease font->memory = memory; 298727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 299727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* initialize a client outline, to be shared by each glyph rendered */ 300727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_outline_init( &font->outline, font->memory, &font->error ); 301727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 302727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 303727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* save decoder; it is a stack variable and will be different on each */ 304727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* call */ 305727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease font->decoder = decoder; 306727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease font->outline.decoder = decoder; 307727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 308727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 309727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* build parameters for Adobe engine */ 310727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 311727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CFF_Builder* builder = &decoder->builder; 312727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CFF_Driver driver = (CFF_Driver)FT_FACE_DRIVER( builder->face ); 313727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 314727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* local error */ 315727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error2 = FT_Err_Ok; 316727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_BufferRec buf; 317727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Matrix transform; 318727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_F16Dot16 glyphWidth; 319727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 320727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Bool hinted; 321727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Bool scaled; 322727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 323727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 324727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* FreeType has already looked up the GID; convert to */ 325727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* `RegionBuffer', assuming that the input has been validated */ 326727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( charstring_base + charstring_len >= charstring_base ); 327727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 328727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ZERO( &buf ); 329727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease buf.start = 330727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease buf.ptr = charstring_base; 331727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease buf.end = charstring_base + charstring_len; 332727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 333727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ZERO( &transform ); 334727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 335727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getScaleAndHintFlag( decoder, 336727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &transform.a, 337727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &transform.d, 338727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &hinted, 339727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &scaled ); 340727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 341727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease font->renderingFlags = 0; 342727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( hinted ) 343727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease font->renderingFlags |= CF2_FlagsHinted; 344727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( scaled && !driver->no_stem_darkening ) 345727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease font->renderingFlags |= CF2_FlagsDarkened; 346727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 347ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease font->darkenParams[0] = driver->darken_params[0]; 348ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease font->darkenParams[1] = driver->darken_params[1]; 349ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease font->darkenParams[2] = driver->darken_params[2]; 350ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease font->darkenParams[3] = driver->darken_params[3]; 351ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease font->darkenParams[4] = driver->darken_params[4]; 352ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease font->darkenParams[5] = driver->darken_params[5]; 353ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease font->darkenParams[6] = driver->darken_params[6]; 354ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease font->darkenParams[7] = driver->darken_params[7]; 355ec0bab5697bb31ba980810145f62e3799946ec60Victoria Lease 356727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* now get an outline for this glyph; */ 357727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* also get units per em to validate scale */ 358727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease font->unitsPerEm = (CF2_Int)cf2_getUnitsPerEm( decoder ); 359727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 3609c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod if ( scaled ) 3619c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod { 3629c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod error2 = cf2_checkTransform( &transform, font->unitsPerEm ); 3639c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod if ( error2 ) 3649c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod return error2; 3659c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod } 366727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 367727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error2 = cf2_getGlyphOutline( font, &buf, &transform, &glyphWidth ); 368727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( error2 ) 369727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_ERR( Invalid_File_Format ); 370727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 371727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_setGlyphWidth( &font->outline, glyphWidth ); 372727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 373727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 374727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 375727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 376727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 377727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 378727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* get pointer to current FreeType subfont (based on current glyphID) */ 379727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( CFF_SubFont ) 380727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getSubfont( CFF_Decoder* decoder ) 381727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 382727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder && decoder->current_subfont ); 383727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 384727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return decoder->current_subfont; 385727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 386727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 387727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 388727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* get `y_ppem' from `CFF_Size' */ 389727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( CF2_Fixed ) 390727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getPpemY( CFF_Decoder* decoder ) 391727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 392727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder && 393727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease decoder->builder.face && 394727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease decoder->builder.face->root.size ); 395727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 3969c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod /* 3979c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod * Note that `y_ppem' can be zero if there wasn't a call to 3989c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod * `FT_Set_Char_Size' or something similar. However, this isn't a 3999c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod * problem since we come to this place in the code only if 4009c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod * FT_LOAD_NO_SCALE is set (the other case gets caught by 4019c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod * `cf2_checkTransform'). The ppem value is needed to compute the stem 4029c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod * darkening, which is disabled for getting the unscaled outline. 4039c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod * 4049c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod */ 405727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return cf2_intToFixed( 406727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease decoder->builder.face->root.size->metrics.y_ppem ); 407727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 408727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 409727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 410727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* get standard stem widths for the current subfont; */ 411727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* FreeType stores these as integer font units */ 412727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* (note: variable names seem swapped) */ 413727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( CF2_Fixed ) 414727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getStdVW( CFF_Decoder* decoder ) 415727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 416727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder && decoder->current_subfont ); 417727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 418727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return cf2_intToFixed( 419727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease decoder->current_subfont->private_dict.standard_height ); 420727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 421727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 422727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 423727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( CF2_Fixed ) 424727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getStdHW( CFF_Decoder* decoder ) 425727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 426727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder && decoder->current_subfont ); 427727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 428727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return cf2_intToFixed( 429727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease decoder->current_subfont->private_dict.standard_width ); 430727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 431727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 432727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 433727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* note: FreeType stores 1000 times the actual value for `BlueScale' */ 434727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( void ) 435727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getBlueMetrics( CFF_Decoder* decoder, 436727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Fixed* blueScale, 437727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Fixed* blueShift, 438727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Fixed* blueFuzz ) 439727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 440727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder && decoder->current_subfont ); 441727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 442727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *blueScale = FT_DivFix( 443727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease decoder->current_subfont->private_dict.blue_scale, 444727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_intToFixed( 1000 ) ); 445727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *blueShift = cf2_intToFixed( 446727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease decoder->current_subfont->private_dict.blue_shift ); 447727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *blueFuzz = cf2_intToFixed( 448727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease decoder->current_subfont->private_dict.blue_fuzz ); 449727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 450727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 451727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 452727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* get blue values counts and arrays; the FreeType parser has validated */ 453727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* the counts and verified that each is an even number */ 454727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( void ) 455727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getBlueValues( CFF_Decoder* decoder, 456727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease size_t* count, 457727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Pos* *data ) 458727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 459727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder && decoder->current_subfont ); 460727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 461727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *count = decoder->current_subfont->private_dict.num_blue_values; 462727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *data = (FT_Pos*) 463727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &decoder->current_subfont->private_dict.blue_values; 464727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 465727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 466727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 467727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( void ) 468727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getOtherBlues( CFF_Decoder* decoder, 469727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease size_t* count, 470727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Pos* *data ) 471727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 472727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder && decoder->current_subfont ); 473727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 474727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *count = decoder->current_subfont->private_dict.num_other_blues; 475727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *data = (FT_Pos*) 476727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &decoder->current_subfont->private_dict.other_blues; 477727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 478727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 479727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 480727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( void ) 481727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getFamilyBlues( CFF_Decoder* decoder, 482727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease size_t* count, 483727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Pos* *data ) 484727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 485727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder && decoder->current_subfont ); 486727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 487727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *count = decoder->current_subfont->private_dict.num_family_blues; 488727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *data = (FT_Pos*) 489727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &decoder->current_subfont->private_dict.family_blues; 490727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 491727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 492727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 493727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( void ) 494727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getFamilyOtherBlues( CFF_Decoder* decoder, 495727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease size_t* count, 496727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Pos* *data ) 497727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 498727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder && decoder->current_subfont ); 499727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 500727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *count = decoder->current_subfont->private_dict.num_family_other_blues; 501727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease *data = (FT_Pos*) 502727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &decoder->current_subfont->private_dict.family_other_blues; 503727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 504727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 505727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 506727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( CF2_Int ) 507727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getLanguageGroup( CFF_Decoder* decoder ) 508727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 509727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder && decoder->current_subfont ); 510727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 511727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return decoder->current_subfont->private_dict.language_group; 512727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 513727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 514727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 515727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* convert unbiased subroutine index to `CF2_Buffer' and */ 516727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* return 0 on success */ 517727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( CF2_Int ) 518727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_initGlobalRegionBuffer( CFF_Decoder* decoder, 519727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_UInt idx, 520727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Buffer buf ) 521727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 5229c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod FT_ASSERT( decoder ); 523727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 524727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ZERO( buf ); 525727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 526727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease idx += decoder->globals_bias; 527727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( idx >= decoder->num_globals ) 528727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return TRUE; /* error */ 529727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 5309c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod FT_ASSERT( decoder->globals ); 5319c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod 532727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease buf->start = 533727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease buf->ptr = decoder->globals[idx]; 534727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease buf->end = decoder->globals[idx + 1]; 535727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 536727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FALSE; /* success */ 537727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 538727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 539727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 540727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* convert AdobeStandardEncoding code to CF2_Buffer; */ 541727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* used for seac component */ 542727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( FT_Error ) 543727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getSeacComponent( CFF_Decoder* decoder, 544727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_UInt code, 545727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Buffer buf ) 546727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 547727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Int gid; 548727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Byte* charstring; 549727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ULong len; 550727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_Error error; 551727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 552727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 553727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder ); 554727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 555727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ZERO( buf ); 556727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 557727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease gid = cff_lookup_glyph_by_stdcharcode( decoder->cff, code ); 558727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( gid < 0 ) 559727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_THROW( Invalid_Glyph_Format ); 560727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 561727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease error = cff_get_glyph_data( decoder->builder.face, 562727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease gid, 563727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &charstring, 564727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease &len ); 565727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* TODO: for now, just pass the FreeType error through */ 566727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( error ) 567727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return error; 568727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 569727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease /* assume input has been validated */ 570727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( charstring + len >= charstring ); 571727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 572727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease buf->start = charstring; 573727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease buf->end = charstring + len; 574727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease buf->ptr = buf->start; 575727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 576727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FT_Err_Ok; 577727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 578727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 579727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 580727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( void ) 581727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_freeSeacComponent( CFF_Decoder* decoder, 582727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Buffer buf ) 583727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 584727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder ); 585727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 586727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cff_free_glyph_data( decoder->builder.face, 587727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_Byte**)&buf->start, 588727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease (FT_ULong)( buf->end - buf->start ) ); 589727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 590727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 591727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 592727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( CF2_Int ) 593727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_initLocalRegionBuffer( CFF_Decoder* decoder, 594727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_UInt idx, 595727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CF2_Buffer buf ) 596727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 5979c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod FT_ASSERT( decoder ); 598727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 599727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ZERO( buf ); 600727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 601727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease idx += decoder->locals_bias; 602727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease if ( idx >= decoder->num_locals ) 603727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return TRUE; /* error */ 604727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 6059c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod FT_ASSERT( decoder->locals ); 6069c745321260bb728ab1cd1c8fd5f075854b2ad49Behdad Esfahbod 607727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease buf->start = 608727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease buf->ptr = decoder->locals[idx]; 609727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease buf->end = decoder->locals[idx + 1]; 610727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 611727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return FALSE; /* success */ 612727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 613727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 614727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 615727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( CF2_Fixed ) 616727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getDefaultWidthX( CFF_Decoder* decoder ) 617727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 618727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder && decoder->current_subfont ); 619727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 620727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return cf2_intToFixed( 621727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease decoder->current_subfont->private_dict.default_width ); 622727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 623727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 624727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 625727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( CF2_Fixed ) 626727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_getNominalWidthX( CFF_Decoder* decoder ) 627727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 628727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder && decoder->current_subfont ); 629727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 630727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease return cf2_intToFixed( 631727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease decoder->current_subfont->private_dict.nominal_width ); 632727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 633727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 634727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 635727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( void ) 636727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_outline_reset( CF2_Outline outline ) 637727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 638727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CFF_Decoder* decoder = outline->decoder; 639727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 640727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 641727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder ); 642727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 643727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease outline->root.windingMomentum = 0; 644727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 645727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_GlyphLoader_Rewind( decoder->builder.loader ); 646727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 647727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 648727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 649727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_LOCAL_DEF( void ) 650727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cf2_outline_close( CF2_Outline outline ) 651727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease { 652727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease CFF_Decoder* decoder = outline->decoder; 653727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 654727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 655727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_ASSERT( decoder ); 656727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 657727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease cff_builder_close_contour( &decoder->builder ); 658727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 659727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease FT_GlyphLoader_Add( decoder->builder.loader ); 660727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease } 661727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 662727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease 663727dee178a392d20eb050d0c446f2fcc29058fa1Victoria Lease/* END */ 664