@@ -17,7 +17,12 @@ static void apps_line_start(twin_screen_t *screen, int x, int y, int w, int h)
1717 twin_fixed_t fy ;
1818
1919 twin_path_translate (stroke , D (200 ), D (200 ));
20+ #if defined(CONFIG_PIXMAN )
21+ pixman_fill_rect (pixmap , & (pixman_color_t ){0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF },
22+ pixmap -> clip .left , pixmap -> clip .top , w , h );
23+ #else
2024 twin_fill (pixmap , 0xffffffff , TWIN_SOURCE , 0 , 0 , w , h );
25+ #endif
2126
2227 twin_window_set_name (window , "line" );
2328
@@ -41,21 +46,30 @@ static void apps_circletext_start(twin_screen_t *screen,
4146 screen , TWIN_ARGB32 , TwinWindowApplication , x , y , w , h );
4247 int wid = window -> client .right - window -> client .left ;
4348 int hei = window -> client .bottom - window -> client .top ;
44- twin_pixmap_t * pixmap = window -> pixmap ;
4549 twin_path_t * path = twin_path_create ();
4650 twin_path_t * pen = twin_path_create ();
51+
52+ #if defined(CONFIG_PIXMAN )
4753 twin_pixmap_t * alpha = twin_pixmap_create (TWIN_A8 , wid , hei );
48- int s ;
49- twin_operand_t source , mask ;
5054
55+ twin_rect_t win_clip = twin_pixmap_get_clip (window -> pixmap );
56+ pixman_fill_rect (window -> pixmap ,
57+ & (pixman_color_t ){0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF },
58+ win_clip .left , win_clip .top , wid , hei );
59+ #else
60+ twin_pixmap_t * alpha = twin_pixmap_create (TWIN_A8 , wid , hei );
61+ twin_pixmap_t * pixmap = window -> pixmap ;
5162 twin_fill (pixmap , 0xffffffff , TWIN_SOURCE , 0 , 0 , wid , hei );
63+ #endif
64+
5265 twin_window_set_name (window , "circletext" );
5366
5467 twin_path_set_font_style (path , TWIN_TEXT_UNHINTED );
5568 twin_path_circle (pen , 0 , 0 , D (1 ));
5669
5770 twin_path_translate (path , D (200 ), D (200 ));
5871 twin_path_set_font_size (path , D (15 ));
72+ int s ;
5973 for (s = 0 ; s < 41 ; s ++ ) {
6074 twin_state_t state = twin_path_save (path );
6175 twin_path_rotate (path , twin_degrees_to_angle (9 * s ));
@@ -66,12 +80,31 @@ static void apps_circletext_start(twin_screen_t *screen,
6680 twin_fill_path (alpha , path , 0 , 0 );
6781 twin_path_destroy (path );
6882 twin_path_destroy (pen );
83+
84+ #if defined(CONFIG_PIXMAN )
85+ pixman_image_t * mask = create_pixman_image_from_twin_pixmap (alpha );
86+ pixman_image_t * source = pixman_image_create_solid_fill (
87+ & (pixman_color_t ){0x0000 , 0x0000 , 0x0000 , 0xFFFF });
88+ pixman_image_t * dst = create_pixman_image_from_twin_pixmap (window -> pixmap );
89+
90+ twin_coord_t ox , oy ;
91+ twin_pixmap_get_origin (window -> pixmap , & ox , & oy );
92+ pixman_image_composite (PIXMAN_OP_OVER , source , mask , dst , 0 , 0 , 0 , 0 , ox ,
93+ oy , wid , hei );
94+
95+ pixman_image_unref (source );
96+ pixman_image_unref (mask );
97+ pixman_image_unref (dst );
98+ #else
99+ twin_operand_t source , mask ;
69100 source .source_kind = TWIN_SOLID ;
70101 source .u .argb = 0xff000000 ;
71102 mask .source_kind = TWIN_PIXMAP ;
72103 mask .u .pixmap = alpha ;
73104 twin_composite (pixmap , 0 , 0 , & source , 0 , 0 , & mask , 0 , 0 , TWIN_OVER , wid ,
74105 hei );
106+ #endif
107+
75108 twin_pixmap_destroy (alpha );
76109 twin_window_show (window );
77110}
@@ -90,13 +123,16 @@ static void apps_quickbrown_start(twin_screen_t *screen,
90123 twin_path_t * path = twin_path_create ();
91124 twin_path_t * pen = twin_path_create ();
92125 twin_pixmap_t * alpha = twin_pixmap_create (TWIN_A8 , wid , hei );
93- twin_operand_t source , mask ;
94126 twin_fixed_t fx , fy ;
95127 int s ;
96128
97129 twin_window_set_name (window , "Quick Brown" );
98-
130+ #if defined(CONFIG_PIXMAN )
131+ pixman_fill_rect (pixmap , & (pixman_color_t ){0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF },
132+ pixmap -> clip .left , pixmap -> clip .top , w , h );
133+ #else
99134 twin_fill (pixmap , 0xffffffff , TWIN_SOURCE , 0 , 0 , wid , hei );
135+ #endif
100136
101137 twin_path_circle (pen , 0 , 0 , D (1 ));
102138
@@ -113,12 +149,29 @@ static void apps_quickbrown_start(twin_screen_t *screen,
113149 twin_fill_path (alpha , path , 0 , 0 );
114150 twin_path_destroy (path );
115151 twin_path_destroy (pen );
152+ #if defined(CONFIG_PIXMAN )
153+ pixman_image_t * mask = create_pixman_image_from_twin_pixmap (alpha );
154+ pixman_image_t * src = pixman_image_create_solid_fill (
155+ & (pixman_color_t ){0x0000 , 0x0000 , 0x0000 , 0xFFFF });
156+ pixman_image_t * dst = create_pixman_image_from_twin_pixmap (pixmap );
157+
158+ twin_coord_t ox , oy ;
159+ twin_pixmap_get_origin (pixmap , & ox , & oy );
160+ pixman_image_composite (PIXMAN_OP_OVER , src , mask , dst , 0 , 0 , 0 , 0 , ox , oy ,
161+ wid , hei );
162+
163+ pixman_image_unref (src );
164+ pixman_image_unref (mask );
165+ pixman_image_unref (dst );
166+ #else
167+ twin_operand_t source , mask ;
116168 source .source_kind = TWIN_SOLID ;
117169 source .u .argb = 0xff000000 ;
118170 mask .source_kind = TWIN_PIXMAP ;
119171 mask .u .pixmap = alpha ;
120172 twin_composite (pixmap , 0 , 0 , & source , 0 , 0 , & mask , 0 , 0 , TWIN_OVER , wid ,
121173 hei );
174+ #endif
122175 twin_pixmap_destroy (alpha );
123176 twin_window_show (window );
124177}
@@ -133,13 +186,17 @@ static void apps_ascii_start(twin_screen_t *screen, int x, int y, int w, int h)
133186 twin_path_t * path = twin_path_create ();
134187 twin_path_t * pen = twin_path_create ();
135188 twin_pixmap_t * alpha = twin_pixmap_create (TWIN_A8 , wid , hei );
136- twin_operand_t source , mask ;
137189 twin_fixed_t fx , fy ;
138190 int s ;
139191
140192 twin_window_set_name (window , "ASCII" );
141193
194+ #if defined(CONFIG_PIXMAN )
195+ pixman_fill_rect (pixmap , & (pixman_color_t ){0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF },
196+ pixmap -> clip .left , pixmap -> clip .top , w , h );
197+ #else
142198 twin_fill (pixmap , 0xffffffff , TWIN_SOURCE , 0 , 0 , wid , hei );
199+ #endif
143200 twin_path_circle (pen , 0 , 0 , D (1 ));
144201
145202 fx = D (3 );
@@ -161,12 +218,29 @@ static void apps_ascii_start(twin_screen_t *screen, int x, int y, int w, int h)
161218 twin_fill_path (alpha , path , 0 , 0 );
162219 twin_path_destroy (path );
163220 twin_path_destroy (pen );
221+ #if defined(CONFIG_PIXMAN )
222+ pixman_image_t * mask = create_pixman_image_from_twin_pixmap (alpha );
223+ pixman_image_t * src = pixman_image_create_solid_fill (
224+ & (pixman_color_t ){0x0000 , 0x0000 , 0x0000 , 0xFFFF });
225+ pixman_image_t * dst = create_pixman_image_from_twin_pixmap (pixmap );
226+
227+ twin_coord_t ox , oy ;
228+ twin_pixmap_get_origin (pixmap , & ox , & oy );
229+ pixman_image_composite (PIXMAN_OP_OVER , src , mask , dst , 0 , 0 , 0 , 0 , ox , oy ,
230+ wid , hei );
231+
232+ pixman_image_unref (src );
233+ pixman_image_unref (mask );
234+ pixman_image_unref (dst );
235+ #else
236+ twin_operand_t source , mask ;
164237 source .source_kind = TWIN_SOLID ;
165238 source .u .argb = 0xff000000 ;
166239 mask .source_kind = TWIN_PIXMAP ;
167240 mask .u .pixmap = alpha ;
168241 twin_composite (pixmap , 0 , 0 , & source , 0 , 0 , & mask , 0 , 0 , TWIN_OVER , wid ,
169242 hei );
243+ #endif
170244 twin_pixmap_destroy (alpha );
171245 twin_window_show (window );
172246}
@@ -184,7 +258,12 @@ static void apps_jelly_start(twin_screen_t *screen, int x, int y, int w, int h)
184258
185259 twin_window_set_name (window , "Jelly" );
186260
261+ #if defined(CONFIG_PIXMAN )
262+ pixman_fill_rect (pixmap , & (pixman_color_t ){0xFFFF , 0xFFFF , 0xFFFF , 0xFFFF },
263+ pixmap -> clip .left , pixmap -> clip .top , wid , hei );
264+ #else
187265 twin_fill (pixmap , 0xffffffff , TWIN_SOURCE , 0 , 0 , wid , hei );
266+ #endif
188267
189268 fx = D (3 );
190269 fy = D (8 );
0 commit comments