| 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 "GrDefaultPathRenderer.h" | 8 #include "GrDefaultPathRenderer.h" |
| 9 | 9 |
| 10 #include "GrBatchFlushState.h" | 10 #include "GrBatchFlushState.h" |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 243 } | 243 } |
| 244 opt.getOverrideColorIfSet(&fGeoData[0].fColor); | 244 opt.getOverrideColorIfSet(&fGeoData[0].fColor); |
| 245 | 245 |
| 246 // setup batch properties | 246 // setup batch properties |
| 247 fBatch.fColorIgnored = !opt.readsColor(); | 247 fBatch.fColorIgnored = !opt.readsColor(); |
| 248 fBatch.fColor = fGeoData[0].fColor; | 248 fBatch.fColor = fGeoData[0].fColor; |
| 249 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); | 249 fBatch.fUsesLocalCoords = opt.readsLocalCoords(); |
| 250 fBatch.fCoverageIgnored = !opt.readsCoverage(); | 250 fBatch.fCoverageIgnored = !opt.readsCoverage(); |
| 251 } | 251 } |
| 252 | 252 |
| 253 void onPrepareDraws(Target* target) override { | 253 void onPrepareDraws(Target* target) const override { |
| 254 SkAutoTUnref<const GrGeometryProcessor> gp; | 254 SkAutoTUnref<const GrGeometryProcessor> gp; |
| 255 { | 255 { |
| 256 using namespace GrDefaultGeoProcFactory; | 256 using namespace GrDefaultGeoProcFactory; |
| 257 Color color(this->color()); | 257 Color color(this->color()); |
| 258 Coverage coverage(this->coverage()); | 258 Coverage coverage(this->coverage()); |
| 259 if (this->coverageIgnored()) { | 259 if (this->coverageIgnored()) { |
| 260 coverage.fType = Coverage::kNone_Type; | 260 coverage.fType = Coverage::kNone_Type; |
| 261 } | 261 } |
| 262 LocalCoords localCoords(this->usesLocalCoords() ? LocalCoords::kUseP
osition_Type : | 262 LocalCoords localCoords(this->usesLocalCoords() ? LocalCoords::kUseP
osition_Type : |
| 263 LocalCoords::kUnus
ed_Type); | 263 LocalCoords::kUnus
ed_Type); |
| 264 gp.reset(GrDefaultGeoProcFactory::Create(color, coverage, localCoord
s, | 264 gp.reset(GrDefaultGeoProcFactory::Create(color, coverage, localCoord
s, |
| 265 this->viewMatrix())); | 265 this->viewMatrix())); |
| 266 } | 266 } |
| 267 | 267 |
| 268 size_t vertexStride = gp->getVertexStride(); | 268 size_t vertexStride = gp->getVertexStride(); |
| 269 SkASSERT(vertexStride == sizeof(SkPoint)); | 269 SkASSERT(vertexStride == sizeof(SkPoint)); |
| 270 | 270 |
| 271 target->initDraw(gp, this->pipeline()); | 271 target->initDraw(gp, this->pipeline()); |
| 272 | 272 |
| 273 int instanceCount = fGeoData.count(); | 273 int instanceCount = fGeoData.count(); |
| 274 | 274 |
| 275 // compute number of vertices | 275 // compute number of vertices |
| 276 int maxVertices = 0; | 276 int maxVertices = 0; |
| 277 | 277 |
| 278 // We will use index buffers if we have multiple paths or one path with
multiple contours | 278 // We will use index buffers if we have multiple paths or one path with
multiple contours |
| 279 bool isIndexed = instanceCount > 1; | 279 bool isIndexed = instanceCount > 1; |
| 280 for (int i = 0; i < instanceCount; i++) { | 280 for (int i = 0; i < instanceCount; i++) { |
| 281 Geometry& args = fGeoData[i]; | 281 const Geometry& args = fGeoData[i]; |
| 282 | 282 |
| 283 int contourCount; | 283 int contourCount; |
| 284 maxVertices += GrPathUtils::worstCasePointCount(args.fPath, &contour
Count, | 284 maxVertices += GrPathUtils::worstCasePointCount(args.fPath, &contour
Count, |
| 285 args.fTolerance); | 285 args.fTolerance); |
| 286 | 286 |
| 287 isIndexed = isIndexed || contourCount > 1; | 287 isIndexed = isIndexed || contourCount > 1; |
| 288 } | 288 } |
| 289 | 289 |
| 290 if (maxVertices == 0 || maxVertices > ((int)SK_MaxU16 + 1)) { | 290 if (maxVertices == 0 || maxVertices > ((int)SK_MaxU16 + 1)) { |
| 291 SkDebugf("Cannot render path (%d)\n", maxVertices); | 291 SkDebugf("Cannot render path (%d)\n", maxVertices); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 333 if (!indices) { | 333 if (!indices) { |
| 334 SkDebugf("Could not allocate indices\n"); | 334 SkDebugf("Could not allocate indices\n"); |
| 335 return; | 335 return; |
| 336 } | 336 } |
| 337 } | 337 } |
| 338 | 338 |
| 339 // fill buffers | 339 // fill buffers |
| 340 int vertexOffset = 0; | 340 int vertexOffset = 0; |
| 341 int indexOffset = 0; | 341 int indexOffset = 0; |
| 342 for (int i = 0; i < instanceCount; i++) { | 342 for (int i = 0; i < instanceCount; i++) { |
| 343 Geometry& args = fGeoData[i]; | 343 const Geometry& args = fGeoData[i]; |
| 344 | 344 |
| 345 int vertexCnt = 0; | 345 int vertexCnt = 0; |
| 346 int indexCnt = 0; | 346 int indexCnt = 0; |
| 347 if (!this->createGeom(verts, | 347 if (!this->createGeom(verts, |
| 348 vertexOffset, | 348 vertexOffset, |
| 349 indices, | 349 indices, |
| 350 indexOffset, | 350 indexOffset, |
| 351 &vertexCnt, | 351 &vertexCnt, |
| 352 &indexCnt, | 352 &indexCnt, |
| 353 args.fPath, | 353 args.fPath, |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 423 } | 423 } |
| 424 | 424 |
| 425 bool createGeom(void* vertices, | 425 bool createGeom(void* vertices, |
| 426 size_t vertexOffset, | 426 size_t vertexOffset, |
| 427 void* indices, | 427 void* indices, |
| 428 size_t indexOffset, | 428 size_t indexOffset, |
| 429 int* vertexCnt, | 429 int* vertexCnt, |
| 430 int* indexCnt, | 430 int* indexCnt, |
| 431 const SkPath& path, | 431 const SkPath& path, |
| 432 SkScalar srcSpaceTol, | 432 SkScalar srcSpaceTol, |
| 433 bool isIndexed) { | 433 bool isIndexed) const { |
| 434 { | 434 { |
| 435 SkScalar srcSpaceTolSqd = SkScalarMul(srcSpaceTol, srcSpaceTol); | 435 SkScalar srcSpaceTolSqd = SkScalarMul(srcSpaceTol, srcSpaceTol); |
| 436 | 436 |
| 437 uint16_t indexOffsetU16 = (uint16_t)indexOffset; | 437 uint16_t indexOffsetU16 = (uint16_t)indexOffset; |
| 438 uint16_t vertexOffsetU16 = (uint16_t)vertexOffset; | 438 uint16_t vertexOffsetU16 = (uint16_t)vertexOffset; |
| 439 | 439 |
| 440 uint16_t* idxBase = reinterpret_cast<uint16_t*>(indices) + indexOffs
etU16; | 440 uint16_t* idxBase = reinterpret_cast<uint16_t*>(indices) + indexOffs
etU16; |
| 441 uint16_t* idx = idxBase; | 441 uint16_t* idx = idxBase; |
| 442 uint16_t subpathIdxStart = vertexOffsetU16; | 442 uint16_t subpathIdxStart = vertexOffsetU16; |
| 443 | 443 |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 763 geometry.fColor = color; | 763 geometry.fColor = color; |
| 764 geometry.fPath = path; | 764 geometry.fPath = path; |
| 765 geometry.fTolerance = srcSpaceTol; | 765 geometry.fTolerance = srcSpaceTol; |
| 766 | 766 |
| 767 viewMatrix.mapRect(&bounds); | 767 viewMatrix.mapRect(&bounds); |
| 768 uint8_t coverage = GrRandomCoverage(random); | 768 uint8_t coverage = GrRandomCoverage(random); |
| 769 return DefaultPathBatch::Create(geometry, coverage, viewMatrix, true, bounds
); | 769 return DefaultPathBatch::Create(geometry, coverage, viewMatrix, true, bounds
); |
| 770 } | 770 } |
| 771 | 771 |
| 772 #endif | 772 #endif |
| OLD | NEW |