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 "sk_tool_utils.h"
     10 #include "Resources.h"
     11 #include "SkBlurMask.h"
     12 #include "SkBlurMaskFilter.h"
     13 #include "SkImage.h"
     14 #include "SkPath.h"
     15 
     16 DEF_SIMPLE_GM_BG(blurs, canvas, 700, 500, sk_tool_utils::color_to_565(0xFFDDDDDD)) {
     17         SkBlurStyle NONE = SkBlurStyle(-999);
     18         const struct {
     19             SkBlurStyle fStyle;
     20             int         fCx, fCy;
     21         } gRecs[] = {
     22             { NONE,                 0,  0 },
     23             { kInner_SkBlurStyle,  -1,  0 },
     24             { kNormal_SkBlurStyle,  0,  1 },
     25             { kSolid_SkBlurStyle,   0, -1 },
     26             { kOuter_SkBlurStyle,   1,  0 },
     27         };
     28 
     29         SkPaint paint;
     30         paint.setAntiAlias(true);
     31         sk_tool_utils::set_portable_typeface(&paint);
     32         paint.setTextSize(SkIntToScalar(25));
     33         canvas->translate(SkIntToScalar(-40), SkIntToScalar(0));
     34 
     35         SkBlurMaskFilter::BlurFlags flags = SkBlurMaskFilter::kNone_BlurFlag;
     36         for (int j = 0; j < 2; j++) {
     37             canvas->save();
     38             paint.setColor(SK_ColorBLUE);
     39             for (size_t i = 0; i < SK_ARRAY_COUNT(gRecs); i++) {
     40                 if (gRecs[i].fStyle != NONE) {
     41                     paint.setMaskFilter(SkBlurMaskFilter::Make(gRecs[i].fStyle,
     42                                            SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(20)),
     43                                            flags));
     44                 } else {
     45                     paint.setMaskFilter(nullptr);
     46                 }
     47                 canvas->drawCircle(SkIntToScalar(200 + gRecs[i].fCx*100),
     48                                    SkIntToScalar(200 + gRecs[i].fCy*100),
     49                                    SkIntToScalar(50),
     50                                    paint);
     51             }
     52             // draw text
     53             {
     54                 paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
     55                                            SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(4)),
     56                                            flags));
     57                 SkScalar x = SkIntToScalar(70);
     58                 SkScalar y = SkIntToScalar(400);
     59                 paint.setColor(SK_ColorBLACK);
     60                 canvas->drawString("Hamburgefons Style", x, y, paint);
     61                 canvas->drawString("Hamburgefons Style",
     62                                  x, y + SkIntToScalar(50), paint);
     63                 paint.setMaskFilter(nullptr);
     64                 paint.setColor(SK_ColorWHITE);
     65                 x -= SkIntToScalar(2);
     66                 y -= SkIntToScalar(2);
     67                 canvas->drawString("Hamburgefons Style", x, y, paint);
     68             }
     69             canvas->restore();
     70             flags = SkBlurMaskFilter::kHighQuality_BlurFlag;
     71             canvas->translate(SkIntToScalar(350), SkIntToScalar(0));
     72         }
     73 }
     74 
     75 //////////////////////////////////////////////////////////////////////////////////////////////
     76 
     77 // exercise a special-case of blurs, which is two nested rects. These are drawn specially,
     78 // and possibly cached.
     79 //
     80 // in particular, we want to notice that the 2nd rect draws slightly differently, since it
     81 // is translated a fractional amount.
     82 //
     83 DEF_SIMPLE_GM(blur2rects, canvas, 700, 500) {
     84         SkPaint paint;
     85 
     86         paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, 2.3f));
     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::Make(kNormal_SkBlurStyle, 4.3f));
    105 
    106         SkRect outer = SkRect::MakeXYWH(10, 110, 100, 100);
    107         SkRect inner = SkRect::MakeXYWH(50, 150, 10, 10);
    108         SkPath path;
    109         path.addRect(outer, SkPath::kCW_Direction);
    110         path.addRect(inner, SkPath::kCW_Direction);
    111         canvas->drawPath(path, paint);
    112 
    113         SkScalar dx = SkScalarRoundToScalar(path.getBounds().width()) + 40 + 0.25f;
    114         canvas->translate(dx, 0);
    115         canvas->drawPath(path, paint);
    116 
    117         // Translate to outside of clip bounds.
    118         canvas->translate(-dx, 0);
    119         canvas->translate(-30, -150);
    120         canvas->drawPath(path, paint);
    121 }
    122 
    123 DEF_SIMPLE_GM(BlurDrawImage, canvas, 256, 256) {
    124     SkPaint paint;
    125     paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle, 10, 0));
    126     canvas->clear(0xFF88FF88);
    127     if (auto image = GetResourceAsImage("images/mandrill_512_q075.jpg")) {
    128         canvas->scale(0.25, 0.25);
    129         canvas->drawImage(image, 256, 256, &paint);
    130     }
    131 }
    132