1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
/*
* This file is part of the planetblupi source code
* Copyright (C) 1997, Daniel Roux & EPSITEC SA
* Copyright (C) 2017-2018, Mathieu Schroeter
* http://epsitec.ch; http://www.blupi.org; http://github.com/blupi-games
*
* 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 3 of the License, or
* (at your option) 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://gnu.org/licenses
*/
#pragma once
#include <SDL.h>
#include <string>
#include <unordered_map>
#include "blupi.h"
#include "def.h"
#define MAXCURSORS 14
struct TextureInfo {
SDL_Texture * texMask;
SDL_Texture * texture;
bool target; // can be used as a render target
std::string file;
std::string wideName;
Point dimTotal;
Point dimIcon;
TextureInfo ()
: texMask (nullptr)
, texture (nullptr)
, target (false)
, dimTotal{0}
, dimIcon{0}
{
}
};
class CEvent;
class CPixmap
{
public:
enum Mode {
FIX = 0,
EXPAND,
};
CPixmap (CEvent * event);
~CPixmap ();
bool Create (Point dim);
void CreateMainTexture ();
bool ReloadTargetTextures ();
bool Cache (size_t channel, Point totalDim);
bool Cache (
size_t channel, const std::string & pFilename, Point totalDim,
Point iconDim, Mode mode = FIX, std::string wideName = "");
bool Cache (size_t channel, const std::string & pFilename, Point totalDim);
bool Cache (size_t channel, SDL_Surface * surface, Point totalDim);
SDL_Texture * getTexture (size_t channel);
void SetClipping (Rect clip);
Rect GetClipping ();
bool IsIconPixel (size_t channel, Sint32 rank, Point pos);
bool DrawIcon (Sint32 chDst, size_t channel, Sint32 rank, Point pos);
bool DrawIconDemi (Sint32 chDst, size_t channel, Sint32 rank, Point pos);
bool DrawIconPart (
Sint32 chDst, size_t channel, Sint32 rank, Point pos, Sint32 startY,
Sint32 endY);
bool DrawPart (Sint32 chDst, size_t channel, Point dest, Rect rect);
bool DrawImage (Sint32 chDst, size_t channel, Rect rect);
bool BuildIconMask (
size_t channelMask, Sint32 rankMask, size_t channel, Sint32 rankSrc,
Sint32 rankDst);
bool Display ();
void SetMouseSprite (MouseSprites sprite);
void MouseShow (bool bShow);
void LoadCursors ();
void ChangeSprite (MouseSprites sprite);
public:
double GetDisplayScale ();
void FromDisplayToGame (Sint32 & x, Sint32 & y, double prevScale = 1);
void FromGameToDisplay (Sint32 & x, Sint32 & y);
protected:
Sint32 BltFast (Sint32 dstCh, size_t srcCh, Rect dstR, Rect srcR);
Sint32 BltFast (Sint32 chDst, size_t channel, Point dst, Rect rcRect);
Sint32 BltFast (
SDL_Texture * lpSDL, size_t channel, Point dst, Rect rcRect,
SDL_BlendMode = SDL_BLENDMODE_BLEND);
Rect MouseRectSprite ();
SDL_Point GetCursorHotSpot (MouseSprites sprite);
SDL_Rect GetCursorRect (MouseSprites sprite);
protected:
bool m_bDebug;
bool m_bPalette;
Point m_dim; // dimensions totales
Rect m_clipRect; // rectangle de clipping
MouseSprites m_mouseSprite;
bool m_bBackDisplayed;
CEvent * event;
SDL_Cursor * m_lpCurrentCursor;
SDL_Cursor * m_lpSDLCursors[MAXCURSORS];
SDL_Surface * m_lpSDLBlupi;
SDL_Texture * mainTexture;
std::unordered_map<size_t, TextureInfo> m_SDLTextureInfo;
};
|