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 }