SampleTiling.cpp revision 84b18c7e3e042bf206e1ace3d1b6ea5bb929fe51
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 35b790feeeb211c42bf78ca3ae9c26aa30e516765Jakub Pawlowski * Copyright 2011 Google Inc. 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Use of this source code is governed by a BSD-style license that can be 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * found in the LICENSE file. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SampleCode.h" 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkView.h" 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkCanvas.h" 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkPaint.h" 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkPath.h" 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkRegion.h" 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkShader.h" 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkUtils.h" 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkColorPriv.h" 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkColorFilter.h" 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkPicture.h" 1949120dc867c7818511b5afec461dfc97d17eef58Marie Janssen#include "SkTypeface.h" 2049120dc867c7818511b5afec461dfc97d17eef58Marie Janssen 2149a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen// effects 2249a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "SkGradientShader.h" 23f2af1c42ccb2f642b241c2261b42d0be61d45438Jack He#include "SkUnitMappers.h" 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkBlurMask.h" 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "SkBlurDrawLooper.h" 26b95c4ef4ac9e86953050a7ae6b3b4260df935713Sharvil Nanavati 27646134e0a04459f649cb50aa9f3272054630c345Ajay Panickerstatic void makebm(SkBitmap* bm, SkColorType ct, int w, int h) { 28d30195cbf09735da593e186c4c99cce6232b072eArman Uguray bm->allocPixels(SkImageInfo::Make(w, h, ct, kPremul_SkAlphaType)); 296bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson bm->eraseColor(SK_ColorTRANSPARENT); 30b95c4ef4ac9e86953050a7ae6b3b4260df935713Sharvil Nanavati 31a5764686f719d8d779d8a5ff8cc64010b7893e36Marie Janssen SkCanvas canvas(*bm); 32a5764686f719d8d779d8a5ff8cc64010b7893e36Marie Janssen SkPoint pts[] = { { 0, 0 }, { SkIntToScalar(w), SkIntToScalar(h) } }; 33db554581079863974af8e1289646f5deea6fc044Marie Janssen SkColor colors[] = { SK_ColorRED, SK_ColorGREEN, SK_ColorBLUE }; 34db554581079863974af8e1289646f5deea6fc044Marie Janssen SkScalar pos[] = { 0, SK_Scalar1/2, SK_Scalar1 }; 357b266be449e4f915c419199c2312eb31f70e63bcAjay Panicker SkPaint paint; 3632b3a8a408b23aa28324ad9f56654c98fe2ac914Srinu Jella 379a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh SkUnitMapper* um = NULL; 385cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 39db554581079863974af8e1289646f5deea6fc044Marie Janssen um = new SkCosineMapper; 40db554581079863974af8e1289646f5deea6fc044Marie Janssen// um = new SkDiscreteMapper(12); 4147d68ee6229ccec3deeaaf694fa86438d97333a4Scott James Remnant 420f9b91e150e153229235c163861198e23600e636Sharvil Nanavati SkAutoUnref au(um); 4344802768c447ab480d4227b3a852a97d923b816dSharvil Nanavati 44db554581079863974af8e1289646f5deea6fc044Marie Janssen paint.setDither(true); 45b4a42e7b9c277cfd71a575cbdb104013855b80cdBluetooth Build Test paint.setShader(SkGradientShader::CreateLinear(pts, colors, pos, 46bf5c3cb18f16198bc2657cd7a50874d17cd52cc8Ajay Panicker SK_ARRAY_COUNT(colors), SkShader::kClamp_TileMode, um))->unref(); 47e909ff50ffae0612fc0434cd2130469868b81ae4Jacky Cheung canvas.drawPaint(paint); 48e909ff50ffae0612fc0434cd2130469868b81ae4Jacky Cheung} 49646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker 50646134e0a04459f649cb50aa9f3272054630c345Ajay Panickerstatic void setup(SkPaint* paint, const SkBitmap& bm, bool filter, 5172a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker SkShader::TileMode tmx, SkShader::TileMode tmy) { 52646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker SkShader* shader = SkShader::CreateBitmapShader(bm, tmx, tmy); 53646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker paint->setShader(shader)->unref(); 54646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker paint->setFilterLevel(filter ? SkPaint::kLow_FilterLevel : SkPaint::kNone_FilterLevel); 55f2d6434a6b7ad98e20c7a601d2a0950237514837Arman Uguray} 56f2d6434a6b7ad98e20c7a601d2a0950237514837Arman Uguray 576bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic const SkColorType gColorTypes[] = { 586bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson kN32_SkColorType, 596bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson kRGB_565_SkColorType, 606bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson}; 616bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic const int gWidth = 32; 626bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic const int gHeight = 32; 636bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 646bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonclass TilingView : public SampleView { 65f2d6434a6b7ad98e20c7a601d2a0950237514837Arman Uguray SkAutoTUnref<SkPicture> fTextPicture; 66b95c4ef4ac9e86953050a7ae6b3b4260df935713Sharvil Nanavati SkBlurDrawLooper fLooper; 677939ed0c9a50c769e9e648a2d7751e0894b485edzzypublic: 686bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson TilingView() 696bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson : fLooper(0x88000000, 70bf5c3cb18f16198bc2657cd7a50874d17cd52cc8Ajay Panicker SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(1)), 71bf5c3cb18f16198bc2657cd7a50874d17cd52cc8Ajay Panicker SkIntToScalar(2), SkIntToScalar(2)) { 726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypes); i++) { 736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson makebm(&fTexture[i], gColorTypes[i], gWidth, gHeight); 74f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski } 75335aa36bca8532874c23c1afe5bfc2aff7fc01a5Mike J. Chen } 76190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker 77190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker virtual ~TilingView() { 78190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker } 79190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker 809a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh SkBitmap fTexture[SK_ARRAY_COUNT(gColorTypes)]; 81190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker 82190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panickerprotected: 83190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker // overrides from SkEventSink 84190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker virtual bool onQuery(SkEvent* evt) { 85bcfdd0ab24357c5dd842540e6c0e8f34ba7aac11Marie Janssen if (SampleCode::TitleQ(*evt)) { 86646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker SampleCode::TitleR(evt, "Tiling"); 87190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker return true; 886bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 896bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson return this->INHERITED::onQuery(evt); 90b95c4ef4ac9e86953050a7ae6b3b4260df935713Sharvil Nanavati } 91a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski 926bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson virtual void onDrawContent(SkCanvas* canvas) { 9386f97eda524568f2d264186844450db5e56dac36Matthew Xie SkRect r = { 0, 0, SkIntToScalar(gWidth*2), SkIntToScalar(gHeight*2) }; 94b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski 95b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski static const char* gConfigNames[] = { "8888", "565", "4444" }; 9686f97eda524568f2d264186844450db5e56dac36Matthew Xie 976bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson static const bool gFilters[] = { false, true }; 9886f97eda524568f2d264186844450db5e56dac36Matthew Xie static const char* gFilterNames[] = { "point", "bilinear" }; 996bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 1006bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson static const SkShader::TileMode gModes[] = { SkShader::kClamp_TileMode, SkShader::kRepeat_TileMode, SkShader::kMirror_TileMode }; 1016bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson static const char* gModeNames[] = { "C", "R", "M" }; 10286f97eda524568f2d264186844450db5e56dac36Matthew Xie 10386f97eda524568f2d264186844450db5e56dac36Matthew Xie SkScalar y = SkIntToScalar(24); 104a484a888196ddf8bcbf1ad3226d6451bc735a94bJakub Pawlowski SkScalar x = SkIntToScalar(10); 1056bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 10686f97eda524568f2d264186844450db5e56dac36Matthew Xie SkPictureRecorder recorder; 107b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski SkCanvas* textCanvas = NULL; 108b707f447cbb916de2e0dfd2b4e9bf15818376e64Jakub Pawlowski if (fTextPicture->width() == 0) { 10986f97eda524568f2d264186844450db5e56dac36Matthew Xie textCanvas = recorder.beginRecording(1000, 1000); 1106bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 11186f97eda524568f2d264186844450db5e56dac36Matthew Xie 1126bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (NULL != textCanvas) { 1136bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson for (size_t kx = 0; kx < SK_ARRAY_COUNT(gModes); kx++) { 1146bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson for (size_t ky = 0; ky < SK_ARRAY_COUNT(gModes); ky++) { 11586f97eda524568f2d264186844450db5e56dac36Matthew Xie SkPaint p; 11686f97eda524568f2d264186844450db5e56dac36Matthew Xie SkString str; 117a5764686f719d8d779d8a5ff8cc64010b7893e36Marie Janssen p.setAntiAlias(true); 118f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski p.setDither(true); 1196bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson p.setLooper(&fLooper); 120b95c4ef4ac9e86953050a7ae6b3b4260df935713Sharvil Nanavati str.printf("[%s,%s]", gModeNames[kx], gModeNames[ky]); 1219b0fbce37260e69cb116be1cdcbceb1f43bf9346Zach Johnson 1229b0fbce37260e69cb116be1cdcbceb1f43bf9346Zach Johnson p.setTextAlign(SkPaint::kCenter_Align); 1236bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson textCanvas->drawText(str.c_str(), str.size(), x + r.width()/2, y, p); 124a5764686f719d8d779d8a5ff8cc64010b7893e36Marie Janssen 125bf5c3cb18f16198bc2657cd7a50874d17cd52cc8Ajay Panicker x += r.width() * 4 / 3; 1266bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 127bf5c3cb18f16198bc2657cd7a50874d17cd52cc8Ajay Panicker } 12872a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker } 12972a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker 13072a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker y += SkIntToScalar(16); 131190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker 132b95c4ef4ac9e86953050a7ae6b3b4260df935713Sharvil Nanavati for (size_t i = 0; i < SK_ARRAY_COUNT(gColorTypes); i++) { 133b4a42e7b9c277cfd71a575cbdb104013855b80cdBluetooth Build Test for (size_t j = 0; j < SK_ARRAY_COUNT(gFilters); j++) { 1346bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson x = SkIntToScalar(10); 13572a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker for (size_t kx = 0; kx < SK_ARRAY_COUNT(gModes); kx++) { 136190cf46ff6937bceff146aec026cf9f53c40e84dAjay Panicker for (size_t ky = 0; ky < SK_ARRAY_COUNT(gModes); ky++) { 13772a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker SkPaint paint; 1389a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh setup(&paint, fTexture[i], gFilters[j], gModes[kx], gModes[ky]); 1399a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh paint.setDither(true); 1406bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 1416bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson canvas->save(); 1426bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson canvas->translate(x, y); 1439a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh canvas->drawRect(r, paint); 1449a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh canvas->restore(); 14572a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker 1469a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh x += r.width() * 4 / 3; 1479a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh } 1486bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson } 1496bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson if (textCanvas) { 1506bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson SkPaint p; 1519a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh SkString str; 1529a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh p.setAntiAlias(true); 15372a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker p.setLooper(&fLooper); 1549a58e68a98fbe1680535a7e7641de91e89273ad8Alain Vongsouvanh str.printf("%s, %s", gConfigNames[i], gFilterNames[j]); 155713993d1784ab7c23aee1fa3cf1ab8676cc0aa69Jakub Pawlowski textCanvas->drawText(str.c_str(), str.size(), x, y + r.height() * 2 / 3, p); 15672a183d00c7534c80a4deb9fb41d38fd9e9455f6Ajay Panicker } 157f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski 158713993d1784ab7c23aee1fa3cf1ab8676cc0aa69Jakub Pawlowski y += r.height() * 4 / 3; 159f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski } 160d77f1999ecece56c1cbb333f4ddc26f0b5bac2c5Marie Janssen } 1617b266be449e4f915c419199c2312eb31f70e63bcAjay Panicker 162f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski fTextPicture.reset(recorder.endRecording()); 1637b266be449e4f915c419199c2312eb31f70e63bcAjay Panicker 164646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker canvas->drawPicture(*fTextPicture); 165f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski } 166f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski 167646134e0a04459f649cb50aa9f3272054630c345Ajay Panickerprivate: 168f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowski typedef SampleView INHERITED; 169646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker}; 170646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker 171646134e0a04459f649cb50aa9f3272054630c345Ajay Panicker////////////////////////////////////////////////////////////////////////////// 1726bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson 1736bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watsonstatic SkView* MyFactory() { return new TilingView; } 174f3fb316634973d26cc4b4f55656b86e2a15bd69cJakub Pawlowskistatic SkViewRegister reg(MyFactory); 1756bd442f543972b072ef2cbbcf2f7c91202de1045Myles Watson