d08c2860da
ysyx_22040000 李心杨 Linux calcite 6.6.19 #1-NixOS SMP PREEMPT_DYNAMIC Fri Mar 1 12:35:11 UTC 2024 x86_64 GNU/Linux 16:26:21 up 4 days 3:32, 2 users, load average: 0.85, 0.91, 0.95
97 lines
2 KiB
C
97 lines
2 KiB
C
#ifndef __DRAW_H__
|
|
|
|
#define HAS_GUI
|
|
|
|
#include <stdio.h>
|
|
#include <am.h>
|
|
#include <amdev.h>
|
|
#include <klib-macros.h>
|
|
|
|
#define ANSI_COLOR_RED 31
|
|
#define ANSI_COLOR_GREEN 32
|
|
#define ANSI_COLOR_WHITE 37
|
|
#define ANSI_COLOR_RESET 0
|
|
|
|
#ifdef HAS_GUI
|
|
#define TILE_W 4
|
|
#define SCREEN_W 320
|
|
#define SCREEN_H 200
|
|
static inline void set_color(int c) {
|
|
}
|
|
|
|
static inline void print_char(char c, int y, int x) {
|
|
static char last_c = 0xff;
|
|
static uint32_t buf[TILE_W * TILE_W];
|
|
if (last_c != c) {
|
|
last_c = c;
|
|
uint32_t color = 0x0;
|
|
if (c != ' ') { // convert different character to different color
|
|
uint8_t r = c / 25;
|
|
c -= r * 25;
|
|
uint8_t g = c / 5;
|
|
c -= g * 5;
|
|
uint8_t b = c;
|
|
r = r * 0x100 / 5;
|
|
g = g * 0x100 / 5;
|
|
b = b * 0x100 / 5;
|
|
color = (r << 16) | (g << 8) | b;
|
|
}
|
|
int i;
|
|
for (i = 0; i < TILE_W * TILE_W; i ++) {
|
|
buf[i] = color;
|
|
}
|
|
}
|
|
io_write(AM_GPU_FBDRAW, x * TILE_W, y * TILE_W, buf, TILE_W, TILE_W, false);
|
|
}
|
|
|
|
static inline void screen_clear() {
|
|
static uint32_t buf[SCREEN_W];
|
|
int i;
|
|
for (i = 0; i < SCREEN_H; i ++) {
|
|
io_write(AM_GPU_FBDRAW, 0, i, buf, SCREEN_W, 1, false);
|
|
}
|
|
}
|
|
|
|
static inline void screen_refresh() {
|
|
io_write(AM_GPU_FBDRAW, 0, 0, NULL, 0, 0, true);
|
|
}
|
|
|
|
static inline int screen_tile_height() {
|
|
return io_read(AM_GPU_CONFIG).height / TILE_W;
|
|
}
|
|
|
|
static inline int screen_tile_width() {
|
|
return io_read(AM_GPU_CONFIG).width / TILE_W;
|
|
}
|
|
#else
|
|
static inline void set_color(int c) {
|
|
printf("\033[%dm", c);
|
|
}
|
|
|
|
static inline void print_char(char c, int y, int x) {
|
|
printf("\033[%d;%dH%c", y + 1, x + 1, c);
|
|
}
|
|
|
|
static inline void screen_clear() {
|
|
printf("\033[H\033[J");
|
|
}
|
|
|
|
static inline void screen_refresh() {
|
|
}
|
|
|
|
static inline int screen_tile_height() {
|
|
return 24;
|
|
}
|
|
|
|
static inline int screen_tile_width() {
|
|
return 80;
|
|
}
|
|
#endif
|
|
|
|
static inline void usleep(int us) {
|
|
uint64_t now = io_read(AM_TIMER_UPTIME).us;
|
|
uint64_t next = now + us;
|
|
while (io_read(AM_TIMER_UPTIME).us < next) ;
|
|
}
|
|
|
|
#endif
|