diff --git a/src/main.c b/src/main.c index 089ddb0..022eb82 100644 --- a/src/main.c +++ b/src/main.c @@ -654,12 +654,16 @@ int main(int argc, char **argv) { double wattage = 0; nn_Component *screen = ncl_createScreen(u, NULL, &nn_defaultScreens[3]); - nn_Component *gpuCard = ncl_createGPU(u, NULL, &nn_defaultGPUs[3]); + nn_GPU gpuConf = nn_defaultGPUs[3]; + gpuConf.maxWidth = 1920; + gpuConf.maxHeight = 1080; + nn_Component *gpuCard = ncl_createGPU(u, NULL, &gpuConf); nn_Component *keyboard = nn_createComponent( u, "mainKB", "keyboard"); ncl_ScreenState *scrstate = nn_getComponentState(screen); ncl_mountKeyboard(scrstate, "mainKB"); + ncl_setScreenMaxResolution(scrstate, 320, 90); // we assume server basically nn_Computer *c = nn_createComputer(u, NULL, NULL, ramTotal, nn_defaultComponentLimits[3] * 4, 256); diff --git a/src/ncomplib.c b/src/ncomplib.c index 67e2720..404d2cb 100644 --- a/src/ncomplib.c +++ b/src/ncomplib.c @@ -3297,6 +3297,43 @@ void ncl_setScreenResolution(ncl_ScreenState *state, size_t width, size_t height state->viewportHeight = height; } +void ncl_getScreenMaxResolution(const ncl_ScreenState *state, size_t *width, size_t *height) { + *width = state->conf.maxWidth; + *height = state->conf.maxHeight; +} + +nn_Exit ncl_setScreenMaxResolution(ncl_ScreenState *state, size_t width, size_t height) { + ncl_ScreenPixel *pixels = nn_alloc(state->ctx, sizeof(ncl_ScreenPixel) * width * height); + if(pixels == NULL) return NN_ENOMEM; + + for(size_t i = 0; i < width*height; i++) { + pixels[i].codepoint = ' '; + pixels[i].realFg = 0xFFFFFF; + pixels[i].realBg = 0xFFFFFF; + pixels[i].storedFg = 0xFFFFFF; + pixels[i].storedBg = 0x000000; + } + + if(state->width > width) state->width = width; + if(state->height > height) state->height = height; + if(state->viewportWidth > width) state->viewportWidth = width; + if(state->viewportHeight > height) state->viewportHeight = height; + + for(size_t y = 0; y < state->height; y++) { + for(size_t x = 0; x < state->width; x++) { + ncl_ScreenPixel p = ncl_getRealScreenPixel(state, x, y); + pixels[y * width + x] = p; + } + } + + nn_free(state->ctx, state->pixels, sizeof(ncl_ScreenPixel) * state->conf.maxWidth * state->conf.maxHeight); + state->conf.maxWidth = width; + state->conf.maxHeight = height; + state->pixels = pixels; + ncl_recomputeScreen(state); + return NN_OK; +} + void ncl_getScreenViewport(const ncl_ScreenState *state, size_t *width, size_t *height) { *width = state->viewportWidth; *height = state->viewportHeight; diff --git a/src/ncomplib.h b/src/ncomplib.h index b71fe06..2ebc2aa 100644 --- a/src/ncomplib.h +++ b/src/ncomplib.h @@ -333,6 +333,8 @@ void ncl_unlockScreen(ncl_ScreenState *state); void ncl_resetScreen(ncl_ScreenState *state); void ncl_getScreenResolution(const ncl_ScreenState *state, size_t *width, size_t *height); void ncl_setScreenResolution(ncl_ScreenState *state, size_t width, size_t height); +void ncl_getScreenMaxResolution(const ncl_ScreenState *state, size_t *width, size_t *height); +nn_Exit ncl_setScreenMaxResolution(ncl_ScreenState *state, size_t width, size_t height); void ncl_getScreenViewport(const ncl_ScreenState *state, size_t *width, size_t *height); void ncl_setScreenViewport(ncl_ScreenState *state, size_t width, size_t height); ncl_Pixel ncl_getScreenPixel(const ncl_ScreenState *state, int x, int y);