Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Side by Side Diff: src/gpu/GrAARectRenderer.cpp

Issue 732693002: Drawstate on stack (Closed) Base URL: https://skia.googlesource.com/skia.git@real_def_gp
Patch Set: tiny fix Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/GrAARectRenderer.h ('k') | src/gpu/GrBitmapTextContext.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "GrDefaultGeoProcFactory.h" 9 #include "GrDefaultGeoProcFactory.h"
10 #include "GrGeometryProcessor.h" 10 #include "GrGeometryProcessor.h"
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 fGpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx, 170 fGpu->createInstancedIndexBuffer(gBevelStrokeAARectIdx,
171 kIndicesPerBevelStrokeRect, 171 kIndicesPerBevelStrokeRect,
172 kNumBevelStrokeRectsInIndex Buffer, 172 kNumBevelStrokeRectsInIndex Buffer,
173 kVertsPerBevelStrokeRect); 173 kVertsPerBevelStrokeRect);
174 } 174 }
175 return fAABevelStrokeRectIndexBuffer; 175 return fAABevelStrokeRectIndexBuffer;
176 } 176 }
177 } 177 }
178 178
179 void GrAARectRenderer::geometryFillAARect(GrDrawTarget* target, 179 void GrAARectRenderer::geometryFillAARect(GrDrawTarget* target,
180 GrDrawState* drawState,
180 const SkRect& rect, 181 const SkRect& rect,
181 const SkMatrix& combinedMatrix, 182 const SkMatrix& combinedMatrix,
182 const SkRect& devRect) { 183 const SkRect& devRect) {
183 GrDrawState* drawState = target->drawState();
184 GrDrawState::AutoRestoreEffects are(drawState); 184 GrDrawState::AutoRestoreEffects are(drawState);
185 185
186 GrColor color = drawState->getColor(); 186 GrColor color = drawState->getColor();
187 187
188 CoverageAttribType covAttribType = set_rect_attribs(drawState); 188 CoverageAttribType covAttribType = set_rect_attribs(drawState);
189 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo r)) { 189 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo r)) {
190 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); 190 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true);
191 } 191 }
192 192
193 GrDrawTarget::AutoReleaseGeometry geo(target, 8, 0); 193 GrDrawTarget::AutoReleaseGeometry geo(target, 8, drawState->getVertexStride( ), 0);
194 if (!geo.succeeded()) { 194 if (!geo.succeeded()) {
195 SkDebugf("Failed to get space for vertices!\n"); 195 SkDebugf("Failed to get space for vertices!\n");
196 return; 196 return;
197 } 197 }
198 198
199 if (NULL == fAAFillRectIndexBuffer) { 199 if (NULL == fAAFillRectIndexBuffer) {
200 fAAFillRectIndexBuffer = fGpu->createInstancedIndexBuffer(gFillAARectIdx , 200 fAAFillRectIndexBuffer = fGpu->createInstancedIndexBuffer(gFillAARectIdx ,
201 kIndicesPerAAF illRect, 201 kIndicesPerAAF illRect,
202 kNumAAFillRect sInIndexBuffer, 202 kNumAAFillRect sInIndexBuffer,
203 kVertsPerAAFil lRect); 203 kVertsPerAAFil lRect);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
293 for (int i = 0; i < 4; ++i) { 293 for (int i = 0; i < 4; ++i) {
294 if (kUseCoverage_CoverageAttribType == covAttribType) { 294 if (kUseCoverage_CoverageAttribType == covAttribType) {
295 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; 295 *reinterpret_cast<GrColor*>(verts + i * vstride) = color;
296 *reinterpret_cast<float*>(verts + i * vstride + sizeof(GrColor)) = i nnerCoverage; 296 *reinterpret_cast<float*>(verts + i * vstride + sizeof(GrColor)) = i nnerCoverage;
297 } else { 297 } else {
298 *reinterpret_cast<GrColor*>(verts + i * vstride) = scaledColor; 298 *reinterpret_cast<GrColor*>(verts + i * vstride) = scaledColor;
299 } 299 }
300 } 300 }
301 301
302 target->setIndexSourceToBuffer(indexBuffer); 302 target->setIndexSourceToBuffer(indexBuffer);
303 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 303 target->drawIndexedInstances(drawState,
304 kTriangles_GrPrimitiveType,
305 1,
304 kVertsPerAAFillRect, 306 kVertsPerAAFillRect,
305 kIndicesPerAAFillRect); 307 kIndicesPerAAFillRect);
306 target->resetIndexSource(); 308 target->resetIndexSource();
307 } 309 }
308 310
309 void GrAARectRenderer::strokeAARect(GrDrawTarget* target, 311 void GrAARectRenderer::strokeAARect(GrDrawTarget* target,
312 GrDrawState* drawState,
310 const SkRect& rect, 313 const SkRect& rect,
311 const SkMatrix& combinedMatrix, 314 const SkMatrix& combinedMatrix,
312 const SkRect& devRect, 315 const SkRect& devRect,
313 const SkStrokeRec& stroke) { 316 const SkStrokeRec& stroke) {
314 SkVector devStrokeSize; 317 SkVector devStrokeSize;
315 SkScalar width = stroke.getWidth(); 318 SkScalar width = stroke.getWidth();
316 if (width > 0) { 319 if (width > 0) {
317 devStrokeSize.set(width, width); 320 devStrokeSize.set(width, width);
318 combinedMatrix.mapVectors(&devStrokeSize, 1); 321 combinedMatrix.mapVectors(&devStrokeSize, 1);
319 devStrokeSize.setAbs(devStrokeSize); 322 devStrokeSize.setAbs(devStrokeSize);
(...skipping 26 matching lines...) Expand all
346 349
347 bool miterStroke = true; 350 bool miterStroke = true;
348 // For hairlines, make bevel and round joins appear the same as mitered ones . 351 // For hairlines, make bevel and round joins appear the same as mitered ones .
349 // small miter limit means right angles show bevel... 352 // small miter limit means right angles show bevel...
350 if ((width > 0) && (stroke.getJoin() != SkPaint::kMiter_Join || 353 if ((width > 0) && (stroke.getJoin() != SkPaint::kMiter_Join ||
351 stroke.getMiter() < SK_ScalarSqrt2)) { 354 stroke.getMiter() < SK_ScalarSqrt2)) {
352 miterStroke = false; 355 miterStroke = false;
353 } 356 }
354 357
355 if (spare <= 0 && miterStroke) { 358 if (spare <= 0 && miterStroke) {
356 this->fillAARect(target, devOutside, SkMatrix::I(), devOutside); 359 this->fillAARect(target, drawState, devOutside, SkMatrix::I(), devOutsid e);
357 return; 360 return;
358 } 361 }
359 362
360 SkRect devInside(devRect); 363 SkRect devInside(devRect);
361 devInside.inset(rx, ry); 364 devInside.inset(rx, ry);
362 365
363 SkRect devOutsideAssist(devRect); 366 SkRect devOutsideAssist(devRect);
364 367
365 // For bevel-stroke, use 2 SkRect instances(devOutside and devOutsideAssist) 368 // For bevel-stroke, use 2 SkRect instances(devOutside and devOutsideAssist)
366 // to draw the outer of the rect. Because there are 8 vertices on the outer 369 // to draw the outer of the rect. Because there are 8 vertices on the outer
367 // edge, while vertex number of inner edge is 4, the same as miter-stroke. 370 // edge, while vertex number of inner edge is 4, the same as miter-stroke.
368 if (!miterStroke) { 371 if (!miterStroke) {
369 devOutside.inset(0, ry); 372 devOutside.inset(0, ry);
370 devOutsideAssist.outset(0, ry); 373 devOutsideAssist.outset(0, ry);
371 } 374 }
372 375
373 this->geometryStrokeAARect(target, devOutside, devOutsideAssist, devInside, miterStroke); 376 this->geometryStrokeAARect(target, drawState, devOutside, devOutsideAssist, devInside,
377 miterStroke);
374 } 378 }
375 379
376 void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target, 380 void GrAARectRenderer::geometryStrokeAARect(GrDrawTarget* target,
381 GrDrawState* drawState,
377 const SkRect& devOutside, 382 const SkRect& devOutside,
378 const SkRect& devOutsideAssist, 383 const SkRect& devOutsideAssist,
379 const SkRect& devInside, 384 const SkRect& devInside,
380 bool miterStroke) { 385 bool miterStroke) {
381 GrDrawState* drawState = target->drawState();
382 GrDrawState::AutoRestoreEffects are(drawState); 386 GrDrawState::AutoRestoreEffects are(drawState);
383
384 CoverageAttribType covAttribType = set_rect_attribs(drawState); 387 CoverageAttribType covAttribType = set_rect_attribs(drawState);
385 388
386 GrColor color = drawState->getColor(); 389 GrColor color = drawState->getColor();
387 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo r)) { 390 if (kUseCoverage_CoverageAttribType == covAttribType && GrColorIsOpaque(colo r)) {
388 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true); 391 drawState->setHint(GrDrawState::kVertexColorsAreOpaque_Hint, true);
389 } 392 }
390 393
391 int innerVertexNum = 4; 394 int innerVertexNum = 4;
392 int outerVertexNum = miterStroke ? 4 : 8; 395 int outerVertexNum = miterStroke ? 4 : 8;
393 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2; 396 int totalVertexNum = (outerVertexNum + innerVertexNum) * 2;
394 397
395 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, 0); 398 GrDrawTarget::AutoReleaseGeometry geo(target, totalVertexNum, drawState->ge tVertexStride(), 0);
396 if (!geo.succeeded()) { 399 if (!geo.succeeded()) {
397 SkDebugf("Failed to get space for vertices!\n"); 400 SkDebugf("Failed to get space for vertices!\n");
398 return; 401 return;
399 } 402 }
400 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(miterStroke); 403 GrIndexBuffer* indexBuffer = this->aaStrokeRectIndexBuffer(miterStroke);
401 if (NULL == indexBuffer) { 404 if (NULL == indexBuffer) {
402 SkDebugf("Failed to create index buffer!\n"); 405 SkDebugf("Failed to create index buffer!\n");
403 return; 406 return;
404 } 407 }
405 408
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 for (int i = 0; i < innerVertexNum; ++i) { 495 for (int i = 0; i < innerVertexNum; ++i) {
493 if (kUseCoverage_CoverageAttribType == covAttribType) { 496 if (kUseCoverage_CoverageAttribType == covAttribType) {
494 *reinterpret_cast<GrColor*>(verts + i * vstride) = color; 497 *reinterpret_cast<GrColor*>(verts + i * vstride) = color;
495 *reinterpret_cast<GrColor*>(verts + i * vstride + sizeof(GrColor)) = 0; 498 *reinterpret_cast<GrColor*>(verts + i * vstride + sizeof(GrColor)) = 0;
496 } else { 499 } else {
497 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0; 500 *reinterpret_cast<GrColor*>(verts + i * vstride) = 0;
498 } 501 }
499 } 502 }
500 503
501 target->setIndexSourceToBuffer(indexBuffer); 504 target->setIndexSourceToBuffer(indexBuffer);
502 target->drawIndexedInstances(kTriangles_GrPrimitiveType, 1, 505 target->drawIndexedInstances(drawState,
503 totalVertexNum, aa_stroke_rect_index_count(mite rStroke)); 506 kTriangles_GrPrimitiveType,
507 1,
508 totalVertexNum,
509 aa_stroke_rect_index_count(miterStroke));
504 target->resetIndexSource(); 510 target->resetIndexSource();
505 } 511 }
506 512
507 void GrAARectRenderer::fillAANestedRects(GrDrawTarget* target, 513 void GrAARectRenderer::fillAANestedRects(GrDrawTarget* target,
514 GrDrawState* drawState,
508 const SkRect rects[2], 515 const SkRect rects[2],
509 const SkMatrix& combinedMatrix) { 516 const SkMatrix& combinedMatrix) {
510 SkASSERT(combinedMatrix.rectStaysRect()); 517 SkASSERT(combinedMatrix.rectStaysRect());
511 SkASSERT(!rects[1].isEmpty()); 518 SkASSERT(!rects[1].isEmpty());
512 519
513 SkRect devOutside, devOutsideAssist, devInside; 520 SkRect devOutside, devOutsideAssist, devInside;
514 combinedMatrix.mapRect(&devOutside, rects[0]); 521 combinedMatrix.mapRect(&devOutside, rects[0]);
515 // can't call mapRect for devInside since it calls sort 522 // can't call mapRect for devInside since it calls sort
516 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ; 523 combinedMatrix.mapPoints((SkPoint*)&devInside, (const SkPoint*)&rects[1], 2) ;
517 524
518 if (devInside.isEmpty()) { 525 if (devInside.isEmpty()) {
519 this->fillAARect(target, devOutside, SkMatrix::I(), devOutside); 526 this->fillAARect(target, drawState, devOutside, SkMatrix::I(), devOutsid e);
520 return; 527 return;
521 } 528 }
522 529
523 this->geometryStrokeAARect(target, devOutside, devOutsideAssist, devInside, true); 530 this->geometryStrokeAARect(target, drawState, devOutside, devOutsideAssist, devInside, true);
524 } 531 }
OLDNEW
« no previous file with comments | « src/gpu/GrAARectRenderer.h ('k') | src/gpu/GrBitmapTextContext.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698