/* * 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; }