Fix premultiplied alpha
This commit is contained in:
parent
8b42a55b19
commit
bdec75af4d
2 changed files with 31 additions and 29 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue