[BlackBerry] Add an empty implementation of GraphicsContext3D::setErrorMessageCallback
[WebKit-https.git] / Source / WebCore / platform / graphics / blackberry / GraphicsContext3DBlackBerry.cpp
1 /*
2  * Copyright (C) 2009 Apple Inc. All rights reserved.
3  * Copyright (C) 2010, 2011, 2012 Research In Motion Limited. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include "config.h"
28
29 #if ENABLE(WEBGL)
30
31 #include "GraphicsContext3D.h"
32
33 #include "BitmapImageSingleFrameSkia.h"
34 #include "Extensions3DOpenGL.h"
35 #include "GraphicsContext.h"
36 #include "WebGLLayerWebKitThread.h"
37
38 #include <BlackBerryPlatformGraphics.h>
39
40 namespace WebCore {
41
42 PassRefPtr<GraphicsContext3D> GraphicsContext3D::create(Attributes attribs, HostWindow* hostWindow, RenderStyle renderStyle)
43 {
44     // This implementation doesn't currently support rendering directly to a window.
45     if (renderStyle == RenderDirectlyToHostWindow)
46         return 0;
47
48     return adoptRef(new GraphicsContext3D(attribs, hostWindow, false));
49 }
50
51 GraphicsContext3D::GraphicsContext3D(GraphicsContext3D::Attributes attrs, HostWindow* hostWindow, bool renderDirectlyToHostWindow)
52     : m_currentWidth(0)
53     , m_currentHeight(0)
54     , m_hostWindow(hostWindow)
55     , m_context(BlackBerry::Platform::Graphics::createWebGLContext())
56     , m_extensions(adoptPtr(new Extensions3DOpenGL(this)))
57     , m_attrs(attrs)
58     , m_texture(0)
59     , m_fbo(0)
60     , m_depthStencilBuffer(0)
61     , m_boundFBO(0)
62     , m_activeTexture(GL_TEXTURE0)
63     , m_boundTexture0(0)
64     , m_multisampleFBO(0)
65     , m_multisampleDepthStencilBuffer(0)
66     , m_multisampleColorBuffer(0)
67 {
68     if (!renderDirectlyToHostWindow) {
69 #if USE(ACCELERATED_COMPOSITING)
70         m_compositingLayer = WebGLLayerWebKitThread::create();
71 #endif
72         makeContextCurrent();
73
74         Extensions3D* extensions = getExtensions();
75         if (!extensions->supports("GL_IMG_multisampled_render_to_texture"))
76             m_attrs.antialias = false;
77
78         // Create a texture to render into.
79         ::glGenTextures(1, &m_texture);
80         ::glBindTexture(GL_TEXTURE_2D, m_texture);
81         ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
82         ::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
83         ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
84         ::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
85         ::glBindTexture(GL_TEXTURE_2D, 0);
86
87         // Create an FBO.
88         ::glGenFramebuffers(1, &m_fbo);
89         ::glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
90         if (m_attrs.stencil || m_attrs.depth)
91             ::glGenRenderbuffers(1, &m_depthStencilBuffer);
92         m_boundFBO = m_fbo;
93
94 #if USE(ACCELERATED_COMPOSITING)
95         static_cast<WebGLLayerWebKitThread*>(m_compositingLayer.get())->setWebGLContext(this);
96 #endif
97     }
98
99     // FIXME: If GraphicsContext3D is created with renderDirectlyToHostWindow == true,
100     // makeContextCurrent() will make the shared context current.
101     makeContextCurrent();
102
103     // FIXME: Do we need to enable GL_VERTEX_PROGRAM_POINT_SIZE with GL ES2? See PR #120141.
104
105     ::glClearColor(0, 0, 0, 0);
106 }
107
108 GraphicsContext3D::~GraphicsContext3D()
109 {
110     if (m_texture) {
111         makeContextCurrent();
112         ::glDeleteTextures(1, &m_texture);
113         if (m_attrs.stencil || m_attrs.depth)
114             ::glDeleteRenderbuffers(1, &m_depthStencilBuffer);
115         ::glDeleteFramebuffers(1, &m_fbo);
116     }
117
118     BlackBerry::Platform::Graphics::destroyWebGLContext(m_context);
119 }
120
121 bool GraphicsContext3D::paintsIntoCanvasBuffer() const
122 {
123     // See PR #120141.
124     return true;
125 }
126
127 bool GraphicsContext3D::makeContextCurrent()
128 {
129     BlackBerry::Platform::Graphics::useWebGLContext(m_context);
130     return true;
131 }
132
133 bool GraphicsContext3D::isGLES2Compliant() const
134 {
135     return true;
136 }
137
138 bool GraphicsContext3D::isGLES2NPOTStrict() const
139 {
140     return true;
141 }
142
143 bool GraphicsContext3D::isErrorGeneratedOnOutOfBoundsAccesses() const
144 {
145     return false;
146 }
147
148 Platform3DObject GraphicsContext3D::platformTexture() const
149 {
150     return m_texture;
151 }
152
153 #if USE(ACCELERATED_COMPOSITING)
154 PlatformLayer* GraphicsContext3D::platformLayer() const
155 {
156     return m_compositingLayer.get();
157 }
158 #endif
159
160 void GraphicsContext3D::paintToCanvas(const unsigned char* imagePixels, int imageWidth, int imageHeight, int canvasWidth, int canvasHeight,
161        GraphicsContext* context, bool flipY)
162 {
163     // Reorder pixels into BGRA format.
164     unsigned char* tempPixels = new unsigned char[imageWidth * imageHeight * 4];
165
166     if (flipY) {
167         for (int y = 0; y < imageHeight; y++) {
168             const unsigned char *srcRow = imagePixels + (imageWidth * 4 * y);
169             unsigned char *destRow = tempPixels + (imageWidth * 4 * (imageHeight - y - 1));
170             for (int i = 0; i < imageWidth * 4; i += 4) {
171                 destRow[i + 0] = srcRow[i + 2];
172                 destRow[i + 1] = srcRow[i + 1];
173                 destRow[i + 2] = srcRow[i + 0];
174                 destRow[i + 3] = srcRow[i + 3];
175             }
176         }
177     } else {
178         for (int i = 0; i < imageWidth * imageHeight * 4; i += 4) {
179             tempPixels[i + 0] = imagePixels[i + 2];
180             tempPixels[i + 1] = imagePixels[i + 1];
181             tempPixels[i + 2] = imagePixels[i + 0];
182             tempPixels[i + 3] = imagePixels[i + 3];
183         }
184     }
185
186     SkBitmap canvasBitmap;
187
188     canvasBitmap.setConfig(SkBitmap::kARGB_8888_Config, canvasWidth, canvasHeight);
189     canvasBitmap.allocPixels(0, 0);
190     canvasBitmap.lockPixels();
191     memcpy(canvasBitmap.getPixels(), tempPixels, imageWidth * imageHeight * 4);
192     canvasBitmap.unlockPixels();
193     delete [] tempPixels;
194
195     FloatRect src(0, 0, canvasWidth, canvasHeight);
196     FloatRect dst(0, 0, imageWidth, imageHeight);
197
198     RefPtr<BitmapImageSingleFrameSkia> bitmapImage = BitmapImageSingleFrameSkia::create(canvasBitmap, false);
199     context->drawImage(bitmapImage.get(), ColorSpaceDeviceRGB, dst, src, CompositeCopy, false);
200 }
201
202 void GraphicsContext3D::setContextLostCallback(PassOwnPtr<ContextLostCallback>)
203 {
204 }
205
206 void GraphicsContext3D::setErrorMessageCallback(PassOwnPtr<ErrorMessageCallback>)
207 {
208 }
209
210 } // namespace WebCore
211
212 #endif // ENABLE(WEBGL)
213