1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "gm.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "sk_tool_utils.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkBlurMaskFilter.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkClipOpPriv.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkColorFilter.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPaint.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRRect.h" 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace skiagm { 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// This GM reproduces the precision artifacts seen in crbug.com/560651. 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// It draws a largish blurred circle with its center clipped out. 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass BlurredClippedCircleGM : public GM { 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot BlurredClippedCircleGM() { 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->setBGColor(sk_tool_utils::color_to_565(0xFFCCCCCC)); 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString onShortName() override { 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkString("blurredclippedcircle"); 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkISize onISize() override { 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkISize::Make(kWidth, kHeight); 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(SkCanvas* canvas) override { 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint whitePaint; 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot whitePaint.setColor(SK_ColorWHITE); 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot whitePaint.setBlendMode(SkBlendMode::kSrc); 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot whitePaint.setAntiAlias(true); 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // This scale exercises precision limits in the circle blur effect (crbug.com/560651) 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot constexpr float kScale = 2.0f; 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->scale(kScale, kScale); 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect clipRect1 = SkRect::MakeLTRB(0, 0, 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIntToScalar(kWidth), SkIntToScalar(kHeight)); 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->clipRect(clipRect1); 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->clipRect(clipRect1); 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(clipRect1, whitePaint); 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect clipRect2 = SkRect::MakeLTRB(8, 8, 288, 288); 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRRect clipRRect = SkRRect::MakeOval(clipRect2); 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->clipRRect(clipRRect, kDifference_SkClipOp, true); 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r = SkRect::MakeLTRB(4, 4, 292, 292); 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRRect rr = SkRRect::MakeOval(r); 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setMaskFilter(SkBlurMaskFilter::Make( 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kNormal_SkBlurStyle, 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 1.366025f, 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlurMaskFilter::kHighQuality_BlurFlag)); 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColorFilter(SkColorFilter::MakeModeFilter( 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SK_ColorRED, 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kSrcIn)); 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAntiAlias(true); 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRRect(rr, paint); 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static constexpr int kWidth = 1164; 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static constexpr int kHeight = 802; 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef GM INHERITED; 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////////////////// 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GM(return new BlurredClippedCircleGM;) 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 95