MCode from 32bit to 64bit
Posted: 24 Jun 2018, 13:05
I have found out that Mcode in the Gdip_FilterColor() function below appears to have been compiled for the 32bit version of Autohotkey. Could anyone assist me in converting it to run on the 64bit version. The source code can be found at https://pastebin.com/vFgELSEi but I was unsuccessful in using the MCode generator at https://github.com/joedf/MCode4GCC to create viable code. It did spit out an MCode but just replacing that in the function did not work.
And below is the MCode that MCode4GCC generated.
The source code is:
Code: Select all
#include %A_ScriptDir%
#Include Gdip_All.ahk
InputFile := "ColorReplaced.png"
OutputFile := "ColorReplaced2.png"
pToken := Gdip_Startup()
pBitmap := Gdip_CreateBitmapFromFile(InputFile)
E := Gdip_FilterColor(pBitmap, 0xFFC0C0C0, 0xFFFFFFFF, 100)
Gdip_SaveBitmapToFile(pBitmap, OutputFile)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)
return
Gdip_FilterColor(pBitmap, Color, ReplaceColor, Variation=0)
{
static _FilterColor
if !_FilterColor
{
MCode_FilterColor := "83EC288B44243C8BC8C1E918894C243C8BC8C1E91081E1FF000000894C240C0FB6CC25FF000000894C2410894424148B442440"
. "8BC8C1E918894C24188BC80FB6D425FF000000C1E910894424248B44243481E1FF00000085C0894C241C895424200F8E020100008B54242C5355568B7"
. "4245033DB578B7C2440895C241489442418B90100000085FF0F8EC10000008D4A028D040B8BDA2BD983C303895C24508BDA2BD983C301895C24442BD1"
. "897C24108B5C24448B4C24500FB62C030FB60C018B5C244C0FB63803DE3BCB7F688B5C244C2BDE3BCB7C5E8B4C241C8D1C313BFB7F532BCE3BF97C4D8"
. "B4C24208D3C313BEF7F422BCE3BE97C3C8B7C24240FB60C028D1C373BCB7F2D2BFE3BCF7C270FB64C24288B7C2450880C070FB64C242C8B7C24448808"
. "0FB64C2430880C070FB64C2434880C02B90100000083C004294C24100F8569FFFFFF8B7C24408B54243C8B5C2414035C2448294C2418895C24140F852"
. "1FFFFFF5F5E5D5B33C083C428C3"
VarSetCapacity(_FilterColor, StrLen(MCode_FilterColor)//2)
Loop % StrLen(MCode_FilterColor)//2 ;%
NumPut("0x" SubStr(MCode_FilterColor, (2*A_Index)-1, 2), _FilterColor, A_Index-1, "char")
}
Variation := (Variation > 255) ? 255 : (Variation < 0) ? 0 : Variation
Gdip_GetImageDimensions(pBitmap, w, h)
E1 := Gdip_LockBits(pBitmap, 0, 0, w, h, Stride1, Scan01, BitmapData1)
E := DllCall(&_FilterColor, "uint", Scan01, "int", w, "int", h, "int", Stride1, "uint", Color, "uint", ReplaceColor, "int", Variation)
Gdip_UnlockBits(pBitmap, BitmapData1)
return (E = "") ? -1 : E
}
And below is the MCode that MCode4GCC generated.
Code: Select all
"2,x86:QVdBVkFVQVRVV1ZTSIPsOIuEJKgAAAAx7UmJz0SJhCSQAAAARIuEJKAAAABEiYwk"
. "mAAAAESNNJUAAAAAicGJRCQsi4QksAAAAInPQYnKRYnBwe8YRInGQYHhAAD/AIl8"
. "JCAPtv2LjCSQAAAAQYHiAAD/AEyJw8HuGEHB6hBBwekQiXwkKIXJD7bfRQ+2wESJ"
. "VCQkvwMAAAAPjuUAAACNDAMpw0WNJAGJXCQUQY0cAEEpwUEpwESNHAaJTCQQKcZE"
. "iUwkDIlcJBhEiUQkHEyJ+YXSRo0MN4n4D46OAAAAZpBBicCNWP1JAchFD7YQRTna"
. "d25BOfJyaUSNaP9JAc1FD7ZVAEU54ndYRDtUJAxyUUSNeP5JAc9FD7YXRDtUJBB3"
. "P0Q7VCQUcjhBidpJAcpBD7YaO1wkGHcoO1wkHHIiD7ZcJCBBiBgPtlwkJEGIXQAP"
. "tlwkKEGIHw+2XCQsQYgakIPABEQ5yA+FdP///4PFAQO8JJgAAAA5rCSQAAAAD4VN"
. "////McBIg8Q4W15fXUFcQV1BXkFfw5CQkJCQkJCQkJA="
The source code is:
Code: Select all
int Gdip_FilterColor(unsigned char * Bitmap, int w, int h, int Stride, unsigned int Color, unsigned int ReplaceColor, int v)
{
unsigned int p, A1, R1, G1, B1, A2, R2, G2, B2, tA, tR, tG, tB;
A1 = (Color & 0xff000000) >> 24;
R1 = (Color & 0x00ff0000) >> 16;
G1 = (Color & 0x0000ff00) >> 8;
B1 = Color & 0x000000ff;
A2 = (ReplaceColor & 0xff000000) >> 24;
R2 = (ReplaceColor & 0x00ff0000) >> 16;
G2 = (ReplaceColor & 0x0000ff00) >> 8;
B2 = ReplaceColor & 0x000000ff;
for (int y = 0; y < h; ++y)
{
for (int x = 0; x < w; ++x)
{
p = (4*x)+(y*Stride);
tA = Bitmap[3+p];
tR = Bitmap[2+p];
tG = Bitmap[1+p];
tB = Bitmap[p];
if ((tA <= A1+v && tA >= A1-v) && (tR <= R1+v && tR >= R1-v) && (tG <= G1+v && tG >= G1-v) && (tB <= B1+v && tB >= B1-v))
{
Bitmap[3+p] = A2;
Bitmap[2+p] = R2;
Bitmap[1+p] = G2;
Bitmap[p] = B2;
}
}
}
return 0;
}