Category Archives: Releases

Announcement of new PureBasic releases

PureBasic Non-Regression Suite

When writing massive software like PureBasic, you need to have automated tests to validate it and ensures there is no regression when publishing a new version. We will try to explain how we achieve this for PureBasic and why it is essential for the product robustness.

First, let’s recap the main PureBasic components and their size:

  • The compiler, which is about 250k lines of C, generating x86 asm, x64 asm and C
  • The IDE, written in PureBasic which is about 130k lines of code
  • The libraries, written for 3 platforms (Linux, Windows, OS X) in ASM, C, C++ or Objective C which are about 1.200k lines of code

Each time a compiler bug is squashed, we add a new test in the test suite to ensures it won’t happen again. For now, there is more than 2500 unit tests covering all public features of the PureBasic language, validating the syntax and ensuring the results are corrects. Theses tests are run in different context (Threaded mode ON/OFF, debugger ON/OFF, Optimizer ON/OFF) and if one of these tests fail, the build script is aborted. These tests are just written in standard PureBasic files, compiled into a single executable and run all at once. Each platform runs these tests. Here is a small example of how it looks from the AritmeticFloat.pb file:

; Float promotion
Check(Round(Val("2") * 1.2, #PB_Round_Nearest) = 2)

Integer.i = Round(Val("3") * 1.2, #PB_Round_Nearest)
Check(Integer = 4)

Integer = 1
Integer = Integer + Round(Val("2") * 1.5, #PB_Round_Nearest)
Check(Integer = 4)

Integer = 1
Integer = Integer - Round(Val("2") * 1.5, #PB_Round_Nearest)
Check(Integer = -2)

Integer = 2
Integer = Integer * Round(Val("2") * 1.5, #PB_Round_Nearest)
Check(Integer = 6)

Integer = 9
Integer = Integer / Round(Val("2") * 1.5, #PB_Round_Nearest)
Check(Integer = 3)

; Constant rounding
Integer.i = 0.6 * 2 ; rounded to 1
Check(Integer = 1)

Integer = 0.9 * 2 ; rounded to 2
Check(Integer = 2)

Integer = 0.6 ; rounded to 1
Check(Integer * 2 = 2) 

When we work on the libraries, it’s a bit different, as we use the PureUnit tool (which can be found freely in the SDK) which is similar to NUnit or JUnit if you know those tools. It is very good at writing single commands tests, and provide a solid way to run the tests randomly, in different modes (Threaded, with different Subsystems, etc.). When a bug is fixed in a library we add a test when it’s possible (testing UI, Sprites, 3D engine is complicated as you can’t really check the graphical output). The Syntax is very easy to use as you can see from this example taken from the String library unit test file:

ProcedureUnit InsertStringTest()
  Hello$ = "Hello"
  World$ = "World"
  AssertString(InsertString("Hello !", World$, 7), "Hello World!")
  AssertString(InsertString("Hello !", World$, 8), "Hello !World")
  AssertString(InsertString("Hello !", World$, 1), "WorldHello !")
  AssertString(InsertString("Hello !", World$, -1), "WorldHello !") ; Test with out of bounds value
  AssertString(InsertString(Null$, Null$, 1), "") ; Null values should be accepted as well
  AssertString(InsertString("", "Hello", 1), "Hello") ; Inserting empty string shouldn't touch the string
  AssertString(InsertString(Null$, "Hello", 1), "Hello") ; Inserting null string shouldn't touch the string
  AssertString(InsertString(Hello$+Hello$, World$+World$, 6), "HelloWorldWorldHello") ; Test with internal buffer use

ProcedureUnit LeftTest()
  Test$ = "Test"
  AssertString(Left(Test$, 1)      , "T")
  AssertString(Left(Test$, 0)     , "")
  AssertString(Left(Test$, -1)     , "")
  AssertString(Left(Test$, 10)     , "Test")
  AssertString(Left(Test$, 3)      , "Tes")
  AssertString(Left(Test$, 4)      , "Test")
  AssertString(Left(Null$, 0)      , "")
  Result$ = Left(Test$, 1)

ProcedureUnit LenTest()
  Test$ = "Test"
  Assert(Len(Test$) = 4)
  Assert(Len(Null$) = 0)

The test procedure are declared with ProcedureUnit and EndProcedureUnit, there is some Assert commands available to control the checks. You can declare some common setup or clear procedure to run before and after each test with ProcedureUnitBefore and ProcedureUnitAfter. There is much more, feel free to check the PureUnit documentation to get the most of it. I strongly recommand to give it a try if you need to write some unit tests for your own PureBasic application.

The next tests we have are ‘linker’ tests. We put all commands of a single library in a file, and compile it to ensures it links properly. Then we put all the commands of PureBasic in a single file and we link it as well.

Then we test if all the examples found the in PureBasic/Examples directory compiles properly with the new PureBasic version.

Once all these tests are run and successful, the final package can created and published.

Linux and PureBasic

Since 20 years, PureBasic runs natively on Linux, using seamlessly specific libraries like GTK, QT, SDL and more. However, as PureBasic is a closed source software, we can only ship a binary package and it can be sometimes difficult to find the right distro to run your PureBasic programs. Every distro can have slightly different binary versions of GTK, QT, libc, zlib etc. and it could prevent PureBasic binaries to run at all.

Up to know, the Linux build servers were upgraded in somewhat chaotic manner, without real rules. For example, the current Linux build servers are running on Ubuntu 17.10 for both x64 and x86 because it was the last Ubuntu version handling x86. The problem is Ubuntu 17.10 was basically only supported for 6 months and then was in support mode for a few more months. Executable created on it are no more compatible with Ubuntu 20.04 or some other recent distros.

To address this, we decided to change way we will support Linux distros. Starting with PureBasic 6.00, we using the following scheme:

– PureBasic for Linux x64 will be available on the 2 last Ubuntu LTS versions (at the time of writing, it means Ubuntu 18.04 LTS and Ubuntu 20.04 LTS)
– PureBasic for Linux x86 will be available on the latest Debian (at the time of writing, Debian 10). As it is a lot of work, we only support one Debian at once because x86 is loosing traction on Linux distro side (for example, Ubuntu x86 is no more).

What does it means for you, PureBasic programmer ? It should be be easier to choose your dev environment (basically stick to Ubuntu LTS and upgrade it when a new version is released) and the produced executable should run on a wide range of Linux distros (you can even choose to build 2 versions, one on 18.04 LTS, and one on 20.04 LTS if you want to support even more Linux distros).

These 3 new build servers are already up and running, we hope it will solve some of the issues related to the Linux version of PureBasic !

PureBasic 5.30 beta 1 released

The first public beta version of the upcoming PureBasic version is available for download on your download account.

Some notable new features include:

  •  A new JSON library including functions to serialize complex data structures directly from PB code to JSON and back. The same functionality has also been added to the XML library.
  • New functions for the 3D engine.
  • The IDE and debugger are now full unicode programs
  • Improvements for the IDE such as a “plain-text” editing mode, the highlighting of repeated occurrences of the current selection, a new ‘Issues’ tool to track TODOs in the source code and more.
  • A new /PREPROCESS compiler flag which will generate a PB code with all compiler directives and macros resolved.
  • … and much more!

The english documentation is already up to date for the new features, so you can find a description and examples there.

This version also includes some changes that may break compatibility with existing code:

  • The (X)IncludeFile and IncludeBinary have changed their behavior for relative paths.
  • The #PB_Event_SizeWindow and #PB_Event_MoveWindow events are no longer reported in realtime in the main event loop. This is to reduce problems with flickering on resize. To get realtime events you have to use the BindEvent() function and a callback in the future.
  • CreateXMLNode() has a new mandatory parameter.[/list]

This is regular release which means it brings new features and will have the regular support cycle. The 5.2x LTS release will continue to be maintained and a 5.23 LTS release is planned for shortly after this release becomes final.

Here is the full list of changes:

Added: New "Issue" tool for IDE to build todo/issue lists easily from comments.
Added: JSON library
Added: ParseXML(), ComposeXML(), InsertXMLArray/List/Map/Structure(), ExtractXMLArray/List/Map/Structure() to XML lib
Added: OpenGLGadget() with native opengl commands ande constants support for Windows, OSX and Linux
Added: ExamineRegularExpression() and related commands to process regex matches step by step (with group support)
Added: ClipOutput(), UnclipOutput(), SetOrigin(), GetOriginX(), GetOriginY()
Added: GetWindowData(), SetWindowData()
Added: AllocateStructure(), FreeStructure()
Added: #PB_Default support to WindowsBound() to reset min/max size
Added: 'Format' parameter to Read/WriteProgramString(), WriteProgramStringN() and ReadProgramError()
Added: /PREPROCESS compiler flag to create a big single source with all macros, compilerif and file include resolved. Can be combined with /COMMENTED to get the original source with comments as well.
Added: optional '#Server' parameter to NetworkServerEvent() to check events only on a specific server
Added: #PB_String_NoZero flag support to PokeS() to avoid writting the ending null character
Added: #PB_Enumeration support for Defined()
Added: Optional 'Type' parameter to CreateBillboardGroup()
Added: BillboardGroupCommonDirection(), BillboardGroupCommonUpVector()
Added: #PB_Entity_MinVelocity and #PB_Entity_ForceVelocity to SetEntityAttribute()
Added: SetMaterialAttribute() with #PB_Material_DepthCheck and #PB_Material_DepthWrite constants
Added: #PB_Material_DepthCheck support for GetMaterialAttribute().
Added: Engine3DStatus() with these constants: #PB_Engine3D_NbRenderedTriangles, #PB_Engine3D_NbRenderedBatches
       #PB_Engine3D_CurrentFPS, #PB_Engine3D_MaximumFPS, #PB_Engine3D_MinimumFPS, #PB_Engine3D_AverageFPS, #PB_Engine3D_ResetFPS
Added: #PB_Absolute / #PB_Relative support to CameraDirectionX/Y/Z(), CameraX/Y/Z(), EntityX/Y/Z(), LightX/Y/Z(), LightDirectionX/Y/Z()
       BillBoardGroupX/Y/Z(), NodeX/Y/Z(), ParticleEmitterX/Y/Z() and FetchOrientation()
Added: ParticleSpeedFactor(), DisableParticleEmitter()
Added: GetEntityCollisionMask(), GetEntityCollisionGroup(), SetEntityCollisionFilter()
Added: WaterHeight(), FreeWater()
Added: Fully unicode IDE
Added: Highlighting of repeated occurrences of the currently selected word in the IDE
Added: Plain-text editing mode to edit non-PB files in the IDE
Added: 'Issues' IDE tool to collect and display TODO/FIXME markers inside the code
Added: Ctrl+E and Ctrl+Shift+E shortcut to align/shift comments in a selected code block
Added: Ctrl+M and Ctrl+Shift+M shortcut to select the current code block (repeated presses select the next code block)
Added: PopupMenu to IDE error log for clear/copy operation
Added: %HOME and %PROJECT to IDE tool commandline options, added PB_TOOL_Project to available env vars
Added: Automatic code indentation can align comments at the end of code lines in the IDE
Added: AutoComplete remembers last selection for Structure/Module AutoComplete
Added: Context sensitivity for current module/procedure for variable display and expression eval in the debugger

Changed: FormatXML() with #PB_XML_ReFormat no longer adds newlines inside single-line elements for a more readable output
Changed: DeleteElement() now returns the data pointer to the new current element (if any)
Changed: SetXMLAttribute() to accept newline characters in attributes (will be encoded as character entities)
Changed: Added a mandatory "name" parameter to CreateXMLNode() as some parser needs it at node creation time
Changed: The way (X)IncludeFile and IncludeBinary works: it's now relative to the file which contains these statements (which is easier to handle)
Changed: #PB_Event_SizeWindow and #PB_Event_MoveWindow are no more realtime on Windows, use BindEvent() to get real time update. It should fixes ugly flickering when realtime resizing on Windows.
Changed: DataSection label within Procedure are now local labels.
Changed: ASM local label prefix has been changed from "l_" to "ll_" ("ll" for local label), to avoid possible clash with main labels.
Changed: #PB_LinkedList constant has been renamed to #PB_List for better consistancy
Changed: Removed the "Billboard" parameter from AddBillboard() as it was not used. Now returns the new billboard index.
Changed: Updated Scintilla to version 3.4.2

Removed: MaterialDepthWrite() (replaced by SetMaterialAttribute())
Removed: CountRenderedTriangles() and Engine3DFrameRate(), replaced by Engine3DStatus()

Big Christmas Interview with Fred…

“Surprise!” – yes, after a long time I have done a new interview with Fred. And this has become really huge (around 80 Q & A!), in which Fred tell us more about himself, but above all about the history, current situation and future development of PureBasic. I was able to elicit some things from him, which will be included in the forthcoming (as beta) version 5.10…

Read more in the News on

PureBasic 4.60 Beta1 released!

Its been quiet around here for a while, but now there is big news: The first public beta of the upcoming 4.60 release is out!

This release is mostly about the 3D side of things, but there are new features for application programmers as well. The OGRE engine was updated to version 1.7.0 and we switched the physics engine from ODE to Bullet. Furthermore, there are a ton of new 3D libraries and commands. You can see the full list below. The 3D commands are not documented yet, but we will put up some examples to demonstrate them.

A special thanks to G-Rom and TMyke from the french forum for their help on the new 3D commands!

On the application side of things, the most notable addition is the CanvasGadget() command. It is a simple drawing surface that provides detailed mouse and keyboard events to easily implement custom data views or controls (all cross-platform of course). You can see this new gadget in action in the IDE already: The new file panel and the new color picker tool both make use of it. Other than that, there are some smaller new commands like additions to the LinkedList library for example. All new non-3D commands are already documented in the manual.

The IDE got some additions as well, like the ability to build projects directly from the command-line, or the option to be warned when a file is changed on disk while open in the IDE. Unfortunately, the automation framework that I talked about here on the forum did not make it into this release. It wasn’t finished in time, and its not a big enough priority to justify delaying this release any longer.

Finally, we are in the process of changing the PureBasic documentation to be more precise and readable when it comes to function parameters and return values. This is still a work in progress which should be finished for the final release. Comments on the new structure are welcome.

These are the changes:

– added CanvasGadget(), CanvasOutput()
– added SetGadgetItemData() for PanelGadget
– added MoveElement(), MergeLists(), SplitList() commands
– added RandomizeList(), RandomizeArray()
– added PushListPosition(), PopListPosition(), PushMapPosition(), PopMapPosition()
– added ImageID parameter to OpenSubMenu()
– added #PB_ListIcon_ThreeState and #PB_ListIcon_Inbetween
– added #PB_Tree_ThreeState and #PB_Tree_Inbetween
– added crossplatform ComboBox events
– added ‘Joint’ library
– added ‘SpecialEffect’ library
– added ‘StaticGeometry’ library
– added CameraPitch(), CameraRoll(), CameraYaw(), SwitchCamera()
– added ApplyEntityForce(), ApplyEntityImpulse(), EntityPitch(), EntityRoll(), EntityYaw(), GetEntityAttribute(),
GetEntityMaterial(), SetEntityAttribute(), SetEntityMaterial()
– added LightDiffuseColor(), SpotLightRange(), LightLookAt(), LightPower(), DisableLightShadows()
– added MaterialDepthWrite(), MaterialSelfIlluminationColor(), MaterialShininess(), GetScriptMaterial()
– added BuildMeshShadowVolume(), CreateLine3D(), CreateCube(), CreateSphere(), CreateCylinder(), CreatePlane(), AddSubMesh()
MeshVertexCount(), UpdateMeshBoundingBox(), MeshRadius(), AddMeshVertex(), MeshVertexNormal(), MeshVertexColor()
MeshVertexTextureCoordinate(), AddMeshFace(), FinishMesh(), NormalizeMesh(), SaveMesh(), SetMeshMaterial(), SubMeshCount()
– added NodePitch(), NodeRoll(), NodeYaw()

– changed FindString() ‘StartPosition’ parameter to be optional
– changed WebGadget to use WebKitGtk on Linux
– changed ContainerGadget with #PB_Container_Borderless to no longer add a 2px invisible border on Linux
– changed EntityPhysicBody(), CreateLight(), RenderWorld(), ShowGUI, WorldShadows()

– removed: Get/SetEntityMass(), Get/SetEntityFriction()
– removed: SetMeshData() (temporary, needs to be updated)

– added IDE options for commandline project building
– added monitoring of files for changes on disk while they are open in the IDE
– added FilePanel custom implementation with Drag & Drop, Dropdown menu, scrolling also on OSX
– added Diff tool for directories/files
– added Html help viewer for Linux/OSX
– added Help viewer in toolspanel
– new Color Picker tool
– enabled font selection in IDE for OSX
– ProjectPanel now remembers node expanded states

– added maximize button to all debugger windows
– added all IsXxx() and XxxID() functions to the expression parser (for data breakpoints)

– The manual is being updated to a new format which more clearly describes
individual function parameters and return values. This is not yet complete,
but will be finished for the final release.

Visit the announcement on the PureBasic forums here.

PureBasic 4.50 Beta 1 released!

Hello everybody!

… this is not an april fools joke… or is it? 😛

We are proud to announce the first public beta of the upcoming PureBasic 4.50 release. As promised, the release cycle is much shorter than that of the 4.40 release which means that also the feature list is shorter. Nontheless, some long requested features have been implemented in this release which we hope you will enjoy very much.

The most notable are:

  • Support for Array, List and Map in structures:  These can be nested as much as you want, so you can have a Map-in-List-in-List if you want to. There is no need to call NewList, NewMap or Dim on these elements. They are created as soon as the outer structure is created. Dim can of course still be used to change the size of a dynamic array. Arrays inside structures can only have one dimension for the moment. The debugger has full support for this too. Embedded Arrays, Lists or Maps can be easily viewed by right-clicking on them in the Variable Viewer.
  • Image Library changes: We decided to abandon the support for images with depths below 24bit. Support for images with a palette was Windows-only anyway and had quite a number of bugs as well. The library now stores images internally only in 24bit or 32bit format which makes things a lot simpler. Images can still be loaded (and now also saved) at lower bit depth, so you can still work with them if you need to.
  • IDE Improvements:  The ability to select the used compiler in the compiler options allows to easily switch between different versions from the same IDE. It also allows to easily build and debug 32bit and 64bit applications from one IDE. Furthermore, some longer requested options like keyword sensitive indentation and indent guides have been added.
  • Debugger improvements: There is a brand new ‘Purifier’ tool in the debugger. It adds special ‘cookie’ values around variables, strings and allocated memory blocks to detect when the program accidentally writes past its intended target buffer. As this requires support from the compiler, it has to be activated in the compiler options to be available in the debugger. Furthermore, the already discussed network support and data breakpoints are now available.
  • Up to date documentation:  The english help file has already been updated with all documentation for these new features. The other languages will follow in the final release.

The feature list:

PureBasic 4.50 Beta 1
- Added support for Array, List, Map inside structures
- Added CopyList(), CopyMap(), CopyArray() commands
- Added FreeList(), FreeMap(), FreeArray() commands
- Added CopyStructure() and InitializeStructure() commands
- Added volume support to PlaySournd()
- Changed: The Image library now keeps images only in 24bit or 32bit (loading and saving works with other bit depths)
- Added Depth parameter to SaveImages()  (default is the original depth when the image was loaded)
- Added ImageDepth() flag to get the original or current image depth
- Added #PB_Image_Transparent flag for CreateImage()
- Added 32bit support to TGA image decoder
- Added 32bit support to BMP image encoder
- Added RoundRect() command to the 2DDrawing library
- Added #PB_2DDrawing_AllChannels mode for DrawingMode() (modifies all channels without blending)
- Added image support for the ComboBoxGadget command (not supported for editable ComboBox on Mac OSX)
- Added AbortFTPFile()
- Added graphical console functions to linux
- Added large file support to File lib on Linux/OSX
- Added RandomData() command
- Added CryptRandom(), CryptRandomData(), OpenCryptRandom(), CloseCryptRandom() commands
- Added many more Math functions: Exp(), ATan2(), Radian(), Degree(), [A]CosH(), [A]SinH(), [A]TanH(), IsNaN(), IsInfinity(), NaN(), Infinity()
- Added 'Debugger' Library to control some debugger actions from code

- Added Keyword underline for Break, Continue, ProcedureReturn
- Added StatusBar help for prototypes and interfaces
- Added Keyword sensitive indentation (block mode is still available)
- Added "Format indentation" option in the edit menu
- Added indentation guides and whitespace options
- Added the ability to select multiple compilers in the compiler options
- Added Purifier tool for the debugger
- Added full debugger compatibility between all OS and processors
- Added network debugging for the standalone debugger
- Added data breakpoints for the debugger
- Added maximize button to Variable-, Memory-, Library Viewer and Callstack
- Added support for structured items in the 'View Array/List/Map' tab of the Variable Viewer
- Changed: The Array, List or Map name in the Variable viewer should be entered with a "()" now to display their elements.
       (It is automatically corrected if the () is missing)

As always thank you to everyone who helps test these beta versions and reports bugs. Have fun with this new version and tell us any problems that you have. As usual, this version can be downloaded on your personal account on

Oh, and Happy Birthday Fred!  :mrgreen:

The PureBasic Team

PureBasic 4.41 final is out

Hello folks,

The final version of PureBasic 4.41 is out. It’s a stabilisation release, so we focused only on bug fixes and we have killed quite some :). You can grab it on your online account while it’s hot !

Have fun,

The Fantaisie Software Team.

PureBasic 4.41 RC1 Released!

Hello everybody,

The next release is here. We spent quite some time fixing bugs, so here is the 4.41 bugfix release. As you can see it is called “Release Candidate”. I will explain what the different types of releases mean for PB now:

  • Alpha Release:  These are development snapshots and are not given out to the public. Features are usually not fully finished. This is just to get some early feedback from a few people during development.
  • Beta Release:  Beta means that all new features are implemented and nothing new will be added except bugfixes (except if a feature is found to be too incomplete to be usable).
  • Release Candidate:  This is what used to be the “final beta release” before. In the release candidates we plan to fix only very critical bugs. Minor bugfixes will be postponed to the next version. We release them when we think the version is ready. At this point even people that do not try the betas should test the new version as its the last chance to discover a critical bug.  This release starts directly as a release candidate as there are no new features to test and we only need the validation that we did not break anything with our bugfixes before going to the final release. Releases that introduce new features will have a beta phase as usual.

We also plan to do these bugfix releases (like 4.31 and 4.41) in between new feature releases on a regular basis from now on, so if you are not interested that much in new features and want the most stability then you can just skip the new feature releases and use the bugfix releases only. This way the new features have been tested for a while and bugs in them have been fixed. We also plan to try to shorten the release cycle as the 4.30 and 4.40 release cycles have been way too long.

Please test the new version and tell us whether the bugs marked as fixed are indeed gone and also let us know if any new problems show up. As usual this release can be downloaded on your account on

The PureBasic Team

PureBasic 4.40 Beta1 released!

The wait is finally over. The first beta of our brand new v4.40 release hits the public. It brings exciting new features in all areas:

  • On the compiler side there is the new ‘Threaded’ scope keyword to create thread-local variables and the new ‘.a’ and ‘.u’ native types for unsigned byte/word.
  • On the Library side there is the new ‘Map’ library to have easy hash-maps, and a completly rewritten 2DDrawing library with Sprite/ScreenOutput() even for OpenGl (slow though) and cool alpha-channel and gradient support for ImageOutput().
  • And finally, the IDE gets a much improved AutoComplete and Project management!
  • Not to forget, there is also a brand new x64 Version for Linux available!

You can find the new version on your download account on

To better explain the new features, we put together some examples which can be found here:

Now it is up to you to help us make this new version as solid as possible. Please report any problems you have with this new version in our bug forums. Expecially the Linux x64 version needs much testing as it is brand new, and the IDE because of the massive changes that were needed for the Project management.

Here is the full changelog:

- Added: Linux x64
- Added: Map Library for hash tables
- Added: 'Threaded' Keyword for thread-local variables
- Added: Structure assignment copies the structure (a.point = b.point)
- Added: ClearStructure(*Pointer, Structure)
- Added: AES to cipher library: AESEncoder(), AESDecoder(), StartAESCipher(), AddCipherBuffer(), FinishCipher()
- Added: Dylib for OS X
- Added: Trim/LTrim/RTrim() got an optional character to trim
- Added: Added #PB_Function, #PB_OSFunction, #PB_Map to Defined()
- Added: ReverseString(String$), InsertString(String$, StringToInsert$, Position), RemoveString(String$, RemoveString$ [, Mode [, StartPosition [, NbOccurences]]])
- Added: Add blob support to databases
- Added: Added peephole optimizer to 64 bit versions to produce better code
- Added: '.a' (ascii) and '.u' (unicode) native type to provide native unsigned byte and word.
- Added: FileBuffersSize(#PB_Default, ...): #PB_Default support change the buffersize to the next opened files
- Added: #PB_URL_Protocol to Get/SetURLPart()
- Added: #PB_Shadow_TextureAdditive
- Added: FTPDirectoryEntryRaw(), FillMemory(Memory, Value, Size [, Type])
- Added: Global, Protected, Threaded, Shared and Static now accept a type to affect all default variable declaration.

- Added: AddWindowTimer(), RemoveWindowTimer(), #PB_Event_Timer, EventTimer()
- Added: #PB_Window_Tool - create tool windows
- Added: StatusBarProgress()
- Added: StatusBarImage() - now supports normal images (not just icons)
- Added: #PB_Checkbox_ThreeState flag to create a 3 state checkbox (state values: #PB_CheckBox_Checked, #PB_CheckBox_Unchecked, #PB_CheckBox_Inbetween)
- Added: ShortcutGadget()

- Added: CreateImageMenu(), CreatePopupImageMenu() for OSX
- Added: Full alphachannel support for all GUI elements that display images 
- Added: Full alphachannel support for Image lib 

- Added: New drawing modes for 2DDrawing in ImageOutput()
   - #PB_2DDrawing_AlphaBlend
   - #PB_2DDrawing_AlphaClip
   - #PB_2DDrawing_AlphaChannel
   - #PB_2DDrawing_Gradient

- Added: LinearGradient(), BoxedGradient(), CircularGradient(), EllipsicalGradient(), ConicalGradient(), 

- Added: GradientColor(), ResetGradientColors()
- Added: DrawAlphaImage() for all outputs on all OS
- Added: DrawAlphaImage() has a new transparency parameter and can be used to draw non-alpha images part transparent

- Added: QuickDraw subsystem for WindowOutput() on OSX
- Added: Sprite/ScreenOutput for OpenGL (all OS)
- Added: DrawingFont() works for SDL output!
- Added: OutputWidth(), OutputHeight(), OutputDepth() for 2DDrawing
- Added: GrabDrawingImage(), DrawRotatedText()
- Added: RGBA(), Alpha()

- Added #PB_PixelFormat_ReversedY - for pixel buffers that are stored upside-down (Windows ImageOutput or OpenGl)
- Removed: #PB_Image_DisplayFormat is now deprecated (value set to 32 to have 32bit as default)

- Added: #PB_OS_Windows_7 for OSVersion()

- Updated: OGRE to 1.6.2, sqlite, PCRE to 7.9

- Changed: Call(C)Function(Fast) parameters have been changed from 'Any' to 'Integer'.
- Fixed: Image Decoders are now threadsafe

PureBasic IDE:
- Added: Highlight matching keyword for keyword under cursor (tied to BraceMatching color setting) 
- Added: Edit->Goto matching keyword
- Added: PB_TOOL_Preferences Environment variable for IDE tools
- Added: Theme management to customize menu icons
- Added: New 'Silk' theme based on the Iconsset by Mark James

- Added: Autocomplete scans implicit variable declaration and respects scope
- Added: Structure item autocomplete

- Added: Project Management:
      - Autocomplete for all files within a project (even if not opened)
      - Multiple compiler settings for different compile targets
      - Compile all compile targets at once
      - Per-Project list of last opened files
      - Project ToolsPanel tool for fast access to the project files

- Changed: moved encoding/newline setting from compiler options to file menu

- Improved: greatly improved VariableViewer update speeds
- Added: progressbar display if VariableViewer update takes long
- Added: column sort capability to VariableViewer (Windows Only)

If you are wondering where the parallel optimized sort functions are that i talked about in the blog, unfortunately these did not make it into this version. There were some problems and unfinished things in them and there just was not enough time to finish it for this version. Don’t worry though, it will be in the next one for sure 🙂

Have fun with this version!