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#include "SkShader.h"
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkColorPriv.h"
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger// effects
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkGradientShader.h"
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergernamespace skiagm {
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic void makebm(SkBitmap* bm, SkBitmap::Config config, int w, int h) {
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bm->setConfig(config, w, h);
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bm->allocPixels();
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bm->eraseColor(0);
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkCanvas    canvas(*bm);
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar wScalar = SkIntToScalar(w);
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar hScalar = SkIntToScalar(h);
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPoint     pt = { wScalar / 2, hScalar / 2 };
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar    radius = 4 * SkMaxScalar(wScalar, hScalar);
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkColor     colors[] = { SK_ColorRED, SK_ColorYELLOW,
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             SK_ColorGREEN, SK_ColorMAGENTA,
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             SK_ColorBLUE, SK_ColorCYAN,
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                             SK_ColorRED};
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkScalar    pos[] = {0,
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                         SK_Scalar1 / 6,
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                         2 * SK_Scalar1 / 6,
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                         3 * SK_Scalar1 / 6,
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                         4 * SK_Scalar1 / 6,
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                         5 * SK_Scalar1 / 6,
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                         SK_Scalar1};
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkPaint     paint;
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    paint.setShader(SkGradientShader::CreateRadial(
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    pt, radius,
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    colors, pos,
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    SK_ARRAY_COUNT(colors),
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    SkShader::kRepeat_TileMode))->unref();
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRect rect = SkRect::MakeWH(wScalar, hScalar);
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkMatrix mat = SkMatrix::I();
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    for (int i = 0; i < 4; ++i) {
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.getShader()->setLocalMatrix(mat);
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas.drawRect(rect, paint);
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        rect.inset(wScalar / 8, hScalar / 8);
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        mat.postScale(SK_Scalar1 / 4, SK_Scalar1 / 4);
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic const int gSize = 1024;
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass DrawBitmapRectGM : public GM {
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    DrawBitmapRectGM() {
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkBitmap    fLargeBitmap;
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprotected:
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkString onShortName() {
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return SkString("drawbitmaprect");
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkISize onISize() { return make_isize(gSize, gSize); }
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    virtual void onDraw(SkCanvas* canvas) {
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const int kBmpSize = 2048;
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        if (fLargeBitmap.isNull()) {
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            makebm(&fLargeBitmap,
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   SkBitmap::kARGB_8888_Config,
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                   kBmpSize, kBmpSize);
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkRect dstRect = { 0, 0, SkIntToScalar(64), SkIntToScalar(64)};
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const int kMaxSrcRectSize = 1 << (SkNextLog2(kBmpSize) + 2);
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const int kPadX = 30;
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        static const int kPadY = 40;
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint paint;
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setAlpha(0x20);
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->drawBitmapRect(fLargeBitmap, NULL,
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               SkRect::MakeWH(gSize * SK_Scalar1,
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                              gSize * SK_Scalar1),
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                               &paint);
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->translate(SK_Scalar1 * kPadX / 2,
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                          SK_Scalar1 * kPadY / 2);
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkPaint blackPaint;
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkScalar titleHeight = SK_Scalar1 * 24;
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        blackPaint.setColor(SK_ColorBLACK);
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        blackPaint.setTextSize(titleHeight);
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        blackPaint.setAntiAlias(true);
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkString title;
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        title.printf("Bitmap size: %d x %d", kBmpSize, kBmpSize);
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->drawText(title.c_str(), title.size(), 0,
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                         titleHeight, blackPaint);
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->translate(0, SK_Scalar1 * kPadY / 2  + titleHeight);
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        int rowCount = 0;
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->save();
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        for (int w = 1; w <= kMaxSrcRectSize; w *= 4) {
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            for (int h = 1; h <= kMaxSrcRectSize; h *= 4) {
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                SkIRect srcRect = SkIRect::MakeXYWH((kBmpSize - w) / 2,
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                    (kBmpSize - h) / 2,
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                                    w, h);
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->drawBitmapRect(fLargeBitmap, &srcRect, dstRect);
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                SkString label;
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                label.appendf("%d x %d", w, h);
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                blackPaint.setAntiAlias(true);
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                blackPaint.setStyle(SkPaint::kFill_Style);
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                blackPaint.setTextSize(SK_Scalar1 * 10);
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                SkScalar baseline = dstRect.height() +
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    blackPaint.getTextSize() + SK_Scalar1 * 3;
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->drawText(label.c_str(), label.size(),
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    0, baseline,
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                                    blackPaint);
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                blackPaint.setStyle(SkPaint::kStroke_Style);
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                blackPaint.setStrokeWidth(SK_Scalar1);
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                blackPaint.setAntiAlias(false);
1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->drawRect(dstRect, blackPaint);
1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                canvas->translate(dstRect.width() + SK_Scalar1 * kPadX, 0);
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                ++rowCount;
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                if ((dstRect.width() + kPadX) * rowCount > gSize) {
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->restore();
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->translate(0, dstRect.height() + SK_Scalar1 * kPadY);
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    canvas->save();
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                    rowCount = 0;
1401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                }
1411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            }
1421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        }
1431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
1461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    typedef GM INHERITED;
1471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
1481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger//////////////////////////////////////////////////////////////////////////////
1501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GM* MyFactory(void*) { return new DrawBitmapRectGM; }
1521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerstatic GMRegistry reg(MyFactory);
1531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger}
1551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
156