| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 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 "GrContext.h" | 9 #include "GrContext.h" |
| 10 | 10 |
| (...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 SkMatrix inverse; | 606 SkMatrix inverse; |
| 607 SkTCopyOnFirstWrite<GrPaint> paint(origPaint); | 607 SkTCopyOnFirstWrite<GrPaint> paint(origPaint); |
| 608 AutoMatrix am; | 608 AutoMatrix am; |
| 609 GR_CREATE_TRACE_MARKER_CONTEXT("GrContext::drawPaint", this); | 609 GR_CREATE_TRACE_MARKER_CONTEXT("GrContext::drawPaint", this); |
| 610 | 610 |
| 611 // We attempt to map r by the inverse matrix and draw that. mapRect will | 611 // We attempt to map r by the inverse matrix and draw that. mapRect will |
| 612 // map the four corners and bound them with a new rect. This will not | 612 // map the four corners and bound them with a new rect. This will not |
| 613 // produce a correct result for some perspective matrices. | 613 // produce a correct result for some perspective matrices. |
| 614 if (!this->getMatrix().hasPerspective()) { | 614 if (!this->getMatrix().hasPerspective()) { |
| 615 if (!fViewMatrix.invert(&inverse)) { | 615 if (!fViewMatrix.invert(&inverse)) { |
| 616 GrPrintf("Could not invert matrix\n"); | 616 SkDebugf("Could not invert matrix\n"); |
| 617 return; | 617 return; |
| 618 } | 618 } |
| 619 inverse.mapRect(&r); | 619 inverse.mapRect(&r); |
| 620 } else { | 620 } else { |
| 621 if (!am.setIdentity(this, paint.writable())) { | 621 if (!am.setIdentity(this, paint.writable())) { |
| 622 GrPrintf("Could not invert matrix\n"); | 622 SkDebugf("Could not invert matrix\n"); |
| 623 return; | 623 return; |
| 624 } | 624 } |
| 625 } | 625 } |
| 626 // by definition this fills the entire clip, no need for AA | 626 // by definition this fills the entire clip, no need for AA |
| 627 if (paint->isAntiAlias()) { | 627 if (paint->isAntiAlias()) { |
| 628 paint.writable()->setAntiAlias(false); | 628 paint.writable()->setAntiAlias(false); |
| 629 } | 629 } |
| 630 this->drawRect(*paint, r); | 630 this->drawRect(*paint, r); |
| 631 } | 631 } |
| 632 | 632 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 654 verts[3].set(rect.fRight + rad, rect.fTop - rad); | 654 verts[3].set(rect.fRight + rad, rect.fTop - rad); |
| 655 verts[4].set(rect.fRight - rad, rect.fBottom - rad); | 655 verts[4].set(rect.fRight - rad, rect.fBottom - rad); |
| 656 verts[5].set(rect.fRight + rad, rect.fBottom + rad); | 656 verts[5].set(rect.fRight + rad, rect.fBottom + rad); |
| 657 verts[6].set(rect.fLeft + rad, rect.fBottom - rad); | 657 verts[6].set(rect.fLeft + rad, rect.fBottom - rad); |
| 658 verts[7].set(rect.fLeft - rad, rect.fBottom + rad); | 658 verts[7].set(rect.fLeft - rad, rect.fBottom + rad); |
| 659 verts[8] = verts[0]; | 659 verts[8] = verts[0]; |
| 660 verts[9] = verts[1]; | 660 verts[9] = verts[1]; |
| 661 } | 661 } |
| 662 | 662 |
| 663 static inline bool is_irect(const SkRect& r) { | 663 static inline bool is_irect(const SkRect& r) { |
| 664 return SkScalarIsInt(r.fLeft) && SkScalarIsInt(r.fTop) &&» | 664 return SkScalarIsInt(r.fLeft) && SkScalarIsInt(r.fTop) && |
| 665 SkScalarIsInt(r.fRight) && SkScalarIsInt(r.fBottom);» | 665 SkScalarIsInt(r.fRight) && SkScalarIsInt(r.fBottom); |
| 666 } | 666 } |
| 667 | 667 |
| 668 static bool apply_aa_to_rect(GrDrawTarget* target, | 668 static bool apply_aa_to_rect(GrDrawTarget* target, |
| 669 const SkRect& rect, | 669 const SkRect& rect, |
| 670 SkScalar strokeWidth, | 670 SkScalar strokeWidth, |
| 671 const SkMatrix& combinedMatrix, | 671 const SkMatrix& combinedMatrix, |
| 672 SkRect* devBoundRect) { | 672 SkRect* devBoundRect) { |
| 673 if (!target->getDrawState().canTweakAlphaForCoverage() && | 673 if (!target->getDrawState().canTweakAlphaForCoverage() && |
| 674 target->shouldDisableCoverageAAForBlend()) { | 674 target->shouldDisableCoverageAAForBlend()) { |
| 675 #ifdef SK_DEBUG | 675 #ifdef SK_DEBUG |
| 676 //GrPrintf("Turning off AA to correctly apply blend.\n"); | 676 //SkDebugf("Turning off AA to correctly apply blend.\n"); |
| 677 #endif | 677 #endif |
| 678 return false; | 678 return false; |
| 679 } | 679 } |
| 680 const GrDrawState& drawState = target->getDrawState(); | 680 const GrDrawState& drawState = target->getDrawState(); |
| 681 if (drawState.getRenderTarget()->isMultisampled()) { | 681 if (drawState.getRenderTarget()->isMultisampled()) { |
| 682 return false; | 682 return false; |
| 683 } | 683 } |
| 684 | 684 |
| 685 #if defined(SHADER_AA_FILL_RECT) || !defined(IGNORE_ROT_AA_RECT_OPT) | 685 #if defined(SHADER_AA_FILL_RECT) || !defined(IGNORE_ROT_AA_RECT_OPT) |
| 686 if (strokeWidth >= 0) { | 686 if (strokeWidth >= 0) { |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 if (width >= 0) { | 793 if (width >= 0) { |
| 794 // TODO: consider making static vertex buffers for these cases. | 794 // TODO: consider making static vertex buffers for these cases. |
| 795 // Hairline could be done by just adding closing vertex to | 795 // Hairline could be done by just adding closing vertex to |
| 796 // unitSquareVertexBuffer() | 796 // unitSquareVertexBuffer() |
| 797 | 797 |
| 798 static const int worstCaseVertCount = 10; | 798 static const int worstCaseVertCount = 10; |
| 799 target->drawState()->setDefaultVertexAttribs(); | 799 target->drawState()->setDefaultVertexAttribs(); |
| 800 GrDrawTarget::AutoReleaseGeometry geo(target, worstCaseVertCount, 0); | 800 GrDrawTarget::AutoReleaseGeometry geo(target, worstCaseVertCount, 0); |
| 801 | 801 |
| 802 if (!geo.succeeded()) { | 802 if (!geo.succeeded()) { |
| 803 GrPrintf("Failed to get space for vertices!\n"); | 803 SkDebugf("Failed to get space for vertices!\n"); |
| 804 return; | 804 return; |
| 805 } | 805 } |
| 806 | 806 |
| 807 GrPrimitiveType primType; | 807 GrPrimitiveType primType; |
| 808 int vertCount; | 808 int vertCount; |
| 809 SkPoint* vertex = geo.positions(); | 809 SkPoint* vertex = geo.positions(); |
| 810 | 810 |
| 811 if (width > 0) { | 811 if (width > 0) { |
| 812 vertCount = 10; | 812 vertCount = 10; |
| 813 primType = kTriangleStrip_GrPrimitiveType; | 813 primType = kTriangleStrip_GrPrimitiveType; |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 909 GrDrawState* drawState = target->drawState(); | 909 GrDrawState* drawState = target->drawState(); |
| 910 | 910 |
| 911 GR_CREATE_TRACE_MARKER("GrContext::drawVertices", target); | 911 GR_CREATE_TRACE_MARKER("GrContext::drawVertices", target); |
| 912 | 912 |
| 913 int colorOffset = -1, texOffset = -1; | 913 int colorOffset = -1, texOffset = -1; |
| 914 set_vertex_attributes(drawState, texCoords, colors, &colorOffset, &texOffset
); | 914 set_vertex_attributes(drawState, texCoords, colors, &colorOffset, &texOffset
); |
| 915 | 915 |
| 916 size_t VertexStride = drawState->getVertexStride(); | 916 size_t VertexStride = drawState->getVertexStride(); |
| 917 if (sizeof(SkPoint) != VertexStride) { | 917 if (sizeof(SkPoint) != VertexStride) { |
| 918 if (!geo.set(target, vertexCount, 0)) { | 918 if (!geo.set(target, vertexCount, 0)) { |
| 919 GrPrintf("Failed to get space for vertices!\n"); | 919 SkDebugf("Failed to get space for vertices!\n"); |
| 920 return; | 920 return; |
| 921 } | 921 } |
| 922 void* curVertex = geo.vertices(); | 922 void* curVertex = geo.vertices(); |
| 923 | 923 |
| 924 for (int i = 0; i < vertexCount; ++i) { | 924 for (int i = 0; i < vertexCount; ++i) { |
| 925 *((SkPoint*)curVertex) = positions[i]; | 925 *((SkPoint*)curVertex) = positions[i]; |
| 926 | 926 |
| 927 if (texOffset >= 0) { | 927 if (texOffset >= 0) { |
| 928 *(SkPoint*)((intptr_t)curVertex + texOffset) = texCoords[i]; | 928 *(SkPoint*)((intptr_t)curVertex + texOffset) = texCoords[i]; |
| 929 } | 929 } |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1226 } | 1226 } |
| 1227 } | 1227 } |
| 1228 } | 1228 } |
| 1229 | 1229 |
| 1230 // This time, allow SW renderer | 1230 // This time, allow SW renderer |
| 1231 pr = this->getPathRenderer(*pathPtr, *stroke, target, true, type); | 1231 pr = this->getPathRenderer(*pathPtr, *stroke, target, true, type); |
| 1232 } | 1232 } |
| 1233 | 1233 |
| 1234 if (NULL == pr) { | 1234 if (NULL == pr) { |
| 1235 #ifdef SK_DEBUG | 1235 #ifdef SK_DEBUG |
| 1236 GrPrintf("Unable to find path renderer compatible with path.\n"); | 1236 SkDebugf("Unable to find path renderer compatible with path.\n"); |
| 1237 #endif | 1237 #endif |
| 1238 return; | 1238 return; |
| 1239 } | 1239 } |
| 1240 | 1240 |
| 1241 pr->drawPath(*pathPtr, *stroke, target, useCoverageAA); | 1241 pr->drawPath(*pathPtr, *stroke, target, useCoverageAA); |
| 1242 } | 1242 } |
| 1243 | 1243 |
| 1244 //////////////////////////////////////////////////////////////////////////////// | 1244 //////////////////////////////////////////////////////////////////////////////// |
| 1245 | 1245 |
| 1246 void GrContext::flush(int flagsBitfield) { | 1246 void GrContext::flush(int flagsBitfield) { |
| (...skipping 365 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1612 } | 1612 } |
| 1613 ASSERT_OWNED_RESOURCE(fRenderTarget.get()); | 1613 ASSERT_OWNED_RESOURCE(fRenderTarget.get()); |
| 1614 if (paint) { | 1614 if (paint) { |
| 1615 SkASSERT(are); | 1615 SkASSERT(are); |
| 1616 SkASSERT(acf); | 1616 SkASSERT(acf); |
| 1617 are->set(fDrawState); | 1617 are->set(fDrawState); |
| 1618 fDrawState->setFromPaint(*paint, fViewMatrix, fRenderTarget.get()); | 1618 fDrawState->setFromPaint(*paint, fViewMatrix, fRenderTarget.get()); |
| 1619 #if GR_DEBUG_PARTIAL_COVERAGE_CHECK | 1619 #if GR_DEBUG_PARTIAL_COVERAGE_CHECK |
| 1620 if ((paint->hasMask() || 0xff != paint->fCoverage) && | 1620 if ((paint->hasMask() || 0xff != paint->fCoverage) && |
| 1621 !fDrawState->couldApplyCoverage(fGpu->caps())) { | 1621 !fDrawState->couldApplyCoverage(fGpu->caps())) { |
| 1622 GrPrintf("Partial pixel coverage will be incorrectly blended.\n"); | 1622 SkDebugf("Partial pixel coverage will be incorrectly blended.\n"); |
| 1623 } | 1623 } |
| 1624 #endif | 1624 #endif |
| 1625 // Clear any vertex attributes configured for the previous use of the | 1625 // Clear any vertex attributes configured for the previous use of the |
| 1626 // GrDrawState which can effect which blend optimizations are in effect. | 1626 // GrDrawState which can effect which blend optimizations are in effect. |
| 1627 fDrawState->setDefaultVertexAttribs(); | 1627 fDrawState->setDefaultVertexAttribs(); |
| 1628 } else { | 1628 } else { |
| 1629 fDrawState->reset(fViewMatrix); | 1629 fDrawState->reset(fViewMatrix); |
| 1630 fDrawState->setRenderTarget(fRenderTarget.get()); | 1630 fDrawState->setRenderTarget(fRenderTarget.get()); |
| 1631 } | 1631 } |
| 1632 GrDrawTarget* target; | 1632 GrDrawTarget* target; |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1801 fResourceCache->printStats(); | 1801 fResourceCache->printStats(); |
| 1802 } | 1802 } |
| 1803 #endif | 1803 #endif |
| 1804 | 1804 |
| 1805 #if GR_GPU_STATS | 1805 #if GR_GPU_STATS |
| 1806 const GrContext::GPUStats* GrContext::gpuStats() const { | 1806 const GrContext::GPUStats* GrContext::gpuStats() const { |
| 1807 return fGpu->gpuStats(); | 1807 return fGpu->gpuStats(); |
| 1808 } | 1808 } |
| 1809 #endif | 1809 #endif |
| 1810 | 1810 |
| OLD | NEW |