Index: experimental/PdfViewer/SkPdfFont.h |
=================================================================== |
--- experimental/PdfViewer/SkPdfFont.h (revision 0) |
+++ experimental/PdfViewer/SkPdfFont.h (revision 0) |
@@ -0,0 +1,277 @@ |
+#ifndef __DEFINED__SkPdfFont |
+#define __DEFINED__SkPdfFont |
+ |
+#include "SkPdfHeaders_autogen.h" |
+#include "SkPdfPodofoMapper_autogen.h" |
+ |
+#include <map> |
+#include <string> |
+ |
+#include "SkUtils.h" |
+ |
+class SkPdfType0Font; |
+class SkPdfType1Font; |
+class SkPdfType3Font; |
+class SkPdfTrueTypeFont; |
+class SkPdfCIDFont; |
+class SkPdfMultiMasterFont; |
+class SkPdfFont; |
+ |
+ |
+struct SkPdfStandardFontEntry { |
+ const char* fName; |
+ bool fIsBold; |
+ bool fIsItalic; |
+}; |
+ |
+std::map<std::string, SkPdfStandardFontEntry>& getStandardFonts(); |
+SkTypeface* SkTypefaceFromPdfStandardFont(const char* fontName, bool bold, bool italic); |
+SkPdfFont* SkPdfFontFromName(SkPdfObject* obj, const char* fontName); |
+ |
+struct SkUnencodedText { |
+ void* text; |
+ int len; |
+ |
+public: |
+ SkUnencodedText(const SkPdfObject* obj) { |
+ text = (void*)obj->podofo()->GetString().GetString(); |
+ len = obj->podofo()->GetString().GetLength(); |
+ } |
+}; |
+ |
+struct SkDecodedText { |
+ uint16_t* text; |
+ int len; |
+}; |
+ |
+struct SkUnicodeText { |
+ uint16_t* text; |
+ int len; |
+ |
+public: |
+ unsigned int operator[](int i) const { return text[i]; } |
+ int size() const { return len; } |
+}; |
+ |
+class SkPdfEncoding { |
+public: |
+ virtual bool decodeText(const SkUnencodedText& textIn, SkDecodedText* textOut) const = 0; |
+}; |
+ |
+class SkPdfIdentityHEncoding : public SkPdfEncoding { |
+public: |
+ virtual bool decodeText(const SkUnencodedText& textIn, SkDecodedText* textOut) const { |
+ // TODO(edisonn): SkASSERT(textIn.len % 2 == 0); or report error? |
+ |
+ uint16_t* text = (uint16_t*)textIn.text; |
+ textOut->text = new uint16_t[textIn.len / 2]; |
+ textOut->len = textIn.len / 2; |
+ |
+ for (int i = 0; i < textOut->len; i++) { |
+ textOut->text[i] = ((text[i] << 8) & 0xff00) | ((text[i] >> 8) & 0x00ff); |
+ } |
+ |
+ return true; |
+ } |
+ |
+ static SkPdfIdentityHEncoding* instance() { |
+ static SkPdfIdentityHEncoding* inst = new SkPdfIdentityHEncoding(); |
+ return inst; |
+ } |
+}; |
+ |
+class SkPdfFont { |
+public: |
+ SkPdfFont* fBaseFont; |
+ SkPdfEncoding* fEncoding; |
+ |
+public: |
+ SkPdfFont() : fBaseFont(NULL), fEncoding(SkPdfIdentityHEncoding::instance()) {} |
+ |
+ const SkPdfEncoding* encoding() const {return fEncoding;} |
+ |
+ void drawText(const SkUnicodeText& text, SkPaint* paint, SkCanvas* canvas, SkMatrix* matrix) { |
+ for (int i = 0 ; i < text.size(); i++) { |
+ drawOneChar(text[i], paint, canvas, matrix); |
+ } |
+ } |
+ |
+ virtual void ToUnicode(const SkDecodedText& textIn, SkUnicodeText* textOut) const { |
+ textOut->text = textIn.text; |
+ textOut->len = textIn.len; |
+ }; |
+ |
+ static SkPdfFont* fontFromPdfDictionary(SkPdfFontDictionary* dict); |
+ static SkPdfFont* Default() {return SkPdfFontFromName(NULL, "TimesNewRoman");} |
+ |
+ static SkPdfType0Font* fontFromType0FontDictionary(SkPdfType0FontDictionary* dict); |
+ static SkPdfType1Font* fontFromType1FontDictionary(SkPdfType1FontDictionary* dict); |
+ static SkPdfType3Font* fontFromType3FontDictionary(SkPdfType3FontDictionary* dict); |
+ static SkPdfTrueTypeFont* fontFromTrueTypeFontDictionary(SkPdfTrueTypeFontDictionary* dict); |
+ static SkPdfCIDFont* fontFromCIDFontDictionary(SkPdfCIDFontDictionary* dict); |
+ static SkPdfMultiMasterFont* fontFromMultiMasterFontDictionary(SkPdfMultiMasterFontDictionary* dict); |
+ |
+public: |
+ virtual void drawOneChar(unsigned int ch, SkPaint* paint, SkCanvas* canvas, SkMatrix* matrix) = 0; |
+ virtual void afterChar(SkPaint* paint, SkMatrix* matrix) = 0; |
+ virtual void afterWord(SkPaint* paint, SkMatrix* matrix) = 0; |
+}; |
+ |
+class SkPdfStandardFont : public SkPdfFont { |
+ SkTypeface* fTypeface; |
+ |
+public: |
+ SkPdfStandardFont(SkTypeface* typeface) : fTypeface(typeface) {} |
+ |
+public: |
+ virtual void drawOneChar(unsigned int ch, SkPaint* paint, SkCanvas* canvas, SkMatrix* matrix) { |
+ paint->setTypeface(fTypeface); |
+ paint->setTextEncoding(SkPaint::kUTF8_TextEncoding); |
+ |
+ unsigned long ch4 = ch; |
+ char utf8[10]; |
+ int len = SkUTF8_FromUnichar(ch4, utf8); |
+ |
+ canvas->drawText(utf8, len, SkDoubleToScalar(0), SkDoubleToScalar(0), *paint); |
+ |
+ SkScalar textWidth = paint->measureText(utf8, len); |
+ matrix->preTranslate(textWidth, SkDoubleToScalar(0.0)); |
+ } |
+ |
+ virtual void afterChar(SkPaint* paint, SkMatrix* matrix) {} |
+ virtual void afterWord(SkPaint* paint, SkMatrix* matrix) {} |
+}; |
+ |
+ |
+class SkPdfType0Font : public SkPdfFont { |
+ unsigned short* fCMapEncoding; |
+ unsigned char* fCMapEncodingFlag; |
+public: |
+ SkPdfType0Font(SkPdfType0FontDictionary* dict); |
+ |
+public: |
+ virtual void ToUnicode(const SkDecodedText& textIn, SkUnicodeText* textOut) const { |
+ textOut->text = new uint16_t[textIn.len]; |
+ textOut->len = textIn.len; |
+ for (int i = 0; i < textIn.len; i++) { |
+ textOut->text[i] = fCMapEncoding[textIn.text[i]]; |
+ } |
+ }; |
+ |
+ virtual void drawOneChar(unsigned int ch, SkPaint* paint, SkCanvas* canvas, SkMatrix* matrix) { |
+ fBaseFont->drawOneChar(ch, paint, canvas, matrix); |
+ } |
+ |
+ virtual void afterChar(SkPaint* paint, SkMatrix* matrix) { |
+ |
+ } |
+ |
+ virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { |
+ |
+ } |
+}; |
+ |
+class SkPdfTrueTypeFont : public SkPdfFont { |
+public: |
+ SkPdfTrueTypeFont(SkPdfTrueTypeFontDictionary* dict) { |
+ fBaseFont = SkPdfFontFromName(dict, dict->BaseFont().c_str()); |
+ } |
+ |
+public: |
+ virtual void drawOneChar(unsigned int ch, SkPaint* paint, SkCanvas* canvas, SkMatrix* matrix) { |
+ |
+ } |
+ |
+ virtual void afterChar(SkPaint* paint, SkMatrix* matrix) { |
+ |
+ } |
+ |
+ virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { |
+ |
+ } |
+}; |
+ |
+ |
+class SkPdfType1Font : public SkPdfFont { |
+public: |
+ SkPdfType1Font(SkPdfType1FontDictionary* dict) { |
+ fBaseFont = SkPdfFontFromName(dict, dict->BaseFont().c_str()); |
+ } |
+ |
+ |
+public: |
+ virtual void drawOneChar(unsigned int ch, SkPaint* paint, SkCanvas* canvas, SkMatrix* matrix) { |
+ |
+ } |
+ |
+ virtual void afterChar(SkPaint* paint, SkMatrix* matrix) { |
+ |
+ } |
+ |
+ virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { |
+ |
+ } |
+ }; |
+ |
+ |
+class SkPdfCIDFont : public SkPdfFont { |
+public: |
+ SkPdfCIDFont(SkPdfCIDFontDictionary* dict) { |
+ fBaseFont = SkPdfFontFromName(dict, dict->BaseFont().c_str()); |
+ } |
+ |
+public: |
+ virtual void drawOneChar(unsigned int ch, SkPaint* paint, SkCanvas* canvas, SkMatrix* matrix) { |
+ |
+ } |
+ |
+ virtual void afterChar(SkPaint* paint, SkMatrix* matrix) { |
+ |
+ } |
+ |
+ virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { |
+ |
+ } |
+}; |
+ |
+class SkPdfMultiMasterFont : public SkPdfFont { |
+public: |
+ SkPdfMultiMasterFont(SkPdfMultiMasterFontDictionary* dict) { |
+ fBaseFont = SkPdfFontFromName(dict, dict->BaseFont().c_str()); |
+ } |
+ |
+public: |
+ virtual void drawOneChar(unsigned int ch, SkPaint* paint, SkCanvas* canvas, SkMatrix* matrix) { |
+ |
+ } |
+ |
+ virtual void afterChar(SkPaint* paint, SkMatrix* matrix) { |
+ |
+ } |
+ |
+ virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { |
+ |
+ } |
+}; |
+ |
+class SkPdfType3Font : public SkPdfFont { |
+public: |
+ SkPdfType3Font(SkPdfType3FontDictionary* dict) { |
+ fBaseFont = SkPdfFontFromName(dict, dict->BaseFont().c_str()); |
+ } |
+ |
+public: |
+ virtual void drawOneChar(unsigned int ch, SkPaint* paint, SkCanvas* canvas, SkMatrix* matrix) { |
+ |
+ } |
+ |
+ virtual void afterChar(SkPaint* paint, SkMatrix* matrix) { |
+ |
+ } |
+ |
+ virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { |
+ |
+ } |
+}; |
+ |
+#endif // __DEFINED__SkPdfFont |