Unreviewed GTK gardening.
[WebKit-https.git] / Source / WebCore / platform / graphics / surfaces / glx / X11WindowResources.cpp
1 /*
2  * Copyright (C) 2012 Intel Corporation. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "X11WindowResources.h"
28
29 #if USE(ACCELERATED_COMPOSITING)
30
31 namespace WebCore {
32
33 SharedX11Resources* SharedX11Resources::m_staticSharedResource = 0;
34
35 X11OffScreenWindow::X11OffScreenWindow()
36     : m_sharedResources(0)
37 {
38     m_sharedResources = SharedX11Resources::create();
39 }
40
41 X11OffScreenWindow::~X11OffScreenWindow()
42 {
43 }
44
45 void X11OffScreenWindow::reSizeWindow(const IntRect& newRect, const uint32_t windowId)
46 {
47     XResizeWindow(m_sharedResources->x11Display(), windowId, newRect.width(), newRect.height());
48     XFlush(m_sharedResources->x11Display());
49 }
50
51 #if USE(GRAPHICS_SURFACE)
52 void X11OffScreenWindow::createOffScreenWindow(uint32_t* handleId, const XVisualInfo& visInfo, const IntSize& size)
53 {
54     if (!m_sharedResources)
55         return;
56
57     Display* display = m_sharedResources->x11Display();
58     if (!display)
59         return;
60
61     if (!visInfo.visual) {
62         LOG_ERROR("Failed to find valid XVisual.");
63         return;
64     }
65
66     Window xWindow = m_sharedResources->getXWindow();
67     if (!xWindow)
68         return;
69
70     Colormap cmap = XCreateColormap(display, xWindow, visInfo.visual, AllocNone);
71     XSetWindowAttributes attribute;
72     attribute.background_pixel = WhitePixel(display, 0);
73     attribute.border_pixel = BlackPixel(display, 0);
74     attribute.colormap = cmap;
75     attribute.event_mask = ResizeRedirectMask;
76     uint32_t tempHandleId;
77     tempHandleId = XCreateWindow(display, xWindow, 0, 0, size.width(), size.height(), 0, visInfo.depth, InputOutput, visInfo.visual, CWBackPixel | CWBorderPixel | CWColormap, &attribute);
78
79     if (!tempHandleId) {
80         LOG_ERROR("Failed to create offscreen window.");
81         return;
82     }
83
84     XSetWindowBackgroundPixmap(display, tempHandleId, 0);
85     XCompositeRedirectWindow(display, tempHandleId, CompositeRedirectManual);
86     XMapWindow(display, tempHandleId);
87     *handleId = tempHandleId;
88 }
89
90 #if USE(EGL)
91 void X11OffScreenWindow::createOffScreenWindow(uint32_t* handleId, const EGLint id, const IntSize& size)
92 {
93     VisualID visualId = static_cast<VisualID>(id);
94
95     if (!visualId)
96         return;
97
98     // EGL has suggested a visual id, so get the rest of the visual info for that id.
99     XVisualInfo visualInfoTemplate;
100     memset(&visualInfoTemplate, 0, sizeof(XVisualInfo));
101     visualInfoTemplate.visualid = visualId;
102     int matchingCount = 0;
103     OwnPtrX11<XVisualInfo> matchingVisuals = adoptPtr(XGetVisualInfo(m_sharedResources->x11Display(), VisualIDMask, &visualInfoTemplate, &matchingCount));
104     XVisualInfo* foundVisual = 0;
105
106     if (matchingVisuals) {
107         for (int i = 0; i< matchingCount; i++) {
108             XVisualInfo* temp = &matchingVisuals[i];
109
110             if (m_sharedResources->isXRenderExtensionSupported()) {
111                 XRenderPictFormat* format = XRenderFindVisualFormat(m_sharedResources->x11Display(), temp->visual);
112                 if (format && format->direct.alphaMask > 0) {
113                     foundVisual = temp;
114                     break;
115                 }
116             }
117
118             if (temp->depth == 32) {
119                 foundVisual = temp;
120                 break;
121             }
122         }
123
124         if (foundVisual)
125             createOffScreenWindow(handleId, *foundVisual, size);
126     }
127 }
128 #endif
129
130 #endif
131
132 void X11OffScreenWindow::destroyWindow(const uint32_t windowId)
133 {
134     if (!windowId)
135         return;
136
137     Display* display = m_sharedResources->x11Display();
138     if (!display)
139         return;
140
141     XDestroyWindow(display, windowId);
142 }
143
144 Display* X11OffScreenWindow::nativeSharedDisplay() const
145 {
146     return m_sharedResources->x11Display();
147 }
148
149 bool X11OffScreenWindow::isXRenderExtensionSupported() const
150 {
151     return m_sharedResources->isXRenderExtensionSupported();
152 }
153
154 }
155
156 #endif