blob: 99838ec336aaed39e52e7694f4ce2dedfea13bf9 [file]
/*
* 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 {
if (!recorder) {
return false;
}
if (!recorder->cpuRecorder()) {
return false;
}
return true;
}
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