linux/linuxgdi.cpp里CreateWindowExW的
g_signal_connect(self->m_glArea, "render", G_CALLBACK(onRenderGlTextures), self);
绑定了一个渲染事件回调。
另外有
g_signal_connect(self->m_glArea, "realize", G_CALLBACK(onRealizeGlTextures), self);
绑定了一个gl的初始化事件。
在onRealizeGlTextures里(位于linux/linuxgl.cpp),申请了一个纹理句柄:
glGenTextures(1, &self->m_glTexture); //生成纹理对象的句柄
然后在每次收到渲染回调onRenderGlTextures时,
在这个回调里:
glBindTexture(GL_TEXTURE_2D, self->m_glTexture);
这句把纹理句柄绑定到当前surface。再通过
self->m_wndProc(self, WM_PAINT, (WPARAM)(self->m_glTexture), 0);
调用MbWebView::onPaint。
在MbWebView::onPaint里有句:
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_bitmapByteSize.width(), m_bitmapByteSize.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, m_bitmapByte);
这句表示把bitmap像素数据传递到OpenGL的纹理对象中。这个纹理对象就是刚才在onRenderGlTextures里提到的glBindTexture绑定的纹理对象(opengl的api设计的比较奇怪,操作的这个对象是直接从之前glBindTexture保存的,而不是作为参数传递到glBindTexture)。
像素数据m_bitmapByte来自SoftwareOutputDeviceWinOrLinux::ResizeDelegated。这是viz线程的函数。每次窗口创建或者resize的时候会创建内存像素矩阵,然后传递给MbWebView层。