| 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 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 | 618 |
| 619 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } | 619 SkSTArray<1, Geometry, true>* geoData() { return &fGeoData; } |
| 620 | 620 |
| 621 private: | 621 private: |
| 622 StrokeRectBatch(const Geometry& geometry) { | 622 StrokeRectBatch(const Geometry& geometry) { |
| 623 this->initClassID<StrokeRectBatch>(); | 623 this->initClassID<StrokeRectBatch>(); |
| 624 | 624 |
| 625 fBatch.fHairline = geometry.fStrokeWidth == 0; | 625 fBatch.fHairline = geometry.fStrokeWidth == 0; |
| 626 | 626 |
| 627 fGeoData.push_back(geometry); | 627 fGeoData.push_back(geometry); |
| 628 |
| 629 // setup bounds |
| 630 this->setBounds(geometry.fRect); |
| 631 SkScalar rad = SkScalarHalf(geometry.fStrokeWidth); |
| 632 this->getBounds()->outset(rad, rad); |
| 633 geometry.fViewMatrix.mapRect(this->getBounds()); |
| 628 } | 634 } |
| 629 | 635 |
| 630 /* create a triangle strip that strokes the specified rect. There are 8 | 636 /* create a triangle strip that strokes the specified rect. There are 8 |
| 631 unique vertices, but we repeat the last 2 to close up. Alternatively we | 637 unique vertices, but we repeat the last 2 to close up. Alternatively we |
| 632 could use an indices array, and then only send 8 verts, but not sure that | 638 could use an indices array, and then only send 8 verts, but not sure that |
| 633 would be faster. | 639 would be faster. |
| 634 */ | 640 */ |
| 635 void setStrokeRectStrip(SkPoint verts[10], const SkRect& rect, SkScalar widt
h) { | 641 void setStrokeRectStrip(SkPoint verts[10], const SkRect& rect, SkScalar widt
h) { |
| 636 const SkScalar rad = SkScalarHalf(width); | 642 const SkScalar rad = SkScalarHalf(width); |
| 637 // TODO we should be able to enable this assert, but we'd have to filter
these draws | 643 // TODO we should be able to enable this assert, but we'd have to filter
these draws |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 768 | 774 |
| 769 if (width >= 0) { | 775 if (width >= 0) { |
| 770 StrokeRectBatch::Geometry geometry; | 776 StrokeRectBatch::Geometry geometry; |
| 771 geometry.fViewMatrix = viewMatrix; | 777 geometry.fViewMatrix = viewMatrix; |
| 772 geometry.fColor = color; | 778 geometry.fColor = color; |
| 773 geometry.fRect = rect; | 779 geometry.fRect = rect; |
| 774 geometry.fStrokeWidth = width; | 780 geometry.fStrokeWidth = width; |
| 775 | 781 |
| 776 SkAutoTUnref<GrBatch> batch(StrokeRectBatch::Create(geometry)); | 782 SkAutoTUnref<GrBatch> batch(StrokeRectBatch::Create(geometry)); |
| 777 | 783 |
| 778 SkRect bounds = rect; | |
| 779 SkScalar rad = SkScalarHalf(width); | |
| 780 bounds.outset(rad, rad); | |
| 781 viewMatrix.mapRect(&bounds); | |
| 782 // Depending on sub-pixel coordinates and the particular GPU, we may los
e a corner of | 784 // Depending on sub-pixel coordinates and the particular GPU, we may los
e a corner of |
| 783 // hairline rects. We jam all the vertices to pixel centers to avoid thi
s, but not when MSAA | 785 // hairline rects. We jam all the vertices to pixel centers to avoid thi
s, but not when MSAA |
| 784 // is enabled because it can cause ugly artifacts. | 786 // is enabled because it can cause ugly artifacts. |
| 785 pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCenters_
Flag, | 787 pipelineBuilder.setState(GrPipelineBuilder::kSnapVerticesToPixelCenters_
Flag, |
| 786 0 == width && !rt->isMultisampled()); | 788 0 == width && !rt->isMultisampled()); |
| 787 target->drawBatch(&pipelineBuilder, batch, &bounds); | 789 target->drawBatch(&pipelineBuilder, batch); |
| 788 } else { | 790 } else { |
| 789 // filled BW rect | 791 // filled BW rect |
| 790 target->drawSimpleRect(&pipelineBuilder, color, viewMatrix, rect); | 792 target->drawSimpleRect(&pipelineBuilder, color, viewMatrix, rect); |
| 791 } | 793 } |
| 792 } | 794 } |
| 793 | 795 |
| 794 void GrContext::drawNonAARectToRect(GrRenderTarget* rt, | 796 void GrContext::drawNonAARectToRect(GrRenderTarget* rt, |
| 795 const GrClip& clip, | 797 const GrClip& clip, |
| 796 const GrPaint& paint, | 798 const GrPaint& paint, |
| 797 const SkMatrix& viewMatrix, | 799 const SkMatrix& viewMatrix, |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1015 | 1017 |
| 1016 if (localCoords) { | 1018 if (localCoords) { |
| 1017 installedGeo.fLocalCoords.append(vertexCount, localCoords); | 1019 installedGeo.fLocalCoords.append(vertexCount, localCoords); |
| 1018 fBatch.fHasLocalCoords = true; | 1020 fBatch.fHasLocalCoords = true; |
| 1019 } else { | 1021 } else { |
| 1020 fBatch.fHasLocalCoords = false; | 1022 fBatch.fHasLocalCoords = false; |
| 1021 } | 1023 } |
| 1022 fBatch.fVertexCount = vertexCount; | 1024 fBatch.fVertexCount = vertexCount; |
| 1023 fBatch.fIndexCount = indexCount; | 1025 fBatch.fIndexCount = indexCount; |
| 1024 fBatch.fPrimitiveType = primitiveType; | 1026 fBatch.fPrimitiveType = primitiveType; |
| 1027 |
| 1028 // TODO figure out bounds |
| 1029 this->setBoundsLargest(); |
| 1025 } | 1030 } |
| 1026 | 1031 |
| 1027 GrPrimitiveType primitiveType() const { return fBatch.fPrimitiveType; } | 1032 GrPrimitiveType primitiveType() const { return fBatch.fPrimitiveType; } |
| 1028 bool batchablePrimitiveType() const { | 1033 bool batchablePrimitiveType() const { |
| 1029 return kTriangles_GrPrimitiveType == fBatch.fPrimitiveType || | 1034 return kTriangles_GrPrimitiveType == fBatch.fPrimitiveType || |
| 1030 kLines_GrPrimitiveType == fBatch.fPrimitiveType || | 1035 kLines_GrPrimitiveType == fBatch.fPrimitiveType || |
| 1031 kPoints_GrPrimitiveType == fBatch.fPrimitiveType; | 1036 kPoints_GrPrimitiveType == fBatch.fPrimitiveType; |
| 1032 } | 1037 } |
| 1033 GrColor color() const { return fBatch.fColor; } | 1038 GrColor color() const { return fBatch.fColor; } |
| 1034 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } | 1039 bool usesLocalCoords() const { return fBatch.fUsesLocalCoords; } |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1069 if (!this->hasColors() && this->color() != that->color()) { | 1074 if (!this->hasColors() && this->color() != that->color()) { |
| 1070 return false; | 1075 return false; |
| 1071 } | 1076 } |
| 1072 | 1077 |
| 1073 if (this->color() != that->color()) { | 1078 if (this->color() != that->color()) { |
| 1074 fBatch.fColor = GrColor_ILLEGAL; | 1079 fBatch.fColor = GrColor_ILLEGAL; |
| 1075 } | 1080 } |
| 1076 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; | 1081 fGeoData.push_back_n(that->geoData()->count(), that->geoData()->begin())
; |
| 1077 fBatch.fVertexCount += that->vertexCount(); | 1082 fBatch.fVertexCount += that->vertexCount(); |
| 1078 fBatch.fIndexCount += that->indexCount(); | 1083 fBatch.fIndexCount += that->indexCount(); |
| 1084 |
| 1085 this->joinBounds(that->bounds()); |
| 1079 return true; | 1086 return true; |
| 1080 } | 1087 } |
| 1081 | 1088 |
| 1082 struct BatchTracker { | 1089 struct BatchTracker { |
| 1083 GrPrimitiveType fPrimitiveType; | 1090 GrPrimitiveType fPrimitiveType; |
| 1084 SkMatrix fViewMatrix; | 1091 SkMatrix fViewMatrix; |
| 1085 GrColor fColor; | 1092 GrColor fColor; |
| 1086 bool fUsesLocalCoords; | 1093 bool fUsesLocalCoords; |
| 1087 bool fColorIgnored; | 1094 bool fColorIgnored; |
| 1088 bool fCoverageIgnored; | 1095 bool fCoverageIgnored; |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1119 | 1126 |
| 1120 GR_CREATE_TRACE_MARKER("GrContext::drawVertices", target); | 1127 GR_CREATE_TRACE_MARKER("GrContext::drawVertices", target); |
| 1121 | 1128 |
| 1122 DrawVerticesBatch::Geometry geometry; | 1129 DrawVerticesBatch::Geometry geometry; |
| 1123 geometry.fColor = paint.getColor(); | 1130 geometry.fColor = paint.getColor(); |
| 1124 | 1131 |
| 1125 SkAutoTUnref<GrBatch> batch(DrawVerticesBatch::Create(geometry, primitiveTyp
e, viewMatrix, | 1132 SkAutoTUnref<GrBatch> batch(DrawVerticesBatch::Create(geometry, primitiveTyp
e, viewMatrix, |
| 1126 positions, vertexCount
, indices, | 1133 positions, vertexCount
, indices, |
| 1127 indexCount,colors, tex
Coords)); | 1134 indexCount,colors, tex
Coords)); |
| 1128 | 1135 |
| 1129 // TODO figure out bounds | 1136 target->drawBatch(&pipelineBuilder, batch); |
| 1130 target->drawBatch(&pipelineBuilder, batch, NULL); | |
| 1131 } | 1137 } |
| 1132 | 1138 |
| 1133 /////////////////////////////////////////////////////////////////////////////// | 1139 /////////////////////////////////////////////////////////////////////////////// |
| 1134 | 1140 |
| 1135 void GrContext::drawRRect(GrRenderTarget*rt, | 1141 void GrContext::drawRRect(GrRenderTarget*rt, |
| 1136 const GrClip& clip, | 1142 const GrClip& clip, |
| 1137 const GrPaint& paint, | 1143 const GrPaint& paint, |
| 1138 const SkMatrix& viewMatrix, | 1144 const SkMatrix& viewMatrix, |
| 1139 const SkRRect& rrect, | 1145 const SkRRect& rrect, |
| 1140 const GrStrokeInfo& strokeInfo) { | 1146 const GrStrokeInfo& strokeInfo) { |
| (...skipping 867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2008 } | 2014 } |
| 2009 } | 2015 } |
| 2010 | 2016 |
| 2011 void GrContext::removeGpuTraceMarker(const GrGpuTraceMarker* marker) { | 2017 void GrContext::removeGpuTraceMarker(const GrGpuTraceMarker* marker) { |
| 2012 fGpu->removeGpuTraceMarker(marker); | 2018 fGpu->removeGpuTraceMarker(marker); |
| 2013 if (fDrawBuffer) { | 2019 if (fDrawBuffer) { |
| 2014 fDrawBuffer->removeGpuTraceMarker(marker); | 2020 fDrawBuffer->removeGpuTraceMarker(marker); |
| 2015 } | 2021 } |
| 2016 } | 2022 } |
| 2017 | 2023 |
| OLD | NEW |