/* * @(#)BitmapImageSource.java 1.13 06/10/10 * * Copyright 1990-2008 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License version * 2 only, as published by the Free Software Foundation. * * This program 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 * General Public License version 2 for more details (a copy is * included at /legal/license.txt). * * You should have received a copy of the GNU General Public License * version 2 along with this work; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa * Clara, CA 95054 or visit www.sun.com if you need additional * information or have any questions. * */ package sun.porting.utils; import java.awt.Color; import java.awt.image.*; /** * A memory image source whose memory representation consists of * a packed bitmap (32 bits packed into each int) and an IndexColorModel * describing the colors represented by the bits (i.e. the background color * maps to pixel value 0 and the foreground color to pixel value 1). * @version 1.8 */ public class BitmapImageSource extends MemoryImageSource { /** * Create an image source for an image of the given width and height, * with packed bitmap data stored in pix[] and using the given * IndexColorModel to translate the bits into colors. * @param w The width of the image * @param h The height of the image * @param pix The bitmap data, packed 32 pixels per int. The data must * be padded so that each scanline starts on an int boundary. * @param cm The color model describing the meanings of 0 (background) * and 1 (foreground). */ public BitmapImageSource(int w, int h, int pix[], IndexColorModel cm) { super(w, h, cm, translatePixels(pix, w, h), 0, w); } /** * Create an IndexColorModel of size 2 that translates color 0 to the given * background color and color 1 to the given foreground color. * @param fg The desired foreground color * @param bg The desired background color * @return An IndexColorModel which maps 1/0 to the given colors. */ protected static IndexColorModel makeColorModel(Color fg, Color bg) { byte r[] = new byte[2]; byte g[] = new byte[2]; byte b[] = new byte[2]; r[0] = (byte) bg.getRed(); g[0] = (byte) bg.getGreen(); b[0] = (byte) bg.getBlue(); r[1] = (byte) fg.getRed(); g[1] = (byte) fg.getGreen(); b[1] = (byte) fg.getBlue(); return new IndexColorModel(8, 2, r, g, b, 0); } /** * Translate bitmap image data into byte image data. * Takes a bitmap packed 32 pixels to an int (i.e. 1 bit of data per pixel, * plus padding), and returns one byte of data per pixel, no padding. * @param pix The input pixel data (bitmap data) * @param width The width of the input bitmap * @param height The height of the input bitmap * @return A byte array containing the translated bitmap. */ protected static byte[] translatePixels(int pix[], int width, int height) { byte data[] = new byte[height * width]; for (int y = 0; y < height; ++y) { int ix = y * ((width + 31) >> 5); int d = pix[ix++]; int mask = (int) 0x80000000; for (int x = 0; x < width; ++x) { if (mask == 0) { d = pix[ix++]; mask = (int) 0x80000000; } if ((mask & d) != 0) { data[y * width + x] = 1; } mask >>>= 1; } } return data; } }