1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
7ab13167410206c5371508101949213d46e8dded9commit-bot@chromium.org
8869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com#include "SampleCode.h"
9b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMask.h"
10b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com#include "SkBlurMaskFilter.h"
11869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com#include "SkCanvas.h"
1276f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com#include "SkSurface.h"
13869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
14ab13167410206c5371508101949213d46e8dded9commit-bot@chromium.orgstatic SkBitmap make_bitmap() {
15869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    SkBitmap bm;
16a8c183125f2861067daf432cada06d431a795cd0commit-bot@chromium.org    bm.allocN32Pixels(5, 5);
17869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
18869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    for (int y = 0; y < bm.height(); y++) {
19869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        uint32_t* p = bm.getAddr32(0, y);
20869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        for (int x = 0; x < bm.width(); x++) {
21869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com            p[x] = ((x + y) & 1) ? SK_ColorWHITE : SK_ColorBLACK;
22869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        }
23869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    }
24869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    return bm;
25869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com}
26869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
27869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comclass TextureDomainView : public SampleView {
28869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    SkBitmap    fBM;
29869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
30869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.compublic:
31869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    TextureDomainView(){
32869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        fBM = make_bitmap();
33869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    }
34869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
35869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comprotected:
36869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    // overrides from SkEventSink
37869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    virtual bool onQuery(SkEvent* evt) {
38869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        if (SampleCode::TitleQ(*evt)) {
391d32978f7e927cb39da480c3bdce18363967313ajunov@google.com            SampleCode::TitleR(evt, "Texture Domain");
40869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com            return true;
41869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        }
42869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        return this->INHERITED::onQuery(evt);
43869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    }
44869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
45869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    virtual void onDrawContent(SkCanvas* canvas) {
4676f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com        SkRect srcRect;
47869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        SkRect dstRect;
48869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com        SkPaint paint;
4993a1215fe0ab007ce941c721f1fd3e9dcb5d4754reed        paint.setFilterQuality(kLow_SkFilterQuality);
5076b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com
5176b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        // Test that bitmap draws from malloc-backed bitmaps respect
5276b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        // the constrained texture domain.
5376b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        srcRect.setXYWH(1, 1, 3, 3);
5476f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com        dstRect.setXYWH(5, 5, 305, 305);
55e47829b6b1eeb6b0c97ccb3df3016d197046824creed        canvas->drawBitmapRect(fBM, srcRect, dstRect, &paint, SkCanvas::kStrict_SrcRectConstraint);
5676b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com
5776b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        // Test that bitmap draws across separate devices also respect
5876b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        // the constrainted texture domain.
5976b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        // Note:  GPU-backed bitmaps follow a different rendering path
6076b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        // when copying from one GPU device to another.
6176f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com        SkImageInfo info = SkImageInfo::MakeN32(5, 5, kOpaque_SkAlphaType);
62e8f3062a36d3682f4019309a32b5b84dc9eddf8creed        auto surface(canvas->makeSurface(info));
6376b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com
6476b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        srcRect.setXYWH(1, 1, 3, 3);
6576f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com        dstRect.setXYWH(1, 1, 3, 3);
66e47829b6b1eeb6b0c97ccb3df3016d197046824creed        surface->getCanvas()->drawBitmapRect(fBM, srcRect, dstRect, &paint,
6784984efeb64787b88c5f8bd6929cfe2d58a3ba06reed                                             SkCanvas::kStrict_SrcRectConstraint);
6876b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com
699ce9d6772df650ceb0511f275e1a83dffa78ff72reed        sk_sp<SkImage> image(surface->makeImageSnapshot());
7076b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com
7176b82742421dc29c69badfb21974f836f8e47b3btwiz@google.com        srcRect.setXYWH(1, 1, 3, 3);
7276f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com        dstRect.setXYWH(405, 5, 305, 305);
73e47829b6b1eeb6b0c97ccb3df3016d197046824creed        canvas->drawImageRect(image, srcRect, dstRect, &paint);
74d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com
75d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        // Test that bitmap blurring using a subrect
76ae933ce0ea5fd9d21cb6ef2cee7e729d32690aacrmistry@google.com        // renders correctly
77d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        srcRect.setXYWH(1, 1, 3, 3);
7876f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com        dstRect.setXYWH(5, 405, 305, 305);
79efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed        paint.setMaskFilter(SkBlurMaskFilter::Make(
80e396455d2d60ddf8e625b5037254f3c09fbcdcf5commit-bot@chromium.org            kNormal_SkBlurStyle,
81b7061176c7f414616fe2e79e832b3e0abe326af6robertphillips@google.com            SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
821d32978f7e927cb39da480c3bdce18363967313ajunov@google.com            SkBlurMaskFilter::kHighQuality_BlurFlag |
83efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed            SkBlurMaskFilter::kIgnoreTransform_BlurFlag));
84e47829b6b1eeb6b0c97ccb3df3016d197046824creed        canvas->drawImageRect(image, srcRect, dstRect, &paint);
85d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com
8696fcdcc219d2a0d3579719b84b28bede76efba64halcanary        // Blur and a rotation + nullptr src rect
87d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        // This should not trigger the texture domain code
88d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        // but it will test a code path in SkGpuDevice::drawBitmap
89d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        // that handles blurs with rects transformed to non-
9096fcdcc219d2a0d3579719b84b28bede76efba64halcanary        // orthogonal rects. It also tests the nullptr src rect handling
91efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed        paint.setMaskFilter(SkBlurMaskFilter::Make(kNormal_SkBlurStyle,
92efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed                                                   SkBlurMask::ConvertRadiusToSigma(5),
93efdfd51b68a300d5c6e28743fe0344ca05d1cec9reed                                                   SkBlurMaskFilter::kHighQuality_BlurFlag));
941d32978f7e927cb39da480c3bdce18363967313ajunov@google.com
9576f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com        dstRect.setXYWH(-150, -150, 300, 300);
96d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        canvas->translate(550, 550);
97d935cfbd79f7b78e1957c09a279eed1d7acd8b70junov@google.com        canvas->rotate(45);
9884984efeb64787b88c5f8bd6929cfe2d58a3ba06reed        canvas->drawBitmapRect(fBM, dstRect, &paint);
99869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    }
100869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comprivate:
101869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com    typedef SkView INHERITED;
102869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com};
103869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
104869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com//////////////////////////////////////////////////////////////////////////////
105869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.com
106869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comstatic SkView* MyFactory() { return new TextureDomainView; }
107869d6d9f4d5057c736c28749740550f367fcf9b7junov@google.comstatic SkViewRegister reg(MyFactory);
108