pdfviewer: more code comments + concat the pdf matrix with the existing matrix in canvas, instead of reseting it.
Review URL: https://codereview.chromium.org/27057003
git-svn-id: http://skia.googlecode.com/svn/trunk@11735 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/experimental/PdfViewer/SkPdfGraphicsState.h b/experimental/PdfViewer/SkPdfGraphicsState.h
index 656ee8f..094b794 100644
--- a/experimental/PdfViewer/SkPdfGraphicsState.h
+++ b/experimental/PdfViewer/SkPdfGraphicsState.h
@@ -13,34 +13,39 @@
#include "SkPdfConfig.h"
#include "SkPdfUtils.h"
+class SkPdfAllocator;
class SkPdfFont;
class SkPdfDoc;
+class SkPdfNativeDoc;
class SkPdfNativeObject;
class SkPdfResourceDictionary;
class SkPdfSoftMaskDictionary;
+#include "SkTypes.h"
-class SkPdfNativeDoc;
-class SkPdfAllocator;
-// TODO(edisonn): move this class in include/core?
-// Ref objects can't be dealt unless we use a specific class initialization
-// The difference between SkTDStackNew and SkTDStack is that SkTDStackNew uses new/delete
-// to be a manage c++ stuff (like initializations)
+// TODO(edisonn): move SkTDStackNester class in its own private file
// Adobe limits it to 28, so 256 should be more than enough
#define MAX_NESTING 256
-#include "SkTypes.h"
-template <typename T> class SkTDStackNew : SkNoncopyable {
+/** \class SkTDStackNester
+ *
+ * The difference between SkTDStackNester and SkTDStack is that:
+ * - SkTDStackNester uses new/delete to manage initializations
+ * - Supports nest/unnest which simulates a stack of stack. unnest will pop all the
+ * objects pushed since the last nest
+ */
+
+template <typename T> class SkTDStackNester : SkNoncopyable {
public:
- SkTDStackNew() : fCount(0), fTotalCount(0), fLocalCount(0) {
+ SkTDStackNester() : fCount(0), fTotalCount(0), fLocalCount(0) {
fInitialRec.fNext = NULL;
fRec = &fInitialRec;
// fCount = kSlotCount;
}
- ~SkTDStackNew() {
+ ~SkTDStackNester() {
Rec* rec = fRec;
while (rec != &fInitialRec) {
Rec* next = rec->fNext;
@@ -157,7 +162,9 @@
int fNestingLevel;
};
-// TODO(edisonn): better class design.
+/** \class SkTDStackNester
+ * Operates on stroking or non-stroking properties.
+ */
class SkPdfColorOperator {
/*
@@ -168,9 +175,7 @@
*/
// TODO(edisonn): implement the array part too
- // does not own the char*
// TODO(edisonn): remove this public, let fields be private
-// TODO(edisonn): make color space an enum!
public:
NotOwnedString fColorSpace;
SkPdfNativeObject* fPattern;
@@ -187,15 +192,14 @@
SkColor fColor;
double fOpacity; // ca or CA
- // TODO(edisonn): add here other color space options.
-
public:
void setRGBColor(SkColor color) {
// TODO(edisonn): ASSERT DeviceRGB is the color space.
fPattern = NULL;
fColor = color;
}
- // TODO(edisonn): double check the default values for all fields.
+
+ // TODO(edisonn): implement the default values for all fields.
SkPdfColorOperator() : fPattern(NULL), fColor(SK_ColorBLACK), fOpacity(1) {
NotOwnedString::init(&fColorSpace, "DeviceRGB");
}
@@ -216,7 +220,9 @@
}
};
-// TODO(edisonn): better class design.
+/** \class SkTDStackNester
+ * Operates on stroking or non-stroking properties.
+ */
struct SkPdfGraphicsState {
// TODO(edisonn): deprecate and remove these!
double fCurPosX;
@@ -235,9 +241,8 @@
SkPdfResourceDictionary* fResources;
- // TODO(edisonn): move most of these in canvas/paint?
- // we could have some in canvas (matrixes?),
- // some in 2 paints (stroking paint and non stroking paint)
+ // TODO(edisonn): Can we move most of these in canvas/paint?
+ // Might need to strore some properties in 2 paints (stroking paint and non stroking paint)
// TABLE 4.2 Device-independent graphics state parameters
/*
@@ -457,10 +462,7 @@
installation-dependent.
*/
-
-
// TODO(edisonn): some defaults are contextual, they could on colorspace, pdf version, ...
-
SkPdfGraphicsState() {
fCurPosX = 0.0;
fCurPosY = 0.0;
@@ -493,14 +495,15 @@
void applyGraphicsState(SkPaint* paint, bool stroking);
};
+/** \class SkPdfContext
+ * The context of the drawing. The document we draw from, the current stack of objects, ...
+ */
class SkPdfContext {
public:
- SkTDStackNew<SkPdfNativeObject*> fObjectStack;
- SkTDStackNew<SkPdfGraphicsState> fStateStack;
+ SkTDStackNester<SkPdfNativeObject*> fObjectStack;
+ SkTDStackNester<SkPdfGraphicsState> fStateStack;
SkPdfGraphicsState fGraphicsState;
SkPdfNativeDoc* fPdfDoc;
- // TODO(edisonn): the allocator, could be freed after the page is done drawing, so we have the
- // pixels on the screen asap.
SkPdfAllocator* fTmpPageAllocator;
SkMatrix fOriginalMatrix;