void test_primitive_and_journal (void) { cg_primitive_t *primitives[2]; cg_pipeline_t *pipeline; setup_orthographic_modelview (); create_primitives (primitives); pipeline = create_pipeline (); /* Set a clip to clip all three rectangles to just the bottom half. * The journal flushes its own clip state so this verifies that the * clip state is correctly restored for the second primitive. */ cg_framebuffer_push_rectangle_clip (test_fb, 0, 50, 300, 100); cg_primitive_draw (primitives[0], test_fb, pipeline); /* Draw a rectangle using the journal in-between the two primitives. * This should test that the journal gets flushed correctly and that * the modelview matrix is restored. Half of the rectangle should be * overriden by the second primitive */ cg_framebuffer_draw_rectangle (test_fb, pipeline, 100, 0, /* x1/y1 */ 300, 100 /* x2/y2 */); cg_primitive_draw (primitives[1], test_fb, pipeline); /* Check the three rectangles */ test_cg_check_region (test_fb, 1, 51, 98, 48, 0xff0000ff); test_cg_check_region (test_fb, 101, 51, 98, 48, 0x00ff00ff); test_cg_check_region (test_fb, 201, 51, 98, 48, 0x0000ffff); /* Check that the top half of all of the rectangles was clipped */ test_cg_check_region (test_fb, 1, 1, 298, 48, 0x000000ff); cg_framebuffer_pop_clip (test_fb); if (test_verbose ()) c_print ("OK\n"); }
static void paint_cb(uv_idle_t *idle) { Data *data = idle->data; cg_error_t *error = NULL; const cg_gles2_vtable_t *gles2 = data->gles2_vtable; /* Draw scene with GLES2 */ if (!cg_push_gles2_context( data->dev, data->gles2_ctx, data->fb, data->fb, &error)) { c_error("Failed to push gles2 context: %s\n", error->message); } /* Clear offscreen framebuffer with a random color */ gles2->glClearColor( c_random_double(), c_random_double(), c_random_double(), 1.0f); gles2->glClear(GL_COLOR_BUFFER_BIT); cg_pop_gles2_context(data->dev); /* Draw scene with Cogl */ cg_primitive_draw(data->triangle, data->fb, data->pipeline); cg_onscreen_swap_buffers(CG_ONSCREEN(data->fb)); uv_idle_stop(&data->idle); }
static void paint (void) { cg_pipeline_t *pipeline = cg_pipeline_new (test_dev); int width = cg_framebuffer_get_width (test_fb); int half_width = width / 2; int height = cg_framebuffer_get_height (test_fb); cg_vertex_p2_t tri0_vertices[] = { { 0, 0 }, { 0, height }, { half_width, height }, }; cg_vertex_p2c4_t tri1_vertices[] = { { half_width, 0, 0x80, 0x80, 0x80, 0x80 }, { half_width, height, 0x80, 0x80, 0x80, 0x80 }, { width, height, 0x80, 0x80, 0x80, 0x80 }, }; cg_primitive_t *tri0; cg_primitive_t *tri1; cg_framebuffer_clear4f (test_fb, CG_BUFFER_BIT_COLOR, 0, 0, 0, 0); tri0 = cg_primitive_new_p2 (test_dev, CG_VERTICES_MODE_TRIANGLES, 3, tri0_vertices); tri1 = cg_primitive_new_p2c4 (test_dev, CG_VERTICES_MODE_TRIANGLES, 3, tri1_vertices); /* Check that cogl correctly handles the case where we draw * different primitives same pipeline and switch from using the * opaque color associated with the pipeline and using a colour * attribute with an alpha component which implies blending is * required. * * If Cogl gets this wrong then then in all likelyhood the second * primitive will be drawn with blending still disabled. */ cg_primitive_draw (tri0, test_fb, pipeline); cg_primitive_draw (tri1, test_fb, pipeline); test_cg_check_pixel_and_alpha (test_fb, half_width + 5, height - 5, 0x80808080); }
static void redraw(Data *data) { cg_framebuffer_t *fb = data->fb; cg_framebuffer_clear4f(fb, CG_BUFFER_BIT_COLOR, 0, 0, 0, 1); cg_framebuffer_push_matrix(fb); cg_framebuffer_translate(fb, data->center_x, -data->center_y, 0.0f); cg_primitive_draw(data->triangle, fb, data->pipeline); cg_framebuffer_pop_matrix(fb); cg_onscreen_swap_buffers(CG_ONSCREEN(fb)); }