1*37da2899SCharles.Forsyth /***************************************************************************/ 2*37da2899SCharles.Forsyth /* */ 3*37da2899SCharles.Forsyth /* cffload.c */ 4*37da2899SCharles.Forsyth /* */ 5*37da2899SCharles.Forsyth /* OpenType and CFF data/program tables loader (body). */ 6*37da2899SCharles.Forsyth /* */ 7*37da2899SCharles.Forsyth /* Copyright 1996-2001, 2002 by */ 8*37da2899SCharles.Forsyth /* David Turner, Robert Wilhelm, and Werner Lemberg. */ 9*37da2899SCharles.Forsyth /* */ 10*37da2899SCharles.Forsyth /* This file is part of the FreeType project, and may only be used, */ 11*37da2899SCharles.Forsyth /* modified, and distributed under the terms of the FreeType project */ 12*37da2899SCharles.Forsyth /* license, LICENSE.TXT. By continuing to use, modify, or distribute */ 13*37da2899SCharles.Forsyth /* this file you indicate that you have read the license and */ 14*37da2899SCharles.Forsyth /* understand and accept it fully. */ 15*37da2899SCharles.Forsyth /* */ 16*37da2899SCharles.Forsyth /***************************************************************************/ 17*37da2899SCharles.Forsyth 18*37da2899SCharles.Forsyth 19*37da2899SCharles.Forsyth #include <ft2build.h> 20*37da2899SCharles.Forsyth #include FT_INTERNAL_DEBUG_H 21*37da2899SCharles.Forsyth #include FT_INTERNAL_OBJECTS_H 22*37da2899SCharles.Forsyth #include FT_INTERNAL_STREAM_H 23*37da2899SCharles.Forsyth #include FT_INTERNAL_POSTSCRIPT_NAMES_H 24*37da2899SCharles.Forsyth #include FT_TRUETYPE_TAGS_H 25*37da2899SCharles.Forsyth 26*37da2899SCharles.Forsyth #include "cffload.h" 27*37da2899SCharles.Forsyth #include "cffparse.h" 28*37da2899SCharles.Forsyth 29*37da2899SCharles.Forsyth #include "cfferrs.h" 30*37da2899SCharles.Forsyth 31*37da2899SCharles.Forsyth 32*37da2899SCharles.Forsyth #if 1 33*37da2899SCharles.Forsyth static const FT_UShort cff_isoadobe_charset[229] = 34*37da2899SCharles.Forsyth { 35*37da2899SCharles.Forsyth 0, 36*37da2899SCharles.Forsyth 1, 37*37da2899SCharles.Forsyth 2, 38*37da2899SCharles.Forsyth 3, 39*37da2899SCharles.Forsyth 4, 40*37da2899SCharles.Forsyth 5, 41*37da2899SCharles.Forsyth 6, 42*37da2899SCharles.Forsyth 7, 43*37da2899SCharles.Forsyth 8, 44*37da2899SCharles.Forsyth 9, 45*37da2899SCharles.Forsyth 10, 46*37da2899SCharles.Forsyth 11, 47*37da2899SCharles.Forsyth 12, 48*37da2899SCharles.Forsyth 13, 49*37da2899SCharles.Forsyth 14, 50*37da2899SCharles.Forsyth 15, 51*37da2899SCharles.Forsyth 16, 52*37da2899SCharles.Forsyth 17, 53*37da2899SCharles.Forsyth 18, 54*37da2899SCharles.Forsyth 19, 55*37da2899SCharles.Forsyth 20, 56*37da2899SCharles.Forsyth 21, 57*37da2899SCharles.Forsyth 22, 58*37da2899SCharles.Forsyth 23, 59*37da2899SCharles.Forsyth 24, 60*37da2899SCharles.Forsyth 25, 61*37da2899SCharles.Forsyth 26, 62*37da2899SCharles.Forsyth 27, 63*37da2899SCharles.Forsyth 28, 64*37da2899SCharles.Forsyth 29, 65*37da2899SCharles.Forsyth 30, 66*37da2899SCharles.Forsyth 31, 67*37da2899SCharles.Forsyth 32, 68*37da2899SCharles.Forsyth 33, 69*37da2899SCharles.Forsyth 34, 70*37da2899SCharles.Forsyth 35, 71*37da2899SCharles.Forsyth 36, 72*37da2899SCharles.Forsyth 37, 73*37da2899SCharles.Forsyth 38, 74*37da2899SCharles.Forsyth 39, 75*37da2899SCharles.Forsyth 40, 76*37da2899SCharles.Forsyth 41, 77*37da2899SCharles.Forsyth 42, 78*37da2899SCharles.Forsyth 43, 79*37da2899SCharles.Forsyth 44, 80*37da2899SCharles.Forsyth 45, 81*37da2899SCharles.Forsyth 46, 82*37da2899SCharles.Forsyth 47, 83*37da2899SCharles.Forsyth 48, 84*37da2899SCharles.Forsyth 49, 85*37da2899SCharles.Forsyth 50, 86*37da2899SCharles.Forsyth 51, 87*37da2899SCharles.Forsyth 52, 88*37da2899SCharles.Forsyth 53, 89*37da2899SCharles.Forsyth 54, 90*37da2899SCharles.Forsyth 55, 91*37da2899SCharles.Forsyth 56, 92*37da2899SCharles.Forsyth 57, 93*37da2899SCharles.Forsyth 58, 94*37da2899SCharles.Forsyth 59, 95*37da2899SCharles.Forsyth 60, 96*37da2899SCharles.Forsyth 61, 97*37da2899SCharles.Forsyth 62, 98*37da2899SCharles.Forsyth 63, 99*37da2899SCharles.Forsyth 64, 100*37da2899SCharles.Forsyth 65, 101*37da2899SCharles.Forsyth 66, 102*37da2899SCharles.Forsyth 67, 103*37da2899SCharles.Forsyth 68, 104*37da2899SCharles.Forsyth 69, 105*37da2899SCharles.Forsyth 70, 106*37da2899SCharles.Forsyth 71, 107*37da2899SCharles.Forsyth 72, 108*37da2899SCharles.Forsyth 73, 109*37da2899SCharles.Forsyth 74, 110*37da2899SCharles.Forsyth 75, 111*37da2899SCharles.Forsyth 76, 112*37da2899SCharles.Forsyth 77, 113*37da2899SCharles.Forsyth 78, 114*37da2899SCharles.Forsyth 79, 115*37da2899SCharles.Forsyth 80, 116*37da2899SCharles.Forsyth 81, 117*37da2899SCharles.Forsyth 82, 118*37da2899SCharles.Forsyth 83, 119*37da2899SCharles.Forsyth 84, 120*37da2899SCharles.Forsyth 85, 121*37da2899SCharles.Forsyth 86, 122*37da2899SCharles.Forsyth 87, 123*37da2899SCharles.Forsyth 88, 124*37da2899SCharles.Forsyth 89, 125*37da2899SCharles.Forsyth 90, 126*37da2899SCharles.Forsyth 91, 127*37da2899SCharles.Forsyth 92, 128*37da2899SCharles.Forsyth 93, 129*37da2899SCharles.Forsyth 94, 130*37da2899SCharles.Forsyth 95, 131*37da2899SCharles.Forsyth 96, 132*37da2899SCharles.Forsyth 97, 133*37da2899SCharles.Forsyth 98, 134*37da2899SCharles.Forsyth 99, 135*37da2899SCharles.Forsyth 100, 136*37da2899SCharles.Forsyth 101, 137*37da2899SCharles.Forsyth 102, 138*37da2899SCharles.Forsyth 103, 139*37da2899SCharles.Forsyth 104, 140*37da2899SCharles.Forsyth 105, 141*37da2899SCharles.Forsyth 106, 142*37da2899SCharles.Forsyth 107, 143*37da2899SCharles.Forsyth 108, 144*37da2899SCharles.Forsyth 109, 145*37da2899SCharles.Forsyth 110, 146*37da2899SCharles.Forsyth 111, 147*37da2899SCharles.Forsyth 112, 148*37da2899SCharles.Forsyth 113, 149*37da2899SCharles.Forsyth 114, 150*37da2899SCharles.Forsyth 115, 151*37da2899SCharles.Forsyth 116, 152*37da2899SCharles.Forsyth 117, 153*37da2899SCharles.Forsyth 118, 154*37da2899SCharles.Forsyth 119, 155*37da2899SCharles.Forsyth 120, 156*37da2899SCharles.Forsyth 121, 157*37da2899SCharles.Forsyth 122, 158*37da2899SCharles.Forsyth 123, 159*37da2899SCharles.Forsyth 124, 160*37da2899SCharles.Forsyth 125, 161*37da2899SCharles.Forsyth 126, 162*37da2899SCharles.Forsyth 127, 163*37da2899SCharles.Forsyth 128, 164*37da2899SCharles.Forsyth 129, 165*37da2899SCharles.Forsyth 130, 166*37da2899SCharles.Forsyth 131, 167*37da2899SCharles.Forsyth 132, 168*37da2899SCharles.Forsyth 133, 169*37da2899SCharles.Forsyth 134, 170*37da2899SCharles.Forsyth 135, 171*37da2899SCharles.Forsyth 136, 172*37da2899SCharles.Forsyth 137, 173*37da2899SCharles.Forsyth 138, 174*37da2899SCharles.Forsyth 139, 175*37da2899SCharles.Forsyth 140, 176*37da2899SCharles.Forsyth 141, 177*37da2899SCharles.Forsyth 142, 178*37da2899SCharles.Forsyth 143, 179*37da2899SCharles.Forsyth 144, 180*37da2899SCharles.Forsyth 145, 181*37da2899SCharles.Forsyth 146, 182*37da2899SCharles.Forsyth 147, 183*37da2899SCharles.Forsyth 148, 184*37da2899SCharles.Forsyth 149, 185*37da2899SCharles.Forsyth 150, 186*37da2899SCharles.Forsyth 151, 187*37da2899SCharles.Forsyth 152, 188*37da2899SCharles.Forsyth 153, 189*37da2899SCharles.Forsyth 154, 190*37da2899SCharles.Forsyth 155, 191*37da2899SCharles.Forsyth 156, 192*37da2899SCharles.Forsyth 157, 193*37da2899SCharles.Forsyth 158, 194*37da2899SCharles.Forsyth 159, 195*37da2899SCharles.Forsyth 160, 196*37da2899SCharles.Forsyth 161, 197*37da2899SCharles.Forsyth 162, 198*37da2899SCharles.Forsyth 163, 199*37da2899SCharles.Forsyth 164, 200*37da2899SCharles.Forsyth 165, 201*37da2899SCharles.Forsyth 166, 202*37da2899SCharles.Forsyth 167, 203*37da2899SCharles.Forsyth 168, 204*37da2899SCharles.Forsyth 169, 205*37da2899SCharles.Forsyth 170, 206*37da2899SCharles.Forsyth 171, 207*37da2899SCharles.Forsyth 172, 208*37da2899SCharles.Forsyth 173, 209*37da2899SCharles.Forsyth 174, 210*37da2899SCharles.Forsyth 175, 211*37da2899SCharles.Forsyth 176, 212*37da2899SCharles.Forsyth 177, 213*37da2899SCharles.Forsyth 178, 214*37da2899SCharles.Forsyth 179, 215*37da2899SCharles.Forsyth 180, 216*37da2899SCharles.Forsyth 181, 217*37da2899SCharles.Forsyth 182, 218*37da2899SCharles.Forsyth 183, 219*37da2899SCharles.Forsyth 184, 220*37da2899SCharles.Forsyth 185, 221*37da2899SCharles.Forsyth 186, 222*37da2899SCharles.Forsyth 187, 223*37da2899SCharles.Forsyth 188, 224*37da2899SCharles.Forsyth 189, 225*37da2899SCharles.Forsyth 190, 226*37da2899SCharles.Forsyth 191, 227*37da2899SCharles.Forsyth 192, 228*37da2899SCharles.Forsyth 193, 229*37da2899SCharles.Forsyth 194, 230*37da2899SCharles.Forsyth 195, 231*37da2899SCharles.Forsyth 196, 232*37da2899SCharles.Forsyth 197, 233*37da2899SCharles.Forsyth 198, 234*37da2899SCharles.Forsyth 199, 235*37da2899SCharles.Forsyth 200, 236*37da2899SCharles.Forsyth 201, 237*37da2899SCharles.Forsyth 202, 238*37da2899SCharles.Forsyth 203, 239*37da2899SCharles.Forsyth 204, 240*37da2899SCharles.Forsyth 205, 241*37da2899SCharles.Forsyth 206, 242*37da2899SCharles.Forsyth 207, 243*37da2899SCharles.Forsyth 208, 244*37da2899SCharles.Forsyth 209, 245*37da2899SCharles.Forsyth 210, 246*37da2899SCharles.Forsyth 211, 247*37da2899SCharles.Forsyth 212, 248*37da2899SCharles.Forsyth 213, 249*37da2899SCharles.Forsyth 214, 250*37da2899SCharles.Forsyth 215, 251*37da2899SCharles.Forsyth 216, 252*37da2899SCharles.Forsyth 217, 253*37da2899SCharles.Forsyth 218, 254*37da2899SCharles.Forsyth 219, 255*37da2899SCharles.Forsyth 220, 256*37da2899SCharles.Forsyth 221, 257*37da2899SCharles.Forsyth 222, 258*37da2899SCharles.Forsyth 223, 259*37da2899SCharles.Forsyth 224, 260*37da2899SCharles.Forsyth 225, 261*37da2899SCharles.Forsyth 226, 262*37da2899SCharles.Forsyth 227, 263*37da2899SCharles.Forsyth 228 264*37da2899SCharles.Forsyth }; 265*37da2899SCharles.Forsyth 266*37da2899SCharles.Forsyth static const FT_UShort cff_expert_charset[166] = 267*37da2899SCharles.Forsyth { 268*37da2899SCharles.Forsyth 0, 269*37da2899SCharles.Forsyth 1, 270*37da2899SCharles.Forsyth 229, 271*37da2899SCharles.Forsyth 230, 272*37da2899SCharles.Forsyth 231, 273*37da2899SCharles.Forsyth 232, 274*37da2899SCharles.Forsyth 233, 275*37da2899SCharles.Forsyth 234, 276*37da2899SCharles.Forsyth 235, 277*37da2899SCharles.Forsyth 236, 278*37da2899SCharles.Forsyth 237, 279*37da2899SCharles.Forsyth 238, 280*37da2899SCharles.Forsyth 13, 281*37da2899SCharles.Forsyth 14, 282*37da2899SCharles.Forsyth 15, 283*37da2899SCharles.Forsyth 99, 284*37da2899SCharles.Forsyth 239, 285*37da2899SCharles.Forsyth 240, 286*37da2899SCharles.Forsyth 241, 287*37da2899SCharles.Forsyth 242, 288*37da2899SCharles.Forsyth 243, 289*37da2899SCharles.Forsyth 244, 290*37da2899SCharles.Forsyth 245, 291*37da2899SCharles.Forsyth 246, 292*37da2899SCharles.Forsyth 247, 293*37da2899SCharles.Forsyth 248, 294*37da2899SCharles.Forsyth 27, 295*37da2899SCharles.Forsyth 28, 296*37da2899SCharles.Forsyth 249, 297*37da2899SCharles.Forsyth 250, 298*37da2899SCharles.Forsyth 251, 299*37da2899SCharles.Forsyth 252, 300*37da2899SCharles.Forsyth 253, 301*37da2899SCharles.Forsyth 254, 302*37da2899SCharles.Forsyth 255, 303*37da2899SCharles.Forsyth 256, 304*37da2899SCharles.Forsyth 257, 305*37da2899SCharles.Forsyth 258, 306*37da2899SCharles.Forsyth 259, 307*37da2899SCharles.Forsyth 260, 308*37da2899SCharles.Forsyth 261, 309*37da2899SCharles.Forsyth 262, 310*37da2899SCharles.Forsyth 263, 311*37da2899SCharles.Forsyth 264, 312*37da2899SCharles.Forsyth 265, 313*37da2899SCharles.Forsyth 266, 314*37da2899SCharles.Forsyth 109, 315*37da2899SCharles.Forsyth 110, 316*37da2899SCharles.Forsyth 267, 317*37da2899SCharles.Forsyth 268, 318*37da2899SCharles.Forsyth 269, 319*37da2899SCharles.Forsyth 270, 320*37da2899SCharles.Forsyth 271, 321*37da2899SCharles.Forsyth 272, 322*37da2899SCharles.Forsyth 273, 323*37da2899SCharles.Forsyth 274, 324*37da2899SCharles.Forsyth 275, 325*37da2899SCharles.Forsyth 276, 326*37da2899SCharles.Forsyth 277, 327*37da2899SCharles.Forsyth 278, 328*37da2899SCharles.Forsyth 279, 329*37da2899SCharles.Forsyth 280, 330*37da2899SCharles.Forsyth 281, 331*37da2899SCharles.Forsyth 282, 332*37da2899SCharles.Forsyth 283, 333*37da2899SCharles.Forsyth 284, 334*37da2899SCharles.Forsyth 285, 335*37da2899SCharles.Forsyth 286, 336*37da2899SCharles.Forsyth 287, 337*37da2899SCharles.Forsyth 288, 338*37da2899SCharles.Forsyth 289, 339*37da2899SCharles.Forsyth 290, 340*37da2899SCharles.Forsyth 291, 341*37da2899SCharles.Forsyth 292, 342*37da2899SCharles.Forsyth 293, 343*37da2899SCharles.Forsyth 294, 344*37da2899SCharles.Forsyth 295, 345*37da2899SCharles.Forsyth 296, 346*37da2899SCharles.Forsyth 297, 347*37da2899SCharles.Forsyth 298, 348*37da2899SCharles.Forsyth 299, 349*37da2899SCharles.Forsyth 300, 350*37da2899SCharles.Forsyth 301, 351*37da2899SCharles.Forsyth 302, 352*37da2899SCharles.Forsyth 303, 353*37da2899SCharles.Forsyth 304, 354*37da2899SCharles.Forsyth 305, 355*37da2899SCharles.Forsyth 306, 356*37da2899SCharles.Forsyth 307, 357*37da2899SCharles.Forsyth 308, 358*37da2899SCharles.Forsyth 309, 359*37da2899SCharles.Forsyth 310, 360*37da2899SCharles.Forsyth 311, 361*37da2899SCharles.Forsyth 312, 362*37da2899SCharles.Forsyth 313, 363*37da2899SCharles.Forsyth 314, 364*37da2899SCharles.Forsyth 315, 365*37da2899SCharles.Forsyth 316, 366*37da2899SCharles.Forsyth 317, 367*37da2899SCharles.Forsyth 318, 368*37da2899SCharles.Forsyth 158, 369*37da2899SCharles.Forsyth 155, 370*37da2899SCharles.Forsyth 163, 371*37da2899SCharles.Forsyth 319, 372*37da2899SCharles.Forsyth 320, 373*37da2899SCharles.Forsyth 321, 374*37da2899SCharles.Forsyth 322, 375*37da2899SCharles.Forsyth 323, 376*37da2899SCharles.Forsyth 324, 377*37da2899SCharles.Forsyth 325, 378*37da2899SCharles.Forsyth 326, 379*37da2899SCharles.Forsyth 150, 380*37da2899SCharles.Forsyth 164, 381*37da2899SCharles.Forsyth 169, 382*37da2899SCharles.Forsyth 327, 383*37da2899SCharles.Forsyth 328, 384*37da2899SCharles.Forsyth 329, 385*37da2899SCharles.Forsyth 330, 386*37da2899SCharles.Forsyth 331, 387*37da2899SCharles.Forsyth 332, 388*37da2899SCharles.Forsyth 333, 389*37da2899SCharles.Forsyth 334, 390*37da2899SCharles.Forsyth 335, 391*37da2899SCharles.Forsyth 336, 392*37da2899SCharles.Forsyth 337, 393*37da2899SCharles.Forsyth 338, 394*37da2899SCharles.Forsyth 339, 395*37da2899SCharles.Forsyth 340, 396*37da2899SCharles.Forsyth 341, 397*37da2899SCharles.Forsyth 342, 398*37da2899SCharles.Forsyth 343, 399*37da2899SCharles.Forsyth 344, 400*37da2899SCharles.Forsyth 345, 401*37da2899SCharles.Forsyth 346, 402*37da2899SCharles.Forsyth 347, 403*37da2899SCharles.Forsyth 348, 404*37da2899SCharles.Forsyth 349, 405*37da2899SCharles.Forsyth 350, 406*37da2899SCharles.Forsyth 351, 407*37da2899SCharles.Forsyth 352, 408*37da2899SCharles.Forsyth 353, 409*37da2899SCharles.Forsyth 354, 410*37da2899SCharles.Forsyth 355, 411*37da2899SCharles.Forsyth 356, 412*37da2899SCharles.Forsyth 357, 413*37da2899SCharles.Forsyth 358, 414*37da2899SCharles.Forsyth 359, 415*37da2899SCharles.Forsyth 360, 416*37da2899SCharles.Forsyth 361, 417*37da2899SCharles.Forsyth 362, 418*37da2899SCharles.Forsyth 363, 419*37da2899SCharles.Forsyth 364, 420*37da2899SCharles.Forsyth 365, 421*37da2899SCharles.Forsyth 366, 422*37da2899SCharles.Forsyth 367, 423*37da2899SCharles.Forsyth 368, 424*37da2899SCharles.Forsyth 369, 425*37da2899SCharles.Forsyth 370, 426*37da2899SCharles.Forsyth 371, 427*37da2899SCharles.Forsyth 372, 428*37da2899SCharles.Forsyth 373, 429*37da2899SCharles.Forsyth 374, 430*37da2899SCharles.Forsyth 375, 431*37da2899SCharles.Forsyth 376, 432*37da2899SCharles.Forsyth 377, 433*37da2899SCharles.Forsyth 378 434*37da2899SCharles.Forsyth }; 435*37da2899SCharles.Forsyth 436*37da2899SCharles.Forsyth static const FT_UShort cff_expertsubset_charset[87] = 437*37da2899SCharles.Forsyth { 438*37da2899SCharles.Forsyth 0, 439*37da2899SCharles.Forsyth 1, 440*37da2899SCharles.Forsyth 231, 441*37da2899SCharles.Forsyth 232, 442*37da2899SCharles.Forsyth 235, 443*37da2899SCharles.Forsyth 236, 444*37da2899SCharles.Forsyth 237, 445*37da2899SCharles.Forsyth 238, 446*37da2899SCharles.Forsyth 13, 447*37da2899SCharles.Forsyth 14, 448*37da2899SCharles.Forsyth 15, 449*37da2899SCharles.Forsyth 99, 450*37da2899SCharles.Forsyth 239, 451*37da2899SCharles.Forsyth 240, 452*37da2899SCharles.Forsyth 241, 453*37da2899SCharles.Forsyth 242, 454*37da2899SCharles.Forsyth 243, 455*37da2899SCharles.Forsyth 244, 456*37da2899SCharles.Forsyth 245, 457*37da2899SCharles.Forsyth 246, 458*37da2899SCharles.Forsyth 247, 459*37da2899SCharles.Forsyth 248, 460*37da2899SCharles.Forsyth 27, 461*37da2899SCharles.Forsyth 28, 462*37da2899SCharles.Forsyth 249, 463*37da2899SCharles.Forsyth 250, 464*37da2899SCharles.Forsyth 251, 465*37da2899SCharles.Forsyth 253, 466*37da2899SCharles.Forsyth 254, 467*37da2899SCharles.Forsyth 255, 468*37da2899SCharles.Forsyth 256, 469*37da2899SCharles.Forsyth 257, 470*37da2899SCharles.Forsyth 258, 471*37da2899SCharles.Forsyth 259, 472*37da2899SCharles.Forsyth 260, 473*37da2899SCharles.Forsyth 261, 474*37da2899SCharles.Forsyth 262, 475*37da2899SCharles.Forsyth 263, 476*37da2899SCharles.Forsyth 264, 477*37da2899SCharles.Forsyth 265, 478*37da2899SCharles.Forsyth 266, 479*37da2899SCharles.Forsyth 109, 480*37da2899SCharles.Forsyth 110, 481*37da2899SCharles.Forsyth 267, 482*37da2899SCharles.Forsyth 268, 483*37da2899SCharles.Forsyth 269, 484*37da2899SCharles.Forsyth 270, 485*37da2899SCharles.Forsyth 272, 486*37da2899SCharles.Forsyth 300, 487*37da2899SCharles.Forsyth 301, 488*37da2899SCharles.Forsyth 302, 489*37da2899SCharles.Forsyth 305, 490*37da2899SCharles.Forsyth 314, 491*37da2899SCharles.Forsyth 315, 492*37da2899SCharles.Forsyth 158, 493*37da2899SCharles.Forsyth 155, 494*37da2899SCharles.Forsyth 163, 495*37da2899SCharles.Forsyth 320, 496*37da2899SCharles.Forsyth 321, 497*37da2899SCharles.Forsyth 322, 498*37da2899SCharles.Forsyth 323, 499*37da2899SCharles.Forsyth 324, 500*37da2899SCharles.Forsyth 325, 501*37da2899SCharles.Forsyth 326, 502*37da2899SCharles.Forsyth 150, 503*37da2899SCharles.Forsyth 164, 504*37da2899SCharles.Forsyth 169, 505*37da2899SCharles.Forsyth 327, 506*37da2899SCharles.Forsyth 328, 507*37da2899SCharles.Forsyth 329, 508*37da2899SCharles.Forsyth 330, 509*37da2899SCharles.Forsyth 331, 510*37da2899SCharles.Forsyth 332, 511*37da2899SCharles.Forsyth 333, 512*37da2899SCharles.Forsyth 334, 513*37da2899SCharles.Forsyth 335, 514*37da2899SCharles.Forsyth 336, 515*37da2899SCharles.Forsyth 337, 516*37da2899SCharles.Forsyth 338, 517*37da2899SCharles.Forsyth 339, 518*37da2899SCharles.Forsyth 340, 519*37da2899SCharles.Forsyth 341, 520*37da2899SCharles.Forsyth 342, 521*37da2899SCharles.Forsyth 343, 522*37da2899SCharles.Forsyth 344, 523*37da2899SCharles.Forsyth 345, 524*37da2899SCharles.Forsyth 346 525*37da2899SCharles.Forsyth }; 526*37da2899SCharles.Forsyth 527*37da2899SCharles.Forsyth static const FT_UShort cff_standard_encoding[256] = 528*37da2899SCharles.Forsyth { 529*37da2899SCharles.Forsyth 0, 530*37da2899SCharles.Forsyth 0, 531*37da2899SCharles.Forsyth 0, 532*37da2899SCharles.Forsyth 0, 533*37da2899SCharles.Forsyth 0, 534*37da2899SCharles.Forsyth 0, 535*37da2899SCharles.Forsyth 0, 536*37da2899SCharles.Forsyth 0, 537*37da2899SCharles.Forsyth 0, 538*37da2899SCharles.Forsyth 0, 539*37da2899SCharles.Forsyth 0, 540*37da2899SCharles.Forsyth 0, 541*37da2899SCharles.Forsyth 0, 542*37da2899SCharles.Forsyth 0, 543*37da2899SCharles.Forsyth 0, 544*37da2899SCharles.Forsyth 0, 545*37da2899SCharles.Forsyth 0, 546*37da2899SCharles.Forsyth 0, 547*37da2899SCharles.Forsyth 0, 548*37da2899SCharles.Forsyth 0, 549*37da2899SCharles.Forsyth 0, 550*37da2899SCharles.Forsyth 0, 551*37da2899SCharles.Forsyth 0, 552*37da2899SCharles.Forsyth 0, 553*37da2899SCharles.Forsyth 0, 554*37da2899SCharles.Forsyth 0, 555*37da2899SCharles.Forsyth 0, 556*37da2899SCharles.Forsyth 0, 557*37da2899SCharles.Forsyth 0, 558*37da2899SCharles.Forsyth 0, 559*37da2899SCharles.Forsyth 0, 560*37da2899SCharles.Forsyth 0, 561*37da2899SCharles.Forsyth 1, 562*37da2899SCharles.Forsyth 2, 563*37da2899SCharles.Forsyth 3, 564*37da2899SCharles.Forsyth 4, 565*37da2899SCharles.Forsyth 5, 566*37da2899SCharles.Forsyth 6, 567*37da2899SCharles.Forsyth 7, 568*37da2899SCharles.Forsyth 8, 569*37da2899SCharles.Forsyth 9, 570*37da2899SCharles.Forsyth 10, 571*37da2899SCharles.Forsyth 11, 572*37da2899SCharles.Forsyth 12, 573*37da2899SCharles.Forsyth 13, 574*37da2899SCharles.Forsyth 14, 575*37da2899SCharles.Forsyth 15, 576*37da2899SCharles.Forsyth 16, 577*37da2899SCharles.Forsyth 17, 578*37da2899SCharles.Forsyth 18, 579*37da2899SCharles.Forsyth 19, 580*37da2899SCharles.Forsyth 20, 581*37da2899SCharles.Forsyth 21, 582*37da2899SCharles.Forsyth 22, 583*37da2899SCharles.Forsyth 23, 584*37da2899SCharles.Forsyth 24, 585*37da2899SCharles.Forsyth 25, 586*37da2899SCharles.Forsyth 26, 587*37da2899SCharles.Forsyth 27, 588*37da2899SCharles.Forsyth 28, 589*37da2899SCharles.Forsyth 29, 590*37da2899SCharles.Forsyth 30, 591*37da2899SCharles.Forsyth 31, 592*37da2899SCharles.Forsyth 32, 593*37da2899SCharles.Forsyth 33, 594*37da2899SCharles.Forsyth 34, 595*37da2899SCharles.Forsyth 35, 596*37da2899SCharles.Forsyth 36, 597*37da2899SCharles.Forsyth 37, 598*37da2899SCharles.Forsyth 38, 599*37da2899SCharles.Forsyth 39, 600*37da2899SCharles.Forsyth 40, 601*37da2899SCharles.Forsyth 41, 602*37da2899SCharles.Forsyth 42, 603*37da2899SCharles.Forsyth 43, 604*37da2899SCharles.Forsyth 44, 605*37da2899SCharles.Forsyth 45, 606*37da2899SCharles.Forsyth 46, 607*37da2899SCharles.Forsyth 47, 608*37da2899SCharles.Forsyth 48, 609*37da2899SCharles.Forsyth 49, 610*37da2899SCharles.Forsyth 50, 611*37da2899SCharles.Forsyth 51, 612*37da2899SCharles.Forsyth 52, 613*37da2899SCharles.Forsyth 53, 614*37da2899SCharles.Forsyth 54, 615*37da2899SCharles.Forsyth 55, 616*37da2899SCharles.Forsyth 56, 617*37da2899SCharles.Forsyth 57, 618*37da2899SCharles.Forsyth 58, 619*37da2899SCharles.Forsyth 59, 620*37da2899SCharles.Forsyth 60, 621*37da2899SCharles.Forsyth 61, 622*37da2899SCharles.Forsyth 62, 623*37da2899SCharles.Forsyth 63, 624*37da2899SCharles.Forsyth 64, 625*37da2899SCharles.Forsyth 65, 626*37da2899SCharles.Forsyth 66, 627*37da2899SCharles.Forsyth 67, 628*37da2899SCharles.Forsyth 68, 629*37da2899SCharles.Forsyth 69, 630*37da2899SCharles.Forsyth 70, 631*37da2899SCharles.Forsyth 71, 632*37da2899SCharles.Forsyth 72, 633*37da2899SCharles.Forsyth 73, 634*37da2899SCharles.Forsyth 74, 635*37da2899SCharles.Forsyth 75, 636*37da2899SCharles.Forsyth 76, 637*37da2899SCharles.Forsyth 77, 638*37da2899SCharles.Forsyth 78, 639*37da2899SCharles.Forsyth 79, 640*37da2899SCharles.Forsyth 80, 641*37da2899SCharles.Forsyth 81, 642*37da2899SCharles.Forsyth 82, 643*37da2899SCharles.Forsyth 83, 644*37da2899SCharles.Forsyth 84, 645*37da2899SCharles.Forsyth 85, 646*37da2899SCharles.Forsyth 86, 647*37da2899SCharles.Forsyth 87, 648*37da2899SCharles.Forsyth 88, 649*37da2899SCharles.Forsyth 89, 650*37da2899SCharles.Forsyth 90, 651*37da2899SCharles.Forsyth 91, 652*37da2899SCharles.Forsyth 92, 653*37da2899SCharles.Forsyth 93, 654*37da2899SCharles.Forsyth 94, 655*37da2899SCharles.Forsyth 95, 656*37da2899SCharles.Forsyth 0, 657*37da2899SCharles.Forsyth 0, 658*37da2899SCharles.Forsyth 0, 659*37da2899SCharles.Forsyth 0, 660*37da2899SCharles.Forsyth 0, 661*37da2899SCharles.Forsyth 0, 662*37da2899SCharles.Forsyth 0, 663*37da2899SCharles.Forsyth 0, 664*37da2899SCharles.Forsyth 0, 665*37da2899SCharles.Forsyth 0, 666*37da2899SCharles.Forsyth 0, 667*37da2899SCharles.Forsyth 0, 668*37da2899SCharles.Forsyth 0, 669*37da2899SCharles.Forsyth 0, 670*37da2899SCharles.Forsyth 0, 671*37da2899SCharles.Forsyth 0, 672*37da2899SCharles.Forsyth 0, 673*37da2899SCharles.Forsyth 0, 674*37da2899SCharles.Forsyth 0, 675*37da2899SCharles.Forsyth 0, 676*37da2899SCharles.Forsyth 0, 677*37da2899SCharles.Forsyth 0, 678*37da2899SCharles.Forsyth 0, 679*37da2899SCharles.Forsyth 0, 680*37da2899SCharles.Forsyth 0, 681*37da2899SCharles.Forsyth 0, 682*37da2899SCharles.Forsyth 0, 683*37da2899SCharles.Forsyth 0, 684*37da2899SCharles.Forsyth 0, 685*37da2899SCharles.Forsyth 0, 686*37da2899SCharles.Forsyth 0, 687*37da2899SCharles.Forsyth 0, 688*37da2899SCharles.Forsyth 0, 689*37da2899SCharles.Forsyth 0, 690*37da2899SCharles.Forsyth 96, 691*37da2899SCharles.Forsyth 97, 692*37da2899SCharles.Forsyth 98, 693*37da2899SCharles.Forsyth 99, 694*37da2899SCharles.Forsyth 100, 695*37da2899SCharles.Forsyth 101, 696*37da2899SCharles.Forsyth 102, 697*37da2899SCharles.Forsyth 103, 698*37da2899SCharles.Forsyth 104, 699*37da2899SCharles.Forsyth 105, 700*37da2899SCharles.Forsyth 106, 701*37da2899SCharles.Forsyth 107, 702*37da2899SCharles.Forsyth 108, 703*37da2899SCharles.Forsyth 109, 704*37da2899SCharles.Forsyth 110, 705*37da2899SCharles.Forsyth 0, 706*37da2899SCharles.Forsyth 111, 707*37da2899SCharles.Forsyth 112, 708*37da2899SCharles.Forsyth 113, 709*37da2899SCharles.Forsyth 114, 710*37da2899SCharles.Forsyth 0, 711*37da2899SCharles.Forsyth 115, 712*37da2899SCharles.Forsyth 116, 713*37da2899SCharles.Forsyth 117, 714*37da2899SCharles.Forsyth 118, 715*37da2899SCharles.Forsyth 119, 716*37da2899SCharles.Forsyth 120, 717*37da2899SCharles.Forsyth 121, 718*37da2899SCharles.Forsyth 122, 719*37da2899SCharles.Forsyth 0, 720*37da2899SCharles.Forsyth 123, 721*37da2899SCharles.Forsyth 0, 722*37da2899SCharles.Forsyth 124, 723*37da2899SCharles.Forsyth 125, 724*37da2899SCharles.Forsyth 126, 725*37da2899SCharles.Forsyth 127, 726*37da2899SCharles.Forsyth 128, 727*37da2899SCharles.Forsyth 129, 728*37da2899SCharles.Forsyth 130, 729*37da2899SCharles.Forsyth 131, 730*37da2899SCharles.Forsyth 0, 731*37da2899SCharles.Forsyth 132, 732*37da2899SCharles.Forsyth 133, 733*37da2899SCharles.Forsyth 0, 734*37da2899SCharles.Forsyth 134, 735*37da2899SCharles.Forsyth 135, 736*37da2899SCharles.Forsyth 136, 737*37da2899SCharles.Forsyth 137, 738*37da2899SCharles.Forsyth 0, 739*37da2899SCharles.Forsyth 0, 740*37da2899SCharles.Forsyth 0, 741*37da2899SCharles.Forsyth 0, 742*37da2899SCharles.Forsyth 0, 743*37da2899SCharles.Forsyth 0, 744*37da2899SCharles.Forsyth 0, 745*37da2899SCharles.Forsyth 0, 746*37da2899SCharles.Forsyth 0, 747*37da2899SCharles.Forsyth 0, 748*37da2899SCharles.Forsyth 0, 749*37da2899SCharles.Forsyth 0, 750*37da2899SCharles.Forsyth 0, 751*37da2899SCharles.Forsyth 0, 752*37da2899SCharles.Forsyth 0, 753*37da2899SCharles.Forsyth 0, 754*37da2899SCharles.Forsyth 138, 755*37da2899SCharles.Forsyth 0, 756*37da2899SCharles.Forsyth 139, 757*37da2899SCharles.Forsyth 0, 758*37da2899SCharles.Forsyth 0, 759*37da2899SCharles.Forsyth 0, 760*37da2899SCharles.Forsyth 0, 761*37da2899SCharles.Forsyth 140, 762*37da2899SCharles.Forsyth 141, 763*37da2899SCharles.Forsyth 142, 764*37da2899SCharles.Forsyth 143, 765*37da2899SCharles.Forsyth 0, 766*37da2899SCharles.Forsyth 0, 767*37da2899SCharles.Forsyth 0, 768*37da2899SCharles.Forsyth 0, 769*37da2899SCharles.Forsyth 0, 770*37da2899SCharles.Forsyth 144, 771*37da2899SCharles.Forsyth 0, 772*37da2899SCharles.Forsyth 0, 773*37da2899SCharles.Forsyth 0, 774*37da2899SCharles.Forsyth 145, 775*37da2899SCharles.Forsyth 0, 776*37da2899SCharles.Forsyth 0, 777*37da2899SCharles.Forsyth 146, 778*37da2899SCharles.Forsyth 147, 779*37da2899SCharles.Forsyth 148, 780*37da2899SCharles.Forsyth 149, 781*37da2899SCharles.Forsyth 0, 782*37da2899SCharles.Forsyth 0, 783*37da2899SCharles.Forsyth 0, 784*37da2899SCharles.Forsyth 0 785*37da2899SCharles.Forsyth }; 786*37da2899SCharles.Forsyth 787*37da2899SCharles.Forsyth static const FT_UShort cff_expert_encoding[256] = 788*37da2899SCharles.Forsyth { 789*37da2899SCharles.Forsyth 0, 790*37da2899SCharles.Forsyth 0, 791*37da2899SCharles.Forsyth 0, 792*37da2899SCharles.Forsyth 0, 793*37da2899SCharles.Forsyth 0, 794*37da2899SCharles.Forsyth 0, 795*37da2899SCharles.Forsyth 0, 796*37da2899SCharles.Forsyth 0, 797*37da2899SCharles.Forsyth 0, 798*37da2899SCharles.Forsyth 0, 799*37da2899SCharles.Forsyth 0, 800*37da2899SCharles.Forsyth 0, 801*37da2899SCharles.Forsyth 0, 802*37da2899SCharles.Forsyth 0, 803*37da2899SCharles.Forsyth 0, 804*37da2899SCharles.Forsyth 0, 805*37da2899SCharles.Forsyth 0, 806*37da2899SCharles.Forsyth 0, 807*37da2899SCharles.Forsyth 0, 808*37da2899SCharles.Forsyth 0, 809*37da2899SCharles.Forsyth 0, 810*37da2899SCharles.Forsyth 0, 811*37da2899SCharles.Forsyth 0, 812*37da2899SCharles.Forsyth 0, 813*37da2899SCharles.Forsyth 0, 814*37da2899SCharles.Forsyth 0, 815*37da2899SCharles.Forsyth 0, 816*37da2899SCharles.Forsyth 0, 817*37da2899SCharles.Forsyth 0, 818*37da2899SCharles.Forsyth 0, 819*37da2899SCharles.Forsyth 0, 820*37da2899SCharles.Forsyth 0, 821*37da2899SCharles.Forsyth 1, 822*37da2899SCharles.Forsyth 229, 823*37da2899SCharles.Forsyth 230, 824*37da2899SCharles.Forsyth 0, 825*37da2899SCharles.Forsyth 231, 826*37da2899SCharles.Forsyth 232, 827*37da2899SCharles.Forsyth 233, 828*37da2899SCharles.Forsyth 234, 829*37da2899SCharles.Forsyth 235, 830*37da2899SCharles.Forsyth 236, 831*37da2899SCharles.Forsyth 237, 832*37da2899SCharles.Forsyth 238, 833*37da2899SCharles.Forsyth 13, 834*37da2899SCharles.Forsyth 14, 835*37da2899SCharles.Forsyth 15, 836*37da2899SCharles.Forsyth 99, 837*37da2899SCharles.Forsyth 239, 838*37da2899SCharles.Forsyth 240, 839*37da2899SCharles.Forsyth 241, 840*37da2899SCharles.Forsyth 242, 841*37da2899SCharles.Forsyth 243, 842*37da2899SCharles.Forsyth 244, 843*37da2899SCharles.Forsyth 245, 844*37da2899SCharles.Forsyth 246, 845*37da2899SCharles.Forsyth 247, 846*37da2899SCharles.Forsyth 248, 847*37da2899SCharles.Forsyth 27, 848*37da2899SCharles.Forsyth 28, 849*37da2899SCharles.Forsyth 249, 850*37da2899SCharles.Forsyth 250, 851*37da2899SCharles.Forsyth 251, 852*37da2899SCharles.Forsyth 252, 853*37da2899SCharles.Forsyth 0, 854*37da2899SCharles.Forsyth 253, 855*37da2899SCharles.Forsyth 254, 856*37da2899SCharles.Forsyth 255, 857*37da2899SCharles.Forsyth 256, 858*37da2899SCharles.Forsyth 257, 859*37da2899SCharles.Forsyth 0, 860*37da2899SCharles.Forsyth 0, 861*37da2899SCharles.Forsyth 0, 862*37da2899SCharles.Forsyth 258, 863*37da2899SCharles.Forsyth 0, 864*37da2899SCharles.Forsyth 0, 865*37da2899SCharles.Forsyth 259, 866*37da2899SCharles.Forsyth 260, 867*37da2899SCharles.Forsyth 261, 868*37da2899SCharles.Forsyth 262, 869*37da2899SCharles.Forsyth 0, 870*37da2899SCharles.Forsyth 0, 871*37da2899SCharles.Forsyth 263, 872*37da2899SCharles.Forsyth 264, 873*37da2899SCharles.Forsyth 265, 874*37da2899SCharles.Forsyth 0, 875*37da2899SCharles.Forsyth 266, 876*37da2899SCharles.Forsyth 109, 877*37da2899SCharles.Forsyth 110, 878*37da2899SCharles.Forsyth 267, 879*37da2899SCharles.Forsyth 268, 880*37da2899SCharles.Forsyth 269, 881*37da2899SCharles.Forsyth 0, 882*37da2899SCharles.Forsyth 270, 883*37da2899SCharles.Forsyth 271, 884*37da2899SCharles.Forsyth 272, 885*37da2899SCharles.Forsyth 273, 886*37da2899SCharles.Forsyth 274, 887*37da2899SCharles.Forsyth 275, 888*37da2899SCharles.Forsyth 276, 889*37da2899SCharles.Forsyth 277, 890*37da2899SCharles.Forsyth 278, 891*37da2899SCharles.Forsyth 279, 892*37da2899SCharles.Forsyth 280, 893*37da2899SCharles.Forsyth 281, 894*37da2899SCharles.Forsyth 282, 895*37da2899SCharles.Forsyth 283, 896*37da2899SCharles.Forsyth 284, 897*37da2899SCharles.Forsyth 285, 898*37da2899SCharles.Forsyth 286, 899*37da2899SCharles.Forsyth 287, 900*37da2899SCharles.Forsyth 288, 901*37da2899SCharles.Forsyth 289, 902*37da2899SCharles.Forsyth 290, 903*37da2899SCharles.Forsyth 291, 904*37da2899SCharles.Forsyth 292, 905*37da2899SCharles.Forsyth 293, 906*37da2899SCharles.Forsyth 294, 907*37da2899SCharles.Forsyth 295, 908*37da2899SCharles.Forsyth 296, 909*37da2899SCharles.Forsyth 297, 910*37da2899SCharles.Forsyth 298, 911*37da2899SCharles.Forsyth 299, 912*37da2899SCharles.Forsyth 300, 913*37da2899SCharles.Forsyth 301, 914*37da2899SCharles.Forsyth 302, 915*37da2899SCharles.Forsyth 303, 916*37da2899SCharles.Forsyth 0, 917*37da2899SCharles.Forsyth 0, 918*37da2899SCharles.Forsyth 0, 919*37da2899SCharles.Forsyth 0, 920*37da2899SCharles.Forsyth 0, 921*37da2899SCharles.Forsyth 0, 922*37da2899SCharles.Forsyth 0, 923*37da2899SCharles.Forsyth 0, 924*37da2899SCharles.Forsyth 0, 925*37da2899SCharles.Forsyth 0, 926*37da2899SCharles.Forsyth 0, 927*37da2899SCharles.Forsyth 0, 928*37da2899SCharles.Forsyth 0, 929*37da2899SCharles.Forsyth 0, 930*37da2899SCharles.Forsyth 0, 931*37da2899SCharles.Forsyth 0, 932*37da2899SCharles.Forsyth 0, 933*37da2899SCharles.Forsyth 0, 934*37da2899SCharles.Forsyth 0, 935*37da2899SCharles.Forsyth 0, 936*37da2899SCharles.Forsyth 0, 937*37da2899SCharles.Forsyth 0, 938*37da2899SCharles.Forsyth 0, 939*37da2899SCharles.Forsyth 0, 940*37da2899SCharles.Forsyth 0, 941*37da2899SCharles.Forsyth 0, 942*37da2899SCharles.Forsyth 0, 943*37da2899SCharles.Forsyth 0, 944*37da2899SCharles.Forsyth 0, 945*37da2899SCharles.Forsyth 0, 946*37da2899SCharles.Forsyth 0, 947*37da2899SCharles.Forsyth 0, 948*37da2899SCharles.Forsyth 0, 949*37da2899SCharles.Forsyth 0, 950*37da2899SCharles.Forsyth 304, 951*37da2899SCharles.Forsyth 305, 952*37da2899SCharles.Forsyth 306, 953*37da2899SCharles.Forsyth 0, 954*37da2899SCharles.Forsyth 0, 955*37da2899SCharles.Forsyth 307, 956*37da2899SCharles.Forsyth 308, 957*37da2899SCharles.Forsyth 309, 958*37da2899SCharles.Forsyth 310, 959*37da2899SCharles.Forsyth 311, 960*37da2899SCharles.Forsyth 0, 961*37da2899SCharles.Forsyth 312, 962*37da2899SCharles.Forsyth 0, 963*37da2899SCharles.Forsyth 0, 964*37da2899SCharles.Forsyth 312, 965*37da2899SCharles.Forsyth 0, 966*37da2899SCharles.Forsyth 0, 967*37da2899SCharles.Forsyth 314, 968*37da2899SCharles.Forsyth 315, 969*37da2899SCharles.Forsyth 0, 970*37da2899SCharles.Forsyth 0, 971*37da2899SCharles.Forsyth 316, 972*37da2899SCharles.Forsyth 317, 973*37da2899SCharles.Forsyth 318, 974*37da2899SCharles.Forsyth 0, 975*37da2899SCharles.Forsyth 0, 976*37da2899SCharles.Forsyth 0, 977*37da2899SCharles.Forsyth 158, 978*37da2899SCharles.Forsyth 155, 979*37da2899SCharles.Forsyth 163, 980*37da2899SCharles.Forsyth 319, 981*37da2899SCharles.Forsyth 320, 982*37da2899SCharles.Forsyth 321, 983*37da2899SCharles.Forsyth 322, 984*37da2899SCharles.Forsyth 323, 985*37da2899SCharles.Forsyth 324, 986*37da2899SCharles.Forsyth 325, 987*37da2899SCharles.Forsyth 0, 988*37da2899SCharles.Forsyth 0, 989*37da2899SCharles.Forsyth 326, 990*37da2899SCharles.Forsyth 150, 991*37da2899SCharles.Forsyth 164, 992*37da2899SCharles.Forsyth 169, 993*37da2899SCharles.Forsyth 327, 994*37da2899SCharles.Forsyth 328, 995*37da2899SCharles.Forsyth 329, 996*37da2899SCharles.Forsyth 330, 997*37da2899SCharles.Forsyth 331, 998*37da2899SCharles.Forsyth 332, 999*37da2899SCharles.Forsyth 333, 1000*37da2899SCharles.Forsyth 334, 1001*37da2899SCharles.Forsyth 335, 1002*37da2899SCharles.Forsyth 336, 1003*37da2899SCharles.Forsyth 337, 1004*37da2899SCharles.Forsyth 338, 1005*37da2899SCharles.Forsyth 339, 1006*37da2899SCharles.Forsyth 340, 1007*37da2899SCharles.Forsyth 341, 1008*37da2899SCharles.Forsyth 342, 1009*37da2899SCharles.Forsyth 343, 1010*37da2899SCharles.Forsyth 344, 1011*37da2899SCharles.Forsyth 345, 1012*37da2899SCharles.Forsyth 346, 1013*37da2899SCharles.Forsyth 347, 1014*37da2899SCharles.Forsyth 348, 1015*37da2899SCharles.Forsyth 349, 1016*37da2899SCharles.Forsyth 350, 1017*37da2899SCharles.Forsyth 351, 1018*37da2899SCharles.Forsyth 352, 1019*37da2899SCharles.Forsyth 353, 1020*37da2899SCharles.Forsyth 354, 1021*37da2899SCharles.Forsyth 355, 1022*37da2899SCharles.Forsyth 356, 1023*37da2899SCharles.Forsyth 357, 1024*37da2899SCharles.Forsyth 358, 1025*37da2899SCharles.Forsyth 359, 1026*37da2899SCharles.Forsyth 360, 1027*37da2899SCharles.Forsyth 361, 1028*37da2899SCharles.Forsyth 362, 1029*37da2899SCharles.Forsyth 363, 1030*37da2899SCharles.Forsyth 364, 1031*37da2899SCharles.Forsyth 365, 1032*37da2899SCharles.Forsyth 366, 1033*37da2899SCharles.Forsyth 367, 1034*37da2899SCharles.Forsyth 368, 1035*37da2899SCharles.Forsyth 369, 1036*37da2899SCharles.Forsyth 370, 1037*37da2899SCharles.Forsyth 371, 1038*37da2899SCharles.Forsyth 372, 1039*37da2899SCharles.Forsyth 373, 1040*37da2899SCharles.Forsyth 374, 1041*37da2899SCharles.Forsyth 375, 1042*37da2899SCharles.Forsyth 376, 1043*37da2899SCharles.Forsyth 377, 1044*37da2899SCharles.Forsyth 378 1045*37da2899SCharles.Forsyth }; 1046*37da2899SCharles.Forsyth #endif 1047*37da2899SCharles.Forsyth 1048*37da2899SCharles.Forsyth 1049*37da2899SCharles.Forsyth FT_LOCAL_DEF( FT_UShort ) cff_get_standard_encoding(FT_UInt charcode)1050*37da2899SCharles.Forsyth cff_get_standard_encoding( FT_UInt charcode ) 1051*37da2899SCharles.Forsyth { 1052*37da2899SCharles.Forsyth return (FT_UShort)(charcode < 256 ? cff_standard_encoding[charcode] : 0); 1053*37da2899SCharles.Forsyth } 1054*37da2899SCharles.Forsyth 1055*37da2899SCharles.Forsyth 1056*37da2899SCharles.Forsyth /*************************************************************************/ 1057*37da2899SCharles.Forsyth /* */ 1058*37da2899SCharles.Forsyth /* The macro FT_COMPONENT is used in trace mode. It is an implicit */ 1059*37da2899SCharles.Forsyth /* parameter of the FT_TRACE() and FT_ERROR() macros, used to print/log */ 1060*37da2899SCharles.Forsyth /* messages during execution. */ 1061*37da2899SCharles.Forsyth /* */ 1062*37da2899SCharles.Forsyth #undef FT_COMPONENT 1063*37da2899SCharles.Forsyth #define FT_COMPONENT trace_cffload 1064*37da2899SCharles.Forsyth 1065*37da2899SCharles.Forsyth 1066*37da2899SCharles.Forsyth /* read a CFF offset from memory */ 1067*37da2899SCharles.Forsyth static FT_ULong cff_get_offset(FT_Byte * p,FT_Byte off_size)1068*37da2899SCharles.Forsyth cff_get_offset( FT_Byte* p, 1069*37da2899SCharles.Forsyth FT_Byte off_size ) 1070*37da2899SCharles.Forsyth { 1071*37da2899SCharles.Forsyth FT_ULong result; 1072*37da2899SCharles.Forsyth 1073*37da2899SCharles.Forsyth 1074*37da2899SCharles.Forsyth for ( result = 0; off_size > 0; off_size-- ) 1075*37da2899SCharles.Forsyth { 1076*37da2899SCharles.Forsyth result <<= 8; 1077*37da2899SCharles.Forsyth result |= *p++; 1078*37da2899SCharles.Forsyth } 1079*37da2899SCharles.Forsyth 1080*37da2899SCharles.Forsyth return result; 1081*37da2899SCharles.Forsyth } 1082*37da2899SCharles.Forsyth 1083*37da2899SCharles.Forsyth 1084*37da2899SCharles.Forsyth static FT_Error cff_new_index(CFF_Index idx,FT_Stream stream,FT_Bool load)1085*37da2899SCharles.Forsyth cff_new_index( CFF_Index idx, 1086*37da2899SCharles.Forsyth FT_Stream stream, 1087*37da2899SCharles.Forsyth FT_Bool load ) 1088*37da2899SCharles.Forsyth { 1089*37da2899SCharles.Forsyth FT_Error error; 1090*37da2899SCharles.Forsyth FT_Memory memory = stream->memory; 1091*37da2899SCharles.Forsyth FT_UShort count; 1092*37da2899SCharles.Forsyth 1093*37da2899SCharles.Forsyth 1094*37da2899SCharles.Forsyth FT_MEM_ZERO( idx, sizeof ( *idx ) ); 1095*37da2899SCharles.Forsyth 1096*37da2899SCharles.Forsyth idx->stream = stream; 1097*37da2899SCharles.Forsyth if ( !FT_READ_USHORT( count ) && 1098*37da2899SCharles.Forsyth count > 0 ) 1099*37da2899SCharles.Forsyth { 1100*37da2899SCharles.Forsyth FT_Byte* p; 1101*37da2899SCharles.Forsyth FT_Byte offsize; 1102*37da2899SCharles.Forsyth FT_ULong data_size; 1103*37da2899SCharles.Forsyth FT_ULong* poff; 1104*37da2899SCharles.Forsyth 1105*37da2899SCharles.Forsyth 1106*37da2899SCharles.Forsyth /* there is at least one element; read the offset size, */ 1107*37da2899SCharles.Forsyth /* then access the offset table to compute the index's total size */ 1108*37da2899SCharles.Forsyth if ( FT_READ_BYTE( offsize ) ) 1109*37da2899SCharles.Forsyth goto Exit; 1110*37da2899SCharles.Forsyth 1111*37da2899SCharles.Forsyth idx->stream = stream; 1112*37da2899SCharles.Forsyth idx->count = count; 1113*37da2899SCharles.Forsyth idx->off_size = offsize; 1114*37da2899SCharles.Forsyth data_size = (FT_ULong)( count + 1 ) * offsize; 1115*37da2899SCharles.Forsyth 1116*37da2899SCharles.Forsyth if ( FT_NEW_ARRAY( idx->offsets, count + 1 ) || 1117*37da2899SCharles.Forsyth FT_FRAME_ENTER( data_size ) ) 1118*37da2899SCharles.Forsyth goto Exit; 1119*37da2899SCharles.Forsyth 1120*37da2899SCharles.Forsyth poff = idx->offsets; 1121*37da2899SCharles.Forsyth p = (FT_Byte*)stream->cursor; 1122*37da2899SCharles.Forsyth 1123*37da2899SCharles.Forsyth for ( ; (FT_Short)count >= 0; count-- ) 1124*37da2899SCharles.Forsyth { 1125*37da2899SCharles.Forsyth poff[0] = cff_get_offset( p, offsize ); 1126*37da2899SCharles.Forsyth poff++; 1127*37da2899SCharles.Forsyth p += offsize; 1128*37da2899SCharles.Forsyth } 1129*37da2899SCharles.Forsyth 1130*37da2899SCharles.Forsyth FT_FRAME_EXIT(); 1131*37da2899SCharles.Forsyth 1132*37da2899SCharles.Forsyth idx->data_offset = FT_STREAM_POS(); 1133*37da2899SCharles.Forsyth data_size = poff[-1] - 1; 1134*37da2899SCharles.Forsyth 1135*37da2899SCharles.Forsyth if ( load ) 1136*37da2899SCharles.Forsyth { 1137*37da2899SCharles.Forsyth /* load the data */ 1138*37da2899SCharles.Forsyth if ( FT_FRAME_EXTRACT( data_size, idx->bytes ) ) 1139*37da2899SCharles.Forsyth goto Exit; 1140*37da2899SCharles.Forsyth } 1141*37da2899SCharles.Forsyth else 1142*37da2899SCharles.Forsyth { 1143*37da2899SCharles.Forsyth /* skip the data */ 1144*37da2899SCharles.Forsyth if ( FT_STREAM_SKIP( data_size ) ) 1145*37da2899SCharles.Forsyth goto Exit; 1146*37da2899SCharles.Forsyth } 1147*37da2899SCharles.Forsyth } 1148*37da2899SCharles.Forsyth 1149*37da2899SCharles.Forsyth Exit: 1150*37da2899SCharles.Forsyth if ( error ) 1151*37da2899SCharles.Forsyth FT_FREE( idx->offsets ); 1152*37da2899SCharles.Forsyth 1153*37da2899SCharles.Forsyth return error; 1154*37da2899SCharles.Forsyth } 1155*37da2899SCharles.Forsyth 1156*37da2899SCharles.Forsyth 1157*37da2899SCharles.Forsyth static void cff_done_index(CFF_Index idx)1158*37da2899SCharles.Forsyth cff_done_index( CFF_Index idx ) 1159*37da2899SCharles.Forsyth { 1160*37da2899SCharles.Forsyth if ( idx->stream ) 1161*37da2899SCharles.Forsyth { 1162*37da2899SCharles.Forsyth FT_Stream stream = idx->stream; 1163*37da2899SCharles.Forsyth FT_Memory memory = stream->memory; 1164*37da2899SCharles.Forsyth 1165*37da2899SCharles.Forsyth 1166*37da2899SCharles.Forsyth if ( idx->bytes ) 1167*37da2899SCharles.Forsyth FT_FRAME_RELEASE( idx->bytes ); 1168*37da2899SCharles.Forsyth 1169*37da2899SCharles.Forsyth FT_FREE( idx->offsets ); 1170*37da2899SCharles.Forsyth FT_MEM_ZERO( idx, sizeof ( *idx ) ); 1171*37da2899SCharles.Forsyth } 1172*37da2899SCharles.Forsyth } 1173*37da2899SCharles.Forsyth 1174*37da2899SCharles.Forsyth 1175*37da2899SCharles.Forsyth /* allocate a table containing pointers to an index's elements */ 1176*37da2899SCharles.Forsyth static FT_Error cff_index_get_pointers(CFF_Index idx,FT_Byte *** table)1177*37da2899SCharles.Forsyth cff_index_get_pointers( CFF_Index idx, 1178*37da2899SCharles.Forsyth FT_Byte*** table ) 1179*37da2899SCharles.Forsyth { 1180*37da2899SCharles.Forsyth FT_Error error = 0; 1181*37da2899SCharles.Forsyth FT_Memory memory = idx->stream->memory; 1182*37da2899SCharles.Forsyth FT_ULong n, offset, old_offset; 1183*37da2899SCharles.Forsyth FT_Byte** t; 1184*37da2899SCharles.Forsyth 1185*37da2899SCharles.Forsyth 1186*37da2899SCharles.Forsyth *table = 0; 1187*37da2899SCharles.Forsyth 1188*37da2899SCharles.Forsyth if ( idx->count > 0 && !FT_NEW_ARRAY( t, idx->count + 1 ) ) 1189*37da2899SCharles.Forsyth { 1190*37da2899SCharles.Forsyth old_offset = 1; 1191*37da2899SCharles.Forsyth for ( n = 0; n <= idx->count; n++ ) 1192*37da2899SCharles.Forsyth { 1193*37da2899SCharles.Forsyth offset = idx->offsets[n]; 1194*37da2899SCharles.Forsyth if ( !offset ) 1195*37da2899SCharles.Forsyth offset = old_offset; 1196*37da2899SCharles.Forsyth 1197*37da2899SCharles.Forsyth t[n] = idx->bytes + offset - 1; 1198*37da2899SCharles.Forsyth 1199*37da2899SCharles.Forsyth old_offset = offset; 1200*37da2899SCharles.Forsyth } 1201*37da2899SCharles.Forsyth *table = t; 1202*37da2899SCharles.Forsyth } 1203*37da2899SCharles.Forsyth 1204*37da2899SCharles.Forsyth return error; 1205*37da2899SCharles.Forsyth } 1206*37da2899SCharles.Forsyth 1207*37da2899SCharles.Forsyth 1208*37da2899SCharles.Forsyth FT_LOCAL_DEF( FT_Error ) cff_index_access_element(CFF_Index idx,FT_UInt element,FT_Byte ** pbytes,FT_ULong * pbyte_len)1209*37da2899SCharles.Forsyth cff_index_access_element( CFF_Index idx, 1210*37da2899SCharles.Forsyth FT_UInt element, 1211*37da2899SCharles.Forsyth FT_Byte** pbytes, 1212*37da2899SCharles.Forsyth FT_ULong* pbyte_len ) 1213*37da2899SCharles.Forsyth { 1214*37da2899SCharles.Forsyth FT_Error error = 0; 1215*37da2899SCharles.Forsyth 1216*37da2899SCharles.Forsyth 1217*37da2899SCharles.Forsyth if ( idx && idx->count > element ) 1218*37da2899SCharles.Forsyth { 1219*37da2899SCharles.Forsyth /* compute start and end offsets */ 1220*37da2899SCharles.Forsyth FT_ULong off1, off2 = 0; 1221*37da2899SCharles.Forsyth 1222*37da2899SCharles.Forsyth 1223*37da2899SCharles.Forsyth off1 = idx->offsets[element]; 1224*37da2899SCharles.Forsyth if ( off1 ) 1225*37da2899SCharles.Forsyth { 1226*37da2899SCharles.Forsyth do 1227*37da2899SCharles.Forsyth { 1228*37da2899SCharles.Forsyth element++; 1229*37da2899SCharles.Forsyth off2 = idx->offsets[element]; 1230*37da2899SCharles.Forsyth 1231*37da2899SCharles.Forsyth } while ( off2 == 0 && element < idx->count ); 1232*37da2899SCharles.Forsyth 1233*37da2899SCharles.Forsyth if ( !off2 ) 1234*37da2899SCharles.Forsyth off1 = 0; 1235*37da2899SCharles.Forsyth } 1236*37da2899SCharles.Forsyth 1237*37da2899SCharles.Forsyth /* access element */ 1238*37da2899SCharles.Forsyth if ( off1 ) 1239*37da2899SCharles.Forsyth { 1240*37da2899SCharles.Forsyth *pbyte_len = off2 - off1; 1241*37da2899SCharles.Forsyth 1242*37da2899SCharles.Forsyth if ( idx->bytes ) 1243*37da2899SCharles.Forsyth { 1244*37da2899SCharles.Forsyth /* this index was completely loaded in memory, that's easy */ 1245*37da2899SCharles.Forsyth *pbytes = idx->bytes + off1 - 1; 1246*37da2899SCharles.Forsyth } 1247*37da2899SCharles.Forsyth else 1248*37da2899SCharles.Forsyth { 1249*37da2899SCharles.Forsyth /* this index is still on disk/file, access it through a frame */ 1250*37da2899SCharles.Forsyth FT_Stream stream = idx->stream; 1251*37da2899SCharles.Forsyth 1252*37da2899SCharles.Forsyth 1253*37da2899SCharles.Forsyth if ( FT_STREAM_SEEK( idx->data_offset + off1 - 1 ) || 1254*37da2899SCharles.Forsyth FT_FRAME_EXTRACT( off2 - off1, *pbytes ) ) 1255*37da2899SCharles.Forsyth goto Exit; 1256*37da2899SCharles.Forsyth } 1257*37da2899SCharles.Forsyth } 1258*37da2899SCharles.Forsyth else 1259*37da2899SCharles.Forsyth { 1260*37da2899SCharles.Forsyth /* empty index element */ 1261*37da2899SCharles.Forsyth *pbytes = 0; 1262*37da2899SCharles.Forsyth *pbyte_len = 0; 1263*37da2899SCharles.Forsyth } 1264*37da2899SCharles.Forsyth } 1265*37da2899SCharles.Forsyth else 1266*37da2899SCharles.Forsyth error = CFF_Err_Invalid_Argument; 1267*37da2899SCharles.Forsyth 1268*37da2899SCharles.Forsyth Exit: 1269*37da2899SCharles.Forsyth return error; 1270*37da2899SCharles.Forsyth } 1271*37da2899SCharles.Forsyth 1272*37da2899SCharles.Forsyth 1273*37da2899SCharles.Forsyth FT_LOCAL_DEF( void ) cff_index_forget_element(CFF_Index idx,FT_Byte ** pbytes)1274*37da2899SCharles.Forsyth cff_index_forget_element( CFF_Index idx, 1275*37da2899SCharles.Forsyth FT_Byte** pbytes ) 1276*37da2899SCharles.Forsyth { 1277*37da2899SCharles.Forsyth if ( idx->bytes == 0 ) 1278*37da2899SCharles.Forsyth { 1279*37da2899SCharles.Forsyth FT_Stream stream = idx->stream; 1280*37da2899SCharles.Forsyth 1281*37da2899SCharles.Forsyth 1282*37da2899SCharles.Forsyth FT_FRAME_RELEASE( *pbytes ); 1283*37da2899SCharles.Forsyth } 1284*37da2899SCharles.Forsyth } 1285*37da2899SCharles.Forsyth 1286*37da2899SCharles.Forsyth 1287*37da2899SCharles.Forsyth FT_LOCAL_DEF( FT_String* ) cff_index_get_name(CFF_Index idx,FT_UInt element)1288*37da2899SCharles.Forsyth cff_index_get_name( CFF_Index idx, 1289*37da2899SCharles.Forsyth FT_UInt element ) 1290*37da2899SCharles.Forsyth { 1291*37da2899SCharles.Forsyth FT_Memory memory = idx->stream->memory; 1292*37da2899SCharles.Forsyth FT_Byte* bytes; 1293*37da2899SCharles.Forsyth FT_ULong byte_len; 1294*37da2899SCharles.Forsyth FT_Error error; 1295*37da2899SCharles.Forsyth FT_String* name = 0; 1296*37da2899SCharles.Forsyth 1297*37da2899SCharles.Forsyth 1298*37da2899SCharles.Forsyth error = cff_index_access_element( idx, element, &bytes, &byte_len ); 1299*37da2899SCharles.Forsyth if ( error ) 1300*37da2899SCharles.Forsyth goto Exit; 1301*37da2899SCharles.Forsyth 1302*37da2899SCharles.Forsyth if ( !FT_ALLOC( name, byte_len + 1 ) ) 1303*37da2899SCharles.Forsyth { 1304*37da2899SCharles.Forsyth FT_MEM_COPY( name, bytes, byte_len ); 1305*37da2899SCharles.Forsyth name[byte_len] = 0; 1306*37da2899SCharles.Forsyth } 1307*37da2899SCharles.Forsyth cff_index_forget_element( idx, &bytes ); 1308*37da2899SCharles.Forsyth 1309*37da2899SCharles.Forsyth Exit: 1310*37da2899SCharles.Forsyth return name; 1311*37da2899SCharles.Forsyth } 1312*37da2899SCharles.Forsyth 1313*37da2899SCharles.Forsyth 1314*37da2899SCharles.Forsyth FT_LOCAL_DEF( FT_String* ) cff_index_get_sid_string(CFF_Index idx,FT_UInt sid,PSNames_Service psnames_service)1315*37da2899SCharles.Forsyth cff_index_get_sid_string( CFF_Index idx, 1316*37da2899SCharles.Forsyth FT_UInt sid, 1317*37da2899SCharles.Forsyth PSNames_Service psnames_service ) 1318*37da2899SCharles.Forsyth { 1319*37da2899SCharles.Forsyth /* if it is not a standard string, return it */ 1320*37da2899SCharles.Forsyth if ( sid > 390 ) 1321*37da2899SCharles.Forsyth return cff_index_get_name( idx, sid - 391 ); 1322*37da2899SCharles.Forsyth 1323*37da2899SCharles.Forsyth /* that's a standard string, fetch a copy from the PSName module */ 1324*37da2899SCharles.Forsyth { 1325*37da2899SCharles.Forsyth FT_String* name = 0; 1326*37da2899SCharles.Forsyth const char* adobe_name = psnames_service->adobe_std_strings( sid ); 1327*37da2899SCharles.Forsyth FT_UInt len; 1328*37da2899SCharles.Forsyth 1329*37da2899SCharles.Forsyth 1330*37da2899SCharles.Forsyth if ( adobe_name ) 1331*37da2899SCharles.Forsyth { 1332*37da2899SCharles.Forsyth FT_Memory memory = idx->stream->memory; 1333*37da2899SCharles.Forsyth FT_Error error; 1334*37da2899SCharles.Forsyth 1335*37da2899SCharles.Forsyth 1336*37da2899SCharles.Forsyth len = (FT_UInt)ft_strlen( adobe_name ); 1337*37da2899SCharles.Forsyth if ( !FT_ALLOC( name, len + 1 ) ) 1338*37da2899SCharles.Forsyth { 1339*37da2899SCharles.Forsyth FT_MEM_COPY( name, adobe_name, len ); 1340*37da2899SCharles.Forsyth name[len] = 0; 1341*37da2899SCharles.Forsyth } 1342*37da2899SCharles.Forsyth 1343*37da2899SCharles.Forsyth FT_UNUSED( error ); 1344*37da2899SCharles.Forsyth } 1345*37da2899SCharles.Forsyth 1346*37da2899SCharles.Forsyth return name; 1347*37da2899SCharles.Forsyth } 1348*37da2899SCharles.Forsyth } 1349*37da2899SCharles.Forsyth 1350*37da2899SCharles.Forsyth 1351*37da2899SCharles.Forsyth /*************************************************************************/ 1352*37da2899SCharles.Forsyth /*************************************************************************/ 1353*37da2899SCharles.Forsyth /*** ***/ 1354*37da2899SCharles.Forsyth /*** FD Select table support ***/ 1355*37da2899SCharles.Forsyth /*** ***/ 1356*37da2899SCharles.Forsyth /*************************************************************************/ 1357*37da2899SCharles.Forsyth /*************************************************************************/ 1358*37da2899SCharles.Forsyth 1359*37da2899SCharles.Forsyth 1360*37da2899SCharles.Forsyth static void CFF_Done_FD_Select(CFF_FDSelect fdselect,FT_Stream stream)1361*37da2899SCharles.Forsyth CFF_Done_FD_Select( CFF_FDSelect fdselect, 1362*37da2899SCharles.Forsyth FT_Stream stream ) 1363*37da2899SCharles.Forsyth { 1364*37da2899SCharles.Forsyth if ( fdselect->data ) 1365*37da2899SCharles.Forsyth FT_FRAME_RELEASE( fdselect->data ); 1366*37da2899SCharles.Forsyth 1367*37da2899SCharles.Forsyth fdselect->data_size = 0; 1368*37da2899SCharles.Forsyth fdselect->format = 0; 1369*37da2899SCharles.Forsyth fdselect->range_count = 0; 1370*37da2899SCharles.Forsyth } 1371*37da2899SCharles.Forsyth 1372*37da2899SCharles.Forsyth 1373*37da2899SCharles.Forsyth static FT_Error CFF_Load_FD_Select(CFF_FDSelect fdselect,FT_UInt num_glyphs,FT_Stream stream,FT_ULong offset)1374*37da2899SCharles.Forsyth CFF_Load_FD_Select( CFF_FDSelect fdselect, 1375*37da2899SCharles.Forsyth FT_UInt num_glyphs, 1376*37da2899SCharles.Forsyth FT_Stream stream, 1377*37da2899SCharles.Forsyth FT_ULong offset ) 1378*37da2899SCharles.Forsyth { 1379*37da2899SCharles.Forsyth FT_Error error; 1380*37da2899SCharles.Forsyth FT_Byte format; 1381*37da2899SCharles.Forsyth FT_UInt num_ranges; 1382*37da2899SCharles.Forsyth 1383*37da2899SCharles.Forsyth 1384*37da2899SCharles.Forsyth /* read format */ 1385*37da2899SCharles.Forsyth if ( FT_STREAM_SEEK( offset ) || FT_READ_BYTE( format ) ) 1386*37da2899SCharles.Forsyth goto Exit; 1387*37da2899SCharles.Forsyth 1388*37da2899SCharles.Forsyth fdselect->format = format; 1389*37da2899SCharles.Forsyth fdselect->cache_count = 0; /* clear cache */ 1390*37da2899SCharles.Forsyth 1391*37da2899SCharles.Forsyth switch ( format ) 1392*37da2899SCharles.Forsyth { 1393*37da2899SCharles.Forsyth case 0: /* format 0, that's simple */ 1394*37da2899SCharles.Forsyth fdselect->data_size = num_glyphs; 1395*37da2899SCharles.Forsyth goto Load_Data; 1396*37da2899SCharles.Forsyth 1397*37da2899SCharles.Forsyth case 3: /* format 3, a tad more complex */ 1398*37da2899SCharles.Forsyth if ( FT_READ_USHORT( num_ranges ) ) 1399*37da2899SCharles.Forsyth goto Exit; 1400*37da2899SCharles.Forsyth 1401*37da2899SCharles.Forsyth fdselect->data_size = num_ranges * 3 + 2; 1402*37da2899SCharles.Forsyth 1403*37da2899SCharles.Forsyth Load_Data: 1404*37da2899SCharles.Forsyth if ( FT_FRAME_EXTRACT( fdselect->data_size, fdselect->data ) ) 1405*37da2899SCharles.Forsyth goto Exit; 1406*37da2899SCharles.Forsyth break; 1407*37da2899SCharles.Forsyth 1408*37da2899SCharles.Forsyth default: /* hmm... that's wrong */ 1409*37da2899SCharles.Forsyth error = CFF_Err_Invalid_File_Format; 1410*37da2899SCharles.Forsyth } 1411*37da2899SCharles.Forsyth 1412*37da2899SCharles.Forsyth Exit: 1413*37da2899SCharles.Forsyth return error; 1414*37da2899SCharles.Forsyth } 1415*37da2899SCharles.Forsyth 1416*37da2899SCharles.Forsyth 1417*37da2899SCharles.Forsyth FT_LOCAL_DEF( FT_Byte ) cff_fd_select_get(CFF_FDSelect fdselect,FT_UInt glyph_index)1418*37da2899SCharles.Forsyth cff_fd_select_get( CFF_FDSelect fdselect, 1419*37da2899SCharles.Forsyth FT_UInt glyph_index ) 1420*37da2899SCharles.Forsyth { 1421*37da2899SCharles.Forsyth FT_Byte fd = 0; 1422*37da2899SCharles.Forsyth 1423*37da2899SCharles.Forsyth 1424*37da2899SCharles.Forsyth switch ( fdselect->format ) 1425*37da2899SCharles.Forsyth { 1426*37da2899SCharles.Forsyth case 0: 1427*37da2899SCharles.Forsyth fd = fdselect->data[glyph_index]; 1428*37da2899SCharles.Forsyth break; 1429*37da2899SCharles.Forsyth 1430*37da2899SCharles.Forsyth case 3: 1431*37da2899SCharles.Forsyth /* first, compare to cache */ 1432*37da2899SCharles.Forsyth if ( (FT_UInt)( glyph_index - fdselect->cache_first ) < 1433*37da2899SCharles.Forsyth fdselect->cache_count ) 1434*37da2899SCharles.Forsyth { 1435*37da2899SCharles.Forsyth fd = fdselect->cache_fd; 1436*37da2899SCharles.Forsyth break; 1437*37da2899SCharles.Forsyth } 1438*37da2899SCharles.Forsyth 1439*37da2899SCharles.Forsyth /* then, lookup the ranges array */ 1440*37da2899SCharles.Forsyth { 1441*37da2899SCharles.Forsyth FT_Byte* p = fdselect->data; 1442*37da2899SCharles.Forsyth FT_Byte* p_limit = p + fdselect->data_size; 1443*37da2899SCharles.Forsyth FT_Byte fd2; 1444*37da2899SCharles.Forsyth FT_UInt first, limit; 1445*37da2899SCharles.Forsyth 1446*37da2899SCharles.Forsyth 1447*37da2899SCharles.Forsyth first = FT_NEXT_USHORT( p ); 1448*37da2899SCharles.Forsyth do 1449*37da2899SCharles.Forsyth { 1450*37da2899SCharles.Forsyth if ( glyph_index < first ) 1451*37da2899SCharles.Forsyth break; 1452*37da2899SCharles.Forsyth 1453*37da2899SCharles.Forsyth fd2 = *p++; 1454*37da2899SCharles.Forsyth limit = FT_NEXT_USHORT( p ); 1455*37da2899SCharles.Forsyth 1456*37da2899SCharles.Forsyth if ( glyph_index < limit ) 1457*37da2899SCharles.Forsyth { 1458*37da2899SCharles.Forsyth fd = fd2; 1459*37da2899SCharles.Forsyth 1460*37da2899SCharles.Forsyth /* update cache */ 1461*37da2899SCharles.Forsyth fdselect->cache_first = first; 1462*37da2899SCharles.Forsyth fdselect->cache_count = limit-first; 1463*37da2899SCharles.Forsyth fdselect->cache_fd = fd2; 1464*37da2899SCharles.Forsyth break; 1465*37da2899SCharles.Forsyth } 1466*37da2899SCharles.Forsyth first = limit; 1467*37da2899SCharles.Forsyth 1468*37da2899SCharles.Forsyth } while ( p < p_limit ); 1469*37da2899SCharles.Forsyth } 1470*37da2899SCharles.Forsyth break; 1471*37da2899SCharles.Forsyth 1472*37da2899SCharles.Forsyth default: 1473*37da2899SCharles.Forsyth ; 1474*37da2899SCharles.Forsyth } 1475*37da2899SCharles.Forsyth 1476*37da2899SCharles.Forsyth return fd; 1477*37da2899SCharles.Forsyth } 1478*37da2899SCharles.Forsyth 1479*37da2899SCharles.Forsyth 1480*37da2899SCharles.Forsyth /*************************************************************************/ 1481*37da2899SCharles.Forsyth /*************************************************************************/ 1482*37da2899SCharles.Forsyth /*** ***/ 1483*37da2899SCharles.Forsyth /*** CFF font support ***/ 1484*37da2899SCharles.Forsyth /*** ***/ 1485*37da2899SCharles.Forsyth /*************************************************************************/ 1486*37da2899SCharles.Forsyth /*************************************************************************/ 1487*37da2899SCharles.Forsyth 1488*37da2899SCharles.Forsyth static void cff_charset_done(CFF_Charset charset,FT_Stream stream)1489*37da2899SCharles.Forsyth cff_charset_done( CFF_Charset charset, 1490*37da2899SCharles.Forsyth FT_Stream stream ) 1491*37da2899SCharles.Forsyth { 1492*37da2899SCharles.Forsyth FT_Memory memory = stream->memory; 1493*37da2899SCharles.Forsyth 1494*37da2899SCharles.Forsyth 1495*37da2899SCharles.Forsyth FT_FREE( charset->sids ); 1496*37da2899SCharles.Forsyth charset->format = 0; 1497*37da2899SCharles.Forsyth charset->offset = 0; 1498*37da2899SCharles.Forsyth } 1499*37da2899SCharles.Forsyth 1500*37da2899SCharles.Forsyth 1501*37da2899SCharles.Forsyth static FT_Error cff_charset_load(CFF_Charset charset,FT_UInt num_glyphs,FT_Stream stream,FT_ULong base_offset,FT_ULong offset)1502*37da2899SCharles.Forsyth cff_charset_load( CFF_Charset charset, 1503*37da2899SCharles.Forsyth FT_UInt num_glyphs, 1504*37da2899SCharles.Forsyth FT_Stream stream, 1505*37da2899SCharles.Forsyth FT_ULong base_offset, 1506*37da2899SCharles.Forsyth FT_ULong offset ) 1507*37da2899SCharles.Forsyth { 1508*37da2899SCharles.Forsyth FT_Memory memory = stream->memory; 1509*37da2899SCharles.Forsyth FT_Error error = 0; 1510*37da2899SCharles.Forsyth FT_UShort glyph_sid; 1511*37da2899SCharles.Forsyth 1512*37da2899SCharles.Forsyth 1513*37da2899SCharles.Forsyth /* If the the offset is greater than 2, we have to parse the */ 1514*37da2899SCharles.Forsyth /* charset table. */ 1515*37da2899SCharles.Forsyth if ( offset > 2 ) 1516*37da2899SCharles.Forsyth { 1517*37da2899SCharles.Forsyth FT_UInt j; 1518*37da2899SCharles.Forsyth 1519*37da2899SCharles.Forsyth 1520*37da2899SCharles.Forsyth charset->offset = base_offset + offset; 1521*37da2899SCharles.Forsyth 1522*37da2899SCharles.Forsyth /* Get the format of the table. */ 1523*37da2899SCharles.Forsyth if ( FT_STREAM_SEEK( charset->offset ) || 1524*37da2899SCharles.Forsyth FT_READ_BYTE( charset->format ) ) 1525*37da2899SCharles.Forsyth goto Exit; 1526*37da2899SCharles.Forsyth 1527*37da2899SCharles.Forsyth /* Allocate memory for sids. */ 1528*37da2899SCharles.Forsyth if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) 1529*37da2899SCharles.Forsyth goto Exit; 1530*37da2899SCharles.Forsyth 1531*37da2899SCharles.Forsyth /* assign the .notdef glyph */ 1532*37da2899SCharles.Forsyth charset->sids[0] = 0; 1533*37da2899SCharles.Forsyth 1534*37da2899SCharles.Forsyth switch ( charset->format ) 1535*37da2899SCharles.Forsyth { 1536*37da2899SCharles.Forsyth case 0: 1537*37da2899SCharles.Forsyth if ( num_glyphs > 0 ) 1538*37da2899SCharles.Forsyth { 1539*37da2899SCharles.Forsyth if ( FT_FRAME_ENTER( ( num_glyphs - 1 ) * 2 ) ) 1540*37da2899SCharles.Forsyth goto Exit; 1541*37da2899SCharles.Forsyth 1542*37da2899SCharles.Forsyth for ( j = 1; j < num_glyphs; j++ ) 1543*37da2899SCharles.Forsyth charset->sids[j] = FT_GET_USHORT(); 1544*37da2899SCharles.Forsyth 1545*37da2899SCharles.Forsyth FT_FRAME_EXIT(); 1546*37da2899SCharles.Forsyth } 1547*37da2899SCharles.Forsyth break; 1548*37da2899SCharles.Forsyth 1549*37da2899SCharles.Forsyth case 1: 1550*37da2899SCharles.Forsyth case 2: 1551*37da2899SCharles.Forsyth { 1552*37da2899SCharles.Forsyth FT_UInt nleft; 1553*37da2899SCharles.Forsyth FT_UInt i; 1554*37da2899SCharles.Forsyth 1555*37da2899SCharles.Forsyth 1556*37da2899SCharles.Forsyth j = 1; 1557*37da2899SCharles.Forsyth 1558*37da2899SCharles.Forsyth while ( j < num_glyphs ) 1559*37da2899SCharles.Forsyth { 1560*37da2899SCharles.Forsyth 1561*37da2899SCharles.Forsyth /* Read the first glyph sid of the range. */ 1562*37da2899SCharles.Forsyth if ( FT_READ_USHORT( glyph_sid ) ) 1563*37da2899SCharles.Forsyth goto Exit; 1564*37da2899SCharles.Forsyth 1565*37da2899SCharles.Forsyth /* Read the number of glyphs in the range. */ 1566*37da2899SCharles.Forsyth if ( charset->format == 2 ) 1567*37da2899SCharles.Forsyth { 1568*37da2899SCharles.Forsyth if ( FT_READ_USHORT( nleft ) ) 1569*37da2899SCharles.Forsyth goto Exit; 1570*37da2899SCharles.Forsyth } 1571*37da2899SCharles.Forsyth else 1572*37da2899SCharles.Forsyth { 1573*37da2899SCharles.Forsyth if ( FT_READ_BYTE( nleft ) ) 1574*37da2899SCharles.Forsyth goto Exit; 1575*37da2899SCharles.Forsyth } 1576*37da2899SCharles.Forsyth 1577*37da2899SCharles.Forsyth /* Fill in the range of sids -- `nleft + 1' glyphs. */ 1578*37da2899SCharles.Forsyth for ( i = 0; j < num_glyphs && i <= nleft; i++, j++, glyph_sid++ ) 1579*37da2899SCharles.Forsyth charset->sids[j] = glyph_sid; 1580*37da2899SCharles.Forsyth } 1581*37da2899SCharles.Forsyth } 1582*37da2899SCharles.Forsyth break; 1583*37da2899SCharles.Forsyth 1584*37da2899SCharles.Forsyth default: 1585*37da2899SCharles.Forsyth FT_ERROR(( "cff_charset_load: invalid table format!\n" )); 1586*37da2899SCharles.Forsyth error = CFF_Err_Invalid_File_Format; 1587*37da2899SCharles.Forsyth goto Exit; 1588*37da2899SCharles.Forsyth } 1589*37da2899SCharles.Forsyth } 1590*37da2899SCharles.Forsyth else 1591*37da2899SCharles.Forsyth { 1592*37da2899SCharles.Forsyth /* Parse default tables corresponding to offset == 0, 1, or 2. */ 1593*37da2899SCharles.Forsyth /* CFF specification intimates the following: */ 1594*37da2899SCharles.Forsyth /* */ 1595*37da2899SCharles.Forsyth /* In order to use a predefined charset, the following must be */ 1596*37da2899SCharles.Forsyth /* true: The charset constructed for the glyphs in the font's */ 1597*37da2899SCharles.Forsyth /* charstrings dictionary must match the predefined charset in */ 1598*37da2899SCharles.Forsyth /* the first num_glyphs, and hence must match the predefined */ 1599*37da2899SCharles.Forsyth /* charset *exactly*. */ 1600*37da2899SCharles.Forsyth 1601*37da2899SCharles.Forsyth charset->offset = offset; /* record charset type */ 1602*37da2899SCharles.Forsyth 1603*37da2899SCharles.Forsyth switch ( (FT_UInt)offset ) 1604*37da2899SCharles.Forsyth { 1605*37da2899SCharles.Forsyth case 0: 1606*37da2899SCharles.Forsyth if ( num_glyphs != 229 ) 1607*37da2899SCharles.Forsyth { 1608*37da2899SCharles.Forsyth FT_ERROR(("cff_charset_load: implicit charset not equal to\n" 1609*37da2899SCharles.Forsyth "predefined charset (Adobe ISO-Latin)!\n" )); 1610*37da2899SCharles.Forsyth error = CFF_Err_Invalid_File_Format; 1611*37da2899SCharles.Forsyth goto Exit; 1612*37da2899SCharles.Forsyth } 1613*37da2899SCharles.Forsyth 1614*37da2899SCharles.Forsyth /* Allocate memory for sids. */ 1615*37da2899SCharles.Forsyth if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) 1616*37da2899SCharles.Forsyth goto Exit; 1617*37da2899SCharles.Forsyth 1618*37da2899SCharles.Forsyth /* Copy the predefined charset into the allocated memory. */ 1619*37da2899SCharles.Forsyth FT_MEM_COPY( charset->sids, cff_isoadobe_charset, 1620*37da2899SCharles.Forsyth num_glyphs * sizeof ( FT_UShort ) ); 1621*37da2899SCharles.Forsyth 1622*37da2899SCharles.Forsyth break; 1623*37da2899SCharles.Forsyth 1624*37da2899SCharles.Forsyth case 1: 1625*37da2899SCharles.Forsyth if ( num_glyphs != 166 ) 1626*37da2899SCharles.Forsyth { 1627*37da2899SCharles.Forsyth FT_ERROR(( "cff_charset_load: implicit charset not equal to\n" 1628*37da2899SCharles.Forsyth "predefined charset (Adobe Expert)!\n" )); 1629*37da2899SCharles.Forsyth error = CFF_Err_Invalid_File_Format; 1630*37da2899SCharles.Forsyth goto Exit; 1631*37da2899SCharles.Forsyth } 1632*37da2899SCharles.Forsyth 1633*37da2899SCharles.Forsyth /* Allocate memory for sids. */ 1634*37da2899SCharles.Forsyth if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) 1635*37da2899SCharles.Forsyth goto Exit; 1636*37da2899SCharles.Forsyth 1637*37da2899SCharles.Forsyth /* Copy the predefined charset into the allocated memory. */ 1638*37da2899SCharles.Forsyth FT_MEM_COPY( charset->sids, cff_expert_charset, 1639*37da2899SCharles.Forsyth num_glyphs * sizeof ( FT_UShort ) ); 1640*37da2899SCharles.Forsyth 1641*37da2899SCharles.Forsyth break; 1642*37da2899SCharles.Forsyth 1643*37da2899SCharles.Forsyth case 2: 1644*37da2899SCharles.Forsyth if ( num_glyphs != 87 ) 1645*37da2899SCharles.Forsyth { 1646*37da2899SCharles.Forsyth FT_ERROR(( "cff_charset_load: implicit charset not equal to\n" 1647*37da2899SCharles.Forsyth "predefined charset (Adobe Expert Subset)!\n" )); 1648*37da2899SCharles.Forsyth error = CFF_Err_Invalid_File_Format; 1649*37da2899SCharles.Forsyth goto Exit; 1650*37da2899SCharles.Forsyth } 1651*37da2899SCharles.Forsyth 1652*37da2899SCharles.Forsyth /* Allocate memory for sids. */ 1653*37da2899SCharles.Forsyth if ( FT_NEW_ARRAY( charset->sids, num_glyphs ) ) 1654*37da2899SCharles.Forsyth goto Exit; 1655*37da2899SCharles.Forsyth 1656*37da2899SCharles.Forsyth /* Copy the predefined charset into the allocated memory. */ 1657*37da2899SCharles.Forsyth FT_MEM_COPY( charset->sids, cff_expertsubset_charset, 1658*37da2899SCharles.Forsyth num_glyphs * sizeof ( FT_UShort ) ); 1659*37da2899SCharles.Forsyth 1660*37da2899SCharles.Forsyth break; 1661*37da2899SCharles.Forsyth 1662*37da2899SCharles.Forsyth default: 1663*37da2899SCharles.Forsyth error = CFF_Err_Invalid_File_Format; 1664*37da2899SCharles.Forsyth goto Exit; 1665*37da2899SCharles.Forsyth } 1666*37da2899SCharles.Forsyth } 1667*37da2899SCharles.Forsyth 1668*37da2899SCharles.Forsyth Exit: 1669*37da2899SCharles.Forsyth 1670*37da2899SCharles.Forsyth /* Clean up if there was an error. */ 1671*37da2899SCharles.Forsyth if ( error ) 1672*37da2899SCharles.Forsyth if ( charset->sids ) 1673*37da2899SCharles.Forsyth { 1674*37da2899SCharles.Forsyth FT_FREE( charset->sids ); 1675*37da2899SCharles.Forsyth charset->format = 0; 1676*37da2899SCharles.Forsyth charset->offset = 0; 1677*37da2899SCharles.Forsyth charset->sids = 0; 1678*37da2899SCharles.Forsyth } 1679*37da2899SCharles.Forsyth 1680*37da2899SCharles.Forsyth return error; 1681*37da2899SCharles.Forsyth } 1682*37da2899SCharles.Forsyth 1683*37da2899SCharles.Forsyth 1684*37da2899SCharles.Forsyth 1685*37da2899SCharles.Forsyth static void cff_encoding_done(CFF_Encoding encoding)1686*37da2899SCharles.Forsyth cff_encoding_done( CFF_Encoding encoding ) 1687*37da2899SCharles.Forsyth { 1688*37da2899SCharles.Forsyth encoding->format = 0; 1689*37da2899SCharles.Forsyth encoding->offset = 0; 1690*37da2899SCharles.Forsyth encoding->count = 0; 1691*37da2899SCharles.Forsyth } 1692*37da2899SCharles.Forsyth 1693*37da2899SCharles.Forsyth 1694*37da2899SCharles.Forsyth 1695*37da2899SCharles.Forsyth 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)1696*37da2899SCharles.Forsyth cff_encoding_load( CFF_Encoding encoding, 1697*37da2899SCharles.Forsyth CFF_Charset charset, 1698*37da2899SCharles.Forsyth FT_UInt num_glyphs, 1699*37da2899SCharles.Forsyth FT_Stream stream, 1700*37da2899SCharles.Forsyth FT_ULong base_offset, 1701*37da2899SCharles.Forsyth FT_ULong offset ) 1702*37da2899SCharles.Forsyth { 1703*37da2899SCharles.Forsyth FT_Error error = 0; 1704*37da2899SCharles.Forsyth FT_UInt count; 1705*37da2899SCharles.Forsyth FT_UInt j; 1706*37da2899SCharles.Forsyth FT_UShort glyph_sid; 1707*37da2899SCharles.Forsyth FT_UInt glyph_code; 1708*37da2899SCharles.Forsyth 1709*37da2899SCharles.Forsyth 1710*37da2899SCharles.Forsyth /* Check for charset->sids. If we do not have this, we fail. */ 1711*37da2899SCharles.Forsyth if ( !charset->sids ) 1712*37da2899SCharles.Forsyth { 1713*37da2899SCharles.Forsyth error = CFF_Err_Invalid_File_Format; 1714*37da2899SCharles.Forsyth goto Exit; 1715*37da2899SCharles.Forsyth } 1716*37da2899SCharles.Forsyth 1717*37da2899SCharles.Forsyth /* Zero out the code to gid/sid mappings. */ 1718*37da2899SCharles.Forsyth for ( j = 0; j < 256; j++ ) 1719*37da2899SCharles.Forsyth { 1720*37da2899SCharles.Forsyth encoding->sids [j] = 0; 1721*37da2899SCharles.Forsyth encoding->codes[j] = 0; 1722*37da2899SCharles.Forsyth } 1723*37da2899SCharles.Forsyth 1724*37da2899SCharles.Forsyth /* Note: The encoding table in a CFF font is indexed by glyph index, */ 1725*37da2899SCharles.Forsyth /* where the first encoded glyph index is 1. Hence, we read the char */ 1726*37da2899SCharles.Forsyth /* code (`glyph_code') at index j and make the assignment: */ 1727*37da2899SCharles.Forsyth /* */ 1728*37da2899SCharles.Forsyth /* encoding->codes[glyph_code] = j + 1 */ 1729*37da2899SCharles.Forsyth /* */ 1730*37da2899SCharles.Forsyth /* We also make the assignment: */ 1731*37da2899SCharles.Forsyth /* */ 1732*37da2899SCharles.Forsyth /* encoding->sids[glyph_code] = charset->sids[j + 1] */ 1733*37da2899SCharles.Forsyth /* */ 1734*37da2899SCharles.Forsyth /* This gives us both a code to GID and a code to SID mapping. */ 1735*37da2899SCharles.Forsyth 1736*37da2899SCharles.Forsyth if ( offset > 1 ) 1737*37da2899SCharles.Forsyth { 1738*37da2899SCharles.Forsyth 1739*37da2899SCharles.Forsyth encoding->offset = base_offset + offset; 1740*37da2899SCharles.Forsyth 1741*37da2899SCharles.Forsyth /* we need to parse the table to determine its size */ 1742*37da2899SCharles.Forsyth if ( FT_STREAM_SEEK( encoding->offset ) || 1743*37da2899SCharles.Forsyth FT_READ_BYTE( encoding->format ) || 1744*37da2899SCharles.Forsyth FT_READ_BYTE( count ) ) 1745*37da2899SCharles.Forsyth goto Exit; 1746*37da2899SCharles.Forsyth 1747*37da2899SCharles.Forsyth encoding->count = count + 1; 1748*37da2899SCharles.Forsyth 1749*37da2899SCharles.Forsyth switch ( encoding->format & 0x7F ) 1750*37da2899SCharles.Forsyth { 1751*37da2899SCharles.Forsyth case 0: 1752*37da2899SCharles.Forsyth { 1753*37da2899SCharles.Forsyth FT_Byte* p; 1754*37da2899SCharles.Forsyth 1755*37da2899SCharles.Forsyth 1756*37da2899SCharles.Forsyth if ( FT_FRAME_ENTER( count ) ) 1757*37da2899SCharles.Forsyth goto Exit; 1758*37da2899SCharles.Forsyth 1759*37da2899SCharles.Forsyth p = (FT_Byte*)stream->cursor; 1760*37da2899SCharles.Forsyth 1761*37da2899SCharles.Forsyth for ( j = 1; j <= count; j++ ) 1762*37da2899SCharles.Forsyth { 1763*37da2899SCharles.Forsyth glyph_code = *p++; 1764*37da2899SCharles.Forsyth 1765*37da2899SCharles.Forsyth /* Make sure j is not too big. */ 1766*37da2899SCharles.Forsyth if ( (FT_UInt) glyph_code < num_glyphs ) 1767*37da2899SCharles.Forsyth { 1768*37da2899SCharles.Forsyth /* Assign code to GID mapping. */ 1769*37da2899SCharles.Forsyth encoding->codes[glyph_code] = (FT_UShort)j; 1770*37da2899SCharles.Forsyth 1771*37da2899SCharles.Forsyth /* Assign code to SID mapping. */ 1772*37da2899SCharles.Forsyth encoding->sids[glyph_code] = charset->sids[j]; 1773*37da2899SCharles.Forsyth } 1774*37da2899SCharles.Forsyth } 1775*37da2899SCharles.Forsyth 1776*37da2899SCharles.Forsyth FT_FRAME_EXIT(); 1777*37da2899SCharles.Forsyth } 1778*37da2899SCharles.Forsyth break; 1779*37da2899SCharles.Forsyth 1780*37da2899SCharles.Forsyth case 1: 1781*37da2899SCharles.Forsyth { 1782*37da2899SCharles.Forsyth FT_Byte nleft; 1783*37da2899SCharles.Forsyth FT_UInt i = 1; 1784*37da2899SCharles.Forsyth FT_UInt k; 1785*37da2899SCharles.Forsyth 1786*37da2899SCharles.Forsyth 1787*37da2899SCharles.Forsyth /* Parse the Format1 ranges. */ 1788*37da2899SCharles.Forsyth for ( j = 0; j < count; j++, i += nleft ) 1789*37da2899SCharles.Forsyth { 1790*37da2899SCharles.Forsyth /* Read the first glyph code of the range. */ 1791*37da2899SCharles.Forsyth if ( FT_READ_BYTE( glyph_code ) ) 1792*37da2899SCharles.Forsyth goto Exit; 1793*37da2899SCharles.Forsyth 1794*37da2899SCharles.Forsyth /* Read the number of codes in the range. */ 1795*37da2899SCharles.Forsyth if ( FT_READ_BYTE( nleft ) ) 1796*37da2899SCharles.Forsyth goto Exit; 1797*37da2899SCharles.Forsyth 1798*37da2899SCharles.Forsyth /* Increment nleft, so we read `nleft + 1' codes/sids. */ 1799*37da2899SCharles.Forsyth nleft++; 1800*37da2899SCharles.Forsyth 1801*37da2899SCharles.Forsyth /* Fill in the range of codes/sids. */ 1802*37da2899SCharles.Forsyth for ( k = i; k < nleft + i; k++, glyph_code++ ) 1803*37da2899SCharles.Forsyth { 1804*37da2899SCharles.Forsyth /* Make sure k is not too big. */ 1805*37da2899SCharles.Forsyth if ( k < num_glyphs && glyph_code < 256 ) 1806*37da2899SCharles.Forsyth { 1807*37da2899SCharles.Forsyth /* Assign code to GID mapping. */ 1808*37da2899SCharles.Forsyth encoding->codes[glyph_code] = (FT_UShort)k; 1809*37da2899SCharles.Forsyth 1810*37da2899SCharles.Forsyth /* Assign code to SID mapping. */ 1811*37da2899SCharles.Forsyth encoding->sids[glyph_code] = charset->sids[k]; 1812*37da2899SCharles.Forsyth } 1813*37da2899SCharles.Forsyth } 1814*37da2899SCharles.Forsyth } 1815*37da2899SCharles.Forsyth } 1816*37da2899SCharles.Forsyth break; 1817*37da2899SCharles.Forsyth 1818*37da2899SCharles.Forsyth default: 1819*37da2899SCharles.Forsyth FT_ERROR(( "cff_encoding_load: invalid table format!\n" )); 1820*37da2899SCharles.Forsyth error = CFF_Err_Invalid_File_Format; 1821*37da2899SCharles.Forsyth goto Exit; 1822*37da2899SCharles.Forsyth } 1823*37da2899SCharles.Forsyth 1824*37da2899SCharles.Forsyth /* Parse supplemental encodings, if any. */ 1825*37da2899SCharles.Forsyth if ( encoding->format & 0x80 ) 1826*37da2899SCharles.Forsyth { 1827*37da2899SCharles.Forsyth FT_UInt gindex; 1828*37da2899SCharles.Forsyth 1829*37da2899SCharles.Forsyth 1830*37da2899SCharles.Forsyth /* count supplements */ 1831*37da2899SCharles.Forsyth if ( FT_READ_BYTE( count ) ) 1832*37da2899SCharles.Forsyth goto Exit; 1833*37da2899SCharles.Forsyth 1834*37da2899SCharles.Forsyth for ( j = 0; j < count; j++ ) 1835*37da2899SCharles.Forsyth { 1836*37da2899SCharles.Forsyth /* Read supplemental glyph code. */ 1837*37da2899SCharles.Forsyth if ( FT_READ_BYTE( glyph_code ) ) 1838*37da2899SCharles.Forsyth goto Exit; 1839*37da2899SCharles.Forsyth 1840*37da2899SCharles.Forsyth /* Read the SID associated with this glyph code. */ 1841*37da2899SCharles.Forsyth if ( FT_READ_USHORT( glyph_sid ) ) 1842*37da2899SCharles.Forsyth goto Exit; 1843*37da2899SCharles.Forsyth 1844*37da2899SCharles.Forsyth /* Assign code to SID mapping. */ 1845*37da2899SCharles.Forsyth encoding->sids[glyph_code] = glyph_sid; 1846*37da2899SCharles.Forsyth 1847*37da2899SCharles.Forsyth /* First, lookup GID which has been assigned to */ 1848*37da2899SCharles.Forsyth /* SID glyph_sid. */ 1849*37da2899SCharles.Forsyth for ( gindex = 0; gindex < num_glyphs; gindex++ ) 1850*37da2899SCharles.Forsyth { 1851*37da2899SCharles.Forsyth if ( charset->sids[gindex] == glyph_sid ) 1852*37da2899SCharles.Forsyth { 1853*37da2899SCharles.Forsyth encoding->codes[glyph_code] = (FT_UShort) gindex; 1854*37da2899SCharles.Forsyth break; 1855*37da2899SCharles.Forsyth } 1856*37da2899SCharles.Forsyth } 1857*37da2899SCharles.Forsyth } 1858*37da2899SCharles.Forsyth } 1859*37da2899SCharles.Forsyth } 1860*37da2899SCharles.Forsyth else 1861*37da2899SCharles.Forsyth { 1862*37da2899SCharles.Forsyth FT_UInt i; 1863*37da2899SCharles.Forsyth 1864*37da2899SCharles.Forsyth 1865*37da2899SCharles.Forsyth /* We take into account the fact a CFF font can use a predefined */ 1866*37da2899SCharles.Forsyth /* encoding without containing all of the glyphs encoded by this */ 1867*37da2899SCharles.Forsyth /* encoding (see the note at the end of section 12 in the CFF */ 1868*37da2899SCharles.Forsyth /* specification). */ 1869*37da2899SCharles.Forsyth 1870*37da2899SCharles.Forsyth encoding->count = 256; 1871*37da2899SCharles.Forsyth 1872*37da2899SCharles.Forsyth switch ( (FT_UInt)offset ) 1873*37da2899SCharles.Forsyth { 1874*37da2899SCharles.Forsyth case 0: 1875*37da2899SCharles.Forsyth /* First, copy the code to SID mapping. */ 1876*37da2899SCharles.Forsyth FT_MEM_COPY( encoding->sids, cff_standard_encoding, 1877*37da2899SCharles.Forsyth 256 * sizeof ( FT_UShort ) ); 1878*37da2899SCharles.Forsyth 1879*37da2899SCharles.Forsyth goto Populate; 1880*37da2899SCharles.Forsyth 1881*37da2899SCharles.Forsyth case 1: 1882*37da2899SCharles.Forsyth /* First, copy the code to SID mapping. */ 1883*37da2899SCharles.Forsyth FT_MEM_COPY( encoding->sids, cff_expert_encoding, 1884*37da2899SCharles.Forsyth 256 * sizeof ( FT_UShort ) ); 1885*37da2899SCharles.Forsyth 1886*37da2899SCharles.Forsyth Populate: 1887*37da2899SCharles.Forsyth /* Construct code to GID mapping from code to SID mapping */ 1888*37da2899SCharles.Forsyth /* and charset. */ 1889*37da2899SCharles.Forsyth for ( j = 0; j < 256; j++ ) 1890*37da2899SCharles.Forsyth { 1891*37da2899SCharles.Forsyth /* If j is encoded, find the GID for it. */ 1892*37da2899SCharles.Forsyth if ( encoding->sids[j] ) 1893*37da2899SCharles.Forsyth { 1894*37da2899SCharles.Forsyth for ( i = 1; i < num_glyphs; i++ ) 1895*37da2899SCharles.Forsyth /* We matched, so break. */ 1896*37da2899SCharles.Forsyth if ( charset->sids[i] == encoding->sids[j] ) 1897*37da2899SCharles.Forsyth break; 1898*37da2899SCharles.Forsyth 1899*37da2899SCharles.Forsyth /* i will be equal to num_glyphs if we exited the above */ 1900*37da2899SCharles.Forsyth /* loop without a match. In this case, we also have to */ 1901*37da2899SCharles.Forsyth /* fix the code to SID mapping. */ 1902*37da2899SCharles.Forsyth if ( i == num_glyphs ) 1903*37da2899SCharles.Forsyth { 1904*37da2899SCharles.Forsyth encoding->codes[j] = 0; 1905*37da2899SCharles.Forsyth encoding->sids [j] = 0; 1906*37da2899SCharles.Forsyth } 1907*37da2899SCharles.Forsyth else 1908*37da2899SCharles.Forsyth encoding->codes[j] = (FT_UShort)i; 1909*37da2899SCharles.Forsyth } 1910*37da2899SCharles.Forsyth } 1911*37da2899SCharles.Forsyth break; 1912*37da2899SCharles.Forsyth 1913*37da2899SCharles.Forsyth default: 1914*37da2899SCharles.Forsyth FT_ERROR(( "cff_encoding_load: invalid table format!\n" )); 1915*37da2899SCharles.Forsyth error = CFF_Err_Invalid_File_Format; 1916*37da2899SCharles.Forsyth goto Exit; 1917*37da2899SCharles.Forsyth } 1918*37da2899SCharles.Forsyth } 1919*37da2899SCharles.Forsyth 1920*37da2899SCharles.Forsyth Exit: 1921*37da2899SCharles.Forsyth 1922*37da2899SCharles.Forsyth /* Clean up if there was an error. */ 1923*37da2899SCharles.Forsyth return error; 1924*37da2899SCharles.Forsyth } 1925*37da2899SCharles.Forsyth 1926*37da2899SCharles.Forsyth 1927*37da2899SCharles.Forsyth static FT_Error cff_subfont_load(CFF_SubFont font,CFF_Index idx,FT_UInt font_index,FT_Stream stream,FT_ULong base_offset)1928*37da2899SCharles.Forsyth cff_subfont_load( CFF_SubFont font, 1929*37da2899SCharles.Forsyth CFF_Index idx, 1930*37da2899SCharles.Forsyth FT_UInt font_index, 1931*37da2899SCharles.Forsyth FT_Stream stream, 1932*37da2899SCharles.Forsyth FT_ULong base_offset ) 1933*37da2899SCharles.Forsyth { 1934*37da2899SCharles.Forsyth FT_Error error; 1935*37da2899SCharles.Forsyth CFF_ParserRec parser; 1936*37da2899SCharles.Forsyth FT_Byte* dict; 1937*37da2899SCharles.Forsyth FT_ULong dict_len; 1938*37da2899SCharles.Forsyth CFF_FontRecDict top = &font->font_dict; 1939*37da2899SCharles.Forsyth CFF_Private priv = &font->private_dict; 1940*37da2899SCharles.Forsyth 1941*37da2899SCharles.Forsyth 1942*37da2899SCharles.Forsyth cff_parser_init( &parser, CFF_CODE_TOPDICT, &font->font_dict ); 1943*37da2899SCharles.Forsyth 1944*37da2899SCharles.Forsyth /* set defaults */ 1945*37da2899SCharles.Forsyth FT_MEM_ZERO( top, sizeof ( *top ) ); 1946*37da2899SCharles.Forsyth 1947*37da2899SCharles.Forsyth top->underline_position = -100; 1948*37da2899SCharles.Forsyth top->underline_thickness = 50; 1949*37da2899SCharles.Forsyth top->charstring_type = 2; 1950*37da2899SCharles.Forsyth top->font_matrix.xx = 0x10000L; 1951*37da2899SCharles.Forsyth top->font_matrix.yy = 0x10000L; 1952*37da2899SCharles.Forsyth top->cid_count = 8720; 1953*37da2899SCharles.Forsyth 1954*37da2899SCharles.Forsyth error = cff_index_access_element( idx, font_index, &dict, &dict_len ) || 1955*37da2899SCharles.Forsyth cff_parser_run( &parser, dict, dict + dict_len ); 1956*37da2899SCharles.Forsyth 1957*37da2899SCharles.Forsyth cff_index_forget_element( idx, &dict ); 1958*37da2899SCharles.Forsyth 1959*37da2899SCharles.Forsyth if ( error ) 1960*37da2899SCharles.Forsyth goto Exit; 1961*37da2899SCharles.Forsyth 1962*37da2899SCharles.Forsyth /* if it is a CID font, we stop there */ 1963*37da2899SCharles.Forsyth if ( top->cid_registry ) 1964*37da2899SCharles.Forsyth goto Exit; 1965*37da2899SCharles.Forsyth 1966*37da2899SCharles.Forsyth /* parse the private dictionary, if any */ 1967*37da2899SCharles.Forsyth if ( top->private_offset && top->private_size ) 1968*37da2899SCharles.Forsyth { 1969*37da2899SCharles.Forsyth /* set defaults */ 1970*37da2899SCharles.Forsyth FT_MEM_ZERO( priv, sizeof ( *priv ) ); 1971*37da2899SCharles.Forsyth 1972*37da2899SCharles.Forsyth priv->blue_shift = 7; 1973*37da2899SCharles.Forsyth priv->blue_fuzz = 1; 1974*37da2899SCharles.Forsyth priv->lenIV = -1; 1975*37da2899SCharles.Forsyth priv->expansion_factor = (FT_Fixed)0.06 * 0x10000L; 1976*37da2899SCharles.Forsyth priv->blue_scale = (FT_Fixed)0.039625 * 0x10000L; 1977*37da2899SCharles.Forsyth 1978*37da2899SCharles.Forsyth cff_parser_init( &parser, CFF_CODE_PRIVATE, priv ); 1979*37da2899SCharles.Forsyth 1980*37da2899SCharles.Forsyth if ( FT_STREAM_SEEK( base_offset + font->font_dict.private_offset ) || 1981*37da2899SCharles.Forsyth FT_FRAME_ENTER( font->font_dict.private_size ) ) 1982*37da2899SCharles.Forsyth goto Exit; 1983*37da2899SCharles.Forsyth 1984*37da2899SCharles.Forsyth error = cff_parser_run( &parser, 1985*37da2899SCharles.Forsyth (FT_Byte*)stream->cursor, 1986*37da2899SCharles.Forsyth (FT_Byte*)stream->limit ); 1987*37da2899SCharles.Forsyth FT_FRAME_EXIT(); 1988*37da2899SCharles.Forsyth if ( error ) 1989*37da2899SCharles.Forsyth goto Exit; 1990*37da2899SCharles.Forsyth } 1991*37da2899SCharles.Forsyth 1992*37da2899SCharles.Forsyth /* read the local subrs, if any */ 1993*37da2899SCharles.Forsyth if ( priv->local_subrs_offset ) 1994*37da2899SCharles.Forsyth { 1995*37da2899SCharles.Forsyth if ( FT_STREAM_SEEK( base_offset + top->private_offset + 1996*37da2899SCharles.Forsyth priv->local_subrs_offset ) ) 1997*37da2899SCharles.Forsyth goto Exit; 1998*37da2899SCharles.Forsyth 1999*37da2899SCharles.Forsyth error = cff_new_index( &font->local_subrs_index, stream, 1 ); 2000*37da2899SCharles.Forsyth if ( error ) 2001*37da2899SCharles.Forsyth goto Exit; 2002*37da2899SCharles.Forsyth 2003*37da2899SCharles.Forsyth font->num_local_subrs = font->local_subrs_index.count; 2004*37da2899SCharles.Forsyth error = cff_index_get_pointers( &font->local_subrs_index, 2005*37da2899SCharles.Forsyth &font->local_subrs ); 2006*37da2899SCharles.Forsyth if ( error ) 2007*37da2899SCharles.Forsyth goto Exit; 2008*37da2899SCharles.Forsyth } 2009*37da2899SCharles.Forsyth 2010*37da2899SCharles.Forsyth Exit: 2011*37da2899SCharles.Forsyth return error; 2012*37da2899SCharles.Forsyth } 2013*37da2899SCharles.Forsyth 2014*37da2899SCharles.Forsyth 2015*37da2899SCharles.Forsyth static void cff_subfont_done(FT_Memory memory,CFF_SubFont subfont)2016*37da2899SCharles.Forsyth cff_subfont_done( FT_Memory memory, 2017*37da2899SCharles.Forsyth CFF_SubFont subfont ) 2018*37da2899SCharles.Forsyth { 2019*37da2899SCharles.Forsyth if ( subfont ) 2020*37da2899SCharles.Forsyth { 2021*37da2899SCharles.Forsyth cff_done_index( &subfont->local_subrs_index ); 2022*37da2899SCharles.Forsyth FT_FREE( subfont->local_subrs ); 2023*37da2899SCharles.Forsyth } 2024*37da2899SCharles.Forsyth } 2025*37da2899SCharles.Forsyth 2026*37da2899SCharles.Forsyth 2027*37da2899SCharles.Forsyth FT_LOCAL_DEF( FT_Error ) cff_font_load(FT_Stream stream,FT_Int face_index,CFF_Font font)2028*37da2899SCharles.Forsyth cff_font_load( FT_Stream stream, 2029*37da2899SCharles.Forsyth FT_Int face_index, 2030*37da2899SCharles.Forsyth CFF_Font font ) 2031*37da2899SCharles.Forsyth { 2032*37da2899SCharles.Forsyth static const FT_Frame_Field cff_header_fields[] = 2033*37da2899SCharles.Forsyth { 2034*37da2899SCharles.Forsyth #undef FT_STRUCTURE 2035*37da2899SCharles.Forsyth #define FT_STRUCTURE CFF_FontRec 2036*37da2899SCharles.Forsyth 2037*37da2899SCharles.Forsyth FT_FRAME_START( 4 ), 2038*37da2899SCharles.Forsyth FT_FRAME_BYTE( version_major ), 2039*37da2899SCharles.Forsyth FT_FRAME_BYTE( version_minor ), 2040*37da2899SCharles.Forsyth FT_FRAME_BYTE( header_size ), 2041*37da2899SCharles.Forsyth FT_FRAME_BYTE( absolute_offsize ), 2042*37da2899SCharles.Forsyth FT_FRAME_END 2043*37da2899SCharles.Forsyth }; 2044*37da2899SCharles.Forsyth 2045*37da2899SCharles.Forsyth FT_Error error; 2046*37da2899SCharles.Forsyth FT_Memory memory = stream->memory; 2047*37da2899SCharles.Forsyth FT_ULong base_offset; 2048*37da2899SCharles.Forsyth CFF_FontRecDict dict; 2049*37da2899SCharles.Forsyth 2050*37da2899SCharles.Forsyth FT_ZERO( font ); 2051*37da2899SCharles.Forsyth 2052*37da2899SCharles.Forsyth font->stream = stream; 2053*37da2899SCharles.Forsyth font->memory = memory; 2054*37da2899SCharles.Forsyth dict = &font->top_font.font_dict; 2055*37da2899SCharles.Forsyth base_offset = FT_STREAM_POS(); 2056*37da2899SCharles.Forsyth 2057*37da2899SCharles.Forsyth /* read CFF font header */ 2058*37da2899SCharles.Forsyth if ( FT_STREAM_READ_FIELDS( cff_header_fields, font ) ) 2059*37da2899SCharles.Forsyth goto Exit; 2060*37da2899SCharles.Forsyth 2061*37da2899SCharles.Forsyth /* check format */ 2062*37da2899SCharles.Forsyth if ( font->version_major != 1 || 2063*37da2899SCharles.Forsyth font->header_size < 4 || 2064*37da2899SCharles.Forsyth font->absolute_offsize > 4 ) 2065*37da2899SCharles.Forsyth { 2066*37da2899SCharles.Forsyth FT_TRACE2(( "[not a CFF font header!]\n" )); 2067*37da2899SCharles.Forsyth error = CFF_Err_Unknown_File_Format; 2068*37da2899SCharles.Forsyth goto Exit; 2069*37da2899SCharles.Forsyth } 2070*37da2899SCharles.Forsyth 2071*37da2899SCharles.Forsyth /* skip the rest of the header */ 2072*37da2899SCharles.Forsyth if ( FT_STREAM_SKIP( font->header_size - 4 ) ) 2073*37da2899SCharles.Forsyth goto Exit; 2074*37da2899SCharles.Forsyth 2075*37da2899SCharles.Forsyth /* read the name, top dict, string and global subrs index */ 2076*37da2899SCharles.Forsyth if ( FT_SET_ERROR( cff_new_index( &font->name_index, stream, 0 )) || 2077*37da2899SCharles.Forsyth FT_SET_ERROR( cff_new_index( &font->font_dict_index, stream, 0 )) || 2078*37da2899SCharles.Forsyth FT_SET_ERROR( cff_new_index( &font->string_index, stream, 0 )) || 2079*37da2899SCharles.Forsyth FT_SET_ERROR( cff_new_index( &font->global_subrs_index, stream, 1 )) ) 2080*37da2899SCharles.Forsyth goto Exit; 2081*37da2899SCharles.Forsyth 2082*37da2899SCharles.Forsyth /* well, we don't really forget the `disabled' fonts... */ 2083*37da2899SCharles.Forsyth font->num_faces = font->name_index.count; 2084*37da2899SCharles.Forsyth if ( face_index >= (FT_Int)font->num_faces ) 2085*37da2899SCharles.Forsyth { 2086*37da2899SCharles.Forsyth FT_ERROR(( "cff_font_load: incorrect face index = %d\n", 2087*37da2899SCharles.Forsyth face_index )); 2088*37da2899SCharles.Forsyth error = CFF_Err_Invalid_Argument; 2089*37da2899SCharles.Forsyth } 2090*37da2899SCharles.Forsyth 2091*37da2899SCharles.Forsyth /* in case of a font format check, simply exit now */ 2092*37da2899SCharles.Forsyth if ( face_index < 0 ) 2093*37da2899SCharles.Forsyth goto Exit; 2094*37da2899SCharles.Forsyth 2095*37da2899SCharles.Forsyth /* now, parse the top-level font dictionary */ 2096*37da2899SCharles.Forsyth error = cff_subfont_load( &font->top_font, 2097*37da2899SCharles.Forsyth &font->font_dict_index, 2098*37da2899SCharles.Forsyth face_index, 2099*37da2899SCharles.Forsyth stream, 2100*37da2899SCharles.Forsyth base_offset ); 2101*37da2899SCharles.Forsyth if ( error ) 2102*37da2899SCharles.Forsyth goto Exit; 2103*37da2899SCharles.Forsyth 2104*37da2899SCharles.Forsyth /* now, check for a CID font */ 2105*37da2899SCharles.Forsyth if ( dict->cid_registry ) 2106*37da2899SCharles.Forsyth { 2107*37da2899SCharles.Forsyth CFF_IndexRec fd_index; 2108*37da2899SCharles.Forsyth CFF_SubFont sub; 2109*37da2899SCharles.Forsyth FT_UInt idx; 2110*37da2899SCharles.Forsyth 2111*37da2899SCharles.Forsyth 2112*37da2899SCharles.Forsyth /* this is a CID-keyed font, we must now allocate a table of */ 2113*37da2899SCharles.Forsyth /* sub-fonts, then load each of them separately */ 2114*37da2899SCharles.Forsyth if ( FT_STREAM_SEEK( base_offset + dict->cid_fd_array_offset ) ) 2115*37da2899SCharles.Forsyth goto Exit; 2116*37da2899SCharles.Forsyth 2117*37da2899SCharles.Forsyth error = cff_new_index( &fd_index, stream, 0 ); 2118*37da2899SCharles.Forsyth if ( error ) 2119*37da2899SCharles.Forsyth goto Exit; 2120*37da2899SCharles.Forsyth 2121*37da2899SCharles.Forsyth if ( fd_index.count > CFF_MAX_CID_FONTS ) 2122*37da2899SCharles.Forsyth { 2123*37da2899SCharles.Forsyth FT_ERROR(( "cff_font_load: FD array too large in CID font\n" )); 2124*37da2899SCharles.Forsyth goto Fail_CID; 2125*37da2899SCharles.Forsyth } 2126*37da2899SCharles.Forsyth 2127*37da2899SCharles.Forsyth /* allocate & read each font dict independently */ 2128*37da2899SCharles.Forsyth font->num_subfonts = fd_index.count; 2129*37da2899SCharles.Forsyth if ( FT_NEW_ARRAY( sub, fd_index.count ) ) 2130*37da2899SCharles.Forsyth goto Fail_CID; 2131*37da2899SCharles.Forsyth 2132*37da2899SCharles.Forsyth /* setup pointer table */ 2133*37da2899SCharles.Forsyth for ( idx = 0; idx < fd_index.count; idx++ ) 2134*37da2899SCharles.Forsyth font->subfonts[idx] = sub + idx; 2135*37da2899SCharles.Forsyth 2136*37da2899SCharles.Forsyth /* now load each sub font independently */ 2137*37da2899SCharles.Forsyth for ( idx = 0; idx < fd_index.count; idx++ ) 2138*37da2899SCharles.Forsyth { 2139*37da2899SCharles.Forsyth sub = font->subfonts[idx]; 2140*37da2899SCharles.Forsyth error = cff_subfont_load( sub, &fd_index, idx, 2141*37da2899SCharles.Forsyth stream, base_offset ); 2142*37da2899SCharles.Forsyth if ( error ) 2143*37da2899SCharles.Forsyth goto Fail_CID; 2144*37da2899SCharles.Forsyth } 2145*37da2899SCharles.Forsyth 2146*37da2899SCharles.Forsyth /* now load the FD Select array */ 2147*37da2899SCharles.Forsyth error = CFF_Load_FD_Select( &font->fd_select, 2148*37da2899SCharles.Forsyth (FT_UInt)dict->cid_count, 2149*37da2899SCharles.Forsyth stream, 2150*37da2899SCharles.Forsyth base_offset + dict->cid_fd_select_offset ); 2151*37da2899SCharles.Forsyth 2152*37da2899SCharles.Forsyth Fail_CID: 2153*37da2899SCharles.Forsyth cff_done_index( &fd_index ); 2154*37da2899SCharles.Forsyth 2155*37da2899SCharles.Forsyth if ( error ) 2156*37da2899SCharles.Forsyth goto Exit; 2157*37da2899SCharles.Forsyth } 2158*37da2899SCharles.Forsyth else 2159*37da2899SCharles.Forsyth font->num_subfonts = 0; 2160*37da2899SCharles.Forsyth 2161*37da2899SCharles.Forsyth /* read the charstrings index now */ 2162*37da2899SCharles.Forsyth if ( dict->charstrings_offset == 0 ) 2163*37da2899SCharles.Forsyth { 2164*37da2899SCharles.Forsyth FT_ERROR(( "cff_font_load: no charstrings offset!\n" )); 2165*37da2899SCharles.Forsyth error = CFF_Err_Unknown_File_Format; 2166*37da2899SCharles.Forsyth goto Exit; 2167*37da2899SCharles.Forsyth } 2168*37da2899SCharles.Forsyth 2169*37da2899SCharles.Forsyth if ( FT_STREAM_SEEK( base_offset + dict->charstrings_offset ) ) 2170*37da2899SCharles.Forsyth goto Exit; 2171*37da2899SCharles.Forsyth 2172*37da2899SCharles.Forsyth error = cff_new_index( &font->charstrings_index, stream, 0 ); 2173*37da2899SCharles.Forsyth if ( error ) 2174*37da2899SCharles.Forsyth goto Exit; 2175*37da2899SCharles.Forsyth 2176*37da2899SCharles.Forsyth /* explicit the global subrs */ 2177*37da2899SCharles.Forsyth font->num_global_subrs = font->global_subrs_index.count; 2178*37da2899SCharles.Forsyth font->num_glyphs = font->charstrings_index.count; 2179*37da2899SCharles.Forsyth 2180*37da2899SCharles.Forsyth error = cff_index_get_pointers( &font->global_subrs_index, 2181*37da2899SCharles.Forsyth &font->global_subrs ) ; 2182*37da2899SCharles.Forsyth 2183*37da2899SCharles.Forsyth if ( error ) 2184*37da2899SCharles.Forsyth goto Exit; 2185*37da2899SCharles.Forsyth 2186*37da2899SCharles.Forsyth /* read the Charset and Encoding tables when available */ 2187*37da2899SCharles.Forsyth if ( font->num_glyphs > 0 ) 2188*37da2899SCharles.Forsyth { 2189*37da2899SCharles.Forsyth error = cff_charset_load( &font->charset, font->num_glyphs, stream, 2190*37da2899SCharles.Forsyth base_offset, dict->charset_offset ); 2191*37da2899SCharles.Forsyth if ( error ) 2192*37da2899SCharles.Forsyth goto Exit; 2193*37da2899SCharles.Forsyth 2194*37da2899SCharles.Forsyth error = cff_encoding_load( &font->encoding, 2195*37da2899SCharles.Forsyth &font->charset, 2196*37da2899SCharles.Forsyth font->num_glyphs, 2197*37da2899SCharles.Forsyth stream, 2198*37da2899SCharles.Forsyth base_offset, 2199*37da2899SCharles.Forsyth dict->encoding_offset ); 2200*37da2899SCharles.Forsyth if ( error ) 2201*37da2899SCharles.Forsyth goto Exit; 2202*37da2899SCharles.Forsyth } 2203*37da2899SCharles.Forsyth 2204*37da2899SCharles.Forsyth /* get the font name */ 2205*37da2899SCharles.Forsyth font->font_name = cff_index_get_name( &font->name_index, face_index ); 2206*37da2899SCharles.Forsyth 2207*37da2899SCharles.Forsyth Exit: 2208*37da2899SCharles.Forsyth return error; 2209*37da2899SCharles.Forsyth } 2210*37da2899SCharles.Forsyth 2211*37da2899SCharles.Forsyth 2212*37da2899SCharles.Forsyth FT_LOCAL_DEF( void ) cff_font_done(CFF_Font font)2213*37da2899SCharles.Forsyth cff_font_done( CFF_Font font ) 2214*37da2899SCharles.Forsyth { 2215*37da2899SCharles.Forsyth FT_Memory memory = font->memory; 2216*37da2899SCharles.Forsyth FT_UInt idx; 2217*37da2899SCharles.Forsyth 2218*37da2899SCharles.Forsyth 2219*37da2899SCharles.Forsyth cff_done_index( &font->global_subrs_index ); 2220*37da2899SCharles.Forsyth cff_done_index( &font->string_index ); 2221*37da2899SCharles.Forsyth cff_done_index( &font->font_dict_index ); 2222*37da2899SCharles.Forsyth cff_done_index( &font->name_index ); 2223*37da2899SCharles.Forsyth cff_done_index( &font->charstrings_index ); 2224*37da2899SCharles.Forsyth 2225*37da2899SCharles.Forsyth /* release font dictionaries, but only if working with */ 2226*37da2899SCharles.Forsyth /* a CID keyed CFF font */ 2227*37da2899SCharles.Forsyth if ( font->num_subfonts > 0 ) 2228*37da2899SCharles.Forsyth { 2229*37da2899SCharles.Forsyth for ( idx = 0; idx < font->num_subfonts; idx++ ) 2230*37da2899SCharles.Forsyth cff_subfont_done( memory, font->subfonts[idx] ); 2231*37da2899SCharles.Forsyth 2232*37da2899SCharles.Forsyth FT_FREE( font->subfonts ); 2233*37da2899SCharles.Forsyth } 2234*37da2899SCharles.Forsyth 2235*37da2899SCharles.Forsyth cff_encoding_done( &font->encoding ); 2236*37da2899SCharles.Forsyth cff_charset_done( &font->charset, font->stream ); 2237*37da2899SCharles.Forsyth 2238*37da2899SCharles.Forsyth cff_subfont_done( memory, &font->top_font ); 2239*37da2899SCharles.Forsyth 2240*37da2899SCharles.Forsyth CFF_Done_FD_Select( &font->fd_select, font->stream ); 2241*37da2899SCharles.Forsyth 2242*37da2899SCharles.Forsyth FT_FREE( font->global_subrs ); 2243*37da2899SCharles.Forsyth FT_FREE( font->font_name ); 2244*37da2899SCharles.Forsyth } 2245*37da2899SCharles.Forsyth 2246*37da2899SCharles.Forsyth 2247*37da2899SCharles.Forsyth /* END */ 2248