Beispiel #1
0
func draw_selections(viewp, bufferp, crp unsafe.Pointer, mark_pairs []unsafe.Pointer) {
	view := (*C.GtkTextView)(viewp)
	buffer := (*C.GtkTextBuffer)(bufferp)
	cr := (*C.cairo_t)(crp)
	var alloc C.GtkAllocation
	C.gtk_widget_get_allocation((*C.GtkWidget)(viewp), &alloc)
	n := len(mark_pairs)
	var start_mark, stop_mark *C.GtkTextMark
	var location C.GdkRectangle
	var iter C.GtkTextIter
	var x, y C.gint
	var dx, dy C.double
	for i := 0; i < n; i += 2 {
		start_mark = (*C.GtkTextMark)(mark_pairs[i])
		C.gtk_text_buffer_get_iter_at_mark(buffer, &iter, start_mark)
		C.gtk_text_view_get_iter_location(view, &iter, &location)
		C.gtk_text_view_buffer_to_window_coords(view, C.GTK_TEXT_WINDOW_WIDGET, C.gint(location.x), C.gint(location.y), &x, &y)
		if C.int(x) > alloc.width || C.int(y) > alloc.height || x < 0 || y < 0 {
			continue
		}
		dx = C.double(x)
		dy = C.double(y)

		C.cairo_set_source_rgb(cr, 1, 0, 0)
		C.cairo_move_to(cr, dx, dy)
		C.cairo_set_line_width(cr, 2)
		C.cairo_line_to(cr, dx+6, dy)
		C.cairo_stroke(cr)

		C.cairo_move_to(cr, dx, dy)
		C.cairo_set_line_width(cr, 1)
		C.cairo_line_to(cr, dx, dy+C.double(location.height))
		C.cairo_stroke(cr)

		stop_mark = (*C.GtkTextMark)(mark_pairs[i+1])
		C.gtk_text_buffer_get_iter_at_mark(buffer, &iter, stop_mark)
		C.gtk_text_view_get_iter_location(view, &iter, &location)
		C.gtk_text_view_buffer_to_window_coords(view, C.GTK_TEXT_WINDOW_WIDGET, C.gint(location.x), C.gint(location.y), &x, &y)
		if C.int(x) > alloc.width || C.int(y) > alloc.height || x < 0 || y < 0 {
			continue
		}
		dx = C.double(x)
		dy = C.double(y)

		C.cairo_set_source_rgb(cr, 0, 1, 0)
		C.cairo_move_to(cr, dx, dy)
		C.cairo_set_line_width(cr, 1)
		C.cairo_line_to(cr, dx, dy+C.double(location.height))
		C.cairo_stroke(cr)

		C.cairo_move_to(cr, dx, dy+C.double(location.height))
		C.cairo_set_line_width(cr, 2)
		C.cairo_line_to(cr, dx-6, dy+C.double(location.height))
		C.cairo_stroke(cr)

	}
}
Beispiel #2
0
func (self *Surface) Stroke() {
	C.cairo_stroke(self.context)
}
Beispiel #3
0
// Stroke is a wrapper around cairo_stroke().
func (v *Context) Stroke() {
	C.cairo_stroke(v.native())
}
Beispiel #4
0
//Stroke strokes the current path according to the current line width,
//line join, line cap, and dash settings.
//
//After Stroke, the current path will be cleared from the cairo context.
//
//Degenerate segments and sub-paths are treated specially and provide a useful
//result.
//These can result in two different situations:
//
//1. Zero-length "on" segments set in SetDash.
//If the cap style is LineCapRound or LineCapSquare then these segments will be
//drawn as circular dots or squares respectively.
//In the case of LineCapSquare, the orientation of the squares is determined by
//the direction of the underlying path.
//
//2. A sub-path created by MoveTo followed by either a ClosePath or one or more
//calls to LineTo to the same coordinate as the MoveTo.
//If the cap style is LineCapRound then these sub-paths will be drawn as
//circular dots.
//Note that in the case of LineCapSquare a degenerate sub-path will not be drawn
//at all, as the correct orientation is indeterminate.
//
//In no case will a cap style of LineCapButt cause anything to be drawn in the
//case of either degenerate segments or sub-paths.
//
//Originally cairo_stroke.
func (c *Context) Stroke() *Context {
	C.cairo_stroke(c.c)
	return c
}
Beispiel #5
0
// Stroke the current path with the given color
func (i *Image) StrokeColor(col ...float64) {
	i.SetColor(col...)
	C.cairo_stroke(i.Ctx)
}