Index: src/codec/SkGifInterlaceIter.cpp |
diff --git a/src/codec/SkGifInterlaceIter.cpp b/src/codec/SkGifInterlaceIter.cpp |
new file mode 100644 |
index 0000000000000000000000000000000000000000..268a142e8678b35e71573c9b58199c87bcb873ba |
--- /dev/null |
+++ b/src/codec/SkGifInterlaceIter.cpp |
@@ -0,0 +1,48 @@ |
+/* |
+ * Copyright 2015 The Android Open Source Project |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#include "SkGifInterlaceIter.h" |
+ |
+static const uint8_t kStartingInterlaceYValues[] = { 0, 4, 2, 1 }; |
+static const uint8_t kDeltaInterlaceYValues[] = { 8, 8, 4, 2 }; |
+ |
+SkGifInterlaceIter::SkGifInterlaceIter(int height) : fHeight(height) { |
+ fStartYPtr = kStartingInterlaceYValues; |
+ fDeltaYPtr = kDeltaInterlaceYValues; |
+ |
+ fCurrY = *fStartYPtr++; |
+ fDeltaY = *fDeltaYPtr++; |
+} |
+ |
+void SkGifInterlaceIter::prepareY() { |
+ int32_t y = fCurrY + fDeltaY; |
+ |
+ // Iterate through fStartYPtr until a valid row is found. |
+ // This ensures that we do not move past the height of the small images. |
+ while (y >= fHeight) { |
+ if (kStartingInterlaceYValues + |
+ SK_ARRAY_COUNT(kStartingInterlaceYValues) == fStartYPtr) { |
+ // Now we have iterated over the entire image. Forbid any |
+ // subsequent calls to nextY(). |
+ SkDEBUGCODE(fStartYPtr = NULL;) |
+ SkDEBUGCODE(fDeltaYPtr = NULL;) |
+ y = 0; |
+ } else { |
+ y = *fStartYPtr++; |
+ fDeltaY = *fDeltaYPtr++; |
+ } |
+ } |
+ fCurrY = y; |
+} |
+ |
+int32_t SkGifInterlaceIter::nextY() { |
+ SkASSERT(fStartYPtr); |
+ SkASSERT(fDeltaYPtr); |
+ int32_t y = fCurrY; |
+ prepareY(); |
+ return y; |
+} |