Home | History | Annotate | Download | only in samplecode
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 #include "SampleCode.h"
      9 #include "SkView.h"
     10 #include "SkCanvas.h"
     11 #include "SkGradientShader.h"
     12 #include "SkGraphics.h"
     13 #include "SkImageDecoder.h"
     14 #include "SkPath.h"
     15 #include "SkRegion.h"
     16 #include "SkShader.h"
     17 #include "SkUtils.h"
     18 #include "SkXfermode.h"
     19 #include "SkColorPriv.h"
     20 #include "SkColorFilter.h"
     21 #include "SkTime.h"
     22 #include "SkTypeface.h"
     23 
     24 static SkShader* make_bitmapfade(const SkBitmap& bm)
     25 {
     26     SkPoint pts[2];
     27     SkColor colors[2];
     28 
     29     pts[0].set(0, 0);
     30     pts[1].set(0, SkIntToScalar(bm.height()));
     31     colors[0] = SK_ColorBLACK;
     32     colors[1] = SkColorSetARGB(0, 0, 0, 0);
     33     SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
     34 
     35     SkShader* shaderB = SkShader::CreateBitmapShader(bm,
     36                         SkShader::kClamp_TileMode, SkShader::kClamp_TileMode);
     37 
     38     SkXfermode* mode = SkXfermode::Create(SkXfermode::kDstIn_Mode);
     39 
     40     SkShader* shader = SkShader::CreateComposeShader(shaderB, shaderA, mode);
     41     shaderA->unref();
     42     shaderB->unref();
     43     mode->unref();
     44 
     45     return shader;
     46 }
     47 
     48 class ShaderView : public SampleView {
     49 public:
     50     SkShader*   fShader;
     51     SkBitmap    fBitmap;
     52 
     53     ShaderView() {
     54         SkImageDecoder::DecodeFile("/skimages/logo.gif", &fBitmap);
     55 
     56         SkPoint pts[2];
     57         SkColor colors[2];
     58 
     59         pts[0].set(0, 0);
     60         pts[1].set(SkIntToScalar(100), 0);
     61         colors[0] = SK_ColorRED;
     62         colors[1] = SK_ColorBLUE;
     63         SkShader* shaderA = SkGradientShader::CreateLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
     64 
     65         pts[0].set(0, 0);
     66         pts[1].set(0, SkIntToScalar(100));
     67         colors[0] = SK_ColorBLACK;
     68         colors[1] = SkColorSetARGB(0x80, 0, 0, 0);
     69         SkShader* shaderB = SkGradientShader::CreateLinear(pts, colors, nullptr, 2, SkShader::kClamp_TileMode);
     70 
     71         SkXfermode* mode = SkXfermode::Create(SkXfermode::kDstIn_Mode);
     72 
     73         fShader = SkShader::CreateComposeShader(shaderA, shaderB, mode);
     74         shaderA->unref();
     75         shaderB->unref();
     76         mode->unref();
     77     }
     78     virtual ~ShaderView() {
     79         SkSafeUnref(fShader);
     80     }
     81 
     82 protected:
     83     // overrides from SkEventSink
     84     bool onQuery(SkEvent* evt) override {
     85         if (SampleCode::TitleQ(*evt)) {
     86             SampleCode::TitleR(evt, "Shaders");
     87             return true;
     88         }
     89         return this->INHERITED::onQuery(evt);
     90     }
     91 
     92     void onDrawContent(SkCanvas* canvas) override {
     93         canvas->drawBitmap(fBitmap, 0, 0);
     94 
     95         canvas->translate(SkIntToScalar(20), SkIntToScalar(120));
     96 
     97         SkPaint paint;
     98         SkRect  r;
     99 
    100         paint.setColor(SK_ColorGREEN);
    101         canvas->drawRectCoords(0, 0, SkIntToScalar(100), SkIntToScalar(100), paint);
    102         paint.setShader(fShader);
    103         canvas->drawRectCoords(0, 0, SkIntToScalar(100), SkIntToScalar(100), paint);
    104 
    105         canvas->translate(SkIntToScalar(110), 0);
    106 
    107         int w = fBitmap.width();
    108         int h = fBitmap.height();
    109         w = 120;
    110         h = 80;
    111         r.set(0, 0, SkIntToScalar(w), SkIntToScalar(h));
    112 
    113         paint.setShader(nullptr);
    114         canvas->drawRect(r, paint);
    115         paint.setShader(make_bitmapfade(fBitmap))->unref();
    116         canvas->drawRect(r, paint);
    117     }
    118 
    119     SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, unsigned modi) override {
    120         this->inval(nullptr);
    121         return this->INHERITED::onFindClickHandler(x, y, modi);
    122     }
    123 
    124     bool onClick(Click* click)  override {
    125         return this->INHERITED::onClick(click);
    126     }
    127 
    128 private:
    129     typedef SampleView INHERITED;
    130 };
    131 
    132 //////////////////////////////////////////////////////////////////////////////
    133 
    134 static SkView* MyFactory() { return new ShaderView; }
    135 static SkViewRegister reg(MyFactory);
    136