Rev 4153 | Rev 4327 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4153 | Rev 4263 | ||
---|---|---|---|
Line 66... | Line 66... | ||
66 | #include "pointer_mask.xbm" |
66 | #include "pointer_mask.xbm" |
67 | 67 | ||
68 | #define DEFAULT_BGCOLOR 0xf0f0f0 |
68 | #define DEFAULT_BGCOLOR 0xf0f0f0 |
69 | #define DEFAULT_FGCOLOR 0x000000 |
69 | #define DEFAULT_FGCOLOR 0x000000 |
70 | 70 | ||
- | 71 | #define GLYPH_UNAVAIL '?' |
|
- | 72 | ||
71 | #define MAX_ANIM_LEN 8 |
73 | #define MAX_ANIM_LEN 8 |
72 | #define MAX_ANIMATIONS 4 |
74 | #define MAX_ANIMATIONS 4 |
73 | #define MAX_PIXMAPS 256 /**< Maximum number of saved pixmaps */ |
75 | #define MAX_PIXMAPS 256 /**< Maximum number of saved pixmaps */ |
74 | #define MAX_VIEWPORTS 128 /**< Viewport is a rectangular area on the screen */ |
76 | #define MAX_VIEWPORTS 128 /**< Viewport is a rectangular area on the screen */ |
75 | 77 | ||
76 | /** Function to render a pixel from a RGB value. */ |
78 | /** Function to render a pixel from a RGB value. */ |
77 | typedef void (*rgb_conv_t)(void *, uint32_t); |
79 | typedef void (*rgb_conv_t)(void *, uint32_t); |
78 | 80 | ||
79 | /** Function to draw a glyph. */ |
81 | /** Function to draw a glyph. */ |
80 | typedef void (*dg_t)(unsigned int x, unsigned int y, bool cursor, |
82 | typedef void (*dg_t)(unsigned int x, unsigned int y, bool cursor, |
81 | uint8_t *glyphs, uint8_t glyph, uint32_t fg_color, uint32_t bg_color); |
83 | uint8_t *glyphs, uint32_t glyph, uint32_t fg_color, uint32_t bg_color); |
82 | 84 | ||
83 | struct { |
85 | struct { |
84 | uint8_t *fb_addr; |
86 | uint8_t *fb_addr; |
85 | 87 | ||
86 | unsigned int xres; |
88 | unsigned int xres; |
Line 89... | Line 91... | ||
89 | unsigned int scanline; |
91 | unsigned int scanline; |
90 | unsigned int glyphscanline; |
92 | unsigned int glyphscanline; |
91 | 93 | ||
92 | unsigned int pixelbytes; |
94 | unsigned int pixelbytes; |
93 | unsigned int glyphbytes; |
95 | unsigned int glyphbytes; |
- | 96 | ||
- | 97 | /** Pre-rendered mask for rendering glyphs. Specific for the visual. */ |
|
- | 98 | uint8_t *glyphs; |
|
94 | 99 | ||
95 | rgb_conv_t rgb_conv; |
100 | rgb_conv_t rgb_conv; |
96 | } screen; |
101 | } screen; |
97 | 102 | ||
98 | /** Backbuffer character cell. */ |
103 | /** Backbuffer character cell. */ |
99 | typedef struct { |
104 | typedef struct { |
100 | uint8_t glyph; |
105 | uint32_t glyph; |
101 | uint32_t fg_color; |
106 | uint32_t fg_color; |
102 | uint32_t bg_color; |
107 | uint32_t bg_color; |
103 | } bb_cell_t; |
108 | } bb_cell_t; |
104 | 109 | ||
105 | typedef struct { |
110 | typedef struct { |
Line 118... | Line 123... | ||
118 | */ |
123 | */ |
119 | 124 | ||
120 | /** Current attributes. */ |
125 | /** Current attributes. */ |
121 | attr_rgb_t attr; |
126 | attr_rgb_t attr; |
122 | 127 | ||
123 | /** Pre-rendered mask for rendering glyphs. Different viewports |
- | |
124 | * might use different drawing functions depending on whether their |
- | |
125 | * scanlines are aligned on a word boundary.*/ |
- | |
126 | uint8_t *glyphs; |
- | |
127 | - | ||
128 | uint8_t *bgpixel; |
128 | uint8_t *bgpixel; |
129 | 129 | ||
- | 130 | /** |
|
130 | /** Glyph drawing function for this viewport. */ |
131 | * Glyph drawing function for this viewport. Different viewports |
- | 132 | * might use different drawing functions depending on whether their |
|
- | 133 | * scanlines are aligned on a word boundary. |
|
- | 134 | */ |
|
131 | dg_t dglyph; |
135 | dg_t dglyph; |
132 | 136 | ||
133 | /* Auto-cursor position */ |
137 | /* Auto-cursor position */ |
134 | bool cursor_active; |
138 | bool cursor_active; |
135 | unsigned int cur_col; |
139 | unsigned int cur_col; |
Line 192... | Line 196... | ||
192 | 196 | ||
193 | static int fb_set_color(viewport_t *vport, ipcarg_t fg_color, |
197 | static int fb_set_color(viewport_t *vport, ipcarg_t fg_color, |
194 | ipcarg_t bg_color, ipcarg_t attr); |
198 | ipcarg_t bg_color, ipcarg_t attr); |
195 | 199 | ||
196 | static void draw_glyph_aligned(unsigned int x, unsigned int y, bool cursor, |
200 | static void draw_glyph_aligned(unsigned int x, unsigned int y, bool cursor, |
197 | uint8_t *glyphs, uint8_t glyph, uint32_t fg_color, uint32_t bg_color); |
201 | uint8_t *glyphs, uint32_t glyph, uint32_t fg_color, uint32_t bg_color); |
198 | static void draw_glyph_fallback(unsigned int x, unsigned int y, bool cursor, |
202 | static void draw_glyph_fallback(unsigned int x, unsigned int y, bool cursor, |
199 | uint8_t *glyphs, uint8_t glyph, uint32_t fg_color, uint32_t bg_color); |
203 | uint8_t *glyphs, uint32_t glyph, uint32_t fg_color, uint32_t bg_color); |
200 | 204 | ||
201 | static void draw_vp_glyph(viewport_t *vport, bool cursor, unsigned int col, |
205 | static void draw_vp_glyph(viewport_t *vport, bool cursor, unsigned int col, |
202 | unsigned int row); |
206 | unsigned int row); |
203 | 207 | ||
204 | 208 | ||
Line 384... | Line 388... | ||
384 | */ |
388 | */ |
385 | static void vport_scroll(viewport_t *vport, int lines) |
389 | static void vport_scroll(viewport_t *vport, int lines) |
386 | { |
390 | { |
387 | unsigned int row, col; |
391 | unsigned int row, col; |
388 | unsigned int x, y; |
392 | unsigned int x, y; |
389 | uint8_t glyph; |
393 | uint32_t glyph; |
390 | uint32_t fg_color; |
394 | uint32_t fg_color; |
391 | uint32_t bg_color; |
395 | uint32_t bg_color; |
392 | bb_cell_t *bbp, *xbp; |
396 | bb_cell_t *bbp, *xbp; |
393 | 397 | ||
394 | /* |
398 | /* |
Line 417... | Line 421... | ||
417 | glyph = 0; |
421 | glyph = 0; |
418 | fg_color = vport->attr.fg_color; |
422 | fg_color = vport->attr.fg_color; |
419 | bg_color = vport->attr.bg_color; |
423 | bg_color = vport->attr.bg_color; |
420 | } |
424 | } |
421 | 425 | ||
422 | (*vport->dglyph)(x, y, false, vport->glyphs, glyph, |
426 | (*vport->dglyph)(x, y, false, screen.glyphs, glyph, |
423 | fg_color, bg_color); |
427 | fg_color, bg_color); |
424 | x += FONT_WIDTH; |
428 | x += FONT_WIDTH; |
425 | } |
429 | } |
426 | y += FONT_SCANLINES; |
430 | y += FONT_SCANLINES; |
427 | } |
431 | } |
Line 445... | Line 449... | ||
445 | 449 | ||
446 | /** Render glyphs |
450 | /** Render glyphs |
447 | * |
451 | * |
448 | * Convert glyphs from device independent font |
452 | * Convert glyphs from device independent font |
449 | * description to current visual representation. |
453 | * description to current visual representation. |
450 | * |
- | |
451 | * @param vport Viewport |
- | |
452 | * |
- | |
453 | */ |
454 | */ |
454 | static void render_glyphs(viewport_t* vport) |
455 | static void render_glyphs(void) |
455 | { |
456 | { |
456 | unsigned int glyph; |
457 | unsigned int glyph; |
457 | 458 | ||
458 | for (glyph = 0; glyph < FONT_GLYPHS; glyph++) { |
459 | for (glyph = 0; glyph < FONT_GLYPHS; glyph++) { |
459 | unsigned int y; |
460 | unsigned int y; |
460 | 461 | ||
461 | for (y = 0; y < FONT_SCANLINES; y++) { |
462 | for (y = 0; y < FONT_SCANLINES; y++) { |
462 | unsigned int x; |
463 | unsigned int x; |
463 | 464 | ||
464 | for (x = 0; x < FONT_WIDTH; x++) { |
465 | for (x = 0; x < FONT_WIDTH; x++) { |
465 | screen.rgb_conv(&vport->glyphs[GLYPH_POS(glyph, y, false) + x * screen.pixelbytes], |
466 | screen.rgb_conv(&screen.glyphs[GLYPH_POS(glyph, y, false) + x * screen.pixelbytes], |
466 | (fb_font[glyph * FONT_SCANLINES + y] & (1 << (7 - x))) |
467 | (fb_font[glyph][y] & (1 << (7 - x))) |
467 | ? 0xffffff : 0x000000); |
468 | ? 0xffffff : 0x000000); |
468 | 469 | ||
469 | screen.rgb_conv(&vport->glyphs[GLYPH_POS(glyph, y, true) + x * screen.pixelbytes], |
470 | screen.rgb_conv(&screen.glyphs[GLYPH_POS(glyph, y, true) + x * screen.pixelbytes], |
470 | (fb_font[glyph * FONT_SCANLINES + y] & (1 << (7 - x))) |
471 | (fb_font[glyph][y] & (1 << (7 - x))) |
471 | ? 0x000000 : 0xffffff); |
472 | ? 0x000000 : 0xffffff); |
472 | } |
473 | } |
473 | } |
474 | } |
474 | } |
475 | } |
475 | - | ||
476 | screen.rgb_conv(vport->bgpixel, vport->attr.bg_color); |
- | |
477 | } |
476 | } |
478 | 477 | ||
479 | 478 | ||
480 | /** Create new viewport |
479 | /** Create new viewport |
481 | * |
480 | * |
Line 500... | Line 499... | ||
500 | return ELIMIT; |
499 | return ELIMIT; |
501 | 500 | ||
502 | unsigned int cols = width / FONT_WIDTH; |
501 | unsigned int cols = width / FONT_WIDTH; |
503 | unsigned int rows = height / FONT_SCANLINES; |
502 | unsigned int rows = height / FONT_SCANLINES; |
504 | unsigned int bbsize = cols * rows * sizeof(bb_cell_t); |
503 | unsigned int bbsize = cols * rows * sizeof(bb_cell_t); |
505 | unsigned int glyphsize = 2 * FONT_GLYPHS * screen.glyphbytes; |
- | |
506 | unsigned int word_size = sizeof(unsigned long); |
504 | unsigned int word_size = sizeof(unsigned long); |
507 | 505 | ||
508 | bb_cell_t *backbuf = (bb_cell_t *) malloc(bbsize); |
506 | bb_cell_t *backbuf = (bb_cell_t *) malloc(bbsize); |
509 | if (!backbuf) |
507 | if (!backbuf) |
510 | return ENOMEM; |
508 | return ENOMEM; |
511 | 509 | ||
512 | uint8_t *glyphs = (uint8_t *) malloc(glyphsize); |
- | |
513 | if (!glyphs) { |
- | |
514 | free(backbuf); |
- | |
515 | return ENOMEM; |
- | |
516 | } |
- | |
517 | - | ||
518 | uint8_t *bgpixel = (uint8_t *) malloc(screen.pixelbytes); |
510 | uint8_t *bgpixel = (uint8_t *) malloc(screen.pixelbytes); |
519 | if (!bgpixel) { |
511 | if (!bgpixel) { |
520 | free(glyphs); |
- | |
521 | free(backbuf); |
512 | free(backbuf); |
522 | return ENOMEM; |
513 | return ENOMEM; |
523 | } |
514 | } |
524 | 515 | ||
525 | backbuf_clear(backbuf, cols * rows, DEFAULT_FGCOLOR, DEFAULT_BGCOLOR); |
516 | backbuf_clear(backbuf, cols * rows, DEFAULT_FGCOLOR, DEFAULT_BGCOLOR); |
526 | memset(glyphs, 0, glyphsize); |
- | |
527 | memset(bgpixel, 0, screen.pixelbytes); |
517 | memset(bgpixel, 0, screen.pixelbytes); |
528 | 518 | ||
529 | viewports[i].x = x; |
519 | viewports[i].x = x; |
530 | viewports[i].y = y; |
520 | viewports[i].y = y; |
531 | viewports[i].width = width; |
521 | viewports[i].width = width; |
Line 535... | Line 525... | ||
535 | viewports[i].rows = rows; |
525 | viewports[i].rows = rows; |
536 | 526 | ||
537 | viewports[i].attr.bg_color = DEFAULT_BGCOLOR; |
527 | viewports[i].attr.bg_color = DEFAULT_BGCOLOR; |
538 | viewports[i].attr.fg_color = DEFAULT_FGCOLOR; |
528 | viewports[i].attr.fg_color = DEFAULT_FGCOLOR; |
539 | 529 | ||
540 | viewports[i].glyphs = glyphs; |
- | |
541 | viewports[i].bgpixel = bgpixel; |
530 | viewports[i].bgpixel = bgpixel; |
542 | 531 | ||
543 | /* |
532 | /* |
544 | * Conditions necessary to select aligned version: |
533 | * Conditions necessary to select aligned version: |
545 | * |
534 | * |
Line 565... | Line 554... | ||
565 | viewports[i].bbsize = bbsize; |
554 | viewports[i].bbsize = bbsize; |
566 | viewports[i].backbuf = backbuf; |
555 | viewports[i].backbuf = backbuf; |
567 | 556 | ||
568 | viewports[i].initialized = true; |
557 | viewports[i].initialized = true; |
569 | 558 | ||
570 | render_glyphs(&viewports[i]); |
559 | screen.rgb_conv(viewports[i].bgpixel, viewports[i].attr.bg_color); |
571 | 560 | ||
572 | return i; |
561 | return i; |
573 | } |
562 | } |
574 | 563 | ||
575 | 564 | ||
Line 583... | Line 572... | ||
583 | * |
572 | * |
584 | */ |
573 | */ |
585 | static bool screen_init(void *addr, unsigned int xres, unsigned int yres, |
574 | static bool screen_init(void *addr, unsigned int xres, unsigned int yres, |
586 | unsigned int scan, unsigned int visual) |
575 | unsigned int scan, unsigned int visual) |
587 | { |
576 | { |
- | 577 | unsigned int glyphsize; |
|
- | 578 | uint8_t *glyphs; |
|
588 | switch (visual) { |
579 | switch (visual) { |
589 | case VISUAL_INDIRECT_8: |
580 | case VISUAL_INDIRECT_8: |
590 | screen.rgb_conv = rgb_323; |
581 | screen.rgb_conv = rgb_323; |
591 | screen.pixelbytes = 1; |
582 | screen.pixelbytes = 1; |
592 | break; |
583 | break; |
Line 627... | Line 618... | ||
627 | screen.yres = yres; |
618 | screen.yres = yres; |
628 | screen.scanline = scan; |
619 | screen.scanline = scan; |
629 | 620 | ||
630 | screen.glyphscanline = FONT_WIDTH * screen.pixelbytes; |
621 | screen.glyphscanline = FONT_WIDTH * screen.pixelbytes; |
631 | screen.glyphbytes = screen.glyphscanline * FONT_SCANLINES; |
622 | screen.glyphbytes = screen.glyphscanline * FONT_SCANLINES; |
- | 623 | ||
- | 624 | glyphsize = 2 * FONT_GLYPHS * screen.glyphbytes; |
|
- | 625 | glyphs = (uint8_t *) malloc(glyphsize); |
|
- | 626 | if (!glyphs) |
|
- | 627 | return false; |
|
- | 628 | ||
- | 629 | memset(glyphs, 0, glyphsize); |
|
- | 630 | screen.glyphs = glyphs; |
|
- | 631 | ||
- | 632 | render_glyphs(); |
|
632 | 633 | ||
633 | /* Create first viewport */ |
634 | /* Create first viewport */ |
634 | vport_create(0, 0, xres, yres); |
635 | vport_create(0, 0, xres, yres); |
635 | 636 | ||
636 | return true; |
637 | return true; |
Line 657... | Line 658... | ||
657 | * @param glyph Code of the glyph to draw. |
658 | * @param glyph Code of the glyph to draw. |
658 | * @param fg_color Foreground color. |
659 | * @param fg_color Foreground color. |
659 | * @param bg_color Backgroudn color. |
660 | * @param bg_color Backgroudn color. |
660 | */ |
661 | */ |
661 | static void draw_glyph_aligned(unsigned int x, unsigned int y, bool cursor, |
662 | static void draw_glyph_aligned(unsigned int x, unsigned int y, bool cursor, |
662 | uint8_t *glyphs, uint8_t glyph, uint32_t fg_color, uint32_t bg_color) |
663 | uint8_t *glyphs, uint32_t glyph, uint32_t fg_color, uint32_t bg_color) |
663 | { |
664 | { |
664 | unsigned int i, yd; |
665 | unsigned int i, yd; |
665 | unsigned long fg_buf, bg_buf; |
666 | unsigned long fg_buf, bg_buf; |
666 | unsigned long *maskp, *dp; |
667 | unsigned long *maskp, *dp; |
667 | unsigned long mask; |
668 | unsigned long mask; |
Line 676... | Line 677... | ||
676 | fg_color); |
677 | fg_color); |
677 | screen.rgb_conv(&((uint8_t *)&bg_buf)[i * screen.pixelbytes], |
678 | screen.rgb_conv(&((uint8_t *)&bg_buf)[i * screen.pixelbytes], |
678 | bg_color); |
679 | bg_color); |
679 | } |
680 | } |
680 | 681 | ||
681 | - | ||
682 | /* Pointer to the current position in the mask. */ |
682 | /* Pointer to the current position in the mask. */ |
683 | maskp = (unsigned long *) &glyphs[GLYPH_POS(glyph, 0, cursor)]; |
683 | maskp = (unsigned long *) &glyphs[GLYPH_POS(glyph, 0, cursor)]; |
684 | 684 | ||
685 | /* Pointer to the current position on the screen. */ |
685 | /* Pointer to the current position on the screen. */ |
686 | dp = (unsigned long *) &screen.fb_addr[FB_POS(x, y)]; |
686 | dp = (unsigned long *) &screen.fb_addr[FB_POS(x, y)]; |
Line 718... | Line 718... | ||
718 | * @param glyph Code of the glyph to draw. |
718 | * @param glyph Code of the glyph to draw. |
719 | * @param fg_color Foreground color. |
719 | * @param fg_color Foreground color. |
720 | * @param bg_color Backgroudn color. |
720 | * @param bg_color Backgroudn color. |
721 | */ |
721 | */ |
722 | void draw_glyph_fallback(unsigned int x, unsigned int y, bool cursor, |
722 | void draw_glyph_fallback(unsigned int x, unsigned int y, bool cursor, |
723 | uint8_t *glyphs, uint8_t glyph, uint32_t fg_color, uint32_t bg_color) |
723 | uint8_t *glyphs, uint32_t glyph, uint32_t fg_color, uint32_t bg_color) |
724 | { |
724 | { |
725 | unsigned int i, j, yd; |
725 | unsigned int i, j, yd; |
726 | uint8_t fg_buf[4], bg_buf[4]; |
726 | uint8_t fg_buf[4], bg_buf[4]; |
727 | uint8_t *dp, *sp; |
727 | uint8_t *dp, *sp; |
728 | unsigned int d_add; |
728 | unsigned int d_add; |
Line 743... | Line 743... | ||
743 | /* Offset to add when moving to another screen scanline. */ |
743 | /* Offset to add when moving to another screen scanline. */ |
744 | d_add = screen.scanline - FONT_WIDTH * screen.pixelbytes; |
744 | d_add = screen.scanline - FONT_WIDTH * screen.pixelbytes; |
745 | 745 | ||
746 | for (yd = 0; yd < FONT_SCANLINES; yd++) { |
746 | for (yd = 0; yd < FONT_SCANLINES; yd++) { |
747 | /* Byte containing bits of the glyph scanline. */ |
747 | /* Byte containing bits of the glyph scanline. */ |
748 | b = fb_font[glyph * FONT_SCANLINES + yd]; |
748 | b = fb_font[glyph][yd]; |
749 | 749 | ||
750 | for (i = 0; i < FONT_WIDTH; i++) { |
750 | for (i = 0; i < FONT_WIDTH; i++) { |
751 | /* Choose color based on the current bit. */ |
751 | /* Choose color based on the current bit. */ |
752 | sp = (b & 0x80) ? fg_buf : bg_buf; |
752 | sp = (b & 0x80) ? fg_buf : bg_buf; |
753 | 753 | ||
Line 777... | Line 777... | ||
777 | unsigned int row) |
777 | unsigned int row) |
778 | { |
778 | { |
779 | unsigned int x = vport->x + COL2X(col); |
779 | unsigned int x = vport->x + COL2X(col); |
780 | unsigned int y = vport->y + ROW2Y(row); |
780 | unsigned int y = vport->y + ROW2Y(row); |
781 | 781 | ||
782 | uint8_t glyph; |
782 | uint32_t glyph; |
783 | uint32_t fg_color; |
783 | uint32_t fg_color; |
784 | uint32_t bg_color; |
784 | uint32_t bg_color; |
785 | 785 | ||
786 | glyph = vport->backbuf[BB_POS(vport, col, row)].glyph; |
786 | glyph = vport->backbuf[BB_POS(vport, col, row)].glyph; |
787 | fg_color = vport->backbuf[BB_POS(vport, col, row)].fg_color; |
787 | fg_color = vport->backbuf[BB_POS(vport, col, row)].fg_color; |
788 | bg_color = vport->backbuf[BB_POS(vport, col, row)].bg_color; |
788 | bg_color = vport->backbuf[BB_POS(vport, col, row)].bg_color; |
789 | 789 | ||
790 | (*vport->dglyph)(x, y, cursor, vport->glyphs, glyph, |
790 | (*vport->dglyph)(x, y, cursor, screen.glyphs, glyph, |
791 | fg_color, bg_color); |
791 | fg_color, bg_color); |
792 | } |
792 | } |
793 | 793 | ||
794 | /** Hide cursor if it is shown |
794 | /** Hide cursor if it is shown |
795 | * |
795 | * |
Line 834... | Line 834... | ||
834 | * @param c Character to draw |
834 | * @param c Character to draw |
835 | * @param col Screen position relative to viewport |
835 | * @param col Screen position relative to viewport |
836 | * @param row Screen position relative to viewport |
836 | * @param row Screen position relative to viewport |
837 | * |
837 | * |
838 | */ |
838 | */ |
839 | static void draw_char(viewport_t *vport, uint8_t c, unsigned int col, unsigned int row) |
839 | static void draw_char(viewport_t *vport, wchar_t c, unsigned int col, unsigned int row) |
840 | { |
840 | { |
841 | bb_cell_t *bbp; |
841 | bb_cell_t *bbp; |
842 | 842 | ||
843 | /* Do not hide cursor if we are going to overwrite it */ |
843 | /* Do not hide cursor if we are going to overwrite it */ |
844 | if ((vport->cursor_active) && (vport->cursor_shown) && |
844 | if ((vport->cursor_active) && (vport->cursor_shown) && |
845 | ((vport->cur_col != col) || (vport->cur_row != row))) |
845 | ((vport->cur_col != col) || (vport->cur_row != row))) |
846 | cursor_hide(vport); |
846 | cursor_hide(vport); |
847 | 847 | ||
848 | bbp = &vport->backbuf[BB_POS(vport, col, row)]; |
848 | bbp = &vport->backbuf[BB_POS(vport, col, row)]; |
849 | bbp->glyph = c; |
849 | bbp->glyph = fb_font_glyph(c); |
850 | bbp->fg_color = vport->attr.fg_color; |
850 | bbp->fg_color = vport->attr.fg_color; |
851 | bbp->bg_color = vport->attr.bg_color; |
851 | bbp->bg_color = vport->attr.bg_color; |
852 | 852 | ||
853 | draw_vp_glyph(vport, false, col, row); |
853 | draw_vp_glyph(vport, false, col, row); |
854 | 854 | ||
Line 864... | Line 864... | ||
864 | } |
864 | } |
865 | 865 | ||
866 | cursor_show(vport); |
866 | cursor_show(vport); |
867 | } |
867 | } |
868 | 868 | ||
869 | - | ||
870 | /** Draw text data to viewport |
869 | /** Draw text data to viewport. |
871 | * |
870 | * |
872 | * @param vport Viewport id |
871 | * @param vport Viewport id |
873 | * @param data Text data fitting exactly into viewport |
872 | * @param data Text data. |
- | 873 | * @param x Leftmost column of the area. |
|
- | 874 | * @param y Topmost row of the area. |
|
874 | * |
875 | * @param w Number of rows. |
- | 876 | * @param h Number of columns. |
|
875 | */ |
877 | */ |
876 | static void draw_text_data(viewport_t *vport, keyfield_t *data) |
878 | static void draw_text_data(viewport_t *vport, keyfield_t *data, unsigned int x, |
- | 879 | unsigned int y, unsigned int w, unsigned int h) |
|
877 | { |
880 | { |
878 | unsigned int i; |
881 | unsigned int i, j; |
879 | bb_cell_t *bbp; |
882 | bb_cell_t *bbp; |
880 | attrs_t *a; |
883 | attrs_t *a; |
881 | attr_rgb_t rgb; |
884 | attr_rgb_t rgb; |
882 | - | ||
883 | for (i = 0; i < vport->cols * vport->rows; i++) { |
- | |
884 | unsigned int col = i % vport->cols; |
- | |
885 | unsigned int row = i / vport->cols; |
- | |
886 | - | ||
887 | bbp = &vport->backbuf[BB_POS(vport, col, row)]; |
- | |
888 | uint8_t glyph = bbp->glyph; |
- | |
889 | - | ||
890 | a = &data[i].attrs; |
- | |
891 | rgb_from_attr(&rgb, a); |
- | |
892 | 885 | ||
- | 886 | for (j = 0; j < h; j++) { |
|
- | 887 | for (i = 0; i < w; i++) { |
|
- | 888 | unsigned int col = x + i; |
|
- | 889 | unsigned int row = y + j; |
|
- | 890 | ||
- | 891 | bbp = &vport->backbuf[BB_POS(vport, col, row)]; |
|
- | 892 | ||
- | 893 | a = &data[j * w + i].attrs; |
|
- | 894 | rgb_from_attr(&rgb, a); |
|
- | 895 | ||
893 | bbp->glyph = data[i].character; |
896 | bbp->glyph = fb_font_glyph(data[j * w + i].character); |
894 | bbp->fg_color = rgb.fg_color; |
897 | bbp->fg_color = rgb.fg_color; |
895 | bbp->bg_color = rgb.bg_color; |
898 | bbp->bg_color = rgb.bg_color; |
896 | 899 | ||
897 | draw_vp_glyph(vport, false, col, row); |
900 | draw_vp_glyph(vport, false, col, row); |
- | 901 | } |
|
898 | } |
902 | } |
899 | cursor_show(vport); |
903 | cursor_show(vport); |
900 | } |
904 | } |
901 | 905 | ||
902 | 906 | ||
Line 996... | Line 1000... | ||
996 | bool handled = true; |
1000 | bool handled = true; |
997 | int retval = EOK; |
1001 | int retval = EOK; |
998 | viewport_t *vport = &viewports[vp]; |
1002 | viewport_t *vport = &viewports[vp]; |
999 | unsigned int x; |
1003 | unsigned int x; |
1000 | unsigned int y; |
1004 | unsigned int y; |
- | 1005 | unsigned int w; |
|
- | 1006 | unsigned int h; |
|
1001 | 1007 | ||
1002 | switch (IPC_GET_METHOD(*call)) { |
1008 | switch (IPC_GET_METHOD(*call)) { |
1003 | case IPC_M_SHARE_OUT: |
1009 | case IPC_M_SHARE_OUT: |
1004 | /* We accept one area for data interchange */ |
1010 | /* We accept one area for data interchange */ |
1005 | if (IPC_GET_ARG1(*call) == shm_id) { |
1011 | if (IPC_GET_ARG1(*call) == shm_id) { |
Line 1056... | Line 1062... | ||
1056 | 1062 | ||
1057 | ppm_draw(shm, shm_size, IPC_GET_ARG1(*call), |
1063 | ppm_draw(shm, shm_size, IPC_GET_ARG1(*call), |
1058 | IPC_GET_ARG2(*call), vport->width - x, vport->height - y, putpixel, (void *) vport); |
1064 | IPC_GET_ARG2(*call), vport->width - x, vport->height - y, putpixel, (void *) vport); |
1059 | break; |
1065 | break; |
1060 | case FB_DRAW_TEXT_DATA: |
1066 | case FB_DRAW_TEXT_DATA: |
- | 1067 | x = IPC_GET_ARG1(*call); |
|
- | 1068 | y = IPC_GET_ARG2(*call); |
|
- | 1069 | w = IPC_GET_ARG3(*call); |
|
- | 1070 | h = IPC_GET_ARG4(*call); |
|
1061 | if (!interbuffer) { |
1071 | if (!interbuffer) { |
1062 | retval = EINVAL; |
1072 | retval = EINVAL; |
1063 | break; |
1073 | break; |
1064 | } |
1074 | } |
- | 1075 | if (x + w > vport->cols || y + h > vport->rows) { |
|
- | 1076 | retval = EINVAL; |
|
- | 1077 | break; |
|
- | 1078 | } |
|
1065 | if (intersize < vport->cols * vport->rows * sizeof(*interbuffer)) { |
1079 | if (intersize < w * h * sizeof(*interbuffer)) { |
1066 | retval = EINVAL; |
1080 | retval = EINVAL; |
1067 | break; |
1081 | break; |
1068 | } |
1082 | } |
1069 | draw_text_data(vport, interbuffer); |
1083 | draw_text_data(vport, interbuffer, x, y, w, h); |
1070 | break; |
1084 | break; |
1071 | default: |
1085 | default: |
1072 | handled = false; |
1086 | handled = false; |
1073 | } |
1087 | } |
1074 | 1088 | ||
Line 1493... | Line 1507... | ||
1493 | ipc_callid_t callid; |
1507 | ipc_callid_t callid; |
1494 | ipc_call_t call; |
1508 | ipc_call_t call; |
1495 | int retval; |
1509 | int retval; |
1496 | unsigned int i; |
1510 | unsigned int i; |
1497 | int scroll; |
1511 | int scroll; |
1498 | uint8_t glyph; |
1512 | wchar_t ch; |
1499 | unsigned int row, col; |
1513 | unsigned int row, col; |
1500 | 1514 | ||
1501 | if ((vport->cursor_active) || (anims_enabled)) |
1515 | if ((vport->cursor_active) || (anims_enabled)) |
1502 | callid = async_get_call_timeout(&call, 250000); |
1516 | callid = async_get_call_timeout(&call, 250000); |
1503 | else |
1517 | else |
Line 1530... | Line 1544... | ||
1530 | 1544 | ||
1531 | /* Exit thread */ |
1545 | /* Exit thread */ |
1532 | return; |
1546 | return; |
1533 | 1547 | ||
1534 | case FB_PUTCHAR: |
1548 | case FB_PUTCHAR: |
1535 | glyph = IPC_GET_ARG1(call); |
1549 | ch = IPC_GET_ARG1(call); |
1536 | row = IPC_GET_ARG2(call); |
1550 | row = IPC_GET_ARG2(call); |
1537 | col = IPC_GET_ARG3(call); |
1551 | col = IPC_GET_ARG3(call); |
1538 | 1552 | ||
1539 | if ((col >= vport->cols) || (row >= vport->rows)) { |
1553 | if ((col >= vport->cols) || (row >= vport->rows)) { |
1540 | retval = EINVAL; |
1554 | retval = EINVAL; |
1541 | break; |
1555 | break; |
1542 | } |
1556 | } |
1543 | ipc_answer_0(callid, EOK); |
1557 | ipc_answer_0(callid, EOK); |
1544 | 1558 | ||
1545 | draw_char(vport, glyph, col, row); |
1559 | draw_char(vport, ch, col, row); |
1546 | 1560 | ||
1547 | /* Message already answered */ |
1561 | /* Message already answered */ |
1548 | continue; |
1562 | continue; |
1549 | case FB_CLEAR: |
1563 | case FB_CLEAR: |
1550 | vport_clear(vport); |
1564 | vport_clear(vport); |
Line 1617... | Line 1631... | ||
1617 | if (!viewports[i].initialized) { |
1631 | if (!viewports[i].initialized) { |
1618 | retval = EADDRNOTAVAIL; |
1632 | retval = EADDRNOTAVAIL; |
1619 | break; |
1633 | break; |
1620 | } |
1634 | } |
1621 | viewports[i].initialized = false; |
1635 | viewports[i].initialized = false; |
1622 | if (viewports[i].glyphs) |
- | |
1623 | free(viewports[i].glyphs); |
- | |
1624 | if (viewports[i].bgpixel) |
1636 | if (viewports[i].bgpixel) |
1625 | free(viewports[i].bgpixel); |
1637 | free(viewports[i].bgpixel); |
1626 | if (viewports[i].backbuf) |
1638 | if (viewports[i].backbuf) |
1627 | free(viewports[i].backbuf); |
1639 | free(viewports[i].backbuf); |
1628 | retval = EOK; |
1640 | retval = EOK; |