| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkGpuDevice.h" | 8 #include "SkGpuDevice.h" |
| 9 | 9 |
| 10 #include "GrBlurUtils.h" | 10 #include "GrBlurUtils.h" |
| (...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 SkToS32(count), | 462 SkToS32(count), |
| 463 (SkPoint*)pts, | 463 (SkPoint*)pts, |
| 464 nullptr, | 464 nullptr, |
| 465 nullptr, | 465 nullptr, |
| 466 nullptr, | 466 nullptr, |
| 467 0); | 467 0); |
| 468 } | 468 } |
| 469 | 469 |
| 470 /////////////////////////////////////////////////////////////////////////////// | 470 /////////////////////////////////////////////////////////////////////////////// |
| 471 | 471 |
| 472 void SkGpuDevice::drawRect(const SkDraw& draw, const SkRect& rect, | 472 void SkGpuDevice::drawRect(const SkDraw& draw, const SkRect& rect, const SkPaint
& paint) { |
| 473 const SkPaint& paint) { | |
| 474 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawRect", fContext); | 473 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawRect", fContext); |
| 475 | 474 |
| 476 CHECK_FOR_ANNOTATION(paint); | 475 CHECK_FOR_ANNOTATION(paint); |
| 477 CHECK_SHOULD_DRAW(draw); | 476 CHECK_SHOULD_DRAW(draw); |
| 478 | 477 |
| 479 bool doStroke = paint.getStyle() != SkPaint::kFill_Style; | 478 bool doStroke = paint.getStyle() != SkPaint::kFill_Style; |
| 480 SkScalar width = paint.getStrokeWidth(); | 479 SkScalar width = paint.getStrokeWidth(); |
| 481 | 480 |
| 482 /* | 481 /* |
| 483 We have special code for hairline strokes, miter-strokes, bevel-stroke | 482 We have special code for hairline strokes, miter-strokes, bevel-stroke |
| 484 and fills. Anything else we just call our path code. | 483 and fills. Anything else we just call our path code. |
| 485 */ | 484 */ |
| 486 bool usePath = doStroke && width > 0 && | 485 bool usePath = doStroke && width > 0 && |
| 487 (paint.getStrokeJoin() == SkPaint::kRound_Join || | 486 (paint.getStrokeJoin() == SkPaint::kRound_Join || |
| 488 (paint.getStrokeJoin() == SkPaint::kBevel_Join && rect.isEmp
ty())); | 487 (paint.getStrokeJoin() == SkPaint::kBevel_Join && rect.isEmp
ty())); |
| 489 | 488 |
| 490 // a few other reasons we might need to call drawPath... | 489 // a few other reasons we might need to call drawPath... |
| 491 if (paint.getMaskFilter() || | 490 if (paint.getMaskFilter() || paint.getPathEffect() || |
| 492 paint.getStyle() == SkPaint::kStrokeAndFill_Style) { // we can't both st
roke and fill rects | 491 paint.getStyle() == SkPaint::kStrokeAndFill_Style) { // we can't both st
roke and fill rects |
| 493 usePath = true; | 492 usePath = true; |
| 494 } | 493 } |
| 495 | 494 |
| 496 if (!usePath && paint.isAntiAlias() && !draw.fMatrix->rectStaysRect()) { | 495 if (!usePath && paint.isAntiAlias() && !draw.fMatrix->rectStaysRect()) { |
| 497 usePath = true; | 496 usePath = true; |
| 498 } | 497 } |
| 499 | 498 |
| 500 GrStrokeInfo strokeInfo(paint); | |
| 501 | |
| 502 const SkPathEffect* pe = paint.getPathEffect(); | |
| 503 if (!usePath && pe && !strokeInfo.isDashed()) { | |
| 504 usePath = true; | |
| 505 } | |
| 506 | |
| 507 if (usePath) { | 499 if (usePath) { |
| 508 SkPath path; | 500 SkPath path; |
| 509 path.setIsVolatile(true); | 501 path.setIsVolatile(true); |
| 510 path.addRect(rect); | 502 path.addRect(rect); |
| 511 this->drawPath(draw, path, paint, nullptr, true); | 503 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, fRenderTarge
t, |
| 504 fClip, path, paint, |
| 505 *draw.fMatrix, nullptr, |
| 506 draw.fClip->getBounds(), true); |
| 512 return; | 507 return; |
| 513 } | 508 } |
| 514 | 509 |
| 515 GrPaint grPaint; | 510 GrPaint grPaint; |
| 516 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { | 511 if (!SkPaintToGrPaint(this->context(), paint, *draw.fMatrix, &grPaint)) { |
| 517 return; | 512 return; |
| 518 } | 513 } |
| 519 | 514 |
| 515 GrStrokeInfo strokeInfo(paint); |
| 516 |
| 520 fDrawContext->drawRect(fClip, grPaint, *draw.fMatrix, rect, &strokeInfo); | 517 fDrawContext->drawRect(fClip, grPaint, *draw.fMatrix, rect, &strokeInfo); |
| 521 } | 518 } |
| 522 | 519 |
| 523 /////////////////////////////////////////////////////////////////////////////// | 520 /////////////////////////////////////////////////////////////////////////////// |
| 524 | 521 |
| 525 void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect, | 522 void SkGpuDevice::drawRRect(const SkDraw& draw, const SkRRect& rect, |
| 526 const SkPaint& paint) { | 523 const SkPaint& paint) { |
| 527 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawRRect", fContext); | 524 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawRRect", fContext); |
| 528 CHECK_FOR_ANNOTATION(paint); | 525 CHECK_FOR_ANNOTATION(paint); |
| 529 CHECK_SHOULD_DRAW(draw); | 526 CHECK_SHOULD_DRAW(draw); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 557 fClip, | 554 fClip, |
| 558 *draw.fM
atrix, | 555 *draw.fM
atrix, |
| 559 strokeIn
fo, | 556 strokeIn
fo, |
| 560 devRRect
)) { | 557 devRRect
)) { |
| 561 return; | 558 return; |
| 562 } | 559 } |
| 563 } | 560 } |
| 564 | 561 |
| 565 } | 562 } |
| 566 } | 563 } |
| 567 | |
| 568 } | 564 } |
| 569 | 565 |
| 570 if (paint.getMaskFilter() || paint.getPathEffect()) { | 566 if (paint.getMaskFilter() || paint.getPathEffect()) { |
| 567 // The only mask filter the native rrect drawing code could've handle wa
s taken |
| 568 // care of above. |
| 569 // A path effect will presumably transform this rrect into something els
e. |
| 571 SkPath path; | 570 SkPath path; |
| 572 path.setIsVolatile(true); | 571 path.setIsVolatile(true); |
| 573 path.addRRect(rect); | 572 path.addRRect(rect); |
| 574 this->drawPath(draw, path, paint, nullptr, true); | 573 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, fRenderTarge
t, |
| 574 fClip, path, paint, |
| 575 *draw.fMatrix, nullptr, |
| 576 draw.fClip->getBounds(), true); |
| 575 return; | 577 return; |
| 576 } | 578 } |
| 577 | 579 |
| 578 SkASSERT(!strokeInfo.isDashed()); | 580 SkASSERT(!strokeInfo.isDashed()); |
| 579 | 581 |
| 580 fDrawContext->drawRRect(fClip, grPaint, *draw.fMatrix, rect, strokeInfo); | 582 fDrawContext->drawRRect(fClip, grPaint, *draw.fMatrix, rect, strokeInfo); |
| 581 } | 583 } |
| 582 | 584 |
| 583 void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer, | 585 void SkGpuDevice::drawDRRect(const SkDraw& draw, const SkRRect& outer, |
| 584 const SkRRect& inner, const SkPaint& paint) { | 586 const SkRRect& inner, const SkPaint& paint) { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 649 static SkBitmap wrap_texture(GrTexture* texture, int width, int height) { | 651 static SkBitmap wrap_texture(GrTexture* texture, int width, int height) { |
| 650 SkBitmap result; | 652 SkBitmap result; |
| 651 result.setInfo(SkImageInfo::MakeN32Premul(width, height)); | 653 result.setInfo(SkImageInfo::MakeN32Premul(width, height)); |
| 652 result.setPixelRef(new SkGrPixelRef(result.info(), texture))->unref(); | 654 result.setPixelRef(new SkGrPixelRef(result.info(), texture))->unref(); |
| 653 return result; | 655 return result; |
| 654 } | 656 } |
| 655 | 657 |
| 656 void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, | 658 void SkGpuDevice::drawPath(const SkDraw& draw, const SkPath& origSrcPath, |
| 657 const SkPaint& paint, const SkMatrix* prePathMatrix, | 659 const SkPaint& paint, const SkMatrix* prePathMatrix, |
| 658 bool pathIsMutable) { | 660 bool pathIsMutable) { |
| 661 if (!origSrcPath.isInverseFillType() && !paint.getPathEffect() && !prePathMa
trix) { |
| 662 bool isClosed; |
| 663 SkRect rect; |
| 664 if (origSrcPath.isRect(&rect, &isClosed) && isClosed) { |
| 665 this->drawRect(draw, rect, paint); |
| 666 return; |
| 667 } |
| 668 if (origSrcPath.isOval(&rect)) { |
| 669 this->drawOval(draw, rect, paint); |
| 670 return; |
| 671 } |
| 672 SkRRect rrect; |
| 673 if (origSrcPath.isRRect(&rrect)) { |
| 674 this->drawRRect(draw, rrect, paint); |
| 675 return; |
| 676 } |
| 677 } |
| 678 |
| 659 CHECK_FOR_ANNOTATION(paint); | 679 CHECK_FOR_ANNOTATION(paint); |
| 660 CHECK_SHOULD_DRAW(draw); | 680 CHECK_SHOULD_DRAW(draw); |
| 661 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawPath", fContext); | 681 GR_CREATE_TRACE_MARKER_CONTEXT("SkGpuDevice::drawPath", fContext); |
| 662 | 682 |
| 663 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, fRenderTarget, | 683 GrBlurUtils::drawPathWithMaskFilter(fContext, fDrawContext, fRenderTarget, |
| 664 fClip, origSrcPath, paint, | 684 fClip, origSrcPath, paint, |
| 665 *draw.fMatrix, prePathMatrix, | 685 *draw.fMatrix, prePathMatrix, |
| 666 draw.fClip->getBounds(), pathIsMutable); | 686 draw.fClip->getBounds(), pathIsMutable); |
| 667 } | 687 } |
| 668 | 688 |
| (...skipping 1193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1862 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); | 1882 return SkImageFilter::Cache::Create(kDefaultImageFilterCacheSize); |
| 1863 } | 1883 } |
| 1864 | 1884 |
| 1865 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { | 1885 SkImageFilter::Cache* SkGpuDevice::getImageFilterCache() { |
| 1866 // We always return a transient cache, so it is freed after each | 1886 // We always return a transient cache, so it is freed after each |
| 1867 // filter traversal. | 1887 // filter traversal. |
| 1868 return SkGpuDevice::NewImageFilterCache(); | 1888 return SkGpuDevice::NewImageFilterCache(); |
| 1869 } | 1889 } |
| 1870 | 1890 |
| 1871 #endif | 1891 #endif |
| OLD | NEW |