14e56772432825e174b8f9a3370235381482a8f51robertphillips/* 24e56772432825e174b8f9a3370235381482a8f51robertphillips * Copyright 2015 Google Inc. 34e56772432825e174b8f9a3370235381482a8f51robertphillips * 44e56772432825e174b8f9a3370235381482a8f51robertphillips * Use of this source code is governed by a BSD-style license that can be 54e56772432825e174b8f9a3370235381482a8f51robertphillips * found in the LICENSE file. 64e56772432825e174b8f9a3370235381482a8f51robertphillips */ 74e56772432825e174b8f9a3370235381482a8f51robertphillips 84e56772432825e174b8f9a3370235381482a8f51robertphillips#include "gm.h" 933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h" 104e56772432825e174b8f9a3370235381482a8f51robertphillips#include "SkBlurMaskFilter.h" 11ebfce6d9b42198e04288a15953f40c395a7b6139Mike Reed#include "SkClipOpPriv.h" 124e56772432825e174b8f9a3370235381482a8f51robertphillips#include "SkColorFilter.h" 134e56772432825e174b8f9a3370235381482a8f51robertphillips#include "SkPaint.h" 144e56772432825e174b8f9a3370235381482a8f51robertphillips#include "SkRRect.h" 154e56772432825e174b8f9a3370235381482a8f51robertphillips 164e56772432825e174b8f9a3370235381482a8f51robertphillipsnamespace skiagm { 174e56772432825e174b8f9a3370235381482a8f51robertphillips 184e56772432825e174b8f9a3370235381482a8f51robertphillips// This GM reproduces the precision artifacts seen in crbug.com/560651. 194e56772432825e174b8f9a3370235381482a8f51robertphillips// It draws a largish blurred circle with its center clipped out. 204e56772432825e174b8f9a3370235381482a8f51robertphillipsclass BlurredClippedCircleGM : public GM { 214e56772432825e174b8f9a3370235381482a8f51robertphillipspublic: 224e56772432825e174b8f9a3370235381482a8f51robertphillips BlurredClippedCircleGM() { 234e56772432825e174b8f9a3370235381482a8f51robertphillips this->setBGColor(sk_tool_utils::color_to_565(0xFFCCCCCC)); 244e56772432825e174b8f9a3370235381482a8f51robertphillips } 254e56772432825e174b8f9a3370235381482a8f51robertphillips 264e56772432825e174b8f9a3370235381482a8f51robertphillipsprotected: 274e56772432825e174b8f9a3370235381482a8f51robertphillips 284e56772432825e174b8f9a3370235381482a8f51robertphillips SkString onShortName() override { 294e56772432825e174b8f9a3370235381482a8f51robertphillips return SkString("blurredclippedcircle"); 304e56772432825e174b8f9a3370235381482a8f51robertphillips } 314e56772432825e174b8f9a3370235381482a8f51robertphillips 324e56772432825e174b8f9a3370235381482a8f51robertphillips SkISize onISize() override { 334e56772432825e174b8f9a3370235381482a8f51robertphillips return SkISize::Make(kWidth, kHeight); 344e56772432825e174b8f9a3370235381482a8f51robertphillips } 354e56772432825e174b8f9a3370235381482a8f51robertphillips 364e56772432825e174b8f9a3370235381482a8f51robertphillips void onDraw(SkCanvas* canvas) override { 374e56772432825e174b8f9a3370235381482a8f51robertphillips SkPaint whitePaint; 384e56772432825e174b8f9a3370235381482a8f51robertphillips whitePaint.setColor(SK_ColorWHITE); 39374772bd61951f01bf84fe17bf53d8867681c9aereed whitePaint.setBlendMode(SkBlendMode::kSrc); 404e56772432825e174b8f9a3370235381482a8f51robertphillips whitePaint.setAntiAlias(true); 414e56772432825e174b8f9a3370235381482a8f51robertphillips 424e56772432825e174b8f9a3370235381482a8f51robertphillips // This scale exercises precision limits in the circle blur effect (crbug.com/560651) 43dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein constexpr float kScale = 2.0f; 444e56772432825e174b8f9a3370235381482a8f51robertphillips canvas->scale(kScale, kScale); 454e56772432825e174b8f9a3370235381482a8f51robertphillips 464e56772432825e174b8f9a3370235381482a8f51robertphillips canvas->save(); 474e56772432825e174b8f9a3370235381482a8f51robertphillips SkRect clipRect1 = SkRect::MakeLTRB(0, 0, 484e56772432825e174b8f9a3370235381482a8f51robertphillips SkIntToScalar(kWidth), SkIntToScalar(kHeight)); 494e56772432825e174b8f9a3370235381482a8f51robertphillips 5073603f3c52ffd89fe9d035be827b566a0e7d3b79reed canvas->clipRect(clipRect1); 514e56772432825e174b8f9a3370235381482a8f51robertphillips 524e56772432825e174b8f9a3370235381482a8f51robertphillips canvas->save(); 534e56772432825e174b8f9a3370235381482a8f51robertphillips 5473603f3c52ffd89fe9d035be827b566a0e7d3b79reed canvas->clipRect(clipRect1); 554e56772432825e174b8f9a3370235381482a8f51robertphillips canvas->drawRect(clipRect1, whitePaint); 564e56772432825e174b8f9a3370235381482a8f51robertphillips 574e56772432825e174b8f9a3370235381482a8f51robertphillips canvas->save(); 584e56772432825e174b8f9a3370235381482a8f51robertphillips 594e56772432825e174b8f9a3370235381482a8f51robertphillips SkRect clipRect2 = SkRect::MakeLTRB(8, 8, 288, 288); 604e56772432825e174b8f9a3370235381482a8f51robertphillips SkRRect clipRRect = SkRRect::MakeOval(clipRect2); 61c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed canvas->clipRRect(clipRRect, kDifference_SkClipOp, true); 624e56772432825e174b8f9a3370235381482a8f51robertphillips 634e56772432825e174b8f9a3370235381482a8f51robertphillips SkRect r = SkRect::MakeLTRB(4, 4, 292, 292); 644e56772432825e174b8f9a3370235381482a8f51robertphillips SkRRect rr = SkRRect::MakeOval(r); 654e56772432825e174b8f9a3370235381482a8f51robertphillips 664e56772432825e174b8f9a3370235381482a8f51robertphillips SkPaint paint; 674e56772432825e174b8f9a3370235381482a8f51robertphillips 68efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed paint.setMaskFilter(SkBlurMaskFilter::Make( 694e56772432825e174b8f9a3370235381482a8f51robertphillips kNormal_SkBlurStyle, 704e56772432825e174b8f9a3370235381482a8f51robertphillips 1.366025f, 71efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed SkBlurMaskFilter::kHighQuality_BlurFlag)); 72d053ce9c54d4e5937a142278359e5a4cde18095ereed paint.setColorFilter(SkColorFilter::MakeModeFilter( 734e56772432825e174b8f9a3370235381482a8f51robertphillips SK_ColorRED, 747d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed SkBlendMode::kSrcIn)); 754e56772432825e174b8f9a3370235381482a8f51robertphillips paint.setAntiAlias(true); 764e56772432825e174b8f9a3370235381482a8f51robertphillips 774e56772432825e174b8f9a3370235381482a8f51robertphillips canvas->drawRRect(rr, paint); 784e56772432825e174b8f9a3370235381482a8f51robertphillips 794e56772432825e174b8f9a3370235381482a8f51robertphillips canvas->restore(); 804e56772432825e174b8f9a3370235381482a8f51robertphillips canvas->restore(); 814e56772432825e174b8f9a3370235381482a8f51robertphillips canvas->restore(); 824e56772432825e174b8f9a3370235381482a8f51robertphillips } 834e56772432825e174b8f9a3370235381482a8f51robertphillips 844e56772432825e174b8f9a3370235381482a8f51robertphillipsprivate: 85dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein static constexpr int kWidth = 1164; 86dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein static constexpr int kHeight = 802; 874e56772432825e174b8f9a3370235381482a8f51robertphillips 884e56772432825e174b8f9a3370235381482a8f51robertphillips typedef GM INHERITED; 894e56772432825e174b8f9a3370235381482a8f51robertphillips}; 904e56772432825e174b8f9a3370235381482a8f51robertphillips 914e56772432825e174b8f9a3370235381482a8f51robertphillips////////////////////////////////////////////////////////////////////////////// 924e56772432825e174b8f9a3370235381482a8f51robertphillips 934e56772432825e174b8f9a3370235381482a8f51robertphillipsDEF_GM(return new BlurredClippedCircleGM;) 944e56772432825e174b8f9a3370235381482a8f51robertphillips} 95