Index: experimental/PdfViewer/SkPdfFont.h |
=================================================================== |
--- experimental/PdfViewer/SkPdfFont.h (revision 9787) |
+++ experimental/PdfViewer/SkPdfFont.h (working copy) |
@@ -17,7 +17,6 @@ |
class SkPdfType1Font; |
class SkPdfType3Font; |
class SkPdfTrueTypeFont; |
-class SkPdfCIDFont; |
class SkPdfMultiMasterFont; |
class SkPdfFont; |
@@ -30,7 +29,7 @@ |
std::map<std::string, SkPdfStandardFontEntry>& getStandardFonts(); |
SkTypeface* SkTypefaceFromPdfStandardFont(const char* fontName, bool bold, bool italic); |
-SkPdfFont* SkPdfFontFromName(SkPdfObject* obj, const char* fontName); |
+SkPdfFont* fontFromName(SkPdfObject* obj, const char* fontName); |
struct SkUnencodedText { |
void* text; |
@@ -100,7 +99,29 @@ |
} |
}; |
+// TODO(edisonn): using this one when no encoding is specified |
+class SkPdfDefaultEncoding : public SkPdfEncoding { |
+public: |
+ virtual bool decodeText(const SkUnencodedText& textIn, SkDecodedText* textOut) const { |
+ // TODO(edisonn): SkASSERT(textIn.len % 2 == 0); or report error? |
+ unsigned char* text = (unsigned char*)textIn.text; |
+ textOut->text = new uint16_t[textIn.len]; |
+ textOut->len = textIn.len; |
+ |
+ for (int i = 0; i < textOut->len; i++) { |
+ textOut->text[i] = text[i]; |
+ } |
+ |
+ return true; |
+ } |
+ |
+ static SkPdfDefaultEncoding* instance() { |
+ static SkPdfDefaultEncoding* inst = new SkPdfDefaultEncoding(); |
+ return inst; |
+ } |
+}; |
+ |
class SkPdfCIDToGIDMapIdentityEncoding : public SkPdfEncoding { |
public: |
virtual bool decodeText(const SkUnencodedText& textIn, SkDecodedText* textOut) const { |
@@ -131,13 +152,15 @@ |
public: |
- SkPdfFont() : fBaseFont(NULL), fEncoding(NULL), fToUnicode(NULL) {} |
+ SkPdfFont() : fBaseFont(NULL), fEncoding(SkPdfDefaultEncoding::instance()), fToUnicode(NULL) {} |
const SkPdfEncoding* encoding() const {return fEncoding;} |
- void drawText(const SkDecodedText& text, SkPaint* paint, PdfContext* pdfContext, SkCanvas* canvas, SkMatrix* matrix) { |
+ void drawText(const SkDecodedText& text, SkPaint* paint, PdfContext* pdfContext, SkCanvas* canvas) { |
for (int i = 0 ; i < text.size(); i++) { |
- drawOneChar(text[i], paint, pdfContext, canvas, matrix); |
+ double width = drawOneChar(text[i], paint, pdfContext, canvas); |
+ pdfContext->fGraphicsState.fMatrixTm.preTranslate(SkDoubleToScalar(width), SkDoubleToScalar(0.0)); |
+ canvas->translate(SkDoubleToScalar(width), SkDoubleToScalar(0.0)); |
} |
} |
@@ -163,18 +186,18 @@ |
}; |
static SkPdfFont* fontFromPdfDictionary(SkPdfFontDictionary* dict); |
- static SkPdfFont* Default() {return SkPdfFontFromName(NULL, "TimesNewRoman");} |
+ static SkPdfFont* Default() {return fontFromName(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); |
+ static SkPdfFont* fontFromFontDescriptor(SkPdfFontDescriptorDictionary* fd, bool loadFromName = true); |
+ |
public: |
- virtual void drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfContext, SkCanvas* canvas, SkMatrix* matrix) = 0; |
- virtual void afterChar(SkPaint* paint, SkMatrix* matrix) = 0; |
+ virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfContext, SkCanvas* canvas) = 0; |
virtual void afterWord(SkPaint* paint, SkMatrix* matrix) = 0; |
}; |
@@ -185,7 +208,7 @@ |
SkPdfStandardFont(SkTypeface* typeface) : fTypeface(typeface) {} |
public: |
- virtual void drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfContext, SkCanvas* canvas, SkMatrix* matrix) { |
+ virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfContext, SkCanvas* canvas) { |
paint->setTypeface(fTypeface); |
paint->setTextEncoding(SkPaint::kUTF8_TextEncoding); |
@@ -196,10 +219,9 @@ |
canvas->drawText(utf8, len, SkDoubleToScalar(0), SkDoubleToScalar(0), *paint); |
SkScalar textWidth = paint->measureText(utf8, len); |
- matrix->preTranslate(textWidth, SkDoubleToScalar(0.0)); |
+ return SkScalarToDouble(textWidth); |
} |
- virtual void afterChar(SkPaint* paint, SkMatrix* matrix) {} |
virtual void afterWord(SkPaint* paint, SkMatrix* matrix) {} |
}; |
@@ -209,99 +231,44 @@ |
public: |
- virtual void drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfContext, SkCanvas* canvas, SkMatrix* matrix) { |
- fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canvas, matrix); |
+ virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfContext, SkCanvas* canvas) { |
+ return fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canvas); |
} |
- 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, PdfContext* pdfContext, 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()); |
+ if (dict->has_FontDescriptor()) { |
+ fBaseFont = SkPdfFont::fontFromFontDescriptor(dict->FontDescriptor()); |
+ } else { |
+ fBaseFont = fontFromName(dict, dict->BaseFont().c_str()); |
+ } |
} |
- |
public: |
- virtual void drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfContext, SkCanvas* canvas, SkMatrix* matrix) { |
- |
+ virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfContext, SkCanvas* canvas) { |
+ return fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canvas); |
} |
- virtual void afterChar(SkPaint* paint, SkMatrix* matrix) { |
- |
- } |
- |
virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { |
} |
- }; |
+}; |
- |
-class SkPdfCIDFont : public SkPdfFont { |
+class SkPdfTrueTypeFont : public SkPdfType1Font { |
public: |
- SkPdfCIDFont(SkPdfCIDFontDictionary* dict) { |
- fBaseFont = SkPdfFontFromName(dict, dict->BaseFont().c_str()); |
+ SkPdfTrueTypeFont(SkPdfTrueTypeFontDictionary* dict) : SkPdfType1Font(dict) { |
} |
- |
-public: |
- virtual void drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfContext, SkCanvas* canvas, SkMatrix* matrix) { |
- |
- } |
- |
- virtual void afterChar(SkPaint* paint, SkMatrix* matrix) { |
- |
- } |
- |
- virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { |
- |
- } |
}; |
-class SkPdfMultiMasterFont : public SkPdfFont { |
+class SkPdfMultiMasterFont : public SkPdfType1Font { |
public: |
- SkPdfMultiMasterFont(SkPdfMultiMasterFontDictionary* dict) { |
- fBaseFont = SkPdfFontFromName(dict, dict->BaseFont().c_str()); |
+ SkPdfMultiMasterFont(SkPdfMultiMasterFontDictionary* dict) : SkPdfType1Font(dict) { |
} |
- |
-public: |
- virtual void drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfContext, SkCanvas* canvas, SkMatrix* matrix) { |
- |
- } |
- |
- virtual void afterChar(SkPaint* paint, SkMatrix* matrix) { |
- |
- } |
- |
- virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { |
- |
- } |
}; |
/* |
class CIDToGIDMap { |
@@ -351,7 +318,7 @@ |
public: |
SkPdfType3Font(SkPdfType3FontDictionary* dict) { |
- fBaseFont = SkPdfFontFromName(dict, dict->BaseFont().c_str()); |
+ fBaseFont = fontFromName(dict, dict->BaseFont().c_str()); |
if (dict->has_Encoding()) { |
if (dict->isEncodingAName()) { |
@@ -410,10 +377,9 @@ |
} |
public: |
- virtual void drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfContext, SkCanvas* canvas, SkMatrix* matrix) { |
+ virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfContext, SkCanvas* canvas) { |
if (ch < fFirstChar || ch > fLastChar || !fChars[ch - fFirstChar].fObj) { |
- fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canvas, matrix); |
- return; |
+ return fBaseFont->drawOneChar(ToUnicode(ch), paint, pdfContext, canvas); |
} |
#ifdef PDF_TRACE |
@@ -424,9 +390,10 @@ |
#endif |
doType3Char(pdfContext, canvas, fChars[ch - fFirstChar].fObj, fFontBBox, fFonMatrix, pdfContext->fGraphicsState.fCurFontSize); |
- } |
- virtual void afterChar(SkPaint* paint, SkMatrix* matrix) { |
+ // TODO(edisonn): verify/test translate code, not tested yet |
+ pdfContext->fGraphicsState.fMatrixTm.preTranslate(SkDoubleToScalar(pdfContext->fGraphicsState.fCurFontSize * fChars[ch - fFirstChar].fWidth), |
+ SkDoubleToScalar(0.0)); |
} |
virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { |