GrTexture* onRefUnstretchedTexture(GrContext* ctx) override { GrTexture* tex = fBitmap.getTexture(); if (tex) { return SkRef(tex); } GrUniqueKey unstretchedKey; make_unstretched_key(&unstretchedKey, fBitmap.getGenerationID(), fBitmap.getSubset()); GrTexture* result = ctx->textureProvider()->findAndRefTextureByUniqueKey(unstretchedKey); if (result) { return result; } return create_unstretched_bitmap_texture(ctx, fBitmap, unstretchedKey); }
static GrTexture* create_bitmap_texture(GrContext* ctx, const SkBitmap& bmp, const Stretch& stretch, const GrUniqueKey& unstretchedKey, const GrUniqueKey& stretchedKey) { if (Stretch::kNone_Type != stretch.fType) { SkAutoTUnref<GrTexture> unstretched; // Check if we have the unstretched version in the cache, if not create it. if (unstretchedKey.isValid()) { unstretched.reset(ctx->textureProvider()->findAndRefTextureByUniqueKey(unstretchedKey)); } if (!unstretched) { unstretched.reset(create_unstretched_bitmap_texture(ctx, bmp, unstretchedKey)); if (!unstretched) { // We might not have been able to create a unstrecthed texture because it is smaller // than the min texture size. In that case do cpu stretching. SkBitmap stretchedBmp = stretch_on_cpu(bmp, stretch); return create_unstretched_bitmap_texture(ctx, stretchedBmp, stretchedKey); } } return stretch_texture(unstretched, stretch, bmp.pixelRef(), stretchedKey); } return create_unstretched_bitmap_texture(ctx, bmp, unstretchedKey); }
GrTexture* GrTextureMaker::onGenerateStretchedTexture(GrContext* ctx, const SkGrStretch& stretch) { if (this->width() < ctx->caps()->minTextureSize() || this->height() < ctx->caps()->minTextureSize()) { // we can't trust our ability to use HW to perform the stretch, so we request // a raster instead, and perform the stretch on the CPU. SkBitmap bitmap; if (!this->onGetROBitmap(&bitmap)) { return nullptr; } SkBitmap stretchedBmp = stretch_on_cpu(bitmap, stretch); return create_unstretched_bitmap_texture(ctx, stretchedBmp, GrUniqueKey()); } else { SkAutoTUnref<GrTexture> unstretched(this->onRefUnstretchedTexture(ctx)); if (!unstretched) { return nullptr; } return stretch_texture(unstretched, stretch, nullptr, GrUniqueKey()); } }