| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 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 "gl/builders/GrGLProgramBuilder.h" | 8 #include "gl/builders/GrGLProgramBuilder.h" |
| 9 #include "GrAARectRenderer.h" | 9 #include "GrAARectRenderer.h" |
| 10 #include "GrGpu.h" | 10 #include "GrGpu.h" |
| (...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 | 269 |
| 270 // Should the coverage be multiplied into the color attrib or use a separate att
rib. | 270 // Should the coverage be multiplied into the color attrib or use a separate att
rib. |
| 271 enum CoverageAttribType { | 271 enum CoverageAttribType { |
| 272 kUseColor_CoverageAttribType, | 272 kUseColor_CoverageAttribType, |
| 273 kUseCoverage_CoverageAttribType, | 273 kUseCoverage_CoverageAttribType, |
| 274 }; | 274 }; |
| 275 } | 275 } |
| 276 | 276 |
| 277 static CoverageAttribType set_rect_attribs(GrDrawState* drawState) { | 277 static CoverageAttribType set_rect_attribs(GrDrawState* drawState) { |
| 278 if (drawState->canTweakAlphaForCoverage()) { | 278 if (drawState->canTweakAlphaForCoverage()) { |
| 279 drawState->setVertexAttribs<gAARectAttribs>(2); | 279 drawState->setVertexAttribs<gAARectAttribs>(2, sizeof(SkPoint) + sizeof(
SkColor)); |
| 280 return kUseColor_CoverageAttribType; | 280 return kUseColor_CoverageAttribType; |
| 281 } else { | 281 } else { |
| 282 drawState->setVertexAttribs<gAARectAttribs>(3); | 282 drawState->setVertexAttribs<gAARectAttribs>(3, sizeof(SkPoint) + 2 * siz
eof(SkColor)); |
| 283 return kUseCoverage_CoverageAttribType; | 283 return kUseCoverage_CoverageAttribType; |
| 284 } | 284 } |
| 285 } | 285 } |
| 286 | 286 |
| 287 static void set_inset_fan(SkPoint* pts, size_t stride, | 287 static void set_inset_fan(SkPoint* pts, size_t stride, |
| 288 const SkRect& r, SkScalar dx, SkScalar dy) { | 288 const SkRect& r, SkScalar dx, SkScalar dy) { |
| 289 pts->setRectFan(r.fLeft + dx, r.fTop + dy, | 289 pts->setRectFan(r.fLeft + dx, r.fTop + dy, |
| 290 r.fRight - dx, r.fBottom - dy, stride); | 290 r.fRight - dx, r.fBottom - dy, stride); |
| 291 } | 291 } |
| 292 | 292 |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 475 return; | 475 return; |
| 476 } | 476 } |
| 477 | 477 |
| 478 GrIndexBuffer* indexBuffer = this->aaFillRectIndexBuffer(gpu); | 478 GrIndexBuffer* indexBuffer = this->aaFillRectIndexBuffer(gpu); |
| 479 if (NULL == indexBuffer) { | 479 if (NULL == indexBuffer) { |
| 480 GrPrintf("Failed to create index buffer!\n"); | 480 GrPrintf("Failed to create index buffer!\n"); |
| 481 return; | 481 return; |
| 482 } | 482 } |
| 483 | 483 |
| 484 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); | 484 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
| 485 size_t vsize = drawState->getVertexSize(); | 485 size_t vstride = drawState->getVertexStride(); |
| 486 | 486 |
| 487 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); | 487 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); |
| 488 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + 4 * vsize); | 488 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + 4 * vstride); |
| 489 | 489 |
| 490 SkScalar inset = SkMinScalar(devRect.width(), SK_Scalar1); | 490 SkScalar inset = SkMinScalar(devRect.width(), SK_Scalar1); |
| 491 inset = SK_ScalarHalf * SkMinScalar(inset, devRect.height()); | 491 inset = SK_ScalarHalf * SkMinScalar(inset, devRect.height()); |
| 492 | 492 |
| 493 if (combinedMatrix.rectStaysRect()) { | 493 if (combinedMatrix.rectStaysRect()) { |
| 494 // Temporarily #if'ed out. We don't want to pass in the devRect but | 494 // Temporarily #if'ed out. We don't want to pass in the devRect but |
| 495 // right now it is computed in GrContext::apply_aa_to_rect and we don't | 495 // right now it is computed in GrContext::apply_aa_to_rect and we don't |
| 496 // want to throw away the work | 496 // want to throw away the work |
| 497 #if 0 | 497 #if 0 |
| 498 SkRect devRect; | 498 SkRect devRect; |
| 499 combinedMatrix.mapRect(&devRect, rect); | 499 combinedMatrix.mapRect(&devRect, rect); |
| 500 #endif | 500 #endif |
| 501 | 501 |
| 502 set_inset_fan(fan0Pos, vsize, devRect, -SK_ScalarHalf, -SK_ScalarHalf); | 502 set_inset_fan(fan0Pos, vstride, devRect, -SK_ScalarHalf, -SK_ScalarHalf)
; |
| 503 set_inset_fan(fan1Pos, vsize, devRect, inset, inset); | 503 set_inset_fan(fan1Pos, vstride, devRect, inset, inset); |
| 504 } else { | 504 } else { |
| 505 // compute transformed (1, 0) and (0, 1) vectors | 505 // compute transformed (1, 0) and (0, 1) vectors |
| 506 SkVector vec[2] = { | 506 SkVector vec[2] = { |
| 507 { combinedMatrix[SkMatrix::kMScaleX], combinedMatrix[SkMatrix::kMSkewY
] }, | 507 { combinedMatrix[SkMatrix::kMScaleX], combinedMatrix[SkMatrix::kMSkewY
] }, |
| 508 { combinedMatrix[SkMatrix::kMSkewX], combinedMatrix[SkMatrix::kMScale
Y] } | 508 { combinedMatrix[SkMatrix::kMSkewX], combinedMatrix[SkMatrix::kMScale
Y] } |
| 509 }; | 509 }; |
| 510 | 510 |
| 511 vec[0].normalize(); | 511 vec[0].normalize(); |
| 512 vec[0].scale(SK_ScalarHalf); | 512 vec[0].scale(SK_ScalarHalf); |
| 513 vec[1].normalize(); | 513 vec[1].normalize(); |
| 514 vec[1].scale(SK_ScalarHalf); | 514 vec[1].scale(SK_ScalarHalf); |
| 515 | 515 |
| 516 // create the rotated rect | 516 // create the rotated rect |
| 517 fan0Pos->setRectFan(rect.fLeft, rect.fTop, | 517 fan0Pos->setRectFan(rect.fLeft, rect.fTop, |
| 518 rect.fRight, rect.fBottom, vsize); | 518 rect.fRight, rect.fBottom, vstride); |
| 519 combinedMatrix.mapPointsWithStride(fan0Pos, vsize, 4); | 519 combinedMatrix.mapPointsWithStride(fan0Pos, vstride, 4); |
| 520 | 520 |
| 521 // Now create the inset points and then outset the original | 521 // Now create the inset points and then outset the original |
| 522 // rotated points | 522 // rotated points |
| 523 | 523 |
| 524 // TL | 524 // TL |
| 525 *((SkPoint*)((intptr_t)fan1Pos + 0 * vsize)) = | 525 *((SkPoint*)((intptr_t)fan1Pos + 0 * vstride)) = |
| 526 *((SkPoint*)((intptr_t)fan0Pos + 0 * vsize)) + vec[0] + vec[1]; | 526 *((SkPoint*)((intptr_t)fan0Pos + 0 * vstride)) + vec[0] + vec[1]; |
| 527 *((SkPoint*)((intptr_t)fan0Pos + 0 * vsize)) -= vec[0] + vec[1]; | 527 *((SkPoint*)((intptr_t)fan0Pos + 0 * vstride)) -= vec[0] + vec[1]; |
| 528 // BL | 528 // BL |
| 529 *((SkPoint*)((intptr_t)fan1Pos + 1 * vsize)) = | 529 *((SkPoint*)((intptr_t)fan1Pos + 1 * vstride)) = |
| 530 *((SkPoint*)((intptr_t)fan0Pos + 1 * vsize)) + vec[0] - vec[1]; | 530 *((SkPoint*)((intptr_t)fan0Pos + 1 * vstride)) + vec[0] - vec[1]; |
| 531 *((SkPoint*)((intptr_t)fan0Pos + 1 * vsize)) -= vec[0] - vec[1]; | 531 *((SkPoint*)((intptr_t)fan0Pos + 1 * vstride)) -= vec[0] - vec[1]; |
| 532 // BR | 532 // BR |
| 533 *((SkPoint*)((intptr_t)fan1Pos + 2 * vsize)) = | 533 *((SkPoint*)((intptr_t)fan1Pos + 2 * vstride)) = |
| 534 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) - vec[0] - vec[1]; | 534 *((SkPoint*)((intptr_t)fan0Pos + 2 * vstride)) - vec[0] - vec[1]; |
| 535 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) += vec[0] + vec[1]; | 535 *((SkPoint*)((intptr_t)fan0Pos + 2 * vstride)) += vec[0] + vec[1]; |
| 536 // TR | 536 // TR |
| 537 *((SkPoint*)((intptr_t)fan1Pos + 3 * vsize)) = | 537 *((SkPoint*)((intptr_t)fan1Pos + 3 * vstride)) = |
| 538 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) - vec[0] + vec[1]; | 538 *((SkPoint*)((intptr_t)fan0Pos + 3 * vstride)) - vec[0] + vec[1]; |
| 539 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) += vec[0] - vec[1]; | 539 *((SkPoint*)((intptr_t)fan0Pos + 3 * vstride)) += vec[0] - vec[1]; |
| 540 } | 540 } |
| 541 | 541 |
| 542 // Make verts point to vertex color and then set all the color and coverage
vertex attrs values. | 542 // Make verts point to vertex color and then set all the color and coverage
vertex attrs values. |
| 543 verts += sizeof(SkPoint); | 543 verts += sizeof(SkPoint); |
| 544 for (int i = 0; i < 4; ++i) { | 544 for (int i = 0; i < 4; ++i) { |
| 545 if (kUseCoverage_CoverageAttribType == covAttribType) { | 545 if (kUseCoverage_CoverageAttribType == covAttribType) { |
| 546 *reinterpret_cast<GrColor*>(verts + i * vsize) = color; | 546 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; |
| 547 *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0
; | 547 *reinterpret_cast<GrColor*>(verts + i * vstride + sizeof(GrColor)) =
0; |
| 548 } else { | 548 } else { |
| 549 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 549 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0; |
| 550 } | 550 } |
| 551 } | 551 } |
| 552 | 552 |
| 553 int scale; | 553 int scale; |
| 554 if (inset < SK_ScalarHalf) { | 554 if (inset < SK_ScalarHalf) { |
| 555 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); | 555 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); |
| 556 SkASSERT(scale >= 0 && scale <= 255); | 556 SkASSERT(scale >= 0 && scale <= 255); |
| 557 } else { | 557 } else { |
| 558 scale = 0xff; | 558 scale = 0xff; |
| 559 } | 559 } |
| 560 | 560 |
| 561 GrColor innerCoverage; | 561 GrColor innerCoverage; |
| 562 if (kUseCoverage_CoverageAttribType == covAttribType) { | 562 if (kUseCoverage_CoverageAttribType == covAttribType) { |
| 563 innerCoverage = GrColorPackRGBA(scale, scale, scale, scale); | 563 innerCoverage = GrColorPackRGBA(scale, scale, scale, scale); |
| 564 } else { | 564 } else { |
| 565 innerCoverage = (0xff == scale) ? color : SkAlphaMulQ(color, scale); | 565 innerCoverage = (0xff == scale) ? color : SkAlphaMulQ(color, scale); |
| 566 } | 566 } |
| 567 verts += 4 * vsize; | 567 verts += 4 * vstride; |
| 568 for (int i = 0; i < 4; ++i) { | 568 for (int i = 0; i < 4; ++i) { |
| 569 if (kUseCoverage_CoverageAttribType == covAttribType) { | 569 if (kUseCoverage_CoverageAttribType == covAttribType) { |
| 570 *reinterpret_cast<GrColor*>(verts + i * vsize) = color; | 570 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; |
| 571 *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = i
nnerCoverage; | 571 *reinterpret_cast<GrColor*>(verts + i * vstride + sizeof(GrColor)) =
innerCoverage; |
| 572 } else { | 572 } else { |
| 573 *reinterpret_cast<GrColor*>(verts + i * vsize) = innerCoverage; | 573 *reinterpret_cast<GrColor*>(verts + i * vstride) = innerCoverage; |
| 574 } | 574 } |
| 575 } | 575 } |
| 576 | 576 |
| 577 target->setIndexSourceToBuffer(indexBuffer); | 577 target->setIndexSourceToBuffer(indexBuffer); |
| 578 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, | 578 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, |
| 579 kVertsPerAAFillRect, | 579 kVertsPerAAFillRect, |
| 580 kIndicesPerAAFillRect); | 580 kIndicesPerAAFillRect); |
| 581 target->resetIndexSource(); | 581 target->resetIndexSource(); |
| 582 } | 582 } |
| 583 | 583 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 627 dir.normalize(); | 627 dir.normalize(); |
| 628 | 628 |
| 629 // compute transformed (width, 0) and (0, height) vectors | 629 // compute transformed (width, 0) and (0, height) vectors |
| 630 SkVector vec[2] = { | 630 SkVector vec[2] = { |
| 631 { combinedMatrix[SkMatrix::kMScaleX], combinedMatrix[SkMatrix::kMSkewY] }, | 631 { combinedMatrix[SkMatrix::kMScaleX], combinedMatrix[SkMatrix::kMSkewY] }, |
| 632 { combinedMatrix[SkMatrix::kMSkewX], combinedMatrix[SkMatrix::kMScaleY] } | 632 { combinedMatrix[SkMatrix::kMSkewX], combinedMatrix[SkMatrix::kMScaleY] } |
| 633 }; | 633 }; |
| 634 | 634 |
| 635 SkScalar newWidth = SkScalarHalf(rect.width() * vec[0].length()) + SK_Scalar
Half; | 635 SkScalar newWidth = SkScalarHalf(rect.width() * vec[0].length()) + SK_Scalar
Half; |
| 636 SkScalar newHeight = SkScalarHalf(rect.height() * vec[1].length()) + SK_Scal
arHalf; | 636 SkScalar newHeight = SkScalarHalf(rect.height() * vec[1].length()) + SK_Scal
arHalf; |
| 637 drawState->setVertexAttribs<gAARectVertexAttribs>(SK_ARRAY_COUNT(gAARectVert
exAttribs)); | 637 drawState->setVertexAttribs<gAARectVertexAttribs>(SK_ARRAY_COUNT(gAARectVert
exAttribs), |
| 638 SkASSERT(sizeof(RectVertex) == drawState->getVertexSize()); | 638 sizeof(RectVertex)); |
| 639 | 639 |
| 640 GrDrawTarget::AutoReleaseGeometry geo(target, 4, 0); | 640 GrDrawTarget::AutoReleaseGeometry geo(target, 4, 0); |
| 641 if (!geo.succeeded()) { | 641 if (!geo.succeeded()) { |
| 642 GrPrintf("Failed to get space for vertices!\n"); | 642 GrPrintf("Failed to get space for vertices!\n"); |
| 643 return; | 643 return; |
| 644 } | 644 } |
| 645 | 645 |
| 646 RectVertex* verts = reinterpret_cast<RectVertex*>(geo.vertices()); | 646 RectVertex* verts = reinterpret_cast<RectVertex*>(geo.vertices()); |
| 647 | 647 |
| 648 GrEffect* effect = GrRectEffect::Create(); | 648 GrEffect* effect = GrRectEffect::Create(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 677 target->resetIndexSource(); | 677 target->resetIndexSource(); |
| 678 } | 678 } |
| 679 | 679 |
| 680 void GrAARectRenderer::shaderFillAlignedAARect(GrGpu* gpu, | 680 void GrAARectRenderer::shaderFillAlignedAARect(GrGpu* gpu, |
| 681 GrDrawTarget* target, | 681 GrDrawTarget* target, |
| 682 const SkRect& rect, | 682 const SkRect& rect, |
| 683 const SkMatrix& combinedMatrix) { | 683 const SkMatrix& combinedMatrix) { |
| 684 GrDrawState* drawState = target->drawState(); | 684 GrDrawState* drawState = target->drawState(); |
| 685 SkASSERT(combinedMatrix.rectStaysRect()); | 685 SkASSERT(combinedMatrix.rectStaysRect()); |
| 686 | 686 |
| 687 drawState->setVertexAttribs<gAAAARectVertexAttribs>(SK_ARRAY_COUNT(gAAAARect
VertexAttribs)); | 687 drawState->setVertexAttribs<gAAAARectVertexAttribs>(SK_ARRAY_COUNT(gAAAARect
VertexAttribs), |
| 688 SkASSERT(sizeof(AARectVertex) == drawState->getVertexSize()); | 688 sizeof(AARectVertex)); |
| 689 | 689 |
| 690 GrDrawTarget::AutoReleaseGeometry geo(target, 4, 0); | 690 GrDrawTarget::AutoReleaseGeometry geo(target, 4, 0); |
| 691 if (!geo.succeeded()) { | 691 if (!geo.succeeded()) { |
| 692 GrPrintf("Failed to get space for vertices!\n"); | 692 GrPrintf("Failed to get space for vertices!\n"); |
| 693 return; | 693 return; |
| 694 } | 694 } |
| 695 | 695 |
| 696 AARectVertex* verts = reinterpret_cast<AARectVertex*>(geo.vertices()); | 696 AARectVertex* verts = reinterpret_cast<AARectVertex*>(geo.vertices()); |
| 697 | 697 |
| 698 GrEffect* effect = GrAlignedRectEffect::Create(); | 698 GrEffect* effect = GrAlignedRectEffect::Create(); |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 827 GrPrintf("Failed to get space for vertices!\n"); | 827 GrPrintf("Failed to get space for vertices!\n"); |
| 828 return; | 828 return; |
| 829 } | 829 } |
| 830 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu, miterStroke)
; | 830 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu, miterStroke)
; |
| 831 if (NULL == indexBuffer) { | 831 if (NULL == indexBuffer) { |
| 832 GrPrintf("Failed to create index buffer!\n"); | 832 GrPrintf("Failed to create index buffer!\n"); |
| 833 return; | 833 return; |
| 834 } | 834 } |
| 835 | 835 |
| 836 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); | 836 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
| 837 size_t vsize = drawState->getVertexSize(); | 837 size_t vstride = drawState->getVertexStride(); |
| 838 | 838 |
| 839 // We create vertices for four nested rectangles. There are two ramps from 0
to full | 839 // We create vertices for four nested rectangles. There are two ramps from 0
to full |
| 840 // coverage, one on the exterior of the stroke and the other on the interior
. | 840 // coverage, one on the exterior of the stroke and the other on the interior
. |
| 841 // The following pointers refer to the four rects, from outermost to innermo
st. | 841 // The following pointers refer to the four rects, from outermost to innermo
st. |
| 842 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); | 842 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); |
| 843 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + outerVertexNum * vsize
); | 843 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + outerVertexNum * vstri
de); |
| 844 SkPoint* fan2Pos = reinterpret_cast<SkPoint*>(verts + 2 * outerVertexNum * v
size); | 844 SkPoint* fan2Pos = reinterpret_cast<SkPoint*>(verts + 2 * outerVertexNum * v
stride); |
| 845 SkPoint* fan3Pos = reinterpret_cast<SkPoint*>(verts + (2 * outerVertexNum +
innerVertexNum) * vsize); | 845 SkPoint* fan3Pos = reinterpret_cast<SkPoint*>(verts + (2 * outerVertexNum +
innerVertexNum) * vstride); |
| 846 | 846 |
| 847 #ifndef SK_IGNORE_THIN_STROKED_RECT_FIX | 847 #ifndef SK_IGNORE_THIN_STROKED_RECT_FIX |
| 848 // TODO: this only really works if the X & Y margins are the same all around | 848 // TODO: this only really works if the X & Y margins are the same all around |
| 849 // the rect | 849 // the rect |
| 850 SkScalar inset = SkMinScalar(SK_Scalar1, devOutside.fRight - devInside.fRigh
t); | 850 SkScalar inset = SkMinScalar(SK_Scalar1, devOutside.fRight - devInside.fRigh
t); |
| 851 inset = SkMinScalar(inset, devInside.fLeft - devOutside.fLeft); | 851 inset = SkMinScalar(inset, devInside.fLeft - devOutside.fLeft); |
| 852 inset = SkMinScalar(inset, devInside.fTop - devOutside.fTop); | 852 inset = SkMinScalar(inset, devInside.fTop - devOutside.fTop); |
| 853 if (miterStroke) { | 853 if (miterStroke) { |
| 854 inset = SK_ScalarHalf * SkMinScalar(inset, devOutside.fBottom - devInsid
e.fBottom); | 854 inset = SK_ScalarHalf * SkMinScalar(inset, devOutside.fBottom - devInsid
e.fBottom); |
| 855 } else { | 855 } else { |
| 856 inset = SK_ScalarHalf * SkMinScalar(inset, devOutsideAssist.fBottom - de
vInside.fBottom); | 856 inset = SK_ScalarHalf * SkMinScalar(inset, devOutsideAssist.fBottom - de
vInside.fBottom); |
| 857 } | 857 } |
| 858 SkASSERT(inset >= 0); | 858 SkASSERT(inset >= 0); |
| 859 #else | 859 #else |
| 860 SkScalar inset = SK_ScalarHalf; | 860 SkScalar inset = SK_ScalarHalf; |
| 861 #endif | 861 #endif |
| 862 | 862 |
| 863 if (miterStroke) { | 863 if (miterStroke) { |
| 864 // outermost | 864 // outermost |
| 865 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf
); | 865 set_inset_fan(fan0Pos, vstride, devOutside, -SK_ScalarHalf, -SK_ScalarHa
lf); |
| 866 // inner two | 866 // inner two |
| 867 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); | 867 set_inset_fan(fan1Pos, vstride, devOutside, inset, inset); |
| 868 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); | 868 set_inset_fan(fan2Pos, vstride, devInside, -inset, -inset); |
| 869 // innermost | 869 // innermost |
| 870 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf
); | 870 set_inset_fan(fan3Pos, vstride, devInside, SK_ScalarHalf, SK_ScalarHa
lf); |
| 871 } else { | 871 } else { |
| 872 SkPoint* fan0AssistPos = reinterpret_cast<SkPoint*>(verts + 4 * vsize); | 872 SkPoint* fan0AssistPos = reinterpret_cast<SkPoint*>(verts + 4 * vstride)
; |
| 873 SkPoint* fan1AssistPos = reinterpret_cast<SkPoint*>(verts + (outerVertex
Num + 4) * vsize); | 873 SkPoint* fan1AssistPos = reinterpret_cast<SkPoint*>(verts + (outerVertex
Num + 4) * vstride); |
| 874 // outermost | 874 // outermost |
| 875 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf
); | 875 set_inset_fan(fan0Pos, vstride, devOutside, -SK_ScalarHalf, -SK_ScalarHa
lf); |
| 876 set_inset_fan(fan0AssistPos, vsize, devOutsideAssist, -SK_ScalarHalf, -S
K_ScalarHalf); | 876 set_inset_fan(fan0AssistPos, vstride, devOutsideAssist, -SK_ScalarHalf,
-SK_ScalarHalf); |
| 877 // outer one of the inner two | 877 // outer one of the inner two |
| 878 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); | 878 set_inset_fan(fan1Pos, vstride, devOutside, inset, inset); |
| 879 set_inset_fan(fan1AssistPos, vsize, devOutsideAssist, inset, inset); | 879 set_inset_fan(fan1AssistPos, vstride, devOutsideAssist, inset, inset); |
| 880 // inner one of the inner two | 880 // inner one of the inner two |
| 881 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); | 881 set_inset_fan(fan2Pos, vstride, devInside, -inset, -inset); |
| 882 // innermost | 882 // innermost |
| 883 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf
); | 883 set_inset_fan(fan3Pos, vstride, devInside, SK_ScalarHalf, SK_ScalarHa
lf); |
| 884 } | 884 } |
| 885 | 885 |
| 886 // Make verts point to vertex color and then set all the color and coverage
vertex attrs values. | 886 // Make verts point to vertex color and then set all the color and coverage
vertex attrs values. |
| 887 // The outermost rect has 0 coverage | 887 // The outermost rect has 0 coverage |
| 888 verts += sizeof(SkPoint); | 888 verts += sizeof(SkPoint); |
| 889 for (int i = 0; i < outerVertexNum; ++i) { | 889 for (int i = 0; i < outerVertexNum; ++i) { |
| 890 if (kUseCoverage_CoverageAttribType == covAttribType) { | 890 if (kUseCoverage_CoverageAttribType == covAttribType) { |
| 891 *reinterpret_cast<GrColor*>(verts + i * vsize) = color; | 891 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; |
| 892 *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0
; | 892 *reinterpret_cast<GrColor*>(verts + i * vstride + sizeof(GrColor)) =
0; |
| 893 } else { | 893 } else { |
| 894 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 894 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0; |
| 895 } | 895 } |
| 896 } | 896 } |
| 897 | 897 |
| 898 // scale is the coverage for the the inner two rects. | 898 // scale is the coverage for the the inner two rects. |
| 899 int scale; | 899 int scale; |
| 900 if (inset < SK_ScalarHalf) { | 900 if (inset < SK_ScalarHalf) { |
| 901 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); | 901 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); |
| 902 SkASSERT(scale >= 0 && scale <= 255); | 902 SkASSERT(scale >= 0 && scale <= 255); |
| 903 } else { | 903 } else { |
| 904 scale = 0xff; | 904 scale = 0xff; |
| 905 } | 905 } |
| 906 | 906 |
| 907 verts += outerVertexNum * vsize; | 907 verts += outerVertexNum * vstride; |
| 908 GrColor innerCoverage; | 908 GrColor innerCoverage; |
| 909 if (kUseCoverage_CoverageAttribType == covAttribType) { | 909 if (kUseCoverage_CoverageAttribType == covAttribType) { |
| 910 innerCoverage = GrColorPackRGBA(scale, scale, scale, scale); | 910 innerCoverage = GrColorPackRGBA(scale, scale, scale, scale); |
| 911 } else { | 911 } else { |
| 912 innerCoverage = (0xff == scale) ? color : SkAlphaMulQ(color, scale); | 912 innerCoverage = (0xff == scale) ? color : SkAlphaMulQ(color, scale); |
| 913 } | 913 } |
| 914 | 914 |
| 915 for (int i = 0; i < outerVertexNum + innerVertexNum; ++i) { | 915 for (int i = 0; i < outerVertexNum + innerVertexNum; ++i) { |
| 916 if (kUseCoverage_CoverageAttribType == covAttribType) { | 916 if (kUseCoverage_CoverageAttribType == covAttribType) { |
| 917 *reinterpret_cast<GrColor*>(verts + i * vsize) = color; | 917 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; |
| 918 *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = i
nnerCoverage; | 918 *reinterpret_cast<GrColor*>(verts + i * vstride + sizeof(GrColor)) =
innerCoverage; |
| 919 } else { | 919 } else { |
| 920 *reinterpret_cast<GrColor*>(verts + i * vsize) = innerCoverage; | 920 *reinterpret_cast<GrColor*>(verts + i * vstride) = innerCoverage; |
| 921 } | 921 } |
| 922 } | 922 } |
| 923 | 923 |
| 924 // The innermost rect has 0 coverage | 924 // The innermost rect has 0 coverage |
| 925 verts += (outerVertexNum + innerVertexNum) * vsize; | 925 verts += (outerVertexNum + innerVertexNum) * vstride; |
| 926 for (int i = 0; i < innerVertexNum; ++i) { | 926 for (int i = 0; i < innerVertexNum; ++i) { |
| 927 if (kUseCoverage_CoverageAttribType == covAttribType) { | 927 if (kUseCoverage_CoverageAttribType == covAttribType) { |
| 928 *reinterpret_cast<GrColor*>(verts + i * vsize) = color; | 928 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; |
| 929 *reinterpret_cast<GrColor*>(verts + i * vsize + sizeof(GrColor)) = 0
; | 929 *reinterpret_cast<GrColor*>(verts + i * vstride + sizeof(GrColor)) =
0; |
| 930 } else { | 930 } else { |
| 931 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 931 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0; |
| 932 } | 932 } |
| 933 } | 933 } |
| 934 | 934 |
| 935 target->setIndexSourceToBuffer(indexBuffer); | 935 target->setIndexSourceToBuffer(indexBuffer); |
| 936 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, | 936 target->drawIndexed(kTriangles_GrPrimitiveType, 0, 0, |
| 937 totalVertexNum, aaStrokeRectIndexCount(miterStroke)); | 937 totalVertexNum, aaStrokeRectIndexCount(miterStroke)); |
| 938 } | 938 } |
| 939 | 939 |
| 940 void GrAARectRenderer::fillAANestedRects(GrGpu* gpu, | 940 void GrAARectRenderer::fillAANestedRects(GrGpu* gpu, |
| 941 GrDrawTarget* target, | 941 GrDrawTarget* target, |
| 942 const SkRect rects[2], | 942 const SkRect rects[2], |
| 943 const SkMatrix& combinedMatrix) { | 943 const SkMatrix& combinedMatrix) { |
| 944 SkASSERT(combinedMatrix.rectStaysRect()); | 944 SkASSERT(combinedMatrix.rectStaysRect()); |
| 945 SkASSERT(!rects[1].isEmpty()); | 945 SkASSERT(!rects[1].isEmpty()); |
| 946 | 946 |
| 947 SkRect devOutside, devOutsideAssist, devInside; | 947 SkRect devOutside, devOutsideAssist, devInside; |
| 948 combinedMatrix.mapRect(&devOutside, rects[0]); | 948 combinedMatrix.mapRect(&devOutside, rects[0]); |
| 949 // can't call mapRect for devInside since it calls sort | 949 // can't call mapRect for devInside since it calls sort |
| 950 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2)
; | 950 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2)
; |
| 951 | 951 |
| 952 if (devInside.isEmpty()) { | 952 if (devInside.isEmpty()) { |
| 953 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside); | 953 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside); |
| 954 return; | 954 return; |
| 955 } | 955 } |
| 956 | 956 |
| 957 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, devIns
ide, true); | 957 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, devIns
ide, true); |
| 958 } | 958 } |
| OLD | NEW |