Home | History | Annotate | Download | only in samplecode
      1 #include "SampleCode.h"
      2 #include "SkView.h"
      3 #include "SkCanvas.h"
      4 #include "SkDevice.h"
      5 #include "SkPaint.h"
      6 #include "SkShader.h"
      7 
      8 static SkBitmap createBitmap(int n) {
      9     SkBitmap bitmap;
     10     bitmap.setConfig(SkBitmap::kARGB_8888_Config, n, n);
     11     bitmap.allocPixels();
     12     bitmap.eraseColor(0);
     13 
     14     SkCanvas canvas(bitmap);
     15     SkRect r;
     16     r.set(0, 0, SkIntToScalar(n), SkIntToScalar(n));
     17     SkPaint paint;
     18     paint.setAntiAlias(true);
     19 
     20     paint.setColor(SK_ColorRED);
     21     canvas.drawOval(r, paint);
     22     paint.setColor(SK_ColorBLUE);
     23     paint.setStrokeWidth(SkIntToScalar(n)/15);
     24     paint.setStyle(SkPaint::kStroke_Style);
     25     canvas.drawLine(0, 0, r.fRight, r.fBottom, paint);
     26     canvas.drawLine(0, r.fBottom, r.fRight, 0, paint);
     27 
     28     return bitmap;
     29 }
     30 
     31 class MipMapView : public SampleView {
     32     SkBitmap fBitmap;
     33     enum {
     34         N = 64
     35     };
     36 public:
     37     MipMapView() {
     38         fBitmap = createBitmap(N);
     39 
     40         fWidth = N;
     41     }
     42 
     43 protected:
     44     // overrides from SkEventSink
     45     virtual bool onQuery(SkEvent* evt) {
     46         if (SampleCode::TitleQ(*evt)) {
     47             SampleCode::TitleR(evt, "MipMaps");
     48             return true;
     49         }
     50         return this->INHERITED::onQuery(evt);
     51     }
     52 
     53     void drawN(SkCanvas* canvas, const SkBitmap& bitmap) {
     54         SkAutoCanvasRestore acr(canvas, true);
     55         for (int i = N; i > 1; i >>= 1) {
     56             canvas->drawBitmap(bitmap, 0, 0, NULL);
     57             canvas->translate(SkIntToScalar(N + 8), 0);
     58             canvas->scale(SK_ScalarHalf, SK_ScalarHalf);
     59         }
     60     }
     61 
     62     void drawN2(SkCanvas* canvas, const SkBitmap& bitmap) {
     63         SkBitmap bg;
     64         bg.setConfig(SkBitmap::kARGB_8888_Config, N, N);
     65         bg.allocPixels();
     66 
     67         SkAutoCanvasRestore acr(canvas, true);
     68         for (int i = 0; i < 6; i++) {
     69             bg.eraseColor(0);
     70             SkCanvas c(bg);
     71             c.scale(SK_Scalar1 / (1 << i), SK_Scalar1 / (1 << i));
     72             c.drawBitmap(bitmap, 0, 0, NULL);
     73 
     74             canvas->save();
     75             canvas->scale(SkIntToScalar(1 << i), SkIntToScalar(1 << i));
     76             canvas->drawBitmap(bg, 0, 0, NULL);
     77             canvas->restore();
     78             canvas->translate(SkIntToScalar(N + 8), 0);
     79         }
     80     }
     81 
     82     virtual void onDrawContent(SkCanvas* canvas) {
     83         canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
     84 
     85         canvas->scale(1.00000001f, 0.9999999f);
     86 
     87         drawN2(canvas, fBitmap);
     88 
     89         canvas->translate(0, SkIntToScalar(N + 8));
     90         SkBitmap bitmap(fBitmap);
     91         bitmap.buildMipMap();
     92         drawN2(canvas, bitmap);
     93 
     94         SkScalar time = SampleCode::GetAnimScalar(SkIntToScalar(1)/4,
     95                                                   SkIntToScalar(2));
     96         if (time >= SK_Scalar1) {
     97             time = SkIntToScalar(2) - time;
     98         }
     99         fWidth = 8 + SkScalarRound(N * time);
    100 
    101         SkRect dst;
    102         dst.set(0, 0, SkIntToScalar(fWidth), SkIntToScalar(fWidth));
    103 
    104         SkPaint paint;
    105         paint.setFilterBitmap(true);
    106         paint.setAntiAlias(true);
    107 
    108         canvas->translate(0, SkIntToScalar(N + 8));
    109         canvas->drawBitmapRect(fBitmap, NULL, dst, NULL);
    110         canvas->translate(SkIntToScalar(N + 8), 0);
    111         canvas->drawBitmapRect(fBitmap, NULL, dst, &paint);
    112         canvas->translate(-SkIntToScalar(N + 8), SkIntToScalar(N + 8));
    113         canvas->drawBitmapRect(bitmap, NULL, dst, NULL);
    114         canvas->translate(SkIntToScalar(N + 8), 0);
    115         canvas->drawBitmapRect(bitmap, NULL, dst, &paint);
    116 
    117         SkShader* s = SkShader::CreateBitmapShader(bitmap,
    118                                                    SkShader::kRepeat_TileMode,
    119                                                    SkShader::kRepeat_TileMode);
    120         paint.setShader(s)->unref();
    121         SkMatrix m;
    122         m.setScale(SkIntToScalar(fWidth) / N,
    123                    SkIntToScalar(fWidth) / N);
    124         s->setLocalMatrix(m);
    125         SkRect r;
    126         r.set(0, 0, SkIntToScalar(4*N), SkIntToScalar(5*N/2));
    127         r.offset(SkIntToScalar(N + 12), -SkIntToScalar(N + 4));
    128         canvas->drawRect(r, paint);
    129 
    130         this->inval(NULL);
    131     }
    132 
    133 private:
    134     int fWidth;
    135 
    136     typedef SampleView INHERITED;
    137 };
    138 
    139 //////////////////////////////////////////////////////////////////////////////
    140 
    141 static SkView* MyFactory() { return new MipMapView; }
    142 static SkViewRegister reg(MyFactory);
    143 
    144