ncannasse 11 gadi atpakaļ
vecāks
revīzija
ddefb3e987
1 mainītis faili ar 41 papildinājumiem un 31 dzēšanām
  1. 41 31
      hxd/Pixels.hx

+ 41 - 31
hxd/Pixels.hx

@@ -12,7 +12,7 @@ class Pixels {
 	public var height : Int;
 	public var offset : Int;
 	public var flags: haxe.EnumFlags<Flags>;
-	
+
 	public function new(width : Int, height : Int, bytes : haxe.io.Bytes, format : hxd.PixelFormat, offset = 0) {
 		this.width = width;
 		this.height = height;
@@ -20,7 +20,7 @@ class Pixels {
 		this.format = format;
 		this.offset = offset;
 	}
-		
+
 	public function makeSquare( ?copy : Bool ) {
 		var w = width, h = height;
 		var tw = w == 0 ? 0 : 1, th = h == 0 ? 0 : 1;
@@ -86,69 +86,79 @@ class Pixels {
 				mem.wb(p+2, b);
 			}
 			mem.end();
-			
+
 		case [ARGB, RGBA]: {
 			var mem = hxd.impl.Memory.select(bytes);
 			for ( i in 0...width * height ) {
 				var p = (i << 2) + offset;
 				var a = (mem.b(p));
-				
+
 				mem.wb(p, mem.b(p + 1));
 				mem.wb(p + 1, mem.b(p + 2));
 				mem.wb(p + 2, mem.b(p + 3));
-				mem.wb(p + 3, a);				
+				mem.wb(p + 3, a);
 			}
 			mem.end();
 		}
-		
+
 		default:
 			throw "Cannot convert from " + format + " to " + target;
 		}
 		format = target;
 	}
-	
+
 	public function getPixel(x, y) : Int {
-		var p = 4 * (y * width + x) + offset;
+		var p = ((x + y * width) << 2) + offset;
+		switch(format) {
+		case BGRA:
+			return bytes.get(p) | (bytes.get( p+1 )<<8) | (bytes.get( p+2 )<<16) | (bytes.get( p+3 )<<24);
+		case RGBA:
+			return (bytes.get(p)<<16) | (bytes.get( p+1 )<<8) | bytes.get( p+2 ) | (bytes.get( p+3 )<<24);
+		case ARGB:
+			return (bytes.get(p)<<24) | (bytes.get( p+1 )<<16) | (bytes.get( p+2 )<<8) | bytes.get( p+3 );
+		}
+	}
+
+	public function setPixel(x, y, color) : Void {
+		var p = ((x + y * width) << 2) + offset;
+		var a = color >>> 24;
+		var r = (color >> 16) & 0xFF;
+		var g = (color >> 8) & 0xFF;
+		var b = color & 0xFF;
 		switch(format) {
 		case BGRA:
-			var u = 0;
-			u |= bytes.get( p	);
-			u |= bytes.get( p+1 )<<8;
-			u |= bytes.get( p+2 )<<16;
-			u |= bytes.get( p+3 )<<24;
-			return u;
+			bytes.set(p++, b);
+			bytes.set(p++, g);
+			bytes.set(p++, r);
+			bytes.set(p++, a);
 		case RGBA:
-			var u = 0;
-			u |= bytes.get( p	)<<16;
-			u |= bytes.get( p+1 )<<8;
-			u |= bytes.get( p+2 );
-			u |= bytes.get( p+3 )<<24;
-			return u;
+			bytes.set(p++, r);
+			bytes.set(p++, g);
+			bytes.set(p++, b);
+			bytes.set(p++, a);
 		case ARGB:
-			var u = 0;
-			u |= bytes.get( p	)<<24;
-			u |= bytes.get( p+1 )<<16;
-			u |= bytes.get( p+2 )<<8;
-			u |= bytes.get( p+3 );
-			return u;
-		}		
+			bytes.set(p++, a);
+			bytes.set(p++, r);
+			bytes.set(p++, g);
+			bytes.set(p++, b);
+		}
 	}
-	
+
 	public function dispose() {
 		if( bytes != null ) {
 			if( !flags.has(ReadOnly) ) hxd.impl.Tmp.saveBytes(bytes);
 			bytes = null;
 		}
 	}
-	
+
 	public static function bytesPerPixel( format : PixelFormat ) {
 		return switch( format ) {
 		case ARGB, BGRA, RGBA: 4;
 		}
 	}
-	
+
 	public static function alloc( width, height, format ) {
 		return new Pixels(width, height, hxd.impl.Tmp.getBytes(width * height * bytesPerPixel(format)), format);
 	}
-	
+
 }