1// Aseprite Render Library
2// Copyright (c) 2020 Igara Studio S.A.
3// Copyright (c) 2016 David Capello
4//
5// This file is released under the terms of the MIT license.
6// Read LICENSE.txt for more information.
7
8#ifndef RENDER_PROJECTION_H_INCLUDED
9#define RENDER_PROJECTION_H_INCLUDED
10#pragma once
11
12#include "doc/pixel_ratio.h"
13#include "gfx/matrix.h"
14#include "render/zoom.h"
15
16namespace render {
17
18 class Projection {
19 public:
20 Projection()
21 : m_pixelRatio(1, 1),
22 m_zoom(1, 1) {
23 }
24
25 Projection(const doc::PixelRatio& pixelRatio,
26 const Zoom& zoom)
27 : m_pixelRatio(pixelRatio),
28 m_zoom(zoom) {
29 }
30
31 const doc::PixelRatio& pixelRatio() const { return m_pixelRatio; }
32 const Zoom& zoom() const { return m_zoom; }
33
34 void setPixelRatio(const doc::PixelRatio& pixelRatio) { m_pixelRatio = pixelRatio; }
35 void setZoom(const Zoom& zoom) { m_zoom = zoom; }
36
37 double scaleX() const { return m_zoom.scale() * m_pixelRatio.w; }
38 double scaleY() const { return m_zoom.scale() * m_pixelRatio.h; }
39
40 template<typename T>
41 T applyX(T x) const { return m_zoom.apply<T>(x * T(m_pixelRatio.w)); }
42
43 template<typename T>
44 T applyY(T y) const { return m_zoom.apply<T>(y * T(m_pixelRatio.h)); }
45
46 template<typename T>
47 T removeX(T x) const { return m_zoom.remove<T>(x) / T(m_pixelRatio.w); }
48
49 template<typename T>
50 T removeY(T y) const { return m_zoom.remove<T>(y) / T(m_pixelRatio.h); }
51
52 template<typename T>
53 T removeXCeiling(T x) const { return T(m_zoom.removeCeiling(x)) / T(m_pixelRatio.w); }
54
55 template<typename T>
56 T removeYCeiling(T y) const { return T(m_zoom.removeCeiling(y)) / T(m_pixelRatio.h); }
57
58 gfx::Rect apply(const gfx::Rect& r) const {
59 int u = applyX(r.x);
60 int v = applyY(r.y);
61 return gfx::Rect(u, v,
62 applyX(r.x+r.w) - u,
63 applyY(r.y+r.h) - v);
64 }
65
66 gfx::RectF apply(const gfx::RectF& r) const {
67 double u = applyX(r.x);
68 double v = applyY(r.y);
69 return gfx::RectF(u, v,
70 applyX(r.x+r.w) - u,
71 applyY(r.y+r.h) - v);
72 }
73
74 gfx::Rect remove(const gfx::Rect& r) const {
75 int u = removeX(r.x);
76 int v = removeY(r.y);
77 return gfx::Rect(u, v,
78 removeX(r.x+r.w) - u,
79 removeY(r.y+r.h) - v);
80 }
81
82 gfx::RectF remove(const gfx::RectF& r) const {
83 double u = removeX(r.x);
84 double v = removeY(r.y);
85 return gfx::RectF(u, v,
86 removeX(r.x+r.w) - u,
87 removeY(r.y+r.h) - v);
88 }
89
90 gfx::Matrix scaleMatrix() const {
91 return gfx::Matrix::MakeScale(scaleX(), scaleY());
92 }
93
94 private:
95 doc::PixelRatio m_pixelRatio;
96 Zoom m_zoom;
97 };
98
99} // namespace render
100
101#endif
102