[cairo] Fwd: glitz & Java

Charles Tuckey ctuckey at verano.com
Mon Jul 19 13:54:01 PDT 2004


Hi Jerome,

Have you looked at the cairo Java binding that Soorya Kuloor has done? 
http://www.cairographics.org/CairoJava

I have used this with success in my project. The binding is not quite 
complete but there is enough there to get started. There are specific 
classes to create GL surfaces. Even if it is not what you need it may 
help you with your Java problems...

charlie

Jerome DUFLOS wrote:
> 
> ----------  Message transmis  ----------
> 
> Subject: glitz & Java
> Date: mardi 6 Juillet 2004 14:02
> From: Jerome DUFLOS <jduflos at mds-design.fr>
> To: cworth at isi.edu
> 
> Hello,
> 
> I try to use cairo and it's openGL bakend (Glitz) from a java awt
>  application. I encountred some problems which I try to solve...
> 
> 	1 The creation of the openGL Context : I modify this creation
> 	2 The way of drawing the text : by calling directly th glXXXX functions.
> 
> Indeed the front hand to abstract the os and opengl works very well in C but
> there is somes problems in Java (Awt and SWT too)
> (I use a mandrake 10.0  &  Nvidia GEForce FX 5200.... )
> 
> you will find a .diff file in attachment where you can see the modifications.
> 
> I have fixed those problems but maybe there is still some others with java ?
> 
> You will also find a .txt file in which I report the errors I get if I use
>  the original methode.
> 
> If you want the java class test I have made to test, ask me I will send you
>  an archive of my work..
> 
> Jerome DUFLOS
> 
> -------------------------------------------------------
> 
> 
> 
> 
> ------------------------------------------------------------------------
> 
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glActiveTextureARB
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glBindProgramARB
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glDeleteProgramsARB
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glGenProgramsARB
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glGetProgramivARB
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glMultiTexCoord2dARB
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glProgramLocalParameter4dARB
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glProgramStringARB
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glXBindTexImageARB
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glXCreatePbuffer
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glXDestroyPbuffer
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glXGetFBConfigAttrib
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glXGetFBConfigs
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glXGetProcAddressARB
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glXGetVisualFromFBConfig
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glXMakeContextCurrent
> /usr2/jduflos/local/lib/libglitz-glx.so.1: undefined symbol: glXReleaseTexImageARB
> 
> 
> 
> ------------------------------------------------------------------------
> 
> Seulement dans glitz: .cvsignore
> Seulement dans glitz_modif/src: .deps
> diff -rbBu glitz/src/glitz.c glitz_modif/src/glitz.c
> --- glitz/src/glitz.c	2004-05-27 08:24:46.000000000 +0200
> +++ glitz_modif/src/glitz.c	2004-07-06 11:29:59.000000000 +0200
> @@ -30,6 +30,8 @@
>  #endif
>  
>  #include "glitzint.h"
> +#include "GL/glx.h"
> +#include "GL/glut.h"
>  
>  #include <math.h>
>  
> @@ -44,6 +46,10 @@
>     ((surface->transform->m[0][1] != 0.0) || \
>     (surface->transform->m[1][0] != 0.0)))
>  
> +   
> +  int w_win = 800;
> +  int h_win = 600;
> +   
>  /* This version of composite uses multi-texturing for direct
>     Porter-Duff compositing. It cannot handle rotating transformations
>     and will fall back to regular composite function if this is the case. */
> @@ -61,6 +67,7 @@
>                           int width,
>                           int height)
>  {
> +	printf("_glitz_composite_direct\n");
>    glitz_gl_proc_address_list_t *gl;
>    glitz_texture_t *src_texture;
>    glitz_texture_t *mask_texture;
> @@ -104,9 +113,17 @@
>  
>    glitz_set_operator (gl, op);
>    
> -  gl->active_texture_arb (GLITZ_GL_TEXTURE0_ARB);
> + 
> +
> +  //glGetString(GL_EXTENSIONS);
> +  //gl->active_texture_arb (GL_TEXTURE0_ARB);
> +  glActiveTextureARB(GL_TEXTURE0_ARB);
> + 
> + 
> +   
>    glitz_texture_bind (gl, src_texture);
>    
> +  
>    gl->tex_env_f (GLITZ_GL_TEXTURE_ENV,
>                   GLITZ_GL_TEXTURE_ENV_MODE,
>                   GLITZ_GL_REPLACE);
> @@ -120,7 +138,9 @@
>                                 src_texture,
>                                 src->hint_mask & GLITZ_INT_HINT_REPEAT_MASK);
>  
> -  dst->gl->active_texture_arb (GLITZ_GL_TEXTURE1_ARB);
> +  //dst->gl->active_texture_arb (GLITZ_GL_TEXTURE1_ARB);
> +  glActiveTextureARB(GL_TEXTURE1_ARB);
> +  
>    glitz_texture_bind (gl, mask_texture);
>  
>    gl->tex_env_f (GLITZ_GL_TEXTURE_ENV,
> @@ -244,30 +264,60 @@
>      mask_br.y = mask_texture->texcoord_height - mask_br.y;
>    }
>  
> +  
> +  
> +   // appels open gl projection 
> +  if (dst->projection!=NULL) dst->projection(dst);
> +  
> +   
>    gl->begin (GLITZ_GL_QUADS);
>  
> -  gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE0_ARB, src_tl.x, src_tl.y);
> -  gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE1_ARB, mask_tl.x, mask_tl.y);
> -  gl->vertex_2d (dst_box.x1, dst_box.y1);
> -
> -  gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE0_ARB, src_br.x, src_tl.y);
> -  gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE1_ARB, mask_br.x, mask_tl.y);
> -  gl->vertex_2d (dst_box.x2, dst_box.y1);
> -
> -  gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE0_ARB, src_br.x, src_br.y);
> -  gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE1_ARB, mask_br.x, mask_br.y);
> -  gl->vertex_2d (dst_box.x2, dst_box.y2);
> -
> -  gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE0_ARB, src_tl.x, src_br.y);
> -  gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE1_ARB, mask_tl.x, mask_br.y);
> -  gl->vertex_2d (dst_box.x1, dst_box.y2);
> +
> +  //gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE0_ARB, src_tl.x, src_tl.y);
> +  //gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE1_ARB, mask_tl.x, mask_tl.y);
> +  glMultiTexCoord2dARB(GLITZ_GL_TEXTURE0_ARB, src_tl.x, src_tl.y);
> +  glMultiTexCoord2dARB(GLITZ_GL_TEXTURE1_ARB, mask_tl.x, mask_tl.y);
> +  
> +  //gl->vertex_2d (dst_box.x1, dst_box.y1);
> +  glVertex3f(dst_box.x1, dst_box.y1, 0);
> + 
> +  //gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE0_ARB, src_br.x, src_tl.y);
> +  //gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE1_ARB, mask_br.x, mask_tl.y);
> +  glMultiTexCoord2dARB (GLITZ_GL_TEXTURE0_ARB, src_br.x, src_tl.y);
> +  glMultiTexCoord2dARB (GLITZ_GL_TEXTURE1_ARB, mask_br.x, mask_tl.y);
> +  
> +  
> +  //gl->vertex_2d (dst_box.x2, dst_box.y1);
> +  glVertex3f(dst_box.x2, dst_box.y1, 0);
> +
> +  //gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE0_ARB, src_br.x, src_br.y);
> +  //gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE1_ARB, mask_br.x, mask_br.y);
> +  glMultiTexCoord2dARB (GLITZ_GL_TEXTURE0_ARB, src_br.x, src_br.y);
> +  glMultiTexCoord2dARB (GLITZ_GL_TEXTURE1_ARB, mask_br.x, mask_br.y);
> +  
> +  
> +  //gl->vertex_2d (dst_box.x2, dst_box.y2);
> +  glVertex3f(dst_box.x2, dst_box.y2, 0);
> +
> +  //gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE0_ARB, src_tl.x, src_br.y);
> +  //gl->multi_tex_coord_2d_arb (GLITZ_GL_TEXTURE1_ARB, mask_tl.x, mask_br.y);
> +  glMultiTexCoord2dARB(GLITZ_GL_TEXTURE0_ARB, src_tl.x, src_br.y);
> +  glMultiTexCoord2dARB (GLITZ_GL_TEXTURE1_ARB, mask_tl.x, mask_br.y);
> +  
> +  
> +  //gl->vertex_2d (dst_box.x1, dst_box.y2);
> +  glVertex3f(dst_box.x1, dst_box.y2, 0);
>  
>    gl->end ();
>  
> -  gl->active_texture_arb (GLITZ_GL_TEXTURE1_ARB);
> +  //gl->active_texture_arb (GLITZ_GL_TEXTURE1_ARB);
> +  glActiveTextureARB(GL_TEXTURE1_ARB);
> +  
>    glitz_texture_unbind (gl, mask_texture);
>    
> -  gl->active_texture_arb (GLITZ_GL_TEXTURE0_ARB);
> +  //gl->active_texture_arb (GLITZ_GL_TEXTURE0_ARB);
> +  glActiveTextureARB(GL_TEXTURE0_ARB);
> +  
>    glitz_texture_unbind (gl, src_texture);
>  
>    glitz_surface_disable_program (type, dst);
> @@ -296,6 +346,7 @@
>                     glitz_bounding_box_t *bounds,
>                     glitz_bounding_box_t *mbounds)
>  {
> +	printf("glitz_mask_bounds\n");
>    double x1, y1, x2, y2;
>    int ix1, iy1, ix2, iy2;
>    
> @@ -406,6 +457,16 @@
>  
>    gl = dst->gl;
>    
> +   // appels open gl projection 
> +  if (dst->projection!=NULL) dst->projection(dst);
> +  
> + 
> +  printf("glitz_composite\n");
> + 
> +	
> +	
> +	
> +  
>    if (SURFACE_PROGRAMMATIC (src))
>      glitz_programmatic_surface_setup (src,
>                                        width + abs (x_src),
> @@ -610,15 +673,25 @@
>      repeat_factor_x = (br.x - tl.x) / (double) texture->width;
>      repeat_factor_y = (br.y - tl.y) / (double) texture->height;
>        
> +	
> +	 // appels open gl projection 
> +  if (dst->projection!=NULL) dst->projection(dst);
> +  
> +	
> +	
>      gl->begin (GLITZ_GL_QUADS);
>      gl->tex_coord_2d (0.0, repeat_factor_y);
> -    gl->vertex_2d (tl.x, tl.y);
> +    //gl->vertex_2d (tl.x, tl.y);
> +	glVertex3f(tl.x, tl.y, 0);
>      gl->tex_coord_2d (repeat_factor_x, repeat_factor_y);
> -    gl->vertex_2d (tr.x, tr.y);
> +    //gl->vertex_2d (tr.x, tr.y);
> +	glVertex3f(tr.x, tr.y, 0);
>      gl->tex_coord_2d (repeat_factor_x, 0.0);
> -    gl->vertex_2d (br.x, br.y);
> +    //gl->vertex_2d (br.x, br.y);
> +	glVertex3f(br.x, br.y, 0);
>      gl->tex_coord_2d (0.0, 0.0);
> -    gl->vertex_2d (bl.x, bl.y);
> +    //gl->vertex_2d (bl.x, bl.y);
> +	glVertex3f(bl.x, bl.y, 0);
>      gl->end ();
>      
>    } else {
> @@ -688,16 +761,26 @@
>              y_is_ok = 1;
>          
>            if (x_is_ok && y_is_ok) {
> +			  
> +			   // appels open gl projection 
> +  if (dst->projection!=NULL) dst->projection(dst);
> +  
> +			  
> +			  
>              gl->begin (GLITZ_GL_QUADS);
>              gl->tex_coord_2d (0.0, texture->texcoord_height);
> -            gl->vertex_2d (tl.x, tl.y);
> +            //gl->vertex_2d (tl.x, tl.y);
> +			glVertex3f(tl.x, tl.y, 0);
>              gl->tex_coord_2d (texture->texcoord_width,
>                                texture->texcoord_height);
> -            gl->vertex_2d (tr.x, tr.y);
> +            //gl->vertex_2d (tr.x, tr.y);
> +			glVertex3f(tr.x, tr.y, 0);
>              gl->tex_coord_2d (texture->texcoord_width, 0.0);
> -            gl->vertex_2d (br.x, br.y);
> +            //gl->vertex_2d (br.x, br.y);
> +			glVertex3f(br.x, br.y, 0);
>              gl->tex_coord_2d (0.0, 0.0);
> -            gl->vertex_2d (bl.x, bl.y);
> +            //gl->vertex_2d (bl.x, bl.y);
> +			glVertex3f(bl.x, bl.y, 0);
>              gl->end ();
>              in_destination_area = 1;
>            }
> @@ -775,11 +858,37 @@
>    if (SURFACE_CLEAR_EXTERIOR (dst) && (!SURFACE_REPEAT (src))) {
>      glitz_set_operator (gl, GLITZ_OPERATOR_SRC);
>      
> +	
> +	
> +	
> +	
> +	
> +
> +  
> + 
> +	
> +	
> +	
> +	
> +	
> +	
> +	
> +	
> +	
> +	
> +	
>      gl->color_4us (0x0000, 0x0000, 0x0000, 0x0000);
>      
> +	
> +	
> +	
> +	 // appels open gl projection 
> +  if (dst->projection!=NULL) dst->projection(dst);
> +  
> +    
>      gl->begin (GLITZ_GL_QUADS);
>  
> -    gl->vertex_2d (tl.x, tl.y);
> +    /*gl->vertex_2d (tl.x, tl.y);
>      gl->vertex_2d (0.0, tl.y);
>      gl->vertex_2d (0.0, 0.0);
>      gl->vertex_2d (tl.x, 0.0);   
> @@ -817,7 +926,48 @@
>      gl->vertex_2d (bl.x, bl.y);
>      gl->vertex_2d (0.0, bl.y);
>      gl->vertex_2d (0.0, tl.y);
> -    gl->vertex_2d (tl.x, tl.y);
> +    gl->vertex_2d (tl.x, tl.y);*/
> +	
> +	glVertex3f (tl.x, tl.y, 0);
> +    glVertex3f (0.0, tl.y, 0);
> +    glVertex3f (0.0, 0.0, 0);
> +    glVertex3f (tl.x, 0.0, 0);   
> +
> +	glVertex3f (tl.x, tl.y, 0);
> +    glVertex3f (tl.x, 0.0, 0);
> +    glVertex3f (tr.x, 0.0, 0);
> +    glVertex3f (tr.x, tr.y, 0);
> +    
> +    glVertex3f (tr.x, tr.y, 0);
> +    glVertex3f (tr.x, 0.0, 0);
> +    glVertex3f (dst->width, 0.0, 0);
> +    glVertex3f (dst->width, tr.y, 0);
> +
> +    glVertex3f (tr.x, tr.y, 0);
> +    glVertex3f (dst->width, tr.y, 0);
> +    glVertex3f (dst->width, br.y, 0);
> +    glVertex3f (br.x, br.y, 0);
> +    
> +    glVertex3f (br.x, br.y, 0);
> +    glVertex3f (dst->width, br.y, 0);
> +    glVertex3f (dst->width, dst->height, 0);
> +    glVertex3f (br.x, dst->height, 0);
> +
> +    glVertex3f (br.x, br.y, 0);
> +    glVertex3f (br.x, dst->height, 0);
> +    glVertex3f (bl.x, dst->height, 0);
> +    glVertex3f (bl.x, bl.y, 0);
> +
> +    glVertex3f (bl.x, bl.y, 0);
> +    glVertex3f (bl.x, dst->height, 0);
> +    glVertex3f (0.0, dst->height, 0);
> +    glVertex3f (0.0, bl.y, 0);
> +
> +    glVertex3f (bl.x, bl.y, 0);
> +    glVertex3f (0.0, bl.y, 0);
> +    glVertex3f (0.0, tl.y, 0);
> +    glVertex3f (tl.x, tl.y, 0);
> +	
>  
>      gl->end ();
>    }
> @@ -939,14 +1089,25 @@
>          br.y = texture->texcoord_height - br.y;
>  
>          gl->begin (GLITZ_GL_QUADS);
> +		
> +		
> +		 // appels open gl projection 
> +  if (dst->projection!=NULL) dst->projection(dst);
> +  
> +		
> +		
>          gl->tex_coord_2d (tl.x, tl.y);
> -        gl->vertex_2d (x_dst, y_dst);
> +        //gl->vertex_2d (x_dst, y_dst);
> +		glVertex3f (x_dst, y_dst, 0);
>          gl->tex_coord_2d (br.x, tl.y);
> -        gl->vertex_2d (x_dst + width, y_dst);
> +        //gl->vertex_2d (x_dst + width, y_dst);
> +		glVertex3f(x_dst + width, y_dst, 0);
>          gl->tex_coord_2d (br.x, br.y);
> -        gl->vertex_2d (x_dst + width, y_dst + height);
> +        //gl->vertex_2d (x_dst + width, y_dst + height);
> +		glVertex3f(x_dst + width, y_dst + height, 0);
>          gl->tex_coord_2d (tl.x, br.y);
> -        gl->vertex_2d (x_dst, y_dst + height);
> +        //gl->vertex_2d (x_dst, y_dst + height);
> +		glVertex3f(x_dst, y_dst + height, 0);
>          gl->end ();
>  
>          glitz_texture_unbind (gl, texture);
> diff -rbBu glitz/src/glitz_glx_context.c glitz_modif/src/glitz_glx_context.c
> --- glitz/src/glitz_glx_context.c	2004-05-28 03:04:29.000000000 +0200
> +++ glitz_modif/src/glitz_glx_context.c	2004-07-05 16:41:45.000000000 +0200
> @@ -32,6 +32,7 @@
>  #include "glitz_glxint.h"
>  
>  #include <stdlib.h>
> +#include <stdio.h>
>  
>  static void
>  _glitz_glx_context_create_glx12 (glitz_glx_screen_info_t *screen_info,
> @@ -39,10 +40,31 @@
>                                   GLXContext share_list,
>                                   glitz_glx_context_t *context)
>  {
> +	printf("_glitz_glx_context_create_glx12\n");
>    int vis_info_count, i;
>    XVisualInfo *vis_infos;
>  
> -  vis_infos = XGetVisualInfo (screen_info->display_info->display,
> + //modif 
> + int screen = DefaultScreen (screen_info->display_info->display);
> +	int depth = XDefaultDepthOfScreen (XDefaultScreenOfDisplay(screen_info->display_info->display));
> +	int attrib [] = {
> +		/*GLX_LEVEL*/3,
> +		0,
> +		/*GLX_RGBA*/4,
> +		/*GLX_DOUBLEBUFFER*/5,
> +		/*GLX_DEPTH_SIZE*/12,
> +		depth,
> +		0
> +	};
> +	XVisualInfo *infoPtr = glXChooseVisual (screen_info->display_info->display, screen, attrib);
> +
> +	XVisualInfo info ;
> +	memmove (&info, infoPtr, sizeof(XVisualInfo));
> +	XFree (infoPtr);
> +	context->context = glXCreateContext (screen_info->display_info->display, &info, 0, 0);
> +//modif
> +
> +/*  vis_infos = XGetVisualInfo (screen_info->display_info->display,
>                                0, NULL, &vis_info_count);
>    for (i = 0; i < vis_info_count; i++) {
>      if (vis_infos[i].visual->visualid == visualid)
> @@ -50,11 +72,14 @@
>    }
>  
>    context->context = glXCreateContext (screen_info->display_info->display,
> -                                       &vis_infos[i], share_list, 1);
> +                                       &vis_infos[i], share_list, 1);*/
> +									   
> +									   
>    context->id = visualid;  
>    context->fbconfig = (XID) 0;
>  
> -  XFree (vis_infos);
> +  //XFree (vis_infos);
> + 
>  }
>  
>  static void
> @@ -63,6 +88,7 @@
>                                   GLXContext share_list,
>                                   glitz_glx_context_t *context)
>  {
> +	printf("_glitz_glx_context_create_glx13\n");
>    GLXFBConfig *fbconfigs;
>    int i, n_fbconfigs;
>    XVisualInfo *vinfo = NULL;
> @@ -166,12 +192,12 @@
>    context = malloc (sizeof (glitz_glx_context_t));
>    screen_info->contexts[index] = context;
>  
> -  if (screen_info->glx_feature_mask & GLITZ_GLX_FEATURE_GLX13_MASK)
> +/*  if (screen_info->glx_feature_mask & GLITZ_GLX_FEATURE_GLX13_MASK)
>      _glitz_glx_context_create_glx13 (screen_info,
>                                       screen_info->format_ids[format->id],
>                                       screen_info->root_context.context,
>                                       context);
> -  else
> +  else*/
>      _glitz_glx_context_create_glx12 (screen_info,
>                                       screen_info->format_ids[format->id],
>                                       screen_info->root_context.context,
> diff -rbBu glitz/src/glitz_glx_info.c glitz_modif/src/glitz_glx_info.c
> --- glitz/src/glitz_glx_info.c	2004-05-28 03:04:29.000000000 +0200
> +++ glitz_modif/src/glitz_glx_info.c	2004-07-06 12:16:56.000000000 +0200
> @@ -33,6 +33,11 @@
>  
>  #include <string.h>
>  #include <dlfcn.h>
> +#include <stdio.h>
> +
> +
> +
> +
>  
>  glitz_gl_proc_address_list_t _glitz_gl_proc_address = {
>    (glitz_gl_enable_t) glEnable,
> @@ -102,6 +107,8 @@
>  glitz_function_pointer_t
>  glitz_glx_get_proc_address (glitz_glx_thread_info_t *info, const char *name)
>  {
> +	char *error;
> +	printf("glitz_glx_get_proc_address\n");
>    glitz_function_pointer_t address = NULL;
>    
>    if (info->glx.get_proc_address_arb)
> @@ -112,13 +119,24 @@
>        info->dlhand = dlopen (info->gl_library, RTLD_LAZY);
>  
>      if (info->dlhand) {
> +		
> +		
>        dlerror ();
>        address = (glitz_function_pointer_t) dlsym (info->dlhand, name);
> -      if (dlerror () != NULL)
> +	  
> +	  
> +	  if ((error = dlerror()) != NULL)  {
> +        fprintf (stderr, "%s\n", error);
> +         address = NULL;
> +    }
> +	  
> +     /* if (dlerror () != NULL){
>          address = NULL;
> +	  }*/
>      }
>    }
>    
> +  printf("address=%x\n", address);
>    return address;
>  }
>  
> Seulement dans glitz_modif/src: .libs
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> cairo mailing list
> cairo at cairographics.org
> http://cairographics.org/cgi-bin/mailman/listinfo/cairo

-- 
Charles Tuckey, MSc.
Software Developer
Verano, Inc.
403.299.4765

  © Copyright 2004 Verano Inc. owns copyright content of this document 
and all attachments unless otherwise indicated. All rights reserved. 
Users of Verano Inc. software and tools associated with the software 
such as sales & marketing collateral, presentations, user manuals, 
training documentation etc. may not republish nor reproduce in whole or 
in part the information, in any form or by any means, in any manner 
whatsoever without the prior written permission of Verano Inc., and any 
such unauthorized use constitutes copyright infringement. An 
acknowledgement of the source must be included whenever Verano Inc. 
material is copied or published. If you require further information on a 
permitted use or license to reproduce or republish any material, address 
your inquiry to Verano Inc.Suite 120, 575 West Street, Mansfield, 
Massachusetts, 02048-1164. Any infringement of Verano Inc. rights  will 
result in appropriate legal action. Verano Inc. disclaims any and all 
liability for any consequences which may result from any unauthorized 
reproduction or use of this Work whatsoever.





More information about the cairo mailing list