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