From 7fa09884130095dfe7b0192f971413a4107616f0 Mon Sep 17 00:00:00 2001 From: Julian Hinxlage Date: Tue, 26 Nov 2019 12:33:34 +0100 Subject: [PATCH] + getPixel and setPixel with different GraphicsMode and memory usage per pixel --- src/SharedMemoryAccess.cpp | 1 + src/vkvm.cpp | 108 +++++++++++++++++++++++++++++-------- 2 files changed, 87 insertions(+), 22 deletions(-) diff --git a/src/SharedMemoryAccess.cpp b/src/SharedMemoryAccess.cpp index 9ea7ba2..6147181 100644 --- a/src/SharedMemoryAccess.cpp +++ b/src/SharedMemoryAccess.cpp @@ -11,6 +11,7 @@ #include "SharedMemoryAccess.hpp" /* header is important for the shmID. name could be different. maybe not needed cause: (shmget(memory_access_key, NULL, 0)) */ #include "internal.hpp" +#include "log.hpp" namespace vkvm { constexpr int PERM = 0666; /* access rights */ diff --git a/src/vkvm.cpp b/src/vkvm.cpp index fdbff7a..9f52356 100644 --- a/src/vkvm.cpp +++ b/src/vkvm.cpp @@ -61,29 +61,93 @@ namespace vkvm { } auto setPixel(int x, int y, Color color) -> bool { - char *ptr = getPixelArea() + (y * getWidth() + x) * 3; - ptr[0] = color.getRed(); - ptr[1] = color.getGreen(); - ptr[2] = color.getBlue(); + lockSharedMemory(); + auto reg = getRegisters(); + + switch(reg->graphicMode) { + case Text: { + int pixelIndex = (y * getWidth() + x); + unsigned char *ptr = reinterpret_cast(getPixelArea()) + (pixelIndex / 8); + if(color == reg->foreground_color){ + //set bit to 1 + ptr[0] |= (1 << (pixelIndex % 8)); + } + else{ + //set bit to 0 + ptr[0] &= ~(1 << (pixelIndex % 8)); + } + break; + } + case TwoColors: { + int pixelIndex = (y * getWidth() + x); + unsigned char *ptr = reinterpret_cast(getPixelArea()) + (pixelIndex / 8); + if(color == reg->foreground_color){ + //set bit to 1 + ptr[0] |= (1 << (pixelIndex % 8)); + } + else{ + //set bit to 0 + ptr[0] &= ~(1 << (pixelIndex % 8)); + } + break; + } + case Gray_256: { + unsigned char *ptr = reinterpret_cast(getPixelArea()) + (y * getWidth() + x) * 1; + int avg = color.getRed() + color.getGreen() + color.getBlue(); + avg /= 3; + ptr[0] = (unsigned char)avg; + break; + } + case RGB: { + unsigned char *ptr = reinterpret_cast(getPixelArea()) + (y * getWidth() + x) * 3; + ptr[0] = (unsigned char)color.getRed(); + ptr[1] = (unsigned char)color.getGreen(); + ptr[2] = (unsigned char)color.getBlue(); + break; + } + } + unlockSharedMemory(); return false; } auto getPixel(int x, int y) -> Color { - unsigned char *ptr = reinterpret_cast(getPixelArea()) + (y * getWidth() + x) * 3; + Color color = Color(0,0,0); + auto reg = getRegisters(); - Color color = {ptr[0], ptr[1], ptr[2]}; - - if(getMode() == GraphicMode::TwoColors || getMode() == GraphicMode::Text) { - if(color != getForegroundColor()) { - color = getBackgroundColor(); + switch(reg->graphicMode) { + case Text: { + int pixelIndex = (y * getWidth() + x); + unsigned char *ptr = reinterpret_cast(getPixelArea()) + pixelIndex / 8; + bool bit = (bool)(ptr[0] & (1 << (pixelIndex % 8))); + if(bit){ + color = reg->foreground_color; + }else{ + color =reg->background_color; + } + break; + } + case TwoColors: { + int pixelIndex = (y * getWidth() + x); + unsigned char *ptr = reinterpret_cast(getPixelArea()) + (pixelIndex / 8); + bool bit = (bool)(ptr[0] & (1 << (pixelIndex % 8))); + if(bit){ + color = reg->foreground_color; + }else{ + color =reg->background_color; + } + break; + } + case Gray_256: { + unsigned char *ptr = reinterpret_cast(getPixelArea()) + (y * getWidth() + x) * 1; + color = {ptr[0], ptr[0], ptr[0]}; + break; + } + case RGB: { + unsigned char *ptr = reinterpret_cast(getPixelArea()) + (y * getWidth() + x) * 3; + color = {ptr[0], ptr[1], ptr[2]}; + break; } } - - else if(getMode() == GraphicMode::Gray_256) { - unsigned char average = (color.getBlue() + color.getGreen() + color.getRed()) / 3; - color = {average, average, average}; - } - return color; } @@ -211,13 +275,13 @@ namespace vkvm { auto getLastPressedKey() -> KeyCode { lockSharedMemory(); + KeyCode keyCode = KeyCode(0); auto reg = getRegisters(); - if(reg->keyboardBuffer_index_read == reg->keyboardBuffer_index_write){ - return KeyCode(0); - } - KeyCode keyCode = (KeyCode)reg->keyboardBuffer[reg->keyboardBuffer_index_read++]; - if(reg->keyboardBuffer_index_read >= sizeof(reg->keyboardBuffer)){ - reg->keyboardBuffer_index_read = 0; + if(reg->keyboardBuffer_index_read != reg->keyboardBuffer_index_write) { + keyCode = (KeyCode) reg->keyboardBuffer[reg->keyboardBuffer_index_read++]; + if (reg->keyboardBuffer_index_read >= sizeof(reg->keyboardBuffer)) { + reg->keyboardBuffer_index_read = 0; + } } unlockSharedMemory(); return keyCode;