1 /* 2 * Copyright 2013 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef SkPdfUtils_DEFINED 9 #define SkPdfUtils_DEFINED 10 11 #include "SkMatrix.h" 12 #include "SkRect.h" 13 #include "SkPdfConfig.h" 14 #include "SkString.h" 15 16 class SkPdfArray; 17 class SkPdfContext; 18 class SkCanvas; 19 class SkPdfNativeObject; 20 21 // TODO(edisonn): temporary code, to report how much of the PDF we actually think we rendered. 22 enum SkPdfResult { 23 kOK_SkPdfResult, 24 kPartial_SkPdfResult, 25 kNYI_SkPdfResult, 26 kIgnoreError_SkPdfResult, 27 kError_SkPdfResult, 28 kUnsupported_SkPdfResult, 29 30 kCount_SkPdfResult 31 }; 32 33 // In order to operate fast, when we parse the pdf, we try not to allocate many new strings, 34 // and if possible we refer the string in the pdf stream. 35 struct NotOwnedString { 36 const unsigned char* fBuffer; 37 // TODO(edisonn): clean up, the last two bytes are used to signal if compression is used 38 size_t fBytes; 39 40 static void init(NotOwnedString* str) { 41 str->fBuffer = NULL; 42 str->fBytes = 0; 43 } 44 45 static void init(NotOwnedString* str, const char* sz) { 46 str->fBuffer = (const unsigned char*)sz; 47 str->fBytes = strlen(sz); 48 } 49 50 bool equals(const char* sz) { 51 return strncmp((const char*)fBuffer, sz, fBytes) == 0 && fBytes == strlen(sz); 52 53 } 54 }; 55 56 SkMatrix SkMatrixFromPdfMatrix(double array[6]); 57 58 // TODO(edisonn): hack to make code generation simpler. Alternatively we can update the 59 // generate_code.py not to rely on != operator 60 bool operator !=(const SkString& first, const char* second); 61 62 SkMatrix SkMatrixFromPdfArray(SkPdfArray* pdfArray); 63 64 SkPdfResult doType3Char(SkPdfContext* pdfContext, SkCanvas* canvas, const SkPdfNativeObject* skobj, 65 SkRect bBox, SkMatrix matrix, double textSize); 66 67 //////////////////////////////////////////////////////////////////////////////////////////////////// 68 // 69 // TRACE functions 70 // 71 #ifdef PDF_TRACE 72 void SkTraceMatrix(const SkMatrix& matrix, const char* sz); 73 void SkTraceRect(const SkRect& rect, const char* sz); 74 #else 75 #define SkTraceMatrix(a,b) 76 #define SkTraceRect(a,b) 77 #endif 78 79 #ifdef PDF_TRACE_TOKENIZER 80 81 static void TRACE_COMMENT(char ch) { 82 printf("%c", ch); 83 } 84 85 static void TRACE_TK(char ch) { 86 printf("%c", ch); 87 } 88 89 static void TRACE_NAME(const unsigned char* start, const unsigned char* end) { 90 while (start < end) { 91 printf("%c", *start); 92 start++; 93 } 94 printf("\n"); 95 } 96 97 static void TRACE_STRING(const unsigned char* start, const unsigned char* end) { 98 while (start < end) { 99 printf("%c", *start); 100 start++; 101 } 102 printf("\n"); 103 } 104 105 static void TRACE_HEXSTRING(const unsigned char* start, const unsigned char* end) { 106 while (start < end) { 107 printf("%c", *start); 108 start++; 109 } 110 printf("\n"); 111 } 112 113 #else 114 #define TRACE_COMMENT(ch) 115 #define TRACE_TK(ch) 116 #define TRACE_NAME(start,end) 117 #define TRACE_STRING(start,end) 118 #define TRACE_HEXSTRING(start,end) 119 #endif 120 121 #endif // SkPdfUtils_DEFINED 122