#include <GDIP.au3>
#include <GUIConstantsEx.au3>

Global Const $sFileName = @MyDocumentsDir & "\SampleMeta.emf"

_Example()

Func _Example()
	Local $hGUI, $hGraphics, $hMetafile, $hIA, $tColorMatrix, $pColorMatrix

	; Инициализирует библиотеку GDI+
	_GDIPlus_Startup()

	
	$hGUI = GUICreate("_GDIPlus_ImageAttributesSetNoOp Example", 600, 350)
	GUISetState()

	; Создаёт графический объект из дескриптора окна
	$hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
	_CreateTestMetafile($hGraphics)

	; Создаёт объект Metafile из образца в виде файла метафайла и начинает воспроизведение записи
	$hMetafile = _GDIPlus_MetafileCreateFromFile($sFileName)

	; Создаёт объект ImageAttributes, используемый для настройки цветов изображения
	$hIA = _GDIPlus_ImageAttributesCreate()

	; Create a ColorMatrix that converts red to green
	$tColorMatrix = _ColorMatrixCreateRedToGreen()
	$pColorMatrix = DllStructGetPtr($tColorMatrix)

	; Set the ImageAttributes ColorMatrix, applies color adjustment to pens and brushes
	_GDIPlus_ImageAttributesSetColorMatrix($hIA, 2, True, $pColorMatrix)
	_GDIPlus_ImageAttributesSetColorMatrix($hIA, 3, True, $pColorMatrix)

	; Отключает настройку цвета для карандаша и включает для кисти
	_GDIPlus_ImageAttributesSetNoOp($hIA, 2, False) ; включает
	_GDIPlus_ImageAttributesSetNoOp($hIA, 3, True)  ; выключает

	_GDIPlus_GraphicsDrawImageRectRectIA($hGraphics, $hMetafile, 0, 0, 200, 350, 0, 0, 200, 350, $hIA)

	; Отключает настройку цвета для кисти и включает для карандаша
	_GDIPlus_ImageAttributesSetNoOp($hIA, 2, True)  ; выключает
	_GDIPlus_ImageAttributesSetNoOp($hIA, 3, False) ; включает
	_GDIPlus_GraphicsDrawImageRectRectIA($hGraphics, $hMetafile, 0, 0, 200, 350, 200, 0, 200, 350, $hIA)

	; Восстанавливает настройки цвета для кисти и отключает для карандаша
	_GDIPlus_ImageAttributesSetNoOp($hIA, 2, False) ; включает
	_GDIPlus_ImageAttributesSetNoOp($hIA, 3, True)  ; выключает

	_GDIPlus_GraphicsDrawImageRectRectIA($hGraphics, $hMetafile, 0, 0, 200, 350, 400, 0, 200, 350, $hIA)

	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE

	; Освобождает ресурсы
	_GDIPlus_ImageAttributesDispose($hIA)
	_GDIPlus_ImageDispose($hMetafile)
	_GDIPlus_GraphicsDispose($hGraphics)

	; Закрывает библиотеку GDI+
	_GDIPlus_Shutdown()
EndFunc

; Эта функция Создаёт и сохраняет образец метафайла
Func _CreateTestMetafile($hGraphics)
	Local $hDC, $hMetafile, $hRedBrush, $hRedPen, $hImageContext

	; Получает контекст устройства графического объекта, который будет связан с метафайлом
	$hDC = _GDIPlus_GraphicsGetDC($hGraphics)

	; Создаёт объект Metafile для записи
	$hMetafile = _GDIPlus_MetafileRecordFileName($sFileName, $hDC)

	; Получает графический контекст изображения, любое рисование сохраняется в метафайл
	$hImageContext = _GDIPlus_ImageGetGraphicsContext($hMetafile)

	; Record a filled red rectangle
	$hRedBrush = _GDIPlus_BrushCreateSolid(0xFFFF0000) ; Красный
	_GDIPlus_GraphicsFillRect($hImageContext, 0, 0, 200, 175, $hRedBrush)

	; Record another action by drawing an ellipse using a red pen
	$hRedPen = _GDIPlus_PenCreate(0xFFFF0000, 5)
	_GDIPlus_GraphicsDrawEllipse($hImageContext, 0, 175, 200, 175, $hRedPen)

	; Освобождает контекст устройства
	_GDIPlus_GraphicsReleaseDC($hGraphics, $hDC)

	; Сохраняет метафайл
	_GDIPlus_GraphicsDispose($hImageContext) ; Изображение сохраняется и особая блокировка разблокирована

	; Освобождает ресурсы
	_GDIPlus_PenDispose($hRedPen)
	_GDIPlus_BrushDispose($hRedBrush)
	_GDIPlus_ImageDispose($hMetafile)
EndFunc

; Эта функция Создаёт структуру ColorMatrix, которые преобразуют красный цвет в зеленый
Func _ColorMatrixCreateRedToGreen()
	Local $tColorMatrix

	$tColorMatrix = _GDIPlus_ColorMatrixCreate()
	DllStructSetData($tColorMatrix, "m", 0, 1) ; Scaling factor of red component is 0 (nothing)
	DllStructSetData($tColorMatrix, "m", 1, 2) ; Scaling factor of green component of the red channel is 1 (red becomes green)

	Return $tColorMatrix
EndFunc