Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(204)

Unified Diff: src/gpu/GrContext.cpp

Issue 18771004: Move gaussianBlur functionality to src\effects (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Renamed SkBlurUtils to SkGpuBlurUtils Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/effects/SkGpuBlurUtils.cpp ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 {
« no previous file with comments | « src/effects/SkGpuBlurUtils.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698