[cairo] Hit detect surface?



This talk about GnomeCanvas needing complicated hit detection made me wonder if Cairo could support hit detection. This could be done with an entire new surface type and thus not affect any existing cairo backends. As I see it it would work something like this:

1. Program creates or reuses the hit-detect surface. This acts like an image surface of exactly one pixel. Program uses a surface-specific function to set a callback pointer.

2. Program adds a transformation so that the region of interest is transformed to the square 0,0..1,1.

3. Program uses any Cairo calls it wants to draw into this surface.

4. All attempts to modify the one pixel do the callback function, giving it the source color, the mask, and the op used, and possibly other information.

This can be used to see if some arbitrary Cairo code draws anything (or anything non-transparent) in a parallelogram-shaped region. To do accurate hit detection the caller should loop, using smaller areas each time, until only one object is hit or a minimum size is reached.

I'm not sure when exactly it should do the callback function. I think it should not call it if the pixel is clipped, or is outside the path, or the mask is zero. It should call it if the source color is zero, so that clicking on transparent parts of images works. It should also call it (with zero alpha) for any clear pixels inside the bounding boxes of glyphs, allowing the program to click on lines of text or letters themselves. However it could do the callback on *every* call, provided enough information is provided so the callback can ignore things that are outside the region of interest.



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]