/*
 * Copyright (C) 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef RASTERMILL_FRAMESQUENCE_GIF_H
#define RASTERMILL_FRAMESQUENCE_GIF_H

#include "config.h"
#include "gif_lib.h"

#include "Stream.h"
#include "Color.h"
#include "FrameSequence.h"

class FrameSequence_gif : public FrameSequence {
public:
    FrameSequence_gif(Stream* stream);
    virtual ~FrameSequence_gif();

    virtual int getWidth() const {
        return mGif ? mGif->SWidth : 0;
    }

    virtual int getHeight() const {
        return mGif ? mGif->SHeight : 0;
    }

    virtual bool isOpaque() const {
        return (mBgColor & COLOR_8888_ALPHA_MASK) == COLOR_8888_ALPHA_MASK;
    }

    virtual int getFrameCount() const {
        return mGif ? mGif->ImageCount : 0;
    }

    virtual int getDefaultLoopCount() const {
        return mLoopCount;
    }

    virtual FrameSequenceState* createState() const;

    GifFileType* getGif() const { return mGif; }
    Color8888 getBackgroundColor() const { return mBgColor; }
    bool getPreservedFrame(int frameIndex) const { return mPreservedFrames[frameIndex]; }
    int getRestoringFrame(int frameIndex) const { return mRestoringFrames[frameIndex]; }

private:
    GifFileType* mGif;
    int mLoopCount;
    Color8888 mBgColor;

    // array of bool per frame - if true, frame data is used by a later DISPOSE_PREVIOUS frame
    bool* mPreservedFrames;

    // array of ints per frame - if >= 0, points to the index of the preserve that frame needs
    int* mRestoringFrames;
};

class FrameSequenceState_gif : public FrameSequenceState {
public:
    FrameSequenceState_gif(const FrameSequence_gif& frameSequence);
    virtual ~FrameSequenceState_gif();

    // returns frame's delay time in ms
    virtual long drawFrame(int frameNr,
            Color8888* outputPtr, int outputPixelStride, int previousFrameNr);

private:
    void savePreserveBuffer(Color8888* outputPtr, int outputPixelStride, int frameNr);
    void restorePreserveBuffer(Color8888* outputPtr, int outputPixelStride);

    const FrameSequence_gif& mFrameSequence;
    Color8888* mPreserveBuffer;
    int mPreserveBufferFrame;
};

#endif //RASTERMILL_FRAMESQUENCE_GIF_H
