Browse Source

Multi-monitor codes with user manual after code cleanup

Clindo 7 years ago
parent
commit
d3583bae4b

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+.idea/

+ 0 - 1
AutoHotKeyScripts/ReadME

@@ -1 +0,0 @@
-Add your AHK scripts here

+ 0 - 116
AutoHotKeyScripts/powerpoint.ahk

@@ -1,116 +0,0 @@
-#include, Gdip.ahk 
-
-f5:: 
-  try{
-    ppt := ComObjActive("PowerPoint.Application")
-	objppt := ppt.ActivePresentation
-	TotalSlides:=% objppt.Slides.Count
-	FileCreateDir, temp
-  }
-  catch e {
-	MsgBox % "Error in " e.Message ", which was called at line " e.Line 
-  }
-  ;objppt.Export("C:\Users\SK\Documents\AutoHotKey\temp",FilterName:="png",1366,768)
-  ;"C:\Users\SK\Documents\AutoHotKey\temp", "E:\AHK\AutoHotKeyScripts\temp"
-  
-  ;path = %A_WorkingDir%\temp
-  ;objppt.Export(path, FilterName:="png",1366,768)
-  
-  ;Loop %TotalSlides%{
-	;var++
-	;MsgBox %var%
-	;saveppt := objppt.Slides(var).Export(A_ScriptDir . "\temp\" . var . ".png", "PNG",1366,768)
-  ;}
-  ;pt := ppt.ActivePresentation.(test, ppSaveAsPNG)
-  SysGet, MonitorCount, MonitorCount
-  ;MsgBox %MonitorCount%
-  ;MsgBox saved
-  ;MsgBox inside %MonitorCount%
-  ppt := objppt.SlideShowSettings
-  ppt.Run
-  ;monitorDisplay(objppt, MonitorCount)
-Return
-
-Right::
-	SlideNum :=% objppt.SlideShowWindow.View.Slide.SlideIndex
-	;MsgBox %SlideNum%
-	saveScreenshot(SlideNum)
-	;saveppt := objppt.Slides(SlideNum).Export(A_ScriptDir . "\temp\" . SlideNum . ".png", "PNG",1366,768)
-	objppt.SlideShowWindow.View.Next
-	monitorDisplay(objppt, MonitorCount)
-	return
-	
-Left::
-	objppt.SlideShowWindow.View.Previous
-	monitorDisplay(objppt, MonitorCount)
-	return
-
-monitorDisplay(objppt, MonitorCount){
-	try{
-		CurrentSlideNumber :=% objppt.SlideShowWindow.View.Slide.SlideIndex
-		}
-	catch{
-		FileRemoveDir, temp, 1
-		ExitApp
-		}
-	;MsgBox %CurrentSlideNumber% is the current slide
-	monitor := MonitorCount-1
-	var2 := 0
-	Loop %monitor%{
-		;MsgBox insideloop
-		var2++
-		;MsgBox var2(MonitorNumber) val = %var2%
-		setDisplay(var2, CurrentSlideNumber-1)
-		CurrentSlideNumber--
-		;var2 := 0
-		;MsgBox end of Loop monitor var2 = %var2%
-	}
-}	
-	
-getCoordinates(MonitorNumber){
-	;coord := 1366*MonitorNumber
-	if(MonitorNumber = 1)
-		return 1920
-	if(MonitorNumber = 2)
-		return 3840
-	;return coord
-}
-
-;SetEnv file, C:\Users\SK\Documents\AutoHotKey\1.png
-
-setDisplay(MonitorNumber, PreviousSlideNumber){
-global
-	coord := getCoordinates(MonitorNumber)
-	SetEnv file, %A_WorkingDir%\temp\%PreviousSlideNumber%.png
-	;file := "C:\Users\SK\Documents\AutoHotKey\Slide" . %CurrentSlideNumber% . ".png"
-	;file := "C:\Users\SK\Documents\AutoHotKey\1.png"
-	;MsgBox %coord%,%MonitorNumber%,%PreviousSlideNumber%,%file%
-	Gui, %MonitorNumber%:destroy
-	Gui, %MonitorNumber%:+AlwaysOnTop +LastFound +Owner -Caption
-	Gui, %MonitorNumber%:Color, Black
-	Gui, %MonitorNumber%:Add, Picture, w1024 h-1, %file%	
-	Gui, %MonitorNumber%:Show, x%coord% y0 maximize
-}
-
-Screenshot(outfile)
-{
-    pToken := Gdip_Startup()
-
-    screen=0|0|%A_ScreenWidth%|%A_ScreenHeight%
-    pBitmap := Gdip_BitmapFromScreen(screen)
-
-    Gdip_SaveBitmapToFile(pBitmap, outfile, 100)
-    Gdip_DisposeImage(pBitmap)
-    Gdip_Shutdown(pToken)
-}
-
-saveScreenshot(SlideNumber){
-	file := A_WorkingDir . "\temp\" . SlideNumber . ".png"
-	Screenshot(file)
-}
-
-
-ESC::
-	objppt.SlideShowWindow.View.Exit
-	FileRemoveDir, temp, 1
-	ExitApp

BIN
AutoHotKeyScripts/screenshot.exe


+ 0 - 27
JavaScripts/MirrorPathAdder/.gitignore

@@ -1,27 +0,0 @@
-*target*
-*.jar
-*.war
-*.ear
-*.class
-
-# eclipse specific git ignore
-*.pydevproject
-.project
-.metadata
-bin/**
-tmp/**
-tmp/**/*
-*.tmp
-*.bak
-*.swp
-*~.nib
-local.properties
-.classpath
-.settings/
-.loadpath
-
-# External tool builders
-.externalToolBuilders/
-
-# Locally stored "Eclipse launch configurations"
-*.launch

+ 0 - 6
JavaScripts/MirrorPathAdder/config.xml

@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
-<properties>
-<comment>Here are some favorites</comment>
-<entry key="DirPath">D:/Master Studies/WS16-17/TKPraktikum/ConvertedFiles</entry>
-</properties>

+ 0 - 171
JavaScripts/MirrorPathAdder/src/DirectoryChecker.java

@@ -1,171 +0,0 @@
-import static java.nio.file.StandardWatchEventKinds.ENTRY_CREATE;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.nio.file.FileSystems;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.nio.file.WatchEvent;
-import java.nio.file.WatchKey;
-import java.nio.file.WatchService;
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.Properties;
-import java.util.logging.FileHandler;
-import java.util.logging.Logger;
-import java.util.logging.SimpleFormatter;
-
-/**
- *
- * @author Clindo
- */
-
-/***
- * 
- * This DirectoryChecker uses the Watch Service API for checking the addition of
- * files in specified path This is developed as a part of TK Praktikum at TU
- * Darmstadt, Germany.
- *
- */
-public class DirectoryChecker {
-
-	public static Logger logger = Logger.getLogger("MyLog");  
-    public static FileHandler fh; 
-
-    
-    public static DateFormat df = new SimpleDateFormat("dd/MM/yy HH:mm:ss");
-    public static Date dateobj = new Date();
-    
-	public static void main(String[] args) {
-	    logger.setUseParentHandlers(false);
-		/*
-		 * Logger logger = Logger.getLogger(DirectoryChecker.class);
-		 * 
-		 * Appender Notconsole = new ConsoleAppender(); Logger root =
-		 * Logger.getRootLogger(); root.addAppender(Notconsole);
-		 * 
-		 * BasicConfigurator.configure();
-		 * logger.info("This is my first log4j's statement");
-		 */
-		String DirPath;
-		try {
-
-			fh = new FileHandler("LogFile.log");
-			logger.addHandler(fh);
-	        SimpleFormatter formatter = new SimpleFormatter();  
-	        fh.setFormatter(formatter);  
-	       
-			
-	        logger.info("---THE LOG FOR DIRECTORY CHECKER STARTS HERE--- "+df.format(dateobj));  
-			File file = new File("config.xml");
-			FileInputStream fileInput = new FileInputStream(file);
-			Properties properties = new Properties();
-			properties.loadFromXML(fileInput);
-			fileInput.close();
-
-			Enumeration enuKeys = properties.keys();
-
-			String propName = (String) enuKeys.nextElement();
-			String value = properties.getProperty(propName);
-			// System.out.println(propName + ": " + value);
-
-			 DirPath = value;
-			/*
-			 * while (enuKeys.hasMoreElements()) { String key = (String)
-			 * enuKeys.nextElement(); String value =
-			 * properties.getProperty(key); System.out.println(key + ": " +
-			 * value); }
-			 */
-
-			WatchService watcher = FileSystems.getDefault().newWatchService();
-			Path dir = Paths.get(DirPath);
-			dir.register(watcher, ENTRY_CREATE); // , ENTRY_DELETE, ENTRY_MODIFY
-
-			logger.info("Watch Service registered for dir: "
-					+ dir.getFileName()+df.format(dateobj));
-			
-			while (true) {
-				WatchKey key;
-				try {
-					key = watcher.take();
-				} catch (InterruptedException ex) {
-					return;
-				}
-
-				for (WatchEvent<?> event : key.pollEvents()) {
-					WatchEvent.Kind<?> kind = event.kind();
-
-					@SuppressWarnings("unchecked")
-					WatchEvent<Path> ev = (WatchEvent<Path>) event;
-					Path fileName = ev.context();
-
-					// System.out.println(kind.name() + ": " + fileName);
-
-					/*
-					 * if (kind == ENTRY_MODIFY && fileName.toString().equals(
-					 * "DirectoryChecker.java"))
-					 */
-
-					if (kind == ENTRY_CREATE) {
-
-						logger.info("---New Folder is created by Camtasia--- "+df.format(dateobj)); 
-						
-						String htmlName=fileName.toString()+".html";
-						
-						System.out.println(htmlName);
-						String htmlPath=DirPath+"/"+htmlName;
-						appendXml(htmlPath);
-
-					}
-				}
-
-				boolean valid = key.reset();
-				if (!valid) {
-					break;
-				}
-			}
-
-		} catch (IOException ex) {
-			System.err.println(ex);
-		}
-	}
-	
-
-	
-	
-	public static void appendXml(String htmlPath) {
-
-		System.out.println("Append xml here");
-
-		BufferedWriter bw = null;
-
-		try {
-			// APPEND MODE SET HERE
-			bw = new BufferedWriter(new FileWriter(
-					"D:/Master Studies/WS16-17/TKPraktikum/root.conf", true));
-			String toAppend= "Alias /TK/WeekNumber ";
-			
-			logger.info("---Alias is appended to Apache Root--- "+df.format(dateobj)); 
-			
-			bw.write(toAppend+htmlPath);
-			bw.newLine();
-			bw.flush();
-		} catch (IOException ioe) {
-			ioe.printStackTrace();
-		} finally { // always close the file
-			if (bw != null)
-				try {
-					bw.close();
-				} catch (IOException ioe2) {
-					// just ignore it
-				}
-		} // end try/catch/finally
-
-	} // end test()
-
-}

+ 0 - 16
JavaScripts/MirrorPathAdder/src/resources/log4j.properties

@@ -1,16 +0,0 @@
-# Root logger option
-log4j.rootLogger=DEBUG, stdout, file
-
-# Redirect log messages to console
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.Target=System.out
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
-
-# Redirect log messages to a log file, support file rolling.
-log4j.appender.file=org.apache.log4j.RollingFileAppender
-log4j.appender.file.File=D:\Master Studies\WS16-17\TKPraktikum\JavaPart\MirrorPathAdder\LogFile.log
-log4j.appender.file.MaxFileSize=5MB
-log4j.appender.file.MaxBackupIndex=10
-log4j.appender.file.layout=org.apache.log4j.PatternLayout
-log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n

+ 0 - 3
JavaScripts/ReadME

@@ -1,3 +0,0 @@
-ReadMe file for the java part
-
-The function of the Java part is to add the converted file path to the Moddle Servers Root.config

+ 0 - 12
JavaScripts/RemoteSystemsTempFiles/.project

@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>RemoteSystemsTempFiles</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.rse.ui.remoteSystemsTempNature</nature>
-	</natures>
-</projectDescription>

+ 2409 - 2409
AutoHotKeyScripts/Gdip.ahk → Multimonitor_Codes/Gdip.ahk

@@ -1,2410 +1,2410 @@
-; Gdip standard library v1.45 by tic (Tariq Porter) 07/09/11
-;
-;#####################################################################################
-;#####################################################################################
-; STATUS ENUMERATION
-; Return values for functions specified to have status enumerated return type
-;#####################################################################################
-;
-; Ok =						= 0
-; GenericError				= 1
-; InvalidParameter			= 2
-; OutOfMemory				= 3
-; ObjectBusy				= 4
-; InsufficientBuffer		= 5
-; NotImplemented			= 6
-; Win32Error				= 7
-; WrongState				= 8
-; Aborted					= 9
-; FileNotFound				= 10
-; ValueOverflow				= 11
-; AccessDenied				= 12
-; UnknownImageFormat		= 13
-; FontFamilyNotFound		= 14
-; FontStyleNotFound			= 15
-; NotTrueTypeFont			= 16
-; UnsupportedGdiplusVersion	= 17
-; GdiplusNotInitialized		= 18
-; PropertyNotFound			= 19
-; PropertyNotSupported		= 20
-; ProfileNotFound			= 21
-;
-;#####################################################################################
-;#####################################################################################
-; FUNCTIONS
-;#####################################################################################
-;
-; UpdateLayeredWindow(hwnd, hdc, x="", y="", w="", h="", Alpha=255)
-; BitBlt(ddc, dx, dy, dw, dh, sdc, sx, sy, Raster="")
-; StretchBlt(dDC, dx, dy, dw, dh, sDC, sx, sy, sw, sh, Raster="")
-; SetImage(hwnd, hBitmap)
-; Gdip_BitmapFromScreen(Screen=0, Raster="")
-; CreateRectF(ByRef RectF, x, y, w, h)
-; CreateSizeF(ByRef SizeF, w, h)
-; CreateDIBSection
-;
-;#####################################################################################
-
-; Function:     			UpdateLayeredWindow
-; Description:  			Updates a layered window with the handle to the DC of a gdi bitmap
-; 
-; hwnd        				Handle of the layered window to update
-; hdc           			Handle to the DC of the GDI bitmap to update the window with
-; Layeredx      			x position to place the window
-; Layeredy      			y position to place the window
-; Layeredw      			Width of the window
-; Layeredh      			Height of the window
-; Alpha         			Default = 255 : The transparency (0-255) to set the window transparency
-;
-; return      				If the function succeeds, the return value is nonzero
-;
-; notes						If x or y omitted, then layered window will use its current coordinates
-;							If w or h omitted then current width and height will be used
-
-UpdateLayeredWindow(hwnd, hdc, x="", y="", w="", h="", Alpha=255)
-{
-	if ((x != "") && (y != ""))
-		VarSetCapacity(pt, 8), NumPut(x, pt, 0), NumPut(y, pt, 4)
-
-	if (w = "") ||(h = "")
-		WinGetPos,,, w, h, ahk_id %hwnd%
-   
-	return DllCall("UpdateLayeredWindow", "uint", hwnd, "uint", 0, "uint", ((x = "") && (y = "")) ? 0 : &pt
-	, "int64*", w|h<<32, "uint", hdc, "int64*", 0, "uint", 0, "uint*", Alpha<<16|1<<24, "uint", 2)
-}
-
-;#####################################################################################
-
-; Function				BitBlt
-; Description			The BitBlt function performs a bit-block transfer of the color data corresponding to a rectangle 
-;						of pixels from the specified source device context into a destination device context.
-;
-; dDC					handle to destination DC
-; dx					x-coord of destination upper-left corner
-; dy					y-coord of destination upper-left corner
-; dw					width of the area to copy
-; dh					height of the area to copy
-; sDC					handle to source DC
-; sx					x-coordinate of source upper-left corner
-; sy					y-coordinate of source upper-left corner
-; Raster				raster operation code
-;
-; return				If the function succeeds, the return value is nonzero
-;
-; notes					If no raster operation is specified, then SRCCOPY is used, which copies the source directly to the destination rectangle
-;
-; BLACKNESS				= 0x00000042
-; NOTSRCERASE			= 0x001100A6
-; NOTSRCCOPY			= 0x00330008
-; SRCERASE				= 0x00440328
-; DSTINVERT				= 0x00550009
-; PATINVERT				= 0x005A0049
-; SRCINVERT				= 0x00660046
-; SRCAND				= 0x008800C6
-; MERGEPAINT			= 0x00BB0226
-; MERGECOPY				= 0x00C000CA
-; SRCCOPY				= 0x00CC0020
-; SRCPAINT				= 0x00EE0086
-; PATCOPY				= 0x00F00021
-; PATPAINT				= 0x00FB0A09
-; WHITENESS				= 0x00FF0062
-; CAPTUREBLT			= 0x40000000
-; NOMIRRORBITMAP		= 0x80000000
-
-BitBlt(ddc, dx, dy, dw, dh, sdc, sx, sy, Raster="")
-{
-	return DllCall("gdi32\BitBlt", "uint", dDC, "int", dx, "int", dy, "int", dw, "int", dh
-	, "uint", sDC, "int", sx, "int", sy, "uint", Raster ? Raster : 0x00CC0020)
-}
-
-;#####################################################################################
-
-; Function				StretchBlt
-; Description			The StretchBlt function copies a bitmap from a source rectangle into a destination rectangle, 
-;						stretching or compressing the bitmap to fit the dimensions of the destination rectangle, if necessary.
-;						The system stretches or compresses the bitmap according to the stretching mode currently set in the destination device context.
-;
-; ddc					handle to destination DC
-; dx					x-coord of destination upper-left corner
-; dy					y-coord of destination upper-left corner
-; dw					width of destination rectangle
-; dh					height of destination rectangle
-; sdc					handle to source DC
-; sx					x-coordinate of source upper-left corner
-; sy					y-coordinate of source upper-left corner
-; sw					width of source rectangle
-; sh					height of source rectangle
-; Raster				raster operation code
-;
-; return				If the function succeeds, the return value is nonzero
-;
-; notes					If no raster operation is specified, then SRCCOPY is used. It uses the same raster operations as BitBlt		
-
-StretchBlt(ddc, dx, dy, dw, dh, sdc, sx, sy, sw, sh, Raster="")
-{
-	return DllCall("gdi32\StretchBlt", "uint", ddc, "int", dx, "int", dy, "int", dw, "int", dh
-	, "uint", sdc, "int", sx, "int", sy, "int", sw, "int", sh, "uint", Raster ? Raster : 0x00CC0020)
-}
-
-;#####################################################################################
-
-; Function				SetStretchBltMode
-; Description			The SetStretchBltMode function sets the bitmap stretching mode in the specified device context
-;
-; hdc					handle to the DC
-; iStretchMode			The stretching mode, describing how the target will be stretched
-;
-; return				If the function succeeds, the return value is the previous stretching mode. If it fails it will return 0
-;
-; STRETCH_ANDSCANS 		= 0x01
-; STRETCH_ORSCANS 		= 0x02
-; STRETCH_DELETESCANS 	= 0x03
-; STRETCH_HALFTONE 		= 0x04
-
-SetStretchBltMode(hdc, iStretchMode=4)
-{
-	return DllCall("gdi32\SetStretchBltMode", "uint", hdc, "int", iStretchMode)
-}
-
-;#####################################################################################
-
-; Function				SetImage
-; Description			Associates a new image with a static control
-;
-; hwnd					handle of the control to update
-; hBitmap				a gdi bitmap to associate the static control with
-;
-; return				If the function succeeds, the return value is nonzero
-
-SetImage(hwnd, hBitmap)
-{
-	SendMessage, 0x172, 0x0, hBitmap,, ahk_id %hwnd%
-	E := ErrorLevel
-	DeleteObject(E)
-	return E
-}
-
-;#####################################################################################
-
-; Function				SetSysColorToControl
-; Description			Sets a solid colour to a control
-;
-; hwnd					handle of the control to update
-; SysColor				A system colour to set to the control
-;
-; return				If the function succeeds, the return value is zero
-;
-; notes					A control must have the 0xE style set to it so it is recognised as a bitmap
-;						By default SysColor=15 is used which is COLOR_3DFACE. This is the standard background for a control
-;
-; COLOR_3DDKSHADOW				= 21
-; COLOR_3DFACE					= 15
-; COLOR_3DHIGHLIGHT				= 20
-; COLOR_3DHILIGHT				= 20
-; COLOR_3DLIGHT					= 22
-; COLOR_3DSHADOW				= 16
-; COLOR_ACTIVEBORDER			= 10
-; COLOR_ACTIVECAPTION			= 2
-; COLOR_APPWORKSPACE			= 12
-; COLOR_BACKGROUND				= 1
-; COLOR_BTNFACE					= 15
-; COLOR_BTNHIGHLIGHT			= 20
-; COLOR_BTNHILIGHT				= 20
-; COLOR_BTNSHADOW				= 16
-; COLOR_BTNTEXT					= 18
-; COLOR_CAPTIONTEXT				= 9
-; COLOR_DESKTOP					= 1
-; COLOR_GRADIENTACTIVECAPTION	= 27
-; COLOR_GRADIENTINACTIVECAPTION	= 28
-; COLOR_GRAYTEXT				= 17
-; COLOR_HIGHLIGHT				= 13
-; COLOR_HIGHLIGHTTEXT			= 14
-; COLOR_HOTLIGHT				= 26
-; COLOR_INACTIVEBORDER			= 11
-; COLOR_INACTIVECAPTION			= 3
-; COLOR_INACTIVECAPTIONTEXT		= 19
-; COLOR_INFOBK					= 24
-; COLOR_INFOTEXT				= 23
-; COLOR_MENU					= 4
-; COLOR_MENUHILIGHT				= 29
-; COLOR_MENUBAR					= 30
-; COLOR_MENUTEXT				= 7
-; COLOR_SCROLLBAR				= 0
-; COLOR_WINDOW					= 5
-; COLOR_WINDOWFRAME				= 6
-; COLOR_WINDOWTEXT				= 8
-
-SetSysColorToControl(hwnd, SysColor=15)
-{
-   WinGetPos,,, w, h, ahk_id %hwnd%
-   bc := DllCall("GetSysColor", "Int", SysColor)
-   pBrushClear := Gdip_BrushCreateSolid(0xff000000 | (bc >> 16 | bc & 0xff00 | (bc & 0xff) << 16))
-   pBitmap := Gdip_CreateBitmap(w, h), G := Gdip_GraphicsFromImage(pBitmap)
-   Gdip_FillRectangle(G, pBrushClear, 0, 0, w, h)
-   hBitmap := Gdip_CreateHBITMAPFromBitmap(pBitmap)
-   SetImage(hwnd, hBitmap)
-   Gdip_DeleteBrush(pBrushClear)
-   Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmap), DeleteObject(hBitmap)
-   return 0
-}
-
-;#####################################################################################
-
-; Function				Gdip_BitmapFromScreen
-; Description			Gets a gdi+ bitmap from the screen
-;
-; Screen				0 = All screens
-;						Any numerical value = Just that screen
-;						x|y|w|h = Take specific coordinates with a width and height
-; Raster				raster operation code
-;
-; return      			If the function succeeds, the return value is a pointer to a gdi+ bitmap
-;						-1:		one or more of x,y,w,h not passed properly
-;
-; notes					If no raster operation is specified, then SRCCOPY is used to the returned bitmap
-
-Gdip_BitmapFromScreen(Screen=0, Raster="")
-{
-	if (Screen = 0)
-	{
-		Sysget, x, 76
-		Sysget, y, 77	
-		Sysget, w, 78
-		Sysget, h, 79
-	}
-	else if (SubStr(Screen, 1, 5) = "hwnd:")
-	{
-		Screen := SubStr(Screen, 6)
-		if !WinExist( "ahk_id " Screen)
-			return -2
-		WinGetPos,,, w, h, ahk_id %Screen%
-		x := y := 0
-		hhdc := GetDCEx(Screen, 3)
-	}
-	else if (Screen&1 != "")
-	{
-		Sysget, M, Monitor, %Screen%
-		x := MLeft, y := MTop, w := MRight-MLeft, h := MBottom-MTop
-	}
-	else
-	{
-		StringSplit, S, Screen, |
-		x := S1, y := S2, w := S3, h := S4
-	}
-
-	if (x = "") || (y = "") || (w = "") || (h = "")
-		return -1
-
-	chdc := CreateCompatibleDC(), hbm := CreateDIBSection(w, h, chdc), obm := SelectObject(chdc, hbm), hhdc := hhdc ? hhdc : GetDC()
-	BitBlt(chdc, 0, 0, w, h, hhdc, x, y, Raster)
-	ReleaseDC(hhdc)
-	
-	pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm)
-	SelectObject(chdc, obm), DeleteObject(hbm), DeleteDC(hhdc), DeleteDC(chdc)
-	return pBitmap
-}
-
-;#####################################################################################
-
-; Function				Gdip_BitmapFromHWND
-; Description			Uses PrintWindow to get a handle to the specified window and return a bitmap from it
-;
-; hwnd					handle to the window to get a bitmap from
-;
-; return				If the function succeeds, the return value is a pointer to a gdi+ bitmap
-;
-; notes					Window must not be not minimised in order to get a handle to it's client area
-
-Gdip_BitmapFromHWND(hwnd)
-{
-	WinGetPos,,, Width, Height, ahk_id %hwnd%
-	hbm := CreateDIBSection(Width, Height), hdc := CreateCompatibleDC(), obm := SelectObject(hdc, hbm)
-	PrintWindow(hwnd, hdc)
-	pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm)
-	SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
-	return pBitmap
-}
-
-;#####################################################################################
-
-; Function    			CreateRectF
-; Description			Creates a RectF object, containing a the coordinates and dimensions of a rectangle
-;
-; RectF       			Name to call the RectF object
-; x            			x-coordinate of the upper left corner of the rectangle
-; y            			y-coordinate of the upper left corner of the rectangle
-; w            			Width of the rectangle
-; h            			Height of the rectangle
-;
-; return      			No return value
-
-CreateRectF(ByRef RectF, x, y, w, h)
-{
-   VarSetCapacity(RectF, 16)
-   NumPut(x, RectF, 0, "float"), NumPut(y, RectF, 4, "float"), NumPut(w, RectF, 8, "float"), NumPut(h, RectF, 12, "float")
-}
-
-;#####################################################################################
-
-; Function    			CreateRect
-; Description			Creates a Rect object, containing a the coordinates and dimensions of a rectangle
-;
-; RectF       			Name to call the RectF object
-; x            			x-coordinate of the upper left corner of the rectangle
-; y            			y-coordinate of the upper left corner of the rectangle
-; w            			Width of the rectangle
-; h            			Height of the rectangle
-;
-; return      			No return value
-
-CreateRect(ByRef Rect, x, y, w, h)
-{
-	VarSetCapacity(Rect, 16)
-	NumPut(x, Rect, 0, "uint"), NumPut(y, Rect, 4, "uint"), NumPut(w, Rect, 8, "uint"), NumPut(h, Rect, 12, "uint")
-}
-;#####################################################################################
-
-; Function		    	CreateSizeF
-; Description			Creates a SizeF object, containing an 2 values
-;
-; SizeF         		Name to call the SizeF object
-; w            			w-value for the SizeF object
-; h            			h-value for the SizeF object
-;
-; return      			No Return value
-
-CreateSizeF(ByRef SizeF, w, h)
-{
-   VarSetCapacity(SizeF, 8)
-   NumPut(w, SizeF, 0, "float"), NumPut(h, SizeF, 4, "float")     
-}
-;#####################################################################################
-
-; Function		    	CreatePointF
-; Description			Creates a SizeF object, containing an 2 values
-;
-; SizeF         		Name to call the SizeF object
-; w            			w-value for the SizeF object
-; h            			h-value for the SizeF object
-;
-; return      			No Return value
-
-CreatePointF(ByRef PointF, x, y)
-{
-   VarSetCapacity(PointF, 8)
-   NumPut(x, PointF, 0, "float"), NumPut(y, PointF, 4, "float")     
-}
-;#####################################################################################
-
-; Function				CreateDIBSection
-; Description			The CreateDIBSection function creates a DIB (Device Independent Bitmap) that applications can write to directly
-;
-; w						width of the bitmap to create
-; h						height of the bitmap to create
-; hdc					a handle to the device context to use the palette from
-; bpp					bits per pixel (32 = ARGB)
-; ppvBits				A pointer to a variable that receives a pointer to the location of the DIB bit values
-;
-; return				returns a DIB. A gdi bitmap
-;
-; notes					ppvBits will receive the location of the pixels in the DIB
-
-CreateDIBSection(w, h, hdc="", bpp=32, ByRef ppvBits=0)
-{
-	hdc2 := hdc ? hdc : GetDC()
-	VarSetCapacity(bi, 40, 0)
-	NumPut(w, bi, 4), NumPut(h, bi, 8), NumPut(40, bi, 0), NumPut(1, bi, 12, "ushort"), NumPut(0, bi, 16), NumPut(bpp, bi, 14, "ushort")
-	hbm := DllCall("CreateDIBSection", "uint" , hdc2, "uint" , &bi, "uint" , 0, "uint*", ppvBits, "uint" , 0, "uint" , 0)
-
-	if !hdc
-		ReleaseDC(hdc2)
-	return hbm
-}
-
-;#####################################################################################
-
-; Function				PrintWindow
-; Description			The PrintWindow function copies a visual window into the specified device context (DC), typically a printer DC
-;
-; hwnd					A handle to the window that will be copied
-; hdc					A handle to the device context
-; Flags					Drawing options
-;
-; return				If the function succeeds, it returns a nonzero value
-;
-; PW_CLIENTONLY			= 1
-
-PrintWindow(hwnd, hdc, Flags=0)
-{
-	return DllCall("PrintWindow", "uint", hwnd, "uint", hdc, "uint", Flags)
-}
-
-;#####################################################################################
-
-; Function				DestroyIcon
-; Description			Destroys an icon and frees any memory the icon occupied
-;
-; hIcon					Handle to the icon to be destroyed. The icon must not be in use
-;
-; return				If the function succeeds, the return value is nonzero
-
-DestroyIcon(hIcon)
-{
-   return DllCall("DestroyIcon", "uint", hIcon)
-}
-
-;#####################################################################################
-
-PaintDesktop(hdc)
-{
-	return DllCall("PaintDesktop", "uint", hdc)
-}
-
-;#####################################################################################
-
-CreateCompatibleBitmap(hdc, w, h)
-{
-	return DllCall("gdi32\CreateCompatibleBitmap", "uint", hdc, "int", w, "int", h)
-}
-
-;#####################################################################################
-
-; Function				CreateCompatibleDC
-; Description			This function creates a memory device context (DC) compatible with the specified device
-;
-; hdc					Handle to an existing device context					
-;
-; return				returns the handle to a device context or 0 on failure
-;
-; notes					If this handle is 0 (by default), the function creates a memory device context compatible with the application's current screen
-
-CreateCompatibleDC(hdc=0)
-{
-   return DllCall("CreateCompatibleDC", "uint", hdc)
-}
-
-;#####################################################################################
-
-; Function				SelectObject
-; Description			The SelectObject function selects an object into the specified device context (DC). The new object replaces the previous object of the same type
-;
-; hdc					Handle to a DC
-; hgdiobj				A handle to the object to be selected into the DC
-;
-; return				If the selected object is not a region and the function succeeds, the return value is a handle to the object being replaced
-;
-; notes					The specified object must have been created by using one of the following functions
-;						Bitmap - CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDIBSection (A single bitmap cannot be selected into more than one DC at the same time)
-;						Brush - CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush
-;						Font - CreateFont, CreateFontIndirect
-;						Pen - CreatePen, CreatePenIndirect
-;						Region - CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect
-;
-; notes					If the selected object is a region and the function succeeds, the return value is one of the following value
-;
-; SIMPLEREGION			= 2 Region consists of a single rectangle
-; COMPLEXREGION			= 3 Region consists of more than one rectangle
-; NULLREGION			= 1 Region is empty
-
-SelectObject(hdc, hgdiobj)
-{
-   return DllCall("SelectObject", "uint", hdc, "uint", hgdiobj)
-}
-
-;#####################################################################################
-
-; Function				DeleteObject
-; Description			This function deletes a logical pen, brush, font, bitmap, region, or palette, freeing all system resources associated with the object
-;						After the object is deleted, the specified handle is no longer valid
-;
-; hObject				Handle to a logical pen, brush, font, bitmap, region, or palette to delete
-;
-; return				Nonzero indicates success. Zero indicates that the specified handle is not valid or that the handle is currently selected into a device context
-
-DeleteObject(hObject)
-{
-   return DllCall("DeleteObject", "uint", hObject)
-}
-
-;#####################################################################################
-
-; Function				GetDC
-; Description			This function retrieves a handle to a display device context (DC) for the client area of the specified window.
-;						The display device context can be used in subsequent graphics display interface (GDI) functions to draw in the client area of the window. 
-;
-; hwnd					Handle to the window whose device context is to be retrieved. If this value is NULL, GetDC retrieves the device context for the entire screen					
-;
-; return				The handle the device context for the specified window's client area indicates success. NULL indicates failure
-
-GetDC(hwnd=0)
-{
-	return DllCall("GetDC", "uint", hwnd)
-}
-
-;#####################################################################################
-
-; DCX_CACHE = 0x2
-; DCX_CLIPCHILDREN = 0x8
-; DCX_CLIPSIBLINGS = 0x10
-; DCX_EXCLUDERGN = 0x40
-; DCX_EXCLUDEUPDATE = 0x100
-; DCX_INTERSECTRGN = 0x80
-; DCX_INTERSECTUPDATE = 0x200
-; DCX_LOCKWINDOWUPDATE = 0x400
-; DCX_NORECOMPUTE = 0x100000
-; DCX_NORESETATTRS = 0x4
-; DCX_PARENTCLIP = 0x20
-; DCX_VALIDATE = 0x200000
-; DCX_WINDOW = 0x1
-
-GetDCEx(hwnd, flags=0, hrgnClip=0)
-{
-    return DllCall("GetDCEx", "uint", hwnd, "uint", hrgnClip, "int", flags)
-}
-
-;#####################################################################################
-
-; Function				ReleaseDC
-; Description			This function releases a device context (DC), freeing it for use by other applications. The effect of ReleaseDC depends on the type of device context
-;
-; hdc					Handle to the device context to be released
-; hwnd					Handle to the window whose device context is to be released
-;
-; return				1 = released
-;						0 = not released
-;
-; notes					The application must call the ReleaseDC function for each call to the GetWindowDC function and for each call to the GetDC function that retrieves a common device context
-;						An application cannot use the ReleaseDC function to release a device context that was created by calling the CreateDC function; instead, it must use the DeleteDC function. 
-
-ReleaseDC(hdc, hwnd=0)
-{
-   return DllCall("ReleaseDC", "uint", hwnd, "uint", hdc)
-}
-
-;#####################################################################################
-
-; Function				DeleteDC
-; Description			The DeleteDC function deletes the specified device context (DC)
-;
-; hdc					A handle to the device context
-;
-; return				If the function succeeds, the return value is nonzero
-;
-; notes					An application must not delete a DC whose handle was obtained by calling the GetDC function. Instead, it must call the ReleaseDC function to free the DC
-
-DeleteDC(hdc)
-{
-   return DllCall("DeleteDC", "uint", hdc)
-}
-;#####################################################################################
-
-; Function				Gdip_LibraryVersion
-; Description			Get the current library version
-;
-; return				the library version
-;
-; notes					This is useful for non compiled programs to ensure that a person doesn't run an old version when testing your scripts
-
-Gdip_LibraryVersion()
-{
-	return 1.45
-}
-
-;#####################################################################################
-
-; Function:    			Gdip_BitmapFromBRA
-; Description: 			Gets a pointer to a gdi+ bitmap from a BRA file
-;
-; BRAFromMemIn			The variable for a BRA file read to memory
-; File					The name of the file, or its number that you would like (This depends on alternate parameter)
-; Alternate				Changes whether the File parameter is the file name or its number
-;
-; return      			If the function succeeds, the return value is a pointer to a gdi+ bitmap
-;						-1 = The BRA variable is empty
-;						-2 = The BRA has an incorrect header
-;						-3 = The BRA has information missing
-;						-4 = Could not find file inside the BRA
-
-Gdip_BitmapFromBRA(ByRef BRAFromMemIn, File, Alternate=0)
-{
-	if !BRAFromMemIn
-		return -1
-	Loop, Parse, BRAFromMemIn, `n
-	{
-		if (A_Index = 1)
-		{
-			StringSplit, Header, A_LoopField, |
-			if (Header0 != 4 || Header2 != "BRA!")
-				return -2
-		}
-		else if (A_Index = 2)
-		{
-			StringSplit, Info, A_LoopField, |
-			if (Info0 != 3)
-				return -3
-		}
-		else
-			break
-	}
-	if !Alternate
-		StringReplace, File, File, \, \\, All
-	RegExMatch(BRAFromMemIn, "mi`n)^" (Alternate ? File "\|.+?\|(\d+)\|(\d+)" : "\d+\|" File "\|(\d+)\|(\d+)") "$", FileInfo)
-	if !FileInfo
-		return -4
-
-	hData := DllCall("GlobalAlloc", "uint", 2, "uint", FileInfo2)
-	pData := DllCall("GlobalLock", "uint", hData)
-	DllCall("RtlMoveMemory", "uint", pData, "uint", &BRAFromMemIn+Info2+FileInfo1, "uint", FileInfo2)
-	DllCall("GlobalUnlock", "uint", hData)
-	DllCall("ole32\CreateStreamOnHGlobal", "uint", hData, "int", 1, "uint*", pStream)
-	DllCall("gdiplus\GdipCreateBitmapFromStream", "uint", pStream, "uint*", pBitmap)
-	DllCall(NumGet(NumGet(1*pStream)+8), "uint", pStream)
-	return pBitmap
-}
-
-;#####################################################################################
-
-; Function				Gdip_DrawRectangle
-; Description			This function uses a pen to draw the outline of a rectangle into the Graphics of a bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pPen					Pointer to a pen
-; x						x-coordinate of the top left of the rectangle
-; y						y-coordinate of the top left of the rectangle
-; w						width of the rectanlge
-; h						height of the rectangle
-;
-; return				status enumeration. 0 = success
-;
-; notes					as all coordinates are taken from the top left of each pixel, then the entire width/height should be specified as subtracting the pen width
-
-Gdip_DrawRectangle(pGraphics, pPen, x, y, w, h)
-{
-   return DllCall("gdiplus\GdipDrawRectangle", "uint", pGraphics, "uint", pPen, "float", x, "float", y, "float", w, "float", h)
-}
-
-;#####################################################################################
-
-; Function				Gdip_DrawRoundedRectangle
-; Description			This function uses a pen to draw the outline of a rounded rectangle into the Graphics of a bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pPen					Pointer to a pen
-; x						x-coordinate of the top left of the rounded rectangle
-; y						y-coordinate of the top left of the rounded rectangle
-; w						width of the rectanlge
-; h						height of the rectangle
-; r						radius of the rounded corners
-;
-; return				status enumeration. 0 = success
-;
-; notes					as all coordinates are taken from the top left of each pixel, then the entire width/height should be specified as subtracting the pen width
-
-Gdip_DrawRoundedRectangle(pGraphics, pPen, x, y, w, h, r)
-{
-	Gdip_SetClipRect(pGraphics, x-r, y-r, 2*r, 2*r, 4)
-	Gdip_SetClipRect(pGraphics, x+w-r, y-r, 2*r, 2*r, 4)
-	Gdip_SetClipRect(pGraphics, x-r, y+h-r, 2*r, 2*r, 4)
-	Gdip_SetClipRect(pGraphics, x+w-r, y+h-r, 2*r, 2*r, 4)
-	E := Gdip_DrawRectangle(pGraphics, pPen, x, y, w, h)
-	Gdip_ResetClip(pGraphics)
-	Gdip_SetClipRect(pGraphics, x-(2*r), y+r, w+(4*r), h-(2*r), 4)
-	Gdip_SetClipRect(pGraphics, x+r, y-(2*r), w-(2*r), h+(4*r), 4)
-	Gdip_DrawEllipse(pGraphics, pPen, x, y, 2*r, 2*r)
-	Gdip_DrawEllipse(pGraphics, pPen, x+w-(2*r), y, 2*r, 2*r)
-	Gdip_DrawEllipse(pGraphics, pPen, x, y+h-(2*r), 2*r, 2*r)
-	Gdip_DrawEllipse(pGraphics, pPen, x+w-(2*r), y+h-(2*r), 2*r, 2*r)
-	Gdip_ResetClip(pGraphics)
-	return E
-}
-
-;#####################################################################################
-
-; Function				Gdip_DrawEllipse
-; Description			This function uses a pen to draw the outline of an ellipse into the Graphics of a bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pPen					Pointer to a pen
-; x						x-coordinate of the top left of the rectangle the ellipse will be drawn into
-; y						y-coordinate of the top left of the rectangle the ellipse will be drawn into
-; w						width of the ellipse
-; h						height of the ellipse
-;
-; return				status enumeration. 0 = success
-;
-; notes					as all coordinates are taken from the top left of each pixel, then the entire width/height should be specified as subtracting the pen width
-
-Gdip_DrawEllipse(pGraphics, pPen, x, y, w, h)
-{
-   return DllCall("gdiplus\GdipDrawEllipse", "uint", pGraphics, "uint", pPen, "float", x, "float", y, "float", w, "float", h)
-}
-
-;#####################################################################################
-
-; Function				Gdip_DrawBezier
-; Description			This function uses a pen to draw the outline of a bezier (a weighted curve) into the Graphics of a bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pPen					Pointer to a pen
-; x1					x-coordinate of the start of the bezier
-; y1					y-coordinate of the start of the bezier
-; x2					x-coordinate of the first arc of the bezier
-; y2					y-coordinate of the first arc of the bezier
-; x3					x-coordinate of the second arc of the bezier
-; y3					y-coordinate of the second arc of the bezier
-; x4					x-coordinate of the end of the bezier
-; y4					y-coordinate of the end of the bezier
-;
-; return				status enumeration. 0 = success
-;
-; notes					as all coordinates are taken from the top left of each pixel, then the entire width/height should be specified as subtracting the pen width
-
-Gdip_DrawBezier(pGraphics, pPen, x1, y1, x2, y2, x3, y3, x4, y4)
-{
-   return DllCall("gdiplus\GdipDrawBezier", "uint", pgraphics, "uint", pPen
-   , "float", x1, "float", y1, "float", x2, "float", y2
-   , "float", x3, "float", y3, "float", x4, "float", y4)
-}
-
-;#####################################################################################
-
-; Function				Gdip_DrawArc
-; Description			This function uses a pen to draw the outline of an arc into the Graphics of a bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pPen					Pointer to a pen
-; x						x-coordinate of the start of the arc
-; y						y-coordinate of the start of the arc
-; w						width of the arc
-; h						height of the arc
-; StartAngle			specifies the angle between the x-axis and the starting point of the arc
-; SweepAngle			specifies the angle between the starting and ending points of the arc
-;
-; return				status enumeration. 0 = success
-;
-; notes					as all coordinates are taken from the top left of each pixel, then the entire width/height should be specified as subtracting the pen width
-
-Gdip_DrawArc(pGraphics, pPen, x, y, w, h, StartAngle, SweepAngle)
-{
-   return DllCall("gdiplus\GdipDrawArc", "uint", pGraphics, "uint", pPen, "float", x
-   , "float", y, "float", w, "float", h, "float", StartAngle, "float", SweepAngle)
-}
-
-;#####################################################################################
-
-; Function				Gdip_DrawPie
-; Description			This function uses a pen to draw the outline of a pie into the Graphics of a bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pPen					Pointer to a pen
-; x						x-coordinate of the start of the pie
-; y						y-coordinate of the start of the pie
-; w						width of the pie
-; h						height of the pie
-; StartAngle			specifies the angle between the x-axis and the starting point of the pie
-; SweepAngle			specifies the angle between the starting and ending points of the pie
-;
-; return				status enumeration. 0 = success
-;
-; notes					as all coordinates are taken from the top left of each pixel, then the entire width/height should be specified as subtracting the pen width
-
-Gdip_DrawPie(pGraphics, pPen, x, y, w, h, StartAngle, SweepAngle)
-{
-   return DllCall("gdiplus\GdipDrawPie", "uint", pGraphics, "uint", pPen, "float", x, "float", y, "float", w, "float", h, "float", StartAngle, "float", SweepAngle)
-}
-
-;#####################################################################################
-
-; Function				Gdip_DrawLine
-; Description			This function uses a pen to draw a line into the Graphics of a bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pPen					Pointer to a pen
-; x1					x-coordinate of the start of the line
-; y1					y-coordinate of the start of the line
-; x2					x-coordinate of the end of the line
-; y2					y-coordinate of the end of the line
-;
-; return				status enumeration. 0 = success		
-
-Gdip_DrawLine(pGraphics, pPen, x1, y1, x2, y2)
-{
-   return DllCall("gdiplus\GdipDrawLine", "uint", pGraphics, "uint", pPen
-   , "float", x1, "float", y1, "float", x2, "float", y2)
-}
-
-;#####################################################################################
-
-; Function				Gdip_DrawLines
-; Description			This function uses a pen to draw a series of joined lines into the Graphics of a bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pPen					Pointer to a pen
-; Points				the coordinates of all the points passed as x1,y1|x2,y2|x3,y3.....
-;
-; return				status enumeration. 0 = success				
-
-Gdip_DrawLines(pGraphics, pPen, Points)
-{
-   StringSplit, Points, Points, |
-   VarSetCapacity(PointF, 8*Points0)   
-   Loop, %Points0%
-   {
-      StringSplit, Coord, Points%A_Index%, `,
-      NumPut(Coord1, PointF, 8*(A_Index-1), "float"), NumPut(Coord2, PointF, (8*(A_Index-1))+4, "float")
-   }
-   return DllCall("gdiplus\GdipDrawLines", "uint", pGraphics, "uint", pPen, "uint", &PointF, "int", Points0)
-}
-
-;#####################################################################################
-
-; Function				Gdip_FillRectangle
-; Description			This function uses a brush to fill a rectangle in the Graphics of a bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pBrush				Pointer to a brush
-; x						x-coordinate of the top left of the rectangle
-; y						y-coordinate of the top left of the rectangle
-; w						width of the rectanlge
-; h						height of the rectangle
-;
-; return				status enumeration. 0 = success
-
-Gdip_FillRectangle(pGraphics, pBrush, x, y, w, h)
-{
-   return DllCall("gdiplus\GdipFillRectangle", "uint", pGraphics, "int", pBrush
-   , "float", x, "float", y, "float", w, "float", h)
-}
-
-;#####################################################################################
-
-; Function				Gdip_FillRoundedRectangle
-; Description			This function uses a brush to fill a rounded rectangle in the Graphics of a bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pBrush				Pointer to a brush
-; x						x-coordinate of the top left of the rounded rectangle
-; y						y-coordinate of the top left of the rounded rectangle
-; w						width of the rectanlge
-; h						height of the rectangle
-; r						radius of the rounded corners
-;
-; return				status enumeration. 0 = success
-
-Gdip_FillRoundedRectangle(pGraphics, pBrush, x, y, w, h, r)
-{
-	Region := Gdip_GetClipRegion(pGraphics)
-	Gdip_SetClipRect(pGraphics, x-r, y-r, 2*r, 2*r, 4)
-	Gdip_SetClipRect(pGraphics, x+w-r, y-r, 2*r, 2*r, 4)
-	Gdip_SetClipRect(pGraphics, x-r, y+h-r, 2*r, 2*r, 4)
-	Gdip_SetClipRect(pGraphics, x+w-r, y+h-r, 2*r, 2*r, 4)
-	E := Gdip_FillRectangle(pGraphics, pBrush, x, y, w, h)
-	Gdip_SetClipRegion(pGraphics, Region, 0)
-	Gdip_SetClipRect(pGraphics, x-(2*r), y+r, w+(4*r), h-(2*r), 4)
-	Gdip_SetClipRect(pGraphics, x+r, y-(2*r), w-(2*r), h+(4*r), 4)
-	Gdip_FillEllipse(pGraphics, pBrush, x, y, 2*r, 2*r)
-	Gdip_FillEllipse(pGraphics, pBrush, x+w-(2*r), y, 2*r, 2*r)
-	Gdip_FillEllipse(pGraphics, pBrush, x, y+h-(2*r), 2*r, 2*r)
-	Gdip_FillEllipse(pGraphics, pBrush, x+w-(2*r), y+h-(2*r), 2*r, 2*r)
-	Gdip_SetClipRegion(pGraphics, Region, 0)
-	Gdip_DeleteRegion(Region)
-	return E
-}
-
-;#####################################################################################
-
-; Function				Gdip_FillPolygon
-; Description			This function uses a brush to fill a polygon in the Graphics of a bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pBrush				Pointer to a brush
-; Points				the coordinates of all the points passed as x1,y1|x2,y2|x3,y3.....
-;
-; return				status enumeration. 0 = success
-;
-; notes					Alternate will fill the polygon as a whole, wheras winding will fill each new "segment"
-; Alternate 			= 0
-; Winding 				= 1
-
-Gdip_FillPolygon(pGraphics, pBrush, Points, FillMode=0)
-{
-   StringSplit, Points, Points, |
-   VarSetCapacity(PointF, 8*Points0)   
-   Loop, %Points0%
-   {
-      StringSplit, Coord, Points%A_Index%, `,
-      NumPut(Coord1, PointF, 8*(A_Index-1), "float"), NumPut(Coord2, PointF, (8*(A_Index-1))+4, "float")
-   }   
-   return DllCall("gdiplus\GdipFillPolygon", "uint", pGraphics, "uint", pBrush, "uint", &PointF, "int", Points0, "int", FillMode)
-}
-
-;#####################################################################################
-
-; Function				Gdip_FillPie
-; Description			This function uses a brush to fill a pie in the Graphics of a bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pBrush				Pointer to a brush
-; x						x-coordinate of the top left of the pie
-; y						y-coordinate of the top left of the pie
-; w						width of the pie
-; h						height of the pie
-; StartAngle			specifies the angle between the x-axis and the starting point of the pie
-; SweepAngle			specifies the angle between the starting and ending points of the pie
-;
-; return				status enumeration. 0 = success
-
-Gdip_FillPie(pGraphics, pBrush, x, y, w, h, StartAngle, SweepAngle)
-{
-   return DllCall("gdiplus\GdipFillPie", "uint", pGraphics, "uint", pBrush
-   , "float", x, "float", y, "float", w, "float", h, "float", StartAngle, "float", SweepAngle)
-}
-
-;#####################################################################################
-
-; Function				Gdip_FillEllipse
-; Description			This function uses a brush to fill an ellipse in the Graphics of a bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pBrush				Pointer to a brush
-; x						x-coordinate of the top left of the ellipse
-; y						y-coordinate of the top left of the ellipse
-; w						width of the ellipse
-; h						height of the ellipse
-;
-; return				status enumeration. 0 = success
-
-Gdip_FillEllipse(pGraphics, pBrush, x, y, w, h)
-{
-	return DllCall("gdiplus\GdipFillEllipse", "uint", pGraphics, "uint", pBrush, "float", x, "float", y, "float", w, "float", h)
-}
-
-;#####################################################################################
-
-; Function				Gdip_FillRegion
-; Description			This function uses a brush to fill a region in the Graphics of a bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pBrush				Pointer to a brush
-; Region				Pointer to a Region
-;
-; return				status enumeration. 0 = success
-;
-; notes					You can create a region Gdip_CreateRegion() and then add to this
-
-Gdip_FillRegion(pGraphics, pBrush, Region)
-{
-	return DllCall("gdiplus\GdipFillRegion", "uint", pGraphics, "uint", pBrush, "uint", Region)
-}
-
-;#####################################################################################
-
-; Function				Gdip_FillPath
-; Description			This function uses a brush to fill a path in the Graphics of a bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pBrush				Pointer to a brush
-; Region				Pointer to a Path
-;
-; return				status enumeration. 0 = success
-
-Gdip_FillPath(pGraphics, pBrush, Path)
-{
-	return DllCall("gdiplus\GdipFillPath", "uint", pGraphics, "uint", pBrush, "uint", Path)
-}
-
-;#####################################################################################
-
-; Function				Gdip_DrawImagePointsRect
-; Description			This function draws a bitmap into the Graphics of another bitmap and skews it
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pBitmap				Pointer to a bitmap to be drawn
-; Points				Points passed as x1,y1|x2,y2|x3,y3 (3 points: top left, top right, bottom left) describing the drawing of the bitmap
-; sx					x-coordinate of source upper-left corner
-; sy					y-coordinate of source upper-left corner
-; sw					width of source rectangle
-; sh					height of source rectangle
-; Matrix				a matrix used to alter image attributes when drawing
-;
-; return				status enumeration. 0 = success
-;
-; notes					if sx,sy,sw,sh are missed then the entire source bitmap will be used
-;						Matrix can be omitted to just draw with no alteration to ARGB
-;						Matrix may be passed as a digit from 0 - 1 to change just transparency
-;						Matrix can be passed as a matrix with any delimiter
-
-Gdip_DrawImagePointsRect(pGraphics, pBitmap, Points, sx="", sy="", sw="", sh="", Matrix=1)
-{
-	StringSplit, Points, Points, |
-	VarSetCapacity(PointF, 8*Points0)   
-	Loop, %Points0%
-	{
-		StringSplit, Coord, Points%A_Index%, `,
-		NumPut(Coord1, PointF, 8*(A_Index-1), "float"), NumPut(Coord2, PointF, (8*(A_Index-1))+4, "float")
-	}
-
-	if (Matrix&1 = "")
-		ImageAttr := Gdip_SetImageAttributesColorMatrix(Matrix)
-	else if (Matrix != 1)
-		ImageAttr := Gdip_SetImageAttributesColorMatrix("1|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|" Matrix "|0|0|0|0|0|1")
-		
-	if (sx = "" && sy = "" && sw = "" && sh = "")
-	{
-		sx := 0, sy := 0
-		sw := Gdip_GetImageWidth(pBitmap)
-		sh := Gdip_GetImageHeight(pBitmap)
-	}
-
-	E := DllCall("gdiplus\GdipDrawImagePointsRect", "uint", pGraphics, "uint", pBitmap
-	, "uint", &PointF, "int", Points0, "float", sx, "float", sy, "float", sw, "float", sh
-	, "int", 2, "uint", ImageAttr, "uint", 0, "uint", 0)
-	if ImageAttr
-		Gdip_DisposeImageAttributes(ImageAttr)
-	return E
-}
-
-;#####################################################################################
-
-; Function				Gdip_DrawImage
-; Description			This function draws a bitmap into the Graphics of another bitmap
-;
-; pGraphics				Pointer to the Graphics of a bitmap
-; pBitmap				Pointer to a bitmap to be drawn
-; dx					x-coord of destination upper-left corner
-; dy					y-coord of destination upper-left corner
-; dw					width of destination image
-; dh					height of destination image
-; sx					x-coordinate of source upper-left corner
-; sy					y-coordinate of source upper-left corner
-; sw					width of source image
-; sh					height of source image
-; Matrix				a matrix used to alter image attributes when drawing
-;
-; return				status enumeration. 0 = success
-;
-; notes					if sx,sy,sw,sh are missed then the entire source bitmap will be used
-;						Gdip_DrawImage performs faster
-;						Matrix can be omitted to just draw with no alteration to ARGB
-;						Matrix may be passed as a digit from 0 - 1 to change just transparency
-;						Matrix can be passed as a matrix with any delimiter. For example:
-;						MatrixBright=
-;						(
-;						1.5		|0		|0		|0		|0
-;						0		|1.5	|0		|0		|0
-;						0		|0		|1.5	|0		|0
-;						0		|0		|0		|1		|0
-;						0.05	|0.05	|0.05	|0		|1
-;						)
-;
-; notes					MatrixBright = 1.5|0|0|0|0|0|1.5|0|0|0|0|0|1.5|0|0|0|0|0|1|0|0.05|0.05|0.05|0|1
-;						MatrixGreyScale = 0.299|0.299|0.299|0|0|0.587|0.587|0.587|0|0|0.114|0.114|0.114|0|0|0|0|0|1|0|0|0|0|0|1
-;						MatrixNegative = -1|0|0|0|0|0|-1|0|0|0|0|0|-1|0|0|0|0|0|1|0|0|0|0|0|1
-
-Gdip_DrawImage(pGraphics, pBitmap, dx="", dy="", dw="", dh="", sx="", sy="", sw="", sh="", Matrix=1)
-{
-	if (Matrix&1 = "")
-		ImageAttr := Gdip_SetImageAttributesColorMatrix(Matrix)
-	else if (Matrix != 1)
-		ImageAttr := Gdip_SetImageAttributesColorMatrix("1|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|" Matrix "|0|0|0|0|0|1")
-
-	if (sx = "" && sy = "" && sw = "" && sh = "")
-	{
-		if (dx = "" && dy = "" && dw = "" && dh = "")
-		{
-			sx := dx := 0, sy := dy := 0
-			sw := dw := Gdip_GetImageWidth(pBitmap)
-			sh := dh := Gdip_GetImageHeight(pBitmap)
-		}
-		else
-		{
-			sx := sy := 0
-			sw := Gdip_GetImageWidth(pBitmap)
-			sh := Gdip_GetImageHeight(pBitmap)
-		}
-	}
-
-	E := DllCall("gdiplus\GdipDrawImageRectRect", "uint", pGraphics, "uint", pBitmap
-	, "float", dx, "float", dy, "float", dw, "float", dh
-	, "float", sx, "float", sy, "float", sw, "float", sh
-	, "int", 2, "uint", ImageAttr, "uint", 0, "uint", 0)
-	if ImageAttr
-		Gdip_DisposeImageAttributes(ImageAttr)
-	return E
-}
-
-;#####################################################################################
-
-; Function				Gdip_SetImageAttributesColorMatrix
-; Description			This function creates an image matrix ready for drawing
-;
-; Matrix				a matrix used to alter image attributes when drawing
-;						passed with any delimeter
-;
-; return				returns an image matrix on sucess or 0 if it fails
-;
-; notes					MatrixBright = 1.5|0|0|0|0|0|1.5|0|0|0|0|0|1.5|0|0|0|0|0|1|0|0.05|0.05|0.05|0|1
-;						MatrixGreyScale = 0.299|0.299|0.299|0|0|0.587|0.587|0.587|0|0|0.114|0.114|0.114|0|0|0|0|0|1|0|0|0|0|0|1
-;						MatrixNegative = -1|0|0|0|0|0|-1|0|0|0|0|0|-1|0|0|0|0|0|1|0|0|0|0|0|1
-
-Gdip_SetImageAttributesColorMatrix(Matrix)
-{
-	VarSetCapacity(ColourMatrix, 100, 0)
-	Matrix := RegExReplace(RegExReplace(Matrix, "^[^\d-\.]+([\d\.])", "$1", "", 1), "[^\d-\.]+", "|")
-	StringSplit, Matrix, Matrix, |
-	Loop, 25
-	{
-		Matrix := (Matrix%A_Index% != "") ? Matrix%A_Index% : Mod(A_Index-1, 6) ? 0 : 1
-		NumPut(Matrix, ColourMatrix, (A_Index-1)*4, "float")
-	}
-	DllCall("gdiplus\GdipCreateImageAttributes", "uint*", ImageAttr)
-	DllCall("gdiplus\GdipSetImageAttributesColorMatrix", "uint", ImageAttr, "int", 1, "int", 1, "uint", &ColourMatrix, "int", 0, "int", 0)
-	return ImageAttr
-}
-
-;#####################################################################################
-
-; Function				Gdip_GraphicsFromImage
-; Description			This function gets the graphics for a bitmap used for drawing functions
-;
-; pBitmap				Pointer to a bitmap to get the pointer to its graphics
-;
-; return				returns a pointer to the graphics of a bitmap
-;
-; notes					a bitmap can be drawn into the graphics of another bitmap
-
-Gdip_GraphicsFromImage(pBitmap)
-{
-    DllCall("gdiplus\GdipGetImageGraphicsContext", "uint", pBitmap, "uint*", pGraphics)
-    return pGraphics
-}
-
-;#####################################################################################
-
-; Function				Gdip_GraphicsFromHDC
-; Description			This function gets the graphics from the handle to a device context
-;
-; hdc					This is the handle to the device context
-;
-; return				returns a pointer to the graphics of a bitmap
-;
-; notes					You can draw a bitmap into the graphics of another bitmap
-
-Gdip_GraphicsFromHDC(hdc)
-{
-    DllCall("gdiplus\GdipCreateFromHDC", "uint", hdc, "uint*", pGraphics)
-    return pGraphics
-}
-
-;#####################################################################################
-
-; Function				Gdip_GetDC
-; Description			This function gets the device context of the passed Graphics
-;
-; hdc					This is the handle to the device context
-;
-; return				returns the device context for the graphics of a bitmap
-
-Gdip_GetDC(pGraphics)
-{
-	DllCall("gdiplus\GdipGetDC", "uint", pGraphics, "uint*", hdc)
-	return hdc
-}
-
-;#####################################################################################
-
-; Function				Gdip_ReleaseDC
-; Description			This function releases a device context from use for further use
-;
-; pGraphics				Pointer to the graphics of a bitmap
-; hdc					This is the handle to the device context
-;
-; return				status enumeration. 0 = success
-
-Gdip_ReleaseDC(pGraphics, hdc)
-{
-	return DllCall("gdiplus\GdipReleaseDC", "uint", pGraphics, "uint", hdc)
-}
-
-;#####################################################################################
-
-; Function				Gdip_GraphicsClear
-; Description			Clears the graphics of a bitmap ready for further drawing
-;
-; pGraphics				Pointer to the graphics of a bitmap
-; ARGB					The colour to clear the graphics to
-;
-; return				status enumeration. 0 = success
-;
-; notes					By default this will make the background invisible
-;						Using clipping regions you can clear a particular area on the graphics rather than clearing the entire graphics
-
-Gdip_GraphicsClear(pGraphics, ARGB=0x00ffffff)
-{
-    return DllCall("gdiplus\GdipGraphicsClear", "uint", pGraphics, "int", ARGB)
-}
-
-;#####################################################################################
-
-; Function				Gdip_BlurBitmap
-; Description			Gives a pointer to a blurred bitmap from a pointer to a bitmap
-;
-; pBitmap				Pointer to a bitmap to be blurred
-; Blur					The Amount to blur a bitmap by from 1 (least blur) to 100 (most blur)
-;
-; return				If the function succeeds, the return value is a pointer to the new blurred bitmap
-;						-1 = The blur parameter is outside the range 1-100
-;
-; notes					This function will not dispose of the original bitmap
-
-Gdip_BlurBitmap(pBitmap, Blur)
-{
-	if (Blur > 100) || (Blur < 1)
-		return -1	
-	
-	sWidth := Gdip_GetImageWidth(pBitmap), sHeight := Gdip_GetImageHeight(pBitmap)
-	dWidth := sWidth//Blur, dHeight := sHeight//Blur
-
-	pBitmap1 := Gdip_CreateBitmap(dWidth, dHeight)
-	G1 := Gdip_GraphicsFromImage(pBitmap1)
-	Gdip_SetInterpolationMode(G1, 7)
-	Gdip_DrawImage(G1, pBitmap, 0, 0, dWidth, dHeight, 0, 0, sWidth, sHeight)
-
-	Gdip_DeleteGraphics(G1)
-
-	pBitmap2 := Gdip_CreateBitmap(sWidth, sHeight)
-	G2 := Gdip_GraphicsFromImage(pBitmap2)
-	Gdip_SetInterpolationMode(G2, 7)
-	Gdip_DrawImage(G2, pBitmap1, 0, 0, sWidth, sHeight, 0, 0, dWidth, dHeight)
-
-	Gdip_DeleteGraphics(G2)
-	Gdip_DisposeImage(pBitmap1)
-	return pBitmap2
-}
-
-;#####################################################################################
-
-; Function:     		Gdip_SaveBitmapToFile
-; Description:  		Saves a bitmap to a file in any supported format onto disk
-;   
-; pBitmap				Pointer to a bitmap
-; sOutput      			The name of the file that the bitmap will be saved to. Supported extensions are: .BMP,.DIB,.RLE,.JPG,.JPEG,.JPE,.JFIF,.GIF,.TIF,.TIFF,.PNG
-; Quality      			If saving as jpg (.JPG,.JPEG,.JPE,.JFIF) then quality can be 1-100 with default at maximum quality
-;
-; return      			If the function succeeds, the return value is zero, otherwise:
-;						-1 = Extension supplied is not a supported file format
-;						-2 = Could not get a list of encoders on system
-;						-3 = Could not find matching encoder for specified file format
-;						-4 = Could not get WideChar name of output file
-;						-5 = Could not save file to disk
-;
-; notes					This function will use the extension supplied from the sOutput parameter to determine the output format
-
-Gdip_SaveBitmapToFile(pBitmap, sOutput, Quality=75)
-{
-	SplitPath, sOutput,,, Extension
-	if Extension not in BMP,DIB,RLE,JPG,JPEG,JPE,JFIF,GIF,TIF,TIFF,PNG
-		return -1
-	Extension := "." Extension
-
-	DllCall("gdiplus\GdipGetImageEncodersSize", "uint*", nCount, "uint*", nSize)
-	VarSetCapacity(ci, nSize)
-	DllCall("gdiplus\GdipGetImageEncoders", "uint", nCount, "uint", nSize, "uint", &ci)
-	if !(nCount && nSize)
-		return -2
-   
-	Loop, %nCount%
-	{
-		Location := NumGet(ci, 76*(A_Index-1)+44)
-		if !A_IsUnicode
-		{
-			nSize := DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "uint", Location, "int", -1, "uint", 0, "int",  0, "uint", 0, "uint", 0)
-			VarSetCapacity(sString, nSize)
-			DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "uint", Location, "int", -1, "str", sString, "int", nSize, "uint", 0, "uint", 0)
-			if !InStr(sString, "*" Extension)
-				continue
-		}
-		else
-		{
-			nSize := DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "uint", Location, "int", -1, "uint", 0, "int",  0, "uint", 0, "uint", 0)
-			sString := ""
-			Loop, %nSize%
-				sString .= Chr(NumGet(Location+0, 2*(A_Index-1), "char"))
-			if !InStr(sString, "*" Extension)
-				continue
-		}
-		pCodec := &ci+76*(A_Index-1)
-		break
-	}
-	if !pCodec
-		return -3
-
-	if (Quality != 75)
-	{
-		Quality := (Quality < 0) ? 0 : (Quality > 100) ? 100 : Quality
-		if Extension in .JPG,.JPEG,.JPE,.JFIF
-		{
-			DllCall("gdiplus\GdipGetEncoderParameterListSize", "uint", pBitmap, "uint", pCodec, "uint*", nSize)
-			VarSetCapacity(EncoderParameters, nSize, 0)
-			DllCall("gdiplus\GdipGetEncoderParameterList", "uint", pBitmap, "uint", pCodec, "uint", nSize, "uint", &EncoderParameters)
-			Loop, % NumGet(EncoderParameters)      ;%
-			{
-				if (NumGet(EncoderParameters, (28*(A_Index-1))+20) = 1) && (NumGet(EncoderParameters, (28*(A_Index-1))+24) = 6)
-				{
-				   p := (28*(A_Index-1))+&EncoderParameters
-				   NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20)))
-				   break
-				}
-			}      
-	  }
-	}
-
-	if !A_IsUnicode
-	{
-		nSize := DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &sOutput, "int", -1, "uint", 0, "int", 0)
-		VarSetCapacity(wOutput, nSize*2)
-		DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &sOutput, "int", -1, "uint", &wOutput, "int", nSize)
-		VarSetCapacity(wOutput, -1)
-		if !VarSetCapacity(wOutput)
-			return -4
-		E := DllCall("gdiplus\GdipSaveImageToFile", "uint", pBitmap, "uint", &wOutput, "uint", pCodec, "uint", p ? p : 0)
-	}
-	else
-		E := DllCall("gdiplus\GdipSaveImageToFile", "uint", pBitmap, "uint", &sOutput, "uint", pCodec, "uint", p ? p : 0)
-	return E ? -5 : 0
-}
-
-;#####################################################################################
-
-; Function				Gdip_GetPixel
-; Description			Gets the ARGB of a pixel in a bitmap
-;
-; pBitmap				Pointer to a bitmap
-; x						x-coordinate of the pixel
-; y						y-coordinate of the pixel
-;
-; return				Returns the ARGB value of the pixel
-
-Gdip_GetPixel(pBitmap, x, y)
-{
-	DllCall("gdiplus\GdipBitmapGetPixel", "uint", pBitmap, "int", x, "int", y, "uint*", ARGB)
-	return ARGB
-}
-
-;#####################################################################################
-
-; Function				Gdip_SetPixel
-; Description			Sets the ARGB of a pixel in a bitmap
-;
-; pBitmap				Pointer to a bitmap
-; x						x-coordinate of the pixel
-; y						y-coordinate of the pixel
-;
-; return				status enumeration. 0 = success
-
-Gdip_SetPixel(pBitmap, x, y, ARGB)
-{
-   return DllCall("gdiplus\GdipBitmapSetPixel", "uint", pBitmap, "int", x, "int", y, "int", ARGB)
-}
-
-;#####################################################################################
-
-; Function				Gdip_GetImageWidth
-; Description			Gives the width of a bitmap
-;
-; pBitmap				Pointer to a bitmap
-;
-; return				Returns the width in pixels of the supplied bitmap
-
-Gdip_GetImageWidth(pBitmap)
-{
-   DllCall("gdiplus\GdipGetImageWidth", "uint", pBitmap, "uint*", Width)
-   return Width
-}
-
-;#####################################################################################
-
-; Function				Gdip_GetImageHeight
-; Description			Gives the height of a bitmap
-;
-; pBitmap				Pointer to a bitmap
-;
-; return				Returns the height in pixels of the supplied bitmap
-
-Gdip_GetImageHeight(pBitmap)
-{
-   DllCall("gdiplus\GdipGetImageHeight", "uint", pBitmap, "uint*", Height)
-   return Height
-}
-
-;#####################################################################################
-
-; Function				Gdip_GetDimensions
-; Description			Gives the width and height of a bitmap
-;
-; pBitmap				Pointer to a bitmap
-; Width					ByRef variable. This variable will be set to the width of the bitmap
-; Height				ByRef variable. This variable will be set to the height of the bitmap
-;
-; return				No return value
-;						Gdip_GetDimensions(pBitmap, ThisWidth, ThisHeight) will set ThisWidth to the width and ThisHeight to the height
-
-Gdip_GetImageDimensions(pBitmap, ByRef Width, ByRef Height)
-{
-	DllCall("gdiplus\GdipGetImageWidth", "uint", pBitmap, "uint*", Width)
-	DllCall("gdiplus\GdipGetImageHeight", "uint", pBitmap, "uint*", Height)
-}
-
-;#####################################################################################
-
-Gdip_GetDimensions(pBitmap, ByRef Width, ByRef Height)
-{
-	Gdip_GetImageDimensions(pBitmap, Width, Height)
-}
-
-;#####################################################################################
-
-Gdip_GetImagePixelFormat(pBitmap)
-{
-	DllCall("gdiplus\GdipGetImagePixelFormat", "uint", pBitmap, "uint*", Format)
-	return Format
-}
-
-;#####################################################################################
-
-; Function				Gdip_GetDpiX
-; Description			Gives the horizontal dots per inch of the graphics of a bitmap
-;
-; pBitmap				Pointer to a bitmap
-; Width					ByRef variable. This variable will be set to the width of the bitmap
-; Height				ByRef variable. This variable will be set to the height of the bitmap
-;
-; return				No return value
-;						Gdip_GetDimensions(pBitmap, ThisWidth, ThisHeight) will set ThisWidth to the width and ThisHeight to the height
-
-Gdip_GetDpiX(pGraphics)
-{
-	DllCall("gdiplus\GdipGetDpiX", "uint", pGraphics, "float*", dpix)
-	return Round(dpix)
-}
-
-;#####################################################################################
-
-Gdip_GetDpiY(pGraphics)
-{
-	DllCall("gdiplus\GdipGetDpiY", "uint", pGraphics, "float*", dpiy)
-	return Round(dpiy)
-}
-
-;#####################################################################################
-
-Gdip_GetImageHorizontalResolution(pBitmap)
-{
-	DllCall("gdiplus\GdipGetImageHorizontalResolution", "uint", pBitmap, "float*", dpix)
-	return Round(dpix)
-}
-
-;#####################################################################################
-
-Gdip_GetImageVerticalResolution(pBitmap)
-{
-	DllCall("gdiplus\GdipGetImageVerticalResolution", "uint", pBitmap, "float*", dpiy)
-	return Round(dpiy)
-}
-
-;#####################################################################################
-
-Gdip_BitmapSetResolution(pBitmap, dpix, dpiy)
-{
-	return DllCall("gdiplus\GdipBitmapSetResolution", "uint", pBitmap, "float", dpix, "float", dpiy)
-}
-
-;#####################################################################################
-
-Gdip_CreateBitmapFromFile(sFile, IconNumber=1, IconSize="")
-{
-	SplitPath, sFile,,, ext
-	if ext in exe,dll
-	{
-		Sizes := IconSize ? IconSize : 256 "|" 128 "|" 64 "|" 48 "|" 32 "|" 16
-		VarSetCapacity(buf, 40)
-		Loop, Parse, Sizes, |
-		{
-			DllCall("PrivateExtractIcons", "str", sFile, "int", IconNumber-1, "int", A_LoopField, "int", A_LoopField, "uint*", hIcon, "uint*", 0, "uint", 1, "uint", 0)
-			if !hIcon
-				continue
-
-			if !DllCall("GetIconInfo", "uint", hIcon, "uint", &buf)
-			{
-				DestroyIcon(hIcon)
-				continue
-			}
-			hbmColor := NumGet(buf, 16)
-			hbmMask  := NumGet(buf, 12)
-
-			if !(hbmColor && DllCall("GetObject", "uint", hbmColor, "int", 24, "uint", &buf))
-			{
-				DestroyIcon(hIcon)
-				continue
-			}
-			break
-		}
-		if !hIcon
-			return -1
-
-		Width := NumGet(buf, 4, "int"),  Height := NumGet(buf, 8, "int")
-		hbm := CreateDIBSection(Width, -Height), hdc := CreateCompatibleDC(), obm := SelectObject(hdc, hbm)
-
-		if !DllCall("DrawIconEx", "uint", hdc, "int", 0, "int", 0, "uint", hIcon, "uint", Width, "uint", Height, "uint", 0, "uint", 0, "uint", 3)
-		{
-			DestroyIcon(hIcon)
-			return -2
-		}
-
-		VarSetCapacity(dib, 84)
-		DllCall("GetObject", "uint", hbm, "int", 84, "uint", &dib)
-		Stride := NumGet(dib, 12), Bits := NumGet(dib, 20)
-
-		DllCall("gdiplus\GdipCreateBitmapFromScan0", "int", Width, "int", Height, "int", Stride, "int", 0x26200A, "uint", Bits, "uint*", pBitmapOld)
-		pBitmap := Gdip_CreateBitmap(Width, Height), G := Gdip_GraphicsFromImage(pBitmap)
-		Gdip_DrawImage(G, pBitmapOld, 0, 0, Width, Height, 0, 0, Width, Height)
-		SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
-		Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmapOld)
-		DestroyIcon(hIcon)
-	}
-	else
-	{
-		if !A_IsUnicode
-		{
-			VarSetCapacity(wFile, 1023)
-			DllCall("kernel32\MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &sFile, "int", -1, "uint", &wFile, "int", 512)
-			DllCall("gdiplus\GdipCreateBitmapFromFile", "uint", &wFile, "uint*", pBitmap)
-		}
-		else
-			DllCall("gdiplus\GdipCreateBitmapFromFile", "uint", &sFile, "uint*", pBitmap)
-	}
-	return pBitmap
-}
-
-;#####################################################################################
-
-Gdip_CreateBitmapFromHBITMAP(hBitmap, Palette=0)
-{
-	DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "uint", hBitmap, "uint", Palette, "uint*", pBitmap)
-	return pBitmap
-}
-
-;#####################################################################################
-
-Gdip_CreateHBITMAPFromBitmap(pBitmap, Background=0xffffffff)
-{
-	DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", "uint", pBitmap, "uint*", hbm, "int", Background)
-	return hbm
-}
-
-;#####################################################################################
-
-Gdip_CreateBitmapFromHICON(hIcon)
-{
-	DllCall("gdiplus\GdipCreateBitmapFromHICON", "uint", hIcon, "uint*", pBitmap)
-	return pBitmap
-}
-
-;#####################################################################################
-
-Gdip_CreateHICONFromBitmap(pBitmap)
-{
-	DllCall("gdiplus\GdipCreateHICONFromBitmap", "uint", pBitmap, "uint*", hIcon)
-	return hIcon
-}
-
-;#####################################################################################
-
-Gdip_CreateBitmap(Width, Height, Format=0x26200A)
-{
-    DllCall("gdiplus\GdipCreateBitmapFromScan0", "int", Width, "int", Height, "int", 0, "int", Format, "uint", 0, "uint*", pBitmap)
-    Return pBitmap
-}
-
-;#####################################################################################
-
-Gdip_CreateBitmapFromClipboard()
-{
-	if !DllCall("OpenClipboard", "uint", 0)
-		return -1
-	if !DllCall("IsClipboardFormatAvailable", "uint", 8)
-		return -2
-	if !hBitmap := DllCall("GetClipboardData", "uint", 2)
-		return -3
-	if !pBitmap := Gdip_CreateBitmapFromHBITMAP(hBitmap)
-		return -4
-	if !DllCall("CloseClipboard")
-		return -5
-	DeleteObject(hBitmap)
-	return pBitmap
-}
-
-;#####################################################################################
-
-Gdip_SetBitmapToClipboard(pBitmap)
-{
-	hBitmap := Gdip_CreateHBITMAPFromBitmap(pBitmap)
-	DllCall("GetObject", "uint", hBitmap, "int", VarSetCapacity(oi, 84, 0), "uint", &oi)
-	hdib := DllCall("GlobalAlloc", "uint", 2, "uint", 40+NumGet(oi, 44))
-	pdib := DllCall("GlobalLock", "uint", hdib)
-	DllCall("RtlMoveMemory", "uint", pdib, "uint", &oi+24, "uint", 40)
-	DllCall("RtlMoveMemory", "Uint", pdib+40, "Uint", NumGet(oi, 20), "uint", NumGet(oi, 44))
-	DllCall("GlobalUnlock", "uint", hdib)
-	DllCall("DeleteObject", "uint", hBitmap)
-	DllCall("OpenClipboard", "uint", 0)
-	DllCall("EmptyClipboard")
-	DllCall("SetClipboardData", "uint", 8, "uint", hdib)
-	DllCall("CloseClipboard")
-}
-
-;#####################################################################################
-
-Gdip_CloneBitmapArea(pBitmap, x, y, w, h, Format=0x26200A)
-{
-	DllCall("gdiplus\GdipCloneBitmapArea", "float", x, "float", y, "float", w, "float", h
-	, "int", Format, "uint", pBitmap, "uint*", pBitmapDest)
-	return pBitmapDest
-}
-
-;#####################################################################################
-; Create resources
-;#####################################################################################
-
-Gdip_CreatePen(ARGB, w)
-{
-   DllCall("gdiplus\GdipCreatePen1", "int", ARGB, "float", w, "int", 2, "uint*", pPen)
-   return pPen
-}
-
-;#####################################################################################
-
-Gdip_CreatePenFromBrush(pBrush, w)
-{
-	DllCall("gdiplus\GdipCreatePen2", "uint", pBrush, "float", w, "int", 2, "uint*", pPen)
-	return pPen
-}
-
-;#####################################################################################
-
-Gdip_BrushCreateSolid(ARGB=0xff000000)
-{
-	DllCall("gdiplus\GdipCreateSolidFill", "int", ARGB, "uint*", pBrush)
-	return pBrush
-}
-
-;#####################################################################################
-
-; HatchStyleHorizontal = 0
-; HatchStyleVertical = 1
-; HatchStyleForwardDiagonal = 2
-; HatchStyleBackwardDiagonal = 3
-; HatchStyleCross = 4
-; HatchStyleDiagonalCross = 5
-; HatchStyle05Percent = 6
-; HatchStyle10Percent = 7
-; HatchStyle20Percent = 8
-; HatchStyle25Percent = 9
-; HatchStyle30Percent = 10
-; HatchStyle40Percent = 11
-; HatchStyle50Percent = 12
-; HatchStyle60Percent = 13
-; HatchStyle70Percent = 14
-; HatchStyle75Percent = 15
-; HatchStyle80Percent = 16
-; HatchStyle90Percent = 17
-; HatchStyleLightDownwardDiagonal = 18
-; HatchStyleLightUpwardDiagonal = 19
-; HatchStyleDarkDownwardDiagonal = 20
-; HatchStyleDarkUpwardDiagonal = 21
-; HatchStyleWideDownwardDiagonal = 22
-; HatchStyleWideUpwardDiagonal = 23
-; HatchStyleLightVertical = 24
-; HatchStyleLightHorizontal = 25
-; HatchStyleNarrowVertical = 26
-; HatchStyleNarrowHorizontal = 27
-; HatchStyleDarkVertical = 28
-; HatchStyleDarkHorizontal = 29
-; HatchStyleDashedDownwardDiagonal = 30
-; HatchStyleDashedUpwardDiagonal = 31
-; HatchStyleDashedHorizontal = 32
-; HatchStyleDashedVertical = 33
-; HatchStyleSmallConfetti = 34
-; HatchStyleLargeConfetti = 35
-; HatchStyleZigZag = 36
-; HatchStyleWave = 37
-; HatchStyleDiagonalBrick = 38
-; HatchStyleHorizontalBrick = 39
-; HatchStyleWeave = 40
-; HatchStylePlaid = 41
-; HatchStyleDivot = 42
-; HatchStyleDottedGrid = 43
-; HatchStyleDottedDiamond = 44
-; HatchStyleShingle = 45
-; HatchStyleTrellis = 46
-; HatchStyleSphere = 47
-; HatchStyleSmallGrid = 48
-; HatchStyleSmallCheckerBoard = 49
-; HatchStyleLargeCheckerBoard = 50
-; HatchStyleOutlinedDiamond = 51
-; HatchStyleSolidDiamond = 52
-; HatchStyleTotal = 53
-Gdip_BrushCreateHatch(ARGBfront, ARGBback, HatchStyle=0)
-{
-	DllCall("gdiplus\GdipCreateHatchBrush", "int", HatchStyle, "int", ARGBfront, "int", ARGBback, "uint*", pBrush)
-	return pBrush
-}
-
-;#####################################################################################
-
-Gdip_CreateTextureBrush(pBitmap, WrapMode=1, x=0, y=0, w="", h="")
-{
-	if !(w && h)
-		DllCall("gdiplus\GdipCreateTexture", "uint", pBitmap, "int", WrapMode, "uint*", pBrush)
-	else
-		DllCall("gdiplus\GdipCreateTexture2", "uint", pBitmap, "int", WrapMode, "float", x, "float", y, "float", w, "float", h, "uint*", pBrush)
-	return pBrush
-}
-
-;#####################################################################################
-
-; WrapModeTile = 0
-; WrapModeTileFlipX = 1
-; WrapModeTileFlipY = 2
-; WrapModeTileFlipXY = 3
-; WrapModeClamp = 4
-Gdip_CreateLineBrush(x1, y1, x2, y2, ARGB1, ARGB2, WrapMode=1)
-{
-	CreatePointF(PointF1, x1, y1), CreatePointF(PointF2, x2, y2)
-	DllCall("gdiplus\GdipCreateLineBrush", "uint", &PointF1, "uint", &PointF2, "int", ARGB1, "int", ARGB2, "int", WrapMode, "uint*", LGpBrush)
-	return LGpBrush
-}
-
-;#####################################################################################
-
-; LinearGradientModeHorizontal = 0
-; LinearGradientModeVertical = 1
-; LinearGradientModeForwardDiagonal = 2
-; LinearGradientModeBackwardDiagonal = 3
-Gdip_CreateLineBrushFromRect(x, y, w, h, ARGB1, ARGB2, LinearGradientMode=1, WrapMode=1)
-{
-	CreateRectF(RectF, x, y, w, h)
-	DllCall("gdiplus\GdipCreateLineBrushFromRect", "uint", &RectF, "int", ARGB1, "int", ARGB2, "int", LinearGradientMode, "int", WrapMode, "uint*", LGpBrush)
-	return LGpBrush
-}
-
-;#####################################################################################
-
-Gdip_CloneBrush(pBrush)
-{
-	DllCall("gdiplus\GdipCloneBrush", "uint", pBrush, "uint*", pBrushClone)
-	return pBrushClone
-}
-
-;#####################################################################################
-; Delete resources
-;#####################################################################################
-
-Gdip_DeletePen(pPen)
-{
-   return DllCall("gdiplus\GdipDeletePen", "uint", pPen)
-}
-
-;#####################################################################################
-
-Gdip_DeleteBrush(pBrush)
-{
-   return DllCall("gdiplus\GdipDeleteBrush", "uint", pBrush)
-}
-
-;#####################################################################################
-
-Gdip_DisposeImage(pBitmap)
-{
-   return DllCall("gdiplus\GdipDisposeImage", "uint", pBitmap)
-}
-
-;#####################################################################################
-
-Gdip_DeleteGraphics(pGraphics)
-{
-   return DllCall("gdiplus\GdipDeleteGraphics", "uint", pGraphics)
-}
-
-;#####################################################################################
-
-Gdip_DisposeImageAttributes(ImageAttr)
-{
-	return DllCall("gdiplus\GdipDisposeImageAttributes", "uint", ImageAttr)
-}
-
-;#####################################################################################
-
-Gdip_DeleteFont(hFont)
-{
-   return DllCall("gdiplus\GdipDeleteFont", "uint", hFont)
-}
-
-;#####################################################################################
-
-Gdip_DeleteStringFormat(hFormat)
-{
-   return DllCall("gdiplus\GdipDeleteStringFormat", "uint", hFormat)
-}
-
-;#####################################################################################
-
-Gdip_DeleteFontFamily(hFamily)
-{
-   return DllCall("gdiplus\GdipDeleteFontFamily", "uint", hFamily)
-}
-
-;#####################################################################################
-
-Gdip_DeleteMatrix(Matrix)
-{
-   return DllCall("gdiplus\GdipDeleteMatrix", "uint", Matrix)
-}
-
-;#####################################################################################
-; Text functions
-;#####################################################################################
-
-Gdip_TextToGraphics(pGraphics, Text, Options, Font="Arial", Width="", Height="", Measure=0)
-{
-	IWidth := Width, IHeight:= Height
-	
-	RegExMatch(Options, "i)X([\-\d\.]+)(p*)", xpos)
-	RegExMatch(Options, "i)Y([\-\d\.]+)(p*)", ypos)
-	RegExMatch(Options, "i)W([\-\d\.]+)(p*)", Width)
-	RegExMatch(Options, "i)H([\-\d\.]+)(p*)", Height)
-	RegExMatch(Options, "i)C(?!(entre|enter))([a-f\d]+)", Colour)
-	RegExMatch(Options, "i)Top|Up|Bottom|Down|vCentre|vCenter", vPos)
-	RegExMatch(Options, "i)NoWrap", NoWrap)
-	RegExMatch(Options, "i)R(\d)", Rendering)
-	RegExMatch(Options, "i)S(\d+)(p*)", Size)
-
-	if !Gdip_DeleteBrush(Gdip_CloneBrush(Colour2))
-		PassBrush := 1, pBrush := Colour2
-	
-	if !(IWidth && IHeight) && (xpos2 || ypos2 || Width2 || Height2 || Size2)
-		return -1
-
-	Style := 0, Styles := "Regular|Bold|Italic|BoldItalic|Underline|Strikeout"
-	Loop, Parse, Styles, |
-	{
-		if RegExMatch(Options, "\b" A_loopField)
-		Style |= (A_LoopField != "StrikeOut") ? (A_Index-1) : 8
-	}
-  
-	Align := 0, Alignments := "Near|Left|Centre|Center|Far|Right"
-	Loop, Parse, Alignments, |
-	{
-		if RegExMatch(Options, "\b" A_loopField)
-			Align |= A_Index//2.1      ; 0|0|1|1|2|2
-	}
-
-	xpos := (xpos1 != "") ? xpos2 ? IWidth*(xpos1/100) : xpos1 : 0
-	ypos := (ypos1 != "") ? ypos2 ? IHeight*(ypos1/100) : ypos1 : 0
-	Width := Width1 ? Width2 ? IWidth*(Width1/100) : Width1 : IWidth
-	Height := Height1 ? Height2 ? IHeight*(Height1/100) : Height1 : IHeight
-	if !PassBrush
-		Colour := "0x" (Colour2 ? Colour2 : "ff000000")
-	Rendering := ((Rendering1 >= 0) && (Rendering1 <= 5)) ? Rendering1 : 4
-	Size := (Size1 > 0) ? Size2 ? IHeight*(Size1/100) : Size1 : 12
-
-	hFamily := Gdip_FontFamilyCreate(Font)
-	hFont := Gdip_FontCreate(hFamily, Size, Style)
-	FormatStyle := NoWrap ? 0x4000 | 0x1000 : 0x4000
-	hFormat := Gdip_StringFormatCreate(FormatStyle)
-	pBrush := PassBrush ? pBrush : Gdip_BrushCreateSolid(Colour)
-	if !(hFamily && hFont && hFormat && pBrush && pGraphics)
-		return !pGraphics ? -2 : !hFamily ? -3 : !hFont ? -4 : !hFormat ? -5 : !pBrush ? -6 : 0
-   
-	CreateRectF(RC, xpos, ypos, Width, Height)
-	Gdip_SetStringFormatAlign(hFormat, Align)
-	Gdip_SetTextRenderingHint(pGraphics, Rendering)
-	ReturnRC := Gdip_MeasureString(pGraphics, Text, hFont, hFormat, RC)
-
-	if vPos
-	{
-		StringSplit, ReturnRC, ReturnRC, |
-		
-		if (vPos = "vCentre") || (vPos = "vCenter")
-			ypos += (Height-ReturnRC4)//2
-		else if (vPos = "Top") || (vPos = "Up")
-			ypos := 0
-		else if (vPos = "Bottom") || (vPos = "Down")
-			ypos := Height-ReturnRC4
-		
-		CreateRectF(RC, xpos, ypos, Width, ReturnRC4)
-		ReturnRC := Gdip_MeasureString(pGraphics, Text, hFont, hFormat, RC)
-	}
-
-	if !Measure
-		E := Gdip_DrawString(pGraphics, Text, hFont, hFormat, pBrush, RC)
-
-	if !PassBrush
-		Gdip_DeleteBrush(pBrush)
-	Gdip_DeleteStringFormat(hFormat)   
-	Gdip_DeleteFont(hFont)
-	Gdip_DeleteFontFamily(hFamily)
-	return E ? E : ReturnRC
-}
-
-;#####################################################################################
-
-Gdip_DrawString(pGraphics, sString, hFont, hFormat, pBrush, ByRef RectF)
-{
-	if !A_IsUnicode
-	{
-		nSize := DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &sString, "int", -1, "uint", 0, "int", 0)
-		VarSetCapacity(wString, nSize*2)
-		DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &sString, "int", -1, "uint", &wString, "int", nSize)
-		return DllCall("gdiplus\GdipDrawString", "uint", pGraphics
-		, "uint", &wString, "int", -1, "uint", hFont, "uint", &RectF, "uint", hFormat, "uint", pBrush)
-	}
-	else
-	{
-		return DllCall("gdiplus\GdipDrawString", "uint", pGraphics
-		, "uint", &sString, "int", -1, "uint", hFont, "uint", &RectF, "uint", hFormat, "uint", pBrush)
-	}	
-}
-
-;#####################################################################################
-
-Gdip_MeasureString(pGraphics, sString, hFont, hFormat, ByRef RectF)
-{
-	VarSetCapacity(RC, 16)
-	if !A_IsUnicode
-	{
-		nSize := DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &sString, "int", -1, "uint", 0, "int", 0)
-		VarSetCapacity(wString, nSize*2)   
-		DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &sString, "int", -1, "uint", &wString, "int", nSize)
-		DllCall("gdiplus\GdipMeasureString", "uint", pGraphics
-		, "uint", &wString, "int", -1, "uint", hFont, "uint", &RectF, "uint", hFormat, "uint", &RC, "uint*", Chars, "uint*", Lines)
-	}
-	else
-	{
-		DllCall("gdiplus\GdipMeasureString", "uint", pGraphics
-		, "uint", &sString, "int", -1, "uint", hFont, "uint", &RectF, "uint", hFormat, "uint", &RC, "uint*", Chars, "uint*", Lines)
-	}
-	return &RC ? NumGet(RC, 0, "float") "|" NumGet(RC, 4, "float") "|" NumGet(RC, 8, "float") "|" NumGet(RC, 12, "float") "|" Chars "|" Lines : 0
-}
-
-; Near = 0
-; Center = 1
-; Far = 2
-Gdip_SetStringFormatAlign(hFormat, Align)
-{
-   return DllCall("gdiplus\GdipSetStringFormatAlign", "uint", hFormat, "int", Align)
-}
-
-; StringFormatFlagsDirectionRightToLeft    = 0x00000001
-; StringFormatFlagsDirectionVertical       = 0x00000002
-; StringFormatFlagsNoFitBlackBox           = 0x00000004
-; StringFormatFlagsDisplayFormatControl    = 0x00000020
-; StringFormatFlagsNoFontFallback          = 0x00000400
-; StringFormatFlagsMeasureTrailingSpaces   = 0x00000800
-; StringFormatFlagsNoWrap                  = 0x00001000
-; StringFormatFlagsLineLimit               = 0x00002000
-; StringFormatFlagsNoClip                  = 0x00004000 
-Gdip_StringFormatCreate(Format=0, Lang=0)
-{
-   DllCall("gdiplus\GdipCreateStringFormat", "int", Format, "int", Lang, "uint*", hFormat)
-   return hFormat
-}
-
-; Regular = 0
-; Bold = 1
-; Italic = 2
-; BoldItalic = 3
-; Underline = 4
-; Strikeout = 8
-Gdip_FontCreate(hFamily, Size, Style=0)
-{
-   DllCall("gdiplus\GdipCreateFont", "uint", hFamily, "float", Size, "int", Style, "int", 0, "uint*", hFont)
-   return hFont
-}
-
-Gdip_FontFamilyCreate(Font)
-{
-	if !A_IsUnicode
-	{
-		nSize := DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &Font, "int", -1, "uint", 0, "int", 0)
-		VarSetCapacity(wFont, nSize*2)
-		DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &Font, "int", -1, "uint", &wFont, "int", nSize)
-		DllCall("gdiplus\GdipCreateFontFamilyFromName", "uint", &wFont, "uint", 0, "uint*", hFamily)
-	}
-	else
-		DllCall("gdiplus\GdipCreateFontFamilyFromName", "uint", &Font, "uint", 0, "uint*", hFamily)
-	return hFamily
-}
-
-;#####################################################################################
-; Matrix functions
-;#####################################################################################
-
-Gdip_CreateAffineMatrix(m11, m12, m21, m22, x, y)
-{
-   DllCall("gdiplus\GdipCreateMatrix2", "float", m11, "float", m12, "float", m21, "float", m22, "float", x, "float", y, "uint*", Matrix)
-   return Matrix
-}
-
-Gdip_CreateMatrix()
-{
-   DllCall("gdiplus\GdipCreateMatrix", "uint*", Matrix)
-   return Matrix
-}
-
-;#####################################################################################
-; GraphicsPath functions
-;#####################################################################################
-
-; Alternate = 0
-; Winding = 1
-Gdip_CreatePath(BrushMode=0)
-{
-	DllCall("gdiplus\GdipCreatePath", "int", BrushMode, "uint*", Path)
-	return Path
-}
-
-Gdip_AddPathEllipse(Path, x, y, w, h)
-{
-	return DllCall("gdiplus\GdipAddPathEllipse", "uint", Path, "float", x, "float", y, "float", w, "float", h)
-}
-
-Gdip_AddPathPolygon(Path, Points)
-{
-	StringSplit, Points, Points, |
-	VarSetCapacity(PointF, 8*Points0)   
-	Loop, %Points0%
-	{
-		StringSplit, Coord, Points%A_Index%, `,
-		NumPut(Coord1, PointF, 8*(A_Index-1), "float"), NumPut(Coord2, PointF, (8*(A_Index-1))+4, "float")
-	}   
-
-	return DllCall("gdiplus\GdipAddPathPolygon", "uint", Path, "uint", &PointF, "int", Points0)
-}
-
-Gdip_DeletePath(Path)
-{
-	return DllCall("gdiplus\GdipDeletePath", "uint", Path)
-}
-
-;#####################################################################################
-; Quality functions
-;#####################################################################################
-
-; SystemDefault = 0
-; SingleBitPerPixelGridFit = 1
-; SingleBitPerPixel = 2
-; AntiAliasGridFit = 3
-; AntiAlias = 4
-Gdip_SetTextRenderingHint(pGraphics, RenderingHint)
-{
-	return DllCall("gdiplus\GdipSetTextRenderingHint", "uint", pGraphics, "int", RenderingHint)
-}
-
-; Default = 0
-; LowQuality = 1
-; HighQuality = 2
-; Bilinear = 3
-; Bicubic = 4
-; NearestNeighbor = 5
-; HighQualityBilinear = 6
-; HighQualityBicubic = 7
-Gdip_SetInterpolationMode(pGraphics, InterpolationMode)
-{
-   return DllCall("gdiplus\GdipSetInterpolationMode", "uint", pGraphics, "int", InterpolationMode)
-}
-
-; Default = 0
-; HighSpeed = 1
-; HighQuality = 2
-; None = 3
-; AntiAlias = 4
-Gdip_SetSmoothingMode(pGraphics, SmoothingMode)
-{
-   return DllCall("gdiplus\GdipSetSmoothingMode", "uint", pGraphics, "int", SmoothingMode)
-}
-
-; CompositingModeSourceOver = 0 (blended)
-; CompositingModeSourceCopy = 1 (overwrite)
-Gdip_SetCompositingMode(pGraphics, CompositingMode=0)
-{
-   return DllCall("gdiplus\GdipSetCompositingMode", "uint", pGraphics, "int", CompositingMode)
-}
-
-;#####################################################################################
-; Extra functions
-;#####################################################################################
-
-Gdip_Startup()
-{
-	if !DllCall("GetModuleHandle", "str", "gdiplus")
-		DllCall("LoadLibrary", "str", "gdiplus")
-	VarSetCapacity(si, 16, 0), si := Chr(1)
-	DllCall("gdiplus\GdiplusStartup", "uint*", pToken, "uint", &si, "uint", 0)
-	return pToken
-}
-
-Gdip_Shutdown(pToken)
-{
-	DllCall("gdiplus\GdiplusShutdown", "uint", pToken)
-	if hModule := DllCall("GetModuleHandle", "str", "gdiplus")
-		DllCall("FreeLibrary", "uint", hModule)
-	return 0
-}
-
-; Prepend = 0; The new operation is applied before the old operation.
-; Append = 1; The new operation is applied after the old operation.
-Gdip_RotateWorldTransform(pGraphics, Angle, MatrixOrder=0)
-{
-	return DllCall("gdiplus\GdipRotateWorldTransform", "uint", pGraphics, "float", Angle, "int", MatrixOrder)
-}
-
-Gdip_ScaleWorldTransform(pGraphics, x, y, MatrixOrder=0)
-{
-	return DllCall("gdiplus\GdipScaleWorldTransform", "uint", pGraphics, "float", x, "float", y, "int", MatrixOrder)
-}
-
-Gdip_TranslateWorldTransform(pGraphics, x, y, MatrixOrder=0)
-{
-	return DllCall("gdiplus\GdipTranslateWorldTransform", "uint", pGraphics, "float", x, "float", y, "int", MatrixOrder)
-}
-
-Gdip_ResetWorldTransform(pGraphics)
-{
-	return DllCall("gdiplus\GdipResetWorldTransform", "uint", pGraphics)
-}
-
-Gdip_GetRotatedTranslation(Width, Height, Angle, ByRef xTranslation, ByRef yTranslation)
-{
-	pi := 3.14159, TAngle := Angle*(pi/180)	
-
-	Bound := (Angle >= 0) ? Mod(Angle, 360) : 360-Mod(-Angle, -360)
-	if ((Bound >= 0) && (Bound <= 90))
-		xTranslation := Height*Sin(TAngle), yTranslation := 0
-	else if ((Bound > 90) && (Bound <= 180))
-		xTranslation := (Height*Sin(TAngle))-(Width*Cos(TAngle)), yTranslation := -Height*Cos(TAngle)
-	else if ((Bound > 180) && (Bound <= 270))
-		xTranslation := -(Width*Cos(TAngle)), yTranslation := -(Height*Cos(TAngle))-(Width*Sin(TAngle))
-	else if ((Bound > 270) && (Bound <= 360))
-		xTranslation := 0, yTranslation := -Width*Sin(TAngle)
-}
-
-Gdip_GetRotatedDimensions(Width, Height, Angle, ByRef RWidth, ByRef RHeight)
-{
-	pi := 3.14159, TAngle := Angle*(pi/180)
-	if !(Width && Height)
-		return -1
-	RWidth := Ceil(Abs(Width*Cos(TAngle))+Abs(Height*Sin(TAngle)))
-	RHeight := Ceil(Abs(Width*Sin(TAngle))+Abs(Height*Cos(Tangle)))
-}
-
-; RotateNoneFlipNone   = 0
-; Rotate90FlipNone     = 1
-; Rotate180FlipNone    = 2
-; Rotate270FlipNone    = 3
-; RotateNoneFlipX      = 4
-; Rotate90FlipX        = 5
-; Rotate180FlipX       = 6
-; Rotate270FlipX       = 7
-; RotateNoneFlipY      = Rotate180FlipX
-; Rotate90FlipY        = Rotate270FlipX
-; Rotate180FlipY       = RotateNoneFlipX
-; Rotate270FlipY       = Rotate90FlipX
-; RotateNoneFlipXY     = Rotate180FlipNone
-; Rotate90FlipXY       = Rotate270FlipNone
-; Rotate180FlipXY      = RotateNoneFlipNone
-; Rotate270FlipXY      = Rotate90FlipNone 
-
-Gdip_ImageRotateFlip(pBitmap, RotateFlipType=1)
-{
-	return DllCall("gdiplus\GdipImageRotateFlip", "uint", pBitmap, "int", RotateFlipType)
-}
-
-; Replace = 0
-; Intersect = 1
-; Union = 2
-; Xor = 3
-; Exclude = 4
-; Complement = 5
-Gdip_SetClipRect(pGraphics, x, y, w, h, CombineMode=0)
-{
-   return DllCall("gdiplus\GdipSetClipRect", "uint", pGraphics, "float", x, "float", y, "float", w, "float", h, "int", CombineMode)
-}
-
-Gdip_SetClipPath(pGraphics, Path, CombineMode=0)
-{
-   return DllCall("gdiplus\GdipSetClipPath", "uint", pGraphics, "uint", Path, "int", CombineMode)
-}
-
-Gdip_ResetClip(pGraphics)
-{
-   return DllCall("gdiplus\GdipResetClip", "uint", pGraphics)
-}
-
-Gdip_GetClipRegion(pGraphics)
-{
-	Region := Gdip_CreateRegion()
-	DllCall("gdiplus\GdipGetClip", "uint" pGraphics, "uint*", Region)
-	return Region
-}
-
-Gdip_SetClipRegion(pGraphics, Region, CombineMode=0)
-{
-	return DllCall("gdiplus\GdipSetClipRegion", "uint", pGraphics, "uint", Region, "int", CombineMode)
-}
-
-Gdip_CreateRegion()
-{
-	DllCall("gdiplus\GdipCreateRegion", "uint*", Region)
-	return Region
-}
-
-Gdip_DeleteRegion(Region)
-{
-	return DllCall("gdiplus\GdipDeleteRegion", "uint", Region)
-}
-
-;#####################################################################################
-; BitmapLockBits
-;#####################################################################################
-
-Gdip_LockBits(pBitmap, x, y, w, h, ByRef Stride, ByRef Scan0, ByRef BitmapData, LockMode = 3, PixelFormat = 0x26200a)
-{   
-	CreateRect(Rect, x, y, w, h)
-	VarSetCapacity(BitmapData, 21, 0)
-	E := DllCall("Gdiplus\GdipBitmapLockBits", "uint", pBitmap, "uint", &Rect, "uint", LockMode, "int", PixelFormat, "uint", &BitmapData)
-	Stride := NumGet(BitmapData, 8)
-	Scan0 := NumGet(BitmapData, 16)
-	return E
-}
-
-;#####################################################################################
-
-Gdip_UnlockBits(pBitmap, ByRef BitmapData)
-{
-	return DllCall("Gdiplus\GdipBitmapUnlockBits", "uint", pBitmap, "uint", &BitmapData)
-}
-
-;#####################################################################################
-
-Gdip_SetLockBitPixel(ARGB, Scan0, x, y, Stride)
-{
-	Numput(ARGB, Scan0+0, (x*4)+(y*Stride))
-}
-
-;#####################################################################################
-
-Gdip_GetLockBitPixel(Scan0, x, y, Stride)
-{
-	return NumGet(Scan0+0, (x*4)+(y*Stride))
-}
-
-;#####################################################################################
-
-Gdip_PixelateBitmap(pBitmap, ByRef pBitmapOut, BlockSize)
-{
-	static PixelateBitmap
-	if !PixelateBitmap
-	{
-		MCode_PixelateBitmap := "83EC388B4424485355568B74245C99F7FE8B5C244C8B6C2448578BF88BCA894C241C897C243485FF0F8E2E0300008B44245"
-		. "499F7FE897C24448944242833C089542418894424308944242CEB038D490033FF397C2428897C24380F8E750100008BCE0FAFCE894C24408DA4240000"
-		. "000033C03BF08944241089442460894424580F8E8A0000008B5C242C8D4D028BD52BD183C203895424208D3CBB0FAFFE8BD52BD142895424248BD52BD"
-		. "103F9897C24148974243C8BCF8BFE8DA424000000008B5C24200FB61C0B03C30FB619015C24588B5C24240FB61C0B015C24600FB61C11015C241083C1"
-		. "0483EF0175D38B7C2414037C245C836C243C01897C241475B58B7C24388B6C244C8B5C24508B4C244099F7F9894424148B44245899F7F9894424588B4"
-		. "4246099F7F9894424608B44241099F7F98944241085F60F8E820000008D4B028BC32BC18D68038B44242C8D04B80FAFC68BD32BD142895424248BD32B"
-		. "D103C18944243C89742420EB038D49008BC88BFE0FB64424148B5C24248804290FB644245888010FB644246088040B0FB644241088040A83C10483EF0"
-		. "175D58B44243C0344245C836C2420018944243C75BE8B4C24408B5C24508B6C244C8B7C2438473B7C2428897C24380F8C9FFEFFFF8B4C241C33D23954"
-		. "24180F846401000033C03BF2895424108954246089542458895424148944243C0F8E82000000EB0233D2395424187E6F8B4C243003C80FAF4C245C8B4"
-		. "424280FAFC68D550203CA8D0C818BC52BC283C003894424208BC52BC2408BFD2BFA8B54241889442424895424408B4424200FB614080FB60101542414"
-		. "8B542424014424580FB6040A0FB61439014424600154241083C104836C24400175CF8B44243C403BC68944243C7C808B4C24188B4424140FAFCE99F7F"
-		. "9894424148B44245899F7F9894424588B44246099F7F9894424608B44241099F7F98944241033C08944243C85F60F8E7F000000837C2418007E6F8B4C"
-		. "243003C80FAF4C245C8B4424280FAFC68D530203CA8D0C818BC32BC283C003894424208BC32BC2408BFB2BFA8B54241889442424895424400FB644241"
-		. "48B5424208804110FB64424580FB654246088018B4424248814010FB654241088143983C104836C24400175CF8B44243C403BC68944243C7C818B4C24"
-		. "1C8B44245C0144242C01742430836C2444010F85F4FCFFFF8B44245499F7FE895424188944242885C00F8E890100008BF90FAFFE33D2897C243C89542"
-		. "45489442438EB0233D233C03BCA89542410895424608954245889542414894424400F8E840000003BF27E738B4C24340FAFCE03C80FAF4C245C034C24"
-		. "548D55028BC52BC283C003894424208BC52BC2408BFD03CA894424242BFA89742444908B5424200FB6040A0FB611014424148B442424015424580FB61"
-		. "4080FB6040F015424600144241083C104836C24440175CF8B4424408B7C243C8B4C241C33D2403BC1894424400F8C7CFFFFFF8B44241499F7FF894424"
-		. "148B44245899F7FF894424588B44246099F7FF894424608B44241099F7FF8944241033C08944244085C90F8E8000000085F67E738B4C24340FAFCE03C"
-		. "80FAF4C245C034C24548D53028BC32BC283C003894424208BC32BC2408BFB03CA894424242BFA897424448D49000FB65424148B4424208814010FB654"
-		. "24580FB644246088118B5424248804110FB644241088043983C104836C24440175CF8B4424408B7C243C8B4C241C403BC1894424407C808D04B500000"
-		. "00001442454836C2438010F858CFEFFFF33D233C03BCA89542410895424608954245889542414894424440F8E9A000000EB048BFF33D2395424180F8E"
-		. "7D0000008B4C24340FAFCE03C80FAF4C245C8B4424280FAFC68D550203CA8D0C818BC52BC283C003894424208BC52BC240894424248BC52BC28B54241"
-		. "8895424548DA424000000008B5424200FB6140A015424140FB611015424588B5424240FB6140A015424600FB614010154241083C104836C24540175CF"
-		. "8B4424448B4C241C403BC1894424440F8C6AFFFFFF0FAF4C24188B44241499F7F9894424148B44245899F7F9894424588B44246099F7F9894424608B4"
-		. "4241099F7F98944241033C03944241C894424540F8E7B0000008B7C241885FF7E688B4C24340FAFCE03C80FAF4C245C8B4424280FAFC68D530203CA8D"
-		. "0C818BC32BC283C003894424208BC32BC2408BEB894424242BEA0FB65424148B4424208814010FB65424580FB644246088118B5424248804110FB6442"
-		. "41088042983C10483EF0175D18B442454403B44241C894424547C855F5E5D33C05B83C438C3"
-		VarSetCapacity(PixelateBitmap, StrLen(MCode_PixelateBitmap)//2)
-		Loop % StrLen(MCode_PixelateBitmap)//2		;%
-			NumPut("0x" SubStr(MCode_PixelateBitmap, (2*A_Index)-1, 2), PixelateBitmap, A_Index-1, "char")
-	}
-
-	Gdip_GetImageDimensions(pBitmap, Width, Height)
-	if (Width != Gdip_GetImageWidth(pBitmapOut) || Height != Gdip_GetImageHeight(pBitmapOut))
-		return -1
-	if (BlockSize > Width || BlockSize > Height)
-		return -2
-
-	E1 := Gdip_LockBits(pBitmap, 0, 0, Width, Height, Stride1, Scan01, BitmapData1)
-	E2 := Gdip_LockBits(pBitmapOut, 0, 0, Width, Height, Stride2, Scan02, BitmapData2)
-	if (E1 || E2)
-		return -3
-
-	E := DllCall(&PixelateBitmap, "uint", Scan01, "uint", Scan02, "int", Width, "int", Height, "int", Stride1, "int", BlockSize)
-	Gdip_UnlockBits(pBitmap, BitmapData1), Gdip_UnlockBits(pBitmapOut, BitmapData2)
-	return 0
-}
-
-;#####################################################################################
-
-Gdip_ToARGB(A, R, G, B)
-{
-	return (A << 24) | (R << 16) | (G << 8) | B
-}
-
-;#####################################################################################
-
-Gdip_FromARGB(ARGB, ByRef A, ByRef R, ByRef G, ByRef B)
-{
-	A := (0xff000000 & ARGB) >> 24
-	R := (0x00ff0000 & ARGB) >> 16
-	G := (0x0000ff00 & ARGB) >> 8
-	B := 0x000000ff & ARGB
-}
-
-;#####################################################################################
-
-Gdip_AFromARGB(ARGB)
-{
-	return (0xff000000 & ARGB) >> 24
-}
-
-;#####################################################################################
-
-Gdip_RFromARGB(ARGB)
-{
-	return (0x00ff0000 & ARGB) >> 16
-}
-
-;#####################################################################################
-
-Gdip_GFromARGB(ARGB)
-{
-	return (0x0000ff00 & ARGB) >> 8
-}
-
-;#####################################################################################
-
-Gdip_BFromARGB(ARGB)
-{
-	return 0x000000ff & ARGB
+; Gdip standard library v1.45 by tic (Tariq Porter) 07/09/11
+;
+;#####################################################################################
+;#####################################################################################
+; STATUS ENUMERATION
+; Return values for functions specified to have status enumerated return type
+;#####################################################################################
+;
+; Ok =						= 0
+; GenericError				= 1
+; InvalidParameter			= 2
+; OutOfMemory				= 3
+; ObjectBusy				= 4
+; InsufficientBuffer		= 5
+; NotImplemented			= 6
+; Win32Error				= 7
+; WrongState				= 8
+; Aborted					= 9
+; FileNotFound				= 10
+; ValueOverflow				= 11
+; AccessDenied				= 12
+; UnknownImageFormat		= 13
+; FontFamilyNotFound		= 14
+; FontStyleNotFound			= 15
+; NotTrueTypeFont			= 16
+; UnsupportedGdiplusVersion	= 17
+; GdiplusNotInitialized		= 18
+; PropertyNotFound			= 19
+; PropertyNotSupported		= 20
+; ProfileNotFound			= 21
+;
+;#####################################################################################
+;#####################################################################################
+; FUNCTIONS
+;#####################################################################################
+;
+; UpdateLayeredWindow(hwnd, hdc, x="", y="", w="", h="", Alpha=255)
+; BitBlt(ddc, dx, dy, dw, dh, sdc, sx, sy, Raster="")
+; StretchBlt(dDC, dx, dy, dw, dh, sDC, sx, sy, sw, sh, Raster="")
+; SetImage(hwnd, hBitmap)
+; Gdip_BitmapFromScreen(Screen=0, Raster="")
+; CreateRectF(ByRef RectF, x, y, w, h)
+; CreateSizeF(ByRef SizeF, w, h)
+; CreateDIBSection
+;
+;#####################################################################################
+
+; Function:     			UpdateLayeredWindow
+; Description:  			Updates a layered window with the handle to the DC of a gdi bitmap
+; 
+; hwnd        				Handle of the layered window to update
+; hdc           			Handle to the DC of the GDI bitmap to update the window with
+; Layeredx      			x position to place the window
+; Layeredy      			y position to place the window
+; Layeredw      			Width of the window
+; Layeredh      			Height of the window
+; Alpha         			Default = 255 : The transparency (0-255) to set the window transparency
+;
+; return      				If the function succeeds, the return value is nonzero
+;
+; notes						If x or y omitted, then layered window will use its current coordinates
+;							If w or h omitted then current width and height will be used
+
+UpdateLayeredWindow(hwnd, hdc, x="", y="", w="", h="", Alpha=255)
+{
+	if ((x != "") && (y != ""))
+		VarSetCapacity(pt, 8), NumPut(x, pt, 0), NumPut(y, pt, 4)
+
+	if (w = "") ||(h = "")
+		WinGetPos,,, w, h, ahk_id %hwnd%
+   
+	return DllCall("UpdateLayeredWindow", "uint", hwnd, "uint", 0, "uint", ((x = "") && (y = "")) ? 0 : &pt
+	, "int64*", w|h<<32, "uint", hdc, "int64*", 0, "uint", 0, "uint*", Alpha<<16|1<<24, "uint", 2)
+}
+
+;#####################################################################################
+
+; Function				BitBlt
+; Description			The BitBlt function performs a bit-block transfer of the color data corresponding to a rectangle 
+;						of pixels from the specified source device context into a destination device context.
+;
+; dDC					handle to destination DC
+; dx					x-coord of destination upper-left corner
+; dy					y-coord of destination upper-left corner
+; dw					width of the area to copy
+; dh					height of the area to copy
+; sDC					handle to source DC
+; sx					x-coordinate of source upper-left corner
+; sy					y-coordinate of source upper-left corner
+; Raster				raster operation code
+;
+; return				If the function succeeds, the return value is nonzero
+;
+; notes					If no raster operation is specified, then SRCCOPY is used, which copies the source directly to the destination rectangle
+;
+; BLACKNESS				= 0x00000042
+; NOTSRCERASE			= 0x001100A6
+; NOTSRCCOPY			= 0x00330008
+; SRCERASE				= 0x00440328
+; DSTINVERT				= 0x00550009
+; PATINVERT				= 0x005A0049
+; SRCINVERT				= 0x00660046
+; SRCAND				= 0x008800C6
+; MERGEPAINT			= 0x00BB0226
+; MERGECOPY				= 0x00C000CA
+; SRCCOPY				= 0x00CC0020
+; SRCPAINT				= 0x00EE0086
+; PATCOPY				= 0x00F00021
+; PATPAINT				= 0x00FB0A09
+; WHITENESS				= 0x00FF0062
+; CAPTUREBLT			= 0x40000000
+; NOMIRRORBITMAP		= 0x80000000
+
+BitBlt(ddc, dx, dy, dw, dh, sdc, sx, sy, Raster="")
+{
+	return DllCall("gdi32\BitBlt", "uint", dDC, "int", dx, "int", dy, "int", dw, "int", dh
+	, "uint", sDC, "int", sx, "int", sy, "uint", Raster ? Raster : 0x00CC0020)
+}
+
+;#####################################################################################
+
+; Function				StretchBlt
+; Description			The StretchBlt function copies a bitmap from a source rectangle into a destination rectangle, 
+;						stretching or compressing the bitmap to fit the dimensions of the destination rectangle, if necessary.
+;						The system stretches or compresses the bitmap according to the stretching mode currently set in the destination device context.
+;
+; ddc					handle to destination DC
+; dx					x-coord of destination upper-left corner
+; dy					y-coord of destination upper-left corner
+; dw					width of destination rectangle
+; dh					height of destination rectangle
+; sdc					handle to source DC
+; sx					x-coordinate of source upper-left corner
+; sy					y-coordinate of source upper-left corner
+; sw					width of source rectangle
+; sh					height of source rectangle
+; Raster				raster operation code
+;
+; return				If the function succeeds, the return value is nonzero
+;
+; notes					If no raster operation is specified, then SRCCOPY is used. It uses the same raster operations as BitBlt		
+
+StretchBlt(ddc, dx, dy, dw, dh, sdc, sx, sy, sw, sh, Raster="")
+{
+	return DllCall("gdi32\StretchBlt", "uint", ddc, "int", dx, "int", dy, "int", dw, "int", dh
+	, "uint", sdc, "int", sx, "int", sy, "int", sw, "int", sh, "uint", Raster ? Raster : 0x00CC0020)
+}
+
+;#####################################################################################
+
+; Function				SetStretchBltMode
+; Description			The SetStretchBltMode function sets the bitmap stretching mode in the specified device context
+;
+; hdc					handle to the DC
+; iStretchMode			The stretching mode, describing how the target will be stretched
+;
+; return				If the function succeeds, the return value is the previous stretching mode. If it fails it will return 0
+;
+; STRETCH_ANDSCANS 		= 0x01
+; STRETCH_ORSCANS 		= 0x02
+; STRETCH_DELETESCANS 	= 0x03
+; STRETCH_HALFTONE 		= 0x04
+
+SetStretchBltMode(hdc, iStretchMode=4)
+{
+	return DllCall("gdi32\SetStretchBltMode", "uint", hdc, "int", iStretchMode)
+}
+
+;#####################################################################################
+
+; Function				SetImage
+; Description			Associates a new image with a static control
+;
+; hwnd					handle of the control to update
+; hBitmap				a gdi bitmap to associate the static control with
+;
+; return				If the function succeeds, the return value is nonzero
+
+SetImage(hwnd, hBitmap)
+{
+	SendMessage, 0x172, 0x0, hBitmap,, ahk_id %hwnd%
+	E := ErrorLevel
+	DeleteObject(E)
+	return E
+}
+
+;#####################################################################################
+
+; Function				SetSysColorToControl
+; Description			Sets a solid colour to a control
+;
+; hwnd					handle of the control to update
+; SysColor				A system colour to set to the control
+;
+; return				If the function succeeds, the return value is zero
+;
+; notes					A control must have the 0xE style set to it so it is recognised as a bitmap
+;						By default SysColor=15 is used which is COLOR_3DFACE. This is the standard background for a control
+;
+; COLOR_3DDKSHADOW				= 21
+; COLOR_3DFACE					= 15
+; COLOR_3DHIGHLIGHT				= 20
+; COLOR_3DHILIGHT				= 20
+; COLOR_3DLIGHT					= 22
+; COLOR_3DSHADOW				= 16
+; COLOR_ACTIVEBORDER			= 10
+; COLOR_ACTIVECAPTION			= 2
+; COLOR_APPWORKSPACE			= 12
+; COLOR_BACKGROUND				= 1
+; COLOR_BTNFACE					= 15
+; COLOR_BTNHIGHLIGHT			= 20
+; COLOR_BTNHILIGHT				= 20
+; COLOR_BTNSHADOW				= 16
+; COLOR_BTNTEXT					= 18
+; COLOR_CAPTIONTEXT				= 9
+; COLOR_DESKTOP					= 1
+; COLOR_GRADIENTACTIVECAPTION	= 27
+; COLOR_GRADIENTINACTIVECAPTION	= 28
+; COLOR_GRAYTEXT				= 17
+; COLOR_HIGHLIGHT				= 13
+; COLOR_HIGHLIGHTTEXT			= 14
+; COLOR_HOTLIGHT				= 26
+; COLOR_INACTIVEBORDER			= 11
+; COLOR_INACTIVECAPTION			= 3
+; COLOR_INACTIVECAPTIONTEXT		= 19
+; COLOR_INFOBK					= 24
+; COLOR_INFOTEXT				= 23
+; COLOR_MENU					= 4
+; COLOR_MENUHILIGHT				= 29
+; COLOR_MENUBAR					= 30
+; COLOR_MENUTEXT				= 7
+; COLOR_SCROLLBAR				= 0
+; COLOR_WINDOW					= 5
+; COLOR_WINDOWFRAME				= 6
+; COLOR_WINDOWTEXT				= 8
+
+SetSysColorToControl(hwnd, SysColor=15)
+{
+   WinGetPos,,, w, h, ahk_id %hwnd%
+   bc := DllCall("GetSysColor", "Int", SysColor)
+   pBrushClear := Gdip_BrushCreateSolid(0xff000000 | (bc >> 16 | bc & 0xff00 | (bc & 0xff) << 16))
+   pBitmap := Gdip_CreateBitmap(w, h), G := Gdip_GraphicsFromImage(pBitmap)
+   Gdip_FillRectangle(G, pBrushClear, 0, 0, w, h)
+   hBitmap := Gdip_CreateHBITMAPFromBitmap(pBitmap)
+   SetImage(hwnd, hBitmap)
+   Gdip_DeleteBrush(pBrushClear)
+   Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmap), DeleteObject(hBitmap)
+   return 0
+}
+
+;#####################################################################################
+
+; Function				Gdip_BitmapFromScreen
+; Description			Gets a gdi+ bitmap from the screen
+;
+; Screen				0 = All screens
+;						Any numerical value = Just that screen
+;						x|y|w|h = Take specific coordinates with a width and height
+; Raster				raster operation code
+;
+; return      			If the function succeeds, the return value is a pointer to a gdi+ bitmap
+;						-1:		one or more of x,y,w,h not passed properly
+;
+; notes					If no raster operation is specified, then SRCCOPY is used to the returned bitmap
+
+Gdip_BitmapFromScreen(Screen=0, Raster="")
+{
+	if (Screen = 0)
+	{
+		Sysget, x, 76
+		Sysget, y, 77	
+		Sysget, w, 78
+		Sysget, h, 79
+	}
+	else if (SubStr(Screen, 1, 5) = "hwnd:")
+	{
+		Screen := SubStr(Screen, 6)
+		if !WinExist( "ahk_id " Screen)
+			return -2
+		WinGetPos,,, w, h, ahk_id %Screen%
+		x := y := 0
+		hhdc := GetDCEx(Screen, 3)
+	}
+	else if (Screen&1 != "")
+	{
+		Sysget, M, Monitor, %Screen%
+		x := MLeft, y := MTop, w := MRight-MLeft, h := MBottom-MTop
+	}
+	else
+	{
+		StringSplit, S, Screen, |
+		x := S1, y := S2, w := S3, h := S4
+	}
+
+	if (x = "") || (y = "") || (w = "") || (h = "")
+		return -1
+
+	chdc := CreateCompatibleDC(), hbm := CreateDIBSection(w, h, chdc), obm := SelectObject(chdc, hbm), hhdc := hhdc ? hhdc : GetDC()
+	BitBlt(chdc, 0, 0, w, h, hhdc, x, y, Raster)
+	ReleaseDC(hhdc)
+	
+	pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm)
+	SelectObject(chdc, obm), DeleteObject(hbm), DeleteDC(hhdc), DeleteDC(chdc)
+	return pBitmap
+}
+
+;#####################################################################################
+
+; Function				Gdip_BitmapFromHWND
+; Description			Uses PrintWindow to get a handle to the specified window and return a bitmap from it
+;
+; hwnd					handle to the window to get a bitmap from
+;
+; return				If the function succeeds, the return value is a pointer to a gdi+ bitmap
+;
+; notes					Window must not be not minimised in order to get a handle to it's client area
+
+Gdip_BitmapFromHWND(hwnd)
+{
+	WinGetPos,,, Width, Height, ahk_id %hwnd%
+	hbm := CreateDIBSection(Width, Height), hdc := CreateCompatibleDC(), obm := SelectObject(hdc, hbm)
+	PrintWindow(hwnd, hdc)
+	pBitmap := Gdip_CreateBitmapFromHBITMAP(hbm)
+	SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
+	return pBitmap
+}
+
+;#####################################################################################
+
+; Function    			CreateRectF
+; Description			Creates a RectF object, containing a the coordinates and dimensions of a rectangle
+;
+; RectF       			Name to call the RectF object
+; x            			x-coordinate of the upper left corner of the rectangle
+; y            			y-coordinate of the upper left corner of the rectangle
+; w            			Width of the rectangle
+; h            			Height of the rectangle
+;
+; return      			No return value
+
+CreateRectF(ByRef RectF, x, y, w, h)
+{
+   VarSetCapacity(RectF, 16)
+   NumPut(x, RectF, 0, "float"), NumPut(y, RectF, 4, "float"), NumPut(w, RectF, 8, "float"), NumPut(h, RectF, 12, "float")
+}
+
+;#####################################################################################
+
+; Function    			CreateRect
+; Description			Creates a Rect object, containing a the coordinates and dimensions of a rectangle
+;
+; RectF       			Name to call the RectF object
+; x            			x-coordinate of the upper left corner of the rectangle
+; y            			y-coordinate of the upper left corner of the rectangle
+; w            			Width of the rectangle
+; h            			Height of the rectangle
+;
+; return      			No return value
+
+CreateRect(ByRef Rect, x, y, w, h)
+{
+	VarSetCapacity(Rect, 16)
+	NumPut(x, Rect, 0, "uint"), NumPut(y, Rect, 4, "uint"), NumPut(w, Rect, 8, "uint"), NumPut(h, Rect, 12, "uint")
+}
+;#####################################################################################
+
+; Function		    	CreateSizeF
+; Description			Creates a SizeF object, containing an 2 values
+;
+; SizeF         		Name to call the SizeF object
+; w            			w-value for the SizeF object
+; h            			h-value for the SizeF object
+;
+; return      			No Return value
+
+CreateSizeF(ByRef SizeF, w, h)
+{
+   VarSetCapacity(SizeF, 8)
+   NumPut(w, SizeF, 0, "float"), NumPut(h, SizeF, 4, "float")     
+}
+;#####################################################################################
+
+; Function		    	CreatePointF
+; Description			Creates a SizeF object, containing an 2 values
+;
+; SizeF         		Name to call the SizeF object
+; w            			w-value for the SizeF object
+; h            			h-value for the SizeF object
+;
+; return      			No Return value
+
+CreatePointF(ByRef PointF, x, y)
+{
+   VarSetCapacity(PointF, 8)
+   NumPut(x, PointF, 0, "float"), NumPut(y, PointF, 4, "float")     
+}
+;#####################################################################################
+
+; Function				CreateDIBSection
+; Description			The CreateDIBSection function creates a DIB (Device Independent Bitmap) that applications can write to directly
+;
+; w						width of the bitmap to create
+; h						height of the bitmap to create
+; hdc					a handle to the device context to use the palette from
+; bpp					bits per pixel (32 = ARGB)
+; ppvBits				A pointer to a variable that receives a pointer to the location of the DIB bit values
+;
+; return				returns a DIB. A gdi bitmap
+;
+; notes					ppvBits will receive the location of the pixels in the DIB
+
+CreateDIBSection(w, h, hdc="", bpp=32, ByRef ppvBits=0)
+{
+	hdc2 := hdc ? hdc : GetDC()
+	VarSetCapacity(bi, 40, 0)
+	NumPut(w, bi, 4), NumPut(h, bi, 8), NumPut(40, bi, 0), NumPut(1, bi, 12, "ushort"), NumPut(0, bi, 16), NumPut(bpp, bi, 14, "ushort")
+	hbm := DllCall("CreateDIBSection", "uint" , hdc2, "uint" , &bi, "uint" , 0, "uint*", ppvBits, "uint" , 0, "uint" , 0)
+
+	if !hdc
+		ReleaseDC(hdc2)
+	return hbm
+}
+
+;#####################################################################################
+
+; Function				PrintWindow
+; Description			The PrintWindow function copies a visual window into the specified device context (DC), typically a printer DC
+;
+; hwnd					A handle to the window that will be copied
+; hdc					A handle to the device context
+; Flags					Drawing options
+;
+; return				If the function succeeds, it returns a nonzero value
+;
+; PW_CLIENTONLY			= 1
+
+PrintWindow(hwnd, hdc, Flags=0)
+{
+	return DllCall("PrintWindow", "uint", hwnd, "uint", hdc, "uint", Flags)
+}
+
+;#####################################################################################
+
+; Function				DestroyIcon
+; Description			Destroys an icon and frees any memory the icon occupied
+;
+; hIcon					Handle to the icon to be destroyed. The icon must not be in use
+;
+; return				If the function succeeds, the return value is nonzero
+
+DestroyIcon(hIcon)
+{
+   return DllCall("DestroyIcon", "uint", hIcon)
+}
+
+;#####################################################################################
+
+PaintDesktop(hdc)
+{
+	return DllCall("PaintDesktop", "uint", hdc)
+}
+
+;#####################################################################################
+
+CreateCompatibleBitmap(hdc, w, h)
+{
+	return DllCall("gdi32\CreateCompatibleBitmap", "uint", hdc, "int", w, "int", h)
+}
+
+;#####################################################################################
+
+; Function				CreateCompatibleDC
+; Description			This function creates a memory device context (DC) compatible with the specified device
+;
+; hdc					Handle to an existing device context					
+;
+; return				returns the handle to a device context or 0 on failure
+;
+; notes					If this handle is 0 (by default), the function creates a memory device context compatible with the application's current screen
+
+CreateCompatibleDC(hdc=0)
+{
+   return DllCall("CreateCompatibleDC", "uint", hdc)
+}
+
+;#####################################################################################
+
+; Function				SelectObject
+; Description			The SelectObject function selects an object into the specified device context (DC). The new object replaces the previous object of the same type
+;
+; hdc					Handle to a DC
+; hgdiobj				A handle to the object to be selected into the DC
+;
+; return				If the selected object is not a region and the function succeeds, the return value is a handle to the object being replaced
+;
+; notes					The specified object must have been created by using one of the following functions
+;						Bitmap - CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDIBSection (A single bitmap cannot be selected into more than one DC at the same time)
+;						Brush - CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush
+;						Font - CreateFont, CreateFontIndirect
+;						Pen - CreatePen, CreatePenIndirect
+;						Region - CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect
+;
+; notes					If the selected object is a region and the function succeeds, the return value is one of the following value
+;
+; SIMPLEREGION			= 2 Region consists of a single rectangle
+; COMPLEXREGION			= 3 Region consists of more than one rectangle
+; NULLREGION			= 1 Region is empty
+
+SelectObject(hdc, hgdiobj)
+{
+   return DllCall("SelectObject", "uint", hdc, "uint", hgdiobj)
+}
+
+;#####################################################################################
+
+; Function				DeleteObject
+; Description			This function deletes a logical pen, brush, font, bitmap, region, or palette, freeing all system resources associated with the object
+;						After the object is deleted, the specified handle is no longer valid
+;
+; hObject				Handle to a logical pen, brush, font, bitmap, region, or palette to delete
+;
+; return				Nonzero indicates success. Zero indicates that the specified handle is not valid or that the handle is currently selected into a device context
+
+DeleteObject(hObject)
+{
+   return DllCall("DeleteObject", "uint", hObject)
+}
+
+;#####################################################################################
+
+; Function				GetDC
+; Description			This function retrieves a handle to a display device context (DC) for the client area of the specified window.
+;						The display device context can be used in subsequent graphics display interface (GDI) functions to draw in the client area of the window. 
+;
+; hwnd					Handle to the window whose device context is to be retrieved. If this value is NULL, GetDC retrieves the device context for the entire screen					
+;
+; return				The handle the device context for the specified window's client area indicates success. NULL indicates failure
+
+GetDC(hwnd=0)
+{
+	return DllCall("GetDC", "uint", hwnd)
+}
+
+;#####################################################################################
+
+; DCX_CACHE = 0x2
+; DCX_CLIPCHILDREN = 0x8
+; DCX_CLIPSIBLINGS = 0x10
+; DCX_EXCLUDERGN = 0x40
+; DCX_EXCLUDEUPDATE = 0x100
+; DCX_INTERSECTRGN = 0x80
+; DCX_INTERSECTUPDATE = 0x200
+; DCX_LOCKWINDOWUPDATE = 0x400
+; DCX_NORECOMPUTE = 0x100000
+; DCX_NORESETATTRS = 0x4
+; DCX_PARENTCLIP = 0x20
+; DCX_VALIDATE = 0x200000
+; DCX_WINDOW = 0x1
+
+GetDCEx(hwnd, flags=0, hrgnClip=0)
+{
+    return DllCall("GetDCEx", "uint", hwnd, "uint", hrgnClip, "int", flags)
+}
+
+;#####################################################################################
+
+; Function				ReleaseDC
+; Description			This function releases a device context (DC), freeing it for use by other applications. The effect of ReleaseDC depends on the type of device context
+;
+; hdc					Handle to the device context to be released
+; hwnd					Handle to the window whose device context is to be released
+;
+; return				1 = released
+;						0 = not released
+;
+; notes					The application must call the ReleaseDC function for each call to the GetWindowDC function and for each call to the GetDC function that retrieves a common device context
+;						An application cannot use the ReleaseDC function to release a device context that was created by calling the CreateDC function; instead, it must use the DeleteDC function. 
+
+ReleaseDC(hdc, hwnd=0)
+{
+   return DllCall("ReleaseDC", "uint", hwnd, "uint", hdc)
+}
+
+;#####################################################################################
+
+; Function				DeleteDC
+; Description			The DeleteDC function deletes the specified device context (DC)
+;
+; hdc					A handle to the device context
+;
+; return				If the function succeeds, the return value is nonzero
+;
+; notes					An application must not delete a DC whose handle was obtained by calling the GetDC function. Instead, it must call the ReleaseDC function to free the DC
+
+DeleteDC(hdc)
+{
+   return DllCall("DeleteDC", "uint", hdc)
+}
+;#####################################################################################
+
+; Function				Gdip_LibraryVersion
+; Description			Get the current library version
+;
+; return				the library version
+;
+; notes					This is useful for non compiled programs to ensure that a person doesn't run an old version when testing your scripts
+
+Gdip_LibraryVersion()
+{
+	return 1.45
+}
+
+;#####################################################################################
+
+; Function:    			Gdip_BitmapFromBRA
+; Description: 			Gets a pointer to a gdi+ bitmap from a BRA file
+;
+; BRAFromMemIn			The variable for a BRA file read to memory
+; File					The name of the file, or its number that you would like (This depends on alternate parameter)
+; Alternate				Changes whether the File parameter is the file name or its number
+;
+; return      			If the function succeeds, the return value is a pointer to a gdi+ bitmap
+;						-1 = The BRA variable is empty
+;						-2 = The BRA has an incorrect header
+;						-3 = The BRA has information missing
+;						-4 = Could not find file inside the BRA
+
+Gdip_BitmapFromBRA(ByRef BRAFromMemIn, File, Alternate=0)
+{
+	if !BRAFromMemIn
+		return -1
+	Loop, Parse, BRAFromMemIn, `n
+	{
+		if (A_Index = 1)
+		{
+			StringSplit, Header, A_LoopField, |
+			if (Header0 != 4 || Header2 != "BRA!")
+				return -2
+		}
+		else if (A_Index = 2)
+		{
+			StringSplit, Info, A_LoopField, |
+			if (Info0 != 3)
+				return -3
+		}
+		else
+			break
+	}
+	if !Alternate
+		StringReplace, File, File, \, \\, All
+	RegExMatch(BRAFromMemIn, "mi`n)^" (Alternate ? File "\|.+?\|(\d+)\|(\d+)" : "\d+\|" File "\|(\d+)\|(\d+)") "$", FileInfo)
+	if !FileInfo
+		return -4
+
+	hData := DllCall("GlobalAlloc", "uint", 2, "uint", FileInfo2)
+	pData := DllCall("GlobalLock", "uint", hData)
+	DllCall("RtlMoveMemory", "uint", pData, "uint", &BRAFromMemIn+Info2+FileInfo1, "uint", FileInfo2)
+	DllCall("GlobalUnlock", "uint", hData)
+	DllCall("ole32\CreateStreamOnHGlobal", "uint", hData, "int", 1, "uint*", pStream)
+	DllCall("gdiplus\GdipCreateBitmapFromStream", "uint", pStream, "uint*", pBitmap)
+	DllCall(NumGet(NumGet(1*pStream)+8), "uint", pStream)
+	return pBitmap
+}
+
+;#####################################################################################
+
+; Function				Gdip_DrawRectangle
+; Description			This function uses a pen to draw the outline of a rectangle into the Graphics of a bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pPen					Pointer to a pen
+; x						x-coordinate of the top left of the rectangle
+; y						y-coordinate of the top left of the rectangle
+; w						width of the rectanlge
+; h						height of the rectangle
+;
+; return				status enumeration. 0 = success
+;
+; notes					as all coordinates are taken from the top left of each pixel, then the entire width/height should be specified as subtracting the pen width
+
+Gdip_DrawRectangle(pGraphics, pPen, x, y, w, h)
+{
+   return DllCall("gdiplus\GdipDrawRectangle", "uint", pGraphics, "uint", pPen, "float", x, "float", y, "float", w, "float", h)
+}
+
+;#####################################################################################
+
+; Function				Gdip_DrawRoundedRectangle
+; Description			This function uses a pen to draw the outline of a rounded rectangle into the Graphics of a bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pPen					Pointer to a pen
+; x						x-coordinate of the top left of the rounded rectangle
+; y						y-coordinate of the top left of the rounded rectangle
+; w						width of the rectanlge
+; h						height of the rectangle
+; r						radius of the rounded corners
+;
+; return				status enumeration. 0 = success
+;
+; notes					as all coordinates are taken from the top left of each pixel, then the entire width/height should be specified as subtracting the pen width
+
+Gdip_DrawRoundedRectangle(pGraphics, pPen, x, y, w, h, r)
+{
+	Gdip_SetClipRect(pGraphics, x-r, y-r, 2*r, 2*r, 4)
+	Gdip_SetClipRect(pGraphics, x+w-r, y-r, 2*r, 2*r, 4)
+	Gdip_SetClipRect(pGraphics, x-r, y+h-r, 2*r, 2*r, 4)
+	Gdip_SetClipRect(pGraphics, x+w-r, y+h-r, 2*r, 2*r, 4)
+	E := Gdip_DrawRectangle(pGraphics, pPen, x, y, w, h)
+	Gdip_ResetClip(pGraphics)
+	Gdip_SetClipRect(pGraphics, x-(2*r), y+r, w+(4*r), h-(2*r), 4)
+	Gdip_SetClipRect(pGraphics, x+r, y-(2*r), w-(2*r), h+(4*r), 4)
+	Gdip_DrawEllipse(pGraphics, pPen, x, y, 2*r, 2*r)
+	Gdip_DrawEllipse(pGraphics, pPen, x+w-(2*r), y, 2*r, 2*r)
+	Gdip_DrawEllipse(pGraphics, pPen, x, y+h-(2*r), 2*r, 2*r)
+	Gdip_DrawEllipse(pGraphics, pPen, x+w-(2*r), y+h-(2*r), 2*r, 2*r)
+	Gdip_ResetClip(pGraphics)
+	return E
+}
+
+;#####################################################################################
+
+; Function				Gdip_DrawEllipse
+; Description			This function uses a pen to draw the outline of an ellipse into the Graphics of a bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pPen					Pointer to a pen
+; x						x-coordinate of the top left of the rectangle the ellipse will be drawn into
+; y						y-coordinate of the top left of the rectangle the ellipse will be drawn into
+; w						width of the ellipse
+; h						height of the ellipse
+;
+; return				status enumeration. 0 = success
+;
+; notes					as all coordinates are taken from the top left of each pixel, then the entire width/height should be specified as subtracting the pen width
+
+Gdip_DrawEllipse(pGraphics, pPen, x, y, w, h)
+{
+   return DllCall("gdiplus\GdipDrawEllipse", "uint", pGraphics, "uint", pPen, "float", x, "float", y, "float", w, "float", h)
+}
+
+;#####################################################################################
+
+; Function				Gdip_DrawBezier
+; Description			This function uses a pen to draw the outline of a bezier (a weighted curve) into the Graphics of a bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pPen					Pointer to a pen
+; x1					x-coordinate of the start of the bezier
+; y1					y-coordinate of the start of the bezier
+; x2					x-coordinate of the first arc of the bezier
+; y2					y-coordinate of the first arc of the bezier
+; x3					x-coordinate of the second arc of the bezier
+; y3					y-coordinate of the second arc of the bezier
+; x4					x-coordinate of the end of the bezier
+; y4					y-coordinate of the end of the bezier
+;
+; return				status enumeration. 0 = success
+;
+; notes					as all coordinates are taken from the top left of each pixel, then the entire width/height should be specified as subtracting the pen width
+
+Gdip_DrawBezier(pGraphics, pPen, x1, y1, x2, y2, x3, y3, x4, y4)
+{
+   return DllCall("gdiplus\GdipDrawBezier", "uint", pgraphics, "uint", pPen
+   , "float", x1, "float", y1, "float", x2, "float", y2
+   , "float", x3, "float", y3, "float", x4, "float", y4)
+}
+
+;#####################################################################################
+
+; Function				Gdip_DrawArc
+; Description			This function uses a pen to draw the outline of an arc into the Graphics of a bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pPen					Pointer to a pen
+; x						x-coordinate of the start of the arc
+; y						y-coordinate of the start of the arc
+; w						width of the arc
+; h						height of the arc
+; StartAngle			specifies the angle between the x-axis and the starting point of the arc
+; SweepAngle			specifies the angle between the starting and ending points of the arc
+;
+; return				status enumeration. 0 = success
+;
+; notes					as all coordinates are taken from the top left of each pixel, then the entire width/height should be specified as subtracting the pen width
+
+Gdip_DrawArc(pGraphics, pPen, x, y, w, h, StartAngle, SweepAngle)
+{
+   return DllCall("gdiplus\GdipDrawArc", "uint", pGraphics, "uint", pPen, "float", x
+   , "float", y, "float", w, "float", h, "float", StartAngle, "float", SweepAngle)
+}
+
+;#####################################################################################
+
+; Function				Gdip_DrawPie
+; Description			This function uses a pen to draw the outline of a pie into the Graphics of a bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pPen					Pointer to a pen
+; x						x-coordinate of the start of the pie
+; y						y-coordinate of the start of the pie
+; w						width of the pie
+; h						height of the pie
+; StartAngle			specifies the angle between the x-axis and the starting point of the pie
+; SweepAngle			specifies the angle between the starting and ending points of the pie
+;
+; return				status enumeration. 0 = success
+;
+; notes					as all coordinates are taken from the top left of each pixel, then the entire width/height should be specified as subtracting the pen width
+
+Gdip_DrawPie(pGraphics, pPen, x, y, w, h, StartAngle, SweepAngle)
+{
+   return DllCall("gdiplus\GdipDrawPie", "uint", pGraphics, "uint", pPen, "float", x, "float", y, "float", w, "float", h, "float", StartAngle, "float", SweepAngle)
+}
+
+;#####################################################################################
+
+; Function				Gdip_DrawLine
+; Description			This function uses a pen to draw a line into the Graphics of a bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pPen					Pointer to a pen
+; x1					x-coordinate of the start of the line
+; y1					y-coordinate of the start of the line
+; x2					x-coordinate of the end of the line
+; y2					y-coordinate of the end of the line
+;
+; return				status enumeration. 0 = success		
+
+Gdip_DrawLine(pGraphics, pPen, x1, y1, x2, y2)
+{
+   return DllCall("gdiplus\GdipDrawLine", "uint", pGraphics, "uint", pPen
+   , "float", x1, "float", y1, "float", x2, "float", y2)
+}
+
+;#####################################################################################
+
+; Function				Gdip_DrawLines
+; Description			This function uses a pen to draw a series of joined lines into the Graphics of a bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pPen					Pointer to a pen
+; Points				the coordinates of all the points passed as x1,y1|x2,y2|x3,y3.....
+;
+; return				status enumeration. 0 = success				
+
+Gdip_DrawLines(pGraphics, pPen, Points)
+{
+   StringSplit, Points, Points, |
+   VarSetCapacity(PointF, 8*Points0)   
+   Loop, %Points0%
+   {
+      StringSplit, Coord, Points%A_Index%, `,
+      NumPut(Coord1, PointF, 8*(A_Index-1), "float"), NumPut(Coord2, PointF, (8*(A_Index-1))+4, "float")
+   }
+   return DllCall("gdiplus\GdipDrawLines", "uint", pGraphics, "uint", pPen, "uint", &PointF, "int", Points0)
+}
+
+;#####################################################################################
+
+; Function				Gdip_FillRectangle
+; Description			This function uses a brush to fill a rectangle in the Graphics of a bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pBrush				Pointer to a brush
+; x						x-coordinate of the top left of the rectangle
+; y						y-coordinate of the top left of the rectangle
+; w						width of the rectanlge
+; h						height of the rectangle
+;
+; return				status enumeration. 0 = success
+
+Gdip_FillRectangle(pGraphics, pBrush, x, y, w, h)
+{
+   return DllCall("gdiplus\GdipFillRectangle", "uint", pGraphics, "int", pBrush
+   , "float", x, "float", y, "float", w, "float", h)
+}
+
+;#####################################################################################
+
+; Function				Gdip_FillRoundedRectangle
+; Description			This function uses a brush to fill a rounded rectangle in the Graphics of a bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pBrush				Pointer to a brush
+; x						x-coordinate of the top left of the rounded rectangle
+; y						y-coordinate of the top left of the rounded rectangle
+; w						width of the rectanlge
+; h						height of the rectangle
+; r						radius of the rounded corners
+;
+; return				status enumeration. 0 = success
+
+Gdip_FillRoundedRectangle(pGraphics, pBrush, x, y, w, h, r)
+{
+	Region := Gdip_GetClipRegion(pGraphics)
+	Gdip_SetClipRect(pGraphics, x-r, y-r, 2*r, 2*r, 4)
+	Gdip_SetClipRect(pGraphics, x+w-r, y-r, 2*r, 2*r, 4)
+	Gdip_SetClipRect(pGraphics, x-r, y+h-r, 2*r, 2*r, 4)
+	Gdip_SetClipRect(pGraphics, x+w-r, y+h-r, 2*r, 2*r, 4)
+	E := Gdip_FillRectangle(pGraphics, pBrush, x, y, w, h)
+	Gdip_SetClipRegion(pGraphics, Region, 0)
+	Gdip_SetClipRect(pGraphics, x-(2*r), y+r, w+(4*r), h-(2*r), 4)
+	Gdip_SetClipRect(pGraphics, x+r, y-(2*r), w-(2*r), h+(4*r), 4)
+	Gdip_FillEllipse(pGraphics, pBrush, x, y, 2*r, 2*r)
+	Gdip_FillEllipse(pGraphics, pBrush, x+w-(2*r), y, 2*r, 2*r)
+	Gdip_FillEllipse(pGraphics, pBrush, x, y+h-(2*r), 2*r, 2*r)
+	Gdip_FillEllipse(pGraphics, pBrush, x+w-(2*r), y+h-(2*r), 2*r, 2*r)
+	Gdip_SetClipRegion(pGraphics, Region, 0)
+	Gdip_DeleteRegion(Region)
+	return E
+}
+
+;#####################################################################################
+
+; Function				Gdip_FillPolygon
+; Description			This function uses a brush to fill a polygon in the Graphics of a bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pBrush				Pointer to a brush
+; Points				the coordinates of all the points passed as x1,y1|x2,y2|x3,y3.....
+;
+; return				status enumeration. 0 = success
+;
+; notes					Alternate will fill the polygon as a whole, wheras winding will fill each new "segment"
+; Alternate 			= 0
+; Winding 				= 1
+
+Gdip_FillPolygon(pGraphics, pBrush, Points, FillMode=0)
+{
+   StringSplit, Points, Points, |
+   VarSetCapacity(PointF, 8*Points0)   
+   Loop, %Points0%
+   {
+      StringSplit, Coord, Points%A_Index%, `,
+      NumPut(Coord1, PointF, 8*(A_Index-1), "float"), NumPut(Coord2, PointF, (8*(A_Index-1))+4, "float")
+   }   
+   return DllCall("gdiplus\GdipFillPolygon", "uint", pGraphics, "uint", pBrush, "uint", &PointF, "int", Points0, "int", FillMode)
+}
+
+;#####################################################################################
+
+; Function				Gdip_FillPie
+; Description			This function uses a brush to fill a pie in the Graphics of a bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pBrush				Pointer to a brush
+; x						x-coordinate of the top left of the pie
+; y						y-coordinate of the top left of the pie
+; w						width of the pie
+; h						height of the pie
+; StartAngle			specifies the angle between the x-axis and the starting point of the pie
+; SweepAngle			specifies the angle between the starting and ending points of the pie
+;
+; return				status enumeration. 0 = success
+
+Gdip_FillPie(pGraphics, pBrush, x, y, w, h, StartAngle, SweepAngle)
+{
+   return DllCall("gdiplus\GdipFillPie", "uint", pGraphics, "uint", pBrush
+   , "float", x, "float", y, "float", w, "float", h, "float", StartAngle, "float", SweepAngle)
+}
+
+;#####################################################################################
+
+; Function				Gdip_FillEllipse
+; Description			This function uses a brush to fill an ellipse in the Graphics of a bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pBrush				Pointer to a brush
+; x						x-coordinate of the top left of the ellipse
+; y						y-coordinate of the top left of the ellipse
+; w						width of the ellipse
+; h						height of the ellipse
+;
+; return				status enumeration. 0 = success
+
+Gdip_FillEllipse(pGraphics, pBrush, x, y, w, h)
+{
+	return DllCall("gdiplus\GdipFillEllipse", "uint", pGraphics, "uint", pBrush, "float", x, "float", y, "float", w, "float", h)
+}
+
+;#####################################################################################
+
+; Function				Gdip_FillRegion
+; Description			This function uses a brush to fill a region in the Graphics of a bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pBrush				Pointer to a brush
+; Region				Pointer to a Region
+;
+; return				status enumeration. 0 = success
+;
+; notes					You can create a region Gdip_CreateRegion() and then add to this
+
+Gdip_FillRegion(pGraphics, pBrush, Region)
+{
+	return DllCall("gdiplus\GdipFillRegion", "uint", pGraphics, "uint", pBrush, "uint", Region)
+}
+
+;#####################################################################################
+
+; Function				Gdip_FillPath
+; Description			This function uses a brush to fill a path in the Graphics of a bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pBrush				Pointer to a brush
+; Region				Pointer to a Path
+;
+; return				status enumeration. 0 = success
+
+Gdip_FillPath(pGraphics, pBrush, Path)
+{
+	return DllCall("gdiplus\GdipFillPath", "uint", pGraphics, "uint", pBrush, "uint", Path)
+}
+
+;#####################################################################################
+
+; Function				Gdip_DrawImagePointsRect
+; Description			This function draws a bitmap into the Graphics of another bitmap and skews it
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pBitmap				Pointer to a bitmap to be drawn
+; Points				Points passed as x1,y1|x2,y2|x3,y3 (3 points: top left, top right, bottom left) describing the drawing of the bitmap
+; sx					x-coordinate of source upper-left corner
+; sy					y-coordinate of source upper-left corner
+; sw					width of source rectangle
+; sh					height of source rectangle
+; Matrix				a matrix used to alter image attributes when drawing
+;
+; return				status enumeration. 0 = success
+;
+; notes					if sx,sy,sw,sh are missed then the entire source bitmap will be used
+;						Matrix can be omitted to just draw with no alteration to ARGB
+;						Matrix may be passed as a digit from 0 - 1 to change just transparency
+;						Matrix can be passed as a matrix with any delimiter
+
+Gdip_DrawImagePointsRect(pGraphics, pBitmap, Points, sx="", sy="", sw="", sh="", Matrix=1)
+{
+	StringSplit, Points, Points, |
+	VarSetCapacity(PointF, 8*Points0)   
+	Loop, %Points0%
+	{
+		StringSplit, Coord, Points%A_Index%, `,
+		NumPut(Coord1, PointF, 8*(A_Index-1), "float"), NumPut(Coord2, PointF, (8*(A_Index-1))+4, "float")
+	}
+
+	if (Matrix&1 = "")
+		ImageAttr := Gdip_SetImageAttributesColorMatrix(Matrix)
+	else if (Matrix != 1)
+		ImageAttr := Gdip_SetImageAttributesColorMatrix("1|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|" Matrix "|0|0|0|0|0|1")
+		
+	if (sx = "" && sy = "" && sw = "" && sh = "")
+	{
+		sx := 0, sy := 0
+		sw := Gdip_GetImageWidth(pBitmap)
+		sh := Gdip_GetImageHeight(pBitmap)
+	}
+
+	E := DllCall("gdiplus\GdipDrawImagePointsRect", "uint", pGraphics, "uint", pBitmap
+	, "uint", &PointF, "int", Points0, "float", sx, "float", sy, "float", sw, "float", sh
+	, "int", 2, "uint", ImageAttr, "uint", 0, "uint", 0)
+	if ImageAttr
+		Gdip_DisposeImageAttributes(ImageAttr)
+	return E
+}
+
+;#####################################################################################
+
+; Function				Gdip_DrawImage
+; Description			This function draws a bitmap into the Graphics of another bitmap
+;
+; pGraphics				Pointer to the Graphics of a bitmap
+; pBitmap				Pointer to a bitmap to be drawn
+; dx					x-coord of destination upper-left corner
+; dy					y-coord of destination upper-left corner
+; dw					width of destination image
+; dh					height of destination image
+; sx					x-coordinate of source upper-left corner
+; sy					y-coordinate of source upper-left corner
+; sw					width of source image
+; sh					height of source image
+; Matrix				a matrix used to alter image attributes when drawing
+;
+; return				status enumeration. 0 = success
+;
+; notes					if sx,sy,sw,sh are missed then the entire source bitmap will be used
+;						Gdip_DrawImage performs faster
+;						Matrix can be omitted to just draw with no alteration to ARGB
+;						Matrix may be passed as a digit from 0 - 1 to change just transparency
+;						Matrix can be passed as a matrix with any delimiter. For example:
+;						MatrixBright=
+;						(
+;						1.5		|0		|0		|0		|0
+;						0		|1.5	|0		|0		|0
+;						0		|0		|1.5	|0		|0
+;						0		|0		|0		|1		|0
+;						0.05	|0.05	|0.05	|0		|1
+;						)
+;
+; notes					MatrixBright = 1.5|0|0|0|0|0|1.5|0|0|0|0|0|1.5|0|0|0|0|0|1|0|0.05|0.05|0.05|0|1
+;						MatrixGreyScale = 0.299|0.299|0.299|0|0|0.587|0.587|0.587|0|0|0.114|0.114|0.114|0|0|0|0|0|1|0|0|0|0|0|1
+;						MatrixNegative = -1|0|0|0|0|0|-1|0|0|0|0|0|-1|0|0|0|0|0|1|0|0|0|0|0|1
+
+Gdip_DrawImage(pGraphics, pBitmap, dx="", dy="", dw="", dh="", sx="", sy="", sw="", sh="", Matrix=1)
+{
+	if (Matrix&1 = "")
+		ImageAttr := Gdip_SetImageAttributesColorMatrix(Matrix)
+	else if (Matrix != 1)
+		ImageAttr := Gdip_SetImageAttributesColorMatrix("1|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|" Matrix "|0|0|0|0|0|1")
+
+	if (sx = "" && sy = "" && sw = "" && sh = "")
+	{
+		if (dx = "" && dy = "" && dw = "" && dh = "")
+		{
+			sx := dx := 0, sy := dy := 0
+			sw := dw := Gdip_GetImageWidth(pBitmap)
+			sh := dh := Gdip_GetImageHeight(pBitmap)
+		}
+		else
+		{
+			sx := sy := 0
+			sw := Gdip_GetImageWidth(pBitmap)
+			sh := Gdip_GetImageHeight(pBitmap)
+		}
+	}
+
+	E := DllCall("gdiplus\GdipDrawImageRectRect", "uint", pGraphics, "uint", pBitmap
+	, "float", dx, "float", dy, "float", dw, "float", dh
+	, "float", sx, "float", sy, "float", sw, "float", sh
+	, "int", 2, "uint", ImageAttr, "uint", 0, "uint", 0)
+	if ImageAttr
+		Gdip_DisposeImageAttributes(ImageAttr)
+	return E
+}
+
+;#####################################################################################
+
+; Function				Gdip_SetImageAttributesColorMatrix
+; Description			This function creates an image matrix ready for drawing
+;
+; Matrix				a matrix used to alter image attributes when drawing
+;						passed with any delimeter
+;
+; return				returns an image matrix on sucess or 0 if it fails
+;
+; notes					MatrixBright = 1.5|0|0|0|0|0|1.5|0|0|0|0|0|1.5|0|0|0|0|0|1|0|0.05|0.05|0.05|0|1
+;						MatrixGreyScale = 0.299|0.299|0.299|0|0|0.587|0.587|0.587|0|0|0.114|0.114|0.114|0|0|0|0|0|1|0|0|0|0|0|1
+;						MatrixNegative = -1|0|0|0|0|0|-1|0|0|0|0|0|-1|0|0|0|0|0|1|0|0|0|0|0|1
+
+Gdip_SetImageAttributesColorMatrix(Matrix)
+{
+	VarSetCapacity(ColourMatrix, 100, 0)
+	Matrix := RegExReplace(RegExReplace(Matrix, "^[^\d-\.]+([\d\.])", "$1", "", 1), "[^\d-\.]+", "|")
+	StringSplit, Matrix, Matrix, |
+	Loop, 25
+	{
+		Matrix := (Matrix%A_Index% != "") ? Matrix%A_Index% : Mod(A_Index-1, 6) ? 0 : 1
+		NumPut(Matrix, ColourMatrix, (A_Index-1)*4, "float")
+	}
+	DllCall("gdiplus\GdipCreateImageAttributes", "uint*", ImageAttr)
+	DllCall("gdiplus\GdipSetImageAttributesColorMatrix", "uint", ImageAttr, "int", 1, "int", 1, "uint", &ColourMatrix, "int", 0, "int", 0)
+	return ImageAttr
+}
+
+;#####################################################################################
+
+; Function				Gdip_GraphicsFromImage
+; Description			This function gets the graphics for a bitmap used for drawing functions
+;
+; pBitmap				Pointer to a bitmap to get the pointer to its graphics
+;
+; return				returns a pointer to the graphics of a bitmap
+;
+; notes					a bitmap can be drawn into the graphics of another bitmap
+
+Gdip_GraphicsFromImage(pBitmap)
+{
+    DllCall("gdiplus\GdipGetImageGraphicsContext", "uint", pBitmap, "uint*", pGraphics)
+    return pGraphics
+}
+
+;#####################################################################################
+
+; Function				Gdip_GraphicsFromHDC
+; Description			This function gets the graphics from the handle to a device context
+;
+; hdc					This is the handle to the device context
+;
+; return				returns a pointer to the graphics of a bitmap
+;
+; notes					You can draw a bitmap into the graphics of another bitmap
+
+Gdip_GraphicsFromHDC(hdc)
+{
+    DllCall("gdiplus\GdipCreateFromHDC", "uint", hdc, "uint*", pGraphics)
+    return pGraphics
+}
+
+;#####################################################################################
+
+; Function				Gdip_GetDC
+; Description			This function gets the device context of the passed Graphics
+;
+; hdc					This is the handle to the device context
+;
+; return				returns the device context for the graphics of a bitmap
+
+Gdip_GetDC(pGraphics)
+{
+	DllCall("gdiplus\GdipGetDC", "uint", pGraphics, "uint*", hdc)
+	return hdc
+}
+
+;#####################################################################################
+
+; Function				Gdip_ReleaseDC
+; Description			This function releases a device context from use for further use
+;
+; pGraphics				Pointer to the graphics of a bitmap
+; hdc					This is the handle to the device context
+;
+; return				status enumeration. 0 = success
+
+Gdip_ReleaseDC(pGraphics, hdc)
+{
+	return DllCall("gdiplus\GdipReleaseDC", "uint", pGraphics, "uint", hdc)
+}
+
+;#####################################################################################
+
+; Function				Gdip_GraphicsClear
+; Description			Clears the graphics of a bitmap ready for further drawing
+;
+; pGraphics				Pointer to the graphics of a bitmap
+; ARGB					The colour to clear the graphics to
+;
+; return				status enumeration. 0 = success
+;
+; notes					By default this will make the background invisible
+;						Using clipping regions you can clear a particular area on the graphics rather than clearing the entire graphics
+
+Gdip_GraphicsClear(pGraphics, ARGB=0x00ffffff)
+{
+    return DllCall("gdiplus\GdipGraphicsClear", "uint", pGraphics, "int", ARGB)
+}
+
+;#####################################################################################
+
+; Function				Gdip_BlurBitmap
+; Description			Gives a pointer to a blurred bitmap from a pointer to a bitmap
+;
+; pBitmap				Pointer to a bitmap to be blurred
+; Blur					The Amount to blur a bitmap by from 1 (least blur) to 100 (most blur)
+;
+; return				If the function succeeds, the return value is a pointer to the new blurred bitmap
+;						-1 = The blur parameter is outside the range 1-100
+;
+; notes					This function will not dispose of the original bitmap
+
+Gdip_BlurBitmap(pBitmap, Blur)
+{
+	if (Blur > 100) || (Blur < 1)
+		return -1	
+	
+	sWidth := Gdip_GetImageWidth(pBitmap), sHeight := Gdip_GetImageHeight(pBitmap)
+	dWidth := sWidth//Blur, dHeight := sHeight//Blur
+
+	pBitmap1 := Gdip_CreateBitmap(dWidth, dHeight)
+	G1 := Gdip_GraphicsFromImage(pBitmap1)
+	Gdip_SetInterpolationMode(G1, 7)
+	Gdip_DrawImage(G1, pBitmap, 0, 0, dWidth, dHeight, 0, 0, sWidth, sHeight)
+
+	Gdip_DeleteGraphics(G1)
+
+	pBitmap2 := Gdip_CreateBitmap(sWidth, sHeight)
+	G2 := Gdip_GraphicsFromImage(pBitmap2)
+	Gdip_SetInterpolationMode(G2, 7)
+	Gdip_DrawImage(G2, pBitmap1, 0, 0, sWidth, sHeight, 0, 0, dWidth, dHeight)
+
+	Gdip_DeleteGraphics(G2)
+	Gdip_DisposeImage(pBitmap1)
+	return pBitmap2
+}
+
+;#####################################################################################
+
+; Function:     		Gdip_SaveBitmapToFile
+; Description:  		Saves a bitmap to a file in any supported format onto disk
+;   
+; pBitmap				Pointer to a bitmap
+; sOutput      			The name of the file that the bitmap will be saved to. Supported extensions are: .BMP,.DIB,.RLE,.JPG,.JPEG,.JPE,.JFIF,.GIF,.TIF,.TIFF,.PNG
+; Quality      			If saving as jpg (.JPG,.JPEG,.JPE,.JFIF) then quality can be 1-100 with default at maximum quality
+;
+; return      			If the function succeeds, the return value is zero, otherwise:
+;						-1 = Extension supplied is not a supported file format
+;						-2 = Could not get a list of encoders on system
+;						-3 = Could not find matching encoder for specified file format
+;						-4 = Could not get WideChar name of output file
+;						-5 = Could not save file to disk
+;
+; notes					This function will use the extension supplied from the sOutput parameter to determine the output format
+
+Gdip_SaveBitmapToFile(pBitmap, sOutput, Quality=75)
+{
+	SplitPath, sOutput,,, Extension
+	if Extension not in BMP,DIB,RLE,JPG,JPEG,JPE,JFIF,GIF,TIF,TIFF,PNG
+		return -1
+	Extension := "." Extension
+
+	DllCall("gdiplus\GdipGetImageEncodersSize", "uint*", nCount, "uint*", nSize)
+	VarSetCapacity(ci, nSize)
+	DllCall("gdiplus\GdipGetImageEncoders", "uint", nCount, "uint", nSize, "uint", &ci)
+	if !(nCount && nSize)
+		return -2
+   
+	Loop, %nCount%
+	{
+		Location := NumGet(ci, 76*(A_Index-1)+44)
+		if !A_IsUnicode
+		{
+			nSize := DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "uint", Location, "int", -1, "uint", 0, "int",  0, "uint", 0, "uint", 0)
+			VarSetCapacity(sString, nSize)
+			DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "uint", Location, "int", -1, "str", sString, "int", nSize, "uint", 0, "uint", 0)
+			if !InStr(sString, "*" Extension)
+				continue
+		}
+		else
+		{
+			nSize := DllCall("WideCharToMultiByte", "uint", 0, "uint", 0, "uint", Location, "int", -1, "uint", 0, "int",  0, "uint", 0, "uint", 0)
+			sString := ""
+			Loop, %nSize%
+				sString .= Chr(NumGet(Location+0, 2*(A_Index-1), "char"))
+			if !InStr(sString, "*" Extension)
+				continue
+		}
+		pCodec := &ci+76*(A_Index-1)
+		break
+	}
+	if !pCodec
+		return -3
+
+	if (Quality != 75)
+	{
+		Quality := (Quality < 0) ? 0 : (Quality > 100) ? 100 : Quality
+		if Extension in .JPG,.JPEG,.JPE,.JFIF
+		{
+			DllCall("gdiplus\GdipGetEncoderParameterListSize", "uint", pBitmap, "uint", pCodec, "uint*", nSize)
+			VarSetCapacity(EncoderParameters, nSize, 0)
+			DllCall("gdiplus\GdipGetEncoderParameterList", "uint", pBitmap, "uint", pCodec, "uint", nSize, "uint", &EncoderParameters)
+			Loop, % NumGet(EncoderParameters)      ;%
+			{
+				if (NumGet(EncoderParameters, (28*(A_Index-1))+20) = 1) && (NumGet(EncoderParameters, (28*(A_Index-1))+24) = 6)
+				{
+				   p := (28*(A_Index-1))+&EncoderParameters
+				   NumPut(Quality, NumGet(NumPut(4, NumPut(1, p+0)+20)))
+				   break
+				}
+			}      
+	  }
+	}
+
+	if !A_IsUnicode
+	{
+		nSize := DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &sOutput, "int", -1, "uint", 0, "int", 0)
+		VarSetCapacity(wOutput, nSize*2)
+		DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &sOutput, "int", -1, "uint", &wOutput, "int", nSize)
+		VarSetCapacity(wOutput, -1)
+		if !VarSetCapacity(wOutput)
+			return -4
+		E := DllCall("gdiplus\GdipSaveImageToFile", "uint", pBitmap, "uint", &wOutput, "uint", pCodec, "uint", p ? p : 0)
+	}
+	else
+		E := DllCall("gdiplus\GdipSaveImageToFile", "uint", pBitmap, "uint", &sOutput, "uint", pCodec, "uint", p ? p : 0)
+	return E ? -5 : 0
+}
+
+;#####################################################################################
+
+; Function				Gdip_GetPixel
+; Description			Gets the ARGB of a pixel in a bitmap
+;
+; pBitmap				Pointer to a bitmap
+; x						x-coordinate of the pixel
+; y						y-coordinate of the pixel
+;
+; return				Returns the ARGB value of the pixel
+
+Gdip_GetPixel(pBitmap, x, y)
+{
+	DllCall("gdiplus\GdipBitmapGetPixel", "uint", pBitmap, "int", x, "int", y, "uint*", ARGB)
+	return ARGB
+}
+
+;#####################################################################################
+
+; Function				Gdip_SetPixel
+; Description			Sets the ARGB of a pixel in a bitmap
+;
+; pBitmap				Pointer to a bitmap
+; x						x-coordinate of the pixel
+; y						y-coordinate of the pixel
+;
+; return				status enumeration. 0 = success
+
+Gdip_SetPixel(pBitmap, x, y, ARGB)
+{
+   return DllCall("gdiplus\GdipBitmapSetPixel", "uint", pBitmap, "int", x, "int", y, "int", ARGB)
+}
+
+;#####################################################################################
+
+; Function				Gdip_GetImageWidth
+; Description			Gives the width of a bitmap
+;
+; pBitmap				Pointer to a bitmap
+;
+; return				Returns the width in pixels of the supplied bitmap
+
+Gdip_GetImageWidth(pBitmap)
+{
+   DllCall("gdiplus\GdipGetImageWidth", "uint", pBitmap, "uint*", Width)
+   return Width
+}
+
+;#####################################################################################
+
+; Function				Gdip_GetImageHeight
+; Description			Gives the height of a bitmap
+;
+; pBitmap				Pointer to a bitmap
+;
+; return				Returns the height in pixels of the supplied bitmap
+
+Gdip_GetImageHeight(pBitmap)
+{
+   DllCall("gdiplus\GdipGetImageHeight", "uint", pBitmap, "uint*", Height)
+   return Height
+}
+
+;#####################################################################################
+
+; Function				Gdip_GetDimensions
+; Description			Gives the width and height of a bitmap
+;
+; pBitmap				Pointer to a bitmap
+; Width					ByRef variable. This variable will be set to the width of the bitmap
+; Height				ByRef variable. This variable will be set to the height of the bitmap
+;
+; return				No return value
+;						Gdip_GetDimensions(pBitmap, ThisWidth, ThisHeight) will set ThisWidth to the width and ThisHeight to the height
+
+Gdip_GetImageDimensions(pBitmap, ByRef Width, ByRef Height)
+{
+	DllCall("gdiplus\GdipGetImageWidth", "uint", pBitmap, "uint*", Width)
+	DllCall("gdiplus\GdipGetImageHeight", "uint", pBitmap, "uint*", Height)
+}
+
+;#####################################################################################
+
+Gdip_GetDimensions(pBitmap, ByRef Width, ByRef Height)
+{
+	Gdip_GetImageDimensions(pBitmap, Width, Height)
+}
+
+;#####################################################################################
+
+Gdip_GetImagePixelFormat(pBitmap)
+{
+	DllCall("gdiplus\GdipGetImagePixelFormat", "uint", pBitmap, "uint*", Format)
+	return Format
+}
+
+;#####################################################################################
+
+; Function				Gdip_GetDpiX
+; Description			Gives the horizontal dots per inch of the graphics of a bitmap
+;
+; pBitmap				Pointer to a bitmap
+; Width					ByRef variable. This variable will be set to the width of the bitmap
+; Height				ByRef variable. This variable will be set to the height of the bitmap
+;
+; return				No return value
+;						Gdip_GetDimensions(pBitmap, ThisWidth, ThisHeight) will set ThisWidth to the width and ThisHeight to the height
+
+Gdip_GetDpiX(pGraphics)
+{
+	DllCall("gdiplus\GdipGetDpiX", "uint", pGraphics, "float*", dpix)
+	return Round(dpix)
+}
+
+;#####################################################################################
+
+Gdip_GetDpiY(pGraphics)
+{
+	DllCall("gdiplus\GdipGetDpiY", "uint", pGraphics, "float*", dpiy)
+	return Round(dpiy)
+}
+
+;#####################################################################################
+
+Gdip_GetImageHorizontalResolution(pBitmap)
+{
+	DllCall("gdiplus\GdipGetImageHorizontalResolution", "uint", pBitmap, "float*", dpix)
+	return Round(dpix)
+}
+
+;#####################################################################################
+
+Gdip_GetImageVerticalResolution(pBitmap)
+{
+	DllCall("gdiplus\GdipGetImageVerticalResolution", "uint", pBitmap, "float*", dpiy)
+	return Round(dpiy)
+}
+
+;#####################################################################################
+
+Gdip_BitmapSetResolution(pBitmap, dpix, dpiy)
+{
+	return DllCall("gdiplus\GdipBitmapSetResolution", "uint", pBitmap, "float", dpix, "float", dpiy)
+}
+
+;#####################################################################################
+
+Gdip_CreateBitmapFromFile(sFile, IconNumber=1, IconSize="")
+{
+	SplitPath, sFile,,, ext
+	if ext in exe,dll
+	{
+		Sizes := IconSize ? IconSize : 256 "|" 128 "|" 64 "|" 48 "|" 32 "|" 16
+		VarSetCapacity(buf, 40)
+		Loop, Parse, Sizes, |
+		{
+			DllCall("PrivateExtractIcons", "str", sFile, "int", IconNumber-1, "int", A_LoopField, "int", A_LoopField, "uint*", hIcon, "uint*", 0, "uint", 1, "uint", 0)
+			if !hIcon
+				continue
+
+			if !DllCall("GetIconInfo", "uint", hIcon, "uint", &buf)
+			{
+				DestroyIcon(hIcon)
+				continue
+			}
+			hbmColor := NumGet(buf, 16)
+			hbmMask  := NumGet(buf, 12)
+
+			if !(hbmColor && DllCall("GetObject", "uint", hbmColor, "int", 24, "uint", &buf))
+			{
+				DestroyIcon(hIcon)
+				continue
+			}
+			break
+		}
+		if !hIcon
+			return -1
+
+		Width := NumGet(buf, 4, "int"),  Height := NumGet(buf, 8, "int")
+		hbm := CreateDIBSection(Width, -Height), hdc := CreateCompatibleDC(), obm := SelectObject(hdc, hbm)
+
+		if !DllCall("DrawIconEx", "uint", hdc, "int", 0, "int", 0, "uint", hIcon, "uint", Width, "uint", Height, "uint", 0, "uint", 0, "uint", 3)
+		{
+			DestroyIcon(hIcon)
+			return -2
+		}
+
+		VarSetCapacity(dib, 84)
+		DllCall("GetObject", "uint", hbm, "int", 84, "uint", &dib)
+		Stride := NumGet(dib, 12), Bits := NumGet(dib, 20)
+
+		DllCall("gdiplus\GdipCreateBitmapFromScan0", "int", Width, "int", Height, "int", Stride, "int", 0x26200A, "uint", Bits, "uint*", pBitmapOld)
+		pBitmap := Gdip_CreateBitmap(Width, Height), G := Gdip_GraphicsFromImage(pBitmap)
+		Gdip_DrawImage(G, pBitmapOld, 0, 0, Width, Height, 0, 0, Width, Height)
+		SelectObject(hdc, obm), DeleteObject(hbm), DeleteDC(hdc)
+		Gdip_DeleteGraphics(G), Gdip_DisposeImage(pBitmapOld)
+		DestroyIcon(hIcon)
+	}
+	else
+	{
+		if !A_IsUnicode
+		{
+			VarSetCapacity(wFile, 1023)
+			DllCall("kernel32\MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &sFile, "int", -1, "uint", &wFile, "int", 512)
+			DllCall("gdiplus\GdipCreateBitmapFromFile", "uint", &wFile, "uint*", pBitmap)
+		}
+		else
+			DllCall("gdiplus\GdipCreateBitmapFromFile", "uint", &sFile, "uint*", pBitmap)
+	}
+	return pBitmap
+}
+
+;#####################################################################################
+
+Gdip_CreateBitmapFromHBITMAP(hBitmap, Palette=0)
+{
+	DllCall("gdiplus\GdipCreateBitmapFromHBITMAP", "uint", hBitmap, "uint", Palette, "uint*", pBitmap)
+	return pBitmap
+}
+
+;#####################################################################################
+
+Gdip_CreateHBITMAPFromBitmap(pBitmap, Background=0xffffffff)
+{
+	DllCall("gdiplus\GdipCreateHBITMAPFromBitmap", "uint", pBitmap, "uint*", hbm, "int", Background)
+	return hbm
+}
+
+;#####################################################################################
+
+Gdip_CreateBitmapFromHICON(hIcon)
+{
+	DllCall("gdiplus\GdipCreateBitmapFromHICON", "uint", hIcon, "uint*", pBitmap)
+	return pBitmap
+}
+
+;#####################################################################################
+
+Gdip_CreateHICONFromBitmap(pBitmap)
+{
+	DllCall("gdiplus\GdipCreateHICONFromBitmap", "uint", pBitmap, "uint*", hIcon)
+	return hIcon
+}
+
+;#####################################################################################
+
+Gdip_CreateBitmap(Width, Height, Format=0x26200A)
+{
+    DllCall("gdiplus\GdipCreateBitmapFromScan0", "int", Width, "int", Height, "int", 0, "int", Format, "uint", 0, "uint*", pBitmap)
+    Return pBitmap
+}
+
+;#####################################################################################
+
+Gdip_CreateBitmapFromClipboard()
+{
+	if !DllCall("OpenClipboard", "uint", 0)
+		return -1
+	if !DllCall("IsClipboardFormatAvailable", "uint", 8)
+		return -2
+	if !hBitmap := DllCall("GetClipboardData", "uint", 2)
+		return -3
+	if !pBitmap := Gdip_CreateBitmapFromHBITMAP(hBitmap)
+		return -4
+	if !DllCall("CloseClipboard")
+		return -5
+	DeleteObject(hBitmap)
+	return pBitmap
+}
+
+;#####################################################################################
+
+Gdip_SetBitmapToClipboard(pBitmap)
+{
+	hBitmap := Gdip_CreateHBITMAPFromBitmap(pBitmap)
+	DllCall("GetObject", "uint", hBitmap, "int", VarSetCapacity(oi, 84, 0), "uint", &oi)
+	hdib := DllCall("GlobalAlloc", "uint", 2, "uint", 40+NumGet(oi, 44))
+	pdib := DllCall("GlobalLock", "uint", hdib)
+	DllCall("RtlMoveMemory", "uint", pdib, "uint", &oi+24, "uint", 40)
+	DllCall("RtlMoveMemory", "Uint", pdib+40, "Uint", NumGet(oi, 20), "uint", NumGet(oi, 44))
+	DllCall("GlobalUnlock", "uint", hdib)
+	DllCall("DeleteObject", "uint", hBitmap)
+	DllCall("OpenClipboard", "uint", 0)
+	DllCall("EmptyClipboard")
+	DllCall("SetClipboardData", "uint", 8, "uint", hdib)
+	DllCall("CloseClipboard")
+}
+
+;#####################################################################################
+
+Gdip_CloneBitmapArea(pBitmap, x, y, w, h, Format=0x26200A)
+{
+	DllCall("gdiplus\GdipCloneBitmapArea", "float", x, "float", y, "float", w, "float", h
+	, "int", Format, "uint", pBitmap, "uint*", pBitmapDest)
+	return pBitmapDest
+}
+
+;#####################################################################################
+; Create resources
+;#####################################################################################
+
+Gdip_CreatePen(ARGB, w)
+{
+   DllCall("gdiplus\GdipCreatePen1", "int", ARGB, "float", w, "int", 2, "uint*", pPen)
+   return pPen
+}
+
+;#####################################################################################
+
+Gdip_CreatePenFromBrush(pBrush, w)
+{
+	DllCall("gdiplus\GdipCreatePen2", "uint", pBrush, "float", w, "int", 2, "uint*", pPen)
+	return pPen
+}
+
+;#####################################################################################
+
+Gdip_BrushCreateSolid(ARGB=0xff000000)
+{
+	DllCall("gdiplus\GdipCreateSolidFill", "int", ARGB, "uint*", pBrush)
+	return pBrush
+}
+
+;#####################################################################################
+
+; HatchStyleHorizontal = 0
+; HatchStyleVertical = 1
+; HatchStyleForwardDiagonal = 2
+; HatchStyleBackwardDiagonal = 3
+; HatchStyleCross = 4
+; HatchStyleDiagonalCross = 5
+; HatchStyle05Percent = 6
+; HatchStyle10Percent = 7
+; HatchStyle20Percent = 8
+; HatchStyle25Percent = 9
+; HatchStyle30Percent = 10
+; HatchStyle40Percent = 11
+; HatchStyle50Percent = 12
+; HatchStyle60Percent = 13
+; HatchStyle70Percent = 14
+; HatchStyle75Percent = 15
+; HatchStyle80Percent = 16
+; HatchStyle90Percent = 17
+; HatchStyleLightDownwardDiagonal = 18
+; HatchStyleLightUpwardDiagonal = 19
+; HatchStyleDarkDownwardDiagonal = 20
+; HatchStyleDarkUpwardDiagonal = 21
+; HatchStyleWideDownwardDiagonal = 22
+; HatchStyleWideUpwardDiagonal = 23
+; HatchStyleLightVertical = 24
+; HatchStyleLightHorizontal = 25
+; HatchStyleNarrowVertical = 26
+; HatchStyleNarrowHorizontal = 27
+; HatchStyleDarkVertical = 28
+; HatchStyleDarkHorizontal = 29
+; HatchStyleDashedDownwardDiagonal = 30
+; HatchStyleDashedUpwardDiagonal = 31
+; HatchStyleDashedHorizontal = 32
+; HatchStyleDashedVertical = 33
+; HatchStyleSmallConfetti = 34
+; HatchStyleLargeConfetti = 35
+; HatchStyleZigZag = 36
+; HatchStyleWave = 37
+; HatchStyleDiagonalBrick = 38
+; HatchStyleHorizontalBrick = 39
+; HatchStyleWeave = 40
+; HatchStylePlaid = 41
+; HatchStyleDivot = 42
+; HatchStyleDottedGrid = 43
+; HatchStyleDottedDiamond = 44
+; HatchStyleShingle = 45
+; HatchStyleTrellis = 46
+; HatchStyleSphere = 47
+; HatchStyleSmallGrid = 48
+; HatchStyleSmallCheckerBoard = 49
+; HatchStyleLargeCheckerBoard = 50
+; HatchStyleOutlinedDiamond = 51
+; HatchStyleSolidDiamond = 52
+; HatchStyleTotal = 53
+Gdip_BrushCreateHatch(ARGBfront, ARGBback, HatchStyle=0)
+{
+	DllCall("gdiplus\GdipCreateHatchBrush", "int", HatchStyle, "int", ARGBfront, "int", ARGBback, "uint*", pBrush)
+	return pBrush
+}
+
+;#####################################################################################
+
+Gdip_CreateTextureBrush(pBitmap, WrapMode=1, x=0, y=0, w="", h="")
+{
+	if !(w && h)
+		DllCall("gdiplus\GdipCreateTexture", "uint", pBitmap, "int", WrapMode, "uint*", pBrush)
+	else
+		DllCall("gdiplus\GdipCreateTexture2", "uint", pBitmap, "int", WrapMode, "float", x, "float", y, "float", w, "float", h, "uint*", pBrush)
+	return pBrush
+}
+
+;#####################################################################################
+
+; WrapModeTile = 0
+; WrapModeTileFlipX = 1
+; WrapModeTileFlipY = 2
+; WrapModeTileFlipXY = 3
+; WrapModeClamp = 4
+Gdip_CreateLineBrush(x1, y1, x2, y2, ARGB1, ARGB2, WrapMode=1)
+{
+	CreatePointF(PointF1, x1, y1), CreatePointF(PointF2, x2, y2)
+	DllCall("gdiplus\GdipCreateLineBrush", "uint", &PointF1, "uint", &PointF2, "int", ARGB1, "int", ARGB2, "int", WrapMode, "uint*", LGpBrush)
+	return LGpBrush
+}
+
+;#####################################################################################
+
+; LinearGradientModeHorizontal = 0
+; LinearGradientModeVertical = 1
+; LinearGradientModeForwardDiagonal = 2
+; LinearGradientModeBackwardDiagonal = 3
+Gdip_CreateLineBrushFromRect(x, y, w, h, ARGB1, ARGB2, LinearGradientMode=1, WrapMode=1)
+{
+	CreateRectF(RectF, x, y, w, h)
+	DllCall("gdiplus\GdipCreateLineBrushFromRect", "uint", &RectF, "int", ARGB1, "int", ARGB2, "int", LinearGradientMode, "int", WrapMode, "uint*", LGpBrush)
+	return LGpBrush
+}
+
+;#####################################################################################
+
+Gdip_CloneBrush(pBrush)
+{
+	DllCall("gdiplus\GdipCloneBrush", "uint", pBrush, "uint*", pBrushClone)
+	return pBrushClone
+}
+
+;#####################################################################################
+; Delete resources
+;#####################################################################################
+
+Gdip_DeletePen(pPen)
+{
+   return DllCall("gdiplus\GdipDeletePen", "uint", pPen)
+}
+
+;#####################################################################################
+
+Gdip_DeleteBrush(pBrush)
+{
+   return DllCall("gdiplus\GdipDeleteBrush", "uint", pBrush)
+}
+
+;#####################################################################################
+
+Gdip_DisposeImage(pBitmap)
+{
+   return DllCall("gdiplus\GdipDisposeImage", "uint", pBitmap)
+}
+
+;#####################################################################################
+
+Gdip_DeleteGraphics(pGraphics)
+{
+   return DllCall("gdiplus\GdipDeleteGraphics", "uint", pGraphics)
+}
+
+;#####################################################################################
+
+Gdip_DisposeImageAttributes(ImageAttr)
+{
+	return DllCall("gdiplus\GdipDisposeImageAttributes", "uint", ImageAttr)
+}
+
+;#####################################################################################
+
+Gdip_DeleteFont(hFont)
+{
+   return DllCall("gdiplus\GdipDeleteFont", "uint", hFont)
+}
+
+;#####################################################################################
+
+Gdip_DeleteStringFormat(hFormat)
+{
+   return DllCall("gdiplus\GdipDeleteStringFormat", "uint", hFormat)
+}
+
+;#####################################################################################
+
+Gdip_DeleteFontFamily(hFamily)
+{
+   return DllCall("gdiplus\GdipDeleteFontFamily", "uint", hFamily)
+}
+
+;#####################################################################################
+
+Gdip_DeleteMatrix(Matrix)
+{
+   return DllCall("gdiplus\GdipDeleteMatrix", "uint", Matrix)
+}
+
+;#####################################################################################
+; Text functions
+;#####################################################################################
+
+Gdip_TextToGraphics(pGraphics, Text, Options, Font="Arial", Width="", Height="", Measure=0)
+{
+	IWidth := Width, IHeight:= Height
+	
+	RegExMatch(Options, "i)X([\-\d\.]+)(p*)", xpos)
+	RegExMatch(Options, "i)Y([\-\d\.]+)(p*)", ypos)
+	RegExMatch(Options, "i)W([\-\d\.]+)(p*)", Width)
+	RegExMatch(Options, "i)H([\-\d\.]+)(p*)", Height)
+	RegExMatch(Options, "i)C(?!(entre|enter))([a-f\d]+)", Colour)
+	RegExMatch(Options, "i)Top|Up|Bottom|Down|vCentre|vCenter", vPos)
+	RegExMatch(Options, "i)NoWrap", NoWrap)
+	RegExMatch(Options, "i)R(\d)", Rendering)
+	RegExMatch(Options, "i)S(\d+)(p*)", Size)
+
+	if !Gdip_DeleteBrush(Gdip_CloneBrush(Colour2))
+		PassBrush := 1, pBrush := Colour2
+	
+	if !(IWidth && IHeight) && (xpos2 || ypos2 || Width2 || Height2 || Size2)
+		return -1
+
+	Style := 0, Styles := "Regular|Bold|Italic|BoldItalic|Underline|Strikeout"
+	Loop, Parse, Styles, |
+	{
+		if RegExMatch(Options, "\b" A_loopField)
+		Style |= (A_LoopField != "StrikeOut") ? (A_Index-1) : 8
+	}
+  
+	Align := 0, Alignments := "Near|Left|Centre|Center|Far|Right"
+	Loop, Parse, Alignments, |
+	{
+		if RegExMatch(Options, "\b" A_loopField)
+			Align |= A_Index//2.1      ; 0|0|1|1|2|2
+	}
+
+	xpos := (xpos1 != "") ? xpos2 ? IWidth*(xpos1/100) : xpos1 : 0
+	ypos := (ypos1 != "") ? ypos2 ? IHeight*(ypos1/100) : ypos1 : 0
+	Width := Width1 ? Width2 ? IWidth*(Width1/100) : Width1 : IWidth
+	Height := Height1 ? Height2 ? IHeight*(Height1/100) : Height1 : IHeight
+	if !PassBrush
+		Colour := "0x" (Colour2 ? Colour2 : "ff000000")
+	Rendering := ((Rendering1 >= 0) && (Rendering1 <= 5)) ? Rendering1 : 4
+	Size := (Size1 > 0) ? Size2 ? IHeight*(Size1/100) : Size1 : 12
+
+	hFamily := Gdip_FontFamilyCreate(Font)
+	hFont := Gdip_FontCreate(hFamily, Size, Style)
+	FormatStyle := NoWrap ? 0x4000 | 0x1000 : 0x4000
+	hFormat := Gdip_StringFormatCreate(FormatStyle)
+	pBrush := PassBrush ? pBrush : Gdip_BrushCreateSolid(Colour)
+	if !(hFamily && hFont && hFormat && pBrush && pGraphics)
+		return !pGraphics ? -2 : !hFamily ? -3 : !hFont ? -4 : !hFormat ? -5 : !pBrush ? -6 : 0
+   
+	CreateRectF(RC, xpos, ypos, Width, Height)
+	Gdip_SetStringFormatAlign(hFormat, Align)
+	Gdip_SetTextRenderingHint(pGraphics, Rendering)
+	ReturnRC := Gdip_MeasureString(pGraphics, Text, hFont, hFormat, RC)
+
+	if vPos
+	{
+		StringSplit, ReturnRC, ReturnRC, |
+		
+		if (vPos = "vCentre") || (vPos = "vCenter")
+			ypos += (Height-ReturnRC4)//2
+		else if (vPos = "Top") || (vPos = "Up")
+			ypos := 0
+		else if (vPos = "Bottom") || (vPos = "Down")
+			ypos := Height-ReturnRC4
+		
+		CreateRectF(RC, xpos, ypos, Width, ReturnRC4)
+		ReturnRC := Gdip_MeasureString(pGraphics, Text, hFont, hFormat, RC)
+	}
+
+	if !Measure
+		E := Gdip_DrawString(pGraphics, Text, hFont, hFormat, pBrush, RC)
+
+	if !PassBrush
+		Gdip_DeleteBrush(pBrush)
+	Gdip_DeleteStringFormat(hFormat)   
+	Gdip_DeleteFont(hFont)
+	Gdip_DeleteFontFamily(hFamily)
+	return E ? E : ReturnRC
+}
+
+;#####################################################################################
+
+Gdip_DrawString(pGraphics, sString, hFont, hFormat, pBrush, ByRef RectF)
+{
+	if !A_IsUnicode
+	{
+		nSize := DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &sString, "int", -1, "uint", 0, "int", 0)
+		VarSetCapacity(wString, nSize*2)
+		DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &sString, "int", -1, "uint", &wString, "int", nSize)
+		return DllCall("gdiplus\GdipDrawString", "uint", pGraphics
+		, "uint", &wString, "int", -1, "uint", hFont, "uint", &RectF, "uint", hFormat, "uint", pBrush)
+	}
+	else
+	{
+		return DllCall("gdiplus\GdipDrawString", "uint", pGraphics
+		, "uint", &sString, "int", -1, "uint", hFont, "uint", &RectF, "uint", hFormat, "uint", pBrush)
+	}	
+}
+
+;#####################################################################################
+
+Gdip_MeasureString(pGraphics, sString, hFont, hFormat, ByRef RectF)
+{
+	VarSetCapacity(RC, 16)
+	if !A_IsUnicode
+	{
+		nSize := DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &sString, "int", -1, "uint", 0, "int", 0)
+		VarSetCapacity(wString, nSize*2)   
+		DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &sString, "int", -1, "uint", &wString, "int", nSize)
+		DllCall("gdiplus\GdipMeasureString", "uint", pGraphics
+		, "uint", &wString, "int", -1, "uint", hFont, "uint", &RectF, "uint", hFormat, "uint", &RC, "uint*", Chars, "uint*", Lines)
+	}
+	else
+	{
+		DllCall("gdiplus\GdipMeasureString", "uint", pGraphics
+		, "uint", &sString, "int", -1, "uint", hFont, "uint", &RectF, "uint", hFormat, "uint", &RC, "uint*", Chars, "uint*", Lines)
+	}
+	return &RC ? NumGet(RC, 0, "float") "|" NumGet(RC, 4, "float") "|" NumGet(RC, 8, "float") "|" NumGet(RC, 12, "float") "|" Chars "|" Lines : 0
+}
+
+; Near = 0
+; Center = 1
+; Far = 2
+Gdip_SetStringFormatAlign(hFormat, Align)
+{
+   return DllCall("gdiplus\GdipSetStringFormatAlign", "uint", hFormat, "int", Align)
+}
+
+; StringFormatFlagsDirectionRightToLeft    = 0x00000001
+; StringFormatFlagsDirectionVertical       = 0x00000002
+; StringFormatFlagsNoFitBlackBox           = 0x00000004
+; StringFormatFlagsDisplayFormatControl    = 0x00000020
+; StringFormatFlagsNoFontFallback          = 0x00000400
+; StringFormatFlagsMeasureTrailingSpaces   = 0x00000800
+; StringFormatFlagsNoWrap                  = 0x00001000
+; StringFormatFlagsLineLimit               = 0x00002000
+; StringFormatFlagsNoClip                  = 0x00004000 
+Gdip_StringFormatCreate(Format=0, Lang=0)
+{
+   DllCall("gdiplus\GdipCreateStringFormat", "int", Format, "int", Lang, "uint*", hFormat)
+   return hFormat
+}
+
+; Regular = 0
+; Bold = 1
+; Italic = 2
+; BoldItalic = 3
+; Underline = 4
+; Strikeout = 8
+Gdip_FontCreate(hFamily, Size, Style=0)
+{
+   DllCall("gdiplus\GdipCreateFont", "uint", hFamily, "float", Size, "int", Style, "int", 0, "uint*", hFont)
+   return hFont
+}
+
+Gdip_FontFamilyCreate(Font)
+{
+	if !A_IsUnicode
+	{
+		nSize := DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &Font, "int", -1, "uint", 0, "int", 0)
+		VarSetCapacity(wFont, nSize*2)
+		DllCall("MultiByteToWideChar", "uint", 0, "uint", 0, "uint", &Font, "int", -1, "uint", &wFont, "int", nSize)
+		DllCall("gdiplus\GdipCreateFontFamilyFromName", "uint", &wFont, "uint", 0, "uint*", hFamily)
+	}
+	else
+		DllCall("gdiplus\GdipCreateFontFamilyFromName", "uint", &Font, "uint", 0, "uint*", hFamily)
+	return hFamily
+}
+
+;#####################################################################################
+; Matrix functions
+;#####################################################################################
+
+Gdip_CreateAffineMatrix(m11, m12, m21, m22, x, y)
+{
+   DllCall("gdiplus\GdipCreateMatrix2", "float", m11, "float", m12, "float", m21, "float", m22, "float", x, "float", y, "uint*", Matrix)
+   return Matrix
+}
+
+Gdip_CreateMatrix()
+{
+   DllCall("gdiplus\GdipCreateMatrix", "uint*", Matrix)
+   return Matrix
+}
+
+;#####################################################################################
+; GraphicsPath functions
+;#####################################################################################
+
+; Alternate = 0
+; Winding = 1
+Gdip_CreatePath(BrushMode=0)
+{
+	DllCall("gdiplus\GdipCreatePath", "int", BrushMode, "uint*", Path)
+	return Path
+}
+
+Gdip_AddPathEllipse(Path, x, y, w, h)
+{
+	return DllCall("gdiplus\GdipAddPathEllipse", "uint", Path, "float", x, "float", y, "float", w, "float", h)
+}
+
+Gdip_AddPathPolygon(Path, Points)
+{
+	StringSplit, Points, Points, |
+	VarSetCapacity(PointF, 8*Points0)   
+	Loop, %Points0%
+	{
+		StringSplit, Coord, Points%A_Index%, `,
+		NumPut(Coord1, PointF, 8*(A_Index-1), "float"), NumPut(Coord2, PointF, (8*(A_Index-1))+4, "float")
+	}   
+
+	return DllCall("gdiplus\GdipAddPathPolygon", "uint", Path, "uint", &PointF, "int", Points0)
+}
+
+Gdip_DeletePath(Path)
+{
+	return DllCall("gdiplus\GdipDeletePath", "uint", Path)
+}
+
+;#####################################################################################
+; Quality functions
+;#####################################################################################
+
+; SystemDefault = 0
+; SingleBitPerPixelGridFit = 1
+; SingleBitPerPixel = 2
+; AntiAliasGridFit = 3
+; AntiAlias = 4
+Gdip_SetTextRenderingHint(pGraphics, RenderingHint)
+{
+	return DllCall("gdiplus\GdipSetTextRenderingHint", "uint", pGraphics, "int", RenderingHint)
+}
+
+; Default = 0
+; LowQuality = 1
+; HighQuality = 2
+; Bilinear = 3
+; Bicubic = 4
+; NearestNeighbor = 5
+; HighQualityBilinear = 6
+; HighQualityBicubic = 7
+Gdip_SetInterpolationMode(pGraphics, InterpolationMode)
+{
+   return DllCall("gdiplus\GdipSetInterpolationMode", "uint", pGraphics, "int", InterpolationMode)
+}
+
+; Default = 0
+; HighSpeed = 1
+; HighQuality = 2
+; None = 3
+; AntiAlias = 4
+Gdip_SetSmoothingMode(pGraphics, SmoothingMode)
+{
+   return DllCall("gdiplus\GdipSetSmoothingMode", "uint", pGraphics, "int", SmoothingMode)
+}
+
+; CompositingModeSourceOver = 0 (blended)
+; CompositingModeSourceCopy = 1 (overwrite)
+Gdip_SetCompositingMode(pGraphics, CompositingMode=0)
+{
+   return DllCall("gdiplus\GdipSetCompositingMode", "uint", pGraphics, "int", CompositingMode)
+}
+
+;#####################################################################################
+; Extra functions
+;#####################################################################################
+
+Gdip_Startup()
+{
+	if !DllCall("GetModuleHandle", "str", "gdiplus")
+		DllCall("LoadLibrary", "str", "gdiplus")
+	VarSetCapacity(si, 16, 0), si := Chr(1)
+	DllCall("gdiplus\GdiplusStartup", "uint*", pToken, "uint", &si, "uint", 0)
+	return pToken
+}
+
+Gdip_Shutdown(pToken)
+{
+	DllCall("gdiplus\GdiplusShutdown", "uint", pToken)
+	if hModule := DllCall("GetModuleHandle", "str", "gdiplus")
+		DllCall("FreeLibrary", "uint", hModule)
+	return 0
+}
+
+; Prepend = 0; The new operation is applied before the old operation.
+; Append = 1; The new operation is applied after the old operation.
+Gdip_RotateWorldTransform(pGraphics, Angle, MatrixOrder=0)
+{
+	return DllCall("gdiplus\GdipRotateWorldTransform", "uint", pGraphics, "float", Angle, "int", MatrixOrder)
+}
+
+Gdip_ScaleWorldTransform(pGraphics, x, y, MatrixOrder=0)
+{
+	return DllCall("gdiplus\GdipScaleWorldTransform", "uint", pGraphics, "float", x, "float", y, "int", MatrixOrder)
+}
+
+Gdip_TranslateWorldTransform(pGraphics, x, y, MatrixOrder=0)
+{
+	return DllCall("gdiplus\GdipTranslateWorldTransform", "uint", pGraphics, "float", x, "float", y, "int", MatrixOrder)
+}
+
+Gdip_ResetWorldTransform(pGraphics)
+{
+	return DllCall("gdiplus\GdipResetWorldTransform", "uint", pGraphics)
+}
+
+Gdip_GetRotatedTranslation(Width, Height, Angle, ByRef xTranslation, ByRef yTranslation)
+{
+	pi := 3.14159, TAngle := Angle*(pi/180)	
+
+	Bound := (Angle >= 0) ? Mod(Angle, 360) : 360-Mod(-Angle, -360)
+	if ((Bound >= 0) && (Bound <= 90))
+		xTranslation := Height*Sin(TAngle), yTranslation := 0
+	else if ((Bound > 90) && (Bound <= 180))
+		xTranslation := (Height*Sin(TAngle))-(Width*Cos(TAngle)), yTranslation := -Height*Cos(TAngle)
+	else if ((Bound > 180) && (Bound <= 270))
+		xTranslation := -(Width*Cos(TAngle)), yTranslation := -(Height*Cos(TAngle))-(Width*Sin(TAngle))
+	else if ((Bound > 270) && (Bound <= 360))
+		xTranslation := 0, yTranslation := -Width*Sin(TAngle)
+}
+
+Gdip_GetRotatedDimensions(Width, Height, Angle, ByRef RWidth, ByRef RHeight)
+{
+	pi := 3.14159, TAngle := Angle*(pi/180)
+	if !(Width && Height)
+		return -1
+	RWidth := Ceil(Abs(Width*Cos(TAngle))+Abs(Height*Sin(TAngle)))
+	RHeight := Ceil(Abs(Width*Sin(TAngle))+Abs(Height*Cos(Tangle)))
+}
+
+; RotateNoneFlipNone   = 0
+; Rotate90FlipNone     = 1
+; Rotate180FlipNone    = 2
+; Rotate270FlipNone    = 3
+; RotateNoneFlipX      = 4
+; Rotate90FlipX        = 5
+; Rotate180FlipX       = 6
+; Rotate270FlipX       = 7
+; RotateNoneFlipY      = Rotate180FlipX
+; Rotate90FlipY        = Rotate270FlipX
+; Rotate180FlipY       = RotateNoneFlipX
+; Rotate270FlipY       = Rotate90FlipX
+; RotateNoneFlipXY     = Rotate180FlipNone
+; Rotate90FlipXY       = Rotate270FlipNone
+; Rotate180FlipXY      = RotateNoneFlipNone
+; Rotate270FlipXY      = Rotate90FlipNone 
+
+Gdip_ImageRotateFlip(pBitmap, RotateFlipType=1)
+{
+	return DllCall("gdiplus\GdipImageRotateFlip", "uint", pBitmap, "int", RotateFlipType)
+}
+
+; Replace = 0
+; Intersect = 1
+; Union = 2
+; Xor = 3
+; Exclude = 4
+; Complement = 5
+Gdip_SetClipRect(pGraphics, x, y, w, h, CombineMode=0)
+{
+   return DllCall("gdiplus\GdipSetClipRect", "uint", pGraphics, "float", x, "float", y, "float", w, "float", h, "int", CombineMode)
+}
+
+Gdip_SetClipPath(pGraphics, Path, CombineMode=0)
+{
+   return DllCall("gdiplus\GdipSetClipPath", "uint", pGraphics, "uint", Path, "int", CombineMode)
+}
+
+Gdip_ResetClip(pGraphics)
+{
+   return DllCall("gdiplus\GdipResetClip", "uint", pGraphics)
+}
+
+Gdip_GetClipRegion(pGraphics)
+{
+	Region := Gdip_CreateRegion()
+	DllCall("gdiplus\GdipGetClip", "uint" pGraphics, "uint*", Region)
+	return Region
+}
+
+Gdip_SetClipRegion(pGraphics, Region, CombineMode=0)
+{
+	return DllCall("gdiplus\GdipSetClipRegion", "uint", pGraphics, "uint", Region, "int", CombineMode)
+}
+
+Gdip_CreateRegion()
+{
+	DllCall("gdiplus\GdipCreateRegion", "uint*", Region)
+	return Region
+}
+
+Gdip_DeleteRegion(Region)
+{
+	return DllCall("gdiplus\GdipDeleteRegion", "uint", Region)
+}
+
+;#####################################################################################
+; BitmapLockBits
+;#####################################################################################
+
+Gdip_LockBits(pBitmap, x, y, w, h, ByRef Stride, ByRef Scan0, ByRef BitmapData, LockMode = 3, PixelFormat = 0x26200a)
+{   
+	CreateRect(Rect, x, y, w, h)
+	VarSetCapacity(BitmapData, 21, 0)
+	E := DllCall("Gdiplus\GdipBitmapLockBits", "uint", pBitmap, "uint", &Rect, "uint", LockMode, "int", PixelFormat, "uint", &BitmapData)
+	Stride := NumGet(BitmapData, 8)
+	Scan0 := NumGet(BitmapData, 16)
+	return E
+}
+
+;#####################################################################################
+
+Gdip_UnlockBits(pBitmap, ByRef BitmapData)
+{
+	return DllCall("Gdiplus\GdipBitmapUnlockBits", "uint", pBitmap, "uint", &BitmapData)
+}
+
+;#####################################################################################
+
+Gdip_SetLockBitPixel(ARGB, Scan0, x, y, Stride)
+{
+	Numput(ARGB, Scan0+0, (x*4)+(y*Stride))
+}
+
+;#####################################################################################
+
+Gdip_GetLockBitPixel(Scan0, x, y, Stride)
+{
+	return NumGet(Scan0+0, (x*4)+(y*Stride))
+}
+
+;#####################################################################################
+
+Gdip_PixelateBitmap(pBitmap, ByRef pBitmapOut, BlockSize)
+{
+	static PixelateBitmap
+	if !PixelateBitmap
+	{
+		MCode_PixelateBitmap := "83EC388B4424485355568B74245C99F7FE8B5C244C8B6C2448578BF88BCA894C241C897C243485FF0F8E2E0300008B44245"
+		. "499F7FE897C24448944242833C089542418894424308944242CEB038D490033FF397C2428897C24380F8E750100008BCE0FAFCE894C24408DA4240000"
+		. "000033C03BF08944241089442460894424580F8E8A0000008B5C242C8D4D028BD52BD183C203895424208D3CBB0FAFFE8BD52BD142895424248BD52BD"
+		. "103F9897C24148974243C8BCF8BFE8DA424000000008B5C24200FB61C0B03C30FB619015C24588B5C24240FB61C0B015C24600FB61C11015C241083C1"
+		. "0483EF0175D38B7C2414037C245C836C243C01897C241475B58B7C24388B6C244C8B5C24508B4C244099F7F9894424148B44245899F7F9894424588B4"
+		. "4246099F7F9894424608B44241099F7F98944241085F60F8E820000008D4B028BC32BC18D68038B44242C8D04B80FAFC68BD32BD142895424248BD32B"
+		. "D103C18944243C89742420EB038D49008BC88BFE0FB64424148B5C24248804290FB644245888010FB644246088040B0FB644241088040A83C10483EF0"
+		. "175D58B44243C0344245C836C2420018944243C75BE8B4C24408B5C24508B6C244C8B7C2438473B7C2428897C24380F8C9FFEFFFF8B4C241C33D23954"
+		. "24180F846401000033C03BF2895424108954246089542458895424148944243C0F8E82000000EB0233D2395424187E6F8B4C243003C80FAF4C245C8B4"
+		. "424280FAFC68D550203CA8D0C818BC52BC283C003894424208BC52BC2408BFD2BFA8B54241889442424895424408B4424200FB614080FB60101542414"
+		. "8B542424014424580FB6040A0FB61439014424600154241083C104836C24400175CF8B44243C403BC68944243C7C808B4C24188B4424140FAFCE99F7F"
+		. "9894424148B44245899F7F9894424588B44246099F7F9894424608B44241099F7F98944241033C08944243C85F60F8E7F000000837C2418007E6F8B4C"
+		. "243003C80FAF4C245C8B4424280FAFC68D530203CA8D0C818BC32BC283C003894424208BC32BC2408BFB2BFA8B54241889442424895424400FB644241"
+		. "48B5424208804110FB64424580FB654246088018B4424248814010FB654241088143983C104836C24400175CF8B44243C403BC68944243C7C818B4C24"
+		. "1C8B44245C0144242C01742430836C2444010F85F4FCFFFF8B44245499F7FE895424188944242885C00F8E890100008BF90FAFFE33D2897C243C89542"
+		. "45489442438EB0233D233C03BCA89542410895424608954245889542414894424400F8E840000003BF27E738B4C24340FAFCE03C80FAF4C245C034C24"
+		. "548D55028BC52BC283C003894424208BC52BC2408BFD03CA894424242BFA89742444908B5424200FB6040A0FB611014424148B442424015424580FB61"
+		. "4080FB6040F015424600144241083C104836C24440175CF8B4424408B7C243C8B4C241C33D2403BC1894424400F8C7CFFFFFF8B44241499F7FF894424"
+		. "148B44245899F7FF894424588B44246099F7FF894424608B44241099F7FF8944241033C08944244085C90F8E8000000085F67E738B4C24340FAFCE03C"
+		. "80FAF4C245C034C24548D53028BC32BC283C003894424208BC32BC2408BFB03CA894424242BFA897424448D49000FB65424148B4424208814010FB654"
+		. "24580FB644246088118B5424248804110FB644241088043983C104836C24440175CF8B4424408B7C243C8B4C241C403BC1894424407C808D04B500000"
+		. "00001442454836C2438010F858CFEFFFF33D233C03BCA89542410895424608954245889542414894424440F8E9A000000EB048BFF33D2395424180F8E"
+		. "7D0000008B4C24340FAFCE03C80FAF4C245C8B4424280FAFC68D550203CA8D0C818BC52BC283C003894424208BC52BC240894424248BC52BC28B54241"
+		. "8895424548DA424000000008B5424200FB6140A015424140FB611015424588B5424240FB6140A015424600FB614010154241083C104836C24540175CF"
+		. "8B4424448B4C241C403BC1894424440F8C6AFFFFFF0FAF4C24188B44241499F7F9894424148B44245899F7F9894424588B44246099F7F9894424608B4"
+		. "4241099F7F98944241033C03944241C894424540F8E7B0000008B7C241885FF7E688B4C24340FAFCE03C80FAF4C245C8B4424280FAFC68D530203CA8D"
+		. "0C818BC32BC283C003894424208BC32BC2408BEB894424242BEA0FB65424148B4424208814010FB65424580FB644246088118B5424248804110FB6442"
+		. "41088042983C10483EF0175D18B442454403B44241C894424547C855F5E5D33C05B83C438C3"
+		VarSetCapacity(PixelateBitmap, StrLen(MCode_PixelateBitmap)//2)
+		Loop % StrLen(MCode_PixelateBitmap)//2		;%
+			NumPut("0x" SubStr(MCode_PixelateBitmap, (2*A_Index)-1, 2), PixelateBitmap, A_Index-1, "char")
+	}
+
+	Gdip_GetImageDimensions(pBitmap, Width, Height)
+	if (Width != Gdip_GetImageWidth(pBitmapOut) || Height != Gdip_GetImageHeight(pBitmapOut))
+		return -1
+	if (BlockSize > Width || BlockSize > Height)
+		return -2
+
+	E1 := Gdip_LockBits(pBitmap, 0, 0, Width, Height, Stride1, Scan01, BitmapData1)
+	E2 := Gdip_LockBits(pBitmapOut, 0, 0, Width, Height, Stride2, Scan02, BitmapData2)
+	if (E1 || E2)
+		return -3
+
+	E := DllCall(&PixelateBitmap, "uint", Scan01, "uint", Scan02, "int", Width, "int", Height, "int", Stride1, "int", BlockSize)
+	Gdip_UnlockBits(pBitmap, BitmapData1), Gdip_UnlockBits(pBitmapOut, BitmapData2)
+	return 0
+}
+
+;#####################################################################################
+
+Gdip_ToARGB(A, R, G, B)
+{
+	return (A << 24) | (R << 16) | (G << 8) | B
+}
+
+;#####################################################################################
+
+Gdip_FromARGB(ARGB, ByRef A, ByRef R, ByRef G, ByRef B)
+{
+	A := (0xff000000 & ARGB) >> 24
+	R := (0x00ff0000 & ARGB) >> 16
+	G := (0x0000ff00 & ARGB) >> 8
+	B := 0x000000ff & ARGB
+}
+
+;#####################################################################################
+
+Gdip_AFromARGB(ARGB)
+{
+	return (0xff000000 & ARGB) >> 24
+}
+
+;#####################################################################################
+
+Gdip_RFromARGB(ARGB)
+{
+	return (0x00ff0000 & ARGB) >> 16
+}
+
+;#####################################################################################
+
+Gdip_GFromARGB(ARGB)
+{
+	return (0x0000ff00 & ARGB) >> 8
+}
+
+;#####################################################################################
+
+Gdip_BFromARGB(ARGB)
+{
+	return 0x000000ff & ARGB
 }

BIN
Multimonitor_Codes/Multimonitor_User_Manual.pdf


+ 6 - 0
Multimonitor_Codes/Resolution_Configuration.txt

@@ -0,0 +1,6 @@
+#Display Resolution to be shown in extended displays (width, height)
+1024
+768
+#Slideshow resolution - Provide resolution of Monitor which displays the slideshow(width, height)
+1366
+768

+ 152 - 0
Multimonitor_Codes/powerpoint.ahk

@@ -0,0 +1,152 @@
+#include, Gdip.ahk 
+FileReadLine, __Width, Resolution_Configuration.txt, 2
+FileReadLine, __Height, Resolution_Configuration.txt, 3
+
+f5:: 
+  try{               
+    ppt := ComObjActive("PowerPoint.Application")
+	objppt := ppt.ActivePresentation
+	TotalSlides:=% objppt.Slides.Count
+	FileCreateDir, temp
+  }
+  catch e {
+	return 
+  }
+  SysGet, MonitorCount, MonitorCount
+  ppt := objppt.SlideShowSettings
+  ppt.Run
+Return
+
+Space::
+	try{
+		ppt := ComObjActive("PowerPoint.Application")
+		objppt := ppt.ActivePresentation
+		SlideNum :=% objppt.SlideShowWindow.View.Slide.SlideIndex
+	}
+	catch e {
+		ExitApp
+	}
+	saveScreenshot(SlideNum)
+	objppt.SlideShowWindow.View.Next
+	monitorDisplay(objppt, MonitorCount)
+	return
+	
+v::
+	try{
+		ppt := ComObjActive("PowerPoint.Application")
+		objppt := ppt.ActivePresentation
+		objppt.SlideShowWindow.View.Previous
+	}
+	catch e {
+		ExitApp
+	}
+	monitorDisplay(objppt, MonitorCount)
+	return
+
+;Select the slides and calls setDisplay
+monitorDisplay(objppt, MonitorCount){
+	try{
+		CurrentSlideNumber :=% objppt.SlideShowWindow.View.Slide.SlideIndex
+		}
+	catch{
+		FileRemoveDir, temp, 1
+		ExitApp
+		}
+	monitor := MonitorCount-1
+	var2 := 0
+	Loop %monitor%{
+		var2++
+		setDisplay(var2, CurrentSlideNumber-1)
+		CurrentSlideNumber--
+	}
+}	
+
+;Coordinates for setting the display are returned
+getCoordinates(MonitorNumber){
+	SysGet, MonitorCount, MonitorCount
+	SysGet, MonitorPrimary, MonitorPrimary
+	Array := Object()
+	Loop, %MonitorCount%
+	{
+		ArrayCount += 1 
+		SysGet, MonitorName, MonitorName, %A_Index%
+		SysGet, Monitor, Monitor, %A_Index%
+		SysGet, MonitorWorkArea, MonitorWorkArea, %A_Index%
+		Array.Insert(MonitorLeft)
+	}
+	SortArray(Array)
+	if(MonitorNumber = 1)
+		return Array[2]
+	if(MonitorNumber = 2)
+		return Array[3]
+}
+
+;Using the coordinates returned from getCoordintes
+;The screenshots are set to the external displays
+setDisplay(MonitorNumber, PreviousSlideNumber){
+global
+	coord := getCoordinates(MonitorNumber)
+	SetEnv file, %A_WorkingDir%\temp\%PreviousSlideNumber%.png
+	Gui, %MonitorNumber%:destroy
+	Gui, %MonitorNumber%:+AlwaysOnTop +LastFound +Owner -Caption
+	Gui, %MonitorNumber%:Color, Black
+	Gui, %MonitorNumber%:Add, Picture, w%__Width% h%__Height%, %file%	
+	Gui, %MonitorNumber%:Show, x%coord% y0 maximize
+}
+
+;Uses gdip library to get the screenshots 
+;screen variable is of the format x coordinate| y coordinate| width| height
+Screenshot(outfile)
+{
+    pToken := Gdip_Startup()
+    screen=0|0|%A_ScreenWidth%|%A_ScreenHeight%
+    pBitmap := Gdip_BitmapFromScreen(screen)
+
+    Gdip_SaveBitmapToFile(pBitmap, outfile, 100)
+    Gdip_DisposeImage(pBitmap)
+    Gdip_Shutdown(pToken)
+}
+
+;Screenshot is saved into a temp folder with slide number as the names
+saveScreenshot(SlideNumber){
+	file := A_WorkingDir . "\temp\" . SlideNumber . ".png"
+	Screenshot(file)
+}
+
+;Coordinates of the display are sorted using this function 
+SortArray(Array, Order="A") {
+    ;Order A: Ascending, D: Descending, R: Reverse
+    MaxIndex := ObjMaxIndex(Array)
+    If (Order = "R") {
+        count := 0
+        Loop, % MaxIndex 
+            ObjInsert(Array, ObjRemove(Array, MaxIndex - count++))
+        Return
+    }
+    Partitions := "|" ObjMinIndex(Array) "," MaxIndex
+    Loop {
+        comma := InStr(this_partition := SubStr(Partitions, InStr(Partitions, "|", False, 0)+1), ",")
+        spos := pivot := SubStr(this_partition, 1, comma-1) , epos := SubStr(this_partition, comma+1)    
+        if (Order = "A") {    
+            Loop, % epos - spos {
+                if (Array[pivot] > Array[A_Index+spos])
+                    ObjInsert(Array, pivot++, ObjRemove(Array, A_Index+spos))    
+            }
+        } else {
+            Loop, % epos - spos {
+                if (Array[pivot] < Array[A_Index+spos])
+                    ObjInsert(Array, pivot++, ObjRemove(Array, A_Index+spos))    
+            }
+        }
+        Partitions := SubStr(Partitions, 1, InStr(Partitions, "|", False, 0)-1)
+        if (pivot - spos) > 1    ;if more than one elements
+            Partitions .= "|" spos "," pivot-1        ;the left partition
+        if (epos - pivot) > 1    ;if more than one elements
+            Partitions .= "|" pivot+1 "," epos        ;the right partition
+    } Until !Partitions
+}
+
+ESC::
+	objppt.SlideShowWindow.View.Exit
+	FileRemoveDir, temp, 1
+	ExitApp

+ 177 - 0
Multimonitor_Codes/powerpoint2013.ahk

@@ -0,0 +1,177 @@
+#include, Gdip.ahk 
+FileReadLine, __Width, Resolution_Configuration.txt, 2
+FileReadLine, __Height, Resolution_Configuration.txt, 3
+FileReadLine, __SlideWidth, Resolution_Configuration.txt, 5
+FileReadLine, __SlideHeight, Resolution_Configuration.txt, 6
+
+F5:: 
+  try{               
+    ppt := ComObjActive("PowerPoint.Application")
+	objppt := ppt.ActivePresentation
+	TotalSlides:=% objppt.Slides.Count
+	FileCreateDir, temp
+  }
+  catch e {
+	return
+  }
+  SysGet, MonitorCount, MonitorCount
+  ppt := objppt.SlideShowSettings
+  ppt.Run
+Return
+
+Space::
+	try{
+		ppt := ComObjActive("PowerPoint.Application")
+		objppt := ppt.ActivePresentation
+		SlideNum :=% objppt.SlideShowWindow.View.Slide.SlideIndex
+	}
+	catch e {
+		ExitApp
+	}
+	saveScreenshot(SlideNum)
+	objppt.SlideShowWindow.View.Next
+	monitorDisplay(objppt, MonitorCount)
+	return
+	
+v::
+	try{
+		ppt := ComObjActive("PowerPoint.Application")
+		objppt := ppt.ActivePresentation
+		objppt.SlideShowWindow.View.Previous
+	}
+	catch e {
+		ExitApp
+	}
+	monitorDisplay(objppt, MonitorCount)
+	return
+
+;Select the slides and calls setDisplay
+monitorDisplay(objppt, MonitorCount){
+	try{
+		CurrentSlideNumber :=% objppt.SlideShowWindow.View.Slide.SlideIndex
+		}
+	catch{
+		FileRemoveDir, temp, 1
+		ExitApp
+		}
+	monitor := MonitorCount-1
+	var2 := 0
+	;MsgBox %monitor%
+	Loop %monitor%{
+		var2++
+		setDisplay(var2, CurrentSlideNumber-1)
+		if(var2 > 1){
+			CurrentSlideNumber--
+		}
+	}
+}	
+
+;Coordinates for setting the display are returned	
+getCoordinates(MonitorNumber){
+	SysGet, MonitorCount, MonitorCount
+	SysGet, MonitorPrimary, MonitorPrimary
+	Array := Object()
+	Loop, %MonitorCount%
+	{
+		ArrayCount += 1 
+		SysGet, MonitorName, MonitorName, %A_Index%
+		SysGet, Monitor, Monitor, %A_Index%
+		SysGet, MonitorWorkArea, MonitorWorkArea, %A_Index%
+		Array.Insert(MonitorLeft)
+	}
+	SortArray(Array)
+	if(MonitorNumber = 2)
+		return Array[3]
+	if(MonitorNumber = 3)
+		return Array[4]
+}
+
+;Using the coordinates returned from getCoordintes
+;The screenshots are set to the external displays
+setDisplay(MonitorNumber, PreviousSlideNumber){
+global
+	coord := getCoordinates(MonitorNumber)
+	SetEnv file, %A_WorkingDir%\temp\%PreviousSlideNumber%.png
+	if(MonitorNumber = "1"){
+		return
+	}
+	Gui, %MonitorNumber%:destroy
+	Gui, %MonitorNumber%:+AlwaysOnTop +LastFound +Owner -Caption
+	Gui, %MonitorNumber%:Color, Black
+	Gui, %MonitorNumber%:Add, Picture, w%__Width% h%__Height%, %file%	
+	Gui, %MonitorNumber%:Show, x%coord% y0 maximize
+}
+
+;Uses gdip library to get the screenshots 
+;screen variable is of the format x coordinate| y coordinate| width| height
+Screenshot(outfile)
+{	
+	SysGet, MonitorCount, MonitorCount
+	SysGet, MonitorPrimary, MonitorPrimary
+	Array := Object()
+	Loop, %MonitorCount%
+	{
+		ArrayCount += 1 
+		SysGet, MonitorName, MonitorName, %A_Index%
+		SysGet, Monitor, Monitor, %A_Index%
+		SysGet, MonitorWorkArea, MonitorWorkArea, %A_Index%
+		Array.Insert(MonitorLeft)
+	}
+	SortArray(Array)
+	res := Array[2]
+	FileReadLine, __SlideWidth, Resolution_Configuration.txt, 5
+	FileReadLine, __SlideHeight, Resolution_Configuration.txt, 6
+	slideWidth := __SlideWidth
+	slideHeight := __SlideHeight
+    pToken := Gdip_Startup()
+    screen=%res%|0|%slideWidth%|%slideHeight%
+    pBitmap := Gdip_BitmapFromScreen(screen)
+
+    Gdip_SaveBitmapToFile(pBitmap, outfile, 100)
+    Gdip_DisposeImage(pBitmap)
+    Gdip_Shutdown(pToken)
+}
+
+;Screenshot is saved into a temp folder with slide number as the names
+saveScreenshot(SlideNumber){
+	file := A_WorkingDir . "\temp\" . SlideNumber . ".png"
+	Screenshot(file)
+}
+
+;Coordinates of the display are sorted using this function 
+SortArray(Array, Order="A") {
+    ;Order A: Ascending, D: Descending, R: Reverse
+    MaxIndex := ObjMaxIndex(Array)
+    If (Order = "R") {
+        count := 0
+        Loop, % MaxIndex 
+            ObjInsert(Array, ObjRemove(Array, MaxIndex - count++))
+        Return
+    }
+    Partitions := "|" ObjMinIndex(Array) "," MaxIndex
+    Loop {
+        comma := InStr(this_partition := SubStr(Partitions, InStr(Partitions, "|", False, 0)+1), ",")
+        spos := pivot := SubStr(this_partition, 1, comma-1) , epos := SubStr(this_partition, comma+1)    
+        if (Order = "A") {    
+            Loop, % epos - spos {
+                if (Array[pivot] > Array[A_Index+spos])
+                    ObjInsert(Array, pivot++, ObjRemove(Array, A_Index+spos))    
+            }
+        } else {
+            Loop, % epos - spos {
+                if (Array[pivot] < Array[A_Index+spos])
+                    ObjInsert(Array, pivot++, ObjRemove(Array, A_Index+spos))    
+            }
+        }
+        Partitions := SubStr(Partitions, 1, InStr(Partitions, "|", False, 0)-1)
+        if (pivot - spos) > 1    ;if more than one elements
+            Partitions .= "|" spos "," pivot-1        ;the left partition
+        if (epos - pivot) > 1    ;if more than one elements
+            Partitions .= "|" pivot+1 "," epos        ;the right partition
+    } Until !Partitions
+}
+
+ESC::
+	objppt.SlideShowWindow.View.Exit
+	FileRemoveDir, temp, 1
+	ExitApp

+ 0 - 2
PythonScripts/.gitignore

@@ -1,2 +0,0 @@
-.idea/
-.FirstPython.iml

+ 0 - 57
PythonScripts/BussinessLogic.py

@@ -1,57 +0,0 @@
-from conf import Config
-from pywinauto.application import Application
-from logger import log
-import time
-import os
-import datetime
-import time
-
-class business_logic:
-
-    def convert_files(self,file):
-        _config = Config()
-        backslash = "\\"
-        app_path = _config.Moved_Path+backslash+file
-        #print(app_path)
-        try:
-            os.startfile(app_path)
-        except TimeoutError as e:
-            print "Timeout"
-        time.sleep(_config.App_time)
-        print("Sleep End!!!")
-        app = Application().connect(path=r"C:\Program Files\TechSmith\Camtasia 9\CamtasiaStudio.exe")
-
-        #for TRIAL
-        if _config.Trial == 'YES':
-            #app.Window_(best_match='Dialog', top_level_only=True).ChildWindow(best_match='Finish').SetFocus()
-            app.Window_(best_match='Dialog', top_level_only=True).ChildWindow(best_match='Finish').Click()
-        #end for TRIAL
-        child_elements = app[u'Camtasia 9']
-        #remark
-        child_elements.ClickInput(coords=(_config.Share_Btn_X, _config.Share_Btn_Y))
-        child_elements.TypeKeys("{DOWN}")
-        child_elements.TypeKeys("{ENTER}")
-        #time.sleep(10)
-
-        #for TRIAL
-        if _config.Trial == 'YES':
-            child_elements.Wait('visible',timeout=20)
-            child_elements.ClickInput(coords=(_config.Water_Mark_Btn_X, _config.Water_Mark_Btn_Y))
-        #end for TRIAL
-        for i in range(_config.Dialogs):
-        #for no_dialogs in _config.Dialogs:
-            #time.sleep(2)
-            child_elements.Wait('visible',timeout=20)
-            app.Window_(best_match='Dialog', top_level_only=True).ChildWindow(best_match='Next').Click()
-
-        #app.Window_(best_match='Dialog', top_level_only=True).PrintControlIdentifiers()
-        #app.Window_(best_match='Dialog', top_level_only=True).ChildWindow(title="Untitled Project",class_name="Edit").SetText(time.time())
-        app.Window_(best_match='Dialog', top_level_only=True).ChildWindow(title="Untitled Project",class_name="Edit").SetText(file)
-        app.Window_(best_match='Dialog', top_level_only=True).ChildWindow(best_match='Finish').Click()
-        time.sleep(2)
-        #child_elements.Wait('visible',timeout=20)
-        app.kill_()
-        time.sleep(10)
-        #print("Rendering Succcessful")
-        return 1
-        #Finish rendering

+ 0 - 10
PythonScripts/README.md

@@ -1,10 +0,0 @@
-
-This project is for automating the video conversion and uploading it to a moodle server.
-
-
-
-#Steps to run the solution
-1. Clone or download this repository.
-2. Configure the paths where you save your video files, and the location to which converted video files have to be
-stored ( You could edit it in configuration.xml file)
-3. Run the app.py file

+ 0 - 1
PythonScripts/ReadME

@@ -1 +0,0 @@
-Readme for Python Scripts

+ 0 - 49
PythonScripts/app.py

@@ -1,49 +0,0 @@
-from automate import Automate
-from BussinessLogic import business_logic
-from conf import Config
-from logger import log
-import sys
-import os, time
-
-
-log = log()
-Auto = Automate()
-path_to_watch = "E:/testserver"
-before = dict ([(f, None) for f in os.listdir (path_to_watch)])
-while 1:
-    time.sleep (10)
-    after = dict ([(f, None) for f in os.listdir (path_to_watch)])
-    added = [f for f in after if not f in before]
-    removed = [f for f in before if not f in after]
-    if added:
-        print "Added: ", ", ".join (added)
-    #if removed: print "Removed: ", ", ".join (removed)
-    #before = after
-    #Globals
-        Files=[]
-        #Initializes from the configuration file
-        log.logger.info('Initialization called')
-        status = Auto.Init()
-        if status == 0:
-            log.logger.error('Initialization failed.Exiting application')
-
-
-        Path = Config()
-        #Copy the files from src path to dest path inorder to create a backup
-        status = Auto.copyFiles(Path.Original_Path,Path.Moved_Path,added)
-
-        if status == 0:
-            log.logger.error('Copying files failed. Exiting Application')
-            sys.exit(0)
-        else:
-            log.logger.info('File copy successfull')
-
-        #Get the files from the dest folder to start the conversion process
-        Files=Auto.GetFiles(Path.Moved_Path)
-        bi = business_logic()
-        for file in Files:
-            status = bi.convert_files(file)
-            if status == 1:
-                print "Rendering Succesfull!!"
-
-    before = after

+ 0 - 44
PythonScripts/automate.py

@@ -1,44 +0,0 @@
-from conf import Config
-import os
-import shutil
-from logger import log
-
-
-class Automate:
-    #Initialization Class for Automation
-    log = log()
-
-    def Init(self):
-        __configuration__ = Config()
-        status = __configuration__.read_config()
-        if status == 0:
-            return 0
-        return 1
-
-    def GetFiles(self, paths):
-        files = []
-        for file in os.listdir(paths):
-            files.append(file)
-        return files
-
-    def copyFiles(self, src_folder,dest_folder,added):
-        if src_folder == "" or dest_folder == "":
-            log.logger.error('Source or Destination Folder does not exists')
-            return 0
-
-        if not os.listdir(src_folder):
-            log.logger.error('No files found in src folder')
-            return 0
-
-        #for file in os.listdir(src_folder):
-        for file in added:
-            print ("File being moved -----> " + file)
-            full_file_name = os.path.join( src_folder, file )
-            if os.path.isfile(full_file_name):
-                try:
-                    shutil.copy( full_file_name, dest_folder )
-                except shutil.Error as e:
-                    log.logger.error('Could not copy the files %s',e)
-                    return 0
-        return 1
-

+ 0 - 91
PythonScripts/conf.py

@@ -1,91 +0,0 @@
-import xml.etree.ElementTree as ET
-from logger import log
-
-class Config:
-    'Configuration Class for File Paths'
-    Original_Path = ""
-    Moved_Path = ""
-    Dialogs = 0
-    Trial = ""
-    Share_Btn_X = 0
-    Share_Btn_Y = 0
-    Water_Mark_Btn_X = 0
-    Water_Mark_Btn_Y = 0
-    App_time = 0
-    log = log()
-
-    def read_config(self):
-        log.logger.info('Reading configuration file')
-        tree = ET.parse('configuration.xml')
-        root = tree.getroot()
-        #Get the folder path where the files are present
-        path = root.find('Path')
-        if path == "":
-            log.logger.info('Failed to read the file path attribute')
-            return 0
-
-        Config.Original_Path = path.get('path1')
-        if Config.Original_Path == "":
-            log.logger.info('Failed to read the file path')
-            return 0
-
-        #Get the folder path where files are to be moved
-        move_path = root.find('MovePath')
-        if move_path == "":
-            log.logger.info('Failed to read the copy file path attribute')
-            return 0
-
-        Config.Moved_Path = move_path.get('path2')
-        if Config.Moved_Path == "":
-            log.logger.info('Failed to read the copy file path')
-            return 0
-
-        #Get the no. of dialogs screens during coversion
-        no_screens = root.find('No_Screens')
-        if no_screens == "":
-            log.logger.error('Failed to read the no. of dialog box attribute')
-            return 0
-
-        Config.Dialogs = no_screens.get('dialog')
-        if Config.Dialogs == "":
-            log.logger.error('Failed to read the no. of dialog boxes')
-            return 0
-
-        Config.Dialogs = int(Config.Dialogs)
-
-        #Get if Camtasia has Trial license
-        trial = root.find('TRIAL')
-        if trial == "":
-            log.logger.error('Failed to read the trial license attribute')
-            return 0
-        Config.Trial = trial.get('trial')
-        if Config.Trial == "":
-            log.logger.error('Failed to read the trial license value')
-            return 0
-
-        #Get the co-ordinates of the share button
-        share_btn = root.find('Share_BTN_COOR')
-        Config.Share_Btn_X = share_btn.get('x')
-        Config.Share_Btn_X = int(Config.Share_Btn_X)
-        Config.Share_Btn_Y = share_btn.get('y')
-        Config.Share_Btn_Y = int(Config.Share_Btn_Y)
-        #Get the co-ordinates Watermark
-        watermark_btn = root.find('WATER_MARK_COOR')
-        Config.Water_Mark_Btn_X = watermark_btn.get('x')
-        Config.Water_Mark_Btn_X = int(Config.Water_Mark_Btn_X)
-        Config.Water_Mark_Btn_Y = watermark_btn.get('y')
-        Config.Water_Mark_Btn_Y = int(Config.Water_Mark_Btn_Y)
-        #Get the sleep time for Camtasia app to start
-        app_time = root.find('APP_START_TIME')
-        Config.App_time = app_time.get('time')
-        Config.App_time = int(Config.App_time)
-        return 1
-
-
-
-    def get_Moved_Path(self):
-        return Config.Moved_Path
-
-    def get_Original_Path(self):
-        return Config.Original_Path
-

+ 0 - 10
PythonScripts/configuration.xml

@@ -1,10 +0,0 @@
-<?xml version="1.0"?>
-<RootPath>
-    <Path path1="E:\testserver"> </Path>
-    <MovePath path2="E:\testservercopy"> </MovePath>
-    <No_Screens dialog="5"> </No_Screens>
-    <TRIAL trial="YES"> </TRIAL>
-    <Share_BTN_COOR x="200" y="20"> </Share_BTN_COOR>
-    <WATER_MARK_COOR x="400" y="600"></WATER_MARK_COOR>
-    <APP_START_TIME time="50"></APP_START_TIME>>
-</RootPath>

+ 0 - 10
PythonScripts/logger.py

@@ -1,10 +0,0 @@
-import logging
-
-class log:
-    #Initialize logger
-    logger = logging.getLogger('app')
-    hdlr = logging.FileHandler('App.log',mode='w')
-    formatter = logging.Formatter('%(asctime)s %(name)s %(levelname)s %(message)s')
-    hdlr.setFormatter(formatter)
-    logger.addHandler(hdlr)
-    logger.setLevel(logging.DEBUG)

+ 0 - 7
PythonScripts/pywinTest.py

@@ -1,7 +0,0 @@
-from pywinauto.application import Application
-app = Application().start("notepad.exe")
-app.UntitledNotepad.TypeKeys("%FadfojhuaifhasidfhsiudX")
-app.UntitledNotepad.MenuSelect("File->SaveAs")
-app.SaveAs.ComboBox5.Select("UTF-8")
-app.SaveAs.edit1.SetText("Example-utf8.txt")
-app.SaveAs.Save.Click()

+ 0 - 10
README.md

@@ -1,10 +0,0 @@
--------------- This is the README file for the TK Praktikum project------------------------------
-
-The project has three modules, viz;
-
-1.AutoHotKey Modules
-2. Python Module 
-3. Java Module
-
-The source files and execution details of each module is explained inside each module. The features and functionality of 
-each modules are also explained

+ 0 - 61
test.ahk

@@ -1,61 +0,0 @@
-
-f5:: 
-  try{
-    ppt := ComObjActive("PowerPoint.Application")
-	objppt := ppt.ActivePresentation
-	TotalSlides:=% objppt.Slides.Count
-  }
-  catch e {
-	MsgBox % "Error in " e.Message ", which was called at line " e.Line 
-  }
-  Loop %TotalSlides%{
-	var++
-	;MsgBox %var%
-	saveppt := objppt.Slides(var).Export(A_ScriptDir . "\" . var . ".png", "PNG")
-  }
-  ;pt := ppt.ActivePresentation.(test, ppSaveAsPNG)
-  SysGet, MonitorCount, MonitorCount
-  ;MsgBox %MonitorCount%
-  MsgBox saved
-  ;MsgBox inside %MonitorCount%
-  ppt := objppt.SlideShowSettings
-  ppt.Run
-  monitorDisplay(objppt, MonitorCount)
-Return
-
-Right::
-	objppt.SlideShowWindow.View.Next
-	monitorDisplay(objppt, MonitorCount)
-	return
-
-monitorDisplay(objppt, MonitorCount){
-	CurrentSlideNumber :=% objppt.SlideShowWindow.View.Slide.SlideIndex
-	MsgBox %CurrentSlideNumber% is the current slide
-	monitor := MonitorCount-1
-	Loop %monitor%{
-		MsgBox insideloop
-		var2++
-		setDisplay(var2, CurrentSlideNumber-1)
-	}
-}	
-	
-getCoordinates(MonitorNumber){
-	coord := 1920*MonitorNumber
-	return coord
-}
-
-SetEnv file, C:\Users\SK\Documents\AutoHotKey\1.png
-
-setDisplay(MonitorNumber, CurrentSlideNumber){
-global
-	coord := getCoordinates(MonitorNumber)
-	SetEnv file, C:\Users\SK\Documents\AutoHotKey\%CurrentSlideNumber%.png
-	;file := "C:\Users\SK\Documents\AutoHotKey\" . %CurrentSlideNumber% . ".png"
-	;file := "C:\Users\SK\Documents\AutoHotKey\1.png"
-	MsgBox %coord%,%MonitorNumber%,%CurrentSlideNumber%,%file%
-	Gui, 1:destroy
-	Gui, 1:+AlwaysOnTop +LastFound +Owner -Caption
-	Gui, 1:Color, Black
-	Gui, 1:Add, Picture,  x0 y0 w%A_ScreenWidth% h-1 vPic, %file%	
-	Gui, 1:Show, x%coord% y0 maximize
-}