New in version 8.0.0


  • Form Builder

    • Fix: access destroyed controls when Form Builder's main form was destroyed without closing event.
  • Added

  • Fixed

    • Using integer constants in fragment shader of Android platform which were preventing shader compilation and drawing anything.
    • Resources leak in Frame widget.
    • Add missing header file in IFile interface header file.
    • Add missing DPI argument to constructor of CControlItemList.
    • Check thread finished interval for 50ms instead of 50k seconds in Android CThread class.
    • Timers trigger interval calculation in Android CApplication class.
    • Index out of bound error when scrolling to caret in empty Built-in TextArea.
    • GroupBox's methods setLeftBorderColor(), setTopBorderColor(), setRightBorderColor(), and setBottomBorderColor() were setting color incorrectly.
    • Rendering gradients on some Androids.
  • Improved

    • Rendering speed has been greatly increased(~3 times in debug builds).
    • Method naming standartization has been applyd to many objects. Its main concepts are:
      • Only object which have private or protected members or derive from interfaces or classes should be classes themselves. All other compound object usually will be structs and unions.
      • Methods of compound object which are not classes should use underscore naming. For instance, is_empty().
      • Methods of classes and interfaces should use camelCase names. For instance, isEmpty().
      • Names of methods of classes which return STL iterators or perform in the same way as STL object they manage can have the same naming as the STL object. For instance, see Variant class begin(), end() and other methods similar to the ones in std::vector.
      • Properties of compound object should use CamelCase names. For instance, LeftTop.
    • Mathematical functions Round(), DegToRad(), RadToDeg(), IsLess(), IsLessOrEqual(), IsGreater(), IsGreaterOrEqual(), IsEqual(), IsNotEqual() can now be evaluated at compile time with constant expressions.
    • Comparison functions IsLess(), IsLessOrEqual(), IsGreater(), IsGreaterOrEqual(), IsEqual(), IsNotEqual() use default value for tolerance argument now.
    • Comparison operators of Variant class now uses Tolerance global constant to compare variants storing floating point values.
    • HOTKEY structure comparison operators have been moved to Nitisa/Core/Utils.h header file.
    • Properties storing images are now stored in more efficient way and use twice less application memory.
    • Bitmap and BitmapMask data order was changed.
    • Point position in block claculation algorithm is simplier and faster now. It is used in fragment shaders or renderers.
    • All font properties can be edited in Form Builder from now on.
  • Removed

    • Global variable IEditor *Editor;.
    • Global functions Translate(), Scale(), RotateX(), RotateY(), and RotateZ().
    • In order to minimize errors with vector and matrix calculations such rarely if ever used operators as per component multiplication and multiplication of matrix on vector where removed. Additionally commonly used operators for multiplications where changed from ^ to *.
    • Variant::vtChar, Variant::vtAnsiChar, and Variant::vtAnsiString variant types have been removed as they are never were used. Corresponding constructors and operators were removed as well. Also element access operator with String argument has been removed because there is wchar_t* argument method which acts the same way. And finally Variant get(const String &key) const method was replaced with Variant get(const wchar_t *key) const one(argument type has been changed).
    • Comparison operators of TRANSFORM structure.
    • Methods getPreview() from class CProperty. They should be overriden by derived classes.
    • Templates PROPERTY and PROPERTY_STATE.
    • Software Renderer.
    • Properties CaptionColor, CaptionShadowColor, CaptionShadowShift, and CaptionShadowRadius of ProgressBar control.
  • Replaced

    • All double type variables has been replaces with float type. It is done for optimization and avoid unnecessary data type conversion as all graphics engines use float instead of double and OpenGL one in paticular is used as main rendering engine in the framework. The float type accuracy is more than enough for drawing user interfaces which is a primary goal of the Nitisa framework.
    • Point type has been replaced with Point union with similar members.
    • PointB type has been replaced with PointB union with similar members.
    • PointF type has been replaced with PointF union with similar members.
    • Rect type has been replaced with Rect union with similar members.
    • RectF type has been replaced with RectF union with similar members.
    • RectB type has been replaced with RectB union with similar members.
    • RectC type has been replaced with RectC union with similar members.
    • Vector type has been replaced with Vector union with similar members.
    • Matrix type has been replaced with Matrix union with similar members.
    • Color type has been replaced with Color union with similar members.
    • Bitmap type has been replaced with Bitmap class with similar members.
    • BitmapMask type has been replaced with BitmapMask class with similar members.
    • Gradient comparison operators were replaced with methods isEqual() and isNotEqual().
    • Gradient's POINT's comparison operators were replaced with methods is_equal() and is_not_equal().
    • Many property types of different intefaces, classes, and function/method arguments were changed from integer to floating point ones.

Migration from previous version

You cannot use Editor global variable in your code anymore. Instead you may get it from Application instance by its getEditor() method. This change also affect GetPackage() function which should be exported by packages in order to allow Form Builder to manage the package. The second argument(which was the editor instance) is also removed.

Such types as Point, PointF, PointB, Rect, RectF, RectB, RectC, Vector, Matrix, Color, Bitmap, BitmapMask are now separate classes as mentioned above. To use them you may need to include their own header files. Which one you can find at the corresponding pages. Thease new classes are equivalent to the former ones but there are some little changes. Here they are.

  • There is no method LeftTop() in rectangles anymore. Instead there is a member LeftTop.
  • Method Width() is now width().
  • Method Height() is now height().
  • Method Validate() is now validate().
  • Some other methods has also been renamed. You will easily understand which one to use by observing corresponding class documentation page.
  • Instead of methods is_equal() and is_not_equal() you need to use global functions IsEqual and IsNotEqual.
This is all changes required related this data types.

Instead of removed global functions Translate(), Scale(), RotateX(), RotateY(), and RotateZ() use Matrix class corresponding methods.

When multiplying vector on matrix and matrix on matrix use operators * and *= instead of former ^ and ^=. They are described at Matrix class documentation page. If you want for some reason former functionality, you still may use TTensor template which was formely used as Vector and Matrix aliases.

As many property and argument types has been changed from integer to floating point types you have to do the same adjustments in your code. This change is usually simple but may take a while. Most often you only have to change int to float, Point to PointF, and Rect to RectF and use proper constant values as well. Please also pay attension on comparison. Using operators == and != is not correct for floating point values. For objects like PointF and RectF you will get compilation error as we removed those operators from them and thus adjusting your code will be very easy. But for the simple float data type those operators still exists and you have to check every place where you compare floats. For comparison of floating point values and objects please use IsEqual(), IsNotEqual() and other similar global comparison functions.

Instead of removed comparison operators of TRANSFORM structure please use comparison functions IsEqual() and IsNotEqual().

Instead of default implementation of methods getPreview() of class CProperty you have to implement them in your derived property classes(if you have your own custom properties). This methods should return the string which will be displayed in property editor of the Form Builder so these methods implementation is very easy.

Instead of using removed templates PROPERTY and PROPERTY_STATE you now have to derive your properties from CProperty and CPropertyState classes and implement all abstract methods yourself. Those methods are really simple and their meaning is quite clear from their names and comments. All existing properties have already been adapted to the change and you only need to change your custom properties if you have ones.

Instead of removed Software Renderer and coresponding Windows GDI Renderer use usual Windows OpenGL Renderer. The removed renderer was to slow to be used in production environments and proved to be rarely used. That is why it was removed. If your project highly depends on it and migrating to OpenGL renderer is not an option you may postpone upgrading your project(s) to this version. Anyway, you can write to our support center if you think the Software Renderer should not be deleted and we will consider restoring it and further maintaining.

You can pass nullptr as clip argument value in IListItemService's Render() method. In this case it will work as it was before introducing new argument. But if you draw several list items of the same size it is better to use it as it omits several texture creation/destruction commands. You may use it in the following way

ITexture **clip{ nullptr };
...
for (int i = 0; i < list_item_count; i++)
{
    ...
    list_item[i]->QueryService()->Render(matrix, block, last_pass, clip);
    ...
}
if (clip)
    clip->Release();
...

As the Bitmap and BitmapMask data order was changed you have to change all you inline images you put into a source code. Previously data was arranged as array of rows. Now it is arranged as array of columns. The change is really easy. For example, if before you had 3x2 image set as following:

const Color IconData[3 * 2]{
    CColors::Red,   CColors::Red,   CColors::Red,
    CColors::Green, CColors::Green, CColors::Green
};

which is an image with width equal to 3 pixels and height equal to 2 pixels and is nothing but red line and green line below.
After this release you have to specify such inline image as following:
const Color IconData[3 * 2]{
    CColors::Red, CColors::Green,
    CColors::Red, CColors::Green,
    CColors::Red, CColors::Green
};

Instead of removed caption properties of ProgressBar control use its Font property.