2 * Acess2 Window Manager v3
3 * - By John Hodge (thePowersGang)
6 * - Window rendering functions
10 #include <wm_internals.h>
14 void WM_Render_FillRect(tWindow *Window, int X, int Y, int W, int H, tColour Colour)
18 // _SysDebug("WM_Render_FilledRect(%p, 0x%x...", Window, Colour);
19 // _SysDebug(" (%i,%i), %ix%i)", X, Y, W, H);
20 // Clip to window dimensions
21 if(X < 0) { W += X; X = 0; }
22 if(Y < 0) { H += Y; Y = 0; }
23 if(W <= 0 || H <= 0) return;
24 if(X >= Window->W) return;
25 if(Y >= Window->H) return;
26 if(X + W > Window->W) W = Window->W - X;
27 if(Y + H > Window->H) H = Window->H - Y;
28 // _SysDebug(" Clipped to (%i,%i), %ix%i", X, Y, W, H);
30 if(!Window->RenderBuffer) {
31 Window->RenderBuffer = malloc(Window->W*Window->H*4);
34 dest = (uint32_t*)Window->RenderBuffer + Y*Window->W + X;
39 dest += Window->W - W;
43 void WM_Render_DrawRect(tWindow *Window, int X, int Y, int W, int H, tColour Colour)
45 WM_Render_FillRect(Window, X, Y, W, 1, Colour);
46 WM_Render_FillRect(Window, X, Y+H-1, W, 1, Colour);
47 WM_Render_FillRect(Window, X, Y, 1, H, Colour);
48 WM_Render_FillRect(Window, X+W-1, Y, 1, H, Colour);
52 * \brief Draw an image to the screen
53 * \todo Maybe have support for an offset in the image
55 void WM_Render_DrawImage(tWindow *Window, int X, int Y, int W, int H, tImage *Image)
65 if(!Window->RenderBuffer) {
66 Window->RenderBuffer = malloc(Window->W*Window->H*4);
70 if( X >= Window->W ) return ;
71 if( Y >= Window->H ) return ;
74 if( W > Image->Width ) W = Image->Width;
75 if( H > Image->Height ) H = Image->Height;
77 // Wrap to screen size
78 if( X + W > Window->W ) W = Window->W - X;
79 if( Y + H > Window->H ) H = Window->H - Y;
81 dest = (uint32_t*)Window->RenderBuffer + Y * Window->W + X;
85 switch( Image->Format )
88 for( y = 0; y < H; y ++ )
90 int r, g, b, a; // New
91 int or, og, ob; // Original
92 for( x = 0; x < W; x ++ )
94 b = data[x*4+0]; g = data[x*4+1]; r = data[x*4+2]; a = data[x*4+3];
95 if( a == 0 ) continue; // 100% transparent
96 ob = dest[x]&0xFF; og = (dest[x] >> 8)&0xFF; or = (dest[x] >> 16)&0xFF;
100 // Transparent: Handled above
111 r = (or * (255-a) + r * a) / 255;
112 g = (og * (255-a) + g * a) / 255;
113 b = (ob * (255-a) + b * a) / 255;
116 dest[x] = b | (g << 8) | (r << 16);
118 data += Image->Width * 4;
125 for( y = 0; y < H; y ++ )
127 for( x = 0; x < W; x ++ )
130 dest[x] = data[x*3+2] | (data[x*3+1] << 8) | (data[x*3+0] << 16);
137 _SysDebug("ERROR: Unknown image format %i\n", Image->Format);