| OLD | NEW |
| 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" |
| 11 #include "SkUtils.h" | 11 #include "SkUtils.h" |
| 12 #include "SkPdfBasics.h" | 12 #include "SkPdfGraphicsState.h" |
| 13 #include "SkPdfUtils.h" | 13 #include "SkPdfUtils.h" |
| 14 | 14 |
| 15 | 15 |
| 16 class SkPdfType0Font; | 16 class SkPdfType0Font; |
| 17 class SkPdfType1Font; | 17 class SkPdfType1Font; |
| 18 class SkPdfType3Font; | 18 class SkPdfType3Font; |
| 19 class SkPdfTrueTypeFont; | 19 class SkPdfTrueTypeFont; |
| 20 class SkPdfMultiMasterFont; | 20 class SkPdfMultiMasterFont; |
| 21 class SkPdfFont; | 21 class SkPdfFont; |
| 22 | 22 |
| 23 struct SkPdfStandardFontEntry { | 23 struct SkPdfStandardFontEntry { |
| 24 // We don't own this pointer! | 24 // We don't own this pointer! |
| 25 const char* fName; | 25 const char* fName; |
| 26 bool fIsBold; | 26 bool fIsBold; |
| 27 bool fIsItalic; | 27 bool fIsItalic; |
| 28 SkPdfStandardFontEntry() | 28 SkPdfStandardFontEntry() |
| 29 : fName(NULL), | 29 : fName(NULL), |
| 30 fIsBold(false), | 30 fIsBold(false), |
| 31 fIsItalic(false) {} | 31 fIsItalic(false) {} |
| 32 | 32 |
| 33 SkPdfStandardFontEntry(const char* name, bool bold, bool italic) | 33 SkPdfStandardFontEntry(const char* name, bool bold, bool italic) |
| 34 : fName(name), | 34 : fName(name), |
| 35 fIsBold(bold), | 35 fIsBold(bold), |
| 36 fIsItalic(italic) {} | 36 fIsItalic(italic) {} |
| 37 }; | 37 }; |
| 38 | 38 |
| 39 std::map<std::string, SkPdfStandardFontEntry>& getStandardFonts(); | 39 std::map<std::string, SkPdfStandardFontEntry>& getStandardFonts(); |
| 40 SkTypeface* SkTypefaceFromPdfStandardFont(const char* fontName, bool bold, bool
italic); | 40 SkTypeface* SkTypefaceFromPdfStandardFont(const char* fontName, bool bold, bool
italic); |
| 41 SkPdfFont* fontFromName(SkNativeParsedPDF* doc, SkPdfObject* obj, const char* fo
ntName); | 41 SkPdfFont* fontFromName(SkPdfNativeDoc* doc, SkPdfNativeObject* obj, const char*
fontName); |
| 42 | 42 |
| 43 struct SkUnencodedText { | 43 struct SkUnencodedText { |
| 44 void* text; | 44 void* text; |
| 45 int len; | 45 int len; |
| 46 | 46 |
| 47 public: | 47 public: |
| 48 SkUnencodedText(const SkPdfString* obj) { | 48 SkUnencodedText(const SkPdfString* obj) { |
| 49 text = (void*)obj->c_str(); | 49 text = (void*)obj->c_str(); |
| 50 len = obj->lenstr(); | 50 len = obj->lenstr(); |
| 51 } | 51 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 70 | 70 |
| 71 class SkPdfEncoding { | 71 class SkPdfEncoding { |
| 72 public: | 72 public: |
| 73 virtual bool decodeText(const SkUnencodedText& textIn, SkDecodedText* textOu
t) const = 0; | 73 virtual bool decodeText(const SkUnencodedText& textIn, SkDecodedText* textOu
t) const = 0; |
| 74 static SkPdfEncoding* fromName(const char* name); | 74 static SkPdfEncoding* fromName(const char* name); |
| 75 }; | 75 }; |
| 76 | 76 |
| 77 std::map<std::string, SkPdfEncoding*>& getStandardEncodings(); | 77 std::map<std::string, SkPdfEncoding*>& getStandardEncodings(); |
| 78 | 78 |
| 79 class SkPdfToUnicode { | 79 class SkPdfToUnicode { |
| 80 SkNativeParsedPDF* fParsed; | 80 SkPdfNativeDoc* fParsed; |
| 81 // TODO(edisonn): hide public members | 81 // TODO(edisonn): hide public members |
| 82 public: | 82 public: |
| 83 unsigned short* fCMapEncoding; | 83 unsigned short* fCMapEncoding; |
| 84 unsigned char* fCMapEncodingFlag; | 84 unsigned char* fCMapEncodingFlag; |
| 85 | 85 |
| 86 SkPdfToUnicode(SkNativeParsedPDF* parsed, SkPdfStream* stream); | 86 SkPdfToUnicode(SkPdfNativeDoc* parsed, SkPdfStream* stream); |
| 87 }; | 87 }; |
| 88 | 88 |
| 89 | 89 |
| 90 class SkPdfIdentityHEncoding : public SkPdfEncoding { | 90 class SkPdfIdentityHEncoding : public SkPdfEncoding { |
| 91 public: | 91 public: |
| 92 virtual bool decodeText(const SkUnencodedText& textIn, SkDecodedText* textOu
t) const { | 92 virtual bool decodeText(const SkUnencodedText& textIn, SkDecodedText* textOu
t) const { |
| 93 // TODO(edisonn): SkASSERT(textIn.len % 2 == 0); or report error? | 93 // TODO(edisonn): SkASSERT(textIn.len % 2 == 0); or report error? |
| 94 | 94 |
| 95 uint16_t* text = (uint16_t*)textIn.text; | 95 uint16_t* text = (uint16_t*)textIn.text; |
| 96 textOut->text = new uint16_t[textIn.len / 2]; | 96 textOut->text = new uint16_t[textIn.len / 2]; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 | 163 |
| 164 public: | 164 public: |
| 165 SkPdfFont() : fBaseFont(NULL), fEncoding(SkPdfDefaultEncoding::instance()),
fToUnicode(NULL) {} | 165 SkPdfFont() : fBaseFont(NULL), fEncoding(SkPdfDefaultEncoding::instance()),
fToUnicode(NULL) {} |
| 166 | 166 |
| 167 virtual ~SkPdfFont() { | 167 virtual ~SkPdfFont() { |
| 168 // TODO(edisonn): NYI (will leak for now) | 168 // TODO(edisonn): NYI (will leak for now) |
| 169 } | 169 } |
| 170 | 170 |
| 171 const SkPdfEncoding* encoding() const {return fEncoding;} | 171 const SkPdfEncoding* encoding() const {return fEncoding;} |
| 172 | 172 |
| 173 void drawText(const SkDecodedText& text, SkPaint* paint, PdfContext* pdfCont
ext, SkCanvas* canvas) { | 173 void drawText(const SkDecodedText& text, SkPaint* paint, SkPdfContext* pdfCo
ntext, SkCanvas* canvas) { |
| 174 for (int i = 0 ; i < text.size(); i++) { | 174 for (int i = 0 ; i < text.size(); i++) { |
| 175 canvas->setMatrix(pdfContext->fGraphicsState.fMatrixTm); | 175 canvas->setMatrix(pdfContext->fGraphicsState.fMatrixTm); |
| 176 #ifdef PDF_TRACE | 176 #ifdef PDF_TRACE |
| 177 SkPoint point = SkPoint::Make(SkDoubleToScalar(0), SkDoubleToScalar(
0)); | 177 SkPoint point = SkPoint::Make(SkDoubleToScalar(0), SkDoubleToScalar(
0)); |
| 178 pdfContext->fGraphicsState.fMatrixTm.mapPoints(&point, 1); | 178 pdfContext->fGraphicsState.fMatrixTm.mapPoints(&point, 1); |
| 179 printf("DrawText at (%f, %f)\n", SkScalarToDouble(point.x()), SkScal
arToDouble(point.y())); | 179 printf("DrawText at (%f, %f)\n", SkScalarToDouble(point.x()), SkScal
arToDouble(point.y())); |
| 180 #endif // PDF_TRACE | 180 #endif // PDF_TRACE |
| 181 |
| 182 #ifdef PDF_TRACE_DRAWTEXT |
| 183 SkPaint col; |
| 184 col.setColor(SK_ColorMAGENTA); |
| 185 SkRect rect = SkRect::MakeXYWH(SkDoubleToScalar(0.0), SkDoubleToScal
ar(0.0), SkDoubleToScalar(10.0), SkDoubleToScalar(10.0)); |
| 186 canvas->save(); |
| 187 canvas->setMatrix(pdfContext->fGraphicsState.fMatrixTm); |
| 188 canvas->drawRect(rect, col); |
| 189 canvas->restore(); |
| 190 #endif |
| 181 double width = drawOneChar(text[i], paint, pdfContext, canvas); | 191 double width = drawOneChar(text[i], paint, pdfContext, canvas); |
| 182 pdfContext->fGraphicsState.fMatrixTm.preTranslate(SkDoubleToScalar(w
idth), SkDoubleToScalar(0.0)); | 192 pdfContext->fGraphicsState.fMatrixTm.preTranslate(SkDoubleToScalar(w
idth), SkDoubleToScalar(0.0)); |
| 183 } | 193 } |
| 184 } | 194 } |
| 185 | 195 |
| 186 void ToUnicode(const SkDecodedText& textIn, SkUnicodeText* textOut) const { | 196 void ToUnicode(const SkDecodedText& textIn, SkUnicodeText* textOut) const { |
| 187 if (fToUnicode) { | 197 if (fToUnicode) { |
| 188 textOut->text = new uint16_t[textIn.len]; | 198 textOut->text = new uint16_t[textIn.len]; |
| 189 textOut->len = textIn.len; | 199 textOut->len = textIn.len; |
| 190 for (int i = 0; i < textIn.len; i++) { | 200 for (int i = 0; i < textIn.len; i++) { |
| 191 textOut->text[i] = fToUnicode->fCMapEncoding[textIn.text[i]]; | 201 textOut->text[i] = fToUnicode->fCMapEncoding[textIn.text[i]]; |
| 192 } | 202 } |
| 193 } else { | 203 } else { |
| 194 textOut->text = textIn.text; | 204 textOut->text = textIn.text; |
| 195 textOut->len = textIn.len; | 205 textOut->len = textIn.len; |
| 196 } | 206 } |
| 197 }; | 207 }; |
| 198 | 208 |
| 199 inline unsigned int ToUnicode(unsigned int ch) const { | 209 inline unsigned int ToUnicode(unsigned int ch) const { |
| 200 if (fToUnicode) { | 210 if (fToUnicode) { |
| 201 return fToUnicode->fCMapEncoding[ch]; | 211 return fToUnicode->fCMapEncoding[ch]; |
| 202 } else { | 212 } else { |
| 203 return ch; | 213 return ch; |
| 204 } | 214 } |
| 205 }; | 215 }; |
| 206 | 216 |
| 207 static SkPdfFont* fontFromPdfDictionary(SkNativeParsedPDF* doc, SkPdfFontDic
tionary* dict); | 217 static SkPdfFont* fontFromPdfDictionary(SkPdfNativeDoc* doc, SkPdfFontDictio
nary* dict); |
| 208 static SkPdfFont* Default() {return fontFromName(NULL, NULL, "TimesNewRoman"
);} | 218 static SkPdfFont* Default() {return fontFromName(NULL, NULL, "TimesNewRoman"
);} |
| 209 | 219 |
| 210 static SkPdfType0Font* fontFromType0FontDictionary(SkNativeParsedPDF* doc, S
kPdfType0FontDictionary* dict); | 220 static SkPdfType0Font* fontFromType0FontDictionary(SkPdfNativeDoc* doc, SkPd
fType0FontDictionary* dict); |
| 211 static SkPdfType1Font* fontFromType1FontDictionary(SkNativeParsedPDF* doc, S
kPdfType1FontDictionary* dict); | 221 static SkPdfType1Font* fontFromType1FontDictionary(SkPdfNativeDoc* doc, SkPd
fType1FontDictionary* dict); |
| 212 static SkPdfType3Font* fontFromType3FontDictionary(SkNativeParsedPDF* doc, S
kPdfType3FontDictionary* dict); | 222 static SkPdfType3Font* fontFromType3FontDictionary(SkPdfNativeDoc* doc, SkPd
fType3FontDictionary* dict); |
| 213 static SkPdfTrueTypeFont* fontFromTrueTypeFontDictionary(SkNativeParsedPDF*
doc, SkPdfTrueTypeFontDictionary* dict); | 223 static SkPdfTrueTypeFont* fontFromTrueTypeFontDictionary(SkPdfNativeDoc* doc
, SkPdfTrueTypeFontDictionary* dict); |
| 214 static SkPdfMultiMasterFont* fontFromMultiMasterFontDictionary(SkNativeParse
dPDF* doc, SkPdfMultiMasterFontDictionary* dict); | 224 static SkPdfMultiMasterFont* fontFromMultiMasterFontDictionary(SkPdfNativeDo
c* doc, SkPdfMultiMasterFontDictionary* dict); |
| 215 | 225 |
| 216 static SkPdfFont* fontFromFontDescriptor(SkNativeParsedPDF* doc, SkPdfFontDe
scriptorDictionary* fd, bool loadFromName = true); | 226 static SkPdfFont* fontFromFontDescriptor(SkPdfNativeDoc* doc, SkPdfFontDescr
iptorDictionary* fd, bool loadFromName = true); |
| 217 | 227 |
| 218 public: | 228 public: |
| 219 virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfC
ontext, SkCanvas* canvas) = 0; | 229 virtual double drawOneChar(unsigned int ch, SkPaint* paint, SkPdfContext* pd
fContext, SkCanvas* canvas) = 0; |
| 220 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) = 0; | 230 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) = 0; |
| 221 | 231 |
| 222 private: | 232 private: |
| 223 static SkPdfFont* fontFromPdfDictionaryOnce(SkNativeParsedPDF* doc, SkPdfFon
tDictionary* dict); | 233 static SkPdfFont* fontFromPdfDictionaryOnce(SkPdfNativeDoc* doc, SkPdfFontDi
ctionary* dict); |
| 224 }; | 234 }; |
| 225 | 235 |
| 226 class SkPdfStandardFont : public SkPdfFont { | 236 class SkPdfStandardFont : public SkPdfFont { |
| 227 SkTypeface* fTypeface; | 237 SkTypeface* fTypeface; |
| 228 | 238 |
| 229 public: | 239 public: |
| 230 SkPdfStandardFont(SkTypeface* typeface) : fTypeface(typeface) {} | 240 SkPdfStandardFont(SkTypeface* typeface) : fTypeface(typeface) {} |
| 231 | 241 |
| 232 public: | 242 public: |
| 233 virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfC
ontext, SkCanvas* canvas) { | 243 virtual double drawOneChar(unsigned int ch, SkPaint* paint, SkPdfContext* pd
fContext, SkCanvas* canvas) { |
| 234 paint->setTypeface(fTypeface); | 244 paint->setTypeface(fTypeface); |
| 235 paint->setTextEncoding(SkPaint::kUTF8_TextEncoding); | 245 paint->setTextEncoding(SkPaint::kUTF8_TextEncoding); |
| 236 | 246 |
| 237 unsigned long ch4 = ch; | 247 unsigned long ch4 = ch; |
| 238 char utf8[10]; | 248 char utf8[10]; |
| 239 int len = SkUTF8_FromUnichar(ch4, utf8); | 249 int len = SkUTF8_FromUnichar(ch4, utf8); |
| 240 | 250 |
| 241 canvas->drawText(utf8, len, SkDoubleToScalar(0), SkDoubleToScalar(0), *p
aint); | 251 canvas->drawText(utf8, len, SkDoubleToScalar(0), SkDoubleToScalar(0), *p
aint); |
| 242 | 252 |
| 243 SkScalar textWidth = paint->measureText(utf8, len); | 253 SkScalar textWidth = paint->measureText(utf8, len); |
| 244 return SkScalarToDouble(textWidth); | 254 return SkScalarToDouble(textWidth); |
| 245 } | 255 } |
| 246 | 256 |
| 247 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) {} | 257 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) {} |
| 248 }; | 258 }; |
| 249 | 259 |
| 250 class SkPdfType0Font : public SkPdfFont { | 260 class SkPdfType0Font : public SkPdfFont { |
| 251 public: | 261 public: |
| 252 SkPdfType0Font(SkNativeParsedPDF* doc, SkPdfType0FontDictionary* dict); | 262 SkPdfType0Font(SkPdfNativeDoc* doc, SkPdfType0FontDictionary* dict); |
| 253 | 263 |
| 254 public: | 264 public: |
| 255 | 265 |
| 256 virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfC
ontext, SkCanvas* canvas) { | 266 virtual double drawOneChar(unsigned int ch, SkPaint* paint, SkPdfContext* pd
fContext, SkCanvas* canvas) { |
| 257 return fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canvas); | 267 return fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canvas); |
| 258 } | 268 } |
| 259 | 269 |
| 260 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { | 270 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { |
| 261 } | 271 } |
| 262 }; | 272 }; |
| 263 | 273 |
| 264 class SkPdfType1Font : public SkPdfFont { | 274 class SkPdfType1Font : public SkPdfFont { |
| 265 public: | 275 public: |
| 266 SkPdfType1Font(SkNativeParsedPDF* doc, SkPdfType1FontDictionary* dict) { | 276 SkPdfType1Font(SkPdfNativeDoc* doc, SkPdfType1FontDictionary* dict) { |
| 267 if (dict->has_FontDescriptor()) { | 277 if (dict->has_FontDescriptor()) { |
| 268 fBaseFont = SkPdfFont::fontFromFontDescriptor(doc, dict->FontDescrip
tor(doc)); | 278 fBaseFont = SkPdfFont::fontFromFontDescriptor(doc, dict->FontDescrip
tor(doc)); |
| 269 } else { | 279 } else { |
| 270 fBaseFont = fontFromName(doc, dict, dict->BaseFont(doc).c_str()); | 280 fBaseFont = fontFromName(doc, dict, dict->BaseFont(doc).c_str()); |
| 271 } | 281 } |
| 282 |
| 283 if (dict->isEncodingAName(doc)) { |
| 284 fEncoding = SkPdfEncoding::fromName(dict->getEncodingAsName(doc).c_s
tr()); |
| 285 } else if (dict->isEncodingADictionary(doc)) { |
| 286 //SkPdfDictionary* dictEnc = dict->getEncodingAsDictionary(doc); |
| 287 } |
| 288 dict->FontDescriptor(doc); |
| 272 } | 289 } |
| 273 | 290 |
| 274 public: | 291 public: |
| 275 virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pd
fContext, SkCanvas* canvas) { | 292 virtual double drawOneChar(unsigned int ch, SkPaint* paint, SkPdfContext*
pdfContext, SkCanvas* canvas) { |
| 276 return fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canvas
); | 293 return fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canvas
); |
| 277 } | 294 } |
| 278 | 295 |
| 279 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { | 296 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { |
| 280 | 297 |
| 281 } | 298 } |
| 282 }; | 299 }; |
| 283 | 300 |
| 284 class SkPdfTrueTypeFont : public SkPdfType1Font { | 301 class SkPdfTrueTypeFont : public SkPdfType1Font { |
| 285 public: | 302 public: |
| 286 SkPdfTrueTypeFont(SkNativeParsedPDF* doc, SkPdfTrueTypeFontDictionary* dict)
: SkPdfType1Font(doc, dict) { | 303 SkPdfTrueTypeFont(SkPdfNativeDoc* doc, SkPdfTrueTypeFontDictionary* dict) :
SkPdfType1Font(doc, dict) { |
| 287 } | 304 } |
| 288 }; | 305 }; |
| 289 | 306 |
| 290 class SkPdfMultiMasterFont : public SkPdfType1Font { | 307 class SkPdfMultiMasterFont : public SkPdfType1Font { |
| 291 public: | 308 public: |
| 292 SkPdfMultiMasterFont(SkNativeParsedPDF* doc, SkPdfMultiMasterFontDictionary*
dict) : SkPdfType1Font(doc, dict) { | 309 SkPdfMultiMasterFont(SkPdfNativeDoc* doc, SkPdfMultiMasterFontDictionary* di
ct) : SkPdfType1Font(doc, dict) { |
| 293 } | 310 } |
| 294 }; | 311 }; |
| 295 /* | 312 /* |
| 296 class CIDToGIDMap { | 313 class CIDToGIDMap { |
| 297 virtual unsigned int map(unsigned int cid) = 0; | 314 virtual unsigned int map(unsigned int cid) = 0; |
| 298 static CIDToGIDMap* fromName(const char* name); | 315 static CIDToGIDMap* fromName(const char* name); |
| 299 }; | 316 }; |
| 300 | 317 |
| 301 class CIDToGIDMap_Identity { | 318 class CIDToGIDMap_Identity { |
| 302 virtual unsigned int map(unsigned int cid) { return cid; } | 319 virtual unsigned int map(unsigned int cid) { return cid; } |
| (...skipping 14 matching lines...) Expand all Loading... |
| 317 // TODO(edisonn): warning/report | 334 // TODO(edisonn): warning/report |
| 318 printf("Unknown CIDToGIDMap: %s\n", name); | 335 printf("Unknown CIDToGIDMap: %s\n", name); |
| 319 #endif | 336 #endif |
| 320 return NULL; | 337 return NULL; |
| 321 } | 338 } |
| 322 CIDToGIDMap* fCidToGid; | 339 CIDToGIDMap* fCidToGid; |
| 323 */ | 340 */ |
| 324 | 341 |
| 325 class SkPdfType3Font : public SkPdfFont { | 342 class SkPdfType3Font : public SkPdfFont { |
| 326 struct Type3FontChar { | 343 struct Type3FontChar { |
| 327 SkPdfObject* fObj; | 344 SkPdfNativeObject* fObj; |
| 328 double fWidth; | 345 double fWidth; |
| 329 }; | 346 }; |
| 330 | 347 |
| 331 SkPdfDictionary* fCharProcs; | 348 SkPdfDictionary* fCharProcs; |
| 332 SkPdfEncodingDictionary* fEncodingDict; | 349 SkPdfEncodingDictionary* fEncodingDict; |
| 333 unsigned int fFirstChar; | 350 unsigned int fFirstChar; |
| 334 unsigned int fLastChar; | 351 unsigned int fLastChar; |
| 335 | 352 |
| 336 SkRect fFontBBox; | 353 SkRect fFontBBox; |
| 337 SkMatrix fFonMatrix; | 354 SkMatrix fFonMatrix; |
| 338 | 355 |
| 339 Type3FontChar* fChars; | 356 Type3FontChar* fChars; |
| 340 | 357 |
| 341 public: | 358 public: |
| 342 SkPdfType3Font(SkNativeParsedPDF* parsed, SkPdfType3FontDictionary* dict) { | 359 SkPdfType3Font(SkPdfNativeDoc* parsed, SkPdfType3FontDictionary* dict) { |
| 343 fBaseFont = fontFromName(parsed, dict, dict->BaseFont(parsed).c_str()); | 360 fBaseFont = fontFromName(parsed, dict, dict->BaseFont(parsed).c_str()); |
| 344 | 361 |
| 345 if (dict->has_Encoding()) { | 362 if (dict->has_Encoding()) { |
| 346 if (dict->isEncodingAName(parsed)) { | 363 if (dict->isEncodingAName(parsed)) { |
| 347 fEncoding = SkPdfEncoding::fromName(dict->getEncodingAsName(par
sed).c_str()); | 364 fEncoding = SkPdfEncoding::fromName(dict->getEncodingAsName(par
sed).c_str()); |
| 348 } else if (dict->isEncodingAEncodingdictionary(parsed)) { | 365 } else if (dict->isEncodingAEncodingdictionary(parsed)) { |
| 349 // No encoding. | 366 // No encoding. |
| 350 fEncoding = SkPdfDefaultEncoding::instance(); | 367 fEncoding = SkPdfDefaultEncoding::instance(); |
| 351 fEncodingDict = dict->getEncodingAsEncodingdictionary(parsed); | 368 fEncodingDict = dict->getEncodingAsEncodingdictionary(parsed); |
| 352 } | 369 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 393 // TODO(edisonn): report pdf corruption | 410 // TODO(edisonn): report pdf corruption |
| 394 } | 411 } |
| 395 j++; | 412 j++; |
| 396 } else { | 413 } else { |
| 397 // TODO(edisonn): report bad pdf | 414 // TODO(edisonn): report bad pdf |
| 398 } | 415 } |
| 399 } | 416 } |
| 400 } | 417 } |
| 401 | 418 |
| 402 public: | 419 public: |
| 403 virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfC
ontext, SkCanvas* canvas) { | 420 virtual double drawOneChar(unsigned int ch, SkPaint* paint, SkPdfContext* pd
fContext, SkCanvas* canvas) { |
| 404 if (ch < fFirstChar || ch > fLastChar || !fChars[ch - fFirstChar].fObj)
{ | 421 if (ch < fFirstChar || ch > fLastChar || !fChars[ch - fFirstChar].fObj)
{ |
| 405 return fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canv
as); | 422 return fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canv
as); |
| 406 } | 423 } |
| 407 | 424 |
| 408 #ifdef PDF_TRACE | 425 #ifdef PDF_TRACE |
| 409 printf("Type 3 char to unicode: %c\n", ToUnicode(ch)); | 426 printf("Type 3 char to unicode: %c\n", ToUnicode(ch)); |
| 410 if (ToUnicode(ch) == 'A') { | 427 if (ToUnicode(ch) == 'A') { |
| 411 printf("break;\n"); | 428 printf("break;\n"); |
| 412 } | 429 } |
| 413 #endif | 430 #endif |
| 414 | 431 |
| 415 // TODO(edisonn): is it better to resolve the reference at load time, or
now? | 432 // TODO(edisonn): is it better to resolve the reference at load time, or
now? |
| 416 doType3Char(pdfContext, canvas, pdfContext->fPdfDoc->resolveReference(fC
hars[ch - fFirstChar].fObj), fFontBBox, fFonMatrix, pdfContext->fGraphicsState.f
CurFontSize); | 433 doType3Char(pdfContext, canvas, pdfContext->fPdfDoc->resolveReference(fC
hars[ch - fFirstChar].fObj), fFontBBox, fFonMatrix, pdfContext->fGraphicsState.f
CurFontSize); |
| 417 | 434 |
| 418 // TODO(edisonn): verify/test translate code, not tested yet | 435 // TODO(edisonn): verify/test translate code, not tested yet |
| 419 pdfContext->fGraphicsState.fMatrixTm.preTranslate(SkDoubleToScalar(pdfCo
ntext->fGraphicsState.fCurFontSize * fChars[ch - fFirstChar].fWidth), | 436 pdfContext->fGraphicsState.fMatrixTm.preTranslate(SkDoubleToScalar(pdfCo
ntext->fGraphicsState.fCurFontSize * fChars[ch - fFirstChar].fWidth), |
| 420 SkDoubleToScalar(0.0)); | 437 SkDoubleToScalar(0.0)); |
| 421 return fChars[ch - fFirstChar].fWidth; | 438 return fChars[ch - fFirstChar].fWidth; |
| 422 } | 439 } |
| 423 | 440 |
| 424 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { | 441 virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { |
| 425 | 442 |
| 426 } | 443 } |
| 427 }; | 444 }; |
| 428 | 445 |
| 429 #endif // __DEFINED__SkPdfFont | 446 #endif // __DEFINED__SkPdfFont |
| OLD | NEW |