Marek Jedliński
Marek Jedliński

Reputation: 7316

Options for pure-graphics display in Delphi 2009

My whole experience with direct use of graphics consists of drawing shapes using Turbo Pascal’s gdi unit on a 386 machine ages ago, finding it unbearably slow and never giving it a second thought. In other words, I have next to no idea where to begin.

For a simple Internet radio player application, I would like to design a graphic display somewhat similar to Winamp (but a bit larger and easier on the eyes, since the illegibility of such displays is one reason I’m trying to do my own).

Simple graphic components like those imitating LED displays are nowhere near sufficient, of course. I don’t expect to be drawing clickable UI controls, and certainly not skins – just the readout, with text, digits and a few symbols. I understand Delphi 2010 supports Direct2D, but I only have D2009.

What are my options? Are there any 3rd party components that would help?

On edit two small points. I need the drawing to be flicker-free (i.e,, unlike what I experienced all those years ago in Turbo Pascal :-). Is TCanvas going to be fast enough for that? Also, I would probably want to use alphablending, which I don't think I can get with the basic TextOut, LineTo etc. graphics API. (I just don't know what's possible). What about GDI+?

Upvotes: 2

Views: 2495

Answers (4)

mjn
mjn

Reputation: 36654

A library for fast 2D graphics for Delphi is available as open source on Sourceforge:

Graphics32 (home page: http://www.graphics32.org/)

Graphics32 is a graphics library for Delphi and Kylix/CLX. Optimized for 32-bit pixel formats, it provides fast operations with pixels and graphic primitives. In most cases Graphics32 considerably outperforms the standard TBitmap/TCanvas methods.

Features Some of Graphics32 features include:

  • Fast per-pixel access up to 100 times faster compared to standard TBitmap;
  • High-performance Bitmap alpha blending (including per-pixel alpha blending);
  • Pixel, line and polygon antialiasing with sub-pixel accuracy (combined with alpha blending);
  • Arbitrary polygon transformations and custom fillings;
  • Bitmap resampling with high quality reconstruction filters (e.g. Lanczos, Cubic, Mitchell);
  • A unique state-of-the-art rasterization system;
  • Affine transformations of bitmaps: rotations, scaling, etc with sub-pixel accuracy;
  • Arbitrary projective transformations of bitmaps;
  • Arbitrary remapping transformations of bitmaps (e.g. for Warping, Morphing);
  • Flexible supersampling implementation for maximum sampling quality;
  • Flicker-free image displaying components with optimized double buffering via advanced MicroTiles based repaint optimizer;
  • Multiple customizible easy-to-use overlay layers;
  • Locking of bitmaps for safe multithreading;
  • A property editor for RGB and alpha channel loading;
  • Design-time loading of image formats supported by standard TPicture;
  • Works on Borland Delphi, C++ Builder and Kylix (The last version that supported Kylix was 1.8.3).

As of version 1.5.1b Graphics32 is licensed under the terms of the Mozilla Public License.

Upvotes: 3

Mason Wheeler
Mason Wheeler

Reputation: 84570

Just saw your edit. If you need alpha blending and flicker-free drawing, TCanvas is probably not going to be good enough for you. You should look at components that wrap OpenGL or Direct3D and provide you a high-power graphics canvas.

One such package is Asphyre, though I'm not sure if they have a version that works on Delphi 2009+ yet. I've also got a custom-built library that wraps SDL 1.3 and gives you a drawing frame component you can place on a Delphi form. It does work on Delphi 2009 and later, but I haven't released it as its own package yet. You could find it if you dig around in the SVN archive of my game engine, but if you can wait a day or two I could try to get it made into an easily-usable BPL component package and available for download.

Upvotes: 0

Despatcher
Despatcher

Reputation: 1725

Mostly I agree with Mason and the comments. TPaintBox is a very simple component really. You implement the OnPaint event and are in complete control. It is fast enough on a fast-enough machine.

Put it on a TScrollBox and you don't even need to worry about where the user has scrolled to :)

Make sure you check out the DoubleBufferred property of the parent control(panel/ScrollBox).

If it is a complex drawing/graphic also check out InvalidateRect - this controls which area of a canvas is redrawn.

Of course like all graphics/drawing it gets pretty complicated pretty quickly :(

Upvotes: 0

Mason Wheeler
Mason Wheeler

Reputation: 84570

Take a look at TCanvas. It's built into most visual controls and contains easy methods for the sort of simple drawing you're looking at, without the need for mucking around with DirectX or OpenGL. If you want a really simple surface you can draw on, place a blank TImage TPaintBox on the form and use its Canvas as your drawing surface.

Upvotes: 1

Related Questions