The Visualisation Sub project

Introducion and Overview

We have made many afforts to draw paper tapes on computer screens. This subproject is surely one of the biggest and most complex programs in the complete paper tape project. It hasn't be simply written down in some days but has gone throught various development generations, from simply two C files up to the current bunch of a dozen C++ files. This is the structure we are targetting:

LOCHSTREIFEN cairo drawing routines

The files lochstreifen.c and lochstreifen.h implement the drawing of paper tapes by using the cairo graphics library. These routines only need cairo, so they can be compiled by using `pkg-config --cflags --libs cairo`. They do not need neither GTK nor Glib (this is a special feature! :-) )
The routines only implement the drawing routines - the cairo object (cairo_t) must be given from the implementing programs. In this way you have full freedom to choose a cairo surface -- among others PNG, SVG, PDF, ...). See lochstreifen.h for the structure of the object `LOCHSTREIFEN'. See lochstreifen.c for help with the usage of the functions.

There are two generations of this file: The one before I learned that there's a standard for paper tapes and the one after I learned that there's such a standard, called ECMA 10. When I read about this ECMA standard, I've rewritten the routines completely, cleaning the programming interface and making it more flexible and robust. The new code is stable right now.

Features of this library:

Command line and web frontend

The file cli.c uses the LOCHSTREIFEN structure directly. It only depends on the two lochstreifen.c/h files. For argument parsing, it uses the argp.h, from the GNU C library. Unfortunately argp.h doesn't seem to be present in other c librarys, that's still an issue. Apart from that the CLI program is complete platform independent and only has to be linked against libcairo: gcc cli.c lochstreifen.c `pkg-config --cflags --libs cairo`.

Features of the command line frontend:

We actually have developed a web frontend in PHP which uses the command line interface to generate the results. It recieves the user input by an huge HTML form. Using a lot of AJAX magic, it even caches already created images and creates reports which contain the input data and all settings and which are finally available for the client. To avoid denial of service attacks (DoS), the PHP frontend will deny creating paper tapes if the input file exceeds some MB because the resulting file will be very big (most web browsers reject rendering such big files which are, for example, 400.000px in width).
This progam is an own sub project, see ../web-frontend/ for the sources and it's documentation.

GtkPaperTape

The library GtkPaperTape is a typical and unexpected result of the growth of the complete program. Whereas the GTK visualisatoin frontend initlally consisted of only one C file (corresponding to cli.c), gtk.c, it rapidly got very big and confusing so I decided to write divide the sourcecode into a Gtk+ widget, called GtkPaperTape and the program around it, still called gtk.c. Well, I developed this widget, and it got even much bigger than the former gtk.c program (about 1200 lines pure C and Glib code). There occured quite some problems (the sourcecode was badly maintainable and confusing, and there wer some drawing bugs that I could not solve), but the program was working quite fine.

Well, there was the issue about the Windows version and the implementation of punching/reading features. This made the things much more complex, as it requires more features from both LOCHSTREIFEN and GtkPaperTape. I therefore decided to learn C++ and Gtkmm to produce a new program from the scratch with a cleaner interface and a better documentation. As was only to be expected, the sourcecode is now much more bulky, we have now more than a dozen Cpp/header files with more than 2400 lines of code (still growing). The third generation of the GtkPaperTape is still supposed to be called GtkPaperTape, but uses the gtkmm namespace Gtk, so it's actually Gtk::PaperTape.
There's a meta header file, gtkpapertape.h. Include this file when you want to use the GtkPaperTape widget.

This is an overview of the features of the current generation of GtkPaperTape:

There is still a bug while scrolling over really big paper tapes, but I've managed to get solved who's the guilty library: It's a Gtk+ bug, commited on the GNOME bugzilla by me.

Compared to the widget, there's a quite trivial and simple frontend programm called gtk.cc that replaces the old gtk.c.