Hi!
This morning I came out with another simper solution for the STRAIGHT method!
It is very exciting!
The code I previously figured out was this:

/////////////////////////////////////// OLD CODE
cairo_save(cr);

// This part would retrieve the current passed surface and copy it on destimage
cairo_surface_t* dest=cairo_get_target(cr);
cairo_surface_flush(dest);
cairo_surface_t* destimage=cairo_surface_map_to_image(dest, NULL);

// Then using destimage width and height create newdest
int w=cairo_image_surface_get_width(destimage);
int h=cairo_image_surface_get_height(destimage);
cairo_surface_t* newdest=cairo_image_surface_create(CAIRO_FORMAT_ARGB32, w, h);

// Now I paint destimage to newdest with a 1.0 -alpha mask
cairo_t* destcr=cairo_create(newdest);
cairo_set_source_surface(destcr, destimage, 0, 0);
cairo_paint_with_alpha(destcr, 1.0-alpha);
cairo_destroy(destcr);

// Here I rewrite the newdest to destimage
destcr=cairo_create(destimage);
cairo_set_source_surface(destcr, newdest, 0, 0);
cairo_set_operator(destcr, CAIRO_OPERATOR_SOURCE);
cairo_paint(destcr);
cairo_destroy(destcr);

// and update the cr target (dest)
cairo_surface_unmap_image(dest, destimage);
cairo_surface_mark_dirty(dest);

// destroy and restore
cairo_surface_destroy(newdest);
cairo_restore(cr);

// Finally I paint with he ADD operator using alpha for the current
cairo_t commands
cairo_set_operator(cr, CAIRO_OPERATOR_ADD);
cairo_paint_with_alpha(cr, alpha);

////////////////////////////// OLD CODE - end

And I asked my self: Is there other way to fade out a given surface?
The solution I did was: extract image, paint with 1.0-alpha, paint
back and extract back.

I think that I can directly paint on the given surface without need to
map and unmap. Also I've found a way to fade out a surface in a single
operation:

// //////////////////////////////////// NEW CODE
// First save the context status
cairo_save(cr);

// Second paint with the DEST_IN operator.
// It would achieve the following result:
// aR=aA*aB
// xR=xB
// which is exactly to fade out the destination surface
// by the alpha of the source (1.0-alpha in this case)
cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0-alpha);
cairo_set_operator(cr, CAIRO_OPERATOR_DEST_IN);
cairo_paint(cr);

// Then restore the cairo context
cairo_restore(cr);

// Then paint using the ADD operator and the alpha value
cairo_set_operator(cr, CAIRO_OPERATOR_ADD);
cairo_paint_with_alpha(cr, alpha);
// //////////////////////////////////// NEW CODE end

I cannot test it right now, but I'm very excited on I have found a way
to perform the desired blending operation with atomic Cairo
instructions!!

Cheers!

2012/10/2 Carlos López González <[email protected]>:
> Thanks Konstantin. Your backing helps a lot.
>
> I've finally figured out how to emulate the STRAIGHT blend method
> operation in Cairo.
> It is an important milestone because I'm confident on being able to
> emulate the Synfig's
> blend methods that aren't directly supported by Cairo just using a
> combination of Cairo's operators.
> This means that the performance when blending can have the full
> benefit of use Cairo native API.
> It is possible that some of the Synfig's blend methods gets difficult
> to emulate or impossible but
> I hope they would be the less used.
>
> Cheers!
>
> 2012/9/29 Konstantin Dmitriev <[email protected]>:
>> 2012/9/29 Carlos López González <[email protected]>:
>>> Hi!
>>> I've added Cairo support for Shade and Bevel layers.
>>> Again the results are very similar but slightly slower. These kind of layers
>>> that manipulate pixels directly doesn't seem to improve much using Cairo
>>> colors. In fact they loose time doing some unwanted operations (due
>>> premultiplied and due to need to convert alpha to a 0-1 range) that doesn't
>>> compensate the supposed speed increase for handling unsigned char in memory.
>>>
>>> I've seen that there are room for some improvements in the Paste Canvas
>>> layer because in Cairo I didn't clip the Paste Canvas's canvas's context
>>> because I didn't understand what was doing the Software. Now that I know
>>> more about Cairo and that I understand what does Paste Canvas do, I could
>>> try to use clip in Cairo render and so the things should improve the speed
>>> for all the encapsulated layers that have defined boundaries.
>>
>> Hi, Carlos!
>> It's awesom to see such a progress.
>> >From some moment this week I've got a strong feeling that  the
>> finished cairo implementation is somewhere near, on the horizon. That
>> is awesome. Of course, there's still a lot of work, I understand. But
>> it will be such a significant step even if we will not gain desired
>> speed increase!
>> Please keep your hard work!
>> Thank you!
>> K.
>>
>>
>>
>> --
>> http://morevnaproject.org/
>>
>> ------------------------------------------------------------------------------
>> How fast is your code?
>> 3 out of 4 devs don\\\'t know how their code performs in production.
>> Find out how slow your code is with AppDynamics Lite.
>> http://ad.doubleclick.net/clk;262219672;13503038;z?
>> http://info.appdynamics.com/FreeJavaPerformanceDownload.html
>> _______________________________________________
>> Synfig-devl mailing list
>> [email protected]
>> https://lists.sourceforge.net/lists/listinfo/synfig-devl
>
>
>
> --
> Carlos
> http://synfig.org



-- 
Carlos
http://synfig.org

------------------------------------------------------------------------------
Don't let slow site performance ruin your business. Deploy New Relic APM
Deploy New Relic app performance management and know exactly
what is happening inside your Ruby, Python, PHP, Java, and .NET app
Try New Relic at no cost today and get our sweet Data Nerd shirt too!
http://p.sf.net/sfu/newrelic-dev2dev
_______________________________________________
Synfig-devl mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/synfig-devl

Reply via email to