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