+gfxline_t* gfxline_append(gfxline_t*line1, gfxline_t*line2)
+{
+ gfxline_t*l = line1;;
+ if(!l)
+ return line2;
+ while(l->next) {
+ l = l->next;
+ }
+ l->next = line2;
+ return line1;
+}
+
+void gfxline_transform(gfxline_t*line, gfxmatrix_t*matrix)
+{
+ while(line) {
+ double x = matrix->m00*line->x + matrix->m10*line->y + matrix->tx;
+ double y = matrix->m01*line->x + matrix->m11*line->y + matrix->ty;
+ line->x = x;
+ line->y = y;
+ if(line->type == gfx_splineTo) {
+ double sx = matrix->m00*line->sx + matrix->m10*line->sy + matrix->tx;
+ double sy = matrix->m01*line->sx + matrix->m11*line->sy + matrix->ty;
+ line->sx = sx;
+ line->sy = sy;
+ }
+ line = line->next;
+ }
+}
+
+void gfxmatrix_dump(gfxmatrix_t*m, FILE*fi, char*prefix)
+{
+ fprintf(fi, "%f %f | %f\n", m->m00, m->m10, m->tx);
+ fprintf(fi, "%f %f | %f\n", m->m01, m->m11, m->ty);
+}
+
+void gfxmatrix_transform(gfxmatrix_t*m, double* v, double*dest)
+{
+ dest[0] = m->m00*v[0] + m->m10*v[1] + m->tx;
+ dest[1] = m->m01*v[0] + m->m11*v[1] + m->ty;
+}
+void gfxmatrix_invert(gfxmatrix_t*m, gfxmatrix_t*dest)
+{
+ double det = m->m00 * m->m11 - m->m10 * m->m01;
+ if(!det) {
+ memset(dest, 0, sizeof(gfxmatrix_t));
+ return;
+ }
+ det = 1/det;
+ dest->m00 = m->m11 * det;
+ dest->m01 = -m->m01 * det;
+ dest->m10 = -m->m10 * det;
+ dest->m11 = m->m00 * det;
+ dest->tx = -(dest->m00 * m->tx + dest->m10 * m->ty);
+ dest->ty = -(dest->m01 * m->tx + dest->m11 * m->ty);
+}
+
+gfxfontlist_t* gfxfontlist_create()
+{
+ /* Initial list ist empty */
+ return 0;
+}
+
+gfxfont_t*gfxfontlist_findfont(gfxfontlist_t*list, char*id)
+{
+ gfxfontlist_t*l = list;
+ while(l) {
+ if(!strcmp((char*)l->font->id, id)) {
+ return l->font;
+ }
+ l = l->next;
+ }
+ return 0;
+}
+char gfxfontlist_hasfont(gfxfontlist_t*list, gfxfont_t*font)
+{
+ gfxfontlist_t*l = list;
+ while(l) {
+ if(!strcmp((char*)l->font->id, font->id)) {
+ return 1;
+ }
+ l = l->next;
+ }
+ return 0;
+}
+gfxfontlist_t*gfxfontlist_addfont(gfxfontlist_t*list, gfxfont_t*font)