11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "gm.h"
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergernamespace skiagm {
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const char* gConfigNames[] = {
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    "unknown config",
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    "A1",
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    "A8",
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    "Index8",
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    "565",
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    "4444",
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    "8888"
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
221cab2921ab279367f8206cdadc9259d12e603548Derek SollenbergerSkBitmap::Config gConfigs[] = {
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger  SkBitmap::kRGB_565_Config,
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger  SkBitmap::kARGB_4444_Config,
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger  SkBitmap::kARGB_8888_Config,
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define NUM_CONFIGS (sizeof(gConfigs) / sizeof(SkBitmap::Config))
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void draw_checks(SkCanvas* canvas, int width, int height) {
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPaint paint;
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    paint.setColor(SK_ColorRED);
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    canvas->drawRectCoords(0, 0, width / 2, height / 2, paint);
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    paint.setColor(SK_ColorGREEN);
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    canvas->drawRectCoords(width / 2, 0, width, height / 2, paint);
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    paint.setColor(SK_ColorBLUE);
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    canvas->drawRectCoords(0, height / 2, width / 2, height, paint);
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    paint.setColor(SK_ColorYELLOW);
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    canvas->drawRectCoords(width / 2, height / 2, width, height, paint);
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass BitmapCopyGM : public GM {
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkBitmap    fDst[NUM_CONFIGS];
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    BitmapCopyGM() {
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        this->setBGColor(0xFFDDDDDD);
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual SkString onShortName() {
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return SkString("bitmapcopy");
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual SkISize onISize() {
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return make_isize(540, 330);
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDraw(SkCanvas* canvas) {
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint paint;
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkScalar horizMargin(SkIntToScalar(10));
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkScalar vertMargin(SkIntToScalar(10));
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        draw_checks(canvas, 40, 40);
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkBitmap src = canvas->getDevice()->accessBitmap(false);
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (unsigned i = 0; i < NUM_CONFIGS; ++i) {
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (!src.deepCopyTo(&fDst[i], gConfigs[i])) {
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                src.copyTo(&fDst[i], gConfigs[i]);
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->clear(0xFFDDDDDD);
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setAntiAlias(true);
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkScalar width = SkIntToScalar(40);
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkScalar height = SkIntToScalar(40);
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (paint.getFontSpacing() > height) {
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            height = paint.getFontSpacing();
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (unsigned i = 0; i < NUM_CONFIGS; i++) {
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const char* name = gConfigNames[src.config()];
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkScalar textWidth = paint.measureText(name, strlen(name));
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            if (textWidth > width) {
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                width = textWidth;
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkScalar horizOffset = width + horizMargin;
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkScalar vertOffset = height + vertMargin;
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->translate(SkIntToScalar(20), SkIntToScalar(20));
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (unsigned i = 0; i < NUM_CONFIGS; i++) {
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->save();
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // Draw destination config name
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            const char* name = gConfigNames[fDst[i].config()];
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkScalar textWidth = paint.measureText(name, strlen(name));
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkScalar x = (width - textWidth) / SkScalar(2);
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkScalar y = paint.getFontSpacing() / SkScalar(2);
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->drawText(name, strlen(name), x, y, paint);
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            // Draw destination bitmap
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->translate(0, vertOffset);
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            x = (width - 40) / SkScalar(2);
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->drawBitmap(fDst[i], x, 0, &paint);
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->restore();
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            canvas->translate(horizOffset, 0);
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual uint32_t onGetFlags() const { return kSkipPicture_Flag; }
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef GM INHERITED;
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//////////////////////////////////////////////////////////////////////////////
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GM* MyFactory(void*) { return new BitmapCopyGM; }
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GMRegistry reg(MyFactory);
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
122