1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef OTS_CFF_TYPE2_CHARSTRING_H_ 6 #define OTS_CFF_TYPE2_CHARSTRING_H_ 7 8 #include "cff.h" 9 #include "ots.h" 10 11 #include <map> 12 #include <vector> 13 14 namespace ots { 15 16 // Validates all charstrings in |char_strings_index|. Charstring is a small 17 // language for font hinting defined in Adobe Technical Note #5177. 18 // http://www.adobe.com/devnet/font/pdfs/5177.Type2.pdf 19 // 20 // The validation will fail if one of the following conditions is met: 21 // 1. The code uses more than 48 values of argument stack. 22 // 2. The code uses deeply nested subroutine calls (more than 10 levels.) 23 // 3. The code passes invalid number of operands to an operator. 24 // 4. The code calls an undefined global or local subroutine. 25 // 5. The code uses one of the following operators that are unlikely used in 26 // an ordinary fonts, and could be dangerous: random, put, get, index, roll. 27 // 28 // Arguments: 29 // global_subrs_index: Global subroutines which could be called by a charstring 30 // in |char_strings_index|. 31 // fd_select: A map from glyph # to font #. 32 // local_subrs_per_font: A list of Local Subrs associated with FDArrays. Can be 33 // empty. 34 // local_subrs: A Local Subrs associated with Top DICT. Can be NULL. 35 // cff_table: A buffer which contains actual byte code of charstring, global 36 // subroutines and local subroutines. 37 bool ValidateType2CharStringIndex( 38 const CFFIndex &char_strings_index, 39 const CFFIndex &global_subrs_index, 40 const std::map<uint16_t, uint8_t> &fd_select, 41 const std::vector<CFFIndex *> &local_subrs_per_font, 42 const CFFIndex *local_subrs, 43 Buffer *cff_table); 44 45 // The list of Operators. See Appendix. A in Adobe Technical Note #5177. 46 enum Type2CharStringOperator { 47 kHStem = 1, 48 kVStem = 3, 49 kVMoveTo = 4, 50 kRLineTo = 5, 51 kHLineTo = 6, 52 kVLineTo = 7, 53 kRRCurveTo = 8, 54 kCallSubr = 10, 55 kReturn = 11, 56 kEndChar = 14, 57 kHStemHm = 18, 58 kHintMask = 19, 59 kCntrMask = 20, 60 kRMoveTo = 21, 61 kHMoveTo = 22, 62 kVStemHm = 23, 63 kRCurveLine = 24, 64 kRLineCurve = 25, 65 kVVCurveTo = 26, 66 kHHCurveTo = 27, 67 kCallGSubr = 29, 68 kVHCurveTo = 30, 69 kHVCurveTo = 31, 70 kAnd = (12 << 8) + 3, 71 kOr = (12 << 8) + 4, 72 kNot = (12 << 8) + 5, 73 kAbs = (12 << 8) + 9, 74 kAdd = (12 << 8) + 10, 75 kSub = (12 << 8) + 11, 76 kDiv = (12 << 8) + 12, 77 kNeg = (12 << 8) + 14, 78 kEq = (12 << 8) + 15, 79 kDrop = (12 << 8) + 18, 80 kPut = (12 << 8) + 20, 81 kGet = (12 << 8) + 21, 82 kIfElse = (12 << 8) + 22, 83 kRandom = (12 << 8) + 23, 84 kMul = (12 << 8) + 24, 85 kSqrt = (12 << 8) + 26, 86 kDup = (12 << 8) + 27, 87 kExch = (12 << 8) + 28, 88 kIndex = (12 << 8) + 29, 89 kRoll = (12 << 8) + 30, 90 kHFlex = (12 << 8) + 34, 91 kFlex = (12 << 8) + 35, 92 kHFlex1 = (12 << 8) + 36, 93 kFlex1 = (12 << 8) + 37, 94 // Operators that are obsoleted or undocumented, such as 'blend', will be 95 // rejected. 96 }; 97 98 } // namespace ots 99 100 #endif // OTS_CFF_TYPE2_CHARSTRING_H_ 101