Merge branch 'master' of git://anongit.kde.org/kde-workspace
This commit is contained in:
commit
6f695d9a76
7 changed files with 116 additions and 69 deletions
|
@ -2148,7 +2148,8 @@ void Client::updateAllowedActions(bool force)
|
|||
return;
|
||||
// TODO: This could be delayed and compressed - It's only for pagers etc. anyway
|
||||
info->setAllowedActions(allowed_actions);
|
||||
// TODO: This should also tell the decoration, so that it can update the buttons
|
||||
if (decoration)
|
||||
decoration->reset(KDecoration::SettingButtons);
|
||||
}
|
||||
|
||||
void Client::autoRaise()
|
||||
|
|
|
@ -152,8 +152,10 @@ void BoxSwitchEffect::paintWindowsBox(const QRegion& region)
|
|||
{
|
||||
if ((mAnimateSwitch && !mProxyActivated) || (mProxyActivated && mProxyAnimateSwitch))
|
||||
thumbnailFrame->setSelection(highlight_area);
|
||||
else
|
||||
thumbnailFrame->setSelection(windows[ selected_window ]->area);
|
||||
else {
|
||||
ItemInfo *info = windows.value(selected_window, 0);
|
||||
thumbnailFrame->setSelection(info ? info->area : QRect());
|
||||
}
|
||||
thumbnailFrame->render(region);
|
||||
|
||||
if ((mAnimateSwitch && !mProxyActivated) || (mProxyActivated && mProxyAnimateSwitch)) {
|
||||
|
@ -271,8 +273,9 @@ void BoxSwitchEffect::windowGeometryShapeChanged(EffectWindow* w, const QRect& o
|
|||
{
|
||||
if (mActivated) {
|
||||
if (mMode == TabBoxWindowsMode || mMode == TabBoxWindowsAlternativeMode) {
|
||||
if (windows.contains(w) && w->size() != old.size()) {
|
||||
effects->addRepaint(windows[ w ]->area);
|
||||
ItemInfo *info = windows.value( w, 0L );
|
||||
if (info && w->size() != old.size()) {
|
||||
effects->addRepaint(info->area);
|
||||
}
|
||||
} else {
|
||||
if (w->isOnAllDesktops()) {
|
||||
|
@ -357,24 +360,25 @@ void BoxSwitchEffect::tabBoxUpdated()
|
|||
}
|
||||
}
|
||||
}
|
||||
if (windows.contains(selected_window))
|
||||
effects->addRepaint(windows.value(selected_window)->area);
|
||||
if (ItemInfo *info = windows.value(selected_window, 0))
|
||||
effects->addRepaint(info->area);
|
||||
selected_window->addRepaintFull();
|
||||
}
|
||||
setSelectedWindow(effects->currentTabBoxWindow());
|
||||
if (windows.contains(selected_window))
|
||||
effects->addRepaint(windows.value(selected_window)->area);
|
||||
if (ItemInfo *info = windows.value(selected_window, 0))
|
||||
effects->addRepaint(info->area);
|
||||
if (selected_window) // @Martin can effects->currentTabBoxWindow() be NULL?
|
||||
selected_window->addRepaintFull();
|
||||
effects->addRepaint(text_area);
|
||||
} else if (mMode != TabBoxWindowsMode && mMode != TabBoxWindowsAlternativeMode) {
|
||||
// DesktopMode
|
||||
if (desktops.contains(selected_desktop))
|
||||
effects->addRepaint(desktops.value(selected_desktop)->area);
|
||||
if (ItemInfo *info = desktops.value(selected_desktop, 0))
|
||||
effects->addRepaint(info->area);
|
||||
selected_desktop = effects->currentTabBoxDesktop();
|
||||
if (!mProxyActivated || mProxyShowText)
|
||||
thumbnailFrame->setText(effects->desktopName(selected_desktop));
|
||||
if (desktops.contains(selected_desktop))
|
||||
effects->addRepaint(desktops.value(selected_desktop)->area);
|
||||
if (ItemInfo *info = desktops.value(selected_desktop, 0))
|
||||
effects->addRepaint(info->area);
|
||||
effects->addRepaint(text_area);
|
||||
if (effects->currentTabBoxDesktopList() == original_desktops)
|
||||
return;
|
||||
|
@ -476,12 +480,13 @@ void BoxSwitchEffect::windowClosed(EffectWindow* w)
|
|||
if (w == selected_window) {
|
||||
setSelectedWindow(0);
|
||||
}
|
||||
if (windows.contains(w)) {
|
||||
QHash<EffectWindow*, ItemInfo*>::iterator it = windows.find(w);
|
||||
if (it != windows.end()) {
|
||||
w->refWindow();
|
||||
referrencedWindows.append(w);
|
||||
original_windows.removeAll(w);
|
||||
delete windows[ w ];
|
||||
windows.remove(w);
|
||||
delete *it; *it = 0;
|
||||
windows.erase( it );
|
||||
effects->addRepaintFull();
|
||||
}
|
||||
}
|
||||
|
@ -595,11 +600,13 @@ void BoxSwitchEffect::calculateItemSizes()
|
|||
if (!ordered_windows.at(i))
|
||||
continue;
|
||||
EffectWindow* w = ordered_windows.at(i);
|
||||
windows[ w ] = new ItemInfo();
|
||||
ItemInfo *info = windows.value(w, 0);
|
||||
if (!info)
|
||||
windows[ w ] = info = new ItemInfo();
|
||||
|
||||
windows[ w ]->iconFrame = effects->effectFrame(EffectFrameUnstyled, false);
|
||||
windows[ w ]->iconFrame->setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
||||
windows[ w ]->iconFrame->setIcon(w->icon());
|
||||
info->iconFrame = effects->effectFrame(EffectFrameUnstyled, false);
|
||||
info->iconFrame->setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
||||
info->iconFrame->setIcon(w->icon());
|
||||
|
||||
float moveIndex = i;
|
||||
if (animation && timeLine.value() < 0.5) {
|
||||
|
@ -610,16 +617,17 @@ void BoxSwitchEffect::calculateItemSizes()
|
|||
}
|
||||
if (ordered_windows.count() % 2 == 0)
|
||||
moveIndex += 0.5;
|
||||
windows[ w ]->area = QRect(frame_area.x() + moveIndex * item_max_size.width() + offset,
|
||||
info->area = QRect(frame_area.x() + moveIndex * item_max_size.width() + offset,
|
||||
frame_area.y(),
|
||||
item_max_size.width(), item_max_size.height());
|
||||
windows[ w ]->clickable = windows[ w ]->area;
|
||||
info->clickable = info->area;
|
||||
}
|
||||
if (ordered_windows.count() % 2 == 0) {
|
||||
right_window = ordered_windows.last();
|
||||
}
|
||||
if (!highlight_is_set) {
|
||||
highlight_area = windows[ selected_window ]->area;
|
||||
ItemInfo *info = windows.value(selected_window, 0);
|
||||
highlight_area = info ? info->area : QRect();
|
||||
highlight_is_set = true;
|
||||
}
|
||||
} else {
|
||||
|
@ -627,41 +635,46 @@ void BoxSwitchEffect::calculateItemSizes()
|
|||
if (!original_windows.at(i))
|
||||
continue;
|
||||
EffectWindow* w = original_windows.at(i);
|
||||
windows[ w ] = new ItemInfo();
|
||||
ItemInfo *info = windows.value(w, 0);
|
||||
if (!info)
|
||||
windows[ w ] = info = new ItemInfo();
|
||||
|
||||
windows[ w ]->iconFrame = effects->effectFrame(EffectFrameUnstyled, false);
|
||||
windows[ w ]->iconFrame->setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
||||
windows[ w ]->iconFrame->setIcon(w->icon());
|
||||
info->iconFrame = effects->effectFrame(EffectFrameUnstyled, false);
|
||||
info->iconFrame->setAlignment(Qt::AlignTop | Qt::AlignLeft);
|
||||
info->iconFrame->setIcon(w->icon());
|
||||
|
||||
windows[ w ]->area = QRect(frame_area.x() + i * item_max_size.width(),
|
||||
info->area = QRect(frame_area.x() + i * item_max_size.width(),
|
||||
frame_area.y(),
|
||||
item_max_size.width(), item_max_size.height());
|
||||
windows[ w ]->clickable = windows[ w ]->area;
|
||||
info->clickable = info->area;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
desktops.clear();
|
||||
for (int i = 0; i < original_desktops.count(); i++) {
|
||||
int it = original_desktops.at(i);
|
||||
desktops[ it ] = new ItemInfo();
|
||||
ItemInfo *info = desktops.value( it, 0 );
|
||||
if (!info)
|
||||
desktops[ it ] = info = new ItemInfo();
|
||||
|
||||
desktops[ it ]->area = QRect(frame_area.x() + i * item_max_size.width(),
|
||||
info->area = QRect(frame_area.x() + i * item_max_size.width(),
|
||||
frame_area.y(),
|
||||
item_max_size.width(), item_max_size.height());
|
||||
desktops[ it ]->clickable = desktops[ it ]->area;
|
||||
info->clickable = info->area;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BoxSwitchEffect::paintWindowThumbnail(EffectWindow* w)
|
||||
{
|
||||
if (!windows.contains(w))
|
||||
ItemInfo *info = windows.value(w, 0);
|
||||
if (!info)
|
||||
return;
|
||||
WindowPaintData data(w);
|
||||
|
||||
setPositionTransformations(data,
|
||||
windows[ w ]->thumbnail, w,
|
||||
windows[ w ]->area.adjusted(highlight_margin, highlight_margin, -highlight_margin, -highlight_margin),
|
||||
info->thumbnail, w,
|
||||
info->area.adjusted(highlight_margin, highlight_margin, -highlight_margin, -highlight_margin),
|
||||
Qt::KeepAspectRatio);
|
||||
|
||||
if (animation && (w == edge_window) && (windows.size() % 2 == 1)) {
|
||||
|
@ -698,7 +711,7 @@ void BoxSwitchEffect::paintWindowThumbnail(EffectWindow* w)
|
|||
// paint one part of the thumbnail
|
||||
effects->paintWindow(w,
|
||||
PAINT_WINDOW_OPAQUE | PAINT_WINDOW_TRANSFORMED | PAINT_WINDOW_LANCZOS,
|
||||
windows[ w ]->thumbnail, data);
|
||||
info->thumbnail, data);
|
||||
|
||||
QRect secondThumbnail;
|
||||
|
||||
|
@ -733,12 +746,12 @@ void BoxSwitchEffect::paintWindowThumbnail(EffectWindow* w)
|
|||
}
|
||||
}
|
||||
setPositionTransformations(data,
|
||||
windows[ w ]->thumbnail, w,
|
||||
info->thumbnail, w,
|
||||
secondThumbnail.adjusted(highlight_margin, highlight_margin, -highlight_margin, -highlight_margin),
|
||||
Qt::KeepAspectRatio);
|
||||
effects->paintWindow(w,
|
||||
PAINT_WINDOW_OPAQUE | PAINT_WINDOW_TRANSFORMED | PAINT_WINDOW_LANCZOS,
|
||||
windows[ w ]->thumbnail, data);
|
||||
info->thumbnail, data);
|
||||
} else if ((windows.size() % 2 == 0) && (w == right_window)) {
|
||||
// in case of even number of thumbnails:
|
||||
// the window on the right is painted one half on left and on half on the right side
|
||||
|
@ -779,7 +792,7 @@ void BoxSwitchEffect::paintWindowThumbnail(EffectWindow* w)
|
|||
data.quads = leftQuads;
|
||||
effects->drawWindow(w,
|
||||
PAINT_WINDOW_OPAQUE | PAINT_WINDOW_TRANSFORMED | PAINT_WINDOW_LANCZOS,
|
||||
windows[ w ]->thumbnail, data);
|
||||
info->thumbnail, data);
|
||||
|
||||
// right quads are painted on left side of frame
|
||||
data.quads = rightQuads;
|
||||
|
@ -788,28 +801,28 @@ void BoxSwitchEffect::paintWindowThumbnail(EffectWindow* w)
|
|||
(float)item_max_size.width() * 0.5 + animationOffset,
|
||||
frame_area.y(), item_max_size.width(), item_max_size.height());
|
||||
setPositionTransformations(data,
|
||||
windows[ w ]->thumbnail, w,
|
||||
info->thumbnail, w,
|
||||
secondThumbnail.adjusted(highlight_margin, highlight_margin, -highlight_margin, -highlight_margin),
|
||||
Qt::KeepAspectRatio);
|
||||
effects->drawWindow(w,
|
||||
PAINT_WINDOW_OPAQUE | PAINT_WINDOW_TRANSFORMED | PAINT_WINDOW_LANCZOS,
|
||||
windows[ w ]->thumbnail, data);
|
||||
info->thumbnail, data);
|
||||
} else {
|
||||
effects->drawWindow(w,
|
||||
PAINT_WINDOW_OPAQUE | PAINT_WINDOW_TRANSFORMED | PAINT_WINDOW_LANCZOS,
|
||||
windows[ w ]->thumbnail, data);
|
||||
info->thumbnail, data);
|
||||
}
|
||||
}
|
||||
|
||||
void BoxSwitchEffect::paintDesktopThumbnail(int iDesktop)
|
||||
{
|
||||
if (!desktops.contains(iDesktop))
|
||||
ItemInfo *info = desktops.value(iDesktop, 0);
|
||||
if (!info)
|
||||
return;
|
||||
|
||||
ScreenPaintData data;
|
||||
QRect region;
|
||||
QRect r = desktops[ iDesktop ]->area.adjusted(highlight_margin, highlight_margin,
|
||||
-highlight_margin, -highlight_margin);
|
||||
QRect r = info->area.adjusted(highlight_margin, highlight_margin, -highlight_margin, -highlight_margin);
|
||||
QSize size = QSize(displayWidth(), displayHeight());
|
||||
|
||||
size.scale(r.size(), Qt::KeepAspectRatio);
|
||||
|
@ -829,7 +842,8 @@ void BoxSwitchEffect::paintDesktopThumbnail(int iDesktop)
|
|||
|
||||
void BoxSwitchEffect::paintWindowIcon(EffectWindow* w)
|
||||
{
|
||||
if (!windows.contains(w))
|
||||
ItemInfo *info = windows.value(w, 0);
|
||||
if (!info)
|
||||
return;
|
||||
// Don't render null icons
|
||||
if (w->icon().isNull()) {
|
||||
|
@ -838,24 +852,24 @@ void BoxSwitchEffect::paintWindowIcon(EffectWindow* w)
|
|||
|
||||
int width = w->icon().width();
|
||||
int height = w->icon().height();
|
||||
int x = windows[ w ]->area.x() + windows[ w ]->area.width() - width - highlight_margin;
|
||||
int y = windows[ w ]->area.y() + windows[ w ]->area.height() - height - highlight_margin;
|
||||
int x = info->area.x() + info->area.width() - width - highlight_margin;
|
||||
int y = info->area.y() + info->area.height() - height - highlight_margin;
|
||||
if ((windows.size() % 2 == 0)) {
|
||||
if (w == right_window) {
|
||||
// in case of right window the icon has to be painted on the left side of the frame
|
||||
x = frame_area.x() + windows[ w ]->area.width() * 0.5 - width - highlight_margin;
|
||||
x = frame_area.x() + info->area.width() * 0.5 - width - highlight_margin;
|
||||
if (animation) {
|
||||
if (timeLine.value() <= 0.5) {
|
||||
if (direction == Left) {
|
||||
x -= windows[ w ]->area.width() * timeLine.value();
|
||||
x -= info->area.width() * timeLine.value();
|
||||
x = qMax(x, frame_area.x());
|
||||
} else
|
||||
x += windows[ w ]->area.width() * timeLine.value();
|
||||
x += info->area.width() * timeLine.value();
|
||||
} else {
|
||||
if (direction == Left)
|
||||
x += windows[ w ]->area.width() * (1.0 - timeLine.value());
|
||||
x += info->area.width() * (1.0 - timeLine.value());
|
||||
else {
|
||||
x -= windows[ w ]->area.width() * (1.0 - timeLine.value());
|
||||
x -= info->area.width() * (1.0 - timeLine.value());
|
||||
x = qMax(x, frame_area.x());
|
||||
}
|
||||
}
|
||||
|
@ -866,20 +880,20 @@ void BoxSwitchEffect::paintWindowIcon(EffectWindow* w)
|
|||
if (animation && w == edge_window) {
|
||||
if (timeLine.value() < 0.5) {
|
||||
if (direction == Left)
|
||||
x += windows[ w ]->area.width() * timeLine.value();
|
||||
x += info->area.width() * timeLine.value();
|
||||
else
|
||||
x -= windows[ w ]->area.width() * timeLine.value();
|
||||
x -= info->area.width() * timeLine.value();
|
||||
} else {
|
||||
if (direction == Left)
|
||||
x -= windows[ w ]->area.width() * (1.0 - timeLine.value());
|
||||
x -= info->area.width() * (1.0 - timeLine.value());
|
||||
else
|
||||
x += windows[ w ]->area.width() * (1.0 - timeLine.value());
|
||||
x += info->area.width() * (1.0 - timeLine.value());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
windows[ w ]->iconFrame->setPosition(QPoint(x, y));
|
||||
windows[ w ]->iconFrame->render(infiniteRegion(), 1.0, 0.75);
|
||||
info->iconFrame->setPosition(QPoint(x, y));
|
||||
info->iconFrame->render(infiniteRegion(), 1.0, 0.75);
|
||||
}
|
||||
|
||||
void* BoxSwitchEffect::proxy()
|
||||
|
|
|
@ -32,6 +32,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#include "resize/resize_config.h"
|
||||
#include "showfps/showfps_config.h"
|
||||
#include "thumbnailaside/thumbnailaside_config.h"
|
||||
#include "windowgeometry/windowgeometry_config.h"
|
||||
#include "zoom/zoom_config.h"
|
||||
|
||||
#ifdef KWIN_HAVE_OPENGL_COMPOSITING
|
||||
|
@ -67,6 +68,7 @@ KWIN_EFFECT_CONFIG_MULTIPLE(builtins,
|
|||
KWIN_EFFECT_CONFIG_SINGLE(showfps, ShowFpsEffectConfig)
|
||||
KWIN_EFFECT_CONFIG_SINGLE(translucency, TranslucencyEffectConfig)
|
||||
KWIN_EFFECT_CONFIG_SINGLE(thumbnailaside, ThumbnailAsideEffectConfig)
|
||||
KWIN_EFFECT_CONFIG_SINGLE(windowgeometry, WindowGeometryConfig)
|
||||
KWIN_EFFECT_CONFIG_SINGLE(zoom, ZoomEffectConfig)
|
||||
|
||||
#ifdef KWIN_HAVE_OPENGL_COMPOSITING
|
||||
|
|
|
@ -240,6 +240,7 @@ void HighlightWindowEffect::prepareHighlighting()
|
|||
foreach (EffectWindow * w, effects->stackingOrder())
|
||||
if (!m_windowOpacity.contains(w)) // Just in case we are still finishing from last time
|
||||
m_windowOpacity[w] = isInitiallyHidden(w) ? 0.0 : 1.0;
|
||||
m_highlightedWindows.at(0)->addRepaintFull();
|
||||
}
|
||||
|
||||
void HighlightWindowEffect::finishHighlighting()
|
||||
|
@ -247,6 +248,8 @@ void HighlightWindowEffect::finishHighlighting()
|
|||
m_finishing = true;
|
||||
m_monitorWindow = NULL;
|
||||
m_highlightedWindows.clear();
|
||||
if (!m_windowOpacity.isEmpty())
|
||||
m_windowOpacity.constBegin().key()->addRepaintFull();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
|
|
@ -318,6 +318,7 @@ void LogoutEffect::windowClosed(EffectWindow* w)
|
|||
|
||||
void LogoutEffect::windowDeleted(EffectWindow* w)
|
||||
{
|
||||
windows.removeAll(w);
|
||||
ignoredWindows.removeAll(w);
|
||||
if (w == logoutWindow)
|
||||
logoutWindow = NULL;
|
||||
|
|
|
@ -23,6 +23,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|||
#ifdef KWIN_HAVE_OPENGL
|
||||
#include "kwinglobals.h"
|
||||
#include "kwineffects.h"
|
||||
#include "kwinglplatform.h"
|
||||
|
||||
#include "kdebug.h"
|
||||
#include <kstandarddirs.h>
|
||||
|
@ -93,9 +94,10 @@ void initGL()
|
|||
// Get OpenGL version
|
||||
QString glversionstring = QString((const char*)glGetString(GL_VERSION));
|
||||
QStringList glversioninfo = glversionstring.left(glversionstring.indexOf(' ')).split('.');
|
||||
while (glversioninfo.count() < 3)
|
||||
glversioninfo << "0";
|
||||
#ifndef KWIN_HAVE_OPENGLES
|
||||
glVersion = MAKE_GL_VERSION(glversioninfo[0].toInt(), glversioninfo[1].toInt(),
|
||||
glversioninfo.count() > 2 ? glversioninfo[2].toInt() : 0);
|
||||
glVersion = MAKE_GL_VERSION(glversioninfo[0].toInt(), glversioninfo[1].toInt(), glversioninfo[2].toInt());
|
||||
#endif
|
||||
// Get list of supported OpenGL extensions
|
||||
glExtensions = QString((const char*)glGetString(GL_EXTENSIONS)).split(' ');
|
||||
|
|
|
@ -587,6 +587,13 @@ void SceneOpenGL::flushBuffer(int mask, QRegion damage)
|
|||
glXCopySubBuffer(display(), glxbuffer, r.x(), y, r.width(), r.height());
|
||||
}
|
||||
} else {
|
||||
// if a shader is bound, copy pixels results in a black screen
|
||||
// therefore unbind the shader and restore after copying the pixels
|
||||
GLint shader = 0;
|
||||
if (ShaderManager::instance()->isShaderBound()) {
|
||||
glGetIntegerv(GL_CURRENT_PROGRAM, &shader);
|
||||
glUseProgram(0);
|
||||
}
|
||||
// no idea why glScissor() is used, but Compiz has it and it doesn't seem to hurt
|
||||
glEnable(GL_SCISSOR_TEST);
|
||||
glDrawBuffer(GL_FRONT);
|
||||
|
@ -608,6 +615,10 @@ void SceneOpenGL::flushBuffer(int mask, QRegion damage)
|
|||
glBitmap(0, 0, 0, 0, -xpos, -ypos, NULL); // move position back to 0,0
|
||||
glDrawBuffer(GL_BACK);
|
||||
glDisable(GL_SCISSOR_TEST);
|
||||
// rebind previously bound shader
|
||||
if (ShaderManager::instance()->isShaderBound()) {
|
||||
glUseProgram(shader);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
waitSync();
|
||||
|
@ -640,7 +651,9 @@ void SceneOpenGL::Texture::init()
|
|||
void SceneOpenGL::Texture::release()
|
||||
{
|
||||
if (glxpixmap != None) {
|
||||
if (!options->glStrictBinding) {
|
||||
glXReleaseTexImageEXT(display(), glxpixmap, GLX_FRONT_LEFT_EXT);
|
||||
}
|
||||
glXDestroyPixmap(display(), glxpixmap);
|
||||
glxpixmap = None;
|
||||
}
|
||||
|
@ -651,6 +664,17 @@ void SceneOpenGL::Texture::findTarget()
|
|||
unsigned int new_target = 0;
|
||||
if (glXQueryDrawable && glxpixmap != None)
|
||||
glXQueryDrawable(display(), glxpixmap, GLX_TEXTURE_TARGET_EXT, &new_target);
|
||||
// HACK: this used to be a hack for Xgl.
|
||||
// without this hack the NVIDIA blob aborts when trying to bind a texture from
|
||||
// a pixmap icon
|
||||
if (new_target == 0) {
|
||||
if (NPOTTextureSupported() ||
|
||||
(isPowerOfTwo(mSize.width()) && isPowerOfTwo(mSize.height()))) {
|
||||
new_target = GLX_TEXTURE_2D_EXT;
|
||||
} else {
|
||||
new_target = GLX_TEXTURE_RECTANGLE_EXT;
|
||||
}
|
||||
}
|
||||
switch(new_target) {
|
||||
case GLX_TEXTURE_2D_EXT:
|
||||
mTarget = GL_TEXTURE_2D;
|
||||
|
|
Loading…
Reference in a new issue