Rev 1558 | Rev 1567 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1558 | Rev 1559 | ||
---|---|---|---|
Line 202... | Line 202... | ||
202 | unsigned int x; |
202 | unsigned int x; |
203 | for (x = 0; x < viewports[vp].width; x++) |
203 | for (x = 0; x < viewports[vp].width; x++) |
204 | putpixel(vp, x, y, viewports[vp].style.bg_color); |
204 | putpixel(vp, x, y, viewports[vp].style.bg_color); |
205 | } |
205 | } |
206 | 206 | ||
- | 207 | static void draw_rectangle(int vp, unsigned int sx, unsigned int sy, |
|
- | 208 | unsigned int width, unsigned int height, |
|
- | 209 | int color) |
|
- | 210 | { |
|
- | 211 | unsigned int x, y; |
|
- | 212 | ||
- | 213 | /* Clear first line */ |
|
- | 214 | for (x = 0; x < width; x++) |
|
- | 215 | putpixel(vp, sx + x, sy, color); |
|
- | 216 | ||
- | 217 | /* Recompute to screen coords */ |
|
- | 218 | sx += viewports[vp].x; |
|
- | 219 | sy += viewports[vp].y; |
|
- | 220 | /* Copy the rest */ |
|
- | 221 | for (y = sy+1;y < sy+height; y++) |
|
- | 222 | memcpy(&screen.fbaddress[POINTPOS(sx,y)], |
|
- | 223 | &screen.fbaddress[POINTPOS(sx,sy)], |
|
- | 224 | screen.pixelbytes * width); |
|
- | 225 | ||
- | 226 | } |
|
- | 227 | ||
207 | /** Fill viewport with background color */ |
228 | /** Fill viewport with background color */ |
208 | static void clear_port(int vp) |
229 | static void clear_port(int vp) |
209 | { |
230 | { |
210 | unsigned int y; |
231 | viewport_t *vport = &viewports[vp]; |
211 | 232 | ||
212 | clear_line(vp, 0); |
- | |
213 | for (y = viewports[vp].y+1; y < viewports[vp].y+viewports[vp].height; y++) { |
233 | draw_rectangle(vp, 0, 0, vport->width, vport->height, vport->style.bg_color); |
214 | memcpy(&screen.fbaddress[POINTPOS(viewports[vp].x,y)], |
- | |
215 | &screen.fbaddress[POINTPOS(viewports[vp].x,viewports[vp].y)], |
- | |
216 | screen.pixelbytes * viewports[vp].width); |
- | |
217 | } |
- | |
218 | } |
234 | } |
219 | 235 | ||
220 | /** Scroll port up/down |
236 | /** Scroll port up/down |
221 | * |
237 | * |
222 | * @param vp Viewport to scroll |
238 | * @param vp Viewport to scroll |
Line 225... | Line 241... | ||
225 | static void scroll_port(int vp, int rows) |
241 | static void scroll_port(int vp, int rows) |
226 | { |
242 | { |
227 | int y; |
243 | int y; |
228 | int startline; |
244 | int startline; |
229 | int endline; |
245 | int endline; |
- | 246 | viewport_t *vport = &viewports[vp]; |
|
230 | 247 | ||
231 | if (rows > 0) { |
248 | if (rows > 0) { |
232 | for (y=viewports[vp].y; y < viewports[vp].y+viewports[vp].height - rows*FONT_SCANLINES; y++) |
249 | for (y=vport->y; y < vport->y+vport->height - rows*FONT_SCANLINES; y++) |
233 | memcpy(&screen.fbaddress[POINTPOS(viewports[vp].x,y)], |
250 | memcpy(&screen.fbaddress[POINTPOS(vport->x,y)], |
234 | &screen.fbaddress[POINTPOS(viewports[vp].x,y + rows*FONT_SCANLINES)], |
251 | &screen.fbaddress[POINTPOS(vport->x,y + rows*FONT_SCANLINES)], |
235 | screen.pixelbytes * viewports[vp].width); |
252 | screen.pixelbytes * vport->width); |
236 | /* Clear last row */ |
- | |
237 | startline = viewports[vp].y+FONT_SCANLINES*(viewports[vp].rows-1); |
253 | draw_rectangle(vp, 0, FONT_SCANLINES*(vport->rows - 1), |
238 | endline = viewports[vp].y + viewports[vp].height; |
- | |
239 | clear_line(vp, startline); |
- | |
240 | for (y=startline+1;y < endline; y++) |
- | |
241 | memcpy(&screen.fbaddress[POINTPOS(viewports[vp].x,y)], |
- | |
242 | &screen.fbaddress[POINTPOS(viewports[vp].x,startline)], |
254 | vport->width, FONT_SCANLINES, vport->style.bg_color); |
243 | screen.pixelbytes * viewports[vp].width); |
- | |
244 | - | ||
245 | } else if (rows < 0) { |
255 | } else if (rows < 0) { |
246 | rows = -rows; |
256 | rows = -rows; |
247 | for (y=viewports[vp].y + viewports[vp].height-1; y >= viewports[vp].y + rows*FONT_SCANLINES; y--) |
257 | for (y=vport->y + vport->height-1; y >= vport->y + rows*FONT_SCANLINES; y--) |
248 | memcpy(&screen.fbaddress[POINTPOS(viewports[vp].x,y)], |
258 | memcpy(&screen.fbaddress[POINTPOS(vport->x,y)], |
249 | &screen.fbaddress[POINTPOS(viewports[vp].x,y - rows*FONT_SCANLINES)], |
259 | &screen.fbaddress[POINTPOS(vport->x,y - rows*FONT_SCANLINES)], |
250 | screen.pixelbytes * viewports[vp].width); |
260 | screen.pixelbytes * vport->width); |
251 | /* Clear first row */ |
- | |
252 | clear_line(0, viewports[vp].style.bg_color); |
261 | draw_rectangle(vp, 0, 0, vport->width, FONT_SCANLINES, vport->style.bg_color); |
253 | for (y=1;y < rows*FONT_SCANLINES; y++) |
- | |
254 | memcpy(&screen.fbaddress[POINTPOS(viewports[vp].x,viewports[vp].y+y)], |
- | |
255 | &screen.fbaddress[POINTPOS(viewports[vp].x,viewports[vp].y)], |
- | |
256 | screen.pixelbytes * viewports[vp].width); |
- | |
257 | } |
262 | } |
258 | } |
263 | } |
259 | 264 | ||
260 | static void invert_pixel(int vp,unsigned int x, unsigned int y) |
265 | static void invert_pixel(int vp,unsigned int x, unsigned int y) |
261 | { |
266 | { |