/******************************************************************************* * Copyright (c) 2015 * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER * DEALINGS IN THE SOFTWARE. *******************************************************************************/ package jsettlers.common.texturegeneration; import java.io.BufferedOutputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.ShortBuffer; /** * This is a texture file. It contains a short array and can write images to the file. * * @author michael */ public class TextureFile { private final File file; private int drawx = 0; // x coordinate of free space // top pixel of current line private int linetop = 0; // first pixel that does not belong to the current line. private int linebottom = 0; private final ByteBuffer buffer; private final ShortBuffer shortBuffer; private final int width; private final int height; public TextureFile(File file, int width, int height) { this.file = file; this.width = width; this.height = height; buffer = ByteBuffer.allocate(width * height * 2); buffer.order(ByteOrder.nativeOrder()); shortBuffer = buffer.asShortBuffer(); } public TexturePosition addImage(ShortBuffer imageData, int width) { imageData.rewind(); int height = (imageData.remaining() + width - 1) / width; int startx; int starty; // compute start if (drawx + width > this.width) { drawx = 0; linetop = linebottom; } startx = drawx; starty = linetop; // update for next image drawx += width; linebottom = Math.max(linebottom, linetop + height); // draw! short[] buffer = new short[width]; for (int y = 0; imageData.hasRemaining(); y++) { shortBuffer.position((starty + y) * this.width + startx); imageData.get(buffer); shortBuffer.put(buffer); } return new TexturePosition((float) startx / this.width, (float) starty / this.height, (float) (startx + width + 1) / this.width, (float) (starty + height + 1) / this.height); } public void write() throws IOException { DataOutputStream out = new DataOutputStream(new BufferedOutputStream( new FileOutputStream(file))); shortBuffer.rewind(); while (shortBuffer.hasRemaining()) { out.writeShort(shortBuffer.get()); } out.close(); } }