cairoDevice/0000755000175100001440000000000012633311730012504 5ustar hornikuserscairoDevice/configure.in0000644000175100001440000000110112560123113015001 0ustar hornikusersAC_INIT(src/cairoDevice.c) AC_CHECK_PROGS(PKG_CONFIG, pkg-config) if test -n "${PKG_CONFIG}"; then if (${PKG_CONFIG} --exists gtk+-2.0); then GTK_CPPFLAGS=`${PKG_CONFIG} --cflags gtk+-2.0` GTK_LIBS=`${PKG_CONFIG} --libs gtk+-2.0` else echo "ERROR: gtk+2.0 not found by pkg-config." exit 1 fi else echo "ERROR: Cannot find pkg-config." exit 1 fi ## Allow user to set extra preprocessor flags (e.g. -Wall) GTK_CPPFLAGS=${PKG_CPPFLAGS}" "${GTK_CPPFLAGS} AC_SUBST(GTK_CPPFLAGS) AC_SUBST(GTK_LIBS) AC_OUTPUT(src/Makevars) cairoDevice/src/0000755000175100001440000000000012633267004013277 5ustar hornikuserscairoDevice/src/gtk.c0000644000175100001440000000441112633267004014230 0ustar hornikusers#include #include #ifdef G_OS_WIN32 #include #else #include "R_ext/eventloop.h" #include #endif void R_gtk_eventHandler(void *userData) { while (gtk_events_pending()) gtk_main_iteration(); } #ifdef G_OS_WIN32 /* On Windows, run the GTK+ event loop in a separate thread, synchronizing through the Windows event loop on the main thread. This currently doesn't handle timed tasks. More to come later on an overhaul of the R event loop. */ /* should exist win2k/xp and later, but mingw does not have it */ #define HWND_MESSAGE ((HWND)-3) #define CD_TIMER_ID 0 #define CD_TIMER_DELAY 50 static HWND win; VOID CALLBACK R_gtk_timer_proc(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { R_gtk_eventHandler(NULL); } #else static InputHandler *eventLoopInputHandler = NULL; #endif void R_gtk_setEventHandler() { #ifndef WIN32 if(!eventLoopInputHandler) { if (!GDK_DISPLAY()) error("GDK display not found - please make sure X11 is running"); eventLoopInputHandler = addInputHandler(R_InputHandlers, ConnectionNumber(GDK_DISPLAY()), R_gtk_eventHandler, -1); } #else /* Create a dummy window for receiving messages */ LPCTSTR class = "cairoDevice"; HINSTANCE instance = GetModuleHandle(NULL); WNDCLASS wndclass = { 0, DefWindowProc, 0, 0, instance, NULL, 0, 0, NULL, class }; RegisterClass(&wndclass); win = CreateWindow(class, NULL, 0, 1, 1, 1, 1, HWND_MESSAGE, NULL, instance, NULL); SetTimer(win, CD_TIMER_ID, CD_TIMER_DELAY, (TIMERPROC)R_gtk_timer_proc); #endif } /* Initialize GTK+ if not already initialized */ void loadGTK(int *success) { char **argv; int argc = 1; *success = TRUE; argv = (char **) g_malloc(argc * sizeof(char *)); argv[0] = g_strdup("R"); if (!gdk_display_get_default()) { gtk_disable_setlocale(); *success = gtk_init_check(&argc, &argv); } R_gtk_setEventHandler(); g_free(argv[0]); g_free(argv); } void cleanupGTK() { #ifndef G_OS_WIN32 removeInputHandler(&R_InputHandlers, eventLoopInputHandler); #else DestroyWindow(win); #endif } cairoDevice/src/cairoDevice.h0000644000175100001440000000646412633267004015677 0ustar hornikusers#include #include /* extra backends */ #if CAIRO_VERSION > CAIRO_VERSION_ENCODE(1,2,0) #include #include #include #endif #include #include #include #include typedef struct _Cairo_locator_info { guint x; guint y; gboolean button1; guint handler_id; gboolean active; } CairoLocator; #if R_GE_version < 7 typedef struct _CairoEvent { SEXP rho; SEXP result; gboolean active; } CairoEvent; #endif typedef struct { GtkWidget *window; /* Graphics frame */ GtkWidget *drawing; /* widget to which we are drawing */ GdkPixmap *pixmap; /* off-screen drawable */ cairo_t *cr; /* the cairo context to which we draw */ cairo_t *cr_custom; /* custom cairo context from R */ cairo_surface_t *surface; /* if non-NULL we have an alt surface like svg */ gchar *filename; /* filename for certain Cairo backends */ gint width, height; /* width and height of device */ #if R_GE_version < 7 CairoEvent *event; /* stores information for 'getGraphicsEvent' support */ #endif CairoLocator *locator; /* stores information for 'locator' support */ int holdlevel; /* apparently we have to track the hold level */ } CairoDesc; /* Device driver actions */ static void Cairo_Activate(pDevDesc dd); static void Cairo_Circle(double x, double y, double r, const pGEcontext gc, pDevDesc dd); static void Cairo_Clip(double x0, double x1, double y0, double y1, pDevDesc dd); static void Cairo_Close(pDevDesc dd); static void Cairo_Deactivate(pDevDesc dd); static Rboolean Cairo_Locator(double *x, double *y, pDevDesc dd); static void Cairo_Line(double x1, double y1, double x2, double y2, const pGEcontext gc, pDevDesc dd); static void Cairo_MetricInfo(int c, const pGEcontext gc, double* ascent, double* descent, double* width, pDevDesc dd); static void Cairo_Mode(int mode, pDevDesc dd); static void Cairo_NewPage(const pGEcontext gc, pDevDesc dd); static void Cairo_Polygon(int n, double *x, double *y, const pGEcontext gc, pDevDesc dd); static SEXP Cairo_Cap(pDevDesc dd); static void Cairo_Raster(unsigned int *raster, int w, int h, double x, double y, double width, double height, double rot, Rboolean interpolate, const pGEcontext gc, pDevDesc dd); static void Cairo_Polyline(int n, double *x, double *y, const pGEcontext gc, pDevDesc dd); static void Cairo_Rect(double x0, double y0, double x1, double y1, const pGEcontext gc, pDevDesc dd); static void Cairo_Size(double *left, double *right, double *bottom, double *top, pDevDesc dd); static double Cairo_StrWidth(const char *str, const pGEcontext gc, pDevDesc dd); static void Cairo_Text(double x, double y, const char *str, double rot, double hadj, const pGEcontext gc, pDevDesc dd); static Rboolean Cairo_Open(pDevDesc, CairoDesc*, double, double, const gchar **); static Rboolean Cairo_OpenEmbedded(pDevDesc, CairoDesc*, GtkWidget*); #define SYMBOL_FONTFACE 5 void R_WriteConsole(const char*, int); /* event handler */ void R_gtk_eventHandler(void *userData); cairoDevice/src/cairoDevice.c0000644000175100001440000012064212633267004015665 0ustar hornikusers#include "cairoDevice.h" // All measurements within this file are made in points (unless otherwise stated) #define POINTS_PER_INCH 72 #define CURSOR GDK_CROSSHAIR /* Default cursor */ #define MM_PER_INCH 25.4 /* mm -> inch conversion */ static PangoStyle slant[] = { PANGO_STYLE_NORMAL, PANGO_STYLE_OBLIQUE }; static PangoWeight weight[] = { PANGO_WEIGHT_NORMAL, PANGO_WEIGHT_BOLD }; // Resolution is measured in dpi (dots per inch) double gResolutionX = 72; double gResolutionY = 72; // Sets resolution independently for X and Y directions void setResolutionXY(double resX, double resY) { //printf("Resolution was (%f,%f)\n", gResolutionX, gResolutionY); gResolutionX = resX; gResolutionY = resY; //printf("Resolution is now (%f,%f)\n", gResolutionX, gResolutionY); } // Sets resolution assuming X and Y are identical void setResolution(double res) { setResolutionXY(res,res); } // A function exposed to R allowing it to change the resolution SEXP Cairo_Set_Resolution(SEXP res) { double resolution = asReal(res); setResolution(resolution); return ScalarReal(resolution); } // Obtains X and Y resolutions of screen surface and updates global variables void setResolutionFromScreen() { double width, widthMM; double height, heightMM; double resX, resY; // X direction width = gdk_screen_width(); widthMM = gdk_screen_width_mm(); resX = width/widthMM * MM_PER_INCH; // Y direction height = gdk_screen_height(); heightMM = gdk_screen_height_mm(); resY = height/heightMM * MM_PER_INCH; // Update global variables setResolutionXY(resX, resY); } CairoDesc* createCairoDesc() { return(g_new0(CairoDesc, 1)); } void freeCairoDesc(pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; if (!cd) return; dd->deviceSpecific = NULL; if(cd->pixmap) g_object_unref(cd->pixmap); if(cd->drawing) gtk_widget_destroy(cd->drawing); if(cd->window) gtk_widget_destroy(cd->window); if(cd->cr) { if (!cd->cr_custom) cairo_show_page(cd->cr); else cairo_restore(cd->cr); cairo_destroy(cd->cr); } if (cd->filename) g_free(cd->filename); if (cd->surface) cairo_surface_destroy(cd->surface); g_free(cd); } static void activateDevice(pDevDesc dev) { pGEDevDesc gdd; CairoDesc *cd = (CairoDesc *)dev->deviceSpecific; GObject *obj = cd->drawing ? G_OBJECT(cd->drawing) : G_OBJECT(cd->pixmap); gdd = GEcreateDevDesc(dev); GEaddDevice2(gdd, "Cairo"); if (obj) { SEXP devnum = ScalarInteger(ndevNumber(dev) + 1); R_PreserveObject(devnum); g_object_set_data_full(obj, ".devnum", devnum, (GDestroyNotify)R_ReleaseObject); } } static PangoContext *getPangoContext(CairoDesc *cd) { if (cd->drawing) return(gtk_widget_get_pango_context(cd->drawing)); return(gdk_pango_context_get()); } static PangoFont *loadFont(PangoFontDescription *fontdesc, CairoDesc *cd) { return(pango_context_load_font(getPangoContext(cd), fontdesc)); } static PangoFontDescription *getBaseFont(CairoDesc *cd) { return(pango_font_description_from_string("Verdana")); } static gboolean initDevice(pDevDesc dd) { CairoDesc *cd; GdkCursor *cursor; gdouble left, right, bottom, top; cd = (CairoDesc *) dd->deviceSpecific; Cairo_Size(&left, &right, &bottom, &top, dd); //printf("Cairo_Size returned (%f %f %f %f)\n", left, right, bottom, top); /*g_debug("%f %f %f %f" , left, right, bottom, top);*/ dd->left = left; cd->width = dd->right = right; cd->height = dd->bottom = bottom; dd->top = top; /* set up crosshair cursor */ if (cd->drawing) { cursor = gdk_cursor_new(CURSOR); gdk_window_set_cursor(cd->drawing->window, cursor); gdk_cursor_unref(cursor); } if(cd->cr) { if (!cd->cr_custom) { cairo_show_page(cd->cr); cairo_destroy(cd->cr); } else cairo_restore(cd->cr); } if(cd->pixmap && cd->drawing) g_object_unref(cd->pixmap); /* create pixmap and cairo context for drawing, save default state */ if(right > 0 && bottom > 0) { if (cd->drawing) { cd->pixmap = gdk_pixmap_new(cd->drawing->window, right*gResolutionX/POINTS_PER_INCH, bottom*gResolutionY/POINTS_PER_INCH, -1); } if (cd->surface) { cd->cr = cairo_create(cd->surface); } else if (cd->cr_custom) { cd->cr = cd->cr_custom; } else cd->cr = gdk_cairo_create(cd->pixmap); //cairo_set_antialias(cd->cr, CAIRO_ANTIALIAS_NONE); //cd->pango = pango_cairo_font_map_create_context( // PANGO_CAIRO_FONT_MAP(pango_cairo_font_map_get_default())); //pango_cairo_context_set_resolution(cd->pango, 84); /* sync the size with the device */ } // Change the CTM (current transformation matrix) to scale for different resolutions cairo_scale(cd->cr, gResolutionX/POINTS_PER_INCH,gResolutionY/POINTS_PER_INCH); //printf(" scaling by %f, %f\n", gResolutionX/POINTS_PER_INCH,gResolutionY/POINTS_PER_INCH); cairo_save(cd->cr); return FALSE; } static void resize(pDevDesc dd) { GEplayDisplayList(desc2GEDesc(dd)); } static gboolean realize_event(GtkWidget *widget, pDevDesc dd) { g_return_val_if_fail(dd != NULL, FALSE); initDevice(dd); return(FALSE); } static gboolean realize_embedded(GtkWidget *widget, pDevDesc dd) { /* different from above in that embedded device needs to be activated, since it wasn't when the device was created */ g_return_val_if_fail(dd != NULL, FALSE); initDevice(dd); activateDevice(dd); return(FALSE); } static gint expose_event(GtkWidget *widget, GdkEventExpose *event, pDevDesc dd) { CairoDesc *cd; g_return_val_if_fail(dd != NULL, FALSE); cd = (CairoDesc *)dd->deviceSpecific; g_return_val_if_fail(cd != NULL, FALSE); g_return_val_if_fail(GTK_IS_DRAWING_AREA(cd->drawing), FALSE); gint current_width = ((double)cd->drawing->allocation.width/gResolutionX*POINTS_PER_INCH); gint current_height = ((double)cd->drawing->allocation.height/gResolutionY*POINTS_PER_INCH); if(cd->width != current_width || cd->height != current_height) { resize(dd); } else if(cd->pixmap) { gdk_draw_drawable(cd->drawing->window, cd->drawing->style->bg_gc[GTK_STATE_NORMAL], cd->pixmap, event->area.x, event->area.y, event->area.x, event->area.y, event->area.width, event->area.height); } //else { //GEplayDisplayList((GEDevDesc*) Rf_GetDevice(Rf_devNumber((DevDesc*)dd))); //} return FALSE; } #if R_GE_version < 7 static void event_finish(pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; dd->onExit = NULL; dd->gettingEvent = FALSE; cd->event->active = FALSE; cd->event = NULL; } static void event_maybe_finish(pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; if (cd->event->result && cd->event->result != R_NilValue) event_finish(dd); } static void CairoEvent_onExit(pDevDesc dd) { event_finish(dd); } #endif /* converts the Gdk buttons to the button masks used by R's gevent.c */ #define R_BUTTON(button) pow(2, (button) - 1) #define R_BUTTONS(state) (state) & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK) >> 8 static gboolean button_press_event(GtkWidget *widget, GdkEventButton *event, pDevDesc dd) { if (dd->gettingEvent) { #if R_GE_version < 7 CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; cd->event->result = doMouseEvent(cd->event->rho, dd, meMouseDown, R_BUTTON(event->button), event->x, event->y); event_maybe_finish(dd); #else doMouseEvent(dd, meMouseDown, R_BUTTON(event->button), event->x, event->y); #endif } return(FALSE); } static gboolean button_release_event(GtkWidget *widget, GdkEventButton *event, pDevDesc dd) { if (dd->gettingEvent) { #if R_GE_version < 7 CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; cd->event->result = doMouseEvent(cd->event->rho, dd, meMouseUp, R_BUTTON(event->button), event->x, event->y); event_maybe_finish(dd); #else doMouseEvent(dd, meMouseUp, R_BUTTON(event->button), event->x, event->y); #endif } return(FALSE); } static gboolean motion_notify_event(GtkWidget *widget, GdkEventMotion *event, pDevDesc dd) { if (dd->gettingEvent) { #if R_GE_version < 7 CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; cd->event->result = doMouseEvent(cd->event->rho, dd, meMouseMove, R_BUTTONS(event->state), event->x, event->y); event_maybe_finish(dd); #else doMouseEvent(dd, meMouseMove, R_BUTTONS(event->state), event->x, event->y); #endif } return(FALSE); } static gboolean key_press_event(GtkWidget *widget, GdkEventKey *event, pDevDesc dd) { if (dd->gettingEvent) { #if R_GE_version < 7 CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; cd->event->result = doKeybd(cd->event->rho, dd, -1, gdk_keyval_name(event->keyval)); event_maybe_finish(dd); #else doKeybd(dd, -1, gdk_keyval_name(event->keyval)); #endif } return(FALSE); } #if R_GE_version < 7 static SEXP Cairo_GetEvent(SEXP rho, const char *prompt) { pGEDevDesc dd = GEcurrentDevice(); CairoDesc *cd = (CairoDesc *) dd->dev->deviceSpecific; CairoEvent *event = g_new0(CairoEvent, 1); SEXP result = R_NilValue; if (cd->event) error("recursive use of getGraphicsEvent not supported"); cd->event = event; event->rho = rho; event->result = R_NilValue; dd->dev->gettingEvent = TRUE; R_WriteConsole(prompt, strlen(prompt)); R_WriteConsole("\n", 1); R_FlushConsole(); dd->dev->onExit = CairoEvent_onExit; /* install callback for cleanup */ event->active = TRUE; while (event->active) { R_gtk_eventHandler(NULL); } if (event->result) result = event->result; g_free(event); return result; } #else static void Cairo_EventHelper(pDevDesc dd, int code) { if (code == 1) { if (isEnvironment(dd->eventEnv)) { SEXP prompt = findVar(install("prompt"), dd->eventEnv); if (length(prompt) == 1) { const char* cprompt = CHAR(asChar(prompt)); R_WriteConsole(cprompt, strlen(cprompt)); R_WriteConsole("\n", 1); R_FlushConsole(); } } } else if (code == 2) R_gtk_eventHandler(NULL); return; } #endif static void kill_cairo(pDevDesc dd) { GEkillDevice(desc2GEDesc(dd)); } static void unrealize_cb(GtkWidget *widget, pDevDesc dd) { g_return_if_fail(dd != NULL); if (dd->deviceSpecific) { /* make sure not called from freeCairoDesc */ /* don't try to destroy the widget, since it's already being destroyed */ ((CairoDesc *) dd->deviceSpecific)->drawing = NULL; kill_cairo(dd); } } static gint delete_event(GtkWidget *widget, GdkEvent *event, pDevDesc dd) { g_return_val_if_fail(dd != NULL, FALSE); kill_cairo(dd); return TRUE; } static void setupWidget(GtkWidget *drawing, pDevDesc dd) { gtk_widget_add_events(drawing, GDK_EXPOSURE_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK); g_signal_connect(G_OBJECT(drawing), "expose_event", G_CALLBACK(expose_event), dd); g_signal_connect(G_OBJECT(drawing), "motion_notify_event", G_CALLBACK(motion_notify_event), dd); g_signal_connect(G_OBJECT(drawing), "button_release_event", G_CALLBACK(button_release_event), dd); g_signal_connect(G_OBJECT(drawing), "button_press_event", G_CALLBACK(button_press_event), dd); } static Rboolean Cairo_OpenEmbedded(pDevDesc dd, CairoDesc *cd, GtkWidget *drawing) { dd->deviceSpecific = cd; cd->drawing = drawing; // initialize /*g_return_val_if_fail(GTK_WIDGET_REALIZED(drawing), FALSE);*/ if (GTK_WIDGET_REALIZED(drawing)) initDevice(dd); else g_signal_connect(G_OBJECT(drawing), "realize", G_CALLBACK(realize_embedded), dd); // hook it up for drawing and user events setupWidget(drawing, dd); // free the device when it's no longer able to draw g_signal_connect(G_OBJECT(drawing), "unrealize", G_CALLBACK(unrealize_cb), dd); return(TRUE); } static Rboolean Cairo_OpenOffscreen(pDevDesc dd, CairoDesc *cd, GdkDrawable *drawing) { dd->deviceSpecific = cd; cd->pixmap = drawing; g_object_ref(G_OBJECT(cd->pixmap)); // initialize initDevice(dd); return(TRUE); } static Rboolean Cairo_OpenCustom(pDevDesc dd, CairoDesc *cd, double w, double h, cairo_t *cr) { dd->deviceSpecific = cd; cd->cr_custom = cairo_reference(cr); cd->width = w; cd->height = h; // initialize initDevice(dd); return(TRUE); } static Rboolean Cairo_Open(pDevDesc dd, CairoDesc *cd, double w, double h, const gchar **surface_info) { dd->deviceSpecific = cd; if (strcmp(surface_info[0], "screen")) { cairo_surface_t *surface; double width, height; if (!strcmp(surface_info[0], "png")) { width = w * gResolutionX/POINTS_PER_INCH; height = h * gResolutionY/POINTS_PER_INCH; surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); cd->filename = g_strdup(surface_info[1]); } else { setResolution(POINTS_PER_INCH); width = w; height = h; #ifdef CAIRO_HAS_PDF_SURFACE if (!strcmp(surface_info[0], "pdf")) surface = cairo_pdf_surface_create(surface_info[1], width, height); else #endif #ifdef CAIRO_HAS_SVG_SURFACE if (!strcmp(surface_info[0], "svg")) surface = cairo_svg_surface_create(surface_info[1], width, height); else #endif #ifdef CAIRO_HAS_PS_SURFACE if (!strcmp(surface_info[0], "ps")) surface = cairo_ps_surface_create(surface_info[1], width, height); else #endif { warning("Unknown surface type: %s", surface_info[0]); return(FALSE); } } cd->width = w; cd->height = h; cd->surface = surface; return(TRUE); } // Set resolution setResolutionFromScreen(); cd->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_resizable(GTK_WINDOW(cd->window), TRUE); gtk_window_set_default_size(GTK_WINDOW(cd->window), w * gResolutionX/POINTS_PER_INCH, h * gResolutionY/POINTS_PER_INCH); /* create drawingarea */ cd->drawing = gtk_drawing_area_new(); /* connect to signal handlers, etc */ g_signal_connect(G_OBJECT (cd->drawing), "realize", G_CALLBACK (realize_event), dd); /* place and realize the drawing area */ gtk_container_add(GTK_CONTAINER(cd->window), cd->drawing); /* connect to signal handlers, etc */ setupWidget(cd->drawing, dd); g_signal_connect(G_OBJECT(cd->window), "delete_event", G_CALLBACK(delete_event), dd); g_signal_connect(G_OBJECT(cd->window), "key_press_event", G_CALLBACK(key_press_event), dd); gtk_widget_show_all(cd->window); return(TRUE); } static PangoFontDescription *getFont(CairoDesc *cd, const pGEcontext gc) { PangoFontDescription *fontdesc; gint face = gc->fontface; double size = gc->cex * gc->ps; if (face < 1 || face > 5) face = 1; fontdesc = pango_font_description_new(); if (face == 5) pango_font_description_set_family(fontdesc, "symbol"); else { char *fm = gc->fontfamily; /*if(!strcmp(fm, "mono")) fm = "courier"; else if(!strcmp(fm, "serif")) fm = "times"; else if(!strcmp(fm, "sans")) fm = "helvetica";*/ pango_font_description_set_family(fontdesc, fm[0] ? fm : "Verdana"); if(face == 2 || face == 4) pango_font_description_set_weight(fontdesc, PANGO_WEIGHT_BOLD); if(face == 3 || face == 4) pango_font_description_set_style(fontdesc, PANGO_STYLE_OBLIQUE); } pango_font_description_set_size(fontdesc, PANGO_SCALE * size); return fontdesc; } static PangoLayout *layoutText(PangoFontDescription *desc, const char *str, CairoDesc *cd) { PangoLayout *layout; //pango_cairo_update_context(cd->cr, cd->pango); //layout = pango_layout_new(cd->pango); /*if (cd->drawing) layout = gtk_widget_create_pango_layout(cd->drawing, NULL); else layout = pango_layout_new(gdk_pango_context_get());*/ layout = pango_cairo_create_layout(cd->cr); pango_layout_set_font_description(layout, desc); pango_layout_set_text(layout, str, -1); return(layout); } static void text_extents(PangoFontDescription *desc, CairoDesc *cd, const pGEcontext gc, const gchar *text, gint *lbearing, gint *rbearing, gint *width, gint *ascent, gint *descent, gboolean ink) { PangoLayout *layout; PangoRectangle rect, irect; layout = layoutText(desc, text, cd); pango_layout_line_get_pixel_extents(pango_layout_get_line(layout, 0), &irect, &rect); if (!ink) { if(ascent) *ascent = PANGO_ASCENT(rect); if(descent) *descent = PANGO_DESCENT(rect); if(width) *width = rect.width; if(lbearing) *lbearing = PANGO_LBEARING(rect); if(rbearing) *rbearing = PANGO_RBEARING(rect); } else { if(ascent) *ascent = PANGO_ASCENT(irect); if(descent) *descent = PANGO_DESCENT(irect); if(width) *width = irect.width; if(lbearing) *lbearing = PANGO_LBEARING(irect); if(rbearing) *rbearing = PANGO_RBEARING(irect); } g_object_unref(layout); } static void font_metrics(PangoFontDescription *desc, CairoDesc *cd, gint *width, gint *ascent, gint *descent) { PangoFontMetrics *metrics; metrics = pango_context_get_metrics(getPangoContext(cd), desc, NULL); *ascent = PANGO_PIXELS(pango_font_metrics_get_ascent(metrics)); *descent = PANGO_PIXELS(pango_font_metrics_get_descent(metrics)); *width = PANGO_PIXELS(pango_font_metrics_get_approximate_char_width(metrics)); pango_font_metrics_unref(metrics); } static void setColor(cairo_t *cr, int color) { cairo_set_source_rgba(cr, R_RED(color) / 255.0, R_GREEN(color) / 255.0, R_BLUE(color) / 255.0, R_ALPHA(color) / 255.0); } /* set the line type */ static void setLineType(cairo_t *cr, const pGEcontext gc) { cairo_line_cap_t cap = CAIRO_LINE_CAP_ROUND; cairo_line_join_t join = CAIRO_LINE_JOIN_ROUND; static double dashes[8]; gint i; cairo_set_line_width(cr, gc->lwd); switch(gc->lend) { case GE_ROUND_CAP: cap = CAIRO_LINE_CAP_ROUND; break; case GE_BUTT_CAP: cap = CAIRO_LINE_CAP_BUTT; break; case GE_SQUARE_CAP: cap = CAIRO_LINE_CAP_SQUARE; break; } cairo_set_line_cap(cr, cap); switch(gc->ljoin) { case GE_ROUND_JOIN: join = CAIRO_LINE_JOIN_ROUND; break; case GE_MITRE_JOIN: join = CAIRO_LINE_JOIN_MITER; cairo_set_miter_limit(cr, gc->lmitre); break; case GE_BEVEL_JOIN: join = CAIRO_LINE_JOIN_BEVEL; break; } cairo_set_line_join(cr, join); for(i = 0; i < 8 && gc->lty & 15; i++) { dashes[i] = gc->lty & 15; gc->lty = gc->lty >> 4; } /* set dashes */ cairo_set_dash(cr, dashes, i, 0); } static void drawShape(cairo_t *cr, const pGEcontext gc) { gboolean stroke = R_ALPHA(gc->col) > 0 && gc->lty != -1; gboolean fill = R_ALPHA(gc->fill) > 0; if (fill) { cairo_antialias_t antialias = cairo_get_antialias(cr); cairo_set_antialias(cr, CAIRO_ANTIALIAS_NONE); setColor(cr, gc->fill); if (stroke) { cairo_fill_preserve(cr); } else { cairo_fill(cr); } cairo_set_antialias(cr, antialias); } if (stroke) { setColor(cr, gc->col); setLineType(cr, gc); cairo_stroke(cr); } } static void drawRect(cairo_t *cr, double x0, double y0, double x1, double y1, const pGEcontext gc) { cairo_rectangle(cr, x0, y0, x1 - x0, y1 - y0); drawShape(cr, gc); } static double Cairo_StrWidth(const char *str, const pGEcontext gc, pDevDesc dd) { gint width; CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; PangoFontDescription *desc = getFont(cd, gc); text_extents(desc, cd, gc, str, NULL, NULL, &width, NULL, NULL, FALSE); pango_font_description_free(desc); return (double) width; } static void Cairo_MetricInfo(int c, const pGEcontext gc, double* ascent, double* descent, double* width, pDevDesc dd) { gchar text[16]; CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; gint iascent, idescent, iwidth; int Unicode = mbcslocale; PangoFontDescription *desc = getFont(cd, gc); if (!c) font_metrics(desc, cd, &iwidth, &iascent, &idescent); else { /*if (!c) c = 77;*/ if(c < 0) {c = -c; Unicode = 1;} if(Unicode || c >= 128) Rf_ucstoutf8(text, c); else g_snprintf(text, 2, "%c", (gchar) c); text_extents(desc, cd, gc, text, NULL, NULL, &iwidth, &iascent, &idescent, TRUE); } *ascent = iascent; *descent = idescent; *width = iwidth; //Rprintf("%f %f %f\n", *ascent, *descent, *width); pango_font_description_free(desc); } static void Cairo_Clip(double x0, double x1, double y0, double y1, pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; gint cx, cy, cw, ch; cx = (int) MIN(x0, x1); cw = abs( (int) x0 - (int) x1) + 1; cy = (int) MIN(y0, y1); ch = abs( (int) y0 - (int) y1) + 1; cairo_restore(cd->cr); // get rid of last clip cairo_save(cd->cr); cairo_rectangle(cd->cr, cx, cy, cw, ch); cairo_clip(cd->cr); //Rprintf("clip: %f %f %f %f\n", cx, cy, cw, ch); } static void Cairo_Size(double *left, double *right, double *bottom, double *top, pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; gint width = cd->width, height = cd->height; /* we have to use the allocation width/height if we have a widget, because the new backing pixmap is not created until later */ if (cd->drawing) { if (GTK_WIDGET_MAPPED(cd->drawing)) { width = (double)cd->drawing->allocation.width / gResolutionX * POINTS_PER_INCH ; height = (double)cd->drawing->allocation.height / gResolutionY * POINTS_PER_INCH; } else { width = height = 1000; // hack to get R to draw before first exposure } } else if (GDK_IS_DRAWABLE(cd->pixmap)) { gdk_drawable_get_size(cd->pixmap, &width, &height); width = (double)width / gResolutionX * POINTS_PER_INCH; height = (double)height / gResolutionY * POINTS_PER_INCH; } *left = 0.0; *right = (gdouble)width; *top = 0.0; *bottom = (gdouble)height; } /* clear the drawing area */ static void Cairo_NewPage(const pGEcontext gc, pDevDesc dd) { CairoDesc *cd = dd->deviceSpecific; cairo_t *cr; initDevice(dd); cr = cd->cr; if (!R_OPAQUE(gc->fill)) cairo_set_source_rgb(cr, 1, 1, 1); else setColor(cr, gc->fill); cairo_new_path(cr); cairo_paint(cr); if (cd->drawing) gtk_widget_queue_draw(cd->drawing); } /** kill off the window etc */ static void Cairo_Close(pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; if (dd->onExit) dd->onExit(dd); if (cd->filename) /* we have an image surface, write to png */ cairo_surface_write_to_png(cd->surface, cd->filename); freeCairoDesc(dd); } #define title_text_inactive "R graphics device %d" #define title_text_active "R graphics device %d - Active" void setActive(pDevDesc dd, gboolean active) { CairoDesc *cd; gint devnum; gchar *title_text; cd = (CairoDesc *) dd->deviceSpecific; g_return_if_fail(cd != NULL); if (!cd->window) return; devnum = ndevNumber(dd) + 1; if (active) title_text = g_strdup_printf(title_text_active, devnum); else title_text = g_strdup_printf(title_text_inactive, devnum); gtk_window_set_title(GTK_WINDOW(cd->window), title_text); g_free(title_text); } static void Cairo_Activate(pDevDesc dd) { setActive(dd, TRUE); } static void Cairo_Deactivate(pDevDesc dd) { setActive(dd, FALSE); } static void Cairo_Rect(double x0, double y0, double x1, double y1, const pGEcontext gc, pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; g_return_if_fail(cd != NULL); g_return_if_fail(cd->cr != NULL); cairo_save(cd->cr); drawRect(cd->cr, x0, y0, x1, y1, gc); cairo_restore(cd->cr); } static void drawPath(cairo_t *cr, double *x, double *y, int npoly, int *nper, Rboolean winding, const pGEcontext gc) { int i, j, z; cairo_new_path(cr); for (i = 0, z = 0; i < npoly; i++) { cairo_move_to(cr, x[z], y[z]); z++; for (j = 1; j < nper[i]; j++, z++) { cairo_line_to(cr, x[z], y[z]); } cairo_close_path(cr); } cairo_set_fill_rule(cr, winding ? CAIRO_FILL_RULE_WINDING : CAIRO_FILL_RULE_EVEN_ODD); drawShape(cr, gc); } static void Cairo_Path(double *x, double *y, int npoly, int *nper, Rboolean winding, const pGEcontext gc, pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; g_return_if_fail(cd != NULL); g_return_if_fail(cd->cr != NULL); cairo_save(cd->cr); drawPath(cd->cr, x, y, npoly, nper, winding, gc); cairo_restore(cd->cr); } static void drawCircle(cairo_t *cr, double x, double y, double r, const pGEcontext gc) { cairo_move_to(cr, x+r, y); cairo_translate(cr, x, y); cairo_arc(cr, 0, 0, r, 0, 2 * M_PI); //cairo_arc(cr, x, y, r, 0, 2 * M_PI); drawShape(cr, gc); } static void Cairo_Circle(double x, double y, double r, const pGEcontext gc, pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; g_return_if_fail(cd != NULL); g_return_if_fail(cd->cr != NULL); cairo_save(cd->cr); drawCircle(cd->cr, x, y, r, gc); cairo_restore(cd->cr); } static void drawLine(cairo_t *cr, double x1, double y1, double x2, double y2, const pGEcontext gc) { cairo_move_to(cr, x1, y1); cairo_line_to(cr, x2, y2); setColor(cr, gc->col); setLineType(cr, gc); cairo_stroke(cr); } static void Cairo_Line(double x1, double y1, double x2, double y2, const pGEcontext gc, pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; //g_debug("line"); g_return_if_fail(cd != NULL); g_return_if_fail(cd->cr != NULL); cairo_save(cd->cr); drawLine(cd->cr, x1, y1, x2, y2, gc); cairo_restore(cd->cr); } static void polypath(cairo_t *cr, int n, double *x, double *y) { gint i; g_return_if_fail(n > 0); cairo_move_to(cr, x[0], y[0]); for (i = 1; i < n; i++) cairo_line_to(cr, x[i], y[i]); } static void drawPolyline(cairo_t *cr, int n, double *x, double *y, const pGEcontext gc) { polypath(cr, n, x, y); setColor(cr, gc->col); setLineType(cr, gc); cairo_stroke(cr); } static void Cairo_Polyline(int n, double *x, double *y, const pGEcontext gc, pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; //g_debug("polyline"); g_return_if_fail(cd != NULL); g_return_if_fail(cd->cr != NULL); cairo_save(cd->cr); drawPolyline(cd->cr, n, x, y, gc); cairo_restore(cd->cr); } static void drawPolygon(cairo_t *cr, int n, double *x, double *y, const pGEcontext gc) { polypath(cr, n, x, y); cairo_close_path(cr); drawShape(cr, gc); } static void Cairo_Polygon(int n, double *x, double *y, const pGEcontext gc, pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; g_return_if_fail(cd != NULL); g_return_if_fail(cd->cr != NULL); cairo_save(cd->cr); drawPolygon(cd->cr, n, x, y, gc); cairo_restore(cd->cr); } #if R_GE_version > 6 /* Adapted from R's modules/X11/cairoX11.c */ static void Cairo_Raster(unsigned int *raster, int w, int h, double x, double y, double width, double height, double rot, Rboolean interpolate, const pGEcontext gc, pDevDesc dd) { char *vmax = vmaxget(); int i; cairo_surface_t *image; unsigned char *imageData; CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; imageData = (unsigned char *) R_alloc(4*w*h, sizeof(unsigned char)); /* The R ABGR needs to be converted to a Cairo ARGB * AND values need to by premultiplied by alpha */ for (i=0; icr); cairo_translate(cd->cr, x, y); cairo_rotate(cd->cr, -rot*M_PI/180); cairo_scale(cd->cr, width/w, height/h); /* Flip vertical first */ cairo_translate(cd->cr, 0, h/2.0); cairo_scale(cd->cr, 1, -1); cairo_translate(cd->cr, 0, -h/2.0); cairo_set_source_surface(cd->cr, image, 0, 0); /* Use nearest-neighbour filter so that a scaled up image * is "blocky"; alternative is some sort of linear * interpolation, which gives nasty edge-effects */ if (!interpolate) { cairo_pattern_set_filter(cairo_get_source(cd->cr), CAIRO_FILTER_NEAREST); } cairo_paint(cd->cr); cairo_restore(cd->cr); cairo_surface_destroy(image); vmaxset(vmax); } static SEXP Cairo_Cap(pDevDesc dd) { int i, j, k, nbytes, width, height, size, stride; CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; unsigned char *screenData; SEXP dim, raster = R_NilValue; unsigned int *rint; GdkPixbuf *pixbuf = NULL; if (!cd->pixmap) return raster; pixbuf = gdk_pixbuf_get_from_drawable(NULL, cd->pixmap, NULL, 0, 0, 0, 0, -1, -1); stride = gdk_pixbuf_get_rowstride(pixbuf); width = gdk_pixbuf_get_width(pixbuf); height = gdk_pixbuf_get_height(pixbuf); screenData = gdk_pixbuf_get_pixels(pixbuf); /* Should not happen */ if (gdk_pixbuf_get_colorspace(pixbuf) != GDK_COLORSPACE_RGB || gdk_pixbuf_get_bits_per_sample(pixbuf) != 8 || gdk_pixbuf_get_has_alpha(pixbuf)) return raster; size = width*height; nbytes = stride*height; PROTECT(raster = allocVector(INTSXP, size)); /* Copy each byte of screen to an R matrix. * The Cairo RGB24 needs to be converted to an R ABGR32 */ rint = (unsigned int *) INTEGER(raster); for (i = 0, k = 0; i < nbytes; i += stride) for (j = i; j < i + width*3; j += 3) rint[k++] = 255<<24 | ((screenData[j])<<16 | (screenData[j + 1])<<8 | (screenData[j + 2])); PROTECT(dim = allocVector(INTSXP, 2)); INTEGER(dim)[0] = height; INTEGER(dim)[1] = width; setAttrib(raster, R_DimSymbol, dim); UNPROTECT(2); return raster; } #endif static void drawText(double x, double y, const char *str, double rot, double hadj, CairoDesc *cd, const pGEcontext gc) { PangoLayout *layout; gint ascent, lbearing; cairo_t *cr = cd->cr; PangoFontDescription *desc = getFont(cd, gc); layout = layoutText(desc, str, cd); text_extents(desc, cd, gc, str, &lbearing, NULL, NULL, &ascent, NULL, FALSE); cairo_move_to(cr, x, y); cairo_rotate(cr, -1*rot); cairo_rel_move_to(cr, -lbearing, -ascent); setColor(cr, gc->col); pango_cairo_show_layout(cr, layout); g_object_unref(layout); pango_font_description_free(desc); } static void Cairo_Text(double x, double y, const char *str, double rot, double hadj, const pGEcontext gc, pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; double rrot = DEG2RAD * rot; //Rprintf("%s @ %f %f\n", str, x, y); cairo_save(cd->cr); drawText(x, y, str, rrot, hadj, cd, gc); cairo_restore(cd->cr); } static void locator_finish(pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; /* clean up handler */ g_signal_handler_disconnect(G_OBJECT(cd->drawing), cd->locator->handler_id); /* turn off locator */ dd->onExit = NULL; cd->locator->active = FALSE; } static void locator_button_press(GtkWidget *widget, GdkEventButton *event, pDevDesc dd) { CairoLocator *info = ((CairoDesc *) dd->deviceSpecific)->locator; info->x = event->x; info->y = event->y; if(event->button == 1) info->button1 = TRUE; else info->button1 = FALSE; locator_finish(dd); } static void CairoLocator_onExit(pDevDesc dd) { locator_finish(dd); } static Rboolean Cairo_Locator(double *x, double *y, pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; CairoLocator *info; gboolean button1; g_return_val_if_fail(GTK_IS_DRAWING_AREA(cd->drawing), FALSE); if (cd->holdlevel > 0) error("attempt to use the locator after dev.hold()"); info = g_new0(CairoLocator, 1); cd->locator = info; /* force update to show identity */ gtk_widget_queue_draw(cd->drawing); gdk_window_process_updates(cd->drawing->window,TRUE); gdk_flush(); /* Flush any pending events */ while(gtk_events_pending()) gtk_main_iteration(); /* connect signal */ info->handler_id = g_signal_connect(G_OBJECT(cd->drawing), "button-press-event", G_CALLBACK(locator_button_press), dd); /* and an exit handler in case the window gets closed */ dd->onExit = CairoLocator_onExit; /* run the handler */ info->active = TRUE; while (info->active) { R_gtk_eventHandler(NULL); } *x = (double) info->x / gResolutionX * POINTS_PER_INCH; *y = (double) info->y / gResolutionY * POINTS_PER_INCH; button1 = info->button1; g_free(info); if(button1) return TRUE; return FALSE; } static void busy(CairoDesc *cd) { if (cd->drawing) { GdkCursor *cursor = gdk_cursor_new(GDK_WATCH); gdk_window_set_cursor(cd->drawing->window, cursor); gdk_cursor_unref(cursor); } } static void idle(CairoDesc *cd) { if (cd->drawing) { GdkCursor *cursor = gdk_cursor_new(CURSOR); gdk_window_set_cursor(cd->drawing->window, cursor); gdk_cursor_unref(cursor); } } static void update(CairoDesc *cd) { if (cd->drawing) { gtk_widget_queue_draw(cd->drawing); gdk_window_process_updates(cd->drawing->window, TRUE); gdk_flush(); } } static int Cairo_HoldFlush(pDevDesc dd, int level) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; int prevHoldlevel = cd->holdlevel; cd->holdlevel = MAX(cd->holdlevel + level, 0); if (cd->holdlevel == 0) { /* hold released */ update(cd); idle(cd); } else if (prevHoldlevel == 0) { /* first hold, flush and go busy */ update(cd); busy(cd); } return cd->holdlevel; } static void Cairo_Mode(gint mode, pDevDesc dd) { CairoDesc *cd = (CairoDesc *) dd->deviceSpecific; if (cd->holdlevel) return; if (cd->drawing) { if (!mode) { update(cd); idle(cd); //R_gtk_eventHandler(NULL); } else { busy(cd); } } } Rboolean configureCairoDevice(pDevDesc dd, CairoDesc *cd, double width, double height, double ps) { gint ascent, descent, cw; PangoFont *success; PangoFontDescription *fontdesc; /* setup data structure */ dd->deviceSpecific = (void *) cd; dd->close = Cairo_Close; dd->activate = Cairo_Activate; dd->deactivate = Cairo_Deactivate; dd->size = Cairo_Size; dd->newPage = Cairo_NewPage; dd->clip = Cairo_Clip; /* Next two are unused */ dd->strWidth = Cairo_StrWidth; dd->text = Cairo_Text; dd->rect = Cairo_Rect; dd->circle = Cairo_Circle; dd->line = Cairo_Line; dd->polyline = Cairo_Polyline; dd->polygon = Cairo_Polygon; #if R_GE_version > 6 dd->path = Cairo_Path; dd->raster = Cairo_Raster; dd->cap = Cairo_Cap; #endif dd->locator = Cairo_Locator; dd->mode = Cairo_Mode; dd->metricInfo = Cairo_MetricInfo; #if R_GE_version < 7 dd->getEvent = Cairo_GetEvent; #else dd->eventHelper = Cairo_EventHelper; #endif dd->hasTextUTF8 = TRUE; dd->wantSymbolUTF8 = TRUE; dd->strWidthUTF8 = Cairo_StrWidth; dd->textUTF8 = Cairo_Text; #if R_GE_version >= 9 dd->holdflush = Cairo_HoldFlush; #endif #if R_GE_version >= 9 dd->haveTransparency = 2; dd->haveTransparentBg = 3; dd->haveRaster = 2; dd->haveCapture = cd->pixmap ? 2 : 1; dd->haveLocator = cd->drawing ? 2 : 1; #endif dd->left = 0; dd->right = width; dd->bottom = height; dd->top = 0; // Setup font fontdesc = getBaseFont(cd); pango_font_description_set_size(fontdesc, PANGO_SCALE * ps); success = loadFont(fontdesc, cd); if (!success) { pango_font_description_free(fontdesc); Rprintf("Cannot find base font!\n"); return(FALSE); } pango_context_set_font_description(getPangoContext(cd), fontdesc); font_metrics(fontdesc, cd, &cw, &ascent, &descent); pango_font_description_free(fontdesc); /* starting parameters */ ps = 2 * (ps / 2); dd->startfont = 1; dd->startps = ps; dd->startcol = R_RGB(0, 0, 0); dd->startfill = R_TRANWHITE; dd->startlty = LTY_SOLID; dd->startgamma = 1; dd->cra[0] = cw; dd->cra[1] = ascent + descent; /* character addressing offsets */ dd->xCharOffset = 0.4900; dd->yCharOffset = 0.3333; dd->yLineBias = 0.1; /* inches per raster unit */ dd->ipr[0] = 1.0/POINTS_PER_INCH; dd->ipr[1] = 1.0/POINTS_PER_INCH; /* device capabilities */ dd->canClip = TRUE; dd->canHAdj = 0; // maybe 1 or 2? dd->canChangeGamma = FALSE; // not yet if (cd->drawing) { dd->canGenMouseDown = TRUE; /* can the device generate mousedown events */ dd->canGenMouseMove = TRUE; /* can the device generate mousemove events */ dd->canGenMouseUp = TRUE; /* can the device generate mouseup events */ if (cd->window) dd->canGenKeybd = TRUE; /* can the device generate keyboard events */ } dd->displayListOn = TRUE; /* finish */ return TRUE; } Rboolean createCairoDevice(pDevDesc dd, double width, double height, double ps, void *data) { /* device driver start */ CairoDesc *cd; if(!(cd = createCairoDesc())) return FALSE; // need to create drawing area before we can configure the device if(!Cairo_Open(dd, cd, width, height, data)) { freeCairoDesc(dd); return FALSE; } return(configureCairoDevice(dd, cd, width, height, ps)); } Rboolean asCairoDevice(pDevDesc dd, double width, double height, double ps, void *data) { CairoDesc *cd; gdouble left, right, bottom, top; gboolean success; if(!(cd = createCairoDesc())) return FALSE; if (width != -1) { // if width/height specified, we have custom context success = Cairo_OpenCustom(dd, cd, width, height, (cairo_t *)data); } else { // otherwise assume something from GTK if (GTK_IS_WIDGET(data)) success = Cairo_OpenEmbedded(dd, cd, GTK_WIDGET(data)); else success = Cairo_OpenOffscreen(dd, cd, GDK_DRAWABLE(data)); } if (!success) { freeCairoDesc(dd); return FALSE; } Cairo_Size(&left, &right, &bottom, &top, dd); return(configureCairoDevice(dd, cd, right, bottom, ps)); } typedef Rboolean (*CairoDeviceCreateFun)(pDevDesc , double width, double height, double pointsize, void *data); static pDevDesc initCairoDevice(double width, double height, double ps, void *data, CairoDeviceCreateFun init_fun) { pDevDesc dev; CairoDesc *cd; R_GE_checkVersionOrDie(R_GE_version); R_CheckDeviceAvailable(); BEGIN_SUSPEND_INTERRUPTS { /* Allocate and initialize the device driver data */ if (!(dev = (pDevDesc) calloc(1, sizeof(DevDesc)))) return NULL; if (! init_fun (dev, width, height, ps, data)) { free(dev); PROBLEM "unable to start device cairo" ERROR; } cd = (CairoDesc *)dev->deviceSpecific; /* wait to do this until the device is realized (if applicable) */ if (!cd->drawing || GTK_WIDGET_REALIZED(cd->drawing)) activateDevice(dev); } END_SUSPEND_INTERRUPTS; gdk_flush(); return(dev); } // Width and Height are in inches void do_Cairo(double *in_width, double *in_height, double *in_pointsize, char **surface) { char *vmax; double height, width, ps; /* gcall = call; */ vmax = vmaxget(); width = *in_width; height = *in_height; if (width <= 0 || height <= 0) { PROBLEM "Cairo device: invalid width or height" ERROR; } ps = *in_pointsize; initCairoDevice(width*POINTS_PER_INCH, height*POINTS_PER_INCH, ps, surface, (CairoDeviceCreateFun)createCairoDevice); vmaxset(vmax); /* return R_NilValue; */ } SEXP do_asCairoDevice(SEXP widget, SEXP pointsize, SEXP width, SEXP height) { pDevDesc pd = initCairoDevice(asReal(width), asReal(height), asReal(pointsize), R_ExternalPtrAddr(widget), asCairoDevice); return ScalarLogical(pd != NULL); } cairoDevice/src/Makevars.in0000644000175100001440000000006312633267004015377 0ustar hornikusersPKG_CPPFLAGS=@GTK_CPPFLAGS@ -g PKG_LIBS=@GTK_LIBS@ cairoDevice/src/Makevars.win0000644000175100001440000000110012633267004015557 0ustar hornikusersPKG_CPPFLAGS=-D_R_=1 -DUSE_R=1 -mms-bitfields -I$(GTK_PATH)/include/gtk-2.0 -I$(GTK_PATH)/lib/gtk-2.0/include -I$(GTK_PATH)/include/atk-1.0 -I$(GTK_PATH)/include/cairo -I$(GTK_PATH)/include/pango-1.0 -I$(GTK_PATH)/include/glib-2.0 -I$(GTK_PATH)/lib/glib-2.0/include -I$(GTK_PATH)/include/cairo -I$(GTK_PATH)/include/gdk-pixbuf-2.0 -I$(GTK_PATH)/include -I$(R_HOME)/include PKG_LIBS=-L$(GTK_PATH)/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgdk_pixbuf-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lintl -lws2_32 cairoDevice/NAMESPACE0000644000175100001440000000005612560123113013717 0ustar hornikusersexportPattern("^[^\\.]") import("grDevices") cairoDevice/demo/0000755000175100001440000000000012560123113013423 5ustar hornikuserscairoDevice/demo/lattice.R0000644000175100001440000000161712560123113015200 0ustar hornikuserslibrary(cairoDevice) Cairo() require(lattice) require(stats) Depth <- equal.count(quakes$depth, number = 8, overlap = 0.1) xyplot(lat ~ long | Depth, data = quakes) update(trellis.last.object(), aspect = "iso") EE <- equal.count(ethanol$E, number = 9, overlap = 1/4) xyplot(NOx ~ C | EE, data = ethanol, prepanel = function(x, y) prepanel.loess(x, y, span = 1), xlab = "Compression Ratio", ylab = "NOx (micrograms/J)", panel = function(x, y) { panel.grid(h=-1, v= 2); panel.xyplot(x, y); panel.loess(x,y, span=1); }, aspect = "xy") plot <- xyplot(sunspot.year ~ 1700:1988, xlab = "", type = "l", scales = list(x = list(alternating = 2)), main = "Yearly Sunspots") print(plot, position = c(0, .3, 1, .9), more = TRUE) print(update(plot, aspect = "xy", main = "", xlab = "Year"), position = c(0, 0, 1, .3)) cairoDevice/demo/embedded.R0000644000175100001440000000014212560123113015274 0ustar hornikusersrequire(RGtk2) win <- gtkWindow() da <- gtkDrawingArea() win$add(da) asCairoDevice(da) plot(1:10) cairoDevice/demo/00Index0000644000175100001440000000023112560123113014551 0ustar hornikusersdefault The default R graphics demo, for the Cairo device lattice Demo for the lattice package, Cairo style embedded Simple embedded plot in a GtkWindow cairoDevice/demo/default.R0000644000175100001440000000705412560123113015200 0ustar hornikusersrequire(cairoDevice) Cairo() if (dev.cur() <= 1) get(getOption("device"))() opar <- par(ask = interactive() && (.Device %in% c("X11", "GTK", "gnome", "windows", "quartz", "Cairo"))) x <- rnorm(50) opar <- c(opar, par(bg = "white")) plot(x, ann = FALSE, type = "n") abline(h = 0, col = gray(0.9)) lines(x, col = "green4", lty = "dotted") points(x, bg = "limegreen", pch = 21) title(main = "Simple Use of Color In a Plot", xlab = "Just a Whisper of a Label", col.main = "blue", col.lab = gray(0.8), cex.main = 1.2, cex.lab = 1, font.main = 4, font.lab = 3) par(bg = "gray") pie(rep(1, 24), col = rainbow(24), radius = 0.9) title(main = "A Sample Color Wheel", cex.main = 1.4, font.main = 3) title(xlab = "(Use this as a test of monitor linearity)", cex.lab = 0.8, font.lab = 3) pie.sales <- c(0.12, 0.3, 0.26, 0.16, 0.04, 0.12) names(pie.sales) <- c("Blueberry", "Cherry", "Apple", "Boston Cream", "Other", "Vanilla Cream") pie(pie.sales, col = c("purple", "violetred1", "green3", "cornsilk", "cyan", "white")) title(main = "January Pie Sales", cex.main = 1.8, font.main = 1) title(xlab = "(Don't try this at home kids)", cex.lab = 0.8, font.lab = 3) par(bg = "cornsilk") n <- 10 g <- gl(n, 100, n * 100) x <- rnorm(n * 100) + sqrt(as.numeric(g)) boxplot(split(x, g), col = "lavender", notch = TRUE) title(main = "Notched Boxplots", xlab = "Group", font.main = 4, font.lab = 1) par(bg = "white") n <- 100 x <- c(0, cumsum(rnorm(n))) y <- c(0, cumsum(rnorm(n))) xx <- c(0:n, n:0) yy <- c(x, rev(y)) plot(xx, yy, type = "n", xlab = "Time", ylab = "Distance") polygon(xx, yy, col = "gray") title("Distance Between Brownian Motions") x <- c(0, 0.4, 0.86, 0.85, 0.69, 0.48, 0.54, 1.09, 1.11, 1.73, 2.05, 2.02) par(bg = "lightgray") plot(x, type = "n", axes = FALSE, ann = FALSE) usr <- par("usr") rect(usr[1], usr[3], usr[2], usr[4], col = "cornsilk", border = "black") lines(x, col = "blue") points(x, pch = 21, bg = "lightcyan", cex = 1.25) axis(2, col.axis = "blue", las = 1) axis(1, at = 1:12, lab = month.abb, col.axis = "blue") box() title(main = "The Level of Interest in R", font.main = 4, col.main = "red") title(xlab = "1996", col.lab = "red") par(bg = "cornsilk") x <- rnorm(1000) hist(x, xlim = range(-4, 4, x), col = "lavender", main = "") title(main = "1000 Normal Random Variates", font.main = 3) pairs(iris[1:4], main = "Edgar Anderson's Iris Data", font.main = 4, pch = 19) pairs(iris[1:4], main = "Edgar Anderson's Iris Data", pch = 21, bg = c("red", "green3", "blue")[unclass(iris$Species)]) x <- 10 * 1:nrow(volcano) y <- 10 * 1:ncol(volcano) l <- pretty(range(volcano), 10) par(bg = "lightcyan") pin <- par("pin") xdelta <- diff(range(x)) ydelta <- diff(range(y)) xscale <- pin[1]/xdelta yscale <- pin[2]/ydelta scale <- if (xscale < yscale) xscale else yscale xadd <- 0.5 * (pin[1]/scale - xdelta) yadd <- 0.5 * (pin[2]/scale - ydelta) plot(numeric(0), numeric(0), xlim = range(x) + c(-1, 1) * xadd, ylim = range(y) + c(-1, 1) * yadd, type = "n", ann = FALSE) usr <- par("usr") rect(usr[1], usr[3], usr[2], usr[4], col = "green3") contour(x, y, volcano, levels = l, col = "yellow", lty = "solid", add = TRUE) box() title("A Topographic Map of Maunga Whau", font = 4) title(xlab = "Meters North", ylab = "Meters West", font = 3) mtext("10 Meter Contour Spacing", side = 3, line = 0.35, outer = FALSE, at = mean(par("usr")[1:2]), cex = 0.7, font = 3) par(bg = "cornsilk") coplot(lat ~ long | depth, data = quakes, pch = 21, bg = "green3") par(opar) cairoDevice/R/0000755000175100001440000000000012633267004012711 5ustar hornikuserscairoDevice/R/cairoDevice.R0000644000175100001440000000370612560123113015246 0ustar hornikusersCairo <- function(width = 7, height = 7, pointsize = 12, surface = c("screen", "png", "pdf", "ps", "svg"), filename = NULL) { if (missing(surface) && !missing(filename)) surface <- tolower(gsub(".*\\.", "", basename(filename))) surface <- match.arg(surface) if (missing(filename) && surface != "screen") filename <- paste("Rplots", surface, sep=".") surface_info <- c(surface, filename) .C("do_Cairo", as.numeric(width), as.numeric(height), as.numeric(pointsize), as.character(surface_info), PACKAGE="cairoDevice") return(invisible(TRUE)) } Cairo_png <- function(filename, width = 7, height = 7, pointsize = 12) { Cairo(width, height, pointsize, "png", filename) } Cairo_pdf <- function(filename, width = 7, height = 7, pointsize = 12) { Cairo(width, height, pointsize, "pdf", filename) } Cairo_ps <- function(filename, width = 7, height = 7, pointsize = 12) { Cairo(width, height, pointsize, "ps", filename) } Cairo_svg <- function(filename, width = 7, height = 7, pointsize = 12) { Cairo(width, height, pointsize, "svg", filename) } asCairoDevice <- function(widget, pointsize = 12, width = 500, height = 500) { w <- -1 h <- -1 if (inherits(widget, "GtkPrintContext")) { w <- widget$getWidth() h <- widget$getHeight() widget <- widget$getCairoContext() } else if (inherits(widget, "Cairo")) { stopifnot(width >= 0) stopifnot(height >= 0) w <- as.numeric(width) h <- as.numeric(height) } else if (!inherits(widget, "GtkDrawingArea") && !inherits(widget, "GdkDrawable")) { stop("Object being used as a Cairo Device must be a GtkDrawingArea, ", "GdkDrawable, GtkPrintContext or Cairo context") } if (!inherits(widget, "Cairo") && (!missing(width) || !missing(height))) stop("'width' and 'height' ignored unless 'widget' is a Cairo context") .Call("do_asCairoDevice", widget, as.numeric(pointsize), w, h, PACKAGE="cairoDevice") } cairoDevice/R/zzz.R0000644000175100001440000000724012633266551013702 0ustar hornikusers.onLoad <- function(libname, pkgname) { if (.Platform$OS.type == "windows") { dllpath <- file.path(.windows_gtk_path(), "bin") dll <- try(library.dynam("cairoDevice", pkgname, libname, DLLpath = dllpath), silent = getOption("verbose")) } else dll <- try(library.dynam("cairoDevice", pkgname, libname), silent = getOption("verbose")) if (is.character(dll)) { warning("Failed to load cairoDevice, attempting to install it", dll) .install_system_dependencies() return() } #library.dynam("cairoDevice", pkgname, libname) .C("loadGTK", success = logical(1), PACKAGE="cairoDevice") # register device as being interactive deviceIsInteractive("Cairo") } .closeDevices <- function() { devices <- dev.list() gtk.devices <- devices[names(devices)=="Cairo"] if(length(gtk.devices) > 0) { dev.off(gtk.devices) } } .onUnload <- function(libpath) { .closeDevices() .C("cleanupGTK", PACKAGE = "cairoDevice") library.dynam.unload("cairoDevice", libpath) } .windows_gtk_path <- function() file.path(system.file(package = "cairoDevice"), "gtk", .Platform$r_arch) .install_system_dependencies <- function() { windows32_config <- list( source = FALSE, gtk_url = "http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.22/gtk+-bundle_2.22.1-20101227_win32.zip", installer = function(path) { gtk_path <- .windows_gtk_path() ## unzip does this, but we want to see any warnings dir.create(gtk_path, recursive = TRUE) utils::unzip(path, exdir = gtk_path) } ) windows64_config <- windows32_config windows64_config$gtk_url <- "http://ftp.gnome.org/pub/gnome/binaries/win64/gtk+/2.22/gtk+-bundle_2.22.1-20101229_win64.zip" darwin_config <- list( source = FALSE, gtk_url = "http://r.research.att.com/libs/GTK_2.18.5-X11.pkg", installer = function(path) { system(paste("open", path)) } ) unix_config <- NULL gtk_web <- "http://www.gtk.org" install_system_dep <- function(dep_name, dep_url, dep_web, installer) { if (!interactive()) { message("Please install ", dep_name, " from ", dep_url) return() } choice <- utils::menu(paste(c("Install", "Do not install"), dep_name), T, paste("Need", dep_name, "? (Restart R after installing)")) if (choice == 1) { path <- file.path(tempdir(), basename(sub("\\?.*", "", dep_url))) if (utils::download.file(dep_url, path, mode="wb") > 0) stop("Failed to download ", dep_name) installer(path) } message("Learn more about ", dep_name, " at ", dep_web) } install_all <- function() { if (.Platform$OS.type == "windows") { if (.Platform$r_arch == "i386") config <- windows32_config else config <- windows64_config } else if (length(grep("darwin", R.version$platform))) config <- darwin_config else config <- unix_config if (is.null(config)) stop("This platform is not yet supported by the automatic installer. ", "Please install GTK+ manually, if necessary. See: ", gtk_web) install_system_dep("GTK+", config$gtk_url, gtk_web, config$installer) } install_all() message("If the package still does not load, please ensure that GTK+ is", " installed and that it is on your PATH environment variable") message("IN ANY CASE, RESTART R BEFORE TRYING TO LOAD THE PACKAGE AGAIN") } cairoDevice/MD50000644000175100001440000000161512633311730013017 0ustar hornikusersce8ae54ff29f2074bd257d9a776d95a0 *DESCRIPTION 9f7181735293bf626569cdc1a007ecde *NAMESPACE e0552f1b54abde80dc823f0d9039916d *R/cairoDevice.R 8e3c91973d8f1e561f6e0ac6dfa1073e *R/zzz.R 5b41a31b13ddd6bcf77c547569f90880 *cleanup 984b1756011c571625a483739dd1a9e1 *configure 06d8917aa325a0cf19c081b84b5bc653 *configure.in 8c164fdfb73f2796f22ff9ba4ae7de26 *configure.win 935a2362e775987ad2918af2ecb24123 *demo/00Index d29eb55ebba2b8254a4adc231d6e5bb3 *demo/default.R 6e53046bdc5f02039df83cd375b75307 *demo/embedded.R 1949bc2afa848d05c28aa4c27fd2aee4 *demo/lattice.R 4fce9db4e215af43cf6673d2275b3940 *man/Cairo.Rd bcb3bbedab55adb80f00ca2b11b664e4 *man/asCairoDevice.Rd d1ca0a451f0a1cab45cc73fa51f5a0cd *src/Makevars.in 600cf87bb0941392b4577956d7f5ed49 *src/Makevars.win 0b4e76dc30c53d2ec8a8b35af9d6671d *src/cairoDevice.c e9bacad415578fff9315e00e61549e0c *src/cairoDevice.h 303c2a8c73c1fbbd230dbac85ce2f874 *src/gtk.c cairoDevice/DESCRIPTION0000644000175100001440000000155612633311730014221 0ustar hornikusersPackage: cairoDevice Version: 2.23 Title: Embeddable Cairo Graphics Device Driver Author: Michael Lawrence Depends: R (>= 2.12.0) Imports: grDevices SystemRequirements: cairo (>= 1.0) Maintainer: Michael Lawrence Description: This device uses Cairo and GTK to draw to the screen, file (png, svg, pdf, and ps) or memory (arbitrary GdkDrawable or Cairo context). The screen device may be embedded into RGtk2 interfaces and supports all interactive features of other graphics devices, including getGraphicsEvent(). Acknowledgements: Lyndon Drake (based on gtkDevice), Brian Ripley (updates for R 2.7), Mikhail Kondrin (Adobe->UTF8 translation), Duncan Murdoch (updates for R 2.12) License: GPL NeedsCompilation: yes Packaged: 2015-12-13 13:09:24 UTC; larman Repository: CRAN Date/Publication: 2015-12-13 16:50:48 cairoDevice/configure0000755000175100001440000020171712560123113014416 0ustar hornikusers#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.59. # # Copyright (C) 2003 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` exec 6>&1 # # Initializations. # ac_default_prefix=/usr/local ac_config_libobj_dir=. cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Maximum number of lines to put in a shell here document. # This variable seems obsolete. It should probably be removed, and # only ac_max_sed_lines should be used. : ${ac_max_here_lines=38} # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= ac_unique_file="src/cairoDevice.c" ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS PKG_CONFIG GTK_CPPFLAGS GTK_LIBS LIBOBJS LTLIBOBJS' ac_subst_files='' # Initialize some variables set by options. ac_init_help= ac_init_version=false # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_option in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir=$ac_optarg ;; -disable-* | --disable-*) ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` eval "enable_$ac_feature=no" ;; -enable-* | --enable-*) ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid feature name: $ac_feature" >&2 { (exit 1); exit 1; }; } ac_feature=`echo $ac_feature | sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "enable_$ac_feature='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package| sed 's/-/_/g'` case $ac_option in *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; *) ac_optarg=yes ;; esac eval "with_$ac_package='$ac_optarg'" ;; -without-* | --without-*) ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid package name: $ac_package" >&2 { (exit 1); exit 1; }; } ac_package=`echo $ac_package | sed 's/-/_/g'` eval "with_$ac_package=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` eval "$ac_envvar='$ac_optarg'" export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi # Be sure to have absolute paths. for ac_var in exec_prefix prefix do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* | NONE | '' ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # Be sure to have absolute paths. for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ localstatedir libdir includedir oldincludedir infodir mandir do eval ac_val=$`echo $ac_var` case $ac_val in [\\/$]* | ?:[\\/]* ) ;; *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; };; esac done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_confdir=`(dirname "$0") 2>/dev/null || $as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$0" : 'X\(//\)[^/]' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$0" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then if test "$ac_srcdir_defaulted" = yes; then { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 { (exit 1); exit 1; }; } else { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi fi (cd $srcdir && test -r "./$ac_unique_file") 2>/dev/null || { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 { (exit 1); exit 1; }; } srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` ac_env_build_alias_set=${build_alias+set} ac_env_build_alias_value=$build_alias ac_cv_env_build_alias_set=${build_alias+set} ac_cv_env_build_alias_value=$build_alias ac_env_host_alias_set=${host_alias+set} ac_env_host_alias_value=$host_alias ac_cv_env_host_alias_set=${host_alias+set} ac_cv_env_host_alias_value=$host_alias ac_env_target_alias_set=${target_alias+set} ac_env_target_alias_value=$target_alias ac_cv_env_target_alias_set=${target_alias+set} ac_cv_env_target_alias_value=$target_alias # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] _ACEOF cat <<_ACEOF Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data [PREFIX/share] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --infodir=DIR info documentation [PREFIX/info] --mandir=DIR man documentation [PREFIX/man] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF _ACEOF fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. ac_popdir=`pwd` for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d $ac_dir || continue ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac cd $ac_dir # Check for guested configure; otherwise get Cygnus style configure. if test -f $ac_srcdir/configure.gnu; then echo $SHELL $ac_srcdir/configure.gnu --help=recursive elif test -f $ac_srcdir/configure; then echo $SHELL $ac_srcdir/configure --help=recursive elif test -f $ac_srcdir/configure.ac || test -f $ac_srcdir/configure.in; then echo $ac_configure --help else echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi cd $ac_popdir done fi test -n "$ac_init_help" && exit 0 if $ac_init_version; then cat <<\_ACEOF Copyright (C) 2003 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit 0 fi exec 5>config.log cat >&5 <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was $ $0 $@ _ACEOF { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` hostinfo = `(hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. echo "PATH: $as_dir" done } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_sep= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" # Get rid of the leading space. ac_sep=" " ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Be sure not to use single quotes in there, as some shells, # such as our DU 5.0 friend, will then `close' the trap. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, { (set) 2>&1 | case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in *ac_space=\ *) sed -n \ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" ;; *) sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------- ## ## Output files. ## ## ------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=$`echo $ac_var` echo "$ac_var='"'"'$ac_val'"'"'" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo sed "/^$/d" confdefs.h | sort echo fi test "$ac_signal" != 0 && echo "$as_me: caught signal $ac_signal" echo "$as_me: exit $exit_status" } >&5 rm -f core *.core && rm -rf conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo >confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { echo "$as_me:$LINENO: loading cache $cache_file" >&5 echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . $cache_file;; *) . ./$cache_file;; esac fi else { echo "$as_me:$LINENO: creating cache $cache_file" >&5 echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in `(set) 2>&1 | sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val="\$ac_cv_env_${ac_var}_value" eval ac_new_val="\$ac_env_${ac_var}_value" case $ac_old_set,$ac_new_set in set,) { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 echo "$as_me: former value: $ac_old_val" >&2;} { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 echo "$as_me: current value: $ac_new_val" >&2;} ac_cache_corrupted=: fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu for ac_prog in pkg-config do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo "$as_me:$LINENO: checking for $ac_word" >&5 echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 if test "${ac_cv_prog_PKG_CONFIG+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else if test -n "$PKG_CONFIG"; then ac_cv_prog_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_PKG_CONFIG="$ac_prog" echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done fi fi PKG_CONFIG=$ac_cv_prog_PKG_CONFIG if test -n "$PKG_CONFIG"; then echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5 echo "${ECHO_T}$PKG_CONFIG" >&6 else echo "$as_me:$LINENO: result: no" >&5 echo "${ECHO_T}no" >&6 fi test -n "$PKG_CONFIG" && break done if test -n "${PKG_CONFIG}"; then if (${PKG_CONFIG} --exists gtk+-2.0); then GTK_CPPFLAGS=`${PKG_CONFIG} --cflags gtk+-2.0` GTK_LIBS=`${PKG_CONFIG} --libs gtk+-2.0` else echo "ERROR: gtk+2.0 not found by pkg-config." exit 1 fi else echo "ERROR: Cannot find pkg-config." exit 1 fi ## Allow user to set extra preprocessor flags (e.g. -Wall) GTK_CPPFLAGS=${PKG_CPPFLAGS}" "${GTK_CPPFLAGS} ac_config_files="$ac_config_files src/Makevars" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, don't put newlines in cache variables' values. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. { (set) 2>&1 | case `(ac_space=' '; set | grep ac_space) 2>&1` in *ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n \ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" ;; esac; } | sed ' t clear : clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ : end' >>confcache if diff $cache_file confcache >/dev/null 2>&1; then :; else if test -w $cache_file; then test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" cat confcache >$cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/; s/:*\${srcdir}:*/:/; s/:*@srcdir@:*/:/; s/^\([^=]*=[ ]*\):*/\1/; s/:*$//; s/^[^=]*=[ ]*$//; }' fi # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then we branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. cat >confdef2opt.sed <<\_ACEOF t clear : clear s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\),-D\1=\2,g t quote s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\),-D\1=\2,g t quote d : quote s,[ `~#$^&*(){}\\|;'"<>?],\\&,g s,\[,\\&,g s,\],\\&,g s,\$,$$,g p _ACEOF # We use echo to avoid assuming a particular line-breaking character. # The extra dot is to prevent the shell from consuming trailing # line-breaks from the sub-command output. A line-break within # single-quotes doesn't work because, if this script is created in a # platform that uses two characters for line-breaks (e.g., DOS), tr # would break. ac_LF_and_DOT=`echo; echo .` DEFS=`sed -n -f confdef2opt.sed confdefs.h | tr "$ac_LF_and_DOT" ' .'` rm -f confdef2opt.sed ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_i=`echo "$ac_i" | sed 's/\$U\././;s/\.o$//;s/\.obj$//'` # 2. Add them. ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be Bourne compatible if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then set -o posix fi DUALCASE=1; export DUALCASE # for MKS sh # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # Work around bugs in pre-3.0 UWIN ksh. $as_unset ENV MAIL MAILPATH PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. for as_var in \ LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ LC_TELEPHONE LC_TIME do if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then eval $as_var=C; export $as_var else $as_unset $as_var fi done # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)$' \| \ . : '\(.\)' 2>/dev/null || echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } /^X\/\(\/\/\)$/{ s//\1/; q; } /^X\/\(\/\).*/{ s//\1/; q; } s/.*/./; q'` # PATH needs CR, and LINENO needs CR and PATH. # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then echo "#! /bin/sh" >conf$$.sh echo "exit 0" >>conf$$.sh chmod +x conf$$.sh if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then PATH_SEPARATOR=';' else PATH_SEPARATOR=: fi rm -f conf$$.sh fi as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" || { # Find who we are. Look in the path if we contain no path at all # relative or not. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} { (exit 1); exit 1; }; } fi case $CONFIG_SHELL in '') as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for as_base in sh bash ksh sh5; do case $as_dir in /*) if ("$as_dir/$as_base" -c ' as_lineno_1=$LINENO as_lineno_2=$LINENO as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` test "x$as_lineno_1" != "x$as_lineno_2" && test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } CONFIG_SHELL=$as_dir/$as_base export CONFIG_SHELL exec "$CONFIG_SHELL" "$0" ${1+"$@"} fi;; esac done done ;; esac # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line before each line; the second 'sed' does the real # work. The second script uses 'N' to pair each line-number line # with the numbered line, and appends trailing '-' during # substitution so that $LINENO is not a special case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) sed '=' <$as_myself | sed ' N s,$,-, : loop s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, t loop s,-$,, s,^['$as_cr_digits']*\n,, ' >$as_me.lineno && chmod +x $as_me.lineno || { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensible to this). . ./$as_me.lineno # Exit status is that of the last command. exit } case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in *c*,-n*) ECHO_N= ECHO_C=' ' ECHO_T=' ' ;; *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; *) ECHO_N= ECHO_C='\c' ECHO_T= ;; esac if expr a : '\(a\)' >/dev/null 2>&1; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file echo >conf$$.file if ln -s conf$$.file conf$$ 2>/dev/null; then # We could just check for DJGPP; but this test a) works b) is more generic # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). if test -f conf$$.exe; then # Don't use ln at all; we don't have any links as_ln_s='cp -p' else as_ln_s='ln -s' fi elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.file if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_executable_p="test -f" # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" # IFS # We need space, tab and new line, in precisely that order. as_nl=' ' IFS=" $as_nl" # CDPATH. $as_unset CDPATH exec 6>&1 # Open the log real soon, to keep \$[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. Logging --version etc. is OK. exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX } >&5 cat >&5 <<_CSEOF This file was extended by $as_me, which was generated by GNU Autoconf 2.59. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ _CSEOF echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 echo >&5 _ACEOF # Files that config.status was made for. if test -n "$ac_config_files"; then echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS fi if test -n "$ac_config_headers"; then echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS fi if test -n "$ac_config_links"; then echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS fi if test -n "$ac_config_commands"; then echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS fi cat >>$CONFIG_STATUS <<\_ACEOF ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTIONS] [FILE]... -h, --help print this help, then exit -V, --version print version number, then exit -q, --quiet do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.59, with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2003 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." srcdir=$srcdir _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # If no file are specified by the user, then we need to provide default # value. By we need to know if files were specified by the user. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "x$1" : 'x\([^=]*\)='` ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` ac_shift=: ;; -*) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; *) # This is not an option, so the user has probably given explicit # arguments. ac_option=$1 ac_need_defaults=false;; esac case $ac_option in # Handling of the options. _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --vers* | -V ) echo "$ac_cs_version"; exit 0 ;; --he | --h) # Conflict between --help and --header { { echo "$as_me:$LINENO: error: ambiguous option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: ambiguous option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; };; --help | --hel | -h ) echo "$ac_cs_usage"; exit 0 ;; --debug | --d* | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift CONFIG_FILES="$CONFIG_FILES $ac_optarg" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" ac_need_defaults=false;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 Try \`$0 --help' for more information." >&5 echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2;} { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF if \$ac_cs_recheck; then echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_config_target in $ac_config_targets do case "$ac_config_target" in # Handling of arguments. "src/Makevars" ) CONFIG_FILES="$CONFIG_FILES src/Makevars" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason to put it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Create a temporary directory, and hook for its removal unless debugging. $debug || { trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./confstat$$-$RANDOM (umask 077 && mkdir $tmp) } || { echo "$me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF # # CONFIG_FILES section. # # No need to generate the scripts if there are no CONFIG_FILES. # This happens for instance when ./config.status config.h if test -n "\$CONFIG_FILES"; then # Protect against being on the right side of a sed subst in config.status. sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF s,@SHELL@,$SHELL,;t t s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t s,@exec_prefix@,$exec_prefix,;t t s,@prefix@,$prefix,;t t s,@program_transform_name@,$program_transform_name,;t t s,@bindir@,$bindir,;t t s,@sbindir@,$sbindir,;t t s,@libexecdir@,$libexecdir,;t t s,@datadir@,$datadir,;t t s,@sysconfdir@,$sysconfdir,;t t s,@sharedstatedir@,$sharedstatedir,;t t s,@localstatedir@,$localstatedir,;t t s,@libdir@,$libdir,;t t s,@includedir@,$includedir,;t t s,@oldincludedir@,$oldincludedir,;t t s,@infodir@,$infodir,;t t s,@mandir@,$mandir,;t t s,@build_alias@,$build_alias,;t t s,@host_alias@,$host_alias,;t t s,@target_alias@,$target_alias,;t t s,@DEFS@,$DEFS,;t t s,@ECHO_C@,$ECHO_C,;t t s,@ECHO_N@,$ECHO_N,;t t s,@ECHO_T@,$ECHO_T,;t t s,@LIBS@,$LIBS,;t t s,@PKG_CONFIG@,$PKG_CONFIG,;t t s,@GTK_CPPFLAGS@,$GTK_CPPFLAGS,;t t s,@GTK_LIBS@,$GTK_LIBS,;t t s,@LIBOBJS@,$LIBOBJS,;t t s,@LTLIBOBJS@,$LTLIBOBJS,;t t CEOF _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF # Split the substitutions into bite-sized pieces for seds with # small command number limits, like on Digital OSF/1 and HP-UX. ac_max_sed_lines=48 ac_sed_frag=1 # Number of current file. ac_beg=1 # First line for current file. ac_end=$ac_max_sed_lines # Line after last line for current file. ac_more_lines=: ac_sed_cmds= while $ac_more_lines; do if test $ac_beg -gt 1; then sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag else sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag fi if test ! -s $tmp/subs.frag; then ac_more_lines=false else # The purpose of the label and of the branching condition is to # speed up the sed processing (if there are no `@' at all, there # is no need to browse any of the substitutions). # These are the two extra sed commands mentioned above. (echo ':t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed if test -z "$ac_sed_cmds"; then ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" else ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" fi ac_sed_frag=`expr $ac_sed_frag + 1` ac_beg=$ac_end ac_end=`expr $ac_end + $ac_max_sed_lines` fi done if test -z "$ac_sed_cmds"; then ac_sed_cmds=cat fi fi # test -n "$CONFIG_FILES" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". case $ac_file in - | *:- | *:-:* ) # input from stdin cat >$tmp/stdin ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; * ) ac_file_in=$ac_file.in ;; esac # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. ac_dir=`(dirname "$ac_file") 2>/dev/null || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` { if $as_mkdir_p; then mkdir -p "$ac_dir" else as_dir="$ac_dir" as_dirs= while test ! -d "$as_dir"; do as_dirs="$as_dir $as_dirs" as_dir=`(dirname "$as_dir") 2>/dev/null || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| \ . : '\(.\)' 2>/dev/null || echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } /^X\(\/\/\)[^/].*/{ s//\1/; q; } /^X\(\/\/\)$/{ s//\1/; q; } /^X\(\/\).*/{ s//\1/; q; } s/.*/./; q'` done test ! -n "$as_dirs" || mkdir $as_dirs fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. if test "$ac_dir" != .; then ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` # A "../" for each directory in $ac_dir_suffix. ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` else ac_dir_suffix= ac_top_builddir= fi case $srcdir in .) # No --srcdir option. We are building in place. ac_srcdir=. if test -z "$ac_top_builddir"; then ac_top_srcdir=. else ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` fi ;; [\\/]* | ?:[\\/]* ) # Absolute path. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ;; *) # Relative path. ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_builddir$srcdir ;; esac # Do not use `cd foo && pwd` to compute absolute paths, because # the directories may not exist. case `pwd` in .) ac_abs_builddir="$ac_dir";; *) case "$ac_dir" in .) ac_abs_builddir=`pwd`;; [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; *) ac_abs_builddir=`pwd`/"$ac_dir";; esac;; esac case $ac_abs_builddir in .) ac_abs_top_builddir=${ac_top_builddir}.;; *) case ${ac_top_builddir}. in .) ac_abs_top_builddir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; esac;; esac case $ac_abs_builddir in .) ac_abs_srcdir=$ac_srcdir;; *) case $ac_srcdir in .) ac_abs_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; esac;; esac case $ac_abs_builddir in .) ac_abs_top_srcdir=$ac_top_srcdir;; *) case $ac_top_srcdir in .) ac_abs_top_srcdir=$ac_abs_builddir;; [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; esac;; esac if test x"$ac_file" != x-; then { echo "$as_me:$LINENO: creating $ac_file" >&5 echo "$as_me: creating $ac_file" >&6;} rm -f "$ac_file" fi # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ if test x"$ac_file" = x-; then configure_input= else configure_input="$ac_file. " fi configure_input=$configure_input"Generated from `echo $ac_file_in | sed 's,.*/,,'` by configure." # First look for the input files in the build tree, otherwise in the # src tree. ac_file_inputs=`IFS=: for f in $ac_file_in; do case $f in -) echo $tmp/stdin ;; [\\/$]*) # Absolute (can't be DOS-style, as IFS=:) test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } echo "$f";; *) # Relative if test -f "$f"; then # Build tree echo "$f" elif test -f "$srcdir/$f"; then # Source tree echo "$srcdir/$f" else # /dev/null tree { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 echo "$as_me: error: cannot find input file: $f" >&2;} { (exit 1); exit 1; }; } fi;; esac done` || { (exit 1); exit 1; } _ACEOF cat >>$CONFIG_STATUS <<_ACEOF sed "$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s,@configure_input@,$configure_input,;t t s,@srcdir@,$ac_srcdir,;t t s,@abs_srcdir@,$ac_abs_srcdir,;t t s,@top_srcdir@,$ac_top_srcdir,;t t s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t s,@builddir@,$ac_builddir,;t t s,@abs_builddir@,$ac_abs_builddir,;t t s,@top_builddir@,$ac_top_builddir,;t t s,@abs_top_builddir@,$ac_abs_top_builddir,;t t " $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out rm -f $tmp/stdin if test x"$ac_file" != x-; then mv $tmp/out $ac_file else cat $tmp/out rm -f $tmp/out fi done _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi cairoDevice/man/0000755000175100001440000000000012560123113013252 5ustar hornikuserscairoDevice/man/asCairoDevice.Rd0000644000175100001440000000407612560123113016251 0ustar hornikusers\alias{asCairoDevice} \name{asCairoDevice} \title{Converting widgets and more to a Cairo graphics device} \description{Allows one to convert an arbitrary GTK+ widget (usually a \code{\link[RGtk2]{GtkDrawingArea}}), a \code{\link[RGtk2]{GdkDrawable}} (like a \code{\link[RGtk2]{GdkPixmap}}), a \code{GtkPrintContext} or a \code{Cairo} context to a Cairo graphics device, so that R plot commands draw to the given target.} \usage{asCairoDevice(widget, pointsize = 12, width = 500, height = 500)} \arguments{ \item{widget}{The \code{GtkWidget}, \code{GdkDrawable}, \code{GtkPrintContext}, or \code{Cairo} context, to which the R graphics are to be drawn} \item{pointsize}{The default font size in the R plot} \item{width}{Width in user coordinates, only used if \code{widget} is a Cairo context} \item{height}{Height in user coordinates, only used if \code{widget} is a Cairo context} } \details{ The main purpose of this function is to allow the user to embed an R plot in a GTK user interface constructed with RGtk2. Please see the examples in the RGtk2 package. Drawing to an offscreen \code{\link[RGtk2]{GdkPixmap}} is useful for buffering and transforming R graphics. For example, one could copy the pixmap to a \code{\link[RGtk2]{GdkPixbuf}} and add a watermark before saving as a gif, png, jpg, etc. One may also pass a \code{Cairo} context as the \code{widget} parameter. This allows targeting arbitary Cairo surfaces. Note that the context state is for the most part not cleared before plotting, so transformations, etc, will remain in effect. Unlike Cairo, the R graphics system requires bounds to be specified, which may be done through the \code{width} and \code{height} parameters. As a convenience, \code{GtkPrintContext} is also accepted as the \code{widget} parameter. This makes it easy to redirect R graphics to a printer selected and configured through the GTK+ printing dialogs. } \author{Michael Lawrence} \references{ \url{http://www.ggobi.org/rgtk2} \url{http://www.gtk.org/} \url{http://www.cairographics.org/} } \keyword{device} cairoDevice/man/Cairo.Rd0000644000175100001440000000415312560123113014601 0ustar hornikusers\alias{Cairo} \alias{Cairo_pdf} \alias{Cairo_ps} \alias{Cairo_svg} \alias{Cairo_png} \name{Cairo} \title{The Cairo Graphics Device} \description{Open an R graphics device based on the Cairo vector graphics library} \usage{ Cairo(width = 7, height = 7, pointsize = 12, surface = c("screen", "png", "pdf", "ps", "svg"), filename = NULL) Cairo_pdf(filename, width = 7, height = 7, pointsize = 12) Cairo_ps(filename, width = 7, height = 7, pointsize = 12) Cairo_svg(filename, width = 7, height = 7, pointsize = 12) Cairo_png(filename, width = 7, height = 7, pointsize = 12) } \arguments{ \item{width}{The (initial) width in inches} \item{height}{The (initial) height in inches} \item{pointsize}{The pointsize of the font} \item{surface}{One of \code{screen}, \code{pdf}, \code{ps}, \code{svg}, or \code{png}, indicating the cairo backend to use (the output format). If missing, inferred from extension of the \code{filename} argument. } \item{filename}{The output filename (used only by file surfaces, not the screen). If a file surface is specified but no filename is given, the filename defaults to Rplots.\code{SURFACE} where \code{SURFACE} is the name of the current surface type.} } \details{ Creates an R graphics device that draws to the specified Cairo surface. By default, this will draw to a GTK+ window on the screen, but it also outputs to pdf, ps, png, and svg files, depending on the capabilities of your cairo installation. This functions the same as any other R graphics device. You may use the conventional plot commands and expect essentially the same output, except that everything is anti-aliased (similar to other vector-based devices like Quartz). Alpha-blending is supported, as is enhanced interactivity via \code{\link[grDevices]{getGraphicsEvent}}. The device should work the same across all supported platforms (Mac, Windows, and Linux). } \seealso{\code{\link{asCairoDevice}} for embedding the device in an RGtk2 interface.} \author{Michael Lawrence} \references{ \url{http://www.cairographics.org/} } \examples{ Cairo() plot(1:10) dev.off() } \keyword{device} cairoDevice/configure.win0000644000175100001440000000001212560123113015170 0ustar hornikusers#! /bin/shcairoDevice/cleanup0000755000175100001440000000003512560123113014052 0ustar hornikusers#!/bin/sh rm -f src/Makevars