Home | History | Annotate | Download | only in gpu
      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