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 |