1 /* 2 * Copyright 2016 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #include "GrBitmapTextureMaker.h" 9 10 #include "GrContext.h" 11 #include "GrGpuResourcePriv.h" 12 #include "GrResourceProvider.h" 13 #include "SkBitmap.h" 14 #include "SkGr.h" 15 #include "SkPixelRef.h" 16 17 static bool bmp_is_alpha_only(const SkBitmap& bm) { return kAlpha_8_SkColorType == bm.colorType(); } 18 19 GrBitmapTextureMaker::GrBitmapTextureMaker(GrContext* context, const SkBitmap& bitmap) 20 : INHERITED(context, bitmap.width(), bitmap.height(), bmp_is_alpha_only(bitmap)) 21 , fBitmap(bitmap) { 22 if (!bitmap.isVolatile()) { 23 SkIPoint origin = bitmap.pixelRefOrigin(); 24 SkIRect subset = SkIRect::MakeXYWH(origin.fX, origin.fY, bitmap.width(), 25 bitmap.height()); 26 GrMakeKeyFromImageID(&fOriginalKey, bitmap.pixelRef()->getGenerationID(), subset); 27 } 28 } 29 30 sk_sp<GrTextureProxy> GrBitmapTextureMaker::refOriginalTextureProxy(bool willBeMipped, 31 SkColorSpace* dstColorSpace) { 32 sk_sp<GrTextureProxy> proxy; 33 34 if (fOriginalKey.isValid()) { 35 proxy = this->context()->resourceProvider()->findProxyByUniqueKey(fOriginalKey); 36 if (proxy) { 37 return proxy; 38 } 39 } 40 if (willBeMipped) { 41 proxy = GrGenerateMipMapsAndUploadToTextureProxy(this->context(), fBitmap, dstColorSpace); 42 } 43 if (!proxy) { 44 proxy = GrUploadBitmapToTextureProxy(this->context()->resourceProvider(), fBitmap); 45 } 46 if (proxy && fOriginalKey.isValid()) { 47 this->context()->resourceProvider()->assignUniqueKeyToProxy(fOriginalKey, proxy.get()); 48 // MDB TODO (caching): this has to play nice with the GrSurfaceProxy's caching 49 GrInstallBitmapUniqueKeyInvalidator(fOriginalKey, fBitmap.pixelRef()); 50 } 51 return proxy; 52 } 53 54 void GrBitmapTextureMaker::makeCopyKey(const CopyParams& copyParams, GrUniqueKey* copyKey, 55 SkColorSpace* dstColorSpace) { 56 // Destination color space is irrelevant - we always upload the bitmap's contents as-is 57 if (fOriginalKey.isValid()) { 58 MakeCopyKeyFromOrigKey(fOriginalKey, copyParams, copyKey); 59 } 60 } 61 62 void GrBitmapTextureMaker::didCacheCopy(const GrUniqueKey& copyKey) { 63 GrInstallBitmapUniqueKeyInvalidator(copyKey, fBitmap.pixelRef()); 64 } 65 66 SkAlphaType GrBitmapTextureMaker::alphaType() const { 67 return fBitmap.alphaType(); 68 } 69 70 sk_sp<SkColorSpace> GrBitmapTextureMaker::getColorSpace(SkColorSpace* dstColorSpace) { 71 // Color space doesn't depend on destination color space - it's just whatever is in the bitmap 72 return fBitmap.refColorSpace(); 73 } 74