Home | History | Annotate | Download | only in gm
      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 "gm.h"
      9 
     10 namespace skiagm {
     11 
     12 static const char* gColorTypeNames[] = {
     13     "unknown",
     14     "A8",
     15     "565",
     16     "4444",
     17     "8888",
     18     "8888",
     19     "Index8",
     20 };
     21 
     22 static const SkColorType gColorTypes[] = {
     23     kRGB_565_SkColorType,
     24     kARGB_4444_SkColorType,
     25     kN32_SkColorType,
     26 };
     27 
     28 #define NUM_CONFIGS SK_ARRAY_COUNT(gColorTypes)
     29 
     30 static void draw_checks(SkCanvas* canvas, int width, int height) {
     31     SkPaint paint;
     32     paint.setColor(SK_ColorRED);
     33     canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(0),
     34         SkIntToScalar(width / 2), SkIntToScalar(height / 2), paint);
     35     paint.setColor(SK_ColorGREEN);
     36     canvas->drawRectCoords(SkIntToScalar(width / 2), SkIntToScalar(0),
     37         SkIntToScalar(width), SkIntToScalar(height / 2), paint);
     38     paint.setColor(SK_ColorBLUE);
     39     canvas->drawRectCoords(SkIntToScalar(0), SkIntToScalar(height / 2),
     40         SkIntToScalar(width / 2), SkIntToScalar(height), paint);
     41     paint.setColor(SK_ColorYELLOW);
     42     canvas->drawRectCoords(SkIntToScalar(width / 2), SkIntToScalar(height / 2),
     43         SkIntToScalar(width), SkIntToScalar(height), paint);
     44 }
     45 
     46 class BitmapCopyGM : public GM {
     47 public:
     48     SkBitmap    fDst[NUM_CONFIGS];
     49 
     50     BitmapCopyGM() {
     51         this->setBGColor(0xFFDDDDDD);
     52     }
     53 
     54 protected:
     55     virtual SkString onShortName() {
     56         return SkString("bitmapcopy");
     57     }
     58 
     59     virtual SkISize onISize() {
     60         return SkISize::Make(540, 330);
     61     }
     62 
     63     virtual void onDraw(SkCanvas* canvas) {
     64         SkPaint paint;
     65         SkScalar horizMargin = 10;
     66         SkScalar vertMargin = 10;
     67 
     68         SkBitmap src;
     69         src.allocN32Pixels(40, 40);
     70         SkCanvas canvasTmp(src);
     71 
     72         draw_checks(&canvasTmp, 40, 40);
     73 
     74         for (unsigned i = 0; i < NUM_CONFIGS; ++i) {
     75             src.copyTo(&fDst[i], gColorTypes[i]);
     76         }
     77 
     78         canvas->clear(0xFFDDDDDD);
     79         paint.setAntiAlias(true);
     80         sk_tool_utils::set_portable_typeface(&paint);
     81 
     82         SkScalar width = SkIntToScalar(40);
     83         SkScalar height = SkIntToScalar(40);
     84         if (paint.getFontSpacing() > height) {
     85             height = paint.getFontSpacing();
     86         }
     87         for (unsigned i = 0; i < NUM_CONFIGS; i++) {
     88             const char* name = gColorTypeNames[src.colorType()];
     89             SkScalar textWidth = paint.measureText(name, strlen(name));
     90             if (textWidth > width) {
     91                 width = textWidth;
     92             }
     93         }
     94         SkScalar horizOffset = width + horizMargin;
     95         SkScalar vertOffset = height + vertMargin;
     96         canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
     97 
     98         for (unsigned i = 0; i < NUM_CONFIGS; i++) {
     99             canvas->save();
    100             // Draw destination config name
    101             const char* name = gColorTypeNames[fDst[i].colorType()];
    102             SkScalar textWidth = paint.measureText(name, strlen(name));
    103             SkScalar x = (width - textWidth) / SkScalar(2);
    104             SkScalar y = paint.getFontSpacing() / SkScalar(2);
    105             canvas->drawText(name, strlen(name), x, y, paint);
    106 
    107             // Draw destination bitmap
    108             canvas->translate(0, vertOffset);
    109             x = (width - 40) / SkScalar(2);
    110             canvas->drawBitmap(fDst[i], x, 0, &paint);
    111             canvas->restore();
    112 
    113             canvas->translate(horizOffset, 0);
    114         }
    115     }
    116 
    117 private:
    118     typedef GM INHERITED;
    119 };
    120 
    121 //////////////////////////////////////////////////////////////////////////////
    122 
    123 static GM* MyFactory(void*) { return new BitmapCopyGM; }
    124 static GMRegistry reg(MyFactory);
    125 }
    126