Older Newer
Tue, 11 Jan 2022 01:59:43 . . . . SyneRyder [Add source download link for mt5c05]


Changes by last author:

Added:
=== General Improvements in FilterMeister Version 1.0 ===

==== 1.0.9h - 31 December 2021 ====

* A bugfix release, based on the source code from 1.0.9g mt5c05.

* Detects and sets the hostname value for Affinity Photo

* Improved getWindowsVersion to detect Windows 7 - 11 if host is appropriately manifested / not running in a compatibility mode

* Suppresses the "Aborting X86_call_fmf1 -- code not valid." error message that often showed on 2nd launch in Affinity Photo 1.x

* Fixes FM crash when opening the Advanced (>>>) dialog window in hosts that don't support 'titl' or 'sstr' properties.

* Fixes FM crash when trying to save source when file extension not set.

* Fixes compiled plugin crashes in Affinity Photo & Serif Photoplus on 2nd launch when the pRGBbuffer has been incorrectly set.

* Fixes potential crash on non-alpha RGB48 images.

* Fixes crash when loading METAFILE images with an Aldus header.

* Fixes impossible logic and return of uninitialized values in setTimerEvent when state==0 or invalid state value provided.

* Source code updated to work with all versions of Visual Studio 2005 - 2022

* You can download this version and source code from the FilterMeister Website: http://www.filtermeister.com/fmbeta/

* Updated Command Reference PDF / EPUB with 34 newly documented functions and updates to 90 functions also available from: http://www.filtermeister.com/docs/

==== Alpha mt5c07 (1.0 Alpha mt5c07) - 12 November 2015 ====

* Alpha "As-Is" release. If you do not require the following specific changes, it is recommended that you continue your present development with the current mt5c06 "stable" release until such time that a fully regression-tested version is released.

* Contains a fix for the fillArray and ffillArray crashes with Arrays larger than 2GB.

* Contains a string literal pool twice as large as the previous release (now 128KB).

* Full release notes are here: Release Notes for FM 1.0 mt5c07

==== Alpha mt5c06 (1.0 Alpha mt5c06) - 4 May 2015 ====

==== Alpha mt5c05 (1.0 Alpha mt5c05) - 13 July 2014 ====

* Source code for this release is available on the FilterMeister Website: http://www.filtermeister.com/fmbeta/

==== Beta 9g (1.0 Beta 9g) - 21 February 2014 ====

* Please do not use this version to produce release-able filters until it has undergone considerably more testing!

* An alpha-quality release, currently available on 64-bit only.

* The main difference from 1.0.9f is the ability to create 64-bit plugins (as well as 32-bit plugins).

* Filters created in FM64 can load images with a maximum vertical or horizontal resolution of 300,000 pixels (up from 30,000).

* Exception handling isn't yet supported in FM64, so a Memory Access Violation could (will?) crash the host program.

* DLL loading, multithreading, scripting and floating point math may all encounter problems in this alpha version.

==== Beta 9f (1.0 Beta 9f) - June 2011 ====

* Could probably be regarded as the latest stable release. Many commercial plugins have been released with Beta 9f.

* Fixes some issues with registering FilterMeister on Windows Vista systems & newer.

==== Beta 9e (1.0 Beta 9e) - 18 April 2010 ====

* Please do not use this version to produce release-able filters until it has undergone considerably more testing!

* This is an experimental release in that it was built on a new platform from sources that have only recently been updated, and it has received almost no testing.

* The main difference from the previous release (1.0.9d) is that the problem with iget when accessing tile buffers in 16-bit mode has been fixed. (Note that this is also a non-scripting version; there are still problems to be resolved in the scripting version.)

==== Beta 9.1 (1.0 Beta 9.1) - February 2009 ====

* Scripting

** Scripting Support was added. FM plugins can now be scripted in Photoshop, PSP and Debabelizer and can be used as smart filters in Photoshop CS3 and CS4. Scripting does not work in Fireworks yet, although FM plugins can be used as live effects, but this is not recommended, because they display the dialog all of the time. By default all user-defined control are scripted unless you add "(scripting)?=off" to the control definition or use setCtlScripting(n, false). FM automatically sets controls to the values that were received by the host through scripting. This is done before the OnFilterStart handler. Make sure that your filter checks the new doingScripting variable, which indicates if script values were received, and that it does not overwrite control values from a file or the registry. But you can also manually get and set script values.(checkScriptVal)?(n) lets you check if a script value was received or not and (getScriptVal)?(n) lets you retrieve the script value. In the OnCtl handler if n==CTL_OK && e==FME_CLICKED, you can also manually set the script values, which are returned to the host, with (enableScriptVal)?(n,-1) and (setScriptVal)?(n,val). Otherwise FM will automatically pass the values of all scripting-enabled controls to the host.

** There is also a non-scripting version of FM included in the file AfhFM10Beta91_NoScripting.zip for users who want to create non-scriptable plugins.

** New (UniqueID)? property which is necessary for scripting. FM generates a new random UniqueID at every execution and compilation, but better set it yourself in your filter code.

** Added (displayDialog)? constant. 1 when a dialog is displayed, 0 when not. Use this to differentiate between normal invocation or invocation through "last filter" or the scripting system.

* Multithreading

** waitForThread() now offers -1 as the third parameter for deactivating the message pump. This will block the interface as long as waitForThread is running, but also help to avoid some problems.

** Added (createSync)?(), (waitForSync)?() and (deleteSync)?() for barrier synchronization of threads

*Other Improvements

** Functions for allocating memory through the host: allocHost (size) allocates the memory and returns the buffer ID. lockHost(bufferID) returns the memory pointer. freeHost(bufferID) deallocates the memory. These functions have the advantage that the host (at least Photoshop) will provide additional free memory if necessary. Alternatively use the array functions if you additionally want to have automatic deallocation.

** copyResToArray() now tries to open a file using the resource name in case it does not find a resource

** __getArray(), __putArray(), __fgetArray() and __fputArray() are fast versions of these array functions. They do not do any border checking, so they may produce error messages or even crashes if not used properly.

* Dialog Stuff

** New createFont(), deleteFont() and setCtlFont() functions. You can use up to 32 different fonts in FM now. The fonts are deleted automatically when FM exits.

** New updateAnchors(), (lockCtlScaling)?() and (scaleCtls)?() functions. The new (NoCtlScaling)? and (CtlScaling)? control properties can be used to temporarily stop and reactivate control repositioning and scaling.

** Set default tooltip style to normal (should have been normal style already, but balloon was wrongly set as default style). Added enableToolTipBalloon() function, taking a boolean to set normal (false) or balloon (true) style tooltips for the entire plug-in. Returns boolean indicating old style.

** Improved tab controls; You can now use tabs on tab sheets; recursive tabs.

** Improved tab controls; if tab control is disabled, children controls are disabled as well (if visible).

** Fixed visibility issues of controls on tab.

** setCtlTab() now allows to remove controls from tab controls. To do that use -1 as the second and third parameter.

** New getCtlTab() function

** Added ctlEnabledAs(n). Returns the "enabled" state of control "n" as it is rendered based on parents (e.g. a tab control), as opposed to just it's internal state.

** The Mousemove, mouseover and mouseout events are now only triggered for the button areas of a tab control and not for the whole tab control

** The previous value is now correctly set for the FME_CLICKED event of tab controls

** Added setCtlOrder() function for changing the z-order of controls

** New setCtlPixelPos() function

** New FME_CLICKED and FME_DBLCLK events when the user clicks or double clicks on a slider label

** New setCtlDefVal() and defval control property for setting a default value. This default value is set when the user double clicks on the slider label.

** New getDialogHandle() and getCtlHandle(n) functions for getting the window handle of the dialog or a control. This can be useful if you want to access the dialog or a control from a DLL.

** New tool tip constants: TTF_CENTERTIP, TTF_RTLREADING, TTF_TRACK, TTF_ABSOLUTE, TTF_TRANSPARENT for setCtlToolTip()

** New edit control constants: ES_LEFT, ES_CENTER, ES_RIGHT, ES_MULTILINE, ES_UPPERCASE, ES_LOWERCASE, ES_PASSWORD, ES_AUTOVSCROLL, ES_AUTOHSCROLL, ES_NOHIDESEL, ES_OEMCONVERT, ES_READONLY, ES_WANTRETURN, ES_NUMBER for (setCtlStyle)?()

* setPixel Functions

** Added setBitmapTile(int x, int y, int iName, int tileWidth, int tileHeight, int tileIndex)

** Added setBitmapStretch(int x, int y, int iName, int width, int height)

** Added setBitmapTransparent(int x, int y, int iName, UINT color)

** Added setBitmapStretchTransparent(int x, int y, int iName, int width, int height, UINT color)

** Fixed issue with startSetPixel(). When recompiling using autoload, endSetPixel() may not be called for drawing in progress, thus leaking resources. Now startSetPixel() destroys old resources before starting new.

** Added setBitmap(int x, int y, char * name) to draw an embedded bitmap or file to ownerdraw. Clips properly, negative x/y is allowed (clips left/top). Does not switch GDI/DIB mode.

** Added setRectGradient(int left, int top, int right, int bottom, unsigned int color_topleft, unsigned int color_bottomright, bool horizontal). Draws gradient rectangle. Set boolean false to draw vertical gradient. Does not switch GDI/DIB mode.

==== Beta 9d (1.0 Beta 9.0d) - 12 June 2008 ====

* Main Improvements

** Added getCtlItemCount(), including support for the CC_TAB class.

** Added extended return values to getArrayDim.

** Added Harry's multithreading API: countProcessors, triggerThread, waitForThread, isThreadActive, getThreadRetVal, terminateThread.

** Added a set of Critical Section APIs: createCriticalSection, enterCriticalSection, tryEnterCriticalSection, leaveCriticalSection, deleteCriticalSection.

** Added more manifest constants: (INFINITE)?, (VTA_LEFT)?, (VTA_RIGHT)?, (VTA_BOTTOM)?, (VTA_TOP)?, (WAIT_TIMEOUT)?, (WAIT_FAILED)?, (WAIT_OBJECT_0)?, (WAIT_ABANDONED)?, (WAIT_ABANDONED_0)?, (WAIT_IO_COMPLETION)?.

* Bug Fixes

** A crash in setCtlThumbSize was fixed.

** A bug which caused the flashing focus highlight on an anchored STANDARD or SCROLLBAR control to fail to track the actual thumb position while resizing the dialog has been corrected.

** A bug in which certain Array resources were never released has been fixed.

* Known Problems

** In general, this is a preliminary implementation of multithreading. Some problems at present are:

*** There is no direct support yet for Thread Local Storage (TLS); instead, the entire FM context record is treated as TLS. This means that global and static variables will actually behave as though they are TLS. The only workaround to provide true shared global or static storage is to cache a variable in, say, the low or high range value of a user-defined control, using the setCtlRange and getCtlRange APIs. (Do not try to use the actual value of a control for global storage, since current control values are cached in the FM context record, and therefore act as TLS.)

*** Many of the basic FM API functions (such as updatePreview, setCtlTextv, etc.) are not yet thread-safe. If you want to call such a function in a threaded environment, you should explicitly serialize access to the function by surrounding the call to it with an enterCriticalSection/leaveCriticalSection pair of calls. In future releases, FM APIs will be made thread-safe whenever possible.

*** At present, the getThreadRetVal API is unable to return the correct exit code value of a thread.

*** The timeout value in the waitForThread API is very inaccurate (e.g., off by 3x or more).

*** There may still be some hidden resource leaks.

==== Beta 9c (1.0 Beta 9.0c) - 28 May 2008 ====

* Main Improvements

** Implemented the '!Y' descriptor (i.e., the current year formatted as 4 decimal digits) in formatString.

** Implemented ffillArray, which is the floating-point analog of fillArray, and allows you to quickly fill an Array with a specified 16-, 32-, or 64-bit floating-point value.

** Implemented unscaled pointer subtraction.

** Warn that all pointer arithmetic is (currently) unscaled.

** Warn that pointer comparisons are not yet implemented.

** A floating-point value (float or double) can now be cast directly to an int with the (int) cast operator.

** The compiler output pane in the Advanced (>>>) mode of the Editor display was widened by 40 DBUs to allow for more legible displays. The Font button was also repositioned.

* Bug Fixes

** Fixed a regression bug in Beta 9a and Beta 9b which causes a crash when using the msk() API.

** In the Advanced (>>>) mode Editor display, fixed a bug in the SDL dump of escape codes in strings when a non-ASCII char was treated as signed.

==== Beta 9b (1.0 Beta 9.0b) - 8 May 2008 ====

* Bug Fixes

** A problem with parsing floating-point numbers in the filter source code at Design time, when the default locale is not "English", has been fixed. (This bug was accidentally introduced in release 9a.)

==== Beta 9a (1.0 Beta 9.0a) - 5 May 2008 ====

* Main Improvements

** The maximum size of all global and static variables you can allocate has been increased from 400 bytes to 40 KB (i.e. 10,000 int variables or 5,000 double variables, or some combination thereof).

* Bug Fixes

** A minor bug in getAppTheme() was (hopefully -- HH, please check!) fixed.

* Other Notes

** This release was generated from the merger of Harry's and Alex's most recent source databases. No extensive regression testing has yet been performed against the previous release (1.0 Beta 9.0), so there is a possibility that some regression errors may be found; if so, please report them ASAP to the FMML group.

==== Beta 9 (1.0 Beta 9.0) - April 2008 ====

* Main Improvements

** FM can now use up to 3 GB of RAM under 32bit Windows (2000, XP, Vista). Under 64bit Windows it can now use up to 4 GB of RAM.

** The FilterMeister Language (FML) is finally here. It is an alternative to the FilterFactory Plus (FFP) language that was used so far. To write code in FML you need to start your code with %fml instead of %ffp. In FML you can declare global variables outside handlers and use control definitions like ctl(0): "Slider 1" inside handlers. You can also place variable declarations anywhere and do no need to put them at the top.

** You can now access DLLs with the following functions: loadLib(), getLibFn(), callLib(), fcallLib(), callLibFmc(), fcallLibFmc(), freeLib(). For third party DLLs you need to use callLib() and fcallLib(). The callLibFmc functions pass the FilterMeister context record as the first parameter to the called DLL function. This can be useful if you want to create your own DLLs for FilterMeister. FMLibTest_SourceCode.zip in the sourcecode\democodes subfolder contains a simple example for creating your own DLL with VC++.

** With the help of a resource editor you can now create multi-filter plugins with FM. FM now contains 32 entry points named ENTRYPOINT00 to ENTRYPOINT32. To have more than one filter in a .8bf file you need to use a resource editor to duplicate the pipl resource, change the 00 in ENTRYPOINT00 to 00, 01, 02 ... 29, 30 or 31 and edit the filter name in the pipl resource. If you copy a pipl resource from another FM .8bf file, you only need to change ENTRYPOINT00. In your filter code you can use the new (ENTRYPOINT)? variable, which contains a value between 0 and 31, to check which menu item was selected. Future versions of FM will not require the use of a resource editor to create multi-filter plugins.

** All FM controls now reposition or scale automatically when the dialog is resized. All controls are anchored to the right side of the dialog by default. Only the preview, progress bar, zoom control and the OK and Cancel buttons have a different anchoring. If you want to change the anchoring of a control, you can use the (Anchor)? control attribute or setCtlAnchor(). You can use a combination of the following constants: ANCHOR_LEFT, ANCHOR_RIGHT, ANCHOR_TOP and ANCHOR_BOTTOM. By default controls have ANCHOR_RIGHT set.

** The .8bf plugins created with FM now have a resizable dialog, so you do not need to use a resource editor to enable it anymore.

* Dialog Stuff

** The position and size of the preview, progressbar and zoom controls are now kept between sessions.

** Scrollbar, standard, trackbar and slider controls now correctly work for value ranges below -32768 and above 32767.

** You can now use more than 1024 characters for the text of edit, statictext, checkbox and radiobutton controls. But you can only read the first 1024 bytes with getCtlText() from them.

** New setCtlThumbSize() function and thumbsize property for setting the thumb size of scrollbar, standard, trackbar and slider controls. For trackbar and slider controls you also need to use the FIXEDLENGTH attribute to make it work.

** You can now change the background color of the preview with setCtlColor(CTL_PREVIEW, ... ) or the color attribute. To remove the color again, simply use -1 as the color.

** New getDialogPos() function for retrieving the position and size of the full window or the client area of the window.

** If you remove the progressbar, zoom control or preview frame with "ctl(...):none", they do not appear again at the second invocation.

** setCtlFocus() and checkCtlFocus() work again for CTL_PREVIEW.

** refreshCtl() now also affects the labels and edit boxes of standard and slider controls.

** insertMenuItem() does not accept values below 1 for the second parameter anymore.

** Closing down FilterMeister with the x title bar button and no source code loaded caused a memory error message. This was fixed.

* XP/Vista Theme & Tab Control

** getAppTheme() returns zero if the application that runs FM has visual styles disabled or 1 if it has visual styles enabled.

** setCtlTab(n,t,s) or the new "Tab=(t,s)" attribute lets you assign controls to the sheets of a tab control. By doing so the controls automatically appear or vanish if a tab sheet is selected. You do not have to write some FM code to do that. Additionally if the tab control uses an XP/Vista theme, the color of checkboxes, radiobuttons and ownerdraws is automatically set to the color of the tab control.

** getCtlColor() now returns the background color of tab controls. If the XP/Vista theme is activated, it will return an approximation of the tab background color, because themed tab controls have a gradient background.

** If you use enableCtl() on a tab control, the controls that are assigned to the tab control also become visible or invisible.

** If you use refreshCtl() on a tab control, it now also refreshes the controls that are assigned to the tab control.

** Bug Fix: setCtlVal() now works correctly for tab controls.

** Bug Fix: When using setCtlText() on a tab control, it removes the old tab sheets and does not add additional tab sheets anymore.

** Bug Fix: (setCtlItemText)?() does not add additional tab sheets to tab controls anymore if the specified tab sheet already exists.

* Other Improvements

** Bug fix: Images that are only a few pixels wide or high produced an error message. This was fixed by setting the initial preview zoom to an appropriate value.

** Arrays now support 16bit float values. To store them use fputArray() and to retrieve them use fgetArray(). For 16bit float values please use 2 as the last parameter in allocArray().

** getSysMem() returns some values about the system memory.

** sizeof() returns the size of a few basic types (e.g. sizeof(int)), integer and real constants, string literals, and a few basic scalar variable types. Other uses of sizeof will still result in compiler error or bug messages, or even incorrect results.

** formatString() (which is also used by other functions like setCtlTextv() and setDialogTextv()) supports HTML entities and new special codes

** fmax() and fmin() now take a variable number of arguments.

** fc2d() now correctly asks for two instead of four parameters.

** triggerEvent() now only accepts a control number from 0 to 256 for normal events and an unlimited control number for FME_CUSTOMEVENT without displaying a memory error message.

** For floor(), ceil(), chop(), and round() inline code is produced, which makes them much faster.

* setPixel Functions

** Bug fixed in setThinLineAA()

** New setRectangle() function

** setText() and setTextv() were updated

==== Beta 8.7 (1.0 Beta 8.7) - January 2008 ====

* Bug Fixes

** The black borders around the edit boxes of standard and slider controls vanished on the second invocation in Beta 8.6. This was fixed.

** The labels of the checkboxes in Advanced (>>>) mode are visible again under XP/Vista.

** The folder of the .ffp file is now set as the working folder on Compile. If no .ffp file has been loaded or saved, the filterInstallDir is set as the working folder on Compile. This avoids problems with embedded files not being found on Compile e.g. if a preset has been opened from another folder.

** The dialog events are now cleared on Compile to avoid that they are triggered for other filter code in which they are not set.

* Improvements

** Arrays now support float and double values. To store them use fputArray() and to retrieve them use fgetArray(). For float values use 4 and for double values use 8 as the last parameter in allocArray().

** If the user cancels the filter (e.g. by pressing the ESC key or x button in the title bar or pressing Enter when the Cancel button has the input focus or choosing "Close" from the menu of the title bar icon), an event with n=CTL_CANCEL and e=(FME_CLICKED)? will now be triggered. So you do not need to use "Dialog:CancelEvent" or setDialogEvent(2) anymore for these cases.

** The number of global strings was increased from 10 to 20. You can access them by using str0 up to str19.

** New DESIGNTIME variable which lets you check if the filter is running in FilterMeister (DESIGNTIME==true) or as a standalone plugin (DESIGNTIME==false).

** (getBufferAddress)? and pointer_to_buffer now support the T3 and T4 buffers. The parameters are 4 and 5.

* setPixel Functions

** New setAngleArcFill and setAngleArc functions

** New setTextv() function that supports formatted text

* Installation

** New multi-lingual installation

** The HTML Manual now offers more information including an updated command reference.

==== Beta 8.6 (1.0 Beta 8.6) - November 2007 ====

* Improvements

** FM does not crash anymore on Make when embedding bitmaps in a plug-in

** In some host applications (e.g. SignLab, Image Analyzer, Pixopedia, NiGulp, GIMP) memory error messages appeared and/or horizontal preview dragging was not possible. This is fixed now.

** Some host applications (e.g. GIMP, PhotoBrush, PluginMaster) do not display a color dialog. chooseColor now displays the normal Windows color dialog for these applications.

* Dialog Stuff

** Bug fix: Check boxes do not have a black label anymore when the dialog theme is switched on.

** The styles of the label and edit box of standard and slider controls are now saved between filter invocations

** setCtlBuddyStyle, (setCtlBuddyStyleEx)?, clearCtlBuddyStyle, (clearCtlBuddyStyleEx)? now save the styles between filter invocations

** To make sure that your plug-in always uses the appropriate system colors please use the new (SysColor)? option instead of the Color option when defining controls, e.g. "ctl(0): syscolor=COLOR_BTNFACE" or "Dialog: SysColor=COLOR_BTNFACE". There is also a FontSysColor option. These options correspond to new setDialogSysColor, setCtlSysColor and setCtlFontSysColor functions.

** The new (scrollFactor)? variable lets you increase the scroll speed in the preview. scrollFactor=1 is the default.

* SetPixel Stuff

** A bug in setThinLineAA and setThinEllipseAA has been fixed.

** (setEndCaps)? sets the method used to cap the ends of lines with the constants PS_ENDCAP_ROUND, PS_ENDCAP_SQUARE and PS_ENDCAP_FLAT.

** (setJoin)? sets the method used to join thick lines at corners of shapes with the constants PS_JOIN_ROUND, PS_JOIN_BEVEL and PS_JOIN_MITER.

** (setInsideFrame)? determines whether the pen lines of shapes are drawn on the edge or inside the edge.

* Others

** Floating point versions of r2x, r2y, c2m and c2d are now available. They are called fr2x, fr2y, fc2m and fc2d.

** FME_INIT is now triggered after hitting the Compile button. This will make it easier to debug the filter code.

** A cell_preserve alias was added for cell_initialize(). cell_preserve(1) keeps the values of put/get cells between preview updates and filter invocations.

** New directory/folder functions: chdir lets you change the working folder, getcwd returns the current working folder, mkdir creates a new folder and rmdir deletes a folder.

==== Beta 8.5 (1.0 Beta 8.5) - November 2007 ====

* Main

** The ForEveryTile code buffer size was increased from 256K to 512K.

** The literal pool was doubled, so that you can use more floating-point and string constants in your code.

* Dialog Theme

** The FM title bar now has no theme on first invocation. If you activate the dialog theme in your filter code with setDialogTheme(1) or "Dialog: Theme=on", the titlebar will not lose its theme anymore like in previous FM versions.

** Activating the dialog theme will now also activate the theme for all controls unless you specify that a control should not have a theme.

** You can now use setCtlTheme(n,-1) or the control attribute "theme=default" to make a control use the same theme as the dialog. This is the default setting now.

* Events

** Three new event constants replace old event constants: (FME_CHANGED)? replaces FME_VALUECHANGED, (FME_SETFOCUS)? replaces FME_SETEDITFOCUS and (FME_KILLFOCUS)? replaces FME_KILLEDITFOCUS. For backward compatibility the old event constants are still valid and work.

* SetPixel Stuff

** The setPixel functions do not produce a crash anymore if you apply them thousands of times.

** The new setPenWidth function lets you change the broadness of drawn lines.

** setThinLineAA and setThinEllipseAA draw anti-aliased lines and ellipses.

** (startSetPixelSS)?(n, factor) and endSetPixelSS(n) let you do super sampling for smoother results. The second parameter in (startSetPixelSS)? is the factor by which the canvas will be larger.

** (startSetPixelBuffer)?(width, height) lets you draw on an internal buffer. So you do not need any controls to be present, so you can even use it after the user pressed OK on the plug-in dialog. Use the getPixel(x,y) function to read out the buffer. (endSetPixelBuffer)? destroys the buffer.

** getSetPixelWidth and getSetPixelHeight return the size of the canvas or buffer. They only work if used after startSetPixel, (startSetPixelSS)? or (startSetPixelBuffer)?.

* New Controls

** New TAB control.

*** Control Value: The selected tab sheet.

*** Events: (FME_CLICKED)?.

*** Styles: scrollopposite, bottom, right, multiselect, flatbuttons, forceiconleft, forcelabelleft, hottrack, vertical, tabs, buttons, singleline,multiline, rightjustify, fixedwidth, raggedright, focusonbuttondown, ownerdrawfixed, tooltips, focusnever (see http://msdn2.microsoft.com/en-us/library/bb760549.aspx).

** New EDIT control.

*** Control Value: Not used.

*** Events: (FME_CHANGED)?, (FME_SETFOCUS)?, (FME_KILLFOCUS)?.

*** Styles: left, center, right, multiline, uppercase, lowercase, password, autovscroll, autohscroll, nohidesel, oemconvert, readonly, wantreturn, number (see http://msdn2.microsoft.com/en-us/library/bb775464.aspx).

** New SLIDER control (consisting of a label, trackbar and edit box)

*** Events: like STANDARD control: (FME_CHANGED)?, (FME_SETFOCUS)? (with mouseover style)

*** Styles: like TRACKBAR control

* More Dialog Stuff

** The top border of the edit box of standard controls (and sliders) is not cut off like in previous FM versions under Windows XP.

** You can now add "(editstyle)?=border", "(editstyleex)?=staticedge" or "(editstyleex)?=clientedge" to the control definitions of standard and slider controls for changing the look of the editboxes.

** The new setCtlBuddyStyle, (setCtlBuddyStyleEx)?, clearCtlBuddyStyle and (clearCtlBuddyStyleEx)? functions were added for changing the style of the labels and edit boxes of standard and slider controls. Use 1 as the middle parameter to change the edit box and 0 to change the label.

** The trackbar does not have a dark grey background color by default anymore

** The color of the list box is now set automatically to avoid redraw problems that occurred if you did not explicitly set the color in previous versions

** New getSysColor function for grabbing a system color. You can use the COLOR constants with it, e.g. COLOR_BTNFACE.

** New (setCtlStyle)?, (setCtlStyleEx)?,(clearCtlStyle)? and (clearCtlStyleEx)? functions

** setDialogMinMax works correctly for negative parameters now

** (setCtlItemTop)? and (getCtlItemTop)? for setting and getting the top visible item in a combo box or list box

** (setCtlItemText)? and getCtlItemText for setting and getting the text of a combo box, list box or tab control item

** deleteCtlItem for deleting an item of a combo box, list box or tab control

** deleteCtlItems for deleting all items of a combo box, list box or tab control

** (fillDir)? fills a combo box or list box with file and folder names

** getCtlPos now also supports the preview.

** The new checkDialogFocus returns true if the FM dialog is the active window and false if it isn't.

* Buffers & Arrays

** A fourth t-buffer was added. Use t4get and t4set etc.

** t3get and t3set did not work previously. They were fixed.

** iget supports the third and fourth t-buffer now

** src previously returned zero instead of 32768 for the alpha values of 16-bit images whose coordinates were outside the image borders. This was fixed.

** allocArray and allocArrayPad now by default allocate memory from Photoshop. Previously they allocated memory from Windows, but if Photoshop had grabbed large portions of the available memory, FM was not able to access it and failed because not enough memory was available to it. If Photoshop cannot provide the necessary memory, FM tries to get it from Windows. (So it is best if you recommend to the users of your plug-ins to set the Photoshop Memory Usage preference setting to a high value.) If FM is not running in Photoshop, the memory allocation will still be done by the host, but that usually means that the memory will be allocated from Windows, because most hosts do not have their own memory management system like Photoshop.

** You can switch back to the old behavior (Windows allocation) by using set_array_mode(0). This is necessary if you want to have reallocatable arrays, because Photoshop allocation does not allow reallocation. set_array_mode(1) switches back to Photoshop allocation.

** The t-buffers are allocated by Photoshop now, which will increase performance in Photoshop.

* Resources

** New copyResToArray(resname, restype, arraynr) function for copying a file resource to an array. Alternatively getResAddress(resname, restype) returns a pointer to the specified file resource and getResSize(resname, restype) returns the size of the file resource.

** You can now embed any kind of file by using the Other item, e.g. Embed: Other="Test.txt". This file will be embedded as a "FMDATA" resource type. You can access e.g. with copyResToArray("FMDATA","TEST.TXT",0);

* Events

** The FME_DRAWITEM event now works for the preview. To activate it you need to add "ctl(CTL_PREVIEW):preview(drawitem)" at the top or "setCtlProperties(CTL_PREVIEW,CTP_DRAWITEM);" somewhere.

** The precision for FME_MOUSEOVER and FME_MOUSEMOVE events was increased from 250 ms to 20 ms. For the preview these events are and always were triggered instantly.

** New FME_INIT event is triggered before the FM dialog is displayed. To activate this event you need to use "Dialog: initevent" or setDialogEvent(1). You can use the previous value to check if the plug-in is executed for the first time in the host. In that case (previous)?==false.

** New FME_CANCEL event is triggered when the user exits the plug-in without applying the effect. At this point the dialog already has vanished and changes to global variables are not preserved anymore for the next invocation. To activate this event you need to use "Dialog: cancelevent" or setDialogEvent(2).

** To activate the new FME_KEYDOWN and FME_KEYUP events you need to use "Dialog: keyevents" or setDialogEvent(4) in your code. The n value of the events contains the VK code of the pressed key. If you want to check for Shift, Ctrl, Alt etc. you need to use getAsyncKeyStateF().

** The new setDialogEvent function lets you activate the FME_INIT, FME_CANCEL, FME_KEYDOWN and FME_KEYUP events. To deactivate these events use clearDialogEvent. Use 7 as the parameter for activating or deactivating all events.

* Others

** Tool tips work again under Windows 2000/XP/Vista. To enable the tool tips for statictext, image and frame controls you need to add the notify attribute, e.g. ctl(0): statictext(notify), "Test", tooltip="Here I am"

** The following floating point constants were added: M_E, M_LOG2E, M_LOG10E, M_LN2, M_LN10, M_PI, M_PI_2, M_PI_4, M_1_PI, M_2_PI, M_2_SQRTPI, M_SQRT2, M_SQRT1_2

==== Beta 8.4 (1.0 B8) - September 2007 ====

* Improvements

** DEP problem was fixed. Even if DEP is activated, FM filters and FM plug-ins will be executed.

* T-Buffers

** Third t-buffer available now ( t3get,t3set etc.)

** The t-buffers support 16-bit images now. But only tget,t2get,tset,t2set,t3get and t3set work with 16 bit images. The following functions will not work correctly with 16bit data: tgetp,tsetp, tgetr, tsetr and their equivalents for the second and third t-buffer.

* Dialog Stuff

** getCtlText for retrieving the text of a control

** Combo boxes and list boxes now accept text that is longer than 1023 bytes, which means that you can add more items to them. However, getCtlText will only return a combo box or list box text that is 1023 bytes long.

** getCtlPos for finding out the position and size of a control

** setDialogTheme and setCtlTheme for switching XP/Vista themes on and off. Does not work correctly at the moment.

** getPreviewCursor will return the resource number of the current preview cursor

** getCtlClass tells you what type of control a certain control is.

* Others

** getSpecialFolder function

** getArrayAddress and (getBufferAddress)? return the memory address of arrays and buffers

** blend now also works with 16-bit values if you use set_bitdepth_mode(16)

==== Beta 8 (1.0 B8) - March 2007 ====

* Improvements

** Bug Fix: Plug-ins that were created with previous versions of FM crashed under Windows Vista if there was more than 2GB RAM available.

** The code buffers were increased:

*** Maximum source code size is now 800,000 bytes

*** The OnCtl buffer was increased from 256k to 512K

*** Larger compiler buffer to handle more complex algorithms

* SetPixel Stuff

** startSetPixel, setPixel and endSetPixel work much faster and flicker-free

** getPixel for reading pixel values from the ownerdraw control

** setFont lets you choose the font name, its size, angle, boldness, and italics

** setText lets you draw a certain text with the chosen font, color and alignment (Available alignment constants: TA_BASELINE, TA_BOTTOM, TA_TOP, TA_CENTER, TA_LEFT, TA_RIGHT, TA_NOUPDATECP, TA_RTLREADING, TA_UPDATECP, VTA_BASELINE, VTA_CENTER)

** setLine draws a line

** setEllipse draws an ellipse

** setEllipseFill draws a filled ellipse

** setRectFrame draws a rectangle

** setRectFill draws a filled rectangle

** setFill fills the whole ownerdraw control with a certain color e.g. setFill(getCtlColor(n))

* Other Things

** checkCtlFocus function for checking if a certain control has the focus.

** Bug Fix: The dialog of created plug-ins is not resizable by default anymore. You need to use a resource editor to make it resizable if you support dialog resizing in your plug-in.

** AutoLoad button for automatically loading and compiling the .ffp file if it was changed on disk in the meantime. Not sure if it works correctly in Photoshop.

==== Beta 7 (1.0 B7) - June 2005 ====

* New Features

** Shift clicking the Load button reloads and compiles the current .ffp file

* Improvements

** trackPopupMenu has one more parameter for menu alignment now. Set it to zero for default behaviour or use the following constants: TPM_RIGHTBUTTON, TPM_LEFTALIGN, TPM_CENTERALIGN, TPM_RIGHTALIGN, TPM_TOPALIGN, TPM_VCENTERALIGN, TPM_BOTTOMALIGN, TPM_HORIZONTAL, TPM_VERTICAL, TPM_NONOTIFY, TPM_RETURNCMD.

** setCtlProperties now works for the preview control.

* Bug Fixes

** src lets you read the alpha channel of Greyscale images again

** The dialog of a compiled plug-in was displayed with a delay in Photoshop if the preview events were activated with "ctl(CTL_PREVIEW): preview (mousemove, mouseover, previewdrag)". Until this problem is solved the preview events are activated again by default.

** The preview works again for 16-bit Greyscale and CMYK images.

** getCtlCoord, getPreviewCoordX and getPreviewCoordY work correctly again for zoom levels other than 100%

** Sliders didn't update the preview in Beta 6 if there was no ctl(0) defined.

==== Beta 6 (0.4.21) - May 2005 ====

* Alpha Channel Access

** Transparency is finally correctly displayed as a checkerboard pattern for 16-bit layers.

** src now lets you access the alpha channel of 16-bit layers

** src can now access the transparency information from CMYK images as well as additional alpha channels that are created and selected in the Channel palette in Photoshop.

** Z had a maximum value of 4 previously. Now it is 5 if it is applied to a CMYK layer. It can even have a higher value if additional alpha channels are selected in the Channel palette in Photoshop.

** planesWithoutAlpha contains the number of image channels without alpha channels. You can now calculate the number of available alpha channels by subtracting planesWithoutAlpha from planes or Z.

* Selection Mask

** msk for accessing the selection mask works now for 8-bit and 16-bit images. The selection mask has values from 0 to 255 even for 16-bit images.

** New functions for calculating the smallest distance to the selection border: (calcSBD)?, (freeSBD)?, (getSBD)?, (getSBDangle)?, (getSBDX)?, (getSBDY)?. They only work for 8-bit images at the moment.

* Controls

** getCtlCoord function for accessing the coordinates of the mouse over a control. It is also a replacement for getPreviewCoordX and getPreviewCoordY. Both functions are now internally redirected to getCtlCoord.

** setCtlFocus for setting the focus to a certain control.

** getCtlRange for checking the min. and max. value of a control.

** ctl, getCtlVal and getCtlRange can now also be used for CTL_PROGRESS to get the progress bar value and range

* Events

** (drawitem)? control property now needs to be set to trigger FME_DRAWITEM events.

** (mousemove)? control property can now be set to generate FME_MOUSEMOVE events for all controls.

** (FME_VALUECHANGED)? events are now triggered for trackbars

** New (FME_PREVIEWDRAG)? event is triggered after the preview was dragged, but before the preview is updated. To activate the (FME_PREVIEWDRAG)? events you need to set the (previewdrag)? control definition, e.g. ctl(CTL_PREVIEW): preview (previewdrag)

** The FME_MOUSEMOVE, FME_MOUSEOVER and (FME_PREVIEWDRAG)? events for the preview are now only triggered if you specify them as a control property. For example you can do that by adding "ctl(CTL_PREVIEW): preview (mousemove, mouseover, previewdrag)" at the top of your code.

* Other New Features

** (requestRect)?(x_start, y_start, x_end, y_end, scaleFactor) for requesting an image rectangle. Lets you read pixels outside the preview if (isTileable)?=true. Doesn't work after OK was pressed. (restoreRect)? makes sure that the preview is displayed correctly again after (requestRect)? was used.

** findFirstFile, findNextFile and findClose for reading file and folder names from a certain path.

** fmin and fmax for finding the minimum or maximum of two double values.

** (imageHRes)? and (imageVRes)? double variables were added for getting the dpi value(s) of the image.

** You can now use the mouse wheel to change slider values. You need to select the slider at first by clicking on it or using the tab key.

* Improvements

** fillArray now lets you fill arrays with 8-bit, 16-bit and 32-bit values.

** srcp, pgetp and psetp have been made slightly faster

** getArrayString now returns the string "Not Available" if it can't read a string. Previously it returned zero, which caused a memory access violation error in some cases.

** set_psetp_mode(1) for making it possible to set the alpha channel to zero with psetp

** iget works on 16-bit images now.

** The Dodge and Burn modes of blend have been changed to produce a more correct result.

* Bug Fixes

** Problem with non-working arrays when running FilterMeister a second time in PhotoPlus and Canvas was fixed.

** Bug with getImageTitle in PhotoPlus was fixed.

** The algorithm of saturation was changed to adjust saturation correctly.

** Holding down the Shift key while dragging a slider or trackbar won't produce any preview flicker anymore, because the preview is only updated a maximum of 50 times per second.

==== Beta 5 (0.4.21) - December 2004 ====

* Larger buffers which means larger and more complex filters can be created:

** Maximum source code size is now 400K

** onCtl handler: 128K -> 256 K

** larger compiler buffer to handle more complex algorithms

* Resizable Window

** The FM dialog is resizable by default, but the windows of the generated plug-ins are not resizable by default. To make them resizable, you need to use a resource editor and change the window style to "Resizable".

** New related functions: getDialogWidth, getDialogHeight, setDialogMinMax, PixelsToHDBUs, PixelsToVDBUs

** New related events: (FME_SIZE)?, (FME_EXITSIZE)?

** You can now resize and reposition the preview during runtime. You have to use setCtlPos (CTL_PREVIEW, ...) to do that. The frame around the preview will be automatically repositioned.

** To reposition and resize the preview frame, progress bar or zoom controls please use setCtlPos(CTL_FRAME, ...), setCtlPos(CTL_PROGRESS, ...) or setCtlPos(CTL_ZOOM, ...)

** You can also use enableCtl to make the preview frame, progress bar or zoom controls disappear.

** Less recommended is to use deleteCtl to remove the preview frame, progress bar or zoom controls.

** setDialogSizeGrip displays a grip for resizing the window (produces redrawing artifacts in some cases)

** setDialogShowState lets you minimize, maximize or normalize the FilterMeister window

* Processing in Tiles

** The (needPadding)? variable works now. It lets you set the size of the padding area in pixels, e.g. needPadding = 2 for a 5x5 convolution operation. You need to set (isTileable)? = true to make it work.

** New allocArrayPad (nr, X, Y, Z, bytes, padding) function for allocating padded arrays

** FilterMeister currently processes 100 full rows at a time when isTileable = true. This value can be adjusted by assigning a new value to the (bandWidth)? variable. For example bandWidth = 200 for processing 200 rows at a time.

** The Big Gulp check box (Advanced mode) is now deactivated. This avoids that the whole image is loaded to memory when processing in tiles (isTileable = true). As a result there won't be any "Not enough Memory" messages anymore when processing in tiles.

* Drawing on Controls

** New startSetPixel, setPixel and endSetPixel functions for drawing on controls, usually bitmap, image or ownerdraw controls.

** New FME_DRAWITEM event that is triggered when an ownerdrawn control needs to be redrawn

* Event Triggering and Pseudo-Functions

** triggerEvent lets you execute the code in the OnCtl handler that is usually only executed if that event occurs.

** By checking for the new constant (FME_CUSTOMEVENT)? in the OnCtl handler, you can place some custom code there that can be executed with the triggerEvent function.

* Context Menus

** The (FME_CONTEXTMENU)? event is triggered when the user right-clicks on the dialog background

** createPopupMenu creates a context menu and returns the menu handle that is needed for the other menu functions

** insertMenuItem adds a menu item.

** trackPopupMenu displays a context menu and returns the selected menu item

** destroyMenu for deleting the menu handle if it isn't needed anymore.

* Menus (ONLY FOR TESTING -> No Menu events yet, so the selected menu item isn't passed back yet)

** (createMenu)? creates a menu and returns the menu handle that is needed for the other menu functions

** insertMenuItem adds a menu item.

** (setMenu)? for displaying the menu under the title bar

** destroyMenu for deleting the menu handle if it isn't needed anymore.

* Arrays

** the number of possible arrays was extended from 10 to 100.

** New fillArray function for filling an array with a certain byte value, e.g. for initializing all cells of the array to zero.

** New putArrayString and getArrayString functions for storing strings in arrays.

* New Events

** (FME_COMBO_DROPDOWN)?, (FME_COMBO_CLOSEUP)? are triggered when the drop down list displays and closes again.

** (FME_SETEDITFOCUS)?, (FME_KILLEDITFOCUS)? are triggered when the focus is set on the edit box of a slider and when the focus is removed again from it.

* Sliders

** setCtlEditSize function and (editsize)? property for changing the size of the edit box of standard sliders

** setCtlGamma function for changing the slider behaviour

* Other

** set_bitdepth_mode(mode) function. Setting mode to 16 will make the rgb2hsl, hsl2rgb and other color conversion function treat the passed color values as 16-bit color values. Setting mode to 8 will activate the default behaviour of these functions.

** (doEvents)? pauses the current code to update the window and process events. Useful inside a loop that needs longer to finish.

** Several value interpolation functions: linearInterpolate, cosineInterpolate, (cubicInterpolate)? and (hermiteInterpolate)?

** quickFill fills the put/get cells quickly with image values and quickMedian calculates the median of the values from the put/get cells quickly.

** (quickSort)? function for sorting put/get cells

** getImageTitle retrieves the path or file name of the currently processed image. Only works in Photoshop (returns full path) and PSP (only returns file name without file extension).

** egw function was updated

** New (egm)? (a,b,value) function for edge mirroring - NOT YET AVAILABLE! (mwvdlee)

* Bug Fixes:

** ForEveryPixel and RGB handlers work in PSP 8 again without causing a memory error

** The preview displays fine and not half transparent anymore when applying FilterMeister to a 16-bit layer in Photoshop CS

==== Beta 4 (0.4.21) - June 30, 2003 ====

* Bug Fixes:

** Message box that can occur under XP was removed

** If compilation failed, the dialog doesn't shrink anymore, but gets its original size back.

==== Beta 3 (0.4.21) - June 16, 2003 ====

* Bug Fixes:

** A bug in the freeArray() function prevented the memory of the array from being freed and even worse kept FilterMeister itself from automatically freeing the memory on exit

==== Beta 2 (0.4.21) - June 3, 2003 ====

* Dialog Changes:

** All dialog controls are now displayed in classic style under Win XP. Currently you can't activate XP styles, but it will be possible later.

** Advanced button in the editor was added again

** The size of the standard slider text boxes has been increased to fully display decimal values

* Bug Fixes:

** FilterMeister welcome message isn't displayed anymore in created plug-ins.

** Stack overflow problem that crashed FM was fixed

** Problem with disabled editor control was fixed

** Problem with freeing of allocated arrays was fixed

** srcp, pgetp, tgetp, t2getp check for image boundaries now to avoid memory error messages

** The getPreviewCoord functions work precisely now

** rgb2ycbcr and ycbcr2rgb work more precisely now

* New Attributes:

** when defining a standard control you can use the new (divisor)? attribute to make the slider display decimal values. E.g. set divisor=1000 for three decimal places. The default divisor value is 1.

* New Functions:

** setCtlDivisor(n,value) for having standard slider with decimal places. value can be a value from 1 to 1000. The default is a value of 1.

* New Events:

** (FME_VALUECHANGED)? is triggered when a slider value was changed. Returns the previous slider value in a variable called (previous)?.

** (FME_CLICKED)? events now return the previous value of combo boxes in a variable called (previous)? for combo boxes, list boxes, check boxes and radio buttons

==== Beta 1 (0.4.20) - March 22, 2003 ====

* Dialog Changes:

** Larger main dialog

** 200% larger preview

** system color is used for the dialog background

** system color is used for slider labels and statictext controls

** The editor window is now automatically displayed when you start FilterMeister

** The Edit >>> button was removed and instead a Minimize button was added to the title bar of the editor

** When disabling a standard slider control, the slider label is now disabled, too.

* Larger code buffer which means that filters with a larger and more complex code can be created:

** onCtl: 64K -> 128K

** ForEveryTile: 128K -> 256K

* New Color Modes:

**(Lab48Mode)?

**(CMYK64Mode)?

**(DeepMultichannelMode)?

**(Duotone16Mode)?

* New Functions:

** pget and pgetr support 16 bit images

** for registry access

** for color space conversion (YUV, Lab, HSL, YCbCr)

** iget for interpolated image access with 5 methods (nearest, bisquare, bicosine, bilinear, bicubic)

** srcp, pgetp etc. for accessing a whole pixel at once. Using these functions lets you read and write image data almost twice as fast as with src() and pset().

** for drawing rectangles, circles and triangles easily

** for locking the window redraw and for redrawing the whole window, a control or a region

** for setting the preview zoom (setZoom)

** for reading the coordinates of the mouse pointer above preview

** for using up to 10 arrays with one, two or three dimensions

** for performing 20 different blend operation with two image sources

** for drawing a dozen two-dimensional gradients

** for edge-wrapping values

** for checking if keys were pressed

** for getting the current Window Version, the screen resolution and screen refresh rate.

** for triggering up to 10 different timer events e.g. to perform multi-threading-like activities (setTimerEvent).

* New Events:

** (FME_TIMER)?: for asynchronous activities (timer)

** indicating left and right clicks on the preview ( (FME_LEFTCLICKED_DOWN)?, (FME_LEFTCLICKED_UP)?, (FME_RIGHTCLICKED_DOWN)?, (FME_RIGHTCLICKED_UP)? )

** FME_MOUSEMOVE: indicating a mouse movement above the preview (mousemove)