From bdec75af4d6e16fdeb89a692c3db2f64184dd35c Mon Sep 17 00:00:00 2001 From: mkwong98 Date: Fri, 30 Aug 2019 23:38:14 +0800 Subject: [PATCH] Fix premultiplied alpha --- Core/HdNesPack.cpp | 56 ++++++++++++++++++++++--------------------- Core/HdPackLoader.cpp | 4 ++-- 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/Core/HdNesPack.cpp b/Core/HdNesPack.cpp index 07231bf5..000a4cf0 100644 --- a/Core/HdNesPack.cpp +++ b/Core/HdNesPack.cpp @@ -22,9 +22,9 @@ HdNesPack::~HdNesPack() void HdNesPack::BlendColors(uint8_t output[4], uint8_t input[4]) { uint8_t invertedAlpha = 256 - input[3]; - output[0] = (uint8_t)((input[0] + invertedAlpha * output[0]) >> 8); - output[1] = (uint8_t)((input[1] + invertedAlpha * output[1]) >> 8); - output[2] = (uint8_t)((input[2] + invertedAlpha * output[2]) >> 8); + output[0] = input[0] + (uint8_t)((invertedAlpha * output[0]) >> 8); + output[1] = input[1] + (uint8_t)((invertedAlpha * output[1]) >> 8); + output[2] = input[2] + (uint8_t)((invertedAlpha * output[2]) >> 8); output[3] = 0xFF; } @@ -55,30 +55,32 @@ void HdNesPack::DrawCustomBackground(uint32_t *outputBuffer, uint32_t x, uint32_ uint8_t brightness = _hdData->Backgrounds[_backgroundIndex].Brightness; uint32_t width = _hdData->Backgrounds[_backgroundIndex].Data->Width; uint32_t *pngData = _hdData->Backgrounds[_backgroundIndex].data() + (y * _hdData->Scale * width) + (x * _hdData->Scale); - - if(scale == 1) { - if(brightness == 255) { - *outputBuffer = *pngData; - } else { - *outputBuffer = AdjustBrightness((uint8_t*)pngData, brightness); - } - } else { - uint32_t *buffer = outputBuffer; - for(uint32_t i = 0; i < scale; i++) { - memcpy(outputBuffer, pngData, sizeof(uint32_t) * scale); - outputBuffer += screenWidth; - pngData += width; - } - - if(brightness < 255) { - for(uint32_t i = 0; i < scale; i++) { - for(uint32_t j = 0; j < scale; j++) { - *buffer = AdjustBrightness((uint8_t*)buffer, brightness); - buffer++; - } - buffer += screenWidth - scale; - } - } + + if (scale == 1) { + if (brightness == 255) { + *outputBuffer = *pngData; + } + else { + *outputBuffer = AdjustBrightness((uint8_t*)pngData, brightness); + } + } + else { + uint32_t* buffer = outputBuffer; + for (uint32_t i = 0; i < scale; i++) { + memcpy(outputBuffer, pngData, sizeof(uint32_t) * scale); + outputBuffer += screenWidth; + pngData += width; + } + + if (brightness < 255) { + for (uint32_t i = 0; i < scale; i++) { + for (uint32_t j = 0; j < scale; j++) { + *buffer = AdjustBrightness((uint8_t*)buffer, brightness); + buffer++; + } + buffer += screenWidth - scale; + } + } } } diff --git a/Core/HdPackLoader.cpp b/Core/HdPackLoader.cpp index 60ab2e3d..1c1aafd3 100644 --- a/Core/HdPackLoader.cpp +++ b/Core/HdPackLoader.cpp @@ -216,7 +216,7 @@ bool HdPackLoader::ProcessImgTag(string src) //premultiply alpha for (int i = 0; i < bitmapInfo.PixelData.size(); ++i) { if (bitmapInfo.PixelData[i] < 0xFF000000) { - uint8_t output[4] = (uint8_t*)&(bitmapInfo.PixelData[i]); + uint8_t* output = (uint8_t*)(bitmapInfo.PixelData.data() + i); uint8_t alpha = output[3] + 1; output[0] = (uint8_t)((alpha * output[0]) >> 8); output[1] = (uint8_t)((alpha * output[1]) >> 8); @@ -554,7 +554,7 @@ void HdPackLoader::ProcessBackgroundTag(vector &tokens, vectorPixelData.size(); ++i) { if (bgFileData->PixelData[i] < 0xFF000000) { - uint8_t output[4] = (uint8_t*)&(bgFileData->PixelData[i]); + uint8_t* output = (uint8_t*)(bgFileData->PixelData.data() + i); uint8_t alpha = output[3] + 1; output[0] = (uint8_t)((alpha * output[0]) >> 8); output[1] = (uint8_t)((alpha * output[1]) >> 8);