complexclip4.cpp 3.6 KB

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