Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4461)

Unified Diff: chrome/plugin/webplugin_proxy.cc

Issue 3052039: If SHM pixmaps support is available, for example, Intel drivers now support t... (Closed) Base URL: http://src.chromium.org/svn/trunk/src/
Patch Set: '' Created 10 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/plugin/webplugin_proxy.h ('k') | webkit/glue/plugins/webplugin_delegate_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/plugin/webplugin_proxy.cc
===================================================================
--- chrome/plugin/webplugin_proxy.cc (revision 54851)
+++ chrome/plugin/webplugin_proxy.cc (working copy)
@@ -32,6 +32,10 @@
#include "third_party/WebKit/WebKit/chromium/public/WebBindings.h"
#include "webkit/glue/plugins/webplugin_delegate_impl.h"
+#if defined(USE_X11)
+#include "app/x11_util_internal.h"
+#endif
+
using WebKit::WebBindings;
using webkit_glue::WebPluginResourceClient;
@@ -58,11 +62,36 @@
transparent_(false),
host_render_view_routing_id_(host_render_view_routing_id),
ALLOW_THIS_IN_INITIALIZER_LIST(runnable_method_factory_(this)) {
+#if defined(USE_X11)
+ windowless_shm_pixmap_ = None;
+ use_shm_pixmap_ = false;
+
+ // If the X server supports SHM pixmaps
+ // and the color depth and masks match,
+ // then consider using SHM pixmaps for windowless plugin painting.
+ Display* display = x11_util::GetXDisplay();
+ if (x11_util::QuerySharedMemorySupport(display) ==
+ x11_util::SHARED_MEMORY_PIXMAP &&
+ x11_util::BitsPerPixelForPixmapDepth(
+ display, DefaultDepth(display, 0)) == 32) {
+ Visual* vis = DefaultVisual(display, 0);
+
+ if (vis->red_mask == 0xff0000 &&
+ vis->green_mask == 0xff00 &&
+ vis->blue_mask == 0xff)
+ use_shm_pixmap_ = true;
+ }
+#endif
}
WebPluginProxy::~WebPluginProxy() {
if (cp_browsing_context_)
GetContextMap().erase(cp_browsing_context_);
+
+#if defined(USE_X11)
+ if (windowless_shm_pixmap_ != None)
+ XFreePixmap(x11_util::GetXDisplay(), windowless_shm_pixmap_);
+#endif
}
bool WebPluginProxy::Send(IPC::Message* msg) {
@@ -567,6 +596,26 @@
} else {
background_canvas_.reset();
}
+
+ // If SHM pixmaps support is available, create a SHM pixmap and
+ // pass it to the delegate for windowless plugin painting.
+ if (delegate_->IsWindowless() && use_shm_pixmap_ && windowless_dib_.get()) {
+ Display* display = x11_util::GetXDisplay();
+ XID root_window = x11_util::GetX11RootWindow();
+ XShmSegmentInfo shminfo = {0};
+
+ if (windowless_shm_pixmap_ != None)
+ XFreePixmap(display, windowless_shm_pixmap_);
+
+ shminfo.shmseg = windowless_dib_->MapToX(display);
+ // Create a shared memory pixmap based on the image buffer.
+ windowless_shm_pixmap_ = XShmCreatePixmap(display, root_window,
+ NULL, &shminfo,
+ width, height,
+ DefaultDepth(display, 0));
+
+ delegate_->SetWindowlessShmPixmap(windowless_shm_pixmap_);
+ }
}
#endif
« no previous file with comments | « chrome/plugin/webplugin_proxy.h ('k') | webkit/glue/plugins/webplugin_delegate_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698