| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2015 Google Inc. | 3 * Copyright 2015 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 | 8 |
| 9 #include "GrBatchTest.h" | 9 #include "GrBatchTest.h" |
| 10 #include "GrColor.h" | 10 #include "GrColor.h" |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 } else { | 207 } else { |
| 208 SkMatrix localMatrix; | 208 SkMatrix localMatrix; |
| 209 if (!viewMatrix.invert(&localMatrix)) { | 209 if (!viewMatrix.invert(&localMatrix)) { |
| 210 SkDebugf("Could not invert matrix\n"); | 210 SkDebugf("Could not invert matrix\n"); |
| 211 return; | 211 return; |
| 212 } | 212 } |
| 213 | 213 |
| 214 AutoCheckFlush acf(fDrawingManager); | 214 AutoCheckFlush acf(fDrawingManager); |
| 215 | 215 |
| 216 GrPipelineBuilder pipelineBuilder(*paint, fRenderTarget, clip); | 216 GrPipelineBuilder pipelineBuilder(*paint, fRenderTarget, clip); |
| 217 this->getDrawTarget()->drawNonAARect(pipelineBuilder, | 217 SkAutoTUnref<GrDrawBatch> batch( |
| 218 paint->getColor(), | 218 GrRectBatchFactory::CreateNonAAFill(paint->getColor(), SkMatrix:
:I(), r, nullptr, |
| 219 SkMatrix::I(), | 219 &localMatrix)); |
| 220 r, | 220 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
| 221 localMatrix); | |
| 222 } | 221 } |
| 223 } | 222 } |
| 224 | 223 |
| 225 static inline bool rect_contains_inclusive(const SkRect& rect, const SkPoint& po
int) { | 224 static inline bool rect_contains_inclusive(const SkRect& rect, const SkPoint& po
int) { |
| 226 return point.fX >= rect.fLeft && point.fX <= rect.fRight && | 225 return point.fX >= rect.fLeft && point.fX <= rect.fRight && |
| 227 point.fY >= rect.fTop && point.fY <= rect.fBottom; | 226 point.fY >= rect.fTop && point.fY <= rect.fBottom; |
| 228 } | 227 } |
| 229 | 228 |
| 230 static bool view_matrix_ok_for_aa_fill_rect(const SkMatrix& viewMatrix) { | 229 static bool view_matrix_ok_for_aa_fill_rect(const SkMatrix& viewMatrix) { |
| 231 return viewMatrix.preservesRightAngles(); | 230 return viewMatrix.preservesRightAngles(); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 this->getDrawTarget()->clear(nullptr, clearColor, true, fRen
derTarget); | 280 this->getDrawTarget()->clear(nullptr, clearColor, true, fRen
derTarget); |
| 282 return; | 281 return; |
| 283 } | 282 } |
| 284 } | 283 } |
| 285 } | 284 } |
| 286 } | 285 } |
| 287 | 286 |
| 288 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 287 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 289 GrColor color = paint.getColor(); | 288 GrColor color = paint.getColor(); |
| 290 | 289 |
| 290 SkAutoTUnref<GrDrawBatch> batch; |
| 291 if (should_apply_coverage_aa(paint, fRenderTarget)) { | 291 if (should_apply_coverage_aa(paint, fRenderTarget)) { |
| 292 SkAutoTUnref<GrDrawBatch> batch; | |
| 293 if (width >= 0) { | 292 if (width >= 0) { |
| 294 // The stroke path needs the rect to remain axis aligned (no rotatio
n or skew). | 293 // The stroke path needs the rect to remain axis aligned (no rotatio
n or skew). |
| 295 if (viewMatrix.rectStaysRect()) { | 294 if (viewMatrix.rectStaysRect()) { |
| 296 batch.reset(GrRectBatchFactory::CreateAAStroke(color, viewMatrix
, rect, | 295 batch.reset(GrRectBatchFactory::CreateAAStroke(color, viewMatrix
, rect, |
| 297 *strokeInfo)); | 296 *strokeInfo)); |
| 298 } | 297 } |
| 299 } else { | 298 } else { |
| 300 // The fill path can handle rotation but not skew. | 299 // The fill path can handle rotation but not skew. |
| 301 if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) { | 300 if (view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
| 302 SkRect devBoundRect; | 301 SkRect devBoundRect; |
| 303 viewMatrix.mapRect(&devBoundRect, rect); | 302 viewMatrix.mapRect(&devBoundRect, rect); |
| 304 batch.reset(GrRectBatchFactory::CreateAAFill(color, viewMatrix,
rect, | 303 batch.reset(GrRectBatchFactory::CreateAAFill(color, viewMatrix,
rect, |
| 305 devBoundRect)); | 304 devBoundRect)); |
| 306 } | 305 } |
| 307 } | 306 } |
| 308 if (batch) { | 307 if (!batch) { |
| 309 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | |
| 310 } else { | |
| 311 SkPath path; | 308 SkPath path; |
| 312 path.setIsVolatile(true); | 309 path.setIsVolatile(true); |
| 313 path.addRect(rect); | 310 path.addRect(rect); |
| 314 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, true, pa
th, *strokeInfo); | 311 this->internalDrawPath(&pipelineBuilder, viewMatrix, color, true, pa
th, *strokeInfo); |
| 315 SkASSERT(paint.isAntiAlias()); | 312 SkASSERT(paint.isAntiAlias()); |
| 313 return; |
| 316 } | 314 } |
| 317 return; | 315 } else if (width >= 0) { |
| 318 } | |
| 319 | |
| 320 if (width >= 0) { | |
| 321 // Non-AA hairlines are snapped to pixel centers to make which pixels ar
e hit deterministic | 316 // Non-AA hairlines are snapped to pixel centers to make which pixels ar
e hit deterministic |
| 322 bool snapToPixelCenters = (0 == width && !fRenderTarget->isUnifiedMultis
ampled()); | 317 bool snapToPixelCenters = (0 == width && !fRenderTarget->isUnifiedMultis
ampled()); |
| 323 SkAutoTUnref<GrDrawBatch> batch(GrRectBatchFactory::CreateNonAAStroke( | 318 batch.reset(GrRectBatchFactory::CreateNonAAStroke(color, viewMatrix, rec
t, width, |
| 324 color, viewMatrix, rect, width, snapToPi
xelCenters)); | 319 snapToPixelCenters)); |
| 325 | 320 |
| 326 // Depending on sub-pixel coordinates and the particular GPU, we may los
e a corner of | 321 // Depending on sub-pixel coordinates and the particular GPU, we may los
e a corner of |
| 327 // hairline rects. We jam all the vertices to pixel centers to avoid thi
s, but not when MSAA | 322 // hairline rects. We jam all the vertices to pixel centers to avoid thi
s, but not when MSAA |
| 328 // is enabled because it can cause ugly artifacts. | 323 // is enabled because it can cause ugly artifacts. |
| 329 pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCenters_
Flag, | 324 pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCenters_
Flag, |
| 330 snapToPixelCenters); | 325 snapToPixelCenters); |
| 331 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); | |
| 332 } else { | 326 } else { |
| 333 // filled BW rect | 327 // filled BW rect |
| 334 this->getDrawTarget()->drawNonAARect(pipelineBuilder, color, viewMatrix,
rect); | 328 batch.reset(GrRectBatchFactory::CreateNonAAFill(color, viewMatrix, rect,
nullptr, nullptr)); |
| 335 } | 329 } |
| 330 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
| 336 } | 331 } |
| 337 | 332 |
| 338 void GrDrawContext::fillRectToRect(const GrClip& clip, | 333 void GrDrawContext::fillRectToRect(const GrClip& clip, |
| 339 const GrPaint& paint, | 334 const GrPaint& paint, |
| 340 const SkMatrix& viewMatrix, | 335 const SkMatrix& viewMatrix, |
| 341 const SkRect& rectToDraw, | 336 const SkRect& rectToDraw, |
| 342 const SkRect& localRect) { | 337 const SkRect& localRect) { |
| 343 ASSERT_SINGLE_OWNER | 338 ASSERT_SINGLE_OWNER |
| 344 RETURN_IF_ABANDONED | 339 RETURN_IF_ABANDONED |
| 345 SkDEBUGCODE(this->validate();) | 340 SkDEBUGCODE(this->validate();) |
| 346 | 341 |
| 347 AutoCheckFlush acf(fDrawingManager); | 342 AutoCheckFlush acf(fDrawingManager); |
| 348 | 343 |
| 349 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 344 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 345 SkAutoTUnref<GrDrawBatch> batch; |
| 350 if (should_apply_coverage_aa(paint, fRenderTarget) && | 346 if (should_apply_coverage_aa(paint, fRenderTarget) && |
| 351 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { | 347 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
| 352 SkAutoTUnref<GrDrawBatch> batch(GrAAFillRectBatch::CreateWithLocalRect( | 348 batch.reset(GrAAFillRectBatch::CreateWithLocalRect(paint.getColor(), vie
wMatrix, rectToDraw, |
| 353 paint.getColor(), viewMatrix, rectToDraw, localRect)); | 349 localRect)); |
| 354 if (batch) { | |
| 355 this->drawBatch(&pipelineBuilder, batch); | |
| 356 } | |
| 357 } else { | 350 } else { |
| 358 this->getDrawTarget()->drawNonAARect(pipelineBuilder, | 351 batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMa
trix, rectToDraw, |
| 359 paint.getColor(), | 352 &localRect, nullptr)); |
| 360 viewMatrix, | 353 } |
| 361 rectToDraw, | 354 |
| 362 localRect); | 355 if (batch) { |
| 356 this->drawBatch(&pipelineBuilder, batch); |
| 363 } | 357 } |
| 364 } | 358 } |
| 365 | 359 |
| 366 void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, | 360 void GrDrawContext::fillRectWithLocalMatrix(const GrClip& clip, |
| 367 const GrPaint& paint, | 361 const GrPaint& paint, |
| 368 const SkMatrix& viewMatrix, | 362 const SkMatrix& viewMatrix, |
| 369 const SkRect& rectToDraw, | 363 const SkRect& rectToDraw, |
| 370 const SkMatrix& localMatrix) { | 364 const SkMatrix& localMatrix) { |
| 371 ASSERT_SINGLE_OWNER | 365 ASSERT_SINGLE_OWNER |
| 372 RETURN_IF_ABANDONED | 366 RETURN_IF_ABANDONED |
| 373 SkDEBUGCODE(this->validate();) | 367 SkDEBUGCODE(this->validate();) |
| 374 | 368 |
| 375 AutoCheckFlush acf(fDrawingManager); | 369 AutoCheckFlush acf(fDrawingManager); |
| 376 | 370 |
| 377 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); | 371 GrPipelineBuilder pipelineBuilder(paint, fRenderTarget, clip); |
| 378 | 372 |
| 373 SkAutoTUnref<GrDrawBatch> batch; |
| 379 if (should_apply_coverage_aa(paint, fRenderTarget) && | 374 if (should_apply_coverage_aa(paint, fRenderTarget) && |
| 380 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { | 375 view_matrix_ok_for_aa_fill_rect(viewMatrix)) { |
| 381 SkAutoTUnref<GrDrawBatch> batch(GrAAFillRectBatch::Create( | 376 batch.reset(GrAAFillRectBatch::Create(paint.getColor(), viewMatrix, loca
lMatrix, |
| 382 paint.getColor(), viewMatrix, localMatrix, rectToDraw)); | 377 rectToDraw)); |
| 383 this->drawBatch(&pipelineBuilder, batch); | |
| 384 } else { | 378 } else { |
| 385 this->getDrawTarget()->drawNonAARect(pipelineBuilder, | 379 batch.reset(GrRectBatchFactory::CreateNonAAFill(paint.getColor(), viewMa
trix, rectToDraw, |
| 386 paint.getColor(), | 380 nullptr, &localMatrix)); |
| 387 viewMatrix, | |
| 388 rectToDraw, | |
| 389 localMatrix); | |
| 390 } | 381 } |
| 382 this->getDrawTarget()->drawBatch(pipelineBuilder, batch); |
| 391 } | 383 } |
| 392 | 384 |
| 393 void GrDrawContext::drawVertices(const GrClip& clip, | 385 void GrDrawContext::drawVertices(const GrClip& clip, |
| 394 const GrPaint& paint, | 386 const GrPaint& paint, |
| 395 const SkMatrix& viewMatrix, | 387 const SkMatrix& viewMatrix, |
| 396 GrPrimitiveType primitiveType, | 388 GrPrimitiveType primitiveType, |
| 397 int vertexCount, | 389 int vertexCount, |
| 398 const SkPoint positions[], | 390 const SkPoint positions[], |
| 399 const SkPoint texCoords[], | 391 const SkPoint texCoords[], |
| 400 const GrColor colors[], | 392 const GrColor colors[], |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 828 pr->drawPath(args); | 820 pr->drawPath(args); |
| 829 } | 821 } |
| 830 | 822 |
| 831 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { | 823 void GrDrawContext::drawBatch(GrPipelineBuilder* pipelineBuilder, GrDrawBatch* b
atch) { |
| 832 ASSERT_SINGLE_OWNER | 824 ASSERT_SINGLE_OWNER |
| 833 RETURN_IF_ABANDONED | 825 RETURN_IF_ABANDONED |
| 834 SkDEBUGCODE(this->validate();) | 826 SkDEBUGCODE(this->validate();) |
| 835 | 827 |
| 836 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); | 828 this->getDrawTarget()->drawBatch(*pipelineBuilder, batch); |
| 837 } | 829 } |
| OLD | NEW |