package org.apache.commons.imaging.common;

import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DataBufferInt;
import java.awt.image.DirectColorModel;
import java.awt.image.WritableRaster;
import java.util.Properties;

public class ImageBuilder {
    private int[] data;
    private int width;
    private int height;
    private boolean hasAlpha;
    
    public ImageBuilder(int width, int height, boolean hasAlpha) {
        data = new int[width * height];
        this.width = width;
        this.height = height;
        this.hasAlpha = hasAlpha;
    }
    
    public int getWidth() {
        return width;
    }
    
    public int getHeight() {
        return height;
    }
    
    public int getRGB(int x, int y) {
        final int rowOffset = y * width;
        return data[rowOffset + x];
    }

    public void setRGB(int x, int y, int argb) {
        final int rowOffset = y * width;
        data[rowOffset + x] = argb;
    }
    
    public BufferedImage getBufferedImage() {
        ColorModel colorModel;
        WritableRaster raster;
        DataBufferInt buffer = new DataBufferInt(data, width * height);
        if (hasAlpha) {
            colorModel = new DirectColorModel(32,
                    0x00ff0000,
                    0x0000ff00,
                    0x000000ff,
                    0xff000000);
            raster = WritableRaster.createPackedRaster(buffer, width, height, width,
                    new int[] { 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }, null);
        } else {
            colorModel = new DirectColorModel(24,
                    0x00ff0000,
                    0x0000ff00,
                    0x000000ff);
            raster = WritableRaster.createPackedRaster(buffer, width, height, width,
                    new int[] { 0x00ff0000, 0x0000ff00, 0x000000ff }, null);
        }
        return new BufferedImage(colorModel, raster, colorModel.isAlphaPremultiplied(), new Properties());
    }
}
