<div dir="ltr">Any ideas? Anyone?<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Aug 6, 2013 at 5:34 PM, Bobby Salazar <span dir="ltr"><<a href="mailto:bobby8934@gmail.com" target="_blank">bobby8934@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">I am testing some code on iOS and have run into a rendering problem<br>
using Quartz surfaces that does not happen by merely switching the<br>
surface out to an image surface. Here is the code:<br>
<br>
void TestRadialRender()<br>
{<br>
        cairo_surface_t* pSurface;<br>
        cairo_t* pContext;<br>
        cairo_matrix_t Matrix;<br>
<br>
        // Setup surface<br>
        //pSurface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 640, 1136);<br>
        pSurface = cairo_quartz_surface_create(CAIRO_FORMAT_ARGB32, 640, 1136);<br>
        pContext = cairo_create(pSurface);<br>
<br>
        // Setup matrix<br>
        cairo_matrix_init(&Matrix, 3.6, 0.0, 0.0, 1.35, 568, 66);<br>
        cairo_set_matrix(pContext, &Matrix);<br>
<br>
        // Setup path<br>
        cairo_new_path(pContext);<br>
        double cx = -45.84799;<br>
        double cy = 7.394;<br>
        double rx = 3;<br>
        double ry = 3;<br>
<br>
        cairo_move_to (pContext, cx + rx, cy);<br>
        cairo_curve_to (pContext, cx + rx, cy + ry * 0.5522847498, cx + rx *<br>
0.5522847498, cy + ry, cx, cy + ry);<br>
        cairo_curve_to (pContext, cx - rx * 0.5522847498, cy + ry, cx - rx,<br>
cy + ry * 0.5522847498, cx - rx, cy);<br>
        cairo_curve_to (pContext, cx - rx, cy - ry * 0.5522847498, cx - rx *<br>
0.5522847498, cy - ry, cx, cy - ry);<br>
        cairo_curve_to (pContext, cx + rx * 0.5522847498, cy - ry, cx + rx,<br>
cy - ry * 0.5522847498, cx + rx, cy);<br>
        cairo_close_path (pContext);<br>
<br>
<br>
        // Setup pattern<br>
        cairo_pattern_t*        pat;<br>
        pat = cairo_pattern_create_radial(-45.84799, 7.394, 0, -45.84799, 7.394, 3);<br>
        cairo_pattern_set_extend(pat, CAIRO_EXTEND_REFLECT);<br>
<br>
        // Setup brush color<br>
        cairo_pattern_add_color_stop_rgba(pat, 0, 0.00, 0.00, 1.00, 0.125);<br>
<br>
        // Setup color stops<br>
        cairo_pattern_add_color_stop_rgba(pat, 0.0000, 0.54, 0.55, 0.56, 1.00);<br>
        cairo_pattern_add_color_stop_rgba(pat, 0.1272, 0.67, 0.68, 0.69, 1.00);<br>
        cairo_pattern_add_color_stop_rgba(pat, 0.2750, 0.78, 0.79, 0.80, 1.00);<br>
        cairo_pattern_add_color_stop_rgba(pat, 0.4307, 0.88, 0.88, 0.89, 0.50);<br>
        cairo_pattern_add_color_stop_rgba(pat, 0.5955, 0.95, 0.95, 0.95, 0.25);<br>
        cairo_pattern_add_color_stop_rgba(pat, 0.7757, 0.98, 0.98, 0.98, 0.125);<br>
        cairo_pattern_add_color_stop_rgba(pat, 1.0000, 1.00, 1.00, 1.00, 0.00);<br>
<br>
        // Render it<br>
        cairo_set_source(pContext, pat);<br>
<br>
        //// START TIMER ////<br>
        cairo_fill_preserve(pContext);<br>
        //// END TIMER ////<br>
<br>
        cairo_pattern_destroy(pat);<br>
<br>
        // Cleanup<br>
        cairo_surface_destroy(pSurface);<br>
        cairo_destroy(pContext);<br>
}<br>
<br>
<br>
In that test function above, if the code is using<br>
cairo_quartz_surface_create() then the call to cairo_fill_preserve()<br>
takes around 600ms to complete. If you comment out<br>
cairo_quartz_surface_create() and use cairo_image_surface_create()<br>
instead, then the call to cairo_fill_preserve() takes around 2ms to<br>
complete.<br>
<br>
In the case where it renders really slow, it is usually stuck down in<br>
the Pixman code calculating radial gradient information. However, I<br>
would expect that it uses the same Pixman code for the image surface<br>
as it does for the Quartz surface type. Does anyone have any ideas<br>
what could be going wrong here?<br>
<br>
This testing was done on an iPod touch 5th generation device (ARM<br>
based processor) using Cairo v1.8.0 and Pixman v0.24.0. I realize this<br>
version of Cairo may be a little old now, is anyone able to test this<br>
function using a newer build to see if it may have already been fixed?<br>
<br>
As I type this I realize it may be helpful to get numbers on an x86<br>
processor. I ran the same function under the iPhone simulator on a<br>
Core i7 MacBook Pro and it produced 74ms for the Quartz surface and<br>
less than 1 millisecond for the image surface. As you can see, the<br>
Quartz surface is still an order of magnitude slower.<br>
<br>
Any ideas?<br>
</blockquote></div><br></div>