|
@@ -303,6 +303,75 @@ namespace bimg
|
|
|
bx::memCopy( (uint8_t*)output->m_data + ii*4, state.info_raw.palette + data[ii]*4, 4);
|
|
bx::memCopy( (uint8_t*)output->m_data + ii*4, state.info_raw.palette + data[ii]*4, 4);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ switch (state.info_raw.colortype) //Check for alpha values
|
|
|
|
|
+ {
|
|
|
|
|
+ case LCT_GREY:
|
|
|
|
|
+ case LCT_RGB:
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ case LCT_GREY_ALPHA:
|
|
|
|
|
+ if (8 == state.info_raw.bitdepth)
|
|
|
|
|
+ {
|
|
|
|
|
+ for (uint32_t ii = 0, num = width * height; ii < num; ++ii)
|
|
|
|
|
+ {
|
|
|
|
|
+ const uint8_t* rgba = (uint8_t*)data + ii * 2;
|
|
|
|
|
+ bool has_alpha = rgba[1] < UINT8_MAX;
|
|
|
|
|
+ if (has_alpha)
|
|
|
|
|
+ {
|
|
|
|
|
+ output->m_hasAlpha = has_alpha;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(16 == state.info_raw.bitdepth)
|
|
|
|
|
+ {
|
|
|
|
|
+ for (uint32_t ii = 0, num = width * height; ii < num; ++ii)
|
|
|
|
|
+ {
|
|
|
|
|
+ const uint16_t* rgba = (uint16_t*)data + ii * 2;
|
|
|
|
|
+ bool has_alpha = rgba[1] < UINT16_MAX;
|
|
|
|
|
+ if (has_alpha)
|
|
|
|
|
+ {
|
|
|
|
|
+ output->m_hasAlpha = has_alpha;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ case LCT_RGBA:
|
|
|
|
|
+ if (8 == state.info_raw.bitdepth)
|
|
|
|
|
+ {
|
|
|
|
|
+ for (uint32_t ii = 0, num = width * height; ii < num; ++ii)
|
|
|
|
|
+ {
|
|
|
|
|
+ const uint8_t* dst = (uint8_t*)output->m_data + ii * 4;
|
|
|
|
|
+ bool has_alpha = dst[3] < UINT8_MAX;
|
|
|
|
|
+ if (has_alpha)
|
|
|
|
|
+ {
|
|
|
|
|
+ output->m_hasAlpha = has_alpha;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (16 == state.info_raw.bitdepth)
|
|
|
|
|
+ {
|
|
|
|
|
+ for (uint32_t ii = 0, num = width * height; ii < num; ++ii)
|
|
|
|
|
+ {
|
|
|
|
|
+ const uint16_t* dst = (uint16_t*)output->m_data + ii * 4;
|
|
|
|
|
+ bool has_alpha = dst[3] < UINT16_MAX;
|
|
|
|
|
+ if (has_alpha)
|
|
|
|
|
+ {
|
|
|
|
|
+ output->m_hasAlpha = has_alpha;
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ break;
|
|
|
|
|
+
|
|
|
|
|
+ case LCT_PALETTE:
|
|
|
|
|
+ output->m_hasAlpha = lodepng_has_palette_alpha(&state.info_raw);
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
else
|
|
else
|
|
|
{
|
|
{
|
|
@@ -331,6 +400,8 @@ namespace bimg
|
|
|
uint32_t width = 0;
|
|
uint32_t width = 0;
|
|
|
uint32_t height = 0;
|
|
uint32_t height = 0;
|
|
|
|
|
|
|
|
|
|
+ bool hasAlpha = false;
|
|
|
|
|
+
|
|
|
uint8_t* data = NULL;
|
|
uint8_t* data = NULL;
|
|
|
const char* err = NULL;
|
|
const char* err = NULL;
|
|
|
EXRHeader exrHeader;
|
|
EXRHeader exrHeader;
|
|
@@ -431,6 +502,8 @@ namespace bimg
|
|
|
};
|
|
};
|
|
|
bx::memCopy(&data[ii * bytesPerPixel], rgba, bytesPerPixel);
|
|
bx::memCopy(&data[ii * bytesPerPixel], rgba, bytesPerPixel);
|
|
|
|
|
|
|
|
|
|
+ hasAlpha |= (hasAlpha || rgba[3] < 1.0f);
|
|
|
|
|
+
|
|
|
srcR += stepR;
|
|
srcR += stepR;
|
|
|
srcG += stepG;
|
|
srcG += stepG;
|
|
|
srcB += stepB;
|
|
srcB += stepB;
|
|
@@ -457,6 +530,8 @@ namespace bimg
|
|
|
};
|
|
};
|
|
|
bx::memCopy(&data[ii * bytesPerPixel], rgba, bytesPerPixel);
|
|
bx::memCopy(&data[ii * bytesPerPixel], rgba, bytesPerPixel);
|
|
|
|
|
|
|
|
|
|
+ hasAlpha |= (hasAlpha || rgba[3] < UINT16_MAX);
|
|
|
|
|
+
|
|
|
srcR += stepR;
|
|
srcR += stepR;
|
|
|
srcG += stepG;
|
|
srcG += stepG;
|
|
|
srcB += stepB;
|
|
srcB += stepB;
|
|
@@ -512,8 +587,10 @@ namespace bimg
|
|
|
, data
|
|
, data
|
|
|
);
|
|
);
|
|
|
BX_FREE(_allocator, data);
|
|
BX_FREE(_allocator, data);
|
|
|
|
|
+ output->m_hasAlpha = hasAlpha;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
return output;
|
|
return output;
|
|
|
}
|
|
}
|
|
|
|
|
|