SkScan.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. /*
  2. * Copyright 2006 The Android Open Source Project
  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 "src/core/SkBlitter.h"
  8. #include "src/core/SkRasterClip.h"
  9. #include "src/core/SkScan.h"
  10. std::atomic<bool> gSkUseAnalyticAA{true};
  11. std::atomic<bool> gSkForceAnalyticAA{false};
  12. static inline void blitrect(SkBlitter* blitter, const SkIRect& r) {
  13. blitter->blitRect(r.fLeft, r.fTop, r.width(), r.height());
  14. }
  15. void SkScan::FillIRect(const SkIRect& r, const SkRegion* clip,
  16. SkBlitter* blitter) {
  17. if (!r.isEmpty()) {
  18. if (clip) {
  19. if (clip->isRect()) {
  20. const SkIRect& clipBounds = clip->getBounds();
  21. if (clipBounds.contains(r)) {
  22. blitrect(blitter, r);
  23. } else {
  24. SkIRect rr = r;
  25. if (rr.intersect(clipBounds)) {
  26. blitrect(blitter, rr);
  27. }
  28. }
  29. } else {
  30. SkRegion::Cliperator cliper(*clip, r);
  31. const SkIRect& rr = cliper.rect();
  32. while (!cliper.done()) {
  33. blitrect(blitter, rr);
  34. cliper.next();
  35. }
  36. }
  37. } else {
  38. blitrect(blitter, r);
  39. }
  40. }
  41. }
  42. void SkScan::FillXRect(const SkXRect& xr, const SkRegion* clip,
  43. SkBlitter* blitter) {
  44. SkIRect r;
  45. XRect_round(xr, &r);
  46. SkScan::FillIRect(r, clip, blitter);
  47. }
  48. void SkScan::FillRect(const SkRect& r, const SkRegion* clip,
  49. SkBlitter* blitter) {
  50. SkIRect ir;
  51. r.round(&ir);
  52. SkScan::FillIRect(ir, clip, blitter);
  53. }
  54. ///////////////////////////////////////////////////////////////////////////////
  55. void SkScan::FillIRect(const SkIRect& r, const SkRasterClip& clip,
  56. SkBlitter* blitter) {
  57. if (clip.isEmpty() || r.isEmpty()) {
  58. return;
  59. }
  60. if (clip.isBW()) {
  61. FillIRect(r, &clip.bwRgn(), blitter);
  62. return;
  63. }
  64. SkAAClipBlitterWrapper wrapper(clip, blitter);
  65. FillIRect(r, &wrapper.getRgn(), wrapper.getBlitter());
  66. }
  67. void SkScan::FillXRect(const SkXRect& xr, const SkRasterClip& clip,
  68. SkBlitter* blitter) {
  69. if (clip.isEmpty() || xr.isEmpty()) {
  70. return;
  71. }
  72. if (clip.isBW()) {
  73. FillXRect(xr, &clip.bwRgn(), blitter);
  74. return;
  75. }
  76. SkAAClipBlitterWrapper wrapper(clip, blitter);
  77. FillXRect(xr, &wrapper.getRgn(), wrapper.getBlitter());
  78. }
  79. void SkScan::FillRect(const SkRect& r, const SkRasterClip& clip,
  80. SkBlitter* blitter) {
  81. if (clip.isEmpty() || r.isEmpty()) {
  82. return;
  83. }
  84. if (clip.isBW()) {
  85. FillRect(r, &clip.bwRgn(), blitter);
  86. return;
  87. }
  88. SkAAClipBlitterWrapper wrapper(clip, blitter);
  89. FillRect(r, &wrapper.getRgn(), wrapper.getBlitter());
  90. }