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 "SkPaint.h"
     12 #include "SkPath.h"
     13 #include "SkPictureRecorder.h"
     14 #include "SkRegion.h"
     15 #include "SkShader.h"
     16 #include "SkUtils.h"
     17 #include "SkColorPriv.h"
     18 #include "SkColorFilter.h"
     19 #include "SkPicture.h"
     20 #include "SkTypeface.h"
     21 
     22 // effects
     23 #include "SkGradientShader.h"
     24 #include "SkBlurMask.h"
     25 #include "SkBlurDrawLooper.h"
     26 
     27 static void makebm(SkBitmap* bm, SkColorType ct, int w, int h) {
     28     bm->allocPixels(SkImageInfo::Make(w, h, ct, kPremul_SkAlphaType));
     29     bm->eraseColor(SK_ColorTRANSPARENT);
     30 
     31     SkCanvas    canvas(*bm);
     32     SkPoint     pts[] = { { 0, 0 }, { SkIntToScalar(w), SkIntToScalar(h) } };
     33     SkColor     colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE };
     34     SkScalar    pos[] = { 0, SK_Scalar1/2, SK_Scalar1 };
     35     SkPaint     paint;
     36 
     37     paint.setDither(true);
     38     paint.setShader(SkGradientShader::CreateLinear(pts, colors, pos,
     39                 SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode))->unref();
     40     canvas.drawPaint(paint);
     41 }
     42 
     43 static void setup(SkPaint* paint, const SkBitmap& bm, bool filter,
     44                   SkShader::TileMode tmx, SkShader::TileMode tmy) {
     45     SkShader* shader = SkShader::CreateBitmapShader(bm, tmx, tmy);
     46     paint->setShader(shader)->unref();
     47     paint->setFilterLevel(filter ? SkPaint::kLow_FilterLevel : SkPaint::kNone_FilterLevel);
     48 }
     49 
     50 static const SkColorType gColorTypes[] = {
     51     kN32_SkColorType,
     52     kRGB_565_SkColorType,
     53 };
     54 static const int gWidth = 32;
     55 static const int gHeight = 32;
     56 
     57 class TilingView : public SampleView {
     58     SkAutoTUnref<SkPicture>        fTextPicture;
     59     SkAutoTUnref<SkBlurDrawLooper> fLooper;
     60 public:
     61     TilingView()
     62             : fLooper(SkBlurDrawLooper::Create(0x88000000,
     63                                                SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(1)),
     64                                                SkIntToScalar(2), SkIntToScalar(2))) {
     65         for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypes); i++) {
     66             makebm(&fTexture[i], gColorTypes[i], gWidth, gHeight);
     67         }
     68     }
     69 
     70     virtual ~TilingView() {
     71     }
     72 
     73     SkBitmap    fTexture[SK_ARRAY_COUNT(gColorTypes)];
     74 
     75 protected:
     76     // overrides from SkEventSink
     77     virtual bool onQuery(SkEvent* evt) {
     78         if (SampleCode::TitleQ(*evt)) {
     79             SampleCode::TitleR(evt, "Tiling");
     80             return true;
     81         }
     82         return this->INHERITED::onQuery(evt);
     83     }
     84 
     85     virtual void onDrawContent(SkCanvas* canvas) {
     86         SkRect r = { 0, 0, SkIntToScalar(gWidth*2), SkIntToScalar(gHeight*2) };
     87 
     88         static const char* gConfigNames[] = { "8888", "565", "4444" };
     89 
     90         static const bool           gFilters[] = { false, true };
     91         static const char*          gFilterNames[] = {     "point",                     "bilinear" };
     92 
     93         static const SkShader::TileMode gModes[] = { SkShader::kClamp_TileMode, SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode };
     94         static const char*          gModeNames[] = {    "C",                    "R",                   "M" };
     95 
     96         SkScalar y = SkIntToScalar(24);
     97         SkScalar x = SkIntToScalar(10);
     98 
     99         SkPictureRecorder recorder;
    100         SkCanvas* textCanvas = NULL;
    101         if (NULL == fTextPicture) {
    102             textCanvas = recorder.beginRecording(1000, 1000, NULL, 0);
    103         }
    104 
    105         if (textCanvas) {
    106             for (size_t kx = 0; kx < SK_ARRAY_COUNT(gModes); kx++) {
    107                 for (size_t ky = 0; ky < SK_ARRAY_COUNT(gModes); ky++) {
    108                     SkPaint p;
    109                     SkString str;
    110                     p.setAntiAlias(true);
    111                     p.setDither(true);
    112                     p.setLooper(fLooper);
    113                     str.printf("[%s,%s]", gModeNames[kx], gModeNames[ky]);
    114 
    115                     p.setTextAlign(SkPaint::kCenter_Align);
    116                     textCanvas->drawText(str.c_str(), str.size(), x + r.width()/2, y, p);
    117 
    118                     x += r.width() * 4 / 3;
    119                 }
    120             }
    121         }
    122 
    123         y += SkIntToScalar(16);
    124 
    125         for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypes); i++) {
    126             for (size_t j = 0; j < SK_ARRAY_COUNT(gFilters); j++) {
    127                 x = SkIntToScalar(10);
    128                 for (size_t kx = 0; kx < SK_ARRAY_COUNT(gModes); kx++) {
    129                     for (size_t ky = 0; ky < SK_ARRAY_COUNT(gModes); ky++) {
    130                         SkPaint paint;
    131                         setup(&paint, fTexture[i], gFilters[j], gModes[kx], gModes[ky]);
    132                         paint.setDither(true);
    133 
    134                         canvas->save();
    135                         canvas->translate(x, y);
    136                         canvas->drawRect(r, paint);
    137                         canvas->restore();
    138 
    139                         x += r.width() * 4 / 3;
    140                     }
    141                 }
    142                 if (textCanvas) {
    143                     SkPaint p;
    144                     SkString str;
    145                     p.setAntiAlias(true);
    146                     p.setLooper(fLooper);
    147                     str.printf("%s, %s", gConfigNames[i], gFilterNames[j]);
    148                     textCanvas->drawText(str.c_str(), str.size(), x, y + r.height() * 2 / 3, p);
    149                 }
    150 
    151                 y += r.height() * 4 / 3;
    152             }
    153         }
    154 
    155         if (textCanvas) {
    156             SkASSERT(NULL == fTextPicture);
    157             fTextPicture.reset(recorder.endRecording());
    158         }
    159 
    160         SkASSERT(fTextPicture);
    161         canvas->drawPicture(fTextPicture);
    162     }
    163 
    164 private:
    165     typedef SampleView INHERITED;
    166 };
    167 
    168 //////////////////////////////////////////////////////////////////////////////
    169 
    170 static SkView* MyFactory() { return new TilingView; }
    171 static SkViewRegister reg(MyFactory);
    172