diff options
Diffstat (limited to 'src/gpu/GrTextureParamsAdjuster.cpp')
-rw-r--r-- | src/gpu/GrTextureParamsAdjuster.cpp | 152 |
1 files changed, 0 insertions, 152 deletions
diff --git a/src/gpu/GrTextureParamsAdjuster.cpp b/src/gpu/GrTextureParamsAdjuster.cpp deleted file mode 100644 index adeec45c8a..0000000000 --- a/src/gpu/GrTextureParamsAdjuster.cpp +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright 2015 Google Inc. - * - * Use of this source code is governed by a BSD-style license that can be - * found in the LICENSE file. - */ - -#include "GrTextureParamsAdjuster.h" - -#include "GrCaps.h" -#include "GrContext.h" -#include "GrDrawContext.h" -#include "GrGpu.h" -#include "GrTexture.h" -#include "GrTextureParams.h" -#include "GrTextureProvider.h" -#include "SkCanvas.h" -#include "SkGr.h" -#include "SkGrPriv.h" - -typedef GrTextureParamsAdjuster::CopyParams CopyParams; - -static GrTexture* copy_on_gpu(GrTexture* inputTexture, const CopyParams& copyParams) { - GrContext* context = inputTexture->getContext(); - SkASSERT(context); - const GrCaps* caps = context->caps(); - - // Either it's a cache miss or the original wasn't cached to begin with. - GrSurfaceDesc rtDesc = inputTexture->desc(); - rtDesc.fFlags = rtDesc.fFlags | kRenderTarget_GrSurfaceFlag; - rtDesc.fWidth = copyParams.fWidth; - rtDesc.fHeight = copyParams.fHeight; - rtDesc.fConfig = GrMakePixelConfigUncompressed(rtDesc.fConfig); - - // If the config isn't renderable try converting to either A8 or an 32 bit config. Otherwise, - // fail. - if (!caps->isConfigRenderable(rtDesc.fConfig, false)) { - if (GrPixelConfigIsAlphaOnly(rtDesc.fConfig)) { - if (caps->isConfigRenderable(kAlpha_8_GrPixelConfig, false)) { - rtDesc.fConfig = kAlpha_8_GrPixelConfig; - } else if (caps->isConfigRenderable(kSkia8888_GrPixelConfig, false)) { - rtDesc.fConfig = kSkia8888_GrPixelConfig; - } else { - return nullptr; - } - } else if (kRGB_GrColorComponentFlags == - (kRGB_GrColorComponentFlags & GrPixelConfigComponentMask(rtDesc.fConfig))) { - if (caps->isConfigRenderable(kSkia8888_GrPixelConfig, false)) { - rtDesc.fConfig = kSkia8888_GrPixelConfig; - } else { - return nullptr; - } - } else { - return nullptr; - } - } - - SkAutoTUnref<GrTexture> copy(context->textureProvider()->createTexture(rtDesc, true)); - if (!copy) { - return nullptr; - } - - GrPaint paint; - - // If filtering is not desired then we want to ensure all texels in the resampled image are - // copies of texels from the original. - GrTextureParams params(SkShader::kClamp_TileMode, copyParams.fFilter); - paint.addColorTextureProcessor(inputTexture, SkMatrix::I(), params); - - SkRect rect = SkRect::MakeWH(SkIntToScalar(rtDesc.fWidth), SkIntToScalar(rtDesc.fHeight)); - SkRect localRect = SkRect::MakeWH(1.f, 1.f); - - SkAutoTUnref<GrDrawContext> drawContext(context->drawContext(copy->asRenderTarget())); - if (!drawContext) { - return nullptr; - } - - drawContext->drawNonAARectToRect(GrClip::WideOpen(), paint, SkMatrix::I(), rect, localRect); - return copy.detach(); -} - -static SkBitmap copy_on_cpu(const SkBitmap& bmp, const CopyParams& copyParams) { - SkBitmap stretched; - stretched.allocN32Pixels(copyParams.fWidth, copyParams.fHeight); - SkCanvas canvas(stretched); - SkPaint paint; - switch (copyParams.fFilter) { - case GrTextureParams::kNone_FilterMode: - paint.setFilterQuality(kNone_SkFilterQuality); - break; - case GrTextureParams::kBilerp_FilterMode: - paint.setFilterQuality(kLow_SkFilterQuality); - break; - case GrTextureParams::kMipMap_FilterMode: - paint.setFilterQuality(kMedium_SkFilterQuality); - break; - } - SkRect dstRect = SkRect::MakeWH(SkIntToScalar(copyParams.fWidth), - SkIntToScalar(copyParams.fHeight)); - canvas.drawBitmapRect(bmp, dstRect, &paint); - return stretched; -} - -GrTexture* GrTextureParamsAdjuster::refTextureForParams(GrContext* ctx, - const GrTextureParams& params) { - CopyParams copyParams; - if (!ctx->getGpu()->makeCopyForTextureParams(this->width(), this->height(), params, - ©Params)) { - return this->refOriginalTexture(ctx); - } - GrUniqueKey copyKey; - this->makeCopyKey(copyParams, ©Key); - if (copyKey.isValid()) { - GrTexture* result = ctx->textureProvider()->findAndRefTextureByUniqueKey(copyKey); - if (result) { - return result; - } - } - - GrTexture* result = this->generateTextureForParams(ctx, copyParams); - if (!result) { - return nullptr; - } - - if (copyKey.isValid()) { - ctx->textureProvider()->assignUniqueKeyToTexture(copyKey, result); - this->didCacheCopy(copyKey); - } - return result; -} - -GrTexture* GrTextureParamsAdjuster::generateTextureForParams(GrContext* ctx, - const CopyParams& copyParams) { - 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->getROBitmap(&bitmap)) { - return nullptr; - } - SkBitmap stretchedBmp = copy_on_cpu(bitmap, copyParams); - return GrUploadBitmapToTexture(ctx, bitmap); - } else { - SkAutoTUnref<GrTexture> original(this->refOriginalTexture(ctx)); - if (!original) { - return nullptr; - } - return copy_on_gpu(original, copyParams); - } -} |