Skip to content

Commit 612817f

Browse files
committed
bt81x: Add low level draw API
1 parent fabb861 commit 612817f

2 files changed

Lines changed: 75 additions & 2 deletions

File tree

include/mios/gfx.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ typedef struct {
2323
gfx_size_t siz;
2424
} gfx_rect_t;
2525

26+
typedef enum {
27+
GFX_PRIMITIVE_LINES,
28+
GFX_PRIMITIVE_RECTANGLES,
29+
GFX_PRIMITIVE_POINTS,
30+
} gfx_primitive_t;
2631

2732
#define GFX_DISPLAY_PALETTE_SIZE 16
2833
#define GFX_COLOR_PALETTE(x) (0x80000000 | (x))
@@ -70,6 +75,13 @@ typedef struct gfx_display_class {
7075

7176
gfx_size_t (*get_bitmap_size)(gfx_display_t *gd, int bitmap);
7277

78+
void (*begin)(gfx_display_t *gd, gfx_primitive_t primitive, float attribute);
79+
80+
void (*vertex)(gfx_display_t *gd, float x, float y);
81+
82+
void (*end)(gfx_display_t *gd);
83+
84+
7385
} gfx_display_class_t;
7486

7587

src/drivers/gpu/bt81x/bt81x.c

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -812,9 +812,14 @@ scissor(gfx_display_t *gd, const gfx_rect_t *r)
812812

813813
if(!ensure_display_list(b, 2))
814814
return;
815-
b->dl[b->dlptr++] = EVE_ENC_SCISSOR_XY(r->pos.x, r->pos.y);
816-
b->dl[b->dlptr++] = EVE_ENC_SCISSOR_SIZE(r->siz.width, r->siz.height);
817815

816+
int x = MAX(r->pos.x, 0);
817+
int y = MAX(r->pos.y, 0);
818+
b->dl[b->dlptr++] = EVE_ENC_SCISSOR_XY(x, y);
819+
820+
int w = MIN(r->siz.width, b->display_size.siz.width);
821+
int h = MIN(r->siz.height, b->display_size.siz.height);
822+
b->dl[b->dlptr++] = EVE_ENC_SCISSOR_SIZE(w, h);
818823
}
819824

820825

@@ -1025,6 +1030,59 @@ get_bitmap_size(gfx_display_t *gd, int bitmap)
10251030
return (gfx_size_t){bh->width, bh->height};
10261031
}
10271032

1033+
static void
1034+
draw_begin(gfx_display_t *gd, gfx_primitive_t type, float size)
1035+
{
1036+
bt81x_t *b = (bt81x_t *)gd;
1037+
1038+
if(!ensure_display_list(b, 2))
1039+
return;
1040+
1041+
if(size > 511)
1042+
size = 511;
1043+
int sizeq4 = (int)(size * 16.0f + 0.5f);
1044+
1045+
switch(type) {
1046+
case GFX_PRIMITIVE_LINES:
1047+
b->dl[b->dlptr++] = EVE_ENC_BEGIN(EVE_BEGIN_LINES);
1048+
b->dl[b->dlptr++] = EVE_ENC_LINE_WIDTH(sizeq4);
1049+
break;
1050+
case GFX_PRIMITIVE_RECTANGLES:
1051+
b->dl[b->dlptr++] = EVE_ENC_BEGIN(EVE_BEGIN_RECTS);
1052+
b->dl[b->dlptr++] = EVE_ENC_LINE_WIDTH(sizeq4);
1053+
break;
1054+
case GFX_PRIMITIVE_POINTS:
1055+
b->dl[b->dlptr++] = EVE_ENC_BEGIN(EVE_BEGIN_POINTS);
1056+
b->dl[b->dlptr++] = EVE_ENC_POINT_SIZE(sizeq4);
1057+
break;
1058+
}
1059+
}
1060+
1061+
static void
1062+
draw_vertex(gfx_display_t *gd, float x, float y)
1063+
{
1064+
bt81x_t *b = (bt81x_t *)gd;
1065+
1066+
if(!ensure_display_list(b, 1))
1067+
return;
1068+
1069+
int xi = x * 16.0f + 0.5f;
1070+
int yi = y * 16.0f + 0.5f;
1071+
1072+
b->dl[b->dlptr++] = EVE_ENC_VERTEX2F(xi, yi);
1073+
}
1074+
1075+
static void
1076+
draw_end(gfx_display_t *gd)
1077+
{
1078+
bt81x_t *b = (bt81x_t *)gd;
1079+
1080+
if(!ensure_display_list(b, 1))
1081+
return;
1082+
1083+
b->dl[b->dlptr++] = EVE_ENC_END();
1084+
}
1085+
10281086

10291087
static const gfx_display_class_t bt81x_ops = {
10301088
.push_state = push_state,
@@ -1040,6 +1098,9 @@ static const gfx_display_class_t bt81x_ops = {
10401098
.get_text_size = get_text_size,
10411099
.get_font_baseline = get_font_baseline,
10421100
.get_bitmap_size = get_bitmap_size,
1101+
.begin = draw_begin,
1102+
.vertex = draw_vertex,
1103+
.end = draw_end,
10431104
};
10441105

10451106
#if 1

0 commit comments

Comments
 (0)