SDXFrameWork  0.13
SDXFrameWork
 All Classes Namespaces Functions Variables Enumerations Enumerator Pages
Image.h
1 //Copyright © 2014 SDXFramework
2 //[License]GNU Affero General Public License, version 3
3 //[Contact]http://sourceforge.jp/projects/dxframework/
4 #pragma once
5 #include <Multimedia/SDX.h>
6 #include <Multimedia/Screen.h>
7 #include <Multimedia/Loading.h>
8 #include <Multimedia/IDrawable.h>
9 #include <Framework/Shape.h>
10 #include <Framework/Camera.h>
11 
12 namespace SDX
13 {
17  class Image : public IDrawable
18  {
19  friend class Drawing;
20  friend class ImagePack;//AdjustWidthで必要
21  private:
22  SDL_Rect part;
23  SDL_Texture* handle = nullptr;
24  Color color = { 255, 255, 255 ,255};
25 
27  void RGBACulculate() const
28  {
29  if (Screen::GetRenderer()->blendMode == BlendMode::NoBlend)
30  {
31  //pngの透過部分があるのでNoBlendで描画はしない
32  SDL_SetTextureBlendMode(handle, (SDL_BlendMode)BlendMode::Alpha);
33  SDL_SetTextureAlphaMod(handle, color.GetAlpha());
34  }
35  else
36  {
37  SDL_SetTextureBlendMode(handle, (SDL_BlendMode)Screen::GetRenderer()->blendMode);
38  SDL_SetTextureAlphaMod(handle, Screen::GetRenderer()->rgba.GetAlpha() * color.GetAlpha() / 255);
39  }
40 
41  SDL_SetTextureColorMod
42  (
43  handle,
44  Screen::GetRenderer()->rgba.GetRed() * color.GetRed() / 255,
45  Screen::GetRenderer()->rgba.GetGreen() * color.GetGreen() / 255,
46  Screen::GetRenderer()->rgba.GetBlue() * color.GetBlue() / 255
47  );
48  }
49  public:
50 
51  Image(){};
52 
53  ~Image(){};
54 
56  Image(const char *ファイル名)
57  {
58  Load(ファイル名);
59  }
60 
63  Image(const Image& コピー元, const Rect& コピー領域)
64  {
65  Copy(コピー元, コピー領域);
66  }
67 
69  Image(SDL_Texture* 画像ハンドル,int 幅,int 高さ):
70  handle(画像ハンドル),
71  part({0,0,幅,高さ})
72  {
73  return;//何か書いておかないとDoxygenが不具合を起こす
74  }
75 
77  Image(int 幅, int 高さ)
78  {
79  Make(幅, 高さ);
80  }
81 
83  bool Load(const char *ファイル名)
84  {
85  if (Loading::isLoading)
86  {
87  Loading::AddLoading([=]{ Load(ファイル名);});
88  return true;
89  }
90 
91  if (this->handle != nullptr){ return false; }
92 
93  SDL_Surface* temp = IMG_Load(ファイル名);
94 
95  if (temp == nullptr) return false;
96 
97  handle = SDL_CreateTextureFromSurface(Screen::GetHandle(), temp);
98 
99  part.x = 0;
100  part.y = 0;
101  part.w = temp->w;
102  part.h = temp->h;
103 
104  SDL_FreeSurface(temp);
105  return (handle != nullptr);
106  }
107 
109  bool Release()
110  {
111  if (this->handle != nullptr)
112  {
113  SDL_DestroyTexture(handle);
114  return true;
115  }
116  return false;
117  }
118 
120  SDL_Texture* Make(int 幅, int 高さ)
121  {
122  Release();
123 
124  handle = SDL_CreateTexture(Screen::GetHandle(), 0, SDL_TEXTUREACCESS_TARGET, 幅, 高さ);
125  part.x = 0;
126  part.y = 0;
127  part.w = 幅;
128  part.h = 高さ;
129 
130  return handle;
131  }
132 
135  SDL_Texture* Copy(const Image& 元イメージ, const Rect& コピー領域)
136  {
137  this->handle = 元イメージ.handle;
138  part.x = (int)コピー領域.x;
139  part.y = (int)コピー領域.y;
140  part.w = (int)コピー領域.GetW();
141  part.h = (int)コピー領域.GetH();
142 
143  return handle;
144  }
145 
148  Image Clone(bool is反転 = false) const
149  {
150  return Clone({part.x,part.y,part.w,part.h}, is反転);
151  }
152 
155  Image Clone(const Rect& コピー領域 , bool is反転 = false) const
156  {
157  Image image((int)コピー領域.GetW(), (int)コピー領域.GetH());
158  auto prev = Screen::GetTarget();
159  auto mode = Screen::GetRenderer()->blendMode;
160  auto rgba = Screen::GetRenderer()->rgba;
161  auto cam = Camera::Get();
162 
163  Screen::SetTarget(&image);
165  Camera::Set();
166  DrawPart({ 0, 0 }, コピー領域, is反転);
167  Screen::SetTarget(prev);
168  Screen::SetDrawMode(rgba,mode);
169  Camera::Set(cam);
170 
171  return image;
172  }
173 
175  SDL_Texture* GetHandle() const
176  {
177  return handle;
178  }
179 
181  bool Draw(const Point &座標, bool 反転フラグ = false) const override
182  {
183  SDL_Rect temp = { (int)座標.x, (int)座標.y, part.w, part.h };
184 
185  if (Camera::Get())
186  {
187  temp = Camera::Get()->TransRect(temp);
188  }
189 
190  RGBACulculate();
191  if (反転フラグ)
192  {
193  return !SDL_RenderCopyEx(Screen::GetHandle(), handle, &part, &temp, 0, nullptr, SDL_RendererFlip::SDL_FLIP_HORIZONTAL);
194  }
195  else{
196  return !SDL_RenderCopy(Screen::GetHandle(), handle, &part, &temp);
197  }
198  }
199 
201  bool DrawExtend(const Rect &描画領域 , bool 反転フラグ = false) const override
202  {
203  SDL_Rect temp = { (int)描画領域.x, (int)描画領域.y, (int)描画領域.GetW(), (int)描画領域.GetH() };
204 
205  if (Camera::Get())
206  {
207  temp = Camera::Get()->TransRect(temp);
208  }
209 
210  //サイズがマイナスなら描画しない
211  if (temp.w < 0 || temp.h < 0)
212  {
213  return false;
214  }
215 
216  RGBACulculate();
217  if (反転フラグ)
218  {
219  static SDL_Point point = { 0, 0 };
220  return !SDL_RenderCopyEx(Screen::GetHandle(), handle, &part, &temp, 0, &point, SDL_RendererFlip::SDL_FLIP_HORIZONTAL);
221  }
222  else
223  {
224  return !SDL_RenderCopy(Screen::GetHandle(), handle, &part, &temp);
225  }
226  }
227 
229  bool DrawRotate(const Point &座標, double 拡大率, double 角度, bool 反転フラグ = false) const override
230  {
231  const int wbuf = int(part.w*拡大率);
232  const int hbuf = int(part.h*拡大率);
233  SDL_Rect temp = { (int)座標.x - wbuf / 2, (int)座標.y - hbuf / 2, wbuf, hbuf };
234 
235  if (Camera::Get())
236  {
237  temp = Camera::Get()->TransRect(temp);
238  }
239 
240  RGBACulculate();
241  return !SDL_RenderCopyEx(Screen::GetHandle(), handle, &part, &temp, 角度 * 180 / PAI, nullptr, SDL_RendererFlip(反転フラグ));
242  }
244  bool DrawRotateAxis(const Point &座標, const Point &回転軸座標, double 拡大率, double 角度, bool 反転フラグ = false) const override
245  {
246  return DrawRotateAxis(座標, 回転軸座標, 拡大率, 拡大率, 角度, 反転フラグ);
247  }
249  bool DrawRotateAxis(const Point &座標, const Point &回転軸座標, double 拡大率X, double 拡大率Y, double 角度, bool 反転フラグ = false) const override
250  {
251  const int wbuf = int(part.w*拡大率X);
252  const int hbuf = int(part.h*拡大率Y);
253  SDL_Rect temp = { (int)座標.x - wbuf / 2, (int)座標.y - hbuf / 2, wbuf, hbuf };
254  SDL_Point point = { int(回転軸座標.x*拡大率X), int(回転軸座標.y*拡大率Y) };
255 
256  if (Camera::Get())
257  {
258  temp = Camera::Get()->TransRect(temp);
259  point.x = int(point.x * Camera::Get()->zoom);
260  point.y = int(point.y * Camera::Get()->zoom);
261  }
262 
263  RGBACulculate();
264  return !SDL_RenderCopyEx(Screen::GetHandle(), handle, &part, &temp, 角度 * 180 / PAI, &point, SDL_RendererFlip(反転フラグ));
265  }
266 
268  bool DrawPart(const Point &描画先座標, const Rect &描画元領域, bool 反転フラグ = false) const override
269  {
270  SDL_Rect temp = { (int)描画先座標.x, (int)描画先座標.y, (int)描画元領域.GetW(), (int)描画元領域.GetH() };
271  SDL_Rect part = { (int)描画元領域.x + this->part.x, (int)描画元領域.y + this->part.y, (int)描画元領域.GetW(), (int)描画元領域.GetH() };
272 
273  if (Camera::Get())
274  {
275  temp = Camera::Get()->TransRect(temp);
276  }
277 
278  RGBACulculate();
279  return !SDL_RenderCopyEx(Screen::GetHandle(), handle, &part, &temp, 0, nullptr, SDL_RendererFlip(反転フラグ));
280  }
281 
283  bool DrawPartExtend(const Rect &描画先領域, const Rect &描画元領域, bool 反転フラグ = false) const
284  {
285  SDL_Rect temp = { (int)描画先領域.x, (int)描画先領域.y, (int)描画先領域.GetW(), (int)描画先領域.GetH() };
286  SDL_Rect part = { (int)描画元領域.x + this->part.x, (int)描画元領域.y + this->part.y, (int)描画元領域.GetW(), (int)描画元領域.GetH() };
287 
288  if (Camera::Get())
289  {
290  temp = Camera::Get()->TransRect(temp);
291  }
292 
293  //サイズがマイナスなら描画しない
294  if (temp.w < 0 || temp.h < 0)
295  {
296  return false;
297  }
298 
299  RGBACulculate();
300  return !SDL_RenderCopyEx(Screen::GetHandle(), handle, &part, &temp, 0, nullptr, SDL_RendererFlip(反転フラグ));
301  }
302 
304  int GetWidth() const
305  {
306  return part.w;
307  }
308 
310  int GetHeight() const
311  {
312  return part.h;
313  }
314 
316  void SetColor(const Color &描画色)
317  {
318  color.SetColor(描画色.GetRed(), 描画色.GetGreen(), 描画色.GetBlue(), 描画色.GetAlpha());
319  }
320  };
321 }
SDL_Texture * Copy(const Image &元イメージ, const Rect &コピー領域)
別のImageの一部をコピーして、Imageを初期化.
Definition: Image.h:135
const double PAI
円周率
Definition: SDX.h:26
double y
起点座標
Definition: Rect.h:26
SDL_Texture * Make(int 幅, int 高さ)
空のイメージを作成.
Definition: Image.h:120
int GetGreen() const
緑の要素を取得.
Definition: Color.h:36
矩形を表す図形クラス.
Definition: Rect.h:22
static Image * GetTarget()
描画先Imageを取得.
Definition: Screen.h:55
double y
座標
Definition: Point.h:26
bool DrawRotateAxis(const Point &座標, const Point &回転軸座標, double 拡大率, double 角度, bool 反転フラグ=false) const override
回転軸、角度、拡大率を指定して描画.
Definition: Image.h:244
Color rgba
描画輝度とα値
Definition: Renderer.h:53
bool DrawExtend(const Rect &描画領域, bool 反転フラグ=false) const override
指定矩形内に描画.
Definition: Image.h:201
bool DrawPart(const Point &描画先座標, const Rect &描画元領域, bool 反転フラグ=false) const override
指定した一部分を描画.
Definition: Image.h:268
ブレンドしない
int GetBlue() const
青の要素を取得.
Definition: Color.h:42
リソースを読み込まずに描画を行う関数群.
Definition: Drawing.h:17
SDL_Rect TransRect(const SDL_Rect &変換前矩形) const
領域を画面上のどこに相当するか変換.
Definition: Camera.h:102
点を表す図形クラス.
Definition: Point.h:22
BlendMode blendMode
描画モード
Definition: Renderer.h:51
Image(const char *ファイル名)
画像をメモリへ読み込む.
Definition: Image.h:56
Image(int 幅, int 高さ)
空のイメージを作成.
Definition: Image.h:77
static Renderer * GetRenderer()
アクティブなRendererを取得.
Definition: Screen.h:33
bool DrawRotate(const Point &座標, double 拡大率, double 角度, bool 反転フラグ=false) const override
角度、拡大率を指定して描画.
Definition: Image.h:229
void SetColor(int 赤, int 緑, int 青, int α値=255)
色の各要素を設定.
Definition: Color.h:24
static bool SetTarget(Image *描画対象=nullptr)
描画先を変更.
Definition: Screen.h:48
double x
起点座標
Definition: Rect.h:25
画像データを表すクラス.
Definition: Image.h:17
色を表すクラス.
Definition: Color.h:11
Image Clone(const Rect &コピー領域, bool is反転=false) const
Imageの一部から別Imageを作成.
Definition: Image.h:155
static void AddLoading(std::function< void(void)> &&読み込み関数)
非同期読み込み処理に追加.
Definition: Loading.h:96
int GetHeight() const
高さを取得.
Definition: Image.h:310
int GetWidth() const
幅を取得.
Definition: Image.h:304
SDL_Texture * GetHandle() const
ハンドルを取得.
Definition: Image.h:175
描画可能なクラスのインターフェース.
Definition: IDrawable.h:14
bool Release()
イメージをメモリから開放.
Definition: Image.h:109
static SDL_Renderer * GetHandle()
スクリーンハンドルを取得.
Definition: Screen.h:26
static Camera * Get()
現在アクティブなカメラを取得.
Definition: Camera.h:57
static void SetDrawMode(const Color &輝度+α値=Color::White, BlendMode ブレンドモード=BlendMode::Alpha)
描画輝度と描画モードをまとめて設定
Definition: Screen.h:100
int GetRed() const
赤の要素を取得.
Definition: Color.h:30
Image(SDL_Texture *画像ハンドル, int 幅, int 高さ)
SDL_TextureからImageを作成.
Definition: Image.h:69
αブレンド
double zoom
拡大率、マイナスになると描画が狂う
Definition: Camera.h:45
double x
座標
Definition: Point.h:25
複数のImageをまとめるクラス.
Definition: ImagePack.h:17
static void Set(Camera *アクティブにするCamera=nullptr)
現在アクティブなカメラを設定.
Definition: Camera.h:63
void SetColor(const Color &描画色)
描画色を指定.
Definition: Image.h:316
int GetAlpha() const
透明度を取得.
Definition: Color.h:48
bool DrawPartExtend(const Rect &描画先領域, const Rect &描画元領域, bool 反転フラグ=false) const
指定した一部分を描画.
Definition: Image.h:283
bool Draw(const Point &座標, bool 反転フラグ=false) const override
指定座標に描画.
Definition: Image.h:181
bool Load(const char *ファイル名)
画像をメモリへ読み込む.
Definition: Image.h:83
Image(const Image &コピー元, const Rect &コピー領域)
別のImageの一部をコピーして、Imageを初期化.
Definition: Image.h:63
double GetW() const override
幅を取得.
Definition: Rect.h:107
bool DrawRotateAxis(const Point &座標, const Point &回転軸座標, double 拡大率X, double 拡大率Y, double 角度, bool 反転フラグ=false) const override
回転軸、角度、拡大率を縦横別に指定して描画.
Definition: Image.h:249
double GetH() const override
高さを取得.
Definition: Rect.h:112
Image Clone(bool is反転=false) const
同じImageを作成.
Definition: Image.h:148