| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "GrInOrderDrawBuffer.h" | 8 #include "GrInOrderDrawBuffer.h" |
| 9 | 9 |
| 10 #include "GrDefaultGeoProcFactory.h" | 10 #include "GrDefaultGeoProcFactory.h" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 | 59 |
| 60 The color param is used to determine whether the opaque hint can be set on t
he draw state. | 60 The color param is used to determine whether the opaque hint can be set on t
he draw state. |
| 61 The caller must populate the vertex colors itself. | 61 The caller must populate the vertex colors itself. |
| 62 | 62 |
| 63 The vertex attrib order is always pos, color, [local coords]. | 63 The vertex attrib order is always pos, color, [local coords]. |
| 64 */ | 64 */ |
| 65 static void set_vertex_attributes(GrDrawState* drawState, bool hasLocalCoords, G
rColor color) { | 65 static void set_vertex_attributes(GrDrawState* drawState, bool hasLocalCoords, G
rColor color) { |
| 66 uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType | | 66 uint32_t flags = GrDefaultGeoProcFactory::kPosition_GPType | |
| 67 GrDefaultGeoProcFactory::kColor_GPType; | 67 GrDefaultGeoProcFactory::kColor_GPType; |
| 68 flags |= hasLocalCoords ? GrDefaultGeoProcFactory::kLocalCoord_GPType : 0; | 68 flags |= hasLocalCoords ? GrDefaultGeoProcFactory::kLocalCoord_GPType : 0; |
| 69 drawState->setGeometryProcessor(GrDefaultGeoProcFactory::CreateAndSetAttribs
(drawState, | 69 drawState->setGeometryProcessor(GrDefaultGeoProcFactory::Create(flags))->unr
ef(); |
| 70
flags))->unref(); | |
| 71 if (0xFF == GrColorUnpackA(color)) { | 70 if (0xFF == GrColorUnpackA(color)) { |
| 72 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); | 71 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); |
| 73 } | 72 } |
| 74 } | 73 } |
| 75 | 74 |
| 76 static bool path_fill_type_is_winding(const GrStencilSettings& pathStencilSettin
gs) { | 75 static bool path_fill_type_is_winding(const GrStencilSettings& pathStencilSettin
gs) { |
| 77 static const GrStencilSettings::Face pathFace = GrStencilSettings::kFront_Fa
ce; | 76 static const GrStencilSettings::Face pathFace = GrStencilSettings::kFront_Fa
ce; |
| 78 bool isWinding = kInvert_StencilOp != pathStencilSettings.passOp(pathFace); | 77 bool isWinding = kInvert_StencilOp != pathStencilSettings.passOp(pathFace); |
| 79 if (isWinding) { | 78 if (isWinding) { |
| 80 // Double check that it is in fact winding. | 79 // Double check that it is in fact winding. |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 | 111 |
| 113 void GrInOrderDrawBuffer::onDrawRect(GrDrawState* ds, | 112 void GrInOrderDrawBuffer::onDrawRect(GrDrawState* ds, |
| 114 const SkRect& rect, | 113 const SkRect& rect, |
| 115 const SkRect* localRect, | 114 const SkRect* localRect, |
| 116 const SkMatrix* localMatrix) { | 115 const SkMatrix* localMatrix) { |
| 117 GrDrawState::AutoRestoreEffects are(ds); | 116 GrDrawState::AutoRestoreEffects are(ds); |
| 118 | 117 |
| 119 GrColor color = ds->getColor(); | 118 GrColor color = ds->getColor(); |
| 120 set_vertex_attributes(ds, SkToBool(localRect), color); | 119 set_vertex_attributes(ds, SkToBool(localRect), color); |
| 121 | 120 |
| 122 AutoReleaseGeometry geo(this, 4, ds->getVertexStride(), 0); | 121 size_t vstride = ds->getGeometryProcessor()->getVertexStride(); |
| 122 SkASSERT(vstride == sizeof(SkPoint) + sizeof(GrColor) + (SkToBool(localRect)
? sizeof(SkPoint) : |
| 123
0)); |
| 124 AutoReleaseGeometry geo(this, 4, vstride, 0); |
| 123 if (!geo.succeeded()) { | 125 if (!geo.succeeded()) { |
| 124 SkDebugf("Failed to get space for vertices!\n"); | 126 SkDebugf("Failed to get space for vertices!\n"); |
| 125 return; | 127 return; |
| 126 } | 128 } |
| 127 | 129 |
| 128 // Go to device coords to allow batching across matrix changes | 130 // Go to device coords to allow batching across matrix changes |
| 129 SkMatrix matrix = ds->getViewMatrix(); | 131 SkMatrix matrix = ds->getViewMatrix(); |
| 130 | 132 |
| 131 // When the caller has provided an explicit source rect for a stage then we
don't want to | 133 // When the caller has provided an explicit source rect for a stage then we
don't want to |
| 132 // modify that stage's matrix. Otherwise if the effect is generating its sou
rce rect from | 134 // modify that stage's matrix. Otherwise if the effect is generating its sou
rce rect from |
| 133 // the vertex positions then we have to account for the view matrix change. | 135 // the vertex positions then we have to account for the view matrix change. |
| 134 GrDrawState::AutoViewMatrixRestore avmr; | 136 GrDrawState::AutoViewMatrixRestore avmr; |
| 135 if (!avmr.setIdentity(ds)) { | 137 if (!avmr.setIdentity(ds)) { |
| 136 return; | 138 return; |
| 137 } | 139 } |
| 138 | 140 |
| 139 size_t vstride = ds->getVertexStride(); | |
| 140 | |
| 141 geo.positions()->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom
, vstride); | 141 geo.positions()->setRectFan(rect.fLeft, rect.fTop, rect.fRight, rect.fBottom
, vstride); |
| 142 matrix.mapPointsWithStride(geo.positions(), vstride, 4); | 142 matrix.mapPointsWithStride(geo.positions(), vstride, 4); |
| 143 | 143 |
| 144 SkRect devBounds; | 144 SkRect devBounds; |
| 145 // since we already computed the dev verts, set the bounds hint. This will h
elp us avoid | 145 // since we already computed the dev verts, set the bounds hint. This will h
elp us avoid |
| 146 // unnecessary clipping in our onDraw(). | 146 // unnecessary clipping in our onDraw(). |
| 147 get_vertex_bounds(geo.vertices(), vstride, 4, &devBounds); | 147 get_vertex_bounds(geo.vertices(), vstride, 4, &devBounds); |
| 148 | 148 |
| 149 if (localRect) { | 149 if (localRect) { |
| 150 static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor); | 150 static const int kLocalOffset = sizeof(SkPoint) + sizeof(GrColor); |
| (...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 502 | 502 |
| 503 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { | 503 void GrInOrderDrawBuffer::recordTraceMarkersIfNecessary() { |
| 504 SkASSERT(!fCmdBuffer.empty()); | 504 SkASSERT(!fCmdBuffer.empty()); |
| 505 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); | 505 SkASSERT(!cmd_has_trace_marker(fCmdBuffer.back().fType)); |
| 506 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); | 506 const GrTraceMarkerSet& activeTraceMarkers = this->getActiveTraceMarkers(); |
| 507 if (activeTraceMarkers.count() > 0) { | 507 if (activeTraceMarkers.count() > 0) { |
| 508 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); | 508 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); |
| 509 fGpuCmdMarkers.push_back(activeTraceMarkers); | 509 fGpuCmdMarkers.push_back(activeTraceMarkers); |
| 510 } | 510 } |
| 511 } | 511 } |
| OLD | NEW |