Rev 4201 | Rev 4678 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4201 | Rev 4296 | ||
|---|---|---|---|
| Line 45... | Line 45... | ||
| 45 | #include <panic.h> |
45 | #include <panic.h> |
| 46 | #include <memstr.h> |
46 | #include <memstr.h> |
| 47 | #include <config.h> |
47 | #include <config.h> |
| 48 | #include <bitops.h> |
48 | #include <bitops.h> |
| 49 | #include <print.h> |
49 | #include <print.h> |
| - | 50 | #include <string.h> |
|
| 50 | #include <ddi/ddi.h> |
51 | #include <ddi/ddi.h> |
| 51 | #include <arch/types.h> |
52 | #include <arch/types.h> |
| 52 | 53 | ||
| 53 | SPINLOCK_INITIALIZE(fb_lock); |
54 | SPINLOCK_INITIALIZE(fb_lock); |
| 54 | 55 | ||
| Line 77... | Line 78... | ||
| 77 | 78 | ||
| 78 | #define BG_COLOR 0x000080 |
79 | #define BG_COLOR 0x000080 |
| 79 | #define FG_COLOR 0xffff00 |
80 | #define FG_COLOR 0xffff00 |
| 80 | #define INV_COLOR 0xaaaaaa |
81 | #define INV_COLOR 0xaaaaaa |
| 81 | 82 | ||
| 82 | #define CURSOR 0x2588 |
- | |
| 83 | - | ||
| 84 | #define RED(x, bits) ((x >> (8 + 8 + 8 - bits)) & ((1 << bits) - 1)) |
83 | #define RED(x, bits) ((x >> (8 + 8 + 8 - bits)) & ((1 << bits) - 1)) |
| 85 | #define GREEN(x, bits) ((x >> (8 + 8 - bits)) & ((1 << bits) - 1)) |
84 | #define GREEN(x, bits) ((x >> (8 + 8 - bits)) & ((1 << bits) - 1)) |
| 86 | #define BLUE(x, bits) ((x >> (8 - bits)) & ((1 << bits) - 1)) |
85 | #define BLUE(x, bits) ((x >> (8 - bits)) & ((1 << bits) - 1)) |
| 87 | 86 | ||
| 88 | #define COL2X(col) ((col) * FONT_WIDTH) |
87 | #define COL2X(col) ((col) * FONT_WIDTH) |
| Line 198... | Line 197... | ||
| 198 | 197 | ||
| 199 | 198 | ||
| 200 | /** Draw character at given position |
199 | /** Draw character at given position |
| 201 | * |
200 | * |
| 202 | */ |
201 | */ |
| 203 | static void glyph_draw(uint16_t glyph, unsigned int col, unsigned int row, bool silent) |
202 | static void glyph_draw(uint16_t glyph, unsigned int col, unsigned int row, bool silent, bool overlay) |
| 204 | { |
203 | { |
| 205 | unsigned int x = COL2X(col); |
204 | unsigned int x = COL2X(col); |
| 206 | unsigned int y = ROW2Y(row); |
205 | unsigned int y = ROW2Y(row); |
| 207 | unsigned int yd; |
206 | unsigned int yd; |
| 208 | 207 | ||
| 209 | if (y >= ytrim) |
208 | if (y >= ytrim) |
| 210 | logo_hide(silent); |
209 | logo_hide(silent); |
| 211 | 210 | ||
| - | 211 | if (!overlay) |
|
| 212 | backbuf[BB_POS(col, row)] = glyph; |
212 | backbuf[BB_POS(col, row)] = glyph; |
| 213 | 213 | ||
| 214 | if (!silent) { |
214 | if (!silent) { |
| 215 | for (yd = 0; yd < FONT_SCANLINES; yd++) |
215 | for (yd = 0; yd < FONT_SCANLINES; yd++) |
| 216 | memcpy(&fb_addr[FB_POS(x, y + yd + ylogo)], |
216 | memcpy(&fb_addr[FB_POS(x, y + yd + ylogo)], |
| 217 | &glyphs[GLYPH_POS(glyph, yd)], glyphscanline); |
217 | &glyphs[GLYPH_POS(glyph, yd)], glyphscanline); |
| Line 267... | Line 267... | ||
| 267 | } |
267 | } |
| 268 | 268 | ||
| 269 | 269 | ||
| 270 | static void cursor_put(bool silent) |
270 | static void cursor_put(bool silent) |
| 271 | { |
271 | { |
| - | 272 | unsigned int col = position % cols; |
|
| - | 273 | unsigned int row = position / cols; |
|
| - | 274 | ||
| 272 | glyph_draw(fb_font_glyph(CURSOR), position % cols, position / cols, silent); |
275 | glyph_draw(fb_font_glyph(U_CURSOR), col, row, silent, true); |
| 273 | } |
276 | } |
| 274 | 277 | ||
| 275 | 278 | ||
| 276 | static void cursor_remove(bool silent) |
279 | static void cursor_remove(bool silent) |
| 277 | { |
280 | { |
| - | 281 | unsigned int col = position % cols; |
|
| - | 282 | unsigned int row = position / cols; |
|
| - | 283 | ||
| 278 | glyph_draw(fb_font_glyph(0), position % cols, position / cols, silent); |
284 | glyph_draw(backbuf[BB_POS(col, row)], col, row, silent, true); |
| 279 | } |
285 | } |
| 280 | 286 | ||
| 281 | 287 | ||
| 282 | /** Print character to screen |
288 | /** Print character to screen |
| 283 | * |
289 | * |
| Line 305... | Line 311... | ||
| 305 | break; |
311 | break; |
| 306 | case '\t': |
312 | case '\t': |
| 307 | cursor_remove(silent); |
313 | cursor_remove(silent); |
| 308 | do { |
314 | do { |
| 309 | glyph_draw(fb_font_glyph(' '), position % cols, |
315 | glyph_draw(fb_font_glyph(' '), position % cols, |
| 310 | position / cols, silent); |
316 | position / cols, silent, false); |
| 311 | position++; |
317 | position++; |
| 312 | } while ((position % 8) && (position < cols * rows)); |
318 | } while ((position % 8) && (position < cols * rows)); |
| 313 | break; |
319 | break; |
| 314 | default: |
320 | default: |
| 315 | glyph_draw(fb_font_glyph(ch), position % cols, |
321 | glyph_draw(fb_font_glyph(ch), position % cols, |
| 316 | position / cols, silent); |
322 | position / cols, silent, false); |
| 317 | position++; |
323 | position++; |
| 318 | } |
324 | } |
| 319 | 325 | ||
| 320 | if (position >= cols * rows) { |
326 | if (position >= cols * rows) { |
| 321 | position -= cols; |
327 | position -= cols; |