00001 #include <gtk/gtk.h>
00002 #include "vapiImagesAux.h"
00003 #include "vapiGtkImages.h"
00004 #include "vapiGtkInterface.h"
00005
00006 static struct _vGtkImages
00007 {
00008 GMutex *mutexOriginal;
00009 GMutex *mutexActual;
00010 GMutex *mutexWork;
00011 vImages *Images;
00012 GtkWidget *imOriginal;
00013 GtkWidget *imActual;
00014 GtkWidget *imWork;
00015 } GtkImages;
00016
00017 void
00018 vapiGtkImagesThreadsInit (GtkWidget * imOriginal, GtkWidget * imActual,
00019 GtkWidget * imWork, vImages * Images)
00020 {
00021 GtkImages.mutexOriginal = g_mutex_new ();
00022 GtkImages.mutexActual = g_mutex_new ();
00023 GtkImages.mutexWork = g_mutex_new ();
00024 GtkImages.Images = Images;
00025 GtkImages.imOriginal = imOriginal;
00026 GtkImages.imActual = imActual;
00027 GtkImages.imWork = imWork;
00028 }
00029
00030 gboolean
00031 vapiGtkImagesUpdateIdle (vGtkImagesIdle * GtkImagesIdle)
00032 {
00033 GMutex *tempMutex;
00034 GtkWidget *tempWidget;
00035 vBoolean FreeImage = vTRUE;
00036 switch (GtkImagesIdle->GtkImageWidget)
00037 {
00038 case gtkImActual:
00039 {
00040 v_debug ("ImagesUpdateIdle: Seleccionado o imActual");
00041 tempMutex = GtkImages.mutexActual;
00042 tempWidget = GtkImages.imActual;
00043 if (!g_mutex_trylock (tempMutex))
00044 {
00045
00046
00047 cvReleaseImage (&GtkImagesIdle->Image);
00048
00049 vGtkImagesIdleFree (GtkImagesIdle);
00050 v_debug ("ImagesUpdateIdle: trylock false");
00051 return TRUE;
00052 }
00053 vapiImagesSetActual (GtkImages.Images, GtkImagesIdle->Image);
00054 break;
00055 }
00056 case gtkImWork:
00057 {
00058 v_debug ("ImagesUpdateIdle: Seleccionado o imWork");
00059 tempMutex = GtkImages.mutexWork;
00060 tempWidget = GtkImages.imWork;
00061 if (!g_mutex_trylock (tempMutex))
00062 {
00063 cvReleaseImage (&GtkImagesIdle->Image);
00064 vGtkImagesIdleFree (GtkImagesIdle);
00065 v_debug ("ImagesUpdateIdle: trylock false in work mutex");
00066 return TRUE;
00067 }
00068 if (!g_mutex_trylock (GtkImages.mutexActual))
00069 {
00070 cvReleaseImage (&GtkImagesIdle->Image);
00071 vGtkImagesIdleFree (GtkImagesIdle);
00072 g_mutex_unlock (tempMutex);
00073 v_debug ("ImagesUpdateIdle: trylock false in Actual mutex");
00074 return TRUE;
00075 }
00076 break;
00077 }
00078 case gtkImOriginal:
00079 {
00080 v_debug ("ImagesUpdateIdle: Seleccionado o imOriginal");
00081 tempMutex = GtkImages.mutexOriginal;
00082 tempWidget = GtkImages.imOriginal;
00083 if (!g_mutex_trylock (tempMutex))
00084 {
00085 cvReleaseImage (&GtkImagesIdle->Image);
00086 vGtkImagesIdleFree (GtkImagesIdle);
00087 v_debug ("ImagesUpdateIdle: trylock false in work mutex");
00088 return TRUE;
00089 }
00090 vapiImagesSetOriginal (GtkImages.Images,
00091 GtkImagesIdle->Image);
00092 FreeImage = vFALSE;
00093 v_debug ("ImagesUpdateIdle: trylock true");
00094 break;
00095 }
00096 default:
00097 {
00098 cvReleaseImage (&GtkImagesIdle->Image);
00099 vGtkImagesIdleFree (GtkImagesIdle);
00100 return FALSE;
00101 break;
00102 }
00103 }
00104 vapiGtkPutImage (tempWidget, GtkImagesIdle->Image);
00105 v_debug ("ImagesUpdateIdle: trylock actualizou");
00106 g_mutex_unlock (tempMutex);
00107 if (GtkImagesIdle->GtkImageWidget == gtkImWork)
00108 {
00109 g_mutex_unlock (GtkImages.mutexActual);
00110 }
00111 v_debug ("ImagesUpdateIdle: trylock desbloqueou");
00112 vGtkImagesIdleFree (GtkImagesIdle);
00113 return FALSE;
00114 }
00115
00116 void
00117 vapiGtkImagesUpdateInterface (vImages * Images, int GtkImageWidget)
00118 {
00119 vGtkImagesIdle *GtkImagesIdle;
00120 IplImage *Image;
00121 switch (GtkImageWidget)
00122 {
00123 case gtkImWork:
00124 case gtkImActual:
00125 {
00126 Image = Images->Actual;
00127 break;
00128 }
00129 case gtkImOriginal:
00130 {
00131 Image = Images->Original;
00132 break;
00133 }
00134 default:
00135 {
00136 Image = Images->Actual;
00137 }
00138 }
00139 GtkImagesIdle = vGtkImagesIdleNew (Image, GtkImageWidget);
00140 v_debug ("ImagesUpdate inicio");
00141 g_idle_add ((GSourceFunc) & vapiGtkImagesUpdateIdle, GtkImagesIdle);
00142 }
00143
00144 vGtkImagesIdle *
00145 vGtkImagesIdleNew (IplImage * Image, int GtkImageWidget)
00146 {
00147 vGtkImagesIdle *GtkImagesIdle = malloc (sizeof (vGtkImagesIdle));
00148 GtkImagesIdle->Image = vapiImagesCopy (Image);
00149 GtkImagesIdle->GtkImageWidget = GtkImageWidget;
00150 return GtkImagesIdle;
00151 }
00152
00153 void
00154 vGtkImagesIdleFree (vGtkImagesIdle * vFree)
00155 {
00156 free (vFree);
00157 }
00158
00159 void
00160 vGtkImagesIdleChangeImage (vGtkImagesIdle * GtkImagesIdle, int GtkImageWidget)
00161 {
00162 GtkImagesIdle->GtkImageWidget = GtkImageWidget;
00163 }
00164
00165 gboolean
00166 vapiGtkImagesFastUpdateIdle (vGtkImagesIdleFast * GtkImagesIdleFast)
00167 {
00168 GMutex *tempMutex;
00169 GtkWidget *tempWidget;
00170
00171 switch (GtkImagesIdleFast->GtkImageWidget)
00172 {
00173 case gtkImActual:
00174 {
00175 v_debug ("ImagesUpdateIdle: Seleccionado o imActual");
00176 tempMutex = GtkImages.mutexActual;
00177 tempWidget = GtkImages.imActual;
00178 if (!g_mutex_trylock (tempMutex))
00179 {
00180 vGtkImagesIdleFastFree (GtkImagesIdleFast);
00181 v_debug ("ImagesUpdateIdle: trylock false");
00182 return FALSE;
00183 }
00184 break;
00185 }
00186 case gtkImWork:
00187 {
00188 v_debug ("ImagesUpdateIdle: Seleccionado o imWork");
00189 tempMutex = GtkImages.mutexWork;
00190 tempWidget = GtkImages.imWork;
00191 if (!g_mutex_trylock (tempMutex))
00192 {
00193 vGtkImagesIdleFastFree (GtkImagesIdleFast);
00194 v_debug ("ImagesUpdateIdle: trylock false in work mutex");
00195 return FALSE;
00196 }
00197 if (!g_mutex_trylock (GtkImages.mutexActual))
00198 {
00199 vGtkImagesIdleFastFree (GtkImagesIdleFast);
00200 g_mutex_unlock (tempMutex);
00201 v_debug ("ImagesUpdateIdle: trylock false in Actual mutex");
00202 return FALSE;
00203 }
00204 break;
00205 }
00206 case gtkImOriginal:
00207 {
00208 v_debug ("ImagesUpdateIdle: Seleccionado o imOriginal");
00209 tempMutex = GtkImages.mutexOriginal;
00210 tempWidget = GtkImages.imOriginal;
00211 if (!g_mutex_trylock (tempMutex))
00212 {
00213 vGtkImagesIdleFastFree (GtkImagesIdleFast);
00214 v_debug ("ImagesUpdateIdle: trylock false in work mutex");
00215 return FALSE;
00216 }
00217 break;
00218 }
00219 default:
00220 {
00221 vGtkImagesIdleFastFree (GtkImagesIdleFast);
00222 return FALSE;
00223 break;
00224 }
00225 }
00226 v_debug ("ImagesUpdateIdle: trylock true");
00227 vapiGtkPutImage (tempWidget, GtkImagesIdleFast->Image);
00228 v_debug ("ImagesUpdateIdle: trylock actualizou");
00229 g_mutex_unlock (tempMutex);
00230 if (GtkImagesIdleFast->GtkImageWidget == gtkImWork)
00231 {
00232 g_mutex_unlock (GtkImages.mutexActual);
00233 }
00234 v_debug ("ImagesUpdateIdle: trylock desbloqueou");
00235 vGtkImagesIdleFastFree (GtkImagesIdleFast);
00236
00237 return FALSE;
00238 }
00239
00240 void
00241 vapiGtkImagesFastUpdateInterface (IplImage * Image, int GtkImageWidget)
00242 {
00243 vGtkImagesIdleFast *GtkImagesIdleFast;
00244 GtkImagesIdleFast = vGtkImagesIdleFastNew (Image, GtkImageWidget);
00245
00246 v_debug ("ImagesUpdateFast inicio");
00247 g_idle_add ((GSourceFunc) & vapiGtkImagesFastUpdateIdle,
00248 GtkImagesIdleFast);
00249 }
00250
00251 vGtkImagesIdleFast *
00252 vGtkImagesIdleFastNew (IplImage * Image, int GtkImageWidget)
00253 {
00254 vGtkImagesIdleFast *GtkImagesIdleFast =
00255 malloc (sizeof (vGtkImagesIdleFast));
00256 GtkImagesIdleFast->Image = vapiImagesCopy (Image);
00257 GtkImagesIdleFast->GtkImageWidget = GtkImageWidget;
00258 return GtkImagesIdleFast;
00259 }
00260
00261 void
00262 vGtkImagesIdleFastFree (vGtkImagesIdleFast * vFree)
00263 {
00264 cvReleaseImage (&vFree->Image);
00265 free (vFree);
00266 }
00267
00268 GtkFileFilter *
00269 vapiGtkImagesFilter ()
00270 {
00271 GtkFileFilter *filter;
00272 filter = gtk_file_filter_new ();
00273 gtk_file_filter_set_name (filter, "Imagens");
00274 gtk_file_filter_add_pattern (filter, "*.jpg");
00275 gtk_file_filter_add_pattern (filter, "*.bmp");
00276 gtk_file_filter_add_pattern (filter, "*.gif");
00277 gtk_file_filter_add_pattern (filter, "*.png");
00278 gtk_file_filter_add_pattern (filter, "*.tif");
00279 gtk_file_filter_add_pattern (filter, "*.tiff");
00280 gtk_file_filter_add_pattern (filter, "*.pcx");
00281 gtk_file_filter_add_pattern (filter, "*.JPG");
00282 return filter;
00283 }