src/interface/vapiGtkImages.c

Ir para a documentação deste ficheiro.
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 }

Gerado em Tue Jul 24 10:34:58 2007 para Vapi por  doxygen 1.5.1