Description

BGRABitmap is a set of units designed to modify and create images with transparency (alpha channel). Direct pixel access allows fast image processing. The library has been tested on Windows, Ubuntu and Mac OS X (The last version doesn't work on Mac), with widgetsets win32, gtk1, gtk2 and carbon.

The main class is TBGRABitmap, which is derived from TFPCustomImage. There is also TBGRAPtrBitmap which allows to edit BGRA data that are already allocated. This format consists of 4 bytes for each pixel (blue, green, red and alpha in that order).

The image can be rendered on a regular Canvas or on an OpenGL surface.

Additional packages

Some package use BGRABitmap to provide controls with nice graphics:

BGLControls: provides TBGLVirtualScreen to draw on an OpenGL surface. This package is in BGRABitmap archive.

Using BGRABitmap

Tutorial

Overview

Functions have long names in order to be understandable. Almost everything is accessible as a function or using a property of the TBGRABitmap object. For example, you can use CanvasBGRA to have some canvas similar to TCanvas (with opacity and antialiasing) and Canvas2D to have the same features as the HTML canvas.

Some special features require the use of units, but you may not need them :

TBGRAMultishapeFiller to have an antialiased junctions of polygons is in BGRAPolygon

TBGRATextEffect is in BGRATextFX

2D transformations are in BGRATransform

TBGRAScene3D is in BGRAScene3D

If you need to have layers, BGRALayers provides TBGRALayeredBitmap

Double-buffering is not really part of BGRABitmap, because it is more about how to handle forms. To do double-buffering, you can use TBGRAVirtualScreen which is in the BGRAControls package. Apart from that, double-buffering in BGRABitmap works like any double-buffering. You need to have a bitmap where you store your drawing and that you display with a single Draw instruction.

Installation

After unpacking a checkout, BGRA often does not compile in Linux. Try using the IDE Macro

LCLWidgetType:=gtk2

in such cases. Still some other part may not compile.

Simple example

Create a project and open bgrabitmappackage.lpk with Lazarus. In the package window, click on "Use > Add to Project". Then in the source code of the main file (main form or main program), add to uses clause BGRABitmap units. You may need to add BGRAGraphics unit as well if you use certain types that are inherited from the LCL.

Uses
Classes, SysUtils, BGRABitmap, BGRABitmapTypes;

The unit BGRABitmapTypes contains common definitions, but one can declare only BGRABitmap in order to load and show a bitmap. Then, the first step is to create a TBGRABitmap object:

Notions

Pixels in a bitmap with transparency are stored with 4 values, here 4 bytes in the order Blue, Green, Red, Alpha. The last channel defines the level of opacity (0 signifies transparent, 255 signifies opaque), other channels define color and luminosity.

There are basically two drawing modes. The first consists in replacing the content of the pixel information, the second consists in blending the pixel already here with the new one, which is called alpha blending.

BGRABitmap functions propose 4 modes:

dmSet : replaces the four bytes of the drawn pixel, transparency not handled

dmFastBlend or dmLinearBlend : draws with alphablending but without gamma correction (faster but entails color distortions with low intensities).

dmXor : apply Xor to each component including alpha (if you want to invert color but keep alpha, use BGRA(255,255,255,0) )

Integrated drawing functions

draw/erase pixels

draw a line with or without antialiasing

floating point coordinates

floating point pen width

rectangle (frame or fill)

ellipse and polygons with antialiasing

spline computation (rounded curve)

simple fill (Floodfill) or progressive fill

color gradient rendering (linear, radial...)

round rectangles

texts with transparency

Drawing with the Canvas

It is possible to draw with a Canvas object, with usual functions but without antialiasing. Opacity of drawing is defined by the CanvasOpacity property. This way is slower because it needs image transformations. If you can, use CanvasBGRA instead, which allows transparency and antialiasing while having the same function names as with TCanvas.

Direct access to pixels

To access pixels, there are two properties, Data and Scanline. The first gives a pointer to the first pixel of the image, and the second gives a pointer to the first pixel of a given line.