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 #ifdef UI_GTK3 37 gboolean ui_drawingarea_expose(GtkWidget *w, cairo_t *cr, void *data) { 38 UiCairoGraphics g; 39 g.g.width = gtk_widget_get_allocated_width(w); 40 g.g.height = gtk_widget_get_allocated_height(w); 41 g.widget = w; 42 g.cr = cr; 43 44 UiDrawEvent *event = data; 45 UiEvent ev; 46 ev.obj = event->obj; 47 ev.window = event->obj->window; 48 ev.document = event->obj->ctx->document; 49 50 event->callback(&ev, &g.g, event->userdata); 51 52 return FALSE; 53 } 54 #else 55 gboolean ui_canvas_expose(GtkWidget *w, GdkEventExpose *e, void *data) { 56 UiCairoGraphics g; 57 g.g.width = w->allocation.width; 58 g.g.height = w->allocation.height; 59 g.widget = w; 60 g.cr = gdk_cairo_create(w->window); 61 62 UiDrawEvent *event = data; 63 UiEvent ev; 64 ev.obj = event->obj; 65 ev.window = event->obj->window; 66 ev.document = event->obj->ctx->document; 67 68 event->callback(&ev, &g.g, event->userdata); 69 70 return FALSE; 71 } 72 #endif 73 74 // function from graphics.h 75 76 void ui_connect_draw_handler(GtkWidget *widget, UiDrawEvent *event) { 77 #ifdef UI_GTK3 78 g_signal_connect(G_OBJECT(widget), 79 "draw", 80 G_CALLBACK(ui_drawingarea_expose), 81 event); 82 #else 83 g_signal_connect(G_OBJECT(widget), 84 "expose_event", 85 G_CALLBACK(ui_canvas_expose), 86 event); 87 #endif 88 } 89 90 91 PangoContext *ui_get_pango_context(UiGraphics *g) { 92 UiCairoGraphics *gr = (UiCairoGraphics*)g; 93 //return gtk_widget_get_pango_context(gr->widget); 94 return pango_cairo_create_context(gr->cr); 95 } 96 97 98 // drawing functions 99 void ui_graphics_color(UiGraphics *g, int red, int green, int blue) { 100 UiCairoGraphics *gr = (UiCairoGraphics*)g; 101 double dred = (double)red / (double)255; 102 double dgreen = (double)green / (double)255; 103 double dblue = (double)blue / (double)255; 104 cairo_set_source_rgb(gr->cr, dred, dgreen, dblue); 105 } 106 107 108 void ui_draw_line(UiGraphics *g, int x1, int y1, int x2, int y2) { 109 UiCairoGraphics *gr = (UiCairoGraphics*)g; 110 cairo_set_line_width(gr->cr, 1); 111 cairo_move_to(gr->cr, (double)x1 + 0.5, (double)y1 + 0.5); 112 cairo_line_to(gr->cr, (double)x2 + 0.5, (double)y2 + 0.5); 113 cairo_stroke(gr->cr); 114 } 115 116 void ui_draw_rect(UiGraphics *g, int x, int y, int w, int h, int fill) { 117 UiCairoGraphics *gr = (UiCairoGraphics*)g; 118 cairo_set_line_width(gr->cr, 1); 119 cairo_rectangle(gr->cr, x + 0.5, y + 0.5 , w, h); 120 if(fill) { 121 cairo_fill(gr->cr); 122 } else { 123 cairo_stroke(gr->cr); 124 } 125 } 126 127 void ui_draw_text(UiGraphics *g, int x, int y, UiTextLayout *text) { 128 UiCairoGraphics *gr = (UiCairoGraphics*)g; 129 cairo_move_to(gr->cr, x, y); 130 pango_cairo_show_layout(gr->cr, text->layout); 131 } 132 133