summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--areaplan.md34
1 files changed, 25 insertions, 9 deletions
diff --git a/areaplan.md b/areaplan.md
index 1247613..0296844 100644
--- a/areaplan.md
+++ b/areaplan.md
@@ -181,12 +181,16 @@ We can use `GtkDrawingArea`. We hook into the `draw` signal; it does something e
```go
func draw_callback(widget *C.GtkWidget, cr *C.cairo_t, data C.gpointer) C.gboolean {
+ var x, y, w, h C.double
+
s := (*sysData)(unsafe.Pointer(data))
- // TODO get clip rectangle that needs drawing
+ // thanks to desrt in irc.gimp.net/#gtk+
+ C.cairo_clip_extents(cr, &x, &y, &w, &h)
+ cliprect := image.Rect(int(x), int(y), int(w), int(h))
imgret := make(chan *image.NRGBA)
defer close(imgret)
s.paint <- PaintRequest{
- Rect: /* clip rect */,
+ Rect: cliprect,
Out: imgret,
}
i := <-imgret
@@ -201,21 +205,33 @@ func draw_callback(widget *C.GtkWidget, cr *C.cairo_t, data C.gpointer) C.gboole
nil, nil) // do not free data
C.gdk_cairo_set_source_pixbuf(cr,
pixbuf,
- /* x of clip rect */,
- /* y of clip rect */)
+ C.gdouble(cliprect.Min.X),
+ C.gdouble(cliprect.Min.Y))
+ C.g_object_unref((C.gpointer)(unsafe.Pointer(pixbuf))) // free pixbuf
return C.FALSE // TODO what does this return value mean? docs don't say
}
```
-TODO delete pixbuf
-
-TODO is the gdk-pixbuf alpha-premultiplied?
+[Example 1 on this page](https://developer.gnome.org/gdk-pixbuf/2.26/gdk-pixbuf-The-GdkPixbuf-Structure.html) indicates the pixels are in RGBA order, which is good.
-TODO verify pixel order
+On alpha premultiplication:
+```
+12:27 andlabs Hi. Is the pixel data fed to gdk-pixbuf alpha premultiplied, not alpha premultiplied, or is that settable? I need to feed it data from a source that doesn't know about the underlying rendering system. Thanks.
+12:29 *** KaL_out is now known as KaL
+12:29 desrt andlabs: pixbuf is non-premultiplied
+12:30 mclasen sad that this information is not obvious in the docs
+12:30 andlabs there is no information about premultiplied in any of the GTK+ documentation, period
+12:30 desrt andlabs: we have a utility function to copy it to a cairo surface that does the multiply for you...
+12:30 andlabs (in versions compatible with ubuntu 12.04, at least)
+12:31 andlabs good to know, thanks
+12:31 desrt andlabs: i think it's because gdkpixbuf existed before premultiplication was a wide practice
+12:31 desrt so at the time nobody would have asked the question
+12:31 andlabs huh
+```
TODO figure out how scrolling plays into this
-TODO double-check docs to see that the clip rect is cleared before the draw event is issued
+TODO "Note that GDK automatically clears the exposed area to the background color before sending the expose event" decide what to do for the other platforms
## Cocoa
For this one we **must** create a subclass of `NSView` that overrides the drawing and keyboard/mouse event messages.