package com.vitco.importer; import com.vitco.util.file.FileIn; import com.vitco.util.file.RandomAccessFileIn; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.ArrayList; /** * *.pnx importer */ public class PnxImporter extends AbstractImporter { // constructor public PnxImporter(File file, String name) throws IOException { super(file, name); } @Override protected boolean read(FileIn fileIn, RandomAccessFileIn raf) throws IOException { // read overall size fileIn.readIntRev(); fileIn.readIntRev(); fileIn.readIntRev(); int layerCount = fileIn.readIntRev(); // read all images int imageCount = fileIn.readIntRev(); ArrayList<BufferedImage> images = new ArrayList<BufferedImage>(); for (int i = 0; i < imageCount; i++) { images.add(fileIn.readImage()); } for (int i = 0; i < layerCount; i++) { // read layer name int layerNameLength = fileIn.readIntRev(); String layerName = fileIn.readUTF8String(layerNameLength); prependLayer(layerName); // read layer visibility boolean visible = fileIn.readByte() == 1; setLayerVisibility(visible); // read layer locked state fileIn.readByte(); // boolean locked = fileIn.readByte() == 0; // read layer size and corner int[] size = new int[]{fileIn.readIntRev(), fileIn.readIntRev(), fileIn.readIntRev()}; int[] min = new int[]{fileIn.readIntRev(), fileIn.readIntRev(), fileIn.readIntRev()}; // read layer slice by slice for (int x = size[0] + min[0] - 1; x > min[0] - 1; x--) { // read image for slice BufferedImage img = images.get(fileIn.readIntRev()); for (int y = 0; y < size[1]; y++) { for (int z = 0; z < size[2]; z++) { //noinspection SuspiciousNameCombination int rgb = img.getRGB(y, z); if ((rgb >> 24) != 0x00) { addVoxel(x, y + min[1], z + min[2], rgb); } } } } } return true; } }