/* * Copyright 2016 Google Inc. * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "GrImageTextureMaker.h" #include "SkGr.h" #include "SkImage_GpuYUVA.h" #include "SkImage_Lazy.h" #include "effects/GrYUVtoRGBEffect.h" GrImageTextureMaker::GrImageTextureMaker(GrContext* context, const SkImage* client, SkImage::CachingHint chint) : INHERITED(context, client->width(), client->height(), client->isAlphaOnly()) , fImage(static_cast<const SkImage_Lazy*>(client)) , fCachingHint(chint) { SkASSERT(client->isLazyGenerated()); GrMakeKeyFromImageID(&fOriginalKey, client->uniqueID(), SkIRect::MakeWH(this->width(), this->height())); } sk_sp<GrTextureProxy> GrImageTextureMaker::refOriginalTextureProxy(bool willBeMipped, AllowedTexGenType onlyIfFast) { return fImage->lockTextureProxy(this->context(), fOriginalKey, fCachingHint, willBeMipped, onlyIfFast); } void GrImageTextureMaker::makeCopyKey(const CopyParams& stretch, GrUniqueKey* paramsCopyKey) { if (fOriginalKey.isValid() && SkImage::kAllow_CachingHint == fCachingHint) { GrUniqueKey cacheKey; fImage->makeCacheKeyFromOrigKey(fOriginalKey, &cacheKey); MakeCopyKeyFromOrigKey(cacheKey, stretch, paramsCopyKey); } } SkAlphaType GrImageTextureMaker::alphaType() const { return fImage->alphaType(); } SkColorSpace* GrImageTextureMaker::colorSpace() const { return fImage->colorSpace(); } ///////////////////////////////////////////////////////////////////////////////////////////////// GrYUVAImageTextureMaker::GrYUVAImageTextureMaker(GrContext* context, const SkImage* client ) : INHERITED(context, client->width(), client->height(), client->isAlphaOnly()) , fImage(static_cast<const SkImage_GpuYUVA*>(client)) { SkASSERT(as_IB(client)->isYUVA()); GrMakeKeyFromImageID(&fOriginalKey, client->uniqueID(), SkIRect::MakeWH(this->width(), this->height())); } sk_sp<GrTextureProxy> GrYUVAImageTextureMaker::refOriginalTextureProxy(bool willBeMipped, AllowedTexGenType onlyIfFast) { if (AllowedTexGenType::kCheap == onlyIfFast) { return nullptr; } if (willBeMipped) { return fImage->asMippedTextureProxyRef(); } else { return fImage->asTextureProxyRef(); } } void GrYUVAImageTextureMaker::makeCopyKey(const CopyParams& stretch, GrUniqueKey* paramsCopyKey) { // TODO: Do we ever want to disable caching? if (fOriginalKey.isValid()) { GrUniqueKey cacheKey; static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); GrUniqueKey::Builder builder(&cacheKey, fOriginalKey, kDomain, 0, "Image"); MakeCopyKeyFromOrigKey(cacheKey, stretch, paramsCopyKey); } } SkAlphaType GrYUVAImageTextureMaker::alphaType() const { return fImage->alphaType(); } SkColorSpace* GrYUVAImageTextureMaker::colorSpace() const { return fImage->colorSpace(); } SkColorSpace* GrYUVAImageTextureMaker::targetColorSpace() const { return fImage->targetColorSpace(); } std::unique_ptr<GrFragmentProcessor> GrYUVAImageTextureMaker::createFragmentProcessor( const SkMatrix& textureMatrix, const SkRect& constraintRect, FilterConstraint filterConstraint, bool coordsLimitedToConstraintRect, const GrSamplerState::Filter* filterOrNullForBicubic) { // Check simple cases to see if we need to fall back to flattening the image // TODO: See if we can relax this -- for example, if filterConstraint // is kYes_FilterConstraint we still may not need a TextureDomain // in some cases. if (!textureMatrix.isIdentity() || kNo_FilterConstraint != filterConstraint || !coordsLimitedToConstraintRect || !filterOrNullForBicubic) { return this->INHERITED::createFragmentProcessor(textureMatrix, constraintRect, filterConstraint, coordsLimitedToConstraintRect, filterOrNullForBicubic); } // Check to see if the client has given us pre-mipped textures or we can generate them // If not, fall back to bilerp GrSamplerState::Filter filter = *filterOrNullForBicubic; if (GrSamplerState::Filter::kMipMap == filter && !fImage->setupMipmapsForPlanes()) { filter = GrSamplerState::Filter::kBilerp; } return GrYUVtoRGBEffect::Make(fImage->fProxies, fImage->fYUVAIndices, fImage->fYUVColorSpace, filter); }