/* * gtkDPS single context test program by Terumoto HAYAKAWA * */ #include #include #include #include #include #include "gtkDPS.h" gboolean enable_cache = TRUE; /* * This is callback function. * The data arguments are ignored in this example.. * More on callbacks below. */ static void dialog_close_callback (GtkWidget *widget, gpointer data) { gtk_main_quit(); } /* * This callback function is to draw a square. */ static void draw_square (GtkWidget *widget, gpointer data) { float i; /* * This is called in all case of using dps area. * DPS function is called between gtk_dps_area_begin() and * gtk_dps_area_end() function. */ gtk_dps_widget_begin(widget); { for (i = 1.0; i > 0.0; i = i - 0.01) { DPSnewpath(raw_ctxt); DPSsetrgbcolor(raw_ctxt, i, 0.0, 0.0); DPSmoveto(raw_ctxt, 100.0, 100.0); DPSlineto(raw_ctxt, i*100.0 + 100.0, 100.0); DPSlineto(raw_ctxt, i*100.0 + 100.0, i*100.0 + 100.0); DPSlineto(raw_ctxt, 100.0, i*100.0 + 100.0); DPSclosepath(raw_ctxt); DPSfill(raw_ctxt); } } gtk_dps_widget_end(); /* * This is called in all case of using dps area. */ if (TRUE == enable_cache) gtk_dps_area_map_area_on_screen(GTK_DPS_AREA (widget), NULL); } /* * This callback function is to draw a circle. */ static void draw_circle (GtkWidget *widget, gpointer data) { float i; gtk_dps_widget_begin(widget); { for (i = 1.0; i > 0.0; i = i - 0.01) { DPSnewpath(raw_ctxt); DPSarc(raw_ctxt, 200.0, 200.0, i * 50.0, 0.0, 360.0); DPSsetrgbcolor(raw_ctxt, 1.0, i, 1.0); DPSfill(raw_ctxt); } } gtk_dps_widget_end(); /* gtk_dps_area_flush(GTK_DPS_AREA (widget)); */ if (TRUE == enable_cache) gtk_dps_area_map_area_on_screen(GTK_DPS_AREA (widget), NULL); } /* * This callback function is to draw a line. */ static void draw_line (GtkWidget *widget, gpointer data) { gtk_dps_widget_begin(widget); { DPSnewpath(raw_ctxt); DPSmoveto(raw_ctxt, 0.0, 0.0); DPSsetrgbcolor(raw_ctxt, 0.0, 0.0, 1.0); DPSlineto(raw_ctxt, 300.0, 300.0); DPSstroke(raw_ctxt); } gtk_dps_widget_end(); /* gtk_dps_area_flush(GTK_DPS_AREA (widget)); */ if (TRUE == enable_cache) gtk_dps_area_map_area_on_screen(GTK_DPS_AREA (widget), NULL); } /* * main function */ int main(int argc, char **argv) { /* GtkWidget is the storage type for widgets */ GtkWidget *dialog; GtkWidget *close_button; GtkWidget *DPS_area; GtkWidget *square_button; GtkWidget *line_button; GtkWidget *circle_button; GtkWidget *window; gint i; gboolean with_shared_context = FALSE; /* * This is called in all GTK applications. Arguments are parsed from * the command line and are returned to the application. */ gtk_init(&argc, &argv); gtk_dps_init(&argc, &argv); for (i = 1; i < argc; i++) { if (0 == strcmp(argv[i], "--disable-cache")) enable_cache = FALSE; else if (0 == strcmp(argv[i], "--help")) { const gchar * version = gtk_dps_version(); fprintf(stderr, "sample [--disable-cache] [--help] [--with-shared-context]\n" "This is sample program of gtkDPS version %s.\n", version); } else if (0 == strcmp(argv[i], "--with-shared-context")) with_shared_context = TRUE; } if (with_shared_context) (void)gdk_dps_context_get_shared(); /* create a new window */ window = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* create a new dps area */ if (enable_cache) DPS_area = gtk_dps_area_new(1); else DPS_area = gtk_dps_area_new(0); /* This packs the button into the window (a gtk container). */ gtk_container_add(GTK_CONTAINER(window), DPS_area); /* set the DPS_area size */ gtk_dps_area_size(GTK_DPS_AREA(DPS_area), 500, 500); /* display DPS_area */ gtk_widget_show(DPS_area); /* display this window */ gtk_widget_show(window); /* create a new dialog */ dialog = gtk_dialog_new(); /* create a new button with the label "Close". */ close_button = gtk_button_new_with_label("Close"); /* * Instead of gtk_container_add, we pack this close_button into the * invisible box, which has been packed into the dialog. */ gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), close_button, TRUE, TRUE, 0); /* * When the button receives the "clicked" signal, it will call the * function dialog_close_callback() passing it NULL as it's argument. * The dialog_close_callback() function is defined above. */ gtk_signal_connect(GTK_OBJECT(close_button), "clicked", (GtkSignalFunc)dialog_close_callback, NULL); /* display close_button */ gtk_widget_show(close_button); square_button = gtk_button_new_with_label("square"); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), square_button, TRUE, TRUE, 0); gtk_signal_connect_object(GTK_OBJECT(square_button), "clicked", (GtkSignalFunc)draw_square, GTK_OBJECT(DPS_area)); gtk_widget_show(square_button); line_button = gtk_button_new_with_label("line"); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), line_button, TRUE, TRUE, 0); gtk_signal_connect_object(GTK_OBJECT(line_button), "clicked", (GtkSignalFunc)draw_line, GTK_OBJECT(DPS_area)); gtk_widget_show(line_button); circle_button = gtk_button_new_with_label("circle"); gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->action_area), circle_button, TRUE, TRUE, 0); gtk_signal_connect_object(GTK_OBJECT(circle_button), "clicked", (GtkSignalFunc)draw_circle, GTK_OBJECT(DPS_area)); gtk_widget_show(circle_button); /* display the dialog */ gtk_widget_show(dialog); /* * All GTK applications must have a gtk_main(). Control ends here * and waits for an event to occur (like a key press or mouse event). */ gtk_main(); return 0; }