blob: 9885facc884561662ef066fabc441713b37dfebf [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.xmlgraphics.image.codec.tiff;
import java.awt.color.ColorSpace;
import java.awt.image.ColorModel;
import java.awt.image.IndexColorModel;
import java.awt.image.RenderedImage;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import static org.apache.xmlgraphics.image.codec.tiff.ExtraSamplesType.UNSPECIFIED;
import static org.apache.xmlgraphics.image.codec.tiff.ImageType.BILEVEL_BLACK_IS_ZERO;
import static org.apache.xmlgraphics.image.codec.tiff.ImageType.BILEVEL_WHITE_IS_ZERO;
import static org.apache.xmlgraphics.image.codec.tiff.ImageType.CIELAB;
import static org.apache.xmlgraphics.image.codec.tiff.ImageType.CMYK;
import static org.apache.xmlgraphics.image.codec.tiff.ImageType.GENERIC;
import static org.apache.xmlgraphics.image.codec.tiff.ImageType.GRAY;
import static org.apache.xmlgraphics.image.codec.tiff.ImageType.RGB;
import static org.apache.xmlgraphics.image.codec.tiff.ImageType.YCBCR;
public class ImageInfoTestCase {
private ColorSpace colorSpace;
private ColorModel colorModel;
private RenderedImage image;
private TIFFEncodeParam params;
@Before
public void setUp() {
colorSpace = mock(ColorSpace.class);
colorModel = new TestColorModel(colorSpace, true);
image = mock(RenderedImage.class);
params = mock(TIFFEncodeParam.class);
}
@Test
public void testNullColorModel() {
testImageInfo(ImageInfo.newInstance(image, 1, 1, null, params),
BILEVEL_BLACK_IS_ZERO, 0, null, 0, UNSPECIFIED);
for (int i = 2; i < 10; i += 2) {
testImageInfo(ImageInfo.newInstance(image, 1, i, null, params),
GENERIC, i - 1, null, 0, UNSPECIFIED);
}
}
@Test
public void testNonIndexColorModel() {
testTheColorSpaceType(ColorSpace.TYPE_CMYK, false, CMYK);
testTheColorSpaceType(ColorSpace.TYPE_GRAY, false, GRAY);
testTheColorSpaceType(ColorSpace.TYPE_RGB, true, YCBCR);
testTheColorSpaceType(ColorSpace.TYPE_RGB, false, RGB);
}
private void testTheColorSpaceType(int colorSpaceType, boolean getJpegCompress, ImageType expectedType) {
when(colorSpace.getType()).thenReturn(colorSpaceType);
TIFFEncodeParam params = mock(TIFFEncodeParam.class);
when(params.getJPEGCompressRGBToYCbCr()).thenReturn(getJpegCompress);
testImageInfo(ImageInfo.newInstance(image, 1, 1, colorModel, params),
expectedType, 0, null, 0, UNSPECIFIED);
}
@Test
public void testNonIndexColorModelWithNumBandsGreaterThan1() {
testWithNumOfBandsGreaterThan1(ColorSpace.TYPE_GRAY, GRAY, 3, 1);
testWithNumOfBandsGreaterThan1(ColorSpace.TYPE_Lab, CIELAB, 6, 3);
testWithNumOfBandsGreaterThan1(ColorSpace.TYPE_CMYK, CMYK, 5, 2);
}
private void testWithNumOfBandsGreaterThan1(int colorSpaceType, ImageType type, int numBands,
int numComponents) {
when(colorSpace.getType()).thenReturn(colorSpaceType);
when(colorSpace.getNumComponents()).thenReturn(numComponents);
testImageInfo(ImageInfo.newInstance(image, 2, numBands, colorModel, params),
type, numBands - numComponents, null, 0, UNSPECIFIED);
}
private void testImageInfo(ImageInfo imageInfo, ImageType imageType, int numExtraSamples,
char[] colormap, int colormapSize, ExtraSamplesType extraSamplesType) {
assertEquals(imageType, imageInfo.getType());
assertEquals(numExtraSamples, imageInfo.getNumberOfExtraSamples());
assertArrayEquals(colormap, imageInfo.getColormap());
assertEquals(colormapSize, imageInfo.getColormapSize());
assertEquals(extraSamplesType, imageInfo.getExtraSamplesType());
}
@Test
public void testIndexColorModel() {
byte[] blackIsZero = new byte[] {0, (byte) 0xff};
IndexColorModel icm = new IndexColorModel(1, 2, blackIsZero, blackIsZero, blackIsZero);
testImageInfo(ImageInfo.newInstance(image, 1, 1, icm, params),
BILEVEL_BLACK_IS_ZERO, 0, null, 0, UNSPECIFIED);
byte[] whiteIsZero = new byte[] {(byte) 0xff, 0};
icm = new IndexColorModel(1, 2, whiteIsZero, whiteIsZero, whiteIsZero);
testImageInfo(ImageInfo.newInstance(image, 1, 1, icm, params),
BILEVEL_WHITE_IS_ZERO, 0, null, 0, UNSPECIFIED);
}
@Test
public void testTileWidthHeight() {
when(params.getWriteTiled()).thenReturn(true);
when(image.getWidth()).thenReturn(10);
when(image.getHeight()).thenReturn(10);
for (int i = 1; i < 10000; i += 200) {
when(params.getTileWidth()).thenReturn(i);
when(params.getTileHeight()).thenReturn(i);
int numTiles = ((10 + i - 1) / i) * ((10 + i - 1) / i);
long bytesPerRow = (long) Math.ceil((1 / 8.0) * i * 1);
long bytesPerTile = bytesPerRow * i;
testTileOnImageInfo(ImageInfo.newInstance(image, 1, 1, colorModel, params),
i, i, numTiles, bytesPerRow, bytesPerTile);
}
}
private void testTileOnImageInfo(ImageInfo imageInfo, int tileWidth, int tileHeight,
int numTiles, long bytesPerRow, long bytesPerTile) {
assertEquals(tileWidth, imageInfo.getTileWidth());
assertEquals(tileHeight, imageInfo.getTileHeight());
assertEquals(numTiles, imageInfo.getNumTiles());
assertEquals(bytesPerRow, imageInfo.getBytesPerRow());
assertEquals(bytesPerTile, imageInfo.getBytesPerTile());
}
@Test
public void testGetColormap() {
ImageInfo sut = ImageInfo.newInstance(image, 1, 1,
new IndexColorModel(1, 2, new byte[2], new byte[2], new byte[2], new byte[2]), params);
char[] colormap = sut.getColormap();
assertEquals(0, colormap[0]);
colormap[0] = 1;
// Assert that getColormap() returns a defensive copy
assertEquals(0, sut.getColormap()[0]);
}
private static final class TestColorModel extends ColorModel {
protected TestColorModel(ColorSpace cspace, boolean isAlphaPremultiplied) {
super(1, new int[] {1, 1}, cspace, isAlphaPremultiplied, isAlphaPremultiplied, 1, 1);
}
@Override
public int getRed(int pixel) {
return 0;
}
@Override
public int getGreen(int pixel) {
return 0;
}
@Override
public int getBlue(int pixel) {
return 0;
}
@Override
public int getAlpha(int pixel) {
return 0;
}
}
}