When outsetting for rect blur fast path use abs of scale factors.

Fixes an issue where negative scales caused an inset rather than an outset.

Add GM.

Bug: chromium:899512
Change-Id: I9164c76da479af80d4f5389b057ec52a946726fb
Reviewed-on: https://skia-review.googlesource.com/c/171641
Reviewed-by: Brian Osman <brianosman@google.com>
Commit-Queue: Brian Salomon <bsalomon@google.com>
This commit is contained in:
Brian Salomon 2018-11-19 10:05:08 -05:00 committed by Skia Commit-Bot
parent 8f8995a042
commit 908bb23983
3 changed files with 26 additions and 2 deletions

23
gm/crbug_899512.cpp Normal file
View File

@ -0,0 +1,23 @@
/*
* Copyright 2018 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "SkBlurMaskFilter.h"
#include "SkCanvas.h"
#include "SkColorFilter.h"
#include "SkLayerDrawLooper.h"
#include "gm.h"
DEF_SIMPLE_GM(crbug_899512, canvas, 520, 520) {
// comment this line below to solve the problem
SkMatrix matrix;
matrix.setAll(-1, 0, 220, 0, 1, 0, 0, 0, 1);
canvas->concat(matrix);
SkPaint paint;
paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 6.2735f, false));
paint.setColorFilter(SkColorFilter::MakeModeFilter(SK_ColorBLACK, SkBlendMode::kSrcIn));
canvas->drawRect(SkRect::MakeXYWH(0, 10, 200, 200), paint);
}

View File

@ -101,6 +101,7 @@ gm_sources = [
"$_gm/crbug_884166.cpp",
"$_gm/crbug_887103.cpp",
"$_gm/crbug_892988.cpp",
"$_gm/crbug_899512.cpp",
"$_gm/croppedrects.cpp",
"$_gm/crosscontextimage.cpp",
"$_gm/cubicpaths.cpp",

View File

@ -783,8 +783,8 @@ bool SkBlurMaskFilterImpl::directFilterMaskGPU(GrContext* context,
// When we're ignoring the CTM the padding added to the source rect also needs to ignore
// the CTM. The matrix passed in here is guaranteed to be just scale and translate so we
// can just grab the X and Y scales off the matrix and pre-undo the scale.
outsetX /= viewMatrix.getScaleX();
outsetY /= viewMatrix.getScaleY();
outsetX /= SkScalarAbs(viewMatrix.getScaleX());
outsetY /= SkScalarAbs(viewMatrix.getScaleY());
}
srcProxyRect.outset(outsetX, outsetY);