51 fHead = fTail =
nullptr;
70 entry->fPrev->fNext = entry->fNext;
77 entry->fNext->fPrev = entry->fPrev;
85void GrGradientBitmapCache::attachToHead(Entry* entry)
const {
86 entry->fPrev =
nullptr;
96bool GrGradientBitmapCache::find(
const void*
buffer,
size_t size,
SkBitmap* bm)
const {
97 AutoValidate av(
this);
101 if (entry->equals(
buffer, size)) {
103 *bm = entry->fBitmap;
106 this->release(entry);
107 this->attachToHead(entry);
110 entry = entry->fNext;
115void GrGradientBitmapCache::add(
const void*
buffer,
size_t len,
const SkBitmap& bm) {
116 AutoValidate av(
this);
118 if (fEntryCount == fMaxEntries) {
120 delete this->release(fTail);
125 this->attachToHead(entry);
131void GrGradientBitmapCache::fillGradient(
const SkPMColor4f* colors,
134 bool colorsAreOpaque,
143 p.append(SkRasterPipelineOp::seed_shader);
147 &p, &alloc, colorsAreOpaque, interpolation, intermediateColorSpace, dstColorSpace);
148 p.appendStore(
bitmap->colorType(), &ctx);
149 p.run(0, 0,
bitmap->width(), 1);
155 bool colorsAreOpaque,
166 static_assert(
sizeof(
SkPMColor4f) %
sizeof(int32_t) == 0,
"");
169 const int keyCount = 1 +
175 (dstColorSpace ? 2 : 0);
178 int32_t*
buffer = storage.get();
182 buffer += colorsAsIntCount;
183 for (
int i = 1; i <
count - 1; i++) {
186 *
buffer++ =
static_cast<int32_t
>(alphaType);
201 size_t size = keyCount *
sizeof(int32_t);
202 if (!this->find(storage.get(), size,
bitmap)) {
205 this->fillGradient(colors,
210 intermediateColorSpace,
214 this->add(storage.get(), size, *
bitmap);
222void GrGradientBitmapCache::validate()
const {
223 SkASSERT(fEntryCount >= 0 && fEntryCount <= fMaxEntries);
225 if (fEntryCount > 0) {
229 if (fEntryCount == 1) {
235 Entry* entry = fHead;
239 entry = entry->
fNext;
246 entry = entry->
fPrev;
static void info(const char *fmt,...) SK_PRINTF_LIKE(1
static float next(float f)
SkRGBA4f< kPremul_SkAlphaType > SkPMColor4f
static uint32_t SkFloat2Bits(float value)
static SkColorType colorType(AImageDecoder *decoder, const AImageDecoderHeaderInfo *headerInfo)
SK_API void sk_free(void *)
static void * sk_malloc_throw(size_t size)
void getGradient(const SkPMColor4f *colors, const SkScalar *positions, int count, bool colorsAreOpaque, const SkGradientShader::Interpolation &interpolation, const SkColorSpace *intermediateColorSpace, const SkColorSpace *dstColorSpace, SkColorType colorType, SkAlphaType alphaType, SkBitmap *bitmap)
GrGradientBitmapCache(int maxEntries, int resolution)
uint32_t toXYZD50Hash() const
uint32_t transferFnHash() const
static void AppendGradientFillStages(SkRasterPipeline *p, SkArenaAlloc *alloc, const SkPMColor4f *colors, const SkScalar *positions, int count)
static void AppendInterpolatedToDstStages(SkRasterPipeline *p, SkArenaAlloc *alloc, bool colorsAreOpaque, const Interpolation &interpolation, const SkColorSpace *intermediateColorSpace, const SkColorSpace *dstColorSpace)
static SkMatrix Scale(SkScalar sx, SkScalar sy)
static const uint8_t buffer[]
static float max(float r, float g, float b)
bool equals(const void *buffer, size_t size) const
Entry(const void *buffer, size_t size, const SkBitmap &bm)
static SkImageInfo Make(int width, int height, SkColorType ct, SkAlphaType at)