On Mon, 9 Jul 2007 19:20:57 -0300 "Andre Magalhaes" <[EMAIL PROTECTED]>
babbled:

> Hey Raster,
> 
> On 7/9/07, The Rasterman Carsten Haitzler <[EMAIL PROTECTED]> wrote:
> > On Fri, 6 Jul 2007 18:00:08 -0300 "Andre Magalhaes" <[EMAIL PROTECTED]>
> > babbled:
> >
> > > Hi all,
> > >
> > > As this is my first post here, let me introduce myself. I am Andre
> > > Moreira Magalhaes, aka andrunko, and I work for INdT in Brazil.
> >
> > hey andre :)
> >
> > > Now let's go to the point. I am working on a project that requires
> > > that an Evas_Object to have a custom click area. This object is a
> > > non-retangular object (a circle for eg) with a transparent backgroung.
> > > When i click on the background of this object, if the click was in a
> > > transparent area this object shouldn't receive any event. I was
> > > investigating the Evas code and i found 3 ways that this could be
> > > done.
> >
> > currently evas doesn't do this. in theory it could - but it doesn't.
> >
> > > 1 - Change evas_object_was_in_output_rect to always return 0 if the
> > > rect is in a transparent area of the object (not desired)
> > > 2 - Change evas_object_event_callback_call to return a boolean value
> > > indicating if the object handled the event and if not, keep sending
> > > event to the other objects in the list. If the object handled the
> > > event, stop there. This would require a lot of changes.
> > > 3 - Change evas_object_was_in_output_rect to check a for a custom
> > > "in_output_rect" method on the object, and if this method is set, use
> > > it to check if the rect is in output rect. This would require a new
> > > function, evas_object_is_in_output_rect_cb_set (or something similar)
> > > that could be implemented whenever is needed. If this method is not
> > > set, check the clip rectangle as it's done today.
> >
> > actually i already designed for this. there is an is_inside and was_inside
> > method for objects. only line and polygon objects provide them and they just
> > return 1 - these CAN be called if a point is inside the object rect and the
> > code wants to determine if an event is still inside the object based on
> > private object data (eg polygon outline, image pixel alpha channel data
> > etc.). right now it basically isn't used - but its intent was to be used
> > for this. the problem is this is actually relatively slow/expensive to do.
> > you probably also want a way of enabling or disabling this level of event
> > processing per object to save cost. so we probably need to add an object
> > flag to use these methods, if they exist, or disable them (disabled by
> > default), then provide methods for image objects at the least - then
> > actually use them, if they are provided, and the flag is enabled for that
> > object. implementing this won't be too hrd, but it won't be trivial. you
> > need to be able to figure otu any x,y co-ord within the object and what
> > pixel of the image that may map to based on paremeters of the object, then
> > go check that pixel's alpha channel (if the image has an alpha channel).
> > for polygon nd line objects you need to do some half-plane point
> > intersection math (easy but its order(n) where n is the number of sides of
> > the polygon). for lines its strange - you might want perfect inclusion, but
> > that's a very small space unless its a thick line (doesn't exist
> > currently). for text... thats hard as you need to figure out what character
> > is in that x,y (that's easy) and then check the character glyph pixels to
> > see if its inside...
> >
> > but anyway - i added this mechanism in at the very start but have never
> > used it (or really needed it enough to implement the rest of it).
> hmmm, i didn't know about this is_inside method, it's similar to what

not surprising. it's hidden away for "one day when i might want to use it" :)

> i wanted but with some improvements :D. Attached there is a patch to
> implement it on evas_object_image and edje, and a callback to
> enable/disable it. I didn't like the name convention but this is
> something easy to change. I tested it here and it seems to be working.
> This is my first patch to evas, so please let me know where i can
> improve. Any comment is welcome

you seem to have only implemented the evas-side of using this method and a very
simple/primitive "get pixel" in evas_object_image_is_inside (). This doesn't
handle border scaling and any form of fills other than "Scaling" fills. i think
you really need to implement this - you need to take the x,y in
canvas-co-ordinates, then convert this to a, x,y in the pixel array for the
image (remember there is a fill origin and size so the image may get scaled
differently to the size of the object, also its original can be offset. also
there is border scaling that removes scaling for specified edges of the image
that you need to account for in converting the canvas co-ord x,y into a pixel
x,y reference).

and as gustavo mentioned - this only covers argb32 images - doesn't handle yuv
(though yuv will ALWAYS be "in" as there is no alpha channel so you can detect
this and skip the check and return 1), and the 16bpp engine images too... alpha
is a separate plane at the end.

> > > In the current code, i could do repeat_events=1 to make both objects
> > > receive the event, and do nothing on the circle object if the clicked
> > > area is a transparent area. The problem is that this won't work for
> > > the lower widget, as it's always receive the event, even if the circle
> > > handled it.
> >
> > see above - also add a flag to edje to enable or disable this event
> > processing and bingo... all done. :)
> >
> > > Any other ideas on how to do it? I am willing to write a patch if you
> > > agree. I would vote for number 3, as it's extensible, does not require
> > > a lot of changes and does not impact on performance in the default
> > > case (no custom is_in_output_rect method).
> >
> > none of the above - see my suggestion :)
> >
> > > Any help is appreciate,
> > > BR
> > > Andrunko
> > >
> > > -------------------------------------------------------------------------
> > > This SF.net email is sponsored by DB2 Express
> > > Download DB2 Express C - the FREE version of DB2 express and take
> > > control of your XML. No limits. Just data. Click to get it now.
> > > http://sourceforge.net/powerbar/db2/
> > > _______________________________________________
> > > enlightenment-devel mailing list
> > > enlightenment-devel@lists.sourceforge.net
> > > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
> > >
> >
> >
> > --
> > ------------- Codito, ergo sum - "I code, therefore I am" --------------
> > The Rasterman (Carsten Haitzler)    [EMAIL PROTECTED]
> > 裸好多
> > Tokyo, Japan (東京 日本)
> >
> 
> BR
> Andrunko
> 


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    [EMAIL PROTECTED]
裸好多
Tokyo, Japan (東京 日本)

-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to