| /* | |
| * Copyright 2023 Google LLC | |
| * | |
| * Use of this source code is governed by a BSD-style license that can be | |
| * found in the LICENSE file. | |
| */ | |
| #ifndef SkImage_Raster_DEFINED | |
| #define SkImage_Raster_DEFINED | |
| #include "include/core/SkBitmap.h" | |
| #include "include/core/SkImage.h" | |
| #include "include/core/SkPixelRef.h" | |
| #include "include/core/SkRecorder.h" | |
| #include "include/core/SkRefCnt.h" | |
| #include "include/core/SkTypes.h" | |
| #include "include/private/SkTo.h" | |
| #include "src/core/SkMipmap.h" | |
| #include "src/image/SkImage_Base.h" | |
| #include <cstddef> | |
| #include <cstdint> | |
| #include <utility> | |
| class GrDirectContext; | |
| class SkColorSpace; | |
| class SkData; | |
| class SkPixmap; | |
| class SkSurface; | |
| class SkImageShader; | |
| enum SkColorType : int; | |
| struct SkIRect; | |
| struct SkImageInfo; | |
| enum class SkCopyPixelsMode { | |
| kIfMutable, //!< only copy src pixels if they are marked mutable | |
| kAlways, //!< always copy src pixels (even if they are marked immutable) | |
| kNever, //!< never copy src pixels (even if they are marked mutable) | |
| }; | |
| class SkImage_Raster : public SkImage_Base { | |
| public: | |
| SkImage_Raster(const SkImageInfo&, sk_sp<SkData>, size_t rb, sk_sp<SkMipmap>, uint32_t id); | |
| ~SkImage_Raster() override; | |
| // From SkImage.h | |
| bool isValid(SkRecorder* recorder) const override { | |
| return recorder && recorder->cpuRecorder(); | |
| } | |
| sk_sp<SkImage> makeColorTypeAndColorSpace(SkRecorder*, | |
| SkColorType targetColorType, | |
| sk_sp<SkColorSpace> targetColorSpace, | |
| RequiredProperties) const override; | |
| // From SkImage_Base.h | |
| bool onReadPixels(GrDirectContext*, const SkImageInfo&, void*, size_t, int srcX, int srcY, | |
| CachingHint) const override; | |
| bool onPeekPixels(SkPixmap*) const override; | |
| const SkBitmap* onPeekBitmap() const override { return &fBitmap; } | |
| bool getROPixels(GrDirectContext*, SkBitmap*, CachingHint) const override; | |
| sk_sp<SkImage> onMakeSubset(SkRecorder*, const SkIRect&, RequiredProperties) const override; | |
| sk_sp<SkSurface> onMakeSurface(SkRecorder*, const SkImageInfo&) const final; | |
| SkPixelRef* getPixelRef() const { return fBitmap.pixelRef(); } | |
| bool onAsLegacyBitmap(GrDirectContext*, SkBitmap*) const override; | |
| sk_sp<SkImage> onReinterpretColorSpace(sk_sp<SkColorSpace>) const override; | |
| void notifyAddedToRasterCache() const override { | |
| // We explicitly DON'T want to call INHERITED::notifyAddedToRasterCache. That ties the | |
| // lifetime of derived/cached resources to the image. In this case, we only want cached | |
| // data (eg mips) tied to the lifetime of the underlying pixelRef. | |
| SkASSERT(fBitmap.pixelRef()); | |
| fBitmap.pixelRef()->notifyAddedToCache(); | |
| } | |
| bool onHasMipmaps() const override { return SkToBool(fMips); } | |
| bool onIsProtected() const override { return false; } | |
| SkMipmap* onPeekMips() const override { return fMips.get(); } | |
| sk_sp<SkImage> onMakeWithMipmaps(sk_sp<SkMipmap>) const override; | |
| SkImage_Base::Type type() const override { return SkImage_Base::Type::kRaster; } | |
| SkBitmap bitmap() const { return fBitmap; } | |
| // Convenience method to return a shader that implements the shader+image behavior defined for | |
| // drawImage/Bitmap where the paint's shader is ignored when the bitmap is a color image, but | |
| // properly compose them together when it is an alpha image. This allows the returned paint to | |
| // be assigned to a paint clone without discarding the original behavior. | |
| sk_sp<SkShader> makeShaderForPaint(const SkPaint& paint, | |
| SkTileMode tmx, | |
| SkTileMode tmy, | |
| const SkSamplingOptions& sampling, | |
| const SkMatrix* localMatrix); | |
| /** | |
| * Examines the bitmap to decide if it can share the existing pixelRef, or | |
| * if it needs to make a deep-copy of the pixels. | |
| * | |
| * The bitmap's pixelref will be shared if either the bitmap is marked as | |
| * immutable, or CopyPixelsMode allows it. | |
| * | |
| * If the bitmap's colortype cannot be converted into a corresponding | |
| * SkImageInfo, or the bitmap's pixels cannot be accessed, this will return | |
| * nullptr. | |
| */ | |
| static sk_sp<SkImage_Raster> MakeFromBitmap(const SkBitmap&, | |
| SkCopyPixelsMode, | |
| sk_sp<SkMipmap> = nullptr); | |
| protected: | |
| SkImage_Raster(const SkBitmap&, sk_sp<SkMipmap>, bool bitmapMayBeMutable); | |
| private: | |
| SkBitmap fBitmap; | |
| sk_sp<SkMipmap> fMips; | |
| }; | |
| #endif // SkImage_Raster_DEFINED |