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