VirtualBox

source: vbox/trunk/src/VBox/Additions/x11/x11include/pixman-0.16.0/pixman-private.h@ 33983

Last change on this file since 33983 was 22660, checked in by vboxsync, 15 years ago

export more X11 stuff to OSE

  • Property svn:eol-style set to native
File size: 26.1 KB
Line 
1#ifndef PACKAGE
2# error config.h must be included before pixman-private.h
3#endif
4
5#ifndef PIXMAN_PRIVATE_H
6#define PIXMAN_PRIVATE_H
7
8#include "pixman.h"
9#include <time.h>
10#include <assert.h>
11
12#include "pixman-compiler.h"
13
14/*
15 * Images
16 */
17typedef struct image_common image_common_t;
18typedef struct source_image source_image_t;
19typedef struct solid_fill solid_fill_t;
20typedef struct gradient gradient_t;
21typedef struct linear_gradient linear_gradient_t;
22typedef struct horizontal_gradient horizontal_gradient_t;
23typedef struct vertical_gradient vertical_gradient_t;
24typedef struct conical_gradient conical_gradient_t;
25typedef struct radial_gradient radial_gradient_t;
26typedef struct bits_image bits_image_t;
27typedef struct circle circle_t;
28
29typedef void (*fetch_scanline_t) (pixman_image_t *image,
30 int x,
31 int y,
32 int width,
33 uint32_t *buffer,
34 const uint32_t *mask,
35 uint32_t mask_bits);
36
37typedef uint32_t (*fetch_pixel_32_t) (bits_image_t *image,
38 int x,
39 int y);
40
41typedef uint64_t (*fetch_pixel_64_t) (bits_image_t *image,
42 int x,
43 int y);
44
45typedef void (*store_scanline_t) (bits_image_t * image,
46 int x,
47 int y,
48 int width,
49 const uint32_t *values);
50
51typedef enum
52{
53 BITS,
54 LINEAR,
55 CONICAL,
56 RADIAL,
57 SOLID
58} image_type_t;
59
60typedef enum
61{
62 SOURCE_IMAGE_CLASS_UNKNOWN,
63 SOURCE_IMAGE_CLASS_HORIZONTAL,
64 SOURCE_IMAGE_CLASS_VERTICAL,
65} source_image_class_t;
66
67typedef source_image_class_t (*classify_func_t) (pixman_image_t *image,
68 int x,
69 int y,
70 int width,
71 int height);
72typedef void (*property_changed_func_t) (pixman_image_t *image);
73
74struct image_common
75{
76 image_type_t type;
77 int32_t ref_count;
78 pixman_region32_t clip_region;
79 pixman_bool_t have_clip_region; /* FALSE if there is no clip */
80 pixman_bool_t client_clip; /* Whether the source clip was
81 set by a client */
82 pixman_bool_t clip_sources; /* Whether the clip applies when
83 * the image is used as a source
84 */
85 pixman_bool_t dirty;
86 pixman_bool_t need_workaround;
87 pixman_transform_t * transform;
88 pixman_repeat_t repeat;
89 pixman_filter_t filter;
90 pixman_fixed_t * filter_params;
91 int n_filter_params;
92 bits_image_t * alpha_map;
93 int alpha_origin_x;
94 int alpha_origin_y;
95 pixman_bool_t component_alpha;
96 classify_func_t classify;
97 property_changed_func_t property_changed;
98 fetch_scanline_t get_scanline_32;
99 fetch_scanline_t get_scanline_64;
100
101 pixman_image_destroy_func_t destroy_func;
102 void * destroy_data;
103};
104
105struct source_image
106{
107 image_common_t common;
108 source_image_class_t class;
109};
110
111struct solid_fill
112{
113 source_image_t common;
114 uint32_t color; /* FIXME: shouldn't this be a pixman_color_t? */
115};
116
117struct gradient
118{
119 source_image_t common;
120 int n_stops;
121 pixman_gradient_stop_t *stops;
122 int stop_range;
123 uint32_t * color_table;
124 int color_table_size;
125};
126
127struct linear_gradient
128{
129 gradient_t common;
130 pixman_point_fixed_t p1;
131 pixman_point_fixed_t p2;
132};
133
134struct circle
135{
136 pixman_fixed_t x;
137 pixman_fixed_t y;
138 pixman_fixed_t radius;
139};
140
141struct radial_gradient
142{
143 gradient_t common;
144
145 circle_t c1;
146 circle_t c2;
147 double cdx;
148 double cdy;
149 double dr;
150 double A;
151};
152
153struct conical_gradient
154{
155 gradient_t common;
156 pixman_point_fixed_t center;
157 pixman_fixed_t angle;
158};
159
160struct bits_image
161{
162 image_common_t common;
163 pixman_format_code_t format;
164 const pixman_indexed_t * indexed;
165 int width;
166 int height;
167 uint32_t * bits;
168 uint32_t * free_me;
169 int rowstride; /* in number of uint32_t's */
170
171 /* Fetch a pixel, disregarding alpha maps, transformations etc. */
172 fetch_pixel_32_t fetch_pixel_raw_32;
173 fetch_pixel_64_t fetch_pixel_raw_64;
174
175 /* Fetch a pixel, taking alpha maps into account */
176 fetch_pixel_32_t fetch_pixel_32;
177 fetch_pixel_64_t fetch_pixel_64;
178
179 /* Fetch raw scanlines, with no regard for transformations, alpha maps etc. */
180 fetch_scanline_t fetch_scanline_raw_32;
181 fetch_scanline_t fetch_scanline_raw_64;
182
183 /* Store scanlines with no regard for alpha maps */
184 store_scanline_t store_scanline_raw_32;
185 store_scanline_t store_scanline_raw_64;
186
187 /* Store a scanline, taking alpha maps into account */
188 store_scanline_t store_scanline_32;
189 store_scanline_t store_scanline_64;
190
191 /* Used for indirect access to the bits */
192 pixman_read_memory_func_t read_func;
193 pixman_write_memory_func_t write_func;
194};
195
196union pixman_image
197{
198 image_type_t type;
199 image_common_t common;
200 bits_image_t bits;
201 source_image_t source;
202 gradient_t gradient;
203 linear_gradient_t linear;
204 conical_gradient_t conical;
205 radial_gradient_t radial;
206 solid_fill_t solid;
207};
208
209
210void
211_pixman_bits_image_setup_raw_accessors (bits_image_t *image);
212
213void
214_pixman_image_get_scanline_generic_64 (pixman_image_t *image,
215 int x,
216 int y,
217 int width,
218 uint32_t * buffer,
219 const uint32_t *mask,
220 uint32_t mask_bits);
221
222source_image_class_t
223_pixman_image_classify (pixman_image_t *image,
224 int x,
225 int y,
226 int width,
227 int height);
228
229void
230_pixman_image_get_scanline_32 (pixman_image_t *image,
231 int x,
232 int y,
233 int width,
234 uint32_t * buffer,
235 const uint32_t *mask,
236 uint32_t mask_bits);
237
238/* Even thought the type of buffer is uint32_t *, the function actually expects
239 * a uint64_t *buffer.
240 */
241void
242_pixman_image_get_scanline_64 (pixman_image_t *image,
243 int x,
244 int y,
245 int width,
246 uint32_t * buffer,
247 const uint32_t *unused,
248 uint32_t unused2);
249
250void
251_pixman_image_store_scanline_32 (bits_image_t * image,
252 int x,
253 int y,
254 int width,
255 const uint32_t *buffer);
256void
257_pixman_image_fetch_pixels (bits_image_t *image,
258 uint32_t * buffer,
259 int n_pixels);
260
261/* Even though the type of buffer is uint32_t *, the function
262 * actually expects a uint64_t *buffer.
263 */
264void
265_pixman_image_store_scanline_64 (bits_image_t * image,
266 int x,
267 int y,
268 int width,
269 const uint32_t *buffer);
270
271pixman_image_t *
272_pixman_image_allocate (void);
273
274pixman_bool_t
275_pixman_init_gradient (gradient_t * gradient,
276 const pixman_gradient_stop_t *stops,
277 int n_stops);
278void
279_pixman_image_reset_clip_region (pixman_image_t *image);
280
281void
282_pixman_image_validate (pixman_image_t *image);
283
284pixman_bool_t
285_pixman_image_is_opaque (pixman_image_t *image);
286
287pixman_bool_t
288_pixman_image_is_solid (pixman_image_t *image);
289
290uint32_t
291_pixman_image_get_solid (pixman_image_t * image,
292 pixman_format_code_t format);
293
294#define PIXMAN_IMAGE_GET_LINE(image, x, y, type, out_stride, line, mul) \
295 do \
296 { \
297 uint32_t *__bits__; \
298 int __stride__; \
299 \
300 __bits__ = image->bits.bits; \
301 __stride__ = image->bits.rowstride; \
302 (out_stride) = \
303 __stride__ * (int) sizeof (uint32_t) / (int) sizeof (type); \
304 (line) = \
305 ((type *) __bits__) + (out_stride) * (y) + (mul) * (x); \
306 } while (0)
307
308/*
309 * Gradient walker
310 */
311typedef struct
312{
313 uint32_t left_ag;
314 uint32_t left_rb;
315 uint32_t right_ag;
316 uint32_t right_rb;
317 int32_t left_x;
318 int32_t right_x;
319 int32_t stepper;
320
321 pixman_gradient_stop_t *stops;
322 int num_stops;
323 unsigned int spread;
324
325 int need_reset;
326} pixman_gradient_walker_t;
327
328void
329_pixman_gradient_walker_init (pixman_gradient_walker_t *walker,
330 gradient_t * gradient,
331 unsigned int spread);
332
333void
334_pixman_gradient_walker_reset (pixman_gradient_walker_t *walker,
335 pixman_fixed_32_32_t pos);
336
337uint32_t
338_pixman_gradient_walker_pixel (pixman_gradient_walker_t *walker,
339 pixman_fixed_32_32_t x);
340
341/*
342 * Edges
343 */
344
345#define MAX_ALPHA(n) ((1 << (n)) - 1)
346#define N_Y_FRAC(n) ((n) == 1 ? 1 : (1 << ((n) / 2)) - 1)
347#define N_X_FRAC(n) ((n) == 1 ? 1 : (1 << ((n) / 2)) + 1)
348
349#define STEP_Y_SMALL(n) (pixman_fixed_1 / N_Y_FRAC (n))
350#define STEP_Y_BIG(n) (pixman_fixed_1 - (N_Y_FRAC (n) - 1) * STEP_Y_SMALL (n))
351
352#define Y_FRAC_FIRST(n) (STEP_Y_SMALL (n) / 2)
353#define Y_FRAC_LAST(n) (Y_FRAC_FIRST (n) + (N_Y_FRAC (n) - 1) * STEP_Y_SMALL (n))
354
355#define STEP_X_SMALL(n) (pixman_fixed_1 / N_X_FRAC (n))
356#define STEP_X_BIG(n) (pixman_fixed_1 - (N_X_FRAC (n) - 1) * STEP_X_SMALL (n))
357
358#define X_FRAC_FIRST(n) (STEP_X_SMALL (n) / 2)
359#define X_FRAC_LAST(n) (X_FRAC_FIRST (n) + (N_X_FRAC (n) - 1) * STEP_X_SMALL (n))
360
361#define RENDER_SAMPLES_X(x, n) \
362 ((n) == 1? 0 : (pixman_fixed_frac (x) + \
363 X_FRAC_FIRST (n)) / STEP_X_SMALL (n))
364
365void
366pixman_rasterize_edges_accessors (pixman_image_t *image,
367 pixman_edge_t * l,
368 pixman_edge_t * r,
369 pixman_fixed_t t,
370 pixman_fixed_t b);
371
372/*
373 * Implementations
374 */
375
376typedef struct pixman_implementation_t pixman_implementation_t;
377
378typedef void (*pixman_combine_32_func_t) (pixman_implementation_t *imp,
379 pixman_op_t op,
380 uint32_t * dest,
381 const uint32_t * src,
382 const uint32_t * mask,
383 int width);
384
385typedef void (*pixman_combine_64_func_t) (pixman_implementation_t *imp,
386 pixman_op_t op,
387 uint64_t * dest,
388 const uint64_t * src,
389 const uint64_t * mask,
390 int width);
391
392typedef void (*pixman_composite_func_t) (pixman_implementation_t *imp,
393 pixman_op_t op,
394 pixman_image_t * src,
395 pixman_image_t * mask,
396 pixman_image_t * dest,
397 int32_t src_x,
398 int32_t src_y,
399 int32_t mask_x,
400 int32_t mask_y,
401 int32_t dest_x,
402 int32_t dest_y,
403 int32_t width,
404 int32_t height);
405typedef pixman_bool_t (*pixman_blt_func_t) (pixman_implementation_t *imp,
406 uint32_t * src_bits,
407 uint32_t * dst_bits,
408 int src_stride,
409 int dst_stride,
410 int src_bpp,
411 int dst_bpp,
412 int src_x,
413 int src_y,
414 int dst_x,
415 int dst_y,
416 int width,
417 int height);
418typedef pixman_bool_t (*pixman_fill_func_t) (pixman_implementation_t *imp,
419 uint32_t * bits,
420 int stride,
421 int bpp,
422 int x,
423 int y,
424 int width,
425 int height,
426 uint32_t xor);
427
428void _pixman_setup_combiner_functions_32 (pixman_implementation_t *imp);
429void _pixman_setup_combiner_functions_64 (pixman_implementation_t *imp);
430
431struct pixman_implementation_t
432{
433 pixman_implementation_t *toplevel;
434 pixman_implementation_t *delegate;
435
436 pixman_composite_func_t composite;
437 pixman_blt_func_t blt;
438 pixman_fill_func_t fill;
439
440 pixman_combine_32_func_t combine_32[PIXMAN_OP_LAST];
441 pixman_combine_32_func_t combine_32_ca[PIXMAN_OP_LAST];
442 pixman_combine_64_func_t combine_64[PIXMAN_OP_LAST];
443 pixman_combine_64_func_t combine_64_ca[PIXMAN_OP_LAST];
444};
445
446pixman_implementation_t *
447_pixman_implementation_create (pixman_implementation_t *delegate);
448
449void
450_pixman_implementation_combine_32 (pixman_implementation_t *imp,
451 pixman_op_t op,
452 uint32_t * dest,
453 const uint32_t * src,
454 const uint32_t * mask,
455 int width);
456void
457_pixman_implementation_combine_64 (pixman_implementation_t *imp,
458 pixman_op_t op,
459 uint64_t * dest,
460 const uint64_t * src,
461 const uint64_t * mask,
462 int width);
463void
464_pixman_implementation_combine_32_ca (pixman_implementation_t *imp,
465 pixman_op_t op,
466 uint32_t * dest,
467 const uint32_t * src,
468 const uint32_t * mask,
469 int width);
470void
471_pixman_implementation_combine_64_ca (pixman_implementation_t *imp,
472 pixman_op_t op,
473 uint64_t * dest,
474 const uint64_t * src,
475 const uint64_t * mask,
476 int width);
477void
478_pixman_implementation_composite (pixman_implementation_t *imp,
479 pixman_op_t op,
480 pixman_image_t * src,
481 pixman_image_t * mask,
482 pixman_image_t * dest,
483 int32_t src_x,
484 int32_t src_y,
485 int32_t mask_x,
486 int32_t mask_y,
487 int32_t dest_x,
488 int32_t dest_y,
489 int32_t width,
490 int32_t height);
491
492pixman_bool_t
493_pixman_implementation_blt (pixman_implementation_t *imp,
494 uint32_t * src_bits,
495 uint32_t * dst_bits,
496 int src_stride,
497 int dst_stride,
498 int src_bpp,
499 int dst_bpp,
500 int src_x,
501 int src_y,
502 int dst_x,
503 int dst_y,
504 int width,
505 int height);
506
507pixman_bool_t
508_pixman_implementation_fill (pixman_implementation_t *imp,
509 uint32_t * bits,
510 int stride,
511 int bpp,
512 int x,
513 int y,
514 int width,
515 int height,
516 uint32_t xor);
517
518/* Specific implementations */
519pixman_implementation_t *
520_pixman_implementation_create_general (void);
521
522pixman_implementation_t *
523_pixman_implementation_create_fast_path (void);
524
525#ifdef USE_MMX
526pixman_implementation_t *
527_pixman_implementation_create_mmx (void);
528#endif
529
530#ifdef USE_SSE2
531pixman_implementation_t *
532_pixman_implementation_create_sse2 (void);
533#endif
534
535#ifdef USE_ARM_SIMD
536pixman_implementation_t *
537_pixman_implementation_create_arm_simd (void);
538#endif
539
540#ifdef USE_ARM_NEON
541pixman_implementation_t *
542_pixman_implementation_create_arm_neon (void);
543#endif
544
545#ifdef USE_VMX
546pixman_implementation_t *
547_pixman_implementation_create_vmx (void);
548#endif
549
550pixman_implementation_t *
551_pixman_choose_implementation (void);
552
553
554
555/*
556 * Utilities
557 */
558
559/* These "formats" both have depth 0, so they
560 * will never clash with any real ones
561 */
562#define PIXMAN_null PIXMAN_FORMAT (0, 0, 0, 0, 0, 0)
563#define PIXMAN_solid PIXMAN_FORMAT (0, 1, 0, 0, 0, 0)
564
565#define NEED_COMPONENT_ALPHA (1 << 0)
566#define NEED_PIXBUF (1 << 1)
567#define NEED_SOLID_MASK (1 << 2)
568
569typedef struct
570{
571 pixman_op_t op;
572 pixman_format_code_t src_format;
573 pixman_format_code_t mask_format;
574 pixman_format_code_t dest_format;
575 pixman_composite_func_t func;
576 uint32_t flags;
577} pixman_fast_path_t;
578
579/* Memory allocation helpers */
580void *
581pixman_malloc_ab (unsigned int n, unsigned int b);
582
583void *
584pixman_malloc_abc (unsigned int a, unsigned int b, unsigned int c);
585
586pixman_bool_t
587pixman_multiply_overflows_int (unsigned int a, unsigned int b);
588
589pixman_bool_t
590pixman_addition_overflows_int (unsigned int a, unsigned int b);
591
592/* Compositing utilities */
593pixman_bool_t
594_pixman_run_fast_path (const pixman_fast_path_t *paths,
595 pixman_implementation_t * imp,
596 pixman_op_t op,
597 pixman_image_t * src,
598 pixman_image_t * mask,
599 pixman_image_t * dest,
600 int32_t src_x,
601 int32_t src_y,
602 int32_t mask_x,
603 int32_t mask_y,
604 int32_t dest_x,
605 int32_t dest_y,
606 int32_t width,
607 int32_t height);
608
609void
610_pixman_walk_composite_region (pixman_implementation_t *imp,
611 pixman_op_t op,
612 pixman_image_t * src_image,
613 pixman_image_t * mask_image,
614 pixman_image_t * dst_image,
615 int16_t src_x,
616 int16_t src_y,
617 int16_t mask_x,
618 int16_t mask_y,
619 int16_t dest_x,
620 int16_t dest_y,
621 uint16_t width,
622 uint16_t height,
623 pixman_composite_func_t composite_rect);
624
625void
626pixman_expand (uint64_t * dst,
627 const uint32_t * src,
628 pixman_format_code_t format,
629 int width);
630
631void
632pixman_contract (uint32_t * dst,
633 const uint64_t *src,
634 int width);
635
636
637/* Region Helpers */
638pixman_bool_t
639pixman_region32_copy_from_region16 (pixman_region32_t *dst,
640 pixman_region16_t *src);
641
642pixman_bool_t
643pixman_region16_copy_from_region32 (pixman_region16_t *dst,
644 pixman_region32_t *src);
645
646
647/* Misc macros */
648
649#ifndef FALSE
650# define FALSE 0
651#endif
652
653#ifndef TRUE
654# define TRUE 1
655#endif
656
657#ifndef MIN
658# define MIN(a, b) ((a < b) ? a : b)
659#endif
660
661#ifndef MAX
662# define MAX(a, b) ((a > b) ? a : b)
663#endif
664
665/* Integer division that rounds towards -infinity */
666#define DIV(a, b) \
667 ((((a) < 0) == ((b) < 0)) ? (a) / (b) : \
668 ((a) - (b) + 1 - (((b) < 0) << 1)) / (b))
669
670/* Modulus that produces the remainder wrt. DIV */
671#define MOD(a, b) ((a) < 0 ? ((b) - ((-(a) - 1) % (b))) - 1 : (a) % (b))
672
673#define CLIP(v, low, high) ((v) < (low) ? (low) : ((v) > (high) ? (high) : (v)))
674
675/* Conversion between 8888 and 0565 */
676
677#define CONVERT_8888_TO_0565(s) \
678 ((((s) >> 3) & 0x001f) | \
679 (((s) >> 5) & 0x07e0) | \
680 (((s) >> 8) & 0xf800))
681
682#define CONVERT_0565_TO_0888(s) \
683 (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \
684 ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \
685 ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000)))
686
687#define PIXMAN_FORMAT_IS_WIDE(f) \
688 (PIXMAN_FORMAT_A (f) > 8 || \
689 PIXMAN_FORMAT_R (f) > 8 || \
690 PIXMAN_FORMAT_G (f) > 8 || \
691 PIXMAN_FORMAT_B (f) > 8)
692
693/*
694 * Various debugging code
695 */
696
697#undef DEBUG
698#define DEBUG 0
699
700#if DEBUG
701
702#define return_if_fail(expr) \
703 do \
704 { \
705 if (!(expr)) \
706 { \
707 fprintf (stderr, "In %s: %s failed\n", FUNC, # expr); \
708 return; \
709 } \
710 } \
711 while (0)
712
713#define return_val_if_fail(expr, retval) \
714 do \
715 { \
716 if (!(expr)) \
717 { \
718 fprintf (stderr, "In %s: %s failed\n", FUNC, # expr); \
719 return (retval); \
720 } \
721 } \
722 while (0)
723
724#else
725
726#define return_if_fail(expr) \
727 do \
728 { \
729 if (!(expr)) \
730 return; \
731 } \
732 while (0)
733
734#define return_val_if_fail(expr, retval) \
735 do \
736 { \
737 if (!(expr)) \
738 return (retval); \
739 } \
740 while (0)
741
742#endif
743
744/*
745 * Timers
746 */
747
748#ifdef PIXMAN_TIMERS
749
750static inline uint64_t
751oil_profile_stamp_rdtsc (void)
752{
753 uint64_t ts;
754
755 __asm__ __volatile__ ("rdtsc\n" : "=A" (ts));
756 return ts;
757}
758
759#define OIL_STAMP oil_profile_stamp_rdtsc
760
761typedef struct pixman_timer_t pixman_timer_t;
762
763struct pixman_timer_t
764{
765 int initialized;
766 const char * name;
767 uint64_t n_times;
768 uint64_t total;
769 pixman_timer_t *next;
770};
771
772extern int timer_defined;
773
774void pixman_timer_register (pixman_timer_t *timer);
775
776#define TIMER_BEGIN(tname) \
777 { \
778 static pixman_timer_t timer ## tname; \
779 uint64_t begin ## tname; \
780 \
781 if (!timer ## tname.initialized) \
782 { \
783 timer ## tname.initialized = 1; \
784 timer ## tname.name = # tname; \
785 pixman_timer_register (&timer ## tname); \
786 } \
787 \
788 timer ## tname.n_times++; \
789 begin ## tname = OIL_STAMP ();
790
791#define TIMER_END(tname) \
792 timer ## tname.total += OIL_STAMP () - begin ## tname; \
793 }
794
795#endif /* PIXMAN_TIMERS */
796
797#endif /* PIXMAN_PRIVATE_H */
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette