@@ -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
10291087static 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