SCAR Code:
program MSpaintArtist;
{======================[Description and Release Notes]=========================}
{ Artist V 0.5 }
{==============================================================================}
{ }
{ Artist is a freely distributed script according to the GNU public license as }
{ of 1991. If you bought this program or the script, you have been scammed. }
{ }
{==================================[About]=====================================}
{ }
{ This program features tools that allow a scripter to interact with the UI of }
{ Microsoft Paint. It contains a commented surface of drawing tools, each one }
{ of them can perform specific tasks. Use this tool at leisure to create }
{ drawings that ordinairly, you couldn't draw such as gradients, patterns, }
{ graphs, and other things. Or just simply impress your friends by using this. }
{ }
{ Hint: You can easily convert this file to an include, which in can be }
{ practical in certain cases. }
{ }
{=============================[How to use this]================================}
{ }
{ Set your screen resolution to 1024 x 768. YOU MUST USE THIS RESOLUTION!!! }
{------------------------------------------------------------------------------}
{ Drag the crosshair over the canvas in Microsoft Paint. }
{ To run a sample script that demonstrates this programs ability, press the }
{ play button. (BETA DOESN'T HAVE THIS FUNCTIONALITY) }
{------------------------------------------------------------------------------}
{ Note that the tools leave a margin on the paint canvas (both x and y axes). }
{ This margin is equivalent to the constant CO, which can be altered to achieve}
{ optimum results. This has been accounted for in all procedures and methods }
{ interacting with the canvas, when you make new ones you should do the same. }
{ }
{ ONLY TOOLS DIRECTLY INTERACTING WITH THE CANVAS NEED THE COFACTOR CALCULATED }
{ IN (ONLY TOOLS IN THE INPUT DEVICE OR TOP-LEVEL INTERFACE) }
{ }
{=============================[Version History]================================}
{ }
{ For release notes and a complete documentation, go to the project website at }
{ [url]http://whitenoise.awardspace.com/mspaintartist/[/url] }
{ }
{ THIS IS A BETA VERSION ONLY. PLEASE POST ANY BUGS YOU MAY HAVE DETECTED! }
{ }
{==============================================================================}
{ }
{ MADE BY BOTMASTER - DO NOT DELETE THIS LINE }
{ ADD LIST OF CONTRIBUTERS/EDITORS/MODIFIERS HERE: }
{------------------------------------------------------------------------------}
const
co = 5; //Canvas Offset/Cofactor in pixels (5+ reccomended)
ot = 100; //Offset time in ms (50+ reccomended)
//Juuuust in case something goes wrong. Notifies user.
procedure Error(ErrorMsg : string);
begin
Writeln('');
Writeln('Error: '+ErrorMsg);
Playsound('C:\WINDOWS\Media\Windows XP Critical Stop.wav');
Wait(1000);
TerminateScript;
end;
//Sets up bitmaps... Nothing yet though.
procedure LoadImages;
begin
end;
{******************************************************************************}
{ Input Device Procedures }
{******************************************************************************}
//Press a key
procedure PressKey(char : byte);
begin
KeyDown(char);
Wait(ot);
KeyUp(char);
end;
//Type something
procedure TextType(text : string);
begin
SendKeys(text);
Wait(ot);
end;
//Click somewhere
procedure Click(x, y : integer);
begin
ClickMouse(x, y, true);
Wait(ot);
end;
//Drags mouse from x1,y1 to x2, y2
procedure DragFromTo(x1, y1, x2, y2 : integer);
begin
HoldMouse(x1+co, y1+co, true);
MoveMouseSmooth(x2+co,y2+co);
ReleaseMouse(x2+co, y2+co, true);
end;
{******************************************************************************}
{ Menubar Procedures }
{******************************************************************************}
//Opens top-level menus of mspaint.exe
procedure OpenTopLevelMenu(menu : string);
begin
Case lowercase(menu) of
'file' : Click(-45, -12);
'edit' : Click(-20, -12);
'view' : Click(18, -12);
'image' : Click(55, -12);
'colors' : Click(95, -12);
'help' : Click(125, -12);
end;
end;
//Not yet implemented... In future will open submenus of filemenu
procedure OpenFileMenu(menu : string);
begin
Case lowercase(menu) of
1 : menu:=menu;
end;
end;
//Set mspaint canvas size
procedure SetAttributes(width, height : integer);
begin
OpenTopLevelMenu('image');
Click(70, 70);
TextType(inttostr(width+co));
PressKey(9);
TextType(inttostr(height+co));
PressKey(13);
end;
//Self explanatory
procedure ClearImage;
begin
OpenTopLevelMenu('image');
Click(70, 85);
end;
{******************************************************************************}
{ Top-Level Interface Instructions }
{******************************************************************************}
//Select a color from rgb mix. FrontColor specifies wether the color is selected
//as the main color or background color.
procedure SelectColor(r, g, b : byte; backcolor : boolean);
begin
//If backcolor = true then
//Color Dialog box open
Click(115, -15);
Click(115, 15);
Click(390, 440);
//Gets color from RGB...
Click(685, 398);
Click(685, 398);
TextType(inttostr(r));
PressKey(9);
TextType(inttostr(g));
PressKey(9);
TextType(inttostr(b));
PressKey(13);
end;
procedure SelectTool(tool : string);
begin
Case lowercase(tool) of
'starselect': Click(-45, 10);
'select': Click(-20, 10);
'ereaser': Click(-45, 40);
'fill': Click(-20, 40);
'pick': Click(-45, 60);
'magnify': Click(-20, 60);
'draw': Click(-45, 90);
'paint': Click(-20, 90);
'spray': Click(-45, 115);
'text': Click(-20, 115);
'line': Click(-45, 140);
'curve': Click(-20, 140);
'rectangle': Click(-45, 165);
'polygon': Click(-20, 165);
'ellipse': Click(-45, 190);
'rounded': Click(-20, 190);
end;
Wait(ot);
end;
//Tools this applies to are text, starselect, and select.
procedure UseBackgroundColor(yes : boolean);
begin
If Yes = true then
Click(-35, 225)
else
Click(-35, 255);
end;
procedure ThicknessSelect(thickness : byte);
begin
Case thickness of
1: Click(-30, 216);
2: Click(-30, 228);
3: Click(-30, 240);
4: Click(-30, 252);
5: Click(-30, 265);
end;
Wait(ot);
end;
//Sets draw mode for polygon/ellipse/recangle/rounded tools
procedure SetDrawMode(mode : byte);
begin
Case Mode of
1: Click(-30, 220);
2: Click(-30, 240);
3: Click(-30, 260);
end;
Wait(ot);
end;
{******************************************************************************}
{ Tool procedures }
{******************************************************************************}
//Irregular shape select tool. Background specifies wether or not background
//stays transparent. Note that arrays must start at 1 and that the coordinate
//with the highest array count is both start and ending. This COUNTS DOWN!!!
procedure StarSelect(PointArray : TPointArray; background : boolean);
var
l : integer;
begin
SelectTool('starselect');
UseBackGroundColor(background);
l:= getarraylength(PointArray)-1;
HoldMouse((PointArray[l].x)+co, (PointArray[l].y)+co, true);
Wait(ot);
repeat
MoveMouseSmooth((PointArray[l].x)+co, (PointArray[l].y)+co);
Wait(ot);
l:= l - 1;
until(l = 1)
l:= getarraylength(PointArray)-1;
ReleaseMouse((PointArray[l].x)+co, (PointArray[l].y)+co, true);
SelectTool('polygon');
end;
procedure Select(x1, y1, x2, y2 : integer; background : boolean);
begin
SelectTool('select');
UseBackgroundColor(background);
DragFromTo(x1+co, y1+co, x2+co, y2+co);
end;
procedure Erease(x, y : integer; thickness : byte);
begin
SelectTool('ereaser');
Case thickness of
1: Click(-30, 215);
2: Click(-30, 235);
3: Click(-30, 245);
4: Click(-30, 265);
end;
Click(x+co, y+co);
end;
procedure Fill(x, y : integer);
begin
SelectTool('fill');
Click(x+co, y+co);
end;
procedure UseDropper(x, y : integer);
begin
SelectTool('pick');
Click(x+co, y+co);
end;
//Zooms in on x, y at magnification 2, 6, 8. Negative magnification restores
//1x magnification when at a higher mag.
procedure Zoom(x, y : integer; magnification : byte);
begin
SelectTool('magnify');
If not(magnification < 0) then
begin
Click(x+co, y+co);
Case magnification of
2: Click(-24, 236);
6: Click(-24, 252);
8: Click(-24, 269);
end;
end else
Click(-24, 221);
end;
//Uses pencil tool
procedure PixelPut(x, y : integer);
begin
SelectTool('draw');
Click(x+co, y+co);
Wait(ot);
end;
//Tools are numbered from left to right, top to bottom.
procedure Paint(x1, y1, x2, y2 : integer; tool : byte);
begin
SelectTool('paint');
Case tool of
1: Click(-45, 219);
2: Click(-31, 219);
3: Click(-18, 219);
4: Click(-45, 235);
5: Click(-31, 235);
6: Click(-18, 235);
7: Click(-45, 250);
8: Click(-31, 250);
9: Click(-18, 250);
10: Click(-45, 267);
11: Click(-31, 267);
12: Click(-18, 267);
end;
DragFromTo(x1+co, y1+co, x2+co, y2+co);
end;
//Times = how many times it will spray paint the same line
procedure SprayPaint(x1, y1, x2, y2, times : integer; thickness : byte);
var
density : integer;
begin
SelectTool('spray');
Case thickness of
1: Click(-41, 229);
2: Click(-21, 228);
3: Click(-33, 258);
end;
density:= times;
repeat
density:= density - 1;
DragFromTo(x1+co, y1+co, x2+co, y2+co);
until(density = 0);
end;
procedure TextTool(text : string; x1, y1, x2, y2 : integer; nobgcolor : boolean);
begin
SelectTool('text');
DragFromTo(x1+co, y1+co, x2+co, y2+co);
TextType(text);
Click(x1+co+1, y1+co+1);
end;
//Draws line from x1, y1 to x2, y2. Thickness can be 1 to 5 from thinest to
//thickest. If nothing is specified, it will use the thickness already there.
procedure Line(x1, y1, x2, y2 : integer; thickness : byte);
begin
SelectTool('line');
ThicknessSelect(thickness);
DragFromTo(x1+co, y1+co, x2+co, y2+co);
end;
//See line for arguments. cp1 and cp2 are the points which define the
//curvature points of the line. They can be the same if neccessary.
procedure Curve(x1, y1, x2, y2, cpx1, cpy1, cpx2, cpy2 : integer; thickness : byte);
begin
SelectTool('curve');
ThicknessSelect(thickness);
DragFromTo(x1+co, y1+co, x2+co, y2+co);
Click(cpx1+co, cpy1+co);
Click(cpx2+co, cpy2+co);
end;
//Rectangle tool. Drawmode specifies wether the rectangle be drawn filled in,
//with or without border. In top-bottom order (1, 2, and 3 are applicable
//parameters).
procedure Rectangle(x1, y1, x2, y2 : integer; drawmode : byte);
begin
SelectTool('rectangle');
SetDrawMode(drawmode);
DragFromTo(x1+co, y1+co, x2+co, y2+co);
end;
//Draws poly. See StarSelect tool for array help, rectangle tool for drawmode
//help.
procedure Polygon(PointArray : TPointArray; drawmode : byte);
var
l : integer;
begin
SelectTool('polygon');
SetDrawMode(drawmode);
l:= getarraylength(PointArray)-1;
DragFromTo((PointArray[l].x)+co, (PointArray[l].y)+co, (PointArray[l-1].x)+co, (PointArray[l-1].y)+co);
l:= l - 1;
repeat
Click((PointArray[l].x)+co, (PointArray[l].y)+co);
l:= l - 1;
until(l = 1)
l:= getarraylength(PointArray)-1;
Click((PointArray[l].x)+co, (PointArray[l].y)+co);
SelectTool('starselect');
end;
//See rectangle tool for arguments. Draws Ellipse.
procedure Ellipse(x1, y1, x2, y2 : integer; drawmode : byte);
begin
SelectTool('ellipse');
SetDrawMode(drawmode);
DragFromTo(x1+co, y1+co, x2+co, y2+co);
end;
//See rectangle tool for arguments. Draws rounded square.
procedure Rounded(x1, y1, x2, y2 : integer; drawmode : byte);
begin
SelectTool('rounded');
SetDrawMode(drawmode);
DragFromTo(x1+co, y1+co, x2+co, y2+co);
end;
begin
end.