1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 8755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com#include "SampleCode.h" 9755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com#include "SkColorPriv.h" 103c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com#include "SkGradientShader.h" 11755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com#include "SkView.h" 12755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com#include "SkCanvas.h" 13755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com#include "SkUtils.h" 14755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com 153c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.comstatic void draw_rect(SkCanvas* canvas, const SkRect& r, const SkPaint& p) { 163c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com canvas->drawRect(r, p); 173c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com 183c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com SkPaint frame(p); 193c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com frame.setShader(NULL); 203c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com frame.setStyle(SkPaint::kStroke_Style); 213c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com canvas->drawRect(r, frame); 223c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com} 233c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com 243c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.comstatic void draw_gradient(SkCanvas* canvas) { 253c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com SkRect r = { 0, 0, SkIntToScalar(256), SkIntToScalar(32) }; 2664cc579efa7e416c7298ed159d76b074b283c0f9senorblanco@chromium.org SkPoint pts[] = { { r.fLeft, r.fTop }, { r.fRight, r.fTop } }; 273c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com SkColor colors[] = { 0xFF000000, 0xFFFF0000 }; 283c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, 2, 293c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com SkShader::kClamp_TileMode); 303c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com 313c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com SkPaint p; 323c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com p.setShader(s)->unref(); 333c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com draw_rect(canvas, r, p); 343c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com 353c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com canvas->translate(0, SkIntToScalar(40)); 363c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com p.setDither(true); 373c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com draw_rect(canvas, r, p); 383c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com} 393c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com 409acb8cdf20423e80d5687ba3c8e11545e3bc8020halcanary@google.comstatic bool test_pathregion() { 41c64599649bab68aedf07959f86fa506fc46fa3c2reed@android.com SkPath path; 42c64599649bab68aedf07959f86fa506fc46fa3c2reed@android.com SkRegion region; 43ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com path.moveTo(25071800.f, -141823808.f); 44c64599649bab68aedf07959f86fa506fc46fa3c2reed@android.com path.lineTo(25075500.f, -141824000.f); 45c64599649bab68aedf07959f86fa506fc46fa3c2reed@android.com path.lineTo(25075400.f, -141827712.f); 46c64599649bab68aedf07959f86fa506fc46fa3c2reed@android.com path.lineTo(25071810.f, -141827600.f); 47c64599649bab68aedf07959f86fa506fc46fa3c2reed@android.com path.close(); 48c64599649bab68aedf07959f86fa506fc46fa3c2reed@android.com 49c64599649bab68aedf07959f86fa506fc46fa3c2reed@android.com SkIRect bounds; 50c64599649bab68aedf07959f86fa506fc46fa3c2reed@android.com path.getBounds().round(&bounds); 51c64599649bab68aedf07959f86fa506fc46fa3c2reed@android.com SkRegion clip(bounds); 529acb8cdf20423e80d5687ba3c8e11545e3bc8020halcanary@google.com return region.setPath(path, clip); // <-- !! DOWN !! 53c64599649bab68aedf07959f86fa506fc46fa3c2reed@android.com} 54c64599649bab68aedf07959f86fa506fc46fa3c2reed@android.com 55755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.comstatic SkBitmap make_bitmap() { 560a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com SkPMColor c[256]; 57755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com for (int i = 0; i < 256; i++) { 58cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com c[i] = SkPackARGB32(0xFF, i, 0, 0); 59755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com } 600a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com SkColorTable* ctable = new SkColorTable(c, 256, kOpaque_SkAlphaType); 610a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com 620a6151d66cc32d91eca037c91e557158cf8a2be2reed@google.com SkBitmap bm; 63a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org bm.allocPixels(SkImageInfo::Make(256, 32, kIndex_8_SkColorType, 64a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org kPremul_SkAlphaType), 65a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org NULL, ctable); 66755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com ctable->unref(); 67755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com 68755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com bm.lockPixels(); 69755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com for (int y = 0; y < bm.height(); y++) { 70755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com uint8_t* p = bm.getAddr8(0, y); 71755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com for (int x = 0; x < 256; x++) { 72755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com p[x] = x; 73755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com } 74755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com } 75755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com bm.unlockPixels(); 76755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com return bm; 77755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com} 78755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com 790faac1e8579088a39f38d02ff675f14d7deb608dreed@google.comclass DitherBitmapView : public SampleView { 80755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com SkBitmap fBM8; 81755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com SkBitmap fBM32; 829acb8cdf20423e80d5687ba3c8e11545e3bc8020halcanary@google.com bool fResult; 83755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.compublic: 84ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com DitherBitmapView() { 859acb8cdf20423e80d5687ba3c8e11545e3bc8020halcanary@google.com fResult = test_pathregion(); 86755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com fBM8 = make_bitmap(); 8728fcae2ec77eb16a79e155f8d788b20457f1c951commit-bot@chromium.org fBM8.copyTo(&fBM32, kN32_SkColorType); 88ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 890faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com this->setBGColor(0xFFDDDDDD); 90755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com } 91ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 92755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.comprotected: 93755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com // overrides from SkEventSink 94755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com virtual bool onQuery(SkEvent* evt) { 95755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com if (SampleCode::TitleQ(*evt)) { 96755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com SampleCode::TitleR(evt, "DitherBitmap"); 97755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com return true; 98755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com } 99755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com return this->INHERITED::onQuery(evt); 100755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com } 101ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 102cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com static void setBitmapOpaque(SkBitmap* bm, bool isOpaque) { 103cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com SkAutoLockPixels alp(*bm); // needed for ctable 104383a697692cf46951fd451f6f4c3d03634a6a1cbreed@google.com bm->setAlphaType(isOpaque ? kOpaque_SkAlphaType : kPremul_SkAlphaType); 105cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com } 106ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 107755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com static void draw2(SkCanvas* canvas, const SkBitmap& bm) { 108755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com SkPaint paint; 109cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com SkBitmap bitmap(bm); 110cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com 111cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com setBitmapOpaque(&bitmap, false); 112cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com paint.setDither(false); 113cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com canvas->drawBitmap(bitmap, 0, 0, &paint); 114cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com paint.setDither(true); 115cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com canvas->drawBitmap(bitmap, 0, SkIntToScalar(bm.height() + 10), &paint); 116cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com 117cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com setBitmapOpaque(&bitmap, true); 118cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com SkScalar x = SkIntToScalar(bm.width() + 10); 119cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com paint.setDither(false); 120cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com canvas->drawBitmap(bitmap, x, 0, &paint); 121755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com paint.setDither(true); 122cafc9f9e80e30fa75ad8a952e7a290e72f211ce7reed@android.com canvas->drawBitmap(bitmap, x, SkIntToScalar(bm.height() + 10), &paint); 123755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com } 124ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 1250faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com virtual void onDrawContent(SkCanvas* canvas) { 126755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 127755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com 128755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com draw2(canvas, fBM8); 129755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com canvas->translate(0, SkIntToScalar(fBM8.height() *3)); 130755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com draw2(canvas, fBM32); 1313c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com 1323c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com canvas->translate(0, SkIntToScalar(fBM8.height() *3)); 1333c9b2a4a0e4f57db23640e85959ee78b86634628reed@android.com draw_gradient(canvas); 1349acb8cdf20423e80d5687ba3c8e11545e3bc8020halcanary@google.com 1359acb8cdf20423e80d5687ba3c8e11545e3bc8020halcanary@google.com char resultTrue[] = "SkRegion::setPath returned true"; 1369acb8cdf20423e80d5687ba3c8e11545e3bc8020halcanary@google.com char resultFalse[] = "SkRegion::setPath returned false"; 1379acb8cdf20423e80d5687ba3c8e11545e3bc8020halcanary@google.com SkPaint p; 1389acb8cdf20423e80d5687ba3c8e11545e3bc8020halcanary@google.com if (fResult) 1399acb8cdf20423e80d5687ba3c8e11545e3bc8020halcanary@google.com canvas->drawText(resultTrue, sizeof(resultTrue) - 1, 0, 50, p); 1409acb8cdf20423e80d5687ba3c8e11545e3bc8020halcanary@google.com else 1419acb8cdf20423e80d5687ba3c8e11545e3bc8020halcanary@google.com canvas->drawText(resultFalse, sizeof(resultFalse) - 1, 0, 50, p); 142755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com } 143ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com 144755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.comprivate: 1450faac1e8579088a39f38d02ff675f14d7deb608dreed@google.com typedef SampleView INHERITED; 146755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com}; 147755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com 148755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com////////////////////////////////////////////////////////////////////////////// 149755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.com 150755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.comstatic SkView* MyFactory() { return new DitherBitmapView; } 151755dd4773dad70d5fbe3f8bb091eaf268ea752c7reed@android.comstatic SkViewRegister reg(MyFactory); 152