mirror of
https://github.com/brl/mutter.git
synced 2024-11-25 17:40:40 -05:00
e9f721216e
When splitting out the CoglPath api we saw that we would be left with inconsistent drawing apis if the drawing apis in core Cogl were lumped into the cogl_framebuffer_ api considering other Cogl sub-libraries or that others will want to create higher level drawing apis outside of Cogl but can't use the same namespace. So that we can aim for a more consistent style this adds a cogl_primitive_draw() api, comparable to cogl_path_fill() or cogl_pango_show_layout() that's intended to replace cogl_framebuffer_draw_primitive() Note: the attribute and rectangle drawing apis are still in the cogl_framebuffer_ namespace and this might potentially change but in these cases there is no single object representing the thing being drawn so it seems a more reasonable they they live in the framebuffer namespace for now. Note: the cogl_framebuffer_draw_primitive() api isn't removed by this patch so it can more conveniently be cherry picked to the 1.16 branch so we can mark it deprecated for a short while. Even though it's marked as experimental api we know that there are people using the api so we'd like to give them a chance to switch to the new api. Reviewed-by: Neil Roberts <neil@linux.intel.com> (cherry picked from commit 418912b93ff81a47f9b38114d05335ab76277c48) Conflicts: cogl-pango/cogl-pango-display-list.c cogl/Makefile.am cogl/cogl-framebuffer.c cogl/cogl-pipeline-layer-state.h cogl/cogl2-path.c cogl/driver/gl/cogl-clip-stack-gl.c
100 lines
3.0 KiB
C
100 lines
3.0 KiB
C
#include <cogl/cogl2-experimental.h>
|
|
|
|
#include "test-utils.h"
|
|
|
|
/* This test assumes the GL driver supports point sizes up to 16
|
|
pixels. Cogl should probably have some way of querying the size so
|
|
we start from that instead */
|
|
#define MAX_POINT_SIZE 16
|
|
/* The size of the area that we'll paint each point in */
|
|
#define POINT_BOX_SIZE (MAX_POINT_SIZE * 2)
|
|
|
|
static int
|
|
calc_coord_offset (int pos, int pos_index, int point_size)
|
|
{
|
|
switch (pos_index)
|
|
{
|
|
case 0: return pos - point_size / 2 - 2;
|
|
case 1: return pos - point_size / 2 + 2;
|
|
case 2: return pos + point_size / 2 - 2;
|
|
case 3: return pos + point_size / 2 + 2;
|
|
}
|
|
|
|
g_assert_not_reached ();
|
|
}
|
|
|
|
static void
|
|
verify_point_size (CoglFramebuffer *test_fb,
|
|
int x_pos,
|
|
int y_pos,
|
|
int point_size)
|
|
{
|
|
int y, x;
|
|
|
|
for (y = 0; y < 4; y++)
|
|
for (x = 0; x < 4; x++)
|
|
{
|
|
CoglBool in_point = x >= 1 && x <= 2 && y >= 1 && y <= 2;
|
|
uint32_t expected_pixel = in_point ? 0x00ff00ff : 0xff0000ff;
|
|
|
|
test_utils_check_pixel (test_fb,
|
|
calc_coord_offset (x_pos, x, point_size),
|
|
calc_coord_offset (y_pos, y, point_size),
|
|
expected_pixel);
|
|
}
|
|
}
|
|
|
|
void
|
|
test_point_size (void)
|
|
{
|
|
int fb_width = cogl_framebuffer_get_width (test_fb);
|
|
int fb_height = cogl_framebuffer_get_height (test_fb);
|
|
int point_size;
|
|
int x_pos;
|
|
|
|
cogl_framebuffer_orthographic (test_fb,
|
|
0, 0, /* x_1, y_1 */
|
|
fb_width, /* x_2 */
|
|
fb_height /* y_2 */,
|
|
-1, 100 /* near/far */);
|
|
|
|
cogl_framebuffer_clear4f (test_fb,
|
|
COGL_BUFFER_BIT_COLOR,
|
|
1.0f, 0.0f, 0.0f, 1.0f);
|
|
|
|
/* Try a rendering a single point with a few different point
|
|
sizes */
|
|
for (x_pos = 0, point_size = MAX_POINT_SIZE;
|
|
point_size >= 4;
|
|
x_pos += POINT_BOX_SIZE, point_size /= 2)
|
|
{
|
|
CoglPipeline *pipeline = cogl_pipeline_new (test_ctx);
|
|
CoglVertexP2 point = { x_pos + POINT_BOX_SIZE / 2,
|
|
POINT_BOX_SIZE / 2 };
|
|
CoglPrimitive *prim =
|
|
cogl_primitive_new_p2 (test_ctx,
|
|
COGL_VERTICES_MODE_POINTS,
|
|
1, /* n_vertices */
|
|
&point);
|
|
|
|
cogl_pipeline_set_point_size (pipeline, point_size);
|
|
cogl_pipeline_set_color4ub (pipeline, 0, 255, 0, 255);
|
|
cogl_primitive_draw (prim, test_fb, pipeline);
|
|
|
|
cogl_object_unref (prim);
|
|
cogl_object_unref (pipeline);
|
|
}
|
|
|
|
/* Verify all of the points where drawn at the right size */
|
|
for (x_pos = 0, point_size = MAX_POINT_SIZE;
|
|
point_size >= 4;
|
|
x_pos += POINT_BOX_SIZE, point_size /= 2)
|
|
verify_point_size (test_fb,
|
|
x_pos + POINT_BOX_SIZE / 2,
|
|
POINT_BOX_SIZE / 2,
|
|
point_size);
|
|
|
|
if (cogl_test_verbose ())
|
|
g_print ("OK\n");
|
|
}
|