diff --git a/build.zig b/build.zig index a08ee32..ee2a06d 100644 --- a/build.zig +++ b/build.zig @@ -16,6 +16,7 @@ fn addEngineSources(c: *std.Build.Step.Compile) void { // components "src/components/eeprom.c", "src/components/filesystem.c", + "src/components/screen.c", }, }); } diff --git a/src/components/screen.c b/src/components/screen.c index 635a60b..1b10258 100644 --- a/src/components/screen.c +++ b/src/components/screen.c @@ -1 +1,152 @@ #include "screen.h" + +nn_screen *nn_newScreen(int maxWidth, int maxHeight, int maxDepth, int editableColors, int paletteColors); + +void nn_retainScreen(nn_screen *screen) { + nn_incRef(&screen->refc); +} + +void nn_destroyScreen(nn_screen *screen) { + if(!nn_decRef(&screen->refc)) return; + nn_deleteGuard(screen->lock); + nn_free(screen->buffer); + nn_free(screen->palette); + nn_free(screen); +} + +void nn_lockScreen(nn_screen *screen) { + nn_lock(screen->lock); +} + +void nn_unlockScreen(nn_screen *screen) { + nn_unlock(screen->lock); +} + +void nn_getResolution(nn_screen *screen, int *width, int *height) { + *width = screen->width; + *height = screen->height; +} + +void nn_maxResolution(nn_screen *screen, int *width, int *height) { + *width = screen->maxWidth; + *height = screen->maxHeight; +} + +void nn_setResolution(nn_screen *screen, int width, int height) { + screen->width = width; + screen->height = height; +} + +void nn_getViewport(nn_screen *screen, int *width, int *height) { + *width = screen->viewportWidth; + *height = screen->viewportHeight; +} + +void nn_setViewport(nn_screen *screen, int width, int height) { + screen->viewportWidth = width; + screen->viewportHeight = height; +} + +void nn_getAspectRatio(nn_screen *screen, int *width, int *height) { + *width = screen->aspectRatioWidth; + *height = screen->aspectRatioHeight; +} + +void nn_setAspectRatio(nn_screen *screen, int width, int height) { + screen->aspectRatioWidth = width; + screen->aspectRatioHeight = height; +} + +void nn_addKeyboard(nn_screen *screen, nn_address address) { + if(screen->keyboardCount == NN_MAX_SCREEN_KEYBOARDS) return; + screen->keyboards[screen->keyboardCount++] = nn_strdup(address); +} + +void nn_removeKeyboard(nn_screen *screen, nn_address address); + +nn_address nn_getKeyboard(nn_screen *screen, size_t idx) { + if(idx >= screen->keyboardCount) return NULL; + return screen->keyboards[idx]; +} + +size_t nn_getKeyboardCount(nn_screen *screen) { + return screen->keyboardCount; +} + +void nn_setEditableColors(nn_screen *screen, int count) { + screen->editableColors = count; +} + +int nn_getEditableColors(nn_screen *screen) { + return screen->editableColors; +} + +void nn_setPaletteColor(nn_screen *screen, int idx, int color) { + if(idx >= screen->paletteColors) return; + screen->palette[idx] = color; +} + +int nn_getPaletteColor(nn_screen *screen, int idx) { + if(idx >= screen->paletteColors) return 0; + return screen->palette[idx]; +} + +int nn_getPaletteCount(nn_screen *screen) { + return screen->paletteColors; +} + +int nn_maxDepth(nn_screen *screen) { + return screen->maxDepth; +} + +int nn_getDepth(nn_screen *screen) { + return screen->depth; +} + +void nn_setDepth(nn_screen *screen, int depth) { + if(depth > screen->maxDepth) depth = screen->maxDepth; + screen->depth = depth; +} + +void nn_setPixel(nn_screen *screen, int x, int y, nn_screenChar pixel) { + screen->buffer[x + y * screen->maxWidth] = pixel; +} + +nn_screenChar nn_getPixel(nn_screen *screen, int x, int y) { + return screen->buffer[x + y * screen->maxWidth]; +} + +bool nn_isDirty(nn_screen *screen) { + return screen->isDirty; +} + +void nn_setDirty(nn_screen *screen, bool dirty) { + screen->isDirty = dirty; +} + +bool nn_isPrecise(nn_screen *screen) { + return screen->isPrecise; +} + +void nn_setPrecise(nn_screen *screen, bool precise) { + screen->isPrecise = precise; +} + +bool nn_isTouchModeInverted(nn_screen *screen) { + return screen->isTouchModeInverted; +} + +void nn_setTouchModeInverted(nn_screen *screen, bool touchModeInverted) { + screen->isTouchModeInverted = touchModeInverted; +} + +bool nn_isOn(nn_screen *buffer) { + return buffer->isOn; +} + +void nn_setOn(nn_screen *buffer, bool on) { + buffer->isOn = on; +} + +void nn_loadScreenTable(nn_universe *universe); +nn_component *nn_addScreen(nn_computer *computer, nn_address address, int slot, nn_screen *screen); diff --git a/src/components/screen.h b/src/components/screen.h index 9d826e5..86e3c81 100644 --- a/src/components/screen.h +++ b/src/components/screen.h @@ -14,10 +14,16 @@ typedef struct nn_screen { int maxWidth; int maxHeight; int maxDepth; + int depth; int editableColors; int paletteColors; int *palette; + int aspectRatioWidth; + int aspectRatioHeight; bool isOn; + bool isTouchModeInverted; + bool isPrecise; + bool isDirty; nn_address keyboards[NN_MAX_SCREEN_KEYBOARDS]; size_t keyboardCount; } nn_screen; diff --git a/src/neonucleus.h b/src/neonucleus.h index 7a6a967..c6c870e 100644 --- a/src/neonucleus.h +++ b/src/neonucleus.h @@ -550,10 +550,10 @@ void nn_unlockScreen(nn_screen *screen); void nn_getResolution(nn_screen *screen, int *width, int *height); void nn_maxResolution(nn_screen *screen, int *width, int *height); -bool nn_setResolution(nn_screen *screen, int width, int height); +void nn_setResolution(nn_screen *screen, int width, int height); void nn_getViewport(nn_screen *screen, int *width, int *height); -bool nn_setViewport(nn_screen *screen, int width, int height); +void nn_setViewport(nn_screen *screen, int width, int height); void nn_getAspectRatio(nn_screen *screen, int *width, int *height); void nn_setAspectRatio(nn_screen *screen, int width, int height); @@ -591,6 +591,8 @@ typedef struct nn_gpuControl { int maxWidth; int maxHeight; int maxDepth; + + // other stuff } nn_gpuControl; // the control is COPIED.