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 "GrAARectRenderer.h" | 8 #include "GrAARectRenderer.h" |
9 #include "GrGpu.h" | 9 #include "GrGpu.h" |
10 #include "gl/GrGLEffect.h" | 10 #include "gl/GrGLEffect.h" |
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
254 GrTexture* textures[]) { | 254 GrTexture* textures[]) { |
255 return GrRectEffect::Create(); | 255 return GrRectEffect::Create(); |
256 } | 256 } |
257 | 257 |
258 /////////////////////////////////////////////////////////////////////////////// | 258 /////////////////////////////////////////////////////////////////////////////// |
259 | 259 |
260 namespace { | 260 namespace { |
261 | 261 |
262 extern const GrVertexAttrib gAARectCoverageAttribs[] = { | 262 extern const GrVertexAttrib gAARectCoverageAttribs[] = { |
263 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin
g}, | 263 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin
g}, |
264 {kVec4ub_GrVertexAttribType, sizeof(GrPoint), kCoverage_GrVertexAttribBindin
g}, | 264 {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kCoverage_GrVertexAttribBindin
g}, |
265 }; | 265 }; |
266 | 266 |
267 extern const GrVertexAttrib gAARectColorAttribs[] = { | 267 extern const GrVertexAttrib gAARectColorAttribs[] = { |
268 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin
g}, | 268 {kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBindin
g}, |
269 {kVec4ub_GrVertexAttribType, sizeof(GrPoint), kColor_GrVertexAttribBinding}, | 269 {kVec4ub_GrVertexAttribType, sizeof(SkPoint), kColor_GrVertexAttribBinding}, |
270 }; | 270 }; |
271 | 271 |
272 static void set_aa_rect_vertex_attributes(GrDrawState* drawState, bool useCovera
ge) { | 272 static void set_aa_rect_vertex_attributes(GrDrawState* drawState, bool useCovera
ge) { |
273 if (useCoverage) { | 273 if (useCoverage) { |
274 drawState->setVertexAttribs<gAARectCoverageAttribs>(SK_ARRAY_COUNT(gAARe
ctCoverageAttribs)); | 274 drawState->setVertexAttribs<gAARectCoverageAttribs>(SK_ARRAY_COUNT(gAARe
ctCoverageAttribs)); |
275 } else { | 275 } else { |
276 drawState->setVertexAttribs<gAARectColorAttribs>(SK_ARRAY_COUNT(gAARectC
olorAttribs)); | 276 drawState->setVertexAttribs<gAARectColorAttribs>(SK_ARRAY_COUNT(gAARectC
olorAttribs)); |
277 } | 277 } |
278 } | 278 } |
279 | 279 |
280 static void set_inset_fan(GrPoint* pts, size_t stride, | 280 static void set_inset_fan(SkPoint* pts, size_t stride, |
281 const SkRect& r, SkScalar dx, SkScalar dy) { | 281 const SkRect& r, SkScalar dx, SkScalar dy) { |
282 pts->setRectFan(r.fLeft + dx, r.fTop + dy, | 282 pts->setRectFan(r.fLeft + dx, r.fTop + dy, |
283 r.fRight - dx, r.fBottom - dy, stride); | 283 r.fRight - dx, r.fBottom - dy, stride); |
284 } | 284 } |
285 | 285 |
286 }; | 286 }; |
287 | 287 |
288 void GrAARectRenderer::reset() { | 288 void GrAARectRenderer::reset() { |
289 SkSafeSetNull(fAAFillRectIndexBuffer); | 289 SkSafeSetNull(fAAFillRectIndexBuffer); |
290 SkSafeSetNull(fAAMiterStrokeRectIndexBuffer); | 290 SkSafeSetNull(fAAMiterStrokeRectIndexBuffer); |
291 SkSafeSetNull(fAABevelStrokeRectIndexBuffer); | 291 SkSafeSetNull(fAABevelStrokeRectIndexBuffer); |
292 } | 292 } |
293 | 293 |
294 static const uint16_t gFillAARectIdx[] = { | 294 static const uint16_t gFillAARectIdx[] = { |
295 0, 1, 5, 5, 4, 0, | 295 0, 1, 5, 5, 4, 0, |
296 1, 2, 6, 6, 5, 1, | 296 1, 2, 6, 6, 5, 1, |
297 2, 3, 7, 7, 6, 2, | 297 2, 3, 7, 7, 6, 2, |
298 3, 0, 4, 4, 7, 3, | 298 3, 0, 4, 4, 7, 3, |
299 4, 5, 6, 6, 7, 4, | 299 4, 5, 6, 6, 7, 4, |
300 }; | 300 }; |
301 | 301 |
302 static const int kIndicesPerAAFillRect = GR_ARRAY_COUNT(gFillAARectIdx); | 302 static const int kIndicesPerAAFillRect = SK_ARRAY_COUNT(gFillAARectIdx); |
303 static const int kVertsPerAAFillRect = 8; | 303 static const int kVertsPerAAFillRect = 8; |
304 static const int kNumAAFillRectsInIndexBuffer = 256; | 304 static const int kNumAAFillRectsInIndexBuffer = 256; |
305 | 305 |
306 GrIndexBuffer* GrAARectRenderer::aaFillRectIndexBuffer(GrGpu* gpu) { | 306 GrIndexBuffer* GrAARectRenderer::aaFillRectIndexBuffer(GrGpu* gpu) { |
307 static const size_t kAAFillRectIndexBufferSize = kIndicesPerAAFillRect * | 307 static const size_t kAAFillRectIndexBufferSize = kIndicesPerAAFillRect * |
308 sizeof(uint16_t) * | 308 sizeof(uint16_t) * |
309 kNumAAFillRectsInIndexBuffe
r; | 309 kNumAAFillRectsInIndexBuffe
r; |
310 | 310 |
311 if (NULL == fAAFillRectIndexBuffer) { | 311 if (NULL == fAAFillRectIndexBuffer) { |
312 fAAFillRectIndexBuffer = gpu->createIndexBuffer(kAAFillRectIndexBufferSi
ze, false); | 312 fAAFillRectIndexBuffer = gpu->createIndexBuffer(kAAFillRectIndexBufferSi
ze, false); |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
407 4 + 8, 0 + 8, 8 + 8, | 407 4 + 8, 0 + 8, 8 + 8, |
408 | 408 |
409 // Draw the inner AA, from inner edge to inner AA line, shift is 16. | 409 // Draw the inner AA, from inner edge to inner AA line, shift is 16. |
410 0 + 16, 1 + 16, 5 + 16, 5 + 16, 4 + 16, 0 + 16, | 410 0 + 16, 1 + 16, 5 + 16, 5 + 16, 4 + 16, 0 + 16, |
411 1 + 16, 2 + 16, 6 + 16, 6 + 16, 5 + 16, 1 + 16, | 411 1 + 16, 2 + 16, 6 + 16, 6 + 16, 5 + 16, 1 + 16, |
412 2 + 16, 3 + 16, 7 + 16, 7 + 16, 6 + 16, 2 + 16, | 412 2 + 16, 3 + 16, 7 + 16, 7 + 16, 6 + 16, 2 + 16, |
413 3 + 16, 0 + 16, 4 + 16, 4 + 16, 7 + 16, 3 + 16, | 413 3 + 16, 0 + 16, 4 + 16, 4 + 16, 7 + 16, 3 + 16, |
414 }; | 414 }; |
415 | 415 |
416 int GrAARectRenderer::aaStrokeRectIndexCount(bool miterStroke) { | 416 int GrAARectRenderer::aaStrokeRectIndexCount(bool miterStroke) { |
417 return miterStroke ? GR_ARRAY_COUNT(gMiterStrokeAARectIdx) : | 417 return miterStroke ? SK_ARRAY_COUNT(gMiterStrokeAARectIdx) : |
418 GR_ARRAY_COUNT(gBevelStrokeAARectIdx); | 418 SK_ARRAY_COUNT(gBevelStrokeAARectIdx); |
419 } | 419 } |
420 | 420 |
421 GrIndexBuffer* GrAARectRenderer::aaStrokeRectIndexBuffer(GrGpu* gpu, bool miterS
troke) { | 421 GrIndexBuffer* GrAARectRenderer::aaStrokeRectIndexBuffer(GrGpu* gpu, bool miterS
troke) { |
422 if (miterStroke) { | 422 if (miterStroke) { |
423 if (NULL == fAAMiterStrokeRectIndexBuffer) { | 423 if (NULL == fAAMiterStrokeRectIndexBuffer) { |
424 fAAMiterStrokeRectIndexBuffer = | 424 fAAMiterStrokeRectIndexBuffer = |
425 gpu->createIndexBuffer(sizeof(gMiterStrokeAARectIdx), false); | 425 gpu->createIndexBuffer(sizeof(gMiterStrokeAARectIdx), false); |
426 if (NULL != fAAMiterStrokeRectIndexBuffer) { | 426 if (NULL != fAAMiterStrokeRectIndexBuffer) { |
427 #ifdef SK_DEBUG | 427 #ifdef SK_DEBUG |
428 bool updated = | 428 bool updated = |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 } | 467 } |
468 | 468 |
469 GrIndexBuffer* indexBuffer = this->aaFillRectIndexBuffer(gpu); | 469 GrIndexBuffer* indexBuffer = this->aaFillRectIndexBuffer(gpu); |
470 if (NULL == indexBuffer) { | 470 if (NULL == indexBuffer) { |
471 GrPrintf("Failed to create index buffer!\n"); | 471 GrPrintf("Failed to create index buffer!\n"); |
472 return; | 472 return; |
473 } | 473 } |
474 | 474 |
475 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); | 475 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
476 size_t vsize = drawState->getVertexSize(); | 476 size_t vsize = drawState->getVertexSize(); |
477 SkASSERT(sizeof(GrPoint) + sizeof(GrColor) == vsize); | 477 SkASSERT(sizeof(SkPoint) + sizeof(GrColor) == vsize); |
478 | 478 |
479 GrPoint* fan0Pos = reinterpret_cast<GrPoint*>(verts); | 479 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); |
480 GrPoint* fan1Pos = reinterpret_cast<GrPoint*>(verts + 4 * vsize); | 480 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + 4 * vsize); |
481 | 481 |
482 SkScalar inset = SkMinScalar(devRect.width(), SK_Scalar1); | 482 SkScalar inset = SkMinScalar(devRect.width(), SK_Scalar1); |
483 inset = SK_ScalarHalf * SkMinScalar(inset, devRect.height()); | 483 inset = SK_ScalarHalf * SkMinScalar(inset, devRect.height()); |
484 | 484 |
485 if (combinedMatrix.rectStaysRect()) { | 485 if (combinedMatrix.rectStaysRect()) { |
486 // Temporarily #if'ed out. We don't want to pass in the devRect but | 486 // Temporarily #if'ed out. We don't want to pass in the devRect but |
487 // right now it is computed in GrContext::apply_aa_to_rect and we don't | 487 // right now it is computed in GrContext::apply_aa_to_rect and we don't |
488 // want to throw away the work | 488 // want to throw away the work |
489 #if 0 | 489 #if 0 |
490 SkRect devRect; | 490 SkRect devRect; |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
524 // BR | 524 // BR |
525 *((SkPoint*)((intptr_t)fan1Pos + 2 * vsize)) = | 525 *((SkPoint*)((intptr_t)fan1Pos + 2 * vsize)) = |
526 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) - vec[0] - vec[1]; | 526 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) - vec[0] - vec[1]; |
527 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) += vec[0] + vec[1]; | 527 *((SkPoint*)((intptr_t)fan0Pos + 2 * vsize)) += vec[0] + vec[1]; |
528 // TR | 528 // TR |
529 *((SkPoint*)((intptr_t)fan1Pos + 3 * vsize)) = | 529 *((SkPoint*)((intptr_t)fan1Pos + 3 * vsize)) = |
530 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) - vec[0] + vec[1]; | 530 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) - vec[0] + vec[1]; |
531 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) += vec[0] - vec[1]; | 531 *((SkPoint*)((intptr_t)fan0Pos + 3 * vsize)) += vec[0] - vec[1]; |
532 } | 532 } |
533 | 533 |
534 verts += sizeof(GrPoint); | 534 verts += sizeof(SkPoint); |
535 for (int i = 0; i < 4; ++i) { | 535 for (int i = 0; i < 4; ++i) { |
536 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 536 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; |
537 } | 537 } |
538 | 538 |
539 int scale; | 539 int scale; |
540 if (inset < SK_ScalarHalf) { | 540 if (inset < SK_ScalarHalf) { |
541 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); | 541 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); |
542 SkASSERT(scale >= 0 && scale <= 255); | 542 SkASSERT(scale >= 0 && scale <= 255); |
543 } else { | 543 } else { |
544 scale = 0xff; | 544 scale = 0xff; |
(...skipping 19 matching lines...) Expand all Loading... |
564 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, | 564 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, |
565 kVertsPerAAFillRect, | 565 kVertsPerAAFillRect, |
566 kIndicesPerAAFillRect); | 566 kIndicesPerAAFillRect); |
567 target->resetIndexSource(); | 567 target->resetIndexSource(); |
568 } | 568 } |
569 | 569 |
570 namespace { | 570 namespace { |
571 | 571 |
572 // Rotated | 572 // Rotated |
573 struct RectVertex { | 573 struct RectVertex { |
574 GrPoint fPos; | 574 SkPoint fPos; |
575 GrPoint fCenter; | 575 SkPoint fCenter; |
576 GrPoint fDir; | 576 SkPoint fDir; |
577 GrPoint fWidthHeight; | 577 SkPoint fWidthHeight; |
578 }; | 578 }; |
579 | 579 |
580 // Rotated | 580 // Rotated |
581 extern const GrVertexAttrib gAARectVertexAttribs[] = { | 581 extern const GrVertexAttrib gAARectVertexAttribs[] = { |
582 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBind
ing }, | 582 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBind
ing }, |
583 { kVec4f_GrVertexAttribType, sizeof(GrPoint), kEffect_GrVertexAttribBindin
g }, | 583 { kVec4f_GrVertexAttribType, sizeof(SkPoint), kEffect_GrVertexAttribBindin
g }, |
584 { kVec2f_GrVertexAttribType, 3*sizeof(GrPoint), kEffect_GrVertexAttribBindin
g } | 584 { kVec2f_GrVertexAttribType, 3*sizeof(SkPoint), kEffect_GrVertexAttribBindin
g } |
585 }; | 585 }; |
586 | 586 |
587 // Axis Aligned | 587 // Axis Aligned |
588 struct AARectVertex { | 588 struct AARectVertex { |
589 GrPoint fPos; | 589 SkPoint fPos; |
590 GrPoint fOffset; | 590 SkPoint fOffset; |
591 GrPoint fWidthHeight; | 591 SkPoint fWidthHeight; |
592 }; | 592 }; |
593 | 593 |
594 // Axis Aligned | 594 // Axis Aligned |
595 extern const GrVertexAttrib gAAAARectVertexAttribs[] = { | 595 extern const GrVertexAttrib gAAAARectVertexAttribs[] = { |
596 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBind
ing }, | 596 { kVec2f_GrVertexAttribType, 0, kPosition_GrVertexAttribBind
ing }, |
597 { kVec4f_GrVertexAttribType, sizeof(GrPoint), kEffect_GrVertexAttribBindin
g }, | 597 { kVec4f_GrVertexAttribType, sizeof(SkPoint), kEffect_GrVertexAttribBindin
g }, |
598 }; | 598 }; |
599 | 599 |
600 }; | 600 }; |
601 | 601 |
602 void GrAARectRenderer::shaderFillAARect(GrGpu* gpu, | 602 void GrAARectRenderer::shaderFillAARect(GrGpu* gpu, |
603 GrDrawTarget* target, | 603 GrDrawTarget* target, |
604 const SkRect& rect, | 604 const SkRect& rect, |
605 const SkMatrix& combinedMatrix) { | 605 const SkMatrix& combinedMatrix) { |
606 GrDrawState* drawState = target->drawState(); | 606 GrDrawState* drawState = target->drawState(); |
607 | 607 |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 SkRect devRect; | 688 SkRect devRect; |
689 combinedMatrix.mapRect(&devRect, rect); | 689 combinedMatrix.mapRect(&devRect, rect); |
690 | 690 |
691 SkRect devBounds = { | 691 SkRect devBounds = { |
692 devRect.fLeft - SK_ScalarHalf, | 692 devRect.fLeft - SK_ScalarHalf, |
693 devRect.fTop - SK_ScalarHalf, | 693 devRect.fTop - SK_ScalarHalf, |
694 devRect.fRight + SK_ScalarHalf, | 694 devRect.fRight + SK_ScalarHalf, |
695 devRect.fBottom + SK_ScalarHalf | 695 devRect.fBottom + SK_ScalarHalf |
696 }; | 696 }; |
697 | 697 |
698 GrPoint widthHeight = { | 698 SkPoint widthHeight = { |
699 SkScalarHalf(devRect.width()) + SK_ScalarHalf, | 699 SkScalarHalf(devRect.width()) + SK_ScalarHalf, |
700 SkScalarHalf(devRect.height()) + SK_ScalarHalf | 700 SkScalarHalf(devRect.height()) + SK_ScalarHalf |
701 }; | 701 }; |
702 | 702 |
703 verts[0].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fTop); | 703 verts[0].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fTop); |
704 verts[0].fOffset = SkPoint::Make(-widthHeight.fX, -widthHeight.fY); | 704 verts[0].fOffset = SkPoint::Make(-widthHeight.fX, -widthHeight.fY); |
705 verts[0].fWidthHeight = widthHeight; | 705 verts[0].fWidthHeight = widthHeight; |
706 | 706 |
707 verts[1].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fBottom); | 707 verts[1].fPos = SkPoint::Make(devBounds.fLeft, devBounds.fBottom); |
708 verts[1].fOffset = SkPoint::Make(-widthHeight.fX, widthHeight.fY); | 708 verts[1].fOffset = SkPoint::Make(-widthHeight.fX, widthHeight.fY); |
(...skipping 12 matching lines...) Expand all Loading... |
721 target->resetIndexSource(); | 721 target->resetIndexSource(); |
722 } | 722 } |
723 | 723 |
724 void GrAARectRenderer::strokeAARect(GrGpu* gpu, | 724 void GrAARectRenderer::strokeAARect(GrGpu* gpu, |
725 GrDrawTarget* target, | 725 GrDrawTarget* target, |
726 const SkRect& rect, | 726 const SkRect& rect, |
727 const SkMatrix& combinedMatrix, | 727 const SkMatrix& combinedMatrix, |
728 const SkRect& devRect, | 728 const SkRect& devRect, |
729 const SkStrokeRec* stroke, | 729 const SkStrokeRec* stroke, |
730 bool useVertexCoverage) { | 730 bool useVertexCoverage) { |
731 GrVec devStrokeSize; | 731 SkVector devStrokeSize; |
732 SkScalar width = stroke->getWidth(); | 732 SkScalar width = stroke->getWidth(); |
733 if (width > 0) { | 733 if (width > 0) { |
734 devStrokeSize.set(width, width); | 734 devStrokeSize.set(width, width); |
735 combinedMatrix.mapVectors(&devStrokeSize, 1); | 735 combinedMatrix.mapVectors(&devStrokeSize, 1); |
736 devStrokeSize.setAbs(devStrokeSize); | 736 devStrokeSize.setAbs(devStrokeSize); |
737 } else { | 737 } else { |
738 devStrokeSize.set(SK_Scalar1, SK_Scalar1); | 738 devStrokeSize.set(SK_Scalar1, SK_Scalar1); |
739 } | 739 } |
740 | 740 |
741 const SkScalar dx = devStrokeSize.fX; | 741 const SkScalar dx = devStrokeSize.fX; |
742 const SkScalar dy = devStrokeSize.fY; | 742 const SkScalar dy = devStrokeSize.fY; |
743 const SkScalar rx = SkScalarMul(dx, SK_ScalarHalf); | 743 const SkScalar rx = SkScalarMul(dx, SK_ScalarHalf); |
744 const SkScalar ry = SkScalarMul(dy, SK_ScalarHalf); | 744 const SkScalar ry = SkScalarMul(dy, SK_ScalarHalf); |
745 | 745 |
746 // Temporarily #if'ed out. We don't want to pass in the devRect but | 746 // Temporarily #if'ed out. We don't want to pass in the devRect but |
747 // right now it is computed in GrContext::apply_aa_to_rect and we don't | 747 // right now it is computed in GrContext::apply_aa_to_rect and we don't |
748 // want to throw away the work | 748 // want to throw away the work |
749 #if 0 | 749 #if 0 |
750 SkRect devRect; | 750 SkRect devRect; |
751 combinedMatrix.mapRect(&devRect, rect); | 751 combinedMatrix.mapRect(&devRect, rect); |
752 #endif | 752 #endif |
753 | 753 |
754 SkScalar spare; | 754 SkScalar spare; |
755 { | 755 { |
756 SkScalar w = devRect.width() - dx; | 756 SkScalar w = devRect.width() - dx; |
757 SkScalar h = devRect.height() - dy; | 757 SkScalar h = devRect.height() - dy; |
758 spare = GrMin(w, h); | 758 spare = SkTMin(w, h); |
759 } | 759 } |
760 | 760 |
761 SkRect devOutside(devRect); | 761 SkRect devOutside(devRect); |
762 devOutside.outset(rx, ry); | 762 devOutside.outset(rx, ry); |
763 | 763 |
764 bool miterStroke = true; | 764 bool miterStroke = true; |
765 // small miter limit means right angles show bevel... | 765 // small miter limit means right angles show bevel... |
766 if (stroke->getJoin() != SkPaint::kMiter_Join || stroke->getMiter() < SK_Sca
larSqrt2) { | 766 if (stroke->getJoin() != SkPaint::kMiter_Join || stroke->getMiter() < SK_Sca
larSqrt2) { |
767 miterStroke = false; | 767 miterStroke = false; |
768 } | 768 } |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
811 return; | 811 return; |
812 } | 812 } |
813 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu, miterStroke)
; | 813 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(gpu, miterStroke)
; |
814 if (NULL == indexBuffer) { | 814 if (NULL == indexBuffer) { |
815 GrPrintf("Failed to create index buffer!\n"); | 815 GrPrintf("Failed to create index buffer!\n"); |
816 return; | 816 return; |
817 } | 817 } |
818 | 818 |
819 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); | 819 intptr_t verts = reinterpret_cast<intptr_t>(geo.vertices()); |
820 size_t vsize = drawState->getVertexSize(); | 820 size_t vsize = drawState->getVertexSize(); |
821 SkASSERT(sizeof(GrPoint) + sizeof(GrColor) == vsize); | 821 SkASSERT(sizeof(SkPoint) + sizeof(GrColor) == vsize); |
822 | 822 |
823 // We create vertices for four nested rectangles. There are two ramps from 0
to full | 823 // We create vertices for four nested rectangles. There are two ramps from 0
to full |
824 // coverage, one on the exterior of the stroke and the other on the interior
. | 824 // coverage, one on the exterior of the stroke and the other on the interior
. |
825 // The following pointers refer to the four rects, from outermost to innermo
st. | 825 // The following pointers refer to the four rects, from outermost to innermo
st. |
826 GrPoint* fan0Pos = reinterpret_cast<GrPoint*>(verts); | 826 SkPoint* fan0Pos = reinterpret_cast<SkPoint*>(verts); |
827 GrPoint* fan1Pos = reinterpret_cast<GrPoint*>(verts + outerVertexNum * vsize
); | 827 SkPoint* fan1Pos = reinterpret_cast<SkPoint*>(verts + outerVertexNum * vsize
); |
828 GrPoint* fan2Pos = reinterpret_cast<GrPoint*>(verts + 2 * outerVertexNum * v
size); | 828 SkPoint* fan2Pos = reinterpret_cast<SkPoint*>(verts + 2 * outerVertexNum * v
size); |
829 GrPoint* fan3Pos = reinterpret_cast<GrPoint*>(verts + (2 * outerVertexNum +
innerVertexNum) * vsize); | 829 SkPoint* fan3Pos = reinterpret_cast<SkPoint*>(verts + (2 * outerVertexNum +
innerVertexNum) * vsize); |
830 | 830 |
831 #ifndef SK_IGNORE_THIN_STROKED_RECT_FIX | 831 #ifndef SK_IGNORE_THIN_STROKED_RECT_FIX |
832 // TODO: this only really works if the X & Y margins are the same all around | 832 // TODO: this only really works if the X & Y margins are the same all around |
833 // the rect | 833 // the rect |
834 SkScalar inset = SkMinScalar(SK_Scalar1, devOutside.fRight - devInside.fRigh
t); | 834 SkScalar inset = SkMinScalar(SK_Scalar1, devOutside.fRight - devInside.fRigh
t); |
835 inset = SkMinScalar(inset, devInside.fLeft - devOutside.fLeft); | 835 inset = SkMinScalar(inset, devInside.fLeft - devOutside.fLeft); |
836 inset = SkMinScalar(inset, devInside.fTop - devOutside.fTop); | 836 inset = SkMinScalar(inset, devInside.fTop - devOutside.fTop); |
837 if (miterStroke) { | 837 if (miterStroke) { |
838 inset = SK_ScalarHalf * SkMinScalar(inset, devOutside.fBottom - devInsid
e.fBottom); | 838 inset = SK_ScalarHalf * SkMinScalar(inset, devOutside.fBottom - devInsid
e.fBottom); |
839 } else { | 839 } else { |
840 inset = SK_ScalarHalf * SkMinScalar(inset, devOutsideAssist.fBottom - de
vInside.fBottom); | 840 inset = SK_ScalarHalf * SkMinScalar(inset, devOutsideAssist.fBottom - de
vInside.fBottom); |
841 } | 841 } |
842 SkASSERT(inset >= 0); | 842 SkASSERT(inset >= 0); |
843 #else | 843 #else |
844 SkScalar inset = SK_ScalarHalf; | 844 SkScalar inset = SK_ScalarHalf; |
845 #endif | 845 #endif |
846 | 846 |
847 if (miterStroke) { | 847 if (miterStroke) { |
848 // outermost | 848 // outermost |
849 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf
); | 849 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf
); |
850 // inner two | 850 // inner two |
851 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); | 851 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); |
852 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); | 852 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); |
853 // innermost | 853 // innermost |
854 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf
); | 854 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf
); |
855 } else { | 855 } else { |
856 GrPoint* fan0AssistPos = reinterpret_cast<GrPoint*>(verts + 4 * vsize); | 856 SkPoint* fan0AssistPos = reinterpret_cast<SkPoint*>(verts + 4 * vsize); |
857 GrPoint* fan1AssistPos = reinterpret_cast<GrPoint*>(verts + (outerVertex
Num + 4) * vsize); | 857 SkPoint* fan1AssistPos = reinterpret_cast<SkPoint*>(verts + (outerVertex
Num + 4) * vsize); |
858 // outermost | 858 // outermost |
859 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf
); | 859 set_inset_fan(fan0Pos, vsize, devOutside, -SK_ScalarHalf, -SK_ScalarHalf
); |
860 set_inset_fan(fan0AssistPos, vsize, devOutsideAssist, -SK_ScalarHalf, -S
K_ScalarHalf); | 860 set_inset_fan(fan0AssistPos, vsize, devOutsideAssist, -SK_ScalarHalf, -S
K_ScalarHalf); |
861 // outer one of the inner two | 861 // outer one of the inner two |
862 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); | 862 set_inset_fan(fan1Pos, vsize, devOutside, inset, inset); |
863 set_inset_fan(fan1AssistPos, vsize, devOutsideAssist, inset, inset); | 863 set_inset_fan(fan1AssistPos, vsize, devOutsideAssist, inset, inset); |
864 // inner one of the inner two | 864 // inner one of the inner two |
865 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); | 865 set_inset_fan(fan2Pos, vsize, devInside, -inset, -inset); |
866 // innermost | 866 // innermost |
867 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf
); | 867 set_inset_fan(fan3Pos, vsize, devInside, SK_ScalarHalf, SK_ScalarHalf
); |
868 } | 868 } |
869 | 869 |
870 // The outermost rect has 0 coverage | 870 // The outermost rect has 0 coverage |
871 verts += sizeof(GrPoint); | 871 verts += sizeof(SkPoint); |
872 for (int i = 0; i < outerVertexNum; ++i) { | 872 for (int i = 0; i < outerVertexNum; ++i) { |
873 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; | 873 *reinterpret_cast<GrColor*>(verts + i * vsize) = 0; |
874 } | 874 } |
875 | 875 |
876 int scale; | 876 int scale; |
877 if (inset < SK_ScalarHalf) { | 877 if (inset < SK_ScalarHalf) { |
878 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); | 878 scale = SkScalarFloorToInt(512.0f * inset / (inset + SK_ScalarHalf)); |
879 SkASSERT(scale >= 0 && scale <= 255); | 879 SkASSERT(scale >= 0 && scale <= 255); |
880 } else { | 880 } else { |
881 scale = 0xff; | 881 scale = 0xff; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
923 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2)
; | 923 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2)
; |
924 | 924 |
925 if (devInside.isEmpty()) { | 925 if (devInside.isEmpty()) { |
926 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside, use
VertexCoverage); | 926 this->fillAARect(gpu, target, devOutside, SkMatrix::I(), devOutside, use
VertexCoverage); |
927 return; | 927 return; |
928 } | 928 } |
929 | 929 |
930 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, | 930 this->geometryStrokeAARect(gpu, target, devOutside, devOutsideAssist, |
931 devInside, useVertexCoverage, true); | 931 devInside, useVertexCoverage, true); |
932 } | 932 } |
OLD | NEW |