| /* |
| * Copyright 2013 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef SkPdfUtils_DEFINED |
| #define SkPdfUtils_DEFINED |
| |
| #include "SkMatrix.h" |
| #include "SkRect.h" |
| #include "SkPdfConfig.h" |
| #include "SkString.h" |
| |
| class SkPdfArray; |
| class SkPdfContext; |
| class SkCanvas; |
| class SkPdfNativeObject; |
| |
| // TODO(edisonn): temporary code, to report how much of the PDF we actually think we rendered. |
| enum SkPdfResult { |
| kOK_SkPdfResult, |
| kPartial_SkPdfResult, |
| kNYI_SkPdfResult, |
| kIgnoreError_SkPdfResult, |
| kError_SkPdfResult, |
| kUnsupported_SkPdfResult, |
| |
| kCount_SkPdfResult |
| }; |
| |
| // In order to operate fast, when we parse the pdf, we try not to allocate many new strings, |
| // and if possible we refer the string in the pdf stream. |
| struct NotOwnedString { |
| const unsigned char* fBuffer; |
| // TODO(edisonn): clean up, the last two bytes are used to signal if compression is used |
| size_t fBytes; |
| |
| static void init(NotOwnedString* str) { |
| str->fBuffer = NULL; |
| str->fBytes = 0; |
| } |
| |
| static void init(NotOwnedString* str, const char* sz) { |
| str->fBuffer = (const unsigned char*)sz; |
| str->fBytes = strlen(sz); |
| } |
| |
| bool equals(const char* sz) { |
| return strncmp((const char*)fBuffer, sz, fBytes) == 0 && fBytes == strlen(sz); |
| |
| } |
| }; |
| |
| SkMatrix SkMatrixFromPdfMatrix(double array[6]); |
| |
| // TODO(edisonn): hack to make code generation simpler. Alternatively we can update the |
| // generate_code.py not to rely on != operator |
| bool operator !=(const SkString& first, const char* second); |
| |
| SkMatrix SkMatrixFromPdfArray(SkPdfArray* pdfArray); |
| |
| SkPdfResult doType3Char(SkPdfContext* pdfContext, SkCanvas* canvas, const SkPdfNativeObject* skobj, |
| SkRect bBox, SkMatrix matrix, double textSize); |
| |
| //////////////////////////////////////////////////////////////////////////////////////////////////// |
| // |
| // TRACE functions |
| // |
| #ifdef PDF_TRACE |
| void SkTraceMatrix(const SkMatrix& matrix, const char* sz); |
| void SkTraceRect(const SkRect& rect, const char* sz); |
| #else |
| #define SkTraceMatrix(a,b) |
| #define SkTraceRect(a,b) |
| #endif |
| |
| #ifdef PDF_TRACE_TOKENIZER |
| |
| static void TRACE_COMMENT(char ch) { |
| printf("%c", ch); |
| } |
| |
| static void TRACE_TK(char ch) { |
| printf("%c", ch); |
| } |
| |
| static void TRACE_NAME(const unsigned char* start, const unsigned char* end) { |
| while (start < end) { |
| printf("%c", *start); |
| start++; |
| } |
| printf("\n"); |
| } |
| |
| static void TRACE_STRING(const unsigned char* start, const unsigned char* end) { |
| while (start < end) { |
| printf("%c", *start); |
| start++; |
| } |
| printf("\n"); |
| } |
| |
| static void TRACE_HEXSTRING(const unsigned char* start, const unsigned char* end) { |
| while (start < end) { |
| printf("%c", *start); |
| start++; |
| } |
| printf("\n"); |
| } |
| |
| #else |
| #define TRACE_COMMENT(ch) |
| #define TRACE_TK(ch) |
| #define TRACE_NAME(start,end) |
| #define TRACE_STRING(start,end) |
| #define TRACE_HEXSTRING(start,end) |
| #endif |
| |
| #endif // SkPdfUtils_DEFINED |