Index: third_party/ots/src/cff_type2_charstring.h |
diff --git a/third_party/ots/src/cff_type2_charstring.h b/third_party/ots/src/cff_type2_charstring.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..673234257bd57f454f1189333a9154351309e949 |
--- /dev/null |
+++ b/third_party/ots/src/cff_type2_charstring.h |
@@ -0,0 +1,101 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#ifndef OTS_CFF_TYPE2_CHARSTRING_H_ |
+#define OTS_CFF_TYPE2_CHARSTRING_H_ |
+ |
+#include "cff.h" |
+#include "ots.h" |
+ |
+#include <map> |
+#include <vector> |
+ |
+namespace ots { |
+ |
+// Validates all charstrings in |char_strings_index|. Charstring is a small |
+// language for font hinting defined in Adobe Technical Note #5177. |
+// http://www.adobe.com/devnet/font/pdfs/5177.Type2.pdf |
+// |
+// The validation will fail if one of the following conditions is met: |
+// 1. The code uses more than 48 values of argument stack. |
+// 2. The code uses deeply nested subroutine calls (more than 10 levels.) |
+// 3. The code passes invalid number of operands to an operator. |
+// 4. The code calls an undefined global or local subroutine. |
+// 5. The code uses one of the following operators that are unlikely used in |
+// an ordinary fonts, and could be dangerous: random, put, get, index, roll. |
+// |
+// Arguments: |
+// global_subrs_index: Global subroutines which could be called by a charstring |
+// in |char_strings_index|. |
+// fd_select: A map from glyph # to font #. |
+// local_subrs_per_font: A list of Local Subrs associated with FDArrays. Can be |
+// empty. |
+// local_subrs: A Local Subrs associated with Top DICT. Can be NULL. |
+// cff_table: A buffer which contains actual byte code of charstring, global |
+// subroutines and local subroutines. |
+bool ValidateType2CharStringIndex( |
+ OpenTypeFile *file, |
+ const CFFIndex &char_strings_index, |
+ const CFFIndex &global_subrs_index, |
+ const std::map<uint16_t, uint8_t> &fd_select, |
+ const std::vector<CFFIndex *> &local_subrs_per_font, |
+ const CFFIndex *local_subrs, |
+ Buffer *cff_table); |
+ |
+// The list of Operators. See Appendix. A in Adobe Technical Note #5177. |
+enum Type2CharStringOperator { |
+ kHStem = 1, |
+ kVStem = 3, |
+ kVMoveTo = 4, |
+ kRLineTo = 5, |
+ kHLineTo = 6, |
+ kVLineTo = 7, |
+ kRRCurveTo = 8, |
+ kCallSubr = 10, |
+ kReturn = 11, |
+ kEndChar = 14, |
+ kHStemHm = 18, |
+ kHintMask = 19, |
+ kCntrMask = 20, |
+ kRMoveTo = 21, |
+ kHMoveTo = 22, |
+ kVStemHm = 23, |
+ kRCurveLine = 24, |
+ kRLineCurve = 25, |
+ kVVCurveTo = 26, |
+ kHHCurveTo = 27, |
+ kCallGSubr = 29, |
+ kVHCurveTo = 30, |
+ kHVCurveTo = 31, |
+ kDotSection = 12 << 8, |
+ kAnd = (12 << 8) + 3, |
+ kOr = (12 << 8) + 4, |
+ kNot = (12 << 8) + 5, |
+ kAbs = (12 << 8) + 9, |
+ kAdd = (12 << 8) + 10, |
+ kSub = (12 << 8) + 11, |
+ kDiv = (12 << 8) + 12, |
+ kNeg = (12 << 8) + 14, |
+ kEq = (12 << 8) + 15, |
+ kDrop = (12 << 8) + 18, |
+ kPut = (12 << 8) + 20, |
+ kGet = (12 << 8) + 21, |
+ kIfElse = (12 << 8) + 22, |
+ kRandom = (12 << 8) + 23, |
+ kMul = (12 << 8) + 24, |
+ kSqrt = (12 << 8) + 26, |
+ kDup = (12 << 8) + 27, |
+ kExch = (12 << 8) + 28, |
+ kIndex = (12 << 8) + 29, |
+ kRoll = (12 << 8) + 30, |
+ kHFlex = (12 << 8) + 34, |
+ kFlex = (12 << 8) + 35, |
+ kHFlex1 = (12 << 8) + 36, |
+ kFlex1 = (12 << 8) + 37, |
+ // Operators that are undocumented, such as 'blend', will be rejected. |
+}; |
+ |
+} // namespace ots |
+ |
+#endif // OTS_CFF_TYPE2_CHARSTRING_H_ |