diff options
| author | Bryce Harrington <b.harrington@samsung.com> | 2014-07-24 14:22:14 -0700 |
|---|---|---|
| committer | Bryce Harrington <b.harrington@samsung.com> | 2014-07-24 14:22:14 -0700 |
| commit | 7acc2130fcb4dd4e0375560ce7978002f2d2d2bb (patch) | |
| tree | 01253f79751f63b519ceb6e1cb8d69e68316eeaf | |
| parent | ba0832b38918bcd1c79b636c1dc9068bf3ff6f68 (diff) | |
tests: Implement linear and radial gradients
| -rw-r--r-- | src/cairo-tests/linear-gradient.cpp | 2 | ||||
| -rw-r--r-- | src/cairo-tests/radial-gradient.cpp | 77 | ||||
| -rw-r--r-- | src/skia-tests/fill.cpp | 6 | ||||
| -rw-r--r-- | src/skia-tests/linear-gradient.cpp | 22 | ||||
| -rw-r--r-- | src/skia-tests/radial-gradient.cpp | 99 | ||||
| -rwxr-xr-x | utils/canvas_perf | 4 |
6 files changed, 206 insertions, 4 deletions
diff --git a/src/cairo-tests/linear-gradient.cpp b/src/cairo-tests/linear-gradient.cpp index 9852c64..9096cd5 100644 --- a/src/cairo-tests/linear-gradient.cpp +++ b/src/cairo-tests/linear-gradient.cpp @@ -33,6 +33,8 @@ ca_test_linear_gradient(caskbench_context_t *ctx) int w = ctx->canvas_width; int h = ctx->canvas_height; + // TODO: Implement linear gradient + shapes_t shape; shape_copy(&ctx->shape_defaults, &shape); for (int i=0; i<ctx->size; i++) { diff --git a/src/cairo-tests/radial-gradient.cpp b/src/cairo-tests/radial-gradient.cpp new file mode 100644 index 0000000..fbdc4c6 --- /dev/null +++ b/src/cairo-tests/radial-gradient.cpp @@ -0,0 +1,77 @@ +/* + * Copyright 2014 © Samsung Research America, Silicon Valley + * + * Use of this source code is governed by the 3-Clause BSD license + * specified in the COPYING file included with this source code. + */ +#include <config.h> + +#include <stdio.h> +#include <stdlib.h> +#include <cairo.h> + +#include "caskbench.h" +#include "caskbench_context.h" +#include "cairo-shapes.h" + +int +ca_setup_radial_gradient(caskbench_context_t *ctx) +{ + cairo_set_antialias (ctx->cairo_cr, CAIRO_ANTIALIAS_NONE); + cairo_set_line_width (ctx->cairo_cr, 1); + return 1; +} + +void +ca_teardown_radial_gradient(void) +{ +} + +int +ca_test_radial_gradient(caskbench_context_t *ctx) +{ + int w = ctx->canvas_width; + int h = ctx->canvas_height; + + // TODO: Implement radial gradient + + shapes_t shape; + shape_copy(&ctx->shape_defaults, &shape); + for (int i=0; i<ctx->size; i++) { + double x1 = (double)rand()/RAND_MAX * w; + double x2 = (double)rand()/RAND_MAX * w; + double y1 = (double)rand()/RAND_MAX * h; + double y2 = (double)rand()/RAND_MAX * h; + + shape.x = MIN(x1, x2); + shape.y = MIN(x1, x2); + shape.width = abs(x2 - x1); + shape.height = abs(y2 - y1); + + cairoRandomizeColor(ctx); + cairoDrawRectangle(ctx, &shape); + switch (ctx->shape_defaults.fill_type) { + case CB_FILL_NONE: + cairo_stroke(ctx->cairo_cr); + break; + case CB_FILL_SOLID: + cairo_fill(ctx->cairo_cr); + break; + default: + break; + } + } + + return 1; +} + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/src/skia-tests/fill.cpp b/src/skia-tests/fill.cpp index d3e2482..9828c53 100644 --- a/src/skia-tests/fill.cpp +++ b/src/skia-tests/fill.cpp @@ -20,6 +20,12 @@ static int element_spacing; static int num_x_elements; static int num_y_elements; +/* TODO: + * - Specify with or without alpha + * - With or without antialiasing? + * - Stroke width should be via the shape defaults + */ + int sk_setup_fill(caskbench_context_t *ctx) { diff --git a/src/skia-tests/linear-gradient.cpp b/src/skia-tests/linear-gradient.cpp index 0f06868..6cfa58e 100644 --- a/src/skia-tests/linear-gradient.cpp +++ b/src/skia-tests/linear-gradient.cpp @@ -11,6 +11,7 @@ #include <SkCanvas.h> #include <SkPaint.h> #include <SkRect.h> +#include <SkGradientShader.h> #include "caskbench.h" #include "caskbench_context.h" @@ -38,7 +39,20 @@ sk_test_linear_gradient(caskbench_context_t *ctx) { int w = ctx->canvas_width; int h = ctx->canvas_height; - int stops = 10; + SkShader *shader = NULL; + SkColor colors[10]; + SkPoint points[2]; + + for (int i=0; i<NUM_ELEM(colors); i++) + colors[i] = skiaRandomColor(); + points[0].fX = SkIntToScalar(0); + points[0].fY = SkIntToScalar(0); + points[1].fX = SkIntToScalar(100); + points[1].fY = SkIntToScalar(100); + + shader = SkGradientShader::CreateLinear( + points, colors, NULL, NUM_ELEM(colors), + SkShader::kClamp_TileMode); shapes_t shape; shape_copy(&ctx->shape_defaults, &shape); @@ -60,10 +74,14 @@ sk_test_linear_gradient(caskbench_context_t *ctx) shape.height = 100; shape.fill_type = CB_FILL_LINEAR_GRADIENT; - sk_set_fill_style(ctx, &shape); + ctx->skia_paint->setStyle(SkPaint::kFill_Style); + ctx->skia_paint->setShader(shader); skiaRandomizePaintColor(ctx); skiaDrawRectangle(ctx, &shape); + + if (shader) + shader->unref(); } return 1; diff --git a/src/skia-tests/radial-gradient.cpp b/src/skia-tests/radial-gradient.cpp new file mode 100644 index 0000000..62d7fe1 --- /dev/null +++ b/src/skia-tests/radial-gradient.cpp @@ -0,0 +1,99 @@ +/* + * Copyright 2014 © Samsung Research America, Silicon Valley + * + * Use of this source code is governed by the 3-Clause BSD license + * specified in the COPYING file included with this source code. + */ +#include <config.h> + +#include <math.h> + +#include <SkCanvas.h> +#include <SkPaint.h> +#include <SkRect.h> +#include <SkGradientShader.h> + +#include "caskbench.h" +#include "caskbench_context.h" +#include "skia-shapes.h" + +int +sk_setup_radial_gradient(caskbench_context_t *ctx) +{ + return 1; +} + +void +sk_teardown_radial_gradient(void) +{ +} + +int +sk_test_radial_gradient(caskbench_context_t *ctx) +{ + int w = ctx->canvas_width; + int h = ctx->canvas_height; + SkColor colors[10]; + SkPoint center; + + center.fX = SkIntToScalar(20); + center.fY = SkIntToScalar(20); + + for (int i=0; i<NUM_ELEM(colors); i++) + colors[i] = skiaRandomColor(); + + SkShader* shader = NULL; + shader = SkGradientShader::CreateRadial( + center, 20, + colors, NULL, NUM_ELEM(colors), + SkShader::kClamp_TileMode); + + // TODO: the HTML5 createRadialGradiet() routine + // actually creates a conical gradient: A gradient + // is made between two circles C1 and C2. + // x0=20, y0=20, r0=20, x1=50, y1=50, r1=70 + + shapes_t shape; + shape_copy(&ctx->shape_defaults, &shape); + for (int i=0; i<ctx->size; i++) { + double x1 = (double)rand()/RAND_MAX * w; + double x2 = (double)rand()/RAND_MAX * w; + double y1 = (double)rand()/RAND_MAX * h; + double y2 = (double)rand()/RAND_MAX * h; + + double xx = MIN(x1, x2); + double yy = MIN(x1, x2); + double ww = abs(x2 - x1); + double hh = abs(y2 - y1); + + // transform(shape.width/100, 0, 0, shape.height/100, 0, 0) + shape.x = 0; + shape.y = 0; + shape.width = 100; + shape.height = 100; + shape.fill_type = CB_FILL_RADIAL_GRADIENT; + + skiaRandomizePaintColor(ctx); + + ctx->skia_paint->setStyle(SkPaint::kFill_Style); + ctx->skia_paint->setShader(shader); + + skiaDrawRectangle(ctx, &shape); + + if (shader) + shader->unref(); + } + + return 1; +} + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : diff --git a/utils/canvas_perf b/utils/canvas_perf index 4e051b2..5e42f18 100755 --- a/utils/canvas_perf +++ b/utils/canvas_perf @@ -34,8 +34,8 @@ perfdefs = [ [ "image", 100, 0.3, ["image"] ], [ "image_scale", 100, 0.8, ["image_scale"] ], [ "image_rotate", 15, 0.3, ["image_rotate"] ], -# [ "linear_gradient", 100, 2, ["fill", "-f", "linear-gradient"] ], -# [ "radial_gradient", 100, 0.3, ["fill", "-f", "radial-gradient"] ], + [ "linear_gradient", 100, 2, ["linear_gradient"] ], + [ "radial_gradient", 100, 0.3, ["radial_gradient"] ], # [ "text", 100, 0.6, ["text"] ], [ "clip", 100, 0.8, ["clip"] ] ] |