summaryrefslogtreecommitdiffstats
path: root/o3d/core/cross/canvas_shader.h
diff options
context:
space:
mode:
Diffstat (limited to 'o3d/core/cross/canvas_shader.h')
-rw-r--r--o3d/core/cross/canvas_shader.h166
1 files changed, 166 insertions, 0 deletions
diff --git a/o3d/core/cross/canvas_shader.h b/o3d/core/cross/canvas_shader.h
new file mode 100644
index 0000000..ac86926
--- /dev/null
+++ b/o3d/core/cross/canvas_shader.h
@@ -0,0 +1,166 @@
+/*
+ * Copyright 2009, 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 declaration for the CanvasShader class.
+
+#ifndef O3D_CORE_CROSS_CANVAS_SHADER_H_
+#define O3D_CORE_CROSS_CANVAS_SHADER_H_
+
+#include <vector>
+
+#include "core/cross/param_object.h"
+#include "core/cross/param.h"
+
+#include "third_party/skia/files/include/core/SkColor.h"
+#include "third_party/skia/files/include/core/SkPoint.h"
+
+class SkShader;
+
+namespace o3d {
+
+// This is the base class for 2D gradient shaders that can be applied to a
+// CanvasPaint. The shaders affect both text and primitive drawing in the
+// canvas.
+class CanvasShader : public ParamObject {
+ public:
+ enum TileMode {
+ CLAMP, /* copy the edge color if the shader draws outside of its bounds */
+ REPEAT, /* repeat horizontally and vertically outside its bounds */
+ MIRROR /* same, alternating mirror images */
+ };
+ typedef SmartPointer<CanvasShader> Ref;
+
+ explicit CanvasShader(ServiceLocator* service_locator);
+ virtual ~CanvasShader();
+
+ // Returns a pointer to the native (SKIA) shader object.
+ SkShader* GetNativeShader();
+
+ protected:
+ // Creates a new native (SKIA) shader object using the parameter values
+ // stored in the object.
+ virtual SkShader* MakeNativeShader() = 0;
+ SkShader* native_shader_;
+ bool needs_update_;
+
+ private:
+ O3D_DECL_CLASS(CanvasShader, ParamObject)
+ DISALLOW_COPY_AND_ASSIGN(CanvasShader);
+};
+
+// A shader that generates a linear gradient between two specified points.
+// Two or more colors need to be specified for the gradient.
+class CanvasLinearGradient : public CanvasShader {
+ public:
+ typedef SmartPointer<CanvasLinearGradient> Ref;
+ virtual ~CanvasLinearGradient();
+
+ // Sets the start point of the gradient.
+ void set_start_point(Float2 start_point) {
+ start_point_ = start_point;
+ }
+
+ // Returns the start point of the gradient.
+ Float2 start_point() {
+ return start_point_;
+ }
+
+ // Sets the end point of the gradient.
+ void set_end_point(Float2 end_point) {
+ end_point_ = end_point;
+ }
+
+ // Returns the end point of the gradient.
+ Float2 end_point() {
+ return end_point_;
+ }
+
+ // Sets the relative positions corresponding to the colors in the color array.
+ // If the positions list is empty then the colors will be spread evenly.
+ // Otherwise, position values should start with 0 and end with 1.0 and their
+ // count should be equal to the length of the colors_ array.
+ void set_positions(std::vector<float> positions) {
+ positions_ = positions;
+ needs_update_ = true;
+ }
+
+ std::vector<float> positions() {
+ return positions_;
+ }
+
+ // Sets the array of colors used by the gradient.
+ void set_colors(std::vector<Float4> colors) {
+ colors_ = colors;
+ needs_update_ = true;
+ }
+
+ // Returns the color array.
+ std::vector<Float4> colors() {
+ return colors_;
+ }
+
+ // Sets the tiling mode for the gradient which specifies how the shader
+ // repeats for values beyond the start and end points.
+ void set_tile_mode(CanvasShader::TileMode tile_mode) {
+ tile_mode_ = tile_mode;
+ needs_update_ = true;
+ }
+
+ // Returns the tile mode.
+ TileMode tile_mode() { return tile_mode_; }
+
+ protected:
+ explicit CanvasLinearGradient(ServiceLocator* service_locator);
+ virtual SkShader* MakeNativeShader();
+ private:
+ friend class IClassManager;
+ static ObjectBase::Ref Create(ServiceLocator* service_locator);
+
+ // Start and end points for the gradient.
+ Float2 start_point_;
+ Float2 end_point_;
+
+ // Array of colors.
+ std::vector<Float4> colors_;
+
+ // Array of positions corresponding to colors.
+ std::vector<float> positions_;
+
+ CanvasShader::TileMode tile_mode_;
+
+ O3D_DECL_CLASS(CanvasLinearGradient, CanvasShader)
+ DISALLOW_COPY_AND_ASSIGN(CanvasLinearGradient);
+};
+
+} // namespace o3d
+
+#endif // O3D_CORE_CROSS_CANVAS_SHADER_H_