Index: experimental/PdfViewer/SkPdfFont.h |
=================================================================== |
--- experimental/PdfViewer/SkPdfFont.h (revision 9879) |
+++ experimental/PdfViewer/SkPdfFont.h (working copy) |
@@ -29,7 +29,7 @@ |
std::map<std::string, SkPdfStandardFontEntry>& getStandardFonts(); |
SkTypeface* SkTypefaceFromPdfStandardFont(const char* fontName, bool bold, bool italic); |
-SkPdfFont* fontFromName(SkPdfObject* obj, const char* fontName); |
+SkPdfFont* fontFromName(SkNativeParsedPDF* doc, SkPdfObject* obj, const char* fontName); |
struct SkUnencodedText { |
void* text; |
@@ -68,12 +68,13 @@ |
std::map<std::string, SkPdfEncoding*>& getStandardEncodings(); |
class SkPdfToUnicode { |
+ SkNativeParsedPDF* fParsed; |
// TODO(edisonn): hide public members |
public: |
unsigned short* fCMapEncoding; |
unsigned char* fCMapEncodingFlag; |
- SkPdfToUnicode(const SkPdfStream* stream); |
+ SkPdfToUnicode(SkNativeParsedPDF* parsed, SkPdfStream* stream); |
}; |
@@ -127,12 +128,12 @@ |
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; |
+ 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]; |
+ textOut->text[i] = ((text[i] << 8) & 0xff00) | ((text[i] >> 8) & 0x00ff); |
} |
return true; |
@@ -185,20 +186,23 @@ |
} |
}; |
- static SkPdfFont* fontFromPdfDictionary(SkPdfFontDictionary* dict); |
- static SkPdfFont* Default() {return fontFromName(NULL, "TimesNewRoman");} |
+ static SkPdfFont* fontFromPdfDictionary(SkNativeParsedPDF* doc, SkPdfFontDictionary* dict); |
+ static SkPdfFont* Default() {return fontFromName(NULL, NULL, "TimesNewRoman");} |
- static SkPdfType0Font* fontFromType0FontDictionary(SkPdfType0FontDictionary* dict); |
- static SkPdfType1Font* fontFromType1FontDictionary(SkPdfType1FontDictionary* dict); |
- static SkPdfType3Font* fontFromType3FontDictionary(SkPdfType3FontDictionary* dict); |
- static SkPdfTrueTypeFont* fontFromTrueTypeFontDictionary(SkPdfTrueTypeFontDictionary* dict); |
- static SkPdfMultiMasterFont* fontFromMultiMasterFontDictionary(SkPdfMultiMasterFontDictionary* dict); |
+ static SkPdfType0Font* fontFromType0FontDictionary(SkNativeParsedPDF* doc, SkPdfType0FontDictionary* dict); |
+ static SkPdfType1Font* fontFromType1FontDictionary(SkNativeParsedPDF* doc, SkPdfType1FontDictionary* dict); |
+ static SkPdfType3Font* fontFromType3FontDictionary(SkNativeParsedPDF* doc, SkPdfType3FontDictionary* dict); |
+ static SkPdfTrueTypeFont* fontFromTrueTypeFontDictionary(SkNativeParsedPDF* doc, SkPdfTrueTypeFontDictionary* dict); |
+ static SkPdfMultiMasterFont* fontFromMultiMasterFontDictionary(SkNativeParsedPDF* doc, SkPdfMultiMasterFontDictionary* dict); |
- static SkPdfFont* fontFromFontDescriptor(SkPdfFontDescriptorDictionary* fd, bool loadFromName = true); |
+ static SkPdfFont* fontFromFontDescriptor(SkNativeParsedPDF* doc, SkPdfFontDescriptorDictionary* fd, bool loadFromName = true); |
public: |
virtual double drawOneChar(unsigned int ch, SkPaint* paint, PdfContext* pdfContext, SkCanvas* canvas) = 0; |
virtual void afterWord(SkPaint* paint, SkMatrix* matrix) = 0; |
+ |
+private: |
+ static SkPdfFont* fontFromPdfDictionaryOnce(SkNativeParsedPDF* doc, SkPdfFontDictionary* dict); |
}; |
class SkPdfStandardFont : public SkPdfFont { |
@@ -227,7 +231,7 @@ |
class SkPdfType0Font : public SkPdfFont { |
public: |
- SkPdfType0Font(SkPdfType0FontDictionary* dict); |
+ SkPdfType0Font(SkNativeParsedPDF* doc, SkPdfType0FontDictionary* dict); |
public: |
@@ -241,11 +245,11 @@ |
class SkPdfType1Font : public SkPdfFont { |
public: |
- SkPdfType1Font(SkPdfType1FontDictionary* dict) { |
+ SkPdfType1Font(SkNativeParsedPDF* doc, SkPdfType1FontDictionary* dict) { |
if (dict->has_FontDescriptor()) { |
- fBaseFont = SkPdfFont::fontFromFontDescriptor(dict->FontDescriptor()); |
+ fBaseFont = SkPdfFont::fontFromFontDescriptor(doc, dict->FontDescriptor(doc)); |
} else { |
- fBaseFont = fontFromName(dict, dict->BaseFont().c_str()); |
+ fBaseFont = fontFromName(doc, dict, dict->BaseFont(doc).c_str()); |
} |
} |
@@ -261,13 +265,13 @@ |
class SkPdfTrueTypeFont : public SkPdfType1Font { |
public: |
- SkPdfTrueTypeFont(SkPdfTrueTypeFontDictionary* dict) : SkPdfType1Font(dict) { |
+ SkPdfTrueTypeFont(SkNativeParsedPDF* doc, SkPdfTrueTypeFontDictionary* dict) : SkPdfType1Font(doc, dict) { |
} |
}; |
class SkPdfMultiMasterFont : public SkPdfType1Font { |
public: |
- SkPdfMultiMasterFont(SkPdfMultiMasterFontDictionary* dict) : SkPdfType1Font(dict) { |
+ SkPdfMultiMasterFont(SkNativeParsedPDF* doc, SkPdfMultiMasterFontDictionary* dict) : SkPdfType1Font(doc, dict) { |
} |
}; |
/* |
@@ -302,7 +306,7 @@ |
class SkPdfType3Font : public SkPdfFont { |
struct Type3FontChar { |
- SkPdfObject* fObj; |
+ const SkPdfObject* fObj; |
double fWidth; |
}; |
@@ -317,33 +321,33 @@ |
Type3FontChar* fChars; |
public: |
- SkPdfType3Font(SkPdfType3FontDictionary* dict) { |
- fBaseFont = fontFromName(dict, dict->BaseFont().c_str()); |
+ SkPdfType3Font(SkNativeParsedPDF* parsed, SkPdfType3FontDictionary* dict) { |
+ fBaseFont = fontFromName(parsed, dict, dict->BaseFont(parsed).c_str()); |
if (dict->has_Encoding()) { |
- if (dict->isEncodingAName()) { |
- fEncoding = SkPdfEncoding::fromName(dict->getEncodingAsName().c_str()); |
- } else if (dict->isEncodingAEncodingdictionary()) { |
+ if (dict->isEncodingAName(parsed)) { |
+ fEncoding = SkPdfEncoding::fromName(dict->getEncodingAsName(parsed).c_str()); |
+ } else if (dict->isEncodingAEncodingdictionary(parsed)) { |
// technically, there is no encoding. |
fEncoding = SkPdfCIDToGIDMapIdentityEncoding::instance(); |
- fEncodingDict = dict->getEncodingAsEncodingdictionary(); |
+ fEncodingDict = dict->getEncodingAsEncodingdictionary(parsed); |
} |
} |
// null? |
- fCharProcs = dict->CharProcs(); |
+ fCharProcs = dict->CharProcs(parsed); |
fToUnicode = NULL; |
if (dict->has_ToUnicode()) { |
- fToUnicode = new SkPdfToUnicode(dict->ToUnicode()); |
+ fToUnicode = new SkPdfToUnicode(parsed, dict->ToUnicode(parsed)); |
} |
- fFirstChar = dict->FirstChar(); |
- fLastChar = dict->LastChar(); |
- fFonMatrix = dict->has_FontMatrix() ? *dict->FontMatrix() : SkMatrix::I(); |
+ fFirstChar = dict->FirstChar(parsed); |
+ fLastChar = dict->LastChar(parsed); |
+ fFonMatrix = dict->has_FontMatrix() ? dict->FontMatrix(parsed) : SkMatrix::I(); |
- if (dict->FontBBox()) { |
- fFontBBox = *dict->FontBBox(); |
+ if (dict->has_FontBBox()) { |
+ fFontBBox = dict->FontBBox(parsed); |
} |
fChars = new Type3FontChar[fLastChar - fFirstChar + 1]; |
@@ -351,24 +355,24 @@ |
memset(fChars, 0, sizeof(fChars[0]) * (fLastChar - fFirstChar + 1)); |
- SkPdfArray* widths = dict->Widths(); |
- for (int i = 0 ; i < widths->size(); i++) { |
+ const SkPdfArray* widths = dict->Widths(parsed); |
+ for (unsigned int i = 0 ; i < widths->size(); i++) { |
if ((fFirstChar + i) < fFirstChar || (fFirstChar + i) > fLastChar) { |
printf("break; error 1\n"); |
} |
- fChars[i].fWidth = (*widths)[i]->asNumber()->value(); |
+ fChars[i].fWidth = (*widths)[i]->numberValue(); |
} |
- SkPdfArray* diffs = fEncodingDict->Differences(); |
- int j = fFirstChar; |
- for (int i = 0 ; i < diffs->size(); i++) { |
- if ((*diffs)[i]->asInteger()) { |
- j = (*diffs)[i]->asInteger()->value(); |
- } else if ((*diffs)[i]->asName()) { |
+ const SkPdfArray* diffs = fEncodingDict->Differences(parsed); |
+ unsigned int j = fFirstChar; |
+ for (unsigned int i = 0 ; i < diffs->size(); i++) { |
+ if ((*diffs)[i]->isInteger()) { |
+ j = (*diffs)[i]->intValue(); |
+ } else if ((*diffs)[i]->isName()) { |
if (j < fFirstChar || j > fLastChar) { |
printf("break; error 2\n"); |
} |
- fChars[j - fFirstChar].fObj = fCharProcs->get((*diffs)[i]->asName()->value().c_str()); |
+ fChars[j - fFirstChar].fObj = fCharProcs->get((*diffs)[i]->nameValue()); |
j++; |
} else { |
// err |
@@ -389,11 +393,13 @@ |
} |
#endif |
- doType3Char(pdfContext, canvas, fChars[ch - fFirstChar].fObj, fFontBBox, fFonMatrix, pdfContext->fGraphicsState.fCurFontSize); |
+ // TODO(edisonn): is it better to resolve the reference at load time, or now? |
+ doType3Char(pdfContext, canvas, pdfContext->fPdfDoc->resolveReference(fChars[ch - fFirstChar].fObj), fFontBBox, fFonMatrix, pdfContext->fGraphicsState.fCurFontSize); |
// TODO(edisonn): verify/test translate code, not tested yet |
pdfContext->fGraphicsState.fMatrixTm.preTranslate(SkDoubleToScalar(pdfContext->fGraphicsState.fCurFontSize * fChars[ch - fFirstChar].fWidth), |
SkDoubleToScalar(0.0)); |
+ return fChars[ch - fFirstChar].fWidth; |
} |
virtual void afterWord(SkPaint* paint, SkMatrix* matrix) { |