Index: src/cff.cc |
=================================================================== |
--- src/cff.cc (revision 86) |
+++ src/cff.cc (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+// Copyright (c) 2012 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. |
@@ -11,8 +11,8 @@ |
#include "cff_type2_charstring.h" |
// CFF - PostScript font program (Compact Font Format) table |
-// http://www.microsoft.com/opentype/otspec/cff.htm |
-// http://www.microsoft.com/opentype/otspec/5176.CFF.pdf |
+// http://www.microsoft.com/typography/otspec/cff.htm |
+// http://www.microsoft.com/typography/otspec/cffspec.htm |
namespace { |
@@ -27,6 +27,12 @@ |
DICT_DATA_FDARRAY, |
}; |
+enum FONT_FORMAT { |
+ FORMAT_UNKNOWN, |
+ FORMAT_CID_KEYED, |
+ FORMAT_OTHER, // Including synthetic fonts |
+}; |
+ |
// see Appendix. A |
const size_t kNStdString = 390; |
@@ -464,6 +470,7 @@ |
std::vector<std::pair<uint32_t, DICT_OPERAND_TYPE> > operands; |
+ FONT_FORMAT font_format = FORMAT_UNKNOWN; |
bool have_ros = false; |
size_t glyphs = 0; |
size_t charset_offset = 0; |
@@ -522,6 +529,10 @@ |
case (12U << 8) + 5: // PaintType |
case (12U << 8) + 8: // StrokeWidth |
case (12U << 8) + 20: // SyntheticBase |
+ if (operands.size() != 1) { |
+ return OTS_FAILURE(); |
+ } |
+ break; |
case (12U << 8) + 31: // CIDFontVersion |
case (12U << 8) + 32: // CIDFontRevision |
case (12U << 8) + 33: // CIDFontType |
@@ -530,6 +541,9 @@ |
if (operands.size() != 1) { |
return OTS_FAILURE(); |
} |
+ if (font_format != FORMAT_CID_KEYED) { |
+ return OTS_FAILURE(); |
+ } |
break; |
case (12U << 8) + 6: // CharstringType |
if (operands.size() != 1) { |
@@ -780,9 +794,10 @@ |
// ROS |
case (12U << 8) + 30: |
- if (type != DICT_DATA_TOPLEVEL) { |
+ if (font_format != FORMAT_UNKNOWN) { |
return OTS_FAILURE(); |
} |
+ font_format = FORMAT_CID_KEYED; |
if (operands.size() != 3) { |
return OTS_FAILURE(); |
} |
@@ -805,6 +820,10 @@ |
return OTS_FAILURE(); |
} |
operands.clear(); |
+ |
+ if (font_format == FORMAT_UNKNOWN) { |
+ font_format = FORMAT_OTHER; |
+ } |
} |
// parse "13. Charsets" |