+ translate pixel colors on change GraphicMode
This commit is contained in:
parent
7fa0988413
commit
cc7e3e09ad
|
@ -2,9 +2,13 @@
|
|||
|
||||
namespace vkvm {
|
||||
|
||||
Color::Color() noexcept
|
||||
: red(0), green(0), blue(0) {}
|
||||
|
||||
Color::Color(unsigned char red, unsigned char green, unsigned char blue) noexcept
|
||||
: red(red), green(green), blue(blue) {
|
||||
}
|
||||
: red(red), green(green), blue(blue) {}
|
||||
|
||||
Color::Color(const Color &color) noexcept = default;
|
||||
|
||||
Color::Color(unsigned int hex) noexcept {
|
||||
red = (unsigned char) ((hex >> 16 & 0xFF));//NOLINT
|
||||
|
|
|
@ -16,8 +16,12 @@ namespace vkvm {
|
|||
unsigned char blue;
|
||||
|
||||
public:
|
||||
Color() noexcept;
|
||||
|
||||
Color(unsigned char red, unsigned char green, unsigned char blue) noexcept;
|
||||
|
||||
Color(const Color &color) noexcept;
|
||||
|
||||
explicit Color(unsigned int hex) noexcept;
|
||||
|
||||
auto getRed() -> unsigned char;
|
||||
|
|
|
@ -62,9 +62,14 @@ namespace vkvm {
|
|||
}
|
||||
|
||||
char *getLocalMemory(){
|
||||
static bool givenWarning {false};
|
||||
if(!givenWarning && impl.localMemoryWarn){
|
||||
givenWarning = true;
|
||||
log(LogLevel::WARNING, "no shared memory found, using local memory instead!");
|
||||
}
|
||||
if (localSharedMemory.empty()) {
|
||||
constexpr int kilo = 1024;
|
||||
localSharedMemory.resize(impl.sharedMemorySize);
|
||||
localSharedMemory.resize(impl.sharedMemorySize * kilo);
|
||||
}
|
||||
return &localSharedMemory[0];
|
||||
}
|
||||
|
|
|
@ -58,6 +58,7 @@ constexpr int keyboardBufferSize = 16;
|
|||
int interruptEntrysPerEventType = 8; //NOLINT
|
||||
int reservedSize = 1024; //NOLINT
|
||||
std::vector<std::function<void()>> eventTable;
|
||||
bool localMemoryWarn = true;
|
||||
};
|
||||
|
||||
extern Impl impl;
|
||||
|
|
31
src/vkvm.cpp
31
src/vkvm.cpp
|
@ -16,8 +16,10 @@ namespace vkvm {
|
|||
}
|
||||
|
||||
auto setDefaultValues() -> void {
|
||||
impl.localMemoryWarn = false;
|
||||
if(getSharedMemory() != nullptr) {
|
||||
//set default values
|
||||
setMode(GraphicMode::RGB);
|
||||
setCharactersPerRow(60);// NOLINT
|
||||
setCharactersPerColumn(20);// NOLINT
|
||||
setHeight(600);// NOLINT
|
||||
|
@ -25,10 +27,10 @@ namespace vkvm {
|
|||
setMousePosition(42, 42);// NOLINT
|
||||
setBackgroundColor(black);
|
||||
setForegroundColor(white);
|
||||
setMode(GraphicMode::RGB);
|
||||
setRedrawInterval(20);// NOLINT
|
||||
setTimerInterruptInterval(10);// NOLINT
|
||||
}
|
||||
impl.localMemoryWarn = true;
|
||||
}
|
||||
|
||||
auto registerEvent(EventType type, const std::function<void()> &handler) -> bool {
|
||||
|
@ -205,7 +207,32 @@ namespace vkvm {
|
|||
|
||||
auto setMode(GraphicMode newValue) -> void {
|
||||
lockSharedMemory();
|
||||
getRegisters()->graphicMode = newValue;
|
||||
auto reg = getRegisters();
|
||||
if(reg->graphicMode != newValue){
|
||||
|
||||
std::vector<Color> pixels;
|
||||
int height = reg->height_pixels;
|
||||
int width = reg->width_pixels;
|
||||
pixels.resize(height * width);
|
||||
|
||||
for(int y = 0; y < height;y++){
|
||||
for(int x = 0;x < width;x++){
|
||||
pixels[y * width + x] = getPixel(x,y);
|
||||
}
|
||||
}
|
||||
|
||||
getRegisters()->graphicMode = newValue;
|
||||
|
||||
unlockSharedMemory();
|
||||
for(int y = 0; y < height;y++){
|
||||
for(int x = 0;x < width;x++){
|
||||
setPixel(x,y, pixels[y * width + x]);
|
||||
}
|
||||
}
|
||||
lockSharedMemory();
|
||||
}else{
|
||||
reg->graphicMode = newValue;
|
||||
}
|
||||
unlockSharedMemory();
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue