Home | History | Annotate | Download | only in samplecode
      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 "DecodeFile.h"
      9 #include "SampleCode.h"
     10 #include "SkView.h"
     11 #include "SkCanvas.h"
     12 #include "SkGradientShader.h"
     13 #include "SkGraphics.h"
     14 #include "SkPath.h"
     15 #include "SkRegion.h"
     16 #include "SkShader.h"
     17 #include "SkUtils.h"
     18 #include "SkColorPriv.h"
     19 #include "SkColorFilter.h"
     20 #include "SkTime.h"
     21 #include "SkTypeface.h"
     22 
     23 static sk_sp<SkShader> make_bitmapfade(const SkBitmap& bm) {
     24     SkPoint pts[2];
     25     SkColor colors[2];
     26 
     27     pts[0].set(0, 0);
     28     pts[1].set(0, SkIntToScalar(bm.height()));
     29     colors[0] = SK_ColorBLACK;
     30     colors[1] = SkColorSetARGB(0, 0, 0, 0);
     31     auto shaderA = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
     32 
     33     auto shaderB = SkShader::MakeBitmapShader(bm,
     34                                               SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
     35 
     36     return SkShader::MakeComposeShader(std::move(shaderB), std::move(shaderA), SkBlendMode::kDstIn);
     37 }
     38 
     39 class ShaderView : public SampleView {
     40 public:
     41     sk_sp<SkShader> fShader;
     42     SkBitmap        fBitmap;
     43 
     44     ShaderView() {
     45         decode_file("/skimages/logo.gif", &fBitmap);
     46 
     47         SkPoint pts[2];
     48         SkColor colors[2];
     49 
     50         pts[0].set(0, 0);
     51         pts[1].set(SkIntToScalar(100), 0);
     52         colors[0] = SK_ColorRED;
     53         colors[1] = SK_ColorBLUE;
     54         auto shaderA = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
     55 
     56         pts[0].set(0, 0);
     57         pts[1].set(0, SkIntToScalar(100));
     58         colors[0] = SK_ColorBLACK;
     59         colors[1] = SkColorSetARGB(0x80, 0, 0, 0);
     60         auto shaderB = SkGradientShader::MakeLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
     61 
     62         fShader = SkShader::MakeComposeShader(std::move(shaderA), std::move(shaderB),
     63                                               SkBlendMode::kDstIn);
     64     }
     65 
     66 protected:
     67     // overrides from SkEventSink
     68     bool onQuery(SkEvent* evt) override {
     69         if (SampleCode::TitleQ(*evt)) {
     70             SampleCode::TitleR(evt, "Shaders");
     71             return true;
     72         }
     73         return this->INHERITED::onQuery(evt);
     74     }
     75 
     76     void onDrawContent(SkCanvas* canvas) override {
     77         canvas->drawBitmap(fBitmap, 0, 0);
     78 
     79         canvas->translate(20, 120);
     80 
     81         SkPaint paint;
     82         SkRect  r;
     83 
     84         paint.setColor(SK_ColorGREEN);
     85         canvas->drawRect(SkRect::MakeWH(100, 100), paint);
     86         paint.setShader(fShader);
     87         canvas->drawRect(SkRect::MakeWH(100, 100), paint);
     88 
     89         canvas->translate(SkIntToScalar(110), 0);
     90 
     91         int w = fBitmap.width();
     92         int h = fBitmap.height();
     93         w = 120;
     94         h = 80;
     95         r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
     96 
     97         paint.setShader(nullptr);
     98         canvas->drawRect(r, paint);
     99         paint.setShader(make_bitmapfade(fBitmap));
    100         canvas->drawRect(r, paint);
    101     }
    102 
    103     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
    104         this->inval(nullptr);
    105         return this->INHERITED::onFindClickHandler(x, y, modi);
    106     }
    107 
    108     bool onClick(Click* click)  override {
    109         return this->INHERITED::onClick(click);
    110     }
    111 
    112 private:
    113     typedef SampleView INHERITED;
    114 };
    115 
    116 //////////////////////////////////////////////////////////////////////////////
    117 
    118 static SkView* MyFactory() { return new ShaderView; }
    119 static SkViewRegister reg(MyFactory);
    120