1 /* 2 * Copyright 2016 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 "gm/gm.h" 9 #include "include/core/SkCanvas.h" 10 #include "include/core/SkColor.h" 11 #include "include/core/SkPaint.h" 12 #include "include/core/SkPath.h" 13 #include "include/core/SkRRect.h" 14 #include "include/core/SkRect.h" 15 #include "include/core/SkScalar.h" 16 #include "include/core/SkSize.h" 17 #include "include/core/SkString.h" 18 #include "src/core/SkClipOpPriv.h" 19 20 namespace skiagm { 21 22 //this test exercise SkCanvas::setDeviceClipRestriction behavior 23 class ComplexClip4GM : public GM { 24 public: ComplexClip4GM(bool aaclip)25 ComplexClip4GM(bool aaclip) 26 : fDoAAClip(aaclip) { 27 this->setBGColor(0xFFDEDFDE); 28 } 29 30 protected: 31 32 onShortName()33 SkString onShortName() { 34 SkString str; 35 str.printf("complexclip4_%s", 36 fDoAAClip ? "aa" : "bw"); 37 return str; 38 } 39 onISize()40 SkISize onISize() { return SkISize::Make(970, 780); } 41 onDraw(SkCanvas * canvas)42 virtual void onDraw(SkCanvas* canvas) { 43 SkPaint p; 44 p.setAntiAlias(fDoAAClip); 45 p.setColor(SK_ColorYELLOW); 46 47 canvas->save(); 48 // draw a yellow rect through a rect clip 49 canvas->save(); 50 canvas->androidFramework_setDeviceClipRestriction(SkIRect::MakeLTRB(100, 100, 300, 300)); 51 canvas->drawColor(SK_ColorGREEN); 52 canvas->clipRect(SkRect::MakeLTRB(100, 200, 400, 500), 53 kReplace_SkClipOp, fDoAAClip); 54 canvas->drawRect(SkRect::MakeLTRB(100, 200, 400, 500), p); 55 canvas->restore(); 56 57 // draw a yellow rect through a diamond clip 58 canvas->save(); 59 canvas->androidFramework_setDeviceClipRestriction(SkIRect::MakeLTRB(500, 100, 800, 300)); 60 canvas->drawColor(SK_ColorGREEN); 61 62 SkPath pathClip; 63 pathClip.moveTo(SkIntToScalar(650), SkIntToScalar(200)); 64 pathClip.lineTo(SkIntToScalar(900), SkIntToScalar(300)); 65 pathClip.lineTo(SkIntToScalar(650), SkIntToScalar(400)); 66 pathClip.lineTo(SkIntToScalar(650), SkIntToScalar(300)); 67 pathClip.close(); 68 canvas->clipPath(pathClip, kReplace_SkClipOp, fDoAAClip); 69 canvas->drawRect(SkRect::MakeLTRB(500, 200, 900, 500), p); 70 canvas->restore(); 71 72 // draw a yellow rect through a round rect clip 73 canvas->save(); 74 canvas->androidFramework_setDeviceClipRestriction(SkIRect::MakeLTRB(500, 500, 800, 700)); 75 canvas->drawColor(SK_ColorGREEN); 76 77 canvas->clipRRect(SkRRect::MakeOval(SkRect::MakeLTRB(500, 600, 900, 750)), 78 kReplace_SkClipOp, fDoAAClip); 79 canvas->drawRect(SkRect::MakeLTRB(500, 600, 900, 750), p); 80 canvas->restore(); 81 82 // fill the clip with yellow color showing that androidFramework_setDeviceClipRestriction 83 // intersects with the current clip 84 canvas->save(); 85 canvas->clipRect(SkRect::MakeLTRB(100, 400, 300, 750), 86 kIntersect_SkClipOp, fDoAAClip); 87 canvas->drawColor(SK_ColorGREEN); 88 canvas->androidFramework_setDeviceClipRestriction(SkIRect::MakeLTRB(150, 450, 250, 700)); 89 canvas->drawColor(SK_ColorYELLOW); 90 canvas->restore(); 91 92 canvas->restore(); 93 } 94 private: 95 96 bool fDoAAClip; 97 98 typedef GM INHERITED; 99 }; 100 101 ////////////////////////////////////////////////////////////////////////////// 102 103 DEF_GM(return new ComplexClip4GM(false);) 104 DEF_GM(return new ComplexClip4GM(true);) 105 } 106