Backup - Adding design for AxWin3 to git
[tpg/acess2.git] / Usermode / Applications / axwin0_src / graphics.c
1 /*\r
2 Acess OS Window Manager\r
3 */\r
4 #include "header.h"\r
5 \r
6 #define ABS(x)  ((x)<0?-(x):(x))\r
7 #define PLOT(x,y,colour)        (gScreenBuffer[(y)*SCREEN_WIDTH+(x)] = (colour))\r
8 \r
9 void draw_line(int x1, int y1, int x2, int y2, Uint32 colour)\r
10 {\r
11         int dy, dx;\r
12         int     i;\r
13         float   step;\r
14         \r
15         dy = ABS(y2 - y1);\r
16         dx = ABS(x2 - x1);\r
17         \r
18         if(dx == 0) {\r
19                 if(y1 < y2) {\r
20                         for(i=y1;i<y2;i++)\r
21                                 PLOT(x1, i, colour);\r
22                 } else {\r
23                         for(i=y2;i<y1;i++)\r
24                                 PLOT(x1, i, colour);\r
25                 }\r
26         }\r
27         \r
28         if(x1 < x2) {\r
29                 step = (dy/dx); step = (y2>y1?step:-step);\r
30                 for(i=x1;i<x2;i++)      PLOT(i, y1+(int)(step*i), colour);\r
31         } else {\r
32                 step = (dy/dx); step = (y2>y1?-step:step);\r
33                 for(i=x2;i<x1;i++)      PLOT(i, y1+(int)(step*i), colour);\r
34         }\r
35 }\r
36 \r
37 void draw_rect(int x, int y, int w, int h, Uint32 colour)\r
38 {\r
39         Uint32  *p = gScreenBuffer+y*SCREEN_WIDTH+x;\r
40         int             i, j;\r
41         \r
42         for(j=0;j<h;j++) {\r
43                 for(i=0;i<w;i++)        *(p+i) = colour;\r
44                 p += SCREEN_WIDTH;\r
45         }\r
46 }\r
47 \r
48 void draw_bmp(BITMAP *bmp, RECT *rc)\r
49 {\r
50         int w, h, i, j;\r
51         Uint32  a;\r
52         int     r,g,b;\r
53         Uint32  *buf, *bi;\r
54         Uint16  *bi16;\r
55         Uint8   *bi8;\r
56         \r
57         #if DEBUG\r
58                 k_printf("draw_bmp: (bmp=0x%x, rc=0x%x)\n", bmp, rc);\r
59         #endif\r
60         \r
61         buf = gScreenBuffer+rc->y1*SCREEN_WIDTH+rc->x1;\r
62         bi = bmp->data; bi16 = bmp->data;       bi8 = bmp->data;\r
63         w = bmp->width;\r
64         h = bmp->height;\r
65         \r
66         #if DEBUG\r
67                 k_printf(" draw_bmp: bmp->bpp = %i\n", bmp->bpp);\r
68         #endif\r
69         \r
70         switch(bmp->bpp)\r
71         {\r
72         // === 32bit Colour ===\r
73         case 32:\r
74                 for(i = 0; i < h; i++)\r
75                 {\r
76                         for(j = 0; j < w; j++)\r
77                         {\r
78                                 a = *bi >> 24;\r
79                                 switch(a)\r
80                                 {\r
81                                 case 0xFF:      //Fully Visible\r
82                                         buf[j] = *bi;\r
83                                         break;\r
84                                 case 0x80:      // 50/50\r
85                                         r = ((*bi>>16)&0xFF) + ((*buf>>16)&0xFF);\r
86                                         g = ((*bi>>8)&0xFF) + ((*buf>>8)&0xFF);\r
87                                         b = ((*bi)&0xFF) + ((*buf)&0xFF);\r
88                                         r >>= 1;        g >>= 1;        b >>= 1;\r
89                                         buf[j] = (r<<16) | (g<<8) | b;\r
90                                         break;\r
91                                 case 0x00:      // Fully Transparent\r
92                                         break;\r
93                                 default:        // Everything else\r
94                                         r = ((*bi>>16)&0xFF)*(255-a) + ((*buf>>16)&0xFF)*a;\r
95                                         g = ((*bi>>8)&0xFF)*(255-a) + ((*buf>>8)&0xFF)*a;\r
96                                         b = ((*bi)&0xFF)*(255-a) + ((*buf)&0xFF)*a;\r
97                                         r >>= 8;        g >>= 8;        b >>= 8;\r
98                                         buf[j] = (r<<16) | (g<<8) | b;\r
99                                         break;\r
100                                 }\r
101                                 bi++;\r
102                         }\r
103                         buf += SCREEN_WIDTH;\r
104                 }\r
105                 break;\r
106         }\r
107 }\r

UCC git Repository :: git.ucc.asn.au