head 1.7; access; symbols; locks; strict; comment @ * @; 1.7 date 2005.07.09.23.40.55; author keithp; state Exp; branches; next 1.6; commitid 13c342d060824567; 1.6 date 2005.07.07.08.09.21; author keithp; state Exp; branches; next 1.5; commitid 1de242cce3254567; 1.5 date 2005.05.18.06.21.15; author keithp; state Exp; branches; next 1.4; commitid 431d428aded64567; 1.4 date 2005.05.02.20.24.38; author keithp; state Exp; branches; next 1.3; commitid 416842768c824567; 1.3 date 2005.02.11.21.15.46; author keithp; state Exp; branches; next 1.2; 1.2 date 2004.12.24.09.00.10; author keithp; state Exp; branches; next 1.1; 1.1 date 2004.12.23.22.39.40; author keithp; state Exp; branches; next ; desc @@ 1.7 log @2005-07-09 Keith Packard * cairo-5c.h: * cairo.c: (cairo_5c_get): * examples/animate.5c: * gtk.c: (configure_event), (expose_event), (delete_drawing_area), (gtk_repaint), (gtk_tool_free), (cairo_5c_tool_create), (cairo_5c_tool_destroy): * surface.c: (create_cairo_window): Pass GtkPixmap objects around as they are reference counted. Use proposed new cairo_xlib_surface_set_drawable API to deal with window back-buffer resize issue. @ text @/* $Id: cairo.c,v 1.6 2005/07/07 08:09:21 keithp Exp $ * * Copyright © 2004 Keith Packard * * This library is free software; you can redistribute it and/or * modify it either under the terms of the GNU Lesser General Public * License version 2.1 as published by the Free Software Foundation * (the "LGPL") or, at your option, under the terms of the Mozilla * Public License Version 1.1 (the "MPL"). If you do not alter this * notice, a recipient may use your version of this file under either * the MPL or the LGPL. * * You should have received a copy of the LGPL along with this library * in the file COPYING-LGPL-2.1; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * You should have received a copy of the MPL along with this library * in the file COPYING-MPL-1.1 * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY * OF ANY KIND, either express or implied. See the LGPL or the MPL for * the specific language governing rights and limitations. * * The Original Code is the cairo graphics library. * * The Initial Developer of the Original Code is Keith Packard * * Contributor(s): * Keith Packard */ #include "cairo-5c.h" static char CairoId[] = "Cairo"; cairo_5c_t * cairo_5c_get (Value av) { cairo_5c_t *c5c; cairo_5c_surface_t *c5s; if (av->foreign.id != CairoId) { RaiseStandardException (exception_invalid_argument, "not a cairo_t", 2, NewInt(0), av); return 0; } c5c = av->foreign.data; if (!c5c) { RaiseStandardException (exception_invalid_argument, "cairo destroyed", 2, NewInt(0), av); return 0; } if (c5c->surface != Void) { c5s = cairo_5c_surface_get (c5c->surface); if (!c5s) return 0; } return c5c; } /* * nickle memory manager functions for the CairoType datatype */ static void cairo_5c_mark (void *v) { cairo_5c_t *c5c = v; MemReference (c5c->surface); } static int cairo_5c_free (void *v) { cairo_5c_t *c5c = v; if (c5c->cr) { cairo_destroy (c5c->cr); c5c->cr = NULL; } c5c->surface = Void; return 1; } static DataType Cairo5cType = { cairo_5c_mark, cairo_5c_free, "Cairo5c" }; /* * Foreign datatype functions for the "Cairo" foreign datatype */ static void cairo_foreign_mark (void *object) { MemReference (object); } static void cairo_foreign_free (void *object) { /* let nickle finalizer deal with this */ ; } Value do_Cairo_create (Value sv) { ENTER (); cairo_5c_surface_t *c5s; Value ret; cairo_5c_t *c5c; cairo_t *cr; c5s = cairo_5c_surface_get (sv); if (aborting) RETURN (Void); cr = cairo_create (c5s->surface); if (!cr) { RaiseStandardException (exception_invalid_argument, "can't create cairo object", 1, Void); RETURN (Void); } c5c = ALLOCATE (&Cairo5cType, sizeof (cairo_5c_t)); c5c->cr = cr; c5c->surface = sv; ret = NewForeign (CairoId, c5c, cairo_foreign_mark, cairo_foreign_free); RETURN (ret); } void cairo_5c_dirty (cairo_5c_t *c5c) { if (c5c->surface != Void) { cairo_5c_surface_t *c5s = cairo_5c_surface_get (c5c->surface); if (c5s) { switch (c5s->kind) { case CAIRO_5C_WINDOW: cairo_5c_tool_dirty (c5s); break; case CAIRO_5C_IMAGE: case CAIRO_5C_PDF: case CAIRO_5C_SCRATCH: break; } } } } static Bool cairo_5c_enable (cairo_5c_t *c5c) { if (c5c->surface != Void) { cairo_5c_surface_t *c5s = cairo_5c_surface_get (c5c->surface); if (c5s) { switch (c5s->kind) { case CAIRO_5C_WINDOW: cairo_5c_tool_enable (c5s); break; case CAIRO_5C_IMAGE: case CAIRO_5C_PDF: case CAIRO_5C_SCRATCH: break; } } } return True; } static Bool cairo_5c_disable (cairo_5c_t *c5c) { if (c5c->surface != Void) { cairo_5c_surface_t *c5s = cairo_5c_surface_get (c5c->surface); if (c5s) { switch (c5s->kind) { case CAIRO_5C_WINDOW: cairo_5c_tool_disable (c5s); break; case CAIRO_5C_IMAGE: case CAIRO_5C_PDF: case CAIRO_5C_SCRATCH: break; } } } return True; } Value do_Cairo_get_target (Value cv) { ENTER (); cairo_5c_t *c5c = cairo_5c_get (cv); if (aborting) RETURN (Void); RETURN (c5c->surface); } Value do_Cairo_destroy (Value cv) { ENTER (); cairo_5c_t *c5c = cairo_5c_get (cv); if (aborting) RETURN (Void); cv->foreign.data = 0; cairo_5c_free (c5c); RETURN (Void); } Value do_Cairo_status (Value cv) { ENTER (); cairo_5c_t *c5c = cairo_5c_get (cv); if (aborting) return Void; RETURN(IntToEnum (typeCairoStatus, cairo_status (c5c->cr))); } Value do_Cairo_status_to_string (Value sv) { ENTER (); cairo_status_t status = EnumIntPart (sv, "invalid status_t"); if (aborting) return Void; RETURN(NewStrString (cairo_status_to_string (status))); } Value do_Cairo_enable (Value cv) { cairo_5c_t *c5c = cairo_5c_get (cv); if (aborting) return Void; if (!cairo_5c_enable (c5c)) { RaiseStandardException (exception_invalid_argument, "already enabled", 2, NewInt(0), cv); } return Void; } Value do_Cairo_disable (Value cv) { cairo_5c_t *c5c = cairo_5c_get (cv); if (aborting) return Void; if (!cairo_5c_disable (c5c)) { RaiseStandardException (exception_invalid_argument, "can't disable", 2, NewInt(0), cv); } return Void; } @ 1.6 log @2005-07-07 Keith Packard * cairo-5c.h: * cairo.c: (do_Cairo_status_to_string): * examples/fob.5c: * gtk.c: (create_gtk_global): * init.c: (nickle_init): * pattern.c: (do_Cairo_Pattern_add_color_stop_rgba), (do_Cairo_Pattern_add_color_stop_rgb), (do_Cairo_Pattern_set_matrix), (do_Cairo_Pattern_set_extend), (do_Cairo_Pattern_set_filter): Match current cairo API. Use XInitThreads, as it's necessary for stable operation. Requires at least one bug fix not yet in Xlib CVS to work @ text @d1 1 a1 1 /* $Id: cairo.c,v 1.5 2005/05/18 06:21:15 keithp Exp $ a65 4 #if 0 if (c5s->surface != cairo_current_target_surface (c5c->cr)) cairo_set_target_surface (c5c->cr, c5s->surface); #endif @ 1.5 log @2005-05-17 Keith Packard * cairo-5c.h: * cairo.5c: * cairo.c: (cairo_5c_get), (do_Cairo_create), (cairo_5c_dirty), (cairo_5c_enable), (cairo_5c_disable), (do_Cairo_get_target): * draw.c: (do_Cairo_paint), (do_Cairo_paint_with_alpha), (do_Cairo_mask), (do_Cairo_mask_surface), (do_Cairo_fill_preserve), (do_Cairo_stroke_preserve), (path_elt_new), (path_array), (do_Cairo_copy_path), (do_Cairo_copy_path_flat), (do_Cairo_append_path): * event.c: (do_Cairo_Surface_open_event): * examples/animate.5c: * examples/draw.5c: * examples/fob.5c: * examples/metrics.5c: * examples/sin.5c: * examples/spin.5c: * examples/spinman.5c: * examples/test.5c: * gstate.c: (do_Cairo_set_source_surface), (do_Cairo_identity_matrix), (do_Cairo_transform), (do_Cairo_user_to_device), (do_Cairo_user_to_device_distance), (do_Cairo_device_to_user), (do_Cairo_device_to_user_distance), (do_Cairo_reset_clip), (do_Cairo_clip_preserve): * gtk.c: (create_gtk_global): * init.c: (init_types), (nickle_init): * pattern.c: (do_Cairo_Pattern_create_for_surface), (do_Cairo_Pattern_add_color_stop_rgba), (do_Cairo_Pattern_add_color_stop_rgb): * surface.c: (cairo_5c_surface_get), (cairo_5c_surface_mark), (cairo_5c_surface_destroy), (do_Cairo_Surface_write_to_png), (do_Cairo_Surface_write_to_png_file), (do_Cairo_Surface_set_device_offset), (do_Cairo_Surface_create_similar), (do_Cairo_Surface_finish), (do_Cairo_Surface_destroy), (do_Cairo_Surface_width), (do_Cairo_Surface_height), (do_Cairo_Image_surface_create), (do_Cairo_Image_surface_create_from_png), (do_Cairo_Image_surface_create_from_png_file), (do_Cairo_Pdf_surface_create): * text.c: (do_Cairo_select_font_face), (do_Cairo_get_font_matrix): Another round of API changes for cairo 0.5, the putative final API structure. @ text @d1 1 a1 1 /* $Id: cairo.c,v 1.4 2005/05/02 20:24:38 keithp Exp $ d257 1 a257 1 do_Cairo_status_string (Value cv) d260 1 a260 1 cairo_5c_t *c5c = cairo_5c_get (cv); d264 1 a264 1 RETURN(NewStrString (cairo_status_string (c5c->cr))); @ 1.4 log @2005-05-02 Keith Packard * cairo-5c.h: * cairo.5c: * cairo.c: (cairo_5c_dirty), (cairo_5c_enable), (cairo_5c_disable), (do_Cairo_get_target_surface): * event.c: (do_Cairo_Surface_open_event): * gstate.c: (do_Cairo_set_source_rgb), (do_Cairo_set_source_rgba), (do_Cairo_get_matrix), (do_Cairo_concat_matrix), (do_Cairo_set_matrix), (do_Cairo_get_operator), (do_Cairo_get_tolerance), (do_Cairo_get_current_point), (do_Cairo_get_fill_rule), (do_Cairo_get_line_width), (do_Cairo_get_line_cap), (do_Cairo_get_line_join), (do_Cairo_get_miter_limit): * gtk.c: (delete_drawing_area), (motion_notify_event), (button_press_event), (button_release_event), (gtk_repaint_timeout), (gtk_thread_main), (gtk_global_free), (create_gtk_global), (cairo_5c_tool_dirty), (cairo_5c_tool_enable): * init.c: (init_types), (nickle_init): * matrix.c: (cairo_matrix_part), (new_cairo_matrix): * pattern.c: (do_Cairo_set_source), (do_Cairo_get_source), (do_Cairo_Pattern_set_matrix), (do_Cairo_Pattern_get_matrix): * surface.c: (cairo_5c_surface_get), (cairo_5c_surface_mark), (cairo_5c_surface_destroy), (do_Cairo_Surface_create_image), (do_Cairo_Surface_write_to_png): * text.c: (do_Cairo_set_font), (do_Cairo_set_font_size), (do_Cairo_set_font_matrix), (do_Cairo_font_extents): Match cairo API as of today. * examples/draw.5c: * examples/fob.5c: * examples/graph.5c: * examples/grid.5c: * examples/led.5c: * examples/pie-new.5c: * examples/pie.5c: * examples/rottext.5c: * examples/sin.5c: * examples/spin-cairo.5c: * examples/spin.5c: * examples/spinman.5c: * examples/test.5c: * examples/text45.5c: Update examples to match API changes @ text @d1 1 a1 1 /* $Id: cairo.c,v 1.3 2005/02/11 21:15:46 keithp Exp $ d66 1 d69 1 d124 1 a124 1 do_Cairo_create (void) d127 4 a130 3 Value ret; cairo_5c_t *c5c; cairo_t *cr; d132 4 a135 1 cr = cairo_create (); d145 1 a145 1 c5c->surface = Void; d165 1 a165 1 case CAIRO_5C_PS: d187 1 a187 1 case CAIRO_5C_PS: d210 1 a210 1 case CAIRO_5C_PS: d220 1 a220 15 do_Cairo_set_target_surface (Value cv, Value sv) { ENTER (); cairo_5c_t *c5c = cairo_5c_get (cv); cairo_5c_surface_t *c5s = cairo_5c_surface_get (sv); if (aborting) RETURN (Void); cairo_set_target_surface (c5c->cr, c5s->surface); c5c->surface = sv; RETURN (Void); } Value do_Cairo_get_target_surface (Value cv) a226 7 if (c5c->surface == Void) { RaiseStandardException (exception_invalid_argument, "No current surface", 2, NewInt (0), cv); RETURN (Void); } a245 15 do_Cairo_copy (Value dstv, Value srcv) { ENTER (); cairo_5c_t *dst = cairo_5c_get (dstv); cairo_5c_t *src = cairo_5c_get (srcv); if (aborting) RETURN (Void); cairo_copy (dst->cr, src->cr); RETURN (Void); } Value @ 1.3 log @2005-01-02 Keith Packard * cairo-5c.h: Add do_Cairo_copy_page and do_Cairo_show_page. Track whether copy_page/show_page have ever been called so that they can be when the surface is destroyed. * cairo.c: (cairo_5c_free), (cairo_5c_dirty): * draw.c: (do_Cairo_arc), (do_Cairo_arc_negative), (do_Cairo_copy_page), (do_Cairo_show_page): Fix arc arguments * event.c: (do_Cairo_Surface_open_event): * gtk.c: (cairo_5c_tool_destroy): * init.c: (nickle_init): * surface.c: (cairo_5c_surface_mark), (cairo_5c_surface_destroy), (cairo_5c_surface_free), (do_Cairo_Surface_create_window), (do_Cairo_Surface_create_png), (do_Cairo_Surface_create_ps), (do_Cairo_Surface_create_similar), (do_Cairo_Surface_destroy): dunno @ text @d1 1 a1 1 /* $Id: cairo.c,v 1.2 2004/12/24 09:00:10 keithp Exp $ d158 1 a158 1 case CAIRO_5C_PNG: d180 1 a180 1 case CAIRO_5C_PNG: d203 1 a203 1 case CAIRO_5C_PNG: d228 1 a228 1 do_Cairo_current_target_surface (Value cv) @ 1.2 log @2004-12-24 Keith Packard * cairo-5c.h: * cairo.5c: * cairo.c: (do_Cairo_set_target_surface): * gtk.c: (delete_drawing_area), (gtk_tool_free), (cairo_5c_tool_create), (cairo_5c_tool_destroy): * init.c: (nickle_init): * surface.c: (create_cairo_window), (cairo_5c_surface_get), (do_Cairo_Surface_create_window): Handle window delete more gracefully; report exception on drawing, report 'delete' event to event reader. Have default surface creation code re-create a surface when the old default surface has been destroyed. @ text @d1 1 a1 1 /* $Id: cairo.c,v 1.1 2004/12/23 22:39:40 keithp Exp $ d89 1 a89 1 if (c5c) d92 1 a92 1 c5c->surface = Void; d94 1 d151 1 a151 1 @ 1.1 log @2004-12-23 Keith Packard * Makefile.am: * cairo-5c.h: * cairo.5c: * cairo.c: (cairo_5c_get), (cairo_5c_mark), (cairo_5c_free), (cairo_foreign_mark), (cairo_foreign_free), (do_Cairo_create), (cairo_5c_dirty), (cairo_5c_enable), (cairo_5c_disable), (do_Cairo_set_target_surface), (do_Cairo_current_target_surface), (do_Cairo_destroy), (do_Cairo_copy), (do_Cairo_status), (do_Cairo_status_string), (do_Cairo_enable), (do_Cairo_disable): * draw.c: (do_Cairo_new_path), (do_Cairo_move_to), (do_Cairo_line_to), (do_Cairo_curve_to), (do_Cairo_arc), (do_Cairo_arc_negative), (do_Cairo_rel_move_to), (do_Cairo_rel_line_to), (do_Cairo_rel_curve_to), (do_Cairo_rectangle), (do_Cairo_close_path), (do_Cairo_fill), (do_Cairo_stroke), (do_Cairo_in_stroke), (do_Cairo_in_fill), (do_Cairo_stroke_extents), (do_Cairo_fill_extents), (do_Cairo_current_path_list), (do_Cairo_current_path_flat_list): * event.c: (do_Cairo_Surface_open_event): * examples/draw.5c: * examples/graph.5c: * examples/grid.5c: * examples/rottext.5c: * gstate.c: (do_Cairo_save), (do_Cairo_restore), (do_Cairo_set_operator), (do_Cairo_set_rgb_color), (do_Cairo_set_alpha), (do_Cairo_set_tolerance), (do_Cairo_set_fill_rule), (do_Cairo_set_line_width), (do_Cairo_set_line_cap), (do_Cairo_set_line_join), (do_Cairo_set_dash), (do_Cairo_set_miter_limit), (do_Cairo_identity_matrix), (do_Cairo_default_matrix), (do_Cairo_translate), (do_Cairo_scale), (do_Cairo_rotate), (do_Cairo_current_matrix), (do_Cairo_concat_matrix), (do_Cairo_set_matrix), (do_Cairo_transform_point), (do_Cairo_transform_distance), (do_Cairo_inverse_transform_point), (do_Cairo_inverse_transform_distance), (do_Cairo_init_clip), (do_Cairo_clip), (do_Cairo_current_operator), (do_Cairo_current_rgb_color), (do_Cairo_current_alpha), (do_Cairo_current_tolerance), (do_Cairo_current_point), (do_Cairo_current_fill_rule), (do_Cairo_current_line_width), (do_Cairo_current_line_cap), (do_Cairo_current_line_join), (do_Cairo_current_miter_limit): * gtk.c: (configure_event), (expose_event), (delete_drawing_area), (delete_event), (motion_notify_event), (button_press_event), (button_release_event), (gtk_repaint), (gtk_repaint_timeout), (gtk_global_mark), (gtk_global_free), (create_gtk_global), (gtk_tool_mark), (gtk_tool_free), (cairo_5c_tool_create), (cairo_5c_tool_destroy), (cairo_5c_tool_mark), (cairo_5c_tool_dirty), (cairo_5c_tool_disable), (cairo_5c_tool_enable), (cairo_5c_tool_display): * init.c: (init_types), (nickle_init): * pattern.c: (mark_cairo_pattern), (make_pattern_value), (do_Cairo_set_pattern), (do_Cairo_current_pattern), (do_Cairo_Pattern_create_for_surface): * surface.c: (create_cairo_window), (cairo_5c_surface_get), (cairo_5c_surface_mark), (cairo_5c_surface_free), (cairo_surface_foreign_mark), (cairo_surface_foreign_free), (do_Cairo_Surface_create_window), (do_Cairo_Surface_create_png), (do_Cairo_Surface_create_ps), (do_Cairo_Surface_create_similar), (do_Cairo_Surface_destroy), (do_Cairo_Surface_width), (do_Cairo_Surface_height): * text.c: (do_Cairo_select_font), (do_Cairo_set_font), (do_Cairo_scale_font), (do_Cairo_transform_font), (do_Cairo_current_font_extents), (do_Cairo_show_text), (do_Cairo_text_path), (do_Cairo_text_extents): Split cairo_t and cairo_surface_t functions apart, permitting more complex programs to be written that use more than a single window. Switch allocations around to mostly use the nickle memory allocator now. Requires updated nickle bits that expose this change in the foreign object API. @ text @d1 1 a1 1 /* $Id: $ d219 4 a222 5 if (!aborting) { cairo_set_target_surface (c5c->cr, c5s->surface); c5c->surface = sv; } @