gosu 1.0.0 → 1.1.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9c9b393a63015707256dca78e9079b01dbc004d85b89c6bf68d021085f65a905
4
- data.tar.gz: 60396892082e2fa81a7ab03f8662fe00630745f84b1e0a47e9abcd7bed5c7692
3
+ metadata.gz: 444c045288619f5db21634cb5bbdd24bf16c93799d16dc84147cab982282804b
4
+ data.tar.gz: cab4e8823a7b19893cfd3f5b280176ed2b99f76c76278859fe5957bec8aa283a
5
5
  SHA512:
6
- metadata.gz: fb477140be8f524abfeb3694277bd815690c4c0ae432ac011956a43640f49309aca3c0a9b3619c17cc83461ae5c9c9b6fb1bfa155e72f1be19b4f166e23b3022
7
- data.tar.gz: 24707e94f193a4fe949a447a01b732057860eb271a8a0d61ba6c45a0b1b5da8c2894ffc65d3ff3fe2b97fe7e8b9c5b38b9995d4d443d014fe6059f520f900393
6
+ metadata.gz: c4c1168ca82b6e0c969ca8943469010d1eeadc32908ac3b78fc4b61567e0905076dedc2e4509bb55abedccf9ba4f3ccf79ae900093f1de996112548bc0fbad31
7
+ data.tar.gz: 6f7b1cea866fecc2b8bde836790f684fff6990dc89844a66f7a304f7f405625a33200bb6ffe2db987444ecc53e7a8ddee26cb75f7e77f7891393fd564e2ae81b
data/COPYING CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (C) 2001-2020 Julian Raschke, Jan Lücker and all contributors.
1
+ Copyright (C) 2001-2021 Julian Raschke, Jan Lücker and all contributors.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining a
4
4
  copy of this software and associated documentation files (the "Software"),
data/ext/gosu/extconf.rb CHANGED
@@ -51,7 +51,7 @@ if windows
51
51
  else
52
52
  $LDFLAGS << " -L../../dependencies/al_soft/x86 -L../../dependencies/SDL/lib/x86"
53
53
  end
54
- $LDFLAGS << " -lgdi32 -lwinmm -lOpenGL32 -lOpenAL32 -lSDL2"
54
+ $LDFLAGS << " -lgdi32 -lwinmm -ldwmapi -lOpenGL32 -lOpenAL32 -lSDL2"
55
55
  # Link libstdc++ statically to avoid having another DLL dependency when using Ocra.
56
56
  $LDFLAGS << " -static-libstdc++"
57
57
  elsif macos
@@ -62,6 +62,10 @@ elsif macos
62
62
  # rvm will sometimes try to override this:
63
63
  # https://github.com/shawn42/gamebox/issues/96
64
64
  $CXXFLAGS << " -stdlib=libc++"
65
+
66
+ # Disable an error that is disabled by default and prevents Gosu from building with universal Ruby:
67
+ # https://trac.macports.org/ticket/58255 / https://github.com/gosu/gosu/issues/424
68
+ $CXXFLAGS << " -Wno-reserved-user-defined-literal"
65
69
 
66
70
  # Dependencies.
67
71
  $CFLAGS << " #{`sdl2-config --cflags`.chomp}"
@@ -22,11 +22,9 @@ namespace Gosu
22
22
 
23
23
  public:
24
24
  //! Constructs a font that can be drawn onto the graphics object.
25
- //! \param font_name Name of a system font, or a filename to a TTF
26
- //! file (must contain '/', does not work on Linux).
27
- //! \param font_height Height of the font, in pixels.
28
- //! \param font_flags Flags used to render individual characters of
29
- //! the font.
25
+ //! \param name Name of a system font, or a filename to a TTF file.
26
+ //! \param height Height of the font, in pixels.
27
+ //! \param flags Flags used to render individual characters of the font.
30
28
  Font(int height, const std::string& name = default_font_name(), unsigned flags = 0);
31
29
 
32
30
  //! Returns the name of the font that was used to create it.
@@ -20,7 +20,7 @@ namespace Gosu
20
20
  double text_width(const std::u32string& text, const std::string& font_name, double font_height,
21
21
  unsigned font_flags = 0);
22
22
 
23
- //! Draws a line of unformatted text on a bitmap. This is a low-level function that does not
23
+ //! Draws a line of plain text on a bitmap. This is a low-level function that does not
24
24
  //! understand any of Gosu's HTML-like markup.
25
25
  //! \param text A UCS-4 string, normalization: NFC.
26
26
  //! \param font_name Name of a system font, or filename of a TTF file (must contain '/' or '.').
@@ -29,9 +29,9 @@ namespace Gosu
29
29
  double draw_text(Bitmap& bitmap, double x, double y, Color c, const std::u32string& text,
30
30
  const std::string& font_name, double font_height, unsigned font_flags = 0);
31
31
 
32
- //! Creates a bitmap that is filled with the formatted text given to the function.
32
+ //! Creates a bitmap that is filled with the plain text given to the function.
33
33
  //! The line can contain line breaks and HTML-like markup.
34
- //! \param text Formatted text.
34
+ //! \param text Plain text.
35
35
  //! \param font_name Name of a system font, or filename of a TTF file (must contain '/' or '.').
36
36
  //! \param font_height Height of the font in pixels.
37
37
  //! \param line_spacing Spacing between two lines of text in pixels. Can be negative to make
@@ -48,7 +48,7 @@ namespace Gosu
48
48
 
49
49
  //! Creates a bitmap that is filled with the formatted text given to the function.
50
50
  //! The line can contain line breaks and HTML-like markup.
51
- //! \param text Formatted text.
51
+ //! \param markup Formatted text.
52
52
  //! \param font_name Name of a system font, or filename of a TTF file (must contain '/' or '.').
53
53
  //! \param font_height Height of the font in pixels.
54
54
  //! \param line_spacing Spacing between two lines of text in pixels. Can be negative to make
@@ -3,8 +3,8 @@
3
3
  #include <string>
4
4
 
5
5
  #define GOSU_MAJOR_VERSION 1
6
- #define GOSU_MINOR_VERSION 0
7
- #define GOSU_POINT_VERSION 0
6
+ #define GOSU_MINOR_VERSION 1
7
+ #define GOSU_POINT_VERSION 1
8
8
 
9
9
  namespace Gosu
10
10
  {
@@ -8,6 +8,14 @@
8
8
 
9
9
  namespace Gosu
10
10
  {
11
+ enum WindowFlags
12
+ {
13
+ WF_WINDOWED,
14
+ WF_FULLSCREEN = 1,
15
+ WF_RESIZABLE = 2,
16
+ WF_BORDERLESS = 4
17
+ };
18
+
11
19
  //! Convenient all-in-one class that serves as the foundation of a standard Gosu application.
12
20
  //! Manages initialization of all of Gosu's core components and provides timing functionality.
13
21
  //! Note that you should really only use one instance of this class at the same time.
@@ -21,17 +29,23 @@ namespace Gosu
21
29
  //! \param width Width of the window in points; that is, pixels on a normal display, and
22
30
  //! 'points' on a high-resolution display.
23
31
  //! \param height See width.
32
+ //! \param window_flags A bitmask of values from Gosu::WindowFlags.
24
33
  //! \param update_interval Interval in milliseconds between two calls to the update member
25
34
  //! function.
26
- Window(unsigned width, unsigned height, bool fullscreen = false,
27
- double update_interval = 16.666666, bool resizable = false);
35
+ Window(int width, int height, unsigned window_flags = WF_WINDOWED,
36
+ double update_interval = 16.666666);
28
37
  virtual ~Window();
29
38
 
30
- unsigned width() const;
31
- unsigned height() const;
39
+ int width() const;
40
+ int height() const;
32
41
  bool fullscreen() const;
42
+ void resize(int width, int height, bool fullscreen);
43
+
33
44
  bool resizable() const;
34
- void resize(unsigned width, unsigned height, bool fullscreen);
45
+ void set_resizable(bool resizable);
46
+
47
+ bool borderless() const;
48
+ void set_borderless(bool borderless);
35
49
 
36
50
  double update_interval() const;
37
51
  void set_update_interval(double update_interval);
@@ -129,22 +143,22 @@ namespace Gosu
129
143
  //! Returns the width (in pixels) of a screen.
130
144
  //! \param window The result describes the screen on which the window is shown, or the
131
145
  //! primary screen if no window is given.
132
- unsigned screen_width(Window* window = nullptr);
146
+ int screen_width(Window* window = nullptr);
133
147
 
134
148
  //! Returns the height (in pixels) of the user's primary screen.
135
149
  //! \param window The result describes the screen on which the window is shown, or the
136
150
  //! primary screen if no window is given.
137
- unsigned screen_height(Window* window = nullptr);
151
+ int screen_height(Window* window = nullptr);
138
152
 
139
153
  //! Returns the maximum width (in 'points') that is available for a non-fullscreen Window.
140
154
  //! All windows larger than this size will automatically be shrunk to fit.
141
155
  //! \param window The result describes the screen on which the window is shown, or the
142
156
  //! primary screen if no window is given.
143
- unsigned available_width(Window* window = nullptr);
157
+ int available_width(Window* window = nullptr);
144
158
 
145
159
  //! Returns the maximum height (in 'points') that is available for a non-fullscreen Window.
146
160
  //! All windows larger than this size will automatically be shrunk to fit.
147
161
  //! \param window The result describes the screen on which the window is shown, or the
148
162
  //! primary screen if no window is given.
149
- unsigned available_height(Window* window = nullptr);
163
+ int available_height(Window* window = nullptr);
150
164
  }
@@ -3,19 +3,20 @@
3
3
  # compatible, but I just call protected_update etc. in the Ruby wrapper so I can add this
4
4
  # custom debugging help:
5
5
  class Gosu::Window
6
- alias_method :initialize_without_hash, :initialize
6
+ alias_method :initialize_with_bitmask, :initialize
7
7
 
8
- def initialize width, height, *args
9
- if args.empty? or args.first.is_a? Hash
10
- options = args.first || {}
11
- fullscreen = options[:fullscreen]
12
- update_interval = options[:update_interval]
13
- resizable = options[:resizable]
8
+ def initialize(width, height, *args)
9
+ $gosu_gl_blocks = nil
10
+
11
+ if args.first.is_a? Hash
12
+ flags = 0
13
+ flags |= 1 if args.first[:fullscreen]
14
+ flags |= 2 if args.first[:resizable]
15
+ flags |= 4 if args.first[:borderless]
16
+ initialize_with_bitmask(width, height, flags, args.first[:update_interval] || 16.666666)
14
17
  else
15
- fullscreen, update_interval = *args
18
+ initialize_with_bitmask(width, height, args[0] ? 1 : 0, args[1] || 16.666666)
16
19
  end
17
- $gosu_gl_blocks = nil
18
- initialize_without_hash width, height, !!fullscreen, update_interval || 16.666666, !!resizable
19
20
  end
20
21
 
21
22
  %w(update draw needs_redraw? needs_cursor?
data/rdoc/gosu.rb CHANGED
@@ -811,6 +811,18 @@ module Gosu
811
811
  # @return [true, false] whether this window is resizable.
812
812
  def resizable?; end
813
813
 
814
+ ##
815
+ # Toggles between resizable and fixed modes.
816
+ attr_writer :resizable
817
+
818
+ ##
819
+ # @return [true, false] whether this window is borderless.
820
+ def borderless?; end
821
+
822
+ ##
823
+ # Toggles between borderless mode and having window chrome.
824
+ attr_writer :borderless
825
+
814
826
  ##
815
827
  # @return [Float] the interval between calls to {#update}, in milliseconds.
816
828
  attr_accessor :update_interval
@@ -828,7 +840,8 @@ module Gosu
828
840
  # @param height [Integer] the desired window height.
829
841
  # @param [Hash] options
830
842
  # @option options [true, false] :fullscreen (false) whether to present the window in fullscreen mode.
831
- # @option options [true, false] :resizable (false) whether the window can be resized by the user.
843
+ # @option options [true, false] :resizable (false) whether the window can be resized by the user. Not useful if the window is either fullscreen or borderless.
844
+ # @option options [true, false] :borderless (false) whether the window should hide all its window chrome. Does not affect fullscreen windows.
832
845
  # @option options [Float] :update_interval (16.666666) the interval between frames, in milliseconds.
833
846
  def initialize(width, height, options); end
834
847
 
data/src/Input.cpp CHANGED
@@ -78,20 +78,11 @@ struct Gosu::Input::Impl
78
78
 
79
79
  void update_mouse_position()
80
80
  {
81
- #if SDL_VERSION_ATLEAST(2, 0, 5)
82
- // SDL_GetGlobalMouseState was added in SDL 2.0.4, but it only started using the same
83
- // coordinate system as SDL_GetWindowPosition on X11 in 2.0.5.
84
81
  int x, y, window_x, window_y;
85
82
  SDL_GetWindowPosition(window, &window_x, &window_y);
86
83
  SDL_GetGlobalMouseState(&x, &y);
87
84
  mouse_x = x - window_x;
88
85
  mouse_y = y - window_y;
89
- #else
90
- int x, y;
91
- SDL_GetMouseState(&x, &y);
92
- mouse_x = x;
93
- mouse_y = y;
94
- #endif
95
86
  }
96
87
 
97
88
  void set_mouse_position(double x, double y)
@@ -100,7 +91,7 @@ struct Gosu::Input::Impl
100
91
  static_cast<int>((x - mouse_offset_x) / mouse_scale_x),
101
92
  static_cast<int>((y - mouse_offset_y) / mouse_scale_y));
102
93
 
103
- #if SDL_VERSION_ATLEAST(2, 0, 4) && !defined(GOSU_IS_X)
94
+ #if !defined(GOSU_IS_X)
104
95
  // On systems where we have a working GetGlobalMouseState, we can warp the mouse and
105
96
  // retrieve its position directly afterwards.
106
97
  update_mouse_position();
data/src/Macro.cpp CHANGED
@@ -1,168 +1,125 @@
1
1
  #include "Macro.hpp"
2
2
  #include "DrawOpQueue.hpp"
3
3
  #include <Gosu/Image.hpp>
4
- #include <cmath>
5
- #include <algorithm>
6
- #include <functional>
7
- #include <memory>
8
4
  #include <stdexcept>
9
5
  using namespace std;
10
6
 
11
7
  struct Gosu::Macro::Impl
12
8
  {
13
- typedef double Float;
14
-
15
9
  VertexArrays vertex_arrays;
16
10
  int width, height;
17
-
18
- Transform find_transform_for_target(Float x1, Float y1, Float x2, Float y2,
19
- Float x3, Float y3, Float x4, Float y4) const
11
+
12
+ // Solves the 2x2 linear system for x:
13
+ // (a11 a12) (x1) = (b1)
14
+ // (a21 a22) (x2) = (b2)
15
+ // x1, x2 are output parameters. Returns false if the matrix is singular.
16
+ static bool solve_2x2(double a11, double a12, double a21, double a22, double b1, double b2,
17
+ double& x1, double& x2)
18
+ {
19
+ const double det = a11 * a22 - a21 * a12;
20
+ if (det == 0) return false;
21
+ x1 = (a22 * b1 - a12 * b2) / det;
22
+ x2 = (a11 * b2 - a21 * b1) / det;
23
+ return true;
24
+ }
25
+
26
+ Transform find_transform_for_target(double x1, double y1, double x2, double y2,
27
+ double x3, double y3, double x4, double y4) const
20
28
  {
21
29
  // Transformation logic follows a discussion on the ImageMagick mailing
22
30
  // list (on which ImageMagick's perspective_transform.pl is based).
23
-
31
+
24
32
  // To draw a macro at an arbitrary position, we solve the following system:
25
-
26
- // 0, 0, 1, 0, 0, 0, 0, 0 | x1
27
- // 0, 0, 0, 0, 0, 1, 0, 0 | y1
28
- // w, 0, 1, 0, 0, 0, -x2w, 0 | x2
29
- // 0, 0, 0, w, 0, 1, -y2w, 0 | y2
30
- // 0, h, 1, 0, 0, 0, 0, -x3h | x3
31
- // 0, 0, 0, 0, h, 1, 0, -y3h | y3
32
- // w, h, 1, 0, 0, 0, -x4w, -x4h | x4
33
- // 0, 0, 0, w, h, 1, -y4w, -y4h | y4
34
-
33
+
34
+ // 0, 0, 1, 0, 0, 0, 0, 0 | x1
35
+ // 0, 0, 0, 0, 0, 1, 0, 0 | y1
36
+ // w, 0, 1, 0, 0, 0, -x2 w, 0 | x2
37
+ // 0, 0, 0, w, 0, 1, -y2 w, 0 | y2
38
+ // 0, h, 1, 0, 0, 0, 0, -x3 h | x3
39
+ // 0, 0, 0, 0, h, 1, 0, -y3 h | y3
40
+ // w, h, 1, 0, 0, 0, -x4 w, -x4 h | x4
41
+ // 0, 0, 0, w, h, 1, -y4 w, -y4 h | y4
42
+
35
43
  // Equivalent:
36
-
37
- // 0, 0, 1, 0, 0, 0, 0, 0 | x1
38
- // 0, 0, 0, 0, 0, 1, 0, 0 | y1
39
- // w, 0, 0, 0, 0, 0, -x2w, 0 | x2-x1
40
- // 0, 0, 0, w, 0, 0, -y2w, 0 | y2-y1
41
- // 0, h, 0, 0, 0, 0, 0, -x3h | x3-x1
42
- // 0, 0, 0, 0, h, 0, 0, -y3h | y3-y1
43
- // 0, 0, 0, 0, 0, 0, (x2-x4)w, (x3-x4)h | x1-x2-x3+x4
44
- // 0, 0, 0, 0, 0, 0, (y2-y4)w, (y3-y4)h | y1-y2-y3+y4
45
-
46
- // Since this matrix is relatively sparse, we unroll all three solving paths.
47
-
48
- static const Transform null_transform = {{ 0 }};
49
-
50
- // Row 7 is completely useless
51
- if (x2 == x4 && x3 == x4) return null_transform;
52
- // Row 8 is completely useless
53
- if (y2 == y3 && y3 == y4) return null_transform;
54
- // Col 7 is completely useless
55
- if (x2 == x4 && y2 == y4) return null_transform;
56
- // Col 8 is completely useless
57
- if (x3 == x4 && y3 == y4) return null_transform;
58
-
59
- Float c[8];
60
-
61
- // Rows 1, 2
44
+
45
+ // 0, 0, 1, 0, 0, 0, 0, 0 | x1
46
+ // 0, 0, 0, 0, 0, 1, 0, 0 | y1
47
+ // w, 0, 0, 0, 0, 0, -x2 w, 0 | x2-x1
48
+ // 0, 0, 0, w, 0, 0, -y2 w, 0 | y2-y1
49
+ // 0, h, 0, 0, 0, 0, 0, -x3 h | x3-x1
50
+ // 0, 0, 0, 0, h, 0, 0, -y3 h | y3-y1
51
+ // 0, 0, 0, 0, 0, 0, (x2-x4) w, (x3-x4) h | x1-x2-x3+x4
52
+ // 0, 0, 0, 0, 0, 0, (y2-y4) w, (y3-y4) h | y1-y2-y3+y4
53
+
54
+ // The last two rows only involve the last two variables.
55
+ // We can directly solve this as a separate 2x2 linear system.
56
+
57
+ // Set up 2x2 linear system of the lower right corner entries.
58
+ const double a11 = (x2 - x4) * width;
59
+ const double a12 = (x3 - x4) * height;
60
+ const double a21 = (y2 - y4) * width;
61
+ const double a22 = (y3 - y4) * height;
62
+ const double b1 = x1 - x2 - x3 + x4;
63
+ const double b2 = y1 - y2 - y3 + y4;
64
+
65
+ // Solve:
66
+ double qx, qy;
67
+ if (!solve_2x2(a11, a12, a21, a22, b1, b2, qx, qy)) return Transform{{0}};
68
+
69
+ // Updating the last two rows with the computed solution yields
70
+
71
+ // 0, 0, 1, 0, 0, 0, 0, 0 | x1
72
+ // 0, 0, 0, 0, 0, 1, 0, 0 | y1
73
+ // w, 0, 0, 0, 0, 0, -x2 w, 0 | x2-x1
74
+ // 0, 0, 0, w, 0, 0, -y2 w, 0 | y2-y1
75
+ // 0, h, 0, 0, 0, 0, 0, -x3 h | x3-x1
76
+ // 0, 0, 0, 0, h, 0, 0, -y3 h | y3-y1
77
+ // 0, 0, 0, 0, 0, 0, 1, 0 | qx
78
+ // 0, 0, 0, 0, 0, 0, 0, 1 | qy
79
+
80
+ // We can use the last two rows to eliminate entries in rows 3, 4, 5, and 6:
81
+
82
+ // 0, 0, 1, 0, 0, 0, 0, 0 | x1
83
+ // 0, 0, 0, 0, 0, 1, 0, 0 | y1
84
+ // w, 0, 0, 0, 0, 0, 0, 0 | x2-x1 + qx x2 w
85
+ // 0, 0, 0, w, 0, 0, 0, 0 | y2-y1 + qx y2 w
86
+ // 0, h, 0, 0, 0, 0, 0, 0 | x3-x1 + qy x3 h
87
+ // 0, 0, 0, 0, h, 0, 0, 0 | y3-y1 + qy y3 h
88
+ // 0, 0, 0, 0, 0, 0, 1, 0 | qx
89
+ // 0, 0, 0, 0, 0, 0, 0, 1 | qy
90
+
91
+ // Normalize and reorder rows so we can read off the solution:
92
+
93
+ // 1, 0, 0, 0, 0, 0, 0, 0 | (x2-x1) / w + qx x2
94
+ // 0, 1, 0, 0, 0, 0, 0, 0 | (x3-x1) / h + qy x3
95
+ // 0, 0, 1, 0, 0, 0, 0, 0 | x1
96
+ // 0, 0, 0, 1, 0, 0, 0, 0 | (y2-y1) / w + qx y2
97
+ // 0, 0, 0, 0, 1, 0, 0, 0 | (y3-y1) / h + qy y3
98
+ // 0, 0, 0, 0, 0, 1, 0, 0 | y1
99
+ // 0, 0, 0, 0, 0, 0, 1, 0 | qx
100
+ // 0, 0, 0, 0, 0, 0, 0, 1 | qy
101
+
102
+ double c[8];
103
+ c[0] = (x2 - x1) / width + qx * x2;
104
+ c[1] = (x3 - x1) / height + qy * x3;
62
105
  c[2] = x1;
106
+ c[3] = (y2 - y1) / width + qx * y2;
107
+ c[4] = (y3 - y1) / height + qy * y3;
63
108
  c[5] = y1;
64
-
65
- // The logic below assumes x2 != x4, i.e. row7 can be used to eliminate
66
- // the leftmost value in row 8 and afterwards the values in rows 3 & 4.
67
- // If x2 == x4, we need to exchange rows 7 and 8.
68
-
69
- // TODO: x2==x4 is the normal case where an image is
70
- // drawn upright; the code should rather swap in the rare case that x3==x4!
71
-
72
- Float left_cell7 = (x2 - x4) * width;
73
- Float right_cell7 = (x3 - x4) * height;
74
- Float orig_right_side7 = (x1 - x2 - x3 + x4);
75
- Float left_cell8 = (y2 - y4) * width;
76
- Float right_cell8 = (y3 - y4) * height;
77
- Float orig_right_side8 = (y1 - y2 - y3 + y4);
78
-
79
- bool swap_rows78 = x2 == x4;
80
- if (swap_rows78) {
81
- swap(left_cell7, left_cell8);
82
- swap(right_cell7, right_cell8);
83
- swap(orig_right_side7, orig_right_side8);
84
- }
85
-
86
- // 0, 0, 1, 0, 0, 0, 0, 0 | x1
87
- // 0, 0, 0, 0, 0, 1, 0, 0 | y1
88
- // w, 0, 0, 0, 0, 0, -x2w, 0 | x2-x1
89
- // 0, 0, 0, w, 0, 0, -y2w, 0 | y2-y1
90
- // 0, h, 0, 0, 0, 0, 0, -x3h | x3-x1
91
- // 0, 0, 0, 0, h, 0, 0, -y3h | y3-y1
92
- // 0, 0, 0, 0, 0, 0, left_cell7, right_cell7 | orig_right_side7
93
- // 0, 0, 0, 0, 0, 0, left_cell8, right_cell8 | orig_right_side8
94
-
95
- // Use row 7 to eliminate the left cell in row 8
96
- // Row8 = Row8 - factor78 * Row7
97
- Float factor78 = left_cell8 / left_cell7;
98
- Float rem_cell8 = right_cell8 - right_cell7 * factor78;
99
- Float right_side8 = orig_right_side8 - orig_right_side7 * factor78;
100
- c[7] = right_side8 / rem_cell8;
101
-
102
- // 0, 0, 1, 0, 0, 0, 0, 0 | x1
103
- // 0, 0, 0, 0, 0, 1, 0, 0 | y1
104
- // w, 0, 0, 0, 0, 0, -x2w, 0 | x2-x1
105
- // 0, 0, 0, w, 0, 0, -y2w, 0 | y2-y1
106
- // 0, h, 0, 0, 0, 0, 0, -x3h | x3-x1
107
- // 0, 0, 0, 0, h, 0, 0, -y3h | y3-y1
108
- // 0, 0, 0, 0, 0, 0, left_cell7, right_cell7 | orig_right_side7
109
- // 0, 0, 0, 0, 0, 0, 0, rem_cell8 | right_side8
110
-
111
- // Use the remaining value in row 8 to eliminate the right value in row 7.
112
- // Row7 = Row7 - factor87 * Row8
113
- Float factor87 = right_cell7 / rem_cell8;
114
- Float rem_cell7 = left_cell7;
115
- Float right_side7 = orig_right_side7 - right_side8 * factor87;
116
- c[6] = right_side7 / rem_cell7;
117
-
118
- // 0, 0, 1, 0, 0, 0, 0, 0 | x1
119
- // 0, 0, 0, 0, 0, 1, 0, 0 | y1
120
- // w, 0, 0, 0, 0, 0, -x2w, 0 | x2-x1
121
- // 0, 0, 0, w, 0, 0, -y2w, 0 | y2-y1
122
- // 0, h, 0, 0, 0, 0, 0, -x3h | x3-x1
123
- // 0, 0, 0, 0, h, 0, 0, -y3h | y3-y1
124
- // 0, 0, 0, 0, 0, 0, rem_cell7, 0 | right_side7
125
- // 0, 0, 0, 0, 0, 0, 0, rem_cell8 | right_side8
126
-
127
- // Use the new rows 7 and 8 to calculate c0, c1, c3 & c4.
128
- // Row3 = Row3 - factor73 * Row7
129
- Float factor73 = -x2 * width / rem_cell7;
130
- Float rem_cell3 = width;
131
- Float right_side3 = (x2 - x1) - right_side7 * factor73;
132
- c[0] = right_side3 / rem_cell3;
133
- // Row4 = Row4 - factor74 * Row7
134
- Float factor74 = -y2 * width / rem_cell7;
135
- Float rem_cell4 = width;
136
- Float right_side4 = (y2 - y1) - right_side7 * factor74;
137
- c[3] = right_side4 / rem_cell4;
138
- // Row5 = Row5 - factor85 * Row7
139
- Float factor85 = -x3 * height / rem_cell8;
140
- Float rem_cell5 = height;
141
- Float right_side5 = (x3 - x1) - right_side8 * factor85;
142
- c[1] = right_side5 / rem_cell5;
143
- // Row6 = Row6 - factor86 * Row8
144
- Float factor86 = -y3 * height / rem_cell8;
145
- Float rem_cell6 = height;
146
- Float right_side6 = (y3 - y1) - right_side8 * factor86;
147
- c[4] = right_side6 / rem_cell6;
148
-
149
- if (swap_rows78) {
150
- swap(c[6], c[7]);
151
- }
152
-
153
- // Let's hope I never have to debug/understand this again! :D
154
-
109
+ c[6] = qx;
110
+ c[7] = qy;
111
+
155
112
  Transform result = {{
156
113
  c[0], c[3], 0, c[6],
157
114
  c[1], c[4], 0, c[7],
158
- 0, 0, 1, 0,
115
+ 0, 0, 1, 0,
159
116
  c[2], c[5], 0, 1
160
117
  }};
161
118
  return result;
162
119
  }
163
-
164
- void draw_vertex_arrays(Float x1, Float y1, Float x2, Float y2, Float x3, Float y3,
165
- Float x4, Float y4) const
120
+
121
+ void draw_vertex_arrays(double x1, double y1, double x2, double y2, double x3, double y3,
122
+ double x4, double y4) const
166
123
  {
167
124
  // TODO: Macros should not be split up just because they have different transforms.
168
125
  // They should be premultiplied and have the same transform by definition. Then the