CanvasStateHelpers.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*
  2. * Copyright 2014 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 "include/core/SkTypes.h"
  8. #ifdef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG
  9. #include "include/core/SkCanvas.h"
  10. #include "include/core/SkClipOp.h"
  11. #include "include/core/SkColor.h"
  12. #include "include/core/SkPaint.h"
  13. #include "include/core/SkRect.h"
  14. #include "include/core/SkRegion.h"
  15. #include "include/core/SkScalar.h"
  16. #include "include/utils/SkCanvasStateUtils.h"
  17. #include "tests/CanvasStateHelpers.h"
  18. #include <memory>
  19. void complex_layers_draw(SkCanvas* canvas, float left, float top,
  20. float right, float bottom, int32_t spacer) {
  21. SkPaint bluePaint;
  22. bluePaint.setColor(SK_ColorBLUE);
  23. bluePaint.setStyle(SkPaint::kFill_Style);
  24. SkRect rect = SkRect::MakeLTRB(left, top, right, bottom);
  25. canvas->drawRect(rect, bluePaint);
  26. canvas->translate(0, rect.height() + spacer);
  27. canvas->drawRect(rect, bluePaint);
  28. }
  29. extern "C" bool complex_layers_draw_from_canvas_state(SkCanvasState* state,
  30. float left, float top, float right, float bottom, int32_t spacer) {
  31. std::unique_ptr<SkCanvas> canvas = SkCanvasStateUtils::MakeFromCanvasState(state);
  32. if (!canvas) {
  33. return false;
  34. }
  35. complex_layers_draw(canvas.get(), left, top, right, bottom, spacer);
  36. return true;
  37. }
  38. void complex_clips_draw(SkCanvas* canvas, int32_t left, int32_t top,
  39. int32_t right, int32_t bottom, int32_t clipOp, const SkRegion& localRegion) {
  40. canvas->save();
  41. SkRect clipRect = SkRect::MakeLTRB(SkIntToScalar(left), SkIntToScalar(top),
  42. SkIntToScalar(right), SkIntToScalar(bottom));
  43. canvas->clipRect(clipRect, (SkRegion::Op) clipOp);
  44. canvas->drawColor(SK_ColorBLUE);
  45. canvas->restore();
  46. canvas->clipRegion(localRegion, (SkClipOp) clipOp);
  47. canvas->drawColor(SK_ColorBLUE);
  48. }
  49. extern "C" bool complex_clips_draw_from_canvas_state(SkCanvasState* state,
  50. int32_t left, int32_t top, int32_t right, int32_t bottom, int32_t clipOp,
  51. int32_t regionRects, int32_t* rectCoords) {
  52. std::unique_ptr<SkCanvas> canvas = SkCanvasStateUtils::MakeFromCanvasState(state);
  53. if (!canvas) {
  54. return false;
  55. }
  56. SkRegion localRegion;
  57. for (int32_t i = 0; i < regionRects; ++i) {
  58. localRegion.op(rectCoords[0], rectCoords[1], rectCoords[2], rectCoords[3],
  59. SkRegion::kUnion_Op);
  60. rectCoords += 4;
  61. }
  62. complex_clips_draw(canvas.get(), left, top, right, bottom, clipOp, localRegion);
  63. return true;
  64. }
  65. #endif // SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG