mirror of
https://github.com/haraldk/TwelveMonkeys.git
synced 2026-05-28 00:00:03 -04:00
#577 Fix TGA subsampling + bonus metadata fix and palette conversion.
This commit is contained in:
+18
-4
@@ -200,12 +200,12 @@ final class TGAHeader {
|
||||
int components = colorMap.hasAlpha() ? 4 : 3;
|
||||
byte[] cmap = new byte[rgb.length * components];
|
||||
for (int i = 0; i < rgb.length; i++) {
|
||||
cmap[i * components ] = (byte) ((rgb[i] >> 16) & 0xff);
|
||||
cmap[i * components + 1] = (byte) ((rgb[i] >> 8) & 0xff);
|
||||
cmap[i * components + 2] = (byte) ((rgb[i] ) & 0xff);
|
||||
cmap[i * components ] = (byte) ((rgb[i] ) & 0xff); // B
|
||||
cmap[i * components + 1] = (byte) ((rgb[i] >> 8) & 0xff); // G
|
||||
cmap[i * components + 2] = (byte) ((rgb[i] >> 16) & 0xff); // R
|
||||
|
||||
if (components == 4) {
|
||||
cmap[i * components + 3] = (byte) ((rgb[i] >>> 24) & 0xff);
|
||||
cmap[i * components + 3] = (byte) ((rgb[i] >>> 24) & 0xff); // A
|
||||
}
|
||||
}
|
||||
|
||||
@@ -298,9 +298,23 @@ final class TGAHeader {
|
||||
hasAlpha = false;
|
||||
break;
|
||||
case 24:
|
||||
// BGR -> RGB
|
||||
for (int i = 0; i < cmap.length; i += 3) {
|
||||
byte b = cmap[i];
|
||||
cmap[i ] = cmap[i + 2];
|
||||
cmap[i + 2] = b;
|
||||
}
|
||||
|
||||
hasAlpha = false;
|
||||
break;
|
||||
case 32:
|
||||
// BGRA -> RGBA
|
||||
for (int i = 0; i < cmap.length; i += 4) {
|
||||
byte b = cmap[i];
|
||||
cmap[i ] = cmap[i + 2];
|
||||
cmap[i + 2] = b;
|
||||
}
|
||||
|
||||
hasAlpha = true;
|
||||
break;
|
||||
default:
|
||||
|
||||
+5
-3
@@ -224,7 +224,7 @@ final class TGAImageReader extends ImageReaderBase {
|
||||
byte[] rowDataByte, WritableRaster destChannel, Raster srcChannel, int y) throws IOException {
|
||||
// If subsampled or outside source region, skip entire row
|
||||
if (y % ySub != 0 || height - 1 - y < srcRegion.y || height - 1 - y >= srcRegion.y + srcRegion.height) {
|
||||
imageInput.skipBytes(rowDataByte.length);
|
||||
input.skipBytes(rowDataByte.length);
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -251,7 +251,8 @@ final class TGAImageReader extends ImageReaderBase {
|
||||
destChannel.setDataElements(0, dstY, srcChannel);
|
||||
break;
|
||||
case TGA.ORIGIN_UPPER_LEFT:
|
||||
destChannel.setDataElements(0, y, srcChannel);
|
||||
dstY = y / ySub;
|
||||
destChannel.setDataElements(0, dstY, srcChannel);
|
||||
break;
|
||||
default:
|
||||
throw new IIOException("Unsupported origin: " + origin);
|
||||
@@ -289,7 +290,8 @@ final class TGAImageReader extends ImageReaderBase {
|
||||
destChannel.setDataElements(0, dstY, srcChannel);
|
||||
break;
|
||||
case TGA.ORIGIN_UPPER_LEFT:
|
||||
destChannel.setDataElements(0, y, srcChannel);
|
||||
dstY = y / ySub;
|
||||
destChannel.setDataElements(0, dstY, srcChannel);
|
||||
break;
|
||||
default:
|
||||
throw new IIOException("Unsupported origin: " + origin);
|
||||
|
||||
+1
@@ -189,6 +189,7 @@ final class TGAMetadata extends AbstractMetadata {
|
||||
switch (header.getPixelDepth()) {
|
||||
case 8:
|
||||
bitsPerSample.setAttribute("value", createListValue(1, Integer.toString(header.getPixelDepth())));
|
||||
break;
|
||||
case 16:
|
||||
if (header.getAttributeBits() > 0 && extensions != null && extensions.hasAlpha()) {
|
||||
bitsPerSample.setAttribute("value", "5, 5, 5, 1");
|
||||
|
||||
Reference in New Issue
Block a user