summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2015-12-16 20:39:17 +0300
committerAndrei Karas <akaras@inbox.ru>2015-12-16 20:39:17 +0300
commit1835588f29ba1e304a225f3f37f7ae7be85bad16 (patch)
treef3f4ff0c6652cd5a58746bdc0123d8db786ffd97
parent3bc086323f5d81011b6ecb628afabaad881f5741 (diff)
downloadmanaverse-1835588f29ba1e304a225f3f37f7ae7be85bad16.tar.gz
manaverse-1835588f29ba1e304a225f3f37f7ae7be85bad16.tar.bz2
manaverse-1835588f29ba1e304a225f3f37f7ae7be85bad16.tar.xz
manaverse-1835588f29ba1e304a225f3f37f7ae7be85bad16.zip
Add mobileopenglscreenshothelper.
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/graphicsmanager.cpp3
-rw-r--r--src/resources/mobileopenglscreenshothelper.cpp127
-rw-r--r--src/resources/mobileopenglscreenshothelper.h52
5 files changed, 185 insertions, 1 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index b04034add..9b5f58718 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -668,6 +668,8 @@ SET(SRCS
enums/resources/map/mapitemtype.h
resources/mapreader.cpp
resources/mapreader.h
+ resources/mobileopenglscreenshothelper.cpp
+ resources/mobileopenglscreenshothelper.h
resources/modinfo.cpp
resources/modinfo.h
resources/mstack.h
diff --git a/src/Makefile.am b/src/Makefile.am
index 4eb3066e3..5ebff5069 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1152,6 +1152,8 @@ manaplus_SOURCES += main.cpp \
enums/resources/map/mapitemtype.h \
resources/mapreader.cpp \
resources/mapreader.h \
+ resources/mobileopenglscreenshothelper.cpp \
+ resources/mobileopenglscreenshothelper.h \
resources/modinfo.cpp \
resources/modinfo.h \
resources/beingcommon.cpp \
diff --git a/src/graphicsmanager.cpp b/src/graphicsmanager.cpp
index eea4ad67b..7a6e97f1f 100644
--- a/src/graphicsmanager.cpp
+++ b/src/graphicsmanager.cpp
@@ -63,6 +63,7 @@
#include "resources/openglimagehelper.h"
#include "resources/openglscreenshothelper.h"
#ifndef ANDROID
+#include "resources/mobileopenglscreenshothelper.h"
#include "resources/safeopenglimagehelper.h"
#endif // ANDROID
#include "render/mglfunctions.h"
@@ -310,7 +311,7 @@ int GraphicsManager::detectGraphics()
imageHelper = new OpenGLImageHelper; \
surfaceImageHelper = new SurfaceImageHelper; \
mainGraphics = new MobileOpenGL2Graphics; \
- screenshortHelper = new OpenGLScreenshotHelper; \
+ screenshortHelper = new MobileOpenGLScreenshotHelper; \
mUseTextureSampler = false;
#endif // defined(ANDROID)
diff --git a/src/resources/mobileopenglscreenshothelper.cpp b/src/resources/mobileopenglscreenshothelper.cpp
new file mode 100644
index 000000000..50dbcbc64
--- /dev/null
+++ b/src/resources/mobileopenglscreenshothelper.cpp
@@ -0,0 +1,127 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#if defined(USE_OPENGL) && !defined(ANDROID)
+
+#include "resources/mobileopenglscreenshothelper.h"
+
+#include "configuration.h"
+#include "graphicsmanager.h"
+
+#include "render/mgl.h"
+#ifdef __native_client__
+#include "render/naclglfunctions.h"
+#endif
+
+#include "debug.h"
+
+MobileOpenGLScreenshotHelper::MobileOpenGLScreenshotHelper() :
+ ScreenshotHelper(),
+ mFbo()
+{
+}
+
+MobileOpenGLScreenshotHelper::~MobileOpenGLScreenshotHelper()
+{
+}
+
+void MobileOpenGLScreenshotHelper::prepare()
+{
+ if (config.getBoolValue("usefbo"))
+ graphicsManager.createFBO(mainGraphics->mWidth,
+ mainGraphics->mHeight,
+ &mFbo);
+}
+
+SDL_Surface *MobileOpenGLScreenshotHelper::getScreenshot()
+{
+ const int h = mainGraphics->mHeight;
+ const int w = mainGraphics->mWidth - (mainGraphics->mWidth % 4);
+ GLint pack = 1;
+
+ SDL_Surface *const tmpImage = MSDL_CreateRGBSurface(
+ SDL_SWSURFACE, w, h, 32,
+ 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000);
+
+ if (!tmpImage)
+ return nullptr;
+
+ // Grap the pixel buffer and write it to the SDL surface
+ mglGetIntegerv(GL_PACK_ALIGNMENT, &pack);
+ mglPixelStorei(GL_PACK_ALIGNMENT, 1);
+ mglReadPixels(0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, tmpImage->pixels);
+
+ const size_t lineSize = 3 * w;
+ GLubyte *const buf = new GLubyte[lineSize];
+
+ SDL_Surface *const screenshot = MSDL_CreateRGBSurface(
+ SDL_SWSURFACE, w, h, 24,
+ 0xff0000, 0x00ff00, 0x0000ff, 0x000000);
+
+ if (!screenshot)
+ {
+ MSDL_FreeSurface(tmpImage);
+ return nullptr;
+ }
+
+#ifdef USE_SDL2
+ SDL_SetSurfaceAlphaMod(tmpImage, SDL_ALPHA_OPAQUE);
+ SDL_SetSurfaceBlendMode(tmpImage, SDL_BLENDMODE_NONE);
+#else
+ // Make sure the alpha channel is not used, but copied to destination
+ SDL_SetAlpha(tmpImage, 0, SDL_ALPHA_OPAQUE);
+#endif
+
+ if (SDL_MUSTLOCK(screenshot))
+ SDL_LockSurface(screenshot);
+
+ SDL_BlitSurface(tmpImage, nullptr, screenshot, nullptr);
+ MSDL_FreeSurface(tmpImage);
+
+ // Flip the screenshot, as OpenGL has 0,0 in bottom left
+ const int h2 = h / 2;
+ for (int i = 0; i < h2; i++)
+ {
+ GLubyte *const top = static_cast<GLubyte*>(
+ screenshot->pixels) + lineSize * i;
+ GLubyte *const bot = static_cast<GLubyte*>(
+ screenshot->pixels) + lineSize * (h - 1 - i);
+
+ memcpy(buf, top, lineSize);
+ memcpy(top, bot, lineSize);
+ memcpy(bot, buf, lineSize);
+ }
+
+ delete [] buf;
+
+ if (config.getBoolValue("usefbo"))
+ graphicsManager.deleteFBO(&mFbo);
+
+ mglPixelStorei(GL_PACK_ALIGNMENT, pack);
+
+ if (SDL_MUSTLOCK(screenshot))
+ SDL_UnlockSurface(screenshot);
+
+ return screenshot;
+}
+
+#endif // defined(USE_OPENGL) && !defined(ANDROID)
diff --git a/src/resources/mobileopenglscreenshothelper.h b/src/resources/mobileopenglscreenshothelper.h
new file mode 100644
index 000000000..fa06d0dc5
--- /dev/null
+++ b/src/resources/mobileopenglscreenshothelper.h
@@ -0,0 +1,52 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011-2015 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef RESOURCES_MOBILEOPENGLSCREENSHOTHELPER_H
+#define RESOURCES_MOBILEOPENGLSCREENSHOTHELPER_H
+
+#if defined(USE_OPENGL) && !defined(ANDROID)
+
+#include "resources/screenshothelper.h"
+
+#include "resources/fboinfo.h"
+
+#include "localconsts.h"
+
+class MobileOpenGLScreenshotHelper final : public ScreenshotHelper
+{
+ public:
+ MobileOpenGLScreenshotHelper();
+
+ A_DELETE_COPY(MobileOpenGLScreenshotHelper)
+
+ ~MobileOpenGLScreenshotHelper();
+
+ void prepare() override final;
+
+ SDL_Surface *getScreenshot() override final;
+
+ private:
+ FBOInfo mFbo;
+};
+
+#endif // defined(USE_OPENGL) && !defined(ANDROID)
+#endif // RESOURCES_MOBILEOPENGLSCREENSHOTHELPER_H