Wide color support in GrGregionOp
Bug: skia:
Change-Id: I80cee450fdc2065b451ed7f7614f8a6f7aadd41e
Reviewed-on: https://skia-review.googlesource.com/c/179992
Reviewed-by: Mike Klein <mtklein@google.com>
Commit-Queue: Brian Osman <brianosman@google.com>
diff --git a/src/gpu/ops/GrRegionOp.cpp b/src/gpu/ops/GrRegionOp.cpp
index 7f1ad81..356f3a7 100644
--- a/src/gpu/ops/GrRegionOp.cpp
+++ b/src/gpu/ops/GrRegionOp.cpp
@@ -20,11 +20,13 @@
static const int kIndicesPerInstance = 6;
static sk_sp<GrGeometryProcessor> make_gp(const GrShaderCaps* shaderCaps,
- const SkMatrix& viewMatrix) {
+ const SkMatrix& viewMatrix,
+ bool wideColor) {
using namespace GrDefaultGeoProcFactory;
- return GrDefaultGeoProcFactory::Make(shaderCaps, Color::kPremulGrColorAttribute_Type,
- Coverage::kSolid_Type, LocalCoords::kUsePosition_Type,
- viewMatrix);
+ Color::Type colorType =
+ wideColor ? Color::kPremulWideColorAttribute_Type : Color::kPremulGrColorAttribute_Type;
+ return GrDefaultGeoProcFactory::Make(shaderCaps, colorType, Coverage::kSolid_Type,
+ LocalCoords::kUsePosition_Type, viewMatrix);
}
namespace {
@@ -58,6 +60,7 @@
SkRect bounds = SkRect::Make(region.getBounds());
this->setTransformedBounds(bounds, viewMatrix, HasAABloat::kNo, IsZeroArea::kNo);
+ fWideColor = !SkPMColor4fFitsInBytes(color);
}
const char* name() const override { return "GrRegionOp"; }
@@ -90,7 +93,8 @@
private:
void onPrepareDraws(Target* target) override {
- sk_sp<GrGeometryProcessor> gp = make_gp(target->caps().shaderCaps(), fViewMatrix);
+ sk_sp<GrGeometryProcessor> gp = make_gp(target->caps().shaderCaps(), fViewMatrix,
+ fWideColor);
if (!gp) {
SkDebugf("Couldn't create GrGeometryProcessor\n");
return;
@@ -115,9 +119,7 @@
}
for (int i = 0; i < numRegions; i++) {
- // TODO4F: Preserve float colors
- GrColor color = fRegions[i].fColor.toBytes_RGBA();
-
+ GrVertexColor color(fRegions[i].fColor, fWideColor);
SkRegion::Iterator iter(fRegions[i].fRegion);
while (!iter.done()) {
SkRect rect = SkRect::Make(iter.rect());
@@ -140,6 +142,7 @@
}
fRegions.push_back_n(that->fRegions.count(), that->fRegions.begin());
+ fWideColor |= that->fWideColor;
return CombineResult::kMerged;
}
@@ -151,6 +154,7 @@
Helper fHelper;
SkMatrix fViewMatrix;
SkSTArray<1, RegionInfo, true> fRegions;
+ bool fWideColor;
typedef GrMeshDrawOp INHERITED;
};