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