1 /*
2 * * Copyright (C) 2006-2011 Anders Brander <anders@brander.dk>,
3 * * Anders Kvist <akv@lnxbx.dk> and Klaus Post <klauspost@gmail.com>
4 *
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License
7 * as published by the Free Software Foundation; either version 2
8 * of the License, or (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 */
19
20 #include <gtk/gtk.h>
21 #include "rs-filter-request.h"
22
23 struct _RSFilterRequest {
24 RSFilterParam parent;
25 gboolean roi_set;
26 GdkRectangle roi;
27 gboolean quick;
28 };
29
G_DEFINE_TYPE(RSFilterRequest,rs_filter_request,RS_TYPE_FILTER_PARAM)30 G_DEFINE_TYPE(RSFilterRequest, rs_filter_request, RS_TYPE_FILTER_PARAM)
31
32 static void
33 rs_filter_request_finalize(GObject *object)
34 {
35 G_OBJECT_CLASS (rs_filter_request_parent_class)->finalize (object);
36 }
37
38 static void
rs_filter_request_class_init(RSFilterRequestClass * klass)39 rs_filter_request_class_init(RSFilterRequestClass *klass)
40 {
41 GObjectClass *object_class = G_OBJECT_CLASS (klass);
42
43 object_class->finalize = rs_filter_request_finalize;
44 }
45
46 static void
rs_filter_request_init(RSFilterRequest * filter_request)47 rs_filter_request_init(RSFilterRequest *filter_request)
48 {
49 filter_request->roi_set = FALSE;
50 filter_request->quick = FALSE;
51 }
52
53 /**
54 * Instantiate a new RSFilterRequest
55 * @return A new RSFilterRequest with a refcount of 1
56 */
57 RSFilterRequest *
rs_filter_request_new(void)58 rs_filter_request_new(void)
59 {
60 return g_object_new(RS_TYPE_FILTER_REQUEST, NULL);
61 }
62
63 /**
64 * Get a RSFilterRequest singleton with quick set to TRUE
65 * @return A RSFilterRequest, this should not be unreffed
66 */
rs_filter_request_get_quick_singleton(void)67 const RSFilterRequest *rs_filter_request_get_quick_singleton(void)
68 {
69 RSFilterRequest *request = NULL;
70 static GStaticMutex lock = G_STATIC_MUTEX_INIT;
71
72 g_static_mutex_lock(&lock);
73 if (!request)
74 {
75 request = rs_filter_request_new();
76 rs_filter_request_set_quick(request, TRUE);
77 }
78 g_static_mutex_unlock(&lock);
79
80 return request;
81 }
82
83 /**
84 * Clone a RSFilterRequest
85 * @param filter_request A RSFilterRequest
86 * @return A new RSFilterRequest with a refcount of 1 with the same settings as
87 * filter_request
88 */
89 RSFilterRequest *
rs_filter_request_clone(const RSFilterRequest * filter_request)90 rs_filter_request_clone(const RSFilterRequest *filter_request)
91 {
92 RSFilterRequest *new_filter_request = rs_filter_request_new();
93
94 if (RS_IS_FILTER_REQUEST(filter_request))
95 {
96 new_filter_request->roi_set = filter_request->roi_set;
97 new_filter_request->roi = filter_request->roi;
98 new_filter_request->quick = filter_request->quick;
99
100 rs_filter_param_clone(RS_FILTER_PARAM(new_filter_request), RS_FILTER_PARAM(filter_request));
101 }
102
103 return new_filter_request;
104 }
105
106 /**
107 * Set a region of interest
108 * @param filter_request A RSFilterRequest
109 * @param roi A GdkRectangle describing the ROI or NULL to disable
110 */
111 void
rs_filter_request_set_roi(RSFilterRequest * filter_request,GdkRectangle * roi)112 rs_filter_request_set_roi(RSFilterRequest *filter_request, GdkRectangle *roi)
113 {
114 g_assert(RS_IS_FILTER_REQUEST(filter_request));
115
116 filter_request->roi_set = FALSE;
117
118 if (roi)
119 {
120 filter_request->roi_set = TRUE;
121 filter_request->roi = *roi;
122 }
123 }
124
125 /**
126 * Get the region of interest from a RSFilterRequest
127 * @param filter_request A RSFilterRequest
128 * @return A GdkRectangle describing the ROI or NULL if none is set, the
129 * GdkRectangle belongs to the filter_request and should not be freed
130 */
131 GdkRectangle *
rs_filter_request_get_roi(const RSFilterRequest * filter_request)132 rs_filter_request_get_roi(const RSFilterRequest *filter_request)
133 {
134 GdkRectangle *ret = NULL;
135
136 if (RS_IS_FILTER_REQUEST(filter_request) && filter_request->roi_set)
137 ret = &RS_FILTER_REQUEST(filter_request)->roi;
138
139 return ret;
140 }
141
142 /**
143 * Mark a request as "quick" allowing filters to priotize speed over quality
144 * @param filter_request A RSFilterRequest
145 * @param quick TRUE to mark a request as QUICK, FALSE to set normal (default)
146 */
rs_filter_request_set_quick(RSFilterRequest * filter_request,gboolean quick)147 void rs_filter_request_set_quick(RSFilterRequest *filter_request, gboolean quick)
148 {
149 g_assert(RS_IS_FILTER_REQUEST(filter_request));
150
151 filter_request->quick = quick;
152 }
153
154 /**
155 * Get quick status of a RSFilterRequest
156 * @param filter_request A RSFilterRequest
157 * @return TRUE if quality should be sacrified for speed, FALSE otherwise
158 */
rs_filter_request_get_quick(const RSFilterRequest * filter_request)159 gboolean rs_filter_request_get_quick(const RSFilterRequest *filter_request)
160 {
161 gboolean ret = FALSE;
162
163 if (RS_IS_FILTER_REQUEST(filter_request))
164 ret = filter_request->quick;
165
166 return ret;
167 }
168