[webkit-dev] Translucent (i)frames support
Artem Ananiev
Artem.Ananiev at Sun.COM
Thu Jul 17 07:36:45 PDT 2008
Hi, webkit developers,
I have recently faced a problem with support for translucent (i)frames
in our (java) port, and tried to find how other ports (gtk, win, mac)
deal with the same issue. The test is short (launch the test and try to
scroll inner frames):
<html>
<body>
<div style="opacity:0.5;position:absolute;left:150;top:150">
<iframe src="http://java.sun.com/javase/6/docs/api" width="600"
height="450"></iframe>
</div>
<div style="opacity:0.2;position:absolute;left:250;top:250">
<iframe src="http://java.sun.com/javase/6/docs/api" width="600"
height="450"></iframe>
</div>
</body>
</html>
I was very surprised when found no webkit ports displayed the page
correctly! I tried Safari 3.1 on Mac and Win and GTK Launcher on Linux
(haven't looked at Safari 4.0, though). The only browser which 'passed'
the test was Firefox: all the frames were displayed correctly and
scrolled smoothly.
It seems that both mac/win and gtk ports use some caches for rendered
pages, however some bugs exist in the implementations. In Java port we
have two different approaches for rendering: one is fast, but without
any support of translucent (i)frames, another is correct (even with the
test above), but slow. The second one is a kind of experimental, and
what I want to do is to speed it up (by using some rendering cache) and
make it default.
The next two days I spent trying to implement the correct rendering
cache. The idea is simple: render all the frames separately from each
other to different offscreen images, and composite them to get a final
image on the screen. However, I failed with this task :(
The first part is simple: to render the frame contents I call
Frame::paint(gc, rect) and skip all subsequent Widget::paint(gc, rect)
calls. That's fine. The second part - compositing - is somewhat I
couldn't implement. The problem is there is no way (or I don't know this
way) for a given Frame to render all its child frames without rendering
the frame itself. In other words, I have to render some part of the
frame twice: first, all the dirty regions into the cache, and second,
all the frame to get children painted correctly.
Any ideas?
Thanks,
Artem
More information about the webkit-dev
mailing list