| Index: src/gpu/GrContext.cpp
|
| ===================================================================
|
| --- src/gpu/GrContext.cpp (revision 10073)
|
| +++ src/gpu/GrContext.cpp (working copy)
|
| @@ -9,7 +9,6 @@
|
|
|
| #include "GrContext.h"
|
|
|
| -#include "effects/GrConvolutionEffect.h"
|
| #include "effects/GrSingleTextureEffect.h"
|
| #include "effects/GrConfigConversionEffect.h"
|
|
|
| @@ -42,8 +41,6 @@
|
|
|
| #define BUFFERED_DRAW (c_Defer ? kYes_BufferedDraw : kNo_BufferedDraw)
|
|
|
| -#define MAX_BLUR_SIGMA 4.0f
|
| -
|
| // When we're using coverage AA but the blend is incompatible (given gpu
|
| // limitations) should we disable AA or draw wrong?
|
| #define DISABLE_COVERAGE_AA_FOR_BLEND 1
|
| @@ -230,48 +227,6 @@
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| -namespace {
|
| -
|
| -void scale_rect(SkRect* rect, float xScale, float yScale) {
|
| - rect->fLeft = SkScalarMul(rect->fLeft, SkFloatToScalar(xScale));
|
| - rect->fTop = SkScalarMul(rect->fTop, SkFloatToScalar(yScale));
|
| - rect->fRight = SkScalarMul(rect->fRight, SkFloatToScalar(xScale));
|
| - rect->fBottom = SkScalarMul(rect->fBottom, SkFloatToScalar(yScale));
|
| -}
|
| -
|
| -float adjust_sigma(float sigma, int *scaleFactor, int *radius) {
|
| - *scaleFactor = 1;
|
| - while (sigma > MAX_BLUR_SIGMA) {
|
| - *scaleFactor *= 2;
|
| - sigma *= 0.5f;
|
| - }
|
| - *radius = static_cast<int>(ceilf(sigma * 3.0f));
|
| - GrAssert(*radius <= GrConvolutionEffect::kMaxKernelRadius);
|
| - return sigma;
|
| -}
|
| -
|
| -void convolve_gaussian(GrDrawTarget* target,
|
| - GrTexture* texture,
|
| - const SkRect& rect,
|
| - float sigma,
|
| - int radius,
|
| - Gr1DKernelEffect::Direction direction) {
|
| - GrRenderTarget* rt = target->drawState()->getRenderTarget();
|
| - GrDrawTarget::AutoStateRestore asr(target, GrDrawTarget::kReset_ASRInit);
|
| - GrDrawState* drawState = target->drawState();
|
| - drawState->setRenderTarget(rt);
|
| - SkAutoTUnref<GrEffectRef> conv(GrConvolutionEffect::CreateGaussian(texture,
|
| - direction,
|
| - radius,
|
| - sigma));
|
| - drawState->addColorEffect(conv);
|
| - target->drawSimpleRect(rect, NULL);
|
| -}
|
| -
|
| -}
|
| -
|
| -////////////////////////////////////////////////////////////////////////////////
|
| -
|
| GrTexture* GrContext::findAndRefTexture(const GrTextureDesc& desc,
|
| const GrCacheID& cacheID,
|
| const GrTextureParams* params) {
|
| @@ -1724,139 +1679,6 @@
|
| }
|
| }
|
|
|
| -GrTexture* GrContext::gaussianBlur(GrTexture* srcTexture,
|
| - bool canClobberSrc,
|
| - const SkRect& rect,
|
| - float sigmaX, float sigmaY) {
|
| - ASSERT_OWNED_RESOURCE(srcTexture);
|
| -
|
| - AutoRenderTarget art(this);
|
| -
|
| - AutoMatrix am;
|
| - am.setIdentity(this);
|
| -
|
| - SkIRect clearRect;
|
| - int scaleFactorX, radiusX;
|
| - int scaleFactorY, radiusY;
|
| - sigmaX = adjust_sigma(sigmaX, &scaleFactorX, &radiusX);
|
| - sigmaY = adjust_sigma(sigmaY, &scaleFactorY, &radiusY);
|
| -
|
| - SkRect srcRect(rect);
|
| - scale_rect(&srcRect, 1.0f / scaleFactorX, 1.0f / scaleFactorY);
|
| - srcRect.roundOut();
|
| - scale_rect(&srcRect, static_cast<float>(scaleFactorX),
|
| - static_cast<float>(scaleFactorY));
|
| -
|
| - AutoClip acs(this, srcRect);
|
| -
|
| - GrAssert(kBGRA_8888_GrPixelConfig == srcTexture->config() ||
|
| - kRGBA_8888_GrPixelConfig == srcTexture->config() ||
|
| - kAlpha_8_GrPixelConfig == srcTexture->config());
|
| -
|
| - GrTextureDesc desc;
|
| - desc.fFlags = kRenderTarget_GrTextureFlagBit | kNoStencil_GrTextureFlagBit;
|
| - desc.fWidth = SkScalarFloorToInt(srcRect.width());
|
| - desc.fHeight = SkScalarFloorToInt(srcRect.height());
|
| - desc.fConfig = srcTexture->config();
|
| -
|
| - GrAutoScratchTexture temp1, temp2;
|
| - GrTexture* dstTexture = temp1.set(this, desc);
|
| - GrTexture* tempTexture = canClobberSrc ? srcTexture : temp2.set(this, desc);
|
| - if (NULL == dstTexture || NULL == tempTexture) {
|
| - return NULL;
|
| - }
|
| -
|
| - for (int i = 1; i < scaleFactorX || i < scaleFactorY; i *= 2) {
|
| - GrPaint paint;
|
| - SkMatrix matrix;
|
| - matrix.setIDiv(srcTexture->width(), srcTexture->height());
|
| - this->setRenderTarget(dstTexture->asRenderTarget());
|
| - SkRect dstRect(srcRect);
|
| - scale_rect(&dstRect, i < scaleFactorX ? 0.5f : 1.0f,
|
| - i < scaleFactorY ? 0.5f : 1.0f);
|
| - GrTextureParams params(SkShader::kClamp_TileMode, true);
|
| - paint.addColorTextureEffect(srcTexture, matrix, params);
|
| - this->drawRectToRect(paint, dstRect, srcRect);
|
| - srcRect = dstRect;
|
| - srcTexture = dstTexture;
|
| - SkTSwap(dstTexture, tempTexture);
|
| - }
|
| -
|
| - SkIRect srcIRect;
|
| - srcRect.roundOut(&srcIRect);
|
| -
|
| - if (sigmaX > 0.0f) {
|
| - if (scaleFactorX > 1) {
|
| - // Clear out a radius to the right of the srcRect to prevent the
|
| - // X convolution from reading garbage.
|
| - clearRect = SkIRect::MakeXYWH(srcIRect.fRight, srcIRect.fTop,
|
| - radiusX, srcIRect.height());
|
| - this->clear(&clearRect, 0x0);
|
| - }
|
| - GrPaint paint;
|
| - this->setRenderTarget(dstTexture->asRenderTarget());
|
| - AutoRestoreEffects are;
|
| - GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are);
|
| - convolve_gaussian(target, srcTexture, srcRect, sigmaX, radiusX,
|
| - Gr1DKernelEffect::kX_Direction);
|
| - srcTexture = dstTexture;
|
| - SkTSwap(dstTexture, tempTexture);
|
| - }
|
| -
|
| - if (sigmaY > 0.0f) {
|
| - if (scaleFactorY > 1 || sigmaX > 0.0f) {
|
| - // Clear out a radius below the srcRect to prevent the Y
|
| - // convolution from reading garbage.
|
| - clearRect = SkIRect::MakeXYWH(srcIRect.fLeft, srcIRect.fBottom,
|
| - srcIRect.width(), radiusY);
|
| - this->clear(&clearRect, 0x0);
|
| - }
|
| -
|
| - this->setRenderTarget(dstTexture->asRenderTarget());
|
| - GrPaint paint;
|
| - AutoRestoreEffects are;
|
| - GrDrawTarget* target = this->prepareToDraw(&paint, BUFFERED_DRAW, &are);
|
| - convolve_gaussian(target, srcTexture, srcRect, sigmaY, radiusY,
|
| - Gr1DKernelEffect::kY_Direction);
|
| - srcTexture = dstTexture;
|
| - SkTSwap(dstTexture, tempTexture);
|
| - }
|
| -
|
| - if (scaleFactorX > 1 || scaleFactorY > 1) {
|
| - // Clear one pixel to the right and below, to accommodate bilinear
|
| - // upsampling.
|
| - clearRect = SkIRect::MakeXYWH(srcIRect.fLeft, srcIRect.fBottom,
|
| - srcIRect.width() + 1, 1);
|
| - this->clear(&clearRect, 0x0);
|
| - clearRect = SkIRect::MakeXYWH(srcIRect.fRight, srcIRect.fTop,
|
| - 1, srcIRect.height());
|
| - this->clear(&clearRect, 0x0);
|
| - SkMatrix matrix;
|
| - matrix.setIDiv(srcTexture->width(), srcTexture->height());
|
| - this->setRenderTarget(dstTexture->asRenderTarget());
|
| -
|
| - GrPaint paint;
|
| - // FIXME: This should be mitchell, not bilinear.
|
| - GrTextureParams params(SkShader::kClamp_TileMode, true);
|
| - paint.addColorTextureEffect(srcTexture, matrix, params);
|
| -
|
| - SkRect dstRect(srcRect);
|
| - scale_rect(&dstRect, (float) scaleFactorX, (float) scaleFactorY);
|
| - this->drawRectToRect(paint, dstRect, srcRect);
|
| - srcRect = dstRect;
|
| - srcTexture = dstTexture;
|
| - SkTSwap(dstTexture, tempTexture);
|
| - }
|
| - if (srcTexture == temp1.texture()) {
|
| - return temp1.detach();
|
| - } else if (srcTexture == temp2.texture()) {
|
| - return temp2.detach();
|
| - } else {
|
| - srcTexture->ref();
|
| - return srcTexture;
|
| - }
|
| -}
|
| -
|
| ///////////////////////////////////////////////////////////////////////////////
|
| #if GR_CACHE_STATS
|
| void GrContext::printCacheStats() const {
|
|
|