SampleTextureDomain.cpp revision b7061176c7f414616fe2e79e832b3e0abe326af6
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 */
8869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com#include "SampleCode.h"
9b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h"
10b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMaskFilter.h"
11869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com#include "SkCanvas.h"
1276b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com#include "SkDevice.h"
13869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
14869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comnamespace {
15869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comSkBitmap make_bitmap() {
16869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    SkBitmap bm;
1776b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com    bm.setConfig(SkBitmap::kARGB_8888_Config , 5, 5);
18869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    bm.allocPixels();
19869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
20869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    for (int y = 0; y < bm.height(); y++) {
21869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        uint32_t* p = bm.getAddr32(0, y);
22869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        for (int x = 0; x < bm.width(); x++) {
23869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com            p[x] = ((x + y) & 1) ? SK_ColorWHITE : SK_ColorBLACK;
24869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        }
25869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    }
26869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    bm.unlockPixels();
27869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    return bm;
28869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com}
29869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com} // unnamed namespace
30869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
31869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comclass TextureDomainView : public SampleView {
32869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    SkBitmap    fBM;
33869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
34869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.compublic:
35869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    TextureDomainView(){
36869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        fBM = make_bitmap();
37869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    }
38869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
39869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comprotected:
40869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    // overrides from SkEventSink
41869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    virtual bool onQuery(SkEvent* evt) {
42869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        if (SampleCode::TitleQ(*evt)) {
431d32978f7e927cb39da480c3bdce18363967313ajunov@google.com            SampleCode::TitleR(evt, "Texture Domain");
44869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com            return true;
45869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        }
46869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        return this->INHERITED::onQuery(evt);
47869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    }
48869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
49869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    virtual void onDrawContent(SkCanvas* canvas) {
50869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        SkIRect srcRect;
51869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        SkRect dstRect;
52869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        SkPaint paint;
53869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        paint.setFilterBitmap(true);
5476b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com
5576b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        // Test that bitmap draws from malloc-backed bitmaps respect
5676b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        // the constrained texture domain.
5776b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        srcRect.setXYWH(1, 1, 3, 3);
5876b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        dstRect.setXYWH(5.0f, 5.0f, 305.0f, 305.0f);
59869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        canvas->drawBitmapRect(fBM, &srcRect, dstRect, &paint);
6076b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com
6176b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        // Test that bitmap draws across separate devices also respect
6276b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        // the constrainted texture domain.
6376b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        // Note:  GPU-backed bitmaps follow a different rendering path
6476b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        // when copying from one GPU device to another.
651f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com        SkAutoTUnref<SkBaseDevice> secondDevice(canvas->createCompatibleDevice(
66af951c9bc4cbb6e60b430194fe5127ebe99c53fbreed@google.com                SkBitmap::kARGB_8888_Config, 5, 5, true));
6776b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        SkCanvas secondCanvas(secondDevice.get());
6876b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com
6976b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        srcRect.setXYWH(1, 1, 3, 3);
7076b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        dstRect.setXYWH(1.0f, 1.0f, 3.0f, 3.0f);
7176b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        secondCanvas.drawBitmapRect(fBM, &srcRect, dstRect, &paint);
7276b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com
7376b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        SkBitmap deviceBitmap = secondDevice->accessBitmap(false);
7476b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com
7576b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        srcRect.setXYWH(1, 1, 3, 3);
7676b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        dstRect.setXYWH(405.0f, 5.0f, 305.0f, 305.0f);
7776b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint);
78d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com
79d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        // Test that bitmap blurring using a subrect
80ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com        // renders correctly
81d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        srcRect.setXYWH(1, 1, 3, 3);
82d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        dstRect.setXYWH(5.0f, 405.0f, 305.0f, 305.0f);
83d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        SkMaskFilter* mf = SkBlurMaskFilter::Create(
84d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com            SkBlurMaskFilter::kNormal_BlurStyle,
85b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com            SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
861d32978f7e927cb39da480c3bdce18363967313ajunov@google.com            SkBlurMaskFilter::kHighQuality_BlurFlag |
871d32978f7e927cb39da480c3bdce18363967313ajunov@google.com            SkBlurMaskFilter::kIgnoreTransform_BlurFlag);
88d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        paint.setMaskFilter(mf)->unref();
89d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint);
90d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com
919ef2d8382f5238cc54d211e3cc228def7a93b133epoger@google.com        // Blur and a rotation + NULL src rect
92d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        // This should not trigger the texture domain code
93d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        // but it will test a code path in SkGpuDevice::drawBitmap
94d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        // that handles blurs with rects transformed to non-
95d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        // orthogonal rects. It also tests the NULL src rect handling
96ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com    mf = SkBlurMaskFilter::Create(
971d32978f7e927cb39da480c3bdce18363967313ajunov@google.com            SkBlurMaskFilter::kNormal_BlurStyle,
98b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com            SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
991d32978f7e927cb39da480c3bdce18363967313ajunov@google.com            SkBlurMaskFilter::kHighQuality_BlurFlag);
1001d32978f7e927cb39da480c3bdce18363967313ajunov@google.com        paint.setMaskFilter(mf)->unref();
1011d32978f7e927cb39da480c3bdce18363967313ajunov@google.com
102d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        dstRect.setXYWH(-150.0f, -150.0f, 300.0f, 300.0f);
103d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        canvas->translate(550, 550);
104d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        canvas->rotate(45);
105d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        canvas->drawBitmapRect(fBM, NULL, dstRect, &paint);
106869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    }
107869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comprivate:
108869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    typedef SkView INHERITED;
109869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com};
110869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
111869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com//////////////////////////////////////////////////////////////////////////////
112869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
113869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comstatic SkView* MyFactory() { return new TextureDomainView; }
114869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comstatic SkViewRegister reg(MyFactory);
115