const SkMatrix& inv,
SkFilterQuality quality,
void* storage, size_t storageSize) {
- if (!provider.validForDrawing()) {
- return nullptr;
- }
-
State* state = this->onRequestBitmap(provider, inv, quality, storage, storageSize);
if (state) {
if (nullptr == state->fPixmap.addr()) {
, fBMState(nullptr)
{}
-SkBitmapProcInfo::SkBitmapProcInfo(const SkBitmap& bm,
- SkShader::TileMode tmx, SkShader::TileMode tmy,
- SkDestinationSurfaceColorMode colorMode)
- : fProvider(SkBitmapProvider(bm))
- , fTileModeX(tmx)
- , fTileModeY(tmy)
- ,fColorMode(colorMode)
- , fBMState(nullptr)
-{}
-
SkBitmapProcInfo::~SkBitmapProcInfo() {
SkInPlaceDeleteCheck(fBMState, fBMStateStorage.get());
}
struct SkBitmapProcInfo {
SkBitmapProcInfo(const SkBitmapProvider&, SkShader::TileMode tmx, SkShader::TileMode tmy,
SkDestinationSurfaceColorMode);
- SkBitmapProcInfo(const SkBitmap&, SkShader::TileMode tmx, SkShader::TileMode tmy,
- SkDestinationSurfaceColorMode);
~SkBitmapProcInfo();
const SkBitmapProvider fProvider;
SkBitmapProcState(const SkBitmapProvider& prov, SkShader::TileMode tmx, SkShader::TileMode tmy,
SkDestinationSurfaceColorMode colorMode)
: SkBitmapProcInfo(prov, tmx, tmy, colorMode) {}
- SkBitmapProcState(const SkBitmap& bitmap, SkShader::TileMode tmx, SkShader::TileMode tmy,
- SkDestinationSurfaceColorMode colorMode)
- : SkBitmapProcInfo(bitmap, tmx, tmy, colorMode) {}
bool setup(const SkMatrix& inv, const SkPaint& paint) {
return this->init(inv, paint) && this->chooseProcs();
#include "SkPixelRef.h"
int SkBitmapProvider::width() const {
- return fImage ? fImage->width() : fBitmap.width();
+ return fImage->width();
}
int SkBitmapProvider::height() const {
- return fImage ? fImage->height() : fBitmap.height();
+ return fImage->height();
}
uint32_t SkBitmapProvider::getID() const {
- return fImage ? fImage->uniqueID() : fBitmap.getGenerationID();
-}
-
-bool SkBitmapProvider::validForDrawing() const {
- if (!fImage) {
- if (0 == fBitmap.width() || 0 == fBitmap.height()) {
- return false;
- }
- if (nullptr == fBitmap.pixelRef()) {
- return false; // no pixels to read
- }
- if (kIndex_8_SkColorType == fBitmap.colorType()) {
- SkAutoLockPixels alp(fBitmap); // but we need to call it before getColorTable() is safe.
- if (!fBitmap.getColorTable()) {
- return false;
- }
- }
- }
- return true;
+ return fImage->uniqueID();
}
SkImageInfo SkBitmapProvider::info() const {
- if (fImage) {
- return as_IB(fImage)->onImageInfo();
- } else {
- return fBitmap.info();
- }
+ return as_IB(fImage)->onImageInfo();
}
bool SkBitmapProvider::isVolatile() const {
- if (fImage) {
- // add flag to images?
- const SkBitmap* bm = as_IB(fImage)->onPeekBitmap();
- return bm ? bm->isVolatile() : false;
- } else {
- return fBitmap.isVolatile();
- }
+ // add flag to images?
+ const SkBitmap* bm = as_IB(fImage)->onPeekBitmap();
+ return bm ? bm->isVolatile() : false;
}
SkBitmapCacheDesc SkBitmapProvider::makeCacheDesc(int w, int h) const {
- return fImage ? SkBitmapCacheDesc::Make(fImage, w, h) : SkBitmapCacheDesc::Make(fBitmap, w, h);
+ return SkBitmapCacheDesc::Make(fImage, w, h);
}
SkBitmapCacheDesc SkBitmapProvider::makeCacheDesc() const {
- return fImage ? SkBitmapCacheDesc::Make(fImage) : SkBitmapCacheDesc::Make(fBitmap);
+ return SkBitmapCacheDesc::Make(fImage);
}
void SkBitmapProvider::notifyAddedToCache() const {
- if (fImage) {
- as_IB(fImage)->notifyAddedToCache();
- } else {
- fBitmap.pixelRef()->notifyAddedToCache();
- }
+ as_IB(fImage)->notifyAddedToCache();
}
bool SkBitmapProvider::asBitmap(SkBitmap* bm) const {
- if (fImage) {
- return as_IB(fImage)->getROPixels(bm, SkImage::kAllow_CachingHint);
- } else {
- *bm = fBitmap;
- return true;
- }
+ return as_IB(fImage)->getROPixels(bm, SkImage::kAllow_CachingHint);
}
#ifndef SkBitmapProvider_DEFINED
#define SkBitmapProvider_DEFINED
-#include "SkBitmap.h"
#include "SkImage.h"
#include "SkBitmapCache.h"
class SkBitmapProvider {
public:
- explicit SkBitmapProvider(const SkBitmap& bm) : fBitmap(bm) {}
- explicit SkBitmapProvider(const SkImage* img) : fImage(img) {}
+ explicit SkBitmapProvider(const SkImage* img) : fImage(img) { SkASSERT(img); }
SkBitmapProvider(const SkBitmapProvider& other)
- : fBitmap(other.fBitmap)
- , fImage(other.fImage)
+ : fImage(other.fImage)
{}
int width() const;
int height() const;
uint32_t getID() const;
- bool validForDrawing() const;
SkImageInfo info() const;
bool isVolatile() const;
void* operator new(size_t) = delete;
void* operator new(size_t, void*) = delete;
- SkBitmap fBitmap;
// SkBitmapProvider is always short-lived/stack allocated, and the source image is guaranteed
// to outlive its scope => we can store a raw ptr to avoid ref churn.
const SkImage* fImage;