xref: /aosp_15_r20/external/skia/src/image/SkImage_Base.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker  * Copyright 2012 Google Inc.
3*c8dee2aaSAndroid Build Coastguard Worker  *
4*c8dee2aaSAndroid Build Coastguard Worker  * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker  * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker  */
7*c8dee2aaSAndroid Build Coastguard Worker 
8*c8dee2aaSAndroid Build Coastguard Worker #ifndef SkImage_Base_DEFINED
9*c8dee2aaSAndroid Build Coastguard Worker #define SkImage_Base_DEFINED
10*c8dee2aaSAndroid Build Coastguard Worker 
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImage.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkMipmap.h"
16*c8dee2aaSAndroid Build Coastguard Worker 
17*c8dee2aaSAndroid Build Coastguard Worker #include <atomic>
18*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
19*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
20*c8dee2aaSAndroid Build Coastguard Worker 
21*c8dee2aaSAndroid Build Coastguard Worker class GrDirectContext;
22*c8dee2aaSAndroid Build Coastguard Worker class GrImageContext;
23*c8dee2aaSAndroid Build Coastguard Worker class SkBitmap;
24*c8dee2aaSAndroid Build Coastguard Worker class SkColorSpace;
25*c8dee2aaSAndroid Build Coastguard Worker class SkPixmap;
26*c8dee2aaSAndroid Build Coastguard Worker class SkSurface;
27*c8dee2aaSAndroid Build Coastguard Worker enum SkColorType : int;
28*c8dee2aaSAndroid Build Coastguard Worker enum SkYUVColorSpace : int;
29*c8dee2aaSAndroid Build Coastguard Worker struct SkIRect;
30*c8dee2aaSAndroid Build Coastguard Worker struct SkISize;
31*c8dee2aaSAndroid Build Coastguard Worker struct SkImageInfo;
32*c8dee2aaSAndroid Build Coastguard Worker 
33*c8dee2aaSAndroid Build Coastguard Worker enum {
34*c8dee2aaSAndroid Build Coastguard Worker     kNeedNewImageUniqueID = 0
35*c8dee2aaSAndroid Build Coastguard Worker };
36*c8dee2aaSAndroid Build Coastguard Worker 
37*c8dee2aaSAndroid Build Coastguard Worker namespace skgpu::graphite {
38*c8dee2aaSAndroid Build Coastguard Worker class Recorder;
39*c8dee2aaSAndroid Build Coastguard Worker }
40*c8dee2aaSAndroid Build Coastguard Worker 
41*c8dee2aaSAndroid Build Coastguard Worker class SkImage_Base : public SkImage {
42*c8dee2aaSAndroid Build Coastguard Worker public:
43*c8dee2aaSAndroid Build Coastguard Worker     ~SkImage_Base() override;
44*c8dee2aaSAndroid Build Coastguard Worker 
45*c8dee2aaSAndroid Build Coastguard Worker     // From SkImage.h
46*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage> makeColorSpace(GrDirectContext*, sk_sp<SkColorSpace>) const override;
47*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage> makeColorSpace(skgpu::graphite::Recorder*,
48*c8dee2aaSAndroid Build Coastguard Worker                                   sk_sp<SkColorSpace>,
49*c8dee2aaSAndroid Build Coastguard Worker                                   RequiredProperties) const override;
50*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage> makeColorTypeAndColorSpace(GrDirectContext* dContext,
51*c8dee2aaSAndroid Build Coastguard Worker                                               SkColorType targetColorType,
52*c8dee2aaSAndroid Build Coastguard Worker                                               sk_sp<SkColorSpace> targetCS) const override;
53*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage> makeColorTypeAndColorSpace(skgpu::graphite::Recorder*,
54*c8dee2aaSAndroid Build Coastguard Worker                                               SkColorType,
55*c8dee2aaSAndroid Build Coastguard Worker                                               sk_sp<SkColorSpace>,
56*c8dee2aaSAndroid Build Coastguard Worker                                               RequiredProperties) const override;
57*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage> makeSubset(GrDirectContext* direct, const SkIRect& subset) const override;
58*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkImage> makeSubset(skgpu::graphite::Recorder*,
59*c8dee2aaSAndroid Build Coastguard Worker                               const SkIRect&,
60*c8dee2aaSAndroid Build Coastguard Worker                               RequiredProperties) const override;
61*c8dee2aaSAndroid Build Coastguard Worker 
textureSize()62*c8dee2aaSAndroid Build Coastguard Worker     size_t textureSize() const override { return 0; }
63*c8dee2aaSAndroid Build Coastguard Worker 
64*c8dee2aaSAndroid Build Coastguard Worker     // Methods that we want to use elsewhere in Skia, but not be a part of the public API.
onPeekPixels(SkPixmap *)65*c8dee2aaSAndroid Build Coastguard Worker     virtual bool onPeekPixels(SkPixmap*) const { return false; }
66*c8dee2aaSAndroid Build Coastguard Worker 
onPeekBitmap()67*c8dee2aaSAndroid Build Coastguard Worker     virtual const SkBitmap* onPeekBitmap() const { return nullptr; }
68*c8dee2aaSAndroid Build Coastguard Worker 
69*c8dee2aaSAndroid Build Coastguard Worker     virtual bool onReadPixels(GrDirectContext*,
70*c8dee2aaSAndroid Build Coastguard Worker                               const SkImageInfo& dstInfo,
71*c8dee2aaSAndroid Build Coastguard Worker                               void* dstPixels,
72*c8dee2aaSAndroid Build Coastguard Worker                               size_t dstRowBytes,
73*c8dee2aaSAndroid Build Coastguard Worker                               int srcX,
74*c8dee2aaSAndroid Build Coastguard Worker                               int srcY,
75*c8dee2aaSAndroid Build Coastguard Worker                               CachingHint) const = 0;
76*c8dee2aaSAndroid Build Coastguard Worker 
77*c8dee2aaSAndroid Build Coastguard Worker     // used by makeScaled()
78*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkSurface> onMakeSurface(skgpu::graphite::Recorder*,
79*c8dee2aaSAndroid Build Coastguard Worker                                            const SkImageInfo&) const = 0;
80*c8dee2aaSAndroid Build Coastguard Worker 
readPixelsGraphite(skgpu::graphite::Recorder *,const SkPixmap & dst,int srcX,int srcY)81*c8dee2aaSAndroid Build Coastguard Worker     virtual bool readPixelsGraphite(skgpu::graphite::Recorder*,
82*c8dee2aaSAndroid Build Coastguard Worker                                     const SkPixmap& dst,
83*c8dee2aaSAndroid Build Coastguard Worker                                     int srcX,
84*c8dee2aaSAndroid Build Coastguard Worker                                     int srcY) const {
85*c8dee2aaSAndroid Build Coastguard Worker         return false;
86*c8dee2aaSAndroid Build Coastguard Worker     }
87*c8dee2aaSAndroid Build Coastguard Worker 
88*c8dee2aaSAndroid Build Coastguard Worker     virtual bool onHasMipmaps() const = 0;
89*c8dee2aaSAndroid Build Coastguard Worker     virtual bool onIsProtected() const = 0;
90*c8dee2aaSAndroid Build Coastguard Worker 
onPeekMips()91*c8dee2aaSAndroid Build Coastguard Worker     virtual SkMipmap* onPeekMips() const { return nullptr; }
92*c8dee2aaSAndroid Build Coastguard Worker 
refMips()93*c8dee2aaSAndroid Build Coastguard Worker     sk_sp<SkMipmap> refMips() const {
94*c8dee2aaSAndroid Build Coastguard Worker         return sk_ref_sp(this->onPeekMips());
95*c8dee2aaSAndroid Build Coastguard Worker     }
96*c8dee2aaSAndroid Build Coastguard Worker 
97*c8dee2aaSAndroid Build Coastguard Worker     /**
98*c8dee2aaSAndroid Build Coastguard Worker      * Default implementation does a rescale/read and then calls the callback.
99*c8dee2aaSAndroid Build Coastguard Worker      */
100*c8dee2aaSAndroid Build Coastguard Worker     virtual void onAsyncRescaleAndReadPixels(const SkImageInfo&,
101*c8dee2aaSAndroid Build Coastguard Worker                                              SkIRect srcRect,
102*c8dee2aaSAndroid Build Coastguard Worker                                              RescaleGamma,
103*c8dee2aaSAndroid Build Coastguard Worker                                              RescaleMode,
104*c8dee2aaSAndroid Build Coastguard Worker                                              ReadPixelsCallback,
105*c8dee2aaSAndroid Build Coastguard Worker                                              ReadPixelsContext) const;
106*c8dee2aaSAndroid Build Coastguard Worker     /**
107*c8dee2aaSAndroid Build Coastguard Worker      * Default implementation does a rescale/read/yuv conversion and then calls the callback.
108*c8dee2aaSAndroid Build Coastguard Worker      */
109*c8dee2aaSAndroid Build Coastguard Worker     virtual void onAsyncRescaleAndReadPixelsYUV420(SkYUVColorSpace,
110*c8dee2aaSAndroid Build Coastguard Worker                                                    bool readAlpha,
111*c8dee2aaSAndroid Build Coastguard Worker                                                    sk_sp<SkColorSpace> dstColorSpace,
112*c8dee2aaSAndroid Build Coastguard Worker                                                    SkIRect srcRect,
113*c8dee2aaSAndroid Build Coastguard Worker                                                    SkISize dstSize,
114*c8dee2aaSAndroid Build Coastguard Worker                                                    RescaleGamma,
115*c8dee2aaSAndroid Build Coastguard Worker                                                    RescaleMode,
116*c8dee2aaSAndroid Build Coastguard Worker                                                    ReadPixelsCallback,
117*c8dee2aaSAndroid Build Coastguard Worker                                                    ReadPixelsContext) const;
118*c8dee2aaSAndroid Build Coastguard Worker 
context()119*c8dee2aaSAndroid Build Coastguard Worker     virtual GrImageContext* context() const { return nullptr; }
120*c8dee2aaSAndroid Build Coastguard Worker 
121*c8dee2aaSAndroid Build Coastguard Worker     /** this->context() try-casted to GrDirectContext. Useful for migrations – avoid otherwise! */
directContext()122*c8dee2aaSAndroid Build Coastguard Worker     virtual GrDirectContext* directContext() const { return nullptr; }
123*c8dee2aaSAndroid Build Coastguard Worker 
124*c8dee2aaSAndroid Build Coastguard Worker     // If this image is the current cached image snapshot of a surface then this is called when the
125*c8dee2aaSAndroid Build Coastguard Worker     // surface is destroyed to indicate no further writes may happen to surface backing store.
generatingSurfaceIsDeleted()126*c8dee2aaSAndroid Build Coastguard Worker     virtual void generatingSurfaceIsDeleted() {}
127*c8dee2aaSAndroid Build Coastguard Worker 
128*c8dee2aaSAndroid Build Coastguard Worker     // return a read-only copy of the pixels. We promise to not modify them,
129*c8dee2aaSAndroid Build Coastguard Worker     // but only inspect them (or encode them).
130*c8dee2aaSAndroid Build Coastguard Worker     virtual bool getROPixels(GrDirectContext*, SkBitmap*,
131*c8dee2aaSAndroid Build Coastguard Worker                              CachingHint = kAllow_CachingHint) const = 0;
132*c8dee2aaSAndroid Build Coastguard Worker 
133*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkImage> onMakeSubset(GrDirectContext*, const SkIRect&) const = 0;
134*c8dee2aaSAndroid Build Coastguard Worker 
onRefEncoded()135*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkData> onRefEncoded() const { return nullptr; }
136*c8dee2aaSAndroid Build Coastguard Worker 
137*c8dee2aaSAndroid Build Coastguard Worker     virtual bool onAsLegacyBitmap(GrDirectContext*, SkBitmap*) const;
138*c8dee2aaSAndroid Build Coastguard Worker 
139*c8dee2aaSAndroid Build Coastguard Worker     enum class Type {
140*c8dee2aaSAndroid Build Coastguard Worker         kRaster,
141*c8dee2aaSAndroid Build Coastguard Worker         kRasterPinnable,
142*c8dee2aaSAndroid Build Coastguard Worker         kLazy,
143*c8dee2aaSAndroid Build Coastguard Worker         kLazyPicture,
144*c8dee2aaSAndroid Build Coastguard Worker         kGanesh,
145*c8dee2aaSAndroid Build Coastguard Worker         kGaneshYUVA,
146*c8dee2aaSAndroid Build Coastguard Worker         kGraphite,
147*c8dee2aaSAndroid Build Coastguard Worker         kGraphiteYUVA,
148*c8dee2aaSAndroid Build Coastguard Worker     };
149*c8dee2aaSAndroid Build Coastguard Worker 
150*c8dee2aaSAndroid Build Coastguard Worker     virtual Type type() const = 0;
151*c8dee2aaSAndroid Build Coastguard Worker 
152*c8dee2aaSAndroid Build Coastguard Worker     // True for picture-backed and codec-backed
isLazyGenerated()153*c8dee2aaSAndroid Build Coastguard Worker     bool isLazyGenerated() const override {
154*c8dee2aaSAndroid Build Coastguard Worker         return this->type() == Type::kLazy || this->type() == Type::kLazyPicture;
155*c8dee2aaSAndroid Build Coastguard Worker     }
156*c8dee2aaSAndroid Build Coastguard Worker 
isRasterBacked()157*c8dee2aaSAndroid Build Coastguard Worker     bool isRasterBacked() const {
158*c8dee2aaSAndroid Build Coastguard Worker         return this->type() == Type::kRaster || this->type() == Type::kRasterPinnable;
159*c8dee2aaSAndroid Build Coastguard Worker     }
160*c8dee2aaSAndroid Build Coastguard Worker 
161*c8dee2aaSAndroid Build Coastguard Worker     // True for images instantiated by Ganesh in GPU memory
isGaneshBacked()162*c8dee2aaSAndroid Build Coastguard Worker     bool isGaneshBacked() const {
163*c8dee2aaSAndroid Build Coastguard Worker         return this->type() == Type::kGanesh || this->type() == Type::kGaneshYUVA;
164*c8dee2aaSAndroid Build Coastguard Worker     }
165*c8dee2aaSAndroid Build Coastguard Worker 
166*c8dee2aaSAndroid Build Coastguard Worker     // True for images instantiated by Graphite in GPU memory
isGraphiteBacked()167*c8dee2aaSAndroid Build Coastguard Worker     bool isGraphiteBacked() const {
168*c8dee2aaSAndroid Build Coastguard Worker         return this->type() == Type::kGraphite || this->type() == Type::kGraphiteYUVA;
169*c8dee2aaSAndroid Build Coastguard Worker     }
170*c8dee2aaSAndroid Build Coastguard Worker 
isYUVA()171*c8dee2aaSAndroid Build Coastguard Worker     bool isYUVA() const {
172*c8dee2aaSAndroid Build Coastguard Worker         return this->type() == Type::kGaneshYUVA || this->type() == Type::kGraphiteYUVA;
173*c8dee2aaSAndroid Build Coastguard Worker     }
174*c8dee2aaSAndroid Build Coastguard Worker 
isTextureBacked()175*c8dee2aaSAndroid Build Coastguard Worker     bool isTextureBacked() const override {
176*c8dee2aaSAndroid Build Coastguard Worker         return this->isGaneshBacked() || this->isGraphiteBacked();
177*c8dee2aaSAndroid Build Coastguard Worker     }
178*c8dee2aaSAndroid Build Coastguard Worker 
179*c8dee2aaSAndroid Build Coastguard Worker     // Call when this image is part of the key to a resourcecache entry. This allows the cache
180*c8dee2aaSAndroid Build Coastguard Worker     // to know automatically those entries can be purged when this SkImage deleted.
notifyAddedToRasterCache()181*c8dee2aaSAndroid Build Coastguard Worker     virtual void notifyAddedToRasterCache() const {
182*c8dee2aaSAndroid Build Coastguard Worker         fAddedToRasterCache.store(true);
183*c8dee2aaSAndroid Build Coastguard Worker     }
184*c8dee2aaSAndroid Build Coastguard Worker 
185*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkImage> onMakeColorTypeAndColorSpace(SkColorType, sk_sp<SkColorSpace>,
186*c8dee2aaSAndroid Build Coastguard Worker                                                         GrDirectContext*) const = 0;
187*c8dee2aaSAndroid Build Coastguard Worker 
188*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkImage> onReinterpretColorSpace(sk_sp<SkColorSpace>) const = 0;
189*c8dee2aaSAndroid Build Coastguard Worker 
190*c8dee2aaSAndroid Build Coastguard Worker     // on failure, returns nullptr
191*c8dee2aaSAndroid Build Coastguard Worker     // NOLINTNEXTLINE(performance-unnecessary-value-param)
onMakeWithMipmaps(sk_sp<SkMipmap>)192*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkImage> onMakeWithMipmaps(sk_sp<SkMipmap>) const {
193*c8dee2aaSAndroid Build Coastguard Worker         return nullptr;
194*c8dee2aaSAndroid Build Coastguard Worker     }
195*c8dee2aaSAndroid Build Coastguard Worker 
196*c8dee2aaSAndroid Build Coastguard Worker     virtual sk_sp<SkImage> onMakeSubset(skgpu::graphite::Recorder*,
197*c8dee2aaSAndroid Build Coastguard Worker                                         const SkIRect&,
198*c8dee2aaSAndroid Build Coastguard Worker                                         RequiredProperties) const = 0;
199*c8dee2aaSAndroid Build Coastguard Worker 
200*c8dee2aaSAndroid Build Coastguard Worker protected:
201*c8dee2aaSAndroid Build Coastguard Worker     SkImage_Base(const SkImageInfo& info, uint32_t uniqueID);
202*c8dee2aaSAndroid Build Coastguard Worker 
203*c8dee2aaSAndroid Build Coastguard Worker private:
204*c8dee2aaSAndroid Build Coastguard Worker     // Set true by caches when they cache content that's derived from the current pixels.
205*c8dee2aaSAndroid Build Coastguard Worker     mutable std::atomic<bool> fAddedToRasterCache;
206*c8dee2aaSAndroid Build Coastguard Worker };
207*c8dee2aaSAndroid Build Coastguard Worker 
as_IB(SkImage * image)208*c8dee2aaSAndroid Build Coastguard Worker static inline SkImage_Base* as_IB(SkImage* image) {
209*c8dee2aaSAndroid Build Coastguard Worker     return static_cast<SkImage_Base*>(image);
210*c8dee2aaSAndroid Build Coastguard Worker }
211*c8dee2aaSAndroid Build Coastguard Worker 
as_IB(const sk_sp<SkImage> & image)212*c8dee2aaSAndroid Build Coastguard Worker static inline SkImage_Base* as_IB(const sk_sp<SkImage>& image) {
213*c8dee2aaSAndroid Build Coastguard Worker     return static_cast<SkImage_Base*>(image.get());
214*c8dee2aaSAndroid Build Coastguard Worker }
215*c8dee2aaSAndroid Build Coastguard Worker 
as_IB(const SkImage * image)216*c8dee2aaSAndroid Build Coastguard Worker static inline const SkImage_Base* as_IB(const SkImage* image) {
217*c8dee2aaSAndroid Build Coastguard Worker     return static_cast<const SkImage_Base*>(image);
218*c8dee2aaSAndroid Build Coastguard Worker }
219*c8dee2aaSAndroid Build Coastguard Worker 
as_IB(const sk_sp<const SkImage> & image)220*c8dee2aaSAndroid Build Coastguard Worker static inline const SkImage_Base* as_IB(const sk_sp<const SkImage>& image) {
221*c8dee2aaSAndroid Build Coastguard Worker     return static_cast<const SkImage_Base*>(image.get());
222*c8dee2aaSAndroid Build Coastguard Worker }
223*c8dee2aaSAndroid Build Coastguard Worker 
224*c8dee2aaSAndroid Build Coastguard Worker #endif
225