Fix premultiplied alpha

This commit is contained in:
mkwong98 2019-08-30 23:38:14 +08:00
parent 8b42a55b19
commit bdec75af4d
2 changed files with 31 additions and 29 deletions

View file

@ -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;
}
}
}
}

View file

@ -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<string> &tokens, vector<HdPackCon
//premultiply alpha
for (int i = 0; i < bgFileData->PixelData.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);