Home | History | Annotate | Download | only in samplecode
      1 
      2 /*
      3  * Copyright 2011 Google Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 #include "SampleCode.h"
      9 #include "SkCanvas.h"
     10 #include "SkDevice.h"
     11 #include "SkBlurMaskFilter.h"
     12 
     13 namespace {
     14 SkBitmap make_bitmap() {
     15     SkBitmap bm;
     16     bm.setConfig(SkBitmap::kARGB_8888_Config , 5, 5);
     17     bm.allocPixels();
     18 
     19     for (int y = 0; y < bm.height(); y++) {
     20         uint32_t* p = bm.getAddr32(0, y);
     21         for (int x = 0; x < bm.width(); x++) {
     22             p[x] = ((x + y) & 1) ? SK_ColorWHITE : SK_ColorBLACK;
     23         }
     24     }
     25     bm.unlockPixels();
     26     return bm;
     27 }
     28 } // unnamed namespace
     29 
     30 class TextureDomainView : public SampleView {
     31     SkBitmap    fBM;
     32 
     33 public:
     34     TextureDomainView(){
     35         fBM = make_bitmap();
     36     }
     37 
     38 protected:
     39     // overrides from SkEventSink
     40     virtual bool onQuery(SkEvent* evt) {
     41         if (SampleCode::TitleQ(*evt)) {
     42             SampleCode::TitleR(evt, "Texture Domain");
     43             return true;
     44         }
     45         return this->INHERITED::onQuery(evt);
     46     }
     47 
     48     virtual void onDrawContent(SkCanvas* canvas) {
     49         SkIRect srcRect;
     50         SkRect dstRect;
     51         SkPaint paint;
     52         paint.setFilterBitmap(true);
     53 
     54         // Test that bitmap draws from malloc-backed bitmaps respect
     55         // the constrained texture domain.
     56         srcRect.setXYWH(1, 1, 3, 3);
     57         dstRect.setXYWH(5.0f, 5.0f, 305.0f, 305.0f);
     58         canvas->drawBitmapRect(fBM, &srcRect, dstRect, &paint);
     59 
     60         // Test that bitmap draws across separate devices also respect
     61         // the constrainted texture domain.
     62         // Note:  GPU-backed bitmaps follow a different rendering path
     63         // when copying from one GPU device to another.
     64         SkRefPtr<SkDevice> primaryDevice(canvas->getDevice());
     65         SkRefPtr<SkDevice> secondDevice(canvas->createCompatibleDevice(
     66                 SkBitmap::kARGB_8888_Config, 5, 5, true));
     67         secondDevice->unref();
     68         SkCanvas secondCanvas(secondDevice.get());
     69 
     70         srcRect.setXYWH(1, 1, 3, 3);
     71         dstRect.setXYWH(1.0f, 1.0f, 3.0f, 3.0f);
     72         secondCanvas.drawBitmapRect(fBM, &srcRect, dstRect, &paint);
     73 
     74         SkBitmap deviceBitmap = secondDevice->accessBitmap(false);
     75 
     76         srcRect.setXYWH(1, 1, 3, 3);
     77         dstRect.setXYWH(405.0f, 5.0f, 305.0f, 305.0f);
     78         canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint);
     79 
     80         // Test that bitmap blurring using a subrect
     81         // renders correctly
     82         srcRect.setXYWH(1, 1, 3, 3);
     83         dstRect.setXYWH(5.0f, 405.0f, 305.0f, 305.0f);
     84         SkMaskFilter* mf = SkBlurMaskFilter::Create(
     85             5,
     86             SkBlurMaskFilter::kNormal_BlurStyle,
     87             SkBlurMaskFilter::kHighQuality_BlurFlag |
     88             SkBlurMaskFilter::kIgnoreTransform_BlurFlag);
     89         paint.setMaskFilter(mf)->unref();
     90         canvas->drawBitmapRect(deviceBitmap, &srcRect, dstRect, &paint);
     91 
     92         // Blur and a rotation + NULL src rect
     93         // This should not trigger the texture domain code
     94         // but it will test a code path in SkGpuDevice::drawBitmap
     95         // that handles blurs with rects transformed to non-
     96         // orthogonal rects. It also tests the NULL src rect handling
     97 	mf = SkBlurMaskFilter::Create(
     98             5,
     99             SkBlurMaskFilter::kNormal_BlurStyle,
    100             SkBlurMaskFilter::kHighQuality_BlurFlag);
    101         paint.setMaskFilter(mf)->unref();
    102 
    103         dstRect.setXYWH(-150.0f, -150.0f, 300.0f, 300.0f);
    104         canvas->translate(550, 550);
    105         canvas->rotate(45);
    106         canvas->drawBitmapRect(fBM, NULL, dstRect, &paint);
    107     }
    108 private:
    109     typedef SkView INHERITED;
    110 };
    111 
    112 //////////////////////////////////////////////////////////////////////////////
    113 
    114 static SkView* MyFactory() { return new TextureDomainView; }
    115 static SkViewRegister reg(MyFactory);
    116 
    117