1
0
mirror of https://github.com/moparisthebest/Simba synced 2024-11-27 11:32:18 -05:00

Merge branch 'master' into lape-integration

Conflicts:
	Projects/Simba/Simba.inc
	Projects/Simba/simbaunit.pas
	Units/lape
This commit is contained in:
Merlijn Wajer 2011-07-23 21:54:58 +02:00
commit 7228a888c4
35 changed files with 1381 additions and 490 deletions

View File

@ -41,16 +41,16 @@ master_doc = 'index'
# General information about the project.
project = u'Simba'
copyright = u'2010, Merlijn Wajer'
copyright = u'2010, Merlijn Wajer, Raymond van Venetie'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '0.810'
version = '0.97'
# The full version, including alpha/beta/rc tags.
release = '0.810'
release = '0.97'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
@ -94,7 +94,7 @@ pygments_style = 'sphinx'
# The theme to use for HTML and HTML Help pages. Major themes that come with
# Sphinx are currently 'default' and 'sphinxdoc'.
html_theme = 'default'
html_theme = 'nature'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
@ -176,7 +176,7 @@ htmlhelp_basename = 'Simbadoc'
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
('index', 'Simba.tex', u'Simba Documentation',
u'Merlijn Wajer', 'manual'),
u'Merlijn Wajer, Raymond van Venetië, Nielsie95', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of

View File

@ -1,7 +1,9 @@
.. _docdoc:
Documentation Documentation
===========================
This page is the documentation for the documentation.
This page is the documentation for the documentation.
It is very important to know this by heart when you are writing documentation
for Simba.
@ -18,12 +20,13 @@ be found at the bottom of the page.
Building the documentation
--------------------------
In the future, the online documentation will be refreshed every hour. However,
if you want to build the documentation yourself, you should install
``python-sphinx``.
``python-sphinx``.
Move to the ``Simba/doc/sphinx`` directory and run ``make all``.
This will place an HTML version of the documentation in ``_build/html``.
Move to the ``Simba/doc/sphinx`` directory and run ``make all``.
This will place an HTML version of the documentation in ``_build/html``.
.. note::
The build instructions are for Linux only. If you want to build the doc on
@ -66,6 +69,28 @@ The titles of all major sections have all words capitalized. (The ones with
The minor sections and subsections (---) and (~~~) have only the first word and
Simba specific words (like Simba itself) capitalized.
Try to stick to the Python documentation standards.
Try to stick to the Python documentation standards.
( http://docs.python.org/using/index.html )
References
----------
Sphinx has references, most of the .rst files contain labels and references.
A label looks something like this:
.. code-block:: python
.. _<X>-<Y>:
Where X is either the name of file or folder; and Y is the name of the
file/function if X is a folder. For referring to specific functions for example,
use:
.. code-block:: python
.. _scriptref-movemouse:
To define a label for the MoveMouse function. Labels are always placed right
above section/chapter declarations.

View File

@ -1,7 +1,11 @@
Feature Overview
================
Detailed Feature Overview
=========================
Simba has some fancy features; the most basic operations as well as detailed
information about settings will be explained here.
.. toctree::
:maxdepth: 2
features/scriptmanager.rst
features/autoupdate.rst
@ -10,5 +14,3 @@ Feature Overview
features/ui.rst
features/notwellknown.rst
Most stuff here is probably misplaced anyway.

View File

@ -1,6 +1,9 @@
Not Well Known Features
=======================
..
TODO
Simba has several features that are relatively unknown.
A few will be listed here.

View File

@ -1,3 +1,4 @@
.. _gettingstarted:
Getting Started with Simba
==========================
@ -18,10 +19,12 @@ minutes.
Simba installer
~~~~~~~~~~~~~~~
Everyone can download Simba at http://wizzup.org/simba/
Go to download and download the Simba installer.
Everyone can get Simba at http://wizzup.org/simba/
Once it is done downloading, simply run the installer and follow the steps.
Go to *Download* and download the Simba installer.
Once it is done downloading, simply run the installer, follow the steps and
please make notice of the following note:
.. note::
Simba will install to C:/ by default; if you want to install it
@ -35,18 +38,20 @@ Once it is done downloading, simply run the installer and follow the steps.
Simba will probably tell you there is an update available. In this case, an
update button will appear. Click it and the Simba Updater will show up.
Alternatively you can update Simba using Tools -> Update.
Alternatively you can update Simba using Tools -> Update which will update Simba
if there is a new update available.
.. note::
Updating Simba regularly is recommended.
Updating Simba as soon as an update is released is recommended.
Downloading Simba binary
~~~~~~~~~~~~~~~~~~~~~~~~
Portable Simba Installation
~~~~~~~~~~~~~~~~~~~~~~~~~~~
This is harder and not recommended. Steps on how to do this will follow later.
..
TODO
For now, simply stick to the installer and update Simba after the install has
completed.
To get a portable installation at this time is not supported but will follow
sooner or later.
Setting up SRL 4 with Simba
---------------------------
@ -54,7 +59,7 @@ Setting up SRL 4 with Simba
If you were using the :ref:`simba-installer` then you can simply enable the
``SRL Updater`` extension. (Go to View -> Extensions and enable ``srl.sex``)
See :ref:`simbaext` for more information on Extensions.
See :ref:`simbaext` for more information on (other) Simba extensions.
This is the only supported way. You can simply do a svn checkout on the srl
repository, but if you can do that, then you should be able to set up SRL
@ -68,6 +73,9 @@ This will follow later, upon SRL 5 release.
Installing scripts
------------------
..
TODO
Scripts can be downloaded with the Script Manager, in Tools -> Script Manager.
.. note::

View File

@ -7,11 +7,28 @@ Welcome to the Simba documentation!
===================================
.. note::
The documentation is still WIP (Work In Progress)
Welcome to the Documentation for the Simba project.
This documentation is aimed at providing documentation on just about anything
you'd want to know about Simba.
Welcome to the Documentation for the Simba project.
The documentation is actively being worked on and somewhat incomplete.
This documentation aims to provide information on just about anything
there is to know about Simba.
Starting points are :ref:`whatis`, :ref:`gettingstarted` and the :ref:`scriptref`
Want to help out with the documentation? See :ref:`docdoc`.
Simba is a program used to repeat certain (complicated) tasks. Typically these
tasks involve using the mouse and keyboard. Simba is programmable, which means
you can design your own logic and steps that Simba will follow, based upon
certain input or as a reaction to a certain action.
Simba is created by the SRL community, fully open source and actively
maintained.
For community forums see http://villavu.com/
Contents:
@ -19,7 +36,6 @@ Contents:
:maxdepth: 2
whatis.rst
whatsnew.rst
whysimba.rst
gettingstarted.rst
troubleshooting.rst
@ -31,6 +47,7 @@ Contents:
referencesimba.rst
docdoc.rst
todo.rst
libmml.rst
pymml.rst

11
Doc/sphinx/libmml.rst Normal file
View File

@ -0,0 +1,11 @@
.. _lib-mml:
libMML
==========
.. toctree::
:maxdepth: 2
libmml/intro.rst

100
Doc/sphinx/libmml/intro.rst Normal file
View File

@ -0,0 +1,100 @@
libMML
======
libMML is short for the library to the Mufasa Macro Library.
Why libMML?
-----------
One of the first questions that rise are probably *why* libMML and *what* is
libMML exactly?
libMML is a loadable C-like library that provides most of the MML functionality.
For the ones that do not know, MML is the core component for Simba that does all
the *computational* and *algorithmic* work. See :ref:`mmlref` for more
information.
To summarize, the MML covers:
- Targetting specific windows and getting the window information such as
their bitmaps and dimensions.
- Controlling the mouse and keyboard.
- Finding colours, bitmaps and dtms.
- Text recognition (OCR)
- Accessing files and sockets in an unified manner
Hopefully the *what* part of the question has mainly been covered by now. If
you're literate in computer science the *why* question has also been answered as
soon as it was mentioned that is was a loadable library - which is also implied
by its name. Exporting the MML into a loadable library allows virtually any
program to load it and just use all the MML functionality.
Design (issues)
---------------
libMML itself should not be too complex. It should simply translate the OOP MML
to a non-OOP C-type library and convert datatypes when required (see below as to
why). libMML is basically just a codebase that calls MML functions and passes
the result along in a slightly different format. In simple cases such as
MoveMouse the integers are simply passed; since there's do not differ, but in
the case of arrays of any type we have to copy the arrays to a C format - at
least until MML internally will no longer use Free Pascal (managed) arrays.
As previously mentioned, libMML is a *C*-type library; this is mentioned
explicitly because MML is written in Free Pascal (Object Pascal) which has quite
a few different datatypes. Strings are typically not compatible, and arrays are
managed in Pascal whereas they are not in C which makes it hard to just *pass*
the array along. One of the problems we have to cope with when writing libMML is
converting datatypes to C-compatible datatypes. C-compatible datatypes are
supported by most programming languages and thus the best way to go when making
a universal MML library.
libMML use cases
----------------
Theoretically libMML can be loaded by any programming language; but typically
each programming languages has it's own kind of programming practices and thus
write - again - their own wrapper around libMML. This is what is being done with
*pyMML*, the python libMML wrapper. It is still as much in development as libMML
is, but the functionality exposed by libMML is succesfully used.
As of writing the pyMML usage looks like this, the passing around of a client
may be removed in a later stage, or at least have it's behaviour changed.
.. code-block:: python
DLL = MMLCore('../libmml.so')
client = DLL.dll.create_client()
print 'Python Client: %d' % client
if client in (0, 1):
raise Exception('Could create a client');
c = Color(DLL, client)
ret = c.find((0, 0, 100, 100), 0)
print ret
ret = c.find_all((0, 0, 100, 100), 0, tol=100)
print ret
m = Mouse(DLL, client)
print m[(Mouse.Pos, Mouse.Left, Mouse.Right)]
m[(Mouse.Pos, Mouse.Right)] = ((300,300), True)
print m.getButtonStates()
sleep(0.5)
m.setPos((200,200))
sleep(2)
print 'Done'
m[(Mouse.Left, Mouse.Right, Mouse.Middle)] = [False for x in range(3)]
for v in zip((Mouse.Left, Mouse.Right), m[(Mouse.Left, Mouse.Right)]):
print v
print m.getPos()
del DLL

View File

@ -6,7 +6,6 @@ Python MML
.. toctree::
:maxdepth: 2
pymml/mml.rst
pymml/mouse.rst
pymml/color.rst

View File

@ -1,3 +1,5 @@
.. _mmlref:
MML Reference
=============
@ -10,7 +12,7 @@ There currently is an effort to create a standalone library of the MML; called
*libMML*. This way any application can just load the library and use the MML
functionality.
The MML is split up in "Core" classes and "Addon" classes.
The MML is split up in "Core" classes and "Addon" classes.
.. note::
This section needs to explain more on the core/addon differences,

View File

@ -1,3 +1,5 @@
.. _scriptref:
Scripting Reference
===================

View File

@ -4,12 +4,44 @@
Bitmaps
=======
A bitmap in Simba is simply a two dimensional *field of colours*. These colours
can all be the same, or they can be of different colours. Simba features
functions to create, manipulate and search for bitmaps.
.. INSERT BITMAP EXAMPLE HERE (Picture, etc)
The bitmaps are - just as files - represented as integer in Simba (they point to
a list of bitmaps, and the value of the integer is the position in the list).
So typically, when referring to bitmaps in Simba, you simply represent them as
an integer:
.. code-block:: pascal
var bmp, x, y: integer;
bmp := CreateBitmap(10, 10); // Create a bitmap of size (10, 10)
if FindBitmapIn(bmp, x, y, 0, 0, 300, 300) then
writeln('Found it!');
FreeBitmap(bmp); // Don't forget to free it when we are done.
Note that the previous example doesn't make a lot of sense as the bitmap has
only been created and not filled with any colours, they are as of yet,
undefined. You can also create bitmaps from screenshots and load them when your
script starts using the :ref:`scriptref-bitmapfromstring` function, or
simple store them as files and load them using the :ref:`scriptref-loadbitmap`
function.
Word of caution on bitmap creation
----------------------------------
Bitmaps in Simba are internally all instances of *TMufasBitmap*. Scripts should
generally access bitmaps using their *handle*: an integer. All functions
referenced here either require a bitmap *handle* or return one.
If you want to gain more access over a specific bitmap, see the
*GetMufasaBitmap* function. It is highly unrecommended to create bitmaps with:
*GetMufasaBitmap* function. It is highly unrecommended to create bitmaps like
this, because Simba will not free them automatically for you. (There's no
problem doing it like this if you only want to perform operations on it and then
free it again)
.. code-block:: pascal
@ -48,6 +80,7 @@ then call this function to get the class reference.
bmp.SetSize(150,150); // also changes bmph, as they are the same bitmap.
.. _scriptref-createbitmapstring:
CreateBitmapString
------------------
@ -56,7 +89,11 @@ CreateBitmapString
function CreateBitmapString(bmp : integer) : string;
Creates a string for the given bitmap.
Creates a string for the given bitmap, you can use this to save a bitmap for
later us, for example loading it again using :ref:`scriptref-bitmapfromstring`.
.. _scriptref-createbitmap:
CreateBitmap
------------
@ -65,8 +102,10 @@ CreateBitmap
function CreateBitmap(w,h :integer) : integer;
Create a bitmap with width *h* and height *h*. Returns the bitmap reference.
Create a bitmap with width *h* and height *h*.
Returns the reference to the created bitmap.
.. _scriptref-freebitmap:
FreeBitmap
----------
@ -80,6 +119,8 @@ Be careful when working with bitmaps: not freeing it when you no longer need it
leads to memory leaks, which will eventually make your script crash. (Unless you
stop it in time, in which case Simba will free the bitmaps for you)
.. _scriptref-savebitmap:
SaveBitmap
----------
@ -89,6 +130,8 @@ SaveBitmap
Save the given bitmap to the specified path.
.. _scriptref-bitmapfromstring:
BitmapFromString
----------------
@ -99,6 +142,7 @@ BitmapFromString
Load a bitmap from the given string. This command is usually generated with the
Bitmap to String feature in Simba.
.. _scriptref-loadbitmap:
LoadBitmap
----------
@ -107,8 +151,10 @@ LoadBitmap
function LoadBitmap(Path : string) : integer;
Load a bitmap from a path to a file. Known formats are .bmp and .png. (Possibly
others, don't know for sure)
Load a bitmap from a path to a file. Formats known to work are BMP and PNG
images.
.. _scriptref-setbitmapsize:
SetBitmapSize
-------------
@ -117,7 +163,12 @@ SetBitmapSize
procedure SetBitmapSize(Bmp,NewW,NewH : integer);
Change the size of the bitmap. Previous data will be preserved (if possible).
Change the size of the bitmap.
Previous data will be preserved (if possible), so enlarging the bitmap won't
destroy the old data, but shrinking it will inevitably destroy some data.
(Everything that falls out of the new bounds)
.. _scriptref-getbitmapsize:
GetBitmapSize
-------------
@ -128,6 +179,8 @@ GetBitmapSize
Returns the size of the bitmap in *BmpW*, *BmpH*.
.. _scriptref-stretchbitmapresize:
StretchBitmapResize
-------------------
@ -136,6 +189,8 @@ StretchBitmapResize
procedure StretchBitmapResize(Bmp,NewW,NewH : integer);
.. _scriptref-createmirroredbitmap:
CreateMirroredBitmap
--------------------
@ -144,6 +199,8 @@ CreateMirroredBitmap
function CreateMirroredBitmap(Bmp : integer) : integer;
.. _scriptref-createmirroredbitmapex:
CreateMirroredBitmapEx
----------------------
@ -152,6 +209,8 @@ CreateMirroredBitmapEx
function CreateMirroredBitmapEx(Bmp : integer; MirrorStyle : TBmpMirrorStyle) : integer;
.. _scriptref-fastsetpixel:
FastSetPixel
------------
@ -161,6 +220,8 @@ FastSetPixel
Set the pixel on the bitmap at position x, y to *color*.
.. _scriptref-fastsetpixels:
FastSetPixels
-------------
@ -170,6 +231,7 @@ FastSetPixels
Set the pixels on the bitmap at position TPA[index] to Colors[index].
.. _scriptref-fastgetpixel:
FastGetPixel
------------
@ -180,6 +242,8 @@ FastGetPixel
Return the colour of pixel on the bitmap, position specified by x, y.
.. _scriptref-fastgetpixels:
FastGetPixels
-------------
@ -189,6 +253,7 @@ FastGetPixels
Return an array of the colours on the bitmap; positions specified by *TPA*.
.. _scriptref-getbitmapareacolors:
GetBitmapAreaColors
-------------------
@ -200,6 +265,8 @@ GetBitmapAreaColors
Returns all the colours in the area defined by (*xs*, *xy*, *xe*, *ye*) on the
bitmap in a two dimensions integer array.
.. _scriptref-fastdrawclear:
FastDrawClear
-------------
@ -209,6 +276,8 @@ FastDrawClear
Draw *Color* on every pixel on the bitmap.
.. _scriptref-fastdrawtransparent:
FastDrawTransparent
-------------------
@ -217,6 +286,8 @@ FastDrawTransparent
procedure FastDrawTransparent(x, y: Integer; SourceBitmap, TargetBitmap: Integer);
.. _scriptref-setransparentcolor:
SetTransparentColor
-------------------
@ -224,6 +295,7 @@ SetTransparentColor
procedure SetTransparentColor(bmp : integer; Color : TColor);
.. _scriptref-getransparentcolor:
GetTransparentColor
-------------------
@ -232,6 +304,7 @@ GetTransparentColor
function GetTransparentColor(bmp: integer) : TColor;
.. _scriptref-fastreplacecolor:
FastReplaceColor
----------------
@ -240,6 +313,7 @@ FastReplaceColor
procedure FastReplaceColor(Bmp : integer; OldColor,NewColor : TColor);
.. _scriptref-copyclienttobitmap:
CopyClientToBitmap
------------------
@ -250,6 +324,8 @@ CopyClientToBitmap
Copy client area *xs, ys, xe, ye* to specified bitmap.
.. _scriptref-bitmapfromclient:
BitmapFromClient
----------------
@ -259,6 +335,8 @@ BitmapFromClient
Create a bitmap from the client. Area specified by *xs, ye, xe, ye*.
.. _scriptref-setbitmapname:
SetBitmapName
-------------
@ -269,6 +347,20 @@ SetBitmapName
Assign a name to the bitmap. Mainly for debugging purposes. (It will write the
name of the bitmap if it hasn't been freed.)
.. code-block:: pascal
program new;
var bmp: integer;
begin
bmp := CreateBitmap(10, 10);
SetBitmapName(bmp, 'We will not free this bitmap');
end.
// Simba will print what bitmap has not been freed (along with his long
// name)
.. _scriptref-findbitmap:
FindBitmap
----------
@ -279,6 +371,8 @@ FindBitmap
Searches for the Bitmap *bmp* on the entire client. Returns true if found.
If found, *x, y* specifies the position where the bitmap was found.
.. _scriptref-findbitmapin:
FindBitmapIn
------------
@ -291,6 +385,8 @@ Searches for the Bitmap *bmp* on the client in the area defined by *xs,ys,xe,ye*
Returns true if found. If found, *x, y* specifies the position where the bitmap
was found.
.. _scriptref-findbitmaptolerancein:
FindBitmapToleranceIn
---------------------
@ -300,10 +396,12 @@ FindBitmapToleranceIn
Searches for the Bitmap *bmp* on the client in the area defined by *xs,ys,xe,ye*.
Tolerance defines the tolerance per pixel when matching bitmaps. See
:ref:`scriptref_CTS` for more information on tolerance.
:ref:`scriptref-CTS` for more information on tolerance.
Returns true if found. If found, *x, y* specifies the position where the bitmap
was found.
.. _scriptref-findbitmapspiral:
FindBitmapSpiral
----------------
@ -316,6 +414,8 @@ Returns true if found. If found, *x, y* specifies the position where the bitmap
was found. Search starts from a point defined by *x, y*.
.. _scriptref-findbitmapsspiraltolerance:
FindBitmapsSpiralTolerance
--------------------------
@ -326,10 +426,12 @@ FindBitmapsSpiralTolerance
Searches for the Bitmap *bmp* on the client in the area defined by *xs,ys,xe,ye*.
Tolerance defines the tolerance per pixel when matching bitmaps. See
:ref:`scriptref_CTS` for more information on tolerance.
:ref:`scriptref-CTS` for more information on tolerance.
Search starts from a point defined by *x, y*.
Returns true if found. If found, each point in *TPA* specifies a match.
.. _scriptref-findbitmapspiraltolerance:
FindBitmapSpiralTolerance
-------------------------
@ -339,11 +441,13 @@ FindBitmapSpiralTolerance
Searches for the Bitmap *bmp* on the client in the area defined by *xs,ys,xe,ye*.
Tolerance defines the tolerance per pixel when matching bitmaps. See
:ref:`scriptref_CTS` for more information on tolerance.
:ref:`scriptref-CTS` for more information on tolerance.
Search starts from a point defined by *x, y*.
Returns true if found. If found, *x, y* specifies the position where the bitmap
was found.
.. _scriptref-rotatebitmap:
RotateBitmap
------------
@ -352,6 +456,8 @@ RotateBitmap
function RotateBitmap(bitmap: Integer; angle: Extended): Integer;
.. _scriptref-desaturatebitmap:
DesaturateBitmap
----------------
@ -360,6 +466,8 @@ DesaturateBitmap
function DesaturateBitmap(Bitmap : integer) : integer;
.. _scriptref-invertbitmap:
InvertBitmap
------------
@ -368,6 +476,8 @@ InvertBitmap
procedure InvertBitmap(Bitmap : integer);
.. _scriptref-copybitmap:
CopyBitmap
----------
@ -377,6 +487,8 @@ CopyBitmap
Creates a copy of the *Bitmap*. Returns the bitmap copy.
.. _scriptref-greyscalebitmap:
GreyScaleBitmap
---------------
@ -386,6 +498,7 @@ GreyScaleBitmap
Creates a copy of the bitmap, greyscaled.
.. _scriptref-brightnessbitmap:
BrightnessBitmap
----------------
@ -400,6 +513,8 @@ Returns a new bitmap with the brightness applied.
If you instead want to apply brightness to the current bitmap, see
:ref:`filter_apply_bitmap`
.. _scriptref-contrastbitmap:
ContrastBitmap
--------------
@ -410,6 +525,7 @@ ContrastBitmap
Changes the constrast of a bitmap, returns a new bitmap with the contrast
applied.
.. _scriptref-posterizebitmap:
PosterizeBitmap
---------------
@ -441,6 +557,8 @@ Applying a filter on the current bitmap
FreeBitmap(b);
end.
.. _scriptref-createmaskfrombitmap:
CreateMaskFromBitmap
--------------------
@ -449,6 +567,8 @@ CreateMaskFromBitmap
function CreateMaskFromBitmap(Bitmap : integer) : TMask;
.. _scriptref-findmasktolerance:
FindMaskTolerance
-----------------
@ -457,6 +577,8 @@ FindMaskTolerance
function FindMaskTolerance(const mask: TMask; var x, y: Integer; xs,ys, xe, ye: Integer; Tolerance, ContourTolerance: Integer): Boolean;
.. _scriptref-findbitmapmasktolerance:
FindBitmapMaskTolerance
-----------------------
@ -465,6 +587,8 @@ FindBitmapMaskTolerance
function FindBitmapMaskTolerance(mask: Integer; var x, y: Integer; xs, ys, xe, ye: Integer; Tolerance, ContourTolerance: Integer): Boolean;
.. _scriptref-finddeformedbitmaptolerancein:
FindDeformedBitmapToleranceIn
-----------------------------
@ -473,6 +597,8 @@ FindDeformedBitmapToleranceIn
function FindDeformedBitmapToleranceIn(bitmap: integer; var x,y: Integer; xs, ys, xe, ye: Integer; tolerance: Integer; Range: Integer; AllowPartialAccuracy: Boolean; var accuracy: Extended): Boolean;
.. _scriptref-drawtpabitmap:
DrawTPABitmap
-------------
@ -484,6 +610,7 @@ DrawTPABitmap
on the bitmap by setting the pixel on the bitmap (position defined by tpa point)
to *color*.
.. _scriptref-drawatpabitmap:
DrawATPABitmap
--------------
@ -497,6 +624,8 @@ Each point in the TPointArray is *painted* on the bitmap by setting
the pixel on the bitmap (position defined by tpa point)
to a color. Colors differ per TPointArray (group).
.. _scriptref-drawatpabitmapex:
DrawATPABitmapEx
----------------
@ -509,6 +638,7 @@ Each point in the TPointArray is *painted* on the bitmap by setting
the pixel on the bitmap (position defined by tpa point)
to a color. Colors are defined by *Colors*.
.. _scriptref-drawbitmap:
DrawBitmap
----------
@ -519,6 +649,8 @@ DrawBitmap
Draw the bitmap to a TCanvas.
.. _scriptref-rectanglebitmap:
RectangleBitmap
---------------
@ -527,6 +659,8 @@ RectangleBitmap
procedure RectangleBitmap(bitmap : integer; const box : TBox; Color : TColor);
.. _scriptref-floodfillbitmap:
FloodFillBitmap
---------------
@ -535,6 +669,8 @@ FloodFillBitmap
procedure FloodFillBitmap(bitmap : integer; const StartPoint : TPoint; const SearchCol,ReplaceCol : TColor);
.. _scriptref-calculatepixelshift:
CalculatePixelShift
-------------------
@ -543,6 +679,8 @@ CalculatePixelShift
function CalculatePixelShift(Bmp1,Bmp2 : Integer; CompareBox : TBox) : integer;
.. _scriptref-calculatepixeltolerance:
CalculatePixelTolerance
-----------------------
@ -550,4 +688,3 @@ CalculatePixelTolerance
function CalculatePixelTolerance(Bmp1,Bmp2 : Integer; CompareBox : TBox; CTS : integer) : extended;')

View File

@ -1,8 +1,11 @@
.. _scriptref_colourconv:
.. _scriptref-colourconv:
Colour Conversions
==================
..
TODO:
Colour spaces
-------------
@ -12,6 +15,7 @@ Explain some colour spaces here.
Colour Conversion Methods
-------------------------
.. _scriptref-colortorgb:
ColorToRGB
~~~~~~~~~~
@ -20,6 +24,8 @@ ColorToRGB
procedure ColorToRGB(Color: integer; var r, g, b: Integer);
.. _scriptref-rgbtocolor:
RGBtoColor
~~~~~~~~~~
@ -27,6 +33,8 @@ RGBtoColor
function RGBtoColor(r, g, b: Integer): TColor;
.. _scriptref-colortohsl:
ColorToHSL
~~~~~~~~~~
@ -34,6 +42,8 @@ ColorToHSL
procedure ColorToHSL(Color: Integer; var h, s, l: Extended);
.. _scriptref-hsltocolor:
HSLToColor
~~~~~~~~~~
@ -41,6 +51,8 @@ HSLToColor
function HSLToColor(H, S, L: Extended): TColor;
.. _scriptref-colortoxyz:
ColorToXYZ
~~~~~~~~~~
@ -48,6 +60,8 @@ ColorToXYZ
procedure ColorToXYZ(Color: Integer; var x, y, z: Extended);
.. _scriptref-xyztocolor:
XYZToColor
~~~~~~~~~~
@ -55,6 +69,8 @@ XYZToColor
function XYZToColor(X, Y, Z: Extended): TColor;
.. _scriptref-rgbtohsl:
RGBToHSL
~~~~~~~~
@ -62,6 +78,8 @@ RGBToHSL
procedure RGBToHSL(R, G, B: Integer; var h, s, l: Extended);
.. _scriptref-hsltorgb:
HSLtoRGB
~~~~~~~~
@ -69,6 +87,8 @@ HSLtoRGB
procedure HSLtoRGB(H, S, L: extended; var R, G ,B: Integer);
.. _scriptref-rgbtoxyz:
RGBToXYZ
~~~~~~~~
@ -76,6 +96,8 @@ RGBToXYZ
procedure RGBToXYZ(R, G, B: Integer;var x, y ,z: Extended);
.. _scriptref-xyztorgb:
XYZToRGB
~~~~~~~~
@ -83,4 +105,5 @@ XYZToRGB
procedure XYZToRGB(X, Y, Z: Extended; var R, G, B: Integer);
..
TODO: Add CIE L*a*b.

View File

@ -37,6 +37,7 @@ components:
a *TPointArray*.
.. note::
Other techniques exist, which involve relative point distance from one point
to another; these are found in the :ref:`scriptref-dtm` section.
@ -51,6 +52,8 @@ Colour Finding Methods
A list of all colour finding methods in Simba.
.. _scriptref-similarcolors:
SimilarColors
~~~~~~~~~~~~~
@ -61,6 +64,8 @@ SimilarColors
SimilarColors returns true if the two passed colours are *similar* given the
passed *Tolerance*.
.. _scriptref-getcolor:
GetColor
~~~~~~~~
@ -68,13 +73,19 @@ GetColor
function GetColor(x, y: Integer): Integer;
GetColor returns the color on the coordinate (*x*, *y*).
GetColor returns the color on the coordinate *(x, y)*.
*Example: Printing the colour on coordinate (25, 25)*
Example printing the colour on coordinate (25, 25).
.. code-block:: pascal
Writeln('Colour is ' + IntToStr(GetColor(25, 25)))
program printcolour;
begin
Writeln('Colour is ' + IntToStr(GetColor(25, 25)))
end.
.. _scriptref-getcolors:
GetColors
~~~~~~~~~
@ -85,6 +96,7 @@ GetColors
GetColors returns an array of the colours at the given *Coords*.
.. _scriptref-countcolor:
CountColor
~~~~~~~~~~
@ -96,6 +108,8 @@ CountColor
Returns how many times *Color* occurs in the area defined by (*xs*, *ys*),
(*xe*, *ye*)
.. _scriptref-countcolortolerance:
CountColorTolerance
~~~~~~~~~~~~~~~~~~~
@ -106,6 +120,8 @@ CountColorTolerance
Returns how many times *Color* occurs (within *Tolerance*)
in the area defined by (*xs*, *ys*), (*xe*, *ye*)
.. _scriptref-findcolor:
FindColor
~~~~~~~~~
@ -121,6 +137,8 @@ The point is returned in *x* and *y*.
It searches from the top left to the bottom right and will stop
after matching a point.
.. _scriptref-findcolortolerance:
FindColorTolerance
~~~~~~~~~~~~~~~~~~
@ -134,9 +152,11 @@ FindColorTolerance returns true if a colour within the given tolerance range
*x2*, *y2*.
Only the first point is returned in *x* and *y*.
Whether or not a colour is within the tolerance range is determined by the
:ref:`scriptref_CTS` mode. It searches from the top left to the bottom right
:ref:`scriptref-CTS` mode. It searches from the top left to the bottom right
and will stop after matching a point.
.. _scriptref-findcolors:
FindColors
~~~~~~~~~~
@ -148,6 +168,8 @@ FindColors returns a list of all points that match the colour *col* in an area
defined by *x1*, *y1*, *x2*, *y2*. It returns true if one or more points have
been found.
.. _scriptref-findcolorstolerance:
FindColorsTolerance
~~~~~~~~~~~~~~~~~~~
@ -160,10 +182,12 @@ FindColorsTolerance returns true if at least one point was found.
A point is found if it is within the given tolerance range *tol*
of the given colour *col* and inside the box defined by *x1*, *y1*, *x2*, *y2*.
Whether or not a color is within the tolerance range is determined by the
:ref:`scriptref_CTS` mode.
:ref:`scriptref-CTS` mode.
It searches from the top left to the bottom right and will find all
matching points in the area.
.. _scriptref-findcolorspiral:
FindColorSpiral
~~~~~~~~~~~~~~~
@ -174,6 +198,8 @@ FindColorSpiral
Same as FindColor, but starts searching from *x*, *y*.
.. _scriptref-findcolorspiraltolerance:
FindColorSpiralTolerance
~~~~~~~~~~~~~~~~~~~~~~~~
@ -184,6 +210,8 @@ FindColorSpiralTolerance
Same as FindColorTolerance, but starts searching from *x*, *y*.
.. _scriptref-findcolorsspiraltolerance:
FindColorsSpiralTolerance
~~~~~~~~~~~~~~~~~~~~~~~~~
@ -194,6 +222,9 @@ FindColorsSpiralTolerance
Same as FindColorsTolerance, but starts searching from *x*, *y*.
.. _scriptref-findcoloredarea:
.. _scriptref-findcoloredareatolerance:
Find areas of colours
~~~~~~~~~~~~~~~~~~~~~
@ -215,7 +246,7 @@ FindColoredArea finds an area that consists out of Colours that match *Color* wi
the given *Tolerance* and has a minimal size of *MinArea*.
If you want minimal area of 5x5 pixels (25), then set MinArea to 25.
.. _scriptref_CTS:
.. _scriptref-CTS:
Colour tolerance
----------------
@ -236,6 +267,11 @@ given a tolerance. There are three algorithms, from fastest to slowest:
very little in hue. Luminance is assigned a somewhat static function, and
has no modifier.
..
TODO: CIE-Lab
.. _scriptref-gettolerancespeed:
.. _scriptref-setcolortolerancespeed:
Get and Set Colour Tolerance
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -258,12 +294,15 @@ function, which returns the current colour tolerance speed:
function GetToleranceSpeed: Integer;
*Example: Printing the Color Tolerance*
Example printing the Color Tolerance
.. code-block:: pascal
Writeln(Format('Tolerance Speed = %d', [GetToleranceSpeed]))
.. _scriptref-settolerancespeed2modifiers:
.. _scriptref-gettolerancespeed2modifiers:
Get And Set Colour Modifiers
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -280,14 +319,14 @@ Set colour speed 2 modifiers.
SetToleranceSpeed2Modifiers(42.0, 0.4)
The following function
.. code-block:: pascal
procedure GetToleranceSpeed2Modifiers(var hMod, sMod: Extended);
returns colour speed 2 modifiers.
*Example: Getting the modifiers*
Example getting the modifiers:
.. code-block:: pascal

View File

@ -1,6 +1,9 @@
Mouse and Keyboard
==================
Simba contains several functions to manipulate the mouse and keyboard.
Features range from clicking and moving the mouse to faking keypresses.
Types
-----
@ -27,15 +30,43 @@ list.
Mouse Functions
---------------
Simba's coordinate system is similar to most computer coordinate systems.
Coordinate *(0, 0)* is the top-left part of your selected window (the desktop by
default). To get to point *(5, 0)* we move five pixels to the right; to get to
*(5, 5)* we move five pixels to the right, and five pixels down.
Recall that the first value is *x*, the second value is *y*: *(x, y)*
..
TODO: Picture?
MoveMouse
~~~~~~~~~
.. _scriptref-movemouse:
.. code-block:: pascal
procedure MoveMouse(x, y: integer);
MoveMouse moves the mouse pointer to the specified x and y coordinates.
The following example will move the mouse to position *(10, 10)*; relative
to the selected client. (To get to point (10, 10) visually, recall that (0, 0)
is the *top left* part and to get to (10, 10) we move 10 pixels to the right,
and ten pixels down.)
.. code-block:: pascal
Program MouseMove;
begin
MoveMouse(10, 10);
end.
.. _scriptref-getmousepos:
GetMousePos
~~~~~~~~~~~
@ -43,9 +74,23 @@ GetMousePos
procedure GetMousePos(var x, y: integer);
GetMousePos returns the current position of the mouse in x and
y.
GetMousePos returns the current position of the mouse in x and y.
The following example moves the mouse 1 pixel to the right, relative to its
current position:
.. code-block:: pascal
Program MouseMoveRelative;
var x, y: integer;
begin
GetMousePos(x, y);
MoveMouse(x + 1, y);
end.
.. _scriptref-holdmouse:
HoldMouse
~~~~~~~~~
@ -54,9 +99,14 @@ HoldMouse
procedure HoldMouse(x, y: Integer; clickType: TClickType);
HoldMouse holds the given mouse button (clickType) down at the specified
x, y coordinate. If the mouse if not at the given x, y yet, the mouse position
will be set to x, y.
HoldMouse holds the given mouse button specified by clickType down at the
specified *(x, y)* coordinate. If the mouse if not at the given
(*x, y)* yet, the mouse position will be set to *(x, y)*.
..
TODO: Example
.. _scriptref-releasemouse:
ReleaseMouse
~~~~~~~~~~~~
@ -69,6 +119,11 @@ HoldMouse holds the given mouse button (clickType) down at the specified
x, y coordinate. If the mouse if not at the given x, y yet, the
mouse position will be set to x, y.
..
TODO: Example
.. _scriptref-clickmouse:
ClickMouse
~~~~~~~~~~
@ -77,7 +132,9 @@ ClickMouse
procedure ClickMouse(x, y: Integer; clickType: Integer):
ClickMouse performs a click with the given mouse button (clickType) at the
specified x, y coordinate.
specified *(x, y)* coordinate. This ``click`` equals an immediate click, with no
wait between holding down and releasing the mouse button. To create a more
human-like effect, use the HoldMouse and ReleaseMouse functions.
Keyboard Functions
------------------
@ -85,18 +142,22 @@ Keyboard Functions
Keyboard functions are obviously used to manipulate the keyboard input. It can
also be used to read states of specific keys.
.. _scriptref-keydown:
KeyDown
~~~~~~~
.. code-block:: pascal
procedure KeyDown(key: Word);
KeyDown sends a request to the Operating System to "fake" an event that
causes the ``key`` to be "down".
causes the keyboard ``key`` to be "down".
..
TODO: Example
.. _scriptref-keyup:
KeyUp
~~~~~
@ -108,8 +169,10 @@ KeyUp
KeyDown sends a request to the Operating System to "fake" an event that
causes the ``key`` to be "up".
..
TODO: Example
.. _virtualkeys:
.. _scriptref-virtualkeys:
Keyboard Virtual Keys
---------------------

View File

@ -1,12 +1,12 @@
.. _scriptref_web:
.. _scriptref_sound:
Multimedia Functions
====================
Sound Functions
--------------
---------------
PlaySound
~~~~~~~~~

View File

@ -3,7 +3,6 @@
Documentation TODO
==================
* **WIP** - What's New. Changelog template added, fill it with stuff.
* *Wizzup* - Script manager (non technical).
* *Wizzup* - Script manager (technical).
* Extend "Getting Started". Include downloading scripts from the manager.

View File

@ -23,9 +23,10 @@ Simba crashes on start complaining about settings.xml
This means your settings.xml has become corrupt somehow, or Simba may not be
able to create it. If a settings.xml exists in your Simba directory, you can
delete it. (All your settings will be lost, but this shouldn't be a bug deal)
delete it. (All your settings will be lost, but this shouldn't be a big deal)
Note that this should no longer happen with Simba 750 and up.
..
..
TODO
Anything else?

View File

@ -1,3 +1,5 @@
.. _whatis:
What Is Simba?
==============
@ -22,4 +24,11 @@ Simba can:
and more. Start now by :ref:`installingsimba`.
Currently Simba is still in its beta stages; this includes the documentation.
You will probably notice some parts of the documentation aren't finished or are just
plain missing.
Simba is being updated almost every day. To see changes as they are added, view
https://github.com/MerlijnWajer/Simba.
If you want to know more about Simba, see :ref:`whysimba`

View File

@ -1,10 +0,0 @@
What's new in Simba?
====================
Currently Simba is still in its beta stages; this includes the documentation.
You will probably notice some parts of the documentation aren't finished or are just
plain missing.
Simba is being updated almost every day. To see changes as they are added, view
https://github.com/MerlijnWajer/Simba. Each commit should be explained
in one line, and the exact changes can be viewed with "commitdiff".

View File

@ -11,15 +11,15 @@ the open-mindedness of the Simba developers.
Free
~~~~
Simba is, and always will be free.
Simba is, and always will be free.
It is free as in Free Beer **and** Freedom.
Simba is 100% free to use. In fact, we welcome you to share it with the
Simba is 100% free to use. In fact, we welcome you to share it with the
rest of the world.
The source code to the program is freely available, under the GPL (v3) license.
The source code to the program is freely available, under the GPL (v3) license.
.. note::
.. note::
The source code allows everyone to see how the program actually
works. Most developers choose not to share their source code and therefore
decide to withhold knowledge. The Simba developers highly disagree with
@ -39,19 +39,19 @@ This way one can easily extend Simba. See :ref:`writing-simba-extensions`
Reliable
~~~~~~~~
Simba is actively maintained by a team of knowledgeable programmers.
Simba is actively maintained by a team of knowledgeable programmers.
We as a team do our best to make Simba into a quality product.
We as a team do our best to make Simba into a quality product.
However this does not guarantee a bug free program.
(Bug free programs don't exist)
Should you encounter a bug, please consider sending a bug report so we can
resolve the issue: :ref:`bugreport`.
try to resolve the issue: :ref:`bugreport`.
Cross Platform
~~~~~~~~~~~~~~
Simba has been written with freedom in mind and believes Simba
Simba has been written with freedom in mind and believes Simba
should not be limited to one platform, as that limits its users
to one platform as well.
@ -59,7 +59,7 @@ Currently the supported platforms are Windows and Linux with attempts
being made to port it to OSX (it may run on OSX if you install X11).
Even though we try hard to make Simba bug-free on all platforms,
some issues remain. The biggest issue is the interpreter that
some issues remain. The biggest issue is the interpreter that
executes your program. It is an external component and does not
play too well on Linux. Hopefully this will be improved upon soon.
@ -94,5 +94,4 @@ Well Documented
~~~~~~~~~~~~~~~
Simba is well documented. (You're looking the documentation right now...)
There is still a lot left to document but overall the documentation is pretty
good.
There is still a lot left to document though.

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

View File

@ -0,0 +1,199 @@
<?xml version="1.0"?>
<CONFIG>
<ProjectOptions>
<Version Value="9"/>
<General>
<Flags>
<MainUnitHasCreateFormStatements Value="False"/>
</Flags>
<MainUnit Value="0"/>
<ResourceType Value="res"/>
<UseXPManifest Value="True"/>
<Icon Value="0"/>
<ActiveWindowIndexAtStart Value="0"/>
</General>
<i18n>
<EnableI18N LFM="False"/>
</i18n>
<VersionInfo>
<StringTable ProductVersion=""/>
</VersionInfo>
<BuildModes Count="1" Active="Default">
<Item1 Name="Default" Default="True"/>
</BuildModes>
<PublishOptions>
<Version Value="2"/>
<IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
<ExcludeFileFilter Value="*.(bak|ppu|o|so);*~;backup"/>
</PublishOptions>
<RunParams>
<local>
<FormatVersion Value="1"/>
</local>
</RunParams>
<Units Count="6">
<Unit0>
<Filename Value="project1.lpr"/>
<IsPartOfProject Value="True"/>
<UnitName Value="project1"/>
<IsVisibleTab Value="True"/>
<EditorIndex Value="0"/>
<WindowIndex Value="0"/>
<TopLine Value="47"/>
<CursorPos X="25" Y="58"/>
<UsageCount Value="20"/>
<Loaded Value="True"/>
</Unit0>
<Unit1>
<Filename Value="../../Units/MMLCore/client.pas"/>
<UnitName Value="Client"/>
<EditorIndex Value="4"/>
<WindowIndex Value="0"/>
<TopLine Value="1"/>
<CursorPos X="89" Y="10"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit1>
<Unit2>
<Filename Value="../../../fpc/packages/fcl-base/src/custapp.pp"/>
<UnitName Value="CustApp"/>
<WindowIndex Value="0"/>
<TopLine Value="42"/>
<CursorPos X="14" Y="63"/>
<UsageCount Value="10"/>
</Unit2>
<Unit3>
<Filename Value="../../Units/MMLCore/bitmaps.pas"/>
<UnitName Value="bitmaps"/>
<EditorIndex Value="2"/>
<WindowIndex Value="0"/>
<TopLine Value="863"/>
<CursorPos X="12" Y="883"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit3>
<Unit4>
<Filename Value="../../Units/MMLCore/os_linux.pas"/>
<UnitName Value="os_linux"/>
<EditorIndex Value="3"/>
<WindowIndex Value="0"/>
<TopLine Value="9"/>
<CursorPos X="79" Y="32"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit4>
<Unit5>
<Filename Value="../../Units/MMLCore/colour_conv.pas"/>
<UnitName Value="colour_conv"/>
<EditorIndex Value="1"/>
<WindowIndex Value="0"/>
<TopLine Value="12"/>
<CursorPos X="60" Y="33"/>
<UsageCount Value="10"/>
<Loaded Value="True"/>
</Unit5>
</Units>
<JumpHistory Count="15" HistoryIndex="14">
<Position1>
<Filename Value="project1.lpr"/>
<Caret Line="34" Column="11" TopLine="13"/>
</Position1>
<Position2>
<Filename Value="project1.lpr"/>
<Caret Line="42" Column="21" TopLine="13"/>
</Position2>
<Position3>
<Filename Value="project1.lpr"/>
<Caret Line="34" Column="11" TopLine="1"/>
</Position3>
<Position4>
<Filename Value="../../Units/MMLCore/bitmaps.pas"/>
<Caret Line="1" Column="1" TopLine="1"/>
</Position4>
<Position5>
<Filename Value="../../Units/MMLCore/os_linux.pas"/>
<Caret Line="1" Column="1" TopLine="1"/>
</Position5>
<Position6>
<Filename Value="../../Units/MMLCore/os_linux.pas"/>
<Caret Line="34" Column="103" TopLine="8"/>
</Position6>
<Position7>
<Filename Value="../../Units/MMLCore/os_linux.pas"/>
<Caret Line="29" Column="64" TopLine="8"/>
</Position7>
<Position8>
<Filename Value="../../Units/MMLCore/colour_conv.pas"/>
<Caret Line="1" Column="1" TopLine="1"/>
</Position8>
<Position9>
<Filename Value="project1.lpr"/>
<Caret Line="10" Column="48" TopLine="1"/>
</Position9>
<Position10>
<Filename Value="project1.lpr"/>
<Caret Line="17" Column="45" TopLine="1"/>
</Position10>
<Position11>
<Filename Value="project1.lpr"/>
<Caret Line="34" Column="19" TopLine="13"/>
</Position11>
<Position12>
<Filename Value="project1.lpr"/>
<Caret Line="40" Column="20" TopLine="25"/>
</Position12>
<Position13>
<Filename Value="../../Units/MMLCore/bitmaps.pas"/>
<Caret Line="27" Column="82" TopLine="1"/>
</Position13>
<Position14>
<Filename Value="project1.lpr"/>
<Caret Line="34" Column="16" TopLine="20"/>
</Position14>
<Position15>
<Filename Value="project1.lpr"/>
<Caret Line="43" Column="32" TopLine="24"/>
</Position15>
</JumpHistory>
</ProjectOptions>
<CompilerOptions>
<Version Value="10"/>
<Target>
<Filename Value="project1"/>
</Target>
<SearchPaths>
<IncludeFiles Value="$(ProjOutDir)"/>
<OtherUnitFiles Value="../../Units/MMLCore;../../Units/Linux;../../Units/Misc;$(LazarusDir)/lcl/units/$(TargetCPU)-$(TargetOS);$(LazarusDir)/lcl/units/$(TargetCPU)-$(TargetOS)/$(LCLWidgetType);$(LazarusDir)/components/mouseandkeyinput"/>
<UnitOutputDirectory Value="lib/$(TargetCPU)-$(TargetOS)"/>
</SearchPaths>
<CodeGeneration>
<Optimizations>
<OptimizationLevel Value="3"/>
</Optimizations>
</CodeGeneration>
<Linking>
<Debugging>
<GenerateDebugInfo Value="True"/>
</Debugging>
</Linking>
<Other>
<CompilerMessages>
<UseMsgFile Value="True"/>
</CompilerMessages>
<CompilerPath Value="$(CompPath)"/>
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Item1>
<Name Value="EAbort"/>
</Item1>
<Item2>
<Name Value="ECodetoolError"/>
</Item2>
<Item3>
<Name Value="EFOpenError"/>
</Item3>
</Exceptions>
</Debugging>
</CONFIG>

View File

@ -0,0 +1,139 @@
program project1;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp,
interfaces, // to prevent linking errors. :|
client, MufasaTypes,
lclintf;
type
{ TMMLBenchmark }
TMMLBenchmark = class(TCustomApplication)
protected
procedure DoRun; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
procedure WriteHelp; virtual;
end;
var
bmp: Integer;
MMLClient: TClient;
{ TMMLBenchmark }
procedure init;
begin
MMLClient := TClient.Create('');
bmp := MMLClient.MBitmaps.CreateBMP(0, 0);
MMLClient.MBitmaps.GetBMP(bmp).LoadFromFile('/home/merlijn/Programs/simba/wall.bmp');
MMLClient.IOManager.SetTarget(MMLClient.MBitmaps[bmp]);
end;
procedure free;
begin
MMLClient.IOManager.SetDesktop;
MMLClient.MBitmaps.FreeBMP(bmp);
MMLClient.Free;
end;
procedure Benchmark;
var
t, t2, t3: PtrUInt;
i, c, w, h: integer;
col, tol: integer;
dummytpa: TPointArray;
begin
init;
t := gettickcount;
MMLClient.IOManager.GetDimensions(w, h);
col := 16777215; tol := 30;
for c := 0 to 2 do // benchmark all CTS'es
begin
MMLClient.MFinder.SetToleranceSpeed(c);
t2 := gettickcount;
for i := 0 to 100 do
begin
MMLClient.MFinder.FindColorsTolerance(dummytpa, col, 0, 0, w-1,h-1, tol);
end;
t3 := gettickcount;
writeln(format('FindColorsTolerance'+#10+
'Time spent: %d ms (per %f ms), matches: %d, CTS: %d, Colour: %d, Tolerance %d',
[t3-t2, (t3-t2) / 100.0, length(dummytpa), c, col, tol]));
end;
free;
end;
procedure TMMLBenchmark.DoRun;
var
ErrorMsg: String;
begin
// quick check parameters
ErrorMsg:=CheckOptions('h','help');
if ErrorMsg<>'' then begin
ShowException(Exception.Create(ErrorMsg));
Terminate;
Exit;
end;
// parse parameters
if HasOption('h','help') then begin
WriteHelp;
Terminate;
Exit;
end;
Benchmark;
{ add your program here }
// stop program loop
Terminate;
end;
constructor TMMLBenchmark.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
StopOnException:=True;
end;
destructor TMMLBenchmark.Destroy;
begin
inherited Destroy;
end;
procedure TMMLBenchmark.WriteHelp;
begin
{ add your help code here }
writeln('Usage: ',ExeName,' -h');
end;
var
Application: TMMLBenchmark;
{$R *.res}
begin
Application:=TMMLBenchmark.Create(nil);
Application.Run;
Application.Free;
end.

View File

@ -37,7 +37,7 @@ uses
PSDump, v_ideCodeParser,
v_AutoCompleteForm, CastaliaPasLex, CastaliaPasLexTypes, CastaliaSimplePasPar,
CastaliaSimplePasParTypes, dcpbase64, mPasLex, v_Constants, v_MiscFunctions,
extensionmanagergui, mmisc, bitmapconv;
mmisc, bitmapconv;
{$R Simba.res}
@ -48,7 +48,7 @@ begin
Application.CreateForm(TColourHistoryForm, ColourHistoryForm);
Application.CreateForm(TAboutForm, AboutForm);
Application.CreateForm(TDebugImgForm, DebugImgForm);
Application.CreateForm(TExtensionsForm, ExtensionsForm);
// Application.CreateForm(TExtensionsForm, ExtensionsForm);
Application.CreateForm(TBitmapConvForm, BitmapConvForm);
// Application.CreateForm(TSimbaUpdateForm, SimbaUpdateForm);
// Application.CreateForm(TSettingsForm, SettingsForm); Done in FormCreate of MainForm

View File

@ -58,10 +58,15 @@ end;
destructor TExtensionManager.Destroy;
var
i: Integer;
I, C: Integer;
begin
for i := 0 to Extensions.Count - 1 do
TExtension(Extensions.Items[i]).Free;
C := Extensions.Count - 1;
for I := 0 to C do
begin
TExtension(Extensions.Items[I]).Settings.Free;
TExtension(Extensions.Items[I]).Free;
end;
Extensions.Free;
inherited Destroy;
end;

View File

@ -265,7 +265,7 @@ begin
begin
{$I ../../Units/MMLAddon/PSInc/pscompile.inc}
AddTypes('TStringArray','Array of String');
AddConstantN('ExtPath','string').SetString(ExtPath);
AddConstantN('ExtPath', 'string').SetString({$IFDEF USE_EXTENSIONS}ExtPath{$ELSE}''{$ENDIF});
for i := 0 to high(VirtualKeys) do
AddConstantN(Format('VK_%S',[VirtualKeys[i].Str]),'Byte').SetInt(VirtualKeys[i].Key);
end;
@ -329,6 +329,7 @@ begin
FreeScript;
if Assigned(PSInstance) then
FreeAndNil(PSInstance);
Script.Free;
inherited;
end;

View File

@ -3012,6 +3012,7 @@ object SimbaForm: TSimbaForm
Caption = '&Extensions'
OnExecute = ActionExtensionsExecute
OnUpdate = ActionExtensionsUpdate
Visible = False
end
object ActionPascalScript: TAction
Caption = 'PascalScript'

View File

@ -51,8 +51,9 @@ uses
SynExportHTML, SynEditKeyCmds, SynEditHighlighter,
SynEditMarkupHighAll, LMessages, Buttons,
mmisc, stringutil,mufasatypesutil, mufasabase,
about, framefunctionlist, ocr, updateform, Simbasettings, psextension, virtualextension,
extensionmanager, settingssandbox,
about, framefunctionlist, ocr, updateform, Simbasettings,
{$IFDEF USE_EXTENSIONS}psextension, virtualextension, extensionmanager,{$ENDIF}
settingssandbox,
v_ideCodeParser, v_ideCodeInsight, CastaliaPasLexTypes, // Code completion units
CastaliaSimplePasPar, v_AutoCompleteForm, // Code completion units
@ -61,7 +62,7 @@ uses
settings, updater;
const
SimbaVersion = 830;
SimbaVersion = 970;
interp_PS = 0; //PascalScript
interp_RT = 1; //RUTIS
@ -414,6 +415,7 @@ type
OpenFileData : TOpenFileData;
WriteFileData : TWriteFileData;
ScriptStartData : TScriptStartData;
procedure UpdateInterpreter;
procedure HandleConnectionData;
procedure HandleOpenFileData;
@ -422,7 +424,7 @@ type
function GetInterpreter: Integer;
function GetDefScriptPath: string;
function GetScriptPath : string;
function GetExtPath: string;
{$IFDEF USE_EXTENSIONS}function GetExtPath: string;{$ENDIF}
function GetFontPath: String;
function GetHighlighter: TSynCustomHighlighter;
function GetIncludePath: String;
@ -432,7 +434,7 @@ type
function GetShowCodeCompletionAuto: Boolean;
function GetSimbaNews: String;
procedure SetDefScriptPath(const AValue: string);
procedure SetExtPath(const AValue: string);
{$IFDEF USE_EXTENSIONS}procedure SetExtPath(const AValue: string);{$ENDIF}
procedure SetFontPath(const AValue: String);
procedure SetIncludePath(const AValue: String);
procedure SetInterpreter(const AValue: Integer);
@ -505,7 +507,7 @@ type
property IncludePath : String read GetIncludePath write SetIncludePath;
property FontPath : String read GetFontPath write SetFontPath;
property PluginPath : string read GetPluginPath write SetPluginPath;
property ExtPath : string read GetExtPath write SetExtPath;
{$IFDEF USE_EXTENSIONS}property ExtPath : string read GetExtPath write SetExtPath;{$ENDIF}
property ScriptDir : string read GetScriptPath write SetScriptPath;
property DefScriptPath : string read GetDefScriptPath write SetDefScriptPath;
property CurrHighlighter : TSynCustomHighlighter read GetHighlighter;
@ -549,7 +551,7 @@ uses
InterfaceBase,
bitmapconv,
bitmaps,
extensionmanagergui,
{$IFDEF USE_EXTENSIONS}extensionmanagergui,{$ENDIF}
colourhistory,
math
@ -750,6 +752,7 @@ begin
end;
procedure TSimbaForm.HandleConnectionData;
{$IFDEF USE_EXTENSIONS}
var
Args : TVariantArray;
begin
@ -764,6 +767,9 @@ begin
on e : Exception do
mDebugLn('ERROR in HandleConnectiondata: ' + e.message);
end;
{$ELSE}
begin
{$ENDIF}
end;
function TSimbaForm.GetInterpreter: Integer;
@ -787,6 +793,7 @@ begin
end;
procedure TSimbaForm.HandleOpenFileData;
{$IFDEF USE_EXTENSIONS}
var
Args : TVariantArray;
begin
@ -801,9 +808,13 @@ begin
on e : Exception do
mDebugLn('ERROR in HandleOpenFileData: ' + e.message);
end;
{$ELSE}
begin
{$ENDIF}
end;
procedure TSimbaForm.HandleWriteFileData;
{$IFDEF USE_EXTENSIONS}
var
Args : TVariantArray;
begin
@ -818,9 +829,13 @@ begin
on e : Exception do
mDebugLn('ERROR in HandleWriteFileData: ' + e.message);
end;
{$ELSE}
begin
{$ENDIF}
end;
procedure TSimbaForm.HandleScriptStartData;
{$IFDEF USE_EXTENSIONS}
var
Args : TVariantArray;
begin
@ -835,6 +850,9 @@ begin
on e : Exception do
mDebugLn('ERROR in HandleScriptStartData: ' + e.message);
end;
{$ELSE}
begin
{$ENDIF}
end;
procedure TSimbaForm.ProcessDebugStream(Sender: TObject);
@ -1367,7 +1385,7 @@ begin
CreateSetting('Settings/CodeHints/ShowAutomatically','True');
CreateSetting('Settings/CodeCompletion/ShowAutomatically','True');
CreateSetting('Settings/SourceEditor/LazColors','True');
CreateSetting('Settings/Extensions/FileExtension','sex');
{$IFDEF USE_EXTENSIONS}CreateSetting('Settings/Extensions/FileExtension','sex');{$ENDIF}
CreateSetting('Settings/Updater/RemoteLink',SimbaURL + 'Simba'{$IFDEF WINDOWS} +'.exe'{$ENDIF});
CreateSetting('Settings/Updater/RemoteVersionLink',SimbaURL + 'Version');
@ -1378,8 +1396,10 @@ begin
{Creates the paths and returns the path}
PluginsPath := CreateSetting('Settings/Plugins/Path', ExpandFileName(MainDir+ DS+ 'Plugins' + DS));
{$IFDEF USE_EXTENSIONS}
extensionsPath := CreateSetting('Settings/Extensions/Path',ExpandFileName(MainDir +DS + 'Extensions' + DS));
CreateSetting('Extensions/ExtensionCount','0');
{$ENDIF}
CreateSetting('LastConfig/MainForm/Position','');
CreateSetting('LastConfig/MainForm/State','Normal');
{$ifdef MSWindows}
@ -1393,10 +1413,12 @@ begin
CreateDir(FontPath);
if not DirectoryExists(PluginsPath) then
CreateDir(PluginsPath);
{$IFDEF USE_EXTENSIONS}
if not DirectoryExists(extensionsPath) then
CreateDir(extensionsPath);
if not DirectoryExists(ExtPath) then
CreateDir(ExtPath);
{$ENDIF}
if not DirectoryExists(ScriptDir) then
CreateDir(ScriptDir);
SettingsForm.SettingsTreeView.Items.GetFirstNode.Expand(false);
@ -1497,19 +1519,21 @@ begin
else
SetSetting('LastConfig/Console/Visible','False');
{$endif}
{$IFDEF USE_EXTENSIONS}
SetSetting('Extensions/ExtensionCount',inttostr(ExtManager.Extensions.Count));
for i := 0 to ExtManager.Extensions.Count-1 do
begin;
path :='Extensions/Extension' + inttostr(I);
SetSetting(Path + '/Path',TVirtualSimbaExtension(ExtManager.Extensions[i]).Filename);
SetSetting(Path + '/Enabled',BoolToStr(TVirtualSimbaExtension(ExtManager.Extensions[i]).Enabled,True));
end;
{$ENDIF}
SaveToXML(SimbaSettingsFile);
end;
end;
procedure TSimbaForm.LoadExtensions;
{$IFDEF USE_EXTENSIONS}
var
extCount : integer;
function LoadExtension(Number : integer) : boolean;
@ -1557,6 +1581,9 @@ begin
str := LoadSettingDef('Settings/Extensions/Path',ExpandFileName(MainDir +DS + 'Extensions' + DS));
str2 := LoadSettingDef('Settings/Extensions/FileExtension','sex');
ExtManager.LoadPSExtensionsDir(str,str2);
{$ELSE}
begin
{$ENDIF}
end;
procedure TSimbaForm.AddRecentFile(const filename: string);
@ -1656,26 +1683,30 @@ begin
Thread.Client.IOManager.SetTarget(Selector.LastPick);
loadFontsOnScriptStart := (lowercase(LoadSettingDef('Settings/Fonts/LoadOnStartUp', 'True')) = 'true');
// Copy our current fonts
if not assigned(Self.OCR_Fonts) and loadFontsOnScriptStart and DirectoryExists(fontPath) then
if (loadFontsOnScriptStart) then
begin
Self.OCR_Fonts := TMOCR.Create(Thread.Client);
OCR_Fonts.InitTOCR(fontPath);
Thread.Client.MOCR.Fonts := OCR_Fonts.Fonts
end else
if assigned(Self.OCR_Fonts) and loadFontsOnScriptStart then
if ((not (Assigned(OCR_Fonts))) and DirectoryExists(fontPath)) then
begin
OCR_Fonts := TMOCR.Create(Thread.Client);
OCR_Fonts.InitTOCR(fontPath);
end;
if (Assigned(OCR_Fonts)) then
Thread.Client.MOCR.Fonts := OCR_Fonts.Fonts;
end;
{
We pass the entire settings to the script; it will then create a Sandbox
for settings that are exported to the script. This way we can access all
the settings from the PSTHread, and scripts can only access limited
the settings from the PSThread, and scripts can only access limited
resources. Hopefully this won't cause any form / thread related problems?
(Settings doesn't use the Settings form, iirc)
Well, it was like this previously as well, we just passed a sandbox to it
directly, but the sandbox still called Settings.
}
Thread.SetSettings(SettingsForm.Settings, SimbaSettingsFile);
Thread.OpenConnectionEvent:=@ThreadOpenConnectionEvent;
Thread.WriteFileEvent:=@ThreadWriteFileEvent;
Thread.OpenFileEvent:=@ThreadOpenFileEvent;
@ -1841,15 +1872,17 @@ end;
procedure TSimbaForm.ActionExtensionsExecute(Sender: TObject);
begin
{$IFDEF USE_EXTENSIONS}
if not ExtensionsForm.Showing then
ExtensionsForm.Show
else
ExtensionsForm.Hide;
{$ENDIF}
end;
procedure TSimbaForm.ActionExtensionsUpdate(Sender: TObject);
begin
TAction(Sender).Checked := ExtensionsForm.Showing;
{$IFDEF USE_EXTENSIONS}TAction(Sender).Checked := ExtensionsForm.Showing;{$ENDIF}
end;
procedure TSimbaForm.ActionFindNextExecute(Sender: TObject);
@ -2324,7 +2357,7 @@ begin
end;
FunctionListTimer.Enabled:= false;
CloseAction := caFree;
FreeAndNil(ExtManager);
{$IFDEF USE_EXTENSIONS}FreeAndNil(ExtManager);{$ENDIF}
end;
procedure CCFillCore;
@ -2426,6 +2459,7 @@ begin
UpdateTimer.OnTimer:= @UpdateTimerCheck;
Application.CreateForm(TSimbaUpdateForm, SimbaUpdateForm);
{$IFDEF USE_EXTENSIONS}Application.CreateForm(TExtensionsForm, ExtensionsForm);{$ENDIF}
if FileExistsUTF8(SimbaSettingsFile) then
begin
@ -2480,12 +2514,13 @@ begin
FillThread.Resume;
//Load the extensions
LoadExtensions;
{$IFDEF USE_EXTENSIONS}LoadExtensions;{$ENDIF}
UpdateTitle;
{$IFDEF USE_RUTIS}MenuItemRUTIS.Enabled := True;{$ENDIF}
{$IFDEF USE_LAPE}MenuItemLape.Enabled := True;{$ENDIF}
{$IFDEF USE_EXTENSIONS}ActionExtensions.Visible := True;{$ENDIF}
self.EndFormUpdate;
if SettingsForm.Oops then
@ -2503,8 +2538,10 @@ begin
for i := 0 to high(RecentFileItems) do
RecentFileItems[i].Free;
if ExtManager <> nil then
FreeAndNil(extmanager);
{$IFDEF USE_EXTENSIONS}
if ExtManager <> nil then
FreeAndNil(extmanager);
{$ENDIF}
Tabs.Free;
@ -2516,6 +2553,10 @@ begin
{ Free the plugins }
PluginsGlob.Free;
{ Free Fonts }
if (Assigned(OCR_Fonts)) then
OCR_Fonts.Free;
SetLength(DebugStream, 0);
DebugCriticalSection.Free;
@ -2810,10 +2851,12 @@ begin
SetSetting('Settings/SourceEditor/DefScriptPath',AValue,True);
end;
{$IFDEF USE_EXTENSIONS}
procedure TSimbaForm.SetExtPath(const AValue: string);
begin
SetSetting('Settings/Extensions/Path',AValue,true);
end;
{$ENDIF}
procedure TSimbaForm.NewsTimerTimer(Sender: TObject);
var
@ -2843,6 +2886,11 @@ var
c, x, y: Integer;
cobj: TColourPickerObject;
begin
if Picker.Picking then
begin
formWriteln('Error: Already picking a colour');
exit;
end;
Picker.Pick(c, x, y);
cobj := TColourPickerObject.Create(c, Classes.Point(x,y), '');
@ -2943,6 +2991,7 @@ end;
procedure TSimbaForm.PickerPick(Sender: TObject; const Colour, colourx,
coloury: integer);
{$IFDEF USE_EXTENSIONS}
var
Args : TVariantArray;
begin
@ -2951,6 +3000,9 @@ begin
Args[1] := Colourx;
Args[2] := Coloury;
ExtManager.HandleHook(EventHooks[SExt_OnColourPick].HookName,Args);
{$ELSE}
begin
{$ENDIF}
end;
procedure TSimbaForm.PopupItemFindClick(Sender: TObject);
@ -2984,10 +3036,12 @@ begin
Result := IncludeTrailingPathDelimiter(LoadSettingDef('Settings/Fonts/Path', ExpandFileName(MainDir+DS+'Fonts' + DS)));
end;
{$IFDEF USE_EXTENSIONS}
function TSimbaForm.GetExtPath: string;
begin
result :=IncludeTrailingPathDelimiter(LoadSettingDef('Settings/Extensions/Path', ExpandFileName(MainDir+DS+'Extensions' + DS)));
Result := IncludeTrailingPathDelimiter(LoadSettingDef('Settings/Extensions/Path', ExpandFileName(MainDir+DS+'Extensions' + DS)));
end;
{$ENDIF}
function TSimbaForm.GetHighlighter: TSynCustomHighlighter;
begin
@ -3139,7 +3193,6 @@ begin
if Assigned(self.OCR_Fonts) then
self.OCR_Fonts.Free;
FormWriteln('Freeing the current fonts. Creating new ones now');
// XXX: Can this cause problems when running scripts?
Self.OCR_Fonts := TMOCR.Create(nil);
OCR_Fonts.InitTOCR(fontPath);
end;
@ -3309,7 +3362,8 @@ begin
else
InitialDir := ScriptDir;
Options := [ofAllowMultiSelect, ofExtensionDifferent, ofPathMustExist, ofFileMustExist, ofEnableSizing, ofViewDetail];
Filter:= 'Simba Files|*.simba;*.simb;*.cogat;*.mufa;*.txt;*.' +LoadSettingDef('Settings/Extensions/FileExtension','sex')+
Filter:= 'Simba Files|*.simba;*.simb;*.cogat;*.mufa;*.txt' +
{$IFDEF USE_EXTENSIONS}';*.' + LoadSettingDef('Settings/Extensions/FileExtension', 'sex') + {$ENDIF}
'|Any files|*.*';
if Execute then
begin
@ -3416,8 +3470,8 @@ begin
InitialDir := ExtractFileDir(CurrScript.ScriptFile)
else
InitialDir := ScriptDir;
filter := 'Simba Files|*.simba;*.simb;*.cogat;*.mufa;*.txt;*.' +
LoadSettingDef('Settings/Extensions/FileExtension','sex')+
filter := 'Simba Files|*.simba;*.simb;*.cogat;*.mufa;*.txt' +
{$IFDEF USE_EXTENSIONS}';*.' + LoadSettingDef('Settings/Extensions/FileExtension','sex') + {$ENDIF}
'|Any files|*.*';
if Execute then
begin;

View File

@ -15,6 +15,11 @@ Const
MOUSE_UP = 0;
MOUSE_DOWN = 1;
{
Global variables.
To actually read the last_error, make sure you copy it to a safe place
directly after the function call.
}
var
last_error: String;
debug: boolean;
@ -23,28 +28,28 @@ var
function init: integer; cdecl;
begin
last_error := '';
debug := true;
result := RESULT_OK;
last_error := '';
debug := true;
result := RESULT_OK;
end;
procedure set_last_error(s: string);
begin
last_error := s;
if debug then
writeln('ERROR: ' + s);
last_error := s;
if debug then
writeln('ERROR: ' + s);
end;
{ Validate the TClient. If it is NULL, set last error and return false }
function validate_client(C: TClient): boolean; inline;
begin
result := Assigned(C);
if not result then
begin
last_error := 'PClient is NULL';
if debug then
writeln(last_error);
end;
result := Assigned(C);
if not result then
begin
last_error := 'PClient is NULL';
if debug then
writeln(last_error);
end;
end;
{
@ -55,42 +60,42 @@ function create_client: PtrUInt; cdecl;
var
C: TClient;
begin
try
C := TClient.Create('');
Result := PtrUInt(C);
except on e : Exception do
begin
// FIXME UINT negative
result := PtrUInt(RESULT_ERROR);
set_last_error(e.message);
end;
end;
writeln(format('C: %d, IOManager: %d', [PtrUInt(C), PtrUInt(C.IOManager)]));
try
C := TClient.Create('');
Result := PtrUInt(C);
except on e : Exception do
begin
// FIXME UINT negative
result := PtrUInt(RESULT_ERROR);
set_last_error(e.message);
end;
end;
writeln(format('C: %d, IOManager: %d', [PtrUInt(C), PtrUInt(C.IOManager)]));
end;
{ Destroy a TClient }
function destroy_client(C: TClient): integer; cdecl;
begin
try
C.Free;
except on e : Exception do
begin
result := RESULT_ERROR;
set_last_error(e.message);
end;
end;
try
C.Free;
except on e : Exception do
begin
result := RESULT_ERROR;
set_last_error(e.message);
end;
end;
end;
{ Set (verbose) debug on/off }
procedure set_debug(v: Boolean); cdecl;
begin
debug := v;
debug := v;
end;
{ Get debug }
function get_debug: boolean; cdecl;
begin
exit(debug);
exit(debug);
end;
{
@ -101,40 +106,40 @@ end;
}
function get_last_error: pchar; cdecl;
begin
exit(@last_error[1]);
exit(@last_error[1]);
end;
{ Turn an array into a pointer. The pointer memory is not managed by FPC, so we can pass
it along happily. It'll have to be freed by the external control though }
function array_to_ptr(ptr: Pointer; size: PtrUInt; objsize: PtrUInt): Pointer; cdecl;
begin
result := GetMem(objsize * size);
Move(ptr^, result^, objsize * size);
result := GetMem(objsize * size);
Move(ptr^, result^, objsize * size);
end;
{ Free memory previously allocated by libMML }
function free_ptr(ptr: pointer): boolean; cdecl;
begin
result := Assigned(ptr);
if not result then
begin
set_last_error('TClient is NULL');
if debug then
writeln(last_error);
end else
FreeMem(ptr);
result := Assigned(ptr);
if not result then
begin
set_last_error('TClient is NULL');
if debug then
writeln(last_error);
end else
FreeMem(ptr);
end;
{ Allocate memory with libMML }
function alloc_mem(size, objsize: PtrUInt): Pointer; cdecl;
begin
result := GetMem(size * objsize);
result := GetMem(size * objsize);
end;
{ Reallocate memory with libMML }
function realloc_mem(ptr: Pointer; size, objsize: PtrUInt): Pointer; cdecl;
begin
result := ReAllocMem(ptr, size*objsize);
result := ReAllocMem(ptr, size*objsize);
end;
{ Mouse }
@ -143,34 +148,32 @@ end;
function get_mouse_pos(C: TClient; var t: tpoint): integer; cdecl;
begin
if not validate_client(C) then
if not validate_client(C) then
exit(RESULT_ERROR);
try
C.IOManager.GetMousePos(t.x,t.y);
result := RESULT_OK;
except on e : Exception do
begin
exit(RESULT_ERROR);
end;
try
C.IOManager.GetMousePos(t.x,t.y);
result := RESULT_OK;
except on e : Exception do
begin
result := RESULT_ERROR;
set_last_error(e.Message);
end;
result := RESULT_ERROR;
set_last_error(e.Message);
end;
end;
end;
{ Set mouse position of client C to point t }
function set_mouse_pos(C: TClient; var t: tpoint): integer; cdecl;
begin
try
C.IOManager.MoveMouse(t.x,t.y);
result := RESULT_OK;
except on e : Exception do
try
C.IOManager.MoveMouse(t.x,t.y);
result := RESULT_OK;
except on e : Exception do
begin
result := RESULT_ERROR;
set_last_error(e.Message);
end;
end;
end;
end;
@ -187,38 +190,38 @@ end;
{ Return the state of a mouse button given client C }
function get_mouse_button_state(C: TClient; But: Integer): Integer; cdecl;
begin
try
if C.IOManager.IsMouseButtonDown(ConvIntClickType(But)) then
result := MOUSE_DOWN
else
result := MOUSE_UP;
except on e : Exception do
try
if C.IOManager.IsMouseButtonDown(ConvIntClickType(But)) then
result := MOUSE_DOWN
else
result := MOUSE_UP;
except on e : Exception do
begin
result := RESULT_ERROR;
set_last_error(e.Message);
end;
result := RESULT_ERROR;
set_last_error(e.Message);
end;
end;
end;
{ Set the state of a mouse button given client C }
function set_mouse_button_state(C: TClient; But, State, X, Y: Integer): Integer; cdecl;
begin
try
if State = MOUSE_UP then
begin
C.IOManager.ReleaseMouse(X, Y, ConvIntClickType(But));
result := RESULT_OK;
end else if state = MOUSE_DOWN then
begin
C.IOManager.HoldMouse(X, Y, ConvIntClickType(But));
result := RESULT_OK;
end;
except on e : Exception do
try
if State = MOUSE_UP then
begin
result := RESULT_ERROR;
set_last_error(e.Message);
C.IOManager.ReleaseMouse(X, Y, ConvIntClickType(But));
result := RESULT_OK;
end else if state = MOUSE_DOWN then
begin
C.IOManager.HoldMouse(X, Y, ConvIntClickType(But));
result := RESULT_OK;
end;
except on e : Exception do
begin
result := RESULT_ERROR;
set_last_error(e.Message);
end;
end;
end;
@ -227,52 +230,52 @@ end;
function get_color(C: TClient; x, y: Integer;
out color: Integer): Integer; cdecl;
begin
try
color := C.IOManager.GetColor(x, y);
if color > -1 then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
try
color := C.IOManager.GetColor(x, y);
if color > -1 then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end;
set_last_error(e.message);
result := RESULT_ERROR;
end;
end;
end;
{ Find color on client C in area (x1,y1,x2,y2) and return coordinate (if any) in x, y }
function find_color(C: TClient; var x, y: Integer;
color, x1, y1, x2, y2: Integer): Integer; cdecl;
begin
try
if C.MFinder.FindColor(x, y, color, x1, y1, x2, y2) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
try
if C.MFinder.FindColor(x, y, color, x1, y1, x2, y2) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
begin
set_last_error(e.Message);
result := RESULT_ERROR;
end;
set_last_error(e.Message);
result := RESULT_ERROR;
end;
end;
end;
function find_color_tolerance(C: TClient; var x, y: Integer; color: Integer;
tol, x1, y1, x2, y2: Integer): Integer; cdecl;
begin
try
if C.MFinder.FindColorTolerance(x, y, color, x1, y1, x2, y2, tol) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
try
if C.MFinder.FindColorTolerance(x, y, color, x1, y1, x2, y2, tol) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
begin
set_last_error(e.Message);
result := RESULT_ERROR;
end;
set_last_error(e.Message);
result := RESULT_ERROR;
end;
end;
end;
function find_color_tolerance_optimised(C: TClient; var x, y: Integer;
@ -280,18 +283,18 @@ function find_color_tolerance_optimised(C: TClient; var x, y: Integer;
x1, y1, x2, y2: Integer;
tol: Integer): Integer; cdecl;
begin
try
if C.MFinder.FindColorToleranceOptimised(x, y, col, x1, y1, x2, y2,
tol) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
try
if C.MFinder.FindColorToleranceOptimised(x, y, col, x1, y1, x2, y2,
tol) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end;
set_last_error(e.message);
result := RESULT_ERROR;
end;
end;
end;
function find_colors(C: TClient; var ptr: PPoint; var len: Integer;
@ -299,27 +302,27 @@ function find_colors(C: TClient; var ptr: PPoint; var len: Integer;
var
TPA: TPointArray;
begin
setlength(TPA, 0);
try
C.MFinder.FindColors(TPA, color, x1, y1, x2, y2);
except on e : Exception do
setlength(TPA, 0);
try
C.MFinder.FindColors(TPA, color, x1, y1, x2, y2);
except on e : Exception do
begin
set_last_error(e.Message);
result := RESULT_ERROR;
set_last_error(e.Message);
result := RESULT_ERROR;
end;
end;
len := Length(TPA);
if len > 0 then
result := RESULT_OK
else
begin
setlength(tpa, 0);
exit(RESULT_FALSE);
end;
ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint));
end;
len := Length(TPA);
if len > 0 then
result := RESULT_OK
else
begin
setlength(tpa, 0);
exit(RESULT_FALSE);
end;
ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint));
setlength(tpa, 0);
end;
function find_colors_tolerance(C: TClient; var ptr: PPoint; var len: Integer;
@ -327,26 +330,26 @@ function find_colors_tolerance(C: TClient; var ptr: PPoint; var len: Integer;
var
TPA: TPointArray;
begin
try
C.MFinder.FindColorsTolerance(TPA, color, x1, y1, x2, y2, tol);
except on e : Exception do
try
C.MFinder.FindColorsTolerance(TPA, color, x1, y1, x2, y2, tol);
except on e : Exception do
begin
set_last_error(e.Message);
result := RESULT_ERROR;
end;
end;
len := Length(TPA);
if len > 0 then
result := RESULT_OK
else
begin
setlength(tpa, 0);
exit(RESULT_FALSE);
set_last_error(e.Message);
result := RESULT_ERROR;
end;
end;
ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint));
setlength(TPA, 0);
len := Length(TPA);
if len > 0 then
result := RESULT_OK
else
begin
setlength(tpa, 0);
exit(RESULT_FALSE);
end;
ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint));
setlength(TPA, 0);
end;
function find_colors_tolerance_optimised(C: TClient; var ptr: PPoint;
@ -356,184 +359,184 @@ function find_colors_tolerance_optimised(C: TClient; var ptr: PPoint;
var
TPA: TPointArray;
begin
try
C.MFinder.FindColorsToleranceOptimised(TPA, col, x1, y1, x2, y2, tol);
except on e : Exception do
try
C.MFinder.FindColorsToleranceOptimised(TPA, col, x1, y1, x2, y2, tol);
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
set_last_error(e.message);
result := RESULT_ERROR;
end;
end;
len := Length(TPA);
if len > 0 then
result := RESULT_OK
else
begin
setlength(tpa, 0);
exit(RESULT_FALSE);
end;
ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint));
setlength(TPA, 0);
end;
len := Length(TPA);
if len > 0 then
result := RESULT_OK
else
begin
setlength(tpa, 0);
exit(RESULT_FALSE);
end;
ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint));
setlength(TPA, 0);
end;
function similar_colors(C: TClient; col1, col2, tol: Integer): Integer; cdecl;
begin
try
if C.MFinder.SimilarColors(col1, col2, tol) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
try
if C.MFinder.SimilarColors(col1, col2, tol) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_FALSE;
end;
set_last_error(e.message);
result := RESULT_FALSE;
end;
end;
end;
function count_color(C: TClient; out count: Integer;
Color, xs, ys, xe, ye: Integer): Integer; cdecl;
begin
try
count := C.MFinder.CountColor(Color, xs, ys, xe, ye);
if count > 0 then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
try
count := C.MFinder.CountColor(Color, xs, ys, xe, ye);
if count > 0 then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end;
set_last_error(e.message);
result := RESULT_ERROR;
end;
end;
end;
function count_color_tolerance(C: TClient; out count: Integer; col: Integer;
xs, ys, xe, ye, tol: Integer): Integer; cdecl;
begin
try
count := C.MFinder.CountColorTolerance(col, xs, ys, xe, ye, tol);
except on e : Exception do
try
count := C.MFinder.CountColorTolerance(col, xs, ys, xe, ye, tol);
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end;
set_last_error(e.message);
result := RESULT_ERROR;
end;
end;
if count > 0 then
result := RESULT_OK
else
result := RESULT_FALSE;
if count > 0 then
result := RESULT_OK
else
result := RESULT_FALSE;
end;
function find_color_spiral(C: TClient; var x, y: Integer;
col, xs, ys, xe, ye: Integer): Integer; cdecl;
begin
try
if C.MFinder.FindColorSpiral(x, y, col, xs, ys, xe, ye) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
try
if C.MFinder.FindColorSpiral(x, y, col, xs, ys, xe, ye) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end;
set_last_error(e.message);
result := RESULT_ERROR;
end;
end;
end;
function find_color_spiral_tolerance(C: TClient; var x, y: Integer;
col, xs, ys, xe, ye: Integer;
tol: Integer): Integer; cdecl;
begin
try
if C.MFinder.FindColorSpiralTolerance(x, y, col, xs, ys, xe, ye,
tol) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
try
if C.MFinder.FindColorSpiralTolerance(x, y, col, xs, ys, xe, ye,
tol) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end;
set_last_error(e.message);
result := RESULT_ERROR;
end;
end;
end;
function find_colored_area(C: TClient; var x, y: Integer;
col, xs, ys, xe, ye, minA: Integer): Integer; cdecl;
begin
try
if C.MFinder.FindColoredArea(x, y, col, xs, ys, xe, ye, minA) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
try
if C.MFinder.FindColoredArea(x, y, col, xs, ys, xe, ye, minA) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end;
set_last_error(e.message);
result := RESULT_ERROR;
end;
end;
end;
function find_colored_area_tolerance(C: TClient; var x, y: Integer;
col, xs, ys, xe, ye, minA: Integer;
tol: Integer): Integer; cdecl;
begin
try
if C.MFinder.FindColoredAreaTolerance(x, y, col,
xs, ys, xe, ye, minA, tol) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
try
if C.MFinder.FindColoredAreaTolerance(x, y, col,
xs, ys, xe, ye, minA, tol) then
result := RESULT_OK
else
result := RESULT_FALSE;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end;
set_last_error(e.message);
result := RESULT_ERROR;
end;
end;
end;
function set_tolerance_speed(C: TClient; nCTS: Integer): Integer; cdecl;
begin
try
C.MFinder.SetToleranceSpeed(nCTS);
result := RESULT_OK;
except on e : Exception do
try
C.MFinder.SetToleranceSpeed(nCTS);
result := RESULT_OK;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end;
set_last_error(e.message);
result := RESULT_ERROR;
end;
end;
end;
function get_tolerance_speed(C: TClient; out cts: Integer): Integer; cdecl;
begin
try
cts := C.MFinder.GetToleranceSpeed;
result := RESULT_OK;
except on e: Exception do
begin;
set_last_error(e.message);
result := RESULT_ERROR;
try
cts := C.MFinder.GetToleranceSpeed;
result := RESULT_OK;
except on e: Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end
end;
end;
end;
function set_tolerance_speed_2_modifiers(C: TClient;
nHue, nSat: Extended): Integer; cdecl;
begin
try
C.MFinder.SetToleranceSpeed2Modifiers(nHue, nSat);
result := RESULT_OK;
except on e : Exception do
begin;
set_last_error(e.message);
result := RESULT_ERROR;
end;
try
C.MFinder.SetToleranceSpeed2Modifiers(nHue, nSat);
result := RESULT_OK;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end;
end;
end;
function get_tolerance_speed_2_modifiers(C: TClient; out hueMod: Extended;
@ -541,17 +544,17 @@ function get_tolerance_speed_2_modifiers(C: TClient; out hueMod: Extended;
var
h, s: Extended;
begin
try
C.MFinder.GetToleranceSpeed2Modifiers(h, s);
hueMod := h;
satMod := s;
result := RESULT_OK;
except on e : Exception do
begin;
set_last_error(e.message);
result := RESULT_ERROR;
end;
try
C.MFinder.GetToleranceSpeed2Modifiers(h, s);
hueMod := h;
satMod := s;
result := RESULT_OK;
except on e : Exception do
begin
set_last_error(e.message);
result := RESULT_ERROR;
end;
end;
end;
{ DTM }
@ -564,53 +567,53 @@ function create_dtm(PointLen: integer; Points: PMDTMPoint; DTM: TMDTM): integer;
var
i: integer;
begin
DTM := TMDTM.Create;
for i := 0 to PointLen - 1 do
DTM.AddPoint(Points[i]);
if DTM.Valid then
exit(RESULT_OK);
DTM.Free;
set_last_error('Invalid DTM');
result := RESULT_ERROR;
DTM := TMDTM.Create;
for i := 0 to PointLen - 1 do
DTM.AddPoint(Points[i]);
if DTM.Valid then
exit(RESULT_OK);
DTM.Free;
set_last_error('Invalid DTM');
result := RESULT_ERROR;
end;
{ Delete a MDTM. Don't delete it if it is managed! use remove_dtm instead }
function delete_dtm(C: TClient; DTM: TMDTM): integer; cdecl;
begin
if not assigned(DTM) then
begin
set_last_error('DTM is NULL');
exit(RESULT_ERROR);
end;
DTM.Free;
result := RESULT_OK;
if not assigned(DTM) then
begin
set_last_error('DTM is NULL');
exit(RESULT_ERROR);
end;
DTM.Free;
result := RESULT_OK;
end;
{ Add a previously created DTM to the DTM Manager }
function add_dtm(C: TClient; DTM: TMDTM; var index: integer): integer; cdecl;
begin
if not assigned(DTM) then
begin
set_last_error('DTM is NULL');
exit(RESULT_ERROR);
end;
try
index := C.MDTMs.AddDTM(DTM);
exit(RESULT_OK);
except on e : Exception do
result := RESULT_ERROR;
end;
if not assigned(DTM) then
begin
set_last_error('DTM is NULL');
exit(RESULT_ERROR);
end;
try
index := C.MDTMs.AddDTM(DTM);
exit(RESULT_OK);
except on e : Exception do
result := RESULT_ERROR;
end;
end;
{ Remove a previously added DTM from the DTM manager. This also frees the DTM }
function remove_dtm(C: TClient; DTMi: integer): integer; cdecl;
begin
C.MDTMs.FreeDTM(DTMi);
C.MDTMs.FreeDTM(DTMi);
end;
{ Find a DTM given DTM index i, client C in area x1,y1,x2,y2. Return coord at x, y. }
@ -619,19 +622,19 @@ function find_dtm(C: TClient; DTMi: integer; var x, y: integer; x1, y1, x2,
var
res: boolean;
begin
try
res := C.MFinder.FindDTM(C.MDTMs.DTM[DTMi], x, y, x1, y1, x2, y2);
except on e : Exception do
try
res := C.MFinder.FindDTM(C.MDTMs.DTM[DTMi], x, y, x1, y1, x2, y2);
except on e : Exception do
begin;
result := RESULT_ERROR;
set_last_error(e.Message);
result := RESULT_ERROR;
set_last_error(e.Message);
end;
end;
if res then
result := RESULT_OK
else
result := RESULT_FALSE;
end;
if res then
result := RESULT_OK
else
result := RESULT_FALSE;
end;
{ Find a DTM given DTM index i, client C in area x1,y1,x2,y2. Return coord at x, y. }
@ -642,46 +645,46 @@ var
len: integer;
TPA: TPointArray;
begin
try
res := C.MFinder.FindDTMs(C.MDTMs.DTM[DTMi], TPA, x1, y1, x2, y2);
except on e : Exception do
begin;
result := RESULT_ERROR;
set_last_error(e.Message);
end;
end;
len := Length(TPA);
if len > 0 then
result := RESULT_OK
else
begin
setlength(tpa, 0);
exit(RESULT_FALSE);
end;
ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint));
setlength(TPA, 0);
try
res := C.MFinder.FindDTMs(C.MDTMs.DTM[DTMi], TPA, x1, y1, x2, y2);
except on e : Exception do
begin;
result := RESULT_ERROR;
set_last_error(e.Message);
end;
end;
len := Length(TPA);
if len > 0 then
result := RESULT_OK
else
begin
setlength(tpa, 0);
exit(RESULT_FALSE);
end;
ptr := array_to_ptr(Pointer(@TPA[0]), len, sizeof(TPoint));
setlength(TPA, 0);
end;
function set_array_target(C: TClient; Arr: PRGB32; Size: TPoint): integer;
cdecl;
begin
if not assigned(Arr) then
if not assigned(Arr) then
begin
set_last_error('Arr is not assigned');
exit(RESULT_FALSE);
end;
try
C.IOManager.SetTarget(Arr, Size);
result := RESULT_OK;
except on e : Exception do
begin
set_last_error('Arr is not assigned');
exit(RESULT_FALSE);
end;
try
C.IOManager.SetTarget(Arr, Size);
result := RESULT_OK;
except on e : Exception do
begin;
set_last_error(e.message);
result := RESULT_FALSE;
end;
set_last_error(e.message);
result := RESULT_FALSE;
end;
end;
end;
exports

60
TODO
View File

@ -1,10 +1,52 @@
- Make Simba more ``modular'':
- Fonts
- Interpreters
- Code completion/hints
- Extensions
- Interpreter system overhaul?
Simple stuff, not required, may not be possible/useful:
- Compiler arguments in the about form [ ]
- Coloured writeln [ ]
- Make an TAction for the Colour Picker. [ ]
- Portable install (needs fiddling with settings and such) [ ]
- --no-extensions flag for Simba. [ ]
- CTS/finder speedups and changes [ ]
General ideas:
- everything subprocedure (lots of code)
- jit + comparison function (per cts) generated, call in loop
- comparison function (per cts), not generated, call in loop
- JIT (Generate comparison functions) [ ]
- Comparison functions for HSL/XYZ/L*a*b should check for
match on each component before calculating the next.
(see FindColorsToleranceOptimised)
- Pass color information in struct [ ]
- Precalculate screen bitmap in current cts / keep a cache
to save comparisons [ ]
- Add CTS 3 [ ]
- Add a direct RGB -> CIE L*a*b conversion [ ]
- Make sure colour conversions are inline [ ]
- More documentation:
- Cover all functions by at least mentioning the definition [ ]
- Write tutorial [ ]
- In depth documentation per function [ ]
- New interpreters
- DWSScript ? [ ]
- Lape! [ ]
- Integrate script manager [ ]
- Basic support. (Install scripts) [ ]
- Update functionality [ ]
- Uninstall scripts [ ]
- Better storage / more stable storage [ ]
- Pretty GUI [ ]
- Merging / storing usernames when updating [ ]
- Make Simba more ``modular'':
- Fonts [ ]
- Interpreters [ ]
- Code completion/hints [ ]
- Extensions [ ]
- Interpreter system overhaul? [ ]
- Make an TAction for the Colour Picker.
- Portable install (needs fiddling with settings and such)
- --no-extensions flag for Simba.

View File

@ -51,7 +51,12 @@ type
procedure ImageMainMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
procedure ImageInfoMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
Procedure ColorPickUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
procedure ColorPickUp(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);
private
{ Are we currently picking? }
FPicking: Boolean;
public
manager: TIOManager;
{ Form components }
@ -68,7 +73,9 @@ type
{ Handles }
InfoHandle, ImageHandle : HDC;
public
property Picking: Boolean read FPicking;
property OnPick: TColourPickEvent read FPickEvent write FPickEvent;
end;
@ -80,7 +87,8 @@ constructor TMColorPicker.Create(manager: TIOManager);
begin
inherited Create;
self.manager := manager;
Self.manager := manager;
Self.FPicking := False;
end;
destructor TMColorPicker.Destroy;
@ -103,12 +111,17 @@ var
begin
if self.FPicking then
raise Exception.Create('Pick() has not yet returned, but has been called'
+ 'again');
Self.FPicking := True;
{ Disable both of the color pick buttons }
w := 0;
h := 0;
{ If the target window isn't valid (closed etc), make the destkop the new window}
if not Self.Manager.TargetValid then
self.Manager.SetDesktop;
Self.Manager.SetDesktop;
{Desktop is needed for the whole picture}
Desktop := TIOManager.Create;
@ -214,6 +227,8 @@ begin
Desktop.free;
self.FPicking := False;
{ Re-enable the color pick buttons }
// Application.MainForm.Enabled := True;
// ColourHistoryForm.Enabled := True;

View File

@ -176,12 +176,15 @@ end;
{ Get the current pointer to our list of Fonts }
function TMOCR.GetFonts:TMFonts;
begin
Exit(Self.FFonts);
Result := Self.FFonts;
end;
{ Set new Fonts. We set it to a Copy of NewFonts }
procedure TMOCR.SetFonts(const NewFonts: TMFonts);
begin
if (Self.FFonts <> nil) then
Self.FFonts.Free;
Self.FFonts := NewFonts.Copy(Self.Client);
end;

View File

@ -85,7 +85,7 @@ uses
Classes,
synafpc,
{$IFNDEF MSWINDOWS}
Libc, SysUtils;
SysUtils;
{$ELSE}
Windows;
{$ENDIF}

@ -1 +1 @@
Subproject commit da9afa0b0461322db5c2d6cf8979e5b39004089f
Subproject commit 1b8211db373428cd2916905980ad51be8fab1f83