public static XNBSpriteFont read(File file) {
		try {
			Image xImage;
			List<Rectangle> xGlyphs = new ArrayList<Rectangle>(), xCropping = new ArrayList<Rectangle>();
			List<Character> xChars = new ArrayList<Character>();
			int xSpacingV;
			float xSpacingH;
			List<float[]> xKerning = new ArrayList<float[]>();
			
			BinBuffer binb = new BinFile(file).read();
			
			BinBuffer imageData = new BinBuffer();
			imageData.writeBytes(binb.readBytes((int)binb.readUInt()));
			
			imageData.setPos(0);
			xImage = new Image(new BinBufferInputStream(imageData),file.getName(),false);
			
			int count = (int)binb.readUInt();
			while (count-- > 0) {
				xGlyphs.add(new Rectangle(binb.readInt(),binb.readInt(),binb.readInt(),binb.readInt()));
				xCropping.add(new Rectangle(binb.readInt(),binb.readInt(),binb.readInt(),binb.readInt()));
				xChars.add(binb.readJavaString().charAt(0));
			}
			
			xSpacingV = binb.readInt();
			xSpacingH = binb.readFloat();
			
			count = (int)binb.readUInt();
			while (count-- > 0) xKerning.add(new float[]{binb.readFloat(),binb.readFloat(),binb.readFloat()});
			
			return new XNBSpriteFont(xImage,xGlyphs,xCropping,xChars,xSpacingV,xSpacingH,xKerning);
		} catch (Exception e) {App.getApp().handle(e);}
		return null;
	}