UNIXworkcode

1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. 3 * 4 * Copyright 2017 Olaf Wintermann. All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26 * POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include <stdio.h> 30 #include <stdlib.h> 31 32 #include "container.h" 33 34 #include "draw_cairo.h" 35 36 37 #if GTK_MAJOR_VERSION >= 3 38 static void ui_drawingarea_draw( 39 GtkDrawingArea *area, 40 cairo_t *cr, 41 int width, 42 int height, 43 gpointer data) 44 { 45 UiCairoGraphics g; 46 g.g.width = width; 47 g.g.height = height; 48 g.widget = GTK_WIDGET(area); 49 g.cr = cr; 50 51 UiDrawEvent *event = data; 52 UiEvent ev; 53 ev.obj = event->obj; 54 ev.window = event->obj->window; 55 ev.document = event->obj->ctx->document; 56 57 event->callback(&ev, &g.g, event->userdata); 58 } 59 #endif 60 61 #if UI_GTK3 62 gboolean ui_drawingarea_expose(GtkWidget *w, cairo_t *cr, void *data) { 63 int width = gtk_widget_get_allocated_width(w); 64 int height = gtk_widget_get_allocated_height(w); 65 ui_drawingarea_draw(GTK_DRAWING_AREA(w), cr, width, height, data); 66 return FALSE; 67 } 68 #endif 69 #ifdef UI_GTK2 70 gboolean ui_canvas_expose(GtkWidget *w, GdkEventExpose *e, void *data) { 71 UiCairoGraphics g; 72 g.g.width = w->allocation.width; 73 g.g.height = w->allocation.height; 74 g.widget = w; 75 g.cr = gdk_cairo_create(w->window); 76 77 UiDrawEvent *event = data; 78 UiEvent ev; 79 ev.obj = event->obj; 80 ev.window = event->obj->window; 81 ev.document = event->obj->ctx->document; 82 83 event->callback(&ev, &g.g, event->userdata); 84 85 return FALSE; 86 } 87 #endif 88 89 // function from graphics.h 90 91 void ui_connect_draw_handler(GtkWidget *widget, UiDrawEvent *event) { 92 #if GTK_MAJOR_VERSION >= 4 93 gtk_drawing_area_set_draw_func(GTK_DRAWING_AREA(widget), ui_drawingarea_draw, event, NULL); 94 #elif GTK_MAJOR_VERSION == 3 95 g_signal_connect(G_OBJECT(widget), 96 "draw", 97 G_CALLBACK(ui_drawingarea_expose), 98 event); 99 #else 100 g_signal_connect(G_OBJECT(widget), 101 "expose_event", 102 G_CALLBACK(ui_canvas_expose), 103 event); 104 #endif 105 } 106 107 108 PangoContext *ui_get_pango_context(UiGraphics *g) { 109 UiCairoGraphics *gr = (UiCairoGraphics*)g; 110 //return gtk_widget_get_pango_context(gr->widget); 111 return pango_cairo_create_context(gr->cr); 112 } 113 114 115 // drawing functions 116 void ui_graphics_color(UiGraphics *g, int red, int green, int blue) { 117 UiCairoGraphics *gr = (UiCairoGraphics*)g; 118 double dred = (double)red / (double)255; 119 double dgreen = (double)green / (double)255; 120 double dblue = (double)blue / (double)255; 121 cairo_set_source_rgb(gr->cr, dred, dgreen, dblue); 122 } 123 124 125 void ui_draw_line(UiGraphics *g, int x1, int y1, int x2, int y2) { 126 UiCairoGraphics *gr = (UiCairoGraphics*)g; 127 cairo_set_line_width(gr->cr, 1); 128 cairo_move_to(gr->cr, (double)x1 + 0.5, (double)y1 + 0.5); 129 cairo_line_to(gr->cr, (double)x2 + 0.5, (double)y2 + 0.5); 130 cairo_stroke(gr->cr); 131 } 132 133 void ui_draw_rect(UiGraphics *g, int x, int y, int w, int h, int fill) { 134 UiCairoGraphics *gr = (UiCairoGraphics*)g; 135 cairo_set_line_width(gr->cr, 1); 136 cairo_rectangle(gr->cr, x + 0.5, y + 0.5 , w, h); 137 if(fill) { 138 cairo_fill(gr->cr); 139 } else { 140 cairo_stroke(gr->cr); 141 } 142 } 143 144 void ui_draw_text(UiGraphics *g, int x, int y, UiTextLayout *text) { 145 UiCairoGraphics *gr = (UiCairoGraphics*)g; 146 cairo_move_to(gr->cr, x, y); 147 pango_cairo_show_layout(gr->cr, text->layout); 148 } 149 150