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