Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(219)

Unified Diff: experimental/PdfViewer/pdf_viewer_main.cpp

Issue 17286007: few steps in the direction of to encapsulating podofo, so the client is not aware podofo is used. (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « experimental/PdfViewer/pdf_auto_gen.h ('k') | experimental/PdfViewer/pdfspec_autogen.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: experimental/PdfViewer/pdf_viewer_main.cpp
===================================================================
--- experimental/PdfViewer/pdf_viewer_main.cpp (revision 9625)
+++ experimental/PdfViewer/pdf_viewer_main.cpp (working copy)
@@ -61,6 +61,13 @@
const char* abr,
SkPdfDictionary** data);
+template <typename T>
+bool DictionaryFromDictionary2(const PdfMemDocument* pdfDoc,
+ const PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ T** data);
+
class SkPdfObject;
bool ObjectFromDictionary(const PdfMemDocument* pdfDoc,
const PdfDictionary& dict,
@@ -72,9 +79,13 @@
#include "pdf_auto_gen.h"
/*
- * TODO(edisonn): ASAP so skp -> pdf -> png looks greap
- * - load gs/ especially smask and already known prop
- * - use transparency (I think ca and CA ops)
+ * TODO(edisonn):
+ * - encapsulate podofo in the pdf api so the skpdf does not know anything about podofo
+ * - ASAP so skp -> pdf -> png looks great
+ * - load gs/ especially smask and already known prop (skp)
+ * - use transparency (I think ca and CA ops) (skp)
+ * - all font types
+ * - word spacing
* - load font for baidu.pdf
* - load font for youtube.pdf
*/
@@ -200,7 +211,7 @@
double fWordSpace;
double fCharSpace;
- const PdfObject* fObjectWithResources;
+ SkPdfResourceDictionary fResources;
SkBitmap fSMask;
@@ -218,7 +229,6 @@
fTextLeading = 0;
fWordSpace = 0;
fCharSpace = 0;
- fObjectWithResources = NULL;
fHasClipPathToApply = false;
}
};
@@ -913,7 +923,7 @@
return false;
}
- return PodofoMapper::mapDictionary(*pdfDoc, *value, (SkPdfObject**)data);
+ return PodofoMapper::map(*pdfDoc, *value, (SkPdfObject**)data);
}
bool DictionaryFromDictionary(const PdfMemDocument* pdfDoc,
@@ -926,6 +936,32 @@
return DictionaryFromDictionary(pdfDoc, dict, abr, data);
}
+template <typename T>
+bool DictionaryFromDictionary2(const PdfMemDocument* pdfDoc,
+ const PdfDictionary& dict,
+ const char* key,
+ SkPdfDictionary** data) {
+ const PdfObject* value = resolveReferenceObject(pdfDoc,
+ dict.GetKey(PdfName(key)),
+ true);
+ if (value == NULL || !value->IsDictionary()) {
+ return false;
+ }
+
+ return PodofoMapper::map(*pdfDoc, *value, (T**)data);
+}
+
+template <typename T>
+bool DictionaryFromDictionary2(const PdfMemDocument* pdfDoc,
+ const PdfDictionary& dict,
+ const char* key,
+ const char* abr,
+ T** data) {
+ if (DictionaryFromDictionary2<T>(pdfDoc, dict, key, data)) return true;
+ if (abr == NULL || *abr == '\0') return false;
+ return DictionaryFromDictionary2<T>(pdfDoc, dict, abr, data);
+}
+
bool ObjectFromDictionary(const PdfMemDocument* pdfDoc,
const PdfDictionary& dict,
const char* key,
@@ -936,7 +972,7 @@
if (value == NULL) {
return false;
}
- return PodofoMapper::mapObject(*pdfDoc, *value, data);
+ return PodofoMapper::map(*pdfDoc, *value, data);
}
bool ObjectFromDictionary(const PdfMemDocument* pdfDoc,
@@ -950,6 +986,7 @@
}
+
// TODO(edisonn): perf!!!
static SkColorTable* getGrayColortable() {
@@ -1257,20 +1294,39 @@
return true;
}
-PdfResult doXObject_Form(PdfContext* pdfContext, SkCanvas* canvas, const PdfObject& obj) {
- if (!obj.HasStream() || obj.GetStream() == NULL || obj.GetStream()->GetLength() == 0) {
+SkPdfObject* get(const SkPdfObject* obj, const char* key, const char* abr = "") {
+ SkPdfObject* ret = NULL;
+ if (obj == NULL) return NULL;
+ const SkPdfDictionary* dict = obj->asDictionary();
+ if (dict == NULL) return NULL;
+ if (!dict->podofo()->IsDictionary()) return NULL;
+ ObjectFromDictionary(dict->doc(), dict->podofo()->GetDictionary(), key, abr, &ret);
+ return ret;
+}
+
+PdfResult doXObject_Form(PdfContext* pdfContext, SkCanvas* canvas, SkPdfType1FormDictionary* skobj) {
+ if (!skobj || !skobj->podofo() || !skobj->podofo()->HasStream() || skobj->podofo()->GetStream() == NULL || skobj->podofo()->GetStream()->GetLength() == 0) {
return kOK_PdfResult;
}
PdfOp_q(pdfContext, canvas, NULL);
canvas->save();
- pdfContext->fGraphicsState.fObjectWithResources = &obj;
+ if (get(skobj, "Resources")) {
+ SkPdfResourceDictionary* res = NULL;
+ PodofoMapper::map(*get(skobj, "Resources"), &res);
+
+ if (res) {
+ pdfContext->fGraphicsState.fResources = *res;
+ delete res;
+ }
+ }
+
SkTraceMatrix(pdfContext->fGraphicsState.fMatrix, "Current matrix");
SkMatrix matrix;
- if (SkMatrixFromDictionary(pdfContext, obj.GetDictionary(), "Matrix", &matrix)) {
+ if (SkMatrixFromDictionary(pdfContext, skobj->podofo()->GetDictionary(), "Matrix", &matrix)) {
pdfContext->fGraphicsState.fMatrix.preConcat(matrix);
pdfContext->fGraphicsState.fMatrixTm = pdfContext->fGraphicsState.fMatrix;
pdfContext->fGraphicsState.fMatrixTlm = pdfContext->fGraphicsState.fMatrix;
@@ -1282,7 +1338,7 @@
canvas->setMatrix(pdfContext->fGraphicsState.fMatrix);
SkRect bbox;
- if (SkRectFromDictionary(pdfContext, obj.GetDictionary(), "BBox", &bbox)) {
+ if (SkRectFromDictionary(pdfContext, skobj->podofo()->GetDictionary(), "BBox", &bbox)) {
canvas->clipRect(bbox, SkRegion::kIntersect_Op, true); // TODO(edisonn): AA from settings.
}
@@ -1296,7 +1352,7 @@
// TODO(edisonn): get rid of try/catch exceptions! We should not throw on user data!
try {
- obj.GetStream()->GetFilteredCopy(&uncompressedStream, &uncompressedStreamLength);
+ skobj->podofo()->GetStream()->GetFilteredCopy(&uncompressedStream, &uncompressedStreamLength);
if (uncompressedStream != NULL && uncompressedStreamLength != 0) {
PdfContentsTokenizer tokenizer(uncompressedStream, uncompressedStreamLength);
PdfMainLooper looper(NULL, &tokenizer, pdfContext, canvas);
@@ -1347,8 +1403,8 @@
CheckRecursiveRendering checkRecursion(obj);
// TODO(edisonn): check type
- SkPdfObject* skobj = NULL;
- if (!PodofoMapper::mapXObjectDictionary(*pdfContext->fPdfDoc, obj, &skobj)) return kIgnoreError_PdfResult;
+ SkPdfXObjectDictionary* skobj = NULL;
+ if (!PodofoMapper::map(*pdfContext->fPdfDoc, obj, &skobj)) return kIgnoreError_PdfResult;
if (!skobj || !skobj->valid()) return kIgnoreError_PdfResult;
@@ -1359,7 +1415,7 @@
ret = doXObject_Image(pdfContext, canvas, skobj->asImageDictionary());
break;
case kObjectDictionaryXObjectDictionaryType1FormDictionary_SkPdfObjectType:
- ret = doXObject_Form(pdfContext, canvas, obj);//skobj->asType1FormDictionary());
+ ret = doXObject_Form(pdfContext, canvas, skobj->asType1FormDictionary());
break;
//case kObjectDictionaryXObjectPS_SkPdfObjectType:
//return doXObject_PS(skxobj.asPS());
@@ -2105,16 +2161,8 @@
std::string str;
#endif
- const PdfDictionary& pageDict = pdfContext->fGraphicsState.fObjectWithResources->GetDictionary();
+ const PdfObject* resources = pdfContext->fGraphicsState.fResources.podofo();
-#ifdef PDF_TRACE
- pdfContext->fGraphicsState.fObjectWithResources->ToString(str);
- printf("Print Object with resources: %s\n", str.c_str());
-#endif
-
- const PdfObject* resources = resolveReferenceObject(pdfContext->fPdfDoc,
- pageDict.GetKey("Resources"));
-
if (resources == NULL) {
#ifdef PDF_TRACE
printf("WARNING: No Resources for a page with 'gs' operator!\n");
@@ -2169,6 +2217,9 @@
printf("gs object value: %s\n", str.c_str());
#endif
+ SkPdfGraphicsStateDictionary gs(pdfContext->fPdfDoc, value);
+ printf("caCA %f %f\n", gs.ca(), gs.CA());
+
// TODO(edisonn): now load all those properties in graphic state.
return kNYI_PdfResult;
@@ -2252,9 +2303,7 @@
PdfResult PdfOp_Do(PdfContext* pdfContext, SkCanvas* canvas, PdfTokenLooper** looper) {
PdfName name = pdfContext->fVarStack.top().GetName(); pdfContext->fVarStack.pop();
- const PdfDictionary& pageDict = pdfContext->fGraphicsState.fObjectWithResources->GetDictionary();
- const PdfObject* resources = resolveReferenceObject(pdfContext->fPdfDoc,
- pageDict.GetKey("Resources"));
+ const PdfObject* resources = pdfContext->fGraphicsState.fResources.podofo();
if (resources == NULL) {
#ifdef PDF_TRACE
@@ -2637,7 +2686,8 @@
pdfContext.fPdfPage = page;
pdfContext.fPdfDoc = &doc;
pdfContext.fOriginalMatrix = SkMatrix::I();
- pdfContext.fGraphicsState.fObjectWithResources = pdfContext.fPdfPage->GetObject();
+ pdfContext.fGraphicsState.fResources = SkPdfResourceDictionary(pdfContext.fPdfDoc, resolveReferenceObject(pdfContext.fPdfDoc,
+ pdfContext.fPdfPage->GetResources()));
gPdfContext = &pdfContext;
gDumpBitmap = &bitmap;
« no previous file with comments | « experimental/PdfViewer/pdf_auto_gen.h ('k') | experimental/PdfViewer/pdfspec_autogen.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698