blob: 2050f091a640bc13d16e794d196c95f12b58a2a9 [file] [log] [blame]
/*
* Copyright 2012 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "GrAndroidPathRenderer.h"
#include "AndroidPathRenderer.h"
#include "Vertex.h"
GrAndroidPathRenderer::GrAndroidPathRenderer() {
}
bool GrAndroidPathRenderer::canDrawPath(const SkPath& path,
const SkStrokeRec& stroke,
const GrDrawTarget* target,
bool antiAlias) const {
return ((stroke.isFillStyle() || stroke.getStyle() == SkStrokeRec::kStroke_Style)
&& !path.isInverseFillType() && path.isConvex());
}
struct ColorVertex {
SkPoint pos;
GrColor color;
};
bool GrAndroidPathRenderer::onDrawPath(const SkPath& origPath,
const SkStrokeRec& stroke,
GrDrawTarget* target,
bool antiAlias) {
// generate verts using Android algorithm
android::uirenderer::VertexBuffer vertices;
android::uirenderer::PathRenderer::ConvexPathVertices(origPath, stroke, antiAlias, NULL,
&vertices);
// set vertex layout depending on anti-alias
GrVertexLayout layout = antiAlias ? GrDrawState::kCoverage_VertexLayoutBit : 0;
// allocate our vert buffer
int vertCount = vertices.getSize();
GrDrawTarget::AutoReleaseGeometry geo(target, layout, vertCount, 0);
if (!geo.succeeded()) {
GrPrintf("Failed to get space for vertices!\n");
return false;
}
// copy android verts to our vertex buffer
if (antiAlias) {
ColorVertex* outVert = reinterpret_cast<ColorVertex*>(geo.vertices());
android::uirenderer::AlphaVertex* inVert =
reinterpret_cast<android::uirenderer::AlphaVertex*>(vertices.getBuffer());
for (int i = 0; i < vertCount; ++i) {
// copy vertex position
outVert->pos.set(inVert->position[0], inVert->position[1]);
// copy alpha
int coverage = static_cast<int>(inVert->alpha * 0xff);
outVert->color = GrColorPackRGBA(coverage, coverage, coverage, coverage);
++outVert;
++inVert;
}
} else {
size_t vsize = GrDrawState::VertexSize(layout);
size_t copySize = vsize*vertCount;
memcpy(geo.vertices(), vertices.getBuffer(), copySize);
}
// render it
target->drawNonIndexed(kTriangleStrip_GrPrimitiveType, 0, vertCount);
return true;
}