% PLcairo port of 'curve rectangle' sample code at http://cairographics.org/samples/. % The original C code snippets are considered to be part of the public domain. % Keri Harris , 2015. :- use_module(library(plgi)). :- use_module(library(plcairo)). :- plgi_use_namespace('Gtk'). on_draw_event(DrawingArea, CairoContext, _UserData, false) :- gtk_widget_get_allocated_width(DrawingArea, Width), gtk_widget_get_allocated_height(DrawingArea, Height), RectWidth is Width-25.6*2, RectHeight is Height-25.6*2, Radius = 102.4, X0 = 25.6, Y0 = 25.6, XR0 is X0+Radius, YR0 is Y0+Radius, X1 is Width-X0, Y1 is Height-Y0, XR1 is X1-Radius, YR1 is Y1-Radius, XC is Width/2, YC is Height/2, ( RectWidth/2 < Radius -> ( RectHeight/2 < Radius -> cairo_move_to(CairoContext, X0, YC), cairo_curve_to(CairoContext, X0, Y0, X0, Y0, XC, Y0), cairo_curve_to(CairoContext, X1, Y0, X1, Y0, X1, YC), cairo_curve_to(CairoContext, X1, Y1, X1, Y1, XC, Y1), cairo_curve_to(CairoContext, X0, Y1, X0, Y1, X0, YC) ; cairo_move_to(CairoContext, X0, YR0), cairo_curve_to(CairoContext, X0, Y0, X0, Y0, XC, Y0), cairo_curve_to(CairoContext, X1, Y0, X1, Y0, X1, YR0), cairo_line_to(CairoContext, X1, YR1), cairo_curve_to(CairoContext, X1, Y1, X1, Y1, XC, Y1), cairo_curve_to(CairoContext, X0, Y1, X0, Y1, X0, YR1) ) ; ( RectHeight/2 < Radius -> cairo_move_to(CairoContext, X0, YC), cairo_curve_to(CairoContext, X0, Y0, X0, Y0, XR0, Y0), cairo_line_to(CairoContext, XR1, Y0), cairo_curve_to(CairoContext, X1, Y0, X1, Y0, X1, YC), cairo_curve_to(CairoContext, X1, Y1, X1, Y1, XR1, Y1), cairo_line_to(CairoContext, XR0, Y1), cairo_curve_to(CairoContext, X0, Y1, X0, Y1, X0, YC) ; cairo_move_to(CairoContext, X0, YR0), cairo_curve_to(CairoContext, X0, Y0, X0, Y0, XR0, Y0), cairo_line_to(CairoContext, XR1, Y0), cairo_curve_to(CairoContext, X1, Y0, X1, Y0, X1, YR0), cairo_line_to(CairoContext, X1, YR1), cairo_curve_to(CairoContext, X1, Y1, X1, Y1, XR1, Y1), cairo_line_to(CairoContext, XR0, Y1), cairo_curve_to(CairoContext, X0, Y1, X0, Y1, X0, YR1) ) ), cairo_close_path(CairoContext), cairo_set_source_rgb(CairoContext, 0.5, 0.5, 1.0), cairo_fill_preserve(CairoContext), cairo_set_source_rgba(CairoContext, 0.5, 0.0, 0.0, 0.5), cairo_set_line_width(CairoContext, 10.0), cairo_stroke(CairoContext). main :- gtk_window_new('GTK_WINDOW_TOPLEVEL', Window), gtk_window_set_title(Window, 'Curve Rectangle'), gtk_window_set_default_size(Window, 256, 256), gtk_drawing_area_new(DrawingArea), gtk_container_add(Window, DrawingArea), g_signal_connect(DrawingArea, 'draw', on_draw_event/4, {null}, _), g_signal_connect(Window, 'destroy', gtk_main_quit/0, {null}, _), gtk_widget_show_all(Window), gtk_main, halt. :- main.