1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2017 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "gm/gm.h" 9cb93a386Sopenharmony_ci#include "include/core/SkBlurTypes.h" 10cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 11cb93a386Sopenharmony_ci#include "include/core/SkColor.h" 12cb93a386Sopenharmony_ci#include "include/core/SkFont.h" 13cb93a386Sopenharmony_ci#include "include/core/SkImage.h" 14cb93a386Sopenharmony_ci#include "include/core/SkImageFilter.h" 15cb93a386Sopenharmony_ci#include "include/core/SkMaskFilter.h" 16cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 17cb93a386Sopenharmony_ci#include "include/core/SkRect.h" 18cb93a386Sopenharmony_ci#include "include/core/SkRefCnt.h" 19cb93a386Sopenharmony_ci#include "include/core/SkString.h" 20cb93a386Sopenharmony_ci#include "include/core/SkTypeface.h" 21cb93a386Sopenharmony_ci#include "include/effects/SkImageFilters.h" 22cb93a386Sopenharmony_ci#include "tools/Resources.h" 23cb93a386Sopenharmony_ci#include "tools/ToolUtils.h" 24cb93a386Sopenharmony_ci 25cb93a386Sopenharmony_ci#include <stdio.h> 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ciDEF_SIMPLE_GM(blurimagevmask, canvas, 700, 1200) { 28cb93a386Sopenharmony_ci SkPaint paint; 29cb93a386Sopenharmony_ci paint.setAntiAlias(true); 30cb93a386Sopenharmony_ci paint.setColor(SK_ColorBLACK); 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_ci SkFont font(ToolUtils::create_portable_typeface(), 25); 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ci const double sigmas[] = {3.0, 8.0, 16.0, 24.0, 32.0}; 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ci canvas->drawString("mask blur", 285, 50, font, paint); 37cb93a386Sopenharmony_ci canvas->drawString("image blur", 285 + 250, 50, font, paint); 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci SkRect r = {35, 100, 135, 200}; 41cb93a386Sopenharmony_ci for (auto sigma:sigmas) { 42cb93a386Sopenharmony_ci 43cb93a386Sopenharmony_ci canvas->drawRect(r, paint); 44cb93a386Sopenharmony_ci 45cb93a386Sopenharmony_ci char out[100]; 46cb93a386Sopenharmony_ci sprintf(out, "Sigma: %g", sigma); 47cb93a386Sopenharmony_ci canvas->drawString(out, r.left(), r.bottom() + 35, font, paint); 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci r.offset(250, 0); 50cb93a386Sopenharmony_ci 51cb93a386Sopenharmony_ci paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, sigma)); 52cb93a386Sopenharmony_ci canvas->drawRect(r, paint); 53cb93a386Sopenharmony_ci paint.setMaskFilter(nullptr); 54cb93a386Sopenharmony_ci 55cb93a386Sopenharmony_ci SkPaint imageBlurPaint; 56cb93a386Sopenharmony_ci r.offset(250, 0); 57cb93a386Sopenharmony_ci imageBlurPaint.setImageFilter(SkImageFilters::Blur(sigma, sigma, nullptr)); 58cb93a386Sopenharmony_ci canvas->saveLayer(nullptr, &imageBlurPaint); 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci canvas->drawRect(r, paint); 61cb93a386Sopenharmony_ci canvas->restore(); 62cb93a386Sopenharmony_ci r.offset(-500, 200); 63cb93a386Sopenharmony_ci } 64cb93a386Sopenharmony_ci 65cb93a386Sopenharmony_ci} 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ciDEF_SIMPLE_GM_CAN_FAIL(blur_image, canvas, errorMsg, 500, 500) { 68cb93a386Sopenharmony_ci auto image = GetResourceAsImage("images/mandrill_128.png"); 69cb93a386Sopenharmony_ci if (!image) { 70cb93a386Sopenharmony_ci *errorMsg = "Could not load mandrill_128.png. Did you forget to set the resourcePath?"; 71cb93a386Sopenharmony_ci return skiagm::DrawResult::kFail; 72cb93a386Sopenharmony_ci } 73cb93a386Sopenharmony_ci 74cb93a386Sopenharmony_ci SkPaint paint; 75cb93a386Sopenharmony_ci paint.setMaskFilter(SkMaskFilter::MakeBlur(kNormal_SkBlurStyle, 4)); 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ci // both of these should draw with the blur, but (formerally) we had a bug where the unscaled 78cb93a386Sopenharmony_ci // version (taking the spriteblitter code path) ignore the maskfilter. 79cb93a386Sopenharmony_ci 80cb93a386Sopenharmony_ci canvas->drawImage(image, 10, 10, SkSamplingOptions(), &paint); 81cb93a386Sopenharmony_ci canvas->scale(1.01f, 1.01f); 82cb93a386Sopenharmony_ci canvas->drawImage(image, 10 + image->width() + 10.f, 10, SkSamplingOptions(), &paint); 83cb93a386Sopenharmony_ci return skiagm::DrawResult::kOk; 84cb93a386Sopenharmony_ci} 85