• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
initNotOwnedString40     static void init(NotOwnedString* str) {
41         str->fBuffer = NULL;
42         str->fBytes = 0;
43     }
44 
initNotOwnedString45     static void init(NotOwnedString* str, const char* sz) {
46         str->fBuffer = (const unsigned char*)sz;
47         str->fBytes = strlen(sz);
48     }
49 
equalsNotOwnedString50     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 
TRACE_COMMENT(char ch)81 static void TRACE_COMMENT(char ch) {
82     printf("%c", ch);
83 }
84 
TRACE_TK(char ch)85 static void TRACE_TK(char ch) {
86     printf("%c", ch);
87 }
88 
TRACE_NAME(const unsigned char * start,const unsigned char * end)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 
TRACE_STRING(const unsigned char * start,const unsigned char * end)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 
TRACE_HEXSTRING(const unsigned char * start,const unsigned char * end)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