Imported Upstream version 0.3.17
[platform/upstream/liboil.git] / liboil / fb / fbpict.h
1 /*
2  * $XFree86: xc/programs/Xserver/fb/fbpict.h,v 1.7 2001/07/18 10:15:02 keithp Exp $
3  *
4  * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
5  *
6  * Permission to use, copy, modify, distribute, and sell this software and its
7  * documentation for any purpose is hereby granted without fee, provided that
8  * the above copyright notice appear in all copies and that both that
9  * copyright notice and this permission notice appear in supporting
10  * documentation, and that the name of Keith Packard not be used in
11  * advertising or publicity pertaining to distribution of the software without
12  * specific, written prior permission.  Keith Packard makes no
13  * representations about the suitability of this software for any purpose.  It
14  * is provided "as is" without express or implied warranty.
15  *
16  * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18  * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22  * PERFORMANCE OF THIS SOFTWARE.
23  */
24
25 #ifdef HAVE_DIX_CONFIG_H
26 #include <dix-config.h>
27 #endif
28
29 #ifndef _FBPICT_H_
30 #define _FBPICT_H_
31
32 //#include "renderedge.h"
33
34 #define FbIntMult(a,b,t) ( (t) = (a) * (b) + 0x80, ( ( ( (t)>>8 ) + (t) )>>8 ) )
35 #define FbIntDiv(a,b)    (((CARD16) (a) * 255) / (b))
36
37 #define FbGet8(v,i)   ((CARD16) (CARD8) ((v) >> i))
38
39 /*
40  * There are two ways of handling alpha -- either as a single unified value or
41  * a separate value for each component, hence each macro must have two
42  * versions.  The unified alpha version has a 'U' at the end of the name,
43  * the component version has a 'C'.  Similarly, functions which deal with
44  * this difference will have two versions using the same convention.
45  */
46
47 #define FbOverU(x,y,i,a,t) ((t) = FbIntMult(FbGet8(y,i),(a),(t)) + FbGet8(x,i),\
48                            (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i))
49
50 #define FbOverC(x,y,i,a,t) ((t) = FbIntMult(FbGet8(y,i),FbGet8(a,i),(t)) + FbGet8(x,i),\
51                             (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i))
52
53 #define FbInU(x,i,a,t) ((CARD32) FbIntMult(FbGet8(x,i),(a),(t)) << (i))
54
55 #define FbInC(x,i,a,t) ((CARD32) FbIntMult(FbGet8(x,i),FbGet8(a,i),(t)) << (i))
56
57 #define FbGen(x,y,i,ax,ay,t,u,v) ((t) = (FbIntMult(FbGet8(y,i),ay,(u)) + \
58                                          FbIntMult(FbGet8(x,i),ax,(v))),\
59                                   (CARD32) ((CARD8) ((t) | \
60                                                      (0 - ((t) >> 8)))) << (i))
61
62 #define FbAdd(x,y,i,t)  ((t) = FbGet8(x,i) + FbGet8(y,i), \
63                          (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i))
64
65
66 #define Alpha(x) ((x) >> 24)
67 #define Red(x) (((x) >> 16) & 0xff)
68 #define Green(x) (((x) >> 8) & 0xff)
69 #define Blue(x) ((x) & 0xff)
70
71 #define fbComposeGetSolid(pict, bits, fmt) { \
72     FbBits      *__bits__; \
73     FbStride    __stride__; \
74     int         __bpp__; \
75     int         __xoff__,__yoff__; \
76 \
77     fbGetDrawable((pict)->pDrawable,__bits__,__stride__,__bpp__,__xoff__,__yoff__); \
78     switch (__bpp__) { \
79     case 32: \
80         (bits) = *(CARD32 *) __bits__; \
81         break; \
82     case 24: \
83         (bits) = Fetch24 ((CARD8 *) __bits__); \
84         break; \
85     case 16: \
86         (bits) = *(CARD16 *) __bits__; \
87         (bits) = cvt0565to8888(bits); \
88         break; \
89     default: \
90         return; \
91     } \
92     /* If necessary, convert RGB <--> BGR. */ \
93     if (PICT_FORMAT_TYPE((pict)->format) != PICT_FORMAT_TYPE(fmt)) \
94     { \
95         (bits) = (((bits) & 0xff000000) | \
96                   (((bits) & 0x00ff0000) >> 16) | \
97                   (((bits) & 0x0000ff00) >>  0) | \
98                   (((bits) & 0x000000ff) << 16)); \
99     } \
100     /* manage missing src alpha */ \
101     if ((pict)->pFormat->direct.alphaMask == 0) \
102         (bits) |= 0xff000000; \
103 }
104
105 #define fbComposeGetStart(pict,x,y,type,stride,line,mul) {\
106     FbBits      *__bits__; \
107     FbStride    __stride__; \
108     int         __bpp__; \
109     int         __xoff__,__yoff__; \
110 \
111     fbGetDrawable((pict)->pDrawable,__bits__,__stride__,__bpp__,__xoff__,__yoff__); \
112     (stride) = __stride__ * sizeof (FbBits) / sizeof (type); \
113     (line) = ((type *) __bits__) + (stride) * ((y) - __yoff__) + (mul) * ((x) - __xoff__); \
114 }
115 #define cvt8888to0565(s)    ((((s) >> 3) & 0x001f) | \
116                              (((s) >> 5) & 0x07e0) | \
117                              (((s) >> 8) & 0xf800))
118 #define cvt0565to8888(s)    (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \
119                              ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \
120                              ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000)))
121
122 #if IMAGE_BYTE_ORDER == MSBFirst
123 #define Fetch24(a)  ((unsigned long) (a) & 1 ? \
124                      ((*(a) << 16) | *((CARD16 *) ((a)+1))) : \
125                      ((*((CARD16 *) (a)) << 8) | *((a)+2)))
126 #define Store24(a,v) ((unsigned long) (a) & 1 ? \
127                       ((*(a) = (CARD8) ((v) >> 16)), \
128                        (*((CARD16 *) ((a)+1)) = (CARD16) (v))) : \
129                       ((*((CARD16 *) (a)) = (CARD16) ((v) >> 8)), \
130                        (*((a)+2) = (CARD8) (v))))
131 #else
132 #define Fetch24(a)  ((unsigned long) (a) & 1 ? \
133                      ((*(a)) | (*((CARD16 *) ((a)+1)) << 8)) : \
134                      ((*((CARD16 *) (a))) | (*((a)+2) << 16)))
135 #define Store24(a,v) ((unsigned long) (a) & 1 ? \
136                       ((*(a) = (CARD8) (v)), \
137                        (*((CARD16 *) ((a)+1)) = (CARD16) ((v) >> 8))) : \
138                       ((*((CARD16 *) (a)) = (CARD16) (v)),\
139                        (*((a)+2) = (CARD8) ((v) >> 16))))
140 #endif
141                       
142 /*
143    The methods below use some tricks to be able to do two color
144    components at the same time.
145 */
146
147 /*
148   x_c = (x_c * a) / 255
149 */
150 #define FbByteMul(x, a) do {                                      \
151         CARD32 t = (x & 0xff00ff) *a;                           \
152         t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8;          \
153         t &= 0xff00ff;                                            \
154                                                                   \
155         x = ((x >> 8) & 0xff00ff) * a;                            \
156         x = (x + ((x >> 8) & 0xff00ff) + 0x800080);               \
157         x &= 0xff00ff00;                                          \
158         x += t;                                                   \
159     } while (0)
160
161 /*
162   x_c = (x_c * a) / 255 + y
163 */
164 #define FbByteMulAdd(x, a, y) do {                                \
165         CARD32 t = (x & 0xff00ff) * a;                            \
166         t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8;          \
167         t &= 0xff00ff;                                            \
168         t += y & 0xff00ff;                                        \
169         t |= 0x1000100 - ((t >> 8) & 0xff00ff);                   \
170         t &= 0xff00ff;                                            \
171                                                                   \
172         x = ((x >> 8) & 0xff00ff) * a;                              \
173         x = (x + ((x >> 8) & 0xff00ff) + 0x800080) >> 8;            \
174         x &= 0xff00ff;                                              \
175         x += (y >> 8) & 0xff00ff;                                   \
176         x |= 0x1000100 - ((t >> 8) & 0xff00ff);                     \
177         x &= 0xff00ff;                                              \
178         x <<= 8;                                                    \
179         x += t;                                                     \
180     } while (0)
181
182 /*
183   x_c = (x_c * a + y_c * b) / 255
184 */
185 #define FbByteAddMul(x, a, y, b) do {                                   \
186         CARD32 t;                                                       \
187         CARD32 r = (x >> 24) * a + (y >> 24) * b;                       \
188         r += (r >> 8) + 0x80;                                           \
189         r >>= 8;                                                        \
190                                                                         \
191         t = (x & 0xff00) * a + (y & 0xff00) * b;                        \
192         t += (t >> 8) + 0x8000;                                         \
193         t >>= 16;                                                       \
194                                                                         \
195         t |= r << 16;                                                   \
196         t |= 0x1000100 - ((t >> 8) & 0xff00ff);                         \
197         t &= 0xff00ff;                                                  \
198         t <<= 8;                                                        \
199                                                                         \
200         r = ((x >> 16) & 0xff) * a + ((y >> 16) & 0xff) * b;            \
201         r += (r >> 8) + 0x80;                                           \
202         r >>= 8;                                                        \
203                                                                         \
204         x = (x & 0xff) * a + (y & 0xff) * b;                            \
205         x += (x >> 8) + 0x80;                                           \
206         x >>= 8;                                                        \
207         x |= r << 16;                                                   \
208         x |= 0x1000100 - ((x >> 8) & 0xff00ff);                         \
209         x &= 0xff00ff;                                                  \
210         x |= t;                                                         \
211 } while (0)
212
213 /*
214   x_c = (x_c * a + y_c *b) / 256
215 */
216 #define FbByteAddMul_256(x, a, y, b) do {                               \
217         CARD32 t = (x & 0xff00ff) * a + (y & 0xff00ff) * b;             \
218         t >>= 8;                                                        \
219         t &= 0xff00ff;                                                  \
220                                                                         \
221         x = ((x >> 8) & 0xff00ff) * a + ((y >> 8) & 0xff00ff) * b;      \
222         x &= 0xff00ff00;                                                \
223         x += t;                                                         \
224 } while (0)
225 /*
226   x_c = (x_c * a_c) / 255
227 */
228 #define FbByteMulC(x, a) do {                           \
229         CARD32 t;                                       \
230         CARD32 r = (x & 0xff) * (a & 0xff);             \
231         r |= (x & 0xff0000) * ((a >> 16) & 0xff);       \
232         r = (r + ((r >> 8) & 0xff00ff) + 0x800080) >> 8;        \
233         r &= 0xff00ff;                                  \
234                                                         \
235         x >>= 8;                                        \
236         t = (x & 0xff) * ((a >> 8) & 0xff);             \
237         t |= (x & 0xff0000) * (a >> 24);                \
238         t = (t + ((t >> 8) & 0xff00ff) + 0x800080);     \
239         x = r | (t & 0xff00ff00);                       \
240                                                         \
241     } while (0)
242
243 /*
244   x_c = (x_c * a) / 255 + y
245 */
246 #define FbByteMulAddC(x, a, y) do {                                 \
247         CARD32 t;                                                   \
248         CARD32 r = (x & 0xff) * (a & 0xff);                         \
249         r |= (x & 0xff0000) * ((a >> 16) & 0xff);                   \
250         r = (r + ((r >> 8) & 0xff00ff) + 0x800080) >> 8;            \
251         r &= 0xff00ff;                                              \
252         r += y & 0xff00ff;                                          \
253         r |= 0x1000100 - ((r >> 8) & 0xff00ff);                     \
254         r &= 0xff00ff;                                              \
255                                                                     \
256         x >>= 8;                                                       \
257         t = (x & 0xff) * ((a >> 8) & 0xff);                            \
258         t |= (x & 0xff0000) * (a >> 24);                               \
259         t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8;               \
260         t &= 0xff00ff;                                                 \
261         t += (y >> 8) & 0xff00ff;                                      \
262         t |= 0x1000100 - ((t >> 8) & 0xff00ff);                        \
263         t &= 0xff00ff;                                                 \
264         x = r | (t << 8);                                              \
265     } while (0)
266
267 /*
268   x_c = (x_c * a_c + y_c * b) / 255
269 */
270 #define FbByteAddMulC(x, a, y, b) do {                                  \
271         CARD32 t;                                                       \
272         CARD32 r = (x >> 24) * (a >> 24) + (y >> 24) * b;               \
273         r += (r >> 8) + 0x80;                                           \
274         r >>= 8;                                                        \
275                                                                         \
276         t = (x & 0xff00) * ((a >> 8) & 0xff) + (y & 0xff00) * b;        \
277         t += (t >> 8) + 0x8000;                                         \
278         t >>= 16;                                                       \
279                                                                         \
280         t |= r << 16;                                                   \
281         t |= 0x1000100 - ((t >> 8) & 0xff00ff);                         \
282         t &= 0xff00ff;                                                  \
283         t <<= 8;                                                        \
284                                                                         \
285         r = ((x >> 16) & 0xff) * ((a >> 16) & 0xff) + ((y >> 16) & 0xff) * b; \
286         r += (r >> 8) + 0x80;                                           \
287         r >>= 8;                                                        \
288                                                                         \
289         x = (x & 0xff) * (a & 0xff) + (y & 0xff) * b;                   \
290         x += (x >> 8) + 0x80;                                           \
291         x >>= 8;                                                        \
292         x |= r << 16;                                                   \
293         x |= 0x1000100 - ((x >> 8) & 0xff00ff);                         \
294         x &= 0xff00ff;                                                  \
295         x |= t;                                                         \
296     } while (0)
297  
298 /*
299   x_c = min(x_c + y_c, 255)
300 */
301 #define FbByteAdd(x, y) do {                                            \
302         CARD32 t;                                                       \
303         CARD32 r = (x & 0xff00ff) + (y & 0xff00ff);                     \
304         r |= 0x1000100 - ((r >> 8) & 0xff00ff);                         \
305         r &= 0xff00ff;                                                  \
306                                                                         \
307         t = ((x >> 8) & 0xff00ff) + ((y >> 8) & 0xff00ff);              \
308         t |= 0x1000100 - ((t >> 8) & 0xff00ff);                         \
309         r |= (t & 0xff00ff) << 8;                                       \
310         x = r;                                                          \
311     } while (0)
312
313 #define div_255(x) (((x) + ((x) >> 8) + 0x80) >> 8)
314
315 #if defined(__i386__) && defined(__GNUC__)
316 #define FASTCALL __attribute__((regparm(3)))
317 #else
318 #define FASTCALL
319 #endif
320
321 #if defined(__GNUC__)
322 #define INLINE __inline__
323 #else
324 #define INLINE
325 #endif
326
327 typedef struct _FbComposeData {
328     CARD8       op;
329     PicturePtr  src;
330     PicturePtr  mask;
331     PicturePtr  dest;
332     INT16       xSrc;
333     INT16       ySrc;
334     INT16       xMask;
335     INT16       yMask;
336     INT16       xDest;
337     INT16       yDest;
338     CARD16      width;
339     CARD16      height;
340 } FbComposeData;
341
342 #if 0
343 typedef FASTCALL void (*CombineMaskU) (CARD32 *src, const CARD32 *mask, int width);
344 typedef FASTCALL void (*CombineFuncU) (CARD32 *dest, const CARD32 *src, int width);
345 typedef FASTCALL void (*CombineFuncC) (CARD32 *dest, CARD32 *src, CARD32 *mask, int width);
346
347 typedef struct _FbComposeFunctions {
348     CombineFuncU *combineU;
349     CombineFuncC *combineC;
350     CombineMaskU combineMaskU;
351 } FbComposeFunctions;
352
353 /* fbcompose.c */
354
355 void
356 fbCompositeGeneral (CARD8       op,
357                     PicturePtr  pSrc,
358                     PicturePtr  pMask,
359                     PicturePtr  pDst,
360                     INT16       xSrc,
361                     INT16       ySrc,
362                     INT16       xMask,
363                     INT16       yMask,
364                     INT16       xDst,
365                     INT16       yDst,
366                     CARD16      width,
367                     CARD16      height);
368
369
370 /* fbedge.c */
371 void
372 fbRasterizeEdges (FbBits        *buf,
373                   int           bpp,
374                   int           width,
375                   int           stride,
376                   RenderEdge    *l,
377                   RenderEdge    *r,
378                   xFixed        t,
379                   xFixed        b);
380
381 /* fbpict.c */
382 CARD32
383 fbOver (CARD32 x, CARD32 y);
384
385 CARD32
386 fbOver24 (CARD32 x, CARD32 y);
387
388 CARD32
389 fbIn (CARD32 x, CARD8 y);
390
391 void
392 fbCompositeSolidMask_nx8x8888 (CARD8      op,
393                                PicturePtr pSrc,
394                                PicturePtr pMask,
395                                PicturePtr pDst,
396                                INT16      xSrc,
397                                INT16      ySrc,
398                                INT16      xMask,
399                                INT16      yMask,
400                                INT16      xDst,
401                                INT16      yDst,
402                                CARD16     width,
403                                CARD16     height);
404
405 void
406 fbCompositeSolidMask_nx8x0888 (CARD8      op,
407                                PicturePtr pSrc,
408                                PicturePtr pMask,
409                                PicturePtr pDst,
410                                INT16      xSrc,
411                                INT16      ySrc,
412                                INT16      xMask,
413                                INT16      yMask,
414                                INT16      xDst,
415                                INT16      yDst,
416                                CARD16     width,
417                                CARD16     height);
418
419 void
420 fbCompositeSolidMask_nx8888x8888C (CARD8      op,
421                                    PicturePtr pSrc,
422                                    PicturePtr pMask,
423                                    PicturePtr pDst,
424                                    INT16      xSrc,
425                                    INT16      ySrc,
426                                    INT16      xMask,
427                                    INT16      yMask,
428                                    INT16      xDst,
429                                    INT16      yDst,
430                                    CARD16     width,
431                                    CARD16     height);
432
433 void
434 fbCompositeSolidMask_nx8x0565 (CARD8      op,
435                                PicturePtr pSrc,
436                                PicturePtr pMask,
437                                PicturePtr pDst,
438                                INT16      xSrc,
439                                INT16      ySrc,
440                                INT16      xMask,
441                                INT16      yMask,
442                                INT16      xDst,
443                                INT16      yDst,
444                                CARD16     width,
445                                CARD16     height);
446
447 void
448 fbCompositeSolidMask_nx8888x0565C (CARD8      op,
449                                    PicturePtr pSrc,
450                                    PicturePtr pMask,
451                                    PicturePtr pDst,
452                                    INT16      xSrc,
453                                    INT16      ySrc,
454                                    INT16      xMask,
455                                    INT16      yMask,
456                                    INT16      xDst,
457                                    INT16      yDst,
458                                    CARD16     width,
459                                    CARD16     height);
460
461 void
462 fbCompositeSrc_8888x8888 (CARD8      op,
463                           PicturePtr pSrc,
464                           PicturePtr pMask,
465                           PicturePtr pDst,
466                           INT16      xSrc,
467                           INT16      ySrc,
468                           INT16      xMask,
469                           INT16      yMask,
470                           INT16      xDst,
471                           INT16      yDst,
472                           CARD16     width,
473                           CARD16     height);
474
475 void
476 fbCompositeSrc_8888x0888 (CARD8      op,
477                          PicturePtr pSrc,
478                          PicturePtr pMask,
479                          PicturePtr pDst,
480                          INT16      xSrc,
481                          INT16      ySrc,
482                          INT16      xMask,
483                          INT16      yMask,
484                          INT16      xDst,
485                          INT16      yDst,
486                          CARD16     width,
487                          CARD16     height);
488
489 void
490 fbCompositeSrc_8888x0565 (CARD8      op,
491                           PicturePtr pSrc,
492                           PicturePtr pMask,
493                           PicturePtr pDst,
494                           INT16      xSrc,
495                           INT16      ySrc,
496                           INT16      xMask,
497                           INT16      yMask,
498                           INT16      xDst,
499                           INT16      yDst,
500                           CARD16     width,
501                           CARD16     height);
502
503 void
504 fbCompositeSrc_0565x0565 (CARD8      op,
505                           PicturePtr pSrc,
506                           PicturePtr pMask,
507                           PicturePtr pDst,
508                           INT16      xSrc,
509                           INT16      ySrc,
510                           INT16      xMask,
511                           INT16      yMask,
512                           INT16      xDst,
513                           INT16      yDst,
514                           CARD16     width,
515                           CARD16     height);
516
517 void
518 fbCompositeSrcAdd_8000x8000 (CARD8      op,
519                              PicturePtr pSrc,
520                              PicturePtr pMask,
521                              PicturePtr pDst,
522                              INT16      xSrc,
523                              INT16      ySrc,
524                              INT16      xMask,
525                              INT16      yMask,
526                              INT16      xDst,
527                              INT16      yDst,
528                              CARD16     width,
529                              CARD16     height);
530
531 void
532 fbCompositeSrcAdd_8888x8888 (CARD8      op,
533                              PicturePtr pSrc,
534                              PicturePtr pMask,
535                              PicturePtr pDst,
536                              INT16      xSrc,
537                              INT16      ySrc,
538                              INT16      xMask,
539                              INT16      yMask,
540                              INT16      xDst,
541                              INT16      yDst,
542                              CARD16     width,
543                              CARD16     height);
544
545 void
546 fbCompositeSrcAdd_1000x1000 (CARD8      op,
547                              PicturePtr pSrc,
548                              PicturePtr pMask,
549                              PicturePtr pDst,
550                              INT16      xSrc,
551                              INT16      ySrc,
552                              INT16      xMask,
553                              INT16      yMask,
554                              INT16      xDst,
555                              INT16      yDst,
556                              CARD16     width,
557                              CARD16     height);
558
559 void
560 fbCompositeSolidMask_nx1xn (CARD8      op,
561                             PicturePtr pSrc,
562                             PicturePtr pMask,
563                             PicturePtr pDst,
564                             INT16      xSrc,
565                             INT16      ySrc,
566                             INT16      xMask,
567                             INT16      yMask,
568                             INT16      xDst,
569                             INT16      yDst,
570                             CARD16     width,
571                             CARD16     height);
572
573 void
574 fbComposite (CARD8      op,
575              PicturePtr pSrc,
576              PicturePtr pMask,
577              PicturePtr pDst,
578              INT16      xSrc,
579              INT16      ySrc,
580              INT16      xMask,
581              INT16      yMask,
582              INT16      xDst,
583              INT16      yDst,
584              CARD16     width,
585              CARD16     height);
586
587 /* fbtrap.c */
588
589 void
590 fbAddTraps (PicturePtr  pPicture,
591             INT16       xOff,
592             INT16       yOff,
593             int         ntrap,
594             xTrap       *traps);
595
596 void
597 fbRasterizeTrapezoid (PicturePtr    alpha,
598                       xTrapezoid    *trap,
599                       int           x_off,
600                       int           y_off);
601
602 void
603 fbAddTriangles (PicturePtr  pPicture,
604                 INT16       xOff,
605                 INT16       yOff,
606                 int         ntri,
607                 xTriangle   *tris);
608 #endif
609
610 #endif /* _FBPICT_H_ */