Revert part of "GPencil: Invert Paste operator and make Paste to Active default"
[blender.git] / source / blender / windowmanager / intern / wm_subwindow.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19
20 /** \file
21  * \ingroup wm
22  *
23  * OpenGL utilities for setting up 2D viewport for window and regions.
24  */
25
26 #include "BLI_math.h"
27 #include "BLI_rect.h"
28
29 #include "DNA_screen_types.h"
30 #include "DNA_windowmanager_types.h"
31
32 #include "BIF_gl.h"
33
34 #include "GPU_matrix.h"
35
36 #include "WM_api.h"
37
38 void wmViewport(const rcti *winrct)
39 {
40   int width = BLI_rcti_size_x(winrct) + 1;
41   int height = BLI_rcti_size_y(winrct) + 1;
42
43   glViewport(winrct->xmin, winrct->ymin, width, height);
44   glScissor(winrct->xmin, winrct->ymin, width, height);
45
46   wmOrtho2_pixelspace(width, height);
47   GPU_matrix_identity_set();
48 }
49
50 void wmPartialViewport(rcti *drawrct, const rcti *winrct, const rcti *partialrct)
51 {
52   /* Setup part of the viewport for partial redraw. */
53   bool scissor_pad;
54
55   if (partialrct->xmin == partialrct->xmax) {
56     /* Full region. */
57     *drawrct = *winrct;
58     scissor_pad = true;
59   }
60   else {
61     /* Partial redraw, clipped to region. */
62     BLI_rcti_isect(winrct, partialrct, drawrct);
63     scissor_pad = false;
64   }
65
66   int x = drawrct->xmin - winrct->xmin;
67   int y = drawrct->ymin - winrct->ymin;
68   int width = BLI_rcti_size_x(winrct) + 1;
69   int height = BLI_rcti_size_y(winrct) + 1;
70
71   int scissor_width = BLI_rcti_size_x(drawrct);
72   int scissor_height = BLI_rcti_size_y(drawrct);
73
74   /* Partial redraw rect uses different convention than region rect,
75    * so compensate for that here. One pixel offset is noticeable with
76    * viewport border render. */
77   if (scissor_pad) {
78     scissor_width += 1;
79     scissor_height += 1;
80   }
81
82   glViewport(0, 0, width, height);
83   glScissor(x, y, scissor_width, scissor_height);
84
85   wmOrtho2_pixelspace(width, height);
86   GPU_matrix_identity_set();
87 }
88
89 void wmWindowViewport(wmWindow *win)
90 {
91   int width = WM_window_pixels_x(win);
92   int height = WM_window_pixels_y(win);
93
94   glViewport(0, 0, width, height);
95   glScissor(0, 0, width, height);
96
97   wmOrtho2_pixelspace(width, height);
98   GPU_matrix_identity_set();
99 }
100
101 void wmOrtho2(float x1, float x2, float y1, float y2)
102 {
103   /* prevent opengl from generating errors */
104   if (x2 == x1) {
105     x2 += 1.0f;
106   }
107   if (y2 == y1) {
108     y2 += 1.0f;
109   }
110
111   GPU_matrix_ortho_set(x1, x2, y1, y2, -100, 100);
112 }
113
114 static void wmOrtho2_offset(const float x, const float y, const float ofs)
115 {
116   wmOrtho2(ofs, x + ofs, ofs, y + ofs);
117 }
118
119 /* Default pixel alignment for regions. */
120 void wmOrtho2_region_pixelspace(const ARegion *ar)
121 {
122   wmOrtho2_offset(ar->winx, ar->winy, -0.01f);
123 }
124
125 void wmOrtho2_pixelspace(const float x, const float y)
126 {
127   wmOrtho2_offset(x, y, -GLA_PIXEL_OFS);
128 }
129
130 void wmGetProjectionMatrix(float mat[4][4], const rcti *winrct)
131 {
132   int width = BLI_rcti_size_x(winrct) + 1;
133   int height = BLI_rcti_size_y(winrct) + 1;
134   orthographic_m4(mat,
135                   -GLA_PIXEL_OFS,
136                   (float)width - GLA_PIXEL_OFS,
137                   -GLA_PIXEL_OFS,
138                   (float)height - GLA_PIXEL_OFS,
139                   -100,
140                   100);
141 }