mirror of
https://github.com/pevans/erc-c.git
synced 2024-09-29 11:55:01 +00:00
Switch references from SDL_Rect to vm_area
We still use SDL_Rect internally, but we want to abstract the use of it in our API. The only thing the rest of the app should care about is the vm_area struct.
This commit is contained in:
parent
5407ce2d32
commit
c7b830bb4a
@ -15,7 +15,7 @@ typedef struct {
|
|||||||
char cmask;
|
char cmask;
|
||||||
} vm_bitfont;
|
} vm_bitfont;
|
||||||
|
|
||||||
extern int vm_bitfont_render(vm_bitfont *, vm_screen *, SDL_Rect *, char);
|
extern int vm_bitfont_render(vm_bitfont *, vm_screen *, vm_area *, char);
|
||||||
extern vm_bitfont *vm_bitfont_create(vm_screen *, const char *, int, int, char);
|
extern vm_bitfont *vm_bitfont_create(vm_screen *, const char *, int, int, char);
|
||||||
extern void vm_bitfont_free(vm_bitfont *);
|
extern void vm_bitfont_free(vm_bitfont *);
|
||||||
extern void vm_bitfont_offset(vm_bitfont *, char, int *, int *);
|
extern void vm_bitfont_offset(vm_bitfont *, char, int *, int *);
|
||||||
|
@ -15,15 +15,39 @@
|
|||||||
#define vm_screen_draw_pixel(screen, xpos, ypos) \
|
#define vm_screen_draw_pixel(screen, xpos, ypos) \
|
||||||
vm_screen_draw_rect(screen, xpos, ypos, 1, 1)
|
vm_screen_draw_rect(screen, xpos, ypos, 1, 1)
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int xoff;
|
||||||
|
int yoff;
|
||||||
|
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
} vm_area;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SDL_Window *window;
|
SDL_Window *window;
|
||||||
SDL_Renderer *render;
|
SDL_Renderer *render;
|
||||||
SDL_Rect rect;
|
vm_area area;
|
||||||
|
|
||||||
int xcoords;
|
int xcoords;
|
||||||
int ycoords;
|
int ycoords;
|
||||||
} vm_screen;
|
} vm_screen;
|
||||||
|
|
||||||
|
#define SET_SDL_RECT(name, a) \
|
||||||
|
(name).x = (a).xoff; \
|
||||||
|
(name).y = (a).yoff; \
|
||||||
|
(name).w = (a).width; \
|
||||||
|
(name).h = (a).height
|
||||||
|
|
||||||
|
#define MAKE_SDL_RECT(name, a) \
|
||||||
|
SDL_Rect name; \
|
||||||
|
SET_SDL_RECT(name, a)
|
||||||
|
|
||||||
|
#define vm_area_set(a, x, y, w, h) \
|
||||||
|
(a)->xoff = x; \
|
||||||
|
(a)->yoff = y; \
|
||||||
|
(a)->width = w; \
|
||||||
|
(a)->height = h
|
||||||
|
|
||||||
extern bool vm_screen_active(vm_screen *);
|
extern bool vm_screen_active(vm_screen *);
|
||||||
extern int vm_screen_add_window(vm_screen *, int, int);
|
extern int vm_screen_add_window(vm_screen *, int, int);
|
||||||
extern int vm_screen_init();
|
extern int vm_screen_init();
|
||||||
|
@ -72,7 +72,7 @@ apple2_draw_text(apple2 *mach, vm_16bit addr)
|
|||||||
{
|
{
|
||||||
vm_8bit lsb, msb;
|
vm_8bit lsb, msb;
|
||||||
vm_16bit page_base;
|
vm_16bit page_base;
|
||||||
SDL_Rect dest;
|
vm_area dest;
|
||||||
char ch;
|
char ch;
|
||||||
|
|
||||||
// The text display buffers are located at "Page 1" and "Page 2",
|
// The text display buffers are located at "Page 1" and "Page 2",
|
||||||
@ -120,18 +120,18 @@ apple2_draw_text(apple2 *mach, vm_16bit addr)
|
|||||||
|
|
||||||
// The absolute column position will be the font width times the
|
// The absolute column position will be the font width times the
|
||||||
// lsb.
|
// lsb.
|
||||||
dest.x = lsb * mach->sysfont->width;
|
dest.xoff = lsb * mach->sysfont->width;
|
||||||
|
|
||||||
// The absolute row position will be the font height times the msb
|
// The absolute row position will be the font height times the msb
|
||||||
// minus the page base (because the height is the same regardless of
|
// minus the page base (because the height is the same regardless of
|
||||||
// what page we're in). So if we're msb $0400, then we're starting
|
// what page we're in). So if we're msb $0400, then we're starting
|
||||||
// on pixel row 0; but if we're msb $0480, then we are starting on
|
// on pixel row 0; but if we're msb $0480, then we are starting on
|
||||||
// pixel row 8 (where the font height is 8); etc.
|
// pixel row 8 (where the font height is 8); etc.
|
||||||
dest.y = ((addr & 0xff80) - page_base) * mach->sysfont->height;
|
dest.yoff = ((addr & 0xff80) - page_base) * mach->sysfont->height;
|
||||||
|
|
||||||
// Our width and height must be that of the font.
|
// Our width and height must be that of the font.
|
||||||
dest.w = mach->sysfont->width;
|
dest.width = mach->sysfont->width;
|
||||||
dest.h = mach->sysfont->height;
|
dest.height = mach->sysfont->height;
|
||||||
|
|
||||||
// And...lastly...what's in the address?
|
// And...lastly...what's in the address?
|
||||||
ch = (char)vm_segment_get(mach->memory, addr);
|
ch = (char)vm_segment_get(mach->memory, addr);
|
||||||
|
@ -83,10 +83,11 @@ vm_bitfont_offset(vm_bitfont *font, char ch, int *xcoord, int *ycoord)
|
|||||||
int
|
int
|
||||||
vm_bitfont_render(vm_bitfont *font,
|
vm_bitfont_render(vm_bitfont *font,
|
||||||
vm_screen *screen,
|
vm_screen *screen,
|
||||||
SDL_Rect *dest,
|
vm_area *dest,
|
||||||
char ch)
|
char ch)
|
||||||
{
|
{
|
||||||
SDL_Rect src;
|
SDL_Rect src_rect;
|
||||||
|
SDL_Rect dest_rect;
|
||||||
|
|
||||||
// Our bitmap font may not be able to support all 256 possible
|
// Our bitmap font may not be able to support all 256 possible
|
||||||
// values that a character can hold; the cmask will limit us to
|
// values that a character can hold; the cmask will limit us to
|
||||||
@ -95,20 +96,19 @@ vm_bitfont_render(vm_bitfont *font,
|
|||||||
|
|
||||||
// The width and height of the glyph are as indicated by the font
|
// The width and height of the glyph are as indicated by the font
|
||||||
// struct
|
// struct
|
||||||
src.w = font->width;
|
src_rect.w = font->width;
|
||||||
src.h = font->height;
|
src_rect.h = font->height;
|
||||||
|
|
||||||
// The source and destination width/height must match. This might be
|
// Bring the destination attributes into the SDL_Rect we need to
|
||||||
// a faulty assumption down the road; for now, it holds.
|
// pass into SDL_RenderCopy().
|
||||||
dest->w = src.w;
|
SET_SDL_RECT(dest_rect, *dest);
|
||||||
dest->h = src.h;
|
|
||||||
|
|
||||||
// Get the spot in the bitmap where the glyph is found
|
// Get the spot in the bitmap where the glyph is found
|
||||||
vm_bitfont_offset(font, ch, &src.x, &src.y);
|
vm_bitfont_offset(font, ch, &src_rect.x, &src_rect.y);
|
||||||
|
|
||||||
log_critical("src.x = %d, src.y = %d", src.x, src.y);
|
log_critical("src.x = %d, src.y = %d", src_rect.x, src_rect.y);
|
||||||
|
|
||||||
if (SDL_RenderCopy(screen->render, font->texture, &src, dest) < 0) {
|
if (SDL_RenderCopy(screen->render, font->texture, &src_rect, &dest_rect) < 0) {
|
||||||
log_critical("Failed to render glyph: %s", SDL_GetError());
|
log_critical("Failed to render glyph: %s", SDL_GetError());
|
||||||
return ERR_GFXOP;
|
return ERR_GFXOP;
|
||||||
}
|
}
|
||||||
|
@ -61,10 +61,7 @@ vm_screen_create()
|
|||||||
|
|
||||||
screen->window = NULL;
|
screen->window = NULL;
|
||||||
screen->render = NULL;
|
screen->render = NULL;
|
||||||
screen->rect.x = 0;
|
vm_area_set(&screen->area, 0, 0, 0, 0);
|
||||||
screen->rect.y = 0;
|
|
||||||
screen->rect.w = 0;
|
|
||||||
screen->rect.h = 0;
|
|
||||||
|
|
||||||
return screen;
|
return screen;
|
||||||
}
|
}
|
||||||
@ -213,12 +210,14 @@ vm_screen_draw_rect(vm_screen *screen,
|
|||||||
int xsize,
|
int xsize,
|
||||||
int ysize)
|
int ysize)
|
||||||
{
|
{
|
||||||
|
SDL_Rect rect;
|
||||||
|
|
||||||
// The renderer will take care of translating the positions and
|
// The renderer will take care of translating the positions and
|
||||||
// sizes into whatever the window is really at.
|
// sizes into whatever the window is really at.
|
||||||
screen->rect.x = xpos;
|
rect.x = xpos;
|
||||||
screen->rect.y = ypos;
|
rect.y = ypos;
|
||||||
screen->rect.w = xsize;
|
rect.w = xsize;
|
||||||
screen->rect.h = ysize;
|
rect.h = ysize;
|
||||||
|
|
||||||
SDL_RenderFillRect(screen->render, &screen->rect);
|
SDL_RenderFillRect(screen->render, &rect);
|
||||||
}
|
}
|
||||||
|
@ -33,10 +33,10 @@ Test(vm_screen, create) {
|
|||||||
|
|
||||||
cr_assert_eq(screen->window, NULL);
|
cr_assert_eq(screen->window, NULL);
|
||||||
cr_assert_eq(screen->render, NULL);
|
cr_assert_eq(screen->render, NULL);
|
||||||
cr_assert_eq(screen->rect.x, 0);
|
cr_assert_eq(screen->area.xoff, 0);
|
||||||
cr_assert_eq(screen->rect.y, 0);
|
cr_assert_eq(screen->area.yoff, 0);
|
||||||
cr_assert_eq(screen->rect.w, 0);
|
cr_assert_eq(screen->area.width, 0);
|
||||||
cr_assert_eq(screen->rect.h, 0);
|
cr_assert_eq(screen->area.height, 0);
|
||||||
cr_assert_eq(screen->xcoords, 0);
|
cr_assert_eq(screen->xcoords, 0);
|
||||||
cr_assert_eq(screen->ycoords, 0);
|
cr_assert_eq(screen->ycoords, 0);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user