Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Side by Side Diff: experimental/PdfViewer/SkPdfFont.h

Issue 18323019: work on the native parser, in progress, uploaded to have a backup (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « experimental/PdfViewer/SkPdfBasics.h ('k') | experimental/PdfViewer/SkPdfFont.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #ifndef __DEFINED__SkPdfFont 1 #ifndef __DEFINED__SkPdfFont
2 #define __DEFINED__SkPdfFont 2 #define __DEFINED__SkPdfFont
3 3
4 #include "SkPdfHeaders_autogen.h" 4 #include "SkPdfHeaders_autogen.h"
5 #include "SkPdfMapper_autogen.h" 5 #include "SkPdfMapper_autogen.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 9
10 #include "SkTypeface.h" 10 #include "SkTypeface.h"
(...skipping 11 matching lines...) Expand all
22 22
23 23
24 struct SkPdfStandardFontEntry { 24 struct SkPdfStandardFontEntry {
25 const char* fName; 25 const char* fName;
26 bool fIsBold; 26 bool fIsBold;
27 bool fIsItalic; 27 bool fIsItalic;
28 }; 28 };
29 29
30 std::map<std::string, SkPdfStandardFontEntry>& getStandardFonts(); 30 std::map<std::string, SkPdfStandardFontEntry>& getStandardFonts();
31 SkTypeface* SkTypefaceFromPdfStandardFont(const char* fontName, bool bold, bool italic); 31 SkTypeface* SkTypefaceFromPdfStandardFont(const char* fontName, bool bold, bool italic);
32 SkPdfFont* fontFromName(SkPdfObject* obj, const char* fontName); 32 SkPdfFont* fontFromName(SkNativeParsedPDF* doc, SkPdfObject* obj, const char* fo ntName);
33 33
34 struct SkUnencodedText { 34 struct SkUnencodedText {
35 void* text; 35 void* text;
36 int len; 36 int len;
37 37
38 public: 38 public:
39 SkUnencodedText(const SkPdfString* obj) { 39 SkUnencodedText(const SkPdfString* obj) {
40 text = (void*)obj->c_str(); 40 text = (void*)obj->c_str();
41 len = obj->len(); 41 len = obj->len();
42 } 42 }
(...skipping 18 matching lines...) Expand all
61 61
62 class SkPdfEncoding { 62 class SkPdfEncoding {
63 public: 63 public:
64 virtual bool decodeText(const SkUnencodedText& textIn, SkDecodedText* textOu t) const = 0; 64 virtual bool decodeText(const SkUnencodedText& textIn, SkDecodedText* textOu t) const = 0;
65 static SkPdfEncoding* fromName(const char* name); 65 static SkPdfEncoding* fromName(const char* name);
66 }; 66 };
67 67
68 std::map<std::string, SkPdfEncoding*>& getStandardEncodings(); 68 std::map<std::string, SkPdfEncoding*>& getStandardEncodings();
69 69
70 class SkPdfToUnicode { 70 class SkPdfToUnicode {
71 SkNativeParsedPDF* fParsed;
71 // TODO(edisonn): hide public members 72 // TODO(edisonn): hide public members
72 public: 73 public:
73 unsigned short* fCMapEncoding; 74 unsigned short* fCMapEncoding;
74 unsigned char* fCMapEncodingFlag; 75 unsigned char* fCMapEncodingFlag;
75 76
76 SkPdfToUnicode(const SkPdfStream* stream); 77 SkPdfToUnicode(SkNativeParsedPDF* parsed, SkPdfStream* stream);
77 }; 78 };
78 79
79 80
80 class SkPdfIdentityHEncoding : public SkPdfEncoding { 81 class SkPdfIdentityHEncoding : public SkPdfEncoding {
81 public: 82 public:
82 virtual bool decodeText(const SkUnencodedText& textIn, SkDecodedText* textOu t) const { 83 virtual bool decodeText(const SkUnencodedText& textIn, SkDecodedText* textOu t) const {
83 // TODO(edisonn): SkASSERT(textIn.len % 2 == 0); or report error? 84 // TODO(edisonn): SkASSERT(textIn.len % 2 == 0); or report error?
84 85
85 uint16_t* text = (uint16_t*)textIn.text; 86 uint16_t* text = (uint16_t*)textIn.text;
86 textOut->text = new uint16_t[textIn.len / 2]; 87 textOut->text = new uint16_t[textIn.len / 2];
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
120 static SkPdfDefaultEncoding* inst = new SkPdfDefaultEncoding(); 121 static SkPdfDefaultEncoding* inst = new SkPdfDefaultEncoding();
121 return inst; 122 return inst;
122 } 123 }
123 }; 124 };
124 125
125 class SkPdfCIDToGIDMapIdentityEncoding : public SkPdfEncoding { 126 class SkPdfCIDToGIDMapIdentityEncoding : public SkPdfEncoding {
126 public: 127 public:
127 virtual bool decodeText(const SkUnencodedText& textIn, SkDecodedText* textOu t) const { 128 virtual bool decodeText(const SkUnencodedText& textIn, SkDecodedText* textOu t) const {
128 // TODO(edisonn): SkASSERT(textIn.len % 2 == 0); or report error? 129 // TODO(edisonn): SkASSERT(textIn.len % 2 == 0); or report error?
129 130
130 unsigned char* text = (unsigned char*)textIn.text; 131 uint16_t* text = (uint16_t*)textIn.text;
131 textOut->text = new uint16_t[textIn.len]; 132 textOut->text = new uint16_t[textIn.len / 2];
132 textOut->len = textIn.len; 133 textOut->len = textIn.len / 2;
133 134
134 for (int i = 0; i < textOut->len; i++) { 135 for (int i = 0; i < textOut->len; i++) {
135 textOut->text[i] = text[i]; 136 textOut->text[i] = ((text[i] << 8) & 0xff00) | ((text[i] >> 8) & 0x0 0ff);
136 } 137 }
137 138
138 return true; 139 return true;
139 } 140 }
140 141
141 static SkPdfCIDToGIDMapIdentityEncoding* instance() { 142 static SkPdfCIDToGIDMapIdentityEncoding* instance() {
142 static SkPdfCIDToGIDMapIdentityEncoding* inst = new SkPdfCIDToGIDMapIden tityEncoding(); 143 static SkPdfCIDToGIDMapIdentityEncoding* inst = new SkPdfCIDToGIDMapIden tityEncoding();
143 return inst; 144 return inst;
144 } 145 }
145 }; 146 };
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
178 }; 179 };
179 180
180 inline unsigned int ToUnicode(unsigned int ch) const { 181 inline unsigned int ToUnicode(unsigned int ch) const {
181 if (fToUnicode) { 182 if (fToUnicode) {
182 return fToUnicode->fCMapEncoding[ch]; 183 return fToUnicode->fCMapEncoding[ch];
183 } else { 184 } else {
184 return ch; 185 return ch;
185 } 186 }
186 }; 187 };
187 188
188 static SkPdfFont* fontFromPdfDictionary(SkPdfFontDictionary* dict); 189 static SkPdfFont* fontFromPdfDictionary(SkNativeParsedPDF* doc, SkPdfFontDic tionary* dict);
189 static SkPdfFont* Default() {return fontFromName(NULL, "TimesNewRoman");} 190 static SkPdfFont* Default() {return fontFromName(NULL, NULL, "TimesNewRoman" );}
190 191
191 static SkPdfType0Font* fontFromType0FontDictionary(SkPdfType0FontDictionary* dict); 192 static SkPdfType0Font* fontFromType0FontDictionary(SkNativeParsedPDF* doc, S kPdfType0FontDictionary* dict);
192 static SkPdfType1Font* fontFromType1FontDictionary(SkPdfType1FontDictionary* dict); 193 static SkPdfType1Font* fontFromType1FontDictionary(SkNativeParsedPDF* doc, S kPdfType1FontDictionary* dict);
193 static SkPdfType3Font* fontFromType3FontDictionary(SkPdfType3FontDictionary* dict); 194 static SkPdfType3Font* fontFromType3FontDictionary(SkNativeParsedPDF* doc, S kPdfType3FontDictionary* dict);
194 static SkPdfTrueTypeFont* fontFromTrueTypeFontDictionary(SkPdfTrueTypeFontDi ctionary* dict); 195 static SkPdfTrueTypeFont* fontFromTrueTypeFontDictionary(SkNativeParsedPDF* doc, SkPdfTrueTypeFontDictionary* dict);
195 static SkPdfMultiMasterFont* fontFromMultiMasterFontDictionary(SkPdfMultiMas terFontDictionary* dict); 196 static SkPdfMultiMasterFont* fontFromMultiMasterFontDictionary(SkNativeParse dPDF* doc, SkPdfMultiMasterFontDictionary* dict);
196 197
197 static SkPdfFont* fontFromFontDescriptor(SkPdfFontDescriptorDictionary* fd, bool loadFromName = true); 198 static SkPdfFont* fontFromFontDescriptor(SkNativeParsedPDF* doc, SkPdfFontDe scriptorDictionary* fd, bool loadFromName = true);
198 199
199 public: 200 public:
200 virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfC ontext, SkCanvas* canvas) = 0; 201 virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfC ontext, SkCanvas* canvas) = 0;
201 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) = 0; 202 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) = 0;
203
204 private:
205 static SkPdfFont* fontFromPdfDictionaryOnce(SkNativeParsedPDF* doc, SkPdfFon tDictionary* dict);
202 }; 206 };
203 207
204 class SkPdfStandardFont : public SkPdfFont { 208 class SkPdfStandardFont : public SkPdfFont {
205 SkTypeface* fTypeface; 209 SkTypeface* fTypeface;
206 210
207 public: 211 public:
208 SkPdfStandardFont(SkTypeface* typeface) : fTypeface(typeface) {} 212 SkPdfStandardFont(SkTypeface* typeface) : fTypeface(typeface) {}
209 213
210 public: 214 public:
211 virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfC ontext, SkCanvas* canvas) { 215 virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfC ontext, SkCanvas* canvas) {
212 paint->setTypeface(fTypeface); 216 paint->setTypeface(fTypeface);
213 paint->setTextEncoding(SkPaint::kUTF8_TextEncoding); 217 paint->setTextEncoding(SkPaint::kUTF8_TextEncoding);
214 218
215 unsigned long ch4 = ch; 219 unsigned long ch4 = ch;
216 char utf8[10]; 220 char utf8[10];
217 int len = SkUTF8_FromUnichar(ch4, utf8); 221 int len = SkUTF8_FromUnichar(ch4, utf8);
218 222
219 canvas->drawText(utf8, len, SkDoubleToScalar(0), SkDoubleToScalar(0), *p aint); 223 canvas->drawText(utf8, len, SkDoubleToScalar(0), SkDoubleToScalar(0), *p aint);
220 224
221 SkScalar textWidth = paint->measureText(utf8, len); 225 SkScalar textWidth = paint->measureText(utf8, len);
222 return SkScalarToDouble(textWidth); 226 return SkScalarToDouble(textWidth);
223 } 227 }
224 228
225 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) {} 229 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) {}
226 }; 230 };
227 231
228 class SkPdfType0Font : public SkPdfFont { 232 class SkPdfType0Font : public SkPdfFont {
229 public: 233 public:
230 SkPdfType0Font(SkPdfType0FontDictionary* dict); 234 SkPdfType0Font(SkNativeParsedPDF* doc, SkPdfType0FontDictionary* dict);
231 235
232 public: 236 public:
233 237
234 virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfC ontext, SkCanvas* canvas) { 238 virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfC ontext, SkCanvas* canvas) {
235 return fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canvas); 239 return fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canvas);
236 } 240 }
237 241
238 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { 242 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) {
239 } 243 }
240 }; 244 };
241 245
242 class SkPdfType1Font : public SkPdfFont { 246 class SkPdfType1Font : public SkPdfFont {
243 public: 247 public:
244 SkPdfType1Font(SkPdfType1FontDictionary* dict) { 248 SkPdfType1Font(SkNativeParsedPDF* doc, SkPdfType1FontDictionary* dict) {
245 if (dict->has_FontDescriptor()) { 249 if (dict->has_FontDescriptor()) {
246 fBaseFont = SkPdfFont::fontFromFontDescriptor(dict->FontDescriptor() ); 250 fBaseFont = SkPdfFont::fontFromFontDescriptor(doc, dict->FontDescrip tor(doc));
247 } else { 251 } else {
248 fBaseFont = fontFromName(dict, dict->BaseFont().c_str()); 252 fBaseFont = fontFromName(doc, dict, dict->BaseFont(doc).c_str());
249 } 253 }
250 } 254 }
251 255
252 public: 256 public:
253 virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pd fContext, SkCanvas* canvas) { 257 virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pd fContext, SkCanvas* canvas) {
254 return fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canvas ); 258 return fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canvas );
255 } 259 }
256 260
257 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { 261 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) {
258 262
259 } 263 }
260 }; 264 };
261 265
262 class SkPdfTrueTypeFont : public SkPdfType1Font { 266 class SkPdfTrueTypeFont : public SkPdfType1Font {
263 public: 267 public:
264 SkPdfTrueTypeFont(SkPdfTrueTypeFontDictionary* dict) : SkPdfType1Font(dict) { 268 SkPdfTrueTypeFont(SkNativeParsedPDF* doc, SkPdfTrueTypeFontDictionary* dict) : SkPdfType1Font(doc, dict) {
265 } 269 }
266 }; 270 };
267 271
268 class SkPdfMultiMasterFont : public SkPdfType1Font { 272 class SkPdfMultiMasterFont : public SkPdfType1Font {
269 public: 273 public:
270 SkPdfMultiMasterFont(SkPdfMultiMasterFontDictionary* dict) : SkPdfType1Font( dict) { 274 SkPdfMultiMasterFont(SkNativeParsedPDF* doc, SkPdfMultiMasterFontDictionary* dict) : SkPdfType1Font(doc, dict) {
271 } 275 }
272 }; 276 };
273 /* 277 /*
274 class CIDToGIDMap { 278 class CIDToGIDMap {
275 virtual unsigned int map(unsigned int cid) = 0; 279 virtual unsigned int map(unsigned int cid) = 0;
276 static CIDToGIDMap* fromName(const char* name); 280 static CIDToGIDMap* fromName(const char* name);
277 }; 281 };
278 282
279 class CIDToGIDMap_Identity { 283 class CIDToGIDMap_Identity {
280 virtual unsigned int map(unsigned int cid) { return cid; } 284 virtual unsigned int map(unsigned int cid) { return cid; }
(...skipping 14 matching lines...) Expand all
295 // TODO(edisonn): warning/report 299 // TODO(edisonn): warning/report
296 printf("Unknown CIDToGIDMap: %s\n", name); 300 printf("Unknown CIDToGIDMap: %s\n", name);
297 #endif 301 #endif
298 return NULL; 302 return NULL;
299 } 303 }
300 CIDToGIDMap* fCidToGid; 304 CIDToGIDMap* fCidToGid;
301 */ 305 */
302 306
303 class SkPdfType3Font : public SkPdfFont { 307 class SkPdfType3Font : public SkPdfFont {
304 struct Type3FontChar { 308 struct Type3FontChar {
305 SkPdfObject* fObj; 309 const SkPdfObject* fObj;
306 double fWidth; 310 double fWidth;
307 }; 311 };
308 312
309 SkPdfDictionary* fCharProcs; 313 SkPdfDictionary* fCharProcs;
310 SkPdfEncodingDictionary* fEncodingDict; 314 SkPdfEncodingDictionary* fEncodingDict;
311 unsigned int fFirstChar; 315 unsigned int fFirstChar;
312 unsigned int fLastChar; 316 unsigned int fLastChar;
313 317
314 SkRect fFontBBox; 318 SkRect fFontBBox;
315 SkMatrix fFonMatrix; 319 SkMatrix fFonMatrix;
316 320
317 Type3FontChar* fChars; 321 Type3FontChar* fChars;
318 322
319 public: 323 public:
320 SkPdfType3Font(SkPdfType3FontDictionary* dict) { 324 SkPdfType3Font(SkNativeParsedPDF* parsed, SkPdfType3FontDictionary* dict) {
321 fBaseFont = fontFromName(dict, dict->BaseFont().c_str()); 325 fBaseFont = fontFromName(parsed, dict, dict->BaseFont(parsed).c_str());
322 326
323 if (dict->has_Encoding()) { 327 if (dict->has_Encoding()) {
324 if (dict->isEncodingAName()) { 328 if (dict->isEncodingAName(parsed)) {
325 fEncoding = SkPdfEncoding::fromName(dict->getEncodingAsName().c _str()); 329 fEncoding = SkPdfEncoding::fromName(dict->getEncodingAsName(par sed).c_str());
326 } else if (dict->isEncodingAEncodingdictionary()) { 330 } else if (dict->isEncodingAEncodingdictionary(parsed)) {
327 // technically, there is no encoding. 331 // technically, there is no encoding.
328 fEncoding = SkPdfCIDToGIDMapIdentityEncoding::instance(); 332 fEncoding = SkPdfCIDToGIDMapIdentityEncoding::instance();
329 fEncodingDict = dict->getEncodingAsEncodingdictionary(); 333 fEncodingDict = dict->getEncodingAsEncodingdictionary(parsed);
330 } 334 }
331 } 335 }
332 336
333 // null? 337 // null?
334 fCharProcs = dict->CharProcs(); 338 fCharProcs = dict->CharProcs(parsed);
335 339
336 fToUnicode = NULL; 340 fToUnicode = NULL;
337 if (dict->has_ToUnicode()) { 341 if (dict->has_ToUnicode()) {
338 fToUnicode = new SkPdfToUnicode(dict->ToUnicode()); 342 fToUnicode = new SkPdfToUnicode(parsed, dict->ToUnicode(parsed));
339 } 343 }
340 344
341 fFirstChar = dict->FirstChar(); 345 fFirstChar = dict->FirstChar(parsed);
342 fLastChar = dict->LastChar(); 346 fLastChar = dict->LastChar(parsed);
343 fFonMatrix = dict->has_FontMatrix() ? *dict->FontMatrix() : SkMatrix::I( ); 347 fFonMatrix = dict->has_FontMatrix() ? dict->FontMatrix(parsed) : SkMatri x::I();
344 348
345 if (dict->FontBBox()) { 349 if (dict->has_FontBBox()) {
346 fFontBBox = *dict->FontBBox(); 350 fFontBBox = dict->FontBBox(parsed);
347 } 351 }
348 352
349 fChars = new Type3FontChar[fLastChar - fFirstChar + 1]; 353 fChars = new Type3FontChar[fLastChar - fFirstChar + 1];
350 354
351 memset(fChars, 0, sizeof(fChars[0]) * (fLastChar - fFirstChar + 1)); 355 memset(fChars, 0, sizeof(fChars[0]) * (fLastChar - fFirstChar + 1));
352 356
353 357
354 SkPdfArray* widths = dict->Widths(); 358 const SkPdfArray* widths = dict->Widths(parsed);
355 for (int i = 0 ; i < widths->size(); i++) { 359 for (unsigned int i = 0 ; i < widths->size(); i++) {
356 if ((fFirstChar + i) < fFirstChar || (fFirstChar + i) > fLastChar) { 360 if ((fFirstChar + i) < fFirstChar || (fFirstChar + i) > fLastChar) {
357 printf("break; error 1\n"); 361 printf("break; error 1\n");
358 } 362 }
359 fChars[i].fWidth = (*widths)[i]->asNumber()->value(); 363 fChars[i].fWidth = (*widths)[i]->numberValue();
360 } 364 }
361 365
362 SkPdfArray* diffs = fEncodingDict->Differences(); 366 const SkPdfArray* diffs = fEncodingDict->Differences(parsed);
363 int j = fFirstChar; 367 unsigned int j = fFirstChar;
364 for (int i = 0 ; i < diffs->size(); i++) { 368 for (unsigned int i = 0 ; i < diffs->size(); i++) {
365 if ((*diffs)[i]->asInteger()) { 369 if ((*diffs)[i]->isInteger()) {
366 j = (*diffs)[i]->asInteger()->value(); 370 j = (*diffs)[i]->intValue();
367 } else if ((*diffs)[i]->asName()) { 371 } else if ((*diffs)[i]->isName()) {
368 if (j < fFirstChar || j > fLastChar) { 372 if (j < fFirstChar || j > fLastChar) {
369 printf("break; error 2\n"); 373 printf("break; error 2\n");
370 } 374 }
371 fChars[j - fFirstChar].fObj = fCharProcs->get((*diffs)[i]->asNam e()->value().c_str()); 375 fChars[j - fFirstChar].fObj = fCharProcs->get((*diffs)[i]->nameV alue());
372 j++; 376 j++;
373 } else { 377 } else {
374 // err 378 // err
375 } 379 }
376 } 380 }
377 } 381 }
378 382
379 public: 383 public:
380 virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfC ontext, SkCanvas* canvas) { 384 virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfC ontext, SkCanvas* canvas) {
381 if (ch < fFirstChar || ch > fLastChar || !fChars[ch - fFirstChar].fObj) { 385 if (ch < fFirstChar || ch > fLastChar || !fChars[ch - fFirstChar].fObj) {
382 return fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canv as); 386 return fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canv as);
383 } 387 }
384 388
385 #ifdef PDF_TRACE 389 #ifdef PDF_TRACE
386 printf("Type 3 char to unicode: %c\n", ToUnicode(ch)); 390 printf("Type 3 char to unicode: %c\n", ToUnicode(ch));
387 if (ToUnicode(ch) == 'A') { 391 if (ToUnicode(ch) == 'A') {
388 printf("break;\n"); 392 printf("break;\n");
389 } 393 }
390 #endif 394 #endif
391 395
392 doType3Char(pdfContext, canvas, fChars[ch - fFirstChar].fObj, fFontBBox, fFonMatrix, pdfContext->fGraphicsState.fCurFontSize); 396 // TODO(edisonn): is it better to resolve the reference at load time, or now?
397 doType3Char(pdfContext, canvas, pdfContext->fPdfDoc->resolveReference(fC hars[ch - fFirstChar].fObj), fFontBBox, fFonMatrix, pdfContext->fGraphicsState.f CurFontSize);
393 398
394 // TODO(edisonn): verify/test translate code, not tested yet 399 // TODO(edisonn): verify/test translate code, not tested yet
395 pdfContext->fGraphicsState.fMatrixTm.preTranslate(SkDoubleToScalar(pdfCo ntext->fGraphicsState.fCurFontSize * fChars[ch - fFirstChar].fWidth), 400 pdfContext->fGraphicsState.fMatrixTm.preTranslate(SkDoubleToScalar(pdfCo ntext->fGraphicsState.fCurFontSize * fChars[ch - fFirstChar].fWidth),
396 SkDoubleToScalar(0.0)); 401 SkDoubleToScalar(0.0));
402 return fChars[ch - fFirstChar].fWidth;
397 } 403 }
398 404
399 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { 405 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) {
400 406
401 } 407 }
402 }; 408 };
403 409
404 #endif // __DEFINED__SkPdfFont 410 #endif // __DEFINED__SkPdfFont
OLDNEW
« no previous file with comments | « experimental/PdfViewer/SkPdfBasics.h ('k') | experimental/PdfViewer/SkPdfFont.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698