Home | History | Annotate | Download | only in gm
      1 /*
      2  * Copyright 2011 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 
      8 #include "gm.h"
      9 #include "SkBlurMask.h"
     10 #include "SkBlurMaskFilter.h"
     11 #include "SkPath.h"
     12 
     13 DEF_SIMPLE_GM_BG(blurs, canvas, 700, 500, sk_tool_utils::color_to_565(0xFFDDDDDD)) {
     14         SkBlurStyle NONE = SkBlurStyle(-999);
     15         static const struct {
     16             SkBlurStyle fStyle;
     17             int         fCx, fCy;
     18         } gRecs[] = {
     19             { NONE,                 0,  0 },
     20             { kInner_SkBlurStyle,  -1,  0 },
     21             { kNormal_SkBlurStyle,  0,  1 },
     22             { kSolid_SkBlurStyle,   0, -1 },
     23             { kOuter_SkBlurStyle,   1,  0 },
     24         };
     25 
     26         SkPaint paint;
     27         paint.setAntiAlias(true);
     28         sk_tool_utils::set_portable_typeface(&paint);
     29         paint.setTextSize(SkIntToScalar(25));
     30         canvas->translate(SkIntToScalar(-40), SkIntToScalar(0));
     31 
     32         SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag;
     33         for (int j = 0; j < 2; j++) {
     34             canvas->save();
     35             paint.setColor(SK_ColorBLUE);
     36             for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
     37                 if (gRecs[i].fStyle != NONE) {
     38                     SkMaskFilter* mf = SkBlurMaskFilter::Create(gRecs[i].fStyle,
     39                                            SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(20)),
     40                                            flags);
     41                     paint.setMaskFilter(mf)->unref();
     42                 } else {
     43                     paint.setMaskFilter(nullptr);
     44                 }
     45                 canvas->drawCircle(SkIntToScalar(200 + gRecs[i].fCx*100),
     46                                    SkIntToScalar(200 + gRecs[i].fCy*100),
     47                                    SkIntToScalar(50),
     48                                    paint);
     49             }
     50             // draw text
     51             {
     52                 SkMaskFilter* mf = SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
     53                                            SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(4)),
     54                                            flags);
     55                 paint.setMaskFilter(mf)->unref();
     56                 SkScalar x = SkIntToScalar(70);
     57                 SkScalar y = SkIntToScalar(400);
     58                 paint.setColor(SK_ColorBLACK);
     59                 canvas->drawText("Hamburgefons Style", 18, x, y, paint);
     60                 canvas->drawText("Hamburgefons Style", 18,
     61                                  x, y + SkIntToScalar(50), paint);
     62                 paint.setMaskFilter(nullptr);
     63                 paint.setColor(SK_ColorWHITE);
     64                 x -= SkIntToScalar(2);
     65                 y -= SkIntToScalar(2);
     66                 canvas->drawText("Hamburgefons Style", 18, x, y, paint);
     67             }
     68             canvas->restore();
     69             flags = SkBlurMaskFilter::kHighQuality_BlurFlag;
     70             canvas->translate(SkIntToScalar(350), SkIntToScalar(0));
     71         }
     72 }
     73 
     74 //////////////////////////////////////////////////////////////////////////////////////////////
     75 
     76 // exercise a special-case of blurs, which is two nested rects. These are drawn specially,
     77 // and possibly cached.
     78 //
     79 // in particular, we want to notice that the 2nd rect draws slightly differently, since it
     80 // is translated a fractional amount.
     81 //
     82 DEF_SIMPLE_GM(blur2rects, canvas, 700, 500) {
     83         SkPaint paint;
     84 
     85         paint.setMaskFilter(SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
     86                                                      2.3f))->unref();
     87 
     88         SkRect outer = SkRect::MakeXYWH(10.125f, 10.125f, 100.125f, 100);
     89         SkRect inner = SkRect::MakeXYWH(20.25f, 20.125f, 80, 80);
     90         SkPath path;
     91         path.addRect(outer, SkPath::kCW_Direction);
     92         path.addRect(inner, SkPath::kCCW_Direction);
     93 
     94         canvas->drawPath(path, paint);
     95         // important to translate by a factional amount to exercise a different "phase"
     96         // of the same path w.r.t. the pixel grid
     97         SkScalar dx = SkScalarRoundToScalar(path.getBounds().width()) + 14 + 0.25f;
     98         canvas->translate(dx, 0);
     99         canvas->drawPath(path, paint);
    100 }
    101 
    102 DEF_SIMPLE_GM(blur2rectsnonninepatch, canvas, 700, 500) {
    103         SkPaint paint;
    104         paint.setMaskFilter(SkBlurMaskFilter::Create(kNormal_SkBlurStyle,
    105                                                      4.3f))->unref();
    106 
    107         SkRect outer = SkRect::MakeXYWH(10, 110, 100, 100);
    108         SkRect inner = SkRect::MakeXYWH(50, 150, 10, 10);
    109         SkPath path;
    110         path.addRect(outer, SkPath::kCW_Direction);
    111         path.addRect(inner, SkPath::kCW_Direction);
    112         canvas->drawPath(path, paint);
    113 
    114         SkScalar dx = SkScalarRoundToScalar(path.getBounds().width()) + 40 + 0.25f;
    115         canvas->translate(dx, 0);
    116         canvas->drawPath(path, paint);
    117 
    118         // Translate to outside of clip bounds.
    119         canvas->translate(-dx, 0);
    120         canvas->translate(-30, -150);
    121         canvas->drawPath(path, paint);
    122 }
    123