ManaPlus
sdl2softwarescreenshothelper.cpp
Go to the documentation of this file.
1 /*
2  * The ManaPlus Client
3  * Copyright (C) 2004-2009 The Mana World Development Team
4  * Copyright (C) 2009-2010 The Mana Developers
5  * Copyright (C) 2011-2019 The ManaPlus Developers
6  * Copyright (C) 2019-2021 Andrei Karas
7  *
8  * This file is part of The ManaPlus Client.
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or
13  * any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program. If not, see <http://www.gnu.org/licenses/>.
22  */
23 
24 #ifdef USE_SDL2
25 
27 
29 
30 #include "utils/sdlcheckutils.h"
31 
32 PRAGMA48(GCC diagnostic push)
33 PRAGMA48(GCC diagnostic ignored "-Wshadow")
34 #ifndef SDL_BIG_ENDIAN
35 #include <SDL_endian.h>
36 #endif // SDL_BYTEORDER
37 PRAGMA48(GCC diagnostic pop)
38 
39 #include "debug.h"
40 
41 Sdl2SoftwareScreenshotHelper::Sdl2SoftwareScreenshotHelper() :
43 {
44 }
45 
46 Sdl2SoftwareScreenshotHelper::~Sdl2SoftwareScreenshotHelper()
47 {
48 }
49 
50 void Sdl2SoftwareScreenshotHelper::prepare()
51 {
52 }
53 
54 SDL_Surface *Sdl2SoftwareScreenshotHelper::getScreenshot()
55 {
56  if (!mainGraphics)
57  return nullptr;
58 
59 #if SDL_BYTEORDER == SDL_BIG_ENDIAN
60  const int rmask = 0xff000000;
61  const int gmask = 0x00ff0000;
62  const int bmask = 0x0000ff00;
63 #else // SDL_BYTEORDER == SDL_BIG_ENDIAN
64 
65  const int rmask = 0x000000ff;
66  const int gmask = 0x0000ff00;
67  const int bmask = 0x00ff0000;
68 #endif // SDL_BYTEORDER == SDL_BIG_ENDIAN
69 
70  const int amask = 0x00000000;
71 
72  SDL_Surface *const screenshot = MSDL_CreateRGBSurface(SDL_SWSURFACE,
74  24,
75  rmask, gmask, bmask, amask);
76 
77  if (screenshot)
78  {
79  SDL_BlitSurface(static_cast<SDL2SoftwareGraphics*>(
80  mainGraphics)->mSurface, nullptr, screenshot, nullptr);
81  }
82 
83  return screenshot;
84 }
85 
86 #endif // USE_SDL2
int mWidth
Definition: graphics.h:484
int mHeight
Definition: graphics.h:485
#define MSDL_CreateRGBSurface(flags, w, h, d, r, g, b, a)
Definition: debug.h:55
Graphics * mainGraphics
Definition: graphics.cpp:109
#define PRAGMA48(str)
Definition: localconsts.h:199
bool screenshot(InputEvent &event)
Definition: actions.cpp:51