in src/main/java/org/apache/xmlgraphics/image/codec/png/PNGImageDecoder.java [1430:1683]
private void processPixels(int process,
Raster src, WritableRaster dst,
int xOffset, int step, int y, int width) {
int srcX;
int dstX;
// Create an array suitable for holding one pixel
int[] ps = src.getPixel(0, 0, (int[])null);
int[] pd = dst.getPixel(0, 0, (int[])null);
dstX = xOffset;
switch (process) {
case POST_NONE:
for (srcX = 0; srcX < width; srcX++) {
src.getPixel(srcX, 0, ps);
dst.setPixel(dstX, y, ps);
dstX += step;
}
break;
case POST_GAMMA:
for (srcX = 0; srcX < width; srcX++) {
src.getPixel(srcX, 0, ps);
for (int i = 0; i < inputBands; i++) {
int x = ps[i];
ps[i] = gammaLut[x];
}
dst.setPixel(dstX, y, ps);
dstX += step;
}
break;
case POST_GRAY_LUT:
for (srcX = 0; srcX < width; srcX++) {
src.getPixel(srcX, 0, ps);
pd[0] = grayLut[ps[0]];
dst.setPixel(dstX, y, pd);
dstX += step;
}
break;
case POST_GRAY_LUT_ADD_TRANS:
for (srcX = 0; srcX < width; srcX++) {
src.getPixel(srcX, 0, ps);
int val = ps[0];
pd[0] = grayLut[val];
if (val == grayTransparentAlpha) {
pd[1] = 0;
} else {
pd[1] = maxOpacity;
}
dst.setPixel(dstX, y, pd);
dstX += step;
}
break;
case POST_PALETTE_TO_RGB:
for (srcX = 0; srcX < width; srcX++) {
src.getPixel(srcX, 0, ps);
int val = ps[0];
pd[0] = redPalette[val];
pd[1] = greenPalette[val];
pd[2] = bluePalette[val];
dst.setPixel(dstX, y, pd);
dstX += step;
}
break;
case POST_PALETTE_TO_RGBA:
for (srcX = 0; srcX < width; srcX++) {
src.getPixel(srcX, 0, ps);
int val = ps[0];
pd[0] = redPalette[val];
pd[1] = greenPalette[val];
pd[2] = bluePalette[val];
pd[3] = alphaPalette[val];
dst.setPixel(dstX, y, pd);
dstX += step;
}
break;
case POST_ADD_GRAY_TRANS:
for (srcX = 0; srcX < width; srcX++) {
src.getPixel(srcX, 0, ps);
int val = ps[0];
if (performGammaCorrection) {
val = gammaLut[val];
}
pd[0] = val;
if (val == grayTransparentAlpha) {
pd[1] = 0;
} else {
pd[1] = maxOpacity;
}
dst.setPixel(dstX, y, pd);
dstX += step;
}
break;
case POST_ADD_RGB_TRANS:
for (srcX = 0; srcX < width; srcX++) {
src.getPixel(srcX, 0, ps);
int r = ps[0];
int g = ps[1];
int b = ps[2];
if (performGammaCorrection) {
pd[0] = gammaLut[r];
pd[1] = gammaLut[g];
pd[2] = gammaLut[b];
} else {
pd[0] = r;
pd[1] = g;
pd[2] = b;
}
if ((r == redTransparentAlpha)
&& (g == greenTransparentAlpha)
&& (b == blueTransparentAlpha)) {
pd[3] = 0;
} else {
pd[3] = maxOpacity;
}
dst.setPixel(dstX, y, pd);
dstX += step;
}
break;
case POST_REMOVE_GRAY_TRANS:
for (srcX = 0; srcX < width; srcX++) {
src.getPixel(srcX, 0, ps);
int g = ps[0];
if (performGammaCorrection) {
pd[0] = gammaLut[g];
} else {
pd[0] = g;
}
dst.setPixel(dstX, y, pd);
dstX += step;
}
break;
case POST_REMOVE_RGB_TRANS:
for (srcX = 0; srcX < width; srcX++) {
src.getPixel(srcX, 0, ps);
int r = ps[0];
int g = ps[1];
int b = ps[2];
if (performGammaCorrection) {
pd[0] = gammaLut[r];
pd[1] = gammaLut[g];
pd[2] = gammaLut[b];
} else {
pd[0] = r;
pd[1] = g;
pd[2] = b;
}
dst.setPixel(dstX, y, pd);
dstX += step;
}
break;
case POST_GAMMA_EXP:
for (srcX = 0; srcX < width; srcX++) {
src.getPixel(srcX, 0, ps);
int val = ps[0];
int alpha = ps[1];
int gamma = gammaLut[val];
pd[0] = gamma;
pd[1] = gamma;
pd[2] = gamma;
pd[3] = alpha;
dst.setPixel(dstX, y, pd);
dstX += step;
}
break;
case POST_GRAY_ALPHA_EXP:
for (srcX = 0; srcX < width; srcX++) {
src.getPixel(srcX, 0, ps);
int val = ps[0];
int alpha = ps[1];
pd[0] = val;
pd[1] = val;
pd[2] = val;
pd[3] = alpha;
dst.setPixel(dstX, y, pd);
dstX += step;
}
break;
case POST_ADD_GRAY_TRANS_EXP:
for (srcX = 0; srcX < width; srcX++) {
src.getPixel(srcX, 0, ps);
int val = ps[0];
if (performGammaCorrection) {
val = gammaLut[val];
}
pd[0] = val;
pd[1] = val;
pd[2] = val;
if (val == grayTransparentAlpha) {
pd[3] = 0;
} else {
pd[3] = maxOpacity;
}
dst.setPixel(dstX, y, pd);
dstX += step;
}
break;
case POST_GRAY_LUT_ADD_TRANS_EXP:
for (srcX = 0; srcX < width; srcX++) {
src.getPixel(srcX, 0, ps);
int val = ps[0];
int val2 = grayLut[val];
pd[0] = val2;
pd[1] = val2;
pd[2] = val2;
if (val == grayTransparentAlpha) {
pd[3] = 0;
} else {
pd[3] = maxOpacity;
}
dst.setPixel(dstX, y, pd);
dstX += step;
}
break;
}
}