1557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III/* 2557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Copyright 2017 Google Inc. 3557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * 4557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Use of this source code is governed by a BSD-style license that can be 5557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * found in the LICENSE file. 6557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 7557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 8557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III#ifndef SkFrameHolder_DEFINED 9557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III#define SkFrameHolder_DEFINED 10557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 11557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III#include "SkTypes.h" 12557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III#include "SkCodecAnimation.h" 1333deb7ed4d583c88187ba240efb749e9a1fd6843Leon Scroggins III#include "SkCodecAnimationPriv.h" 14466c7d65974a055ad361430e57f92584b09af0bdHal Canary#include "SkRect.h" 15557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 16557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III/** 17557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Base class for a single frame of an animated image. 18557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * 19557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Separate from SkCodec::FrameInfo, which is a pared down 20557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * interface that only contains the info the client needs. 21557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 22557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins IIIclass SkFrame : public SkNoncopyable { 23557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins IIIpublic: 24557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III SkFrame(int id) 25557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III : fId(id) 26557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III , fHasAlpha(false) 27557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III , fRequiredFrame(kUninitialized) 2833deb7ed4d583c88187ba240efb749e9a1fd6843Leon Scroggins III , fDisposalMethod(SkCodecAnimation::DisposalMethod::kKeep) 29557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III , fDuration(0) 30557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III , fBlend(SkCodecAnimation::Blend::kPriorFrame) 31557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III { 32557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III fRect.setEmpty(); 33557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III } 34557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 35557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III virtual ~SkFrame() {} 36557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 37557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III /** 38557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * 0-based index of the frame in the image sequence. 39557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 40557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III int frameId() const { return fId; } 41557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 42557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III /** 43c6f7a4ffa9522159efc42f7c948bba5e66bb8844Leon Scroggins III * How this frame reports its alpha. 44557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * 45557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * This only considers the rectangle of this frame, and 46557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * considers it to have alpha even if it is opaque once 47557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * blended with the frame behind it. 48557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 49c6f7a4ffa9522159efc42f7c948bba5e66bb8844Leon Scroggins III SkEncodedInfo::Alpha reportedAlpha() const { 50c6f7a4ffa9522159efc42f7c948bba5e66bb8844Leon Scroggins III return this->onReportedAlpha(); 51557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III } 52557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 53557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III /** 54557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Cached value representing whether the frame has alpha, 55557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * after compositing with the prior frame. 56557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 57557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III bool hasAlpha() const { return fHasAlpha; } 58557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 59557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III /** 60557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Cache whether the finished frame has alpha. 61557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 62557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III void setHasAlpha(bool alpha) { fHasAlpha = alpha; } 63557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 64557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III /** 65557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Whether enough of the frame has been read to determine 66557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * fRequiredFrame and fHasAlpha. 67557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 68557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III bool reachedStartOfData() const { return fRequiredFrame != kUninitialized; } 69557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 70557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III /** 71557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * The frame this one depends on. 72557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * 73557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Must not be called until fRequiredFrame has been set properly. 74557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 75557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III int getRequiredFrame() const { 76557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III SkASSERT(this->reachedStartOfData()); 77557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III return fRequiredFrame; 78557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III } 79557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 80557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III /** 81557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Set the frame that this frame depends on. 82557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 83557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III void setRequiredFrame(int req) { fRequiredFrame = req; } 84557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 85557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III /** 86557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Set the rectangle that is updated by this frame. 87557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 88557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III void setXYWH(int x, int y, int width, int height) { 89557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III fRect.setXYWH(x, y, width, height); 90557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III } 91557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 92557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III /** 93557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * The rectangle that is updated by this frame. 94557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 95557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III SkIRect frameRect() const { return fRect; } 96557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 97557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III int xOffset() const { return fRect.x(); } 98557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III int yOffset() const { return fRect.y(); } 99557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III int width() const { return fRect.width(); } 100557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III int height() const { return fRect.height(); } 101557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 102557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III SkCodecAnimation::DisposalMethod getDisposalMethod() const { 103557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III return fDisposalMethod; 104557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III } 105557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 106557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III void setDisposalMethod(SkCodecAnimation::DisposalMethod disposalMethod) { 107557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III fDisposalMethod = disposalMethod; 108557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III } 109557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 110557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III /** 111557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Set the duration (in ms) to show this frame. 112557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 113557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III void setDuration(int duration) { 114557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III fDuration = duration; 115557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III } 116557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 117557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III /** 118557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Duration in ms to show this frame. 119557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 120557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III int getDuration() const { 121557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III return fDuration; 122557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III } 123557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 124557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III void setBlend(SkCodecAnimation::Blend blend) { 125557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III fBlend = blend; 126557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III } 127557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 128557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III SkCodecAnimation::Blend getBlend() const { 129557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III return fBlend; 130557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III } 131557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 132557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins IIIprotected: 133c6f7a4ffa9522159efc42f7c948bba5e66bb8844Leon Scroggins III virtual SkEncodedInfo::Alpha onReportedAlpha() const = 0; 134557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 135557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins IIIprivate: 136557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III static constexpr int kUninitialized = -2; 137557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 138557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III const int fId; 139557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III bool fHasAlpha; 140557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III int fRequiredFrame; 141557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III SkIRect fRect; 142557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III SkCodecAnimation::DisposalMethod fDisposalMethod; 143557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III int fDuration; 144557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III SkCodecAnimation::Blend fBlend; 145557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III}; 146557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 147557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III/** 148557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Base class for an object which holds the SkFrames of an 149557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * image sequence. 150557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 151557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins IIIclass SkFrameHolder : public SkNoncopyable { 152557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins IIIpublic: 153557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III SkFrameHolder() 154557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III : fScreenWidth(0) 155557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III , fScreenHeight(0) 156557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III {} 157557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 158557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III virtual ~SkFrameHolder() {} 159557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 160557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III /** 161557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Size of the image. Each frame will be contained in 162557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * these dimensions (possibly after clipping). 163557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 164557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III int screenWidth() const { return fScreenWidth; } 165557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III int screenHeight() const { return fScreenHeight; } 166557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 167557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III /** 168557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Compute the opacity and required frame, based on 169c6f7a4ffa9522159efc42f7c948bba5e66bb8844Leon Scroggins III * the frame's reportedAlpha and how it blends 170557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * with prior frames. 171557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 172557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III void setAlphaAndRequiredFrame(SkFrame*); 173557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 174557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III /** 175557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III * Return the frame with frameId i. 176557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III */ 177557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III const SkFrame* getFrame(int i) const { 178557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III return this->onGetFrame(i); 179557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III } 180557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 181557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins IIIprotected: 182557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III int fScreenWidth; 183557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III int fScreenHeight; 184557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 185557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III virtual const SkFrame* onGetFrame(int i) const = 0; 186557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III}; 187557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III 188557fbbe05ba48bcc20be684d11fe0edfc24c87baLeon Scroggins III#endif // SkFrameHolder_DEFINED 189