mirror of
https://github.com/pevans/erc-c.git
synced 2024-12-21 08:30:55 +00:00
First stab at adding graphics.
This involves using glfw. This first commit creates a window but doesn't do anything with it; it also just hangs until you can escape out somehow.
This commit is contained in:
parent
294fab76aa
commit
b646bfc511
@ -17,3 +17,6 @@ link_directories(/usr/local/lib)
|
|||||||
|
|
||||||
# our bullshit
|
# our bullshit
|
||||||
add_executable(erc ${sources} src/main.c)
|
add_executable(erc ${sources} src/main.c)
|
||||||
|
|
||||||
|
# Graphics
|
||||||
|
target_link_libraries(erc glfw)
|
||||||
|
@ -12,6 +12,7 @@ enum log_errcode {
|
|||||||
ERR_OOM, // out of memory
|
ERR_OOM, // out of memory
|
||||||
ERR_OOB, // out of bounds
|
ERR_OOB, // out of bounds
|
||||||
ERR_BADFILE,
|
ERR_BADFILE,
|
||||||
|
ERR_GFXINIT, // couldn't initialize graphics
|
||||||
};
|
};
|
||||||
|
|
||||||
extern void log_write(int, const char *, ...);
|
extern void log_write(int, const char *, ...);
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
#ifndef _VM_SCREEN_H_
|
#ifndef _VM_SCREEN_H_
|
||||||
#define _VM_SCREEN_H_
|
#define _VM_SCREEN_H_
|
||||||
|
|
||||||
|
#include <GLFW/glfw3.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If you just want to plot a single pixel, you can use this macro to
|
* If you just want to plot a single pixel, you can use this macro to
|
||||||
* abstract away the need to indicate the x/y dimensions (as those must
|
* abstract away the need to indicate the x/y dimensions (as those must
|
||||||
@ -10,6 +13,8 @@
|
|||||||
vm_screen_draw_rect(context, xpos, ypos, 1, 1)
|
vm_screen_draw_rect(context, xpos, ypos, 1, 1)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
GLFWwindow *window;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These form the components of an RGBA composite color.
|
* These form the components of an RGBA composite color.
|
||||||
*/
|
*/
|
||||||
@ -19,6 +24,9 @@ typedef struct {
|
|||||||
int color_alpha;
|
int color_alpha;
|
||||||
} vm_screen_context;
|
} vm_screen_context;
|
||||||
|
|
||||||
|
extern int vm_screen_add_window(vm_screen_context *);
|
||||||
|
extern int vm_screen_init();
|
||||||
|
extern void vm_screen_finish();
|
||||||
extern void vm_screen_draw_rect(vm_screen_context *, int, int, int, int);
|
extern void vm_screen_draw_rect(vm_screen_context *, int, int, int, int);
|
||||||
extern void vm_screen_free_context(vm_screen_context *);
|
extern void vm_screen_free_context(vm_screen_context *);
|
||||||
extern vm_screen_context *vm_screen_new_context();
|
extern vm_screen_context *vm_screen_new_context();
|
||||||
|
20
src/main.c
20
src/main.c
@ -14,6 +14,7 @@
|
|||||||
#include "apple2.h"
|
#include "apple2.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "option.h"
|
#include "option.h"
|
||||||
|
#include "vm_screen.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function will establish the base environment that we want to use
|
* This function will establish the base environment that we want to use
|
||||||
@ -43,6 +44,8 @@ init(int argc, char **argv)
|
|||||||
|
|
||||||
// We're literally using stdout in this heavy phase of development.
|
// We're literally using stdout in this heavy phase of development.
|
||||||
log_open(stdout);
|
log_open(stdout);
|
||||||
|
|
||||||
|
vm_screen_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -61,6 +64,8 @@ finish()
|
|||||||
}
|
}
|
||||||
|
|
||||||
log_close();
|
log_close();
|
||||||
|
|
||||||
|
vm_screen_finish();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -71,6 +76,7 @@ int
|
|||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
apple2 *mach;
|
apple2 *mach;
|
||||||
|
vm_screen_context *context;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
init(argc, argv);
|
init(argc, argv);
|
||||||
@ -88,6 +94,20 @@ main(int argc, char **argv)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
context = vm_screen_new_context();
|
||||||
|
if (context == NULL) {
|
||||||
|
fprintf(stderr, "Screen context failed!\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!vm_screen_add_window(context)) {
|
||||||
|
fprintf(stderr, "Window creation failed!\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
}
|
||||||
|
|
||||||
// ha ha ha ha #nervous #laughter
|
// ha ha ha ha #nervous #laughter
|
||||||
printf("Hello, world\n");
|
printf("Hello, world\n");
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,22 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "vm_screen.h"
|
#include "vm_screen.h"
|
||||||
|
|
||||||
|
int
|
||||||
|
vm_screen_init()
|
||||||
|
{
|
||||||
|
if (!glfwInit()) {
|
||||||
|
return ERR_GFXINIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
vm_screen_finish()
|
||||||
|
{
|
||||||
|
glfwTerminate();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return a new screen context. We also set the color to black.
|
* Return a new screen context. We also set the color to black.
|
||||||
*/
|
*/
|
||||||
@ -29,6 +45,20 @@ vm_screen_new_context()
|
|||||||
return context;
|
return context;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
vm_screen_add_window(vm_screen_context *context)
|
||||||
|
{
|
||||||
|
context->window = glfwCreateWindow(320, 240, "erc", NULL, NULL);
|
||||||
|
if (context->window == NULL) {
|
||||||
|
log_critical("Could not create a window");
|
||||||
|
return ERR_GFXINIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
glfwMakeContextCurrent(context->window);
|
||||||
|
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free the contents of a screen context.
|
* Free the contents of a screen context.
|
||||||
*/
|
*/
|
||||||
@ -38,6 +68,12 @@ vm_screen_free_context(vm_screen_context *context)
|
|||||||
free(context);
|
free(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
vm_screen_active(vm_screen_context *context)
|
||||||
|
{
|
||||||
|
return !glfwWindowShouldClose(context->window);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set the color of a screen context to a given RGBA value.
|
* Set the color of a screen context to a given RGBA value.
|
||||||
*/
|
*/
|
||||||
|
@ -23,3 +23,6 @@ add_executable(erc-test ${sources} ${test_sources})
|
|||||||
|
|
||||||
# Our unit-testing library
|
# Our unit-testing library
|
||||||
target_link_libraries(erc-test criterion)
|
target_link_libraries(erc-test criterion)
|
||||||
|
|
||||||
|
# Graphics
|
||||||
|
target_link_libraries(erc-test glfw)
|
||||||
|
Loading…
Reference in New Issue
Block a user