| Index: core/cross/processed_path.cc
|
| ===================================================================
|
| --- core/cross/processed_path.cc (revision 0)
|
| +++ core/cross/processed_path.cc (revision 0)
|
| @@ -0,0 +1,159 @@
|
| +/*
|
| + * Copyright 2010, Google Inc.
|
| + * All rights reserved.
|
| + *
|
| + * Redistribution and use in source and binary forms, with or without
|
| + * modification, are permitted provided that the following conditions are
|
| + * met:
|
| + *
|
| + * * Redistributions of source code must retain the above copyright
|
| + * notice, this list of conditions and the following disclaimer.
|
| + * * Redistributions in binary form must reproduce the above
|
| + * copyright notice, this list of conditions and the following disclaimer
|
| + * in the documentation and/or other materials provided with the
|
| + * distribution.
|
| + * * Neither the name of Google Inc. nor the names of its
|
| + * contributors may be used to endorse or promote products derived from
|
| + * this software without specific prior written permission.
|
| + *
|
| + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
| + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
| + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
| + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
| + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
| + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
| + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
| + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
| + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
| + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
| + */
|
| +
|
| +// This file contains the definition of ProcessedPath.
|
| +
|
| +#include "core/cross/processed_path.h"
|
| +
|
| +#include "core/cross/buffer.h"
|
| +#include "core/cross/field.h"
|
| +#include "core/cross/gpu2d/path_processor.h"
|
| +
|
| +namespace o3d {
|
| +
|
| +O3D_DEFN_CLASS(ProcessedPath, ObjectBase);
|
| +
|
| +ProcessedPath::ProcessedPath(ServiceLocator* service_locator)
|
| + : ObjectBase(service_locator) {
|
| +}
|
| +
|
| +ObjectBase::Ref ProcessedPath::Create(ServiceLocator* service_locator) {
|
| + return ObjectBase::Ref(
|
| + ProcessedPath::Ref(new ProcessedPath(service_locator)));
|
| +}
|
| +
|
| +ProcessedPath::~ProcessedPath() {
|
| +}
|
| +
|
| +void ProcessedPath::Clear() {
|
| + path.reset();
|
| +}
|
| +
|
| +void ProcessedPath::MoveTo(float x, float y) {
|
| + path.moveTo(SkFloatToScalar(x), SkFloatToScalar(y));
|
| +}
|
| +
|
| +void ProcessedPath::LineTo(float x, float y) {
|
| + path.lineTo(SkFloatToScalar(x), SkFloatToScalar(y));
|
| +}
|
| +
|
| +void ProcessedPath::QuadraticTo(float cx, float cy, float x, float y) {
|
| + path.quadTo(SkFloatToScalar(cx),
|
| + SkFloatToScalar(cy),
|
| + SkFloatToScalar(x),
|
| + SkFloatToScalar(y));
|
| +}
|
| +
|
| +void ProcessedPath::CubicTo(float c0x, float c0y,
|
| + float c1x, float c1y,
|
| + float x, float y) {
|
| + path.cubicTo(SkFloatToScalar(c0x),
|
| + SkFloatToScalar(c0y),
|
| + SkFloatToScalar(c1x),
|
| + SkFloatToScalar(c1y),
|
| + SkFloatToScalar(x),
|
| + SkFloatToScalar(y));
|
| +}
|
| +
|
| +void ProcessedPath::Close() {
|
| + path.close();
|
| +}
|
| +
|
| +void ProcessedPath::CreateMesh(Field* exterior_positions,
|
| + Field* exterior_texture_coordinates,
|
| + Field* interior_positions) {
|
| + gpu2d::PathProcessor processor;
|
| + cache.Clear();
|
| + processor.Process(path, &cache);
|
| + // Copy the exterior vertices and texture coordinates into the
|
| + // fields for the exterior triangles.
|
| + SetFields(cache.vertices(), exterior_positions,
|
| + cache.texcoords(), exterior_texture_coordinates,
|
| + cache.num_vertices());
|
| + // Copy the interior vertices into the field for the interior
|
| + // triangles.
|
| + SetFields(cache.interior_vertices(), interior_positions,
|
| + NULL, NULL,
|
| + cache.num_interior_vertices());
|
| +}
|
| +
|
| +void ProcessedPath::SetFields(const float* positions,
|
| + Field* position_field,
|
| + const float* texture_coordinates,
|
| + Field* texture_coordinate_field,
|
| + unsigned int num_vertices) {
|
| + // It may happen that there were no exterior or interior triangles.
|
| + // In this case we allocate a single vertex in the fields to
|
| + // indicate this to JavaScript since we can not allocate a
|
| + // zero-sized buffer.
|
| + DCHECK_NE(num_vertices, 1u);
|
| + if (num_vertices == 0) {
|
| + DCHECK_EQ(positions, static_cast<const float*>(NULL));
|
| + DCHECK_EQ(texture_coordinates, static_cast<const float*>(NULL));
|
| + num_vertices = 1;
|
| + }
|
| + Buffer* buffer = position_field->buffer();
|
| + if (!buffer)
|
| + return;
|
| + if (buffer->num_elements() != num_vertices) {
|
| + if (!buffer->AllocateElements(num_vertices)) {
|
| + return;
|
| + }
|
| + }
|
| + if (num_vertices == 1) {
|
| + float tmp[2] = { 0 };
|
| + position_field->SetFromFloats(tmp, 2, 0, 1);
|
| + } else {
|
| + position_field->SetFromFloats(positions, 2, 0, num_vertices);
|
| + }
|
| +
|
| + // The texture coordinates are NULL for the interior triangles.
|
| + if (texture_coordinate_field != NULL) {
|
| + buffer = texture_coordinate_field->buffer();
|
| + if (!buffer)
|
| + return;
|
| + if (buffer->num_elements() != num_vertices) {
|
| + if (!buffer->AllocateElements(num_vertices)) {
|
| + return;
|
| + }
|
| + }
|
| + if (num_vertices == 1) {
|
| + float tmp[3] = { 0 };
|
| + texture_coordinate_field->SetFromFloats(tmp, 3, 0, 1);
|
| + } else {
|
| + texture_coordinate_field->SetFromFloats(texture_coordinates,
|
| + 3, 0, num_vertices);
|
| + }
|
| + }
|
| +}
|
| +
|
| +} // namespace o3d
|
| +
|
|
|
| Property changes on: core/cross/processed_path.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|