FUCKKKK
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
/* deshab/cursor.h - 鼠标光标管理
|
||||
*
|
||||
* 整合 desktop_app.h 的 da_cursor 结构与 save/restore/draw 操作,统一前缀为 dsb_。
|
||||
* 采用 save/restore 模式实现光标移动:绘制前保存背景,移动后恢复。
|
||||
*/
|
||||
#ifndef DESHAB_CURSOR_H
|
||||
#define DESHAB_CURSOR_H
|
||||
|
||||
#include "types.h"
|
||||
#include "app.h"
|
||||
#include "fb.h"
|
||||
|
||||
#define DSB_CURSOR_SIZE 24
|
||||
|
||||
static const u8 dsb_cursor_shape[24][24] = {
|
||||
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{1,1,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
|
||||
};
|
||||
|
||||
typedef struct dsb_cursor {
|
||||
u32 save[DSB_CURSOR_SIZE * DSB_CURSOR_SIZE];
|
||||
int saved;
|
||||
int old_x, old_y;
|
||||
int mx, my;
|
||||
int btn;
|
||||
} dsb_cursor;
|
||||
|
||||
static inline void dsb_cursor_init(dsb_cursor *c, i64 fb_w, i64 fb_h) {
|
||||
for (int i = 0; i < DSB_CURSOR_SIZE * DSB_CURSOR_SIZE; i++) c->save[i] = 0;
|
||||
c->saved = 0;
|
||||
c->old_x = -1;
|
||||
c->old_y = -1;
|
||||
c->mx = (int)(fb_w / 2);
|
||||
c->my = (int)(fb_h / 2);
|
||||
c->btn = 0;
|
||||
}
|
||||
|
||||
static inline void dsb_cursor_save(dsb_app_context *ac, dsb_cursor *c) {
|
||||
for (int r = 0; r < DSB_CURSOR_SIZE; r++)
|
||||
for (int col = 0; col < DSB_CURSOR_SIZE; col++) {
|
||||
int x = c->mx + col, y = c->my + r;
|
||||
c->save[r * DSB_CURSOR_SIZE + col] = dsb_pixel_read(ac, x, y);
|
||||
}
|
||||
c->saved = 1;
|
||||
c->old_x = c->mx;
|
||||
c->old_y = c->my;
|
||||
}
|
||||
|
||||
static inline void dsb_cursor_restore(dsb_app_context *ac, dsb_cursor *c) {
|
||||
if (!c->saved) return;
|
||||
for (int r = 0; r < DSB_CURSOR_SIZE; r++)
|
||||
for (int col = 0; col < DSB_CURSOR_SIZE; col++) {
|
||||
int x = c->old_x + col, y = c->old_y + r;
|
||||
dsb_pixel(ac, x, y, c->save[r * DSB_CURSOR_SIZE + col]);
|
||||
}
|
||||
c->saved = 0;
|
||||
}
|
||||
|
||||
static inline void dsb_cursor_draw(dsb_app_context *ac, dsb_cursor *c, u32 color) {
|
||||
for (int r = 0; r < DSB_CURSOR_SIZE; r++)
|
||||
for (int col = 0; col < DSB_CURSOR_SIZE; col++)
|
||||
if (dsb_cursor_shape[r][col])
|
||||
dsb_pixel(ac, c->mx + col, c->my + r, color);
|
||||
}
|
||||
|
||||
#endif /* DESHAB_CURSOR_H */
|
||||
Reference in New Issue
Block a user