Index: Source/platform/fonts/opentype/OpenTypeSanitizer.cpp |
diff --git a/Source/platform/fonts/opentype/OpenTypeSanitizer.cpp b/Source/platform/fonts/opentype/OpenTypeSanitizer.cpp |
index c5e71ae45976e36add0d0c78f017cdfcaa0c23f9..d210f1fb5aedf645e2d320bf6b6d288917e46258 100644 |
--- a/Source/platform/fonts/opentype/OpenTypeSanitizer.cpp |
+++ b/Source/platform/fonts/opentype/OpenTypeSanitizer.cpp |
@@ -77,9 +77,14 @@ PassRefPtr<SharedBuffer> OpenTypeSanitizer::sanitize() |
double start = currentTime(); |
BlinkOTSContext otsContext; |
- if (!otsContext.Process(&output, reinterpret_cast<const uint8_t*>(m_buffer->data()), m_buffer->size())) |
+ if (!otsContext.Process(&output, reinterpret_cast<const uint8_t*>(m_buffer->data()), m_buffer->size())) { |
+ setParsingError(true); |
+ setErrorString(otsContext.getErrorString()); |
return nullptr; |
+ } |
+ setParsingError(false); |
+ setErrorString(otsContext.getErrorString()); |
const size_t transcodeLen = output.Tell(); |
recordDecodeSpeedHistogram(m_buffer, currentTime() - start, transcodeLen); |
return SharedBuffer::create(static_cast<unsigned char*>(output.get()), transcodeLen); |
@@ -90,4 +95,54 @@ bool OpenTypeSanitizer::supportsFormat(const String& format) |
return equalIgnoringCase(format, "woff") || equalIgnoringCase(format, "woff2"); |
} |
+void BlinkOTSContext::Message(int level, const char *format, ...) |
+{ |
+ va_list args; |
+ va_start(args, format); |
+ |
+#if COMPILER(MSVC) |
+ int result = _vscprintf(format, args); |
+#else |
+ char ch; |
+ int result = vsnprintf(&ch, 1, format, args); |
+#endif |
+ va_end(args); |
+ |
+ if (result <= 0) { |
+ m_errorString = String("OTS Error"); |
+ } else { |
+ Vector<char, 256> buffer; |
+ unsigned len = result; |
+ buffer.grow(len + 1); |
+ |
+ va_start(args, format); |
+ vsnprintf(buffer.data(), buffer.size(), format, args); |
+ va_end(args); |
+ m_errorString = StringImpl::create(reinterpret_cast<const LChar*>(buffer.data()), len); |
+ } |
+} |
+ |
+ots::TableAction BlinkOTSContext::GetTableAction(uint32_t tag) |
+{ |
+#define TABLE_TAG(c1, c2, c3, c4) ((uint32_t)((((uint8_t)(c1)) << 24) | (((uint8_t)(c2)) << 16) | (((uint8_t)(c3)) << 8) | ((uint8_t)(c4)))) |
+ |
+ const uint32_t cbdtTag = TABLE_TAG('C', 'B', 'D', 'T'); |
+ const uint32_t cblcTag = TABLE_TAG('C', 'B', 'L', 'C'); |
+ const uint32_t colrTag = TABLE_TAG('C', 'O', 'L', 'R'); |
+ const uint32_t cpalTag = TABLE_TAG('C', 'P', 'A', 'L'); |
+ |
+ switch (tag) { |
+ // Google Color Emoji Tables |
+ case cbdtTag: |
+ case cblcTag: |
+ // Windows Color Emoji Tables |
+ case colrTag: |
+ case cpalTag: |
+ return ots::TABLE_ACTION_PASSTHRU; |
+ default: |
+ return ots::TABLE_ACTION_DEFAULT; |
+ } |
+#undef TABLE_TAG |
+} |
+ |
} // namespace blink |