From 1835588f29ba1e304a225f3f37f7ae7be85bad16 Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Wed, 16 Dec 2015 20:39:17 +0300
Subject: Add mobileopenglscreenshothelper.

---
 src/CMakeLists.txt                             |   2 +
 src/Makefile.am                                |   2 +
 src/graphicsmanager.cpp                        |   3 +-
 src/resources/mobileopenglscreenshothelper.cpp | 127 +++++++++++++++++++++++++
 src/resources/mobileopenglscreenshothelper.h   |  52 ++++++++++
 5 files changed, 185 insertions(+), 1 deletion(-)
 create mode 100644 src/resources/mobileopenglscreenshothelper.cpp
 create mode 100644 src/resources/mobileopenglscreenshothelper.h

(limited to 'src')

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
-- 
cgit v1.2.3-70-g09d2