Liqbase library overview

Contents

liqbase :: the core library

Note, this document describes a library which is not currently available, however its precursor liqbase is available for download:

http://maemo.org/downloads/product/OS2008/liqbase/.

This is preliminary outline documentation for my library and toolkit. it will be expanded upon over the coming days.

Rational

liqbase was born of frustration.

It started out as a collection of ideas and principles which show off the nokia internet tablet as a fast versatile handheld computer which very rapidly grew into a large monolithic application.

It was the first application I have written in C in many years has been used to learn about the device and the various libraries and interactions on the Nokia internet tablets.

A proof of concept so to speak.

The library is aimed to correct the mistakes I made and to provide a framework to continue building my shiny applications.

It contains a small set of classes which are usable for creating rich touchable GUI components. It has been written in C for both speed and expandability.

At present it is very specifically focused upon the Nokia internet tablet computers running linux.

Why not GTK or QT?

I looked carefully at GTK when I first got my tablet and would have been happy it if it had the required performance, it has (semi) sane construction methods and an expansive library of controls and utility functions.

However on the tablet graphical performance was so poor that anything I attempted felt slow and applications crawled along. QT had its own problems and still is not a viable option on the devices.

I wanted to do things which I took for granted on my old PDA and have done for years in Visual Basic and found the existing toolkits lacking.

Dependencies

liqbase makes use of the following libraries:

  • X11 window manager for the events.
  • XVideo, an x11 graphics accelerator usually used for rendering video frames.
  • Gstreamer, for the camera
  • Esound for the audio output
  • xsp for the pressure sensitive mouse input
  • ttflib ttf font handling
  • libpng
  • libjpeg

graphics are rendered using the XV library using the YUV video format. This is a lower bandwidth video mode which has full resolution Luma, but half resolution Chroma.


core classes

It is being constructed around a core set of interrelated classes

  • liqapp core system functions
  • liqcanvas provides actual display backbuffer and event sink
  • liqimage native image class, allows alpha, files of type png and jpeg supported
  • liqfont a renderable font library, extensive caching
  • liqsketch a dynamic sketch built up from various strokes and points
  • liqcliprect a physical rectangle within an image with direct drawing routines


Beyond the core there is a second layer of classes dealing with structured layout and rendering

  • liqcell a single unit capable of holding or representing physical or meta data
  • liqgraph a special resolution independent graphics interface which a cell uses

With these classes I will be able to construct the applications started inside liqbase


class structure

Most classes created in liqbase follow the same object pattern and contain the following default standard methods:

class *class_new()
{
	// Create a brand new instance of the class
}

int class_hold(class *self)
{
	// Add a reference to an existing instance
}

int class_release(class *self)
{
	// release a reference to an instance
	// if there are no more instances, call _free on the instance
}

int class_free(class *self)
{
	// release all memory for this instance
	// call _release on all members of this class
}

The reference counting is held as a private member inside the instance itself.

There is no concept of inheritance at this level, however once you have instances of cell classes (described in detail below) they follow generic inheritance rules and can expand.



Example cell lifespan

A usual cycle goes like this


void hello_world()
{
    liqcell * myform		= liqcell_newwidget(“myform”,”form”, 340, 60);
    liqcell *l1		= liqcell_newwidget(“hello”,”label”, 60, 60);
    liqcell *l2 		= liqcell_newwidget(“world”,” label”, 60, 60);

    // do stuff with these instances and maybe create a tree of objects

    liqcell_child_insert(myform , l1 );
    liqcell_child_insert(myform , l2 );
    liqcell_child_arrange_automatic(myform);

    liqcell_show(myform);

    // now we are finished release the root of the tree.  
    // all items inserted will be recursively released.

    liqcell_release(myform);
}