[cairo] why cairo is so slow on Windows, is there any plan to improve cairo performance on Windows?
Rainman Lee
rainman.lee at gmail.com
Mon Jun 29 20:34:22 PDT 2009
I tried, it was more slower.....here is my test code
HDC hdc = GetDC(m_hWnd);
RECT rcClient; GetClientRect(m_hWnd, &rcClient);
// create all drawing surfaces
cairo_surface_t* srcSurface = cairo_image_surface_create_from_png("ren.png");
cairo_surface_t* bufSurface =
cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1440, 900);
cairo_surface_t* tarSurface = cairo_win32_surface_create(hdc);
// create all drawing contexts
cairo_t* bufContext = cairo_create(bufSurface);
cairo_t* tarContext = cairo_create(tarSurface);
// create source pattern
cairo_pattern_t* srcPattern = cairo_pattern_create_for_surface(srcSurface);
cairo_pattern_set_filter(srcPattern, CAIRO_FILTER_FAST);
// initialize the buffer context
cairo_translate(bufContext, 600, 300);
cairo_set_antialias(bufContext, CAIRO_ANTIALIAS_NONE);
double angle = M_PI / 180;
for (int i = 0; i < 360; i++)
{
// paint on the buffer
cairo_rotate(bufContext, angle);
cairo_set_source(bufContext, srcPattern);
cairo_paint(bufContext);
// then fill the target with buffer
// no rotation
cairo_rectangle(tarContext, 0, 0, rcClient.right, rcClient.bottom);
cairo_set_source_surface(tarContext, bufSurface, 0, 0);
cairo_fill(tarContext);
}
// destroy the source pattern
cairo_pattern_destroy(srcPattern);
// destroy all drawing contexts
cairo_destroy(bufContext);
cairo_destroy(tarContext);
// destory all drawing surfaces
cairo_surface_destroy(srcSurface);
cairo_surface_destroy(bufSurface);
cairo_surface_destroy(tarSurface);
ReleaseDC(m_hWnd, hdc);
Is there any code I can optimize?
Thank you!
Rainman
On Tue, Jun 30, 2009 at 10:43 AM, Vladimir Vukicevic<vladimir at pobox.com> wrote:
> Right, that's going to be slow. What Owen is suggesting is that you create
> an image surface the same size as your update region, then draw your rotated
> image into it. Then use StretchDIBits or equivalent to draw it onto the
> window's DC.
>
> Or, create a win32 DIB surface using cairo_win32_surface_create_with_dib as
> your destination, and then draw that onto the window DC, since that
> operation will be fast. If I'm not making sense:
>
> HDC winDC;
> cairo_surface_t *winSurf = cairo_win32_surface_create_for_dc(winDC);
> cairo_surface_t *target = cairo_win32_surface_create_with_dib(..., width,
> height);
> cairo_surface_t *src = cairo_image_surface_create(...);
>
> draw src -> target rotated, etc.
> finally draw target -> winSurf 1:1, no rotation, etc.
>
> - Vlad
>
> On 6/29/09 7:20 PM, Rainman Lee wrote:
>>
>> I did not use DDB bitmap :@)
>> I just created a image surface from a png file and a cairo win32
>> surface from a window dc,
>> then fill the win32 surface with the image surface by rotation
>> transforms from 0 degree up to 360 degree.
>>
>> On Tue, Jun 30, 2009 at 4:01 AM, Owen Taylor<otaylor at redhat.com> wrote:
>>>
>>> On Mon, 2009-06-29 at 12:48 +0800, Rainman Lee wrote:
>>>>
>>>> Hi everyone,
>>>> I use cairo on windows for a while. I found that cairo was so slow
>>>> whenever fill a surface to another with scaling, rotating, or even a
>>>> non-integer translaton. I compared it with GDI+, which is at least 7
>>>> times faster than cairo :(
>>>>
>>>> It seems that if a source pixel can not map to a dest pixel which has
>>>> an integer coordinate, cairo will use a subpixel algorithm, and it
>>>> will terribly hurt the performance. I made a filling test, firstly by
>>>> a 0.5 pixel step horz translation transform, and a 1 pixel step horz
>>>> translation transform then, each of which looped 100 times. the first
>>>> case was extremely slow than the second one.
>>>>
>>>> Is there any idea to speed up cairo in this case? I tryed to set
>>>> antialias with none, but it had no effect.
>>>
>>> Only a very small subset of Cairo can be done using hardware
>>> acceleration via the GDI API. For everything else, if your bitmap
>>> is in video memory (a DDB) Cairo will need to read, make the changes
>>> and write back. This is very slow.
>>>
>>> For complex rendering, you are much better off rendering to a DIB.
>>>
>>> - Owen
>>>
>>>
>>>
>> _______________________________________________
>> cairo mailing list
>> cairo at cairographics.org
>> http://lists.cairographics.org/mailman/listinfo/cairo
>
>
More information about the cairo
mailing list