11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc.
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
80b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SampleCode.h"
90b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkCanvas.h"
100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger#include "SkDevice.h"
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkBlurMaskFilter.h"
120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergernamespace {
140b15698a8c76bb8abc1b555c1d91892669b4118fDerek SollenbergerSkBitmap make_bitmap() {
150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkBitmap bm;
160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bm.setConfig(SkBitmap::kARGB_8888_Config , 5, 5);
170b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bm.allocPixels();
180b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
190b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    for (int y = 0; y < bm.height(); y++) {
200b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        uint32_t* p = bm.getAddr32(0, y);
210b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        for (int x = 0; x < bm.width(); x++) {
220b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            p[x] = ((x + y) & 1) ? SK_ColorWHITE : SK_ColorBLACK;
230b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
240b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
250b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    bm.unlockPixels();
260b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    return bm;
270b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger}
280b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger} // unnamed namespace
290b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
300b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerclass TextureDomainView : public SampleView {
310b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    SkBitmap    fBM;
320b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
330b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerpublic:
340b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    TextureDomainView(){
350b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        fBM = make_bitmap();
360b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
370b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
380b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprotected:
390b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    // overrides from SkEventSink
400b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual bool onQuery(SkEvent* evt) {
410b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        if (SampleCode::TitleQ(*evt)) {
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SampleCode::TitleR(evt, "Texture Domain");
430b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger            return true;
440b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        }
450b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        return this->INHERITED::onQuery(evt);
460b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
470b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
480b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    virtual void onDrawContent(SkCanvas* canvas) {
490b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkIRect srcRect;
500b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkRect dstRect;
510b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkPaint paint;
520b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        paint.setFilterBitmap(true);
530b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
540b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // Test that bitmap draws from malloc-backed bitmaps respect
550b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // the constrained texture domain.
560b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        srcRect.setXYWH(1, 1, 3, 3);
570b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        dstRect.setXYWH(5.0f, 5.0f, 305.0f, 305.0f);
580b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->drawBitmapRect(fBM, &srcRect, dstRect, &paint);
590b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
600b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // Test that bitmap draws across separate devices also respect
610b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // the constrainted texture domain.
620b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // Note:  GPU-backed bitmaps follow a different rendering path
630b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        // when copying from one GPU device to another.
640b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkRefPtr<SkDevice> primaryDevice(canvas->getDevice());
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkRefPtr<SkDevice> secondDevice(canvas->createCompatibleDevice(
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger                SkBitmap::kARGB_8888_Config, 5, 5, true));
670b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        secondDevice->unref();
680b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkCanvas secondCanvas(secondDevice.get());
690b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
700b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        srcRect.setXYWH(1, 1, 3, 3);
710b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        dstRect.setXYWH(1.0f, 1.0f, 3.0f, 3.0f);
720b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        secondCanvas.drawBitmapRect(fBM, &srcRect, dstRect, &paint);
730b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
740b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        SkBitmap deviceBitmap = secondDevice->accessBitmap(false);
750b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
760b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        srcRect.setXYWH(1, 1, 3, 3);
770b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        dstRect.setXYWH(405.0f, 5.0f, 305.0f, 305.0f);
780b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger        canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint);
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // Test that bitmap blurring using a subrect
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // renders correctly
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        srcRect.setXYWH(1, 1, 3, 3);
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        dstRect.setXYWH(5.0f, 405.0f, 305.0f, 305.0f);
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkMaskFilter* mf = SkBlurMaskFilter::Create(
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            5,
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkBlurMaskFilter::kNormal_BlurStyle,
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkBlurMaskFilter::kHighQuality_BlurFlag |
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkBlurMaskFilter::kIgnoreTransform_BlurFlag);
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setMaskFilter(mf)->unref();
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint);
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // Blur and a rotation + NULL src rect
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // This should not trigger the texture domain code
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // but it will test a code path in SkGpuDevice::drawBitmap
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // that handles blurs with rects transformed to non-
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        // orthogonal rects. It also tests the NULL src rect handling
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger	mf = SkBlurMaskFilter::Create(
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            5,
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkBlurMaskFilter::kNormal_BlurStyle,
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger            SkBlurMaskFilter::kHighQuality_BlurFlag);
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        paint.setMaskFilter(mf)->unref();
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        dstRect.setXYWH(-150.0f, -150.0f, 300.0f, 300.0f);
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->translate(550, 550);
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->rotate(45);
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        canvas->drawBitmapRect(fBM, NULL, dstRect, &paint);
1070b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    }
1080b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerprivate:
1090b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger    typedef SkView INHERITED;
1100b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger};
1110b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1120b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger//////////////////////////////////////////////////////////////////////////////
1130b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
1140b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkView* MyFactory() { return new TextureDomainView; }
1150b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenbergerstatic SkViewRegister reg(MyFactory);
1160b15698a8c76bb8abc1b555c1d91892669b4118fDerek Sollenberger
117