| OLD | NEW |
| (Empty) |
| 1 | |
| 2 /* | |
| 3 * Copyright 2012 Google Inc. | |
| 4 * | |
| 5 * Use of this source code is governed by a BSD-style license that can be | |
| 6 * found in the LICENSE file. | |
| 7 */ | |
| 8 | |
| 9 #include "GrAndroidPathRenderer.h" | |
| 10 #include "AndroidPathRenderer.h" | |
| 11 #include "Vertex.h" | |
| 12 | |
| 13 GrAndroidPathRenderer::GrAndroidPathRenderer() { | |
| 14 } | |
| 15 | |
| 16 bool GrAndroidPathRenderer::canDrawPath(const SkPath& path, | |
| 17 const SkStrokeRec& stroke, | |
| 18 const GrDrawTarget* target, | |
| 19 bool antiAlias) const { | |
| 20 return ((stroke.isFillStyle() || stroke.getStyle() == SkStrokeRec::kStroke_S
tyle) | |
| 21 && !path.isInverseFillType() && path.isConvex()); | |
| 22 } | |
| 23 | |
| 24 struct ColorVertex { | |
| 25 SkPoint pos; | |
| 26 GrColor color; | |
| 27 }; | |
| 28 | |
| 29 bool GrAndroidPathRenderer::onDrawPath(const SkPath& origPath, | |
| 30 const SkStrokeRec& stroke, | |
| 31 GrDrawTarget* target, | |
| 32 bool antiAlias) { | |
| 33 | |
| 34 // generate verts using Android algorithm | |
| 35 android::uirenderer::VertexBuffer vertices; | |
| 36 android::uirenderer::PathRenderer::ConvexPathVertices(origPath, stroke, anti
Alias, NULL, | |
| 37 &vertices); | |
| 38 | |
| 39 // set vertex attributes depending on anti-alias | |
| 40 GrDrawState* drawState = target->drawState(); | |
| 41 if (antiAlias) { | |
| 42 // position + coverage | |
| 43 GrVertexAttrib attribs[] = { | |
| 44 GrVertexAttrib(kVec2f_GrVertexAttribType, 0), | |
| 45 GrVertexAttrib(kVec4ub_GrVertexAttribType, sizeof(GrPoint)) | |
| 46 }; | |
| 47 drawState->setVertexAttribs(attribs, SK_ARRAY_COUNT(attribs)); | |
| 48 drawState->setAttribIndex(GrDrawState::kPosition_AttribIndex, 0); | |
| 49 drawState->setAttribIndex(GrDrawState::kCoverage_AttribIndex, 1); | |
| 50 drawState->setAttribBindings(GrDrawState::kCoverage_AttribBindingsBit); | |
| 51 } else { | |
| 52 drawState->setDefaultVertexAttribs(); | |
| 53 } | |
| 54 | |
| 55 // allocate our vert buffer | |
| 56 int vertCount = vertices.getSize(); | |
| 57 GrDrawTarget::AutoReleaseGeometry geo(target, vertCount, 0); | |
| 58 if (!geo.succeeded()) { | |
| 59 SkDebugf("Failed to get space for vertices!\n"); | |
| 60 return false; | |
| 61 } | |
| 62 | |
| 63 // copy android verts to our vertex buffer | |
| 64 if (antiAlias) { | |
| 65 SkASSERT(sizeof(ColorVertex) == drawState->getVertexSize()); | |
| 66 ColorVertex* outVert = reinterpret_cast<ColorVertex*>(geo.vertices()); | |
| 67 android::uirenderer::AlphaVertex* inVert = | |
| 68 reinterpret_cast<android::uirenderer::AlphaVertex*>(vertices.getBuff
er()); | |
| 69 | |
| 70 for (int i = 0; i < vertCount; ++i) { | |
| 71 // copy vertex position | |
| 72 outVert->pos.set(inVert->position[0], inVert->position[1]); | |
| 73 // copy alpha | |
| 74 int coverage = static_cast<int>(inVert->alpha * 0xff); | |
| 75 outVert->color = GrColorPackRGBA(coverage, coverage, coverage, cover
age); | |
| 76 ++outVert; | |
| 77 ++inVert; | |
| 78 } | |
| 79 } else { | |
| 80 size_t vsize = drawState->getVertexSize(); | |
| 81 size_t copySize = vsize*vertCount; | |
| 82 memcpy(geo.vertices(), vertices.getBuffer(), copySize); | |
| 83 } | |
| 84 | |
| 85 // render it | |
| 86 target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, vertCount); | |
| 87 | |
| 88 return true; | |
| 89 } | |
| OLD | NEW |