Index: experimental/PdfViewer/src/SkTDStackNester.h |
diff --git a/experimental/PdfViewer/src/SkTDStackNester.h b/experimental/PdfViewer/src/SkTDStackNester.h |
deleted file mode 100644 |
index dd936baaeddaacd59df94852bf6987705a9d6516..0000000000000000000000000000000000000000 |
--- a/experimental/PdfViewer/src/SkTDStackNester.h |
+++ /dev/null |
@@ -1,214 +0,0 @@ |
-/* |
- * Copyright 2013 Google Inc. |
- * |
- * Use of this source code is governed by a BSD-style license that can be |
- * found in the LICENSE file. |
- */ |
- |
-#ifndef SkTDStackNester_DEFINED |
-#define SkTDStackNester_DEFINED |
- |
-#include "SkTypes.h" |
-#include "SkPdfReporter.h" |
- |
-// Adobe limits it to 28. Allow deeper nesting in case a file does not quite meet the |
-// spec. 256 should be more than enough. |
-#define MAX_NESTING 256 |
- |
-/** \class SkTDStackNester |
- * |
- * Specialized version of SkTDStack which allows a stack of stacks. |
- * FIXME (scroggo): Could this be a subclass of SkTDStack? Could it have-a SkTDStack? |
- * The difference between SkTDStackNester and SkTDStack is that: |
- * - SkTDStackNester uses new/delete to manage initializations |
- * FIXME (scroggo): Why use new rather than malloc? |
- * - Supports nest/unnest which simulates a stack of stack. unnest will pop all the |
- * objects pushed since the last nest |
- * - kSlotCount is 64, instead of 8. |
- * FIXME (scroggo): How did we arrive at this number? |
- */ |
- |
-template <typename T> class SkTDStackNester : SkNoncopyable { |
-public: |
- SkTDStackNester() |
- : fCount(0) |
- , fLocalCount(0) |
- , fNestingLevel(0) { |
- fInitialRec.fNext = NULL; |
- fRec = &fInitialRec; |
- SkDEBUGCODE(fTotalCount = 0;) |
- } |
- |
- ~SkTDStackNester() { |
- Rec* rec = fRec; |
- while (rec != &fInitialRec) { |
- Rec* next = rec->fNext; |
- delete rec; |
- rec = next; |
- } |
- } |
- |
- /** |
- * Return the number of objects in the current nesting level. |
- */ |
- int count() const { return fLocalCount; } |
- |
- /** |
- * Whether the current nesting level is empty. |
- */ |
- bool empty() const { return fLocalCount == 0; } |
- |
- /** |
- * The current nesting level. |
- */ |
- int nestingLevel() const { |
- return fNestingLevel; |
- } |
- |
- /** |
- * Analogous to an SkCanvas::save(). When unnest() is called, the state of this SkTDStackNester |
- * will return to its state when nest() was called. |
- * |
- * After a call to nest(), fLocalCount is reset to 0, since the stack is on a new nesting |
- * level. |
- */ |
- void nest() { |
- SkASSERT(fNestingLevel >= 0); |
- if (fNestingLevel < MAX_NESTING) { |
- fNestings[fNestingLevel] = fLocalCount; |
- fLocalCount = 0; |
- } else { |
- // We are are past max nesting levels. We will still continue to work, but we might fail |
- // to properly ignore errors. Ideally it should only mean poor rendering in exceptional |
- // cases. |
- SkPdfReport(kWarning_SkPdfIssueSeverity, kStackNestingOverflow_SkPdfIssue, |
- "Past maximum nesting level", NULL, NULL); |
- } |
- fNestingLevel++; |
- } |
- |
- /** |
- * Analagous to an SkCanvas::restore(). Will revert this stack to the state it was in the last |
- * time nest() was called. It is an error to call unnest() more times than nest() has been |
- * called. |
- */ |
- void unnest() { |
- SkASSERT(fNestingLevel >= 0); |
- if (0 == fNestingLevel) { |
- SkPdfReport(kWarning_SkPdfIssueSeverity, kStackNestingOverflow_SkPdfIssue, |
- "Nesting underflow", NULL, NULL); |
- return; |
- } |
- |
- fNestingLevel--; |
- if (fNestingLevel < MAX_NESTING) { |
- while (fLocalCount > 0) { |
- // FIXME (scroggo): Pass the object? |
- SkPdfReport(kInfo_SkPdfIssueSeverity, kUnusedObject_SkPdfIssue, |
- "Unused object when calling unnest!", NULL, NULL); |
- this->pop(); |
- } |
- fLocalCount = fNestings[fNestingLevel]; |
- } |
- } |
- |
- /** |
- * Add an object to the stack, and return a pointer to it for modification. |
- */ |
- T* push() { |
- SkASSERT(fCount <= kSlotCount); |
- if (fCount == kSlotCount) { |
- Rec* rec = new Rec(); |
- rec->fNext = fRec; |
- fRec = rec; |
- fCount = 0; |
- } |
- SkDEBUGCODE(++fTotalCount;) |
- ++fLocalCount; |
- return &fRec->fSlots[fCount++]; |
- } |
- |
- /** |
- * Add an object to the stack, copied from elem. |
- */ |
- void push(const T& elem) { *this->push() = elem; } |
- |
- /** |
- * Return the top element. |
- */ |
- const T& top() const { |
- SkASSERT(fRec && fCount > 0); |
- return fRec->fSlots[fCount - 1]; |
- } |
- |
- /** |
- * Return the top element. |
- */ |
- T& top() { |
- SkASSERT(fRec && fCount > 0); |
- return fRec->fSlots[fCount - 1]; |
- } |
- |
- /** |
- * Pop an object off the stack (via pop()), and copy its members into elem. |
- */ |
- void pop(T* elem) { |
- if (elem) { |
- *elem = fRec->fSlots[fCount - 1]; |
- } |
- this->pop(); |
- } |
- |
- /** |
- * Pop an object off the stack. It is an error to call pop() more times |
- * than push() has been called in total or since the last call to nest(). |
- */ |
- void pop() { |
- SkASSERT(fCount > 0 && fRec); |
- SkASSERT(fLocalCount > 0); |
- --fLocalCount; |
- SkDEBUGCODE(--fTotalCount;) |
- if (--fCount == 0) { |
- if (fRec != &fInitialRec) { |
- Rec* rec = fRec->fNext; |
- delete fRec; |
- fCount = kSlotCount; |
- fRec = rec; |
- } else { |
- SkASSERT(fTotalCount == 0); |
- } |
- } |
- } |
- |
-private: |
- enum { |
- // Number of objects held per Rec. Storing multiple objects in one Rec |
- // means that we call new less often. |
- kSlotCount = 64 |
- }; |
- |
- struct Rec { |
- Rec* fNext; |
- T fSlots[kSlotCount]; |
- }; |
- |
- // First Rec, requiring no allocation. |
- Rec fInitialRec; |
- // The Rec on top of the stack. |
- Rec* fRec; |
- // Number of objects in fRec. |
- int fCount; |
- // Number of objects in the current nesting level. |
- int fLocalCount; |
- // Array of counts of objects per nesting level. |
- // Only valid for fNestings[0] through fNestings[fNestingLevel-1]. |
- int fNestings[MAX_NESTING]; |
- // Current nesting level. |
- int fNestingLevel; |
- // Total number of objects in this SkTDStackNester. |
- SkDEBUGCODE(int fTotalCount;) |
- |
- // For testing. |
- friend class SkTDStackNesterTester; |
-}; |
-#endif // SkTDStackNester_DEFINED |