Rev 3715 | Rev 3724 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 3715 | Rev 3723 | ||
|---|---|---|---|
| Line 137... | Line 137... | ||
| 137 | static pixmap_t pixmaps[MAX_PIXMAPS]; |
137 | static pixmap_t pixmaps[MAX_PIXMAPS]; |
| 138 | static viewport_t viewports[128]; |
138 | static viewport_t viewports[128]; |
| 139 | 139 | ||
| 140 | static bool client_connected = false; /**< Allow only 1 connection */ |
140 | static bool client_connected = false; /**< Allow only 1 connection */ |
| 141 | 141 | ||
| - | 142 | static void draw_glyph(viewport_t *vport, bool cursor, unsigned int col, |
|
| - | 143 | unsigned int row); |
|
| - | 144 | ||
| - | 145 | ||
| 142 | #define RED(x, bits) ((x >> (8 + 8 + 8 - bits)) & ((1 << bits) - 1)) |
146 | #define RED(x, bits) ((x >> (8 + 8 + 8 - bits)) & ((1 << bits) - 1)) |
| 143 | #define GREEN(x, bits) ((x >> (8 + 8 - bits)) & ((1 << bits) - 1)) |
147 | #define GREEN(x, bits) ((x >> (8 + 8 - bits)) & ((1 << bits) - 1)) |
| 144 | #define BLUE(x, bits) ((x >> (8 - bits)) & ((1 << bits) - 1)) |
148 | #define BLUE(x, bits) ((x >> (8 - bits)) & ((1 << bits) - 1)) |
| 145 | 149 | ||
| 146 | #define COL2X(col) ((col) * FONT_WIDTH) |
150 | #define COL2X(col) ((col) * FONT_WIDTH) |
| Line 217... | Line 221... | ||
| 217 | { |
221 | { |
| 218 | *((uint8_t *) dst) |
222 | *((uint8_t *) dst) |
| 219 | = ~((RED(rgb, 3) << 5) | (GREEN(rgb, 2) << 3) | BLUE(rgb, 3)); |
223 | = ~((RED(rgb, 3) << 5) | (GREEN(rgb, 2) << 3) | BLUE(rgb, 3)); |
| 220 | } |
224 | } |
| 221 | 225 | ||
| - | 226 | /** Draw a filled rectangle. */ |
|
| - | 227 | static void draw_filled_rect(unsigned int x0, unsigned int y0, unsigned int x1, |
|
| - | 228 | unsigned int y1, uint32_t color) |
|
| - | 229 | { |
|
| - | 230 | unsigned int x, y; |
|
| - | 231 | uint8_t cbuf[4]; |
|
| - | 232 | ||
| - | 233 | screen.rgb_conv(cbuf, color); |
|
| - | 234 | ||
| - | 235 | for (y = y0; y < y1; y++) { |
|
| - | 236 | for (x = x0; x < x1; x++) { |
|
| - | 237 | memcpy(&screen.fb_addr[FB_POS(x, y)], cbuf, |
|
| - | 238 | screen.pixelbytes); |
|
| - | 239 | } |
|
| - | 240 | } |
|
| - | 241 | } |
|
| 222 | 242 | ||
| 223 | /** Redraw viewport |
243 | /** Redraw viewport. |
| 224 | * |
244 | * |
| 225 | * @param vport Viewport to redraw |
245 | * @param vport Viewport to redraw |
| 226 | * |
246 | * |
| 227 | */ |
247 | */ |
| 228 | static void vport_redraw(viewport_t *vport) |
248 | static void vport_redraw(viewport_t *vport) |
| 229 | { |
249 | { |
| 230 | unsigned int row; |
250 | unsigned int row, col; |
| 231 | 251 | ||
| 232 | for (row = 0; row < vport->rows; row++) { |
252 | for (row = 0; row < vport->rows; row++) { |
| 233 | unsigned int y = vport->y + ROW2Y(row); |
- | |
| 234 | unsigned int yd; |
- | |
| 235 | - | ||
| 236 | for (yd = 0; yd < FONT_SCANLINES; yd++) { |
253 | for (col = 0; col < vport->cols; col++) { |
| 237 | unsigned int x; |
- | |
| 238 | unsigned int col; |
- | |
| 239 | - | ||
| 240 | for (col = 0, x = vport->x; col < vport->cols; col++, x += FONT_WIDTH) |
- | |
| 241 | memcpy(&screen.fb_addr[FB_POS(x, y + yd)], |
- | |
| 242 | &vport->glyphs[GLYPH_POS(vport->backbuf[BB_POS(vport, col, row)], yd, false)], |
- | |
| 243 | screen.glyphscanline); |
254 | draw_glyph(vport, false, col, row); |
| 244 | } |
255 | } |
| 245 | } |
256 | } |
| 246 | 257 | ||
| 247 | if (COL2X(vport->cols) < vport->width) { |
258 | if (COL2X(vport->cols) < vport->width) { |
| 248 | unsigned int y; |
259 | draw_filled_rect( |
| 249 | - | ||
| 250 | for (y = 0; y < vport->height; y++) { |
260 | vport->x + COL2X(vport->cols), vport->y, |
| 251 | unsigned int x; |
- | |
| 252 | - | ||
| 253 | for (x = COL2X(vport->cols); x < vport->width; x++) |
261 | vport->x + vport->width, vport->y + vport->height, |
| 254 | memcpy(&screen.fb_addr[FB_POS(x, y)], vport->bgpixel, screen.pixelbytes); |
262 | vport->style.bg_color); |
| 255 | } |
- | |
| 256 | } |
263 | } |
| 257 | 264 | ||
| 258 | if (ROW2Y(vport->rows) < vport->height) { |
265 | if (ROW2Y(vport->rows) < vport->height) { |
| 259 | unsigned int y; |
266 | draw_filled_rect( |
| 260 | - | ||
| 261 | for (y = ROW2Y(vport->rows); y < vport->height; y++) { |
267 | vport->x, vport->y + ROW2Y(vport->rows), |
| 262 | unsigned int x; |
- | |
| 263 | - | ||
| 264 | for (x = 0; x < vport->width; x++) |
268 | vport->x + vport->width, vport->y + vport->height, |
| 265 | memcpy(&screen.fb_addr[FB_POS(x, y)], vport->bgpixel, screen.pixelbytes); |
269 | vport->style.bg_color); |
| 266 | } |
- | |
| 267 | } |
270 | } |
| 268 | } |
271 | } |
| 269 | 272 | ||
| 270 | 273 | ||
| 271 | /** Clear viewport |
274 | /** Clear viewport |
| Line 277... | Line 280... | ||
| 277 | { |
280 | { |
| 278 | memset(vport->backbuf, 0, vport->bbsize); |
281 | memset(vport->backbuf, 0, vport->bbsize); |
| 279 | vport_redraw(vport); |
282 | vport_redraw(vport); |
| 280 | } |
283 | } |
| 281 | 284 | ||
| 282 | - | ||
| 283 | /** Scroll viewport by given number of lines |
285 | /** Scroll viewport by given number of lines |
| 284 | * |
286 | * |
| 285 | * @param vport Viewport to scroll |
287 | * @param vport Viewport to scroll |
| 286 | * @param lines Number of lines to scroll |
288 | * @param lines Number of lines to scroll |
| 287 | * |
289 | * |
| 288 | */ |
290 | */ |
| 289 | static void vport_scroll(viewport_t *vport, int lines) |
291 | static void vport_scroll(viewport_t *vport, int lines) |
| 290 | { |
292 | { |
| 291 | unsigned int row; |
293 | unsigned int row, col; |
| 292 | - | ||
| 293 | for (row = 0; row < vport->rows; row++) { |
- | |
| 294 | unsigned int y = vport->y + ROW2Y(row); |
- | |
| 295 | unsigned int yd; |
- | |
| 296 | - | ||
| 297 | for (yd = 0; yd < FONT_SCANLINES; yd++) { |
- | |
| 298 | unsigned int x; |
- | |
| 299 | unsigned int col; |
- | |
| 300 | - | ||
| 301 | for (col = 0, x = vport->x; col < vport->cols; col++, x += FONT_WIDTH) { |
- | |
| 302 | uint8_t glyph; |
- | |
| 303 | - | ||
| 304 | if ((row + lines >= 0) && (row + lines < vport->rows)) { |
- | |
| 305 | if (vport->backbuf[BB_POS(vport, col, row)] == vport->backbuf[BB_POS(vport, col, row + lines)]) |
- | |
| 306 | continue; |
- | |
| 307 | - | ||
| 308 | glyph = vport->backbuf[BB_POS(vport, col, row + lines)]; |
- | |
| 309 | } else |
- | |
| 310 | glyph = 0; |
- | |
| 311 | - | ||
| 312 | memcpy(&screen.fb_addr[FB_POS(x, y + yd)], |
- | |
| 313 | &vport->glyphs[GLYPH_POS(glyph, yd, false)], screen.glyphscanline); |
- | |
| 314 | } |
- | |
| 315 | } |
- | |
| 316 | } |
- | |
| 317 | 294 | ||
| 318 | if (lines > 0) { |
295 | if (lines > 0) { |
| 319 | memcpy(vport->backbuf, vport->backbuf + vport->cols * lines, vport->cols * (vport->rows - lines)); |
296 | memcpy(vport->backbuf, vport->backbuf + vport->cols * lines, |
| - | 297 | vport->cols * (vport->rows - lines)); |
|
| 320 | memset(&vport->backbuf[BB_POS(vport, 0, vport->rows - lines)], 0, vport->cols * lines); |
298 | memset(&vport->backbuf[BB_POS(vport, 0, vport->rows - lines)], |
| - | 299 | 0, vport->cols * lines); |
|
| 321 | } else { |
300 | } else { |
| 322 | memcpy(vport->backbuf - vport->cols * lines, vport->backbuf, vport->cols * (vport->rows + lines)); |
301 | memcpy(vport->backbuf - vport->cols * lines, vport->backbuf, |
| - | 302 | vport->cols * (vport->rows + lines)); |
|
| 323 | memset(vport->backbuf, 0, - vport->cols * lines); |
303 | memset(vport->backbuf, 0, - vport->cols * lines); |
| 324 | } |
304 | } |
| 325 | } |
- | |
| 326 | 305 | ||
| - | 306 | for (row = 0; row < vport->rows; row++) { |
|
| - | 307 | for (col = 0; col < vport->cols; col++) { |
|
| - | 308 | draw_glyph(vport, false, col, row); |
|
| - | 309 | } |
|
| - | 310 | } |
|
| - | 311 | } |
|
| 327 | 312 | ||
| 328 | /** Render glyphs |
313 | /** Render glyphs |
| 329 | * |
314 | * |
| 330 | * Convert glyphs from device independent font |
315 | * Convert glyphs from device independent font |
| 331 | * description to current visual representation. |
316 | * description to current visual representation. |
| Line 928... | Line 913... | ||
| 928 | int bytepos; |
913 | int bytepos; |
| 929 | 914 | ||
| 930 | if ((pointer_shown) || (!pointer_enabled)) |
915 | if ((pointer_shown) || (!pointer_enabled)) |
| 931 | return; |
916 | return; |
| 932 | 917 | ||
| 933 | /* Save image under the cursor */ |
918 | /* Save image under the pointer. */ |
| 934 | if (pointer_vport == -1) { |
919 | if (pointer_vport == -1) { |
| 935 | pointer_vport = vport_create(pointer_x, pointer_y, pointer_width, pointer_height); |
920 | pointer_vport = vport_create(pointer_x, pointer_y, pointer_width, pointer_height); |
| 936 | if (pointer_vport < 0) |
921 | if (pointer_vport < 0) |
| 937 | return; |
922 | return; |
| 938 | } else { |
923 | } else { |
| Line 943... | Line 928... | ||
| 943 | if (pointer_pixmap == -1) |
928 | if (pointer_pixmap == -1) |
| 944 | pointer_pixmap = save_vp_to_pixmap(&viewports[pointer_vport]); |
929 | pointer_pixmap = save_vp_to_pixmap(&viewports[pointer_vport]); |
| 945 | else |
930 | else |
| 946 | copy_vp_to_pixmap(&viewports[pointer_vport], &pixmaps[pointer_pixmap]); |
931 | copy_vp_to_pixmap(&viewports[pointer_vport], &pixmaps[pointer_pixmap]); |
| 947 | 932 | ||
| 948 | /* Draw cursor */ |
933 | /* Draw mouse pointer. */ |
| 949 | for (i = 0; i < pointer_height; i++) |
934 | for (i = 0; i < pointer_height; i++) |
| 950 | for (j = 0; j < pointer_width; j++) { |
935 | for (j = 0; j < pointer_width; j++) { |
| 951 | bytepos = i * ((pointer_width - 1) / 8 + 1) + j / 8; |
936 | bytepos = i * ((pointer_width - 1) / 8 + 1) + j / 8; |
| 952 | visibility = pointer_mask_bits[bytepos] & |
937 | visibility = pointer_mask_bits[bytepos] & |
| 953 | (1 << (j % 8)); |
938 | (1 << (j % 8)); |
| Line 964... | Line 949... | ||
| 964 | } |
949 | } |
| 965 | 950 | ||
| 966 | 951 | ||
| 967 | static void mouse_hide(void) |
952 | static void mouse_hide(void) |
| 968 | { |
953 | { |
| 969 | /* Restore image under the cursor */ |
954 | /* Restore image under the pointer. */ |
| 970 | if (pointer_shown) { |
955 | if (pointer_shown) { |
| 971 | draw_pixmap(pointer_vport, pointer_pixmap); |
956 | draw_pixmap(pointer_vport, pointer_pixmap); |
| 972 | pointer_shown = 0; |
957 | pointer_shown = 0; |
| 973 | } |
958 | } |
| 974 | } |
959 | } |