Index: src/gpu/batches/GrNonAAFillRectBatch.cpp |
diff --git a/src/gpu/batches/GrNonAAFillRectBatch.cpp b/src/gpu/batches/GrNonAAFillRectBatch.cpp |
index 54edb7d7c925ed7eb58591e634862b5f3a36e796..9c79666dd4aa46e9848fcde59c9508c091ea268f 100644 |
--- a/src/gpu/batches/GrNonAAFillRectBatch.cpp |
+++ b/src/gpu/batches/GrNonAAFillRectBatch.cpp |
@@ -34,6 +34,13 @@ public: |
static void SetBounds(const Geometry& geo, SkRect* outBounds) { |
geo.fViewMatrix.mapRect(outBounds, geo.fRect); |
} |
+ |
+ template <typename Geometry> |
+ static void UpdateBoundsAfterAppend(const Geometry& geo, SkRect* outBounds) { |
+ SkRect bounds = geo.fRect; |
+ geo.fViewMatrix.mapRect(&bounds); |
+ outBounds->join(bounds); |
+ } |
}; |
/** We always use per-vertex colors so that rects can be batched across color changes. Sometimes |
@@ -187,16 +194,11 @@ public: |
typedef GrTInstanceBatch<NonAAFillRectBatchImp> NonAAFillRectBatchSimple; |
typedef GrTInstanceBatch<NonAAFillRectBatchPerspectiveImp> NonAAFillRectBatchPerspective; |
-namespace GrNonAAFillRectBatch { |
- |
-GrDrawBatch* Create(GrColor color, |
- const SkMatrix& viewMatrix, |
- const SkRect& rect, |
- const SkRect* localRect, |
- const SkMatrix* localMatrix) { |
+inline static void append_to_batch(NonAAFillRectBatchSimple* batch, GrColor color, |
+ const SkMatrix& viewMatrix, const SkRect& rect, |
+ const SkRect* localRect, const SkMatrix* localMatrix) { |
SkASSERT(!viewMatrix.hasPerspective() && (!localMatrix || !localMatrix->hasPerspective())); |
- NonAAFillRectBatchSimple* batch = NonAAFillRectBatchSimple::Create(); |
- NonAAFillRectBatchSimple::Geometry& geo = *batch->geometry(); |
+ NonAAFillRectBatchSimple::Geometry& geo = batch->geoData()->push_back(); |
geo.fColor = color; |
geo.fViewMatrix = viewMatrix; |
@@ -211,19 +213,13 @@ GrDrawBatch* Create(GrColor color, |
} else { |
geo.fLocalQuad.set(rect); |
} |
- |
- batch->init(); |
- return batch; |
} |
-GrDrawBatch* CreateWithPerspective(GrColor color, |
- const SkMatrix& viewMatrix, |
- const SkRect& rect, |
- const SkRect* localRect, |
- const SkMatrix* localMatrix) { |
+inline static void append_to_batch(NonAAFillRectBatchPerspective* batch, GrColor color, |
+ const SkMatrix& viewMatrix, const SkRect& rect, |
+ const SkRect* localRect, const SkMatrix* localMatrix) { |
SkASSERT(viewMatrix.hasPerspective() || (localMatrix && localMatrix->hasPerspective())); |
- NonAAFillRectBatchPerspective* batch = NonAAFillRectBatchPerspective::Create(); |
- NonAAFillRectBatchPerspective::Geometry& geo = *batch->geometry(); |
+ NonAAFillRectBatchPerspective::Geometry& geo = batch->geoData()->push_back(); |
geo.fColor = color; |
geo.fViewMatrix = viewMatrix; |
@@ -237,10 +233,67 @@ GrDrawBatch* CreateWithPerspective(GrColor color, |
geo.fLocalRect = *localRect; |
} |
+} |
+ |
+namespace GrNonAAFillRectBatch { |
+ |
+GrDrawBatch* Create(GrColor color, |
+ const SkMatrix& viewMatrix, |
+ const SkRect& rect, |
+ const SkRect* localRect, |
+ const SkMatrix* localMatrix) { |
+ NonAAFillRectBatchSimple* batch = NonAAFillRectBatchSimple::Create(); |
+ append_to_batch(batch, color, viewMatrix, rect, localRect, localMatrix); |
+ batch->init(); |
+ return batch; |
+} |
+ |
+GrDrawBatch* CreateWithPerspective(GrColor color, |
+ const SkMatrix& viewMatrix, |
+ const SkRect& rect, |
+ const SkRect* localRect, |
+ const SkMatrix* localMatrix) { |
+ NonAAFillRectBatchPerspective* batch = NonAAFillRectBatchPerspective::Create(); |
+ append_to_batch(batch, color, viewMatrix, rect, localRect, localMatrix); |
batch->init(); |
return batch; |
} |
+bool Append(GrBatch* origBatch, |
+ GrColor color, |
+ const SkMatrix& viewMatrix, |
+ const SkRect& rect, |
+ const SkRect* localRect, |
+ const SkMatrix* localMatrix) { |
+ bool usePerspective = viewMatrix.hasPerspective() || |
+ (localMatrix && localMatrix->hasPerspective()); |
+ |
+ if (usePerspective && origBatch->classID() != NonAAFillRectBatchPerspective::ClassID()) { |
+ return false; |
+ } |
+ |
+ if (!usePerspective) { |
+ NonAAFillRectBatchSimple* batch = origBatch->cast<NonAAFillRectBatchSimple>(); |
+ append_to_batch(batch, color, viewMatrix, rect, localRect, localMatrix); |
+ batch->updateBoundsAfterAppend(); |
+ } else { |
+ NonAAFillRectBatchPerspective* batch = origBatch->cast<NonAAFillRectBatchPerspective>(); |
+ const NonAAFillRectBatchPerspective::Geometry& geo = batch->geoData()->back(); |
+ |
+ if (!geo.fViewMatrix.cheapEqualTo(viewMatrix) || |
+ geo.fHasLocalRect != SkToBool(localRect) || |
+ geo.fHasLocalMatrix != SkToBool(localMatrix) || |
+ (geo.fHasLocalMatrix && !geo.fLocalMatrix.cheapEqualTo(*localMatrix))) { |
+ return false; |
+ } |
+ |
+ append_to_batch(batch, color, viewMatrix, rect, localRect, localMatrix); |
+ batch->updateBoundsAfterAppend(); |
+ } |
+ |
+ return true; |
+} |
+ |
}; |
/////////////////////////////////////////////////////////////////////////////////////////////////// |