182 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			182 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
|  | package kha.wpf; | ||
|  | 
 | ||
|  | import kha.FontStyle; | ||
|  | import kha.Image; | ||
|  | import kha.Kravur; | ||
|  | import kha.math.FastMatrix3; | ||
|  | import kha.math.Matrix3; | ||
|  | import kha.Rotation; | ||
|  | import system.windows.media.Color; | ||
|  | import system.windows.media.DrawingContext; | ||
|  | import system.windows.media.DrawingVisual; | ||
|  | import system.windows.media.imaging.BitmapSource; | ||
|  | import system.windows.media.ImageBrush; | ||
|  | import system.windows.media.MatrixTransform; | ||
|  | 
 | ||
|  | class Painter extends kha.graphics2.Graphics { | ||
|  | 	public var context: DrawingContext; | ||
|  | 	public var visual: DrawingVisual; | ||
|  | 	public var image: BitmapSource; | ||
|  | 
 | ||
|  | 	var myColor: Color; | ||
|  | 	var myKhaColor: kha.Color; | ||
|  | 	var myFont: Kravur; | ||
|  | 	var tx: Float; | ||
|  | 	var ty: Float; | ||
|  | 
 | ||
|  | 	public var width: Int; | ||
|  | 	public var height: Int; | ||
|  | 
 | ||
|  | 	static var garbageCounter: Int = 0; | ||
|  | 
 | ||
|  | 	public function new(width: Int, height: Int) { | ||
|  | 		super(); | ||
|  | 		this.width = width; | ||
|  | 		this.height = height; | ||
|  | 		tx = 0; | ||
|  | 		ty = 0; | ||
|  | 		// font = new Font("Arial", new FontStyle(false, false, false), 20); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	override public function begin(clear: Bool = true, clearColor: kha.Color = null): Void { | ||
|  | 		if (visual != null) | ||
|  | 			context = visual.RenderOpen(); | ||
|  | 		context.PushTransform(new MatrixTransform(transformation._00, transformation._01, transformation._10, transformation._11, transformation._20, | ||
|  | 			transformation._21)); | ||
|  | 		if (clear) | ||
|  | 			this.clear(clearColor); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	override public function clear(color: kha.Color = null): Void { | ||
|  | 		var prevColor = myKhaColor; | ||
|  | 		this.color = color == null ? Color.Black : color; | ||
|  | 		fillRect(0, 0, width, height); | ||
|  | 		this.color = prevColor; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode('
 | ||
|  | 		if (visual != null) { | ||
|  | 			context.Close(); | ||
|  | 			((global::System.Windows.Media.Imaging.RenderTargetBitmap) image).Render(visual); | ||
|  | 			++garbageCounter; | ||
|  | 			if (garbageCounter > 30) { | ||
|  | 				global::System.GC.Collect(); // Because rendering into an image is a really really bad thing in WPF | ||
|  | 			} | ||
|  | 		} | ||
|  | 	')
 | ||
|  | 	override public function end(): Void {} | ||
|  | 
 | ||
|  | 	override public function setTransformation(transformation: FastMatrix3): Void { | ||
|  | 		context.Pop(); | ||
|  | 		context.PushTransform(new MatrixTransform(transformation._00, transformation._01, transformation._10, transformation._11, transformation._20, | ||
|  | 			transformation._21)); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode('
 | ||
|  | 		var img = (Image)image; | ||
|  | 		context.DrawImage(img.image, new global::System.Windows.Rect(tx + x, ty + y, img.get_width(), img.get_height())); | ||
|  | 	')
 | ||
|  | 	override public function drawImage(image: Image, x: Float, y: Float): Void {} | ||
|  | 
 | ||
|  | 	@:functionCode('
 | ||
|  | 		var img = (Image)image; | ||
|  | 		//var cropped = new System.Windows.Media.Imaging.CroppedBitmap(img.image, new System.Windows.Int32Rect((int)sx, (int)sy, (int)sw, (int)sh)); | ||
|  | 		//context.DrawImage(cropped, new System.Windows.Rect(tx + dx, ty + dy, dw, dh)); //super slow | ||
|  | 		img.brush.Viewbox = new global::System.Windows.Rect(sx / img.get_width(), sy / img.get_height(), sw / img.get_width(), sh / img.get_height()); | ||
|  | 		context.DrawRectangle(img.brush, null, new global::System.Windows.Rect(tx + dx, ty + dy, dw, dh)); | ||
|  | 	')
 | ||
|  | 	override public function drawScaledSubImage(image: kha.Image, sx: Float, sy: Float, sw: Float, sh: Float, dx: Float, dy: Float, dw: Float, | ||
|  | 		dh: Float): Void {} | ||
|  | 
 | ||
|  | 	/*@:functionCode('
 | ||
|  | 			if (text != null) { | ||
|  | 				text.Replace(\' \', (char)160); // Non-breaking space 
 | ||
|  | 				System.Windows.Media.FormattedText fText = new System.Windows.Media.FormattedText(text,  | ||
|  | 					System.Globalization.CultureInfo.GetCultureInfo("en-us"), System.Windows.FlowDirection.LeftToRight, | ||
|  | 					new System.Windows.Media.Typeface(font.get_name()), font.get_size(), new System.Windows.Media.SolidColorBrush(color)); | ||
|  | 				if (font.get_style().getBold()) fText.SetFontWeight(System.Windows.FontWeights.Bold); | ||
|  | 				if (font.get_style().getItalic()) fText.SetFontStyle(System.Windows.FontStyles.Italic); | ||
|  | 				if (font.get_style().getUnderlined()) fText.SetTextDecorations(System.Windows.TextDecorations.Underline); | ||
|  | 				context.DrawText(fText, new System.Windows.Point(tx + x, ty + y)); | ||
|  | 			} | ||
|  | 		')
 | ||
|  | 		override public function drawString(text : String, x : Float, y : Float) : Void { | ||
|  | 			 | ||
|  | 	}*/ | ||
|  | 	@:functionCode('
 | ||
|  | 		var img = (Image)myFont._get(myFontSize, null).getTexture(); | ||
|  | 		var xpos = tx + x; | ||
|  | 		var ypos = ty + y; | ||
|  | 		for (int i = 0; i < text.Length; ++i) { | ||
|  | 			var q = myFont._get(myFontSize, null).getBakedQuad(text[i] - 32, xpos, ypos); | ||
|  | 			if (q != null) { | ||
|  | 				var brush = new global::System.Windows.Media.ImageBrush(img.image); | ||
|  | 				brush.Viewbox = new global::System.Windows.Rect(q.s0, q.t0, q.s1 - q.s0, q.t1 - q.t0); | ||
|  | 				context.PushOpacityMask(brush); | ||
|  | 				context.DrawRectangle(new global::System.Windows.Media.SolidColorBrush(myColor), null, new global::System.Windows.Rect(q.x0, q.y0, q.x1 - q.x0, q.y1 - q.y0)); | ||
|  | 				context.Pop(); | ||
|  | 				xpos += q.xadvance; | ||
|  | 			} | ||
|  | 		} | ||
|  | 	')
 | ||
|  | 	override public function drawString(text: String, x: Float, y: Float): Void {} | ||
|  | 
 | ||
|  | 	override function get_color(): kha.Color { | ||
|  | 		return myKhaColor; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	override function set_color(color: kha.Color): kha.Color { | ||
|  | 		setColorInternal(color.Ab, color.Rb, color.Gb, color.Bb); | ||
|  | 		return myKhaColor = color; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	override function get_font(): kha.Font { | ||
|  | 		return myFont; | ||
|  | 	} | ||
|  | 
 | ||
|  | 	override function set_font(font: kha.Font): kha.Font { | ||
|  | 		return this.myFont = cast(font, Kravur); | ||
|  | 	} | ||
|  | 
 | ||
|  | 	@:functionCode('
 | ||
|  | 		myColor = global::System.Windows.Media.Color.FromArgb((byte)a, (byte)r, (byte)g, (byte)b); | ||
|  | 	')
 | ||
|  | 	function setColorInternal(a: Int, r: Int, g: Int, b: Int): Void {} | ||
|  | 
 | ||
|  | 	@:functionCode('
 | ||
|  | 		if (width < 0.0) { | ||
|  | 			x += width; | ||
|  | 			width = -width; | ||
|  | 		} | ||
|  | 		if (height < 0.0) { | ||
|  | 			y += height; | ||
|  | 			height = -height; | ||
|  | 		} | ||
|  | 		context.DrawRectangle(null, new global::System.Windows.Media.Pen(new global::System.Windows.Media.SolidColorBrush(myColor), strength.value), new global::System.Windows.Rect(tx + x, ty + y, width, height)); | ||
|  | 	')
 | ||
|  | 	override public function drawRect(x: Float, y: Float, width: Float, height: Float, strength: Float = 1.0): Void {} | ||
|  | 
 | ||
|  | 	@:functionCode('
 | ||
|  | 		if (width < 0.0) { | ||
|  | 			x += width; | ||
|  | 			width = -width; | ||
|  | 		} | ||
|  | 		if (height < 0.0) { | ||
|  | 			y += height; | ||
|  | 			height = -height; | ||
|  | 		} | ||
|  | 		context.DrawRectangle(new global::System.Windows.Media.SolidColorBrush(myColor), new global::System.Windows.Media.Pen(), new global::System.Windows.Rect(tx + x, ty + y, width, height)); | ||
|  | 	')
 | ||
|  | 	override public function fillRect(x: Float, y: Float, width: Float, height: Float): Void {} | ||
|  | 
 | ||
|  | 	@:functionCode('
 | ||
|  | 		context.DrawLine(new global::System.Windows.Media.Pen(new global::System.Windows.Media.SolidColorBrush(myColor), 1), new global::System.Windows.Point(tx + x1, ty + y1), new global::System.Windows.Point(tx + x2, ty + y2)); | ||
|  | 	')
 | ||
|  | 	override function drawLine(x1: Float, y1: Float, x2: Float, y2: Float, strength: Float = 1.0): Void {} | ||
|  | 
 | ||
|  | 	@:functionCode('
 | ||
|  | 		context.DrawVideo(((Video)video).getPlayer(), new global::System.Windows.Rect(tx + x, ty + y, width, height)); | ||
|  | 	')
 | ||
|  | 	override function drawVideo(video: kha.Video, x: Float, y: Float, width: Float, height: Float): Void {} | ||
|  | } |