FrameSequence_gif.h revision a3ac0a2df64dcfb8b0b01f1cf05e9afd1439e1f4
19cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien/*
29cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * Copyright (C) 2013 The Android Open Source Project
39cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien *
49cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * Licensed under the Apache License, Version 2.0 (the "License");
59cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * you may not use this file except in compliance with the License.
69cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * You may obtain a copy of the License at
79cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien *
89cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien *      http://www.apache.org/licenses/LICENSE-2.0
99cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien *
109cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * Unless required by applicable law or agreed to in writing, software
119cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * distributed under the License is distributed on an "AS IS" BASIS,
129cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * See the License for the specific language governing permissions and
149cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien * limitations under the License.
159cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien */
169cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien
179cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien#ifndef RASTERMILL_FRAMESQUENCE_GIF_H
189cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien#define RASTERMILL_FRAMESQUENCE_GIF_H
199cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien
209cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien#include "config.h"
219cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien#include "gif_lib.h"
224b723bf22b1bbc5fcdaa9bd96178c921199905d5Roozbeh Pournader
23c31e3883456e018d742e9f29815ba5ff8b315ea1Raph Levien#include "Stream.h"
240f2a025d135f9ca52cc3cf917fffc29d6c126094Seigo Nonaka#include "Color.h"
250f2a025d135f9ca52cc3cf917fffc29d6c126094Seigo Nonaka#include "FrameSequence.h"
260f2a025d135f9ca52cc3cf917fffc29d6c126094Seigo Nonaka
276d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonakaclass FrameSequence_gif : public FrameSequence {
286d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonakapublic:
29198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka    FrameSequence_gif(Stream* stream);
306d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka    virtual ~FrameSequence_gif();
3189e80237bc27af084c9ff316d4f47abf426eced8Seigo Nonaka
32c31e3883456e018d742e9f29815ba5ff8b315ea1Raph Levien    virtual int getWidth() const {
33bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien        return mGif ? mGif->SWidth : 0;
349cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien    }
3513f1aae02bacd475722bc8ea3fc2cf6abc1a82e3Raph Levien
369cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien    virtual int getHeight() const {
371279a3bf5ec6131efefbc51d52d24850fd81f676Kenny Root        return mGif ? mGif->SHeight : 0;
389cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien    }
399cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien
409cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien    virtual int getFrameCount() const {
419cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien        return mGif ? mGif->ImageCount : 0;
429cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien    }
436d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka
446d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka    virtual bool isOpaque() const {
456d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka        return (mBgColor & COLOR_8888_ALPHA_MASK) == COLOR_8888_ALPHA_MASK;
466d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka    }
476d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka
486d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka    virtual FrameSequenceState* createState() const;
496d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka
506d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka    GifFileType* getGif() const { return mGif; }
516d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka    Color8888 getBackgroundColor() const { return mBgColor; }
526d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka    bool getPreservedFrame(int frameIndex) const { return mPreservedFrames[frameIndex]; }
536d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka    int getRestoringFrame(int frameIndex) const { return mRestoringFrames[frameIndex]; }
546d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka
556d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonakaprivate:
566d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka    GifFileType* mGif;
576d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka    Color8888 mBgColor;
586d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka
596d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka    // array of bool per frame - if true, frame data is used by a later DISPOSE_PREVIOUS frame
606d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka    bool* mPreservedFrames;
616d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka
626d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka    // array of ints per frame - if >= 0, points to the index of the preserve that frame needs
636d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka    int* mRestoringFrames;
646d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka};
656d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonaka
666d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonakaclass FrameSequenceState_gif : public FrameSequenceState {
676d9dcd2cf3d3ed26a886e02d94c907311e7b1f83Seigo Nonakapublic:
68198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka    FrameSequenceState_gif(const FrameSequence_gif& frameSequence);
69198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka    virtual ~FrameSequenceState_gif();
70198b46f1fea3f47ef8eb6317799c0d77aaec52f6Seigo Nonaka
71b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien    // returns frame's delay time in ms
72b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien    virtual long drawFrame(int frameNr,
73b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien            Color8888* outputPtr, int outputPixelStride, int previousFrameNr);
74b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien
75b80c1f19c58b927820a8a24bf2218e5645724608Raph Levienprivate:
76b80c1f19c58b927820a8a24bf2218e5645724608Raph Levien    void savePreserveBuffer(Color8888* outputPtr, int outputPixelStride, int frameNr);
77bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    void restorePreserveBuffer(Color8888* outputPtr, int outputPixelStride);
78c31e3883456e018d742e9f29815ba5ff8b315ea1Raph Levien
79bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    const FrameSequence_gif& mFrameSequence;
80bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    Color8888* mPreserveBuffer;
81bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien    int mPreserveBufferFrame;
82bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien};
839cc9bbe1461f359f0b27c5e7645c17dda001ab1dRaph Levien
84bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien#endif //RASTERMILL_FRAMESQUENCE_GIF_H
85bcc3dc5a2591a95a57e379e27cbad69c18e91e67Raph Levien