/* * JBoss, Home of Professional Open Source * Copyright 2013, Red Hat, Inc. and individual contributors * by the @authors tag. See the copyright.txt in the distribution for a * full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.richfaces.resource; import java.awt.Dimension; import java.awt.Transparency; import java.awt.color.ColorSpace; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.awt.image.ComponentColorModel; import java.awt.image.DataBuffer; import java.awt.image.IndexColorModel; import java.awt.image.WritableRaster; public enum ImageType { GIF("gif") { @Override public BufferedImage createImage(int width, int height) { return createBitmaskImage(width, height); } }, PNG("png") { @Override public BufferedImage createImage(int width, int height) { return createARGBImage(width, height); } }, PNG8("png") { @Override public BufferedImage createImage(int width, int height) { return new BufferedImage(width, height, BufferedImage.TYPE_BYTE_INDEXED, SAFE_WEB_COLORS_MODEL); } }, JPEG("jpeg") { @Override public BufferedImage createImage(int width, int height) { return new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); } }; /** * Default web safe colors color model */ protected static final IndexColorModel SAFE_WEB_COLORS_MODEL; // Build web safe 6x6x6 cube color model. static { byte[] webLevels = { 0, 51, 102, (byte) 153, (byte) 204, (byte) 255 }; int colorsNumber = webLevels.length * webLevels.length * webLevels.length; /* 216 colors */ byte[] r = new byte[colorsNumber]; byte[] g = new byte[colorsNumber]; byte[] b = new byte[colorsNumber]; r[0] = 0; g[0] = 0; b[0] = 0; for (int i = 0; i < webLevels.length; i++) { for (int j = 0; j < webLevels.length; j++) { for (int k = 0; k < webLevels.length; k++) { int colorNum = i * webLevels.length * webLevels.length + j * webLevels.length + k; r[colorNum] = webLevels[i]; g[colorNum] = webLevels[j]; b[colorNum] = webLevels[k]; } } } SAFE_WEB_COLORS_MODEL = new IndexColorModel(8, colorsNumber, r, g, b, 0); } private String formatName; private String mimeType; private ImageType(String formatName) { this.formatName = formatName; this.mimeType = "image/" + formatName; } private static BufferedImage createARGBImage(int width, int height) { return new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); } private static BufferedImage createBitmaskImage(int width, int height) { ColorModel colorModel = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), true, false, Transparency.BITMASK, DataBuffer.TYPE_BYTE); WritableRaster raster = colorModel.createCompatibleWritableRaster(width, height); return new BufferedImage(colorModel, raster, colorModel.isAlphaPremultiplied(), null); } public abstract BufferedImage createImage(int width, int height); public BufferedImage createImage(Dimension dimension) { return createImage(dimension.width, dimension.height); } public String getFormatName() { return formatName; } public String getMimeType() { return mimeType; } }