[webkit-help] Fwd: webview failed to be transparent

Emmanuel Rodriguez emmanuel.rodriguez at gmail.com
Wed Apr 24 22:58:05 PDT 2013


On 25 April 2013 03:37, Jianhua Shao <alex.sjh at gmail.com> wrote:

> On Thu, Apr 25, 2013 at 5:32 AM, Emmanuel Rodriguez <
> emmanuel.rodriguez at gmail.com> wrote:
>
>>
>>
>> Thanks for sharing your experience.
>>
> The version 1.6.3 does not meet my requirements.
> "enable-accelerated-compositing" is what I need in the newer version, from
> the dev document I found it is available from version 1.7.5.
> Seems I can give a try on version 1.7.x.
>
I just ment to try it and see if the transparencies where still enabled in
1.6.3


>
> And have you read my another mail,
>
> cairo_surface_t* surface = webkit_web_view_get_snapshot(view);
> cairo_surface_write_to_png(surface, "/home/meego/dump.png");
>
> will result a transparent png file...
> Maybe I need to do some configuration on cario/gtk, but I am new on this
> subject, anyone can give me some hint?
>

By the looks of the code of 1.6.3 and 1.10.2 it seems that
 webkit_web_view_get_snapshot() behaves like the old webkit_web_view_draw().

In 1.6.3 the draw operation is done with:

static void paintWebView(Frame* frame, gboolean transparent,
GraphicsContext& context, const IntRect& clipRect, const Vector<IntRect>&
rects)
{
    bool coalesce = true;

    if (rects.size() > 0)
        coalesce = shouldCoalesce(clipRect, rects);

    if (coalesce) {
        context.clip(clipRect);
        if (transparent)
            context.clearRect(clipRect);
        frame->view()->paint(&context, clipRect);
    } else {
        for (size_t i = 0; i < rects.size(); i++) {
            IntRect rect = rects[i];
            context.save();
            context.clip(rect);
            if (transparent)
                context.clearRect(rect);
            frame->view()->paint(&context, rect);
            context.restore();
        }
    }

    context.save();
    context.clip(clipRect);
    frame->page()->inspectorController()->drawHighlight(context);
    context.restore();
}


In 1.10.2 webkit_web_view_get_snapshot is done with:

cairo_surface_t*
webkit_web_view_get_snapshot(WebKitWebView* webView)
{
    g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(webView), 0);

    Frame* frame = core(webView)->mainFrame();
    if (!frame || !frame->contentRenderer() || !frame->view())
        return 0;

    frame->view()->updateLayoutAndStyleIfNeededRecursive();
    GtkAllocation allocation;
    gtk_widget_get_allocation(GTK_WIDGET(webView), &allocation);
    cairo_surface_t* surface =
cairo_image_surface_create(CAIRO_FORMAT_ARGB32, allocation.width,
allocation.height);
    RefPtr<cairo_t> cr = adoptRef(cairo_create(surface));
    GraphicsContext gc(cr.get());

    IntRect rect = allocation;
    gc.applyDeviceScaleFactor(frame->page()->deviceScaleFactor());
    gc.save();
    gc.clip(rect);
    if (webView->priv->transparent)
        gc.clearRect(rect);
    frame->view()->paint(&gc, rect);
    gc.restore();

    return surface;
}


Both functions have the same drawing logic:

        context.clip(clipRect);
        if (transparent)
            context.clearRect(clipRect);
        frame->view()->paint(&context, clipRect);
        context.restore();

Wit the exception that webkit_web_view_get_snapshot() forces the drawing
into an image surface except of accepting a cairo context.

-- 
Emmanuel Rodriguez
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.webkit.org/pipermail/webkit-help/attachments/20130425/680f25a0/attachment-0001.html>


More information about the webkit-help mailing list