t3du - New Image nodes: Draw Sub Image and Write Image
This commit is contained in:
		
							
								
								
									
										122
									
								
								leenkx/Sources/iron/format/bmp/Reader.hx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										122
									
								
								leenkx/Sources/iron/format/bmp/Reader.hx
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,122 @@ | ||||
| /* | ||||
|  * format - Haxe File Formats | ||||
|  * | ||||
|  *  BMP File Format | ||||
|  *  Copyright (C) 2007-2009 Robert Sköld | ||||
|  * | ||||
|  * Copyright (c) 2009, The Haxe Project Contributors | ||||
|  * All rights reserved. | ||||
|  * Redistribution and use in source and binary forms, with or without | ||||
|  * modification, are permitted provided that the following conditions are met: | ||||
|  * | ||||
|  *   - Redistributions of source code must retain the above copyright | ||||
|  *     notice, this list of conditions and the following disclaimer. | ||||
|  *   - Redistributions in binary form must reproduce the above copyright | ||||
|  *     notice, this list of conditions and the following disclaimer in the | ||||
|  *     documentation and/or other materials provided with the distribution. | ||||
|  * | ||||
|  * THIS SOFTWARE IS PROVIDED BY THE HAXE PROJECT CONTRIBUTORS "AS IS" AND ANY | ||||
|  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||||
|  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||||
|  * DISCLAIMED. IN NO EVENT SHALL THE HAXE PROJECT CONTRIBUTORS BE LIABLE FOR | ||||
|  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | ||||
|  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | ||||
|  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | ||||
|  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | ||||
|  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | ||||
|  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH | ||||
|  * DAMAGE. | ||||
|  */ | ||||
|  | ||||
| package iron.format.bmp; | ||||
|  | ||||
| import iron.format.bmp.Data; | ||||
|  | ||||
|  | ||||
| class Reader { | ||||
|  | ||||
| 	var input : haxe.io.Input; | ||||
|  | ||||
| 	public function new( i ) { | ||||
| 		input = i; | ||||
| 	} | ||||
|  | ||||
| 	/**  | ||||
| 	 * Only supports uncompressed 24bpp bitmaps (the most common format). | ||||
| 	 *  | ||||
| 	 * The returned bytes in `Data.pixels` will be in BGR order, and with padding (if present). | ||||
| 	 *  | ||||
| 	 * @see https://msdn.microsoft.com/en-us/library/windows/desktop/dd318229(v=vs.85).aspx | ||||
| 	 * @see https://en.wikipedia.org/wiki/BMP_file_format#Bitmap_file_header | ||||
| 	 */ | ||||
| 	public function read() : format.bmp.Data { | ||||
| 		// Read Header | ||||
| 		for (b in ["B".code, "M".code]) { | ||||
| 			if (input.readByte() != b) throw "Invalid header"; | ||||
| 		} | ||||
| 	 | ||||
| 		var fileSize = input.readInt32(); | ||||
| 		input.readInt32();							// Reserved | ||||
| 		var offset = input.readInt32(); | ||||
|  | ||||
| 		// Read InfoHeader | ||||
| 		var infoHeaderSize = input.readInt32();		// InfoHeader size | ||||
| 		if (infoHeaderSize != 40) { | ||||
| 			throw 'Info headers with size $infoHeaderSize not supported.'; | ||||
| 		} | ||||
| 		var width = input.readInt32();				// Image width (actual, not padded) | ||||
| 		var height = input.readInt32();				// Image height | ||||
| 		var numPlanes = input.readInt16();			// Number of planes | ||||
| 		var bits = input.readInt16();				// Bits per pixel | ||||
| 		var compression = input.readInt32();		// Compression type | ||||
| 		var dataLength = input.readInt32();			// Image data size (includes padding!) | ||||
| 		input.readInt32();							// Horizontal resolution | ||||
| 		input.readInt32();							// Vertical resolution | ||||
| 		var colorsUsed = input.readInt32();			// Colors used (0 when uncompressed) | ||||
| 		input.readInt32();							// Important colors (0 when uncompressed) | ||||
|  | ||||
| 		// If there's no compression, the dataLength may be 0 | ||||
| 		if ( compression == 0 && dataLength == 0 ) dataLength = fileSize - offset; | ||||
|  | ||||
| 		var bytesRead = 54; // total read above | ||||
| 		 | ||||
| 		var colorTable : haxe.io.Bytes = null; | ||||
| 		if ( bits <= 8 ) { | ||||
| 			if ( colorsUsed == 0 ) { | ||||
| 				colorsUsed = Tools.getNumColorsForBitDepth(bits); | ||||
| 			} | ||||
| 			var colorTableLength = 4 * colorsUsed; | ||||
| 			colorTable = haxe.io.Bytes.alloc( colorTableLength ); | ||||
| 			input.readFullBytes( colorTable, 0, colorTableLength ); | ||||
| 			bytesRead += colorTableLength; | ||||
| 		} | ||||
|  | ||||
| 		input.read( offset - bytesRead ); | ||||
| 		 | ||||
| 		var p = haxe.io.Bytes.alloc( dataLength );	 | ||||
| 		 | ||||
| 		// Read Raster Data | ||||
| 		var paddedStride = Tools.computePaddedStride(width, bits); | ||||
| 		var topToBottom = false; | ||||
| 		if ( height < 0 ) { // if bitmap is stored top to bottom | ||||
| 			topToBottom = true; | ||||
| 			height = -height; | ||||
| 		} | ||||
|      | ||||
| 		input.readFullBytes(p, 0, dataLength); | ||||
| 			 | ||||
| 		return { | ||||
| 			header: { | ||||
| 				width: width, | ||||
| 				height: height, | ||||
| 				paddedStride: paddedStride, | ||||
| 				topToBottom: topToBottom, | ||||
| 				bpp: bits, | ||||
| 				dataLength: dataLength, | ||||
| 				compression: compression | ||||
| 			}, | ||||
| 			pixels: p, | ||||
| 			colorTable: colorTable | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user