// extract the result vertices and indices from the GrAAConvexTessellator static void extract_verts(const GrAAConvexTessellator& tess, void* vertices, size_t vertexStride, GrColor color, uint16_t firstIndex, uint16_t* idxs, bool tweakAlphaForCoverage) { intptr_t verts = reinterpret_cast<intptr_t>(vertices); for (int i = 0; i < tess.numPts(); ++i) { *((SkPoint*)((intptr_t)verts + i * vertexStride)) = tess.point(i); } // Make 'verts' point to the colors verts += sizeof(SkPoint); for (int i = 0; i < tess.numPts(); ++i) { if (tweakAlphaForCoverage) { SkASSERT(SkScalarRoundToInt(255.0f * tess.coverage(i)) <= 255); unsigned scale = SkScalarRoundToInt(255.0f * tess.coverage(i)); GrColor scaledColor = (0xff == scale) ? color : SkAlphaMulQ(color, scale); *reinterpret_cast<GrColor*>(verts + i * vertexStride) = scaledColor; } else { *reinterpret_cast<GrColor*>(verts + i * vertexStride) = color; *reinterpret_cast<float*>(verts + i * vertexStride + sizeof(GrColor)) = tess.coverage(i); } } for (int i = 0; i < tess.numIndices(); ++i) { idxs[i] = tess.index(i) + firstIndex; } }
void prepareLinesOnlyDraws(Target* target) const { bool canTweakAlphaForCoverage = this->canTweakAlphaForCoverage(); // Setup GrGeometryProcessor sk_sp<GrGeometryProcessor> gp(create_fill_gp(canTweakAlphaForCoverage, this->viewMatrix(), this->usesLocalCoords(), this->coverageIgnored())); if (!gp) { SkDebugf("Could not create GrGeometryProcessor\n"); return; } size_t vertexStride = gp->getVertexStride(); SkASSERT(canTweakAlphaForCoverage ? vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorAttr) : vertexStride == sizeof(GrDefaultGeoProcFactory::PositionColorCoverageAttr)); GrAAConvexTessellator tess; int instanceCount = fGeoData.count(); for (int i = 0; i < instanceCount; i++) { tess.rewind(); const Geometry& args = fGeoData[i]; if (!tess.tessellate(args.fViewMatrix, args.fPath)) { continue; } const GrBuffer* vertexBuffer; int firstVertex; void* verts = target->makeVertexSpace(vertexStride, tess.numPts(), &vertexBuffer, &firstVertex); if (!verts) { SkDebugf("Could not allocate vertices\n"); return; } const GrBuffer* indexBuffer; int firstIndex; uint16_t* idxs = target->makeIndexSpace(tess.numIndices(), &indexBuffer, &firstIndex); if (!idxs) { SkDebugf("Could not allocate indices\n"); return; } extract_verts(tess, verts, vertexStride, args.fColor, idxs, canTweakAlphaForCoverage); GrMesh mesh; mesh.initIndexed(kTriangles_GrPrimitiveType, vertexBuffer, indexBuffer, firstVertex, firstIndex, tess.numPts(), tess.numIndices()); target->draw(gp.get(), mesh); } }