C++程序  |  49行  |  1.36 KB

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