| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2010 Google Inc. | 3 * Copyright 2010 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 | 9 |
| 10 | 10 |
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 520 info.setDevBounds(*devBounds); | 520 info.setDevBounds(*devBounds); |
| 521 } | 521 } |
| 522 // TODO: We should continue with incorrect blending. | 522 // TODO: We should continue with incorrect blending. |
| 523 if (!this->setupDstReadIfNecessary(&info)) { | 523 if (!this->setupDstReadIfNecessary(&info)) { |
| 524 return; | 524 return; |
| 525 } | 525 } |
| 526 this->onDraw(info); | 526 this->onDraw(info); |
| 527 } | 527 } |
| 528 } | 528 } |
| 529 | 529 |
| 530 void GrDrawTarget::stencilPath(const GrPath* path, SkPath::FillType fill) { | 530 void GrDrawTarget::stencilPath(const GrPath* path, GrPathRendering::FillType fil
l) { |
| 531 // TODO: extract portions of checkDraw that are relevant to path stenciling. | 531 // TODO: extract portions of checkDraw that are relevant to path stenciling. |
| 532 SkASSERT(path); | 532 SkASSERT(path); |
| 533 SkASSERT(this->caps()->pathRenderingSupport()); | 533 SkASSERT(this->caps()->pathRenderingSupport()); |
| 534 SkASSERT(!SkPath::IsInverseFillType(fill)); | |
| 535 this->onStencilPath(path, fill); | 534 this->onStencilPath(path, fill); |
| 536 } | 535 } |
| 537 | 536 |
| 538 void GrDrawTarget::drawPath(const GrPath* path, SkPath::FillType fill) { | 537 void GrDrawTarget::drawPath(const GrPath* path, GrPathRendering::FillType fill)
{ |
| 539 // TODO: extract portions of checkDraw that are relevant to path rendering. | 538 // TODO: extract portions of checkDraw that are relevant to path rendering. |
| 540 SkASSERT(path); | 539 SkASSERT(path); |
| 541 SkASSERT(this->caps()->pathRenderingSupport()); | 540 SkASSERT(this->caps()->pathRenderingSupport()); |
| 542 const GrDrawState* drawState = &getDrawState(); | |
| 543 | 541 |
| 544 SkRect devBounds; | 542 SkRect devBounds = path->getBounds(); |
| 545 if (SkPath::IsInverseFillType(fill)) { | 543 SkMatrix viewM = this->drawState()->getViewMatrix(); |
| 546 devBounds = SkRect::MakeWH(SkIntToScalar(drawState->getRenderTarget()->w
idth()), | |
| 547 SkIntToScalar(drawState->getRenderTarget()->h
eight())); | |
| 548 } else { | |
| 549 devBounds = path->getBounds(); | |
| 550 } | |
| 551 SkMatrix viewM = drawState->getViewMatrix(); | |
| 552 viewM.mapRect(&devBounds); | 544 viewM.mapRect(&devBounds); |
| 553 | 545 |
| 554 GrDeviceCoordTexture dstCopy; | 546 GrDeviceCoordTexture dstCopy; |
| 555 if (!this->setupDstReadIfNecessary(&dstCopy, &devBounds)) { | 547 if (!this->setupDstReadIfNecessary(&dstCopy, &devBounds)) { |
| 556 return; | 548 return; |
| 557 } | 549 } |
| 558 | 550 |
| 559 this->onDrawPath(path, fill, dstCopy.texture() ? &dstCopy : NULL); | 551 this->onDrawPath(path, fill, dstCopy.texture() ? &dstCopy : NULL); |
| 560 } | 552 } |
| 561 | 553 |
| 562 void GrDrawTarget::drawPaths(const GrPathRange* pathRange, | 554 void GrDrawTarget::drawPaths(const GrPathRange* pathRange, |
| 563 const uint32_t indices[], int count, | 555 const uint32_t indices[], int count, |
| 564 const float transforms[], PathTransformType transfo
rmsType, | 556 const float transforms[], PathTransformType transfo
rmsType, |
| 565 SkPath::FillType fill) { | 557 GrPathRendering::FillType fill) { |
| 566 SkASSERT(this->caps()->pathRenderingSupport()); | 558 SkASSERT(this->caps()->pathRenderingSupport()); |
| 567 SkASSERT(pathRange); | 559 SkASSERT(pathRange); |
| 568 SkASSERT(indices); | 560 SkASSERT(indices); |
| 569 SkASSERT(transforms); | 561 SkASSERT(transforms); |
| 570 | 562 |
| 571 // Don't compute a bounding box for setupDstReadIfNecessary(), we'll opt | 563 // Don't compute a bounding box for setupDstReadIfNecessary(), we'll opt |
| 572 // instead for it to just copy the entire dst. Realistically this is a moot | 564 // instead for it to just copy the entire dst. Realistically this is a moot |
| 573 // point, because any context that supports NV_path_rendering will also | 565 // point, because any context that supports NV_path_rendering will also |
| 574 // support NV_blend_equation_advanced. | 566 // support NV_blend_equation_advanced. |
| 575 GrDeviceCoordTexture dstCopy; | 567 GrDeviceCoordTexture dstCopy; |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 717 } | 709 } |
| 718 SkRect bounds; | 710 SkRect bounds; |
| 719 this->getDrawState().getViewMatrix().mapRect(&bounds, rect); | 711 this->getDrawState().getViewMatrix().mapRect(&bounds, rect); |
| 720 | 712 |
| 721 this->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4, &bounds); | 713 this->drawNonIndexed(kTriangleFan_GrPrimitiveType, 0, 4, &bounds); |
| 722 } | 714 } |
| 723 | 715 |
| 724 void GrDrawTarget::clipWillBeSet(const GrClipData* clipData) { | 716 void GrDrawTarget::clipWillBeSet(const GrClipData* clipData) { |
| 725 } | 717 } |
| 726 | 718 |
| 727 static const GrStencilSettings& winding_path_stencil_settings() { | |
| 728 GR_STATIC_CONST_SAME_STENCIL_STRUCT(gSettings, | |
| 729 kIncClamp_StencilOp, | |
| 730 kIncClamp_StencilOp, | |
| 731 kAlwaysIfInClip_StencilFunc, | |
| 732 0xFFFF, 0xFFFF, 0xFFFF); | |
| 733 return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings); | |
| 734 } | |
| 735 | |
| 736 static const GrStencilSettings& even_odd_path_stencil_settings() { | |
| 737 GR_STATIC_CONST_SAME_STENCIL_STRUCT(gSettings, | |
| 738 kInvert_StencilOp, | |
| 739 kInvert_StencilOp, | |
| 740 kAlwaysIfInClip_StencilFunc, | |
| 741 0xFFFF, 0xFFFF, 0xFFFF); | |
| 742 return *GR_CONST_STENCIL_SETTINGS_PTR_FROM_STRUCT_PTR(&gSettings); | |
| 743 } | |
| 744 | |
| 745 void GrDrawTarget::getPathStencilSettingsForFillType(SkPath::FillType fill, | |
| 746 GrStencilSettings* outStenc
ilSettings) { | |
| 747 | |
| 748 switch (fill) { | |
| 749 default: | |
| 750 SkFAIL("Unexpected path fill."); | |
| 751 /* fallthrough */; | |
| 752 case SkPath::kWinding_FillType: | |
| 753 case SkPath::kInverseWinding_FillType: | |
| 754 *outStencilSettings = winding_path_stencil_settings(); | |
| 755 break; | |
| 756 case SkPath::kEvenOdd_FillType: | |
| 757 case SkPath::kInverseEvenOdd_FillType: | |
| 758 *outStencilSettings = even_odd_path_stencil_settings(); | |
| 759 break; | |
| 760 } | |
| 761 this->getClipMaskManager()->adjustPathStencilParams(outStencilSettings); | |
| 762 } | |
| 763 | |
| 764 //////////////////////////////////////////////////////////////////////////////// | 719 //////////////////////////////////////////////////////////////////////////////// |
| 765 | 720 |
| 766 GrDrawTarget::AutoStateRestore::AutoStateRestore() { | 721 GrDrawTarget::AutoStateRestore::AutoStateRestore() { |
| 767 fDrawTarget = NULL; | 722 fDrawTarget = NULL; |
| 768 } | 723 } |
| 769 | 724 |
| 770 GrDrawTarget::AutoStateRestore::AutoStateRestore(GrDrawTarget* target, | 725 GrDrawTarget::AutoStateRestore::AutoStateRestore(GrDrawTarget* target, |
| 771 ASRInit init, | 726 ASRInit init, |
| 772 const SkMatrix* vm) { | 727 const SkMatrix* vm) { |
| 773 fDrawTarget = NULL; | 728 fDrawTarget = NULL; |
| (...skipping 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1188 | 1143 |
| 1189 uint32_t GrDrawTargetCaps::CreateUniqueID() { | 1144 uint32_t GrDrawTargetCaps::CreateUniqueID() { |
| 1190 static int32_t gUniqueID = SK_InvalidUniqueID; | 1145 static int32_t gUniqueID = SK_InvalidUniqueID; |
| 1191 uint32_t id; | 1146 uint32_t id; |
| 1192 do { | 1147 do { |
| 1193 id = static_cast<uint32_t>(sk_atomic_inc(&gUniqueID) + 1); | 1148 id = static_cast<uint32_t>(sk_atomic_inc(&gUniqueID) + 1); |
| 1194 } while (id == SK_InvalidUniqueID); | 1149 } while (id == SK_InvalidUniqueID); |
| 1195 return id; | 1150 return id; |
| 1196 } | 1151 } |
| 1197 | 1152 |
| OLD | NEW |