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