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