Index: experimental/PdfViewer/SkPdfFont.cpp |
=================================================================== |
--- experimental/PdfViewer/SkPdfFont.cpp (revision 11625) |
+++ experimental/PdfViewer/SkPdfFont.cpp (working copy) |
@@ -7,9 +7,9 @@ |
#include "SkPdfFont.h" |
+#include "SkPdfNativeTokenizer.h" |
#include "SkStream.h" |
#include "SkTypeface.h" |
-#include "SkPdfNativeTokenizer.h" |
SkTDict<SkPdfStandardFontEntry>& getStandardFonts() { |
static SkTDict<SkPdfStandardFontEntry> gPdfStandardFonts(100); |
@@ -95,7 +95,8 @@ |
gPdfStandardFonts.set("Verdana-Bold", SkPdfStandardFontEntry("Verdana", true, false)); |
gPdfStandardFonts.set("WenQuanYiMicroHei", SkPdfStandardFontEntry("WenQuanYi Micro Hei", false, false)); |
- // TODO(edisonn): list all phonts available, builf post script name as in pdf spec |
+ // TODO(edisonn): list all fonts available, buil post script name as in pdf spec |
+ // TODO(edisonn): Does it work in all OSs ? |
/* |
* The PostScript name for the value of BaseFontis determined in one of two ways: |
• Use the PostScript name that is an optional entry in the “name” table of the |
@@ -118,10 +119,6 @@ |
5.7, the name “MinionMM 366 465 11 ” (which ends with a space character) |
becomes /MinionMM_366_465_11_. |
*/ |
- |
- // might not work on all oses ? |
- // |
- |
} |
return gPdfStandardFonts; |
@@ -155,8 +152,9 @@ |
return typeface; |
} |
-SkPdfFont* SkPdfFont::fontFromFontDescriptor(SkPdfNativeDoc* doc, SkPdfFontDescriptorDictionary* fd, bool loadFromName) { |
- // TODO(edisonn): partial implementation ... also const handling ... |
+SkPdfFont* SkPdfFont::fontFromFontDescriptor(SkPdfNativeDoc* doc, SkPdfFontDescriptorDictionary* fd, |
+ bool loadFromName) { |
+ // TODO(edisonn): partial implementation. |
// Only one, at most be available |
SkPdfStream* pdfStream = NULL; |
if (fd->has_FontFile()) { |
@@ -233,7 +231,7 @@ |
// TODO(edisonn): keep the type in a smart way in the SkPdfNativeObject |
// 1) flag, isResolved (1bit): reset at reset, add/remove/update (array) and set(dict) |
// in a tree like structure, 3-4 bits for all the datatypes inheriting from obj (int, real, ...) |
- // if is a dict, reserveve a few bytes to encode type of dict, and so on like in a tree |
+ // if is a dict, reserve a few bytes to encode type of dict, and so on like in a tree |
// issue: type can be determined from context! atribute night be missing/wrong |
switch (doc->mapper()->mapFontDictionary(dict)) { |
case kType0FontDictionary_SkPdfNativeObjectType: |
@@ -270,7 +268,8 @@ |
-SkPdfType0Font* SkPdfFont::fontFromType0FontDictionary(SkPdfNativeDoc* doc, SkPdfType0FontDictionary* dict) { |
+SkPdfType0Font* SkPdfFont::fontFromType0FontDictionary(SkPdfNativeDoc* doc, |
+ SkPdfType0FontDictionary* dict) { |
if (dict == NULL) { |
return NULL; // default one? |
} |
@@ -278,7 +277,8 @@ |
return new SkPdfType0Font(doc, dict); |
} |
-SkPdfType1Font* SkPdfFont:: fontFromType1FontDictionary(SkPdfNativeDoc* doc, SkPdfType1FontDictionary* dict) { |
+SkPdfType1Font* SkPdfFont:: fontFromType1FontDictionary(SkPdfNativeDoc* doc, |
+ SkPdfType1FontDictionary* dict) { |
if (dict == NULL) { |
return NULL; // default one? |
} |
@@ -286,7 +286,8 @@ |
return new SkPdfType1Font(doc, dict); |
} |
-SkPdfType3Font* SkPdfFont::fontFromType3FontDictionary(SkPdfNativeDoc* doc, SkPdfType3FontDictionary* dict) { |
+SkPdfType3Font* SkPdfFont::fontFromType3FontDictionary(SkPdfNativeDoc* doc, |
+ SkPdfType3FontDictionary* dict) { |
if (dict == NULL) { |
return NULL; // default one? |
} |
@@ -296,7 +297,8 @@ |
return new SkPdfType3Font(doc, dict); |
} |
-SkPdfTrueTypeFont* SkPdfFont::fontFromTrueTypeFontDictionary(SkPdfNativeDoc* doc, SkPdfTrueTypeFontDictionary* dict) { |
+SkPdfTrueTypeFont* SkPdfFont::fontFromTrueTypeFontDictionary(SkPdfNativeDoc* doc, |
+ SkPdfTrueTypeFontDictionary* dict) { |
if (dict == NULL) { |
return NULL; // default one? |
} |
@@ -304,7 +306,8 @@ |
return new SkPdfTrueTypeFont(doc, dict); |
} |
-SkPdfMultiMasterFont* SkPdfFont::fontFromMultiMasterFontDictionary(SkPdfNativeDoc* doc, SkPdfMultiMasterFontDictionary* dict) { |
+SkPdfMultiMasterFont* SkPdfFont::fontFromMultiMasterFontDictionary( |
+ SkPdfNativeDoc* doc, SkPdfMultiMasterFontDictionary* dict) { |
if (dict == NULL) { |
return NULL; // default one? |
} |
@@ -322,7 +325,9 @@ |
return ret & 0x0000ffff; |
} |
-#define tokenIsKeyword(token,keyword) (token.fType == kKeyword_TokenType && token.fKeywordLength==sizeof(keyword)-1 && strncmp(token.fKeyword, keyword, sizeof(keyword)-1) == 0) |
+#define tokenIsKeyword(token,keyword) (token.fType == kKeyword_TokenType && \ |
+ token.fKeywordLength==sizeof(keyword)-1 && \ |
+ strncmp(token.fKeyword, keyword, sizeof(keyword)-1) == 0) |
SkPdfToUnicode::SkPdfToUnicode(SkPdfNativeDoc* parsed, SkPdfStream* stream) : fParsed(parsed) { |
fCMapEncoding = NULL; |
@@ -342,16 +347,16 @@ |
} |
// TODO(edisonn): deal with multibyte character, or longer strings. |
- // Ritght now we deal with up 2 characters, e.g. <0020> but not longer like <00660066006C> |
+ // Right now we deal with up 2 characters, e.g. <0020> but not longer like <00660066006C> |
//2 beginbfrange |
//<0000> <005E> <0020> |
//<005F> <0061> [<00660066> <00660069> <00660066006C>] |
while (tokenizer->readToken(&token)) { |
- // TODO(edisonn): perf, macro that would make equal first for token.fKeywordLength with sizeof(keyword), instead od strlen, make sure it is keyword, not a char* |
if (tokenIsKeyword(token, "begincodespacerange")) { |
- while (tokenizer->readToken(&token) && !tokenIsKeyword(token, "endcodespacerange")) { |
+ while (tokenizer->readToken(&token) && |
+ !tokenIsKeyword(token, "endcodespacerange")) { |
// tokenizer->PutBack(token); |
// tokenizer->readToken(&token); |
// TODO(edisonn): check token type! ignore/report errors. |
@@ -387,6 +392,7 @@ |
tokenizer->readToken(&token); // [ or just an array directly? |
+ // do not putback, we will reuse the read. See next commented read. |
// tokenizer->PutBack(token); |
// TODO(edisonn): read spec: any string or only hex string? |
@@ -404,22 +410,20 @@ |
// read one string |
} else if (token.fType == kObject_TokenType && token.fObject->isArray()) { |
// tokenizer->readToken(&token); |
+ // read array |
for (unsigned int i = 0; i < token.fObject->size(); i++) { |
fCMapEncodingFlag[start + i] |= 2; |
fCMapEncoding[start + i] = skstoi((*token.fObject)[i]); |
} |
- // read array |
+ } else { |
+ tokenizer->PutBack(token); |
} |
- |
- //fCMapEncodingFlag[from] = 1; |
- //fCMapEncoding[from] = to; |
} |
} |
} |
} |
} |
- |
SkPdfType0Font::SkPdfType0Font(SkPdfNativeDoc* doc, SkPdfType0FontDictionary* dict) { |
fBaseFont = fontFromName(doc, dict, dict->BaseFont(doc).c_str()); |
fEncoding = NULL; |
@@ -428,6 +432,7 @@ |
if (dict->isEncodingAName(doc)) { |
fEncoding = SkPdfEncoding::fromName(dict->getEncodingAsName(doc).c_str()); |
} else if (dict->isEncodingAStream(doc)) { |
+ // TODO(edisonn): NYI |
//fEncoding = loadEncodingFromStream(dict->getEncodingAsStream()); |
} else { |
// TODO(edisonn): error ... warning .. assert? |
@@ -451,8 +456,6 @@ |
SkPdfEncoding* SkPdfEncoding::fromName(const char* name) { |
SkPdfEncoding* encoding = NULL; |
if (!getStandardEncodings().find(name, &encoding)) { |
- // TODO(edisonn): if the function return false, and we a guaranteed that the value is not |
- // changed, delete this set to null |
encoding = NULL; |
} |