summaryrefslogtreecommitdiff
path: root/cogl/tests/conform/test-layer-remove.c
blob: fbfdd64733aea3d754395117546b22c3e9253ef7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <cogl/cogl.h>

#include "test-declarations.h"
#include "test-utils.h"

#define TEST_SQUARE_SIZE 10

static CoglPipeline *
create_two_layer_pipeline (void)
{
  CoglPipeline *pipeline = cogl_pipeline_new (test_ctx);
  CoglColor color;

  /* The pipeline is initially black */
  cogl_pipeline_set_color4ub (pipeline, 0, 0, 0, 255);

  /* The first layer adds a full red component */
  cogl_color_init_from_4ub (&color, 255, 0, 0, 255);
  cogl_pipeline_set_layer_combine_constant (pipeline, 0, &color);
  cogl_pipeline_set_layer_combine (pipeline,
                                   0, /* layer_num */
                                   "RGBA=ADD(PREVIOUS,CONSTANT)",
                                   NULL);

  /* The second layer adds a full green component */
  cogl_color_init_from_4ub (&color, 0, 255, 0, 255);
  cogl_pipeline_set_layer_combine_constant (pipeline, 1, &color);
  cogl_pipeline_set_layer_combine (pipeline,
                                   1, /* layer_num */
                                   "RGBA=ADD(PREVIOUS,CONSTANT)",
                                   NULL);

  return pipeline;
}

static void
test_color (CoglPipeline *pipeline,
            uint32_t color,
            int pos)
{
  cogl_framebuffer_draw_rectangle (test_fb,
                                   pipeline,
                                   pos * TEST_SQUARE_SIZE,
                                   0,
                                   pos * TEST_SQUARE_SIZE + TEST_SQUARE_SIZE,
                                   TEST_SQUARE_SIZE);
  test_utils_check_pixel (test_fb,
                          pos * TEST_SQUARE_SIZE + TEST_SQUARE_SIZE / 2,
                          TEST_SQUARE_SIZE / 2,
                          color);
}

void
test_layer_remove (void)
{
  CoglPipeline *pipeline0, *pipeline1;
  CoglColor color;
  int pos = 0;

  cogl_framebuffer_orthographic (test_fb,
                                 0, 0,
                                 cogl_framebuffer_get_width (test_fb),
                                 cogl_framebuffer_get_height (test_fb),
                                 -1,
                                 100);

  /** TEST 1 **/
  /* Basic sanity check that the pipeline combines the two colors
   * together properly */
  pipeline0 = create_two_layer_pipeline ();
  test_color (pipeline0, 0xffff00ff, pos++);
  cogl_object_unref (pipeline0);

  /** TEST 2 **/
  /* Check that we can remove the second layer */
  pipeline0 = create_two_layer_pipeline ();
  cogl_pipeline_remove_layer (pipeline0, 1);
  test_color (pipeline0, 0xff0000ff, pos++);
  cogl_object_unref (pipeline0);

  /** TEST 3 **/
  /* Check that we can remove the first layer */
  pipeline0 = create_two_layer_pipeline ();
  cogl_pipeline_remove_layer (pipeline0, 0);
  test_color (pipeline0, 0x00ff00ff, pos++);
  cogl_object_unref (pipeline0);

  /** TEST 4 **/
  /* Check that we can make a copy and remove a layer from the
   * original pipeline */
  pipeline0 = create_two_layer_pipeline ();
  pipeline1 = cogl_pipeline_copy (pipeline0);
  cogl_pipeline_remove_layer (pipeline0, 1);
  test_color (pipeline0, 0xff0000ff, pos++);
  test_color (pipeline1, 0xffff00ff, pos++);
  cogl_object_unref (pipeline0);
  cogl_object_unref (pipeline1);

  /** TEST 5 **/
  /* Check that we can make a copy and remove the second layer from the
   * new pipeline */
  pipeline0 = create_two_layer_pipeline ();
  pipeline1 = cogl_pipeline_copy (pipeline0);
  cogl_pipeline_remove_layer (pipeline1, 1);
  test_color (pipeline0, 0xffff00ff, pos++);
  test_color (pipeline1, 0xff0000ff, pos++);
  cogl_object_unref (pipeline0);
  cogl_object_unref (pipeline1);

  /** TEST 6 **/
  /* Check that we can make a copy and remove the first layer from the
   * new pipeline */
  pipeline0 = create_two_layer_pipeline ();
  pipeline1 = cogl_pipeline_copy (pipeline0);
  cogl_pipeline_remove_layer (pipeline1, 0);
  test_color (pipeline0, 0xffff00ff, pos++);
  test_color (pipeline1, 0x00ff00ff, pos++);
  cogl_object_unref (pipeline0);
  cogl_object_unref (pipeline1);

  /** TEST 7 **/
  /* Check that we can modify a layer in a child pipeline */
  pipeline0 = create_two_layer_pipeline ();
  pipeline1 = cogl_pipeline_copy (pipeline0);
  cogl_color_init_from_4ub (&color, 0, 0, 255, 255);
  cogl_pipeline_set_layer_combine_constant (pipeline1, 0, &color);
  test_color (pipeline0, 0xffff00ff, pos++);
  test_color (pipeline1, 0x00ffffff, pos++);
  cogl_object_unref (pipeline0);
  cogl_object_unref (pipeline1);

  /** TEST 8 **/
  /* Check that we can modify a layer in a child pipeline but then remove it */
  pipeline0 = create_two_layer_pipeline ();
  pipeline1 = cogl_pipeline_copy (pipeline0);
  cogl_color_init_from_4ub (&color, 0, 0, 255, 255);
  cogl_pipeline_set_layer_combine_constant (pipeline1, 0, &color);
  cogl_pipeline_remove_layer (pipeline1, 0);
  test_color (pipeline0, 0xffff00ff, pos++);
  test_color (pipeline1, 0x00ff00ff, pos++);
  cogl_object_unref (pipeline0);
  cogl_object_unref (pipeline1);

  if (cogl_test_verbose ())
    g_print ("OK\n");
}