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