Finally implemented 1-bit subsampling.

This commit is contained in:
Harald Kuhr 2009-09-30 22:20:52 +02:00
parent ae0250d0b0
commit a8a48473ff

View File

@ -279,10 +279,8 @@ public class PSDImageReader extends ImageReaderBase {
switch (compression) { switch (compression) {
case PSD.COMPRESSION_NONE: case PSD.COMPRESSION_NONE:
System.err.println("NONE");
break; break;
case PSD.COMPRESSION_RLE: case PSD.COMPRESSION_RLE:
System.err.println("RLE");
// NOTE: Offsets will allow us to easily skip rows before AOI // NOTE: Offsets will allow us to easily skip rows before AOI
offsets = new int[mHeader.mChannels * mHeader.mHeight]; offsets = new int[mHeader.mChannels * mHeader.mHeight];
for (int i = 0; i < offsets.length; i++) { for (int i = 0; i < offsets.length; i++) {
@ -515,7 +513,7 @@ public class PSDImageReader extends ImageReaderBase {
final int destWidth = (pDest.width + 7) / 8; final int destWidth = (pDest.width + 7) / 8;
int x = 0, y = 0; int y = 0;
try { try {
for (y = 0; y < mHeader.mHeight; y++) { for (y = 0; y < mHeader.mHeight; y++) {
int length = pRLECompressed ? pRowOffsets[y] : mHeader.mWidth; int length = pRLECompressed ? pRowOffsets[y] : mHeader.mWidth;
@ -536,41 +534,40 @@ public class PSDImageReader extends ImageReaderBase {
mImageInput.readFully(row, 0, row.length); mImageInput.readFully(row, 0, row.length);
} }
// TODO: Destination offset...?? // TODO: Destination offset...??
int offset = (y - pSource.y) / pYSub * destWidth; int offset = (y - pSource.y) / pYSub * destWidth;
if (pXSub == 1) { if (pXSub == 1) {
// Fast normal case, no sub sampling // Fast normal case, no sub sampling
for (int i = 0; i < destWidth; i++) { for (int i = 0; i < destWidth; i++) {
byte value = row[pSource.x + i * pXSub]; byte value = row[pSource.x + i * pXSub];
data[offset + i] = (byte) (~value & 0xff); // Invert bits to match Java default monochrome // NOTE: Invert bits to match Java's default monochrome
data[offset + i] = (byte) (~value & 0xff);
} }
} }
else { else {
// Copy line sub sampled into real data // Copy line sub sampled into real data
int bitPos = pSource.x; int x = pSource.x;
for (int i = 0; i < destWidth; i++) { for (int i = 0; i < destWidth; i++) {
// TODO: FIXME! // TODO: FIXME!
byte result = 0; byte result = 0;
for (int j = 0; j < 8; j++) { for (int j = 0; j < 8; j++) {
int mask = 0x80 >> bitPos % 8; int pos = x / 8;
System.out.println("result: " + Integer.toBinaryString(result & 0xff)); if (pos >= row.length) {
System.out.println("mask: " + Integer.toBinaryString(mask)); break;
System.out.println("bitPos: " + bitPos);
int pos = pSource.x / 8 + i + bitPos / 8;
System.out.println("pos: " + pos);
result |= (row[pos] & mask) >> bitPos / 8;
bitPos += pXSub;
} }
System.out.println("--> result: " + Integer.toBinaryString(result & 0xff)); int sourceBitOff = x % 8;
System.out.println(); int mask = 0x80 >> sourceBitOff;
data[offset + i] = (byte) (~result & 0xff); // Invert bits to match Java default monochrome result |= (((row[pos] & mask) != 0) ? 1 : 0) << 7 - j;
}
x += pXSub;
} }
// NOTE: Invert bits to match Java's default monochrome
data[offset + i] = (byte) (~result & 0xff);
}
}
} }
else { else {
mImageInput.skipBytes(length); mImageInput.skipBytes(length);
@ -584,14 +581,12 @@ public class PSDImageReader extends ImageReaderBase {
} }
catch (IOException e) { catch (IOException e) {
System.err.println("y: " + y); System.err.println("y: " + y);
System.err.println("x: " + x);
throw e; throw e;
} }
catch (IndexOutOfBoundsException e) { catch (IndexOutOfBoundsException e) {
e.printStackTrace(); e.printStackTrace();
System.out.println("data.length: " + data.length); System.out.println("data.length: " + data.length);
System.err.println("y: " + y); System.err.println("y: " + y);
System.err.println("x: " + x);
throw e; throw e;
} }
} }