GrSWMaskHelper.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * Copyright 2012 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 "src/gpu/GrSWMaskHelper.h"
  8. #include "include/private/GrRecordingContext.h"
  9. #include "src/gpu/GrCaps.h"
  10. #include "src/gpu/GrProxyProvider.h"
  11. #include "src/gpu/GrRecordingContextPriv.h"
  12. #include "src/gpu/GrSurfaceContext.h"
  13. #include "src/gpu/GrTextureProxy.h"
  14. #include "src/gpu/geometry/GrShape.h"
  15. /*
  16. * Convert a boolean operation into a transfer mode code
  17. */
  18. static SkBlendMode op_to_mode(SkRegion::Op op) {
  19. static const SkBlendMode modeMap[] = {
  20. SkBlendMode::kDstOut, // kDifference_Op
  21. SkBlendMode::kModulate, // kIntersect_Op
  22. SkBlendMode::kSrcOver, // kUnion_Op
  23. SkBlendMode::kXor, // kXOR_Op
  24. SkBlendMode::kClear, // kReverseDifference_Op
  25. SkBlendMode::kSrc, // kReplace_Op
  26. };
  27. return modeMap[op];
  28. }
  29. /**
  30. * Draw a single rect element of the clip stack into the accumulation bitmap
  31. */
  32. void GrSWMaskHelper::drawRect(const SkRect& rect, const SkMatrix& matrix, SkRegion::Op op, GrAA aa,
  33. uint8_t alpha) {
  34. SkPaint paint;
  35. paint.setBlendMode(op_to_mode(op));
  36. paint.setAntiAlias(GrAA::kYes == aa);
  37. paint.setColor(SkColorSetARGB(alpha, alpha, alpha, alpha));
  38. SkMatrix translatedMatrix = matrix;
  39. translatedMatrix.postTranslate(fTranslate.fX, fTranslate.fY);
  40. fDraw.fMatrix = &translatedMatrix;
  41. fDraw.drawRect(rect, paint);
  42. }
  43. /**
  44. * Draw a single path element of the clip stack into the accumulation bitmap
  45. */
  46. void GrSWMaskHelper::drawShape(const GrShape& shape, const SkMatrix& matrix, SkRegion::Op op,
  47. GrAA aa, uint8_t alpha) {
  48. SkPaint paint;
  49. paint.setPathEffect(shape.style().refPathEffect());
  50. shape.style().strokeRec().applyToPaint(&paint);
  51. paint.setAntiAlias(GrAA::kYes == aa);
  52. SkMatrix translatedMatrix = matrix;
  53. translatedMatrix.postTranslate(fTranslate.fX, fTranslate.fY);
  54. fDraw.fMatrix = &translatedMatrix;
  55. SkPath path;
  56. shape.asPath(&path);
  57. if (SkRegion::kReplace_Op == op && 0xFF == alpha) {
  58. SkASSERT(0xFF == paint.getAlpha());
  59. fDraw.drawPathCoverage(path, paint);
  60. } else {
  61. paint.setBlendMode(op_to_mode(op));
  62. paint.setColor(SkColorSetARGB(alpha, alpha, alpha, alpha));
  63. fDraw.drawPath(path, paint);
  64. }
  65. };
  66. bool GrSWMaskHelper::init(const SkIRect& resultBounds) {
  67. // We will need to translate draws so the bound's UL corner is at the origin
  68. fTranslate = {-SkIntToScalar(resultBounds.fLeft), -SkIntToScalar(resultBounds.fTop)};
  69. SkIRect bounds = SkIRect::MakeWH(resultBounds.width(), resultBounds.height());
  70. const SkImageInfo bmImageInfo = SkImageInfo::MakeA8(bounds.width(), bounds.height());
  71. if (!fPixels->tryAlloc(bmImageInfo)) {
  72. return false;
  73. }
  74. fPixels->erase(0);
  75. fDraw.fDst = *fPixels;
  76. fRasterClip.setRect(bounds);
  77. fDraw.fRC = &fRasterClip;
  78. return true;
  79. }
  80. sk_sp<GrTextureProxy> GrSWMaskHelper::toTextureProxy(GrRecordingContext* context,
  81. SkBackingFit fit) {
  82. SkImageInfo ii = SkImageInfo::MakeA8(fPixels->width(), fPixels->height());
  83. size_t rowBytes = fPixels->rowBytes();
  84. sk_sp<SkData> data = fPixels->detachPixelsAsData();
  85. if (!data) {
  86. return nullptr;
  87. }
  88. sk_sp<SkImage> img = SkImage::MakeRasterData(ii, std::move(data), rowBytes);
  89. if (!img) {
  90. return nullptr;
  91. }
  92. return context->priv().proxyProvider()->createTextureProxy(std::move(img), GrRenderable::kNo, 1,
  93. SkBudgeted::kYes, fit);
  94. }