X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin3_src%2FWM%2Fwm_render.c;h=18847bca030f510d66f2e064ee48b042da46b445;hb=76e7cd79e42c40a63c4a9a18dc774da2c44fdb6d;hp=7f4a53b3fb00cb02c50b19ae2baefe18158027ed;hpb=82a4f841eafaff80b7dc258099abd865faaa0467;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin3_src/WM/wm_render.c b/Usermode/Applications/axwin3_src/WM/wm_render.c index 7f4a53b3..18847bca 100644 --- a/Usermode/Applications/axwin3_src/WM/wm_render.c +++ b/Usermode/Applications/axwin3_src/WM/wm_render.c @@ -15,28 +15,31 @@ void WM_Render_FillRect(tWindow *Window, int X, int Y, int W, int H, tColour Col { uint32_t *dest; int i; -// _SysDebug("WM_Render_FilledRect(%p, 0x%x...", Window, Colour); -// _SysDebug(" (%i,%i), %ix%i)", X, Y, W, H); + + X += Window->BorderL; + Y += Window->BorderT; + // Clip to window dimensions if(X < 0) { W += X; X = 0; } if(Y < 0) { H += Y; Y = 0; } if(W <= 0 || H <= 0) return; - if(X >= Window->W) return; - if(Y >= Window->H) return; - if(X + W > Window->W) W = Window->W - X; - if(Y + H > Window->H) H = Window->H - Y; -// _SysDebug(" Clipped to (%i,%i), %ix%i", X, Y, W, H); + if(X >= Window->RealW) return; + if(Y >= Window->RealH) return; + if(X + W > Window->RealW) W = Window->RealW - X; + if(Y + H > Window->RealH) H = Window->RealH - Y; + + // TODO: Catch overflow into decorator area if(!Window->RenderBuffer) { - Window->RenderBuffer = malloc(Window->W*Window->H*4); + Window->RenderBuffer = malloc(Window->RealW*Window->RealH*4); } - dest = (uint32_t*)Window->RenderBuffer + Y*Window->W + X; + dest = (uint32_t*)Window->RenderBuffer + Y*Window->RealW + X; while( H -- ) { for( i = W; i --; ) *dest++ = Colour; - dest += Window->W - W; + dest += Window->RealW - W; } } @@ -65,20 +68,35 @@ void WM_Render_DrawImage(tWindow *Window, int X, int Y, int W, int H, tImage *Im if(!Window->RenderBuffer) { Window->RenderBuffer = malloc(Window->W*Window->H*4); } - + + // Apply offset + X += Window->BorderL; + Y += Window->BorderT; + // Bounds Check - if( X >= Window->W ) return ; - if( Y >= Window->H ) return ; + if( X >= Window->RealW ) return ; + if( Y >= Window->RealH ) return ; // Wrap to image size if( W > Image->Width ) W = Image->Width; if( H > Image->Height ) H = Image->Height; // Wrap to screen size - if( X + W > Window->W ) W = Window->W - X; - if( Y + H > Window->H ) H = Window->H - Y; + if( X + W > Window->RealW ) W = Window->RealW - X; + if( Y + H > Window->RealH ) H = Window->RealH - Y; - dest = (uint32_t*)Window->RenderBuffer + Y * Window->W + X; + // TODO: Catch overflow into decorator area + #if 0 + if( !Window->bDrawingDecorations ) + { + if( X < Window->BorderL ) return ; + if( Y < Window->BorderT ) return ; + if( X + W > Window->BorderL + Window->W ) W = X - (Window->BorderL + Window->W); + if( Y + H > Window->BorderT + Window->H ) H = Y - (Window->BorderT + Window->H); + } + #endif + + dest = (uint32_t*)Window->RenderBuffer + Y * Window->RealW + X; data = Image->Data; // Do the render @@ -116,7 +134,7 @@ void WM_Render_DrawImage(tWindow *Window, int X, int Y, int W, int H, tImage *Im dest[x] = b | (g << 8) | (r << 16); } data += Image->Width * 4; - dest += Window->W; + dest += Window->RealW; } break; @@ -130,7 +148,7 @@ void WM_Render_DrawImage(tWindow *Window, int X, int Y, int W, int H, tImage *Im dest[x] = data[x*3+2] | (data[x*3+1] << 8) | (data[x*3+0] << 16); } data += W * 3; - dest += Window->W; + dest += Window->RealW; } break; default: @@ -139,3 +157,17 @@ void WM_Render_DrawImage(tWindow *Window, int X, int Y, int W, int H, tImage *Im } } +void WM_Render_SetTextCursor(tWindow *Window, int X, int Y, int W, int H, tColour Colour) +{ + if( X < 0 || Y < 0 ) return ; + if( X >= Window->W ) return ; + if( Y >= Window->H ) return ; + if( X + W >= Window->W ) W = Window->W - X; + if( Y + H >= Window->H ) H = Window->H - Y; + + Window->CursorX = X; + Window->CursorY = Y; + Window->CursorW = W; + Window->CursorH = H; +} +