gpiv-0.6.1/0000777000175000017500000000000011204235560007466 500000000000000gpiv-0.6.1/po/0000777000175000017500000000000011204235560010104 500000000000000gpiv-0.6.1/po/ca.po0000644000175000017500000014151011076052422010746 00000000000000# ca translation of gpiv 0.0 . # Copyright (C) 2008 Free Software Foundation, Inc. # Gerber , 2008. # # msgid "" msgstr "" "Project-Id-Version: gpiv 0.5.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-04-09 11:38+0200\n" "PO-Revision-Date: 2008-04-16 12:34+0200\n" "Last-Translator: Gerber \n" "Language-Team: ca \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit" #: ../src/main.c:857 msgid "" "row_start larger than nrows; \n" "set to zero" msgstr "" "row_start mes gran que nrows; \n" "posat en nul" #: ../src/main.c:992 msgid "Image analyser for Particle Image Velocimetry" msgstr "Analitzador per Particle Image Velocimetry" #: ../src/main.c:1058 msgid "Trigger system not available" msgstr "El sistem del trigger no esta en funcio" #: ../src/main.c:1081 msgid "No camera connected" msgstr "No hi ha un camera conectat" #: ../src/main.c:1094 #, c-format msgid "Image dimensions or depth are larger than %dx%dx%d." msgstr "Els dimensions o profunditat d'imatge es mes gran que %dx%dx%d." #: ../src/support.c:95 ../src/support.c:120 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "No ha pogut trobar el fitxe pixmap: %s" #: ../src/utils.c:326 msgid "January" msgstr "Gener" #: ../src/utils.c:328 msgid "February" msgstr "Febrer" #: ../src/utils.c:330 msgid "March" msgstr "Mars" #: ../src/utils.c:332 msgid "April" msgstr "Abril" #: ../src/utils.c:334 msgid "May" msgstr "Mai" #: ../src/utils.c:336 msgid "June" msgstr "Juny" #: ../src/utils.c:338 msgid "July" msgstr "Juliol" #: ../src/utils.c:340 msgid "August" msgstr "Agust" #: ../src/utils.c:342 msgid "September" msgstr "Setembre" #: ../src/utils.c:344 msgid "October" msgstr "Octubre" #: ../src/utils.c:346 msgid "November" msgstr "Novembre" #: ../src/utils.c:348 msgid "December" msgstr "Desembre" #: ../src/utils.c:350 msgid "Bad month" msgstr "Monat incorrecte" #: ../src/utils.c:352 msgid "month_name: Unvalid month" msgstr "month_name: Monat incorrecte" #: ../src/utils.c:484 #, c-format msgid "" "There are unsaved data that will be lost.\n" "Are you sure you want to close buffer #%d ?" msgstr "" "Hi ha dades no guardat que perderas\n" "Estas segur que vols tancar el buffrer #%d?" #: ../src/console_menus.h:101 ../src/console_menus.h:185 msgid "GPIV buttons" msgstr "butons GPIV" #: ../src/console_menus.h:102 ../src/console_menus.h:186 msgid "show GPIV check-buttons" msgstr "enseignes la barra GPIV check-buttons" #: ../src/console_menus.h:109 ../src/console_menus.h:192 msgid "tabulator" msgstr "taula" #: ../src/console_menus.h:110 ../src/console_menus.h:193 msgid "show tabulator containing parameter settings" msgstr "enseignes la taula que porten les parametres" #: ../src/console_menus.h:119 ../src/console_menus.h:200 msgid "Preferences" msgstr "Preferencies" #: ../src/console_menus.h:120 msgid "Define settings of the application" msgstr "Poses les parametres de la aplicacio" #: ../src/console_menus.h:134 ../src/console_menus.h:214 msgid "show tooltips" msgstr "enseignar instructions" #: ../src/console_menus.h:135 ../src/console_menus.h:215 msgid "show extended information in a small pop-up window" msgstr "enseignes informacio llarga en un finestre petita pop-up" #: ../src/console_menus.h:142 ../src/console_menus.h:221 msgid "manual" msgstr "manual" #: ../src/console_interface.c:538 msgid "Open a PIV image or data-file" msgstr "Obres un imatge PIV o un fiche de dades" #: ../src/console_interface.c:558 msgid "Save data" msgstr "Guardar dades" #: ../src/console_interface.c:600 msgid "Execute the enabled chain process(es)" msgstr "Executar els procesos de cadena connectat" #: ../src/console_interface.c:621 msgid "Cancels all running processes" msgstr "Pares totes les proceses executan" #: ../src/console_interface.c:648 msgid "" "Close active buffer(s).\n" "A warning message will be issued for unsaved data" msgstr "" "Tances tots els buffers actiu\n" "Un message d'avisar surtira per dades no guardads" #: ../src/console_interface.c:683 msgid "" "Exit GPIV.\n" "A warning message will be issued for unsaved data" msgstr "" "Tances el GPIV.\n" "Un message d'avisar surtira per dades no guardads" #. #. * camera process button #. #: ../src/console_interface.c:801 msgid "camera" msgstr "camera" #: ../src/console_interface.c:815 msgid "" "Enables camera for image recording within the chain process. \n" "The process will be executed by clicking the Execute button" msgstr "" "Conectes el camera per grabar imatges en el proces cadena. \n" "El proces sera executat per empretar el boto d'Executacio" #. #. * trigger process button #. #: ../src/console_interface.c:845 msgid "trigger" msgstr "trigger" #: ../src/console_interface.c:859 msgid "" "Enables (RTAI) camera and laser triggering within the chain process. \n" "The process will be executed by clicking the Execute button" msgstr "" "Conectes (RTAI) camera i trigger del laser en el proces cadena. \n" "El proces sera executat per empretar el boto d'Executacio" #. #. * Image processing button #. #: ../src/console_interface.c:889 msgid "image" msgstr "imatge" #: ../src/console_interface.c:903 msgid "" "Enables image processing within the chain process. \n" "The process will be executed by clicking the Execute button" msgstr "" "Conectes processar d'imatges en el proces cadena: \n" "El proces sera executat per empretar el boto d'Executacio" #. #. * piv process button #. #. #. * PIV activating button #. #: ../src/console_interface.c:930 ../src/piveval_interface.c:2792 msgid "piv" msgstr "piv" #: ../src/console_interface.c:944 msgid "" "Enables PIV image interrogation for chain processing: analysing of a PIV " "image (pair), resulting into the mean displacements of the particle images " "within each interrogation area. \n" "The process will be executed by clicking the Execute button" msgstr "" "Conectes el proces PIV en el proces cadena: \n" "la analyse d'una (pareilla) d'imatge(s) que resultan en el displacement " "mitjana \n" "dels particules en una area d'interrogacio.\n" "El proces sera executat per empretar el boto d'Executacio" #: ../src/console_interface.c:972 msgid "gradient" msgstr "gradient" #: ../src/console_interface.c:986 msgid "" "Enables gradient for chain processing: Disables velocities with gradients " "larger than 0.05 over the interrogation area. \n" "The process will be executed by clicking the \"Execute\" button" msgstr "" "Conectes gradient en el proces cadena: disconnectar velocitats que son mes " "gran de 0.05 en al area de interrogacio.\n" "El proces sera executat per empretar el boto d'Executacio" #: ../src/console_interface.c:1012 ../src/pivvalid_interface.c:618 msgid "residu" msgstr "residu" #: ../src/console_interface.c:1026 msgid "" "Enables residu statistics for chain processing: calculates the residus of " "displacements for detection of outliers and shows an histogram of them. The " "histogram will be displayed in the Piv Validation tab. \n" "The process will be executed by clicking the Execute button" msgstr "" "Conectes residu en el proces cadena: la calculacio dels residuals dels " "displacements per trobar outliers i enseignar un histogram. \n" "El histogram sera enseignat en la taula Piv Validacio.\n" "El proces sera executat per empretar el boto d'Executacio" #: ../src/console_interface.c:1054 msgid "validate" msgstr "validacio" #: ../src/console_interface.c:1068 msgid "" "Enables validation for chain processing: detects outliers of PIV data by " "testing on median residu or by Signal to Noise Ratio magnitudes and, " "eventually, substitutes. \n" "The process will be executed by clicking the Execute button" msgstr "" "Conectes validacio en el proces cadena: trobar els outliers en dades PIV " "per \n" "examinar els residuals mediana o pel ratio Signal / Soroll i, si es " "possible, substitueix.\n" "El proces sera executat per pretar el boto d'Executacio" #: ../src/console_interface.c:1095 ../src/pivvalid_interface.c:654 msgid "sub-pixel" msgstr "sub-pixel" #: ../src/console_interface.c:1109 msgid "" "Enables peak-lock for chain processing: shows an histogram of sub-pixel " "displacements to check on peak-locking effects. The histogram will be " "displayed in the Piv Validation tab. \n" "The process will be executed by clicking the \"Execute\" button" msgstr "" "Conectes peak-lock en el proces cadena: enseignes una histograma dels " "displacements en nivell sub-pixel\n" "per examinar effectes de peak-locking. El histogram sera enseignat en la " "taula Piv Validacio\n" "El proces sera executat per empretar el boto d'Executacio" #: ../src/console_interface.c:1136 ../src/pivpost_interface.c:479 msgid "scale" msgstr "scala" #: ../src/console_interface.c:1149 msgid "" "Enables scaling for chain processing: scales spatial displacements over all " "data. \n" "The process will be executed by clicking the \"Execute\" button" msgstr "" "Conectes scalar en el proces cadena: scalar spatial en totes les dades.\n" "El proces sera executat per empretar el boto d'Executacio" #. #. * end of KEEP DISABLED #. #. #. * button to calculate averages #. #: ../src/console_interface.c:1175 ../src/pivpost_interface.c:698 msgid "average" msgstr "mitja" #: ../src/console_interface.c:1188 msgid "" "Enables average for chain processing: Calculates spatial average " "displacements over all data. \n" "The process will be executed by clicking the \"Execute\" button" msgstr "" "Conectes mitja en el proces cadena: Calculacio dels displacemts mitja " "espacial utilizant totes les dades\n" "El proces sera executat per empretar el boto d'Executacio" #. #. * button to subtract averages or zero offset displacements / velocities #. #: ../src/console_interface.c:1214 ../src/pivpost_interface.c:740 msgid "subtract" msgstr "treure" #: ../src/console_interface.c:1228 msgid "" "Enables subtract for chain processing: subtracts spatial average " "displacements from all data. \n" "The process will be executed by clicking the \"Execute\" button" msgstr "" "Conectes treure en el proces cadena: treus el displacement mitja espacial \n" "des de totes les dades.\n" "El proces sera executat per empretar el boto d'Executacio" #: ../src/console_interface.c:1254 ../src/pivpost_interface.c:1219 msgid "vorticity" msgstr "vorticitat" #: ../src/console_interface.c:1268 msgid "" "Enables vorticity for chain processing: calculates vorticity or strain " "magnitudes from a velocity field.\n" "The process will be executed by clicking the Execute button" msgstr "" "Conectes vorticitat en el proces cadena: calculacio de vorticitat o tensio " "shorn\n" "El proces sera executat per empretar el boto d'Executacio" #: ../src/console_interface.c:1336 msgid "Record" msgstr "Grabar" #: ../src/console_interface.c:1357 msgid "Image" msgstr "Imatge" #: ../src/console_interface.c:1385 msgid "Process" msgstr "Procesos" #: ../src/console_interface.c:1417 msgid "Interrogate" msgstr "Interrogacio" #: ../src/console_interface.c:1513 msgid "Validate" msgstr "Validacio" #. gtk_object_set_data (GTK_OBJECT (gpiv->console), #. "gpiv", #. gpiv); #: ../src/console_interface.c:1610 msgid "Post process" msgstr "Post procesing" #: ../src/console_interface.c:1694 msgid "buffer names and numbers" msgstr "noms i numeros dels buffers" #: ../src/console_interface.c:1792 msgid "buffer list" msgstr "llista del buffer" #: ../src/console_interface.c:1813 msgid "#" msgstr "#" #: ../src/console_interface.c:1825 msgid "buffer name" msgstr "nom del buffer" #: ../src/console.c:846 msgid "cancel_process = TRUE" msgstr "cancel_process = TRUE" #: ../src/console.c:857 msgid "cancel_process = FALSE" msgstr "cancel_process = FALSE" #: ../src/console.c:1199 msgid "Opens image/PIV data (and display)" msgstr "Obres imatge/piv-dades (i finestre d'enseignar)" #: ../src/console.c:1213 msgid "Saves data" msgstr "Guardar dades" #: ../src/console.c:1227 msgid "Prints selected buffer(s)" msgstr "Imprimir els buffers selectades" #: ../src/console.c:1241 msgid "Executes all tickmarked processes" msgstr "Executar totes proceses marcat" #: ../src/console.c:1255 msgid "Cancels any running processes" msgstr "Pares tots els processos executant" #: ../src/console.c:1269 msgid "Close active buffer(s)" msgstr "Tances tots els buffers actiu" #: ../src/console.c:1283 msgid "Exits GPIV" msgstr "Surt el GPIV" #: ../src/imgh_interface.c:113 msgid "Image information and settings" msgstr "Informacio d'imatge i definicios" #: ../src/imgh_interface.c:212 msgid "buffer #: " msgstr "buffer #: " #: ../src/imgh_interface.c:261 msgid "file: " msgstr "fitxer: " #. viewport_imgh #. #. * label for correlation #. #: ../src/imgh_interface.c:310 msgid "correlation type: " msgstr "typo de corelacio: " #. #. * label for ncols #. #: ../src/imgh_interface.c:352 msgid "number of columns (pixels): " msgstr "quantitat del colons (pixels): " #. #. * label for nrows #. #: ../src/imgh_interface.c:394 msgid "number of rows (pixels): " msgstr "quantitat de lineas: " #. #. * label for depth #. #: ../src/imgh_interface.c:438 msgid "image depth (bits): " msgstr "profundidat de l'imatge (bits): " #. #. * frame, table and spinners for spatial scale "sscale" #. * #. * radio buttons and spinners defining spatial scale interactively #. * with pointer in image #. #: ../src/imgh_interface.c:485 msgid "Define spatial scale" msgstr "Definicio scala espacial" #: ../src/imgh_interface.c:542 ../src/piveval_interface.c:1367 #: ../src/piveval_interface.c:1670 ../src/pivvalid_interface.c:223 #: ../src/display_menus.h:131 ../src/display_interface.c:619 msgid "None" msgstr "Cap" #: ../src/imgh_interface.c:580 msgid "Spanned length" msgstr "Llargade estirat" #: ../src/imgh_interface.c:617 msgid "Vertical spanned length" msgstr "Llargade vertical" #: ../src/imgh_interface.c:655 msgid "Horizontal spanned length" msgstr "Llargade horitzontal" #: ../src/imgh_interface.c:692 msgid "span (pixels): " msgstr "estirade (pixels): " #: ../src/imgh_interface.c:752 msgid "length (mm): " msgstr "llargade (mm): " #. #. * spinner for spatial scale "sscale" #. #. #. *spinner for spatial scale "sscale" #. #: ../src/imgh_interface.c:815 ../src/pivpost_interface.c:221 msgid "spatial scale (mm/pixels): " msgstr "scala espacial (mm/pixels): " #. #. * spinner for time scale "tscale" #. #. #. *spinner for time scale "tscale" #. #: ../src/imgh_interface.c:878 ../src/pivpost_interface.c:285 msgid "time scale (ms): " msgstr "scala temporal (ms): " #. #. * spinner for column position #. #: ../src/imgh_interface.c:957 msgid "position of column #0 (m): " msgstr "positio del colon #0 (m): " #. #. * spinner for row position #. #: ../src/imgh_interface.c:1022 msgid "position of row #0 (m): " msgstr "positio del linea #0 (m): " #. #. * entry for project #. #: ../src/imgh_interface.c:1086 msgid "Title: " msgstr "Titol: " #. #. * entry for creation date #. #: ../src/imgh_interface.c:1142 msgid "Creation date: " msgstr "Data de creacio: " #. #. * entry for location #. #: ../src/imgh_interface.c:1201 msgid "Place: " msgstr "Lloc: " #. #. * entry for author #. #: ../src/imgh_interface.c:1254 msgid "Author: " msgstr "Autor: " #. #. * entry for software #. #: ../src/imgh_interface.c:1307 msgid "Software: " msgstr "Programacio: " #. #. * entry for source #. #: ../src/imgh_interface.c:1360 msgid "Source: " msgstr "Origin: " #. #. * entry for usertext #. #: ../src/imgh_interface.c:1413 msgid "Usertext: " msgstr "Text usuari: " #. #. * entry for warning #. #: ../src/imgh_interface.c:1466 msgid "Warning: " msgstr "Aviso: " #. #. * entry for disclaimer #. #: ../src/imgh_interface.c:1519 msgid "Disclaimer: " msgstr "Negacio:" #. #. * entry for comment #. #: ../src/imgh_interface.c:1572 msgid "Comment: " msgstr "Comentari: " #. #. * entry for copyright #. #: ../src/imgh_interface.c:1625 msgid "Copyright: " msgstr "Drets d'autor: " #. #. * entry for email #. #: ../src/imgh_interface.c:1678 msgid "Email: " msgstr "Email: " #. #. * entry for url #. #: ../src/imgh_interface.c:1731 msgid "Url: " msgstr "Url: " #: ../src/imgh.c:85 msgid "No action" msgstr "No actio" #: ../src/imgh.c:99 msgid "Points the length spanned by a ruler in the image" msgstr "Poses la mida estrenyat per un regle en el imatge" #: ../src/imgh.c:113 msgid "Points the vertical length by a ruler in the image" msgstr "Poses la mida estrenyat per un vertical regle en el imatge" #: ../src/imgh.c:128 msgid "Points the horizontal length by a ruler in the image" msgstr "Poses la mida estrenyat per un horitzontal regle en el imatge" #: ../src/piveval_interface.c:134 msgid "Piv image interrogation" msgstr "Piv interrogacio del imatge" #: ../src/piveval_interface.c:235 msgid "first col:" msgstr "primer col:" #: ../src/piveval_interface.c:255 msgid "last col:" msgstr "ultim col:" #: ../src/piveval_interface.c:275 msgid "pre-shift col:" msgstr "pre-displacement col:" #: ../src/piveval_interface.c:295 msgid "first row:" msgstr "primer linea" #: ../src/piveval_interface.c:315 msgid "last row:" msgstr "ultim linea" #: ../src/piveval_interface.c:335 msgid "pre-shift row:" msgstr "pre-displacement linea" #: ../src/piveval_interface.c:640 msgid "Final Int Size" msgstr "Mida Int Final" #. VECTOR_SCALE_3 #: ../src/piveval_interface.c:732 ../src/piveval_interface.c:961 #: ../src/piveval_interface.c:1197 ../src/display_menus.h:158 msgid "16" msgstr "16" #. VECTOR_SCALE_4 #: ../src/piveval_interface.c:766 ../src/piveval_interface.c:995 #: ../src/piveval_interface.c:1231 ../src/display_menus.h:160 msgid "32" msgstr "32" #. VECTOR_SCALE_5 #: ../src/piveval_interface.c:800 ../src/piveval_interface.c:1029 #: ../src/piveval_interface.c:1265 ../src/display_menus.h:162 msgid "64" msgstr "64" #. VECTOR_SCALE_6 #: ../src/piveval_interface.c:834 ../src/piveval_interface.c:1062 #: ../src/piveval_interface.c:1299 ../src/display_menus.h:164 msgid "128" msgstr "128" #. #. * radio buttons for interrogation size 2 #. #: ../src/piveval_interface.c:869 msgid "Initial Int Size" msgstr "Mida Int Initial" #. #. * radio buttons for shifted distance of interrogation areas #. #: ../src/piveval_interface.c:1097 msgid "Shift" msgstr "Displacement" #. VECTOR_SCALE_2 #: ../src/piveval_interface.c:1162 ../src/display_menus.h:156 msgid "8" msgstr "8" #. #. * radio button for mouse selecting #. #: ../src/piveval_interface.c:1334 msgid "Mouse select" msgstr "Seleccio ratoli" #: ../src/piveval_interface.c:1405 msgid "Area" msgstr "Area" #: ../src/piveval_interface.c:1443 msgid "Single int." msgstr "Sol int." #: ../src/piveval_interface.c:1482 msgid "Single point" msgstr "Sol punt" #: ../src/piveval_interface.c:1521 msgid "Drag int." msgstr "tira int." #: ../src/piveval_interface.c:1560 msgid "Vert. Line" msgstr "Linia vert." #: ../src/piveval_interface.c:1598 msgid "Hor. Line" msgstr "Linia hor." #. #. * radio buttons for sub-pixel interpolation scheme #. #: ../src/piveval_interface.c:1637 msgid "Sub-pixel Interpolation" msgstr "Interpolacio sub-pixel" #: ../src/piveval_interface.c:1712 msgid "Gauss" msgstr "Gauss" #: ../src/piveval_interface.c:1754 msgid "Power" msgstr "Power" #: ../src/piveval_interface.c:1796 msgid "Gravity" msgstr "Gravitat" #. eval->radiobutton_fit_marquardt = gtk_radio_button_new_with_label (eval->vbox10_group, #. _("Marquardt")); #. eval->vbox10_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_fit_marquardt)); #. gtk_widget_ref (eval->radiobutton_fit_marquardt); #. gtk_object_set_data_full (GTK_OBJECT (main_window), #. "radiobutton_fit_marquardt", #. eval->radiobutton_fit_marquardt, #. (GtkDestroyNotify) gtk_widget_unref); #. gtk_widget_show (eval->radiobutton_fit_marquardt); #. gtk_box_pack_start (GTK_BOX (eval->vbox10), #. eval->radiobutton_fit_marquardt, #. FALSE, #. FALSE, #. 0); #. gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_marquardt), #. "ifit", #. "4"); #. gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_marquardt), #. "eval", #. eval); #. gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_marquardt), #. "var_type", #. "0"); #. g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_marquardt), #. "toggled", #. G_CALLBACK (on_toggle_piv), #. NULL); #. #. * radio buttons for correlation peak number to be detected #. #: ../src/piveval_interface.c:1870 msgid "Peak #" msgstr "Cim #" #: ../src/piveval_interface.c:1901 ../src/display_menus.h:150 msgid "1" msgstr "1" #. VECTOR_SCALE_0 #: ../src/piveval_interface.c:1942 ../src/display_menus.h:152 msgid "2" msgstr "2" #: ../src/piveval_interface.c:1983 msgid "3" msgstr "3" #. #. * additonal calculation schemes for correlation detection #. #: ../src/piveval_interface.c:2025 msgid "Interrogation scheme" msgstr "Schema de interrogacio" #: ../src/piveval_interface.c:2061 msgid "Image deformation" msgstr "Deformacio imatge" #: ../src/piveval_interface.c:2103 msgid "Central differential" msgstr "Central diferential" #: ../src/piveval_interface.c:2144 msgid "Zero offset" msgstr "Zero offset" #: ../src/piveval_interface.c:2185 msgid "Weight Kernel" msgstr "factor de pes" #. #. * radio buttons for cross-or auto correlation #. * defined in image header, not user definable #. #. #. * Gnome canvas display corr function #. #: ../src/piveval_interface.c:2229 ../src/piveval_interface.c:2537 msgid "Correlation" msgstr "Correlacio" #: ../src/piveval_interface.c:2262 msgid "Auto" msgstr "Auto" #: ../src/piveval_interface.c:2295 msgid "Cross" msgstr "Cruade" #: ../src/piveval_interface.c:2329 msgid "Gauss weighting" msgstr "Pesant Gauss" #: ../src/piveval_interface.c:2364 msgid "SPOF filtering" msgstr "Filtrar SPOF" #: ../src/piveval_interface.c:2400 msgid "Interrogation areas and correlation" msgstr "Areas de interrogacio i correlacio" #. #. * gnome canvas interrogation area1 #. #: ../src/piveval_interface.c:2435 msgid "Int. area 1" msgstr "Area int. 1" #. #. * gnome canvas interrogation area2 #. #: ../src/piveval_interface.c:2484 msgid "Int. area 2" msgstr "Area int 2" #. #. * gnome canvas display values #. #: ../src/piveval_interface.c:2585 msgid "Estimator" msgstr "Estimacio" #: ../src/piveval_interface.c:2650 msgid "Monitor" msgstr "Observar" #. #. * spinner for zoom #. #: ../src/piveval_interface.c:2684 msgid "Zoom:" msgstr "Magnificacio:" #. #. * spinner for vector length #. #: ../src/piveval_interface.c:2738 msgid "Vector scale:" msgstr "Scala del fletche" #: ../src/piveval_interface.c:2811 msgid "" "Interrogates a PIV image (pair) resulting into estimators of the mean " "displacement of the particle images within each interrogation area" msgstr "" "Evaluacio d'un (pareilla de) imatges resultant en el displacement mitjana \n" "dels partikles en cada area de interrogacio" #: ../src/piveval.c:598 #, c-format msgid "" "Image deformation is impossibe with this Mouse select.\n" "Setting Interrogation scheme to Central difference.\n" "This will be reset automatically after interrogating." msgstr "" "Deformacio de imatge is imposible en combinacio d'aquesta seleccio Ratoli.\n" "Posat el Escema Interrogacio en Diferencial Central.\n" "Aixo seria tornat automaticament despres la interrogacio del imatge." #: ../src/piveval.c:626 ../src/pivvalid.c:572 msgid "No mouse activity within displayer" msgstr "Cap activitat del ratoli en el finestre d'enseignar" #: ../src/piveval.c:640 msgid "Selects an area within the image to be analyzed" msgstr "Tria un area en el imatge per analitzar" #: ../src/piveval.c:654 msgid "" "Piv evaluation at a single interrogation area. Conserves other existing data" msgstr "PIV evaluacio en un sol area d'interrogacio. Guarde les altres dades" #: ../src/piveval.c:669 msgid "" "Piv evaluation at a single point in the image. Rejects all existing data!!" msgstr "Piv evaluacio en un sol punt. Perd totes les dades que existen" #: ../src/piveval.c:684 msgid "Displaces a single interrogation area and analyzes" msgstr "Displacar un sol area d'interrogacio i analitzeras" #: ../src/piveval.c:698 msgid "Evaluation at a vertical line. " msgstr "Avulacio en una linia vertical. \"" #: ../src/piveval.c:712 msgid "Evaluation at a horizontal line. " msgstr "Avulacio en una linia horitzontal. " #: ../src/piveval.c:805 #, c-format msgid "" "Int Size 2 > Int Size 1 \n" "Setting Interrogation scheme to Image deformation" msgstr "" "nt Size 2 > Int Size 1 \n" "Posar scema Interogacio en Deformacio d'imatge" #: ../src/piveval.c:1102 msgid "Interpolation scheme for sub-pixel estimation" msgstr "Schema de interpolacio per la estimacio en nivell sub-pixel" #: ../src/piveval.c:1117 msgid "Chooses n-th highest top number of correlation as estimator" msgstr "Triges el n-d maximum del corelacio com estimador" #: ../src/piveval.c:1132 msgid "Bias correction scheme" msgstr "Scema coreccio bias" #: ../src/piveval.c:1147 msgid "Deforms image from PIV estimators" msgstr "Defomacio d'imatge a traves de estimadors PIV" #: ../src/piveval.c:1205 msgid "Gauss weighting on the Interrogation Area" msgstr "Pesar Gauss en la Area Interogacio" #: ../src/piveval.c:1237 msgid "Symmetric Phase Only Filtering on the FT images" msgstr "Symmetric Phase Only Filtering en el FT imatges" #: ../src/piveval.c:1346 msgid "Displays subimages, correlation function and PIV vector" msgstr "Enseignes els subimatges, funcio de correlacio i el vector PIV" #: ../src/piveval.c:1582 msgid "Analyses a PIV image (pair)" msgstr "Analitzes un (pareill d')imatge PIV" #: ../src/pivvalid_interface.c:102 msgid "Piv data validation" msgstr "Validacio de dades piv" #. #. * Enable / Disable frame #. #: ../src/pivvalid_interface.c:187 msgid "Disable data" msgstr "Desconectar dades" #: ../src/pivvalid_interface.c:265 msgid "Enable point" msgstr "Conectar un sol punt" #: ../src/pivvalid_interface.c:304 msgid "Disable point" msgstr "Desconectar un sol punt" #: ../src/pivvalid_interface.c:343 msgid "Enable area" msgstr "Conectar un area" #: ../src/pivvalid_interface.c:382 msgid "Disable area" msgstr "Desconectar un area" #: ../src/pivvalid_interface.c:423 msgid "validate on velocity gradient " msgstr "validacio del gradient de velocitat" #: ../src/pivvalid_interface.c:443 msgid "" "Disables PIV data that have a too large velocity gradient over the " "Interrogation Area" msgstr "" "Desconecte les dades PIV que tenen un gradient de velocitat mes gran que " "0.05 \n" "en el area de interrogacio." #. #. * Frame for histogram of sub-pixel values (used to test on peak-locking #. * effect) #. #: ../src/pivvalid_interface.c:471 msgid "Histograms" msgstr "Histograms" #: ../src/pivvalid_interface.c:522 msgid "# bins: " msgstr "# barres: " #: ../src/pivvalid_interface.c:632 msgid "calculates residus of displacements and displays in a histogram" msgstr "Calculacio dels residus dels diplacements i enseignar en un histogram" #: ../src/pivvalid_interface.c:668 msgid "" "shows histogram of sub-pixel displacements to check on peak-locking effects" msgstr "" "Enseignes el histogram dels displacements en nivell sub-pixel per examinar " "els effectes de peak-locking" #: ../src/pivvalid_interface.c:691 msgid "U-comp" msgstr "U-comp" #: ../src/pivvalid_interface.c:705 msgid "" "shows histogram of horizontal displacements.\n" "Only this histogram will be saved" msgstr "" "Enseignes el histogram del displacements horitzontal\n" "Nomes aquest histogram seria guardat" #: ../src/pivvalid_interface.c:727 msgid "V-comp" msgstr "V-comp" #: ../src/pivvalid_interface.c:741 msgid "" "shows histogram of vertical displacements.\n" "Only this histogram will be saved" msgstr "" "Enseignes el histogram del displacements vertikal\n" "Nomes aquest histogram seria guardat" #. #. * Errvec frame #. #: ../src/pivvalid_interface.c:767 msgid "Outliers" msgstr "Outliers" #: ../src/pivvalid_interface.c:820 msgid "Neighbors: " msgstr "Veins: " #: ../src/pivvalid_interface.c:888 msgid "Data yield: " msgstr "Rendiment de dades: " #: ../src/pivvalid_interface.c:955 msgid "Threshold: " msgstr "Llindar" #: ../src/pivvalid_interface.c:1005 msgid "Show SNR values" msgstr "Enseignar valors SNR" #: ../src/pivvalid_interface.c:1042 msgid "Residu type:" msgstr "Tipo del residu" #: ../src/pivvalid_interface.c:1074 msgid "Normalized median" msgstr "Mediana normalitzat" #: ../src/pivvalid_interface.c:1118 ../src/pivvalid_interface.c:1340 msgid "Median" msgstr "Mediana" #: ../src/pivvalid_interface.c:1162 msgid "Snr" msgstr "Snr" #. #. * A long time ago, the GtkWidget valid->button_errvec_resstats was *here*. #. * Though it felt in love with valid->button_peaklock. #. * Now they are living happily cheeck tot cheeck. #. * No, they haven't got child widgets, yet. But maybe, one day ... #. #. #. * Radio buttons for substitution type #. #: ../src/pivvalid_interface.c:1216 msgid "Substituted by:" msgstr "Substituid per:" #: ../src/pivvalid_interface.c:1249 msgid "Nothing" msgstr "Res" #: ../src/pivvalid_interface.c:1297 msgid "Mean of surroundings" msgstr "Mitja dels veins" #: ../src/pivvalid_interface.c:1384 msgid "Next highest corr. peak" msgstr "Proxima cim mes alt" #: ../src/pivvalid_interface.c:1428 msgid "validate on outliers" msgstr "validar en outliers" #: ../src/pivvalid_interface.c:1442 msgid "substitutes outliers" msgstr "substituir outliers" #: ../src/pivvalid.c:105 ../src/pivvalid.c:287 ../src/pivvalid.c:390 #: ../src/pivvalid.c:507 ../src/pivpost.c:144 ../src/pivpost.c:248 #: ../src/pivpost.c:355 ../src/pivpost.c:587 msgid "no PIV data" msgstr "No n'hi ha PIV data (ni cap, ni una)" #: ../src/pivvalid.c:526 msgid "Examines PIV data on velocity gradients" msgstr "Examinar dades de PIV per gradient de velocitats" #: ../src/pivvalid.c:587 msgid "Enables a single PIV data-point" msgstr "Connectes un sol punt de dades PIV" #: ../src/pivvalid.c:602 msgid "Disables a single PIV data-point" msgstr "Disconnectes un sol punt de dades PIV" #: ../src/pivvalid.c:617 msgid "Enables an area containing PIV data" msgstr "Connectes un area de dades PIV" #: ../src/pivvalid.c:632 msgid "Disables an area containing PIV data" msgstr "Disconnectes un area de dades PIV" #: ../src/pivvalid.c:660 msgid "Defines residu type to examine data on" msgstr "Definicio de tipo residu per examinar dades de PIV" #: ../src/pivvalid.c:687 msgid "Displays inverse cumulative histogram of residus" msgstr "Enseignes el histogram cumulatiu dels residuals" #: ../src/pivvalid.c:776 msgid "Display PIV vector colors related to residu or SNR value" msgstr "Enseignes els colors dels fletches PIV amb relacio del residu o SNR" #: ../src/pivvalid.c:815 msgid "Only sets peak_no (flag) to zero" msgstr "Nomes poses peak_no (flag) en zero" #: ../src/pivvalid.c:817 msgid "mean from surroundings" msgstr "valor mitjana dels veins" #: ../src/pivvalid.c:819 msgid "Median (middle value) from surroundings" msgstr "Valor mediana (mig) dels veins" #: ../src/pivvalid.c:821 msgid "Re-interrogates and uses next corr. peak as estimator" msgstr "" "Tornes a interrogar i agafes el proxim maximum del corr. com el estimador" #: ../src/pivvalid.c:852 msgid "Examines PIV data on outliers and substitutes" msgstr "Examinar les dades PIV als outliers i substitueix" #: ../src/pivvalid.c:914 msgid "Calculates a histogram of sub-pixel displacements" msgstr "Calcular el histogram dels displacements en nivell sub-pixel" #: ../src/pivvalid.c:961 msgid "Calculates a histogram of horizontal displacements." msgstr "Calcular el histogram dels displacements horitzontal" #: ../src/pivvalid.c:1008 msgid "Calculates a histogram of vertical displacements." msgstr "Calular el histogram dels displacements vertical" #: ../src/pivpost_interface.c:98 msgid "Piv data post processing" msgstr "Piv post procesing dels dades" #. #. * Scale frame #. #. #. * Spinners use the adjustment from spinbutton_adj_imgh_* #. #: ../src/pivpost_interface.c:185 msgid "Scaling" msgstr "Scala" #. #. * spinner for column position #. #: ../src/pivpost_interface.c:350 msgid "pos. of col #0 (m): " msgstr "pos. del col #0 (m): " #. #. * spinner for row position #. #: ../src/pivpost_interface.c:416 msgid "pos. of row #0 (m): " msgstr "posi de la linea #0 (m): " #: ../src/pivpost_interface.c:498 msgid "" "Calculates time and spatial scaled particle displacements (i.e. velocities) " "from a PIV displacement field, and their scaled positions" msgstr "" "Calculacio de escala espacial i temporal displacements (velocidades)\n" "d'un camp de velocitat, i les seves posicions escalades" #. #. * Spatial average frame #. #: ../src/pivpost_interface.c:525 msgid "Offset / Spatial statistics" msgstr "Offset / Statistiques espacial" #. #. *spinner for spatial average horizontal velocity U-avg #. #: ../src/pivpost_interface.c:561 msgid "dx (px), U (m/s): " msgstr "dx (px), U (m/s): " #. #. * end of KEEP DISABLED #. #. #. * spinner for spatial average vertical velocity V-avg #. #: ../src/pivpost_interface.c:633 msgid "dy (px), V (m/s): " msgstr "dy (px), V (m/s): " #: ../src/pivpost_interface.c:716 msgid "" "Calculates spatial average particle displacements or velocities from a " "velocity field, obtained from PIV data" msgstr "" "Calculacio dels displacements mitjana dels particules o velocidades d'un " "camp de velocitat, adquirit dels dades PIV" #: ../src/pivpost_interface.c:759 msgid "" "Subtracts the spatial averages or offset displacements / velocities, from " "each estimator" msgstr "" "Treus la mitjana espacial, o un quantitat posat manual, de tots estimators" #. #. * Vorstra frame #. #: ../src/pivpost_interface.c:783 msgid "Vorticity & strain" msgstr "Voricitat i shorn" #: ../src/pivpost_interface.c:816 msgid "Output:" msgstr "Result:" #: ../src/pivpost_interface.c:848 ../src/display_menus.h:134 #: ../src/display_interface.c:635 msgid "Vorticity" msgstr "Vorticitat" #: ../src/pivpost_interface.c:889 ../src/display_menus.h:137 #: ../src/display_interface.c:650 msgid "Shear strain" msgstr "Tensio shorn" #: ../src/pivpost_interface.c:930 ../src/display_menus.h:140 #: ../src/display_interface.c:666 msgid "Normal strain" msgstr "tensio normal" #: ../src/pivpost_interface.c:968 msgid "Differential scheme:" msgstr "Schema diferential" #: ../src/pivpost_interface.c:1002 msgid "Central" msgstr "Central" #: ../src/pivpost_interface.c:1043 msgid "Least squares" msgstr "Least squares" #: ../src/pivpost_interface.c:1085 msgid "Richardson" msgstr "Richardson" #: ../src/pivpost_interface.c:1135 msgid "Circulation method" msgstr "Metode circulacio" #: ../src/pivpost_interface.c:1233 msgid "" "Calculates vorticity or strain magnitudes from a velocity field, obtained by " "PIV" msgstr "" "Calculacio de vorticitat o magnitut de tensio obtingut d'un camp de " "velocitats amb PIV" #: ../src/pivpost.c:118 msgid "exec_scale: Failure calling gpiv_post_scale" msgstr "exec_scale: He fallat per cridar gpiv_count_pivdata" #: ../src/pivpost.c:582 msgid "exec_vorstra: non valid operation" msgstr "exec_vorstra: operacio no valida" #: ../src/pivpost.c:671 msgid "on_spinbutton_post_scale: should not arrive here" msgstr "on_spinbutton_post_scale: no hauries a arribar aqui" #: ../src/pivpost.c:686 msgid "Calculates scaled locations and velocities" msgstr "Calcules llocs i velocitats en scala" #: ../src/pivpost.c:760 msgid "Calculates spatial average displacements" msgstr "Calcular la mitjana espacial" #: ../src/pivpost.c:805 msgid "Subtracts mean displacements / offset values from PIV data" msgstr "Treus la displacement mitjana / offset des de les dades PIV" #: ../src/pivpost.c:850 msgid "Selects the differential quantity" msgstr "Selectar la quantitat diferential" #: ../src/pivpost.c:894 msgid "Selects the type of differential scheme" msgstr "Selectes el tipo de schema diferential " #: ../src/pivpost.c:923 msgid "Calculates differential quantity" msgstr "Calcules la quantitat diferential" #: ../src/display_menus.h:71 msgid "0.25" msgstr "0.25" #: ../src/display_menus.h:73 msgid "0.5" msgstr "0.5" #: ../src/display_menus.h:75 msgid "0.83" msgstr "0.83" #: ../src/display_menus.h:77 msgid "1.0" msgstr "1.0" #: ../src/display_menus.h:79 msgid "1.3" msgstr "1.3" #: ../src/display_menus.h:81 msgid "1.6" msgstr "1.6" #: ../src/display_menus.h:83 msgid "2.0" msgstr "2.0" #: ../src/display_menus.h:85 msgid "4.0" msgstr "4.0" #: ../src/display_menus.h:94 msgid "Blue background" msgstr "Blau fons" #: ../src/display_menus.h:97 msgid "Black background" msgstr "Negre fons" #: ../src/display_menus.h:100 msgid "Image A" msgstr "Imatge A" #: ../src/display_menus.h:103 msgid "Image B" msgstr "Imatge B" #: ../src/display_menus.h:121 ../src/display_interface.c:585 msgid "Interrogation area's" msgstr "Areas de interrogacio" #: ../src/display_menus.h:123 ../src/display_interface.c:595 msgid "Velocity vectors" msgstr "Fletches de velocitats" #. VECTOR_SCALE_1 #: ../src/display_menus.h:154 msgid "4" msgstr "4" #. VECTOR_SCALE_7 #: ../src/display_menus.h:166 msgid "256" msgstr "256" #: ../src/display_menus.h:176 msgid "Peak nr" msgstr "Cim nr" #: ../src/display_menus.h:178 msgid "SNR" msgstr "SNR" #: ../src/display_menus.h:180 msgid "Magnitude gray" msgstr "Magnitud gris" #: ../src/display_menus.h:182 msgid "Magnitude color" msgstr "Magnitud color" #: ../src/display_menus.h:224 msgid "View menubar" msgstr "Enseigne barre menus" #: ../src/display_menus.h:224 msgid "Displays menubar in window" msgstr "Enseignes barre menus en finestre" #: ../src/display_menus.h:226 ../src/display_interface.c:394 msgid "View rulers" msgstr "Enseigne regles" #: ../src/display_menus.h:226 msgid "Displays rulers in window" msgstr "Enseignes regele en finestre" #: ../src/display_menus.h:228 ../src/display_interface.c:406 msgid "Stretch auto" msgstr "Estendre auto" #: ../src/display_menus.h:228 msgid "Stretch display automatic when zooming" msgstr "Estendre el finestre automatic quan magnificant" #: ../src/display_menus.h:230 ../src/display_interface.c:418 msgid "Stretch display" msgstr "Estendre finestre d'enseignar" #: ../src/display_menus.h:231 ../src/display_interface.c:424 msgid "Stretch or fit display window to the image area" msgstr "Estendre el finestre d'enseignar ajustat a les mides del imatge" #: ../src/display_menus.h:233 msgid "Zoom in/out" msgstr "Zoom in/out" #: ../src/display_menus.h:235 msgid "View background" msgstr "Enseigne fons" #: ../src/display_menus.h:237 msgid "View piv data" msgstr "Enseigne les dades PIV" #: ../src/display_menus.h:238 msgid "View scalar data" msgstr "Enseigne les dades scalar" #: ../src/display_menus.h:240 msgid "Vector scale" msgstr "Scala fletche" #: ../src/display_menus.h:241 msgid "Vector color" msgstr "Color fletche" #: ../src/display_interface.c:364 msgid "_View" msgstr "_Enseignar" #: ../src/display_interface.c:383 msgid "View menu bar" msgstr "Enseigne barra dels menus" #: ../src/display_interface.c:454 msgid "set zoom factor" msgstr "definicio factor magnificacio" #: ../src/display_interface.c:477 msgid "_Background" msgstr "_Fons" #: ../src/display_interface.c:491 msgid "Blue" msgstr "Blau" #: ../src/display_interface.c:499 msgid "set blue background" msgstr "poses fons negre" #: ../src/display_interface.c:511 msgid "Black" msgstr "Negre" #: ../src/display_interface.c:519 msgid "set black background" msgstr "poses fons negre" #: ../src/display_interface.c:531 msgid "Image_A" msgstr "Imatge_A" #: ../src/display_interface.c:539 msgid "set first image as background" msgstr "poses primer imatge com el fons" #: ../src/display_interface.c:559 msgid "set second image as background" msgstr "poses segon imatge com el fons" #: ../src/display_interface.c:573 msgid "_Piv" msgstr "_Piv" #: ../src/display_interface.c:608 msgid "_Scalar" msgstr "_Scala zoom" #: ../src/display_interface.c:683 msgid "Scal_e" msgstr "Sca_la" #: ../src/display_interface.c:708 msgid "set vector_scale" msgstr "definicio vector_scale" #: ../src/display_interface.c:723 msgid "C_olor" msgstr "C_olor" #: ../src/display.c:690 msgid "select_view_background: should not arrive here" msgstr "select_view_background: no hauries arribar aqui" #: ../src/display.c:849 msgid "select_view_scalardata: should not arrive here" msgstr "select_view_scalardata: no hauries arribar aqui" #~ msgid "Int Size 2" #~ msgstr "Mida int 2" #, fuzzy #~ msgid "Failure opening parameter file for output" #~ msgstr "He fallat obrir %s per input" #~ msgid "File selection" #~ msgstr "Selectio fiche" #~ msgid "name: " #~ msgstr "nom" #, fuzzy #~ msgid "" #~ "Adds the spatial averages or offset displacements / velocities, from each " #~ "estimator" #~ msgstr "" #~ "Treus la mitjana espacial, o un quantitat posat manual, de tots estimators" #, fuzzy #~ msgid "Adds mean displacements / offset values from PIV data" #~ msgstr "Treus la displacement mitjana des de les dades PIV" #, fuzzy #~ msgid "" #~ "Enables data acquisition for chain processing: recording of images " #~ "(pairs). \n" #~ "The process will be executed by clicking the Execute button" #~ msgstr "" #~ "Conectes mitja en el proces cadena: Calculacio dels displacemts mitja " #~ "espacial utilizant totes les dades\n" #~ "El proces sera executat per empretar el boto d'Executacio" #, fuzzy #~ msgid "" #~ "At first, open an image. \n" #~ "Than we'll further see what will happen." #~ msgstr "Per commencar, obres un imatge. Despres ja veurem que passera" #, fuzzy #~ msgid "Disabled: not a number" #~ msgstr "Disconectar dades" #, fuzzy #~ msgid "Disabled manually" #~ msgstr "Disconectar dades" #, fuzzy #~ msgid "no image or piv data" #~ msgstr "Obres un imatge PIV o un fiche de dades" #, fuzzy #~ msgid "shows histogram of horizontal displacements" #~ msgstr "Calular el histogram dels displacements en nivell sub-pixel" #, fuzzy #~ msgid "shows histogram of vertical displacements" #~ msgstr "Calular el histogram dels displacements en nivell sub-pixel" #~ msgid "Couldn't create pixmap from file: %s" #~ msgstr "No ha pogute crear el pixmap del fitxe: %s" #~ msgid "gpiv buttons" #~ msgstr "barre gpiv" #, fuzzy #~ msgid "In/output" #~ msgstr "Result:" #, fuzzy #~ msgid "cross-correlation" #~ msgstr "Correlacio" #~ msgid "tooltips" #~ msgstr "instructions" #~ msgid "peaklock" #~ msgstr "peaklock" #, fuzzy #~ msgid "scaling" #~ msgstr "Scala" #~ msgid "number of histogram bins: " #~ msgstr "numero dels barres pel histogram" #, fuzzy #~ msgid "vector color" #~ msgstr "scala fletches" #~ msgid "zoom scale" #~ msgstr "scala zoom" #~ msgid "image B" #~ msgstr "imatge B" #, fuzzy #~ msgid "hide/display PIV data" #~ msgstr "amagar/enseignar dades" #, fuzzy #~ msgid "PIV-derived data" #~ msgstr "Obres un imatge PIV o un fiche de dades" #, fuzzy #~ msgid "display" #~ msgstr "Enseignar" #~ msgid "Updates parameters and save as defaults" #~ msgstr "Actualitzar els parametres i guardar com defecte" #~ msgid "Updates actual parameters, do not store as defaults" #~ msgstr "Actualitzar els parametres, no guardar com defecte" #~ msgid "Close preferences window" #~ msgstr "Tancar finestre de preferencies" #~ msgid "Open" #~ msgstr "Obrir" #~ msgid "Save" #~ msgstr "Guardar" #, fuzzy #~ msgid "Print" #~ msgstr "gradient" #~ msgid "Execute" #~ msgstr "Executar" #, fuzzy #~ msgid "Close" #~ msgstr "Cruade" #~ msgid "Exit" #~ msgstr "Surt" #, fuzzy #~ msgid "" #~ "Enables scale for chain processing: scales spatial displacements from all " #~ "data. \n" #~ "The process will be executed by clicking the \"Execute\" button" #~ msgstr "" #~ "Conectes treure en el proces cadena: treus el displacement mitja espacial " #~ "des de totes les dades.\n" #~ "El proces sera executat per empretar el boto d'Executacio" #~ msgid "Image Info" #~ msgstr "Informacio d'imatge" #, fuzzy #~ msgid "Evaluation" #~ msgstr "Piv validacio" #~ msgid "Copyright G. Van der Graaf" #~ msgstr "Copyright G. Van der Graaf" #, fuzzy #~ msgid "" #~ "GPIV is a program for (Digital) Particle Image Velocimetry. It evaluates " #~ "images (pairs) from a fluid that has been seeded with tracer particles, " #~ "resulting into a velocity field of a fluid flow. The program includes " #~ "validation of the resulting estimators and includes several post-" #~ "processing algorithms" #~ msgstr "" #~ "gpiv es un programa per (Digital) Particle Image Velocimetry. Es pot " #~ "analitzar (pareilles de) imatges que resulten en un camp de velocitats " #~ "del flux d'un fluid. El programa inclous algoritmes de validacio i post-" #~ "procesar per a obtenir derivitats del camp de flux." #, fuzzy #~ msgid "GPIV message" #~ msgstr "mesatge gpiv" #, fuzzy #~ msgid "GPIV error" #~ msgstr "falla gpiv" #~ msgid "Image Header Info" #~ msgstr "Imatge cap informacio" #, fuzzy #~ msgid "Project: " #~ msgstr "Project" #~ msgid "Failure calling gpiv_count_pivdata for %s" #~ msgstr "He fallat per cridar gpiv_count_pivdata for %s" #~ msgid "Peak locking" #~ msgstr "Peak locking" #~ msgid "residu statistics" #~ msgstr "statist. dels residus" #~ msgid "peak lock" #~ msgstr "peak lock" #~ msgid "Defines how to substitute the data" #~ msgstr "Defines com s'ha de substituir les dades" #~ msgid "number of bins for histograms" #~ msgstr "quantitat dels barres pels histogrammes" #~ msgid "BINS" #~ msgstr "BARRES" #, fuzzy #~ msgid "number of columns in image" #~ msgstr "quantitat del colons" #, fuzzy #~ msgid "number of rows in image" #~ msgstr "quantitat del lineas" #, fuzzy #~ msgid "enables displaying of the first image of a PIV image pair" #~ msgstr "deixes a enseignar les dades de tensio shorn" #, fuzzy #~ msgid "enables displaying of the second image of a PIV image pair" #~ msgstr "deixes a enseignar les dades del PIV" #~ msgid "enables displaying of interrogation regions" #~ msgstr "deixes a enseignar els areas de interrogacio" #~ msgid "enables displaying of PIV data" #~ msgstr "deixes a enseignar les dades del PIV" #~ msgid "enables displaying of vorticity data" #~ msgstr "deixes a enseignar les dades de vorticitat" #~ msgid "enables displaying of shear strain data" #~ msgstr "deixes a enseignar les dades de tensio shorn" #~ msgid "enables displaying of normal strain data" #~ msgstr "deixes a enseignar les dades de tensio normal" #~ msgid "print parameters and other info to stdout" #~ msgstr "impres els parametres i altres informacio al stdout" #, fuzzy #~ msgid "includes piv in the chain-process" #~ msgstr "inclueix piv en el proces de cadena" #, fuzzy #~ msgid "includes gradient in the chain-process" #~ msgstr "incluiex gradient en el proces de cadena" #, fuzzy #~ msgid "includes resstats in the chain-process" #~ msgstr "incluiex resstats en el proces de cadena" #, fuzzy #~ msgid "includes validate in the chain-process" #~ msgstr "inclueix validar en el proces de cadena" #, fuzzy #~ msgid "includes peaklock in the chain-process" #~ msgstr "inclueix peacklock en el proces de cadena" #, fuzzy #~ msgid "includes average in the chain-process" #~ msgstr "inclueix mitja en el proces de cadena" #, fuzzy #~ msgid "includes scaling in the chain-process" #~ msgstr "inclueix piv en el proces de cadena" #, fuzzy #~ msgid "includes substract in the chain-process" #~ msgstr "inclueix treure en el proces de cadena" #, fuzzy #~ msgid "includes vorticity in the chain-process" #~ msgstr "inclueix vorticitat en el proces de cadena" #, fuzzy #~ msgid "display zoom index: 0:0.5, 1:0.83, 2:1.0, 3:1.3, 4:1.6, 5:2.0" #~ msgstr "" #~ "index del zoom per finestre d'enseignar: 1:0.5, 2: 0.6, 3:0.83, 4:1.0, " #~ "5:1.3, 6:1.6, 7:2.0 (int)" #~ msgid "SCALE" #~ msgstr "SCALA" #, fuzzy #~ msgid "vector length scale" #~ msgstr "scala de la llarga del fletche (int)" #, fuzzy #~ msgid "view the GPIV buttons of the application" #~ msgstr "vista la barra del gpiv" #, fuzzy #~ msgid "view the tabulator of the application" #~ msgstr "vista les taules" #~ msgid "Display" #~ msgstr "Enseignar" #~ msgid "avarage" #~ msgstr "mitja" #~ msgid "Failure calling gpiv_fwrite_pivdata" #~ msgstr "He fallat a cridar piv_fwrite_scdata" #~ msgid "Failure calling gpiv_fwrite_scdata" #~ msgstr "He fallat a cridar gpiv_fwrite_scdata" #~ msgid "%s: Failure calling fread_pivdata\n" #~ msgstr "He fallat per cridar fread_pivdata\n" #~ msgid "Failure calling gpiv_fread_pivdata for %s" #~ msgstr "He fallat per cridar gpiv_fread_pivdata for %s" #~ msgid "gpiv" #~ msgstr "gpiv" #, fuzzy #~ msgid "this is a demo!" #~ msgstr "Aixo es un demo sense licenci" #, fuzzy #~ msgid "view the menu bar of the application" #~ msgstr "vista la barra dels menus" #, fuzzy #~ msgid "view the tool buttons of the application" #~ msgstr "vista la barra dels eines" #~ msgid "interface" #~ msgstr "interface" #~ msgid "Save File(s)" #~ msgstr "Guarda fiche(s)" #~ msgid "Exit gpiv" #~ msgstr "Surt gpiv" #~ msgid "Aren't you sure you don't want to quit?" #~ msgstr "No estas segur que no vols sortir? (segur que ets!)" #~ msgid "menu bar" #~ msgstr "barra dels menus" #~ msgid "show tool button bar" #~ msgstr "enseignes la barra dels eines" #~ msgid "Adaptive Inter." #~ msgstr "Int. adaptacio" #~ msgid "0.6" #~ msgstr "0.6" #~ msgid "viewer" #~ msgstr "finestre d'eneignement" #~ msgid "" #~ "Enables a single PIV data-point to be used for further validating and " #~ "post processing" #~ msgstr "Conectes un sol punt de dades PIV per a validar i post processar" #~ msgid "Enables an area containing PIV data to be used" #~ msgstr "Conectes un area de dades PIV per utilitzar a processar" #~ msgid "not connected, yet" #~ msgstr "Encara no esta connectat" #~ msgid "Image processing" #~ msgstr "Procesar imatge" #~ msgid "Image Proc" #~ msgstr "Imatge proc" #~ msgid "Piv: image analysis" #~ msgstr "Piv: imatge analysis" #~ msgid "Piv analysis" #~ msgstr "Analysis piv" #~ msgid "Piv Post" #~ msgstr "Piv Post" #~ msgid "" #~ "Disables a single data point that will not be usedfor further validating " #~ "and post processing" #~ msgstr "" #~ "Desconectar un sol punt que no sera utilitzat per validacio o post " #~ "procesar" gpiv-0.6.1/po/de.po0000644000175000017500000013766311076052422010771 00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR Free Software Foundation, Inc. # FIRST AUTHOR , YEAR. # msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-04-09 11:38+0200\n" "PO-Revision-Date: 2007-11-19 12:18+0100\n" "Last-Translator: Gerber \n" "Language-Team: GERMAN \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=ISO-8859-1\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/main.c:857 msgid "" "row_start larger than nrows; \n" "set to zero" msgstr "" "row_start groser wie nrows; \n" "auf nul gesetzt" #: ../src/main.c:992 #, fuzzy msgid "Image analyser for Particle Image Velocimetry" msgstr "Bild fuer Particle Image Velocimetry" #: ../src/main.c:1058 msgid "Trigger system not available" msgstr "Trigger System is nicht verfeugbar" #: ../src/main.c:1081 msgid "No camera connected" msgstr "Kein Kamera angeshlossen" #: ../src/main.c:1094 #, c-format msgid "Image dimensions or depth are larger than %dx%dx%d." msgstr "Bild dimensionen sind groser wie %dx%dx%d." #: ../src/support.c:95 ../src/support.c:120 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Konnte kein pixmap Datei finden: %s" #: ../src/utils.c:326 msgid "January" msgstr "Januar" #: ../src/utils.c:328 msgid "February" msgstr "Februar" #: ../src/utils.c:330 msgid "March" msgstr "Marz" #: ../src/utils.c:332 msgid "April" msgstr "April" #: ../src/utils.c:334 msgid "May" msgstr "Mai" #: ../src/utils.c:336 msgid "June" msgstr "Juni" #: ../src/utils.c:338 msgid "July" msgstr "Juli" #: ../src/utils.c:340 msgid "August" msgstr "August" #: ../src/utils.c:342 msgid "September" msgstr "September" #: ../src/utils.c:344 msgid "October" msgstr "Oktober" #: ../src/utils.c:346 msgid "November" msgstr "November" #: ../src/utils.c:348 msgid "December" msgstr "Dezember" #: ../src/utils.c:350 msgid "Bad month" msgstr "Ungultige Monate" #: ../src/utils.c:352 msgid "month_name: Unvalid month" msgstr "month_name: Ungultige Monate" #: ../src/utils.c:484 #, c-format msgid "" "There are unsaved data that will be lost.\n" "Are you sure you want to close buffer #%d ?" msgstr "" "Es gibt ungespeicherte Daten der verlieren werden sollen\n" "Bist du sicher Puffer # %d zum schliessen?" #: ../src/console_menus.h:101 ../src/console_menus.h:185 msgid "GPIV buttons" msgstr "GPIV Leiste" #: ../src/console_menus.h:102 ../src/console_menus.h:186 msgid "show GPIV check-buttons" msgstr "zeigt GPIV Leiste" #: ../src/console_menus.h:109 ../src/console_menus.h:192 msgid "tabulator" msgstr "Reiter" #: ../src/console_menus.h:110 ../src/console_menus.h:193 msgid "show tabulator containing parameter settings" msgstr "zeigt Reiter mit parameter einstelungen" #: ../src/console_menus.h:119 ../src/console_menus.h:200 msgid "Preferences" msgstr "Vorlieben" #: ../src/console_menus.h:120 msgid "Define settings of the application" msgstr "Ansicht Gpivleiste des Programm" #: ../src/console_menus.h:134 ../src/console_menus.h:214 msgid "show tooltips" msgstr "Zeigt Gerattip" #: ../src/console_menus.h:135 ../src/console_menus.h:215 msgid "show extended information in a small pop-up window" msgstr "Zeigt ausgebreited Information in ein kleines pop-up Fenster" #: ../src/console_menus.h:142 ../src/console_menus.h:221 msgid "manual" msgstr "Handleitung" #: ../src/console_interface.c:538 msgid "Open a PIV image or data-file" msgstr "Offnet ein PIV Bild oder PIV Daten Datei" #: ../src/console_interface.c:558 msgid "Save data" msgstr "Daten speichern" #: ../src/console_interface.c:600 msgid "Execute the enabled chain process(es)" msgstr "Ausfuhren der Kettebearbeitung" #: ../src/console_interface.c:621 #, fuzzy msgid "Cancels all running processes" msgstr "Ausfuhrung von Kettebearbeitun" #: ../src/console_interface.c:648 msgid "" "Close active buffer(s).\n" "A warning message will be issued for unsaved data" msgstr "" "Shclieszen de aciv Puffer.\n" "Eine Warnung soll gegeben werden wenn Daten nicht Gespeicherd sind." #: ../src/console_interface.c:683 msgid "" "Exit GPIV.\n" "A warning message will be issued for unsaved data" msgstr "" "Shclieszen GPIV.\n" "Eine Warnung soll gegeben werden wenn die Daten nicht gespeicherd sind." #. #. * camera process button #. #: ../src/console_interface.c:801 msgid "camera" msgstr "Kamera" #: ../src/console_interface.c:815 #, fuzzy msgid "" "Enables camera for image recording within the chain process. \n" "The process will be executed by clicking the Execute button" msgstr "" "Schlusst Bild analiserung an fur die Kettebearbeitung: berechnet die " "Raumdurcschnitt\n" "Versetzung von alle Daten.\n" "Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." #. #. * trigger process button #. #: ../src/console_interface.c:845 msgid "trigger" msgstr "trigger" #: ../src/console_interface.c:859 #, fuzzy msgid "" "Enables (RTAI) camera and laser triggering within the chain process. \n" "The process will be executed by clicking the Execute button" msgstr "" "Schlusst Kamera und Laser an fur die Kettebearbeitung: berechnet die " "Raumdurcschnitt\n" "Versetzung von alle Daten.\n" "Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." #. #. * Image processing button #. #: ../src/console_interface.c:889 msgid "image" msgstr "Bild" #: ../src/console_interface.c:903 #, fuzzy msgid "" "Enables image processing within the chain process. \n" "The process will be executed by clicking the Execute button" msgstr "" "Schlusst Bild anayserung an fur die Kettebearbeitung: berechnet die " "Raumdurcschnitt\n" "Versetzung von alle Daten.\n" "Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." #. #. * piv process button #. #. #. * PIV activating button #. #: ../src/console_interface.c:930 ../src/piveval_interface.c:2792 msgid "piv" msgstr "piv" #: ../src/console_interface.c:944 msgid "" "Enables PIV image interrogation for chain processing: analysing of a PIV " "image (pair), resulting into the mean displacements of the particle images " "within each interrogation area. \n" "The process will be executed by clicking the Execute button" msgstr "" "Schlusst PIV an fur die Kettebearbeitung: die Analyse eines PIV Bild(paar) " "welche ein durchshnitt der Versetzung der Partikeln in einer Forschungsarea " "liefern soll.\n" "Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." #: ../src/console_interface.c:972 msgid "gradient" msgstr "gradient" #: ../src/console_interface.c:986 msgid "" "Enables gradient for chain processing: Disables velocities with gradients " "larger than 0.05 over the interrogation area. \n" "The process will be executed by clicking the \"Execute\" button" msgstr "" "Schlusst gradient an fur die Kettebearbeitung: Macht Geschwindichkeisangabe " "ungultig wenn die gradient groser sein soll wie 0.05 uber die " "Vorschungsarea.\n" "Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." #: ../src/console_interface.c:1012 ../src/pivvalid_interface.c:618 #, fuzzy msgid "residu" msgstr "residu" #: ../src/console_interface.c:1026 msgid "" "Enables residu statistics for chain processing: calculates the residus of " "displacements for detection of outliers and shows an histogram of them. The " "histogram will be displayed in the Piv Validation tab. \n" "The process will be executed by clicking the Execute button" msgstr "" "Schlusst residu Statistiek an fur die Kettebearbeitung: Berechnet die \n" "Ruckstand der Versetzung des Partikeln um ausschiessen zum finden und " "zeignet \n" "ein Histogram im PIV Geltung Reiter\n" "Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." #: ../src/console_interface.c:1054 msgid "validate" msgstr "gelten" #: ../src/console_interface.c:1068 msgid "" "Enables validation for chain processing: detects outliers of PIV data by " "testing on median residu or by Signal to Noise Ratio magnitudes and, " "eventually, substitutes. \n" "The process will be executed by clicking the Execute button" msgstr "" "Schlusst gelten an fur die Kettebearbeitung: findet Ausschiessen von testen " "des mediaan Ruckstand oder des haltnis von Sinal und Rauschen (SNR). Wenn " "moglich soll die Ausschiessen ersetzen werden.\n" "Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." #: ../src/console_interface.c:1095 ../src/pivvalid_interface.c:654 msgid "sub-pixel" msgstr "sub-pixel" #: ../src/console_interface.c:1109 #, fuzzy msgid "" "Enables peak-lock for chain processing: shows an histogram of sub-pixel " "displacements to check on peak-locking effects. The histogram will be " "displayed in the Piv Validation tab. \n" "The process will be executed by clicking the \"Execute\" button" msgstr "" "Schlusst Gipfeleinschluss an fur die Kettebearbeitung: zeigt ein histogram " "des sub-pixel Versetzung zum testen auf Gipfeleinschluss effects\n" "Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." #: ../src/console_interface.c:1136 ../src/pivpost_interface.c:479 msgid "scale" msgstr "Skala" #: ../src/console_interface.c:1149 msgid "" "Enables scaling for chain processing: scales spatial displacements over all " "data. \n" "The process will be executed by clicking the \"Execute\" button" msgstr "" "Schlusst durchsnitt an fur die Kettebearbeitung: berechnet die " "Raumdurcschnitt\n" "Versetzung von alle Daten.\n" "Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." #. #. * end of KEEP DISABLED #. #. #. * button to calculate averages #. #: ../src/console_interface.c:1175 ../src/pivpost_interface.c:698 msgid "average" msgstr "durchsnitt" #: ../src/console_interface.c:1188 msgid "" "Enables average for chain processing: Calculates spatial average " "displacements over all data. \n" "The process will be executed by clicking the \"Execute\" button" msgstr "" "Schlusst durchsnitt an fur die Kettebearbeitung: berechnet die " "Raumdurcschnitt\n" "Versetzung von alle Daten.\n" "Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." #. #. * button to subtract averages or zero offset displacements / velocities #. #: ../src/console_interface.c:1214 ../src/pivpost_interface.c:740 #, fuzzy msgid "subtract" msgstr "abziehen" #: ../src/console_interface.c:1228 msgid "" "Enables subtract for chain processing: subtracts spatial average " "displacements from all data. \n" "The process will be executed by clicking the \"Execute\" button" msgstr "" "Schlusst abziehen an fur die Kettebearbeitung: zieht Raumdurcschnitt ab von " "alle Daten.\n" "Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." #: ../src/console_interface.c:1254 ../src/pivpost_interface.c:1219 msgid "vorticity" msgstr "vortizitat" #: ../src/console_interface.c:1268 msgid "" "Enables vorticity for chain processing: calculates vorticity or strain " "magnitudes from a velocity field.\n" "The process will be executed by clicking the Execute button" msgstr "" "Schlusst vortizitat an fur die Kettebearbeitung: berechnet die vortizitat " "oder abschiebung von eider Geschwindigheidsfeld.\n" "Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." #: ../src/console_interface.c:1336 msgid "Record" msgstr "Registrehren" #: ../src/console_interface.c:1357 msgid "Image" msgstr "Bild" #: ../src/console_interface.c:1385 msgid "Process" msgstr "Bearbeitungen" #: ../src/console_interface.c:1417 msgid "Interrogate" msgstr "Vorschung" #: ../src/console_interface.c:1513 msgid "Validate" msgstr "Gelten" #. gtk_object_set_data (GTK_OBJECT (gpiv->console), #. "gpiv", #. gpiv); #: ../src/console_interface.c:1610 msgid "Post process" msgstr "Post prozessung" #: ../src/console_interface.c:1694 msgid "buffer names and numbers" msgstr "Puffer Namen und Numeros" #: ../src/console_interface.c:1792 msgid "buffer list" msgstr "Puffer Leiste" #: ../src/console_interface.c:1813 msgid "#" msgstr "#" #: ../src/console_interface.c:1825 msgid "buffer name" msgstr "Puffer Name" #: ../src/console.c:846 msgid "cancel_process = TRUE" msgstr "cancel_process = TRUE" #: ../src/console.c:857 msgid "cancel_process = FALSE" msgstr "ancel_process = FALSE" #: ../src/console.c:1199 msgid "Opens image/PIV data (and display)" msgstr "Offnet ein Bild/PIV (und Zeigner)" #: ../src/console.c:1213 msgid "Saves data" msgstr "Daten speichern" #: ../src/console.c:1227 #, fuzzy msgid "Prints selected buffer(s)" msgstr "Schliessen aktieve Puffer(n)" #: ../src/console.c:1241 msgid "Executes all tickmarked processes" msgstr "Ausfuhrung von Kettebearbeitun" #: ../src/console.c:1255 msgid "Cancels any running processes" msgstr "Beenden alle prozessen im ausfuhr" #: ../src/console.c:1269 msgid "Close active buffer(s)" msgstr "Schliessen aktieve Puffer(n)" #: ../src/console.c:1283 msgid "Exits GPIV" msgstr "Beendet GPIV" #: ../src/imgh_interface.c:113 msgid "Image information and settings" msgstr "Bild Information und Einstellungen" #: ../src/imgh_interface.c:212 msgid "buffer #: " msgstr "Puffer #:" #: ../src/imgh_interface.c:261 #, fuzzy msgid "file: " msgstr "Titel: " #. viewport_imgh #. #. * label for correlation #. #: ../src/imgh_interface.c:310 #, fuzzy msgid "correlation type: " msgstr "Datum der Verwertigung" #. #. * label for ncols #. #: ../src/imgh_interface.c:352 msgid "number of columns (pixels): " msgstr "Anzahl des Zuele (Pixels): " #. #. * label for nrows #. #: ../src/imgh_interface.c:394 msgid "number of rows (pixels): " msgstr "Anzahl de Regeln (Pixels): " #. #. * label for depth #. #: ../src/imgh_interface.c:438 msgid "image depth (bits): " msgstr "Bild tiefe (bits):" #. #. * frame, table and spinners for spatial scale "sscale" #. * #. * radio buttons and spinners defining spatial scale interactively #. * with pointer in image #. #: ../src/imgh_interface.c:485 msgid "Define spatial scale" msgstr "raumlichen Skala (mm/px): " #: ../src/imgh_interface.c:542 ../src/piveval_interface.c:1367 #: ../src/piveval_interface.c:1670 ../src/pivvalid_interface.c:223 #: ../src/display_menus.h:131 ../src/display_interface.c:619 msgid "None" msgstr "Kein" #: ../src/imgh_interface.c:580 msgid "Spanned length" msgstr "Uberspannen Lange" #: ../src/imgh_interface.c:617 msgid "Vertical spanned length" msgstr "Verikal uberspannen Lange" #: ../src/imgh_interface.c:655 msgid "Horizontal spanned length" msgstr "Horizontal uberspannen Lange" #: ../src/imgh_interface.c:692 msgid "span (pixels): " msgstr "Uberspannung (Pixels):" #: ../src/imgh_interface.c:752 msgid "length (mm): " msgstr "Lange (mm):" #. #. * spinner for spatial scale "sscale" #. #. #. *spinner for spatial scale "sscale" #. #: ../src/imgh_interface.c:815 ../src/pivpost_interface.c:221 msgid "spatial scale (mm/pixels): " msgstr "raumlichen Skala (mm/px): " #. #. * spinner for time scale "tscale" #. #. #. *spinner for time scale "tscale" #. #: ../src/imgh_interface.c:878 ../src/pivpost_interface.c:285 msgid "time scale (ms): " msgstr "Zeit Skala (ms):" #. #. * spinner for column position #. #: ../src/imgh_interface.c:957 msgid "position of column #0 (m): " msgstr "Platz Zuelse #0 (m):" #. #. * spinner for row position #. #: ../src/imgh_interface.c:1022 msgid "position of row #0 (m): " msgstr "Platz Regel #0 (m):" #. #. * entry for project #. #: ../src/imgh_interface.c:1086 msgid "Title: " msgstr "Titel: " #. #. * entry for creation date #. #: ../src/imgh_interface.c:1142 msgid "Creation date: " msgstr "Datum der Verwertigung" #. #. * entry for location #. #: ../src/imgh_interface.c:1201 msgid "Place: " msgstr "Lokation:" #. #. * entry for author #. #: ../src/imgh_interface.c:1254 #, fuzzy msgid "Author: " msgstr "Auto" #. #. * entry for software #. #: ../src/imgh_interface.c:1307 msgid "Software: " msgstr "Program: " #. #. * entry for source #. #: ../src/imgh_interface.c:1360 msgid "Source: " msgstr "Quelle " #. #. * entry for usertext #. #: ../src/imgh_interface.c:1413 msgid "Usertext: " msgstr "Gebraucherstext" #. #. * entry for warning #. #: ../src/imgh_interface.c:1466 msgid "Warning: " msgstr "Warnung: " #. #. * entry for disclaimer #. #: ../src/imgh_interface.c:1519 msgid "Disclaimer: " msgstr "" #. #. * entry for comment #. #: ../src/imgh_interface.c:1572 msgid "Comment: " msgstr "Komment:" #. #. * entry for copyright #. #: ../src/imgh_interface.c:1625 msgid "Copyright: " msgstr "" #. #. * entry for email #. #: ../src/imgh_interface.c:1678 msgid "Email: " msgstr "" #. #. * entry for url #. #: ../src/imgh_interface.c:1731 msgid "Url: " msgstr "" #: ../src/imgh.c:85 #, fuzzy msgid "No action" msgstr "Kein Action" #: ../src/imgh.c:99 msgid "Points the length spanned by a ruler in the image" msgstr "" #: ../src/imgh.c:113 msgid "Points the vertical length by a ruler in the image" msgstr "" #: ../src/imgh.c:128 msgid "Points the horizontal length by a ruler in the image" msgstr "" #: ../src/piveval_interface.c:134 #, fuzzy msgid "Piv image interrogation" msgstr "Piv Bild vorschung" #: ../src/piveval_interface.c:235 msgid "first col:" msgstr "erste Zeule:" #: ../src/piveval_interface.c:255 msgid "last col:" msgstr "letzte Zeule:" #: ../src/piveval_interface.c:275 msgid "pre-shift col:" msgstr "Vorverschiebung Zeule:" #: ../src/piveval_interface.c:295 msgid "first row:" msgstr "erste Regel:" #: ../src/piveval_interface.c:315 msgid "last row:" msgstr "letzte Regel:" #: ../src/piveval_interface.c:335 msgid "pre-shift row:" msgstr "Vorverschiebung Regel:" #: ../src/piveval_interface.c:640 #, fuzzy msgid "Final Int Size" msgstr "F.Area Dim. 1" #. VECTOR_SCALE_3 #: ../src/piveval_interface.c:732 ../src/piveval_interface.c:961 #: ../src/piveval_interface.c:1197 ../src/display_menus.h:158 msgid "16" msgstr "16" #. VECTOR_SCALE_4 #: ../src/piveval_interface.c:766 ../src/piveval_interface.c:995 #: ../src/piveval_interface.c:1231 ../src/display_menus.h:160 msgid "32" msgstr "32" #. VECTOR_SCALE_5 #: ../src/piveval_interface.c:800 ../src/piveval_interface.c:1029 #: ../src/piveval_interface.c:1265 ../src/display_menus.h:162 msgid "64" msgstr "64" #. VECTOR_SCALE_6 #: ../src/piveval_interface.c:834 ../src/piveval_interface.c:1062 #: ../src/piveval_interface.c:1299 ../src/display_menus.h:164 msgid "128" msgstr "128" #. #. * radio buttons for interrogation size 2 #. #: ../src/piveval_interface.c:869 #, fuzzy msgid "Initial Int Size" msgstr "F.Area Dim. 1" #. #. * radio buttons for shifted distance of interrogation areas #. #: ../src/piveval_interface.c:1097 msgid "Shift" msgstr "Verschiebung" #. VECTOR_SCALE_2 #: ../src/piveval_interface.c:1162 ../src/display_menus.h:156 msgid "8" msgstr "8" #. #. * radio button for mouse selecting #. #: ../src/piveval_interface.c:1334 msgid "Mouse select" msgstr "Maus Selection" #: ../src/piveval_interface.c:1405 msgid "Area" msgstr "Flache" #: ../src/piveval_interface.c:1443 msgid "Single int." msgstr "Einzel Vorsch." #: ../src/piveval_interface.c:1482 msgid "Single point" msgstr "Einzel Punkt" #: ../src/piveval_interface.c:1521 msgid "Drag int." msgstr "Versetzung Vorsch." #: ../src/piveval_interface.c:1560 msgid "Vert. Line" msgstr "Vert Linie" #: ../src/piveval_interface.c:1598 msgid "Hor. Line" msgstr "Hor. Linie" #. #. * radio buttons for sub-pixel interpolation scheme #. #: ../src/piveval_interface.c:1637 #, fuzzy msgid "Sub-pixel Interpolation" msgstr "Sub-pixel vorschung" #: ../src/piveval_interface.c:1712 msgid "Gauss" msgstr "Gauss" #: ../src/piveval_interface.c:1754 msgid "Power" msgstr "Potenz" #: ../src/piveval_interface.c:1796 msgid "Gravity" msgstr "Schwertpunkt" #. eval->radiobutton_fit_marquardt = gtk_radio_button_new_with_label (eval->vbox10_group, #. _("Marquardt")); #. eval->vbox10_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_fit_marquardt)); #. gtk_widget_ref (eval->radiobutton_fit_marquardt); #. gtk_object_set_data_full (GTK_OBJECT (main_window), #. "radiobutton_fit_marquardt", #. eval->radiobutton_fit_marquardt, #. (GtkDestroyNotify) gtk_widget_unref); #. gtk_widget_show (eval->radiobutton_fit_marquardt); #. gtk_box_pack_start (GTK_BOX (eval->vbox10), #. eval->radiobutton_fit_marquardt, #. FALSE, #. FALSE, #. 0); #. gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_marquardt), #. "ifit", #. "4"); #. gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_marquardt), #. "eval", #. eval); #. gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_marquardt), #. "var_type", #. "0"); #. g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_marquardt), #. "toggled", #. G_CALLBACK (on_toggle_piv), #. NULL); #. #. * radio buttons for correlation peak number to be detected #. #: ../src/piveval_interface.c:1870 msgid "Peak #" msgstr "Pike #" #: ../src/piveval_interface.c:1901 ../src/display_menus.h:150 msgid "1" msgstr "1" #. VECTOR_SCALE_0 #: ../src/piveval_interface.c:1942 ../src/display_menus.h:152 msgid "2" msgstr "2" #: ../src/piveval_interface.c:1983 msgid "3" msgstr "3" #. #. * additonal calculation schemes for correlation detection #. #: ../src/piveval_interface.c:2025 msgid "Interrogation scheme" msgstr "Vorschung Schema" #: ../src/piveval_interface.c:2061 msgid "Image deformation" msgstr "" #: ../src/piveval_interface.c:2103 #, fuzzy msgid "Central differential" msgstr "Zentral difernzial" #: ../src/piveval_interface.c:2144 msgid "Zero offset" msgstr "Null Verschiebung" #: ../src/piveval_interface.c:2185 msgid "Weight Kernel" msgstr "wagen Kernel" #. #. * radio buttons for cross-or auto correlation #. * defined in image header, not user definable #. #. #. * Gnome canvas display corr function #. #: ../src/piveval_interface.c:2229 ../src/piveval_interface.c:2537 msgid "Correlation" msgstr "Korrelation" #: ../src/piveval_interface.c:2262 msgid "Auto" msgstr "Auto" # Kreuz #: ../src/piveval_interface.c:2295 msgid "Cross" msgstr "Kreuz" #: ../src/piveval_interface.c:2329 msgid "Gauss weighting" msgstr "" #: ../src/piveval_interface.c:2364 msgid "SPOF filtering" msgstr "" #: ../src/piveval_interface.c:2400 msgid "Interrogation areas and correlation" msgstr "Vorschungsraume und Korrelation" #. #. * gnome canvas interrogation area1 #. #: ../src/piveval_interface.c:2435 msgid "Int. area 1" msgstr "V.Raum 1" #. #. * gnome canvas interrogation area2 #. #: ../src/piveval_interface.c:2484 msgid "Int. area 2" msgstr "V.Raum 2" #. #. * gnome canvas display values #. #: ../src/piveval_interface.c:2585 msgid "Estimator" msgstr "Schatzer" #: ../src/piveval_interface.c:2650 msgid "Monitor" msgstr "" #. #. * spinner for zoom #. #: ../src/piveval_interface.c:2684 msgid "Zoom:" msgstr "" #. #. * spinner for vector length #. #: ../src/piveval_interface.c:2738 #, fuzzy msgid "Vector scale:" msgstr "Vektor Skala:" #: ../src/piveval_interface.c:2811 msgid "" "Interrogates a PIV image (pair) resulting into estimators of the mean " "displacement of the particle images within each interrogation area" msgstr "" "Die Analyse eines PIV Bild(paar) welche ein durchshnitt der Versetzung der \n" "Partikeln in einer Forschungsarea liefern soll." #: ../src/piveval.c:598 #, c-format msgid "" "Image deformation is impossibe with this Mouse select.\n" "Setting Interrogation scheme to Central difference.\n" "This will be reset automatically after interrogating." msgstr "" #: ../src/piveval.c:626 ../src/pivvalid.c:572 msgid "No mouse activity within displayer" msgstr "Kein maus activitat im Zeigner" #: ../src/piveval.c:640 msgid "Selects an area within the image to be analyzed" msgstr "" #: ../src/piveval.c:654 msgid "" "Piv evaluation at a single interrogation area. Conserves other existing data" msgstr "" #: ../src/piveval.c:669 msgid "" "Piv evaluation at a single point in the image. Rejects all existing data!!" msgstr "" #: ../src/piveval.c:684 msgid "Displaces a single interrogation area and analyzes" msgstr "" #: ../src/piveval.c:698 msgid "Evaluation at a vertical line. " msgstr "" #: ../src/piveval.c:712 msgid "Evaluation at a horizontal line. " msgstr "" #: ../src/piveval.c:805 #, c-format msgid "" "Int Size 2 > Int Size 1 \n" "Setting Interrogation scheme to Image deformation" msgstr "" #: ../src/piveval.c:1102 #, fuzzy msgid "Interpolation scheme for sub-pixel estimation" msgstr "Interpolation Schema" #: ../src/piveval.c:1117 msgid "Chooses n-th highest top number of correlation as estimator" msgstr "" #: ../src/piveval.c:1132 msgid "Bias correction scheme" msgstr "" #: ../src/piveval.c:1147 msgid "Deforms image from PIV estimators" msgstr "" #: ../src/piveval.c:1205 msgid "Gauss weighting on the Interrogation Area" msgstr "" #: ../src/piveval.c:1237 msgid "Symmetric Phase Only Filtering on the FT images" msgstr "" #: ../src/piveval.c:1346 msgid "Displays subimages, correlation function and PIV vector" msgstr "" #: ../src/piveval.c:1582 msgid "Analyses a PIV image (pair)" msgstr "" #: ../src/pivvalid_interface.c:102 #, fuzzy msgid "Piv data validation" msgstr "Piv Daten Geltung" #. #. * Enable / Disable frame #. #: ../src/pivvalid_interface.c:187 msgid "Disable data" msgstr "Ausschaltung Anlage" #: ../src/pivvalid_interface.c:265 msgid "Enable point" msgstr "Anschaltung einzel Punkt" #: ../src/pivvalid_interface.c:304 msgid "Disable point" msgstr "Ausschaltung einzel Punkt" #: ../src/pivvalid_interface.c:343 msgid "Enable area" msgstr "Anschaltun Flache" #: ../src/pivvalid_interface.c:382 msgid "Disable area" msgstr "Ausschaltung Flache" #: ../src/pivvalid_interface.c:423 msgid "validate on velocity gradient " msgstr "Geltung des Geschwidigkeitsgradient" #: ../src/pivvalid_interface.c:443 msgid "" "Disables PIV data that have a too large velocity gradient over the " "Interrogation Area" msgstr "" "Ausschaltung des PIV Anlage die eine zu grosen Geschwidigkeitsgradient uber " "die Vorschungsanflache haben" #. #. * Frame for histogram of sub-pixel values (used to test on peak-locking #. * effect) #. #: ../src/pivvalid_interface.c:471 msgid "Histograms" msgstr "" #: ../src/pivvalid_interface.c:522 msgid "# bins: " msgstr "#bins" #: ../src/pivvalid_interface.c:632 msgid "calculates residus of displacements and displays in a histogram" msgstr "Berechnet residus von Versetzung und zeigt im Histogram." #: ../src/pivvalid_interface.c:668 #, fuzzy msgid "" "shows histogram of sub-pixel displacements to check on peak-locking effects" msgstr "" "Zeigt ein histogram des Partikeln Versetzung und zum testen auf " "Gipfeleinschluss effects" #: ../src/pivvalid_interface.c:691 msgid "U-comp" msgstr "" #: ../src/pivvalid_interface.c:705 #, fuzzy msgid "" "shows histogram of horizontal displacements.\n" "Only this histogram will be saved" msgstr "Berechnet residus von Versetzung und zeigt im Histogram." #: ../src/pivvalid_interface.c:727 msgid "V-comp" msgstr "" #: ../src/pivvalid_interface.c:741 #, fuzzy msgid "" "shows histogram of vertical displacements.\n" "Only this histogram will be saved" msgstr "Berechnet residus von Versetzung und zeigt im Histogram." #. #. * Errvec frame #. #: ../src/pivvalid_interface.c:767 msgid "Outliers" msgstr "Ausschiesern" #: ../src/pivvalid_interface.c:820 msgid "Neighbors: " msgstr "" #: ../src/pivvalid_interface.c:888 msgid "Data yield: " msgstr "" #: ../src/pivvalid_interface.c:955 msgid "Threshold: " msgstr "" #: ../src/pivvalid_interface.c:1005 #, fuzzy msgid "Show SNR values" msgstr "zeigt Werte" #: ../src/pivvalid_interface.c:1042 msgid "Residu type:" msgstr "Residu Type" #: ../src/pivvalid_interface.c:1074 msgid "Normalized median" msgstr "" #: ../src/pivvalid_interface.c:1118 ../src/pivvalid_interface.c:1340 msgid "Median" msgstr "Mediaan" #: ../src/pivvalid_interface.c:1162 msgid "Snr" msgstr "Snr" #. #. * A long time ago, the GtkWidget valid->button_errvec_resstats was *here*. #. * Though it felt in love with valid->button_peaklock. #. * Now they are living happily cheeck tot cheeck. #. * No, they haven't got child widgets, yet. But maybe, one day ... #. #. #. * Radio buttons for substitution type #. #: ../src/pivvalid_interface.c:1216 msgid "Substituted by:" msgstr "Ersetzen durch" #: ../src/pivvalid_interface.c:1249 #, fuzzy msgid "Nothing" msgstr "Korrelation" #: ../src/pivvalid_interface.c:1297 msgid "Mean of surroundings" msgstr "durchshnitt des Nachbarn" #: ../src/pivvalid_interface.c:1384 #, fuzzy msgid "Next highest corr. peak" msgstr "Nachstest hohest cov. Gipfel" #: ../src/pivvalid_interface.c:1428 msgid "validate on outliers" msgstr "gelten auf Ausschiessern" #: ../src/pivvalid_interface.c:1442 msgid "substitutes outliers" msgstr "ersetzn des Ausschiessern" #: ../src/pivvalid.c:105 ../src/pivvalid.c:287 ../src/pivvalid.c:390 #: ../src/pivvalid.c:507 ../src/pivpost.c:144 ../src/pivpost.c:248 #: ../src/pivpost.c:355 ../src/pivpost.c:587 msgid "no PIV data" msgstr "keine PIV Daten" #: ../src/pivvalid.c:526 msgid "Examines PIV data on velocity gradients" msgstr "" #: ../src/pivvalid.c:587 msgid "Enables a single PIV data-point" msgstr "Schlusst ein einfages PIV Daten an" #: ../src/pivvalid.c:602 msgid "Disables a single PIV data-point" msgstr "Shliesst eine einfages PIV Daten ab" #: ../src/pivvalid.c:617 #, fuzzy msgid "Enables an area containing PIV data" msgstr "Schlusst ein Feld mit PIV Daten an" #: ../src/pivvalid.c:632 msgid "Disables an area containing PIV data" msgstr "Schlusst ein Feld mit PIV Daten ab" #: ../src/pivvalid.c:660 msgid "Defines residu type to examine data on" msgstr "" #: ../src/pivvalid.c:687 msgid "Displays inverse cumulative histogram of residus" msgstr "" #: ../src/pivvalid.c:776 msgid "Display PIV vector colors related to residu or SNR value" msgstr "" #: ../src/pivvalid.c:815 msgid "Only sets peak_no (flag) to zero" msgstr "" #: ../src/pivvalid.c:817 #, fuzzy msgid "mean from surroundings" msgstr "durchshnitt des Nachbarn" #: ../src/pivvalid.c:819 #, fuzzy msgid "Median (middle value) from surroundings" msgstr "durchshnitt des Nachbarn" #: ../src/pivvalid.c:821 msgid "Re-interrogates and uses next corr. peak as estimator" msgstr "" #: ../src/pivvalid.c:852 msgid "Examines PIV data on outliers and substitutes" msgstr "" #: ../src/pivvalid.c:914 msgid "Calculates a histogram of sub-pixel displacements" msgstr "" #: ../src/pivvalid.c:961 #, fuzzy msgid "Calculates a histogram of horizontal displacements." msgstr "Berechnet residus von Versetzung und zeigt im Histogram." #: ../src/pivvalid.c:1008 #, fuzzy msgid "Calculates a histogram of vertical displacements." msgstr "Berechnet residus von Versetzung und zeigt im Histogram." #: ../src/pivpost_interface.c:98 #, fuzzy msgid "Piv data post processing" msgstr "Piv: Daten post prozessung" #. #. * Scale frame #. #. #. * Spinners use the adjustment from spinbutton_adj_imgh_* #. #: ../src/pivpost_interface.c:185 msgid "Scaling" msgstr "Skalierung" #. #. * spinner for column position #. #: ../src/pivpost_interface.c:350 #, fuzzy msgid "pos. of col #0 (m): " msgstr "Platz Zuelse #0 (m):" #. #. * spinner for row position #. #: ../src/pivpost_interface.c:416 #, fuzzy msgid "pos. of row #0 (m): " msgstr "Platz Regel #0 (m):" #: ../src/pivpost_interface.c:498 msgid "" "Calculates time and spatial scaled particle displacements (i.e. velocities) " "from a PIV displacement field, and their scaled positions" msgstr "" #. #. * Spatial average frame #. #: ../src/pivpost_interface.c:525 msgid "Offset / Spatial statistics" msgstr "" #. #. *spinner for spatial average horizontal velocity U-avg #. #: ../src/pivpost_interface.c:561 #, fuzzy msgid "dx (px), U (m/s): " msgstr "dx (px), U (m/s): " #. #. * end of KEEP DISABLED #. #. #. * spinner for spatial average vertical velocity V-avg #. #: ../src/pivpost_interface.c:633 #, fuzzy msgid "dy (px), V (m/s): " msgstr "dy (px), V (m/s): " #: ../src/pivpost_interface.c:716 msgid "" "Calculates spatial average particle displacements or velocities from a " "velocity field, obtained from PIV data" msgstr "" #: ../src/pivpost_interface.c:759 msgid "" "Subtracts the spatial averages or offset displacements / velocities, from " "each estimator" msgstr "" #. #. * Vorstra frame #. #: ../src/pivpost_interface.c:783 msgid "Vorticity & strain" msgstr "Vortizitat und " #: ../src/pivpost_interface.c:816 msgid "Output:" msgstr "" #: ../src/pivpost_interface.c:848 ../src/display_menus.h:134 #: ../src/display_interface.c:635 msgid "Vorticity" msgstr "Vortizitat" #: ../src/pivpost_interface.c:889 ../src/display_menus.h:137 #: ../src/display_interface.c:650 msgid "Shear strain" msgstr "" #: ../src/pivpost_interface.c:930 ../src/display_menus.h:140 #: ../src/display_interface.c:666 msgid "Normal strain" msgstr "" #: ../src/pivpost_interface.c:968 msgid "Differential scheme:" msgstr "" #: ../src/pivpost_interface.c:1002 msgid "Central" msgstr "Zentral" #: ../src/pivpost_interface.c:1043 msgid "Least squares" msgstr "" #: ../src/pivpost_interface.c:1085 msgid "Richardson" msgstr "Richardson" #: ../src/pivpost_interface.c:1135 msgid "Circulation method" msgstr "" #: ../src/pivpost_interface.c:1233 msgid "" "Calculates vorticity or strain magnitudes from a velocity field, obtained by " "PIV" msgstr "" #: ../src/pivpost.c:118 #, fuzzy msgid "exec_scale: Failure calling gpiv_post_scale" msgstr "Fehler des anrufen gpiv_count_pivdata\n" #: ../src/pivpost.c:582 #, fuzzy msgid "exec_vorstra: non valid operation" msgstr "kein geltig vorstra Handlung" #: ../src/pivpost.c:671 msgid "on_spinbutton_post_scale: should not arrive here" msgstr "" #: ../src/pivpost.c:686 msgid "Calculates scaled locations and velocities" msgstr "" #: ../src/pivpost.c:760 msgid "Calculates spatial average displacements" msgstr "" #: ../src/pivpost.c:805 msgid "Subtracts mean displacements / offset values from PIV data" msgstr "" #: ../src/pivpost.c:850 msgid "Selects the differential quantity" msgstr "" #: ../src/pivpost.c:894 msgid "Selects the type of differential scheme" msgstr "" #: ../src/pivpost.c:923 msgid "Calculates differential quantity" msgstr "" #: ../src/display_menus.h:71 #, fuzzy msgid "0.25" msgstr "0.5" #: ../src/display_menus.h:73 msgid "0.5" msgstr "0.5" #: ../src/display_menus.h:75 msgid "0.83" msgstr "0.83" #: ../src/display_menus.h:77 msgid "1.0" msgstr "1.0" #: ../src/display_menus.h:79 msgid "1.3" msgstr "1.3" #: ../src/display_menus.h:81 msgid "1.6" msgstr "1.6" #: ../src/display_menus.h:83 msgid "2.0" msgstr "2.0" #: ../src/display_menus.h:85 #, fuzzy msgid "4.0" msgstr "1.0" #: ../src/display_menus.h:94 msgid "Blue background" msgstr "" #: ../src/display_menus.h:97 msgid "Black background" msgstr "" #: ../src/display_menus.h:100 msgid "Image A" msgstr "Bild A" #: ../src/display_menus.h:103 msgid "Image B" msgstr "Bild B" #: ../src/display_menus.h:121 ../src/display_interface.c:585 msgid "Interrogation area's" msgstr "Forschungsanflache" #: ../src/display_menus.h:123 ../src/display_interface.c:595 msgid "Velocity vectors" msgstr "Geschwindichkeitsvectoren" #. VECTOR_SCALE_1 #: ../src/display_menus.h:154 msgid "4" msgstr "4" #. VECTOR_SCALE_7 #: ../src/display_menus.h:166 msgid "256" msgstr "256" #: ../src/display_menus.h:176 #, fuzzy msgid "Peak nr" msgstr "Pike #" #: ../src/display_menus.h:178 #, fuzzy msgid "SNR" msgstr "SNR" #: ../src/display_menus.h:180 #, fuzzy msgid "Magnitude gray" msgstr "Grose grau" #: ../src/display_menus.h:182 #, fuzzy msgid "Magnitude color" msgstr "Grosse farben" #: ../src/display_menus.h:224 #, fuzzy msgid "View menubar" msgstr "Menuleiste" #: ../src/display_menus.h:224 msgid "Displays menubar in window" msgstr "" #: ../src/display_menus.h:226 ../src/display_interface.c:394 #, fuzzy msgid "View rulers" msgstr "Menuleiste" #: ../src/display_menus.h:226 msgid "Displays rulers in window" msgstr "" #: ../src/display_menus.h:228 ../src/display_interface.c:406 #, fuzzy msgid "Stretch auto" msgstr "Zeigner" #: ../src/display_menus.h:228 msgid "Stretch display automatic when zooming" msgstr "" #: ../src/display_menus.h:230 ../src/display_interface.c:418 #, fuzzy msgid "Stretch display" msgstr "Zeigner" #: ../src/display_menus.h:231 ../src/display_interface.c:424 msgid "Stretch or fit display window to the image area" msgstr "" #: ../src/display_menus.h:233 msgid "Zoom in/out" msgstr "" #: ../src/display_menus.h:235 msgid "View background" msgstr "" #: ../src/display_menus.h:237 #, fuzzy msgid "View piv data" msgstr "Es gibt kein Bild oder PIV daten" #: ../src/display_menus.h:238 #, fuzzy msgid "View scalar data" msgstr "Ausschaltung Anlage" #: ../src/display_menus.h:240 msgid "Vector scale" msgstr "Vektor Skala" #: ../src/display_menus.h:241 #, fuzzy msgid "Vector color" msgstr "Vektor Skala" #: ../src/display_interface.c:364 #, fuzzy msgid "_View" msgstr "Ansicht" #: ../src/display_interface.c:383 #, fuzzy msgid "View menu bar" msgstr "Zeigt Menuleiste" #: ../src/display_interface.c:454 msgid "set zoom factor" msgstr "" #: ../src/display_interface.c:477 msgid "_Background" msgstr "" #: ../src/display_interface.c:491 msgid "Blue" msgstr "" #: ../src/display_interface.c:499 msgid "set blue background" msgstr "" #: ../src/display_interface.c:511 #, fuzzy msgid "Black" msgstr "Zwarz" #: ../src/display_interface.c:519 msgid "set black background" msgstr "" #: ../src/display_interface.c:531 #, fuzzy msgid "Image_A" msgstr "Bild A" #: ../src/display_interface.c:539 msgid "set first image as background" msgstr "" #: ../src/display_interface.c:559 msgid "set second image as background" msgstr "" #: ../src/display_interface.c:573 msgid "_Piv" msgstr "" #: ../src/display_interface.c:608 #, fuzzy msgid "_Scalar" msgstr "Skala" #: ../src/display_interface.c:683 #, fuzzy msgid "Scal_e" msgstr "Skala" #: ../src/display_interface.c:708 #, fuzzy msgid "set vector_scale" msgstr "Vektor Skala" #: ../src/display_interface.c:723 msgid "C_olor" msgstr "" #: ../src/display.c:690 msgid "select_view_background: should not arrive here" msgstr "" #: ../src/display.c:849 msgid "select_view_scalardata: should not arrive here" msgstr "" #~ msgid "Int Size 2" #~ msgstr "F.Area Dim. 2" #, fuzzy #~ msgid "Validation" #~ msgstr "Piv Geltung" #~ msgid "Failure opening image header for output" #~ msgstr "Fehler offnung Bild kopf fuhr ausfuhr" #~ msgid "Failure opening parameter file for output" #~ msgstr "Fehler offnung parameter Datei fuhr ausfuhr" #~ msgid "SELECT_ACTION_FROM_FNAME: non-valid file name" #~ msgstr "ELECT_ACTION_FROM_FNAME: ungultige Datei Name" #~ msgid "File selection" #~ msgstr "Selection des Datei" #~ msgid "name: " #~ msgstr "Name:" #, fuzzy #~ msgid "" #~ "col_start larger than img_width; \n" #~ "set to zero" #~ msgstr "" #~ "col_start groser wie img_width; \n" #~ "auf nul gesetzt" #, fuzzy #~ msgid "" #~ "col_end larger than img_width; \n" #~ "set to img_width - 1" #~ msgstr "" #~ "col_end groser wie img_width; \n" #~ "auf col_end -1 gesetzt" #, fuzzy #~ msgid "" #~ "row_start larger than img_height; \n" #~ "set to zero" #~ msgstr "" #~ "col_start groser wie img_width; \n" #~ "auf nul gesetzt" #, fuzzy #~ msgid "" #~ "row_end larger than img_height; \n" #~ "set to img_height - 1" #~ msgstr "" #~ "row_end groser wie img_height; \n" #~ "auf img_height - 1 gesetzt" #, fuzzy #~ msgid "image width = %d image height = %d image colour depth = %d" #~ msgstr "Bild Breite = %d Bild Hohe = %d" #, fuzzy #~ msgid "Print the displayed data of active buffer(s)" #~ msgstr "Schliessen aktieve Puffer(n)" #, fuzzy #~ msgid "record" #~ msgstr "Registrehren" #, fuzzy #~ msgid "" #~ "Enables data acquisition for chain processing: recording of images " #~ "(pairs). \n" #~ "The process will be executed by clicking the Execute button" #~ msgstr "" #~ "Schlusst durchsnitt an fur die Kettebearbeitung: berechnet die " #~ "Raumdurcschnitt\n" #~ "Versetzung von alle Daten.\n" #~ "Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." #, fuzzy #~ msgid "" #~ "Image or header doesn't exist \n" #~ "or image dimensions (%dx%d) differ \n" #~ "from parameter settings (%dx%d)" #~ msgstr "" #~ "Bild dimensionen (%dx%d) sind ungleich wie\n" #~ "parameter Einstellungen (%dx%d)" #, fuzzy #~ msgid "" #~ "cross correlation parameter from image \n" #~ "not in agreement with GPIV setting" #~ msgstr "" #~ "Kruez-korrelation parameter is ungleich wie\n" #~ "GPIV parameter Einstellung" #, fuzzy #~ msgid "select_action_from_fname: non-valid file name" #~ msgstr "load_buffer:: kein bestehende Name des Datei" #, fuzzy #~ msgid "" #~ "At first, open an image. \n" #~ "Than we'll further see what will happen." #~ msgstr "" #~ "Zum anfangen, offnen Sie ein Bild. Nachdem mochten wir mal sehen wass " #~ "passieren soll" #, fuzzy #~ msgid "Disabled: not a number" #~ msgstr "Ausschaltung Anlage" #, fuzzy #~ msgid "Disabled manually" #~ msgstr "Ausschaltung Anlage" #~ msgid "no image or piv data" #~ msgstr "Es gibt kein Bild oder PIV daten" #~ msgid "Couldn't create pixmap from file: %s" #~ msgstr "Konnte kein pixmap vom Datei anmachen: %s" #~ msgid "gpiv buttons" #~ msgstr "GPIV leiste" #, fuzzy #~ msgid "In/output" #~ msgstr "In/ausfuhr" #, fuzzy #~ msgid "HDF5 format (.gpi)" #~ msgstr "HDF5 format (.gpi)" #~ msgid "include image in .gpi" #~ msgstr "enthalted Bild ins .gpi" #, fuzzy #~ msgid "cross-correlation" #~ msgstr "Korrelation" #~ msgid "img width: " #~ msgstr "Bild breite:" #~ msgid "img height: " #~ msgstr "Bild hohe:" #, fuzzy #~ msgid "img depth: " #~ msgstr "Bild breite:" #~ msgid "tooltips" #~ msgstr "Gerattip" #~ msgid "peaklock" #~ msgstr "Gipfeleinschluss" #, fuzzy #~ msgid "scaling" #~ msgstr "Skalierung" #~ msgid "number of histogram bins: " #~ msgstr "Anzahl des Histogram bins: " #, fuzzy #~ msgid "console" #~ msgstr "Konsole" #, fuzzy #~ msgid "vector color" #~ msgstr "Vektor Skala" #~ msgid "zoom scale" #~ msgstr "Vergrosungsskala" #~ msgid "image B" #~ msgstr "Bild B" #, fuzzy #~ msgid "hide/display PIV data" #~ msgstr "verbergen/schauen Daten" #, fuzzy #~ msgid "PIV-derived data" #~ msgstr "Es gibt kein Bild oder PIV daten" #~ msgid "Updates parameters and save as defaults" #~ msgstr "Erneuert die Parameter und speichert wie normal" #~ msgid "Updates actual parameters, do not store as defaults" #~ msgstr "Erneuert die Parameter, sollen nicht wie normal gespeichert werden" #~ msgid "Close preferences window" #~ msgstr "Schlieszt vorlieben Fenster" #~ msgid "Open" #~ msgstr "Offnen" #~ msgid "Save" #~ msgstr "Speichern" #, fuzzy #~ msgid "Print" #~ msgstr "gradient" #~ msgid "Execute" #~ msgstr "Ausfuhren" #~ msgid "Stop" #~ msgstr "Halt" # Kreuz #, fuzzy #~ msgid "Close" #~ msgstr "Kreuz" #~ msgid "Exit" #~ msgstr "Beenden" #, fuzzy #~ msgid "" #~ "Enables scale for chain processing: scales spatial displacements from all " #~ "data. \n" #~ "The process will be executed by clicking the \"Execute\" button" #~ msgstr "" #~ "Schlusst abziehen an fur die Kettebearbeitung: zieht Raumdurcschnitt ab " #~ "von alle Daten.\n" #~ "Das Prozess wird ausgefuhrt wenn mann die Ausfuhrknopfe eindruckt." #~ msgid "Image Info" #~ msgstr "Bild Info:" #, fuzzy #~ msgid "Evaluation" #~ msgstr "Piv Geltung" #, fuzzy #~ msgid "" #~ "GPIV is a program for (Digital) Particle Image Velocimetry. It evaluates " #~ "images (pairs) from a fluid that has been seeded with tracer particles, " #~ "resulting into a velocity field of a fluid flow. The program includes " #~ "validation of the resulting estimators and includes several post-" #~ "processing algorithms" #~ msgstr "" #~ "GPIV ist ein Program fur ((Digitalische) Particle Image Velocimetry. Es " #~ "evaluiert \n" #~ "Bild (Paren), welche ein Geschwindigkeitsfeld eines Fluidum Stromung " #~ "aufliefert. Das Program enthalt\n" #~ "PIV Geltung des geschwindichkeits Daten und post Prozessung" #, fuzzy #~ msgid "GPIV message" #~ msgstr "GPIV Berichtung" #, fuzzy #~ msgid "GPIV error" #~ msgstr "GPIV Fehler" #~ msgid "Image Header Info" #~ msgstr "Bild Information" #~ msgid "Project: " #~ msgstr "Project:" #~ msgid "Failure calling gpiv_count_pivdata for %s" #~ msgstr "%s: Fehlen des anrufen gpiv_count_pivdata fur %s" #~ msgid "Peak locking" #~ msgstr "Gipfel einschliessen" #~ msgid "residu statistics" #~ msgstr "residu Statistiek" #~ msgid "peak lock" #~ msgstr "Gipfel Einschluss" #~ msgid "number of bins for histograms" #~ msgstr "Anzahl des Zeule der histogram" #~ msgid "BINS" #~ msgstr "Zeule" #~ msgid "number of columns in image" #~ msgstr "Anzahl des Zuele:" #~ msgid "NCOLUMNS" #~ msgstr "ZUELE" #~ msgid "number of rows in image" #~ msgstr "Anzahl des Regeln:" #~ msgid "NROWS" #~ msgstr "REGELN" #~ msgid "enables displaying of the first image of a PIV image pair" #~ msgstr "Schlusst das Zeigen der ersten Bild einer PIV Paar" #~ msgid "enables displaying of the second image of a PIV image pair" #~ msgstr "Schlusst das Zeigen der zweiten Bild einer PIV Paar" #~ msgid "enables displaying of interrogation regions" #~ msgstr "Anschluss des Zeigen von dem interrogation regions" #~ msgid "enables displaying of PIV data" #~ msgstr "Anschluss des Zeigen von die PIV Angabe" #, fuzzy #~ msgid "enables displaying of vorticity data" #~ msgstr "Schluss des Zeigen der vortiziteits Daten an" #~ msgid "enables displaying of shear strain data" #~ msgstr "Schluss des Zeigen der shear strain Daten an" #~ msgid "enables displaying of normal strain data" #~ msgstr "Schlusst des Zeigen der Druck Daten an" #, fuzzy #~ msgid "save data in HDF5 format with .gpi extension" #~ msgstr "Speichern des Daten ins HDF5 Format mit .gpi extension" #, fuzzy #~ msgid "include image data in .gpi file (HDF5 format)" #~ msgstr "Einbegriffen des bild Daten in .gpi Datei (HDF5 Format)" #~ msgid "print parameters and other info to stdout" #~ msgstr "print die Parameters und alteres Infoation nach stdout" #, fuzzy #~ msgid "includes piv in the chain-process" #~ msgstr "einbegriffen von piv ins Kette bearbeitung" #, fuzzy #~ msgid "includes gradient in the chain-process" #~ msgstr "einbegriffen von gradient ins Kette bearbeitung" #, fuzzy #~ msgid "includes resstats in the chain-process" #~ msgstr "einbegriffen von resstats ins Kette bearbeitung" #, fuzzy #~ msgid "includes validate in the chain-process" #~ msgstr "einbegriffen von gelten ins Kette bearbeitung" #, fuzzy #~ msgid "includes peaklock in the chain-process" #~ msgstr "einbegriffen von peaklock ins Kette bearbeitung" #, fuzzy #~ msgid "includes average in the chain-process" #~ msgstr "einbegriffen von Durchschnitt ins Kette bearbeitung" #, fuzzy #~ msgid "includes scaling in the chain-process" #~ msgstr "einbegriffen von piv ins Kette bearbeitung" #, fuzzy #~ msgid "includes substract in the chain-process" #~ msgstr "einbegriffen von abziehen ins Kette bearbeitung" #, fuzzy #~ msgid "includes vorticity in the chain-process" #~ msgstr "einbegriffen von vorticity ins Kette bearbeitung" #, fuzzy #~ msgid "display zoom index: 0:0.5, 1:0.83, 2:1.0, 3:1.3, 4:1.6, 5:2.0" #~ msgstr "Index des Zeigner zoom" #~ msgid "SCALE" #~ msgstr "Skala" #~ msgid "vector length scale" #~ msgstr "vector lange Skala" #, fuzzy #~ msgid "view the GPIV buttons of the application" #~ msgstr "Ansicht GPIV leiste des Programm" #, fuzzy #~ msgid "view the tabulator of the application" #~ msgstr "Sicht die Reiter des Programm an" #~ msgid "" #~ "Image dimensions (%dx%d) differ from \n" #~ "parameter settings (%dx%d" #~ msgstr "" #~ "Bild dimensionen (%dx%d) sind ungleich wie\n" #~ "parameter Einstellungen (%dx%d)" #~ msgid "Display" #~ msgstr "Zeigner" #~ msgid "avarage" #~ msgstr "Durchschnitt" #~ msgid "gpiv_fcreate_hdf5_image: unable to create file" #~ msgstr "gpiv_fcreate_hdf5_image: unmoglich eine Datei zum kreieren" #~ msgid "Failure calling gpiv_fwrite_pivdata" #~ msgstr "Fehler anrufung von gpiv_fwrite_pivdata" #~ msgid "Failure calling gpiv_fwrite_scdata" #~ msgstr "Fehler anrufung gpiv_fwrite_scdata" #~ msgid "file contains no image data" #~ msgstr "Datei gibt kein Bild Daten" #, fuzzy #~ msgid "failure reading image" #~ msgstr "Fehler des lesen von Bild" #~ msgid "%s: Failure calling fread_pivdata\n" #~ msgstr "%s: Fehler des anrufen fread_pivdata\n" #~ msgid "Failure calling gpiv_fread_pivdata for %s" #~ msgstr "Fehlen des anrufen gpiv_fread_pivdata fur %s" #~ msgid "?" #~ msgstr "?" #~ msgid "gpiv" #~ msgstr "GPIV" #, fuzzy #~ msgid "view the menu bar of the application" #~ msgstr "Ansicht Menuleiste des Programm" #, fuzzy #~ msgid "view the tool buttons of the application" #~ msgstr "Ansicht Werkzeugleiste des Programm" #~ msgid "Save File(s)" #~ msgstr "Speichern Datei(s)" #~ msgid "Exit gpiv" #~ msgstr "Beenden gpiv" #~ msgid "menu bar" #~ msgstr "Menuleiste" #~ msgid "show tool button bar" #~ msgstr "zeigt Werkzeugleiste" #~ msgid "Adaptive Inter." #~ msgstr "Anpassung V.Flache" #~ msgid "0.6" #~ msgstr "0.6" #~ msgid "viewer" #~ msgstr "Zeigner" #~ msgid "not connected, yet" #~ msgstr "noch nicht angeschlossen" #~ msgid "Image processing" #~ msgstr "Bild bearbeitung" #~ msgid "Image Proc" #~ msgstr "Bild Bearb." #~ msgid "Piv: image analysis" #~ msgstr "Piv: Bild Evaluierung" #~ msgid "Piv analysis" #~ msgstr "Piv Evaluierung" gpiv-0.6.1/po/nl.po0000644000175000017500000015411111076052422010775 00000000000000# DUTCH translation of gpiv. # Copyright (C) 2003 Free Software Foundation, Inc. # Gerber van der Graaf , 2003. # # msgid "" msgstr "" "Project-Id-Version: gpiv 0.5.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2008-04-09 11:38+0200\n" "PO-Revision-Date: 2008-04-16 12:38+0200\n" "Last-Translator: Gerber van der Graaf \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=iso-8859-1\n" "Content-Transfer-Encoding: 8bit" #: ../src/main.c:857 msgid "" "row_start larger than nrows; \n" "set to zero" msgstr "" "row_start groter dan nrows;\n" "op nul gezet" #: ../src/main.c:992 msgid "Image analyser for Particle Image Velocimetry" msgstr "Beeld analyseer programma voor Particle Image Velocimetry" #: ../src/main.c:1058 msgid "Trigger system not available" msgstr "Trigger systeem niet beschikbaar" #: ../src/main.c:1081 msgid "No camera connected" msgstr "Geen camra aangesloten" #: ../src/main.c:1094 #, c-format msgid "Image dimensions or depth are larger than %dx%dx%d." msgstr "Beeld afmetingen of diepte zijn groter dan %dx%d,%d." #: ../src/support.c:95 ../src/support.c:120 #, c-format msgid "Couldn't find pixmap file: %s" msgstr "Kon geen pixmap bestand vinden: %s" #: ../src/utils.c:326 msgid "January" msgstr "Januari" #: ../src/utils.c:328 msgid "February" msgstr "Februari" #: ../src/utils.c:330 msgid "March" msgstr "Maart" #: ../src/utils.c:332 msgid "April" msgstr "April" #: ../src/utils.c:334 msgid "May" msgstr "Mei" #: ../src/utils.c:336 msgid "June" msgstr "Juni" #: ../src/utils.c:338 msgid "July" msgstr "Juli" #: ../src/utils.c:340 msgid "August" msgstr "Augustus" #: ../src/utils.c:342 msgid "September" msgstr "September" #: ../src/utils.c:344 msgid "October" msgstr "Oktober" #: ../src/utils.c:346 msgid "November" msgstr "Noevmer" #: ../src/utils.c:348 msgid "December" msgstr "December" #: ../src/utils.c:350 msgid "Bad month" msgstr "Verkeerde maand" #: ../src/utils.c:352 msgid "month_name: Unvalid month" msgstr "maand_naam: foutieve naam" #: ../src/utils.c:484 #, c-format msgid "" "There are unsaved data that will be lost.\n" "Are you sure you want to close buffer #%d ?" msgstr "" "Er zijn niet-opgeslagen data welke verloren zullen gaan\n" "Weet je zeker dat je de buffer #%d wilt afsluiten?" #: ../src/console_menus.h:101 ../src/console_menus.h:185 msgid "GPIV buttons" msgstr "werkbalk" #: ../src/console_menus.h:102 ../src/console_menus.h:186 msgid "show GPIV check-buttons" msgstr "laat check-knoppen zien" #: ../src/console_menus.h:109 ../src/console_menus.h:192 msgid "tabulator" msgstr "tabbladen" #: ../src/console_menus.h:110 ../src/console_menus.h:193 msgid "show tabulator containing parameter settings" msgstr "laat tabbladen met de parameterinstellingen zien" #: ../src/console_menus.h:119 ../src/console_menus.h:200 msgid "Preferences" msgstr "Voorkeuren..." #: ../src/console_menus.h:120 msgid "Define settings of the application" msgstr "laat de instelling van het programma zien" #: ../src/console_menus.h:134 ../src/console_menus.h:214 msgid "show tooltips" msgstr "laat aanwijzingen zien" #: ../src/console_menus.h:135 ../src/console_menus.h:215 msgid "show extended information in a small pop-up window" msgstr "" "laat uitgebreide informatie (aanwijzingen) in een kleine pop-up venster zien" #: ../src/console_menus.h:142 ../src/console_menus.h:221 msgid "manual" msgstr "handleiding" #: ../src/console_interface.c:538 msgid "Open a PIV image or data-file" msgstr "Open een PIV beeld of databestand" #: ../src/console_interface.c:558 msgid "Save data" msgstr "Bewaar data" #: ../src/console_interface.c:600 msgid "Execute the enabled chain process(es)" msgstr "Voer de gemarkeerde kettingprocessen uit" #: ../src/console_interface.c:621 msgid "Cancels all running processes" msgstr "Last alle lopende processen af" #: ../src/console_interface.c:648 msgid "" "Close active buffer(s).\n" "A warning message will be issued for unsaved data" msgstr "" "Sluit actieve buffer(s).\n" "Een waarschuwing wordt gegeven voor niet opgeslagen data" #: ../src/console_interface.c:683 msgid "" "Exit GPIV.\n" "A warning message will be issued for unsaved data" msgstr "" "Sluit GPIV af\n" "Een waarschuwing wordt gegeven voor niet-opgeslagen data" #. #. * camera process button #. #: ../src/console_interface.c:801 msgid "camera" msgstr "kamera" #: ../src/console_interface.c:815 msgid "" "Enables camera for image recording within the chain process. \n" "The process will be executed by clicking the Execute button" msgstr "" "Sluit kamera aan voor het beeldopnamen in het kettingproces.\n" "Het process zal worden uitgevoerd door het drukken op de \"Uitvoer\" knop." #. #. * trigger process button #. #: ../src/console_interface.c:845 msgid "trigger" msgstr "trigger" #: ../src/console_interface.c:859 msgid "" "Enables (RTAI) camera and laser triggering within the chain process. \n" "The process will be executed by clicking the Execute button" msgstr "" "Sluit (RTAI) kamera en laser trigger aan voor het kettingprocess.\n" "Het process zal worden uitgevoerd door het drukken op de \"Uitvoer\" knop." #. #. * Image processing button #. #: ../src/console_interface.c:889 msgid "image" msgstr "beeld" #: ../src/console_interface.c:903 msgid "" "Enables image processing within the chain process. \n" "The process will be executed by clicking the Execute button" msgstr "" "Sluit beeldbewerking aan voor het beeldopnamen in het kettingproces.\n" "Het process zal worden uitgevoerd door het drukken op de \"Uitvoer\" knop." #. #. * piv process button #. #. #. * PIV activating button #. #: ../src/console_interface.c:930 ../src/piveval_interface.c:2792 msgid "piv" msgstr "piv" #: ../src/console_interface.c:944 msgid "" "Enables PIV image interrogation for chain processing: analysing of a PIV " "image (pair), resulting into the mean displacements of the particle images " "within each interrogation area. \n" "The process will be executed by clicking the Execute button" msgstr "" "Sluit PIV analyse aan voor het kettingprocess: de analyse van een PIV beeld" "(paar), welke resulteerd in de gemiddelde verplaatsing van de deeltjes " "binnen ieder onderzoeks gebiedje. \n" "Het process wordt uitgevoerd door het drukken op de Uitvoer knop" #: ../src/console_interface.c:972 msgid "gradient" msgstr "gradient" #: ../src/console_interface.c:986 msgid "" "Enables gradient for chain processing: Disables velocities with gradients " "larger than 0.05 over the interrogation area. \n" "The process will be executed by clicking the \"Execute\" button" msgstr "" "Markeer gradient voor het kettingprocess: Sluit snelheden uit met een " "gradient groter dan 0.005 over het onderzoeksgebiedje.\n" "Het process zal worden uitgevoerd door het drukken op de Uitvoer knop." #: ../src/console_interface.c:1012 ../src/pivvalid_interface.c:618 msgid "residu" msgstr "residu" #: ../src/console_interface.c:1026 msgid "" "Enables residu statistics for chain processing: calculates the residus of " "displacements for detection of outliers and shows an histogram of them. The " "histogram will be displayed in the Piv Validation tab. \n" "The process will be executed by clicking the Execute button" msgstr "" "Markeer residu stats voor het kettingprocess: berekend de residuen in PIV " "data voor het vinden van uitschieters en laat een histogram er van zien.\n" "Het process zal worden uitgevoerd door het drukken op de Uitvoer knop." #: ../src/console_interface.c:1054 msgid "validate" msgstr "valideer" #: ../src/console_interface.c:1068 msgid "" "Enables validation for chain processing: detects outliers of PIV data by " "testing on median residu or by Signal to Noise Ratio magnitudes and, " "eventually, substitutes. \n" "The process will be executed by clicking the Execute button" msgstr "" "Markeer valideer voor het kettingprocess: vind uitschieters in PIV data door " "het testen op de mediaan residu of op de grootte van de Signaal Ruis " "verhouding (SNR) en, indien mogelijk, vervangt deze.\n" "Het process zal worden uitgevoerd door het drukken op de Uitvoer knop" #: ../src/console_interface.c:1095 ../src/pivvalid_interface.c:654 msgid "sub-pixel" msgstr "sub-pixel" #: ../src/console_interface.c:1109 msgid "" "Enables peak-lock for chain processing: shows an histogram of sub-pixel " "displacements to check on peak-locking effects. The histogram will be " "displayed in the Piv Validation tab. \n" "The process will be executed by clicking the \"Execute\" button" msgstr "" "Markeer peaklock process voor het kettingprocess: laat een histogram zien " "van verplaatsingen op sub-pixel niveau. Nodig voor het controleren op peak " "locking effecten.\n" "Het process zal worden uitgevoerd door het drukken op de Uitvoer knop" #: ../src/console_interface.c:1136 ../src/pivpost_interface.c:479 msgid "scale" msgstr "schaal" #: ../src/console_interface.c:1149 msgid "" "Enables scaling for chain processing: scales spatial displacements over all " "data. \n" "The process will be executed by clicking the \"Execute\" button" msgstr "" "Markeer schaling voor het kettingprocess: schaal de ruimtelijke " "verplaatsingen van alle data.\n" "Het process zal worden uitgevoerd door het drukken op de \"Uitvoer\" knop." #. #. * end of KEEP DISABLED #. #. #. * button to calculate averages #. #: ../src/console_interface.c:1175 ../src/pivpost_interface.c:698 msgid "average" msgstr "gemiddelde" #: ../src/console_interface.c:1188 msgid "" "Enables average for chain processing: Calculates spatial average " "displacements over all data. \n" "The process will be executed by clicking the \"Execute\" button" msgstr "" "Markeer gemiddelde voor het kettingprocess: Berekend ruimtelijk gemiddelde " "van alle data.\n" "Het process zal worden uitgevoerd door het drukken op de Uitvoer knop." #. #. * button to subtract averages or zero offset displacements / velocities #. #: ../src/console_interface.c:1214 ../src/pivpost_interface.c:740 msgid "subtract" msgstr "trek af" #: ../src/console_interface.c:1228 msgid "" "Enables subtract for chain processing: subtracts spatial average " "displacements from all data. \n" "The process will be executed by clicking the \"Execute\" button" msgstr "" "Markeer aftrekken voor het kettingprocess: Trek de gemiddelde ruimtelijke " "verplaatsing af van alle data.\n" "Het process zal worden uitgevoerd door het drukken op de Uitvoer knop." #: ../src/console_interface.c:1254 ../src/pivpost_interface.c:1219 msgid "vorticity" msgstr "vorticiteit" #: ../src/console_interface.c:1268 msgid "" "Enables vorticity for chain processing: calculates vorticity or strain " "magnitudes from a velocity field.\n" "The process will be executed by clicking the Execute button" msgstr "" "Markeer vorticiteit voor het kettingprocess: berekend vorticiteit of " "afschuiving uit een snelheidsveld.\n" "Het process zal worden uitgevoerd door het drukken op de Uitvoer knop." #: ../src/console_interface.c:1336 msgid "Record" msgstr "Opnemen" #: ../src/console_interface.c:1357 msgid "Image" msgstr "Beeld" #: ../src/console_interface.c:1385 msgid "Process" msgstr "Uitvoeren" #: ../src/console_interface.c:1417 msgid "Interrogate" msgstr "Onderzoeken" #: ../src/console_interface.c:1513 msgid "Validate" msgstr "valideer" #. gtk_object_set_data (GTK_OBJECT (gpiv->console), #. "gpiv", #. gpiv); #: ../src/console_interface.c:1610 msgid "Post process" msgstr "Nabewerking" #: ../src/console_interface.c:1694 msgid "buffer names and numbers" msgstr "buffer namen en nummers" #: ../src/console_interface.c:1792 msgid "buffer list" msgstr "buffer lijst" #: ../src/console_interface.c:1813 msgid "#" msgstr "#" #: ../src/console_interface.c:1825 msgid "buffer name" msgstr "buffer naam" #: ../src/console.c:846 msgid "cancel_process = TRUE" msgstr "cancel_process = TRUE" #: ../src/console.c:857 msgid "cancel_process = FALSE" msgstr "cancel_process = FALSE" #: ../src/console.c:1199 msgid "Opens image/PIV data (and display)" msgstr "Open beeld/PIV data (en viewer)" #: ../src/console.c:1213 msgid "Saves data" msgstr "Bewaar data" #: ../src/console.c:1227 msgid "Prints selected buffer(s)" msgstr "Sluit actieve buffer(s) af" #: ../src/console.c:1241 msgid "Executes all tickmarked processes" msgstr "Voer alle gemarkeerde processen uit" #: ../src/console.c:1255 msgid "Cancels any running processes" msgstr "Stopt ieder lopend proces" #: ../src/console.c:1269 msgid "Close active buffer(s)" msgstr "Sluit actieve buffer(s) af" #: ../src/console.c:1283 msgid "Exits GPIV" msgstr "Sluit GPIV af" #: ../src/imgh_interface.c:113 msgid "Image information and settings" msgstr "Beeld deformatie en instellingen" #: ../src/imgh_interface.c:212 msgid "buffer #: " msgstr "buffer nummer" #: ../src/imgh_interface.c:261 msgid "file: " msgstr "bestand:" #. viewport_imgh #. #. * label for correlation #. #: ../src/imgh_interface.c:310 msgid "correlation type: " msgstr "correlatie type:" #. #. * label for ncols #. #: ../src/imgh_interface.c:352 msgid "number of columns (pixels): " msgstr "aantal colommen (pixels): " #. #. * label for nrows #. #: ../src/imgh_interface.c:394 msgid "number of rows (pixels): " msgstr "aantal regels (pixels): " #. #. * label for depth #. #: ../src/imgh_interface.c:438 msgid "image depth (bits): " msgstr "beeld diepte (bits):" #. #. * frame, table and spinners for spatial scale "sscale" #. * #. * radio buttons and spinners defining spatial scale interactively #. * with pointer in image #. #: ../src/imgh_interface.c:485 msgid "Define spatial scale" msgstr "ruimtelijke schaal: " #: ../src/imgh_interface.c:542 ../src/piveval_interface.c:1367 #: ../src/piveval_interface.c:1670 ../src/pivvalid_interface.c:223 #: ../src/display_menus.h:131 ../src/display_interface.c:619 msgid "None" msgstr "Geen" #: ../src/imgh_interface.c:580 msgid "Spanned length" msgstr "Overspannen lengte" #: ../src/imgh_interface.c:617 msgid "Vertical spanned length" msgstr "Vertikaal overspannen lengte" #: ../src/imgh_interface.c:655 msgid "Horizontal spanned length" msgstr "Horizontaal overspannen lengte" #: ../src/imgh_interface.c:692 msgid "span (pixels): " msgstr "span (pixels):" #: ../src/imgh_interface.c:752 msgid "length (mm): " msgstr "lengte (mm):" #. #. * spinner for spatial scale "sscale" #. #. #. *spinner for spatial scale "sscale" #. #: ../src/imgh_interface.c:815 ../src/pivpost_interface.c:221 msgid "spatial scale (mm/pixels): " msgstr "ruimtelijke schaal (mm/pixels): " #. #. * spinner for time scale "tscale" #. #. #. *spinner for time scale "tscale" #. #: ../src/imgh_interface.c:878 ../src/pivpost_interface.c:285 msgid "time scale (ms): " msgstr "tijdsschaal (ms): " #. #. * spinner for column position #. #: ../src/imgh_interface.c:957 msgid "position of column #0 (m): " msgstr "plaats van colom #0 (m): " #. #. * spinner for row position #. #: ../src/imgh_interface.c:1022 msgid "position of row #0 (m): " msgstr "plaats van regel #0 (m): " #. #. * entry for project #. #: ../src/imgh_interface.c:1086 msgid "Title: " msgstr "Titel: " #. #. * entry for creation date #. #: ../src/imgh_interface.c:1142 msgid "Creation date: " msgstr "Aanmaak datum:" #. #. * entry for location #. #: ../src/imgh_interface.c:1201 msgid "Place: " msgstr "Plaats:" #. #. * entry for author #. #: ../src/imgh_interface.c:1254 msgid "Author: " msgstr "Auteur:" #. #. * entry for software #. #: ../src/imgh_interface.c:1307 msgid "Software: " msgstr "Programmatuur: " #. #. * entry for source #. #: ../src/imgh_interface.c:1360 msgid "Source: " msgstr "Bron: " #. #. * entry for usertext #. #: ../src/imgh_interface.c:1413 msgid "Usertext: " msgstr "Gebruikerstekst: " #. #. * entry for warning #. #: ../src/imgh_interface.c:1466 msgid "Warning: " msgstr "Waarschuwing: " #. #. * entry for disclaimer #. #: ../src/imgh_interface.c:1519 msgid "Disclaimer: " msgstr "Uitsluitsel:" #. #. * entry for comment #. #: ../src/imgh_interface.c:1572 msgid "Comment: " msgstr "Commentaar:" #. #. * entry for copyright #. #: ../src/imgh_interface.c:1625 msgid "Copyright: " msgstr "Kopieerrecht:" #. #. * entry for email #. #: ../src/imgh_interface.c:1678 msgid "Email: " msgstr "Email" #. #. * entry for url #. #: ../src/imgh_interface.c:1731 msgid "Url: " msgstr "Url:" #: ../src/imgh.c:85 msgid "No action" msgstr "Geen actie" #: ../src/imgh.c:99 msgid "Points the length spanned by a ruler in the image" msgstr "Wijst de overspannen lengte aan van een lineaal in het beeld" #: ../src/imgh.c:113 msgid "Points the vertical length by a ruler in the image" msgstr "Wijst de vertikaal overspannen lengte aan van een lineaal in het beeld" #: ../src/imgh.c:128 msgid "Points the horizontal length by a ruler in the image" msgstr "" "Wijst de horizontaal overspannen lengte aan van een lineaal in het beeld" #: ../src/piveval_interface.c:134 msgid "Piv image interrogation" msgstr "Piv: beeld interrogatie" #: ../src/piveval_interface.c:235 msgid "first col:" msgstr "eerste col:" #: ../src/piveval_interface.c:255 msgid "last col:" msgstr "laatste col:" #: ../src/piveval_interface.c:275 msgid "pre-shift col:" msgstr "voorversch. col:" #: ../src/piveval_interface.c:295 msgid "first row:" msgstr "eerste regel:" #: ../src/piveval_interface.c:315 msgid "last row:" msgstr "laatste regel:" #: ../src/piveval_interface.c:335 msgid "pre-shift row:" msgstr "voorversch. regel:" #: ../src/piveval_interface.c:640 msgid "Final Int Size" msgstr "Ond. afm. eind" #. VECTOR_SCALE_3 #: ../src/piveval_interface.c:732 ../src/piveval_interface.c:961 #: ../src/piveval_interface.c:1197 ../src/display_menus.h:158 msgid "16" msgstr "16" #. VECTOR_SCALE_4 #: ../src/piveval_interface.c:766 ../src/piveval_interface.c:995 #: ../src/piveval_interface.c:1231 ../src/display_menus.h:160 msgid "32" msgstr "32" #. VECTOR_SCALE_5 #: ../src/piveval_interface.c:800 ../src/piveval_interface.c:1029 #: ../src/piveval_interface.c:1265 ../src/display_menus.h:162 msgid "64" msgstr "64" #. VECTOR_SCALE_6 #: ../src/piveval_interface.c:834 ../src/piveval_interface.c:1062 #: ../src/piveval_interface.c:1299 ../src/display_menus.h:164 msgid "128" msgstr "128" #. #. * radio buttons for interrogation size 2 #. #: ../src/piveval_interface.c:869 msgid "Initial Int Size" msgstr "Ond. afm. start" #. #. * radio buttons for shifted distance of interrogation areas #. #: ../src/piveval_interface.c:1097 msgid "Shift" msgstr "Verplaatsing" #. VECTOR_SCALE_2 #: ../src/piveval_interface.c:1162 ../src/display_menus.h:156 msgid "8" msgstr "8" #. #. * radio button for mouse selecting #. #: ../src/piveval_interface.c:1334 msgid "Mouse select" msgstr "Muis selectie" #: ../src/piveval_interface.c:1405 msgid "Area" msgstr "Gebied" #: ../src/piveval_interface.c:1443 msgid "Single int." msgstr "Enkel gebied" #: ../src/piveval_interface.c:1482 msgid "Single point" msgstr "Enkel punt" #: ../src/piveval_interface.c:1521 msgid "Drag int." msgstr "Verschuif gebied" #: ../src/piveval_interface.c:1560 msgid "Vert. Line" msgstr "Vert. lijn" #: ../src/piveval_interface.c:1598 msgid "Hor. Line" msgstr "Hor. lijn" #. #. * radio buttons for sub-pixel interpolation scheme #. #: ../src/piveval_interface.c:1637 msgid "Sub-pixel Interpolation" msgstr "Sub-pixel Interpolatie" #: ../src/piveval_interface.c:1712 msgid "Gauss" msgstr "Gauss" #: ../src/piveval_interface.c:1754 msgid "Power" msgstr "Macht" #: ../src/piveval_interface.c:1796 msgid "Gravity" msgstr "Zwaartepunt" #. eval->radiobutton_fit_marquardt = gtk_radio_button_new_with_label (eval->vbox10_group, #. _("Marquardt")); #. eval->vbox10_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_fit_marquardt)); #. gtk_widget_ref (eval->radiobutton_fit_marquardt); #. gtk_object_set_data_full (GTK_OBJECT (main_window), #. "radiobutton_fit_marquardt", #. eval->radiobutton_fit_marquardt, #. (GtkDestroyNotify) gtk_widget_unref); #. gtk_widget_show (eval->radiobutton_fit_marquardt); #. gtk_box_pack_start (GTK_BOX (eval->vbox10), #. eval->radiobutton_fit_marquardt, #. FALSE, #. FALSE, #. 0); #. gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_marquardt), #. "ifit", #. "4"); #. gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_marquardt), #. "eval", #. eval); #. gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_marquardt), #. "var_type", #. "0"); #. g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_marquardt), #. "toggled", #. G_CALLBACK (on_toggle_piv), #. NULL); #. #. * radio buttons for correlation peak number to be detected #. #: ../src/piveval_interface.c:1870 msgid "Peak #" msgstr "Top #" #: ../src/piveval_interface.c:1901 ../src/display_menus.h:150 msgid "1" msgstr "1" #. VECTOR_SCALE_0 #: ../src/piveval_interface.c:1942 ../src/display_menus.h:152 msgid "2" msgstr "2" #: ../src/piveval_interface.c:1983 msgid "3" msgstr "3" #. #. * additonal calculation schemes for correlation detection #. #: ../src/piveval_interface.c:2025 msgid "Interrogation scheme" msgstr "Interrogatie schema" #: ../src/piveval_interface.c:2061 msgid "Image deformation" msgstr "Beeld deformatie: " #: ../src/piveval_interface.c:2103 msgid "Central differential" msgstr "Centraal differentiaal" #: ../src/piveval_interface.c:2144 msgid "Zero offset" msgstr "Nul verschuiving" #: ../src/piveval_interface.c:2185 msgid "Weight Kernel" msgstr "Weegfactor" #. #. * radio buttons for cross-or auto correlation #. * defined in image header, not user definable #. #. #. * Gnome canvas display corr function #. #: ../src/piveval_interface.c:2229 ../src/piveval_interface.c:2537 msgid "Correlation" msgstr "Correlatie" #: ../src/piveval_interface.c:2262 msgid "Auto" msgstr "Auto" #: ../src/piveval_interface.c:2295 msgid "Cross" msgstr "Kruis" # Gauss wegen #: ../src/piveval_interface.c:2329 msgid "Gauss weighting" msgstr "Gauss weging" #: ../src/piveval_interface.c:2364 msgid "SPOF filtering" msgstr "SPOF fileteren" #: ../src/piveval_interface.c:2400 msgid "Interrogation areas and correlation" msgstr "Onderzoeksgebieden en correlatie" #. #. * gnome canvas interrogation area1 #. #: ../src/piveval_interface.c:2435 msgid "Int. area 1" msgstr "Ond. gebied 1" #. #. * gnome canvas interrogation area2 #. #: ../src/piveval_interface.c:2484 msgid "Int. area 2" msgstr "Ond. gebied 2" #. #. * gnome canvas display values #. #: ../src/piveval_interface.c:2585 msgid "Estimator" msgstr "Schatter" #: ../src/piveval_interface.c:2650 msgid "Monitor" msgstr "Bewaak" #. #. * spinner for zoom #. #: ../src/piveval_interface.c:2684 msgid "Zoom:" msgstr "Vergrooting:" #. #. * spinner for vector length #. #: ../src/piveval_interface.c:2738 msgid "Vector scale:" msgstr "Vektor schaal" #: ../src/piveval_interface.c:2811 msgid "" "Interrogates a PIV image (pair) resulting into estimators of the mean " "displacement of the particle images within each interrogation area" msgstr "" "analyseerd een PIV beeld(paar) resulterend in een gemiddelde verplaatsing \n" "van de deeltjes-beelden binnen een onderzoeksgebiedje" #: ../src/piveval.c:598 #, c-format msgid "" "Image deformation is impossibe with this Mouse select.\n" "Setting Interrogation scheme to Central difference.\n" "This will be reset automatically after interrogating." msgstr "" "Beeld deformatie is onmogelijk met deze Muis selectie.\n" "Instelling Interrogatie schema naar Centraal differentiatie.\n" "Deze zal automatisch worden hersteld." #: ../src/piveval.c:626 ../src/pivvalid.c:572 msgid "No mouse activity within displayer" msgstr "Geen muis activiteit binnen de display window" #: ../src/piveval.c:640 msgid "Selects an area within the image to be analyzed" msgstr "Selecteer een gebied binnen het beeld om te analyseren" #: ../src/piveval.c:654 msgid "" "Piv evaluation at a single interrogation area. Conserves other existing data" msgstr "" "Piv berekening in een enkel onderzoeksgebiedje. Bewaard andere bestaande data" #: ../src/piveval.c:669 msgid "" "Piv evaluation at a single point in the image. Rejects all existing data!!" msgstr "" "Piv berekening in een enkel onderzoeks gebiedje. Gooit bestaande data weg!!" #: ../src/piveval.c:684 msgid "Displaces a single interrogation area and analyzes" msgstr "Verplaats een enkel onderzoeksgebiedje en analyseerd" #: ../src/piveval.c:698 msgid "Evaluation at a vertical line. " msgstr "Evaluatie op een vertikale line" #: ../src/piveval.c:712 msgid "Evaluation at a horizontal line. " msgstr "Evaluatie op een horizontale lijn" #: ../src/piveval.c:805 #, c-format msgid "" "Int Size 2 > Int Size 1 \n" "Setting Interrogation scheme to Image deformation" msgstr "" "Int Size 2 > Int Size 1 \n" "Instelling Interrogatie schema naar Beeld deformatie" #: ../src/piveval.c:1102 msgid "Interpolation scheme for sub-pixel estimation" msgstr "Interpolatie schema voor sub-pixel schatting" #: ../src/piveval.c:1117 msgid "Chooses n-th highest top number of correlation as estimator" msgstr "Kies de n-de hoogste top van de correlatie als schatter" #: ../src/piveval.c:1132 msgid "Bias correction scheme" msgstr "Bias correctie schema" #: ../src/piveval.c:1147 msgid "Deforms image from PIV estimators" msgstr "Deformeerd een beeld aan de hand van PIV schatters" #: ../src/piveval.c:1205 msgid "Gauss weighting on the Interrogation Area" msgstr "Gauss weging van een Interrogatie Gebiedje" #: ../src/piveval.c:1237 msgid "Symmetric Phase Only Filtering on the FT images" msgstr "Alleen Symetrisch Fase filteren op FT beelden" #: ../src/piveval.c:1346 msgid "Displays subimages, correlation function and PIV vector" msgstr "Plot onderzoeksgebiedjes, correlatie functie en PIV vector" #: ../src/piveval.c:1582 msgid "Analyses a PIV image (pair)" msgstr "Analyseer een PIV beeld(paar)" #: ../src/pivvalid_interface.c:102 msgid "Piv data validation" msgstr "Piv data validatie" #. #. * Enable / Disable frame #. #: ../src/pivvalid_interface.c:187 msgid "Disable data" msgstr "Sluit data af" #: ../src/pivvalid_interface.c:265 msgid "Enable point" msgstr "Sluit punt aan" #: ../src/pivvalid_interface.c:304 msgid "Disable point" msgstr "Sluit punt af" #: ../src/pivvalid_interface.c:343 msgid "Enable area" msgstr "Sluit gebied aan" #: ../src/pivvalid_interface.c:382 msgid "Disable area" msgstr "Sluit gebied af" #: ../src/pivvalid_interface.c:423 msgid "validate on velocity gradient " msgstr "valideer a.h.v. snelheidsgradient" #: ../src/pivvalid_interface.c:443 msgid "" "Disables PIV data that have a too large velocity gradient over the " "Interrogation Area" msgstr "" "Sluit PIV data buiten die een te hoge snelheidsgradient over een \n" "onderzoeksgebiedje hebben" #. #. * Frame for histogram of sub-pixel values (used to test on peak-locking #. * effect) #. #: ../src/pivvalid_interface.c:471 msgid "Histograms" msgstr "Histogrammen" #: ../src/pivvalid_interface.c:522 msgid "# bins: " msgstr "# bins" #: ../src/pivvalid_interface.c:632 msgid "calculates residus of displacements and displays in a histogram" msgstr "Berekend residuen van verplaatsingen en plot een histogram" #: ../src/pivvalid_interface.c:668 msgid "" "shows histogram of sub-pixel displacements to check on peak-locking effects" msgstr "" "plot een histogram van sub-pixel verplaatsingen om te controleren op peak-" "locking" #: ../src/pivvalid_interface.c:691 msgid "U-comp" msgstr "U-comp" #: ../src/pivvalid_interface.c:705 msgid "" "shows histogram of horizontal displacements.\n" "Only this histogram will be saved" msgstr "" "Laat een histogram van horizontale verplaatsingen zien.\n" "Alleen dit histogram zal worden opgeslagen" #: ../src/pivvalid_interface.c:727 msgid "V-comp" msgstr "V-comp" #: ../src/pivvalid_interface.c:741 msgid "" "shows histogram of vertical displacements.\n" "Only this histogram will be saved" msgstr "" "Laat een histogram van verticale verplaatsingen zien.\n" "Alleen de getoonde histagram zal worden opgeslagen" #. #. * Errvec frame #. #: ../src/pivvalid_interface.c:767 msgid "Outliers" msgstr "Uitschieters" #: ../src/pivvalid_interface.c:820 msgid "Neighbors: " msgstr "Buren: " #: ../src/pivvalid_interface.c:888 msgid "Data yield: " msgstr "Data opbrengst" #: ../src/pivvalid_interface.c:955 msgid "Threshold: " msgstr "Drempel" #: ../src/pivvalid_interface.c:1005 msgid "Show SNR values" msgstr "Laat SNR waarden zien" #: ../src/pivvalid_interface.c:1042 msgid "Residu type:" msgstr "Residu type:" #: ../src/pivvalid_interface.c:1074 msgid "Normalized median" msgstr "Genormaliseerde mediaan" #: ../src/pivvalid_interface.c:1118 ../src/pivvalid_interface.c:1340 msgid "Median" msgstr "Mediaan" #: ../src/pivvalid_interface.c:1162 msgid "Snr" msgstr "Snr" #. #. * A long time ago, the GtkWidget valid->button_errvec_resstats was *here*. #. * Though it felt in love with valid->button_peaklock. #. * Now they are living happily cheeck tot cheeck. #. * No, they haven't got child widgets, yet. But maybe, one day ... #. #. #. * Radio buttons for substitution type #. #: ../src/pivvalid_interface.c:1216 msgid "Substituted by:" msgstr "Vervangen door:" #: ../src/pivvalid_interface.c:1249 msgid "Nothing" msgstr "Geen actie" #: ../src/pivvalid_interface.c:1297 msgid "Mean of surroundings" msgstr "Gemiddelde van omliggenden" #: ../src/pivvalid_interface.c:1384 msgid "Next highest corr. peak" msgstr "Volgende hoogste corr. piek" #: ../src/pivvalid_interface.c:1428 msgid "validate on outliers" msgstr "valideer uitschieters" #: ../src/pivvalid_interface.c:1442 msgid "substitutes outliers" msgstr "vervang uitschieters" #: ../src/pivvalid.c:105 ../src/pivvalid.c:287 ../src/pivvalid.c:390 #: ../src/pivvalid.c:507 ../src/pivpost.c:144 ../src/pivpost.c:248 #: ../src/pivpost.c:355 ../src/pivpost.c:587 msgid "no PIV data" msgstr "geen PIV data" #: ../src/pivvalid.c:526 msgid "Examines PIV data on velocity gradients" msgstr "Onderzoek PIV data op snelheidsgradienten" #: ../src/pivvalid.c:587 msgid "Enables a single PIV data-point" msgstr "Sluit een enkel PIV punt aan" #: ../src/pivvalid.c:602 msgid "Disables a single PIV data-point" msgstr "Sluit een enkel PIV punt af" #: ../src/pivvalid.c:617 msgid "Enables an area containing PIV data" msgstr "Sluit een gebied met PIV data aan" #: ../src/pivvalid.c:632 msgid "Disables an area containing PIV data" msgstr "Sluit een gebied met PIV data af" #: ../src/pivvalid.c:660 msgid "Defines residu type to examine data on" msgstr "Bepaal het type residu waarmee de data moeten worden beoordeeld" #: ../src/pivvalid.c:687 msgid "Displays inverse cumulative histogram of residus" msgstr "Plot een inverse cumulatief histogram van residuen" #: ../src/pivvalid.c:776 msgid "Display PIV vector colors related to residu or SNR value" msgstr "" "Plot PIV vektoren in de kleuren welke gerelateerd zijn aan de SNR waarde" #: ../src/pivvalid.c:815 msgid "Only sets peak_no (flag) to zero" msgstr "Zet alleen peak_no (vlag) op nul" #: ../src/pivvalid.c:817 msgid "mean from surroundings" msgstr "gemiddelde van omliggenden" #: ../src/pivvalid.c:819 msgid "Median (middle value) from surroundings" msgstr "Mediaan (middelste) van omliggenden" #: ../src/pivvalid.c:821 msgid "Re-interrogates and uses next corr. peak as estimator" msgstr "Her-interrogeerd en gebruikt volgende corr. piek als schatter" #: ../src/pivvalid.c:852 msgid "Examines PIV data on outliers and substitutes" msgstr "Onderzoek de PIV data op uitschieters en vervang" #: ../src/pivvalid.c:914 msgid "Calculates a histogram of sub-pixel displacements" msgstr "Berekent een histogram van sub-pixel verplaatsingen." #: ../src/pivvalid.c:961 msgid "Calculates a histogram of horizontal displacements." msgstr "Berekent een histogram van horizontale verplaatsingen." #: ../src/pivvalid.c:1008 msgid "Calculates a histogram of vertical displacements." msgstr "Berekent een histogram van verikale verplaatsingen." #: ../src/pivpost_interface.c:98 msgid "Piv data post processing" msgstr "Piv data post precessing" #. #. * Scale frame #. #. #. * Spinners use the adjustment from spinbutton_adj_imgh_* #. #: ../src/pivpost_interface.c:185 msgid "Scaling" msgstr "Schaling" #. #. * spinner for column position #. #: ../src/pivpost_interface.c:350 msgid "pos. of col #0 (m): " msgstr "plaats van colom #0 (m): " #. #. * spinner for row position #. #: ../src/pivpost_interface.c:416 msgid "pos. of row #0 (m): " msgstr "plaats van regel #0 (m): " #: ../src/pivpost_interface.c:498 msgid "" "Calculates time and spatial scaled particle displacements (i.e. velocities) " "from a PIV displacement field, and their scaled positions" msgstr "" "Berekend de ruimte-en tijdsgeschaalde deeltjesverplaatsingen (d.w.z " "snelheden)\n" "van een PIV verplaatsingsveld, en de bijbehorende lokaties." #. #. * Spatial average frame #. #: ../src/pivpost_interface.c:525 msgid "Offset / Spatial statistics" msgstr "Offset / Ruimtelijke statistiek" #. #. *spinner for spatial average horizontal velocity U-avg #. #: ../src/pivpost_interface.c:561 msgid "dx (px), U (m/s): " msgstr "dx (px), U (m/s): " #. #. * end of KEEP DISABLED #. #. #. * spinner for spatial average vertical velocity V-avg #. #: ../src/pivpost_interface.c:633 msgid "dy (px), V (m/s): " msgstr "dy (px), V (m/s): " #: ../src/pivpost_interface.c:716 msgid "" "Calculates spatial average particle displacements or velocities from a " "velocity field, obtained from PIV data" msgstr "" "Berekend ruimtelijk gemiddelde verplaatsingen of snelheden van een \n" "snelheidsveld, verkregen van PIV data." #: ../src/pivpost_interface.c:759 msgid "" "Subtracts the spatial averages or offset displacements / velocities, from " "each estimator" msgstr "" "Trek ruimtelijk gemidelde, of de zelf ingevoerde verplaatsing / snelheid, af " "van iedere schatter" #. #. * Vorstra frame #. #: ../src/pivpost_interface.c:783 msgid "Vorticity & strain" msgstr "Vorticiteit en afschuiving" #: ../src/pivpost_interface.c:816 msgid "Output:" msgstr "Resultaat" #: ../src/pivpost_interface.c:848 ../src/display_menus.h:134 #: ../src/display_interface.c:635 msgid "Vorticity" msgstr "Vorticiteit" #: ../src/pivpost_interface.c:889 ../src/display_menus.h:137 #: ../src/display_interface.c:650 msgid "Shear strain" msgstr "Afschuiving" #: ../src/pivpost_interface.c:930 ../src/display_menus.h:140 #: ../src/display_interface.c:666 msgid "Normal strain" msgstr "Druk" #: ../src/pivpost_interface.c:968 msgid "Differential scheme:" msgstr "Differentiaal schema" #: ../src/pivpost_interface.c:1002 msgid "Central" msgstr "Centraal" #: ../src/pivpost_interface.c:1043 msgid "Least squares" msgstr "Kleinste kwadraten" #: ../src/pivpost_interface.c:1085 msgid "Richardson" msgstr "Richardson" #: ../src/pivpost_interface.c:1135 msgid "Circulation method" msgstr "Circulatie methode" #: ../src/pivpost_interface.c:1233 msgid "" "Calculates vorticity or strain magnitudes from a velocity field, obtained by " "PIV" msgstr "" "Berekend vorticiteit of afschuiving uit een snelheidsveld, verkregen met " "behulp van PIV" #: ../src/pivpost.c:118 msgid "exec_scale: Failure calling gpiv_post_scale" msgstr "exec_scale: Gefaald in het aanroepen van gpiv_post_scale" #: ../src/pivpost.c:582 msgid "exec_vorstra: non valid operation" msgstr "exec_vorstra: geen geldige uitvoering" #: ../src/pivpost.c:671 msgid "on_spinbutton_post_scale: should not arrive here" msgstr "on_spinbutton_post_scale: zou niet hier mogen komen" #: ../src/pivpost.c:686 msgid "Calculates scaled locations and velocities" msgstr "Bereken geschaalde plaatsen en snelheden" #: ../src/pivpost.c:760 msgid "Calculates spatial average displacements" msgstr "Berekend ruimtelijk gemiddelde verplaatsingen/snelheden" #: ../src/pivpost.c:805 msgid "Subtracts mean displacements / offset values from PIV data" msgstr "Trek gemiddelde verplaatsingen /offset waarden van de PIV data af" #: ../src/pivpost.c:850 msgid "Selects the differential quantity" msgstr "Selecteer de differentiaal grootheid" #: ../src/pivpost.c:894 msgid "Selects the type of differential scheme" msgstr "Kies het type differentiaal schema" #: ../src/pivpost.c:923 msgid "Calculates differential quantity" msgstr "Bereken de differentiaal grootheid" #: ../src/display_menus.h:71 msgid "0.25" msgstr "0.25" #: ../src/display_menus.h:73 msgid "0.5" msgstr "0.5" #: ../src/display_menus.h:75 msgid "0.83" msgstr "0.83" #: ../src/display_menus.h:77 msgid "1.0" msgstr "1.0" #: ../src/display_menus.h:79 msgid "1.3" msgstr "1.3" #: ../src/display_menus.h:81 msgid "1.6" msgstr "1.6" #: ../src/display_menus.h:83 msgid "2.0" msgstr "2.0" #: ../src/display_menus.h:85 msgid "4.0" msgstr "4.0" #: ../src/display_menus.h:94 msgid "Blue background" msgstr "Blauwe achtergrond" #: ../src/display_menus.h:97 msgid "Black background" msgstr "Zwarte achtergrond" #: ../src/display_menus.h:100 msgid "Image A" msgstr "Beeld A" #: ../src/display_menus.h:103 msgid "Image B" msgstr "Beeld B" #: ../src/display_menus.h:121 ../src/display_interface.c:585 msgid "Interrogation area's" msgstr "Onderzoeksgebiedjes" #: ../src/display_menus.h:123 ../src/display_interface.c:595 msgid "Velocity vectors" msgstr "Snelheidsvektoren" #. VECTOR_SCALE_1 #: ../src/display_menus.h:154 msgid "4" msgstr "4" #. VECTOR_SCALE_7 #: ../src/display_menus.h:166 msgid "256" msgstr "256" #: ../src/display_menus.h:176 msgid "Peak nr" msgstr "Top #" #: ../src/display_menus.h:178 msgid "SNR" msgstr "SNR" #: ../src/display_menus.h:180 msgid "Magnitude gray" msgstr "Grootte grijs" #: ../src/display_menus.h:182 msgid "Magnitude color" msgstr "Grootte kleur" #: ../src/display_menus.h:224 msgid "View menubar" msgstr "Laat menubalk zien" #: ../src/display_menus.h:224 msgid "Displays menubar in window" msgstr "Laat de menubar in de window zien" #: ../src/display_menus.h:226 ../src/display_interface.c:394 msgid "View rulers" msgstr "Laat linealen zien" #: ../src/display_menus.h:226 msgid "Displays rulers in window" msgstr "Laat de linealen in de window zien" #: ../src/display_menus.h:228 ../src/display_interface.c:406 msgid "Stretch auto" msgstr "Strek venster uit" #: ../src/display_menus.h:228 msgid "Stretch display automatic when zooming" msgstr "Strek display automatisch gedurende in- en uitzoomen" #: ../src/display_menus.h:230 ../src/display_interface.c:418 msgid "Stretch display" msgstr "Strek venster uit" #: ../src/display_menus.h:231 ../src/display_interface.c:424 msgid "Stretch or fit display window to the image area" msgstr "" "Strek plotvenster uit of pas aan tot de afmetingen van het beeldoppervlak" #: ../src/display_menus.h:233 msgid "Zoom in/out" msgstr "Vergroot/verklein" #: ../src/display_menus.h:235 msgid "View background" msgstr "Toon achtergrond" #: ../src/display_menus.h:237 msgid "View piv data" msgstr "toon de piv data" #: ../src/display_menus.h:238 msgid "View scalar data" msgstr "Toon de scalaire data" #: ../src/display_menus.h:240 msgid "Vector scale" msgstr "Vektor schaal" #: ../src/display_menus.h:241 msgid "Vector color" msgstr "Vektor kleur" #: ../src/display_interface.c:364 msgid "_View" msgstr "_Laat zien" #: ../src/display_interface.c:383 msgid "View menu bar" msgstr "Laat menubalk zien" #: ../src/display_interface.c:454 msgid "set zoom factor" msgstr "definieer de vergotingsfactor" #: ../src/display_interface.c:477 msgid "_Background" msgstr "_Achtergrond" #: ../src/display_interface.c:491 msgid "Blue" msgstr "Blauw" #: ../src/display_interface.c:499 msgid "set blue background" msgstr "zet blauwe achtergrond" #: ../src/display_interface.c:511 msgid "Black" msgstr "Zwart" #: ../src/display_interface.c:519 msgid "set black background" msgstr "zet zwarte achtergrond" #: ../src/display_interface.c:531 msgid "Image_A" msgstr "Beeld A" #: ../src/display_interface.c:539 msgid "set first image as background" msgstr "definieer het eerste beeld als achtergrond" #: ../src/display_interface.c:559 msgid "set second image as background" msgstr "definieer het tweede beeld als achtergrond" #: ../src/display_interface.c:573 msgid "_Piv" msgstr "_Piv" #: ../src/display_interface.c:608 msgid "_Scalar" msgstr "_Scalar" #: ../src/display_interface.c:683 msgid "Scal_e" msgstr "Scha_al" #: ../src/display_interface.c:708 msgid "set vector_scale" msgstr "zet vector schaal" #: ../src/display_interface.c:723 msgid "C_olor" msgstr "K_leur" #: ../src/display.c:690 msgid "select_view_background: should not arrive here" msgstr "select_view_background: zou niet hier mogen komen" #: ../src/display.c:849 msgid "select_view_scalardata: should not arrive here" msgstr "select_view_scalardata: zou niet hier mogen komen" #~ msgid "Int Size 2" #~ msgstr "Ond. afm. 2" #~ msgid "Validation" #~ msgstr "Validatie" #~ msgid "Failure opening image header for output" #~ msgstr "Falen in het openen van beeldhooft voor invoer" #~ msgid "Failure opening parameter file for output" #~ msgstr "Falen in het openen van parameterbestand voor invoer" #~ msgid "SELECT_ACTION_FROM_FNAME: non-valid file name" #~ msgstr "SELECT_ACTION_FROM_FNAME: ongeldige bestandsnaam" #~ msgid "File selection" #~ msgstr "Bestands selectie" #~ msgid "name: " #~ msgstr "naam:" #~ msgid "Deforms interrogation area's from previous PIV iteration" #~ msgstr "" #~ "Deformeerd interrogatie gebiedjes met behulp van de vorige PIV iteratie" #~ msgid "add" #~ msgstr "tel op" #~ msgid "" #~ "Adds the spatial averages or offset displacements / velocities, from each " #~ "estimator" #~ msgstr "" #~ "Trek ruimtelijk gemiddelde, of de zelf ingevoerde waarde, af van iedere " #~ "schatter" #~ msgid "Adds mean displacements / offset values from PIV data" #~ msgstr "Tel gemiddelde verplaatsingen / offset waarden bij de PIV data op" #~ msgid "" #~ "Image dimensions defined by command keys and differ from camera. " #~ "Disabling camera" #~ msgstr "" #~ "Beeld dimesies gedefinieerd door de command sleutels en verschillen van " #~ "de camera. \n" #~ "Camera wordt uitgeschakeld" #~ msgid "" #~ "col_start larger than img_width; \n" #~ "set to zero" #~ msgstr "" #~ "col_start groter dan img_width;\n" #~ "op nul gezet" #~ msgid "" #~ "col_end larger than img_width; \n" #~ "set to img_width - 1" #~ msgstr "" #~ "col_end groter dan img_width;\n" #~ "gezet op img_width - 1" #~ msgid "" #~ "row_start larger than img_height; \n" #~ "set to zero" #~ msgstr "" #~ "row_start groter dan img_height;\n" #~ "op nul gezet" #~ msgid "" #~ "row_end larger than img_height; \n" #~ "set to img_height - 1" #~ msgstr "" #~ "row_end groter dan img_height;\n" #~ "gezet op img_height - 1" #~ msgid "image width = %d image height = %d image colour depth = %d" #~ msgstr "beeld breedte = %d beeld hoogte = %d kleur diepte = %d" #~ msgid "" #~ "In order to affect image width, height and depth\n" #~ "restart GPIV" #~ msgstr "Herstart GPIV om de beeldbreedte, hoogte en diepte te activeren" #~ msgid "" #~ "In order to change image width, height and depth\n" #~ "press OK button and restart GPIV" #~ msgstr "" #~ "Druk de OK knop en herstart GPIV om de \n" #~ "beeld dimensies en diepte te activeren" #~ msgid "Print the displayed data of active buffer(s)" #~ msgstr "Druk de afgebeelde data van de actieve buffer(s) af" #~ msgid "record" #~ msgstr "opnemen" #~ msgid "" #~ "Enables data acquisition for chain processing: recording of images " #~ "(pairs). \n" #~ "The process will be executed by clicking the Execute button" #~ msgstr "" #~ "Markeer data acquisitie voor het kettingprocess: het opnemen van " #~ "beelden.\n" #~ "Het process zal worden uitgevoerd door het drukken op de \"Uitvoer\" knop." #~ msgid "" #~ "Image or header doesn't exist \n" #~ "or image dimensions (%dx%d) differ \n" #~ "from parameter settings (%dx%d)" #~ msgstr "" #~ "Beeldhoofd bestaat niet\n" #~ "of afmetingen (%dx%d) verschillen van\n" #~ "parameter instellingen (%dx%d)" #~ msgid "" #~ "cross correlation parameter from image \n" #~ "not in agreement with GPIV setting" #~ msgstr "" #~ "kruis correlatie parameter van beeld\n" #~ "niet in overeenstemming met GPIV instelling" #~ msgid "open_img: should not arrive here" #~ msgstr "open_img: zou niet hier mogen komen" #~ msgid "select_action_from_fname: non-valid file name" #~ msgstr "select_action_from_fnam: niet-bestaand bestandsnaam" #~ msgid "" #~ "At first, open an image. \n" #~ "Than we'll further see what will happen." #~ msgstr "" #~ "Om te beginnen: laad een beeld.\n" #~ "Dan zullen we daarna wel zien wat er zal gebeuren." #~ msgid "Disabled: not a number" #~ msgstr "Uitgechakeld: geen getal" #~ msgid "Disabled manually" #~ msgstr "Sluit data handmatig af" #~ msgid "no image or piv data" #~ msgstr "geen beeld of piv data" #~ msgid "create_all_scalars: unexisting type" #~ msgstr "create_all_scalars: onbestaand type" #~ msgid "destroy_all_scalars: unexisting type" #~ msgstr "\"destroy_all_scalars: onbestaand type" #~ msgid "canvas_display_button_press: should not arrive here; m_select=%d" #~ msgstr "canvas_display_button_press: zou niet hier mogen komen; m_select=%d" #~ msgid "canvas_display_button_release: should not arrive here; m_select=%d" #~ msgstr "" #~ "canvas_display_button_release: zou niet hier mogen komen; m_select=%d" #~ msgid "shows histogram of horizontal displacements" #~ msgstr "Laat een histogram van horizontale verplaatsingen zien." #~ msgid "shows histogram of vertical displacements" #~ msgstr "Laat een histogram van vericale verplaatsingen zien." #~ msgid "Couldn't create pixmap from file: %s" #~ msgstr "Kon geen pixmap bestand aanmaken: %s" #~ msgid "gpiv buttons" #~ msgstr "gpivbalk" #~ msgid "In/output" #~ msgstr "In/uitvoer" #~ msgid "HDF5 format (.gpi)" #~ msgstr "HFD5 formaat (.gpi)" #~ msgid "include image in .gpi" #~ msgstr "neem beeld op in .gpi" #~ msgid "cross-correlation" #~ msgstr "kruis-correlatie" #~ msgid "img width: " #~ msgstr "beeld breedte" #~ msgid "img height: " #~ msgstr "beeld hoogte" #~ msgid "img depth: " #~ msgstr "beeld diepte" #~ msgid "tooltips" #~ msgstr "aanwijzingen" #~ msgid "peaklock" #~ msgstr "peaklock" #~ msgid "scaling" #~ msgstr "schaling" #~ msgid "number of histogram bins: " #~ msgstr "aantal histogram punten" #~ msgid "console" #~ msgstr "console" #~ msgid "vector color" #~ msgstr "vector kleur" #~ msgid "zoom scale" #~ msgstr "vergrotingsschaal" #~ msgid "image B" #~ msgstr "beeld B" #~ msgid "hide/display PIV data" #~ msgstr "verberg/plot PIV data" #~ msgid "PIV-derived data" #~ msgstr "PIV-afgeleide data" #~ msgid "display" #~ msgstr "Laat zien" #~ msgid "Updates parameters and save as defaults" #~ msgstr "Moderniseer parameters en sla op als standaard waarden" #~ msgid "Updates actual parameters, do not store as defaults" #~ msgstr "Moderniseer parameters, sla niet op als standaard waarden" #~ msgid "Close preferences window" #~ msgstr "Sluit voorkeursvenster af" #~ msgid "Open" #~ msgstr "Open" #~ msgid "Save" #~ msgstr "Sla op" #~ msgid "Print" #~ msgstr "Print" #~ msgid "Execute" #~ msgstr "Voer uit" #~ msgid "Stop" #~ msgstr "Stop" #~ msgid "Close" #~ msgstr "Sluit af" #~ msgid "Exit" #~ msgstr "Beeindig" #~ msgid "" #~ "Enables scale for chain processing: scales spatial displacements from all " #~ "data. \n" #~ "The process will be executed by clicking the \"Execute\" button" #~ msgstr "" #~ "Markeer schaling voor het kettingprocess: Schaal de ruimtelijke " #~ "verplaatsingen van alle data.\n" #~ "Het process zal worden uitgevoerd door het drukken op de \"Uitvoer\" knop." #~ msgid "Image Info" #~ msgstr "Beeld informatie" #~ msgid "Evaluation" #~ msgstr "Evaluatie" #~ msgid "Copyright G. Van der Graaf" #~ msgstr "Copyright G. Van der Graaf" #~ msgid "" #~ "GPIV is a program for (Digital) Particle Image Velocimetry. It evaluates " #~ "images (pairs) from a fluid that has been seeded with tracer particles, " #~ "resulting into a velocity field of a fluid flow. The program includes " #~ "validation of the resulting estimators and includes several post-" #~ "processing algorithms" #~ msgstr "" #~ "GPIV is een programma voor (Digitale) Particle Image Velocimetry. Het " #~ "evalueerd de beelden van een stroming, toegevoegd met tracer deeltjes, " #~ "welke resulteren in een snelheidsveld. Het programma valideerd de " #~ "resulterende PIV data en kan post-processing uitvoeren om afgeleiden van " #~ "het snelheidsveld te berekenen" #~ msgid "" #~ "There are unsaved data that will be lost.\n" #~ "Are you sure you want to quit?" #~ msgstr "" #~ "Er zin niet-opgeslagen data welke verloren zullen gaan\n" #~ "Weet je zeker dat je wilt afsluiten?" #~ msgid "GPIV message" #~ msgstr "GPIV boodschap" #~ msgid "GPIV error" #~ msgstr "GPIV fout" #~ msgid "Image Header Info" #~ msgstr "Beeldhoofd informatie" #~ msgid "Project: " #~ msgstr "Project" #~ msgid "Failure calling gpiv_count_pivdata for %s" #~ msgstr "Gefaald in het aanroepen van gpiv_count_pivdata for %s" #~ msgid "Peak locking" #~ msgstr "Peak locking" #~ msgid "residu statistics" #~ msgstr "residu statistiek" #~ msgid "peak lock" #~ msgstr "peak lock" #~ msgid "Defines how to substitute the data" #~ msgstr "Bepaal hoe de data vervangen moeten worden" #~ msgid "view_toggle_stretch_display: Should not arrive here" #~ msgstr "view_toggle_stretch_display: zou niet hier mogen komen" #~ msgid "number of bins for histograms" #~ msgstr "aantal histogram staven" #~ msgid "BINS" #~ msgstr "STAVEN" #~ msgid "number of columns in image" #~ msgstr "aantal colommen in het beeld" #~ msgid "NCOLUMNS" #~ msgstr "NCOLUMNS" #~ msgid "number of rows in image" #~ msgstr "aantal regels in het beeld " #~ msgid "NROWS" #~ msgstr "NROWS" #~ msgid "enables displaying of the first image of a PIV image pair" #~ msgstr "" #~ "stelt in staat het vertonen van het eerste beeld van een PIV beeld paar" #~ msgid "enables displaying of the second image of a PIV image pair" #~ msgstr "" #~ "stelt in staat het vertonen van het tweede beeld van een PIV beeld paar" #~ msgid "enables displaying of interrogation regions" #~ msgstr "laat onderzoeks-gebieden zien" #~ msgid "enables displaying of PIV data" #~ msgstr "laat PIV data zien" #~ msgid "enables displaying of vorticity data" #~ msgstr "laat vorticiteit zien" #~ msgid "enables displaying of shear strain data" #~ msgstr "laat afschuifsnelheid data zien" #~ msgid "enables displaying of normal strain data" #~ msgstr "laat druk data zien" #~ msgid "save data in HDF5 format with .gpi extension" #~ msgstr "sla data op in HDF5 formaat met .gpi extentie" #~ msgid "include image data in .gpi file (HDF5 format)" #~ msgstr "neem beelddata op in het .gpi bestand (HDF5 formaat)" #~ msgid "print parameters and other info to stdout" #~ msgstr "druk de parameters af naar stdout" #~ msgid "includes piv in the chain-process" #~ msgstr "neem piv op in het ketting process" #~ msgid "includes gradient in the chain-process" #~ msgstr "neem gradient op in het ketting process" #~ msgid "includes resstats in the chain-process" #~ msgstr "neem resstats op in het ketting process" #~ msgid "includes validate in the chain-process" #~ msgstr "neem valideer op in het ketting process" #~ msgid "includes peaklock in the chain-process" #~ msgstr "neem peaklock op in het ketting process" #~ msgid "includes average in the chain-process" #~ msgstr "neem gemiddelde op in het ketting process" #~ msgid "includes scaling in the chain-process" #~ msgstr "neem schaling op in het ketting process" #~ msgid "includes substract in the chain-process" #~ msgstr "neem aftrekken op in het ketting process" #~ msgid "includes vorticity in the chain-process" #~ msgstr "neem vorticiteit op in het ketting process" #~ msgid "display zoom index: 0:0.5, 1:0.83, 2:1.0, 3:1.3, 4:1.6, 5:2.0" #~ msgstr "index voor vergroting: 0:0.5, 1:0.83, 2:1.0 3:1.3 4:1.6, 5:2.0" #~ msgid "SCALE" #~ msgstr "SCHAAL" #~ msgid "vector length scale" #~ msgstr "vektor lengte schaal" #~ msgid "view the GPIV buttons of the application" #~ msgstr "laat de gpivbalk van het programma zien" #~ msgid "view the tabulator of the application" #~ msgstr "laat de tabbladen van het programma zien" #~ msgid "" #~ "Image dimensions (%dx%d) differ from \n" #~ "parameter settings (%dx%d" #~ msgstr "" #~ "Beeld afmetingen (%dx%d) verschillen van\n" #~ "parameter instellingen (%dx%d)" #~ msgid "Display" #~ msgstr "Laat zien" #~ msgid "avarage" #~ msgstr "gemiddelde" #~ msgid "gpiv_fcreate_hdf5_image: unable to create file" #~ msgstr "gpiv_fcreate_hdf5_image: onmogelijk om een bestand aan te maken" #~ msgid "Failure calling gpiv_fwrite_pivdata" #~ msgstr "Falen in het aanroepen van gpiv_fwrite_pivdata" #~ msgid "Failure calling gpiv_fwrite_scdata" #~ msgstr "Falen in het aanroepen van gpiv_fwrite_scdata" #~ msgid "file contains no image data" #~ msgstr "bestand bevat geen beeld data" #~ msgid "failure reading image" #~ msgstr "fout bij het lezen van beeld" #~ msgid "%s: Failure calling fread_pivdata\n" #~ msgstr "Gefaald in het aanroepen van fread_pivdata\n" #~ msgid "Failure calling gpiv_fread_pivdata for %s" #~ msgstr "Gefaald in het aanroepen van gpiv_fread_pivdata for %s" #~ msgid "?" #~ msgstr "?" #~ msgid "gpiv" #~ msgstr "gpiv" #~ msgid "this is a demo!" #~ msgstr "Dit is een demonstratie programma" #~ msgid "view the menu bar of the application" #~ msgstr "view the menu bar of the application" #~ msgid "view the tool buttons of the application" #~ msgstr "laat de werkbalk van het programma zien" #~ msgid "interface" #~ msgstr "interface" #~ msgid "Save File(s)" #~ msgstr "Sla bestand(en) op" #~ msgid "Exit gpiv" #~ msgstr "Sluit gpiv af" #~ msgid "Aren't you sure you don't want to quit?" #~ msgstr "Ben je er niet zeker van dat je niet wilt afsluiten?" #~ msgid "menu bar" #~ msgstr "menubalk" #~ msgid "show tool button bar" #~ msgstr "laat werkbalk zien" #~ msgid "Adaptive Inter." #~ msgstr "Aanpassend Ond." #~ msgid "0.6" #~ msgstr "0.6" #~ msgid "viewer" #~ msgstr "plot venster" #~ msgid "" #~ "Enables a single PIV data-point to be used for further validating and " #~ "post processing" #~ msgstr "" #~ "Sluit een enkel PIV punt aan om te gebruiken voor verdere validatie en " #~ "post processen" #~ msgid "Enables an area containing PIV data to be used" #~ msgstr "" #~ "Sluit een gebied aan met PIV data om te gebruiken voor verdere validatie " #~ "en post processen" #~ msgid "not connected, yet" #~ msgstr "(nog) niet aangesloten" #~ msgid "Image processing" #~ msgstr "Beeld bewerking" #~ msgid "Image Proc" #~ msgstr "Beeld bew." #~ msgid "Piv: image analysis" #~ msgstr "Piv: beeld analyse" #~ msgid "Piv analysis" #~ msgstr "Piv analyse" #~ msgid "Piv Post" #~ msgstr "Piv Post" #~ msgid "" #~ "Disables a single data point that will not be usedfor further validating " #~ "and post processing" #~ msgstr "" #~ "Sluit een enkel punt buiten zodat het niet wordt gebruikt voor validatie " #~ "en post processing" #~ msgid "" #~ "gpiv is a program for (Digital) Particle Image Velocimetry. It evaluates " #~ "images (pairs), " #~ msgstr "" #~ "gpiv is een programma voor (Digitale) Particle Image Velocimetry. Het " #~ "onderzoekt beelden (paren)" # Obsolete #~ msgid "_Interrogation area's" #~ msgstr "Onderzoeksgebiedjes" #~ msgid "_Vorticity" #~ msgstr "Vorticiteit" #~ msgid "_Shear strain" #~ msgstr "Afschuiving" #~ msgid "_Normal strain" #~ msgstr "Druk" #~ msgid "Covariance" #~ msgstr "Correlatie" gpiv-0.6.1/po/POTFILES.in0000644000175000017500000000057011076052422011600 00000000000000# List of source files containing translatable strings. src/main.c src/support.c src/utils.c src/preferences.c src/console_menus.h src/console_interface.c src/console.c src/imgh_interface.c src/imgh.c src/piveval_interface.c src/piveval.c src/pivvalid_interface.c src/pivvalid.c src/pivpost_interface.c src/pivpost.c src/display_menus.h src/display_interface.c src/display.c gpiv-0.6.1/po/ChangeLog0000644000175000017500000007373411076052422011611 000000000000002004-06-29 gettextize * Makefile.in.in: Upgrade to gettext-0.14.1. * Rules-quot: New file, from gettext-0.14.1. * boldquot.sed: New file, from gettext-0.14.1. * en@boldquot.header: New file, from gettext-0.14.1. * en@quot.header: New file, from gettext-0.14.1. * insert-header.sin: New file, from gettext-0.14.1. * quot.sed: New file, from gettext-0.14.1. * remove-potcdate.sin: New file, from gettext-0.14.1. 2004-06-29 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2004-06-15 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2004-06-14 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2004-03-16 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2004-03-16 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2004-03-16 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2004-03-16 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2004-03-16 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2004-02-16 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-11-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-11-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-11-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-11-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-11-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-11-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-11-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-11-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-11-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-11-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-11-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-11-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-11-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-11-26 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-09-04 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-09-04 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-09-04 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-09-01 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-09-01 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-08-21 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-08-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-30 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-30 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-30 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-30 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-30 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-30 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-30 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-30 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-30 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-30 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-30 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-12 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-10 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-07-10 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-26 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-26 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-10 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-08 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-06 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-06 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-04 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-04 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-04 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-04 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-04 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-03 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-06-02 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-14 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-14 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-14 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-14 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-14 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-05-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-31 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-12 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-12 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-12 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-12 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-12 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-04 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-03-04 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-21 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-17 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-14 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-13 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-12 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-12 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-12 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-12 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-12 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-12 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-12 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2003-02-12 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-12-11 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-12-11 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-12-11 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-12-09 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-12-09 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-12-09 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-12-09 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-12-09 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-12-09 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-12-08 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-12-05 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-12-04 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-12-04 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-12-04 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-12-04 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-11-21 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-11-08 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. * cat-id-tbl.c: Remove file. * stamp-cat-id: Remove file. 2002-11-01 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. * cat-id-tbl.c: Remove file. * stamp-cat-id: Remove file. 2002-10-29 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. * cat-id-tbl.c: Remove file. * stamp-cat-id: Remove file. 2002-10-25 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-23 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-23 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. * cat-id-tbl.c: Remove file. * stamp-cat-id: Remove file. 2002-10-21 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-21 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-21 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-21 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-21 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-20 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. 2002-10-19 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. * cat-id-tbl.c: Remove file. * stamp-cat-id: Remove file. 2002-03-28 gettextize * Makefile.in.in: Upgrade to gettext-0.10.40. * cat-id-tbl.c: Remove file. * stamp-cat-id: Remove file. gpiv-0.6.1/po/Makefile.in.in0000644000175000017500000001536311204234167012504 00000000000000# Makefile for program source directory in GNU NLS utilities package. # Copyright (C) 1995, 1996, 1997 by Ulrich Drepper # Copyright (C) 2004-2008 Rodney Dawes # # This file may be copied and used freely without restrictions. It may # be used in projects which are not available under a GNU Public License, # but which still want to provide support for the GNU gettext functionality. # # - Modified by Owen Taylor to use GETTEXT_PACKAGE # instead of PACKAGE and to look for po2tbl in ./ not in intl/ # # - Modified by jacob berkman to install # Makefile.in.in and po2tbl.sed.in for use with glib-gettextize # # - Modified by Rodney Dawes for use with intltool # # We have the following line for use by intltoolize: # INTLTOOL_MAKEFILE GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ PACKAGE = @PACKAGE@ VERSION = @VERSION@ SHELL = @SHELL@ srcdir = @srcdir@ top_srcdir = @top_srcdir@ top_builddir = @top_builddir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ datadir = @datadir@ datarootdir = @datarootdir@ libdir = @libdir@ DATADIRNAME = @DATADIRNAME@ itlocaledir = $(prefix)/$(DATADIRNAME)/locale subdir = po install_sh = @install_sh@ # Automake >= 1.8 provides @mkdir_p@. # Until it can be supposed, use the safe fallback: mkdir_p = $(install_sh) -d INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ GMSGFMT = @GMSGFMT@ MSGFMT = @MSGFMT@ XGETTEXT = @XGETTEXT@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ MSGMERGE = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --dist GENPOT = INTLTOOL_EXTRACT=$(INTLTOOL_EXTRACT) srcdir=$(srcdir) $(INTLTOOL_UPDATE) --gettext-package $(GETTEXT_PACKAGE) --pot ALL_LINGUAS = @ALL_LINGUAS@ PO_LINGUAS=$(shell if test -r $(srcdir)/LINGUAS; then grep -v "^\#" $(srcdir)/LINGUAS; else echo "$(ALL_LINGUAS)"; fi) USER_LINGUAS=$(shell if test -n "$(LINGUAS)"; then LLINGUAS="$(LINGUAS)"; ALINGUAS="$(ALL_LINGUAS)"; for lang in $$LLINGUAS; do if test -n "`grep \^$$lang$$ $(srcdir)/LINGUAS 2>/dev/null`" -o -n "`echo $$ALINGUAS|tr ' ' '\n'|grep \^$$lang$$`"; then printf "$$lang "; fi; done; fi) USE_LINGUAS=$(shell if test -n "$(USER_LINGUAS)" -o -n "$(LINGUAS)"; then LLINGUAS="$(USER_LINGUAS)"; else if test -n "$(PO_LINGUAS)"; then LLINGUAS="$(PO_LINGUAS)"; else LLINGUAS="$(ALL_LINGUAS)"; fi; fi; for lang in $$LLINGUAS; do printf "$$lang "; done) POFILES=$(shell LINGUAS="$(PO_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.po "; done) DISTFILES = Makefile.in.in POTFILES.in $(POFILES) EXTRA_DISTFILES = ChangeLog POTFILES.skip Makevars LINGUAS POTFILES = \ # This comment gets stripped out CATALOGS=$(shell LINGUAS="$(USE_LINGUAS)"; for lang in $$LINGUAS; do printf "$$lang.gmo "; done) .SUFFIXES: .SUFFIXES: .po .pox .gmo .mo .msg .cat .po.pox: $(MAKE) $(GETTEXT_PACKAGE).pot $(MSGMERGE) $< $(GETTEXT_PACKAGE).pot -o $*.pox .po.mo: $(MSGFMT) -o $@ $< .po.gmo: file=`echo $* | sed 's,.*/,,'`.gmo \ && rm -f $$file && $(GMSGFMT) -o $$file $< .po.cat: sed -f ../intl/po2msg.sed < $< > $*.msg \ && rm -f $@ && gencat $@ $*.msg all: all-@USE_NLS@ all-yes: $(CATALOGS) all-no: $(GETTEXT_PACKAGE).pot: $(POTFILES) $(GENPOT) install: install-data install-data: install-data-@USE_NLS@ install-data-no: all install-data-yes: all linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ dir=$(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES; \ $(mkdir_p) $$dir; \ if test -r $$lang.gmo; then \ $(INSTALL_DATA) $$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $$lang.gmo as $$dir/$(GETTEXT_PACKAGE).mo"; \ else \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo $$dir/$(GETTEXT_PACKAGE).mo; \ echo "installing $(srcdir)/$$lang.gmo as" \ "$$dir/$(GETTEXT_PACKAGE).mo"; \ fi; \ if test -r $$lang.gmo.m; then \ $(INSTALL_DATA) $$lang.gmo.m $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $$lang.gmo.m as $$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ if test -r $(srcdir)/$$lang.gmo.m ; then \ $(INSTALL_DATA) $(srcdir)/$$lang.gmo.m \ $$dir/$(GETTEXT_PACKAGE).mo.m; \ echo "installing $(srcdir)/$$lang.gmo.m as" \ "$$dir/$(GETTEXT_PACKAGE).mo.m"; \ else \ true; \ fi; \ fi; \ done # Empty stubs to satisfy archaic automake needs dvi info tags TAGS ID: # Define this as empty until I found a useful application. install-exec installcheck: uninstall: linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo; \ rm -f $(DESTDIR)$(itlocaledir)/$$lang/LC_MESSAGES/$(GETTEXT_PACKAGE).mo.m; \ done check: all $(GETTEXT_PACKAGE).pot rm -f missing notexist srcdir=$(srcdir) $(INTLTOOL_UPDATE) -m if [ -r missing -o -r notexist ]; then \ exit 1; \ fi mostlyclean: rm -f *.pox $(GETTEXT_PACKAGE).pot *.old.po cat-id-tbl.tmp rm -f .intltool-merge-cache clean: mostlyclean distclean: clean rm -f Makefile Makefile.in POTFILES stamp-it rm -f *.mo *.msg *.cat *.cat.m *.gmo maintainer-clean: distclean @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." rm -f Makefile.in.in distdir = ../$(PACKAGE)-$(VERSION)/$(subdir) dist distdir: $(DISTFILES) dists="$(DISTFILES)"; \ extra_dists="$(EXTRA_DISTFILES)"; \ for file in $$extra_dists; do \ test -f $(srcdir)/$$file && dists="$$dists $(srcdir)/$$file"; \ done; \ for file in $$dists; do \ test -f $$file || file="$(srcdir)/$$file"; \ ln $$file $(distdir) 2> /dev/null \ || cp -p $$file $(distdir); \ done update-po: Makefile $(MAKE) $(GETTEXT_PACKAGE).pot tmpdir=`pwd`; \ linguas="$(USE_LINGUAS)"; \ for lang in $$linguas; do \ echo "$$lang:"; \ result="`$(MSGMERGE) -o $$tmpdir/$$lang.new.po $$lang`"; \ if $$result; then \ if cmp $(srcdir)/$$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ rm -f $$tmpdir/$$lang.new.po; \ else \ if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ :; \ else \ echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ rm -f $$tmpdir/$$lang.new.po; \ exit 1; \ fi; \ fi; \ else \ echo "msgmerge for $$lang.gmo failed!"; \ rm -f $$tmpdir/$$lang.new.po; \ fi; \ done Makefile POTFILES: stamp-it @if test ! -f $@; then \ rm -f stamp-it; \ $(MAKE) stamp-it; \ fi stamp-it: Makefile.in.in $(top_builddir)/config.status POTFILES.in cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/Makefile.in CONFIG_HEADERS= CONFIG_LINKS= \ $(SHELL) ./config.status # Tell versions [3.59,3.63) of GNU make not to export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gpiv-0.6.1/doc/0000777000175000017500000000000011204235560010233 500000000000000gpiv-0.6.1/doc/C/0000777000175000017500000000000011204235560010415 500000000000000gpiv-0.6.1/doc/C/topic.dat0000644000175000017500000000061511204235560012143 00000000000000index.html index manual intro.html introduction manual gpiv.html gpiv manual piv_intro.html piv introduction manual batch-gpiv.html batch-gpiv manual err_vec.html err_vec manual flip.html flip manual hilo.html hilo manual manipiv.html manipiv manual peaklck.html peaklck manual rr.html rr manual s-avg.html s-avg manual scale.html scale manual t-avg.html t-avg manual vorstra.html vorstra manualgpiv-0.6.1/doc/C/index.html0000644000175000017500000000305411204235560012330 00000000000000G-PIV help

Index Gpiv manual

1 Introduction


1.1 General description
1.2 Licence
1.3 Final remarks

2 GPIV


2.1 Starting up
2.2 Menu and toolbar
2.3 Process toggle-buttons
2.4 Buffer list and display window
2.5 Tabulator
2.5.1 Record
2.5.2 Image
2.5.3 Process
2.5.4 Interrogation
2.5.5 Validation
2.5.6 Post processing

3 Quantitative Flow Visualization techniques


3.1 Introduction
3.2 Particle Tracking Velocimetry
3.3 Particle Image Velocimetry
3.4 Laser Speckle Velocimetry
3.5 Other techniques
3.6 References
gpiv-0.6.1/doc/C/figures/0000777000175000017500000000000011204235560012061 500000000000000gpiv-0.6.1/doc/C/figures/gpiv-fig_console_record.png0000644000175000017500000033357011204235560017306 00000000000000PNG  IHDR}_@ pHYs !dtIME8a IDATxwxg~:ݩWZն+zo!$$$$$ л1cl{*7UK:tnqFaDz6Ǐ|}EQIII`0<$9:))bɢ(Fc1(A\ s$!Yrxr̸ 4bmMP(DB="Xh,{NWcS$Iv1 < If^V:rtwA9J( B$IKKHg<˲:.H$"?mYw/,.:!! 557l،F xD"Z֌0{g6srsqea֧oz}0ES%'OHQT~/zdHD"_GNNY3iJOtB%%%}$IBBd۴ic]]C0PŲ,]L.--헗wf/W_XT+ sA]Kxh0I'9RR4 |6UiS,KO5k>t +=}FsB!$ BI%vPp8k0,;m Ryy6h4E?>"h4˟Inx<-Gr0l>??0'\rIwq - }iB"])r9c֚zCG#C`KKٷ` }Rq;wlw:]$':uQm5x w.|, [l^~dq܆  _?醆N[ݝ&r`pذ<|ͻvlӦO;r XzFwLq*za1Xhrh# (bRTyH4 xfAR)n,yQ%I$%Q!Ke5j5]LohnjbYRPhZ{[Q*j銋e2Zkjj;: dfd644Ihoڬrִ֖|eM& q999'dl|FlͣJR9NJE3Lj˕ %qmmV5;' pVL4iZypbb"f^;@i I$I$% _$I?pt9vDƄtBA~א{&EQ$DQq]Lo!$JR$7MKE\,%$ DjJj[kɓ' {8ND DQD @Iq\w$N!8hj֖ea xa-A㸸߶(**2t5~,S=^ |韯|ŗyIII;vz)ɓ&DW t (Im=_IvIa0-)))~?kHDN+juwvƢQFtՆ RRSuGkZ655Gde% y<z M&95""fa%Q?ğ$IP)U v<\U5X!Lo.b9!aTEBa%$!tu=k=_.=KBjZqtU\>LD"% l"шB.OɍFcpeY@ۍsUF,˲3<3 03&&IR&d g~GhF4jB!Ev1$99%99x香]1e z9j,X{;M˞1 j[ar\k(vqc`0ז1}jffF󆍛DAq]:;.c7ϼ1++wX~ʊƍQ*Xp, @mذiuJG+W~sS-/O?̳/45zf|ӸcyW^y jL6m  C;]O,lnjtϺܜ}K-BEES&MHJJei"v޳5>o3fLK?ee[nU'N4h`0WЃSÑŋy<[ne0,9ׁNo_M]] J233#99%r O8a׮۷g>_<垻˯k-))ӧO8Bz1cFP|T5Ref2ZmswRιEnܸ9k4;w=IǏݻSA$S(-*|U@;sss "y|iSt?n/,,,(x&``aw\IQ$Iڳ=v$q6W-|q4Yng_xn2/dT*阨0 Z, APS}uyrO<o7Ca}}|wUT8155$ ZR(0n 0Q#xޜ`G#1r綴4m4Y/_\HKK4qqc @R ! A A`$I|؉~ͧN:O*j4O~osjM|{o2YC` #AÇy<ϛjAQ1|!sέ-shgOu{{N@ p8G\!_cgިR*idgC9 cǎ^٢|?E$(s>|_~%z> )[f=ڵq|II0e{`~ `B ଉEEJ25%!,OOOHL@]NTUÆ ---(*b1Lv?<\RM&r ( nML٬"ad2YaA~WjuZj <՚TU ٬ԩXPYqk J$&%ٺSkԹ99Fђv;;;MFСUZ d$|w}nWTcnj_C5a0'ڽ[UVVttؗXE8~Io0!~h~! *OG3j];Gj/޻w׫u99wv/KϹuO?eK>S(!b0w/v}{C?>WWRՠyND20Oei񶧦\;q۶IQ{d!=-mʤ≠ya0s72??SqP00hkf٬q[o.`0+[t(4Ls[Zq\p  a! .\( s ~Pjjj^ \S8Yvayl-']V0\FCX8PUU5bH;}ޣF7cTpa0UF(h:08.&~ #.gDho`0WNWݕsVNhNJN`0 gn?%ٞhM`0׺0 fJCIp|A6xaZ2$Ipȑں'(!F It\!pp<%%ESwy;.+[Bz^Oz]>O][%7R ^B$!D@ë2 3t`2} 霜3v_t/x<`0!b P+L&p C$B!DQ4: Gb`0FEQTʟ-+d cR뱴@CI8 H$$䢜K@01W-m|%/8p /-77{OW\a,lۺRx5 huuuA~@ cÇZY]-㸅 m,ҒZB\DDA!:9e?Hq3|9Qy=n?yikw Āߋ 4GǗ+WL:d2J¾\Շc?bYP ^"HB!$pHy?:W;(IRV׿曒$*Af($I}ߣ!:Nڳ2 Os8\hLV_rUxRkWO6Q١(<E$IPP4|f'G t9n\IuTbMiokͥ%IW/WEco:a0th^^АGh@I 2{oG!ѢDJ۸e_Bļy$IbY$ɂF$YE\*aiO?}=,0aLl۶KR\]yy~R_%yBA @R )" K$bm[j++$E("I}<#5?c(j `4ªca I~ !r,vX$q3q$ "mI~ A!:eلsG! $$IR( åa՝Æ t.yԩ2 A(IR߻xO7h$r:Z펦S t8e6>-IjʏocC+`e%RI:% Ȃ|5_Y־/L1cZՠq%hkxIP툣e>7酣FRl6ɺZ&6|a <χC^ 0@lI斶F.#hiJa^~ /|F$I T)gx QDTq\N:0v Bĉ 7@B@eddaa BA~ LV\\y'N&;Y1B6=l6[JrR8BHvǦXYnD" ֣BV딙e-iRǁĥ_7g6Y*+/(.*l1A*tvttB!)rP(Dx<oX> ttN=R`YVXt۷VV IDAT5477-DVq-H(в̟gYc{_ly ]*PR RzڣϽ;RS.YHThh yz*6NG8z1 Kvi]W0D#a!9u I̙quL$ " (w߮vIB $4GkO "ExFCaH2(E,ϗzV,]ak A]*Մ͝f:$g4'ƧPy_.-pHH///HR/MNI6 }PB"iP|њRT~%qU"p8|aa4ho { `e@vt^zSZhV~Cv;A;QBquADD <mY" nÚr)=b|`,*N @ B@CK(bCC=EAxg>$ 7;Nr}kO<~*,,ԢтiӦj9UX{Jy}C:d#dRN B$[>u1@QtˊTnb1(Yҋ*~蚵/NMIytZ- 7'痿;OT*.HøcƎlЮH4hO$vFE1AI$A14#cp5i0 Tս_eFьV ^Q "i(I( ("065$gdL-BHA(ML,E E0:Mo]PGٵk;!A!$Ht^W>aJJJFFFgbIɍF #ǏS(P rkrd61 At_7oۑ\Dj6B>&DBRD; ۣԎykRJr/{۾25H1 !ɵZm\DQD"---jy^FR+J2xjV NRիK?`ag#}%MB$[H:d`#?p0vHb\,H^o4H(  I};]82SM$Ip"IBP(LS24MXa_(شyKeyIEyI;p~\vv;wC=kfkk[zzZQaA!Il67fbsw`|t($3 ;9 )#/:\Ra޻J?s>m-Mv!FL,C a`Lz0twt rYNnnnnn|>5^[erުV0_wJ1MzI7쭧x#>gMA ŵ56y$ HJII5}̌}`asSsffj]]c06(*,PT!FpUYQ>vh BXjRTqqOu*T@:Mb|ՂCԤ8qvtowq[CC(nh펶6@s4M$AWai !bSBbo1aZӓky$E2\.fy-3|U v:B HHƢіvI˵FFaRS\.cZ]p7!DQDb겲>(8aj}6m>ɘe$%$C/ \TƣnzqRIiN|4$Q{ q inxD ?D=Ͼ}A.Hb`YH$օA^7B(Ţ^>JJ.W Υq t:[_V(*+3g?y :qC$AR l6l_l0̈VWw_29wPeeeEEZm_̨!"%%YefevwD"j6zZ02 !D IЙYDK!6np҈GFkCx(9!2 R}rБzAo8- / .ݖ_˫{˽hl2s3 ̬Ϻ:s<6L}"iZKOKB0tW_>-(FWP;λC_ eY&nqJ~~ޑCiu :[61Z(xuIBԔd/2dY7"=L&]@ojU[=TjFG$+up& Oپ}g,r\^ $BPZ\@3Gj;.Fzލ444 h(/(EÏ>޻/mz}k555Y_U5d2^=E8[]h,yuc yoxysoQoO\,M EM n;P>8zxA~^vVf} ?<\V7oIOO(KX9R{͒%W r_ix _^xXl7ϼeI'N֝:u{JX.mY(iyϯPw߻ZO4a„ ,,/+0$I{jkΟ7g-p8Fy]_aL~B ?WZ߯q 3Oկ;`@U_GQ#Ϟu[\/dc઼~]_f=j`y~͚u ^ؽ.\V^V,tQ[kۄ Ϲuv[?_>f4{vU/'tЖ$iӦ-b!I2y<^N7g 3n=y҄Gť˖b%ԩSOV4oh4q9\Ih+W}R*oeGsB---o'sr M?]( 4p7%% T*̙7=b2r~ܸ1*+p{k׮9>8==m x^ f:p땗po{[ I` H:+>|0?##= _nvشywyǦ͛mXaڵzG5}7ϼgBxao;--uGjc%$Z-/ܿ=kמ={A۷j?ppW_O>EDpd]m?=G~ă>74nڼ׿/Ӷ65kϛSZO 7XRt-_U0jj6W5gw??qrɒ/TT'0057{cc ?̷|7֭۰vG~?kHٴ󥍍Mha$aiiosWݾ}{dk֬wl۶c[[Zw5vhHQMF5~'fOOf~`8޸˟:;; ?ȑOsfo۶m_[[[Y-+-d$IZ, #G ߳poXt=Gy(=-??+[\@Ѵ-95v%*뵅eYV&r%=99Voě6m(2hOuu<[g 8 #=})'N\`+Ww>ȏ/Y_6'~SVZ"lJJJo=jD]]}{{;:r$krMclڴb B+].Wj鰎?@jjFl?HNNv⢲VJ2^;#yOzc+&n??>%KǔJeѣ "n#N4a5FF=ǐ^ =M&1ްi4Z\(,,9,??!2;l߱SR);v_T.0eM׬]t$Qr8'M4%lKMKݺ}Gՠ:z{$͹u#|"I5qJ!R#IQ߉@!IgD,XWl64oݶw?HOǩx*5;^R׻iԚh$za+bIYg ** I 2G_~헛 _k,+n)*U*Q~`& @[ (K:AP2Dl%%IW5ei`f2JLj].W86TD,Xx &}N׍租8䉓̚ HNJ1}괩7X^p\L:H4/` miiOx[l3fŒ0eʤgLKII ÍMqS 646f765dS hmmKL?~K h48bItE{/ p׮=ٙA˅ I"=U499|ڔӖ P*dff\5rڵSSSSƨB٬_u_\tVRxU'{W_}_nnqQ>|(E6{m삓o߾w5B.544nܸyatAevDpV%ϣ2$|(/kn>zw"‘pQQQAA~G;pb„_!M3~.mkkmAQd(_\[[º䜜~w!F0xpՊV}`a<5/+ /_{7dB\TTwoɓ*+u:efSii}g 9B@єwɅ.u.7'7IH0q<D+zmÆN0+}nyyYY9*aw!H$`08`@^(*99W_4h#7f%oN܇3'Nκ3rS---ZT*‘Çu F1bؒ%˶n9h(IҦM7m"˲60ޜ˖=v$ ì / 镕{=q ܯ_aCe%+W~TJҒ?(==m9t:c= %@.WD!I8hqo۾#(';Ss"0YY$0p@EUՠْ%n}RX,#F "`0$l\UZZT*ZMffF܍NӴՖvo;)ɦT*ITTiiÆoDIӴLffd \bRRU*1~pNkKRMtZZjK_fsܜCT&ɘ"WSRR-II6ry*A!jԔ<5 \!OKKMXhj:DQ+$+)25Q.2,VJK*KJERR@jZFd Yj5`4&&lVٔ0#G #bӦ-%jjEbY6???;^/.*/W&MlBT)Y-,,>lHk4%Ib $&Z!Z]XT/7bL(*9))@Lnڼu9q+l6L& èQeefTTɘR݊ D#]wkʊǏ6 &P,LnhvsmM'{o?`.|Æ7EB>_VT pw+)iw?㞮$y.PПԛx  nVC!'''r9:DQt-/6r t"`Y [ .Brkuz\@ s[ 2\3$)W(=n.D IDAT օ!#\2 b`9Jrt؛OJDLx:_[N5u0 *#;љᓏ?yw"[v{h` s3)Sn6'M`0%gN ®m/&=`0>j) qs,,+B .M6"\ sFD;[wdNEZ1 !,  sU9]UnIjRR/-h;-!dN~к [6lڞpſhP FcFf횶s;o, ~;ϕsq$wwBKۭKnwkPֽ-݂DHq<׫iH@w;3w朙3gΔUH:8{_ja~+ߑ\vZ=Үt:]gڗX|Fr9>,^_u:.A|iپ3D&uZ۶e`ڍ8^>zyZbUCw+Bo-4E7"##;b _{Uw]pEP ~ 2U|ρhM"}аH[b 7\nSqsrsuUb`kN>A|}Fv9 H,khnŋ/]7CjXl:=sLa}9DhFj6>ɓ;9캯+F#8w|KoOXuv:IW}{͝;++Jt:ƺgN{=qmW*yyy*}O߿_v?jԦM:4[lILLkygy;}z(ZV^^_g, >ytUu O +ȕ-l5kfollH$)=J%0UUW q!w;q¸ɵZ.`ٲ/ 6cN,9: ajZ -11ѥe'?55øm`L˗sLf%'7l6 D__86Kc MJL@.ee׮Sw=yĶV嗕x(㓖AږVRp:CC1 #ð࠺"ЫWʽ:p\v記h@јo4yzDNNZ**?n:pTՔ&hy6ŰfQ WrrD"I|ESŐ5+B0nmm]LLj=uLR !A(*߸i ˥iv)Z h:pN*[NiVhX,ƍ9{h7v4f؉j A]`Ak C''' 6=cKQԵkfN ;x߯#˗ѨO9{qbO4Ss+WrJfy996оtH+f\[Fy/Z*==Kk]1sΖJ$U._5kFlҲ/f$E?qj9 L*lڲumܴTp8<8>\FsStj2޾}Nt~|MLxC NII.ܰaSm]BjgΜ df7n]]{JM8alX~ g7cT@`4EaVQQghii[0^TTdիGuݳfѝ={~붌S&OUK3O/5rDK==ᑑfPCˉfϚPYU4@!ҋ))=-VX밣ِ`yy#֮0p`?>t__AN:/bec9!{y=bb N:@QWjϘPŗ4Z?wՏ?gBᴩ?ptTVUZZZe2iW)!?===Moشy˵k;(o{:e36nNEЇK5#^}Ӣ"#vK3ZS3WAxFX]] hhlʻzuYQX APJP7?444)ʪꊊʙ3}wbRhZ~cEyVY?|Ekkk-cFܷ?KTL2w}v+:*J fA~jĄҲWroػf̞5#o׬KP^^a؄jUMXV;*I4MnK66t.i͚5{o.\b%b1t?qp(*//'I pɜaX/⪴3Y@`6{r8 B ?=t^˵x∈HɴtR;aXDxn{ 1Qǎhhhn+9)._Ueբp\JգG IaMMW5ZH^\0v\Q\.'!>^*hjnޛ…lAp͓!000z%oLTB. ȃ{N>SSSp(zg1 9cڮ{6nڒg ~ DEEr8xo{B0?@T]-(TUAAf%3s߹VOzq$Cv;TJaC7n޲zaC3Я__ bd,{ںZThh?"ߛ}w߭>}jϞI555ٓyyF>>5W9r jy%F(^cc#AUsE556%$$pȈp/ˆf÷߭i>o߻,С3eb@ xE_15>av~! _o23ͷRT457sÁaX;-X<4Ŭ .tpmj"h۶m+W矗,YrQM6 0 AwE+ BC/]&%7|5a9uCS&O (jSFtrRGN4a\.m? x>y%b j8iSF^oزu[^~!7 0t:R ۹n$9b[N=~O?hM>R/oaq8\.pzno5kFdDWIx͟;`@:w X4{VUW߰)&&:!>!ǹ\.fNq(oY q fHqKK+Wf̘z̹Ӧ( .;u1cFq9 zj/4p0;].o8ϝ=32*QFQt'.݃\b.hr'TPP xXЧOoFݹC_hm5^nƌiaa_a b\Îa z T&q=.WvO?ニ i qyܠTkQ e˖UWWDϮZ?v- 7;NHzڒҌ;+**G ˯KJJ?`YCB;<*::eeU煄-[|WjudZϥ;wr>&44555quc? d̓xgP(|t-[[7D\XX0L~]ܮn|8%%njnn4n}l0@04SRTʭ۶]ћ7X{6/^RpX~Rx<8`Ϸl7mK$А 6mڼ;u<<0ɓ Jx?S_/t}f~2ݠ~æ]Sŗ_8x%""̫,0'N:rXIIǟ|>yү8;ǟ'Mpӧ~W6gdZu056oW%;b FPn޼lM NΜ=W\R^:ɤIl5{$r(_xm۶k4,2x+y5¢Yovfq=< )c^ǟ֔ع7I22v:˙u`[3ye^pْҏ?qw3PtSS\8q8nX=7śĿ(R9sƴ~g@ 7f4qܹsf]~{4:}V5s3X붌۶9r,t  >}-]=T*V7w G \lNNnHp3ʡ~6ͷtژh@,4$/1o!xȐA))TӦ^ӫWj A;A6m3ol製K8a/7_~Ŵ>f:-AXg#_??߶X,5k֭Waȑb=>K 3УG4Afk֮?}l߾SSSPH$sڰq={w6C̚kmcFm޲+"шrrrZƫ"#3gL5X+5w 'X~&܃ݫw^0sOԗ_zO^ Mع~9cZ0 iIjGƌux#G%&$~=zĬXT*9}ZLtO  tʖɉsd2__ܼ1 :d0\xiȐAEرksJM?$IvZ(z\`P+9oB,-]W͘1uÆW߯__r^xM=Ԕ}m800`;RdʔN.gηkoۣ_ZJ~fܽ7sWn,\ccƦ13OJVYOdZZ޽Ry<a͟Y^Ltj[n?A8 z%߉#VL[36nڢj_[39iu5s _ɕ x'68WTϾcim1ۿ?$4jР>Tmmi/:P;в-x Ukt68>fܤ#j;0xؘNTܼ<((d2mݶC.͝3VlڿR;z-jl'~7}Y}KNN4omppu1 E߽lظb>@>EnF&SYVz}Oyu:WWilj֭^?ݮ0git~#G 3[7LAԚs_Aoz}L /@0 @'<>iA]n=n"Rk}>K{xH,y'Z.'v̴'OGv+ xcƎ *IWHpB_8vXHw||?=r }&vdKd]Kiݞn阀xƏ *AyϤ.z9Uf[i2ZBpKg96vG//<ڟUˀ/]J$=o/ HeK#슀`c~=g3QhuGQ5It34}M^ҙb._dg#U^Bz=#ii1C#MS- ^6.NwgOm֖f:b;K@t`}Jb QUVAC:W ۶m[znpOSsW_ݧ#نP#J"$H߿4+IIIɢ|}}e20-Wg)XXXX:E ":0h[ٸqcS&uT !a|=fc?54K_#"czvM30dw^Kawf5 5(Aj_|F~5yp҃vL!;dH0L7ٻ u2c ad}亾N"U(պښj.qKJ'$=aǗ=c;LFc}]V3Z5I@`$ BAfA9\xXb2@DM:CSE S$TnaG9B'[W!Rk| !QQl6DQAbAQń (I(U֖&a (JT&cn (J8I [u>CE( wحHl6@Lkq((T)5.QHa<(t@Ô\Hz;?w„qȸ~ⳏ8nD:}VwEQG/-+) h}ͦVTnLB\YL.a@"(6Q_P6@(Yͭ-MJr*jtax|Of547H2ۅa|ܤWk}q[PYF"ʹO$\.j2Db I(ʱY- hUb6JJr:l6P Ajiר:$KVhP(nU(TrB0 Q(P'@ ZM-FZv(n y|{6k bX,fCKda`*KlfDʶ&O]]͟bI,\.ALI/`n2 `pPll{$2]N]PA E1jhih4"ۅ{nSԸvRA|ax ;6 x Z' E EPLDsSL Iiɕ0 ֖&rd4Pbh%MqNBax \l?aaa3#LD9qm0K$2E2h B_>EʑJ\.AaX*S0"̦V%20 KdOӴaX&W0"A"$Rx"ox|CX"E9\ilm B@(r$Ixs8\86%RRdl |H$ۭED*bA.aL ÈX,7ldr7X뛍34r8"鴻NfHT4m&)Z̭I4am,,,wCYiqk7 0 čS!0lamG٣( q <<ӫ/対%?p|Kpcnp/>IRNS"<޸ ݗL&Q;v Gg4p8|ap8N<A$+KWXr7&-{x}Tz֐)2[s E"J]}Сb{BG'ąS$Pp[a1cFmϜ9ߦAohYm\ B z}f :1 SכLfjLAPyy@(0LnqPwdtʁfcUUU}O|ӫ;wp8Q_ض)3'~1a¸Ą6hZ׭8z||\EBnڼ_'?xg^ @`D"5"_˽_]쓏>J%/0 }Nʰ>FF #8].>hYV^nZ"qXX7nje2 jqܠ@Fx?)Jkjjijre25jupp0u.(bq^O0;V˻a\./..1Z  h;a 0Lkkkee (P]Sv"atT$r\14?w8.k;˭6D, D$If_ը` j5ݟ'8q彙cbuZ*-+X,"(,4D"++P*AAUv̙*w^y!Z'8(P@tJ\.khh I Fr)bVVVvV(h5|^XXT* FNb)-+w:$$8H*^^dg |||P(b$!RT>Aŧ+*Xqd 'GDFUtOII?&IrР8Al߱kC *..ٲ5#>>.,,t 5rDCCז~А9sf-[3/^7v4@R>PWPXpع65"r9NZ"({Z[slii=tp{pժ73 Sb0ǎOjKϟx}T*}_LMbnөjFYQQIDAAOrrS)_/ٹkH$ H~m̘: MQ԰Czrs߾O:S[[]9e!׋NvcwmK(7oZk29V]]# /_! |q=VqP!}a3g^grAxoǍ!Ij*S'ժ[~2.39i]͹ΝN+6!Bƍ[x puuvXtP |EjJO Ü.ufZVZpY-1Gl'Ox<jKϞ.gm]aCᆍ[(xE$**r/p8N_ZߌƎNNNZbIH"pW vɔd0 3j񏊨cu3|L?1#n "pA0l`.\FQ4// <(..yݷD"at(,,|rBPX_cÄB!h4q1dHp1(ޱcwQѵ^_U]ΙhdDDtt++ᇟf2N0.**jAsN#뙜T]Su뎤Q V;u$Rq|}n6SA 6wT^SoJLN3MR*f˩Sg'LwZ澬Ą8Z}''%WT\vjJ9l`Dl0l۶f)7mw䞽q#G o1ٛ_AcnjfhzWrrQ R4_ZցC/+(oljGV֡WrnjU^Q4}?g9zhLTdTT$+)-UcF1c[;j;aqq= 3e%%% z#&ͷ Q $I^v(z<#GO06))$3s\lK{橤x1Qw># ܼwᄁkZ2nh.{z~IgΜ۱swjjJcFEDWbv9z|)=kjjeHL \rgJL7|>}aCv{\.o'hrrRBBlyں;v 2_Z}CQwrWZ[ںuGښM7>NK p;uÆMQ85%Y(  (Jo%16  ] [ӫW@ `g2B` P@~2$I^^дq8Q\.7>., ˗smV{f~JK˦OHF APDDbyyʕ\y!+* @9W+=DTBDdJ0Gm;\nM3D u>7B6nڼ$2Y^Q xtÍZ{:m~~A%0߱'ryEeZxCU8Қf(ڷooK <4$ItqZmqqƍݼ%P(LCG".7UB?x d oDGڵ{ȄcO9sC0WTސ){z0,+BQ4oU~xwFFFpȈpr%nۗERTYiI 7nS?;x@crr9FqU0  ~Iގb(Vp;d\/x[k \.gr.]һw/6lP>t:RIM̝3B FGE~㦗^|zqɰjjs!bJ-[9wak  ^G)kjj>GQ4]ZV0!qrnǫ f͜. n3xW#b@'MRΚ1]$z+EQC 1 xpa nm&nUz~i0 o۶uHl[k@ob?0dȠfÈC9Φ[rĉNKv*B!EQ}Oyy剓Q(*,* @00A r@͝ i4j#I.[^0~\KkKsԩ3yW C&RIS4mmͣ.q0CDoHնoAM?piB1h`DGLs/9z|/ [u:]<$IXX;S_SQ4a#.WY]=wEinjx=Ss-X~W:/zbf}wʄ~i}_Vv#"" ?͞ljwxv{@NwjWf"\~Qєu⋮]j5J2''lr\nAo>yjZVt7Q0??}ZCH$X HLt]{&өgK :68(`hF$wӻצM[FcaQQIiYhH+ڠϝ!!!&DFQtWs_jthܸqw#r:AZ677rJNk4ZƬJ| 11QQU\8Nhh=F'Ikmr~ 9P(׮`4 kjo4jl6[K7JM :~dڛjaXXXj*e^nlifM\.ׇaoN6oqߏY[:-Ϻ M&ӕ싗YIrGNojii}oR}|Cwa#v-xJDWzLÏ  ÐR4iš5LNJJ%Ӷel_?8\aCDNp8  ~PR7l̳Y[!!ں- # oH$m"h֬׬_АxȼsK^R)0~^p8C6sfCBzbY3^%eɓ&$ߨ@y]@(<ܹ O=8 ^~!9] IDAT!A11Q^Br!suB̟+NFn˘B.Ǻ=EQTRޤy絯.y-((pޜY>:wݞ 0}>L,}:<$(0h! MPTmQÆ ٺu?IJLXB@qc6o@P͚9}[e'E , {g޽R=[CsKRRӼft.uhTR<6/~e {-uU2AVi%Kܫgn%+*׭K/,2c04II16I&Y.7o6aؘ?u ߗ4vkk?G&3o?~ħljjRT--;v3pN͛]nvZWO/럮_+-/]Vkj"B8Nz%**Ҳrp7}%_>'W]NAfSknΥg m0>sV$ݰ>riuMNh4CցCj mE3Q]ScكjjjJF9͆ ƌu˧UTVnݚa4^|+WrN>و)\SUU~Ů#<~DDXIIO^ S&O|BH*LNztvuCVAa}#F T1܉UT$ҋz7߸w" 0hÔg ӻol~ZpŐ~6.zbbq8~w).a_!((TW n,,,fWsyEE^nd=fwi#'7BE0xS&!/K(x7`ƌiW#+khh?^l׮Uᡡ?@.yDWjd2իsczM>>ysg O?2&&\gܸ1>}F)g)d20'Nڟut ,11oK^IJJ3{/kCNnZ> O?ޓY__yV͞?|-UT`aVc1[mjlݞ/B0 hS {m 6m[Ǝ'OM&jkp9\->Rn0/5MăXXXXnƦF}pp'+/<촩S}ѹ.d_z_Q%ŢA ,f0n~nJ$'M3{V@?㵵uwZzհz}6o K4zHXl6o V1ص{#a?~7퇈ʪ*Ֆ(`KKcO\PP}NE{jFGGfe\nX,*/а;vҨ$ELȈ;ʪP(T*Non1Xg{۲5C(:Nm6YGu}xKv+D$KR[oBHpM x 8Dۺ=MԾ"s_\\sLٝ{M|J$ϲY:::>?Ru>q;w_{\8y=Dg2~=bx؂sAL8(;v'  %,&vLEq"ݔ* Qumlmƍ{SCD.]EQKK3XL:dȪl@`4}CΩS&<srr p41dr+KKʓK=bdwrrRCx(gg[W_{iK1'}<<t:ݢcg vbiaAKbͼ }4fv7(i0wݚYzX{{ާ͝ `0(AX,Vl*=A77?:@yaG O/ݼbSR.?6f#I+XﶶQ|~РgӪc#Ǽ_ >Gbp~AGGglOw jZgΞ;s\wwAsٷ &"ukW:uVOӧO0>h_nz톑yGWv9?x7'Owvtzx}GBuS5ii7659:8ZgRtēZ&""|ΜBD"ٶ}gjZ `6mƜQc& yk: l۾]_wӏ#"Ç ȳ[A[OJxX!$ ;PRZ[LMM޻uvkk̬7|p#:ul9ROFGG͞5f۝}ז3sD$;5tDKkk\ܞ~]{:JK˼<ׯ_gmeE+W:"b&D_vO\aؔgΘ=spWu:]D襯,r9[~ު+**vAR.>P?ά(((mig+ :erY䘈sg ]ݸq ͝3fkCGN:?xW_tήK,ErҔƞO0&"|׮\vpBkk1_[`0z[ŷΛ;gz>?ޮ{k֮Y%~f''wYzdJ%>o1L&6߿_0`\>mJذP?<#P@m"FdR^Vk~ۣ-ݺR¢ȈÇEZ捎ή_~wʼ}sή\֭斖];}YlhA//" 4ȑ÷nj I.|;;㶉D"\ض}'I͝3Bʥr@CCX,޻;uk e޽bJҧ|D%%VtNG23SS֬^}kiiYsK /_]`[[ZZU'N ;O[~*?߁ǎ븸$?dQh4rbB];ǏK<~Ё=Sy9gFϗ]LIbZ ݻ?ܣ @;7nZ|YUT@ʬ;UU5l_~H}6 ?jkcw~V*ǎtww߽|#-,,mg{}M_ mƦfZ)--svrܻ;ny_o;.^ ۹wֶSgΜ+..7~Q~=j6W]{utt9rM4V,_vVWW|===dee''_\0Ξ]qT'N߳k^h*<== z}{wbi{{V%I}UU5q;[:%_ZRRk{Z PeZ-a;nlDgggmm/տF>lX.}eo@`$HRR mni1LS(W F4)V,޻AT<<_]Jsvv*)) C 0*-)9"pA\D"ioohW^YdddD@x00 _Ryy{665665bJR0 9$;!ϗMP]SCicHdbO< Z[fLڧ_Y(߷ѡA,S&x uuҲr/OρD_ml, =`\.^_RS['̪Ǎsp=kUT^^Vkll'[`GQ޽$I8@Yy&&K.(1TpἜ sVccSiY+mmm WhnjVA'视4.JJJL^A% KJJkjjml_IBpacc v Ro/+ɹ\nHc eBc!5TR$}qc15644ZX_~Jd6Vo_WRZaçW- W^ZfA(..yRUMͦ"ѵkW.\Р!c'HSIm/p'I}Áqlss~eY1,--:::E%u V%~y<$KK\]]3m{J[jZYgg'5?!=#+4dheUumMy{H$?l\\xi2d6o. Dž}iwrr@8ɩr׮t{ϟ{ԙLVddoi;;ۼ0 O4zcSHQpJy+5EFcmmEsfϼtJVmAX, "'F}L뵵75;vq8RI=zyzٻt՛8;9zzz:}PytݭfBCΝ@--h4j2pP@@CC}L@;;[w# XLX"6u2UiS'<|斖ӧ?HwOxDl;x:>lXMcSF.NAFmm8َj ~BN:X(x3Ʀ&ROZXS{?=~o/6҂aaqomϛSW߀ :0 N85 ܂ VV^oV\^]UM%<)Xƺ5k+)'VUU33ؘ ZdRSFFFG9wuwt*sٸqcQ urty $2(jcc- Q]jEmmudaLh;;[Tax3po,--&Oiu8 l#DŽ4ŹCD(;;n#T*iS133[zj䉕UAشw<ɜ/\`H| ZCUj &&E"y|KˮsfϬP>`cc=16Z& F..Ώ)elLtUuT*32⻺8S#c*Uj@ 05Y.{yy boot"CQ^^ khlr8RJ+W,`2!smlmÆ :#ϷBU\;=ǛzFc>C"Y"33_nc2Y`t[{)?xYvVm|6>;nWZVjOUUA\M:jֽ..6!mBa1"}}q o>u%S"Sރ}\43-T`x>t:~ ȳOo8β #}K/q'^Luq@*WL͜ʺV.9nX@/fG˧Orwr63|hc3rp^qeymU2 BIn=I"j(Ae=v?nx遇}gcNCGGg׮dX-Ur.{phܸGaeeyB (R3njxnc(:̒F ogo&t3>:te|. zDRbi*R$h2%b32̸7X4d00:ާ&IR >%OS>I$Rt:P(IJ: PT4MRdrL&J*EQ*VCNS ZE1kp 4Ni4AHT: Fh4AJ%aZ$Ipt:@``FӨ n.aԟj3  *2ķbtsζ/khy0f1]Lm-E"C%ݬk8 ^YPƶNsOIT7-⟒o qmt^l W22>Ꚛݥe\.wc"Fͩ<T$zIwijj˯KM-Z4dJ>snT 6mq;::fΜ9sn-?ZXTd0&DGMqSuN;À":f򴩓R2T*СCϝcmmUXXp,B †Ν3t\K{zBB Q [`n{wmL.J$ M66+^[6pD"M˳I/~R!χ0L5*=77 `iiXjZչZŅEű16eHdrUBŽsZZGLpQ.ڿ?[㣣'_tMMͭ-TiS;{3w,q%R)`wO>::: WM6 'K82O?S昈pGGECC_ wqvvqvhf̺8 Jh!r_!uÂG{:jB.,^4?䡋ޡ)t:\.߃X(76%' o (Pdpg At:_w^T((Q8᜕g&((BnO<~ n#Z9Eǩ~3 aЩu$I 4j? O}m54 " =zڭaBmmlɥvY`dҚ700`1~~qrr3hmkq #f(prs}|kư`SI4~?OVjڤؘȈʪjO:/nuuSK*ZB^|ƾL>Xh}B* ;z,+(zx;p4nn8oޜܼѣz$dVV,&s)" &ne+v~C,^po']]LGI1SN!~r{ a0}ا2VVVUT|q̔UjZP 461?> ~!ȳ u ӦN@ P^vx/ݥM? vW4ZhI( gʲs)*:ecfR]6|m$ȳEK6lvf!At e2hI( g:o@;@( , @ P @ O3YUYE0p?GWWWEEH$rttTV ]]])=== Ņ::.He23u\.WUUI$PL@ P6Rӷ PðQaS->}СC;w'O655###%ɩS_N$o\.ONNNNNW\V\r *q!!!dddX8ZіݿW L#DŽlBq~AqI)qXuQ( 573C~Aʕk,Q,م q*޽%qXhQ(BphАA8V32k8ΐ!vv(tıcg| ٙ;wTWW ѣ}}} իW7mYZZz޽ŋ۷oƍf =xCZ[[^:qĈǏ8qϏß ISs~w߂VzxHVd2EEE7nғz&qNNҹd@Yyřj ajZT^t%+6ce_J>!p|\.0[W\1F]vT@Ff[ZZL֝6aX[[ZZZW^ra SZ[[۽wf͜@%zyy9R(lJDL?Ǜ>}[mmmZ6((޹sGtuuxqƕQ!/$SL4'͞5Z ΟO:N.] `mm5>jUU՟~ӧtSvtt0ήE {{y7|^[ 4eDq՛R'Mqsupw777gKNSVU(ovvv;wٳW\ibbbw߭_T*r 6Zthܼh(WH$yމa5o'P1,\8T.^J23.^٩#Lt0gϿjӧZ[[i47o[Z[W|M.Ϙ90~U+( d2O%Zcc{A{;抢Hda(ɩ4= (4d3eղׯ/$I644$%%-\>7nѣHsA(j'DEQi4jJtiZǑ'0VM0Z ? @honmm%+[0ϝ3oάҲ1lXa>xmcccZV`$04~!=CCP ҖxRMLKn 'R=wQC ⱁ2d޽{_}̙3i4Z^^޷~3eJB!A---666G }Ml6UWWZYYy "De%I?;O Jz/b$IJ$R:9增JJJ32wvv1 A|ޠ'N=Rզe̙3̬w؆ !;N{p„(En V'N~)3b[[[S) tP(O<<zD,XZZX={0ŋx\ǧN|lҞ=tHу`>|=>3;wc##JKF|#r _!T!ӦM9uCGQq~P8ٱJ<[l6{z`dgggggvaoo?k֬Rn3gܻw-[M̙3w޽e˖iӦ"A^x&DGA#޵u:v0yyw2ǜ3[;P\\AӦM1  N'hP('*68(hWZMbɳII^_w`TX@WWSgCCC"G;s6XUTVo\_Aƍ{w_dƯ#J=pNѣ[Xp,--chR (*.?wP(422 K8zLR77H>WTʜ\PԬh*JB.8>( ð)'r\.kii.w:55, @a B)ዔLM|^wwwg i4\(X,MMMa =S`Fy8q A*X"(@B0,4  yG |jWWWccSKTbqq?ib̈aj :&ɨM=hPP ff'_h ^<4c#L|=N FiGQ={l $)4~|7l )@hHpАrҧS0f?Z~o(XLw6Q-$>XT"E't:@@^dak+yx@ ߀&@ (0*bP(ց@ EVըu _EV32!#KKX\QQ)q!( TzaX ͞4)ZyIxJ[[E Zmyytvv\fx8u[\Veoow^Amm@`4iR1Iuu魭m6lveeUZz˩1cH|!dKAYȿ \cg͞5сNs8??_]8av媪/^1 ϟ[P446hggÍ۵$Iww7yʵ2 1@5 yYI:`p0a N>m%ɔJ;wussL<]tuwT QFF֬}5+*d2ټ---<=>˙3&D0Gds3s6%N(+/9jԝtqO7lƌmmny o$   ÖƏFd{ZdO>Jwwwh4Ȉod X[YrX,I8t<^騫L)U贺yRQ+䊵kWuwwFҋ2 =}A0@0 j5-ۑ#>}v & ɤho>dpNau}0Ip9f/Z8_(! y>kw"IROmͰi^z yfY~aNNjxl77W3SƦ\,:'7oOSKAaSg<y͛[r3&DGV@u3XXr NNu>wA1"G [[ؘh^t.977LhYo]YvU}ccRRL&[#ȳ$xxIw fxa#GGW*OOOO[WW#@a@ sJzX,6`cÇA;@a~"@a@2]wvxI8 r4h?˺7xa W֛TJ;iio[7ޅ$_nt銕󂂆׭qw} IDATxČ722̝ ASS Q1x<Z|T Z޴+Cq;w8;5Pи|Rigk56<|bb&Ʀ_ޞ]xV=|8F(DO0^RO1ᘍ3 a0:.74X[Y͝3s oݡoݸc|}!tF99:̝3k@鲳8xjYC4ZͤIΜMwbc׮gA0@^@bR|H$LJSRTT&bDJT*^{W4R$ ק8yLYy_ܿ_p>9H` s7Iczk]gGǡ# Z`ohlLIN"I}EE# |>oBxFp41"|sɡ!4 F GΙE G444__]d'' 9w~3o~5RΝWWPT*S{{{mmZVקgd }Μ=P( \фCZNN66n.YYڲ^ޞeqqu1rps@GG ʥdJwASSS츝-[YZRcn ?w (©gnӨ0Jjo Ef1ih}U:;;ξ' 311O8vV*b..TNL|!ҥ+===kV<HNNYvŬ,/!vҴ[7.VBN5ib B`Yǎ/)-28`NNVVVR p+5bĘ{P强q<=zϛM=Ǜ@A/MhHp}ccm]@`֞w72r^7djg$x@`Ք%i4Ojj$%_xAhh0`hV{A -G&h4z>ŋ 2d21 ]2453y!k 'BgϚURZETiW?|I.WP߸e!XwKVZoNE}C1 DJ 퓳盞izu+O455.?//#/]J\Auvu]vmRy [4RwFH/]NoA@ 4$Y^QP~uu:55Uݻ PHdEeU`WS[G$# aee9qbѣ{òffF(,*TVV mggkdğ6m 5+;޽}(qȇO>9 }斚Tѓgg̾pK &ݽwp[`3gQz0ܜu_S_PYY $bI'v3&~aaQq7'MT;ID9*<+vFF;9nnB!&3A'"jT jb @T4dpYYc\\tro tA"I(zNsf̬IPhZcc'UֶӃZt:O}29ݻrs1L ,,MNnF vX[i57/ z_߽tjSSMqqI@?r;UqIi+Kޫc'zyUß K0Dј;v]qJquqp1ƍ[''"_&'Or:9: himSxXXc'VXVZR1d`*O slp XtiNΆqE1gg䔞7_pGD_tPaW^/..fϚk>@_,]&=1}jQۣ/F 5ȑ: HSG=kgckyp0r?X|D*=v!e eA(L/<=<Q"I=;p„#ZZZ>s  $Jv.2ESSǕ+rTn̜93n`0 0Դw |Ο``oaaAfPuss˿[V^[J.6g雚ȈѣJO?#;顪(1"AQJjO?b#>?888|''033]ZV{[ 5mYiIcC@hBdz5sx@ yJ%]Dwvt=$e?CDXLq>OBv[lCQ(rb1ZP(\i1 >JRRa0Tb{GH' RVAPbY,ټC03AR[c P(t:MPx\CVR)˥6t:LjIb8bX,&72)+ I71-T*Nr===\.q$5:EY,6"INd|>AF# Ba8f0}D,XL:? 8q8*3u'P*IvK]mS(~3dĉ1GqZXpww^zuu7uuuMKWnxuᖭ{ja지 ZR!G3?βo  >f}c0tj-Ix<;cz/׮[?ɧz-}TQQkl4˯qߵ{ϠWYW^{#)%bۭEyEňR)cO8u\/W~WVc؈:4NrK>'s߻NX -8ںֶJTW_ݭlkk7--55v cMm]YyE]}qwmmV+--jNVw8pha]yV\l6_$bcN7q$~)'uwk?PUUm2&H߼u{SSKΜ1}!+j4>x T:uEv_(=+gm#Ghkkhii)^^rSg_L*^ZZXUU3bRKCdɓ&^:Gbc""y\Sv=i)Jepf;w nni8@$^Ə{׻ d2_t)%%窑^o`0Rӭ%= ghll7v̶;=8h4?sNszL8""o [7T ðfjll*XxYqq1^L̔IO-t:Y2B<^\|鿟}9e$өP(&M /\99#^y_\͗*p:]8.J~~H@P`X$KʕJ%v-)'ΎΠ@X,F^פ¢ك"o\xggټBa:6e> cbl+!>xge ܾ}O<())eEՌ\`YY*,,|ǎz :mdzJwl^``@Xxhࠑ"@m޲mW/ SKI5#nqwnhDQ411䌨C<=cB\.  R5[qӖY|xnYYiLjcG[`0Æ yŅs]NNN]?555ePV&`}!!ʘ^ul\ ͞ Aa8 ue `tLJ2 `0hPW߰k?Mع, EGG\&Ca( HhhHlL Vp:>ޭmm!!F \ l4-KhhVq]Q[[|길IJ$t:\nZ;3LOK=~VTjb>>>)IINLH0Y2th4r8DDkhh$'%&&x2779|awtt/>ON~?L6%6.f=8q m[6 T ;А#Z맟}ѯ_>CzfC{#~B@XxhPP3>İaC P^^^\wO-xrmC|srFe~]ºdvoWiYڬV ?◟1y~X˥RɃ5ku}=CڵT*ر 9*,*NMI~yյZ6{ Ǿʋw:xșy$+sᅴަÏfƌ՗@iS ƻ}asbgΜv}}UJٳY UR0VUeULt4JJJӋ/zm Ie2)Zh4r+3gZ|~bg8_׮l[||!ʶFTNQԙSǞy[6 rc6tZZM't}{Q\|#3O Q݊mn{9%@P(,2''MHHRمs\T{u:݋/R:;9hll!B$+6+  HLL"s}|߂4U@b@ #>~2T rD (rBQ w q:N*BkKSue *m~@2Z *ǣ>:gCP1@n:.sP`( %nptJ z8c-VI䏱X?g GՐ$`  A!"*@ ,O:sϞ}Pw6糒RBnw+&!]E`0e#WC2TZZBaީ8ίf5k֬ݼiݵA!P1@(ݷc^=3L1K(L8Gf$g4lqϿ,_ rҔwnr2cӧ(o"oټvlÞ_vn>IT!bXjt:= V(o/rFZއrR[[7oafAh___OJQV^ݭ9{\&bX&:H8*0 cmF-[( wEm޲mTHO{>t:g[[{uM̈́ゃ蟤R߼e;oA<2fnظ97!eQQ=LrMPT ۃڟf3v[[6mRXTQ 2xH@y Æ =q/V(3f6adH6 &O$cA\8a!!*w?`EAAgL.P2wbr][Soy~}CC8{\MuuP` ZjuggW]]Sc{Waa J#..fذ! OaQw߆b3))>=_2gd/zٳf3͖gD?sI͚5cTH@DDx~/Jfr.2~ ۾m7 T ;Yf^c32_D.|ƛ1_~)μ\}}|4b@ xPw3vhT ry PgY(@8VEg ˅\PP1@?( FaX|W'㡇}クp9r>Z#FdpdwСnJJNj6}e&>h@  @b@ T 㹧A$$yՓ$iveN%T Fh:;c IDATM&3AI21̓b펾6\*)7t0 .K[3M}3;~ Xnl P1@ڽq!3y8N==ruM]KK;هvjJbxx8qhMUVWV77ޔcFȼt:" 6cu\o1<)Iұ\.h2Mp;"#6f\? 6dwk4"Hӓ$)^r&v;F R[ᅢ5FK(WTqXl0rU D[{jEɤRXDdk[br9( LJQTwFӣ(%I%466sd2BUfϾb6566@8.uGnp8> .OhhnrYf6[5&iXʠv-V[UMHsɤP-1@&8|NgMmbqwKk{FfsPvD"w8 iv5 b%rEYyU}CPjiUkzAZebpm'EQI$Ixܛ;4#[Z$0斖Ʀű]EťamFvKefbwui*jP ̖vz X,$v^qv@(&I]aڎ/1B|VghiiGT7M.O ) J$R9IEa[*vUյvGcS '.lpQoܴveoB\ wJd2jMKMH \.dXliRl8$Ijj*&$_ZT|lDfGEUuVЫ>7 6&Sb)"pI D(Q]]TwtZy|WTuwuvvtpy| cUUׄ&&& KJ 22*<,p88%d,Zgef\T Ac>MDW鼤D\.OKMc1$(˽#CцT@֙6! GG`k!bl74eeer@j1$t5Z([ Hbv$RFw2( r9jr\QQ,6f)0Wӭ].O'n2[BF c|:22d1P  DNnwXJp؜;EQ̛WZC8NJJb0$Iqw`PdNQ3b坷X-$IZ6@!ߠnwOc-i1( ,,,ծPTd60 __Q!b-> /tӋDpbahh@("Itd@a, ,fT*s]Y;28ˍ_^" 8J%e E]I.gjJ69_-Jgg b úÆ//p&1#C,6 X,( Q) v8\/r8l PDGs<aY͙#?" Ӓ{t>7 #M(31ra6+ˉ8`åH*:f+sF Y-'--I 9^g2iZZ jb@<$ItvJi_ݸ\N*7 ѣtwx,^).STQȬQS[WW`H$$pf|LF^ޭMFJNn]EA+6,O+-p6ƦVW`PN:\JS;LޟY[WkX즻9|XII)l=) #8(KMIIe228H.NMKpX)DD"#emֻYpp]v޻{ޞ)I Ə#\oD%%۶0-))IcFІXѣrT*?$ 7*Xs BᅱXL&Fj#I%0(Znۂ@.Gf *>?,40|  ?y\&g?8r2RsKklK-<, 6\N$EQW,>!͐b B`Yё]dž].׃2طj8 ;;bW_JJL8wo?ee--O? (0tm޺m-A^RZﯞ1P1=-U NJLs%sO\((rǎ(()_`;_~x?rҲX2p |oMm7~W__Z]S;oDGuuw/Y4\Bcgd2G0y҄}>ð1GM<})w]qFϾwL&_xnnpp\. cF@$y^QSw!^ȭR vdl69t\R]]lw%KX^ycs?˵tnlo|ժ_W7^=zXyy'}{XkY^Ͽf"L&Aꎎg_UU=Gnf,d2Qݽa㖑#k޽$aXVu@F?\t'OAIJeȤukW+ L&Fev5O8q. ?s??inQ0 ;ZS] UV߻K},ojb(*JL2zr9IRi)>PV&acF|WrΜ9-4D HvvU55)aa=>)+Vű16l7nLRbbgW믿z/7%2$byR`3:G(N8n]zknnybѨQ#;@N9;ɹen6s}xkn @  F#ܹX,9lNNyzv䨉ǏU0ѣG-hQwb`09c&Z,ff6n\(d21 ǡyf\.o0ݵf0t"ۇ'Bu'Nlk].8JH$ cX,)MiaNEQ`0=f2\% " O>`Dp^7y߿{+}0uqc8:fcƍp(vwwwvvJ$C\A:wnTΈ:v͍MN/4[$I^Oap\PPXXA[q|~iŗj52=*gРL@yE{MoLTT'fL]XTLՃ֙mՃ[f(;J1=deܴyW_/p8nnݾ}GBXؘh?_ ii)=uCbb-[\.ܴy={8@|ѣvu!p8 ƽfSzd>>M3sƪk9NW*Anwn; 0 bɧ|] 3rj^ɤt _}) >>cx{_RR>@``fSw2}}uz=IϏ$INk0q8 is\1|͎HMM@1 ScFӊ-*O<֠ ƹ\rcX^>"lP1$%%swCNB|\eRw67@ @<<"\,}\?&3<<n X$ ,99>ݚԔv+l4feZy0̲_?>7Z|>q8{>(+3ȝ,')P&w0PZ῟y!oy6(8c@ w/$IzR\NMS N  nmJeRRB677&+/v޼yۂsa#ܑ=ģPwbhnni5_|0gg͙a,zao|dd_(x[k###2n{k)XXTTأaNŚws7o&I [CCkKwŽ;*no?|޼ry^{bv:!!e2e"hٛ7򊍉_k @ ;E1a0 ܱcA<鯼jqaj=Nwn\n"x\. $IFba8W^dwQ G7L&ɄHt{`@Qrn7D VP,p8,Mp8lXktWW7˱l( .dbZ<AN0ݎPp&EYVye?Vb }2Lv` EBvmǙ3y} eeͺgL&YdNmhhLOKaÆ 8q~Q;^mJ9qC|{})6MwC$%&,nIjj򉓧_~7f}?a2Z0Ϣ{}`UU >|ؤD"aWwʕK*Pirŗ_Smbdܓ{[uŗ(|>Kӭ[|&@_hվ>>3gNW;,],JfLF;@nS23|qGG' >.v-CEKI7FgYy--K~\"VXտKK=1V\K/M_ګ/pɓ7_PU]`ЍZ;o٫rRoohضmGaQѐ6lBQw~i0o|I&X,?X,=v>wN?| /Wٻ9;~`0-ZD,o{]n5rzvgԨ./R&吻W1X4f(ᰝRI[o&bbc蜧Ϝ:t ܄!22m1g ɉEEzĩåk̜1](DGE$,,tÆI477|:qcE"QsjjFdgg{PWW`SL=OɿPzr@nk&LG(J4 er_.EQ zߗzA 6lHbBdX`P7 *Kq8d2?`9(SL P+qHz5@BQ\S+B w'Bk?rİÇTW(|7N钉 wX, .28EщM:Y k}\NFC$'';k!^lظlTTTj7Ə;cƴ~nu鳝]'NFGEB/-[:e@FFccc :1RRR\NgiѹP32$AGxw X4=Ȝ_xꙅ$Asp3cnj~}(==l6 uGB1y҄k[,31lQ)Iۺ -|rEEEΘ>z7n̚5=+2O?ttv;L&Zoy;)bvAQ AAAUm3=+sin3AdeEʸ;$4".!Ũlkb;fҼjcYL&(v1ͦv墨Q5LBAqxBn7p:|ng2,t:/ A(r9\?>zn܍a]1u8N( 8op8@6bt:rP p8,fw\ rY7FLT?? u[T۬ڢ s/S}`0 AfC{u1–]iaKݫN0=Lfl'.=q8 >W"(*x^u4xn.n? w:PwRROZ;OKMu;45BQ@n:r+;?||(ȭ`ȑ C E< :w@ T >p) uU76QqIPPT WvifE Q(NNj-h_#x\nYyդ(p\._ p\ezZvxrnzH/.K>}ԛxU?ۯpn }}|(@mm]XX(46pࢿ_O܋'(* ZQQQQYEQTuuMdd?lڼeҟƌy?~}\(wʼZf=zMPP}s_zN'ɮ-`0744 %9'p IDATo@$K:;͖š!$IVUW<@f"QR@28844Eђ2ALOKMMIvj5MR$66Q^WWv::: w:6o&]l7{qѠXqR)`0P>90)1/;(-+_=bN Bp%e1Lee]]ǎaeeÆ ]ӥe,_aŪ{74vb%I͞}OtTO?/Z [o֮Ynƺ0 Ǝ2yR[{ ZZZ<I'N;s>hT 1MOIOxn o㱱=Pd -yODEE:Ύ'9&BBT?GЃ$IvJ,..ɤӧMȿP`2}|'͛565/Ǐ_Aܓ]]#JamJXY1pnqK0[,!IV&^7p;$JgΘ7M2"g>\_pSN wTJ cFEE :dW3L\FwO1R FppHo0xZ2g?p@aC].WLzgi2npC/YTo0?pN|J^_QYm:qAr,!1p\(?QXXhuuMaa^vCb _?p8*++Ã{or2L"\^ INj t:EQU.q|>K%~ށ}6o\]>&.y>>.D^cNᣎ=ֳdH(ݭ/|i&9fd0s,̸|IJ11Ӈ˯u(T"8t0 P( O:30 ͂n p)j&MKBCTnj6sIYQQigsKKaaQRR"ml9pk>svѽNr(644;:Ns:]tN>#b% شykrRSRS\b}If9}rhT*G.Aw=@E>Kc`O-wZkr9:Fi t ANo& cCDٲKBu]C=7nЦn7MW?o߾SPtwwΞusb^ȿЮ`a'gΘ[*4BzQ@,%%FOϞ/|>9HӦN6u u\=y~+Tճ<ճ(/_;؄ܘP(/O8pM/Nya&9uʤrֶ1sF匄-C)Eb)^r:N(>̀2JLLLnJé@ǘz(2r't(ro݄IAx6 (ޅo`#A _͚{?mii^oٺ!P1@ @baѭj+,*JII`()-;w&0 :uټsF>ȿcq0@ZZڄBD"7bjްGFQTEE兂Bd2O9;CwwB?ddd\&<,F"gf .xxӅi4~0n 燨Uմbض}aC$bT bh7 KZA;%pL?V*C 5:&nJGP0L_XھcBq:HOΒH$/:s6DV(Z6o:D"?,1}J ӧOh4bLP :|_ Q,+++NgY2S[$'A]Cgǥ?_,,~gWyέ_f%kOPPد_H(N 6VXm]=   *Ʀ BU :&ҟf^,{⤟\CG99p 9)qI"(DO?O o`0DB>7n옸+WT A `\~]n "1+/z!B bp OΛ7iD KJht3} ާ._`ޘdpy_(wy| M=nላU!JD HPp ˥D+^I\n\\ a*"):&6m1[\.9,:?l6;J+W@n?١aɲg;kfOlD}< Ra,ݼa㶈A"#C?lXAqp$XKpzqı۶ UDi4~}n|!yyvj6eppJrBKK[ҲJ Ə%K&kjjp7aҲn:0 ].$֮.+4-2t4ŗ&D* TUUuww:\$ ]@Ԕή(9T.†x IEQX$z酅Æ aXnףz9P Й/E(zE^]ccO;dPtlv]ݡR*, CQh EQ83k7(J?nrB&_!Cy'>yu뷼k.b6vvup$1lXv``IQI+G n1(:Ó$I3vL*;tP]}sLt` V$$虻juqz߷1.6$IYeEťǎjniijjퟞqbaiyutRRIYzCGL&!C}ϟϯU]]ӭю=5q1)"lPVAfn1 "N :${=l6;0(lۺÇ -X(iT!*--;xXXb9w>uuu=x?}~{Je0|L!v(cPn7 (r:[ zFcs8VRq!n@ i;[|~rr2r6٬>/X !!raMwGks}- V(F]DDH[Z A! FXj6Adyy)A[Ē^eR^hoVhRRɠ󒉭V@ 2AJY.]~v6CpF=L7lt@jj -1##seQ{J >_ z~ ~W)//R |+Vڻ@LtX,&"? D/=A ߌ ?EYE@1^.H4[l-(FEEalb96)AQfPBQcƑ=BA0 D(Pbo0pvt(&\.']C&HjR||ٳ=ϫ0%%bllLllL)(\hm]N%]N'y ;Z$Q8֣e۬/N]3s;wbs9ǽ^bZY_wb|E4}p'Ry5 @ 96>wQqذa˞7dX C0lZ=&wPPƖ rƧ?( 7nXVӎMNL7w+LprPPjUW_qcKgC(r I2 V967#(a4q  +x REI`+--ݲ,0ݲx$vM7TTVV :Ŵ "drXV8phvѨKKP*Z14-6r~@u˦q: HRO؞.Z%I"q֬r8L6Py'j_RRB4*T2fٌFIvG,TV,lnߤ" (E(s ͤDIO5\0 Ь,K6x,,IZaglN`aY GKQ& N J5 ò d9T*FyYI$ 0a"E$IastDIjʒOh3yY1!YdܢI3IF`I$IӦ E C~Sd4$I01ⱐ\JcjT(Y?K$i|…E,7/-(H$'˲, y''wb 8qYAAA"KSclˤ Q3l}]m'&)bCx< 8Hq/\SPwpy~@8yWzz1|‚`(3Ϗ4}SPAAaIڻ2ٷosUU bmܰ={!=S_=^z66:>>>?wݡTKT'. $EQ*yN%_y啃_/a$TZP$uM^00 (*HeVu>LVfB@(8gX.WW__kw8:/d0cPq7ޚ N?}1 #) pqr==fWƙpA@]m ~lwbbG?(VUS ss+^ٻ={*E.#a04h2WTV(zYUQO61{J^mq|VPH[ⱈRgB |'}yCݟ{D~-7\$vH4  AtӍQQQv](w 웚|ٗT>sr_eU),MT3Jrv>, ARΙyMןu# ܲyrX0J9!~7l=魯}ŗ z}6}󭷋>ܳ7T՜ٙ_7=#voc]S's燹xW^ϻ.X=>p Mg1jؾe¶J#+ M #|?-e^{;wg595 er10 \knU<y1d##c:6LCd6u:Ĕ Ss<]Rh,.NY-Ecq6 ˱E‰)VJ&#qzN\.K\P8""˲<zŜNg"$C#. 0rǝ#SSͮ{߄rO?~|?А((Tt|3}Joh]R_*BRW$-7 <$ںᰏO$p:]k֬inLDm]ڵ-vE$0?AJݞuvUUUkZqtr6768qB$bo`p8b67^܀Az1Jetsss"oppDdt,hjjjY\XŰ)bh `k׬mjz(j'&v[l2}):t{={&}+KZ*h.(N644ٴپ$N7t:FDqqqss3MgV C#=N3Ԣ^_RۭtRV  xNa5;p.VWWk b?wp㥥%￿9!2L  vdM꧞zxeu/R>ge9.lnߘ7&E v000|u-ԙL TXF0l*\4(Qvx4ǜµgۺ5mk;cM ::UWU]VVt6[F#DztT7l-r"QT-uz# <ϱ,a8Cp6lھ]3ei} R6/BL A1daW\s6!Z^W!d2AhغeVG$h5uZX6Ai/.)֨uŕY'&&}c(=dccw(O=9;VWW63 A.Fs?!ݵkZ֮iY\JK''{E>b{'?~x5@CCO yJJQ7)ڶ)r UJ { |s((FY>ewˊ5Fwq㪫n]5? zJqusWU{ n#Op׸=믿LRo1>1o~$QN{[`naB_2F¡UJr@ɺӁ@ʻ_Ektg;; zöm[r9?jkkN?lnEWnil-gl_y8QT%iHE.NԱ&|.gaWlѐ|i(GorPPPF Gq[8gtz}EU]&Rޔ" ĸb#OAcX,7(MNٖ &? AT*әd¡[:T^" 'fG{"HjMKkhˡҔrtu KGG/29 HUuaXf}Ǻ{Z׵;zN: zڗqm:Y5t&#ôZ N4piuMʛ:RŕP!J8xh}ۆ/}j:8>>yS TU*+sOlaA9fXe;nY4m |owio#)T6KdYV)K\?y+yU|vKV9?XRgұ^{311pyyI׃(݁@hWUU weY'Z톶H0Hͦz EQ`DZUU,8. EBwh4LOrNxM7^ AP2Dc&?H&SdgŇ$dYE 0SPXlذ1 ؒtk[R0< kŭ?EQ$\.+ z˲DEE_}*Xz 7ސJe aO$IRuuZH$284+*>204V_[s|8kii^aԮ]u]IBHd|閭[IfGFu{y󦧟~!Ӗ>XwבբKg9^Q^Ӄ,~O{&ɐ{Y"ڵ-gmyYĨ,I2ނvƮ. u5*b6 ¹jF}oo 6l@X.#afs9`KP827]u `8+,X811r\Yi> |M9/aE"{ 0 EOBF͛׿tO,˲S2;ML4Ai]6l|?+.>Uxwx,W8 eY&[W8o?C]]]G6П;0|v4A x" 筵*|r|_Z~|>˯n'w7ovl|^ڳi|yF$IFcO=B9eIAUP,F <&Gwk]1(rTfaeiE=B3 HJFah4NHj5~4Mgi@(ZtUL&q"ZðL&wyeY"$I 0VHȲds *#LE45LE#$%)@4$9S/v#јMp`f6PW[?0@6· 77+k g- H'پʆEJ,( 'ZN=}(ɤM& UUqH{z 9 (tp EeEy9 4;Tdff^(-- 0==reeoNqQs LFCI D" (Z"񉉙۬r|Q&{o{n.h0$ =ɉQFvWx0 /|喛oDWl[ovkִ<FFZ,]wMm*WSlmm}u+:f5`k]TSS" Cիce[^Q^B'04xSP8Ka8-&3p0 iu C|AeYڻwLmM5@o0c71`$ڪVQi[wEoor"eg9())xK}C#3ٺ:QAPA8ttv')?hZ׶CG"q;99SPPP__Dzl<'H 70`VN+KrPYiiUUU0tA\&WQmii^߶7z;koշbus\~?zr8MLLUJEtfib`nw8VZ\tp+2qT2>va8%X}Yx.t L74aNe6ĔJY*BNJ=n׻RkIR￿dGԼ08$91913ӳve <{%if1IITWWI%PQD% '"[VS,YPwߣHhGզqegg(Jr =r Nmk[8!vW*6nX׾ѓ d4dى鲲[тna8H4' CQQ+(|`06F  t6#I`Ah:+I A@\B$tVQa`j=l6# k j"V80Z>Kgٌ i:#$I(#00 lJDQICWX,ósC l(ϱ =h  ^IёٹCSum1EAvl[F YDzX }}SFFFFXֆ0:2;{J *F;oPY$jÏ_eEycc bANmY9\]U0[}}Ue dYHjrr|wv߯P* g=nW4T2r:bfSɄatt`FSggIVs׮28Ig2: dögϞꪲx,Y',dd&j4:$(%gwoF.g,-)ɒ4>9"/5+:O=7;::ۑs^(a΅x"bp"~_Aʲp2&Ss:cpmXNģd ߴ ÉUb?zɷ,fMx%;H3cjɟu )/+z ’"k%byyY}}2~ao / O*H8vׯ_0Y񔗕LLNpW77Gʼn ʊ0TR\y"Eyy2w;`X ‹(r:TMueWϽX}}cJ:p#m0}}/A"ey1pmMU3Ͼb  VQ`?L[[kk뚣챱hEP2t.B L&Jp,1fippfU)TT[6oxwgfZ׿u i3c0sӧM%Y0 D"oj^]- |(\R€ H}C}ew|O"@ IuܾI+s*o[ת%IJ'LZӮo[k0)J%B.GP_d"AL*J%+K p(5Z ΦS3:mD*IөĚ&ɤx,x-(xcY V7]u$!r*-)5:iu-!)( 9Eh=[Ս۷oT*I3d&%~?OO^j~W?b7p ""Q\䫯G}lY-BNTV!+Pvaص\7կr:vlm}#uUO WAyj|8MO/ہcp,^G _`d"slEI 4SQ^z d۳(|O$P)WRrI@ cáptUe1Lt' f)>eD"70H$v[uQ; h,NmL  <_ZR\\俰oWvmEQNVLZgN:wSQdi:e=2YZ$q칹PJg<+0C<ϗᑓOK7 Gzswv|-z6jY$9ŵ';beyfv"(TwwI4<<Ҳ|*#`UkT<ҒIB2:2 zݺFIJ++ RQ$2PEwt5秫ΤRZDCG*G٬/-)qaaya_FAAB C$lYRZZs.Y:}S[4dYfR \d24;Cw}7om]S/>|FwǝwhiuL:(A ,eW3eYALF# -Lvd2tI \ܿgiK)^AAL::]ZO"0,Ib~ۯfdBKKJf:rNo" IG .>QA|*tǞYeYELNa8'ye7rRW+~ r<G",R;45)V.!ad'QY6 Y@QThAc(N%dY 8Cg9`He ;P8ɒf 8^%ǀ|g;?ae9$! L~?6>i꯽*N¥# $I±p8cP@$_DEQHqZZ[Ǔ+XiIjuʊ](DQt.]cV%?zH$dWXpʧfs(N3EO:ʱ% "Ijflfff߾7}b)kd2/P_%% &1> A2,KfλBzZa(3<ˍOL qjm,J$S:Aw[nGsCպkFGFpD"˱onYU`!¾ݎ,}tQnWHS4( {|;>1a I,6I"}># HJUTTzݪJ]ng^p3pl6j vhu @חRe42PQq1c\i:p^DZ"^ͱZZ_îjlVVzZhjkc(&Q_طkq˵qS;JYyf9_8'vrcC$L&ko:vUR!?>ШB@ZiEM&#'N(96i2i:sGzgyI0l#FEQyah$zαw:_߅$Iǽ(PVkGMx='?+f*r^s;w{(.qAѪT*/nw&qY,K FQ2$zTe9xAQ(/H_nU**87uy4c溛fVr&c=D?\.%Ia%p-˲,IGy|_f&.G? j%ggGtp NNN AòD"UA8k(v\#Bo_mͪI?!y+*ʕq" + cً# Tb1 ٥nkiiV0o۲eK;A?[v2 e 7\gXzgSS~o C|~y" 2<2FEy+ }\&u|Ki~+p:.o!d2陙~ёW^yrݻّQA{?c>p?ul144;qmmx㭞 V:z'֮ٲ}jjz}z~ݺG::gf>{go;rR׬gE.>JJJ Lw\\ 7Y;::FU$mҗ?=ߺ:ޱ-z&>zP--)>gQTu7p? L{_}LFE   Ȳi]-} AO<̌Db~%l6C A{b:}2LFDFjð" H$i _IR4"ZܒFcAh4OLN`mmg0 evtZZʎ׸,CQ `hBQw`pjY=A;vvw"/~OM4ʩF-]ϖt:YYY+^˚6VOdav6jǑ]Z[I\didOiZr\kk(] ޮmk]Niako:`CUFa7oCQSWVU?KKJn ݾ}릍*[l޺eꪪX,=}֯;o v_, yJKj*lյ8KyvHk?w7g~4rFa>f֭[^D ]~ήp( h4>3W]z~ソ3͖{޲R}{gGھ}; ontֵ-* ';{,f;ow`P^^f:Ɓo z'oꫮB<9cT2FlvZX#)mJI|Y͖$) |~\$$a2gg>9rp24c0 ,RD]ݽ&p o n>,wz;<>_ɛpݲ=r}nYYZOl:v^run%Egr_|ͪ+wN0Pl7LA#]nj1>_$"_aPI{AFSYQf2?Q Nq4vu& ͚don&yscCaɔds,ˇtb3b +6$ISc(\Ғb"a6`C; 95m6L&fvl .@ *zSem<+EAnUj5%I FԄ_ךW AfWTrFi*-~Ot-vo*(\a]GPVZ;vY n"(  L"YѠ=qc FL-M$ItmN`hBIRMx=nwqwݽ{wq7JS<@<xFPZ!pck[8c~Hy( {hK1Ӥ<.lZ#^~>{n(asg!! WQssI: *7^Bͷ!e 3zJMa q}~T y" RD?"EoeYv9r9 /_UULoo\!Z&>k6&c<>'kf;\ZRt4]ޡͦ̔X, {Ll6w(իrfc##5W02C#Huu }2\Q 544d&axxDPTVVX,d2UjM{[{o@yYBl9Bb }}i}h&s"ÑP8VUYQYU޾oA^]SH<^VKJGTTl`0 IxSTdB*%‘B̅/0,CӴ-/O"8c[8C4O8vDg=q\aOcT*9;}*ݙPVs훇,IN#i6sbd/%-[\Q#` L&cwo_]]]iiY8eX,XtڒX<0DBx **fnHnwTWWdQ IDAT+Buuu}]mJ]Ngp@XG{;I*ZfQ(T,yEQAsuUV33@f p'R*eYNEDas$R8/-((v/4^|z]~{ߙ ]֨r#dd Q`ljT2olMzss3NH! CdY5/Jr#F&gYє ըe^&% DJd(\"HrY`dADQ ))p%KBaP[] @MQi\+A*FS 5 (a8β,aH Ʋ,Aa:HA=cRw^z[Ģo~ݺkϙtدQYQ o~͛ow׿_ \@.JA i:0V Z^n}AAah:@LFŔJ%2L$*(`Rd4̣/P>loJkV!(o߻TZos,,K.hb$d!p )#`2TJ !R|#~H)I\gQ7 丧ys[S{u!O,HtH@0v} 3Jz4$cvSTX@d lkkS*(X I ÌFh@QGVZb_1JUWW{ٵ7oz8@ SǏD<b6/-):r;؏@Ѵ`p:mstsP㸼|uOaeٳwa@ / Z PDnq`vXfe%lj5!)A,f"(Tf1 NΩBqIuUILtȤx e% eDj5sǧ,2 ^u9GAJ%c] ınpƎx>ߓlN9pXcM\zm:;4*%exdT 5npUeb)))'sYJfp5k|޾_R^Vvx߲>Na rUUV<֮j}Od29jא!cmkrӍ_{4Eab*VϫT^î_Q'?D'sE,fNtZnn^0YZ"cbx$]phxrdOOeNz`lـ8YEfC X{$I>?#(ZTX~ P\TTv=I$5W aXn".NFRN3ƾFxfC\4O>po~eeZ&(Q@T|_x_^OQʕU*'p:P(s;IFU(21;=T:W"t;o&•?6E5e{ϗ$G:Rqú0M_g~T?8t|ξ}+_:sW\zY}/Oްa݆ lito/}=v gVQ=޲Xm%̓ArŅaӴID,g2%.Yp<+W5[]VWD&B\f$!P<ڗqHs|O{EO@ Pf&/Ĝ> PYU4by=Io8p`xxn:_g²TF"lH${5b{-ױJڷw o8_V&1؟!( `YfѿfiY_o@όj7A`@" ,fYǯ`Zey?2q<8|`_d3V> 4 aW8Nd0ǿK]"5E?(_|?ů1 h$>C^=BFYb+zԩ6E4jG۝jJJ%b{GǁDUe$I,?pPWW/:K4),,ZZN.Z,O;wҔ^ Bv&e,YdɒyKyE4zt EȬ|[_\fJ$6ॗ^H|?u.3h4e& v-]]/^oX,ox AիVoJKq߹sY0<<<+?¦{;gD.Y8ٲ K$h;uЏj ( n7t`꯿nFaop8R) 菣xTT7pN&p&Tj4^}m޲zohF׶^2 rv04˲cC(7޼q\yQN_<<{«WJ=6a8 ۭVޡ>cwH$RiQQ!:V!v,3M?׿Ae nȷ=Q?'ԉDRIT*GoJIRLrYYi<<1.Bk}r EGS*+2g?!$wA\-p:]QgٴqL&8e9jyO|O9z?YqK[[[kzWT<෾O=hbOOlsGQF3/~]Q@ۧ CrȈS>$?d➞ouoxz= Ƴ?x񁃇ٳ>~?yj;vTJ_}P(t@ q"ܿd2eX, $Y 3ZҜ{]VVg=SH;֪T* Ö-}oʠ^k:@Mu(xs׮ݮzz{}*sYuEqVZ,eZf\πg62Jjjl/{_dΝ;w|gƏ6>yMJtU"BVxaI*5lR/}>zVXjYC}cAjw7/{:/oP__W__7f}3^gfEE'-O^QUVZjV%"]vmCC}882ATc'}d" GG.hdxmd2+566lڴa<e^F7#\N-l\lIcC}(82 UZ̙yz^4MR[^m6W]2f ٧(ZX |z&OH&,;#§xq\"iFFE29u8ctAp:z]z7s  4@a1mK ߷|(*9 M,]diAd B*JbJ19adYVc˳NXݻ@:޹{/e%Ul6$Z%A@PtZFԟ:r1Ou z}{><=`(#dJP))P?O$?pTk; K,KxɧvQ;::O<}*S[O$p`P9}#Ne`0F: 0|6h:CvG*r0 GTJG@0i?8ѐ 3Y&pCQԀǻy eY6O) B Zg{JqwhXY͗',VcncCX,X,4:P.^x;z`ss3J#Ҳ%\D0xsGEy {0EQhº;O۩F{r088J%]s~doT .?a8vDsb s7lXكwzMlO$$) f=M%%4IQQr΢ Qru kY3c0zfa4}ӆ Zv͚UEϑ}!,++3JLf˳HIR=k nd3ɖD")(p8(g5k,_,IVF`7a`OQ)Ӆa0 tk&8@0o9R]4RV5h4-y~[YQfNjٝ$I zVLp0WB.0L7j0|IOP:x&c^-wt7/^@>}}ЁE.gyppo`, ku:-[vDs82<qC!gt`0p:Je<;FA=ݽ%a[N6MlPj8.`yy!=^\Td6E!ZCC}%e(䓣G >܄;rtE4  pfP]]a96W 8βl:M<~dՕW]$oٲjLVYQ9O꫕9urHL&±,dJ h4RJ9O$IUUE;Jp옯sv  $LaY j˵^yի.ÀhX.iJ EOO 8A?6]TvuuB֠O3 }^͒$ޙCpDץRKtz8 ( 0ׇc\.sBw2%e9C?0 EtuwPq(,pݻНJ%=U ?R*yR|!?o Cyl6r<_TT?r|+_ò.$6cy E kSVV݅Ip9;qEEY{{IvRĥ2b&p<7G;v R)a1z~KrW4 z"@ ]j:OxR骕+XTh,˼|22l8qTiiZ.t0 IY]m]^J&ޡ!@MMM~~rDRXjiiqzD,;- r,gԋxЃNQ1sRU9[Ho߀BXg( JkߑHxD )-%S.W"d34MMF)W*p.[ڜL5jdtYiR!( rl&Za0AeU2'Q8W&UVdECATWU*qE 58!x!J⋊JK s&i*9!3e%R)Njj*%B ҫN(dAB^[[ISEJ:w: 0(;T*DQEPb0L*ig fxY:GTrN,k ɤ3sSc|}͍L6;|LFIJ 2D<Ͳ,0K*7js76Y)D\_c#/B*O EzH: ٌ~dp}} (U*\c3) ΙS)\R<2ava2J%AjF$.Vd}mJd/r9W(UZVJHflܰ~WRS-f#Iox(M^_@0\H\E.bGCwJH$&x&. UZ"V@ad/\e톛Z? BPLE1zn qt;{z_xi4IR)(H0;3瞗H0$ d;n]$zs 6 ;<|A=Gy͋5e{uu K]^JL(e@a\B~聇z cǏ:txk(p8h4P($`4L&# >l&K\f6T4Cjh4A2Ȉv_ANWg3Eb8PrP`;쫩蔒 =~wOoJ;є΅ ^12N<^ xBo˳ @l}aSj:<__WKQp*E56ujz`;aMꪭ[h*Q7v* |,hljbP8"HuUu4L (/m^X&WMLSD";rpwx<:U_ڶ+jkF;:/[hVK]mmo_?d2jenn^pإRiScN]ҼX.l6yTANk=//7cEh4~@  QgdKIek˗-mhaX. (c( 0yQ8nt% eS1 Z=#qbHCCc6KB!FSZR*%I3־r >gi=}cSLFC}]uf2{LJRA0@ }/rs Smm͖}656**wUZZ,$o{jx<_&_&#o$,EcqbDAAAQ;IHHooO<>`;{OtͷH0$ SX4r b}=oyw*l0@f)l?/$`~6o'ß M׭pݦ H䡇?#uko=7ALF' Lv``` '4MNS(Y-,MiD^YS]q2 U_cBx衇 GIdEE'WUj͜TA4|?Z>}flR|z_G_;~ox7%c7lTT 4Z}L6nJ~,TWWJ$Ɏ3T]i+[=C,=lbR& a&+CoX2d2EE4MT: 3 ?am\f>y5t dְyJK 0IgDβA ( ydR /@cA~@ P -ǨTr&ds& r|m/ChɡQY ! r?A&Uװfw dot64MU!P ي虿>Utɒݜo:"B0@ s’|盰MSp? 2Iģ hG@ ( @ I eYJsn$`(R__pڏ>70pA0Bf5prPk&Afo.+i 6[m6W; 3d$Q0Z[)qHt$EQ\Bav;rK~% *( (aa yTUA\ 8.|*B$O(*Qa P  I.Jbl[{G(9q< }kC0@ `04 Ea;Hoi566%qȐ\#};ռxAIqtj/mV(e2i: }MC0@(G;p q+R\ð⢂є!VVDQL&Sx<$IаN˳NXgлwt:s^Jl&+H\JvttT* &پ}kml>>'R)}`(Cþx<%W(}@ |CJ&Pw߻wnmw3ȅpurOnذc- :n3w9zL!o|kmM5a{G?rtdd$NGsE >O$$S@՞: (2 V)69*).E#H$+W\je8_L)j6=pX8t s&G:0@6up}ן:0ҥWt:E-V˦MFu p8֭vj(]d< !Gzv2 L6[H$n0ҒbA;z˗B#dbʈ & )*tƉ0{ڵz]( YISSY)2lI%͋sos/,fkGmA| $b﹮`CCMSJBrleOAQhԣ(8%J$e˖>jZMB͞?A SBf"&J&j+ 3tl6TU!G;?02D]CU-A| x4e!IƄ@2G8v2QW^asA p& G`;@ P H$3&@a\avl<@0@ g 5>spu?[T\Tt VdlڸaWRf#IdOx6nLWid}* 2[Yƥ+M@v( D^](P 9ȥyͤ lZu@ ( @ )7!"uu$)TVV6 y E{zUj͊+tv$m3dG<_W[.SdR $m奓 @a@~egBe۝H^,)T*ըCJ$$JF#᱁?/aQA!P @o"VO0Q,3$)E? 2kXx d2fG|<xV+DZ!LZjZ[Dqٲe4C2@2_/j8tjZlV%þ_}跣" Ñ?08$y-V; a˥9T!l7]ݽdn;!%e'OuH$}g GAnOcmrUOЮw_U.]u+jdЍ <%l6 R]]F=!CZ)))JIjko_bi>w`ld}ݙ ()T(YzP EEQ:Co~9-db8eh,v"P<((((.*iQ'v΢,fSggπg0h4x͸EsZ>G/R__ϴp#sY {cFQxͷZ.rȘk x"NPH)vK&CtѠutvVWLBzmozE74835?X,z>BVk|!)M#P swzcg܋7x`Z~Ηyj|u8.444h ܙ m6n7ADt?Hj+%a2+V*%n+[^Y y&Yɸ?jk=J%?2Y&+`@a@.oX2dE sS4J+ 36cwMt:A"llaI"z3/*@ P +C4<)gDbL d$<L aP dr53q6ȕfmT8ΌKQ˩k[n݂Ja#kVYw-1LFUG'U@ Cb9w I^sBbH3e<^0I vJPy555***y#cy~3HTCtcGt:^s=D<>g Zx I@b$>^oA$gXU-^ {6<={?@MmJ 1w`ƿAxH wwwc2 ]]]t:Z$bFd}}CgWɔd|>${ZZ[[1 J----1 RT:SR744y{IDATh4Pۅ@SSsOOA2ں.(`b2mlBW^acm- ~x:99ƦǭQZtL&33$j2,--0 kjjjuZJwU*@00l3?H޾tttޣL&ר1b[\1cFݵkO{g"o̔eߥoU|>d2>sdN*S,/@3aXF.))Uk4Z.jaIQBY┨{:稩LŃr_Zݓ8ܾSRL&崩Su;vea/0!)'g}c"Ph?>}7*nX[{p?{8:8}cf6]tq|7|}b'555[YY2z[nS{z4 BX<>7))Qee?Y0o[!XvbECC3?;ҟ OCz ]Xnf&X0_vE3]L-}Ǯq'N>pS`?B)1uw?pqaCWp&DϾtpګ{r^t)zR{e)K5M[[B3Fq{)\.7sC!$ϕe}}5fK/@bx\Jgg'BeFƍ xuooOPyx<Gw^5HHOg@!VlA!-J-*e˖m"+S&q_|pw;IDGq8D,ii~;Pzxjŋ:;;kkL&SUU!tz_?|>YZZ ޭJ-i4ZXKJK&0`757328}<0 _b3{xxwA!N$I$ T9aB0F3zY 𷱶nim~-[X7dFFuVh$IN>.'o5N!bsPXKJggA'Rq`4Rtz`dmi4^2 &#Lh /Ĩu>~j!ekFgg͛eeBF?R_PXxcD"aɂcMMMPB-vQ:ߺu!Dב~~>Y{zzzJJJTyFFfOOOyf[kԸ[n{yzL佖ࠝY;;;N!,)-ko8pװ0 GGG֭p$vt:} y f͞{⦙! &iv_o0ЫS$.Z1Q!:AūSsx=.ꖙ@0t xJXH$9?2uzz,A47LvP¤ښmq#~5d1g͞ >޿kh!5jx,!1iYgϖBozjvWn&25ıǷ .{+ N/LqSFmm-2͍u"F0@@b!&L !@b?sL&ӹ_ :1iBuuuޠ <'ۛ$% FcPPd` <$ BlV s?D?h'1 \.x1a]Ca$1tww h4K'tZN !<ZmmmV: AUa^&a`2Yju}CF1`@Tu5^!wvX]uo `ii1)jXz| uuuܱ| v¿gɋtBbQ_OA!xz{^?c gg>f+TDVo߾RB bٲeΓ'O\hktttee%B]"ưSNQ9sرc-,,D"QZZT*U>>>---]I/a]I!@hAP3:uj:-00ppIah4CW=X>\f z뭷oBp K`8cfff6X`0?rss/_LÃ*p8ÞPo`L&h4iǾC@ v8 GaTxݻ駟jh.Dz64uwwo޼ҥKn8NU:Nm:RǏ?y$5yt:!Dp WUUvv_WN>ؽP\\DĹs種AqqqǏ'J6K.q|ӦMFS,P(***Fb BLVWWw=X!!!::ٳg~ld2egg?ѣ ,V3x)SDEE$I &$NRܰahht:}($q|+(ar NשT}#`i)0_`azL*1u'Qa9Cņ=% hU6ėer; ]s4}V;@Lb#: h4T_vb/8U?BqB"u=鰕IENDB`gpiv-0.6.1/doc/C/figures/gpiv-fig_console_post.png0000644000175000017500000024617111204235560017015 00000000000000PNG  IHDR(2 pHYs !dtIME6r8 IDATxw|E穻7R!*UEg<wygvzVl"ҕ $4R7ޟ6c!ƈG y(Ogf|g;EQ`0 GeI;O7KŠ q:b0Y@Rd梊UC'47 BP$E2VcٓY 2] 9 Hi)U/]ÇyAT5Q#Ii A`YV`0 b^vAϞ!E]7 }mDcF_?"l̋0z<ݳbdXo|0ESOaiMWTgF#Iہ/MXL)vdo e87=~E8V*݅n='{_ Lx/~ۯYmA󠿯 H]h8EJ<ƀmoݻ> JKK 'nubyWLFcFzƱdfd 8Sq.kժJNo߾I&edd/_^l9t0$wlGE!yy6m曯fs׭&phu4l޴v: ۷#F E566ؾnOnC֭[F3pc⅓EVQ*]pEQ=LLjz>?oFh4*[ I,K ,Irw RV ,˖sZ[Z<Si4^/**R(xCCø0 QWWJ$Aζ6ݖT~AYnnjNMKcYl6b<ܜ 8zHsKBg͖~4CꎎZM3RjKJKU͖ 8rHKKR`h@ӴVp8њ(l9p-* O7q$IH%I;]GjjOL8nG7e(I(߷&]&IRqbz(!Ic?xkphK/ iA͹evB;p:^3Ͻx‚=//wժ/<'IuӮQ( (B!]0wEawcǎ5jIuqhA(777XV^0̷@z>33s~6Z2dȡwءRq`0(Xv!ݲe A b@q1qpd~'(@cǎbQI TDz!C۷ef 㸸;x^hj:p2 QSSS[2_~ӺHNNvTV$)Ǔ0 ݽ!Bbb"A`xŋ}EEzys}/_y4M~*(B!; (ɲWp8Qsؔ9(@ bh+ʸe p(h4zB9q$V&==C \RZBZ"$%!|RJe0EQ$HrIj&NqqIN~BDii`PDz@EKT J FAI lKB$IT*ݩhc0(*lwaxAAzؓ8{߻YAZhgj?JefFNU$I<{frrT+ӛ>~H $2W ӯJgLٻ jk{BPlZjzSgFc~' [ӝ63 ĚssS6Q#Ѩ$ ,J0 SVV*$=?S$0=*7f()R(AF3nQh>tURyD ugD"%tXŒK"TggDp8̲,Bv$\j,˲,{z# ĝ}ӏR$P(M9NYuAQg82h8NFqbzIRRrRRr#ru 3>c0  3Ԁ ?}vx3\|+ Rɩp`0̕ƁB@aaAOaTjR `0=HxʕAFhd`0+))x ` `a`0#G ۠«0. uuG}QWo޼(|֭E \*liiNOO5Ͳ$gef>$UUU9 uVfFnnN=o엛q'ǂAUU %8?n,.O 1,H$lyYI 6m޲|ŪϰL8޶m}XV4hnkk_ˮSQ}d{߱cg#K.Å \Y=uӮH^n$IW_=lgkUU5֙7ސq;zWRb*XBhݺ| e8v諯|Ū;v8d4Գ?70~'zxW^۽RT^7횲R;:;,XИrf8#''rϢ%_‚)S&%9LMЎV\zi,[?o%%ś7oo4x `0nM͍'Nt} #_,Zxo=d2.Z9ӁgckEQTT zӦ-W2i)wعeaCp_4쬬sn5_{<ٳg~.KO>,<{IW|_xysmKs9Lݿlي򲹷޿ʕݺmƍgΜQTXbꪪj\0̥c3'M**F~* ͯ䰧$?|^l>`'˾ZnjjNJvL W_qܪ5knj]VVz}vU=ʠק23u:]swn&PXP~p8jmO8;wǯ B$I:~ ÞyR|qWQ ض}{~#U*\TT 2%OɲkW}=@}F0o-"?h$6{L3Ͻ+MdN| hT8'* VkAFQ99_| ';o u=wu({w?тQ܌VVZƔd 4jS-ąG`f{+;; !LL'6L ݯ_LtUsI )JDA @(ƷHX,55GrOt\Zox7;pCls5S' `0z\PYbxiia0VZͨQ#/2== !t͞=j= wfY Ύ1GN˯|>?TԔ Rm6*MQ >d!99?և`q|yK%$$@Y2ZO#\/p8VRf_pvvDA0? sB| 7cc?aV~~RpDNPXR@NBX^^c"1  fa(Z$'%jnAJqmmmD(**`VPuOѤZCݏ3jÅÇ (ڵr굷쬳 jK~oy֏8a5K}q. |񥗓S}{ws#gjJ2tp^^nl:q*/+MK=99?(J[n{EM2ёtKS:AŌ<8Sa(:9'7_nyNABAaLF):(\kmq si åEf|N:+)ɸa0`0?cBnW'N r~oշ°gU+Wd`0+G'%F$Iڒ3֬Yc4`.KB=Y~BFF:MX~ΎEN>= XP(uBp C$B"%I4zZÇ/Y, FQYjW-1bhBA_86wڬV=Z Ȳ bdecA [%A̝;WeeI,,,dY64M,Pw6tҤI,l޲% $& ?I^9!ߡ%c@R )! KQ e \KDQT^($Iۿ8dHE%&& h2qzY Im'Bgʲ\sfޭ3x> H In$ [mUrBu ˲VkBfC@D[GDA@!]Yr1BUWW0r544\{ A(rߛ_oܟDgGKKSkĉ9;:bRp8Enɲ\u;yXF FOk͂RD+$SjLa$d 'Yj>1n<7}!ŕOc~k`0e-|6g &kPUvc\&r] AEw8{5!llh;,- i(IyyǎԿK/IA*a &MWraB@(>Xr:u*I!j-//0 #P;%BP_y#5GRR; Dݣz|=99oH$RmCZeQSDP]6\-m6^/.ё\1rD4YeU}x%JNi4_x{EEUU?Hkk+C3D֬Y L3hJ,wɿϺH H@e\^N) I BHB%I7>B;22SYiEMQ4 ھrǏe&/! PD5{ZjM;`eBxQa, $VVkYʲ, BL(wu[[ z4!ܲeZ|?◿~j{ _8ڀ:~9teţo%iB5sSC7mrhê%}/ R9zY_;+E)lXnfŐ_O c-yq7ͱ$Ie($H 1\^ /eSc{EIRuuuW;E狒L&cd1$ CH"8R:[ ׈m6!OM;MFc4ݵr޼9Ev\B;hlJF;zx `CRd<10$X~!chhD M &SvSEQ1 m-hL#s*HdBcHH `H@!ciDԇ5G\~FVu}Xޟ>C@R0WM_>lBuo=??cfQ{O}}ÉM a$IF9;ߺ !"IIHAd>'xhE1ied" C-[~NNGUx'+(3g$vId,d( .apu)D[r[^E!Fnog|!&qwf$ B(#m(/l Ex1$M|hh YeI% BF[1 FLQV kV7:$YI$R$Y X,tvuϿXF=̓yo?{+ӦA͝mmCk| /57 1[he #4SgpAӰ)Jkc@[SD/(B Bchow~ǑHd޼97ϞSl޼wӯO(U+N%+Yvw̻u  vk"> /ai!t--ͽ ]EU >(G"Q⋉ Ve($1UWէ&g$'Sd!" GL<$ũT*pDcgkvDNWFcs0oHLhlbYq p(*X@(t_F#c]c(ZZZǏw .8N$M[.(l߾mk˭f͚B$  k=* Dapt'jZ'p&uE ѨLP1y7vVw{x<[n{a >NP_sd.G4n{ B`7s"DUhƤA4Z$IaΎ^eY:֦BYΎ!J,˲$ T[DQʒb7 BYTjSOvOzm(D!' d=4"ܧϲ,T[{$Eш <@ G=/-˒.cW>HKKu]~HhU]]}J%Kb~ANUQS-faA4MYhY"ڨ'w=cb4 Dٷ]PEO ͤnَ_|ۭs"5H1P(u:]\$IDMM=jJ8fԽSz/t i AdYF"23j4Ȏ@, (`0 Dd0F3E3,"/"ORdNWxɴ@@ u0A @H$) Ű MA VW,6n\^:H#N Wegf:;:22?p{ n55-5 _TMKb.jF4/v !0$@B72eԄ#j5{x,z[6on#Yl2*8f2s ( FSa0Z.g/mݶ]գ mBTddao ?7cy Y1ZњLfѢ-'x8%^C/ujMxw4M!Aa֎vW+AKU2MԩXY/aE#Ba,$z$4-QlpHJP(>s!itoUqJM3AP4M06uBohtܾ5RRKJ;;;&NJu$$I$X,o۾8##"IQI[oaӶX,v߽̦L5!ϝ26 )**KZ_zӋٿySH G "j!>![,8ؚhŪC t'AKQ0$I$]E.\{H8u JV*9Й.EedqA-{$$IJ`f3'9bwe~3 n};>ڌ\ZZZTT5A$%9z]FFz{{{$l`0h4e`FP HPgƵ!##jU0h>X8u( 6ٓ}yEEIEჇkD A֑,AV0t:[ΎD[r{[s/C{дl2gΕ [O\`0xsh6}f"iZS@ q CwS(jrr~|jMS4M;1x\ῒ[}xN+EXVlo:[&KK+!.r{NJr\iȲl;"=%[ =VO$P:6LLyX #\d]iRp]:\uAK@R:\s4;CAeq oظEQ j/a۶{BF:%<|$%Il6>r0[|ɸ{,f2'PeXYw}ȑE99Y{[gpzKnش93#}vmϞW_lyx#F 2xMKh :N^^nAAݾn8|n}zzڈcF+V$魷744畖T<|Ņ\ /v\57;v좭&b+7lܜ\R2˯ƧG\WWb<\=>B! VYcضm{4y ŒVܷӟo@ O^XVZ:p`Y|;ͽe]|9f;Mquq!7ު/ϻFb媼DQ~X*]qӬ ?t?KzCs斱cFF֬Y˲W߽r'hj.+-yJ%Bh/y |SKK>xO?>CyOOL~뮽 +V% LNOO]hC _.0>UWٱcgbb]f_Ϸg^ño߁+Vϸ~ ?O_qJeI?<74lܴ~ֶU:oNIq_믽;(\˾ _Xorqc<쓲,|#G-Z:x?h4 !b'BnhhEʜΛ7ϞX^C?S]SjڳO:LH|uHi0 =27VZm__>_7-[ٳ|e,KdBB¨vW䠈(J qx=^|'K[:FSE6{ yVފ‘Zjħ0FO=wfef ,/:d޽7n*--Qk4M޳'~fXr5S=G.++{7o|EK|~?O]X`0ںѣ*jkk[[ --ͭ#GݷfOL%0f7A;v+:]7))I'YVVFaaAIIqKKJbF ^F㡇1m?uB1wUߗ.8FT 8qk|+N3i{z(~ejat,<Oy?uvAzEFAw2eRaa~QQԩn}ƌKKdr7 zLẺo)##nlmkAh5v?0zTEAA`%^;jMPkGQy$.W$I`࿘55EQbϦ$Blv8[csSht{<<Ǎ3H$Om> Pʓ~DO?b͚ F ?SǯX{8嬙7̚y ERy5Soظv7.[%c&x[RSSl6d VVܽ @NvQ'(JLN<0~x>'I4MCx.MgggXbp~Ꚛxdۏ$E}g⤝ G$VZ/#&v[  7o:jGV,l?5[TV׻i5蹞BjZ[[۲23O !QTղ,C в߰jM7~rBk*X(jI~hZ[[- N.'B$\^ TJN J8KKJV]^کMfyv$*g-MG"QtAw_>hҍ6;jM2e릥$x!է7dggS hjn%Zk95zI$8N w(NiH7Qݶ}gvVdT*9r ,4zjW䤪ꂂNo( Пsiiqk|u6P$_T?[UUƛoa 'M8/j{S 헝yD i455Aj닊 GNN[o3r6tWW~yn\lY[Pew{zG 碢䤤ݕ{2T/^bhkkD^WRR/7ѣ ?L$n4srxm,b /aC*Fyh헓=DBNvvVSRS,fbbq\JJrp8Qq\|a2T*Vm&!%997/W&ɖh8.5%+ evaCZJr8RɩTe%J255U(t:mIIqYYi^n?KJJ"InFn' Rr ֻ` `Ua4hJNN& fm6ٜhK$I"!!aT~Alذx@ffVU1vXU* CLƢ‚~r b8erC(‚Çmf!d2 ү_?V՚@N+*ɉq5AQ$jiJ6l4gbI0 c6FWHWk4i)&)55 Nkۋh$cNN_^^W+GjZ Fs|2hvw:kg~ìE#^[_ssǟ9bcqR!wo'a.uܮ_z9)9ܷw==u |PDGoc`0A\3uCJN˕ $QX,zǁz󵸹d!Jep4z#EщI68 IDATݗbXŞ1 ~cP(Ύ6agG[|c \=BITr*'\{eYwq`@cJjokm?ۙ$IB\Xف `.3>ۑh 8҂c0e'FMn ?|[s80 rhiA"BA?e{[k`0Э:hpSf> ,kxZ~}jj @#\6b.{ aXѰNo =ζ67 ,  sy79]UY=N+0 抣0 F3IR:!`0+]"P$DJh2'`0+], 6IB` `0+]<;M4Iqa0̕. $I$ٚ`.1 ި(Éo`0+^/N Dnst:[mm'N{:o贺A*Fk%]G !<*dJJj~A3 DMM(8hp$ϝws>` #Zmo bԩ F;L>M7{ͦ ?tAo8x(MߙqͳgAVCDws^>{. {dh&3+;#3z5_Q%~''o6E^ũ [Ι)LZI~wցQs.!B$w֖Rk{*J!!qsGSH mdovwfvf3Q NLGjPR\tn+';򺞂E]mET^2EG{[/7Qԩ3Ϝ駟%R늣Hrd^?''?O~$(*}6H[ƜQ}H*5Q> fW*=J_t(󨯯o/~-o~k_z/?!,].KQԁCYW$I/˵{n `;f(o{[=k3{uI\ʿ{-]إ+Qwu:y55z >\3@}}Kb{աaf ֟bR7?0Wt::ښr@Qԥ>>>JlÆ 2oaC_ tV`jԝ7[vWښB^`Pɤ{ܹs_Oo/\  7v\*tqƹs6mho-MR{)/^~wmbv󦯿ׯ_lٲ76(~G[{?}̩cL/J{ZrVo ҺzP \nbSֶ6gLz**J(EEF)00awl6 LDQT[[{ye2|uumm]*52$g57lٺ}AAӒ 1f4FӲ-KIIiGgH$JNJɼ(jhl*/1, ?.n@ 9Zd2:Nb˟4q'NJNNu5paRiBEj4ژں:bo<2qx FfZS\Rj0|^~~Ym[n 9rEQ /_u8aa iuuW+;8$8n`,ٷ@Z-{*))e9zҚ6$zoA[ZL&ma, zVQql :Nhٮ\lllB$&:*&&JJu:]pP`| iJz=BS֔tzL2|(ǻ\Yܼu`,((αZm} F'$iXs^N:zamߺ}InJKϝp8=ٳ\ZPPxb`0LG?[G?w^?wKp:vikkX,eeg EQ(??ؤe.*.Jt[hjj6yy:ǟ]VVH()-;}lwV 8IrN-tZߚ:};w)))m} YdP(lll***^dQLtT]}g}1e$7>s h{V._:|;v)Jȑ)Ç1̬lwXT.>} {߳gϦMƍoD'ذm6T P*""/\ 8ydi)e:tȬӍF0Z6 ѣRBY,VccӺ7,]HՕ?rO<}3KJ˜kJҥF 7wRhhhz~K=I'>; \pD"h4gϞ_tQ/4fhTrj~\P}4;;gRrӧ b=rĈv_Qc6oR<FL\ I+}O{[G~aE ##p%*s/w`oN5q¸V@˖ 0 T_~SljljllZhAXX+͹\ 0 B( -[w7L4ǟL8-m:~)YGe2Yڼ9p'N&&&\NWaDr8?h42ѣWcՠAqu ?v]taCj͏?mnjj444ӧ岶ߠ);E$I:v\ypI7ohmmꫯVZrn:}A446n C8&wmiذ!,3((M|$'1 J" 2b^p8Hv^p8,3<,̳:}b\o555?L&S&󊎎o\1bX}Zu55E95` (aZ8yb.?<)fQQ ;`$㏱Xŋ8xh#F u `0 ` x2WyeooyPP`8yRlv:޶ 0f1[bLfllT"0 (ꭷ7ttt8ںt7>sS0Ym6_ۍJ)&M}.O'7sƴa,O F_imm x  Ȉ)|E'$Cե>x(…0 \ۜ]OB? Kŀ(͎cXt"I`v[gLz݆QqD]Px{>QsK ajf͚11LfiiybB|uuOsskaQѣY-Ȉ}ErxcSO!BR d2#ú%\aaJf1$Ivtv>6K1a¸#r{/ _AGQfumvaݺu>O?_ HrRs>{!RLjbrM&3v:$I22 &i;0 p8Fc|>Ώ?/&''jߟ4-r9px>mw ),,.++ojiINJ$7r,f v۬htџ7kjs[ -(0 U<@El6X,Z=f2iisfϚd2&0 {?nA=F땗~rϛ:eR{G]*Ə}##v]$Yw3Q^[ae0l6;ɴldW,_$2"uosql{C+FiBk/~>ⅳfhjn޲e[lLAq0 ad21 ð_wFRv0 <ֺxw{p8. F>WVZhgΝ6Kb1.H1};  Z*Qqg9vhEaUJ8}ѧ+V,0x}m tQV=Ƚfwt[oo;w#<@[$d2̚o˗o7}AIA bZ2cШ:d E}nm/&m\.8vjhll>?&:6WUUٳ0}O>:3+bxTttT{{k> |󍷷7Vm`0|UUdXׯaaNimib1oׄcK3ߘ$H7N0Pf۷GIR_vWWlٺWĄ0ᨮu:mP(LNJ6[:~:t~ѧn";L&eVWl޲ fBjjj7o޽y6cT8Elk7a!۶郞ٱcWSs3PP0u?gO"F葩WVdfj7SUAtWatԀ-[8p(7/{rgWUWgt\#vhVliisn:teeKؙ~$;;eÇ9jGm`Yxя?myq?=WO;}/O0 T(< ~imLJJ>lxV=+}C$H-Z`ƏM~' I&Hࡌ~pAZxB } }Nu=S6}ARSS<_!~PCH`~ZTԀ^RZo%K$_YYEllLj&9vhYTTp0cw^Ͼ\&0#t^ r9{݀  *--{g{|.H۱s{oLIaL?;}JLJ2_iiis?D"93{O__yon=11Fz)A˖,>$2"Ƀwu̟ף/xI-ضcM :|06b1/[?ݍQQ~~ %KOF({X16ۊ!f{)/< apJڱc){W@5UmMbEQlpv7ʼd0AQN99z޷>Z/qpGN]Dl⿶LFCvvw䉽 QG~7mG>bp^t5ݾGAS_}^e9<>w;ݒ;vL׬t\9YNZdQ D)rAPW[ye|^57_ruuum۾snhgg(| { QDb)AFǟCoxΓ @GoYyBnNp }O&W[;AV >*·6ӧϚL&72i_^i,6{ia}%p_~+_ Xr_ 6+G(RJ ﬿I)2":fP)(%^?O+fϯ+՚ HgggDD-Xl3BB#J^S0EBѠkL&'ݖ+>?tHr}Cc``@bns_p8荓}\UI7 IDATwA-)BCCBCC ͟Hdd] 府JNNJNN;sr: IvEC?cPDQa44444wF0hTAQO g>bUۭVux44444``saӪ ɨXX,@DW .Dbf%Ih^44444`p:R72nDCCCs ˩שIXL}Gw_\ዢ \.|CP(p Vj5]=~Y$EҵFCCC*T0$IS'N,#HZ#MCCC!44lʇn*Xlk6^Џ9Ga444446{X=d!:ǰzyD"ڳž `KV3I&źvܹl.8bsx|#z vKЪdrcBvhhhhhtZͥKCOsU si]ALҏ2+j19vǺW %ŅB>AorYV///NihhNpܭ}Uj& M8E0 [ዹ\r^Kt)>ٻIǏߵ+p8hhh6( ֮}q 07B޽{sHI犁j5*$NyR76ÝNVMCCsBęS9g;;Z jZ/=u S$0 zMޔ_H6{ڢ[&),f#cADbi_^UU5]4444 ox Tr:I4 .{Jnիt-[W*+~`Z^r ?goϿX]SK/ ͽHeeSժp ^3 \{K/(+dr%́ $~ ׃ Y367C"ɓ&"Hi71;>.S0J;ghw6{zy7OS0p F_Z[rOz+Vu57xmVnWThl] Z LCCs7bw8Pyzݺuy|.v㏛mVK{ZOI>c&ݰhhhiD"add}UdOy!aޣT*i${P,6kԝry\.=9r-l۶yy=X,H$}Eg%HO. E +"IA_?EQ ߋy5ӑZnO:s7^߭`$ނ.E0EQݱE! N߀ P$La_C`$~:ץ(p]m_gaF},;CˊA_do|,$4yhinb2Jh.tVW]x/f`b.'Eݿ:`Y/WEʽ}uZۍqP&V`b"^ AI$Iz+4NM0vbtmOzfsMF #n7Ht$DnTaZ`a6q8 ^2oNMA^r_A(q/RePa.%I z I$I:=8fF!QvrnY=l6˼}:k/LFUWuv۫駞 \𓿟߬Y3Q/ =tvȽ}MF@$V"!(*xY,&0E3"wuI2 ,fN)X*3 v`bsnj1iԝtxKdfb1 b& ].b6'p:n7ðX`0QaY!$%RA q8<@dYH@T$2Yluz.bs")Ǚl`a60E$|aVp )pZLv"APQcILlFQI%R9lV3AnJ@&ލcAp8\6kG!,K]Nj! \^r%Ifэ X,lt9I0,= $q%VnZ"14"Ie0|nuحE8%qj1ۍcb &]$AXl.oZ;EQ$IH2Y$A.LF {`+wP[Si<#C0f`.;1qEP ¶;=\QAQd (^H Ij^F` 3{Lmq EĵQ w`xlS_ݬiùsgGџO`;N65!!n|#Ymk%0 3@(|&:A< I^uVM,nq$oZ;8\)n$I->l6d2{0nwg{>'qnw;Qklll9;M*2h@HDf]ob]ؓ_{ez8´4/ /PVVyƎ=vh4=7}û{_:`0]%=;<ϛ7`a2,σ Hwtt B$(ljmmms\<G󛚚~Yy\&j@ L IMB,d20}wA(B2ZpTt\w[l%1nWƐ$UWWNDDX, ð:N'C|>I5u]]],&388XT@T\\":,$^_Wt:}|nDщqLPxTjVd2bInwyB`6kjlV\.3 ttz..\WWn7-b0::l!zĩaCaZfJRΞ=ѩPx#rvb0~f3MB <"ܓgQUUc2  J%Vl63̐`RQT\t98%Q+H~@whhF@0lXc)zSmm|>܍*0RƎjZkjklwד$uŲroXT*ոcp3gL#)l2_|%m\o?ۀ55( p?phG>s/MNJxdաwo[IA ٳtRr26WPSS+òde[B斖¢s^b0vcG3v=₃?ҋ/$%&wt|@vٳfN;e޽7ap|gR$7 ##s#Rwo%8u$gC::;)IJJHLW|s.Ν=sArc'͝xjR+ 5jM}-il۶5d__!44S3KJn"BajjJvш ᎈWձJfeg+..1beCCZ6777&fzSܕ#%7/왱1WTfdf%$ q,kذQt:W_oj7 ]`SSS$bpwttr?jgLzܼcGy0}T.\4qz=dN2iӷ?L&@BB{\nn1L6&$$x_EHfYǏe0>cU\p""ccbYoq+9M ۷o_47nټW!|;2Yrrj;}BMdqqd>x0A gINfݧK746=AT*JFsФϦlAQ4$$ED7hJNNr9|z}pP á!r1o M\(r0ؘhb݅E%FiCA5,X< eE,TIIj=y$ƦqPM߭% q8p@{^ETgWW||  Q*"(9#ucƌ:r$gv cǎ^2ق F^~l饊Ğ74={!5upQ@`Ad2N0{ʣT @F*N)6 :x(cYϜc2K]ϟSTT\KV?SO755hP(Leɖۇ$'d2gFy܅QFX̡C z1 snQ* <9ٷw1::n1{Dʰ[?+W~/#ABC| JJ"@/,j$'ؙRs *+ÇݱsF)  Oc4};p\vG!JKK-V+@{yI;h;;;=eH^eXFEQHI),, BL^6pZ9zL, Abc8hϞ=WU]IRkd2/_ΆƦkb)} d̨UU5.ryܐ`FAN׻|}K^~Fٶcǻt:D")(,;A(R2p E֑Zs$;G&ceX7r8zhsgD5kZȣL&syuيfs  yk8ΰCK̞o)ͺ^ykmnn^h"|_mЛV,TzAдiS8G?ƿ1Ptܸ+n޲7h|i[x_oĢ9gxv(&N{Gr*[1\ٜ/ ((())Ï> 0zА`RYn۞}4>~X, r.Hۻoo`7V d2X,bBcWsݺ7=!{B`d;b1tE oٺ_|bA˖.D2ϔ5naF qeKC|UPp\D"e+rcǎ IE= IDATdՃoٺࠁcX,6@&b2""Ǎgǎ` ;:$8 ooo?_ߵ/l颩S&+ FBny˖H$b޽yyo(>8(h7_٧=#.[x_YhE z}k}٧u7ɓ'N<kM@o˗-YlWƏ3~ܘ민~c9_zI7xM(-[ Bz 3&Hb2ۍ W^yv8v]$o۾٧Fכ n[o{Im{Κ9#:j:def圸n{BKL2}!I/jllh4 #fjqώ#*V<¿__PUy閷]\ʿZMM# UjuLt4 &3~P=T]}K/'zѠ+-)|XIZ \.aP@SvqPT*.`0|WPAu%7mп\f, ܙ>8~дiSn={Lf`[I3$q@ssktTaC Hf΀ں䤄l wV7v&;(bs8YYٓ'OU0:>3O ^[G0Z0Q#Soe~wd2M:444Iyy?Ye6l6p8LI444gTrVVk_#Gܘ\F3~ܘ8q=/ -ܸ;/?~<,,7^ݿPcSsDx#?(HwJU}63+7vy#A=444g<+CVX?o5}iI#]ȹsmm]],]\R6sqkjmm;p CPt7~cgyW=@kk{vQŋYGrfΜC?~ά`  a,e ) @Q77mJXWg;˄fmini ػl0~˥^9$G.y@PEQA7Ž?QRRqvp87Jr9d2ٻ…KFp[(0 X,b+XL[bom 0jdY1ܣ*UWgpp?yl_|O>xRnAAѿ|& JK˂,6h4Y,6UVVv{"ᬙ3.Yxsso-HGGGn^ ?3ӦN nwЂ断eatU܇ԆC0\[WuWVٳAКڅ QQiV|{BCk?%"bVT'>sXo0/&Nkw:q8~~`{:-o9J W_ b6;)12Ǎ3|P`1MJJ .̙=k`L >~qGW?ؑɼN\RZF?{RގT5M$c45&&XTHoG*!g"<>>|gg}_[iapU+a0 ży++0 ( giY|''d;[ZZ.Jlmux q6qv8ogzӷy¥+vqU?`!HKxB a!aU~>[m33)mlmmlsD"~L&.-gmmm |grB.YpV N0zt<ݪj?T*/=a8ʡ_ :=agw@.c0omXxݻU+WDdo{׎)2r^?x3)\.w!;vUN8+.]9tL-ΜJdYE%lieW/uVAkt^} 7ovhooب1o: '/_bg%̈yRltĕ+^^xtjommm ֿƺ}ûxzUSN>xș2y3!!OMLLaWVN0;Yه~;" y $7d崫8v5/LJju'M\hÞ=gArko^&￷h4eoGgĉoHO>yH$? ,h4DVjuȈU$%ۿwƏ>hcm} cN?ogn}뚉 W$?s{}ltu2@&UUUyuc: ˿~U+9$~W@^~ASSo߿wZP(rֵtMM^^ǎruqu~Ba0ZvgN>v_PxR KN>`0v "h7~#+Fc{[K?ё[x* PT5ucƜJ:>;a_n455I9?}z8|kk0Z!QPa@y:He¢ܼG635jIff֌,((9c=t"_QM--;;ں+MLo^VWU0Y̮׽EO_ziiVV6Y`ooW^~+d2x\IqYss̙6wuq:e2͚3gVCC#bcmc;,(,;g)4ztxE]@QqɴiSx| Y[[-^8bDrsw j$ ʐH$A$F.W;~B hth4 IC$% hz"K,hTFxtL Uq8ddL"tz$Z*C!ĎbU*@>:q3-,xo݂gxŒ¢b|ًD# F2,AAtޞ?Mf0:q0<|ݶ-,(,(,Z!{ |GZlqWWO.-+pXZ7pXL&zuu-LJKFGs&2\]&ťAŵ7<<27~q5! T(dP*/+qCkCn^\8:ؗP(OO Kޘ1qvR xN$nHDb9xgg#HdHJ>'+ޠPnn'OSd"(|whH0x|ӒE DD6ecc/&ɦ&\R mee){ZZFhff6ft䃒=JTZZX8;<M-Ymkc=uJwwstt &&&+W,겶jigk;=>O$b2.x^.X 'zDQAxS؟x9S,kۆJh@ 9Q. C]d#$BlTGg1^|Yn7*.?(llQS"xtݑMtEo0ΚɿWŷ52KI cƄ],r$eOr#YƏgPNg*.=*uviD+UmּG C(֮&QvY%dQ[r|[^eC_pIuͼr;K~N]R=)rfO,5EQ#Y 7ꋂT`)bh\SɏHL!=nU ^ζA!!4ZTT\6 Q*W2iBR:@$TL K9LH.cURcSsop_o Kb41`0~Tf3&tz7ͫې6+ !qF }# ax`- &rڥKim\6{̘i=)K }C/32Zp8,NIK`W[Fr6fQtTbZVI&  '$2J&jgI2N%SHRmeya8zDs`B0vfVv UѨL"0 k4F FGR;8iX,aTF 5Z-D&FRp8 I$~įmGAATOSHQ.2-ok^݇lSA^Vf\;KٓKoi:^і4#9P_ԌBƶH.X(M E6 :ク=*hR)t=_|DbVVMH1=>\Tji{΃%/>FN976fZiih2eҜY3 ݻUήukƎiF& Z>Nqq0e6w h:Xq4O-AK [Vx9I#ϝ`d5jT1T2ZviQUvi »e5Ϟ0 zJ\XlacX< sRjodrYy9ij.hW?? =<ּ  h]TTd2]`كq(LD":(-`UUii2bPZaшiLN>€Q[[u|*Zboo?qxPPa@y;~v}݋/fᱻ;77wJ$(0}# takΟE=/`;v6#Ξ=jZZj&F/hA២a/\.0I(d{~x{]l+))C+@V:td󖭟|Ĥ/B}}P{r%leW 1c"׭}udK/>=0{\3yy֬9 ^nncUV^ֆwC\3IP\.okkwssEܻີXR(z'{zpD*GҢÍD"?YUUUƍ SUjjj:;;dӀbcc@ 988Xokkkjj888X[ֶ[oGD\ngk M0nӝr.(8P+J&`O"JUuu ADRXT'J0 wvvu8 IDATtt31ᶵp8HP(srL\>caCFZݪQ^X,v88uiSk}}ob ԤOwNEiiP(nFKQ]\DH/wrtbXVl{;"0e[~ݻ~@#P EUu`ʻU{aQDp/*((HOO?sLccヲ_#.,Xf /ܹр+Vwttٳ^{5KK˧蝝}\g(Ҳ@:657 Wz.zԨomxwI B n޼ >=51)_$&>> 3pdhZLz9NO<<~ذ@AaQbb򶭛 ju>U3gΪj"hjjt;Y.^t~ڊJ\v[R)Uؘ ƕ޺u{ӧWORr9P|\Ldd8ڶ>ߟ_L$\]kjj+*bnD^XPX$H\c)JbbRCC㎝GGL:=L&gLFdDÌ;nߒJeV!A< %eť k4 Rekk=q23 E%EE% gJR [@ٳy浵u եL&7ڪ֭\.@ ܼ|FtrrBCz{iWp[ZffQcFs8L~9JԘ>DƮJA9y]]]ffƏe1x {̾>NK>>(|}dǗ b8z+K+k몪//_nlj$qtdĞ_!-ϰra 3&\ xL&y{:uLmMmObx!6Ǐsfςac,=X\]\9FN4Ə Dkk7pF&(S+* /E" XYYu b-,xN?mjb; Ƿw/t„usf' ΐB!L%==_oF, |jǍ` vk|\,NNvfX,, /\ jϜ9_0X` x<~`KԘѓ'O p̹iʪW|ٳft'N޽[5:2akk떖3Sh'Gꚟ:uʽגyCOHQ^^ԼtBƦ/7o;g֣l4D"qUxdjT(" $L&wuuD"`0xR`<U@ hZ b4aFxiF8Q0 ð`@!tn1 ^}خ![j%>߉Fݾ}X,<FzԘIɧN~)n[[qG|/]lgkK&bw::\tD |GG''!K\]\NN151qssuuuNQPPC^0aFtXb1\_V}}iTē[G0ڬ}m57IGD*X.{7^_T*/\21괰o^}uV}w&!~~rDɋS׼btzD+===gnֆ?Lr_`0:C9IDϬ10@* 11 EE!HCTzzz)T $˟6urNN~]]@6yWlk4>LE0,ɆuP*X,H$zyyM8G.܊BWVV5JR!)1L]]}6dG%ȈobXϚ9ܽuH$,K1=~ۍٔd<O&ӧǩ՚on+/C4Y077vp/@$pqȤ`/ZH$ؼWhme=uyyyy ˽?ukVc0sss.0k+N3tUUUZH$F#&<LQԁ1,dl'6ٙLss)>ޣTT*+iWlf̈3:_kk+33/ʌw#hhfJ5w˗nmm *yfK.YdϞ=8Z*Νk.۹sD")))A\nL4455b֍Jj𬯣,p{  N`o6%zQF!M /}B"?fNO9hGrtpx0!LZxŋoL``ffӏD‚77}-_`td}2{װ Qapwx)l6{HNB(??u86jW0Lxxĉ㑾IP`ѣgL8q|PP H MK&M@p8,o0ƍM>uF*x{B iW]q 3FQ('N)qQchT* q5@iJskC"=N:"ptt}ݪɀ ""d2~B!#H0'mmlg%̤P(600`2t//9 ͘w#GQɓc0:L<zzzk<ݑ;bcrTovΝwwwd]ԩSgnn`>7n\OOϾ}l=<<}}}Ǐ' ,@$$88X$%''ƅ >#-.Pw|PPMmMu{[3ͅa8+yח\+hiKy;v@$iI^^{a 3+aJ{ꇝ?i?t--ʻ~~\_"+'okll|^-7!s}}CWW@ccӶo~ص;B.z@AAaa 9o g^/DoVxaO< $3kR* \DoxXLITn6C~LlO//!0{oPFP҃82}VV-ʈgZ(0< e0L#Ӓ((((Ya@Ayv).p8Bf-Muۍ='ؗL"?lh?~dn~>PhHЂs|!އ3gbr|μEϢ {\ Z"Jfڶ!/O7X |܅[jM}Cb&Jb<W[[G |U*Uss LJT ƚD"i4ږ{++JZ]XTljbbkkE}\€?~-x~ֶuF bcJen^֭߼~bRZZ~9JdDxCCF-..ش~pLj4cGtǎB߲u֟>"K>æ7goTPFɔW^yyG=qH___VNEKcuvv:83S0 s3aO6歌CID"q҄~~w.\7쁟lm3m((0Sp8y;wze9A?<qZYYHȈtk:7; * ((OT,oH,I}EGgT*EܐH$ή.@:`4`4tz t:, ^4x3EAy`"@A3)/>~Ц攳bqAkhh0gq;S&7659{ϕ!Hݭ764]qC";wΖD$p8'S/55 "B1?蓮ny< zpg_>NJBǟ8ϵeIh]  /}7Fecmzʶ^XŎW^YameXxam]?+9v"jG8UdRNn޼dg/Z8J3y *L'44dE۾9ogg.QP#e(I hX\|ND? qRwn}^XuӦ< OnX pvvvI~OOD"!\.vwl__H$p&&&D"H$`0\.y?fX,p\}O;w#@[}`o" rttat999!'L78f_ N@$ x r C/ â%/ݾu lMed 70775*NBbb [[[l;;;?v23gӳe˖"8qŋ3 Pߗp˗X,HO?^{5C M<==\ (0<}nHWIɧMMMFNW^nhh6<EC&CC @(Vޭs@Ēhʾ>&0,hmUUz}k[[mMBdAt`niiUk4C W`4J$Xr\]{-,剌-u:F P\Rjnffiiԟ˺u֭[=|Trܭ[VVV&''ѣG8qh4;vСCSLIIIJŻwy̙3zzzv؁boߞhѢ dYahK P}}d2~ر+4$b,6E3`DӮ67hܼT3mp_ljjfX F.WLZϤU W"Hr :./[(͝0CSs˙3)F#bKJJ C( Nf4oga1ȩ{zzޭ^E"! LQ[ pK>u^&.DFax4W^ݽ{7lhh=z[6ld2]]]]\\L=w\SSSTRR2sѣG[YYA4~7n<]ahkh5aws絶Zh0sfӺ=+0رf]݋-o|_zaIccccc |'Dzy0ٳfp> 77dB3SӺF  qv#־ڲ}0ܺARg'̤h.^vu05| X7?ٹM_H%RU^^k&ZXs3_u:;;mllT*@ d2@ww7ߍD"QԞ&p8H`Pto :=P0 !I$kkk Lop8N_]S3߸Ǜ,.궱X;Jutt9zO$ 5ՃsZ r dEhrH7>ab… șDg=ݰXh4 d2is.&% /cRl`٨:8h40|aXdE 0 #nX,IðhH9`0<*J>= `0,iS0 x```w7WLvfc'>C"jz@KTV^~;N\l^_bDyBC6˽"` 5pax<~Y'Mlo8bgg;ft$٪:!!!DVx<}mm\.H$&&&kk릦&Fۋj=_CRwUhK\1R\N*Lee$QQ;8$'kjIdWҲ򬬜ֶ_~jZfc0 RdDDUWhTAk+׆"2>kժU+WL<ߦR˗/ DEE ͛7 e˖!jԩ_:_vttx!:vV k+y8܀12&KY,փ_Ʀ_0a(/Sn?xJttv@Ay| ښf pV͵;/_VҀПAiWR(I9nmc=6jS[|y{[6oB& ?޸ n3QƦmkwJ\.9]zN{]{{W_mvssC6fdd?{*>.zȹ~;|Ϝ?fA&:}dGTϺʊJk/ZvA\niiwojUU$lkݮ^1oll oh{JѸx`0}"Z T*D,9|䘳3?4$NV6\wp?_6f蔳纻96˓@ 0F@*:P'z((C  |  ɯ\^WW>h~1<9s]pa*l4KLP"î\dbVWΘW\TBISRΝ ptr0TP\ty劗dҩ%KR,^W̟7I/ɯ߸Y\\:iƦ׭A * ((kkO\~~>R/߭ [UM"\Ӯ\ssur &80JڽoNffnjj "$ ǝ:tQPa@y,z]KSv~B& A1~i3guvvر#HSN>w(/۳g$D"Qz J,cJH$%22dҩC}uG牂  =8lݻ፛4MS0z`'î'̙q__yYl6)  M< AK\33~4iC N^=m]?-\8_ p=pX_QyֆN [|IRڎ c?߈ÃX,GG'gwxk׼X`sN'jwu27s h{~W-a 2T\!);{G64æ o߹~>q * (( IawI3~pdwww "FA/s50vO1/6w|W )mrYY;v=Ir7}:Vۙ>򣍛@AF4ss;#IXR1YSccӏ?)/8]? 86ZV`jȑ&O| 0~ܱ'TjS,@VU*հwj*JVv1ܨ둍=E#U*GWT,{mo * 5]\----OGgNcevH:֭ۯy}ނ?gQYY|'|@ I& gSS'e29 `=ޜƦANoZwwwI9/0/ K.^\VVbuZݜ ў֤MMMtr=(0Xٳf~'Z "KȋKw)8(H.Wb;;2"I2=gv3= I9gee9{1UUU9::e˖}嗫V.]}vW[[zڵ5kp8OOOqݾ};!!ܜᄅDGGN0S޹sgOMaz{KE}Ba*@pM5亸8s8aByys""BCJΞ==ĉ1UUUϜswsr5 D؇^Nc2Wǎze/^qsҤ Qc';;W&\‚WZZo[hϿzڑcLJ `jjztJPp`EKKm* `UjLԢ1\\kkV}r**+ahJI4A,h4w}[[#umuD#@PTjKK "Ɩ6]TT511ACB(KL}R$)TgW7H"b&e/8Z"^`Xa!d2'11IP0 ~}PhZ5-BV-er9;.' 34 =##8 IP+` 567knjvwsP(HP@ mk7F XLRkkk- 2blv}}D"DPegllP(\.WP ȎȭHO$$>E %WXmrgߕ( <.(tsq7j8қ-((|uaGm=xK}HD>U@9w^ 軗T,& 3d7;:ͭi#zHp+.*)-+'OrcOx{=hiiiamm055+8u&44dHr/'jʼ>voTWWwvvݻWg@iW\޽Ç---}uuu{xx"""N>VQQ yf}}=4/=jԨuBׯ_?⩑фIh4F O=vTH1g=}arr/YrRԯRS,Z,~J¾}Аߝ0s8:Gs鄙sxN& 3&Ʉ"5362Rt8qc\3w 0}HڠƺzA$xp>x<J#"uVoM0a푑PD"EFDD޽{ҤIYfyyyEDDlڴ):::000eʔիWGEEEDDbbbϟ?{ҀP7o7cPAD>20pCY9\.W"x]_/{ę3eIX_qETJǎ bϝ=Aם4qu >=.hwwsKkKK˯{|Yٽ_m=zwSSӟD|>>ڼN&]tCᡤظa@v8a|C/%4%K-yO>?iv4:j˗ c!xܜ9Roqt ܥHIcm뼹oZ3gz_Ydn2 qqqqqqC7nܨ+۷o߾}H_~ߡVZjժ!/^x?{puuۯ7l@nǟ03ee8xXO?q|!`҃Q/_?.0`Pޞ^77̬sfN *Pa>>C "Qz*b9ŢQ}-[ + /I.]a.\7v̸c^1E[OXK#cXAjuMMŤWSx!ͅAkZ\.aqq d PVV~͎RH%ƽDp3ya(4+)n`UW\M֮P(JC$" B4 HǑu``9}e%=oYyeMMC=ݝ8DC5H6M$X,,, X&X@n# aziORP(rqv7vLQa[Z|)h4r7lX&}{t:-7;X$i;ࢇo}illD&Lt=X"ᖠ:yE% @h$5:2y\~ $Flm\\l3;|J_b#ٙP*e2YNH;=9>qpdK cOp8C  [MmM9~Z^rL0A*/}ZId{GWPkttp D4gZXCq$fqqjEb1@h4^g'0Dv:q8cI=S>۠sF";\4 mɱ@ /[bddtvrVGR6mwƏt}s _ d L Q(4@Q*Rp,Lrvvx{aA3n6166yvLicc pF< LH|po"65@мF=|k8zqKvknߊV=}wi4K[pYB|ooKJJ/сJ ~ccCBBlO6l X``.:0zypU "Byr?P(:!iJQT*SnL}*k&yxۗ۷l. X;WTTWWOotktB)^_q_rUp˟ iblt2QQQGjk몪׽a}}ë,+-ϭ*ږ_57."D&SWT@1X4Mk3f͙;Wܷ~eapGPo 5MrrrTT֭[JڸqKtt7 *oqqqLJJj?|@C8pRҹG9rs.xVqg֭_nw]zm]m`wC:r|QJWss d/jRy^|'[ZZIdH(B"4>Tqk^H$BPT6\.2,K;0X,T*Db22FFFD CPRuuwK%h4ZO&{D@j5r@ j>_@&tj@ +,,ikk/)+O400xO7_mbD|YSNR)WqX/JE"1id @PzvvEE%n..d //ڵk6lpuu}N<93_:ښUooӧOdddTVV;v088ҥK999{144yfFFѣGQ(Ԗ-[ u$wT\Zy51 %%S-015ϿvW&‰jE OMSXTᓏ^1X5`ђȈfAAq[[[?p A{{yN2߽yfOHӣ"Ǎl$_aR`0\.J/]NIeMiM㞟]]];:>=,}|>L8NƍweM:JI:NN&gϞaooz;m̄i[Xp8$ablֹ`K155MN}lƦ={F!H/yj>3lTB~3H$Kgcc4455A!+++HP(6D"q8,..xѣGCՇqGG% L6!⹾}})׮{z 9ırU* ((/?5|?Ѩ5)&&ƻv1`p8Jz w1 _, l+iӧMv{/GP XS'Ǐ8zVRᬭ8a \Oe0kpr$YPdfex2LRM6%/=X,^R%?yrL0099L&ژJK>|#Lj#G w#okkbL_x NmmmF!Eyoj2doogll6֭2<^;7Bi ]CCCՔuuu=N{daaq C"!f/JqTPP ?wbX( `oP(@BaZ_p/ZvpEBe29>oKgKէU ,;wnxޮvu~n+..uhl^>…KyFr΢ f'Κ1x( .X,AgjmmE 1X,FQqA CT4D.d2\9s`` @F$tm( jjwwD___$S(F}Mfff bX.C*f DOnnnJC1Y,VwwRD <o'!3M|9xP*q "`jjbeimkG !?,Z;;;P(GGG 5:H$& 9\pq#AP47x^^i?D&NDFA: svvbT:|2jfpoXtHT^Qbf<=/^,jk*8 ;+B!eiaQ]=}*+L[Z***BS^2|O9+J[[LMQ(#G-9FccbccёcFN6e(*UP\\sM!|zY7888@~sv:88zhoooYYYyy+`ԨQIII<>>7o=*uW.) Z;hT*%pT_Cs(Pō@ ȁ(eG;;;6z_]]c0ag޸1t/KUeB)]$CCCd2̬b>qt___eeuQQ.jj $rMm=x`cc]@crB$V 4aiogWPXWPkf+֮~@hd27nXV  h4GC(_mD"M>u8VBfK ,!? v|mIRSXpjmm0}*H|?kjG c{ȸY__Qh˻rUL:%jB H$֣P^*\| \`[X,/7| ?QB&V"4=3Y_Nݮ+ B[6Q(/<)Sc'wssEPl<8(^fs߸<$bYY9%eZxRܿu^>ݴJƍ[]&&Fg47gx\rU,9;;mjbh\ʡ'999JJKs::N3Oc0Z6q]ӧMbo565I$Һz9}7&(0d /Rz'pw BWQpCP= pJKEEbxt:mkV5zԤKW*+g$Lyvcc ;+8q֌c**^?71)2Vm5u Əp_z5 ;>Ѕ Q((|{<=M)m7SN ]ޣ|sfuuvpP\Rry9ee))M7oL̛?ꚚiS'{{{ݼt9"!a]jЕ=x"Bbҥ{|Znkoj5#ܺeɓOHJh%'N9***wׯ8x7; oanT"h"kkcT Ӯ$WT"^~{{ʳrzRe.U*F̊OgΞ535$5â⒎>;!SX,F֨5q._ @chh8O-D@_JIi4D"13_f̘~%9 D##}>-gΞiP벫H"zxPyN@ЧT*++ NZڪkjI̖H$E棿'\ `0!I3 3'q@M-#UU@ \]~ ?uvh4ӧT*Łچ ihlIe@ss)qťT,d2b'Mr c+Q'v_-ЖQ(sEML&cҤ+g X~/O ;gDQl6 ,tjہ-ߏd~З[&a%r,"" 4`dh/{/oܸ%+$RI]}C_ Y4ʊ;ibpP`Ol 1!'O-B^|)>$8ر?3*$$"2Nnڼ ^9P$:vԶv0ip/KGF@ :8n̘aZFch<rŲK@B>}hܙ<7:2",tL`````aD"Z~H L B7fhX``ay{{N:aތc ԼO={F1@ H}D89:FFC^o X7/ "Q_|`r4OmD*?1%K(]]]gJ%A(d29&z,/*.ZP󦅡.44T&eT*=]F.-_`1QGh.^L&O5{w_ z3шb<@$---'O)Z\68UqIIpp 2j3~5zNoI$?tmm}𾩩#?jk9II~nEB/^?`^00Aå3ND.W`XHQuwOajjRV^O6DFEE &x%;jjT*qm]=`^0pۛe!\:00C?cƌSTT$HX,V`` 2a]] BQB&ggTTV" N b0vP(40^s?++G(5ꮮ.SSaxu{ef)S+K|}'fg U 3"ߓ’-[p>KK+Vturx<T*CRݸq--.6vNkok>F!ny 2NW(gΞkii̛kx<޵7z(c {^bxw Μ=څa/-]nܸeeű>=]rMMM6n8`{emcD",{zs􌻩w- vv$'_۷V^^icYYYݽYQQn!<?.ǟpX|Oo COOի X_* ξ޺NE}}}kV*n!j4= ;1vCCC(DRe47Q(WёCԿҲٳf |>^Cw^p &c*+{yzC n֧<O{ 1Rq^VBGZׇc:uvvi`XZͧN$h40{ [McիV B!GP|(+D"* 1q ?,) }}}ϙ3K&.\0D" E"P)U*UҢ~ ںz.IaQJu*b['.q /[^^30y1~}DH"%#SǬV)rR!{ qp&HM >zz~r ezΝtM,S\\PPQZZ6u,$ P($ɨ[cccCee  RwO::j{V'Ӑi*3332ijjקČ#77WJ8ul^^L.o۸c</o޺}1rggnP*Q&gOƮd IDAT<=Js633ӵWXi=̛{܅3 /^8ߟz;$r'X*L3=acT*Uҥ+I(ё%.[sTXT͛>.?<|gű\dKQqɾ.Dbjga` J cX,ÕWT3t@ ,--XLfSs?++]FFO>o|˭yΒ2@kVtp˾]jjzCήP(H$. .i4EJ斖}`gg罿}%e===wPȗ\_gݺenm[63Gji2 |QTT"6}; ]}GIz={w]&_cv>PնwܾegwrŅGEK$RS/D 9"~(_U"(R!̀㑨$~i0>ɷuh BB!!n&cɱʺo6 0XlPXXXX&'hn@gǛ'dܽ{aZmii;ꉇrwwqKYjukWx{L[ZZ qqɱ|9--d2ArR)UlrبMQ/744pʅ7`1 >^9xpAVV3++4"<@$J%m7D"XْHzpQ€BDORH(`1Y\.O.C;hBD"166~^f&zRXqo*R"H?466$&˔h4 ӓrc~-(OP+W 4Z:#s^FV;ZvĘ[sN,Z;i575]tE h4*J?FFs̾px;\P;wݻ 3Ld-8{hG`jaUN^;; dc?_Bˏ ^I_sAl6; /vD !J % NZJӣi| vT@ge3卍M&w\]]u˗bre HZ- y.+x%%?^hlL>U.W8t&Bh(XQ̬lF*Q*)vpy;w~kfjE"n |Zcnnjl 4qŤN' bx+@$#)p90w7W.~ƍ[2lynC~ GPTD ƹt%M_~wnpO(볳\} '(Jn@ 8qL&S(88}}}huŔHo:{ Ow(-F37g9rQ^0^_[[qW!Wx{{ X |djjJ"?TZJj3<]CP(%\W* ֯|fZ4o^Sg?~BFyR%$WUǏhG, Pv%PSXLӳX cZ$AgЅ}B}?:\OR 3AXN%h407t:`kcpή.$ild4jT0cl;f&vnG"E wtth0`"H$?r&47*& ̜1 ڊpNidhɡKzz{ 8LxccȾ5; :`T;,D ss@HHm߯GZ/{8````^0@`gk l "R!!Cd2iH4.V͆ 53353a8^_:t8ʊce5Чa͠[pE2DFl3($? <,!,b.ñ piyyy@KlAXX6.D?QT77WgRQ^/=G@` 5*Bb!f``0smW-wq{DbѯxF2A5nAw #F|h˾+WA7nHpf\$[~59>uO]bU҅33 KQYwkxc \]]茡N ySce[tqtmmiT(lKnhhKt R\.Y.S(dgggP*[[Z[&&9B᝴tssjYVXZZ8JU^^SZQAl\^SSݍBffl B&x<4WW QxJjmmkimjF/  롫ڍEZxرc7+%̜-Q 7ozz 9dɱhoh4P}ڍF$)Oijj}'/ˤ2H4ftdL̸'OU*GP,X,r\.q824eJy~~zhys&}iC}wP(Ԃse "LFR'iEBoI/..APGG;=~BPx28{& 6 ~ɓ[k:lDMM[9Qih_* %\^왖OAnn..x O-@ LF⬙]] ׯߴp,7_R*^nZd2g'G:9}BL*srtX=W*Uadlpz{JD!y .2tk+T&J#>}eK˗%y3|M,;(r322LO ~㦡ʚ#`ӿp% ŋTbZ9edloHN4MOOIή!s.~~jJ%bF&9zDP?HV, B`'jZ HRGRVRTv>ߏ`T*I__H$BT*]%%[~E"6n:t෗XY۬YNxښ{xifԏ1%mfV{ĩkldbRwuuUkl|$c>MgE8nY,&S̜5/>n %KWj5XKw3:;; GOl#n.vHчǟ43ϠјJÊÙ0?@ן=kPRt(jF´va`aimksssT/ObW\zip`9[YYvA U G KKc#¢Vq{fff"+V@^W!ZmyyΝ;ژLE"""Xl}}_~L̙\g}Р7}x"ݽm۶27cƌE1[pJ *5@ FƦ3h/6nx㆏z{{y{{ ak׼vͻП 0U._1׭]53@;g9R(H~n臥C$wss=|phw;w ~r됏qK,VXT*-.)L&C$kH$C$utp [| ef64h[33ӶvRfhBF <=>P(L{{$R'88ثT:JfX[A)ʦ憆&Fc(D!77鯨R_޾~Zk׮[n%$$ R;v}vjjvڕnccr!s'O$''8q@$%%UVV>}:<<rFsd(L&mkm0|^fVZZh5m3qiSh4]]cFA*J$Ϸ;wyxSҲ)S|~ƽ̰g'¢0cc#6Tv?QS[o##4mgW׽,M_ s&i4G}>;~ "UL&Àb,v`گ0EEEsss J*((8|0F 촲<~8F lmmuqquցh4wNNN}}_ZZږ-[]\\8NeeRTʑ:;:^1N}}}FAa`ZaP*fΘSUUSTX  ::bmmb'BEjF )?yǏN ={!0 1vvP(?GE&p8h'FmccԼ|_&ʎ?Y\R%+eWj$auosb0dBwk㛶>Yޱ{E @2a e 2}{{KKm--PF0 {Y2vgq! !Ȋs,g<ǾAS*bHcF$jB^^^!Gө&r8BL~{Fg|&ā p:hhf# NtrɑcsfB8z:99f8;b6`@윍m8a\TTtZf17Ya$i]A`\r:κK``~~t:=>.l;;;VQPd2bb~e/°A)I>>ԯ!Muf1 yѺAԬR 3B^Jm:p7?lm":H+ØL&U`0X爖66e!Y(6\.׆b]VB&l63tPLV\R:|XaaZVH\]KB0V뒖[m<kh4[FaFv ì7>GEF`f'Ϙ>%/Lq[ZZ\E*L&mU\SC㵰X,.)OOϊ L&0׷ !P(FP(Dyyy#T*Z'AUk4t8Rt2}wĉSE%!FotY8}@EvvenYlvSssK^^[Azo7O?nΜ#nn4I d1Yy+a07nVTU_}1)i`/aEzyjjJ8fZ*Z!Օ)))*)))**:rHJJ |ƌ #11ᆱݿ@ F=zÆ GX,>>>)S|'OnooFM8񫯾H$ }03`xȘLs[^^wH0޽Ii#FF] bh९II9{|H!S|QvvYWJ%%,SUTVz=\}BhSLٷoߔ)SBBBBSN˯7GQU*_@`gJNt:a)))#%F4WƧ萷իVy{{:saK7lZ[ ,KT"si5):d7.\≫6s?7WD|BBig'=ЍFSWSl7O&IƒP#!fX䵟kWvO/_j]DSpGo( e$@sw빰UEE7 vogON4sgXg"Z'~0!/?ߺS>ZUUMdHp}\S]]s$Ip /}oov\.Gc3db0Sӎ9VUUݡP8v ꐵ=_|mI*fAuB@ wtrz<2u-"h$IBGPB|"QmD$ &MpppCB#eg655N6YT! JJqÇ |Leoo`0tf!N::9Jj<=#"===Bfʹ ywL&"P! ԭMt:b:SO$'%Z3 k;BKLLHLxÇY{xS٥cW,;Oh>w8 Zj;oos/iwG_@&;;g:=}^OYWY޿z'7/=Q$9lb1"ԪN ~K7QXTBM74t3͇3_}iQXXbaɒW+*H^i:%`d2YMMmXX_Xrqq'77:fW--Ҧ)we\ޱ],,9}|555g1ݳ\}?쳈/G$IVWWϜ93$$dܸq.]nvlnn7o^HHHjj'*jѢE!!!C 9x lf͚5!!!IIIv2>Ӈ>}Bs/WWg_˄s3U7 nVWu:PMMmǝI-Aa=;r<͒2icc¢LFL&ommmfZTTdyy1i؃z<|X޽y|u[nnԴnfaaaQ[{ƍZzw=*2$ɶ¢₂:급x~1yyש5%n;v8==}7o{}͛쒓srr냃9a;;TVVFFFfddvvvṹ`7Y{;s"G pL#MJXXXtfB(m҄樑ιy|>?8(:Ŧl1[,lxaZcc/rrRG oޛ>0!J}B66\@=OpiB/]pwﺎ``08~0̄7\zիF .EFwttd~Z.;;wՊWCC{Jx6;ױ&ɉsttl25ϭ5{{{@5566zyy!D"ITn`(JPCC7BƆ*gtFct)aXj%ā\.7,'B-*"bǍp8?r..6a6dpJ^ _40q`S °{ƘLfRalРd.צ:,l2A}tz^ {_TrOx$)soƀ8NݱgX,_njwC$""»\hNA}W*MMፍ: NNt:~#ko>>֓CBn F‰Fad0pu,.)aY\.wƌF?:J$ubLSssl6L]o0XWWjkkcXT\ r9a<!UYY4L!jFj"$NjUl1TͿ~co׽l]p~NǃUT^xZڧOhV֕~1Ѷ* BXT^񿹦d2mG܀ ԅ7LB/7t{1B[>}B^;go߽@`@FwZj? gro(9..ѣqqdXNn߾666Tr 2dӦMΝ3LTҘ1c6lޞ֫W/ȑ#Pt#mϽݏXlڅ_}_oJt;٭?Z[[I;sƬ+WO"KJ`{`̟;+/3Ν`-IAAkyxxTDfy3BhTGGqcG.doD,PYY`t@zS߅{*vv*+*, a.93LU3 f;h4Ly ^~e oo D"Cmko9yF3mڴ3g~{4lCC``2 ,ONN>zI -h4III;v3f?BhL&3))iÆ #F2_tssKJJzw lW+,,KH _|k|라yy׳sSGݸqSsS|ɨFֺeeB,ycnV6;'_Ǝ$ /ǾLVZZ6kL5=44HoGGE"̟rvcFY8/Y!tĩ oo jMUUɓ}=..y~f=+11Q?l6~m}40)ic"!̟`[;3[}gݛ_;3̥K.]tꁧ֭[`B.aC-s'w0O>q C.h;w2ĺ|cZ,˽B>~~چkr$uuAAjNtj/*U X*aBjkuuTu$B֐x"HT47T;x{{Y,ZHT՝N"E"az d0}N Ilx\.GRt::H;:: #rpp S}mm$I<[[[IP*U8 j$I*NO}0(77 NCz\%6b;;+kK{;J1Э?co0YnuzyArYNqrN8a Bhj}8ޜ>'L:uʤ!C''%_PPH"2%)qǎe%oLf8҅֍:sh2x{Ϝ1$/zMo2|fK 湻;pj}sK 3w+`CWWh4WW^%il~qR4N9Tlܹs^tqqٱcW[[ߛ?wUj+*ZiS|?lNGFM`ggܲUUU6< ìk3 /\d2ӦM{iBÆI02u:ϰ#+s@4.ԥ$'ob2/ryڵy77HS.yYե;pĩŋfg :8)q`5/g]ikk_*''My/Π8__KY[lHdZo7]Yeov𠔊ʜS={~_}V:|GVܶ3'7_mmkVҲ{/2ƏsQt/vg3W.w<{H^ꑍ)pUa8w-z׮l۶So044H~cF\އȈ^8 G |>@]!Z[[KJJm\^qc|>suukx<63((P"C͘>M$%_ 3 <*Tʎ}߳x<]nnuuzz ;1$/!s)}VXR:;{-FHb-@qAlza83֕A"0 |WWW=_fvpf!*8I:h ,_߭G@0:mTP]A|~K[[o`G76;)1ao .$%RSU{-99q㷛x<ސ!pFM2p`υFsr._:Jv,)) 3zL&ϻS9buv*fs>99aa}\]\x(ڿ'B8[,JRTXT/&!ԧOg}|uZ_ ϻMP+`4,"=Z}]լ Q=wYܶmA{Ov_=tȠ7\gXN())[r LJ]ƌmν]\\]uZB(&&z]_wXL[5ZmLt> 蕜o߁@ f rrv2iS\l} 0}o7M164)1q B''GW ãVV(#I2+ܲk__|5A DC?*$yO?O>VTf $I$QVZj!=c&Il6Sh4Ni4h bXf3I"߆$Ij B-6eX`0Af ^d2$fI4LT?ϝ-8S'LT%JEWmbA$y]_1Ed& o#f B7b2-YwV0f_6C&WZy̅/ްqkmm-칿b4I%";VaCvz+~뚠pNFw)f&amk$J-\} 1 zVa0 FR?@WO&i4xР @0`Oann$igB;@0Dv'͂Job!rykkhp}FSk['5ZbW2FRfx<AEE"H.;:::877r Db5n$I;{;Z !P([ zם _CCS%:FcX&Npp߶}W jj%W_~~$āÆ0l&%_κ"Jϟ:urh{0L&YYUgv\~XFaQdg}/Q3Sk9;v||\:qx#RS#GJN80l/at=&&:!>d^ʼ80>((l6zcC._b2֬Z!7o!A:olo2v{`x"677oٺ]RM[>?8(ZvL&M'7 ׮e#^6Lu:BQB{\t3:]&7448>bİ9鍂ZNk4?=<<|7o?s 5_%jb#7vLIIvqv*q$}::9R.~ܶ}o2zDIqe˖xMiSўCЕrww{ߗD= _ZW0k[C>7tWw[M8=wA&# FJrҽsgI Ngx6ԥ&^TZBi6mll0 S*0^G\&rN:d0L$e2Fa0bfk^_ kWW<6c6U[ӫT*{ `O.!d0'FLy-9l \ly/8qk&Nʒt__ܩT}W|uƍSwZE"c{{_^w׿㕟}ڴ)f̙s7 ־޹xze8% JIINy1ȌMMM~~Z6+СKjkk򲗗Olq;ubM!۶~m[n|}kr\ŭ?(u8j}\~jvIqB8w¬Y3  W/^+AO pqq˟dN8~EAAfj*'7o_ oXqZvddBa .>p8bcTG>acNAa0=5&Fb53gg:%7@0HBqvY~1!wwiiiRi~=$ maB;w)UotɔcP0//Ox a=B٩΂69xKx o[UCEEScǟ~T־g :Y"]κp}圹 \\]_!k1s)^rrtdSN`JNN& ѓF.E` x^ըÆFPQ1y Ƒ$8@3ky+-[e: IDATZR.׽/łh :!t{b1SFf9rɓİK<'HL&#EфGH$F#5쌁8v_~0ǻu!TRZk^PkNg٥\fh4?+k0lq—慄U1ΚZɘ#MfSII^o}[AAAaIJoAN:UUՓ& 23N9kkkd28Nh0R*c0qtt6tH$lkkiמ[^^{~?6vԨmmmPkpPP䴉 Eo7~ ۛ[Z-\߯VbWd&$ [^Q>㎵1s4GGG$mnool4i||܀vm+W,{]I@08 2 `0&jM Z 68 Nj|*:b0///M$I0hG,mlrtphni)))y---yyN&&iwSSSqqѡG`?xGepZc1[ @ 8yt[[ہnxu*w|i#BH UPb...%%M!֯_̖755?!d+TU x/3{ _+;Uaa} YflzK^ +"L֨_^5""B(®"FY*9ud{{;:>͛|Ö!A, !˟dl󼹳B3gXbuX>_'y<Y@0sdJ  b18/Zo7-]2Oﹳg!f~uݸ>G2iCPdGdVe׾vkZ ~dg^Vuu~dZͶ/\dhG,24xM!oٲy#4V"hCxd?X @7jU'4xNA.k%,Fhx]I @0` @0` @0` @0` @0` @0`@0` @0` @0`` @0` @0` @0`ѡ $ ="˃CrrPlccxXaA<6;Щt˖.6 F4$>vqq]p)Ƀj .\8pbU^ʒ%I)Hyp bkADN EFc2f !QjMm~!A%P Cb;;h.,"l4PGl玝G3NAΜL8%F}`@lkbLjN\Q*UcNXb jt %<<<Fi5]7 @0` @0`z&QQA;:^w`ptt0_` رXl} BBB|M ẃzBb1S9ܽY1G `C=qI 2h AX,5EӨ! q{{-@b珕n%IENDB`gpiv-0.6.1/doc/C/figures/gpiv-fig_console_valid.png0000644000175000017500000025360111204235560017123 00000000000000PNG  IHDRoo pHYs !dtIME!'O IDATxut\ه2,f[dfLl'f4M6M!)*|iA3$2d1VticEQl׵l9>>wͼ3AQT\\`0-,mmmt\\\mmG%I G"B sP(XbU[S9j ZP n"Xj,{ZYqb0e@dlllrRuǏ@w~EĉS ՚) %%ŧ$3 eY^s`.p({wÑ^F ^770==:thmhЬ'  =jǤ^xСf%=#gbmzyv‚&M(k[[*(ȟ26HB_z5=Y3hV4mȲ !T*q[n={S(ެc[(8p(K!8p ;;;77g"سƿλpa$>LV7-['11$Mr;˲A<_߰qMj;;܀BeYP$a蜜bT! 2 NNJy}p8$ G" L_2]G.kPP Cll̯ח^yf?߸is||y DWo:?4T*7e]P9LOG(/?v8(99944Ϟ=bo YPTNgkrss Ç'NՅ :B@CUUU~},W[[HJN.PgmV[Uu5EeYYYӧO>r8 ,RSHNNPZaX^ :tt} H;({~eYerҺxRL͘q ?o__6R(!$Qn)}gxc`'?voNNNkkkm]m$}4MG"Kn=p< 8E"H$bY;zF#8r(0ztٳh/?!>qSsw?tPQ"NJIٱ}ۦMfs7odXǍOtuuL̎;:$rϞ>Ȑ Qx??8Z]Uuf1IMMninH ؘTe1)9)';eY |ccnOOOTTilj86:gfX22hRCV )A<ϲlq~*Ƙt3g04iF`.b9z[8?A$IR$Iv qpIz}mmmWΜHINV*t,CIEQ5I5b$)8w1=AE$s=A(IH$%eDBBBSccee%A,'&&Z,yd !$J[IB(B$< e!D4=pƆ#G~6d@@sh 2Ymn7DnndµEΝaߴ^IXH^s/b^VT&ﶄ. eQ<@(wA]mReWQQڒz}>_CR 8v{錄1114MG6APtԩ:.11[d9je6[nhilDFAa0,I!whgLR|{Օ T*f3H$bXdT(qIx=^!5{+ow5si7!ҵ?/n祗l܇fͺ$SN8UBQEQ6b"*A$F􌒒 ﯬԨՒ$ O: cII 0$Av?^V^^߿;!*UYYc۫R `X;w "R D p8*VFaIrrrTJ%˲eeGRTP*K.|CC0ZNLJµs^a@?N"!!~۴ZmGHh/0L/6 0n+ry|N{{yW\f̘Q4M*(H $,KQU)ǃbL8 x $ѢP*SRS@Vz^8b:.zOJJVCXH\ܷ_0@iZ p(PTQE$OQgd"S>$IM z Vp(5OѨy')Ozby$IJm FEc ÛoQfPR) tLT_? gKe~$6Mw^l7xUP:JEwNHW*F$ǟ$)<,BMsJ*hF^n?uzzHK¹z ;p"JQU]v222 &'%}7LyEcb.gW0|b NㄘH׿-Պ `Ẅ(IA(omJ0 SROI E݆Ѿ˨#x(褂F3z( 4MB1n!71#@(.10W`+V ")%%#=#C!aBΎDuĠQ,2p'qޙgaRn&I8]T*]5- HA(p8sC^3fv~`n>X1Ҧ1SW+}x3܄|# P(8E0 V/770(UjR#w kZpaCADž `n:MM IW^ | ,  €`0' =<`0]jkjwIk ͢K6mڌQ n_Yd0dYNKMy $I:uJ߯VR2Zyo޺m{fFFll yر1GE<[UTTmԩӂ(t^q8O=j.O 1|"JQT~eH v5. ϷkמC\/X]__ҲlΟw㑫CJSS+qa`0ֈ0Ω)[l$iѝ:+V:un͘~gZZ%zظqsII1GH$r,!eu6A9|ѫZw&?_O͜1m{Ǿ o_98b3 겳Ύ3e8xh/~^^b{}] 8;&7nu?-*ڱsJ4q€k~ sQP[W5 -]5kt^|JR'zݡCGkDQTTii ;v}zcƏgޝvʸcT̘>----,,ٻP(vvs .v: ,\$̚1!vzxo}Jb0RH食F1?/o`P޳C\\lZZ;^/III9Y磏?* BY={333 T($I^tٔ)w}prrn'p`070||'YȣwK:1ϻyxŋBsfu8]^y5Ĕɓ.1@*pLTvI&?< >Ï23|̌K}=7C`._(׷ۃI$Ij4Ji/V{^Rx'LgϾֶTT4E}p>CQ#.Zhn9v1v(C(Ct:d/V/Yh0B9g̮7_p;<`C(^?< GvByBn"sU*UbbaSK,JK&'']nɲv{j!(mfŖhfr9ee )&{=66BDz 0c!ٙ&1)1;NrJKccc4umm}8ׯoKl:ꌌtdZ۝d2 y*Q#32үK ?ۧKJ6r XqtSchF]{x:97'^8}c'Nv2rq\7'O.(+?ppΟwAŇ8+W}ba~ޜ9.W,[TӐ0uD7ތOHz*])_g|TTT7HLJo.ҎC 'Nד- ƍvj`n.U R rrsr{yX=^p .s &V˵'''`K \x \N( s.( ^vmkKN& <[taD"zEon߸qhׯN; )q1 8pз8xʊSGv< `0=!5_<fXuv`07Kt\|2N/ . zI[180 VѢRk*J s}slGAypa'"=|d6*Bqn" $I]b0݅Az,w8j9v]+ii)%i4^nDl `6rEO,Yȑo4r2H^'ڀe9 }|E<qCUd1cΜ~G~70!==Mq]|xÛR9߭XA(ϿGMIIikEp8 -:u}.##:f#qXnxaA,KF'Kt/aYj?f>3[׎]ZȲ fddx2 I>,2?zB#/rfffʢrgU(ꪚ斔Լ3g[pD\sU1"+L%Q(!I@Ij" }+̧ c6u* `0s9g**{MM4M_aXv/Wu:?ǾoZf#A Kd^ / l AY !',C>,bh$I)Bs`uGViDISѬ߱AkV!OfjB hnnt,BeYQq-Q~+ <h4DQܱcJO+**}ܜ^EUUUGm^r5@僧O<v6W-wK&`|)Y͵i7Rm0(#mܸz_ E531IRSM Ų/Ѳ9v6P_ߠVHd8H$!>^4eP=N[jk D4CS]5@dInniE&dg^h B F@l߱Q`0xi599vB! k6l4zHˑ$IRT?_{ލ63\b옑uǐo./?`0_PmMMŐH0A"JPGⲋRxDY8JjOj&(::}dd;{⇽Ey^4q{5$ gOt6P%7ՂGϞk4vlt@34I Í/ Br9 bmm3Ci _9$AT^C$""a ‹,@Q x/Y RGSSS0D"E9NP  Id2\.lذ!܌(] IDATyT^-JdYV_bwп>3+S=nt:m$G̯0 %I@$" [f$>-8smGSw;D"D@FjtVnSN{OJLV-E(,ԅg\L & 4q׉hur4 "HQצf'O;FC$9zXe/@?vt>jzΜqqg+Yp Ix&5u#_JG9ٹO p^L٭AEQ1 -͎H8kkD Zk A0@X!Ch-m3mmο:GBxEQ)anj~QT\X @ X]]>SA3gz;8T[[WW@3C?D֖pRʱ#$@D)"(2M-,I_<"} ^!/C!(o IvtO<>χ|4Pt=̢( HcXK$ GLlb{[-&#q#aNw{g @ԃA",ɂ *N)7N x9aMR8h4Yz,KPdYP"bz5P m[7'$46B C$I$IeA!DZIu8ۛrszoDz+^-Q^z)^iwN<)9%92 sE3n, A ;V"$EQ{5Me9k\ܤy5K>O>id}~]sguל^xi=g}7SQ:][t %_t{`>I~7 $)dX$I"s,V{KscOBDeP(5y AD!IB/JGg>I+eEiM- PP( u5K6sVӡlwgVY,:e8E~^zuzm(tu8o i~*.ʫ:[:m-\>q֖6IF4E̻ⶶݻv9R\q!IEE$B/%?ݸ߾ʣI3- LP swVۮ$[Z[ß?k>c^sx_9r޾eNFSi%H4VUip}O<} ?DU]F IBhС,kuڸ8[}CP!ܦa$IdAeQ)+..2 \ gWoox%A J(IEHUk,K$T34E4E~  BM~::::T ^ܵ5o4nG4/XɝwLMINnh=qh{T:G[ ,3eo 6 1b(=[ 9O0( [ 16G>GdM+-_}6/77.6|?| 3#??GVϟرnjto(d,-}晟R:-`4MI;~ NydBD 8lbAaԞޓ|Hvn @H  Da#5b~K]'0ڡC ^$ɡPc[U5JJA cA|(nWR#g4M:ϖY> '(D,A2x@Kv$"A!Kb$|"I@`4#˒,($ErUJMI4`0x!:I#r (aa8F[T[K/)@>}LKciii}}D̚9!%%9/7z$-K۷5A#sE` À#qC2ܸ!xO x<Ʀ{v56740LeX$q ˒hq FsCa1};bcIҵS*8nH޽viLj&Jv1jd2 f DxR˜ kbcbV˂?ahB(!J, IR$IR$$HP|B;RRRΞFay9j Q[(*)7zHU*V8EQG}~{l2ZB#GDH& ?a]srХ?I:::N>}&Gcs[#9r,͐$IxM# PB!#ޓ} AH .e58AP$(wj3g[ӷO۬V@4$AS4IQH8\B0 ɢӒ2{5lbbBqqѺuFXEDxY%I&)x>;X\TB\٬?Xup8ͦ>i6Mѐ$1~@0 RTTZ{/l-@^A $~11UDv:Z|!_KP`< `]jz\`zXU*BZk@n}>}Ҟkou"ITJflô,;lHsB ‚\N HDbB`HMKkmi qf`0haVgF'=ƞm[?Y2v@c}{Yy6]TD8wTJg{kL\b{[=&G[= hf&Y/qkkz_ho|è=L CܜԔdAQSn~JEQ:.'//=3sμeF$4Mq MQK!++}VYpj@Lks#Bd675 mՑ,Cj*U|!DZ^u{gM A,tin5V#aXg;> Uf$ -ڷhW5wHCdzmێ:Qm6kLI>ly&gӦ-uu$Efeeo2ۖ" XPqlrrbffE_|<|Ūk^7ܧOZrRRmM]e붙D5km޲l6g74.>X`؍?bCp(h\>={3쓖:~5=6h`SZZmIc Q!\~"~ӧ0.IgV74?ѳm{cyt,@AR1q|pIqqaI$IB/?uw)//_l1|{5jx9[UUQY9rinks6n>펏?,))q!+?~/h9~DMu̓/)1^ƭ vժHe٘׳23'/7 ~?O=ѣ6lԓ3Wjhh$IR%'',=k`۷|ч}-[nܴشuӧ?ٽwklڳg(-K~'~j{f\n>9%KW9r?{z;oyѫQY[\qEQ11Æ_hnnq=ڊʳt>C/叿ͳl4|yrFqq\)=5hPM[mh߾wϝ=hPYzz;r+?O ^~3>K)JHLHJL5rę3--溺#8p0>!>O*2'ߴyPcSS]]ֶuqxԨu~շoVqlH=fb+T*wG~?.\'?F>~Jf9;^PU]ѨL-##B+YV 0v-:iAl6h,,,W^~1gY_>3޳WEBZΝomb߾E~;vE5sZii{a+lJL&Ӆ6L;++{646z<@,Ǻ\.Q& Xx̙34ZMjjVEDH* Ih0z$jZfئ$Z!mM>h4n EԂ us!A]EP(P0`W"I**%c+~R;wܹx^8rҥw퓶o߱m$9'f6 ؙsZ6|zͶm;.233Fވ3$)*6>ym_O'w6FXwwWSa쬕=jBx_nCH$''DQ")*Z ß< .tlf0Ï.[-#IcccSϷmw )1Q\h5hah4ȹ5ZMiN W6s6KsKKZZy!(JFhjYeO~bk֮w=>W^ef(w=W(*I>`ZZ[=AD779ߤ Rk ~ζhiiiy,:tuҤ _ٗccc)))%N4Q:3M} Nci*%9bC!G6y ?(z c/9}W3bccgΘ6udxՈ$q~g-Mh+|c!,?ptي;w>f1u; Buukk뒒R)45جʳsAH$*!e'MjڝH8è$ Rtيr$‘Rŝ>}&/7!ps#cǎP*UNII;| 6%&$A[ZZJEzyyy'ORU C14g~rz_U鹹ٷO8h ZZZ8Nq5brRҁ;lBQ]Se˶EX@a=t02L  %I|ׯoMmu݇|99% #G@ (Iر&]ˏ>eXIIMMگ}֖V) #rsEEǏlksHt 'w/-`6}>_T*!fsvvY_^sߓp-^jZsrbc?W\e1 Z-^V D*2??/333 .6$ч zC>if Be-,leM8a/| 0,e\oΝGQ4I__AOQt\\ܿ%C 3fҥ+}9szO>!6{+;#_xFF8tȠNaj5C^|Ů{L&Y7nڲmQ|=wX3$IJ4d vRJJr}T"P]]帱cFEͬz>6& /+_YFCw`0dgeF "!!ǰqq111!"r/;Zikl6ɎaXcScccHY!CtZZKQE}(x+,,,*,QT11vQ6[lldHQTZZjqqe'"!!>SRe9d24# fZ,VE%^?bܜl n^PqaC ܜl !&/7'++8^T*NLs H4 HDQT0Ln6AT(9ٙWcM q%zmhZ-!jG 'OR`AP(ݬp(w>N_Rүy՗kĊ3k F3B( glkw4ŗ>{PyKNN9:d1pRt!pђGWbgS7x3>!G:|ݔGn(Cۓ0AS&>p`i5s=u#$D"]7psCg~ ?ŭv IDATQߠT$<9>BtLl"yO]V Rnݰc0- p5ɒhk"3 ATiu$ `00D|0,qa0̭Ʒm-u5|;$)56ulDg9NA p=<0~&|7x_N; Y),{a0ߋ7n/Z[MFg 9Wvc0MByz\݅!zdC`aXAdz$Iڶm;f`07pPŮm=fצ`0̍`rUZv9eYp:ow \t 3IRZu`0[]$BA(M@ s bE!?N ՅbiO'hi$`nua0j $Zpa0̭. NP$J5N ՅAz.Y]+ B$)ypa0̭. ` #%I480 V5F%P80 V=W#&6dIhi;3.c$_(P T=w-IҬw/[ʩ 9#b^J]6OLqyO:}ʥS,#hR/^, ?/-҅g&#+j_)YSU}^ty7q |hW%[ްS {KrAHڛ]z.I8!f)^\&۲JCmH e?>`gg2sj^ML`aEiZߦ+BZX@ɾ֧$I~"[fqO ;.X(:tN^nPUWjx<ޭO}>_II Hr(N~wty<T;h\.LBv;>OeKAǒFӷ)%*@۰¥ @Y#mٲgH /޻ow浍Maw8y~Qt1H_5Xm?#ֱc'._~sxnJ6r_/44SsHwVӉ뭨6炁GNm%:}\]`>!kvW_}o^ WΞ=ۡo;w}? |&LkPm{RIRpgo}Omf{\{nᇳfdX[RZ2y^~laxTzΦ^M}ͯS?p`|ɨQ֬YӉ )wr eU%_>soV'Mp\{VU^"a0rt9A3zj-4 B03#](beeAT&''q\$ϝzT*v^S['I{mll"ÇXpa^^NrSSRrA;w{굜lA!;~Ex<ODjj'yfl;6秧B ʪ$I$Lx;w.,Ah*-+jǩ#G K BRBDtVk4>Z~.n0b^TjZCCC\.WPƲ pRSU*e.ka94Mk4WnOtTTJJR܍@ ޳g..5jTa{-ȤZ hƓYbQ9ijj6LvEFD8Fd}}aZݡV22/\+WaJV'''8n4JK,+ BCCnVʊ*,H39]t;h4vńh._J|1I=/7NחWTlvP!r8.\2M te2I57kr7c fWVU8V_rnn< _`٤pyP0߰vt:?XVV.L&^7n M9{N*h.رw ǏU*||>A`eY ;ؿ/طoߩS4wN4LqcGw`钯nۮPcUU7m2`]J׬۠Tee剉)W|/###BeǎE$٦ӷΘ>v)[VV.+* #l,jɠ--[f`^V^Hc55q6}UUEbQ]]}xxX,^v4If~ uUl޽:ub3.Sa&En|z6# G(bZ? H`ٲe+ /R@zz}o\DQ4IFQ8udط'UJW;O.8qrϞ2p4447FPM.9zY@bzagϝonֶ Ow!2I/IMFݽ]ylP(?}ɓRR͐C3OhkkEkM:i@~ ͚5뫯\U*޽sbwvs>R*KJ>rm[*JRhѢbSq,^jj֬Y$T*ellNDGEv9zd]-۳23&k6[۾i=1iS\h3!f_VL2I7;wa鉉=/^oyE9stuhȑ#֭ߘ2iАkj^{'7fg~{5sT* :yRffzmm7KO,-,0ķ.]*5kFτ/%y}ZvA ꫏͞ItQQ0 :tdGΛuErfHII.++?|AԔܬr:}be{y>rY3gE;vutgSRtz˝F?Ssu*/w uhȔCBB:r՚>7X^ek3ƏMLm3kՁ7ltCSS1cZDxXMMKӧMIJJljjx%'%֯]05\V3e򤸸eCTTdJrP(4L+WVS;|萕 GQncch>l螒p AlݶdIKKMINr9M㧟}9th"v7k_ ~t 'M/+R0\zM'O(J`p4Ey2Ekt9rQb+W$Iɜx58r͖V}z6R$LFdi{ .7 ,PIndxB|\P&&=4/\N#0 #& S$ںѣZ^z EQ_QYy˯|O2` CiWTʰ0u}}åҲOZQI>ZZ[33qOHWnϚ߯(A.s?p=!}ws`)BlMNsꅎc5 )=tpH%6:?2 nwz)j7ðE,v|$A 6[{/\.wҥKϟ߫WdAv]* 1Ξ/--k4feevoRy'lTa9]?ln䴺%#GSTg@`AۍaHðF,da,n ea%FQzBp|\K Am$fXӦL6@m)*>h CFnaN쐤B=O7waÆٰqSNC<<Ewjii={D"injZ7FaEQۅ⯾8a|pzoqlꔉCܭ[ Ϝ1j74߰)!!.5%!04^lv |>EX,OH_&HEmV[dTZ:agM6U"c6zT {lbx|˯0@}c7ɧO4!Gg4E>}r<6 @ww`S&ODPtE8>f̨M""+Ν g͘ F`C_0LW|?~ܘ(㟀! \=# +/(yJ\DFD83g}  N[[r%H _L{Y@QVq_auu!\UCCCV5*rB|\ccc4_,<0jժ?P*v`/_РٶEf <*:#)I}mx<ðv@,)Mh45ki?Zإl>g6n*8y<McI~|~ffƑY(]f|kruRX"*ڲUѬZ&qܵiu5wl˽n2)MӛvM|~DD5E[mvPrϞ;_ߠi|jpo׮tzܬݽ.ӯ[2²GL;w:}N u1111aa횮G7|cnR4\˾+1|޼9ƌE.+==d2k4|l6o.zZٳA:N\. E7i4ktzP y/>.$  c qq{~' R A\.:uҥ'-5Ba T*XaӒԡysgD"S`vbcc?9K/-߿_^z~Io]Tnlٳ^7# G<EbH: ;; AJ2io۵{Oi) 3Xj奧** 2co,'tG\zk?w<@*q Pț9}7K_rss0 n7Kz}}zgf:eoo//\ח`͍M=g͜!=4 :M?مcFX/jmٙZ7& gΘtۢ">l̹s|Bq̹1s8C}>CP~æ_xx9bJ :o9.2v_3_J9}ڔV|߿c=K-x<9232ʆ`32yuD>}Tuub?ŗY455WvVp3~6m}՗'?Vh[fΘ֡/HS&-Z57c7o΢_ڛI!!R~V^48+$;o0~Y.W]͒e*_dge~h1ѣG&w r^$4 ðwحl6vh#TrEP8@ӴѠߺm{tL\AT6~n(/~ӎ7x}0 eHn>oJv=Ɔ- yjz>,,blظI̞=-4ż}Ty6*|OlM[n7WVV憟w̩;v|\H<@݉jZ3OwzޝmNw7Bw@$I7o;w <2\^Oo+V|YI= o1o!SYyT>&I /ó :&X, u弁&NbKCߓH~>ѵQaW<*.t?x0&t B`8>zĮ(OxO>DhX'W<Kl;JgT]N@ H߾yiYd7PKwp}۶ilR)o&cǍץ=u; @d[(*`1.qy<AzPuaI? O-X_^ߓNd!bB#Ap EJ#ȨzFz뻷DQT *EP*.V]}5%%wn^%rQ'~VzfLk~1>>.xړWosEnf5S "ÃBG W4Mg IDAT鰘L1000_A0}+S@ `CDOã.Bad=F0T D*w:L1000}X,f !&nz` %N(&JUY38\^~^p7oDD^ %)VT׵\"Oڬf2{a킡1E96")2G+2n5x.^]]${>Ô) \.'qCI n|iӦgf2$Է*$ ;)4DMwq\ 4Ο_`GHe<=30@wM6.7_g6-EQP @C ps` n : 200o}%ͼk@;Ȃ!g ba2v7_pAaZÃBmm]YYmu 69@, w+f```xP8y Hv;)ZL~?i~R,Ξ=[J!nuƝ,FC.\Kj-w*|>JQլPoUϝ3)Y?B!S WXM>O|k c͘>_oY````xr}ބcQ*L'*+C2< h)^W$2 Ǎ>XGfs V t-X%ÃEAw``aج&3 7?jkiqO^_lMMzt/k6Ώ'^iNm|xѢRՇ~ͿڴLd``q8`?裓'usiNo7se˖_iY;cFfffV/a100g2vo+T` ~9P]]!~4k0K.W>:C #tbN~JU3wbj%TTZ? #_"|>Æ O '0QTiuxt[KE  2r]`x.l`  R5DQJm7 ~/!ba(*ihBF}I` "("Rqv>.˿%;E#W8vzvx<Fv`EHsZ+Czl* $[АcG?"A9?hn\p:R}Cz*l bd2%ReIe q`x Y#)v+˳Z}\xdr٤w:M^tZHq1mZ*ʔfngBr:&@($vY 3t"b6ZFDpXj=nf4[ rel DdIeJ-faX,[[T f5u-rEɕ&aq;6U(t(Caֳ*NoPz58\ [q #jɶfTT e0 N~{1gX&.uZPLQz.*\B pZ(2.v;}>U A?_ BPѵ64maFf\E $`8km@(Z-F߯kke{=nXנk@0a]ώz|^na-\L?a``x`XBEY:6AhA;@8_ ba hӁ,P0'4 0 sy|gD4&x|BQP$ #'`a8_ 2ubzPK( 0͂ /DQP(1[!&8?A$B1b!0t 0c .oY4M\NEB1 \.b60̻lifsx|#f,fc a8w:^(DN>FSEQBAPHQi6 8\y"4> b(if6$I#v]@HT `))`n~?4x|x\4T@*Sf)h@,L\.{n4M%2um4MS4\aX̆f!n @$I١hbj1RCfpXã:}ko޿RbEjEPɛN j C߰AQypx=. FS1Y,'aۯDAЛ >;q6IGmE!@ل)yCvX(Cv` ý^rg"^\>~i4UY鉓=_|H)OW_ٹsWt'H0M0c A_(YMc~?M,7,;|>;}J$Zo޼p G w㿛سga۽%ʀNT(~G?Cee+_վx_oq@`imyϾ,( j +F=>~6%ݑ`8L&CQT,]8(`c]uҥkmm7K۝>ݰq3Ś2yo9sظau''ii{J̙s$IJ^ow8! a4\.pF/ia6IpLP"\_ߠ^Se"`0աx^xq6.p(Fl6; Aw&OJ"T&7vt޹a <|P({^xnݾj妰%\& P;Cee~X,J$Fb6X>GQlij=n!br%"͞q׫4Y͎yw2=468N>t4(_xxP(p bCRiUewi>ն T*J$aaa:l?Z["##N<66u@ 6njS '~l6[qG‚ C=eVEɓ&fgg}piC_ҒocOnٲv{ݞY͛8a|}CΜ1}T"馲?>3vIW*Ac۹NxD8Ʀ&ajt;w^*΋JINh zf'&XMMMW$FGG(M.K&(4Ff;`lljbH%nk7 SZ\&Ξ;R*t:@HJP BQԵk5V%BxD> w@6|DB$& r,Ҳ0DdjJx UǛXYyyȑfeÆ͇;gVU\RSOnٲPPD7^>sv k[gxרQ;~|=II= pzz=狚 dN-[|> pGK;33cPfz݆c8?8qJ {^M{r/#PCBC_}E;v̌tqȱrES9\΅ >l)9Κmv;a\.w5u #vVVf>WY7zTaff_քcNIƍQC+*6n*r R]]8bmfyx%VΜ9Zj֬YTXr |>#+rpJ7K֖$d_~ܜ^ M$smF[nO5jN߶Ri鰡CIƱ첲ںI&DGE?qjמwPոj-UOȈں?xڔI@aG ڷ߭(o6[Μ=?zTaRbKe'N ?0(`^Yu 7oIKMJSLIǎܽg;AUI$߾cg}njj\5g@ a$55wnźz\&>m\.XY8<##b$\sQ#^Vurl6{I"m㦢Y36m/vHdW;v4EQ۶=w=joM(\\-I"#2'ؘ1#-:i\ef'I;wxL&S~y\. \.7ApD"QA,+..|^ߝԗﯮ"(^dó3+.ڽ'11!:*ĉS>Tzzh"Io^T]8bXk[;+**Ǐaع4M'N ?|[23қ# G$$cqKJ ]ߠټyKjJrDDSyic'N Z?pt? pjJrVVlYMZqSQ} ܲQ$noIS\\_جm۶>ӷ>`raajUSSP/\| UǏ o۷7Aa}\;g6 Qt}rsl6j,4G ;]}'riX,=z0g|>WX~j<HIN0,=-U,H<=xHﯨ|;II*=׮[˔:?vd r`p>Bsszo'%%d.d6edxjJJQVCQYf qg{&oٺ]דZMMZZzЧ7˥iZRZV}N y>wj ˖{Nl!; i*_olݶ=22"oWB Cano655HɤT PZZF }>0IR A@&>s#;a;M)&H8bP. ;fT\l`w'AcqaEQfI0^o2SR`*Z` ;)ѣ 8HϞ=eeƌx}k,Juԙ /$']!hm2 Y3d2]6 4mɥ%{Rw~D|ssdRɨ#`"8uhfr?XrL?M;u@ ؝(-@ @QToT.4`?H2$ɛ$FDD@LMwP8={s.?ph挩7KPB!(()1x$ɘo24Eф8HxtM&GLTTdmm]pafz+WYYolTW_ھ3CwK^ٳvME.^erY,ظz.}DBCv{Iɾ6SSRb{􈊌;?,ry< #9955=bcqL*w}{eg~ٗyMڣ)&ڵ{9;w8aT*Y q< FFDe90@XnH$dAt.km6[eM㭚4Ba_h֮ۘJ%Gvv4?t(N"Ql\,t0%7oEgB5unN5k73#OvC1ΨQ6n~g֮/P B4ocK-g͚5s-"p„9]AW^};p`L}Bq'6@Wq>@("##RS; J%Ǝv6fey<.3}u70!b 29)"</8^`8^2b9|cb=c ^|FA~{ ö93G>7}ڔe߮\5:*rΜY2 f%3A,SO.jJKKQL6yW{ļϿlI-`N,{g ޙn>D;BƎ=zHa~ië,| Q_u}M~ݪW̌W mZמ{i|~lY3l#"5#$Dܻz/xL?'>G˙4iBFz@'&!>nori)> <xn+<wގݰaӋ ^xhx aC (xҌsf) (7WnN/)++;1t:껽r8;hGcbn300<߯?uzږN7oޜ޹9/-+TZf43f {Jr8>0a5|>_iNע"_Z8x.)::j"kE[dҊʪ'׾MXQYw~PXYYM+**w.tJrIQQ񫯗]pb>Mw*1[icF 4M?~dݯ_^awrU```xU1zee&&&>ǎSOv Icƌ55u'0uXYO>>nθ[nqĉV5&ifNAw&N/Knۑ+{ڴ)vrwtcǎzkW8b%{N9}ܜ^#>}С#fpTtlx} =pClMCQ,~d:X^*rJ`niWn?Ô~jjw bzݷ_^hKKKyhAl6[63a3L2P=z9s\&ӂ< 6ر%bqɉ'IΠi:R8bSB**Dp 7rr6mݻw?C# {Uy]{c AlIPJT*qs;cٻvFWZڝ1ѕU6o SIpTCD3g]RԽ+:`b%-X$?;Zg6.;'EٰqsU_3E[_֧񭷖w%t "p8{&$vg۷o3t:ݘ1def r:zaԨS{fefc͚1=cP(F, W755ÇBCCw؉0KٳC:yDۣ23ҟ|bAf GGFF_4~5|?''Y10#Gݻ?3z$A, W>Cim6ۺק]YFq|v]w]uJ-'OI;v;0ϻ\jzf4ɓR|03z~pRCGΝY,II ؍/\y: %!~ðwjlhts.Y0((p%McS&NL`/}=}T5k7{x͙ 9GyI@JѣFp8g 8b{<]& T4jT"ɾzM7lM[L7˗7 oSǏuOsf.,*\\n@zxrKKG/?89:^v :-9 [׽ oW,[]]_yUU )H_՗ rH]wܭR;??6Ϝ1 l41 [a3fо{ )766}^zqի aW@0|hmmd,N?~cFFDcYYWO5A"bߎ4'7/:* w BWZu r'N_n]ÆZq( pwwݸiKbB&:hZ\ lcϝ{ CTdĪUk}|O"sw/**ٵ{/0OkaÒI} 6oJPm 77i`ݻ:8z=帻s8 4-Ng8;9˪l^ʩTjʸGү^R`XϷVy,ͷ Tk9BRbBo11Q]ӧM-((?GA|^WgcttT>E __`1cbH ^(,*~BLfcSJ&c ccmDrI"ǍwnnRV.s s̬" DB:pںz@;gEѡCĢ.>$ m5Bq!( H/3ߍ,9T9у@ ǡ᫯VxzOg\xyOqa<ݛ{|VISI_ìB|/eRj Я|OK ]%&E]y7_YzˮVvjW.y0Ą7wWxʮV_ r#CRXYޭ&p"Ŝb/7ƶ.3]+tVűSYn03󧏊I/>[vmv{Nuv/@V8N`V\7df1Q!rKFSIuC_ 2WGV V+R87̘ @R#sldȥZ,xnYa_J߽g_oa8|(iC@ N  w:4yG t:َzHF'DW76[@L9nE6^ @lC?hQFp8.^2}/@J_J.[~EC|/V58ARB=}nSGiif%..vyn7o۰aO8!uB  .2Y̩S&K8^^^næҒ2gg%KG~{8x0ay'Ow+=If vKjZ;;_W*uGIEoKWsy<.FSP4BNNqa0anJuБk~}^mmҷ^'=e2'&&(:Ȑǭu6!8yTG읧[{2[\}"-y{rsPɳ! %E!}td8("k ;77W_..)`XBuǞloH7ɈZ$!fLFSee隚@??_6w?][[wh2i޷ګ/VTTZ0KPp8ƆgiZ{:boP%Ө&AUPRV{yzR|_).-;{;vTjFxKs ,~[].t55 %(wEŧOgZ7m}VRi`֭zPtȳBε+ '$ ܊uuH4MMMgϞWAvƆƔ h ?q3"_uMmUu 3?zԩSn54Ub2bcbc aXNnN?ݽ9--L2L Ng;@P,h$MN:UUTTVNuLp<6i#a;< ?rT㹻˗I;fXH)}]{ -ssK~lZ##ƍ9~cT +=A$mjnhTH|;L`>EE_.[d<i:;[5ݶ9|$ 67<# ҂m/r8JaZ{3Rd=-h X1 @DKKFҨN<Aںzݍ@ ptt 0(.AbA c@ _/ ];v0qjlllC}gZq*S=pJfRb fڍZJDFE~Ttd[kNwN:9((u׮558n6u|`Z%98:S(Q&`STU~ e/VCCލa1?tٗE+YG ӏ>q|Z׏  G[0-1?_p8~RvGx\.! ظi Az2(@ba EN] ƦS`ՖHF!p'=da0AP%#7PPC HPP>-y,յ >-6ybJiunʊҜ &aG;$$v0%O:s|P)<=K~wIviA k T*5:&pab >sagGN]d횕6K$ 2,yh!dx_dwǑJf̞5{! ~RwrU@QU>d𐔇}df<-hnM@ 7л*@0@  @0@  @4*h4P(t:wM* EQghq*3@ ^zdJO?h|0<<Ӄd/i=iҏ+W^~Dy7"#a'@ ?& ZV@t(t5b#3E2[ZZmzyyF{ o[ Q@ ( =HK?988ٙ4j}a˖mN3 ?|9x  IDAT'*2칁^{ *|=J um=kF>)dX]~~cF z!3++'7Ϡ73f*+׬]ڷoʸ1C |%ҥ+(пX2(BؼeGiY˘ѣ$WAcuuWÓr +w_d2|^jx.qӖ>t„x@ GX%@7a5]V+_ \sQwwؘigkjj##"_XXtI2sAANjxҙ3dfe=z,,,p$Zn9h,ˁjkb4Z#G;;;54448ph4 a7٬(tĈa2OdV=_y :N5r0|Ói4:t3 qrtڼe뤉QG!#F |!Cd`f%77/&:ΩR<<~?[IP.^xjMkkHPP"0_،sX,VhhHuMMB E~ny~y7mMDEuۯnJ#IY,@,&Fޱc,Zm`ޞdN7D (b_sssge_u=NprB zbq\Tz{{Q(77Ǎ&}H 89:Mf--h4zmul!NkhhEWj\.^Acbq86w~>rF_X,uZ2IT r77齟ysg؟Jt:ٵ:]}-OO[lFCQT$Vx765QP ^C[uMRj>DqC,6_ ѣ[3#G}k5kٗ|1龡=_mim*H[67ly7ҏRǧI76--]ѰجD2lP ' 0(0P$Av,++ws<"50""I%Q A *UiIv{d4Xl*jZ{IL//"r["r~X򐌳oqckjB@'&:㣓bc)(zr`7<== \\\FN.`L~|aCƏ2;]F&dcss$.P H\\$-M< drOVcgF~S'JӧM899?loT-DGGE߻l@ :GX,={Fķ ( Z@ `aY"usH]]%:ޭ4M!(%~у|GVPXeꊊ Z[۞8q'Z63+/¾ y83gNCE[`2?f~. ;?>,yHt#ǟVUU^& DV5M(r8lTZTh4шr86 ǕJHt{= ZfTV5L(r8&EaFx<.ifmZZbaB4 ZZ[;|łQrAA 4-a b>J( h4wMF#A&r+ z`06DPPbFFAVE` L-mm~G* HKKW53fLA\=x𫯼tkJ/Kڊ̙=32"l]]]nUUՃYYWMHR&e媶7|ge:(o=㏖_Wa2II Ƨ^_\YYh|ΙpgCV{o oΟr׭X[WϠӇO3z-fd|%s߾JqYȻqs~> ̓dmӪUTjumm믽_P@R_\EQJcn RHiX,W}V^W''q)ǎ]VZ>q>iǎ>}0Cݽsמ̬l*!׹io..SLjXnCiYJIOM/ _z訒RN?g /.jH(ؽTЧO@BQ_=üÔ*H(j~۲!u 7߷-[Ů[j7_yŭ[6|---EEş#Ts˗ -iڸu7v۝֭]U[[}Xl3Μqҏ !JT*ټe|?/}R[ӧϤ_vUbbu:J:pPB5~=j$\o΄A)ffe8^RR룢"m:JUZ)c׮Y9-g HXhS'WT v5~JHd]V(g?~m۶ry_~zM~_~A pqQё߮ ׇdVVVLںή?OOg2vXRZz߲%cǎrwVORPXsמK.+{jhluֵ9;wq3G7SSx\??_[Ƌ"n}"%UAA<LFo+5"`0Пd c[{{</&&w!ܽgR,(,mGFcgggbBJ67m0 A aX}T*JA.?>u!9؀ BaY$uzzzfffs8orQ#J'%y"mJXe i`2Yx~fN5rXo]'>)z޹}+O D&U55 EAd^>v ښ/-&LJׯ^aЩN\_JJKO<4{t6aY W9&GV+NEQr<|)SIyDJ%q @(,#UxQrN(a(_j]}8@YiQT Wiu=fVp8 |zd2a1A,6fj4&IpjF8ftlj8N4d2FNC)PX,zb(&:h2(f$J6*508tzKV zh"Y,*ݤɬbQi\.f, Ng EPbժfc08#G :dpFX,Zjj7{eA- X0 BӬ8`00 ^GQl^o0A 6EPJ#od2apL&Nq*؞G֬v Bҥ^^<՛?#Z-M"'^ 捜%/7][k_׼0ɓlva3:{$( ===|_PX3bԸtmw8Āq p򕝻qܩS&=|rfL:|Xc6a7 ~{uu嗗 |C[[[w2)1%Vݷбcu:݀qH$ܼe+Byaޜ)Sg& NtN?޽rr/yE,>g:.'Ĺ\o<&op'|>~U3L{4M < ANb3(q{pzx'UP{{P(|> 8dpg[Z2d8{˓!bSJX,ֽqɖ` cEwK/. @ba0LYW.]Dt䉡aTwzFcS,=5Yxm8ATCKKӖ~mݶО陗dFp[ h2p`3@ At:͛}ѣCܪ1M|}._Τm*-&:LҊ*!nnn>vxRk A>3Z8V*<^TtUaxzȫkjCBWTV~a d2VVVfOA  Ш.^0qCrr !mI;fCBBpzLVM7&굒2:aɓ-fС99yt:F?pqz ; J-smmAjf\ljֶӧ(w?N6Y,QQQyaKPYYWi4ł8ub 0|[TҀq3O:e:q…)d2\&"rJ'Ha<)tF}cARƚ_z^ F~~~l6~V*UbaHPVY:a<8vxsrC* rҕS30@ ( NHN,>[SNGffek(řBlXɾKw J5,yQ -RW_lRn5\=v8@Vq>uUF7@a艳LA+ k b V*Cmm_אlfX {k;K`G;l6kt??_'#@ yl6땗R@CG4ҥ;׭;pP e |T2l"l~l0KmmdP8jLw춥:}K&߰iERƍ9vB1v(;V̊D^t֭'2dpZZX,KʺfNZN iniٱs qs V]5u󼣽Uvywou'.^˓gՁfƌw߁o: &&&df]mܻ?..65u<ɑ`AmZ.,,tqESN޳wYccc cX %$8Ȗg@8 ='` qcٻoCq @ LVQ^X'9ykoo,Zڭj5Օt>^^JgS3 CRR‹xMkkkoni߲֯eV?᪕?mXbع]RRp-[ µkWOoV5sf9svqAt  f;tVUV55 K⌢˾`XMbXo+d%K8'$ WP(k|}|;||K&yg͜>p`\WWWgggpPPqI >r`i4n 蔺ITj5J]Y,fcSA)aG@ p*6,`ٜ?yb1swqws5kƹs.]tqqZp={KK Fj-++' t:EP+*֪-m#,..=&|rn>щaZ͹s#\6,BDCc߷Ө4pVuee䕔M ; pHSR\ 6B>dKlnopՊ{yzڧ7^y7uvu999?p_|7iŊȜ]|%1!^EJ8NB CBKiiɴ?ŋb//Q|%hOL֊*HG?胾}^-% =$:tլNNLMe_ b.iohII r]] .\<~lvws DGEpB3,_Ϲy3_zzz*qqqK?~(@:n}ںui4{ȑ.]J$,6+2"X.R(.aTp5"qgp BB#tl]d 4U绻>** Gp 3K/(0y>>/ݭd9::>ĄARJyyz1$%%J\:,DVicnjh9:9T.DB .^<ìN@aZDFڃՊYfzBtT䃪JJJ(gݭG!>\.7_/}%2о!o}];\Ѡ%mp @F쌂 \A 1F Vuv<FJI1`Af<<}8ѨMυA&Űu  A[ZI!} Pb 0tW^x@b1FbfֽCcS3\ pOyvU;wom`[j؈1}!OZTT/6cY/!}7{$k {B Rm퍍M(sw+--3LWd E@ ;, Attv644b&qui茊hk@DREFh4w77gg'Ess\\\ZZZqwrrm*dX,ށ DM}waGwܽh|ۋb RBQh0VIMMP(8uvvhTL H^ G'֖6хM&G gY7oU*t:]$M4!X_pP`KK끃Adb0LLƹgOfffo߱_PyZZm2S'H$ᨑ#ZViRԠ7jJ5bxrʸU{7 t{]<\ 5r8=rמ}yr7O>ܸJfLLtSssfVVEE0l}Ǡ\RZsnV+2n{|'RìVCsSCpXN''gbDbP[Wo' :~3Q=+lipsR!|/@{GJ1z̚9c%AA_}q!JO7+cFE-^4 7RƌE%({ݚ͛Tz&]O OǟL沗wxqttX]{ΚD"1,K1]]]\]) eo~19Db1xG߻bK۶Ҳ&yİ!wkLܹY5dċsrr*).\I|u͆77Yꪲ'$Jfego۶_~DUxx  xnj[ }̌Ԙym-^9>Ҫ勶lQYY}nSC]_ ҨUMbZ=즦f3 @ _|ťRē|يU %%%V)úuD6vu5V}Q$Ґ!C`dǜl{b1P+A<5jkkpchhh S;Ujɼ#X1wnL drH(scم'Y :rB&ǩU(VdO9eϑ0tҲn{1 {e{x1w٢|EFwB}}#j/6MM=̬nNLL|׬Onn2Sࡆsrnd|}\]]樢⒑#G}C*]h>ͽYXTt/h|P֬=핡/hz|>ذ!ǎpuX++N8-6\YQQ1\r)r1Q׳̞9 #^7L&(hx<^ggW;N4vT =R*$"2VyY9z5kH$[o5~b7_vl!;Ɔ7V(23--WN<޻uws2ގH$Z twγL=6 8ϛ;[>%Hr9t H$j4&P(_!d2YѰX,RbQQ?.D⨨%%/EW%>z>P(kuNlIX[\`^$2L"/]Uk :DD&9\o'رsH^Z=SN8ҥK?ȑ#RinL<$CHHC/{qt:}^^_:  5_UWl⫆&@JKiP(0ҥKm`0򂂂RRR<==;xaY_nfϊ=kX, wEm+**@~~ /++ommq#W"qUcSSSsP ȼr!WT{z5ggw^qtt$HFѢL3hia& ={Z0hĝ-..qrvzpG F`m|٦}{wtTVVVnnnccÇ%ɬYR̙>>>׳&MD}8Ǩiiu H4t`>z)ֳfؽ{/giYّ'Ķ6zm;NxFvIFC32XlJ?~$ʎ >EŇX 2g͚{QNY[1 juv۝lx+6NJg;;;"X]]oGF Wl&៵00̰A]]$$"ѱ'aX bGG6";"#[r.?D"xVBixN:'V^^>cƌjDӧOpBSSԩS###Øqƍ3a֪L.7-VVVo5ޅX,;vߠ=.Zf}};v4ID 497r1 PYYÆ 8;pyS&OAHJm„0pqL8!##]>f̨CQ>ztTJJV 404pkaXFJOOh4"֬JJM4cƌf05g) 6K0bD,8[/Z$)"< ,pi8ndҥ-Z8a+7D΍q8ZWg- }ѣV@Sd?>٩" >wxyJE"Ksc 3B$r䈀@leeA7Po hmfvfP 0MnLN_ C7f 0\L&X,ƍR,@<-`0耙pcyVT ȑ#'W-[aQ:VO!!D"D|oa`h|cl30ll3h| ]x ǎV]+;:q55N 0 lIɭOӶn6m Q).59fzEEe/"<P=5-DN tzOe2?;~rOda^ihhx~~~^\SSSXX\\\Bmmmjj%ϤIkokkyA'a IDATf[[X, |A[;1/\;gjH}72r@  fvXy7o_{g?f*`cV|3222N<op_ҥK;wܸq# >|]Ș1cFDDѣG:; c@pmHrAA3gƞ>7\MupϷcL&S*u XO?o'~lVBBbq]յ0 KWzÉzFn3g~-.ىgŻzPϹs=LDcbo4[ZSTxhРK.UyXWڪRBCCY,֘1cFcoG ??U'G=𨭫@ IAKKRcnj3NtJ{~~Ïs8!U.$̙3F{ SLR7Ld9"ƍ5x+;PWڄB!p8ɤ6%%%;;wǎMMM0rH ZZZ>ܼa^o0\.^-9|pdO{x[Q G€@<2 wm4Ξ;slLn2xYj5k׽^V^U*uuH|>?j JH$Rw7}}%̼{JmFR=<aFj,`0n@ V[[ki4cZYY 3u 6D"h0i4Z^ѣ(ɈZ8a0d2T6RJJnm''GykYal'cyW^y9zVuumzƵA8Rw2ۯ_'NJ;:;JoYڲ7**8`0.&:;9ϛ|Ap];(111wV(YYYbX"@gggttt^^^vvk<==ϟ?O8;wd25\\\z̙<'6"у;[$ ć#Ia|4|ARG" CAAADDoIIɮ]V\֛zB/2{@€@ t:/D `4LUO:p@$j5Z  W#E"!g'V ZVyyyR(V L&mmmH$RXؠ-?l=P*4xiEt:^g0tL f2 鉂\>g֖L&x<h=5LFVi/OdUї 4:fJ/(8x0\MI=u&N& B5_lgσϗeϯ_eUĤdInG)UWWhڊ6<1884MEEE{{{KKKEE鞞M$N2oݳg888:jjj Aǀ@<,bWo@ vuXq`I 4'NσnS/lx}=Xq.Q~Q(Ό?7[sLFRy F52L:88ĺud2N_x/_!!!x/'77wÆ p'N0jԨ;o|DiӶno,]ӳ7}qh\l򥨝#a@ -T*eW,Z([XӀBw-WT~]4RT޻ow) yÇ gΘöO>|o;A}D"y7%r8 6*ҫӏ™3gW@@ ߑd!21  T @ h(iY$ēzfZO{c@_kZB0p` 񏡐:2`~R2ݳK"qF=0<=9NH6}a C6@€@hXl]SULt Óy_A&@ @JB8t(5&RiSΝ{F6-Ǝ ӥRylJgV9uLRrJO6mD31gJZZhhHoꚊJ$ $ Oԏo 3D;cւ P_O4u]u:SgΜo #F =a ;w]'M0t`Fxi ϵd;oѾ;sso@P\\$˗F 0 H$7N%t[w565uNI3eLz]a6T ğV`t:`t:L ^Rt: ve^ǟ _t1J-++?yL``HhhlKMK4PS[ZoKɗ۟~bph$"F=&f0t:Zl66Md ^KtZ0`0dh4zH$0L*oQ]S`]]]\]],Njmkwww[xWkk랽3LfshHEWUUϛ;fj#ǀ 1̍ #YYYQԐ!!@.ۉm zJc#4B! fFq\wt:d2]r))y.+JP~k^^w\m]owjĤ>|OP>Ao0Q(V 2 .j:jjfXWts۶՗|_hll8{O<|Kɗ Eµk^ѨWACo 1vɓ'XVvι-..wMd⿽΄Ojkk/U ^^ICCP A=ģ  1 G|媏7h4|ܟD&, cU5%%%/~rsuҨB @Æ' CC\p{wj))iI w1!׳ 9u&nL&35-=11˵ѨzNswd5:O0@  F" Æ JKKK|?1pl)).Lt8{.ҥmmmfd2i&=#3I.oM$%Ijj>.Tu`%S@O@GG/h4w=t!:>]|CCdWS#"J7L<1vԮCR8"ڵjD<ϯ1Q<8H"@aaA39"C,3 ]얙p9 b[h66"˿$ʊkeuJtH$R+`-[X~9Hއ@ c!  bodKACIOWd$ D/Fi4Fj GmU*U}Cj4,0AI0s|UD&qABgϚ0~ðѓ.%##0  rGxBs/ϫ߽gĤE 755 ىH$j4Zyk+DvqD–Jrq`VSSSHPd29^["ظSUSSùv-S]"{Dž۫  1aտӸ}Ŷ4:SE$mŶ'O)uH dr܉Ѐ~e;͎ q\KHrCC' 8 !!Sz#7K*uP(cnjeۯږqMTRT^s/K`N C#q/hm4p3J^ͩS0i>rĩ˗ $I@kkk 2~;%R(d^alux"@4M'݁%t@HS㒓lj#>`0F#BhHM?N@@<[rտp(c:,i(ԍQx!"˳Flk"X BCC z|HIIvww+zlNiii9z8hk#ȸ&޳_hM-6=&رCiׯg+~C"N(j@WWIFF&3!!P%"PCm G> # 5׵d 7ܲ޸HƍN_~umm_?EXsמ>L @Rq7ӧ(KVX ^ e D"axXXuM*0>zÇ }ݷAglf IDATD3gZ ࠠH1S&޻-?y9g9zVA  IbBxu,666^oG5>Wla̘QcƌWb+upAY+k^{KZ|ʴ1.6V]v"1 ˀϻ=Yš*bbkk[2hcxt:A}?<||R'V VCLTEOں:uKN=~8c(ݡh@^ J}B<tVu 'ruY3'ĐCGtK?YK wIP= @vqXR a 7fAaE ?<7c=s akp&D탖(/¯^jIn:8:2{Yʚkى/zͫ<80tӒb D5%%=&&>okk۾};DDD\(`ZTtp#^Zɼ/VgggJJZCc5? 4DlkK vY\\"uw':NѮ"088V)D0+HlniIO&lրqjhl p1O8aqsރ贺'Nm۾-ܷ̌Ɲ={d2;aR;{.'hr% ?ׯgz,))9b"dgl òs j~b@>)Qw? 0wƷ322 )3YE;{ů3qV\_^^s޺z5B=zLx1ɯoVVVi_|%\e]amm=|PO)lnnǟĶݽ6Jn*((\p>dlmm289HΝ3 Opk:dpdp{ϾNjmmkjW);{kqɭ/<#vZSsKAAђ /aXlkooG"rrrݱsq:5fH$^/\U1'WLJ n!KTcL$zzzTU$]JlƚT0LRB'Hx6ښO \]]XLH$mm>@0Qmm`hhl8q}ϡy˖,Y-MHH$D&ol6 Fza@Flmmj=@putvv@ׯgH$TUUaVtR;Btq …KWL-b-@psuUvtV񬤋 W8V#Fڵk͛g6DPa555ɗ. F dttt3`Q I@ X:lYta| 9(_3q℠1wά)'t3ᮿi4`h4,K&B,F P)FEXaL&D"IdRGGooo7 ] 465{5 ' Oj}$!~5楓HukVzUUUA4F1whdTt]]x#GFLso>|b@{`lmm;|/?M H$U5 (үd<4B;{>//1 Zp!bSSsYyϿj6EByy{( 55vEw1 ):kyM 6ju{`߽Ji55$2h4ܷ0 {;OiPP@ee%"ٽ{?0#v}..6Fb24ˎ=邃 bZ XOX̌|7|}|LFSgΜ9kgg7s47nѣ.1CZC="d2uL{{iS?qop8Ə#"pj?qϡLPtz~02rR &sTb[[6DjNNN%Eu<ð+5VZ] E--s?y{Lb,|?PyEĝohpZi_더LOSuڶ,eQaހCM_UyK:*fo?]Bd4; 3#5&v^[kKkkׯwqqOj-[wTVV"dj D@ s3WZz @gųUuv47#  N3~j1䭻oz(&c: m B*oA@|@ͬAMn xPT/0 $ }} Bf@ \}1yBh 021@(̀@ 0 a u6pO\M=Z#HJ[V'2vŋm[|)? |QW[ͷ߷/ńxF=jh*v!P(\{Ged\{%.$ sG{{[Vv?n0a%1444;h0Op8GNKK;{7_0zT? CT2@+)0TU֟~y1]===/;g ٕ1;֛@5USSmY./{{yںoRT\<`@Huu `6{?حh.$$8xC[oe\ܽ{MZZ[Ր@<[w *GpЈt0@m& sAFƶki0]=p̘555nֶJ$λw5ҩVC*ݹW_oyk^Hcc#ܨ'104lVW\r+( `ߞgϜ;?H2W%ǝ=.¢b77jX\V^Rz}qɭ3 ƍZThY3g( o7rcG[YY;E64ǀx`q8xGNᆵ?nPx;Ă3WW8pLH(b 4BV>rDCC`0LmhP(*o`U 4 |qmY١XG ::;- :c)'"6m2vkC644v-ViycSӪU+Ķ97rP 0L0-&ٜ}=߶wwpD@yaHn-0pPM *'P^ &)3#SD c-Z(7a:h4aF$)2BAH^8L sQA ~coٳccLֽTTTܵZ  ža z٣cXodUW:=dɻvfm֌؀tb1t:X 0  R8ټf|Zj t@1 ^L [%֊;.{ pw< M]P.<111jbĘfk (*M@z/X=јbD3,s;3߯7+ifdf |??_bCqSL#YrȱSR/i^Gs8]zvff#z-1@^Ifx0>~eso]9bİmwZ|kWϷyr1"<|d&iZ322>EGwxGǎp8fX$I^Ȭ3~~a=Ba@a<ZswT|9D&cӯfVq }|ysg֞8y煇m޼M$͝;YyfC"{;:Jhoo2c ;&A.Rmy(,,ɜSM9vKx<܃yzڽw>zdP``׮v.^l6ӁE=;bk׮Qy<Ą9yT[9'M8x%S}'5 C[T>Ws̟c0fd8pEc_E}l@P_7o{>`Ŝ6uOxitv@ 0 ,!"0Y \.jZE%]=N:3&q4 A^\paWHQQqCCA,3 _*jZ+/X,MM󳲮T9:J:=e kA$IZ,s@$-)6]UUCduuucSa4u(2uㆵ߹c˫Wt3uxGYhlljjVbV1̰;%M. /]1a---(z)lO8_|h2T*U~,Rakj}}|r,''wG]HXpm;;8DnFguݸyw興Cٻ`4b ý{aa᎝REѹs盛J@d-doPl߾3,,^N@P94D5 1|hv *J HN{R2uQ HNNeyy|?&WDϴ ^QL8l4kHD$eڔ.:B1k9gfddTjò]kllŽzEF e4hw;S'Oͳӓ/S?Я_> ՃAΫ.!mqt z8>yvc$"{?`{Q.I@LFID_յ˔ڥ#4Gh_w' M7z. {EB(/}%-C/WUK5/^2$Kha46q!^]@0@ v$1,ȳ@8auXoW,  |CQTMu}, §mY$bqFsQ]U[=a k.:ԩ3 CZZ:jK<3*˿wM͋_}x0xpՁM?X奘2y훀տ:4KǛA`ه
J@Ffքq^QmL-A P $~\d/Xl1;700PPn\D'waQ¢{|Id2Vl0qjmvꉢ(E IDAT5Ml6AEHg9\c3h% 1Nβ~}nݺ/0hРҒ"w/FVTT556o..WRӢ"#cV Ә^ EjZJ̺b2aA0 XXs0fL֭2.駟Qκz9~XbsscXȨ޻v 1aԱc'.\d4BC]z| 5b~%yÏ P49@Xm :e IN:;Di(k?]v,vp1|X@+1}Z[[y|kWzİh  il@(W10.oIIRSSy: ß9QI#g+b6I0tt }"ۥn:\ca=BntHD};r>@Qzu|A P Vj~; 6{ZL G0 V aX:gF>rpXAN@ ( y4T/{ @`kêz(+pף g1@^XVk+_MueͧJ^vq.\괙ܲea#yb!R/(AtؐS9:9|=vV(#^o2D7RPPPYUuf-UUA1@ }b5_UUU7ɓ' }QFtw5+>oJshqٵ'miZ ps60#}&AUUE2w7A23}hnn\.?\.dP$Aju:V׿?V[XTVBB $u477O";b..5@]]r ,K^^~sR(J@jZzDp' 1RHRA:ۅZF,kڀ>_WW_RZJT"qBapTkg]]M]^()4]<th<P*[zV뛘8J$-~ɓ&FZ#'NHvubDcco1F4qL&/Ppr\& Cmmƍ[dX|>I,e=|>aMIc{xƏ#I"<,,#3BZ"z={+\.`0DE<$eW>Nd㓓"z&N0jF0a8ww ݸq Gݽ >~hjim1};w B`>sn_Y^o0pl.;th7? AapOSN( Xڡ0N Rҥ^FZZZϜ=7bİa 7n^&s=jP((+u "ǰ^=Ú[0֥LzM}/ƏK{mfʊ x{٬Gz0F^="{8"Ϙ>Q*mll:}\RRbXk׳=&g}" gϰ=J~,++www۴yP^^QY-8p@ʏ}2.i O'Nɜ]rww7 ѐVkOd& 0Lf nʙ81##{a"p8&}R$uAGeFk bcc|}}HLٻARAփ6af(a`Y}"1 e\. lv׮HA CJb!DccSXX(m aQ#O<}ĩАaKpP9qqumn|}|:?pA\]'NL=tz/LYAE{t j%IqNb=ҩT*4iBcCcIio888 B$cf8P3`0F6L "(yϵ5 kx<If3.(ҫ;a2ld"-$}'9sTҿ,lN+)o^~ow.$̙9uJO=QqrO?A )Rvq鴤RUUϷI֥K]}}FFfKKϿQgVUU?~ISժ2fEDgj4cOΣp~;x|>EQHt9F{Ǥ/&z**##+OP,77TN$nF;j5ZDOaȟWwGHHΪ iGqr[;;;[D"FP.%e &NN9 83R~g2R-H$b?8& h4kml39c~ڲuR EQ [>Q]zvNdy>pL,v`0`挔o]}EQ/b4EE󃸺.*Suٗ_YWf}_LY|uبվ`n6s(b k[/ {Ĥ)eE~Zn^g(]\kIU:ufZ˚ *z>e^MMHܢlT*K^{ 椬q]YYbVۋA֖s, S{$Y={I$jUKu%|Y<]b{X&#RA܉vС!P EcCu뛚lӨUzG eMv"QB([ȹ fLf32$@a@: u'N]/-ŋE7 ܡ0Y-$$v\[WwGM€ )!P EMM-;{)S 曑~Icݖ޽;x?//\$WWW{Ͼ\>ib 6o)--  E/Xa2RӮ?~Y6w,TbÍBԩudy]I NW|$$$Q\:;dH\^^~EEecccnn^hp0miUV޳l&Ι(ٽgJ2;v"I31 ; }Ռ1{ '83//bqfNNaa!Gҥ ѴnyW-Ddd\O]tIOhTxXJQ/zs@pP1 \.Kعsj7pGᴳ93޿<,(@M{7ʆƶQpyY6@$h+2`QC@'"hFݒubyz@QG?wV3u2aY+/1_L_>|10\.̝3 ЭۅE(pozof ,(JlH^:ɓ'>46> cU$ >}:&x<^TTdTT$յ̉a5A@ToK #}a6zX36R<+(j4@1@7@a@ @a@ @a@EYrn *\;V{oʪ~^ j'ĀUw]FbƎ9.)I 9hvтsmv3:Ҩ5׳o G ?ܷyOKJpYݻw5NH6vXvaaѓ_t܅ Ox%O~ݼ| p܇ F>_pe[O?|Iplie10z$mHѐ$ X,-0;;;R0 h:]}CCEe%A..vkVCY)>'  `qttl6s8l 0 (kkkVEB>(EQ---:`D". hR*dX"H7TVU|77vPjE;;{.CQNSVىQ5&jL&\.xZNٵli4Z@QVpb6Ik4T*lfXb(J7* q&.vphkb0H$BQ wSQV?f}[U7xMQpĔiSV𳗗"(6EQyy[o`C4*j̘.uzNNnAϿZ.}R޾swQQ^RL8Ko-_A..W32narYFfg~=@fB3Ҳ5kaw"C'O1f\>j;%9yʟVۉD=0}__߰iւl6{aÆ(-{ȺFۜ3]\v|%U*7|Ŋ1IcܹS2dco9rٹ/s.8yZR 3RBB[ZZ=b% dq޽wH!P 'g>y򔓣6غmGHHaCnw'1a?}N//bfϚ9)$$o4Z-;o W37o7 /\t>QdWT9{~tjMMKD6n!"//_V(:>9~jZCBBl#IL% [Rv֫l +:$d*]y_⊄>QξmsȌa<=<(GTד$xg,(7('A)xE配#vL8[5Y׮L1 e}0(6BnR=mc2=G<}mmxRT~H x7khHHֵ땕UѧO$64~8@@Akn>lȔ)үZVǙ'Nj.])--{ɱb,ːÇJ 8vvvliZ9rRZg>z6lܜ.033+77Olݶ#w@&spwwsK=~zli=lh<ñZfE.Rv [/i1`gNlx=+-/7[,q|g1z p!e;wJf͙?oK q ߸ib~17 4M1q''?qbjʬgb8 Y3S_4cּt-]NٕUbգǵ>&qP(|ow1}\?pԔ$AN4-,,zݍaؚLYTT4{Lw~6qҴ7c8;gޢR#zzzL b.K z -3.X  /& `D'!JeCUe#;qaXm`G4pƦ'Nv~%5Q,nK ?jęLQ.2qNږ^=Piy[ZB0l(  *+:8a&'gcRsTrh0fIO8y|~_H3@0@  @G1`8lo񆯯RdNKisqss3vL'#G/\8`?a϶By <{X0 BDmM3VqQk+KP>:M'a]mg$Mhj}OgZ:q7/Ub*[7./e1olww1̬?mJN1oqJdҲ}B93g(;w޶}g'7~vÆ 7 V?`DZ&% FZ&HbX,F|@ VL14l!J 녱V&=&$I L<IDATj H$d2'e2AMM&d=lbt:AϧcYVJLT2Az8RZ">xlhZ-FbډD8Sڪu(!hLK[r `D=2L-w}"mؽgBѵVN0L$ZF% > V澙`2Bh4: v"á(a DҲbijjvt5NQTsR("hii5 C(pj4Ft:ۯZVYV6`oo2jjk-kee#ɴZ`D"PGޠV-88#b0Z-`GV|R3fFa2*\~Hܳbt:1bFs& Rf *,,o'N:{Z{ Eײ۶0q,((hUlݚ_ZZZvٗ";,ˬoLn޼{Ͼj=y҄.fe]wޤO?aE_}MMm/>}jڳůUS]mZ#ǏOrppx̟{Vb=j8źz5aC 5k(+"1qX7VC~~d2IwP]]OVUU1^ 햼񶟯wUUZvrr *))%-db¨ĄѷnG!!55>?eڔ݆D"#47o̜55N$JH/&qnPmNN~EІF7vAd߿_r$:b&7|O2V|ŢKKKϜ;_[S2И GQnٺm_}Լmk׮LTJZVV~7s:T*;{V=xk?]//Eֳ͛Aqq^wj#Ν`4%K/-8|}+**5&qtmo~M #44dqON/Xv˗So9t菫E߸iT*TWWKTTVʜSMٲu{q ǂΙ 9@J-p._N͟9cϡCGVˋ47+ZL朚޶p%57ߐd?'22\> .>n EDž;~rn8}MM۶pRQt1߯i}..[9yqV$_677عjF!qc5]144xUUl iv''ǷzziW+2ePZ~_Ϣ7?ĄE8~Ԏ]9b1u+*SPpw߁chަ[^}?*^l?vh\XváGgL0Ptyr|6n~}斔~rՀ~2(K^:y괗KOP '3O\x)S uvv*))ݾsE{G{9V o]iN2 nٺ}Nd$Y֍uoٷW``=[9̟P(صf͆ާ~]Wk' 0_}h6mzIaC]ώ7@7m-:|8:}i%r,-*.0jkYYUURRrŴtpM\*>z>""$FEEBؘ1 nקy}b~19kWψp7hYܹs7WDD!ĄBw+ic-_AdBH?Aү^ e6RRR(},ߝ|h3@G99/]$&rvv}wB}7?]+]tQ#)Qkz`ֳgxsQzp8qn۾B;\e2|??_Zuڧ,=p &&:[ֵ_~B$DB7.9;9bb׵rhwE{8xHl{S+vvq^==V;`0DEnظ@KJJcccx`00;;'+}]juiY[9^^<Ѹu#M\^^}Q$AK=|o%bqVIU7o' MvwZ}+'GhȞ}5MQQqaQoSRrJF9rNǛf_Ȉ<(xݭ򊬬k_˩uuu gΞr~Gi4+WRqii7nzKW3zHLPt-5ꪖ={Ӂ%e(6dH|dEqHwd2G :bP{v>̹1''Wl۾g'NTTVUgdfy{y$b*3L\<~YݷϝǏY!/T`Zi}aog7&q4+i~DZÇ7EDEFԾrс={ݾ]YlfTd^ķ'ٳf|gλ6`0?_̟b1;J9gBcm7l7x 0iWNaE//& {qIORJn]FО=&]޽&Ng31=e`+a\'.nPTd'z=yO?vtΟ7{;8NxXU~ )&sKI& ߴy۫-RTd^F7_p{מBp]< i6~~hv$}|8}}KqU6oe>Fx{f]ҸI_}ό)7m3w!=Âx]Fp}'1 Y?w" D0j5kOK%8y˶u7nٴt~Y0,-?aذ!3quu-]P]Ufg/(ʥ/,xu^W[]n;UյAdXeXYVL$j5̣ &IxEf@3LolsVݑj5L$I"f2Af̈́@X,FEQ$ ~x[Τ)˗} u"0Lz`00L  = bXd8& 0 c(z[ ۾1%%ZVLZH@Q2L&(2$ia0,@ AXL:?mH$IEuV336oٶe{]mg5vb z]۫[,фa &ēh"EEOVfLę)пw[u: SN$l66ˤQ~YLPoj9}/=4ad,}JωJs>l6!d2RaEQ88Nׂb1 .(VZVf8$ gXL&i\AQd"Hq&n HdZ1 c$I[oI0Lfk38YVCdX>n\.d2٦,<x5rƵ/-O٢lT*K^{ 椬q]YY|.^,5u4g_Ϝ`1UzølP8μDl,˶ۚdN E>5q[ Ox9qz^v#GiW&oBp2]i>xE .C$=bqfڎ@5m{N6=A p@ ( yyTVl ۼdfs/Gۦ;Օ0{XR\PשFvuE> j0 8PUjĈ(zW8Ft/zt:lLct>:|Yx ai>zMX@ ff1#ZeEQ?s2a!s0|Ըv&6!NKѰͦz m4>M=N okZ+,5aFAnii%$ph\h!sB]]X&s=%X&O^mgs0;{nᄑ͍ sGa_z߀892 q&Nf d$ItZmEy),tpWt,*ȁ' (2$^  #&zUyӦGNb@ OEM`X|30^ Z8W_%@vz-E\^XoGӴm%A @a@ @a@ @a@ @a@ @a@ @a@ @a@ @a@  t|@fN혌G 0AC!,ơ·%`sma`9:[,$}p\b@ Oc0;h ҉4â@ b)+-͹@Z`00@ Hks*hjfb7bmb| g\Q m؛(uJ\c klHw Camܲ}fCEϻ/.x{\*|04( Az#yfޕ%@)<4VP h*jCcU1P${q +${RM_ǂߤ)ZBg6\RM`BeY92{jjlo`ُ>cW!WIL.!8W9KV^DJZB6fK zKQJ*!4 As%bk;vɆ:Uy+@ؖҌ~ӧg(Uד/;BaIENDB`gpiv-0.6.1/doc/C/figures/gpiv-fig_display.png0000644000175000017500000212537411204235560015756 00000000000000PNG  IHDR- pHYs !dtIME9[z IDATxg$u&>2"{oWWuwE7 @IIKIs(jDi$Q$xVsvfwvv:H+q2+Ikt}2Ym ?.PlQXju]Y{( qq#e 0$Ia0L4[yqC E1 Pv-&1 c?C4MMq%߯뺮>88Fp759xi>ګM$ ^wgy {o&IX,( pPu00~1 ƊO- ij'e!%^~mcSQLinglÇw?tm$(8ݽeY~qө Erݽ[0r>a,zVz^/aTRb"cð) `テdYiiE}^v"0FE]aP\._tһ{I/x>h4կR]iYgf^/6c8br:Ga$2X6rICG 엿̿_ʿp8L8B7~WV?u$:p/: aD"N[UԃW2 shj:v\p8wacf۝.g8L˂7|u O:}֍@ xE[z#(qcؽRa$}ò@,SOK DX,ο+t4MEQH U4 4M_/ H$eqa;1 w8 躞 ,i`:I. /EQǎ/q[o4ݎz(tDq8CpE$EA% ljcǗX%0 AvnjDQt\*E1rP , Azm1!$I:`0p. EQIJNg4|>~uʲl6TUm67ͶMõD۷zٳgI}[|cG$~ c}T+?җ{.=񅛷nONNg~%H(z|k`$!L0 0lN)v1; EQavnnnOt;| CxCQ?-b<;N?"!|!J5M?ӧzFdzz_/: ahƒLSSlﱳ{ΝIәTTEQZa񢮫k++++\.]ux_)|_zE~x(  -2- 0IAPm*Ujٛ0x/_?~cs:#]a,]5M= 4 ]7TH8;~7K' khD𵰸2e133kF( `p|X4j6eYnWUx[qbekn;}L( ᐳO:DM:I& 44]G^B˲|W[f0l^4MM0D"RR8Ft: oVnEQOp;;;h' Pa4]eCQUQiMщq-?Or\2\[]7e1O%`Yt oSoBxxXv;,q,na( Jebb0FN$߁*|pX,Fy C~VLZ٨__o|7E}^_<jExI·ۑHٚp$㸡<òGs8B9D" &&&\n[sZonnx M,F# Dqxo>_j5+D2 eP(v!F,(Chn(FG!$I3i躖dhF1 p8G[^… gEH4zh5:x7͖H&[;xA<[" * SS3CQEnw"޸|XXx9r?e&d&!(cE7k 26[cG&UU%fcH0 ð?AY-]I߇i:@m,íɉL x߭%qSƏHfc`8Ds8nWӿoh4mO$pPIppgy ˲6 F4M$iYֽ< n,vÕχ0ƈax0ryA# a4 9w=á@d"|(?w8o8(J\C#v.z=#as +;0pA>88Jt,eP,*fsݪvL"Eqgwwg{[Lss)˲WUP,ǎjj{y dphYe:Ajf2dz,~Svʘc9"BwLdlÙ=q׾]o޼jd׫UkMMM8qN=nA`4EQ{(6[&v8P$5Lӌb(Fq EQ.' ,1IP( R4EIQǺn]G˱im9AZ6cNWuwՖ$iaa!Nz=رݲ,ϛJZV ;cY&I2̸naVWWSSS< /ɓ'&Ϸ.a\T*Y㱸 3D[[_k5[$IY0lwoWᐦG>}vׯL$@yH5U' Tfi&INg(xI ÈFplnll8ERFP$ ϗJ %l &͛7i Ä!c|Zb!Ad2LZѨKd>c??q^~i4MOM놾*KMeoZ&˲,NNM^/t"iYZ}>o ^w+}ңԱao. iu{NCx<E1lz.r (j(Z7}>EQrM4M7mQk,˦ivYUU=qD:EQJ8 f2˲p8dYt(jTE1^WT4M@ AdkkKQϗN].kr$Iݎx cE0Zu]P/oDQ~+kkhTfX,A6ivZqbP,Lst…%MӺ`(C[n999Mۘw6 Qa:N zZdža(-* 4MWkuv]YYl6 EQ_]]_^^~t:[UNiZ(ZXX(ix<޲,0 P5=JzBtfff"&IZo H s;$u^, äXF$IUUGё#G(ZYY2βlE T*U*oF,;^Z(FeYv~ih4T*(Rg2W_}uww0x<>??E/ClZ$j50áiȲ W?nKQnWU,㸢(Rlz<8@ǰ=h4EQAniYͦvzƍbxPi4(DQyEs^__FN4`nͦ(Ev C 40 \0Oӻ/_v8(f2rf;vn{ʊ(˲ZIa0 3aLuhMz1 00:NmZi(X4xexbgfrrr0Zs疖._\( `F#@BgΜQk_ЇG\n۫zjKQQ V s\> V(:??tr9PDzl\r$ Xp@ 0 ò,ˀBP:,KEG$c@p8TU5$B[Hx<áT*!ժeYnq8βNLQieJFAt0~Uv:rD: {NfvQvr[;;q6TgxB0l!B녒q! LQQ%ILr˲dhܼyZb(t** l6ǽ^/y0z^.+sssp # am 5ec Zykw`ɲiZ jc=~Ν;>,E4nuȳ@y0`*,0 ]MDQtaal 6X,6??bR4M3yOUr< á>sL"TUߗ$((^p8zYк`0899977JZeJ%n !FhIt42 Qt:yV(b1oggP(t]AIe_"4ajVX p6!\x<^9 l6EQ`] Wh0 a PnĄ$IkkkPFQ8aYVz=޲ IDATD"'FTUEa8|+Wloo'D"D\.s=ɤ oyz/Iz^MR'N8)2MT*8N~p@jZO>noR@t:m6[$0 a;;;fEQInܸ0L\0!HmaF|ƍrAN'2 <$ig,ѣׯ_p,--ݸq֭[Nsii|h8 4M^&Nsnn.|cǎP($˲apca~NeH_j4/( A,NLL9rDQ'N@Y*`EQ,$I%n;) `(T~|`lw:AE(UU3gp8vFj倚x#<( I@NLL>}ZӴ/~Fc<#H$Rk034=\޽{UUU%@_4M\.DfvׇWǓ8@9h,c@{<S(#< l6K/(H&UZ^xZ=]0 #I jpN$Inm6X-UUUerrrvvjmnn"}.<pgnnnqqEQ2!eq\0$lrHjT:~? sHf QAá(0Y(zX,bvp4jP(ܾ}lPLz?|> Tzh44MCϠzg@VU0l#&B. hh&>ÿAP((2;;N"d )p@6Nxt]!kL0\[[+/˲vp860TU>ڕ6MtLF*q4Y Bj4|>0$IзB:D"{5A QLQ< x,L h < ze(nwzzѣNL&;x~z˲/f fff|>hbnxT*充IAFrrիW -JtFQhCy/<ϻ\.ЙE BtGaA0$N>,iȑ#{b˗_y啽= CbG>o~(C 0zfTb}0nd&&&677766z$5 ÀCQd  Ayic`W`mTM%l6Z(d%XF;w~,|nf EQ*0ŠZr0 옦p8  F_)J&w܁bvV<(Ɔarp4Mಠd L&C8aN… vիk$IqD` ш$I4)rAlmm<Df@R$.Id7#Pa2l ~2 F`e]rA$MӥR)Bcq ց ZR766Ο? ^xͦiڥKj6`0y^e7PǙz!dxn7@4`/ BQ0Tm8*2b> fiSY1 [YYbF.]J /@ Rq7===;;˲w ! C0K$R,I m zVx q t:P<ϋ/(b2#xfC|r.//S>O~'Z~~שּ!Ea=G kv^B8X2lZ5 ԧx\V˲ t =/%r b3gt:'''E 2ܸb=@dH1 èꥧ򿅂/)ná*J̟޸|~o p6U H$ id2911058gqác>DNg8;?HϞhb0 NAwHoݺp$7 <:EAȓv ^[p4 @}ZPɺ\.p(?~avyW !";;(*l (M^ @ŋ]l6ޚ?3w%,{i[ղ,XSkI`9rFX^TB,.m>mnnª"B6fqĠzz`Xr:t.zG|~<J ggg%W ˏˏb_|-`0x۔eYhd; , z^wMX\.[mƍ_:yrz>F|iz$?fx&@LgpR[*mCpC}_y(A Ax9>o߆En7e0_Pp8677'կ~X,3334Monnbc(1wWݧR)+ʃ>nZ-0p].seY|~mm t\aSO=?sp$?{a4_p£>r`8N0K|ଚO}Slnn2巷~q JJTyrvP@G8%CRa3H܏ iǿrFЁaXLv'F?eʧ8]c+xfN `GoM/);QbYau!Lrwh[$G4Eرc.]Z^^ tx^_YA^K땀f^r9@(NMM-..W=Hd-s\'N|>A` X((^/cf4F"2`̀q9T˟%EHs` x ٳg}>_~K+Ͽr;7o^(/<7sqrG&2t:}`^ {;8fJ$I |3HhrywwYB8݁'Hr ڵkLWE4蠥 =n Y B.zB4r\0Uy۲,?>r|Wx0 (Vojj*xff&LjqpYA</V*8x0[Y1d΅qۍb.WҴ,QڼL$a4 D/"kƊR*% Ѯo>r7wt7_va ˒8yK$C^? olC?j+_ pXt,=>QaY=y B4M8AEF"O~|MAP~1L7ݼI DCMvɲfRg=vo7UuTMiojjYP$n7mOL~߿߂OS,w"߹LL+JVug#h[d-,v HBR -BKmP(() vxŕ(ϛU!qq] d2~?{Xz%`Ȉn?w?ڃ(>v|> ш,3LD]׷K;ƲtRrMQltFW%Pr;!Ͼh19J{BE߬$^6y^Dv#I,< fsWW6 Rn>߮|̞ d㪪nooL*ׯ_o8wܹ"x!\. EY:::bX^^^YYA k~zzzkk ,,P(GRy饗@^@M3p.~:xwtt4X.ӟb/ 0fZ 3669`l6t@ӡlV+5-F1@ȫ*pl6[VcM&&iP6BEO>`0~HhF/ Fl 3[,=dYkbPYkXIVYnKlaw:###fs榪===7T::k|uF`aDi5"4Sk(KZ= FBH"Mg^}ܫîrWZ2p( -.zڟn{!뛛hc<_WUUީ÷GG!_v8h(pV`|ϼ54R(t/RΓIg>`h_h[f0b8z?_ŏ3ArEo0xҡ!dslneq,|e^Z?ib4jXN55HDsͲij{;*zjR,nirW/͉)^F9^oӴdgǓN j"ė3?yQuO\Cje76 |n٬u/ܟ/`;{%žB~5hz(hEȊ܅](N$I>~'˲II(h玉m?6^X,TեP(59^~yw؉7uu,x^tEQM(П|j]P,xs\/3Uy0>0W@U r8ZfΞ\&dC,؋۷ׯx, EQTt[\>d9qg\6v( \KNYŴ a C)pBK$}}}8'I2t:͚p8h4|>E ,. mH~k0Wj sr9\.(غX[[gvv[J:.]]][[[ zr'NL&?^o*31tr9j5hn7a3#AOfX}( ™3g_#5<.\.<FVbay9~H Kd}NgZMќ4_fO׻i%Jl'mg1t_ytwuFoJg/S{ P{Nt^ߧ|jf)@XdJBV]Ÿگۖ1dRm !VKhx4E/ө(N3+|KY6w84ڒJUצRG+BFɿfgn-/k*goZq=0yYNc !o:ؽިl%x$h[l6qpU?]2oM>N4@[S^F)%wX NۦVh6$(!eR;WLfAofJa}*"Kޠ7ZF!S=62NXfe3D#UrfsdZW[G1|^C~3ex+x+9'{1ԨWYqCj5EQdEt(c'-BҵRf"¶r:A"jͿjDfiVw焛w议z^6u!&*\ku׈kIƝf_ә,IDf˽ týzE5OFKsE"P@#>軻yi6t:^7nm.vl6m[R ak!xt M[̕T* 1ln聄Du:|{t|Z*rF$ff}fiYZK <%╅%"rK$=Ƨƣ Xu!QϷzL2{iXl{{;D\Gȧjm+q7?wp~-QͷT7VRwx1MffW*FLܷgi9UN=a+Jt:z,.89 %Bh2y$(ò1y˦(jn*6z}dn?b ou`ZR4̶:;;q/| p,}D |뭷lP(tŋ/b1I/i+j~6;h4lV;`cccRҥKxDѤj C]A}4UXrBZV*=Q4}?SLLLv*!"ѳ?sz>!r OMM-,,;77(JqF}< Թs8ZU: {f  ի~#բo\QA62[oNώhVM^/B<1<7c\/O3r)ᆺ׫ ê6[ hD#Zmk3/Id2㆙ 7V[nrg2YV̳6vC!J燖fYil?J4--EQE٬qTEXr:;|GxI6$ŅZ*ՒYևN$ !zCxfa$؜KycݴkZ|7JcPyάczPHW%$fyf ><999|tqZ@" ;;f3h7h8JW5fu PSƆcbb1Lo(S $ɑ$I!6Q,h4JRZ}BU*}ځDI0?w\.ʋe~dz-dYutLtB] 3`PI@ Ve<6B:::FFF P#@cеa=zD"F 8w(b2m:l?a7cа Bre;;;N$:tWg*@ g2)'Q5X7ŌDՕ+o+x> 4!כH$0FeYU-˕ 3ӎ~@рSc ozd2U* X&hBI%LGͦ'x玦 '<A{6Hd1+| }T^.(#X(p)b=I3ؕ'ZM#.A pɲl1?c-7ftonnbA KW*F À344IJloOf1Il@j~F/|nef(V]Zn}vWgV׾d`Y^^[a<9vr<|'ꍦC8έVh 㚍FժЮgR$D8hږ[7dzȫeZkh4V0|mkGolMYww/-z5s_i%ԟ(+<)vZQLbXi0 ׸_,֖]ɸ/{hZㆭ#];.D>/kgł˵ܭF#٬ i(ph4rR* h\(=HƢQxG?) }VkbGSs/r[*DQWzG޻`$h0&vl$[)cw;6;;8l溎'?8eZώzP4a;?7t^`(U/wSu:ȏKŵ}SSS>$?Z|X*)v9VW E'š@ FCY{iŢ[޿g<˗/c4}cRVJ]&SNG88pd2hY2R>PUh|af;"exT~܅U>SSSG1sss-dY~%Ir݇Ƒa^_mooWe|~?:B¸썍 0t2@ i2 yAFǂ2x26d2ڃ1%\6r.$- B`8@egе@QH$677kVo. sssHth4oܡ\LPӶܳs ح;Ummdg KragoMM ; 32 8a^=ysJp[=6dmHGi6Pg:ƈH7 :l6'&&?n<$}+++p7 <`/g0&C OP RUUDSdْZT677Lst;;f ۠W. 7?6`7y=_ǰNC 3k!oI()ҵ/fKN14%X?WOoo H {֞Pݢ*43̓ti}!@&]k#Pw/+BVwlcǖJx9aE>puôǿa{OB}}Ѡi#UU*/k}FrFa9(>$NWHi,67;mOl0XHio&u:ǣvxx= BguMΤwяL;F|lyS53?G)!dg962& Jcft$]ojթɡ XIOFj{'5m+H%U;llqg^(8V`P MMs?ŒS&Sەر}9x АKKKbj58DQ);\ ln{B>xv/..t:Z3&al}}}}}~/߽C8sܓ|A؜ OAerSVi@:::02r݀hf@ M Vr H*J#rxx[__pH}ǔrY,`$^vT*r-& lmm!$(`@T%ԜH$f3"3pLebqPq&@Xrz{{v a3PۚL&ST&r8І)2&3pKAdNVdu:]gg'Vvw*P:×GQT"PNH49;&6 4pxgggwwőH$ Y,nVN>a ߌ40\. l=}}}v(']yfߏ,3D0ʲ\T(.+qgL,Vg;y"ˊM% EǓ)hBi-ze>{A4+˹x7yܫS]XzZ2qXy2Q>aIJ>I鞵Qf3l6M&c*ql}BdRif#sòJ?+fk#Ki.glItuMS&+(RHu[R1[m&^ϲp}o3MM:q\\QP4^KMg]o~=G''әB2K)`D/=IZܐ62tg{ʺ낽Zf02wz9fixRH&gx(=Ϛ馱h4H$TU Bڌ67)+,yhBN2[,$UuoQ,Z׳c0Mǎ2,$pB\zh69"JTEDѩed&%yf6+ZNӴwZ!֠y GSo_O{OIӑh"B\*uNZ/$I(jAJVy/T P#(:[kH@5h@jxdП<0Mr ՅB>6aU*}kYN(dyBF~##kZeskkkt;%ͼB_1h=ppdd-]2 V㯆;\H޷$A$ 0V%2S2S|Ezzfj&SDzeVK$dmehg ccLq޾oB!e-~m]ceAЇԆFM/6WKm0iL×o~b 4mwwl|.wfiQy=;Fqel |x<~(U(&Adikk z^%" rDyh\]] hKC#CUXA=[lv//L Oq9-fne▐I.CT*%2a(AbXl³A&f_(q1)Ctoo,˛HN^GGf[[2m jz^`jټ^oX܁N &,>fJȱהXFlf=Slbin+L5ZTj@)4s˓tk52JWWׄrkaGfeH@m`0t:ñ/g5?|S Kr"A0lSe2H$"IpX uiXCTUUj>44t:/\@46===~- EQD>Q#(3MM6MӴJTdϢqYZZ*lፍ v4eN K00Cy;;;Vk8&㸎,h$A/r^?|pL%k7Gy$uwwl j2p[Vb֝Tj4|.wX=~|L]w\P:NPtDOv;vE$[}67ϲl>GJ$oAVWW1|ۍ}Ҽ+ ,ff<+~lD'k=f-ŵ e}Nt 7%FaFgVVV*!1fdR{tL&Lxh*!Wr/qv{{7 EPǏ ýSngT5@t%]>孒jE5i4u0==]V0x*|i1L"@V0XBΟ[\4FSHJPƝoy-1?pZ/R4-^dj\.*Qٷ]^,6P{R'&& !?'7Ϟ9Z;=c#m6[dk1w*C%6\xln5liK했Bc#|)GlU0[v{Q[b86(I:tȑӧOku a iIHfJ%a2NB,G=YNT©,d2t H"'XL7vf㽮Nr00I&YKFnGFFJ,E=4=^j3 Ih4bt:yolE fTd2)|!5i|ybH8f^ 0ϟ?ɔyo}]:z(fѱy<h'P_Q6Pvtt@>J|>lkkk"?bb6A^`J$HIg5bwiO<jJ& LA!eYYf͙xt 0D fM$xR0 ӹUB(KR T Q/.f\9Lmiz)q ZxSgJ{>r 0P($ \`4MuWO\*ezm0z pYzu{vf;dq;Rv7.plm++(N+f^U#t4;妟9vEK6]]4*|O .b.> jFw^ҿ)Uei7#Ƶ$WonMeـ۬jz >ݺG+otcGػ^ϋ;^z %0 q0=A`rC0Vy ?;tԩSG$2҃L$)h$ДIZRy^ 5 t}ILt߲Y,ɮ\>,NEUBj7*Uw~ra0=eI".AFE԰‘rpe mD>Yi$di'Bd2uwHX&T0"5=:&YS~߅BIɸ fF93 X>0|jA 6\d2Vwv>j|u6Qs%Q!{z MQ45,QZƱ\.tR(hLP #J <99 qp'4C5M,ۋ$˥ɳ}}L7y0BPPi4M{*w>h/'0"Uʕ+h⠃@l6 o/gΜP]zUEh.DQloo82 ~?~a^llSF#Bcp\R(P|>\ZXnAR8dC/qhZ1, V 014myy$fT'aaT$ xjmzF?P/ciE=_'ޣh^+JKtȠ R$i NY=_*0 {?@FUwp\h"B}el4VqBH2?~"CcFwvvj'>:0݈h0^b(Vcd Mz>sB!B֖kwE1vVāb.wN-JeѼ;}8EVAЈ&lTz}r( bdnևz[d2) :^}}:5/Eq GTM|Y~tDX!lnn"&QBn*lwvGGGO<B!(_MAC?K+\XϰZ!zl6ׅlWhA >%HӃ4v'-~thxULNNb1 U{{c@ ^`036,5IJy80 -lbY-h1y~kk {ñ~Yggg{Jhx d~镕FQ=!ϻy'}N$XAʊRTj9N S^$2s>te9|ŋQVbvY kv}f{ggg_~~X,FѶ@ z!eVԿ{Wے)CZni:moopSZ>v0l7 vo7wqFG T*P} =/7_>e:EQ1̡PyP2Du0ťz :::(Z8}RFOOϥkHQlV+WJ6\f8N.R/kT(Ye߫ ?.r2@^r\q| /Pz7ru=$ABÚ5WƦ97,jlػ2!8[oza|.=PiݔJU2HT" B򺟢$i򺭰&AP\[qQ |K8.IK"_ԔF~^TDQleY$W\ )v}>]X4l6ӿU!BȋgݪZo6OѴ( MoXdW5su(]|d~ Apoct`Kp6;B-ԞvL_sVVDIAZs^y\Ne4[-s˦|e2GB۔n^ے2kEQ#ZR|x\x==={zMu+/1FClΎd{ވe;08#$[y~kGQ)d2LСCgZAdaj5on L#х}/ 0A]A4}Vemgr A8,gy9* j(an|=uŻ׆U !]yg?iQ=Ph`?zjZyla*?;tD(b^w9 0կo߳cq-u%~] X\\x&_+ϊD::.Ҧ) S]gA!X5 hD V!ʮT*W220s?v8I:d2;tHUr<N&lW#]߸w/wiV]\XXR t\~t"wTR[ܩx}ikQ_Ɩse*qUݢlYbqJ3@\}(]wcRi=K4]xw,o0HO4Dg1ZMLdRYd2Y,LƔL&8nڵAɩB(Uk'pdR  °D"\<gzuuNh{{{SS|ccl +rڜ; Rj4jDǎK&j5=i2JffE&--lFPxޤ׽ܼjZ-B8==e0{zz<ɩL&jz=Gp×_vɓ'>DdGGH$ BJ _'o!d|ww7DZN. ZnݪUg!TȚ5 E(xnpp "`̭V竞!PO2h>wZ2۶m߻w/rfY3L#/"\޳,A$E~ cwRІ ?Ҍ!zd2zpde, Qsr"/..8`Yt:^r›/D$ }_ooqVrMM4JLFR 2|*?Bq5Ke\N@\)VN*Ue(JP8 X$*c(Hp><{5RM Ee}?F/u8x/ $A\*=D\xSRZju={vbۛ/wb0c1$]JY'&&&&&ĝ퍍M JHXVU=6VP.P\X[6a2!ZqСt:aN(Zpn%÷<3Lm_g( 6E{Vgx<_|j)rJY.}ٻT*,buLX`#Ri1dnʕJRyΗ_ Hk=Uo ]FHH'DRe'X,d2UU4px-3w z 7<;Xgbsj pߟӖ:=!HJ,0<ڃ2޳77a؈X<%֪܅Nr 9F=wxVl3_٤\][W1\$UJi. AX lޜ$ab}wh>=#Z[[V[, _A*^)i /^yCI8&IR7<>6ay! a$I$ʫgf#jmnnf3R{z ;n-1 n1˷K¾ fDjre~q1H2OaU0TVVȥmmAF"3G&"GwUb5^|c3M@JWpG)/hEiiiIR3̌χ0 +0 ;?gD"R:;xc\!3,+;ػx4a5a[$swf-j/dW"bvvz18xٌUK)L74U*?Vk D(z/-``P°J6mAlvjx0 ;x -@qB0toP:ӉӦ *ߠ<MѣLX0sņ |>_RZ+W}}}bxttg ,&Q" 8t:"3 >V,ON!t:r9 ~ml`PBf\Oo"H8Q Fo? p@$C?зJů:٬P(T? !8>:e+/- C~$  /jͷ 4o>bA0'\y^̪whDrj=tɟ}B0#C_}`{6[]MnGC-YVriˇՋd(83_իrX,޵kף+$%A|,.㙳Z O.[Ny$aB8A|oppСCHd9BQd'?)80lXLdPq>(ӳmVa{\!rD #`ZxJemie\q|d8@ cT*2$YY\m z>or?~|~~E3FD"qԩp8 XnF\. LQg:;; $"4\.jVv_<85555;;xR$;::ZZ,sCCf2t:MQT&G$ rud  &zG! <99H$1xhhH*;vVjH$ 6MۭID:`f @oD"VR(ON.O}Cgx hA /ȭbb9$:::FD"ǭV+EQP!T~$(S4mj @2 kW}qj*0x\;T#H$ȋ]^ߴc2ABcl@<٬J陛$#Pץ]!,5MSS hPʕqS )>>\fa=èT*BSőe\~iN8ܬ˃x-/{"Ȋ0˼L6P`qGSߊD6x^r8EDi}t~Lfڲ/iك<6O2މV01A=yA?[oy^$=a,>th4:s=tjco ]`z$_FrL?88(HN>ŽraAq ݪo~V/r~Ա$aH+A` >~x*8~8Cp)i˖-CSSS~ݏ^ V{),I^Yt8@.`Z*! ВۺRr&z0x]wp >Ǯ|Mwq²Om0&'OXZmH+JGFFtR&S)/T*[ZJ->-C\VzkǏ+A@Clv2ܨ/J~L>"r[[{zz ;3<< ŽBhooohhk,L$~a0Nӛj5>s:Z!QՖCf0M @_A,3 ihreEQcccEhll @>s ) L:𪃈jbS0 ~|D###@! :"4MTn Xd!p  's\kkkggJڱc "xaBhiijX ĐUi@ \LVYt0ѲZ3>w` dpY889UR[!$ Txccc+V$30M t:rX_o T 9JyjPT(4"vxij'&&ɤny> ~zq[RZ}.DoAtԸD{.啖f _r%uuug׮]c59%s!$ zJ IDAT3$B5k8ԀכL&LH$ 9+[[[Xmnn<{>{g/J%Y!ui ! xk\OuaوaHAmySa׽obzjZYmFAz%SZ@B#/7Uc+(cuu_X߾|W#[nBOkj6rt -sr?A' 互O&K/81!Sb6[mmw=DBڵ u{=t߽,B{vn}; ת+(RljRTTrE;odž?:+/q5{Maӯ7ld2-Hw|dn!#kE- |Υ\.G$8o>;x^@i!u;rPK$IYV8rXLOaO˳R,DQ`0:u* rvmC;9n~ !Hd83h:TS)c2޽Bxbtt%lܸq$(ҀyhH4 sM X,h4N:5??_*]a@b-[ttt;L&iZ"WU3pM$+JZGG d$W^ye¢F<X,n޼ ذar9e FpBFuuu@Mv{6=u$<Edhhr͉D"|>?00(:m@4?:^ P 7h]S(===4MA"[H^d2/`:MLu{Zhii;@ AGƑRlnnp{]oooKKp"sK[[6C0Z* 2Aawj( d2W\O>],#M7ݴ5 uBwbbe٪h}ITsRK bA333$IfxbhDՊÿ>/V~T>AB3vC k޿7?ē-D"3F>n{nA@cjFͤST:<֭]&9͊D2!ipfY$g)|?^BvS$# q"<ڗ륑wP?H]~Qp$qGP:n|xhy`ӦM]J%3U#!qWxiBe;~rzvP(\,KEX0# ê$>JrÆ zj&ӧOP(6oޜH$d2 X }bCCr$rI$E&y<аaÆY߯V%L8eٳgB&*̀y" (T;qb˲kllfll,wtt@{||RhJT,i4A+D"ǓL&5kjuss3 eLJY uuuellliiiƍpSϗK{ڙLѣˣVFsQ ÈlG_zժU==0Tt:ZM&YV 8pxEr:a4j 㷾zpZW]Ph~~a-|VPI}2Aܣ j T?.0@*!Dh[6/wܤB-[cۑ)?C? b\!ϛnB5զ|뭢PH7pbqxx`PEunBaP>?TC$I__Խ.]su!_z:7Fi06_THV;00000sFB'߬f嚫YfuG}}'p|/EQbxzBW- #GdbwCQ$cV)?N'~V~od쿯/s@ I !~LB o?\1>sO/ʯvMOyEw͹|^*k4\nzzP(+pPZR._@H ;vX|7^MQT`#G\.XԕL&;;;!#J I )=== ,B(@`]<88e) 6V+jEbZ%I={p(jpkaY6dC!߆ x} GK$ ìVkXm>(@ 2tttjnnU4 &Bg28pl^___DO;bVL&74 s,R,z^evBNdn[$߿?;M&A<A ؀T__trRNLB0L ~qj4R EL&ǽ^o{{;/Z #w83v_Խ3nzV{ᑑاێ?%dc sYX8f͚x<>22R.ժ 6BrmA}/MU UwdVJde) _\ۅ9;ItR$Wuu'Ͳ,Ey JE5<, "?e +PT?`&ESz=W]]ٶbQ(&^wƛx<֮]8|׮B薫Ǒ?bx$ "ͣkU`4p٥GZ'Zq!kg]yRi量y/q/N=KK|R-J-{[Ùloe᛿z7jw_{?ֱAᢋҙdsq}n@ơx<>vo{d(T ED$b1H.fWAp8d ) wZ&{{{}E"8p8RiWWn dPl]MMNh0J=rH$J&4mbgggOO07͵ZM* h4{ "f9fٶ-[ꦦ&=11Q(`T*L& @?X,mmm\.GQ B,au4Fe`C2f2{Frkmչ9貞mF$ f(~p v <М@t9O> @UCC[[a[zNOOHĒ{'|a1BOW_o߾{OPttttvvtXx|>_y߁2I]nJ|>1N>rB/W%X, 2/0HpCCp-qN$4<ǵu|>@6r\#+O\[#q7߬Xj5\R{q.b6?7^x0Rb1X ZN> [ R+h4Z%BbRзѷT*6:nÆ `)Ynk1BNjbq$ZLIߖJH" ^р\h`4}{{)LrP&Er)\." o3\iJr̻paJE,D_ڵk;J$TJʕ+TZFw]RH4: N5664`0|>hDJV#ǟ߾B!pVT*U zJu [T"J5??ZD Kj|Y`QӥR|pil`7P֡8,Sб8m2˛H$ =@庺`*L 1tttr9۝J(T*KtPy{)`HR6;J|R.Ax`0 90mB---$ b(.fuuuZ!-ÔD:J6g^j mmmUZj[ST5 aZ1bdrc^\.b1@ ݹie䁭Uq)H$) p?Bp C 9P웳$쬰C-M'p"V^8.333SSS RXѨ1}>j|>*зLv40V`A\>q޽{5 ˲'(W]-c2ދ*.Zv/q;NeaaavvV"B&ưReP%b㒐FSSSXsh'B ]A$9bp8\Tz67AK87MfCQbDmjc٬OZիWC&l$pr{A5P,yLDqȑ#~e`jD(k4i/Aʕ+/¹@ nDr}$~86P(\ֶfA`CZ$e2zzzL&20IH$@[zd2p( FC+V/ * d2(DW%mUU=t: 4H$j! B'O\hllСCg7z4`$nQ>pHVm6<]p0F-rF  @]" h4 ?tJe۶mett~0J/{P(B5j/tbb"σmeY GH@T&Dv 8 7~ _fFFVӵ=hT"qrrni[銃Diq?? ܪŒ_FvB@M}i8S8Kٓ'O.EZs Ps5:BtK& йk$Oa_REߜ=S]hcM6V]Pñs>h%B?kT<[l:OV9D6/!B]yIC~ B㱑\ΨT8$y8 HGGGIFV{ Զd2 r(A f&jz=`pR`4ĺCgnT,5i‘|az)ɝ"__x"\y9_JEbq"q '0& aM; ݉Dhbaİ|<'IDX2B(R"&?d$ӠL~饗NN-oY۴ۍ)KE"Y97g |^&Q&cXSm%`kYؘh4nrln\ pPz Û\,+l6{HD|$Y(ӞѢ1DLaE|?GRU#aIV\Ph_*0lii wU*UXlP=K&B0!d$2nLժTe%BF#eѨD"Yzn3;00iAb 6l %BZ5д"mEbCesL:- Ҷhn3Yz[P^d6o)~/rB]\s&+ C}a<#÷q9&-I}c \B,,-'D1u<؜E_.Ǎqjeɤyl]GG~'ˊEedX(.yHxo<P@ͲuVOR(FF8R0y|E L wq?(ÔH"\%-MQ}3 IDATN{={ êG4 l&ciLa-WMK^H$'BᾐauR,C L$3RR2onC='B.mk@66`L1;; (橩)Єv.iZh4:55U*ZZZ` ȹ\s4M L,g5]raZnݺp8 h4 '5S\sB5d0ɴׯ?|G}xww7 P199 9\D"]f ,# \9xRTБ!JpGP =2L^x!W^/X;;;W\ Dptwi  YT?vA/0w}lU*H$_Nr j.R6m:{g̍7>|ǵ) njrh2L/hd['N^{rX*<d5 M`T |x-l8*Z1H kѨz`U*%1 ާƉI[v#sT _j#Uۭ- O\ט<>{Q)̖Fs˞= -s,˖e bR' T$C*%mX@X?¸`9~HDDjqd_7 _Ovgzn6:"Kt;8 x/_ t"!};a6.\q (dkH8_#[K\Z#Ib @Gӱc(h$ (Ix7Pnv0lzzV|-x;vW"^Dhcffe0̀OΊo = 3wR Ix1D"JeXxvpuUzT*PV:f6J,Jr~%\K{Rʫ2h,v裏>`XD- mVdN'jZV(juqq/e{>4BVN۝NKfS(`*@EɺZBVmii\@xa$t:]VKR 37"M&ӪU!ZՖq;O(ZP `d jJڴiI. Nay `877wf"Je, zPL&U*XXv_G侾h4:88X(>SS<*{kzYNJU. ƞjzڵ@M?|4BIa\^}? v!Fr EߡS^.jF'2 _,I{z}T^7"@Yܷox6S*IX6+YtN[Je,&'b%q3X^,ә*#Y"t$I1[NL:S(^)Bu2TjLJ%}8f%^%^g~֖ jZ62jZchev8a(oT{>KHCĭ BRX|;I՚rBDJ6B{~S?!d|s0hG&L\w陣 4L&CjEFWcs9YeVtΜ3,--%Z&XhYtH^'9^mPo2tLw{)jJdPFJ0a[Dq&}~C&s# RJt.I99)TaM$W&adrYɤ`xXM&Ͷ["~ &8WkwL*xKIrY" #sE4}m< aV S9gIfU[ؖqL`BBH J Xre[$zfN,Y6\s\3[Z}zzVTRA?g`7p j"MA޷t:/I|g tQVE1aH p$ ib}D+ p%0 dI6BgYTͲmJKiaH$Y, BnO2t !Ds|\9dў8<.\3mUT*7#}DՊ GV5-w5'qsGW3?,#TUDR!1`$!|erZwfyAhȘUN !NR͇?.fUZ2]Z.#g\;۫<[w(ɊJW5|9cf[`V38g7%܎nL<^|677y%nnwvKJQ̚C02D,܁} N|_%l6|>pHD!A4vGg2 jkÒz=Bؘu:q8BMde0uF=88hzvX:>+8A04k;BV:/KE iҐf41:8X]]/?5MCsPDd@UOUUENQ,7 &i&V !SkDqj9òn$-krFfw ԯM/T*G[[R3YSםӝes9$4mB(ӟϜ_dvZ,*b[,k(<rI37u,l+ NQSdLT*e:Q+vEu#[q:M○h$I$qxqF,Džyz>S/ϞР?vr pZ̪?طBO]9:`@㶈r#Rݷo6[ey;Nm_3/+F !>iUI"IS3U g",<Or_"0x>qq$IϩIqK6mmUU4>| rqiE~づ.az=g28wp\ Mr$2Une) .ԛ.]rt$I*-û|p@r9a8 3Ŕ08 pIk؎`WTr51"qJ VxgN7<< *4M"Z($ t:t:q3}}}Gl( _!9ottI CPZ|V5H  C{0 + f,gfI.8-It;: <˲v̙3r\.j4;::HG.@r?`j HZ^YL/ٙW-wu\.Hq  f TS>VWKd2`x!lZ\ZA Bp߽z-u"z}oOO*u^weey^Q"=pBBtȵ!`8&pHUG :VgxE!HTxI!51l(gY]O{efbPL FG$PhxG8ǑYXI8o48IBQDL.3 RfAN81:5ey6ۃ` )*qeY~5L5--@ (dQ$IJItsq~ޞLOƔ^aQhzKҟr$BLFW,lE@@sQoTC46xHkFЇ6%N j5.~~ ,a}k8v7HFUU0εZ tk`Ulf q]2Und B!Xy$&^_| fzzqw.8nppeqq P(dZA jzsжfIEzZ0jۻBبe:M#]ڬ,|amIQ61N6mK`RP 0 4MϿ h+N6POQB1<<<77&I uNh4oMp!ǣ:YR" *'O&ҩ V1 ݆_6[K8NVޡlMWCb•l*eOG{pH#2˸p$q.c3q1:NТj<5>Эˋ(X2Yp?L9Eް4(g,~}wϷ|!'";󝔢ҴaBloްחomFFQ9!*-k/uHjڹsrrcL~%*Irp uJBv{`MGzvIҚd71bYvwEV*ȴjON"g&iޱ Og IDAT? 8^ yXk>L9Gq|+n:Q^(lhv9$ fy}rEEV*w"DQi |al2pf=\&Ǒ6QdeMӖ .W\>(& 2`$.IFu{< ݟN?Jr2b6%Q8.v `O#IH7n^x2z=X 9s:N(z`+m6zX,8, =#$n~R$ l/ oIvvD"a6Chaj5Mjh4N4 D^A4zHƌ* t:?H8]Ӵ( ݻtZlJ%QAULp: ,//JUir9H%; C*R@05k h4 =EQxl6{<,B|0'\^^. H$ImmmQO*,({{{A Q"@EqL&EQ8ξ>x =czo0@AGBȦ<@-I$Iz) D lƿ, LXlkkKUUXF Eοz:\U[`ZXXmZff`e0ht K/$r nw8ސI^}dWoY(%.u ֊~Njƒ[iZ$Cfخl>?D >4mB|`ho/flv%⡇i`d15Diڿ]"IY!.3 b! BV&sHQj$'މgϱF.ekfy^etxU0t:hcC싟? ժΛ- 4i0i68#~]{ }BYU>5}ahsSXثo{6\/om飽fIMc򚦐d'v{gg6;?tZW.=Ҳ04E%涶r|X<F\ ɯp(ZffDiOݻ+oDiUdAT5ПdFh%wjif}0q_zv$ܯ]VE1y7UI(dYp*,,,z.@Ë$jv\,b1p58v z.a"ec :-σtbFkiy<! Q@Gfgg! FUJEN/vE`*J3W8x<AȀj@n#`-`0@V@@rN_$>}Z4@? Fb z뭋M| ÀТdf_<ĝ*B$Pkkk ʵZ\.h~bY^e0 UIuwwܹ3mll@+h!Ж~0Q_h%Q ƑiHd*0J`z^7L$ 4 j)UѨVk( zddT*p-g϶43g/\H&r˗֖b2lo/a! `~ _+X."wH׹Zn0 ߿hw[}_TZZZR|%R +@h8nyyQ~? Z/ϼV*SkkT:avNb-lp8=w翌-.2/j۹ 1 #on{!m՝#.! ]Et?}  3IN tuىfQi{:?''{V kP$Ѵ|`*$.-*Cn[D\I$]{bm6 qOLW]]]Ů"B'mVvq8N8&ʍ7fRC1:;Zj$ P>xsqf=-{Bk`VU(k4TѮ:gdzd4߀us+s0"*ɱEE8֩!=]Q[ ET*'ñbծ={fOz+[,.ƣQSriw$4 T6[yg! SMd8o߾V&aj5!!7=kn.i(v/Kv&)W*$B M.I੆lnmm5f2P \RӁڄb:;;v;<,2e`0 )|\e- y}2/}N&_4Q?e߿tk2vG^o4E현r@Yf!* C&B!A/e0' v|V/!O$d2veٕ+WdY$[ZZ@OOOGG(58@BhP( =zp[,'''rH bjVU9X,...q#Xܼ(FAq$A'kj4U5dN3C|לL f >^_Uiah)]Foi[Ϸa;X!q/ӰJwޣGBp&H r`^T"asYik;Nk0 xZU.z!(s_ڪT*>FRb'-B6W<{.al6-A s\2D"VuppD[7MrL&0:`h6!_(5M4v>sww7B[[$YZ6L0 [5$JWzj<@͛u7Pgɤ14k ׳+aϮ;pNOW.W9nn~оhO7IӴ($ #%(a_s?!&aFb&h]]Z^/sio`S\$bՌ&f b'MI>O_kH=`yic^(IwGGXyiqt l6WWEIbj5nNwСR477,Еe/ \# j5DLfC=30W;=r V9N cp.Z@aym@% G]sX]2$yܹp8 ӨaBzMVp6^*:gOxކ^/IѨY|K՘-ɉ~oѣGM&o')JU՜$1 imTM*HϜ|8,x^׀|W!zDkkw933 b> *666a j}P+muuȈ҂0X,@ttabPv 7'|𨫪 ?Xr,/|Z4E#T-3 +kׇCnO&}}o5i0LVط$,\6_%W9!Y]kNN66tG[9]+d|ʿS?kZ3%ID>(b`4uؗmFF5_Kk?.ǂqB鵍oj?"& qA1AIv&_<" |3,H$z{{zt"[Ռڎj#[/Gu:]__M+++pn8p +h2 //-P▖0'J%@Ou-d2 ˵6??`hDQi,{t:M&`sk!M #u:XWWW- ;t806 A3C7͉K.y5n~àE<&]]]@ O&--- (P-Wj߽WUUߵrX OݾW]\P8!!c#ˢNFu:]{{;ϯeii:ꑜkٕLLښD& p-HR8d'ZΝ 3.l6l;Ĺh40L6[h{bX,DD{ΝY}]DX,i_ B?o㲢QT*!I6UBC$RP6]ֿ雯ꘞ( I>00%  LTt_78MQAdcw0"!= a qῬVς[8.DYknFpwDS߸)Ds5zf^c`C|Wf=!pf$PT'X`*fW]wXЬ_Vu8/۲"8~ f/qB-ÄLSR*8b*7B!s<:jZzu 8:<wؿcX88a4^jjVDRO.nDPjT00L>H6BqpdhR0aS2p煤&8@4Tͱ1׻In)D.婩)(Ɛrr5b!Lo`l6rY 3  FQ6Cڝw*l6l6$C }ޙq͠:tl1 ⲋ˗8.OOOkJ6,R V5fbq׮]k4X~?GFF=Qyu#䲦v>, CH$255;xT,˫:óJ2i6v'Zv$8ά8L.@:::d\BEY~x )rp8c }4>Tgϵ7XqaeD͍`œR IDAT;1mmmiFTJ#no h4:WM6} vޑݥR h%M&]v_p~~^:_F(J"G?|&v ~I$(vYS{cXRT*oo+BJE"c1XgDn_\u8^=qV}Pp$IUx癙XC(a5w@#í+:HR`g8E B*ާ}/<,8Y=BHEQVro}||\772[!W`;yD!J^/ =okk=MՖJ^:wGPt: F0 3$iyysE ^|Avz/(Ix<pAdY]_Ď^"r04͊|͡Phmm Dz .Nǡ9zl^^^ AZga~?b EnWe}}["8p ,,,K.\fyyyccc{{-|V Sm3ėbNM&S(U!LST.E(R(Jq0?KO?"j!@700`777~K x TArQViZ2yv`pf.MMoGT@}I]&)/qndjy4-XVG*D"|E 6=MдrO,*ӚD:h466XTðۯo};W_}+5u3+r9kkvM 5>^,niZ0icqSgrgn\]XyБo;9szݩi.kkkut [ 텿zOL=,˰-&<\=zoE*a՞k`Kv@OIܾ}RQwP) [$IoL&ӹs"[4C;Xg&4]ϟ??#PLRi!j S,ȲJzeTU=µ[CY-+?TBEUBPP냜 _)rgc~Qvx{{G&000eL\)LU` #J8sXsw,ds<s<B! ߿~~>vvu~Z[[={EBZ _"C0 \___gY¥ӊb&b8x#$twRx<0tZ+$EY-d34U;ㄦiX44-bxzP,Y#NW !So]rӯZl6Am|ˑ#G.\p2ڝ֨NӚ  q\3X;kNUSiԋ&6H`8$B !NNBz%$'jt"[$K#iFϞ]ˈ{}s_~Z{ ϟO1YUHyy$Rm,dE1%w|v_8\)i4D#®Z a8KH$qx=E2L!I$Qq %I8$Y#j擉[G#09EI0Q\|kyBS%DV` Q]RD:6*\uG7YW_ͦ4I ՂĖZC|0r$UW=O"8ydV3u<_E曳^8!IPKA>չ\L2y6ttvj}~o/\y,w?A444R)RQ<ﻹkbjnuر4L`{cٺݮѴހ$JA`EO)ST&jgaqqߘic^E'$%Q[XXZۭL_Q|6 <+S2)l[z?ѫ~EE 8Aj_뎎ghAqt?X^sM)J ͥi>aOݠ3e I9+8nO-/_c om}af|Ʈ9Ƕ~W*6m/N<0) .FDtuu:uS.G"t&}Lu6z*Ü={X,vuu]yBa_}vړLD7้ο?s縓'|毽1^xðW_}5vwwp"bkmm`<W(---{<~8؀zj퍍=pTbYV|FQ377@p8 RH Hf0Y[[u9xAh2t:@WWסCx UTIhյeeo,ˣ\ͽTZ-XjGguuuF#co%9zM&Ӻ e$Rd2A 4 ' \vm-LiP@=ټuVwԩRqD<FHX,& Vkka}b?~|rr\boH$ ]VsK?O᧟~zddZ PI@a̿Rgʡzww^^Y+Pq25P`gp> Iam$B#IZ 00 C$3/F#k&=!ڸ$aG N;ƻ~P߶ٻg#&kD;tΝDI H/oߌ0I ! *iᑕ/E`f>kRHlsW#?,_*.!$g4n2znUxk o&.t:BG uPZ_럓$vI~kDQ)&J%M+R\|½]b,GIeI( Syk@gbj-s~I$'k!4@^@d0[l=a$a[GilTh8F@oHorY3@,KJj6{<:zmmmrr[ɧƐ׷FUZZ!D"]KaBw8>O:Q2a&!ɄB*w/rCR :d2٬VqQO!WϧR8BnxKÇ$quuP)$!IC>}驩[m ,-,/,,߰aC[[$I333pEqff& \.*ieeell \V(pr͂ T*Jw^$GFF< `6:bT\.N *H$d ]7 . p8Cs]aXR^+EQ+ ‰'t:T{zp(]+++O=x 6nrBH`B'7mCe E "$n(AX<ud2Pe% ˯m'Iڱc%\t:cL&_9P&lOvww_|N3צ;$ ! q wm'Kp" l!J7SrR1I D Cb"E8Gh"RO\Z맳 |&tc]T}fMP/W_qMZ%IjhT*vIPaW]Ns\lVdZ׳#׿9FID\c6饥[׹Fś>U$ɲ,I$O]sW~,! C$IFF/^Plڴi֭dԩJbrnnIx5쬤7ƍ/>/-ÖcJHBz'[MKKV=ygrS1'pC .d[I$i0b'Hh4spTcV+߲٭0\>#iѱp.xCCC__띙>H^7 A&U$PyVN_p̙x9Hq}a磑aCC2k >2rS"!3RIa21>>rvmtw@'tuΌ7;WBH<vd۷oVUZǻs7ݲmqg!$#jP,N!zr&@h0`\)#O UK#CCCoƑ#GfA?-[8EP,B&TAr R-?BJ&Cj@wn{$CثaUjCh0$Ȳ'<F:cUw[@bBQ]./&VWWxggŒ{bi\b#Rvt^Z&Bj Bhmm?f￯N&c-_}j\RedNGx =>rDbQd0_~moO NK/_ltJZu_|1\V[Sy˲;"?FvǦ3B(I'{ֺ];{ŷQ5dI(!"Ҏm;٬VsMcZM aSN˥r"TJe4tod2g?'JK*bu 20:;;(0(T*sNc8;57e2eˁh2Qu][Nc&L=y(1A:r%TY6Z.6骫q>NN^, BE=AdZ KPZ v`q|-p\U;dnw{{;T:l6fn:00piP(DQ:HmnwXfy N $> E`hV`䆠ռ^8NP,//oPtev&Na Qt P `^]_*::: flBt:]SS𱁜 L:ԛL&' FN8>a Wa0X }t:UH$D R^X[[[\\]8nmmFD'.HӴl@`uu@-RںIMX IDATP( %f~_+zVuuM>LXƭbfjjjii H|h|>4lcPhS6.<;|#)|!TڢW*9/0cj<q|Æ `,y>IOVѿ9LP.6fd㟘R OoBVw^.2:Ϟ9sxccp"KKKp?uQ|,p1 @&4)i "{Zb)=!qʃGz]4KrddgVt25bV4ӛܻ)3:SO{&~`h Wg P䍍*]g~q x<fR)FDgo`0hZmoyǐBغu+r"c%bV3xd2$lNSTP(x`5V(4Z[[o833e=iZ8r9?YV^IunCp湹) Ѩ傥 Y*@0japݢ(b]07yh4 4MoݺUV+di+-..`MܧT az뭷`$!. |>KKK ӵ`m"R* |j0z{{@x6Hܲef? lE@=rTjhh(Hd2ܹsƍKK#j njBX,fEQTֺ?z8j|vv+jcضm2'h}K'N`;e{{{!^qPKԿ^DY )L&HAL&<σ `gr`@.K.k4M6A_.g2z< y^ _r9=j 84S%p8>)4j ǔ2$e~(h4XZ4 K݀^@/--M8bp8dh40ߴiSSSK/$IPBd,ؚZZZVVVjZX(!3sJЦMEqD HT*A!;+ uB*lp8 @fL&bhaA6L/:77f[l}ۀ|^upŃ7^p8@ N /EQ|+h\#n755r9?22^bw*ƮHWer2=118uk CCCKKKretS)f@}_XX7> >>X,Dz>~8xq1y%aL&o_ԣc\NBK &:d_^[;7YR**JEm[0lu[aXJXZ 13q@(;#Y$۴`1U*UW![.J0nz([\.b10iCLɓ P@b} J^gVGGV z>B 2, d BQ6vuu9 Jyvڗ ~*:J$ u(y t<#zpl=_x~w <=v?~(jlH/5c^8)rE IX)U*xEHiS"0L?N 3,QJZ$a zݷk++rirCW^ntro~m?Bb?xB( *v--IYԴ}qqquu_ySCBhOתO~9b/Jeȁ!T(2YN]; x׭M N4ljʽ9B|# ðMlM( A(+Ljiq}TRK37 W_Հb*1#].V*7"B+%ILJR"g6CQT*Чq4JMBǃPE**a4ra:;;<DZ:4Pgff /`\.BL<`ÇU*U?VA0 Z#GLLLXX,hrr0؄f`0Ӂl֐29CC}9gfwuo:/;*RZ[[8wttd2X,VbX.3ou24 Ȣ$)[:9%;(_nڴi˖-uy>N8p_ v.ˁ)v `0j2ywoJ-W*ܸbQ( 5773 dt:V(x<@WK5dz=[l'llF#N,{EN`n^W,//s! q R)^ȁ>ťZ~a@Ǡ1G9{[[[xn7([[[Һ Bw| o94%L{J8Va,ZTAGnrGZNP(499Y,9>un{ [ѨMp_( //,H*IQxDQqG6lx #s##F L>*I8X*d@!L&FcXXy) 8\ qvCP6d2IdT:uNK$X NsLnBr8T*W\qA?< okkK$jZV%Hr. >}W/Ov 94`>YcM,+ X]fgg%hSf[%_NLLL, Dffft,#KU(Otv uv:]Թ|>/4'R@ҋVUTz~iiIf{|xϱ\+14.A:77Waqr0W(go°M( Дi@Be:T.Kr9ԤhR{{{{zz|>?/={vmm [(HL&ay- ]vD"+++ $bSNO[T@ i &''(,R 23}HB< lZX#]Y%I`Tg;J:F^/PKZ]WyAz}Pt.,K.ꕉ x\.ZBf@bCx%!W)s١2lZ;X) }|[t|Y^u`pTvhS+V{sFZ  .!kx<72bﶾ7\._[?^Rܾ}[^_^ |'!lj sj)/eż |Je~~k')J!)Fnޗpdi[{{WD,K <_'_~S*WqVRyvpN_J C=|x\kcFQ"\OOZ]]D(o2^x<ɚ4y> (]Wq:P(Qx\.:;;1 \.N(X(Yq32Zs[k7}n#$Mt:^2 I0.ߪR  РT^eFҍGOLF]<bd<+.}btx !ɀP(4??ŀY(j$a_ _5ZFrss'AA-;n\ *>T,l Inoii?<9ݪ5rْ$hr8lӧOC%Qc|F]`^ l6 @`#'nXBPA' !W-p̮۷onnh4Mt:5>+H&''!P,g6Fc2,Pa,ڵkǎ C-@.(!%IBeۭ `5W)EO xv/qf }-a'l0m2/g%n4 lWyAqZ[[{{==»Yy$Blbqnl, ztǛZZZz=-F+W\ظh4g?I\>y|.g==C ", /%w\+J?*_h9D6ޕǐnUF)["|a0zչyw8ˍK7jQ]b ]9z,cZax~yuv!e4mPŎ[;:\.W4J0I.jUQJJ(,g'S;6#S'2"PzT4T Mr"x!T|XAٌMb ׏4 WkΙ 9*ۋ !d2$~R.3V߮hjFCyLf L&qK&^wGxFRB 5t:HzmTmh4R9@DRk&ժVdR(E"D"p*WT^ZZົak= |>l Àxj^p ###|2l```׮],˞:u E0cNҒd)@Fy$9HڀX@vT*@) ${Ezȗ>o 2́A.H`L3^ښ(ͨr[-WAgW'&*IjrbQ2rj5:Φ&o[qP/|vjjjtth$ꆮ.Qޔs"͋lx<*F~a*R'?I`!v놬Zɿ2fNNzĵ;IRT!d5 )C"Jhɭh l_{=kaA|~IJB>TKRC,v UڀJUEL*Ic=M;2Y(:]=U.ð#G>L4&@A$ (@Q$I^u R\`G& 7m '''aV;z[s( IDAT\2RR#q\dnIB GD(B&3B+W!4:ldO!Rry25ejuV/˾l12te2"=Iz(}܀p![avEXLs!j2[Ivw* qw*E$9NEBW12v)8!i\\BQbY͉hR_&kF !Z]cL6B&PdB7ydT*vw ÇRrA2sD*1Wlo,8,M:㲷$h>EO2h R˗2_:Y!1rgAQ@TRVT*lK'ƵZFihh0/hnncǎ%I`PpHe ݇to޼ yid:.Nؑ|qBaܫE]}g>30h(M 0)PSmT-#bPi 2q}>a@i4fCQ# -<#gkkkR|jj 8?t~9x-ij̡]8'k``@חJ%ӽК^OdJ/zmÒH0zB:!2H|[w_OMlTxXBaɤ\¯S:{ CC?ԥRduD  .` G6X'W\ x"9L1(sm†27$d|NŒ<t:$2bwm rUN$-*ud4&׿8ټټ`4ڙrE+2qwQr1D<ּZ TrQz\1>{BhzgiRRd~Tk{)u;nD/ļRjBU:~ _!E{V5L0^)T{,,t+:cI{:Qd2cfѿ))X,r!a4Fc4[ᯩI0ʏ%Nll6L&1 [XXJtT@!^nZs!h:$jtz_MMM (Ǐq\n0XхT*eXJ%U3 l6 gIE5z#x 9d29:: @B$IP( &!iD"x󁫱P( P:@kP^HZT(gBt<[,j Cf5^hA)ޮRa4{{{!hcK=w[T+\. ڒd*:yRmزSg[b`GU:/sCf * X%I/3 27@ HJ,J^S,;=KI+{{[| oFp/@xԎA<ݐʈ?Dd2$If4 7.}' ?_ʆU*U:طSl;zpbړ˕,ˢ@{;tZ{`ښ,moNQ:=c 8#nwjqɤ!۠'D д LiR(.B>yVWO$\Vd k4քz!{0L pW(A0!$ 79?l4G:AYVS9: ASTRV&E Io/IDHผbP4TŪatZ+Wեx9f$PT;}FQB3̑#E@RFm"~6J^cCkԑ#Vp”l6-e e'N3$r,r(1;;DDQ#Mӹ<v9dKl*rJFȕ] LLLvP(W#Z -,by 31gWZp\UU:ZOp+BL&Y 1ɤӵZ(~N\5#VTjQE=BJk5̌Zx7xf3{FoZMBM6egFGQ*AEeWWW= SAőjٌVJ6{]AZ Q8 |ݲ3l3h H:|hF§1qN[O`_HD(T($a*LӴl~ў@DQ@u ckfWSYI:VV8ZZZL&D2x|x`0W+â ֡zbQ&yަs+++P(*E!P.;N}L&[\\\\\\YYf8Qo,YvNGAi'h4J۟*!C)5!D~Ϟ=&S!hb*;֩1 6D"Xјdi(Z#T4h#"H4}ĉR/wm֕%vf E1HHruI6 l|Tjjj*_[͏UYe$a̕S4A 8ꆙ$InT#qyyʿ[Ly4jmƃ Xi*]ZP/߳ "rh%-R<\D$ z}^/c&\e؏6ak\.g8|bU+C{w^,N !TGDȋK! yZ3v?!/4N~ԾWU'Nҝ$$Ȧ 8:"8ʈ:(ln I t'^k߫NBy^<˧]]aX0*g-)'B(qI;/~Is ,K4'B?_<ӳ#$%~je0UUUy1S-uN))l g3~׭HVC/!8KW iÔwlO.z^2@ S`l%Q 5\yuEUQwb?YsnWךf&2 RjM-P8 /^j5l6f4\Um>lx_]ZNONv l|f$a&M^c2lFَ0 kll< rr3j&q\r ~ljb>Eg- 3g0̹s6ƙ_ MS$9=W roo_kJJ>\u]{]cJP+EY^^ ʻOz(5!DLM903xOcaj$*qWd")Jܼ֪^ T h┱ʮ5mY n@].wOO%):-o$$?EӠ9.vMkQ8㥒C$Q "[_p8wJnu:?PR Dv,/#R|IAM˲|eZ)JvUe|ci({JR6 sx.YY;ۯ^n>16W{<=[]ɓsK! KRe-l?ȍf3%!va *($Cj"ÎիW'j KJR"F966VZFDCCD"CCC,ڭV뫫;uT$ƍ^~efN@,z-ك _`. {@`09q1 O8nzzVV Z~AD'I[R),,,qx748ݮ!fzb0 ˬ(z;oۡS???oZ-ld2-OadX\.djoo?:Mo8Kh$YOa[aw$IrN\;1! ꘬F4zTblG}{~2 { M)8ES›qM2mLBq3 \DHV̕ߛfWۿ`noi)4_9CR5sAӠ^]v?wp핶.Q TUf]JCn( D&XZbYvn1̾AXD(xs}ii1[X#ߍB"RG㲬dӁ@sCyH[/ tZl[IbaݘVajEC۫B9ZmX\*JpCcfh'Oռ,|5sϑ$YsYyh080|f@ P* eUU}g2Ux&9抬LԒ*T#Tu;K&oі adA+3 LWU PmetOVMϛX6 ժ#uuNL4 u2"0(IJ>ULJ9i:r,y/`}qy<11Ad}}Z\\`0d(㸩)e=\.hIZ"(NMMb1Rrvi29!d'Iާ+Z\./..ӛa <~HK0d&u3DPUYF;~2\ME_yx: Ն9M(6)ǼZ5:1~M p䧲$9 _)Kl0MъW'&<OP|*U׾ЖxxtHEKFP60c4!9pX5˪DNdBc#\])xN1 IDAT nspȯ8 N=s 7xLFqf:K\._glχ/O 0%$xñw0CϋlFEU臮J fs5{"`2HutthZu82&/,,4d­B<WyWyIu\gTMTbrŜ_NCC|n6,֣%u8ec׵I5Kw B(a6=x\Q`Jv;eY& vUTfff&x޹z1Ld?>~l:*ߑ儦A㤷@8ծҴOW $esP(̼Q`T6 w@g/"ąl6eAd m;x$~렎O$^dp`;˲3jbtwwC#"|ڜN'ķBr1*uO H0 fFPZ6e2\.d"ן>}znn.RF%IEs@J{ EsCVv=64 FYǡbppy˲߆ s(kqpt]QFn߸&rM X= *.A@I bRIYòY0LP`Oxykit,-F[N$hQ.xZKGŢp")(B*1}~X.+_57/,E+3338{=/ (IۖtvZ zes}E!M[nvƖԡ61DEqߒFabuFC>/ft8$᪪\h^XlmӻtxL7r~5ASO f}>_MRЯ4O3c~xia8wo,jmmsg3W_x>0b6ya?=ݾg*nBð+<}bZU=ϲ,CHe]כlٲy c0c~kʊx`Z-e"89Oxk(ԷoHi,KKy_Ojj\*mr{zzJg?)BV*?۱U ?&L qnww((]@_p\udI =EA ]{UW*eEQ1sluVh:I5'+|PPX,$IFIIjfj\]^=CC Sn7tq?H@@0 yxxELAb8Kҹs :$fb|Rq(ǭYu߾}H$ày? pB`Dz80>}d~aX b^YYq:\(lt8bjBgTZ^^VbtP---4⠪B;px```jj ~]y0 JݻwC d6`fmܸeH$ ]4.1byFjltt<44pL&i0(XHfz8& W< OLLd2xBhZ__ah*uX,ja`,04:P"i0L!űj5h2A[nx<˧N~3} Bt{\y[>`}`0X=XN.Bbm}\޽fYZ>xPH$ B麮g,B(կsr6=JBBYJDd25ZUIVG1bo*G,!QUiXfnWasOQK(֋~DM8ݳX(Qz#KwuTڼYx;0R>|XS33ӹ\kvw ie\,^ bƎgFD[{n[;.Р℺oo3c UU޽$IB‰o5q*&>y&U~O]ݚrn~YUUCȰZӓӉ7[?"\{?烟t{Iyؒ$bjUV}LjtC򥽗wn>i<(ʟV\Tvul4tmdıTT1R, Lr*js r##\ $A0#hk{j=5M43äVV)Mj_YYq-.۳ٽv,Ά̪U5!u|LGL&b2xjpss3, 8p=@P\.N<$r:e٦NQH$@>v0 t { _b-,,WYvbA hmm YE ^o(l@z ff*7$txLb|>GT*4Mh4 %Kl!T0 ˵eEQfff ֭[3,+YD.{C2TWNdžp~ /#֥|.7==FTlvvv[O. -_xyJOds3Ūq˥8&J勂(zffǍ91ҹvj!rf}ͪ UοSbq] $z,fXH6fZ/籢7Qү6̲lkk=˚X3"cpQW9֮ Inhv_{Mk_M&ey,y3oiT罧 .(ZVuuu<_]=rUGׯ+e6 ,n4-*bj|[HG{ݛ@wwO&h:|ۮSV뤦i6TS |>` >07J,mSՖΜ93NNy9ZcRN3鴁/߁'Es8ɤzo_&##O>IYU}3L5-pH&SP^>ag2^ܒLkڗ(*MLLRc<e dt=P|>y H$)}>h{E~<Z^^.09i$`ZrV+hC .ҤEq8mmmST4b뿆uO6K(TѯGht$d2 U500h4jM\(>Dv׷! ֭bi(*\p8ƮC2Ъ7o޼xСh( Al$ ` t#gϞ/ 8oܸOhVʆeT*z5Pyuuuر#8p`aaAӴp8~zIVUyHI99Sjh?HY0 I$0Θ@^^^jw:`&IЕqNZZVgΜI&^w``bhl|Y[ZZ`4qoii)#-`OD@޽ޚd{{mۖy馛Qĉ AdYc6  `xxq4;׾aÆ͛aVCu$;i3pM/jbOS2 *'HC(?!dw$I(2`0JEl7JV*ek/Z|,8t=gYvۭ۬ͻq`M,i{݉;p>2;֋09NÉe {BG?uݏҸ#OtfZ@mlB"'$I1\5YV[Hӷ;{޽EgDI"|~߶LLj5vR}\Oy<KJߺ\"TM#IQ7Tu8᷏$Q(R6t:lX$_d""G^ lnCӁ^7U%I߭nGIٳx<$OV<{0oqCfֽ066V]qS#/xe~kP\d+ @ '&&xz0,Ε$CT*B"a +UUpË@~(/9 B[lD"@1LZUerrrnnNUUٜPr:qZ;QaGjixcT*ùgjM&T~!n @-iycptүKߐ!P[[[}}=`?2SE@4Lmmm I$ 8l6E^5cNahŦ`u eXtr BbvT0,ˀq:@T ú:n傒nz6:;;c@v)pwyuA)n9/bEBEjjٜN'(7l0===99f#ARh,+̱r\>_YY4 333tyӴVT<0;~ /L&S&9}a_(T\#PO ?8!κ\.j$fj@(̌6>~%_+ k)H$x[[Z nQRhȂ+s!;Z"mPEi21T"Khj^prVtW6Miṅz2;;;-ˢ ^Ńp($w&|>07ieRTI{<9 |Pȋφ7jB (F. fgSӖ8A(S8GV+56]N*fN1Ʋ:7O ʞ.ҥUaztBR,Vr:۶]؜ CROUx!5mOu$(JfjڻW$]G^ojZծlİ:+Jx>r)Y,7K(5jo qÙ4M_*IOBP(d7;wse IaΒa8ΛZ|?- ,`UNK.  Phaa02566gF$MD N:iZ[[qJennDJkx@ t:-"T*gλb <EwknNGH'FGGc@b34!, *muttx>jsss<ORi7|yW* 0oD"0S(Jl6zCC_Ξ=dbx$I]Tch4 FX,~f`u k֬YXXHRՁ#K>( RӧxH$._[{>>22U IEQbؼteo:vY jCSNA`iμza GJ%&7E4s#1vl>ER3*˲+Ғ=J.R L]Vo۟VkˢZ͝JY![/}]$M֮{yrC-({B1-"IR,~.66lH+Qa ao#I^7w]_@B0I<_1 C%1,Z.SETVµZ-м PZX/_m.atM34ãgpmߎ_)㥒V!0e%IjnnvO0Twx@Gr+d^MUuã~ټ7CHtDKK R pMREu:I+m0okҢ(Ut5eJgd}1m8?DDMcuq+7Wt{6o޼iӦ%ñvkvppرc.Ϗ 4,& ܆tPB%i UGKKUW] -NC剉 8 v={Hh4Jmڴieeѣp{lXF@eN'0CCC0 ,ax<` $InZOfajiiq|ffyPm8 T4).j]3\֥R) )hmA䠆vP8J|!vB8 4ToN]O?35?C,2c&r9J9sfll k3_ zf$ʁ@$IV*ѣb(?/W~Kϝ<~``zwc([LJϝ{3ReYgYvŅ>|n潯v*[2Evݰ;;ET*E8Vw&.™əK:=Ln8ѫ^@''ylq,L/*>}v650p?fz]a>峿]YqKV \*DRPN4|I>;8*2 T:^_%ׯoavxȑ驩;FF6G>U]>/ p8x&&-.RsX@tGGaj9999kiix<0Dl޽{U!9 uttâ8Iq\gg'P!J~2OUip5]Q0R1L O?<~ӯyA֑h8q)4[ tldYP IDATgLӅ$BWQ C4\BhF8f 4V ܖ{T<+k'eoulF}y7Ei'96Bъa돞zntlK0! ?jyYOëIU0LΗGG (@@PXꙑFCTǃP]nxxxrr4?g'k~ٻ2ST:pT*]f'x !T(7bZiVc qh8р ={B+QAfffmI~?8boooV+±$IUuvv'O諵p4669s$Oa'N@*r0 H$7iP BFPZ( Ǒ$ a@f]\+\Cf f\}']WVV@p8vՉ"@\.@RCtv}.åGuM/JleYxjء^-xI#5*U[kF 9F㪫{axxU{{9[[ pvwwC9{!͒7ت_r r9tq\VjjZw8/|kXvEӂ voB#NOK?'IǛ_/“84HJ:^q|㒪nil({z|]hP$Kccc G;˲"q Qp>Cul6nݺl6+⢠L{ @$61uU{ d.榖;vr'Wiu)&IneLyHszٙBWmH#w[n!!-↡k:cku]UL6J |k2va@X|0!z1?^0 c%VànlVoƃzxEX-鎶c'O1UAGL#}MU|#6rctG1X.r R5MT^x1 " 8!d|c(ctt0}$Uď5@!QcÆ pxzz0"|5w,,,NrEQ`B ?ϟyrz^> ܜ㙝-a $455NNNBGWtbÎr1,삜<<Xy>>>8ׯZٳ`ܸqURŐ"ȋ:}]],p؇@a 5tGGի ˲[n-d2WBOZ$IՁMGyѣ$A0@@q|{̓19|$`̰:k"L`PZ0j Æ>t8Bb~E\R$ıGix뭵/<`n8..H$b6!7K=DQ5nV$iqǁ@(:rJC].P_?@j5j5ᮾEPU ӻOdiiRYHcBo6tu" bqi7?>.HwĚb-z:|;4?3E8U]k2ثX^L7@}M$AM]7Ts`۽w&Ur[[ۧ=KۡCxgBT_S}ّ6;[},ɀa0rm6@Z388E5l6냃CD6O2+װc8v3 F6Ԅ ttv8<}xJ ":aݸضmrya)@ `1 -be0.n~S>IatBF+2T Aڛ| !;Vuo_z%aUMrvDZQ Ð}4|}p[q5J<_؋.®v=FȕmaO?Bhp3t2.6L,pI7 fZ[>f,R)_tmc ?.aB󤷷$g(/an?^³uy[joB#͉\!Ȳ, I$4 /lnn$)L)rMiÊjzOpGAR)ɸu׋X( dW^O$ ۰!Y'~{gJ:\>OPei?x!T^wujAaUWu$B8`?@[fM"=uӧavd }W bT*2P(@f͚3g@eBJtvv~{WLOO99G5Mvl:rJRcpR%dY( lWoO$G;0̮]vڅ T ԠtP ǿO9[b1˲[w'BܹsJw.^_Gt"^^겜4Mh?9A2kn8N'欫"71~7>44T,rT/ *B 0 ]xnhlLd2Bv$nO BB0!G~xOgCϼfEZsUOϺuh~F)`Ry>ζmo?^T 74Xyj6oW-.Q7oIzp֭ʒT_}tCVpdH,hσBRԸ_q_CiahVtuu?H:tðP(i<>wfepO7tl+U. e ^fvd%t5]#0 ZC6@z7n()7}FUS ÈenƅSy+waHE  `ȡ:2 Kv/b6$uQ# 2a8NlgȚn˺#C[7t p TD(a=#D %B9ipaNa;72"piu]TUQ#\ $ia$sHFS3JOs"BA <_)VO<3e٠,/$ 7neb,$d2E  |d>>go/xl_2( dEQ*Z!*| C'ΟS1`2ͭGUJ$2JIb*nܝ!e)jo>%]*'&-%̣Ɖ_Ykt/gEhzX8v }&ML5ֵvwRP(<33#$|8c;d9A6F tz4M?lg$awÁJճgSS%]!%+S_¤a=f>u Ff#v; d`Y^X,t:X* Q+f4j 뾁aX>߂bpRx<>WSz]YY..tCRԦMNgTJOO~XW6 rt:Ԑ2Ʌ;ҕ͢(ʊܥ !F.VyD]ީ~B}ad @h4V*D<^l4j_J&I?2d ðZ8~|S|zeЯ"`fZxW˂\.OQPsL Alt~;_*W~&O?%m菓GJ5Yv`7tVW?r:>r謿}x˧wni?-ju\$ \ҸΌDܣ<* N, .dWpG 9}:SOuch4$yqY"{V k<ҘL>,ՕzY0l857[y^UėqfVxl_ riZom뀩1KZy6ղ+of@ m_ۭ/J>$WW 3[nh4?>… HKKr@ѩ[U*R(Lْlk8r5$It`xktT|0 6m|Rmllӊ,懐-.+ZNvi٬_\XPjjzNŦ[X!$Cա?[l6d B׿ aUf%FD\|d~[XeY œ}PB+ ]r?T/z!\R8q"n۶Vn5nh,LSSS y0 ۘ5$oU51_WVlw.op8 Ni_0Obm =vǶg^楟JСw$~ʧ?βlTKReEQTȖY*ʊ_jua{zoa*RQ%+ k6c|{BẺַ#g~+MFjMVk3/HV:=ʡ3/yq/Ng2VR(OZEm˒PҦjSS̾1x&׹]o8!| XmvRwPb 塇yY6l韰_V^|h% l:|#G&رcccczm6`0hL2){f`DmbYݑ~1 &$)Vwqhu~hRXg'O*URi6]/P0rpXf2F Ͻ*IcO5jQz{;~Kk-L6Z s8?Z\~WGJ0W~дg2uĆSFqMWlW>l6EAȻ/ݑDV%Yv^%`CMO@E9YnɠVZT(d"M{;:vy饗?49N1 ˩Tv;N^Ho:7WZ1 f]]_) q,@h$qBÔz{z@)0F}_chTTs,Kr.S1L`FF#ppizmm Gk r:nfffzzeYPTH$rIfZWVVΝ;r`q1N= BVt:=66)P  x<[lٰa.\p9 {=>tG{{;X `D@X,hR#ċH$z^/@>J6,zjj*.+Jp8qBAD":vVeya 2 TUJ;O͋ J,®ՕŢm睆J%PQ8 IDAT|=ACVTn[gWb璈$Iz 6\zxzz:덁pɅ]h +Yݢ}'OVMr8A|#$wТ,3LG'NXokk1 ~ŎsOjӦSy Fl(. z=f8rds{;chS!Q۷3f8ΞlNz7}dBeQcQ+rfp`0%ÇO;r:*zCϱ,J ޻hs`0jXM˲,gRq&T^  ev횘x3uQc1l6[E(|TuVg__ߺunuӟ^dǵdYz G0(r U36qK{{%\eq&@OHr>ei"I}>rݜ$xRKd0ζyTu*OQ5 ]nVr:RRժ$o_q{o^x+%$I?}%"m{{ۺuV^8[w9>>/#?r!7$Iq+yIEFc6].Woo}'O^GsslvNYVM$ôZ-Cvv~R9uT:@Sd)I:-I;;-q./]D`"Ny'8' AaF]!:nw<Msd2SzrqBE`S*ADA|ů'6 !Db ?|RhW#Q]搢NhQ0}fEd= ~<߹8vfzzĞ[dnݦ/ T$UHSJ"|=uEh- 7H$ Sp|,[w zɓUz_$4hv_OvuMb&С N-j\i%6j5{yP4lv6~*EQwߚj EEѥӝ{:?55TWL[V]eY:TDF#&#;5M\! Hɤx[_LD çSE*ٲ+ ާ٬(?;W=@ lڀ9/|$E"R)$IKqH ܹ?FqZfZ~?pۻwѣGO> djhV j)1iӦL&z@Ե. *,bYEX[[{nJdZ\\jf3ɀ,:q8t:FS**xM\|>V Ab˲&DP\2U#V 4]. lf ks\i*Bx jаX,Bw!!udzq29~-[L& X*(2 IP10 q,x 1˲ P͘>[lťæ ]b1)d2`_3 b/PamG~zG oyT]'.{lx}??33w.-~ o~ki]6}Rd,Vo?h;B)<ʫ]-R#DyeX"|]5VA 2"k).6YiܱYVZAv;)7~EI`ߞNf{47Վ( Ճ UZd4[w6W*e0ejU|^|Ju;n/ͮ]X#I8&9:ZPF\%|"JOM艧4ؾSnp[n8orLXXqZU8?IMg#յMt-&ʎ 3Vݰn:
tONhNE$R%v h|r]֥*:φBi+_"o46n,j*Ubaeٳ@j0LFQeG68;юW_M| KKK&B \8Bo0fZ&4( (vCO 9hAQC6& @`ABZ.//C )$ImQS6ZuzE3P(JE"n)MOO9r$JgΜ&ع98ao*PvU*UT:{,/K/4 V*jP\.z8{uubmz L&&sh(U*;v ߍF60#X, `0(D)r9$a'+#c觠X,X,Nggg`'0u$mD, u .-//4m4ǒHT#\. XZZ(Sqi*]hmտXAl6Ȅ($IbO,2 X\.~1;z>{ii?Tn]BZ͑Ljuot<(JRQtvvv,//~ EElNMOO^dXp߽gA5kg޺|Vb"M$X[Xjtnñ7.h2Q$)$%ui rBZ%9Qr{\*+<>r?NWZ-m B47YOQ&) ~ӲT^7{=ӎf3:thyk\6HD|E/tGsFcjMӿ077vhiyy+61\f*KQZ_e͓aI~+RJbXl[lyam0½snyc1B6#=rI/JRi4eۺ}kb-57]j }V Քbц8.Z%nmڵ믇j㛛6pzR[$i4RiT:lWLZN|2Aqv2fP'AiˮtuU*[pJQ^($nİ]o!Y2̊,/rjbl!塡iV{Ν±bL$IjQ\N$`d20@/z=5@nðD"i hDG<{^Hp8` ð3gΔeǣѨV9d u #nϳ\CP*R5X.UUNH~`f!<<K8s $JάW31[p.Y2je!XB҂XZ!G"#-CjjNgZf]0^oGGMiX @h^V%Iahep 8p!" A|p8jHxaĮAeY^\\lZ\ Lfff! lN3Z-J@>pJƚViB3N6ܹ\~ۅ p H} |8n/sBt4=<<\냙dt&(7V+ٿ.i#}2+!,d2R3?,хR|=TMBaA,vu JFr{ո喧B%@5WV:;;=>x5)ut^45iz`@ DBa;}YS!hկjuNY]s{FQY)ƒKxwH46~a :ZU'<.fDPEMKg;ЀscJ[6sڳ.f6891_#Ёۜ<^核Oh4^o,χ+/lj)B}(\M4֕J&4|j[gM8Z3 (jՖL&Ip8( 1u}n p(Rp!I%X̙3`w:Lo䮝]C퐼rjqjiABLA$LEKMi!4:8:EULPʼn B*$?RJsf ɤ`(X ٵKʗ %&(HUj6jk^x-.բ:ID2TP@f\h4M8K}90PP(hZQnWVV(bW*ӫj`ds+ }0m۶sH$p8 {UMNNJD"J2L:πi _9^*A3j ٳ!ead!'b1BD(Z\\x!i< CyY, {~6j5a|< aJ~ؽ XT^j5g\/~+nu:&x`{9zaR^c0/ϝc *ZV;;;wܙH$cjou+9f~J26Hz=_ѓ'Н7 KEQ_W$R\îo8Z-kqbu^;zr8vvIr2rCol={67`FS)^rfV1ёhEJ2:wNm[l62[,%I5 o4%i0af32>$qę]>ߦ(ʶm C&jJ% 5షd+:IqHF|n2R)݇N J_gxA8hȰ, :}wOoҗF֭K#lIFc-UI^>{`Չ!l28||$^.ocrh6eIR7Z 6 H>w?>:RYo8łLf^/p7ֶ6Ho'ϟw^e0UB+$jB i] doeqÆ'x'+#AhX0=2i0pMMNvuz߷0bڵ Z ^v><l6L݂d#^v< Xޤh0QThN%8W1V1~mkݬY=#s||?>Rl6[8ooRV ݱGlf{{ܹsfӦ K"Iݍ$|%Ugt}մZ\..w=r oQt:Fw:&~IozR)[-UG8y!AvwÏn9P)hl\R_qݾ}7 5պ*!$?x9ƴKٳg+J YmZ#1s=YեHDH@HBjqBfmi# qlX{sN@Xe~l]ߢh6 J233X ͫ-MK !F8BMf梑+d|/BHdvSԅa8dxn2jʯh6l`RYj̢ tŲfi4Mz' bZٜ%(o(Jj kjS,"аNgpݦڱc}GGJ]t,;==m0` 1s \hGGBv{<iZHdҵ?.ywzWlfBD"qi^jJ H0Z\.#@ E6|T*d2 {ٳj5x^x, ;^ `KzzzJAG}!0Gggg<'+K,6yww7ȋa&lhd̋Bgk7ojc۩jM&li:lnRZRO#ҏXevN -#[\'"%$VD_x_.%# IDAT$ Yz<%̌)ϋO[O{mۯ(*g2J2)+A4m+7lP:q R:~uIbω湹n[7ann{yVRXf8By<Qij~_FY-Q'fŒ-'L%N.Gf VKU?DgW1v+L^vsBzš/ !'*mm .h yrɤR(/a)%oL~m~bG.\X-|,0fY~SxM_...r읝VjEх q8cu֕J%hkj V/Nk+%QEZtJҕ$ Uk$a8-՚ޠ$'_VQ2'BOˌZQT)xCMS8 FRx;:1Roݺubb,nJ"IҖ-[F>aH^_ \~F`CjLK۰a0nI#INSeee7ro0j SUn^:O0l!QL&x;%LNsƍ{'(`$IAM Pg$)HTUy([!/z jdTbfzzԩSX 5^7NA-5/4-"Dw4Pif۷k=|0<cƍ: FHT_ZZLVvAlfi6T;;(*F[V}>8{nuI$Ira!Zvc-B--P.L!'7oPdas *Z-jCjh J,;{lVC!'Bi?fؔ^#ǕNn/iM$_)`Y{d*`Z mskCQ(@Q@6رVog2U[kpqqIz-Xðg5vol6<\0V*WRE=eSx60 r8c@ pX&x@H FQ*$Iڸqc__/ abL@nPj~!4ЉX.1T6hI*R7FfsV]O鯸jFc%*"yIJ1ZX,69Fpzkƨ.h3MB@kD\+$s"d\+5I5Vetw,5?u\F?%_ 8bKZMݰN)L&(GŢlGggg&.t@t>ndrPSxQHl}׺㸬!F'ͿfZFf Uu]r*X7{p˖SS!(dtT/e80 7cGP^F(VW1L8,$p8TJ%&& p'`),ˊ}(hoogG2 FL ZT]7 Zv1#1 òl&U("NjU|ZcakULjZVo !&QR-5)24RHD j# k.KFr Xq:89k)u~ۻzϕ{}k .%%ZV#zۆ~Aī-}P,E9oROJeC~OPvvTǓ Zυd$AF8Nf˺!$)Z5[+hFY F}b5O!nT_)\ `uu\.b1/!7`5NLL:tq2Yg0,9s%'ГHv{ooo8n4 s aR) @ARA ˓FٶmہFFFRx28VXlzz6eroN{[olWD"H$80bq˖-Vuiib@Feyee4`+Ð(s,@W- .nfI |m~dZ-]B,SԞ={X &+P1\qWgiPخ.Wg /8M&py>w.̊|驧*Gԏ+n<34,--ơt:m4u:]\;FŢ}h(Ct:!ih0qAQ",VKyc(čLKP(Vwͺ>K_NN m ˞Rd6z.Zdȭ* W@%hKnfmB#bb˫U|)5&t,?\,Wyʒxj4(ʺZ#J7R>LhIa _=5ej5Z>۝NGGG ύ^oOO͛8aF( .h4vjHX?ȏ 9… l5g`CkƟ ^P!MMII)FQժ>km.]E%" (V"Il4&n4 |$n7#h8ďci7(FC#fQTA( eenP&,H&g "s=Tdn3 foYŏh%8л-\.?g.Z071㳮5j>Pv:ݤLEdA`XBDAr2^SQ=AY'78 RG"H*'ѣv jzASBQ@jTʯ`R0(52/MJ:v֯_s u;fdwlP(eXNt4pi BKQ!CP(@&4 e69_?@2Nx<~…Zv]/+贙wKX~p Wj#k~Tn1 1Lfmm-5럸_ gjr\JFn7 $i>dSEQryaa!NCKkX{Gm#B8 ~r slN$I:mUQu]]UNk5p8?':r:ZwR ޴1 ѶV+x'50˷ӝs9& X,V.KEᚫ2i#4bwjy"oPuOu[S;E)x.Cᆳ}~^~UJ`^4*!GK,?u824d0 3 l6[R,4&-@7ŏ'8B0F^OhÙښ(U څB Badg6۾Bֶk.[Z=9KnG~vgffVݹs]Ο??55DdYZa5CZ=ܹFh9~M2NzBKKT&qtz `3xsLpZVrAo "QzVH&NbO_y2)jrl#w{Klb:.NSԌY7VWSq|yyX,T*lool:]-OtZ"9#ˊah$U6Ml6K*;fQTl6[<ÑWıjVCd3Kh4bPaYʛ/O"-"Uaw,gzwv"ǓOi#|LT3gvN|>ne9DI1DZ=>X>wX,6i:%u83>OW69j*VFV7%|lݽdBWZw{v~*ˑH$]\>bsc)$\:zba tY[:\[JIĵT<9J3<Α +[2Iʲ ϞǗ[2 #Bڬ3?%* dnTF Fs1V]F:̱Jv:v($!iks'rT.:9C抹p;tqR<) l6 v˵9 fZMx߽{zQIVsoظmSBBB8)H N r@HBJ0 ,[M=˘{%h]ZyO,˞KÆ0v2χLZd}3Z\.RMh 2< UX66?))Zg=Ţl6[(4\6eva?Ab }h4HO{AGӘFIRo}^q"1:ݬ#^DBwjU)^cBV\ѓCfB7\Y P'CƩKp(hThGTdBXk+B(R1R(U?{^̈QFy~TXMUq)-fF d@ ck+.ʕ$$Bgf3i[bw~;`0 j5x:::F#Y<4BH!89.ƣ+D"baѸl2$I$@[[8 S4M;&`/J$/y&`ϮV$IbJ6* pa ,JZںfQJ{\SSeYVնׯߨj BkkHzŇzγ^$)UiVdr",Z-;*|GsWnh4p^CT!MSQfw[*fm{`%v]FUF2`{7,cUQ&od2#zTT- 0ZY!ʩD%Ჴ8 '˳9].!_KZ)TYq5hz54|88;I3k0龚'}s܈PB'ե !t!RUA_G%J D;6$ (QxSAXu x;:rDZEq-x^gR*.v FK/i:ٹ,˖Ke93o2͸]GhBz$pkxE9>2,2ZqzD>>T{^d;ZoCZmh<חƇd ,; *l ǡV9lexzW,b$.Z.\)H%SOmcZ];v -YcX<( ZI#?& 83l d ǙVlVjA2ќT_Lb Ibv_YVp(J(O+ assݎJVkI$mf;y>k4 =, dR},j'~+\B}L|Ϟ^_1(ovRE bV@r bɋzӦUkV7z$Il]]]zTDSg@GkS)h4/nxwQiiidBSS_|iQ;voxd~$hAČvZ)k)p!qڹVK!hNZ-'dz,_ E~9h9sƢ_Bv$j-i(fBjq1ovfhGb!T !dF@vIzYz~V[rF$s\( ao&)jfpoBE]lGV*Ͷ|rb1755b1tk~~>L.\K&###BEZnjj0  o6dRVs\,B؂ynn^̘kt:'''I}nnlJ%Ir|wʕz}rr@Xl$ zLV.MZPA;??Odj.ۃSk/䒃Bh+X G5kkٛh7Z5VL|"WַnrêءC C,S7 Qf֦W;VmMPHeIL%$.)Q\#=Gfn177֬z|ZBV Id99yqk~Ӧ8Pf㬻k)ֶ4BN(wI4mvCH#šSDh-7vݒ]lK`Pe.7ṄLVł8u}nQE8.Z,f"ôzg^ԖX&͋*:ǦFҙl\gMUNsb1xB G\oD!N iu05STSU -Cg&bX5S6-n_Lt:HKsjR $՚+RP6w^@pn.0;ֵ 8NvfOΗJjI0f)q:Uk}Fd6|Z { XIz:::d{/>&c\&iv ~f%I/CHp>FܧXh(zDla(qѪqҾCSԒ+.0Lo]p8Cr>͊NgMbk9 IDATmwSf[9ts&pf2#UM,fJ$͸=!)D97":y^":LQNZk5d2) NgY\6H kҾh\xe O˕ E`0Ԙ"sAwwMf$("kgf*F[fM9\hhd\Eޓ8Ae0q:pl6Q] yEEADH|[LFc(7Ny0\sʕ J`vÑfV;;;206lizffX,sUnw8 X,.|+| BCܩVv^Je``0R$¢EG$!sX|$I áPf1R~VfZV*Mc B(AP|8DM]؎0 mmmF:,BŢ[@r`Mr)LuuuŊ;igaz- L*LN [1ϩJrp~_jQ( +)j&WLo8 nÑD>밢TTS\0`3>ԏ=V&Ip P^PQ?hmݖ:vX6oe|mk>GoC9VKT(ƶ K%G.9Y LlUKDAPa¿-#$I44?{>YUE1&LLLIi"yu ~Z*),K 1~DPuZf0./k뭆:$i%xXX, èftl\---KV{jj%boYRzssssG[r2leViO &,˕#/h4úx|&WLxm?spyb䮄FxQRE" `pWBVVel~j&RbBx<͛7o EC{{{.gx ;oHɔĩ֯_OԌ889z]F͚Z_|'Nk,QJѣD^nR0\~_~;׋g([#mçO\y%B(o9306Kd@_~EdYB~JygILSEKY!EdJu;4]Y'j 3Fut1w?ҵ\ny 4-_S&82`gvj5={e ɯ>ȕDQ4͎ivllb1QIG0'IVQTCwF^I"@Z\a8$x.IrY7<\ydΖJ'YQkMuhZ GfDooI%mF'&&b um6oܻIRVpw$Iމ ,>#C#EAt:M4tTboD. p].ײewXR)r'9Fcu~0BLv@)nG yhy]K,ɍ3n_T*)ro-uSk,3o&ye]vx;'Bk\,a龳5;1Pf~yKAI/dDXTh$P]Z*s:Vxr̜pw0U1Qv\.Y@vkv tfPbb^Gs!`b1pvI>h4Jhhppl6t\.D9SՐ;v0L^T*aATCKv @8`شi̩S@_(BIj횧yJqEUjGٹOl6B*9xcv(%8&QxsHRv+:b?$I&iݩp rR$AL=JVo@b4McN`PPU5L] _eH)ar{CN20aʑO§PB'N7Zy,jDc5[naEu(pjz۶Km֘y,:VDQRwV 9 ](Fy2jƓ4wǽ-`e/הimWWWgEG/JRpZAn800 Vg _nY׷X<7>s^ $Ҍ&eYH蛍Xe4Sf{ߌ=;*Fi,EF qdw Y{ѣGrUzO#6-j4ؑ]2'MJ|,T*fQTLZ4!f0􇧋BDKgYۭt+3m)58\e /TUp8iժB&;w|[J&1xuT!~|!/I ů[aHENJj\zIvn.qnndz3hTWӢH*ia(]hcOO6aK,vA7487;3$bwxn*ElV(ymjzMbaӦ-J(,K?i- b?yX՘?"[/-<P[`NgQ 'J%ux! {SSS>=̥kb)yO8A0tZɯ7n FFFc{@샣5\?CB$'}фaؙ3g(-ybX=2qF |5(IVy"E(j64`,ULZZZ͜_#A׃FQZo>S>6 Kh>Syޅ Z[}h?]ӧ;3ZVE"`+ԉGL6Dڠ$Ʉ"; aM$&iժU 8 w r.;;;wvFߟH$DQfWs:fYl6 r_r%;vyh^^A"x@ @D4`Bm  FK+Wp Fɓg`w;K?5oX{4v Q׫T*Lg~Z[lnnRw˗ü<ϷL&#Vmnn܅Ev\.08/}㸉 X@h4 1b8>>.ŋ1 æ+0Ā1&]A1T925ښEQx}ʲWÇ%KlܸQ'ڵbpDz''h(CSXedI$o݁>٬2B4\ؓScӓS =k\^qNg5_x͕gwv/"|??zRB?Ⰽj5(@n><8^%t$BkvFjZR-VTE>Q@ ,dͺ512A>= ^_-n,R<UycE',Ʌj/؞lu)(EklGokؽUJMҩٙY깤g}y\#]|cDžz]9uJKÐ$I}uu7kmi7=rLÿԲ/v7<.͓k*3*x,wR/L e~H$ub%+qf&=4>x!$!h5j_JbbD[OsG7ux'dOeW*޾>b`P؆*2r9n@Hk4d”17(u98IYY18NP=LsM wm8F7EgzzZeXTimj$988X OQ@(aeϹ.;::\.`gK4M6fUQA8ynիU*lz= |4V- obbBϗda5R==XNh..#`R7T8FqAekf e! Tg3330, Ȕ+[׮Ô}''&&:a\d\Ko\ON8U^o"fkhhH$t:3F###Db~~^VP(@20Vuҥ---R>\`c0 d2cYV ئG(hr 0p8D A=:: 2S Zt:E .N$I|W0,LKX ^D%ɔEQp8t:f^D"zg;)-[yAq( ۍaX$Y_J%vŊ#.B|]#?s\F>, /ԙbG&?3Bȸb%K֭]SaP`jj<_( #b!NV6tΖ >PKEZ-S 9z !ܳ!I$wf7pvbh!uv$ Mӗw%)赸 ۜfcXWWW{{P4Z+g28Xab) ===@ȑ#4MfT*x<@ `6YUZ08+sA8x`\m!Il/>Nsmmmf``Z a6;[Rp"H/Zex7 6Mk[~ϩ5?4G5kdD MoVdZt#ղǨ>GuN'x)^}SObz~QV)O,L_ .p Z#G`](z=|!`qal6[T<$-`Zzf|Нihii9;Gh-dB!g_EKQ"Lsǟ&y#!KǑ'oVsB }l6[{څ:EQd`U=OYWِRx ŠE9z4{mW_AF(O3|L&rp8>_oEY' kD H{kro6_)$l6;77'IR(T(.}][NԟbP&' d֟R(Q$Y%~we[JLVwcheY8 ΤK)kSG]ؤ9tNqc~~~jjj q'2Jt֭ L 'T6rU@D IDAT\ND;4MðzgG[[힝DV|>y %Kx^A^q6+*H_* kpp(d`'N4i!I NVJ&hqE4$Ƃ9^p8M&S8Oi9!k~,y<; hL(Yh% 0rU~R%gG&IR{vwv9BT[voڴ $0|G2vljo`u>3sŊtzbb"Y6fodRH{Gljoooiiݽ{7t*QiN!NA,ª v F1B5r@2j*yE{{Nf0 W` yxcNl>97W(-[MA074. I;::@fZC.SZ[۶aGBҲ|d2 #VJx[Øu .v5|>->MP(:q˥ !$!BBDkJ͓ShCN׼U_T$5ZT)]a֭#gýq(WʿZ[zf)Vy_,_nopON`jlN~Z3l?-0~\x!rLؑg10%+pեNRt;v++EQ[*jFV0hiii4P(t:]Tz '{*rݭ^d8 J3ɓ'dPTbHkBl0yVќqLd by AehÑHZU"+z-j!qL劲T !N0FHQ.irҟH#!IBC谢(aCje&횬pO>ǃ63 { )튂P !%J/BS.d0_V9"cR?;~u2 ,jT*H$jmaS/]N\^, CWWעE/|"q#( ɲ際W* l[h˲ǏFB$ B$0`ܭGB>њfPNT* "Zr #vƘP/?0͂ƌ  L&8NBPT$IjZ-Ų@ Iu۶mgnn.-R{{9;Q. 4 ᩩT tPm6DGZ ,4Xtɲp@ H$ 5\2hk,[iHTYco7B%E)O<,RBɻn4R.W1:uf~憖 iI"ǎ_^YVꬤSG&}].!!w:Pq⟭eRGH0}zPXv}.ߥkoo勂0, }&CpxnneYmU8AMQwzh5:AntJ 'Z(`N uّ5ǫ6| , 4M/_|jj 0HORPfesNM&S__˲h<XIwuuEщi{饗L&a`\0CrSYDz*Hʲ$E٪gվi㦶={q׃I[1 e' T$ qŝ. R:k| B"ˊ0 M'0L8lSQ,R4M &&&$QJ}V8Yç #a E$EADqykc.+T E)@Z B}Dp[0TVZoڱ3J0AS4]}7xQ\3ghZq+-|[YݖnUCYޠFGKkVEp\|oh=ԗ_<%~ٲeR X[t8~M{W@CWWh48m81X(T*f+K^Ϛ{]b/ryBV ZO,˲ƍz-6Lf2XIBRtjQ_pX{*,ȢWPCsbp8bŊK/tzzt:I}UxkoGmXR!B*a2x׻bŊfΥfb?lϾu|@_.K& tZEA A0E AgAaI48 kjq{SS9qxԩFcۏWk(!~jyvUQ2%x ߎ%\du-ZhLOOG"JӘ4yyr JR ^E*/jss\.sp2 xdY(J[;蘭y_L0PQhi65W_2`hd2rQGGGFSSӊ+ 2|T*(LfrrfcYv$IiJ [|93$h4:55U.d2mZ!Z.NAbT*d26ot:|M!  2؜CZ4,9:|pr:xnŋ1 0Vh7A'؅NJuL^Zz7lB z{{9c*f2MO\.75tebri/X"op|U#~NP<y50Ft6JQqAZm }3gL ix<jP'N|&|V\#yO===Di4r"ByS~g|ꪾh4O=> +2R_z-Y!~[EK B"IϯzzzJ%Ywxh cR# ^4PXr9;ZZ;n_G4'?(|7nz+ BLĬG7G[7^L--,S XM!%AfZch40^i B򊻻ics%fg SPGqW$)쏭ڽVVaRs^bޜ%p_5Ҧ4U~@mmmz~ΝF<(j]PŎ~1 @b;RTQAҝ81U8ѥpPݸos$L!ur]WzC9,~-3 .<'ΠWw5^Բ_{A/ i퇁:'5а<~PY˦eU)+QU՝şW޷t<h4c/JJjm!u:A{)qG;LO<{9H nذoHСC AL݋.EL^g&|SIVF'rvEjxRV$Iݎ7XXz|޴FC x<wl1,rBw0ǰ򱣾`ol$DDCeՔ}}}\nddrór@lASyF`^uSSz}2HB<&+`رc? BhϞ=XjUZi8q\uxrA<8رcxb!.LOuvmٲWxbE,40T˲`P̣Y@ 2+JmzRItnykZ&Ŝw^۽re gҔ4a ,rk47|f±bh4H$zjѱc@V%:;[nzϜ9s鑑dBKKKt?6%WmIGҥKN˯E}L1Akmk[/yo?N8ү=(r<6}ͫHiK?w1 M$wu⫋zE~(xx:ܘPdAH ?ko-MCrE" (nU^?rT /n-}ñk5bUK)BϤ|G p!\155.)H7~tWZ544ꫯEuF^ gu%J](ݡ^ڲex#G475k4*}N+]s:Ij[$g9`c 6a000l9$c pX%ARKs]9]^#s=_-JjyBVE1RHLaX÷<6== x<&n5 O30s CZ [j .Do󼢠0trRa̒m]'"/_Lnء( ERjVAZV?'Y%'p }YҊ(b8y7-\e=X\@WMD''f?VI%Gk5n)K}'oaWEEEvAAkmj >W:^z), $?cR f|eYPl܅ x4@PUzqkŖoc?pf˚^KY.qpH %<i{Ecg?˵.jXbI;Fsvk4;ύ: 493- וƧpWcAH(Rnqݠg\HgaA+y3~/]a3,Ʃی3\.WBieGRI? hEo.W vv7mDD.+u$qqrDכ .d2D|>(yY"7l~$IKsK|YM&˲xJقnoոf-a&IZTUbun6*b&SFݽ۶m#0pn+C;*|j Y#z֨MXѣ###4MGgT9!yӦh66ˡNۿ=ܹ`GGlřۯ}pubL`NK`_{̲x&!bGO9B_>45^tz#K;WTEo{p0<ȈxՐ&M'4c6MNt':?02=6E$Z24qj>i}]G^Dƀt:V[[](o:::N_*ji2LR x<;wbI0\LW*E L&eٺ{q͛7o޼yddh40 Lyrɲ899P (4[r[V@w\n w&:_x++'ܓ;v옝O|kBP79)o:i4N98dځq\$úo% SyМ<7pj \遾+?hrH[BA~j*"X  rb 90I9s L:ji9rz򥏉&˒d JTג4'Koћ:(˲~Ixܹ 媽XrLC$e00,HHKQ6R` ٿfgokowiѓgS5u0BftMoNƪKdq|#ݐKmmjmtt4:m8uXe2tn 8h6ۘ99jw]KI, @4_-R&&_ [,DICD$ oVm ^vz(gP^*x>$ $3/7o<0ק^}Uǁdmz,? fEUHٗM$R, 0q%ݏWpڜ}ﭫ$ 92 l hDRz%+jT^V&*S|ᵿ[jg tcFjNl-"Ԍ8+b$I~qB}u:í㵯 x[Wr){ޘͬ?lV$gϼ} IDATVWW }}}J"oA\;: Zz[[[5p4h`: 4lHlEQ΁x<~έR)hbYvvvV$ȩQnHv;\}0T*8V̀$KSs?jx?UcK1Jn@Cq~(Us͵1EA-Y]%'q̍ԍ/!VUuMoW,cF#:6&4~:u[ CKKoo9DbM˾zg&eEEm :u]3:EQ'& :O*8z{ | z) ÇGT%_qH$ϥKhύ@ oO49X1âh\NEQ_VNk4p[zzdTSnk-[t,/,˦R{nGI976h|˭>_˲'Ney`=,Vp(GO< !eFZEn4ksccR1ӣMB+*ױO^kj|sGafҒԼƹ!Po-('Bc +Fws?_RU8z8m|  =H@9<6 8iZh3L) %ŋ+Jkk={D^~eFmll [et:pxff\Rԃokk+k!0 fgg^$@  AHXh& Xh4@VU].W("b~~<Yd@ PNf z#A )}UWAmxxX .G90`z 7iz[EQ@إt:ݳM;.S+g$dHrY\.wر*?s뗗8lRر7ZƉ h aB()Bjk*#-( oiiijjzuj؃`HJ yS4FldmD#|^Qw{B–B1'?GOr-bhXO ?ZLa6ϞrU˯ڵyV=NܻO:u:n7k.{wwri3.]zen*'G B e:ݼh_\8yq)W('؅[5aY"K?̫$ O`߽{s= yqJHSBTkӘI*y0LǰpE;|+؂$K/z+`(IIE)^.P< SP|^syyyyyYz;ZMٯ8"Zh,;?)㸖w<ǏEihїˤNek_XY!t:nrkkTp< ,0,Lmss3˲oG˲###tp8t:ST&0QssؼyFY]]* 8zfs:gnn'OfJa@Ipg4nw,e9x ^.{ݶR#X6Bή3g.]&b&b^ݰZWEQUÚs#j^ϰͲ}YT|rH@RАMSþ:WxK؎5brxg916'I ku.mO+Ȣ ŝr]U`w̼fIgUY#Crҗygll?bXZd~CDíVg؀|-w@Ġ% vadVF_#hp˕$)UM>̃?$IrbbV7)HN1z`0@Zh4(j2*sU ch^Ykuݐ >&HXWAcy[45_ereY^сY925;>>~MZxpVRCzazRTMն]=ҧ.!dgE* , :I^xtDcZSqey0N]8?Xi@h-#P'iˊpדZ| ,3v8l."[oGYw7q6)Ff^p O qSU\|?;::40.]yꫯðaL&L~/aVWW'Qk0333>F`iMMMPKC|1By@j|:8 a:|2PZlvݍFcjj ^ +t:^drdNM#2JDZZZZ[[XH&;ygY6(Rb Imt)DHV!V%Ԝ"eHR{Ux~'a'‰YLD`޴kt+#R'0 S[=lkzw<?xS8셻n\ mـRFC\JBjtxv~])˕ aBNENOH鴩OΈku1k$tqN'5[$3۫ce[`vZKhԋss&I7{? /c5dGx8h^{M76s]vysN1떖+ V*}L՚E|.'+ Recۡ83A 08j)-9yl6ODbjрbiiiF|8lnneYzzp<B@>߿C4h B.*J{moo߲eK.h4ETB(PZA̧ W$qICC@O @\*:{lWW-nZƟ2 /^΃-[TU*hy휽B7F:9ɲlsss8.J`Di^G" @s@+ RdIvh3t@73~r<'IdNK&]s5KKKPw x> h4t:HC xr|>y\\t4\9=$QTjnn Fvmmmv}ii)tў]*׌kkFc]Ex<t73{v@3g𱱡g֭0$")񬵴߷׏djxXMF/l6]~3ukyf>9E/,:ety/Ku"Il?{ܰ ]䇰:_E<2U~uS+44mTElm%!D=vFٱC(9X,&T|普f}DFV3O5-E.* 'pD1^'i!Csrŕt:{voj$,4H`Ip,cd#_\{L۶j{OTO/Gtac폥w&}C~K[g*:n K#Q?q 4-iE14W0EU֖><ǬG1yqXmV$ӧݩT*%҃טn>p ŹpU]XYryll3gkk,X }W'g3I[^ /MIӔD&39J!m688x|‘dv֧{ZQl5vTAB!| mw=wBJl`+5f5}<}fPBQTH|GLV_$iyE+N_ FM˪^l@@6?rϢlRfF\xNrG` Q8nllnhN`0(tlllqqiɲl `a7j5 F"rKv]vA؇ALl @Cggώ8N^$ qt"ӳ]>~__4M gϮB!ɔ瓭I*&S+Yn۶-% ຩ]Jjrӛ6u|#GT*9p :::~cĕ!Pl @Pǡe@r8>NH ܦ#x kz$ _IGkkkр;ly( TUT*D"¨P(@7PBP,#IRY?uFP@VP8ڍxgggOO$Ih4quz| 9VW{oQ;`7Y,{_x! 4;-/]؞~ĉ@{{{^kku~ t(~ۭb_ ,&bSA  r ߱*4m5l}!cXh޴wsK:  ET  ^EF)C!ß/tu-*%pZleҿl?u&Q˟;Ǚ)_P wiR7f]6!gMS?3#7z>vb7b:mNVŹm]znnMU<`~Y<˲.< z.D I/\dC4;Mʁ+ڥ*v}OAÛ%IlC!+m@d!wD;oo+0Iv>t"Q/\:zԈaX<P,_Fڸ9AE"Dx#wX$IJӕJ'޻w/֮f譖M(%1urx*J<^f }'q-y%|Wn߳gOPrP͟F_D,)onGf >OuK`U7ʙT絴v.iL˲TK?mڴiaU1M򦶊,-m6o<-a;h4lƀcPJ|,v^877FOf7o&IFcR/OMMy8n: /^t)v- #G@!%P Apr7L!.ΝhNs(DJsbkk~ɤqwLg"9Ҽ rtLR466 $I<3>:A=Y3ŤgYXBzrU`mmHX/i4Y5Mss3vp ,|\.vH$mـյ:33U\qG5m*@܃bg... %p#fV @Q6#2xޓɤ(PAz(W( Ɛ\5apׁDA$tIQn@a2L6moo-nw/KK͇,[aYߍOh4~\.uBc o% E+MeMZk$qX^7$Cz鼂XYY_T|y̅].r5 z+.0kbe{"e6Ar<-cVюQ"#U؄7p1N9BIsśoil;zߤ ߩ1 vG$x^F7_.tl~]b:7:2b)*|@w8x kd9Tu/~b5`ٝIժZIIFa/I,L~Vǐߌ}iQEbu#i:S^d*F"f_M7haN6{##=Ҍ).ReQd2Çsgg@exk]V+gՎw-m}Vv\ &=Һqa 0Kdn*h(l)؈r}Nrh X*`:a$H 0777Gd[0؀0 83 0j&BHfjjJ755Af)F l0|>s9Atn IDAT0 C\V[F \1ˡX;xfh L*AWo=$k_2c, P$Lp/˩ ! bi0 <$ISsu@QJDiis/K$򋋋ϮB)<#8x33%#v!u$CdYgmNF pvvKKKLF---p(JB| Z2lZ%Dz, f@wz##Χzx`k4Bjb1 { if/=ͭM6 vK!_Z[ZH?VmPCeŗ$I",q\CCCoasfR߯jۋ]T.t:kZH/`Ƙ ERŽ:^WjڪIa\vR~Ekc[#Xqggg,OSo{7)FL o$EQ*nF|>(ׂ߿0p{$d`7?9XȕgEa& pt/zj}3EA{aRԏk E|KQ7,@Ě$l,<ϗJ%ȋbZZa@t@nll STUبj+wߍuIl s9^, (n K7f~5r|"f( -1 Az=tJK޷|ܵ"dzmJZH<|j4cbPFϔռJ& %`Agvvvmm-P;wp`G %=dk7N/vyeX@0ӛz{ۏL--6?|>2IJ+`1NEa렴s!_.f23޽8rX&jI6,#A]}8=Jyow:AQZÿmY>g,xI'T)R.U0 lDpO}HoZOӡř )k5CwEtl4E2-,}UrtPԦ4jTq_,8NQ f#y#97("\jg8g^/|gB۶opc⨂:zhfZȦbΟ/|Vkvj>oh#geY6ccSS˲X !(EQ.Lwb/ E?p%1Q*Eȍ\ϟ>F CXL&0q &^9N\+Тz3g qDщ;3"JҒ^_eY6JYYFKӊVFϷPkE*9 zl@=ww:ڍF}uu(pnH6G޶ Ut4j(YAPSVĊ"dhK<%oVZvwwl97MDܛE!F;PJ`l4z_WJʝ,ٻoX+kZ2)EU6+]H= 3===|z%I 6-///V+0jo= $brAOD9B[e6bݻwppOSPlN! jZ_V*FӴVݺu+/V֭[*(^>Zj0SB(pY%26GsssbK@h#4s&}9s: 0a}}='#17׭ǧ:⸑a fgg'yUGQJH#v;«\TZ]{f O%YC755Z抦NN$TFA>b{ HA|4ğ%Irwvny ׏$鞏BP8w @`'!y^3fh$jV H#W q~|4?}~vxX{N#E{䢘z{}6;>NU*XqDkp->>^\.=:4;]t._jWg3Ԫ(^՚J֖>` -- kcggabF~~,^ـ o7p'd ,@He ^=KFGve Gx6po>gS䂎l{.#{Yg_U8t{9\.WTV+HU*!jx@kJ%WxjeN3::}>) p8\TN'=pɀ p LN:Ix+L&0t:"==M{"?(/ɲ=LH$$Iɲ-gZ]oY1X(9  mf?&?]ݻ{O $eڰwtb`]dz cx"WU #0j/V+dȊJ6]\8N}6dCEЪs@(R#h|J=G7˲,q7254;Qq-i!]#]Tdee-G B,&_KrjcE넏}PJgkt6?`KG&PѨбX,V[.j4sF,#Log8Tl)A!Z"{p Sf%_,;\rwbWtR95ز1?== v,Y(455F۷e% ǽm۶QNg,j48Lni(V ׫PEGUUdYxC5԰v!4%D:CfntN76żG=uVsA܂ -ݼ)hUUi8 4<c̺lٲuVzYfV# pG3(- []( qÌ(NC<;N.mۣ WZƗ 3 GjϽ͚uOollnh4lр, n7gB keF"f9sh555EQA p8bRL&(86Bb=)ŠO|5QXTje(LT0&Jr=PM$EU6>,d]ps|YNAt| LZN"vfөZT,.ED6.=.c:UDCH|H6]+J+keA @j$ަhΟ!rKa6ί^.KE^JVVV`=) I5bh6aP񥥥x< AnwOkF6}- D"paa[n>D*r8Aрa1Xpv jQ }eTU۶m$,?m@ }I>00p}Eѥ\. QAeHOLNN* B^@  `vj6kpL{tkkk&|mmmXV+JDŋb෻P(gϞ|>???|>Oth4+g|+p֞ t:a5^/s{pa*79gz$$P#]Q!`]k]ۮ+յ]+*^@T @zIdz/gΜ %A!əsW<DB408WO"x60>5kV}}E8j!3Fˑ$I73 Q0,v00 fw |{ONNJ%eF;1!EQܘg$IdI(irigi%??}*\W =tZ֭련_ |A+oh *X\\X|. lt:'+XV + PvF|>\.Oa k6{ofAlBEQiEU} ޕ pMc7<5Mt C46V׮mHc~т1 `-[dcH帅 =+VgrgƇsS/\rh++A ."d`e2ӥŊE]ڰ ѪC5U/V܍-]i6T;p$㞋Χ׽&\~'Vwe{B¶;|f0fu;P*wx@ʲcw>Tzxܚ倐=o|D"r fi\j4A)RI%D)mmm+<_4w*p$bNb DBܜN#tF2rd2{K=UweiԶ!-m@_}sPy 6#٫$Xnʩ!຀Ѷn&˳,KR$ry=bάM^6.eu IDAT-aFJ5jzܼ .ɣѰR>_Ha@yhxD}}{R$iw8psz*$NS A_0$L][2 UAlL'N#Fj0rk TVkuGF> -xq_&Ih[/ (+IE~B!cwDMצNĪ ,O488sώ٪ /͆,JlTgŞJRl6zb,$e_~=*$I:{Y_n;BMYYYَ%J߭$`w?sP 呑ׇF&vYyxر>~#F1j .+ږ}/xIZ DQvv`8EZYd %`?zTU^=|aA(wd:bj2FGGe2IY;!'e-Q8/ yb(Ϊ l _$ja]Fnā$nr79e;/ 7!nZa̘\;N2 XEDdU*nH$}مЎβBָѣL&"˲zo7DZtYAC*5sNH V$?V҅B>/^p$Ic*5l΍tiӦy<3Pwh0HZtV^QJͪ%Kiu c2QbkF͔9G)SMNGG'{{jJ.G_uYaBx-D&xw7E5ÅP(mscۥBN8#kj\j}c/wDzBюVgndB,N$)*OtjSM$ dgn7C̙qrx(,ӧO/!/\QG`|hqutBοz 8?dky%3g?"yWn2fϞ={{jcÖS󦰌8{BQ!߱TڌW]? 5%*)%[pp>PR0d2i4|>{^Tȑ$Yc92J~Ӎ'p'&&"&FM&T.:A8G] =eYN(T".0$j8LV]]jݡκ#۷*x.lR a/UA?gAuUU @&AOSqj.Jn`P`9jjjxhi d2yQ8m2-ygd |?n0^F1-Z& eKCFJ9wژz %xڂx./|e̓8~Ix,\*_`^fCGfWkXP>@r`JjWoOpŊPHrͧNX>0O}Q(gp*_]0z(* % CQ \ls x+EòHO?VBs(GQH&Cҩt,hlh(*Ϣy> ;MQ$h:MJ 0Xe6cͥEE$0dzdd$ĵZBaqW0d6ͦyN;I@2wc,1}t"|q7#CClV.Yu$IbJk|\vhX̫TEᅬt=VPr۶$LLccYwVUUqjݻIfϞ]QQf|6[1b,=o/ojVlÇA {=FZmsO|~d*ѴP@váEdZ{[jdfk pS1VM&H$<nEKLIPLoѾtV ?xY92r<ԑ2r5^E9Ҁͣƽ?=IY$V67/qWȑ#L$+Wnpk @^zƁA3Q?β`_ Ơ+`h2baӀB a'Nf2 4MáTJh4 HAPUYYR [9r$ X >))Al6 ^o2lhh|ㅅ<+8Ί dmm xhC0r(I0vc`&vcc#x AV8vr!L L&VWb16`3pӒ$969`19,D Zg USLYpN%EP5jbU[['y_5gd2hXu>L|ޡ_4eJmmG+D (0'<{ ''~[ZZ=w [bƆ.Z]+~UOYAZZ/X<1>{uZ=iXQ lV·^ȩkZ[zY I_qJQU`Ɏf Nɑ*պr/9^[Jfs*Je4j¹_;4` Vص8z3~'EǝaH)8&jJ *MqgX cΔ$9E}tU3㩾T,SՓm6F}?,2>>cSEA`c?dJ 0 8Er^$"Pر}eu*tq`݋/* wݚ&n@C'sFQFhTkܯ;׿= Ұu]۾5{a?77/EPVqVIi.*.1Le-a80׋XgNY.Wğ.6}$bCCCeگ<E:# W$#Qskr(g9wttdYV f9>}eH$Vg̘|CiR(` MӦM[x(\h껍FV>xw\LαIT(0;VsigHTWz t=ă?X`\.'Irxxx:%;FEOQ(pM'V9d23+H@`| s]zuee't:XClTv10Җd8NRznC///###pxD&''#C\/lFyrrbڴiٌW]hTdRP@Ąi *1nWr+֮mP8ϜYPn6 %#6u"~0d@9s[@t?D%I$[-\:}Οmii9WDQd2 Y}N>HP 8l _6]S|X,Ft*ij$#٤Onbo*4[wNd@Wj(>⫳bj04HgwD$ðQwig~A%I%?SC&''Ѩ(iQT1+y^ybH`.:OG[&0=>* -- t n7AJ 8'9r^A aHrrqQ\!ܺ,kyiq{D<P<ЮZ8~;1 7@)=0p- l6GﻯgoZ h0,@FǏr9B!" LE'ÇC`$ihh0  ;WCCC^/D*8ZL&^[nsZ ((KBj< LNX\Hb6[[[m6ÇGFF U"H@\N"E[tΜ9`q^_*<OPwLs oTp&)6m yP]{3}'dYYY!̦RP 6 dcK͞K1gʚZRrDZvcWΊ"+GM\â(* (ͷ;wDAbͭV#c`kHɓ:1 H(J$J8N>贩S(p0>h6>vtw"9QSiλ @ Ͽ B.;7ݐ|NA_|Şp0, M?p}cE!݋]aX6Ed…ջwB$!ٮ)?_k~?&*rh2UJ$)^b';:G\TQdYvE<,kC@dWW Q"d$wB!g5@Шt7d2 /P2駟 C:h Ţ&R9u8Ni_|:6'''\.DzF)++0 ӡ v`ZD"|aC d29@ P,zf A,@JʑW_FaS̞ڤT*<8::0 tݻv3g>5 O>kJqtx ?h0TBa =fhUUfn". IDAT j̡/ A.z98DQ֦j#Vs9'www4]QQ#n7T 3gy$!ڃq%Rb(J8B7 0ZfYhIy80LPLHD"p2قRP̝5㸁EQlgsLQ:գV=WdJUV;Ff WfzIbQ} Ϯl(STX1IJr\R涯˯{(~S(SllA$< oO+ )e2'23Z#~ @P Br+OGE ",jÂ776@OoSDYI@Zjuw=X&#Pyxo,]r BQd{oT_r ?4JӴN;nWGFF(\n?ADZI/V,iK-Z,]Ľ*J@*>ǖ_ ah|d*sfk#A;1gnꪩ͝{vlrHdSTRir8$ρ$I!nI ẏ bpt 5^7~Ql30|j81=Y7~qnSݻׯ_9aӃ#,Mw,Ub=z4<M+YӣT(=܆fI@BIb@ s΋W4P½fXܩxaC$?oZՅ W'T*sz$l6[>>6܅ a pPh[euonV+>ǖP(H$`顱1\ߊ"ߢ$'T\n0X)J bq+.6}}V=x`(N+Xy\Q,-|8 ÐJBkk{ܱ (V{&M'y''Hel%A<41PeZM6gV9227y`Y(1 3<< xD)Fq̙-0D|snbp]1m%gGG 'yc|m= bX/ܶ~ۭ2P <@r9Is"?9Pz= eeeLv^&@cBH$MEC!+B;vĚw|v^2(( ob> {^ 4\.7<< jAG&\.HE(?0,Htuure_(RJ^e˖]p.EEI c;EQ.KH$jqD/(jʔ)Em۶mhhH&8{bO>rMY;ıuuu%KBabb$IJŲ, ?0ٳ Qb|4kTPR2\.STa:·A\v=Vy Z -Dӹ4j5BQNl9^b&:ҷ6YV7=uqF3\|L8U*pm.Aԯݰ7c#RZ %72B.BֹK{Q3+/j{ XRw ׮՚L&b52\\FΒϺFˬ^"mĠ/ɞ8qb``0iAQa~-3xw:Owq}'e9I-w}[GU?f=5k()M7͉bDRR zz2jj|NQ=J~?Eq\.W[WLNN{ ALDiZ600 (Q񼖖3Zu1R&}el.7on=pA\./4M"1A 'f)2/ bۭV+qH$Q{Z6_w$8}LFJyPˍ㸉 %L(GQ*hth ah+ B!8N !0c޼y$In޼z+%IE dDEOG* |> phd8%$ zܫVoX$iȒ%(V\VBQTU*ryC@''g?ɓa(S*IBr:c[[K&yoA85!1͜wމsQ__nd$ ֏bZKpܞGG##.i}z]]]SSF\.8@ʡ!T_7Wv.ݲ5ul"xD"Aa6GGGsKRTX:VW0IӵzE3.\z%u{lX*+\5M1vT_o!?uLw!H,x-w>R.#EĪ?B!,P~>1/p,wZ5QcB"b<)0qNjn<{Q(Jq{Q@V_}SD{yX)+/vnzY:rT2Ԭ_+$"r뭕sT/~|p8'̋eƮ?Snhh,IzX7??8k``bh$.NC Md^KV\D#D70pBY#l8}5::j} qn.7KH8za/1\\.w@ _eg@OǧȪNCko PwOdmm-\T*UX|@sαl]`6.]J@iV*رcCf4xO yTf2/)U3n4הz۝媫1́[nF~ڇDAN KJPĹq4M[,9E%`&Se2Y^&KmތT9gC!@XGQrV^]VV?:tڭS =gk5,~?WUes8Iϗfn$I"A4⣏Nd$UUUepL&{:)+~z2OrKϣ) C& `v[K"YQQ!BEcc7?P$I+anq,$Dajn6qɥ<χEؓJX$SN[X~45I= B*UGVB!)"A,qWW3#X:F>8ޮںU9SRɌƔBܹ^dJڂ{^|Q6]{mEn'''*lTZ:zo6ɤS677X,q\"T(걱Nt:(TX TMcѭ[VVVrX -d2#R. eY SEn7LPH$?dFGGaL&s:eeeAw}]]@-{<+WN>yBZ*t: GpnXshjjjN' rFqG'd2ٍ {t: Y__g˲oغ#8nsa `d2뭯_p 'y ~u# ldd$y Ϗ7i 2 #8k`/T( #Ha=(ϴBWwu3==9ks Ah] {׉1o0 ` $!h&9UWWA]//:ΡP<}2$I>dr܅ H,G?P  4+IAbD ׿kpQU@Sj A!W:p P6!M$bl⮝]Nh8FMMOt:4ŢL$*d6)Šjrjff& n޼C3:㸈(ti-P(%p`P(-[hZC)H8bؘqHwwwww|..S,joogYfd2;`nPXF9nzFxϗ+D" XVAQT6$yy`¦{xcؙ9o^/&fTォ7T+}t]S]N(T*zW^o=rQ}frpxڵ4֛j^+l0q|?Y-KϥƓ}GS. WHZRS'Oܣ/^GhmCڢVh.W^/YBDX2 x<5<< `+Umj۴1$I-L;)4o%q(s4DLs\d6%S*2Z}֍Uzm1_vɄK^QcYa C; .|8*Kgut"g"ah+w%EI?aDfPL(2o H-tm$Ifg|.XWW0bcR7C[7&,Tl웟z8b8W$M*8|MQ*V<=@tff2R <-GjkV:ZZ 5two,M#"J4 LX,fXl٢b5qo6/dO<#O J @n ![ܲs|Oe&"S3nrE6ex&c<5,QZa#eHD| .QkFI1466:ut"k ϝw8{*)?rc|sK.ȟ MקR)[[[HK%v~C }+ٳnp}*͞/\PWN8Q[6i$Y2U*DT*쥗*'\LGHlnii0lbb"WJc#l نQ,,^-i<=}}§?&:$mO#q :>Pr`3?>pX6 l^7rbF1q$S.2["‘ͯ몮DO}vF59Τ,:(T4Vs4]~r44"I*[Q*1 m^! x8AD, qD=wG|) Xxú^;b/ @ ;F.۶>0(񆾯Mk]*2M'OWUh2N0 Ο9jqqP(xVa)7](V*O=ce_ t:ofhS?FOxPn%yl6C/vTHYT*UUU?u%(.\uL<2 fs*YP|>ϲZe/ߕܻ٬ݸ S33BTiz۶m+VxwQ $xa*1C{'&@.[XX5@N .W;Ð c`C'\N¿{SEÂ?-.ҀqĉCC]k1ŋ_n?p j5͉Gǩ7Q/=nLi 円ٳbOR}EnVfK=ދhʲlRR!Z=0J xVaDxX̺\.NB=PLMMCr E7: dFQH_"0h4xuw͚LD a` 2Z- cn ؞+4 c||80$ <0j$,k2:::\.Ctzvvl%222R*, E,ƴH$ +" ҽnOLL$z;$T*EQP(h>elp8{AlM}Ņ<*NNG"IH%w`*;{ɑHyEAet!"RI[zv՚:s753Mgb1s}HDEuwzBh?$ϳnr|gov2,VWMswifoTUzH U"DĒ \yW0i1qEVQ1Nb{$˶O!ϒ[,}xl.$]N6_ FEq*xaHUdn2;ŶMk z\f`d nK]QYT.sD$xbJYoo\woWW׿oLjffYrIƂr{ea5xDK*SlGMF'իK 哧'O Ù ԘL&DPP?GȲ aȱXՠJ&&kW%>!]zˑK,Zgp okWyz}6!؟f m7g*]C(TER;;N<71:9u UW}>^p9)`l6[>WQTQLF_׷{@ G%FNI|O{T90o(if*X(TbMw_?GcciBkE ^il`BzMe'"%޾ RFD* LaXU(jm4ZmXLRZ|D4Z*2VЉĒCZtx6fYeE:r>Ǘ|4<X\.j[9::|tV Ȳč$LM%ICHЖԈhSIɍL W&I:PQ] ,+I:p?RHzÒ7 f'ocے:3oO9''S?sԖFCG'n^2X15AY.2 Hƿ}7a=PH:MWjb+hZ7aX@Ov$JӴC"YQ۵.JdNr9|aeqvBA7;kPE¶*ՆָB`Y"jU` 0iD"Ç:=" ZE , e˗3 BH+ nz$0dZld ؘ9IBMP9-t IDATڕ+Wz<>ð7-SO?YMmez@C5YX,Ug-A9>Dz%( ,KP`aQN=cǬoݺωH==9;ĊXdR $+!rK/bԽJwW02j9=>UJb0tP'ʒLQ"{a1RVxEY:zO,( vM+[_dARѽ[l6g2||%,˪Sw&{'+`Mz<ϗޮȲ^Jw)V{7Ov{QLx!Ϟuf_>VP]Mk]5:o2cq+93_z$ݗvZ2,yVє܈Rlv\Zwj-(L5k |MXP:S1͗^:]t*.Ne~{]d ACCCTTm ì]Kv+]* ˖,+Rz >wEխ[f"ZO\z ǏzWZe0@$ I6o1VL[;3/+s:"! *Ya٤^,Gn!$&ϝTf,y(u:cx.T+ERQk:^E)55h&Q nîh---cjj ܡ`0ϻ\NA`j6p)b"Xdɶm4w=99999 ٳgju:bPm/7@ `bb"<@ Zh4VUUyދ=x,#,,Fg? ,Z+L"5ZaLLLQRPv;=bx<+V, RYl$衊LMMJ%`1h6a"׮]hE(nhheDzMQT<9Ȳ ţGtZT)jll$I. $:NeS%\\]XX+a@[bk{3x >xa[Gq8m޾i&eϝ;7d>6)[ZZ‡ond~jpt;7sSSkI69'/F%]%]b046'͂ $I5ry[g]+\!Pw'A[^|IV 0L+w6ԡ:( bݙA,;11Q,gw]B3WTDY+#Y34>z 0TW\|{ڽKAXS{YXxNIןu0H*'y $)[[[ kWGkpXiRUq:dDTix/.6nERP,Hr$Ix[Ooݸ郑Bh4ʛV/>E4xԼdI:nqSI|eb43 FS<\.{<.Kurr{5!+/lZjzqZ#4>Ֆ!VBIN'ݩTY}r^3L==fg4?#:X曒;w(JV?~ʀ\t)QoYml-[V/ }4*e ^Z<ڿeqqdT*U0X*fdszjnzZ^\\裏l6Eu2it݃h4FDЎ_,[e` $)hچ۷Ύ±!p!$ TO,G"t:R,]UUjzRh[.EQ2v:˺ W*"2z:^V__po%˶ꞎ\l4%jӫWrUBj x6_ho/ݓDl:MIй# UVI]Yeeu_fFeBG5 T nG [V+a`$.G}}=-FFFpfgΜh4n<&R `f$}$Ξ>} i (`wCʕ+-Kkk+OcX,#IW' P$ɑL&x)E^$J2a=iedr7l67dj5Br93^M?K&GfsP I2 NMMB!f>eB 5kSR,FѺ\5k,ki]|n语jL&o7˖q˖&kd $(7CCeFr$V>}p0J<=Sg2 g+V(UVSsF JRH?? \lY&c8cΤR)@D,( 5P($9N]pP(Ât:0g $ Vr 'GL&aX}}=0w8l K-'+hlՌRP,VkEg}񶛊K!o*g'&s܅IIJ>Tb& A AETJreΟ1125av2: TljUP{eҧk$;/%9Ѵ0:,,(ƯݽHd?l[" Ӛ%xFRA|N+Y=W3=bcLr!WPC! 僇JWQR(n.jds9 2$MݻoZB|J_,S7ZZ[ڰ1:a MjOT9/٠n7L&[>Z3>c_?PULyrW(V:WQbbظn>0d0,ɘLJruɺ:!/bfllbhyB+ z)NѓSx8NRdrn.*u8|i^92TUUAqWWA1d*]su ,Ilܘi"1@dYP(J%ZmX~]uUE'~^O|R1)γ$I^wٲe|ؿVPuux<}f SKfd8Ee@ Zb_CxLjkkofI^y'N@ t:7mQaPWWrjb"HN3ֶa!,l0DU^4x~ྏ3l$I\ْm~Q N,_b2{zu3eN"IqgrYֺV|78Up\D݃rmD޺K֭,3V)*n4-fQWJ-?3/d2Y74ZRxTmE`0N7 BafyFB޽dQvCeY7(T* d2 V T/l6hzlSTNOO,F;d0ED".(8nhhP*XYޣx~cuu8XʤD"Q*L&xw!;׼FmOy}}T*yummm(RL&ê !zտIdDH*U R1N:.߲i]gH}*7 Br0H<|եB8vU=_=&&kj.ÇcfRf{ߺx1O[],j^{3Nsgfoݹdb+77+W|V^+o4z؍0ժfKEfAϬ[:COw[m |z}d&RS?L%ES?}㸩X*tQ!XMXucNj}>G[܌k?P?Rr/T4Z|'A8sqΦӶѣR`0X,Fy1ͯ{$$xEXH#0g47/8 n`X Yrea-]]]v… 0ׁ>PhԩSpg\.g6׬Y#rKK- Kcuttx^'JD$A}3L_p8cN(c(B$I9!RIJ ` )@ȋ2'Nv_uuR1΁XEx<<*_EY*+L&tf~XRSg6:Mx?z\`!e{:bvh˲ 1d<.57Fyon{IR5ovv5mR~[׃fBӔKTO eY`DB'bd繁d"RW[\\,?r:E$ҁW\ϗJ1\f6 U:]* [nNQ* a, R/?cBvPw{kUqkd2I!wQ@APQ#b={/;={<% 5k{D"E֮=2D>p[ D}>yg.3 EMon[V&P jZ.[,}?rA+ v+ &{aD! X,`0LLL4N*<|>(x6-Sx tuuAj34͑#GbquuL&[|9xׁJD.ޣ\.7 "hʔ)%%%N3C;J C] 38Rf޿#GWVTΜYhQ&B###^ΆQnjjq\F w&itb,T `#r\?2#3*FɞbY;B===W:-|c/xәp~"Tfba4Q]sʌV3tp$pDszN {;hryVs9&bƤCCU x ˖&~*zuU癤V+ t:V+9]4}dcAF}o^UHHѿ\Ҩhf_nK.^"D,9\|_ H+ʆ~Gq,|/hjr\E-m-Z(|"U+ɜ Vk&),,:'.)+|$ ֓J*m<|"@g4.w\Ou9٬?4ߟy-A*_|kttg \d4nj:tH4IQT tLYIV?Q9E"ǝK7'%GIR"{TL*="|өTXeYxL:gy:OJh4wvTjxDǘeYLhdjk7BoA@ Uf~פ.-H6kR&8^,+wϙ+g'X ðH$Vxq|^uu@@TF8gll Ek9j3(g:p{|>A.V,X,xs;ڵԩS0l 2LT ^oyy˽^ӧa7?~Gq8ݣ#}U|Aeujf˲xg񔩴4R}P8 ^_2Y*FH+\.N3l6n/]dy^.al& Htd2ɧ(cHNQ'oΔQ.t.卌`43T6fۑK] p?6s|> H.ɪd4R|^;m6gyę3wP(6mFDQ4L:Y_~7qGi6[j69&ibbAz~={IRd{䊁at:}>_:Mnw@| j5\]{UX")2r5\]"2Om+鴺X*vh׷mg\~}t*G esYK٪h4JeReC,;2YhHՁb08Y޻o||\*&p$fBa;%|!sta.O#($ixYdCL`V]u/ZA7?/dr|ƌ0aX. dg>ٜ+/믩B OzPn-D.WJRE=”o%btl~eYV[XXHӴnl,t8p0I~:{6 B,X''''''{b7߈hCԩSdꚲٲY]|w=xd~BPIڃwq$ v0@L\.SfHB---p!2 DHdhhnX, 3g tp8bIFQ*vlNR*jll, R!0]*& 9>N)JLb1y<("x0lpp AMwL&!N8D"MIsZ0B0q]4DW=F;$IQQ׷z8H?nkF2P;@ q#WHl6xoA:tĺsEE;wn8zP;LF(#U[zSvu]gG J*-+*b} %_lq!~3㓞4As%c(ފ#lX^H޾='8܉oKZ=bB'&}=+ޜ'Ԇ`###V=sM&!ۺunqI[Xc eY!H2-xb۾SʇfB?°?,$IKT/pF#X XwCjق@ ԌXߝ>]*F=cMQgў܇@ `h$INlT{zCy:Ͻ,P(FB={rѰL4w25}7OL"H <˲ =ܞ=tyPwJ$bv:7a˲^_8>V~}86`>o|xebA B(q4|>O1(WYxh"Ia,p,x Y v\v qT>Ocg؄?"sZsyF,s I$!f=Z=4wo&9/ԩt*bH%Qh˯ O[qȓ'wpw\$Y R*jhh, V^uiKC-ñLhmtK v>rHX0py4wИ5ӧ}_{1GL[TΝ;sL&qr+ Hr]w$lx @)fJRZ.Zhhm `T+Vl{imm`S/(L]e8p<SF?E%%^o_ \ j$ 3˗MW;~vU I.Ϙ10 ,2nGP\\C ^]}}}Tj֬Ye8-? OHLgFZ9Pt* x^G.y LWDbQ2D i}]]Rw:_/0$^ʎ{ޜN[D̤HdH$J$ۦcuuu%SeKguzWP~eĆ~x~ӲV3\2~|(\ jWo/jZ_Soش)ɱK/߱.?׉ꇙ>yd<_،vLٲeqeڱ|Dnk[%wޙ.Xf͚u]-/_P:W嶏>\sB|w^G8q++3ЩR% TVw?$B?n۵ƧC쟆v:]_H$8ZBg`8zdL^OuÆ *^ Ðɲ@tPT6aY -J/_>>hIFV.8P0lٲ'NTj6RؘごYf6aiٜ9s:;;cJdt}.D3*A*-c° DҷgOww`6mZIIIB( Ǔ$q88Ep@7F@ jnLR:`0x=l6+I3^&d1N,pZIhFtie9$o2)6V]5BsHq aAX$ ˖`b1V ؃" l6KilWǟƙ˖e$g(4gIQtf|Cg{z1EEEH8aI  Bat6>ްaC$ٸqc{{;uTihuΝB3ZۺA_cy%%Î\.!!$pdހ,n,TyԅKs^GQv# I>Ox4CQP(2fnݺJX,&ɦM6|?:rY#90 cOnmIp]B_9 KM}2'߰BTo4u7[BR)s611 nJVjTuH$b*@pcb,+>?Y50)?Ė`ټĈ]Eg!&]D_|QVU=m0B]sRZP]`Kf?`…wnxP?0l6/\X'nY8-90e+4cvg44ǩn,,%%%?#d^xHW|?rᤳi(V('zl ha)d2mbǎA_dΚ5=L^70~k~))R hߨ8~bJe-/LIg2p'r<áp65znkBeEnIR lsjynVWUUӳw`@$D‘A r\M2u_ٖ_k2URXΤ|AríFY}$ 5Ӛjkkn1;+LG?~8ϫj0FFFJVT*^,RTȲl tUUqeee |L$Diau O v< dz4֐a_ڭx wV~JRTn"]1H+*+5l_3ts9NpSZfY$UYL]<#7 C _.+ΗF]@@Ënk nV5LbӤݞ%Ut>όylkWT +{D"l ljbb"rXS mڛyBn7otZ t4hlWU1[wD_O~pO[ol)HW(K0 \X8b[N/n~ǀ81͛Ԕz}SSh">AuI52 Tw===z#`s` D Np LKj2 bv]RRR\\ }Lh g ءP(Li惈$Iò,k0(zhN$aNWVVar"%%%z„gX"T*w7J90H@fɱ1 Q,vqaboR&XeYxbqjJ5 /n|!L!L}US\!tӧ{.shF.{ѳg&I$q E"xWyo\@ܛodhz$ 8e%bd!S[ef#idY%4M,èT$.%ҩMM/71 Q$*u3ڦUJ!N* _l۝CQyY9rjt*fϞS1g[ߙ&_<:f۲5p ]3mt: ~s8>X!4/4Fc EE_2(:Gj+B~o<'#Ƃ1EE  ')qL,빲T~΋^vp}o'ZJ =) ]`*P~zOZ&Ny߼jE4ѣG!)  hۖH$,,z*M~EQ8yU\ \zF 9G0~L&C!\cE"Q&I$J~xnk&)| 'H  9Mw^[Qc\{MJ!nZP(h) 2Aox,q_PB?Kv0x91Ҙzj>{oUϻpUa}Hw,gEK-ƿʽy˄8 ;`"d٧?3t*}ȑD"TZXXdMPyy9-ZTZZx~g(@PW} $QhѢ.̙3٠nvp>okki<`6J@a)pWTSN#㙘r]b/Cà5 VuddDNNN|Æ ?S|@ }}}xF"M&F 0^0B0ԀǏreee|ԩS~9*Hf%K0ĭD"={60 @YD+BBcd G͒'D"PǓɤa|>rB|P%F'?xIBX.Y!. $ >_|>$,+3D?PfWy";q$\6']Xj@w/w|2}?|Dz,qv/|Mrx,ƗJ(v%t:/?g_l\@PHp I14Zm,u7whwJL&Vϟ߱}߾fОClj"+M:;1S&fe-qҷ* y)f)If'\AGE@x~g'H{ ?uıӰK|ag T*911YX}鶇 N^J՚ 7E2/XY=zD}eꡖ%'N ,m5Ca%#E7?\rn'N(Ieq}MhhBm>.vYrd2p8> ̂z0EO;o6,$x@ X,E z OGf&fi8qA?PIFs f2M ET5RG"jd6kjjGR"kVcz镢<aZa ` M2Ξɜv IQc"(˅Ca!!$?ؿo7GQuDW0S6y<5'18BoUoٖdFGFC>~Qq8R IDAT(PC<BlхE[>T_׊.uלˎ8={};9sb!8MM&eg?x8ߴJiRhqu7F^:! /q;a8.[j:RiU*ǔBBKE?A8Î{!1ao~^(L{᥾P((,<}[hbaae?tޞh2%[Hn8O&D)y.{FNL E9zyȱ=l|1"F E"Q&R:N[>f4RWY4a7)p8DbQ 58:11RTi׮fKIPhz=Aώi^蓿#R;DCCôZ@cr2΁ځ!ܓ}qeGfq!zbp5٦rdoz=1X,>F4ذD Bh:!GJpoGGZ,;8NnBIQTN8{fr8*j65:{lB`?qO<)'Slw^"l󯽵,WΝ{^{{[,bӆsW QlBJ=w\ۑH$x0T*r ^5kV&9w4Q[F`CCCd2 GթjC)}>q-u~mX&x 3fBNJȤ6#S{b؇G y|IgiqCWx|"###EEEuuu рT eee0W!WE(*,,L&&DAb9IZ`A:v:㵵uvvu6PhbbB-_\"8p |/tok9Xg_ooo<7!K?qDVȑlN] 2F(J HN fH,((堃 .sAbߞK1&0B7ߖnzJL K..o^{L@|`¹x@Tܓ!R8D`ϾN$uZ ð޳z5S[[8qy7>l$qEE3Lioo.?p'  $t=p\X 7>tH$Zz3;̛;X0䩪>Lb"dX,1 #]A' >d2D䌩ށ Ntߣ8ә 0)ZmJvrJiڭf OðcǎAyY_xtE@qv{Kf*l,b3t:Ν;O:e6uot/yir$04Tb!WzT{]/2q; bL&@ߖe8nE2=3_$b |ta^~!_{=ԩ:؊WX/+.]_`>6u5yrzn[V nF0>> $j^W(K.]fR<}XIII8`sqX\UUU[[ PY___YYΜ9s1JjCP";wU 8n90v@v8~"}U3۾Ł@i۬Y]_l=`BAh6a+ c-E}3gZ%d2x d1a `!T:i l6 ,X,f6;v' >={^?tPWWa w B0fohh jjjvGMNNVVVr J$[`ImmmHbAngP@KfܹD@ \mP5k׮@ٳg{{{A+rPI$矍O&GC1=== ,]ΰf&SaL&OӢPcNb]]]d2qd2L*n(m>g1 0gIpX6ZO>5+ sa> 0Gl\.‘0rzjg߮՜\s7Gv;z,0LL.x~c8Q)Tj\e .d2'N8fu_=x*xɎ< 11 g]==^NZx;0cy7ɏ>*sەMZ^M (RϹIE R$Io0pKHlh"g7"( bqEEdBXK(</"pBKǧ.\rJXdYjg O鉋%L&7@x… Ba[[n/;Ϭ\^=kzȄ߼¶&ó~\Hp^&7" qsaΛ>p Jr^әL&L&UӦMcY ~{:3G<Cz}CCT}cl3===lÐgjCg'8cYGe C(;I  Qw]7mV}Z ]n-4|/E/E֮'bZt>t- /R( @DL&IǏ|>O.t:0Ԉ⡡QpH3 rúxz(n|H$  7,//p$XYYz!XX qE3f'Id^(ju.4AUmj|~Gr9)hzJrbbGI_egI619w;T0GĔB7 <$XV"lxZsexÀyw]_{٢lׯ8wO%t8o3&t#be+ :{_֢L a#bPD%b]q|W&OxC$H$E--hDbCSRkvc˯F-L),B$c9ɥvn!3} 7|>ΟuSx[[Ěl[ ,J/}yGsɓPow!esAX矽l~!Wlﶛy:!7HRp rgdd oC\ypPp̉'0 z&iՁE߭yN$k<'ĻQ%fpP@@{|~&i9C ypd >ۥhl/0'F]}S83m< i)?.5Әx_Ch0qЧbVM=w[0 |Y)ڵlpwJP(ʂ3Z13Nl{3rܖx[wf(cIIL&lj9eժU˖-Lfmܗ Ok%=yrpY lR0A b֬Y6mttMMMvr\PrKgΜ9$Ivuu.h4HlP(8KD"ѷ~s}}=˲g{nHxRƒt*g0S2oYaa!x_A b1["}UU00!~<]^NQN (I Bq*=*Bry}~_L8y L:1&~/ tZRJ(/y4zt:H[~fo ߾%p^x<sx^ d2dzl*BS5urlpy<-,ˊbՒQs  }lM:ѷL&69R$uuuA~'L700Pxv~ddDVO6mddpd2xvT*Njad2 F@K JަOdoXti*D"W %boP(8+[/R)j99r9I$@J 8Na~D")j5!^"I㬻*QUU5 -'aGq<ע_c%1pEo77!˲ߚZ`rݕd2;s-a2?kf P ?}y16^ct&a|b-_FGG2-eV ўx5Hq;6L0c*EQVWT###@yg6+KdAO@Rt٬V5@btBFivݱXrE"K@" $;/Xtŋ[ZZqFOGFFv$ |>|VL&;x` Y$93qaݮT*% I^4Z.}$I_zE x_sܹs!nGFFC!왎%ԟ}Hw !`P 0U=('}>7͟?nwtt|h4644HKKf|"+.GxFcLcB"pM>aw.?@h4b!ۦ͡t/~58]xDPSpD\|Bnɼ+V͙MS\dYa=(ϴruwU4'MF9gr2c068a'b^u6 By$&癞霻y_t8:|͙~]9'$7n<`mEUIj,VC=zG?S? _o VM-5$yZ:t(ʬ0k0?^>x ;xG=Yi3R)T Z_e]Yo9DbTB "tB ˲^..\Z}h_簦ug%B[& CCN鉉|>yeaPU5fd29>>)lPi4&a|˗u5JqԤiξ+Pc5Su6[JcʺU`2pwȲj7Q/555=FKT*k~^tIrB I {wZd˲$cPd;6uVnk޶d4D_А!IH2OLdX$݈(c^ۺoz-KOOh,8Le7ϖ-$I8+Aڒ: P p9np:y'0 Կ>6%'WYqҭW=K3/yWG0MeXju{A< caEy^QEͰ=п x a^&v(n/..Ha LÇ< :Y,`0].WR .֙eYh\xqff&[,D")څ} IDAT $;<cX$-@Bn/˅Bv'͘JS^|5|ĉݻw'\-I1}ˍcrCSMyr>`UWͱ(_Z:nmmEQlii68aZڹf_$X-IBQnD8_wQD.uw{)744^n{@Vʗr{v1?)/UYj*y߱wYEb9n}EU-tx̙7EKB"M\.Kcpz"?ѻK}v|@&g&&s5 nB8s$MNסT8hC3SꖨX8 dR'vſua )[|f -:N$s\Rikkl##׿(Ν]?hȼt:3Jv99 1g 0h~ !jN aAL6t]Z c^O貉BcV+FcRx=3 677rżҚXPHܺZ'7W6S+DDQE=?x,UT*Fx$IE]5jk8q5L2f|hsSo]`w8 4iZà,˂7uuPPC;lŰYQkZ|8ꚕf$LC_CQ4 Ԟ#$?V#fneA蚖/#Bh4f, e'[[jw[SiR) ija$N'e_,!}?~}oo/!y-]ժ0>Sjʌ)T$Io j %z)* ΚOtos V_{ӯij}Jq.@ `WYxs[lvqSN 'P[{i.H-E/p8&''(w<#N~x5fO˲tSGuTJ&'d{sPxal+BG$) b8idAP^ ۥhRId,HG*gwgM~C45_7Ns5 47tM;Z٭go>p aM塡!әN{v2gϢ \ɘf~)IMP$ZS#!}29(J\Fu8wvMӊ岺wieZ:IQ\.Kīb@4 BfˉDeٞm$t\.UUNill<}t<BMMM6  xpj5㠞*U*?r$<aa6R0!E(MꁁñJL3Rh=x(yALoh܁Ba "$)A,yT Mp20)hd2nכ?9"H(xfaRc5fj07>Je2K$Y!I8+~,eT2[alփ'gb׿(c:N}+n,#I?PUh42k~Vejh^ Y0`7OGyp*irkeʯ]!3>_CxzU=67a۸hWɗQ޸D_ {=O#f76/JQJh4»MӡPh||<c?8>G #f;0 pND#w>m%Ȉ!_f_DJgl6Z8C>~@[jU.xH2$j$ Ͱb{nx88f +|"Q0fyOGIC˲oaL URj^OEI,d)w>0m˅ݼAP>ig peYٟ n 8FMqo CB@O7x %ldŕaR) yQŵˌ! |>O傽a]]]pJIoTk rz77vYl6|P(bY\.W*/ӷ߶jժR4;tOva [ĨlT( sP$jB)Kcc# _lWK؝H扉 Qf\'IEsֺS+Wp9zgrr20"("I[M cH$8b p8 ^]'''3[7: vp499977zNtjڴ%HQO>՘9EQ&3hHjnn.Jij5NzWnc8oz{{uej(JUcB>ON L>r?OwO͉Uȱ%khyGg -XΝiB0rei)xܓ[-TW#ce 1bg1X)k[gi;*el1(JVSP9?E{,FhvQX\/.8sxF !sы;҄Rt)t*TFX,"e'|%x( QX`Om{=˲hx$qfgd Duwx 6ʭPP?u{:{#r6x<ZV,)l% uf]ר#+rX,h2iZ[[i3r\N"95>iEQ DeYX,. @yFSJyo~K(jllt\l=wv떓X.i 0 p'GSS4 755m۶ ]ّ8/s\`Xj֕e/$I6X,fҙeKFR]2LP t IP RpDT~?0,$ (0ժ/qR.L&]WVE7[ں'^ZްVGQ.LCN%ܳ- PYcDRp;Ổwㅟוq0ƾ469n2 ptd_,< |xDh5`ܱ5)yUi(WV*M0^JUUٰZN &,˅X^$s]`2lZ\\X($f1z9?aLHuhi7o KKx lMD&B~$E3r6Ayi"?PޡeYڊ~_]uaaMwuKddL+<}zyy|>q\KK$IwN3 آp+]{{{fkooeR~hhiiT*SSS\NӴT*5Ot5x cn7@t*W*uw}r| &ҚLZ_b^~kZGKBO$YfX7~Tr9iAV ,+| ߹CHEO]b䔙tKYѳٳ_IJӟ>nN2=rj].%SO: ;<ⳟQ:+{wb,Vk&˲," {~? ./; r\U Ͽ ̚f#44@:hYme 8T*qJ*ErSSd$ ٰ!k'˲@VduqQJDQA$𷗙rkƍ *gP($IEeu2<6uKa6eRڥK1Ě9}vp8x6-DB~_1 CeK.kX\zaXammmV`0T buˆ2@tA)@`pp0Ͷoޘ C02=Kl6].WCCC\j7fgffmV^;)OzAIXm(3 a(д3IE/"Jӣ[y!s=FDPn}pJpiEq]a%cQ6po"eM/_5ٳe[d#Fd5}NyB=9I4+;gY/P6 P8A.}M˲oOB v 8L&Ϟ=rc*"\gj5(miij 67°d.\^!g2jf`0T݈)fhpf;)˲5ޡFSl&[*\HJ>gY1ڬ@n o}7ߋ+%}F 鴦j[o~` MӮC2Jm?Zx|!y@dh IZSɤf֭IRB^e)ʝa2b(՘bh[X-B|>}I 0Qј)[WvءAE9qŚjFr͈$i tJyOl6yH4h(9ej2h}l_*m۶T*uLQf$4nz:xCfwUWw8)f{ȾQBQTRqIp$ɺŌ|KI9zeD+>tY;v}<+fWŦ}YǗwn ,I%I/uU~ٲQ$U=ւ#\Ieɂ<_x#Xnjt8 $ãP(d2Xl:xx櫋@3,Fc|w[U-f--EQueG* 5y2x8˲E/")d-$P6PWP57 *[uv_;T և>](577aũTCRZ$ٸe{h@xZIϟ?o:Q/^gRȲ)|b m꧂G'>^ ',ߜؽ5 3o BD.3alP +qb;:: $dii n#޶A+9t{g28q,ܴ 89۷ofJ%MMMO$n; (x^ 0ࡾ_j{yb}Ch$I5k ^*~A Ç!X,zxRKx_[jU2)JNa EVU(B>_ZZzS{L$HDQH$Fu]_jպPp`G8pŋey(dpb6=_!Eӹ%IJ&BJ]yH~i#@F?Z~}__z T*LgYA+k^iϽ (^ M nG#"ՑrjM׃Nʾ!Ƶ_rWP$Ƒ*BwDb׎ȧw&SSgQkEW::^TdE0]Gѳ9/_?nݺ*EzVFՊlHS2@ cLK&jyv@Nz5Q5 # V۲ AT,Ƽ:[[[jUba:~l C?=h eyaݡhfolm80k$a/sK` IDATth,t鬊b*hi4Mxl4<hzoqU:[v۹L.GZj(k֋ӳ{*ZW(ux t$BySM2V'tpAEg# F ԸbE"?Ш` [ԫ݂8QH$H&_|$AByLӪ\.!Qm6[cc#*F)EQR<^eYM0JI`ZƖM]xRi2 싇B!Qu b6eE0>>5PЩ z8EQ`ڵkIdڲ`v<O$SZj(8Uqzh̽~>Lv1_ 4p3GĔoxYUUbQ@Ov7IQEq%G0~p? yzwBY%v9]-{:3 * D,|= {e@DKK qAx^("H\PAB2n@;1JO|m\i/Zj4<}u[Y3;<<<0`0)g?o`Ͷƙ}J"[7WM\4Z=|X_^v9)Y .^ډxՃMYeYn~f6~%h4e84n)xoh45UL$P*a0}}:@\^GXK8 w3DjKX3KRR_|ǭX>|}MIJj BN0jhuפ(Jvs~ѾuOK奥abhɸl!c(ijЮ2oϖ3gZ&ME9uf.d=>H>[3 rӍB*ps3ocouud]ظLxu p?'@FAh_# ֯~ E,vuuɲ A,..Bqliz" ԄgJ,$ i W \.,eYkX gRhbp8ǡ K𰪪nw}lm =6X51>>`Z Km 4фb@*1 s8s+{;r9 1 FѣG@2I>/Bp*d2(T 啐u…S0:::6mڔAFakx P(q±.KKK,ˎzsss y"^/d¸n kZ*mttлqcB# 9M\PawJ̙ wW݅a7##Knn?rd|4AۑcPvs/c(N7JS=i=_Zspi8 , )` iYVOGG ȓDn Z Js /J)76tffob&"cGx6J.=r{bmҫ(R`-JpCܾ=/c1L[M۞~jnf^ ÉodbS@i|a ^_Z/^i\?dY?[(XHP$I'OӋmL:Ya]' AGWwb<O8Qn_vٗu@ܬ&8?Fȁ _UX,իʡl4;W?W׉㧜\kk+ fj~jj*|xͬyCwTU }SMex/ݲ?hGVe&Fgϖ^em6[X_yUTx~/(:~c(_#NZVfF2c5/>3Ҭy==\iEV.gcc,sd)?}X,u=k}*Y x٥%Px< 4}ٳg'l"bŊݻE]/GH]hVygT* 4Ebv@b3@,J<[V(ˁ#8dY^W̎ 8 O xu8 SMMM0n޼^N?C;\A\#ajg$|T:eMg|idEQTqN jS=*2Cࡿ5 t߯T*'G s/= p8\VtJ^UUmf+PHO'Ny7֬Y{s٬q1,X1O9qO2 4m8~37W,^ӣY{s3TE$.,玁֭[g:t)0nH֣(1a(M4MW*hBt:1 bE h4~`0X 4Mwuu!R2dI4JpaŢx+I~}7gǜm;]|˜^i\w%g-!v;TQÑ:)_ڪ^`rz5C&HrL#7;BD1'E(EWvvv 9s&HnAy]n(jrrrjj +$Iz^ ]ʰH@rZ[(2Pj # p!e^tIF0 mq58mP+ҒL&h4³n k^OϡD=\pQkZo N3ǚc|FiSZZZFp#_(Ż߅uӿbAIeTVذyzz:I"σޮ~n0Le*8c8Fbv5L 2JGN7`n1(5: /.Y: @*v OUդ|>;7gN'ë,Tr<'A1,m,?k $AyG̵fz +z,fɼ{W\* rmvb1'ڴziiZEECfBCcW_˙l=go ϿDQvmB:0 ^'rõZ GP(%%IB ?ˢ((ڴbEjh4 ?(iE F ~4MKsׯa$d,6q+qfF]5wUe/vwIo~0 46EQbX_l~Ή믙lOu/ |i<hVJ8}9sV*^*p] EQ9}O].WsssRq;g0F^}\^ށN| $i w$˕exAθi6UuSdAxЅWSSSPCt[[7pR}>A*\t߿_ӴL&z)=%_ WEV5]/]T,Bj,o  ?ڻ%(ztד XRiX|uk̹acp[[EZi J\K@( uz!ft)*uC+۩7OY2 Z h삸A}Wz-|lкJ#[FFFVX655dnll!r$IݞJ V|,+JpEx ¥K+ '02h4...J3V+I puNLL H$b2z{{ilvnnzLfrq;TBβZ<tFEgc_8A'IAA@uٻ~=0|~I0]h-?!d2yA7ul,($d?y-@/HDx+ :?²5/( 4>^$k6;wx*[_r~f2t˦R2DZ \ؽCW}[VZ^^nddoCi+w- xqםժ0<OV*Bu/?sP fTEQ]Nr*[ 1N8W*&VEb,P,gvϻGFF*Jmx,v{[Vr_.jŚ\m0 |O?#(f0TE1Չ8cǕQOBO ag6ǧnq\GSp8hPɹyŠm007Fr fJ%Y jhnou]!+rdǏCc24(a +J)*k={v^$t)D2̾|nĩS9Q1GH=+ b18AdMl6pkva˲T0 K.qn#%(aem6r xͬB`0Sm ;J2k}O:suwΙ4DD *9|(&3<$3SI3߷k]/mS~{: csKBY"uL&G HbX ]~u{ ,5rtĄ*H[SWWkub1a:hh8N>ik~\,D"nz=F#شU!J:{\n*(DvVtuog*\&vMS ںQ!kE -FF&G?CEh|t& R8׊ >UvOMMź{P$ %K>}z||TR{q{fqI\e_y*v0NB!l`.J0Usz߀\T8.=+ew(Jq4)Ȟhoz ðA|r20ɩY-56G]Dz,q:B0 ϣ?d䤘rmy" tfVGQT6fJxӛϬ0 ` t:јJ W44/YDyEwiI:LRzN=fX?8n_l6l6 q$ l6H#eee0>aD`wNPD"qԩ~ӐH$%W,(ģ\.aN=6### |Z4Ţ#8~!D$4v0@(Np>rO/]$I=z*/?oDP9`wQT6/3F}ޤV PH4C x$KKc7iZ1:a%I"OD2QXhP͜W[ c@4  hejW|ꕂ>rHŀ=*dݛ,w8khhHRgbbbdd0*]IfC_ N",_!_+X= ^ ВBQEQpX r9@ A0\aab|ӍF<d2T*E (BZ z2P.6|ll PBd2 éT&JAIZ.pC!Q H$M C+zVJa"]&wHEM_l4O8?019 xfCĔ·I{k針8Fdehd&hS2>\?z5ۿb|__=ի3}Ǐ:X_w-~=x'NB!40hG d!A{*v^qz`0 e.HF~c몫bq0|@@ hqs"ӴNDgsxn^s$ʍMVvtCKz$$՚Fkgz3;B M d2 .D<^u]Vx?6f2._ǭRȓO!x(T=2gH,..t`MtsSSe]_]>zP0c+J\.c>x0p< $)<%~cZ=k֬1$r;$)*F.O\CW$b=~M0Lє H ƣ2-QH+(==/6}ݥ{|Lq\˹\n]mY;v806L[q 3(Ox2RDB"1oTQUT6) cw_FcAH-<~ zrA_6k].Pc,Rs#O|z&BL6ߠJ**FK9B9t:]XXh2g_)Wݝfa8 8R@F$,MjA\. T6in }>hqX,X,VՉDѣ\Y`\.߾}X,$IC-\0N[V zT*r((( IrO9HIIIii)"NS$q>O@bӧfn4MlhsY[2kXg0 F ,& m۩S2錿"8w55t:|aR__yl(CYYR & hll=[oK$(I$IZ(x|pp0͖UWxTU% =X:6) zb"aQ&AVooo(*++Pӿy\>HrݞdX@/,<Ғ:[BrZ=sxBBjpk^AKK y#G|\:xɚPקϣ`Hv=̠J1 XyYrf#jqr@g4(Jp)·c``J`0$-޳X,Bd߽W/,N$Iɢ  (YJřCGSyղqMjB(pX?z>l2T*uрŏMIe2tpܑ{nca`D&0,rA4MnTX,yzRQQ>2%'d2Id(D$bN'wՙ~N6n}JvylV)'֬>: ð+IIKAr2O2  R~K4FjLvfBF-w_c7^cC'_޾}D"ikk g" %y~ -i+W $vX\yISj&v'iZУB$ŋ_dfobJތe}[|bc{Ǧ,(;≄T*rS|74M=!Ql~IR /~=h;Bl[TDիU'&ۣ~T*gTU 2pϽZ}y;7BtP2?0r3g΀:T@yyyn{֭df,j3g;NjdM9C36Rq,yӣb!䙘eEɅT&@{{q"s2a$ADYiRpLYV]8%d&ue`q<¯YǦRyyy555lR"[m2"I7Iv e\n$!n](D%6 خh,A k[BaKуX>KQs%u8$ 6;H u.cX۟y(bפJ:|yk12l1Ųz X/|\wT8$j:Ϡ+ Jeg%IoKKKVkoo/BS>yCO{ T*hG4bqQtMd2MNN BHx<`bnNy詯V  e- *J,HW(JHe^˗/_:::,$%In%: ^*(H^NK" `β,$d2pСC"8n6̙311-DT*iYqG6F=@!H$} ._SuRiۗLC ƒo `Ont:M;iLN&@ CD"Q*&LMMC_2|ٺM$"fΟ?s̯gHpe .QT(W\!ڋqwJ(~eV9`F_L*)oZy'>=P}/f. ɐ$999i0,Xh ]] èGQO|G{eٱ1766~ȳ0FYpk핅/ySnt2746Ǐzt:h٬h`qimm-//Fg&v 5*1 $wA6mZii 0?p$) (mp=R_nkke29Lfsww7I-r\###d*<=Z J9rT5uuu d2 8!DhT₉i%;x-0Lz۴iӶlrQyWվ/0:P |XiqOo!OCyyy]W_<'H21,cK~y</.\0frXE;v﾿XRDYQ*u79I`9a1 ye9 Ǫ.L*-,,<D(; ]t?ԸqP(fbf#fyy2]{ U*.+`P0_;'R|S^^|>_"\1cRܱ~}4OdZ.]hѨH[TJ|xR9?OΡjry p^wsFb+LJRXiF(TT28@íK.mll,++۴iw}W^^bٮ~C$A0 #Q*WWWG"  }J9 B/a'rfJ"3GzB +1FځW&`O&}>~"F, ڹἼ--韯\11v]cD~K$eR;s.ZVgΜV Eɻf"BaLONޞӧOǎ@yt,#r!!uQo(((/3N^ð'˿yXhU.D"ODK/1'xg zLMr@WXXnVsB!BEeA (I---Vbr-]T$\nR )BH/ eyYjV+ t*M${! †Y3fpbTVVVVVZV`E"\0.r1 ن҂HT?Y6H39A:$\&Ƌh<Ya&'˧YNX Oa&٭+4N)FPěSNQ66!\Ed| NN%o{HׇBp(L%IR nŹWmV;׃ >GYxķngR#㋳ł"zE '.5R)4°_q!(b*uyϭPn±ߩ!'tn(UqOq~Fq`"#(!XYgw}D9? xDW;gpp:2LpZhUg@t-⋧v;A\.x]ǎuco;Kn1gqO$ NJ IR$j?a_S7#pܘo4.;<=jz.gmaX[o%Nbw*rԔ-GCa"wu~B.7Nj4Ms/\.O'E +( =A Cd]]c<# 3V=xut To#ɺ6<y1#!k Db6[[[ffu6wP(.-N ⷮ8aYF^7cƓ$'} 0VL IDAT(s1 L,=HŰK}*D9!ex:#H Ԝ$2D[/*P @،F+4'kG[n;8q-!EؽAVkKfhZ)\//<#$ 6rW8غ*yˤ9k=xS[A8v,uߋd[XB@yV U(@mBؽhfl3D0e槯`Nch@~/]dqWߦB{0=55TJ.&;|w%DЍ#$ٺNcQ18lz#߀K644|cI!g*aႅ7^uU0ܱcTbkŹh$p$OPϿ@l4PtSX $y*s?RXfV>blgۋ}nEP(>@}K GߊHD ZB_s' ~H$q:W?WBx1G=!O|g#q2?sιdɢ#97׬}R²,bRy ,?w>^Hd"ːd\.W]]l6ͩT INXTB ZvhhԩS0FxxB\. "hT } tP!\uKר<)% 3ktu5˲ny~|*R; BI$i iD\.t:!$B8qd]sA sll t&`8FFF T(@+cS( nj}&WHV.pYfpﮬ<;-J0IG-Gf|&ݓٽB.7 W>}|}}}wwLGX Bljh [} 1 qb vn؉!Ds9!uDm4۝etlͥ˻1 p3P_UUUU\ntt?cz'_@2 ͂ /$+TV'b}맩`l<$,+m"X;0hljT/y˗=2eYSO|PNNMFMGGGQ"#q9q eOeWl,ƭ\SU!u7.DaɾƿkٹWaE pvյNj5v,޷w b`R,bHi/[,v|H\2YZ")RE;v+ uWi 3}<q@{ Z]ZZZZZ={H:B$q<\7 (MMUM8< l^{#{@8Kf0z !2G |f-wo+?>䓎Ll6LKVr7߀G8+$sҘ8ڛ 3JesejϞX,*+yG!ڝ#MjlܜU)7ZZt $+'kɇl\m66+fe;UW ڃpc1WZqU|׶cM(Vyh******X . @M% a=H$'O*bVk4 cX__߱c<MN\&!!x(ŋ|6 ea ;$I2 +,+e$3w-W^~g׮@ D5MXܢj{m$*(Dn00:^/DBD"v,`'t:ND#iNVL& BpC~@l`SH$\'.]:gΜ;vFu65N?z1UZzD"J\.BG(PUFEHoc8>oll,??_P|>t@ A*A0NY!9(A m MӋ{ c>'KDD$Ir||ew}>R!y? )a($1|zct"?9K$`qR Z#G6,3f̈F6M eYprhjkk ^A t:2L^^^2?˲ 16E{f/~P*jd2j\.Sc3 . ݸ>l4n5 JMuKz܂ypXUꞞjڙ3gBI|*2(^#Skz@``` ɨꊊ ѨH$- !(M&Sgg9v0MDPaP((,P5W1~m<p|̞ L3yVQ:5DZ3bqKKK"p+ 5/Q!~V; È ^ԔJeee@<̙Lfjjjڴis)NS4M~<FH;xP⊊9s$N@PXXhۡ2 s!>h[$+**L&ӱcǔJZz{:|7l}"v VDzC&sݰDRTRUWW\"'Bh"=lM^|uؾX*xܹ=2::gvd.+6ph4+V̝;ojl8g^%q_63\> * 4 });ԇB!q7eg .]xw\~C%8Bz 'B(]e`ԓd3x<9݋ܹ;zT*EdbTꪪGM&_E"B($67+\.QE%S)F&~i:'8 \suk=|aBK;:.°©_}%;5%$p^l#l;kkVcoo-[ɤh ϟg"B!k\f3^Lo?#/VV4{M&Ukjd C9% ~4~UȎϛ1h;-ݿOFAKd 3 gd[[,*,,%1 yqnOlKK2qw?x.$gv\~dT*v>" ǎ3fD̪U/xnhHV^^HpX,¤W,?/ z*v4??f0@ ^0 ;qbmCq|ve_d#####JUYY0 H= vkkk5~CywVrӔ ((:ZVG˅n+S*.\d~vKSp,܏01ßVxăG*<0Q0p D"JJv($pD""(MNN:N8"0<<jZe! ^9s!fE^{rr8gRiKtr9̲K1iKxq`zO_>2:R)a"ѬٳSޡz_4|t:T*[Vu^E3?.16i %t b1PP9aී,ѱeELXy2L8Sq,zEϙBSbIRGX,a||p{V'fz,*fPx@qٰ#ǟ%luK1Xxg9!:[ƪ'OFwBl6a?v2aЈ੧L*… &]Z?Wj4jt^~յ<\w 0,XT2έOMsO a'v򼦠 +jWܣ  Ï86N @af ,e3mzm|yxZvF/Y<<,;O5eBfv~E}ݵ+ͦg>79ٔ4=<8vap8t |MA($|d.LL`V%n؅:]8>rģzȞ=l($+,4Bz=˲v6VU&sW lϟMIKR+IT:ic#!8j5'7L5&IJfTi * QOn\.dW`) Z #HH2 Z9U*U&:$I @&烛fy<>}nOMMR)Iklb>H9XlaX%IZ괅an遁0M)JPqϕK qVLR7H3WМp,ӽ9+s 7QD`3c: "((sw9·iyχwOvW^YyUVNo]쩧ZDIt:Q3Lat&K..t<9YTRgn|cvsyaᑚAoxr,nͼRj\ZYuO~urJNsj5OD?w(y^]Iezܹsrjoo{xԪN<ǎ3sYXXBfl6h6 .qCiՊTsgN*,F"Տ?iӦGុˬB/$I8 Y&6MfY򥗴oa0ѭ[KZMFՁr~R8cǎ޽{n w[RBaӊj(j p8,bss3Ȯ755 ~͛==SOŲYp:X, BX,j4_kxmff&YE 3 kkkK$`k2񡾾b8N~E6F *?l ,Ä9,ѡ-U.kbq8JPɋ0 d27:1*+pJRxdi㉓3& u:nh4\8HEU/Z|k$/,,Nggg BPALA]!S*MJ寘cJ4s~HƮ& rBᮋe;33xZZZ\.>vp|v*|\0ڎOӂ OCa!&B`T* $\]5k/JP(EVK߳'g'2CԮ0 ( ۶mab0 Rd(2 p89jt.ZmmmhЉy HիW 0554C7 h(kƃdzg>?Ux{S_<{bQ؃Bv9YYQnfD %wSwјw˗vAcwoCQT,ݸ'!O>5dWGVE`C]S@`nnnLZAEv~uOA~|o)јi!iٲet|aY=];s9Nas8Pa8hx /ſe! B8p`zv<o~O۩(z~ڵpxppewh<ϥI$%E)\9l6ۥKX,p]ܣG?TF SR)PCr~U2nc`'  wx6=y$*]@gg'$J%xcr9:q5nlQ%yACZDaRHhnu2N3͕tYziy+-bN{ש81V$aXm[*W e |.{Txi,JB&bs UN,ITwAW1,^̓Iz9g&T^44#Ϟ=[r\cc^;66f2T#ۦ W3z1NdTFvbi6&-W)7X]DUU5ϓ_FJO:< h4 7AZZZ֯__g~Q+0&Dq`<8r߭\֑.W& fssIau,w =CaH$½%%!`X>Aa:_!􌎎xp饥%Fu̙3gZ[[ahfכNF#˲¾xbyq[\KKKlvLCK]8^B8BX,r<66V.K4 #)mܸqaatbVI} ,2˲v^}5kEQ+P]#˗Mӣ'cX4MzXEFX KpGiA蜞e3<|뭷cl2̃Fc˷!lC}pIGvjzrWBϟyS$U8ڹ97hts 7/]&S %H}%oEy䘝f %'6Y~mv6Qxlln˲/~5<_-}L&Scccccc$Ν)؞.'J5&*e C 7H^8{lP?|e$):Nl\.g2HhJ!F544ъ!8imii0[1Pc8͝:u B[[[GFF&''!GEӁ58ΖCqڨR˞rRif 8xp"d!  guo``UvcuYJs+Z7&Jlju,TV۠ſbr,|Ȉa,B ˌzf`n4M^I#bםNgɤj.,-))bކJ̥9)j~|ـmI%IUՂ=Yxl'ڽ -꾣|:(ʢUg4hy^\$}G\I;HXHM1T*Ԫ[-e /+$Eb 4heyx/Tڎ FagvgOC_h7Y- .\#`}JfLsspT*q^q Ƚ{TВzޱ?۩y L!ka(uSAhhٌF#AL:>{h6i:LUmiit.ȀrP/ ߰pQV3 4HEQJ.x Z\Q Aw-`&t…SNA 4Z$INMM%IŒz iZMMGn ʻvuf~d92G:uYUQwt`D"l6ؠ(jt`7ֺ1[* |HT*5Buttlذj𹹹&lΘvSCLNcM1#)qV5I<݅gߺCkSJirNgdYT#4Eu]ߌsie ˪5i!VwhWlO Pe6 D1_*q:ڶk3R<+RrlqL(*GRҌ"-RTb۵ɔ_^w9,Bh ׌AlSB:w ˲dYVQp،D$\e BTנzMut#ԍqjz5U44{XVR$UZ"ÞrJVk~?!`>Vb[֭H%IqeCnzeޖ௼ DfͤvoZnч_KE+Kv  RX\|>o0~?Xӧ!sw07=3 òizhhhii 6pф(Q+Q婩\.WV-Ν;i T*nq *J/LNNH$211100JfV vNFqL>8ReŮjgϞ,˅B:2(Ax ; %Ihd8NmeZs$I]]]H>3{aUU9{7HR" Z6hޒ̤2 0S~O|i!&}U,6 uL dYVũ/~~+ߠ׭ <ÖK`Ķmڕ+N}^B(tUf3~͚56ZRg"tֺV[ZՔcȩ)HD"]OxӧfDj%[ 5)/_'Ğ@Vn ^M&V6.A yߧT~x`ff~&ϞBUkŐJ^Cb @;rW7$" ѥj/~I$\CO~#FZXTUz}yzJs.wSbBWg*ܙeRnL%M^Uў;'Iy<|xzzoN m&쬉A/Kb x4N/"An p4MXǎqh4LB077rUEX4R27ÁrXEQl&si(-2Ο?_$Ck+axg&ejm,SctJ3?G<׮kvlll~~tGGLTZs\\.iYZH/a^oh`2# Sb !Π'qxf$" ʕJ!e3`11>JԘD2Q*\m0t:jkmBQE*h~@ FcxrIU5B`"ˆt[X\ժmXL&cV|a~pݐkpՑ&AGmYA%.Z^z[REcK zu;B|?{ӭ8pVQR9U@4rz_WJwVE6/eYڑ^zT=_$I"r9EQ-[ۛH Ct`|, ׀WTU˾F%W )Yb1Oa'U+8rd$T`J (J :qbs??߶UW!l0֬1-6;c@ze``||8AZ,X,VX0T$& Q9O$ @[,v}OC,j[[۶5tvB!'''5'҃ ~ HasA8DLƦG2p0K[˲9>\8 X|y A]MMJccJ$IZMB@`Fnݸ`0䇆jɤO l,sj={(jnn. E"HLUbwVu\8gI$PHqW?ՑtŔ=@T*ٳD0p8R nE v8l sIEZt:]&8 ):Ks{6_> $KoH5aZmWwM$uC7岯QTa&\/jjC_W)$Y RH8zKnْDG{;6^t%uLsZbQa 4dj"Rkk^e^*+޽3m?xx H"Q$Sн> J[[WU)W8a\uNY ˲>+Յ-|Aq$%YRT5CY::DQL 0яm1Ԥ~P(X d$EQh4H\mZ!T4j}l6ۺurw߽ Ij$IK!x &oRXslk(ܮ]jzvj/jcccpXV=w ,܃LAGbȝ>n,_~XVeÇ;;;eYy/Lc{L0\(pZ+v9Y~k:$.(j5/}>5eL&SհwIƉwWHiNc[HWr*x{EQb$Huˉ3qsfuRK/j,kjIȈ!!^L&H֗:O IrӲ\sp ;y{OKw&$B(˺r85]]Kn CS͡m7Vm]7n۹snT*'"bPT,ʲ|%wBm6lv8DVðX,x88܁ N"A_'$#^X,thhb@,,V*t: <6u{cmЈA4MPVZuC&h%IJ l6CjjhdZHF0s%T qKU jH]R*H C,[ZZ2y߀q^uZVZ-qMMMV\.K[*WKtˋX,ΎmkP8Mg]CUPxe+t:m6|mff&Im\cttH<|drznoñfwuUzo@1L*؆жAX{ ,$!ue3.ꕺm Cq&I-Hަ hdEI$ _FTjb!8vZ Dz2E aLC Q7VZN|3u1$h^_{;kj(fDUع`շd0$58>~\fHdܵpyK[`yjtL6 ʶ-m[icHoߖ30vQy#61^C dAQd~:!Գ@xÁ" zTz]hX8ZQMU7466zzc.gn^z^(eUV1tjt.9s YX_74ԹNozqB PaHwvm2\O54V/w.l2L/&Tm^2 JWZ)K=[o5zĄ4$W_.O$_jlyJy~A^h4B̟ǩ({YZμ=8`0ؘJm8n9rXD䭖JR?9`nߠ"oXzžZR_~\.ΞjKKKGI⥗!uyEY~BE{S%/sa|<ϛsR>l8zZ }aA?>>>~iϵ W"y4?/^Tc8e[[Ԉ!ʾ Ԃ( ]e} Æh $Z}hݮbUUpfc珖O>Fea]Vlz|b=8Qi}#[Ihϫ烥.d0yQݬh\Wbu۶̹/_ -} %!tJD"UG4!(N3bXT@v!txr\&$R)І j~ph4n߾yL^Wܹ7hYH6MƧ\pl<2yLA "/ HlrQi敄CcTK!'A (4ر,0 >*Ѹ~@MZZZ0 H0<_qZ,339|WIT 0mE" 02lO/Ͽ!=Ckr(l\.DTE1U'A %>)Ec Ss۷ooll㺳gNralڨO9*T* Xhļ^q6+"IEGb;B%ʲQU7}Ǒ$dQ79E$If2t.%brdTUc(34BhvzP3ϤٌBOp|h -"KKSO!AP4P s_ZFӴHӂ `_J8~T-}?aLrMJbj4Mn׬|At<;0 ik@=;:4׷ǀ.'[jU%-C3r__Qd߻w/(:~,0Y ZzdYW*_Жp8NS%pmmƍ>!aK~?MӶq 2w_jDdҶy3qj!yaAS9^7j4o-C(fzzcզg[CFfNL'dh\vO?= ܙ,i5ZvbReh4v*90V[ݾwQ G0,Jr9Xl"j:6ɘ[[gOh|?Eծg]]|ȩZ@5~g߯^f}l~Ef2ofiM~=ы[zn_/(gB%Le!e!rT.YB|pA=*q WgƁ>`%I2ɄB!\.B\.3 @<>kool`( `oVwfΝpBkkf[bhr0-=At d^gLWWBgP>~x,x5k%iqa !e[^/IRӉMRP[h4H$H$@ӑ!AE v\.OQRd0DH3V+Eq8\.Z+LEQz}:2x̀H  ^p^CHрR^UU;NTvP "#FGFxاK4궭8ACne7IE\N~%qVrOn^|Ŋ>/E0Be*^\)\G)Z +MMJ{{þÇ0 AE!I#*˪a{Wb|OaXBYG;#"e J/_n|E8/%!2_,Mw_u&%ꦆ߫jÑ{ Иu/yF5 Ƭ\qժ7D0|Q*1 0LOw)LD"Q=obf\O2L"aZ%Rȶ՛oT*f ''')x1EUFb-W$i477z2Lpܜ$8?bڒ$˲ k>q*W(SӓWf2&qm[ZZ8DČ t$#AEͦR"*ں?t:rx2ZR CpDIŲ0-J0ǩ-_U"_#ա!aתٜ_k4Jq3nf5 Ҭӎl~qֺwB[fx|l,hZrN'ͨrc*q`j6Mӂ `f0DQT>=r@ i'Tv A}}}A[ 8B*rKKlB|>{:uJ`p((5ڦ[&$e[fw; D偁ͦ?/~tBw[pBߴ!0j?t>}$wif*ZP(J$?Nܜhl$Chwu!@Y,AΝ;`>?VJ%Vb\ZȄSN/^FvZ… RTUY-eI6,§b` 2BgoKSf#I CCC###D()\.J\WZ`H?4{:lֿU@R@SdtI}ɩֿ;W<0ze؅ دvC1hBT, Z,VA?gO}WZu ҩ g=F+8zCYKl{5!V[>s&}uNYVEje:Ulmtu/.y<= B.20RqBSn܃h:a=.uU$"MWUS(~j4S5kXؚrʋ$WUvvIQ ?tʳL9p+&.dri#%I"p}к-~In޷ 7׾uPD7ޘ=q"P$)24ڵpG8Μ>o' ]bdTU%ΎZկMAZ5V[(6oټ¡C&K$yg?h4Zy<H"`Eavv6Wf _xbPGl(61`4֪ոyCÇN' k˝dIk\ Py8%^i&j5hXDjPFt+W?y$`=%IVᗍ?1kΘYjmٯ"tio 7QSSS8.F}|ۻ>SOͭ,{^hq3$I?3d*@(`Cbڵ(ԥ&i~~^UU= B===[nbmmm6mzɓ' Ht+gffH (:,{/(OE);C%dfCgq6ɫSN4ںP(N:EQT|t_ٍ&dUՒ4^߽BRwgb!PăT~6=~8TZ7B!H$i6x믿~ʕ$[f nχ8L)Apf3j)9)f29 ˷744, aDrVtu"ǟ0AU Fqzz:C t2EQoYuC\q/. ժl&-\E]8\ׇ6g9ϝ]+V477kp$rUfZ4ܵs^<~ޠFRK[򀤥9꫁5Fc0 ~)GdQUE1 oC2i_\.ˉ=y$14] }6dy˩3v%C"vh(:3yM{r',;̸b1EAQX]w 8AčFqVsmpzOߛ 4Bfh9x^o6mp~BȰoaJp8,49I#D TTRN O ZA,QH4zɊٹ3gJ%e,ЕI?nK*%&H/|iT_vpvvnk5ĉ쬢m:a=*h$ͨ7wF7%`b JH(!C %PL1`l.[e$hz&?geZ9s~WMMe/`Vok IDATaڶoofz=(A8Z;4INCH,u# ,wh2{^Bp0a\)U x||>4!ժ jbc/v G:v\C  T/`t:4% I_;B8a8NUhv68L<>=866:UF{NeKI$+x#YX8!B*u1 ǔhO 鴮wBAU9Czu0zg;3Xzۙ@ }|LIx(裏-Z=7 Z ^Pj4]$\B*\n4 C!$JVv!M$&&&=>[nH$XiD5rd_+܌2 ̜.͛WQ(B{NL A Ȩ*x<0Rd2@ X^nnjkG{\I2v `^Dd?˝=Q,~pٿ?+ 2Y*[SD⣕E,9܉ :Aؿ*K4M.D?r*eh钆gÖtX,ٛ\LZgӛ\^ݾXY("JTTT1JhqIL&qWS ԉ'x̙n:F,ѡɉ?cX\VK;6;M='P4m骮q ]> do{{asR,f6e[`r3hP~ԉ ,^$3gŢ^uAp#({ ð,k޴y$ӟD"?4$T*t:]76:Y.eߖOMA8V*syQ`fEuq略 N#5eחd ^ß1%~@N#cfZ\.i?ߗ 4q$_ '3H hq0,cCT[zcM64N4%嫉vR ð4$ju,RAbt:G*Lŋ[ZZ388\?@J$I-f $IXl6[\.0px`8 y\Mz{{YU*l:8E$à+  0Pc)q*B1[S#Ƈ,04Z|fzJwd$aK"7b ŝ9ֺͥ?N1-;KR$J7|r]E .4WT*,+m6[Tf& Nvbb* 9z(!S"0 #JGGGtkk+%$6 pj:mRQTM&S]]aD" ȁUryjFar0 BBC"a(f[,ÈbDJ\?H& mև)`tT*F#AU(@ܜ7h"Z|>ݻaBSV!^TN$jls-0Afkmm,Z4pُO%7/pD"$j* pr<}5~VӹǷn-\*EMM F~ ֣_'Eo"e*JNdԿ #h8 ?U$A~cPqrljcCwJ 0{}NR޶ GDrd ҒH$<oUN>m/~¢[iHH$gVST& eVS{} HO;FRdts8::^|a7QG"U*"۶EBbqb&Î^3JZ ֱh(Ep37ѥyMرc$IΙ3fpX:X _ۧ/E/5 HʣtX,G>:ߺ*T +t"8yX,-8s挱R"WRu$Iڧ>M}RV+eL_ MQ4Y~1הR oi {LY__/^ jzHh4p$2T }.z300H$@1NP;ZϘaH@R}j=M m X›ȍ˂N+J% jZdR)Q> aD"Mӡb1?!p<pi|V!&kd2"h42=9sL۾sUJ)uCAz nR*ba`?IĹ';xRLOBi)> LQqvO_WGRH3LV$)LRw@_Ufз~R !VۑrNgp6bXRddÍ^O_LKy`qf{a0 #?I*BYn1ߞ; \/mLJާQ(nCPH@Q*MMMb8K"u'ޖSfhkZafpD"aZ}ʿ[]]ed٩)gJ5r\.h4@:x eY .3gzށ\.d˖oƸrnI$t:FbggD"Jl6#h*x&$ɖE}''N(3λ3gzh>g2N%Kطod~Bz=B< 4 ݻwqX,A!述ryWLLLDl6;m4 }|>c555uuuuuuITd>WTFd2l6;<DXmm76fMzŒΝ;#H,~{\ =P(20|B\.Vi+Wzӣk[a}5;PHQ(rT*qÚ_Qoj7~Gr644̜9btwwBOѴ? A7r*J$DpMT*,[n?IJ<ڿ4V_jrV^d=l٢j+J(doI${~8A @!}#Lv0f[ 3JM}gAHj"Vi? p8LQO CaR):t( L&j I 7jZVmhoo|!xx5! C]7)")B Pa(H8|Fr3a8ͦa‡XrERfZFka(=20_m0U%ٯSn3$EK,1TcLTҋޞp,7&7  ðsg_b ?H3:tA<;HEbFLn*{+Q\ !jI a Y+9c Cq\xX|*BZ؂mLnwP$I|>40c􃨀\-r{2nwuu0X&+w_x$r X bZ^_pԔW*uuuJrrr2Lj[SS6Z566B[eYDJ555;v`4L p={t`? 9B PHBL&:ν{a$aQ(Zرc0q\.zB5(h<44_VAS 9'O~Iu`-[-8BEX! `E0L@CH K'D R !!.au {`w0!a݅HH#K| MMgϖR "B&`gH4݁v?ZȞ:)DqZQ|&_#ÈW/Qixi2EO߮"?|n ir,S*2`6-ޝ׮Y-wmmmSSS"HPLMMz{}}(X,:V$e/8NBP HRq%R)Ld ϗL&:T*5Ͳ++782aGՃ^3.M=|C8P$vPAL&q$!(C9BFId>;wn]]`__F"d2VD.D"HdٴMX B>4DZXx9 :Nb J68|>գi: i{Nal.Z?cGM ,nܹs2&"1GՍܴu\&۱mB:?nTC Uyc7߬0t͍u'W|. duOAVV%O G BJy !deq BavV۲X./V]+V^xؘw"k7sOeZA\;rj'3JЌa'>@WWgj5K%| z+HdyeLT-:|5hx5q$4컡aF.OcV(ˌMƩZ ;8bݗ ŭ/' ?k|w^:S}N\Mt:G6LJ_ ]:v\d2YbUC dQP^ IDAT`:s.nE*X`( H\z۷oKdu5u8]zip/n94\{ajZmmmv= 9\)d.ׂKE/P?zt jl63GGUa! 0 !T}bgM&tzB%y^x&֛[a`]e8{ YǥL)B1  AxC'vׂ <!$0+0 QK` yN@?R0T Lj /Apʱ rHDp*8!4 C\Ӎm pP.'dY:KVhz<78 .BP(ryV[SSAq],s_}x6SOaN l̻VKFB %r*S*dN0믏ψ$ oX$93fXH$P+8pV<[8Ȁ \.w6?qeryTjlllP(jZ$JJu9H@h4cc)JnmB{b/էoZs(tWZ£r=Doެ}*{k!zozcB*n?s ~X n<Ap\@@&FHH$ǹ\.ttt B!\("H\b!p'J[[[hOO]GD" JƎ;6c taBۻD" Ba0 }kkk6=uMӋ-bYUVA {jjǙ8Wv?}BW: p8rlW lv…fqP6J,EVn[w-* ۺqIHjlkkdǎF&ưoa&)&Cbߔ3zyKv:qD<juN5jL!#b7__=zTT1l~xK 5 .0 8y\*KR^WGcc_=IERAv^x< tlIӑ#&s<߸і3 Ht4YVY݂8cybH Apny={=/n]vʕX:'OD5 xi-1J ݓRd!@Touuj8 ǧ}|h4f3I2{iUy8rB_Z;_) 0 ylsimmT*95c>6:JH^Rt:NU6F.يx=|w&7u:]]]-˱m^rA)72G cѢES?dF:CV-BPOE---D|k(ϛ!l~Q\gf6R_ѱOqz !F>NU >VϿUp8 ڋԙ7VDd2Њ姟~8NO,Co t?jU,، "ˍlxBx! }B:9OLݞEALa>^5QYB%BrZ62kZ=Ҳnݺ'NT ݾ P(J$眻2|~Ϝ>ڲ JV?Jpc9@' Z&4 8 `8Tm6(`X-J̙rnLLL E`ł aD 1xֳ_\|>! BcհR6T¡bT rH˂.j@tKR"@At6d+L&^/00>}:H)jTMZǛݻ!(K.d֬YxMv$S[x !p$IldDrА?r]P+uuщHj/z2/aw|s?z8FLfZ, zAvyС NFzf 30PaoLUg'VY]cQZ~GvphCgA8T2%pw #rU0#F.i4],_822q]X}h0JM$gΜXi7s.RDZ=:>RBaɗotA,[UQǚOL:k HT*UV~jD.~#Nfo/$ vp8)u~pReKso.V~Ū/lAzd"Qui_zIgSLƆWs8B jԇ]W-m 5ԪDvGGG{zzD"'rZ(iV~ }S4 B\Nyҷ\-C^:JX%H:G>?P(Į;+j P,f۸qW^#VlOS"*1:::z}0H$0q:Vv|iӦ-Xz.k˖-rzǰaj[0R"R@*fP(y7L xQ}|=HR.s1.Lu?a}*+h)-̵=44xT g:ary]]d`E$?n6ժlpѨX,lzARBl2cǎiHy^Pq7pCwwP:|xF⛯j~{T$YVh4  6;7I ¾}>p8 dV+!O^hI7'9!> |g2N$P n*pMX>5ME,b-x`;e:#>bLsUD!RY ,U a߶mf2,v$w['  +pzBȼsOJT*h﨩I}[o 74T|PZ|cG,-JBPH,3/\$J%bq.ϑg?CV6Y81)dɐL媕 /\]]5B(=if@Ӓ&l|'I߿?\MŽ?o4yO󶚚r0W<[,h45y\.q/ KQEM2$TCc :;)n~p  '&GCC*n0 ծ {GFF aҥ3H$~?3Lo>ZLl)e9s_~hؕpbٳg^Y۸|{NL!U_hq卺 7Ƹsw* ˲aѭ1| a/ZЁ$|w,\'J B%$<ܠP*C&MhC+Wns8~:y&֬r Iu?CJ%G~T׼6qy}+ }`U w7!\Ƌ8RoHu]gW8a{D"c[]*  pdmh$`PK3fd2J"HTu 7fD"hL v̛7ꫯg!9* UrX,D"0l6[t=](.}WꮪU&SS&C R5jE@y T*!LP`0[t:}̙p8,g͚0̡C HhZavoljj+ a`}vŲdɒT*ajzjj @SSS|YO5 E"}]]K.[fJX,fͦhnRbwf2}ft7sh<(l6 ,]j~~wzl6!eh6o#ɆɤⲲA; + 4Cx^%Q\@gX"]|OI_~/T(6N-Zz2|>ylp8Vbe*:ދN_iTlsC9 a8CE/\{ٙL]]ޣLX<ZER4Dz8A >d>W.+X!8%8FCo$AiYZ _}>+N6t3@/eWўʐ$ `j B^d2pCCCXLRHL7Z=st:} 0E&&&` SKR,JX;w.(@'ry8tOЁjП8n4kL&e[e<#Q]P]~*<~8͊Ţ1d$/E.Ǟ RP48 08EQ`HB À*Jڋ|j:WU&/Iҳ"i0VC۷/COMM hjU*p8rX1>@N4Z-JK@̄YeWWj B,Șrj֬D" vF9UD=@c|(8xㅾ_C|]$=\-m^27PB#((3 Rz{{ C[[[\)\6UgDw֌AY8`h壑hW Z!G8ʼnKEQ}BŐLvphΞ4{Vyj^v٧F-j*'>AʕV u"7G _ :;,cb<yI&} _n?X3H&]+JJJooiKAXJiG5 EQ"s89 d$V(rNX>HR)0B&c 5<弆 翜 )Z#~(q̈h-~*&w7l8!vGyBh`6L{;H4=/ qxtW e+^)%`644l6FgScf,S=J MOO0m4܉wS XoRBK3/Х |"d2$I86ؠS|EX&vJJ$>eb87\.(=pޒٽ"Z%c\5 J%\^SSS__ S0 e &ILо`XdZm3g˦]v_+aK/z߄:BhJ&#`d6c$-\] 0ۺEbq"}8|p luuu~`I Sph4ϋPf׃]$B!`e;~gG'Ɍe7 2  X,(b1>>FRܹsy~xyAl|'9kq:~UxwOhDXC)$60C.[Quvk%Yk;U r9I,ْ%#96d㱇`,&00 qdIVVnu9ڵs~< g7k~_ZR-V}}_w ]Tmx `X-:2rd2 ΆaTU1 z l߾}~~PzR)Ou<@` U:0%j'IPh4F^߻wm݆8t]?y˗AL>T*y/uuuK.]j`36LAfX0  T!5 (Whd|*\nd%4-Nb@)y{{ѭ! EQ$~sF믿~YQnk0 B2 >vU#UU!)ɍt[X9:azrezPm.=PTl72k]dN8PuZxU1$*67~ttuxXQYHm#͙{> oWdc PrH}̌fJ;vyL_ikk<#c#ŢC_(K/8??8K?s _u-jz9E̯٥LjyMPߎ4BxQ.ozqf=yݢ(^ lN]_p`D3=ܹs/E-Nwt0 XwÒ$u|;_(a"rPUdxZ4W*Qr=ž>d1Q62+dЉxsb~~^QežCG}~}/m3dfhi_jm6ۭT*ImKſ8FnmfjW$ñgLRIVoYLQ;$y)U +|8A ^z"nc6_I'Nu`ϴY^SQ FG:j{Y+y,p "8пZJeW(3,hkx B(,J~ӊ<LkZ(:p0oq]=Gz?u#oF tѣ*˲0r\!26?=fc(MDRGSM<ډ8o6}P:fLx~TAh6M3,Agzzz{jUOc,͗2wYV~GqS?uz}~ ߠRP"W?'O~ln`?(]]Ғ6B4 @8E\jU8PL&CQt:z ~ ð)Q .>Y{; 0%0Hk 7YABՁ~U WUD/\>n!9=&`yQ0< C6::**ԏlȹHvTTSuN?p8NtObA@PA`ը=lf cZM$;wv6ncv&v\V >pzFPf/B<>=YZZ\cyY-,w.Iֵ?ŠEQ}}ӆgBH+D;Or9NK6+?&Sʹu~vB666nwbٽ{^3م`4l)ބI\̫gΜsxp8&''<ρP'|rxxpwQ |>ITX,R):L&FGGakH$p_ZZ:X,ddnڵ 2-VxgYMpa@l +++n{r_,7,Vzzz9VfB*u:f?@X]׌<9b3 xV$~*M#F8>/eY\r%",iꝂ8ϧZd2mJۑ[˳\O?;q)o+ BDžM2WrI|_' SVA(@6B!"ٴ6p$V,Ki~!w8q8؇xp ݋>6ɂ`IN=8:Ag|;Q =}w>k_KoL&oJjSSSמCŽ*A?x{%ه$$h(BSe6w}v{o9s_KՙElvqpXͅNn#f t;l ndV|v[na(aO v;p`aY!Bx8 OD"0TivO7JFg`VC5]0gNnDReii ݽw*h6Vk[4mV"'0Lꍆ*h?u -a m޼Yh$%aA(bT!x,Tʨۯ_ Ƽ!p7~v|<& "̪*賂[:桝jN[+/7 >I7Dءq|> .]!qzOiW׀h2 ! ϠP(=ztppT*|SKKK s:۶mji@zarFFFNg0<}D>+wh&xL&f;p@WW/| .@cLu{Fv(v:rcnw ^VFEQDr΂cl6;Q*Eu]p\nqqj&2пy*_޻wiiijj 8Ϣ(6B˗/]?JǎNsh4@Rz3FG#G^J\=*"ysn[I&wj|`y~t: Rf1 `ᜣנYQId&d4̽aL{O333< r8^3h~!_ŏggʶG7l7hڋ>T"w)hڤŲ`6;Kw - EnՓU`?7QÛQӉfgy%7mZ'I JF؅,zme6/7^{c nNbzX}Jl6'&&\AUD"M^} xUYvO\)t:>+C6%CٞwhuvbB!:_ y|>_kw"fYT Tҥ^.venuʮ=ӼU o89 @>BE˻~,|ѧ3>>n nsD}b^ܖ+첚 jT*_0 D6Uk. -445t:LT@fY}Y3v3Jo58N$IǢu :Dj5aۧ+++u. 2,k4݊Fk#C#lUMéDQ4m6 eY`o?]ۿizb]׷m& d\x{0|9UX0== #x B$ + >o }}(SSSpPy>mᄀN$N< xNiݔ=FX,ء{S;ly'չ7"{zzVVVY$X,O,͸lR!&IHQs}~wbkUϯ9 _t{͋~w`rq^[4!ڵș{}V,]w PszN-`-D)AO>z<GioF#040/\JEk DfZl6gߕUܕJw7}z\.Nf{;5D' CDZIK Lo儇_?s)38={6B[\*AQTP,/df5j3?meӁ \.И$I`\.=Z6\I_oVrP9:+W6q(Jg 8Ө{XXGO{|gfź[b%>|–؍t5ZuOuD`piE2"Pux S:66ߝ+Nt.dl'40s~'ً03##?*D'x:j|T*A3>>NQ˲ q߿:11 b$IZlsVe&rrܪ-/]}jX /pN<0~[oa., &:< r,A R׳83)$2z-}޷d ܒK+nY{z{R*J$R#1A^0,^yt\W Qd r8fܣtnXTۃaC}7`^;|Anp3PA-qb=ud$\m˙0wbr/$2}Mvdq!u2pBYQT R yI~.vw[V!ŋnk~E믗n>r/EDU 0D<7dDP(L:튲/\]}=OwfSPR/bݾ>7WnZ֦uXIs?Z|>ےm(K;$[ȲulŢ$IEUեW5]"D:Ҙ+y^h4 ===>j,2xlnRrQZٲeX0Պ,wxBPH]/W z-X|oeu}.˵t&WT~y1X[n%@1L&K }q\|^OOO0Z-X㛮4mɧ$ctkaf ua=!N{:lgD( BBAӾi2Qmqv3c:<4FhEӖ0LѨ ~p`?r0@#3I5 IDAT&Rɹ}adz?ўC3d6뺶^9? 4d3bڅ"TE.B-_C d"Ak8B8pL{GSv:E˛~αIewܵqa\#"nᰠlx2AOPp C4}MpyvmWҲ`~7 $lDZw /hۆkO[ޡ _9m64҇̚U/_0`_ Ei =kSMYXdelH</hz ia%ajnV V'dYEPf񟊢, Sb/.iT߶Zb6V- LN=R> ;as!O9N}xWV$,/Ě̓)YIX?{IYrOkmնRҷ 'sn1qBmox6BVx*:YVw PU(;Lz"y dtefV ' ?2uďqN !ܵj!r/i4!c݂[d[i oy;;/9ЭޠUE':}bj2 d #q$I-o[}!Ɯeoi hOwc'V- waݛta."̳ԽˑH\& L&3;;[*,jiZv8č ~.^O x|Z|3{`l$N,.#{!W278 «.z2A7x:AQcce84 b)dݺշZ'T*zX-aUUKRsG%nSfcYG"50Z+ Q [5Ed2bqqz8u(>o۶mcccŦaŅXv^d2,S(@T5bοiw8fgϒ/J$wl\7T\ьzc cNl#333Ƿl򅎏!Gg(^~ðns.<χf}-y<@ۑ0½BHFѺfpƨ!wu1HIlmn0o2eJr|>.^i4p)q[HX2h:&l3֞bۼW1}Ƥ6&ΎXN^8k>Zv:#ވ3, -J Z[gF?Uu,abmmq{:JoR"V]^Jr[*.'t: ߥ 1 k A2z"FSSӇ~.K'FV1)Qv;l`CHōTͱXjZER$r? v#KqW*MIpw8nn|'N۶s&^8H[,p8ːu-˩_olx^#WzX7Pp LKPI7e Q$ppp(*W*bN:iLvj;t9 LCv$iXv)T6%jmۺu ;\.r:1gNcn^Z3yfs٬+. >'2՟ j%\z77)~k|kOQ+%[K" s_(viq=IVi =pˍ B~[DtatРtيp8-8!vC۲jϰ<8٣=n?zpckCv׭a$I3#E;od߽$hXzB0 UQu]Ǟ}nę$Qطn鶃]7H2(m`ddXue U?fxڏVW{zzDph G#I%HlRxP5KrsgR4Muæ 9n|X}b8vc 9 U*E&T|l(ڱ T6%n t^K!pBL:Ajxo<ɬ. X 0Li̕&&◿66mڴsNS,IL$JEUeyus٠\MyM>!\>/ Fx%?* 0Z 4=X0fU;vN[* xؽD!cӈ/Ҏ!fv3Fc^NS&\h! I=ŭғt $V5Hho<v"t//G&(ճdPP\|]ItY#ޗv'H&T%ZKHV"~6 q؊N,>FC^D8SB>w#4X~h. Y[DF릐X~oA`__ ۷|*?.{3gΜ;waXoV$0V_Y3jZt\ i`0cǎ۷OOO׋|2w<ߴi+Wfgg/]\<Á?%D[tVKlݚز%JYVYkH.'k禠(#,Zs]]]X,bӧO'A0{twIF}}}SvxCCM5fgUU$ɞY]];U `.],5 iai :Φη5qJ$echÊZEήiBgkc`L&F?Y3³^.-xZaeaԺB>o\o@ݖOleYP@bqSxmڎ1xB>߹_ Co<<2t"Ȟ'hAu;0vxX|-z?%+ y,4ݴҕ={M!!ͮJԍyuUtUS ÐݤC*^cIaY q kkK|9Xe͛lw:DB.]BSȈ?_إyGDlQs8BΗ_^7%|@c m|M&]׍Hq`?oV*Co]蒎Z-+5]-=Tg29]jj6c4UU=Z9^H&7 FފtU&$Iz>=o!$ V·CM5Pt* 8ddC7***݄_HdԜ $IV*Ҷ N( $ qBQVǁP(\xq}?D B*2(U7ŲDz,jZ{mȌPZ\XcEA8"òlvݎ<Uj !5{ݭMQP(銦iѿ7!u Trm O_$i5-/Eiv[bv) I"h꟭EQx7(Rժ; ;_r^B7歎F\4+}5H$ n/f]فBfhѻQEN|v{] Ҋ"M[[ȵ߫Ñ̓1`;Gq*opJ%H%R2a\t @t_V׃ @TU`0XArA@&JDf*H>|nP* BA47L>4'յ}v ߶5VWC 3RT>ڶmݻѨp݀0 oJf?ҒajuRi~~Ru]V&)l2t!eCd09r gA_!&0QVcu]ܶvilYUU]݊rXQfM|Q LdߡKJ n4 EB$CQK߮oȶ JfEQl X*uD5P>{rau5Ƞ:2z=FkA2ٻG8$ɊeT1)FsB@BsӾՖٽ =v㍽7naZ4jui)ccOZ|>ϲƣbfDcԃ E<Me2VAiiSt:˅\.ӡ~+ɓ~/8Q.[?A/b4[7RHTL&ӱt7-NYU}-ε+;Nft4Vjge606A V (/곊jۻƑ^JPe#+>Vkɴضl#[^/]iMOKWl.pnvuEMUYuP=|ꝺnpUDɿVRlm 9 RZ{r<:Z?Sv.Pd4^v5Iva/VUz=^A_,NxpR]a-+ MS gBN{K6N4P'VRO ,8.w$f 4ʜ: Ώ FC>Av[AVkl|QNS΅G>qXT욘}|-HC?d~A(ȋ s e8Zn܈rBіϚUUƂn!^l83 0dRUFVUE t>_XX릢(> qP(J-//3 듮X,BA:^\\LӃ]]]f3N-%˲,$IVv]]],"f{:FQIOz&)T*Xga6z=(ͦRr,LՀx 2GӁx&& tTzZwt/d&。m=|:Ҵ)~0Dјؽy$ya>msl޼y h/K@RB>" U*[ot8U; @/t1;4J #:EQIm~Wj72tSӟ=j}I,z+;<4݈D= B X ߦD2}ankώM?w˴R۱ ZDӴk)^7yAKRToz@.0;SOc.AW:6J5擼Vf ӳ&iv4N_\i{:s67v:'|7Z!q>{0- #c{B`0X,^Z*# eV'ʅ0,Eo.9">8Uժr;!~7iRnx*_%,qhf\M{ȕiǥ\N5ZVw!Xժ^Q+sVՎ+m-IVhtVx>gq;X՚JTUt5"fbǚIӱN#F}'|cf4h8e_$ Ma!'O*b o)"HSKK;KuهI ?~4~N{zlt /3|GSTM1!$|1 a 1v8=u>5eif]W:(vAYdC4ٿ_P?V.}$l*,˱X,ᱱp8RNsN'8뗖<T'6M$իWi,4aIZZZ:׻eYh$Tb#IiR ri[fFhBwߍ_w]~agf~M3ϧZZR2W \.#b-e<90evZ133vs\4upT*pC\@  ttHK1d<Ʌv`8ʠ(d: r.NRvrvE= NaɴjժR4000==x@T*DQ_ģd@(顡!|q<@kYy)vH4*Q1,B  ul ?( Տ>avRirrd2A0;+tu~ƨ޼i~~aqvxS8υn7Of |Ƣhvph2"P7h0KP):J~"F0yŇKjW ˝pɬtjp bٖjڶD"1<<\(xjZ)|Kݼ}"lF<ޡ!%:}J *(x`WR)EԬY3H$qo3r1NQORlv-=SDɱ}!p<~[[[sr9h4ms_L+IbSu9***( CSS՚5̷Y14sgֺ:/P0@ H =z4F( | fff> ^$;r ,Ȉkkk;3EQ, MMMBtZV y?effRpaFf+**]. xN$ enIlxp@$I=Ϗa(kgg O?}xʩb#GtЭg%)W<w\.UA ?sَA^d20T+(rE9k3ͽ!qS2 0(RxHyj5nTݭP(8y/%dc_aVkTFU*UL&}|+:%ޅkׂe=Cg/-bR4wj4ĎR)ZD"SbSMD\D%1lVq5fL BFa"kYF*pxj޽|B ^ QiK/<̳z,] ð, A5N\&}j^żTokcNE` "GN$0jB\XC1fyNY`KKfErrРOBW_c_Mk CGGSKˊTIFSKQ%B_n.9ZR@B1PlzىN>lfau\зFn7we-[b.m "}ƍ|UTW}a0%VՋ$566rcǎ#G劊r\(H p8 c|d6M&j 0d20p.˰ǟ~UO$vϞ*cuuu cYaizby EWW_mZo33 xEVkDhJ c*PSz; U,jJ<ؘZuyf J?L $IedAȄcy4vD\/^*Q !$1 OZ9 VeCɸu :N7>{|>/"EVmtV$Iÿ'?(VYo&s;p.($C#It;FcmmK& "磓EJN?S8{x'BT*566{^YmڬM*)4՟׽!aUȼGD> Օ+7o ;^* s %l#˛n{#A*fHѨT&E6FOxrG8תn 544\t:Ns:\Ըjd!wC9ZMc. xPG#c&iJA<hqOO+ՊAb{{^UHD"$IfYZ ~l |D&@]=|,9|>uaVa|y#L&0lQjd@G;v &O07:v}QjY^A]@ w`4 .+Fm?\>@41 DQd2Z s($I*YEA/R.&gԍ\=(z}E(#I'P4 #ok4 ?l*ǰVGCCss4,K+^ 7']CC٥%1u:JwZۻ}htk!!Bqۄ|#K%KV]xMտ ql'pƏlIfA"۱bc}B[dIbx\.^!R|aA=wgNyD&t)=7IKaHat^{WȘ'%l:L&;PXI.ѝ9bq"vX\ kf\.7>U[[yl^y "x%x`X]S˦s7Ȳ|p2$PN"bN^Y,"OEBCCCbqйM'&mh0ßaPR̲lEEEGGG:FlVFZ-6rhb"I(f>c^_fۓ$< D%V8Z$]vÇ㸅\.@`sonnȥ.RIEQ#a7ڮT*ax:= e -3W\ brx hZMցq-guqccjubh4@@Jh}t@{z3ߘHaW]%xYz׮hEI\*̺:hݠJR)D?t .niij:NՆB!AK)y޶yYcdPs9$ p1$CRT,.袩}Je2BPG鼩P(@eGG$I9d0C.{}&!`%/,,,jrrzbEAxG,Ae6 d@4$\. Ͱ^Ot[[9眳vZHy[XXػwRkkfqNK&f /lhh/$wlee%}}}SSSǏOBR$"EZe$ =A A`OQ,-^oee}hr۰TRLX,ǃ `aXjNa,٪*T "Z>x y@I$Ju\ώ[JGSˋŢ-[CPk_oH2yj?D",J莾ۻ{+n%ܕ>u+w\F+ Re8a,#@"VBwrtE3UH.%=) i'f ,(DgHoF$I|;$;FrozYer~i6z0hgS\_.N#Ph0BjX.op_^g3Qvߕ{A $\R:CjBvovq~ ZVY=:99xW /#pO VMM uuu9+3쏟?[,n7|:ޖP(D;^[y 4 F܆a}myGyéTl6055SLS jl0߆<σt:=22233CK`S`gg B˗/:DQT?9jPMIY6Nkii)t8[UTTTUU YI\d2Bhң`$YFcS4BsX,ʵ9!DyT w-"q-XZq<!$#ّc~gRD$B5+0B2ptj={$J0xZݥK?H߱%uWkF t:J;_*c.eYrTAٺzGeMFVYϔxf9"}y!ǖ9Y&#u}q!I-B>_AQ䜝/mZgkv}VM!' 蚴Hd*$SPSۼe!L"vW. d,?~|ddQZ(g/I!hu8*3lTlkk+vz~xNkmn dFZ-}NniPmm,`- Dz,B[ӉreV AFZ8'dYE !yu\x&p^.NFûޙR)Ѩv^h:`6=_ny^jLh4Ew YfU*aԢ(u0,0}O~0H~?ØE~*XI ER" ,k3NQ@4XIs/ZΌMf^j*__0DPĿ8pۮvmyqZI\.dzl6fѨB$Ps܄;w-e\gff 1 #I&zVj"!FŬ\R|>a̗唍&훸#D],A(PjjjRYFLˍ\aË4bYjJ6 sl6ltz^ ^|EѸj*V J s{ぎ((Ъ\6ed2bŊIzAFPWBdRR566T*۝d׬Y k;'L& yڹ p(*y^BQTOOϋ>J ;O;S#?0EAB$0%reMX:\|^R0'$I9J8{(|:v:(8^UU~`˲y95K񦇟2[kʜ2 گړG y5Z_bQLð[}=diۜ??ꍔPہaT78#˲J:@zz=Bhdؼl2+hE0[E~;2Bl2zp`tIb1R/NrBxP0U8Ꙟ. `no×jO*:gJAАz8*vve:<3X Yp/..,K(iJepUpRX,`t87 R(Ft)K766 i`F;A6\p8<22zqfyv͚5@OֶL&399 \~<:RDC֚L& Ĉp8|r9FS]]s:%DQ#"BMM7pxkibυ,l+5ۂ/:NīwM=C} "PG^iSk2t\ Eblx,_)<pC 4Su_z|l|dt$LJp84m1+*;~^Ce$):TjCxHn߶a9_è!֢>B{{u׊ԺBm>MFXF-B'hD|!@yj"aJ=|9sjYdžcљ!'!hhT--լ 3sh4"Ƿx t QJXKaN*qZ@#/06bVIhbR" ML mFNs:T*NJ- Eur0\ɒ$Xh3LАXYRSf@:NII yCmךվb*t:-Z.J,[YKKsss: h*++v;6x"9V-Z[[M& B\>vMӉDLDyMQ0䄷`0L&(4" *c>l(BPSSАf555.\JF7'&`mn̔:h"-%d Fćcl2?歛nh=vT@A~͊#$>%_V|fn E/m[ii9*0 j`Aܹsf9eV9&TCJP(:"4aW,j"4xGVj銪Opr*ʫP~ԨVgaۭT*һ\.Ob{ s+obP Bz-kOXJ_"Ovs|0,K bpg5NHSyr Н( o(۔}$I=حccc5Eam/y$IphkxnW{|]]ݲ.#8AA@"IJRR <ϕJ,b%I=$ 2DQA2NMTqOqBsW5 $DA.$pa`P_e$I,G ' I!f' K\S(*lќx8/pQrP$a^Sǫ4B!P2}n^VB3g,ErQ,J @8='^67?RDh,=jH=4 !tzw0RxA6RT{W\jn&r9 S[/e2556K `@0? #odspV'GǏF @&r/[w ͏\w###溞R>oeNW,{?܊az:cѠC)$9r8483B/)"u|^5!KQlnjjeGݞRfl#"brQ G &T*#ت?{Dro-15* ; UWW_kzzz~~>NϞϪmj ?oC! i4e˖$è,ro֨ttA4vX,vCQx.zM.7 ]:m*B_X,v=@Ȏ)!4O/hguC 'ٚ{84Mk4zgbg2샔GY#CGgUWXJ*Uh)~x tp-HR! KH((jp ;갠+'~E *͗_a d2 1>d8Rtw7ހ[A@^]]]* f4ly88.N8RI4X p?iZiRi.%^vСIhAԊـh_ Oa0t:LJ:jbo ӠL2:雛{{{@c!LVWWѡ\.p8|t: z} ha 8aGn7_<O&&{)1 0|>\ 4QM׭r\1Q<yA447]w`xǧ[pm"N#7=q_{./ EIRPIȮ*/<~# +)"Nd QQc}W[&w=S?R̉l( ׏L:J$X$)If7 A,W,0YfKF볙,aJ [:OҐX )Be }{!xL:uf~R1,8+u| E__wnܨˏވUT$ʖY %ƩyK\.&Vl2JWay^:#fs[EP+%y/`f'I&IwPBѪ Hrٺ|!jWt6vqFdҊs, ϯB&epffvfӥixSLQP(JҞjq~j*5Uhxx dY^^#k$qiwtꎎH$sK!Dx>^ztJe/1]J&JS8<W2zvCѨh4^7ь5A+D(q}B#FT*|e~u #$#쪫yiz>Jr,G_ϪutBDd5=c6 ?EvJ=qWh"H$4L LP4+VhmuI@BvTp̉BDVLCC$..TUU ]gӊVD$L5nwu1sOף>SH>脒$ X `A רtt&t:a 8qQ!fxTUYVދF+U[-&j*he˖;OLei1˒<]{7EQ%ZAH18,"Z[-Ԯ:B8Nv>d6l+.zrTc垞^~M'ngtH"w^~nn1 {!BݚisɤJ>ax1L[Ez{ic-媫U/<'Y: ]uZTy^4¾BPZ?/H6H&eYt8Av\ D1a9ޜf˒T,[QS9T <_فޖM'd2YQJN`p2ӏuܜ,K{L&XOR,mll]}b/ˢ;/q)J .X%.z>2Qd2 yJW\UT!ԉBL}K=.$)b} Br(㾣R-R͊ l6 ev©ݯ%?٧XXt^ࡘFkXfz'\BȂG7G+gsvk 4dݶw,s,rVsKKK:ٺul '!bjz\s addEpɂ T*Ɔ|>A0laa!َ h媫2J8 R j5$l6hmQ垽ݠ{7S56ڡdG"YحSSCS*r={DQ^,asssIU(V* ha23*&2&"wd٠wjזܙLF6lmj-UBм4Q:E=$HX"Nϭ4d2%$) 4=ѻG'PKSR,]KDd&_jz}7GcW! Og^ dUW0 Pܩ;/S(bјHb8J0LD k}v9G& Y8?7'+jۜ1$Y]] GxXI2 C,Q0N'qexAp]6Mv$IHu\dP555\6 8_S ,duuufl6L8L&Xh|>_$X,V$I_,*JB]1BH7rl6m6ٞٝ˯I+D8j@^C]\v\v}ŊEN>HgժU biiiϞ=`BUUU===,B3S$iFD1PAh=v jzթTj`` Ji4yǡZX|؊b1Q-ebtM8t<yH4VjPKg9mK"`Q # !rFIz qpp0.[. BEmK>p(/!0_,@ wKlwď%uxdzRlRq7eI$y %r[[Md0BՌ{P|>&9ež&㕲ly t""JBYWH1GAVY 1r !-{^(,K.nD|~, <_-a ^.wEIKd"^}:#$b^EA(dN Cѧ,Wc]yA ˆ&q.Y՘,U}m;;fskMpwڕJ  IDAT$Iv6,)Ͳl= B8L&e{A<33o~QD!KJLj|>T*Br^/}av础`w;;5,(Xp:Lҵq閝t(:UL&M$xۣ[2gVIf,:,ˢGM4Mӊ(q 55j_}S#w)%}T*8&* =v=Y>:v ^`q m7V!T199 W? m6w9$ϠO~gP)ٹ9YEQ|jp8@KNw E*D"L&,B"NiTnȲ<22R?g`$wU9nedfqlclLp .f }Y`òlX؞ьrn9Uñf~(Zu=<_VA~q;ln0]{xJT*lvvvl6J֛>"B#_`UufilI$ jbx~K`0@ކv{<X, +++DuʁyO9[ouppW_U@biJwww8kb1ɻ9Q(b</ PVFX}iFj6#GWQp0S% Y)];45l( ȆXAr>VJkkk`OV,ӯ9|ѣ$I^ qxeO4沗F)$SsԒb^u\XH$ Q>_~x꭯'Ei׿l63 7?|kbllՔLEm<<_f2pکF̩;>f rF3L(}IϏRlVO~w \P QPmz%ȬӴfP`l}$4\>>ҹat]7{ 8N)ϵ$]9rDf{!JeY KDT4\uhRǭ]D.C첦 e?b7|uppp~~W 3zxU(WFaVS{{GFQ?)JMDdYFT"C%?olsk60Z &˧X,f6fo+|%\6ګ(\ۢnw2Ѩg֒pA7IJ`,ʬ8o6cS { ˒mOvrM.Pf"=0!$ ;gd2u3 yU@Sieaju瞶O~6k MY~~̧Cj&j2$ˡx†]f͖WKpYwG3 `ٴ..U q:AZJ%YN]+&议Jh4:mmmHrCaK/1EQ 枞Eo뺪@]0r^5ojumh2K:kIR3ge$9rX4MG[-I߿z5x|{Ob#;XůCM ]|^UUG4\+++>,@DQFq\lTFLUEv |buu#r^/hh‚`شiۇv;??_VLl6L&O> ~p;!2M(@^q\.gjH$BQegb\_( -@*b:yzQϹJSݶ}۶۷gqo6mۖO>\._-| OD"h4=8D pp;?د͑iZQ2LO$Y Bbʱ[1lu!dX17aj6gs€Zy\~[BAH$r7wtt&{v7lgY\GIZ-n 2Et]ܩ05퓓ɑ0Bbͽu+Ľ2<ѻPծ>N$01 Z Ɍbw;6hVWW瘞+lגl%^D UE&I:ɝW}3a򆯓Gu% 9YkLJg>œ:L!+P'sfsRirrZ=%<mÐ몪V!{]Ըb[Mbe/r) H8.ZYKEn 8LDBa,JRZӓf2h.빩nNG@<7LyhN: ҅ !&u&`2kdq87UԨX4sQڐw5`z>B7ͬtI]uEM<n2*_5LAe9$6O)1EQLA4Vފ1l!l6ñVe2 672k鸁az=Mٹe#ܮ<ɤC$H q+$uۃ(AͶ{ە/JʲDЧN8GBP8y$81i5q^^CnFJD>#!X,~Xlľ<7-pF f3DifffNif\q<_n`YRt]$xJb0Lf{1r9ޘL&?22,[(h^]]U`$ :&eZ  ȏP0jf܅%7;;Y1A4A,al6h7ԮNŷ BZuA,WDQ#a2Y]__O&v`ں7{ak]wah"J%׏I!c7 BAn߱,Me<j B> @ 044!K 1vЇ.]d Ғ &, fj@Ktf}ⰸp8LPf3laa!ϋX.3 lR`-rHXf>,j/,IZq:::ɓ'O8!"Dw-R(mIUT-D"={ QH\.iZ$b|CVSH䁺8|D$Y?Rj $@ XZZ:z,_~uvpےIҥFQEz9ȇ}tAj{P($Bs?İذ/VvEh᥄g?t65k(%D@Ųv]JVua4EӦ5aʻQ/Y"P۱cY|~a6<iv{HbUw tmkBl[/U0 '}Bèډ/Hxy 7uqs&jCl@`W|~y-K DIX80L4 rleYIUF4Etd . !s-,,@O IJgW+fOS-Odb8M,ˑw2,W*55E3'aTbX,[_ˇsl5WQ7A lf5wZEQxbg8$ġWػw4pmyǷr${*-6Olݺ=. ljaEx*s0kC+tj@af۵kWXgYe@q~6w~-UdjH0 /(l6uWYV ,hTm6l޲eˆ,*: BaEIҙzkn?;vs0ϟ?|pպ#e( g7{&i,3j___:*DkpȟThCHN&4Mt(F&IO/(lV[\\TUv`4j|iipxx8,--( VAQz"n= 33/NMMB7 R$IòM {:;;2s|>E- M0K$\-^WE^/0SSS,˾m0 B>7}u8NT piHID"uBPV;Y^obg+Е1 {LY]jo}UT$g\m YF-dǬAW5q1\A2/Dr\@aBC˵{"B^ߒ4u CC=+\t$Ϸ N }cbUۗFFF^T\@2 1rW5 <O:V!499q^jobXxJETךxĵZVV4MeEIl;(+c6^hHl7ZX[Ν;a/.bGG9H$r7Ο?_Tr2Su[, c&ꫯ޺u DQ4 v=LB p`DcVuii)J 60 BFzGGHd2Lf˦Ķ-qcw8ےk񼮣KgUMtlޭ(-YGoOcE `*{}R6-;NJR#du:gfffjjJCqXaOSW쮯Pu5FDZǛ ӊnM˄z[lR|3Ҟ~i2ՠhnj9{><\޷o/HbssTjЂSSS }3>|M8wAYe-,K0닋0Tٲeen ǵ~z(]\nooLt٤T׽ݭ&>O_ sX3`021P]idd ((f2h4p8.+`!4??,<`6 )JbB^79&HD6o\V~;dNLL@ q#{ed@AU<mݶgϞYFr͕J4MC*,r$I2u /K ,bNRV/^u^osYVcA|rJ/ˀgzq&~7'qwXB"Q6aQMolw>|޾8i0L_$2 ,K|{s@#/,/*b2:/ HF1&N_v^O0U0 cm%UW4Up<} kE?xp붹/ -UEe=f#iZS'uq5lmqh4 v JBcŎ훝k?#(_`k>UQqE@AIO;0f)ȕ+A$׬Y3Hj5A/|D"0ߓ+0Kb_kOeoyVa'1!$?0P(4/}nt\gXl;qpiDSiW*T*EQӧbZㆁ߷%lnU}5\rLȣ=*0W7_/ ʊRRTj2U!pB%˾cgpy)"}E֭$TxYaHJ!X̖ٙ_W\ Ä5GbTNY51 ӣidӵۓi:Y w6Ft%Z>c$ID\oԳʓO;M~(g2KYxvj\CCA$p|؅\Ktf(l?/qTQ(I@ `#G~b33詧Zrynnn~~v-N|jCݑ'YG === #>WTd6 U++Oh&F#p fggm6~+YBJT Z6 x( _[[EeG h4+++p7>̔^o[[`WVVf|2%(&H EQ}}}g|>Jƪᕁk. l83 tt)ɜ6p nf_ prjʿaC[[[XeywfJ5~8ԩSy F#};2LޠoZ͝׆`N<Yk j JU2,Kc-n tJIBUCHDZFp>T֙Dm3v2ݽIUUu,]k`81uI0 (pg溫˧ϔsN4Ҷtn(, ) 6l%jJҌr<˲ [:P[ybX.eW\nkZߙȘ((Hj AY/NތfoJ)bqeerti EQl;" k(d9k IDAT2`x=== AI}=+ IuvvCpbhS)v%I)2L&=OGx\ #q\%(0LV ;z05-[tF|ˍ`A%S+Չ9 *73g0,#^#M۫*PcEUUzn2+v[d/1+t!pF"v%E,C̶_(D"$Iۓ.a}UڼEC;-ܼb+ZUS@q«<EJU5R)BGCr@V2~Kfk4\/q\SRU5vttҒupruuסfvaNO]G8D莻:[Vӡek l6u;sai4Hꎎ߿hmW=߅X:W`Kfm2aG5000;`5?{R,2 l6A2::j{{{:X_h4 ~Y!d2x0LCCC6M幹BP* A3%L^xb1y3L6 X.atϐperxA=,ezu020 ( &j+HmQmfЉ㤕t\y%IgϞ={lՂZ Mvhc.QEODL$r\jiw;mtuy1 +(wu9f{ H28ط H45!#z!8D8yqrTKzy#2Mx'Ym C:Z/gvgAe4>1p,o~k3ò;RhfGB( O[i8䎭cZF+\h.MWUUE:O+mw~4VFSPUwc>?OY W:Coj&<Yz)ixer$iL& J<\8L{VdIbKKK(#A n;b6[@,ִifuÉx6T5Ynڴ`0=K>v{$2 T/N'NQI;Bo*j7E^?];eUUuAӵV*5E%I#0|țBQT(R]B9 &)JE ! M&s~ Ƕl6b$eC 38.$ER? Fj0T lGɲ1joch ?_iGF$n=<Fud6o}LJ|E`2mmWI`YH#*IDZw4}$^T)˴&jBZ^:/Gi7(~81 dgC[ uQlS0PU2]]@*5[V"̦~m-'-xaFeYN&Oߩ'A[U6z2HpGd{{;M4Mc`%σd2BE;m wwwA 6l&鉢.@ ;XԱ,KzRY0fH$ \RPt60Vj!D"e=J` s `laGPK6v4]lk8AxpVU6«lⰓ{Pd()j5\б^F92|Kn+"P\u*r6 z=rG+k՝Q"FQGGZg3kNJ!ȳ.KoҀ MmJ'UuJ/[ 0A(h ,˕/s)srS}?ðVTb3kXP(L鿕4 N|JofR֩ordvVaE*6S碟ģ>JbggTdQ}q/(?Ћijdc˷/7MɪiU(YEwgZ "Jo60|oMӇxB op\F$D"+S8˱5IW0 5j1ΜW8fD5 =xL]pUxbղXɘϫ[,fYmNBWX_;~)lݠs+,w9@B-MjD\}u H.o +ou/tw#QϠ#螺1?|㗈 UdEu?]}e5g=)BHT6Sxq#Ơ)47袄0L0麮W L>̭k\:jEQ_hÓ+cXW<϶sYnKbڭ f,KjMC,'0@B΄B?)MTMM:7=Cń|g8l6n6l8N4_w9tuue2$t:+ ^az.`B(2˲㫫fSu;ߩvu5 qxt:9[TG}B= ?~ر y`Caث?qЈO`iHRZ[[ RetRӝCJ&Z-4ewdyyV%add{(Eaer,EQ۔[OIب7IZXZ-qrFe*B[C'^wv:dKt[[l0]j(-+b‘j \ƃ]HqqqayA17BHU2O[9I{ʂF#H|{`I3s2 g{vM2`j+Ϲ 3KmYA"jT:(XL̃:|`fI2G"(,BHӰ7w*(S8|$zRRi-{> vwbm5yT_[-BF';z=SVE˜/'uL&xA500jc㋳sS Ec1leWUG`eb&W%Ie,D'N5j53f 0HCK< LL~fn&V K&{ bV uYV1RQꩤ(Jtvvtwfh87]xa{2e4RhVn͛TUh6[N# Bpp؍73gS$.h4 rEMsRq:bYeY䶵7mu}bbbnnN$4M|{zzi*J_#$ _^}9y;G;: ־+ю CqL6784rL~rRwl6k6, ې .8x_\%pozjiA+<ϟ8Hƶ|>*> ÌqfJJ+zzz"=guuul{j\km!byY+,,d(&"H{{{Mz:ikj@3Pjxl̰y㎝z{B7oT=2kk^Cf\պ\ooQ'^Mh j$ְsK hԳZ{7bBEEGٹϦR)UU}>b2hggū˺Uʙ:t^4Vg|TD߹o8~OOMOs؅uswq<v%y [`wuu|M'~Ps۶ @%3r.'B+wM |pϳ"+fC۸1O]ŒCL2Os6Dz$I(J@{S),od|#Gvzݗg5Md\ {4:,S7GKPJJyԜj -nnX%B05ϫ V:id«׻t]iJfT*e58O >6Й[۽6ÑQctZY=5ƟD@QVC~H4ؾ&QY;ܜ1׾Tw59X;OM=L٨P[(6Kӂh{iԩa#FY?w:vc!]&[;1~*{{Ko}zvvN~&xīn^v#Qi?Cpl?}6I2x2a#}{F|ZeX۴@g*x+#]*Y @jU*Y&߹:aF1dS8y&6#& U>h|Uvl^,W! $Xywvvl6 6`ypP(Oah&pvA2r`fbD)lTJ 5hۻ* /=t]_{̷GNIoVp8qmKz/ӵZߜs8];g>a⿯}O:-[~KB- m[|dz8Yg4hV)[ڪut>tۂ(I񓿋Y`u4\6WJ$IDEDžo"Q'~M6 ݏ6mdȱX hd;[{O^! y2HeJR@[Jl A)PHwBB {9)ٲ%[- xGJt(-u]y~NT^uTѱD0E=أtz81XY W}-Ŏ.h˾Ah4 F;vL$ȫ|6fsEEzooݻEibJr π ж'x5 f300ƦM/^JݫhVX>& mnneDN~V:r__ex*w #F7'>9n TT : I€Zit,fY 離(f@24m2Y2͕|>w!|>|=X[FjF^r0O0L`Ԓe '#}}rU(4MKoKɀ/aZ*%PU:T~g2Y P:˗7un2\=²,q_\$6kGZ{qFcR6e!$W7x/=^q !Y] 絘Io})FL$NUӻ[洨SkG'>O te6J###ThR&+ eԵ 'xJGNBJbMO_/NQGC B~I r㳡f+!53tnKPgC+;Kݢkw28zw>C? BJɨR Z/XbWw-Gn*Ozy<7j4!Hz(guZaS~~H)M7s*Rd4jeYĎ/_J{ຎ\@8*$@T]%O?أUoc?c7߸wnȦN$pfr:,s~QRe238+;@s8d[oL&HjzoV14]__?:: *rL&0֮][YY fff#MӰ444~8;plNX,J Z: - TWW\.dٽ{"|ԩ!V n@(r~y!5M`߂ـ^4l ȁS Ctq?'xCបSDkk롞/ً/(^S׃PH||,s[ne|  hP#l&` '&&4'N7 b/RP7R.*d VihG2$s\46\ yvG ' =6kf8ÞZr'b"lkkq< r;5ȫ'q,/,pqO噁ۊ3ʭ?JMSɄÑ+ࠐl 3]ٗ_N#VG*zne7$8!Z/kx)Je^,VYs֧l x7͂lW\]t!xjQ\'Dl/ 1:L@:nG9sGM6TӧO?~Nakht333 fٹ(,NMM)#"J޽[A%IoP2CT*ؽ+8d@p^ƛ*:ZF WF٥S#!0/R߈r;o.F/%y6ԃkg?pA@`pppmmm@O@f4x2V2F>/6Vk:F0B VB333t!rEEfW,z@ F hŰSeu LJe$jW3gtX, q⻁d4%I* CCCp e5zs a`ʞRj$_v9PQ &Y ]8IFŇH`0EfA$ŝH殸6-pt:r(el6Lm]k}1ҴƦL$I.sʕK9? .jkjFFFNtuVyߕWoCr"E"?wޛsE!c S;1oKB-~lj4Nx =G^x#[JDHFs/_ip uI6P td?S)JPx&1EJ(%ES7DRFbDP(c b6Ifϗ,}acZvbq,8LVo}.WJ&˜`xTFVOLL@hɌJu4f[( לnomۋ"h.$ItsZuzuʫCmfZt,Z&xĉ6B5A:<22P(F#B(H@|> [[[[KK ttEEi: m\,ᛝ3g xpORG8d4ѱhѢ{^a yPNGQTEEECCdWWB[q|0Kry߀B馛z{{AAӪ!!HffX,J"0w\fv^7P.J%LKmmmGGq079\.$6P`i88Z% ǧ֮{W3#AJh2]{ɐVUQ.䛚U\Qa[b˥y߱cD'IZiợneU _80^S0LPSd2! <>l\.4X(i3%tw>Z{jsZa6sNuuu4M't:n^P;x1}8ֶ9b7f{}gx+*I҂R(/JR Px>GdKt:\"eҕnO:th?䒂/츖"!P9;űþ*M٤ U^DZSSSYcH)ߤT 0 dIs]iكOeL%Fd"aXcc@ mrHRߌqBV=W6ou)au'kEnYо8\,f'''%l}}=[̛ Yͤo'{EH.lÇqJxtg}k IYF5O h0Dfd:iHj|KɴDTbxw2){J(eΜ9 .3@x6-\wxxx֭fHIjÆ ߱cG($Ve0&s*F)$dRɩ{ѯ)aݢx23;0 ۳gOT(Vz:0Ӂ)Yd?^e HeF!(W64?5p8/^p8>d2YSgc(yFgMGFe4BEQHFHw\+c.y=X.S#ڧL!+=x/_0Bx j\~ ǏF-꓉4Bn\b3n+򼱱e㡃EQ :D"ںl2#nܤfA$r4vL}b1฾eٞT*(qdV J ߿@o `JeeW\lٲ^I8c-@{oddvkdd=8y~ll,Cv 0 RI 4j!WVVjh%T*jh BBl}D,ü^ݓ0Lu:`9ROuy?FKDQD6[Tp:aB }W2tkbW+WkjbX rypp0utt*dWe<'HR;>^{M577GyHP ^mя[|3t8؃oD"*!ıS(ɢ\`gas\?#t5byNTΟ?>Y`ϧJѪDtBͮV,+xz^곩'Ngiiu" Fxf^]]].=|UtU%Id|S%6%W(C1ӒiZgYvf&q,B"-mӡ{z}ۻguK||NF]gj f9, R$u:ͲlnnnPhy: ֋1`,??~ IDAT0Nd2LL h4§@$绺Ţf$Ԧ&$Ề_VsX,dAU;A& HL愀i"UrVij:sYܤx< Y*p7a.0L;@8 !NWUU {X 6\jD"PKR8ӄ Ȳ_Z@*qa)o_Z\Y_L; <حZWZ֢ʅizP$JeTJ%'бXb#!Ԡ׳=z A?tx_RB6]֑R)q"Z0-?q`.[ѣG?Sr 74M b8sd2YSSCDq<߿?\.(bn.(Z bn͢H # -O[@NNb6t#,!ިMW:/aW\a)^ײy把={ Vx+b3p8t)R{!Ii>O/XKaԮ0;;{\sŷm(J:]h::,taol62sR9?~.ch&LIP[_U Jq\XEom jԷrFUc? 5@Ruu9sb4W=O6=zn ) ɔ||l(J%eW\- BǏ I8N!e`08F|٩]ۮl6뛙 4Accc S$i7Q$"mB4J~I/{V<';͛Vb(D'*ުSߩ? EѲ%B:yKSnn:4n݇6uH$2^F8Bi+'/HJC IQolŇf)BH>n*yP.ڜZ/β 궟vNld~sm}kTO |---#эȵjg(j4e/8Beh(;wT*ɰ8Vu>k0BfO>{ltjm["9}סHln* г{:q2g2Ѕ>[IR8rVLcAm IǗ,Yj*e? :Hr(tZ28uuYgWqxp\V(mn b2ۚ2|XmF_%)(byǤu 4FQ.h!6q% I`H.Ij4rD"^W+@ X,Rx8Z {rK뮹JwN_,,'q|$w$Y]x^<:As&1\Rm;sGw}y:V0 8tNOv-d<ӊALqeNZ}OGNZzgXWЄJt:Ussss0Bgz&PWFf .Mp8ͪRV++!m['Ξ<޽Z;44DLC!ekkW(A1 ;w-[8.bw8սVtooRn' g`\srpn2jp~]]]CCCz޸i ,DAv,h4Jy^ jBY=Tba!UUUv~B i@JZ355aTCxWTTli``  R:GFF~iR0`KOߞNR8jQS'dIx8v"O⻵ٻAۢ_˲v+Q?8sKZ5ěCχ+͏ajrm}}cO VE=r*b9S//rbβ3ePFp`nmmrMObBҢcͯp/Z l\ SaG& w?~bb¨ΙoD-vy]eۯ#[<mmli,P쎌yBeW,xcĒ$iqt>,7Ν;11m6XdEr_(?@Ry˥9.IϷ٫]>R+Vc46Lh& WTvGd6{nק}_B3}~ft߽Hl+_ LMMNOY^ ij, B!߯m۱W?/\\pIJ-FdRLyh(ŶB護XotMMъEqB+m~Əu/SJxk z%d/.eddT*ɲl*r%j晑,*'#|>J- ƨ ΐw`fA_mZ 3RYYa KTYY aАH$*e&<$z/½pC`Z-͓'t:=BBjrݻ"Q].WMMMMMMPػwo0ev{{{(X,ϟ|l "@bf{)vUixTڰFp[v1&WOփU$guuuͫJ$ɣrQxYӖKx:*I؜(N鉵E'\Ar%%IҢs7I¾ag}5퉪*w[#G{i<.6I bّ+8$aeYv"į[~P(Lk2 [D٬$Gk8Ֆ/"[KfD].m¥ {cPaQu^;"~bet q\ш~rUF{Eb$rAz!' jD?c7^:Yv8?}=LԨjJ4if:&THdԨ[]% !Ė~,s]+IDDX4 w˫Gh[`3_I,_{~lKE1[ 1, Jeuo7sAnC+fW0}-2o}DxR汦zϼyʵ_.7tݡ1 ł q|I.7 'ZB'%L=MD:ԹDi25շld2s]s12.qB Mɘ}w܈}﯌<) F1M%YF|mc~g?@Ltl6 =1ՅrYh]lN4f%hL ê|nR,hv1^ӧ3 bYa4556nTӑؘR -/vZ7P*M8bfʰ\.k4zph )n=e2֭[WSS_ae20 teZ\Z}/@ o@;NT* 5΅2Hoo/X?/aNlXiF[`i=xÇO%I:+sD>R1Ǚq*,L\sT*Woťsht(fff.p"Go; 'wuR)kvCgv%V.y|⹍ڈE( /ꂐ7$Y4]ʹVTUrJe$'y02k5,WCHk;~d3VkTrSmmj|UjZ'\'O l.TBFɸGB㹰&B5=+-!$py_ύQ0˗/FbEVLfX~Mz'Yw$X;Wn{8J C+ YtxJkP$IVTT477744W^y%N/\XyS̕et*(P(<^(*K1PCCwQry^ϏA؜Hu &t?|W<IBh1=~6R#Eq*&Y%0i'B@?D,K} ǖ.u8X,_};|HΒyM"$VU;qBoPFy;r$ڵ TfsjxXC1T_YYI:nh4h4ʀiܲ~/Xd1H\JU*EQ&iٲet:74XN I&SR=`(r`0TH-![[a;Rt$NtEӀ@(:u:in3EI2[T(v##nY(Jt:Ն%*!S!bmשT P*^M@AHDӉeehTD0, d51wsQQ&Yg)BLiMmm b,cڵkӊlf%jդjOF,H9%B:}&ИH+2 c]WʫK;䃇n4n2""IUP糅w@ I}|m!scɒ%J0KRAžRt(v׬X T$MKeff|8L.`0$0XiZyBpJ#OfU*USCR@3?eM0ud29*"Vwº9+XP^x+jj*֫V?@c1OFK.8t*++ll4nQ__x,an  V0w/oDr> /nt},~o^o0gMMF ###0d~Jamן ]ee/V)ׯďYJϙ3gÆ ʃ 8εk>Aаw OV8a8Bpg?vg9l Y6Lvy\fKh,ަ_B ֳoJ;mJwHw:: M (Ot9ұ,Λ?jGB2&I/ػzys~YN&5;v ԩ>3qՕbMu"a]"Y39YFZn DO/0DA$H収vyJcF#.^/sMd.1`(*k4ZO: e.2QhG( jll,#qB Yb.KP w(ء׬Yx"ZhK$Z tu]}ZZ>LĂ"5=bd1^E %GGGXCUtuZmMy 5%,˚hB(WڮLRB( JP( Lk=Hd_˄&Cd!޾j*r{6jYS16,B3EQH8LJVop8㵞ב,W [_67M?'PaTۇ H[3(V Gߛ7#HÏԩqw-o(#S7__m8N*I%l4t}a*6 qW^h"ajM+q'W8|}:(^;ڊ0LT5z5s]jEECOrn LdK5&ENGjbjߪa:%K5XZ$3LJGFQb=߹K/S}ZmZw49qDmi{€@}omMdK$uu3px`` IDATfa|zPs2y4HzP49>SA!۽T*8|3Oʈf0 lT، hǪzS X\Ni%o"zJ iwED)/gar)K?ɕU5FM=/^:7:v̷FPRB?̲JgFoma(^ LL.] 7Ne\2B*+{fcPk֬M-aV]] 4BԔ= 9/+lPLt|>Z\.;Zm4T*:;;nS@ YI4}L(my!n{ #ɬ:8lO&0[S*R)a׳_XppM +fsB8N N>===m4ju+[XA~I^ h4\.FHhXfD024MC8  j 8a{Vwtc9iz?55x&E|e%mxEޝa;7aE67>رr[SSlllT|>~lv{st33jM$E@jZn7TWWWTTwD'ܧ's Bt͠]5!$ i9o<ӹgϞݻwC[yƍQ.gs-}ittð -2L c8P'.^t.Oh-ʲi-#$UFHQ; esq\3VIVĊduגk3_K#QUzn(ڠs&SPǮi=1Cɍ**IrhHŞ=jfyeKA )>beO' Ie/{bP\09h0:eԔVW;}_^^W``jYP8WZ(]]]G -[lGץT4o3p2w: b-Iu9$Y X?B{jד7=KMb! JY(<0`4=Q %pH䠂#p>+ x,F1k=c?wgVꜻ'dY%' 0ذ5aaׄ]XXXv؄ k qN<M3=3Suw_Y6\o9GӚ~ox#e}2M#yENKKKhc>l~\t[XGY̛6n8%7/823Cw˚ Ӹ*lgYp0t:N'EQ!hoo;Tɂ=`TnaP|p8@x}}(f(qO9 tU 'ІUUUUO0M0 d!4~U~(du8~?M'EQ`Fqni```]zNN `YƲ,D[,h4*s=C1zqKR`V_.a966t^]G5"ʫ, .EV93˚d-O N t:=֦?PZ5|x\TK'm],L0|onjFX\!Ofg5MZ/b5o)Ɗ0sa*: x4=kYs׾g}4z'*W߿陫Jd~ھ}T>^++yn֭@hߺuk2:Ђ `tN=޽{Au0!aJN'$ed wl6vtt@n(֬aZf zajܹV&"5M-JXfxdopoe \VR$W7~:')r[sB˼jɲ MEQ\. ;c_{g+eAy<ѣj5ܬuBm/M(Yq|F.:::vʊd+ gvuUߜP9@/kY-uu&yC}/$Q++,Lfj uv3vl6*M^y%b4Mdw=&1#žX|64l6ֽ"we=;PBeO>-VUV|^yPK|4:_7d]gVu##IQ|]a`,iR{1 !m""!0 bV|2*k݈ H-9,4M6666nQje(ffk#p+-. ?X./;B('lUD; d`yGT e٘}ӊpMb3Y2^d"[οl6{kRr VTSUl]"A8?Fa߾}ed$i ^Uvxe6Dc,? C*]*mgM[ϜiVn>66VTW;[q_giFȇa};GI$2/@ dYfYA !`6aX4uidhijkkh4 Y48l är zl6{ܹP(qd EQ`BJ%ɀPoffŽKT JQE j(2GI_17g3"I :6$bd0ωL?' BfQ~BsOUYh%ID"rij{۩{SS!YVsbȲ =1 K&d2 @ 066fkF>VбiFd,7L& Qm6[}}j l6L& baU((.piMNNd\.y ?:>k>}V6nbb4fbJ%3U&Ob˖-6myyaoom)[M@85rko:]<[\6KQTOOݻ}> (~[R.lOOOww7pM&ٳgM&S߿ԄϜ/"4&&&VWWIFS|^յ.eb|")084GϹ\B^DVhͪ,°):]#wE}>$BAE.'IrtG]*e/sUXlFnAY*!P졒_h9egnӪü???6]9;:7h:۵K:}X[xfd2x=.+x.Qcc5eeKn8aXi-Bөh4{v/1;_ݶYcElR`080x^>qD5Mu]kyǫz0Z淐H3f3M2U3a װtWrmm"+t Z۶͙L&777777 ÈF4M{/$ gD C_Chಡ/+Ӡ(6Im"Tд½Z3ll2TECUWUUMRp$g2M Bx;<YI’PhV@6 Rxjf`%Ih8kkkP0 mlj>== 8% [[[MthZ3 ˷!rF g; &ĺ^[ LjE׃Pv3w8 @l6:)"@]lPY,t-,,?^ŕ`EJ677EQLd0Ɣ$X,X,*e;;;nZ(.\ ծDBNzjLjB~f T4ʹTU[ m90 eᩧ;Ϟe2ry``4xa:lՇ({3:R~aٷ/J徾K MEWLqd*RZ[{޳$]tc{/; M3=0zAju~J"QT-JcCs ꫯ۷DBӴB4*F譡'lvccX*me@k[K2~*_{}GS /];f qkӅVG(4wz~>jDyScB` N@l;+55Exoe9jǎ֭2taX[[[*?KRhQI)cQ.ז~Vggh =ͻ u;ΙL~3$Q=Y)=C-id:iz=\%bj& QD9Ub>v"eY&@gȇqZI4"mIv d]~.~-Bnw y-'qikx*_;% [tC;S4A> t33a(D}ũ5d"-:[hrI]]ݶӑJD7FrYZ$I~FeX@w$CuX,fnKl)B.`Tv^2&+#l͜?L5ߏMRp@ qiBM&(B:  p}>_\H$RV{{{C_.z{{#ȵg,:I ݐml^ǰB ŚY!f1,a̔M&.B0y 8h4ʲ]z[=}Ν^)tݔa6 Io@Ƈ l7ICF*R,R va^t(2͑HՔoS~I#)v$ż/}iZ6xy-rR 7KKɤ0MpYZ?0=@ A #.]@y(AVVVs?~ѣ@,`H"ti~Md2vDeN40B@c) -T[  (LB˲9C:Ĉp8 )GY[[K`0  p8p8^u`. LꁊL^lyy2pss={DQIbL\NQR` L#jɯ\ލccc3}ټd2955ŲlPV(!*>s 8^1MNדe٦m[.E GPhxp8|Q#h&wLJPS!Tחw<"]sꕂ+"}?:Pj†7:bdE'j0+[~B SL4tB}R|,xڐi ô7d>OV?a ?a\2EEQzn$𱱅 L$~c\NiKB;㸕es Fu&V sX{.E03$YWREua>U|BȌ E"I$gz-Z%L^?Hab6ZXLLWWp\&''잮t&7j%ٖK*xmxu$ewkB!Ky{sTZh/,f;B#O2~H/,8⮮f)JxQ3@7,(t3L N~ppp8i9x<j "1?> rlvii &6Z}[ʘUU$A#Y`݀}& h4 iMӖAt<۷om ?@r xR L&AP0&&Dk`0"X @=C܂r:6 j&XGRIFر|>;Ά.,,JL î:7,,^uQ9n߾}pxsssbb"77xfgD"BctQР1u5pźÇe3Q4MbhgaaEVd>$qLd!HY8]MJR!ɫj0\2y$IuOpd{wQu#ZQ7ͧN0f"#Ij5\{Nd5gMR)]9izNYz961G$A.doYn 6!毯T^̙Zy^QjFW5F)[\^x߅[:;Q:{ۚRic ۳{_(]t8{4miiRK;R:%>;_oQ' .0:˔qT|\ܵmo0` aX$IX ( ` 2^ݻٳgyAE' a%Ų,b*,Sd:?>ZV53s [$Ir+q;$:dn)/-%YL&Yw Cf0TYH3bս6$9|o,M9`߸PTl60[ r檁bEQ8к3#xrRq|lϱ_7rp8ɏ_ I)eVg uZ) 1fyܾg 6##gj `VGbjm~gC?<Pýꋖ58z(Ré_|y r0@C:-$wzza?4hu<O"qT*mo~Of-b6Y :c4nx<fD"rPE.Aΰl6,H*>i}jjv тX͠TTg I\.G"PX-sL&4!IP(O=8rD!G+^yʲUMSr4Dahh2;J(#Zvϓ9 aŢsLbK@]Vo;vhii, 7!˲,Ø{ddr\?o$Y0fȶaxLBV'Zyu` pcFQy$~"+V#I"˲cNh벢ha\uvtj 0Rt&YO Eyi u4?. aIf``|B޽{D+TRL:E^Rɴrez+Eum)Aw~X0$QUManOj["kTU$)<"OMmoEsVʬ)aMio!:<{'u] ݚ(8AM&7`3W_gŮ]P+*IdY(0XEu˥wowQJ@αI~7ގ::.^az;p߶mXVo T(d|gOV~xRMȈ-J^3 \@YG?7J"].3yG'_: rgT}-}K)Ia>??:0&&&߮^soH8"1A't:-Ix_v;H!gZ: < L&cXKK .QeLfT :AbaBZ={,L(rEEP$ )755yMiZSS0cZV+Z81Af2v,1iooq<czyzm1tHV\^5 p ʮK/cW:tuK-2L^n)o܅r74499\V 4b !w*T-hQjtJIt9qy09:Gӓ/WC,l8i6!kttt2ߛ{{ӉgL䩽)EQrn}0aABh߾}ܫ3i˺,ӳ/}TUoakd SExly1;R?=,V*hM&jqHss;d7{Oָ$ov:S$v{dŬ-⪯R8 }4I,!4UJu_jN,+jbYwTǍ7i٢m|^k C팹[F 0 B Le]תڽmmt:s~D=0gXUQ4MDYu]qQm$XW:5_ B\kG0t dxedC?⮺:m"tu";6Mǁ!+n-!;ڊB;]8f'$Bt=1Bȏ l`iZ@ h v"B)$d P,]Xۧ;zpwBڝWoObXZEpB.?Fok>OG['x"Hdvݳ]㺃BprA4600 q$IG~X,Z־ف[0L&A p`a\qpxllLE44F~ 70333??  _p`07ںk׮`0 /heiz𮶶6r D)ð:81 ڸ<ߠ`nawq>|=GYBG7EQ0SoFn);s(P^ekb$3_<6$Xį@([rwk*/bwwwCCCPG2uo&V\^r:3<*1*6&j(/Zօo[-/MlK79V pR"X58-]]gfo-8]'b5F+S=͗7Ym7fJ=~C׷X!d`ݼAuN2aVI&aF&Ue2*4(TU2А(0ҵZV4w7$($ m\q$=aT -lX@}d;{/]I^X"r˲\^˯f??Ta߭$S˫(&S}]U5]VtGS@Jyy|-Uep % 7dymCH2nn7|D"qL:swOUo(KC?)L.CV[j?o5YOCH~럾޹"rV ^B B OiQ2%s) WZchcA7tMS&* a(=i Tj(@BN@݂zT1Wlz#DAlIl\=:g/\?rXldÂnabtUEVTv~+/?\kll_^^VE8AIIJӡI0l(0\luC>_QNrBK_(a?{yq- t-T pah=|( ?33siC#8^ kA$`Ʈ+A +XYY>=?霞ۧ$'EQ?(ԏ]"=L΍NGKp-*G])#?|:Y'b_yi[ׄ_z>P;;&5Y +BAd v!r .@hZ39Q BYQQY#~UdjYLTyL _?YLuL8FJ+Qh)D">Sf(dZ]չC_ +cGN-9R{dTjX0ElJ7`oD3L_,bnt^[rKw;LBqS6SH3s{84L+++ ynISy9T,aRQVB 4rf Q)u & 9a~?>͜H$rٜf| >B(L5Lʲ d2f3wС>4;;{aAVWW%z!QP(YQ|>lXIV]ǎa+U@.s۷a'O{wl6ϼD}r"s׻\j(($E5׻n0vyB[vw@SNV*l6g nHljս{׋xs/l]$لaʲi񕊦bK5d~32\uDaaMfCo^$ Ee*vQ"%˲\~]ݟ^{mxhX|:k8)r2 {HkduOVhXTo{, ! U+UU߽/H\}IuhrRlݺٛn*"^\lLO3iiiiZpltmM6cN80C׻䔪У1}{nifGOB$ȲٳwHZT#t/3tb [(v{ ?Ž@@HAѵ-_km JÈtt}2G|GGMe`[!Q?~?((׶Z,QQ`"(:ZV(BP(FkN&b#{Kbqan===ccc$ A 0Ѓjl^ˏTE$Ie a< k0y=xYM[?/a'|r%:8 Irq8vS6( V)pآi\<^(eA(+ɓ.(vn;::rZMg8{<Iƣ20*t޶< xEh3|Z-SaL$B/,h4MbVC\0NJKD,V0çNmo݁+̲jm +TY|y7‹6&`$VU0eEQL&߉t>WWH"dɔ1zŅ7,};wvttHd?U!e|zǰJ̵sΉ?~xߔM™bȏ"DQ2oX P $̕Ua?`@g_)e IDATPZߙ >CY4fÑ^315S!~kז !\}HE)tbAҝf2ɓ9P0ǙyWJ;ms8ex<'?v L7Y[w…{5Mӻϗ1 Fy_\{)ɤz\>6d2{b<3Lz)vߥ)__"2TZw;ևc1ݲ|'B35I q6=F3gDV7{~KPneYkeWUrYٜ䖬S3 `,wZZ[[Z'&}SQY4ǿ1::j"f4zӉafMjZzYf!9 ~~EQ/ZhD & (Xt$IA|b!+&_Te&U副}iR; j0 Cjm{׮]|~!ҷx3֗FUûqL;D|[zfjaYmC1Lnk=8&#o(N9N,BWD'n]׋s+8_<_z{{LJǴ ^wnnpnw[[[,bVl6J,`N|{{Cfgg766%8WVV4Mx<Xt'f 8x,[XX&,c^/x* B5o}OEggGEߺ5lX'/6BJaOEO v =|<埩|ͤaJqy}Ͽ%O?4?JsQ?xc6N!DIBp]zU';pȑz^!W0 }eRu B|nIQvsU(X!d#2L'd"d)GPI}>Lxcw}("4AT*P M ݀[oðc au|{?xX,J*F#w<77[0a qlI>ٹ>rǶm;46oq\wS!,I\֎c.7~]667Y&P51>~7?|~eY،w]CCh[qJ$_Y2(J@\Kҝl:}>'RY~ I>bE@RDV@"!(Rf, BƉFϕ<^OOOj644d2jT*iZ[VpetvT*3p8σ,^x9 b@ PI)JV!(Iv;,NtPhF z^C$aa2N8122jzpQhN@ޟZSSS$I"$s\\pAWWs\roffaE[nBzoO)5kY,):uT*E^f+rBHz\yc}H=S4}(JӡVw\~]%~`R`4)3Q&Co|?j'j9DDX{MiD#e.Q^UA(ttFj8۵F_:b6[fscպdɒp8̲4{V1_{r(=+O]uH*bfqqqnn-f3yS3l6?#"zګw*a)ۡ-^"oܸsGm,#/d2 8@*cReQX׭[цPϿmaDeYd6BQDQ,,l6CswG`ZmOOO*Z$FRo:;;Y&ETF#04Ʈx]i)r: RWۆusl%I!8M| j5[xaB&e⭆_~Bh,[jƨ hpmpg^|幗uZ (Ҳ|r}qñ~e:ę3pVSՐҵN[|hN 6@3-..KR XvmR9}4Vk+J___[[,vsp:y^Ptwwo۶mdd$t:0ʗ- .NGF ( JRTj0Ukll\fҥK<G 6mTvN X;::p8Ltp([T e2t:ñL&TJg_`әH$8_D"~,3H*%j5kgƍo  mmm%(<} 7"z{zz ]Ng$Iӽ˖-8$"~WF4MC`rbvax p aRn;JD}gF_{mWލD8J{zJ\.'$Z(M$RZ-U܏~a(!N115&Bcn4^+ 7k/(>1]>TgjD"\l6\.Ǽ}5C ;'{罌].d'&&2=KEi^SHt^8NH3g?3 .{jXo`, B%"WtS]gΜ9sƃ}Hlw?p BrϏD6ORҠW)I$H_;k$oˡpRB,[lJ%Uzx[[K/}t.ݵn# r92`$ɺsfvL+ )+VZ2 SU*U"xW<@RA⟦i@?BhllV]l[sssu= !OMMih4 ôg}vtt@bAs*EQ===fy~~>N'IZ ۗ|>R4MQT$lFZXXiaFFɸP(t)Qab"yaG RTpPVThvp,qaV95gfD.dxUb dLgϜ1o<}{֭;roYǐc\5;#=t-22 }XxyQc1x!*6ST>H~!T*)Ie Frj+=͛qR򃕯xAD|nEvPT= 󎎎=ufcկ}W}da"%b^Xsr,`~'\]a A,YաV(;[qg9= _9qD6i`I&*iay^汙QJR+y^&L %ICT*T?X&HF~~F7J[ho- |@ g477[V`P(xk'^Aa9y\.Wz>" Pxvv6AVk&&^eחfA,.r& xHYMuSK |'GCm'rs,ϽyTEGb4F7Dhb/mܸQ8p@.ąMUTJ{]{^ \2\- 8l۴j.3=[g/<z "B$5NN4 Q}|nۯMBc[n JrF]gG}',\ %AtJ${ *JӁlrr@\.w\P dlx@NjzzzF1LCԬgYe-KSSyD+P`ChjV +ɓr5aT*CB(EA\".M6m9t(mmm*JB93 ÀxrJʌFc[[[X\[l1][,Ë7dfuH&~9gX\Pg6KkaRf#(7YR8͐Ara捧; |ժ(:llYj0gz%°px۷R4&EQczC{z竭lVכvuΝ HRI$)h5+_u{h4L>M3#CdɽMh?_M Uڟ_X|LEqj\UU7_/lQ;3Ie+I^||Kju"`Y*ox!Ȏ0J%HS$I:U/10 w>A(. ~Zx"I$zpTmw):R ow?H$s?N//]lNж9nck U e}iT*,.;aB8@f JEX,\v]jkk;5X( 0JnqD:hliihLKKK(O*3TM ZàallLP@d2YCC0A (:P^f6ñ@?|hkv8jXW/ȋ "3z#E j !d44Kč (~vs]$HAB(P ~l]JóX]V.FZ^ox&aYBXF˧ϹVxܟJ`. zm'GHr) UqƂV Uz0"I&^ r9Bd@I$N1wsJ__*VmY//kh@ "BoeI\▻E( X~1c1jU5_Cxnuxِ"&kjK~R`f78Z_Iff)Bhnn:Vv:qDZ%F5Ӽyh5>ãau,IprWyo?{(kG\7l6se-,, 1 swg8e6=jgN<944xp*pSTj_!d́JUdxXTUKY\\,J2k(ݩJ&-H$օCBp80@*[.!, NOO'\ bh0`\Dax<bRLNN^ͰAU(GVUqj؅^i^Je(Ky)Q~SaÒ(AX}&gEn^x ]HzzfD!If3Dr=)^fuQEו.4r/_섵ꫯqozzV/'SEP;.ѱD8D(YȖQظ:+kK9^68q~tC{r3l~3+0(,BK| 33B:MK$C@& *K-,<ѡѴ;v zA !EQ\tj62VI$Ne2PBpf[aj|͸^Rjw\/|Nh Sٮ /0L,KeW AgZX4L---+ES[\\{Lv%jTd2CBjY"$ɅX,N'03ժhGccʕ+c}: J܉'fff@t *k#Hq|>2VtOTaO^]p8[O:UHJ_{6R5pK/-J}}}h4L&)*CIJeJ /Ş kkks\w~ܿ[.i ,)y9?4A<%Ak?*^>]["k2Uw:c#BoP=_Q}9e2V5 غ%y!kّ_yD#CJe(()F92l %q4]R`yo'B3~nn4MK?fXi8&^2+W* 0x=qD2%i4DY_&B>HR}:aYn66u6U* 4ںdV*Ǯ/| rcRiY{߹0p8֬YORR 2|c'N1:: Uq '`02wsx Mueq-+yX=fg] De2lI˥bnu$X,a_-u9H$RÉT*RaÆ͛7۷As I ΋AIN&Ƕ0}oZS;l݂a苟F""}`" cXڲQ壑Li2ɶl.#~|B_-U(ﳞ8qX,utt  BE姞: ξ*>GӎK.(P_r|"sbWil6yݕUd,Mb1xI$"e|ᤷPe%̚AJĪBe,˖oK&i>=zpy^t:aF٬lq0bJO^a8=tD"Ze $r9Lj ݻwddxL MPJ4 C,J]NJB( J/~PX8f2lЊ+o߮T*j5oXimu?̙b_`1 U(Jm6׬>n#{{~ǎ:nʀZ矷Zms\ll &vSur&1{K 3$/n=+jWO3TPZBcVX&#-啰C7h4hvA{r.rM\!WӕB=t:=v߈̔V:Kl[b!^/QuԳ(WQ9_qP.l<#>d H!Lfe0L&>q9v rhĉ(xVP@ЉJnrry 0Fl}r5uE7\P"#c>C\^d2T 3߽?a}Tvr>h4fp8J+Z(x~%Px+X !h yBQTTƝH&sjIhmlN<}r.^b;FqujZ\0V79TH$f}\ծl6;:t~Չ%ǣi;;W^yDpѝ?G'ph"djL&&3ɚd=>%u0|դq{B,nی l.Zhigtt'B+{JoBb1u@Ց$b_!CF@R3*UKsٳ?v432EQ4]!RQW`;)Gg>Á{\eyBh+?| 6_'k"uݞDAh\~k( ä*޴iѷ޲_|RQrz=j H$ҒB~r-1J L3"15O!|պ7֠Ʋ(===s/z7!)SQo8nttTnFsD8*m"=<{HLir|>jj0BLgw2i$,(Mך|8P Z[[']cmLL'+>_"{xApanppRsƍ#dz~zBqIa! Sr={ӕ硹ZA9r x*d2 tmt~m|ZͿ}R\r".+yhiu+*<-[\\f2t(Jd2m)) /Z14,۷+҂Ocۋ$@OqcwGɶ'b̳&lP8A&?FǠ\͛7d0kF\mJdtO&.^ݾٷ7TTX42Th$?doÅ`|_Nn$B+OJ +-,w~%/$so'Gy_pղT{3T*D{$Vӓk֬yms mBQT{R$A 8^f}9J9='(pW r$-6x~&LA^\xTbX\.צ2n}ljt:Sd/l(v:Id2JBU8єnWy흩IZ&5W\(YZPvOcvz X 3?8yncs,,ֶ3 d2ٚe B$t& οã[7:A|>hV*4֭n9X;x.>.{9(J,Jv`ffG|]F>s->.TX\[S?K0ؙbg_0htWn󟯙"٬kG,[[O OUQ?nrFٟ*#$COU>%u$AQj9-ަ70B 'ȼ.lF6 N|RVSFN.mj!T۲*ef.bꝡÇO>]*@'-"zc\. @yj (gu%(L.,,8ΆM&S4wo>Bj].W6=tTZ5FX3V^>55! ,k6 _(2ٳg"8ayd&iʕRvCƒ( B$͛V ( !txqq%j:ل8] h4:33H$Z[[׮]Kt*7PvwyeYOw&f$IYVWT*UpnA $ tV{{hH`֝țBvdfرcm{ȑT.%fjl.hUaE q .>~˱)>kڼTd^Cl-C 4r+65]9ő(nRolHɤ%թV(% G!H$ Emy%LiZV[?9c4]75.a==~\Jv*[[[#/_iKÐ. Fq81 Xokjb|\0 ib`͂\K&a1Lrhss\.JR@#dc&YSx{|>E(M&PzcX^M˾Br惯 rp8 +( J# Mǎb6Z#,l6}myK]A g$ɠ44J%gu G@7Qܬl^\~ўO8-$Ipo!a??߾qWX#(\HQïOS{ŢjCJ5W,)][ ģbkUtfâѨfkkkz %K:58>?#'JB@qb\.rWWT\ m8x\Xƫժh4n&}T:C|mlvzzZ&IR9.% $2u?s(˶)a~d* =죣ŸJOs7^,X<&>$rlq3p5n_~*Q:[* Y gKX]p|v񡡡zn۷irB̻РBQ].uT*:V@@VkO~ <_q( AssM=gd2p@CCej&Bh:eI$IB!On_  yTR 4DBe2r&Wy ȡ%riH$dBR$V%DtMRc){qJ&2T.W,ɺFc!o!BSq\qbɒv:>>8˚BXUX(TDE1W*e*UY _⟝fsJIRraNeB,R~h}?H|OM~|re=7\Ǿˡ%6f9ŌaXV#+w 4\ɋ.0 -K "+Sةݖg,uzrr IDAT4 ج|("d[R R4== ّ8 ](nB B$@ee3tZ.C)Lk;Fswra)QHn,K"%Mģ* |72Ytt:(K$\Seh!8pTS׋P KFcwT*cBBbԪ\.kuk7l*&۶m[dI{{ǡA E@>_7xܕ*ta66;A0kH$ɤRCkcMJ`AD$z^fZqd,JٙL&vx a;BxZTtgg{D& FQ6xqP7dr%AKuWjl)Dd&i Ea)r."gf۶m6m:y0WUa^j!`IӲ{ooT*dUCC7C3˲W^re08i4Ͳl4+d*44M/ѳd䩧Fkk_N: jV# BaO"QO x饡jwbp$IjNZ[<7n011ߟH$~Kju{ IR5C NOFF,l.7 BMJllۆ,x|E _|[BSal%PCR*6ܗU&'8J'e|MRR\X*8u񫂤 2ZPZ].阈D ZQ*yjJxA8---ab}XQ($B rT@VJ}d2Y:RVߌZZD,2ϫ|ƻ8P.uAd2u~I4/!i 8mzJ!Rt;NGc@`G&_#l33ӂd\.$IjXD"JE( Ц>&܃403 ET! F.K&@fEQ.+JDq'XALVz}4D"`EyH$89c`0xر _kbc1@"G{^^&;Iź:x2ƍGrReQBԚkFѷ~['[E$lZNVsbD^5/jMڭKu|4>1p8z{{]ɲNȿg>@2uP)`s~֕w1LZ :Bîf ^s&2m0d9=s:JمRÐٌ&AQ5vkr:nhg٢kn d6jdDI0sy?RmVպs,[z\.O,4wu{{%N,ϖ_ $]p뭑H$Nmڵƪ#eA J(篹f,+ JEۗJ?D"<cz m[e>$ cFZ#GRssst\[>jY N+Eh^MTFfkSS`*eЋa:ްk9U_:q\2 .\Ǥ6Jhv$# 3v4S[3 cR41'9K #G̶ .OS8,Rhz6R~! Sx]IdCE -fm6i(R%kGRZ=29kll{d\Q֕`H0P&>m J^|t: @=a HpZZ,{P0njH$)rZ- H$td2`>ڸqcGGXTRHC]Yvβ,`9FA b(5o M)}ӏ?/6B\:tVԑԑDRCJf!,/ݻ='N@aQ6Ly9隢R`0h6 #x8s\TWk=r0/̋$Ioi8~NHeW \6%&`0g0?ww;wn/N9#{T~bL[od2JFz4tu"uaĂ ;,{ ,Vco!+vcW\2zM Rl6ZAZSSHFH#'UKb׋/qe\q|a‡{r"$KZMTo9bQ˵HBƴ A* 3NN~Ajo괁+f38ϕTnoݻ*aJb> ZmͶlltttll00zYrujǎZWu33:pͩ} a#~,k_z ^ȓ'zꫳ)f׫(JXqv;NjUT&/Y;z:WZ| (@{EҖ!Io^A$M8a`.1*)a&I0R$P>5HJ"(@`eW7xmV]%I2To5ۺNxad>UnQ4B|BSukzJ%Fd.* RRб ƁpTR&S&_%9QÑ;㉎d8RF#{ 3F#X@ $@d-5@톐t+У0+tnyy9 |rg jY٬,MMMbYRuprL.8K,dNcE xݎDVKW{t1\lM3BJ M$?6mDsw^ȕr/bvMOOb1/@Xj/ VFǘDt! ,D~mr0 ȵGeqQ+J麻[[[҅B:!C(<SPP8~</d sknny%(" 8.Q()KdX,HqqV.WS3|P0Ipur9Zzٱ jZUr9H20p*jj[^e#l6 YIu4jcJEg[rMMZ|.򊌜M1 &HAH囮_ШB] Y$P0B E3߽tt~8;SP,FK֏ ? m42[,mpSSK$IRNUm_^*ɾכV/"jo+j]s LVk<KZ,>ReyGex2ȢVN}X,&9/' YIBvb3Ǖ Y y*ilv]YǏ/XoUpUW*x Ҕ `j5 ڶ[[[WWWWBTnQ1ڕȆj]g!Sz{+>vjX9Jk(W* OsWWWZ[+N_%HԂ!6D"ʕA,ŷ$Iҫ5/|!#ZIR͛7755΂.{eeX,B- ,R)C'B 1  4 ((zގUH.h4nreb4w}W_r%k֬y7q\Z.( 0 X,W6ڙ4_ILӲGwTTQE6'159ڶqn]᚞"EU-95({Gq* o7 o<DwGAt:E;\ m\.Z] D6Cڹ9\$ht:8&+J* tDjzú{Wk!kaf6t*|(B$IL& t: h4zq,`0L veYmlllnnN"6MрpPjV^WTZ лh4z $ptHȵn$j䥀|ee%J.-_:WChBCj2frDV( ]6blqqa:T*@qp*o} eyYbYe$ eAZ[>|eғS 4SgUVVQM/ݱ*zzru{Ųl&[hh@6"O:Om]jSFOca)Jaѝ;R U*e!9 l08'zW%9o L>E\H}kuϔJ7>8ٿgXL]*ۛ&#p8EZ\xB&mϿdz=j-XPq[),j=,,kL;[Zw85F0x;u@JfT.! [Z_J],[I$$!w4]()tnڃ0 #7(ĥzayA$_5'=SӡJl)($<ُ4$!_d2Yx<^< $r9HI {,@ FGϜ IDAThSVt:gffB$I$|>0 l>z Q2u&mEɃ9fSV<|E\f0M<ϛ˺|{vJW +!Isa݆-iQ%AS$llA" j/%j HowaE=At_jbNgV9R)7R0)>O{j闵8i $IFuhx};(^{ok1s.& zzz: [ι)kWXoO RNpZ(R(cǨ{?Cuv˯xoKZ"L;ڕΝ7MM $aj1 kkn i JR0X אd4AnKܽyg=^,,,B!,4NgX|7Y$(>]*,KP' ϗT*0 EQZP|{!`T`-(jxxd2*X,U9V( zAZ9RxlX0!8Nk?<%>bRzz{a7p(+םvqԺHܰȭ%"xPݵ 9E.~t%%93A(RVA ;(+67#= JemeyE1[L_öWu8/ eVM:6vW:vm$%^~4!Rz}!TNEPc%^|Q9tq/n_sG֭l68dX::ʧVv3Çᘛlk>Y\>LPTٳdꜫwu7d3^R `f`ȲS2 lil4 Jk!ئ EQҲR^o~~>NUI|6ʕ|A@3x7FQ޳:l](TBiZ[զDԿ!>;Ng$tדCVJ$yc _~H1egvtԻ=ᱱs$ #f2*dQE5t|K##u8u8o9zT:swB(24"j~[W^)B(i/P2iÔz񏇼 nϯ_x\$"rb[gO(F"?џ#oSFNqI)hޑ-7d<ٳgAW,sW_,{: Eg1f551hPh:-Jdk Տv+I@Uy:&G::n-<3` 9;/U+@0L&hP%umSq+~*ERU 1b6 ׉ъ,[yƒ~ɲKo=sxl1W`9`pSA>r7x(J\60^b7gΏTVIlpֆ6a1 477vp'dYx|>?::z 7\{G-N`]q )/nmmlX< )"VR+l]no{e D&Z.HQ PW$)8$ɉ{k5$B$~֑ N-.,ix~_u0,DF;Qwo.!]xzZv;nkjL!C]{]eE 0*Tb+P*j)JFQEՍ41:Е{;oWHHQpd0OQe&(qks IhG?Yaf$ŋ#Txַ\.,,˺\nA'})dG*hohg;Hp !T喺{w]$ 1 S륖je:M BOX+ -۶m.3Q5-ڗνz.ÚXCHnB?a{|pohhg~IgjOGjӼX¡`er8;yiZ8dle͛7ܹszzzll <,hZ)Z^^ڼy3˲c"lennn||w|f^  0 pA܍7qwy'Jt:`@d4uحa[fEQo~(0؜4BhnnnyyyyzY E!VcccKKhufY6XfYtvvDEQ[,>}aeyZ<3#e23( VL[V{]cJ"YYv8j&n]/?iu8^z)/'M(a>ՓO>Y md,[ᒯJT⊽*erE~ߓJ%l+;OYhn_26ESm;hnfF)F[b/ /#2{MdԒЌl'>ԃ bǝN'eA'IR<T*᯵7 7ںm[&fYܲo>Yq8tz!BeQ oiͣWWVPZ+FR\.2?ɪUU08ߵ/J"RZN=xA=WR߼9,2c&W(z jQ?x2/GH vp5Q!I"H 9m*$" ~0a@?^[%]UO;1Er"MU?ȇ5Q]=J!At'ݸKQ(%S4/<.V$+O(S e8(GBQ/*32Jܴwz{'C7YEJwwrG}uwwt_@gSSd.d.o8pbnI4 ]]]ZmttP( F"br@rRL$,˽F^@3R__o.eO:jAܼ{Rtez,h UVQ~? q:{,Vrvb`0HQx<x\.WVeY[[[^o8z{btT|`0TIhӉjhhصk쬢(Qz1yvDQ{qzݺuܛNr9(+g2m&b6_ jX,ujT}KKht4"o;M&r,'HQTbM!2qܕٜg0L|jm%p4C Fo֩u``(g,ek92gc M/JӲ4 kG~|+xxc"Zw߅PKCvwIVophU8˙یV2_g?A:]Ϙ(Ѵh_3h3%_);ƇjA:.U.i& TIH˱ɊcIzgbf&A7mfB$ih¾o2'9bսbn7ġH --7ߔojxz]yB˿8G Ve~@-jCOЬ[8aە寸 -.HeIQp\mSSSeyT6.TȈ9t(#a*Ou#; IDATvB/AT4/Xp<ƴ( 86"'?xy^'uo^}Yy[g1 }|{wߟj&6[Rww_ujۖ+b IΓI?7FB)PjRp8^^hkQQWiDe >033t{EQDHYʼnp4c>D&8n6zLj̒u t: :HVryl˖&rCi|! 8 MM|Iꪫ+$KKK@l 09|u!AZ5ٳf;s śf(_ucqzEA,XCammmv;::~̝{d1)z,hhZ8xDܭVFssϝ B0IFAQTKKNj©#qc+CGwZ- T#+ki>߯DX.乇|"\J]e76 ^`χafr!s´CG6<'pѶi&|ܹh,/I|KgXw+nJ)qKLvP"4r}[WUb,)^c*èh* "y,)>{ ՊN'B!_֏1IdYVdO{LT*L4]NW]}0K7ߐ} I$Y~aHoPG Ҳ~_>$+(\eYNLv>`PRnVQ֨;y$IbS>/ Žj6D L&I|jvttk| 8|Aa0}ۉ =OWWW HrA>/x7 buuuΆT&7;`MS} vj$7XƲ馀>-J76-IR(:z(aP$eYM>0yRNgWWIskf@5Kky@QV}rŚI.<&Ȼ6 ³lcch,w`pqV'] 5_֭khhx7挦p1? ‚eS }{D~\l0>.0d2F T t:8@@___kkR4]v,˱X,))R(P8EY^oZ{zz֯_ճdi^'(:xp@٬VW6cr4M_ df2N__mIGI3f~.tz5u 66ܥG6kxciiir2"IeY$"յiӦM㣣R56' ͢`T`NSREB0??q"4MrXe`htPBT3cKK Q E!ɱIPӃgtI*KxAP6#m\ͭNw<05zׯ_ &_8#iļ&1c=*gWI[K470SC'I#$x @06n=ESUF-~X\^8#kdiyZr0<[˜AhRa.KJQ 44(wp4=pPJezhęaoTI-J tGpDLu%Cޙxf2m[NѼ[ ssJo;Kq2'ϫ$MMi 4 uussryٲe{:n"nɹyHikks8 HhUz((Ax2"쓒 "$!P$.W%QT@XCA aiD̼ا_G.hO4_{ERhll:yXB$I1̋aD볎Z Qũ6v! (aQJ豥od2$IF0LBRS?,imkZ,Bџ8i#D*!\wLǦ`m190PDS~#eYhF1 q|e[ZZ_]%$a>ŋacWWgˊ+<3'soދUNu0RsElVPsB:hw>Z TfcQbF|>iڳgς% E!A(QňBrBpȓq;m6}(4\tĕⱨ6Yi_4媭R:VBq-8-P44]V4{7Zgo,pv0APyhO0FV{<p&A;eٖ4SA;ƍ!,B0 ZV6Jje#DL&0q`}Clnzua# "=z(:pPNoݰB!nmc&@H.IӂXNcXD,k&jj0ˇ뫪^զ՝ќ(2M+egIN&h4\/C曞iQ/_~z[7|7ij~~T::;Z[Z}?B8L0 0_=b x l.k_KL=#"!{OUR g@8N"R1^yj)h0;=!I'jj^޴d4[T2Y}}}uu7WBH$I$Ɇ_>$ITHHBkn-N 9vLBhÔ>TL<^TtzenwCO=M<-sx] Zٔ#GH,+lSߍ!Fh]]ص7MApuEngq [ߗ͗y1'V"bA[od4 ^}Z$ zM$t^MVR0x=߬Al6"@pK&.?I333-FYvmT-[cǎ3`pp 5k8r(2 \!rZ,oW^^\$h4SSSpXEnNz$LvtB%lzxIz+-P}|}ѣثV{1 7oX,޽رc@.V*P0LR \ȻV>0ȎV(\pAggɓ'T__v)X, F.L+r||ٳ_җ@c L>{i:yư͌~г٨{@,wX޾?r mp8Plj,a;ojhLJE$ IPpha(j3U;fǦ*'BH/xkjv{տrsh IRE$I$۞|~$9N i F/$̍חV$V復G\^IPX=B_'}$*{G(bIRTkVñq{ͩrׯlhbn{w<  d2JNaꚝq,D-P}$)Y0j 8XTi3◒$!Ij*B`b.],;::(HZ֟PŒI~r,xΊxW]vZ,M6z= ?1Zx?uT} UUU# ҕ>᭿/}n$Uf2U*##hlooL^o44yټu֩ӧO'B1;;kZm6[GG(9Jd2iZIx<ejkky8D"rp*t$P vHy' $lpիO:qBhqqqaaA&AQGہSSS>!T__Rny744,[ R7 N$H=ZN3H [ouݺu|~ٲe0e=}4/~*j˖-!IR/p4@iP8{,qg2{PD3 Q, qFZt(IDHJu{m M8rJ͖Nix<x)\o* !A%Iqh;u|o*?E,Bd:ZX,:88X,xI=+gV<!uZmGGǶ/f2GKbu#>E 6Ml"MF87Q X٫wߋl6H$?iE)JC*v+Bh8ܼ\ΪT?ccce|s 5~wΞ=[Z(`b-+JҹsBUՒS=X(IF^@U\[4_X畞7 F].p8.:D@*Se5jZYŌNjڴxزbf=u=,YES$=LdѴ&Z"l:.d̬8.{} 8O T*CSF\3>nU\._ZZݵXGD gOtEF>r9RbjhN\pf7- L&i$[,PO655:txv$ sc466*bL& oP=Mvr9H$ ѥqhTNЃ ^k+D)9JT+G,/C-+yAD'ȫwȌX,SˉV+ )1왜?P{Կ6H=66rܕnħ;+'5 "|'ޮ׳* /ҷrU׾hX,٬|˕{ ?ϞDBJg mmmlG!gfmX'I&y>FQpA{MMJeizpppllLѸnqܩSN:u1\kK/۽{̌t&{VA `.RfkSSS iD<񅅅 VAT*j4, wXR)溺;wٳÄ' |#x{hprXNL}\0.dža}J%AJtpᦦRR0_nF85ѽ;B ()fn#V+AP 6H^{Ѕُfy7]jyar9jAŢ `?{z3w|a\]`RJ|/^ϭ@y=f|aV,-,B#pPdEuXu:I ڷٜ7ߖ/|/)!t3~]%\.믝g=}:e0V*կ:XS3/{9x^2={ZZUUi4y<ܤPsV[N3>-lNN%I{#]0ej 9zzz<OCsssHR|hb(Q7555BO饥dO5?b 4'bQqY( *iWdxf@Opw;`I#dbfN'* -VO(HP!?0, `@oc Hn+\.W(('0].b1 bXuu50AL&'''&&_]]=<<>&x<\~hӫT*Q6X\\h4OyeYl6OMMU*٬$ adN+-g7,2"dD5|rqFcW{Ń7SyDv<$o gN]rcBq(h yˆU䩢xNl:?ukssṡrĞs|Pן73=T[?ipK\Z!X,eoIrOb~ieW%5v}lګ޹麑G\{OP(p[@,F/t~ϖFbQR@GH䒖Zk$, p8qv(I`jkko馭[ݻwll  D" Ob877e6`6 FUU\ESSSrf#o}[ IDAT}}<0!*I`52 P&Bd 0$WA#)Eɾxu\|q$c$,K$!A{wbO<òT"X˲,4A'z˅ϫ~He?C:Y~ϼxؘWGZ+Wo*8{^. >}Ͽ2jnnYC"IҏCE.4٭[gI %.^{-e ax`P^7o=۶=NR)2 /NߍFcGGY;cr$2.% kvqe˳ǯ ?Ah&0Ťb$;<#ͩ=Ӏ-!>#Yinb~O5)l6+`v(܊{ E.eMM qpHߡU?$(̡J$Wm*@Tmm-f@m-:hhhPTd2 B!@TUUY +@ X%Az PD"v;paa,@] L&C:1 ˦4*I6htssTGlWuwO?=y҃nwssE.#)ۛ:q~.j\NKI#u \.cꆚYD#Ю#93/78za_}X.EԖ{cPNBHi]Ia ^p9^/x2h؂+May87 =LĂ(z2EQ\t:{zzA8p@N }\P")_=ڵkrrftM\s{}V˓ $IiN4<7m]]0˯=ܲ`d]yYjmjݰaömێ?g~Oxb&G"?>fyH$L&);nN +eC8 {B(z[4oŔJj\sRVľ}/y<ǡoꥷޚyNO>rj7)A`GF57f p{N J0ӌ3slAx~0S;0h(ғdh/Qk93~T^^wYƲ,x/|{KJ#"9R1[I(t:Ͽ3N/TE K:Tߴ=P*Ɗ"?73(*8@kAcvVsf%q ^M4 XT*d0|>A Ȕ555A)D0@ w_T}lXfժUf+J3- dRIך-+p\.3\;{zN=iZE񜬒上I8NZ gH( Å.JH5q|{]drÆ iߩNRR8^F,fJ|*&YHuueð>nD"qѶD݋-ⲧO4բ4qN8v>#ﵷ\w~c陿lKk(<e)N>Rvz9hn๪SCB蹧W^ GEk{{;iFFFT4M&ViGu.lرHuu j+8s5_zzzZٹ!te˖[x>KKKȆ:SI5N'Y(u:]e-wrJEPt: P]]=66vfzU%^`qC~BC$15556r BQiӦ]v|>Hꆍ-HX, /t/--r9aX4MRz0b1 If444@ ƃP455 pr\^(^xi:i(`Z8Cl6KWn#\NA/tTe2N&@h48qӹnK%4叏n$jz}>_"t]C` es2}՛۽{bb".-i4@nw\8gY^n'BJE/qw/B`b:N$cccnq%# &Idcl2PY gO 7\zÂAzNganhoeuS<ǵJ$I*'yzh57zJF.d,Zik  ‚wSU*p\\,f6G&'7n=/H̼|J-+Pw߭in.o|ږ{˧N~h4z!] 5œ 444fk@䞺}U.YJR,.F jEɻpl}}=H_t:j"Irjjj֠Y^/1J'8a6]P@p .>W^AM8D"DƗ6eT ˔Q%[v:6mbbC2aZp&OYAR!ͦX,=dz<9^^tquuuh4._fjjj````K^M>f`8 l Wn9x I$hmm-whnS޸q DA\2t863 MMMb1rP(ͺF5LR]q[eYbD|>阏jiLFq{<'NJ?\.`~$q3)7;/X_z$r _S$d&T*ڏ>Jpdq+JUU1\6:*"e O o&[˻ R%x%L(SQZtPjj ZV"DQDe5*Rql!.io5ú:oY:~կx7 , Q0nŊ"ZhC32>.?4PY1rÄ^2YTU%R\.Q<R<!<'\@aہ 6%eF L('Z,$ XVY^0a^mWBp8l2VB#uU wFk \NBJT*Rs)z&rŜ]֐DQeV2 k5FS0TUDT#B7XՊF] ԕ[6$y *~󓅉X,^(p 'BUMO v]+y{Uap[̖X,t a%IFsZmLH Ş-SGNAq\.؉$i\{{L@aqVB©Ur9j/_{^+?kc rlCA^ى}WWs MfVY,IS(Y` IL&X\&R &J|YN />O7xCE%JX,|>k~R*zp`eORPHѐW]J|)͢aHihh Irxxx``dr!ɤټvTʘ #IR-xwG^Ruõ5 T!m:uFb(g&IRNVo܌ qt:jS2ɮ\[ي=uNpeOYb){R&X/kׯ/-qWk#I6v>&2b;B+%q0˲BAJg͛D0PgQy х ?";v3y;d>#VrL\l \cFi/c^3 !*3'* IC cDQ71fs A e!~'Sc}B@Ӂb=^~'!__D 󠺆\.S|~Q㓴 fAT*xz1 +˥>$?=$+o[,5k(ʓ'O$) |>;wX,L&R @ V*ms~~0E :R@ J(w ܌^]SS@9FD0tpk)JC zѣl63}AT* pNGduu5жkjj|t$ Lr?uQf0$&={f8JWcxeO$^y\.Wr{I">(ՎÇBQ*.?f0x<큯x8;H4<477'b?x<u~o0HDQģ#5^kAΗ8gX.J>ǞSURlWw,"uGBU)] Iݮ9fvh\.X,+<,eR> I$^*N>HRc H4`0 Tj. $tr u Ov a"J4m4JOgVzIB"̵6-r\.5jJ[ze6E\I6fKhe,ԊVU84][MӫSՔ=K|$-K5Gril@-&B0+Dx z1fUV2Ȯ_*Ͼ_$ 8u.r ʒl!aKK( [3|#c3vVj V,F3s+Bs@9l\~r2F٬2ϛ挩TJզ2ھ8΀jP!)G<@rWmCsK͆c /y\,!| TQr <9RCU+0,KC$B?~E?\kjm¬fɼRYHL,sew %9z;`Qٽ(m\m\K89=(, CZ[[AƎށQd,61$,V*\@er>,`լj-Jqj{&X,x<2bXKL&ST6 ,gϞ5 uuu0U˲P{A琉 AvF$-DV*xzc= IDAT<βl0YD¾ǦMy6_\.ē_t':y߽vߙN/[ Mνy0(Y?7HBx`YE?o(g\3OwpXV/joo{+:j.mrEb1ߟfԃsDA Ðlr`ΖL&9^wXhV*JlIY޾5L'B{i r$I\KK[/חBG6BxP.4MwBA#T2p8oBE>w*g> .+ؤ3۟@!*g G2+k*a[7b2H[BORXDh!nlV: bP󼂦XfRdYi2 t< `0L% PhqqVPI$j+baFE:uu/p,Z] 1 x D_i\^ r9hvAk Oի%I:r o@L$I|zAA(j4-&+jGF JapCf@L~\:ɈxAQV7sf /K%ٳU]u+|۶߿R g"վ;A{|alv:_TZJRAnbV8|/HNe(Ě5k޽{Y?1e d,3%Ҏ;Z]]}~Į.6 B, _+K,FGRso" !sq a G"P(T( *BƢGVTNNV~? mn޼`0.]N\..+jv{sssPFW6ljh(jqn䐄7u4pfsTZZ8Sd2L&CB*QX̌RՊFƵzprl~(PKGEQ<(# (Z-UUUܴ-;vO3#M-VI}h'LF@  fM0ReQ.c^oQ(|~] i$Ro/q\\0j.J$$I*^X$EAL&잙`PR_޹:>d2ŖYL& $IETJa4X+9Zu+I*s9|~_Ŭ^ :8iɜH$5ZZZ8/,Ft:PkT*J%BX>C.]jJ ŀ]}1BHf-_qZN+OTZ inK%֬-56jܟJI,/c$D"we-2#S+ uJ%c4%YR&CwyaSJ} #D$l Jr9ϱ雞I{pSb1y$0J0Q!nMd*KCvI_Ǝfggbw=$劄N'dNT*P(D3DS%%Iۼ3ҙt%2rXfX IK/g,f.4(c뻺@~1(656kb}}=0<O\ C}=V_#*BA aFaY*4MOdImږ"֔ţm]CieZ1 r>" /B V,ݒCEdفQ$-$,FDdoS. `GAk&Զ\ D!l( f͉4t@/ILiq.68EBhR |Ng$=_eI,pFY\ ƲrIJʄЪO@@h4 j#Zx|Xa('I4{Þ}@PÃd]BM(BZ&ϋVS7Hr"q۬18AX,(nh4Xlnv[Uyo2(. ->ϊ'5?yv4rRtR4t U%77XV6TF/޵BLjv2A4UAu:UU导…Phd$%7o䆍G?өQe@ieV@GoӒ(K/* AI\ղ"h{ՙ&ŲzQ^丗p CH1Tx75ӰeȲ,:Аs:"kǞhٷx>_^,P8x̠ߵm[aҶd*ZdY. Ez{`IyR!IȌVjQJ)E4a;ַMid yBqBr,֠; 1U(V+f9fۺshhMc )!1ݾ ! W/U4K?,9(5 X,' ƒҭ0Uz{hP&Wb_m5oB s7=D:arr8QL sOà綸Hhj!јH$ъPh2SLƜNM&Sww7P2򭟜T*9mA$|> a vwl6p<)L=XVeϜ9FSH$Q=ϦM2L8f^w׮]:h4*b__^Jsss6!ͨ˲ ɷX,psux<6`$x 0v;( h4-,s_߅ ilPx<6 B~>V' /`KefN}e:p$YKXVM*ܰ$^w CcŲ}z^.szGV:::6' B!/Ԗ m%զ&E$}lq\V.Gs{|G$EYd[=lhւ!$H2.+tHT5e3$mVǢu5=c{#ݝF$h}] ,B:b1 !II #\l憇QV`;'qfD)(@p$3=<DZz }SI;@m[lG{NQjxjm'zzDTUYST*kIxPNN 0fM!I^_14tQOO2ܵkpdfcߙLklTUqGP#p;ق[uY齘_4b7RF7j4mP-ULyg!81#`$vQ[lig>pWYL1gJĺ.k1-"݁dIi;|^Oiޝ6K{:u: .?9Gr0@ w[H 0 "_knnlhhx<  !1aX\y:Z6LBLH$M !eppPU^xzpRc:(,,FnֈSlDzh(O֤M`UUx"5my {,‡׃'Dh0 x3~uYQP#J4}aj<EM-&/]WX5Bm2z]nRKF1bL a /_tU+T[ `M}>0pLAIId\.hZ.!+eY>qCt:777){X,M u#YY,(&l6hڌF8WN'ٳl6yjffFEH=i߅Bc*f*L&Xuv)|.fCCC0Fa&xӦ&&&'Q(,扉 8Mn7xA5kJpSN adrllLL&i@2.QBvw\cOW֯) 59V6 zCeN?]T7BgF?ݏU/8݁?:pHUU ֬8"E+_X@Rh,NWqZ%t=/\z6A#^yn7I'YǺreuҝ_i1M9BttvWh C3==؊h9I-o {vm9b`ջZc-|a)O}6 L#sv ZB{N5Z{oBlo_Acgl##f^_.n\N_yb *.9AtPxO~T6E^޹|֭nq8(JF4T+WL|cGFf\7An]=M d9K3LgႈI;ܙR/_`NQKc?y/;vX>h ST Esx6yYeYaב( n)ZQjAL*ٜVQyut37@< MHg g4zEQ/5-ţGz[mjj%p^%\ N1pRuС|>o@i*Pth4:77^xYT(")EQ4m1F"x\#Pw!&#ooޏpDDa .H|3C->oW.qjG{UEM?hۅʞddLxX"`R,/g:ZVq }6g1DB zMRT>/p039SK/y1Po^m>?y$$#{7Foƚu Kk;mBV]ôZt9w%T-%]smSvlBc"qT:]٩zU\)vD"&;iiz;撇HcOձkA@54ݳj*5jFkٓtR!QUI4995x7΅JREd2 x`ʲ<22PFQeYv8@k#t뉿jc]%'yܝh ͛x3y^lSO^yV?JE B&e^v;z7nf^[aF9nEId-VP(D8r U?uU! !,$ zheyfzK~rEaUHwGSG;#e m6m6so ,ʿb@72!6&g3 YlL#osϩ~MaD lАo4o۷/ AlyBǝhͨ hԢ^*T*!Z-R priZanMݮ(ɓ'An˲lVf\]Sԙ3gQ P)!*^o0 Nknn6;:n8vXZiUn-h䆇0d|b7B1f]Wd@썊eYA*J>ofs^,1HrJd2NG"rw9h[aYu:8Ng2,_[.@4mM^x<.O P≺hl6N)7_ cx͓OymdLf2Kx[{]*" ':ӂyNsI5pکڸG墳dv+_D}rh_JSjWӷto[ Іe_t:]*|>Nq`n𵙙YVF <$ C63( qhwh4Z ð6eO> X~=qx\n(Mb6GB ǵZp8`V`0 ፃ6XTkal" p[*B:>|0MӍM0LRZ`0@_t8p`jj*fQ͊uTɦRZ"q@w>88HW[ۆ;vLMM`YO$a_-[={ PB(RP(D@ tuH}e~||UAk"nT9?E^+734l6[__VUqa9l5{[NgooO'dYF-_ XgV}+(|\gq{*D#BIԕ?b~[qEQM1`*JZvUElV~~g+MKE>\eEt`\ۿ(G<| 9@r9Az"5|> !V #d2hJdfI?w={Ç%It,gUF1Z S]1?`;Ixʎg 8Hy`pp5ęИߟf8.G*v?=+",B1f?/Y+vfjm`k9qD>KS|=}?#,#b8AN\)0 + y:`U*!$#\O}G@ 855Y&f |MܾyX#N^~w?}~{{`X\\UUa2RԴG68fsl2fs{㯻._j1p3%}e_XZ^b4.aA %arԿRy~`!Sj;]Wb1EQ;p46 ׯ~Ul2dYn`7#;bIX$hT*q}W[?[~_ϕJ%IѣG!~ b%s0˗ R z6Ͱ֠( ( 2O;w. +'f&5`%(AKр:vT8^/Lz\"$Ɂsӳ ^o Vq($ItPHRb`0 X,VܰaÖ-[_4FHрܿ]Z-DMFf xf3L0ncM4Җۿ#IR!JlW_eN(&>Cؽ[{cDB}P͇:9 V|Ǩ8G.")NUq-Ś3+Kl1>z2kҽrvDwbsQ&&c÷:X3؅pY!7_d`j Mϩ"j|mQEd* ,]ӧOJZMMMmmm4MB!3BA` "q#ton7#Z[[#AoxIeZUU 4M8TSSS/ڵkiҧR)@HXrhrMrrX8qW^~3g:DQ>r_xVrj@(~[[[4Xg $}bl޼Y]vEbr$ Bl6HL9 @fq`%az _юp2͸ݫWָfH󍍍nԪU}S_q0%ݹsgVE%}L&bx - T/'=k5C^.m%I迕r̿kw hy*߼58.TuaXMIO;BU޽n݋ۦ&.3(dHR= yF@1 y+W|>_֖ǣ# Ta湏/]brro8NPRW/-oURUb(ȦqUW]x砀WtFKJG±잪λ4gAXYu7}cmSRцegB|06+: HφB0?Bg7'?feSNϳ,qض!? B*BI'(N=CN.+6˴߶EK8񊪨8Np8̝w9 J_PssP,\.QɤlJ0#ȡC ,.I!4 |r544d2Hr\7my怚 syFL6* _ÅP(#\<gXn@{ ?ȲSNtf-,NOO#/_rjکSv}bh(WeЪ@;zn`R VgءÇ'&&J id2Ll6 stuuO]{|zǑv?5N8(WUP~%T!ĤW_dgΜb*EQw]u\^^&$꼳gP<$f-]tff̙3'}w?Σ_ | axys,+]{9_777, s6 rw=ƏP@tn޼jj z>/ ?yPU~otXEi˱hujk(<7aؘuy0 y"?RcP(T('_=@aT CHQUUyTFٿTa*T*gZTa{RqBHV @ 0U=[mPHUeDΏRYmHD<Bu/456±Ҵ0yurzVōَv_QUkoyXw0Cob{wʱU6lp1Ðae7Y,mh62QE/zUQr S1Lfhd:E\&q[q #ZN{SsTp\|fvv#=aUE]mxUUmfAr9A݃X;/{䉡p(d0 [~'Nk\bho" 4jYt&B`X:;;Z-M,3 wg]]]N%87(BOO gΜӫ(jC0B4EͺZ655j6筛ݘCzY/F\{U{kvg3L2 TAGc;GQ(]HB N2^={o/2\CZ+ۮ8'!NX ?Oܧ^C#XY[[[j60=77~-ʲ:#^$:/r$ PȞ( , khhXnf۵{T=%dޖ۶x"CN9DӴT*(&/Tc$yYo}J~_TE1O=@)/d2ժٙD"o|۰aC6=u8`M&Skkjuhhh~~jr!Zjkk( ohhhmmmooSrA-zUUk׬Y#BssO?}1 i6 ̱A\.bn}61dWx={xɹtX,B!>zz1L%Ku $#M D"L&cq[nFBK ('@PR'qt:r9lfY2o.]:;;{I$`BBӴaX,6vʕ+4Iw?O@ ލ7r!O>/NsݺuMOOi׆x$XA?t:3d]rLFd ,˞9s(/&owfRa9<44[ZZ.PwǪNkh0(†qC{V02-d!lzS^|-[(]god~r߿ȑoT*Rt:n S]Ξ8._+9UWcdEuؓ}VK&p8f5MEkz05Uuxxhdd$L5u3SM&ZtYu}3 T*HFSI#H5=w/L2s9nC_T*6B.$iTa+ҿ2 Ol~T*аrŊf'033CD4;yM~z)C~&8[#MVZbEook\XUyz2v^ !@H):g" x<MeadϕusBt運KSSgK۷G}Teo~_bw550_/|%K޽P(t5(.Z%]z"$Q(O:iZ_____ }f\ONwvv<}W YUQ|swOtU |%gggGRPB( 0|>x` y_cc#/0 | +z^70 kFI603gLLLٳZutt4͂$IQ[[[{zz"HSSP\QRx<F\(D"V0 EMӅc|> O sUU~[[ TJDcE;WZuug+~ 0믿p!ܜN|͑Y b볦oayMQ{ߠnbQu C$I1 cz9{g`NJ~o?C*@"7sMo!\b'BdRbgԳbN lwŠ›ǧ7v'SI.Wk[aeh,S{#wݣZs8\ۼind(M]=ݘwꎁu*Z޵'=4<_~naEZ5#tq"q#Xie]{"T҇PFjwܺ'7X)cؑto6"v|]]>8xEzv箿  ޢOMN:m6$Tufff],(aEͯtQ3%j&yۺ"W޽{I{>%\?Bdٰzo10336<<qo| ,fiŶwItkek9;43zXV|m|Fy{jǾ-$uNE?HcZ*]I ijuONz,`z\)OGOy-}tll,L c8ܮrєJY 75~p81@V,Ϝ93:: WV^p\ G=|0pX RpH$5m 6a^z% \.j\.h `@b ( !455U.B4p}at4(jqO"G ׷W?%(ΛBrLS \N$PVve000;; hB|aoq:Z]MR55R`ݝ7><2.,Op`T*mmm=&'O0Q!3-lP(t:`*}A!J(_H$ v'`k5o|^y::Kx+VG]bJX,kvŊ;ȵW ijT+J& 9PEfz?X8|#'7m7W^qō7ofc0n]o|!"EIv۪~J288h6n7i>#dsl&^}̙3Zg_cW!^v~[~WIT*E+g<'u8|dc+WlkyyEڷ@ MAb{[\X|`g\Sf6X 3 |=x3S.$+2mݱʝد 7\堝z8 \0 gժ7%Bk.9Lhw?177GR'IR45v%\|݇OkA`8ô!Z`Yv-,,$ M>skwٝpʄP#fMEBd`(iIPBY ,|ͶdˠX,,[ldddxxX,fZ,Y` I5@ )zȲl2A` Z2@wﱾ}S%V*zm={wwRf/Z䗗Ch(g2Ç -"bQx6 gٳQA(o3W7DmT9,ː_/Z4(tgr.]0ؘҧew+ı`q^cǎU*apý dzw^e$IR T333Pz5^hL&Az^Ne͍D" NLLiN7!Z\iQaa`pʕ>nfֹ\'OL^TsǎK$Vuxx8 HbG_y$IpP٢X,>}zvv6Nb|kYQd\l6TTvܙJ/xu 8-7!dM<nn7 #zf1,>,+vz`m;>!_U/݌r=>I BlgFb,Ee<:#3[pYwry@ u|t${bmFFOa˚_%_V[^2xg|+d1=q "+VUF K2J!zzaٌivSss`V*?O=АwE [kץwCsK~')Fv錼'N@cεCu ?(E_TR"H{ԾG@7 rQ >'IR;{qxV#7CǍj\pPyt66?t2]_xFFF"^޷o_^/fWpL&[mc/&=855U(LЃwO=tJEutt@, B!h$Ijmm8n<Ϲ3H 4-LK0<CƍIgI:"T(ԼV6Z Y.[A56*V5`WxÛ,MpxX>T*ݼ㡵/iZz;v-}saV 2B2BO_>δxF:O 7B]gB,_\-%IW(;Z9cߺ!l,nfHSQ0UU!aԼA*U3tf63 h6AQ.늦wS IDAT烱(R)|>^C l6;99 2yiݞO 9$IPw$IPn\>}n7$V, y7cccJλsd2IDss3RxPtwt{T*7'NȬp8H@,4U(^pzo!u񙙙@s+"Ǘ> ReYe^ÆK M&քN0xA *g7Bh̓FfǛH&tjnWNu!<{!hEQ$qO}CO$Ѳv흟!UX*!@}0߂\{sba/_{ʃ*;:;!O81%^M7i*c4_T(JMNO4jaY70M5{8LhIbxxksMM=,Tfy7Y &dYm7tOD$.jlfW¸UM#,5uU>rH\Y.|/<0pZR7tS>卙|fkKWf[/Kp}c$*'c ~balw)}d2 #02!hb(9==j,0eٵk.Y^XXXl`R 0gc8EQFGQi8ǹpupY9 V*qKa)2_^˯Sf?V G StJQű<%?EQKb" !|KZߋF[6ز7'KN)i!\p#? ‚h<eb!drZbjyP$}g̋pZ,)Q盚`ֻmho?go|E" /uOq!4xmM!,$ڜNDPN}Kcn,FQVJ l6Wmy9t^CrX6f*Im]n €>gVzC(`&3"Y-[gΜm˲cMp2 1]@Zുs8J~+ {Ep t 83cWZ$ǏÍ[,CPGGL W0YfRʿfaYh2y玜4e1GtBbX*Ѩ=J=BrdG$IFQ@y+wH2ܗʭ[uەJ?˛mFC1crTUH;OvD.(SDD8Z@߹*/z>GjPYN"ё1.&99 Y`YJ>P$L*RL41fY,҇~-x<4M_>yAeeC =wLnw\X,oÑ@h/$p~n~W`0]&˲ v}Ν|gb[98X馦&P qcYgV{yR.5ESFq`lT5t7̐AR)К5k/_~ ۶4 9c `0Dl:2_e5\.+,+Vhjj8t>|%ɵv;H:S8<q `躾zꮮ.)P˵SVw/ETJ(JHU:I5'`ql NbɁbhse xU5VR^VkH4ͲBxXFz. uɯu.8\qgb(W/w"5sV]똯5$ɂW,+/q"B!_,\GVAoi{w!(ޡqEk-m$I.,,@flX 9MӠBdR$R*n/ BA6 ':P` y@I^X&EBTTNgPńiy B!nwww\.҂\v;'83Y‘ǓH$`SXVf35 YOև B]sϧ(j߾}Jn sD}wJԩS# 顡իWaGg݁Ӄ4MNl't%\U+4 !b~}7A͹y110Oah,෶ \'HxBmCg[.Z͆Z~tTjYzzH3BH~};5;fB.֊EQFGB\QQ:^yѡxOZ8lj✼ MSn̰u-4]"3r!qWϊf40lLHZA_QUM!:C-繥5~6+Yںt(q6ߩI +ŘLu4r-\rɮ]AXę%4,5JRr ;8vrm@D<)"m%6۸(Qgzgy<Z߻)muL̕~IaMz\e}~Bڱ$aŝsN8ȰLz xxzIeO}*,¬W0 ki6٢Qabh-  >~/xؽ;iӦ/, _sCC矽6l6l~EAM!ԿdSl&B|6T+K4cvðjZAu+WdUhVrԢ58%<ϲ{z55'8~Ǐ BE\T30Xl6GA(yA@ DQu=ìѯ\.\.C(d4mxxl64 83@  .i?'#UN$` ĉD{񕠢teAp wy`$"ɟwv^28 ƍUw-r\0g8*>Y\Bt2iV{j hR_ %3ѷ 2e$MY>99YY'b%ՠZ!Ia& /L~?mi*|=ǭV+HO+T*8NJP(躾tRx ̲l6h-R85M+ BrVM$eͫ0}-߯RlZ<L&N[qf 6iΎ?/zdEfY)_*=4oeF+ÐmƎT36;{늬,>j4]YJOTDGxYCKW].Jq'ٹj,`ӓNۚg#'_CP($}zL_<*kh*$y3̽Jw*ur9$B~ Aē/w׻΋{k.{$ƻb;woDzӛWv{vv f(搼)+|S, /ar9O+: BI4r<)l֬YN lbབྷ$ippۦwu!p'9ݠT婧1NȋGGGg V+fYKBO|BQH }N&5.3 Mdz$vȊV5+#C#'"EKTÀrV" ć>sq>\|8B(H j Rx<^ժ_gOe\od=< Μ)yW K/>oC&iS *\SSSr{f[/.*=733ajmL\c}v Bd^\g+3.͕·/FT߿;R$I#ϖV Ƃ0N$# گ='9q|WވCf8,[,Q1|bp8 Dx+]UV!hia1 322RƼ^/hVl%JSu^6t2Dis7ug51}z˪`O*Jhd*ΛDӿk*ZfN.Q6BL,~7 Fm^S䮹5]""^"k_{O7 FJ;:W7J]8ZuHɭ^mcѹ2VVjpp===0):zhT y]j ֿVӹyfP^>}& @ykR!: IDATJ$A5M. HT*`97GӋ Yti88*TPET~X!$BTVYЦPpMBmBL!7Q/!T #հQgXURHLB B( NV{V !zۋD Ӆb*1\V|ue<5PI"" IZFrFp~jZVreVke]8'Dpjٺ4lٲi1ǟTqU6*B#aw?%2iH83%ȇf6%wj2qd^A_VlKKK00lffP(LMM H. L(B0%I(B'''a7/rgfaapdjjX,B[\. .'ɞH) Yz5s@eFR!EXn &rppa9faC&r,(\.d2? 10 䑰A,:v|tt==۷ogj b%-P15?fL ppuLOOl>ZV[~kg/s<bc;vkRtx%F C_J^InuHA,?ᅡdCa$I(Rh4j6ΉV)%="qV=\6^C}!$Ik+Ce}1@$I0P2L`;hkkzNrޯH4d +)겢۳a~B2\}:wsWmEa"*/VSy^Z58Af 3 L{a̯ նrJJ(0&pl}=ohj<D0 m6g}n!H:/fl<ǟng o2 c&)Jc4HoVlquw9^neYAdeIӑ(*W*zZpJqu8*2jcjجNŦXV~snϻAU7! 1 2}a}}.X?=5ŲZZ!"B!' l6 r|ϗ{Ocx!$B(˚""}ěB4MU[]9{oFΣyK+TjӓqC8h)xZ<BPC㚳92ؐb@@dwpL(kC_GR"dhMfAJO4pUR4M Ztpztuw3L[[nxj-Ŏ,RR{b8*,[/!f/<̃6 >zvb1e!d p ěL&@2˲!أ#G8p\#вE+@>>>d+ k׮v㲱0Q0l6jjUU5U#$=s0Q"px˖-zwށlSq:>oŊ𯞞NUaxX,n=(n,-}CАlqZt:| _r i}y(uaaYJnV;6~ \H"crV͛-fijZ !-ai 횦!Z,gG)!1_M(/Z[[5Mrb e*e. u]8**|VUUWE5r97^4_WU Kx e/䩼o$ϓ`P(xd7:vRքna6ϝ\XfxRewgrݡ1W U_0 HDŸַߓy$wPHbZfOx\4 \1jll,ANZ6 ;|ӷY*B(r&Itʲܴ)o6c8LNZVW(rݻV {$GO"f<;HUQIv8*P(@ 7 ͊QN\yCrK/i}PGfs:Eh)/2"eL$ S^([ݝ  -͆M_,~O(!m'jʈp;=^7֯xg655AhN;~80$9+h853P3L&QPhwmnn3mg1p,;^X ÿdYf%TCƪywpb`4j{dfD C|^[t:RMOI^Ns|S]]:$G@ uAZ,Y\7zm ug+k$^ã5 l6S<9Qfvm2{SSS 3( Szץ7-Vjnd*V5NUѴZCHd(:=qJLcKOO!mAN PӲb}j5>x0h C&C bXl p*.܄ˊr)JV:)k3JDŵŲlu?:2 JR,zw쩙ٙORǙ%b1A~N7 qc(IB a3:Q;eYd>YV`0Fc*Lʲnh0+jJ`(ʪzʻ'#(0NsACC|V__/Ir$2Wմ:+pIÉ(}e! ?PVDG3)ڛ*Z@RӨˉdA5_K#B׵I:ϟe b sl{Y=INcy^VK{|^TE禬u*JRAyn۝u G3XՎ͊"ea8bw,߿+V$I"Te{<> bS^oIjIdsfP9kY[V˥\.?K{uV*~xm61pu^ (ʻ>8x{{;MӲ,l6L߽l2O:$8^[+o6)^8I?.TYx`,"eƍᦦ\&RX,Ʋ(xG{3)w}>*T*A `Uq+:я''-o64]-QAUTT0]\ȉL:P+X,Ae"hIu|읏uy0bN3j*j +2ώjPVii"WY$Y@ &!/\.[,P[ZnPT*_g P3Lٯ Rq F.r&t)Jdd&QBOSSsJY4˲Zmi~~y^/PVZN+Q5 9ܲΫD"Uf UHSa T*Vh9(ʃT,3ԟ~Ic#zy^Zf-XwYy=dX,NN7[VAd#*$)҂f: Cf4ReÏ#bkk+] Ȉf 'Sī,ˎ(h1eMDHϤO/i4d ۱aXf㚚Zm-RYnll4`0f dzWСтR(ujj82^7vt;&oKFY+A }[y9qth~fN%Et8.WɄZ,kw}4OĹ*gw8X4kԚFP]Ъޭ۵n6+: .!+d;P 'QB5.sH!^_Cg c MFxUdRv+Xqʂ5gql[ l&SZpb0, h:nhZ[(?/rakTdYQwpBOPWU'Nf|4ZV+z}q'**UlV׿y(L?B3:)kY:7v8M[+TYT>JT*S-iJ9ae*n©ĜEr$v,r4:!Fj yL:oKgRI]U:A {," !*b(2孒,UUCFk 5k|EQ_AACDX/q8r9؛l6gYHn0LJ,- 3̾} AcfEYOO$I\bt: m,M&SKKYgh[WWg&&&&&&*hss%Kfgg󿛦o%{yvj-h4wd2Xl1V "ĩef8RV=3?*( ﱟ/{mELc `Y)bן}uB-l"#YFH}\r)=d6ЪR)H )Y0n|~Nkjjl\.722299966`2qTlvxx8CSݴ]v-49眳iӦ?VPjzxx8NSSSy0|@C"eY dݞNn*IڵkZVtT$I80 !qv8RqV4|>Obiii=(N:9v fߦt(~PU*^p8NDHijkkr`p>N%^$0-%8tvHݧx$Æ_P!þCg;M,Y[p纻MDk];WjPȬ-ih4M8$Ieff7U! Y% [LZ pO$EAy5n!)I, iԚ1%YB.Whtś&hZ]8Z,to|,K$ aq( `/˚tXê]_JfgYM&O XJe T)a +uHRDQj HGYn40, OHeT AAt UתFRhރ}5t:\J#ASugm/}#?DθmM{AA3ED]V]. a*F'F j'V.~$El6 P8{Pzﮫsݲ,m Ĭ7f)V__aؕ|FuT>F`"4>_< 4MJ% zY\aȯ( j2 B34UBR$bm BktKeJ=fXyRY4\OBȩb7XPkL*o/gް0PqC$ߋXieyq (* u8Y]CPeqa!4666;;[)\z5ǓyA= VbYګ˛.(5!PmBt^gY766NMM== #AQD>( 4Luuu 0EQl/{1У^@TR75yەX ¿DQt hԵ(+O;g?U*2f|A$k.4̴ .وµ>/B@ߍP7BadquBP԰+IRQѨ5-o_هTKUVV kVI_LE RdYV|aRᾟ%A(IR4v=M#4de>F$Wys]4n KEF:H$I:a7X5K&bCJ}j PX,/M %a_6EQ< IDATq~Rh짋zNq! 4LY7PA̹\>n懈П͂9X6 \;:>ӫKBu1 X3=%3B,BՏVk])hq}dTc!{wr-3n)EQgfs~Ų|kEjV#R)d2L&]NWrlMMh$IPCD"!&pIB޾|m۶ \ CX7'Ot,cj655544pԩQ`sõZ yTBUa@Ѐa|p ,c WTIAX,ȑ$OVd 7%Im Ei&7 jm[UuHr MEFy!6w#S'2sZT*E~S촷6za_'{^՚M:okV"ʬ Pt,$"!Tx3\)JtRo|{t8N/,]yE!QK|S8 tFmW=f/b媺\GOvƢg/x IYxZ\!tًEnwV;~=U0LT$Yv}^55lozo+જ(Y~T5,H$#=PxAAJa|/<>? n۟yf:ԞgG3"p8{z~P.l6l0NRa&pf#YEQj5,6 /"%:d!"ONNIe9 ΕN,I6'O$Z! 4 lvrrr``@z< "8Zm]]B(,]vMVg2P(zN'$|ՒYӟ) A$eE!y 8ֺ.vˋڿe706EQ\d\?3,TJ[v>UQ!J#pzd%..;;0LQ *S-ZՑxaؑh$Iqݝ86mݺu8o߾=g3g+7?߳1LLLl~K^ѣGc_ <σeP(lݺ5rcbb"a+V[Nݻ9* Au h/Bar !p&uuu塡R$юu&G#Zj### À * e7wg1qvt"`u:]s,wSo߇Ms1,Ũ?=IJ OВE8B=|">6!Bccc\.W*@sOf]mY/BH x0 CqiFeD KÕjƍ{V$YAaeV/aH)~/H[4Z_ӝ\6Tv#YS]S5M!lr 4#qIw|fn K/aPjH;Ah5O64+_XWo{ж(Gx|1A,F k׉đXu4n &YxKC#֪ΰ'xh+RV1m!$Ȱ)NʊF9Y ܲewޙDGkjs; 0=j|w8?ǎrbu& %ȑ#XU! !Y n, g r/`Rl|>dZ-Vz=bEQ>|Jr:p3.A?3*Qɶ )2-_LgHdeYY$\xFu&.`[*b8[|7iZH7{Z__f͚!1FAVم {<w \.OOOC̻l6Jb;JJhrT 'P۷z,Ϸ`ӆl:8BN!H[+JeYQ*}Xg\p19Y糮 Y&&/@_~Yq5Y1٬ 5633ߋ~Qy^h-M&wv}zqb}Kֻ,F1_ȇBʝw":0j0\2F{$JѠ46|i>Pezn "vyr*0Lؘm ZrD 'Lz?Toْ(HtD5kKINO>d,-"$h?Ԥr[_lhVid~?w߭et2&T)se{;!U%IT=tˎ}6cssss`p$-'~TRx ?GLmÐ`ӏԷͮ5΍/ZgIӗ\~8(Ȓ,<;- y ;.!ZiBO;\ iQppxh..)K?H^jP1a BӴ/Ux.?f$nZ{{WɫOYFQBAP@$ÿ/l?߸?&` ( A(L+碒$Aa@y}Q2"B`{yPcCd /ծ]X ',O-]淹B\|`Ԣi Ck7sw5 nnYx/gy￁)y)ET o_.A͝:u8Z(B6և[D"& 8r {NT~EoS7:JXyN4mǎ-x FS(D9)(*ݞk_8a}{3 Q4Ȓ4V5wiH%z6mQf%˲:O~ U;uttdq˲q%'Y5ƦslR#tWV8;~w âEA8x nwSSS& ,/X@P(L&ʕ+!0bhc||̙===fyff4/LoqF)YV$x۱cABD\f8L A$^+KEլ\@NƏ?d>Quߍ EVb1>^?IeApgkrM= z!}l8Nz 7~/\~IpYT 'CmzzlH_^Vs s"ZQo5Wck^\0lf:!eYQv{?%\q)I$IڵkO8122Y^ާiz!9_x2$%I%c$IVwuuy`0T> mqKK lםN'Ag@:r(AnCVa~~n.8(lyJ 4th=ܚiok$zOZԈ3ȂBT|vbhfffw!&+ʥӷeҩUL|V333p###}{zz]o5"*HQ :|MM^DEQBQhcţH9ʁa Mmg ÈUfwgHɻwL>Y^v3hQk/T@K몳-Lƪ9'O吨&R3>i0&&x/V*ZVuTDצ ~bXCdžMZZ->_VgX$I8+aj́1EUٜc:=4>9j;;?[[sͺ'~+WL?xK]xei *R7.=kꙡ -Zjn<d!țzzQ8h}Gb>zRaDAn؃C) W5tsTDZj6ukQʗV7pGWq IDATT*k4NN 0BZdwxYaX6xrW#4O>8(!CMP:˯}mk(e)3n3aR«OӴ$ICHiA]es).[j*AåW/kjj6M&\.sot: nz]Z%B$B B%p|00>y7 a$1/_%Pa6=j5450 zj j aoL_u$ȉ?}];}tGccKQè߾﮻EٳU|!JiZKe`;*ЗO,;q%(Do|fd2]. r=V5ô g9hT;vD}kѣGc؎;v}QVɲ7 #x :pMӠ|\r`$Iil6 BBᥗ^LMMaV(IzVhXV 澾>hb`\633CARI/$ǏApR)&L&gFFnݺo߾cǎy<>n%"qztƍoFl6;??!إR'j/˕`p<4t\.L&P 7baQE(V:D$<OCCC"(o}3w&(poz%!^ (ULM/SLg2nxW_mN d)!T=t:=-0;W|m9/^V/̫-=}w`r+yVB!^76(ux澲@f+Jp1 V---6 yVk4! 7Hmvv+lkkKDvrջmN*P FߚPx<^]8nmV" 1Ecm*ZEG_o].۸q#E|e23poaa~ (ZZFΤC/UZLH E~ލN;>>::|"0L0b5k#E0 CRd!Ϥҥ(>؃AR_-opVQ]VP!jWAE͸fVb+KZmT ͬ$e9 _2nAZ[|LN GR0("O\x$Rʧ_T2+۹o$W_5 m#I% ðPwϭpN+fS_z&V/XX;ڵ+/IP`x cqPEABQR(^3zWCCC___:޾}Ԕ^6p(\D瞻$7|AL|뛷[m(KW0z/W*p:uфX,%FTzwmTj||r\*yDq|fqÆw6l@XwWWΝ; AZKvP0sݮ=y$šFs29 mVe?T\.r4$I6Nq Z*Jlbtap|vnn2al ^U*U<|p"PTVh>?y$iVT@VTjvf9L?~|ll 8j5[WW9FcA>oժUoJM:@bXVhb:W]P!\+˕+"Ol6SP_'*FVkߒdH v]|?0<< ,8>޸XP$ XIx޵kD+7ߴ ÷Ӈw 0v+'_}P(422b1[M^o8k|C(#8SoӖs*<?tkK?XENko|XBzIV69g # ruIf?B{[<0XpaOOO&3?BmFncg~!t !$'_*a>Q@hs"iկ>i6-K$b__os !t:OsZ5ECH&93d/}o?4aRTv:$t:S,fs׿k0^AoF2x<6'x,mᄲ#nl6pNNNNLL⋍]#h4ʲ; ܴRAR '''eY/g}}=cccpj _~9A| ˲5t\rPl.ǎj---8'N$ F<nll<92::Z((m `B4݂ }Gsss`)e˖AasP8Kҁv;(# *(b$8Cp,9NHd2Z`o!SV+0`X,S`px<EQVmt(?FZm V3330Us56&~eтj$+x3,_xgUPL%=ݸdV!`CkL&i3;P }˟b<q;_MoYް0BtIn H3FM?q4M˲iY5*,+~A ,"3]wUes|!vʕ9Iu]u׿@;(ww???@@ MG̫_ n{лy}Ck٥tڡx`̛Ly>ɖ瞛A_{pon&bْ_\^^88J.o8׸vͮ={nJ8ٙIxqs,BA)$Z)WIjNDEE HT0rF0J"lvZ.W\q\\DK%:.QnLFLݫW$i߾}bѷ~}GG{Px4L@uttHszzg}ָfIGU5gSӁH$n/[pï*j-dbrbC_((E4̣ݻKj t=\u뭷MMM+x<>o6We:eAL)'ϟOSUR<ؐRu)YVID 8㸮#Ek*pꄭr^4!ПHQ1 !b,PA4՗>q)fUQuΝqXofv_G?8"#P!Q&dmj~'(b՚F\*0a,>2Y!MYPpûOp|@:6 }JQ*zT޴/|JUUMCu퉧^7+3C'8NSކcq5鏓;:;j2>'IL lnoo93Y0Ly #˅bq~A+,cAR%~|b#In`0@`ӫ{8l!~ANL-ChlpZ̛pf{ a~iof3 f4T2WbPpBT"4 zl&&&E$lwwƍO8o߾bh2[ZZ:;;111a2pO"$_^lZu8xǏG 8~5Ms:U.鴦immmtҥKDB~CuJSmO,h4%i۵QgD]=sjqu6YXX*vl`(;Q& um!EyӦM۶mŋݶjHdz,Sh0F \?;q> Ç@ \f(l6'IñqFUUs\>[PT*n@t&wt B6 4M=#LMM Q>/ dj`d2 Udzi&3gΔJ%`\_x… $I|>; HSm, ft*gKKK___:>yd\qWiL;uo^pi$EL&IjlbL *E dADA4Y5])*dv!^ *!Q##a'mO?OWikZZZ* [WD IP.ժ$K?>t߇tl)Nc`H#A݂ƿ\^*G]Snܸs EA|syX4-.Ib.hĚl6[jo߿g@勂 O=a}}}ׯK;ey*4nL&ٹ%GG4;:j'Z[[B޽/[Xkq<ԗLbF, c4UUO|kUYUU]HUz"IJ)cǂrϧ5Mq$IMӭO n0D1O&C`ߎZVsz!d!7tnFq6wlz5_5UPL}/:r8=4MJX-W-0C:jog?Q55cʢi$c w BSSHj4a;::Y `zzcM%Xշ(|۟{( ,˂ 7Ht hhhƎV5NKwHhbYrqM&SXZ{{{GGG*h6 TVl0v -oFk f3l6]s5(V*ftw}9[$g6t,˲4LKG>twnkQx-W"%MMM۷oߴi_x߶=S9ӣtkx. >e|[pyޫB_&GXZZz$U{|ZA\TsEnu566V*Ɲ;wbb4MX,H d FqŊ$I& q-[ C,dc477BbO ø\.A <l;˕A$XZfہ211.ln[Q|>]VRfkz2@`nVMc6nlf~ 76ms.\Àv2"g2u˖-@LJ&766:Rsne47qnzڔO(Nc+0 1ca7q !2IsEd;lM ~RAUޖɬ8Ir4R>pj4-7=WMqQma455X"vnۉBv];|𬦅_~0;7
’ n+VX,QQ*!RmM&@wd,B5{_Q z}8Q|goZܿ}ԩ8qoܸ[|{gF'?@+srS|6MDI;4 i~֯:[_EGWkͦ7NOOpG۽ɪM(޾sӧOFqժUVk ݞYrx<C^ gh6ATB (Z*E&''0 z?܊ DZu?sL4$ J! Md|﷽:t`0J.]uU{/^lҗx&[Huf@d-!iY nU,EF4aUTU(",w/ UU qͯ~4B!&JJ(ZX\djo3 DEVp`Yc+,ve>PZaG+G~ij8޴iӄ$_F|K&B>l4m>OK7gMLB߽A8f %qz@#ӣKC㥯焪$A#*կDQ,,曆_j:|>uY#E!X{Ve}0LZNfXV8Yq"Ditr9{tsd 3eGeIJHֈZa#oSnUu=Ug=Jۿr$IcccK9 ﳦjQ>WәtД`{<}kvbbV-, F#k61P*wTNʥa98Tlj5 #<_-ʐ/.!GKͶ山BNob7Oǧ/"TD}BzEbXs7<3ʹA 333=x\.7??L&CreQiGONmmmmmm,LP(сbvDnb877gX3 d$ 0 BZg5ؒM&S:xX-`6GK%  0.H(CP*tz1#vYd2& = 䍵/[ztTf v@6aZMZ!'B%b^`s#b!ezЗpXBMrаOOO7! s*,>IVU446&rne<$\1o̓F>Byt!QuK~JKUs5w8ȷۛQ{3B|w LXzβCQXounC,n#cKhzTeX@(Mw拔 ~v5;;7 !@a+:񋗌vK*{Df_o00j}hy|i:nɽ8'J|2Yf a{ȇB׋i %J\)|ބ}|exewww<X/y2 L/,F7{_BߗI0鄠L-(RIzzzB%{? Nif{.rPbba 5c4b-Qx!_J!45;b_Xt:3::jzמ[_?!foY3y V>OUũX,vǮg?>y ðHny~zz>n+/\Κ Rۚ(:aRnwuuR)3;;KjtHM7lZ|IaLxDnw>ؚP.W+=6m9a(/ Ќ+2xR~"Gub/27.xǓjMi>~C~e;Mx{UsC2lGMl\rB\wD\[OR&2׆3MѢ(68|gL;4q9oSfnyJU\* }o\ pH]BGGnF( 3n4aUt{ۮLD{k3B]GS*d-Qj4EQ#b6˟K7J%ӧO0ZPׯ3~ 46Lӳdnݠ8}~"(4 P{, 􂪪 6Clblذ3g`x]ve'''ggg S JaEXj -׉'p߼ys$ wV^F(JAIq&rn1{S|M劕JS|mmmP*>-U!dKMUo/VBuFdY.ˏ尺m@_=Qy( ZMQÑEûU;}gfQUՋ/Vz5 jiݻKyk ˲B:IYDQ0L9 #_B _zӃUU~{ _̵zN83vpŞpZ5Q1L±G;n~BWgxg<G򗿌l!~$w##:q\ω' -<\ k7-zVhb2^OoO H2Jx!tULŖv!N4ixƔoZ]ZE>J$I`X ԃ$I,-Er\0 toM EªR)(+. \fF~v FJ!hQY HnUÁ+fX,f2O&Hcx ;ayl#LӴl/v%0%0fus::N炍\.VTСAhxq;,h܍#x *j0X:fFدx<Yjp8\J\«ddmwEo0 (U>r~)fs8<Ԇ3&/joXm6EQd';̶mn5߾#}Ҟ ٙ(mlt^/75{>B9C]kkrkgeVf Li+b1U*@#ǫî#8B㚆QCmV!bmǶmC;oGߦmx{>>+@yl3g`~U\(رc8y1 yL]:*i( 6͐ Ih!3app^4 b!P+erŊ,-hݭNb|əy2V2֭+ 4m;wbKu}+鹊VY9?¤j:`@ $YHOXEӛG a,h\30VeWm~z1뺦IDݨ!$]*.EEq/E쒄 ]^_m1Ljmm^UFա!AKի_XS!T#1 ?w:{r!0O?d74Dؘ5תD7MlSKe41z2ᶍ]ۗ'*LSJ Z)fMYɚYQtCR8uMl~$CMOOW]muq#*a5D׭_Z3QX,bK I@fpeT*4ɤR)A 竵[,뺞H$ ɓ wKRyZ bO 2E9NQK OI^yvW-Պy=!GeY]KмZ^/<ƹto[l8a& .ްjyigWTyIUUӴysk.FڪkJaWÕ'SSSdX, v߅ B\.MtSLVA. :DnD6.^+e޾jmx3~-gF|STDAȇBD{;{h<> 1>A<3J  Vߖ8?;PS_aUUuM3 K_B׺X'GC'7Lq@_ҵ\? qjnn^kD]84\Fp 6L&K@ 0;; ϸbxGxӟ}ngill4 vvO A(BH}EEQgff(H$ d066? F\?wBNسC<3#YcBW<6BgJui)Rw4IpBО(|v5!jn<= !-nIO[+˃ EYqq(rr-g_wȥKLD#\) a}f>! )JnZm{N)m>,뚖V"m'>kn6߿34i¬逸7X=uITUu)v9Hv}DbEFaX.GFE:*vMU#iB"iJeUmTB:n9G~1(KRC2JX%)|rK j2im$1݁X8 2~]o7(*I"ǙeeٌFm( 8-mdܳn68̲dr9Uձp<_XX0 F˒ER+=IogW^+//1$IRb1Xwun6- x<9Z3Ө\2M5j`~itd󍍍PH+(JS0cv_YQDrĢ#% =~׹\kS=ݸL0dvS2E&f[o]>\~[G.>,fP*n0k.R=͓[j-CX&-KVgs,ǜvaLF#( /Ay:k%ۏ"taaNt"`YvڵPk;;bcN^zƍgϞD"1_rhT BPT*zhhfJs&''2|>:J-..fwES $Vۻm6:t)&t: tbGn @;l6 Xk5׉ ĊEc`t: CZjFU yHY%4Mll* bV {XܹZR@eZv-xC-Ͻ,:+=_V1MC8r{mX "#ME":ku3Iv<<=;kmn6.[v=WQlJjzޡ! zzz._sj׻]dR;˳\ F0z{[L&. cdj>y(BF, ΛeBjjUif>l,/ _\Dt{h|xLZ-m6ȕh2UVHEuLAz r$)J`9%ITki[b{ IDAT7RuS!Ez:CF3\UjvGk_ptaĿ|*ϋ=P/R;6T*U.oݕuA,+=>9iillnnnX,fn .nTؼ0xz-D<f4M{?, "Є9<h444466B |W)s*D"fYJ$Iwޙ{E@ZR8l777477Y@n:nzh4J 8 5P6@ 8x<Xz5˲Aqrw#v\@OT 'ɲ,8ʛ҄ÑH$5k2y)b93`:vȲ !+&sssP毿6r3cٜ7)9lLT*σ歱\6xv7p8ΓcdB 6s?1Ð$kjUᣕJe dd~?|C;Vl>%H.7^yZ]}B<Ϝ8νnw8͋mm\:ʋ/nPDAOfp8̲l$i 哹FiL"! sszE,˒sjD>uUuEa;oaͳZvX$i)(aR l9x< (P ֛rhMh2 $IRMSɘ3YUR3s՗&rCC"xӿvIPs V<OxZYgb[6Xwj53z]_-͆l.,;=syIEKm6(*P=;MlbZz"/HD] W50{vCczͤlkZ q&5Qq>Z9461Q_v-0SSSzl6e2MC!Z{;7T(H)$Q~.RvYPcžPVD\aZ$af`(/˕`o\VIPXtC_\hXx Ɇ_i`hnnnm~ {m}U[dMHMbHtҨ0yDot5u\r.4*/MʪeÆw]jnU޽[ Q, +gnV1ާV#DRkk:N+~]a)t31ukB˧NP6׼^ #Z5[CC?x<$IS`֬.\5+ܹsգ(w@m0ߛ?pPL&(X,'8~p0xd`8?(& XrL@M$LX& *b ԫS߾v CJ8x X\ /lFhv݂ j"GCe0 d|>p8@1JRj"1i\.k`w(k$/\4;AF=~RIpj5I}<[KKKKhL& Xz5A@ .4kBԫ{}BrgP(_(sMXboZZZV[g=z$xHTR\۷hvah+Ԓ8rS+!Go`@d%bjO-wTCR tvXY !FGG1 >rAMQBMӰO*GәTX]g! ,e$@tu[{Srx.Mᰧ7N-&rSVUhTnߘW٢V[YU"oU:& xJT۞>]XP D}R$I(rfyhT9T`}ڵܽUck0$ W}aUflN3N|#sDd7oTX\) 2%Q4gbFo dUtgb1T:(: V I3?<9H$n&'4ƌ|1T3]z%ncY6 0˱bQǏDy:MVG۶6m[y<#SCdٌF6-߰ MBhHpf]pP:b'\$7=?X*vSOdnSom^~L1(zsXηJ&nlm%?*EΤ:N/ElR}Q3wtHFv=+Ig(p8J:gx9jZ\(5d,ۿEfIⷿ!rmڴmrri|_>ZX`j9w9hTU Á@`pppvvel6i0 0zbY:|Rh|| PéT `~h4fb " 477\.Ȋ" Xx<!țd/N&@~U~jՍF].(Bܑ?V+KTa( 6- B*]=zjܼy֭[t:~(uag=噟B?V܄SUU[Ejccc QUu)aV8vכ8Z,C}Rzݵu NG OG}v Pɤ#V---iI$ID"LVK$$_j"FR_&eKY6Qtؾ)8:zu0vj&][+v+M{nD4oUE &hɃݮXe5666ɋn}偫J.H2m[!BUt!.ihK [;jjZDb]v/){tchI Ϝ)K9Y"AT$%ʨPREMHTUud \0{7㺪,, o($,.KkKt:$h+u`5hVpuCoV# #ŢiX,+{nSaMV&0"kkE$Z*Ifjp2|.76eUW︽%QTM&fP&1Hpxxvwh!P2I[G!'%w8$ aVkDTgYmߋbX*nU7iի;77 SSS0fs֧iiMEQp/ n /zsssBaqqT*0L 8h!&L&+hp<Pr577+211Q(DQ;Nf 8?BN6Nss3`h?IH @~Q.+ ccc@u9\LdF'Ɗ%`Uht:N.]j٢/Jbpn ^'pcSS\:;[T8` d_NN|>vo@顡`0L&S=\U^D5ul6 nA堈T57%BKkdpzb1E"r̲:b x ÍF!$G5|@`:_ZvW3w\R|=$1&cztN3CBN'u Q߻,|rS嚧f'EOn+V -F}ժ6 ,ܱ5t:DQʴdE,QIhBH- 8&;uvGsf! ͻDIf3N͢ÃuꨘpP1mW4<9pQFٜnX{Q. \XY4TM[Ir?){2,3}E-YV圦zuaY!mo֪TI*&Mحѯ\!FD:՞SIV+(縥KEsF>HXY2CӳOQTRֲpXUhn;ш,֬d,Գ.$/1a @.߳ڲ*,q2E}]D߽Lf5z= v9::-lY!thhwB[6K* |eIӐX!IQ/xzURnǎ46ni 3 rLy쪣=юlb6?Lz{{[շ݊vkJ[b˖2QnZ@ Hf\S?)ɐEQtYAewT922222rȑ*8, R4>>n2l644H1AvO:kj,F`jkk!\.3 #B]]l7ֆN[dI}}=d0v{GG盘d2>n-B4q6:ځ%Ԋ+dJOPUFӴd2 i^~W.v>W^yC[[[[ZZ&''a mttK3D8>vR:66QT LNNb`t bFQ,`yvv4V ~5P VT*$e29NgF3/psU0uf\M&aħ;Ύm\Won <=z48n6!xe:0 8EH(0ĂA)DXrּ,I +v{8c`0| Ǝ٘b{i,K,RQ}qM+###hiMpe).64&N$ISK\T94>r{ՄfپXp0="pgRo6D`zFc{F|f$%KSSMLz Gn \,.BKȅBAy5S B""A(GUS1vUڢјȁ@@őWWd-B3'k-It:=2ssw-ߺ+HY}qUU=U2h4r(,u:fZݷP%gf kSCgәYݙ A]B(Ć9U<9@zHRk^#Wf$t"ztI,K 9p`kY_c? NtT#D!" d J N|BFQV #/ΟyV4\n⺛J%k,V+I-Qv( yZY=]qk}h,+_s8Zܻ=Ҁhsߺ'pMU5YTVUeotKL&sᙙb?>hr맭nD^e &(lFp! !rwiMu@0vYW`wb~9A@EQT04 x䥗nU59rT* BӼ;w݊"!|Pe70ݑ$}DkataGém, 6:&~SS@Q:MMӍm/qЌ#naYG1 Hdhh8UWWWbVYEl@4l6dJ,6{v;Ysƀ3a ;nS55fTb!V &)eʢ( ڑ+mcaxax`$BO >|> hq:kuF&h2IDڦsYN`%rl?Hd+JHH iw g!HtzxR*s8%,k% q=[;c ] ]` ҁDBӲj^$isV[osl髿ֿOJ2/TbF#hi$+7^Gȸ`jrDB'NR&=bTHU4M;YX=0'IeYsA$Y<O0X%IY]<'FƗ[A<âavR$I4\Qp81R9Q5$dCMhaJwjH^|y_go5i,p/HEI$9eU*YG8b\.C apb##(MFhNB;LdA)S- L&v,esڇ; ôb^KJ{^ButtLJ"J---^ol@6E </" iQyPٲȅc='0yA}~JkzK*ˬ6K` 2 ԆXںnl"|y``;4Y2IRn/_`H*YLd^N$Q0ocb9vB$c8IuD1J9Tp}uz^r$1 +^{S(r²f^SأFKWjV,m0vZ`"&Yh4Z{#I,bIAx&@ΚG+GdE.++y[\BU >w/~M$e2877Vw} 69j~bј._@A$r h0_r庵:,B B` @*jeRp|:fǐv{^puBQƪpTQ+gPן:u*N;_F patzegggqBjBn˲v*p- EQ%: ðB!N$$Ih4677{<dBK[N1n9l1O96PUU533ST TS;s-fg`陞r\-~DMJB[IyV7:t76Uەe{qx\FEp&?t|7ؕȌ\2=qjdpLH$R[[d0D(HEe[Bd2 {fY$# pMQ i9Z$=,,,4 \GHQ:qj5y^BLMd2 6&` x|mCEFFރ=llx$S)#J e XVq$5].E e o6LN#hڨ"Vd^NҦ:* IDAT'ǍF#Kuŵ\(n73LdBU5d2<Gs}OeTfBW.snu!$ 4 Ģ{;ͰT2V J͋lkEQPa{h: 6՚.熧?:"m~+Bȱ'kgw*O( RT CZNsxbBznOU? %*sz=ן/V}gn|zffzUU4YV*$m~$oY~}Wmm/'H2r6nPEUեGma*^[N,0yذiɭ^aQJBv.wU2mN% Q\t8 ]uuD<.R)Ѹoʗ @ހ:\.FH"g|.n;U@mm- Ng}}^jjj<O D".T_n0/ wwwCjB?^(!E?:u:q0 4MCt:Ŧj\ 6񒌽| ^ r #tThMQ+YWD} B^YN *a?xl6ۖ-[֯_b jq*߽Lhf8˕Jϟ.cVzsaCa}###{~:C;Qbtttvڵrѣ$I677[,T*566d`lQHDôi||S% aCq͚5E !-p24-GP "/X,,˲, z$~鄠D"N=d20/d( ߞ;$ID$IT383Z'a؊LFZ^flރÑҋ;3[6n==B"jfJE\WB""(RES.ZCJ!WjJ>=AUL:HD"8myl !(Y{bX2?Emnp=n_E"!:лZ{G#Θ B[׉)J~z=0A Z߾䣻-ƒ͓3y`m[\vc9OtwDDj>qŭKJE"I XkOKDDb ŗt/oʕ`i=S1jOY,{8#Ja0'FiF _ &ߐр5η/`TV~&\o@g nYń9Nu.P޵|yaf_yGfIr&sl6[ N9{(d2Y;^$MUu) ӽs)2LyiU5knjn >c#?ׄk$ _x<$R1/A1POL&AdYnhh:z(P!eY# d2CCCfYGUUղeɓ'q|4ML&0$.NW*M {ܻ:Z*z\B^˵K5M`/Da|m!8^]] 9,q777@@4  NKR:)d!,[ e6mvbZ!/d||< m|>788F8N L@\.~<QIb؎7%Md<,X%HAѣ+W4,7NτͲ\T#&^lf"Wi5~dF!@W q{~ZC7,aB,c8ȲTD#.8v}= Z[ZN]<@!!!$Ybq!U8g ju2>hזdwr*i{[TU$HA NhBm;٧>(T}ǹ   : =A/-~kv* k. ʹ>Xjq~Jy0!c6/*:9N8p$pWo@8v49"p| Plhhj+ =CW|c8c1$Ks'YcUN"t溨|MClUU-E~^͖3:e?54ZQdaz{dEfYr^g$h/4|“#Ȳ Bڦyv Jn FCۙD&vk[{y @xd24tιSN@>c64M+SSS|zsssUSSFFFAwZ*b Lfzzh4x:::Y*Iէ8x"~|wE t#֮;xZSykdMU;Nmē:d/oղͽf4CсĩxR[̉IQH$q/^%c/Jtiߦhi`pз/`_f\Ux>fqEQ iPB\eño#TjqqeYǣɓ'3Iskӭ :]c@ a͍m 6z@ 񻮛~oMSSSSu:@v}ʕpxxO~nN!T?B (}4rAQkHE"Jkz_>P(dX4MK&y {Ÿn>ji[ _i@`?y=;a` *NA#az9bhZA2{g @ zx&7Phkk^b@. @ sQT >PE7yaem6nw8~u===b񡇸bQ0pxJ&].aK,1x+9jL1e$Mw?"fq3 Vmݮd25IQZ2x 0 d̓wŤZIv]Rb dJA!So( b855-8F"hy<(2@Mt]]ݪUH:w(X,0Y7a%eA! PNgͯ <9jfUSu{޹MDߚX C+ji 2ozzZQt !њx7ҢK;uM]]]˗/\։8c(F j\}k B E^.'ohwi Ə0lZN. ӕ+V;dW/X|=r, ^*NP"h>`8 %K& Ld2966aX-e\XІ rɓ'eo=2P*#~~#c^?6 N#EB?>x;q$Y2#,FYA5 ;Ʈ:oieSU333qVUw\J$ᚦ-,,Ehnnb ESUubbO,˂<0 tƍDdRX,fu:]2eb۷ogff?ݽt: ͛fs{{;DX,Ac: !U$q*DgIeDh4:ϡ3\E(=>tMdc~ęRc^so_֤7EafA ip o_ŗSVS≸,+, ?6w$yWn4M9NQ+ $Y?7=n-q\QTY B#GROB}"+@JwP[7}WTkBO <333==YߑlyCh4jZE\6'eg׶/_>>6~yݏ"?H0L5O[*09N2YI2(ChOEQp:ظe˖ݻw=LB2AQ1 d?`0{vNBg$l6Jt:ݚ5k.;99 !5DlRIUUݥojHSW1Fm?kmimnn$Io0[,..V$3iDaŤikgҭ( L6a͚5= '#HsB؃ח(p[/}$Q]U9LXJE I^ORP.ۖ r|K'_;#U4UhW:kRiiBqη;2U*ian"0AɌf4h_?0r1޲qK7KBӥF.]`08?&p+!*HWygT5^ {o^D)YOVsHeSSSn{~~>J}==1syGo84y`aMϵw!&(1~)Gsss:( _|d{<&,K,#1 > a][fMww{wH$2vttd2BPTDX0ɓ,. l5Fz=)裏RBC:ݔ灣 L@wtt|nZ.ߤi9|0ӱ4qdr``:fBd2<ڃ;ͼw.F 01 20a~YE0ۭ̱lC tѺ3?}>ի盃W|9HˡSNI#A*}ZT/# ADB8/[n+ȒL;wu?X˒%}}}Tr$׿tWjj020LwRflFn>tXӴ›o(MMI )Zm1W$xkH;EЈ0Ȁa'Мa'\ӐZRuHGVvmؾo r瑁iV iȭ~d`2p> .ˆ@R蘛[0dYSv{{{{KKKccccc#S.:t7'p$z~K>'{{ RGdD\(E5E:K}[y4 !cw^,ݻo,a|)Eef7ug{|iTC{'^yۊ {]fV,_s{ĎOz܃3\7ËshTd\.o,i [l=[dmWm,wP^p-LAiSUg1y277g?Fk_2B3zswUuH8\f ~_qq EQ}x0 ۱A:(}οޕ|B|'b6.Ģq|ޛ~Ǘ"BEKr Vtg>e.|c:V[*D,@zy=Fݿ|61`MMY:1{i׮ !>CI  hlkk{g_|--AܽEE澾>I*2(D"\.\.|*XUz$I,B!I tX,sP(IT@;MMMM@?|06`CCC[[tV L0M'ZO%+8F IDAT.B(tڇ4Ud%NJ>8&M@p̲l?n;!?}C믿>;;;88=V( Sck>EaB"yH!^w_F>/RT(Rٱv{[[T P3330Nߔj~5#tvJU^D#IH̱Heq<20*չ\ӹh!iإGf2tdLc! $B˖yyu {n}`Z\\i:C7`=Ґscs<5L,2LƖTg4 SUMT3\MԴqFQ`~~X,^V{OwkR BSU)g'{me3!LCB4Kv#iZ8ݫqY?jt\.777ONNr9qF~j_IOyGU_<Hp 4 csozAIZ5G"@G|`л}+;EAM6ivСL$uoexz0T4UhD$iw,;|0h !TSScZ zw 1H@(jNMMA h>ȩBJ+V8e˖uuu]v:uf, Hnmm-Ț q,M}>_( @p8OWUUȥRus}LbN< "ȃ4W $Cð`0n:߿O3_=sLO?OQ%4APLcۅįA`:NCI }^p&I$iQac0ʍ|~p߅q`l*ڼSw1a~ YF5_{]!mn6CK^/^ǷHx<1۾-!BTI!U.v&n~\.ycÆ ^seyxKKke>%}W aƍ\*@h½ƵkqIG "m666'h o$Qz1;W_~0}G̿^'ͅB)E&WpjHܗr_tx3|z~*}}MWvd43\Gj=%MU1ב$a}8r=v:lĉP(}o-`DC=k|oJըJ%²,WL uYv&0㇦L:tP6+Ѩ'FբSJ9k[eY ՐםSVUUCWWUUϼʧh榦;7^`j haZōчR*N8.+^]LՔX,UqAHt/0s^8L_;+~9?kUVubbk84}&(EH>/vAEQWx+F{ߒu:NCciQUO1.JػO)>7KaWPURӋT`h +" qM !覮. |`@$jK64M: Ƿyww/ofd8219w) R455UUˑodrJ].t*ʃ.ZөS!Qt:AOeXhoo/`@lisL`6$f%I2L(*j*0??U0X|>t:!>+@d1!@*4=88CuEQ+n2V^se`|]T*"T[[j.+\eYpL&?ZEt$I 3 DyәY/jR:==ykqaaAeJ%ES=AXDQ BKR G5utBgzBZIJlmmc0̾/i:[X{`AWvhmSVxPۏލa766$ S'r*RIteV?hw/ziC܆ fS?q\yBDc} kjJGi._$YkϫWiȑ#Ǐ(6==`4u:L kjj0 ۿ?awq֭[9bZAql&x0CUa5RUJ,a1ʼv$7pcǪ&YU~Qq9UMԦw`ݶm[ggJvR)̤m\|͢uۄ,8DFV}806mv83ǀZ7JG #^֧zdYnmb}}}0+{Z|X %?ufbR)R :UUL)*EaiJC$1MEQ&勋Fc2alXYg8רC󼪩 ?p]%-)Dj;3;s=M9v懗MleY1 #u$MQ6s =h4Zc>krLӴMg7mKa2M&?.&2?(N;Ã!!0NLL8&{,D>ck. H9"WȊMy*.fmy^Jw!~3I,W˛?Oư0KL\x_6ƒښf*U=[cq^rOBgOD DQO0Ľ "7p<zJ4 pNg}?orb j>h8pE~peC~=L[[͛&$YZ[mnb<Dx\.OOO;N@ 0$`0V=99 zz<Q!Rw2燇%IZXX>+ !#@ٙ M !:::n7Xjkk9cc&ՙB΃= @)r9BDfZlֲa MDuu~U?#G2F1MŬ*Hy- X|`sر{Fqgԝ+hNX"jVc;%v؎})N7˲e[eQ$Rl`Jy>i$>'p}~LVj!ۙdr K^H0hc}|E1zgX)Pl6_|iT 6V8؂˥4dziC7t8 䛿?|k*ebUIͤILնt+%1{_[NRff 4D1UM泛gV ۫?{/٬fK/3f<Ʉ}1Hlx"mrAn\.._w)a8Q$=b%Fc-u;&g 1j˨Mi[zD:ycG}i!7k1#}{w:gΞ;^nð0{Gbw~62X̖ݷư|tzbH$uk;oCZEFza1 _&%˲Kܤ;Mڢ s`cv+_S8EQ$[-`!u B sGm]][]_PU񍍍tak_V{i^Ơ@!Ͽb==b߶4F#cN;R0 TO}:;Jظ{?4HK|#oƱ,D"BIxwC6نn|XB`0Fi?A<|Gv&)4$u>|B冄 X{K*2==0 L#W5== ̓ג\L J4778NQT*MNN8*>h^ XBЊ  d2 Ba`q eAn_XX8h\F [) t: u/p#BQhozӛh^YYqpAH0PaL&SGGEQ׵ǏyBQG^L\.wʕE9w\<7۶mm4hhdYVɍ05V2ilUE0˳,˰BYZw{|^ W.T*u!4m9|4-Ɍ///_ 1 p9.h|2i'F6+ِM^֔&BEk;9p:Aonm3CV.4McZ#T(3{&X,&-s/[nBXL֥ԧޔt]㪪>?J $˲ijG~NWMZɴQS?vtuu^$uk8Z4U䧞 |8H!ᒅiv4gTCCզY<{-appc ;z&n߹) aK-!zrj[z{kk녉SVmyi)w\JO m߷iFXmO/ή[o-F'4M{w hK3x&p ,+v4MmwgwM;5|G;D2ۀ5I\.W{{.?dpTlv:$ Qa^aLl6 Ml6!EQE$hbn 4j Kdfs if vKQ@mll@5Ihtqd'Ot8`>6(uZ<wr˲P:m33?|yuR`J\8x>7ҮᘪgϞW^BNzແ(\G'|okxh4Frl|Z-ons[]BSykORI$W/zsU.m6[WWm\mhQro6E0jؓ006MYVHXE)JZZegHP4me 47w~xpm߮j\ѝC2n9fKquH͔~-TkD|>ܬ߹q5 r] #tY.~u,!Lyxbb `0wW0c+a6iW8:yif`GZg cfI1Bh %?k?U$UUZKggyvw>~!4w&ڬ{ULUF_? R<=Q YscC-fh3тsEJP;f8tPV;yrsa!=8X{+ -`<Q%V\Q;wE.(qSUo}id$|$jfYi`dYe”k ib4?*2ڢO4D_(D0`fhhHU=m0hZ*l8aTTh4{n(qt\Y[(Eѧ] ;<\.j56F 8g0NRly#O @V6AT 3 .p#ܶtti+,8FFF. ehhhvvvjjX_9c1AF蟛cY@2. 3z{I5F'lSuuu5l6]wЭz^*~Gymj@̝?wgfY}p/^:l&l!>(/<_~nV^ȑ#N9ioR$&q#}BӠ߀M$ Y A}/ |[B`2/eaaiՑ05]G:Fh4Ҳ1%fI]wJj20 #E)Z,4Es& <@$be)_(bF4j@&m8z (KIQ6b1KMX@Ӵ$ɢ($HeMSqBY"ϫ"fbf0F$)$VF^ !4IЁadR^Q B/!$5obL[>+?S!0BHOlk^+F c'nd2c0J% VitMӊÂ%Rwd%IN8E6#g\n6U M "3,9utHMZ;-n}sꖣ4Ma'Lt>ix& IDATȩ*iڽ{7ŸWMuIy3f~oP]:Dd%gt.:t)j(JU;x Fع9ڵ8L}GSVhTX&۫(Q^\-lVm?>>v]V B(:svP~]UUs|+HB$YPa>NT{{(ˢ(i$ 0ayCX1SRl1]ǽ^`oo/{Kt…wJ&&&Ţlqt,SUl]8پƇᗧ\/^k2"AD0];Z 37Wbx<?_* R׋ZaR*AZ<Ϗ]}}}4___y8\Ð ztz=8Immm0&K__4%twwChNLL<eLf~~^`0o2vrK 1|#G1>>>66V,n傾xϷ{"ZO7x`~#D}<øʖ6`sb 䧨+D D" @~(JI"D-jРHEI)YuQ`Z_ "?R}f_wvi^NLMM??ɕ'+.fQ.3sǟ tldT޳#kkkdݵZMp:{旅>ha W,Kdq RzCV<+Bц+{L&ә3g䍍RIؽkDW$pl!`FGI àV6x^ lt|YHJ;Ԏ.!B bh'څ͕eɴ۷;v,QAYzfD8$<+ qܸQďޞ}ס]qXTU䍱.ʘ вX%\'Nk#XIՉ4VVi |Tu ,^<5 a{ܹI$8t=6l6@8OZoΝ8?~hF-hfflFz$IәL^bL&~?T lր 8Q`h4Eg&K<40`LB8CnP(/ .'o= .Bޘ|uVxۛ!Q{ m6|ReqWn{l65:B9T c~Y6>[G&tQByd ^D~kdϾ}?؛ϡkUFBȚZ:|ku:czE2t'Q*h-z|,=$h>w7Z^yaXb ³.?;./=cH/=mVRY^Y3];+4E<;}fWzw f1Q`B$vLNdwm?WT 6{7E 0H8^$K/MeGZ,jhƍŲ#$A7JFXQ  30"ׯT s4H^h2_-4ݐe] RJ S7ohy>'>#tΪp9z׵Z9tq~~ðSnE$?Fg#d4R ` #H8Xc@H$8MhX\.) j5paC>8uuuq7;;d:::zzz@L?@ 痖a$"㝝۷o߲e/K/;v@"oss58sg#44oޛI"" E+jk۫*؟FRV`J3ذ1TGhrӨֹdV T*k'k_ F a:5L׳9qd}+OWxu1Ks -AH+_ٞ`gB]L⤮ˉժ].M~;S1(/fs `Zxz y<$  psss߾}X^^z ח%a zhrh4B!)lZk<5 Bw1MӽA:/ {'|Re8ĀQQh!RWkUК> ;w\>E1LLrO>ݬV cj|!rŋ[^:Cmmmn3$3g@|L_d~c+]ZX ba`F"Q_$aXP&CY=`eI%rHus9"rdTdp;w_?v3"!T@떍k'/Y-g^26SSv[^ ?dAEY9`,}s_)LZ_>U^r]-(SBdU=>|zXX̝x!AӴBH$ɿZDQ^8uC@F4m+'dYq MXy`t"q++(r)cQ`G.&,^o L91'vd%NlT쒩i$%.OfVplb&J 7 w g%Dm:fٜ6FϛўEQɔ_8ϭl7=,IKO"3ZI\wd9\\2=I"E ]… p8@PDE  Z6Ģ(^xVP(bn3@X0\^^ V  1WV*.NMEQ*h. e˖-B'uIkXZXڠ"B9C fKܱcLV,$fI۽!'t:Nq#+B~TI{j `Dۘjo;r?|'- H$bHd$0r88 &yNkD0lFuzyMYEhL27aoRNSy2'OT*Il6Jtn;ZiaaAQ \.anN~Н @ךf  l6 'V}{XAD*BN`O&`ǻoߞL&Q C,3 xB QA4}>wqqqn5,˖e )'~xh}}U`TFAQEQp$zy~{n~OY ˫j0P4VI Wqg#;wt]o4T{N jٝw+grS_絛Ƨ $Iȕqcz0epr %k8NW*K B8Al6Xs_) 5Րt6<0EYd²M?5>|[ؐUhDW1թTa\|}F4z=^I}~?  Ĭ)UV7ekg*fE\gp00Fo j*WB6 C$r΄=rzۚc,44dIZaG,>}&;۝:_Uf6MQ0TJ}QAfØ׈{SB~B(npS SHV/rѨi=|xf[ FBLweULBWn,Xxs{ ŗBa}K!Dɏ<#\EBWdza(MbV 4Ų NC&ɼ k< M8 ۂ \.ܹ3v%JsvI=x6WX~Mԍ,a}rɨ===?P^@Ĝl=<üŞ|>p8z۹ @Wߜ$PZ./,,[wXe%S)==Sa-$/a2eRal6ϝ fBǮŻeeY6Rj&iA`WMټkj3p8Jln*Ȳ,Kg&bw|>IUQ뮝^w@,yeIjZV0YYm#Hmt!+pZt&8-=`X,?6Och8u첁;#"B֬ylPK&OdYM 744t=*|OOO(*p|>iM j UUT*333PX0l.ːd^kk-[vE$(rpX(oi2& 1 P\.,KWWW,?[zab-8ReA!MwĄ1n~,4=v$I0Mf|tBH]h0՗'/\X,h FCɣ  vPNz6m8^^^ݸ-{_0Ƨi q]ۣﺋ$J/k=r`gzIPϢ^w%2LSǏc8V aD)*]/ lN|ib1 p&yPZ[;︣;9eJ&C[R!u0$UÐ'>"2?Zl6u8"ږL&2;;H$&`2[ou˖-Bl6$ :iTM~rdYc7qmmm@nmmrCCC{$ivvRlll,]Q `~S,hfv;}>ŋEQdm޽Zs~| :Q,e4mX0'qh6?-Qo{>^TeeV - m\!d[6\$pxerhiLC6\\\d2$oxjvvVm4 7wפgL?g40Gnac (tͣx:-2MH}*$u'&.laYVD6ҵ'I`k*kn^Fl)zTƁkC'M]Ns-&.C.*B5Zi @k[O\n48-BTyȌ\m^^8*3 d>7,2D@<1hzh4|>8Vu]tV[__lH,I'N  g8AQKAԡ)}躑c\ou FBo뙺;p߱pXݹs/OӁRCтȈbZ7TU5hev2˲}ZackZ*+}ޖkGݿ8p;lr}=WB a_5rMUMhj I`08A@ IDATbR9&s\( 'rlVk T3qșޗ'Xd2 WHwjcϽt+NZ@lP".= J1p0VK5Kn_cooo MK!u!tWT+]H{|]1q؈b_kd]<6Odn5M~gG}ezj>qM,Ջb$ٿ?a'O(6y-JV8zzz,󛛛Fo`͂P4Mz=Hivwww`0ttt@QX,{}n@ x<zzz`h4666ŢVbqfffyy/@#HT* |lF+U,ϟx<)BN^7MTH}Z0l6*p8<(r:T*[ncN6}PW4lZ^(kW׫.tx[~ |%NLf30yM!9x\卍 KayiiyrGA:@Զ io9 ٴ5gW ]x( m۶m۶mc"edzϳ b2EbCΉBP~b,fp8r,߾m.WnT啇_S/OM ?T8-l, !$=W'&1lqzjz>m${Bi^34vڹkt rE)K") n9\fs[Fcr՞$Iz<$:ƪժX,v$l`n3:: A,h4٬j Plr@\V~_z[[[ (yEQuԍƪ` 10M4!zb7')2j;X $DhY$Wv*,nha)'O #gM(I@oc8XS4EUXF01WC2#vcP"7F`I28҉Σkn?6%oz@tYiWt]猱FdU0 3]j^ȢVVA3M6 su$`\\3ihPfo e( 3L {ۦ=W$U5gX\CF0!T,Jqr\ёYVcdpCi+يNhkkUPE7+Mߦ V+TY4Wk۷_s"(-8{WkS\-9o-+=ښ`PdnX,%2RW`o6ѭ[՘Bغmz!AmO~Q6 N>2q.4 xyjgrxX,<%PEPkSWWB[C$iF ifվ^*Юpcm-JX=oCQ \:Kb ˤ?o;g{.r\<hPtMkI{pds;wnnn6쬽H)Y௬\B=H##$ (鴆Ìi>,?]SR|C9rMS.rԽ;d8-n2 r"x^^U2#~%nV*0,9R~Ml6rfpS nxjA[_RYp %9d[jԌ^r6B`Z;jfA&OK:FeS$WIj c$6u*%J 6ƪٜgU(VǙL7'_%T}!Q5]G"L#YcC8RD"q[nGS9e, NfӼ;<1?qEmHٕ5jV(ehݝn:(8RT3f2`xw`Pm/^/,|B01i泟j~\Kr{ӛv8b__ܽE33?s@g'<%I,dwrܖXg"Isٲ9aXgg'r]/t LP` .]*QKKMD뒀(JPHi'4 < ` A!l*IRPq|ݦʗʫHZ$Iغuf<8U5 ~yyPN<0C.]2;w0 /mlIUq"ھ}xx`4NLLl6ch$HK/zmvԩxզ;kϼuDEJ47 rYS[fNvaJWc{/%hu(C˒Y- >5(IZDPp?p?;'urzStx>_ Gse--C?T JUD^/Ǜ"\.X,*IK=*PX&2qV$"1d+Fb EۼBYASDV3Sә\"hZ2MgRTXLQT0fz.գ*6K˅'H< u7G33;6KBT!S*R)eq+razN<-ϝ`Gz]Ro\;F%"LRaؗ/6P=L"D"円]vBځR) wJ25;; s90^ϲc7-&:⭭Am4LttK3vM^_畧Zv`X̎€ U*J0 0@0K.|p% 2zz45 accc`0D# L QYV L@ٸq#:F+R@?LD!E ̲e` ,jZÖ p;`Lfzz\.OLLql0fffaI$Q@<d2WbK: C0ENHhjZ9-9fVQsjOǟcJZwEEB84;3{4VU^ˊYy&*?(j2q4EK04׾{ܬ20D>z .X?ER8Iw~sfvfhߧC;i8.R7{(Ӵ'M}:I!r2 CӪqI& __=u}f.Kj?hOrdYN+a/\^dY6gQHmL 0nLUh2 B:֨5uuv{t[)xV E0NPP.[a@ 4P5H00RKN3 0"N$,8^Ql!lTTTPaBzvy(Y(dy{q*bYŐy^RP,acZӅB{; 8qځbkc#=xT響|p WFBtpW:+j ᝋZWVwJFڷ/L?+g7ԤN P?W,z}^ f CdY6ԗ_6L+HLQ)kh']CQDAt:H$$7xN3-8Ս!:aXnFokNIgrM"_uM J~9L,,,0T*"ш,[UlVeFsB<NPlh2/q$e]%D>Ǟ{b|^ו< BA$#?|<01/d,cY!?A:]yѢVkJS" i}kS nxSQ%R]Uhl鳯lL9CGM%h@5 IDATvl۰z!qrСˎ鏢$FTj$uS;XdɄIInC f'ޮ4EA]TYb||.T Tϗ`;o! +pRA!dE1ޢų(l b6vzzT}0W>aCPwy|PCsÆ ~_Cð7 v{ss3|V:2Q=8a<y$|,2DI\ww7a|q}p~بBNE_SSeh wy6q D"HP0f!uՋT}p8r-i4, 088r T*US !LTTlnn2+\Hi^jڵklt8m ~vgl6hH6URzjjf=[WWW۷qL~^F `UTTIi[r-Jnkk?\pw\Y6 M-m|: a/J7?,}׿;yYYZv8:NàCgo)_::pƃʉ'a[nd2~<9ЪA\Y =GBu{Wl"Hb{2LՕͫrβ,Vשie5^m* RjժP( jYuZZ;X-N zn鞞ׯZ CO#Hd2Ihtl5LMŒT*eY4g2ҙL&a4;l#ONN料ٙ)Qr\ _(㊥R:l6S$dp' 0Z |>.ZK,  /<`%үo<'g9kmm]dI$ $IU}vG{E"(Қl٨/u!l RD0]INjj\/rC/}xlɊR5  =PĂ$IA$TLQ,5Tzo[u;iZ8]I 1qa0+u7rt`xxpOhJB(a$ɲl{XKrBq,bY4pjuș EբD'EQt0(‚P,02ESP8.Is:,M k>` jMVk;/Hc}[T*SРVs,6{3@eR,( S B~ 3lph>C!9' HIYVJy0 Jsl({?0ݛY.80^JKbԁh4p83Ixzb]ݗJERbwy{#_-u\~SM!Ύ721 CH4v\)lB3 2B Sз>Kώ zC4iN7xcϞ=P  ٨j+IR81ەA `Cl6\.ia6o666k׮ ^aNʢ՚tE)RM7eH$2550t~RɤB)qALh/Qy( Ǚ/}ȷ!$^(1vz~Z_J zRi{>PtBT`˜駞^?][[hK}}}& X ?H E]TbYVi.4JEQt)r s/$.'8,bZIJ%hzU*;.쵳?"J<0殸ӨsAF$!6h;2Gv|lЃ,Cn-BIFXrqp坉gT$D$Zv&Ӌߗ۰!r)-1NF2^~Iܹ+3;JZmr8'蓻_͑($#_|Ӧ'%Ow%xyQ}S4zt#B^д^7 grWW+eY՚l?YV͋%`08nCE1.a?^huCp }#)(idf$Ϡ`M7 iV`ˣp< B8mĵK׭?v/֣?\^5cǎYVEQ`_C/I|>BF]944ب 텗tj4Vk=5r\</ ###@Wt֭[v-MӧNڿ(lzdAXŢXl˲===A,Z/P=F,*!lX=yhFB,x~s(J!dVˀ9VAcll r?0oEY ~|Sؤhj5xSb9pH0BI*󵵵^~PP(  O|,Nh4B+ommttj`.S0[hi)FD q(q',Zϡ5ءxlCÈB3㽋Ţ,Nci,k2&$*Ǎ(:|XǝTJR^{Ej޽SS]O=zb޽E544je!8C#X;SÂ:V,En_ma& a8sdpXbO༆Q-BHq?zis#G`u3BDIMJjBW #W]\z1$$X $sYLx2e޴YE=?;@ӲFɔ!dze\]ޯBY p) a_+efB9aK/!ECh$R? 4Ԅ{vZ,+e(DbX Fiz{!s7;dy==#i_ epdB(FQ{)jj}?~HxxcQ!UO_{NX.WGƯ.L0ρyٲeE1{\.0 T)Yehh͛7WVVʲlZ`knnK<$x* C:`X,¨ >oҥ^7JAf2A8qΰӳ̌JU{{{ss={x  *"܍<okkEqҥf?T#"@ˈFXݻ'fm&0YKONOO^(ҿȪ5nw`fF'2[:Oj"BhNJYzO,=f3X8BS%DU;JV 8 ǎ+ '0>แI^1R 2??̆{]nݞf~c MQx۶_ ,>^ p8<00TVVRrӧOCl9І6::@ӴZx1 wFׯ_dɒRp8<44tOE`A{8@iG @b02Ç3It? xWEQ/_n6'''GFFgffi̲A+V5 k֬⸾+.6NEvnGCCCp8.Em6OsP qqxgەfIMt"dðrw!?ojnt%>v?WToCHQ[dYQi{GO~L7Tp\!P_t!WHBH2'" A9fʊ+|^ztə]/,Μ>y8ck-B)GKә^wݻW^yoGq|GO0X$S'5sIr GU?R! ae)b{^K;re.{EQPܯr:?,A|$qܰ(O xKOZ2ǝ>}J!fB 1\. ޷~Ѹ~zV 5j6m.) onC իW$yĉP(3hy A\(4DbCGlcةڵf;'izh0DG6kt; 7D9tU4*8dؿ_|ϐohC-`PqWx-ZEQ$p^}A6-'O$Ih[n@(Yt)phllD8q"L…=R) B=A 0yA8Ӹ\.YU*UMMM<bsmH5nt0^zu&yjzZ&܀F1 . hw˗#E!.~=W.ZtñX˿frդ"+E1Ŭ5eX,F"~3}F")HFr}}}L5T7@f Ir>ӑ0 )"cZ Oy$1-˲\{}OMi fnD:V ׋]|(L1Q$IZCyQD3N Mcg᪂a}CRp'p[gK`Onv8/!Q!IGmD3;6 d*K.yљ<4 a/`m9xjիՊjB[Vfѣ3ck8QSS$5+8Mя kzRML'2tM$ˊh4;цc_eavv 8dz} qf%J `YbO$/"̝,YT*⊊.fcccM&IP[j"sBA KXxe Ci>={RTkC_WГgqI '0}7o^t@Q67ox BR?.R[rA-ǡG5]S -Gzl!)bt:=:33S.5_VJ\8 ^YrB7@xZf7mtiҹbQRIOAlpСCb'Ph$IEN$,Z,T*$V5 jTz(/CV i1zTHI-Kx<---(.Zh͆uę>>;'{iD L=a/(KrB8\ f)$ڪ*177Wg7\DȍO<]|l61ْdɓX""¢b9 ,KSS,˅B!zՕ#S_p[㉚H$6^\FF~D ԧN-v}%y(p ! ]N'""KDڍ\ qIjsnLIۇ&#ദ6\j&x^W]Z2U.sjڴb٦|0 IDAT=Tf ʕky"]&Z?|\G4O8+a%IŬ߼q9a3F\.oj}s1Gy[o% ttt˲~,in|>Od@TXD#zp },b0 @ p3tB'W7txT:::~`Fnq}хZfYYɓ/r*fJ,ewxKR<iGGGee%0`dǕZcY PB^rD A,H@&y PI FGG@`qhl'?ooh&!zAtǎۻw/K0P5bNkժU6d/)&eEϊ#CD> VXq\8.kŊ WW{O~g.*+UBp~lF_T*ŚKH0lo3ӑK.nd7_ѣG8PARV6nQqi,GeYVYQb%Oio}wwwp(VQõZuF@鈏B)W0yyuwnCmf߸7_JWLJ9wnۡ}^C %r*+nX|$R_Lȩ eokz}wvvBӮ]DQa߾ܺ*'L_yuꪪ*cIPuj]'مn/;WUU544rrI8e qW4@ Ml6 [/|䋯7>RX  hsss6mʕ**8qg~&\aR0 t: ǔJp8 <I sRizzh4|>E+54fEjM&qCCCTtʲ\,-ZANRɲ mŋ0SDīWA?{ӂ@ nރyޙ͛wu)8nneټzj k)1\^922b6B`>:6~_/-ۻ֭of:v;<Ol~bŢWfA ZD"gnT%E/R}GieٙY].Uxw7(\N$܆BZjJ竬$t Ɗ)R(YU4{PlpK:C$I_~1'޾ݿ7pd24662J\ ɝ[BsYy8"tW,ILfSNqa<硢9Jl6t:ѣG+++m6 pPZ `a iʮ,$o0^è<ǿ(IA2P=ܸfɚEuwɑO UTTnv-lX\/I,[E^ފJ Ś:Dh{ y!{nH$Y(8eԨVXSwhDZXZ_A8~Fٲe_izW?R_ft⦿} 8\ Wa),7;pMQ%E,J&#!dO%ŏzGgYԹ>~w6kP-'SLWPe\ߩBB 7f3|6%IZjZ+6 s(BiȤ,a{ԻK|'M9oǏ*f :'!Pr`O g$Rrԥy䯁 {;96U\)%<X G48U^/!nntbNMg2HDmذk4x<L䃷F'mPydda"(.Ry^Qh4NNNB Nz*\ccj+n\VPC,뻦{! ͩT*3f@88ah4fbܺunX,fX/_J5555::@}V ֙P(T,v瞫wwǥL&)IY+0V3 Z]G]HKK hooGMLL0kaaawܹ099iNP#9YKN=؈~(E@x^( \e%ByM$BQTآ'\XXXaѣ( i1*/pE-uz󵶶BYww*GId2sۀyȹ[.9[F_ 9 $t:-*q~x2єjp7v*])$ӴHxz6ɤW0~? K\kGoob$(*]oOc$#rPk^Yi!4ͣ*fejj*:7 rQ N.A,K$\]nٲ+=* ':s&Hu6j.j(mi W<1(%N̎L"|P,I\Bn-lruEQvM8YKn;[`!2T޹"vEX\v/渎@@$qdDSQtF.C= 5,[vڣ$I9IdX$dqﶭ\rBc%7R..jmJ!4 ]]}[⭴yn<3ݷk;P,&vI=2E%Ne۫4eSegȿl5[&I DdQ_x}A'k};(ݧ1Ad2`=3O)_JV&IL;ojYE={7E﾿}lt( fff&0sO?rI,\l6#~q|ߧӦi0^j/1>>~VΝ% pR4MWx<^hۤĉOQ ;:u]_]],Rn}{_ooO?\nK_nl0=}}}n`a\. Jnk[>g2Q,7e;i[yڲݎB!Xi:8rc`YPYj\.y˲xؿ?ϟW2DP&5> R, 8E>I5#]>Qn\:˲)2z$55j^u;XŐkjҤ F_MMM9sB#.Bn5ܾ*CmF)kabѡ71aNI<ŀ(9Nү$IOZ֭ww`쉮He6@bb;1!EϢ(Uf|9΅F%sPݴ,ڰ6Ay_n6!YpoE˾%6\4 'iCdכMz.]7M"Il&?i/0-u=r$I|SH 8fWc180tM;Bf?MN\lhǛ y Ӵz:ozۮە_?sDUS d(Jc_t#H충T*g2g.<_Zfai) Z7|J}`UT&LSZ\,<ٙfq_]]G_o}R n,..ؐ@딦YeNa*pM`ژ!uqɲۻcǎ={̼+jN9kkkn{hh$eAǃTuAnP(pbX@ nMZhne&fO?t.@`ii  À*< ̯*%ԑj5؊"adʕ+v$ZApƷ\7EAzm/mmm$qM7oV߲~~Z8nttTt:ahYV%I{ޥ۰j50f wk$I/k8m j8xomMPPE"0*(K ٳV-//\z/ ;jit2dm`irb51cZj3V4//y%E^76{V-{oQupelbǏvOLLVPͨZTWXY6t}] ]ΐ\2<##mjUd7& i$I=3s{]B&~Q2Lz}("LPI$ϫ;޽tӦe} Eg4d,Kj6qI)q^f~@>^n:.w;s+֔o?F"2Lgg'ABz(tcY@mVȇ.EQ}{SZ90nۉ ]qb+UmЍLݝoz5]i|d!Tt&l4Gav{?Ⱦth;}۸=w +֡qjiIQ Ft6~"q_\\̊u8 ߶upĿ{tp:N=b%}BHw<˓llr$IZ,A, ɲ7X G`O*2ZL&nuň›va? ^UH8gW_ Ty   pUWD&'>׀OAPgIJct[KlO8qՕ`­ \o`!h@[jssswnZ=R(0e2p߁J/\gR) (].?IQF&Lt:뫫+}>N?~oORPV,S  q2L6x<.X,2 ,js} SSSیm60$ڵk^%t<ӳ|ffE% ì;xx푆٨|Cyp'ײf."GoƠLLL4=22/*P4A:I'^q(ͽ ~'\h4Zibf>[bN3=Y:P {|=T=X(h(-2ϼlVX80TӃ&EQCEu-pxcg--T*Z22_mFM[V*qzF |~S,!ckF@*/f_ٳgYݨ7<{K$B8r~/7cLż.?Yn]=yfYðl&-}h.Bh z"b~捌W݇n^$fe+4"pl4Q~( Hm~2-կi\gGt[[a9(;0laW˰~/ OOOO$Ihf&mȫftsSYqfY6C-E[po߾^zzk=\l!߭x=cǎ$I|>![,k}BBr.]]]MptFH$TU ((ƎaJRBft`l۽{7AW^"L@_7ڼ^: y"ŋ!#YB`d2 qB?v]UU0xRT*j,r9 "vT3:Lfnn\.מ={M# aL;t:_]}K8NT*>Ph:E ͈J:ߢe0AvRwm6[2`,|j]|6\A.kyy9NuQl:6$WUu~Ahw\.K(G)~y~L*JylϿcH,P$~縹G{{ѭ#93^/az>_=9)=w ?G IDATpm\+T!Mq ΆK7Ff|`"I;q ;]jEQ8Ivzheٞ@%RYSa+HBȨծ {t;1Iud/\.WThGcu, 1 {.ƿdnjjRT.34Š'/]i4mnN$IpZwj0tAHsт,c6ӛp(pua'sl4 NRA>i&t: meAГ1O8tvw.۵?cnH!Сvnl۹:zٳzZA!G]0',lhח,8+ݏϳ?/`8N4ERzME'}`poßXC 麡6TRw̭ 8?DZ܂47wZحTR( +++te%TBAr)RK% '?Pf7ݝtn:nNO%1i^jouM&, /u]4]ii K ]g_1MDrʕ+c?|q:qPEiж]@`j`1 `yBBzcVK B'|}yW4xkU^aLX,^'V$ (',]olZ0, FUU 8nii`g~-9C/w!D^{5ϻz  H;ƑʅeKBiØyu]}C0 2 Ҭ rT*ͶZY0GB!CڞlaplF|Q#boa8x 5?mo{[(:q_;(k.E =SGD0L p\Nq y=|Gj8fY4MtfP(Cps,_Lll躎n=rJ_[d-o6!^Ilkb=;$a=dKmaJ2/z,\.( J%_cikk yAfgh='u)z ݨTyk lm?<<D'&&^<=? N4@)r9GAXA[n\QW^|xZpJ_OO l.p4`?p?4 F@߅% "EQdRQQ|I_{{{___2\\\n bKbҞ-VՅɲLєH&SPwwBΩU9)ˊjy-##j%{ "}ۭ*Bȍ*Y|Ɉ@ݰ N>YvPvoC>|$d-}wH[vj'vt-@f_XS}Vd~el̿iC^~q!$ԋǬ7}|, X,++~;BmȠ/_d.۲̍f.׮I ]t]8v|aL0fFV(EwNψ`_0$Ý}Ma׉E _8!Icv$ *Fv1kR{Hzϧ:oe2 `,X(;᳟u:2vX,jfz{dK52e*aYqe/-?zV`iVeZNT yj|&'ߺg%̙3R0h4YMR'O\XX|?X3 8 TBCu`se`fk tE@en8E* EQv3 3<((*lŅmǿ t"yE֭XVE"ѓ'Oo) N._ۣ\MI[ooolr~caa4(B)cgJT)%Cs覛fe{Pn2$ʻ٘4,/jDf zzz=WwBQ4˲eIh&t20m( P V$197 2qU, 3)цBȿcÐiCy ! YHn!"y݉BJŗ$MskXUd WRS˪)X*y2*FkhE* 'lYP .ˆ 3p_éwY!tq$ Uծ?bBbGGeab4M@@='8Vv:;Ak;(xl.7 B{{;0D ֩jYYM?rar.I4_ E`Ⴀ rl6XAH,ѳ!oMD4y0ƻn++L>'Kb@7*Oẉ`Ipp@ED{{xE߃ްpQ/korH;@'ߩǂgs _*iYdPߔ_==YQ% l?F70BS͢lݍDYӾβ=Ji\Ɛ@-6ڂ˕kvOZ:ݻwswĉ_^'_;?BfD6==ՅadXAiO(P65ŽS:_@U~[SArgWIw9>>]/^C%ٍb`0˰X,+L, t0 ©0 q#> VPV몪􀲕N+(u:mmmWf͂alPy|>ڻwogg'ܰ^]T* X,;L?-Wyr?Kv4VeYT'ɹ9 :|pþ5ҒWiRh4` qnwC]+r]ZP^|>i\_gٙqe\4~}%0a1 3NN&1}A 0-h?z g- {y^-8nв?-,{a,\PD|]{_}On ?e Җ܌%7"q]nP y錍;:E$9](,}y!–WifژWz=ͲapZ@Mc38cBRʭM oZ<'iEͥ,a4Jt>pC^m*$VM~8bYԚ,:a+֞Fַdc%رc) `D"0~ b À,N&8CHGG@$ x<@, tX,vw|͍F… .\p\tz}}S۶m3j6V+(/iV*fgg3N1 bL.CUUhMfP(Ȳ<7=O& kqTɲdBBءgf&{un+N+3NәL& ,vKұ6a׾̣/<)BP7޽ g_TjJg5׋8H^]ol x>t=866dͦeY\VCGN IDATSĄد"q7; .hH12Ʋikq=ABd2l\b|<a*#ڑ}s=c>u0mi- J@u#,3caHXָ? I&En&\%ڏ~t m6hfZp[ t#-TU0G "8BW4‡L&< aEQ0 =x4MRX,l6/\pE(f P׫j> RG|[;q\ʒ)KB%V g&jjxp7jeXX\\Zv]M=c,)r$-\DS Y%I"p"hlҬd,FoT}XLPBٮVkix뺮~z]*!A*3h(RIQDFȵUVˇZ-M 6ۤ|$I`DL7[9tZYT`c^Iukvĉf0kOp]E$ a|>5 9!C VM.X VKͱFHjh&c^zm*7wowW|W;q'.92X$@IRFՒzLL`̩H,3 ~- n[I[*U,PM E au0d2dj8i@DpHr8i:kD"Lfvvy(F\[[uQs\0Ilssh<$q,a[ET*BP*& V51QvtwwsAh6ph!KD\$9:ŚxW)v{Lı3ɕ 1ݾE<.߹[y"avm?~\Ec#ؾ=mÓsX,777A,J" (MREzRQ֜5MӼ^/ > O\AtwCBߐ `]87r"t;vDѰ"m0r<ce94zIөjZ<[?w Ȫ;i?x1(*᮹Lk jn;Vm팑(f#aq>]1[9J(ajz* _ZpoPMOMnni{3gάCmۆa @# ۠iqǵtb״,&ˈYR =@>\ntUq G/*7@ B;=vL/mEB:<Ԛh-^3.q6eZJ2Z%fL8z}aM԰/ 9nTרj/no4R ϹT]ɱkcc#+퓓zeX&T$I ֬P(sT@Azc˖-0]Z]ZZJ&X,$ 1ch:I$PZVW᷽m'A>Pt^0 \.3J]- ===DQ_K鸦ibq~~0n4փڟ7Ǻշ{7a`a58h8~2\Sm5FFq3Ng2 b%Rn"M@lvc}dK v,s0BzkBh鮻B|q8!'ҥt:a8nddB__ў¯]cΟ3^qSX,65611_.ws8bOXh{W(0'OlMEQZV7a` _@mj= ЪgL(0`aY \pY\\)~vPXs$ca$[?4ñXl۶m@ԩS|OZ@R4}a/VQo "cKKKBa_kLW0㮱 RRs8~?#IR_Q[drv6s_o9MwMz?ԥo<&Ik3%b9>.%˲t8Sq`ϮYq㨤9T LIBYPu4M ;Ν;wF,]5Mkv%\0FeV(VeĻތF=kfGG_WLuauN%z.$QM_'W b C|{ v:yBᐦbľh?]v-aov![{1MS.DSo2{Y}c"FB*LQ:6uh{u!Sb:Xe0 P}ߵbeŶG^Rԍ0ppG~ Eho6裏4&LLLR)yɏףm23! ea~ĉyE-[D"s)@O(m߾=:ujyy!WiZJ]ܚy<h%B MPf_.,>TlA. ECل6aF%I3@[WL4e&ɜ={.IR|!R*"/!KWpzuf]ulW98P!@j\.;]xn_8 79 4 + St:rojGNV^~.=訦i333 ˲*2؍7ybL2MӵZ hK@`ol[zJ-bX0̛xױn B:$l6TU ^EeY?ZAb0 BLT*h4v霛$o8uDEQrn 0;czH[Fker\o4yn۟8mZ===,ˮ/_ l6 !^י^c.wJy>I1&+ӥry(87 N]Lh[ulu*EQmDIz`C*us{Yg ERb:J9 ڼrqu`3Wd\h!pܩݻd4$AJ65|Pa+ptO*;e ɜkGQw~h3v{I6 \N۸;(/XBM;mw{m/5],2-}k6l/`L }T v趼5O0Mİ֍.kW7 ˤNhZEIBh7M~pxmr,iokF5JV=T$*?~h8h(z>nrͷ,"$6pO̤%@# %׾Sv*puBBbO5_*Um|wi=ɞ̙i `r$;?n}qq80e, Hax"-JRס$ > $lL&Pl4{{{8Ο?oF___$YZZj@@Qд)˲@;~6}WY|>oz{{m6J>y"3\.\ťK=L у c@|}}}eTVWَ힞4 Ԡl6h񽛂{aS_-(X,-[PU.X,RځWO93Z(޷o]\. ũٗ}oRv;ٙv1 [ΥJ%C(|>٩z}Vx0ATTUW#KBz(6VcpU0l6[@M0? #ȍ׻sΑQqh#烁fZjG6iZHJ=zZx=t^>h,R]7rk̓z;::EӁRҿ͕sIi-H"3c8X$cacc(P@[sꪮsݺ̬>h-U*uo}{8@f'E|e s Jp 0qN{Qi]nqӛ85UTz (a"^ԐR)J$i.n0QDIaOWOâEtL&ÙIjR]ss:6ݽ{eYaw 7o9uqB"gKU`2SSOlHJ5TF-DQ=DUCJ׫IkjjkDQ7[8mHH@Wh# ]bDQ|ɩ)Oh.ɚLL}}òjWگUxQQ-P$r0a=oJ\xӣT*Ӆgxo_c+_jKrOx>MtOOϺu 9pxff1S,ŋ^/:,,,XԽpȒ;Avl*-[^녝 Nt:d jll %7߬ݼy7Ͽ+\z@|YE}&n^ڵk G˲<888?;e~Iss{s]$2iAr0L.x$IV|+HT*d$??ʙjkaoZ;::Z›bETdh~Q^a .q\LeYSMՉ,I4թOeR$&ٱ[+!mQ^rldd(Mi[]e.p$GdНE!cD(uuuNl6CPr{;>pYYMضgDAq0>R;L) jFB=`sM5p'*Ia'}VVopNu[{Ο}($YfhNF2JG{xӆ,Fbƽ8, LbAOyuqWO{J_ofQ,bu3f}ʣ^Z#G !q D" ~읷tl p \VqlBUUUV(0[S*.\Z@ \=E ,\/><@ P(0ݞL&A)[("ȱc`&Ifi0 R4tv=A[\KP+tH +0y68󍎎ȵj0yhd2-Y&U*`iffƔ^nq:D: nzQ EHS],GQBiN0Շ`\}srSW'&Ly5xw8=m>=h]rbFX@H4Udql6˲d *&3 eϝ;hI:>:?$j5$tel)J68jd?ιB ;;;a1=q`W(h$b*C.322200k׮BJKAd6[[[<}}}-ffpp69Hn0+W |D<^o__{F0EW#֯+ 8n6VZt:$Z< 7A^!n84qq $GAZj1m'X%ܳm`8^ ȫ'-?KFrT2L;w쬳z NLI(aN1Z:Qpd VUE2l >b0 1HRJ8Fϒu6 g:.~BW;4m))|!`"M٬,4s,˷쏜Έ$9 IDAT$eY+IkVy0 CEBCR~5,OOf(u?~:ʼnHe*+!&qX T8p(l0Iy~#8!\TqYj([hQ[BrFKye$5Piu"/Tow>}zjjJ`t:+˲7oBՕq&#ɒ(*-\r<=3=7;W"ܲf>S摑d$(0eNj qp.O"B;U\ʍGT!ͅGB5V_>(c<DpCi;(X,d%Y0 ?qe邧C\30V`اogz+Z &M˲x$(R(Nʲ|Z*2:x:477̜ _v)BAZ_#O/yV _Cxkl`Sz@l4X,Juמ˶.<&X~jfko|>a i٬ᨯK%Z<0:ϟa %bMͪsB~3?EVt 78:X,6.g EZ ӪD"NU*Չ'N:5<5kmmhի`/7 +mT,<~1_;~8$IJ/t:Ap;+ l1uvvƓH4PYo"E'%2_;6nڨT(CѐR\/d4W^U__B{-Tea;fQkZZiYD"LeNwc,mnH Cp !Tf[űRHm%IRTeY?un[qk:^ŌFr"64k;|:Ę ~u"YKtvhHRNXX<H)bҏڦc,!axi닊Kbyreu:]Gw{w®yð'dYݶGCwM ID̲(nA.,D Gp|+F_kmU2;4˖-+T? v^~dJe]]m/nl~_-P(:::֮]{%|mA.;)Rf_}MMd2nݚe$ @NJ߀{MM X,!8/?&r!}4'f3B|`1h4N %u_]$q|o 2UF$p=T, R,^T<OiZ-[Ʋ,Eh`}|b"C-h0 (jjjZ~Z?vK;x<:p8;66600P__vyH(2) A/q;V~2X,۶A"?66I_ð $ 1VX\Wm FR̅HFG4`$RdaΎKQBLK@@P455Y֪; (_ONLS)N~ֶp0q47u]s͵(۷r%i6 UU.Q(kkkkIL7m/,,mni7EgY]7t]]`/6[SSb^βt<MKΌULO{<0>746tE-|7L&rALLJEa Iy?\!$$Gw 78,F()d)VF*_|WArbx! !$('(xK I8K(!& ThZ(AXH$ UCHFXddJį|Ifٳg#zC_[ qI2HC2pwe?8V*h,t]NE b, s :[^{ѱצo2.t~AoիV$iω{Ry>p@!!bi:}oAx4Kːaݩ-[0 #q _I$^xc2L&{Rٜd s&#T_Ox^BZZYn4koi+ zK: cK0[l B{ ŋ݋ŰRQ 1ӳ|hTL$ ?m6^}qؘ6Jg]{ٹ̒% z=1Q*ћ6oꪫC'bp(-=\!>$QF^.soiYh{:bj6d\B`P(1@ -jxbv:t!q @g~K@.mð@ 85q'=՞>nuX,n}`8K?iQ5-^wvv~|kcoHۏ&p YQbq˸J#}},OLիIAs{'ML.A022T*m6;; ST.cY-FFRtJ|>R EKKj&ǓN7nh6 BPhmm1qRF8;NSS 0dRR544aɄt\W^yʕ+O<)J'O}j͚5̻KH$@h0j2y܅ _wYEQ\XX8tA~|>xGlV_jXe,~QeCqa''o!Н)(I,\p`H"{-I##EY` ! PW0 @~0,V, !|M02 US#YFI&yuGit6YV|=8>;ݴq'rvo/H₠T*"* _@t>yj8!-AtIKK f͚ 61>>~i]@| zzz:::n4a FJI@%vQ[[ ,&`@YU*·\yt:vA644tmO5}]拱ww\D*KXK>vknT:s%e8R^/X5 P;0B~S/ݲiU061mށ}+TɪpP,i$tcS>_G,/X.Nj5`}|~w0-, ֩x<>;[Ւ$֚LYZCyrnx4F H a}.Ъ]m"Qq\FH$󊕗\}dREP\*Xg|k}sM-/mٛoQ~͓C_VPRh+H*UR)MNV%>@b) N,*Dk,xA >IiH&P&:.LNMMwuuyxff!Ѫ#/ ?H]qfuuuAd-Wr8B},$v+@B-M~_z v?KDT8.͂.*"2BFB|;O---^rpSO}|}$i=Dxooza&?~y@hRID2dy!BI7$"dxx3g9N=y!R(t!-k֬ikkkll<<<< ѡ& (?S%QUWWx|>_$:~O? aJ35 RD"O^,ۿ|V{{{W\i4E)JW E&"q„tI@ڥVmkkb Ai4Ei4dl+MB^U]Wmr4[9wxX&;ԅb\.;2Bw[}M|Bp*(L14 Yt,+ ŽK 7I P,ocqJdrE}wܡ .E񁧟Pn@;LtOfIeocYn  p\N(EU"Ūo@hZ]+j{,DYK;?0lZlazzZ$D^==x7gEQp8R'Nm)2Snݒ%D p |ZMxZ=CP"jmll4JWo$[[G$IHOyP.fjtt/X?WׯOӧON$pEę?xAo䧰iiif7jeIG{!iw}nl6$I@Gǟ::BZtu zٹ9 ,Ke}29#B(<;>xR z@Orh>-h[M"EQN> /7%vۥgQ|<$%I㧦dYV~+tZzCzVR+ou8Zڴ$)ߓJ>^ 1lDrCê3LȈ,,Y~!!t䵓9''u:F^*竪-GKDU:şqeCR[)24S.sSuR.ˎL)uM7_|2A8Lgxp7L:lP(܃зR9~98rL&( ۮo6Y􅼶 &''AqW` ,qt,$ ӧO744 D2#d2T*$m6[kkksss\իWtX,|>֮] /щy>SN}vv6L677ׇp8 m"A822|$ikk[tVd?,{yXh4655MMM 7f={6T8_x6V~xaS&~ \F٬?bjAޕnzWW \Ie2D"q1gd2 \<NYV<O<&Nkڹ9ئzHdXX$I¶˒$$R!=L8XqB\_*Lt6\`D(C #k~cu6muZ|xx?7i<=_v$ a>uC„,Vv_M@\#re"Ҳk\n~~ި%FGBE[5VᵮM;kzA&v "!B,Bt%Rd*M:[lC < ¡H|bAM8T* sgς:>fdM .9HR\V)kHܧZ ʕlP((l\>6Lt 2SZW]9Y$I0ӽTUkURaf$TfYyȧ{#|h|˩/đxcfBr\ٽdaaa޽îJ~w놽蒊RZAJ4Ҏ>~% yUcUdJ J555$l6[KcR%ܹscn E J%߆,fh4 *ʺ:x<QFD"`LcFFF Css30A$-g555MHRj:H޽?P[[ 8dhEQ|@ǃ9ֶxfpivNA*t݀Fli^áݲevvpX,:NY~Q[(q? BDX":\`>Aݧw\Y_+l"[o|r0 ~GH+bzF;;;[/ORpzY@S!U8,$S$Qvd$`[;;;/CBZ$u#ϦX|/=wTjiZ ַ>!?{``ees(OuUW%G*_UO )QEQdK0>(7'ap&imm-T(fztM f~VkDQTJ%ӭiitu糌/t%7iFy} ԒXL(f9/6߹YT0hhRAJmٟ1 S'Up'+jA@\;-JH$H9f۸qc0fM DP|OW*2r!wjug0$[T2B(ӋuRaZ͘LTR T*«R 䰃lktZrD70R"#rS qABHiJMl?#OXT*]f󽵙Bq -+ Apa2T*U\Jk ADʲ?4#$qS"8)gߧJODQ<}D͎l}};GFFJ- 㐣gXm *йbPd jne´o1U|~ ,40̒\Bv@+K&8Yp'Ad2x.HlD w8Q5-l(ɴtR^D*Ig= [|! kF#EbAFoȥ8n D:*$b%q1<< IB7x;n2HLRp8֚i~ BׯYSWWJq8|UM|w @?f3tꝢ;{<[r9c6! i333󨩩FT*m?w:VzKuw XDgW̼[~/)Mh׃EQ͓i?klnqK&_^eiQY ke`㈢񝹅V4Eq\svQ=hh׬ky=U ڵ[h )EQOFLEM4Tg sssJ2KYJoΕ"j6_8Z3*yZRr= ~UX^Bݸ#w2*$^V,YzCЁ߬oc# #b ܅ubYVRp5aUc hY~?D ?5JQ?f-0 valjHB2K`6KdTJRpx_"`FXN'cKBrsss8J$!zBQfZZfAr 򡮮(LP(b1t_[.$CP>iX$lE\.j4xb:Ɗb:F=oKjF~Et^D Úآ*LQP6aqbA$]kZ6N)7Wn.MQ?D25Ż EDA$ FMҍcE{|А)پ myyG4=P0*+_{U'7egg{/ZiW%He&!!8A Bюq\qod[^WZi{3;9rbK|vy}As"apԢtWmCF Pxi6ybH@;V"D"0j* h*]QRRRTT$Jl .= YjKd&'<ޠ띘05TWW짰\h$B!0x<0^! YBa(4JV9qgӧt`0Y#*]jeZLk/_V*^R Xx2:W,6ZmQS*#H:{SG0aRTT24DR`qeyeeeI*E]B4Y_"D4PC(&H:If z}5 KTw6\ISNS `\$14/h.vc Gs}T zpp T5>!wwY!~톙j(ȦS3_ܯ|Ύhޚ5k`eV;22sH$o|[YzS8b=WDVk M&N8\n4kk%.ߨ}Oww7lcZ?X/1ZFA\.-$xZ&:|pFQP/}7BrR M+D"MA^rFm=j4XJǡ܅K V&^B.al6 DC:,nB!,}XTTTVVcuae2+#,2.~?3?b#n7IF\.@Qǫ31ϖJE^VKY$)"ިJ(oϞ=D"ح0JP($9(j``FA̜8q4f $I sMuh:p@ ƃbخW9kJ L.G4ւID1VH/bqNQ̔*[dƈ,%řx=v$WhѢy.6MQTc`+cAcN IR C OIP#X$BPH"LfJbHnO zx, d+l.gHf3>_:F1L2#Vs S˲ "Dz^&ӱcގd822 !`쒩):޾E'iڒ_]]R\ *RԐiD"Q8 H1ieKT,ui*hi4Tjn/ qP^ѥ S,`Fc,FrR"B!F9$ntҼJBd2:e]RYp4J$bXV d;⒙;H^G#Eb0E 7,bXdOD^E͖Bn<J^t1l;01YwzbLOO;Naw_Cs6 IDAT{Wg XWβ###}E]]*]q8CeV+, 0JBp:]t)Jr9XM؄˗._$S(t:BLrH$r92`0jYJ8rLߙL&hƇx||oED"5굵&ɓ0K&Y,A&'' ' 333o6t1 =a; `aWXA! kPTΒGTi;00:]tvbPV#0_잻_q2W"n)6 ˲"xuk)B?1`!ٗl6 vK>"$)ISG`1nXO>뱋Ź Npy&ZU9*wۗ(uhhL`d5TMR.\#>WY(T*$DbC{ޣԬZjvv jhT*AtuuX`004ua2&Դ\.VR`bFQՕ2,??*3 ,9TJrjjj&p@tqNR"uWvop|lx,UcAe00o8q0W6sTeRny}BDQ${N5@*Qn7d"a RiʤJzźu`ae3ե%RSIFc6>1-a+W̰P(D"T̗x)*I a%ř|[0 +L=0D.gvfd2j憛{(|ULF0/as9aqcEuuٿ)R$1Lo09ehzOKRV B^NL*r@."Db1*~EXP\dY`4hb&~p !@- dYr8jUJ0xl6Kh}prETPHϗIgD"l.g7E%, 9(*d:dxx(sdIZmGjbI>H&W.H"9GVGn: y'0 P`Ei! UMrn2U1{xW{P! 4>$RrG~ !(qE7'lQYzr24M4t"˱ ͰlN >gLZ-! 2TpfI[z>əkS=ʥH8=+R%>$`gB?(M1cTFbXL> '.lw|1*AaT/}7>===GFF&czY;AATi&&f {en7f^8P<zBа/p7(*brB ӧK3X,wm.4MJv:z 3hˋixI.\ΛgXL&<-w%ϗJqezz>H$G[沼rd=g5]`H3.B!1 r9Dža۝e7HYeDPM.r6]HT1 D"NH$Z =;qOϠ?5e }qql.KRKkO啜F34b"k\Z^%rY3fiNWP`&b||,tzd25-~!9D(XzTUU5H8p:MutX&묮EG+C$ْ-GKfXV׋≉D".Hភjzj욣b4 c^傿.$JE:qlM ۴)dhqۧqW(Dt5wd,kN+NLrrgsYkU/;-2ӬP(,  H$z@6ct,NS9}(uH$\.;55ٻNEt:=P{M`@ߑFٹB0PGnzKY $ziɩ ;Aݛ~P% -ѹ@z\/d/iv ImU2u7?% ŭlx! q$Q8PQQ9o<2%w3%BE*\zD*x<15e =HH6ůQdҩT AQ E1 KBB(8Z]˵sq֡Vq0$AU*T7 D[ՂͤWBaǓHE"F 0q,|yZpBK?;66;; E R,;Np#I?5u%R;6hes7 s{w[sQ5:2Xܲ }f_/o3o޼5|w{+x>peR ?ϗv|7$ɊP?q]>K0_ No}gjj<<<<.~O4`ÿWmh*zO]_: y284|dN044?ayxxx޷|@`>pzz!{J{woI[p.Fޔ덇 *+.R/A~dqky]AM˲ofpNHpwÑ<<[;7aM7/#l.L&/ts:xOV 4J2휵7¯ AG{{;9駟_@@|?|>w칿xXIIrz0 S 0N$ PC"?r{綢a^!bc|OJߥ{ 7 /wbgk>֓R4}{y;. `jj?ېQ0վ֣>¡08ߟ'?HӒJٳev8y܆<9͹x<^]]0̴ݎcxQ v^FKT&3OLLAjJ,,{eow:0v l⢿HdddlѢ`C0J]( ʪBenl"HąK~ &6 uZpݣ#cT  Gd2ïx0ɤ%%%zx'md2i$ |r6==cY\YY<`'OFcU@С#FtJG]|O;^ 3^sם[~_$BQ#B+֬]cط-NCh5nG& a>O0UUVB~30? x( Aɴf2ڻeFyF>ԓ:ݵ~לNW"@QT,\ua:xҡGaN תT`0tѡawl0~3Ic /q '>B~๽C8|.amrJ&>vD0HMME\.wR a%uu( L&cYl2NÉaheeEqQAlS#cdRӵ4Kk绺Z䥞^'˔J%0K,a JkkkL<E;;B"ukWǻ/PUd-lii>t_Cee:HRv*+Ft:Z|Ǜѣǟ}nP{ׯ[yU+eYp:4nR )$~E JS%=uT*+DB.V+Gzi6,]턨mjjttp,{x"ɤ1 u7٩L?D0t7HZ$o|;>p?Tu_ D"qt %"CC#Mȑv$`0f*8N\;`8 ?qĉSa;`c Va5ed:}QV-Xvϝ直("?ϕEEgϟP(ԾtL&MM/3*+d2e˾E}cnjsם{i^0^iχ <1JADhbX((^w߽wߺ;Rt:]wm"r[#cǫ*+].7eeG8CLyg_ڽ ۝JJ^[fժ+^owp0:66<2vͪy{<:6g>盶> A;^xoinֺvH4o߫'O(իWT8p]] 3Tp_xI‹#P(˖ښjA. &bMLأE?qC=-"cӟZ01^m~Oԩi~!$悂-7Ţӧ;_ WVocZ/s7 'Nf^/ٻpxeղa: Î?s{9{n5Z^޲ʾ{UT[GcB xȑc/ Ě5[6!yk_z5-]łPeE\&Oڵy{wl H$,:f;ϜYn T:h4T*8ɔoiMpKj.(s{ X,tJKp$ Պ,aFPEd.\}Y,pyG:U b1l"$S453vq,Yp¥z3َeD"QAA… :z}@pEak}v*B ?2ROL.kM2xpqQQMuԴX,ֿ!^xӯw,v{9 A -YZ =~Z;kИgiin͌ z { W)/oUM]Zԛx[m~t:ؐ>?e@C=jjcXGDz"ka,;3g-]X">rv\(oNYiHEyZxj_mM5D"qj?Y65ͽM>ꪊ`0}IIIq,꺀 o"JTjUge˖lSM<064P{p`_IDATۗ$988O$vJgsm;ɔw˗/] ߆ Z-T*,绺w;aJSR;Ϭ_v`p( -](-)pqxdԩ FR!,|ĩ"X{%s t&t4R#PHJRǛJHt}d-!x{MYfաCGa0 ,ˍO*^'m/Ia,8"rﻧiOm04 ES ֭(rV}aΠz+w?9 t:]yY۵S.755k˯űh 6YbGw( b:ڗ9z3B0JB98o+봚Řu: ^~啎es{At:m]]cW,կX<~%kHfY$uu]tP,Z bM=4< 0yFC뢅|Zillp8{ۻXnpa'pO|q~ํC<gXAYEM&l߶lΟ;/|^RbF1\`(u^CܿsR 6nXg⤈,.."I [M XhL& C!ONJr&?P,?d1ydlѿ=Tth7jkj55e2XV # ,n6O|o'[Pl녏‘4G.Rt,((ظat >uQ?֯ˤ `0?}yM[AAmSәLl.ۅ|Ks&\WT* U"R5;A҇lgoX65H!YTdEg9Z>HK.jh RN:vV5 pbV\dNk׬6sH$͛7Caϟh@QdC0zcVðGo}s+BH$Z0EALZZZw*fե%DRVTCu\?75=XK1CsC:ڻgӕ+:>VTw9{ĩmzi{vuGG[[!w-Y6;;۷=n~Gas}|#Gjmin=p`CCl_ךWY%6ڵez :{Z|>o@VժwIexF5dGj`0 F۬Mơs; 9Mkh408}Ab1.PVVOvB n.HR05wm4q`@ s5?yxxxxnOp&'u}@("aZ}U IENDB`gpiv-0.6.1/doc/C/figures/gpiv-fig_console_interrogat_upper.png0000644000175000017500000027726311204235560021427 00000000000000PNG  IHDRdN pHYs !dtIME9"@ IDATxwTEι'r D1ݻs„ 9a0䞞a: Uau`H><:}uԯ"(Z`07=(V _斶P`0-&FRU[sfȱ4 kB>/"bFR,9k^aa`0_BJ5nTU/x|E0+aΎ !`0Û 9=xA  B#Gʶlَ HjI2FfƤNl_~ &O?eLeM㺝qaap?tݎSUP7a8Ǽy:iEQ$I˯:m4MwO4{^(BTfFo۶l0IQ4.L/U& C];vx\Il%7ˆ S$ٓCG v&ItС /4ўϗ_}mٴEɷNdY 7n:gݺZւ+EYIO{]G z0 :!%%I8|bփgԪPp{[zjޟV7ml)I!\qM3nPZ!mqyD:Q#79ZYmiF(K0$ڨmw{Wm?!.w f%=DŲ,2ݢ @t~H$wN_%ǫj_yE$(Ia /B7a~ w<υt1=[̘0dђW˛ujqR·?.np™wɢmFRC4t`AF<=(Ju jCr_}mYYy߾_ I*gNdx|Q?K>[_Z)7GmZss=vs:S9^2lvQH:k␌ǟGP|{J*oQcԉ'aϵ $.zPXURb (bR(fNw|q0=(Qrk r'( #(bW "ianzF *kV@C>5Ͳ]v)ӭ#;/eF=]c;h7" %i'+'eZ|] (*;|#~F9e|@QVOh_Z^z@cccyyyXjZsTg:9=-Hn:t&MYOVT<f0W`ɞW(*7#dliOMrrQO_~ *\fzx$I$Ed0&$׆ȩS&dRt7D <؛$? aBDA<riY ,˂3H*HFyP3|DД(<)) HPF-"0D-(C")  rNg-}2bG3DUT7|( CCyD  E$Affff֭[kNW /B?9ՓRiii}yWʴZ+e vDP"w l@\bnrNVXP\\|#!6:.tnVUJMkǏPR'G,6d6[QWiOV7DGGi'Y6!Bg5MBb(ꪪ*NA3Ey|ղcPQ;!UUפjDAU9s9uA5='N,۸ "".DS$\[ Ai4Y3gt1&$rKɞ3gvffƺu˯ moJ%<\7B Apz!FzqŭeH-TPғ XL6ے%KZIo pt<;eTK9}!BՃ l=n@I=AGK6up&C kV. @ZuA $AKBS)>9JB*o߱ﰅK648ɐ`^\PpDI/&gx8A4{~q0?'1#bccnЃ9f,+Yn C_|*( |p81x^E! ~_uN`m]gQZ rj5Ap:lMt;l/'166h8 ( a]P\sxec}Ah1 xCİdc}H1AFǻxqBPO]@ 6oVR\p l=oS[G N׹@p.ݴgQ3/ހKCoh(߽A$ɋb!$f=HEW-.\07 倢KԀ^;JOOpb0̍aHRl=zdw\!C!N`0߿vZ ." `vl`0G{!&6^h`0`0X0 sԩ6[s{{; s CMMmuY_yMWر+wR\-[᪆`.uUk"'&&D($< T8yiǣT(RR333de˶t5V^~t["_v[}%8q‚#--ǎuH\0Md1|P(P( T*-..*-sz;WYzeRi0ڻw:y $eWv~5k B YVVVoGl6ۊpe`07|ĤߛlaQ߶/YI<)))ɗc步}n9\PBVe͛[BqĈcF߲j={tڗJ}]G5mꝣnK/?أ筷38$HnmrIq!0m .331m]i^dɞ8q|D۷.{w19, w)W'N߯o)c0bFccS}f~`K.3FÒKx:SUqL&KLLxصzͺIO4a߾v4p@vVԻRr՚>{Oѣk֮}w9cyyk֮8q? s}[ 3g=@4`ȐA]|zwXc/m4.=8{~1&zIcFo1bXaa>Bp8xp:!>.+3R"w%66v=5MVV֖-J޻o+gt%1!MiixΏ<[ سw_ZzZ~}Rqcɓ^823ӝNy9 b0Xr~+/(OQAԥ"Zffyc/ CӧOs:][!1aK!˲Z =Q덊2i;"^x_-$~ྌ#=2ΏG 7.X DQQA cbbP(2,a0u. ?0Æ Tb/ںzf =0N7nQFJe20ǟ @<[U$e:ytVVF]]}[۹U GeG/]~h܇4iVzO:> p8Ϙfk:b5*e}>_[[aC&_bJ^7!>b1'&$ٳiw)rZ~ֆ`n9gd[Z"+V6 (BMAWZhZ e|\\6mboiiooy ?? s Bi4'|qG6ctDffFpAX,h IYr<66 /))1*A )2F)(\>%RTZ,LDNN6ð2s$tR펎v;+U&K\AlFGw=VRSSzdr\N;h0Z""6&&**/̙ޢRF v0  ߯VkJJvۊUkӧk:Bn'UUՑsoJӗ_}}GF6n߰q[ٻoͼg_8fܤeKd"b0kG{ޚ?9eG}Ku% 8 7^wԷOJVPX/ {Ϟ?O{I6AQ1TaκB)˅V>NX,KZʧГ`0kKwHur%,!  & y[q`0̓G+.áC֮Ybl`031aL\bL\b ֯_JKKqa0 ICJKK ~v6bM0 ^O}]Ņ$R\H{[`s`n06G{[WWRYInW{)ikl/  tUV/B[K3`nvah ZM80 fgUo0IZ1O>ph4(JLzn":7 $ !o1 T;NQVBu?(>|c_W[R){i7l3[#_NW.*/?uU(--4h!j5 !Q~cϜ>Ea@$Tѯ_d# [p|K9z- Ar5zrtͮiq٥ړ2dѩBA@!@6)9{ݬ4pEQ/~p8\VV<2wjsX9~Dɐ'4T*HzCy/++;aU zdR `Hnwޓ&=.)1a ?C[[Lx<"CЙ3>߅Y u/ B xNo0ٛ{+.[z R=k.sC3'N)۶~$RR@0hFP$H1H2 0lLҤ>8TڛDZzjjjv:CDQ  ڹje{XSSgЫi)n{=X,^ݦB^@sz+SA y^!S&Gyic 6'%].r:6lhh* AQBtOc[ZV^y Fb [|_}SOZq<ǻ;<-H" !H)>sj}Sᐧ$ $ɢݽgD"Bv^"HfS/o~I@Hߵ]G!! aƍcjɓuuu'NJBQ{MG u~kfko['11nR4..^-QOT/$d#/I)' Qǂ,Oэ+-Kg|&O4xR}}?R~}}W9Q0f!-K3ĹWK/ *V8CL[ksںhccSm(hhJaFVbUerI$IHen<'''["ڀF5)F5h&dYCQsr4W/~p7xLQ_5` ][]X J y7ߜCߚNccEQrjUmn,X<#ъqh VR$ɰ EIp׽0(U Elɕ=|!p7VՋF4MQddki"ۃ~ SRrsu:]/!"=sv;@tn޲!r|>if%%%y^׬]?f-zI24&?lڴykV155 :0̦>|$!!aWz/Bf!$I# IDATD:Xq(6$9rKBTt|GvL/-Kڳ3 z}CX nfp&:GjM FɮȠ bg ]vSh`aAriuGwsx!jklRv[Ͼ(!)ʏ$Я/"  2HҟID"AHeap\ ]̰RFk[[[ E9N~?A.p}6;ZMh2aXZշK޹0Lٳ5)))plh5pB 0-rH/4hj:k=[exOkYd!?W:۰!x ;_]8aB?nnc'Fno3,ðO!C!P`4pH~io ^=};fQ{a@8zd"EHFy~H!A B ~hv^jMwؽ@O?jiqkm Ir]SJe%sQEgj_~u q'[[Z io]dZz]/1 !H"d$k>nŁ9u|OsD͸:o?RVn5`0g{~[0۽6{ K'ժh4s!!77_V+ $DA$) HQDQ,mvR8ۚl^۱hK䫯ՓOBaLV_WskjjI`~8.]m t&F9"!z=g= (>j0QjI7c?zvyx! }l^u6[_.³oi/ʎ;ݳygܹ"0N*C3gDy.}@R$:ucM3v[#BIo5HxJ}ގ@ @ @D/@0/b8ĵOMK%^DDD@$ {7r$)+ EG+66~oPbjs)%^;|hkCCJNV|E|>Ztժ@ֺg~swwEq;̙]SUuf}pQ8Ni>}jVv^kk˾NJuS2+$ѱNPv3!Tξ܇ | !xhΤAJ52l{wRVSCS(ˆB1" (b8 sBuUEI Zmt6"E>͓+? '}2K2@F{uYE^E#Z[[B~9~{[PPjllr:r{+{ۺu chnNFEo4ilo:Su☽HҪڶ`3Jk"!̌ٹhq7{A;W{[B|xG8p%%)n۾ )1ij@jJs=_WcaĈaG XRwo է駟&I32 P(2F `F]3!+iFxv "aD0 PE ~B3D ! BH@Q4M3`!\8$Bo0jzE !]KN:x`_8zM p~FܑEJ{ql1ĺ5&5-sk* O:]yRpvVډgHvredAt֞>{fwLEpE;UBB x(Njxg9H)wGX{‚‚k YJjuDA G+NZ.Wdr 2xFZv@(\2g@1t8Z>틂ϢDQHNJ8V^hyU~/q|DDQy}E1,C A,r'+-5U"awU\qSO9ǎږ ;L65㲳^$IP8jzJ1j;tD]A/B?QKPl&(>x`B}?G~Dž].WccZv% zD&YH}70G9:}T]I4Mqm{2%t @HTa{ɰF[ Rv^dMɒ$MM 3nXJ:Z45ԅaJ b:5dhl'/8"8 $#FIx],JH[Z`5)gz}~Vӧ8;;KT"4$ɢ‚Ç4%ɕJE)B=i' 2#3Z_D-:~qwm!&]^Ϯ6MuYOضsi'g% ES$E ]P(! (KO1$`ȤsB8AP$%Jimc0>Ï?[ջd2)@IAá%jQ֦&eefNT6~hZ#H0A <]{'%%B")0~l\\}mǞp8))&ITi4~?2T&4MdoFӋ8rrՏ=Ss˧%,@ɡ0(dJぇsKDEEaU)"Ao.,;y$I0 MRAWs'q]eF1c d2T*l^w}E3yC$I뵽a!C>|䭷? #: |aqIq^nZ6jVՉ --@l2 ZVP,C2R"DZ*y Ąi}غeWQPǟ}<37WK$ gn:y < Xkܺmkkm6Yb[=uvQijեs%^3k^yvBxIM^s4Vؘɤ9v 7IJ"%-519i}"<<O23ҏ=f؛ &P3B$59#$I5k9Yɝ,?#~] s2R$)H-80dGƄAB")UA2ǎ/++p#[x<)ʏ;K+I}^E!R[U8IQT~~Aj5ڵ#^_j4k*/J  Ih4 <(/7r0D"×_}=ꖑ'ig:?)Y `k! QEs'?SU]RRS^~k걿_tǮ]CJL?RV^QqZ+VrˈaCe+V@GHOO˷ov{̸?s`0~+ |' Eh4+Wu;8.v݆[nwǫrKKK 3UUl3 VZcԔ;o9HOO]!n1!ByLѿ`{86΄xPbBUk 4Kjj-[(;&NOQp/ '{],{=$+++k }at{Ӧs~i=D*8Ώ>d2tҤ Ər7%E}K$ !ܳw_Eʼnw -#Gْ+ $Æ"㚚쬇y|Vy)?[j`04|ӧ}ͷՓOk5ŋI2gdw~ܷ@Ccȑ:]8^n+aǎ<%JB-Xqfhllϟ_"3={nCcIO㶇̆Zf\8ӕis| 99 By_/~B'7nڢT(M#D>KcG*..i O?[~ԩwΟEbbC_zW Ô1ױeR hXEEvvf\\,EQ4MZUUƦ={_xvܽ}N l3O}Lժkޙ{S.}gSR[AըJקO{}̞bcb8?|l 3O{7Z[Z͕+! $ں3g^gv\ݻimi]v().z_lG=L@ z}Pr/[v/_Ç=zlǎy{E~'N/Y|𠁯2 p8t(o/#1֭߸u~5k@YIż녧OWz<o/}?`uk5kZ[8М/?eK-źw#kB?VT\@x>ؘrbbW iw8B;~0k)INgT>4ݻŦ(6Gy@05aas-><'!!0eeG;wϥiJ#G"g=5zg\~'>g}%K].7CfFIQQQ55uC9[k M6yeGM(N8h]D ++Ϝ8yj#>.6rGX262z32 򛛛% M ;?=cV߇}²{>]zڧ~+Drt%+-f;|ذMj41Z~hOu E*2buرHQiiJ`eW_{Gm) :ƏHʘ8qܾ}"9ޱc-\ϧVj~]qqSN[< t:mCccKk뀁2˗;vL8R2)8#I,&IRRJ&$T(uJHm-6a[KZ{GNt8pdduU*edT"8.b^|;#/I"gee.qUץ#I+-^"o4a˖[mw:](6cFuEwJHHصkw~}U*e8޴y˱c#)LKMe˯Nl8a\nnιj/ּ*#o,M^ε{+ @QdRRƍ0,87ٳЇ6K.@HE e+mI-z zwŗ SpX.ER.w ydR ^)ffKII6 DAL&BB(H~5k޽WoͺgFFF?&JTEB!BGGGdYE[SST@!(nRoPaʤ2dNG/cqqѺu DQ#Z&&&ahkVL_['M7v@[F?^,S\Uuv N<)bq\+H|ỿhBog˷m>jH4v̨otz] >[X}lFzMF|)K$`))EE&Nh@ ؓܵ'=-`K҈nd e'@ǎWǟJIN;|Ѝ6X P r<&zaV[^~ "2f#OT&޲u"Rjz^ac:^pZð* >444nܴe! 33f9}> N80n+V~:3HJOKҏ]WW^E$x^Hؼ\@Ғ#Gjjj jjkss11􌴏>tذ*>U-Xi$bcc#_Sdg/]b׮=~/2MLˋ=|l K.7F ~aX CIqQFzzee…ߩTJaRSZmFF~d!P5[~A :dW"sssRS~0=x $`0Я__VKQT\loտ_ߑ#e߿M3rymmg)1[:CjllZx 2$) jjذ!Kغm߯^Eq=[m8^²1h~ɲ' Hj!%!!oҽ{:u!Д3p@qQkz]B,O>n:h4O>TDQ!$.{2rRSDnrRNH$fOIi>%fLjccbDNZUUi2L%%%D Ɲ_"Aߤ2^KNN0RbIIr\R ?+3#b/taCFzj-I ERRb+ENM&ZSR#~Jo-fsrr2?>>cdj*2qѨu牱Zz]|B\zz˲z.bQ(11hB!bc T*rYLUTB$J ^/*,ӧ$#=]&ŲI5d2aZm4!">>N+ ѐ5d VCQT||˲Vkl6hVZ,Cmێ‚t^7tବkx,+d2dMKKeYl1$'KFQyySUAFEi6 蟞JtTTlfYƠGDJ(jX2JںmӒFl2r4t섄xZv&_ IDATYtɗ\FjMIIn[j-WyTScVg@N l{n2m옑@O}t@.%%Œ[O^oQv{8{V.S*yy57OuVc}g> F\&VdKy ż.hLJ.ӧotXx|GoݸE )cnG8^fw^,'KmG*L6kkjj<!iwxOm6n''ķcb8VBҳn82ڟ/r|t|w\X(dg\31{+{0;w4t(kǎ 3h[5F7.`݄V|}}CZr9n=|٭oBD 쯮mQ[nM\C4"}EMs+*.gocbcbzLfgϞY円GEE4n<#}&j .ĉm-aNݛwVIĿZsG1bmV uysҥ/Ojkk}pxo;V'̘1u~~mlT>K+N*:]T֛]ӢE>\tܖ4/[y[p/Uh;Zn1yxyἛ PO8誩o) 4h-F2v͛7_hWu֭Q_,?byGZek3/p:m+SdɔhɈZ[[_u3=O2(ҡպ&әR!4h\. bjRSb1A-$%9)((۶GFF\X;jԈKΝ;x)ײgϞK;=(ؼ5<<ҥKb$=-[5b(<ONNS!RUT|Z*ʤRPwD"ijlaxi/zDC V* S&sHh#GOo0MMΝ7[,ÆFQ]$9777zQ#n6ri'Lfd^!ZT|]*R;{TUה/A l޲m]hBCC).>SYUSBCCʪ& C``o*ሊxFD766;b <Mn/--Tp||\BBr[|D7&s\N`0 Ԕ`ujKJzJ5tPx\._B|xxXAɄ8ZVU8-bǣ$'!ru[XgJL&D"?aZXxRl}}}q8}I($ޢl6=sRªkjvGJr7ՕjU"VL&_f4K8dݔd2#b?pt Δ݇޷]^^ݻljʪ?#IF欬=8Ndf0/}7cƌ;t>C {rF+6CG!K9z̎ hoo_G~پs˖mvA֖={- M%%gwgfQes/..qР7,농֬K $I~\l A`QvyZv :;uqB}vljU~nkkxr|7lG.y;S*f +UFVP]ߔ(,,lnn:uM׭[[~;[,_TΏ{RW_;i<8]ܺmKڶqZ??OGQ4;' T>ǎqe???~i„ oV7&%ohX~SsKRh}DdN<̬= o$b2j{MMM5s:7-G p8MX/\({xɢ osR|"Νќ:Uy˨Q#aa3gLUՍM=Oc/~ظ9gdNx~C-kjn^ѣF*ʪ ǥ:WogK/-+;p1 2xk֏1\ uG^ pXX Å'Nڝ9~ܘk]3>o>+(:bШH@ѡ:~Y˖g~~T&5sD"޷}+YpMMMS/!l6+BB4zȁwtddlx20 [Y3k4'32>ÆmܔR\\Ѓ #"wdZUPxb#G -jnaCCCC[Z[zOTV)K6lh(P٩[__͕Ʀ _̙3S!f .]0~쪟֌;F$B }'ffh43gL{rvSr;v>|aR]~~~ld8qx~Mm-M=\.oy;v^nÐ!fϚyu8aXB|X?9%22B";GyWd4v/(X8h"fEG0,6&Z.`q~񴶵/?jsBrnuG5a 3\ƍ6uuÀ'0 @,MfsϿ՗B8>wccc"##~\AV۹}C0ù]咚_x`~>QNaXPPt;wtL4+ź7wqq $E566zdR}D`x'cby|ٳRR+|}[N: ptk X7|񴴴>̓4Ei;;bZ}Mֶ̙6400nܘw7qŠ[Fa\NqLLg}AҥKo1Eb0)VrLJa ztR$U\.pݸ@=~W,}6mzWRSSoh7MnCbhW ;S\rƦn7T$M ,f˯sō:ŋ !Ϣ%zjS(tSl ?}T޿a_\ݍ G89K*4P(P>uʤ otcF_("6].Ϳ\.ptYOCI&]zѣǞ})A2fӿ^yǧ/zX p,RXAx-˾_ȒE Csd.xQ#G`F3 \[s̚>mjcSO?IKL y.P\..Euylv% u:cmǩE/~()Mh|>Lz+m |ч /3zXm6\A4 C/~%1 >ӫ06nܘGY" Pm/?7osf=M͜1m!!eO<Bg4qnmA7YaCD)W k P|v[W}J@hV=lC8y˯YG("IAzN&W YIRkll x7\'**rO>i vC$ŭ];ɓ',~eiiYvN  > n;p?6zݸq?hnhf6׬]WVV}.>pW'<"ֶؘ[7M7vݺ e9{{f<SfT(lVV^qNFөEFbez NpF !HRSSvgfww44oܴ`0o]VwjcpW޺헲 7iZze;v*/X1ҥ[OXrr"u7h4uh4гiTde[lmjjIR&iᄐںS=BQT\Æ <d29SkW-Sq a@\l ***w<]T|epC⇲=fsTHL&U*20/`ii7,5sզkϙ5s.|f95%SYth*ظi-EEgvlkks:޶֨U*Ֆ-ꝡ.i-yUVV]*J>ҩ__[OERvԩEއ[mFY\\R^~h2.*!*`V3 =5wʼXY 9s[[[wa!mvc(hCsS3JtgGTliuRÔ2ww!z5*Q(gܵ+o x<w[~~^{ yVhԪ3{I]ุXͶkwGѯnyu)۠Y -~ZjJز`_n3(5SL;_LV`Wxŭ"**b!6o!xC `XT̚9cSƖeV :4 FQYY99{r|};Qf'22BVO=x'=f pnOB5 ;g]˖r9cFH(%&&]!HII H9cz˖쟞6t äRc6/_#mW${6A ݿac|d wn"h1/9\._BlwoѼy\cZZSO>tV՝oܢ{<=7"H5cD>5늊F-~W HfΘ޷OkcXYw_oR x1_9ΈC ?tEeede̝3 h׬y<3vz )-+" PTsfˎW Пs0'ؾcɉ#J]800`3D2ugSۦW_yqkD1W\ݷ٧T09{}Θ1[[P(kwIR 6/s8 Ye+D 0 ;w'!uYԯn}J]q;wgfgժW^~دS߽; @`1WUWU4ʮٙj ~T<]sW S y"" Գ%Tu%ܺQvCīLGmA~0/~q#Fc?榺k7]Xa4ZSlSvzQYL۲ڒwP%@*,<}^W.' )cb}oc8KҨWdc6npjk*86o޼n5ɥv36o[+f c^_ѣG*fopMsgxyN(ʽiC{ͳOF}׽=b}uT".^JݫfѢw#V и< C"z @nI% .aۇ@;oOa A':4MIE( IDATxQY3wXn\ÙwMӝ}zSZ]&^U[^Ք$)vMfK*Fίiw9C"(n 1> HҷOп\h<+HJfq;>*V( EyTŢ564DG﵌]UyAUR_[1uP4eԾXXXXuŠs8\AbaaaacӶ5~FCGmV+ЬXXXX>jE2/4Muz%ٳX!22rÏ^O1`XF@d2|Tʑotջ+,KHy٩SJ$V,,,,38\aU1>vi\?0h ,,,,3lVkvNX,5rxϊn*}4vڷP$Sy'rCLF⢀^IztmELoהD|w. iAPWu]1|v(R{es%JŮw 岘;~~YXXLжT{*<.p3f2tbY1:Uj?w+/0yFto '/ozm` ˝0EE׬gSOLNG0LR/2tX3@h4tRwſSp}1n1;*rAQTf޵ͽ-gNvJ E"dΗ kjjrPqԩ6 A^+ŠPij5=Z()9{fr{ߡAQ_@w_BMms|ҥzV,,,,w#5uO=fMSڎ$ z"~ > nD |nV1(j>_A@} 0 7W*|YXXX.T*?x~Gu>*_)X-^2e2N2 ݂:nBɨ(ʠ׊;KuYXXX"x3+2dK145:c!['&SV,,,w4ܳyolx"zڶX_ .'/t:.Ӈ|PQQgnw8Yj4*rr|ὖ7xuB5-cǍY1lڸiO].gw F믿>bpV,HzOeAh9׳b>|hrrQ(BCR:ۿݤrWDa5kֶ4Ο7b&E0u7L Eaj.Su_e44Mj|g0aZHCdCAf- AUGQWa@4kxE߄Gi {!a^a 0{n1;ݒMf  b!e|LTTXW%^/Ο-BPL"[I 0 ut-Ayɤ8Hd4MlV]\.O(XLF(iJ3taHeJv+q7'ATF(H#WӎqE(ʱYMyARc2aHf1q7blV3qp܍aLa2+7LFA!$9Evn !$iV N@0Lz>>`t+ߍ)q|M2ll\$l6٤}Hdq:qM)ۭ.bƑd<5ٯnS-JBUW|7?\k֮p8z/I۸ S| ߖ8)2MR2 cX<^tQEQkoߗzEf{? RvTwrp2ٵ:wh4;]Ӛ#DZNOC\5fgIryRrM)?44,.;xЀɓ&U#fe!646z822n7`_P( =O}Chr!2 S4Sa ew8 t:6X$ D^\WwfIeR'BBBd2鬻To1R8_P(H%ķ"Kt}}CNpT*AeeRD'889'KNJ*wټ)cCz#rV>uul*~o(y|ވCƻi[|H'gkYjYxIq]@|Xqe+ƏCtN^ U*QQqS'ˢH4MWT\limqJesK Ax4_{[뗠)juC,'$IRoVQQi}5j8pr.^tB0&6Z!ߌc۶rϷ ð O475 AwvkjZJH0 `4j,Vk@>Q\U:N(U(UUQ"E"h*rOHBq܅@R?@hHHcSPxxhHp0E=w^ˤR|}ٮWMT*͟yÛҫqy\$Od2ͪjǏ#HN<]pǧU,I$ѥe{jZ_zh4$rtMS+W=j`8xpN'H*.Vz<$С# HңPǍc2pt.W(`ͺ qq1 C;_QqQ.pAӏ3$ɯnʔ3̕Usfϼ 0 KH߲u!I2sJbЎ;F,mظ牄6gXI *~)59YmK 'N]aSxxZ1 Bw4b9rY*BtTQo jǏ+ 7nBQ[[ϏkwjJE 2(;g}'*/v.jV^6mJHH𙒳{666)9wb 33矿_~ /poj/>ވKt9C1P(l67$ÇN29_Bkk-ےbqvNSSSwd9rX,f&88:Æ ݻ߫.Qi0Sjܿsb1v_To0fΜWTtpviSLlw8^kٳf[yj̴TP '*h2-_`xJK0 0 #G͙53>!n~b|ؔ&yT))"Bi?fsy\F9rptE:`@zllj[ֶ]41==Cmim;TTjժ7xh h[bł_ Cmvǁ 9EgΜ FStSSiS--)I\.WD.V4j`Լ6A7))g4%'?_^pHHa\&$kqpFEEb׻Iz⳺N=(njj3{MEQ A.n9M(fNξ)ü{0=0(8=˥o럞Cfz85Pȕr./2xPށCMM R}Zՠ(' ?=-+ D$55;Fq,DTUuujEGGs8XLL 8 @AZ EY]SxF. q'**$I={r?~Gۿ:( xeYmVhzz? ""ðPrT acFcSӱÆnش.**[~~E9r%#c]Y"IqD"ȱcV UvNnsKKVVN[[;祦$ux]9 " A0 K$b@rrryYŤWWנ(:EK}'uk$R%̛ѣ̟Ѩ1 {.[cra \g_̙С^_E\g>xi>, bC Z\0&o(aC^:v,_"lv;$Rmgɓ{|+0(aw4߰ɻQ! HD0 >r{" 465]݅ ̬ݙ9r5W,Ɖ}Φ=EBB!jfry̕])2f]5뛛[N.jnn >w8ǎ455YaF`{5n߱bܴԂ4(Mӫ~Zcٸ<.0lظC&zHQF^SNa IDAT=z3PL06+;%vgfW(>D*@49~Q3gNL6r}Rt I]AAƌ޾s} IaQP`ʀK,T ?k! <0&6F`\>ɛl+,<P!3fL0 1|X|=Ĩ/>Ov=TU?컯+W^~_:ۻ^I ן_c{7RiKK돫~O}`]ŋ=k|u˾9b7[y1cFy^C.ز-do  D5b׮Ç "##j  AZ O̙5n AbѬ6oO> wTtBB~5 Sl &;ޔO> ;{wq8zz*`gDnHbb?+P0q*5!;f쬬&OsWc 0͜9[Q 1lD* (66?81pk@jjcB|܌S|{Q|sfiG^q|=((A"9n_^{_mi;rYuM͖۟[zxk6Ml_YUaysVq0 sM[w}͗wcm6?Z>v{׬ܱ`Oܝ?lஆe;vbE/㋿ʋ- 7|T˯SW[\J7cRq-9) \H\ŧO7O+U. plO=m1G099)Qt7\V*CCCϟ FVر M*Cp{MjkTTT]]F킜w%%(K;wq<<< ܅ }]f(Ȉ֔䤔kOtxǍ9[rKJJ~ݻ ٳdRc=xJΞeGYj?䳄'Nbl]qW4MR,~X,>}jGGTz**.VDϛ7l6{=/w `ݙY^K/ӧZ2b-(<#K N|ؔ`\\~ 3p8utt>ryYVk4'{a]srrzp½{X8_,el*mа; 66 vՠkŬ/|`/.)3ˍ5f/S>$e11NSLIIr gΜ6hË~Zv׆rRHC?"Jlv{zZ _c(`OR`9DJ վ}N:A(2ͦs $$$/@]]\&M_PX$-}}Q& =n޺ p8Əf2NN ^`Xɫly"02tKt \]ɪEBB{;[/OE%%>}O?xU+Ο5Z8 U/?e mm%%v %˿t*C sf=d޻u2`91tz[[_~_hƍhuk7Xl+3ǏE >u'_#0RZZVU]rܜܽR(op>KKں߷nε|%A(?fի'O^ZVv-Q^Qn%%?m2$8Aqɧ?pɽ;JMLKhk---CbOȸJ/2733T*e֜1Μ=RbcΝM"yIp`V '*BD ?y4qEQ"ZYxEF|>Εkjj1 ۷W>ul͛+o޼]RRmmm'''ă{f̘zFvG.Z8_R544nǚ[Z5wHRl kiiAQT:t5Μ:j))i477OMBV5:˯[l֡^{u\.ǖ7P(\FV?0- Rn^xʕD9ZduȨQq>L&sQ#S&@ j{\VbX"ddܝ0煅Fi^6`WAaP(tuu={ .\.wذ("DRGjuNn|kj8|>ʔɆhƍ H.%QFM8^RiԚں|~\\3J{-LhڤIOLIM[x?((֦8t"cc{qHHȡ$wkjY,֐!cD ?}܈ؘa t:ՠѨ0 ? 9IA8E(0 EѲrT:-{A(G+D"[7e25T*k W[[[SRӈ|pG68aDbbpQJ^?( 1 GQB$VG! =Lf Sxj>Vmjb2=tIua,\0722SƏf:o0 >zǧPڵ%%@ѣ(TjYY9ķP(*ZS(10..6b`8yNoY1L6ajbB`633snXXHn&b +}ۻaFJR1W9>>.\?fTuMUFַXqƲҢI,6nXR\*# C鳳^1 :tȡ#N: k 1-&)ɉsf':{>q@0r䈧+ײrֿ+W#0lnf9`!N:uFGGrFq /1 F@dPdġG<ϰ44$x 1P%ܽL <<<_g9B?MISf}|_BEM9H`8+R^^ajj;p؄KzQkK',*˳[ct:]уbCWRRjmmpBaMM-bFz}YYT*a ᡣGjZ[0 76X[[3_aҖKEET*kjj===RiuM\. Z` sKK  |bWT=].WW( b1++J%A۶ZzP(E1L`dhllýb`V^^NmmmL!?o/bEjlmmɪo/_M^dާG?jy"tea|KEǥ:1lu: QR? #'ffff]Vdb;6~LVVN5롡xXM},pH:n6h.Ν3X1lt.d5"#.^lfjr!277л}( aͭ_]!hu{UA J"{CLBxe\c`޼9>}2.B-(,ͶLBB7lT*^'B҉3ňJKHQ^[赥 9^PaDMh4O3(qlcxT.?l>G.)TF]d&)%2(a @mRD sLc>v]*rX c>U,{ CEyiZ-JENɜ0a"aJKJTj WgVb],%?pEOq0 zgz7 T eL:-~hSjva/\Ogco $2'ͯnAA^l&cGU& v~ޘ9p6]9zpٔL7k+3+Zڧ 9~doڨgh$$$$VDvj4ntOfL)WKl{7 KK]|ҲwWe&Fg[ˢ6 .W[U74u:}⑃ΦdژJZZ]jVaG.17ͧ1ٻ@iYٿ 'Oy^ڛn_tM?ou6|$bp9,\8 bdz9e)՚ZoW{ψ9Z[+pLRaRfLJQva VV̈G f2C(}PZY99>Nmm]yyywv 8{< ^otz`$b>C^q豿zaC? CDvwx}ơ3n+\&DyPQd@A 0VA`A"Ã(o Ã%!!!Ƃ5o|Kf2G:w50IaaA +Vlo}/߰8Z"YPΙeiw־Ͽ>}_[%lX `Q)U5C}\Il/8Ĵ"oW{!y8.{݂=F\*Aܘ/jڥrES!67nnr%Ac3{+Fa{_V HbʒX*ɴZZRVˤR  mo75ճ,sB8.KT*Jt qL&+ r9V&(/9jD!LA*Z"ʠ3xc4N'5#|>pSjEVVCAccc*abD.% Muu<K"N'HZ-x(&55Bx)J^)D$)lo޺=xP$ ''hSZD"4ȈOPPmmk3D\hmmxT*UTJ;Tcb#D"Q(0 sbP(rl60D"UxBV*juZ:&GZV*j:l@rM8~;=ck\ð1֢/7,M"cޮgn)-bŕU,M\,}ZDn*4Z\]T1.*U"ӣXweQ!mYD;;!.umㆅKꟆ555o⭵&sl##~SS013303:rU]\]>㎹fSSiS657ڵAq AA3gL7551okkǏ&>s`vՔƦf*=vhwԛ^`?eʤԛUU_|/~o۱N8~(Ht{1 5oNϜ|JÏ1 d-رswII)lniǖ¢[ qÇ}ɦ&.3y@--ºzAf ONIʱ/lFZIO6UHϸsvyVVwnkkc٣FDM .\TS[zՊSʸ.\  895-$$L!Ny2Ȉ顡!Bpk%#. Vkl Ü]gΘԼU GF4qߧB `0`@PX` :=~̨hJvŶv1]`^P`Zy֩g%RK}7Mk׽=l/aj~!0g#a!Osy~Y5˚ӡ2T7RgVvD V\6LTMЋef~Yu|k@+4fDwJ -)YQ>sa=k;wK STu钅...jܹ󖟟oiiJw_O޳{;3#۶trt|ݵBr)A~\g+W͜1͐G /}Ԯ\񆹹YqIibo??ÇY*,4J.㵴W?_@ IDATf~[L".]P(>AcΓ,]ؘ@܈g. k~l۶#e-Pi7^AT9z<,4t'OpvrCjZŚ+TjVõ0Ϙ1-=Ϳ ''̙qw钅~~55hޝ]?Ϟ=tȐ¢"ع',,d{Νzyu:]{[+@Դ{l6[*1T .]0a\k׮O:mz yϷJollz Hx츸? <(Yjcvv. #ZC7'OA3Np]_vc1޻OP6 6L sCt:C>K ҲE5D< /;RqŠŠLa艐 ggg)10¢"//OSS^{7s;s|^ppP<\.wʬ Ǐu;=]JJKer`ذYenn.!䐓|#|UDD[YY0=,1HK>`3$zx5 #bcE upaX޹sW 0ڷV+(,R8u5&zONNG͢!r A>䯎KaQClvxX(qhp8knvwUwDR656;:h4^F!W^7<*B.W `Y1ÏKi- oN/**pg 8p0QG+**:^bl,pvvrHb1z4==C P=Je{EFJK Uȁ, 3xPFgдdKMP0T*uyuu ._aaڂ@0wZ*A8-r<laii :q ϽИz 6 5u Pqz.`R8ng> "02"4fΘfem 315tyMm]iYٞ׿@R( 5(2@o\TʉI/:=ڵ &<6S=\8( N#6UQ( _rNA ] {gk+Wf())9|H ࡶN!ɠ |񚡀=M* +06OQ]M"[б7"˳hqZ"./?xh-Z=+NN2Ν^%鯿m~og^ldzs6n3;'+qq>uuD.jm:r^]"I[BC\3`0/_tݻV+Wx.u!h<.wQ(OMArGq۷+.!Dbp-^=|X^~π'OO4!'Z8u+](N?)oѨ{8-[T׻8 $p8))iG^tʒΠ::umbS )ɩqqg_!!ļqGX,欙3L^¢v<(̌J&$ڿ 2wqu6l6%mlmmFM o#b%iVZUPPؓ贺].C{nZNzn]_=K JE0LR,F A0jZ-T*NA45 ]jN#!.Fjh4"OJE(RۡʺTtFPk4lj:FPt:FqJh4d]|%aNZF8ѨPF0J%{W"#"##ph5 DHtzJ:-EQTѠ(JDFD8fXJ[ӣ`V?\VQPt U*5;ˠNaXץ]J%8 (Uܱx 6AjCQAQ OBbH#S(T:8kZV @ѨT*1\Phm(!EtORt:AjFҨN]9L ,,m_I庸y9˦>ٰvZCMwVUSOkqCE%t:xEH4Fvt:S`#A*X2R@׃&]UZ=*SNE 譅AS0Nώ(6JR)a'A.. IOCZ5A6ħwnm(! ]U yd9J_I*藸z !!;mnjT)v^\b46Կ<"ժ9IHHa().v#HbŊqVZ]^Zt}~ ״Z 0(W_߽{t֬Y=%m*Js~}\3z\f79<(+(ٸqSMwS>~*%_i0|ܹsxlF)]2/FKMы8J0667d;T*!NBԈkgiJRmM)I҉a]<7avryyyy]]avvvT*DA&N4\8abSȁٳfHxxxh.^Mݻw766R( .[X_Խڳ̬?x3g~Qowpr:w,v܈ؤtJu;l6[.WDFT]:X,177K3,/2LZV2vl ӐG.q]atBt`F+I9s̶mF 4iҪU:%O8iii bVVV;vZZ U$&&.\a#IW .88(#㮕%K.M>%?;;PƠ3oii133=th|訡C?X]]M~h-mVVW2w|t2 m‚=ex{{~s\{ܹs>|ʔ)OSNUTTp8O>ÜgNq])))qsscƌokM,4wRAA5n?\zQk2i`@AܾcFh\78(B!=qGR9{EҒaÆ I?4 :M(@,U8>%a=5ө-[_0k֬Cbܜ(,X?`DžB#Gbuql{o[#2ŅXŸ'<N87mڴb k|ް-((0  jL04ysx\.qrt [~hP ! iTJYCt:Bc[Tߍw׮]{,-----zeɒ% ,055555(5mڴ`t:MotYNCRQ0 AF4_Pje/z11[dɔ)S|>d;}tԘI7`gg~zrKK 昛PCf,/033aĄ?/a-:|eKr&&&4:W_]kז- 8..Ԕ` 鏆*ߣU,<}.샒D,&Ȩ=n.]ƌaXJJ HOOF9~8m޽{:ԩSg~(Jⷹc"##lْdnn~ܹ7|W^g>Wgi4kuCQ=uk Ay ŭsss;&6ߏ>|pVlKa%5 uͭə)w k<$Uյ(2dE=4gEEEEEw'OD$66v̙3g"""zqop?jfW0x{{+'NΞ;wnD Nmד>A/@3BMm*'!4T5qIB+(9rdHmiӦM6AKKE-ZASSӄD7WDdojʔI|I+O>˚[d[մ4[IHaxQ561 4 k}ח?f4YM;bffn[ M!!A6HHH rtoiWUP(UkkkkR$$a pp8rU !!!鋆0Ʋ4T_(=mi=%hTSAVQK/贚HgF++}@=%ec ɳ1 0 ;9:VK!Q1vR/acemOA(v}_g;k jHe&!w ѣG:PbbG8:9߷zDWHHapjl7By{Finjloo?|'Ր=CP0͘55ӦN66(~/..!+8""}ʔIT*5,ν{u رv{V-** .-+HF{_ǓN8~F-yZ-@.W=|ś,-r$/ah4 B8yK++RiQ\yyyǨ/-6R Bqm yyEUhhhSfJڮwfEE lmm`kbc߾qǮxcY~~gΜmo/[uo9FV OMO߽g~^W/feeW9o@ocGccۼy _LNN׮RVqaQ{wgپcw}}oX[[\ֆ߷ͽw;;;}WoYmΟj-[<(aYS&O4qINI}붖 99\y+Fܸq,ϧRvl};cǮ= V.733}{?Xokkkl,prt,))oV.c}??vdehuАw׽9veYX`m4*u/33|ޜ9ˡ|}wd2iӦ̞5PZZsl^_m">t_|";j[gP&0fԴ[g͜8q=]c#ϛsPl6ӓ&W*ǎdd܈K(B(ԮWԺ8j \%4??_7W <8NT*Zacǎٺuۂsƅ2 CZjV]h@G8a|!F`q#bjD/.)4q|N&~[KKʳg/L×\[SSC2]xmYYyRԴa!8 1JE1A{^0 D"wwgl Gx*$;'7ގd䖖""£7nܽa 1 HR{"R(BQDRSS:VWW_x; T oheL:\Z׮';:: `.(*7vwEg'' R[W=ig"EvNnTkks/vM0(2"0Ĉ +WnH(-X07//oǟ_/|"P(kc'g/OO︺0pFM 0vzXX( g]pvvz2ٯ\Ud8`B$ⶮxyi$e0pe„qyyR& 0t`.SWW`0CȖ4 Hg\rG!FcN<}ĩ~66>z! 2u$KJ<=>c4E"0;&БN+;%~Bxqq#G&=zM?[64$`})ʌS ;gcm]UUngk{ --geJŎer9x]M}Դ@6'M@R=w0aا5A~~~ֽ9[F=xϿq`cc=md3MaQQCضŽu6K`emB0~J0,Ge㞩iLp@G@XIÇE@@vvv%몌&8Jb;Ǐ2222Qk+DbOOBfopL&kljj\.‚Ke&Fݱ%13550(fZfh4mmJj3s3TB3QDCC#y2A6D:˵0RI<6XQ]cnnd> -+4j ͶѨ5jk+++,-\BlsY~ߺ AlpZcmmzΰðv 0⛚v\*P5-TFPx߮E+*8.DVSS33St:]]])Q* Dﰮs^J%8 (0 TNVRy}5fHdaiS_W// Nti+ k׮ut|5yْy6שׁ"UDPm 9K=v)S6r[rynVk8?ֲlN_&&&pb>+2$pxnt*vtjLMM:M<b۳8\.ǐ3S1zvg` fg)tbeiiei)CA; Adnffnf ">F 4d0D =0gc$18ѣFJjBN>z0/'~ƏҐ~3q⤆;wȺ=vl|igiz}ҩ ˖-/**1bDO @$$axQjRIzEGӛ80(^4m[{s(jIiٍK,"? .z߈h:YGqmyb{9׮^~} տɃOr|x=B1n lgWc&457/^l?0d{q<'ޢů( E zp\]]<3 t `,U;wɹVG5*fw8[~өI'>l#IaH$:¢oJG,+y͛zlmm8YZZ"" `Nj!-3g{ry\.شuU+)X,nnnf(?Hl;s簨]wԴǏ=zRt9qOnj͕ d677;99J$\P*UT ڊ`!W(DBNx[ݑz>OxY&( baiAP*Z A,۷/%%E:88_޲˦־={%%%afii9o޼{n߾ @RN)G<^?}4wu-^oYLp8gO'=1YyY?v7E1qcoV); E~~T*FyyyzyyT*ի˖_pҥ+Nuvvjniiu&M?Z&]xFr2cI9Y E֤' ܄NN8+o}fN;2nDaihh~%*jT%^:bCѮsrr>iӦ?Na2 H$z.{KܼMPpRZSM/J4*'in\( ZWS/߷n`~8[77Ȉ*CâjW|3.w{gi/WTbDk$&15`X"HU靅4Mbt)̹3ss9M6l_L@MƏ/(DSw׮]666;vJbX@M~?n7n6mգGD۶m2e ==޽{2lΝqqqҝLDZ عsٞ={"iе2NjŢG|P11㢣zwz$]L27_А [YY =Θ7!nx EIƪ6X[(apww>}}ڦOd{TA"$\,>|êNݻw߻wo &44tժU++>zWΖ-?&\J4m钅+krs ϫP(ZxYY#w}?(D"ikb:$lRRVUV\z-tlp v9sW;v˜  joo˗/_lׯm422Zf͚5k^;?B]dTAEDDDDD[R=w~mmu j$bQC]wIe߽kei9mdX@axS0JOW788u|6b냉 _? ф166Zx!/(  ruq䴵Ua@lk61z-@ immο37liKs'! 3wB SP(*wqn!=ۻ26 w<ܝ!p>33S@|w^"ZBA%\A Xtt L{>7*Juf<y%+b cÛV9t7'7ΰ_?[WWgwWWRRb=7Eo),,rww{C8/HAA\9QDduSSs^~vm%h(-((<9~EgBAKK\.עkYZXX&LI M;;A,gff+ef%7n_[:Bds/= rtt@Pصt®͊KDBdx?T__7.VjWb{7e w=hh#C7n666bbuqu q߸qk+>,o˿R4ǻx \\.EF=}l]]r+oܲboo[рy1UQb2G5h۞so)7YXF77J嗯\TUV;AT%{466]JF}} N9EE% IF#FdffΞ+77B%\Joh\J|=__"x1! pZL&>s\CCÈT S]]AAZQvF3މ'Do"bΗ\=&FRi`w*D蜹 ޟa&ǎmll:pp^}SSK fgkcgkC$_M?___ix57wAΟ-N>,?>B "R }KW?cccV A˗:sN(DG5st*]dN^JT.Kkˤ'oh!IȈ۷E"ѳ"Oc Hkk(/IFa0?qQT*U$9@.?zTnoo EƥۅB4 } 7C$Ύ߰ZZK,K »Μ9gllڊ HʔԐ 5 R"}bqX@$=oV$еN[EE˚m'W[mUl6Kg87oRljj>s޽K2ՔƆVP}Z˗deg>o}}V EYYYRUdlH0@hn sX͍+7]$ ..HeeΜ=j;PdaqءK@EsS#ċgX>x?~1Kmlkm4aswmmF*+X,mm̔F9{2/H,50bBbBBp8@ fΜ{Dr_^+(*=qG3ztCC\.^Nا yPe͍u/r <iTj[wV % IDAT>335bqrkRllo/UK &OP(+@7\.GhL&d} jjj;;;-,̩T6ҲwpƭV.=keeiooҧA+Wٰ1T7\#Jշ@X,d2 }aۡD,dr |r^&>Rٶ[~/>gjn5]9szVVv~} ebl`0 h5ۚ|7`ldvVOW`2ɨ2eF~AN511D䅅EؘhKK BCh4*L4)^^>Doyۯ63*/ͽP(hD"111ZrSycKB&'޾}BqxEF0CCT'gG8D+3"",""OQ+گ<3+ӧ_~8>6Z^x \m5Z=Fu[[MX,c0[Z0yDFr>@{⟡bR@xX“}d2iG\x|;L~ΖL&77E"obb| #{K I'TTT B}==[[]wfmQ7^:~~2B17735e,^hd3^UfN753,.W[:A԰D dgg Cqqڵz4ᣊTUU@ pvvl+>H/3*w7Էe˖ DQSS3sݿlM7FEE/ԡCJJ?[nEyiy{nL&ߗ>S pJ& Y *osA=?VݍP(ܸi \$3#}R[W.'vD͆`u-͢vx<<?PTﶜ?]pƩy?xXzχ?Y%wAo@?0`ĩI!qЧq83ۚ]RRxXA0a@D.+  b1*v\.WMbܑϜ=O,jhCT* \.h,JTT*Q(~~s|lμGXu75ϙ2gE&UA)}߾>|4EQ x8 gD~˗ʪ$XFDUz Jw(-4mff P(Q=BJQ,p8  k%# iiiرc.\hffuȑ,l2^Q5*q:e߾}W^xVVV˖-;v,;x`bb"ñXlYHHH:Úk׮=##رcBСC` 3ק^jT"Q#G9u<"<3޵ť$.%E?vÖMCH$ӧ>u|y/7i䫉P oXaɒ%>ccVY=!H$74=nGG^6j*UARiddzjުL*_>YI*JL&344T?j+suu-..~-"=Sy9'WUMƨZӦN*..|L&*-}8n\*vlltRҕNbdžo o0:::̙HMs@$ɴ|[RRR*++{wxڿ{N 6lDSەJeYYY~~~Dkp =0i'.G 3U/{t)H$PUAjX"01'd  ۷o 4,?266p8'`:;;Ϝ94{ljDY!=OP( f)--ݽ{ѣ^C_MKkrta0 L_>r3=|t2oNW322vvXު}|JebU( 7@R[[[\\lnny֭[͛z= 7n܈7oޤ(cǎgVVV/eo=޾L(%%e֭^hhuӦϐJ$NQ=TvDӅ! ݻwޭNR-X]湪`0ׯ_~}uljjz#NڽDG?ėee&* T2`K Eq"B2MlK>\>ppr}?mkM!( V]ͬ@ d2y9h00 @ަC]mR& DBA'sD8mmC8% k Rax oogNEQSwN.*d͛6 tѢl{nMŮ&FzM "a &20|NPwrR }lfa=h40DEF֢k7`1X&C Bdk:uw;: D=?i4#g?WP"[7{TXZX[)jI륽N&( 0u\ggݼ'd'3kÃevTWװX&ClmmS*!)**vqqmK/444w YIɣ_v’¦*Z~kMMmoK]]o;wwuu\p)q}]A-L Ia_4IC#UP0APt];˗/߼yKo ZMƜ ?j' Jd'gG |'=*neeFOaKK{ ('Лx.ZXZW`XOO95T Ԕ _( 6[;rD"iԨa:òPd2iMuUqIWUms~*L Kk47%&%ͽg}gDF}KK @}CCmm޽w5vCCCssK܄X33ӽ 0'8FHĿQdigg'*}ΩS'WVV-\80,KKʪ6Nĸ /.9ȫ?Ͽ_=yӧVqlns}}_}6q.^J,*,2447VKDTfeo߱>~Țm7QܻbRw7WQ,楤𰱯%lU{JJ|Sg[7:~jKo\ x#CibP(4Gnj L{+Y,]gL6joGcUnjbJT*άv14m\TںMp)ѓS EEt;3J?v|zzF&Ɔ9w]/rt-n݉t`0NNܐEScîXf]DLB"I)JJJ?XAPtxWjSN:::b 9p;y-9XKffhwV%sV(' elċ@BP;ammzBid!Þ"" DbWU# }Q}v.S3KD&Œ^E $=ዜG$ͽwZ;sX~v]B"B$H߿X,Q*MX~IGXTT]T\Y/ ۯ׏zb&LkH,.)ʶb0ӧO=|xUUu]}ńҒ%b4o~PJNѱ1NƟ={|uU5 ՕH$h4z8 jC=^^m?[ mM \]psuv&/^vsw{бQ(j!4 ?O5 Lh//ii (jӚY" y 1mD ?-|H5BP)=n|x|xؘh>ٔԴ%jkN.R(LqچJmF026u򴩓{lިmaaڧ>[Im{K_Om\2 ̞ k(&v%~r++v"7j" 9P}}}CWW7P@Vay:t]T?65 x/TŒˈf OsϦ*@*υ)H$bX v|M;98eҶUy-_wwWn##C dcCn |uu}}'MmDL&5v ?;Jl&Li mjTaa +*^ZZQF$%]>sT" {hZ s)!nmIx<*T;;"P*I'LIIIKOT JL&vWy@ҢEK[)'çzLߑP];fh@0iT__?:z\}}L.7`2MMYY"(Ͷa2m-MUN.VֶW1cF?Tq8v'D&YXk\U5~Tz3ZL~A(%MY,.A3,.A o0 B!H&iRX$(7E^a2L&C h*rSsKvB&+...,,DGG?>N.]o,"tmN.G|~֍F%n.b8!1I&.{9˚2}^!3: W$Ģ1t z}!1ryy72_KJrQA . ?m==Uݿ26k)WTTT[[O}1!+nB,:5)`11Q$$&ݺu5 ahBXr5iKbtPxuC߼P(8nlHi7eö& ֩\d)H6a Ɔ_0oaيeKFccjjjfii ' >ظqpႻD" O{сRH /((**]ӧN=:Pc踸|ƾv;wL&K%C)33355ey{yx=DJ&;;;OΘ>Ԕ5 d64dD"QT^ttg0{ |ϯot_Y4ý&ɱאY.^mh.OrDÅ7C8ĸ_ﴴԤT*xt<D"GG?^CRo޼xw~ m'k?*/27cT=nl315Gzwꦦ&'Nlb?]]]_|D"5ibftp) |!) Kk K 461D;99nԷ5|7PD(.#V:Zp8%6 Ƞ3{;g6LL\NxSk- 7ӌ35hoɤr`ƨ42AV$655aQ(4Z}/ a!ȿ/*߶[ @3A  @0@  @0@ _7f%q þh$b1ߓHGGiP;:U "_ P NwuvT7F"[=qbjn25 EG *MkĈޞ ó~2>? ڦ'>hICN[˸h*6HEM~pIOX!2<,RYXo!cdU+DR\\'J|}UYryN݌ɓ,--4G?zT>:h,#/A&133Bzyzֶ+ƆJ@ JsrC?Cړ&Byyyv-P80tuuw 敔hhFFM*F ;*DTF*-)9sfܹ%K:rG D4\꣏VyZ @HSNg߈SZrZsn98)2_zࠋ %1/1cڌ틗YI fт Z=j.*W]UXC_I$bSSsHHH?m^}=.}aOμsQ)'붻X,TPD"?!A]H!A+aѝ6}H(w7C=@ vxvč$beK,_o x7\xI]}95洴_}Q cB…KIYXϛ;F߼uMMzzzӦMɯ.77IN]v9rlzRQqɞ?UT|M s….?ч\Z]]zJMM- Ajj>`Ŋ Av=;ϞZp/xr6پ'O@0sNƟ0wcnRAԋe0>6<,Fxup\nffM' NҁBb ]tm׮]}8wd`Mu:龻b%B@Qr\ X Ɔ&ff4*OfWO[k'̝g7(t[|¥#|Q4>Q|>?16'\8ݵ=J(4߭,.}6nў:ekw ([YZI=AQcB" 9}oqDxc'f͞B""tZf@0`0O/@j%\JcŶ6kyfxW}&&>]ӵU(::ќ3'1fTAk<$$$($$虓he3<,4|TЀᬭ,XX,.-}X]S rsu!H!( ֚tg?HRUƌL?0tww755>sN- 陏++1\())?{ҎJG *b-hF=y~yL&;6lh"((qM1&wS}Spe#-Z}c괙mF#b*ĉ2X?+-ڛ7˃Q!0lܴzZϜ>sv6bѧt:%܅"Y,EQc0p E1aB!'Ir1 :Oqp$I-gUU 'ݎ(p8 z}mmhd9l6 t:'@ŢV Ep J8avVC c\.$)a\. MIm4y<Pr I`p8A(ḋ.6Wh!r/]:x0W_tN' ,bugqa, A~y8p8lVqj644LF@PzFFzar9BjjjBC|D" _~Ggό\\aO>s[ Crr Qc& TRZ*g̘7a#GOذnbbpGg^RL IDAT~æ:L:{֌>}RPڋ.G1%%M:yР/mv#gϚ1yӚuϜE$#=m2/+:&9gάAxXXUU… "q?[pnݺ--Z/oϹ΢I/gϧϴ>^?b˕w;o=b쩼#vرwjm5.Z8?,gᕢ7z'!>ZI bS&O=jɄmtD|> =-Z߷}_XXd27Z,_+)ݾ}+E(4OO: єsg=6'W/7z AS?1̅W[=;!NahIB@_`hkSy{K=._{E$};vz|ΝzgO9s8HPPJꛚz(7p47Tr+E*_՞9vZI:BՑд~L&wJL&g"IRcFȖ=BSS{x#o۾ l422 !Co;c q7n?qfl+NcXɉ\.w1S΢C1$B$q8TUT,]Alظ$IE=BϜ雚 F vrZgmAPv[tz mfyCC2XlAMMEdtE M a) :nLfRbBRbIMMMv;vDdd 8APr8$Gڟ(Rp8FtN8{e \ П7> lVEDBy0z(ꀌ$Ii2AAbۇxŴ67PXEMqoRWW +<{[fɈ.(ш w\`INg{k cnF#L&TBg[ZZ C[`EWw\A8vXkvlaުҟ?XLLX,(p86LVt8<,l6>|ĝ^BcQeN;vbР\P(p]+6uRm]ZH '&ćp:OG{>EQ$ v}  ʪ.&:|$$$P' NO>#ֳӺ_\cn3~oMM3gSbcc7oٶyY3g9|Ϟ}[lcXqb{_(b'O*zYL\7B= ~~~e77WKr||//pff#Ic`|(D[[ng0l$Lf0(r:AHiHylO~l &C"ӫEjBX,\.}t$1Fn#(" >=7ЩԤr8}SsFT@Y6HHwdHB&Bg lګ/9-饊Nt9,X,f2AzqdPr\pt vh4pfK$ ÜNlz4k4J3\<v@fv¸c{h2Y\P(d0N`0\8d0(bN'L&]BӡGQdb2:z92?B ÆӶ=T +L.7-]40?hgjh߄ \iZ1 /_j C"K$.XDb(*J#4^^^txt:ðþSfwJR/|1y{a2h7,KTt.RIWd2 y8Nǧ [lmZ "=]]+ XKRB`0z')qAl!o{KttTt4\X@`@ P @ J9vX" myq%׊ArfOj('|68NQTǓA @ʇ7(,?ؤ^Wt1{t)S|횺`v!~RTGMFӢnn3n[-n,Zs!_~ͮ]{!˗/zjithZÇҢ>rl?{ tx>⛠_9sfJRNیx>znڼu9CdeU^gY*\.C5Tnn&BPL&EQjuscc#E//Oo%*##cϞzjժSy&Q"vMh|-[3g;3yC,4-\*S`h7l6{GN>k qoih /_U*_|W_V*r/.} EOڂ+jVU]@PT*1|3 ܗxڵ>q<Է!g<WE{\zbill()8$ ==~ggE8>idA$I`XArOvAP0~}z聠}47sy\Jz^y>uDte6=b۷wt蒏w9U ju_CrOmmmWn65OUuM@rR"a7+`mA@GK,))))))yry=Y#ꡕ cDEG/xʲ=B+(ZtO "ݞ)<@pPPRRB^I&X}2i \ȴ))I~1Y,$Ir9\z%d4vیH Ӷ ;wzzN 04fص{7||bMM qp={?$$X.>GL+Es.8:I]^QXv1fϞ_Tt{X}} Fy<0ۮ^>hPfK>*?KRllD"f0$Ip86TC`᷸v*`0յ>dpSSIϝ;W՗F^³ EѐfMEEeJrR_gZBL*!11Ѱ aطh0Q|à Нn0#);@qT2T*|*疎0u)?f?TE;,^'^ym%ѣF~3g= Gzh'mt oy@0 ңW\\cC^?x`vv{^{fpyER)UjjSNWUU;Nv;Wߎ?vׯ;f5a0jjjx9׮k^:hԨV,VVv<{6%MsauTYYnF f<2U"C3BZ~{(ihV5kO<=|tNNN{wUaID$22**mߩRpll6O@xXXIIf4]z0 ]++6kaaQLLlAhru=BCKKD"^ w♧}ٗёASyGM|; }im]݄;;YRuy؅APΚ5l6_qËdx7lkkD#gGFF?>Z^1c`ǎhjR{z*>/zN/h4!ňpTSS+>8< ~gn܁£MFCIM&dlvhF;i\ԶhB%ړ\͊nA 4SY3:J.<}UIw Q(ó:%~8 b+`ZS pOJ.O]8nkoCfsJ@@ 0lV 4AVn!{@ ( @ ( @ ?=J,/s:Pmyq:7^>*D m9P[[i?+V`0͞= ZrPnӯ9\Sg`s88ڏ>lݻvҁ7lǕ ̗]kϜEG>u$:oUxٗr}'Pt1ݞz豍M>%__ d@aAV wޓ񥗮\>oH[XuXXϪ+WoݶcEY,Vyj(FJ[6L$ L& p\^^t3p\F"^tc9;ر%O.#ƍ7 9 @jah4\fG:MG8N.KrAd?ot Eѳf(8wn)|>͏ΞiZm`0F޹ks65,9T*?`X͚kVv({pa#oZcZ y-EQ!!bqxa㏮JRzxwud276>С\;o}}ӵw~? [6nolk3LАկoewn1&sɒE֮Ŕ>^ҷݛvF&R@[A`dJj mC7C@߱c׸It_`@Fd >~k#.ֲ9\q<円L0VlW&*6;T>/.}g2͵В( g8{ʕ+.,+&pAtg3O0WXͫgjE=zxdDA{(~ EQ4*2B,:eRrrU{drG,yɮO_עziZ΅f` HHHjalrVV]8w$sW "_ʒrcFh2$'́ QQ}S\G..<cnj~_7yyl6k$.W?2?y89ݯ_:IGw>{0Ug&]e=:{&p8t/>e9 wի~P0nC d00:…18;Sf',vzz?$vBB\]]}Ϟ=R @(ׯ}փf\N22`EB GU_W@? d2}vᤉ&M)W^2y3 ?T-ES@uj 3t贚{Œ5]@ Mƶaa=aB ) /a(w; <vυ ha rvB@)֪?u"Z bC8a4xL.ց:b,4?`funց@ `B#7hEݳgbjh_Nۗs6`O2g>S?vvWyvU/߰!YF!n(*y_g_ؾ}g[>|oL8<'qW***"#nwWuz]uuĄxX7 o߻cF3vb;s&_шŢ{MF͛{ MZS':|$QFL4h3ϜNѣ6m/Hmv:|\+)i̘0ac' ͚؜vڽb `dqppܿm;4ZH"'Ï+'7fHE)WC6˖}zZǬdd3̬qcG:R^qxY͝7Lo+ liiXd:tȎ}}UKN/^jMܳO;z)V 󋊮~ꚐEȌlm5L!Yy'Oa6mѣF|XwQfnukV644\|1Tޑ ,^DTdĪk^ Hd2͟?7>.`8vTm.sƍwycGnܴys\+)y~N PRZJQ>wo>ZŋK;.@mm]Ə/u+V~P$e2bbyzIQQ?;}kP*׮Y"ܣW;vb鉉 n+6٧RT㏫Npo|?/;/gRYrlݚU55}L&}((_x<<1N ExXa4H$?^|#={YUUtO>@,:wg_醍?}r t-[ <3Pw5ee7W\+66Vky8Q&SPp+ ETssLrP.<***Gs`0('^z1 :I&zs.$$dN2o|Аp5{̳I^%vP(**z[jmm%"##] O0vE8geX{|wWn$JKo?=lI&r'Mj?&6(( {էwW_q`_\~6JB"L?19{ЁOOԴvhlue7b 8NW"aP$I BwC;lTm۾p Bft("LddCEl6] M-uaZ Dkᡡ!:Ւ;-+$J=RT\SS핳/b4ϛ+JO|o 'puH(PJQlL~دRW[?قs_|EOx(/^+) Yx(%9ۄl;Oi%ލ݂I=jd``@S`ZlV ḽբ6ӟnjnæ8^T|gPùG ͺQvby?}SM퓑џTqQ@ p_ohhllzrOOϳ(eZDΧ$'/I6r 3`@ƫy#k) 1.^'9jxa͍KRRR6o޺qE'M0|;fK=:A1G""«kj׭mB?zCr:aoddحoTѴbj&n'aæS$' dN:y߾G@WRIϿf{y{J,}թS&cdwٷsEH$b ݸP_-):%OOϛ_JBZI{jccǕH$-ZmSc 0LaE"Nw.LoL(tM N Az}s$Iͷ׭Yt:5CAQBj"Gcch Hfscn |__ŲMMAWu զnn6L,ϗ^b4jP(^^vIfyy?r\jfDD.+ An(hWں:DBTl&uspP Y<.۫(䞸x쒫q )b45V+a2LT0 M&3 tlEQBzR @L.ҢZ.&:r566 JPo( 0j564Zm6r98WVVFwgeُ=:c1w5p[j¢k׮\S(<&y-ZгGoެ5jxLL_' c괙;wl?1; |ԉcyb3E?%b^Th;{ewWuɓƹY@"aqEr_ZZJH$ZdբK&$1F$I55Bh2"HL&t:y<} h4$! JaEL&$IXlVU;N.i(Vk4X,V# Ck@"K^բmv6+86EQUUBd4bNH%j2PU(iݮN'P<Zjy\$yzzF@@߯FbZY,L&yjXl0Q%%01U+lm2(h4)+Vq&XbX,t,^,WAQr9 faжh֭8n>}:ujN355uŊѱ 'qft{n2m jjj6+}~YyyEKV$M>9)1#GݸqjGg͈;vxb>>ާm2rsb,N~EY$ƈp@ssM[nsꔉg]Vbw|YPp~Vݿ:"<2qں!Y_t:AZl6+11AWWiS&OD$'K: >|,},_߹sfW#K׷t5fbed% g͞7q¸7˭6kЩS'uݗ 'o蓯AwԴCgd֮AM``\&ohlÇϘ1aΟYZzn>+&`0\q`0bDҒk̛7t/ WxڬfXDEc/Z{p|ɓbݟآyta;vٺ}/\Դ<3>>kִ\zZI̙#X>]6oz啥ju}Iٛ;oAM[;1s3gLֶsמ!CgO/(8w8hXx'z6zR&\_acRRG9zw2Ȫk{$9;ֶr"( )()l,u IN&1鄦w 23X`B?>&/&&s^.^\nfkm5|}Lѣhjl*-bNl+Eŝo铢ѴЁ 5(t|>?5={-f3` {W|I?yTjL&3**t8r{$=jp\%%6vVR Ǐk>yƌfy<& )u-Z]q5Ԥ Mh4 |rU>_dpjI!NaK$[nI>ɓ'\3fMЏWEeX|/ѧyy%%TJaWVn7;AdrY``'>WP @{D5%"*0HpP`PPPAHD ]Xb3bL&nU? Txa&$Q"I@7EEk?ןù~$kRR%)Cyy9ARt$Aǡn*AiY'EQ]<;_ryC2{ҥc;vl)))7J=T8$w}UU558=_VK;U .++3L7lcyzxTÇ'Y)m;vL Kє$;%ea~l,CF<>'fRb!Bb2u:}qqnn4.\d2<= H$xg^t\~Gj MINVxx{*|,`ܼYru :0MA"UWWFM//OJkEzȠo^8wo $U̘5W,L[pO<:&h4mش/ʦN)GO&MyǛ? 3z;_h6ur$`-au>^s x(JH]~b4u!Y;ϧ)˦ND{9N/*צ u$,ǽfD8ufPb\C)OOK󭨬9vX4>\p0Njo=QRFYz z$F?[IDATp9%9>--FSƚ ]]* d2i@íVEET*H$th2={-\8tfFmm]Kk맟|(Io(:v跥egbnqd0^EyynL&l2X$rt#zzT{zyZՕ.,**:]xBՌFm;J%FvT@Q ~Xw7vm ))I?__ ìV+IRmI@`xp\hjwYs󥍛_=@ᦟ\nn1G`P[ @HR.HB0p}gi=@T@^4L\EE/^Zf3¢0 KIIJINb2[lurro 4qBEEeIiY{{Ǒ|UVyVOOϚ ӧO;|FY=f+/8_`XLfUwƯV}-z{{kk~ݩS&''',$H")113#d޽aX[[V{UG45]O6Y&tևUTVجqcDFD|W=={bfgڵ{ODDxJսܶvP8ztFtT$rAʎ;+K?۫.=s!h֖M~#t(X,vRRöX,===:]q77C.S(<ەJ.KM6dxZֶvJB&I== XFcUUuHHǐܥI9|<f9B@.ٳP?Ϟ+G,,ڹ{"6&x{zxDeee2v۶]]2dF159)߿ti>wAg'ÇoxBxxcjjJV؄xw[VXgٙ{_P\\*)-۷/#3#]ۗjwk0F[5\ n߾SխJKKYYcBCB%eo)55QwGR>]=kNߗ{\ywu<<=ݮn#r^k"j([]E=<~Qz˅LJ9.g2RQ UnL6<`=:sqA$YVv&qTBhʤ'N`0p6}"?Ȉ13e2Y2a3|@Z8(LOO~`U...3gND>O>(4$Q,NNxц 'O¢iiѣ3&N񚚛BV??߄V?66b6iS&~c'OdBN[R|/$,ß8aW޲e[ppfomm  L1cھ}uzPJ%ǏSTz| ѣ3StDݫ>~DTXWlryL&sx!(~g򎖔LLJS&)0?22!r%C[JrB(+kܡCOŢᑇ?XXX$ɲglPzzuiL_T*'O see!zX N:_]J H0}ڔcΜp8I|>ð d2ZtIn JJL}n͝3 !4kth`[oܨi ?bAFG*;Uk{|*0 e011>^BgX-fP(:IOO-);DBBG'g^gZ=7bjOI*#Mrzow0pfY,f`

9w`0L&`0,%sN+*fϞ8C+-[XxGvd/N60WhxxxY) F\O[0~KAJQ=[54$Ibf1 1Lfv;#`z2d6MQj5-kM ޗn(ncd2v{ZN4[+Sͷ{|ܹe-c&?h4!3ψD_5uuӦNEi4̜1}Bp‡O.wlٺ]V CcS<oIΛM' +*8lAju)3zhAlL6^svvZ03Y,cNlݶCyW4|lZ=m"zz$Fmҳ";bo:;;nQRZ6nA?{@ 8seO=!g׽?o-[ ºq]]97;|ٓ55|bqTTdKKoq>^셅BUN/YXtT;[}睿Q^Qk/CktGoWxCi"رUUju{{]><@WJ(E /;svf+ggttt󉍍ihx7UVVed!Z[Z{._n9t(eeB?nccFJII\NJ2!//PA(g`q !b2m46d"+7ɣ9qBkCœu+]nt:][[}d7јљN'''颋;E6\=MMw슏MOOQrRL*=;f\wE\ ܻ/7""|Rxb7:R$%9D~7xv\. ?>+<,T՞.*F1 $L& 0QFL/rcY4E?gSnʪ9~(\ԔGy('7zFټ3%/ njj^nj K<6da/7:rպkN.;w,PdDDoo-[|AjJBH.?gB@`<?+kFf!ƚf& | T*tWas8^# mZeGL(n5gg0ps[@p0 suuo:z{+˕e!#6} #c0t"V1x@` 0$iX>g=w(vZw)zjk^,4ןcX̅N677&P)}`άX5dP(S2۫J%!|Y"qCV/_zNN#N3k.]nP[B30T2_g١=Neǿ7l:Yt6'gcU/~|>wUPp P{{ǚג$Iw ZM{GU>xDzzيE=j-/~ȷX,5m1 g#"Wy#Lrja9W 9:I3ٹK!9pqq)))of"p߳Yc|Z.:]V ޞޱưY,ZRZp;w uZ5n.cbgegֳX@/H. ں:63$wPOOϙ3T*WW״X=j NJLJ :˗$ץe(B-mllX,avc2;:455#~1GכLKKii٪Vu#Zm~IreN&b2 |hFh(:}cI' gΞ۱cd=pR#Bh[Z n͚.Ԓ$YQY'PygϞ#dt=_%LF N竫 ˗[RS\])^I&~sj+AH+**~A N`A>DR͙o}/Ïo3339B33'200!8md6Asr}3+^\|{GGm].~Wٳf@s.VxdK97/Z0w0lntfN,..={\.Jj/֭^OݮV?赓}hBBY,Vpp <>/,4q77WI7xxKKF%Ļ!*+֭feBzؘh6MJ OO || F#BH7d2E]niI8 |$SGkjjj`pH}|)l8~ݸf0 !u)-W\^^1aBH$ů\.0dO8h..ZvEcz׃wan_-F$= 9K{x"z˛=QL&cMaF#b2Ggf,_nGnbGn_ƀsfݽСOVKc^><|iS'[>9)J&)0 ðE ܐSKkkJug˯J A9:_]Mၹ_ɤO]2;{&7X-ָX:GtxxårqqH|\,BH"̙{U S&Od0|>?$$ wf+..Rd (0 <ޞ Ƌ>wseh,fӈ/~=uʤݳgΞ9xw~J?ɤv.>|ɥsS )-]zi3Oo::1qTb⨁_})KXkyy)V9h4e$Imt(@IFz'|7@ prvGfF\uvu89;7`Yw{>Pָo+q5 =g!ԧG䔔%6yW2 V+/y)P'px8bCH%+Z^^LnY``mvI1p8\ǕʶJQßLB$I#,0cG1wP sMߍ§n8p}0j`45Ze<\\6$%%]Ǝʼ\Wl23$AANe_/BH(>[ZEyyTPhĻNߵkWo SpkeM`7`Xhԏt>eurrjb,&}ahз4Cpsr?K PX $S&;;@sѱ $aZ-ޜ 9CpsǎJ̝;gW7u#$kk3f=P3d40 @8r`^73t&ap LZ A`@`@`@`H@VA,f ppA BBCXۅ; Eүy<IENDB`gpiv-0.6.1/doc/C/figures/gpiv-fig_console_image_process.png0000644000175000017500000016307111204235560020645 00000000000000PNG  IHDR'rd6 pHYs+tIME Tƭ IDATxw`E){OFBHBH PT@"γ]NE<;E=A:H@BBT7[?Q9 yyy~3|7ð@ yh111MMME'$aۡ!d&S,ùR4dH! j~a i8a fΞ=[\n @ & SN0 Jՙ3#0#a < #(H%bXGHC<̨TTTJ${.\֭?|ȭ& ,xUf4` zL9y 0w!Gl6kfמ>}駟R*0 ee'aC/tth@}eRgip8Db4caRoKh=W-I$R o~N$\>Wp:;w677?Ҧ&~>o߬ZPYY)J?=e$I $AҶ;$*RfQ[{ CtJr8.?tuQIa|… F1?ʕ_M6eɒGٳf'''u< _.}ze˞^wٲ;/T(voi҄%K{w?#R5jp8b[[[Wbժ5G}䭷}彑# -iii-((ضm_#?{B7n,(*PgKK?2$IW_0!r]EL}pixq!M2a_|v6pQ?{0<K 5-AI ҥFi\ N]phI]]… d2)fܽ{O8r:Hp]shԣF{'NY$G,,)9vѸ8Ӯ](0a\bu6۽`<X8pf;v4`ak׮+))t C'$t:|>khh0Tdee:Çwvv5PXXj՚#G П&Ȏ;8|=ZY ӂ#Gnذ+K( `aS^r 0 ;b!Z8z1>D0w! Ed2X @.p#XY.WD"b IRD"2o߾Iuu,HIIoAQ0*{qeiL.$ M\iTN$Qlbf.BpD;bC?j."ER(֓f/"a$w0`0FL_;;;}p=<ߢ/# BP |~gPbSL(9IneHDZn}XUc2>p`$_cΨ(yXcL$IchT#V^_8%KCQG[Rrl˖EE3\.KIIH$GQUeee*d2$04%$I=M$Iz;+ w޳|G >dd%%%z}LiiR~Er].עE22].ӧ1 /\37pʐ!sr]~{ucƌNKK]+?+/uÊw/Rr"4*O0$xI`$Ix\E܅\eO6{Eղ@ (fkGwvvw̘1===haEs>}2BaEܜ$6-Ǝѱs箆FTҿÇرږ' ПhCQ4޲:rh 0ErGmm޽54\hii0aܠA/&i7>[jyFDZx4=Q '&_vQQ(]0̌7EG.~vL*KHyNi.Q(d b3`XwbQaራBff玪T? t'N{vX¾A 8. 8 BN\/qq>_0_j^^.aa1& 1ʈD0 XWWcu۶m @ A|ΩS/~@ =Xaˈx2@ [Bxj( @ ^:vqp8l6 C}}CGGf锖5GUm۶}bX m~cƌҢP(bbb?$I={>D䤟C6C322za6Fcә{1;)1|׭P( Yx ^Zo޼l6|wk׮knnfwo?IolXYY{!vW@<9/juA![̚Ud0+oݺmF @C(ٷ﻽{1pĶmN]J7^]%K(*QX8b|~ >S<o998NWWתUkSR].ה)R+++7lzRǏo0Ӡ TT޵kj/{9řJK[: @nWRΝiiitnذLj@4h4(hd7Ny?ߟ~z聴{_~UOWXLRRR1  E*Ar +|3y&GbcM4MY6joorrfeeUUU]xs \a7gGQ a~H Cd.EQVSSSnpJ˽^ꅡ5.VU>pQLR NgO4b~lh԰B XF..^LQTsswa~ev{t:-X,FL6uӦ.G vA?~Xӱcv{ԩE"!b֭enj׫rss[ZZիcc D"Vsvߴiu|>Gؽ{0.} 50Lt~"O Cݷ#`t`0_  z?  h2Ų3W`cN >|hnna11 3::z|XRۛ1 `0ԯ_6|vvRHJ%&qj4jۓh4_W`ry|R04}f) Vc6w^qG*T(Aj4Xcq357P5jTaNN6 B fF&6}na.uee'N2$hmeeeO6F͓`gΜSQqz3KinnY7m+;g]˗ "uhkki:66nW >>G'`Q 87c;qС/BvD5 J,!^Kݹ*EQtrܨ(X,nF}ܖoELLMLCbb,@ ( y~JrǖE"e!$'X8Q*UvE{ Zm {z U11z@A oae|>oع`0 @A op8Z@ P @ WMp@Qknnv:]t.'o]n\ DEQ,6"J WU\mذiϞ=ZLՙ)S'GGG"u.M$IZ,3~4H1.1 Ք̙ꪪ3Wh4 2Z r lxd[JS+cN0( h-^O6F} -qaʪ5m-M}G"DWM!EQ6Î34I_H/H6\{W'|t:á0tvt#? vaڋz<`0D$''"U%S''&$HAqH #a $E M#g޷ԩE^׬)DʨwܝonG 0$I֖nZ'`bSD|B!C!lnEE3VWONNC$IFf['#͙hߎ C#0FQ1ȸH&3u{w˸\.zv8] DD$Lx@z 0ݷ'xvXZ#ON3޳;&F(J?*{ I<.S\0$`UaK8v{ય;orx1cF3 vT*p8\2 C]s} z,F :i0hF H{Ç  H֭[of.R$9mێsgKV7!QQx]~0prr!:@anyjC GqGQ$##d /p8jj{gΜ{lիJKK9, q,zwrq~/$Im߲a{#$ PW:.E3"?CO.[Б Hԉcǎ}cJ$ 旔{hi~LHwWoN7RDf&Pf'$ď=…]h'X2y$BqC'R覃?]5V_z|X 8\΁!0hZpDz|euh&HPxޒ ^@g:]H aϻ YXpKmMPsgUWm  ~SS;/^Du1  E1 M(BUiʸ8 ^o]*HII};mkkomm(****lvCzlcJQSLC\>(4 $I.G0﮻#d tuMz4)&"d(v:ABazυgѣ&ٱcכoyGKk[mm=EQT^UuCz IDAT_[ 0(IahpRi<*Z=zy\D1 EQ@|^m&)-yM) V>xձÑH$K?⛑#  yEEE9}/O$ʳݝ+{=/}bI' B(e"ߴnLApAiG2KЖ-O<&w}fǎ0[o[ v:uJ B!_{0Tm(3SȑpZIQ$ pc0Hbj5__W5pP]iifaa`$)" I;mNg ^2(D ɱXӗ+??uP(3Ϲ]H8rL$#|#y̢۶eh&--E*[^&~tvvZG" Ecw5f(L (Kӈ]"ګϯ|?wфI?Gj-D;\Kf555W>ãGb:uݱc!o&;|`M<$p8C)H`#Eq.Cқзo@ t5 Ba&IXM`&)"i i$VrP404\. i }4MRP$fڻL1 3gmp2B2ΝzEE邁)V;:mi0 ȯ^/yGoKtX@r{+/Ÿhrv49ĄbRw室w=e2#<#*/eT xBvv8b( A^ !-Ojj& # ZfEE^$&C|P p}e;mEpQ][@Sk{`Px]d(0b0 %HįRyyƍ0 ׯ߈QQQZ0N'(&y<b8f{EQV;~ʸ 8u;tvZ֭[w蘻 XzٳRRR< o:DҞ={IpaٲD/_0556mnjjNNNZ^\~m)/-=Rf2 VI;vܽ{oYի?}D޾j՚9sfϾsxN={Vjjʍj6KKK9B$ΝvCرǏal޴iӕ"p좂aΟٴisssKrr}-n}LHђcǎ'&&ffyŗ_z>F|'Ozw-Z3555-Zt1NXAn]Q"  *(-=ݾ}w \`v>iy͚b@{{ǎ;ZܧV>76J<`г ۷hoo9?@Gxs/'ڵ9n{ݺ (.Z?\qKBpMUUիWxk׮z ޣT*:H$2;ͻ[V]{ 67L:YyzA@KKˆ U*}- +W~uIJΝ<h4L>_& ^Uk(Z5N$={s|D"77xm>qǠS' ”DN2I(Z7ޒɤ'N;wD"kgPt:~D"av!Fx(D;Nsf/7l$\\ _"%-JnbxڴӦMeaʯ_xUV:U"RH$N9Sa4,}UTT0 nK(0/:: Aͮp~B[8Įp=^H$EE39_׿lS=zlFFDQG"$'*J R`ry8{<*nZv̙qwy{37}\|29C.W6Xm|$IE'مa-!11ܹss8 JJ П=z|͐!E"aee@,ZhV VbBaFzw ܾ}`Ϟ=\.R8zyʪ}[P(4i}-#IEbرc?XT45LJJil6GGG$:zx#<ѷUk"paj3fLxܟ|ٱcc&av=r֮]_]}6 2$##}qOtW]}M6'&&N2999k׮"Inh_=gr> [ZZ  0hT*-(fMqbbbccc~Jꦦ8^c8::&??СCfY$ASO\PX8b|EYfK$֯__@JJJMMڵu:I]]]O? /#G[`л\dرc?}~_Uՙ!C_hPr\ӹn&F!jᇫ"7+ .tp/(0lPu:-fEp^d$5lPA(gaZP}Ζ`04wlF >phd^ ##C$*\vSx dr}ӦoXWWk%0ܨ(P(p=7~,?~̃q|>i3 Mq)mmm_~uRRS:@~BtllܩS/~ BDGGϟ?i&{°dɣpM@(|'0__sr;hv@nݗ@ P @ P r 񹽽b1_0x<\.(h/ڨBRuX[Ww@~LIEPs/v}> @~{J{ (vUr<1ч@ C n6['4"z=&.݁ @ P @ P @ P @ P @ P @ PW_}7c w_v[~K/|+[7X[[kb<̳7ov a˖o׬Y pm(6EGVn%v;nx*CPkk+?JJJ7n՟DpGџH`]Kp8IE.W'>ȒGx]]Uha][[ϥpi>]bwx<,W(ݏ+dϿTT\ 'ϲZ;ͪm`v{,Y嗟_u!zdy }bxVFx͎ FcSe" }d[jjjhnnl9q|̘IHt:>izi$I.ۣ)-B^dddy<7A(b촼ʫѥNn߾㥗^Wv}ǡ㧠({䗞C>̲c׮} r8=-xr\gj%ɥpLw0\%mll,a ôw(zh_4D"F0̅ VA"RQqZRfZhliiu8.;HG1Gϵ**N+N@зonii|R4%%a6NatPYY0BDTT[];!!' qW_}5))d<R)aoyziXPTII8wkWdfp8~+P(t1.\h<dUT'O #VTlֶP(j{T8e⎎Z…H$P(bc"*552v덏X,'(G Ξ='HH$JLLD$IVUIIIۻjH$b~?.=M!EOdۛ"1 j6\n\\R bPV0͝ Nգ핗+o8|[lݱc[ x'&ON\SSsTf RlΜny~7߬IOO>}jmm݊4CQdBBŒcb_~BDg]pb߿Yxײ4crf"̙3޾b^j4ŋEQ_ܹs[WWƍϲF`wK=q㯼{KeٴiK\iҤ</ ڵ;VjZCÀsgwמ?+Wܹ 6cݰackk }f͜9}}`pӦ-}22;;;7lD aݕy=f.+&Loo0O*[lH$`HRΟ?/.jǟ3fT( cǎ=zT0z?X{řZ<0L$B5U^O>bp\L6q~ׯ\U8w1h„qO>rjBa Ν{ _|2!(2bgΜZZ{l7oio`p!?o/|bbM}K5 Ð$gjzҧO޷oggg0 s2dشisU>'7lXQQ{X)k ƍ3z;v;vAP(˙:uʺu 9>}VGe'N]6mdjjɒ'fΜz33$w-K0Dsg|g`Tǹ=ۛU7$@jD5ĸKNN|qͽc;6Nlc1Tӫ$z[iE9C!6$Ξ393fطo}Ee2s=sIVgYJ ??O"""￿}M8&L_RR"{nˬVikk76##f[;v|vE_nhsҒ.H߶m{jjʒ%-|WFSQQ|sʿ09͙:uJ^^Aǎ/--;w:~dJJʑ#lk$Y~7v}dsZZڂ[~y吐`@xxŋnop /ۻwO~ʰP|r6xqٲIΝϋ ZR/577XsR֮}.22rv4i{&M(uE\'''8o߁;v蔘LÇ=1f̘ʳg ͟YD'{{U]vO$8{b[6$$dǎ_}#?ƍco(AAA/}~{x%pS.^g7LP(Ǐ߷odVHJKKJggϞW[[駟M4ᾼ#Gǎg۶O=t2.O$%%;{[bbb.]l4nҥK" 4MGFF.Z_ ӦL:x=yTff\.睿T-[2AԔ3$p5'';==b={϶L4IT>311ч޳@wwweeՂOdffVVVnٔ)g/Y(J5JJXr򈈈{}ɦw}{ժBIiӦM#IV}ܴ48u-['Np} u|>'?y|{B0%%ӫV}()L,Hh>t`׮_or|̘1{17ov0 eAAիWbf.\t:z++^}y)ee N3u'O}vl6}j 2{ɏX,գ(:v옍711[JUR2^p]X\:fL޿4FΝ+-noog:L#biFӅ m6Ν<oUU5}ocӧO?9,,d޼LKK%1i$bΞ=Y6\Hbƍ{j+H?|Ns=v֬R@o`ھ}b$YXX0ꐐ nAQ4!!A& ?A5AEQ~0AQ[S\p@ooo^^W*fXӋDEEK~:;;wޓ@BBBΝ+r9r<:: EWZZ¼%'' \kJΝ;_Qq)33S,9Ϊjb4M|>3EEYJ8{:uJ||@ŋl_Cnn2tL#gΜDV~H݋3b3%k CrrBD4nz^L A#C0v +nj߳˗/0Xp9f2wܥhoL)H&N 32N0\p҈SP%Iͩ -+{b׮݋-Vx ))=xٳOT}˖-f* Bqrr &_,y1^ҥ˽^T*/Û94ŋ6nܼx"0{vN[dsϭe2C${H$+W:uz%W42 ClG?z7ycE 1EeK<꫿L\xnd.5u/,_Aq/PWweYoNddS0\ntt/_ظ \.ƅ \dEQL?7::jѢgϖϛॗ~$ְ$xϷY##3gz]]))7 Zp.V~…'NZjydd?1~|! Vb͚Fcn놰2>qQr9n r fȔ i6<U@RR* ˘1qO 5ƍ+0ObǏpt|V) N89w[Opx7?C^ G}Cw$f\jFh>y(И톒vۈA 1J@ uܖpYg@ ǒ䔔soKVKqqiddeHH84}'==B;@ {a߾s.izoUbw1HXLC6m4)M@AphT#~kI{4k4hnyS {KaiZ|cN@C ȣő#G7mTӍ w, eӦOQ=07l&=  yx^|^hD[]a٬FG:Vfc0 Ƚ@Ӕdm#~r9Yl6n\=Tq%l EX,ֿ47_}@rHڪQ, z@(?F&S8yshL&HU\.N;L&h` H7b8r=ij311lV8/.P*;{DDpa I6pVYy199? C'"EmzKK@ yhsJ찰ޑ'Nysh0ú'fxfsx<ރʀH$xߨjl̊igg@ x}6}m%Wzz0@ XO|>f}GX,vax<[Ov:nMS!T;;۵Zuzzí(im@ |Wx\HBTbbrLL,+;{Thx _$;7w /m116V(O7 @ ?Gc5![pN;.#$Ƚi՛\;>B Xb4IIwd E0:|d2ǂL<<|ԑin'F~p4v0<8vh@.W(!% ǡsJb!+/E|?NG?iB6?+~y۶yhi3bGJgp6vp?,W f}Pws{*SC|dUs.]ɤ hq9 P$PM$ۯ,{OvMfï4Q+aV`{nG/ıf~?` JҹsgSo F@vN<5{ŋoy<ٳg-ZTaEQgΜݹs^oXbyiLr[[[{bb‹/ lC8pM:l;}֭l6[^^ŋBG^Cf`wxT֢cM'$i6nh3Xm i fzv@ap|&g(nUTK&E87u  ýWπ+WjX0[\>yl(0`tөʤI2myO*((a]-]F!, Iq@ {.V';Yj \wzђXiCDE |>tOorɤ9E!2>@=`?tV;ĽZY=Rl6a6zz(JR~?EQ.UfdoO8y~~?\ܹ/]曽3f̈=pҙʯrݻ??/_o׬L&;~f#Iw[n]\\leeF];<csE]n^*-DTb YT9!kK9Wۍ,:}|K*!c^>+>B{ s+0 IDATCP=5R![&xČ 6TeߕVEYISDŽ]V66 39l0^TYdNɤPMQO6#L?E,(R!kƄ0௪-6P?EԠY2鵝Nju]2 i8_tEXVg x>r(fϘmzG i(d=~]){4VE op1Z'*T/>BTrBz$/Oz'EK$V"`0Y/.LnPMΘ0(>io?vOHLvp$…(4u+moL(/4XڏQl1X؍iϗ W(:Gr ap{)QFDQ`{OU)sD_m3]"z'#^8x3{l!:vP(Ϯ /L:u̘1=]vϝ;*33x NHHtvvZxyf_5@ CHHʕy<#hJJfI^;J'E̝n}󕕙,H>]^=?IsJݫ4pXfB5eIB8`tMZ8=ЃgLU-ħf+2;" ޴qaNdB(/D3H H0>E gm} #<ֈςcht@*e@.yāSxN+;r5ZeiVwE pV+r֯xzhDžja@;qI f.l4U y!y{`vepG/˸ cjVgL{Ov-,hWNߓ{8č^VxiYZ﨨rH,)ZbsxKRxB_O'D_=x{XuZ&Z8-j)>R"/ORYk\ sʄ(FW_=AX <9yHNΘð?\.ah1oNoAq4&G=`OiKw}'EDjܵ}{ /Nq0Rm78"DcB$0<%bؔ1UWoIfNY4 #E8J1 L { N5<G,$zITYMS?{3'kN hAQQW x<1p\<0AD"!3[rm=sLkk+H$ؘ'\zm۾JIIYbǎ] яJJJńexЩCotQfa'H`Z># D h:31Jܦ4N䲉9,ӛ\qaF[=(Z"$k;ݾaͷ> Xr^[94GQt](/Dc)2Y*VI6IcJ Pb?E9]᧞=-!2Twr}& Sݖ.¼>Jgp)q6I@&;Ab3c|8Gf-L eTlsXXJdaEy!v`sz^*+9ƙ Z>?m,; ;6@PW@D*" pVO, ncgیF]4FuH @Rb$+$^kliUQØLH<>LPC.M I`qmf\A"82fC FcMQ4S43VI(3I`y*uL&|t+믷 88=;;$Y/FDD JjeήxX`Cccm !2Ruz6id`]b"~? z)P!U:MMF秀Ѧi00B)), 5uzX;W09h1i>"P mnp}ύ]uʵ x,ua0T1  rl)4 hF0(EqAwC*8*K0izذtI(KE4T]G&MҪjx)ҼT16ʷkڥ"2!J" )Wkc0?EKDnsBdusH\#V}FB=ޙKt{)!r;'&GD9=ZRmej&wY#C]*e[B87E!iZsYxɓzƍpS5K.7w~Bðؘ;vD"h˕a6O,*):rg|>/bӀ(W2G.V#+A6CVhq` Xk2JERYoՇȸc҃>q#0xM"(qn<:T@QtFwK8Ѧ4)R.)Q O0F"mI8.gnҌHiT;C(EG"yP!E*=00LwMQTg)ͱ"Ɗ[l¼|f"1ݨO1ӂVAN#e}A fʔH1! '磏WzN O6w0@avдxiѩҺV}}A.HXߢo2YXnL# ֨TV#S *H>n|.!hX8J(qh:mm Ѽ46CSAE(Ib3<=C ~f$/Zի~0##puuWNgnn6 tfmmFa9i̇L|d\.0ʕ+>o񩩩wm.GdױY\h|^wL7@I`Iђbhr֨jOKDdT&?[}GĄ ;Ugq ڽy 6yh&Xߪ29e @\EH"]Ӳ P?sSdgk4ߜqh,@T|l7v׵]2nK:(2 pؘLaw6k² /.I>kCOQ<6Bt|TȞ9qxPOwKdtp^J9@5.b ]]Mr,teB&1ir%TZ6Bd\m{EQqBDBa!$"+ MHEQ$@LY"ew\ VFp <ʥ\?%z @Q|ZZMFZ0aPXVDŽ&BfX@GH0$-N*ZAE…Bay"G㗖 7"=1/iiiiz뱱M$ ,.z]f\JJNN7X *D(ah)cB6NR0!ڌѵOXpd0BVr)G$ 4EyF`c0`曥J8.E E$u薏!$ er!)F'M#.H|( ֛\,qfYZ4P¶;}$ xg TH:> C.Xؼ( "6wԹR{Ƅm:!)Rt8}62Ғ&7( Y2 Pp`N۸ Ë\ HH!e'Bd<r#RtE#  aJSsR5N?EL$FBs@.l"0lft@hKHޘ,EB>qivjL wGFgn9 C8`ٵ+;~.ܤ̠r^xQC ;! +PT2 HX?,hXx t92e0L<憾K}HK,lhP1H1@/yC*/]ZaVaX6^Ilġx;@t]%BfSR0C Gx1$D o>sp|W^Y˔>7n2eܹ7n|b'?^CI(Lߜ쒊3Ƈ=]C_ԡ(*OB!^޽233v{cc3<=9`6MReVۮ]{^z;v33 #XHM&٦u{OgC#Gfs```E%"OyZ QUeffDFF"#,pm뛛[jk뺻ƍ8q(r8MMMfE Ɛ$iەʞ1+Wb/]2M.\lD hww^o I2""B"#rReP\JҸ:^TP(4 8XP(pw`Bh}}D"h4~_* FˬlJejx1 \J_vvvX֭_Tںхu˖qtw+Ƿ7n'7~#w}NNٳ(-Sg̘[;:Rrs%(ddO#[E FÇ9&&ZB˚@HH<'lOp׿ͪU+{zz/\󳳳++>󢢂;rPmX+ x9T5@ës=5Eμ^;}_Y,֖+Wl6VTk֬NOOQQQ$ImQ^~… W[[7ubT@DqTrD"?oT*&^О9sϧi:66t2ja0f \UU[.vl6+:!~|e`oi a{4)=##]P^$IǃӁ|>].7 3fLcsJKK  &#`6  _ޏ.((@Q_۵(bƄ0 cvA4""|ƌ錗0oޜ;c'Z@ ǟ'(ܜI&N\$bÏ+WN8e2mۖaIhxbܹfEd):]?ӝ#L8tw+oWr,""p%&&^0@~4m!z}}ꔔd_ ΩO-oXY ̙? . @QAP. J$}^Xg;|r+{{{-yǥ~>xg|a֬[l f;x!AC"/: ^|%D|G#$<>~E@yVe~{x&xgϊLfo))j=E'?}ᅵ]]ݫVxݻa@0言E###n7EQAz 3hkk/~NdHHpppNw1U*/(p8yyy*U;+OƎyf_ZZ~݉(&&&bEQ466 1cl,;((Œ lܸyѢX_W4M$iHtϵrWɵMnrnA-+`f0->˱Z-4MI\x̆(̄nտV^eX?̡`6'vaf@ P E@ qc== r?xӢEegϞgZ ڵkU:u:'';++s.\8xۜ͛7O6ەذ׿ظpa`~@ |ee Ǝ{˗k_~jz1l6r>2mZ1I> }hh`cǎmf.~HԱchH99c0 8d#?iļ6$IOhÆ_{헩!!!LVmo =yr%""gd?6`vD"Yxј1BOQW_Yj **_ T*%I骡!$$RPHJJDGGϟ?wf„"<$88,==6q:LOk 22n[+7mtidu/2M>W$UVV}?6n'<Aܑ0 ] IDAT=l={r8잞a]JeyyǚZ̙ 1@ 722|>?77%33c1RsNII |SO),,Zzz-8" 0&mm;#r tww d ='A C@lpN6;/4䑀fyс1 @ P @ P @ P @ P @ P @ P @ P @ P @ P @ ( @ ( @ ( @ ( @ ( @ ( @ ( @ ( @ ( @ ( @ @a@ @a@ @a@ &`D>06LJ$I< ES̤(jt%;rd_BBIᛅ@a@y Hd$z=B @ @a@'ngmx`򝀏R۰hv75V7L~Oo_?17"L!zP謹PۤY0=*^3_}iS loºw/{NѴns, = E[[[Ν񫄄W^4pmsx}9)n{SS{==ߣ&iݻ W_lLQՇNKKq8MMͫV_ sΉDիz8y9sf:t8##=//60|>^ޘgʯ>b'5ioWLj,wV狓yoWpu|>@섄kYw\:n)8wNJMMY@:N .\J%|juII$pW^Y~ wmѸuÇ2lEFF^o622ycޢQRVUU}ŶK*R٥/E=0lzPU]]K/?nmS3&%)1T֫2vIw>sD6fa!=j1JDl,`("Q, Xp{F8DQRN5`tGb.1ӛnP粘fIITe5&lv(Z'NOBd 1 0./c!!=jsBĴf t.e(sIa(Mi1 9h2EQƍ??G[|t kV´콽W6&%%4jVAAAr HssX,1"(8 {rZ1 /f\Շ~W_{M6]᬴AE6l+6'˵Zɓq0--.+11p8t~rBBBp8jb6`ք녡foJ駟ڵWFM_xݞ9r#p,(P"IiAiAFuk9L7?,M;m0[],OYoݺpLTA^_\ :\^!|bzJyuwg 26flV㯹wZ{6{kOK=ݳpD063|lf8_ihՙ,NI1%BNֺ&Ef%_ ":z5ٓbMH%+}1bmb|ٱx143)xbnzkÉ o1pRXr{ļb#M}MVzHxO>ٸaW7j3g{m۶[,EL\Z:S ,YeK{{U&_/T}AOfکg;v=>Ksssxxx~~D"Y~믿P T{m6(i^_Pw`go\R.HHKUPEwDED@%PCIBBzキ]rdž#i?.ss3yfy:'MHRq8D"y%;~kjj߅Bw}h/]tIŋ]VVnݛry/Z0*j@rOb߾YY{knn&H?uŊQZ60=,QڎuͣZ꫕+W;J~">ÎMVbiT=%GO^faOwhJbIKS)>61L(8q,$UNuZao?\ _R$HL&0T^#> 2}Ԍ̦&󼼼yfyR҅?PSS9o޼ࠔ;7.L654tLr#G1 [ :r$tv-$$xI?&55 I`a 𩩩MMM6lxgVN70)15= \iw5n* 0Irzk )ji>}hXkz:` '>nbmK!H(d]ҬJo2[2sь@ܘ_HQ /=ɤ]=> da\lKRZ5Eur`pQ *lV釩P' fCPߢg6lt twb,szz:J6LsBSNղ_zFhB//O@PP@`9a:f4]]w1О{|~~~VV6Dsrr;Fc\\,N[v"UVV%$ úQ- ~>>`޽d2yÆ O?4HuC&AKsiYE`2AV F39+XV`fAD/aS{oJV؞)ڟ ;J#X A3"A@hlEq[UÅТhhU{m}} T#X,VKKJbٵY5}}*]$s߾9 ;;;oo/Tm6dd6[p8ܠԩ3/\]]NDc,..پ׸)S&S(/^půŋKAEybyKGlX J: j}CR5O6gʼ6x%N*ba cAjC(h]_?3?& A}o}} Ϟ `L=!dJDBm<6wױw6& mSO/>V+t[g ob3oΣyo,I.s ؙtLn{Ʉ}wI# sӤFEDD"]v5AR422rÆ=h"bŲ]` O7n\#zwwvlgǽ!ojj ihhO;;;~z)/j8A|/ooGF`oo?y)S&LAԩnnӦMݳg Ŝ3g$$''oT*][NjnnUVVGE ^0/t_啕}YSRiUUeggB$=`x>_4̎sWlAfq7 @MV@A)AR[nndWnӆՊ_X~ﶡ~n>ʎʺǧڎ('^ʿ=JO޷ۉʎ5ˢ=yI&[Bx9O6aB8U:vocN;w7udPo˶pCjjkwwWIIzjyggƍ`؈k :2@ ~ZvZQbmTT-Ll5Fd>Z`4^.2 ?ŊM[zz/f0 bL-mJl2YnjɂeG d2;*С# d0aAzht:|]1 :`0 uANh0î?@vp>K/tE<oWWW߿?::_~ٳghH-[_ݱfͫ}}9Fn<7Z hhKmtVrl7mڴ{FV{zz8 555K,ill4iɋ0=YPYeS xTzrN̺FEZhdoG6Kƃk̩9թFG{!}j3lJfa3â䖶^m\X[vݘ `Κ蕒!_rE٧/, )Y)9*3orrE~Y;}z@]/흛WWW'gg悂&4oߡh|r٤IYY9͛ؼyQԒýͳor .2e҆ Κ5+..dIm~s=*;"n6T^v8wڳ|2L&<?_^ Fcjjھ}b񫯮ͷ+**D"+ 7/SZƺiӦ&L6ӼӧJ$ⰰȫWӓ/H$b A?2ár*;06vgZ[[E_F~~_| IN`cǞ9sv_~qlL8{rJ%7xՌ^[oa>m ñ'p_|q کJɾ aT Aj +'\l*@3ZAä0$w;6ɎHަ O qh}*B&Uv jѡNPJT]߬]"`0/vvvVTT]vkZ//IӧO%H!! Fl6WTT&1n\hʼ~d^mo W_kkT*5//Q,3,7nL[@7 w5$x)Fpֳ˗y=.Jsss @bm訯kn:uJeg\Ǐhf8~x[윚  #YYxt7bO- 2L,>|@ <֭#lF nэq\߶ Vn E$e0BuM=">. IDATL!`BDsXNR'-im3,<:Ip@luuo쿌gb⩂""$JaM"oReI$A8 p6+Պ0z?ʤN&ƈp4l?~pZZZ‘i0%s#11bbƙ憆]$ tntG…mp85޺GSRRށD1F9߹<+j*~Cһ;٥6 .uaEmoqO$`H7ˎM5(uzŌZ/EVzUzg1E9uq"קY{VG4v N:y2ӃD"Wӽ'OR5Ej;w-Y,/}Dgee)ʽ{?_|NIOC;zł1DR(hwƾO=T*Ep5Z|Q"7H1qb EǏ_թS'h>syg RWW/nժ,j5uuV x#J F2*WhVˢf.n3Eh兏l* ;zx8|#˅dv`VgJ8WLr?'::zϞ}!!OH$ww;.^p?N8) m[}v;Ο?O"&NG78ČKHHxul6 PfO_[9r|NNNv򊈈ؾ}MBo=}ǎZDl;w ۶Xt:;..h[uR)AAק&svL&?[%W  t tW׶VWW?S<2'cIҪ6 Hzggp,DzΎ꾾>:`07bXJ S AyloBbx7uzS]kRn"] ЎM*bI AՊ4SIt<iѭsi8faQ: @&UjC@"y*z *d0A"j@{VVkkk#IFR 4,VkggXܿ)ΎH$Ln^ORfBX,]]]Z@ p\ 0mmmR B Villrrr򧧧 s~Hpuuhڮ.d2mW7"*ԔfggƼMpgvFQh4b%L&p8Z-˭V`0zz:ad2srr?Pբ;n}ZRL&6-˩Tڔ6Yo c<ݝ 1ii yTTlaa^lDO=wNuT+VW*w;7 p;q,AЅ1aN-}mSF!d>˦/p *@%n(ȶ c97w0$4%`0!HU4f+@0Ȧ HdvDo^89w"\.ƈSnE ATGG~ᇟ|{,=O$>[ft:D lζr*F[%cۂ=/tIwHv'm00nyCBFEa FKx_n  ۂ|{==^`00a_++KG9 1c}|OvZ*֦0``ݝӧA;fp8Db0a!_x L00: =$$+oH0`<V0``<ܘ漼t?̝ra`֎>E]URY]z'A!xFTO¹sW_}%>~s0LƼ[OD ɔ;fEU]^eаz D?sD22pAPXXTUUST{#&L/!!2 <heΜ9666eggrC>%Uem*E svuR,dI.NHf%%%onn\lthdquu}啕W4=`4/]T*8nXؘvvv}%39P(HKK[jmmٳY,Vttt\\_F1a8۟r|X,зɒXQeaQ}Ɓ%c56F*^|qo$,ʕ+ͭ9s&;x'|_7558pN/\p<&a9 H$M:9#ܹoz[[,ɓ cѢt0{,00JZ|yJJҥOMʇq8}Ș1S*bTdZ~3K{laG)"uM"!+WV^_ >#WWYR҅#Gh윟*۸qSrElSL"yyy7~"88uƆիWf{U*{Ν to26mԩӎvvvK,L&.3...::B09yd@ee`XlD駟FPЇqw[jjڲeOeرx̙D@UUաCG&O|ؑo݈r}}}pp}||nݦqǎ_>9sf'%y>k׮ G Lnnn+--Q=c Ǐ7 W^]p~ A@ܚb"_*JBĥ՝^k cF{DBGΝjjjFbnii544dddJ$qqG 4)~cƄx{{g]7{vF9sFWW7z|׮~ᇋ/`Xa0 m{{9sͦa$' WX~䋻vf2aӧO(M.a2..;wB{yyM6d,\8Vn(:>N_+..uR1=_Hhhh\\ĉ0 Ԣ{ΝC$vޛ íŢz4FK<==|ʢE]]yyy3gmh4VF"Hd0 ?i &L"\.A7R\nll̜9}|u:}^^DkAA_FFH$ycǎݰ/,9Rii;=0]zuT{{DvjP@ 9b1Cً`QNqE`gϣ ) f]g0y8 Ԍ|C1ӧI$$ш HT}7**?槟~gGĎ0ԩSMzzzN8ۋ dZz5gΝ{jhOvwwx"?>WR!@b""QcoL&?zXB1<p8jgOHTU3f:pׇL~ APF{J)G}Ǔx.kƙ3g'LO&ߞ{9Ecv\Ͽ455m޼eBBBFg9kT*[mm@ Jxקbco8E^4A:%՝rH`G Ԝg5X! FWnϞ=?mđ*z{:Cӧׯg0]&%%uvv͘1H!fGp0 }&);;HR1Loo/S'y4F>}fi) 8:JϣZ.../T*{=q흪$"ǥ!VЫ_H^2+ZAEa Y&sp8zƎR]iiWccc.!>Õ+Wq^GGǣGh)Sx9'L zsyyy2.23,K\\c##0JeF2SJK0a0N~ - ^aLO6 @7*ʎ _ Q T(u9 &5"PH!,e 1.%G z1Z~3DŽ9HҪ ڛz'k&zz JJ;d8/v[p :00L&;99;׿?ˀԫ ecFm~mjjBUT۶(((D  'OT*w3k,Dz~+44444tͶ#]]]O='߻whIs7.L&D"o޼dժ5Bp۶eV-{?:Wѫ(hf(c|.Tw/֥Ji ޮ܆iٍd>*1%.v+0{bvPymɋl:(EF |s||<++x%%u%ɜB1M&33s?:_{mM~~ѣ ,((<{܇_WWۇAݗI ܈D?裑ִKVpK̓"cP(p"Phт o񺣣#ȑKL A,4=^-AynѢRںTvl*&ˠ{㟇::JN>A$|ޟ^qqqaqp"(?h4ԴYY9FQ3Lya//OoozRp8  &\'%%k`0xL&JG~,s6}{~ټ IDAT'6 [UUh,**|4\ۂkΝ}իW|yѱয়$$z*|Ǝ\5GG';;ZCL}d!QOvrL]V%htFrƍqQק1L 3sKZZ㽱Yƍw[?Lrrr*--3&/E f̘~pB^^~ooo{{z|Ǐ=x< 6viw"<o6BblFʕ+yyy۷oJ˗/H${%%%c!BBo)>:gܸhҲ/OX577YΎN^' ;;;LFx`QTQTɗ,qW<\x##O֋VFɒ[Ғq5юM0] J`VkMM-] fY,vrENaVfH$DH*Jgg :Cihp7aX,Uuu:J::J]h4^3&t;vAI9:qb} PPPtJeZ u )#6څa oٶmٳgpeo" ]&$ )A]ՙd )Fw&)ڎCkhU 0g. Hkg_z^\eHcCElUu_+hNbNâuRrJG8ny4SiOH۱)iugJ[wgDq !)n)(oa\S+ r] 40 {x555֡cOoo "y˟6 -?D"M29 +G744vtj Ǫx<ɓ<==*h4...*3o6D"Ѽy(J~~U/_^QQQSStRAǎcc<Q2glw堫CMtFVdɢ1c>˷zsPy{/tG1z/ܼyO?}?S߬hhU2 r[<,RzMuM]$f{xU ӧ1\Z#Wj|]=u:Y3T8zE"NqX/h K :Шĺ;!4 alLʭnnR xShǦ vt0)^2X.j䗶4Ȥ VZWW %''Źh4VVVq\szZ}n|^eCC#G #"Q+Dccc{{{NNb)))=plo4 8q^KHHDF$}}}T#<9Rݙv w]lѨ&d8qccc'NGhǏjcǎmmm=p CrywDDXCCcB1^sδc#%̙p fͲǏ<63}g9؊h1Rt֭R`zɕv۟f+¤&Hj%L]  sC sfS>6>\&ѥ"G8Gd<%8ӧ6N$A=G(x8(dr'?!LE 2^iu̺1c|Fd2v{ PTX GRݛ eNNҥOFD+PF ,go/ _zJb.^ﺹfe>x۫s۶55aaaΝ1˗,)), ?k͚5Νp;:KF/rHU8ʼn>Mjjgw؉/[scccbyd2yA ̊3&ڵ)S&۷{Pa[`0J;`48TdrSSK/=<<:<(@B?~ǀ\aWMV*bpJۻG"> h~;lJ0 ZbEV\JUWl4=q1R)vϞ-3~4$R*9o-]٣ټ@,Vdz;z\,dDCCC22577wuu|\xAl6jE*"-F|{{ BH$j47m"&&ڵ//OA>l{ٸq={x<A&D"i4[cXcT b7bߊz}NNnb)F;{́i4͑# gϞ ͖H0 d2R9/*!RѨ۷jϜ9;{_|5: $!J2jfd\ÄaT Cll, l<83ξdmB%J-VSۣ}sg16|h0|?;;{}nKGdi5 W_:mbn;ɧvy3/;p$3n\yn,q{O0 x"4gLJHR05(###--u۶&Nh0nk6m9.$njj*,7nCr!fx6mڜ7u-[)jDKK9U/j\.׭['pݪTVVN:u <);ܧGQb4̙!h4ÇΙ+Xqצjl8t&477;)ͧkWxMkq׮]۷{FN\P&D^Xbh('';)gW@( DkJ NGoےRTQFc)6C!_c+'[^d;DrCƮ`˾@8JS.\O͞}^ssKssKe.^ϟܢ;**{UNNv<#iɥ㫯R]]]]]vye !*++7lPTTu֕+WþCLD<%őyNep8}`:|prB^^ouuuxn3sҤP(\[;[sm*,,xs5G_e#IRcQkBZkW娙1LN_?cKkoߗC))^/IRFFFYD"^T4rbFU5HzC<M):mn'pDZAZ(:t%+ͪ#u&R\ D r&"Pո"kr|қ>Ku+f,zYqZ{{2왩"lZM}ӑ&]S&1n3#g:MB@0Z\.4ٕbNP9OԷI3ܖTA7uwxӔ4A"lɨ,b2v[yyyrqTpi/il‰Ӧt:'N,ﯭ5M_TPP Iݞ-[fYZmnnΔ)SdYN$Dܹs?G$WhL&Sgg6eʔ믿^Ye˖l$ B7xsڿlܸi߾ ;:OHI,?sfVu55---,KfffGGGMM]p Y555kk\rR6z1HOVVV~~~OOԩSG}movF-Fi錓`mmC`vvnWWgndjTUUI"pGGMۤƆ՞H$v|+/c4b;sál8=] =W*d[osMy q ܹcŊU_|!D4ݲec[n7/.Au%/NUUڵyߟ>#c;TU|wΜ={>Xvs҉ PP$wz?$EQ.]YVVz:g >UsJs rIfgپl[YFLT[@N1x=f˹80Vje754p8*Dz]ppg }5{Oc4Gk$UQR/%a0000000000@@@@@@@@@@ aaaaaaaaaa00000000`zkzzFetκ;f82 jnctzpʱ) @@@S_{u8 вeK9b K@IG h4px``@`0vzj6l6';444n7gR՘lJII$IUU$IZmV%|>ϗHlY5OSU5&Bi6}>_"7LB!Yֺ\.EQD z*rʲ,Hμ&) fddh4hT C8): 8W_}^wvv9)7|Ӕ)SW3fLommnC=vHϛW|GJWWڵٷd2-[v lܸpr֯^?so񆮮b}ZV;Y99+V\rUK,ٷo˝$33 8i1 \}2yǓ_VV(b),x>M{n応N$IBˊ"wwٿAQPP|r9!nW~~/p8JKgLc嗯m6pbffFIIV% C?Fɭ[Ѩ:kLxxDŽ~t #{ԄBAw$3M"H$>Adyxc$IO?rcll|{ӧOeDŽ&Lꪕhk CiZEQZmrqM^d2p8<|]$t:9%nX].rǴgϞjN>?'(++ݰ׻ÁM99B7o|J!ENs̲+3g`0$hll|}}޼={jG444VT/\|_K^l4n+;^Ͽ'0-3fHMM]%KdZ 6%qZOeee~sիꪫfӢE9Oq嗯Y?f\yb޼rΞ|BYVm{7O_}*!VݻvBHsSSݟo'M*t8N&u?'=#SLer~ׯzݺ sg$egg766twwXD"s[yybN=.m޼?b1YM&S;Hd2 OѨ$IaxS( Ò1 !h(bZl4dYbp8Xјi(D"BH^ oJ>FtCCCV5yW8N$ON344dx8D"B^v"/~?=vIDATQCPr6t:^K1nvwwΚUjesTAEB;9A`  JVW^1y+lXFݒ<&`H 3 EIbȨ& <ϙf ߨGNKь|644Nܲe̙eɌi4lJh\.gWW/ZPaf>o<̛ow8) 8AG⋛tŜNkP\<p// @caaaaaaaaa00000#3ƙX,  qKz<:.$ 'JUUYVIOdNqO\4I"ˊ(0oL&s c>UU & 2N:C`|q<%eEQa0+.W1 VۙP0$Y,ciE=ӧxs啫T5zԻz{{ΝF8<ظp ̚57u#Z`܈==GkhhP 8|Cnc;8N`|RUW^d(FzǏ3 a0>o[doo/1R}}]̈́G9tИB[]MP]{cBݻwo 3Hq,q|>aXLtEf%deeqye߶ۏ-v>,M7h4zKKMOJ$v##c?iZiaZ~;gNIpcۻ'çz=rd/]zgN3: v{`S+AQ1p?ΌC~~_V__y:Y( |g¥OjF8l)GCgg#g1Ɵ@?kYVRRǟR7HIqm?D8Ȥ8GIz{{ZZ:䧧g&M'c|&o03,+f(aB䥥e0FcNS]x6 {z! &$Ę08.P$w499y#/ _ğ! G"aFz_C<;t`m 8|>!jSSSYW! 7lIENDB`gpiv-0.6.1/doc/C/figures/gpiv-fig_console_image_info.png0000644000175000017500000035531011204235560020121 00000000000000PNG  IHDR- pHYs !dtIME8/e F IDATxwxTǹ}W]Wn`1'8NWl\jlz # VZi6sX@ygќ9FP0 s#IRgg'sfQ#($ s$)YRt~I4&P0  bFѲgroj0`0YAd|||jJEO|C/A B8NIILOKee:.] 9 "p4g$9B?0@YYY=7 {Ԯ[9hPNj.M# Ym0yٽl6gegTz}}SURR4udz._+..f4H᧞~.;;kM3i O[4eXNJ$ B(+7lXxG(bY.fww]SRR2hP( 50? =zH0IGV=ZR46Qf˲A|ڑ#O2IOin@!$A(0tnnnii)@? *< pbezRyqVp$ E؇+g};Dh2o~-A Nt=ng_| rYoa=0Ick׮OLL榕+VT Fc eMǛ))C j`w߱lqcǎ9tȐAr!D:]A~Ann.M`zGusS %5eHPV{;t†=^OՖeg$R\&cYezp|W e27?_xz駞) N+ "QDQ# 1Rh}޵,/?q?8O3̔Ӛjjva~?qQ.g2Yݾ}j },@0CotV (ڲy媪"Hzv00r(A9 yyiii6m\vlFuZ,iرFMMnwU0 oG<@xT}{||]w`uE"Դt\XTb,Ѩry@8AQDJ;fƛoG"+/?o1 R${uY~, (J(I0 J(B( jz/a0gEKS˲ BѴGPU*N+,,djix0 ~رv$ ^6(Immm))y,˚L&@ڬVkfV@#m6(794MT.REt,N.e42RqnlY#GmriM B8+EM&s]]-,,8_A$IR$IqxIv8=W>6)Un}lI(co$ "qt1ADDσ%bd IAIz $(%'ѻZr'J"BHŞn q("A $Q8> b# B8U쭭u~b9b$ SE k Bb~6(((4T~'zή_xy7ro~ ԩLa] (I'l;]1¥ GhOJNuX&V"ln+iDIIɺC?꒓IV&c6=^`id6GQw7AHl63 #b;'NtHP)++@u֖JR'#D0LlI+g0 E| n_75&ϕ_z>N7wN>Bw;~J^cϞ5%ť dggY,2 cԔb2{>kjB?]]uZ) >H,\ʘS9"g$Lo C]^īj񒃇֛۬nq;~]rUǪTh4Ų,!v~'A8~ث'^|Ūm۫[ zߟO>Һf4s„O<_z%//w]r뮭(/e˹EMMMy.{֬9ٻjv/^u ,,̟6uJbbB?s!zUÇ͸سx.++ݴiR6m! s [ }hkB_-ϛ;l6-^>Ӆrz~׮F EZZjSqӖ+>mӧUWزeۈnqƯ~sF}˜9Yjv<D~7wNAArx/ȭso)jw|{|۴Z]IGYؽvC+vۼ}+W};6m<%E+W>p  ҶλiQ#r) y׏$'$?S>l6Iw9/ZkK[bRµN4qR5ƍ))-Fv;ZӦ$j4$%%ͽeN[nC(h۫w<'mi;vB!5..;+_룅z ?tH%`۶C)'}뮝ƻx?XTX aG>pa$I3 3Ezݼ7ϛ{ uurq4s,3|SL>Y̢P(3Qa0XAz^ ?^ɢ23q۠W{w=_}~ѧ}ɢύ AT*Bm0%. ?0cƌ^pY#?Css 0&a,HMM4i @R! A AGU$eX:tXUR*|voݙ 鈏-iӦ @ f#nKKM\ Ѩnje))!3g,˙h{wݮjY .k1S|r'`jJfMOKݶno=FJIS V6s}Ul ll$%h?Flي/\iZNII-Bqq "t=`E#tzN#fHS*IIA8N@EEyJJ MipvAV;b",f3 %%%T*^o LT);;;m6f%I aXBwr$Ajurr ~fsCT۴CĊ3\AjM}Edef 8zf󰪡Z$Ĥ$G}]z1g>q `pzVWQQp||a{[`Bn7z1 杫4}𓺺7fUq[VY.۶z}.ͽ柾ӿ^yl`../jZp/ԕ4bgyOuNY3rpffF+_OcDQܺmGZv h6p`0g* y)?=fڬֳw`0K.uH4 oIHH\ & b.W r+Wv:q6a0E}}cbR)BիW !C`0˒(Nm1TV1bD8穫3nM/0 S 2 'qv9^  G! sq;ngoWRYI^bi:!)\-(:;;⬉80 JިRk )ӎ3`4|jA|"1$xޝ;kf9++SV)tk!ЉA$I+ j$R4G{Wweee RѨpP贳 qc,*??싽{o4j \>rѣFhڋDB$C>L Q<\5jhfF1Ov?3jbh9vi Po4y=.8իXyvKM-~P!$ A@IDJ X3&cëhz@7h'LsF={tw]pׅjs~liVP.<ɖ2삗;PkMh@)F%vo?:`ii `m N7VΜ9n'CHCCc ìwLp8D o49:Z},YM G"(*o{4v@0zCxʝ!E-A$$"S)MYTc[.EQ|gQYt!q lټBekzfAEv|[n9rXʲmjcY…#FaRB!A Q{oKf]=s<}^yi%u[$I5w "_\bP5𽷖74ą7B̚60?X):pt(DJ` Av$I2$ɂec@4˲ % 2a=w \6e6mQ ]=i8OY}u~D W+ @$, l,ش V[QY0J0ϲLo:RuA#uC=TQU"IRVUp8~ ")G{ Bi7[m#:n? $HLq6m[e2H~wd2:_z)b՛ 6s>|V=tPqqjnn6m\.GJ4n: mh Ým-vGsKːii)G0T($Ip$I:x࠲aЌ8"|H J%mH D݈ԡIH[f |fݞ~kJQoOj;>U;:wY0_̛aDZcbj!BTl Qp FE>S4on7E<@I% Km87va IP^s)UD'g\BN@HN&MDQB@A\^^iZ 4M@L&+))ޱC .e&$SmC*2 [Sl;$6nq(ޖXl= "%YuͱQs&H h|k ?[^L׫* Z|SyϽ񽋑 FF$@$^8 F3Aju^H JPSRSXFA,I4EQ4!^fډ  I$eeeD@Rzv%.X]$a!$ICl6e!$ /_)@4M?_9^zriib˖m*w~>8~5κ e FՔi BI5Ѩq[k˧b3;i(Іի J^r1׮[ /}^~NQRPoG N(}fύoj5$I2,CQ$Avҷ4:%q*~w7vgKJAD3IQ\$Qr8\0\̌‚|0DHfhS@p]!z@(i===t~ V\}F{ yBB~3oXbyRb@D/jK7H$% X (pgQ(w-㸇~:esEQN%I鉓(//+..`0[!n%ut @$ e 튵f!:1DEСHD45Y@ $℀(ծ"o0:$Rlሽ;"ȩ7|ѱj岔¢"FT*I$H EQ NgV+i^X}5/\˯QӟCGQB|맧5554}mBa{c#~y?vF U h([{ ]1Xg>]aKM<|lǂ`I { ?(͟ͳo?޸qsKKo~>g0IH'"Z.~]̓$E2,MM.a`hކ~i 2V6|De0GB D BxNEx{PSjrvRbI0 "Il?}lŠ)'{<*J֖Won 9 67'1P(Ȳ,B  jZ߯ժ#ٹm |ݭmmw9~ݷ9|xī<I4E̚}c^~zh4gߔ+$IN$ `Xh4e[-}3а>y"- n?G$[Zg|Vc=~Ν^ FCX Qf;,"A D r@ؙt9JP YFr:;$Fj?*I0沅"zvEI$.ʋ$bcC+EKKzt6"% *?*+:mz(!{P^d:BI(Ј@Ҁ>K$b}}E]QPz<3"b$=nRJ 6Oz; ,lVЁ}N/]d22֔փ8BH-Kno!l^r*]Gͦh4ag 0WuӦ-eeisVdef>G>pR{L;f=_+Jl-+~I =h4#Ibhep9LA(*$3M3:.\^A!XK$I(J  ES23ifh!$ )i& # &^oiZBDe\~]\4(Eh D VC䑣G=V>thϧT30A4M1b#d)4V==%>*FBB@ tԍ1;>1a=ϛ;JKJK.VdY밡 #j1UE1 xTZRP(e 1AZ}0 ~izܸ1oO"DA!$ #=k*@  Hw9$QH`MH( Sp$IrO,oO&LoY?ȑ=_++_ws@O>4x~]Cc 6r|A}–]cǎSU7|0tѶPzg=H$33cM!c;6Ouœ!MqEqPyrpEqq޺}>, ]TWK6oޚ7hii{j?pb++VNxոcT*7V9R'@Nvvnݾqf_Myy'^{3Y@Q|V{[yyU~>_7]sa ~}>Сem&+7mْ5|Xyŗ}Ӆ XR8.8!l&¬f RSR-_vw\vIQ7͜1m +Vht)gȲ˯F#G[JK~{lV9|k/XpWiI1Mӂ LponuNB>}iS'pQEyِ!In^;nuE}pt7v=wfp$I= !TVVƛoo:^PwςǎlŪܒ"AfμWfeWD"qc̙3O>ޱ_}?\Q>hPNmV^òIw'V?ñɩ.xQ[k۔)nwK[>Wz٧Ln s|+?r1qӧOu̳"$iol&Q~A?ƛMv5ӧQjK\3nW_{#4448]ӦΛ;ޱ|JA?Y:! {Ǐjniyw9u]32!k׭_`04jͳg%&&@~5߭UTgxU.#G;>e4M߮nM3}qc\.g嗋khh[SSR|U^Ś@QB(g3$hJLooٷm~oy7oٺq&k_nSCc+]];oJzcgeg~W{jA:]@^|eoc~a۶;wuwcM͞ݻkW^3wͯh'範X$c+_?K_wmݶo_.U}g?Fe>oҥ^w788nܘu-[1e^}7|pБŋ=r?{Z$!q^EAx>n Xz #V\e%l ?#Lku+Wر~onݾrjܹs=wߟ[ds[۫w?Vt:JII/󙌌~rQW߸s/\ff,xQ}}3O=y=wnݶ}׮dlqQ!˲$IMѣFU@MZ[^أH3ٮ3('qHDPt[a&=aN.XpWJJriiЪ!{6oZTTH{NΞuciiq|mǎ?:?y䱯Zzd=^Z,MͣFhjjjoo;::Vg^o-[A9rC,[xRRcv=V)=x_JJrNNvIIQGGL&)ZTnnΎ~sn-ﭷe97=>r_&9reYk3zu:nīk:*"IZ%cY[JJAwoYa?qe}{=[s3g\rRfԵoذpL8`0lܴ%55uUUC45q֮? I1w9Gg'IRqָiSǮVԱ7W^z+ @QdzZw߯:aXñeMMIba^$!I)F"Kmܸ9VOm6 nGdff],yS(ʦT*{|J2MV)6n86 $QJBP&VZuv09C?DQU*(F1棳@A[."nR/Sar+wYX^^jie%$Ui_7oٚoJLdffN6U9:;C٣7Ͽfɓ&|w vUO\x얛gLt5mq>ɲ7x싖C9BX]_=x6Lp7 ]wMJrJ(lh8bÍǎ766CS4@f:t%Ad8Q*̲ӦtZ3'7o2Mr<==Bx2( @rrҁr2dRڵ&##1|}bbBjj*6Rpa^_x**6f ƒ^~_ǎSTT0v1G4vηHKKٽyֱc(7J,um`h4Whg1\VZk7mڂDg̑#G_}p8"ӧMLzo$IRY}uͱ.( 20rcǎ'&& [;&_鰪+VZخIŅ[/YtLL,..JNNڽgiSJKuZ%K-fsIIg_2 Cd(S_߰he٬L^?hPom4BPX8bİcFOrҥ~罘󽨰 ;;묅aoݾjAF!䤤>bUՐƏ0a_,~_o"DQ5(@hΜYtFnۿbqP$ǎ# Zf̘QK^aF{!FQ-[_!v0b_u[Z(z̘Q ~y|jJʐ!CW8|^\\4|0@yY+_|URwOIIst:C= %@!WAIx.Jٲu[n^AVf(gHO3rfVVV \=g,4r4 CbbL&999E h2ժ+))9)9)>vBBVU*F1##cT$3U*V>lX^^l$'MѣGzdZ&1!^TcvRRBffF 1FIMM16[FF:1?5%b$%&*JNOW\\^3$1!h4dg,k4m6ZVU*err򰪡jJT$&&hNW^^gejd2VVVd+d\g1 2(K |͖-[|RsW] )qJno5?1`0 N4rİ>08!]s-=?x!, ·˘SchE[,{WbU\2/:MAPI]]*g\¼c@ IDAT0Vg IRT{=.A s CE@QV`0ǿ >wۛۙ$IV&y=M\]@7 yH|x \~ ao{[lwO?tipy)<`0̥EQŧR ׶&- `0ܹ C \(hO~mrr"f\FDI- e4Y"$ނJ s{5nW$_ sW$ftzc`0W0á`A3`ta0 P `0+]NJt|b* ҅iG{(]vي3`tahtj f]80 JES4A*Z1`0 @``0W0`0Z(g\^a46Y3\`& BPq `0+9;SV[]5;"5CJ?(\=Wm:~\N ܼ3tZ,ڼNfU Ϭh43nwPtFci`F;.g&'nloo۷6.@Z9>|B1om4/=-Ͼzk{G8ͮ2lPn^zFE>f wEQA43uE`wžre?pZl>g[*c6>z ^RVq>w׎mi[]TV6X973 :; hZ6mپeۮs=3y.:wW~Ĥd~XR~$z/7BzWQA캢gY]w]]˲kWEMB {{y۾?dc r%͝;̜9sO&`V[GL6]ns(Ͼx7~Nk3l>K.f  AxxMzz|>#/C߄_df7+Jڶm;6'ayzֿD"Oq>_Qy%1!&?79t摧Yҿ ˥ukV?J?M-5׆G[n74Uu::_>rTPPЀV}_y{@ ij1Nu7׭[K/M47թppinnXm^^L&џ -ϷMJyOk֬yw?hp.O?76hn1yϕ(Ϭ7;UeήZ2zѣFb$SNݵkW¿}rrrW+K1w ?o=@loJ2 C07Q[[kFQ{fNAKr>X\R٥nj% 2ͅE]]ai"?.RS!ڽg_TdĕU~SLot펎fee=ofZJb_)ڱswxxX}}X,1|/A;w2urEE Qx"3#kѢz)*,*H$RD1h1X܂E /Y,L6~XB0N;h4xz6aҥR<~XEkZ[:;;Bɓ(=ںiS'ݒnBm4FkX,T2jJ0L]]K=OHHpdXkޕ+ M&sXXX,3sƟstԨR &0LSS{HRժsמUuXX(0EE%U</-5%44O+z(^8iAjfrQSSp"##/_*5[,ƎFoxj*`NJJt%Z.<<,--h :A(䧥 VSTǏ *v&lww72$)"<,!Ij @tuuIJL+-+wq1) yh#Gab={N[QFݞ MM --%8(5&-<waa55V--5wM߯%2JӔѠgn6qAYW_۬!+N:}Iti6os:efXV˗(jegxI:=ll߱ vpVsS3M3Gs>(--za.].ݹk7 A"0s[8wb۶:0ӕ{,l9$+**l6۳͝]]4EWV^io|aM%;˥$IFhڵkOO6_̕+Wu:~&lmm A9v,ԩ3_VisqBF8]]jkgd  p4k4$Ifeb!mwtz$/^_|uZ0 MD}}LoimMCC#!32TUU8AЩEEA\txA--e624shn~~횜^\sax{$Io<fzvgexr`Xo4{pj%I2Hn~AIUkkԩG#1;F};q$vǩgewފv*N#J,X`W^ݲeKZZZ[k`&YlH$jhhtVD744~sf$Iق׮IL bgG^3bm;v&O8b0E32hYjJ<}قsγviӦٳg\ Ǜ9cZr򐦦-[+ uLTٳQsrppѣΙe2 6,m<d6O6%4$47񷿯~pN++x5WiO+(j>> E;v2y <,tj?4qBaQ)JBB%RIV_z })rYuuͬӇ Kn+U]^Qq%Xb>vm4q 8q;[[ۋJJZ@DDC+-UU`Ҥ ^45~Pti*+Y@TTdwwD,FdQ|>[ ]?755oeXhHUu_l-jĈa"d2o۾qi<}TPڪΙ}pE nvΑy'OnI#"y<^ggׇc61=OHHhll,xѽ?hӴZݷojn\47`:uduGg/W%\Niv8lJ_WTI[l9tPKKˆ zꩴ B;QQQ(MQm$IydJLq8Kq<((fԔI`J%>>9|:^x!***::bw}׷xCpmk0ؘy';::V+ACn5>#)ؘ5I <cXCC'|ޭՒ0r:QQ%lj~*亻u~8p< AjPzGިHTA9}&EQ;::8Áo7n%.vGFF`gv!H.+ʲr_?@~(lbq2t jFc+I0 \f[{A[c22 r:!!T͚9cNs ̻`1b"d4 --!!| ~7>..*2r7>D۟{,a[vukG\p80,00Ы(7nkkDWfY=1X,#EE%Pz멒^SS =.^*MKKֶs/H?`w8ALf_{ u{Ï!_#(:z")Rts8ɤVha HERأp8vrnDǏwv/PQ$|}}VAt⒋/]nni9bB$ `c2zcy]z[(Z,\n2 #_b\.ahk釽Pokanqs-?Ə pJJk,J+?Y3::;l~t)?XVLf4zgv8nۯcnxmEgϚÇ<}gF +/)x}+c8n6 d=^_lxbcci~ͿX@&Oa8@q? Pl 74oڴyHRbrN's:w H( A5Z'sή ]sX9}}}r C xѵIVWSLFQAo?~챇{b86sƴGyX(0 eh}ǪU+R&0-4Mcx;wUT^yGa ϭرQig :﷮}huLtEQ/5xiΝ?|M0 QE$"fy0k龚eC&W!(7hbxݺuMMM\.擫V)"r::~fI [l++Á&9벲lo4>>h򊊯6llm۶M6pd2}ekyy|>UR?s&3..[[n//86+Ȁghtvid2ry``=+v?)C Zխ[6NgyEuN-bMw*a?ں:0պTJϞ?Wl߱ӫ2+*l۾gkV:4[zhv\--[d(ؾswyy={MH!Cu?. yaQW>~+W/].%bڍmhl0-C0 H߲uGe{1(ްacyyEVHrLrm}ylcee|Œ {-[-[xZՆ&)--[{HӕWTn߾v⒋v jZ޵{_yyZ-!zcUUսdBCb'4ut멂 &% Eއ#G;{r͛//H?xl;vniimkk?~sqcy]N9F;qϾ$HV 8ۭii[!Z5t]V돊Mx<"#$o\tɢ?+>7c4.v޻CxO<}ŗ_ժŋFFFRSzf qe;7e$f hY ̝;ГW6ժ˗ KPQY+Za .6Vpͬ"*2b„q`xqǍaX/Yp=_n8,-uq8):)1[HQ3rrXr90RQ|J?ӧz|a?m38MB{tBpa#L5kk@8}Բr@@@P˖.޾cח_mLII0a`{n0U 򋛿ߒ;yD~AZsKF&#+[鎍Yp^ [L6a8>V|e_}0`Ǝox^n~)a:mcƌXi~n}(tDsϭP% Bs̞雤9 & ?+W"# Þ}J}Tտ2f11o) PFm9ho;vĈ t[ #.+*r<p!;v6-O?mv͡l{vn7C]mձgV\37_].W{{G```uMͮ]{׬qeѐ{옟 TF/>=`2/_*~~A,yu0$p/X 0(d<;Me>~+]޾6*K֬~PԊf5 +**;aX4p3fE vMH,^>_m_vW? Y mw{cEF;&ݿ|Q.W>$1~Ӹv#;(MSژ(_XqyYf.-4IUvi<A[9ӸQg ˤJ r;~F8A&ȑ=Ɖ R*EPRqJ$79!!>)1Q"ߨW_3Wu:J^Q(ݚpY3/ߺAH IDAT!# ""<-LJ&<G\}7MSVY =7?E1an- {]0h5 AP_˞宦vw4++`w  {&0v  )N;Mff,,,,,w`pm t/ -<( ˽.T>;£9baaaackt}=nJgqb13xeaaaa+I .jhi;EX%eddT+XXXX~?DFF}  yjnWi*ѳ/ö?;),=2x"طƍt nt.P3r ϟlfm,,,wE=s̻mzBYw} D*aX(L|)?lMm-XXXX\zB  6r2`{kkقfaaakժw} BiXMZ(xͷQS.XXXX2^zUTT `1j_E}nWjk}&|YXXXFóm7+hlHR xCddoeaaa 2@>M;o+ |YXXX.*7nwzFq9Rb6 ڼ=-e^ӴiS` D&([(/%r1z W0@&^$?9H&Vbaa`{ Ǔ|UD0tuv45B?QYYIj9~>,,,,wNk\\td>ca_^8qb ]P( /^r,&M6,ewdR_@@ ~5f wrRB*ay}+ @ WCTM0 E}]+{04E!z);߹>oXa$I$z"BLA0 >b5g0 t(I£4M4<ޟCzvaOA uO^h:fb@P/a(v'Tpϭ!:mw{[KdTX"w YQ^6|Ȼ4MM0 ujm-!SRc4 A14C۬f ]Nf!hR}z-I0G"{<͂snsy|ـAנR4$ \tsn/D1j1(+F0I>Vvb("1AVɛ< %R)*_QGx<H,(fpl2@0LMӽ!=f1;<>3A@5 }ʰAd65]wBFD!Jeٽ3dTVV~agnL޺mT*[t1;IǏ74 vu)UfA,ڬfI/)`vqm0s\A#rwWTۭf5ZBaXfaAs8.MVIEbmVNۥP\DY6E$.qkLF='(86[ӮTG,Yf(P$(m ZL6BmDbj6RA@0pQZLݚTj2 R ;ײ4ezM y',WMwom6NJelU^;ΠD"i6AP>_hYIi9y ۬D AP(6T @(EPL$MSNKr|wFÈP7u4M :.j䈹sf杤\*vi4$A*rJaQbit:|~dTH(XֆFáT(LfD.rF#  יnܴ1Y9V?vz?omtnfRRԻhڹk ,+AKSW߰k޿_f]]g=0?~ ܛ=%ѿ?Hw`O~?ي"ZY8zڨǩ761W^"IժO?riE_z[+ 9AnʕnL&ΕW9NTdd``Aˤv.3nVwtN^?wTd8 #v@$-hJvjNt1n옅 qq)h4U5.;88ȫ*(pŢC0 ?ypfbb|xX3#G p8U$Jb1A'Ookm8:**00ATVTTGҲ&IW FX,djǣV"VU[̖#GrU*{Ǚw⤿_Ss cQQ(Uʖ@0fZîV IUbDct:\ӡګk_?@\f4Nttvd}9 \b9MS[(--矍[f5@hh%AeϾ0gLpeK$''XNG v䙦h),,`44p8kkki4N2Y;~BI$j ]ODRdyEN1}bx< lݑ0̩WV)JN?md$?yp8h]tM\aXRb IL~˥*F=}HmN/ 4<.fi41sͩ)CJjmll={߶;|}JN=vBӉDK.{fS--3$8 K.ء53fL wxBScccZR[Kر3ΙT(> sRUUp⒋G oim+xiY` sp /pׯ_/ޛR_0˥e>Efyƌi$I8yz9C;:wړ:T$ef,^ 5ul0:eDppfyyE`@ >.friYGgע.^{33yDH0LxxhF$!!d6b z$ Nj:4 6LPx Ν/tG$yrdBB̛+JK.9 KQ%ssSSvuiv%5rxRR"/^ ^`L&3L]Xlql\lMMmz S?~beM-W~EGEF Bް{Ͼֶ9g}kzO"Ӧ4SZVq &s+)4ii*p9zFxB??ߢ'O|~ZjJxX(MM-|ΙeZb,[8&6@R7ntTdh :fAeeavO:|ْCCD'4ehnq<>>v\1*iiuÇ\$&M6ðNx?C3ǎY_߰`ЎN.tN:=!I;wIMK O(fdfUUznyTVę3Pˊ㸯\.3 =8-V DQdذϿ0 ü-p\ա/ZA%N:<$iiK=[|xXȂ/Q(\.׻ؔ㸿_=e EV&Zo2./Bo~JKMi:,#[kIrv[==kTJ%IAn76}+mјR;H(Isrrg̘zpf[[;妥655/_ ̜`! {^a1s>#XPJ) H 0t8ta;n_l3g֒ a޾cMj7X-(!bndN=mTV7{ EmrpV7 EQdzl->}/MQ/KBQpH$Ӊ"( 4{A -CCApL"s8qpxKasf7fV9{r鴩jA$镲Z(ЌFQjABB[P$P͞=s1ZmN˥S&O=jDB|b9y]߂VASg###Ξ=?rS)xOj:رn|tW1qmw67GGG7h>qTKKˎvpO"k{e^z塇>>TV.?v|کP(ju^㾾~O7;p9JceXHpW?zdƒ 3Z!""{bST=%K޳-_D.A|钭v|Ȉ|lϾ#!>>ehĪV|W!BNQoX "fgڴ)%>ʻyU;~dpHa7 B2ib윣ǍDFD ͷ0N׼ևM6С̬# q+/Ι3+=PقѣFbr/Zpp> CJ$b6n5"-50|x}:}bb~~|>ORU"lo^pz=((I,Qnrms wժ_h:ѱCnZjni }y11 u]v[mmdd4ɪۍ~0^hFsPƐqxr8wvߟWʟO?Ч_nz醯](x7Z5/ԔKKpgwQq㋯)TN QRO?JeJ&44d8w.M`@`YX 'Ox<^pk{ںzUWW?&={ c?~Cx"#Ϝ//T%ΐH$͹]x<ސƦ!CR ۽|`VSSӫMrs X{,o A(>ZPW?B7ezWq|C٢;gB㼛,^ʟzqbou5t8. z! TV``aa=g_׷wa2+{ɓ&_XT|,F9}ڪU+Q ](Θ1+^kV?MItttuTT?ժ{7DG?'rye-[\xOIqwrKR?@ŋأDGEvi4IIIp_d_߷o^o5jĪU+2Mǎ祧v83fL[t:v=Au{L,CtیWJ0 ﭔ(PZz TTsfrYyϭS}P$\hFuI׾BUU$$߿jdZjx~\!Qx.N9ءL}[q_~x [o9u_߁pn߱FDjY^|_(-]0|y( -/Y;f͜>ixl&"hCC# 'Nw@3e{]"V( +y^(lAQ"t^fg?Eݣ_L&d'<$H"kIssa ZZۘL&\aΜG|rssq 0leexqTYY áV.7\li͍"g**.V*U ojspt!^r??r#IMM~R<"--%Wj#;s˓5779m&C<>f``ÁL&3(0 UN쫚#ƌ {DHkA}:ݣ`2 L1Yekccmcc <4ee>ޏqS*W(I--5ǯa2=j&//t};Ԉ_e¤^|ð)a.. WKJ\]~u'Gήq/^$ pzrɓ/]O:=tHEy˻OF~lmmf͞?}kZ8ƌu_jii3.lћ>bNttt ޻o .pܼ=ys.] ɓ']twtvrꎻ!>A&mƦð~BF̺tYZ=-|ʪUş9{K &cKc'^|^KMLLhKGEL g ?KiYwk[5Ƅ{+=QK/Ԉ_E.8~&/ׯpL`]{23i4.?mN@nn~Jj+/o8}Ƞ7( @eeU||Bԩb mǮ~h4:6Yg@ 8zЦO>LII9zX"ܾu/>JMI{m'b Bf3;͙}9!Q!WCwE%bϮ^"aBoA[.?e@>|o%o]'eU ̛s"&n=8q=_~ߏ*vu''cчNq1Ot:]}C/n;c.@{w7?5jsgNZtpJnn}}n칸ŋΉ_ܾu]"=rph۷jq dh>x/1fm]A;v<s4,lbkk᧟{qӧGΚ? 0ObV\nf&twwsrr29ӃbN ko;fĈae2[ /(Hb@@b2AM- E晙Hdp@cYں:;BpݺɷS!Cn;A_f9lo/>%:zQ#+*l ECCG ŋ˴\§x#*UFDdS1Y D 2 Ek|IyHTPPXQY`ow 'Æ 65[VkWH,2ޫM|ŷ(..ju֭ 7oݾy"ftNočEI7o9;9=bOz]33aN(eVVNMmWPZZ>Gc &MrwwFΞ):IRI//eJ!ɤF`f&tttaC clfdbr^VVFA`KKֶ?FS_* D RFtRljnq]^PXWLV74ȻtLָ7,HD`yE'ARi#f4ZJ$2{uu:L(&uZϳrzZ=$(P_nmmmcc]RR`hIIAEE%5 'OϚ1jԈh477;[J{k7nnm{񓟩by" :vư]{RLk{-LM ŕ+&-_͕*0|կRȓ0?>s ٷ`QqIGG3 mH$k׬tEG((.F0\5|?˩2yfYdѲ%j*?m\QjN}b|w;#1s\ d]ni y*Vzw34sb8ޥPw)B8#pɺ]E.negw.%P钫ڻWiVU߾}GP߇fGFFLquvNEfqCf8A6^D9i]JvdVYwrfaMcǞ4xPc,ֽ.ewlAP[܍tYf t!XҜ|Kظѡ &UG)((m6ԐCXZnx0E'0~?nqHsw:6[t+To+mj㰘a#Fz4z:sXCg1#9iX\o;3>7&v\poe[[\Koj7yء>=O ۈm7;;P2OLNv\Vj67 k +]|]d2 M^wnHplY\%u+rk7Ȣ`2G]i-1ouK[:z&<ˆђ:/y$?x/nQ(gΞ MAAJ NFQqُᰘNZ]Qe`&$ rt_YJhč8.WixFg0`FNJeXLt ѥ8ϴy`f}')wС%eEEӧM Yh4W]g2vvǎ 47:::,28L  CFLdW;GˍK"0b0:`Š:򨫽 n߯jh=2 7ea@H@ I0)23>}Uz23fW<V[PP4vLhMMmWWwGP(۲-55q͚U~O9 y߈ &s挈:*ib.v E>.G.,(q"=]T555MJX{ŒOG $6٭8L]XۻJ ڢ16*2YgCH]]jETշ4vww766 RicB$4[[[斾 Ҫ QT\r` ֶ~;s܈G4ibB¥ں:͡[Դ+(JZ;=^΃rKkhc45]NU]Zc[LJ?tRm)xj?7_7{o_{z'[@OGG RKe5sPwC<#vi3"&b/}:a}>?hCVWW׼k :pPEe5 ACϝ3K,nnMMbm2]~j~c{{/{;nHdn>zԈFi=PP' v%{>}v|V 1,)qBS iKUe3[Yz/8QR&a݂@e}S |Lƭ@]S[rf~J+KA[ov?+k..nnGۼ7]XZZo~e :;;OMϸ;=bb|;8ܱeApʤIL7<>oL BUj5PPWa0d#J %8%ɞ6ӭT_ (xT sc|ɓ\n!\Stsu=}h4VVV 2<""aOmjnIy֦Vb/F\zCKIF6#~c A8C `"Z`=vX$2H,ƏkgY,fkk될@F-27wvvbXi-,,r`rNAAAf̈ȸ ðB|;eܼN5jN6bej5< 41;;~VF"=tT*mۄa æQPP@V-[P0\6 lv|~c p')L. h  Vtt** 0PPPPPP?ibz3˯[u;vxgJJJO/NAAA*l, IDAT?AVVvG{3ɛnu={=;.RRT!kim\vz(((WP*U~# 6kFsdsqB?˯]R{ի?x M2o~W纺 tn]]_W:;vy+fLNev;) >jشc瞹f̜O*=*i~ciY9@Ve^37ç\7z=YIv3}u/f91gYjmbMS`lȹ /Yq1.)(ЁǶvh!9 Aa ``p8L&v֨L&Nh4zE@@0J 3`t:M Zd{gZJHKKwttw457 ẗ :%W5j prFÌ8 E\^oh5dBRt0pr+w3ZNT8N`0J3PC`0 Au:@'oh4BYjel6APw!^O@,55t:=<;:mӣçbϬXSL& I( T*L&;NN͍M--|>Rh4l A`P*(0Lja!&S~>( NOB-j83L.0*JL&}# PP(  at38+J^ %7tB[2W7 #/( ;F:7?|g A,Cv}ԴtoooEVZRTT|*,F;&칸Ҳw]|U x{y%\v`ꚳg  7oݾ/?(䊃̈́#0hY ϛ_Ph0Ƅ^`yrKW64Hi(:qY ȹ ϛQ\] Kjkk G Vo$&]|M)^}%WSFc?&# pbmW\+u TYU:R^^ 0vL輹CvXLlǃ,^bg_YN;`FaA''NI|&9r>pqqL8>5=c_~׭Y5eJX[[۾ =jܹ͓n&?rƌZƍgٽP[[s^Rx @qe yٲ%n%% 1ce.%55.W^XXTǛCB*1#bN,9T(RRXTT|$Xb͞=s,KVTTM4PPX1mjeeUdrɓLy5kƦ͟+++-,pVϸqc_Ouqv|c2_jZ[z $ o//Z(eeAi#$؈ògSJruuٱMXRRRSS/,| }wkjJJȘB_~juZeKؿg}/jVVΊK5f{g98ؓ}ɖ)rTaXkK+VVdٿw׹sqֶw Sgz`ͪ;g]n>(/o<|u׎-_~1/ uv8҆۷XYh1U&NoΩ>BN06ЁC4m} RiZZ8JO}ݸcignڹc y B,3ljnrzò#bO%/ZXTLrT8nlo =2)SbN0[ӏe2YZz|܅!wmt:=bZoZc }8;m뺵M#< ~m[ʼnIҲ{wo߶ KWN&9ٳ9uÿG~džٽ6^pQRwuu_L9cFAt1O޹u횕i󨶶vJ`aؽ{n"ܹ/^t*\:q8rY"p9FtkڴN\.h4Šqh`hJ\.dvwwICbx;;TN؄Ƈj()-WUUi5ڬlۍ5F57SUcDŽr81cF90'cz}qI\yzzڜ<z}QqqAaѐ@2Yg܅xZd")'`i)a޽̒Ҳ4 ;dC,,,HPXXtf7-8CD0K5: r&5A;X]S8 f0u& aiE4J4JQyk׮]]]2 77 EQJ&A"flD8>9!%Ud2(X)'\ii#F}$@PAg(qׯE@ (N0~nRnoo'(jee9{֌>Bp .wd~~>4M`(2`3nj-ss/^zZHs&Ip{t: zѝ!+]v5"H &| b0QeٳfN%@D^~@wuqhl6{r˗ytuvXD4Rb4Oƞ^p>iAnEuM-A8˼\ǘ KKny\.BLkj5y y{{ш ny1 s9bx$i>ϧħ<; +)gLR-'NohPk4vzb(A:;dNZ<GG?_Ht!>)36&t4˝5kAwfj~5D"w/s@n.Æ(Uk,E(!'CR{Θ>󑉇M1t.KJ"OB$#81sF/ Ǵt77!AϜ/4Ri0i[r騅[ppdܼ|7Wys#;;**nbSdoB,y1SF4:b0s)8nLMM'BіWTttjjjG 1TWl۾A'"b1h4JlX,.**V5֭&8?p3nq3gN9b3& =*6ƍ/757 pݭAA7z쥗_VRRf)BWmMݖ; ۛlhƍw{9NGF#†W 0n܈~gcZ2'rfzښa?1VVv+t:EbX,!x5׭>e⨣Gc^{m>on$~eKSSͼ9?'cbN߷֮Y}Ǯ6bccdq@:e򉓧.^$HDb#8887.B=8#JM(Nq#G!/^x/ 2dH`p|>?3B4b7W;wR @:uZ(^z }ֆ`\L4~X\!C=16ǟ~ihVTVS^X;9lҜYu /܈^iS_xbM<)(0khhxwP?n,>arD??_RE}zFFaXr91pz VV:Y,IXh4ZX,6A7"F bQzO4K+iC /7/ AGzV@ g6YrDz%M_& PHOammM?Bj}{[RNz/@@cScJJObb=8Ɣ,g0P53uSU @UU5t]\/& @+8l6Gpi?rRPQ,,_|jrS&?AV)igyxG-]W$2ڹl|`/Ui;v,^p/_H<(0 h`ߴax40|g'?ffWXjU)(զ* 0H1(}g(@ou'%ib?D/.'t33"#g.?칸/-55۷Tm ș'gXN9Qk.?$(NJɓY͉6ib?_Pxie͚NRiO?VW_fDL D-8a|Vvիͪkjwت֨=P^QfgϜ>yJi\|Ĥvz?־t+Λv?𭕕eVvZKG ϛ{?+ۈa'MX0@C((SXXqo@pi挈ѣ^{ 8(wߦ.~HTYYuFFOJu$:Ƨw u(?u,r2lb21 ss^~q{c{OF#6}ڴef־ 벳s|UwN<$T??_:~̹i< __z#%5Nmm:㍢a!T\TWW$IjZ)|Ų%>>G~_~9''򕫃mmW^>,Ìq_}iwa**&䰡6\ZZNvg]hmcMqX}{vc1'@\ AO6{TTTwtt'ӗdZ6 ԴO ?e}sP(O:=qIo߹x鲣)lu쯮1BgÀ457 ̈́Cr܈i(*U*\1vL(ϛZ6''X)=jb q0>7&tFAqU՝]]&馏*g)++rttSç~&5Y</88ᴵFw.''@_[[[%~~>ܼ1GcJN6-:d-^f…x<¢sL<{srNF_]]#ufgΞAT'2׬^qT*V'Ϛ9='76=ic+zz\csWNgz+$㘡'QF::954HOŞr8L&h4UTS*äHP LA?,-9ykR 8" IDAT6ǽT*nZJ,fnn|y-)-]0."h4FD"uʊJLQwvubX,ׇwq#ITeN  =jE /Z #0@~OTd)Ĥ[Gp1ATfjHH}gذF ª@VV`[ۅ {/_tW^W*yMM@r$ZXTNz?| GI$EQ ,rwwE`tC&kO(jDZ2(nietRLIIp8\Ԉ?hZ?&tE3gP(\hkopǏMH|/a!!'Ož;6ͅ tsu>7_ZZJ@ﺺh W^y*q#Fڵw}>Gz!;x99gΞcXsD(W,_zĩW0,fEՊ?ń d2|O)fՊ\tOLV?hZ;7@b]-b =vx\\Kk׮ںu$5qx__guǎxy{z8;z/F{zcS׭iѢfN'cr9bh -=NJNNpa՚~?OPxBh6Ejk.XPUϢRJ%A|>fjhqKӓDFwqg2<EQNPN cQ.LS]]]ZAGjmm<*'p*0Ar\bHEwR *R5 rZy\. A úzFt: ֶ6KIO/XqJvnS0  bA49}(FFqP{%@/}X,}XOsgaXaQk79 0 ~ _{?1vUd=(` (/Z!s AP?ަJ03RT7Uq+H$ꗲ*sOss?,XL?IEс/DE"{xYJ$Y9փ( sEaF{-EQ 5PUU}\{|>oSMRT["ᆭʓ96 AF()LK  0 t:SLA 28N0DUq\i880BD@d4t:vOd@`TPk4`42o0`0(AaBQ_Fє%q'նIE\3^oah4@?.d0܈C(<0d4qxSjA 'TF0#Az '`Q ui!aAi'o'NBn&LM55/] ^pgŋO#G] sC{{yQSN{/0{֌9Y,ԈY/q>cDŽ(jTN7b0J+K^}pNjF]D:VسMMv7o%رɡۯ0j7N:-u:;;FA?3Jl|0,+; YYZVTTnٺV,-Z0vlɼ_LWϜww? 9#d\x[. \j+_wtt(**||׭]y?+hLyyX,Z0z}geC455z"TLR[W7szDbQ_pU!qq.wuu zN]x$:F&9;9.^5|xk˖NګW};;g133y}C._tIeC47'iUSSKvN}1e(L<C7}aZZFccc]?}TᅵO0aM= >{sgN.))MKK_v{/Lv*Z[Ν0i#7ٳw``C˖.ycaÆF~9{n_pn$$T~6._uvv:|p߷_~ivB[:ƍ/>lffvp)|4ؒҲ3 QF$')--N1 cCGD>~Ȇ֙$fB E 6::,Ǖuv}[++H Z}dsMϽaq|} N`E-Ncƌvwwc2Ǝi#9r@_8*-.v565\t`2g1==܇7r ee R!wO Ǎ  DyÇ'޾ \ΐ!AgѢffBKKI3yHKϷT(/&1졂b]&4zHw7(j>`^8^]]?T(fΘpIIFMtoC**+.\!yy{t&P/ga=ҪP_x9~@ZzaC<@ZC"g1 #w6f$> 仁"("V[[̟KƤhoGL",FAd'){Tas6Adz=ћ2 d6P d )mDa2dӀO^p9|NJJ?z5J7h(1LFSQYR]!PR\R:h%Bw7!CSRM{gY.'!' nҖo)-uw~  4B ABĈwk _+myٹٹ}v7劳gx!5N}W\`H;ٍ{B_ST:}vC(WWW-;8enm|&rssH$9bk̚9㉜bx*贶`R04!#W(R]SciP =apN(6^^l~[o1~s)UUԴ|k'd3g*XGZZZZ=<__O~vuq>=ʫ?gBE K32.3͍d25|-;`,^`„q$I*m޼<*<{bh4sF~5WM?}g.H$MXLfl̘SaSiiٜy =lNfk66²$2io;s?xuYq6n|߳/ZY999VVV}ݏ?ݡ.fL1GZcFkKvlL;vܘzPAOrgΆmm/yvyŞ=WVU[ k_^lι~C$qZԕ+x\.b='d]rO@גhamggWaa+k]wtt!Wkj벲7zV&JH}ϋ?|$p}7`mmݯ<*jۯp1caǎؽw]QQIN9kc#/1bXKkkII_}nog{5+Rb0?zco\fog+ 66aC/\t%eڰĉSÇO':l97/h0ض`$ߗ<"I([?_{ghmRtݻC&RΝ e!/PRL''G #;rĈ e  yL&ۓJ(UJDd2BC0t,Kpܬk95"~Lyq3wL&٩5s:@`2gͨDQ˳VPTU>A 7n^d>0HFy6Ld2ƍT*%y@iRR͡R)rvm^JL.TP) WssƎ  ̡~g{g0xX]]]g%(~ܸ!bh8Ը@D&ݓ㍘FL[FњSD8El.:]sssEEeMmPhqqр{:q8{rVM&@F#G;:}}|RS[bkk3\T\RzP|wwO<--٘֓`٢(j~F#H$  @$***GfC 4iq3wϞ}Q* lǍp%Lv|ZZZ<ϛ5+W:=v(>LX{N>3斞^\~.%jS R ֽvܸ~&*ʺ6CGd2TTTP(/fd:;98@\EE۹Tgg</$bY3bcg4vtpDW^S(yy2قnam;gvppЩgJF kV ݻT e¸)oܼolK6BC MM.ʪ{~g 3(M0.""`P(# \:,b董cX?L&SMM;}`2FXtC?Sdkc3-&9,Ypom|EѠ!Cv!"Hqx:a#njnpw9z|%ސ_x )pO;dkc`rϥ$**Rp_#'O;7vrTN>C\]sh4ɩivE*AUԠ(KtW_DMk^~mΜYƏdy}<8x\g^^` 1|X3#Ҩ#`}B+8ܽN-,hؓVwwH$frCOo/Lxd27gVm34Zuu Ŕ%x<_wuuib9K"hoog[ZۥR0 All {]VUeʮ.FCR>@0MbHo]ocۜ(r}-NN;ai4F{  89;#<VIǍ%"ւ e5ɉDb_}oN}Glz "`~@75H#+@P_@ `Emmm(JR`C "p ںe3@cxG+9ݻ /] ؿ`jVv:獬k9brى'J?F$77ïvH9WzƦ |gNVyyE 'D"nhltuu~#drWWoޠzj.UnnV_pҎ IDATlrwOP7;Tc!Z?s1z{{3qWWH$xxw??_"Ѩ* S*<74?q2<,tlݦi`(.^`EcFp1SFDgeܺUDg}!r<=≓;lmmܰWmOGGgK$Od255v-++ _yyupp`Z>vj.f~ɇƍ=)Z.2r.cK$J_~ݑIRύ2D"-\_$KFxQV޻nX9P(L&   ( %yT*C(J$7,LrxZb"d2MF'G rbH$Jn H4 AavśSuG~ ( HD@q8sɹQ]]7bw4tCuz}aa@,;;ں;VVAS55NN}(5 *Kldv )igwx '1ښ@Iǟ:}\1߮Ö$ݽ{ͼ3b0Z-j.1@ 9[F">6.%$=z^Yl֔ 3Sx]P߬sO~&dʽ{pp`OoX@̮T(rU+|D*ݸ+O6<˵*/SssG||->w?5i)$95M"Iqc e᭢lƢ;#t O'6[نuacN!`t Ghlm|)ƌ7ێm[vv_Zñ4A:aXooOFc4˫p8H J%Rgeee`X7>7NGGdX ͎TH$Y400`N,RI.{U"bbØ1}>0{D&Sx~jz|:שg;::aÂ@ .5ǰo@(TMаА~۵?gJ\XrJbԨ<2lybj칔K/4F.W0LGQ kjj2a!fC s {;[Owtt~Aᨑ#Z큃'O!f͈=k]99% :c-6?o߱Ν=UUծ.oo7Ohii w FߓmW[[粥}x<\*Nl2s؉e2ٰ___q8ܯvطۊkjGI䔴Stw|aPT'N:qF=jҥ|X,_ \\WǻΝ={]!SD-ZcQiGGǶr\ˆ  -!3J%@ICFxg'gHHرbFwwݷg :a#(]b1]=LpL9~m3PJ&lVINNΉ}hbcǎ~swuu'&h4$˳_ 3T*H4'lERXE ~/~f2L\Υ~7hWO9;9me;Lp8`~^_Xx+9%My<Xha④ =**vE4۶ODe<?oޜWf!8 &@ 1jEWW7EQ*bŵpqܹc0Yl1yN̞=L7`0>%9i\ Iv;aX77WZb1zmB^/llCllb@ pyVXT0kL&c0$">xyyX>lBׂF5sF{G0|>} H$hvvvS(J L(`u6BA8==pVfWy`G{N3fj 6M |}L&d 3bXVN``@_ B1KF NH$g'Gg'{ Bcz3=@@  4e@TaB[R@ 1j-ؿd2eSX9:+[뫖k(n؞~9cz̺^-_zށ@ 1=F 1oN,ͪ9p0v"8qȉ@ *k C9((03rOOOܹ)QsTԤsɩ",ϖzݍ%emmm}y{{oݲ镵KK?YL&x7j fTԽQFXXX=W$E h4wwj99mmmr5J$Z@ p(6C<>\հ l2yp8H(ܷ(Xh4\]@ ö,Y|(ڥFw fAww7/OϬzzz ŒcyL&ȸdiiI:U\.  ËEC}6n|{Ǯ]v599 39%F<Rr{}]{vΙso׾zښZG燿u(I z{E5$Qoٺvy%5v{{Aϧ_sF>|7˶!Cr cpp`xX(Bٽwo/N7|Pf2nݸ 44$,4Ɯy 1AM&SCCcֵN{{Ӧ䪪*RW@[Leogg2[2/]y{{VUլXd=uu_}#G (]~9J5j: 9@wwϹ䔞^7W҃ 7,2igkkgg{kײa@`A*6z//3]]\3xxٵ{O۝</.n@@&d2]{[\]]g85ݻohl LuVW׌3:955"bh䤉zsyy!!._ l2rEIi寬jsbg<Ͼ*v,iS9NhH-mZ(vss=~u-;2r9ɑF4۷+&GEF@>] jbY۷<L&x[[ѤR*==_]cSV>ޞX&nXT*EaF777O t@kK[Zڅ~ IΘ> 9n p1Œ#ϜEd4ϗXZZr\A|Fj^oc#DQ͕BxxՕ@ d t #^>~v---|~!#\FY CXLiɱ͗<W655999vttp8La/~7BBt~|/(z$|-YpXP<R&cɹsV5LMM]ntŋl^}!}JC"PyMMjڜ`0{?ʌ`9彷ϺWN> ޞfŵ6^e6?_o᪪y<.HecǓCo.p,Bkoni5@CccqI?US$'** ZssIcF<{.Eq8.=yzVUV:}U.WTWnSy<>xwn~D"HD"yF Ë'WTxŽcX*pkJoFf|_hWdq81S^^={.uZL *ꏁ{ww7"7v9D p.]Q(n~CTjյk9T*eZTZݷx(0~>&&:#LI+ ǍNII|%͕kp8Ǝt ll#G 7G( uZl<t -n:NkYl(k7q///~FP3͜1߷_{yQ؇3BC̣7C3P0~֛NN}+ =zdPx-; EQ*2'vؙXʗ׬2:Lѱ J)j@,=, $A @£륒@ϟ˷2%J+[@pА!n) U@  @c@ t ONP_dҧx*OmܵDҩ'{~S[YRRD'wvyŭb\!\j*>s*2yd?aߏ~ѧYhom▞~QL +}'!B.5ݺUdkkk6zxx\H1+Eo0d^9l~#L&=D*o@?IYm៣v;ZRRj}?Hϟ# _ZO?;f4Dº 'GEjO>"7/߂f1^)Q %jʴȉ%B0L%lg??c']fe'm;~ܸu\|5ȱV.U#G .fܵG"xx-[8(0`׬:n)-Ѩm G\Ҩ5_]2bqwwO}CcJN[U]cmmohWN8G |V{m IDAT#F(K[qI)Y|ÈDb gddiӦΛf>򛪪*ggJ=eJTnn^ccӤnn((oVW2Y'(0a>hzx`A p8}?SF%Bw~)-]\\ 0&)/}k^ʺr^+**33/-\0HB3@"&Y 9`ٷnݾfG.^h&I$ݱ-֖~u-;0?#9ld27\|dxh޽1D*YҪsgbv@iYլ˗J:2$x۶ꚬիV&dXk4ݎ$ZҊK--Nd2wTהWTvvh%rdoa^ -;}%6m/lt O 3Ot\.WTnx{s8/_x9ׯ755wc.3U?L{{Ng03gL#HU ._ MX (i&/8okoo7|XDyE%`|>7nsɑ<(ʸqcܽnjCP&MhnnDWfYXаuA] %,,d̛KR,^KPsrzzE-b@e2L&KPn]p>A /.ۏ@*96E%=y8Vܾȏ<R{xDFSWWv NNĮh2"WN"Nj( _Yҥ+ucnjT >EE%!!2KeV[ő&8TUU9 nnJ W7wN?t8jOɤKKKV{#E\2:,bhh1GL[E e=rVI$bHfqvrZjX$6d08_lX[ @ؽkNGFN h4lK6D"/Zm2LfBEM?~ׯ S&Gzr1,-&ʊp#G sssQ(DΠc˗-Px ;{y JnO1aRI |Ol֬8WKRA,civ+hTcg&cv09jǨZL t Od6^E2B~$V""|~_/ ǽ}!`~/ؚ0 CVl6˜3LvtpL ?D''G@ z8vO?t:#Ph->PW}Khm}&̘b\nog `l6K`ii9X&:' N[3}<>@$>H"YZ(Ɣ@c<g8n¸E }@ @@  @c@ t O^/JΧ%c5Ujz` R+oxuOmO``"ov-iؼ!.W}R|LOB5qุ8Hեn0鷾m^^mmw,-ُ2whҿTJj< Ot:!cx(-RV|dM\ϲ~FD8+*x@ cs\]xɖ-[?[]kP$plFINNmllyxqC opw7(d# 3.xzF`oWYQԌI-\8`0ޖdL&3<,t[ϗbOux<AJ]RZϗ@ RF(2$FzX"x<^XXd2ݖJevvax|( (=^}+ʴvWwhV?͝;`tI'/Zr4b{H:P(jjkg͚x`PhRJKo5j27jBttt=B$ CyEeGG,,&F ڽwGGGgLZSS;{S(ʪj|iVJJdrYi/47!(**DglmslJѨťFqw={.Y*YAXjuF.[YY5s4w?Ν;ۂFZtPqlGׯS&IPjˀAQ\QQqOOςyC 1%`v  o7/]]vFR4m„>}'!֬^R22/[XX 8trذQ===GrrtNb2Naӌ1AA6bx+Ljllr ogݫCÕ*%OC͚9C$=~"7/1dHWio xϝK3Lxxϛb1fe;vb왅:ݼys|޵'N1B.W,\0_ \ιp1sJ$kq666m߱k̘Q :FN0ӣo Oz`UT|hyh}CoD"`*]V8z`̸?Π;9;:XYYua'G%yOƌettv*JIwVUUuJVyEl6 `0u:@PTϞ[?`0uێꬬ쒒ҠFA@oHI;gWvwƦD[Ww [:X7&1$8(5-].z|sqcUU]RPPxߑX*}[" cx/e0+ovP?_~/O<O[͛{`7d)+<==)-h4hLH-88B&ߋbHѓ'&%L<|a1C2j)~;-CwڭR=j$f1b?l"HӧDŽ ,_>~x*aX~G7N:s [a//ϨIO:s.y"_sψ]g:zWF@Iq`hԃwmbB|QiqFGG W־taeO ݶ&6R*zn^H$0HJVX-O3&5-wttX[ `@ p(鉿j{;^K^b3L&EDVV C 1@*'G>@x!\@ cx;wZk L:pop`0DB^uAн~>~w|zs<<|->8¹S.n^>ewK+Cݷ EFF,\8d4I8bΜ1-Dx'ʘ#Ǝf2F%O>z_3wdwL҄cFH1G3NϘ5oϮm  w굚ڙ3%vTR1#F$] ;:;?""6fӨT;[^YyyWKp_}&~(8[{F`=߁H 566T*uX/Q튤!A&(x^CDw"p |{rY,+h"͓f%9;9O2Y ))ATy۶ﬨT*ZV<`8CzBt/JF(iT N3LhWi6:l6 R^ p>mcj3t:Di{&< puuoͽeac<<}vvs&l&jP&h$S(*QԌ^Ri b4& Vl2ᬪQAu7衉 cE-CG؈}%HΝT*sr( c|#'7.߬CBgrdR}CŻdT*D"{{tvҕ1cƌλyEs9iS̘>ӳ0D"ijjN0bDbsSZ(ʆoo/Ͽ&E AWW7wϦƆF.ȿP_$P(Z U?hF#LvsuQYk4jL&;eFh4d2gW2(p֨5z5E"Lwp4;J@ vfFhQqIFfJsNNބqӏ@ Z[ۘf[9mqĨ$2L&m8‚M u3M2Y|[+J?PTfVS_?WRݹSl0kB=5juYVc6*˃C‡&j5eJK~罺1 Zbhȫl,Yh0t**vrܵkViZd2;ϙ4idl3Zp %88񓕕UAA,_TV8&Švjmm=wl 9#u:`2VZ Hq,zM 4Ueeo߳)6G3tZEF'v/PhHv:l647::pxhumR 7L: DWD^o6ܜkxl2:,s o9bTL&1}*4:XL&zp8ꡱV*J}d_ 3uxxXxxd2̇q\sxd1#Q(>{I @U4QFNLXQ9L4 IDATj9cQN tEwr9ׯ^Xd=;5 ݒKyP(+@`IX/>䟸_AN;!ҪEr A#F˴Gi0t yH8b0<ןƼ9h(t /?-ň^yCCCCP < t YW\ yF+tt /={'A^uFl&jrn)΃@sĉ)^qn߾V`Ԩ".jyP;kzYI4&Sg 1ݻn>SԴO.S_pyB\h0N:SUU 7?~̬lh t ]ܻWv{JFs` L.? X,: ?ooJ;Lh+h!p-o@|g)1lXqK Dbll{=<ܟZy޼yٳgϟ?7oܵkWKKСCWXI ܹn˖-Vضm[UUUllҥKl6?{nxx%KO!/lmA [UUaÆK.;v p 6>|ޞf7lP[[{A$J6lH$TE|1 =Kyz v_#GƎ=k4n;<^;maxEVO;r8.i]%5e7JK$x<~Ic1A{K ΰ(1I㓒\tEIcG=QW_j27Wׯ6P(ۅ\]NTZz+F#) Nsp[_g {axyyLM)--eXƍ[n7|TYYi4'O, Rihhr 혂A*WVkۀ@^uǐw۫l6#R]Ք:e~PQQgΘvqd29,,@ )xEM&3L8.qXWƎ&ɑ[nEF#u=t{+05H$Vcx<p`((jIQ5LؕɄ)A^\\=&-@AcP]]#aFDt)Q)l$H^pQ/lXV)}x4Bjj"㱃tN& NwttT*&Ԅ cCrfd2@d666666D&Hx yqwMMv3A@c CfÌӄBd1vvkVx]_?իV̞)v466;wURXL<Pnj-IX!!A9yAAndXǦK#cݺ(}}Kvtpǎ ?ާkrq0={Lj\.`0j+_>|Jd %K;}B?>tWr8\{eA3t y7oP(={a R@$qt:lh47WWiYd_wwǰj22l0 wMPbcc{Z@xSX ߿G"J/ߋmlht ɧ ;:Ǝ5eYȚD"HMA++|ؐFFCB t ˀZ^T*T"vxűFDT 5ªlt /SL  ǾRʄ=@tYA^=`2/?Ѽ*kh5.Ǫg = c5f5eq!c$8- <E\.ܠ3C;l6Ͱ < TPPvؾ R`xŠ///7V/c@ ȬY~'hsꪪ[ac@  \=\A V/%:'O?}WX8eE(wƦfe9zU@,|G?EC޽-n-{MM\N}bF1pOsמg/wK*>6Ksn x{#:e_۲{>h^\6瓊*lm/UTTQ4"2>z.NS@0{>@.͛7 ɓ'B;wIII7onlltqqoAbb{}||}zB!-Wr 6vhhpEEVPK}CCzᛷnP\R:f׿)ʸtk /xc钠T*#"—,^d2~sGO]U]-v|F{{kn "vff4hЄ!ʰx7kj(+ v̹#vCAARZPBQ4..vݛk?qBoRKwdMD"i=YGVZ5E%ѣfsH$(jOF{N:=kfWz\RTד䎎L^RiZ@SS;FJp8\猠h$IoXOsAؘ蛷nz{UL:dx{y444Ǝ/(8 4QN!>Ύ9{儇DF- d0bcdOrV c]}}g{{vv:U$`6yD"144FM8ͶBQݭeܸ$ ikDHivN3w¥8ܜ3ް!CEGE _eg5ͭySh4*NNzfpXG"XP鞈f|wp-`ck0N:SznWUUo!Av83;?P՚f2.^z\0&Q׋H礉㝝::DvUk4Ola]55zl6u:顪V;ȤY3gP)vvmqI,V֓zZ\lD"nX'E"Q[[{NN`صkOsŹy7fsdd8BIN3kАpFnTT$}[_[oT*LӉ'RѣG L̔JgϞp8666ťJ+W>HHHؽ{T*UTX #׭۠|}h47Dp!iY x\lvi}t3x_c59ޢXsrlݎF$R ~~m<,o[f[coo?bDbvݻR(ؘА̬Ʀ2h4ޯst4<y5jMdd-%lǒHD^{O8Pzj'?)D[o/|m>Vl6~IIIMMM555s]lܹs̈́ ~{:::^f#2so6##/]p |Ǐr .tss,\pӦMǏ={o5Ԫ[ZQ#/Z/SeEysSۚkW~plFQ( (2Fpƌ۽sCpFB.AT&@ a0:NRLf:-Ćz#FJR l9dRk4:A:,FIT FDxNS*f%I(R2,K8VzAp4Bt EAffVAaѦGRtĤN++ju&Nd2:zNc2z!bL"o+W9kt/OOEi4*F(J2d0x|:D"DFVkPL"h4@4*H$<'2T*1.JbmO,' -Sk fpH FBI$ 6YD&f\.tdH$'˵Zm>Ν; n^ HT7 0m̬lQkwlnFIK ԔO?޴~zWW/xϿשׂS1LFBS*.*5/[JbhT&X@"I$"@ <*hx3 g!=~ WbzOٝ+ 2I$Rzcc#˥RihHP)+`2ؾUg5Ճ4kSb|Yx\.bG:lg{e !7mccsֿ_a CIAPQX_}nӃV֐t _}|OeUq A&l[1@h4a+St#^̗,~ʊ%CiO LlH:~t##T FV1@ }P[u4",":spמT*(b1@ }`2ϝ; ܹ?CDt A&6͐=P tS@;@y.=ϨgRYYuĩ'(ݫ/]]1y/Ӭ1aw_Ϣh2J;;C.^\]]a /8n]"o: DfՐ!$"qxⰾr嵵urbbL4@{Gpuqq**t|)Sttt?v8?()) ]t)&) %K`r_~qㆷEz~t钫… F>xl9ЗhnnvttP!a9;w: \ &ШP(||IQQѣY2,55d2}ZJRզI$>L&8p@,(Z[[8pi&>tpp`tt `qԙ;vp_~clfgڟzʕkd2^Y9AE5O>g0%:ey7o1Ӧ52}).^BdxⰅ S)ʪ߷l ~%NwekEEA4qɖeM&ݻU^QrҐ`[ݺvŪqɓ'LDNN;wW88ϝ3ip߷/ӌw[_'[M"ܹsfX~igg'F|p꫶66_)))}Qdd㯿ZVVڷc2^D2à%t />FӦNdrܱL&[zEPPЅ>ҥwԲc~1۶d0)곲:::=gEeel=w5 }am+qx..ΕU%,pfO?ϥWrsscZ_RS<]F Xz{>쫐l6ٛrח, Mr;t]S~T IDATزR)*H0ɣv@ PT|ujjj<u?-IMuUoZ'1ab#" ˆþӦP(b1UJӧOɽi0$R)nښstpR"il+bkW,++_Wo4;;eb\^^Qwz`wGC@ M&588=D"EFDXfM(<Ϝ9/pr8?vL\srq|Ef3& B ,3L&}D f30X"GQK4 X"5!N'pu D~D"ApD%VŚ*Ϸs{9a¸✼9o]l6c8<5nTQ)w Wrd2NѨX$8QiAx1Mv h|EQ6ۊploϟ1cZt: 1.*dfΘ6xDg0ZYHᐘ(7WB\N>ml#Î?$>ޞmFb]]\j5FE: p999}x2˗/=d2 €\]]J%trr r9Nd2d2E6m$J)#iS&L颢"-S* 1 4{'ñ^DzU |cK$Td2Ź{ d|z< AƏ)d2 nn,w77˶ebt[#DEE`mBvuBHHȣT"BK"YI, n/suusST#k֮/XL"Iȓqws;b!{ @Tk0衉c@^t:T"vx*Naa%3 y'끎˄{c3CLTTTTTԓ 3VNec@24*Y޸MFe@;7--ޚ\./hjn~$- /BƖ> G{sf͜"[ҥt:kFT'Oö8 3J]UY,_W'vX% ;;&L}ҚZ^^?c l ]XR//ӧc #*}N:`0ٓ8e>eD"8l](}`/J2d2?q_JH,0xݥֽaNNk7 W\ǟnoiiONszΥWLb>!A/]iK/߿{=7DfTR]5;vbQw]]Z[TI݅o>rLV?ܹ y7os6m (`aYaFFFrrѣbqgg7kHe˖=99F]xqŊ[lioogXV?lmm߿hѢm۶ XA`tvܹv];UVU\sҕU+ݽe]X</EQ HL4i󧬭&I!\~嫫W.߻{{cS󎝻*^Y1H9"?q=;vini޻{U+.^|ڍo ߽s[K9zxЀ~L&sյ{\7^[0ñ  BqѣGzx;8c5=8SrVmnnillz+V\\"KJս{e.ljjh/^{HړmeUV^BaQQサ!44O3k洡C÷fg_P mmBgDLéyӵ4 bj8r111ǏWT]o˞={Z-rR|F#HΝS*999l6f#v JO x< ...++KRjZXA`uMk] z`={ ""q۶ARϞ5`_9Vuz}|\\9B^^׮(**~kKbdDDccm;Zu2ui F#ˍ_XXH}};RqƑ#;v~Lnjn}^vvtIcܺo7..=XNwc1 Ud2_2}ڔ%:u7|;Fgg縸..))&111;;… jzĉl6Í7.--ƍfȑvvv̚5k텅ZvРAy~ᇲ2N}dbl;*2b.3p@F==<'_|ov!Hpn.. m=X# ϛf[Yk#1!!+`<JH"""z~ ^Cs>6;;;Ê:Jhk]_? T*JBAoeeM?† -^:j:rAc@0N!vx*vv<gA{{[oRT~җqXbcbbcbT nFB[Aaly[.n 4B')AeK>t3b߾1@ }BqFhҲ| ̞=õ3t H涷PHjU*V8hEQ0s7ŀ!1@0 \mjz4/*+pYYyss |'sԙ^RR MCK2G7ŽxHt`SgZZ[K$2&?};v6,l#GƦw֭ /pt:ji͟7Kf::Dᄈϑܛ<kod=wg;fԺ7jʅ \b#8q=<|G5VYfeOI=>Q#:>=#Ӓ0ز"s`0M&kkFXL++?qJPvG+,*+W2YpbE|ޓ۷oرC <,^R=/?hzǯ^*JKK9"Q=uӧAuuuff&&]pL@Ғwm5u%b 1 ގ͵w5s7 2l]wup6urPP %;wJ'Mpwwsz͘3p`q46>s̹}ӄB!鳕UgWI;8SЇV...^x!}"3  ̫s&iQCh4AB8uێȈА5KOO߿ܹsB]rrr7%Inn9sbbbRRRT3gfϞ=p} <`Ϛ5+11ݻ{p84iҘ1cS^^|&ȫL&S^-w֭zFffւsw'ׯ̬# &/9s{u nUUZ6Zo74J%`} b7of2nnEE%|{5V<}Ζ7`@zk { @(nj[G[[GzZ{ hA6 0C mSCm]pr={3=wm̬Cjo9{~GLmq+Uwz{{mټʊ}9֭;o]-ξL"p8|k[[@N۹뫣G =_x<>&f<ˆubvPPB.S[k$}T*bpȈ^OO/j 7$iVw7l^N~^^ B,&"BHa]]]^ˬr…x<ښxQO'}}}x<>00pΝJxP<-R`3f wssh4 ;99xc#%ſT*52++ƫ,-Y6O?b]kk+tt!Z;&*2Ⱓ,t3a||.] RYU0/0@bt*-[5tssSP(,Hh4"{gTUU&bloo7Rf-W:cX@֠hăJ"j?P#DO:r;檕d2{_`zIaj p8B1[^V62T*u:`P(%HF"Y!D"Q!k1IRPU]S^osPQ0 rӒI$^̙Q(H5J21APZG8yF`k&$ BnlPȍ`0A?:- P'<dPf( ŒH$JekQ[֬^FxXb;B^rJ۴| IDAT=gg'+j5@D2kk/)H@T@Ph2 b1h4`0 COO_G@D"FQTHdF^D"Q"h4XL"0 P(CCCR#5332 &VVVrь.DCCߜR*` >dʪ*ZԌb$ֶZnmkh4r(w^k gFrjukkVE2}(Nkk2[[?Y ;;ۊ*R)xL5˿~`z+Z6jiaxтeK_cF}7:;;XLX,T*7 n>lsdPU][]]2\cAAAyyy B x<_Psrrj5L{B())a$ 9::)2fffB|}}_P(q82)$$$''GP444T*8-/rڵ{zz\+ʤى.fWVV l.p[zN6,6?8rY.^q.׆q8̬S3d)NI8}JV*f'|}|Ξ=b2YTT<{ b𰇇{kksT*mٲ-{חs&z-$IYY7 ff8q_csٽ{]d2"yoܸaaa1~gO'N433`0SNtRuuuwwwxx5 JMMhllrE"庻?:y/yzzDE‰IPfff1v`܄*õc0I/W>>^ :HXʒƦ&,聝-`b\)t[kY"=FtS**+bGXXH8-  G Mx|٫a>nBr`#!c"Y,T*eٰ#H1S&WVU KCCC<nfϚ04&"W9vvAiӦr^k7(//'HƆO"B||S(L8@U- B&C VA>^Cy!*;F!8!43 Ť6pqqJy3dJb?$22<226K;;P^ $A˃Zrt:8 0 ~߷< 830ȓ ËFk+oĄ( qx/,??8qyY:A yK&'N~ς^ UUU]]K᯦aӘe>afB-hׯ?kg%%%Yd{ٴiS~~?s0JegbʕBȔ 66,p%'wWXZ`0$ߟ`PHt:]IIg5X7gcJ^^'~|cR){{{ vb0#!|'ӧOL9zhSSyfӧ<+V<vvv\t޽{gSSu fΘ/_*ӦMٽo>7ׇVBq33)㽽hN/>pP(ss#СC'Nxq8\gggfff]]ݒ%K ֭[n݊}T~!!!9rΝ;IIIƵ CKK-ZbBQZZjkkh"Jܹeee|X̝;/==]& >V><00j\dff.\@ |g :\VVpO۷Ǎp"""=))i͚5h4ȑ#é:r\( KMM?>J]f͌3UUU<yzjbbbtt׋O~zZZ[FFƨQ"$ ''W^yE(]yΜ9f>>>򊃃ɓ'ڐ777̎S󓒒|||Ο?_UU5G|cH$RJJJMMD" R, ,,Yf͚5EEEO9sӧ555gΜx74Mfffsssrr$n))) 8qDwwwrrrZZZUUɓ'CBB&Mf333Rtrr;wnaa'</33D"-\9sb=DF.^ڲCg'_~b3O}6 rB`뫩ٶm^bB?ѣG׮] IOO߽{T*ݵkW}}Qvpz뭥K",K.r7n =cǎMKKR~~~ZTE1 [[QD"F'YYYyyy!9444_Zt\.GF]F;p\FZ[[YYYk׮;vT*mmmYX3gΜ={6D277_teˬ.\(\oSSSqn}Bݻ?d555 VbXNnݺzyy-_\&"%MOO 9s&@h4ϟGt1>>~ b\d%&&N<tsRSS @P~%Kp8ggQ񬨨)))4rƍ .DFFΛ7h8 <[2 q@ # BAѭ\.RPLLL̙a㩤xCCC&&&O6"}1&cffvthZ^?R,,,zzz Ɲ;wyA3'Oi>>4ɩy``'00uxx!]+>>>NNNxϚtl&*7z 'UT7~m\ח/tdt݂vsKB.CPC+^ #>ىbG6SN%H?LKKˡC4M``ȷ({'N2( /,[o5<YH/<V{E5zhRTkkk$dwwwdOBQWWՅFmmmF@ ( ?W+7o)*b[.w_[YYBCy[~QN:ÃFp XÇ 7t:=--mJqqqyyIaaa{{;ػw/xƍcǎa0DKK[n=zD"a9sXYY^r!0f͊ a4===Elĸ ffbP[ öw,Z}@ꫯ^zic7||I&;w<..n߾}&MJNNDgϞsbaV>|U(  ϓ1Bmiib---"#--Yab~›vv!jn{{`AVJ"oX, Rդ\ڭ Du}]  \j5ソIV7 IDATUo9D"@r o#\=L0trSoo+pFcTm2 4FE'_hE#'YXZttt:8pCCCH}BZ/FZ4j)s&jZLA?7nhl ښFA D"NSz얖۷oOKKRHoϟ96*z  U__P({`0mmmGE|JKK׬Y|[=@ax\.JNn靷׎,%eNñ1,1$8ʺ;[[n~>cc(\QYY8s{qM͍M?c|nm߯8py׮;::xz;…l'gGXԲzG1UFiӦwyr׮]aaad2IRzaaaagΜQ*R4++ ~$111ǏrttBNuVuuuww͛7ܬ;WRRbjjHOOp8?zIDT* =@axD"!!>ΝCC :}x9sx4UxH7֬~3 ӦR^ʾñ8qc5jMQ- 9-$$h0$͞u|''3Y[YZu...ӦMrK_]r)rkkS]qb6r$C77cca0t:q.;caa1mڴgϊD"6p‘c  XpcN>bj5 ""b0@*@p۷o;88$%%=,Q,U33{kqqqǏjSLA-Ǎ!JCCCg̘AK.:w3yekkP/hvk79Ig:?پc귟l=Xo>NaLKϳfP(fMMM!@ P~R哧ph4KK ~1ªRbcch4LJ-^Y@0&g\R P(+*x( :A`0|AEexHfیbUDiԩSHTUU}ᇈD")**p8QQQ+//>>>&yB ?31@$Ǎs5VR VTV7>}G,ܽˍM "7_oݺ]^Q,;(JV?… u֬,DqJx]B `l\02%,4ʊR/甔 qbΞ5ĤPU]P(fXe< 4?Buww'''ZH$ ̙3k׮  F7iӦd;wֆKp˗s8ꍕ#,/+R42" tMOP(k?hJNONNOy"ssjݻwd2@D"7bF@ /0$͞5/-Bpx*2s[?"H7oWH$T:jq8L$gϚI$ `}X(?Dbhh(`0JR"H&E"^Gzȸ.> @*OyB!3 :nff:A=xP}9Y}بo)>v<3<<|^X,iim=x~:y)MѴ644:uL&;w=z ^~ɴ~ӆNTT%;g_ƌtcTJՙ3 CZj u/\|9`&#ؘROMoh{{K".vZ&^{~֭111vvv^%I'FEE"7Iq&SP(ר-gNE#7n 9dnݺudJffsjj*(!@ ( @ ( y_ dHC<. ȿlvtrq@ DE#%aɈ qBQpgC<.aiظa Ëʕ+a E癙Bax @ /0\t/YYbE]]ݳvT6mz!8gxC Oa`0 dBɚH$277G d2DMeSjb̎r\(>z^&) N`S d]va///xC /0O?[+qqK3>ճ?✜WkZ6=f̘+V 񺺺z+jR*Rthh()) F,T"! 755) 0@L zzzDbpp0NU>ol󵵵544jGGGOOO SYYV%X,={1>447ߴ %%%RPPP@y<D7n\gggccL&h Euuu=x`xx,00L&vvv>}ȋ ׮] pbSS/`mEא rsLXBf PS[4M_GGy"`+-DiSƏbc''G>2V{uEFl/b2˅&&&#%%e```Ŋ ,0 H՜pX|{KKˡC*5??AAAGilljFa}P(\lNϿs͕JJ_$͞=ݻ;v0aZxGfϞ=ucc#d2/^xСV^?Rrrr|||RSS4Nݲe9p8gΜH$JR(  vuu?~\"( H:wܪKKK( ȋ ֝Ғ^[[2%9^kJb09lN}}-[Kmimmm奥utt(yDFc4mnnHGo---ȿ%%%/7//oᕕwNHHP(iӦ!puu}J?~%믛9rԩSAAAիWX(PJuEdc{m߾ Ƽy\]],Y2J233-[&?sBpDz7)ʑ#GΜ9ptt\f "Fcccd2?L6-..tR .p!!!$??uw^¢?߅B:|1Qvvf_''G= b1wuupƎٵkdK*#`Z-ǯYO?vuhݻN#;F8qNN B Bcd2!zgggQ]]UZZJ Jeyy#GD"Fy/whhhT){=SSS*:v\w9lbmm=H8t:L&7ի?" qqqȀEyy/ 5Mee%T~}}}槟~z < jϞ=O\qRvKK-Fj<hjoUH96~N1 jd2[2>餗4QTT4uT@````` 2F{zzƖuoo/r6 :NT""cƌAi4%5 㣣=tRWPP0yd&h͛g*H0GH$d2H#HΝhnnn݇]\\L׻7dZ?ϔ)S(ʢEDR4vW_}UV`3hy<^ppo#bؔ͛7GH #&&q޼y&&& ,pttP(Ӑ\|/^,HLfxx8DHLL`0۶mkoo 1 ByxX~-[600d2RSSH Yd KMMuqqxyyEGGkh4zh4@ [k0[[ƆzG34 o^LcOOldU߆A Oϳf3wO,Fy5( E/8@ OGhX$9׆$QA ?R!_ cӦM7 y( pV@0@ Fs+< O @aCb񕜫NR' h޽;&O9)~op1LT*Up(SS-S\\ۨ#G;kӦMH.\2nܸn```:p鞞K,耗>y:ۗ~HB¤Νz} z ɛ[ZZU*`WUUW [ZZ+4MSs b~P(T*5"!MaH,ohohDnT*u]݃ΪjPԌRX,aMM/J]lٷ~+m۶ 5%{===j:..N/^_t~ @^RaBΜ=onNP(*wY3/\߲ m][DGGh4~>5ufo8::8;;ju洵kޤR)5ƍ pm=^uƍŋNLy_KNN2eJiinIIIG7n*,,,;;{ժUsYXX3dXd2r|?*H~ᇾ>Z3+\h6[[۞!3Sӹ)ut%ۍMK_]" EpP q온Ci4`0> ]}}+6):988hkjZ-N B<#kZ`0tvlK[ 'OL&CCCJ@5kB 8{l__N"322Zm{{xoB1FAB@ Ϝ0P( 1QJox+KP(T^Azdh4Ɔ%K<>^/e;::`XL*JG†zz7J$}Ӈ[z{VU?|PnnnEEKgϞ=bxdneeyۻ޽ H_ عsgGGZniiP(SNX,<1ctB&s8_~3}fRJ¢7b,欙3.f_NNWRroy P8<1*2ԩ3&N)n2-,4DPP(MpP6_J{G'LF p8u͘t9k+4ڿqw,FDD9syB`02lܸq_|E||H$i#H0?&"""::>?~cZZ+H΋-޸qcddĉ g>}ttttOOϲeˠ0@ 챵mly4sKpΜΤh0:;V~YDOIR* " IDATcǎŋGDDw G"lA'Ϛy _`R)F8qm[֯_|ߧx<?Du - B Tx-<<77Fl@JJ yƁ-QΝ;wܑ;w@ @ bxw a E=bq06m !I0 GsCm}]dGDqBu\K[ h4꼼kj0 ݻw#/A B1tA'@ ( @ ( ygBu+"&z S&'X6@^:a7(]]׮]6 R\.Gc2D"DASS*T*Riff64$FPjZo[[Yi4ThD"JEz^"*UJ cJ"?za`` @ ϖ0sX,˵_$燽[Zx|Tdى ~nn?_?݁`Z7_Sr󃃃n˗`>t S&N@&e%.Ͼxoy!nBl ss .iFOddR){mwwk>㢸 ,+ ذ%Xb1^M,)7o)KX ( t&KP?[gg<33s̺5QP(=X\]]t.yLА; Y!;eee '_}D DG1'ޮzX|FFfW\vtזN$wV LMMe_W*kjj%_x4.f/+̬v B,ք1GtzPOOϧk> ]A*?园ZV$ ;oN>|XXXBh~ܕxD"?txCݻ 9g;h$jWe.1{{y5d08NѨ BH,zJ&0NQB^^[jpq2BJ%JP(x{iu:*BBvv+WѨBT*]f Ā8 軄D"٬~~ilv%1 r88 11 nXgG[sS='Q!^@K, <1P#AbxtwfgAxj ^({̹yJA(xRzڵlNBt;v0qDOJ,1P$@bw=ɓ'+c[~ /Sͷ>~7>>ܹsuΌ{&$gɞ3gNgg'Tó[^Qo;?>`0Tݻ'3oݹS0:CnٲET^ojjۑ~~7 \֩mll|V=ݶV`dxhLX)JuFy/L ohrOyw==z0{,VP(]Q1}o6|Vt7&6ܛfo&SrF~3!}^7н6lɓ'꼽mvtt }ÇԄ+O> XbݻO6z蜜Pcc œǍW^^^PPxk׮%2DT˜;wܹs=<<>9rʣG+TVV6ĉׯuVZUZZJ7###66#Gd/REEB(--mΜ9zzzvuu绹-Z㧟~2j'MtR"!L2E&EFF>}ZV#$zݻwO2uܸqSNuss 9|0C 6#-Zo߾ng}F{-\/""˽?3Vx9rdĈ...Jaa!B{۶maaaoB}ѴiӢz{{ ^}U#Gwhb(-)j{wﴴ@CgW{O9|!]JOMӒdrccOG~ȁɓ&:|g3rrnON̼1jɟ%l9#ɳgNLL555>sLss޽5k`ϟ?zhuuuBBիsssccc P~~>=qĭ[&M駟Z[[dZw-Xմ{IJJjoo߿CzҤIW^vmUUqBV*jǎ///OJJZreff>NtQFGuuu\\ɓ/]4j( t:W_}hѢ"z.|С> //oر6l Jovnnŋ~mXsׯ!֯_oiiyҥ/ʕ+7o4nIrrc:::w!n޼8|B჻ֶs+W޽!t[n}W\a2;v TT}YiiF333W\y C1 !"!_ʺC{{ni;Jʕ!@5_WRRӓs@q?w#%o7VVVFDDYXXL6-;P(K. ...cƌe2ǏDgffO %''644ܺu+''1::_3gδ4iןhsrrjkk4ͨQlСC… ^:@ QQQzF b„ `„ bX`8777# ŋBstt"J b2'Nd2g,<%%%F˖- ζD/ 6tň0{l;;;PЀ":1OhD?!4fwww{et̙b/I$NJA4`&Ov~n^+6 CRYUu5A# z=I8B!&Kx;vd20 (N#N3 >bq't:(^'jx pWDfnn~I&q{3Cl DoQXX؅ .\pUV7ƸmDD#@דH$ZmlP(&1n0g)dc Ƙ8`LB4(BH$bf@ǍMފ vwwwtt$g&D"o#I$RNN˗SSS7oLl^߃E|L&> H$a$b;T*ˉvOXXX,Z dD%GfۏjmkUSVVV?kzU*jȥRT\t8s9АA*Ukqommrq :=''Z`oOQ;:|>QH| ???tqp84`\zϏN;w!߿O:_QXXT*W\) iƍL&388omK8}t@@JpqKJJJZZZ(ʑ#G[Rkݛ 2~ Dxyy;v!D{{{lll(JMM6l۷lɓ''Lp5^ћ=eǯ_&٤ΐqjX#GonXl1rD򅔣.,ĉDT:vh0Zr!d(,4d|!uU*щ &l߾}ٲe~QFر^cXOQwvv[od2tzttD"yS wQ(ĖDFFرc޼yl6Lk׮-[h4u6mڤVL/L&{w PR4**СCwvpp/ޱcѣGTjLL]-[~ 'vtt{1cƬXj֭*ĉ_`pz}cc#щ&&&T*oDHpwuu5FqDB|ѽ{LLL(RjmmhnnVTL&S"XrX ÄBW/!j˺*IJ !tVOJVzQ/]GVNNI_`לt:]C=ȴ[aXG{k /ßJP$XNb~+K}zXF`#]dgg<ar] *VF fƨT+y]prr"ƵnC=5D"YXX;sl߯կ/</9sHH!¢ݫO$!!aŊ^^^x1| /7޺u~OӦM6m1xZ yW[}OJ@ 1fΜ$H8ËæWWC(x:nH /\8t!^4rb7ߎ?BZe!1p(J F<'vUxAT޳NȺr8C??_ן:}P2DRUEE zzz? +B EE%Z{F <Nt9c׮mmƎ9sܩxP‰D\꬙p/1 \.JReg |MRYQQ!/]vuq=rhTcBrn{dNW]cmm}%ow`kk^okkGuwM2Dѣ"֮!_pyf߻[P#p; z3:_HX\\b0l ݺ>#3+3Btc='y]ï hr*Blb!AjplϟOhl6+55vJ$ZsuBP쮨kkkvI T*xBh𠠄"GGh4GG;~!_mD;:;w8ڽdpauvgg$x.T*}Uvvd2yȐ0GGb2Q#:;;YL&h4Wf$ZX/c9V,755qҿ!1~cUVj5LyaCh0<qoH( koegg'kia%0lPp񢶮J8;kwP`1!%1ɨ?.,,rww{pd2%`xRtU_[qI~@bxDEE8?b.D'@bx8(wnCdmcAB9th/!$Mse5j'XPH$p;$"b*PPW\8Ξ=kQI(--;9''GPʇ-((|Իǎ'.cݽ{/w?[xS'gff[xĉg"z{{̺:2^鄄g7n_=k YWcP(B@C̱OzRZmaa1x`ooo\rd۶m}'>V^r---l63$$D,ٳc,X… L&3$$do&0r GGǾ%Tׯ_zdd0Ν;!.|_~555y&%%ݻ:"44ǧi!2leecmmP(vڵlٲN6mΜ9eeePWBVvd,&|r]{J%B(<,\LeJ$鹾:jB rᶶ(燆q8_zzz~3gΈD@[[ۢ ӧϝ;g\oF۷OR-ܹs\n``ݻw/\Wɓ!!!ĉϟrfΜI^'///''KK˱c{]RRBќ+**>LMPjuKKKzzzhhoMMۻ Ń T({U*ݻOdd^园Æ ]zm]>SLGOJ:/ g|ɷD:uuYVZqc'M:4JdM*maggw-:Ay4JeS&y<^L҉N cƏP(6d2vww]֕esfz̙3񖖖$BIDAT!7dffJ7|ߟD"uuumڴ)==_ 5Nk*ccc;<<<""![__vT.tp2\WW^vfٲe}3+WݻM5M{{;16Bhܹ |yfqqqLLL`` h4`8u޽{[[['Lh[yxxR`0dddܹj~!8}tRR㹹{A_@(Ι3g̘1 9OT2kFDD#JKKoW_!.]t隚I&-YcB͚5orUUU~[-Z$HN|^OLLܿBXtiTT`?cvQwU{׷ǎjѳgr---[l̴XdI@@a&&&{-//WTL&ΎJlݺw˖-aaaﯮFmٲiӦMƍ;vXIIo~ECCo7oյm67ڵ_ecc`00 0L('Drppx7}]b'RXX(X,Q@ 033#?p-[!jjjΟ??a„]vq/!s۷+͛7#ZZZ._geebŊݻwϚ5ܹsyyyoN===ʮ.bR,++#^̜9o|~@նmݺbmܸB.rv}Ǐϟ?oQQBΝ; ݾ};a6l@:::~aaa*..NLL\rƍ{zz Z ͛ vEP@^2m4HDTt:ںoCD"D"V+4Iz(!1< e߅,ET#&[5WWq}WvȀ(Jsuƌi&$%;;;x{yyz$_H |)K/M1Y8F۹sFYxqhhY.^V{{{ F 4!tȑӧt\Ndyyy-ZW^innVT]]]QQQT*5,,\.g0DzŊZ`ȑnnn[n}ܠT*) $zKnnnCxyyYYYhҬYFhѢ\pd23f̈7cbbd\\\ L~"ڊ6W^>|ʕ+\7ߔd ,prrz̰=zĈ2lʕ|o}:t̙3-ZTPP@8`0,X Hjӧ'OL6>͍fQTVTTlٲxaAz9T*-n|‰"/y-ԩ3i;;;ZmmmL] B S(Db9D;L&RٽwCa#BrO?Eutt;w믿vppr%%%B!ʴ#S(0J5 A߹sgD ð~BKTr8HT^^ҥMȹs[.33xNW*|>xL5]d2<--m׮]]v%&&֠A0Lb;i4]'NvQ/- w\\\RRR{{V{}'G(7nԩjxNCl@ =X9j4uX,VQJu̙۷ohOшMшmsuu}j*:^^^Wx<\P(|>a5k֬YA?|*|rP/ CmmT N/wοs;?_="BRlBܱ;w <=^&63S]]rcܻ[m?ߖ֍ypp64|1,Y~HCC w_קD"gVK&#""x㍠ ^_^^nmmM4.]aXEECtS"##/^KKKCy|8j--? nƌfff7.K/ꫯ( PO_7o/CCC!Gپ}_%޽{JRHnnѣBazzCǣ7MLL's#lmmAEEL&ĭ>Ci4++M6XfȑK, 6 VVV"|>D"3f޽ͳ$D6%4hЩS4qF0H Oҥ˝]!VP*==ub]ȺZBhGkjlɸcwRwZm;aGtS#qN.syn?Đ8Djoo  ctsr܅ OYYY3f?~ѣGSRRr-ZԷQ[UUMH$RGGG?{}}}7nZpΝ;TNkkk )Lu-\.'ƍ;xw}GzOpppuuΝ;Y,^xhaÆ:uN7WWW/\DQF]xð3gK )))x<ӒGFF޽{ӦMG d2__ߊ]vl":~u1{zz9F9s&#ٳ=9TVVFܘ4}m۶m۶fdRWRڵk7oL믡y<ҥoʻ: &BlRS.b1 dls ɠEq9;;;6eb"Rl6;0 SFRb3Vͼ<=96öp8zA;9;|PDR%ύ&HttR,6NK=== ˱3֘t:\{ot9#(x+a88<<<ƍG\A  B^AAANNN绸UBJƇ2d2&icc H$ { LvrrH$$J4(,,h1hb&((`0P(H4hРaÆ-,,p'V >|8DDÖL&;::lH$?]]]y<q!D"Iґ#Gx<&ikkk͐d:byxx{yy B333OOϾ#BՕ3JB0Xrx<N3fLpp0al6̬o`˫aXl6 `eeegggbb"J1 p8C DښJH$D2j(@@mll333///rZYLL-qbM}`\^~O>ZjurJl&NPwO 2Vbޚw8D"S B>' nDP3Rv+ fn.Q* $a03xp AW )T߫4118@bx;vٸq#Ë:*zbXX'r~< G& :z).CTt+y"33-Q+o(mBq#0ksT9|>=Ͽ+Y]Sha!PĠP(# Cޭd2yРa/9:8@bo!*j@ xP$K/|y)2BH՞>tr&5jDXhDa.HTPXrvͼ[ cX77צ~{3FIRON}\prFrEZ=dHX ra2WVU544L[XTt\rʹ CHTYU:p*JmmXݻqq^1b'+WGfk,1.\>%vR[{ٳtzP`==3OhϜ̺2l)n޹kO?V(璒E/ LTT\%ɤ U*uZ%&#mW\;s&)"b$Bx1`1niC 9w>ӦZI- 'u;O.OUk4ꇾh2/_,(,@ CkkY߹S&N?xpJo M2$D"b'Ornn/2|{RSc }gggiiB(baIP^zmĈaQ#%d2y珻__J*yvI5F`6#16^oFvKK  P !3r8lAL4z=1$BbdX,qB$Ndֶ7l-BCبQ#LDOf8FyD33lm- C{[E"EaAR35}fO˒J- 5j$2 jIKP78;;sK_˾o7}CˏO4GzCk[GhhرJR8y39223]r9씈%QQcyQqcQX,fyݝ?޲i ի&xgg׻הּ<[*HOiU!1<(T*iG0^VѼ ?bkj 3|_~+ۉaȐp_d!jO΁B!<)Lhg0Y%"CW_?Æ`FbhYMF!:[Bl6{ɒE-X_ .]p)-^C2)OBPinCCWgN B&.){U&p9WC47>8A,6;F(Ar޾Z޺I)v)}0yŋ_rWht: )dFէ3'l2 VPd^xJyOxh-$@b$@b$@b$``FT!gN`f&0˃0h4zo \M ~ht9I:x`0###-0'szzT^er:! 9:-) 㸩Z5]IENDB`gpiv-0.6.1/doc/C/figures/gpiv-desk.png0000644000175000017500000030662711204235560014412 00000000000000PNG  IHDR,5bKGD pHYs  d_tIME 9->w IDATxw$}TfUVw3= @*]E^]".[twQ( 3XLO{]}exd3e}|U~CVVV@:u|F8gKP0 EQEbe}v0Fq` HTD"ۧycESNO EM&$I7[6$FQi$IJb0d2 PUUaϓ$8I,˲i| H___[[hf n߾?onn{EQ2}שeEQJ{K&9|^mpŢfcYRz hy!DQAo~Q**Ns:$waib8!M0RL@ {{{FB H$BJ~a$I:y$ӭ[Ahmmmkk5pj=ӯiښxԙuvv vMP4 ^A4M( 9r 4M[\,1 --- ݟV o_pEp8q\<?tPTr:wG)CCC;;;oskEqaaj&;wN:Csu|zPTn޼JPg(pAQUUݤ(<ϲ, SnP_cm-cc]nǯPthD^7.//:ud2i0󍍍^|wuu5p8wO#CIWW\v-N?3wT.MNN|[CmU3L!O{*(<+G=q:DBӴG姟~_?}t<g;/f{衇9y^eB333R A3g@ rh6 ۽@AѸd1 Vuddi)V#NONNr7>>>77WVɤ嚛+v<ǃ?>55~w UU1 s:v}aaaaaP(rv X,Rxe^_TbWWv"hhh8yj)R"˲$IjunnNDׂh=$)xA  :n?qb+_x(%o;X_#dR8pwޱKKKW\T?GGGI7oZ,t: vp, G k,[[0¤3[ML*s=>&FR3Q.kUU jh4>c >>22b4{zz8+ ]]].@ b6eYgmmW<㏟9sw5LqZLvזwy< mBu3cv=D"ֆ HZbp"qn3 lԩSO|:PvZWW.j>b8 $ =ȲJ~ӧ٬xhEQX,FQdJR۹ki$EQ#Jߺj-Jy^(8KRN/+mІll__]P}Gg` sEQgϞMEQJ+Wh0b=t0wYo&Ai>zk~ѣG)BQng2'|rzzzhhf]vh49N|bٳRŲlT:r۷{zzp7:t$7xn(H$J /477$~9ahGG$I$7n>}z~~~bbbppשGQBݐ=^mwOweƐ5M+J,\$jXE^ Md]Y\Z1ڙ]qS񙙙1>55 fwwbF'N0XL!roo/8Ů^Zι>6|L'112NܼC`0Avk?GxهT*wg_p>z='zY۽ϣN/(4]*voðݳZA|>_PE@lV0!GUU3|Eq::noo4Md2(ԎiR$Iј`ro ;)gm Ool*>ɝlG/)}wѱOK4Y,O[__?t#&TeYG,Z1A4MW*IdYSJ),Nd2ja8EVƅK.  N:p8TU}DQDQ4\L&keL&<,ZSgb5ARj>4$Ia2L&q;;;NSeUUNt.jjei(٩"PUd2TRIJ 5olVUYz4}>ah4NCRt|>/IV\niifPp\.EVN:3, H\Zt:<4 at:jхbh6y-ݵf5 5jUe A0LP63Rp8:u|uPBA UL+ 5kX[‚=J0 /Z"fQEtwwK}(%tfگ‡$(0qiEWV٬4-noor9[|rD"6m}}]~hmm]]]EM%L칌p$\SƢt:]CC04MzQw Ը,K,ۣ |@Qtmmmyyl' ~yIfF4 X |$IZZZRrB!afښ,..:NUUKLGGG. $utth {n `Z^Z3,-cw!'V{uueY:44tݦ~a=Úۻ ;v\^[[|O>ͻ}SK )N%I:|p.c`2hfZ0Yl6D]Ʋl-DT(>g])s<_T4M+ j\.i, 0X aB t:؀,3(O$r9ƫA$ժ?EN'miiI:ev8oV * 'cX-(J,_ŅcǎdY< }#&4,CR)h+n_]]mll,FD" #^sB;6l,A] a]aRdL&CQ׾]&o}q(E_s+rM84MŝW=?TM6^KՁ2(:A?`=(P?-FcZrJ.[__gftte_rx\Ʈ\v(kkkbZ]]][[aIHlFѐUU5J1 vvvAhjj|+aO0 {'񸪪M{ZÇEQvǓJ(:z[SS]X__$vG.(`0IZ]pKK EQjRJzn ?FѡޫWR)A<?Bwj'ZAqX,ϛLl6 IY(c`fA@TU /^?666<< pH.{W/^hi| C%j|>o~VWWkoTq @FA477oof.C2~3SOMOO߹s0.xR"Nh4z$[ZZVVVfgg0(6<;^,˚LYcX\foV:R Ȳl0VK88rY,h4:  f3n2pxqqL&dB3((̣πrl˕J `0*$ieRE*<0$Iz<qQ*8 : #,JfA:::v{___.zV,AiZ*Jb``0H8v ëk0ݬ5͛7v{oo/MSSSǎ=P(Dvdj ai $ׯ:u ngYvee&Y徦6皙|VX,*FAhFCCCڔJ%TU( jU*VdL@N/q׮]ð$T*Unv;ͱXСC T*)L^wdd$JId4cXoo h T4ܹsΝrJ$髹\. (Z[[`4gs\r9߸qRl6 (t޹s]&n///J̌x=OmIN<)B8ZW^miiq:/r__[ouȑÇONNnoo`09<<(Jwww__ߞAʲqYXB mmm7@_ycc⢪74McjJ%Ce ||Un4 $ qPjnmmUW<3;㸦$IRZJyxK2==z CC]]Dy޸q(QA s~z}\ڪKlvCQɤi Nw84A .\rX _v-Y<. IDATmjTJ4Mq6,WU5LKeq\e5/lUVF#lu PYQd `uu,,]]]l6 x嗏=vʲjCC+W\.ΎilƷ_.]9wB $IhfMNN8קi'x|.?zJKK oZMRQ45poyX$IXeA xO$,SVJJa0;;K4I~0L,T*\]bTR9}>_>w8n?L?Gwϫv) ;RIg_1q(JU˜6L;Svz"IrqqVxB䒤ߖ҇_=?rTL&$I ߉vw7,u3 Ga_~fR%Q] ({#MН 7EN/v T,:$yt`622rE /gMMM\qAQdu\:_0mQ5VՕJŢETȞgAEQA0UUVlb )mKFQRy18y^$@Tl d8 ̝\=)`xve%hjz~}}q mSo& ^(P$mllȲlČ݆yltl [i`ee `FjQ-J0kd^xq}}}aaA)ʊ?;0h xE8NQn4 mm.P aâsdd$tvvޭGQB:FQ; "222rmX066V{ܹL&-H4{H$rL&^Ç?%˭|+ѣGߺu͛$Fzo@od'ޞ{E!QT5 u:ankJPR&&&r(E`4< P,.$+tF5=pokkqO!PBhKcA4xCu^z% 62 HD4IS7IZFlsjt:A^o"PJtܺ=>>JuR j[4MYd à(|){0k. C{{;LPf{a] 777JCA #GC=d~aUU hllljjO>~3 QF"#{%/<00Ҳ%rP=q؝7fAp`088vC8nZ+ ,B_fsWWvGGPbqiiAV1rt:}>eڢ̔Eq}}{m- ˲lZI'Ozj:f;>_ .O/KEI׻rԔN[yr`$I**`x\:l<zuTP4Jݹs.A(6lmm%I`8ut(zPj6]ZZM&l h^YY0l``9\'Np\F1x<///C+lrDQt2RWXVq|xxxOihh @}H<MٟP'0 ]7k0G?o3}6L$(cIX4гo4nmh֩UUշ~[U'NL&UUWWQtG|>(a0}llƍƥ%QFQX kdEa\.sU*( y<=S*Ϝ9smp8^(v/y*L&KɤT*)Xxccc[[[$njjb_ffwښ]mK~QUE=ɝu|!eY8(/pEaJzAAnK.OT*O͝$bOJ%(q^q(NLey@:@(,BD}m͟HXN_$Q\,.HD)"6.$wP:,Df3EQb@QV,TiEQY|YMf#R6NC'f0͒$ĸV*I*'FA !&_rzi hɲo+#`5(@d0`O5EQ^ymM9ET*r GTPp_5 y#Gܳ28xɲ_D"OŢl=P1anDq mA0 0 Ab0DH5lmkkKEA g I2HRIt(*P<NGFơJ(n^!Izr9Ύo~,J:4^H|>za9.Qd0Fcc(;f8 B$It~(~6}뭷y׫3˗,{agPqSbP($ 8ϨS 8.Yw7@!m^<44/Cx<|:noV]b,ӟ4h4Z(d@i ` 3M0Xq\UB;4MZ. b`~[o5K%ID"1 c4}>o7o$900z֮_UX $l6CQRGFFd"2sN\8p`}}X,9sfvv,K[[hX__pW_ |0yqzz: U${zzV+asEQd2;;;GGTH$jrPQL&af֛@f1 annEQe^|P*z:ٳfҥKO=9{GwvvlɆ433CӴfSX,ED*% (ZiZZonn (T:;==<iX d2a(!na.P.RD󵵵ګZ.m6h<فX,ÇkռEB9$Ij$Ibd{B}PK:L-ï׿Pw\0wj) v%I331C)aDQX,q믿$GO*;w校,(޺u`0^zI6b1HSZ[[vH< /z}$!brrVC)mcB;b@,IǎCRed$Ǐy(6>>{@ IV4iAyәfy*ɱ 5@t:m0H\__e\.EY!Ii>һ>&J%JD"?~\.OLL2C0>vH{{W(aYV1UU IT:ulS-?J$ SzLӬ2[}ymmm $ EQ0! V՟g6ONU :H$+++$I^rehhf<ӇNg,Rkpx$IV5Q< $J%XxN> ` bYvbb6FQT3̂@jJJ"=iZse1UU hÙLVt688d*J<[, =] ,(=jm#;agaA^yݔX"Fz+S>qjdΓO~ujrr{;lMNz#۞P5UEjehFTZ[^fEW=~2 EQ, G}O8? ^VC K$X400Pe\)W bX[[$In*X&E(a kѼAPbxJskkk\6 <7M%L Bb1e]t"EQh X,\CAO zA-oc(j3ܹs?G~YА,6-o2q2NLLMzpe 4MB2-O;!$Ek}A(h6 ʲ,^&Y^;~,..nfq`6Q.'ɗAϜ= G"!{YSӁ__==MӴѸߗm2уv}cc ߴEѺ \5~Koۗ]6F*`D" zn6ifmm]??OFFF'J%w.rK˫K+rlRhi lVjs;ܾZEq_>q'O}qCC`H$Pҋ/;o-/sA4n7IɃ%0rС=۠}6E]_i< ]F U?0 w9ԻSSۑHSL&ǫUm~&S9It:E::: (FSڟN333\NƯ}kMMMjuM]_IH DQ$ggg)x<8 (b;Ͳip0Fbx<~pcMl%`_E1 i#MӪ4m?6u>}&m6[CKf@bNfd"HWn^,qb,3 tlg[w}_o~+}V+_z}?H? >`h\)1mmm(F"UUA4(^ nRfU*BPTx ǃ`RT%HKH4_x< Mݿi-o48l裏~YO:xfIh4]ovlkW*I,?|AX5Jl3={6VA]9t:m4">h,r/u`?ƢɨbaYʅnl4-~ԩ|>}g:[E."+Mt6[r t}'N/^Ju>XtKn)c+eVUa疏zd2֢.]*JnȲ(ʂ(7L)Ho4Frf tGy;γ>[(v7DZ.ߧo`gʉDF[Z_{X, fSSS|adl`eojjz7J/2E>}4Mm "%"EQ4MKi)u5^ $T* G?nfI$ [E s:t~SSS[DQ4 &I$76EfZUR9%oI*I]QUU@:흝%I5Mb$L|i-zIӦ)IV|Mj~ŗbag3D돟;`zjqq566ryNbp\s;-n-dv<r*à(qI}Q|N(h:6>1: ˲F+ Slcb/>r7Iold*<G(J+++~A}"IS4}=ˁWo!6003}>üy'l60XEQUF5\(e3+ޭr9QMMkkkFcb*Ճa mm-R)H2(dr9rtK.4 tIKoOe$V3h|bRTY %)ˑ4$t'7sF*,>ϧ(׾P(y`ohPfgg6E!c($xoD"~tNMS3o'vdEsS@7x3=h4s^͛{aR7նA6UV@>b Ї---w?ޥٳ {{?x6s?!|(>8_ `8abZUzQQYianz:4 T SS8hu:htU*Uvdv(rm ݮt:#I-:YLZ,&ris:MB)RFѴ@ ABArв47o|1,hTQk0>_>Qƍ%:D1hٚ 5Ɩ I( D AAPiTO$P!QWWl666^x 0ȿ#2t!aX\F$I|>Dӟ3 |z$)>R~-`PUՆ&JeY jͅBCf"e`0444|GX,qTI, aZB0ja8EAKK! =i+nRUAr[8l6\6f4}DUBMCCr'::tN" ՛%IJY^a (B;IE,\.'yEQ `5YV `p]HůLNNiTALƅ7 K7"Z$9$cc,Wy~eoT*.W)J eݨׇUX[ a4XE~L&sME].׮] ^Cl6mll@y>l1~ސe&;R( IDATg EQ;;;Ǐ&`uuBP[[Ƿ[[[偁@<mɤ,IbcB!tL&iZ.~h4 VWWfggϝ;@fggܡ\rF͟7suBtܹ,9sb):X,-..vuu|wyA/D"cǎ=p]ӴŽ|c`ё#G^|EAvVp#<99(ۿ,Ǐ#G<͍OqwO4iNFJ(,fmeiع ž$pwԮVJ*kRW1/{vgbf^0X,Fl6 MMM<333!Z}El6vQiv8}}} bX,RI4ȿJjj2.\attj4GG?깹id BԩSgϞ*~ۭh8]f1z]PRd2 ٱX,J9]&)Jj:i4B!̈ Hw_` Ł~hx6:u(^x=z{q~QKQO$ -g2FFF_,ORW^?V=5]s Q,t: | Dd2555$ rj5Aӧ{{{AX(QeYF$Z~%IT*A%Bhm6Balj}:q F4$pw(܄ q,˂F4͗/ " ak2B$I~c;IBXIl6 Q%rPVRe0 EQ$Zm$1CCCp$IxѣGf9?VVV;/0Ib67o|WST"ca:s5nea`^ommߒB$FqzzdMwr2$Z0D$ Ly!QKR\t1P=L& ͉Dbzziqg|_!* hh4rs' r0  ݻ@aK5yVVqR>BqX`XeYP>o(7?X$]ׁsssH6,+ kRh4$~Pss7o5#By^jZsGGGׁ&q|[cǎjWV\.w= 4v(?ruvv `Xz=A'N\[[`Bz"&)ug$83Mm0 lY@yR qXW 4ñX ^\\jmmX,'NT*>ȋ}/133S].fD"  I2(gT2 b@V@Fd'fZggg1 [5vSԃG\qjX,djRqӂfy}}֭[Jf𦦦:::k>Foܸa2,KOOf{a?DhVV=w\\x<%s- úX4eY8~3_&,C f;{l*c^KxM9\H Xj\t[fGh2!t ty^^6n#U*JÇrkZ?dDXAN|/~N3413J8.e鷑Vc0666L&{!aY(JEףRfgW R,^ @ HT{Meq^T՝ d2nm&5GQ6<BG4ZNRZ PJ"\Y%`0( H4 qoooGAKA<7_5oi]6`0j54LCCC FϷcӘ.KV˲ a@BߢEY,xHiqv >L$_bJ+; E VP(4 DVz6jZ*JZOEQ:0F1fԜfZ.J^wppYhM&O#G@]JbvQ냭;w~jf4g'2BKKKIRmmm۶9Η~mZ}w`m+$$I󰪋ȿۚlnGQ#:uRJlȲ\Ֆ쿟UT䤌Jۯk߿; \z>Nߔ|BƿPy?O(Pj~p_]P-VӲI8VgToؿ)!T( Y6fLKʷ]Z( 6(( v*Wi[5 RPh/A!mATbc߹sg+phہht64 }F֦;)} As$I)u~uq[BJ6mdYb>8?z4dŽaGB,:JE|>ejS=߽Qȡz< R nZ2 3qkV!: }.Xvx4@ FCӝ/<ϗJ%\+> /g`jgagI3-GJ%TwyZ655i4#2ljjjkk ÄHwIjZ)Vz)H3 x|ZF]T^h)\*(+5 ^E' Pv$P/W+k5 0l?2l>yVmnn?#>>;COc!Gj;jb`0N0hΝ;pZgg.]BA$BVF\886$#uI|2ނ#2cq"fjm}^_%\ކ:˲0+ƒrѣv$ysGq^?rv<'nneYYC$JVbAV[^^kNwZ~`Sl_} ǏW*RT*ucZmoo/eͦVEQ|w!ںT*{{{AX1F""B5f+J '42LE45J/nnnBEA$1 |ڵk$IjZHӯBIT*|h rkrǝ>}ҥK 1zqX,j4Ra=fZ-R)޻w/j{Ӫ <ǥiajʍZ8B~d29P&jbquuSښPhDNAxj'/ T(z*NT*+ E$zR|3BIt\ŢPḝT5fa$T*DQJq4PAr^ޖaxXB]$}׽ ҲlCr$UpCŎL pAT8NӔ ZI0^Z-A3T+5z[dYnmm܄F_JL<gd !$I=?g}<#糋c_>>>֏aHɲe[(Dm'DIHF6 0EYs9vmMLC881V{=әJQReĶ(Jb]/j5 $IsPܼ,WQ*v X*U`,l*=YMNNR$5ZN&,[AHבVk:VV&X5MDVD"Gw633pF#m6c~æ&өF7}>+W 㙞de(6Uf#LRu] Y߽Mn{AJ H$v}>J+FQRZ6??0LWWnR.Oܰ7>U.4$F#"dT*̺\ee%h6ұlfKxZ|>%n's^xC7o rlnNIooo8EF`pidĹ*Rs,ON.|H$H$˲f5[[1?eâѥ_pXP,fmjr/q\6UTd&ڗ_rY 8aEjz=YλݮfuS>+bXE-(!qMǏyҍPh[VSTRd9tIU(- 8?&^Vt-=11o~pt[nAٳg h|x:}+]L*T*XNnHZr]"o%7G".%I1􁁁P(T* z狋MMMpxssSRIzlTZXXH$Fq~~r!)o}m(׽tѣG[ZZ 8\sEQf,˒$`lAIjM4<lF9wP#XZ**@݃8M:800fsD=xxǍF#Aw]Z655EvPVKRsss53DXTT<'B6ievgB}PQTjju e*2I/^z,GB%T*BOWc`1 ]>qܹP( Y]]*|.#I;, z hT*RgȘ&&&p  LJԵb OeY`OF֭[<ϧx#BH'a~~hjj_C0|,b=r@1HXd27778qN;::"sJB0sk]cV?pdd˲ d D ʬ|Y6ڝug)E񵥍\)].שj8iѨ6773 pv C$N%4,˦iRCWK,&2м`Ft^FꯐjHt\ޯ-y)GFF&''No~Μ9T*gggVWWO8? lnnP766A8|G}N5M&iooo~[oAsu:l{.Lp8ۻ Xmooq}}}<뛞v\ǎk8& LI^~kW*nԩS@800@̌$Iwd2955+\,-KSSScO/_>|pR(J*jzzP(q Ǻcǎ5Oo꫓@qh:::ĄX^^|&wK&j`0^CCC(J-@6O~B766Ο?gffVWW5"dR333fh4 D"!IА,KKK>iN'D ¯D"aSnܸq镕ŒJBPww7!v̤R'O...R5>>''Vuii=O-vնM_/Pz{(6 #q_':rN9D B!Y-W tǪXZ7ofNecҚZoR0wGwekV8uUv38SL&Zm %Cͯ4gssZ{}ht#G7n>(Cf/*ړEӭ[;)XˠE$;YzE2^5cBˡW^y;oś@K ^#Ah4ފղ,C'H6= k_l#Gܹsglllbb HM(fPŋ%B'|#IyNw9kl{{ɓ'<gzZr:C^V\orֿ-)}bbB|@ J^ /p޽7BEmooqdhhhtttrr_KZ"p IDATR7vN[o\x߹st!F+++j4M$x<~h4VV[X+++cccw=zh7tmmmv= 755;'O\XXwɓ'Ɔrv"x饗2˗GGG@cVժժ(Pr %| <} IzzzܹsKKK.\(|>Jݼyshhŋ $IVX,E?~ʕ+nðW mmm577GZqBm~~gWwR~?$Qq/K!cNϧm3 C"B]1ly\Rε2 GuL9U"ZVWZ[[nWя75hGGȀTm)ϷJF8!EU!IQ. BGG^5m,_>N!D +*\.177wUAJ/vK91W?ׯoLTBŞh-vt) bbD- @}ɸLHgәMlnqۉbHH. 1+ϲ֖cPFR)}/oi q J%083RXpbO#HS"X'(r\Ph{3J"+ (Lr5~LvSwSWVk:::aIt,˃$0̛[f-..MI0 kQ\.Fsȑ!$٬FQT]]]---FQTB@B,fٖh'lpB"pTF) :fP:F322r=z : :ӽo (zAWWי3gR/c,vSSSkknɓ'3VmY^|XPU(l?Iv}}}l6rѝѣGj5ŀ$N9/JZA)II|>T*`Pj 9\q|mZ%'l| ƌfKK p ܮt6b4M;vLP(J*}>N3(JNT---@j;;;w}zw7W\C ZZZ'G@KQ8>vxeeP(JF sA6Juuuy޵58NuvvFQ\%Ih4Fa6B ?V #I@4-˽=5Vz$9O>j5ўdfh]]]OP(XÇ\.`]XXX\\6 fxnnn~~O8^Tg瓺h~.np?s,4MS<ȱ9s!o!=22P(<() MdWWBh \q~ӧVkZ/zC].W ~N, !}@# VA4LCp֓4M7Tv=Oq_4O^ $?$1gl|:lkzL>&E,n r'vNcZ^^c8Sx"ؽvqc3xs `'cca0챏8qGQj ѣsf& ƯPhbbw߅"}-$NLL [[[dRE-nlleUw Ȳ\,EQ,0̮q:Xo al6+2lk, lll4JZESDZ/ OH<=/O5\ZvttLNNb&"򥒮ZʲEZݮVETMO#`KRjj\.a$ub,[yuAlVa{ZMdY^ommq\_&%燃A fyccFRR(.OO_(9N`R*f3{^Ubh)ZM!r.{[r'>k]XBӄN3$Ir9xރ;ZZYSI:d2IPF?B,+Ȳ,t[[K&y76~W_= izcqOMMeYGVWVP(SCJ¹\nÊT*6P(455AZVZ >_&p2}M.3 uNQ$0(@VTt.n}2l6 x<r__BD\V Y.77d9N;ZJKeIQBx$Tzir*Ua#˸$#8豨T*Ų͉b$k^ Jp8,[MMM ܾ}^Sq%Y.x]eHֵZ-EW-'A vw<9,t:Mt$f/W_}ueeaNnooZTC$eBPMU*xq(VHC&D(DHޕ* AL&S&d2PםNF؀zG``h0 4g@=&JQMplvCַ>@TZ, ö0 S*l6].WRf`0d|>uҞ8irw> RR?@0}B=_%>E㩱~VKQ0~8^{ !x@@x<>>>JAَUd t:Zp8߿Ny׻GVGRVX,G^/&&^w}}]Qlt~;O~"!ryqQl=g4_|9C*jeb d,d2 ]ډDhL&p8* a;Kt,xwܱX,[[[z*MӃ{tT*qORў/J*Кƞ1gxjH*j!G,{=egP( 477bb!l 79+ED&:Dt4ΕID7/fsKK 28c PmZxTqQU(RI㙛V ~u:]$ZÇAA>/JJrhh {8}  z~eeݻ.СC`fv\vp Cd2ARh4kJDė~+΂<ɓ'8TF"=LEψj bj*JٲL&s}h+755-,,b1Zppppqq1T(JrAic"HB9:#HΞY>kZFO-5ѫ0{0Z]el`^ʫT*`I|>X]]b蔒oߎoǽa5d2 6E$ %1*s(B(NNN*g-}__S2PכLh:m7$I}VܚhM[VMAƐQC2D"^^X)|֋/X,!IXvG}Ir ;EӜ,..b3!FĜ'Nf`0(3zXzz?E2/I*CCF1?!۸{]ݪ"j]OOKsb Bm#{^\ }Ϥ(PN0;A $˲(L&WTLWw:"An)umkڦ&Z]]miiy!>/< * 9>> ;_5Htji/ 8350\V錕 U,oܸǷ~ӟB7o~r,˲$If^^(r!ƐdYNgV/ Zh x ʰyxp%"EQ$h#TUx TTL,_ W >cp@qg$I@ŗ({ޣlZX Ӄz*_?  E"G JXԞZ=&qRXmJ"MӒ$uwwG, wP:nE$aDrlcBr;L&4M44,`ߥ4FB`2:BA>JeBdn޼)n@P0$uhhHɲ<;;;99IQÇ[[[iV*IBo>>_,˲,zf3g666߿uwllvsssW}AV ó*Z|1b40}}}PHSN}heeeeeiCmd4ܽ^#G&&&F f.S%$Š^c6== JC|[B끊HRp8"Rq2pd54 \bP@ + <j-J|i,B^(J:* AXlmm PE2zl6TVA&&& w}Ri4Z-sG&s d2ccc-jT tj hxM 8NA9:gca EAjI EXeR^OQ,UHPc>l6᧫P(  aZBlYR*(gtG~ҳNُz W[$@ J€tpEQ7uc@ <1]\.OLL^X$ 6QяT%[YQQD pq|+/I=C("W3_İjW8cXJ$ --`"N盛AA\.t:!~ fX3N' 4 4MCmJ"Rt:x8-//C*d2Rd2'u?sI?8k4 ÖAx,K:d2P(DQ4p8o0@(aPVd2i4KB IeY88$Cl2 +lN&@F l4o2 x߸B!L%G5sp?EQh4͙#(ðm͖Pmz{,G l4^? Rh28ieUG=xrr!T[[[PɓB&@q0L[ .X3l*@Og?GAJ&GRz"jmme9HX,r U(bXysCC@PUV)'xyoh ^o^/Ba1YH8ZBO71L&noLJIC ][.?x IDAT[s:ַs ܼ;d2 QDb^$cIJt:XgF3§ eu:or"סeT*zjaH9˲p|>j1 r˓X]]&ţ>dYd26^I_4rܭ[ 'DQ?A I|i1P("3<;!ݺ1 3%I---~_EMAGh!!j<000==h)J|(fm^ZZN|>NC %h6df/\zG;|c/,,3\FOΝ\΍F ÀJԓHR!Nښf ,pL&TQ+++===Z?/h2"H 8|*f#B(NsUThP* ? utt4DGGdzPXGюல@bg,|Rt80 OcT*$IjUIA?q3~?pc~ڵE ommMROLL8p]699Y?X^CWsXt5ɴإK^z{e2gϺ\/b"/7|R\r_n9siςp8 dӣT*%IzWp{{#Gv:ONNۏ|ƍ[[[AzFc#0]]]4MB!T*fGG fffh0p Yq0"SSSf9 ꁁt:BSSS *'VVVT*UKK`jkkjZGG~zcq Ð$%IR*P`Vggg\.ם;wDQ pX, Tu:]ooN@Oc X[[3L6>}t$T*Sy/HQ@&hjjtkkkJ󭬬l` øl6 ݔ68K|FPoo%–i?S@cL֖|t3,\tT:~Q,bE677SD$IN܅כC-!o] IRRi^Z\\L?BbXTbY6˽|AR(_"L,x_(޽{СCj֭[v;Ssbꚝ}7Id&LK[[[~h`B,;ԩSp@ P(v΋/D" սdR6`b2L*d2^6Dȑ#Eue;---xHB~} fِՠy ܾ}{~~~11qҥ??>^siB~'''^o(l(|H68~8 5tzgg%QZ%J61 S#Dj---r|ffiggd2mll;v PsrI=3 <%`P*h4 KKKƍ(@ P477k4lnnj(677߿k_Z *YVA,*!6^`X, x^h6#h4'VzWVVΞ= eeeEhZV4??|- Zaf4Y=vX:GEDmBQw8[nn LǑ;׮]C9l6իW^zip8ch$f:$IQ'~zA\yZm{|;nM(l!|;.\P(b\,@Qf*Wz{ݹs(77 Z-")>+LMMmnnp7~? h@$D"8 q\`0JO @"Ha{֭@Tċܬl766P7r'͢(1n/\z;L\.l|{5rN5ŠcL5MR};E}K_Bniiz8*E`vI3gT~V$t(acwuuU>V=w_9FAr[A0 CGHð}3L===(kTy|CCCτe%1 _B.ollr镕Q\VQ湳s{{{{{L&{wl |>7ot:-AX]]lx<  x ߁~/J띟Ghw˨fsJpx#J$Bnmm!Btoo^OW~717587 B02c3+NOSz.`%N^@+\^>Ɵ4M/--Uool1QG|JYU9lϟwf2PjݹbwGdB~/žs{ I 'O J^+[[["hE|Y Z[[}>bAl6 >`ppj{( ?i޽{lvggf2p8t:ݽ{36#aOvv :D MәL-u٬(2MM@'arrj:Εǣ $:jB[uJr{?ƙc4YgaN!J޼yMѬY,g jL n "''044tܞL&CU=u+V  */A*ݶZ60X,L&~ZahH9/jKQ緶O:%ǑL&b˅e2P(*K,ˢ'tD80rوA鱱jyZ=<K[kJB'z\^`688h\.W:ccc>իVj"fS.O>J*b#G充n ^W*l.fpx\G~9%'&rqu)f2%t޽Kr9==ǂL&sSSSfsV 3,1u'9˗/7ZFUןdgDxi CXD hwFhg^ncp{:Zo$IV:\TBT)&twwWFVO([ݍUWe*5tΚjpuwW='V'p8Lq|87k[[*L!w W׷1 Rx4*JtZX /ϛB<.r1L[lcJ*3 v+X,ҨVsBx& iguuu4Ʋ٬FTp@ P*T*]]]u8cxX;t( zP*aχ ys0a^EM84MR) 8.c4ڛׯgwO!YZZꚜ|SXD2;;ՕFŨP(lmmLLL=z8DBB R)bdgggO>=;;;88#333fwnׇܸ zH$g>j&VQU*U__ߥKj~D1<̌EڡP!#嶶B|y޽{=zƍF%U3M``E)?^6:p 0X?p@+Ǐ#}ō{& V$d2d*)HDB" l6aJŋ[ZZQ(**]|rqg4}>L&3.]|:"@6EoofQ޽;;H$L"d2 O]ְˀv7vFuo_*bXY[[[[ZZJJҩR$-q۷{t:/LQH&, crQJꫯ=QD4u H 0 `8{8X{T 0 {~ی,c6)EQ ycPOOe^urīd~sn޼0L&A^`4MWXWWRw/9sfffµD"Y7J9sŋ("mzB }&pjm6[*p9zhL599YF.rF+W =B>_[[dchlf9˝8qb{{ȹ#@$IRT={|@ t:nG cccpAr՝Lu[ͥY]]|58#nfa"@pmuWX%v, +Ejsz{{x$Yա(fB!4Rr!qw:r!mJueӉ6 :`0,//龾><44\*8t[h4.//d2LlR)R7AB{ Y bj*4*KRlQgV0\__R{~ш؁MMM@ Evk2P(J@`z5M8d2>+JLV*Xqj.1bE?C4u=챻GldH$Y{S1ۏ0,PrT4@2%{UR쬼_8fl6Yi(*AJ.#dQ=JCPEMt]f_ Z}I$naz뭖'''ܻwVL533366Ad3~OɦDd,[__ǰN*ΝOQsy>"d=LU&uuuaԳhGG6V'd++i\EQDyVNXZ{d;yՐgzvWUF~R LC()KJףVcRa&kccі7`gg6 r`YR_[V7@;޽d6r(3LKKC·KKK###Hsgg[,xTϞ=A㝝`PEEEjGaԺ :::xsss:Fy>33!(jcc)LOOf277^ݻ700@vSS˲+++nt,vdrR qojjZ[[32L.ϛV4g=1,{y~m䜊ի?2㯽ڻ+JU*D"d! T*zfzv({qfڢh"h46 u" t:t:cepv45AyͶ߯hɷ2ZHW'ɭ-=ŵc8DaZ0)9 ]&P`Sտ3Ig}9vX8FRǎCTD"t:/Fq8ϟETd2յԮ?nZ ZJ(j~QrL&*x<A$iX2̙3g6778yaaEn,>z(EQlII:uS lmmafXa[[ A ecz}KKV=~&:J6L%teֆԤуjb|fv5zplꎶSN'%9( dg688855eXT~}]TzT b\CC{͛oViv:`pd2uߏWNL&ziwwsdHϋX^Sq uI]`4}01@ 0:c /Xob X#M<{7_%ÁhjȞd2zdd2V[[[)2 RT.k4T*d:rH4QTZYVJؐHbq CCCkkk/<"ʹ#6EF"Brs0<_q@RBVT. hZJ ڴZ-Zt:D /k2?2lgg&ddX$i٦Aʗ~;o~0Є B yOƄ@ s8BP4z"6Vt F|;M&ntJs5ZNJEa)-XXg*@VaruHozJ`tz[u <9T dGkp8 Q~F7cWx8ؚ z5zBTpsKeYSEU*jEj늳Jn얤L0V^~Hc7IRȩpwAE^onnޞd#T6hnMT yQ*B$盛Os IDAT>Z8Lvvv,-P[@^jzPG&ԠP(`T0\=G!y8 > ̃X_^^H$ LMM Tw޽{7Jk;ս˼~+_ʭ[d6kR)lnJ7Өկfe!awv| (wl;|2Y+LfCçOfT*D"v$K.}sSrK;;;JUt٬GvhpXonn0r۷Q⻻SKl7[ɲm6[uD"htrrmd2Ykk+<P(zWe:::^/A EY[ZLjhf)rN'@`qb EqNT)eQB\NbX B>[AR8&=x`OlaoR|L&LVbRM&7n@]/rynn.J8^.x O|୷Blx<FJb:CŨWww ɳ0 35Z:@ ,--Q,|d2)߿p8DK Ǒ0u 8ΦTrVtz]2Th4hzo290wXX,H75~?b8!X>OI$F_UQUJ@< $yDcٿb0 0o@' 8;$ ‘u1n)" ZVU*o&h4VA0-qw|꾡+?Z2`g`P ?lhhh9<@.(@W H$(B[[[ccc\iDRFGGk ڿX,*J$׈*?E1LjY]\\+J bY6 9'@}7^{5uz|4 jTZcEV j"I/ɬ n܇BJjjjtd2Nk4D0 COR㸗^zj^tplmQe)"A(* 0 45bYS4c<q++X`u@a! R נÏ8?D'K.XPpC߂n !IO{C}4 vRDd>áV;::P9.y^o2Azmmmsss|ðp8q\\{', IX,ԝL&)j$Ivtt~ٹDZZZi큮fC5Mm [>}h4ЯT*RikkD" R<\}O'''vvvz{{_aR 4M"0z>I.d2lo6lVV#x<.:;;cEf)Qʇ;{ h.$ @D!XR-`X{v } 9x?|e1=$gAd$Zu-Hjׇ^ % ͉A{Fq-մACyN bT$I:BPIC>陝D",sAc9r敛o˲,nmmYGFiJJ$Dx[ZXX8.c(lQy+@q?4G;6ȃ#2gnKӨL޽jj\NfKKBA&HiA0՘#dE@ &hFΝ;DBeYD5tiy3p/sg0eyX,gϞEzܚ F+ɒbQ̑+B'ԮoB[@ 4g?66vt:]H$rm(RP(_yÍ_N$F5\.R\.977YiZ#qgΜafrrRPin`f$4>[N?$h_(2XMWIMMMlzi$њdnܸ4B% qccccnnNENGt>/ BE~:I nf tZb(:qduď ELCފg@ۖEF^o(XoX<[n^@ < pڵǏy*~|U(H($l6Q(8:Yy|'T*U8NӱX,L*J#NC 6ekZm6[:-h4?w#>R6&BWZiX;>h`Ҿ+W~ Vdvl\0_r&qErNO:e0"{<$#흛STO<׿Yq`0aK1Lj{&IRku8.=#W1 P٬D"<+03ZX yAn2ߴ\.jP*R _#R7_DdʟNyN=qӏbr1h<ͶPD5Ν;\T?j=v~8Da_[V( v i['R,˾h.ڰma\>q_*$gټJX @ <+D, Yv0 /jb|MyQHQWVVs H$o咟` @`@wiu#fU7Yu䂂O|#NOPI2!F@ A^X@30Y5 ʨ,N (b=qK @#k@qtcǎUԙ߿_$w ǏB0QCzWWT*%T*U{Kڨ~!ﯬ' @Bx( SUzNSP]\ /p$JnM$ }Y+l&n| ,a`YWvɈV?p 5zhSQ'3L׏loܸa4ip8\.rLi~@JLΝ#IrccYW}t,,*H$ݾG'( ^ђQ<|XxP}5;3b:#?zރ/HOyf~.~R.^`:ӧ`ZLӁ>5 4/yޙeypP( |>?88Ȳo188hٮ_n2(.H @ 0;;\,AEQhDIr ߭#.A_S%9@% ,'[?TT 5=?Xa@A% |'###.]*"kK$Ñfnw:F ܽ{d2YVtƍ!P$ϐJj5˲L1jX qR-E@8T<wR+ pO|Ǩ"P:r҉{BKf 4iaxrP!NQ@.[XXB'NfDѣ;G Bvvv 0;;T*|6}_CFϛ+:@׿z2 4@@B^z^TeDQT"p݋JpԆb(4M$y֭ý6R4Lix J+ w G"x<7of2s@wwLm'O!IO {Qr5?aJh4ZZ#4UGVF::= HcX&QtZ0Թ `p$V(iL5ʧB^"Ȭ# _##+W2L,kkk͕x,xҥh, ",[. CXD\f8P(w R.ّ-g|6[ vWWVrR1 x|m@EQQP8ޞl6 % !ylkk&HwT*pt Hrqդ]E$绻'zଭiZټO&\~p+Kq6Yr`-~Pс9]W6`so\ڪEɲK(8Q< Xr~ΰ [:~{"DvDIfRbȲ&oX(`1]9!KoXnB0;;= o...>oxV`fmm-b1d|r\fYVպ\.DCP\E1.,,,JxG*fJ\.cx [V<( "}b(\.h\.qOOEQt#j|6]__yX, ztZVϷ_*t:/x1%1 +x_ZZwqht:RiłaZt8N\n6766N3 `4Kfr׮]0G.[,oZyi֭[Ifyii) ÉD~ɄNә$(^|YRI$]- Hl6[6u:t:L I%C_P$)"2 ^waaARIRTWD477l6( 0ñF$ A:.H$FFyW端VyZj0ȭ[u[}\g H[!s|x"VXs]k ""ݕD"qH$q<ϧl62D"Qo/b.[\\h4 Jly_2FC R |>??? iFh4z^PVkN&&&O<w2;OS8sss$IV}@QJBhE  G"`0&.KTrQ;;;n[ѠEooRHM#C]P<ϲj*jxx8{^J=33S}]ӉaX8F9ʚYN̳,OVj){C竂P%%bU´ =PnI%L7(X}h~HT"xE_kcQ0="t|t zV?<܃@  Y |z0(AaA#I*]d@:nռT*ꫯV.>v"tH_!sK(8^n f]]] B]KG!{oJwWiqw$eЉ`_Oy.@eX cpM[7u %4#5v?@V߿5y#uHC_ 6@[,Jl0|4Mw $\. p8<iy齭jHyԁP(:;;5Y P`0So!b%XRjqu*լ PTvbRL&KzޏD#ҶG*+p)JI$B&1 S. P:j<ªJ._Lٳg+ݼ7JCʯЏ} IDAT訖o[^^~ ;^&ᇒ擥ӎ 8sk~ꐯAN^(ty[ދرceyy]z_ 4MOW9njLC B˲dq=8!-Jȑ#.khht-Vq>@ p\z)J<п ,[J;gN# SzwZR}Vgg/}O<ɔ+kZ/`kn{ggtX90( -&R)s";"nŃbI*riڦ&ǓfU*IRAР^} T@l6RL&+ǡa8#/}K`۝NaJ Nw鹹9RYXT*Vcǎ1 ĉW\}6Mַw2<&NxIJ 8ŚN}]tAPvh4d"ɗywss,imm YV9?I.P,x[Y-_P,].WPP Ֆm:;V 36[az}li@bZ'$XdAYTe)[Bf0 ${ 2 #J9X*J>44閗SBP*Ղ2+fy7??ŤRѱqq<+x@U D^BGd@Z=fqqP(QeOan?yؘ(z~kg+b2lll߯ya6٬fCT]$v;aHdxxh4^p_!Nfrn+ziP.AD7߬Lĉ'N|w* ͆NϟrEz4atNPt88a\c/Quy3F7}Z:<0h{=Of%eV8G}@&H$ ԑC RTuwwbbB&L&#Jr:@;!,JFcGG`+++HQ`p\w]]]e٤1 yDQB꺮h(JV8 CCCbqjj*HlX,H$FFF8Ge~B1==}𰾾> ~ 'Phnnn%Z\-`-[oՑ9•+1je={m[u&KG:]:R|ۿ9Lew0pAJfe2L&H$lkL&S,C١RYhff&JAI@~ܫj6!OP詀x&%U)~ :::|>`P?T*$JC>w\8r ._*ai'''+n{BMNN~ROZ\\looojj"ן_x@4d29??o20 lٌrKwzBT'4qS_~O:\.p8>CV54R/<!ّ$d>dnl B\.WWeJ"Ԙm$H?у+AԶ_۟N L_2i?7g =ی 0e(Q$ӂ9QI($i6 ###V5 "YB@R$r={ˀ$. \.NQ \. :H$L=Yl###assRT.k4B$dۭjmtԅ LA[79Kݮճ,?7J&HY&!aNñ ^swrFݸD"Li `n}I&mmЋ,419feܱE#oQw 0*p=qlv0J aL& I8CwLFd.CNW(lX,N )lmm1 FY /v8a^/677yA|ECRT*!5d2Jm6[ss띙9ڇNpfُVn*?9g,@XIݪ&A@4/BNCapN ͣѣ7n7o$7jM.ӈVza-1 o/ufga6La`UmY2U?2`M.x|An5&*`A s=a?}`duې:uth0P(dPC\E<ǩj$3 MA d2ȭX,J$D"/JDžSaЏ67RvT|> 4 v jiF]lFz,..*x<DAH&ՒbO&tf&t*r MQϗ5ݘ\.7Z_LO'ΝsD" &7X~RJ ] h5S<P>Gawvx[0;%`6OTW*Ñ67E0db ZG3mmmݽ{7!C*#h4L^x1 X,)p:+7( \N$IHq l'NpdۑHy_^^F ^BЃ_zZLYz$V1XzE\CT@5t?` 0oC뽏@>`T@gj3 ?CzVmv"a뀛W(Gd 荺Z[[* d-rID+'DkAAr{Q'TEB4,FlNRkkk Y-"sΙL5q\Xr C1 iZ"hZ͖d/=) Qælx4JJB&Õb,J{ LrIZ[5 4?3s}g~ØՕWRX,/$?X,ӏ ggg^1i5ȝc0,ilٕyb=5HN*UJ%r{gytc0xxӃyཇaLonr.v6I%j#E$IEd1vQR>TF`{M Mk@W%< }-d["%Me à( BG (TYe}>_[[LMMMNN2EQ 躮nZnaa-(Y%=U+ P~(BYZ\Es}PX'pWUUDt]GFaD:R)ym΅ ٬)"j4*z($LNfy-۟L?FͻE*auAZXLӴׯM^o}}=5#SW5[ %u*# n' 0|~aaPeaaAP(dRruA-P)vBQ/˲,?EEQ.,--$iffmz+ T PO0լ( 0hW^t8ڊn ;b/}sgϿEpӷ5*;5563N\{~P DKJ Q,Ғ8Ãu6P0E*+Ŋ`_Ѱ%LEQ2 ` A-#2g(9[,PL$0y< HQw}R(+++(\$I @Ⱥ7}_zi9<4<_hmz;@L&yEaYvjjp|>ZH隟Guz&^|yxxKx17$ Bz%* S$)/"#{_@4 E|s!0^,*&C^S/~f3 lM&KKK[fKKKQ]k$">Qƥ(KKKZ]8l^(hTUd2YWWWQQ!T*(nWUUi$aX!_4UUc UVV9r

2 GPIV

2.1 Starting up

Gpiv may be launched in different ways. In case it needs to trigger the lasers and camera, the RTAI and gpivtrig Linux kernel modules will have to be loaded (and unloaded after closing Gpiv). The gpiv_control script (from the gpivtrig package, which also includes the gpivtrig module) might be used: "gpiv_control "gpiv [OPTION1] ... [IMAGE1] ..."". Gpiv_control has to be run with root privileges. In case no trigering is used or if the modules have already been loaded in the kernel, starting the application is straightforward with: "gpiv [OPTION1] ... [IMAGE1] ...". If the modules have not been loaded in the kernel, a warning message will be displayed and the trigger services will be disabled.
The Gpiv console consists a menu bar, a tool-bar, process toggle-buttons, a tabulator and a data buffer list (Figure 2.1). At the bottom of the console you can find an application bar that displays information of the highlighted item as well as a progress bar that displays the progress of the running process.
Gpiv reads its default program parameters from ~/.gnome2/gpiv following the GNOME mechanism. These parameters are defined frome the Settings->Preferences from the console menu's and may be overruled by command line keys for the current session. (Invoke "gpiv --help" or "man gpiv" for information about the command line options.) Apart from the Gpiv parameter settings, there are also variables to ease the use of the program, which can not be defined by command line keys. These variables are stored from previous sessions (like the last displayed tabulator, image base-names during recording or the last selected image-name during loading with File->Open). The PIV process variables that are used for recording, interrogation, validation and post-processing are read from ~/.gpivrc or from the system-wide available gpiv.conf (mostly installed at /etc/ under Unix/Linux) respectively. These process variables are shared with the programs from the Gpivtools package.


Figure 2.1 Gpiv console with image recording tabulator. This tab may (partly) be absent, depending on the configuration options during the building of the program

2.2 Menu and toolbar

The menu bar consists general tasks for Gpiv, like file-handling, preferences and help menus. Underlined characters represent the ALT short-hand key for launching the menus.

The "File" menu contains "open", "save", "save as", "close" for reading, storing, and closing data and "exit" for closing the application. For reading and saving images and data, Gpiv uses the Gnome Virtual File System (GVFS). This allows you to load data from an other system (server) you have access to, like ftp or ssh. Loading data from a server is done by typing Ctr+L when the filebrowser is open and typing, for example:
ssh:///my_other_account@another_system:image.png
or from Nautilus (see below).

The native image format for Gpiv is the Portable Network Graphics (PNG) format. Image data may also be read to or stored from raw binary data (name.r) that is accompanied by an ASCII header file (name.h) or HDF5 (name.gpi). Images of formats that use lossless compression (tif, gif, pgm, bmp) are converted to PNG during the loading to guarantee the storage of all header information. To save disk space, the original image will be deleted. In case of cross-correlation, it is expected that the second frame is attached to the first image frame. This may be performed manually with gpiv_combing from the Gpivtools package.

The maximum image dimensions that may be used are defined in gpiv_gtk.h by IMAGE_WIDTH_MAX and IMAGE_HEIGHT_MAX or by the options --enable-img-width and --enable-img-hight of the ./configure script. The maximum image dimensions can not be changed during execution of Gpiv. In case the image dimensions are larger, ./configure will have to be executed (or gpiv_gtk modified) and Gpiv will have to be recompiled. In case IMAGE_WIDTH_MAX and IMAGE_HEIGHT_MAX will have to be redefined, it is recommended to set them at the minimum needed values in order to save RAM memory usage.
After loading, the file basename is displayed in the buffer list and the complete image name is displayed in the "Image Info" tabulator of the console. A display window (or viewer) is launched that shows the image together with the interrogation area's and its name is displayed in the application bar of the viewer as well (Figure 2.2.


Figure 2.2 Buffer display containing image, Interrogation Area contours and data

Saving the image and data is done in PNG, raw binary or HDF5 format, depending on the program settings or start-up keys (--hdf and --hdf_img). Image data may also be loaded from the Gnome filemanager NAUTILUS with the "open with.." popup menu or by "drag and drop" of the selected images into the buffer list in case Gpiv has already been launched. Typing Ctr+L or from the Go->Location... menu of Nautilus, the filemanager can be connected to another system or server by using GVFS.

The settings menu contains the menus "gpiv buttons" and "tabulator" to (un)display these parts of the console and "preferences" for defining all Gpiv settings. Closing the "preferences" menu with "OK" stores the settings for future sessions. "Apply" only affects the current session. When settings for the buffer display have been changed, they will be broadcasted to all display windows when "OK" or "Apply" are pressed. "Cancel" closes the preferences window without action. Some parameter settings (image width and image height) need to restart Gpiv. You will be acknowledged in that case.

The "help" menu contains "show tooltips" for obtaining additional help. Tooltips are small windows that pop up when an item is highlighted and contain more extended information about the item than can be displayed in the short line of the application bar. The "manual" menu shows this document. "About" gives short info concerning this application.

The toolbar is a quick way for opening / saving / closing images and data, executing / stopping processes that are enabled by the process toggle buttons, which are found below the toolbar, for closing buffers and for exiting the program.

2.3 Process toggle-buttons

The process toggle-buttons may be switched on in order to define a chain of processes (pipeline). These processes include recording, image processing, image PIV interrogation, validation and post-processes of the PIV estimators. The parameter settings of the processes are defined in the tabulators of the Gpiv console. The pipeline process is invoked by the "Execute" button on the toolbar and, eventually, interrupted by the "Stop" button.

2.4 Buffer list and display window

The buffer list shows a number and the file basename (i.e. the filename without directory name and extension) of the loaded images. Images may be loaded directly into the buffer list by means of "drag and drop" from the Gnome file-manager NAUTILUS. A single buffer may be selected by pointing to it and left mouse clicking. Several buffers may be selected by clicking the first and last buffer while holding the "Shift" key. The execution of processes will than be performed on every selected buffer. The selected buffers will be closed following the Window manager protocol (mostly by pressing Ctrl-W).

For each buffer, a display window is launched that contains the image, squared frames that represent the contours of interrogation areas during the initial and the final step of an iterative interrogation process, a vector field representing the PIV estimators and solid, coloured, squares expressing the magnitudes of derived scalars obtained from the PIV estimators by post processing. The interrogation areas are highlighted when the pointer moves over them. At the bottom of the display window an application bar shows information concerning the data. If displaying of interrogation area frames is disabled, image intensities are shown. Else, the centre point of the highlighted interrogation area and, eventually, values of the PIV estimators and its derived quantities are shown. If the settings of Interrogation Areas are changed or, for some other reason not in accordance with the settings the PIV data have been generated, the PIV values will not be displayed. The same information is displayed in the application bar of the Gpiv console as well. A menubar at the top of the window shows options for changing the settings for the displaying of the data in the individual buffer window. When clicking the right mouse button when pointing within the display, a menu pops up with identic functions as the menubar. Zooming and moving (paning) the image and data may also be performed by the mouse scroll button and moving the pointer (when mouse select is set to "None" in the console) while pressing the left mouse button. In case the display settings will have to be adjusted for all open buffers, change the settings from the Settings->Preferences menu in the Gpiv console. Then, the new settings will be updated to all buffer windows when "Apply" or "OK" is pressed.

2.5 Tabulator

The tabulator contains pages with parameter settings and buttons to invoke the processes for image recording, information, processing and interrogation, PIV-data validation and post-processing. Some of these pages may be missing, depending on the options during the compilation of the program.

2.5.1 Record

The most left tabulator 'Record' (Figure 2.1) contains all settings for the triggering of the lasers the camera. This tabulator may only show the widgets for triggering or camera or may be completely absent. This is defined by the compilation options of the program. Triggering is performed by a Linux kernel module from the Gpivtrig software package which sends its trigger pulses over the parallel port. It uses the RealTimeLinux Application Interface (RTAI), which is a real time micro kernel to perform processes at accurate timings, independently of the computing load of the system.
The base-name of the images to be recorded are defined in the entry. The last 5 names that have been used during the actual or previous Gpiv sessions are stored. The name may be extended with the current date and time.
Different timing schedules may be used. For PIV, "Indefinite", "Duration" and "Double exposure" are most relevant. "Indefinite" will continue until "stop timings" button (or "Stop" button from the main tool bar of the application) is pressed. The images are displayed and updated in frame buffer #0. This setting is convenient for pointing, adjusting and focussing the camera. For the other timing settings, images are stored in subsequent buffers, starting at #0. A maximum of GPIV_NIMG_MAX (defined in gpiv.h of Libgpiv and currently set to fourty) buffers may be retrieved. Duration will only send a limited amount of trigger pulses as defined in "frames (N)".
TODO "Interrupt" ...
"Increment dt" will increase the timing of pulses to the lasers as defined in "inc. dt (ms).,
TODO "double exposure" ...
"Dt" represents the time beween two laser pulses of an image-pair.

The camera uses the IEEE1394 (Firewire), IIDC-compliant protocol. The "Node.." menu selects the camera if different cameras are connected to the computer. All other menu-options and settings that belong to the selected camera are updated and enabled / disabled automatically. "Format .., selects the image format, "... fps" the frame rate, TRIGGER MODE ...", "Exp", "Iris", "Shut", "Gain", "Temp", "Zoom" "Pan" and "Tilt" are obvious. Enabling "RTAI trigerring" will use the application's trigger system. If "record" and "stop record" are pressed, the recording of images and the triggering is started and stopped.

2.5.2 Image

The 'Image' (Figure 2.3) tab displays information of the image. Some settings, like image file name, correlation type, image dimensions and image colour depth are only displayed for informative purposes and can not be changed. The image filename is determined during recording or loading the image. The image dimensions, correlatation type and colour depth may be modified from the Gpiv settings or from the command line keys. During loading of an image it is checked whether the image header info is in agreement with these settings.


Figure 2.3 GPIV console with image information tabulator


Time scaling, spatial scaling, the positions of row #0 and column #0 (related to a typical location in the experiment) are identic as in the Post processing tabulator. These parameters are used for scaling and positioning the PIV data.
Spatial scaling may be determined interactively by pointing a ruler in a image. The number of pixels that are spanned by the imaged ruler may be obtained in arbitrary, horizontal or vertical direction by activating the subsequent radio buttons. Entering the viewer, then, will change the pointer image to cross-hair. Pressing and holding the left pointer button within the image starts drawing a straight line and shows the pointer position in the application bar. By releasing the pointer button, the straight line disappears, the span length is written to the "span" entry and the "spatial scale" entry is updated for the new value. When pointing in arbitrary direction, Pythagoras' rule is applied for calculating the correct spanned length by the ruler image. The length of the ruler that has been spanned, expressed in mm, will have to be specified manually. Changing this value will automatically update the "spatial scale" value, as well. If "span" or "length" are not changed, the spatial scale setting, like all other image header information and process settings, is read from the system wide gpiv.conf or from ~/.gpivrc during launching Gpiv.
The items Creation Date, Author, Usertext, Copyright, Software, Source, Warning, Disclaimer and "Comment" are typical header text, often recognised, for example, in PNG formatted images.

2.5.3 Process

The 'Process' tab (Figure 2.4)shows the settings for some image processing that are often used for PIV.


Figure 2.4 Gpiv console with the Image processing tabulator

An image process is enabled by clicking the check button. A variable is set in the spinner. As a sequence of image processing steps is non-linear, the order of the processes do matter. Therefore, a step number indicates when the process will be invoked. These numbers are automatically set when enabling the process. Disabling an individual process will re-adjust the step numbering of other enabled processes.

2.5.4 Interrogation

The 'Interrogation' tab (Figure 2.5a, b)show all the settings for interrogation an image (pair).


Figure 2.5a Gpiv console with Interrogation tabulator, upper part


Figure 2.5b Gpiv console with Interrogation tabulator, lower part

- The upper-left corner of the image represents pixel # (0,0). The starting point (first col/row) and the end-point (last col/row) of the image to be interrogated may be defined in the entry-fields as well as a global pre-shift in horizontal (pre-shift col) and vertical (pre-shift row). The first column and row, as defined in the entry's will always be included in the interrogations. The last column/row of the image to be analyzed depends on Interrogation Area sizes and shifts, but will never exceed the last column/row as defined in the entry-fields.

- The size of the interrogation area's (I.A.) and adjacent shift, expressed in image pixels, may be defined by entry's (for arbitrary dimensions) or by radio-buttons (which is convenient for power of 2 dimensions) in 'Int. Size 1', 'Int. Size 2' and 'Shift'. The size of the second I.A. has to be equal or larger than the first one in order to perform adaptive dimensions during an iterative interrogation process. Some of the settings in the entries and of the radio buttons, then, may be disabled for manipulation or its value to be entered may be limited. In case adaptive dimensions of the I.A.'s is applied, zero offsetting is enabled and the grid of the nodes at which estimators are calculated, is adapted during each iteration. This will often increase computation speed and the stability of the calculation. Starting by a course grid with I.A. dimensions of 'Int. Size 2' and 50% overlap. During each iteration, the sizes of the I.A.'s and adjacent shifts are halved until 'Int. Size 1' and adjacent shifts as defined in 'Shift' have been reached. The new estimators at the finer grid, used as local pre-shift values for zero offsetting, are obtained from the previous interrogation at a courser grid by linear or, if possible (i.e. an internal node) bi-linear interpolation. Finally, an additional interrogation, then, should guarantee an optimum estimator.

If the settings of I.A.'s are changed after aninterrogation, the PIV values will not be displayed when moving the pointer over the data.

Mouse select

  • "None": disables mouse activity within the viewer window.
  • "Area": entering a viewer window, holding the left mouse button and moving the mouse creates a rectangular frame that defines the area to be interrogated. This is an alternative for using the entries "first/last col/row". The entry values will be updated automatically.
  • "Vert. line": a vertical line in the image may be defined at which a single column of interrogation areas are to be drawn. Interrogation of the line has to be performed by clicking the "piv" button at the bottom of the "Evaluation" tabulator or by enabling the "piv" process button and pressing the "Execute" button on the toolbar.
  • "Hor. line": a horizontal line in the image may be defined at which a single row of interrogation areas are to be drawn.Interrogation of the line has to be performed by clicking the "piv" button at the bottom of the "Evaluation" tabulator or by enabling the "piv" process button and pressing the "Execute" button on the toolbar.

Sub-pixel Interpolation

Selects an interpolation scheme for estimating the correlation peak at sub-pixel level.

Peak #

Normally the highest correlation peak is used (or the second highest in case of auto-correlation, which is done automatically if auto-correlation has been enabled). An erroneous velocity vector, though, might be caused by a high noise peak in the correlation function that overwhelms the 'true' particle displacement peak. Searching the second or third highest peak may result in a correct estimation.

Interrogation scheme

Image deformation uses all estimators of the entire displacement field to deform the image towards the moment in-between the two images have been recorded. The deformed and shifted Interrogation Areas are obtained by interpolation of the image data with a fith order B-spline interpolation routine [1].

In case zero offset (at an integer number of pixels) is enabled, i.e. a second interrogation is performed with a pre-shift of the local estimator, the new correlation peak is found between -1 and +1 pixels. The 'classic' forward interrogation scheme or a central differential scheme may be used. Interrogation following the central differential scheme is done by displacing the interrogation area of the first image with half the magnitude of the pre-shift value in negative direction and displacing the interrogation area of the second image in positive direction (of identic, integer magnitude).

A linear weight kernel in order to correct for biasing effects that is generated by the estimation of the correlation function.

"Image deformation", "Central differential" and "Zero offset" are iterative processes that continue until the convergence criterium has been reached. The total amount of differences in the estimators between two succesive iteration steps, related to the number of gridpoints, is used as criterium for convergence and amounts to 0.25 pixels (defined by GPIV_EPSI_MIN). The estimators are validated on outliers after each iteration step of the interrogation procedure. Erroneous vectors are subsequently substitued (and re-validated) by the second or third highest correlation peak or by the quantity as specified in "Outliers" in the Validation tabulator.

Correlation

In case subsequent recordings have been performed on separate image frames ("Cross") or on one single frame ("Auto"). This option is informative and can not be changed. as it is defined in the header of the image.

The Gauss weigthing check button enables weighting of the Interrogation Area's with a Gaussian function. It is believed that this may improve the PIV analyses as the high-frequency signal generated by the abrupt borders of the I.A. is suppressed.

Symmetric Phase Only filtering (SPOF) is applied to the (2-dimensional) correlation function. Only the phase, but not the amplitude, of the correlation is used to determine the displacement peak. SPOF filtering increases the SNR, by generating a high and narrow displacement peak and low side lobes. It might improve the analysis, especially when there are reflections, from boundaries for example, in one of the images are present [3].

Interrogation areas and correlation

The "Monitor" button allows to monitor the interrogation process by visualizing the interrogation areas, the correlation function and the estimated displacement vector. Coloured areas, that are 128x128 pixels in size, are displayed as indication of the dimensions. The interrogation areas and correlation function may be magnified by the "Zoom" entry. The vector length may be adjusted by "Vector scale". By zooming and scaling, the dimensions of the images and the vector may exceed the coloured area's. For that case, only a part of the images and vector is displayed. Monitoring the interrogation process will slightly slow down the calculation speed.
Tip: by enabling "Single Int" of the mouse selection, each interrogation area may be monitored individually, which might often be more convenient than monitoring the interrogation of an entire image.

piv

At the bottom of the "Evaluation" tabulator the "piv" button may be invoked to interrogate the image, which is identic as enabling the 'piv' check-button in the process toolbar of the console and pressing the 'Execute' button. The function of this button is similar to that of the command line program rr of the Gpivtools package.

2.5.5 Validation


Figure 2.6 Gpiv console with Validation tabulator

Disable data

Put PIV data into (in)active state for further processing. At inactive state the vector color will be displayed red.
  • "None": disables mouse activity within the viewer window.
  • "Enable": puts data in active state by pointing and clicking a single PIV estimator.
  • "Disable point": puts data in inactive state by pointing and clicking a single PIV estimator.
  • "Enable area": puts a rectangular area containing PIV data in active state. The starting corner of the area (upper-left) is defined by pressing the right mouse button. The opposite corner is defined by moving the mouse with holding the button pressed and releasing it at the location of the opposite corner. A rectangular frame is drawn during the operation.
  • "Disable area": puts a rectangular area containing PIV data in inactive state. The starting corner of the area (upper-left) is defined by pressing the right mouse button. The opposite corner is defined by moving the mouse with holding the button pressed and releasing it at the location of the opposite corner. A rectangular frame is drawn during the operation.

Histograms

  • "residu" displays the (log) inverse histogram of median residus. The critical residu value for accepting/rejecting outliers is determined by the slope of the straight line plotted through the histogram data. The critical value is calculated and displayed in the "Threshold" entry. The function of this process is similar to that of the command line program errvec of the Gpivtools package.
  • "sub-pixel" displays a histogram of sub-pixel estimators of the PIV dataset. The function of this process is similar to that of the command line program peaklck of the Gpivtools package.
  • The "U-comp" and "V-comp" buttons display the histograms of horizontal and vertical particle displacement estimators. These data may be stored by "Save" in filename.pdf.

Validate on velocity gradient

Calculates velocity gradient over an interrogation area and displays vectors in red color if they exceed the critical value. The critical value is defined in libgpiv/include/gpiv/valid.h: GRADIENT_THRESHOLD and is set to 2 pixels, i.e. identic to the optimum particle image diameter. This quantity is chosen in order to prevent a too wide, or even a splitting up, of the highest correlation peak.

Outliers

To set the parameters for testing and substituting on erroneous vectors. The number of the surrounding displacement data of a point under investigation may be defined by "Neighbors". The number represents the two-dimensional array, which is typically 3x3 and may have a maximum of 9x9. The "Data yield" is needed to calculate the threshold value from the residu statistics. This value has to be filled in manually and should be obtained from the mean number of particles within an interrogation area. One way to obtain the particle density, is by enabling the "Monitor" button and "Single int" of the mouse selection in the "Interrogation" tabulator and analyzing some points in the image.

The critical threshold may be filled in manually or may be obtained by invoking "residu" button.

The type of residus may be chosen between "Normalized median", "Median" or "Snr". The normalized median option uses the ratio between the residu (obtained from the actual didplacement and the median displacement from the neighboring data) and between the median residu (resulting from the neighbors). The threshold, then, may be kept at 2 pixels for obtaining a data yield of 90% [2]. This setting should be advantageous if turbulence is heterogeneous within the area of observation. The median option uses the residu between actual data point and the median displacement from its surroundings.

Outliers may be substituted by the local mean value of the surrounding vectors, by the median value of the surrounding vectors or by the displacement from the next highest correlation peak. Unless "Nothing" has been choosen, the data will first be substituted subsequently by a PIV estimator from the next highest correlation peak, the median displacement value, and local mean. If the residu still exceeds the threshold after trying these substitutions, the PIV estimator will be substituted by the preferred option as enabled here.

Finally, the validation on outliers is performed by pressing the "validate on outliers" button or by enabling "validate" in the process toolbar of the Gpiv console and pressing "Execute". Validation is also performed after each step of the interrogation procedure if the Interrogation scheme is set to "Image deformation", "Central differential" or "Zero offset". The function of testing on outliers and substituting is similar to that of the command line program errvec of the Gpivtools package.

2.5.6 Post processing

The "Post processing" tab (Figure 2.7) contains tools to apply modifications on PIV estimators and to calculate derived quantities from the PIV estimators.

Scaling

  • "Spatial scale" is calculated by measuring the number of pixels per mm. The values will have to be set manually or may be obtained interactively from the Image tabulator.
  • "time scale" represents the time between two successive image recordings (mostly the separation time between two laser flashes).
  • "pos. of col #0": The horizontal location of the image within an experiment is defined by the position of column #0, related to a marker point in the experiment.
  • "pos. of row #0": The vertical location of the image within an experiment is defined by the position of column #0, related to a marker point in the experiment. The function of this process is similar to the command line program scale of the Gpivtools package.

Vorticity, shear and normal strain may be derived from the PIV estimators with different numerical schemes; Central differential scheme, Least squares, Richardson and the Circulation method (only for the calculation of vorticity). The function of this process is similar to the command line program vorstra of the Gpivtools package.


Figure 2.7 Gpiv console with Post processing tabulator

References

[1] P. Thvenaz, T. Blu, M. Unser, "Interpolation Revisited," IEEE Transactions on Medical Imaging, vol. 19, no. 7, pp. 739-758, July 2000

[2] J. Westerweel, F. Scarano, "Universal outlier detection for PIV data", Exp. in Fluids (2005) 39:1096-1100

[3] M.P. Wernet, "Symmetric phase only filtering: a new paradigm for DPIV data processing", Meas. Sci. Technol (2005), vol 16, pp 601-618

Contents
Previous
Next gpiv-0.6.1/doc/C/intro.html0000644000175000017500000000632611204235560012361 00000000000000Introduction Contents
Next

Introduction

1.1 General description

Gpiv (Figure 1.1) is a program to record and interrogating images for Particle Image Velocimetry (PIV). It also includes algorithms for validation of the PIV estimators and post-processing that result into derived (scalar) flow quantities. It gives an overview of the parameters in a logical and organized way, allows to run the processes individually or in a pipeline process and visualizes the results. Gpiv displays the images, interrogation area's, piv estimators, outliers, excessive velocity gradients and post processing results in a single window frame. The resulting estimator values may be displayed interactively. The graphical user interface of Gpiv has been written with the GTK/GNOME libraries.

Gpiv is one of the end-user programs that makes extensively use of Libgpiv. Libgpiv includes the main algorithms for interrogation, validation, post-processing, memory (de)allocation, in-and output handling, etc. Other end-user programs may be found in the Gpivtools package. Gpivtools contains command line programs that may be invoked from a shell or from scripts. Some PERL scripts are found in the Gpivtools package, as well. All codes have been written in ANSI-C and have been developed on a LINUX box.


Figure 1.1 Screenshot of Gpiv with PIV estimators (vectors) from an artificial, computer generated image pair [1] and the derived vorticity field (background color)

1.2 License

Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

1.3 Final remarks

I kindly ask to acknowledge the use of the software in articles, reports etc. in case the software has considerably contributed to the work presented. I hope you'll enjoy Gpiv. Suggestions for improvements and additions are welcome.

Gerber van der Graaf
e-mail: gerber_graaf@users.sourceforge.net

References

[1] Okamoto, K., Nishio, S., Saga, T. and Kobayashi, T., 2000, "Standard images for particle-image velocimetry," Meas. Sci. Technol., 11, 685-691. vsj.or.jp/piv/

Contents
Next gpiv-0.6.1/doc/C/piv_intro.html0000644000175000017500000001763711204235560013246 00000000000000Quantitative Flow Visualization techniques Contents
Previous

3 Quantitative Flow Visualization techniques

3.1 Introduction

For quantitative flow visualization techniques, a flow is visualized by seeding the fluid with small particles that allow to follow the instantaneous changes of the flow. The region in the flow to be researched is illuminated, mostly by a sheet of light. This light-sheet is generated by an expanding laser beam by means of a cylindrical lens or due to the projection of the beam on a rotating hexagonal mirror. The instantaneous flow is recorded at least twice by very short light flashes with a separation time (Dt) in between that is known. The flashes have to be sufficiently short in order image the particle shape. Too long illumination times will result into streaks of the particle images that will not allow to determine the exact particle location in the fluid. Several illuminations result in trace patterns of each particle on the image plane. Analyzing these particle traces result in local particle displacements. As the separation time between the recordings is known, the analyses directly result in velocities. Mainly two different techniques are known: Particle Tracking Velocimetry (PTV) and Particle Image Velocimetry (PIV). The difference is in the density of the seeding. In literature the particle density is often represented by two dimensionless parameters; the image particle density NI and source density NS. The source density represents whether the particle images are overlapping (NS > 1) or can be recogized individually (NS < 1). NI represents the ratio of the length of the particles tracks between successive illuminations and the distances between individual particles.

3.2 Particle Tracking Velocimetry

In case of PTV a sparse seeding is used (NS < 1 and NI < 1). Therefore, each particle trace can be analyzed individually. As the particles are present at random locations in the fluid, the velocity estimators are found at random locations in the flow, too. Velocities that have to be obtained in-between the points of observations will have to be interpolated. PTV is a relatively easy way for obtaining quantitative information of the flow. Interpolation, though, is only allowed if the smallest scales of the flow are much smaller than the distances between the points of observation. Mainly laminar flows may satisfy this demand.

3.3 Particle Image Velocimetry

In case of turbulent flows, a whole spectrum of eddies occur with maximum dimensions related to the flow domain and minimum dimensions in the order of the Kolmogorov length scale (a few millimeters for laboratorium experiments). In order to observe these large ranges of eddy sizes, a high particle density is needed (NI > 1). This means that it is impossible to track the individual particles. Therefore, the mean displacement of particles in a small region of the image(s) (the interrogation area) has to be calculated.
Actually, not the particle displacements are analyzed, but the image transparency as function of the relative translation within the interrogation area's. For computerized images the image density is represented by the pixel values. By locating the maximum transparancy the mean displacement of the particles in the interrogation area has been found. The transparancy can be obtained by shifting the two interrogation areas and subsequently plotting a two-dimensional histogram of the transparancy. This shifting may be performed physically, in case of analog images (i.e. photographic slides) or by means of a numeric algorithm, in case of digital PIV (DPIV). An other way to obtain the 2-dimensional transparancy function is by (auto) correlating the interrogation area's of the image. For analog images the correlation function may be obtained by optical Fourier Transformation techniques. The interrogation area, then, is determined by the diameter of the laser beam that interrogates the image. In case of DPIV, the calculation time of Fourier Transforming an interrogation area increases linearly with its dimension (NxN). Therefore, a more efficient method is mostly used by means of Fast Fourier Transformation (FFT) techniques. With FFT the calculation effort is related to Nlog(N), which means that it is advantagous for interrogation areas large than 16x16 points. Typical dimensions of an interrogation area for Digital PIV are 16x16 to 128x128 pixels.
In order to obtain a reliable estimator of the particle image displacement, about 10 to 15 particles in an interrogation area have to be present.
As the particle image density is very high, the entire image may be interrogated at arbitrary locations. Mostly, the interrogation process is performed on a rectangular grid of interrogation areas that are adjacent or partly overlapping. Therefore, in contrast to PTV, PIV results in a two dimensional velocity field on a rectangular grid.

3.4 Laser Speckle Velocimetry

In case particles are overlapping (Ns > 1) no individual particles can be recognized anymore. By using a coherent light source, a pattern of speckles is generated due to interferences of the coherent light. The speckel pattern, then, is imaged and recordered. Evaluations of interrogation areas from subsequent recordings, in a identical way as is done for PIV, will result into the displacements of the speckle patterns. As extremely high particle densities are needed, penetration of the light sheet is difficult and care should be taken that particles will not affect the flow itself. Laser Speckle Velocimetry is mostly used for determining of velocities of solid surfaces in transport mechanisms (photocopy machines, for example).

3.5 Other techniques

PIV has been evolved from photographic PIV in its beginning , some 15 to 20 years ago, that interrogates the slides by optical Fourier Transformation to digital PIV, that uses CCD cameras and computer techniques to carry out the interrogation. Nowadays, even three dimensional PIV within the light sheet is done by observing the flow with two or more cameras that are looking under different angels to the area of researchlight.
Holographic PIV does not have the restriction of the thickness of the light sheet. It allows to research a region in the flow that is defined by the coherence length of the laser source. Their analyses result in three-dimensional velocities on a three-dimensional grid.
An other technique that has been reported is 'Global Doppler Velocimetry'. It uses the doppler shift of the reflected light from the particles. The doppler shift is then recorded on an image. Time averaging is needed in order to obtain sufficiently signal So, this technique results in time averaged velocities at every pixel of the image, instead of every 16x16 or 128x128 pixels in case of PIV.

3.6 References

Ronald J. Adrian, 'Particle-imaging techniques for experimental fluid mechanics', Annu. Rev. Fluid Mech., 1991, 23, 261-304

'Particle Image Velocimetry', Measurement Science and Technology, vol 8, no 12, special issue

M. Raffel, C. Willert, J. Kompenhans, 'Particle Image Velocimetry', Springer, 1998

'Application of Particle Image Velocimtry, Theory and Practice', Course notes, March 2-6, 1998, Gottingen

J. Westerweel, 'Digital Particle Image Velocimetry, Theory and Application', PhD thesis, Delft University, 1993

Contents
Previous gpiv-0.6.1/doc/Makefile.am0000644000175000017500000000005111076052422012200 00000000000000SUBDIRS = C EXTRA_DIST = Makefile.in gpiv-0.6.1/doc/Makefile.in0000644000175000017500000003511311204234173012216 00000000000000# Makefile.in generated by automake 1.10.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = doc DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CANVAS_AA = @CANVAS_AA@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONTROL = @CONTROL@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUG = @DEBUG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_CAM = @ENABLE_CAM@ ENABLE_DAC = @ENABLE_DAC@ ENABLE_MPI = @ENABLE_MPI@ ENABLE_MPI_RR = @ENABLE_MPI_RR@ ENABLE_TRIG = @ENABLE_TRIG@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GPIV_CFLAGS = @GPIV_CFLAGS@ GPIV_LIBS = @GPIV_LIBS@ GPIV_UI_CFLAGS = @GPIV_UI_CFLAGS@ GPIV_UI_LIBS = @GPIV_UI_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ K_TOPDIR = @K_TOPDIR@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MPIRUN = @MPIRUN@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OVERRIDE_IMAGE_HEIGHT_MAX = @OVERRIDE_IMAGE_HEIGHT_MAX@ OVERRIDE_IMAGE_WIDTH_MAX = @OVERRIDE_IMAGE_WIDTH_MAX@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RR = @RR@ RTA_TOPDIR = @RTA_TOPDIR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = C EXTRA_DIST = Makefile.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic ctags \ ctags-recursive distclean distclean-generic distclean-tags \ distdir dvi dvi-am html html-am info info-am install \ install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gpiv-0.6.1/man/0000777000175000017500000000000011204235560010241 500000000000000gpiv-0.6.1/man/gpiv.10000644000175000017500000001612311076052422011210 00000000000000.TH GPIV 1 "14 December 2007" .SH NAME gpiv \- Analyzes images obtained from a fluid flow by Particle Image Velocimetry. .SH SYNOPSIS \fBgpiv\fP [\fB-? | --help\fR] [\fB--usage\fR] [\fB--console_bins \fIBINS\fR] [\fB--console_tooltips\fR] [\fB--console_view_gpivbuttons\fR] [\fB--console_view_tabulator\fR] [\fB--display_background \fIINT\fR] [\fB--display_intregs\fR] [\fB--display_piv\fR] [\fB--display_stretch\fR] [\fB--display_scalar \fIINT\fR] [\fB--display_vectorscale \fISCALE\fR] [\fB--display_view_menubar\fR] [\fB--display_view_rulers\fR] [\fB--display_zoomscale \fISCALE\fR] [\fB--hdf\fR] [\fB--img_fmt\fR] [\fB--mpi_nodes] [\fB-p\fR | \fB--print\fR] [\fB--process_imgproc\fR] [\fB--process_piv\fR] [\fB--process_gradient\fR] [\fB--process_resstatst\fR] [\fB--process_errvec\fR] [\fB--process_peaklock\fR] [\fB--process_average\fR] [\fB--process_scale\fR] [\fB--process_substract\fR] [\fB--process_vorstra\fR] [\fIIMAGE1\fR, \fIIMAGE2\fR, \fI...\fR] \fP .SH DESCRIPTION \fBGpiv\fP is a Graphic User Interface program for recording and analyzing images obtained from a fluid flow that has been seeded with tracer particles by the so-called Particle Image Velocimetry (PIV) technique. It allows to have a quick overview of the process settings, easily changing them, executing the processes, visualizing and optimizing their results in an interactive way. The processes that may be performed are image recording, interrogation (resulting into PIV estimators), validation and post-processing of the PIV estimators. The settings for the PIV processes are subsequently searched in \fI~/.gpivrc\fR or in \fIgpiv.conf\fP (system wide), which is provided by libgpiv. For recording images, \fBgpiv\fP recognizes (CCD) cameras that are IIDC-compliant and connected to the Computer with the IEEE1394 or Firewire protocol. In case \fBgpiv\fP will trigger a camera and lasers, it uses a kernel module gpivtrig_rtl from the gpivtrig package that depends on the Real Time Application Interface (RTAI) and RealTimeLinux. Trigger pulses are send to the parallel port of the Computer (/dev/lpt0 or /dev/lpt1; see the configure script of the gpivtrig package) at bins #1 (camera), #2 and #3 (first and second laser respectively). The program may be started directly if all modules have been loaded or by the gpiv_control script, also included in the gpivtrig package, which takes care of the loading and unloading of the needed kernel modules. Currently, the trigger system is tested with RTAI-3.1 and the linux kernel-2.4.27. The parameters and options to be used for \fBgpiv\fP are obtained from ~/.gnome2/gpiv or default settings are to be used if absent. The settings may be changed or updated by menu->settings->preferences. The parameters of \fBgpiv\fP (not the PIV process settings) may be overruled by the command line options, as explained below. When \fBgpiv\fR is used on a (Beowulf, distributed memory) cluster, the MPI-parallelised program \fBgpiv_rr\fR from the gpivtools package is invoked using \fBmpirun\fR. The \fBgpiv\fR program, however, is launched in the normal way, without invoking\fB mpirun\fR. .SH Options .TP \fB-? | --help\fR On-line help. Besides the options of \fBgpiv\fP it also shows the additional GNOME, GTK and GNOME GUI options. .TP \fB--usage\fR Display a brief usage message. .TP \fB--console_bins \fIBINS\fR Number of bins for histograms of estimators at sub-pixel level, performed by the peaklock process and of the median residues, performed by the errvec process. .TP \fB-t\fR | \fB--console_tooltips\fR Show tooltips. .TP \fB--console_view_gpivbuttons\fR View the \fBgpiv\fR buttons of the application. .TP \fB--console_view_tabulator\fR View the tabulator of the application containing all PIV process settings. .TP \fB--display_background \fIINT\fR Displaying of background: \fIINT\fR = 0: darkblue \fIINT\fR = 1: black \fIINT\fR = 2: first frame of image \fIINT\fR = 3: second frame of image .TP \fB--display_intregs\fR Enables displaying of interrogation regions. .TP \fB--display_piv\fR Displaying of PIV data. .TP \fB--display_stretch\fR Enables automatic stretching of the display when zooming. .TP \fB--display_scalar \fIINT\fR Display derived quantities from PIV data: \fIINT\fR = 0: none \fIINT\fR = 1: vorticity \fIINT\fR = 2: shear strain \fIINT\fR = 3: normal strain .TP \fB--display_view_menubar\fR Enables displaying of the menubar. .TP \fB--display_view_rulers\fR Enables displaying of the ruler. .TP \fB--display_vectorscale \fISCALE\fR Display vector with index: \fISCALE\fR = 0: magnification factor = 1, \fISCALE\fR = 1: magnification factor = 2, \fISCALE\fR = 2: magnification factor = 4, \fISCALE\fR = 3: magnification factor = 8, \fISCALE\fR = 4: magnification factor = 16, \fISCALE\fR = 5: magnification factor = 32, \fISCALE\fR = 3: magnification factor = 64, \fISCALE\fR = 4: magnification factor = 128, \fISCALE\fR = 5: magnification factor = 256. .TP \fB-z\fR | \fB--display_zoomscale \fISCALE\fR Display zoom with index: \fISCALE\fR = 0: magnification factor = 0.5, \fISCALE\fR = 1: magnification factor = 0.83, \fISCALE\fR = 2: magnification factor = 1.0, \fISCALE\fR = 3: magnification factor = 1.3, \fISCALE\fR = 4: magnification factor = 1.6, \fISCALE\fR = 5: magnification factor = 2.0. .TP \fB--hdf\fR Save data in HDF5 format with \fB.gpi\fR extension. .TP \fB--img_fmt \fIINT\fR store (modified) image data and header in: \fIINT\fR = 0: PNG format, \fIINT\fR = 1: raw format, \fIINT\fR = 2: HDF5 format, included with the resulting PIV and post-processing data with \fB.gpi\fR extension. .TP \fB--mpi_nodes \fIINT\fR To define the number of nodes when used on a cluster. Used by \fBmpirun -np \fIINT\fR. .TP \fB-p\fR | \fB--print\fR Print process parameter settings to stdout. .TP \fB--process_imgproc\fR Includes image processing in the chain-process. .TP \fB--process_piv\fR Includes piv interrogation in the chain-process. .TP \fB--process_gradient\fR Includes testing on the displacement gradient within interrogation area in the chain-process. .TP \fB--process_resstatst\fR Includes calculation of statistics of displacement residuals in the chain-process. .TP \fB--process_errvec\fR Includes validation on PIV data in the chain-process. .TP \fB--process_peaklock\fR Includes peak lock in the chain- process. .TP \fB--process_average\fR Includes calculation of the whole field average PIV displacements in the chain-process. .TP \fB--process_scale\fR Includes scaling in the chain-process. .TP \fB--process_subtract\fR Includes substracting of the whole field average PIV displacements in the chain-process. .TP \fB--process_vorstra\fR Includes calculation of vorticity in the chain-process. .TP \fIIMAGE1\fR, \fIIMAGE2\fR, \fI...\fR Loads \fIIMAGE1\fR, \fIIMAGE2\fR, ... from a file or from an URI using the Gnome Virtual File System. The maximum allowed image dimensions and quantity to be loaded are defined by the program as described in gpiv_gui.h or by the 'configure' script during the building of \fBgpiv\fR. .SH SEE ALSO On-line documentation at http://gpiv.sourceforge.net/gpiv_doc/index.html or from the help-menu of \fBgpiv\fR, gpiv_control(1) and gpivtools(1). .SH AUTHOR Gerber Van der Graaf gpiv-0.6.1/man/Makefile.am0000644000175000017500000000005511076052422012212 00000000000000man_MANS = gpiv.1 EXTRA_DIST = $(man_MANS)gpiv-0.6.1/man/Makefile.in0000644000175000017500000002545411204234173012233 00000000000000# Makefile.in generated by automake 1.10.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = man DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = man1dir = $(mandir)/man1 am__installdirs = "$(DESTDIR)$(man1dir)" NROFF = nroff MANS = $(man_MANS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CANVAS_AA = @CANVAS_AA@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONTROL = @CONTROL@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUG = @DEBUG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_CAM = @ENABLE_CAM@ ENABLE_DAC = @ENABLE_DAC@ ENABLE_MPI = @ENABLE_MPI@ ENABLE_MPI_RR = @ENABLE_MPI_RR@ ENABLE_TRIG = @ENABLE_TRIG@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GPIV_CFLAGS = @GPIV_CFLAGS@ GPIV_LIBS = @GPIV_LIBS@ GPIV_UI_CFLAGS = @GPIV_UI_CFLAGS@ GPIV_UI_LIBS = @GPIV_UI_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ K_TOPDIR = @K_TOPDIR@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MPIRUN = @MPIRUN@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OVERRIDE_IMAGE_HEIGHT_MAX = @OVERRIDE_IMAGE_HEIGHT_MAX@ OVERRIDE_IMAGE_WIDTH_MAX = @OVERRIDE_IMAGE_WIDTH_MAX@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RR = @RR@ RTA_TOPDIR = @RTA_TOPDIR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ man_MANS = gpiv.1 EXTRA_DIST = $(man_MANS) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu man/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu man/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-man1: $(man1_MANS) $(man_MANS) @$(NORMAL_INSTALL) test -z "$(man1dir)" || $(MKDIR_P) "$(DESTDIR)$(man1dir)" @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ if test -f $$i; then file=$$i; \ else file=$(srcdir)/$$i; fi; \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ done uninstall-man1: @$(NORMAL_UNINSTALL) @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ for i in $$l2; do \ case "$$i" in \ *.1*) list="$$list $$i" ;; \ esac; \ done; \ for i in $$list; do \ ext=`echo $$i | sed -e 's/^.*\\.//'`; \ case "$$ext" in \ 1*) ;; \ *) ext='1' ;; \ esac; \ inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ inst=`echo $$inst | sed -e 's/^.*\///'`; \ inst=`echo $$inst | sed '$(transform)'`.$$ext; \ echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man1dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-man1 install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man1 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-man1 install-pdf install-pdf-am install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-man uninstall-man1 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gpiv-0.6.1/src/0000777000175000017500000000000011204235560010255 500000000000000gpiv-0.6.1/src/io.c0000644000175000017500000011106511110305653010745 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*----------------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -----------------------------------------------------------------------------*/ /* * Program wide input / output functions (no callbacks) * $Log: io.c,v $ * Revision 1.1 2008-09-16 11:21:27 gerber * added io * */ #ifdef HAVE_CONFIG_H #include #endif #include "support.h" #include "gpiv_gui.h" #include "console.h" #include "utils.h" #include "display_image.h" #define BYTES_TO_PROCESS 8192 static gint select_action_from_uri (GpivConsole *gpiv, GnomeVFSURI *uri); static void select_action_from_fname (GpivConsole *gpiv, gchar *fname_in); static GpivImage * open_img (char *fname_in ); static int open_piv (char *fname_in, PivData *pida ); static gchar * load_buffer (GpivConsole *gpiv, gchar *fname_in, gchar *fname_base, gchar *fname_ext, guint ibuf, enum ClistPut clist_put ); static void write_from_tmp_to_uri (const gchar *uri_string_tmp, const gchar *uri_string_out); static void move_to_uri (GnomeVFSURI *uri_out, const gchar *fname_out); static void write_ascii_scalardata (GnomeVFSURI *uri_out, GpivScalarData *scalar_data, const char *fname_out_nosuf, const gchar *suffix); /* * Program-wide public functions */ /* * Retrieving functions */ void select_action_from_name (GpivConsole *gpiv, gchar *name) /* ---------------------------------------------------------------------------- * Checks on validity of uri and whether local file or not. * Calls apropiate functions. */ { gint result; gchar *text_uri; GnomeVFSURI* uri = NULL; text_uri = gnome_vfs_make_uri_from_shell_arg (name); uri = gnome_vfs_uri_new (text_uri); g_free (text_uri); if (gnome_vfs_uri_exists (uri)) { if (gnome_vfs_uri_is_local (uri)) { const gchar *path = gnome_vfs_uri_get_path (uri); select_action_from_fname (gpiv, (gchar *) path); } else { if ((result = select_action_from_uri (gpiv, uri)) != 0) { g_error("select_action_from_name: select_action_from_uri"); } } } else { warning_gpiv ("Uri or filename of input image does not exist"); } } /* * Saving functions */ void write_hdf_img_data (const gchar *fname_out_nosuf, GnomeVFSURI *uri_out) /*------------------------------------------------------------------------------ */ { char *err_msg = NULL; gchar *fname_out = g_strdup_printf ("%s%s" , fname_out_nosuf, GPIV_EXT_GPIV); if (gpiv_par->verbose) g_message ("writing to %s", fname_out); if ((err_msg = gpiv_fcreate_hdf5 (fname_out)) != NULL) error_gpiv ("%s", err_msg); if (gpiv_par->img_fmt == IMG_FMT_HDF && display_act->img->saved_img == FALSE) { if ((err_msg = gpiv_img_fwrite_hdf5_parameters (fname_out, display_act->img->image->header)) != NULL) error_gpiv ("%s", err_msg); if ((err_msg = gpiv_fwrite_hdf5_image (fname_out, display_act->img->image, FALSE)) != NULL) error_gpiv ("%s", err_msg); display_act->img->saved_img = TRUE; } if (display_act->pida->exist_piv) { if (display_act->pida->scaled_piv) { if ((err_msg = gpiv_fwrite_hdf5_pivdata (fname_out, display_act->pida->piv_data_scaled, "PIV", FALSE)) != NULL) error_gpiv ("%s", err_msg); } else { if ((err_msg = gpiv_fwrite_hdf5_pivdata (fname_out, display_act->pida->piv_data, "PIV", FALSE)) != NULL) error_gpiv ("%s", err_msg); } display_act->pida->saved_piv = TRUE; if ((err_msg = gpiv_piv_fwrite_hdf5_parameters (fname_out, display_act->pida->piv_par)) != NULL) error_gpiv ("%s", err_msg); } if (display_act->pida->exist_valid) { if ((err_msg = gpiv_valid_fwrite_hdf5_parameters (fname_out, display_act->pida->valid_par)) != NULL) error_gpiv ("%s", err_msg); } if (display_act->pida->exist_vor) { if (display_act->pida->scaled_piv ) { if ((err_msg = gpiv_fwrite_hdf5_scdata (fname_out, display_act->pida->vor_data_scaled, "VORTICITY", FALSE)) != NULL) error_gpiv ("%s", err_msg); } else { if ((err_msg = gpiv_fwrite_hdf5_scdata (fname_out, display_act->pida->vor_data, "VORTICITY", FALSE)) != NULL) error_gpiv ("%s", err_msg); } display_act->pida->saved_vor = TRUE; } if (display_act->pida->exist_sstrain) { if (display_act->pida->scaled_piv ) { if ((err_msg = gpiv_fwrite_hdf5_scdata (fname_out, display_act->pida->sstrain_data_scaled, "SHEAR_STRAIN", FALSE)) != NULL) error_gpiv ("%s", err_msg); } else { if ((err_msg = gpiv_fwrite_hdf5_scdata (fname_out, display_act->pida->sstrain_data, "SHEAR_STRAIN", FALSE)) != NULL) error_gpiv ("%s", err_msg); } display_act->pida->saved_sstrain = TRUE; } if (display_act->pida->exist_nstrain) { if (display_act->pida->scaled_piv ) { if ((err_msg = gpiv_fwrite_hdf5_scdata (fname_out, display_act->pida->nstrain_data_scaled, "NORMAL_STRAIN", FALSE)) != NULL) error_gpiv ("%s", err_msg); } else { if ((err_msg = gpiv_fwrite_hdf5_scdata (fname_out, display_act->pida->nstrain_data, "NORMAL_STRAIN", FALSE)) != NULL) error_gpiv ("%s", err_msg); } display_act->pida->saved_nstrain = TRUE; } if ((err_msg = gpiv_post_fwrite_hdf5_parameters (fname_out, display_act->pida->post_par)) != NULL) error_gpiv ("%s", err_msg); move_to_uri (uri_out, fname_out); g_free (fname_out); } void write_img (const gchar *fname_out_nosuf, GnomeVFSURI *uri_out) /*------------------------------------------------------------------------------ * Store image to RAW, HDF or PNG format */ { char *err_msg = NULL; gchar *fname_out; FILE *fp_out; if (display_act->img->saved_img == FALSE) { if (gpiv_par->img_fmt == IMG_FMT_PNG) { fname_out = g_strdup_printf ("%s%s" , replace_tilde_with_home_dir (fname_out_nosuf), GPIV_EXT_PNG_IMAGE); if ((fp_out = fopen (fname_out, "wb")) == NULL) { err_msg = "fopen"; error_gpiv ("gpiv: write_img: fopen (%s, \"wb\")) == NULL", fname_out); } if ((err_msg = gpiv_write_png_image (fp_out, display_act->img->image, FALSE)) != NULL) { gpiv_error ("gpiv: write_img: %s\n", err_msg); } fclose (fp_out); move_to_uri (uri_out, fname_out); g_free (fname_out); } else if (gpiv_par->img_fmt == IMG_FMT_HDF) { fname_out = g_strdup_printf ("%s%s" , replace_tilde_with_home_dir (fname_out_nosuf), GPIV_EXT_GPIV); if (gpiv_par->verbose) g_message ("writing image to %s", fname_out); if ((err_msg = gpiv_fcreate_hdf5 (fname_out)) != NULL) error_gpiv ("%s", err_msg); if ((err_msg = gpiv_img_fwrite_hdf5_parameters (fname_out, display_act->img->image->header)) != NULL) error_gpiv ("%s", err_msg); if ((err_msg = gpiv_fwrite_hdf5_image (fname_out, display_act->img->image, FALSE)) != NULL) error_gpiv ("%s", err_msg); move_to_uri (uri_out, fname_out); g_free (fname_out); } else if (gpiv_par->img_fmt == IMG_FMT_RAW) { /* * Saving ASCII header */ FILE *fp_header; gchar *fname_header = g_strdup_printf ("%s%s" , replace_tilde_with_home_dir (fname_out_nosuf), GPIV_EXT_HEADER); if (gpiv_par->verbose) g_message ("writing header to %s", fname_header); if ((fp_header = fopen (fname_header, "w")) == NULL) { error_gpiv (_("Failure opening image header for output")); } /* fprintf(fp_par, "#%s\n", gl_image_par->software); */ gpiv_img_print_header (fp_header, display_act->img->image->header); fclose (fp_header); move_to_uri (uri_out, fname_header); g_free (fname_header); /* * BUGFIX: Saving RAW image */ } display_act->img->saved_img = TRUE; } } void write_ascii_parameters (const char *fname_out_nosuf, GnomeVFSURI *uri_out, const gchar *suffix) /*----------------------------------------------------------------------------- * Saves parameters in ascii format */ { FILE *fp; gint flag_vor = 0; gchar *fname = g_strdup_printf ("%s%s" , replace_tilde_with_home_dir (fname_out_nosuf), suffix); if ((fp = fopen (fname, "w")) == NULL) { error_gpiv (_("Failure opening parameter file for output")); } /* * Saving image header */ if (gl_image_par->software__set) { fprintf (fp, "# Software: %s\n", gl_image_par->software); } gpiv_img_print_header (fp, display_act->img->image->header); /* * Saving PIV parameters */ if (display_act->pida->exist_piv) { gpiv_piv_print_parameters (fp, display_act->pida->piv_par); if (display_act->pida->exist_valid) { gpiv_valid_print_parameters (fp, display_act->pida->valid_par); } } /* * Saving scalar parameters for vorticity */ if (display_act->pida->exist_vor) { if (flag_vor == 0) { gpiv_post_print_parameters (stdout, display_act->pida->post_par); gpiv_post_print_parameters (fp, display_act->pida->post_par); flag_vor = 1; } } /* * Saving scalar parameters for shear strain */ if (display_act->pida->exist_sstrain) { if (flag_vor == 0) { gpiv_post_print_parameters (fp, display_act->pida->post_par); flag_vor = 1; } } /* * Saving scalar parameters for normal strain */ if (display_act->pida->exist_nstrain) { if (flag_vor == 0) { gpiv_post_print_parameters (fp, display_act->pida->post_par); flag_vor = 1; } } fclose (fp); move_to_uri (uri_out, fname); g_free (fname); } void write_ascii_data (const gchar *fname_out_nosuf, GnomeVFSURI *uri_out) /*------------------------------------------------------------------------------ * Store resulting (PIV and derived) data in ASCII format at * different files */ { char *err_msg = NULL; gchar *fname; FILE *fp = NULL; /* * Saving PIV data */ if (display_act->pida->exist_piv) { fname = g_strdup_printf ("%s%s", replace_tilde_with_home_dir (fname_out_nosuf), GPIV_EXT_PIV); if ((fp = fopen (fname, "wb")) == NULL) { warning_gpiv ("write_ascii_data: failing fopen %s", fname); return; } if (display_act->pida->scaled_piv) { if ((err_msg = gpiv_write_pivdata (fp, display_act->pida->piv_data_scaled, FALSE)) != NULL) error_gpiv ("%s", err_msg); } else { if ((err_msg = gpiv_write_pivdata (fp, display_act->pida->piv_data, FALSE)) != NULL) error_gpiv ("%s", err_msg); } fclose (fp); display_act->pida->saved_piv = TRUE; move_to_uri (uri_out, fname); g_free (fname); } /* * Saving histogram */ if (display_act->pida->exist_histo) { fname = g_strdup_printf ("%s%s" , replace_tilde_with_home_dir (fname_out_nosuf), GPIV_EXT_UVHISTO); if (gpiv_par->verbose) g_message ("writing HISTO data to %s", fname); if ((fp = fopen (fname, "wb")) == NULL) { warning_gpiv ("write_ascii_data: failing fopen %s", fname); return; } gpiv_print_histo (fp, display_act->pida->klass, FALSE); fclose (fp); display_act->pida->saved_histo = TRUE; move_to_uri (uri_out, fname); g_free (fname); } /* * Saving scalar vorticity data */ if (display_act->pida->exist_vor_scaled) { write_ascii_scalardata (uri_out, display_act->pida->vor_data_scaled, fname_out_nosuf, GPIV_EXT_VOR); display_act->pida->saved_vor = TRUE; } else if (display_act->pida->exist_vor) { write_ascii_scalardata (uri_out, display_act->pida->vor_data, fname_out_nosuf, GPIV_EXT_VOR); display_act->pida->saved_vor = TRUE; } /* * Saving scalar shear strain data */ if (display_act->pida->exist_sstrain_scaled) { write_ascii_scalardata (uri_out, display_act->pida->sstrain_data_scaled, fname_out_nosuf, GPIV_EXT_SSTR); display_act->pida->saved_sstrain = TRUE; } else if (display_act->pida->exist_sstrain) { write_ascii_scalardata (uri_out, display_act->pida->sstrain_data, fname_out_nosuf, GPIV_EXT_SSTR); display_act->pida->saved_sstrain = TRUE; } /* * Saving scalar normal strain data */ if (display_act->pida->exist_nstrain_scaled) { write_ascii_scalardata (uri_out, display_act->pida->nstrain_data_scaled, fname_out_nosuf, GPIV_EXT_NSTR); display_act->pida->saved_nstrain = TRUE; } else if (display_act->pida->exist_nstrain) { write_ascii_scalardata (uri_out, display_act->pida->nstrain_data, fname_out_nosuf, GPIV_EXT_NSTR); display_act->pida->saved_nstrain = TRUE; } } /* * Local functions on retrieving data */ static gint select_action_from_uri (GpivConsole *gpiv, GnomeVFSURI *uri) /* ---------------------------------------------------------------------------- * checks filename extension on valid image/data name, on existence of buffer, * loads data * As i/o from libgpiv (which does not have libgnomevfs) will have to be * be used (applying libpng funcionality), the image (data) are copied to a * tmp directory and subsequtially be loaded with libgpiv i/o * functions. */ { GnomeVFSHandle *read_handle, *write_handle; GnomeVFSResult result, result_while; GnomeVFSFileSize bytes_read, bytes_written; guint buffer[BYTES_TO_PROCESS]; gchar *output_uri_string; const gchar *tmp_dir = g_get_tmp_dir (); const gchar *user_name = g_get_user_name (); FILE *fp; gchar *dirname = gnome_vfs_uri_extract_dirname (uri); gchar *basename = gnome_vfs_uri_extract_short_name (uri); gchar *command; if (gpiv_par->verbose) { g_message ("select_action_from_uri:: tmp_dir = %s", tmp_dir); g_message ("select_action_from_uri:: user_name = %s", user_name); g_message ("select_action_from_uri:: dirname = %s basename = %s", dirname, basename); } output_uri_string = g_strdup_printf ("%s/%s/%s" ,tmp_dir, user_name, basename); if (gpiv_par->verbose) { g_message ("select_action_from_uri:: output_uri_string = %s", output_uri_string); } if ((result = gnome_vfs_open_uri (&read_handle, uri, GNOME_VFS_OPEN_READ)) != GNOME_VFS_OK) gpiv_error ("select_action_from_uri: gnome_vfs_open_uri"); if ((result = gnome_vfs_create (&write_handle, output_uri_string, GNOME_VFS_OPEN_WRITE, FALSE, 0777)) != GNOME_VFS_OK) gpiv_error ("select_action_from_uri: gnome_vfs_create"); /* read data from the input uri */ while (result == GNOME_VFS_OK) { result = gnome_vfs_read (read_handle, buffer, BYTES_TO_PROCESS, &bytes_read); if ((result_while = gnome_vfs_seek (write_handle, GNOME_VFS_SEEK_END, 0)) != GNOME_VFS_OK) gpiv_error ("select_action_from_uri: gnome_vfs_seek"); if ((result_while = gnome_vfs_write (write_handle, buffer, bytes_read, &bytes_written)) != GNOME_VFS_OK) gpiv_error ("select_action_from_uri: gnome_vfs_write"); } /* * add to uri to fname_last; * Reading image from temporarly storage * put correct name in Image tab * Cleaning up tmp */ gpiv_var->fname_last = gnome_vfs_uri_to_string (uri, TRUE); gnome_config_push_prefix ("/gpiv/RuntimeVariables/"); gnome_config_set_string ("fname_last", gpiv_var->fname_last); gnome_config_pop_prefix (); gnome_config_sync (); push_list_lastfnames (gpiv_var->fname_last); gpiv_var->fname_last__set = TRUE; select_action_from_fname (gpiv, output_uri_string); gpiv_var->fname_last__set = FALSE; display_act->file_uri_name = g_strdup_printf ("%s", strtok (gnome_vfs_uri_to_string (uri, TRUE), ".")); update_imgh_entries (gpiv, display_act->img->image->header); command = g_strdup_printf ("rm %s", output_uri_string); if (gpiv_par->verbose) { g_message ("command = %s", command); } if (system (command) != 0) { g_warning ("select_action_from_uri: could not exec shell command: %s", command); } g_free (output_uri_string); g_free (dirname); g_free (basename); g_free (command); return 0; } static void select_action_from_fname (GpivConsole *gpiv, gchar *fname_in) /* ---------------------------------------------------------------------------- * checks filename suffux on valid image/data name, on existence of buffer, * loads data */ { gchar *err_msg = NULL; gint ibuf, return_val; gchar *suf, /* filename suffix */ *dirname, /* directory name */ *fname_base, /* Image name without suffix and dirname */ *fname_nosuf, /* Image name without suffix */ *fname_home; gboolean exist_buf = FALSE; gchar command[2 * GPIV_MAX_CHARS]; /* gchar *command; */ suf = g_strdup (strrchr (fname_in, '.')); /* add to push_list_lastfnames (fname_base); */ if (!gpiv_var->fname_last__set) { gpiv_var->fname_last = g_strdup (fname_in); gnome_config_push_prefix ("/gpiv/RuntimeVariables/"); gnome_config_set_string ("fname_last", gpiv_var->fname_last); gnome_config_pop_prefix (); gnome_config_sync (); } /* * Stripping file name * We need them for displaying in the image header tab and on the buffer list */ fname_home = replace_home_dir_with_tilde (fname_in); dirname = g_strdup (g_path_get_dirname (fname_home)); /* (replace_home_dir_with_tilde (fname_in))); */ g_free (fname_home); fname_base = g_strdup (g_path_get_basename (fname_in)); strtok (fname_base, "."); if (!gpiv_var->fname_last__set) { push_list_lastfnames (fname_base); } fname_nosuf = g_strdup (g_strconcat (dirname, G_DIR_SEPARATOR_S, fname_base, NULL)); /* * reading image data from raw, PNG, hdf or Davis(tm) format * Ensure that the tabulator widgets are enabled */ if (g_str_has_suffix (fname_in, GPIV_EXT_RAW_IMAGE) || g_str_has_suffix (fname_in, GPIV_EXT_PNG_IMAGE) || g_str_has_suffix (fname_in, GPIV_EXT_PNG_IMAGE_UPCASE) || g_str_has_suffix (fname_in, GPIV_EXT_GPIV) || g_str_has_suffix (fname_in, GPIV_EXT_DAVIS) || g_str_has_suffix (fname_in, GPIV_EXT_PGM_IMAGE) || g_str_has_suffix (fname_in, GPIV_EXT_PGM_IMAGE_UPCASE) || g_str_has_suffix (fname_in, ".gif") || g_str_has_suffix (fname_in, ".GIF") || g_str_has_suffix (fname_in, ".tif") || g_str_has_suffix (fname_in, ".TIF") || g_str_has_suffix (fname_in, ".bmp") || g_str_has_suffix (fname_in, ".BMP") ) { exist_buf = FALSE; if (nbufs == 0) { sensitive (gpiv, IMG, TRUE); sensitive (gpiv, EVAL, TRUE); } else { /* * Check if file basename (and buffer/display) already exists * or if there is a gap in the numbering of the buffers */ for (ibuf = 0; ibuf < nbufs; ibuf++) { display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), ibuf); if (ibuf == display_act->id && strcmp (fname_nosuf, display_act->file_uri_name) == 0 ) { if ((display_act->img->image = open_img (fname_in)) == NULL) { return; } exist_buf = TRUE; break; } else if (ibuf < display_act->id) { if ((err_msg = load_buffer (gpiv, fname_in, fname_base, fname_nosuf, ibuf, INSERT)) != NULL) { g_warning ("select_action_from_fname: failing load_buffer"); return; } exist_buf = TRUE; nbufs++; break; } else { /* g_warning ("select_action_from_fname: should not arrive here"); */ } } } /* * All buffers with id between 0 and nbufs already exist. * Create a new buffer and launches a display if file basename doesn't exist * and append to the list */ if (!exist_buf) { nbufs++; ibuf = nbufs - 1; load_buffer (gpiv, fname_in, fname_base, fname_nosuf, ibuf, APPEND); } } else { warning_gpiv (_("select_action_from_fname: non-valid file name")); } gtk_clist_set_selection_mode (GTK_CLIST (gpiv->clist_buf), GTK_SELECTION_EXTENDED); #ifdef ENABLE_IMGPROC set_imgproc_filtervar (gpiv, GPIV_IMGFI_SUBACK, nbufs - 1); #endif g_free (suf); g_free (dirname); g_free (fname_base); g_free (fname_nosuf); } static GpivImage * open_img (char *fname_in ) /*----------------------------------------------------------------------------- * Opens an image from png, hdf or raw-data file (<=> open_dac_img) */ { GpivImage *image = NULL; gchar *err_msg = NULL; if ((image = gpiv_fread_image (fname_in)) == NULL) { warning_gpiv ("OPEN_IMG: failing gpiv_fread_image %s", fname_in); return; } display_act->img->exist_img = TRUE; /* * The loaded image has not yet been modified, so there is no need to save * image or header information */ display_act->img->saved_img = TRUE; return image; } static gint open_piv (char *fname_in, PivData *pida ) /*----------------------------------------------------------------------------- * Opens piv data file and displays */ { char *err_msg = NULL, RCSID_DATA[GPIV_MAX_CHARS]; char *ext = g_strdup (strrchr (fname_in, '.')); gint var_scale = 0, scale = 0; /* * parameter initializing of piv data */ /* pida->piv_par->autokey = 1; */ gpiv_piv_parameters_set (pida->piv_par, FALSE); /* * Reads hdf format */ if (strcmp (ext, GPIV_EXT_GPIV) == 0) { if ((pida->piv_data = gpiv_fread_hdf5_pivdata (fname_in, "PIV")) == NULL) { warning_gpiv ("OPEN_PIV: failing piv_fread_hdf5_pivdata %s", fname_in); return -1; } pida->exist_piv = TRUE; pida->averaged_piv = FALSE; /* * Reads raw data format */ } else if (strcmp (ext, GPIV_EXT_RAW_IMAGE) == 0 || strcmp (ext, GPIV_EXT_DAVIS) == 0 ) { FILE *fp; gchar *dirname = g_strdup (g_dirname (fname_in)), *fname_base = g_strdup (g_basename (fname_in)), *fname_ext, *fname_piv; /* BUGFIX * check on existance of piv data file */ strtok (fname_base, "."); fname_ext = g_strdup (g_strconcat (dirname, G_DIR_SEPARATOR_S, fname_base, NULL)); fname_piv = g_strdup (g_strconcat (fname_ext, GPIV_EXT_PIV, NULL)); if ((fp = fopen (fname_piv, "r")) == NULL) { warning_gpiv ("OPEN_PIV: failing fopen %s", fname_piv); } if ((pida->piv_data = gpiv_read_pivdata (fp)) == NULL) { warning_gpiv ("OPEN_PIV: failing gpiv_read_pivdata"); return -1; } fclose (fp); pida->exist_piv = TRUE; pida->averaged_piv = FALSE; g_free (dirname); g_free (fname_base); g_free (fname_ext); g_free (fname_piv); } else { if (gpiv_par->verbose) g_message ("open_piv: no PIV data"); return -1; } g_free (ext); return 0; } static gchar * load_buffer (GpivConsole *gpiv, gchar *fname_in, gchar *fname_base, gchar *fname_ext, guint ibuf, enum ClistPut clist_put ) /*----------------------------------------------------------------------------- * create display and its (popup) menu, load image, piv data and puts * buffername into clist */ { gint return_val = 0; gchar *err_msg = NULL; gchar *clist_buf_txt[MAX_BUFS][2], cl_int[3]; gboolean local_stretch_window = gpiv_par->display__stretch_window; GpivImage *image = NULL; /* * We need to know the image dimensions before creating the buffer display * So, first load the image */ if ((image = gpiv_fread_image (fname_in)) == NULL) { warning_gpiv ("load_buffer: failing gpiv_fread_image %s", fname_in); err_msg = "failing gpiv_fread_image"; return err_msg; } /* * Creating buffer and display */ display[ibuf] = create_display (fname_ext, image, ibuf, gpiv); display_act = display[ibuf]; display_act->img->exist_img = TRUE; display_act->img->saved_img = TRUE; /* * Load eventually existing PIV data */ open_piv (fname_in, display[ibuf]->pida); /* * Suppress creating intregs during load_buffer by toggle menu; * after displaying it will result into the correct effect */ view_toggle_intregs_flag = FALSE; gpiv_par->display__stretch_window = TRUE; display_act->display_popupmenu = create_display_popupmenu (display_act); gtk_signal_connect_object (GTK_OBJECT (display_act->mwin), "button_press_event", GTK_SIGNAL_FUNC (on_my_popup_handler), GTK_OBJECT (display_act->display_popupmenu)); gpiv_par->display__stretch_window = local_stretch_window; stretch_window (display_act); /* * Creating pixbuf image for displaying of image data */ if ( display_act->gci_bg != NULL) { destroy_background(display_act->gci_bg); } display_act->gci_bg = create_background (display_act); create_img (display_act); if (display_act->img->image->header->x_corr && display_act->img->image->frame2 && display_act->display_backgrnd == SHOW_BG_IMG1) { /* hide_img2 (display_act); */ show_img1 (display_act); } else if (display_act->display_backgrnd == SHOW_BG_IMG2) { /* hide_img1 (display_act); */ show_img2 (display_act); } else if (display_act->display_backgrnd == SHOW_BG_DARKBLUE) { gchar *color = "darkblue"; /* hide_img1 (display_act); */ /* hide_img2 (display_act); */ if (display_act->gci_bg != NULL) { gnome_canvas_item_set (GNOME_CANVAS_ITEM (display_act->gci_bg), "fill_color", color, NULL); } } else { gchar *color = "black"; if (display_act->gci_bg != NULL) { gnome_canvas_item_set (GNOME_CANVAS_ITEM (display_act->gci_bg), "fill_color", color, NULL); } } /* * Creating PIV vectors */ if (display_act->display_piv) { create_all_vectors (display_act->pida); } display_act->img->img_mean = image_mean (display_act->img->image->frame1, display_act->img->image->header->ncolumns, display_act->img->image->header->nrows); if (gpiv_par->display__intregs == 1) { show_all_intregs (display_act); } view_toggle_intregs_flag = TRUE; /* * Add buffer to clist; the column int the console which shows the names of * images */ g_snprintf (cl_int, 3, "%d", ibuf); clist_buf_txt[ibuf][0] = (gchar *) cl_int; clist_buf_txt[ibuf][1] = fname_base; if (clist_put == PREPEND) { gtk_clist_prepend (GTK_CLIST (gpiv->clist_buf), clist_buf_txt[ibuf]); } else if (clist_put == INSERT) { gtk_clist_insert (GTK_CLIST (gpiv->clist_buf), ibuf, clist_buf_txt[ibuf]); } else if (clist_put == APPEND) { gtk_clist_append (GTK_CLIST (gpiv->clist_buf), clist_buf_txt[ibuf]); } else { error_gpiv ("non-existent CLIST enumerate"); } gtk_clist_set_row_data (GTK_CLIST (gpiv->clist_buf), ibuf, display_act); gtk_widget_set_size_request (display_act->canvas, (gint) (display_act->zoom_factor * display_act->img->image->header->ncolumns), (gint) (display_act->zoom_factor * display_act->img->image->header->nrows)); #ifdef ENABLE_IMGPROC set_imgproc_filtervar (gpiv, GPIV_IMGFI_SUBACK, nbufs - 1); #endif return err_msg; } /* * Local functions on writing */ static void write_from_tmp_to_uri (const gchar *uri_string_tmp, const gchar *uri_string_out) /*----------------------------------------------------------------------------- */ { GnomeVFSHandle *read_handle, *write_handle; GnomeVFSResult result, result_while; GnomeVFSFileSize bytes_read, bytes_written; guint buffer[BYTES_TO_PROCESS]; gchar *command; if ((result = gnome_vfs_open (&read_handle, uri_string_tmp, GNOME_VFS_OPEN_READ)) != GNOME_VFS_OK) gpiv_error ("write_from_tmp_to_uri: gnome_vfs_open_uri"); if ((result = gnome_vfs_create (&write_handle, uri_string_out, GNOME_VFS_OPEN_WRITE, FALSE, 0777)) != GNOME_VFS_OK) gpiv_error ("write_from_tmp_to_uri: gnome_vfs_create"); while (result == GNOME_VFS_OK) { result = gnome_vfs_read (read_handle, buffer, BYTES_TO_PROCESS, &bytes_read); if ((result_while = gnome_vfs_write (write_handle, buffer, bytes_read, &bytes_written)) != GNOME_VFS_OK) gpiv_error ("write_from_tmp_to_uri: gnome_vfs_write"); } command = g_strdup_printf ("rm %s", gnome_vfs_uri_get_path (gnome_vfs_uri_new (uri_string_tmp))); if (system (command) != 0) { warning_gpiv ("write_from_tmp_to_uri: could not exec shell command: %s", command); } g_free (command); return; } static void move_to_uri (GnomeVFSURI *uri_out, const gchar *fname_out) /*----------------------------------------------------------------------------- * Move file to uri if not local */ { gchar *suffix = g_strdup (strrchr (fname_out, '.')); if (!gnome_vfs_uri_is_local (uri_out)) { gchar *uri_string_tmp = gnome_vfs_make_uri_from_input(fname_out); gchar *uri_string_out = gnome_vfs_make_uri_from_input (g_strdup_printf ("%s%s" , display_act->file_uri_name, suffix)); write_from_tmp_to_uri (uri_string_tmp, uri_string_out); g_free (uri_string_tmp); g_free (uri_string_out); } g_free (suffix); } static void write_ascii_scalardata (GnomeVFSURI *uri_out, GpivScalarData *scalar_data, const char *fname_out_nosuf, const gchar *suffix) /*----------------------------------------------------------------------------- * Saves scalar data in ascii format */ { gchar *err_msg = NULL; gchar *fname_out = g_strdup_printf ("%s%s" , replace_tilde_with_home_dir (fname_out_nosuf), suffix); FILE *fp = NULL; if (gpiv_par->verbose) g_message ("writing ascii data to %s", fname_out); if ((fp = fopen (fname_out, "w")) == NULL) { warning_gpiv ("write_ascii_data: failing fopen %s", fname_out); return; } if ((err_msg = gpiv_write_scdata (fp, scalar_data, FALSE)) != NULL) error_gpiv ("%s", err_msg); fclose (fp); move_to_uri (uri_out, fname_out); g_free (fname_out); } gpiv-0.6.1/src/io.h0000644000175000017500000000345211110306606010751 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*----------------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -----------------------------------------------------------------------------*/ /* * Program wide input / output functions (no callbacks) * $Log: io.h,v $ * Revision 1.1 2008-09-16 11:21:27 gerber * added io *static void */ #ifndef IO_H #define IO_H void select_action_from_name (GpivConsole *gpiv, gchar *name); void write_hdf_img_data (const gchar *fname_out_nosuf, GnomeVFSURI *uri_out); void write_img (const gchar *fname_out_nosuf, GnomeVFSURI *uri_out); void write_ascii_parameters (const char *fname_out_nosuf, GnomeVFSURI *uri_out, const gchar *suffix); void write_ascii_data (const gchar *fname_out_nosuf, GnomeVFSURI *uri_out); #endif /* IO_H */ gpiv-0.6.1/src/console_interface.c0000644000175000017500000024323711110306242014022 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * $Log: console_interface.c,v $ * Revision 1.20 2007-12-19 08:42:35 gerber * debugged * * Revision 1.19 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.18 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.17 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.16 2007-02-16 17:09:48 gerber * added Gauss weighting on I.A. and SPOF filtering (on correlation function) * * Revision 1.15 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.14 2006-09-18 07:27:05 gerber * *** empty log message *** * * Revision 1.13 2006/01/31 14:28:11 gerber * version 0.3.0 * * Revision 1.11 2005/03/05 17:38:51 gerber * repaired documantation and About * * Revision 1.10 2005/02/12 14:12:12 gerber * Changed tabular names and titles * * Revision 1.9 2005/01/19 15:53:41 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.8 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.7 2003/09/04 13:31:55 gerber * init of printing (unfinished) * * Revision 1.6 2003/09/01 11:17:14 gerber * improved monitoring of interrogation process * * Revision 1.5 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.4 2003/07/20 18:16:37 gerber * improved about text * * Revision 1.3 2003/07/05 13:14:57 gerber * drag and drop of a _series_ of filenames from NAUTILUS * * Revision 1.2 2003/06/27 13:47:26 gerber * display ruler, line/point evaluation * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifdef HAVE_CONFIG_H # include #endif #include "support.h" #include "gpiv_gui.h" #include "utils.h" #include "console_interface.h" #include "console_menus.h" #ifdef ENABLE_CAM #include "dac_cam.h" #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG #include "dac_trig.h" #endif /* ENABLE_TRIG */ #ifdef ENABLE_IMGPROC #include "imgproc.h" #endif /* ENABLE_IMGPROC */ #include "piveval.h" #include "pivvalid.h" #include "pivpost.h" GtkWidget * create_menu_gpiv_popup(GpivConsole *gpiv ) /*----------------------------------------------------------------------------- */ { GnomeApp *console = gpiv->console; GtkWidget *menu_gpiv_popup = NULL; menu_gpiv_popup = gtk_menu_new(); gtk_object_set_data (GTK_OBJECT (console), "menu_gpiv_popup", menu_gpiv_popup); gnome_app_fill_menu (GTK_MENU_SHELL (menu_gpiv_popup), menubar_gpiv_popup, NULL, FALSE, 0); gtk_widget_ref (menubar_gpiv_popup[0].widget); gtk_object_set_data_full (GTK_OBJECT (console), "file", menubar_gpiv_popup[0].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_ref (menubar_gpiv_popup[1].widget); gtk_object_set_data_full (GTK_OBJECT (console), "settings", menubar_gpiv_popup[1].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_ref (menubar_gpiv_popup[2].widget); gtk_object_set_data_full (GTK_OBJECT (console), "help", menubar_gpiv_popup[2].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_ref (help_menu_gpiv_popup[0].widget); gtk_object_set_data_full (GTK_OBJECT (console), "tooltip", help_menu_gpiv_popup[0].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (help_menu_gpiv_popup[0].widget), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->console), "help_menu_gpiv_popup0", help_menu_gpiv_popup[0].widget); gtk_widget_ref (file_menu_gpiv_popup[0].widget); gtk_object_set_data (GTK_OBJECT (file_menu_gpiv_popup[0].widget), "gpiv", gpiv); gtk_widget_ref (file_menu_gpiv_popup[1].widget); gtk_object_set_data (GTK_OBJECT (file_menu_gpiv_popup[1].widget), "gpiv", gpiv); gtk_widget_ref (file_menu_gpiv_popup[2].widget); gtk_object_set_data (GTK_OBJECT (file_menu_gpiv_popup[2].widget), "gpiv", gpiv); gtk_widget_ref (file_menu_gpiv_popup[3].widget); gtk_object_set_data (GTK_OBJECT (file_menu_gpiv_popup[3].widget), "gpiv", gpiv); gtk_widget_ref (file_menu_gpiv_popup[4].widget); gtk_object_set_data (GTK_OBJECT (file_menu_gpiv_popup[4].widget), "gpiv", gpiv); gtk_widget_ref (file_menu_gpiv_popup[5].widget); gtk_object_set_data (GTK_OBJECT (file_menu_gpiv_popup[5].widget), "gpiv", gpiv); gtk_widget_ref (settings_menu_gpiv_popup[0].widget); gtk_object_set_data_full (GTK_OBJECT (console), "gpiv_buttons", settings_menu_gpiv_popup[0].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (settings_menu_gpiv_popup[0].widget), "gpiv", gpiv); if (gpiv_par->console__view_gpivbuttons) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (settings_menu_gpiv_popup[0]. widget), TRUE); } else { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (settings_menu_gpiv_popup[0]. widget), FALSE); } gtk_widget_ref (settings_menu_gpiv_popup[1].widget); gtk_object_set_data_full (GTK_OBJECT (console), "tabulator", settings_menu_gpiv_popup[1].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (settings_menu_gpiv_popup[1].widget), "gpiv", gpiv); if (gpiv_par->console__view_tabulator) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (settings_menu_gpiv_popup[1]. widget), TRUE); } else { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (settings_menu_gpiv_popup[1]. widget), FALSE); } /* * settings_menu_gpiv_popup[2] represents NOMEUIINFO_SEPARATOR */ gtk_widget_ref(settings_menu_gpiv_popup[3].widget); gtk_object_set_data_full(GTK_OBJECT(console), "preferences", settings_menu_gpiv_popup[3].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data(GTK_OBJECT(settings_menu_gpiv_popup[3].widget), "gpiv", gpiv); if (gpiv_par->console__show_tooltips) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (help_menu_gpiv_popup[0]. widget), TRUE); } else { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (help_menu_gpiv_popup[0]. widget), FALSE); } return menu_gpiv_popup; } GpivConsole * create_gpiv (void ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = g_new0 (GpivConsole, 1); GdkPixbuf *logo = NULL; gint i; gpiv->tooltips = gtk_tooltips_new (); /* * Gnome2: from book Official dev.Guide */ logo = gdk_pixbuf_new_from_file(PIXMAPSDIR "gpiv_logo.png", NULL); gpiv->console = g_object_new(GNOME_TYPE_APP, "title", "gpiv console", "app-id", "gpiv", "default-width", CONSOLE_WIDTH, "default-height", CONSOLE_HEIGHT, "icon", logo, NULL); if (logo != NULL) g_object_unref (logo); gtk_object_set_data (GTK_OBJECT (gpiv->console), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->console), "delete_event" , G_CALLBACK (delete_console), NULL); gpiv->dock1 = GNOME_APP (gpiv->console)->dock; gtk_widget_ref (gpiv->dock1); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "dock1", gpiv->dock1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->dock1); /* * Menu bar with gnome_app_create_menus */ gnome_app_create_menus (GNOME_APP (gpiv->console), menubar_gpiv); gtk_widget_ref (menubar_gpiv[0].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "file", menubar_gpiv[0].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_ref (file_menu_gpiv[0].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "open", file_menu_gpiv[0].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (file_menu_gpiv[0].widget), "gpiv", gpiv); gtk_widget_ref (file_menu_gpiv[1].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "save", file_menu_gpiv[1].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (file_menu_gpiv[1].widget), "gpiv", gpiv); gtk_widget_ref (file_menu_gpiv[2].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "save_as", file_menu_gpiv[2].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (file_menu_gpiv[2].widget), "gpiv", gpiv); gtk_widget_ref (file_menu_gpiv[3].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "print", file_menu_gpiv[3].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (file_menu_gpiv[3].widget), "gpiv", gpiv); gtk_widget_ref (file_menu_gpiv[4].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "close", file_menu_gpiv[4].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (file_menu_gpiv[4].widget), "gpiv", gpiv); gtk_widget_ref (file_menu_gpiv[5].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "separator", file_menu_gpiv[5].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_ref (file_menu_gpiv[6].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "exit", file_menu_gpiv[6].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_ref (menubar_gpiv[1].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "settings", menubar_gpiv[1].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_ref (settings_menu_gpiv[0].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "gpiv_buttons", settings_menu_gpiv[0].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (settings_menu_gpiv[0].widget), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->console), "settings_menu_gpiv0", settings_menu_gpiv[0].widget); gtk_widget_ref (settings_menu_gpiv[1].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "tabulator", settings_menu_gpiv[1].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (settings_menu_gpiv[1].widget), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->console), "settings_menu_gpiv1", settings_menu_gpiv[1].widget); gtk_widget_ref (settings_menu_gpiv[3].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "preferences", settings_menu_gpiv[3].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (settings_menu_gpiv[3].widget), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->console), "settings_menu_gpiv3", settings_menu_gpiv[3].widget); gtk_widget_ref (menubar_gpiv[2].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "help", menubar_gpiv[2].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_ref (help_menu_gpiv[0].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "tooltip", help_menu_gpiv[0].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (help_menu_gpiv[0].widget), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->console), "help_menu_gpiv0", help_menu_gpiv[0].widget); gtk_widget_ref (help_menu_gpiv[1].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "manual", help_menu_gpiv[1].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (help_menu_gpiv[1].widget), "gpiv", gpiv); gtk_widget_ref (help_menu_gpiv[2].widget); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "about", help_menu_gpiv[2].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (help_menu_gpiv[2].widget), "gpiv", gpiv); /* * toolbar */ /* gnome_app_create_toolbar (GNOME_APP (gpiv->console), toolbar_gpiv); */ gpiv->toolbar1 = gtk_toolbar_new (); gtk_widget_show (gpiv->toolbar1); gnome_app_add_toolbar (GNOME_APP (gpiv->console), GTK_TOOLBAR (gpiv->toolbar1), "gpiv->toolbar1", BONOBO_DOCK_ITEM_BEH_EXCLUSIVE, BONOBO_DOCK_TOP, 1, 0, 0); gtk_toolbar_set_style (GTK_TOOLBAR (gpiv->toolbar1), GTK_TOOLBAR_BOTH); gpiv->tmp_toolbar_icon_size = gtk_toolbar_get_icon_size (GTK_TOOLBAR (gpiv-> toolbar1)); gpiv->button_open = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-open"); gtk_widget_show (gpiv->button_open); gtk_container_add (GTK_CONTAINER (gpiv->toolbar1), gpiv->button_open); gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (gpiv->button_open), gpiv->tooltips, _("Open a PIV image or data-file"), NULL); gtk_object_set_data (GTK_OBJECT (gpiv->button_open), "gpiv", gpiv); g_signal_connect ((gpointer) gpiv->button_open, "clicked", G_CALLBACK (on_button_open_clicked), NULL); gpiv->button_save = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-save"); gtk_widget_show (gpiv->button_save); gtk_container_add (GTK_CONTAINER (gpiv->toolbar1), gpiv->button_save); gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (gpiv->button_save), gpiv->tooltips, _("Save data"), NULL); gtk_object_set_data (GTK_OBJECT (gpiv->button_save), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->button_save), "clicked", G_CALLBACK (on_save_activate), NULL); /* gpiv->button_print = */ /* (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-print"); */ /* gtk_widget_show (gpiv->button_print); */ /* gtk_container_add (GTK_CONTAINER (gpiv->toolbar1), */ /* gpiv->button_print); */ /* gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (gpiv->button_print), */ /* gpiv->tooltips, */ /* _("Print the displayed data of active buffer(s)"), */ /* NULL); */ /* gtk_object_set_data (GTK_OBJECT (gpiv->button_print), */ /* "gpiv", */ /* gpiv); */ /* g_signal_connect (GTK_OBJECT (gpiv->button_print), */ /* "clicked", */ /* G_CALLBACK (on_print_activate), */ /* NULL); */ /* gtk_widget_hide (GTK_WIDGET (gpiv->button_print)); */ gpiv->button_execute = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-execute"); gtk_widget_show (gpiv->button_execute); gtk_container_add (GTK_CONTAINER (gpiv->toolbar1), gpiv->button_execute); gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (gpiv->button_execute), gpiv->tooltips, _("Execute the enabled chain process(es)"), NULL); gtk_object_set_data (GTK_OBJECT (gpiv->button_execute), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->button_execute), "clicked", G_CALLBACK (on_execute_activate), NULL); gpiv->button_stop = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-stop"); gtk_widget_show (gpiv->button_stop); gtk_container_add (GTK_CONTAINER (gpiv->toolbar1), gpiv->button_stop); gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (gpiv->button_stop), gpiv->tooltips, _("Cancels all running processes"), NULL); gtk_object_set_data (GTK_OBJECT (gpiv->button_stop), "gpiv", gpiv); g_signal_connect ((gpointer) gpiv->button_stop, "clicked", G_CALLBACK (on_button_stop_press), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_stop), "button_press_event", G_CALLBACK (on_button_stop_press), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_stop), "button_release_event", G_CALLBACK (on_button_stop_release), NULL); gpiv->button_close = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-close"); gtk_widget_show (gpiv->button_close); gtk_container_add (GTK_CONTAINER (gpiv->toolbar1), gpiv->button_close); gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (gpiv->button_close), gpiv->tooltips, _("Close active buffer(s).\nA warning message will be issued for unsaved data"), NULL); gtk_object_set_data (GTK_OBJECT (gpiv->button_close), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->button_close), "clicked", G_CALLBACK (on_close_activate), NULL); /* gpiv->vseparator = gtk_vseparator_new (); */ /* gtk_widget_show (gpiv->vseparator); */ /* gtk_container_add (GTK_CONTAINER (gpiv->toolbar1), gpiv->vseparator); */ /* gnome_app_add_docked (GNOME_APP (gpiv->console), */ /* GTK_CONTAINER (gpiv->toolbar1), */ /* gpiv->vseparator, */ /* "vseparator", */ /* BONOBO_DOCK_ITEM_BEH_NORMAL, */ /* BONOBO_DOCK_TOP, 2, 0, 0); */ gpiv->button_exit = (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-quit"); gtk_widget_show (gpiv->button_exit); gtk_container_add (GTK_CONTAINER (gpiv->toolbar1), gpiv->button_exit); gtk_tool_item_set_tooltip (GTK_TOOL_ITEM (gpiv->button_exit), gpiv->tooltips, _("Exit GPIV.\nA warning message will be issued for unsaved data"), NULL); gtk_object_set_data (GTK_OBJECT (gpiv->button_exit), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->button_exit), "clicked", G_CALLBACK (on_exit_activate), NULL); /* * vbox_main contains handleboxes for toolbar, gpiv toolbar, tabulator * and bufferlist */ gpiv->vbox_main = gtk_vbox_new (FALSE, 0); gtk_widget_ref (gpiv->vbox_main); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "vbox_main", gpiv->vbox_main, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->vbox_main); gnome_app_set_contents (GNOME_APP (gpiv->console), gpiv->vbox_main); /* * handlebox and toolbar for gpiv chain processes buttons */ gpiv->handlebox1 = gtk_handle_box_new (); gtk_widget_ref (gpiv->handlebox1); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "handlebox1", gpiv->handlebox1, (GtkDestroyNotify) gtk_widget_unref); gtk_box_pack_start (GTK_BOX (gpiv->vbox_main), gpiv->handlebox1, FALSE, TRUE, 0); /* * Scrolled window */ gpiv->scrolledwindow_handbox1 = gtk_scrolled_window_new (NULL, NULL); gtk_widget_ref (gpiv->scrolledwindow_handbox1); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "scrolledwindow_handbox1", gpiv->scrolledwindow_handbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->scrolledwindow_handbox1); gtk_container_add (GTK_CONTAINER (gpiv->handlebox1), gpiv->scrolledwindow_handbox1); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (gpiv->scrolledwindow_handbox1), GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER); gpiv->viewport_handbox1 = gtk_viewport_new (NULL, NULL); gtk_widget_ref (gpiv->viewport_handbox1); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "viewport_handbox1", gpiv->viewport_handbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->viewport_handbox1); gtk_container_add (GTK_CONTAINER (gpiv->scrolledwindow_handbox1), gpiv->viewport_handbox1); gtk_widget_set_size_request (GTK_WIDGET (gpiv->viewport_handbox1), 410, 50); /* * toolbar with buttons for enabling processes */ gpiv->toolbar2 = gtk_toolbar_new (); gtk_widget_ref (gpiv->toolbar2); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "gpiv->toolbar2", gpiv->toolbar2, (GtkDestroyNotify) gtk_widget_unref); /* * BUGFIX: Gnome2: disable? */ /* gtk_toolbar_set_space_style (GTK_TOOLBAR (gpiv->toolbar2), */ /* GTK_TOOLBAR_SPACE_LINE); */ gtk_widget_show (gpiv->toolbar2); gtk_container_add (GTK_CONTAINER (gpiv->viewport_handbox1), gpiv->toolbar2); gpiv->hbox_toolbar2 = gtk_hbox_new (FALSE, 0); gtk_widget_ref (gpiv->vbox_main); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "hbox_toolbar2", gpiv->hbox_toolbar2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->hbox_toolbar2); gtk_container_add (GTK_CONTAINER (gpiv->toolbar2), gpiv->hbox_toolbar2); #ifdef ENABLE_CAM /* * camera process button */ gpiv->button_toolbar_cam = gtk_check_button_new_with_label(_("camera")); gtk_widget_ref(gpiv->button_toolbar_cam); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "button_toolbar_cam", gpiv->button_toolbar_cam, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(gpiv->button_toolbar_cam); gtk_box_pack_start(GTK_BOX(gpiv->hbox_toolbar2), gpiv->button_toolbar_cam, FALSE, FALSE, 0); gtk_tooltips_set_tip(gpiv->tooltips, gpiv->button_toolbar_cam, _("Enables camera for image recording within the chain process. \n\ The process will be executed by clicking the Execute button"), NULL); gtk_object_set_data(GTK_OBJECT(gpiv->button_toolbar_cam), "gpiv", gpiv); gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_cam), "enter", G_CALLBACK (on_button_dac_camstart_enter), NULL); gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_cam), "leave", G_CALLBACK (on_widget_leave), NULL); gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_cam), "clicked", G_CALLBACK (on_toolbar_checkbutton_cam), NULL); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (gpiv->button_toolbar_cam), gpiv_par->process__cam); #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG /* * trigger process button */ gpiv->button_toolbar_trig = gtk_check_button_new_with_label(_("trigger")); gtk_widget_ref(gpiv->button_toolbar_trig); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "button_toolbar_trig", gpiv->button_toolbar_trig, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(gpiv->button_toolbar_trig); gtk_box_pack_start(GTK_BOX(gpiv->hbox_toolbar2), gpiv->button_toolbar_trig, FALSE, FALSE, 0); gtk_tooltips_set_tip(gpiv->tooltips, gpiv->button_toolbar_trig, _("Enables (RTAI) camera and laser triggering within the chain process. \n\ The process will be executed by clicking the Execute button"), NULL); gtk_object_set_data(GTK_OBJECT(gpiv->button_toolbar_trig), "gpiv", gpiv); gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_trig), "enter", G_CALLBACK (on_button_dac_triggerstart_enter), NULL); gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_trig), "leave", G_CALLBACK (on_widget_leave), NULL); gtk_signal_connect(GTK_OBJECT(gpiv->button_toolbar_trig), "clicked", G_CALLBACK (on_toolbar_checkbutton_trig), NULL); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (gpiv->button_toolbar_trig), gpiv_par->process__trig); #endif /* ENABLE_TRIG */ #ifdef ENABLE_IMGPROC /* * Image processing button */ gpiv->button_toolbar_imgproc = gtk_check_button_new_with_label(_("image")); gtk_widget_ref(gpiv->button_toolbar_imgproc); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "button_toolbar_imgproc", gpiv->button_toolbar_imgproc, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(gpiv->button_toolbar_imgproc); gtk_box_pack_start(GTK_BOX(gpiv->hbox_toolbar2), gpiv->button_toolbar_imgproc, FALSE, FALSE, 0); gtk_tooltips_set_tip(gpiv->tooltips, gpiv->button_toolbar_imgproc, _("Enables image processing within the chain process. \n\ The process will be executed by clicking the Execute button"), NULL); gtk_object_set_data(GTK_OBJECT(gpiv->button_toolbar_imgproc), "gpiv", gpiv); g_signal_connect(GTK_OBJECT(gpiv->button_toolbar_imgproc), "enter", G_CALLBACK (on_button_imgproc_enter), NULL); g_signal_connect(GTK_OBJECT(gpiv->button_toolbar_imgproc), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect(GTK_OBJECT(gpiv->button_toolbar_imgproc), "clicked", G_CALLBACK (on_toolbar_checkbutton_imgproc), NULL); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (gpiv->button_toolbar_imgproc), gpiv_par->process__imgproc); #endif /* ENABLE_IMGPROC */ /* * piv process button */ gpiv->button_toolbar_piv = gtk_check_button_new_with_label ( _("piv")); gtk_widget_ref (gpiv->button_toolbar_piv); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "button_toolbar_piv", gpiv->button_toolbar_piv, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->button_toolbar_piv); gtk_box_pack_start (GTK_BOX (gpiv->hbox_toolbar2), gpiv->button_toolbar_piv, FALSE, FALSE, 0); gtk_tooltips_set_tip (gpiv->tooltips, gpiv->button_toolbar_piv, _("Enables PIV image interrogation for chain processing: analysing of a PIV image \ (pair), resulting into the mean displacements of the particle images within \ each interrogation area. \n\ The process will be executed by clicking the Execute button"), NULL); gtk_object_set_data (GTK_OBJECT (gpiv->button_toolbar_piv), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_piv), "enter", G_CALLBACK (on_button_piv_enter), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_piv), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_piv), "clicked", G_CALLBACK (on_toolbar_checkbutton_piv), NULL); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (gpiv->button_toolbar_piv), gpiv_par->process__piv); gpiv->button_toolbar_gradient = gtk_check_button_new_with_label ( _("gradient")); gtk_widget_ref (gpiv->button_toolbar_gradient); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "button_toolbar_gradient", gpiv->button_toolbar_gradient, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->button_toolbar_gradient); gtk_box_pack_start (GTK_BOX (gpiv->hbox_toolbar2), gpiv->button_toolbar_gradient, FALSE, FALSE, 0); gtk_tooltips_set_tip (gpiv->tooltips, gpiv->button_toolbar_gradient, _("Enables gradient for chain processing: Disables velocities with gradients larger than \ 0.05 over the interrogation area. \ \nThe process will be executed by clicking the \"Execute\" button"), NULL); gtk_object_set_data (GTK_OBJECT (gpiv->button_toolbar_gradient), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_gradient), "enter", G_CALLBACK (on_button_valid_gradient_enter), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_gradient), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_gradient), "clicked", G_CALLBACK (on_toolbar_checkbutton_gradient), NULL); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (gpiv->button_toolbar_gradient), gpiv_par->process__gradient); gpiv->button_toolbar_resstats = gtk_check_button_new_with_label ( _("residu")); gtk_widget_ref (gpiv->button_toolbar_resstats); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "button_toolbar_resstats", gpiv->button_toolbar_resstats, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->button_toolbar_resstats); gtk_box_pack_start (GTK_BOX (gpiv->hbox_toolbar2), gpiv->button_toolbar_resstats, FALSE, FALSE, 0); gtk_tooltips_set_tip (gpiv->tooltips, gpiv->button_toolbar_resstats, _("Enables residu statistics for chain processing: calculates \ the residus of displacements for detection of outliers and shows an histogram \ of them. The histogram will be displayed in the Piv Validation tab. \n\ The process will be executed by clicking the Execute button"), NULL); gtk_object_set_data (GTK_OBJECT (gpiv->button_toolbar_resstats), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_resstats), "enter", G_CALLBACK (on_button_valid_errvec_resstats_enter), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_resstats), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_resstats), "clicked", G_CALLBACK (on_toolbar_checkbutton_resstats), NULL); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (gpiv->button_toolbar_resstats), gpiv_par->process__resstats); gpiv->button_toolbar_errvec = gtk_check_button_new_with_label ( _("validate")); gtk_widget_ref (gpiv->button_toolbar_errvec); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "button_toolbar_errvec", gpiv->button_toolbar_errvec, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->button_toolbar_errvec); gtk_box_pack_start (GTK_BOX (gpiv->hbox_toolbar2), gpiv->button_toolbar_errvec, FALSE, FALSE, 0); gtk_tooltips_set_tip (gpiv->tooltips, gpiv->button_toolbar_errvec, _("Enables validation for chain processing: detects \ outliers of PIV data by testing on median residu or by Signal to Noise \ Ratio magnitudes and, eventually, substitutes. \n\ The process will be executed by clicking the Execute button"), NULL); gtk_object_set_data (GTK_OBJECT (gpiv->button_toolbar_errvec), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_errvec), "enter", G_CALLBACK (on_button_valid_errvec_enter), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_errvec), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_errvec), "clicked", G_CALLBACK (on_toolbar_checkbutton_errvec), NULL); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (gpiv->button_toolbar_errvec), gpiv_par->process__errvec); gpiv->button_toolbar_peaklock = gtk_check_button_new_with_label ( _("sub-pixel")); gtk_widget_ref (gpiv->button_toolbar_peaklock); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "button_toolbar_peaklock", gpiv->button_toolbar_peaklock, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->button_toolbar_peaklock); gtk_box_pack_start (GTK_BOX (gpiv->hbox_toolbar2), gpiv->button_toolbar_peaklock, FALSE, FALSE, 0); gtk_tooltips_set_tip (gpiv->tooltips, gpiv->button_toolbar_peaklock, _("Enables peak-lock for chain processing: shows an histogram \ of sub-pixel displacements to check on peak-locking effects. \ The histogram will be displayed in the Piv Validation tab. \n\ The process will be executed by clicking the \"Execute\" button"), NULL); gtk_object_set_data (GTK_OBJECT (gpiv->button_toolbar_peaklock), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_peaklock), "enter", G_CALLBACK (on_button_valid_peaklck_enter), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_peaklock), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_peaklock), "clicked", G_CALLBACK (on_toolbar_checkbutton_peaklck), NULL); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (gpiv->button_toolbar_peaklock), gpiv_par->process__peaklock); gpiv->button_toolbar_scale = gtk_check_button_new_with_label ( _("scale")); gtk_widget_ref (gpiv->button_toolbar_scale); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "button_toolbar_scale", gpiv->button_toolbar_scale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->button_toolbar_scale); gtk_box_pack_start (GTK_BOX (gpiv->hbox_toolbar2), gpiv->button_toolbar_scale, FALSE, FALSE, 0); gtk_tooltips_set_tip (gpiv->tooltips, gpiv->button_toolbar_scale, _("Enables scaling for chain processing: scales spatial displacements \ over all data. \ \nThe process will be executed by clicking the \"Execute\" button"), NULL); gtk_object_set_data (GTK_OBJECT (gpiv->button_toolbar_scale), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_scale), "enter", G_CALLBACK (on_button_post_scale_enter), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_scale), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_scale), "clicked", G_CALLBACK (on_toolbar_checkbutton_scale), NULL); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (gpiv->button_toolbar_scale), gpiv_par->process__scale); gpiv->button_toolbar_average = gtk_check_button_new_with_label ( _("average")); gtk_widget_ref (gpiv->button_toolbar_average); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "button_toolbar_average", gpiv->button_toolbar_average, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->button_toolbar_average); gtk_box_pack_start (GTK_BOX (gpiv->hbox_toolbar2), gpiv->button_toolbar_average, FALSE, FALSE, 0); gtk_tooltips_set_tip (gpiv->tooltips, gpiv->button_toolbar_average, _("Enables average for chain processing: Calculates spatial average displacements \ over all data. \ \nThe process will be executed by clicking the \"Execute\" button"), NULL); gtk_object_set_data (GTK_OBJECT (gpiv->button_toolbar_average), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_average), "enter", G_CALLBACK (on_button_post_savg_enter), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_average), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_average), "clicked", G_CALLBACK (on_toolbar_checkbutton_average), NULL); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (gpiv->button_toolbar_average), gpiv_par->process__average); gpiv->button_toolbar_subavg = gtk_check_button_new_with_label ( _("subtract")); gtk_widget_ref (gpiv->button_toolbar_subavg); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "button_toolbar_subavg", gpiv->button_toolbar_subavg, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->button_toolbar_subavg); gtk_box_pack_start (GTK_BOX (gpiv->hbox_toolbar2), gpiv->button_toolbar_subavg, FALSE, FALSE, 0); gtk_tooltips_set_tip (gpiv->tooltips, gpiv->button_toolbar_subavg, _("Enables subtract for chain processing: subtracts spatial average displacements \ from all data. \ \nThe process will be executed by clicking the \"Execute\" button"), NULL); gtk_object_set_data (GTK_OBJECT (gpiv->button_toolbar_subavg), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_subavg), "enter", G_CALLBACK (on_button_post_subavg_enter), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_subavg), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_subavg), "clicked", G_CALLBACK (on_toolbar_checkbutton_subavg), NULL); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (gpiv->button_toolbar_subavg), gpiv_par->process__subtract); gpiv->button_toolbar_vorstra = gtk_check_button_new_with_label ( _("vorticity")); gtk_widget_ref (gpiv->button_toolbar_vorstra); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "button_toolbar_vorstra", gpiv->button_toolbar_vorstra, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->button_toolbar_vorstra); gtk_box_pack_start (GTK_BOX (gpiv->hbox_toolbar2), gpiv->button_toolbar_vorstra, FALSE, FALSE, 0); gtk_tooltips_set_tip (gpiv->tooltips, gpiv->button_toolbar_vorstra, _("Enables vorticity for chain processing: calculates \ vorticity or strain magnitudes from a velocity field.\n\ The process will be executed by clicking the Execute button"), NULL); gtk_object_set_data (GTK_OBJECT (gpiv->button_toolbar_vorstra), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_vorstra), "enter", G_CALLBACK (on_button_post_vorstra_enter), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_vorstra), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (gpiv->button_toolbar_vorstra), "clicked", G_CALLBACK (on_toolbar_checkbutton_vorstra), NULL); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (gpiv->button_toolbar_vorstra), gpiv_par->process__vorstra); /* * gpiv->hbox_main contains a handlebox with buffer list and tabulator */ gpiv->hbox_main = gtk_hbox_new (FALSE, 0); gtk_widget_ref (gpiv->hbox_main); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "hbox_main", gpiv->hbox_main, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->hbox_main); gtk_box_pack_start (GTK_BOX (gpiv->vbox_main), gpiv->hbox_main, TRUE, TRUE, 0); /* * Notebook (tabulator) */ gpiv->notebook = gtk_notebook_new (); gtk_widget_ref (gpiv->notebook); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "notebook", gpiv->notebook, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->notebook); gtk_box_pack_start (GTK_BOX (gpiv->hbox_main), gpiv->notebook, TRUE, TRUE, 0); #ifdef ENABLE_DAC /* * Tabulator for Data Acquisition */ gpiv->dac = create_dac (GNOME_APP(gpiv->console), gpiv->notebook); gpiv->tablabel_dac = gtk_label_new ( _("Record")); gtk_widget_ref (gpiv->tablabel_dac); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "tablabel_dac", gpiv->tablabel_dac, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->tablabel_dac); gtk_notebook_set_tab_label (GTK_NOTEBOOK (gpiv->notebook), GTK_WIDGET (gtk_notebook_get_nth_page (GTK_NOTEBOOK (gpiv->notebook), PAGE_DAC)), GTK_WIDGET(gpiv->tablabel_dac)); #endif /* ENABLE_DAC */ /* * Tabulator for Image header */ gpiv->imgh = create_imgh (GNOME_APP(gpiv->console), gpiv->notebook); gpiv->tablabel_imgh = gtk_label_new ( _("Image")); gtk_widget_ref (gpiv->tablabel_imgh); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "tablabel_imgh", gpiv->tablabel_imgh, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->tablabel_imgh); gtk_notebook_set_tab_label (GTK_NOTEBOOK (gpiv->notebook), GTK_WIDGET (gtk_notebook_get_nth_page (GTK_NOTEBOOK (gpiv->notebook), PAGE_IMGH)), GTK_WIDGET (gpiv->tablabel_imgh)); gtk_object_set_data (GTK_OBJECT (gpiv->imgh->radiobutton_mouse_1), "gpiv", gpiv); #ifdef ENABLE_IMGPROC /* * Tabulator for Image processing */ gpiv->imgproc = create_imgproc (GNOME_APP(gpiv->console), gpiv->notebook); gpiv->tablabel_imgproc = gtk_label_new ( _("Process")); gtk_widget_ref (gpiv->tablabel_imgproc); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "tablabel_imgproc", gpiv->tablabel_imgproc, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->tablabel_imgproc); gtk_notebook_set_tab_label (GTK_NOTEBOOK (gpiv->notebook), GTK_WIDGET (gtk_notebook_get_nth_page (GTK_NOTEBOOK (gpiv->notebook), PAGE_IMGPROC)), GTK_WIDGET (gpiv->tablabel_imgproc)); for (i = 0; i < IMG_FILTERS; i++) { gtk_object_set_data (GTK_OBJECT (gpiv->imgproc->imf_inf[i]->button_filter), "gpiv", gpiv); } gtk_object_set_data (GTK_OBJECT (gpiv->imgproc->button), "gpiv", gpiv); #endif /* * Tabulator for Interrogation */ gpiv->piveval = create_piveval (GNOME_APP(gpiv->console), gpiv->notebook); gpiv->tablabel_piveval = gtk_label_new ( _("Interrogate")); gtk_widget_ref (gpiv->tablabel_piveval); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "tablabel_piveval", gpiv->tablabel_piveval, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->tablabel_piveval); gtk_notebook_set_tab_label (GTK_NOTEBOOK (gpiv->notebook), GTK_WIDGET (gtk_notebook_get_nth_page (GTK_NOTEBOOK (gpiv->notebook), PAGE_PIVEVAL)), GTK_WIDGET (gpiv->tablabel_piveval)); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_mouse_0), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_mouse_1), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_mouse_2), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_mouse_3), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_mouse_4), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_mouse_5), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_mouse_6), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->checkbutton_monitor), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_fit_none), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_fit_gauss), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_fit_power), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_fit_gravity), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_peak_1), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_peak_2), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_peak_3), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_weightkernel), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_zerooff), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_centraldiff), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->radiobutton_imgdeform), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->checkbutton_weight_ia), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->piveval->checkbutton_spof), "gpiv", gpiv); /* gtk_object_set_data (GTK_OBJECT (gpiv->piveval->spinbutton_monitor_zoom), */ /* "gpiv", */ /* gpiv); */ /* gtk_object_set_data (GTK_OBJECT (gpiv->piveval->spinbutton_monitor_vectorscale), */ /* "gpiv", */ /* gpiv); */ gtk_object_set_data (GTK_OBJECT (gpiv->piveval->button), "gpiv", gpiv); /* * Tabulator for PIV-data validation */ gpiv->pivvalid = create_pivvalid (GNOME_APP(gpiv->console), gpiv->notebook); gpiv->tablabel_pivvalid = gtk_label_new ( _("Validate")); gtk_widget_ref (gpiv->tablabel_pivvalid); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "tablabel_pivvalid", gpiv->tablabel_pivvalid, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->tablabel_pivvalid); gtk_notebook_set_tab_label (GTK_NOTEBOOK (gpiv->notebook), GTK_WIDGET (gtk_notebook_get_nth_page (GTK_NOTEBOOK (gpiv->notebook), PAGE_PIVVALID)), GTK_WIDGET (gpiv->tablabel_pivvalid)); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->button_gradient), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->radiobutton_disable_0), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->radiobutton_disable_1), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->radiobutton_disable_2), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->radiobutton_disable_3), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->radiobutton_disable_4), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->button_gradient), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->button_errvec_resstats), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->button_peaklck), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->button_uhisto), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->button_vhisto), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->radiobutton_errvec_residu_snr), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->radiobutton_errvec_residu_median), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->radiobutton_errvec_residu_normmedian), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->checkbutton_errvec_disres), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->radiobutton_errvec_subst_0), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->radiobutton_errvec_subst_1), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->radiobutton_errvec_subst_2), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->radiobutton_errvec_subst_3), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivvalid->button_errvec), "gpiv", gpiv); /* * Tabulator for PIV-data post-processing */ /* pivpost->checkbutton_scale */ gpiv->pivpost = create_pivpost (GNOME_APP(gpiv->console), gpiv->notebook); /* gtk_object_set_data (GTK_OBJECT (gpiv->console), */ /* "gpiv", */ /* gpiv); */ gpiv->tablabel_pivpost = gtk_label_new ( _("Post process")); gtk_widget_ref (gpiv->tablabel_pivpost); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "tablabel_pivpost", gpiv->tablabel_pivpost, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->tablabel_pivpost); gtk_notebook_set_tab_label (GTK_NOTEBOOK (gpiv->notebook), GTK_WIDGET (gtk_notebook_get_nth_page (GTK_NOTEBOOK (gpiv->notebook), PAGE_PIVPOST)), GTK_WIDGET (gpiv->tablabel_pivpost)); gtk_object_set_data (GTK_OBJECT (gpiv->pivpost->button_scale), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivpost->button_savg), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivpost->button_subavg), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivpost-> radiobutton_vorstra_output_1), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivpost-> radiobutton_vorstra_output_2), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivpost-> radiobutton_vorstra_output_3), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivpost-> radiobutton_vorstra_diffscheme_1), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivpost-> radiobutton_vorstra_diffscheme_2), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivpost-> radiobutton_vorstra_diffscheme_3), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivpost-> radiobutton_vorstra_diffscheme_4), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (gpiv->pivpost->button_vorstra), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->notebook), "switch-page", G_CALLBACK (on_notebook_switch_page), NULL); gtk_notebook_set_page (GTK_NOTEBOOK (gpiv->notebook), gpiv_var->tab_pos); /* * handlebox of buffer list */ gpiv->handlebox_buf = gtk_handle_box_new (); gtk_widget_ref (gpiv->handlebox_buf); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "handlebox_buf", gpiv->handlebox_buf, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->handlebox_buf); gtk_box_pack_start (GTK_BOX (gpiv->hbox_main), gpiv->handlebox_buf, TRUE, TRUE, 0); gtk_handle_box_set_handle_position (GTK_HANDLE_BOX (gpiv->handlebox_buf), GTK_POS_TOP); gtk_tooltips_set_tip (gpiv->tooltips, gpiv->handlebox_buf, _("buffer names and numbers"), NULL); gpiv->alignment_buf = gtk_alignment_new (0.0, 0.0, 0.0, 1.0); gtk_widget_ref (gpiv->alignment_buf); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "alignment_buf", gpiv->alignment_buf, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->alignment_buf); gtk_container_add (GTK_CONTAINER (gpiv->handlebox_buf), gpiv->alignment_buf); gpiv->eventbox_buf = gtk_event_box_new (); gtk_widget_ref (gpiv->eventbox_buf); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "gpiv->eventbox_buf", gpiv->eventbox_buf, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->eventbox_buf); gtk_container_add (GTK_CONTAINER (gpiv->alignment_buf), gpiv->eventbox_buf); gpiv->scrolledwindow_buf = gtk_scrolled_window_new (NULL, NULL); gtk_widget_ref (gpiv->scrolledwindow_buf); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "scrolledwindow_buf", gpiv->scrolledwindow_buf, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->scrolledwindow_buf); gtk_container_add (GTK_CONTAINER (gpiv->eventbox_buf), gpiv->scrolledwindow_buf); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (gpiv->scrolledwindow_buf), /* GTK_POLICY_NEVER */ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); /* gpiv->scrolledwindow_buf_adj = gtk_adjustment_new (0.0, 500.0, 100.0, 5.0, 50.0, 2500.0); */ /* gtk_scrolled_window_set_hadjustment (GTK_SCROLLED_WINDOW (gpiv->scrolledwindow_buf), */ /* GTK_ADJUSTMENT (gpiv->scrolledwindow_buf_adj)); */ /* gnome_canvas_set_scroll_region ( GNOME_CANVAS (canvas_display ()->display_act->gpd.display), */ /* 0.0, 0.0, IMAGE_WIDTH, IMAGE_HEIGHT); */ gpiv->viewport_buf = gtk_viewport_new (NULL, NULL); gtk_widget_ref (gpiv->viewport_buf); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "viewport_buf", gpiv->viewport_buf, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->viewport_buf); gtk_container_add (GTK_CONTAINER (gpiv->scrolledwindow_buf), gpiv->viewport_buf); gtk_widget_set_size_request (gpiv->viewport_buf, 120, 400); #ifdef GTK4 enum { BUFFER_NUMBER, BUFFER_NAME, PIV_DATA, VALIDATED, STORED, N_COLUMNS }; gpiv->list_buf = gtk_treelist_store_new (N_COLUMNS, /* Total number of columns */ G_TYPE_INT, /* Buffer number */ G_TYPE_STRING, /* Buffer name */ G_TYPE_BOOLEAN, /* PIV data? */ G_TYPE_BOOLEAN, /* Validated PIV data? */ G_TYPE_BOOLEAN, /* Stored PIV data? */ ); #endif gpiv->clist_buf = gtk_clist_new (2); gtk_widget_ref (gpiv->clist_buf); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "clist_buf", gpiv->clist_buf, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->clist_buf); gtk_container_add (GTK_CONTAINER (gpiv->viewport_buf/* scrolledwindow_buf */ ), gpiv->clist_buf); gtk_tooltips_set_tip (gpiv->tooltips, gpiv->clist_buf, _("buffer list"), NULL); gtk_clist_set_column_width (GTK_CLIST (gpiv->clist_buf), 0, 15); gtk_clist_set_column_width (GTK_CLIST (gpiv->clist_buf), 1, 80); gtk_clist_set_selection_mode (GTK_CLIST (gpiv->clist_buf), GTK_SELECTION_EXTENDED /* MULTIPLE */); gtk_clist_column_titles_show (GTK_CLIST (gpiv->clist_buf)); gtk_object_set_data (GTK_OBJECT (gpiv->clist_buf), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (gpiv->clist_buf), "select_row", G_CALLBACK (on_clist_buf_rowselect), NULL); gpiv->label_buf_1 = gtk_label_new ( _("#")); gtk_widget_ref (gpiv->label_buf_1); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "label_buf_1", gpiv->label_buf_1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->label_buf_1); gtk_clist_set_column_widget (GTK_CLIST (gpiv->clist_buf), 0, gpiv->label_buf_1); gpiv->label_buf_2 = gtk_label_new ( _("buffer name")); gtk_widget_ref (gpiv->label_buf_2); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "label_buf_2", gpiv->label_buf_2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->label_buf_2); gtk_clist_set_column_widget (GTK_CLIST (gpiv->clist_buf), 1, gpiv->label_buf_2); gtk_misc_set_alignment (GTK_MISC (gpiv->label_buf_2), 0.0, 0.5); gtk_clist_column_titles_passive (GTK_CLIST (gpiv->clist_buf)); /* gtk_clist_set_policy (GTK_CLIST (gpiv->clist_buf), */ /* GTK_POLICY_ALWAYS, */ /* GTK_POLICY_ALWAYS); */ gtk_clist_set_column_auto_resize (GTK_CLIST (gpiv->clist_buf), 1, TRUE); gpiv->scrolledwindow_buf_adj = gtk_adjustment_new (0.0, 500.0, 100.0, 5.0, 50.0, 250.0 /* 2500.0 */); gtk_scrolled_window_set_hadjustment (GTK_SCROLLED_WINDOW (gpiv->scrolledwindow_buf), GTK_ADJUSTMENT (gpiv->scrolledwindow_buf_adj)); gtk_drag_dest_set (GTK_WIDGET (gpiv->clist_buf), GTK_DEST_DEFAULT_DROP, target_table, G_N_ELEMENTS (target_table), GDK_ACTION_COPY); g_signal_connect (GTK_OBJECT (gpiv->clist_buf), "drag_data_received", G_CALLBACK (on_clist_buf_drag_data_received), NULL); /* * Application bar buttons */ gpiv->appbar = gnome_appbar_new (TRUE, TRUE, GNOME_PREFERENCES_ALWAYS); gtk_widget_ref (gpiv->appbar); gtk_object_set_data_full (GTK_OBJECT (gpiv->console), "appbar", gpiv->appbar, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (gpiv->appbar); gnome_app_set_statusbar (GNOME_APP (gpiv->console), gpiv->appbar); /* gtk_widget_set_sensitive (gpiv->appbar, FALSE); */ /* * set gpiv->menubars after definition of all console widgets */ if (gpiv_par->console__view_gpivbuttons) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (settings_menu_gpiv[0].widget), TRUE); } else { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (settings_menu_gpiv[0].widget), FALSE); } if (gpiv_par->console__view_tabulator) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (settings_menu_gpiv[1].widget), TRUE); } else { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (settings_menu_gpiv[1].widget), FALSE); } if (gpiv_par->console__show_tooltips) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (help_menu_gpiv[0].widget), TRUE); } else { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (help_menu_gpiv[0].widget), FALSE); } gnome_app_install_menu_hints (GNOME_APP (gpiv->console), menubar_gpiv); return gpiv; } gpiv-0.6.1/src/console_interface.h0000644000175000017500000001217411110307370014024 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -----------------------------------------------------------------------------*/ /* * $Log: console_interface.h,v $ * Revision 1.9 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.8 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.7 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.6 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.5 2006-09-18 07:27:05 gerber * *** empty log message *** * * Revision 1.4 2006/01/31 14:28:11 gerber * version 0.3.0 * * Revision 1.2 2005/01/19 15:53:41 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ /* -- widgets from GtkWidget *gpiv_gui_gtk ------------*/ /* #ifdef HAVE_CONFIG_H */ /* # include */ /* #endif */ /* GtkWidget* create_exit (void); */ #ifndef CONSOLE_INTERFACE_H #define CONSOLE_INTERFACE_H #include "gpiv_gui.h" #ifdef ENABLE_DAC #include "dac_interface.h" #endif /* ENABLE_DAC */ #include "imgh_interface.h" #ifdef ENABLE_IMGPROC #include "imgproc_interface.h" #endif /* ENABLE_IMGPROC */ #include "piveval_interface.h" #include "pivvalid_interface.h" #include "pivpost_interface.h" /* * widget for pop-up menu */ typedef struct _GpivConsole GpivConsole; struct _GpivConsole { /* * General widgets for gpiv-gui */ GnomeApp *console; GtkWidget *appbar; GtkTooltips *tooltips; GtkWidget *dock1; GtkWidget *alignment3; GtkWidget *menubar; GtkWidget *eventbox1; GtkWidget *toolbar1; gint tmp_toolbar_icon_size; GtkWidget *button_open; GtkWidget *button_save; /* GtkWidget *button_print; */ GtkWidget *button_execute; GtkWidget *button_stop; GtkWidget *button_close; GtkWidget *vseparator; GtkWidget *button_exit; GtkWidget *hbox_main; GtkWidget *handlebox_buf; /* * Menu widgets */ GtkWidget *toggle_view_buttons; const GtkWidget *toggle_view_tool; const GtkWidget *toggle_view_tab; /* * Buffer handlebox & clist */ gint first_selected_row; gint last_selected_row; GtkWidget *alignment_buf; GtkWidget *eventbox_buf; GtkWidget *scrolledwindow_buf; GtkObject *scrolledwindow_buf_adj; GtkWidget *button_buf; GtkWidget *viewport_buf; #ifdef GTK4 GtkTreeStore *list_buf; #else #endif /* GTK4 */ GtkWidget *clist_buf; GtkWidget *label_buf_1; GtkWidget *label_buf_2; GtkWidget *vbox_main; /* * gpiv toolbox */ GtkWidget *handlebox1; GtkWidget *scrolledwindow_handbox1; GtkWidget *viewport_handbox1; GtkWidget *toolbar2; GtkWidget *hbox_toolbar2; #ifdef ENABLE_CAM GtkWidget *button_toolbar_cam; #endif #ifdef ENABLE_TRIG GtkWidget *button_toolbar_trig; #endif #ifdef ENABLE_IMGPROC GtkWidget *button_toolbar_imgproc; #endif GtkWidget *button_toolbar_piv; GtkWidget *button_toolbar_gradient; GtkWidget *button_toolbar_resstats; GtkWidget *button_toolbar_errvec; GtkWidget *button_toolbar_peaklock; GtkWidget *button_toolbar_scale; GtkWidget *button_toolbar_average; GtkWidget *button_toolbar_subavg; GtkWidget *button_toolbar_vorstra; /* * Tabulator */ GtkWidget *notebook; #ifdef ENABLE_CAM Dac *dac; GtkWidget *tablabel_dac; #else /* ENABLE_CAM */ #ifdef ENABLE_TRIG Dac *dac; GtkWidget *tablabel_dac; #endif /* ENABLE_TRIG */ #endif /* ENABLE_CAM */ Imgheader *imgh; GtkWidget *tablabel_imgh; #ifdef ENABLE_IMGPROC Imgprocess *imgproc; GtkWidget *tablabel_imgproc; #endif PivEval *piveval; GtkWidget *tablabel_piveval; PivValid *pivvalid; GtkWidget *tablabel_pivvalid; PivPost *pivpost; GtkWidget *tablabel_pivpost; GSList *mouse_sel_group; }; GpivConsole * create_gpiv(void); GtkWidget * create_menu_gpiv_popup (GpivConsole *gpiv); #endif /* CONSOLE_INTERFACE_H */ gpiv-0.6.1/src/dialog.c0000644000175000017500000000600611110306130011562 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * (Callback) functions for dialogs * $Id: dialog.c,v 1.1 2008-09-16 11:20:18 gerber Exp $ */ #ifdef HAVE_CONFIG_H # include #endif #include "support.h" #include "gpiv_gui.h" void on_button_quit_gpiv_clicked (GtkDialog *dialog, gint response, gpointer data ) /*----------------------------------------------------------------------------- * exit, message dialog callbacks */ { g_assert( response == GTK_RESPONSE_ACCEPT || response == GTK_RESPONSE_REJECT); switch (response) { case GTK_RESPONSE_ACCEPT: free_all_bufmems(display_act); gtk_main_quit(); break; case GTK_RESPONSE_REJECT: gtk_widget_destroy(GTK_WIDGET (dialog)); break; default: g_warning("on_button_quit_gpiv_clicked: should not arrive here"); break; } } void on_close_buffer_response (GtkDialog *dialog, gint response, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT(dialog), "gpiv"); Display *disp = gtk_object_get_data (GTK_OBJECT(dialog), "display"); g_assert ( response == GTK_RESPONSE_ACCEPT || response == GTK_RESPONSE_REJECT); /* g_message ("on_close_buffer_response:: id = %d", */ /* display_act->id); */ switch (response) { case GTK_RESPONSE_ACCEPT: /* * Deleting buffer and data */ close_buffer (gpiv, disp/* , row */); break; case GTK_RESPONSE_REJECT: /* * No action; just keep buffer with (unstored) data */ break; default: g_warning("on_close_buffer_response: should not arrive here"); break; } /* g_message ("on_close_buffer_response:: FINISHED"); */ } gpiv-0.6.1/src/dialog.h0000644000175000017500000000332311110307222011571 00000000000000 /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * Callbacks from dialogs * $Id: dialog.h,v 1.1 2008-09-16 11:19:37 gerber Exp $ */ #ifndef DIALOG_H #define DIALOG_H /* * Exit, message, error dialog callbacks */ void on_button_quit_gpiv_clicked(GtkDialog *dialog, gint response, gpointer data ); /* * From: create_close_buffer */ void on_close_buffer_response(GtkDialog *dialog, gint response, gpointer data ); /* void */ /* on_error_response(GtkDialog *dialog, */ /* gint response, */ /* gpointer data */ /* ); */ #endif /* CONSOLE_H */ gpiv-0.6.1/src/display.c0000644000175000017500000007601611110306066012010 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * (callback) functions for the display * $Log: display.c,v $ * Revision 1.24 2007-12-19 08:42:35 gerber * debugged * * Revision 1.23 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.22 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.21 2007/02/05 15:17:09 gerber * auto stretching, broadcast display settings to buffers from preferences * * Revision 1.20 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.19 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.18 2005/06/15 15:03:54 gerber * Optional Anti Aliased canvas for viewer * * Revision 1.17 2005/06/15 09:40:40 gerber * debugged, optimized * * Revision 1.16 2005/02/26 09:17:13 gerber * structured of interrogate function by using gpiv_piv_isiadapt * * Revision 1.15 2005/01/19 15:53:41 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.14 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.13 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.12 2003/09/01 11:17:14 gerber * improved monitoring of interrogation process * * Revision 1.11 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.10 2003/07/31 11:43:26 gerber * display images in gnome canvas (HOERAreset) * * Revision 1.9 2003/07/13 14:38:18 gerber * changed error handling of libgpiv * * Revision 1.8 2003/07/12 21:21:15 gerber * changed error handling libgpiv * * Revision 1.6 2003/07/10 11:56:07 gerber * added man page * * Revision 1.5 2003/07/05 13:14:57 gerber * drag and drop of a _series_ of filenames from NAUTILUS * * Revision 1.4 2003/07/04 10:47:00 gerber * cleaning up * * Revision 1.3 2003/07/03 17:08:02 gerber * display ruler adjusted for scaled data * * Revision 1.2 2003/06/27 13:47:26 gerber * display ruler, line/point evaluation * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #include "gpiv_gui.h" #include "utils.h" #include "display_interface.h" #include "display.h" #include "display_event.h" #include "display_zoom.h" #include "piveval.h" #include "dialog_interface.h" #include "console.h" static void on_adj_changed__adapt_hcanvas (Display *disp ); static void on_adj_changed__adapt_vcanvas (Display *disp ); static void on_adj_changed__adapt_hruler (Display *disp ); static void on_adj_changed__adapt_vruler (Display *disp ); static void synchronize_menu (GtkWidget *menu_src, gboolean active, GtkWidget *menu_dest ); /* * Callback display functions */ gint on_button_display_origin_press_event (GtkWidget *widget, GdkEventButton *event, gpointer data ) /*----------------------------------------------------------------------------- */ { gtk_menu_popup (GTK_MENU (display_act->display_popupmenu), NULL, NULL, NULL, NULL, event->button, event->time); return FALSE; } void on_display_set_focus (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { Display *disp = gtk_object_get_data(GTK_OBJECT (widget), "disp"); GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gint i = 0, row_selected = 0; gchar *text, labelno[GPIV_MAX_CHARS]; gtk_clist_set_selection_mode (GTK_CLIST (gpiv->clist_buf), GTK_SELECTION_SINGLE); g_snprintf (labelno, GPIV_MAX_CHARS,"%d", disp->id); for (i = 0; i < nbufs; i++) { gtk_clist_get_text (GTK_CLIST (gpiv->clist_buf), i, 0, &text); if (strcmp(labelno, text) == 0) { row_selected = i; } } gtk_clist_select_row (GTK_CLIST (gpiv->clist_buf), row_selected, 0); /* g_warning("on_display_set_focus:: disp->id=%d row_selected=%d", */ /* disp->id, row_selected); */ gtk_clist_set_selection_mode (GTK_CLIST (gpiv->clist_buf), GTK_SELECTION_EXTENDED); } void delete_display (GtkWidget *widget, GdkEvent *event, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); Display *disp = gtk_object_get_data (GTK_OBJECT (widget), "disp"); close_buffer__check_saved (gpiv, disp); } void on_adj_changed (GtkAdjustment *adj, gpointer data ) /*----------------------------------------------------------------------------- */ { Display *disp = gtk_object_get_data (GTK_OBJECT (adj), "disp"); enum variable_type { X_ADJ = 0, Y_ADJ = 1 } var_type; var_type = atoi (gtk_object_get_data (GTK_OBJECT (adj), "var_type")); /* g_message ("ON_ADJ_CHANGED:: " */ /* "value = %f lower = %f upper = %f page_size = %f", */ /* adj->value, adj->lower, adj->upper, adj->page_size); */ if (var_type == X_ADJ) { disp->x_adj_value = (gdouble) adj->value; disp->x_adj_upper = (gdouble) adj->upper; disp->x_adj_lower = (gdouble) adj->lower; disp->x_page_size = (gdouble) adj->page_size; on_adj_changed__adapt_hcanvas (disp); on_adj_changed__adapt_hruler (disp); } if (var_type == Y_ADJ) { disp->y_adj_value = (gdouble) adj->value; disp->y_adj_upper = (gdouble) adj->upper; disp->y_adj_lower = (gdouble) adj->lower; disp->y_page_size = (gdouble) adj->page_size; on_adj_changed__adapt_vcanvas (disp); on_adj_changed__adapt_vruler (disp); } /* g_message ("N_SCROLLEDWINDOW_DISPLAY_ADJ_CHANGED:: x_adj_value = %f" */ /* " x_adj_lower = %f x_adj_upper = %f x_page_size = %f", */ /* disp->x_adj_value, disp->x_adj_lower, disp->x_adj_upper, */ /* disp->x_page_size); */ } /* * Callbacks for menus */ void on_menu_synchronize_popup (GtkMenuItem *menuitem, gpointer user_data) /*----------------------------------------------------------------------------- * Synchronizing with popup menu item, which will actually change the * displaying of the menubar. */ { Display *disp = display_act; gint menu_id = (int) user_data; GtkWidget *popupmenu; if (menu_id == VIEW_MENUBAR) { popupmenu = gtk_object_get_data(GTK_OBJECT(disp->mwin), "view_menubar_popup_menu"); if (GTK_CHECK_MENU_ITEM(menuitem)->active == TRUE) { synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else { synchronize_menu (GTK_WIDGET (menuitem), FALSE, popupmenu); } } else if (menu_id == VIEW_RULERS) { popupmenu = gtk_object_get_data( GTK_OBJECT (disp->mwin), "view_rulers_popup_menu"); if (GTK_CHECK_MENU_ITEM (menuitem)->active == TRUE) { synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else { synchronize_menu (GTK_WIDGET (menuitem), FALSE, popupmenu); } } else if (menu_id == STRETCH_AUTO) { popupmenu = gtk_object_get_data( GTK_OBJECT (disp->mwin), "stretch_auto_popup_menu"); if (GTK_CHECK_MENU_ITEM (menuitem)->active == TRUE) { synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else { synchronize_menu (GTK_WIDGET (menuitem), FALSE, popupmenu); } } else if (menu_id == VIEW_BLUE) { popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_background_display0"); synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else if (menu_id == VIEW_BLACK) { popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_background_display1"); synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else if (menu_id == VIEW_IMAGE_A) { popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_background_display2"); synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else if (menu_id == VIEW_IMAGE_B) { popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_background_display3"); synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else if (menu_id == VIEW_INTERROGATION_AREAS) { popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_piv_display0"); if (GTK_CHECK_MENU_ITEM(menuitem)->active == TRUE) { synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else { synchronize_menu (GTK_WIDGET (menuitem), FALSE, popupmenu); } } else if (menu_id == VIEW_VELOCITY_VECTORS) { popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_piv_display1"); if (GTK_CHECK_MENU_ITEM (menuitem)->active == TRUE) { synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else { synchronize_menu (GTK_WIDGET (menuitem), FALSE, popupmenu); } } else if (menu_id == VIEW_NONE_SCALARS) { popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_scalardata_display0"); synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else if (menu_id == VIEW_VORTICITY) { popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_scalardata_display1"); synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else if (menu_id == VIEW_SHEAR_STRAIN) { popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_scalardata_display2"); synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else if (menu_id == VIEW_NORMAL_STRAIN) { popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_scalardata_display3"); synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else if (menu_id == VECTOR_COLOR_PEAK) { popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "vectorcolor_menu_display0"); synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else if (menu_id == VECTOR_COLOR_SNR) { popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "vectorcolor_menu_display1"); synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else if (menu_id == VECTOR_COLOR_MAGNGRAY) { popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "vectorcolor_menu_display2"); synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } else if (menu_id == VECTOR_COLOR_MAGNCOLOR) { popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "vectorcolor_menu_display3"); synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); } } void on_stretch_activate (GtkMenuItem *menuitem, gpointer user_data) /*----------------------------------------------------------------------------- */ { Display *disp = display_act; GtkAdjustment *hadj = GTK_ADJUSTMENT (disp->hadj); (disp->vadj) ; GtkAdjustment *vadj = GTK_ADJUSTMENT (disp->vadj) ; check__zoom_factor (&disp->zoom_factor); stretch_window (disp); vadj->lower = 0.0; vadj->upper = (gdouble) disp->img->image->header->nrows * disp->zoom_factor; vadj->page_size = (gdouble) (disp->img->image->header->nrows * disp->zoom_factor); hadj->lower = 0.0; hadj->upper = (gdouble) disp->img->image->header->ncolumns * disp->zoom_factor; hadj->page_size = (gdouble) (disp->img->image->header->ncolumns * disp->zoom_factor); } void on_zoom_activate (GtkMenuItem *menuitem, gpointer user_data) /*----------------------------------------------------------------------------- */ { Display *disp = display_act; gint zoom_index = (int) user_data; gchar *key = NULL; GtkWidget *popupmenu; key = g_strdup_printf ("zmv_%d", (int) zoom_index); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), key); synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); g_free (key); } void on_vector_scale_activate (GtkMenuItem *menuitem, gpointer user_data) /*----------------------------------------------------------------------------- */ { Display *disp = display_act; gchar *key = NULL; GtkWidget *popupmenu; guint16 fact = 1; fact = fact << (int) user_data; gpiv_par->display__vector_scale = fact; key = g_strdup_printf ("vs_mv_%d", (int) user_data); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), key); synchronize_menu (GTK_WIDGET (menuitem), TRUE, popupmenu); g_free (key); } /* * Callbacks for popup menus */ void view_toggle_menubar (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { Display *disp = display_act; GtkWidget *menu = gtk_object_get_data (GTK_OBJECT(disp->mwin), "view_menubar"); /* * Synchronizing menu item from menu bar. */ if (GTK_CHECK_MENU_ITEM (widget)->active == TRUE) { synchronize_menu (widget, TRUE, menu); } else { synchronize_menu (widget, FALSE, menu); } /* * Changing the displaying of menubar */ if (GTK_CHECK_MENU_ITEM (widget)->active == TRUE) { gtk_widget_show (GTK_WIDGET (disp->menubar)); } else { gtk_widget_hide (GTK_WIDGET (disp->menubar)); } } void view_toggle_rulers (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { Display *disp = display_act; /* * Synchronizing menu item from menu bar. */ if (GTK_CHECK_MENU_ITEM (widget)->active == TRUE) { synchronize_menu (widget, TRUE, disp->view_rulers); } else { synchronize_menu (widget, FALSE, disp->view_rulers); } /* * Changing the displaying of rulers */ if (GTK_CHECK_MENU_ITEM (widget)->active == TRUE) { gtk_widget_show (GTK_WIDGET (disp->hruler)); gtk_widget_show (GTK_WIDGET (disp->vruler)); } else { gtk_widget_hide (GTK_WIDGET (disp->hruler)); gtk_widget_hide (GTK_WIDGET (disp->vruler)); } } void view_toggle_stretch_display_auto (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { Display *disp = display_act; /* * Synchronizing menu item from menu bar. */ if (GTK_CHECK_MENU_ITEM (widget)->active == TRUE) { synchronize_menu (widget, TRUE, disp->stretch_auto); } else { synchronize_menu (widget, FALSE, disp->stretch_auto); } /* * Changing the displaying of rulers */ if (GTK_CHECK_MENU_ITEM (widget)->active == TRUE) { gpiv_par->display__stretch_auto = TRUE; check__zoom_factor (&disp->zoom_factor); stretch_window (disp); } else { gpiv_par->display__stretch_auto = FALSE; } } void view_toggle_stretch_display (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { Display *disp = display_act; gint screen_width = gdk_screen_width (); gint screen_height = gdk_screen_height (); check__zoom_factor (&disp->zoom_factor); stretch_window (disp); } void select_zoomscale (gpointer data, guint action, GtkWidget *widget ) /*----------------------------------------------------------------------------- */ { Display *disp = display_act; gint zoom_index = action; gchar *key1 = NULL, *key2 = NULL; GtkWidget *popupmenu, *menu; key1 = g_strdup_printf ("zmv_%d", (int) zoom_index); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), key1); key2 = g_strdup_printf ("zoom_menu_%d", (int) zoom_index); menu = gtk_object_get_data (GTK_OBJECT (disp->mwin), key2); synchronize_menu (popupmenu, TRUE, menu); zoom_display (disp, zoom_index); g_free (key1); g_free (key2); } void select_view_background (gpointer data, guint action, GtkWidget *widget) /*----------------------------------------------------------------------------- */ { gchar *color = NULL; Display *disp = display_act; GtkWidget *menu = NULL, *popupmenu = NULL; gpiv_par->display__backgrnd = action; hide_img1 (disp); hide_img2 (disp); /* * Select menu and popup menu widgets */ if (action == SHOW_BG_DARKBLUE) { menu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "blue_background_menu"); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_background_display0"); } else if (action == SHOW_BG_BLACK) { menu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "black_background_menu"); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_background_display1"); } else if (action == SHOW_BG_IMG1) { menu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "image_a_background_menu"); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_background_display2"); } else if (action == SHOW_BG_IMG2) { menu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "image_b_background_menu"); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_background_display3"); } /* * Synchronize */ synchronize_menu (popupmenu, TRUE, menu); /* * Perform action */ if (action == SHOW_BG_DARKBLUE) { color = "darkblue"; if (disp->gci_bg != NULL) { gnome_canvas_item_set (GNOME_CANVAS_ITEM (disp->gci_bg), "fill_color", color, NULL); } } else if (action == SHOW_BG_BLACK) { color = "black"; if (disp->gci_bg != NULL) { gnome_canvas_item_set (GNOME_CANVAS_ITEM (disp->gci_bg), "fill_color", color, NULL); } } else if (action == SHOW_BG_IMG1) { show_img1 (display_act); } else if (action == SHOW_BG_IMG2) { show_img2 (display_act); } else { color = "black"; if (disp->gci_bg != NULL) { gnome_canvas_item_set (GNOME_CANVAS_ITEM (disp->gci_bg), "fill_color", color, NULL); } else { g_warning (_("select_view_background: should not arrive here")); } } } void view_toggle_intregs (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { Display *disp = display_act; /* * Synchronizing menu item from menu bar. */ if (GTK_CHECK_MENU_ITEM (widget)->active == TRUE) { synchronize_menu (widget, TRUE, disp->view_interrogation_areas); } else { synchronize_menu (widget, FALSE, disp->view_interrogation_areas); } /* * Changing the displaying of interrogation area's */ if (GTK_CHECK_MENU_ITEM (widget)->active == TRUE) { if (view_toggle_intregs_flag) { if (display_act->display_intregs == FALSE) { display_act->display_intregs = TRUE; create_all_intregs (display_act); show_all_intregs (display_act); } } } else { if (display_act->display_intregs == TRUE) { destroy_all_intregs(display_act); display_act->display_intregs = FALSE; } } } void view_toggle_piv (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { Display *disp = display_act; /* * Synchronizing menu item from menu bar. */ if (GTK_CHECK_MENU_ITEM (widget)->active == TRUE) { synchronize_menu (widget, TRUE, disp->view_velocity_vectors); } else { synchronize_menu (widget, FALSE, disp->view_velocity_vectors); } /* * Changing the displaying of piv data (velocity vectors) */ if (display_act->pida->exist_piv) { if (GTK_CHECK_MENU_ITEM (widget)->active == TRUE) { if (display_act->display_piv == FALSE) { display_act->display_piv = TRUE; create_all_vectors (display_act->pida); } } else { if (display_act->display_piv == TRUE) { display_act->display_piv = FALSE; destroy_all_vectors (display_act->pida); } } } } void select_view_scalardata (gpointer data, guint action, GtkWidget *widget ) /*----------------------------------------------------------------------------- */ { gchar *color = NULL; Display *disp = display_act; GtkWidget *menu = NULL, *popupmenu = NULL; gpiv_par->display__scalar = action; hide_all_scalars (disp, GPIV_VORTICITY); hide_all_scalars (disp, GPIV_S_STRAIN); hide_all_scalars (disp, GPIV_N_STRAIN); /* * Select menu and popup menu widgets */ if (action == SHOW_SC_NONE) { menu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_none_scalars"); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_scalardata_display0"); } else if (action == SHOW_SC_VORTICITY) { menu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_vorticity"); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_scalardata_display1"); } else if (action == SHOW_SC_SSTRAIN) { menu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_shear_strain"); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_scalardata_display2"); } else if (action == SHOW_SC_NSTRAIN) { menu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_normal_strain"); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "view_scalardata_display3"); } synchronize_menu (popupmenu, TRUE, menu); /* * Perform action */ if (action == SHOW_SC_NONE) { hide_all_scalars (disp, GPIV_VORTICITY); hide_all_scalars (disp, GPIV_S_STRAIN); hide_all_scalars (disp, GPIV_N_STRAIN); } else if (action == SHOW_SC_VORTICITY) { show_all_scalars (display_act, GPIV_VORTICITY); } else if (action == SHOW_SC_SSTRAIN) { show_all_scalars (display_act, GPIV_S_STRAIN); } else if (action == SHOW_SC_NSTRAIN) { show_all_scalars (display_act, GPIV_N_STRAIN); } else { color = "black"; if (disp->gci_bg != NULL) { gnome_canvas_item_set (GNOME_CANVAS_ITEM (disp->gci_bg), "fill_color", color, NULL); } else { g_warning (_("select_view_scalardata: should not arrive here")); } } } void select_vectorscale (gpointer data, guint action, GtkWidget *widget ) /*----------------------------------------------------------------------------- Setting vector_scale from display pop-up menu */ { Display *disp = display_act; gchar *key1 = NULL, *key2 = NULL; GtkWidget *menu, *popupmenu; guint16 fact = 1; gpiv_par->display__vector_scale = fact << (int) action;; key1 = g_strdup_printf ("vector_scale_menu_%d", (int) action); menu = gtk_object_get_data (GTK_OBJECT (disp->mwin), key1); key2 = g_strdup_printf ("vs_mv_%d", (int) action); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), key2); synchronize_menu (popupmenu, TRUE, menu); update_all_vectors (display_act->pida); g_free (key1); g_free (key2); } void select_vectorcolor (gpointer data, guint action, GtkWidget *widget ) /*----------------------------------------------------------------------------- Setting vector_color from display pop-up menu */ { Display *disp = display_act; GtkWidget *menu, *popupmenu; /* * Select menu and popup menu widgets */ if (action == SHOW_PEAKNR) { menu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "vector_color_peak_nr"); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "vectorcolor_menu_display0"); } else if (action == SHOW_SNR) { menu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "vector_color_snr"); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "vectorcolor_menu_display1"); } else if (action == SHOW_MAGNITUDE_GRAY) { menu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "vector_color_magngray"); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "vectorcolor_menu_display2"); } else if (action == SHOW_MAGNITUDE) { menu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "vector_color_magncolor"); popupmenu = gtk_object_get_data (GTK_OBJECT (disp->mwin), "vectorcolor_menu_display3"); } /* * Synchronize */ synchronize_menu (popupmenu, TRUE, menu); /* * Perform action */ gpiv_par->display__vector_color = action; update_all_vectors (display_act->pida); } void nav_popup_click_handler (GtkWidget *widget, GdkEventButton *event, gpointer data ) /*----------------------------------------------------------------------------- */ { /* Seee gimp: nav_window.c */ } void on_view_options_clicked (GtkButton *button, gpointer user_data ) /*----------------------------------------------------------------------------- */ { } /* * Local functions */ static void on_adj_changed__adapt_hcanvas (Display *disp ) /*----------------------------------------------------------------------------- */ { int x_old, y_old; gnome_canvas_get_scroll_offsets (GNOME_CANVAS (disp->canvas), &x_old, &y_old); gnome_canvas_scroll_to (GNOME_CANVAS (disp->canvas), (int) disp->x_adj_value, y_old); } static void on_adj_changed__adapt_vcanvas (Display *disp ) /*----------------------------------------------------------------------------- */ { int x_old, y_old; gnome_canvas_get_scroll_offsets (GNOME_CANVAS (disp->canvas), &x_old, &y_old); gnome_canvas_scroll_to (GNOME_CANVAS (disp->canvas), x_old, (int) disp->y_adj_value); } static void on_adj_changed__adapt_hruler (Display *disp ) /*----------------------------------------------------------------------------- */ { set__hrulerscale (disp); } static void on_adj_changed__adapt_vruler (Display *disp ) /*----------------------------------------------------------------------------- */ { set__vrulerscale (disp); } static void synchronize_menu (GtkWidget *menu_src, gboolean state, GtkWidget *menu_dest ) /*----------------------------------------------------------------------------- * Synchronizes menu_dest with menu_src, which is in 'state' position. * Only change if the state between menu_src and menu_dest differ in order * to avoid a loop. */ { if (GTK_CHECK_MENU_ITEM (menu_src) != NULL && GTK_CHECK_MENU_ITEM (menu_src)->active == state) { if (GTK_CHECK_MENU_ITEM (menu_dest) != NULL && gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menu_dest)) == !state) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_dest), state); } } } gpiv-0.6.1/src/display.h0000644000175000017500000001277011110307200012001 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * (callback) functions for the display * $Log: display.h,v $ * Revision 1.14 2007-12-19 08:42:35 gerber * debugged * * Revision 1.13 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.12 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.11 2007/02/05 15:17:09 gerber * auto stretching, broadcast display settings to buffers from preferences * * Revision 1.10 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.9 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.8 2005/06/15 09:40:40 gerber * debugged, optimized * * Revision 1.7 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.6 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.5 2003/09/01 11:17:14 gerber * improved monitoring of interrogation process * * Revision 1.4 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.3 2003/07/31 11:43:26 gerber * display images in gnome canvas (HOERAreset) * * Revision 1.2 2003/06/27 13:47:26 gerber * display ruler, line/point evaluation * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef DISPLAY_H #define DISPLAY_H #include "display_image.h" #include "display_event.h" #include "display_zoom.h" enum DataType { DATA_TYPE__INTREG, DATA_TYPE__PIV }; enum DisplayMenuId { VIEW_MENUBAR, VIEW_RULERS, STRETCH_AUTO, VIEW_BLUE, VIEW_BLACK, VIEW_IMAGE_A, VIEW_IMAGE_B, VIEW_INTERROGATION_AREAS, VIEW_VELOCITY_VECTORS, VIEW_NONE_SCALARS, VIEW_VORTICITY, VIEW_SHEAR_STRAIN, VIEW_NORMAL_STRAIN, VECTOR_COLOR_PEAK, VECTOR_COLOR_SNR, VECTOR_COLOR_MAGNGRAY, VECTOR_COLOR_MAGNCOLOR }; gboolean shift_pressed, ctrl_pressed, alt_pressed; gint enable_col_start, enable_col_end, enable_row_start, enable_row_end; void /* on_display_set_focus(gpointer data, guint action, GtkWidget *widget); */ on_display_set_focus (GtkWidget *widget, gpointer data); void delete_display (GtkWidget *widget, GdkEvent *event, gpointer data); void on_adj_changed (GtkAdjustment *adj, gpointer data); /* void */ /* select_zoomscale (GtkMenuItem * menuitem, gpointer data, guint action); */ void zoom_display (Display *disp, gint zoom_index); /* * Callback functions for the display menu */ void on_menu_synchronize_popup (GtkMenuItem *menuitem, gpointer user_data); void on_stretch_activate (GtkMenuItem *menuitem, gpointer user_data); void on_zoom_activate (GtkMenuItem *menuitem, gpointer user_data); void on_vector_scale_activate (GtkMenuItem *menuitem, gpointer user_data); /* * Callbacks for popup menus */ void view_toggle_menubar (GtkWidget *widget, gpointer data); void view_toggle_rulers (GtkWidget *widget, gpointer data); void view_toggle_stretch_display_auto (GtkWidget *widget, gpointer data); void view_toggle_stretch_display (GtkWidget *widget, gpointer data); void select_zoomscale (gpointer data, guint action, GtkWidget *widget); void select_view_background (gpointer data, guint action, GtkWidget *widget); void view_toggle_intregs (GtkWidget *widget, gpointer data); void view_toggle_piv (GtkWidget *widget, gpointer data); void select_view_scalardata (gpointer data, guint action, GtkWidget *widget); void select_vectorscale (gpointer data, guint action, GtkWidget *widget); void select_vectorcolor (gpointer data, guint action, GtkWidget *widget); void on_view_options_clicked (GtkButton *button, gpointer user_data); #endif /* DISPLAY_H */ gpiv-0.6.1/src/dac.c0000644000175000017500000002215311115261606011070 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * Dac callbacks * $Id: dac.c,v 1.7 2008-09-16 11:13:09 gerber Exp $ */ #ifdef ENABLE_DAC #include "gpiv_gui.h" #include "utils.h" #include "console.h" #include "dac.h" /* * BUGFIX: Put somwhere to update on regular basis: gtk_label_set_text(GTK_LABEL(gpiv->dac->label_temp), "Temp"); */ static int init, start, stop, error; /* pthread_mutex_t mutex_rec = PTHREAD_MUTEX_INITIALIZER; */ /* * Global functions */ /* * Callback functions */ void on_entry_dac_fname (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { gint i; Dac * dac = gtk_object_get_data (GTK_OBJECT (widget), "dac"); push_list_lastfnames ((gchar *) gtk_entry_get_text( GTK_ENTRY( dac->entry_fname))); dac->combo_fname_items = NULL; for (i = 0; i < gpiv_var->number_fnames_last; i++) { dac->combo_fname_items = g_list_append (dac->combo_fname_items, gpiv_var->fn_last[i]); } gtk_combo_set_popdown_strings (GTK_COMBO (dac->combo_fname), dac->combo_fname_items); g_list_free (dac->combo_fname_items); /* * not used: * dac_par.fname__set = TRUE; */ } void on_checkbutton_fname_date_enter (GtkWidget *widget, gpointer data ) /* ---------------------------------------------------------------------------- */ { GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gchar *msg = _("Extends the name with current date"); gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); } void on_checkbutton_fname_date(GtkWidget *widget, gpointer data ) /* ---------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { gpiv_var->fname_date = TRUE; } else { gpiv_var->fname_date = FALSE; } gnome_config_push_prefix("/gpiv/RuntimeVariables/"); gnome_config_set_bool("fname_date", gpiv_var->fname_date); gnome_config_pop_prefix(); gnome_config_sync(); } void on_checkbutton_fname_time_enter(GtkWidget *widget, gpointer data ) /* ---------------------------------------------------------------------------- */ { GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gchar *msg = _("Extends the name with current time"); gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); } void on_checkbutton_fname_time(GtkWidget *widget, gpointer data ) /* ---------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { gpiv_var->fname_time = TRUE; } else { gpiv_var->fname_time = FALSE; } gnome_config_push_prefix("/gpiv/RuntimeVariables/"); gnome_config_set_bool("fname_time", gpiv_var->fname_time); gnome_config_pop_prefix(); gnome_config_sync(); } void on_radiobutton_dac_mouse_1_enter(GtkWidget * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gchar *msg = _("indefinite periodic recording"); gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); } void on_radiobutton_dac_mouse_2_enter(GtkWidget * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gchar *msg = _("with pre-defined number of images"); gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); } void on_radiobutton_dac_mouse_3_enter(GtkWidget * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gchar *msg = _("one shot with interrupd"); gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); } void on_radiobutton_dac_mouse_4_enter(GtkWidget * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gchar *msg = _("periodic with interrupt"); gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); } void on_radiobutton_dac_mouse_5_enter(GtkWidget * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gchar *msg = _("with incremental separation time dt"); gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); } void on_radiobutton_dac_mouse_6_enter(GtkWidget * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gchar *msg = _("double exposure"); gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); } #ifdef ENABLE_CAM void on_radiobutton_dac_mouse(GtkWidget * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { gint mouse_select = atoi(gtk_object_get_data(GTK_OBJECT(widget), "mouse_select")); gl_cam_par->mode = mouse_select; /* g_warning("on_radiobutton_dac_mouse:: mode = %d", */ /* gl_cam_par.mode); */ if (mouse_select == GPIV_CAM_MODE__PERIODIC) {} if (mouse_select == GPIV_CAM_MODE__DURATION) {} if (mouse_select == GPIV_CAM_MODE__ONE_SHOT_IRQ) {} if (mouse_select == GPIV_CAM_MODE__TRIGGER_IRQ) {} if (mouse_select == GPIV_CAM_MODE__INCREMENT) {} if (mouse_select == GPIV_CAM_MODE__DOUBLE) {} } #else /* ENABLE_CAM */ #ifdef ENABLE_TRIG void on_radiobutton_dac_mouse(GtkWidget * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { gint mouse_select = atoi(gtk_object_get_data(GTK_OBJECT(widget), "mouse_select")); trig_par.ttime.mode = mouse_select; /* g_warning("on_radiobutton_dac_mouse:: ttime.mode = %d", */ /* dac_par.ttime.mode); */ if (mouse_select == GPIV_TIMER_MODE__PERIODIC) {} if (mouse_select == GPIV_TIMER_MODE__DURATION) {} if (mouse_select == GPIV_TIMER_MODE__ONE_SHOT_IRQ) {} if (mouse_select == GPIV_TIMER_MODE__TRIGGER_IRQ) {} if (mouse_select == GPIV_TIMER_MODE__INCREMENT) {} if (mouse_select == GPIV_TIMER_MODE__DOUBLE) {} } #endif /* ENABLE_TRIG */ #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG #endif /* ENABLE_TRIG */ #ifdef ENABLE_CAM void on_spinbutton_dac_trigger_nf(GtkSpinButton * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { gl_cam_par->cycles = gtk_spin_button_get_value_as_int(widget); } #else /* ENABLE_CAM */ #ifdef ENABLE_TRIG void on_spinbutton_dac_trigger_nf(GtkSpinButton * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { trig_par.ttime.cycles = gtk_spin_button_get_value_as_int(widget); } #endif /* ENABLE_TRIG */ #endif /* ENABLE_CAM */ #endif /* ENABLE_DAC */ gpiv-0.6.1/src/dac.h0000644000175000017500000000671211110307346011075 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * (callback) functions for dac * $Log: dac.h,v $ * Revision 1.3 2006-09-18 07:27:05 gerber * *** empty log message *** * * Revision 1.2 2005/02/26 09:17:13 gerber * structured of interrogate function by using gpiv_piv_isiadapt * * Revision 1.1 2005/01/19 15:53:41 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * */ #ifndef DAC_H #define DAC_H #ifdef ENABLE_DAC /* #define MAX_COMBO_LIST 5 */ /* #define DACPAR_TIMING_MIN 3 */ /* #define DACPAR_TIMING_MAX 3 */ /* #define DACPAR_CAP_MIN 100 */ /* #define DACPAR_CAP_MAX 1000 */ /* #define DACPAR_NIMG_MIN 1 */ /* #define DACPAR_NIMG_MAX MAX_BUFS */ /* * Callback functions */ /* gboolean */ /* on_darea_expose (GtkWidget *widget, */ /* GdkEventExpose *event, */ /* gpointer user_data); */ void on_entry_dac_fname(GtkSpinButton *widget, GtkWidget *entry); void on_checkbutton_fname_date_enter(GtkWidget *widget, gpointer data); void on_checkbutton_fname_date(GtkWidget *widget, gpointer data); void on_checkbutton_fname_time_enter(GtkWidget *widget, gpointer data); void on_checkbutton_fname_time(GtkWidget *widget, gpointer data); void on_radiobutton_dac_mouse(GtkWidget * widget, GtkWidget * entry); void on_radiobutton_dac_mouse_1_enter(GtkWidget * widget, GtkWidget * entry); void on_radiobutton_dac_mouse_2_enter(GtkWidget * widget, GtkWidget * entry); void on_radiobutton_dac_mouse_3_enter(GtkWidget * widget, GtkWidget * entry); void on_radiobutton_dac_mouse_4_enter(GtkWidget * widget, GtkWidget * entry); void on_radiobutton_dac_mouse_5_enter(GtkWidget * widget, GtkWidget * entry); void on_radiobutton_dac_mouse_6_enter(GtkWidget * widget, GtkWidget * entry); void on_spinbutton_dac_trigger_nf(GtkSpinButton * widget, GtkWidget * entry); #endif /* ENABLE_DAC */ #endif /* DAC_H */ gpiv-0.6.1/src/display_scalars.c0000644000175000017500000004210211110305747013512 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ #include "gpiv_gui.h" #include "display_scalars.h" #ifdef CANVAS_AA static guint create_scalar_color (gint flag, gfloat sc_min, gfloat sc_max, gfloat sc, gfloat scale_factor ); #else /* CANVAS_AA */ static guint create_scalar_color (gint flag, gfloat sc_min, gfloat sc_max, gfloat sc, gfloat scale_factor ); #endif /* CANVAS_AA */ static void destroy_filledrect (GnomeCanvasItem *filled_rect ); static void show_filledrect (GnomeCanvasItem *filled_rect ); static void hide_filledrect (GnomeCanvasItem *filled_rect ); static void create_vor (Display *disp, gint i, gint j, guint col_val ); static void create_sstrain (Display *disp, gint i, gint j, guint col_val ); static void create_nstrain (Display *disp, gint i, gint j, guint col_val ); /* * Public functions */ void create_all_scalars(Display *disp, gint type ) /* ---------------------------------------------------------------------------- * Displays all scalar gnome canvas items */ { int i, j; int nx = 0, ny = 0, **flag = NULL; float **sc = NULL; float sc_min = 10000.0, sc_max = -10000.0; guint col_val = 0; GpivScalarData *scalar_data; GtkWidget *view_piv_display0 = gtk_object_get_data(GTK_OBJECT(disp->mwin), "view_piv_display0"); GtkWidget * view_piv_display1 = gtk_object_get_data(GTK_OBJECT(disp->mwin), "view_piv_display1"); float scale_factor = 0.0; if (type == GPIV_VORTICITY) { scalar_data = disp->pida->vor_data; sc = scalar_data->scalar; nx = disp->pida->vor_data->nx; ny = disp->pida->vor_data->ny; flag = disp->pida->vor_data->flag; /* scalar_colval(disp); */ } else if (type == GPIV_S_STRAIN) { scalar_data = disp->pida->sstrain_data; sc = scalar_data->scalar; nx = disp->pida->sstrain_data->nx; ny = disp->pida->sstrain_data->ny; flag = disp->pida->sstrain_data->flag; } else if (type == GPIV_N_STRAIN) { scalar_data = disp->pida->nstrain_data; sc = scalar_data->scalar; nx = disp->pida->nstrain_data->nx; ny = disp->pida->nstrain_data->ny; flag = disp->pida->nstrain_data->flag; } else { g_warning(_("create_all_scalars: unexisting type")); } /* * normalizing data between 0 and 1 to define color value col_val */ /* scalar_colval(Display * disp) { */ for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { if (flag[i][j] != -1) { if (sc[i][j] < sc_min) sc_min = sc[i][j]; if (sc[i][j] > sc_max) sc_max = sc[i][j]; } } } if (sc_min < 0) { if (-sc_min >= sc_max) { scale_factor = 1.0 / -sc_min; } else { scale_factor = 1.0 / sc_max; } } else { scale_factor = 1.0 / sc_max; } for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { col_val = create_scalar_color(flag[i][j], sc_min, sc_max, sc[i][j], scale_factor); if (type == GPIV_VORTICITY) { create_vor(disp, i, j, col_val); } else if (type == GPIV_S_STRAIN) { create_sstrain(disp, i, j, col_val); } else if (type == GPIV_N_STRAIN) { create_nstrain(disp, i, j, col_val); } else { g_warning(_("create_all_scalars: unexisting type")); } } } if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { gnome_canvas_item_raise_to_top (disp->intreg->gci_intreg1[i][j]); gnome_canvas_item_raise_to_top (display_act->intreg->gci_intreg2[i][j]); } } } if (GTK_CHECK_MENU_ITEM(view_piv_display1)->active) { if (disp->pida->exist_piv && disp->display_piv) { for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { gnome_canvas_item_raise_to_top (disp->pida->gci_vector[i][j]); } } } } } void show_all_scalars(Display *disp, gint type ) /* ---------------------------------------------------------------------------- * Shows scalar gnome canvas items */ { guint i = 0, j = 0; guint nx = 0, ny = 0; if (disp->pida->vor_data == NULL) return; if (type == GPIV_VORTICITY && disp->pida->vor_data != NULL) { nx = disp->pida->vor_data->nx; ny = disp->pida->vor_data->ny; for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { /* if (i ==0 && j==0) */ show_filledrect(display_act->pida->gci_scalar_vor[i][j]); } } display_act->display_scalar = SHOW_SC_VORTICITY; } if (type == GPIV_S_STRAIN && disp->pida->sstrain_data != NULL) { nx = disp->pida->sstrain_data->nx; ny = disp->pida->sstrain_data->ny; for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { show_filledrect(display_act->pida->gci_scalar_sstrain[i][j]); } } display_act->display_scalar = SHOW_SC_SSTRAIN; } if (type == GPIV_N_STRAIN && disp->pida->nstrain_data != NULL) { nx = disp->pida->nstrain_data->nx; ny = disp->pida->nstrain_data->ny; for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { show_filledrect(display_act->pida->gci_scalar_nstrain[i][j]); } } display_act->display_scalar = SHOW_SC_NSTRAIN; } } void hide_all_scalars (Display *disp, gint type ) /* ---------------------------------------------------------------------------- * Hides all scalar gnome canvas items */ { guint i, j; /* int nx = disp->pida->scalar_data->nx, ny = disp->pida->scalar_data->ny; */ if (disp->pida->vor_data == NULL) return; if (type == GPIV_VORTICITY && disp->pida->vor_data != NULL) { for (i = 0; i < disp->pida->vor_data->ny; i++) { for (j = 0; j < disp->pida->vor_data->nx; j++) { /* if (i ==0 && j==0) */ hide_filledrect(disp->pida->gci_scalar_vor[i][j]); } } disp->display_scalar = SHOW_SC_NONE; } if (type == GPIV_S_STRAIN && disp->pida->sstrain_data != NULL) { for (i = 0; i < disp->pida->sstrain_data->ny; i++) { for (j = 0; j < disp->pida->sstrain_data->nx; j++) { hide_filledrect(disp->pida->gci_scalar_sstrain[i][j]); } } disp->display_scalar = SHOW_SC_NONE; } if (type == GPIV_N_STRAIN && disp->pida->nstrain_data != NULL) { for (i = 0; i < disp->pida->nstrain_data->ny; i++) { for (j = 0; j < disp->pida->nstrain_data->nx; j++) { hide_filledrect(disp->pida->gci_scalar_nstrain[i][j]); } } disp->display_scalar = SHOW_SC_NONE; } } void destroy_all_scalars(Display *disp, gint type ) /* ---------------------------------------------------------------------------- * Destroys scalar canvas items */ { guint i, j; if (disp->pida->vor_data == NULL) return; if (type == GPIV_VORTICITY && disp->pida->vor_data != NULL) { for (i = 0; i < disp->pida->vor_data->ny; i++) { for (j = 0; j < disp->pida->vor_data->nx; j++) { /* if (i ==0 && j==0) */ destroy_filledrect(disp->pida->gci_scalar_vor[i][j]); } } } else if (type == GPIV_S_STRAIN && disp->pida->sstrain_data != NULL) { for (i = 0; i < disp->pida->sstrain_data->ny; i++) { for (j = 0; j < disp->pida->sstrain_data->nx; j++) { destroy_filledrect(disp->pida->gci_scalar_sstrain[i][j]); } } } else if (type == GPIV_N_STRAIN && disp->pida->nstrain_data != NULL) { for (i = 0; i < disp->pida->nstrain_data->ny; i++) { for (j = 0; j < disp->pida->nstrain_data->nx; j++) { destroy_filledrect(disp->pida->gci_scalar_nstrain[i][j]); } } } else { g_warning(_("destroy_all_scalars: unexisting type")); } } /* * Local functions */ #ifdef CANVAS_AA /* * BUGFIX repair color representation for canvas_aa */ static guint create_scalar_color (gint flag, gfloat sc_min, gfloat sc_max, gfloat sc, gfloat scale_factor ) /* ---------------------------------------------------------------------------- * Create scalar color for in canvas */ { guint color = 0; GdkColor *color_val = NULL; color_val = (GdkColor *)g_malloc(sizeof(GdkColor)); if (flag != -1) { if (sc_min < 0) { if (sc <0) { color_val->red = (gint) (-sc * BYTEVAL * scale_factor); color_val->green = 0; color_val->blue = 0; } else { color_val->red = 0; color_val->green = 0; color_val->blue = (int) (sc * BYTEVAL * scale_factor); } } else { color_val->red = 0; color_val->green = 0; color_val->blue = (int) (sc * BYTEVAL * scale_factor); } } else { color_val->red = 0; color_val->green = BYTEVAL / 2; color_val->blue = 0; } color = GNOME_CANVAS_COLOR(color_val->red, color_val->green, color_val->blue); g_free(color_val); return color; } #else /* CANVAS_AA */ static guint create_scalar_color (gint flag, gfloat sc_min, gfloat sc_max, gfloat sc, gfloat scale_factor ) /* ---------------------------------------------------------------------------- * Create scalar color for in canvas */ { guint color_val = 0; if (flag != -1) { if (sc_min < 0) { if (sc <0) { color_val = (int) (-sc * BYTEVAL * scale_factor); color_val = (color_val << BITSHIFT_RED); } else { color_val = (int) (sc * BYTEVAL * scale_factor); color_val = (color_val << BITSHIFT_BLUE); } } else { color_val = (int) (sc * BYTEVAL * scale_factor); color_val = (color_val << BITSHIFT_BLUE); } } else { color_val = 128 << BITSHIFT_GREEN; } return color_val; } #endif /* CANVAS_AA */ static void destroy_filledrect(GnomeCanvasItem *filled_rect ) /* ---------------------------------------------------------------------------- * Destroys a single filled rectangular canvas item */ { if (filled_rect != NULL) { gtk_object_destroy(GTK_OBJECT(filled_rect)); filled_rect = NULL; } } static void show_filledrect(GnomeCanvasItem *filled_rect ) /* ---------------------------------------------------------------------------- * Shows a single filled rectangular canvas item */ { if (filled_rect != NULL) { gnome_canvas_item_show (GNOME_CANVAS_ITEM(filled_rect)); } } static void hide_filledrect(GnomeCanvasItem *filled_rect ) /* ---------------------------------------------------------------------------- * Hides a single filled rectangular canvas item */ { if (filled_rect != NULL) { gnome_canvas_item_hide (GNOME_CANVAS_ITEM(filled_rect)); } } static void create_vor (Display *disp, gint i, gint j, guint col_val ) /* ---------------------------------------------------------------------------- * Creates vorticity gnome canvas item by coloring the interrogation area */ { float **x, **y; int start_x, start_y, end_x, end_y; GnomeCanvasPoints *points; points = gnome_canvas_points_new(5); /* * Using centre points of interr regs */ x = disp->pida->vor_data->point_x; y = disp->pida->vor_data->point_y; start_x = (int) x[i][j] - disp->pida->piv_par->int_size_f / 2; start_y = (int) y[i][j] - disp->pida->piv_par->int_size_f / 2; end_x = (int) x[i][j] + disp->pida->piv_par->int_size_f / 2; end_y = (int) y[i][j] + disp->pida->piv_par->int_size_f / 2; disp->pida->gci_scalar_vor[i][j] = gnome_canvas_item_new(gnome_canvas_root (GNOME_CANVAS(display_act->canvas)), gnome_canvas_rect_get_type(), "x1", (double) start_x, "y1", (double) start_y, "x2", (double) end_x, "y2", (double) end_y, "fill_color_rgba", col_val, NULL); gnome_canvas_points_free(points); } static void create_sstrain (Display *disp, gint i, gint j, guint col_val ) /* ---------------------------------------------------------------------------- * Creates shear strain gnome canvas item by coloring the interrogation area */ { float **x, **y; int start_x, start_y, end_x, end_y; GnomeCanvasPoints *points; points = gnome_canvas_points_new(5); /* * Using centre points of interr regs */ x = disp->pida->sstrain_data->point_x; y = disp->pida->sstrain_data->point_y; start_x = (int) x[i][j] - disp->pida->piv_par->int_size_f / 2; start_y = (int) y[i][j] - disp->pida->piv_par->int_size_f / 2; end_x = (int) x[i][j] + disp->pida->piv_par->int_size_f / 2; end_y = (int) y[i][j] + disp->pida->piv_par->int_size_f / 2; disp->pida->gci_scalar_sstrain[i][j] = gnome_canvas_item_new(gnome_canvas_root (GNOME_CANVAS(display_act->canvas)), gnome_canvas_rect_get_type(), "x1", (double) start_x, "y1", (double) start_y, "x2", (double) end_x, "y2", (double) end_y, "fill_color_rgba", col_val, NULL); gnome_canvas_points_free(points); } static void create_nstrain (Display *disp, gint i, gint j, guint col_val ) /* ---------------------------------------------------------------------------- * Creates normal strain gnome canvas item by coloring the interrogation area */ { float **x, **y; int start_x, start_y, end_x, end_y; GnomeCanvasPoints *points; points = gnome_canvas_points_new(5); /* * Using centre points of interr regs */ x = disp->pida->nstrain_data->point_x; y = disp->pida->nstrain_data->point_y; start_x = (int) x[i][j] - disp->pida->piv_par->int_size_f / 2; start_y = (int) y[i][j] - disp->pida->piv_par->int_size_f / 2; end_x = (int) x[i][j] + disp->pida->piv_par->int_size_f / 2; end_y = (int) y[i][j] + disp->pida->piv_par->int_size_f / 2; disp->pida->gci_scalar_nstrain[i][j] = gnome_canvas_item_new(gnome_canvas_root (GNOME_CANVAS(display_act->canvas)), gnome_canvas_rect_get_type(), "x1", (double) start_x, "y1", (double) start_y, "x2", (double) end_x, "y2", (double) end_y, "fill_color_rgba", col_val, NULL); gnome_canvas_points_free(points); } gpiv-0.6.1/src/display_scalars.h0000644000175000017500000000335011110307011013503 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ #ifndef DISPLAY_SCALAR_H #define DISPLAY_SCALAR_H /* * Scalar data in a Gnome canvas */ void create_scalar (Display *disp, gint i, gint j, gint type, guint col_val ); void create_all_scalars (Display *disp, gint type ); void show_all_scalars (Display *disp, gint type ); void hide_all_scalars (Display *disp, gint type ); void destroy_all_scalars (Display *disp, gint type ); #endif /* DISPLAY_SCALAR_H */ gpiv-0.6.1/src/preferences_interface.c0000644000175000017500000031637711110305467014677 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * $Id: preferences_interface.c,v 1.2 2008-10-09 14:43:37 gerber Exp $ */ #ifdef HAVE_CONFIG_H # include #endif #include "support.h" #include "gpiv_gui.h" #include "preferences.h" #include "preferences_interface.h" #include "console_menus.h" #include "display.h" GtkDialog * create_preferences (GpivConsole *gpiv ) /*----------------------------------------------------------------------------- */ { Pref *pref = g_new0 (Pref, 1); GdkPixbuf *logo = NULL; logo = gdk_pixbuf_new_from_file(PIXMAPSDIR "gpiv_logo.png", NULL); pref->preferences = GTK_DIALOG( gtk_dialog_new_with_buttons( "gpiv preferences", NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_APPLY, GTK_RESPONSE_APPLY, GTK_STOCK_OK, GTK_RESPONSE_OK, NULL )); gtk_widget_show(GTK_WIDGET (pref->preferences)); gtk_object_set_data (GTK_OBJECT (pref->preferences), "gpiv", gpiv); g_signal_connect( pref->preferences, "response", G_CALLBACK(on_preferences_response), NULL); gtk_window_set_icon(GTK_WINDOW( pref->preferences), logo); if (logo != NULL) g_object_unref (logo); pref->notebook = gtk_notebook_new (); gtk_widget_ref (pref->notebook); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "notebook", pref->notebook, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->notebook); gtk_container_add (GTK_CONTAINER (GTK_DIALOG(pref->preferences)->vbox), pref->notebook); /* * Interface tabulator */ pref->table1 = gtk_table_new (2, 3, FALSE); gtk_widget_ref (pref->table1); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "table1", pref->table1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->table1); gtk_container_add (GTK_CONTAINER (pref->notebook), pref->table1); pref->frame_view = gtk_frame_new (_("View options")); gtk_widget_ref (pref->frame_view); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "frame_view", pref->frame_view, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->frame_view); gtk_table_attach (GTK_TABLE (pref->table1), pref->frame_view, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); pref->vbox1 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (pref->vbox1); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "vbox1", pref->vbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->vbox1); gtk_container_add (GTK_CONTAINER (pref->frame_view), pref->vbox1); pref->checkbutton_gpivbuttons = gtk_check_button_new_with_label (_("gpiv buttons")); gtk_widget_ref (pref->checkbutton_gpivbuttons); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_gpivbuttons", pref->checkbutton_gpivbuttons, (GtkDestroyNotify) gtk_widget_unref); if (default_par->console__view_gpivbuttons == 1) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_gpivbuttons), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_gpivbuttons), FALSE); } gtk_widget_show (pref->checkbutton_gpivbuttons); gtk_box_pack_start (GTK_BOX (pref->vbox1), pref->checkbutton_gpivbuttons, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_gpivbuttons), "clicked", G_CALLBACK (on_checkbutton_gpivbuttons_activate), NULL); pref->checkbutton_tab = gtk_check_button_new_with_label (_("tabulator")); gtk_widget_ref (pref->checkbutton_tab); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_tab", pref->checkbutton_tab, (GtkDestroyNotify) gtk_widget_unref); if (default_par->console__view_tabulator == 1) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_tab), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_tab), FALSE); } gtk_widget_show (pref->checkbutton_tab); gtk_box_pack_start (GTK_BOX (pref->vbox1), pref->checkbutton_tab, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_tab), "clicked", G_CALLBACK (on_checkbutton_tab_activate), NULL); /* */ pref->frame_io = gtk_frame_new (_("In/output")); gtk_widget_ref (pref->frame_io); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "frame_io", pref->frame_io, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->frame_io); gtk_table_attach (GTK_TABLE (pref->table1), pref->frame_io, 2, 3, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); pref->vbox_io = gtk_vbox_new (FALSE, 0); gtk_widget_ref (pref->vbox_io); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "vbox_io", pref->vbox_io, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->vbox_io); gtk_container_add (GTK_CONTAINER (pref->frame_io), pref->vbox_io); /* * Image format */ pref->radiobutton_imgfmt_0 = gtk_radio_button_new_with_label (pref->imgformat_sel_group, _("PNG image format (.png)")); pref->imgformat_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (pref->radiobutton_imgfmt_0)); gtk_widget_ref (pref->radiobutton_imgfmt_0); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "radiobutton_imgfmt_0", pref->radiobutton_imgfmt_0, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->radiobutton_imgfmt_0); gtk_box_pack_start (GTK_BOX (pref->vbox_io), pref->radiobutton_imgfmt_0, FALSE, FALSE, 0); if (default_par->img_fmt == IMG_FMT_PNG) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_imgfmt_0), TRUE); } /* g_snprintf(data, sizeof(IMG_FMT_PNG), "%s", IMG_FMT_PNG); */ gtk_object_set_data (GTK_OBJECT (pref->radiobutton_imgfmt_0), "image_format", (int *) IMG_FMT_PNG); g_signal_connect (GTK_OBJECT (pref->radiobutton_imgfmt_0), "toggled", G_CALLBACK (on_radiobutton_imgfmt), NULL); pref->radiobutton_imgfmt_1 = gtk_radio_button_new_with_label (pref->imgformat_sel_group, _("HDF5 image format (.h5)")); pref->imgformat_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (pref->radiobutton_imgfmt_1)); gtk_widget_ref (pref->radiobutton_imgfmt_1); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "radiobutton_imgfmt_1", pref->radiobutton_imgfmt_1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->radiobutton_imgfmt_1); gtk_box_pack_start (GTK_BOX (pref->vbox_io), pref->radiobutton_imgfmt_1, FALSE, FALSE, 0); if (default_par->img_fmt == IMG_FMT_HDF) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_imgfmt_1), TRUE); } /* g_snprintf(data, sizeof(IMG_FMT_PNG), "%s", IMG_FMT_PNG); */ gtk_object_set_data (GTK_OBJECT (pref->radiobutton_imgfmt_1), "image_format", (int *) IMG_FMT_HDF); g_signal_connect (GTK_OBJECT (pref->radiobutton_imgfmt_1), "toggled", G_CALLBACK (on_radiobutton_imgfmt), NULL); pref->radiobutton_imgfmt_2 = gtk_radio_button_new_with_label (pref->imgformat_sel_group, _("RAW image format (.h .r)")); pref->imgformat_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (pref->radiobutton_imgfmt_2)); gtk_widget_ref (pref->radiobutton_imgfmt_2); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "radiobutton_imgfmt_2", pref->radiobutton_imgfmt_2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->radiobutton_imgfmt_2); gtk_box_pack_start (GTK_BOX (pref->vbox_io), pref->radiobutton_imgfmt_2, FALSE, FALSE, 0); if (default_par->img_fmt == IMG_FMT_RAW) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_imgfmt_2), TRUE); } /* g_snprintf(data, sizeof(IMG_FMT_PNG), "%s", IMG_FMT_PNG); */ gtk_object_set_data (GTK_OBJECT (pref->radiobutton_imgfmt_2), "image_format", (int *) IMG_FMT_RAW); g_signal_connect (GTK_OBJECT (pref->radiobutton_imgfmt_2), "toggled", G_CALLBACK (on_radiobutton_imgfmt), NULL); /* * Image parameters */ pref->checkbutton_xcorr = gtk_check_button_new_with_label (_("cross-correlation")); gtk_widget_ref (pref->checkbutton_xcorr); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_xcorr", pref->checkbutton_xcorr, (GtkDestroyNotify) gtk_widget_unref); if (default_par->x_corr == 1) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_xcorr), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_xcorr), FALSE); } gtk_widget_show (pref->checkbutton_xcorr); gtk_box_pack_start (GTK_BOX (pref->vbox_io), pref->checkbutton_xcorr, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_xcorr), "clicked", G_CALLBACK (on_checkbutton_xcorr_activate), NULL); /* * PIV and PIV-derived Data format */ pref->radiobutton_datafmt_0 = gtk_radio_button_new_with_label (pref->dataformat_sel_group, _("ASCII data format (.piv)")); pref->dataformat_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (pref->radiobutton_datafmt_0)); gtk_widget_ref (pref->radiobutton_datafmt_0); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "radiobutton_datafmt_0", pref->radiobutton_datafmt_0, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->radiobutton_datafmt_0); gtk_box_pack_start (GTK_BOX (pref->vbox_io), pref->radiobutton_datafmt_0, FALSE, FALSE, 0); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_datafmt_0), default_par->hdf); gtk_object_set_data (GTK_OBJECT (pref->radiobutton_datafmt_0), "data_format", "0" /* (int *) FALSE */); g_signal_connect (GTK_OBJECT (pref->radiobutton_datafmt_0), "toggled", G_CALLBACK (on_radiobutton_datafmt), NULL); pref->radiobutton_datafmt_1 = gtk_radio_button_new_with_label (pref->dataformat_sel_group, _("HDF data format (.h5)")); pref->dataformat_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (pref->radiobutton_datafmt_1)); gtk_widget_ref (pref->radiobutton_datafmt_1); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "radiobutton_datafmt_1", pref->radiobutton_datafmt_1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->radiobutton_datafmt_1); gtk_box_pack_start (GTK_BOX (pref->vbox_io), pref->radiobutton_datafmt_1, FALSE, FALSE, 0); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_datafmt_1), default_par->hdf); gtk_object_set_data (GTK_OBJECT (pref->radiobutton_datafmt_1), "data_format", "1" /* TRUE */); g_signal_connect (GTK_OBJECT (pref->radiobutton_datafmt_1), "toggled", G_CALLBACK (on_radiobutton_datafmt), NULL); /* * General; tooltips, histogram bins, cluster nodes */ pref->checkbutton_tooltips = gtk_check_button_new_with_label (_("tooltips")); gtk_widget_ref (pref->checkbutton_tooltips); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_tooltips", pref->checkbutton_tooltips, (GtkDestroyNotify) gtk_widget_unref); if (default_par->console__show_tooltips == 1) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_tooltips), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_tooltips), FALSE); } gtk_widget_show (pref->checkbutton_tooltips); gtk_table_attach (GTK_TABLE (pref->table1), pref->checkbutton_tooltips, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_tooltips), "clicked", G_CALLBACK (on_checkbutton_tooltips_activate), NULL); pref->frame_processes = gtk_frame_new (_("processes")); gtk_widget_ref (pref->frame_processes); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "frame_processes", pref->frame_processes, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->frame_processes); gtk_table_attach (GTK_TABLE (pref->table1), pref->frame_processes, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); pref->vbox2 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (pref->vbox2); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "vbox2", pref->vbox2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->vbox2); gtk_container_add (GTK_CONTAINER (pref->frame_processes), pref->vbox2); #ifdef ENABLE_CAM pref->checkbutton_process_cam = gtk_check_button_new_with_label (_("camera")); gtk_widget_ref (pref->checkbutton_process_cam); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_process_cam", pref->checkbutton_process_cam, (GtkDestroyNotify) gtk_widget_unref); if (default_par->process__cam) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (pref->checkbutton_process_cam), TRUE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (pref->checkbutton_process_cam), FALSE); } gtk_widget_show (pref->checkbutton_process_cam); gtk_box_pack_start (GTK_BOX (pref->vbox2), pref->checkbutton_process_cam, FALSE, FALSE, 0); gtk_signal_connect (GTK_OBJECT (pref->checkbutton_process_cam), "clicked", GTK_SIGNAL_FUNC (on_checkbutton_process_cam_activate), NULL); #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG pref->checkbutton_process_trig = gtk_check_button_new_with_label (_("trigger")); gtk_widget_ref (pref->checkbutton_process_trig); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_process_trig", pref->checkbutton_process_trig, (GtkDestroyNotify) gtk_widget_unref); if (default_par->process__trig) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (pref->checkbutton_process_trig), TRUE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (pref->checkbutton_process_trig), FALSE); } gtk_widget_show (pref->checkbutton_process_trig); gtk_box_pack_start (GTK_BOX (pref->vbox2), pref->checkbutton_process_trig, FALSE, FALSE, 0); gtk_signal_connect (GTK_OBJECT (pref->checkbutton_process_trig), "clicked", GTK_SIGNAL_FUNC (on_checkbutton_process_trig_activate), NULL); #endif /* ENABLE_TRIG */ #ifdef ENABLE_IMGPROC pref->checkbutton_process_imgproc = gtk_check_button_new_with_label (_("image processing")); gtk_widget_ref (pref->checkbutton_process_imgproc); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_process_imgproc", pref->checkbutton_process_imgproc, (GtkDestroyNotify) gtk_widget_unref); if (default_par->process__imgproc) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (pref->checkbutton_process_imgproc), TRUE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (pref->checkbutton_process_imgproc), FALSE); } gtk_widget_show (pref->checkbutton_process_imgproc); gtk_box_pack_start (GTK_BOX (pref->vbox2), pref->checkbutton_process_imgproc, FALSE, FALSE, 0); gtk_signal_connect (GTK_OBJECT (pref->checkbutton_process_imgproc), "clicked", GTK_SIGNAL_FUNC (on_checkbutton_process_imgproc_activate), NULL); #endif /* ENABLE_IMGPROC */ pref->checkbutton_process_piv = gtk_check_button_new_with_label (_("piv")); gtk_widget_ref (pref->checkbutton_process_piv); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_process_piv", pref->checkbutton_process_piv, (GtkDestroyNotify) gtk_widget_unref); if (default_par->process__piv) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (pref->checkbutton_process_piv), TRUE); } else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (pref->checkbutton_process_piv), FALSE); } gtk_widget_show (pref->checkbutton_process_piv); gtk_box_pack_start (GTK_BOX (pref->vbox2), pref->checkbutton_process_piv, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_process_piv), "clicked", G_CALLBACK (on_checkbutton_process_piv_activate), NULL); pref->checkbutton_process_gradient = gtk_check_button_new_with_label (_("gradient")); gtk_widget_ref (pref->checkbutton_process_gradient); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_process_gradient", pref->checkbutton_process_gradient, (GtkDestroyNotify) gtk_widget_unref); if (default_par->process__gradient) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_gradient), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_gradient), FALSE); } gtk_widget_show (pref->checkbutton_process_gradient); gtk_box_pack_start (GTK_BOX (pref->vbox2), pref->checkbutton_process_gradient, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_process_gradient), "clicked", G_CALLBACK (on_checkbutton_process_gradient_activate), NULL); pref->checkbutton_process_resstats = gtk_check_button_new_with_label (_("residu stats")); gtk_widget_ref (pref->checkbutton_process_resstats); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_process_resstats", pref->checkbutton_process_resstats, (GtkDestroyNotify) gtk_widget_unref); if (default_par->process__resstats) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_resstats), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_resstats), FALSE); } gtk_widget_show (pref->checkbutton_process_resstats); gtk_box_pack_start (GTK_BOX (pref->vbox2), pref->checkbutton_process_resstats, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_process_resstats), "clicked", G_CALLBACK (on_checkbutton_process_resstats_activate), NULL); pref->checkbutton_process_errvec = gtk_check_button_new_with_label (_("validate")); gtk_widget_ref (pref->checkbutton_process_errvec); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_process_errvec", pref->checkbutton_process_errvec, (GtkDestroyNotify) gtk_widget_unref); if (default_par->process__errvec) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_errvec), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_errvec), FALSE); } gtk_widget_show (pref->checkbutton_process_errvec); gtk_box_pack_start (GTK_BOX (pref->vbox2), pref->checkbutton_process_errvec, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_process_errvec), "clicked", G_CALLBACK (on_checkbutton_process_errvec_activate), NULL); pref->checkbutton_process_peaklck = gtk_check_button_new_with_label (_("peaklock")); gtk_widget_ref (pref->checkbutton_process_peaklck); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_process_peaklck", pref->checkbutton_process_peaklck, (GtkDestroyNotify) gtk_widget_unref); if (default_par->process__peaklock) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_peaklck), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_peaklck), FALSE); } gtk_widget_show (pref->checkbutton_process_peaklck); gtk_box_pack_start (GTK_BOX (pref->vbox2), pref->checkbutton_process_peaklck, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_process_peaklck), "clicked", G_CALLBACK (on_checkbutton_process_peaklck_activate), NULL); pref->checkbutton_process_scale = gtk_check_button_new_with_label (_("scaling")); gtk_widget_ref (pref->checkbutton_process_scale); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_process_scale", pref->checkbutton_process_scale, (GtkDestroyNotify) gtk_widget_unref); if (default_par->process__scale) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_scale), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_scale), FALSE); } gtk_widget_show (pref->checkbutton_process_scale); gtk_box_pack_start (GTK_BOX (pref->vbox2), pref->checkbutton_process_scale, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_process_scale), "clicked", G_CALLBACK (on_checkbutton_process_scale_activate), NULL); pref->checkbutton_process_avg = gtk_check_button_new_with_label (_("average")); gtk_widget_ref (pref->checkbutton_process_avg); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_process_avg", pref->checkbutton_process_avg, (GtkDestroyNotify) gtk_widget_unref); if (default_par->process__average) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_avg), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_avg), FALSE); } gtk_widget_show (pref->checkbutton_process_avg); gtk_box_pack_start (GTK_BOX (pref->vbox2), pref->checkbutton_process_avg, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_process_avg), "clicked", G_CALLBACK (on_checkbutton_process_avg_activate), NULL); pref->checkbutton_process_subtract = gtk_check_button_new_with_label (_("subtract")); gtk_widget_ref (pref->checkbutton_process_subtract); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_process_subtract", pref->checkbutton_process_subtract, (GtkDestroyNotify) gtk_widget_unref); if (default_par->process__subtract) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_subtract), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_subtract), FALSE); } gtk_widget_show (pref->checkbutton_process_subtract); gtk_box_pack_start (GTK_BOX (pref->vbox2), pref->checkbutton_process_subtract, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_process_subtract), "clicked", G_CALLBACK (on_checkbutton_process_subtract_activate), NULL); pref->checkbutton_process_vorstra = gtk_check_button_new_with_label (_("vorticity")); gtk_widget_ref (pref->checkbutton_process_vorstra); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_process_vorstra", pref->checkbutton_process_vorstra, (GtkDestroyNotify) gtk_widget_unref); if (default_par->process__vorstra) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_vorstra), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_process_vorstra), FALSE); } gtk_widget_show (pref->checkbutton_process_vorstra); gtk_box_pack_start (GTK_BOX (pref->vbox2), pref->checkbutton_process_vorstra, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_process_vorstra), "clicked", G_CALLBACK (on_checkbutton_process_vorstra_activate), NULL); pref->hbox1 = gtk_hbox_new (FALSE, 0); gtk_widget_ref (pref->hbox1); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "hbox1", pref->hbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->hbox1); gtk_table_attach (GTK_TABLE (pref->table1), pref->hbox1, 1, 3, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); pref->label_spinner_bins = gtk_label_new (_("number of histogram bins: ")); gtk_widget_ref (pref->label_spinner_bins); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "label_spinner_bins", pref->label_spinner_bins, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->label_spinner_bins); gtk_box_pack_start (GTK_BOX (pref->hbox1), pref->label_spinner_bins, FALSE, FALSE, 0); pref->spinbutton_bins_adj = gtk_adjustment_new (10, 0, 100, 1, 10, 10); pref->spinbutton_bins = gtk_spin_button_new (GTK_ADJUSTMENT (pref->spinbutton_bins_adj), 1, 0); gtk_widget_ref (pref->spinbutton_bins); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "spinbutton_bins", pref->spinbutton_bins, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->spinbutton_bins); gtk_box_pack_start (GTK_BOX (pref->hbox1), pref->spinbutton_bins, TRUE, TRUE, 0); g_signal_connect (GTK_OBJECT (pref->spinbutton_bins), "changed", G_CALLBACK (on_spinbutton_bins_activate), NULL); #ifdef ENABLE_MPI pref->hbox2 = gtk_hbox_new (FALSE, 0); gtk_widget_ref (pref->hbox2); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "hbox2", pref->hbox2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->hbox2); gtk_table_attach (GTK_TABLE (pref->table1), pref->hbox2, 1, 3, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); pref->label_spinner_nodes = gtk_label_new (_("number of cluster nodes: ")); gtk_widget_ref (pref->label_spinner_nodes); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "label_spinner_nodes", pref->label_spinner_nodes, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->label_spinner_nodes); gtk_box_pack_start (GTK_BOX (pref->hbox2), pref->label_spinner_nodes, FALSE, FALSE, 0); pref->spinbutton_nodes_adj = gtk_adjustment_new (4, 0, 100, 1, 10, 10); pref->spinbutton_nodes = gtk_spin_button_new (GTK_ADJUSTMENT (pref->spinbutton_nodes_adj), 1, 0); gtk_widget_ref (pref->spinbutton_nodes); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "spinbutton_nodes", pref->spinbutton_nodes, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->spinbutton_nodes); gtk_box_pack_start (GTK_BOX (pref->hbox2), pref->spinbutton_nodes, TRUE, TRUE, 0); g_signal_connect (GTK_OBJECT (pref->spinbutton_nodes), "changed", G_CALLBACK (on_spinbutton_nodes), NULL); #endif /* ENABLE_MPI pref->tab1 = gtk_label_new (_("console")); gtk_widget_ref (pref->tab1); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "pref_tab1", pref->tab1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->tab1); gtk_notebook_set_tab_label (GTK_NOTEBOOK (pref->notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (pref->notebook), 0), pref->tab1); /* * Display tabulator */ pref->table2 = gtk_table_new (3, 3, FALSE); gtk_widget_ref (pref->table2); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "table2", pref->table2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->table2); gtk_container_add (GTK_CONTAINER (pref->notebook), pref->table2); /* * Vector scale */ pref->frame_display_vecscale = gtk_frame_new (_("vector scale")); gtk_widget_ref (pref->frame_display_vecscale); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "frame_display_vecscale", pref->frame_display_vecscale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->frame_display_vecscale); gtk_table_attach (GTK_TABLE (pref->table2), pref->frame_display_vecscale, 0, 1, 0, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); pref->vbox_display_vecscale = gtk_vbox_new(FALSE, 0); gtk_widget_ref(pref->vbox_display_vecscale); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "vbox_display_vecscale", pref->vbox_display_vecscale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pref->vbox_display_vecscale); gtk_container_add(GTK_CONTAINER(pref->frame_display_vecscale), pref->vbox_display_vecscale); pref->radiobutton_display_vecscale1 = gtk_radio_button_new_with_label(pref->vecscale_group, _("1")); pref->vecscale_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_vecscale1)); gtk_widget_ref(pref->radiobutton_display_vecscale1); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_vecscale1", pref->radiobutton_display_vecscale1, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__vector_scale == 1) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_vecscale1), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_vecscale1), FALSE); } gtk_widget_show(pref->radiobutton_display_vecscale1); gtk_box_pack_start(GTK_BOX(pref->vbox_display_vecscale), pref->radiobutton_display_vecscale1, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_vecscale1), "vscale", "1"); pref->radiobutton_display_vecscale2 = gtk_radio_button_new_with_label(pref->vecscale_group, _("2")); pref->vecscale_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_vecscale2)); gtk_widget_ref(pref->radiobutton_display_vecscale2); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_vecscale2", pref->radiobutton_display_vecscale2, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__vector_scale == 2) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_vecscale2), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_vecscale2), FALSE); } gtk_widget_show(pref->radiobutton_display_vecscale2); gtk_box_pack_start(GTK_BOX(pref->vbox_display_vecscale), pref->radiobutton_display_vecscale2, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_vecscale2), "vscale", "2"); pref->radiobutton_display_vecscale3 = gtk_radio_button_new_with_label(pref->vecscale_group, _("4")); pref->vecscale_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_vecscale3)); gtk_widget_ref(pref->radiobutton_display_vecscale3); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_vecscale3", pref->radiobutton_display_vecscale3, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__vector_scale == 4) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_vecscale3), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_vecscale3), FALSE); } gtk_widget_show(pref->radiobutton_display_vecscale3); gtk_box_pack_start(GTK_BOX(pref->vbox_display_vecscale), pref->radiobutton_display_vecscale3, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_vecscale3), "vscale", "4"); pref->radiobutton_display_vecscale4 = gtk_radio_button_new_with_label(pref->vecscale_group, _("8")); pref->vecscale_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_vecscale4)); gtk_widget_ref(pref->radiobutton_display_vecscale4); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_vecscale4", pref->radiobutton_display_vecscale4, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__vector_scale == 8) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_vecscale4), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_vecscale4), FALSE); } gtk_widget_show(pref->radiobutton_display_vecscale4); gtk_box_pack_start(GTK_BOX(pref->vbox_display_vecscale), pref->radiobutton_display_vecscale4, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_vecscale4), "vscale", "8"); pref->radiobutton_display_vecscale5 = gtk_radio_button_new_with_label(pref->vecscale_group, _("16")); pref->vecscale_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_vecscale5)); gtk_widget_ref(pref->radiobutton_display_vecscale5); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_vecscale5", pref->radiobutton_display_vecscale5, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__vector_scale == 16) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_vecscale5), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_vecscale5), FALSE); } gtk_widget_show(pref->radiobutton_display_vecscale5); gtk_box_pack_start(GTK_BOX(pref->vbox_display_vecscale), pref->radiobutton_display_vecscale5, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_vecscale5), "vscale", "16"); pref->radiobutton_display_vecscale6 = gtk_radio_button_new_with_label(pref->vecscale_group, _("32")); pref->vecscale_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_vecscale6)); gtk_widget_ref(pref->radiobutton_display_vecscale6); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_vecscale6", pref->radiobutton_display_vecscale6, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__vector_scale == 32) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_vecscale6), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_vecscale6), FALSE); } gtk_widget_show(pref->radiobutton_display_vecscale6); gtk_box_pack_start(GTK_BOX(pref->vbox_display_vecscale), pref->radiobutton_display_vecscale6, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_vecscale6), "vscale", "32"); pref->radiobutton_display_vecscale7 = gtk_radio_button_new_with_label(pref->vecscale_group, _("64")); pref->vecscale_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_vecscale7)); gtk_widget_ref(pref->radiobutton_display_vecscale7); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_vecscale7", pref->radiobutton_display_vecscale7, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__vector_scale == 64) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_vecscale7), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_vecscale7), FALSE); } gtk_widget_show(pref->radiobutton_display_vecscale7); gtk_box_pack_start(GTK_BOX(pref->vbox_display_vecscale), pref->radiobutton_display_vecscale7, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_vecscale7), "vscale", "64"); /* * Vector color */ pref->frame_display_veccolor = gtk_frame_new (_("vector color")); gtk_widget_ref (pref->frame_display_veccolor); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "frame_display_veccolor", pref->frame_display_veccolor, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->frame_display_veccolor); gtk_table_attach (GTK_TABLE (pref->table2), pref->frame_display_veccolor, 0, 1, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); pref->vbox_display_veccolor = gtk_vbox_new(FALSE, 0); gtk_widget_ref(pref->vbox_display_veccolor); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "vbox_display_veccolor", pref->vbox_display_veccolor, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pref->vbox_display_veccolor); gtk_container_add(GTK_CONTAINER(pref->frame_display_veccolor), pref->vbox_display_veccolor); pref->radiobutton_display_veccolor1 = gtk_radio_button_new_with_label(pref->veccolor_group, _("Peak nr")); pref->veccolor_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_veccolor1)); gtk_widget_ref(pref->radiobutton_display_veccolor1); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_veccolor1", pref->radiobutton_display_veccolor1, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__vector_color == SHOW_PEAKNR) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_veccolor1), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_veccolor1), FALSE); } gtk_widget_show(pref->radiobutton_display_veccolor1); gtk_box_pack_start(GTK_BOX(pref->vbox_display_veccolor), pref->radiobutton_display_veccolor1, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_veccolor1), "vcolor", (int *) SHOW_PEAKNR); pref->radiobutton_display_veccolor2 = gtk_radio_button_new_with_label(pref->veccolor_group, _("SNR")); pref->veccolor_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_veccolor2)); gtk_widget_ref(pref->radiobutton_display_veccolor2); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_veccolor2", pref->radiobutton_display_veccolor2, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__vector_color == SHOW_SNR) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_veccolor2), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_veccolor2), FALSE); } gtk_widget_show(pref->radiobutton_display_veccolor2); gtk_box_pack_start(GTK_BOX(pref->vbox_display_veccolor), pref->radiobutton_display_veccolor2, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_veccolor2), "vcolor", (int *) SHOW_SNR); pref->radiobutton_display_veccolor3 = gtk_radio_button_new_with_label(pref->veccolor_group, _("Magnitude gray")); pref->veccolor_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_veccolor3)); gtk_widget_ref(pref->radiobutton_display_veccolor3); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_veccolor3", pref->radiobutton_display_veccolor3, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__vector_color == SHOW_MAGNITUDE_GRAY) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_veccolor3), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_veccolor3), FALSE); } gtk_widget_show(pref->radiobutton_display_veccolor3); gtk_box_pack_start(GTK_BOX(pref->vbox_display_veccolor), pref->radiobutton_display_veccolor3, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_veccolor3), "vcolor", (int *) SHOW_MAGNITUDE_GRAY); pref->radiobutton_display_veccolor4 = gtk_radio_button_new_with_label(pref->veccolor_group, _("Magnitude color")); pref->veccolor_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_veccolor4)); gtk_widget_ref(pref->radiobutton_display_veccolor4); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_veccolor4", pref->radiobutton_display_veccolor4, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__vector_color == SHOW_MAGNITUDE) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_veccolor4), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_veccolor4), FALSE); } gtk_widget_show(pref->radiobutton_display_veccolor4); gtk_box_pack_start(GTK_BOX(pref->vbox_display_veccolor), pref->radiobutton_display_veccolor4, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_veccolor4), "vcolor", (int *) SHOW_MAGNITUDE); /* * Zoom scale */ pref->frame_display_zoomscale = gtk_frame_new (_("zoom scale")); gtk_widget_ref (pref->frame_display_zoomscale); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "frame_display_zoomscale", pref->frame_display_zoomscale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->frame_display_zoomscale); gtk_table_attach (GTK_TABLE (pref->table2), pref->frame_display_zoomscale, 1, 2, 0, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); pref->vbox_display_zoomscale = gtk_vbox_new(FALSE, 0); gtk_widget_ref(pref->vbox_display_zoomscale); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "vbox_display_zoomscale", pref->vbox_display_zoomscale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pref->vbox_display_zoomscale); gtk_container_add(GTK_CONTAINER(pref->frame_display_zoomscale), pref->vbox_display_zoomscale); pref->radiobutton_display_zoomscale0 = gtk_radio_button_new_with_label(pref->zoomscale_group, _("0.25")); pref->zoomscale_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_zoomscale0)); gtk_widget_ref(pref->radiobutton_display_zoomscale0); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_zoomscale0", pref->radiobutton_display_zoomscale0, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__zoom_index == ZOOM_0) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_zoomscale0), TRUE); } gtk_widget_show(pref->radiobutton_display_zoomscale0); gtk_box_pack_start(GTK_BOX(pref->vbox_display_zoomscale), pref->radiobutton_display_zoomscale0, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_zoomscale0), "zscale", (int *) ZOOM_0); pref->radiobutton_display_zoomscale1 = gtk_radio_button_new_with_label(pref->zoomscale_group, _("0.5")); pref->zoomscale_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_zoomscale1)); gtk_widget_ref(pref->radiobutton_display_zoomscale1); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_zoomscale1", pref->radiobutton_display_zoomscale1, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__zoom_index == ZOOM_1) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_zoomscale1), TRUE); } gtk_widget_show(pref->radiobutton_display_zoomscale1); gtk_box_pack_start(GTK_BOX(pref->vbox_display_zoomscale), pref->radiobutton_display_zoomscale1, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_zoomscale1), "zscale", (int *) ZOOM_1); pref->radiobutton_display_zoomscale2 = gtk_radio_button_new_with_label(pref->zoomscale_group, _("0.83")); pref->zoomscale_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_zoomscale2)); gtk_widget_ref(pref->radiobutton_display_zoomscale2); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_zoomscale2", pref->radiobutton_display_zoomscale2, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__zoom_index == ZOOM_2) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_zoomscale2), TRUE); } gtk_widget_show(pref->radiobutton_display_zoomscale2); gtk_box_pack_start(GTK_BOX(pref->vbox_display_zoomscale), pref->radiobutton_display_zoomscale2, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_zoomscale2), "zscale", (int *) ZOOM_2); pref->radiobutton_display_zoomscale3 = gtk_radio_button_new_with_label(pref->zoomscale_group, _("1.0")); pref->zoomscale_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_zoomscale3)); gtk_widget_ref(pref->radiobutton_display_zoomscale3); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_zoomscale3", pref->radiobutton_display_zoomscale3, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__zoom_index == ZOOM_3) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_zoomscale3), TRUE); } gtk_widget_show(pref->radiobutton_display_zoomscale3); gtk_box_pack_start(GTK_BOX(pref->vbox_display_zoomscale), pref->radiobutton_display_zoomscale3, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_zoomscale3), "zscale", (int *) ZOOM_3); pref->radiobutton_display_zoomscale4 = gtk_radio_button_new_with_label(pref->zoomscale_group, _("1.3")); pref->zoomscale_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_zoomscale4)); gtk_widget_ref(pref->radiobutton_display_zoomscale4); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_zoomscale4", pref->radiobutton_display_zoomscale4, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__zoom_index == ZOOM_4) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_zoomscale4), TRUE); } gtk_widget_show(pref->radiobutton_display_zoomscale4); gtk_box_pack_start(GTK_BOX(pref->vbox_display_zoomscale), pref->radiobutton_display_zoomscale4, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_zoomscale4), "zscale", (int *) ZOOM_4); pref->radiobutton_display_zoomscale5 = gtk_radio_button_new_with_label(pref->zoomscale_group, _("1.6")); pref->zoomscale_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_zoomscale5)); gtk_widget_ref(pref->radiobutton_display_zoomscale5); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_zoomscale5", pref->radiobutton_display_zoomscale5, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__zoom_index == ZOOM_5) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_zoomscale5), TRUE); } gtk_widget_show(pref->radiobutton_display_zoomscale5); gtk_box_pack_start(GTK_BOX(pref->vbox_display_zoomscale), pref->radiobutton_display_zoomscale5, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_zoomscale5), "zscale", (int *) ZOOM_5); pref->radiobutton_display_zoomscale6 = gtk_radio_button_new_with_label(pref->zoomscale_group, _("2.0")); pref->zoomscale_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_zoomscale6)); gtk_widget_ref(pref->radiobutton_display_zoomscale6); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_zoomscale6", pref->radiobutton_display_zoomscale6, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__zoom_index == ZOOM_6) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_zoomscale6), TRUE); } gtk_widget_show(pref->radiobutton_display_zoomscale6); gtk_box_pack_start(GTK_BOX(pref->vbox_display_zoomscale), pref->radiobutton_display_zoomscale6, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_zoomscale6), "zscale", (int *) ZOOM_6); pref->radiobutton_display_zoomscale7 = gtk_radio_button_new_with_label(pref->zoomscale_group, _("4.0")); pref->zoomscale_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_zoomscale7)); gtk_widget_ref(pref->radiobutton_display_zoomscale7); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_zoomscale7", pref->radiobutton_display_zoomscale7, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__zoom_index == ZOOM_7) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_zoomscale7), TRUE); } gtk_widget_show(pref->radiobutton_display_zoomscale7); gtk_box_pack_start(GTK_BOX(pref->vbox_display_zoomscale), pref->radiobutton_display_zoomscale7, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_zoomscale7), "zscale", (int *) ZOOM_7); /* * Background */ pref->frame_display_backgroundcolor = gtk_frame_new (_("background")); gtk_widget_ref (pref->frame_display_backgroundcolor); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "frame_display_backgroundcolor", pref->frame_display_backgroundcolor, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->frame_display_backgroundcolor); gtk_table_attach (GTK_TABLE (pref->table2), pref->frame_display_backgroundcolor, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); pref->vbox_display_backgroundcolor = gtk_vbox_new(FALSE, 0); gtk_widget_ref(pref->vbox_display_backgroundcolor); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "vbox_display_backgroundcolor", pref->vbox_display_backgroundcolor, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pref->vbox_display_backgroundcolor); gtk_container_add(GTK_CONTAINER(pref->frame_display_backgroundcolor), pref->vbox_display_backgroundcolor); pref->radiobutton_display_backgroundcolor1 = gtk_radio_button_new_with_label(pref->backgroundcolor_group, _("Blue")); pref->backgroundcolor_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_backgroundcolor1)); gtk_widget_ref(pref->radiobutton_display_backgroundcolor1); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_backgroundcolor1", pref->radiobutton_display_backgroundcolor1, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__backgrnd == SHOW_BG_DARKBLUE) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_backgroundcolor1), TRUE); } gtk_widget_show(pref->radiobutton_display_backgroundcolor1); gtk_box_pack_start(GTK_BOX(pref->vbox_display_backgroundcolor), pref->radiobutton_display_backgroundcolor1, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_backgroundcolor1), "bgcolor", (int *) SHOW_BG_DARKBLUE); pref->radiobutton_display_backgroundcolor2 = gtk_radio_button_new_with_label(pref->backgroundcolor_group, _("Black")); pref->backgroundcolor_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_backgroundcolor2)); gtk_widget_ref(pref->radiobutton_display_backgroundcolor2); gtk_object_set_data_full(GTK_OBJECT(gpiv->console), "radiobutton_display_backgroundcolor2", pref->radiobutton_display_backgroundcolor2, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__backgrnd == SHOW_BG_BLACK) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_backgroundcolor2), TRUE); } gtk_widget_show(pref->radiobutton_display_backgroundcolor2); gtk_box_pack_start(GTK_BOX(pref->vbox_display_backgroundcolor), pref->radiobutton_display_backgroundcolor2, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_backgroundcolor2), "bgcolor", (int *) SHOW_BG_BLACK); pref->radiobutton_display_background_img1 = gtk_radio_button_new_with_label(pref->backgroundcolor_group, _("image A")); pref->backgroundcolor_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_background_img1)); gtk_widget_ref (pref->radiobutton_display_background_img1); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "radiobutton_display_background_img1", pref->radiobutton_display_background_img1, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__backgrnd == SHOW_BG_IMG1) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_background_img1), TRUE); } gtk_widget_show (pref->radiobutton_display_background_img1); gtk_box_pack_start (GTK_BOX (pref->vbox_display_backgroundcolor), pref->radiobutton_display_background_img1, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_background_img1), "bgcolor", (int *) SHOW_BG_IMG1); pref->radiobutton_display_background_img2 = gtk_radio_button_new_with_label(pref->backgroundcolor_group, _("image B")); pref->backgroundcolor_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_background_img2)); gtk_widget_ref (pref->radiobutton_display_background_img2); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "radiobutton_display_background_img2", pref->radiobutton_display_background_img2, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__backgrnd == SHOW_BG_IMG2) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_background_img2), TRUE); } gtk_widget_show (pref->radiobutton_display_background_img2); gtk_box_pack_start (GTK_BOX (pref->vbox_display_backgroundcolor), pref->radiobutton_display_background_img2, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_background_img2), "bgcolor", (int *) SHOW_BG_IMG2); /* * Hide and display PIV data */ pref->frame_display_display = gtk_frame_new (_("hide/display PIV data")); gtk_widget_ref (pref->frame_display_display); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "frame_display_display", pref->frame_display_display, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->frame_display_display); gtk_table_attach (GTK_TABLE (pref->table2), pref->frame_display_display, 2, 3, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); pref->vbox_display_display = gtk_vbox_new (FALSE, 0); gtk_widget_ref (pref->vbox_display_display); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "vbox_display_display", pref->vbox_display_display, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->vbox_display_display); gtk_container_add (GTK_CONTAINER (pref->frame_display_display), pref->vbox_display_display); pref->checkbutton_display_display_intregs = gtk_check_button_new_with_label (_("Interrogation area's")); gtk_widget_ref (pref->checkbutton_display_display_intregs); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_display_display_intregs", pref->checkbutton_display_display_intregs, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__intregs == 1) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_display_display_intregs), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_display_display_intregs), FALSE); } gtk_widget_show (pref->checkbutton_display_display_intregs); gtk_box_pack_start (GTK_BOX (pref->vbox_display_display), pref->checkbutton_display_display_intregs, FALSE, FALSE, 0); pref->checkbutton_display_display_piv = gtk_check_button_new_with_label (_("Velocity vectors")); gtk_widget_ref (pref->checkbutton_display_display_piv); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_display_display_piv", pref->checkbutton_display_display_piv, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__piv) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_display_display_piv), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->checkbutton_display_display_piv), FALSE); } gtk_widget_show (pref->checkbutton_display_display_piv); gtk_box_pack_start (GTK_BOX (pref->vbox_display_display), pref->checkbutton_display_display_piv, FALSE, FALSE, 0); /* * Hide and display PIV-derived data */ pref->frame_display_pivderived_display = gtk_frame_new (_("PIV-derived data")); gtk_widget_ref (pref->frame_display_pivderived_display); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "frame_display_pivderived_display", pref->frame_display_pivderived_display, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->frame_display_pivderived_display); gtk_table_attach (GTK_TABLE (pref->table2), pref->frame_display_pivderived_display, 2, 3, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); /* gtk_box_pack_start (GTK_BOX (pref->vbox_display_display), */ /* pref->frame_display_pivderived_display, */ /* FALSE, */ /* FALSE, */ /* 0); */ pref->vbox_display_pivderived_display = gtk_vbox_new (FALSE, 0); gtk_widget_ref (pref->vbox_display_pivderived_display); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "vbox_display_pivderived_display", pref->vbox_display_pivderived_display, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->vbox_display_pivderived_display); gtk_container_add (GTK_CONTAINER (pref->frame_display_pivderived_display), pref->vbox_display_pivderived_display); pref->radiobutton_display_display_none = gtk_radio_button_new_with_label (pref->scalardata_group, _("None")); pref->scalardata_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_display_none)); gtk_widget_ref (pref->radiobutton_display_display_none); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "radiobutton_display_display_none", pref->radiobutton_display_display_none, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__scalar == SHOW_SC_NONE) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_display_none), TRUE); } gtk_widget_show (pref->radiobutton_display_display_none); gtk_box_pack_start (GTK_BOX (pref->vbox_display_pivderived_display), pref->radiobutton_display_display_none, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_display_none), "scalar", (int *) SHOW_SC_NONE); pref->radiobutton_display_display_vor = gtk_radio_button_new_with_label (pref->scalardata_group, _("Vorticity")); pref->scalardata_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_display_vor)); gtk_widget_ref (pref->radiobutton_display_display_vor); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "radiobutton_display_display_vor", pref->radiobutton_display_display_vor, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__scalar == SHOW_SC_VORTICITY) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_display_vor), TRUE); } gtk_widget_show (pref->radiobutton_display_display_vor); gtk_box_pack_start (GTK_BOX (pref->vbox_display_pivderived_display), pref->radiobutton_display_display_vor, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_display_vor), "scalar", (int *) SHOW_SC_VORTICITY); pref->radiobutton_display_display_sstrain = gtk_radio_button_new_with_label (pref->scalardata_group, _("Shear strain")); pref->scalardata_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_display_sstrain)); gtk_widget_ref (pref->radiobutton_display_display_sstrain); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "radiobutton_display_display_sstrain", pref->radiobutton_display_display_sstrain, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__scalar == SHOW_SC_SSTRAIN) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_display_sstrain), TRUE); } gtk_widget_show (pref->radiobutton_display_display_sstrain); gtk_box_pack_start (GTK_BOX (pref->vbox_display_pivderived_display), pref->radiobutton_display_display_sstrain, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_display_sstrain), "scalar", (int *) SHOW_SC_SSTRAIN); pref->radiobutton_display_display_nstrain = gtk_radio_button_new_with_label (pref->scalardata_group, _("Normal strain")); pref->scalardata_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pref->radiobutton_display_display_nstrain)); gtk_widget_ref (pref->radiobutton_display_display_nstrain); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "radiobutton_display_display_nstrain", pref->radiobutton_display_display_nstrain, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__scalar == SHOW_SC_NSTRAIN) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pref->radiobutton_display_display_nstrain), TRUE); } gtk_widget_show (pref->radiobutton_display_display_nstrain); gtk_box_pack_start (GTK_BOX (pref->vbox_display_pivderived_display), pref->radiobutton_display_display_nstrain, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT(pref->radiobutton_display_display_nstrain), "scalar", (int *) SHOW_SC_NSTRAIN); /* * View menubar and rulers in the display */ pref->frame_display_view = gtk_frame_new (_("View options")); gtk_widget_ref (pref->frame_display_view); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "frame_display_view", pref->frame_display_view, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->frame_display_view); gtk_table_attach (GTK_TABLE (pref->table2), pref->frame_display_view, 2, 3, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); pref->vbox_display_view = gtk_vbox_new (FALSE, 0); gtk_widget_ref (pref->vbox_display_view); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "vbox_display_view", pref->vbox_display_view, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->vbox_display_view); gtk_container_add (GTK_CONTAINER (pref->frame_display_view), pref->vbox_display_view); pref->checkbutton_display_view_menubar = gtk_check_button_new_with_label (_("menubar")); gtk_widget_ref (pref->checkbutton_display_view_menubar); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_display_view_menubar", pref->checkbutton_display_view_menubar, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__view_menubar == 1) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (pref->checkbutton_display_view_menubar), TRUE); } else { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (pref->checkbutton_display_view_menubar), FALSE); } gtk_widget_show (pref->checkbutton_display_view_menubar); gtk_box_pack_start (GTK_BOX (pref->vbox_display_view), pref->checkbutton_display_view_menubar, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_display_view_menubar), "clicked", G_CALLBACK (on_checkbutton_display_view_menubar_activate), NULL); pref->checkbutton_display_view_rulers = gtk_check_button_new_with_label (_("rulers")); gtk_widget_ref (pref->checkbutton_display_view_rulers); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_display_view_rulers", pref->checkbutton_display_view_rulers, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__view_rulers == 1) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (pref->checkbutton_display_view_rulers), TRUE); } else { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (pref->checkbutton_display_view_rulers), FALSE); } gtk_widget_show (pref->checkbutton_display_view_rulers); gtk_box_pack_start (GTK_BOX (pref->vbox_display_view), pref->checkbutton_display_view_rulers, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_display_view_rulers), "clicked", G_CALLBACK (on_checkbutton_display_view_rulers_activate), NULL); pref->checkbutton_display_stretch_auto = gtk_check_button_new_with_label (_("stretch auto")); gtk_widget_ref (pref->checkbutton_display_stretch_auto); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "checkbutton_display_stretch_auto", pref->checkbutton_display_stretch_auto, (GtkDestroyNotify) gtk_widget_unref); if (default_par->display__stretch_auto == 1) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (pref->checkbutton_display_stretch_auto), TRUE); } else { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (pref->checkbutton_display_stretch_auto), FALSE); } gtk_widget_show (pref->checkbutton_display_stretch_auto); gtk_box_pack_start (GTK_BOX (pref->vbox_display_view), pref->checkbutton_display_stretch_auto, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (pref->checkbutton_display_stretch_auto), "clicked", G_CALLBACK (on_checkbutton_display_stretch_auto_activate), NULL); /* * Tabulator for display */ pref->tab2 = gtk_label_new (_("display")); gtk_widget_ref (pref->tab2); gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "tab2", pref->tab2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pref->tab2); gtk_notebook_set_tab_label (GTK_NOTEBOOK (pref->notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (pref->notebook), 1), pref->tab2); /* * Font selection tabulator */ /* fontselection = gtk_font_selection_new (); */ /* gtk_widget_ref (fontselection); */ /* gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "fontselection", fontselection, */ /* (GtkDestroyNotify) gtk_widget_unref); */ /* gtk_widget_show (fontselection); */ /* gtk_container_add (GTK_CONTAINER (pref->notebook), fontselection); */ /* pref_tab3 = gtk_label_new (_("fonts")); */ /* gtk_widget_ref (pref_tab3); */ /* gtk_object_set_data_full (GTK_OBJECT (pref->preferences), "pref_tab3", pref_tab3, */ /* (GtkDestroyNotify) gtk_widget_unref); */ /* gtk_widget_show (pref_tab3); */ /* gtk_notebook_set_tab_label (GTK_NOTEBOOK (pref->notebook), gtk_notebook_get_nth_page (GTK_NOTEBOOK (notebook), 2), pref_tab3); */ /* * Dialog area with "OK", "Apply and "Cancel" buttons */ /* pref->dialog_action_area1 = GTK_DIALOG (pref->preferences)->action_area; */ /* gtk_object_set_data (GTK_OBJECT (pref->preferences), */ /* "dialog_action_area1", */ /* pref->dialog_action_area1); */ /* gtk_widget_show (pref->dialog_action_area1); */ /* gtk_button_box_set_layout (GTK_BUTTON_BOX (pref->dialog_action_area1), */ /* GTK_BUTTONBOX_END); */ /* gtk_button_box_set_spacing (GTK_BUTTON_BOX (pref->dialog_action_area1), */ /* 8); */ /* button_ok = */ /* (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-ok"); */ /* gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pref->preferences)->action_area), */ /* button_ok, TRUE, TRUE, 0); */ /* gtk_widget_ref (button_ok); */ /* gtk_object_set_data_full (GTK_OBJECT (pref->preferences), */ /* "button_ok", */ /* button_ok, */ /* (GtkDestroyNotify) gtk_widget_unref); */ /* gtk_widget_show (button_ok); */ /* GTK_WIDGET_SET_FLAGS (button_ok, */ /* GTK_CAN_DEFAULT); */ /* gtk_tooltips_set_tip(gpiv->tooltips, button_ok, */ /* _("Updates parameters and save as defaults"), */ /* NULL); */ /* gtk_object_set_data(GTK_OBJECT(button_ok), */ /* "gpiv", */ /* gpiv); */ /* g_signal_connect (GTK_OBJECT (button_ok), "clicked", */ /* G_CALLBACK (on_button_ok), */ /* NULL); */ /* button_apply = */ /* (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-apply"); */ /* gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pref->preferences)->action_area), */ /* button_apply, TRUE, TRUE, 0); */ /* gtk_widget_ref (button_apply); */ /* gtk_object_set_data_full (GTK_OBJECT (pref->preferences), */ /* "button_apply", */ /* button_apply, */ /* (GtkDestroyNotify) gtk_widget_unref); */ /* gtk_widget_show (button_apply); */ /* GTK_WIDGET_SET_FLAGS (button_apply, GTK_CAN_DEFAULT); */ /* gtk_tooltips_set_tip(gpiv->tooltips, button_apply, */ /* _("Updates actual parameters, do not store as defaults"), */ /* NULL); */ /* gtk_object_set_data(GTK_OBJECT(button_apply), */ /* "gpiv", */ /* gpiv); */ /* g_signal_connect (GTK_OBJECT (button_apply), "clicked", */ /* G_CALLBACK (on_button_apply), */ /* NULL); */ /* button_cancel = */ /* (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-cancel"); */ /* gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pref->preferences)->action_area), */ /* button_cancel, TRUE, TRUE, 0); */ /* gtk_widget_ref (button_cancel); */ /* gtk_object_set_data_full (GTK_OBJECT (pref->preferences), */ /* "button_cancel", */ /* button_cancel, */ /* (GtkDestroyNotify) gtk_widget_unref); */ /* gtk_widget_show (button_cancel); */ /* GTK_WIDGET_SET_FLAGS (button_cancel, */ /* GTK_CAN_DEFAULT); */ /* gtk_tooltips_set_tip(gpiv->tooltips, */ /* button_cancel, */ /* _("Close pref->preferences window"), */ /* NULL); */ /* g_signal_connect (GTK_OBJECT (button_cancel), */ /* "clicked", */ /* G_CALLBACK (on_button_cancel), */ /* NULL); */ /* * Display callback functions */ g_signal_connect (GTK_OBJECT(pref->radiobutton_display_vecscale1), "toggled", G_CALLBACK(on_radiobutton_display_vecscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_vecscale2), "toggled", G_CALLBACK(on_radiobutton_display_vecscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_vecscale3), "toggled", G_CALLBACK(on_radiobutton_display_vecscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_vecscale4), "toggled", G_CALLBACK(on_radiobutton_display_vecscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_vecscale5), "toggled", G_CALLBACK(on_radiobutton_display_vecscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_vecscale6), "toggled", G_CALLBACK(on_radiobutton_display_vecscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_vecscale7), "toggled", G_CALLBACK(on_radiobutton_display_vecscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_veccolor1), "toggled", G_CALLBACK(on_radiobutton_display_veccolor), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_veccolor2), "toggled", G_CALLBACK(on_radiobutton_display_veccolor), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_veccolor3), "toggled", G_CALLBACK(on_radiobutton_display_veccolor), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_veccolor4), "toggled", G_CALLBACK(on_radiobutton_display_veccolor), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_zoomscale0), "toggled", G_CALLBACK(on_radiobutton_display_zoomscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_zoomscale1), "toggled", G_CALLBACK(on_radiobutton_display_zoomscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_zoomscale2), "toggled", G_CALLBACK(on_radiobutton_display_zoomscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_zoomscale3), "toggled", G_CALLBACK(on_radiobutton_display_zoomscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_zoomscale4), "toggled", G_CALLBACK(on_radiobutton_display_zoomscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_zoomscale5), "toggled", G_CALLBACK(on_radiobutton_display_zoomscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_zoomscale6), "toggled", G_CALLBACK(on_radiobutton_display_zoomscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_zoomscale6), "toggled", G_CALLBACK(on_radiobutton_display_zoomscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_zoomscale7), "toggled", G_CALLBACK(on_radiobutton_display_zoomscale), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_backgroundcolor1), "toggled", G_CALLBACK(on_radiobutton_display_background), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_backgroundcolor2), "toggled", G_CALLBACK(on_radiobutton_display_background), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_background_img1), "toggled", G_CALLBACK(on_radiobutton_display_background), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_background_img2), "toggled", G_CALLBACK(on_radiobutton_display_background), NULL); /* g_signal_connect (GTK_OBJECT(checkbutton_display_display_img1), */ /* "toggled", */ /* G_CALLBACK(on_checkbutton_display_display_img1), */ /* NULL); */ /* g_signal_connect (GTK_OBJECT(checkbutton_display_display_img2), */ /* "toggled", */ /* G_CALLBACK(on_checkbutton_display_display_img2), */ /* NULL); */ g_signal_connect (GTK_OBJECT(pref->checkbutton_display_display_intregs), "toggled", G_CALLBACK(on_checkbutton_display_display_intregs), NULL); g_signal_connect (GTK_OBJECT(pref->checkbutton_display_display_piv), "toggled", G_CALLBACK(on_checkbutton_display_display_piv), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_display_none), "toggled", G_CALLBACK(on_radiobutton_display_scalar), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_display_vor), "toggled", G_CALLBACK(on_radiobutton_display_scalar), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_display_sstrain), "toggled", G_CALLBACK(on_radiobutton_display_scalar), NULL); g_signal_connect (GTK_OBJECT(pref->radiobutton_display_display_nstrain), "toggled", G_CALLBACK(on_radiobutton_display_scalar), NULL); return pref->preferences; } gpiv-0.6.1/src/preferences_interface.h0000644000175000017500000001330711110306411014655 00000000000000/*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * $Log: preferences_interface.h,v $ * Revision 1.2 2008-10-09 14:43:37 gerber * paralellized with OMP and MPI * * Revision 1.1 2008-09-16 11:23:03 gerber * added preferences_interface * */ #ifndef PREFERENCES_INTERFACE_H #define PREFERENCES_INTERFACE_H #include "gpiv_gui.h" typedef struct _Pref Pref; struct _Pref { GtkDialog *preferences; GtkWidget *action_area; GtkWidget *applybutton; GtkWidget *cancelbutton; GtkWidget *okbutton; GtkWidget *notebook; GtkWidget *table1; GtkWidget *frame_view; GtkWidget *vbox1; GtkWidget *checkbutton_gpivbuttons; GtkWidget *checkbutton_tab; GtkWidget *frame_io; GtkWidget *vbox_io; GSList *imgformat_sel_group; GtkWidget *radiobutton_imgfmt_0; GtkWidget *radiobutton_imgfmt_1; GtkWidget *radiobutton_imgfmt_2; GSList *dataformat_sel_group; GtkWidget *radiobutton_datafmt_0; GtkWidget *radiobutton_datafmt_1; /* GtkWidget *checkbutton_hdf; */ GtkWidget *checkbutton_xcorr; GtkWidget *checkbutton_tooltips; GtkWidget *frame_processes; GtkWidget *vbox2; #ifdef ENABLE_CAM GtkWidget *checkbutton_process_cam; #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG GtkWidget *checkbutton_process_trig; #endif /* ENABLE_TRIG */ #ifdef ENABLE_IMGPROC GtkWidget *checkbutton_process_imgproc; #endif /* ENABLE_ENABLE_IMGPROC */ GtkWidget *checkbutton_process_piv; GtkWidget *checkbutton_process_gradient; GtkWidget *checkbutton_process_resstats; GtkWidget *checkbutton_process_errvec; GtkWidget *checkbutton_process_peaklck; GtkWidget *checkbutton_process_scale; GtkWidget *checkbutton_process_avg; GtkWidget *checkbutton_process_subtract; GtkWidget *checkbutton_process_vorstra; GtkWidget *hbox1; GtkWidget *label_spinner_bins; GtkObject *spinbutton_bins_adj; GtkWidget *spinbutton_bins; #ifdef ENABLE_MPI GtkWidget *hbox2; GtkWidget *label_spinner_nodes; GtkObject *spinbutton_nodes_adj; GtkWidget *spinbutton_nodes; #endif /* ENABLE_MPI */ GtkWidget *tab1; GtkWidget *table2; GtkWidget *frame_display_vecscale; GtkWidget *vbox_display_vecscale; GSList *vecscale_group/* = NULL */; GtkWidget *radiobutton_display_vecscale1; GtkWidget *radiobutton_display_vecscale2; GtkWidget *radiobutton_display_vecscale3; GtkWidget *radiobutton_display_vecscale4; GtkWidget *radiobutton_display_vecscale5; GtkWidget *radiobutton_display_vecscale6; GtkWidget *radiobutton_display_vecscale7; GtkWidget *frame_display_veccolor; GtkWidget *vbox_display_veccolor; GSList *veccolor_group/* = NULL */; GtkWidget *radiobutton_display_veccolor1; GtkWidget *radiobutton_display_veccolor2; GtkWidget *radiobutton_display_veccolor3; GtkWidget *radiobutton_display_veccolor4; GtkWidget *frame_display_zoomscale; GtkWidget *vbox_display_zoomscale; GSList *zoomscale_group/* = NULL */; GtkWidget *radiobutton_display_zoomscale0; GtkWidget *radiobutton_display_zoomscale1; GtkWidget *radiobutton_display_zoomscale2; GtkWidget *radiobutton_display_zoomscale3; GtkWidget *radiobutton_display_zoomscale4; GtkWidget *radiobutton_display_zoomscale5; GtkWidget *radiobutton_display_zoomscale6; GtkWidget *radiobutton_display_zoomscale7; GtkWidget *frame_display_backgroundcolor; GtkWidget *vbox_display_backgroundcolor; GSList *backgroundcolor_group/* = NULL */; GtkWidget *radiobutton_display_backgroundcolor1; /* _blue */ GtkWidget *radiobutton_display_backgroundcolor2; /* _black */ GtkWidget *radiobutton_display_background_img1; GtkWidget *radiobutton_display_background_img2; GtkWidget *frame_display_display; GtkWidget *vbox_display_display; GtkWidget *checkbutton_display_display_intregs; GtkWidget *checkbutton_display_display_piv; GSList *scalardata_group/* = NULL */; GtkWidget *frame_display_pivderived_display; GtkWidget *vbox_display_pivderived_display; GtkWidget *radiobutton_display_display_none; GtkWidget *radiobutton_display_display_vor; GtkWidget *radiobutton_display_display_sstrain; GtkWidget *radiobutton_display_display_nstrain; GtkWidget *frame_display_view; GtkWidget *vbox_display_view; GtkWidget *checkbutton_display_view_menubar; GtkWidget *checkbutton_display_view_rulers; GtkWidget *checkbutton_display_stretch_auto; GtkWidget *tab2; /* GtkWidget *fontselection; */ /* GtkWidget *tab3; */ /* GtkWidget *dialog_action_area1; */ /* GtkWidget *button_ok; */ /* GtkWidget *button_apply; */ /* GtkWidget *button_cancel; */ }; #endif /* PREFERENCES_INTERFACE_H */ gpiv-0.6.1/src/utils_par.c0000644000175000017500000005661711110305405012346 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * utility functions for gpiv * $Log: utils_par.c,v $ * Revision 1.2 2008-10-09 14:43:37 gerber * paralellized with OMP and MPI * * Revision 1.1 2008-09-16 11:24:37 gerber * added utils_par * * */ #include "gpiv_gui.h" #include "utils_par.h" /* * Prottyping */ static void set_par_bool_ifdiff (gboolean *val_src, gboolean *val_dest, gboolean *set_dest); static void set_par_int_ifdiff (gint *val_src, gint *val_dest, gboolean *set_dest); static void print_par_bool (gchar *parname, gboolean val, gboolean set); static void print_par_int (gchar *parname, gint val, gboolean set); static void par_ovwrt_parameters (Par *par_src, Par *par_dest, gboolean force); /* * Program-wide public functions */ void parameters_set (Par *par, gboolean bool ) /*----------------------------------------------------------------------------- * Defines each parameter member of par_dest->*__set to bool */ { par->img_fmt__set = bool; par->hdf__set = bool; par->print_par__set = bool; par->verbose__set = bool; par->x_corr__set = bool; par->console__show_tooltips__set = bool; par->console__view_tabulator__set = bool; par->console__view_gpivbuttons__set = bool; par->console__nbins__set = bool; #ifdef ENABLE_CAM par->process__cam = bool; #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG par->process__trig = bool; #endif /* ENABLE_DAC */ #ifdef ENABLE_IMGPROC par->process__imgproc = bool; #endif /* ENABLE_IMGPROC */ par->process__piv = bool; par->process__gradient = bool; par->process__resstats = bool; par->process__errvec = bool; par->process__peaklock = bool; par->process__scale = bool; par->process__average = bool; par->process__subtract = bool; par->process__vorstra = bool; par->display__view_menubar = bool; par->display__view_rulers = bool; par->display__stretch_auto = bool; par->display__vector_scale = bool; par->display__vector_color = bool; par->display__zoom_index = bool; par->display__backgrnd__set = bool; par->display__intregs = bool; par->display__piv = bool; par->display__scalar__set = bool; #ifdef ENABLE_MPI par->mpi_nodes__set = bool; #endif /* ENABLE_MPI */ } void set_parameters_ifdiff (Par *par_src, Par *par_dest ) /*----------------------------------------------------------------------------- * Defines each parameter member of par_dest->*__set to TRUE if par_src differs */ { set_par_int_ifdiff ((int *) &par_src->img_fmt, (int *) &par_dest->img_fmt, &par_dest->img_fmt__set); set_par_bool_ifdiff (&par_src->hdf, &par_dest->hdf, &par_dest->hdf__set); set_par_bool_ifdiff (&par_src->print_par, &par_dest->print_par, &par_dest->print_par__set); set_par_bool_ifdiff (&par_src->verbose, &par_dest->verbose, &par_dest->verbose__set); set_par_bool_ifdiff (&par_src->x_corr, &par_dest->x_corr, &par_dest->x_corr__set); set_par_bool_ifdiff (&par_src->console__show_tooltips, &par_dest->console__show_tooltips, &par_dest->console__show_tooltips__set); set_par_bool_ifdiff (&par_src->console__view_tabulator, &par_dest->console__view_tabulator, &par_dest->console__view_tabulator__set); set_par_bool_ifdiff (&par_src->console__view_gpivbuttons, &par_dest->console__view_gpivbuttons, &par_dest->console__view_gpivbuttons__set); set_par_int_ifdiff (&par_src->console__nbins, &par_dest->console__nbins, &par_dest->console__nbins__set); #ifdef ENABLE_CAM set_par_bool_ifdiff (&par_src->process__cam, &par_dest->process__cam, &par_dest->process__cam__set); #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG set_par_bool_ifdiff (&par_src->process__trig, &par_dest->process__trig, &par_dest->process__trig__set); #endif /* ENABLE_DAC */ #ifdef ENABLE_IMGPROC set_par_bool_ifdiff (&par_src->process__imgproc, &par_dest->process__imgproc, &par_dest->process__imgproc__set); #endif /* ENABLE_IMGPROC */ set_par_bool_ifdiff (&par_src->process__piv, &par_dest->process__piv, &par_dest->process__piv__set); set_par_bool_ifdiff (&par_src->process__gradient, &par_dest->process__gradient, &par_dest->process__gradient__set); set_par_bool_ifdiff (&par_src->process__resstats, &par_dest->process__resstats, &par_dest->process__resstats__set); set_par_bool_ifdiff (&par_src->process__errvec, &par_dest->process__errvec, &par_dest->process__errvec__set); set_par_bool_ifdiff (&par_src->process__peaklock, &par_dest->process__peaklock, &par_dest->process__peaklock__set); set_par_bool_ifdiff (&par_src->process__scale, &par_dest->process__scale, &par_dest->process__scale__set); set_par_bool_ifdiff (&par_src->process__average, &par_dest->process__average, &par_dest->process__average__set); set_par_bool_ifdiff (&par_src->process__subtract, &par_dest->process__subtract, &par_dest->process__subtract__set); set_par_bool_ifdiff (&par_src->process__vorstra, &par_dest->process__vorstra, &par_dest->process__vorstra__set); set_par_bool_ifdiff (&par_src->display__view_menubar, &par_dest->display__view_menubar, &par_dest->display__view_menubar__set); set_par_bool_ifdiff (&par_src->display__view_rulers, &par_dest->display__view_rulers, &par_dest->display__view_rulers__set); set_par_bool_ifdiff (&par_src->display__stretch_auto, &par_dest->display__stretch_auto, &par_dest->display__stretch_auto__set); set_par_int_ifdiff ((int *) &par_src->display__vector_scale, (int *) &par_dest->display__vector_scale, &par_dest->display__vector_scale__set); set_par_int_ifdiff ((int *) &par_src->display__vector_color, (int *) &par_dest->display__vector_color, &par_dest->display__vector_color__set); set_par_int_ifdiff ((int *) &par_src->display__zoom_index, (int *) &par_dest->display__zoom_index, &par_dest->display__zoom_index__set); set_par_int_ifdiff ((int *) &par_src->display__backgrnd, (int *) &par_dest->display__backgrnd, &par_dest->display__backgrnd__set); set_par_bool_ifdiff (&par_src->display__intregs, &par_dest->display__intregs, &par_dest->display__intregs__set); set_par_bool_ifdiff (&par_src->display__piv, &par_dest->display__piv, &par_dest->display__piv__set); set_par_int_ifdiff ((int *) &par_src->display__scalar, (int *) &par_dest->display__scalar, &par_dest->display__scalar__set); #ifdef ENABLE_MPI set_par_int_ifdiff (&par_src->mpi_nodes, &par_dest->mpi_nodes, &par_dest->mpi_nodes__set); #endif /* ENABLE_MPI */ } void print_parameters (Par *par ) /*----------------------------------------------------------------------------- */ { print_par_int ("img_fmt", par->img_fmt, par->img_fmt__set); print_par_bool ("hdf", par->hdf, par->hdf__set); print_par_bool ("print_par", par->print_par, par->print_par__set); print_par_bool ("verbose", par->verbose, par->verbose__set); print_par_bool ("x_corr", par->x_corr, par->x_corr__set); print_par_bool ("console__show_tooltips", par->console__show_tooltips, par->console__show_tooltips__set); print_par_bool ("console__view_tabulator", par->console__view_tabulator, par->console__view_tabulator__set); print_par_bool ("console__view_gpivbuttons", par->console__view_gpivbuttons, par->console__view_gpivbuttons__set); print_par_int ("console__nbins", par->console__nbins, par->console__nbins__set); #ifdef ENABLE_CAM print_par_bool ("process__cam", par->process__cam, par->process__cam__set); #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG print_par_bool ("process__trig", par->process__trig, par->process__trig__set); #endif /* ENABLE_DAC */ #ifdef ENABLE_IMGPROC print_par_bool ("process__imgproc", par->process__imgproc, par->process__imgproc__set); #endif /* ENABLE_IMGPROC */ print_par_bool ("process__piv", par->process__piv, par->process__piv__set); print_par_bool ("process__gradient", par->process__gradient, par->process__gradient__set); print_par_bool ("process__resstats", par->process__resstats, par->process__resstats__set); print_par_bool ("process__errvec", par->process__errvec, par->process__errvec__set); print_par_bool ("process__peaklock", par->process__peaklock, par->process__peaklock__set); print_par_bool ("process__scale", par->process__scale, par->process__scale__set); print_par_bool ("process__average", par->process__average, par->process__average__set); print_par_bool ("process__subtract", par->process__subtract, par->process__subtract__set); print_par_bool ("process__vorstra", par->process__vorstra, par->process__vorstra__set); print_par_bool ("display__view_menubar", par->display__view_menubar, par->display__view_menubar__set); print_par_bool ("display__view_rulers", par->display__view_rulers, par->display__view_rulers__set); print_par_bool ("display__stretch_auto", par->display__stretch_auto, par->display__stretch_auto__set); print_par_bool ("display__vector_scale", par->display__vector_scale, par->display__vector_scale__set); print_par_bool ("display__vector_color", par->display__vector_color, par->display__vector_color__set); print_par_bool ("display__zoom_index", par->display__zoom_index, par->display__zoom_index__set); print_par_bool ("display__background", par->display__backgrnd, par->display__backgrnd__set); print_par_bool ("display__intregs", par->display__intregs, par->display__intregs__set); print_par_bool ("display__piv", par->display__piv, par->display__piv__set); print_par_bool ("display__scalar", par->display__scalar, par->display__scalar__set); #ifdef ENABLE_MPI print_par_int ("mpi_nodes", par->mpi_nodes, par->mpi_nodes__set); #endif /* ENABLE_MPI */ } gchar * cp_undef_parameters (Par *par_src, Par *par_dest ) /*----------------------------------------------------------------------------- * DESCRIPTION: * Copies only those gpiv parameters from src to dest if dest has not * been defined * * INPUTS: * par_src: source gpiv parameters * force: flag to force the copying, even if destination * already exists * print_par: verbose output. Not implemented, yet. * * OUTPUTS: * par_dest: destination piv parameters * * RETURNS: * *---------------------------------------------------------------------------*/ { gchar *err_msg = NULL; gboolean force = FALSE; par_ovwrt_parameters (par_src, par_dest, force); return err_msg; } Par * cp_parameters (Par *par_src ) /*----------------------------------------------------------------------------- * DESCRIPTION: * Copies all gpiv parameters * * INPUTS: * par_src: source gpiv parameters * force: flag to force the copying, even if destination * already exists * print_par: verbose output. Not implemented, yet. * * OUTPUTS: * par_dest: destination piv parameters * * RETURNS: * *---------------------------------------------------------------------------*/ { Par *par_dest = g_new0 (Par, 1); gboolean force = TRUE; par_ovwrt_parameters (par_src, par_dest, force); return par_dest; } /* * Local functions */ static void set_par_bool_ifdiff (gboolean *val_src, gboolean *val_dest, gboolean *set_dest) /*----------------------------------------------------------------------------- */ { if (*val_src != *val_dest) { *val_dest = *val_src; *set_dest = TRUE; } else { *set_dest = FALSE; } } static void set_par_int_ifdiff (gint *val_src, gint *val_dest, gboolean *set_dest) /*----------------------------------------------------------------------------- */ { if (*val_src != *val_dest) { *val_dest = *val_src; *set_dest = TRUE; } else { *set_dest = FALSE; } } static void print_par_bool (gchar *parname, gboolean val, gboolean set) /*----------------------------------------------------------------------------- */ { if (set) { g_message ("%s__set is TRUE", parname); } else { g_message ("%s__set is FALSE", parname); } if (val) { g_message ("%s is set to: TRUE", parname); } else { g_message ("%s is set to: FALSE", parname); } } static void print_par_int (gchar *parname, gint val, gboolean set) /*----------------------------------------------------------------------------- */ { if (set) { g_message ("%s__set is TRUE", parname); } else { g_message ("%s__set is FALSE", parname); } g_message ("%s is set to: %d", parname, val); } static void par_ovwrt_parameters (Par *par_src, Par *par_dest, gboolean force ) /*----------------------------------------------------------------------------- * DESCRIPTION: * Copies gpiv parameters * * INPUTS: * par_src: source gpiv parameters * par_dest: destination gpiv parameters * force: flag to force the copying, even if destination * already exists * * OUTPUTS: * par_dest: destination piv parameters * * RETURNS: * *---------------------------------------------------------------------------*/ { if (force || ( par_src->img_fmt__set && !par_dest->img_fmt__set)) { par_dest->img_fmt = par_src->img_fmt; par_dest->img_fmt__set = TRUE; } if (force || ( par_src->hdf__set && !par_dest->hdf__set)) { par_dest->hdf = par_src->hdf; par_dest->hdf__set = TRUE; } if (force || ( par_src->print_par__set && !par_dest->print_par__set)) { par_dest->print_par = par_src->print_par; par_dest->print_par__set = TRUE; } if (force || ( par_src->verbose__set && !par_dest->verbose__set)) { par_dest->verbose = par_src->verbose; par_dest->verbose__set = TRUE; } if (force || ( par_src->x_corr__set && !par_dest->x_corr__set)) { par_dest->x_corr = par_src->x_corr; par_dest->x_corr__set = TRUE; } if (force || ( par_src->console__show_tooltips__set && !par_dest->console__show_tooltips__set)) { par_dest->console__show_tooltips = par_src->console__show_tooltips; par_dest->console__show_tooltips__set = TRUE; } if (force || ( par_src->console__view_tabulator__set && !par_dest->console__view_tabulator__set)) { par_dest->console__view_tabulator = par_src->console__view_tabulator; par_dest->console__view_tabulator__set = TRUE; } if (force || ( par_src->console__view_gpivbuttons__set && !par_dest->console__view_gpivbuttons__set)) { par_dest->console__view_gpivbuttons = par_src->console__view_gpivbuttons; par_dest->console__view_gpivbuttons__set = TRUE; } if (force || ( par_src->console__nbins__set && !par_dest->console__nbins__set)) { par_dest->console__nbins = par_src->console__nbins; par_dest->console__nbins__set = TRUE; } #ifdef ENABLE_CAM if (force || ( par_src->process__cam__set && !par_dest->process__cam__set)) { par_dest->process__cam = par_src->process__cam; par_dest->process__cam__set = TRUE; } #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG if (force || ( par_src->process__trig__set && !par_dest->process__trig__set)) { par_dest->process__trig = par_src->process__trig; par_dest->process__trig__set = TRUE; } #endif /* ENABLE_DAC */ #ifdef ENABLE_IMGPROC if (force || ( par_src->process__imgproc__set && !par_dest->process__imgproc__set)) { par_dest->process__piv = par_src->process__piv; par_dest->process__imgproc__set = TRUE; } #endif /* ENABLE_IMGPROC */ if (force || ( par_src->process__piv__set && !par_dest->process__piv__set)) { par_dest->process__piv = par_src->process__piv; par_dest->process__piv__set = TRUE; } if (force || ( par_src->process__gradient__set && !par_dest->process__gradient__set)) { par_dest->process__gradient = par_src->process__gradient; par_dest->process__gradient__set = TRUE; } if (force || ( par_src->process__resstats__set && !par_dest->process__resstats__set)) { par_src->process__resstats = par_dest->process__resstats; par_dest->process__resstats__set = TRUE; } if (force || ( par_src->process__errvec__set && !par_dest->process__errvec__set)) { par_dest->process__errvec = par_src->process__errvec; par_dest->process__errvec__set = TRUE; } if (force || ( par_src->process__peaklock__set && !par_dest->process__peaklock__set)) { par_dest->process__peaklock = par_src->process__peaklock; par_dest->process__peaklock__set = TRUE; } if (force || ( par_src->process__scale__set && !par_dest->process__scale__set)) { par_dest->process__scale = par_src->process__scale; par_dest->process__scale__set = TRUE; } if (force || ( par_src->process__average__set && !par_dest->process__average__set)) { par_dest->process__average = par_src->process__average; par_dest->process__average__set = TRUE; } if (force || ( par_src->process__subtract__set && !par_dest->process__subtract__set)) { par_dest->process__subtract = par_src->process__subtract; par_dest->process__subtract__set = TRUE; } if (force || ( par_src->process__vorstra__set && !par_dest->process__vorstra__set)) { par_dest->process__vorstra = par_src->process__vorstra; par_dest->process__vorstra__set = TRUE; } if (force || ( par_src->display__view_menubar__set && !par_dest->display__view_menubar__set)) { par_dest->display__view_menubar = par_src->display__view_menubar; par_dest->display__view_menubar__set = TRUE; } if (force || ( par_src->display__view_rulers__set && !par_dest->display__view_rulers__set)) { par_dest->display__view_rulers = par_src->display__view_rulers; par_dest->display__view_rulers__set = TRUE; } if (force || ( par_src->display__stretch_auto__set && !par_dest->display__stretch_auto__set)) { par_dest->display__view_rulers = par_src->display__view_rulers; par_dest->display__stretch_auto__set = TRUE; } if (force || ( par_src->display__vector_scale__set && !par_dest->display__vector_scale__set)) { par_dest->display__vector_scale = par_src->display__vector_scale; par_dest->display__vector_scale__set = TRUE; } if (force || ( par_src->display__vector_color__set && !par_dest->display__vector_color__set)) { par_dest->display__vector_color = par_src->display__vector_color; par_dest->display__vector_color__set = TRUE; } if (force || ( par_src->display__zoom_index__set && !par_dest->display__zoom_index__set)) { par_dest->display__zoom_index = par_src->display__zoom_index; par_dest->display__zoom_index__set = TRUE; } if (force || ( par_src->display__backgrnd__set && !par_dest->display__backgrnd__set)) { par_dest->display__backgrnd = par_src->display__backgrnd; par_dest->display__backgrnd__set = TRUE; } if (force || ( par_src->display__intregs__set && !par_dest->display__intregs__set)) { par_dest->display__intregs = par_src->display__intregs; par_dest->display__intregs__set = TRUE; } if (force || ( par_src->display__piv__set && !par_dest->display__piv__set)) { par_dest->display__piv = par_src->display__piv; par_dest->display__piv__set = TRUE; } if (force || ( par_src->display__scalar__set && !par_dest->display__scalar__set)) { par_dest->display__scalar = par_src->display__scalar; par_dest->display__scalar__set = TRUE; } #ifdef ENABLE_MPI if (force || ( par_src->mpi_nodes__set && !par_dest->mpi_nodes__set)) { par_dest->mpi_nodes = par_src->mpi_nodes; par_dest->mpi_nodes__set = TRUE; } #endif /* ENABLE_MPI */ } gpiv-0.6.1/src/utils_par.h0000644000175000017500000000273511110306312012341 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /* libgpiv - library for Particle Image Velocimetry Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of libgpiv. Libgpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * $Log: utils_par.h,v $ * Revision 1.1 2008-09-16 11:24:37 gerber * added utils_par * */ #ifndef UTILS_PAR_H #define UTILS_PAR_H void print_parameters (Par *par ); void parameters_set (Par *par, gboolean bool ); gchar * cp_undef_parameters (Par *par_src, Par *par_dest ); Par * cp_parameters (Par *par_src); #endif /* UTILS_PAR_H */ gpiv-0.6.1/src/pivpost_interface.c0000644000175000017500000011101011110305542014045 00000000000000/*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * PIV Post-processing interface * $Log: pivpost_interface.c,v $ * Revision 1.10 2007-11-23 16:24:08 gerber * release 0.5.0: Kafka * * Revision 1.9 2007-01-29 11:27:44 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.8 2006-09-18 07:27:06 gerber * *** empty log message *** * * Revision 1.7 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.5 2005/02/12 14:12:12 gerber * Changed tabular names and titles * * Revision 1.4 2005/01/19 15:53:42 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.3 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.2 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifdef HAVE_CONFIG_H # include #endif #include "gpiv_gui.h" /* #include "console.h" */ #include "utils.h" #include "pivpost_interface.h" #include "pivpost.h" PivPost* create_pivpost (GnomeApp *main_window, GtkWidget *container ) /*----------------------------------------------------------------------------- */ { PivPost * post = g_new0 (PivPost, 1); GpivConsole * gpiv = gtk_object_get_data (GTK_OBJECT (main_window), "gpiv"); post->vbox_label = gtk_vbox_new (FALSE, 0); gtk_widget_ref (post->vbox_label); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_vbox_label", post->vbox_label, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->vbox_label); gtk_container_add (GTK_CONTAINER (container), post->vbox_label); post->label_title = gtk_label_new(_("Piv data post processing")); gtk_widget_ref(post->label_title); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_label_title", post->label_title, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->label_title); gtk_box_pack_start (GTK_BOX (post->vbox_label), post->label_title, FALSE, FALSE, 0); /* * Scrolled window */ post->vbox_scroll = gtk_vbox_new (FALSE, 0); gtk_widget_ref (post->vbox_scroll); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_vbox_scroll", post->vbox_scroll, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->vbox_scroll); gtk_box_pack_start (GTK_BOX (post->vbox_label), post->vbox_scroll, TRUE, TRUE, 0); post->scrolledwindow = gtk_scrolled_window_new (NULL, NULL); gtk_widget_ref (post->scrolledwindow); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_scrolledwindow", post->scrolledwindow, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->scrolledwindow); gtk_box_pack_start (GTK_BOX (post->vbox_scroll), post->scrolledwindow, TRUE, TRUE, 0); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (post->scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_NEVER /* GTK_POLICY_AUTOMATIC */ ); post->viewport = gtk_viewport_new (NULL, NULL); gtk_widget_ref (post->viewport); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_viewport", post->viewport, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->viewport); gtk_container_add (GTK_CONTAINER (post->scrolledwindow), post->viewport); /* * main table for PIVPOST */ post->table = gtk_table_new (2, 2, FALSE); gtk_widget_ref (post->table); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_table", post->table, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->table); gtk_container_add (GTK_CONTAINER (post->viewport), post->table); /* * Scale frame */ /* * Spinners use the adjustment from spinbutton_adj_imgh_* */ post->frame_scale = gtk_frame_new ( _("Scaling")); gtk_widget_ref (post->frame_scale); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_frame_scale", post->frame_scale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->frame_scale); gtk_table_attach (GTK_TABLE (post->table), post->frame_scale, 0, 1, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); post->table_scale = gtk_table_new (5, 2, FALSE); gtk_widget_ref (post->table_scale); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_table_scale", post->table_scale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->table_scale); gtk_container_add (GTK_CONTAINER (post->frame_scale), post->table_scale); /* *spinner for spatial scale "sscale" */ post->label_sscale = gtk_label_new ( _("spatial scale (mm/pixels): ")); gtk_widget_ref (post->label_sscale); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_label_sscale", post->label_sscale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->label_sscale); gtk_table_attach (GTK_TABLE (post->table_scale), post->label_sscale, 0, 1, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); /* * KEEP DISABLED */ /* spinbutton_adj_post_sscale = */ /* gtk_adjustment_new (gl_post_par.s_scale, 0, 1279, 1, 100, 100); */ /* * end of KEEP DISABLED */ post->spinbutton_sscale = gtk_spin_button_new (GTK_ADJUSTMENT (gpiv->imgh->spinbutton_adj_sscale), 1, 4); gtk_widget_ref (post->spinbutton_sscale); gtk_widget_show (post->spinbutton_sscale); gtk_table_attach (GTK_TABLE (post->table_scale), post->spinbutton_sscale, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (post->spinbutton_sscale), TRUE); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (post->spinbutton_sscale), TRUE); gtk_object_set_data (GTK_OBJECT (post->spinbutton_sscale), "post", post); gtk_object_set_data (GTK_OBJECT (post->spinbutton_sscale), "var_type", "3"); g_signal_connect (GTK_OBJECT (post->spinbutton_sscale), "changed", G_CALLBACK (on_spinbutton_post_scale), post->spinbutton_sscale); /* *spinner for time scale "tscale" */ post->label_tscale = gtk_label_new ( _("time scale (ms): ")); gtk_widget_ref (post->label_tscale); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_label_tscale", post->label_tscale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->label_tscale); gtk_table_attach (GTK_TABLE (post->table_scale), post->label_tscale, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); /* * KEEP DISABLED */ /* spinbutton_adj_post_tscale = */ /* gtk_adjustment_new (gl_post_par.t_scale, 0, 1279, 1, 100, 100); */ /* * end of KEEP DISABLED */ post->spinbutton_tscale = gtk_spin_button_new (GTK_ADJUSTMENT (gpiv->imgh->spinbutton_adj_tscale), 1, 4); gtk_widget_ref (post->spinbutton_tscale); gtk_widget_show (post->spinbutton_tscale); gtk_table_attach (GTK_TABLE (post->table_scale), post->spinbutton_tscale, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (post->spinbutton_tscale), TRUE); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (post->spinbutton_tscale), TRUE); gtk_object_set_data (GTK_OBJECT (post->spinbutton_tscale), "post", post); gtk_object_set_data (GTK_OBJECT (post->spinbutton_tscale), "var_type", "4"); g_signal_connect (GTK_OBJECT (post->spinbutton_tscale), "changed", G_CALLBACK (on_spinbutton_post_scale), post->spinbutton_tscale); /* * spinner for column position */ post->label_colpos = gtk_label_new ( _("pos. of col #0 (m): ")); gtk_widget_ref (post->label_colpos); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_label_colpos", post->label_colpos, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->label_colpos); gtk_table_attach (GTK_TABLE (post->table_scale), post->label_colpos, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); /* * KEEP DISABLED */ /* spinbutton_adj_post_colpos = */ /* gtk_adjustment_new (gl_post_par.z_off_x, 0, Z_OFF_MAX, 1, 100, */ /* 100); */ /* * end of KEEP DISABLED */ post->spinbutton_colpos = gtk_spin_button_new (GTK_ADJUSTMENT (gpiv->imgh->spinbutton_adj_colpos), 1, 4); gtk_widget_ref (post->spinbutton_colpos); gtk_widget_show (post->spinbutton_colpos); gtk_table_attach (GTK_TABLE (post->table_scale), post->spinbutton_colpos, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (post->spinbutton_colpos), TRUE); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (post->spinbutton_colpos), TRUE); gtk_object_set_data (GTK_OBJECT (post->spinbutton_colpos), "post", post); gtk_object_set_data (GTK_OBJECT (post->spinbutton_colpos), "var_type", "1"); g_signal_connect (GTK_OBJECT (post->spinbutton_colpos), "changed", G_CALLBACK (on_spinbutton_post_scale), post->spinbutton_colpos); /* * spinner for row position */ post->label_rowpos = gtk_label_new ( _("pos. of row #0 (m): ")); gtk_widget_ref (post->label_rowpos); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_label_rowpos", post->label_rowpos, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->label_rowpos); gtk_table_attach (GTK_TABLE (post->table_scale), post->label_rowpos, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); /* * KEEP DISABLED */ /* spinbutton_adj_post_rowpos = */ /* gtk_adjustment_new (gl_post_par.z_off_y, 0, Z_OFF_MAX, 1, 100, */ /* 100); */ /* * end of KEEP DISABLED */ post->spinbutton_rowpos = gtk_spin_button_new (GTK_ADJUSTMENT (gpiv->imgh->spinbutton_adj_rowpos), 1, 4); gtk_widget_ref (post->spinbutton_rowpos); gtk_widget_show (post->spinbutton_rowpos); gtk_table_attach (GTK_TABLE (post->table_scale), post->spinbutton_rowpos, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (post->spinbutton_rowpos), TRUE); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (post->spinbutton_rowpos), TRUE); gtk_object_set_data (GTK_OBJECT (post->spinbutton_rowpos), "post", post); gtk_object_set_data (GTK_OBJECT (post->spinbutton_rowpos), "var_type", "2"); g_signal_connect (GTK_OBJECT (post->spinbutton_rowpos), "changed", G_CALLBACK (on_spinbutton_post_scale), post->spinbutton_rowpos); post->button_scale = gtk_button_new_with_label ( _("scale")); gtk_widget_ref (post->button_scale); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_button_scale", post->button_scale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->button_scale); gtk_table_attach (GTK_TABLE (post->table_scale), post->button_scale, 0, 2, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_tooltips_set_tip(gpiv->tooltips, post->button_scale, _("Calculates time and spatial scaled particle " "displacements (i.e. velocities) from a PIV displacement field, and their " "scaled positions"), NULL); gtk_object_set_data (GTK_OBJECT (post->button_scale), "post", post); g_signal_connect (GTK_OBJECT (post->button_scale), "enter", G_CALLBACK (on_button_post_scale_enter), NULL); g_signal_connect (GTK_OBJECT (post->button_scale), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (post->button_scale), "clicked", G_CALLBACK (on_button_post_scale), NULL); /* * Spatial average frame */ post->frame_savg = gtk_frame_new ( _("Offset / Spatial statistics")); gtk_widget_ref (post->frame_savg); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_frame_savg", post->frame_savg, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->frame_savg); gtk_table_attach (GTK_TABLE (post->table), post->frame_savg, 0, 1, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); post->table_savg = gtk_table_new (2, 4, FALSE); gtk_widget_ref (post->table_savg); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_table_savg", post->table_savg, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->table_savg); gtk_container_add (GTK_CONTAINER (post->frame_savg), post->table_savg); /* *spinner for spatial average horizontal velocity U-avg */ post->label_suavg = gtk_label_new ( _("dx (px), U (m/s): ")); gtk_widget_ref (post->label_suavg); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_label_suavg", post->label_suavg, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->label_suavg); gtk_table_attach (GTK_TABLE (post->table_savg), post->label_suavg, 0, 1, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); post->spinbutton_adj_suavg = /* ARG1: gl_post_par.s_savg */ /* gtk_adjustment_new (0. , */ /* 0, */ /* 1, */ /* 0.01, */ /* 0.1, */ /* 10.0); */ gtk_adjustment_new (0.0 , -100, 100, 0.01, 1.0, 10.0); post->spinbutton_suavg = gtk_spin_button_new (GTK_ADJUSTMENT (post->spinbutton_adj_suavg), 1, 4); gtk_widget_ref (post->spinbutton_suavg); gtk_widget_show (post->spinbutton_suavg); gtk_table_attach (GTK_TABLE (post->table_savg), post->spinbutton_suavg, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (post->spinbutton_suavg), TRUE); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (post->spinbutton_suavg), TRUE); /* * KEEP DISABLED */ gtk_object_set_data (GTK_OBJECT (post->spinbutton_suavg), "post", post); g_signal_connect (GTK_OBJECT (post->spinbutton_suavg), "changed", G_CALLBACK (on_spinbutton_post_suavg), post->spinbutton_suavg); /* * end of KEEP DISABLED */ /* * spinner for spatial average vertical velocity V-avg */ post->label_svavg = gtk_label_new ( _("dy (px), V (m/s): ")); gtk_widget_ref (post->label_svavg); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_label_svavg", post->label_svavg, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->label_svavg); gtk_table_attach (GTK_TABLE (post->table_savg), post->label_svavg, 0, 1, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); post->spinbutton_adj_svavg = /* ARG1: gl_post_par.s_savg */ gtk_adjustment_new (0.0 , -100, 100, 0.01, 1.0, 10.0); post->spinbutton_svavg = gtk_spin_button_new (GTK_ADJUSTMENT (post->spinbutton_adj_svavg), 1, 4); gtk_widget_ref (post->spinbutton_svavg); gtk_widget_show (post->spinbutton_svavg); gtk_table_attach (GTK_TABLE (post->table_savg), post->spinbutton_svavg, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (post->spinbutton_svavg), TRUE); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (post->spinbutton_svavg), TRUE); /* * KEEP DISABLED */ gtk_object_set_data (GTK_OBJECT (post->spinbutton_svavg), "post", post); g_signal_connect (GTK_OBJECT (post->spinbutton_svavg), "changed", G_CALLBACK (on_spinbutton_post_svavg), post->spinbutton_svavg); /* * end of KEEP DISABLED */ /* * button to calculate averages */ post->button_savg = gtk_button_new_with_label ( _("average")); gtk_widget_ref (post->button_savg); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_button_savg", post->button_savg, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->button_savg); gtk_table_attach (GTK_TABLE (post->table_savg), post->button_savg, 0, 1, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_tooltips_set_tip(gpiv->tooltips, post->button_savg, _("Calculates spatial average particle displacements " "or velocities from a velocity field, obtained from PIV data"), NULL); gtk_object_set_data (GTK_OBJECT (post->button_savg), "post", post); g_signal_connect (GTK_OBJECT (post->button_savg), "enter", G_CALLBACK (on_button_post_savg_enter), NULL); g_signal_connect (GTK_OBJECT (post->button_savg), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (post->button_savg), "clicked", G_CALLBACK (on_button_post_savg), NULL); /* * button to subtract averages or zero offset displacements / velocities */ post->button_subavg = gtk_button_new_with_label ( _("subtract")); gtk_widget_ref (post->button_subavg); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_button_subavg", post->button_subavg, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->button_subavg); gtk_table_attach (GTK_TABLE (post->table_savg), post->button_subavg, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_tooltips_set_tip(gpiv->tooltips, post->button_subavg, _("Subtracts the spatial averages or offset " "displacements / velocities, from each estimator"), NULL); gtk_object_set_data (GTK_OBJECT (post->button_subavg), "post", post); g_signal_connect (GTK_OBJECT (post->button_subavg), "enter", G_CALLBACK (on_button_post_subavg_enter), NULL); g_signal_connect (GTK_OBJECT (post->button_subavg), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (post->button_subavg), "clicked", G_CALLBACK (on_button_post_subavg), NULL); /* * Vorstra frame */ post->frame_vorstra = gtk_frame_new ( _("Vorticity & strain")); gtk_widget_ref (post->frame_vorstra); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_frame_vorstra", post->frame_vorstra, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->frame_vorstra); gtk_table_attach (GTK_TABLE (post->table), post->frame_vorstra, 1, 2, 0, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); post->vbox_vorstra = gtk_vbox_new (FALSE, 0); gtk_widget_ref (post->vbox_vorstra); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_vbox_vorstra", post->vbox_vorstra, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->vbox_vorstra); gtk_container_add (GTK_CONTAINER (post->frame_vorstra), post->vbox_vorstra); post->frame_vorstra_output = gtk_frame_new ( _("Output:")); gtk_widget_ref (post->frame_vorstra_output); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_frame_vorstra_output", post->frame_vorstra_output, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->frame_vorstra_output); gtk_box_pack_start (GTK_BOX (post->vbox_vorstra), post->frame_vorstra_output, TRUE, TRUE, 0); gtk_frame_set_shadow_type (GTK_FRAME (post->frame_vorstra_output), GTK_SHADOW_NONE); post->vbox_vorstra_output = gtk_vbox_new (FALSE, 0); gtk_widget_ref (post->vbox_vorstra_output); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_vbox_vorstra_output", post->vbox_vorstra_output, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->vbox_vorstra_output); gtk_container_add (GTK_CONTAINER (post->frame_vorstra_output), post->vbox_vorstra_output); post->radiobutton_vorstra_output_1 = gtk_radio_button_new_with_label (post->vbox_vorstra_output_group, _("Vorticity")); post->vbox_vorstra_output_group = gtk_radio_button_group (GTK_RADIO_BUTTON (post->radiobutton_vorstra_output_1)); gtk_widget_ref (post->radiobutton_vorstra_output_1); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_radiobutton_vorstra_output_1", post->radiobutton_vorstra_output_1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->radiobutton_vorstra_output_1); gtk_box_pack_start (GTK_BOX (post->vbox_vorstra_output), post->radiobutton_vorstra_output_1, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (post->radiobutton_vorstra_output_1), "post", post); gtk_object_set_data (GTK_OBJECT (post->radiobutton_vorstra_output_1), "operator", "0"); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_output_1), "enter", G_CALLBACK (on_radiobutton_post_vorstra_output_enter), NULL); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_output_1), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_output_1), "toggled", G_CALLBACK (on_radiobutton_post_vorstra_output), NULL); post->radiobutton_vorstra_output_2 = gtk_radio_button_new_with_label (post->vbox_vorstra_output_group, _("Shear strain")); post->vbox_vorstra_output_group = gtk_radio_button_group (GTK_RADIO_BUTTON (post->radiobutton_vorstra_output_2)); gtk_widget_ref (post->radiobutton_vorstra_output_2); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_radiobutton_vorstra_output_2", post->radiobutton_vorstra_output_2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->radiobutton_vorstra_output_2); gtk_box_pack_start (GTK_BOX (post->vbox_vorstra_output), post->radiobutton_vorstra_output_2, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (post->radiobutton_vorstra_output_2), "post", post); gtk_object_set_data (GTK_OBJECT (post->radiobutton_vorstra_output_2), "operator", "1"); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_output_2), "enter", G_CALLBACK (on_radiobutton_post_vorstra_output_enter), NULL); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_output_2), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_output_2), "toggled", G_CALLBACK (on_radiobutton_post_vorstra_output), NULL); post->radiobutton_vorstra_output_3 = gtk_radio_button_new_with_label (post->vbox_vorstra_output_group, _("Normal strain")); post->vbox_vorstra_output_group = gtk_radio_button_group (GTK_RADIO_BUTTON (post->radiobutton_vorstra_output_3)); gtk_widget_ref (post->radiobutton_vorstra_output_3); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_radiobutton_vorstra_output_3", post->radiobutton_vorstra_output_3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->radiobutton_vorstra_output_3); gtk_box_pack_start (GTK_BOX (post->vbox_vorstra_output), post->radiobutton_vorstra_output_3, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (post->radiobutton_vorstra_output_3), "post", post); gtk_object_set_data (GTK_OBJECT (post->radiobutton_vorstra_output_3), "operator", "2"); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_output_3), "enter", G_CALLBACK (on_radiobutton_post_vorstra_output_enter), NULL); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_output_3), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_output_3), "toggled", G_CALLBACK (on_radiobutton_post_vorstra_output), NULL); post->frame_vorstra_diffscheme = gtk_frame_new ( _("Differential scheme:")); gtk_widget_ref (post->frame_vorstra_diffscheme); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_frame_vorstra_diffscheme", post->frame_vorstra_diffscheme, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->frame_vorstra_diffscheme); gtk_box_pack_start (GTK_BOX (post->vbox_vorstra), post->frame_vorstra_diffscheme, TRUE, TRUE, 0); gtk_frame_set_shadow_type (GTK_FRAME (post->frame_vorstra_diffscheme), GTK_SHADOW_NONE); post->vbox_vorstra_diffscheme = gtk_vbox_new (FALSE, 0); gtk_widget_ref (post->vbox_vorstra_diffscheme); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_vbox_vorstra_diffscheme", post->vbox_vorstra_diffscheme, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->vbox_vorstra_diffscheme); gtk_container_add (GTK_CONTAINER (post->frame_vorstra_diffscheme), post->vbox_vorstra_diffscheme); post->radiobutton_vorstra_diffscheme_1 = gtk_radio_button_new_with_label (post->vbox_vorstra_diffscheme_group, _("Central")); post->vbox_vorstra_diffscheme_group = gtk_radio_button_group (GTK_RADIO_BUTTON (post->radiobutton_vorstra_diffscheme_1)); gtk_widget_ref (post->radiobutton_vorstra_diffscheme_1); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_radiobutton_vorstra_diffscheme_1", post->radiobutton_vorstra_diffscheme_1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->radiobutton_vorstra_diffscheme_1); gtk_box_pack_start (GTK_BOX (post->vbox_vorstra_diffscheme), post->radiobutton_vorstra_diffscheme_1, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_1), "post", post); gtk_object_set_data (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_1), "diff_type", "0"); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_1), "enter", G_CALLBACK (on_radiobutton_post_vorstra_diffscheme_enter), NULL); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_1), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_1), "toggled", G_CALLBACK (on_radiobutton_post_vorstra_diffscheme), NULL); post->radiobutton_vorstra_diffscheme_2 = gtk_radio_button_new_with_label (post->vbox_vorstra_diffscheme_group, _("Least squares")); post->vbox_vorstra_diffscheme_group = gtk_radio_button_group (GTK_RADIO_BUTTON (post->radiobutton_vorstra_diffscheme_2)); gtk_widget_ref (post->radiobutton_vorstra_diffscheme_2); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_radiobutton_vorstra_diffscheme_2", post->radiobutton_vorstra_diffscheme_2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->radiobutton_vorstra_diffscheme_2); gtk_box_pack_start (GTK_BOX (post->vbox_vorstra_diffscheme), post->radiobutton_vorstra_diffscheme_2, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_2), "post", post); gtk_object_set_data (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_2), "diff_type", "1"); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_2), "enter", G_CALLBACK (on_radiobutton_post_vorstra_diffscheme_enter), NULL); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_2), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_2), "toggled", G_CALLBACK (on_radiobutton_post_vorstra_diffscheme), NULL); post->radiobutton_vorstra_diffscheme_3 = gtk_radio_button_new_with_label (post->vbox_vorstra_diffscheme_group, _("Richardson")); post->vbox_vorstra_diffscheme_group = gtk_radio_button_group (GTK_RADIO_BUTTON (post->radiobutton_vorstra_diffscheme_3)); gtk_widget_ref (post->radiobutton_vorstra_diffscheme_3); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_radiobutton_vorstra_diffscheme_3", post->radiobutton_vorstra_diffscheme_3, (GtkDestroyNotify) gtk_widget_unref); /* *Define which button is switched on at start up time */ if (gl_post_par->diff_type == 2) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (post->radiobutton_vorstra_diffscheme_3), TRUE); } gtk_widget_show (post->radiobutton_vorstra_diffscheme_3); gtk_box_pack_start (GTK_BOX (post->vbox_vorstra_diffscheme), post->radiobutton_vorstra_diffscheme_3, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_3), "post", post); gtk_object_set_data (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_3), "diff_type", "2"); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_3), "enter", G_CALLBACK (on_radiobutton_post_vorstra_diffscheme_enter), NULL); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_3), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_3), "toggled", G_CALLBACK (on_radiobutton_post_vorstra_diffscheme), NULL); post->radiobutton_vorstra_diffscheme_4 = gtk_radio_button_new_with_label (post->vbox_vorstra_diffscheme_group, _("Circulation method")); post->vbox_vorstra_diffscheme_group = gtk_radio_button_group (GTK_RADIO_BUTTON (post->radiobutton_vorstra_diffscheme_4)); gtk_widget_ref (post->radiobutton_vorstra_diffscheme_4); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_radiobutton_vorstra_diffscheme_4", post->radiobutton_vorstra_diffscheme_4, (GtkDestroyNotify) gtk_widget_unref); /* *Define which button is switched on at start up time */ if (gl_post_par->diff_type == 3) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (post->radiobutton_vorstra_diffscheme_4), TRUE); } gtk_widget_show (post->radiobutton_vorstra_diffscheme_4); gtk_box_pack_start (GTK_BOX (post->vbox_vorstra_diffscheme), post->radiobutton_vorstra_diffscheme_4, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_4), "post", post); gtk_object_set_data (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_4), "diff_type", "3"); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_4), "enter", G_CALLBACK (on_radiobutton_post_vorstra_diffscheme_enter), NULL); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_4), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (post->radiobutton_vorstra_diffscheme_4), "toggled", G_CALLBACK (on_radiobutton_post_vorstra_diffscheme), NULL); /* * Define which button is switched on at start up time; moved to the * end of the tabulator as diff_scheme button Circulation might be * enabled or disabled */ if (gl_post_par->operator_vorstra == 0) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (post->radiobutton_vorstra_output_1), TRUE); } else if (gl_post_par->operator_vorstra == 1) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (post->radiobutton_vorstra_output_2), TRUE); } else if (gl_post_par->operator_vorstra == 2) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (post->radiobutton_vorstra_output_3), TRUE); } if (gl_post_par->diff_type == 0) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (post->radiobutton_vorstra_diffscheme_1), TRUE); } if (gl_post_par->diff_type == 1) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (post->radiobutton_vorstra_diffscheme_2), TRUE); } else if (gl_post_par->diff_type == 2) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (post->radiobutton_vorstra_diffscheme_3), TRUE); } post->button_vorstra = gtk_button_new_with_label ( _("vorticity")); gtk_widget_ref (post->button_vorstra); gtk_object_set_data_full (GTK_OBJECT (main_window), "post_button_vorstra", post->button_vorstra, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (post->button_vorstra); gtk_box_pack_start (GTK_BOX (post->vbox_vorstra), post->button_vorstra, FALSE, FALSE, 0); gtk_tooltips_set_tip(gpiv->tooltips, post->button_vorstra, _("Calculates vorticity or strain magnitudes from a velocity field, obtained by PIV"), NULL); gtk_object_set_data (GTK_OBJECT (post->button_vorstra), "post", post); g_signal_connect (GTK_OBJECT (post->button_vorstra), "enter", G_CALLBACK (on_button_post_vorstra_enter), NULL); g_signal_connect (GTK_OBJECT (post->button_vorstra), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (post->button_vorstra), "clicked", G_CALLBACK (on_button_post_vorstra), NULL); return post; } gpiv-0.6.1/src/pivpost_interface.h0000644000175000017500000000725411110306470014071 00000000000000/*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * PIV post processing * $Log: pivpost_interface.h,v $ * Revision 1.6 2007-11-23 16:24:08 gerber * release 0.5.0: Kafka * * Revision 1.5 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.4 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.3 2005/01/19 15:53:42 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.2 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef GPIV_PIVPOST_INTERFACE_H #define GPIV_PIVPOST_INTERFACE_H typedef struct _PivPost PivPost; struct _PivPost { GtkWidget *vbox_label; GtkWidget *label_title; GtkWidget *vbox_scroll; GtkWidget *scrolledwindow; GtkWidget *viewport; GtkWidget *table; GtkWidget *frame_scale; GtkWidget *table_scale; GtkWidget *label_sscale; /* GtkObject *spinbutton_adj_sscale; */ GtkWidget *spinbutton_sscale; GtkWidget *label_tscale; /* GtkObject *spinbutton_adj_tscale; */ GtkWidget *spinbutton_tscale; GtkWidget *label_colpos; /* GtkObject *spinbutton_adj_colpos; */ GtkWidget *spinbutton_colpos; GtkWidget *label_rowpos; /* GtkObject *spinbutton_adj_rowpos; */ GtkWidget *spinbutton_rowpos; GtkWidget *button_scale; GtkWidget *frame_savg; GtkWidget *table_savg; GtkWidget *label_suavg; GtkObject *spinbutton_adj_suavg; GtkWidget *spinbutton_suavg; GtkWidget *label_svavg; GtkObject *spinbutton_adj_svavg; GtkWidget *spinbutton_svavg; GtkWidget *button_savg; GtkWidget *button_subavg; GtkWidget *frame_vorstra; GtkWidget *vbox_vorstra; GtkWidget *frame_vorstra_output; GtkWidget *vbox_vorstra_output; GSList *vbox_vorstra_output_group; GtkWidget *radiobutton_vorstra_output_1; GtkWidget *radiobutton_vorstra_output_2; GtkWidget *radiobutton_vorstra_output_3; GtkWidget *frame_vorstra_diffscheme; GtkWidget *vbox_vorstra_diffscheme; GSList *vbox_vorstra_diffscheme_group/* = NULL */; GtkWidget *radiobutton_vorstra_diffscheme_1; GtkWidget *radiobutton_vorstra_diffscheme_2; GtkWidget *radiobutton_vorstra_diffscheme_3; GtkWidget *radiobutton_vorstra_diffscheme_4; GtkWidget *button_vorstra; }; PivPost * create_pivpost (GnomeApp *main_window, GtkWidget *container); #endif /* GPIV_PIVPOST_INTERFACE_H */ gpiv-0.6.1/src/dac_trig.c0000644000175000017500000001460711110306141012107 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * Dac callbacks * $Id: dac_trig.c,v 1.1 2006-09-18 07:29:51 gerber Exp $ */ #ifdef ENABLE_TRIG #include "gpiv_gui.h" #include "console.h" #include "dac_trig.h" /* #include */ /* #include */ /* #include */ /* * BUGFIX: Put somwhere to update on regular basis: gtk_label_set_text(GTK_LABEL(gpiv->dac->label_temp), "Temp"); */ static int init, start, stop, error; /* * Prototypes of local functions */ /* * Global functions */ void exec_trigger_start (void ) /*----------------------------------------------------------------------------- */ { gchar *err_msg = NULL; int on = 1, param_ok; g_message("exec_trigger_start: 0"); if (!gpiv_trig_openrtfs(&init, &start, &stop, &error)) { err_msg = _("Fail in fifo open"); warning_gpiv(err_msg); return; } g_message("exec_trigger_start: 1"); gpiv_trig_test_parameter(&trig_par); /* * write the timing details to /dev/rtf/1 */ g_message("exec_trigger_start: 2"); if((write(init, &trig_par.ttime, sizeof(GpivTrigTime))) < 0) { err_msg = _("Fail in setting camera and Laser timing"); warning_gpiv(err_msg); return; } g_message("exec_trigger_start: 3"); if((read(error, ¶m_ok, sizeof(int))) < 0) { err_msg = _("Fail in receipt of confirmation"); warning_gpiv(err_msg); return; } g_message("exec_trigger_start: 4"); if (param_ok != 1) { warning_gpiv("Invalid parameters entered \n"); } else { if (verbose) g_message (_("Parameters: \n\ cam_acq_period: %lld \n\ laser_trig_pw: %lld \n\ time2laser: %lld \n\ dt: %lld \n\ mode: %d \n\ cycles: %d \n\ increment: %d\n"), trig_par.ttime.cam_acq_period, trig_par.ttime.laser_trig_pw, trig_par.ttime.time2laser, trig_par.ttime.dt, trig_par.ttime.mode, trig_par.ttime.cycles, (int) trig_par.ttime.increment); g_message("exec_trigger_start: 5"); if((write(start, &on, sizeof(int))) < 0) { err_msg = _("Fail in starting camera and Laser timing"); warning_gpiv(err_msg); return; } } g_message("exec_trigger_start: 6"); /* gpiv_par.process_trig = TRUE; */ } void exec_trigger_stop (void ) /*----------------------------------------------------------------------------- */ { gchar *err_msg = NULL; int off = 0; if((write(stop, &off, sizeof(int))) < 0) { err_msg = _("Fail stopping camera and Laser timing"); warning_gpiv(err_msg); return; } /* gpiv_par.process_trig = FALSE; */ } /* * Callback functions */ void on_spinbutton_dac_trigger_dt(GtkSpinButton * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { gfloat val = gtk_spin_button_get_value_as_float(widget); trig_par.ttime.dt = (RTIME) (GPIV_MILI2NANO * val); } void on_spinbutton_dac_trigger_incrdt(GtkSpinButton * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { gfloat val = gtk_spin_button_get_value_as_float(widget); trig_par.ttime.increment = (RTIME) (GPIV_MILI2NANO * val); } void on_spinbutton_dac_trigger_cap(GtkSpinButton * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { gfloat val = gtk_spin_button_get_value_as_float(widget); trig_par.ttime.cam_acq_period = (RTIME) (GPIV_MILI2NANO * val); } void on_button_dac_triggerstart_enter(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gchar *msg = _("Uploads and Starts timings to kernel module"); gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); } void on_button_dac_triggerstart(GtkWidget * widget, gpointer data ) /* ---------------------------------------------------------------------------- */ { /* gchar *msg = */ /* warning_gpiv(msg); */ cancel_process = FALSE; exec_trigger_start(); } void on_button_dac_triggerstop_enter(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gchar *msg = _("Stops timings"); gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); } void on_button_dac_triggerstop(GtkWidget * widget, gpointer data ) /* ---------------------------------------------------------------------------- */ { /* gchar *msg = */ /* warning_gpiv(msg); */ cancel_process = TRUE; exec_trigger_stop(); } #endif /* ENABLE_TRIG */ gpiv-0.6.1/src/dac_trig.h0000644000175000017500000000423411110307253012114 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * Dac callbacks * $Id: dac_trig.h,v 1.2 2007-03-22 16:00:32 gerber Exp $ */ #ifndef DAC_TRIG_H #define DAC_TRIG_H #ifdef ENABLE_TRIG /* * Global functions */ void exec_trigger_start (void ); void exec_trigger_stop (void ); /* * Callback functions */ void on_spinbutton_dac_trigger_dt(GtkSpinButton * widget, GtkWidget * entry); void on_spinbutton_dac_trigger_incrdt(GtkSpinButton * widget, GtkWidget * entry); void on_spinbutton_dac_trigger_cap(GtkSpinButton * widget, GtkWidget * entry); void on_button_dac_triggerstart_enter(GtkWidget *widget, gpointer data); void on_button_dac_triggerstart(GtkWidget *widget, gpointer data); void on_button_dac_triggerstop_enter(GtkWidget *widget, gpointer data); void on_button_dac_triggerstop(GtkWidget *widget, gpointer data); #endif /* ENABLE_TRIG */ #endif /* DAC_TRIG_H */ gpiv-0.6.1/src/piveval.c0000644000175000017500000015222611110305624012006 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * (callback) functions for Piv evaluation window/tabulator * $Log: piveval.c,v $ * Revision 1.23 2008-04-28 12:00:57 gerber * hdf-formatted files are now with .hdf extension (previously: .gpi) * * Revision 1.22 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.21 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.20 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.19 2007-02-16 17:09:48 gerber * added Gauss weighting on I.A. and SPOF filtering (on correlation function) * * Revision 1.18 2007/02/05 15:17:09 gerber * auto stretching, broadcast display settings to buffers from preferences * * Revision 1.17 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.16 2006-09-18 07:27:06 gerber * *** empty log message *** * * Revision 1.15 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.13 2005/02/26 09:43:30 gerber * parameter flags (parameter_logic) defined as gboolean * * Revision 1.12 2005/02/26 09:17:14 gerber * structured of interrogate function by using gpiv_piv_isiadapt * * Revision 1.11 2005/01/19 15:53:42 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.10 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.9 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.8 2003/09/01 11:17:15 gerber * improved monitoring of interrogation process * * Revision 1.7 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.6 2003/07/13 14:38:18 gerber * changed error handling of libgpiv * * Revision 1.5 2003/07/12 21:21:16 gerber * changed error handling libgpiv * * Revision 1.3 2003/07/10 11:56:07 gerber * added man page * * Revision 1.2 2003/06/27 13:47:26 gerber * display ruler, line/point evaluation * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #include "gpiv_gui.h" #include "utils.h" #include "piveval.h" #include "piveval_interrogate.h" #include "display.h" /* * Private piv evaluation functions */ static void display_img (float **img, gint int_size, gint *int_size_old, gint i_min, gint i_max, gint j_min, gint j_max, gint rgb_width, guchar **rgbbuf, GtkWidget *canvas, GnomeCanvasItem **gci, double affine[6], gboolean scale ) /* ---------------------------------------------------------------------------- * Displaying routine in gnome canvas */ { guchar *pos; gint i, j; float min = 1000.0, max = -1000.0; GdkPixbuf *pixbuf = NULL; guint16 fact = 1; gint depth = 8; assert (img[0] != NULL); fact = fact << (gl_image_par->depth - depth); /* g_message ("DISPLAY_IMG:: fact = %d", fact); */ if (*rgbbuf != NULL) { g_free(*rgbbuf); *rgbbuf = NULL; } if (*rgbbuf == NULL) { /* * row stride; each row is a 4-byte buffer array */ rgb_width = (i_max - i_min) * 3; while ((rgb_width) % 4 != 0) { rgb_width++; } *rgbbuf = g_malloc (rgb_width * 3 * (j_max - j_min)); } if (*gci != NULL) { gtk_object_destroy (GTK_OBJECT(*gci)); *gci = NULL; } pixbuf = gdk_pixbuf_new_from_data (*rgbbuf, GDK_COLORSPACE_RGB, FALSE, depth, i_max - i_min, j_max - j_min, rgb_width, NULL, NULL); *gci = gnome_canvas_item_new (gnome_canvas_root( GNOME_CANVAS (canvas)), gnome_canvas_pixbuf_get_type (), "pixbuf", pixbuf, NULL); /* BUGFIX: new (check mem) */ /* gdk_pixbuf_unref (pixbuf); */ affine[4] = (GPIV_MAX_INTERR_SIZE - gpiv_var->piv_disproc_zoom * int_size) / 2.0; affine[5] = (GPIV_MAX_INTERR_SIZE - gpiv_var->piv_disproc_zoom * int_size) / 2.0; gnome_canvas_item_affine_absolute (*gci, affine); /* * As the mean has been subtracted from the image data, image intensities * will have to be tilted above zero */ if (scale) { for (j = j_min; j < j_max; j++) { for (i = i_min; i < i_max; i++) { if (img[j][i] < min) min = img[j][i]; if (img[j][i] > max) max = img[j][i]; } } pos = *rgbbuf; for (j = j_min; j < j_max; j++) { for (i = i_min; i < i_max; i++) { img[j][i] -= min; img[j][i] = (255.0 / (max - min)) * img[j][i]; *pos++ = (unsigned char) img[j][i]; *pos++ = (unsigned char) img[j][i]; *pos++ = (unsigned char) img[j][i]; } *pos = *pos++; *pos = *pos++; *pos = *pos++; } } else { for (j = j_min; j < j_max; j++) { for (i = i_min; i < i_max; i++) { if (img[j][i] < min) min = img[j][i]; } } /* if ( min < display_act->img.img_mean) */ /* display_act->img.img_mean = min; */ pos = *rgbbuf; for (j = j_min; j < j_max; j++) { for (i = i_min; i < i_max; i++) { /* *pos++ = (unsigned char) img[j][i] - (unsigned char) min */ /* + (unsigned char) display_act->img.img_mean; */ /* *pos++ = (unsigned char) img[j][i] - (unsigned char) min */ /* + (unsigned char) display_act->img.img_mean; */ /* *pos++ = (unsigned char) img[j][i] - (unsigned char) min */ /* + (unsigned char) display_act->img.img_mean; */ /* * BUGFIX: display image intars with: 8 < depth < 16 * 6 March 2004 */ *pos++ = (guchar) ((img[j][i] - /* (guchar) */ min + /* (guchar) */ display_act->img->img_mean) / fact); *pos++ = (guchar) ((img[j][i] - /* (guchar) */ min + /* (guchar) */ display_act->img->img_mean) / fact); *pos++ = (guchar) ((img[j][i] - /* (guchar) */ min + /* (guchar) */ display_act->img->img_mean) / fact); } } } gdk_pixbuf_unref (pixbuf); *int_size_old = int_size; /* g_free(rgbbuf); */ /* rgbbuf = NULL; */ } static void alloc_bufmem_per_intarea (int index_y, int index_x, PivData *pida, GpivImagePar image_par, int int_size_0 ) /* ---------------------------------------------------------------------------- * Memory allocation of covariance in a packed interrogation area array */ { } static void free_bufmem_per_intarea (int index_y, int index_x, PivData *pida, GpivImagePar image_par, int int_size_0 ) /*----------------------------------------------------------------------------- */ { } static void adjust_radio_button_intsize_f (GpivPivPar *piv_par, PivEval *eval ) /* ---------------------------------------------------------------------------- * Adjust radio button interrogation size 1 in PIV interrogation tab */ { if (piv_par->int_size_f == 16) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_f_2), TRUE); } else if (piv_par->int_size_f == 32) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_f_3), TRUE); } else if (piv_par->int_size_f == 64) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_f_4), TRUE); } else if (piv_par->int_size_f == 128) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_f_5), TRUE); } } static void adjust_radio_button_intsize_i (GpivPivPar *piv_par, PivEval *eval ) /* ---------------------------------------------------------------------------- * Adjust radio button interrogation size 1 in PIV interrogation tab */ { if (piv_par->int_size_i == 16) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_i_2), TRUE); } else if (piv_par->int_size_i == 32) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_i_3), TRUE); } else if (piv_par->int_size_i == 64) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_i_4), TRUE); } else if (piv_par->int_size_i == 128) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_i_5), TRUE); } } static void adjust_radio_button_intshift (GpivPivPar *piv_par, PivEval *eval) /* ---------------------------------------------------------------------------- * Adjust radio button interrogation area shift in PIV interrogation tab */ { if (piv_par->int_shift == 8) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intshift_1), TRUE); } else if (piv_par->int_shift == 16) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intshift_2), TRUE); } else if (piv_par->int_shift == 32) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intshift_3), TRUE); } else if (piv_par->int_shift == 64) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intshift_4), TRUE); } else if (piv_par->int_shift == 128) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intshift_5), TRUE); } } /* * Display functions in PIV tabulator canvas */ void display_piv_vector (guint i, guint j, GpivPivData *piv_data, PivEval *eval ) /* ---------------------------------------------------------------------------- * Displays values in PIV tabulator of the GUI */ { /* float **dx = piv_data->dx, **dy = piv_data->dy; */ /* int **peak_no = piv_data->peak_no; */ GnomeCanvasPoints *points; float dl = sqrt (piv_data->dx[i][j] * piv_data->dx[i][j] + piv_data->dy[i][j] * piv_data->dy[i][j]); gchar *color; points = gnome_canvas_points_new (2); eval->monitor->pi_da->dx[0][0] = piv_data->dx[i][j]; eval->monitor->pi_da->dy[0][0] = piv_data->dy[i][j]; eval->monitor->pi_da->peak_no[0][0] = piv_data->peak_no[i][j]; if (eval->monitor->pi_da->peak_no[0][0] == -1) { color="red"; } else if (eval->monitor->pi_da->peak_no[0][0] == 0) { color="lightblue"; } else if (eval->monitor->pi_da->peak_no[0][0] == 1) { color="green"; } else if (eval->monitor->pi_da->peak_no[0][0] == 2) { color="yellow"; } else { /* if (eval->monitor->pi_da->peak_no[i][j] == 3) */ color="gray"; } points->coords[0] = GPIV_MAX_INTERR_SIZE / 2; points->coords[1] = GPIV_MAX_INTERR_SIZE / 2; points->coords[2] = GPIV_MAX_INTERR_SIZE / 2 + eval->monitor->pi_da->dx[0][0] * gpiv_var->piv_disproc_vlength; points->coords[3] = GPIV_MAX_INTERR_SIZE / 2 + eval->monitor->pi_da->dy[0][0] * gpiv_var->piv_disproc_vlength; if (eval->monitor->gci_vec != NULL) { gnome_canvas_item_set (eval->monitor->gci_vec, "points", points, "fill_color", color, "width_units", (double) THICKNESS, "first_arrowhead", FALSE, "last_arrowhead", TRUE, "arrow_shape_a", (double) ARROW_LENGTH * ARROW_FACT *dl * gpiv_par->display__vector_scale + ARROW_ADD, "arrow_shape_b", (double) ARROW_EDGE * ARROW_FACT * dl * gpiv_par->display__vector_scale + ARROW_ADD, "arrow_shape_c", (double) ARROW_WIDTH * ARROW_FACT * dl * gpiv_par->display__vector_scale + ARROW_ADD, NULL); } else { eval->monitor->gci_vec = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS(eval->canvas_monitor_vec)), gnome_canvas_line_get_type(), "points", points, "fill_color", color, "width_units",(double) THICKNESS, "first_arrowhead", TRUE, "arrow_shape_a", (double) ARROW_LENGTH * ARROW_FACT *dl * gpiv_par->display__vector_scale + ARROW_ADD, "arrow_shape_b", (double) ARROW_EDGE * ARROW_FACT * dl * gpiv_par->display__vector_scale + ARROW_ADD, "arrow_shape_c", (double) ARROW_WIDTH * ARROW_FACT * dl * gpiv_par->display__vector_scale + ARROW_ADD, /* "arrow_shape_a", (double) THICKNESS, */ NULL); } gnome_canvas_points_free (points); } void display_img_intreg1 (float **intreg1, guint int_size, PivEval *eval ) /* ---------------------------------------------------------------------------- * Displays image of intreg1 for drawing area * row stride; each row is a 4-byte buffer array */ { display_img (intreg1, int_size, &eval->monitor->int_size_old, 0, int_size, 0, int_size, eval->monitor->rgb_int_width, &eval->monitor->rgbbuf_int1, eval->canvas_monitor_int1, &eval->monitor->gci_int1, eval->monitor->affine, FALSE); } void display_img_intreg2 (float **intreg2, guint int_size, PivEval *eval ) /* ---------------------------------------------------------------------------- * Displays image of intreg2 for drawing area */ { display_img (intreg2, int_size, &eval->monitor->int_size_old, 0, int_size, 0, int_size, eval->monitor->rgb_int_width, &eval->monitor->rgbbuf_int2, eval->canvas_monitor_int2, &eval->monitor->gci_int2, eval->monitor->affine, FALSE); } void display_img_cov (GpivCov *cov, guint int_size, PivEval *eval ) /* ---------------------------------------------------------------------------- * Displays image of intreg1 for drawing area */ { display_img (cov->z, int_size, &eval->monitor->cov_size_old, cov->z_cl, cov->z_ch, cov->z_rl, cov->z_rh, eval->monitor->rgb_cov_width, &eval->monitor->rgbbuf_cov, eval->canvas_monitor_cov, &eval->monitor->gci_cov, eval->monitor->affine, TRUE); } /* * Piv evaluation window/tabulator callbacks */ void on_radiobutton_piv_mouse (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); m_select = atoi(gtk_object_get_data(GTK_OBJECT(widget), "mouse_select")); /* g_message ("on_radiobutton_piv_mouse:: 0 m_select = %d", m_select); */ if (m_select == NO_MS) { gl_piv_par->int_geo = GPIV_AOI; } else if (m_select == AOI_MS) { gl_piv_par->int_geo = GPIV_AOI; } else if (m_select == SINGLE_POINT_MS) { gl_piv_par->int_geo = GPIV_POINT; } else if (m_select == V_LINE_MS) { /* gl_piv_par->int_geo = GPIV_LINE_C; */ gl_piv_par->int_geo = GPIV_AOI; } else if (m_select == H_LINE_MS) { /* gl_piv_par->int_geo = GPIV_LINE_R; */ gl_piv_par->int_geo = GPIV_AOI; } else if (m_select == SINGLE_AREA_MS || m_select == DRAG_MS) { gl_piv_par->int_geo = GPIV_POINT; } /* * (Re)setting interrogation scheme if necessary */ if ((m_select == SINGLE_AREA_MS || m_select == DRAG_MS || m_select == SINGLE_POINT_MS || m_select == V_LINE_MS || m_select == H_LINE_MS) && gl_piv_par->int_scheme == GPIV_IMG_DEFORM ) { char message[2 * GPIV_MAX_CHARS]; g_snprintf (message, 2 * GPIV_MAX_CHARS, _("Image deformation is impossibe with this Mouse select.\n\ Setting Interrogation scheme to Central difference.\n\ This will be reset automatically after interrogating.")); warning_gpiv (message); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (gpiv->piveval->radiobutton_centraldiff), TRUE); int_scheme_autochanged = TRUE; } else { if (int_scheme_autochanged) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (gpiv->piveval->radiobutton_imgdeform), TRUE); int_scheme_autochanged = FALSE; } } } void on_radiobutton_piv_mouse1_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT(widget), "gpiv"); gchar *msg = _("No mouse activity within displayer"); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), msg); } void on_radiobutton_piv_mouse2_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Selects an area within the image to be analyzed"); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), msg); } void on_radiobutton_piv_mouse3_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT(widget), "gpiv"); gchar *msg = _("Piv evaluation at a single interrogation area. " "Conserves other existing data"); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), msg); } void on_radiobutton_piv_mouse4_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT(widget), "gpiv"); gchar *msg = _("Piv evaluation at a single point in the image. " "Rejects all existing data!!"); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), msg); } void on_radiobutton_piv_mouse5_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT(widget), "gpiv"); gchar *msg = _("Displaces a single interrogation area and analyzes"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_radiobutton_piv_mouse6_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT(widget), "gpiv"); gchar *msg = _("Evaluation at a vertical line. "); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), msg); } void on_radiobutton_piv_mouse7_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT(widget), "gpiv"); gchar *msg = _("Evaluation at a horizontal line. "); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), msg); } void on_spinbutton_piv_int (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { char *err_msg = NULL; PivEval *eval = gtk_object_get_data(GTK_OBJECT (widget), "eval"); guint nx = 0, ny = 0; guint nx_img = 0, ny_img = 0; gboolean renew = TRUE, lo_display_intregs = FALSE; enum VariableType { COL_START = 0, COL_END = 1, PRESHIFT_COL = 2, ROWSTART = 3, ROWEND = 4, PRESHIFT_ROW = 5, INT_SIZE_F = 6, INT_SIZE_I = 7, INT_SHIFT = 8 } var_type; /* eval = gtk_object_get_data(GTK_OBJECT(widget), "eval"); */ /* * Locale vars */ /* Display display_act; */ /* display_act = gtk_object_get_data(widget, display_act); */ /* * Select which variable has to be modified */ setby_spinbutton = 1; var_type = atoi(gtk_object_get_data (GTK_OBJECT (widget), "var_type")); if (var_type == COL_START) { gl_piv_par->col_start = gtk_spin_button_get_value_as_int (widget); } else if (var_type == COL_END) { gl_piv_par->col_end = gtk_spin_button_get_value_as_int (widget); } else if (var_type == PRESHIFT_COL) { gl_piv_par->pre_shift_col = gtk_spin_button_get_value_as_int (widget); } else if (var_type == ROWSTART) { gl_piv_par->row_start = gtk_spin_button_get_value_as_int (widget); } else if (var_type == ROWEND) { gl_piv_par->row_end = gtk_spin_button_get_value_as_int (widget); } else if (var_type == PRESHIFT_ROW) { gl_piv_par->pre_shift_row = gtk_spin_button_get_value_as_int (widget); } else if (var_type == INT_SIZE_F) { gl_piv_par->int_size_f = gtk_spin_button_get_value_as_int (widget); /* * Adapt spinbutton of int_size_i */ GTK_ADJUSTMENT(eval->spinbutton_adj_intsize_i)->lower = (gfloat) gl_piv_par->int_size_f; GTK_ADJUSTMENT(eval->spinbutton_adj_intsize_i)->upper = (gfloat) 128.0; gtk_adjustment_changed (GTK_ADJUSTMENT(eval->spinbutton_adj_intsize_i)); gtk_adjustment_set_value (GTK_ADJUSTMENT(eval->spinbutton_adj_intsize_i), (gfloat) gl_piv_par->int_size_f); /* * Adjust radio buttons for final interrogation size */ adjust_radio_button_intsize_f (gl_piv_par, eval); } else if (var_type == INT_SIZE_I) { char message[GPIV_MAX_CHARS]; gl_piv_par->int_size_i = gtk_spin_button_get_value_as_int (widget); if ((gl_piv_par->int_scheme == GPIV_NO_CORR || gl_piv_par->int_scheme == GPIV_LK_WEIGHT) && gl_piv_par->int_size_i > gl_piv_par->int_size_f) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_imgdeform), TRUE); g_snprintf (message, GPIV_MAX_CHARS, _("Int Size 2 > Int Size 1 \nSetting Interrogation scheme to Image deformation")); warning_gpiv(message); /* } else { */ /* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON */ /* (eval->radiobutton_zerooff), */ /* FALSE); */ } /* * Adjust radio buttons for initial interrogation size */ adjust_radio_button_intsize_i (gl_piv_par, eval); } else if (var_type == INT_SHIFT) { gl_piv_par->int_shift = gtk_spin_button_get_value_as_int (widget); /* * Adjust radio buttons for interrogation area shift */ adjust_radio_button_intshift (gl_piv_par, eval); } /* * Update eventually interrogation region contours. */ if (display_act != NULL) { if ((err_msg = gpiv_piv_testadjust_parameters (display_act->img->image->header, gl_piv_par)) != NULL) { warning_gpiv ("%s", err_msg); return; } display_act->intreg->par->row_start = gl_piv_par->row_start; display_act->intreg->par->row_end = gl_piv_par->row_end; display_act->intreg->par->col_start = gl_piv_par->col_start; display_act->intreg->par->col_end = gl_piv_par->col_end; display_act->intreg->par->int_shift = gl_piv_par->int_shift; display_act->intreg->par->int_size_f = gl_piv_par->int_size_f; display_act->intreg->par->int_size_i = gl_piv_par->int_size_i; display_act->intreg->par->pre_shift_row = gl_piv_par->pre_shift_row; display_act->intreg->par->pre_shift_col = gl_piv_par->pre_shift_col; display_act->intreg->par->row_start__set = TRUE; display_act->intreg->par->row_end__set = TRUE; display_act->intreg->par->col_start__set = TRUE; display_act->intreg->par->col_end__set = TRUE; display_act->intreg->par->int_size_f__set = TRUE; display_act->intreg->par->int_size_i__set = TRUE; display_act->intreg->par->int_shift__set = TRUE; display_act->intreg->par->pre_shift_row__set = TRUE; display_act->intreg->par->pre_shift_col__set = TRUE; if (display_act->intreg->exist_int) { nx = display_act->intreg->data->nx; ny = display_act->intreg->data->ny; if ((err_msg = gpiv_piv_count_pivdata_fromimage (display_act->img->image->header, display_act->intreg->par, &nx_img, &ny_img)) != NULL) { warning_gpiv ("on_spinbutton_piv_int: %s", err_msg); g_warning ("on_spinbutton_piv_int: %s", err_msg); return; } /* * For some operations the intregs have to be renewed unconditionally, * for others only in case if the number of intregs has been changed */ if (var_type == COL_START || var_type == COL_END || var_type == ROWSTART || var_type == ROWEND) { if (nx == nx_img && ny == ny_img) { renew = FALSE; } else { renew = TRUE; } } if (renew) { lo_display_intregs = display_act->display_intregs; destroy_all_intregs (display_act); create_all_intregs (display_act); display_act->display_intregs = lo_display_intregs; if (display_act->display_intregs) show_all_intregs(display_act); } } } setby_spinbutton = 0; } void on_radiobutton_piv_int (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { gint int_size_f_tmp; gboolean lo_display_intregs = FALSE; gint nx_tmp = 0, ny_tmp = 0; /* gint setby_spinbutton = atoi(gtk_object_get_data(GTK_OBJECT(widget), */ /* "setby_spinbutton")); */ PivEval *eval = gtk_object_get_data(GTK_OBJECT (widget), "eval"); Display *disp = display_act; int nx, ny; enum VariableType { SIZE_F = 0, SIZE_I = 1, SHIFT = 2 } var_type; if (disp != NULL && disp->intreg->exist_int) { nx = disp->intreg->data->nx; ny = disp->intreg->data->ny; } else { nx = 0; ny = 0; } if (GTK_TOGGLE_BUTTON(widget)->active) { var_type = atoi(gtk_object_get_data (GTK_OBJECT(widget), "var_type")); /* * Select which variable has to be modified */ if (var_type == SIZE_F) { int_size_f_tmp = gl_piv_par->int_size_f; gl_piv_par->int_size_f = atoi (gtk_object_get_data (GTK_OBJECT(widget), "intsize_f")); /* * switch off temporarly display_intregs */ if (disp != NULL) { lo_display_intregs = disp->display_intregs; disp->display_intregs = FALSE; } nx_tmp = nx; ny_tmp = ny; adjust_radiobutton_piv_int (eval, gl_piv_par->int_size_f); /* * return display_intregs to original value */ if (disp != NULL) { disp->display_intregs = lo_display_intregs; } nx = nx_tmp; ny = ny_tmp; /* * BUGFIX: REMOVE Reset weight and zero_off */ if (gl_piv_par->int_size_i > int_size_f_tmp) { /* gtk_widget_set_sensitive(eval->radiobutton_zerooff, TRUE); */ /* gtk_widget_set_sensitive(checkbutton_piv_weightkernel, TRUE); */ /* if (int_scheme_tmp != GPIV_ZERO_OFF_FORWARD && int_scheme_tmp != GPIV_ZERO_OFF_CENTRAL) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (eval->radiobutton_zerooff), FALSE); gtk_widget_set_sensitive(eval->radiobutton_zerooff, TRUE); gtk_widget_set_sensitive(eval->radiobutton_weightkernel, TRUE); if (int_scheme_tmp == GPIV_LK_WEIGHT) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (eval->radiobutton_weightkernel), FALSE); gtk_widget_set_sensitive(eval->radiobutton_zerooff, TRUE); gtk_widget_set_sensitive(eval->radiobutton_weightkernel, TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (eval->radiobutton_weightkernel), TRUE); gtk_widget_set_sensitive(eval->radiobutton_zerooff, FALSE); gtk_widget_set_sensitive(eval->radiobutton_weightkernel, TRUE); } } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (eval->radiobutton_zerooff), TRUE); gtk_widget_set_sensitive(eval->radiobutton_zerooff, TRUE); gtk_widget_set_sensitive(eval->radiobutton_weightkernel, FALSE); } */ } /* * Also calls on_spinbutton_piv_int, which, on its turn, may call this function * again resulting into an infinite loop */ gtk_spin_button_set_value (GTK_SPIN_BUTTON (eval->spinbutton_intsize_f), gl_piv_par->int_size_f); } else if (var_type == SIZE_I) { gl_piv_par->int_size_i = atoi (gtk_object_get_data (GTK_OBJECT(widget), "intsize_i")); /* * Adjust spinner */ gtk_adjustment_set_value (GTK_ADJUSTMENT (eval->spinbutton_adj_intsize_i), (gfloat) gl_piv_par->int_size_i); /* * Save origanal settings of weight and zero_off for later resetting */ if (gl_piv_par->int_size_i > gl_piv_par->int_size_f) { int_scheme_tmp = gl_piv_par->int_scheme; /* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (eval->radiobutton_weightkernel), FALSE); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (eval->radiobutton_zerooff), TRUE); gtk_widget_set_sensitive(eval->radiobutton_zerooff, FALSE); */ /* * Reset weight and zero_off */ } else { /* if (zero_off_tmp == 0) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (eval->radiobutton_zerooff), FALSE); if (weight_tmp == 0) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (eval->radiobutton_weightkernel), FALSE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (eval->radiobutton_weightkernel), TRUE); } } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (eval->radiobutton_zerooff), TRUE); } gtk_widget_set_sensitive(eval->radiobutton_zerooff, TRUE); */ } } else if (var_type == SHIFT) { gl_piv_par->int_shift = atoi (gtk_object_get_data (GTK_OBJECT(widget), "intshift")); /* * Adjust spinner */ gtk_spin_button_set_value (GTK_SPIN_BUTTON (eval->spinbutton_intshift), gl_piv_par->int_shift); } if (disp != NULL && disp->intreg->exist_int ) { lo_display_intregs = disp->display_intregs; destroy_all_intregs (disp); create_all_intregs (disp); disp->display_intregs = lo_display_intregs; if (disp->display_intregs) show_all_intregs(disp); } } } void on_radiobutton_fit_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Interpolation scheme for sub-pixel estimation"); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), msg); } void on_radiobutton_peak_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Chooses n-th highest top number of correlation as estimator"); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), msg); } void on_radiobutton_interrogatescheme_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT(widget), "gpiv"); gchar *msg = _("Bias correction scheme"); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), msg); } void on_radiobutton_interrogatescheme_imgdeform_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT(widget), "gpiv"); gchar *msg = _("Deforms image from PIV estimators"); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), msg); } void on_toggle_piv (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PivEval *eval = gtk_object_get_data(GTK_OBJECT (widget), "eval"); enum VariableType { IFIT, PEAK_NR, SCHEME, CORRELATION } var_type; /* * Select which variable has to be modified */ var_type = atoi (gtk_object_get_data (GTK_OBJECT(widget), "var_type")); if (var_type == IFIT) { gl_piv_par->ifit = atoi (gtk_object_get_data (GTK_OBJECT(widget), "ifit")); } else if (var_type == PEAK_NR) { gl_piv_par->peak = atoi (gtk_object_get_data (GTK_OBJECT(widget), "peak")); } else if (var_type == SCHEME) { gl_piv_par->int_scheme = atoi(gtk_object_get_data(GTK_OBJECT(widget), "scheme")); } else if (var_type == CORRELATION) { gl_image_par->x_corr = atoi (gtk_object_get_data (GTK_OBJECT(widget), "x_corr")); } } void on_checkbutton_weight_ia_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Gauss weighting on the Interrogation Area"); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), msg); } void on_checkbutton_weight_ia (GtkWidget *widget, gpointer data) /*----------------------------------------------------------------------------- */ { PivEval *eval = gtk_object_get_data (GTK_OBJECT(widget), "eval"); if (GTK_TOGGLE_BUTTON(widget)->active) { gl_piv_par->gauss_weight_ia = TRUE; } else { gl_piv_par->gauss_weight_ia = FALSE; } } void on_checkbutton_spof_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Symmetric Phase Only Filtering on the FT images"); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), msg); } void on_checkbutton_spof (GtkWidget *widget, gpointer data) /*----------------------------------------------------------------------------- */ { PivEval *eval = gtk_object_get_data (GTK_OBJECT(widget), "eval"); if (GTK_TOGGLE_BUTTON(widget)->active) { gl_piv_par->spof_filter = TRUE; } else { gl_piv_par->spof_filter = FALSE; } } void adjust_radiobutton_piv_int (PivEval *eval, guint int_size_f ) /* ---------------------------------------------------------------------------- * adjusting and disabling int_size_i and its toggle buttons */ { /* if (int_size_f == 8) { */ /* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON */ /* (eval->radiobutton_intsize_i_1), TRUE); */ /* } else */ if (int_size_f == 16) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_i_2), TRUE); } else if (int_size_f == 32) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_i_3), TRUE); } else if (int_size_f == 64) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_i_4), TRUE); } else if (int_size_f >= 128) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_i_5), TRUE); } if (int_size_f <= 64) { gtk_widget_set_sensitive (GTK_WIDGET(eval->radiobutton_intsize_i_4), TRUE); if (int_size_f <= 32) { gtk_widget_set_sensitive (GTK_WIDGET (eval->radiobutton_intsize_i_3), TRUE); if (int_size_f <= 16) { gtk_widget_set_sensitive (GTK_WIDGET (eval->radiobutton_intsize_i_2), TRUE); /* if (int_size_f <= 8) { */ /* gtk_widget_set_sensitive(GTK_WIDGET */ /* (eval->radiobutton_intsize_i_1), */ /* TRUE); */ /* } */ } } } if (int_size_f >= 16) { /* gtk_widget_set_sensitive(GTK_WIDGET(eval->radiobutton_intsize_i_1), */ /* FALSE); */ if (int_size_f >= 32) { gtk_widget_set_sensitive (GTK_WIDGET (eval->radiobutton_intsize_i_2), FALSE); if (int_size_f >= 64) { gtk_widget_set_sensitive (GTK_WIDGET (eval->radiobutton_intsize_i_3), FALSE); if (int_size_f >= 128) { gtk_widget_set_sensitive (GTK_WIDGET (eval->radiobutton_intsize_i_4), FALSE); } } } } } void on_checkbutton_piv_monitor_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Displays subimages, correlation function and PIV vector"); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), msg); } void on_checkbutton_piv_monitor (GtkWidget *widget, gpointer data) /*----------------------------------------------------------------------------- */ { PivEval *eval = gtk_object_get_data (GTK_OBJECT(widget), "eval"); if (GTK_TOGGLE_BUTTON(widget)->active) { gpiv_var->piv_disproc = TRUE; eval->monitor->gci_vec_background = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS(eval->canvas_monitor_vec)), gnome_canvas_rect_get_type(), "x1", (double) 0, "y1", (double) 0, "x2", (double) GPIV_MAX_INTERR_SIZE, "y2", (double) GPIV_MAX_INTERR_SIZE, "fill_color", "darkblue", "width_units", 1.0, NULL); eval->monitor->gci_int1_background = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS(eval->canvas_monitor_int1)), gnome_canvas_rect_get_type(), "x1", (double) 0, "y1", (double) 0, "x2", (double) GPIV_MAX_INTERR_SIZE, "y2", (double) GPIV_MAX_INTERR_SIZE, "fill_color", "darkgreen", "width_units", 1.0, NULL); eval->monitor->gci_int2_background = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS(eval->canvas_monitor_int2)), gnome_canvas_rect_get_type(), "x1", (double) 0, "y1", (double) 0, "x2", (double) GPIV_MAX_INTERR_SIZE, "y2", (double) GPIV_MAX_INTERR_SIZE, "fill_color", "darkgreen", "width_units", 1.0, NULL); eval->monitor->gci_background_cov = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS(eval->canvas_monitor_cov)), gnome_canvas_rect_get_type(), "x1", (double) 0, "y1", (double) 0, "x2", (double) GPIV_MAX_INTERR_SIZE, "y2", (double) GPIV_MAX_INTERR_SIZE, "fill_color", "darkred", "width_units", 1.0, NULL); } else { gpiv_var->piv_disproc = FALSE; /* * Destroy intreg1 image */ if (eval->monitor->gci_int1_background != NULL) { gtk_object_destroy (GTK_OBJECT(eval->monitor-> gci_int1_background)); eval->monitor->gci_int1_background = NULL; } if (eval->monitor->rgbbuf_int1 != NULL) { g_free (eval->monitor->rgbbuf_int1); eval->monitor->rgbbuf_int1 = NULL; } if (eval->monitor->gci_int1 != NULL) { gtk_object_destroy (GTK_OBJECT(eval->monitor->gci_int1)); eval->monitor->gci_int1 = NULL; } /* * Destroy intreg2 image */ if (eval->monitor->gci_int2_background != NULL) { gtk_object_destroy (GTK_OBJECT(eval->monitor-> gci_int2_background)); eval->monitor->gci_int2_background = NULL; } if (eval->monitor->rgbbuf_int2 != NULL) { g_free (eval->monitor->rgbbuf_int2); eval->monitor->rgbbuf_int2 = NULL; } if (eval->monitor->gci_int2 != NULL) { gtk_object_destroy (GTK_OBJECT(eval->monitor->gci_int2)); eval->monitor->gci_int2 = NULL; } /* * Destroy correlation image */ if (eval->monitor->gci_background_cov != NULL) { gtk_object_destroy (GTK_OBJECT(eval->monitor->gci_background_cov)); eval->monitor->gci_background_cov = NULL; } if (eval->monitor->rgbbuf_cov != NULL) { g_free (eval->monitor->rgbbuf_cov); eval->monitor->rgbbuf_cov = NULL; } if (eval->monitor->gci_cov != NULL) { gtk_object_destroy (GTK_OBJECT(eval->monitor->gci_cov)); eval->monitor->gci_cov = NULL; } /* * Destroy vector */ if (eval->monitor->gci_vec_background != NULL) { gtk_object_destroy (GTK_OBJECT(eval->monitor->gci_vec_background)); eval->monitor->gci_vec_background = NULL; } if (eval->monitor->gci_vec != NULL) { gtk_object_destroy (GTK_OBJECT(eval->monitor->gci_vec)); eval->monitor->gci_vec = NULL; } } } void on_spinbutton_piv_monitor_zoom (GtkSpinButton *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PivEval *eval = gtk_object_get_data (GTK_OBJECT(widget), "eval"); /* gfloat piv_disproc_zoom */ gpiv_var->piv_disproc_zoom = gtk_spin_button_get_value_as_float (widget); gnome_config_push_prefix("/gpiv/RuntimeVariables/"); gnome_config_set_float ("zoom_factor", gpiv_var->piv_disproc_zoom); gnome_config_pop_prefix (); gnome_config_sync(); eval->monitor->affine[0] = gpiv_var->piv_disproc_zoom; eval->monitor->affine[3] = gpiv_var->piv_disproc_zoom; eval->monitor->affine[4] = (GPIV_MAX_INTERR_SIZE - gpiv_var->piv_disproc_zoom * gl_piv_par->int_size_f) /2.0; eval->monitor->affine[5] = (GPIV_MAX_INTERR_SIZE - gpiv_var->piv_disproc_zoom * gl_piv_par->int_size_f) /2.0; if(eval->monitor->gci_int1 != NULL) { gnome_canvas_item_affine_absolute (eval->monitor->gci_int1, eval->monitor->affine); } if(eval->monitor->gci_int2 != NULL) { gnome_canvas_item_affine_absolute (eval->monitor->gci_int2, eval->monitor->affine); } if(eval->monitor->gci_cov != NULL) { gnome_canvas_item_affine_absolute (eval->monitor->gci_cov, eval->monitor->affine); } } void on_spinbutton_piv_monitor_vectorscale (GtkSpinButton *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PivEval *eval = gtk_object_get_data (GTK_OBJECT (widget), "eval"); /* gint piv_disproc_vlength */ gpiv_var->piv_disproc_vlength = gtk_spin_button_get_value_as_int (widget); gnome_config_set_int ("vector_length", gpiv_var->piv_disproc_vlength); gnome_config_sync (); /* * Try to re-scale vector */ if(eval->monitor->gci_vec != NULL) { GnomeCanvasPoints *points = gnome_canvas_points_new (2); points->coords[0] = GPIV_MAX_INTERR_SIZE / 2; points->coords[1] = GPIV_MAX_INTERR_SIZE / 2; points->coords[2] = GPIV_MAX_INTERR_SIZE / 2 + eval->monitor->pi_da->dx[0][0] * gpiv_var->piv_disproc_vlength; points->coords[3] = GPIV_MAX_INTERR_SIZE / 2 + eval->monitor->pi_da->dy[0][0] * gpiv_var->piv_disproc_vlength; gnome_canvas_item_set (eval->monitor->gci_vec, "points", points, NULL); gnome_canvas_points_free (points); } } void on_button_piv_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Analyses a PIV image (pair)"); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), msg); } void on_button_piv (GtkWidget *widget, gpointer data ) /* ---------------------------------------------------------------------------- * The actual calculation of particle image displacements */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gint row, ibuf; cancel_process = FALSE; if (nbufs > 0) { for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; row++) { display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), row); ibuf = display_act->id; if (display[ibuf] != NULL && display_act->mwin != NULL && GTK_WIDGET_VISIBLE (GTK_WIDGET (display_act->mwin))) { gdk_window_show (GTK_WIDGET (display_act->mwin)->window); gdk_window_raise (GTK_WIDGET (display_act->mwin)->window); } exec_piv (gpiv); } } } gpiv-0.6.1/src/piveval.h0000644000175000017500000001634311110306550012011 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * (callback) functions for Piv evaluation window/tabulator * $Log: piveval.h,v $ * Revision 1.11 2008-04-28 12:00:57 gerber * hdf-formatted files are now with .hdf extension (previously: .gpi) * * Revision 1.10 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.9 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.8 2007-02-16 17:09:48 gerber * added Gauss weighting on I.A. and SPOF filtering (on correlation function) * * Revision 1.7 2007-01-29 11:27:44 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.6 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.5 2005/01/19 15:53:42 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.4 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.3 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.2 2003/09/01 11:17:15 gerber * improved monitoring of interrogation process * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef PIVEVAL_H #define PIVEVAL_H gint int_scheme_tmp, zero_off_tmp, weight_tmp; /* used in on_radiobutton_piv_int */ gint setby_spinbutton; /* used in on_spinbutton_piv_int and on_radiobutton_piv_int */ gboolean int_scheme_autochanged; /* * Public piv evaluation functions */ void interrogate_ORG (GpivPivData *piv_data, /* output piv data from image analysis */ guint16 **img_1, /* raw (binary) image data of first piv image */ guint16 **img_2, /* raw (binary) image data of second piv image */ GpivConsole *gpiv); /* console widgets structure */ void display_piv_vector (guint i, guint j, GpivPivData *piv_data, PivEval *piveval); void display_img_intreg1 (float **intreg1, guint int_size, PivEval *piveval); void display_img_intreg2 (float **intreg2, guint int_size, PivEval *piveval); void display_img_cov (GpivCov *cov, guint int_size, PivEval *piveval); /* * Piv evaluation window/tabulator callbacks */ void on_radiobutton_piv_mouse (GtkWidget *widget, gpointer data); void on_radiobutton_piv_mouse1_enter (GtkWidget *widget, gpointer data); void on_radiobutton_piv_mouse2_enter (GtkWidget *widget, gpointer data); void on_radiobutton_piv_mouse3_enter (GtkWidget *widget, gpointer data); void on_radiobutton_piv_mouse4_enter (GtkWidget *widget, gpointer data); void on_radiobutton_piv_mouse5_enter (GtkWidget *widget, gpointer data); void on_radiobutton_piv_mouse6_enter (GtkWidget *widget, gpointer data); void on_radiobutton_piv_mouse7_enter (GtkWidget *widget, gpointer data); /* * entries for first, last, and pre-shift columns and rows */ void on_spinbutton_piv_int (GtkSpinButton *widget, GtkWidget *entry); /* * radio buttons of first, second interrogation sizes and shift (adjacent * distances */ void on_radiobutton_piv_int (GtkWidget *widget, gpointer data); void on_radiobutton_fit_enter (GtkWidget *widget, gpointer data); void on_radiobutton_peak_enter (GtkWidget *widget, gpointer data); void on_radiobutton_interrogatescheme_enter (GtkWidget *widget, gpointer data); void on_radiobutton_interrogatescheme_imgdeform_enter (GtkWidget *widget, gpointer data); void on_toggle_piv (GtkWidget *widget, gpointer data); void on_checkbutton_weight_ia_enter (GtkWidget *widget, gpointer data); void on_checkbutton_weight_ia (GtkWidget *widget, gpointer data); void on_checkbutton_spof_enter (GtkWidget *widget, gpointer data); void on_checkbutton_spof (GtkWidget *widget, gpointer data); void on_button_piv (GtkWidget *widget, gpointer data); void on_toolbar_chackbutton_piv (GtkWidget *widget, gpointer data); /* * showing interrogation area's, covariance function and * displacement vector */ gboolean on_darea_piv_monitor_int1_expose (GtkWidget *widget, GdkEventExpose *event, gpointer user_data); gboolean on_darea_piv_monitor_int2_expose (GtkWidget *widget, GdkEventExpose *event, gpointer user_data); gboolean on_darea_piv_monitor_cov_expose (GtkWidget *widget, GdkEventExpose *event, gpointer user_data); void on_checkbutton_piv_monitor_enter (GtkWidget *widget, gpointer data); void on_checkbutton_piv_monitor (GtkWidget *widget, gpointer data); void on_spinbutton_piv_monitor_zoom (GtkSpinButton *widget, gpointer data); void on_spinbutton_piv_monitor_vectorscale (GtkSpinButton *widget, gpointer data); void on_button_piv_enter (GtkWidget *widget, gpointer data); void adjust_radiobutton_piv_int (PivEval *piveval, guint int_size_f); #endif /* PIVEVAL_H */ gpiv-0.6.1/src/gpiv_gui.h0000644000175000017500000004423311110306735012160 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * Graphical User Interface for gpiv * $Log: gpiv_gui.h,v $ * Revision 1.6 2008-10-09 14:43:37 gerber * paralellized with OMP and MPI * * Revision 1.5 2008-09-25 13:32:22 gerber * Adapted for use on cluster (using MPI/OMP) parallelised gpiv_rr from gpivtools) * * Revision 1.4 2008-09-16 10:13:56 gerber * 2nd update because of cvs conflict * * Revision 1.3 2008-09-16 10:11:02 gerber * Updated because of cvs conflict * * Revision 1.2 2005-06-15 15:06:22 gerber * Optional Anti Aliased canvas for viewer * * Revision 1.1 2005/06/15 09:40:40 gerber * debugged, optimized * * Revision 1.9 2005/01/19 15:53:41 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.8 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.7 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.6 2003/09/04 13:31:55 gerber * init of printing (unfinished) * * Revision 1.5 2003/09/01 11:17:14 gerber * improved monitoring of interrogation process * * Revision 1.4 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.3 2003/07/25 15:40:23 gerber * removed/disabled setting of correlation in Eval tab, Correlation type in Image info tab * * Revision 1.2 2003/06/27 13:47:26 gerber * display ruler, line/point evaluation * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef GPIV_H #define GPIV_H #include #include #include /* for the "pause" function: */ #include #include #include #include /* for isnan */ #include #include #include #include #include #ifdef HAVE_GNOME_PRINT #include #include #include #include #include #endif /* HAVE_GNOME_PRINT */ /* Revision Control System (RCS) version */ #define RCSID "$Id: gpiv_gui.h,v 1.6 2008-10-09 14:43:37 gerber Exp $" #define ERR_IVAL = 99 /* Some arbitrary integer error value */ #define ADJ_MIN -50.0 /* minimum value for adjustment */ #define ADJ_MAX 50.0 /* maximum value for adjustment */ #define ADJ_STEP 0.001 /* Step increment for adjustment */ #define ADJ_PAGE 0.1 /* Page increment for adjustment */ #define ADJ_ISTEP 1 /* Step increment for adjustment for integers */ #define ADJ_IPAGE 10 /* Page increment for adjustment for integers*/ #define MAX_LIST 5 #ifdef ENABLE_MPI #define MPIRUN_CMD "mpirun -np" #endif /* * SVGA: 1280 x 1024 * Sony PCR-100 video camera: 1152 x 864 */ #ifndef IMAGE_WIDTH_MAX #define IMAGE_WIDTH_MAX GPIV_MAX_IMG_SIZE /* Maximum allowed image width */ #endif /* IMAGE_WIDTH_MAX */ #ifndef IMAGE_HEIGHT_MAX #define IMAGE_HEIGHT_MAX GPIV_MAX_IMG_SIZE /* Maximum allowed image height */ #endif /* IMAGE_HEIGHT_MAX */ #ifndef IMAGE_DEPTH_MAX #define IMAGE_DEPTH_MAX GPIV_MAX_IMG_DEPTH /* Maximum allowed image depth */ #endif /* IMAGE_DEPTH_MAX */ gchar IMAGE_CORRELATION_LABEL[GPIV_MAX_CHARS]; gchar IMAGE_WIDTH_LABEL[GPIV_MAX_CHARS]; gchar IMAGE_HEIGHT_LABEL[GPIV_MAX_CHARS]; gchar IMAGE_DEPTH_LABEL[GPIV_MAX_CHARS]; /* * Definitions for conssole */ #define CONSOLE_WIDTH 100 #define CONSOLE_HEIGHT 400 /* * Extra marge for display */ /* #define VIEW_HMARGE 38 */ /* #define VIEW_VMARGE 62 */ #define VIEW_HMARGE 19 /* horizontal marge in the display window */ #define VIEW_VMARGE 31 /* vertical marge in the display window */ /* #define VIEW_HMARGE 0 */ /* #define VIEW_VMARGE 0 */ #define RULER_WIDTH 17 /* width of the rulers in the display window */ #define MAX_DATA (IMAGE_WIDTH_MAX / GPIV_MIN_INTERR_SIZE) /* Maximum number of data/estimators/Interr. Areas per row */ #define MAX_BUFS GPIV_NIMG_MAX /* maximum number of buffers (=displays) */ /* #define MAX_SWEEP 6 */ #define CANVAS_AA /* Use Anti Aliased canvas for viewer */ /* BUGFIX: Color presenation for AA */ #define THICKNESS 1 /* line thickness to be drawn in te canvases */ #define ARROW_LENGTH 0.4 /* length of (piv) vector arrow head */ #define ARROW_EDGE 0.6 /* edge of (piv) vector arrow head */ #define ARROW_WIDTH 0.2 /* width of (piv) vector arrow head */ #define ARROW_ADD 2.0 /* additional quantity for arrow head */ #define ARROW_FACT 0.2 /* magnification factor of vector_scale for arrow head */ #define BYTEVAL 255 #define BITSHIFT_RED 24 /* bitshift for color red value (used in display_all_scalar_intregs) */ #define BITSHIFT_GREEN 16 /* bitshift for color green value */ #define BITSHIFT_BLUE 8 /* bitshift for color blue value */ #define ENABLE_IMGPROC #undef IMGPROC_SAVE_IMG #ifdef ENABLE_IMGPROC #define IMG_FILTERS 5 /* number of image processes or filters in create_imgproc */ #endif /* ENABLE_IMGPROC */ #define DISPLAY_ZOOMFACTOR_MIN 0.25 /* Minimum zoom factor for display viewer */ #define DISPLAY_ZOOMFACTOR_MAX 4.0 /* Maximum zoom factor for display viewer */ #define DISPLAY_ZOOMFACTOR_STEP 1.1 /* Increase / decrease change in zoomfactor */ #include "console_interface.h" #include "display_interface.h" /* * Image data / header will be stored to this format */ enum ImgFmt { IMG_FMT_PNG, IMG_FMT_HDF, IMG_FMT_RAW }; enum TablabelPage { #ifdef ENABLE_DAC PAGE_DAC, #endif PAGE_IMGH, #ifdef ENABLE_IMGPROC PAGE_IMGPROC, #endif PAGE_PIVEVAL, PAGE_PIVVALID, PAGE_PIVPOST }; enum ShowBackground { SHOW_BG_DARKBLUE, SHOW_BG_BLACK, SHOW_BG_IMG1, SHOW_BG_IMG2, }; enum ShowScalar { SHOW_SC_NONE, SHOW_SC_VORTICITY, SHOW_SC_SSTRAIN, SHOW_SC_NSTRAIN }; enum ZoomIndex { ZOOM_0, ZOOM_1, ZOOM_2, ZOOM_3, ZOOM_4, ZOOM_5, ZOOM_6, ZOOM_7 }; static float zfactor[] = { 0.25, 0.5, 0.83, 1.0, 1.3, 1.6, 2.0, 4.0 }; enum VectorScale { VECTOR_SCALE_0 = 1, VECTOR_SCALE_1 = 2, VECTOR_SCALE_2 = 4, VECTOR_SCALE_3 = 8, VECTOR_SCALE_4 = 16, VECTOR_SCALE_5 = 32, VECTOR_SCALE_6 = 64, VECTOR_SCALE_7 = 128, VECTOR_SCALE_8 = 256 }; enum VectorColor { SHOW_PEAKNR, SHOW_SNR, SHOW_MAGNITUDE_GRAY, SHOW_MAGNITUDE } v_color; enum WidgetSet { DAC, DAC_TRIG, DAC_TIMING, DAC_CAM, IMG, IMGPROC, EVAL, INTREGS, VALID, POST }; enum MouseSelect { NO_MS, AOI_MS, SINGLE_AREA_MS, SINGLE_POINT_MS, DRAG_MS, V_LINE_MS, H_LINE_MS, ENABLE_POINT_MS, DISABLE_POINT_MS, ENABLE_AREA_MS, DISABLE_AREA_MS, SPANLENGTH_MS, V_SPANLENGTH_MS, H_SPANLENGTH_MS } m_select; enum ClistPut { PREPEND, INSERT, APPEND }; typedef struct __GpivVar Var; /* * Variables of gpiv that will be stored for future sessions, but are not * defined as command line keys during launching gpiv: */ struct __GpivVar { enum TablabelPage tab_pos; /* page of the notebook to be shown */ guint number_fnames_last; gchar *fn_last[MAX_LIST]; /* last image name that has been loaded */ gboolean fname_last__set; /* flag if fname_last has been set */ gchar *fname_last; /* last image name that has been loaded */ gchar *fname_last_print; /* last filename that has been printed to */ gboolean fname_date; /* Extends the name with current date */ gboolean fname_time; /* Extends the name with current time */ gfloat img_span_px; /* spanned length that takes N mm in the img */ gfloat img_length_mm; /* length in mm to be measured in img */ gboolean piv_disproc; /* displaying Interrogation Areas and PIV estimator during interrogation */ gfloat piv_disproc_zoom; /* magnification factor for displaying correlation in PIV evaluation tabulator */ guint piv_disproc_vlength; /* vector length of PIV estimator in PIV evaluation tabulator */ gfloat dl_min; /* minimum displacement of a piv data-set */ gfloat dl_max; /* maximum displacement of a piv data-set */ #ifdef ENABLE_IMGPROC guint imgproc_count; /* number of image processes */ #endif gboolean residu_stats; /* perform residual statistics on PIV data while validating */ gboolean residu_stats__set; gboolean auto_thresh; /* perform auto thresholding while validaton PIV data on outlyers */ gboolean auto_thresh__set; } *gpiv_var; /* * Parameters of gpiv: */ typedef struct __GpivPar Par; struct __GpivPar { /* * General parameters */ gboolean x_corr; /* images for cross correlation */ gboolean x_corr__set; /* images for cross correlation */ enum ImgFmt img_fmt; /* Image data / header will be stored to this format */ gboolean img_fmt__set; gboolean hdf; /* store data in hdf 5 format, with .h5 extension */ gboolean hdf__set; /* store data in hdf 5 format, with .h5 extension */ gboolean print_par; /* Prints parameters to stdout */ gboolean print_par__set; gboolean verbose; /* Prints behaviour to stdout */ gboolean verbose__set; /* * Console related parameters */ gboolean console__show_tooltips; /* flag to show tooltips or hints (in pop-up window) */ gboolean console__show_tooltips__set; /* flag to show tooltips or hints (in pop-up window) */ gboolean console__view_tabulator__set; /* display tabulator of process parameters in main window */ gboolean console__view_tabulator; /* display tabulator of process parameters in main window */ gboolean console__view_gpivbuttons; /* display gpiv buttons in main window */ gboolean console__view_gpivbuttons__set; /* display gpiv buttons in main window */ gint console__nbins; /* number of bins to display histograms */ gboolean console__nbins__set; /* number of bins to display histograms */ gboolean console__trigger_cam; /* enable/disable camera and laser triggering */ gboolean console__trigger_cam__set; /* enable/disable camera and laser triggering */ /* * Display viewer related parameters */ gboolean display__stretch_auto; /* stretch automatic window after zooming in */ gboolean display__stretch_auto__set; /* stretch automatic window after sooming in has been defined */ enum ZoomIndex display__zoom_index; /* index for displayed zooming */ gboolean display__zoom_index__set; /* index for displayed zooming has been defined */ enum VectorScale display__vector_scale; /* scale of vectors to be displayed */ gboolean display__vector_scale__set; /* scale of vectors to be displayed has been defined */ enum VectorColor display__vector_color; /* color representation of vectors */ gboolean display__vector_color__set; /* color representation of vectors has been defined */ gboolean display__stretch_window; /* stretch display window for image area */ gboolean display__stretch_window__set; /* stretch display window for image area has been defined */ gboolean display__view_menubar; /* view menubar of the buffer display */ gboolean display__view_menubar__set; /* view menubar of the buffer display has been defined */ gboolean display__view_rulers; /* view rulers of the buffer display */ gboolean display__view_rulers__set; /* view rulers of the buffer display has been defined */ gboolean display__stretch__set; /* stretch buffer display when zooming in */ gboolean display__stretch; /* stretch buffer display when zooming in has been defined */ enum ShowBackground display__backgrnd; /* display background color */ gboolean display__backgrnd__set; /* display background color has been defined */ gboolean display__intregs; /* display interrogation regions in display */ gboolean display__intregs__set; /* display interrogation regions in display has been defined */ gboolean display__piv; /* display piv vectors in display */ gboolean display__piv__set; /* display piv vectors in display has been defined */ enum ShowScalar display__scalar; /* displaying of scalar data */ gboolean display__scalar__set; /* displaying of scalar data has been defined */ gboolean display__process; /* display interrogation areas and covariance function during image analyzing process */ gboolean display__process__set; /* display interrogation areas and covariance function during image analyzing process */ /* * Chain processing related parameters */ gboolean process__cam; /* used by gpiv toolbar to run camera */ gboolean process__cam__set; /* used by gpiv toolbar to run camera */ gboolean process__trig; /* used by gpiv toolbar to run trigger */ gboolean process__trig__set; /* used by gpiv toolbar to run trigger */ gboolean process__imgproc; /* used by gpiv toolbar to run image processing */ gboolean process__imgproc__set; /* used by gpiv toolbar to run image processing */ gboolean process__piv; /* used by gpiv toolbar to run piv */ gboolean process__piv__set; /* used by gpiv toolbar to run piv */ gboolean process__gradient; /* used by gpiv toolbar to run gradient */ gboolean process__gradient__set; /* used by gpiv toolbar to run gradient */ gboolean process__resstats; /* used by gpiv toolbar to run resstats */ gboolean process__resstats__set; /* used by gpiv toolbar to run resstats */ gboolean process__errvec; /* used by gpiv toolbar to run errvec */ gboolean process__errvec__set; /* used by gpiv toolbar to run errvec */ gboolean process__peaklock; /* used by gpiv toolbar to run peaklock */ gboolean process__peaklock__set; /* used by gpiv toolbar to run peaklock */ gboolean process__average; /* used by gpiv toolbar to run average */ gboolean process__average__set; /* used by gpiv toolbar to run average */ gboolean process__scale; /* used by gpiv toolbar to run scale */ gboolean process__scale__set; /* used by gpiv toolbar to run scale */ gboolean process__subtract; /* used by gpiv toolbar to run subtract */ gboolean process__subtract__set; /* used by gpiv toolbar to run subtract */ gboolean process__vorstra; /* used by gpiv toolbar to run vorstra */ gboolean process__vorstra__set; /* used by gpiv toolbar to run vorstra */ #ifdef ENABLE_MPI gint mpi_nodes; /* number of cluster nodes used for parallel MPI execution */ gboolean mpi_nodes__set; /* number of cluster nodes used for parallel MPI execution */ #endif /* ENBALE MPI */ } gp, *default_par, *gpiv_par; /* * Global parameters and variables for each process: * ImagePar should be unique for each image */ #ifdef ENABLE_CAM GpivCamPar *gl_cam_par; /* global camera parameters */ GpivCamVar *cam_var; #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG GpivTrigPar *gl_trig_par; /* global trigger parameters */ #endif /* ENABLE_TRIG */ #ifdef ENABLE_IMGPROC GpivImageProcPar *gl_imgproc_par; /* global image processing parameters */ #endif /* ENABLE_IMGPROC */ GpivImagePar *gl_image_par; /* global image parameters */ GpivPivPar *gl_piv_par; /* global PIV evaluation / interrogation parameters */ GpivValidPar *gl_valid_par; /* global PIV validation parameters */ GpivPostPar *gl_post_par; /* global PIV post processing parameters */ /* * Other global variables */ GnomeProgram *Gpiv_app; GnomeCanvasItem *gci_aoi, *gci_line; gchar fname[GPIV_MAX_CHARS]; gboolean exec_process, cancel_process; Display *display[MAX_BUFS], *display_act; guint nbufs; guint camera_act; gchar *msg_default, msg_display[40]; gchar c_line[GPIV_MAX_LINES_C][GPIV_MAX_CHARS]; guint var_scale, display_intregs; guint m_select_index_y, m_select_index_x; /* flag to suppres creating intregs during load_buffer; after displaying * results into correct effect */ gboolean view_toggle_intregs_flag; #endif /* GPIV_H */ gpiv-0.6.1/src/dac_interface.c0000644000175000017500000023054411115261734013117 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * Data acquisition header interface * $Log: dac_interface.c,v $ * Revision 1.6 2008-09-16 11:17:42 gerber * Updated because of cvs conflict * * Revision 1.4 2005/03/01 14:43:46 gerber * updated documentation * * Revision 1.3 2005/02/26 09:17:13 gerber * structured of interrogate function by using gpiv_piv_isiadapt * * Revision 1.2 2005/02/12 13:09:22 gerber * Changing some structure and constant names for DAC * * Revision 1.1 2005/01/19 15:53:41 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * */ #ifdef ENABLE_DAC #ifdef HAVE_CONFIG_H # include #endif #include "gpiv_gui.h" #include "dac_interface.h" #include "utils.h" #include "console.h" #include "dac.h" #ifdef ENABLE_CAM #include "dac_cam.h" #endif #ifdef ENABLE_TRIG #include "dac_trig.h" #endif #include "pivpost.h" #ifdef ENABLE_CAM static void create_camera_menu(GnomeApp *main_window, Cam *cam ) /*----------------------------------------------------------------------------- * From coriander: build_menus.c BuildCameraMenu */ { int i; char tmp[GPIV_MAX_CHARS]; /* * remove previous menu */ if (cam->camera_select != NULL) { gtk_widget_destroy(GTK_WIDGET (cam->camera_select)); } cam->camera_select = gtk_option_menu_new (); gtk_widget_ref (cam->camera_select); gtk_object_set_data_full (GTK_OBJECT (main_window), "camera_select", cam->camera_select, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (cam->camera_select); gtk_container_add(GTK_CONTAINER (cam->vbox_cam), cam->camera_select); if (cam_var->numCameras >= 1) { gtk_widget_set_sensitive (cam->camera_select, TRUE); } else { gtk_widget_set_sensitive (cam->camera_select, FALSE ); } cam->camera_select_menu = gtk_menu_new (); if (cam_var->numCameras > 0) { for (i = 0; i < cam_var->numCameras; i++) { g_snprintf(tmp, GPIV_MAX_CHARS, "Node %d: %s %s", cam_var->camera[i].id, cam_var->camera[i].vendor, cam_var->camera[i].model); cam->menu_item = gtk_menu_item_new_with_label (_(tmp)); gtk_widget_show (cam->menu_item); gtk_menu_append (GTK_MENU (cam->camera_select_menu), cam->menu_item); gtk_option_menu_set_menu (GTK_OPTION_MENU (cam->camera_select), cam->camera_select_menu); g_signal_connect (GTK_OBJECT (cam->menu_item), "activate", GTK_SIGNAL_FUNC (on_menu_camera_select), (int*)i); /* * BUGFIX apply last camera to img_par.source */ g_snprintf(gl_image_par->source, GPIV_MAX_CHARS, "%s %s", cam_var->camera[i].vendor, cam_var->camera[i].model); gl_image_par->source__set = TRUE; } } else { g_snprintf(tmp, GPIV_MAX_CHARS, "No camera"); cam->menu_item = gtk_menu_item_new_with_label (_(tmp)); gtk_widget_show (cam->menu_item); gtk_menu_append (GTK_MENU (cam->camera_select_menu), cam->menu_item); gtk_option_menu_set_menu (GTK_OPTION_MENU (cam->camera_select), cam->camera_select_menu); g_snprintf(gl_image_par->source, GPIV_MAX_CHARS, "No camera"); gl_image_par->source__set = TRUE; } /* gtk_option_menu_set_menu (GTK_OPTION_MENU (cam->camera_select), */ /* cam->camera_select_menu); */ /* * sets the active menu item: */ gtk_option_menu_set_history (GTK_OPTION_MENU (cam->camera_select) , /* camera_act */ 0); } static void create_format_menu(GnomeApp *main_window, GpivConsole * gpiv, Cam *cam ) /*----------------------------------------------------------------------------- * From coriander: build_menus.c BuildCameraMenu */ { int i; char tmp[GPIV_MAX_CHARS]; quadlet_t modes, formats; if (cam_var->numCameras > 0) { dc1394_query_supported_formats(cam_var->camera[0].handle, cam_var->camera[0].id, &formats); dc1394_query_supported_modes(cam_var->camera[0].handle, cam_var->camera[0].id, FORMAT_VGA_NONCOMPRESSED, &modes); } /* * remove previous menu */ if (cam->format_menu != NULL) { gtk_widget_destroy(GTK_WIDGET (cam->format_menu)); } cam->format_menu = gtk_option_menu_new (); gtk_widget_ref (cam->format_menu); gtk_object_set_data_full (GTK_OBJECT (main_window), "format_menu", cam->format_menu, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (cam->format_menu); gtk_container_add(GTK_CONTAINER (cam->vbox_cam), cam->format_menu); cam->format_menu_menu = gtk_menu_new (); if (cam_var->numCameras > 0) { /* * Format 0 */ if (formats & (0x1 << 31)) { for (i = 0; i < NUM_FORMAT0_MODES; i++) { if ( modes & (0x1 << (31-i))) { g_snprintf(tmp, GPIV_MAX_CHARS, "Format 0: %s", format0_desc[i]); cam->menu_item = gtk_menu_item_new_with_label (_(tmp)); gtk_widget_show (cam->menu_item); gtk_menu_append (GTK_MENU (cam->format_menu_menu), cam->menu_item); gtk_option_menu_set_menu (GTK_OPTION_MENU (cam->format_menu), cam->format_menu_menu); gtk_widget_set_sensitive(cam->menu_item, modes & (0x1 << (31-i)) ); gtk_object_set_data(GTK_OBJECT (cam->menu_item), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (cam->menu_item), "activate", GTK_SIGNAL_FUNC (on_menu_format), (int*)(i + MODE_FORMAT0_MIN)); } } } /* * Format 1 */ if (formats & (0x1 << 30)) { for (i = 0; i < NUM_FORMAT1_MODES; i++) { if ( modes & (0x1 << (30-i))) { g_snprintf(tmp, GPIV_MAX_CHARS, "Format 1: %s", format1_desc[i]); cam->menu_item = gtk_menu_item_new_with_label (_(tmp)); gtk_widget_show (cam->menu_item); gtk_menu_append (GTK_MENU (cam->format_menu_menu), cam->menu_item); gtk_option_menu_set_menu (GTK_OPTION_MENU (cam->format_menu), cam->format_menu_menu); gtk_widget_set_sensitive(cam->menu_item, modes & (0x1 << (30-i)) ); g_signal_connect (GTK_OBJECT (cam->menu_item), "activate", GTK_SIGNAL_FUNC (on_menu_format), (int*)(i + MODE_FORMAT1_MIN)); } } } /* * Format 2 */ if (formats & (0x1 << 29)) { for (i = 0; i < NUM_FORMAT2_MODES; i++) { if ( modes & (0x1 << (29-i))) { g_snprintf(tmp, GPIV_MAX_CHARS, "Format 2: %s", format2_desc[i]); cam->menu_item = gtk_menu_item_new_with_label (_(tmp)); gtk_widget_show (cam->menu_item); gtk_menu_append (GTK_MENU (cam->format_menu_menu), cam->menu_item); gtk_option_menu_set_menu (GTK_OPTION_MENU (cam->format_menu), cam->format_menu_menu); gtk_widget_set_sensitive(cam->menu_item, modes & (0x1 << (29-i)) ); g_signal_connect (GTK_OBJECT (cam->menu_item), "activate", GTK_SIGNAL_FUNC (on_menu_format), (int*)(i + MODE_FORMAT2_MIN)); } } } /* * Format 6 */ if (formats & (0x1 << 25)) { for (i = 0; i < NUM_FORMAT6_MODES; i++) { if ( modes & (0x1 << (25-i))) { g_snprintf(tmp, GPIV_MAX_CHARS, "Format 6: %s", format6_desc[i]); cam->menu_item = gtk_menu_item_new_with_label (_(tmp)); gtk_widget_show (cam->menu_item); gtk_menu_append (GTK_MENU (cam->format_menu_menu), cam->menu_item); gtk_option_menu_set_menu (GTK_OPTION_MENU (cam->format_menu), cam->format_menu_menu); gtk_widget_set_sensitive(cam->menu_item, modes & (0x1 << (25-i)) ); g_signal_connect (GTK_OBJECT (cam->menu_item), "activate", GTK_SIGNAL_FUNC (on_menu_format), (int*)(i + MODE_FORMAT6_MIN)); } } } } else { g_snprintf(tmp, GPIV_MAX_CHARS, "No Formats"); cam->menu_item = gtk_menu_item_new_with_label (_(tmp)); gtk_widget_show (cam->menu_item); gtk_menu_append (GTK_MENU (cam->format_menu_menu), cam->menu_item); gtk_option_menu_set_menu (GTK_OPTION_MENU (cam->format_menu), cam->format_menu_menu); } /* gtk_option_menu_set_menu (GTK_OPTION_MENU (cam->format_menu), */ /* cam->format_menu_menu); */ /* * sets the active menu item: */ gtk_option_menu_set_history (GTK_OPTION_MENU (cam->format_menu) , /* camera_act */ 0); } static void create_fps_menu(GnomeApp *main_window, Cam *cam ) /*----------------------------------------------------------------------------- * From coriander: build_menus.c BuildCameraMenu */ { dc1394bool_t cont=DC1394_TRUE; gint new_framerate = 0; gint index[NUM_FRAMERATES]; gint i, f, k = 0, err; gchar tmp[GPIV_MAX_CHARS]; quadlet_t value; if (cam_var->numCameras > 0) { if (cam_var->misc_info[0].format == FORMAT_SCALABLE_IMAGE_SIZE) { value = 0; /* format 7 has no fixed framerates */ } else { err=dc1394_query_supported_framerates(cam_var->camera[0].handle, cam_var->camera[0].id, cam_var->misc_info[0].format, cam_var->misc_info[0].mode, &value); if (!err) g_warning("Could not query supported framerates"); } } /* * remove previous menu */ if (cam->fps_menu != NULL) { gtk_widget_destroy(GTK_WIDGET (cam->fps_menu)); } cam->fps_menu = gtk_option_menu_new (); gtk_widget_ref (cam->fps_menu); gtk_object_set_data_full (GTK_OBJECT (main_window), "fps_menu", cam->fps_menu, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (cam->fps_menu); gtk_container_add(GTK_CONTAINER (cam->vbox_cam), cam->fps_menu); cam->fps_menu_menu = gtk_menu_new (); if (cam_var->numCameras > 0) { k = 0; for (f=FRAMERATE_MIN, i=0; f <= FRAMERATE_MAX; i++, f++) { /* * 31 to 31-num_framerates */ if (value & (0x1 << (31-i) ) ) { index[i]=k; k++; cam->menu_item = gtk_menu_item_new_with_label (_(fps_label_list[i])); gtk_widget_show (cam->menu_item); gtk_menu_append (GTK_MENU (cam->fps_menu_menu), cam->menu_item); /* gtk_object_set_data(GTK_OBJECT (cam->menu_item), */ /* "gpiv", */ /* gpiv); */ g_signal_connect (GTK_OBJECT (cam->menu_item), "activate", GTK_SIGNAL_FUNC (on_menu_fps), /* (int*)(i + MODE_FPS0_MIN)); */ (int*)f); } else index[i] = -1; // framerate not supported } gtk_option_menu_set_menu (GTK_OPTION_MENU (cam->fps_menu), cam->fps_menu_menu); if (index[cam_var->misc_info[0].framerate-FRAMERATE_MIN] < 0 ) { // previously selected framerate unsupported!! // automatically switch to nearest fps available for (i = 1; i <= ((NUM_FRAMERATES>>1) +1); i++) { // search radius is num_framerates/2 +1 for safe rounding if (((cam_var->misc_info[0].framerate-FRAMERATE_MIN-i)>=0) && cont) { if (index[cam_var->misc_info[0].framerate - FRAMERATE_MIN-i] >= 0) { // try down new_framerate=cam_var->misc_info[0].framerate - i; cont=DC1394_FALSE; } } if (((cam_var->misc_info[0].framerate - FRAMERATE_MIN + i) < NUM_FRAMERATES) && cont) { if (index[cam_var->misc_info[0].framerate - FRAMERATE_MIN + i] >=0) { // try up new_framerate=cam_var->misc_info[0].framerate + i; cont=DC1394_FALSE; } } } snprintf(tmp, GPIV_MAX_CHARS, "create_fps_menu: Invalid framerate. Updating to nearest: %s\n", fps_label_list[new_framerate-FRAMERATE_MIN]); warning_gpiv(tmp); err = dc1394_set_video_framerate(cam_var->camera[0].handle, cam_var->camera[0].id, new_framerate); if (!err) warning_gpiv("create_fps_menu: Cannot set video framerate"); cam_var->misc_info[0].framerate = new_framerate; } gtk_option_menu_set_history (GTK_OPTION_MENU (cam->fps_menu), index[cam_var->misc_info[0].framerate - FRAMERATE_MIN]); } } static void create_trigger_mode(GnomeApp *main_window, Cam *cam ) /*----------------------------------------------------------------------------- * From coriander: build_menus.c BuildCameraMenu */ { gint err, i, f, modes = 0; quadlet_t value; gint k=0; gint index[NUM_TRIGGER_MODE]; if (cam_var->numCameras > 0) { err = dc1394_query_feature_characteristics(cam_var->camera[0].handle, cam_var->camera[0].id, FEATURE_TRIGGER, &value); if (!err) g_warning("Could not query trigger feature characteristics"); modes = ( (value & (0xF << 12))>>12 ); } /* * remove previous menu */ if (cam->trigger_mode != NULL) { gtk_widget_destroy(GTK_WIDGET (cam->trigger_mode)); } cam->trigger_mode = gtk_option_menu_new (); gtk_widget_ref (cam->trigger_mode); gtk_object_set_data_full (GTK_OBJECT (main_window), "trigger_mode", cam->trigger_mode, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (cam->trigger_mode); gtk_container_add(GTK_CONTAINER (cam->vbox_cam), cam->trigger_mode); cam->trigger_mode_menu = gtk_menu_new (); if (cam_var->numCameras > 0) { if (modes) { /* * at least one mode present * external trigger available: */ for (f = TRIGGER_MODE_MIN, i = 0; f <= TRIGGER_MODE_MAX; i++, f++) { if (modes & (0x1<<(TRIGGER_MODE_MAX-f))) { index[i]=k; k++; cam->menu_item = gtk_menu_item_new_with_label (_(trigger_mode_desc[i])); gtk_widget_show (cam->menu_item); gtk_menu_append (GTK_MENU (cam->trigger_mode_menu), cam->menu_item); g_signal_connect (GTK_OBJECT (cam->menu_item), "activate", GTK_SIGNAL_FUNC (on_trigger_mode_activate), (int*) f); } else index[i]=0; } } gtk_option_menu_set_menu (GTK_OPTION_MENU (cam->trigger_mode), cam->trigger_mode_menu); /* * sets the active menu item: */ gtk_option_menu_set_history (GTK_OPTION_MENU (cam->trigger_mode), index[cam_var->feature_set[0].feature [FEATURE_TRIGGER - FEATURE_MIN] .trigger_mode]); } } static void create_camera_feature_menu_scale(GnomeApp *main_window, Cam *cam, gint FEATURE, gchar *description, gint row, GtkWidget *option, GtkWidget *option_menu, GtkWidget *menu_item_option_man, GtkWidget *menu_item_option_auto, GtkWidget *menu_item_option_na, GtkObject *adj_scale, GtkWidget *scale ) /*----------------------------------------------------------------------------- */ { GtkWidget *label; gint col = 0; label = gtk_label_new(_(description)); gtk_widget_ref(label); gtk_object_set_data_full(GTK_OBJECT (main_window), "label", label, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(label); if (cam_var->numCameras > 0 && cam_var->feature_set[0].feature[FEATURE - FEATURE_MIN]. readout_capable) { adj_scale = gtk_adjustment_new(0, cam_var->feature_set[0]. feature[FEATURE - FEATURE_MIN].min, cam_var->feature_set[0]. feature[FEATURE - FEATURE_MIN].max, 1, 10, 0); } else { adj_scale = gtk_adjustment_new(0, 0, 255, 1, 10, 0); } scale = gtk_hscale_new (GTK_ADJUSTMENT (adj_scale)); gtk_widget_ref (scale); gtk_object_set_data_full (GTK_OBJECT (main_window), "scale", scale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (scale); gtk_widget_set_sensitive (scale, FALSE); gtk_scale_set_digits (GTK_SCALE (scale), 0); if (cam_var->numCameras > 0) { if (cam_var->feature_set[0].feature[FEATURE - FEATURE_MIN]. readout_capable) { gtk_adjustment_set_value(GTK_ADJUSTMENT (adj_scale), cam_var->feature_set[0]. feature[FEATURE - FEATURE_MIN].value); } if (cam_var->feature_set[0].feature[FEATURE - FEATURE_MIN]. manual_capable) { /* * set glider active and connect */ gtk_widget_set_sensitive (scale, TRUE); g_signal_connect (GTK_OBJECT (adj_scale), "value_changed", GTK_SIGNAL_FUNC (on_scale_changed), (int*) FEATURE); } } option = gtk_option_menu_new (); gtk_widget_ref (option); gtk_object_set_data_full (GTK_OBJECT (main_window), "option", option, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (option); gtk_widget_set_sensitive (option, FALSE); /* gtk_object_set_data(GTK_OBJECT (option), */ /* "dac", */ /* dac); */ option_menu = gtk_menu_new (); if (cam_var->numCameras > 0) { if (cam_var->feature_set[0].feature[FEATURE - FEATURE_MIN]. manual_capable) { /* * add menu man */ gtk_widget_set_sensitive (option, TRUE); menu_item_option_man = gtk_menu_item_new_with_label (_("Man")); gtk_widget_show (menu_item_option_man); gtk_menu_append (GTK_MENU (option_menu), menu_item_option_man); gtk_object_set_data(GTK_OBJECT (menu_item_option_man), "scale", scale); gtk_object_set_data(GTK_OBJECT (menu_item_option_man), "var_type", "0"); g_signal_connect (GTK_OBJECT (menu_item_option_man), "activate", GTK_SIGNAL_FUNC (on_man_auto_menu), (int*) FEATURE); } if (cam_var->feature_set[0].feature[FEATURE - FEATURE_MIN]. auto_capable) { /* * add menu auto */ gtk_widget_set_sensitive (option, TRUE); menu_item_option_auto = gtk_menu_item_new_with_label (_("Auto")); gtk_widget_show (menu_item_option_auto); gtk_menu_append (GTK_MENU (option_menu), menu_item_option_auto); gtk_object_set_data(GTK_OBJECT (menu_item_option_auto), "scale", scale); gtk_object_set_data(GTK_OBJECT (menu_item_option_auto), "var_type", "1"); g_signal_connect (GTK_OBJECT (menu_item_option_auto), "activate", GTK_SIGNAL_FUNC (on_man_auto_menu), (int*) FEATURE); } /* * add menu non avail. */ if (!cam_var->feature_set[0].feature[FEATURE - FEATURE_MIN].auto_capable && !cam_var->feature_set[0].feature[FEATURE - FEATURE_MIN]. manual_capable ) { gtk_widget_set_sensitive (option, FALSE); menu_item_option_na = gtk_menu_item_new_with_label (_("N/A")); gtk_widget_show (menu_item_option_na); gtk_menu_append (GTK_MENU (option_menu), menu_item_option_na); } } gtk_option_menu_set_menu (GTK_OPTION_MENU (option), option_menu); gtk_table_attach(GTK_TABLE(cam->table_cam), label, col, col + 1, row, row + 1, (GtkAttachOptions) 0, (GtkAttachOptions) 0, 0, 0); gtk_table_attach(GTK_TABLE(cam->table_cam), option, col + 1, col + 2, row, row + 1, (GtkAttachOptions) 0, (GtkAttachOptions) (0), 0, 0); gtk_table_attach(GTK_TABLE(cam->table_cam), scale, col + 2, col + 3, row, row + 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); } #endif /* ENABLE_CAM */ Dac * create_dac (GnomeApp *main_window, GtkWidget *container ) /*----------------------------------------------------------------------------- * Image Info window with data from header */ { GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT (main_window), "gpiv"); Dac *dac = g_new0 (Dac, 1); gint i; gchar *fname_last_base = NULL; /* #ifdef ENABLE_TRIG */ dac->trig = g_new0 (Trig, 1); /* #endif */ #ifdef ENABLE_CAM dac->cam = g_new0 (Cam, 1); #endif dac->vbox_label = gtk_vbox_new(FALSE, 0); gtk_widget_ref(dac->vbox_label); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_vbox_label", dac->vbox_label, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->vbox_label); gtk_container_add(GTK_CONTAINER (container), dac->vbox_label); /* Data Acquisition */ #ifdef ENABLE_CAM #ifdef ENABLE_TRIG dac->label_title = gtk_label_new(_("Camera-laser trigger settings and image recording")); #else dac->label_title = gtk_label_new(_("Camera settings and image recording")); #endif /* ENABLE_TRIG */ #else /* ENABLE_CAM */ dac->label_title = gtk_label_new(_("Trigger settings")); #endif /* ENABLE_CAM */ gtk_widget_ref(dac->label_title); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac->label_title", dac->label_title, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->label_title); gtk_box_pack_start(GTK_BOX(dac->vbox_label), dac->label_title, FALSE, FALSE, 0); /* * Scrolled window */ dac->vbox_scroll = gtk_vbox_new(FALSE, 0); gtk_widget_ref(dac->vbox_scroll); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_vbox_scroll", dac->vbox_scroll, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->vbox_scroll); gtk_box_pack_start(GTK_BOX(dac->vbox_label), dac->vbox_scroll, TRUE, TRUE, 0); dac->scrolledwindow = gtk_scrolled_window_new(NULL, NULL); gtk_widget_ref(dac->scrolledwindow); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_scrolledwindow", dac->scrolledwindow, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->scrolledwindow); gtk_box_pack_start(GTK_BOX(dac->vbox_scroll), dac->scrolledwindow, TRUE, TRUE, 0); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW (dac->scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); dac->viewport = gtk_viewport_new(NULL, NULL); gtk_widget_ref(dac->viewport); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_viewport", dac->viewport, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->viewport); gtk_container_add(GTK_CONTAINER (dac->scrolledwindow), dac->viewport); /* * main table for dac tabulator */ dac->table = gtk_table_new(3, 2, FALSE); gtk_widget_ref(dac->table); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac->table", dac->table, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->table); gtk_container_add(GTK_CONTAINER (dac->viewport), dac->table); /* * frame, table, mouse for file base name */ dac->frame_fname = gtk_frame_new(_("File & buffer naming")); gtk_widget_ref(dac->frame_fname); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_frame_fname", dac->frame_fname, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->frame_fname); gtk_table_attach(GTK_TABLE(dac->table), dac->frame_fname, 0, 2, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); dac->table_fname = gtk_table_new(2, 2, FALSE); gtk_widget_ref(dac->table_fname); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_table_fname", dac->table_fname, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->table_fname); gtk_container_add(GTK_CONTAINER (dac->frame_fname), dac->table_fname); dac->label_fname = gtk_label_new(_("Base-name: ")); gtk_widget_ref(dac->label_fname); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_label_fname", dac->label_fname, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->label_fname); gtk_table_attach(GTK_TABLE(dac->table_fname), dac->label_fname, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_padding(GTK_MISC(dac->label_fname), 14, 0); dac->combo_fname = gtk_combo_new (); gtk_widget_ref (dac->combo_fname); gtk_object_set_data_full (GTK_OBJECT (main_window), "combo_fname", dac->combo_fname, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dac->combo_fname); gtk_table_attach(GTK_TABLE(dac->table_fname), dac->combo_fname, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); dac->combo_fname_items = NULL; /* dac->combo_fname_items = g_list_append (dac->combo_fname_items, */ /* (gpointer) dac_par.fname); */ for (i = 0; i < gpiv_var->number_fnames_last; i++) { fname_last_base = g_strdup(g_basename(gpiv_var->fn_last[i])); strtok(fname_last_base, "."); dac->combo_fname_items = g_list_append (dac->combo_fname_items, (gpointer) g_basename (fname_last_base)); /* g_free(fname_last_base); */ } gtk_combo_set_popdown_strings (GTK_COMBO (dac->combo_fname), dac->combo_fname_items); g_list_free (dac->combo_fname_items); g_free(fname_last_base); dac->entry_fname = GTK_COMBO (dac->combo_fname)->entry; gtk_widget_ref (dac->entry_fname); gtk_object_set_data_full (GTK_OBJECT (main_window), "dac->entry_fname", dac->entry_fname, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dac->entry_fname); /* gtk_entry_set_text (GTK_ENTRY (dac->entry_fname), */ /* (gpointer) dac_par.fname); */ gtk_object_set_data(GTK_OBJECT (GTK_COMBO (dac->combo_fname)->entry), "dac", dac); g_signal_connect(GTK_OBJECT (GTK_COMBO (dac->combo_fname)->entry), "activate" /* "changed" */, GTK_SIGNAL_FUNC (on_entry_dac_fname), NULL); dac->checkbutton_fname_date = gtk_check_button_new_with_label(_("date")); gtk_widget_ref(dac->checkbutton_fname_date); gtk_object_set_data_full(GTK_OBJECT (main_window), "button_fname_date", dac->checkbutton_fname_date, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->checkbutton_fname_date); gtk_table_attach(GTK_TABLE(dac->table_fname), dac->checkbutton_fname_date, 0, 1, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_tooltips_set_tip(gpiv->tooltips, dac->checkbutton_fname_date, _("Extends the current date, obtained from the system, to the name."), NULL); gtk_object_set_data(GTK_OBJECT (dac->checkbutton_fname_date), "gpiv", gpiv); g_signal_connect(GTK_OBJECT (dac->checkbutton_fname_date), "enter", GTK_SIGNAL_FUNC (on_checkbutton_fname_date_enter), NULL); g_signal_connect(GTK_OBJECT (dac->checkbutton_fname_date), "leave", GTK_SIGNAL_FUNC (on_widget_leave), NULL); g_signal_connect(GTK_OBJECT (dac->checkbutton_fname_date), "clicked", GTK_SIGNAL_FUNC (on_checkbutton_fname_date), NULL); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (dac->checkbutton_fname_date), gpiv_var->fname_date); dac->checkbutton_fname_time = gtk_check_button_new_with_label(_("time")); gtk_widget_ref(dac->checkbutton_fname_time); gtk_object_set_data_full(GTK_OBJECT (main_window), "button_fname_time", dac->checkbutton_fname_time, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->checkbutton_fname_time); gtk_table_attach(GTK_TABLE(dac->table_fname), dac->checkbutton_fname_time, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_tooltips_set_tip(gpiv->tooltips, dac->checkbutton_fname_time, _("Extends the current time, obtained from the system, to the name."), NULL); gtk_object_set_data(GTK_OBJECT (dac->checkbutton_fname_time), "gpiv", gpiv); g_signal_connect(GTK_OBJECT (dac->checkbutton_fname_time), "enter", GTK_SIGNAL_FUNC (on_checkbutton_fname_time_enter), NULL); g_signal_connect(GTK_OBJECT (dac->checkbutton_fname_time), "leave", GTK_SIGNAL_FUNC (on_widget_leave), NULL); g_signal_connect(GTK_OBJECT (dac->checkbutton_fname_time), "clicked", GTK_SIGNAL_FUNC (on_checkbutton_fname_time), NULL); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (dac->checkbutton_fname_time), gpiv_var->fname_time); /* * frame, table, mouse selection and spinners for triggering" */ #ifdef ENABLE_CAM #ifdef ENABLE_TRIG dac->trig->frame_trigger = gtk_frame_new(_("Trigger and timing")); #else dac->trig->frame_trigger = gtk_frame_new(_("Timing")); #endif /* ENABLE_TRIG */ #else dac->trig->frame_trigger = gtk_frame_new(_("Trigger")); #endif /* ENABLE_CAM */ gtk_widget_ref(dac->trig->frame_trigger); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_frame_trigger", dac->trig->frame_trigger, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->trig->frame_trigger); gtk_table_attach(GTK_TABLE(dac->table), dac->trig->frame_trigger, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); dac->trig->table_trigger = gtk_table_new(6, 2, FALSE); gtk_widget_ref(dac->trig->table_trigger); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_table_trigger", dac->trig->table_trigger, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->trig->table_trigger); gtk_container_add(GTK_CONTAINER (dac->trig->frame_trigger), dac->trig->table_trigger); dac->trig->vbox_trigger = gtk_vbox_new(FALSE, 0); gtk_widget_ref(dac->trig->vbox_trigger); gtk_object_set_data_full(GTK_OBJECT (main_window), "vbox_trigger", dac->trig->vbox_trigger, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->trig->vbox_trigger); gtk_table_attach(GTK_TABLE(dac->trig->table_trigger), dac->trig->vbox_trigger, 0, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) 0, 0, 0); /* g_warning("::ttime.mode = %d", dac_par.ttime.mode); */ dac->trig->radiobutton_mouse_1 = gtk_radio_button_new_with_label(dac->trig->mouse_trigger_group, _("Indefinite periodic")); dac->trig->mouse_trigger_group = gtk_radio_button_group(GTK_RADIO_BUTTON (dac->trig->radiobutton_mouse_1)); gtk_widget_ref(dac->trig->radiobutton_mouse_1); gtk_object_set_data_full(GTK_OBJECT (main_window), "radiobutton_mouse_1", dac->trig->radiobutton_mouse_1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->trig->radiobutton_mouse_1); gtk_box_pack_start(GTK_BOX(dac->trig->vbox_trigger), dac->trig->radiobutton_mouse_1, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT (dac->trig->radiobutton_mouse_1), "gpiv", gpiv); gtk_object_set_data(GTK_OBJECT (dac->trig->radiobutton_mouse_1), "mouse_select", "1" /* GPIV_TIMER_MODE__PERIODIC */); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_1), "enter", GTK_SIGNAL_FUNC (on_radiobutton_dac_mouse_1_enter), NULL); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_1), "leave", GTK_SIGNAL_FUNC (on_widget_leave), NULL); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_1), "toggled", GTK_SIGNAL_FUNC (on_radiobutton_dac_mouse), NULL); dac->trig->radiobutton_mouse_2 = gtk_radio_button_new_with_label(dac->trig->mouse_trigger_group, _("Duration")); dac->trig->mouse_trigger_group = gtk_radio_button_group(GTK_RADIO_BUTTON (dac->trig->radiobutton_mouse_2)); gtk_widget_ref(dac->trig->radiobutton_mouse_2); gtk_object_set_data_full(GTK_OBJECT (main_window), "radiobutton_mouse_2", dac->trig->radiobutton_mouse_2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->trig->radiobutton_mouse_2); gtk_box_pack_start(GTK_BOX(dac->trig->vbox_trigger), dac->trig->radiobutton_mouse_2, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT (dac->trig->radiobutton_mouse_2), "gpiv", gpiv); gtk_object_set_data(GTK_OBJECT (dac->trig->radiobutton_mouse_2), "mouse_select", "2" /* GPIV_TIMER_MODE__DURATION */); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_2), "enter", GTK_SIGNAL_FUNC (on_radiobutton_dac_mouse_2_enter), NULL); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_2), "leave", GTK_SIGNAL_FUNC (on_widget_leave), NULL); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_2), "toggled", GTK_SIGNAL_FUNC (on_radiobutton_dac_mouse), NULL); #ifdef ENABLE_TRIG dac->trig->radiobutton_mouse_3 = gtk_radio_button_new_with_label(dac->trig->mouse_trigger_group, _("Interrupt one shot")); dac->trig->mouse_trigger_group = gtk_radio_button_group(GTK_RADIO_BUTTON (dac->trig->radiobutton_mouse_3)); gtk_widget_ref(dac->trig->radiobutton_mouse_3); gtk_object_set_data_full(GTK_OBJECT (main_window), "radiobutton_mouse_3", dac->trig->radiobutton_mouse_3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->trig->radiobutton_mouse_3); gtk_box_pack_start(GTK_BOX(dac->trig->vbox_trigger), dac->trig->radiobutton_mouse_3, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT (dac->trig->radiobutton_mouse_3), "gpiv", gpiv); gtk_object_set_data(GTK_OBJECT (dac->trig->radiobutton_mouse_3), "mouse_select", "3" /* GPIV_TIMER_MODE__ONE_SHOT_IRQ */); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_3), "enter", GTK_SIGNAL_FUNC (on_radiobutton_dac_mouse_3_enter), NULL); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_3), "leave", GTK_SIGNAL_FUNC (on_widget_leave), NULL); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_3), "toggled", GTK_SIGNAL_FUNC (on_radiobutton_dac_mouse), NULL); dac->trig->radiobutton_mouse_4 = gtk_radio_button_new_with_label(dac->trig->mouse_trigger_group, _("Interrupt periodic")); dac->trig->mouse_trigger_group = gtk_radio_button_group(GTK_RADIO_BUTTON (dac->trig->radiobutton_mouse_4)); gtk_widget_ref(dac->trig->radiobutton_mouse_4); gtk_object_set_data_full(GTK_OBJECT (main_window), "radiobutton_mouse_4", dac->trig->radiobutton_mouse_4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->trig->radiobutton_mouse_4); gtk_box_pack_start(GTK_BOX(dac->trig->vbox_trigger), dac->trig->radiobutton_mouse_4, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT (dac->trig->radiobutton_mouse_4), "gpiv", gpiv); gtk_object_set_data(GTK_OBJECT (dac->trig->radiobutton_mouse_4), "mouse_select", "4" /* GPIV_TIMER_MODE__TRIGGER_IRQ */); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_4), "enter", GTK_SIGNAL_FUNC (on_radiobutton_dac_mouse_4_enter), NULL); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_4), "leave", GTK_SIGNAL_FUNC (on_widget_leave), NULL); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_4), "toggled", GTK_SIGNAL_FUNC (on_radiobutton_dac_mouse), NULL); dac->trig->radiobutton_mouse_5 = gtk_radio_button_new_with_label(dac->trig->mouse_trigger_group, _("Incremented dt")); dac->trig->mouse_trigger_group = gtk_radio_button_group(GTK_RADIO_BUTTON (dac->trig->radiobutton_mouse_5)); gtk_widget_ref(dac->trig->radiobutton_mouse_5); gtk_object_set_data_full(GTK_OBJECT (main_window), "radiobutton_mouse_5", dac->trig->radiobutton_mouse_5, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->trig->radiobutton_mouse_5); gtk_box_pack_start(GTK_BOX(dac->trig->vbox_trigger), dac->trig->radiobutton_mouse_5, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT (dac->trig->radiobutton_mouse_5), "gpiv", gpiv); gtk_object_set_data(GTK_OBJECT (dac->trig->radiobutton_mouse_5), "mouse_select", "5" /* GPIV_TIMER_MODE__INCREMENT */); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_5), "enter", GTK_SIGNAL_FUNC (on_radiobutton_dac_mouse_5_enter), NULL); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_5), "leave", GTK_SIGNAL_FUNC (on_widget_leave), NULL); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_5), "toggled", GTK_SIGNAL_FUNC (on_radiobutton_dac_mouse), NULL); dac->trig->radiobutton_mouse_6 = gtk_radio_button_new_with_label(dac->trig->mouse_trigger_group, _("double exposure")); dac->trig->mouse_trigger_group = gtk_radio_button_group(GTK_RADIO_BUTTON (dac->trig->radiobutton_mouse_6)); gtk_widget_ref(dac->trig->radiobutton_mouse_6); gtk_object_set_data_full(GTK_OBJECT (main_window), "radiobutton_mouse_6", dac->trig->radiobutton_mouse_6, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->trig->radiobutton_mouse_6); gtk_box_pack_start(GTK_BOX(dac->trig->vbox_trigger), dac->trig->radiobutton_mouse_6, FALSE, FALSE, 0); gtk_object_set_data(GTK_OBJECT (dac->trig->radiobutton_mouse_6), "gpiv", gpiv); gtk_object_set_data(GTK_OBJECT (dac->trig->radiobutton_mouse_6), "mouse_select", "6" /* GPIV_TIMER_MODE__DOUBLE */); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_6), "enter", GTK_SIGNAL_FUNC (on_radiobutton_dac_mouse_6_enter), NULL); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_6), "leave", GTK_SIGNAL_FUNC (on_widget_leave), NULL); g_signal_connect(GTK_OBJECT (dac->trig->radiobutton_mouse_6), "toggled", GTK_SIGNAL_FUNC (on_radiobutton_dac_mouse), NULL); /* * spinner for dt; separation time between two laser pulses */ dac->trig->label_trigger_dt = gtk_label_new(_("dt (ms): ")); gtk_widget_ref(dac->trig->label_trigger_dt); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_label_trigger_dt", dac->trig->label_trigger_dt, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->trig->label_trigger_dt); gtk_table_attach(GTK_TABLE(dac->trig->table_trigger), dac->trig->label_trigger_dt, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); dac->trig->spinbutton_adj_trigger_dt = gtk_adjustment_new(trig_par.ttime.dt * GPIV_NANO2MILI, GPIV_TRIGPAR_TTIME_DT_MIN, GPIV_TRIGPAR_TTIME_DT_MAX, ADJ_PAGE, ADJ_IPAGE, ADJ_IPAGE); dac->trig->spinbutton_trigger_dt = gtk_spin_button_new(GTK_ADJUSTMENT(dac->trig->spinbutton_adj_trigger_dt), 1, 2); gtk_widget_ref(dac->trig->spinbutton_trigger_dt); gtk_widget_show(dac->trig->spinbutton_trigger_dt); gtk_table_attach(GTK_TABLE(dac->trig->table_trigger), dac->trig->spinbutton_trigger_dt, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable(GTK_ENTRY(dac->trig->spinbutton_trigger_dt), TRUE); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON (dac->trig->spinbutton_trigger_dt), TRUE); g_signal_connect(GTK_OBJECT (dac->trig->spinbutton_trigger_dt), "changed", G_CALLBACK (on_spinbutton_dac_trigger_dt), dac->trig->spinbutton_trigger_dt); /* * spinner for incdt; incremention of separation time between two laser pulses */ dac->trig->label_trigger_incrdt = gtk_label_new(_("incr. dt (ms): ")); gtk_widget_ref(dac->trig->label_trigger_incrdt); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_label_trigger_incrdt", dac->trig->label_trigger_incrdt, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->trig->label_trigger_incrdt); gtk_table_attach(GTK_TABLE(dac->trig->table_trigger), dac->trig->label_trigger_incrdt, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); dac->trig->spinbutton_adj_trigger_incrdt = gtk_adjustment_new(trig_par.ttime.dt * GPIV_NANO2MILI, GPIV_TRIGPAR_TTIME_INCR_DT_MIN, GPIV_TRIGPAR_TTIME_INCR_DT_MAX, ADJ_PAGE, ADJ_IPAGE, ADJ_IPAGE); dac->trig->spinbutton_trigger_incrdt = gtk_spin_button_new(GTK_ADJUSTMENT(dac->trig->spinbutton_adj_trigger_incrdt), 1, 2); gtk_widget_ref(dac->trig->spinbutton_trigger_incrdt); gtk_widget_show(dac->trig->spinbutton_trigger_incrdt); gtk_table_attach(GTK_TABLE(dac->trig->table_trigger), dac->trig->spinbutton_trigger_incrdt, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable(GTK_ENTRY(dac->trig->spinbutton_trigger_incrdt), TRUE); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON (dac->trig->spinbutton_trigger_incrdt), TRUE); g_signal_connect(GTK_OBJECT (dac->trig->spinbutton_trigger_incrdt), "changed", G_CALLBACK (on_spinbutton_dac_trigger_incrdt), dac->trig->spinbutton_trigger_incrdt); /* * spinner for cap; camera acquisition period" */ dac->trig->label_trigger_cap = gtk_label_new(_("period (ms): ")); gtk_widget_ref(dac->trig->label_trigger_cap); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_label_trigger_cap", dac->trig->label_trigger_cap, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->trig->label_trigger_cap); gtk_table_attach(GTK_TABLE(dac->trig->table_trigger), dac->trig->label_trigger_cap, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); dac->trig->spinbutton_adj_trigger_cap = gtk_adjustment_new(trig_par.ttime.cam_acq_period * GPIV_NANO2MILI, GPIV_TRIGPAR_TTIME_CAP_MIN, GPIV_TRIGPAR_TTIME_CAP_MAX, ADJ_ISTEP, ADJ_IPAGE, ADJ_IPAGE /* ADJ_MAX */); dac->trig->spinbutton_trigger_cap = gtk_spin_button_new(GTK_ADJUSTMENT(dac->trig->spinbutton_adj_trigger_cap), 1, 0); gtk_widget_ref(dac->trig->spinbutton_trigger_cap); gtk_widget_show(dac->trig->spinbutton_trigger_cap); gtk_table_attach(GTK_TABLE(dac->trig->table_trigger), dac->trig->spinbutton_trigger_cap, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable(GTK_ENTRY(dac->trig->spinbutton_trigger_cap), TRUE); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON (dac->trig->spinbutton_trigger_cap), TRUE); g_signal_connect(GTK_OBJECT (dac->trig->spinbutton_trigger_cap), "changed", G_CALLBACK (on_spinbutton_dac_trigger_cap), dac->trig->spinbutton_trigger_cap); #endif /* ENABLE_TRIG */ /* * spinner for nf; number of frames or cycles */ dac->trig->label_trigger_nf = gtk_label_new(_("frames (N): ")); gtk_widget_ref(dac->trig->label_trigger_nf); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_label_trigger_nf", dac->trig->label_trigger_nf, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->trig->label_trigger_nf); gtk_table_attach(GTK_TABLE(dac->trig->table_trigger), dac->trig->label_trigger_nf, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); #ifdef ENABLE_CAM dac->trig->spinbutton_adj_trigger_nf = gtk_adjustment_new(gl_cam_par->cycles, GPIV_CAMPAR_CYCLES_MIN, MAX_BUFS, /* GPIV_CAMPAR_CYCLES_MAX */ ADJ_ISTEP, ADJ_IPAGE, MAX_BUFS); #else /* ENABLE_CAM */ #ifdef ENABLE_TRIG dac->trig->spinbutton_adj_trigger_nf = gtk_adjustment_new(trig_par.ttime.cycles, GPIV_TRIGPAR_TTIME_CYCLES_MIN, MAX_BUFS, /* GPIV_TRIGPAR_CYCLES_MAX */ ADJ_ISTEP, ADJ_IPAGE, MAX_BUFS); #endif /* ENABLE_TRIG */ #endif /* ENABLE_CAM */ dac->trig->spinbutton_trigger_nf = gtk_spin_button_new(GTK_ADJUSTMENT(dac->trig->spinbutton_adj_trigger_nf), 1, 0); gtk_widget_ref(dac->trig->spinbutton_trigger_nf); gtk_widget_show(dac->trig->spinbutton_trigger_nf); gtk_table_attach(GTK_TABLE(dac->trig->table_trigger), dac->trig->spinbutton_trigger_nf, 1, 2, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable(GTK_ENTRY(dac->trig->spinbutton_trigger_nf), TRUE); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON (dac->trig->spinbutton_trigger_nf), TRUE); g_signal_connect(GTK_OBJECT (dac->trig->spinbutton_trigger_nf), "changed", G_CALLBACK (on_spinbutton_dac_trigger_nf), dac->trig->spinbutton_trigger_nf); /* * Trigger starting button */ #ifdef ENABLE_TRIG dac->trig->button_trigger_start = gtk_button_new_with_label(_("start trigger")); gtk_widget_ref(dac->trig->button_trigger_start); gtk_object_set_data_full(GTK_OBJECT (main_window), "button_trigger_start", dac->trig->button_trigger_start, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->trig->button_trigger_start); gtk_table_attach(GTK_TABLE(dac->trig->table_trigger), dac->trig->button_trigger_start, 0, 1, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_tooltips_set_tip(gpiv->tooltips, dac->trig->button_trigger_start, _("Timings and settings will be written to the kernel module, which uses RealTimeLinux and RTAI and will be started.\n" "In case the parameters are not uplodaed here, it will" "be done automatically before images will be recorded," "though without a warning message."), NULL); gtk_object_set_data(GTK_OBJECT (dac->trig->button_trigger_start), "gpiv", gpiv); g_signal_connect(GTK_OBJECT (dac->trig->button_trigger_start), "enter", G_CALLBACK (on_button_dac_triggerstart_enter), NULL); g_signal_connect(GTK_OBJECT (dac->trig->button_trigger_start), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect(GTK_OBJECT (dac->trig->button_trigger_start), "clicked", G_CALLBACK (on_button_dac_triggerstart), NULL); /* * Trigger stop button */ dac->trig->button_trigger_stop = gtk_button_new_with_label(_("stop trigger")); gtk_widget_ref(dac->trig->button_trigger_stop); gtk_object_set_data_full(GTK_OBJECT (main_window), "button_trigger_stop", dac->trig->button_trigger_stop, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->trig->button_trigger_stop); gtk_table_attach(GTK_TABLE(dac->trig->table_trigger), dac->trig->button_trigger_stop, 1, 2, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_tooltips_set_tip(gpiv->tooltips, dac->trig->button_trigger_stop, _("Timings and settings will stopped."), NULL); gtk_object_set_data(GTK_OBJECT (dac->trig->button_trigger_stop), "gpiv", gpiv); g_signal_connect(GTK_OBJECT (dac->trig->button_trigger_stop), "enter", G_CALLBACK (on_button_dac_triggerstop_enter), NULL); g_signal_connect(GTK_OBJECT (dac->trig->button_trigger_stop), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect(GTK_OBJECT (dac->trig->button_trigger_stop), "clicked", G_CALLBACK (on_button_dac_triggerstop), NULL); #endif /* ENABLE_TRIG */ /* * frame, table, for camera settings" */ /* BUGFIX: splitting up interface of cam and trig */ /* #ifdef ENABLE_CAM2 */ /* dac->cam = create_cam(GNOME_APP(gpiv->console), */ /* GTK_TABLE(dac->table) */ /* #endif */ /* ENABLE_CAM2 */ #ifdef ENABLE_CAM dac->cam->frame_cam = gtk_frame_new(_("Camera")); gtk_widget_ref(dac->cam->frame_cam); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_frame_cam", dac->cam->frame_cam, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->cam->frame_cam); gtk_table_attach(GTK_TABLE(dac->table), dac->cam->frame_cam, 1, 2, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); dac->cam->vbox_cam = gtk_vbox_new(FALSE, 0); gtk_widget_ref(dac->cam->vbox_cam); gtk_object_set_data_full(GTK_OBJECT (main_window), "vbox_cam", dac->cam->vbox_cam, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->cam->vbox_cam); gtk_container_add(GTK_CONTAINER (dac->cam->frame_cam), dac->cam->vbox_cam); /* gtk_table_attach(GTK_TABLE(dac->cam->table_cam), */ /* dac->cam->vbox_cam, */ /* 0, */ /* 3, */ /* 6, */ /* 7, */ /* (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), */ /* (GtkAttachOptions) 0, */ /* 0, */ /* 0); */ /* gtk_container_add(GTK_CONTAINER (hbox), */ /* label); */ /* * Camera select */ /* * Camera Shutter menu's and adjuster */ create_camera_menu(main_window, dac->cam); create_format_menu(main_window, gpiv, dac->cam); create_fps_menu(main_window, dac->cam); /* dac->cam->frame_trigger = gtk_frame_new(_("Trigger")); */ /* gtk_widget_ref(dac->cam->frame_trigger); */ /* gtk_object_set_data_full(GTK_OBJECT (main_window), */ /* "dac_frame_trigger", */ /* dac->cam->frame_trigger, */ /* (GtkDestroyNotify) gtk_widget_unref); */ /* gtk_widget_show(dac->cam->frame_trigger); */ /* gtk_container_add(GTK_CONTAINER (dac->cam->vbox_cam), */ /* dac->cam->frame_trigger); */ /* dac->cam->vbox_trigger = gtk_vbox_new(FALSE, */ /* 0); */ /* gtk_widget_ref(dac->cam->vbox_trigger); */ /* gtk_object_set_data_full(GTK_OBJECT (main_window), */ /* "vbox_trigger", */ /* dac->cam->vbox_trigger, */ /* (GtkDestroyNotify) gtk_widget_unref); */ /* gtk_widget_show(dac->cam->vbox_trigger); */ /* gtk_container_add(GTK_CONTAINER (dac->cam->frame_trigger), */ /* dac->cam->vbox_trigger); */ dac->cam->hbox_trigger = gtk_hbox_new(FALSE, 0); gtk_widget_ref(dac->cam->hbox_trigger); gtk_object_set_data_full(GTK_OBJECT (main_window), "hbox_trigger", dac->cam->hbox_trigger, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->cam->hbox_trigger); gtk_container_add(GTK_CONTAINER (dac->cam->vbox_cam), dac->cam->hbox_trigger); dac->cam->trigger_external = gtk_toggle_button_new_with_label (_("External trigger")); gtk_widget_ref (dac->cam->trigger_external); gtk_object_set_data_full (GTK_OBJECT (main_window), "trigger_external", dac->cam->trigger_external, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dac->cam->trigger_external); gtk_container_add(GTK_CONTAINER (dac->cam->hbox_trigger), dac->cam->trigger_external); gtk_widget_set_sensitive (dac->cam->trigger_external, FALSE); g_signal_connect (GTK_OBJECT (dac->cam->trigger_external), "toggled", GTK_SIGNAL_FUNC (on_trigger_external_toggled), NULL); dac->cam->trigger_polarity = gtk_toggle_button_new_with_label (_("Polarity")); gtk_widget_ref (dac->cam->trigger_polarity); gtk_object_set_data_full (GTK_OBJECT (main_window), "trigger_polarity", dac->cam->trigger_polarity, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (dac->cam->trigger_polarity); gtk_container_add(GTK_CONTAINER (dac->cam->hbox_trigger), dac->cam->trigger_polarity); gtk_widget_set_sensitive (dac->cam->trigger_polarity, FALSE); g_signal_connect (GTK_OBJECT (dac->cam->trigger_polarity), "toggled", GTK_SIGNAL_FUNC (on_trigger_polarity_toggled), NULL); create_trigger_mode(main_window, dac->cam); /* * Enable triggering with the cam */ #ifdef ENABLE_TRIG dac->cam->checkbutton_camera_trigger = gtk_check_button_new_with_label(_("RTAI triggering")); gtk_widget_ref(dac->cam->checkbutton_camera_trigger); gtk_object_set_data_full(GTK_OBJECT (main_window), "button_camera_trigger", dac->cam->checkbutton_camera_trigger, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->cam->checkbutton_camera_trigger); gtk_container_add(GTK_CONTAINER (dac->cam->vbox_cam), dac->cam->checkbutton_camera_trigger); gtk_tooltips_set_tip(gpiv->tooltips, dac->cam->checkbutton_camera_trigger, _("Enables triggering of the camera and laser. " "Else, the camera will 'free run', mostly at " "30 frames per second."), NULL); gtk_object_set_data(GTK_OBJECT (dac->cam->checkbutton_camera_trigger), "gpiv", gpiv); g_signal_connect(GTK_OBJECT (dac->cam->checkbutton_camera_trigger), "enter", G_CALLBACK (on_checkbutton_camera_trigger_enter), NULL); g_signal_connect(GTK_OBJECT (dac->cam->checkbutton_camera_trigger), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect(GTK_OBJECT (dac->cam->checkbutton_camera_trigger), "clicked", G_CALLBACK (on_checkbutton_camera_trigger), NULL); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (dac->cam->checkbutton_camera_trigger), gpiv_par.trigger_cam); #endif /* ENABLE_TRIG */ dac->cam->table_cam = gtk_table_new(9, 2, FALSE); gtk_widget_ref(dac->cam->table_cam); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_table_cam", dac->cam->table_cam, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->cam->table_cam); gtk_container_add(GTK_CONTAINER (dac->cam->vbox_cam), dac->cam->table_cam); /* * Report Camera temperature */ dac->cam->label_label_temp = gtk_label_new(_("temp (C): ")); gtk_widget_ref(dac->cam->label_label_temp); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_label_label_temp", dac->cam->label_label_temp, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->cam->label_label_temp); gtk_table_attach(GTK_TABLE(dac->cam->table_cam), dac->cam->label_label_temp, 0, 3, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) 0, 0, 0); dac->cam->label_temp = gtk_label_new(""); gtk_widget_ref(dac->cam->label_temp); gtk_object_set_data_full(GTK_OBJECT (main_window), "dac_label_temp", dac->cam->label_temp, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->cam->label_temp); gtk_table_attach(GTK_TABLE(dac->cam->table_cam), dac->cam->label_temp, 2, 3, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) 0, 0, 0); /* g_warning("cr_dac:: feature T; %s", */ /* dc1394_feature_desc[FEATURE_TEMPERATURE - FEATURE_MIN]); */ /* * Camera Exposure menu's and adjuster * * First define the scale as its data are set for the menu items */ create_camera_feature_menu_scale(main_window, dac->cam, FEATURE_EXPOSURE, "Exp:", /* row */ 2, dac->cam->camera_exposure, dac->cam->camera_exposure_menu, dac->cam->menu_item_camera_exposure_man, dac->cam->menu_item_camera_exposure_auto, dac->cam->menu_item_camera_exposure_na, dac->cam->adj_exposure_scale, dac->cam->exposure_scale ); /* * Camera Iris menu's and adjuster */ create_camera_feature_menu_scale(main_window, dac->cam, FEATURE_IRIS, "Iris:", 3, dac->cam->camera_iris, dac->cam->camera_iris_menu, dac->cam->menu_item_camera_iris_man, dac->cam->menu_item_camera_iris_auto, dac->cam->menu_item_camera_iris_na, dac->cam->adj_iris_scale, dac->cam->iris_scale ); /* * Camera Shutter menu's and adjuster */ create_camera_feature_menu_scale(main_window, dac->cam, FEATURE_SHUTTER, "Shut:", 4, dac->cam->camera_shutter, dac->cam->camera_shutter_menu, dac->cam->menu_item_camera_shutter_man, dac->cam->menu_item_camera_shutter_auto, dac->cam->menu_item_camera_shutter_na, dac->cam->adj_shutter_scale, dac->cam->shutter_scale ); /* * Camera Gain menu's and adjuster */ create_camera_feature_menu_scale(main_window, dac->cam, FEATURE_GAIN, "Gain:", 5, dac->cam->camera_gain, dac->cam->camera_gain_menu, dac->cam->menu_item_camera_gain_man, dac->cam->menu_item_camera_gain_auto, dac->cam->menu_item_camera_gain_na, dac->cam->adj_gain_scale, dac->cam->gain_scale ); /* * Camera Temperature menu's and adjuster */ create_camera_feature_menu_scale(main_window, dac->cam, FEATURE_TEMPERATURE, "Temp:", 6, dac->cam->camera_temp, dac->cam->camera_temp_menu, dac->cam->menu_item_camera_temp_man, dac->cam->menu_item_camera_temp_auto, dac->cam->menu_item_camera_temp_na, dac->cam->adj_temp_scale, dac->cam->temp_scale ); /* * Camera Zoom menu's and adjuster */ create_camera_feature_menu_scale(main_window, dac->cam, FEATURE_ZOOM, "Zoom:", 7, dac->cam->camera_zoom, dac->cam->camera_zoom_menu, dac->cam->menu_item_camera_zoom_man, dac->cam->menu_item_camera_zoom_auto, dac->cam->menu_item_camera_zoom_na, dac->cam->adj_zoom_scale, dac->cam->zoom_scale ); /* * Camera Pan menu's and adjuster */ create_camera_feature_menu_scale(main_window, dac->cam, FEATURE_PAN, "Pan:", 8, dac->cam->camera_pan, dac->cam->camera_pan_menu, dac->cam->menu_item_camera_pan_man, dac->cam->menu_item_camera_pan_auto, dac->cam->menu_item_camera_pan_na, dac->cam->adj_pan_scale, dac->cam->pan_scale ); /* * Camera Tilt menu's and adjuster */ create_camera_feature_menu_scale(main_window, dac->cam, FEATURE_TILT, "Tilt:", 9, dac->cam->camera_tilt, dac->cam->camera_tilt_menu, dac->cam->menu_item_camera_tilt_man, dac->cam->menu_item_camera_tilt_auto, dac->cam->menu_item_camera_tilt_na, dac->cam->adj_tilt_scale, dac->cam->tilt_scale ); /* * Record activating button */ dac->cam->button_cam_start = gtk_button_new_with_label(_("start camera")); gtk_widget_ref(dac->cam->button_cam_start); gtk_object_set_data_full(GTK_OBJECT (main_window), "button_cam_start", dac->cam->button_cam_start, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->cam->button_cam_start); gtk_table_attach(GTK_TABLE(dac->table), dac->cam->button_cam_start, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_tooltips_set_tip(gpiv->tooltips, dac->cam->button_cam_start, _("Starts camera to record PIV images of an area that is illuminated " "by a (double cavity Nd-YAG) laser and is observed " "by a CCD camera. Camera and lasers are eventually " "triggered by TTL pulses from the (parallel) output " "port."), NULL); gtk_object_set_data(GTK_OBJECT (dac->cam->button_cam_start), "gpiv", gpiv); g_signal_connect(GTK_OBJECT (dac->cam->button_cam_start), "enter", G_CALLBACK (on_button_dac_camstart_enter), NULL); g_signal_connect(GTK_OBJECT (dac->cam->button_cam_start), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect(GTK_OBJECT (dac->cam->button_cam_start), /* "clicked", */ /* "released", */ "pressed", G_CALLBACK (on_button_dac_camstart), NULL); /* * Record de-activating button */ dac->cam->button_cam_stop = gtk_button_new_with_label(_("stop camera")); gtk_widget_ref(dac->cam->button_cam_stop); gtk_object_set_data_full(GTK_OBJECT (main_window), "button_cam_stop", dac->cam->button_cam_stop, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(dac->cam->button_cam_stop); gtk_table_attach(GTK_TABLE(dac->table), dac->cam->button_cam_stop, 1, 2, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_tooltips_set_tip(gpiv->tooltips, dac->cam->button_cam_stop, _("Stops camera to record of PIV images " "and, eventually, cancels sending of trigger pulses"), NULL); gtk_object_set_data(GTK_OBJECT (dac->cam->button_cam_stop), "gpiv", gpiv); g_signal_connect(GTK_OBJECT (dac->cam->button_cam_stop), "enter", G_CALLBACK (on_button_dac_camstop_enter), NULL); g_signal_connect(GTK_OBJECT (dac->cam->button_cam_stop), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect(GTK_OBJECT (dac->cam->button_cam_stop), "clicked", G_CALLBACK (on_button_dac_camstop), NULL); #endif /* ENABLE_CAM */ /* * Setting initial values */ #ifdef ENABLE_CAM if (gl_cam_par->mode == GPIV_CAM_MODE__PERIODIC) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (dac->trig->radiobutton_mouse_1), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (dac->trig->radiobutton_mouse_1), FALSE); } if (gl_cam_par->mode == GPIV_CAM_MODE__DURATION) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (dac->trig->radiobutton_mouse_2), TRUE); } #else #ifdef ENABLE_TRIG if (trig_par.ttime.mode == GPIV_TIMER_MODE__PERIODIC) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (dac->trig->radiobutton_mouse_1), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (dac->trig->radiobutton_mouse_1), FALSE); } if (trig_par.ttime.mode == GPIV_TIMER_MODE__DURATION) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (dac->trig->radiobutton_mouse_2), TRUE); } if (trig_par.ttime.mode == GPIV_TIMER_MODE__ONE_SHOT_IRQ) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (dac->trig->radiobutton_mouse_3), TRUE); } if (trig_par.ttime.mode == GPIV_TIMER_MODE__TRIGGER_IRQ) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (dac->trig->radiobutton_mouse_4), TRUE); } if (trig_par.ttime.mode == GPIV_TIMER_MODE__INCREMENT) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (dac->trig->radiobutton_mouse_5), TRUE); } if (trig_par.ttime.mode == GPIV_TIMER_MODE__DOUBLE) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (dac->trig->radiobutton_mouse_6), TRUE); } #endif /* ENABLE_TRIG */ #endif /* ENABLE_CAM */ return dac; } #endif /* ENABLE_DAC */ gpiv-0.6.1/src/dac_interface.h0000644000175000017500000001444711110307265013121 00000000000000 /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * Dac tab * $Log: dac_interface.h,v $ * Revision 1.2 2008-09-16 11:17:42 gerber * Updated because of cvs conflict * * Revision 1.1 2005/01/19 15:53:41 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * */ #ifndef GPIV_DAC_INTERFACE_H #define GPIV_DAC_INTERFACE_H /* #undef ENABLE_CAM */ #ifdef ENABLE_CAM typedef struct _DacDraw DacDraw; struct _DacDraw { GtkWidget *window; GtkWidget *darea; }; DacDraw * create_dacdraw(GpivCamVar *cam_var, guchar *rgbbuf); typedef struct _Cam Cam; struct _Cam { GtkWidget *frame_cam; GtkWidget *vbox_cam; GtkWidget *table_cam; /* GtkWidget *label_cam; */ GtkWidget *camera_select; GtkWidget *camera_select_menu; GtkWidget *menu_item; GtkWidget *format_menu; GtkWidget *format_menu_menu; /* GtkWidget *format0_menu_menu; */ GtkWidget *fps_menu; GtkWidget *fps_menu_menu; /* GtkWidget *frame_trigger; */ /* GtkWidget *vbox_trigger; */ GtkWidget *hbox_trigger; GtkWidget *trigger_external; GtkWidget *trigger_polarity; GtkWidget* trigger_mode; GtkWidget* trigger_mode_menu; GtkWidget *checkbutton_camera_trigger; GtkWidget *camera_exposure; GtkWidget *camera_exposure_menu; GtkWidget *menu_item_camera_exposure_man; GtkWidget *menu_item_camera_exposure_auto; GtkWidget *menu_item_camera_exposure_na; GtkObject *adj_exposure_scale; GtkWidget *exposure_scale; GtkWidget *camera_iris; GtkWidget *camera_iris_menu; GtkWidget *menu_item_camera_iris_man; GtkWidget *menu_item_camera_iris_auto; GtkWidget *menu_item_camera_iris_na; GtkObject *adj_iris_scale; GtkWidget *iris_scale; GtkWidget *camera_shutter; GtkWidget *camera_shutter_menu; GtkWidget *menu_item_camera_shutter_man; GtkWidget *menu_item_camera_shutter_auto; GtkWidget *menu_item_camera_shutter_na; GtkObject *adj_shutter_scale; GtkWidget *shutter_scale; GtkWidget *camera_gain; GtkWidget *camera_gain_menu; GtkWidget *menu_item_camera_gain_man; GtkWidget *menu_item_camera_gain_auto; GtkWidget *menu_item_camera_gain_na; GtkObject *adj_gain_scale; GtkWidget *gain_scale; GtkWidget *camera_temp; GtkWidget *camera_temp_menu; GtkWidget *menu_item_camera_temp_man; GtkWidget *menu_item_camera_temp_auto; GtkWidget *menu_item_camera_temp_na; GtkObject *adj_temp_scale; GtkWidget *temp_scale; GtkWidget *label_temp; GtkWidget *label_label_temp; GtkWidget *camera_zoom; GtkWidget *camera_zoom_menu; GtkWidget *menu_item_camera_zoom_man; GtkWidget *menu_item_camera_zoom_auto; GtkWidget *menu_item_camera_zoom_na; GtkObject *adj_zoom_scale; GtkWidget *zoom_scale; GtkWidget *camera_pan; GtkWidget *camera_pan_menu; GtkWidget *menu_item_camera_pan_man; GtkWidget *menu_item_camera_pan_auto; GtkWidget *menu_item_camera_pan_na; GtkObject *adj_pan_scale; GtkWidget *pan_scale; GtkWidget *camera_tilt; GtkWidget *camera_tilt_menu; GtkWidget *menu_item_camera_tilt_man; GtkWidget *menu_item_camera_tilt_auto; GtkWidget *menu_item_camera_tilt_na; GtkObject *adj_tilt_scale; GtkWidget *tilt_scale; GtkWidget *button_cam_start; GtkWidget *button_cam_stop; }; #endif /* ENABLE_CAM */ typedef struct _Trig Trig; struct _Trig { GtkWidget *frame_trigger; GtkWidget *table_trigger; /* GtkWidget *label_trigger; */ GtkWidget *vbox_trigger; GSList *mouse_trigger_group; GtkWidget *radiobutton_mouse_1; GtkWidget *radiobutton_mouse_2; #ifdef ENABLE_TRIG GtkWidget *radiobutton_mouse_3; GtkWidget *radiobutton_mouse_4; GtkWidget *radiobutton_mouse_5; GtkWidget *radiobutton_mouse_6; GtkWidget *label_trigger_dt; GtkObject *spinbutton_adj_trigger_dt; GtkWidget *spinbutton_trigger_dt; GtkWidget *label_trigger_incrdt; GtkObject *spinbutton_adj_trigger_incrdt; GtkWidget *spinbutton_trigger_incrdt; GtkWidget *label_trigger_cap; GtkObject *spinbutton_adj_trigger_cap; GtkWidget *spinbutton_trigger_cap; #endif /* ENABLE_TRIG */ GtkWidget *label_trigger_nf; GtkObject *spinbutton_adj_trigger_nf; GtkWidget *spinbutton_trigger_nf; #ifdef ENABLE_TRIG GtkWidget *button_trigger_start; GtkWidget *button_trigger_stop; #endif /* ENABLE_TRIG */ }; typedef struct _Dac Dac; struct _Dac { GtkWidget *vbox_label; GtkWidget *label_title; GtkWidget *vbox_scroll; GtkWidget *scrolledwindow; GtkWidget *viewport; GtkWidget *table; GtkWidget *frame_fname; GtkWidget *table_fname; GtkWidget *label_fname; GtkWidget *entry_fname; GtkWidget *combo_fname; GList *combo_fname_items; GtkWidget *checkbutton_fname_date; GtkWidget *checkbutton_fname_time; Trig *trig; #ifdef ENABLE_CAM Cam *cam; #endif /* ENABLE_CAM */ }; /* void */ /* create_camera_exposure_menu(GtkWidget *main_window, */ /* Dac *dac); */ /* void */ /* create_camera_iris_menu(GtkWidget *main_window, */ /* Dac *dac); */ /* void */ /* create_camera_shutter_menu(GtkWidget *main_window, */ /* Dac *dac); */ /* void */ /* create_camera_gain_menu(GtkWidget *main_window, */ /* Dac *dac); */ /* void */ /* create_camera_menu(GtkWidget *main_window, */ /* Dac *dac); */ Dac * create_dac(GnomeApp *main_window, GtkWidget *container); #endif /* GPIV_DAC_INTERFACE_H */ gpiv-0.6.1/src/console_menus.h0000644000175000017500000001436511110307357013224 00000000000000 /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * menu definitions * $Log: console_menus.h,v $ * Revision 1.10 2007-12-19 08:42:35 gerber * debugged * * Revision 1.9 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.8 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.7 2006/01/31 14:28:11 gerber * version 0.3.0 * * Revision 1.6 2005/06/15 09:40:40 gerber * debugged, optimized * * Revision 1.5 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.4 2003/09/04 13:31:55 gerber * init of printing (unfinished) * * Revision 1.3 2003/09/01 11:17:14 gerber * improved monitoring of interrogation process * * Revision 1.2 2003/06/27 13:47:26 gerber * display ruler, line/point evaluation * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef MENUS_H #define MENUS_H #include "console.h" enum { TARGET_URI_LIST = MAX_BUFS }; static GtkTargetEntry target_table[] = { /* { "text/plain", 0, 0 } */ { "text/uri-list", 0, TARGET_URI_LIST } }; /* * menu bar menus */ static GnomeUIInfo file_menu_gpiv[] = { GNOMEUIINFO_MENU_OPEN_ITEM (on_open_activate, NULL), GNOMEUIINFO_MENU_SAVE_ITEM (on_save_activate, NULL), GNOMEUIINFO_MENU_SAVE_AS_ITEM (on_save_as_activate, NULL), /* GNOMEUIINFO_MENU_PRINT_ITEM (on_print_activate, NULL), */ GNOMEUIINFO_MENU_CLOSE_ITEM (on_close_activate, NULL), GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_MENU_EXIT_ITEM (on_exit_activate, NULL), GNOMEUIINFO_END }; static GnomeUIInfo settings_menu_gpiv[] = { { GNOME_APP_UI_TOGGLEITEM, N_("GPIV buttons"), N_("show GPIV check-buttons"), (gpointer) on_gpivbuttons_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_TOGGLEITEM, N_("tabulator"), N_("show tabulator containing parameter settings"), (gpointer) on_tabulator_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Preferences"), N_("Define settings of the application"), (gpointer) on_preferences_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo help_menu_gpiv[] = { { GNOME_APP_UI_TOGGLEITEM, N_("show tooltips"), N_("show extended information in a small pop-up window"), (gpointer) on_tooltip_activate, /* NULL */ "gpiv", NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("manual"), NULL, (gpointer) on_manual_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, /* GNOMEUIINFO_HELP ("/home/gerber/gpiv/docs/index.html"), */ GNOMEUIINFO_MENU_ABOUT_ITEM (on_about_activate, NULL), GNOMEUIINFO_END }; static GnomeUIInfo menubar_gpiv[] = { GNOMEUIINFO_MENU_FILE_TREE (file_menu_gpiv), GNOMEUIINFO_MENU_SETTINGS_TREE (settings_menu_gpiv), GNOMEUIINFO_MENU_HELP_TREE (help_menu_gpiv), GNOMEUIINFO_END }; /* * Popup menus */ static GnomeUIInfo file_menu_gpiv_popup[] = { GNOMEUIINFO_MENU_OPEN_ITEM (on_open_activate, NULL), GNOMEUIINFO_MENU_SAVE_ITEM (on_save_activate, NULL), GNOMEUIINFO_MENU_SAVE_AS_ITEM (on_save_as_activate, NULL), /* GNOMEUIINFO_MENU_PRINT_ITEM (on_print_activate, NULL), */ GNOMEUIINFO_MENU_CLOSE_ITEM (on_close_activate, NULL), GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_MENU_EXIT_ITEM (on_exit_activate, NULL), GNOMEUIINFO_END }; static GnomeUIInfo settings_menu_gpiv_popup[] = { { GNOME_APP_UI_TOGGLEITEM, N_("GPIV buttons"), N_("show GPIV check-buttons"), (gpointer) on_gpivbuttons_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_TOGGLEITEM, N_("tabulator"), N_("show tabulator containing parameter settings"), (gpointer) on_tabulator_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_SEPARATOR, { GNOME_APP_UI_ITEM, N_("Preferences"), NULL, (gpointer) on_preferences_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_END }; static GnomeUIInfo help_menu_gpiv_popup[] = { { GNOME_APP_UI_TOGGLEITEM, N_("show tooltips"), N_("show extended information in a small pop-up window"), (gpointer) on_tooltip_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, { GNOME_APP_UI_ITEM, N_("manual"), NULL, (gpointer) on_manual_activate, NULL, NULL, GNOME_APP_PIXMAP_NONE, NULL, 0, (GdkModifierType) 0, NULL }, GNOMEUIINFO_MENU_ABOUT_ITEM (on_about_activate, NULL), GNOMEUIINFO_END }; static GnomeUIInfo menubar_gpiv_popup[] = { GNOMEUIINFO_MENU_FILE_TREE (file_menu_gpiv_popup), GNOMEUIINFO_MENU_SETTINGS_TREE (settings_menu_gpiv_popup), GNOMEUIINFO_MENU_HELP_TREE (help_menu_gpiv_popup), GNOMEUIINFO_END }; #endif /* MENUS_H */ gpiv-0.6.1/src/display_menus.h0000644000175000017500000002176411110307047013224 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * menus of display * $Log: display_menus.h,v $ * Revision 1.8 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.7 2007/02/05 15:17:09 gerber * auto stretching, broadcast display settings to buffers from preferences * * Revision 1.6 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.5 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.3 2005/01/19 15:53:41 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.2 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef DISPLAY_MENUS_H #define DISPLAY_MENUS_H #include "display.h" /* * Display menus */ static GnomeUIInfo zoomscale_menu_display[] = { GNOMEUIINFO_RADIOITEM_DATA (N_("0.25"), NULL, select_zoomscale, GUINT_TO_POINTER(0), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("0.5"), NULL, select_zoomscale, GUINT_TO_POINTER(1), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("0.83"), NULL, select_zoomscale, GUINT_TO_POINTER(2), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("1.0"), NULL, select_zoomscale, GUINT_TO_POINTER(3), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("1.3"), NULL, select_zoomscale, GUINT_TO_POINTER(4), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("1.6"), NULL, select_zoomscale, GUINT_TO_POINTER(5), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("2.0"), NULL, select_zoomscale, GUINT_TO_POINTER(6), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("4.0"), NULL, select_zoomscale, GUINT_TO_POINTER(7), NULL), GNOMEUIINFO_END }; static GnomeUIInfo view_background_display[] = { GNOMEUIINFO_RADIOITEM_DATA (N_("Blue background"), NULL, select_view_background, GUINT_TO_POINTER (0), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("Black background"), NULL, select_view_background, GUINT_TO_POINTER (1), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("Image A"), NULL, select_view_background, GUINT_TO_POINTER (2), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("Image B"), NULL, select_view_background, GUINT_TO_POINTER (3), NULL), GNOMEUIINFO_END }; static GnomeUIInfo view_background_radiolist[] = { GNOMEUIINFO_RADIOLIST (view_background_display), GNOMEUIINFO_END }; static GnomeUIInfo view_piv_display[] = { GNOMEUIINFO_TOGGLEITEM (N_("Interrogation area's"), NULL, view_toggle_intregs, NULL), GNOMEUIINFO_TOGGLEITEM (N_("Velocity vectors"), NULL, view_toggle_piv, NULL), GNOMEUIINFO_END }; static GnomeUIInfo view_scalardata_display[] = { GNOMEUIINFO_RADIOITEM_DATA (N_("None"), NULL, select_view_scalardata, GUINT_TO_POINTER(0), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("Vorticity"), NULL, select_view_scalardata, GUINT_TO_POINTER(1), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("Shear strain"), NULL, select_view_scalardata, GUINT_TO_POINTER(2), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("Normal strain"), NULL, select_view_scalardata, GUINT_TO_POINTER(3), NULL), GNOMEUIINFO_END }; static GnomeUIInfo vectorscale_menu_display[] = { GNOMEUIINFO_RADIOITEM_DATA (N_("1"), NULL, select_vectorscale, GUINT_TO_POINTER(/* VECTOR_SCALE_0 */ 0), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("2"), NULL, select_vectorscale, GUINT_TO_POINTER(/* VECTOR_SCALE_1 */ 1), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("4"), NULL, select_vectorscale, GUINT_TO_POINTER(/* VECTOR_SCALE_2 */ 2), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("8"), NULL, select_vectorscale, GUINT_TO_POINTER(/* VECTOR_SCALE_3 */ 3), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("16"), NULL, select_vectorscale, GUINT_TO_POINTER(/* VECTOR_SCALE_4 */ 4), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("32"), NULL, select_vectorscale, GUINT_TO_POINTER(/* VECTOR_SCALE_5 */ 5), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("64"), NULL, select_vectorscale, GUINT_TO_POINTER(/* VECTOR_SCALE_6 */ 6), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("128"), NULL, select_vectorscale, GUINT_TO_POINTER(/* VECTOR_SCALE_7 */ 7), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("256"), NULL, select_vectorscale, GUINT_TO_POINTER(/* VECTOR_SCALE_8 */ 8), NULL), GNOMEUIINFO_END }; static GnomeUIInfo vectorcolor_menu_display[] = { GNOMEUIINFO_RADIOITEM_DATA (N_("Peak nr"), NULL, select_vectorcolor, GUINT_TO_POINTER(SHOW_PEAKNR), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("SNR"), NULL, select_vectorcolor, GUINT_TO_POINTER(SHOW_SNR), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("Magnitude gray"), NULL, select_vectorcolor, GUINT_TO_POINTER(SHOW_MAGNITUDE_GRAY), NULL), GNOMEUIINFO_RADIOITEM_DATA (N_("Magnitude color"), NULL, select_vectorcolor, GUINT_TO_POINTER(SHOW_MAGNITUDE), NULL), GNOMEUIINFO_END }; static GnomeUIInfo zoomscale_radiolist[] = { GNOMEUIINFO_RADIOLIST (zoomscale_menu_display), GNOMEUIINFO_END }; static GnomeUIInfo view_scalardata_radiolist[] = { GNOMEUIINFO_RADIOLIST (view_scalardata_display), GNOMEUIINFO_END }; static GnomeUIInfo vectorscale_radiolist[] = { GNOMEUIINFO_RADIOLIST (vectorscale_menu_display), GNOMEUIINFO_END }; static GnomeUIInfo vectorcolor_radiolist[] = { GNOMEUIINFO_RADIOLIST (vectorcolor_menu_display), GNOMEUIINFO_END }; static GnomeUIInfo display_menu_uiinfo[] = { GNOMEUIINFO_TOGGLEITEM (N_("View menubar"), N_("Displays menubar in window"), view_toggle_menubar, NULL), GNOMEUIINFO_TOGGLEITEM (N_("View rulers"), N_("Displays rulers in window"), view_toggle_rulers, NULL), GNOMEUIINFO_TOGGLEITEM (N_("Stretch auto"), N_("Stretch display automatic when zooming"), view_toggle_stretch_display_auto, NULL), GNOMEUIINFO_ITEM_NONE (N_("Stretch display"), N_("Stretch or fit display window to the image area"), view_toggle_stretch_display), GNOMEUIINFO_SUBTREE (N_("Zoom in/out"), zoomscale_radiolist), GNOMEUIINFO_SEPARATOR, GNOMEUIINFO_SUBTREE (N_("View background"), view_background_radiolist), GNOMEUIINFO_SUBTREE (N_("View piv data"), view_piv_display), GNOMEUIINFO_SUBTREE (N_("View scalar data"), view_scalardata_radiolist), GNOMEUIINFO_SUBTREE (N_("Vector scale"), vectorscale_radiolist), GNOMEUIINFO_SUBTREE (N_("Vector color"), vectorcolor_radiolist), GNOMEUIINFO_END }; #endif /* DISPLAY_MENUS_H */ gpiv-0.6.1/src/display_event.c0000644000175000017500000025400611110306053013202 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ #include "gpiv_gui.h" #include "display.h" #include "display_zoom.h" #include "piveval_interrogate.h" GdkCursor *cursor; static void canvas_display_motion_notify__NO_MS (Display *disp, gint x, gint y, gint *index_x, gint *index_y ); static void canvas_display_button_release__AOI_MS (Display *disp, GpivConsole *gpiv, GtkWidget *view_piv_display0, gdouble x, gdouble y ); static void canvas_display_motion_notify__DRAGINT_MS (Display *disp, gint x, gint y, gint *index_x, gint *index_y ); static void canvas_display_motion_notify__SINGLE_POINT_MS (Display *disp, gint x, gint y ); static char * canvas_display_button_press__SINGLE_AREA_MS (GpivConsole *gpiv, Display *disp, gint x, gint y ); static char * canvas_display_button_release__SINGLE_AREA_MS (GpivConsole *gpiv, Display *disp, gdouble x, gdouble y ); static void canvas_display_button_press__SINGLE_POINT_MS (GpivConsole *gpiv, Display *disp, gint x, gint y ); static void canvas_display_button_release__HVLINE_MS (Display *disp, GpivConsole *gpiv, GtkWidget *view_piv_display0, gdouble x, gdouble y ); static void canvas_display_button_press__DISABLE_POINT_MS (Display *disp, gint x, gint y ); static void set__NO_MS (GpivConsole *gpiv, Display *disp ); static void search_nearest_index (Display *disp, gint x, gint y, gint *index_x, gint *index_y, gint data_type ); static void highlight_intreg (gint index_y, gint index_x, Display *disp ); static void create_msg_display_with_pivdata (GpivPivData *piv_data, gint index_y, gint index_x, gint scale ); static void create_msg_display_with_scdata (GpivScalarData *sc_data, gchar *sc_type, gint index_y, gint index_x, gint scale ); static void create_msg_display_with_pivscdata (GpivPivData *piv_data, GpivScalarData *sc_data, gchar *sc_type, gint index_y, gint index_x, gint scale ); static void create_line (Display *disp, gint x1, gint y1, gint x2, gint y2 ); static void update_line (gint x1, gint y1, gint x2, gint y2 ); static void destroy_line (); static void update_rect (gint x, gint y ); static void create_rect (Display *disp, gint x, gint y ); static void destroy_rect (); static void pane_canvas (Display *disp, gfloat x, gfloat y ); static void pane_canvas_x (Display *disp, gfloat x ); static void pane_canvas_y (Display *disp, gfloat y ); /* * Public display functions */ gboolean canvas_display_enter_notify (GtkWidget *widget, GdkEventMotion *event, gpointer data ) /*----------------------------------------------------------------------------- */ { Display *disp = gtk_object_get_data(GTK_OBJECT(widget), "disp"); GtkWidget *view_piv_display0 = gtk_object_get_data(GTK_OBJECT(disp->mwin), "view_piv_display0"); disp->index_x_old = 0; disp->index_y_old = 0; disp->index_old = FALSE; if (m_select == NO_MS) { cursor = gdk_cursor_new(GDK_DOTBOX); } else if (m_select == SINGLE_AREA_MS || m_select == ENABLE_POINT_MS || m_select == DISABLE_POINT_MS) { cursor = gdk_cursor_new(GDK_CROSSHAIR); } else if ( m_select == DRAG_MS ) { cursor = gdk_cursor_new(GDK_CROSS); } else if (m_select == SINGLE_POINT_MS || m_select == V_LINE_MS || m_select == H_LINE_MS ) { if (m_select == V_LINE_MS) { cursor = gdk_cursor_new (GDK_SB_V_DOUBLE_ARROW); } if (m_select == H_LINE_MS) { cursor = gdk_cursor_new (GDK_SB_H_DOUBLE_ARROW); } if (m_select == SINGLE_POINT_MS) { cursor = gdk_cursor_new(GDK_CROSS); } if (display_act->pida->exist_piv && disp->display_piv) { hide_all_vectors(display_act->pida); } if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { hide_all_intregs(disp); } } else if (m_select == AOI_MS || m_select == ENABLE_AREA_MS || m_select == DISABLE_AREA_MS) { cursor = gdk_cursor_new(GDK_CROSSHAIR); if (m_select == AOI_MS) { if (display_act->pida->exist_piv && disp->display_piv) { hide_all_vectors(display_act->pida); } if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { hide_all_intregs(disp); } } } else if (m_select == SPANLENGTH_MS || m_select == V_SPANLENGTH_MS || m_select == H_SPANLENGTH_MS ) { cursor = gdk_cursor_new(GDK_CROSS); } gdk_window_set_cursor(disp->mwin->window, cursor); return TRUE; } gboolean canvas_display_motion_notify (GtkWidget *widget, GdkEventMotion *event, gpointer data ) /*----------------------------------------------------------------------------- */ { Display *disp = gtk_object_get_data(GTK_OBJECT(widget), "disp"); GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); GtkAdjustment *hadj = GTK_ADJUSTMENT (disp->hadj); GtkAdjustment *vadj = GTK_ADJUSTMENT (disp->hadj); gdouble x, y; gint x_grab, y_grab; gint index_y = 0, index_x = 0; GdkModifierType state; GnomeCanvasPoints *points; points = gnome_canvas_points_new(2); if (event->is_hint) { gdk_window_get_pointer (event->window, &x_grab, &y_grab, &state); x = x_grab; y = y_grab; } else { x = event->x; y = event->y; state = event->state; } /* g_message ("canvas_display_motion_notify:: x = %f y = %f x/zoom = %f y/zoom = %f", */ /* x, y, x / disp->zoom_factor, y / disp->zoom_factor); */ /* if (x >= hadj->value && x < hadj->value + hadj->page_size */ /* && y >= vadj->value && y < vadj->value + vadj->page_size) { */ if (x >= 0 && x < disp->img->image->header->ncolumns * disp->zoom_factor && y >= 0 && y < disp->img->image->header->nrows * disp->zoom_factor) { /* * display particle displacements / velocities and its attributes, */ if (m_select == NO_MS || m_select == SINGLE_AREA_MS || m_select == DRAG_MS || m_select == ENABLE_POINT_MS || m_select == DISABLE_POINT_MS) { /* * display locations of interrogation area's and estimators, * only display locations of interrogation area's, * or nothing */ canvas_display_motion_notify__NO_MS (disp, (gint) (x / disp->zoom_factor), (gint) (y / disp->zoom_factor), &index_x, &index_y); /* * Pane (moving) the canvas. Identic effect as moving the scroll bars. */ if (m_select == NO_MS) { if (state & GDK_BUTTON1_MASK) { pane_canvas (disp, x, y); } } if ( m_select == DRAG_MS ) { canvas_display_motion_notify__DRAGINT_MS (disp, (gint) (x / disp->zoom_factor), (gint) (y / disp->zoom_factor), &index_x, &index_y); } disp->index_x_old = index_x; disp->index_y_old = index_y; /* * Only displays pointer position */ } else if (m_select == AOI_MS || m_select == ENABLE_AREA_MS || m_select == DISABLE_AREA_MS ) { g_snprintf(msg_display, GPIV_MAX_CHARS, "x=%d px y=%d px", (gint) (x / disp->zoom_factor), (gint) (y / disp->zoom_factor)); /* * Update the drawing of the rectangle */ if (state & GDK_BUTTON1_MASK) { if (gci_aoi != NULL) { update_rect((gint) (x / disp->zoom_factor), (gint) (y / disp->zoom_factor)); } } } else if ( m_select == SINGLE_POINT_MS) { canvas_display_motion_notify__SINGLE_POINT_MS (disp, (gint) x / disp->zoom_factor, (gint) y / disp->zoom_factor); /* * Update a vertical line */ } else if (m_select == V_LINE_MS) { if (state & GDK_BUTTON1_MASK) { g_snprintf (msg_display, GPIV_MAX_CHARS, "x=%d px y=%d px", (gint) (disp->xgrab_first / disp->zoom_factor), (gint) (y / disp->zoom_factor)); if ( gci_line != NULL ) { update_line ((gint) (disp->xgrab_first / disp->zoom_factor) , (gint) (disp->ygrab_first / disp->zoom_factor), (gint) (disp->xgrab_first / disp->zoom_factor), (gint) (y / disp->zoom_factor)); } } else { g_snprintf(msg_display, GPIV_MAX_CHARS, "x=%d px y=%d px", (gint) (x / disp->zoom_factor), (gint) (y / disp->zoom_factor)); } /* * Update a horizontal line */ } else if (m_select == H_LINE_MS) { if (state & GDK_BUTTON1_MASK) { g_snprintf(msg_display, GPIV_MAX_CHARS, "x=%d y=%d", (gint) (x / disp->zoom_factor), (gint) (disp->ygrab_first / disp->zoom_factor)); if (gci_line != NULL ) { update_line ((gint) (disp->xgrab_first / disp->zoom_factor), (gint) (disp->ygrab_first / disp->zoom_factor), (gint) (x / disp->zoom_factor), (gint) (disp->ygrab_first / disp->zoom_factor)); } } else { g_snprintf(msg_display, GPIV_MAX_CHARS, "x=%d px y=%d px", (gint) (x / disp->zoom_factor), (gint) (y / disp->zoom_factor)); } } else if (m_select == SPANLENGTH_MS) { g_snprintf(msg_display, GPIV_MAX_CHARS, "x=%d px y=%d px", (gint) (x / disp->zoom_factor), (gint) (y / disp->zoom_factor)); if (state & GDK_BUTTON1_MASK && gci_line != NULL ) { g_snprintf(msg_display, GPIV_MAX_CHARS, "x=%d y=%d", (gint) (x / disp->zoom_factor), (gint) (y / disp->zoom_factor)); update_line ((gint) (disp->xgrab_first / disp->zoom_factor), (gint) (disp->ygrab_first / disp->zoom_factor), (gint) (x / disp->zoom_factor), (gint) (y / disp->zoom_factor)); } } else if (m_select == V_SPANLENGTH_MS) { g_snprintf(msg_display, GPIV_MAX_CHARS, "x=%d px y=%d px", (gint) (x / disp->zoom_factor), (gint) (y / disp->zoom_factor)); if (state & GDK_BUTTON1_MASK && gci_line != NULL ) { g_snprintf(msg_display, GPIV_MAX_CHARS, "x=%d y=%d", (gint) (disp->xgrab_first / disp->zoom_factor), (gint) (y / disp->zoom_factor)); update_line ((gint) (disp->xgrab_first / disp->zoom_factor), (gint) (disp->ygrab_first / disp->zoom_factor), (gint) (disp->xgrab_first / disp->zoom_factor), (gint) (y / disp->zoom_factor)); } } else if (m_select == H_SPANLENGTH_MS) { g_snprintf(msg_display, GPIV_MAX_CHARS, "x=%d px y=%d px", (gint) (x / disp->zoom_factor), (gint) (y / disp->zoom_factor)); if (state & GDK_BUTTON1_MASK && gci_line != NULL ) { g_snprintf(msg_display, GPIV_MAX_CHARS, "x=%d y=%d", (gint) (x / disp->zoom_factor), (gint) (disp->ygrab_first / disp->zoom_factor)); update_line ((gint) (disp->xgrab_first / disp->zoom_factor), (gint) (disp->ygrab_first / disp->zoom_factor), (gint) (x / disp->zoom_factor), (gint) (disp->ygrab_first / disp->zoom_factor)); } } gnome_appbar_push(GNOME_APPBAR(disp->appbar), msg_display); gnome_appbar_push(GNOME_APPBAR(gpiv->appbar), msg_display); } /* } else { */ /* g_message("canvas_display_motion_notify: out of image borders"); */ gnome_canvas_points_free(points); return TRUE; } gboolean canvas_display_button_press (GtkWidget *widget, GdkEventButton *event, gpointer data ) /*----------------------------------------------------------------------------- */ { Display *disp = gtk_object_get_data(GTK_OBJECT(widget), "disp"); GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gdouble x, y; gint x_grab, y_grab; gint index_x = 0, index_y = 0; GdkModifierType state; GnomeCanvasPoints *points; GtkWidget *view_piv_display0 = gtk_object_get_data(GTK_OBJECT(disp->mwin), "view_piv_display0"); points = gnome_canvas_points_new(2); GtkMenu *menu = GTK_MENU (disp->display_popupmenu); gdk_window_get_pointer(event->window, &x_grab, &y_grab, &state); x = x_grab ; y = y_grab ; if (event->button == 1) { disp->xgrab_first = x; disp->ygrab_first = y; /* g_message ("canvas_display_button_press:: xgrab_first = %f ygrab_first = %f", */ /* disp->xgrab_first, disp->ygrab_first); */ /* * No mouse select */ if (m_select == NO_MS) { cursor = gdk_cursor_new (GDK_FLEUR ); gdk_window_set_cursor (disp->mwin->window, cursor); /* g_message ("canvas_display_button_press:: x_grab = %d y_grab = %d", */ /* x_grab, y_grab); */ /* g_message ("CANVAS_DISPLAY_BUTTON_PRESS:: x = %f y = %f", x, y); */ /* * select Area Of Interest */ } else if (m_select == AOI_MS) { /* * storige of original AOI */ disp->intreg->col_start_old = disp->pida->piv_par->col_start; disp->intreg->row_start_old = disp->pida->piv_par->row_start; /* g_message ("CANVAS_DISPLAY_BUTTON_PRESS (AOI):: x_grab = %d y_grab = %d", */ /* x_grab, y_grab); */ create_rect (disp, disp->xgrab_first / disp->zoom_factor, disp->ygrab_first / disp->zoom_factor); /* * select at single interrogation area */ } else if ((m_select == SINGLE_AREA_MS || m_select == DRAG_MS) && disp->img->exist_img) { canvas_display_button_press__SINGLE_AREA_MS (gpiv, disp, x / disp->zoom_factor, y / disp->zoom_factor); /* * select a single point */ } else if (m_select == SINGLE_POINT_MS && disp->img->exist_img) { canvas_display_button_press__SINGLE_POINT_MS (gpiv, disp, x / disp->zoom_factor, y / disp->zoom_factor); /* * select a vertical line */ } else if (m_select == V_LINE_MS && display_act->img->exist_img) { /* g_message ("CANVAS_DISPLAY_BUTTON_PRESS (V_LINE_MS) 11:: x_grab = %d y_grab = %d", */ /* x_grab, y_grab); */ if (gci_line != NULL) destroy_line(); create_line (disp, disp->xgrab_first / disp->zoom_factor, disp->ygrab_first / disp->zoom_factor, disp->xgrab_first / disp->zoom_factor, disp->ygrab_first / disp->zoom_factor); /* * select a horizontal line */ } else if (m_select == H_LINE_MS && disp->img->exist_img) { /* g_message ("CANVAS_DISPLAY_BUTTON_PRESS (H_LINE_MS) 1:: x_grab = %d y_grab = %d", */ /* x_grab, y_grab); */ if (gci_line != NULL) destroy_line(); create_line (disp, disp->xgrab_first / disp->zoom_factor, disp->ygrab_first / disp->zoom_factor, disp->xgrab_first / disp->zoom_factor, disp->ygrab_first / disp->zoom_factor); } else if ( m_select == ENABLE_POINT_MS ) { /* * Only active with piv data */ if (disp->pida->exist_piv && disp->display_piv /* && GTK_CHECK_MENU_ITEM(view_piv_display0)->active */ ) { search_nearest_index (disp, x, y, &index_x, &index_y, /* DATA_TYPE__INTREG); */ DATA_TYPE__PIV); disp->pida->piv_data->peak_no[index_y][index_x] = 1; update_vector (disp->pida, index_y, index_x); } /* * Enabling and disabling only active with piv data */ } else if ((m_select == DISABLE_POINT_MS || m_select == ENABLE_AREA_MS || m_select == DISABLE_AREA_MS) && disp->pida->exist_piv && disp->display_piv) { canvas_display_button_press__DISABLE_POINT_MS (disp, x, y); } else if (m_select == SPANLENGTH_MS && disp->img->exist_img) { if (gci_line != NULL) destroy_line(); create_line (disp, disp->xgrab_first / disp->zoom_factor, disp->ygrab_first / disp->zoom_factor, disp->xgrab_first / disp->zoom_factor, disp->ygrab_first / disp->zoom_factor); } else if (m_select == V_SPANLENGTH_MS && disp->img->exist_img) { if (gci_line != NULL) destroy_line(); create_line (disp, disp->xgrab_first / disp->zoom_factor, disp->ygrab_first / disp->zoom_factor, disp->xgrab_first / disp->zoom_factor, disp->ygrab_first / disp->zoom_factor); } else if (m_select == H_SPANLENGTH_MS && disp->img->exist_img) { if (gci_line != NULL) destroy_line(); create_line (disp, disp->xgrab_first / disp->zoom_factor, disp->ygrab_first / disp->zoom_factor, disp->xgrab_first / disp->zoom_factor, disp->ygrab_first / disp->zoom_factor); } else { g_warning(_("canvas_display_button_press: should not arrive here; m_select=%d"), m_select); } } else if (event->button == 3) { gtk_menu_popup (menu, NULL, NULL, NULL, NULL, event->button, event->time); } gnome_canvas_points_free(points); return TRUE; } gboolean canvas_display_button_release (GtkWidget *widget, GdkEventButton *event, gpointer data ) /*----------------------------------------------------------------------------- */ { Display *disp = gtk_object_get_data(GTK_OBJECT(widget), "disp"); GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); GtkWidget *view_piv_display0 = gtk_object_get_data(GTK_OBJECT(disp->mwin), "view_piv_display0"); gdouble x, y; gint x_grab, y_grab; gint i, j; GdkModifierType state; shift_pressed = event->state & GDK_SHIFT_MASK; gdk_window_get_pointer (event->window, &x_grab, &y_grab, &state); /* BUGFIX: repair for different mouse selections */ x = x_grab; y = y_grab; /* g_message ("canvas_display_button_release:: x = %f y = %f", x, y); */ if (event->button == 1) { if (m_select == AOI_MS && gci_aoi != NULL) { canvas_display_button_release__AOI_MS (disp, gpiv, view_piv_display0, (gdouble) (x), (gdouble) (y)); } else if ((m_select == V_LINE_MS || m_select == H_LINE_MS) && disp->img->exist_img) { /* g_message ("CANVAS_DISPLAY_BUTTON_RELEASE (HV_LINE):: x_grab = %d y_grab = %d", */ /* x_grab, y_grab); */ canvas_display_button_release__HVLINE_MS (disp, gpiv, view_piv_display0, (gdouble) (x), (gdouble) (y)); /* * analyse at single interrogation area */ } else if ((m_select == SINGLE_AREA_MS || m_select == DRAG_MS) && disp->img->exist_img) { canvas_display_button_release__SINGLE_AREA_MS(gpiv, disp, (gdouble) (x), (gdouble) (y)); } else if (m_select == ENABLE_AREA_MS && gci_aoi != NULL) { enable_col_end = x; enable_row_end = y; if (disp->pida->exist_piv) { for (i = 0; i < disp->pida->piv_data->ny; i++) { for (j = 0; j < disp->pida->piv_data->nx; j++) { if (disp->pida->piv_data->point_x[i][j] >= enable_col_start && disp->pida->piv_data->point_x[i][j] < enable_col_end && disp->pida->piv_data->point_y[i][j] >= enable_row_start && disp->pida->piv_data->point_y[i][j] < enable_row_end) { disp->pida->piv_data->peak_no[i][j] = 1; if (disp->display_piv) update_vector(disp->pida, i, j); } } } } if (gci_aoi != NULL) destroy_rect(); } else if (m_select == DISABLE_AREA_MS && gci_aoi != NULL) { enable_col_end = x; enable_row_end = y; if (disp->pida->exist_piv) { for (i = 0; i < disp->pida->piv_data->ny; i++) { for (j = 0; j < disp->pida->piv_data->nx; j++) { if (disp->pida->piv_data->point_x[i][j] >= enable_col_start && disp->pida->piv_data->point_x[i][j] < enable_col_end && disp->pida->piv_data->point_y[i][j] >= enable_row_start && disp->pida->piv_data->point_y[i][j] < enable_row_end) { disp->pida->piv_data->peak_no[i][j] = -1; disp->pida->piv_data->snr[i][j] = GPIV_SNR_DISABLE; if (disp->pida->post_par->set == TRUE) { disp->pida->piv_data->dx[i][j] = disp->pida->post_par->set_dx; disp->pida->piv_data->dy[i][j] = disp->pida->post_par->set_dx; } if (disp->display_piv) update_vector(disp->pida, i, j); } } } } if (gci_aoi != NULL) destroy_rect(); } else if (m_select == SPANLENGTH_MS && disp->img->exist_img && gci_line != NULL ) { gfloat hdist = abs ((x - disp->xgrab_first) / disp->zoom_factor); gfloat vdist = abs ((y - disp->ygrab_first) / disp->zoom_factor); gpiv_var->img_span_px = sqrt (hdist * hdist + vdist * vdist); if (gci_line != NULL) destroy_line (); gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->imgh->spinbutton_sscale_px), gpiv_var->img_span_px ); } else if (m_select == V_SPANLENGTH_MS && disp->img->exist_img && gci_line != NULL ) { gpiv_var->img_span_px = abs ((y - disp->ygrab_first) / disp->zoom_factor); if (gci_line != NULL) destroy_line (); gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->imgh->spinbutton_sscale_px), gpiv_var->img_span_px); } else if (m_select == H_SPANLENGTH_MS && disp->img->exist_img && gci_line != NULL ) { gpiv_var->img_span_px = abs ((x - disp->xgrab_first) / disp->zoom_factor); if (gci_line != NULL) destroy_line (); gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->imgh->spinbutton_sscale_px), gpiv_var->img_span_px); /* * No action */ } else if (m_select == GPIV_NONE || m_select == SINGLE_POINT_MS || m_select == ENABLE_POINT_MS || m_select == DISABLE_POINT_MS ) { cursor = gdk_cursor_new (GDK_DOTBOX); gdk_window_set_cursor (disp->mwin->window, cursor); } else { g_warning(_("canvas_display_button_release: should not arrive here; m_select=%d"), m_select); } } return TRUE; } gboolean canvas_display_leave_notify (GtkWidget *widget, GdkEventMotion *event, gpointer data ) /*----------------------------------------------------------------------------- */ { Display *disp = gtk_object_get_data(GTK_OBJECT(widget), "disp"); GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); GtkWidget *view_piv_display0 = gtk_object_get_data(GTK_OBJECT(disp->mwin), "view_piv_display0"); gnome_appbar_push(GNOME_APPBAR(disp->appbar), disp->msg_display_default); gnome_appbar_push(GNOME_APPBAR(gpiv->appbar), msg_default); if (m_select == SINGLE_POINT_MS && GTK_CHECK_MENU_ITEM(view_piv_display0)->active ) { if (!disp->intreg->exist_int) { update_intreg1(disp, m_select_index_y, m_select_index_x); update_intreg2(disp, m_select_index_y, m_select_index_x); } if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { show_all_intregs(disp); } if (disp->pida->exist_piv && disp->display_piv) { show_all_vectors(disp->pida); } } else if (m_select == DRAG_MS) { if (!disp->intreg->exist_int) { update_intreg1(disp, disp->index_y_old, disp->index_x_old); update_intreg2(disp, disp->index_y_old, disp->index_x_old); } } else if (m_select == SINGLE_AREA_MS && disp->intreg->exist_int) { if (!disp->intreg->exist_int) { update_intreg1(disp, 0, 0); update_intreg2(disp, 0, 0); } } else if (m_select == AOI_MS || m_select == V_LINE_MS || m_select == H_LINE_MS) { if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { show_all_intregs(disp); } if (disp->pida->exist_piv && disp->display_piv) { show_all_vectors(disp->pida); } if (gci_line != NULL) { gtk_object_destroy(GTK_OBJECT(gci_line)); gci_line = NULL; } } if (GDK_BUTTON1_MASK) { /* * Cancel AOI_MS selection */ if (m_select == AOI_MS) { if (gci_aoi != NULL) { disp->pida->piv_par->col_start = disp->intreg->col_start_old; disp->pida->piv_par->row_start = disp->intreg->row_start_old; gtk_spin_button_set_value(GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_colstart), disp->pida->piv_par->col_start); gtk_spin_button_set_value(GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_rowstart), disp->pida->piv_par->row_start); if (gci_aoi != NULL) destroy_rect(); } /* show_all_intregs(disp); */ } else if ( m_select == ENABLE_AREA_MS || m_select == DISABLE_AREA_MS) { enable_col_start = 0; enable_row_start = 0; enable_col_end = 0; enable_row_end = 0; if (gci_aoi != NULL) destroy_rect(); /* * Cancel V_LINE_MS, LINE_MS selection * (V_, H_) SPANLENGTH_MS */ } else if (m_select == V_LINE_MS || m_select == H_LINE_MS || m_select == SPANLENGTH_MS || m_select == V_SPANLENGTH_MS || m_select == H_SPANLENGTH_MS ) { if (gci_line != NULL) destroy_line(); } } /* * General */ if (cursor != NULL) { gdk_cursor_destroy(cursor); cursor = NULL; } if (disp->intreg->gci_intreg2[disp->index_y_old][disp->index_x_old] != NULL) { update_intreg2(disp, disp->index_y_old, disp->index_x_old); } if (disp->intreg->gci_intreg1[disp->index_y_old][disp->index_x_old] != NULL) { update_intreg1(disp, disp->index_y_old, disp->index_x_old); } disp->index_x_old = 0; disp->index_y_old = 0; return TRUE; } /* * Private display functions */ static void canvas_display_motion_notify__NO_MS (Display *disp, gint x, gint y, gint *index_x, gint *index_y ) /*----------------------------------------------------------------------------- * Moves pointer over the display canvas if no mouse selection (NO_MS) is set */ { GpivPivData *piv_data = disp->pida->piv_data; GpivPivData *piv_data_scaled = disp->pida->piv_data_scaled; GpivScalarData *vor_data = disp->pida->vor_data; GpivScalarData *vor_data_scaled = disp->pida->vor_data_scaled; GpivScalarData *sstrain_data = disp->pida->sstrain_data; GpivScalarData *sstrain_data_scaled = disp->pida->sstrain_data_scaled; GpivScalarData *nstrain_data = disp->pida->nstrain_data; GpivScalarData *nstrain_data_scaled = disp->pida->nstrain_data_scaled; GtkWidget *view_piv_display0 = gtk_object_get_data(GTK_OBJECT(disp->mwin), "view_piv_display0"); *index_y = 0; *index_x = 0; if ((disp->pida->exist_piv && disp->display_piv && GTK_CHECK_MENU_ITEM(view_piv_display0)->active && piv_data->ny == disp->intreg->data->ny && piv_data->nx == disp->intreg->data->nx && piv_data->point_y[0][0] == disp->intreg->data->point_y[0][0] && piv_data->point_x[0][0] == disp->intreg->data->point_x[0][0] && piv_data->point_y[piv_data->ny - 1][piv_data->nx - 1] == disp->intreg->data->point_y[disp->intreg->data->ny - 1] [disp->intreg->data->nx - 1] && piv_data->point_x[piv_data->ny - 1][piv_data->nx - 1] == disp->intreg->data->point_x[disp->intreg->data->ny - 1] [disp->intreg->data->nx - 1] ) || (disp->pida->exist_piv && disp->display_piv && !GTK_CHECK_MENU_ITEM(view_piv_display0)->active) ) { search_nearest_index(disp, x, y, index_x, index_y, DATA_TYPE__PIV); if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { highlight_intreg(*index_y, *index_x, disp); } if (disp->pida->exist_vor && disp->display_scalar == SHOW_SC_VORTICITY) { if (disp->pida->scaled_piv) { create_msg_display_with_pivscdata (piv_data_scaled, vor_data_scaled, "vor", *index_y, *index_x, disp->pida->scaled_piv); } else { create_msg_display_with_pivscdata (piv_data, vor_data, "vor", *index_y, *index_x, disp->pida->scaled_piv); } } else if (disp->pida->exist_sstrain && disp->display_scalar == SHOW_SC_SSTRAIN) { if (disp->pida->scaled_piv) { create_msg_display_with_pivscdata (piv_data_scaled, sstrain_data_scaled, "sstrain", *index_y, *index_x, disp->pida->scaled_piv); } else { create_msg_display_with_pivscdata (piv_data, sstrain_data, "sstrain", *index_y, *index_x, disp->pida->scaled_piv); } } else if (disp->pida->exist_nstrain && disp->display_scalar == SHOW_SC_NSTRAIN) { if (disp->pida->scaled_piv) { create_msg_display_with_pivscdata (piv_data_scaled, nstrain_data_scaled, "nstrain", *index_y, *index_x, disp->pida->scaled_piv); } else { create_msg_display_with_pivscdata (piv_data, nstrain_data, "nstrain", *index_y, *index_x, disp->pida->scaled_piv); } } else { if (disp->pida->scaled_piv) { create_msg_display_with_pivdata (piv_data_scaled, *index_y, *index_x, disp->pida->scaled_piv); } else { create_msg_display_with_pivdata (piv_data, *index_y, *index_x, disp->pida->scaled_piv); } } /* * piv data exist, but are not displayed * displays eventually piv-derived scalar data */ } else if ((disp->pida->exist_piv && !disp->display_piv && GTK_CHECK_MENU_ITEM(view_piv_display0)->active && piv_data->ny == disp->intreg->data->ny && piv_data->nx == disp->intreg->data->nx && piv_data->point_y[0][0] == disp->intreg->data->point_y[0][0] && piv_data->point_x[0][0] == disp->intreg->data->point_x[0][0] && piv_data->point_y[piv_data->ny - 1][piv_data->nx - 1] == disp->intreg->data->point_y[disp->intreg->data->ny - 1] [disp->intreg->data->nx - 1] && piv_data->point_x[piv_data->ny - 1][piv_data->nx - 1] == disp->intreg->data->point_x[disp->intreg->data->ny - 1] [disp->intreg->data->nx - 1] && ((disp->pida->exist_vor && disp->display_scalar == SHOW_SC_VORTICITY) || (disp->pida->exist_sstrain && disp->display_scalar == SHOW_SC_SSTRAIN) || (disp->pida->exist_nstrain && disp->display_scalar == SHOW_SC_NSTRAIN)) ) || (disp->pida->exist_piv && !disp->display_piv && !GTK_CHECK_MENU_ITEM(view_piv_display0)->active && ((disp->pida->exist_vor && disp->display_scalar == SHOW_SC_VORTICITY) || (disp->pida->exist_sstrain && disp->display_scalar == SHOW_SC_SSTRAIN) || (disp->pida->exist_nstrain && disp->display_scalar == SHOW_SC_NSTRAIN)) ) ) { search_nearest_index(disp, x, y, index_x, index_y, DATA_TYPE__PIV); if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { highlight_intreg(*index_y, *index_x, disp); } if (disp->pida->exist_vor && disp->display_scalar == SHOW_SC_VORTICITY) { if (disp->pida->scaled_piv) { create_msg_display_with_scdata(vor_data_scaled, "vor", *index_y, *index_x, disp->pida->scaled_piv); } else { create_msg_display_with_scdata(vor_data, "vor", *index_y, *index_x, disp->pida->scaled_piv); } } else if (disp->pida->exist_sstrain && disp->display_scalar == SHOW_SC_SSTRAIN) { if (disp->pida->scaled_piv) { create_msg_display_with_scdata(sstrain_data_scaled, "sstrain", *index_y, *index_x, disp->pida->scaled_piv); } else { create_msg_display_with_scdata(sstrain_data, "sstrain", *index_y, *index_x, disp->pida->scaled_piv); } } else if (disp->pida->exist_nstrain && disp->display_scalar == SHOW_SC_NSTRAIN) { if (disp->pida->scaled_piv) { create_msg_display_with_scdata(nstrain_data_scaled, "nstrain", *index_y, *index_x, disp->pida->scaled_piv); } else { create_msg_display_with_scdata(nstrain_data, "nstrain", *index_y, *index_x, disp->pida->scaled_piv); } } /* * PIV data (and resulting derivatives) do not exist are and not displayed * Interrogation area's are displayed */ } else if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { search_nearest_index(disp, x, y, index_x, index_y, DATA_TYPE__INTREG); highlight_intreg(*index_y, *index_x, disp); g_snprintf(msg_display, GPIV_MAX_CHARS, "x=%3.2f y=%3.2f i=%d j=%d ", disp->intreg->data->point_x[*index_y][*index_x], disp->intreg->data->point_y[*index_y][*index_x], *index_y, *index_x); /* * Only image is displayed */ } else if (disp->display_backgrnd == SHOW_BG_IMG1) { if (disp->pida->scaled_piv) { g_snprintf(msg_display, GPIV_MAX_CHARS, "xp=%d px ==> %5.4f m yp=%d px ==> %5.4f m img #1: pixval=%d", x, disp->img->image->header->s_scale * x * 1e-3 + disp->img->image->header->z_off_x, y, disp->img->image->header->s_scale * y * 1e-3 + disp->img->image->header->z_off_y, disp->img->image->frame1[y][x] ); } else { g_snprintf(msg_display, GPIV_MAX_CHARS, "xp=%d px yp=%d px img #1: pixval=%d", x, y, disp->img->image->frame1[y][x] ); } } else if (disp->display_backgrnd == SHOW_BG_IMG2) { if (disp->pida->scaled_piv) { g_snprintf(msg_display, GPIV_MAX_CHARS, "xp=%d px ==> %5.4f m yp=%d px ==> %5.4f m img #1: pixval=%d", x, disp->img->image->header->s_scale * x * 1e-3 + disp->img->image->header->z_off_x, y, disp->img->image->header->s_scale * y * 1e-3 + disp->img->image->header->z_off_y, disp->img->image->frame2[y][x] ); } else { g_snprintf(msg_display, GPIV_MAX_CHARS, "xp=%d px yp=%d px img #2: pixval=%d", x, y, disp->img->image->frame2[y][x] ); } } else { g_snprintf(msg_display, GPIV_MAX_CHARS, "No data are displayed"); } } static void canvas_display_button_release__AOI_MS (Display *disp, GpivConsole *gpiv, GtkWidget *view_piv_display0, gdouble x, gdouble y ) /*----------------------------------------------------------------------------- * Performs action on mouse button release when AOI_MS has been enabled */ { PivEval *eval = gpiv->piveval; gdouble l_col_start, l_col_end, l_row_start, l_row_end; if (gci_aoi != NULL) destroy_rect(); if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { destroy_all_intregs(disp); } /* g_message ("canvas_display_button_release__AOI_MS:: x = %f y = %f" */ /* " xgrab_first = %f ygrab_first = %f", */ /* x, y, disp->xgrab_first, disp->ygrab_first); */ if (x >= disp->xgrab_first) { l_col_start = disp->xgrab_first / disp->zoom_factor; l_col_end = x / disp->zoom_factor; disp->pida->piv_par->col_start = (gint) l_col_start; disp->pida->piv_par->col_end = (gint) l_col_end; } else { l_col_end = disp->xgrab_first / disp->zoom_factor; l_col_start = x / disp->zoom_factor; disp->pida->piv_par->col_end = (gint) l_col_end; disp->pida->piv_par->col_start = (gint) l_col_start; } if (y >= disp->ygrab_first) { l_row_start = disp->ygrab_first / disp->zoom_factor; l_row_end = y / disp->zoom_factor; disp->pida->piv_par->row_start = (gint) l_row_start; disp->pida->piv_par->row_end = (gint) l_row_end; } else { l_row_end = disp->ygrab_first / disp->zoom_factor; l_row_start = y / disp->zoom_factor; disp->pida->piv_par->row_end = (gint) l_row_end; disp->pida->piv_par->row_start = (gint) l_row_start; } gtk_spin_button_set_value (GTK_SPIN_BUTTON (eval->spinbutton_colstart), (gdouble)l_col_start); gtk_spin_button_set_value (GTK_SPIN_BUTTON (eval->spinbutton_colend), (gdouble) l_col_end); gtk_spin_button_set_value (GTK_SPIN_BUTTON (eval->spinbutton_rowstart), (gdouble) l_row_start); gtk_spin_button_set_value (GTK_SPIN_BUTTON (eval->spinbutton_rowend), (gdouble) l_row_end); if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { create_all_intregs (disp); } } static void canvas_display_motion_notify__DRAGINT_MS (Display *disp, gint x, gint y, gint *index_x, gint *index_y ) /*----------------------------------------------------------------------------- * displaces interrogation area nearest to pointer */ { if (disp->intreg->exist_int) { if (!disp->index_old) { disp->index_x_old = *index_x; disp->index_y_old = *index_y; disp->index_old = TRUE; } if (*index_x == disp->index_x_old && *index_y == disp->index_y_old) { gnome_canvas_item_set (GNOME_CANVAS_ITEM(disp->intreg-> gci_intreg1[*index_y][*index_x]), "x1", (double) x - disp->pida->piv_par->int_size_f / 2, "y1", (double) y - disp->pida->piv_par->int_size_f / 2, "x2", (double) x + disp->pida->piv_par->int_size_f / 2, "y2", (double) y + disp->pida->piv_par->int_size_f / 2, NULL); gnome_canvas_item_set (GNOME_CANVAS_ITEM(disp->intreg-> gci_intreg2[*index_y][*index_x]), "x1", (double) x - disp->pida->piv_par->int_size_i / 2 + disp->pida->piv_par->pre_shift_col, "y1", (double) y - disp->pida->piv_par->int_size_i / 2 + disp->pida->piv_par->pre_shift_row, "x2", (double) x + disp->pida->piv_par->int_size_i / 2 + disp->pida->piv_par->pre_shift_col, "y2", (double) y + disp->pida->piv_par->int_size_i / 2 + disp->pida->piv_par->pre_shift_row, NULL); /* * put the interrogation area back to its original location */ } else { update_intreg1(disp, disp->index_y_old, disp->index_x_old); update_intreg2(disp, disp->index_y_old, disp->index_x_old); } } } static void canvas_display_motion_notify__SINGLE_POINT_MS (Display *disp, gint x, gint y ) /*----------------------------------------------------------------------------- * Interrogates at a single arbitrary point in the image. * I am using the first interrogation area ([0][0]) temporarly for * displaying */ { GtkWidget *view_piv_display0 = gtk_object_get_data(GTK_OBJECT(disp->mwin), "view_piv_display0"); if (disp->intreg->gci_intreg1[0][0] != NULL && disp->intreg->gci_intreg2[0][0] != NULL ) { if (!GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { if (disp->intreg->gci_intreg1[0][0] != NULL) { gnome_canvas_item_show (GNOME_CANVAS_ITEM(disp->intreg->gci_intreg1[0][0])); } if (disp->intreg->gci_intreg2[0][0] != NULL) { gnome_canvas_item_show (GNOME_CANVAS_ITEM(disp->intreg->gci_intreg2[0][0])); } disp->display_intregs = TRUE; } if (disp->pida->exist_piv && disp->pida->scaled_piv) { g_snprintf(msg_display, GPIV_MAX_CHARS, "x=%3.2f mm y=%3.2f mm", (gfloat) x * disp->img->image->header->s_scale *10e2 + (gfloat) disp->img->image->header->z_off_x *10e2, (gfloat) y * disp->img->image->header->s_scale *10e2 + (gfloat) disp->img->image->header->z_off_y *10e2); } else { g_snprintf(msg_display, GPIV_MAX_CHARS, "x=%d px y=%d px", x, y); } gnome_canvas_item_set (GNOME_CANVAS_ITEM(disp->intreg->gci_intreg1[0][0]), "x1", (double) x - disp->pida->piv_par->int_size_f / 2, "y1", (double) y - disp->pida->piv_par->int_size_f / 2, "x2", (double) x + disp->pida->piv_par->int_size_f / 2, "y2", (double) y + disp->pida->piv_par->int_size_f / 2, NULL); gnome_canvas_item_set (GNOME_CANVAS_ITEM(disp->intreg->gci_intreg2[0][0]), "x1", (double) x - disp->pida->piv_par->int_size_f / 2 + disp->pida->piv_par->pre_shift_col, "y1", (double) y - disp->pida->piv_par->int_size_f / 2 + disp->pida->piv_par->pre_shift_row, "x2", (double) x + disp->pida->piv_par->int_size_f / 2 + disp->pida->piv_par->pre_shift_col, "y2", (double) y + disp->pida->piv_par->int_size_f / 2 + disp->pida->piv_par->pre_shift_row, NULL); } else { create_intreg1 (disp, 0, 0); create_intreg2 (disp, 0, 0); } } static char * canvas_display_button_press__SINGLE_AREA_MS (GpivConsole *gpiv, Display *disp, gint x, gint y ) /*----------------------------------------------------------------------------- * Performs action on mouse button press when SINGLE_AREA_MS has been enabled */ { char *err_msg = NULL; gint index_x = 0, index_y = 0; GtkWidget *view_piv_display0 = gtk_object_get_data(GTK_OBJECT(disp->mwin), "view_piv_display0"); if (disp->pida->exist_piv /* && GTK_CHECK_MENU_ITEM(view_piv_display0)->active */ /* && disp->intreg->data->nx == disp->pida->piv_data->nx */ /* && disp->intreg->data->ny == disp->pida->piv_data->ny */ ) { /* search_nearest_index(disp, x, y, &index_x, &index_y, */ /* DATA_TYPE__INTREG); */ search_nearest_index (disp, x, y, &index_x, &index_y, DATA_TYPE__PIV); if (m_select == SINGLE_AREA_MS) { /* if (disp->intreg->data->point_x[index_y][index_x] == */ /* disp->pida->piv_data->point_x[index_y][index_x] */ /* && disp->intreg->data->point_y[index_y][index_x] == */ /* disp->pida->piv_data->point_y[index_y][index_x] */ /* ) { */ m_select_index_x = index_x; m_select_index_y = index_y; /* gpiv_warning("canvas_display_button_press__SINGLE_AREA_MS:: index_x=%d index_y = %d", index_x, index_y); */ /* } else { */ /* set__NO_MS(gpiv, disp); */ /* err_msg = "Interrogation area's have to be at the same positions \nas the already existing piv data"; */ /* warning_gpiv(err_msg); */ /* return err_msg; */ /* } */ /* g_message("x=%d point_x=%d y=%d point_x=%d */ } else if (m_select == DRAG_MS) { m_select_index_x = index_x; m_select_index_y = index_y; disp->pida->piv_data->point_x[m_select_index_y] [m_select_index_x] = (float) x; disp->pida->piv_data->point_y[m_select_index_y] [m_select_index_x] = (float) y; /* BUGFIXED ? */ if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { disp->intreg->data->point_x[m_select_index_y] [m_select_index_x] = (float) x; disp->intreg->data->point_y[m_select_index_y] [m_select_index_x] = (float) y; } } else { err_msg = "canvas_display_button_press__SINGLE_AREA_MS: should not arrive here"; error_gpiv(err_msg); } } return err_msg; } static char * canvas_display_button_release__SINGLE_AREA_MS (GpivConsole *gpiv, Display *disp, gdouble x, gdouble y ) /*----------------------------------------------------------------------------- * Performs action on mouse button release when SINGLE_AREA_MS has been enabled */ { char *err_msg = NULL; gint index_x = 0, index_y = 0; GtkWidget *view_piv_display0 = gtk_object_get_data(GTK_OBJECT(disp->mwin), "view_piv_display0"); /* g_message ("canvas_display_button_release__SINGLE_AREA_MS:: x = %f y = %f" */ /* " xgrab_first = %f ygrab_first = %f " */ /* "m_select_index_x = %d m_select_index_y = %d", */ /* x, y, disp->xgrab_first, disp->ygrab_first, */ /* m_select_index_x, m_select_index_y */ /* ); */ if (disp->pida->exist_piv /* && GTK_CHECK_MENU_ITEM(view_piv_display0)->active */ /* && disp->intreg->data->nx == disp->pida->piv_data->nx */ /* && disp->intreg->data->ny == disp->pida->piv_data->ny */ ) { /* * There will only be action if the pointer, during pressing the button (as * defined in canvas_display_button_press__SINGLE_AREA_MS), is at identical * position as during releasing the button-> */ search_nearest_index(disp, (gint) x, (gint) y, &index_x, &index_y, DATA_TYPE__PIV); /* gpiv_warning("canvas_display_button_release__SINGLE_AREA_MS:: index_x=%d index_y = %d", index_x, index_y); */ if (m_select_index_x == index_x && m_select_index_y == index_y ) { gl_piv_par->int_point_col = m_select_index_x; gl_piv_par->int_point_row = m_select_index_y; disp->pida->piv_par = gpiv_piv_cp_parameters (gl_piv_par); /* g_message ("canvas_display_button_release__SINGLE_AREA_MS:: calling interrogate"); */ disp->pida->piv_data = interrogate_img (disp->img->image, disp->pida->piv_par, disp->pida->valid_par, gpiv); /* exec_piv (gpiv); */ /* g_message ("canvas_display_button_release__SINGLE_AREA_MS:: back from interrogate"); */ if (disp->pida->gci_vector[m_select_index_y][m_select_index_x] != NULL) { update_vector (disp->pida, m_select_index_y, m_select_index_x); } else { create_vector (disp->pida, m_select_index_y, m_select_index_x); } /* g_message ("canvas_display_button_release__SINGLE_AREA_MS:: display vector"); */ /* disp->pida->exist_piv = TRUE; */ disp->display_piv = TRUE; if (m_select == DRAG_MS) { if (disp->intreg-> gci_intreg1[m_select_index_y][m_select_index_x] != NULL) update_intreg1 (disp, m_select_index_y, m_select_index_x); if (disp->intreg-> gci_intreg2[m_select_index_y][m_select_index_x] != NULL) update_intreg2 (disp, m_select_index_y, m_select_index_x); } } else { err_msg = "moved pointer too far away from \nintar to be interrogated"; return err_msg; } } else { /* err_msg = "Interrogation area's and piv data must already exist \n and must be of identic quantity!"; */ err_msg = "Piv data must exist!"; warning_gpiv (err_msg); return err_msg; } if (!shift_pressed) set__NO_MS(gpiv, disp); return err_msg; } static void canvas_display_button_press__SINGLE_POINT_MS (GpivConsole *gpiv, Display *disp, gint x, gint y ) /*----------------------------------------------------------------------------- * Performs action on mouse button release when SINGLE_POINT_MS has * been enabled */ { GtkWidget *view_piv_display0 = gtk_object_get_data(GTK_OBJECT(disp->mwin), "view_piv_display0"); if (disp->pida->exist_piv) { destroy_all_vectors(disp->pida); gpiv_free_pivdata (disp->pida->piv_data); disp->pida->exist_piv = FALSE; if (disp->pida->scaled_piv) { gpiv_free_pivdata (disp->pida->piv_data_scaled); disp->pida->scaled_piv = FALSE; } } free_post_bufmems(disp); if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { destroy_all_intregs(disp); } m_select_index_x = 0; m_select_index_y = 0; disp->pida->piv_par->int_point_col = (float) x; disp->pida->piv_par->int_point_row = (float) y; disp->pida->piv_data = gpiv_alloc_pivdata (1, 1); disp->pida->exist_piv = TRUE; disp->pida->piv_data->point_x[0][0] = (float) x; disp->pida->piv_data->point_y[0][0] = (float) y; disp->intreg->data->nx = 1; disp->intreg->data->ny = 1; create_all_intregs(disp); disp->intreg->exist_int = TRUE; disp->intreg->data->point_x[0][0] = (float) x; disp->intreg->data->point_y[0][0] = (float) y; show_all_intregs(disp); disp->display_intregs = TRUE; disp->pida->piv_data = interrogate_img (disp->img->image, disp->pida->piv_par, disp->pida->valid_par, gpiv); disp->display_piv = TRUE; create_all_vectors(disp->pida); gnome_canvas_update_now(GNOME_CANVAS(disp->canvas)); if (!shift_pressed) set__NO_MS(gpiv, disp); } static void canvas_display_button_release__HVLINE_MS (Display *disp, GpivConsole *gpiv, GtkWidget *view_piv_display0, gdouble x, gdouble y ) /*----------------------------------------------------------------------------- * Performs action on mouse button release when H_LINE_MS or V_LINE_MS has * been enabled */ { gdouble l_col_start,l_col_end, l_row_start, l_row_end; gboolean reset_display_intregs; /* g_message ("canvas_display_button_release__HVLINE_MS:: x = %f y = %f" */ /* " xgrab_first = %f ygrab_first = %f", */ /* x, y, disp->xgrab_first, disp->ygrab_first); */ if (GTK_CHECK_MENU_ITEM (view_piv_display0)->active) { /* * Remove exixting intreg contours * Disable displaying temporarly to avoid several calls to * the 'on_spinbutton_piv_int' function */ destroy_all_intregs (disp); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_piv_display0), FALSE); reset_display_intregs = TRUE; } /* if (disp->pida->exist_piv) { */ /* destroy_all_vectors(disp->pida); */ /* disp->display_piv = FALSE; */ /* } */ m_select_index_x = 0; m_select_index_y = 0; /* * Vertical line selected */ if (m_select == V_LINE_MS) { if (y >= disp->ygrab_first) { l_row_start = (gdouble) (disp->ygrab_first / disp->zoom_factor); l_row_end = (gdouble) (y / disp->zoom_factor); disp->pida->piv_par->row_start = (gint) l_row_start; disp->pida->piv_par->row_end = (gint) l_row_end; disp->pida->piv_par->int_line_row_end = (gint) l_row_end; } else { l_row_start = (gdouble) (y / disp->zoom_factor); l_row_end = (gdouble) (disp->ygrab_first / disp->zoom_factor); disp->pida->piv_par->row_start = (gint) l_row_start; disp->pida->piv_par->row_end = (gint) l_row_end; disp->pida->piv_par->int_line_row_end = (gint) l_row_end; } l_col_start = (gdouble) (disp->xgrab_first / disp->zoom_factor - disp->pida->piv_par->int_size_i / 2 + 1); disp->pida->piv_par->col_start = (gint) l_col_start; l_col_end = (gdouble) (disp->xgrab_first / disp->zoom_factor + disp->pida->piv_par->int_size_i / 2 + disp->pida->piv_par->pre_shift_col); disp->pida->piv_par->col_end = (gint) l_col_end; /* * Horizontal line selected */ } else if (m_select == H_LINE_MS) { if (x >= disp->xgrab_first) { l_col_start = (gdouble) (disp->xgrab_first / disp->zoom_factor); l_col_end = (gdouble) (x / disp->zoom_factor); disp->pida->piv_par->col_start = (gint) l_col_start; disp->pida->piv_par->col_end = (gint) l_col_end; disp->pida->piv_par->int_line_col_end = (gint) l_col_end; } else { l_col_start = (gdouble) (x / disp->zoom_factor); l_col_end = (gdouble) (disp->xgrab_first / disp->zoom_factor); disp->pida->piv_par->col_start = (gint) l_col_start; disp->pida->piv_par->col_end = (gint) l_col_end; disp->pida->piv_par->int_line_col_end = (gint) l_col_end; } l_row_start = (gdouble) (disp->ygrab_first / disp->zoom_factor - disp->pida->piv_par->int_size_i / 2 + 1); disp->pida->piv_par->row_start = (gint) l_row_start; l_row_end = (gdouble) (disp->ygrab_first / disp->zoom_factor + disp->pida->piv_par->int_size_i / 2 + disp->pida->piv_par->pre_shift_col); disp->pida->piv_par->row_end = (gint) l_row_end; } else { g_warning("canvas_display_button_release__HVLINE_MS: H_LINE_MS or V_LINE_MS inactive"); } if (gci_line != NULL) destroy_line(); if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { create_all_intregs(disp); } /* * updating entry's for col/row_start_end */ /* g_message ("canvas_display_button_release__HVLINE_MS:: zoom_factor = %f col_start = %f col_end = %f" */ /* " row_start = %f row_end = %f", */ /* disp->zoom_factor, l_col_start, l_col_end, l_row_start, l_row_end); */ gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_colstart), (gdouble) l_col_start); gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_rowstart), (gdouble) l_row_start); gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_colend), (gdouble) l_col_end); /* * The last call to on_spinbutton_piv_int will update the contours of the intregs */ if (reset_display_intregs) { /* g_message ("release__HV:: resetting"); */ gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_piv_display0), TRUE); } gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_rowend), (gdouble) l_row_end); if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { /* create_all_intregs (disp); */ } } static void canvas_display_button_press__DISABLE_POINT_MS (Display *disp, gint x, gint y ) /*----------------------------------------------------------------------------- * Performs action on mouse button press when DISABLE_POINT_MS has * been enabled */ { gchar *err_msg; gint index_x = 0, index_y = 0; GtkWidget *view_piv_display0 = gtk_object_get_data(GTK_OBJECT(disp->mwin), "view_piv_display0"); if ( m_select == DISABLE_POINT_MS ) { if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active) { search_nearest_index(disp, x, y, &index_x, &index_y, DATA_TYPE__INTREG); } else { search_nearest_index(disp, x, y, &index_x, &index_y, DATA_TYPE__PIV); } disp->pida->piv_data->peak_no[index_y][index_x] = -1; disp->pida->piv_data->snr[index_y][index_x] = GPIV_SNR_DISABLE; if (disp->pida->post_par->set == TRUE) { disp->pida->piv_data->dx[index_y][index_x] = disp->pida->post_par->set_dx; disp->pida->piv_data->dy[index_y][index_x] = disp->pida->post_par->set_dx; } update_vector(disp->pida, index_y, index_x); } else if ( m_select == ENABLE_AREA_MS ) { enable_col_start = x; enable_row_start = y; assert( gci_aoi == NULL); gci_aoi = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS(disp->canvas)), gnome_canvas_rect_get_type(), "x1", (double) x, "y1", (double) y, "x2", (double) x, "y2", (double) y, "outline_color", "yellow", "width_units", (double) THICKNESS, NULL); } else if ( m_select == DISABLE_AREA_MS) { enable_col_start = x; enable_row_start = y; assert( gci_aoi == NULL); gci_aoi = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS(disp->canvas)), gnome_canvas_rect_get_type(), "x1", (double) x, "y1", (double) y, "x2", (double) x, "y2", (double) y, "outline_color", "yellow", "width_units", (double) THICKNESS, NULL); } else { err_msg = _("no image or piv data"); warning_gpiv(err_msg); } } static void set__NO_MS (GpivConsole *gpiv, Display *disp ) /*----------------------------------------------------------------------------- * Reset mouse selection to inactive */ { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (gpiv->piveval->radiobutton_mouse_1), TRUE); cursor = gdk_cursor_new (GDK_DOTBOX); gdk_window_set_cursor (disp->mwin->window, cursor); } static void search_nearest_index (Display *disp, gint x, gint y, gint *index_x, gint *index_y, gint data_type ) /*----------------------------------------------------------------------------- * Search nearest index belongin to x an y points */ { gint i, j, x_min = 10e4, y_min = 10e4, dif; if (data_type == DATA_TYPE__INTREG) { for (i = 0, j = 0; i < disp->intreg->data->ny; i++) { dif = abs(y - (int) disp->intreg->data->point_y[i][j]); if (dif < y_min) { y_min = dif; *index_y = i; } } for (i = 0, j = 0; j < disp->intreg->data->nx; j++) { dif = abs(x - (int) disp->intreg->data->point_x[i][j]); if (dif < x_min) { x_min = dif; *index_x = j; } } } else if (data_type == DATA_TYPE__PIV) { for (i = 0, j = 0; i < disp->pida->piv_data->ny; i++) { dif = abs(y - (int) disp->pida->piv_data->point_y[i][j]); if (dif < y_min) { y_min = dif; *index_y = i; } } for (i = 0, j = 0; j < disp->pida->piv_data->nx; j++) { dif = abs(x - (int) disp->pida->piv_data->point_x[i][j]); if (dif < x_min) { x_min = dif; *index_x = j; } } } else { g_warning("search_nearest_index: Inavalid Data Type"); } } static void highlight_intreg (gint index_y, gint index_x, Display *disp ) /*----------------------------------------------------------------------------- * Highlights first and second interrogation area's */ { GtkWidget *view_piv_display0 = gtk_object_get_data(GTK_OBJECT(disp->mwin), "view_piv_display0"); if (GTK_CHECK_MENU_ITEM(view_piv_display0)->active && index_y <= disp->intreg->data->ny && index_x <= disp->intreg->data->nx) { if (disp->intreg->gci_intreg1[disp->index_y_old][disp->index_x_old] != NULL) { gnome_canvas_item_set(disp->intreg->gci_intreg1 [disp->index_y_old][disp->index_x_old], "outline_color", "red", NULL); } if (disp->intreg->gci_intreg2[disp->index_y_old][disp->index_x_old] != NULL) { gnome_canvas_item_set(disp->intreg->gci_intreg2 [disp->index_y_old][disp->index_x_old], "outline_color", "blue", NULL); } if (disp->intreg->gci_intreg1[index_y][index_x] != NULL) { gnome_canvas_item_set(disp->intreg->gci_intreg1[index_y][index_x], "outline_color", "yellow", NULL); gnome_canvas_item_raise_to_top(disp->intreg-> gci_intreg1[index_y][index_x]); } if (disp->intreg->gci_intreg2[index_y][index_x] != NULL) { gnome_canvas_item_set(disp->intreg->gci_intreg2[index_y][index_x], "outline_color", "green", NULL); gnome_canvas_item_raise_to_top(disp->intreg-> gci_intreg2[index_y][index_x]); } } } static void create_msg_display_with_pivdata (GpivPivData *piv_data, gint index_y, gint index_x, gint scale ) /*----------------------------------------------------------------------------- * Displays message with piv data values */ { if (scale) { if (piv_data->snr[index_y][index_x] == GPIV_SNR_NAN) { g_snprintf (msg_display, GPIV_MAX_CHARS, "xp=%3.2fmm yp=%3.2fmm %s", piv_data->point_x[index_y][index_x] * 1e3, piv_data->point_y[index_y][index_x] * 1e3, _("Disabled: not a number")); } else if (piv_data->snr[index_y][index_x] == GPIV_SNR_DISABLE) { g_snprintf (msg_display, GPIV_MAX_CHARS, "xp=%3.2fmm yp=%3.2fmm %s", piv_data->point_x[index_y][index_x] * 1e3, piv_data->point_y[index_y][index_x] * 1e3, _("Disabled manually")); } else { g_snprintf (msg_display, GPIV_MAX_CHARS, "xp=%3.2fmm yp=%3.2fmm U=%3.2fm/s V=%3.2fm/s" " snr=%3.2f peak #%d", piv_data->point_x[index_y][index_x] * 1e3, piv_data->point_y[index_y][index_x] * 1e3, piv_data->dx[index_y][index_x], piv_data->dy[index_y][index_x], piv_data->snr[index_y][index_x], piv_data->peak_no[index_y][index_x]); } } else { if (piv_data->snr[index_y][index_x] == GPIV_SNR_NAN) { g_snprintf (msg_display, GPIV_MAX_CHARS, "xp=%3.0fpx yp=%3.0fpx %s", piv_data->point_x[index_y][index_x], piv_data->point_y[index_y][index_x], _("Disabled: not a number")); } else if (piv_data->snr[index_y][index_x] == GPIV_SNR_DISABLE) { g_snprintf (msg_display, GPIV_MAX_CHARS, "xp=%3.0fpx yp=%3.0fpx %s", piv_data->point_x[index_y][index_x], piv_data->point_y[index_y][index_x], _("Disabled manually")); } else { g_snprintf (msg_display, GPIV_MAX_CHARS, "xp=%3.0fpx yp=%3.0fpx dx=%3.2fpx dy=%3.2fpx" " snr=%3.2f peak #%d", piv_data->point_x[index_y][index_x], piv_data->point_y[index_y][index_x], piv_data->dx[index_y][index_x], piv_data->dy[index_y][index_x], piv_data->snr[index_y][index_x], piv_data->peak_no[index_y][index_x]); } } } static void create_msg_display_with_scdata (GpivScalarData *sc_data, gchar *sc_type, gint index_y, gint index_x, gint scale ) /*----------------------------------------------------------------------------- * Displays message with scalar data values */ { if (scale) { g_snprintf (msg_display, GPIV_MAX_CHARS, "xp=%3.2fmm yp=%3.2fmm %s=%3.2f1/s", sc_data->point_x[index_y][index_x] * 1e3, sc_data->point_y[index_y][index_x] * 1e3, sc_type, sc_data->scalar[index_y][index_x]); } else { g_snprintf (msg_display, GPIV_MAX_CHARS, "xp=%3.0fpx yp=%3.0fpx %s=%3.2f", sc_data->point_x[index_y][index_x], sc_data->point_y[index_y][index_x], sc_type, sc_data->scalar[index_y][index_x]); } } static void create_msg_display_with_pivscdata (GpivPivData *piv_data, GpivScalarData *sc_data, gchar *sc_type, gint index_y, gint index_x, gint scale ) /*----------------------------------------------------------------------------- * Displays message with piv and scalar data values */ { if (scale) { g_snprintf (msg_display, GPIV_MAX_CHARS, "xp=%3.2fmm yp=%3.2fmm U=%3.2fm/s V=%3.2fm/s " "snr=%3.2f peak #%d %s=%3.2f1/s", piv_data->point_x[index_y][index_x] * 1e3, piv_data->point_y[index_y][index_x] * 1e3, piv_data->dx[index_y][index_x], piv_data->dy[index_y][index_x], piv_data->snr[index_y][index_x], piv_data->peak_no[index_y][index_x], sc_type, sc_data->scalar[index_y][index_x]); } else { g_snprintf (msg_display, GPIV_MAX_CHARS, "xp=%3.0fpx yp=%3.0fpx dx=%3.2fpx dy=%3.2fpx " "snr=%3.2f peak #%d %s=%3.2f", piv_data->point_x[index_y][index_x], piv_data->point_y[index_y][index_x], piv_data->dx[index_y][index_x], piv_data->dy[index_y][index_x], piv_data->snr[index_y][index_x], piv_data->peak_no[index_y][index_x], sc_type, sc_data->scalar[index_y][index_x]); } } static void create_line (Display *disp, gint x1, gint y1, gint x2, gint y2 ) /*----------------------------------------------------------------------------- */ { GnomeCanvasPoints *points; points = gnome_canvas_points_new (2); /* g_message("CREATE_LINE:: x1 = %d y1 = %d x2 = %d y2 = %d", x1, y1, x2, y2); */ if (disp != NULL && gci_line == NULL) { points->coords[0] = x1; points->coords[1] = y1; points->coords[2] = x2; points->coords[3] = y2; gci_line = gnome_canvas_item_new (gnome_canvas_root(GNOME_CANVAS(disp->canvas)), gnome_canvas_line_get_type(), "points", points, "fill_color", "yellow", "width_units", (double) THICKNESS, NULL); gnome_canvas_points_free (points); } } static void update_line (gint x1, gint y1, gint x2, gint y2 ) /*----------------------------------------------------------------------------- */ { GnomeCanvasPoints *points; points = gnome_canvas_points_new (2); /* g_message("UPDATE_LINE:: x1 = %d y1 = %d x2 = %d y2 = %d", x1, y1, x2, y2); */ if (gci_line != NULL) { points->coords[0] = x1; points->coords[1] = y1; points->coords[2] = x2; points->coords[3] = y2; gnome_canvas_item_set (GNOME_CANVAS_ITEM(/* disp-> */gci_line), "points", points, "fill_color", "yellow", "width_units", (double) THICKNESS, NULL); gnome_canvas_points_free (points); } } static void destroy_line () /*----------------------------------------------------------------------------- */ { if (gci_line != NULL) { gtk_object_destroy(GTK_OBJECT (gci_line)); gci_line = NULL; } } static void create_rect (Display *disp, gint x, gint y ) /*----------------------------------------------------------------------------- */ { if (disp != NULL && gci_aoi == NULL) { /* g_message("CREATE_RECT:: x = %d y = %d", x, y); */ gci_aoi = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS(disp->canvas)), gnome_canvas_rect_get_type(), "x1", (double) x, "y1", (double) y, "x2", (double) x, "y2", (double) y, "outline_color", "yellow", "width_units", (double) THICKNESS, NULL); } } static void update_rect (gint x, gint y ) /*----------------------------------------------------------------------------- */ { if (gci_aoi != NULL) { gnome_canvas_item_set (GNOME_CANVAS_ITEM(gci_aoi), "x2", (double) x, "y2", (double) y, NULL); } } static void destroy_rect () /*----------------------------------------------------------------------------- */ { if (gci_aoi != NULL) { gtk_object_destroy (GTK_OBJECT (gci_aoi)); gci_aoi = NULL; } } gdouble gtk_adjustment_get_lower (GtkAdjustment *adjustment) { /* g_return_val_if_fail (GTK_IS_ADJUSTMENT (adjustment), 0.); */ return adjustment->lower; } static void pane_canvas (Display *disp, gfloat x, gfloat y ) /*----------------------------------------------------------------------------- */ { pane_canvas_x (disp, x); pane_canvas_y (disp, y); } static void pane_canvas_x (Display *disp, gfloat x ) /*----------------------------------------------------------------------------- */ { GtkAdjustment *adj = GTK_ADJUSTMENT (disp->hadj); /* gdouble adj_value = gtk_adjustment_get_value */ (GTK_ADJUSTMENT (disp->hadj)); gdouble diff; gdouble adj_new; diff = x - disp->xgrab_first; /* g_message ("PANE_CANVAS_X:: x = %f x_first = %f => diff = %f", */ /* x, disp->xgrab_first, diff); */ adj_new = (adj->value - diff); /* g_message ("PANE_CANVAS_X:: value = %f lower = %f upper = %f page_s = %f => adj_new = %f", */ /* adj->value, adj->lower, adj->upper, adj->page_size, adj_new); */ if (adj_new >= adj->lower && adj_new < adj->upper - adj->page_size) { /* g_message ("PANE_CANVAS_X:: passed if ()"); */ gtk_adjustment_set_value (GTK_ADJUSTMENT (disp->hadj), adj_new ); } } static void pane_canvas_y (Display *disp, gfloat y ) /*----------------------------------------------------------------------------- */ { GtkAdjustment *adj = GTK_ADJUSTMENT (disp->vadj); /* gdouble adj_value = gtk_adjustment_get_value */ /* (GTK_ADJUSTMENT (disp->vadj)); */ gdouble diff; gdouble adj_new; diff = y - disp->ygrab_first; adj_new = (adj->value - diff); if (adj_new >= 0 && adj_new < adj->upper - adj->page_size) { gtk_adjustment_set_value (GTK_ADJUSTMENT (disp->vadj), adj_new ); } } gpiv-0.6.1/src/display_event.h0000644000175000017500000000357211110307156013214 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ #ifndef DISPLAY_EVENT_H #define DISPLAY_EVENT_H gboolean canvas_display_enter_notify (GtkWidget *widget, GdkEventMotion *event, gpointer data ); gboolean canvas_display_motion_notify (GtkWidget *widget, GdkEventMotion *event, gpointer data ); gboolean canvas_display_button_press (GtkWidget *widget, GdkEventButton *event, gpointer data ); gboolean canvas_display_button_release (GtkWidget *widget, GdkEventButton *event, gpointer data ); gboolean canvas_display_leave_notify (GtkWidget *widget, GdkEventMotion *event, gpointer data ); #endif /* DISPLAY_EVENT_H */ gpiv-0.6.1/src/console.c0000644000175000017500000013315211110306254011777 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * (Callback) functions for console * $Log: console.c,v $ * Revision 1.30 2008-05-07 08:34:20 gerber * uses .h5 and .H5 extension for hdf files (previously: .gpi) * * Revision 1.29 2008-04-28 12:00:57 gerber * hdf-formatted files are now with .hdf extension (previously: .gpi) * * Revision 1.28 2007-12-19 08:42:35 gerber * debugged * * Revision 1.27 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.26 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.25 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.24 2007/02/05 15:17:09 gerber * auto stretching, broadcast display settings to buffers from preferences * * Revision 1.23 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.22 2006-09-18 07:27:03 gerber * *** empty log message *** * * Revision 1.21 2006/01/31 14:28:11 gerber * version 0.3.0 * * Revision 1.19 2005/02/26 09:43:30 gerber * parameter flags (parameter_logic) defined as gboolean * * Revision 1.18 2005/02/26 09:17:13 gerber * structured of interrogate function by using gpiv_piv_isiadapt * * Revision 1.17 2005/02/12 13:09:21 gerber * Changing some structure and constant names for DAC * * Revision 1.16 2005/01/19 15:53:41 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.15 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.14 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.13 2003/09/04 13:31:54 gerber * init of printing (unfinished) * * Revision 1.12 2003/09/01 11:17:14 gerber * improved monitoring of interrogation process * * Revision 1.11 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.10 2003/07/31 11:43:26 gerber * display images in gnome canvas (HOERAreset) * * Revision 1.9 2003/07/25 15:40:23 gerber * removed/disabled setting of correlation in Eval tab, Correlation type in Image info tab * * Revision 1.8 2003/07/13 14:38:18 gerber * changed error handling of libgpiv * * Revision 1.7 2003/07/12 21:21:15 gerber * changed error handling libgpiv * * Revision 1.5 2003/07/10 11:56:07 gerber * added man page * * Revision 1.4 2003/07/06 15:29:49 gerber * repair message text closing buffer * * Revision 1.3 2003/07/05 13:14:57 gerber * drag and drop of a _series_ of filenames from NAUTILUS * * Revision 1.2 2003/06/27 13:47:26 gerber * display ruler, line/point evaluation * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifdef HAVE_CONFIG_H # include #endif #include "support.h" #include "gpiv_gui.h" #include "console_interface.h" #include "dialog_interface.h" #include "console_menus.h" #include "console.h" #include "display.h" #ifdef ENABLE_DAC #include "dac.h" #endif /* ENABLE_DAC */ #ifdef ENABLE_TRIG #include "dac_trig.h" #endif /* ENABLE_TRIG */ #ifdef ENABLE_CAM #include "dac_cam.h" #endif /* ENABLE_CAM */ #include "piveval_interrogate.h" #include "pivvalid.h" #include "pivpost.h" #include "preferences.h" #include "print.h" #include "io.h" #include "utils.h" #define CHOOSER static void file_saveas_accept (GpivConsole *gpiv, const gchar *fname ); typedef enum _Format Format; enum _Format { RAW_ASCII, HDF, GPIV_DAVIS, }; static void exec_save (Display * disp); /* * Local functions */ static void exec_save (Display * disp) /*----------------------------------------------------------------------------- * Store all data in display_act->file_uri_name.h5 in hdf5 format */ { char *err_msg = NULL; char *fname_out_nosuf, *fname_par; gchar *uri_string_out, *uri_string_tmp; GnomeVFSURI *uri_out = NULL, *uri_tmp = NULL; /* * Create a valid uri_out to build the local or tmp fname_out_nosuf. * Type of suffix doesn't actually matter as the correct suffix will * be extended later to fname_out */ if (gpiv_par->verbose) g_message ("exec_save:: file_uri_name = %s", display_act->file_uri_name); uri_string_out = gnome_vfs_make_uri_from_input (g_strdup_printf ("%s%s" ,display_act->file_uri_name, GPIV_EXT_GPIV)); uri_out = gnome_vfs_uri_new (uri_string_out); g_free (uri_string_out); if (gnome_vfs_uri_is_local (uri_out)) { fname_out_nosuf = g_strdup_printf ("%s" , display_act->file_uri_name); if (gpiv_par->verbose) g_message ("exec_save:: LOCAL fname_out_nosuf = %s", fname_out_nosuf); } else { const gchar *tmp_dir = g_get_tmp_dir (); const gchar *user_name = g_get_user_name (); fname_out_nosuf = g_strdup_printf ("%s/%s/%s" , tmp_dir, user_name, strtok (gnome_vfs_uri_extract_short_name (uri_out), ".")); if (gpiv_par->verbose) g_message ("exec_save:: URI fname_out_suf for to tmp: %s", fname_out_nosuf); } /* return; */ if (gpiv_par->verbose) g_message ("exec_save:: STARTING THE REAL JOB"); if (gpiv_par->hdf) { write_hdf_img_data (fname_out_nosuf, uri_out); } else { /* * Store all data in ASCII format at different files */ #define SAVE_IMG #ifdef SAVE_IMG write_img (fname_out_nosuf, uri_out); #endif /* SAVE_IMG */ write_ascii_parameters (fname_out_nosuf, uri_out, GPIV_EXT_PAR); write_ascii_data (fname_out_nosuf, uri_out); } g_free (fname_out_nosuf); } /* * Main gpiv-gui callbacks */ void delete_console (GtkWidget *widget, GdkEvent *event, gpointer data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); guint i; GtkDialog *gpiv_exit = NULL; #ifdef ENABLE_TRIG exec_trigger_stop (); #endif /* ENABLE_TRIG */ #ifdef ENABLE_CAM exec_cam_stop (); #endif /* ENABLE_CAM */ if (nbufs > 0) { for (i = 0; i < nbufs; i++) { /* if (display[i] != NULL) display_act = display[i]; */ display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), i); if (!display_act->img->saved_img || !display_act->pida->saved_piv || !display_act->pida->saved_histo || !display_act->pida->saved_vor || !display_act->pida->saved_nstrain || !display_act->pida->saved_sstrain) { gpiv_exit = create_exit_dialog (); gtk_widget_show_all (GTK_WIDGET (gpiv_exit)); } else { free_all_bufmems (display_act); gtk_main_quit (); } } } else { gtk_main_quit (); } } void on_clist_buf_rowselect (GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data) /*----------------------------------------------------------------------------- */ { gchar *text; GpivConsole * gpiv = gtk_object_get_data (GTK_OBJECT (clist), "gpiv"); GList *lis; gint cnt = 0, buf_dum = 0; gboolean saved_img_local; if (!exec_process && GTK_CLIST (clist)->selection) { for (lis = GTK_CLIST (clist)->selection; lis; lis = lis->next) { row = GPOINTER_TO_INT (lis->data); /* g_message ("on_clist_buf_rowselect:: row = %d", row); */ gtk_clist_get_text (GTK_CLIST (clist), row, /* column */ 0, &text); display_act = gtk_clist_get_row_data (GTK_CLIST (clist /*= gpiv->clist_buf */), row); saved_img_local = display_act->img->saved_img; if (cnt == 0) { gpiv->first_selected_row = row; } else { gpiv->last_selected_row = row; } /* * BUGFIX: update variables of display before leaving the focus. * BUGFIX: Already done when creating display */ if (display_act->intreg->exist_int) { display_act->intreg->row_start_old = 0; display_act->intreg->col_start_old = 0; display_act->intreg->par->row_start = gl_piv_par->row_start; display_act->intreg->par->row_end = gl_piv_par->row_end; display_act->intreg->par->col_start = gl_piv_par->col_start; display_act->intreg->par->col_end = gl_piv_par->col_end; display_act->intreg->par->int_size_f = gl_piv_par->int_size_f; display_act->intreg->par->int_size_i = gl_piv_par->int_size_i; display_act->intreg->par->int_shift = gl_piv_par->int_shift; display_act->intreg->par->pre_shift_row = gl_piv_par->pre_shift_row; display_act->intreg->par->pre_shift_col = gl_piv_par->pre_shift_col; } /* if (GTK_WIDGET_REALIZED (display_act->pida.display)) */ /* display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), */ /* row); */ /* * Set variables of new active display equal to parameters */ if (display_act->intreg->exist_int && (display_act->intreg->par->row_start != gl_piv_par->row_start || display_act->intreg->par->row_end != gl_piv_par->row_end || display_act->intreg->par->col_start != gl_piv_par->col_start || display_act->intreg->par->col_end != gl_piv_par->col_end || display_act->intreg->par->int_size_f != gl_piv_par->int_size_f || display_act->intreg->par->int_size_i != gl_piv_par->int_size_i || display_act->intreg->par->int_shift != gl_piv_par->int_shift || display_act->intreg->par->pre_shift_row != gl_piv_par->pre_shift_row || display_act->intreg->par->pre_shift_col != gl_piv_par->pre_shift_col) ) { destroy_all_intregs (display_act); create_all_intregs (display_act); } if (display_act->mwin != NULL && GTK_WIDGET_VISIBLE (GTK_WIDGET (display_act->mwin)) ) { /* gchar *author = "Guppie GRAAF"; */ gdk_window_show (GTK_WIDGET (display_act->mwin)->window); gdk_window_raise (GTK_WIDGET (display_act->mwin)->window); /* * update labels and entries in image header tab/window */ update_imgh_entries (gpiv, display_act->img->image->header); display_act->img->saved_img = saved_img_local; update_eval_entries (gpiv, display_act->img->image->header); } cnt++; } if (cnt == 1) { gpiv->last_selected_row = gpiv->first_selected_row; } /* * exchange first and last */ if (gpiv->last_selected_row < gpiv->first_selected_row) { buf_dum = gpiv->last_selected_row; gpiv->last_selected_row = gpiv->first_selected_row; gpiv->first_selected_row = buf_dum; } } /* g_message("on_clist_buf_rowselect:: nbufs = %d, first=%d last = %d", */ /* nbufs, gpiv->first_selected_row, gpiv->last_selected_row); */ } void on_clist_buf_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint time) /*----------------------------------------------------------------------------- * load the data from selected uris with drag and drop */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *fname_in; gchar **uri_v; gint i; if (info != TARGET_URI_LIST) { g_message ("on_clist_buf_drag_data_received: info != TARGET_URI_LIST"); return; } if (selection_data == NULL) { g_message ("on_clist_buf_drag_data_received: selection_data == NULL"); return; } if(selection_data->length < 0) { g_message ("on_clist_buf_drag_data_received: selection_data->length < 0"); return; } uri_v = g_uri_list_extract_uris ((gchar *) selection_data->data); for (i = 0; uri_v[i] != NULL; i++) { if (gpiv_par->verbose) g_message ("on_clist_buf_drag_data_received:: uri_v[%d] = %s", i, uri_v[i]); fname_in = g_strdup (uri_v[i]); g_strchomp (fname_in); select_action_from_name (gpiv, fname_in); g_free (fname_in); } g_strfreev (uri_v); } void on_open_activate_response (GtkDialog *dialog, gint response, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT(dialog), "gpiv"); /* Display *disp = gtk_object_get_data (GTK_OBJECT(dialog), "display"); */ char *filename; g_assert ( response == GTK_RESPONSE_ACCEPT || response == GTK_RESPONSE_CANCEL); switch (response) { case GTK_RESPONSE_ACCEPT: filename = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); if (gpiv_par->verbose) g_message ("on_open_activate:: filename = %s", filename); select_action_from_name (gpiv, filename); g_free (filename); break; case GTK_RESPONSE_CANCEL: break; default: g_warning("on_open_activate_response: should not arrive here"); break; } } void on_open_activate (GtkMenuItem *menuitem, gpointer user_data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (menuitem), "gpiv"); GtkWidget *dialog; if (gpiv_par->verbose) g_message ("on_open_activate:: fname_last = %s", gpiv_var->fname_last); dialog = gtk_file_chooser_dialog_new ("Open Uri/File", GTK_WINDOW (gpiv->console), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog), FALSE); gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (dialog), gpiv_var->fname_last); #undef USE_CALLBACK #ifdef USE_CALLBACK /* Will not open dialog when pressing ^O */ g_signal_connect (dialog, "response", G_CALLBACK (on_open_activate_response), NULL); g_signal_connect_swapped (GTK_DIALOG (dialog), "response", G_CALLBACK (gtk_widget_destroy), dialog); gtk_object_set_data (GTK_OBJECT (dialog), "gpiv", gpiv); #else if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { char *filename; filename = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); if (gpiv_par->verbose) g_message ("on_open_activate:: filename = %s", filename); select_action_from_name (gpiv, filename); g_free (filename); } gtk_widget_destroy (dialog); #endif /* USE_CALLBACK */ #ifdef USE_CALLBACK #undef USE_CALLBACK #endif } void on_save_activate (GtkMenuItem * menuitem, gpointer user_data) /*----------------------------------------------------------------------------- */ { GpivConsole * gpiv = gtk_object_get_data (GTK_OBJECT (menuitem), "gpiv"); save_all_data (gpiv); } void on_save_as_activate (GtkMenuItem *menuitem, gpointer user_data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (menuitem), "gpiv"); GtkWidget *dialog; dialog = gtk_file_chooser_dialog_new ("Save as", GTK_WINDOW (gpiv->console), GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog), FALSE); gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (dialog), gpiv_var->fname_last); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { char *fname = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); if (gpiv_par->verbose) g_message ("on_save_as_activate:: fname = %s", fname); file_saveas_accept (gpiv, fname /* dialog */); g_free (fname); } gtk_widget_destroy (dialog); } static void file_saveas_accept (GpivConsole *gpiv, const gchar *fname ) /* ---------------------------------------------------------------------------- * Stores PIV image, data and related under different name */ { gchar *text_uri, *suffix; GnomeVFSURI* uri = NULL; gchar *fname_base; /* file name without suffix and directory name */ gchar *clist_buf_txt[MAX_BUFS][2], cl_int[3]; gboolean local_hdf_par; /* * Set gpiv_par->hdf if filename has suffix GPIV_EXT_GPIV. * Reset after calling exec_save. * Set saved_img to FALSE to guarantee saving image. */ suffix = g_strdup (strrchr (fname, '.')); if (strcmp (suffix, GPIV_EXT_GPIV) == 0) { local_hdf_par = gpiv_par->hdf; gpiv_par->img_fmt = IMG_FMT_HDF; } display_act->img->saved_img = FALSE; /* * Check if uri is local filesystem * create proper local filename or uri and short name */ text_uri = gnome_vfs_make_uri_from_shell_arg (fname); uri = gnome_vfs_uri_new (text_uri); g_free (text_uri); if (gnome_vfs_uri_is_local (uri)) { const gchar *path = gnome_vfs_uri_get_path (uri); gchar *dirname, /* directory name */ *fname_nosuf, /* filename including dirname/uri, without suffix */ *fname_home; /* filename with $HOME substituted by ~, without suffix */ fname_home = replace_home_dir_with_tilde (path); dirname = g_strdup (g_path_get_dirname (fname_home)); g_free (fname_home); /* dirname = g_strdup (g_path_get_dirname */ /* (replace_home_dir_with_tilde (path))); */ fname_base = g_strdup (strtok (/*g_path_get_basename (path) */ dirname, ".")); strtok (fname_base, "."); fname_nosuf = g_strdup (g_strconcat (dirname, G_DIR_SEPARATOR_S, fname_base, NULL)); fname_home = replace_home_dir_with_tilde (fname_nosuf); if (gpiv_par->verbose) g_message ("file_saveas_accept:: LOCAL dirname = %s fname_base = %s fname_home = %s", dirname, fname_base, fname_home); display_act->file_uri_name = g_strdup_printf ("%s", fname_home); g_free (dirname); g_free (fname_home); g_free (fname_nosuf); } else { fname_base = strtok (gnome_vfs_uri_extract_short_name (uri), "."); g_snprintf (display_act->file_uri_name, GPIV_MAX_CHARS, "%s", strtok (gnome_vfs_uri_to_string (uri, TRUE), ".")); } /* * Substituting file_uri_name in display_act * Changing fname in clist and in Image tab of the console * storing data of display_act * Resetting gpiv_par->hdf (and gpiv_par->img_fmt) */ gtk_clist_remove (GTK_CLIST (gpiv->clist_buf), display_act->id); g_snprintf (cl_int, 3, "%d", display_act->id); clist_buf_txt[display_act->id][0] = (gchar *) cl_int; clist_buf_txt[display_act->id][1] = fname_base; gtk_clist_insert (GTK_CLIST (gpiv->clist_buf), display_act->id, clist_buf_txt[display_act->id]); g_snprintf (display_act->msg_display_default, GPIV_MAX_CHARS, "%s", display_act->file_uri_name); gnome_appbar_set_default (GNOME_APPBAR (display_act->appbar), display_act->msg_display_default); update_imgh_entries (gpiv, display_act->img->image->header); exec_save (display_act); if (strcmp (suffix, GPIV_EXT_GPIV) == 0) { /* gpiv_par->hdf = local_hdf_par; */ gpiv_par->img_fmt = default_par->img_fmt; } g_free (suffix); g_free (fname_base); } void save_all_data (GpivConsole * gpiv) /*----------------------------------------------------------------------------- */ { guint row, ibuf; if (nbufs > 0) { for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; row++) { display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), row); ibuf = display_act->id; if (display[ibuf] != NULL && display_act->mwin != NULL && GTK_WIDGET_VISIBLE (GTK_WIDGET (display_act->mwin)) ) { gdk_window_show (GTK_WIDGET (display_act->mwin)->window); gdk_window_raise (GTK_WIDGET (display_act->mwin)->window); } exec_save (display_act); } } } void on_print_activate (GtkMenuItem * menuitem, gpointer user_data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (menuitem), "gpiv"); GtkDialog *gpiv_print_dialog = create_print_dialog (gpiv); gtk_widget_show (GTK_WIDGET (gpiv_print_dialog)); } void on_execute_activate (GtkMenuItem * menuitem, gpointer user_data) /*----------------------------------------------------------------------------- */ { GpivConsole * gpiv = gtk_object_get_data (GTK_OBJECT (menuitem), "gpiv"); guint row, ibuf; cancel_process = FALSE; #ifdef ENABLE_CAM #ifdef ENABLE_TRIG /* * RTA may trigger camera, but camera and RTAI trigger system may also be used * separately */ if (/* !cancel_process && */ gpiv_par->process__trig && gpiv_par->process__cam) { exec_cam_start (gpiv); exec_trigger_start (); if (trig_par->ttime->mode == GPIV_TIMER_MODE__DURATION) { gpiv->first_selected_row = 0; gpiv->last_selected_row = trig_par->ttime->cycles - 1; } } else if (/* !cancel_process && */ gpiv_par->process__cam) { exec_cam_start (gpiv); if (gl_cam_par->mode == GPIV_CAM_MODE__DURATION) { gpiv->first_selected_row = 0; gpiv->last_selected_row = gl_cam_par->cycles - 1; } } else if (/* !cancel_process && */ gpiv_par->process__trig) { exec_trigger_start (); } #else /* ENABLE_TRIG */ /* * RTA triggering disabled, only camera may be used */ if (/* !cancel_process && */ gpiv_par->process__cam) { exec_cam_start (gpiv); if (gl_cam_par->mode == GPIV_CAM_MODE__DURATION) { gpiv->first_selected_row = 0; gpiv->last_selected_row = gl_cam_par->cycles - 1; } } #endif /* ENABLE_TRIG */ #else /* ENABLE_CAM */ #ifdef ENABLE_TRIG /* * Only RTA triggering may be used, camera disabled */ if (/* !cancel_process && */ gpiv_par->process__trig) { exec_trigger_start (); } #endif /* ENABLE_TRIG */ #endif /* ENABLE_CAM */ if (nbufs > 0) { exec_process = TRUE; for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; row++) { display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), row); if (display[display_act->id] != NULL && GTK_WIDGET_VISIBLE (GTK_WIDGET (display_act->mwin)) ) { gdk_window_show (GTK_WIDGET (display_act->mwin)->window); gdk_window_raise (GTK_WIDGET (display_act->mwin)->window); } #ifdef ENABLE_IMGPROC if (!cancel_process && gpiv_par->process__imgproc) { exec_imgproc (gpiv); } #endif if (!cancel_process && gpiv_par->process__piv) { exec_piv (gpiv); } if (!cancel_process && gpiv_par->process__gradient) { exec_gradient (); } if (!cancel_process && gpiv_par->process__resstats) { gpiv_var->residu_stats = TRUE; exec_errvec (gpiv->pivvalid); } if (!cancel_process && gpiv_par->process__errvec) { gpiv_var->residu_stats = FALSE; exec_errvec (gpiv->pivvalid); } if (!cancel_process && gpiv_par->process__peaklock) { exec_peaklock (gpiv->pivvalid); } if (!cancel_process && gpiv_par->process__scale) { exec_scale (gpiv->pivpost); } if (!cancel_process && gpiv_par->process__average) { exec_savg (gpiv->pivpost); } if (!cancel_process && gpiv_par->process__subtract) { exec_subavg (gpiv->pivpost); } if (!cancel_process && gpiv_par->process__vorstra) { exec_vorstra (); } } exec_process = FALSE; } } void on_stop_activate (GtkMenuItem *menuitem, gpointer user_data) /*----------------------------------------------------------------------------- */ { /* warning_gpiv(_("process has been stopped")); */ } void on_button_stop_press (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { cancel_process = TRUE; message_gpiv (_("cancel_process = TRUE")); } void on_button_stop_release (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { cancel_process = FALSE; message_gpiv (_("cancel_process = FALSE")); /* process has been stopped */ } /* static gboolean */ /* on_display_delete(GtkWidget *widget, */ /* GdkEvent *event, */ /* gpointer data) */ /* { */ /* return FALSE; */ /* } */ void on_close_activate (GtkMenuItem * menuitem, gpointer user_data) /*----------------------------------------------------------------------------- * Remove multiple selected displays */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (menuitem), "gpiv"); Display *disp = NULL; gchar *err_msg; guint row; guint row_close = gpiv->first_selected_row; /* row to be closed */ guint first = gpiv->first_selected_row; /* first_selected_row will be modified! */ guint last = gpiv->last_selected_row; /* last_selected_row will be modified! */ guint loc_nbufs = nbufs; gboolean buf_closed = TRUE; #ifdef ENABLE_CAM if ((err_msg = gpiv_cam_free_camvar (&cam_var)) != NULL) { error_gpiv ("from: on_close_activate\n from: gpiv_cam_free_camvar\n %s", err_msg); } #endif /* ENABLE_CAM */ if (nbufs > 0) { /* * Depending on the response if a display/buffer with unsaved data will be closed, * the same or next row in the clist_buf will taken for selecting next display. */ for (row = first; row <= last; row++) { if (!buf_closed) { if (row_close < nbufs - 1) { row_close++; } } disp = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), row_close); close_buffer__check_saved (gpiv, disp); /* * Check if a buffer has been closed */ if (loc_nbufs == nbufs) { buf_closed = FALSE; } else { buf_closed = TRUE; loc_nbufs = nbufs; } } } else { update_imgh_entries (gpiv, gl_image_par); update_eval_entries (gpiv, gl_image_par); } #ifdef ENABLE_IMGPROC set_imgproc_filtervar (gpiv, GPIV_IMGFI_SUBACK, nbufs - 1); #endif } void on_exit_activate (GtkMenuItem * menuitem, gpointer user_data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (menuitem), "gpiv"); GtkDialog *gpiv_exit; guint i; #ifdef ENABLE_TRIG exec_trigger_stop (); #endif /* ENABLE_TRIG */ #ifdef ENABLE_CAM exec_cam_stop (); #endif /* ENABLE_CAM */ if (nbufs > 0) { for (i = 0; i < nbufs; i++) { /* if (display[i] != NULL) display_act = display[i]; */ display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), i); if (!display_act->img->saved_img || !display_act->pida->saved_piv || !display_act->pida->saved_histo || !display_act->pida->saved_vor || !display_act->pida->saved_nstrain || !display_act->pida->saved_sstrain) { gpiv_exit = create_exit_dialog (); gtk_widget_show (GTK_WIDGET (gpiv_exit)); } else { free_all_bufmems (display_act); gtk_main_quit (); } } } else { gtk_main_quit (); } } void on_preferences_activate (GtkWidget * widget, gpointer user_data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); GtkDialog *preferences = NULL ; preferences = create_preferences (gpiv); } void on_about_activate (GtkMenuItem * menuitem, gpointer user_data) /*----------------------------------------------------------------------------- */ { GtkWidget *about; about = create_about (); } void on_manual_activate (GtkMenuItem * menuitem, gpointer user_data) /*----------------------------------------------------------------------------- */ { GError* error = NULL; if (!gnome_help_display ("index.html", NULL, &error)) { g_warning ("%s", error); g_error_free (error); } } /* * Gnome toolbar buttons */ void on_button_open_clicked (GtkButton *button, gpointer data) /*----------------------------------------------------------------------------- * Uses gtk2 */ { gchar *msg = "Opens PIV image"; GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (button), "gpiv"); GtkWidget *dialog = NULL; if (gpiv_par->verbose) g_message ("on_button_open_activate:: fname_last = %s", gpiv_var->fname_last); dialog = gtk_file_chooser_dialog_new ("Open Uri/File", GTK_WINDOW (gpiv->console), GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, NULL); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (dialog), FALSE); gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (dialog), gpiv_var->fname_last); if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) { char *filename = NULL; filename = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog)); if (gpiv_par->verbose) g_message ("on_button_open_activate:: filename = %s", filename); select_action_from_name (gpiv, filename); g_free (filename); } gtk_widget_destroy (dialog); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_menubar_activate (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); if (GTK_CHECK_MENU_ITEM (widget)->active) { gtk_widget_show (gpiv->menubar); } else { gtk_widget_hide (gpiv->menubar); } } void on_toolbuttons_activate (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); if (GTK_CHECK_MENU_ITEM (widget)->active) { gtk_widget_show (gpiv->toolbar1); /* gtk_widget_ref(settings_menu_gpiv_popup[1].widget); */ /* gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM */ /* (settings_menu_gpiv_popup[1].widget), */ /* TRUE); */ } else { gtk_widget_hide (gpiv->toolbar1); /* gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM */ /* (settings_menu_gpiv_popup[1].widget), */ /* FALSE); */ } } void on_gpivbuttons_activate (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); if (GTK_CHECK_MENU_ITEM (widget)->active) { gtk_widget_show (gpiv->handlebox1); } else { gtk_widget_hide (gpiv->handlebox1); } } void on_tabulator_activate (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); if (GTK_CHECK_MENU_ITEM (widget)->active) { gtk_widget_show (gpiv->notebook); } else { gtk_widget_hide (gpiv->notebook); } } void on_tooltip_activate (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); if (GTK_CHECK_MENU_ITEM (widget)->active) { gtk_tooltips_enable (gpiv->tooltips ); } else { gtk_tooltips_disable (gpiv->tooltips ); } } void on_buffer_set_focus (GtkWindow * window, GtkWidget * widget, gpointer user_data) /*----------------------------------------------------------------------------- */ { /* SEE: on_clist_buf_rowselect */ } void gtk_window_destroy (GtkButton * button, gpointer user_data) /*----------------------------------------------------------------------------- */ { } void on_appbar_display_user_response (GnomeAppBar * gnomeappbar, gpointer user_data) /*----------------------------------------------------------------------------- */ { } void on_button_open_enter (GtkContainer * container, GtkDirectionType direction, gpointer user_data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (container), "gpiv"); gchar *msg = _("Opens image/PIV data (and display)"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_save_enter (GtkContainer * container, GtkDirectionType direction, gpointer user_data) {/*----------------------------------------------------------------------------- */ GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (container), "gpiv"); gchar *msg = _("Saves data"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_print_enter (GtkContainer * container, GtkDirectionType direction, gpointer user_data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (container), "gpiv"); gchar *msg = _("Prints selected buffer(s)"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_execute_enter (GtkContainer * container, GtkDirectionType direction, gpointer user_data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (container), "gpiv"); gchar *msg = _("Executes all tickmarked processes"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_stop_enter (GtkContainer * container, GtkDirectionType direction, gpointer user_data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (container), "gpiv"); gchar *msg = _("Cancels any running processes"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_close_enter (GtkContainer * container, GtkDirectionType direction, gpointer user_data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (container), "gpiv"); gchar *msg = _("Close active buffer(s)"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_exit_enter (GtkContainer * container, GtkDirectionType direction, gpointer user_data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (container), "gpiv"); gchar *msg = _("Exits GPIV"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } #ifdef ENABLE_CAM void on_toolbar_checkbutton_cam (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- * toolbar containing checkbutton for recording process */ { if (GTK_TOGGLE_BUTTON (widget)->active) { gpiv_par->process__cam = TRUE; } else { gpiv_par->process__cam = FALSE; } } #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG void on_toolbar_checkbutton_trig (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- * toolbar containing checkbutton for triggering process */ { if (GTK_TOGGLE_BUTTON (widget)->active) { gpiv_par->process__trig = TRUE; } else { gpiv_par->process__trig = FALSE; } } #endif /* ENABLE_TRIG */ #ifdef ENABLE_IMGPROC void on_toolbar_checkbutton_imgproc (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- * toolbar containing checkbutton for image process */ { if (GTK_TOGGLE_BUTTON (widget)->active) { gpiv_par->process__imgproc = TRUE; } else { gpiv_par->process__imgproc = FALSE; } } #endif /* ENABLE_IMGPROC */ void on_toolbar_checkbutton_piv (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- * toolbar containing checkbutton for processes */ { if (GTK_TOGGLE_BUTTON (widget)->active) { gpiv_par->process__piv = TRUE; } else { gpiv_par->process__piv = FALSE; } } void on_toolbar_checkbutton_gradient (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON (widget)->active) { gpiv_par->process__gradient = TRUE; } else { gpiv_par->process__gradient = FALSE; } } void on_toolbar_checkbutton_resstats (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON (widget)->active) { gpiv_par->process__resstats = TRUE; gpiv_var->residu_stats = TRUE; } else { gpiv_par->process__resstats = FALSE; gpiv_var->residu_stats = FALSE; } } void on_toolbar_checkbutton_errvec (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON (widget)->active) { gpiv_par->process__errvec = TRUE; } else { gpiv_par->process__errvec = FALSE; } } void on_toolbar_checkbutton_peaklck (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON (widget)->active) { gpiv_par->process__peaklock = TRUE; } else { gpiv_par->process__peaklock = FALSE; } } void on_toolbar_checkbutton_scale (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON (widget)->active) { gpiv_par->process__scale = TRUE; } else { gpiv_par->process__scale = FALSE; } } void on_toolbar_checkbutton_average (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON (widget)->active) { gpiv_par->process__average = TRUE; } else { gpiv_par->process__average = FALSE; } } void on_toolbar_checkbutton_subavg (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON (widget)->active) { gpiv_par->process__subtract = TRUE; } else { gpiv_par->process__subtract = FALSE; } } void on_toolbar_checkbutton_vorstra (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON (widget)->active) { gpiv_par->process__vorstra = TRUE; } else { gpiv_par->process__vorstra = FALSE; } } /* PivData *pida_active = &display_act->pida; */ void on_button_quit_no_clicked (GtkButton * button, gpointer user_data) /*----------------------------------------------------------------------------- * exit, message dialog callbacks */ { /* gnome_dialog_close (GTK_DIALOG (gpiv_exit)); */ /* * Gnome2: */ /* gtk_widget_destroy (GTK_DIALOG (GTK_DIALOG (gpiv_exit))); */ } void on_button_quit_gpiv_yes_clicked (GtkButton * button, gpointer user_data) /*----------------------------------------------------------------------------- */ { free_all_bufmems (display_act); gtk_main_quit (); } /* void */ /* on_button_message_clicked (GtkButton * button, */ /* gpointer user_data) */ /* BUGFIX: obsolete function: on_button_message_clicked; clean up */ void on_button_message_clicked (GtkDialog *dialog, gint response, gpointer data ) /*----------------------------------------------------------------------------- */ { g_assert (response == GTK_RESPONSE_ACCEPT); switch (response) { case GTK_RESPONSE_ACCEPT: /* gnome_dialog_close (GNOME_DIALOG (gpiv_exit)); */ /* gtk_widget_destroy (GTK_DIALOG (gpiv_exit)); */ default: g_warning ("on_message_clicked: should not arrive here"); break; } } void on_notebook_switch_page (GtkNotebook *notebook, GtkNotebookPage *page, gint page_num, gpointer user_data ) /*----------------------------------------------------------------------------- */ { gpiv_var->tab_pos = page_num; gnome_config_push_prefix ("/gpiv/RuntimeVariables/"); gnome_config_set_int ("tab_pos", gpiv_var->tab_pos); gnome_config_pop_prefix (); gnome_config_sync (); } gpiv-0.6.1/src/console.h0000644000175000017500000002377411110307401012007 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * General callbacks * $Log: console.h,v $ * Revision 1.13 2007-12-19 08:42:35 gerber * debugged * * Revision 1.12 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.11 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.10 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.9 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.8 2006-09-18 07:27:04 gerber * *** empty log message *** * * Revision 1.7 2006/01/31 14:28:11 gerber * version 0.3.0 * * Revision 1.6 2005/01/19 15:53:41 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.5 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.4 2003/09/04 13:31:55 gerber * init of printing (unfinished) * * Revision 1.3 2003/09/01 11:17:14 gerber * improved monitoring of interrogation process * * Revision 1.2 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef CONSOLE_H #define CONSOLE_H GtkWidget *gpiv_exit; /* * Callback functions for main */ void on_clist_buf_rowselect (GtkWidget *clist, gint row, gint column, GdkEventButton *event, gpointer data); void on_clist_buf_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *selection_data, guint info, guint time); void delete_console (GtkWidget *widget, GdkEvent *event, gpointer data); /* * Select sub-menu */ void select_all (gpointer data, guint action, GtkWidget *widget); void select_none (gpointer data, guint action, GtkWidget *widget); void on_open_activate (GtkMenuItem *menuitem, gpointer user_data); void on_save_activate (GtkMenuItem *menuitem, gpointer user_data); void save_all_data (GpivConsole *gpiv); void on_print_activate (GtkMenuItem *menuitem, gpointer user_data); void on_execute_activate (GtkMenuItem *menuitem, gpointer user_data); void on_stop_activate (GtkMenuItem *menuitem, gpointer user_data); void on_close_activate (GtkMenuItem *menuitem, gpointer user_data); void on_save_as_activate (GtkMenuItem *menuitem, gpointer user_data); /* void */ /* file_saveas_ok_sel(GtkWidget *widget, */ /* GtkFileSelection * fs */ /* ); */ void file_saveas_ok_sel (GpivConsole *gpiv, GtkWidget *dialog ); void on_exit_activate (GtkMenuItem *menuitem, gpointer user_data); void on_close_buffer_activate (GtkMenuItem *menuitem, gpointer user_data); void on_preferences_activate (GtkWidget *widget, /* GtkMenuItem *menuitem, */ gpointer user_data); void on_about_activate (GtkMenuItem *menuitem, gpointer user_data); void on_manual_activate (GtkMenuItem *menuitem, gpointer user_data); void on_button_open_clicked (GtkButton *button, gpointer user_data); void on_menubar_activate (GtkWidget *widget, gpointer data); void on_toolbuttons_activate (GtkWidget *widget, gpointer data); void on_gpivbuttons_activate (GtkWidget *widget, gpointer data); void on_tabulator_activate (GtkWidget *widget, gpointer data); void on_tooltip_activate (GtkWidget *widget, gpointer data); void on_buffer_set_focus (GtkWindow *window, GtkWidget *widget, gpointer user_data); void gtk_window_destroy (GtkButton *button, gpointer user_data); void on_view_options_clicked (GtkButton *button, gpointer user_data); void on_appbar_display_user_response (GnomeAppBar *gnomeappbar, gpointer user_data); void on_button_open_enter (GtkContainer *container, GtkDirectionType direction, gpointer user_data); void on_button_save_enter (GtkContainer *container, GtkDirectionType direction, gpointer user_data); void on_button_print_enter (GtkContainer *container, GtkDirectionType direction, gpointer user_data); void on_button_execute_enter (GtkContainer *container, GtkDirectionType direction, gpointer user_data); void on_button_stop_enter (GtkContainer *container, GtkDirectionType direction, gpointer user_data); void on_button_stop_press (GtkWidget *widget, gpointer data); void on_button_stop_release (GtkWidget *widget, gpointer data); void on_button_close_enter (GtkContainer *container, GtkDirectionType direction, gpointer user_data); void on_button_exit_enter (GtkContainer *container, GtkDirectionType direction, gpointer user_data); /* * process toolbar callbacks */ #ifdef ENABLE_CAM void on_toolbar_checkbutton_cam (GtkWidget *widget, gpointer data); #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG void on_toolbar_checkbutton_trig (GtkWidget *widget, gpointer data); #endif /* ENABLE_TRIG */ #ifdef ENABLE_IMGPROC void on_toolbar_checkbutton_imgproc (GtkWidget *widget, gpointer data); #endif /* ENABLE_IMGPROC */ void on_toolbar_checkbutton_piv (GtkWidget *widget, gpointer data); void on_toolbar_checkbutton_gradient (GtkWidget *widget, gpointer data); void on_toolbar_checkbutton_resstats (GtkWidget *widget, gpointer data); void on_toolbar_checkbutton_errvec (GtkWidget *widget, gpointer data); void on_toolbar_checkbutton_peaklck (GtkWidget *widget, gpointer data); void on_toolbar_checkbutton_scale (GtkWidget *widget, gpointer data); void on_toolbar_checkbutton_average (GtkWidget *widget, gpointer data); void on_toolbar_checkbutton_subavg (GtkWidget *widget, gpointer data); void on_toolbar_checkbutton_vorstra (GtkWidget *widget, gpointer data); /* void */ /* on_button_quit_no_clicked (GtkButton *button, */ /* gpointer user_data); */ /* void */ /* on_button_quit_gpiv_yes_clicked (GtkButton *button, */ /* gpointer user_data); */ /* void */ /* on_button_message_clicked (GtkButton *button, */ /* gpointer user_data); */ /* void */ /* on_button_error_clicked (GtkButton *button, */ /* gpointer user_data); */ void on_button_message_clicked (GtkDialog *dialog, gint response, gpointer data ); void on_notebook_switch_page (GtkNotebook *notebook, GtkNotebookPage *page, gint page_num, gpointer user_data); #endif /* CONSOLE_H */ gpiv-0.6.1/src/piveval_interface.c0000644000175000017500000027003111110305610014014 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * PIV evaluation interface * $Log: piveval_interface.c,v $ * Revision 1.16 2008-04-28 12:00:57 gerber * hdf-formatted files are now with .hdf extension (previously: .gpi) * * Revision 1.15 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.14 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.13 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.12 2007-02-16 17:09:49 gerber * added Gauss weighting on I.A. and SPOF filtering (on correlation function) * * Revision 1.11 2007-01-29 11:27:44 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.10 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.8 2005/02/12 14:12:12 gerber * Changed tabular names and titles * * Revision 1.7 2005/01/19 15:53:42 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.6 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.5 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.4 2003/09/01 11:17:15 gerber * improved monitoring of interrogation process * * Revision 1.3 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.2 2003/07/25 15:40:24 gerber * removed/disabled setting of correlation in Eval tab, Correlation type in Image info tab * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifdef HAVE_CONFIG_H # include #endif #include "gpiv_gui.h" #include "utils.h" #include "piveval_interface.h" #include "piveval.h" PivEval * create_piveval (GnomeApp *main_window, GtkWidget *container ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (main_window), "gpiv"); PivEval *eval = g_new0 (PivEval, 1); eval->monitor = g_new0 (Monitor, 1); eval->monitor->pi_da = gpiv_alloc_pivdata (1, 1); eval->monitor->int_size_old = 0; eval->monitor->affine[0] = gpiv_var->piv_disproc_zoom; eval->monitor->affine[1] = 0.0; eval->monitor->affine[2] = 0.0; eval->monitor->affine[3] = gpiv_var->piv_disproc_zoom; eval->monitor->affine[4] = 0.0; eval->monitor->affine[5] = 0.0; eval->monitor->int_size_old = 0; eval->monitor->affine_vl[0] = gpiv_var->piv_disproc_vlength; eval->monitor->affine_vl[1] = 0.0; eval->monitor->affine_vl[2] = 0.0; eval->monitor->affine_vl[3] = gpiv_var->piv_disproc_vlength; eval->monitor->affine_vl[4] = 0.0; eval->monitor->affine_vl[5] = 0.0; eval->vbox_label = gtk_vbox_new (FALSE, 0); gtk_widget_ref (eval->vbox_label); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox_label", eval->vbox_label, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->vbox_label); gtk_container_add (GTK_CONTAINER (container), eval->vbox_label); eval->label_title = gtk_label_new(_("Piv image interrogation")); gtk_widget_ref(eval->label_title); gtk_object_set_data_full (GTK_OBJECT (main_window), "label_title", eval->label_title, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->label_title); gtk_box_pack_start (GTK_BOX (eval->vbox_label), eval->label_title, FALSE, FALSE, 0); /* * Scrolled window */ eval->vbox_scroll = gtk_vbox_new (FALSE, 0); gtk_widget_ref (eval->vbox_scroll); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox_scroll", eval->vbox_scroll, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->vbox_scroll); gtk_box_pack_start (GTK_BOX (eval->vbox_label), eval->vbox_scroll, TRUE, TRUE, 0); eval->scrolledwindow = gtk_scrolled_window_new (NULL, NULL); gtk_widget_ref (eval->scrolledwindow); gtk_object_set_data_full (GTK_OBJECT (main_window), "scrolledwindow", eval->scrolledwindow, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->scrolledwindow); gtk_box_pack_start (GTK_BOX (eval->vbox_scroll), eval->scrolledwindow, TRUE, TRUE, 0); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (eval->scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); eval->viewport = gtk_viewport_new (NULL, NULL); gtk_widget_ref (eval->viewport); gtk_object_set_data_full (GTK_OBJECT (main_window), "viewport", eval->viewport, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->viewport); gtk_container_add (GTK_CONTAINER (eval->scrolledwindow), eval->viewport); gtk_widget_set_size_request (GTK_WIDGET (eval->scrolledwindow), 410, 375); /* * main table for PIV */ eval->table = gtk_table_new (2, 8, FALSE); gtk_widget_ref (eval->table); gtk_object_set_data_full (GTK_OBJECT (main_window), "table", eval->table, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->table); gtk_container_add (GTK_CONTAINER (eval->viewport), eval->table); /* * table for entries of first, last and pre-shift columns/rows */ eval->table_aoi = gtk_table_new (4, 3, FALSE); gtk_widget_ref (eval->table_aoi); gtk_object_set_data_full (GTK_OBJECT (main_window), "table_aoi", eval->table_aoi, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->table_aoi); gtk_table_attach (GTK_TABLE (eval->table), eval->table_aoi, 0, 1, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); eval->label_colstart = gtk_label_new ( _("first col:")); gtk_widget_ref (eval->label_colstart); gtk_object_set_data_full (GTK_OBJECT (main_window), "label_colstart", eval->label_colstart, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->label_colstart); gtk_table_attach (GTK_TABLE (eval->table_aoi), eval->label_colstart, 0, 1, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); eval->label_colend = gtk_label_new ( _("last col:")); gtk_widget_ref (eval->label_colend); gtk_object_set_data_full (GTK_OBJECT (main_window), "label_colend", eval->label_colend, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->label_colend); gtk_table_attach (GTK_TABLE (eval->table_aoi), eval->label_colend, 1, 2, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); eval->label_preshiftcol = gtk_label_new ( _("pre-shift col:")); gtk_widget_ref (eval->label_preshiftcol); gtk_object_set_data_full (GTK_OBJECT (main_window), "label_preshiftcol", eval->label_preshiftcol, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->label_preshiftcol); gtk_table_attach (GTK_TABLE (eval->table_aoi), eval->label_preshiftcol, 2, 3, 0, 1, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); eval->label_rowstart = gtk_label_new ( _("first row:")); gtk_widget_ref (eval->label_rowstart); gtk_object_set_data_full (GTK_OBJECT (main_window), "label_rowstart", eval->label_rowstart, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->label_rowstart); gtk_table_attach (GTK_TABLE (eval->table_aoi), eval->label_rowstart, 0, 1, 2, 3, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); eval->label_rowend = gtk_label_new ( _("last row:")); gtk_widget_ref (eval->label_rowend); gtk_object_set_data_full (GTK_OBJECT (main_window), "label_rowend", eval->label_rowend, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->label_rowend); gtk_table_attach (GTK_TABLE (eval->table_aoi), eval->label_rowend, 1, 2, 2, 3, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); eval->label_preshiftrow = gtk_label_new ( _("pre-shift row:")); gtk_widget_ref (eval->label_preshiftrow); gtk_object_set_data_full (GTK_OBJECT (main_window), "label_preshiftrow", eval->label_preshiftrow, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->label_preshiftrow); gtk_table_attach (GTK_TABLE (eval->table_aoi), eval->label_preshiftrow, 2, 3, 2, 3, (GtkAttachOptions) (0), (GtkAttachOptions) (0), 0, 0); /* * spinner for colstart */ eval->spinbutton_adj_colstart = gtk_adjustment_new (gl_piv_par->col_start, 0, gl_image_par->ncolumns - 1, 1, 10, 10); eval->spinbutton_colstart = gtk_spin_button_new (GTK_ADJUSTMENT (eval->spinbutton_adj_colstart), 1, 0); gtk_widget_ref (eval->spinbutton_colstart); gtk_object_set_data_full (GTK_OBJECT (main_window), "spinbutton_colstart", eval->spinbutton_colstart, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->spinbutton_colstart); gtk_table_attach (GTK_TABLE (eval->table_aoi), eval->spinbutton_colstart, 0, 1, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (eval->spinbutton_colstart), TRUE); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_colstart), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_colstart), "var_type", "0" /* COL_START */); g_signal_connect (GTK_OBJECT (eval->spinbutton_colstart), "changed", G_CALLBACK (on_spinbutton_piv_int), eval->spinbutton_colstart); /* * spinner for colend */ eval->spinbutton_adj_colend = gtk_adjustment_new (gl_piv_par->col_end, 0, gl_image_par->ncolumns - 1, 1, 10, 10); eval->spinbutton_colend = gtk_spin_button_new (GTK_ADJUSTMENT (eval->spinbutton_adj_colend), 1, 0); gtk_widget_ref (eval->spinbutton_colend); gtk_object_set_data_full (GTK_OBJECT (main_window), "spinbutton_colend", eval->spinbutton_colend, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->spinbutton_colend); gtk_table_attach (GTK_TABLE (eval->table_aoi), eval->spinbutton_colend, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (eval->spinbutton_colend), TRUE); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_colend), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_colend), "var_type", "1" /* COL_END */); g_signal_connect (GTK_OBJECT (eval->spinbutton_colend), "changed", G_CALLBACK (on_spinbutton_piv_int), eval->spinbutton_colend); /* * spinner for preshiftcol */ eval->spinbutton_adj_preshiftcol = gtk_adjustment_new (gl_piv_par->pre_shift_col, (gint) -(gl_image_par->ncolumns - 1), gl_image_par->ncolumns - 1, 1, 10, 10); eval->spinbutton_preshiftcol = gtk_spin_button_new (GTK_ADJUSTMENT (eval->spinbutton_adj_preshiftcol), 1, 0); gtk_widget_ref (eval->spinbutton_preshiftcol); gtk_object_set_data_full (GTK_OBJECT (main_window), "spinbutton_preshiftcol", eval->spinbutton_preshiftcol, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->spinbutton_preshiftcol); gtk_table_attach (GTK_TABLE (eval->table_aoi), eval->spinbutton_preshiftcol, 2, 3, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (eval->spinbutton_preshiftcol), TRUE); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_preshiftcol), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_preshiftcol), "var_type", "2" /* PRE_SHIFT_COL */); g_signal_connect (GTK_OBJECT (eval->spinbutton_preshiftcol), "changed", G_CALLBACK (on_spinbutton_piv_int), eval->spinbutton_preshiftcol); /* * spinner for rowstart */ eval->spinbutton_adj_rowstart = gtk_adjustment_new (gl_piv_par->row_start, 0, gl_image_par->nrows - 1, 1, 10, 10); eval->spinbutton_rowstart = gtk_spin_button_new (GTK_ADJUSTMENT (eval->spinbutton_adj_rowstart), 1, 0); gtk_widget_ref (eval->spinbutton_rowstart); gtk_object_set_data_full (GTK_OBJECT (main_window), "spinbutton_rowstart", eval->spinbutton_rowstart, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->spinbutton_rowstart); gtk_table_attach (GTK_TABLE (eval->table_aoi), eval->spinbutton_rowstart, 0, 1, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (eval->spinbutton_rowstart), TRUE); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_rowstart), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_rowstart), "var_type", "3"/* (int *) ROWSTART */); g_signal_connect (GTK_OBJECT (eval->spinbutton_rowstart), "changed", G_CALLBACK (on_spinbutton_piv_int), eval->spinbutton_rowstart); /* * spinner for rowend */ eval->spinbutton_adj_rowend = gtk_adjustment_new (gl_piv_par->row_end, 0, gl_image_par->nrows - 1, 1, 10, 10); eval->spinbutton_rowend = gtk_spin_button_new (GTK_ADJUSTMENT (eval->spinbutton_adj_rowend), 1, 0); gtk_widget_ref (eval->spinbutton_rowend); gtk_object_set_data_full (GTK_OBJECT (main_window), "spinbutton_rowend", eval->spinbutton_rowend, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->spinbutton_rowend); gtk_table_attach (GTK_TABLE (eval->table_aoi), eval->spinbutton_rowend, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_rowend), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_rowend), "var_type", "4" /* ROWEND */); g_signal_connect (GTK_OBJECT (eval->spinbutton_rowend), "changed", G_CALLBACK (on_spinbutton_piv_int), eval->spinbutton_rowend); /* * spinner for preshiftrow */ eval->spinbutton_adj_preshiftrow = gtk_adjustment_new (gl_piv_par->pre_shift_row, (gint) - (gl_image_par->ncolumns - 1), gl_image_par->ncolumns - 1, 1, 10, 10); eval->spinbutton_preshiftrow = gtk_spin_button_new (GTK_ADJUSTMENT (eval->spinbutton_adj_preshiftrow), 1, 0); gtk_widget_ref (eval->spinbutton_preshiftrow); gtk_object_set_data_full (GTK_OBJECT (main_window), "spinbutton_preshiftrow", eval->spinbutton_preshiftrow, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->spinbutton_preshiftrow); gtk_table_attach (GTK_TABLE (eval->table_aoi), eval->spinbutton_preshiftrow, 2, 3, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_preshiftrow), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_preshiftrow), "var_type", "5" /* PRESHIFTROW */); g_signal_connect (GTK_OBJECT (eval->spinbutton_preshiftrow), "changed", G_CALLBACK (on_spinbutton_piv_int), eval->spinbutton_preshiftrow); /* * radio buttons and spinners for interrogation size 1 */ eval->hbox_intreg = gtk_hbox_new (FALSE, 0); gtk_widget_ref (eval->hbox_intreg); gtk_object_set_data_full (GTK_OBJECT (main_window), "hbox_intreg", eval->hbox_intreg, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->hbox_intreg); gtk_table_attach (GTK_TABLE (eval->table), eval->hbox_intreg, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); eval->frame_2 = gtk_frame_new ( _("Final Int Size")); gtk_widget_ref (eval->frame_2); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_2", eval->frame_2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->frame_2); gtk_box_pack_start (GTK_BOX (eval->hbox_intreg), eval->frame_2, TRUE, TRUE, 0); eval->vbox_intsize_f = gtk_vbox_new (FALSE, 0); gtk_widget_ref (eval->vbox_intsize_f); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox_intsize_f", eval->vbox_intsize_f, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->vbox_intsize_f); gtk_container_add (GTK_CONTAINER (eval->frame_2), eval->vbox_intsize_f); /* * spinner for interrogation size 1 */ eval->spinbutton_adj_intsize_f = gtk_adjustment_new (gl_piv_par->int_size_f, GPIV_MIN_INTERR_SIZE, GPIV_MAX_INTERR_SIZE, 1, 10, 10); eval->spinbutton_intsize_f = gtk_spin_button_new (GTK_ADJUSTMENT (eval->spinbutton_adj_intsize_f), 1, 0); gtk_widget_ref (eval->spinbutton_intsize_f); /* gtk_spin_button_set_numeric (eval->spinbutton_intsize_f, */ /* GTK_TOGGLE_BUTTON (eval->spinbutton_intsize_f)->active); */ gtk_object_set_data_full (GTK_OBJECT (main_window), "spinbutton_intsize_f", eval->spinbutton_intsize_f, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->spinbutton_intsize_f); gtk_box_pack_start (GTK_BOX (eval->vbox_intsize_f), eval->spinbutton_intsize_f, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_intsize_f), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_intsize_f), "var_type", "6" /* INT_SIZE_F */); g_signal_connect (GTK_OBJECT (eval->spinbutton_intsize_f), "changed", G_CALLBACK (on_spinbutton_piv_int), eval->spinbutton_intsize_f); /* * radio buttons for interrogation size 1 */ /* eval->radiobutton_intsize_f_1 = */ /* gtk_radio_button_new_with_label (eval->int_size_f_group, _("8")); */ /* eval->int_size_f_group = */ /* gtk_radio_button_group (GTK_RADIO_BUTTON */ /* (eval->radiobutton_intsize_f_1)); */ /* gtk_widget_ref (eval->radiobutton_intsize_f_1); */ /* gtk_object_set_data_full (GTK_OBJECT (main_window), */ /* "radiobutton_intsize_f_1", */ /* eval->radiobutton_intsize_f_1, */ /* (GtkDestroyNotify) gtk_widget_unref); */ /* gtk_widget_show (eval->radiobutton_intsize_f_1); */ /* gtk_box_pack_start (GTK_BOX (eval->vbox_intsize_f), */ /* eval->radiobutton_intsize_f_1, FALSE, FALSE, 0); */ /* gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_f_1), "intsize_f", */ /* "8"); */ /* gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_f_1), "var_type", */ /* "0"); */ /* g_signal_connect (GTK_OBJECT (eval->radiobutton_intsize_f_1), "toggled", */ /* G_CALLBACK (on_eval->radiobutton_int), NULL); */ eval->radiobutton_intsize_f_2 = gtk_radio_button_new_with_label (eval->int_size_f_group, _("16")); eval->int_size_f_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_intsize_f_2)); gtk_widget_ref (eval->radiobutton_intsize_f_2); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_intsize_f_2", eval->radiobutton_intsize_f_2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_intsize_f_2); gtk_box_pack_start (GTK_BOX (eval->vbox_intsize_f), eval->radiobutton_intsize_f_2, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_f_2), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_f_2), "intsize_f", "16"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_f_2), "var_type", "0"); g_signal_connect (GTK_OBJECT (eval->radiobutton_intsize_f_2), "toggled", G_CALLBACK (on_radiobutton_piv_int), NULL); eval->radiobutton_intsize_f_3 = gtk_radio_button_new_with_label (eval->int_size_f_group, _("32")); eval->int_size_f_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_intsize_f_3)); gtk_widget_ref (eval->radiobutton_intsize_f_3); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_intsize_f_3", eval->radiobutton_intsize_f_3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_intsize_f_3); gtk_box_pack_start (GTK_BOX (eval->vbox_intsize_f), eval->radiobutton_intsize_f_3, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_f_3), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_f_3), "intsize_f", "32"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_f_3), "var_type", "0"); g_signal_connect (GTK_OBJECT (eval->radiobutton_intsize_f_3), "toggled", G_CALLBACK (on_radiobutton_piv_int), NULL); eval->radiobutton_intsize_f_4 = gtk_radio_button_new_with_label (eval->int_size_f_group, _("64")); eval->int_size_f_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_intsize_f_4)); gtk_widget_ref (eval->radiobutton_intsize_f_4); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_intsize_f_4", eval->radiobutton_intsize_f_4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_intsize_f_4); gtk_box_pack_start (GTK_BOX (eval->vbox_intsize_f), eval->radiobutton_intsize_f_4, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_f_4), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_f_4), "intsize_f", "64"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_f_4), "var_type", "0"); g_signal_connect (GTK_OBJECT (eval->radiobutton_intsize_f_4), "toggled", G_CALLBACK (on_radiobutton_piv_int), NULL); eval->radiobutton_intsize_f_5 = gtk_radio_button_new_with_label (eval->int_size_f_group, _("128")); eval->int_size_f_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_intsize_f_5)); gtk_widget_ref (eval->radiobutton_intsize_f_5); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_intsize_f_5", eval->radiobutton_intsize_f_5, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_intsize_f_5); gtk_box_pack_start (GTK_BOX (eval->vbox_intsize_f), eval->radiobutton_intsize_f_5, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_f_5), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_f_5), "intsize_f", "128"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_f_5), "var_type", "0"); g_signal_connect (GTK_OBJECT (eval->radiobutton_intsize_f_5), "toggled", G_CALLBACK (on_radiobutton_piv_int), NULL); /* * radio buttons for interrogation size 2 */ eval->frame_3 = gtk_frame_new ( _("Initial Int Size")); gtk_widget_ref (eval->frame_3); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_3", eval->frame_3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->frame_3); gtk_box_pack_start (GTK_BOX (eval->hbox_intreg), eval->frame_3, TRUE, TRUE, 0); eval->vbox_intsize_i = gtk_vbox_new (FALSE, 0); gtk_widget_ref (eval->vbox_intsize_i); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox_intsize_i", eval->vbox_intsize_i, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->vbox_intsize_i); gtk_container_add (GTK_CONTAINER (eval->frame_3), eval->vbox_intsize_i); /* * spinner for interrogation size 2 */ eval->spinbutton_adj_intsize_i = gtk_adjustment_new (gl_piv_par->int_size_i, GPIV_MIN_INTERR_SIZE, GPIV_MAX_INTERR_SIZE, 1, 10, 10); eval->spinbutton_intsize_i = gtk_spin_button_new (GTK_ADJUSTMENT (eval->spinbutton_adj_intsize_i), 1, 0); gtk_widget_ref (eval->spinbutton_intsize_i); gtk_object_set_data_full (GTK_OBJECT (main_window), "spinbutton_intsize_i", eval->spinbutton_intsize_i, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->spinbutton_intsize_i); gtk_box_pack_start (GTK_BOX (eval->vbox_intsize_i), eval->spinbutton_intsize_i, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_intsize_i), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_intsize_i), "var_type", "7" /* INT_SIZE_I */); g_signal_connect (GTK_OBJECT (eval->spinbutton_intsize_i), "changed", G_CALLBACK (on_spinbutton_piv_int), eval->spinbutton_intsize_i); /* eval->radiobutton_intsize_i_1 = */ /* gtk_radio_button_new_with_label (eval->int_size_i_group, _("8")); */ /* eval->int_size_i_group = */ /* gtk_radio_button_group (GTK_RADIO_BUTTON */ /* (eval->radiobutton_intsize_i_1)); */ /* gtk_widget_ref (eval->radiobutton_intsize_i_1); */ /* gtk_object_set_data_full (GTK_OBJECT (main_window), */ /* "radiobutton_intsize_i_1", */ /* eval->radiobutton_intsize_i_1, */ /* (GtkDestroyNotify) gtk_widget_unref); */ /* gtk_widget_show (eval->radiobutton_intsize_i_1); */ /* gtk_box_pack_start (GTK_BOX (eval->vbox_intsize_i), */ /* eval->radiobutton_intsize_i_1, FALSE, FALSE, 0); */ /* gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_i_1), "eval", eval); */ /* gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_i_1), "intsize_i", */ /* "8"); */ /* gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_i_1), "var_type", */ /* "1"); */ /* g_signal_connect (GTK_OBJECT (eval->radiobutton_intsize_i_1), "toggled", */ /* G_CALLBACK (on_radiobutton_piv_int), NULL); */ eval->radiobutton_intsize_i_2 = gtk_radio_button_new_with_label (eval->int_size_i_group, _("16")); eval->int_size_i_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_intsize_i_2)); gtk_widget_ref (eval->radiobutton_intsize_i_2); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_intsize_i_2", eval->radiobutton_intsize_i_2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_intsize_i_2); gtk_box_pack_start (GTK_BOX (eval->vbox_intsize_i), eval->radiobutton_intsize_i_2, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_i_2), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_i_2), "intsize_i", "16"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_i_2), "var_type", "1"); g_signal_connect (GTK_OBJECT (eval->radiobutton_intsize_i_2), "toggled", G_CALLBACK (on_radiobutton_piv_int), NULL); eval->radiobutton_intsize_i_3 = gtk_radio_button_new_with_label (eval->int_size_i_group, _("32")); eval->int_size_i_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_intsize_i_3)); gtk_widget_ref (eval->radiobutton_intsize_i_3); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_intsize_i_3", eval->radiobutton_intsize_i_3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_intsize_i_3); gtk_box_pack_start (GTK_BOX (eval->vbox_intsize_i), eval->radiobutton_intsize_i_3, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_i_3), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_i_3), "intsize_i", "32"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_i_3), "var_type", "1"); g_signal_connect (GTK_OBJECT (eval->radiobutton_intsize_i_3), "toggled", G_CALLBACK (on_radiobutton_piv_int), NULL); eval->radiobutton_intsize_i_4 = gtk_radio_button_new_with_label (eval->int_size_i_group, _("64")); eval->int_size_i_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_intsize_i_4)); gtk_widget_ref (eval->radiobutton_intsize_i_4); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_intsize_i_4", eval->radiobutton_intsize_i_4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_intsize_i_4); gtk_box_pack_start (GTK_BOX (eval->vbox_intsize_i), eval->radiobutton_intsize_i_4, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_i_4), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_i_4), "intsize_i", "64"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_i_4), "var_type", "1"); g_signal_connect (GTK_OBJECT (eval->radiobutton_intsize_i_4), "toggled", G_CALLBACK (on_radiobutton_piv_int), NULL); eval->radiobutton_intsize_i_5 = gtk_radio_button_new_with_label (eval->int_size_i_group, _("128")); eval->int_size_i_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_intsize_i_5)); gtk_widget_ref (eval->radiobutton_intsize_i_5); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_intsize_i_5", eval->radiobutton_intsize_i_5, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_intsize_i_5); gtk_box_pack_start (GTK_BOX (eval->vbox_intsize_i), eval->radiobutton_intsize_i_5, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_i_5), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_i_5), "intsize_i", "128"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intsize_i_5) , "var_type", "1"); g_signal_connect (GTK_OBJECT (eval->radiobutton_intsize_i_5), "toggled", G_CALLBACK (on_radiobutton_piv_int), NULL); /* * radio buttons for shifted distance of interrogation areas */ eval->frame_4 = gtk_frame_new ( _("Shift")); gtk_widget_ref (eval->frame_4); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_4", eval->frame_4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->frame_4); gtk_box_pack_start (GTK_BOX (eval->hbox_intreg), eval->frame_4, TRUE, TRUE, 0); eval->vbox_shift = gtk_vbox_new (FALSE, 0); gtk_widget_ref (eval->vbox_shift); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox_shift", eval->vbox_shift, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->vbox_shift); gtk_container_add (GTK_CONTAINER (eval->frame_4), eval->vbox_shift); /* * spinner for interrogation shift */ eval->spinbutton_adj_intshift = gtk_adjustment_new(gl_piv_par->int_shift, GPIV_MIN_INTERR_SIZE / 2, GPIV_MAX_INTERR_SIZE, 1, 10, 10); eval->spinbutton_intshift = gtk_spin_button_new (GTK_ADJUSTMENT (eval->spinbutton_adj_intshift), 1, 0); gtk_widget_ref (eval->spinbutton_intshift); gtk_object_set_data_full (GTK_OBJECT (main_window), "spinbutton_intshift", eval->spinbutton_intshift, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->spinbutton_intshift); gtk_box_pack_start (GTK_BOX (eval->vbox_shift), eval->spinbutton_intshift, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_intshift), "eval" , eval); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_intshift), "var_type", "8" /* INT_SHIFT */); g_signal_connect (GTK_OBJECT (eval->spinbutton_intshift), "changed", G_CALLBACK (on_spinbutton_piv_int), eval->spinbutton_intshift); eval->radiobutton_intshift_1 = gtk_radio_button_new_with_label (eval->int_shift_group, _("8")); eval->int_shift_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_intshift_1)); gtk_widget_ref (eval->radiobutton_intshift_1); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_intshift_1", eval->radiobutton_intshift_1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_intshift_1); gtk_box_pack_start (GTK_BOX (eval->vbox_shift), eval->radiobutton_intshift_1, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intshift_1), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intshift_1), "intshift", "8"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intshift_1), "var_type", "2"); g_signal_connect (GTK_OBJECT (eval->radiobutton_intshift_1), "toggled", G_CALLBACK (on_radiobutton_piv_int), NULL); eval->radiobutton_intshift_2 = gtk_radio_button_new_with_label (eval->int_shift_group, _("16")); eval->int_shift_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_intshift_2)); gtk_widget_ref (eval->radiobutton_intshift_2); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_intshift_2", eval->radiobutton_intshift_2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_intshift_2); gtk_box_pack_start (GTK_BOX (eval->vbox_shift), eval->radiobutton_intshift_2, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intshift_2), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intshift_2), "intshift", "16"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intshift_2), "var_type", "2"); g_signal_connect (GTK_OBJECT (eval->radiobutton_intshift_2), "toggled", G_CALLBACK (on_radiobutton_piv_int), NULL); eval->radiobutton_intshift_3 = gtk_radio_button_new_with_label (eval->int_shift_group, _("32")); eval->int_shift_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_intshift_3)); gtk_widget_ref (eval->radiobutton_intshift_3); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_intshift_3", eval->radiobutton_intshift_3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_intshift_3); gtk_box_pack_start (GTK_BOX (eval->vbox_shift), eval->radiobutton_intshift_3, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intshift_3), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intshift_3), "intshift", "32"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intshift_3), "var_type", "2"); g_signal_connect (GTK_OBJECT (eval->radiobutton_intshift_3), "toggled", G_CALLBACK (on_radiobutton_piv_int), NULL); eval->radiobutton_intshift_4 = gtk_radio_button_new_with_label (eval->int_shift_group, _("64")); eval->int_shift_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_intshift_4)); gtk_widget_ref (eval->radiobutton_intshift_4); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_intshift_4", eval->radiobutton_intshift_4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_intshift_4); gtk_box_pack_start (GTK_BOX (eval->vbox_shift), eval->radiobutton_intshift_4, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intshift_4), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intshift_4), "intshift", "64"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intshift_4), "var_type", "2"); g_signal_connect (GTK_OBJECT (eval->radiobutton_intshift_4), "toggled", G_CALLBACK (on_radiobutton_piv_int), NULL); eval->radiobutton_intshift_5 = gtk_radio_button_new_with_label (eval->int_shift_group, _("128")); eval->int_shift_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_intshift_5)); gtk_widget_ref (eval->radiobutton_intshift_5); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_intshift_5", eval->radiobutton_intshift_5, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_intshift_5); gtk_box_pack_start (GTK_BOX (eval->vbox_shift), eval->radiobutton_intshift_5, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intshift_5), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intshift_5), "intshift", "128"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_intshift_5), "var_type", "2"); g_signal_connect (GTK_OBJECT (eval->radiobutton_intshift_5), "toggled", G_CALLBACK (on_radiobutton_piv_int), NULL); /* * radio button for mouse selecting */ eval->frame_1 = gtk_frame_new ( _("Mouse select")); gtk_widget_ref (eval->frame_1); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_1", eval->frame_1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->frame_1); gtk_table_attach (GTK_TABLE (eval->table), eval->frame_1, 1, 2, 0, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); eval->vbox_mouseselect = gtk_vbox_new (FALSE, 0); gtk_widget_ref (eval->vbox_mouseselect); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox_mouseselect", eval->vbox_mouseselect, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->vbox_mouseselect); gtk_container_add (GTK_CONTAINER (eval->frame_1), eval->vbox_mouseselect); eval->radiobutton_mouse_0 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("None")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_mouse_0)); gtk_widget_ref (eval->radiobutton_mouse_0); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_mouse_0", eval->radiobutton_mouse_0, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_mouse_0); gtk_box_pack_start (GTK_BOX (eval->vbox_mouseselect), eval->radiobutton_mouse_0, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_mouse_0), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_mouse_0), "mouse_select", "0" /* NO_MS */); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_0), "enter", G_CALLBACK (on_radiobutton_piv_mouse1_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_0), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_0), "toggled", G_CALLBACK (on_radiobutton_piv_mouse), NULL); eval->radiobutton_mouse_1 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("Area")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_mouse_1)); gtk_widget_ref (eval->radiobutton_mouse_1); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_mouse_1", eval->radiobutton_mouse_1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_mouse_1); gtk_box_pack_start (GTK_BOX (eval->vbox_mouseselect), eval->radiobutton_mouse_1, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_mouse_1), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_mouse_1), "mouse_select", "1" /* AOI_MS */); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_1), "enter", G_CALLBACK (on_radiobutton_piv_mouse2_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_1), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_1), "toggled", G_CALLBACK (on_radiobutton_piv_mouse), NULL); eval->radiobutton_mouse_2 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("Single int.")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_mouse_2)); gtk_widget_ref (eval->radiobutton_mouse_2); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_mouse_2", eval->radiobutton_mouse_2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_mouse_2); gtk_box_pack_start (GTK_BOX (eval->vbox_mouseselect), eval->radiobutton_mouse_2, FALSE, FALSE, 0); gtk_widget_hide (GTK_WIDGET (eval->radiobutton_mouse_2)); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_mouse_2), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_mouse_2), "mouse_select", "2" /* SINGLE_AREA_MS */); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_2), "enter", G_CALLBACK (on_radiobutton_piv_mouse3_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_2), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_2), "toggled", G_CALLBACK (on_radiobutton_piv_mouse), NULL); eval->radiobutton_mouse_3 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("Single point")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_mouse_3)); gtk_widget_ref (eval->radiobutton_mouse_3); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_mouse_3", eval->radiobutton_mouse_3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_mouse_3); gtk_box_pack_start (GTK_BOX (eval->vbox_mouseselect), eval->radiobutton_mouse_3, FALSE, FALSE, 0); gtk_widget_hide (GTK_WIDGET (eval->radiobutton_mouse_3)); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_mouse_3), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_mouse_3), "mouse_select", "3" /* SINGLE_POINT_MS */); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_3), "enter", G_CALLBACK (on_radiobutton_piv_mouse4_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_3), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_3), "toggled", G_CALLBACK (on_radiobutton_piv_mouse), NULL); eval->radiobutton_mouse_4 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("Drag int.")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_mouse_4)); gtk_widget_ref (eval->radiobutton_mouse_4); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_mouse_4", eval->radiobutton_mouse_4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_mouse_4); gtk_box_pack_start (GTK_BOX (eval->vbox_mouseselect), eval->radiobutton_mouse_4, FALSE, FALSE, 0); gtk_widget_hide (GTK_WIDGET (eval->radiobutton_mouse_4)); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_mouse_4), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_mouse_4), "mouse_select", "4" /* DRAG_MS */); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_4), "enter", G_CALLBACK (on_radiobutton_piv_mouse5_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_4), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_4), "toggled", G_CALLBACK (on_radiobutton_piv_mouse), NULL); eval->radiobutton_mouse_5 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("Vert. Line")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_mouse_5)); gtk_widget_ref (eval->radiobutton_mouse_5); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_mouse_5", eval->radiobutton_mouse_5, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_mouse_5); gtk_box_pack_start (GTK_BOX (eval->vbox_mouseselect), eval->radiobutton_mouse_5, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_mouse_5), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_mouse_5), "mouse_select", "5" /* V_LINE_MS */); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_5), "enter", G_CALLBACK (on_radiobutton_piv_mouse6_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_5), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_5), "toggled", G_CALLBACK (on_radiobutton_piv_mouse), NULL); eval->radiobutton_mouse_6 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("Hor. Line")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_mouse_6)); gtk_widget_ref (eval->radiobutton_mouse_6); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_mouse_6", eval->radiobutton_mouse_6, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_mouse_6); gtk_box_pack_start (GTK_BOX (eval->vbox_mouseselect), eval->radiobutton_mouse_6, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_mouse_6), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_mouse_6), "mouse_select", "6" /* H_LINE_MS */); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_6), "enter", G_CALLBACK (on_radiobutton_piv_mouse7_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_6), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_mouse_6), "toggled", G_CALLBACK (on_radiobutton_piv_mouse), NULL); /* * radio buttons for sub-pixel interpolation scheme */ eval->frame_5 = gtk_frame_new ( _("Sub-pixel Interpolation")); gtk_widget_ref (eval->frame_5); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_5", eval->frame_5, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->frame_5); gtk_table_attach (GTK_TABLE (eval->table), eval->frame_5, 0, 1, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); eval->vbox10 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (eval->vbox10); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox10", eval->vbox10, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->vbox10); gtk_container_add (GTK_CONTAINER (eval->frame_5), eval->vbox10); eval->radiobutton_fit_none = gtk_radio_button_new_with_label (eval->vbox10_group, _("None")); eval->vbox10_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_fit_none)); gtk_widget_ref (eval->radiobutton_fit_none); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_fit_none", eval->radiobutton_fit_none, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_fit_none); gtk_box_pack_start (GTK_BOX (eval->vbox10), eval->radiobutton_fit_none, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_none), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_none), "ifit", "0"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_none), "var_type", "0"); g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_none), "enter", G_CALLBACK (on_radiobutton_fit_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_none), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_none), "toggled", G_CALLBACK (on_toggle_piv), NULL); eval->radiobutton_fit_gauss = gtk_radio_button_new_with_label (eval->vbox10_group, _("Gauss")); eval->vbox10_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_fit_gauss)); gtk_widget_ref (eval->radiobutton_fit_gauss); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_fit_gauss", eval->radiobutton_fit_gauss, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_fit_gauss); gtk_box_pack_start (GTK_BOX (eval->vbox10), eval->radiobutton_fit_gauss, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_gauss), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_gauss), "ifit", "1"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_gauss), "var_type", "0"); g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_gauss), "enter", G_CALLBACK (on_radiobutton_fit_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_gauss), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_gauss), "toggled", G_CALLBACK (on_toggle_piv), NULL); eval->radiobutton_fit_power = gtk_radio_button_new_with_label (eval->vbox10_group, _("Power")); eval->vbox10_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_fit_power)); gtk_widget_ref (eval->radiobutton_fit_power); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_fit_power", eval->radiobutton_fit_power, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_fit_power); gtk_box_pack_start (GTK_BOX (eval->vbox10), eval->radiobutton_fit_power, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_power), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_power), "ifit", "2"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_power), "var_type", "0"); g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_power), "enter", G_CALLBACK (on_radiobutton_fit_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_power), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_power), "toggled", G_CALLBACK (on_toggle_piv), NULL); eval->radiobutton_fit_gravity = gtk_radio_button_new_with_label (eval->vbox10_group, _("Gravity")); eval->vbox10_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_fit_gravity)); gtk_widget_ref (eval->radiobutton_fit_gravity); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_fit_gravity", eval->radiobutton_fit_gravity, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_fit_gravity); gtk_box_pack_start (GTK_BOX (eval->vbox10), eval->radiobutton_fit_gravity, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_gravity), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_gravity), "ifit", "3"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_gravity), "var_type", "0"); g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_gravity), "enter", G_CALLBACK (on_radiobutton_fit_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_gravity), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_gravity), "toggled", G_CALLBACK (on_toggle_piv), NULL); /* eval->radiobutton_fit_marquardt = gtk_radio_button_new_with_label (eval->vbox10_group, _("Marquardt")); */ /* eval->vbox10_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_fit_marquardt)); */ /* gtk_widget_ref (eval->radiobutton_fit_marquardt); */ /* gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_fit_marquardt", eval->radiobutton_fit_marquardt, */ /* (GtkDestroyNotify) gtk_widget_unref); */ /* gtk_widget_show (eval->radiobutton_fit_marquardt); */ /* gtk_box_pack_start (GTK_BOX (eval->vbox10), eval->radiobutton_fit_marquardt, FALSE, FALSE, 0); */ /* gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_marquardt), */ /* "ifit", "4"); */ /* gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_marquardt), "eval", eval); */ /* gtk_object_set_data (GTK_OBJECT (eval->radiobutton_fit_marquardt), */ /* "var_type", "0"); */ /* g_signal_connect (GTK_OBJECT (eval->radiobutton_fit_marquardt), "toggled", */ /* G_CALLBACK (on_toggle_piv), */ /* NULL); */ /* * radio buttons for correlation peak number to be detected */ eval->frame_6 = gtk_frame_new ( _("Peak #")); gtk_widget_ref (eval->frame_6); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_6", eval->frame_6, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->frame_6); gtk_table_attach (GTK_TABLE (eval->table), eval->frame_6, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); eval->vbox11 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (eval->vbox11); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox11", eval->vbox11, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->vbox11); gtk_container_add (GTK_CONTAINER (eval->frame_6), eval->vbox11); eval->radiobutton_peak_1 = gtk_radio_button_new_with_label (eval->vbox11_group, _("1")); eval->vbox11_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_peak_1)); gtk_widget_ref (eval->radiobutton_peak_1); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_peak_1", eval->radiobutton_peak_1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_peak_1); gtk_box_pack_start (GTK_BOX (eval->vbox11), eval->radiobutton_peak_1, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_peak_1), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_peak_1), "peak", "1"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_peak_1), "var_type", "1"); g_signal_connect (GTK_OBJECT (eval->radiobutton_peak_1), "enter", G_CALLBACK (on_radiobutton_peak_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_peak_1), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_peak_1), "toggled", G_CALLBACK (on_toggle_piv), NULL); eval->radiobutton_peak_2 = gtk_radio_button_new_with_label (eval->vbox11_group, _("2")); eval->vbox11_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_peak_2)); gtk_widget_ref (eval->radiobutton_peak_2); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_peak_2", eval->radiobutton_peak_2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_peak_2); gtk_box_pack_start (GTK_BOX (eval->vbox11), eval->radiobutton_peak_2, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_peak_2), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_peak_2), "peak", "2"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_peak_2), "var_type", "1"); g_signal_connect (GTK_OBJECT (eval->radiobutton_peak_2), "enter", G_CALLBACK (on_radiobutton_peak_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_peak_2), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_peak_2), "toggled", G_CALLBACK (on_toggle_piv), NULL); eval->radiobutton_peak_3 = gtk_radio_button_new_with_label (eval->vbox11_group, _("3")); eval->vbox11_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_peak_3)); gtk_widget_ref (eval->radiobutton_peak_3); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_peak_3", eval->radiobutton_peak_3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_peak_3); gtk_box_pack_start (GTK_BOX (eval->vbox11), eval->radiobutton_peak_3, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_peak_3), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_peak_3), "peak", "3"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_peak_3), "var_type", "1"); g_signal_connect (GTK_OBJECT (eval->radiobutton_peak_3), "enter", G_CALLBACK (on_radiobutton_peak_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_peak_3), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_peak_3), "toggled", G_CALLBACK (on_toggle_piv), NULL); /* * additonal calculation schemes for correlation detection */ eval->frame_7 = gtk_frame_new ( _("Interrogation scheme")); gtk_widget_ref (eval->frame_7); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_7", eval->frame_7, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->frame_7); gtk_table_attach (GTK_TABLE (eval->table), eval->frame_7, 0, 1, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); eval->vbox12 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (eval->vbox12); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox12", eval->vbox12, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->vbox12); gtk_container_add (GTK_CONTAINER (eval->frame_7), eval->vbox12); /*---------------------------------------------------------------------------- * Change order! */ eval->radiobutton_imgdeform = gtk_radio_button_new_with_label (eval->vbox12_group, _("Image deformation")); eval->vbox12_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_imgdeform)); gtk_widget_ref (eval->radiobutton_imgdeform); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_imgdeform", eval->radiobutton_imgdeform, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_imgdeform); gtk_box_pack_start (GTK_BOX (eval->vbox12), eval->radiobutton_imgdeform, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_imgdeform), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_imgdeform), "var_type", "2" /* SCHEME */); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_imgdeform), "scheme", "4" /* GPIV_IMG_DEFORM */); g_signal_connect (GTK_OBJECT (eval->radiobutton_imgdeform), "enter", G_CALLBACK (on_radiobutton_interrogatescheme_imgdeform_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_imgdeform), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_imgdeform), "toggled", G_CALLBACK (on_toggle_piv), NULL); eval->radiobutton_centraldiff = gtk_radio_button_new_with_label (eval->vbox12_group, _("Central differential")); eval->vbox12_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_centraldiff)); gtk_widget_ref (eval->radiobutton_centraldiff); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_centraldiff", eval->radiobutton_centraldiff, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_centraldiff); gtk_box_pack_start (GTK_BOX (eval->vbox12), eval->radiobutton_centraldiff, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_centraldiff), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_centraldiff), "var_type", "2" /* SCHEME */); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_centraldiff), "scheme", "3" /* (GPIV_ZERO_OFF_CENTRAL) */); g_signal_connect (GTK_OBJECT (eval->radiobutton_centraldiff), "enter", G_CALLBACK (on_radiobutton_interrogatescheme_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_centraldiff), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_centraldiff), "toggled", G_CALLBACK (on_toggle_piv), NULL); eval->radiobutton_zerooff = gtk_radio_button_new_with_label (eval->vbox12_group, _("Zero offset")); eval->vbox12_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_zerooff)); gtk_widget_ref (eval->radiobutton_zerooff); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_zerooff", eval->radiobutton_zerooff, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_zerooff); gtk_box_pack_start (GTK_BOX (eval->vbox12), eval->radiobutton_zerooff, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_zerooff), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_zerooff), "var_type", "2" /* SCHEME */); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_zerooff), "scheme", "2" /* GPIV_ZERO_OFF_FORWARD */); g_signal_connect (GTK_OBJECT (eval->radiobutton_zerooff), "enter", G_CALLBACK (on_radiobutton_interrogatescheme_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_zerooff), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_zerooff), "toggled", G_CALLBACK (on_toggle_piv), NULL); eval->radiobutton_weightkernel = gtk_radio_button_new_with_label (eval->vbox12_group, _("Weight Kernel")); eval->vbox12_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_weightkernel)); gtk_widget_ref (eval->radiobutton_weightkernel); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_weightkernel", eval->radiobutton_weightkernel, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_weightkernel); gtk_box_pack_start (GTK_BOX (eval->vbox12), eval->radiobutton_weightkernel, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_weightkernel), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_weightkernel), "var_type", "2" /* SCHEME */); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_weightkernel), "scheme", "1" /* GPIV_LK_WEIGHT */); g_signal_connect (GTK_OBJECT (eval->radiobutton_weightkernel), "enter", G_CALLBACK (on_radiobutton_interrogatescheme_enter), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_weightkernel), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->radiobutton_weightkernel), "toggled", G_CALLBACK (on_toggle_piv), NULL); /* * radio buttons for cross-or auto correlation * defined in image header, not user definable */ eval->frame_8 = gtk_frame_new ( _("Correlation")); gtk_widget_ref (eval->frame_8); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_8", eval->frame_8, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->frame_8); gtk_table_attach (GTK_TABLE (eval->table), eval->frame_8, 1, 2, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); eval->vbox13 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (eval->vbox13); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox13", eval->vbox13, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->vbox13); gtk_container_add (GTK_CONTAINER (eval->frame_8), eval->vbox13); eval->radiobutton_cross_1 = gtk_radio_button_new_with_label (eval->vbox13_group, _("Auto")); eval->vbox13_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_cross_1)); gtk_widget_ref (eval->radiobutton_cross_1); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_cross_1", eval->radiobutton_cross_1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_cross_1); gtk_box_pack_start (GTK_BOX (eval->vbox13), eval->radiobutton_cross_1, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_cross_1), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_cross_1), "x_corr", "0"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_cross_1), "var_type", "5"); g_signal_connect (GTK_OBJECT (eval->radiobutton_cross_1), "toggled", G_CALLBACK (on_toggle_piv), NULL); eval->radiobutton_cross_2 = gtk_radio_button_new_with_label (eval->vbox13_group, _("Cross")); eval->vbox13_group = gtk_radio_button_group (GTK_RADIO_BUTTON (eval->radiobutton_cross_2)); gtk_widget_ref (eval->radiobutton_cross_2); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_cross_2", eval->radiobutton_cross_2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->radiobutton_cross_2); gtk_box_pack_start (GTK_BOX (eval->vbox13), eval->radiobutton_cross_2, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_cross_2), "eval", eval); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_cross_2), "x_corr", "1"); gtk_object_set_data (GTK_OBJECT (eval->radiobutton_cross_2), "var_type", "5"); g_signal_connect (GTK_OBJECT (eval->radiobutton_cross_2), "toggled", G_CALLBACK (on_toggle_piv), NULL); /* * Checkbutton for I.A. Gauss weighting */ eval->checkbutton_weight_ia = gtk_check_button_new_with_label ( _("Gauss weighting")); gtk_widget_ref (eval->checkbutton_weight_ia); gtk_object_set_data_full (GTK_OBJECT (main_window), "checkbutton_weight_ia", eval->checkbutton_weight_ia, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->checkbutton_weight_ia); gtk_box_pack_start (GTK_BOX (eval->vbox13), eval->checkbutton_weight_ia, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->checkbutton_weight_ia), "eval", eval); g_signal_connect (GTK_OBJECT (eval->checkbutton_weight_ia), "enter", G_CALLBACK (on_checkbutton_weight_ia_enter), NULL); g_signal_connect (GTK_OBJECT (eval->checkbutton_weight_ia), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->checkbutton_weight_ia), "toggled", G_CALLBACK (on_checkbutton_weight_ia), NULL); /* * Checkbutton for spof filtering */ eval->checkbutton_spof = gtk_check_button_new_with_label ( _("SPOF filtering")); gtk_widget_ref (eval->checkbutton_spof); gtk_object_set_data_full (GTK_OBJECT (main_window), "checkbutton_spof", eval->checkbutton_spof, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->checkbutton_spof); gtk_box_pack_start (GTK_BOX (eval->vbox13), eval->checkbutton_spof, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (eval->checkbutton_spof), "eval", eval); g_signal_connect (GTK_OBJECT (eval->checkbutton_spof), "enter", G_CALLBACK (on_checkbutton_spof_enter), NULL); g_signal_connect (GTK_OBJECT (eval->checkbutton_spof), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->checkbutton_spof), "toggled", G_CALLBACK (on_checkbutton_spof), NULL); /* * Monitoring the process by displaying interrogation area's in correlation * function */ eval->frame_monitor = gtk_frame_new ( _("Interrogation areas and correlation")); gtk_widget_ref (eval->frame_monitor); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_monitor", eval->frame_monitor, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->frame_monitor); gtk_table_attach (GTK_TABLE (eval->table), eval->frame_monitor, 0, 2, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); eval->table_monitor = gtk_table_new (2, 3, FALSE); gtk_widget_ref (eval->table_monitor); gtk_object_set_data_full (GTK_OBJECT (main_window), "table_monitor", eval->table_monitor, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->table_monitor); gtk_container_add (GTK_CONTAINER (eval->frame_monitor), eval->table_monitor); /* * gnome canvas interrogation area1 */ eval->frame_monitor_int1 = gtk_frame_new ( _("Int. area 1")); gtk_widget_ref (eval->frame_monitor_int1); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_monitor_int1", eval->frame_monitor_int1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->frame_monitor_int1); gtk_table_attach (GTK_TABLE (eval->table_monitor), eval->frame_monitor_int1, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_widget_set_size_request (GTK_WIDGET (eval->frame_monitor_int1), GPIV_MAX_INTERR_SIZE, GPIV_MAX_INTERR_SIZE + 25); #ifdef CANVAS_AA gtk_widget_push_visual (gdk_rgb_get_visual ()); gtk_widget_push_colormap (gdk_rgb_get_cmap ()); eval->canvas_monitor_int1 = gnome_canvas_new_aa (); #else gtk_widget_push_visual (gdk_imlib_get_visual ()); gtk_widget_push_colormap (NULL); eval->canvas_monitor_int1 = gnome_canvas_new (); #endif gtk_widget_pop_colormap (); gtk_widget_pop_visual (); gtk_widget_ref (eval->canvas_monitor_int1); gtk_object_set_data_full (GTK_OBJECT (main_window), "canvas_monitor_int1", eval->canvas_monitor_int1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->canvas_monitor_int1); gtk_container_add (GTK_CONTAINER (eval->frame_monitor_int1 ), eval->canvas_monitor_int1); /* * gnome canvas interrogation area2 */ eval->frame_monitor_int2 = gtk_frame_new ( _("Int. area 2")); gtk_widget_ref (eval->frame_monitor_int2); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_monitor_int2", eval->frame_monitor_int2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->frame_monitor_int2); gtk_table_attach (GTK_TABLE (eval->table_monitor), eval->frame_monitor_int2, 1, 2, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_widget_set_size_request (GTK_WIDGET (eval->frame_monitor_int2), GPIV_MAX_INTERR_SIZE, GPIV_MAX_INTERR_SIZE + 25); /* gtk_widget_push_visual (gdk_rgb_get_visual ()); */ /* gtk_widget_push_colormap (gdk_rgb_get_cmap ()); */ /* eval->canvas_monitor_int2 = gnome_canvas_new_aa (); */ #ifdef CANVAS_AA gtk_widget_push_visual (gdk_rgb_get_visual ()); gtk_widget_push_colormap (gdk_rgb_get_cmap ()); eval->canvas_monitor_int2 = gnome_canvas_new_aa (); #else gtk_widget_push_visual (gdk_imlib_get_visual ()); gtk_widget_push_colormap (NULL); eval->canvas_monitor_int2 = gnome_canvas_new (); #endif gtk_widget_pop_colormap (); gtk_widget_pop_visual (); gtk_widget_ref (eval->canvas_monitor_int2); gtk_object_set_data_full (GTK_OBJECT (main_window), "canvas_monitor_int2", eval->canvas_monitor_int2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->canvas_monitor_int2); gtk_container_add (GTK_CONTAINER (eval->frame_monitor_int2), eval->canvas_monitor_int2); /* * Gnome canvas display corr function */ eval->frame_monitor_cov = gtk_frame_new ( _("Correlation")); gtk_widget_ref (eval->frame_monitor_cov); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_monitor_cov", eval->frame_monitor_cov, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->frame_monitor_cov); gtk_table_attach (GTK_TABLE (eval->table_monitor), eval->frame_monitor_cov, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_widget_set_size_request (GTK_WIDGET (eval->frame_monitor_cov), GPIV_MAX_INTERR_SIZE, GPIV_MAX_INTERR_SIZE + 25); #ifdef CANVAS_AA gtk_widget_push_visual (gdk_rgb_get_visual ()); gtk_widget_push_colormap (gdk_rgb_get_cmap ()); eval->canvas_monitor_cov = gnome_canvas_new_aa (); #else gtk_widget_push_visual (gdk_imlib_get_visual ()); gtk_widget_push_colormap (NULL); eval->canvas_monitor_cov = gnome_canvas_new (); #endif gtk_widget_pop_colormap (); gtk_widget_pop_visual (); gtk_widget_ref (eval->canvas_monitor_cov); gtk_object_set_data_full (GTK_OBJECT (main_window), "canvas_monitor_cov", eval->canvas_monitor_cov, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->canvas_monitor_cov); gtk_container_add (GTK_CONTAINER (eval->frame_monitor_cov), eval->canvas_monitor_cov); /* * gnome canvas display values */ eval->frame_monitor_vec = gtk_frame_new ( _("Estimator")); gtk_widget_ref (eval->frame_monitor_vec); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_monitor_vec", eval->frame_monitor_vec, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->frame_monitor_vec); gtk_table_attach (GTK_TABLE (eval->table_monitor), eval->frame_monitor_vec, 1, 2, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_widget_set_size_request (GTK_WIDGET (eval->frame_monitor_vec), GPIV_MAX_INTERR_SIZE, GPIV_MAX_INTERR_SIZE + 25); #ifdef CANVAS_AA gtk_widget_push_visual (gdk_rgb_get_visual ()); gtk_widget_push_colormap (gdk_rgb_get_cmap ()); eval->canvas_monitor_vec = gnome_canvas_new_aa (); #else gtk_widget_push_visual (gdk_imlib_get_visual ()); gtk_widget_push_colormap (NULL); eval->canvas_monitor_vec = gnome_canvas_new (); #endif gtk_widget_pop_colormap (); gtk_widget_pop_visual (); gtk_widget_ref (eval->canvas_monitor_vec); gtk_object_set_data_full (GTK_OBJECT (main_window), "canvas_monitor_vec", eval->canvas_monitor_vec, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->canvas_monitor_vec); gtk_container_add (GTK_CONTAINER (eval->frame_monitor_vec), eval->canvas_monitor_vec); /* * Define button to switched on/off */ eval->hbox_monitor = gtk_hbox_new (FALSE, 0); gtk_widget_ref (eval->hbox_monitor); gtk_object_set_data_full (GTK_OBJECT (main_window), "hbox_monitor", eval->hbox_monitor, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->hbox_monitor); gtk_table_attach (GTK_TABLE (eval->table_monitor), eval->hbox_monitor, 0, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); eval->checkbutton_monitor = gtk_check_button_new_with_label ( _("Monitor")); gtk_widget_ref (eval->checkbutton_monitor); gtk_object_set_data_full (GTK_OBJECT (main_window), "checkbutton_monitor", eval->checkbutton_monitor, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->checkbutton_monitor); gtk_box_pack_start (GTK_BOX (eval->hbox_monitor), eval->checkbutton_monitor, TRUE, TRUE, 0); gtk_object_set_data (GTK_OBJECT (eval->checkbutton_monitor), "eval", eval); g_signal_connect (GTK_OBJECT (eval->checkbutton_monitor), "enter", G_CALLBACK (on_checkbutton_piv_monitor_enter), NULL); g_signal_connect (GTK_OBJECT (eval->checkbutton_monitor), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->checkbutton_monitor), "clicked", G_CALLBACK (on_checkbutton_piv_monitor), NULL); /* * spinner for zoom */ eval->label_monitor_zoom = gtk_label_new ( _("Zoom:")); gtk_widget_ref (eval->label_monitor_zoom); gtk_object_set_data_full (GTK_OBJECT (main_window), "eval_label_monitor_zoom", eval->label_monitor_zoom, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->label_monitor_zoom); gtk_box_pack_start (GTK_BOX (eval->hbox_monitor), eval->label_monitor_zoom, TRUE, TRUE, 0); eval->spinbutton_adj_monitor_zoom = gtk_adjustment_new (gpiv_var->piv_disproc_zoom, 0.5, 8, 0.5, 2, 8); eval->spinbutton_monitor_zoom = gtk_spin_button_new (GTK_ADJUSTMENT (eval->spinbutton_adj_monitor_zoom), 1, 1); gtk_widget_ref (eval->spinbutton_monitor_zoom); gtk_widget_show (eval->spinbutton_monitor_zoom); gtk_box_pack_start (GTK_BOX (eval->hbox_monitor), eval->spinbutton_monitor_zoom, TRUE, TRUE, 0); gtk_entry_set_editable (GTK_ENTRY (eval->spinbutton_monitor_zoom), TRUE); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (eval->spinbutton_monitor_zoom), TRUE); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_monitor_zoom), "eval", eval); g_signal_connect (GTK_OBJECT (eval->spinbutton_monitor_zoom), "changed", G_CALLBACK (on_spinbutton_piv_monitor_zoom), eval->spinbutton_monitor_zoom); /* * spinner for vector length */ eval->label_monitor_vectorscale = gtk_label_new ( _("Vector scale:")); gtk_widget_ref (eval->label_monitor_vectorscale); gtk_object_set_data_full (GTK_OBJECT (main_window), "eval_label_monitor_vectorscale", eval->label_monitor_vectorscale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->label_monitor_vectorscale); gtk_box_pack_start (GTK_BOX (eval->hbox_monitor), eval->label_monitor_vectorscale, TRUE, TRUE, 0); eval->spinbutton_adj_monitor_vectorscale = gtk_adjustment_new (gpiv_var->piv_disproc_vlength, 1, 32, 1, 4, 32); eval->spinbutton_monitor_vectorscale = gtk_spin_button_new (GTK_ADJUSTMENT (eval->spinbutton_adj_monitor_vectorscale), 1, 0); gtk_widget_ref (eval->spinbutton_monitor_vectorscale); gtk_widget_show (eval->spinbutton_monitor_vectorscale); gtk_box_pack_start (GTK_BOX (eval->hbox_monitor), eval->spinbutton_monitor_vectorscale, TRUE, TRUE, 0); gtk_entry_set_editable (GTK_ENTRY (eval->spinbutton_monitor_vectorscale), TRUE); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (eval->spinbutton_monitor_vectorscale), TRUE); gtk_object_set_data (GTK_OBJECT (eval->spinbutton_monitor_vectorscale), "eval", eval); g_signal_connect (GTK_OBJECT (eval->spinbutton_monitor_vectorscale), "changed", G_CALLBACK (on_spinbutton_piv_monitor_vectorscale), eval->spinbutton_monitor_vectorscale); /* * PIV activating button */ eval->button = gtk_button_new_with_label ( _("piv")); gtk_widget_ref (eval->button); gtk_object_set_data_full (GTK_OBJECT (main_window), "button", eval->button, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (eval->button); gtk_table_attach (GTK_TABLE (eval->table), eval->button, 0, 2, 7, 8, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_tooltips_set_tip(gpiv->tooltips, eval->button, _("Interrogates a PIV image (pair) resulting into estimators of the mean displacement of the particle images within each interrogation area"), NULL); gtk_object_set_data (GTK_OBJECT (eval->button), "eval", eval); g_signal_connect (GTK_OBJECT (eval->button), "enter", G_CALLBACK (on_button_piv_enter), NULL); g_signal_connect (GTK_OBJECT (eval->button), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (eval->button), "clicked", G_CALLBACK (on_button_piv), NULL); /* * Setting initial values */ /* if (gl_piv_par->int_size_f == 8) { */ /* gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON */ /* (eval->radiobutton_intsize_f_1), TRUE); */ /* } */ if (gl_piv_par->int_size_f == 16) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_f_2), TRUE); } if (gl_piv_par->int_size_f == 32) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_f_3), TRUE); } if (gl_piv_par->int_size_f == 64) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_f_4), TRUE); } if (gl_piv_par->int_size_f == 128) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_f_5), TRUE); } /* if (gl_piv_par->int_size_i == 8) { */ /* gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON */ /* (eval->radiobutton_intsize_i_1), TRUE); */ /* } */ if (gl_piv_par->int_size_i == 16) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_i_2), TRUE); } if (gl_piv_par->int_size_i == 32) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_i_3), TRUE); } if (gl_piv_par->int_size_i == 64) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_i_4), TRUE); } if (gl_piv_par->int_size_i == 128) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intsize_i_5), TRUE); } if (gl_piv_par->int_shift == 8) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intshift_1), TRUE); } if (gl_piv_par->int_shift == 16) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intshift_2), TRUE); } if (gl_piv_par->int_shift == 32) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intshift_3), TRUE); } if (gl_piv_par->int_shift == 64) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intshift_4), TRUE); } if (gl_piv_par->int_shift == 128) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_intshift_5), TRUE); } gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (eval->radiobutton_mouse_0), TRUE); if (gl_piv_par->ifit == 0) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_fit_none), TRUE); } if (gl_piv_par->ifit == 1) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_fit_gauss), TRUE); } if (gl_piv_par->ifit == 2) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_fit_power), TRUE); } if (gl_piv_par->ifit == 3) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_fit_gravity), TRUE); } /* if (ifit == -1) { */ /* gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_fit_marquardt), TRUE); */ /* } */ if (gl_piv_par->peak == 1) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_peak_1), TRUE); } if (gl_piv_par->peak == 2) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_peak_2), TRUE); } if (gl_piv_par->peak == 3) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_peak_3), TRUE); } if (gl_piv_par->int_scheme == GPIV_LK_WEIGHT) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_weightkernel), TRUE); } if (gl_piv_par->int_scheme == GPIV_ZERO_OFF_FORWARD) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_zerooff), TRUE); } if (gl_piv_par->int_scheme == GPIV_ZERO_OFF_CENTRAL) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_centraldiff), TRUE); } if (gl_piv_par->int_scheme == GPIV_IMG_DEFORM) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_imgdeform), TRUE); } if (gl_image_par->x_corr == 0) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_cross_1), TRUE); } else { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->radiobutton_cross_2), TRUE); } gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->checkbutton_weight_ia), gl_piv_par->gauss_weight_ia); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->checkbutton_spof), gl_piv_par->spof_filter); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (eval->checkbutton_monitor), gpiv_par->display__process); return eval; } gpiv-0.6.1/src/piveval_interface.h0000644000175000017500000001620011110306541014021 00000000000000/*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * PIV evaluation * $Log: piveval_interface.h,v $ * Revision 1.12 2008-04-28 12:00:57 gerber * hdf-formatted files are now with .hdf extension (previously: .gpi) * * Revision 1.11 2007-11-23 16:24:08 gerber * release 0.5.0: Kafka * * Revision 1.10 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.9 2007-02-16 17:09:49 gerber * added Gauss weighting on I.A. and SPOF filtering (on correlation function) * * Revision 1.8 2007-01-29 11:27:44 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.7 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.5 2005/01/19 15:53:42 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.4 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.3 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.2 2003/09/01 11:17:15 gerber * improved monitoring of interrogation process * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef GPIV_PIVEVAL_INTERFACE_H #define GPIV_PIVEVAL_INTERFACE_H typedef struct _Monitor Monitor; struct _Monitor { gint int_size_old; gint rgb_int_width; guchar *rgbbuf_int1; GnomeCanvasItem *gci_int1; GnomeCanvasItem *gci_int1_background; guchar *rgbbuf_int2; GnomeCanvasItem *gci_int2; GnomeCanvasItem *gci_int2_background; gint cov_size_old; gint rgb_cov_width; guchar *rgbbuf_cov; GnomeCanvasItem *gci_cov; GnomeCanvasItem *gci_background_cov; GpivPivData *pi_da; GnomeCanvasItem *gci_vec_background; GnomeCanvasItem *gci_vec; gint vector_scale; gfloat zoom_factor; /* const */double affine[6]; /* const */double affine_vl[6]; }; typedef struct _PivEval PivEval; struct _PivEval { GtkWidget *vbox_label; GtkWidget *label_title; GtkWidget *vbox_scroll; GtkWidget *scrolledwindow; GtkWidget *viewport; GtkWidget *vbox_viewport1; GtkWidget *table; GtkWidget *table_aoi; GtkWidget *label_colstart; GtkWidget *label_colend; GtkWidget *label_preshiftcol; GtkWidget *label_rowstart; GtkWidget *label_rowend; GtkWidget *label_preshiftrow; GtkObject *spinbutton_adj_colstart; GtkWidget *spinbutton_colstart; GtkObject *spinbutton_adj_colend; GtkWidget *spinbutton_colend; GtkObject *spinbutton_adj_preshiftcol; GtkWidget *spinbutton_preshiftcol; GtkObject *spinbutton_adj_rowstart; GtkWidget *spinbutton_rowstart; GtkObject *spinbutton_adj_rowend; GtkWidget *spinbutton_rowend; GtkObject *spinbutton_adj_preshiftrow; GtkWidget *spinbutton_preshiftrow; GtkWidget *hbox_intreg; GtkWidget *frame_2; GtkWidget *vbox_intsize_f; GSList *int_size_f_group; GtkObject *spinbutton_adj_intsize_f; GtkWidget *spinbutton_intsize_f; /* GtkWidget *radiobutton_intsize_f_1; */ GtkWidget *radiobutton_intsize_f_2; GtkWidget *radiobutton_intsize_f_3; GtkWidget *radiobutton_intsize_f_4; GtkWidget *radiobutton_intsize_f_5; GtkWidget *frame_3; GtkWidget *vbox_intsize_i; GSList *int_size_i_group/* = NULL */; GtkObject *spinbutton_adj_intsize_i; GtkWidget *spinbutton_intsize_i; /* GtkWidget *radiobutton_intsize_i_1; */ GtkWidget *radiobutton_intsize_i_2; GtkWidget *radiobutton_intsize_i_3; GtkWidget *radiobutton_intsize_i_4; GtkWidget *radiobutton_intsize_i_5; GtkWidget *frame_4; GtkWidget *vbox_shift; GSList *int_shift_group; GtkObject *spinbutton_adj_intshift; GtkWidget *spinbutton_intshift; GtkWidget *radiobutton_intshift_1; GtkWidget *radiobutton_intshift_2; GtkWidget *radiobutton_intshift_3; GtkWidget *radiobutton_intshift_4; GtkWidget *radiobutton_intshift_5; GtkWidget *frame_1; GtkWidget *vbox_mouseselect; /* * GSList *mouse_sel_group; moved to console */ GtkWidget *radiobutton_mouse_0; GtkWidget *radiobutton_mouse_1; GtkWidget *radiobutton_mouse_2; GtkWidget *radiobutton_mouse_3; GtkWidget *radiobutton_mouse_4; GtkWidget *radiobutton_mouse_5; GtkWidget *radiobutton_mouse_6; /*---------------------------------------------------------------- * Monitor */ Monitor *monitor; GtkWidget *frame_monitor; GtkWidget *table_monitor; GtkWidget *frame_monitor_int1; GtkWidget *canvas_monitor_int1; GtkWidget *frame_monitor_int2; GtkWidget *canvas_monitor_int2; GtkWidget *frame_monitor_cov; GtkWidget *canvas_monitor_cov; GtkWidget *frame_monitor_vec; GtkWidget *canvas_monitor_vec; GtkWidget *hbox_monitor; GtkWidget *checkbutton_monitor; GtkWidget *label_monitor_zoom; GtkObject *spinbutton_adj_monitor_zoom; GtkWidget *spinbutton_monitor_zoom; GtkWidget *label_monitor_vectorscale; GtkObject *spinbutton_adj_monitor_vectorscale; GtkWidget *spinbutton_monitor_vectorscale; /*----------------------------------------------------------------*/ GtkWidget *frame_5; GtkWidget *vbox10; GSList *vbox10_group; GtkWidget *radiobutton_fit_none; GtkWidget *radiobutton_fit_gauss; GtkWidget *radiobutton_fit_power; GtkWidget *radiobutton_fit_gravity; GtkWidget *frame_6; GtkWidget *vbox11; GSList *vbox11_group; GtkWidget *radiobutton_peak_1; GtkWidget *radiobutton_peak_2; GtkWidget *radiobutton_peak_3; GtkWidget *frame_7; GtkWidget *vbox12; GSList *vbox12_group; GtkWidget *radiobutton_imgdeform; GtkWidget *radiobutton_centraldiff; GtkWidget *radiobutton_zerooff; GtkWidget *radiobutton_weightkernel; GtkWidget *frame_8; GtkWidget *vbox13; GSList *vbox13_group; GtkWidget *radiobutton_cross_1; GtkWidget *radiobutton_cross_2; GtkWidget *checkbutton_weight_ia; GtkWidget *checkbutton_spof; GtkWidget *button; }; PivEval * create_piveval (GnomeApp *main_window, GtkWidget *container); #endif /* GPIV_PIVEVAL_INTERFACE_H */ gpiv-0.6.1/src/dialog_interface.c0000644000175000017500000003655311110306101013612 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * $Id: dialog_interface.c,v 1.1 2008-09-16 11:19:37 gerber Exp $ */ #ifdef HAVE_CONFIG_H #include #endif #include "support.h" #include "gpiv_gui.h" #include "dialog.h" #include "dialog_interface.h" GtkWidget *create_about (void ) /*----------------------------------------------------------------------------- */ { GtkWidget *about; GdkPixbuf *logo = NULL; const gchar *authors[] = { "Gerber van der Graaf ", #ifdef ENABLE_TRIG "Julio Soria", #endif /* ENABLE_TRIG */ NULL }; logo = gdk_pixbuf_new_from_file(PIXMAPSDIR "gpiv_logo.png", NULL); if (logo != NULL) { GdkPixbuf *temp_logo = NULL; temp_logo = gdk_pixbuf_scale_simple (logo, gdk_pixbuf_get_width (logo), gdk_pixbuf_get_height (logo), GDK_INTERP_HYPER); g_object_unref (logo); logo = temp_logo; } about = g_object_new (GTK_TYPE_ABOUT_DIALOG, "name","Gpiv", "version", VERSION, "copyright", _("Copyright G. Van der Graaf"), "comments", _("GPIV is a program for (Digital) \ Particle Image Velocimetry. It \ interrogates images (pairs) of a fluid flow that has been seeded \ with tracer particles, resulting into the velocity field of \ the fluid flow."), "authors", authors , "logo", logo, "icon", logo, NULL); gtk_object_set_data (GTK_OBJECT (about), "about", about); g_signal_connect_swapped (GTK_DIALOG (about), "response", G_CALLBACK (gtk_widget_destroy), about); gtk_widget_show(GTK_WIDGET(about)); if (logo != NULL) g_object_unref (logo); return about; } GtkDialog *create_exit_dialog (/* GtkWidget *console */ ) /*----------------------------------------------------------------------------- */ { GtkDialog *exit_dialog; GtkWidget *dialog_vbox1; GtkWidget *hbox; GtkImage *icon; GtkLabel *text; GdkPixbuf *logo = NULL; GtkWidget *exit_message_label; gchar *message = _("There are unsaved data that will be lost.\nAre you sure you want to quit?"); /* * Gnome2: */ /* logo = gdk_pixbuf_new_from_file(PIXMAPSDIR "gpiv_logo.png", NULL); */ exit_dialog = GTK_DIALOG( gtk_dialog_new_with_buttons ("gpiv exit", NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_NO, GTK_RESPONSE_REJECT, GTK_STOCK_YES, GTK_RESPONSE_ACCEPT, NULL)); gtk_dialog_set_default_response(exit_dialog, GTK_RESPONSE_REJECT); g_signal_connect( exit_dialog, "response", G_CALLBACK (on_button_quit_gpiv_clicked), NULL); gtk_window_set_icon(GTK_WINDOW( exit_dialog), logo); if (logo != NULL) g_object_unref (logo); hbox = g_object_new(GTK_TYPE_HBOX, "border-width", 8, NULL); gtk_container_add (GTK_CONTAINER (GTK_DIALOG(exit_dialog)->vbox), hbox); gtk_widget_show(GTK_WIDGET (hbox)); icon = g_object_new(GTK_TYPE_IMAGE, "stock", /* GTK_STOCK_DIALOG_QUESTION */ GTK_STOCK_DIALOG_WARNING, "icon-size", GTK_ICON_SIZE_DIALOG, "xalign", 0.5, "yalign", 1.0, NULL); gtk_box_pack_start (GTK_BOX(hbox), GTK_WIDGET(icon), FALSE, FALSE, 0); gtk_widget_show(GTK_WIDGET (icon)); text = g_object_new(GTK_TYPE_LABEL, "wrap", TRUE, "use-markup", TRUE, "label", message, NULL); gtk_box_pack_start (GTK_BOX(hbox), GTK_WIDGET(text), FALSE, FALSE, 0); gtk_widget_show(GTK_WIDGET (text)); return exit_dialog; } GtkDialog *create_message_dialog (gchar * message ) /*----------------------------------------------------------------------------- */ { GtkDialog *message_dialog; GtkWidget *hbox; GtkImage *icon; GtkLabel *text; GdkPixbuf *logo = NULL; /* * Gnome2: */ message_dialog = GTK_DIALOG( gtk_dialog_new_with_buttons ("gpiv message", NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_NONE, NULL)); g_signal_connect_swapped (GTK_DIALOG (message_dialog), "response", G_CALLBACK (gtk_widget_destroy), message_dialog); gtk_window_set_icon(GTK_WINDOW( message_dialog), logo); if (logo != NULL) g_object_unref (logo); hbox = g_object_new(GTK_TYPE_HBOX, "border-width", 8, NULL); gtk_container_add (GTK_CONTAINER (GTK_DIALOG(message_dialog)->vbox), hbox); gtk_widget_show(GTK_WIDGET (hbox)); icon = g_object_new(GTK_TYPE_IMAGE, "stock", GTK_STOCK_DIALOG_INFO, "icon-size", GTK_ICON_SIZE_DIALOG, "xalign", 0.5, "yalign", 1.0, NULL); gtk_box_pack_start (GTK_BOX(hbox), GTK_WIDGET(icon), FALSE, FALSE, 0); gtk_widget_show(GTK_WIDGET (icon)); text = g_object_new(GTK_TYPE_LABEL, "wrap", TRUE, "use-markup", TRUE, "label", message, NULL); gtk_box_pack_start (GTK_BOX(hbox), GTK_WIDGET(text), FALSE, FALSE, 0); gtk_widget_show(GTK_WIDGET (text)); gtk_widget_show(GTK_WIDGET (text)); return message_dialog; } GtkDialog *create_warning_dialog (gchar * message ) /*----------------------------------------------------------------------------- */ { GtkDialog *warning_dialog; GtkWidget *hbox; GtkImage *icon; GtkLabel *text; GdkPixbuf *logo = NULL; /* * Gnome2: */ warning_dialog = GTK_DIALOG( gtk_dialog_new_with_buttons ("gpiv warning", NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_NONE, NULL)); g_signal_connect_swapped (GTK_DIALOG (warning_dialog), "response", G_CALLBACK (gtk_widget_destroy), warning_dialog); gtk_window_set_icon(GTK_WINDOW( warning_dialog), logo); if (logo != NULL) g_object_unref (logo); hbox = g_object_new(GTK_TYPE_HBOX, "border-width", 8, NULL); gtk_container_add (GTK_CONTAINER (GTK_DIALOG(warning_dialog)->vbox), hbox); gtk_widget_show(GTK_WIDGET (hbox)); icon = g_object_new(GTK_TYPE_IMAGE, "stock", GTK_STOCK_DIALOG_WARNING, "icon-size", GTK_ICON_SIZE_DIALOG, "xalign", 0.5, "yalign", 1.0, NULL); gtk_box_pack_start (GTK_BOX(hbox), GTK_WIDGET(icon), FALSE, FALSE, 0); gtk_widget_show(GTK_WIDGET (icon)); text = g_object_new(GTK_TYPE_LABEL, "wrap", TRUE, "use-markup", TRUE, "label", message, NULL); gtk_box_pack_start (GTK_BOX(hbox), GTK_WIDGET(text), FALSE, FALSE, 0); gtk_widget_show(GTK_WIDGET (text)); /* gtk_container_add (GTK_CONTAINER (GTK_DIALOG(warning_dialog)->vbox), */ /* GTK_WIDGET (text)); */ gtk_widget_show(GTK_WIDGET (text)); return warning_dialog; } GtkDialog *create_error_dialog (gchar * message ) /*----------------------------------------------------------------------------- */ { GtkDialog *error_dialog; GtkWidget *hbox; GtkImage *icon; GtkLabel *text; error_dialog = GTK_DIALOG( gtk_dialog_new_with_buttons ("gpiv error", NULL, GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_OK, GTK_RESPONSE_NONE, NULL)); g_signal_connect_swapped (GTK_DIALOG (error_dialog), "response", G_CALLBACK (gtk_widget_destroy), error_dialog); /* * BUGFIX: probably not necessary as OK button connect with */ /* g_signal_connect( error_box, */ /* "response", */ /* G_CALLBACK(on_error_response), */ /* NULL); */ hbox = g_object_new(GTK_TYPE_HBOX, "border-width", 8, NULL); gtk_container_add (GTK_CONTAINER (GTK_DIALOG(error_dialog)->vbox), hbox); gtk_widget_show(GTK_WIDGET (hbox)); icon = g_object_new(GTK_TYPE_IMAGE, "stock", GTK_STOCK_DIALOG_ERROR, "icon-size", GTK_ICON_SIZE_DIALOG, "xalign", 0.5, "yalign", 1.0, NULL); gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (icon), FALSE, FALSE, 0); gtk_widget_show(GTK_WIDGET (icon)); text = g_object_new(GTK_TYPE_LABEL, "wrap", TRUE, "use-markup", TRUE, "label", message, NULL); gtk_box_pack_start (GTK_BOX (hbox), GTK_WIDGET (text), FALSE, FALSE, 0); gtk_widget_show(GTK_WIDGET (text)); return error_dialog; } GtkDialog *create_close_buffer_dialog (GpivConsole * gpiv, Display *disp, char *message ) /*----------------------------------------------------------------------------- */ { GtkDialog *close_buffer_dialog; GtkWidget *hbox; GtkImage *icon; GtkLabel *text; close_buffer_dialog = GTK_DIALOG(gtk_dialog_new_with_buttons ("gpiv close_buffer", GTK_WINDOW (gpiv->console), GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_NO, GTK_RESPONSE_REJECT, GTK_STOCK_YES, GTK_RESPONSE_ACCEPT, NULL)); g_signal_connect (close_buffer_dialog, "response", G_CALLBACK (on_close_buffer_response), NULL); g_signal_connect_swapped (GTK_DIALOG (close_buffer_dialog), "response", G_CALLBACK (gtk_widget_destroy), close_buffer_dialog); hbox = g_object_new(GTK_TYPE_HBOX, "border-width", 8, NULL); gtk_container_add (GTK_CONTAINER (GTK_DIALOG(close_buffer_dialog)->vbox), hbox); gtk_widget_show(GTK_WIDGET (hbox)); icon = g_object_new(GTK_TYPE_IMAGE, "stock", /* GTK_STOCK_DIALOG_QUESTION */ GTK_STOCK_DIALOG_WARNING, "icon-size", GTK_ICON_SIZE_DIALOG, "xalign", 0.5, "yalign", 1.0, NULL); gtk_box_pack_start (GTK_BOX(hbox), GTK_WIDGET(icon), FALSE, FALSE, 0); gtk_widget_show(GTK_WIDGET (icon)); text = g_object_new(GTK_TYPE_LABEL, "wrap", TRUE, "use-markup", TRUE, "label", message, NULL); gtk_box_pack_start (GTK_BOX(hbox), GTK_WIDGET(text), FALSE, FALSE, 0); gtk_widget_show(GTK_WIDGET (text)); gtk_object_set_data (GTK_OBJECT (close_buffer_dialog), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (close_buffer_dialog), "display", disp); return close_buffer_dialog; } gpiv-0.6.1/src/dialog_interface.h0000644000175000017500000000342611110307211013613 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 8 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -----------------------------------------------------------------------------*/ /* * $Id: dialog_interface.h,v 1.1 2008-09-16 11:19:37 gerber Exp $ * * widgets for small dialogs and message windows */ #ifndef DIALOG_INTERFACE_H #define DIALOG_INTERFACE_H #include "gpiv_gui.h" GtkWidget * /* GnomeAbout * */ create_about (void); GtkDialog * create_exit_dialog (void); GtkDialog * create_message_dialog (gchar *message); GtkDialog * create_warning_dialog (gchar *message); GtkDialog * create_error_dialog (gchar *message); GtkDialog * create_close_buffer_dialog (GpivConsole *gpiv, Display *disp, char *message); #endif /* DIALOG_INTERFACE_H */ gpiv-0.6.1/src/pivpost.c0000644000175000017500000010153411110305555012043 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -----------------------------------------------------------------------------*/ /* * (callback) functions for Piv post processing window/tabulator * $Log: pivpost.c,v $ * Revision 1.18 2007-12-19 08:42:35 gerber * debugged * * Revision 1.17 2007-11-23 16:24:08 gerber * release 0.5.0: Kafka * * Revision 1.16 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.15 2007-01-29 11:27:44 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.14 2006-09-18 07:27:06 gerber * *** empty log message *** * * Revision 1.13 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.11 2005/02/26 09:43:30 gerber * parameter flags (parameter_logic) defined as gboolean * * Revision 1.10 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.9 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.8 2003/07/13 14:38:18 gerber * changed error handling of libgpiv * * Revision 1.7 2003/07/12 21:21:16 gerber * changed error handling libgpiv * * Revision 1.5 2003/07/10 11:56:07 gerber * added man page * * Revision 1.4 2003/07/04 10:47:01 gerber * cleaning up * * Revision 1.3 2003/07/03 17:08:02 gerber * display ruler adjusted for scaled data * * Revision 1.2 2003/06/27 13:47:26 gerber * display ruler, line/point evaluation * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #include "gpiv_gui.h" #include "utils.h" #include "pivpost.h" #include "display.h" /* * Public post-processing functions */ void exec_scale (PivPost *pivpost ) /*----------------------------------------------------------------------------- * Scales PIV data on a new data set, adapts rulers */ { gchar *err_msg = NULL; if (display_act->pida->scaled_piv) gpiv_free_pivdata (display_act->pida->piv_data_scaled); if ((display_act->pida->piv_data_scaled = gpiv_cp_pivdata (display_act->pida->piv_data)) == NULL) { gpiv_error ("exec_scale: failing gpiv_alloc_pivdata"); } if (display_act->pida->exist_piv && !cancel_process) { if ((err_msg = gpiv_post_scale (display_act->pida->piv_data_scaled, display_act->img->image->header)) != NULL) { error_gpiv(_("exec_scale: Failure calling gpiv_post_scale")); } display_act->pida->scaled_piv = TRUE; /* * Adding some comment to the scaled piv_data */ display_act->pida->piv_data_scaled->comment = g_strdup_printf ("# Software: %s %s\n", PACKAGE, VERSION); display_act->pida->piv_data_scaled->comment = gpiv_add_datetime_to_comment (display_act->pida->piv_data_scaled->comment); display_act->pida->piv_data_scaled->comment = g_strconcat (display_act->pida->piv_data_scaled->comment, "# Data type: time and spatial scaled Particle Image Velocities\n", NULL); #ifdef Rulers /* * Adjusting display rulers */ set__hrulerscale (display_act); set__vrulerscale (display_act); #endif free_post_bufmems (display_act); } else { warning_gpiv (_("no PIV data")); } } void exec_savg (PivPost *pivpost ) /*----------------------------------------------------------------------------- * Calculates spatial average */ { gchar *err_msg = NULL; display_act->pida->averaged_piv = TRUE; display_act->pida->piv_data->mean_dx = 0.0; display_act->pida->piv_data->sdev_dx = 0.0; display_act->pida->piv_data->min_dx = 0.0; display_act->pida->piv_data->max_dx = 0.0; display_act->pida->piv_data->mean_dy = 0.0; display_act->pida->piv_data->sdev_dy = 0.0; display_act->pida->piv_data->min_dy = 0.0; display_act->pida->piv_data->max_dy = 0.0; if (display_act->pida->piv_data_scaled != NULL) { display_act->pida->piv_data_scaled->mean_dx = 0.0; display_act->pida->piv_data_scaled->sdev_dx = 0.0; display_act->pida->piv_data_scaled->min_dx = 0.0; display_act->pida->piv_data_scaled->max_dx = 0.0; display_act->pida->piv_data_scaled->mean_dy = 0.0; display_act->pida->piv_data_scaled->sdev_dy = 0.0; display_act->pida->piv_data_scaled->min_dy = 0.0; display_act->pida->piv_data_scaled->max_dy = 0.0; } if (display_act->pida->exist_piv && !cancel_process) { exec_process = TRUE; gl_post_par->subtract = 0; if (display_act->pida->scaled_piv) { if ((err_msg = gpiv_post_savg (display_act->pida->piv_data_scaled, gl_post_par)) != NULL) { error_gpiv ("exec_savg: failing gpiv_post_savg"); } #ifdef DEBUG g_warning("exec_savg:: SCALED: mean_dx = %f sdev_dx = %f min_dx = %f max_dx = %f", display_act->pida->piv_data_scaled->mean_dx, display_act->pida->piv_data_scaled->sdev_dx, display_act->pida->piv_data_scaled->min_dx, display_act->pida->piv_data_scaled->max_dx); g_warning("exec_savg:: SCALED: mean_dy = %f sdev_dy = %f min_dy = %f max_dy = %f\n", display_act->pida->piv_data_scaled->mean_dy, display_act->pida->piv_data_scaled->sdev_dy, display_act->pida->piv_data_scaled->min_dy, display_act->pida->piv_data_scaled->max_dy); #endif /* DEBUG */ gtk_spin_button_set_value (GTK_SPIN_BUTTON (pivpost->spinbutton_suavg), (gfloat) display_act-> pida->piv_data_scaled->mean_dx); gtk_spin_button_set_value (GTK_SPIN_BUTTON (pivpost->spinbutton_svavg), (gfloat) display_act-> pida->piv_data_scaled->mean_dy); } else { gpiv_post_savg (display_act->pida->piv_data, gl_post_par); #ifdef DEBUG g_warning("exec_savg:: mean_dx = %f sdev_dx = %f min_dx = %f max_dx = %f", display_act->pida->piv_data->mean_dx, display_act->pida->piv_data->sdev_dx, display_act->pida->piv_data->min_dx, display_act->pida->piv_data->max_dx); g_warning("exec_savg:: mean_dy = %f sdev_dy = %f min_dy = %f max_dy = %f\n", display_act->pida->piv_data->mean_dy, display_act->pida->piv_data->sdev_dy, display_act->pida->piv_data->min_dy, display_act->pida->piv_data->max_dy); #endif /* DEBUG */ gtk_spin_button_set_value (GTK_SPIN_BUTTON (pivpost->spinbutton_suavg), (gfloat) display_act-> pida->piv_data->mean_dx); gtk_spin_button_set_value (GTK_SPIN_BUTTON (pivpost->spinbutton_svavg), (gfloat) display_act-> pida->piv_data->mean_dy); } exec_process = FALSE; } else { warning_gpiv (_("no PIV data")); } } void exec_subavg (PivPost * pivpost ) /*----------------------------------------------------------------------------- * Subtracts average or zero offsets for particle image displacements or * scaled velocities */ { guint i, j; if (display_act->pida->exist_piv && !cancel_process) { exec_process = TRUE; gl_post_par->subtract = 1; if (display_act->pida->scaled_piv) { if (display_act->pida->averaged_piv) { gpiv_post_subtract_dxdy (display_act->pida->piv_data_scaled, display_act->pida->piv_data_scaled->mean_dx, display_act->pida->piv_data_scaled->mean_dy); /* * Copy parameters in Buffer structure for saving and, eventual, * later use */ display_act->pida->post_par->z_off_dx = display_act->pida->piv_data_scaled->mean_dx; display_act->pida->post_par->z_off_dy = display_act->pida->piv_data_scaled->mean_dy; } else { gpiv_post_subtract_dxdy (display_act->pida->piv_data_scaled, gl_post_par->z_off_dx, gl_post_par->z_off_dx); } /* * Subtract from piv_data, only for displaying purposes */ if (display_act->pida->averaged_piv) { gpiv_post_subtract_dxdy (display_act->pida->piv_data, display_act->pida->piv_data->mean_dx, display_act->pida->piv_data->mean_dy); } else { /* * apply inverse scale factor for offsetting of partimcle image displacements */ gpiv_post_subtract_dxdy (display_act->pida->piv_data, gl_post_par->z_off_dx / gl_image_par->s_scale * gl_image_par->t_scale, gl_post_par->z_off_dy / gl_image_par->s_scale * gl_image_par->t_scale ); } update_all_vectors (display_act->pida); /* * Only apply offseting for non-scaled pivdata with values from entry * or z_off_dx and z_off_dy */ } else { if (display_act->pida->averaged_piv) { gpiv_post_subtract_dxdy (display_act->pida->piv_data, display_act->pida->piv_data->mean_dx, display_act->pida->piv_data->mean_dy); /* * Copy parameters in Buffer structure for saving and, eventual, * later use */ display_act->pida->post_par->z_off_dx = display_act->pida->piv_data->mean_dx; display_act->pida->post_par->z_off_dy = display_act->pida->piv_data->mean_dy; } else { gl_post_par->z_off_dx = gtk_spin_button_get_value_as_float (GTK_SPIN_BUTTON (pivpost->spinbutton_suavg)); gl_post_par->z_off_dy = gtk_spin_button_get_value_as_float (GTK_SPIN_BUTTON (pivpost->spinbutton_svavg)); gpiv_post_subtract_dxdy (display_act->pida->piv_data, gl_post_par->z_off_dx, gl_post_par->z_off_dy); } update_all_vectors (display_act->pida); } display_act->pida->post_par->z_off_dx__set = TRUE; display_act->pida->post_par->z_off_dy__set = TRUE; exec_process = FALSE; } else { warning_gpiv (_("no PIV data")); } /* g_warning("exec_savg:: entering"); */ /* g_warning(_("not connected, yet")); */ } void exec_vorstra (void ) /*----------------------------------------------------------------------------- */ { char *err_msg = NULL; GtkWidget *view_scalardata_display1 = gtk_object_get_data (GTK_OBJECT (display_act->mwin), "view_scalardata_display1"); GtkWidget *view_scalardata_display2 = gtk_object_get_data (GTK_OBJECT (display_act->mwin), "view_scalardata_display2"); GtkWidget *view_scalardata_display3 = gtk_object_get_data (GTK_OBJECT (display_act->mwin), "view_scalardata_display3"); if (display_act->pida->exist_piv && !cancel_process) { exec_process = TRUE; /* * Vorticity calculation and displaying */ if (gl_post_par->operator_vorstra == GPIV_VORTICITY) { if (display_act->pida->exist_vor) { destroy_all_scalars (display_act, GPIV_VORTICITY); gpiv_free_scdata (display_act->pida->vor_data); display_act->pida->exist_vor = FALSE; } if ((display_act->pida->vor_data = gpiv_post_vorstra (display_act->pida->piv_data, gl_post_par)) == NULL) error_gpiv ("%s: %s", RCSID, err_msg); create_all_scalars (display_act, GPIV_VORTICITY); /* * Adding comment to the vorticity data */ display_act->pida->vor_data->comment = g_strdup_printf ("# Software: %s%s\n", PACKAGE, VERSION); display_act->pida->vor_data->comment = gpiv_add_datetime_to_comment (display_act->pida->vor_data->comment); display_act->pida->vor_data->comment = g_strconcat (display_act->pida->vor_data->comment, "# Data type: vorticity [1/s]\n", NULL); /* * Vorticity data exist but are unsaved * and are displayed as scalar data */ display_act->pida->exist_vor = TRUE; display_act->pida->saved_vor = FALSE; /* gtk_check_menu_item_set_active */ /* (GTK_CHECK_MENU_ITEM (view_scalardata_display1), */ /* TRUE); */ /* * Repete vorticity calculation process for scaled piv_data */ if (display_act->pida->scaled_piv) { if ((display_act->pida->vor_data_scaled = gpiv_post_vorstra (display_act->pida->piv_data_scaled, gl_post_par)) == NULL) error_gpiv ("%s: %s", RCSID, err_msg); display_act->pida->exist_vor_scaled = TRUE; display_act->pida->vor_data_scaled->scale = TRUE; /* * Adding comment to the scaled vorticity data */ display_act->pida->vor_data_scaled->comment = g_strdup_printf ("# Software: %s%s\n", PACKAGE, VERSION); display_act->pida->vor_data_scaled->comment = gpiv_add_datetime_to_comment (display_act->pida->vor_data_scaled->comment); display_act->pida->vor_data_scaled->comment = g_strconcat (display_act->pida->vor_data_scaled->comment, "# Data type: time and spatial scaled vorticity [1/s]\n", NULL); } /* * Shear strain calculation and displaying */ } else if (gl_post_par->operator_vorstra == GPIV_S_STRAIN) { if (display_act->pida->exist_sstrain) { destroy_all_scalars (display_act, GPIV_S_STRAIN); gpiv_free_scdata (display_act->pida->sstrain_data); display_act->pida->exist_sstrain = FALSE; } if ((display_act->pida->sstrain_data = gpiv_post_vorstra (display_act->pida->piv_data, gl_post_par)) == NULL) error_gpiv ("%s: %s", RCSID, err_msg); create_all_scalars (display_act, GPIV_S_STRAIN); /* * Adding comment to the sstrain data */ display_act->pida->sstrain_data->comment = g_strdup_printf ("# Software: %s%s\n", PACKAGE, VERSION); display_act->pida->sstrain_data->comment = gpiv_add_datetime_to_comment (display_act->pida->sstrain_data->comment); display_act->pida->sstrain_data->comment = g_strconcat (display_act->pida->sstrain_data->comment, "# Data type: shear strain [1/s]\n", NULL); /* * Shear strain data exist but are unsaved * and are displayed as scalar data */ display_act->pida->exist_sstrain = TRUE; display_act->pida->saved_sstrain = FALSE; gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_scalardata_display2), TRUE); /* * Repete shear strain calculation process for scaled piv_data */ if (display_act->pida->scaled_piv) { if ((display_act->pida->sstrain_data_scaled = gpiv_post_vorstra (display_act->pida->piv_data_scaled, gl_post_par)) == NULL) error_gpiv ("%s: %s", RCSID, err_msg); display_act->pida->exist_sstrain_scaled = TRUE; display_act->pida->sstrain_data_scaled->scale = TRUE; /* * Adding comment to the scaled sstrain data */ display_act->pida->sstrain_data_scaled->comment = g_strdup_printf ("# Software: %s%s\n", PACKAGE, VERSION); display_act->pida->sstrain_data_scaled->comment = gpiv_add_datetime_to_comment (display_act->pida->sstrain_data_scaled->comment); display_act->pida->sstrain_data_scaled->comment = g_strconcat (display_act->pida->sstrain_data_scaled->comment, "# Data type: time and spatial scaled shear strain [1/s]\n", NULL); } /* * Normal strain calculation and displaying */ } else if (gl_post_par->operator_vorstra == GPIV_N_STRAIN) { if (display_act->pida->exist_nstrain) { /* destroy_all_scalars (&display_act->pida->nstrain_data, GPIV_N_STRAIN); */ destroy_all_scalars (display_act, GPIV_N_STRAIN); gpiv_free_scdata (display_act->pida->nstrain_data); display_act->pida->exist_nstrain = FALSE; } if ((display_act->pida->nstrain_data = gpiv_post_vorstra (display_act->pida->piv_data, gl_post_par)) == NULL) error_gpiv ("%s: %s", RCSID, err_msg); create_all_scalars (display_act, GPIV_N_STRAIN); /* * Adding comment to the nstrain data */ display_act->pida->nstrain_data->comment = g_strdup_printf ("# Software: %s%s\n", PACKAGE, VERSION); display_act->pida->nstrain_data->comment = gpiv_add_datetime_to_comment (display_act->pida->nstrain_data->comment); display_act->pida->nstrain_data->comment = g_strconcat (display_act->pida->nstrain_data->comment, "# Data type: normal strain [1/s]\n", NULL); /* * Normal strain data exist but are unsaved * and are displayed as scalar data */ display_act->pida->exist_nstrain = TRUE; display_act->pida->saved_nstrain = FALSE; gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_scalardata_display3), TRUE); /* * Repete normal strain calculation process for scaled piv_data */ if (display_act->pida->scaled_piv) { if ((display_act->pida->nstrain_data_scaled = gpiv_post_vorstra (display_act->pida->piv_data_scaled, gl_post_par)) == NULL) error_gpiv ("%s: %s", RCSID, err_msg); display_act->pida->exist_nstrain_scaled = TRUE; display_act->pida->nstrain_data_scaled->scale = TRUE; /* * Adding comment to the scaled nstrain data */ display_act->pida->nstrain_data_scaled->comment = g_strdup_printf ("# Software: %s%s\n", PACKAGE, VERSION); display_act->pida->nstrain_data_scaled->comment = gpiv_add_datetime_to_comment (display_act->pida->nstrain_data_scaled->comment); display_act->pida->nstrain_data_scaled->comment = g_strconcat (display_act->pida->nstrain_data_scaled->comment, "# Data type: time and spatial scaled normal strain [1/s]\n", NULL); } } else { warning_gpiv (_("exec_vorstra: non valid operation")); } exec_process = FALSE; } else { warning_gpiv (_("no PIV data")); } /* * Copy parameters in Buffer structure for saving and, eventual, * later use */ if (display_act->pida->exist_vor || display_act->pida->exist_sstrain || display_act->pida->exist_nstrain) { display_act->pida->post_par->diff_type = gl_post_par->diff_type; display_act->pida->post_par->operator_vorstra = gl_post_par->operator_vorstra; display_act->pida->post_par->diff_type__set = TRUE; display_act->pida->post_par->operator_vorstra__set = TRUE; gpiv_post_print_parameters (stdout, display_act->pida->post_par); } /* gpiv_write_scdata ( &display_act->pida->vor_data, c_line, nc_lines, */ /* scale, RCSID); */ } /* * Piv post-processing callback functions */ void on_spinbutton_post_scale (GtkSpinButton * widget, GtkWidget * entry /* (GtkWidget *widget, gpointer data) */ ) /*----------------------------------------------------------------------------- */ { enum VariableType { COL_POS = 1, ROW_POS = 2, S_SCALE = 3, T_SCALE = 4 } var_type; var_type = atoi (gtk_object_get_data (GTK_OBJECT (widget), "var_type")); if (var_type == COL_POS) { gl_image_par->z_off_x = gtk_spin_button_get_value_as_float (widget); gl_image_par->z_off_x__set = TRUE; if (display_act != NULL) { display_act->img->image->header->z_off_x = gl_image_par->z_off_x; display_act->img->image->header->z_off_x__set = TRUE; } } else if (var_type == ROW_POS) { gl_image_par->z_off_y = gtk_spin_button_get_value_as_float (widget); gl_image_par->z_off_y__set = TRUE; if (display_act != NULL) { display_act->img->image->header->z_off_y = gl_image_par->z_off_y; display_act->img->image->header->z_off_y__set = TRUE; } } else if (var_type == S_SCALE) { gl_image_par->s_scale = gtk_spin_button_get_value_as_float (widget); gl_image_par->s_scale__set = TRUE; if (display_act != NULL) { display_act->img->image->header->s_scale = gl_image_par->s_scale; display_act->img->image->header->s_scale__set = TRUE; } } else if (var_type == T_SCALE) { gl_image_par->t_scale = gtk_spin_button_get_value_as_float (widget); gl_image_par->t_scale__set = TRUE; if (display_act != NULL) { display_act->img->image->header->t_scale = gl_image_par->t_scale; display_act->img->image->header->t_scale__set = TRUE; } } else { gpiv_warning (_("on_spinbutton_post_scale: should not arrive here")); } } void on_button_post_scale_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Calculates scaled locations and velocities"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_post_scale (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gint row, ibuf; cancel_process = FALSE; if (nbufs > 0) { for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; row++) { display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), row); ibuf = display_act->id; if (display[ibuf] != NULL && display_act->mwin != NULL && GTK_WIDGET_VISIBLE (GTK_WIDGET (display_act->mwin)) ) { gdk_window_show (GTK_WIDGET (display_act->mwin)->window); gdk_window_raise (GTK_WIDGET (display_act->mwin)->window); } exec_scale (gpiv->pivpost); } } } void on_spinbutton_post_suavg (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { gl_post_par->z_off_dx = gtk_spin_button_get_value_as_float (widget); /* g_warning("on_spinbutton_post_suavg:: z_off_dx = %f", */ /* post_par->z_off_dx); */ display_act->pida->averaged_piv = FALSE; } void on_spinbutton_post_svavg (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { gl_post_par->z_off_dy = gtk_spin_button_get_value_as_float (widget); /* g_warning ("n_spinbutton_post_svavg:: z_off_dy = %f", */ /* post_par->z_off_dy); */ display_act->pida->averaged_piv = FALSE; } void on_button_post_savg_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Calculates spatial average displacements"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_post_savg (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PivPost * post = gtk_object_get_data (GTK_OBJECT (widget), "post"); GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gint row, ibuf; cancel_process = FALSE; if (nbufs > 0) { for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; row++) { display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), row); ibuf = display_act->id; if (display[ibuf] != NULL && display_act->mwin != NULL && GTK_WIDGET_VISIBLE (GTK_WIDGET (display_act->mwin)) ) { gdk_window_show (GTK_WIDGET (display_act->mwin)->window); gdk_window_raise (GTK_WIDGET (display_act->mwin)->window); } exec_savg (post); } } } void on_button_post_subavg_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Subtracts mean displacements / offset values from PIV data"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_post_subavg (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PivPost * post = gtk_object_get_data (GTK_OBJECT (widget), "post"); GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gint row, ibuf; cancel_process = FALSE; if (nbufs > 0) { for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; row++) { display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), row); ibuf = display_act->id; if (display[ibuf] != NULL && display_act->mwin != NULL && GTK_WIDGET_VISIBLE (GTK_WIDGET (display_act->mwin)) ) { gdk_window_show (GTK_WIDGET (display_act->mwin)->window); gdk_window_raise (GTK_WIDGET (display_act->mwin)->window); } exec_subavg (post); } } } void on_radiobutton_post_vorstra_output_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Selects the differential quantity"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_radiobutton_post_vorstra_output (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PivPost * post = gtk_object_get_data (GTK_OBJECT (widget), "post"); gl_post_par->operator_vorstra = atoi (gtk_object_get_data (GTK_OBJECT (widget), "operator")); /* fprintf (stderr, "on_radiobutton_post_vorstra_output:: operator_vorstra = %d\n", gl_post_par->operator_vorstra); */ if (gl_post_par->operator_vorstra == GPIV_VORTICITY) { gtk_widget_set_sensitive (post->radiobutton_vorstra_diffscheme_4, TRUE); } else { if (gl_post_par->diff_type == GPIV_CIRCULATION) { gl_post_par->diff_type = GPIV_CENTRAL; gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (post->radiobutton_vorstra_diffscheme_1), TRUE); } gtk_widget_set_sensitive (post->radiobutton_vorstra_diffscheme_4, FALSE); } } void on_radiobutton_post_vorstra_diffscheme_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Selects the type of differential scheme"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_radiobutton_post_vorstra_diffscheme (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { gl_post_par->diff_type = atoi (gtk_object_get_data (GTK_OBJECT (widget), "diff_type")); /* fprintf (stderr, "diff_type = %d\n", post_par->diff_type); */ } void on_button_post_vorstra_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Calculates differential quantity"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_post_vorstra (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gint row, ibuf; cancel_process = FALSE; if (nbufs > 0) { for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; row++) { display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), row); ibuf = display_act->id; if (display[ibuf] != NULL && display_act->mwin != NULL && GTK_WIDGET_VISIBLE (GTK_WIDGET (display_act->mwin)) ) { gdk_window_show (GTK_WIDGET (display_act->mwin)->window); gdk_window_raise (GTK_WIDGET (display_act->mwin)->window); } exec_vorstra (); } } } gpiv-0.6.1/src/pivpost.h0000644000175000017500000000747611110306502012053 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*--------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * (callback) functions for Piv post-processing window/tabulator * $Log: pivpost.h,v $ * Revision 1.5 2007-11-23 16:24:08 gerber * release 0.5.0: Kafka * * Revision 1.4 2006-09-18 07:27:06 gerber * *** empty log message *** * * Revision 1.3 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.2 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef PIVPOST_H #define PIVPOST_H /* * Public post-processing functions */ void exec_scale (PivPost *pivpost); void exec_savg (PivPost *pivpost); void exec_subavg (PivPost *pivpost); void exec_vorstra (void); /* * Piv post-processing callback functions */ void on_spinbutton_post_scale (GtkSpinButton *widget, GtkWidget *entry); /* void */ /* on_checkbutton_post_scale_enter (GtkWidget *widget, */ /* gpointer data); */ /* void */ /* on_checkbutton_post_scale (GtkWidget *widget, */ /* gpointer data); */ void on_button_post_scale_enter (GtkWidget *widget, gpointer data); void on_button_post_scale (GtkWidget *widget, gpointer data); void on_button_post_savg_enter (GtkWidget *widget, gpointer data); void on_spinbutton_post_suavg (GtkSpinButton *widget, GtkWidget *entry); void on_spinbutton_post_svavg (GtkSpinButton *widget, GtkWidget *entry); void on_button_post_savg (GtkWidget *widget, gpointer data); void on_button_post_subavg_enter (GtkWidget *widget, gpointer data); void on_button_post_subavg (GtkWidget *widget, gpointer data); void on_radiobutton_post_vorstra_output_enter (GtkWidget *widget, gpointer data); void on_radiobutton_post_vorstra_output (GtkWidget *widget, gpointer data); void on_radiobutton_post_vorstra_diffscheme_enter (GtkWidget *widget, gpointer data); void on_radiobutton_post_vorstra_diffscheme (GtkWidget *widget, gpointer data); void on_button_post_vorstra_enter (GtkWidget *widget, gpointer data); void on_button_post_vorstra (GtkWidget *widget, gpointer data); #endif /* PIVPOST_H */ gpiv-0.6.1/src/pivvalid.c0000644000175000017500000010324611110305526012155 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*----------------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -----------------------------------------------------------------------------*/ /* * (callback) functions for Piv validation window/tabulator * $Log: pivvalid.c,v $ * Revision 1.16 2008-04-28 12:00:57 gerber * hdf-formatted files are now with .hdf extension (previously: .gpi) * * Revision 1.15 2007-12-19 08:42:35 gerber * debugged * * Revision 1.14 2007-11-23 16:24:08 gerber * release 0.5.0: Kafka * * Revision 1.13 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.12 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.11 2007-01-29 11:27:44 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.10 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.9 2005/06/15 09:40:40 gerber * debugged, optimized * * Revision 1.8 2005/02/26 09:43:31 gerber * parameter flags (parameter_logic) defined as gboolean * * Revision 1.7 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.6 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.5 2003/07/13 14:38:18 gerber * changed error handling of libgpiv * * Revision 1.4 2003/07/12 21:21:16 gerber * changed error handling libgpiv * * Revision 1.2 2003/07/10 11:56:07 gerber * added man page * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #include "gpiv_gui.h" #include "utils.h" #include "pivvalid.h" #include "display.h" /* * Public piv validation functions */ void exec_gradient(void ) /* ---------------------------------------------------------------------------- * Testing on gradient of displacements/veocity within Int. Area */ { if (display_act->pida->exist_piv && !cancel_process) { exec_process = TRUE; gpiv_valid_gradient (gl_piv_par, display_act->pida->piv_data); update_all_vectors (display_act->pida); exec_process = FALSE; } else { warning_gpiv(_("no PIV data")); } } void exec_errvec (PivValid * valid ) /*----------------------------------------------------------------------------- * Calculates histogram of residus and resulting threshold displacement */ { char *err_msg = NULL; guint i; GnomeCanvasItem *bg, *bar, *fitline; GnomeCanvasPoints *points; double canvas_margin = 20.; double canvas_startx = -50.; double canvas_endx = 150.; double disp_width = canvas_endx - canvas_startx - 2 * canvas_margin; double canvas_starty = -50.; double canvas_endy = 150.; double disp_height = canvas_endy - canvas_starty - 2 * canvas_margin; double canvas_x1 = canvas_startx + canvas_margin; double canvas_y1 = canvas_starty + canvas_margin + disp_height; double x_val, y_val, x_normf, y_normf; points = gnome_canvas_points_new (2); if (display_act->pida->exist_piv && !cancel_process) { exec_process = TRUE; if (gpiv_var->residu_stats == TRUE) { /* * Calculate histogram * normalizing histo between 0 and 1 and displaying histo and estimated * line curve */ GpivBinData *klass = NULL; GpivLinRegData *linreg = g_new0 (GpivLinRegData, 1); double centre_max = -10.0E+9; if ((err_msg = gpiv_valid_residu (display_act->pida->piv_data, gl_valid_par, TRUE)) != NULL) { gpiv_error ("exec_errvec: failing gpiv_valid_residu"); } if ((klass = gpiv_valid_residu_stats (display_act->pida->piv_data, display_act->pida->piv_data->nx * display_act->pida->piv_data->ny / GPIV_NBINS_DEFAULT, linreg)) == NULL) { gpiv_error ("exec_errvec: failing gpiv_valid_residu_stats"); } for (i = 0; i < klass->nbins; i++) { if (klass->centre[i] > centre_max) centre_max = klass->centre[i]; } x_normf = (double) disp_width / (klass->max - klass->min); y_normf = (double) centre_max; bg = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS(valid->canvas_histo)), gnome_canvas_rect_get_type(), "x1", (double) canvas_startx , "y1", (double) canvas_starty, "x2", (double) canvas_endx , "y2", (double) canvas_endy, "fill_color", "darkblue", "outline_color", "red", "width_units", 2.0, NULL); for (i = 0; i < klass->nbins - 1; i++) { x_val = (double) (klass->bound[i]) / x_normf; y_val = (double) klass->centre[i] / y_normf; bar = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (valid->canvas_histo)), gnome_canvas_rect_get_type(), "x1", canvas_x1 + (double) klass->bound[i] * x_normf, "y1", canvas_y1 - (double) disp_height * y_val, "x2", canvas_x1 + (double) klass->bound[i + 1] * x_normf, "y2", (double) canvas_y1, "fill_color", "darkgreen", "outline_color", "blue", "width_units", 2.0, NULL); } gl_valid_par->residu_max = gpiv_valid_threshold (display_act->pida->piv_par, gl_valid_par, linreg); gtk_spin_button_set_value (GTK_SPIN_BUTTON (valid->spinbutton_errvec_res), gl_valid_par->residu_max); #ifdef DEBUG g_message("gpiv_valid_errvec:: c1 = %f int_size_f = %d yield = %f residu_max = %f", linreg->c1, gl_piv_par->int_size_f, gl_valid_par->data_yield, gl_valid_par->residu_max); #endif points->coords[0] = (double) canvas_x1; points->coords[1] = (double) canvas_y1 - (double) linreg->c0 / y_normf * (double) disp_height ; points->coords[2] = (double) canvas_x1 + (double) disp_width; points->coords[3] = (double) canvas_y1 - (double) linreg->c0 / y_normf * (double) disp_height - (double) linreg->c1 * (double) (disp_width) * (double) (disp_height) / ( x_normf * y_normf) ; fitline = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS(valid->canvas_histo)), gnome_canvas_line_get_type(), "points", points, "fill_color", "red", "width_units", (double) 2.0, NULL); gpiv_free_bindata (klass); } else { if ((err_msg = gpiv_valid_errvec (display_act->pida->piv_data, display_act->img->image, gl_piv_par, gl_valid_par, FALSE)) != NULL) gpiv_error ("%s: %s", RCSID, err_msg); update_all_vectors (display_act->pida); } display_act->pida->exist_valid = TRUE; /* * Copy parameters in Buffer structure for saving and, eventual, * later use */ display_act->pida->valid_par->residu_max = gl_valid_par->residu_max; display_act->pida->valid_par->data_yield = gl_valid_par->data_yield; display_act->pida->valid_par->residu_type = gl_valid_par->residu_type; display_act->pida->valid_par->subst_type = gl_valid_par->subst_type; display_act->pida->valid_par->histo_type = gl_valid_par->histo_type; display_act->pida->valid_par->residu_max__set = TRUE; display_act->pida->valid_par->data_yield__set = gl_valid_par->data_yield__set; display_act->pida->valid_par->residu_type__set = TRUE; display_act->pida->valid_par->subst_type__set = TRUE; display_act->pida->valid_par->histo_type__set = TRUE; exec_process = FALSE; } else { warning_gpiv(_("no PIV data")); } gnome_canvas_points_free(points); } void exec_peaklock (PivValid * valid ) /*----------------------------------------------------------------------------- * Calculates and displays peaklocking histogram of a single PIV data set */ { guint i; GnomeCanvasItem *bg, *bar; double canvas_margin = 20.; double canvas_startx = -50.; double canvas_endx = 150.; double d_width = canvas_endx - canvas_startx - 2 * canvas_margin; double canvas_starty = -50.; double canvas_endy = 150.; double d_height = canvas_endy - canvas_starty - 2 * canvas_margin; double canvas_x1 = canvas_startx + canvas_margin; double canvas_y1 = canvas_starty + canvas_margin + d_height; double y_val; gint count_max = -10000; GpivBinData *klass = NULL; if (display_act->pida->exist_piv && !cancel_process) { exec_process = TRUE; /* * Calculates and normalizes klass data between 0 and 1 */ if ((klass = gpiv_valid_peaklck (display_act->pida->piv_data, gpiv_par->console__nbins)) == NULL) { gpiv_error ("exec_peaklock: failing gpiv_valid_peaklck"); } for (i = 0; i < klass->nbins; i++) { if ((double) klass->count[i] > count_max) { count_max = klass->count[i]; } } /* * Displaying background and histogram */ bg = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS(valid->canvas_histo)), gnome_canvas_rect_get_type(), "x1", (double) canvas_startx , "y1", (double) canvas_starty, "x2", (double) canvas_endx , "y2", (double) canvas_endy, "fill_color", "darkgreen", "outline_color", "red", "width_units", 2.0, NULL); for (i = 0; i < klass->nbins; i++) { if (count_max != 0) { y_val = (double) klass->count[i] / (double) count_max; } else { y_val = 0.0; } bar = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS(valid->canvas_histo)), gnome_canvas_rect_get_type(), "x1", canvas_x1 + (double) klass->bound[i] * d_width, "y1", canvas_y1 - (double) d_height * y_val, "x2", canvas_x1 + (double) klass->bound[i+1] * d_width, "y2", canvas_y1, "fill_color", "yellow", "outline_color", "blue", "width_units", 2.0, NULL); } gpiv_free_bindata (klass); exec_process = FALSE; } else { warning_gpiv (_("no PIV data")); } } void exec_uvhisto (PivValid * valid, enum GpivVelComponent velcomp ) /*----------------------------------------------------------------------------- */ { guint i; GnomeCanvasItem *bg, *bar; double canvas_margin = 20.; double canvas_startx = -50.; double canvas_endx = 150.; double d_width = canvas_endx - canvas_startx - 2 * canvas_margin; double canvas_starty = -50.; double canvas_endy = 150.; double d_height = canvas_endy - canvas_starty - 2 * canvas_margin; double canvas_x1 = canvas_startx + canvas_margin; double canvas_y1 = canvas_starty + canvas_margin + d_height; double y_val; gint count_max = -10000; /* char c_line[GPIV_MAX_LINES_C][GPIV_MAX_CHARS]; */ if (display_act->pida->exist_histo == TRUE) { /* g_message("exec_uvhisto:: calling gpiv_free_bindata"); */ gpiv_free_bindata (display_act->pida->klass); } if (display_act->pida->exist_piv && !cancel_process) { exec_process = TRUE; /* BUGFIX: quick hack to display u velocities */ /* g_message("::will process uhisto"); */ if ((display_act->pida->klass = gpiv_post_uvhisto (display_act->pida->piv_data, gpiv_par->console__nbins, velcomp)) == NULL) { gpiv_error ("exec_uvhisto: failing gpiv_post_uvhisto"); } /* gpiv_print_histo(display_act->pida->klass, */ /* c_line, */ /* 0, */ /* display_act->pida->scaled_piv, */ /* VERSION); */ /* * normalizing data between 0 and 1 */ for (i = 0; i < display_act->pida->klass->nbins; i++) { if ((double) display_act->pida->klass->count[i] > count_max) { count_max = display_act->pida->klass->count[i]; } } /* * Displaying */ bg = gnome_canvas_item_new(gnome_canvas_root (GNOME_CANVAS(valid->canvas_histo)), gnome_canvas_rect_get_type(), "x1", (double) canvas_startx , "y1", (double) canvas_starty, "x2", (double) canvas_endx , "y2", (double) canvas_endy, "fill_color", "darkgreen", "outline_color", "red", "width_units", 2.0, NULL); for (i = 0; i < display_act->pida->klass->nbins; i++) { if (count_max != 0) { y_val = (double) display_act->pida->klass->count[i] / (double) count_max; } else { y_val = 0.0; } bar = gnome_canvas_item_new(gnome_canvas_root (GNOME_CANVAS(valid->canvas_histo)), gnome_canvas_rect_get_type(), "x1", canvas_x1 + (double) (d_width / display_act->pida->klass->nbins * i), "y1", canvas_y1 - (double) d_height * y_val, "x2", canvas_x1 + (double) (d_width/ display_act->pida->klass->nbins * (i+1)), "y2", canvas_y1, "fill_color", "yellow", "outline_color", "blue", "width_units", 2.0, NULL); } /* gpiv_free_bindata(display_act->pida->klass); */ display_act->pida->exist_histo = TRUE; display_act->pida->saved_histo = FALSE; exec_process = FALSE; } else { warning_gpiv(_("no PIV data")); } } /* * Piv validation window/tabulator callbacks */ void on_button_valid_gradient_enter (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Examines PIV data on velocity gradients"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_valid_gradient (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gint row, ibuf; cancel_process = FALSE; if (nbufs > 0) { for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; row++) { display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), row); ibuf = display_act->id; if (display[ibuf] != NULL && display_act->mwin != NULL && GTK_WIDGET_VISIBLE (GTK_WIDGET (display_act->mwin)) ) { gdk_window_show (GTK_WIDGET (display_act->mwin)->window); gdk_window_raise (GTK_WIDGET (display_act->mwin)->window); } exec_gradient (); } } } void on_radiobutton_valid_disable_0_enter (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("No mouse activity within displayer"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_radiobutton_valid_disable_1_enter (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Enables a single PIV data-point"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_radiobutton_valid_disable_2_enter (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Disables a single PIV data-point"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_radiobutton_valid_disable_3_enter (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Enables an area containing PIV data"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_radiobutton_valid_disable_4_enter (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Disables an area containing PIV data"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_radiobutton_valid_disable (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { m_select = atoi (gtk_object_get_data (GTK_OBJECT (widget), "mouse_select")); } void on_radiobutton_valid_errvec_residu_enter (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Defines residu type to examine data on"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_radiobutton_valid_errvec_residu (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { gl_valid_par->residu_type = atoi (gtk_object_get_data (GTK_OBJECT (widget), "residu")); } void on_button_valid_errvec_resstats_enter (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole * gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Displays inverse cumulative histogram of residus"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_valid_errvec_resstats (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PivValid * valid = gtk_object_get_data (GTK_OBJECT (widget), "valid"); GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gint row, ibuf; cancel_process = FALSE; gpiv_var->residu_stats = TRUE; if (nbufs > 0) { for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; row++) { display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), row); ibuf = display_act->id; if (display[ibuf] != NULL && display_act->mwin != NULL && GTK_WIDGET_VISIBLE (GTK_WIDGET (display_act->mwin)) ) { gdk_window_show (GTK_WIDGET (display_act->mwin)->window); gdk_window_raise (GTK_WIDGET (display_act->mwin)->window); } exec_errvec (valid); } gpiv_var->residu_stats = FALSE; } } void on_spinbutton_valid_errvec_neighbors (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { gl_valid_par->neighbors = gtk_spin_button_get_value_as_int (widget); } void on_spinbutton_valid_errvec_yield (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { gl_valid_par->data_yield = gtk_spin_button_get_value_as_float (widget); } void on_spinbutton_valid_errvec_res (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { gl_valid_par->residu_max = gtk_spin_button_get_value_as_float (widget); if (v_color == SHOW_SNR && display_act->pida->exist_piv) { update_all_vectors (display_act->pida); } } void on_checkbutton_valid_errvec_disres_enter (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Display PIV vector colors related to residu or SNR value"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_checkbutton_valid_errvec_disres (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON (widget)->active) { v_color = SHOW_SNR; } else { v_color = SHOW_PEAKNR; } if (display_act->pida->exist_piv && display_act->display_piv) { update_all_vectors (display_act->pida); } } void on_radiobutton_valid_errvec_subst_enter (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = NULL; gint ltype = atoi (gtk_object_get_data (GTK_OBJECT (widget), "substitute")); if (ltype == GPIV_VALID_SUBSTYPE__NONE) { msg = _("Only sets peak_no (flag) to zero"); } else if (ltype == GPIV_VALID_SUBSTYPE__L_MEAN) { msg = _("mean from surroundings"); } else if (ltype == GPIV_VALID_SUBSTYPE__MEDIAN) { msg = _("Median (middle value) from surroundings"); } else if (ltype == GPIV_VALID_SUBSTYPE__COR_PEAK) { msg = _("Re-interrogates and uses next corr. peak as estimator"); } else { g_error ("NO valid ltype\n"); } gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_radiobutton_valid_errvec_subst (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { gl_valid_par->subst_type = atoi (gtk_object_get_data (GTK_OBJECT (widget), "substitute")); } void on_button_valid_errvec_enter (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Examines PIV data on outliers and substitutes"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_valid_errvec (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PivValid * valid = gtk_object_get_data (GTK_OBJECT (widget), "valid"); GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gint row, ibuf; cancel_process = FALSE; gpiv_var->residu_stats = FALSE; if (nbufs > 0) { for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; row++) { display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), row); ibuf = display_act->id; if (display[ibuf] != NULL && display_act->mwin != NULL && GTK_WIDGET_VISIBLE (GTK_WIDGET (display_act->mwin)) ) { gdk_window_show (GTK_WIDGET (display_act->mwin)->window); gdk_window_raise (GTK_WIDGET (display_act->mwin)->window); } exec_errvec (valid); } } } void on_spinbutton_valid_peaklck_bins (GtkSpinButton * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { gpiv_par->console__nbins = gtk_spin_button_get_value_as_int (widget); } void on_button_valid_peaklck_enter (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Calculates a histogram of sub-pixel displacements"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_valid_peaklck (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PivValid * valid = gtk_object_get_data (GTK_OBJECT (widget), "valid"); GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gint row, ibuf; cancel_process = FALSE; if (nbufs > 0) { for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; row++) { display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), row); ibuf = display_act->id; if (display[ibuf] != NULL && display_act->mwin != NULL && GTK_WIDGET_VISIBLE (GTK_WIDGET (display_act->mwin)) ) { gdk_window_show (GTK_WIDGET (display_act->mwin)->window); gdk_window_raise (GTK_WIDGET (display_act->mwin)->window); } exec_peaklock (valid); } } } void on_button_valid_uhisto_enter (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _ ("Calculates a histogram of horizontal displacements."); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_valid_uhisto (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PivValid * valid = gtk_object_get_data (GTK_OBJECT (widget), "valid"); GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gint row, ibuf; cancel_process = FALSE; if (nbufs > 0) { for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; row++) { display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), row); ibuf = display_act->id; if (display[ibuf] != NULL && display_act->mwin != NULL && GTK_WIDGET_VISIBLE (GTK_WIDGET (display_act->mwin)) ) { gdk_window_show (GTK_WIDGET (display_act->mwin)->window); gdk_window_raise (GTK_WIDGET (display_act->mwin)->window); } exec_uvhisto (valid, GPIV_U); } } } void on_button_valid_vhisto_enter (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Calculates a histogram of vertical displacements."); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_valid_vhisto (GtkWidget * widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PivValid * valid = gtk_object_get_data (GTK_OBJECT (widget), "valid"); GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gint row, ibuf; cancel_process = FALSE; if (nbufs > 0) { for (row = gpiv->first_selected_row; row <= gpiv->last_selected_row; row++) { display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), row); ibuf = display_act->id; if (display[ibuf] != NULL && display_act->mwin != NULL && GTK_WIDGET_VISIBLE (GTK_WIDGET (display_act->mwin)) ) { gdk_window_show (GTK_WIDGET (display_act->mwin)->window); gdk_window_raise (GTK_WIDGET (display_act->mwin)->window); } exec_uvhisto (valid, GPIV_V); } } } gpiv-0.6.1/src/pivvalid.h0000644000175000017500000001222311110306455012156 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * (callback) functions for Piv validation window/tabulator * $Log: pivvalid.h,v $ * Revision 1.5 2007-11-23 16:24:08 gerber * release 0.5.0: Kafka * * Revision 1.4 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.3 2006/01/31 14:28:13 gerber * version 0.3.0 * * Revision 1.2 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef PIVVALID_H #define PIVVALID_H /* * Public piv validation functions */ void exec_gradient (void); void exec_errvec (PivValid *valid); void exec_peaklock (PivValid *valid); void exec_uvhisto (PivValid *valid, enum GpivVelComponent velcomp); /* * Piv validation callbacks functions */ void on_button_valid_gradient_enter (GtkWidget * idget, gpointer data); void on_button_valid_gradient (GtkWidget *widget, gpointer data); void on_radiobutton_valid_disable_0_enter (GtkWidget *widget, gpointer data); void on_radiobutton_valid_disable_1_enter (GtkWidget *widget, gpointer data); void on_radiobutton_valid_disable_2_enter (GtkWidget *widget, gpointer data); void on_radiobutton_valid_disable_3_enter (GtkWidget *widget, gpointer data); void on_radiobutton_valid_disable_4_enter (GtkWidget *widget, gpointer data); void on_radiobutton_valid_disable (GtkWidget *widget, gpointer data); void on_radiobutton_valid_errvec_residu_enter (GtkWidget *widget, gpointer data); void on_radiobutton_valid_errvec_residu (GtkWidget *widget, gpointer data); void on_button_valid_errvec_resstats_enter (GtkWidget *widget, gpointer data); void on_button_valid_errvec_resstats (GtkWidget *widget, gpointer data); void on_spinbutton_valid_errvec_yield (GtkSpinButton *widget, GtkWidget *entry); void on_spinbutton_valid_errvec_neighbors (GtkSpinButton *widget, GtkWidget *entry); void on_spinbutton_valid_errvec_res (GtkSpinButton *widget, GtkWidget *entry); void on_checkbutton_valid_errvec_disres_enter (GtkWidget *widget, gpointer data); void on_checkbutton_valid_errvec_disres (GtkSpinButton *widget, GtkWidget *entry); void on_radiobutton_valid_errvec_subst_enter (GtkWidget *widget, gpointer data); void on_radiobutton_valid_errvec_subst (GtkWidget *widget, gpointer data); void on_button_valid_errvec_enter (GtkWidget *widget, gpointer data); void on_button_valid_errvec (GtkWidget *widget, gpointer data); void on_spinbutton_valid_peaklck_bins (GtkSpinButton *widget, GtkWidget *entry); void on_button_valid_peaklck_enter (GtkWidget *widget, gpointer data); void on_button_valid_peaklck (GtkWidget *widget, gpointer data); void on_button_valid_uhisto_enter (GtkWidget *widget, gpointer data); void on_button_valid_uhisto (GtkWidget *widget, gpointer data); void on_button_valid_vhisto_enter (GtkWidget *widget, gpointer data); void on_button_valid_vhisto (GtkWidget *widget, gpointer data); #endif /* PIVVALID_H */ gpiv-0.6.1/src/Makefile.am0000644000175000017500000000401011076052422012221 00000000000000## Process this file with automake to produce Makefile.in pixmapsdir = $(datadir)/pixmaps/ ENABLE_CAM = @ENABLE_CAM@ ENABLE_TRIG = @ENABLE_TRIG@ ENABLE_DAC = @ENABLE_DAC@ ENABLE_MPI = @ENABLE_MPI@ CANVAS_AA = @CANVAS_AA@ RTA_TOPDIR = @RTA_TOPDIR@ K_TOPDIR = @K_TOPDIR@ #$(GNOME_CFLAGS) INCLUDES = \ $(GNOME_INCLUDEDIR) \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ @GPIV_CFLAGS@ \ -I$(RTA_TOPDIR)/include \ -I$(K_TOPDIR)/include \ -DPREFIX=\""$(prefix)"\" \ -DDATADIR=\""$(datadir)"\" \ -DPIXMAPSDIR=\""$(pixmapsdir)"\" \ -DSYSCONFDIR=\""$(sysconfdir)"\" \ -DLIBDIR=\""$(libdir)"\" bin_PROGRAMS = gpiv gpiv_SOURCES = \ pivpost.c pivpost.h \ pivpost_interface.c pivpost_interface.h \ pivvalid.c pivvalid.h \ pivvalid_interface.c pivvalid_interface.h \ piveval.c piveval.h \ piveval_interrogate.c piveval_interrogate.h \ piveval_interface.c piveval_interface.h \ imgh.c imgh.h \ imgh_interface.c imgh_interface.h \ imgproc.c imgproc.h \ imgproc_interface.c imgproc_interface.h \ dac.c dac.h \ dac_interface.c dac_interface.h \ dac_cam.c dac_cam.h \ dac_trig.c dac_trig.h \ display_scalars.c display_scalars.h \ display_piv.c display_piv.h \ display_intregs.c display_intregs.h \ display_image.c display_image.h \ display_event.c display_event.h \ display_zoom.c display_zoom.h \ display.c display.h \ display_interface.c display_interface.h display_menus.h \ console.c console.h \ console_interface.c console_interface.h console_menus.h \ dialog.c dialog.h \ dialog_interface.c dialog_interface.h \ preferences.c preferences.h \ preferences_interface.c preferences_interface.h \ print.c print.h \ support.c support.h \ io.c io.h \ utils.c utils.h \ utils_par.c utils_par.h \ main.c main.h gpiv_gui.h AM_CFLAGS = @OVERRIDE_IMAGE_WIDTH_MAX@ \ @OVERRIDE_IMAGE_HEIGHT_MAX@ \ @DEBUG@ \ @ENABLE_CAM@ \ @ENABLE_TRIG@ \ @ENABLE_DAC@ \ @ENABLE_MPI@ \ @CANVAS_AA@ ## @GNOME_DISABLE_DEPRECATED@ \ ## $(prefix) \ gpiv_LDADD = $(GPIV_LIBS) EXTRA_DIST = Makefile.in gpiv-0.6.1/src/Makefile.in0000644000175000017500000004463411204234174012251 00000000000000# Makefile.in generated by automake 1.10.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : bin_PROGRAMS = gpiv$(EXEEXT) subdir = src DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = am__installdirs = "$(DESTDIR)$(bindir)" binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) PROGRAMS = $(bin_PROGRAMS) am_gpiv_OBJECTS = pivpost.$(OBJEXT) pivpost_interface.$(OBJEXT) \ pivvalid.$(OBJEXT) pivvalid_interface.$(OBJEXT) \ piveval.$(OBJEXT) piveval_interrogate.$(OBJEXT) \ piveval_interface.$(OBJEXT) imgh.$(OBJEXT) \ imgh_interface.$(OBJEXT) imgproc.$(OBJEXT) \ imgproc_interface.$(OBJEXT) dac.$(OBJEXT) \ dac_interface.$(OBJEXT) dac_cam.$(OBJEXT) dac_trig.$(OBJEXT) \ display_scalars.$(OBJEXT) display_piv.$(OBJEXT) \ display_intregs.$(OBJEXT) display_image.$(OBJEXT) \ display_event.$(OBJEXT) display_zoom.$(OBJEXT) \ display.$(OBJEXT) display_interface.$(OBJEXT) \ console.$(OBJEXT) console_interface.$(OBJEXT) dialog.$(OBJEXT) \ dialog_interface.$(OBJEXT) preferences.$(OBJEXT) \ preferences_interface.$(OBJEXT) print.$(OBJEXT) \ support.$(OBJEXT) io.$(OBJEXT) utils.$(OBJEXT) \ utils_par.$(OBJEXT) main.$(OBJEXT) gpiv_OBJECTS = $(am_gpiv_OBJECTS) am__DEPENDENCIES_1 = gpiv_DEPENDENCIES = $(am__DEPENDENCIES_1) DEFAULT_INCLUDES = -I.@am__isrc@ depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ SOURCES = $(gpiv_SOURCES) DIST_SOURCES = $(gpiv_SOURCES) ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CANVAS_AA = @CANVAS_AA@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONTROL = @CONTROL@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUG = @DEBUG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_CAM = @ENABLE_CAM@ ENABLE_DAC = @ENABLE_DAC@ ENABLE_MPI = @ENABLE_MPI@ ENABLE_MPI_RR = @ENABLE_MPI_RR@ ENABLE_TRIG = @ENABLE_TRIG@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GPIV_CFLAGS = @GPIV_CFLAGS@ GPIV_LIBS = @GPIV_LIBS@ GPIV_UI_CFLAGS = @GPIV_UI_CFLAGS@ GPIV_UI_LIBS = @GPIV_UI_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ K_TOPDIR = @K_TOPDIR@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MPIRUN = @MPIRUN@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OVERRIDE_IMAGE_HEIGHT_MAX = @OVERRIDE_IMAGE_HEIGHT_MAX@ OVERRIDE_IMAGE_WIDTH_MAX = @OVERRIDE_IMAGE_WIDTH_MAX@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RR = @RR@ RTA_TOPDIR = @RTA_TOPDIR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ pixmapsdir = $(datadir)/pixmaps/ #$(GNOME_CFLAGS) INCLUDES = \ $(GNOME_INCLUDEDIR) \ -DPACKAGE_LOCALE_DIR=\""$(prefix)/$(DATADIRNAME)/locale"\" \ -DPACKAGE_DATA_DIR=\""$(datadir)"\" \ @GPIV_CFLAGS@ \ -I$(RTA_TOPDIR)/include \ -I$(K_TOPDIR)/include \ -DPREFIX=\""$(prefix)"\" \ -DDATADIR=\""$(datadir)"\" \ -DPIXMAPSDIR=\""$(pixmapsdir)"\" \ -DSYSCONFDIR=\""$(sysconfdir)"\" \ -DLIBDIR=\""$(libdir)"\" gpiv_SOURCES = \ pivpost.c pivpost.h \ pivpost_interface.c pivpost_interface.h \ pivvalid.c pivvalid.h \ pivvalid_interface.c pivvalid_interface.h \ piveval.c piveval.h \ piveval_interrogate.c piveval_interrogate.h \ piveval_interface.c piveval_interface.h \ imgh.c imgh.h \ imgh_interface.c imgh_interface.h \ imgproc.c imgproc.h \ imgproc_interface.c imgproc_interface.h \ dac.c dac.h \ dac_interface.c dac_interface.h \ dac_cam.c dac_cam.h \ dac_trig.c dac_trig.h \ display_scalars.c display_scalars.h \ display_piv.c display_piv.h \ display_intregs.c display_intregs.h \ display_image.c display_image.h \ display_event.c display_event.h \ display_zoom.c display_zoom.h \ display.c display.h \ display_interface.c display_interface.h display_menus.h \ console.c console.h \ console_interface.c console_interface.h console_menus.h \ dialog.c dialog.h \ dialog_interface.c dialog_interface.h \ preferences.c preferences.h \ preferences_interface.c preferences_interface.h \ print.c print.h \ support.c support.h \ io.c io.h \ utils.c utils.h \ utils_par.c utils_par.h \ main.c main.h gpiv_gui.h AM_CFLAGS = @OVERRIDE_IMAGE_WIDTH_MAX@ \ @OVERRIDE_IMAGE_HEIGHT_MAX@ \ @DEBUG@ \ @ENABLE_CAM@ \ @ENABLE_TRIG@ \ @ENABLE_DAC@ \ @ENABLE_MPI@ \ @CANVAS_AA@ gpiv_LDADD = $(GPIV_LIBS) EXTRA_DIST = Makefile.in all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" @list='$(bin_PROGRAMS)'; for p in $$list; do \ p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ if test -f $$p \ ; then \ f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ else :; fi; \ done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; for p in $$list; do \ f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ rm -f "$(DESTDIR)$(bindir)/$$f"; \ done clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) gpiv$(EXEEXT): $(gpiv_OBJECTS) $(gpiv_DEPENDENCIES) @rm -f gpiv$(EXEEXT) $(LINK) $(gpiv_OBJECTS) $(gpiv_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/console.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/console_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dac.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dac_cam.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dac_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dac_trig.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dialog.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dialog_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display_event.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display_image.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display_intregs.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display_piv.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display_scalars.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/display_zoom.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imgh.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imgh_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imgproc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/imgproc_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/io.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/piveval.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/piveval_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/piveval_interrogate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pivpost.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pivpost_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pivvalid.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pivvalid_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preferences.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/preferences_interface.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/support.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils_par.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c $< .c.obj: @am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ mv -f $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: for dir in "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-exec-am: install-binPROGRAMS install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ clean-generic ctags distclean distclean-compile \ distclean-generic distclean-tags distdir dvi dvi-am html \ html-am info info-am install install-am install-binPROGRAMS \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ uninstall-am uninstall-binPROGRAMS # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gpiv-0.6.1/src/support.c0000644000175000017500000001023411110305420012036 00000000000000/*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * $Log: support.c,v $ * Revision 1.3 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.2 2006/01/31 14:28:13 gerber * version 0.3.0 * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifdef HAVE_CONFIG_H # include #endif #include #include #include #include #include #include #include "support.h" #include "gpiv_gui.h" GtkWidget* lookup_widget (GtkWidget *widget, const gchar *widget_name) { GtkWidget *parent, *found_widget; for (;;) { if (GTK_IS_MENU (widget)) parent = gtk_menu_get_attach_widget (GTK_MENU (widget)); else parent = widget->parent; if (!parent) parent = (GtkWidget*) g_object_get_data (G_OBJECT (widget), "GladeParentKey"); if (parent == NULL) break; widget = parent; } found_widget = (GtkWidget*) g_object_get_data (G_OBJECT (widget), widget_name); if (!found_widget) g_warning ("Widget not found: %s", widget_name); return found_widget; } /* This is an internally used function to create pixmaps. */ GtkWidget* create_pixmap (GtkWidget *widget, const gchar *filename) { GtkWidget *pixmap; gchar *pathname; if (!filename || !filename[0]) return gtk_image_new (); pathname = gnome_program_locate_file (NULL, GNOME_FILE_DOMAIN_APP_PIXMAP, filename, TRUE, NULL); if (!pathname) { g_warning (_("Couldn't find pixmap file: %s"), filename); return gtk_image_new (); } pixmap = gtk_image_new_from_file (pathname); g_free (pathname); return pixmap; } /* This is an internally used function to create pixmaps. */ GdkPixbuf* create_pixbuf (const gchar *filename) { gchar *pathname = NULL; GdkPixbuf *pixbuf; GError *error = NULL; if (!filename || !filename[0]) return NULL; pathname = gnome_program_locate_file (NULL, GNOME_FILE_DOMAIN_APP_PIXMAP, filename, TRUE, NULL); if (!pathname) { g_warning (_("Couldn't find pixmap file: %s"), filename); return NULL; } pixbuf = gdk_pixbuf_new_from_file (pathname, &error); if (!pixbuf) { fprintf (stderr, "Failed to load pixbuf file: %s: %s\n", pathname, error->message); g_error_free (error); } g_free (pathname); return pixbuf; } /* This is used to set ATK action descriptions. */ void glade_set_atk_action_description (AtkAction *action, const gchar *action_name, const gchar *description) { gint n_actions, i; n_actions = atk_action_get_n_actions (action); for (i = 0; i < n_actions; i++) { if (!strcmp (atk_action_get_name (action, i), action_name)) atk_action_set_description (action, i, description); } } gpiv-0.6.1/src/support.h0000644000175000017500000000461311110306366012061 00000000000000/*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * $Log: support.h,v $ * Revision 1.3 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.2 2006/01/31 14:28:13 gerber * version 0.3.0 * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #include /* * Public Functions. */ /* * This function returns a widget in a component created by Glade. * Call it with the toplevel widget in the component (i.e. a window/dialog), * or alternatively any widget in the component, and the name of the widget * you want returned. */ GtkWidget* lookup_widget (GtkWidget *widget, const gchar *widget_name); /* * Private Functions. */ /* This is used to create the pixmaps used in the interface. */ GtkWidget* create_pixmap (GtkWidget *widget, const gchar *filename); /* This is used to create the pixbufs used in the interface. */ GdkPixbuf* create_pixbuf (const gchar *filename); /* This is used to set ATK action descriptions. */ void glade_set_atk_action_description (AtkAction *action, const gchar *action_name, const gchar *description); gpiv-0.6.1/src/imgh.c0000644000175000017500000004500411110305720011254 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * Image header window/tabulator callbacks * $Log: imgh.c,v $ * Revision 1.12 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.11 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.10 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.9 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.7 2005/02/26 09:43:30 gerber * parameter flags (parameter_logic) defined as gboolean * * Revision 1.6 2005/01/19 15:53:41 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.5 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.4 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.3 2003/09/01 11:17:15 gerber * improved monitoring of interrogation process * * Revision 1.2 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #include "gpiv_gui.h" #include "imgh.h" void on_radiobutton_imgh_mouse_1_enter (GtkWidget *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("No action"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_radiobutton_imgh_mouse_2_enter (GtkWidget *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Points the length spanned by a ruler in the image"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_radiobutton_imgh_mouse_3_enter (GtkWidget *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Points the vertical length by a ruler in the image"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_radiobutton_imgh_mouse_4_enter (GtkWidget *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- * Main program of gpiv */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Points the horizontal length by a ruler in the image"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_radiobutton_imgh_mouse (GtkWidget *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { m_select = atoi (gtk_object_get_data (GTK_OBJECT (widget), "mouse_select")); if (m_select == NO_MS) { gl_piv_par->int_geo = GPIV_AOI; } else if (m_select == SPANLENGTH_MS) { } else if (m_select == V_SPANLENGTH_MS) { } else if (m_select == H_SPANLENGTH_MS) { } else { g_warning ("on_radiobutton_imgh_mouse: should not arrive here"); } } void on_spinbutton_post_scale_px (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gpiv_var->img_span_px = gtk_spin_button_get_value_as_float (widget); gnome_config_push_prefix ("/gpiv/RuntimeVariables/"); gnome_config_set_float ("span", gpiv_var->img_span_px); gnome_config_pop_prefix (); gnome_config_sync (); gl_image_par->s_scale = gpiv_var->img_length_mm / gpiv_var->img_span_px; gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->imgh->spinbutton_sscale), gl_image_par->s_scale); if (display_act != NULL) { display_act->img->image->header->s_scale = gl_image_par->s_scale; display_act->img->image->header->s_scale__set = TRUE; display_act->img->saved_img = FALSE; } } void on_spinbutton_post_scale_mm (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gpiv_var->img_length_mm = gtk_spin_button_get_value_as_float (widget); gnome_config_set_float ("length", gpiv_var->img_length_mm); gnome_config_sync (); gl_image_par->s_scale = gpiv_var->img_length_mm / gpiv_var->img_span_px; gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->imgh->spinbutton_sscale), gl_image_par->s_scale); if (display_act != NULL) { display_act->img->image->header->s_scale = gl_image_par->s_scale; display_act->img->image->header->s_scale__set = TRUE; display_act->img->saved_img = FALSE; } } void on_entry_imgh_title (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { Imgheader *imgh = gtk_object_get_data (GTK_OBJECT (widget), "imgh"); g_snprintf (gl_image_par->title, GPIV_MAX_CHARS, "%s", gtk_entry_get_text (GTK_ENTRY (imgh->entry_imgtitle))); gl_image_par->title__set = TRUE; if (display_act != NULL) { gint length = GTK_ENTRY (entry)->text_length; if (length == 0) { display_act->img->image->header->title__set = FALSE; } else { g_snprintf (display_act->img->image->header->title, GPIV_MAX_CHARS, "%s", gl_image_par->title); display_act->img->image->header->title__set = TRUE; display_act->img->saved_img = FALSE; } } } void on_entry_imgh_crdate (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { Imgheader *imgh = gtk_object_get_data (GTK_OBJECT (widget), "imgh"); g_snprintf (gl_image_par->creation_date, GPIV_MAX_CHARS, "%s", gtk_entry_get_text (GTK_ENTRY (imgh->entry_crdate))); gl_image_par->creation_date__set = TRUE; if (display_act != NULL) { gint length = GTK_ENTRY (entry)->text_length; if (length == 0) { display_act->img->image->header->creation_date__set = FALSE; } else { g_snprintf (display_act->img->image->header->creation_date, GPIV_MAX_CHARS, "%s", gl_image_par->creation_date); display_act->img->image->header->creation_date__set = TRUE; display_act->img->saved_img = FALSE; } } } void on_entry_imgh_location (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { Imgheader *imgh = gtk_object_get_data (GTK_OBJECT (widget), "imgh"); g_snprintf (gl_image_par->location, GPIV_MAX_CHARS, "%s", gtk_entry_get_text (GTK_ENTRY (imgh->entry_location))); gl_image_par->location__set = TRUE; if (display_act != NULL) { gint length = GTK_ENTRY (entry)->text_length; if (length == 0) { display_act->img->image->header->location__set = FALSE; } else { g_snprintf (display_act->img->image->header->location, GPIV_MAX_CHARS,"%s", gl_image_par->location); display_act->img->image->header->location__set = TRUE; display_act->img->saved_img = FALSE; } } } void on_entry_imgh_author (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { Imgheader *imgh = gtk_object_get_data (GTK_OBJECT (widget), "imgh"); g_snprintf (gl_image_par->author, GPIV_MAX_CHARS, "%s", gtk_entry_get_text (GTK_ENTRY (imgh->entry_author))); gl_image_par->author__set = TRUE; if (display_act != NULL) { gint length = GTK_ENTRY (entry)->text_length; if (length == 0) { display_act->img->image->header->author__set = FALSE; } else { g_snprintf (display_act->img->image->header->author, GPIV_MAX_CHARS, "%s", gl_image_par->author); display_act->img->image->header->author__set = TRUE; display_act->img->saved_img = FALSE; } } } void on_entry_imgh_software (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { Imgheader *imgh = gtk_object_get_data (GTK_OBJECT (widget), "imgh"); g_snprintf (gl_image_par->software, GPIV_MAX_CHARS, "%s", gtk_entry_get_text (GTK_ENTRY (imgh->entry_software))); gl_image_par->software__set = TRUE; if (display_act != NULL) { gint length = GTK_ENTRY (entry)->text_length; if (length == 0) { display_act->img->image->header->software__set = FALSE; } else { g_snprintf (display_act->img->image->header->software, GPIV_MAX_CHARS, "%s", gl_image_par->software); display_act->img->image->header->software__set = TRUE; display_act->img->saved_img = FALSE; } } } void on_entry_imgh_source (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { Imgheader *imgh = gtk_object_get_data (GTK_OBJECT (widget), "imgh"); g_snprintf (gl_image_par->source, GPIV_MAX_CHARS, "%s", gtk_entry_get_text (GTK_ENTRY (imgh->entry_source))); gl_image_par->source__set = TRUE; if (display_act != NULL) { gint length = GTK_ENTRY (entry)->text_length; if (length == 0) { display_act->img->image->header->source__set = FALSE; } else { g_snprintf(display_act->img->image->header->source, GPIV_MAX_CHARS, "%s", gl_image_par->source); display_act->img->image->header->source__set = TRUE; display_act->img->saved_img = FALSE; } } } void on_entry_imgh_usertext (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { Imgheader *imgh = gtk_object_get_data (GTK_OBJECT (widget), "imgh"); g_snprintf (gl_image_par->usertext, GPIV_MAX_CHARS, "%s", gtk_entry_get_text (GTK_ENTRY (imgh->entry_usertext))); gl_image_par->usertext__set = TRUE; if (display_act != NULL) { gint length = GTK_ENTRY (entry)->text_length; if (length == 0) { display_act->img->image->header->usertext__set = FALSE; } else { g_snprintf (display_act->img->image->header->usertext, GPIV_MAX_CHARS, "%s", gl_image_par->usertext); display_act->img->image->header->usertext__set = TRUE; display_act->img->saved_img = FALSE; } } } void on_entry_imgh_warning (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { Imgheader *imgh = gtk_object_get_data (GTK_OBJECT (widget), "imgh"); g_snprintf (gl_image_par->warning, GPIV_MAX_CHARS, "%s", gtk_entry_get_text (GTK_ENTRY (imgh->entry_warning))); gl_image_par->warning__set = TRUE; if (display_act != NULL) { gint length = GTK_ENTRY (entry)->text_length; if (length == 0) { display_act->img->image->header->warning__set = FALSE; } else { g_snprintf (display_act->img->image->header->warning, GPIV_MAX_CHARS, "%s", gl_image_par->warning); display_act->img->image->header->warning__set = TRUE; display_act->img->saved_img = FALSE; } } } void on_entry_imgh_disclaimer (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { Imgheader *imgh = gtk_object_get_data (GTK_OBJECT (widget), "imgh"); g_snprintf (gl_image_par->disclaimer, GPIV_MAX_CHARS, "%s", gtk_entry_get_text (GTK_ENTRY (imgh->entry_disclaimer))); gl_image_par->disclaimer__set = TRUE; if (display_act != NULL) { gint length = GTK_ENTRY (entry)->text_length; if (length == 0) { display_act->img->image->header->disclaimer__set = FALSE; } else { g_snprintf (display_act->img->image->header->disclaimer, GPIV_MAX_CHARS, "%s", gl_image_par->disclaimer); display_act->img->image->header->disclaimer__set = TRUE; display_act->img->saved_img = FALSE; } } } void on_entry_imgh_comment (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { Imgheader *imgh = gtk_object_get_data (GTK_OBJECT (widget), "imgh"); g_snprintf (gl_image_par->comment, GPIV_MAX_CHARS, "%s", gtk_entry_get_text (GTK_ENTRY (imgh->entry_comment))); gl_image_par->comment__set = TRUE; if (display_act != NULL) { gint length = GTK_ENTRY (entry)->text_length; if (length == 0) { display_act->img->image->header->comment__set = FALSE; } else { g_snprintf (display_act->img->image->header->comment, GPIV_MAX_CHARS, "%s", gl_image_par->comment); display_act->img->image->header->comment__set = TRUE; display_act->img->saved_img = FALSE; } } } void on_entry_imgh_copyright (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { Imgheader *imgh = gtk_object_get_data (GTK_OBJECT (widget), "imgh"); g_snprintf (gl_image_par->copyright, GPIV_MAX_CHARS, "%s", gtk_entry_get_text (GTK_ENTRY (imgh->entry_copyright))); gl_image_par->copyright__set = TRUE; if (display_act != NULL) { gint length = GTK_ENTRY (entry)->text_length; if (length == 0) { display_act->img->image->header->copyright__set = FALSE; } else { g_snprintf (display_act->img->image->header->copyright, GPIV_MAX_CHARS, "%s", gl_image_par->copyright); display_act->img->image->header->copyright__set = TRUE; display_act->img->saved_img = FALSE; } } } void on_entry_imgh_email (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { Imgheader *imgh = gtk_object_get_data (GTK_OBJECT (widget), "imgh"); g_snprintf (gl_image_par->email, GPIV_MAX_CHARS, "%s", gtk_entry_get_text (GTK_ENTRY (imgh->entry_email))); gl_image_par->email__set = TRUE; if (display_act != NULL) { gint length = GTK_ENTRY (entry)->text_length; if (length == 0) { display_act->img->image->header->email__set = FALSE; } else { g_snprintf(display_act->img->image->header->email, GPIV_MAX_CHARS, "%s", gl_image_par->email); display_act->img->image->header->email__set = TRUE; display_act->img->saved_img = FALSE; } } } void on_entry_imgh_url (GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { Imgheader *imgh = gtk_object_get_data (GTK_OBJECT (widget), "imgh"); g_snprintf (gl_image_par->url, GPIV_MAX_CHARS, "%s", gtk_entry_get_text (GTK_ENTRY (imgh->entry_url))); gl_image_par->url__set = TRUE; if (display_act != NULL) { gint length = GTK_ENTRY (entry)->text_length; if (length == 0) { display_act->img->image->header->url__set = FALSE; } else { g_snprintf (display_act->img->image->header->url, GPIV_MAX_CHARS, "%s", gl_image_par->url); display_act->img->image->header->url__set = TRUE; display_act->img->saved_img = FALSE; } } } gpiv-0.6.1/src/imgh.h0000644000175000017500000000724611110306724011274 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * (callback) functions for image header * $Log: imgh.h,v $ * Revision 1.6 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.5 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.4 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.3 2003/09/01 11:17:15 gerber * improved monitoring of interrogation process * * Revision 1.2 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef IMGH_H #define IMGH_H void on_radiobutton_imgh_mouse_1_enter (GtkWidget *widget, GtkWidget *entry); void on_radiobutton_imgh_mouse_2_enter (GtkWidget *widget, GtkWidget *entry); void on_radiobutton_imgh_mouse_3_enter (GtkWidget *widget, GtkWidget *entry); void on_radiobutton_imgh_mouse_4_enter (GtkWidget *widget, GtkWidget *entry); void on_radiobutton_imgh_mouse (GtkWidget *widget, GtkWidget *entry); void on_spinbutton_post_scale_px (GtkSpinButton *widget, GtkWidget *entry); void on_spinbutton_post_scale_mm (GtkSpinButton *widget, GtkWidget *entry); void on_entry_imgh_title (GtkSpinButton *widget, GtkWidget *entry); void on_entry_imgh_crdate (GtkSpinButton *widget, GtkWidget *entry); void on_entry_imgh_location (GtkSpinButton *widget, GtkWidget *entry); void on_entry_imgh_author (GtkSpinButton *widget, GtkWidget *entry); void on_entry_imgh_software (GtkSpinButton *widget, GtkWidget *entry); void on_entry_imgh_source (GtkSpinButton *widget, GtkWidget *entry); void on_entry_imgh_usertext (GtkSpinButton *widget, GtkWidget *entry); void on_entry_imgh_warning (GtkSpinButton *widget, GtkWidget *entry); void on_entry_imgh_disclaimer (GtkSpinButton *widget, GtkWidget *entry); void on_entry_imgh_comment (GtkSpinButton *widget, GtkWidget *entry); void on_entry_imgh_copyright (GtkSpinButton *widget, GtkWidget *entry); void on_entry_imgh_email (GtkSpinButton *widget, GtkWidget *entry); void on_entry_imgh_url (GtkSpinButton *widget, GtkWidget *entry); #endif /* IMGH_H */ gpiv-0.6.1/src/display_interface.c0000644000175000017500000016735411110306027014033 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * interface for create_display * $Log: display_interface.c,v $ * Revision 1.19 2008-04-28 12:00:57 gerber * hdf-formatted files are now with .hdf extension (previously: .gpi) * * Revision 1.18 2007-12-19 08:42:35 gerber * debugged * * Revision 1.17 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.16 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.15 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.14 2007-02-16 17:09:48 gerber * added Gauss weighting on I.A. and SPOF filtering (on correlation function) * * Revision 1.13 2007/02/05 15:17:09 gerber * auto stretching, broadcast display settings to buffers from preferences * * Revision 1.12 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.11 2006-09-18 07:27:05 gerber * *** empty log message *** * * Revision 1.10 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.9 2005/06/15 15:03:54 gerber * Optional Anti Aliased canvas for viewer * * Revision 1.8 2005/06/15 09:40:40 gerber * debugged, optimized * * Revision 1.7 2005/01/19 15:53:41 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.6 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.5 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.4 2003/09/01 11:17:14 gerber * improved monitoring of interrogation process * * Revision 1.3 2003/07/04 10:47:01 gerber * cleaning up * * Revision 1.2 2003/06/27 13:47:26 gerber * display ruler, line/point evaluation * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #include "gpiv_gui.h" #include "utils.h" #include "display_interface.h" #include "display_menus.h" #include "display.h" #define EVENT_METHOD(i, x) GTK_WIDGET_GET_CLASS(i)->x Display * create_display (gchar *fname, GpivImage *image, guint display_id, GpivConsole *gpiv ) /*----------------------------------------------------------------------------- * * Layout: * * main_vbox * | * +-- menubar * | * +-- vbox * | * +-- table * | | * | +-- origin * | +-- hruler * | +-- vruler * | +-- canvas * | * +-- statusbar * * -----------------------------------------------------------------------------*/ { Display *disp = g_new0 (Display, 1); Image *img = g_new0 (Image, 1); Intreg *intreg = g_new0 (Intreg, 1); GpivPivPar *intreg_pivp = g_new0 (GpivPivPar, 1); PivData *pd = g_new0 (PivData, 1); GpivValidPar *pd_valp = g_new0 (GpivValidPar, 1); GpivPostPar *pd_postp = g_new0 (GpivPostPar, 1); static gint width = 0, height = 0; static gchar title[GPIV_MAX_CHARS]; static GdkPixbuf *icon = NULL; gint i = 0; static const gchar * zoom_label[8] = { "Zoom 0.25", "Zoom 0.5", "Zoom 0.83", "Zoom 1.0", "Zoom 1.3", "Zoom 1.6", "Zoom 2.0", "Zoom 4.0" }; static const gchar * vector_scale_label[9] = { "1", "2", "4", "8", "16", "32", "64", "128", "256" }; disp->zoom_group = NULL; disp->background_group = NULL; disp->scalar_group = NULL; disp->vector_scale_group = NULL; disp->vector_color_group = NULL; g_snprintf (title, GPIV_MAX_CHARS, "gpiv display #%d", display_id); g_snprintf (disp->msg_display_default, GPIV_MAX_CHARS, "%s", fname); disp->id = display_id; disp->zoom_index = gpiv_par->display__zoom_index; disp->zoom_factor = zfactor[disp->zoom_index]; disp->zoom_factor_old = zfactor[disp->zoom_index]; /* g_message ("CREATE_DISPLAY:: zoom_factor = %f zoom_factor_old = %f", */ /* disp->zoom_factor, disp->zoom_factor_old); */ disp->vector_scale = gpiv_par->display__vector_scale; disp->vector_color = gpiv_par->display__vector_color; disp->display_backgrnd = gpiv_par->display__backgrnd; /* disp->display_img1 = gpiv_par->display__img1; */ /* disp->display_img2 = gpiv_par->display__img2; */ disp->display_intregs = gpiv_par->display__intregs; disp->display_piv = gpiv_par->display__piv; disp->display_scalar = gpiv_par->display__scalar; /* disp->display_vor = gpiv_par->display__vor; */ /* disp->display_sstrain = gpiv_par->display__sstrain; */ /* disp->display_nstrain = gpiv_par->display__nstrain; */ disp->file_uri_name = g_strdup_printf ("%s" , fname); disp->img = img; disp->img->exist_img = FALSE; disp->img->saved_img = FALSE; disp->img->rgb_img_width = 0; disp->img->img_mean = 0.0; /* * PIV data and related do not exist, yet. 'Saved' is set TRUE to avoid * message of unsaved data while deleting display or console * Values of these boolean variables are updated in the 'exec_' functions. */ disp->pida = pd; disp->pida->exist_piv = FALSE; disp->pida->saved_piv = TRUE; disp->pida->scaled_piv = FALSE; disp->pida->exist_histo = FALSE; disp->pida->saved_histo = TRUE; disp->pida->exist_valid = FALSE; disp->pida->exist_vor = FALSE; disp->pida->exist_vor_scaled = FALSE; disp->pida->saved_vor = TRUE; disp->pida->exist_sstrain = FALSE; disp->pida->exist_sstrain_scaled = FALSE; disp->pida->saved_sstrain = TRUE; disp->pida->exist_nstrain = FALSE; disp->pida->exist_nstrain_scaled = FALSE; disp->pida->saved_nstrain = TRUE; /* * Initialising of parameter values for image, evaluation and interrogation regions */ disp->img->image = image; /* disp->img->image->header = gpiv_img_cp_parameters (gl_image_par); */ disp->pida->piv_par = gpiv_piv_cp_parameters (gl_piv_par); disp->pida->valid_par = pd_valp; disp->pida->post_par = pd_postp; if (disp->pida->piv_par->row_start > disp->img->image->header->nrows - disp->pida->piv_par->pre_shift_row - 1) { disp->pida->piv_par->row_start = 0; } disp->pida->piv_par->row_end = MIN (disp->img->image->header->nrows, gl_piv_par->row_end); if (disp->pida->piv_par->col_start > disp->img->image->header->ncolumns - disp->pida->piv_par->pre_shift_col - 1) { disp->pida->piv_par->col_start = 0; } disp->pida->piv_par->col_end = MIN (disp->img->image->header->ncolumns, gl_piv_par->col_end); /* * Copy _PART_ of piv_par to intreg for displaying Interrogation Area contours */ disp->intreg = intreg; disp->intreg->exist_int = FALSE; disp->intreg->row_start_old = 0; disp->intreg->col_start_old = 0; disp->intreg->par = intreg_pivp; disp->intreg->par->row_start = disp->pida->piv_par->row_start; disp->intreg->par->row_end = disp->pida->piv_par->row_end; disp->intreg->par->col_start = disp->pida->piv_par->col_start; disp->intreg->par->col_end = disp->pida->piv_par->col_end; disp->intreg->par->int_size_f = disp->pida->piv_par->int_size_f; disp->intreg->par->int_size_i = disp->pida->piv_par->int_size_i; disp->intreg->par->int_shift = disp->pida->piv_par->int_shift; disp->intreg->par->pre_shift_row = disp->pida->piv_par->pre_shift_row; disp->intreg->par->pre_shift_col = disp->pida->piv_par->pre_shift_col; disp->intreg->par->row_start__set = TRUE; disp->intreg->par->row_end__set = TRUE; disp->intreg->par->col_start__set = TRUE; disp->intreg->par->col_end__set = TRUE; disp->intreg->par->int_size_f__set = TRUE; disp->intreg->par->int_size_i__set = TRUE; disp->intreg->par->int_shift__set = TRUE; disp->intreg->par->pre_shift_row__set = TRUE; disp->intreg->par->pre_shift_col__set = TRUE; width = (gint) (disp->zoom_factor * disp->img->image->header->ncolumns + VIEW_HMARGE); height = (gint) (disp->zoom_factor * disp->img->image->header->nrows + VIEW_VMARGE); /* disp->mwin = g_object_new (GTK_TYPE_WINDOW, */ /* "default-height", height, */ /* "default-width", width, */ /* "title", title, */ /* NULL */ /* ); */ disp->mwin = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (disp->mwin), title); /* gtk_window_set_default_size (GTK_WINDOW (disp->mwin), width, height); */ gtk_window_set_default_size (GTK_WINDOW (disp->mwin), 20, 20); gtk_object_set_data (GTK_OBJECT (disp->mwin), "disp", disp); gtk_object_set_data (GTK_OBJECT (disp->mwin), "gpiv", gpiv); /* * DESTROING ITEM */ g_signal_connect (GTK_OBJECT (disp->mwin), "delete_event" , G_CALLBACK (delete_display), NULL); /* * focussing the actual display */ g_signal_connect (GTK_OBJECT (disp->mwin), "focus_in_event", G_CALLBACK (on_display_set_focus), NULL); gtk_window_set_resizable (GTK_WINDOW (disp->mwin), FALSE); /* * icon setting */ icon = gdk_pixbuf_new_from_file(PIXMAPSDIR "gpiv_logo.png", NULL); gtk_window_set_icon(GTK_WINDOW(disp->mwin), icon); disp->vbox = gtk_vbox_new ( FALSE /* TRUE */, 0); gtk_widget_show (disp->vbox); gtk_container_add (GTK_CONTAINER (disp->mwin), disp->vbox); /* * Menu bar */ disp->menubar = gtk_menu_bar_new (); gtk_box_pack_start (GTK_BOX (disp->vbox), disp->menubar, FALSE, FALSE, 0); if (gpiv_par->display__view_menubar) { gtk_widget_show (GTK_WIDGET (disp->menubar)); } else { gtk_widget_hide (GTK_WIDGET (disp->menubar)); } /* * View menu */ disp->menuitem_view = gtk_menu_item_new_with_mnemonic (_("_View")); gtk_widget_show (disp->menuitem_view); gtk_container_add (GTK_CONTAINER (disp->menubar), disp->menuitem_view); /* NEW */ /* gtk_object_set_data_full (GTK_OBJECT (disp->mwin), */ /* "menuitem_view", */ /* disp->menuitem_view, */ /* (GtkDestroyNotify) gtk_widget_unref); */ disp->menuitem_view_menu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (disp->menuitem_view), disp->menuitem_view_menu); disp->view_menubar = gtk_check_menu_item_new_with_mnemonic (_("View menu bar")); gtk_widget_show (disp->view_menubar); gtk_container_add (GTK_CONTAINER (disp->menuitem_view_menu), disp->view_menubar); g_signal_connect ((gpointer) disp->view_menubar, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VIEW_MENUBAR); disp->view_rulers = gtk_check_menu_item_new_with_mnemonic (_("View rulers")); gtk_widget_show (disp->view_rulers); gtk_container_add (GTK_CONTAINER (disp->menuitem_view_menu), disp->view_rulers); g_signal_connect ((gpointer) disp->view_rulers, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VIEW_RULERS); /* * Menu for automatic stretching the window when zooming in */ disp->stretch_auto = gtk_check_menu_item_new_with_mnemonic (_("Stretch auto")); gtk_widget_show (disp->stretch_auto); gtk_container_add (GTK_CONTAINER (disp->menuitem_view_menu), disp->stretch_auto); g_signal_connect ((gpointer) disp->stretch_auto, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) STRETCH_AUTO); /* * Menu for stretching the window */ disp->stretch = gtk_menu_item_new_with_label (_("Stretch display")); gtk_widget_show (disp->stretch); gtk_container_add (GTK_CONTAINER (disp->menuitem_view_menu), disp->stretch); gtk_tooltips_set_tip (gpiv->tooltips, disp->stretch, _("Stretch or fit display window to the image area"), NULL); g_signal_connect ((gpointer) disp->stretch, "activate", G_CALLBACK (on_stretch_activate), NULL); /* * Separator */ disp->separator_zoom = gtk_separator_menu_item_new (); gtk_widget_show (disp->separator_zoom); gtk_container_add (GTK_CONTAINER (disp->menuitem_view_menu), disp->separator_zoom); /* * Zoom menus */ for (i = 0; i < 8; i++) { /* gchar *zoom_index = g_strdup_printf ("zoom_%d", i) */ disp->zoom_key[i] = g_strdup_printf ("zoom_menu_%d", i); disp->zoom_menu[i] = gtk_radio_menu_item_new_with_label (disp->zoom_group, zoom_label[i]); disp->zoom_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (disp->zoom_menu[i])); gtk_widget_show (disp->zoom_menu[i]); gtk_container_add (GTK_CONTAINER (disp->menuitem_view_menu), disp->zoom_menu[i]); gtk_tooltips_set_tip (gpiv->tooltips, disp->zoom_menu[i], _("set zoom factor"), NULL); gtk_object_set_data (GTK_OBJECT (disp->mwin), disp->zoom_key[i], disp->zoom_menu[i]); g_signal_connect ((gpointer) disp->zoom_menu[i], "activate", G_CALLBACK (on_zoom_activate), (int *) i); /* if (disp->zoom_index == i) { */ /* gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM */ /* (disp->zoom_menu[i]), */ /* TRUE); */ /* } */ } /* * Background (image) menu */ disp->menuitem_background = gtk_menu_item_new_with_mnemonic (_("_Background")); gtk_widget_show (disp->menuitem_background); gtk_container_add (GTK_CONTAINER (disp->menubar), disp->menuitem_background); disp->menuitem_background_menu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (disp->menuitem_background), disp->menuitem_background_menu); disp->view_blue = gtk_radio_menu_item_new_with_mnemonic (disp->background_group, _("Blue")); disp->background_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (disp->view_blue)); gtk_widget_show (disp->view_blue); gtk_container_add (GTK_CONTAINER (disp->menuitem_background_menu), disp->view_blue); gtk_tooltips_set_tip (gpiv->tooltips, disp->view_blue, _("set blue background"), NULL); gtk_object_set_data (GTK_OBJECT (disp->mwin), "blue_background_menu", disp->view_blue); g_signal_connect ((gpointer) disp->view_blue, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VIEW_BLUE); disp->view_black = gtk_radio_menu_item_new_with_mnemonic (disp->background_group, _("Black")); disp->background_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (disp->view_black)); gtk_widget_show (disp->view_black); gtk_container_add (GTK_CONTAINER (disp->menuitem_background_menu), disp->view_black); gtk_tooltips_set_tip (gpiv->tooltips, disp->view_black, _("set black background"), NULL); gtk_object_set_data (GTK_OBJECT (disp->mwin), "black_background_menu", disp->view_black); g_signal_connect ((gpointer) disp->view_black, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VIEW_BLACK); disp->view_image_a = gtk_radio_menu_item_new_with_mnemonic (disp->background_group, _("Image_A")); disp->background_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (disp->view_image_a)); gtk_widget_show (disp->view_image_a); gtk_container_add (GTK_CONTAINER (disp->menuitem_background_menu), disp->view_image_a); gtk_tooltips_set_tip (gpiv->tooltips, disp->view_image_a, _("set first image as background"), NULL); gtk_object_set_data (GTK_OBJECT (disp->mwin), "image_a_background_menu", disp->view_image_a); g_signal_connect ((gpointer) disp->view_image_a, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VIEW_IMAGE_A); disp->view_image_b = gtk_radio_menu_item_new_with_mnemonic (disp->background_group, ("Image_B")); disp->background_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (disp->view_image_b)); gtk_widget_show (disp->view_image_b); gtk_container_add (GTK_CONTAINER (disp->menuitem_background_menu), disp->view_image_b); gtk_tooltips_set_tip (gpiv->tooltips, disp->view_image_b, _("set second image as background"), NULL); gtk_object_set_data (GTK_OBJECT (disp->mwin), "image_b_background_menu", disp->view_image_b); g_signal_connect ((gpointer) disp->view_image_b, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VIEW_IMAGE_B); /* * Piv display menu */ disp->menuitem_view_piv_data = gtk_menu_item_new_with_mnemonic (_("_Piv")); gtk_widget_show (disp->menuitem_view_piv_data); gtk_container_add (GTK_CONTAINER (disp->menubar), disp->menuitem_view_piv_data); disp->menuitem_view_piv_data_menu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (disp->menuitem_view_piv_data), disp->menuitem_view_piv_data_menu); disp->view_interrogation_areas = gtk_check_menu_item_new_with_mnemonic (_("Interrogation area's")); gtk_widget_show (disp->view_interrogation_areas); gtk_container_add (GTK_CONTAINER (disp->menuitem_view_piv_data_menu), disp->view_interrogation_areas); g_signal_connect ((gpointer) disp->view_interrogation_areas, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VIEW_INTERROGATION_AREAS); disp->view_velocity_vectors = gtk_check_menu_item_new_with_mnemonic (_("Velocity vectors")); gtk_widget_show (disp->view_velocity_vectors); gtk_container_add (GTK_CONTAINER (disp->menuitem_view_piv_data_menu), disp->view_velocity_vectors); g_signal_connect ((gpointer) disp->view_velocity_vectors, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VIEW_VELOCITY_VECTORS); /* * Scalar data display menu */ disp->menuitem_view_scalar_data = gtk_menu_item_new_with_mnemonic (_("_Scalar")); gtk_widget_show (disp->menuitem_view_scalar_data); gtk_container_add (GTK_CONTAINER (disp->menubar), disp->menuitem_view_scalar_data); disp->menuitem_view_scalar_data_menu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (disp->menuitem_view_scalar_data), disp->menuitem_view_scalar_data_menu); disp->view_none = gtk_radio_menu_item_new_with_mnemonic (disp->scalar_group, _("None")); disp->scalar_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (disp->view_none)); gtk_widget_show (disp->view_none); gtk_container_add (GTK_CONTAINER (disp->menuitem_view_scalar_data_menu), disp->view_none); gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_none_scalars", disp->view_none); g_signal_connect ((gpointer) disp->view_none, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VIEW_NONE_SCALARS); disp->view_vorticity = gtk_radio_menu_item_new_with_mnemonic (disp->scalar_group, _("Vorticity")); disp->scalar_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (disp->view_vorticity)); gtk_widget_show (disp->view_vorticity); gtk_container_add (GTK_CONTAINER (disp->menuitem_view_scalar_data_menu), disp->view_vorticity); gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_vorticity", disp->view_vorticity); g_signal_connect ((gpointer) disp->view_vorticity, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VIEW_VORTICITY); disp->view_shear_strain = gtk_radio_menu_item_new_with_mnemonic (disp->scalar_group, _("Shear strain")); disp->scalar_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (disp->view_shear_strain)); gtk_widget_show (disp->view_shear_strain); gtk_container_add (GTK_CONTAINER (disp->menuitem_view_scalar_data_menu), disp->view_shear_strain); gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_shear_strain", disp->view_shear_strain); g_signal_connect ((gpointer) disp->view_shear_strain, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VIEW_SHEAR_STRAIN); disp->view_normal_strain = gtk_radio_menu_item_new_with_mnemonic (disp->scalar_group, _("Normal strain")); disp->scalar_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (disp->view_normal_strain)); gtk_widget_show (disp->view_normal_strain); gtk_container_add (GTK_CONTAINER (disp->menuitem_view_scalar_data_menu), disp->view_normal_strain); gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_normal_strain", disp->view_normal_strain); g_signal_connect ((gpointer) disp->view_normal_strain, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VIEW_NORMAL_STRAIN); /* * Vector scale menu */ disp->menuitem_vector_scale = gtk_menu_item_new_with_mnemonic (_("Scal_e")); gtk_widget_show (disp->menuitem_vector_scale); gtk_container_add (GTK_CONTAINER (disp->menubar), disp->menuitem_vector_scale); disp->menuitem_vector_scale_menu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (disp->menuitem_vector_scale), disp->menuitem_vector_scale_menu); for (i = 0; i < 9; i++) { disp->vector_scale_key[i] = g_strdup_printf ("vector_scale_menu_%d", i); disp->vector_scale_menu[i] = gtk_radio_menu_item_new_with_label (disp->vector_scale_group, vector_scale_label[i]); disp->vector_scale_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (disp->vector_scale_menu[i])); gtk_widget_show (disp->vector_scale_menu[i]); gtk_container_add (GTK_CONTAINER (disp->menuitem_vector_scale_menu), disp->vector_scale_menu[i]); gtk_tooltips_set_tip (gpiv->tooltips, disp->vector_scale_menu[i], _("set vector_scale"), NULL); gtk_object_set_data (GTK_OBJECT (disp->mwin), disp->vector_scale_key[i], disp->vector_scale_menu[i]); g_signal_connect ((gpointer) disp->vector_scale_menu[i], "activate", G_CALLBACK (on_vector_scale_activate), (int *) i); } /* * Vector color menu */ disp->menuitem_vector_color = gtk_menu_item_new_with_mnemonic (_("C_olor")); gtk_widget_show (disp->menuitem_vector_color); gtk_container_add (GTK_CONTAINER (disp->menubar), disp->menuitem_vector_color); disp->menuitem_vector_color_menu = gtk_menu_new (); gtk_menu_item_set_submenu (GTK_MENU_ITEM (disp->menuitem_vector_color), disp->menuitem_vector_color_menu); disp->vector_color_peak_nr = gtk_radio_menu_item_new_with_mnemonic (disp->vector_color_group, ("Peak nr")); disp->vector_color_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (disp->vector_color_peak_nr)); gtk_widget_show (disp->vector_color_peak_nr); gtk_container_add (GTK_CONTAINER (disp->menuitem_vector_color_menu), disp->vector_color_peak_nr); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vector_color_peak_nr", disp->vector_color_peak_nr); g_signal_connect ((gpointer) disp->vector_color_peak_nr, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VECTOR_COLOR_PEAK); disp->vector_color_snr = gtk_radio_menu_item_new_with_mnemonic (disp->vector_color_group, ("Snr")); /* disp->vector_color_snr = */ /* gtk_radio_menu_item_new_with_mnemonic (disp->vector_color_group, */ /* ("SNR")); */ disp->vector_color_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (disp->vector_color_snr)); gtk_widget_show (disp->vector_color_snr); gtk_container_add (GTK_CONTAINER (disp->menuitem_vector_color_menu), disp->vector_color_snr); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vector_color_snr", disp->vector_color_snr); g_signal_connect ((gpointer) disp->vector_color_snr, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VECTOR_COLOR_SNR); disp->vector_color_magngray = gtk_radio_menu_item_new_with_mnemonic (disp->vector_color_group, ("Magnitude gray")); disp->vector_color_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (disp->vector_color_magngray)); gtk_widget_show (disp->vector_color_magngray); gtk_container_add (GTK_CONTAINER (disp->menuitem_vector_color_menu), disp->vector_color_magngray); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vector_color_magngray", disp->vector_color_magngray); g_signal_connect ((gpointer) disp->vector_color_magngray, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VECTOR_COLOR_MAGNGRAY); disp->vector_color_magncolor = gtk_radio_menu_item_new_with_mnemonic (disp->vector_color_group, ("Magnitude color")); disp->vector_color_group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (disp->vector_color_magncolor)); gtk_widget_show (disp->vector_color_magncolor); gtk_container_add (GTK_CONTAINER (disp->menuitem_vector_color_menu), disp->vector_color_magncolor); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vector_color_magncolor", disp->vector_color_magncolor); g_signal_connect ((gpointer) disp->vector_color_magncolor, "activate", G_CALLBACK (on_menu_synchronize_popup), (int *) VECTOR_COLOR_MAGNCOLOR); /* * table */ disp->table = gtk_table_new (4, 3, FALSE); gtk_widget_ref (disp->table); gtk_object_set_data_full (GTK_OBJECT (disp->mwin), "table", disp->table, (GtkDestroyNotify) gtk_widget_unref); gtk_box_pack_start (GTK_BOX (disp->vbox), disp->table, TRUE, TRUE, 0); gtk_widget_show (disp->table); /* * Adjustments for scrollbars or scrolled window */ disp->hadj = gtk_adjustment_new (0.0, 0.0, (gdouble) disp->img->image->header->ncolumns - 1.0, 1.0, 1.0, (gdouble) disp->img->image->header->ncolumns - 1.0 /* * disp->zoom_factor */ ); gtk_object_set_data (GTK_OBJECT (disp->hadj), "var_type", "0"); gtk_object_set_data (GTK_OBJECT (disp->hadj), "disp", disp); g_signal_connect (GTK_OBJECT (disp->hadj), "value_changed", G_CALLBACK (on_adj_changed), NULL); disp->vadj = gtk_adjustment_new (0.0, 0.0, (gdouble) disp->img->image->header->nrows - 1.0, 1.0, 1.0, (gfloat) disp->img->image->header->nrows - 1.0 /* * disp->zoom_factor */ ); gtk_object_set_data (GTK_OBJECT (disp->vadj), "var_type", "1"); gtk_object_set_data (GTK_OBJECT (disp->vadj), "disp", disp); g_signal_connect (GTK_OBJECT (disp->vadj), "value_changed", G_CALLBACK (on_adj_changed), NULL); /* * horizontal ruler */ disp->hruler = gtk_hruler_new(); gtk_widget_ref(disp->hruler); gtk_object_set_data_full(GTK_OBJECT(disp->mwin), "hruler", disp->hruler, (GtkDestroyNotify) gtk_widget_unref); gtk_table_attach (GTK_TABLE (disp->table), disp->hruler, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); if (gpiv_par->display__view_rulers) { gtk_widget_show (GTK_WIDGET (disp->hruler)); } else { gtk_widget_hide (GTK_WIDGET (disp->hruler)); } gtk_ruler_set_range (GTK_RULER (disp->hruler), 0.0, (gfloat) (disp->img->image->header->ncolumns - 1), 0.0, (gfloat) (disp->img->image->header->ncolumns - 1)); /* gtk_widget_set_size_request (disp->hruler, */ /* (gint) (disp->zoom_factor * */ /* disp->img.image_par->ncolumns), */ /* RULER_WIDTH); */ /* * vertical ruler */ disp->vruler = gtk_vruler_new (); gtk_widget_ref (disp->vruler); gtk_object_set_data_full (GTK_OBJECT (disp->mwin), "vruler", disp->vruler, (GtkDestroyNotify) gtk_widget_unref); if (gpiv_par->display__view_rulers) { gtk_widget_show (GTK_WIDGET (disp->vruler)); } else { gtk_widget_hide (GTK_WIDGET (disp->vruler)); } gtk_table_attach (GTK_TABLE (disp->table), disp->vruler, 0, 1, 1, 2, (GtkAttachOptions) (GTK_EXPAND ), (GtkAttachOptions) (GTK_EXPAND | GTK_SHRINK | GTK_FILL), 0, 0); gtk_ruler_set_range (GTK_RULER (disp->vruler), 0.0, (gfloat) (disp->img->image->header->nrows - 1), 0.0, (gfloat) (disp->img->image->header->nrows - 1)); /* gtk_widget_set_size_request (disp->vruler, */ /* RULER_WIDTH, */ /* (gint) (disp->zoom_factor * */ /* disp->img.image_par->nrows)); */ /* * Scrollbars */ disp->vscrollbar = gtk_vscrollbar_new( GTK_ADJUSTMENT (disp->vadj)); gtk_widget_ref (disp->vscrollbar); gtk_object_set_data_full (GTK_OBJECT (disp->mwin), "vscrollbar", disp->vscrollbar, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (disp->vscrollbar); gtk_table_attach (GTK_TABLE (disp->table), disp->vscrollbar, 2 /* 1 */, 3, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); /* gtk_viewport_get_vadjustment (viewport) */ disp->hscrollbar = gtk_hscrollbar_new (GTK_ADJUSTMENT (disp->hadj)); gtk_widget_ref (disp->hscrollbar); gtk_object_set_data_full (GTK_OBJECT (disp->mwin), "hscrollbar", disp->hscrollbar, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (disp->hscrollbar); gtk_table_attach (GTK_TABLE (disp->table), disp->hscrollbar, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); /* * gnome canvas */ #ifdef CANVAS_AA gtk_widget_push_visual (gdk_rgb_get_visual ()); gtk_widget_push_colormap (gdk_rgb_get_cmap ()); disp->canvas = gnome_canvas_new_aa (); #else gtk_widget_push_visual (gdk_imlib_get_visual ()); gtk_widget_push_colormap (NULL); disp->canvas = gnome_canvas_new (); #endif gtk_widget_pop_colormap (); gtk_widget_pop_visual (); gtk_widget_ref (disp->canvas); gtk_object_set_data_full (GTK_OBJECT (disp->mwin), "canvas", disp->canvas, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (disp->canvas); gnome_canvas_set_scroll_region (GNOME_CANVAS (disp->canvas), 0, 0, disp->img->image->header->ncolumns - 1, disp->img->image->header->nrows - 1); gtk_table_attach (GTK_TABLE (disp->table), disp->canvas, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), 0, 0); gtk_widget_set_events (GTK_WIDGET (disp->canvas), GDK_LEAVE_NOTIFY_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_SHIFT_MASK | GDK_SCROLL_MASK ); gtk_object_set_data (GTK_OBJECT (disp->canvas), "disp", disp); gtk_object_set_data (GTK_OBJECT (disp->canvas), "gpiv", gpiv); /* * connect rulers to gnome_canvas drawing area */ g_signal_connect_swapped (G_OBJECT (disp->canvas), "motion_notify_event", G_CALLBACK (EVENT_METHOD (disp->hruler, motion_notify_event)), G_OBJECT (disp->hruler)); g_signal_connect_swapped (G_OBJECT (disp->canvas), "motion_notify_event", G_CALLBACK (GTK_WIDGET_GET_CLASS (disp->vruler)->motion_notify_event), G_OBJECT (disp->vruler)); g_signal_connect (G_OBJECT (disp->canvas), "enter_notify_event", G_CALLBACK (canvas_display_enter_notify), NULL); g_signal_connect (G_OBJECT (disp->canvas), "motion_notify_event", G_CALLBACK (canvas_display_motion_notify), NULL); g_signal_connect (G_OBJECT (disp->canvas), "button_press_event", G_CALLBACK (canvas_display_button_press), NULL); g_signal_connect (G_OBJECT (disp->canvas), "button_release_event", G_CALLBACK (canvas_display_button_release), NULL); g_signal_connect (G_OBJECT (disp->canvas), "leave_notify_event", G_CALLBACK (canvas_display_leave_notify), NULL); g_signal_connect (G_OBJECT (disp->canvas), "scroll_event", G_CALLBACK (canvas_display_button_scroll), NULL); /* * application/status bar */ disp->appbar = gnome_appbar_new (FALSE, TRUE, GNOME_PREFERENCES_NEVER); gtk_widget_ref (disp->appbar); gtk_object_set_data_full (GTK_OBJECT (disp->mwin), "appbar", disp->appbar, (GtkDestroyNotify) gtk_widget_unref); gtk_table_attach (GTK_TABLE (disp->table), disp->appbar, 0, 3, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_widget_show (disp->appbar); gnome_appbar_set_default (GNOME_APPBAR (disp->appbar), disp->msg_display_default); gtk_widget_show (disp->mwin); return disp; } GtkWidget * create_display_popupmenu (Display *disp ) /*----------------------------------------------------------------------------- */ { GtkWidget *display_menu = NULL; display_menu = gtk_menu_new (); gtk_object_set_data (GTK_OBJECT (disp->mwin), "display_menu", display_menu); gnome_app_fill_menu (GTK_MENU_SHELL (display_menu), display_menu_uiinfo, NULL, FALSE, 0); /* * view menubar widget */ gtk_widget_ref (display_menu_uiinfo[0].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "view_menubar_popup_menu", display_menu_uiinfo[0].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_menubar_popup_menu", display_menu_uiinfo[0].widget); if (gpiv_par->display__view_menubar) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (display_menu_uiinfo[0].widget), TRUE); } else { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (display_menu_uiinfo[0].widget), FALSE); } gtk_object_set_data (GTK_OBJECT (display_menu_uiinfo[0].widget), "disp", disp); /* * view rulers widget */ gtk_widget_ref (display_menu_uiinfo[1].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "view_rulers_popup_menu", display_menu_uiinfo[1].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_rulers_popup_menu", display_menu_uiinfo[1].widget); if (gpiv_par->display__view_rulers) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (display_menu_uiinfo[1].widget), TRUE); } else { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (display_menu_uiinfo[1].widget), FALSE); } gtk_object_set_data (GTK_OBJECT (display_menu_uiinfo[1].widget), "disp", disp); /* * stretch when zoom automatic */ gtk_widget_ref (display_menu_uiinfo[2].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "stretch_auto_popup_menu", display_menu_uiinfo[2].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "stretch_auto_popup_menu", display_menu_uiinfo[2].widget); if (gpiv_par->display__stretch_auto) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (display_menu_uiinfo[2].widget), TRUE); } else { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (display_menu_uiinfo[2].widget), FALSE); } gtk_object_set_data (GTK_OBJECT (display_menu_uiinfo[2].widget), "disp", disp); /* * zoom menu widgets */ gtk_widget_ref (zoomscale_menu_display[0].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "zmv_0", zoomscale_menu_display[0].widget, (GtkDestroyNotify) gtk_widget_unref); if (disp->zoom_index == ZOOM_0) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (zoomscale_menu_display[0].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (disp->mwin), "zmv_0", zoomscale_menu_display[0].widget); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[0].widget), "disp", disp); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[0].widget), "zoom_index", (int *) ZOOM_0); gtk_widget_ref (zoomscale_menu_display[1].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "zmv_1", zoomscale_menu_display[1].widget, (GtkDestroyNotify) gtk_widget_unref); if (disp->zoom_index == ZOOM_1) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (zoomscale_menu_display[1].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (disp->mwin), "zmv_1", zoomscale_menu_display[1].widget); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[1].widget), "disp", disp); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[1].widget), "zoom_index", (int *) ZOOM_1); gtk_widget_ref (zoomscale_menu_display[2].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "zmv_2", zoomscale_menu_display[2].widget, (GtkDestroyNotify) gtk_widget_unref); if (disp->zoom_index == ZOOM_2) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (zoomscale_menu_display[2].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (disp->mwin), "zmv_2", zoomscale_menu_display[2].widget); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[2].widget), "disp", disp); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[2].widget), "zoom_index", (int *) ZOOM_2); gtk_widget_ref (zoomscale_menu_display[3].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "zmv_3", zoomscale_menu_display[3].widget, (GtkDestroyNotify) gtk_widget_unref); if (disp->zoom_index == ZOOM_3) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (zoomscale_menu_display[3].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (disp->mwin), "zmv_3", zoomscale_menu_display[3].widget); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[3].widget), "disp", disp); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[3].widget), "zoom_index", (int *) ZOOM_3 ); gtk_widget_ref (zoomscale_menu_display[4].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "zmv_4", zoomscale_menu_display[4].widget, (GtkDestroyNotify) gtk_widget_unref); if (disp->zoom_index == ZOOM_4) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (zoomscale_menu_display[4].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (disp->mwin), "zmv_4", zoomscale_menu_display[4].widget); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[4].widget), "disp", disp); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[4].widget), "zoom_index", (int *) ZOOM_4); gtk_widget_ref (zoomscale_menu_display[5].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "zmv_5", zoomscale_menu_display[5].widget, (GtkDestroyNotify) gtk_widget_unref); if (disp->zoom_index == ZOOM_5) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (zoomscale_menu_display[5].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (disp->mwin), "zmv_5", zoomscale_menu_display[5].widget); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[5].widget), "disp", disp); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[5].widget), "zoom_index", (int *) ZOOM_5); gtk_widget_ref (zoomscale_menu_display[6].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "zmv_6", zoomscale_menu_display[6].widget, (GtkDestroyNotify) gtk_widget_unref); if (disp->zoom_index == ZOOM_6) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (zoomscale_menu_display[6].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (disp->mwin), "zmv_6", zoomscale_menu_display[6].widget); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[6].widget), "disp", disp); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[6].widget), "zoom_index", (int *) ZOOM_6); gtk_widget_ref (zoomscale_menu_display[7].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "zmv_7", zoomscale_menu_display[7].widget, (GtkDestroyNotify) gtk_widget_unref); if (disp->zoom_index == ZOOM_7) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (zoomscale_menu_display[7].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (disp->mwin), "zmv_7", zoomscale_menu_display[7].widget); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[7].widget), "disp", disp); gtk_object_set_data (GTK_OBJECT (zoomscale_menu_display[7].widget), "zoom_index", (int *) ZOOM_7); /* * background menu widgets */ gtk_widget_ref (view_background_display[0].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "view_blue", view_background_display[0].widget, (GtkDestroyNotify) gtk_widget_unref); if (gpiv_par->display__backgrnd == SHOW_BG_DARKBLUE) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_background_display[0].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_background_display0", view_background_display[0].widget); gtk_object_set_data (GTK_OBJECT (view_background_display[0].widget), "disp", disp); gtk_widget_ref (view_background_display[1].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "view_black", view_background_display[1].widget, (GtkDestroyNotify) gtk_widget_unref); if (gpiv_par->display__backgrnd == SHOW_BG_BLACK) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_background_display[1].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_background_display1", view_background_display[1].widget); gtk_object_set_data (GTK_OBJECT (view_background_display[1].widget), "disp", disp); gtk_widget_ref (view_background_display[2].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "view_img1", view_background_display[2].widget, (GtkDestroyNotify) gtk_widget_unref); if (gpiv_par->display__backgrnd == SHOW_BG_IMG1) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_background_display[2].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_background_display2", view_background_display[2].widget); gtk_object_set_data (GTK_OBJECT (view_background_display[2].widget), "disp", disp); gtk_widget_ref (view_background_display[3].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "view_img2", view_background_display[3].widget, (GtkDestroyNotify) gtk_widget_unref); if (gpiv_par->display__backgrnd == SHOW_BG_IMG2) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_background_display[3].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_background_display3", view_background_display[3].widget); gtk_object_set_data (GTK_OBJECT (view_background_display[3].widget), "disp", disp); /* * view menu widgets to display PIV data and interrrogation area's */ gtk_widget_ref (view_piv_display[0].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "view_intreg", view_piv_display[0].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_piv_display0", view_piv_display[0].widget); if (disp->display_intregs) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_piv_display[0].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (view_piv_display[0].widget), "disp", disp); gtk_widget_ref (view_piv_display[1].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "view_piv", view_piv_display[1].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_piv_display1", view_piv_display[1].widget); if (disp->display_piv) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_piv_display[1].widget), TRUE); } else { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_piv_display[1].widget), FALSE); } gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_piv_display1", view_piv_display[1].widget); /* * Display scalar data */ gtk_widget_ref (view_scalardata_display[0].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "view_none", view_scalardata_display[0].widget, (GtkDestroyNotify) gtk_widget_unref); if (gpiv_par->display__scalar == SHOW_SC_NONE) { if (gpiv_par->verbose) g_message ("create_display_popupmenu:: display__scalar == SHOW_SC_NONE"); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_scalardata_display[0].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (view_scalardata_display[0].widget), "disp", disp); gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_scalardata_display0", view_scalardata_display[0].widget); gtk_widget_ref (view_scalardata_display[1].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "view_vor", view_scalardata_display[1].widget, (GtkDestroyNotify) gtk_widget_unref); if (gpiv_par->display__scalar == SHOW_SC_VORTICITY) { if (gpiv_par->verbose) g_message ("create_display_popupmenu:: display__scalar == SHOW_SC_VORTICITY"); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_scalardata_display[1].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (view_scalardata_display[1].widget), "disp", disp); gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_scalardata_display1", view_scalardata_display[1].widget); gtk_widget_ref (view_scalardata_display[2].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "view_sstrain", view_scalardata_display[2].widget, (GtkDestroyNotify) gtk_widget_unref); if (gpiv_par->display__scalar == SHOW_SC_SSTRAIN) { if (gpiv_par->verbose) g_message ("create_display_popupmenu:: display__scalar == SHOW_SC_SSTRAIN"); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_scalardata_display[2].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (view_scalardata_display[2].widget), "disp", disp); gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_scalardata_display2", view_scalardata_display[2].widget); gtk_widget_ref (view_scalardata_display[3].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "view_nstrain", view_scalardata_display[3].widget, (GtkDestroyNotify) gtk_widget_unref); if (gpiv_par->display__scalar == SHOW_SC_NSTRAIN) { if (gpiv_par->verbose) g_message ("create_display_popupmenu:: display__scalar == SHOW_SC_NSTRAIN"); gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_scalardata_display[3].widget), TRUE); } gtk_object_set_data (GTK_OBJECT (view_scalardata_display[3].widget), "disp", disp); gtk_object_set_data (GTK_OBJECT (disp->mwin), "view_scalardata_display3", view_scalardata_display[3].widget); /* * vectorscale menu widgets */ gtk_widget_ref (vectorscale_menu_display[0].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "vs_mv_0", vectorscale_menu_display[0].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vs_mv_0", vectorscale_menu_display[0].widget); if (gpiv_par->display__vector_scale == 1) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vectorscale_menu_display[0].widget), TRUE); } gtk_widget_ref (vectorscale_menu_display[1].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "vs_mv_1", vectorscale_menu_display[1].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vs_mv_1", vectorscale_menu_display[1].widget); if (gpiv_par->display__vector_scale == 2) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vectorscale_menu_display[1].widget), TRUE); } gtk_widget_ref (vectorscale_menu_display[2].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "vs_mv_2", vectorscale_menu_display[2].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vs_mv_2", vectorscale_menu_display[2].widget); if (gpiv_par->display__vector_scale == 4) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vectorscale_menu_display[2].widget), TRUE); } gtk_widget_ref (vectorscale_menu_display[3].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "vs_mv_3", vectorscale_menu_display[3].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vs_mv_3", vectorscale_menu_display[3].widget); if (gpiv_par->display__vector_scale == 8) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vectorscale_menu_display[3].widget), TRUE); } gtk_widget_ref (vectorscale_menu_display[4].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "vs_mv_4", vectorscale_menu_display[0].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vs_mv_4", vectorscale_menu_display[4].widget); if (gpiv_par->display__vector_scale == 16) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vectorscale_menu_display[4].widget), TRUE); } gtk_widget_ref (vectorscale_menu_display[5].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "vs_mv_5", vectorscale_menu_display[5].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vs_mv_5", vectorscale_menu_display[5].widget); if (gpiv_par->display__vector_scale == 32) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vectorscale_menu_display[5].widget), TRUE); } gtk_widget_ref (vectorscale_menu_display[6].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "vs_mv_6", vectorscale_menu_display[6].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vs_mv_6", vectorscale_menu_display[6].widget); if (gpiv_par->display__vector_scale == 64) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vectorscale_menu_display[6].widget), TRUE); } gtk_widget_ref (vectorscale_menu_display[7].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "vs_mv_7", vectorscale_menu_display[7].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vs_mv_7", vectorscale_menu_display[7].widget); if (gpiv_par->display__vector_scale == 128) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vectorscale_menu_display[7].widget), TRUE); } gtk_widget_ref (vectorscale_menu_display[8].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "vs_mv_8", vectorscale_menu_display[8].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vs_mv_8", vectorscale_menu_display[8].widget); if (gpiv_par->display__vector_scale == 256) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vectorscale_menu_display[8].widget), TRUE); } /* * vectorcolor menu widgets */ gtk_widget_ref (vectorcolor_menu_display[0].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "vc_mv_0", vectorcolor_menu_display[0].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vectorcolor_menu_display0", vectorcolor_menu_display[0].widget); if (gpiv_par->display__vector_color == SHOW_PEAKNR) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vectorcolor_menu_display[0].widget), TRUE); } gtk_widget_ref (vectorcolor_menu_display[1].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "vc_mv_1", vectorcolor_menu_display[1].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vectorcolor_menu_display1", vectorcolor_menu_display[1].widget); if (gpiv_par->display__vector_color == SHOW_SNR) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vectorcolor_menu_display[1].widget), TRUE); } gtk_widget_ref (vectorcolor_menu_display[2].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "vc_mv_2", vectorcolor_menu_display[2].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vectorcolor_menu_display2", vectorcolor_menu_display[2].widget); if (gpiv_par->display__vector_color == SHOW_MAGNITUDE_GRAY) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vectorcolor_menu_display[2].widget), TRUE); } gtk_widget_ref (vectorcolor_menu_display[3].widget); gtk_object_set_data_full (GTK_OBJECT (display_menu), "vc_mv_3", vectorcolor_menu_display[3].widget, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (disp->mwin), "vectorcolor_menu_display3", vectorcolor_menu_display[3].widget); if (gpiv_par->display__vector_color == SHOW_MAGNITUDE) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (vectorcolor_menu_display[3].widget), TRUE); } return display_menu; } gpiv-0.6.1/src/display_interface.h0000644000175000017500000002223611110307115014024 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * widgets prototypes of display * $Log: display_interface.h,v $ * Revision 1.13 2007-12-19 08:42:35 gerber * debugged * * Revision 1.12 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.11 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.10 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.9 2007/02/05 15:17:09 gerber * auto stretching, broadcast display settings to buffers from preferences * * Revision 1.8 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.7 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.5 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.4 2003/09/01 11:17:14 gerber * improved monitoring of interrogation process * * Revision 1.3 2003/07/31 11:43:26 gerber * display images in gnome canvas (HOERAreset) * * Revision 1.2 2003/06/27 13:47:26 gerber * display ruler, line/point evaluation * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef DISPLAY_INTERFACE_H #define DISPLAY_INTERFACE_H #include "console_interface.h" /* #include "gpiv_gui.h" */ typedef struct _Image Image; struct _Image { GpivImage *image; /* image structure */ /* * Image is displayed at gnome canvas */ GdkPixbuf *pixbuf1; /* pixpbuf of first image frame */ GdkPixbuf *pixbuf2; /* pixbuf of first image frame */ guchar *rgbbuf_img1; /* graphical representation of first image frame */ guchar *rgbbuf_img2; /* graphical representation of first image frame */ guint rgb_img_width; /* straddled image width */ gfloat img_mean; /* average value of image intensity */ GnomeCanvasItem *gci_img1; GnomeCanvasItem *gci_img2; gboolean exist_img; /* flag if image exists */ gboolean saved_img; /* flag if image has been saved after modifying */ }; /* * Structure for displaying the Interrogation Region contours */ typedef struct _Intreg Intreg; struct _Intreg { guint row_start_old; /* Used to check if contours have to be updated */ guint col_start_old; /* Used to check if contours have to be updated */ GpivPivPar *par; GpivPivData *data; gboolean exist_int; GnomeCanvasItem *gci_intreg1[MAX_DATA][MAX_DATA]; GnomeCanvasItem *gci_intreg2[MAX_DATA][MAX_DATA]; }; /* * Contains all PIV data, derived data and parameters */ typedef struct _PivData PivData; struct _PivData { GpivPivPar *piv_par; GpivPivData *piv_data; GpivPivData *piv_data_scaled; gboolean exist_piv; gboolean saved_piv; gboolean scaled_piv; gboolean averaged_piv; GnomeCanvasItem *gci_vector[MAX_DATA][MAX_DATA]; gboolean exist_vec; GpivCov *cov; /* Used for displaying in Interrogation tab of console */ gboolean exist_cov; gfloat **intreg1; /* Used for displaying in Interrogation tab of console */ gfloat **intreg2; /* Used for displaying in Interrogation tab of console */ GpivValidPar *valid_par; gboolean exist_valid; GpivBinData *klass; gboolean exist_histo; gboolean saved_histo; GpivPostPar *post_par; /* Post processing parameters */ GpivScalarData *vor_data; /* Vorticity data, derived from PIV data */ GpivScalarData *vor_data_scaled; /* Time and spatial scaled vorticity data */ gboolean exist_vor; gboolean exist_vor_scaled; gboolean saved_vor; GnomeCanvasItem *gci_scalar_vor[MAX_DATA][MAX_DATA]; GpivScalarData *sstrain_data; /* Shear strain data, derived from PIV data */ GpivScalarData *sstrain_data_scaled; /* Time and spatial scaled shear strain data */ gboolean exist_sstrain; gboolean exist_sstrain_scaled; gboolean saved_sstrain; GnomeCanvasItem *gci_scalar_sstrain[MAX_DATA][MAX_DATA]; GpivScalarData *nstrain_data; /* Normal strain data, derived from PIV data */ GpivScalarData *nstrain_data_scaled; /* Time and spatial scaled normal strain data */ gboolean exist_nstrain; gboolean exist_nstrain_scaled; gboolean saved_nstrain; GnomeCanvasItem *gci_scalar_nstrain[MAX_DATA][MAX_DATA]; }; /* * The graphical interface of the display buffer */ typedef struct _Display Display; struct _Display { char *file_uri_name; guint id; /* array number and identity of display. When created set to row number in buffer clist, but may differ after deleting displays has taken place */ GtkWidget *mwin; /* main window for display */ GtkWidget *vbox; /* * Menu bar and menus */ GtkWidget *menubar; GtkWidget *menuitem_view; GtkWidget *menuitem_view_menu; GtkWidget *view_menubar; GtkWidget *view_rulers; GtkWidget *stretch_auto; GtkWidget *stretch; GtkWidget *separator_zoom; GSList *zoom_group; gchar *zoom_key[8]; GtkWidget *zoom_menu[8]; GtkWidget *menuitem_background; GtkWidget *menuitem_background_menu; GSList *background_group; GtkWidget *view_blue; GtkWidget *view_black; GtkWidget *view_image_a; GtkWidget *view_image_b; GtkWidget *menuitem_view_piv_data; GtkWidget *menuitem_view_piv_data_menu; GtkWidget *view_interrogation_areas; GtkWidget *view_velocity_vectors; GtkWidget *menuitem_view_scalar_data; GtkWidget *menuitem_view_scalar_data_menu; GSList *scalar_group; GtkWidget *view_none; GtkWidget *view_vorticity; GtkWidget *view_shear_strain; GtkWidget *view_normal_strain; GtkWidget *menuitem_vector_scale; GtkWidget *menuitem_vector_scale_menu; GSList *vector_scale_group; gchar *vector_scale_key[9]; GtkWidget *vector_scale_menu[9]; GtkWidget *menuitem_vector_color; GtkWidget *menuitem_vector_color_menu; GSList *vector_color_group; GtkWidget *vector_color_peak_nr; GtkWidget *vector_color_snr; GtkWidget *vector_color_magngray; GtkWidget *vector_color_magncolor; /* * Toolbar */ #ifdef DISPLAY_TOOLBAR GtkWidget *toolbar; GtkIconSize toolbar_icon_size; GtkWidget *toolitem_zoom_in; GtkWidget *button_zoom_in; GtkWidget *toolitem_zoom_out; GtkWidget *button_zoom_out; GtkWidget *toolitem_fit; GtkWidget *button_fit; #endif /* * Display area */ GtkWidget *table; /* GtkWidget *button_origin; */ /* GtkWidget *arrow_origin; */ GtkObject *hadj; GtkObject *vadj; GtkWidget *hruler; GtkWidget *vruler; GtkWidget *vscrollbar; GtkWidget *hscrollbar; GtkWidget *canvas; GtkWidget *view_options; GtkWidget *appbar; GtkWidget *nav_ebox; /* gboolean stretch_window_tmp; */ gint zoom_index; gfloat zoom_factor_old; gfloat zoom_factor; gint vector_scale; gint vector_color; gchar msg_display_default[GPIV_MAX_CHARS]; GtkWidget *display_popupmenu; GnomeCanvasItem *gci_bg; /* * Display data */ Image *img; Intreg *intreg; PivData *pida; /* enum ShowBackground */ guint display_backgrnd; /* gboolean display_img1; */ /* gboolean display_img2; */ gboolean display_intregs; gboolean display_piv; /* enum ShowScalar */ guint display_scalar; /* gboolean display_vor; */ /* gboolean display_sstrain; */ /* gboolean display_nstrain; */ gboolean index_old; gint index_x_old; gint index_y_old; gdouble xgrab_first; gdouble ygrab_first; gdouble x_adj_value; /* gdouble x_adj_value_init; */ gdouble x_adj_lower; gdouble x_adj_upper; gdouble x_page_size; gdouble y_adj_value; /* gdouble y_adj_value_init; */ gdouble y_adj_lower; gdouble y_adj_upper; gdouble y_page_size; }; /* * creates display window */ Display * create_display (gchar *fname, GpivImage *image, guint buf, GpivConsole *gpiv); /* * creates display popup menu */ GtkWidget * create_display_popupmenu (Display *disp); #endif /* DISPLAY_INTERFACE_H */ gpiv-0.6.1/src/imgproc_interface.c0000644000175000017500000003775411110305662014032 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * Image processing interface * $Log: imgproc_interface.c,v $ * Revision 1.1 2008-09-16 10:16:08 gerber * added imgproc routines * */ #ifdef HAVE_CONFIG_H # include #endif #include "gpiv_gui.h" #include "console.h" #include "imgproc_interface.h" #include "imgproc.h" #include "utils.h" #ifdef ENABLE_IMGPROC static ImgfilterVar * create_filter_var (gint filter_id, gchar *button_label, gchar *label_filtervar_label, gdouble value, gdouble upper, gchar *label_step_filter_label, gint step, gchar *appbar_msg ); static ImgfilterInterface * create_filter_interface (GnomeApp *main_window, ImgfilterVar *ivar ); Imgprocess * create_imgproc(GnomeApp *main_window, GtkWidget *container) /*----------------------------------------------------------------------------- * Image processing window */ { GpivConsole * gpiv = gtk_object_get_data (GTK_OBJECT (main_window), "gpiv"); Imgprocess * imgproc = g_new0 (Imgprocess, 1); gint i; gchar *bufno; gpiv_var->imgproc_count = 0; imgproc->vbox_label = gtk_vbox_new (FALSE, 0); gtk_widget_ref (imgproc->vbox_label); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgproc__vbox_label", imgproc->vbox_label, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgproc->vbox_label); gtk_container_add (GTK_CONTAINER (container), imgproc->vbox_label); imgproc->label_title = gtk_label_new(_("Image processing")); gtk_widget_ref(imgproc->label_title); gtk_object_set_data_full(GTK_OBJECT(main_window), "imgproc__label_title", imgproc->label_title, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgproc->label_title); gtk_box_pack_start (GTK_BOX (imgproc->vbox_label), imgproc->label_title, FALSE, FALSE, 0); /* * Scrolled window */ imgproc->vbox_scroll = gtk_vbox_new (FALSE, 0); gtk_widget_ref (imgproc->vbox_scroll); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgproc__vbox_scroll", imgproc->vbox_scroll, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgproc->vbox_scroll); gtk_box_pack_start (GTK_BOX (imgproc->vbox_label), imgproc->vbox_scroll, TRUE, TRUE, 0); imgproc->scrolledwindow = gtk_scrolled_window_new (NULL, NULL); gtk_widget_ref (imgproc->scrolledwindow); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgproc__scrolledwindow", imgproc->scrolledwindow, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgproc->scrolledwindow); gtk_box_pack_start (GTK_BOX (imgproc->vbox_scroll), imgproc->scrolledwindow, TRUE, TRUE, 0); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (imgproc->scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); imgproc->viewport = gtk_viewport_new (NULL, NULL); gtk_widget_ref (imgproc->viewport); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgproc__viewport", imgproc->viewport, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgproc->viewport); gtk_container_add (GTK_CONTAINER (imgproc->scrolledwindow), imgproc->viewport); /* * main vbox and table for image processing table/window */ imgproc->vbox = gtk_vbox_new (FALSE, 0); gtk_widget_ref (imgproc->vbox); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgproc__vbox", imgproc->vbox, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgproc->vbox); gtk_container_add (GTK_CONTAINER (imgproc->viewport), imgproc->vbox); imgproc->table = gtk_table_new (6, 6, FALSE); gtk_widget_ref (imgproc->table); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgproc__table", imgproc->table, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgproc->table); gtk_box_pack_start (GTK_BOX (imgproc->vbox), imgproc->table, TRUE, FALSE, 0); /* * Create filter buttons and attributes */ /* g_message ("create imgproc tab of zo:: window = %d threshold = %d", */ /* gl_imgproc_par->window, gl_imgproc_par->threshold); */ imgproc->ivar[0] = create_filter_var (GPIV_IMGFI_SUBACK, N_("Subtract background"), N_("Buffer #:"), -1, MAX_BUFS, _("Step #: 0"), 0, N_("Subtracts background from current image") ); imgproc->ivar[1] = create_filter_var (GPIV_IMGFI_HILO, N_("High/low filter"), N_("Window:"), gl_imgproc_par->window, GPIV_IMGPROCPAR_MAX__WINDOW, _("Step #: 0"), 0, N_("High/low filtering: expands local contrast") ); imgproc->ivar[2] = create_filter_var (GPIV_IMGFI_CLIP, N_("Clip"), N_("Threshold:"), gl_imgproc_par->threshold, GPIV_IMGPROCPAR_MAX__THRESHOLD, /* img_top = (img_top << gl_image_par->depth) - 1, */ _("Step #: 0"), 0, N_("Set image intensity below threshold to zero") ); /* g_message ("create_imgproc or so:: depth = %d top = %d", gl_image_par->depth, img_top); */ imgproc->ivar[3] = create_filter_var (GPIV_IMGFI_SMOOTH, N_("Smooth"), N_("Window:"), gl_imgproc_par->window, GPIV_IMGPROCPAR_MAX__WINDOW, _("Step #: 0"), 0, N_("Averages over window") ); imgproc->ivar[4] = create_filter_var (GPIV_IMGFI_HIGHPASS, N_("High-pass filter"), N_("Window:"), gl_imgproc_par->threshold, GPIV_IMGPROCPAR_MAX__THRESHOLD, _("Step #: 0"), 0, N_("High-pass filter") ); for (i = 0; i < IMG_FILTERS; i++) { /* g_message(":: val[%d] = %f upper[%d] = %f", */ /* i, imgproc->ivar[i]->value, */ /* i, imgproc->ivar[i]->upper); */ imgproc->imf_inf[i] = create_filter_interface (main_window, imgproc->ivar[i] ); gtk_object_set_data(GTK_OBJECT(imgproc->imf_inf[i]->button_filter), "imgproc", imgproc); gtk_table_attach (GTK_TABLE (imgproc->table), imgproc->imf_inf[i]->button_filter, 0, 1, i, i+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_table_attach (GTK_TABLE (imgproc->table), imgproc->imf_inf[i]->label_filtervar, 1, 2, i, i+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_table_attach (GTK_TABLE (imgproc->table), imgproc->imf_inf[i]->spinbutton_filtervar, 2, 3, i, i+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_table_attach (GTK_TABLE (imgproc->table), imgproc->imf_inf[i]->label_step_filter, 3, 4, i, i+1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); } /* * Button to execute image processing */ imgproc->button = gtk_button_new_with_label ( _("process image")); gtk_widget_ref (imgproc->button); gtk_object_set_data_full (GTK_OBJECT (main_window), "button", imgproc->button, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgproc->button); gtk_box_pack_start (GTK_BOX (imgproc->vbox), imgproc->button, TRUE, FALSE, 0); gtk_tooltips_set_tip(gpiv->tooltips, imgproc->button, _("Executes the image process sequence in the order of the step numbers"), NULL); gtk_object_set_data (GTK_OBJECT (imgproc->button), "imgproc", imgproc); g_signal_connect (GTK_OBJECT (imgproc->button), "enter", G_CALLBACK (on_button_imgproc_enter), NULL); g_signal_connect (GTK_OBJECT (imgproc->button), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (imgproc->button), "clicked", G_CALLBACK (on_button_imgproc), NULL); /* * End of create_imgproc */ return imgproc; } static ImgfilterVar * create_filter_var (gint filter_id, gchar *button_label, gchar *label_filtervar_label, gdouble value, gdouble upper, gchar *label_step_filter_label, gint count_nr, gchar *appbar_msg ) /*----------------------------------------------------------------------------- */ { ImgfilterVar *ivar = g_new0 (ImgfilterVar, 1); ivar->filter_id = filter_id; ivar->button_label = button_label; ivar->label_filtervar_label = label_filtervar_label; ivar->value = value; ivar->upper = upper; ivar->label_step_filter_label = label_step_filter_label; ivar->count_nr = count_nr; ivar->appbar_msg = appbar_msg; return ivar; } static ImgfilterInterface * create_filter_interface (GnomeApp *main_window, ImgfilterVar *ivar ) /*----------------------------------------------------------------------------- */ { ImgfilterInterface *imf_inf = g_new0 (ImgfilterInterface, 1); imf_inf->button_filter = gtk_check_button_new_with_label(ivar->button_label); gtk_widget_ref(imf_inf->button_filter); gtk_object_set_data_full(GTK_OBJECT(main_window), "imf_inf__button_filter", imf_inf->button_filter, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (imf_inf->button_filter), "ivar", ivar); gtk_object_set_data (GTK_OBJECT (imf_inf->button_filter), "imf_inf", imf_inf); gtk_widget_show(imf_inf->button_filter); g_signal_connect(GTK_OBJECT(imf_inf->button_filter), "enter", G_CALLBACK (on_button_filter_enter), (gchar *) ivar->appbar_msg); g_signal_connect(GTK_OBJECT(imf_inf->button_filter), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect(GTK_OBJECT(imf_inf->button_filter), "clicked", G_CALLBACK (on_button_filter), (int *) ivar->filter_id); /* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON */ /* imf_inf->button_filter), */ /* gpiv_par->process_subtract); */ imf_inf->label_filtervar = gtk_label_new(ivar->label_filtervar_label); gtk_widget_ref(imf_inf->label_filtervar); gtk_object_set_data_full(GTK_OBJECT (main_window), "imf_inf__label_filtervar", imf_inf->label_filtervar, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(imf_inf->label_filtervar); gtk_misc_set_padding(GTK_MISC(imf_inf->label_filtervar), 2, 0); imf_inf->spinbutton_adj_filtervar = gtk_adjustment_new ((gdouble) ivar->value, 0, (gdouble) ivar->upper, 1, 100, 10); imf_inf->spinbutton_filtervar = gtk_spin_button_new (GTK_ADJUSTMENT (imf_inf->spinbutton_adj_filtervar), 1, 0); gtk_widget_ref (imf_inf->spinbutton_filtervar); gtk_object_set_data_full (GTK_OBJECT (main_window), "imf_inf__spinbutton_filtervar", imf_inf->spinbutton_filtervar, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imf_inf->spinbutton_filtervar); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (imf_inf->spinbutton_filtervar), TRUE); gtk_object_set_data (GTK_OBJECT (imf_inf->spinbutton_filtervar), "ivar", ivar); g_signal_connect (GTK_OBJECT (imf_inf->spinbutton_filtervar), "changed", G_CALLBACK (on_spinbutton_filtervar), imf_inf->spinbutton_filtervar); /* * Step number or pass */ imf_inf->label_step_filter = gtk_label_new(ivar->label_step_filter_label); gtk_widget_ref(imf_inf->label_step_filter); gtk_object_set_data_full(GTK_OBJECT (main_window), "imf_inf__step_label_filter", imf_inf->label_step_filter, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(imf_inf->label_step_filter); gtk_misc_set_padding(GTK_MISC(imf_inf->label_step_filter), 2, 0); return imf_inf; } #endif /* ENABLE_IMGPROC */ gpiv-0.6.1/src/imgproc_interface.h0000644000175000017500000000435111110306641014020 00000000000000 /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * Image processing tab * $Log: imgproc_interface.h,v $ * Revision 1.1 2008-09-16 10:16:08 gerber * added imgproc routines * */ #ifndef GPIV_IMGPROC_INTERFACE_H #define GPIV_IMGPROC_INTERFACE_H /* #ifdef ENABLE_IMGPROC */ typedef struct _ImgfilterVar ImgfilterVar; struct _ImgfilterVar { gint filter_id; gchar *button_label; gchar *label_filtervar_label; gint value; gint upper; gchar *label_step_filter_label; gint count_nr; gchar *appbar_msg; }; typedef struct _ImgfilterInterface ImgfilterInterface; struct _ImgfilterInterface { GtkWidget *button_filter; GtkWidget *label_filtervar; GtkObject *spinbutton_adj_filtervar; GtkWidget *spinbutton_filtervar; GtkWidget *label_step_filter; }; typedef struct _Imgprocess Imgprocess; struct _Imgprocess { GtkWidget *vbox_label; GtkWidget *label_title; GtkWidget *vbox_scroll; GtkWidget *scrolledwindow; GtkWidget *viewport; GtkWidget *vbox; GtkWidget *table; ImgfilterVar *ivar[IMG_FILTERS]; ImgfilterInterface *imf_inf[IMG_FILTERS]; GtkWidget *button; }; Imgprocess * create_imgproc(GnomeApp *main_window, GtkWidget *container); /* #endif */ /* ENABLE_IMGPROC */ #endif /* GPIV_IMGPROC_INTERFACE_H */ gpiv-0.6.1/src/imgproc.c0000644000175000017500000002562411110305671012003 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * Image processing window/tabulator callbacks * $Log: imgproc.c,v $ * Revision 1.1 2008-09-16 11:04:47 gerber * added imgproc routines * */ #include "gpiv_gui.h" #include "imgproc.h" /* #include "imgproc_interface.h" */ /* * Prototyping */ gchar * exec_imgproc_smooth (void); gchar * exec_imgproc_hilo (void); gchar * exec_imgproc_clip (void); /* * Callback functions */ void on_button_filter_enter(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole * gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), data); } void on_button_filter(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- Adjust/ sets variables for a image processing button, its relatives and variables of other imgproc buttons if adeqaute. imf_inf: current widget which is calling the callback function imgproc->imf_inf[]: (element of) array widgets belonging to imgproc */ { Imgprocess *imgproc = gtk_object_get_data (GTK_OBJECT (widget), "imgproc"); ImgfilterInterface *imf_inf = gtk_object_get_data (GTK_OBJECT (widget), "imf_inf"); ImgfilterVar *ivar = gtk_object_get_data (GTK_OBJECT (widget), "ivar"); /* gint filter_id = (int) data; */ gchar label[GPIV_MAX_CHARS]; gint i; if (GTK_TOGGLE_BUTTON(widget)->active == TRUE) { gpiv_var->imgproc_count++; g_snprintf (label, GPIV_MAX_CHARS, "Step #: %d", gpiv_var->imgproc_count); ivar->label_step_filter_label = label; gtk_label_set_text (GTK_LABEL (imf_inf->label_step_filter), (char *) ivar->label_step_filter_label); ivar->count_nr = gpiv_var->imgproc_count; } else { for (i = 0; i < IMG_FILTERS; i++) { if (imgproc->ivar[i]->count_nr > ivar->count_nr) { imgproc->ivar[i]->count_nr--; g_snprintf(label, GPIV_MAX_CHARS, "Step #: %d", imgproc->ivar[i]->count_nr); imgproc->ivar[i]->label_step_filter_label = label; gtk_label_set_text (GTK_LABEL (imgproc->imf_inf[i]->label_step_filter), (char *) imgproc->ivar[i]->label_step_filter_label); } } gpiv_var->imgproc_count--; ivar->count_nr = 0; g_snprintf(label, GPIV_MAX_CHARS, "Step #: %d", ivar->count_nr); ivar->label_step_filter_label = label; gtk_label_set_text (GTK_LABEL (imf_inf->label_step_filter), (char *) ivar->label_step_filter_label); } } void on_spinbutton_filtervar (GtkSpinButton *widget, GtkWidget *entry ) /* ---------------------------------------------------------------------------- */ { ImgfilterVar *ivar = gtk_object_get_data (GTK_OBJECT (widget), "ivar"); ivar->value = gtk_spin_button_get_value_as_int (widget); if (ivar->filter_id == GPIV_IMGFI_SUBACK) { /* gpiv_var->imgproc_smooth_window = gtk_spin_button_get_value_as_int (widget);*/ /* g_message ("on_spinbutton_filtervar:: GPIV_IMGFI_SUBACK val = %d", */ /* ivar->value); */ } else if (ivar->filter_id == GPIV_IMGFI_HILO) { /* g_message ("on_spinbutton_filtervar:: GPIV_IMGFI_HILO val = %d", */ /* ivar->value); */ } else if (ivar->filter_id == GPIV_IMGFI_SMOOTH) { /* g_message ("on_spinbutton_filtervar:: GPIV_IMGFI_SMOOTH val = %d", */ /* ivar->value); */ } else if (ivar->filter_id == GPIV_IMGFI_CLIP) { /* g_message ("on_spinbutton_filtervar:: GPIV_IMGFI_CLIP val = %d", */ /* ivar->value); */ } else if (ivar->filter_id == GPIV_IMGFI_HIGHPASS) { /* g_message ("on_spinbutton_filtervar:: GPIV_IMGFI_HIGHPASS val = %d", */ /* ivar->value); */ } } void on_button_imgproc_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); gchar *msg = _("Processes image"); gnome_appbar_set_status (GNOME_APPBAR (gpiv->appbar), msg); } void on_button_imgproc (GtkWidget *widget, gpointer data ) /* ---------------------------------------------------------------------------- */ { /* Imgprocess *imgproc = gtk_object_get_data (GTK_OBJECT (widget), "imgproc"); */ GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (widget), "gpiv"); cancel_process = FALSE; exec_imgproc (gpiv); } /* * Local functions */ gchar * set_imgproc_filtervar (GpivConsole *gpiv, gint id, gint value) /* ---------------------------------------------------------------------------- */ { gchar *err_msg = NULL; gint i; for (i = 0; i < IMG_FILTERS; i++) { if (gpiv->imgproc->ivar[i]->filter_id == id /* GPIV_IMGFI_SUBACK */ ) { gpiv->imgproc->ivar[i]->value = value; gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->imgproc->imf_inf[i]->spinbutton_filtervar), (gdouble) value); if (gpiv_par->verbose) g_message ("set_imgproc_filtervar:: i = %d id = %d value = %d", i, id, value); } } return err_msg; } gchar * exec_imgproc_subtract (ImgfilterVar *ivar) /*----------------------------------------------------------------------------- */ { gchar *err_msg = NULL; if (gpiv_par->verbose) g_message ("exec_imgproc_subtract:: value = %d", ivar->value); if (ivar->value > nbufs - 1) { err_msg = "exec_imgproc_subtract: unvalid value: larger than number of buffers"; warning_gpiv ("%s", err_msg); return err_msg; } if (ivar->value == display_act->id) { err_msg = "exec_imgproc_subtract: subtracting intensities from own buffer image"; return err_msg; } if ((err_msg = gpiv_imgproc_subtractimg (display[ivar->value]->img->image, display_act->img->image )) != NULL) { g_message("exec_imgproc_subtract: %s", err_msg); return err_msg; } return err_msg; } gchar * exec_imgproc_hilo (void) /*----------------------------------------------------------------------------- */ { gchar *err_msg = NULL; /* BUGFIX: there is an error in the procedure? */ if (gpiv_par->verbose) g_message ("exec_imgproc_hilo:: 0"); if ((err_msg = gpiv_imgproc_highlow (display_act->img->image, gl_imgproc_par)) != NULL) gpiv_warning ("exec_imgproc_hilo: %s", err_msg); if (gpiv_par->verbose) g_message ("exec_imgproc_hilo:: 1"); if (gpiv_par->verbose) g_message ("exec_imgproc_hilo:: 2/2"); return (err_msg); } gchar * exec_imgproc_clip (void) /*----------------------------------------------------------------------------- */ { gchar *err_msg = NULL; if ((err_msg = gpiv_imgproc_clip (display_act->img->image, gl_imgproc_par)) != NULL) gpiv_warning ("exec_imgproc_clip: %s", err_msg); return (err_msg); } gchar * exec_imgproc_smooth (void) /*----------------------------------------------------------------------------- */ { gchar *err_msg = NULL; if ((err_msg = gpiv_imgproc_smooth (display_act->img->image, gl_imgproc_par)) != NULL) gpiv_warning ("exec_imgproc_smooth: %s", err_msg); return (err_msg); } gchar * exec_imgproc_highpass (void) /*----------------------------------------------------------------------------- */ { gchar *err_msg = NULL; if ((err_msg = gpiv_imgproc_highpass (display_act->img->image, gl_imgproc_par)) != NULL) gpiv_warning ("exec_imgproc_highpass: %s", err_msg); return (err_msg); } void exec_imgproc (GpivConsole * gpiv /* Imgprocess *imgproc */ ) /*----------------------------------------------------------------------------- */ { gchar *err_msg = NULL; gint i, j; for (i = 1; i <= gpiv_var->imgproc_count; i++) { for (j = 0; j < IMG_FILTERS; j++) { if (gpiv->imgproc->ivar[j]->count_nr == i) { if (gpiv->imgproc->ivar[j]->filter_id == GPIV_IMGFI_SUBACK) { if ((err_msg = exec_imgproc_subtract (gpiv->imgproc->ivar[j])) != NULL) { g_warning ("exec_imgproc: %s", err_msg); } } else if (gpiv->imgproc->ivar[j]->filter_id == GPIV_IMGFI_HILO) { gl_imgproc_par->window = gpiv->imgproc->ivar[j]->value; exec_imgproc_hilo (); } else if (gpiv->imgproc->ivar[j]->filter_id == GPIV_IMGFI_CLIP) { gl_imgproc_par->threshold = gpiv->imgproc->ivar[j]->value; exec_imgproc_clip (); } else if (gpiv->imgproc->ivar[j]->filter_id == GPIV_IMGFI_SMOOTH) { exec_imgproc_smooth (); } else if (gpiv->imgproc->ivar[j]->filter_id == GPIV_IMGFI_HIGHPASS) { gl_imgproc_par->window = gpiv->imgproc->ivar[j]->value; exec_imgproc_highpass (); } } } } /* #ifdef IMGPROC_SAVE_IMG */ if (display_act != NULL) { destroy_img (display_act); create_img (display_act); if (gpiv_par->verbose) g_message ("EXEC_IMGPROC:: img.saved_img = FALSE"); display_act->img->saved_img = FALSE; } /* #endif */ } gpiv-0.6.1/src/imgproc.h0000644000175000017500000000367211110306667012015 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * (callback) functions for image processing * $Log: imgproc.h,v $ * Revision 1.1 2008-09-16 11:04:47 gerber * added imgproc routines * */ #ifndef IMGPROC_H #define IMGPROC_H gchar * set_imgproc_filtervar (GpivConsole *gpiv, gint id, gint value); void exec_imgproc (GpivConsole *gpiv); /* * Callback functions */ void on_button_filter_enter (GtkWidget *widget, gpointer data); void on_button_filter (GtkWidget *widget, gpointer data); void on_spinbutton_filtervar (GtkSpinButton *widget, GtkWidget *entry); void on_button_imgproc_enter (GtkWidget *widget, gpointer data); void on_button_imgproc (GtkWidget *widget, gpointer data); #endif /* IMGPROC_H */ gpiv-0.6.1/src/main.c0000644000175000017500000010771111110305642011263 00000000000000/* -*- Mode1: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * main routines of gpiv * $Log: main.c,v $ * Revision 1.30 2008-10-09 14:43:37 gerber * paralellized with OMP and MPI * * Revision 1.29 2008-04-28 12:00:57 gerber * hdf-formatted files are now with .hdf extension (previously: .gpi) * * Revision 1.28 2007-12-19 08:42:35 gerber * debugged * * Revision 1.27 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.26 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.25 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.24 2007/02/05 15:17:09 gerber * auto stretching, broadcast display settings to buffers from preferences * * Revision 1.23 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.22 2006-09-18 07:27:06 gerber * *** empty log message *** * * Revision 1.21 2006/01/31 15:15:33 gerber * version 0.3.0b; minor change * * Revision 1.20 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.18 2005/03/04 12:52:01 gerber * print message if gpiv_scan_resourcefiles returns with err_msg != NULL ==> * this is not an error, but defaults are read * * Revision 1.17 2005/03/01 15:23:22 gerber * removed warning message * * Revision 1.16 2005/03/01 14:43:46 gerber * updated documentation * * Revision 1.15 2005/02/26 09:43:30 gerber * parameter flags (parameter_logic) defined as gboolean * * Revision 1.14 2005/02/26 09:17:13 gerber * structured of interrogate function by using gpiv_piv_isiadapt * * Revision 1.13 2005/01/19 15:53:42 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.12 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.11 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.10 2003/09/04 13:31:55 gerber * init of printing (unfinished) * * Revision 1.9 2003/09/01 11:17:15 gerber * improved monitoring of interrogation process * * Revision 1.8 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.7 2003/07/25 15:40:23 gerber * removed/disabled setting of correlation in Eval tab, Correlation type in Image info tab * * Revision 1.6 2003/07/13 14:38:18 gerber * changed error handling of libgpiv * * Revision 1.5 2003/07/12 21:21:16 gerber * changed error handling libgpiv * * Revision 1.3 2003/07/10 11:56:07 gerber * added man page * * Revision 1.2 2003/06/27 13:47:26 gerber * display ruler, line/point evaluation * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ /* * some header inclusions for gtk/gnome (by glade) */ #ifdef HAVE_CONFIG_H # include #endif #include "support.h" /* * all variables are read by a header */ #include "gpiv_gui.h" #include "console.h" /* #include "console_interface.h" */ #include "io.h" #include "utils.h" #include "utils_par.h" #include "main.h" /* #define USAGE "\ */ /* Usage: gpiv-gui [-f filename][-s N][-t] \n\ */ /* \n\ */ /* keys: \n\ */ /* -f filename: loads project \n\ */ /* -s N: vector scale N \n\ */ /* -t: show tooltips \n" */ /* [-p] */ /* -p: print parameters and other info to stdout \n\ */ /* #define HELP "\n\ */ /* gpiv processes and analyzes images for (Digital) Particle Image \n\ */ /* Velocimetry, post-processes the PIV data and visualizes its \n\ */ /* results in a graphical way. \n" */ static Par * scan_parameters() /*----------------------------------------------------------------------------- * Obtains parameter settings of the Graphic User Interface */ { gchar *err_msg; gboolean used_default = FALSE; Par *ldp = g_new (Par, 1); /* Local default parameter */ /* Par *lgp = g_new (Par, 1); */ /* default_par = ldp; */ gnome_config_push_prefix ("/gpiv/General/"); ldp->print_par = gnome_config_get_bool_with_default ("print_par=FALSE", &used_default); if (used_default) { g_message ("print_par = %d from default", ldp->print_par); gnome_config_set_bool ("print_par", ldp->print_par); } ldp->verbose = gnome_config_get_bool_with_default ("verbose=FALSE", &used_default); if (used_default) { g_message ("verbose = %d from default", ldp->verbose); gnome_config_set_bool ("verbose", ldp->verbose); } ldp->console__show_tooltips = gnome_config_get_bool_with_default ("console__show_tooltips=TRUE", &used_default); ldp->console__show_tooltips__set = TRUE; if (used_default) { g_message ("console__show_tooltips = %d from default", ldp->console__show_tooltips); gnome_config_set_bool ("console__show_tooltips", ldp->console__show_tooltips); } ldp->console__view_gpivbuttons = gnome_config_get_bool_with_default ("console__view_gpivbuttons=TRUE", &used_default); ldp->console__view_gpivbuttons__set = TRUE; if (used_default) { g_message ("console__view_gpivbuttons = %d from default", ldp->console__view_gpivbuttons); gnome_config_set_bool ("view__gpivbuttons", ldp->console__view_gpivbuttons); } ldp->console__view_tabulator = gnome_config_get_bool_with_default ("console__view_tabulator=TRUE", &used_default); ldp->console__view_tabulator__set = TRUE; if (used_default) { g_message ("console__view_tabulator = %d from default", ldp->console__view_tabulator); gnome_config_set_bool ("view__tabulator", ldp->console__view_tabulator); } ldp->console__nbins = gnome_config_get_int_with_default ("console__nbins=10", &used_default); ldp->console__nbins__set = TRUE; if (used_default) { g_message ("console__nbins = %d from default", ldp->console__nbins); gnome_config_set_int ("console__nbins", ldp->console__nbins); } ldp->img_fmt = gnome_config_get_int_with_default ("img_fmt=0", &used_default); ldp->img_fmt__set = TRUE; if (used_default) { g_message ("img_fmt = %d from default ??", ldp->img_fmt); gnome_config_set_bool ("img_fmt", ldp->img_fmt); } ldp->hdf = gnome_config_get_bool_with_default ("hdf=FALSE", &used_default); ldp->hdf__set = TRUE; if (used_default) { g_message ("hdf = %d from default ??", ldp->hdf); gnome_config_set_bool ("hdf", ldp->hdf); } #ifdef ENABLE_MPI ldp->mpi_nodes = gnome_config_get_int_with_default ("mpi_nodes=4", &used_default); ldp->mpi_nodes__set = TRUE; if (used_default) { g_message ("mpi_nodes = %d from default", ldp->mpi_nodes); gnome_config_set_int ("mpi_nodes", ldp->mpi_nodes); } #endif /* ENABLE_MPI */ gnome_config_push_prefix ("/gpiv/Image/"); ldp->x_corr = gnome_config_get_bool_with_default ("x_corr=TRUE", &used_default); ldp->x_corr__set = TRUE; if (used_default) { g_message ("x_corr = %d from default", ldp->x_corr); gnome_config_set_bool ("x_corr", ldp->x_corr); } gnome_config_push_prefix ("/gpiv/Processes/"); #ifdef ENABLE_CAM ldp->process__cam = gnome_config_get_bool_with_default ("process__cam=FALSE", &used_default); ldp->process__cam__set = TRUE; if (used_default) { g_message ("process__cam = %d from default", ldp->process__cam); gnome_config_set_bool ("process__cam", ldp->process__cam); } #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG ldp->process__trig = gnome_config_get_bool_with_default ("process__trig=FALSE", &used_default); ldp->process__trig__set = TRUE; if (used_default) { g_message ("process__trig = %d from default", ldp->process__trig); gnome_config_set_bool ("process__trig", ldp->process__trig); } #endif /* ENABLE_TRIG */ #ifdef ENABLE_IMGPROC ldp->process__imgproc = gnome_config_get_bool_with_default ("process__imgproc=FALSE", &used_default); ldp->process__imgproc__set = TRUE; if (used_default) { g_message ("process__imgproc = %d from default", ldp->process__imgproc); gnome_config_set_bool ("process__imgproc", ldp->process__imgproc); } #endif /* ENABLE_IMGPROC */ ldp->process__piv = gnome_config_get_bool_with_default ("process__piv=TRUE", &used_default); ldp->process__piv__set = TRUE; if (used_default) { g_message ("process__piv = %d from default", ldp->process__piv); gnome_config_set_bool ("process__piv", ldp->process__piv); } ldp->process__gradient = gnome_config_get_bool_with_default ("process__gradient=FALSE", &used_default); ldp->process__gradient__set = TRUE; if (used_default) { g_message ("process__gradient = %d from default", ldp->process__gradient); gnome_config_set_bool ("process__gradient", ldp->process__gradient); } ldp->process__resstats = gnome_config_get_bool_with_default ("process__resstats=FALSE", &used_default); ldp->process__resstats__set = TRUE; if (used_default) { g_message ("process__resstats = %d from default", ldp->process__resstats); gnome_config_set_bool ("process__resstats", ldp->process__resstats); } ldp->process__errvec = gnome_config_get_bool_with_default ("process__errvec=FALSE", &used_default); ldp->process__errvec__set = TRUE; if (used_default) { g_message ("process__errvec = %d from default", ldp->process__errvec); gnome_config_set_bool ("process__errvec", ldp->process__errvec); } ldp->process__peaklock = gnome_config_get_bool_with_default ("process__peaklock=FALSE", &used_default); ldp->process__peaklock__set = TRUE; if (used_default) { g_message ("process__peaklock = %d from default", ldp->process__peaklock); gnome_config_set_bool ("process__peaklock", ldp->process__peaklock); } ldp->process__average = gnome_config_get_bool_with_default ("process__average=FALSE", &used_default); ldp->process__average__set = TRUE; if (used_default) { g_message ("process__average = %d from default", ldp->process__average); gnome_config_set_bool ("process__average", ldp->process__average); } ldp->process__scale = gnome_config_get_bool_with_default ("process__scale=FALSE", &used_default); ldp->process__scale__set = TRUE; if (used_default) { g_message ("process__scale = %d from default", ldp->process__scale); gnome_config_set_bool ("process__scale", ldp->process__scale); } ldp->process__subtract = gnome_config_get_bool_with_default ("process__subtract=FALSE", &used_default); ldp->process__subtract__set = TRUE; if (used_default) { g_message ("process__subtract = %d from default", ldp->process__subtract); gnome_config_set_bool ("process__subtract", ldp->process__subtract); } ldp->process__vorstra = gnome_config_get_bool_with_default ("process__vorstra=FALSE", &used_default); ldp->process__vorstra__set = TRUE; if (used_default) { g_message ("process__vorstra = %d from default", ldp->process__vorstra); gnome_config_set_bool ("process__vorstra", ldp->process__vorstra); } gnome_config_push_prefix ("/gpiv/Display/"); ldp->display__view_menubar = gnome_config_get_bool_with_default ("display__view_menubar=TRUE", &used_default); ldp->display__view_menubar__set = TRUE; if (used_default) { g_message ("display__view_menubar = %d from default", ldp->display__view_menubar); gnome_config_set_bool ("display__view_menubar", ldp->display__view_menubar); } ldp->display__view_rulers = gnome_config_get_bool_with_default ("display__view_rulers=TRUE", &used_default); ldp->display__view_rulers__set = TRUE; if (used_default) { g_message ("display__view_rulers = %d from default", ldp->display__view_rulers); gnome_config_set_bool ("display__view_rulers", ldp->display__view_rulers); } ldp->display__stretch_auto = gnome_config_get_bool_with_default ("display__stretch_auto=TRUE", &used_default); ldp->display__stretch_auto__set = TRUE; if (used_default) { g_message ("display__stretch_auto = %d from default", ldp->display__stretch_auto); gnome_config_set_bool ("display__stretch_auto", ldp->display__stretch_auto); } ldp->display__backgrnd = gnome_config_get_int_with_default ("display__background=0", &used_default); ldp->display__backgrnd__set = TRUE; if (used_default) { g_message ("display__background = %d from default", ldp->display__backgrnd); gnome_config_set_int ("display__background", ldp->display__backgrnd); } ldp->display__zoom_index = gnome_config_get_int_with_default ("display__zoom_index=1", &used_default); ldp->display__zoom_index__set = TRUE; if (used_default) { g_message ("display__zoom_index = %d from default", ldp->display__zoom_index); gnome_config_set_int ("display__zoom_index", ldp->display__zoom_index); } ldp->display__vector_scale = gnome_config_get_int_with_default ("display__vector_scale=8", &used_default); ldp->display__vector_scale__set = TRUE; if (used_default) { g_message ("display__vector_scale = %d from default", ldp->display__vector_scale); gnome_config_set_int ("display__vector_scale", ldp->display__vector_scale); } ldp->display__vector_color = gnome_config_get_int_with_default ("display__vector_color=SHOW_PEAKNR", &used_default); ldp->display__vector_color__set = TRUE; if (used_default) { g_message ("display__vector_color = %d from default", ldp->display__vector_color); gnome_config_set_int ("display__vector_color", ldp->display__vector_color); } /* ldp->stretch_window = */ /* gnome_config_get_int_with_default ("stretch_window=0", &used_default); */ /* if (used_default) { */ /* g_message ("stretch_window = %d from default", */ /* ldp->stretch_window); */ /* gnome_config_set_int ("stretch_window", ldp->stretch_window); */ /* } */ ldp->display__backgrnd = gnome_config_get_int_with_default ("display__backgrnd=SHOW_BG_IMG1", &used_default); ldp->display__backgrnd__set = TRUE; if (used_default) { g_message ("display__backgrnd = %d from default", ldp->display__backgrnd); gnome_config_set_int ("display__backgrnd", ldp->display__backgrnd); } ldp->display__scalar = gnome_config_get_int_with_default ("display__scalar=SHOW_SC_NONE", &used_default); ldp->display__scalar__set = TRUE; if (used_default) { g_message ("display__scalar = %d from default", ldp->display__scalar); gnome_config_set_int ("display__scalar", ldp->display__scalar); } ldp->display__intregs = gnome_config_get_bool_with_default ("display__intregs=TRUE", &used_default); ldp->display__intregs__set = TRUE; if (used_default) { g_message ("display__intregs = %d from default", ldp->display__intregs); gnome_config_set_bool ("display__intregs", ldp->display__intregs); } ldp->display__piv = gnome_config_get_bool_with_default ("display__piv=TRUE", &used_default); ldp->display__piv__set = TRUE; if (used_default) { g_message ("display__piv = %d from default", ldp->display__piv); gnome_config_set_bool ("display__piv", ldp->display__piv); } gnome_config_pop_prefix (); gnome_config_sync(); return ldp; } static Var * scan_variables() /*----------------------------------------------------------------------------- * Obtains additional variables, stored from previous sessions. * Not all structure elements of gpiv_var are stored. */ { gboolean used_default = FALSE; gchar fname_nr[GPIV_MAX_CHARS], fname_nr_default[GPIV_MAX_CHARS]; gint i = 0; Var *lgv = g_new0 (Var, 1); gnome_config_push_prefix ("/gpiv/RuntimeVariables/"); lgv->tab_pos = gnome_config_get_int_with_default ("tab_pos=1", &used_default); if (used_default) { g_message ("tab_pos = %d from default", lgv->tab_pos); gnome_config_set_int ("tab_pos", lgv->tab_pos); } lgv->number_fnames_last = gnome_config_get_int_with_default ("number_fnames_last=0", &used_default); if (used_default) { g_message ("number_fnames_last = %d from default", lgv->number_fnames_last); gnome_config_set_int ("number_fnames_last", lgv->number_fnames_last); } for (i = 0; i < lgv->number_fnames_last; i++) { g_snprintf(fname_nr, GPIV_MAX_CHARS,"fname_last_%d", i); g_snprintf(fname_nr_default, GPIV_MAX_CHARS,"fname_last_%d=./", i); lgv->fn_last[i] = gnome_config_get_string_with_default (fname_nr_default, &used_default); if (used_default) { g_message ("fnames_nr_default = %s from default", lgv->fn_last[i]); gnome_config_set_string(fname_nr, lgv->fn_last[i]); } } lgv->fname_date = gnome_config_get_bool_with_default ("fname_date=FALSE", &used_default); if (used_default) { g_message ("fname_date = %d from default", lgv->fname_date); gnome_config_set_bool ("fname_date", lgv->fname_date); } lgv->fname_time = gnome_config_get_bool_with_default ("fname_time=FALSE", &used_default); if (used_default) { g_message ("fname_time = %d from default", lgv->fname_time); gnome_config_set_bool ("fname_time", lgv->fname_time); } lgv->fname_last = gnome_config_get_string_with_default ("fname_last=./", &used_default); if (used_default) { g_message ("fname_last = %s from default", lgv->fname_last); gnome_config_set_string("fname_last", lgv->fname_last); } lgv->img_span_px = gnome_config_get_float_with_default ("span=1.0", &used_default); if (used_default) { g_message ("img_span_px = %f from default", lgv->img_span_px); gnome_config_set_float("span", lgv->img_span_px); } lgv->img_length_mm = gnome_config_get_float_with_default ("length=1.0", &used_default); if (used_default) { g_message ("img_length_mm = %f from default", lgv->img_length_mm); gnome_config_set_float("length", lgv->img_length_mm); } lgv->piv_disproc_zoom = gnome_config_get_float_with_default ("zoom_factor=1.0", &used_default); if (used_default) { g_message ("piv_disproc_zoom = %f from default", lgv->piv_disproc_zoom); gnome_config_set_float("piv_disproc_zoom", lgv->piv_disproc_zoom); } lgv->piv_disproc_vlength = gnome_config_get_int_with_default ("piv_disproc_length=1", &used_default); if (used_default) { g_message ("piv_disproc_length = %d from default", lgv->piv_disproc_vlength); gnome_config_set_int ("piv_disproc_length", lgv->piv_disproc_vlength); } gnome_config_pop_prefix (); gnome_config_sync(); return lgv; } static void par_init (void) /*----------------------------------------------------------------------------- * Reading parameters and variables from gnome parameter file (~/.gnome2/gpiv) * See: http://developer.gnome.org/doc/GGAD/z79.html * * This workaround is because popt table is read when 'gnome_program_init' is. * executed. The parameter structure loaded by popt (gp) needs to be compared * with the values before reading the table, to find which parameters * have been used as command arg. Therefore gp has been copied * to gpiv_par before reading the table and is compared here. * If not defined by command arg, defaults will be used. Defaults only can be * read after 'gnome_program_init' as it uses gnome_config_get_*. * * Finally, the program variables are loaded here as well. */ { gchar *err_msg = NULL; set_parameters_ifdiff (&gp, gpiv_par); default_par = scan_parameters (); /* cp_undef_parameters (default_par, gpiv_par); */ if ((err_msg = cp_undef_parameters (default_par, gpiv_par)) != NULL) { gpiv_error ("par_init_args: failing cp_undef_parameters"); } gpiv_var = scan_variables (); } static void img_par_init (void) /*----------------------------------------------------------------------------- * Setting and reading image parameters. */ { char *err_msg = NULL; GpivImagePar *lo_image_par = g_new0 (GpivImagePar, 1); gl_image_par = lo_image_par; gpiv_img_parameters_set (gl_image_par, FALSE); if ((err_msg = gpiv_scan_resourcefiles (GPIV_IMGPAR_KEY, gl_image_par, gpiv_par->print_par)) != NULL) g_message ("%s: %s", RCSID, err_msg); g_snprintf (gl_image_par->software, GPIV_MAX_CHARS, "%s %s", PACKAGE, VERSION); gl_image_par->software__set = TRUE; g_snprintf (gl_image_par->author, GPIV_MAX_CHARS, "%s", g_get_real_name ()); gl_image_par->author__set = TRUE; gpiv_img_default_parameters (gl_image_par, FALSE); if (gpiv_par->x_corr) { g_snprintf(IMAGE_CORRELATION_LABEL, GPIV_MAX_CHARS, "cross-correlation"); } else { g_snprintf(IMAGE_CORRELATION_LABEL, GPIV_MAX_CHARS, "auto-correlation"); } g_snprintf(IMAGE_WIDTH_LABEL, GPIV_MAX_CHARS, "%d", gl_image_par->ncolumns); g_snprintf(IMAGE_HEIGHT_LABEL, GPIV_MAX_CHARS, "%d", gl_image_par->nrows); g_snprintf(IMAGE_DEPTH_LABEL, GPIV_MAX_CHARS, "%d", gl_image_par->depth); } #ifdef ENABLE_CAM static void cam_par_init (gboolean cam_trig) /*----------------------------------------------------------------------------- * parameter and variables initializing of data acquisition * (trigger timings and cameraam) */ { gchar *err_msg; GpivCamPar *lo_cam_par = g_new0 (GpivCamPar, 1); gl_cam_par = lo_cam_par; gpiv_cam_parameters_set (gl_cam_par, FALSE); if ((err_msg = gpiv_scan_resourcefiles (GPIV_CAMPAR_KEY, gl_cam_par, gpiv_par->print_par)) != NULL) message_gpiv ("%s: %s", RCSID, err_msg); gpiv_cam_check_parameters_read (gl_cam_par, NULL); if ((cam_var = gpiv_cam_get_camvar (gpiv_par->verbose)) == NULL) { if (gpiv_par->verbose) warning_gpiv("cam_par_init: failing gpiv_cam_get_camvar"); cam_trig = FALSE; } if (cam_var->numCameras > 0) { if (dc1394_setup_capture (cam_var->camera[0].handle, cam_var->camera[0].id, cam_var->misc_info[0].iso_channel, cam_var->misc_info[0].format, cam_var->misc_info[0].mode, cam_var->maxspeed, /* cam_var->misc_info[0].framerate */ FRAMERATE_7_5, cam_var->capture[0]) != DC1394_SUCCESS) { dc1394_release_camera (cam_var->handle, cam_var->capture[0]); raw1394_destroy_handle (cam_var->handle); g_warning("unable to setup camera-\n\ check line %d of %s to make sure\n\ that the video mode,framerate and format are\n\ supported by your camera\n", __LINE__,__FILE__); return; } gl_image_par->ncolumns = cam_var->capture[0].frame_width; gl_image_par->nrows = cam_var->capture[0].frame_height; gl_image_par->ncolumns__set = TRUE; gl_image_par->nrows__set = TRUE; raw1394_destroy_handle(cam_var->handle); if (gpiv_par->verbose) { g_message ("cam_par_init:: from camera: nrows = %d ncolumns = %d", gl_image_par->nrows, gl_image_par->ncolumns); } } } #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG static void trig_par_init (void) /*----------------------------------------------------------------------------- * parameter and variables initializing of data acquisition * (trigger timings) */ { GpivTrigPar *lo_trig_par = g_new0 (GpivTrigPar, 1); gl_trig_par = lo_trig_par; gpiv_itrig_parameters_set (gl_trig_par, FALSE); gpiv_trig_parameters_set(gl_trig_par, FALSE); if ((err_msg = gpiv_scan_resourcefiles (GPIV_TRIGPAR_KEY, gl_trig_par, gpiv_par->print_par)) != NULL) message_gpiv ("%s: %s", RCSID, err_msg); gpiv_trig_check_parameters_read (gl_trig_par, NULL); } #endif /* ENABLE_TRIG */ #ifdef ENABLE_IMGPROC static void imgproc_par_init (void) /*----------------------------------------------------------------------------- * Setting and reading image processing parameters. */ { char *err_msg = NULL; GpivImageProcPar *lo_imgproc_par = g_new0 (GpivImageProcPar, 1); gl_imgproc_par = lo_imgproc_par; gpiv_imgproc_parameters_set (gl_imgproc_par, FALSE); if ((err_msg = gpiv_scan_resourcefiles (GPIV_IMGPROCPAR_KEY, gl_imgproc_par, gpiv_par->print_par)) != NULL) g_message ("%s: %s", RCSID, err_msg); gpiv_imgproc_check_parameters_read (gl_imgproc_par, NULL); } #endif /* ENABLE_IMGPROC */ static void piv_par_init (void) /*----------------------------------------------------------------------------- * Reading piv interrogation parameters. */ { char *err_msg = NULL; GpivPivPar *lo_piv_par = g_new0 (GpivPivPar, 1); gl_piv_par = lo_piv_par; gpiv_piv_parameters_set (gl_piv_par, FALSE); if ((err_msg = gpiv_scan_resourcefiles (GPIV_PIVPAR_KEY, gl_piv_par, gpiv_par->print_par)) != NULL) g_message ("%s: %s", RCSID, err_msg); gpiv_piv_check_parameters_read(gl_piv_par, NULL); if (gl_piv_par->col_start > gl_image_par->ncolumns - gl_piv_par->pre_shift_col - 1) { gl_piv_par->col_start = 0; if (gpiv_par->verbose) g_warning ("col_start larger than ncolumns; \nset to 0"); } if (gl_piv_par->col_end > gl_image_par->ncolumns - gl_piv_par->pre_shift_col - 1) { gl_piv_par->col_end = gl_image_par->ncolumns - gl_piv_par->pre_shift_col - 1; if (gpiv_par->verbose) g_warning("col_end larger than ncolumns; \nset to ncolumns %d", gl_image_par->ncolumns - 1); } if (gl_piv_par->row_start > gl_image_par->nrows - gl_piv_par->pre_shift_row - 1) { gl_piv_par->row_start = 0; if (gpiv_par->verbose) g_warning(_("row_start larger than nrows; \nset to zero")); } if (gl_piv_par->row_end > gl_image_par->nrows - gl_piv_par->pre_shift_row - 1) { gl_piv_par->row_end = gl_image_par->nrows - gl_piv_par->pre_shift_row - 1; if (gpiv_par->verbose) g_warning("row_end larger than nrows; \nset to nrows %d", gl_image_par->nrows - 1); } } static void valid_par_init (void) /*----------------------------------------------------------------------------- * Reading piv validation parameters. */ { char *err_msg = NULL; GpivValidPar *lo_valid_par = g_new0 (GpivValidPar, 1); gl_valid_par = lo_valid_par; gpiv_valid_parameters_set (gl_valid_par, FALSE); if ((err_msg = gpiv_scan_resourcefiles (GPIV_VALIDPAR_KEY, gl_valid_par, gpiv_par->print_par)) != NULL) g_message ("%s: %s", RCSID, err_msg); gpiv_valid_check_parameters_read (gl_valid_par, NULL); } static void post_par_init (void) /*----------------------------------------------------------------------------- * Reading piv post-processing parameters. */ { char *err_msg = NULL; GpivPostPar *lo_post_par = g_new0 (GpivPostPar, 1); gl_post_par = lo_post_par; gpiv_post_parameters_set (gl_post_par, FALSE); if ((err_msg = gpiv_scan_resourcefiles (GPIV_POSTPAR_KEY, gl_post_par, gpiv_par->print_par)) != NULL) g_message ("%s: %s", RCSID, err_msg); gpiv_post_check_parameters_read (gl_post_par, NULL); } static void load_images_from_commandline (GnomeProgram *program, GpivConsole *gpiv) /*----------------------------------------------------------------------------- * Loading the images from the command line while launching gpiv. */ { gint i, result; GValue value = { 0, }; char **args; poptContext ctx; g_value_init (&value, G_TYPE_POINTER); g_object_get_property (G_OBJECT (program), GNOME_PARAM_POPT_CONTEXT, &value); ctx = g_value_get_pointer (&value); g_value_unset (&value); args = (char**) poptGetArgs(ctx); if (args) { for (i = 0; args[i]; i++) { select_action_from_name (gpiv, args[i]); } } } int main (int argc, char *argv[] ) /*----------------------------------------------------------------------------- * Main routine of gpiv */ { GnomeProgram *program; /* GpivConsole *gpiv = g_new0 (GpivConsole, 1); */ GtkWidget *window1; char *err_msg = NULL; gchar *msg = "Welcome to gpiv."; GtkWidget *menu_gpiv_popup = NULL; GpivConsole *gpiv = NULL; gboolean trig_trig = TRUE, cam_trig = TRUE; gint trig_init, trig_start, trig_stop, trig_error; gint i; gboolean restored = FALSE; #ifdef ENABLE_NLS setlocale (LC_ALL, ""); bindtextdomain(PACKAGE, PACKAGE_LOCALE_DIR); textdomain(PACKAGE); #endif /* * parameter initializing of gpiv-gui, image */ msg_default = ""; m_select = 0; nbufs = 0; exec_process = FALSE; cancel_process = FALSE; display_act = NULL; gci_aoi = NULL; gci_line = NULL; if ((gpiv_par = cp_parameters (&gp)) == NULL) { gpiv_error ("main: failing cp_parameters"); } /* Initialize gnome program * command line keys: using POPT */ Gpiv_app = NULL; program = gnome_program_init (PACKAGE, VERSION, LIBGNOMEUI_MODULE, argc, argv, GNOME_PARAM_POPT_TABLE, options, GNOME_PARAM_HUMAN_READABLE_NAME, _("Image analyser for Particle Image Velocimetry"), GNOME_PROGRAM_STANDARD_PROPERTIES, NULL); /* * Used for authentification when loading/storing images from remote system * with gnome_vfs */ gnome_authentication_manager_init (); /* * Reading program parameters, variables and process parameters */ gdk_rgb_init (); par_init (); img_par_init (); #ifdef ENABLE_CAM cam_par_init (cam_trig); #endif #ifdef ENABLE_TRIG trig_par_init (); #endif #ifdef ENABLE_IMGPROC imgproc_par_init (); #endif piv_par_init (); valid_par_init (); post_par_init (); if (gl_image_par->ncolumns <= IMAGE_WIDTH_MAX && gl_image_par->nrows <= IMAGE_HEIGHT_MAX && gl_image_par->depth <= IMAGE_DEPTH_MAX ) { /* * creating the Graphic interface */ gpiv = create_gpiv (); gtk_widget_show (GTK_WIDGET (gpiv->console)); menu_gpiv_popup = create_menu_gpiv_popup (gpiv); gtk_signal_connect_object (GTK_OBJECT(gpiv->console), "button_press_event", GTK_SIGNAL_FUNC (on_my_popup_handler), GTK_OBJECT (menu_gpiv_popup)); gnome_appbar_set_default (GNOME_APPBAR(gpiv->appbar), msg_default); gnome_appbar_push (GNOME_APPBAR(gpiv->appbar), msg); if (gpiv_par->console__show_tooltips) { gtk_tooltips_enable(gpiv->tooltips); } else { gtk_tooltips_disable(gpiv->tooltips); } #ifdef ENABLE_TRIG /* * Widgets will be enabled / disabled if trigger kernel modules * are loaded and accessible. * An info message will be displayed if features are absent */ if (!gpiv_trig_openrtfs (&trig_init, &trig_start, &trig_stop, &trig_error)) { message_gpiv (_("Trigger system not available")); trig_trig = FALSE; } exec_trigger_stop (); sensitive (gpiv, DAC_TRIG, trig_trig); sensitive (gpiv, DAC_TIMING, trig_trig); #endif /* ENABLE_TRIG */ #ifdef ENABLE_CAM /* * Widgets will be enabled / disabled if camera is connected. * An info message will be displayed if features are absent */ if (cam_var->numCameras > 0) { sensitive (gpiv, DAC_CAM, TRUE); if (cam_trig) { sensitive (gpiv, DAC_TIMING, TRUE); } } else { sensitive (gpiv, DAC_CAM, FALSE); if (cam_trig) { sensitive (gpiv, DAC_TIMING, FALSE); } message_gpiv (_("No camera connected")); } #endif /* ENABLE_CAM */ sensitive (gpiv, IMG, TRUE); sensitive (gpiv, EVAL, TRUE); sensitive (gpiv, INTREGS, FALSE); sensitive (gpiv, VALID, TRUE); sensitive (gpiv, POST, TRUE); load_images_from_commandline (program, gpiv); } else { error_gpiv(_("Image dimensions or depth are larger than %dx%dx%d."), (int)IMAGE_WIDTH_MAX, (int)IMAGE_HEIGHT_MAX, (int)IMAGE_DEPTH_MAX); } gtk_main (); exit(0); } gpiv-0.6.1/src/main.h0000644000175000017500000001311411110306567011270 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* {NULL, 'q', POPT_ARG_NONE, &q, 0, */ /* N_("Explain gpiv"), NULL}, */ static const struct poptOption options [] = { {"cross", 'x', POPT_ARG_NONE, &gp.x_corr, 0, N_("cross-correlation image"), N_("XCORR")}, {"img_fmt", '\0', POPT_ARG_INT, &gp.img_fmt, 0, N_("store image and header in PNG (0), raw (1) or HDF5 (2) format"), NULL}, {"hdf", '\0', POPT_ARG_NONE, &gp.hdf, 0, N_("store resulting data in HDF5 format with .h5 extension"), NULL}, #ifdef ENABLE_MPI {"mpi_nodes", '\0', POPT_ARG_INT, &gp.mpi_nodes, 0, N_("number of nodes for parallel execution on cluster using MPI"), N_("INT")}, #endif /* ENABLE_MPI */ {"print", 'p', POPT_ARG_NONE, &gp.print_par, 0, N_("print parameters and other info to stdout"), NULL}, {"verbose", 'V', POPT_ARG_NONE, &gp.verbose, 0, N_("more verbose behaviour to stdout"), NULL}, {"console__view_gpivbuttons", '\0', POPT_ARG_NONE, &gp.console__view_gpivbuttons, 0, N_("view the GPIV processing buttons"), NULL}, {"console__view_tabulator", '\0', POPT_ARG_NONE, &gp.console__view_tabulator, 0, N_("view the tabulator of the application"), NULL}, {"console__tooltips", '\0', POPT_ARG_NONE, &gp.console__show_tooltips, 0, N_("show tooltips"), NULL}, {"console__bins", '\0', POPT_ARG_INT, &gp.console__nbins, 0, N_("number of bins for histograms"), N_("BINS")}, {"display__view_menubar", '\0', POPT_ARG_NONE, &gp.display__view_menubar, 0, N_("view the menubar of the display"), NULL}, {"display__view_rulers", '\0', POPT_ARG_NONE, &gp.display__view_rulers, 0, N_("view the rulers of the display"), NULL}, {"display__stretch", '\0', POPT_ARG_NONE, &gp.display__stretch_auto, 0, N_("automatic stretching of the display when zooming"), NULL}, {"display__background", '\0', POPT_ARG_INT, &gp.display__backgrnd, 0, N_("display background: 0:darkblue 1:black 2:image1 3:image2"), NULL}, {"display__intregs", '\0', POPT_ARG_NONE, &gp.display__intregs, 0, N_("display interrogation region contours"), NULL}, {"display__piv", '\0', POPT_ARG_NONE, &gp.display__piv, 0, N_("display PIV data"), NULL}, {"display__scalar", '\0', POPT_ARG_INT, &gp.display__scalar, 0, N_("display scalar data derived from PIV: 0:none 1:vorticity 2:shear strain 3:normal strain"), NULL}, {"display__zoomscale", '\0', POPT_ARG_INT, &gp.display__zoom_index, 0, N_("display zoom index: 0:0.5, 1:0.83, 2:1.0, 3:1.3, 4:1.6, 5:2.0"), N_("SCALE")}, {"display__vectorscale", '\0', POPT_ARG_INT, &gp.display__vector_scale, 0, N_("vector length scale"), N_("SCALE")}, #ifdef ENABLE_CAM {"process__cam", '\0', POPT_ARG_NONE, &gp.process__cam, 0, N_("executes image recording"), NULL}, #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG {"process__trig", '\0', POPT_ARG_NONE, &gp.process__trig, 0, N_("executes triggering of light source and camera"), NULL}, #endif /* ENABLE_TRIG */ #ifdef ENABLE_IMGPROC {"process__imgproc", '\0', POPT_ARG_NONE, &gp.process__imgproc, 0, N_("executes image manipulation"), NULL}, #endif /* ENABLE_IMGPROC */ {"process__piv", '\0', POPT_ARG_NONE, &gp.process__piv, 0, N_("executes piv interrogation"), NULL}, {"process__gradient", '\0', POPT_ARG_NONE, &gp.process__gradient, 0, N_("executes gradient test"), NULL}, {"process__resstats", '\0', POPT_ARG_NONE, &gp.process__resstats, 0, N_("executes calculation of residu statistics"), NULL}, {"process__errvec", '\0', POPT_ARG_NONE, &gp.process__errvec, 0, N_("executes PIV data validation"), NULL}, {"process__peaklock", '\0', POPT_ARG_NONE, &gp.process__peaklock, 0, N_("executes peaklock testing"), NULL}, {"process__average", '\0', POPT_ARG_NONE, &gp.process__average, 0, N_("executes average calculation"), NULL}, {"process__scale", '\0', POPT_ARG_NONE, &gp.process__scale, 0, N_("executes time and spatial scaling"), NULL}, {"process__subtract", '\0', POPT_ARG_NONE, &gp.process__subtract, 0, N_("executes subtracting the mean"), NULL}, {"process__vorstra", '\0', POPT_ARG_NONE, &gp.process__vorstra, 0, N_("executes vorticity / strain calculation"), NULL}, {NULL, '\0', 0, NULL, 0} }; gpiv-0.6.1/src/display_piv.c0000644000175000017500000004153311110305762012664 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ #include "gpiv_gui.h" #include "display_piv.h" static guint32 create_vector_color (gint peak_no, gfloat snr, gfloat dl ); gfloat dxdy_min (GpivPivData *piv_data ) /*----------------------------------------------------------------------------- * Calculates maximum particle displacement from dx and dy of a piv data-set */ { guint i, j; gfloat dl_abs = 0.0, dl_min = 10.0e+9; /* assert (piv_data->nx != 0); */ /* assert (piv_data->ny != 0); */ if (piv_data == NULL) { gpiv_error ("dxdy_min: piv_data == NULL"); } for (i = 0; i < piv_data->ny; i++) { for (j = 0; j < piv_data->nx; j++) { if (piv_data->peak_no[i][j] >= 1) { dl_abs = sqrt (piv_data->dx[i][j] * piv_data->dx[i][j] + piv_data->dy[i][j] * piv_data->dy[i][j]); if (dl_abs < dl_min) { dl_min = dl_abs; } } } } return dl_min; } gfloat dxdy_max (GpivPivData *piv_data ) /*----------------------------------------------------------------------------- * Calculates maximum particle displacement from dx and dy of a piv data-set */ { guint i, j; gfloat dl_abs = 0.0, dl_max = 0.0; /* g_message ("dxdy_max:: 0 nx = %d ny = %d", */ /* piv_data->nx, piv_data->ny); */ if (piv_data == NULL) { gpiv_error ("dxdy_max: piv_data == NULL"); } for (i = 0; i < piv_data->ny; i++) { for (j = 0; j < piv_data->nx; j++) { if (piv_data->peak_no[i][j] >= 1) { dl_abs = sqrt (piv_data->dx[i][j] * piv_data->dx[i][j] + piv_data->dy[i][j] * piv_data->dy[i][j]); if (dl_abs > dl_max) { dl_max = dl_abs; } } } } return dl_max; } void create_vector (PivData *pida, guint i, guint j ) /* ---------------------------------------------------------------------------- * Displays a single PIV vector on a Gnome canvas */ { GnomeCanvasPoints *points = NULL; Display *disp = display_act; gfloat **point_x = NULL; gfloat **point_y = NULL; gfloat **dx = NULL, **dy = NULL; gint **peak_no = NULL; gfloat **snr = NULL; gfloat dl = 0.0; guint32 color_val = 0; if (pida->piv_data == NULL) return; point_x = pida->piv_data->point_x; point_y = pida->piv_data->point_y; dx = pida->piv_data->dx; dy = pida->piv_data->dy; peak_no = pida->piv_data->peak_no; snr = pida->piv_data->snr; dl = sqrt (dx[i][j] * dx[i][j] + dy[i][j] * dy[i][j]); points = gnome_canvas_points_new (2); /* * Fill out the points */ points->coords[0] = point_x[i][j]; points->coords[1] = point_y[i][j]; points->coords[2] = point_x[i][j] + dx[i][j] * gpiv_par->display__vector_scale; points->coords[3] = point_y[i][j] + dy[i][j] * gpiv_par->display__vector_scale; color_val = create_vector_color (peak_no[i][j], snr[i][j], dl); if (pida->gci_vector[i][j] != NULL) { /* g_warning ("create_vector:: gci_vector[%d][%d] != NULL ==> destroying", */ /* i, j); */ destroy_vector (pida, i, j); } pida->gci_vector[i][j] = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (disp->canvas)), gnome_canvas_line_get_type (), "points", points, "fill_color_rgba", color_val, "width_units", (double) THICKNESS, "last_arrowhead", TRUE, "arrow_shape_a", (double) ARROW_LENGTH * ARROW_FACT * dl * gpiv_par->display__vector_scale + ARROW_ADD, "arrow_shape_b", (double) ARROW_EDGE * ARROW_FACT * dl * gpiv_par->display__vector_scale + ARROW_ADD, "arrow_shape_c", (double) ARROW_WIDTH * ARROW_FACT * dl * gpiv_par->display__vector_scale + ARROW_ADD, NULL); gnome_canvas_points_free (points); } void update_vector (PivData *pida, guint i, guint j ) /* ---------------------------------------------------------------------------- * Updates a single PIV vector on a Gnome canvas */ { GnomeCanvasPoints *points; gfloat **point_x = NULL, **point_y = NULL; gfloat **dx = NULL, **dy = NULL; gfloat **snr = NULL; gint **peak_no = NULL; gfloat dl = 0.0; guint32 color_val = 0; if (pida->piv_data == NULL) return; point_x = pida->piv_data->point_x; point_y = pida->piv_data->point_y; dx = pida->piv_data->dx; dy = pida->piv_data->dy; peak_no = pida->piv_data->peak_no; snr = pida->piv_data->snr; dl = sqrt (dx[i][j] * dx[i][j] + dy[i][j] * dy[i][j]); points = gnome_canvas_points_new (2); /* * Fill out the points */ points->coords[0] = point_x[i][j]; points->coords[1] = point_y[i][j]; points->coords[2] = point_x[i][j] + dx[i][j] * gpiv_par->display__vector_scale; points->coords[3] = point_y[i][j] + dy[i][j] * gpiv_par->display__vector_scale; color_val = create_vector_color (peak_no[i][j], snr[i][j], dl); if (pida->gci_vector[i][j] != NULL) { gnome_canvas_item_set (GNOME_CANVAS_ITEM (pida->gci_vector[i][j]), "points", points, "fill_color_rgba", color_val, "width_units", (double) THICKNESS, "last_arrowhead", TRUE, "arrow_shape_a", (double) ARROW_LENGTH * ARROW_FACT * dl * gpiv_par->display__vector_scale + ARROW_ADD, "arrow_shape_b", (double) ARROW_EDGE * ARROW_FACT * dl * gpiv_par->display__vector_scale + ARROW_ADD, "arrow_shape_c", (double) ARROW_WIDTH * ARROW_FACT * dl * gpiv_par->display__vector_scale + ARROW_ADD, NULL); } gnome_canvas_points_free (points); } void destroy_vector (PivData *pida, guint i, guint j ) /* ---------------------------------------------------------------------------- * Detroys a single PIV vector on a Gnome canvas */ { if (pida->gci_vector[i][j] != NULL) { gtk_object_destroy (GTK_OBJECT (pida->gci_vector[i][j])); pida->gci_vector[i][j] = NULL; } } void create_all_vectors (PivData *pida ) /* --------------------------------------------------------------------------- * Displays all PIV vectors on a Gnome canvas */ { guint i, j; guint nx = 0, ny = 0; if (pida->piv_data == NULL) return; nx = pida->piv_data->nx; ny = pida->piv_data->ny; if (pida->exist_vec) { destroy_all_vectors (pida); } gpiv_var->dl_max = dxdy_max (pida->piv_data); gpiv_var->dl_min = dxdy_min (pida->piv_data); for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { create_vector (pida, i, j); } } pida->exist_vec = TRUE; } void show_all_vectors (PivData *pida ) /* ---------------------------------------------------------------------------- * Shows all PIV vectors on a Gnome canvas */ { guint i, j; guint nx = 0, ny = 0; if (pida->piv_data == NULL) return; nx = pida->piv_data->nx; ny = pida->piv_data->ny; for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { if (pida->gci_vector[i][j] != NULL) { gnome_canvas_item_show (GNOME_CANVAS_ITEM (pida->gci_vector[i][j])); } } } } void hide_all_vectors (PivData *pida ) /* ---------------------------------------------------------------------------- * Hides all PIV vectors on a Gnome canvas */ { guint i, j; guint nx = 0, ny = 0; if (pida->piv_data == NULL) return; nx = pida->piv_data->nx; ny = pida->piv_data->ny; for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { if (pida->gci_vector[i][j] != NULL) { gnome_canvas_item_hide (GNOME_CANVAS_ITEM (pida->gci_vector[i][j])); } } } } void update_all_vectors (PivData *pida ) /* ---------------------------------------------------------------------------- * Scales PIV vectors for Gnome canvas */ { guint i, j; guint nx = 0, ny = 0; if (pida->piv_data == NULL) return; nx = pida->piv_data->nx; ny = pida->piv_data->ny; gpiv_var->dl_max = dxdy_max (pida->piv_data); gpiv_var->dl_min = dxdy_min (pida->piv_data); for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { update_vector (pida, i, j); } } } void destroy_all_vectors (PivData *pida ) /* ---------------------------------------------------------------------------- * Destroys all PIV vectors on a Gnome canvas */ { guint i, j; guint nx = 0, ny = 0; if (pida->piv_data == NULL) return; nx = pida->piv_data->nx; ny = pida->piv_data->ny; if (pida->exist_vec) { for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { destroy_vector (pida, i, j); } } /* } else { */ /* g_warning ("destroy_all_vectors: exist_vec = FALSE"); */ } pida->exist_vec = FALSE; } /* * Local functions */ #ifdef CANVAS_AA static guint32 create_vector_color (gint peak_no, gfloat snr, gfloat dl ) /* ---------------------------------------------------------------------------- * Create vector color for in canvas */ { guint32 color = 0; GdkColor *color_val = NULL; guint shift_factor; Display *disp = display_act; color_val = (GdkColor *)g_malloc (sizeof (GdkColor)); if (gpiv_par->display__vector_color == SHOW_PEAKNR) { if (peak_no == -1) { color_val->red = BYTEVAL; color_val->green = 0; color_val->blue = 0; } else if (peak_no == 0) { color_val->red = 0; color_val->green = 0; color_val->blue = BYTEVAL; } else if (peak_no == 1) { color_val->red = 0; color_val->green = BYTEVAL; color_val->blue = 0; } else if (peak_no == 2) { color_val->red = 0; color_val->green = BYTEVAL; color_val->blue = BYTEVAL; } else { /* if (peak_no[i][j] == 3) */ color_val->red = BYTEVAL / 2; color_val->green = BYTEVAL / 2; color_val->blue = BYTEVAL / 2; } color = GNOME_CANVAS_COLOR (color_val->red, color_val->green, color_val->blue); } else if (gpiv_par->display__vector_color == SHOW_SNR) { if (snr >= disp->pida->valid_par->residu_max) { /* color = "red"; */ color_val->red = BYTEVAL; color_val->green = 0; color_val->blue = 0; } else { /* color = "green"; */ color_val->red = 0; color_val->green = BYTEVAL; color_val->blue = 0; } color = GNOME_CANVAS_COLOR (color_val->red, color_val->green, color_val->blue); } else if (gpiv_par->display__vector_color == SHOW_MAGNITUDE_GRAY) { if (peak_no >= 1) { color_val->red = (gint) (BYTEVAL * (dl - gpiv_var->dl_min) / (gpiv_var->dl_max - gpiv_var->dl_min)); color_val->green = (gint) (BYTEVAL * (dl - gpiv_var->dl_min) / (gpiv_var->dl_max - gpiv_var->dl_min)); color_val->blue = (gint) (BYTEVAL * (dl - gpiv_var->dl_min) / (gpiv_var->dl_max - gpiv_var->dl_min)); } else { color_val->red = 0; color_val->green = 0; color_val->blue = 0; } color = GNOME_CANVAS_COLOR (color_val->red, color_val->green, color_val->blue); } else if (gpiv_par->display__vector_color == SHOW_MAGNITUDE) { if (peak_no >= 1) { shift_factor = (gint) (28.0 * (dl - gpiv_var->dl_min) / (gpiv_var->dl_max - gpiv_var->dl_min)); color = (( 0xFFFF << shift_factor) | 0xFF); } else { color = GNOME_CANVAS_COLOR (0, 0, 0); } } g_free (color_val); return color; } #else /* CANVAS_AA */ static guint32 create_vector_color (gint peak_no, gfloat snr, gfloat dl ) /* ---------------------------------------------------------------------------- * Create vector color for in canvas */ { guint32 color_val = 0; gint shift_factor; if (gpiv_par->display__vector_color == SHOW_PEAKNR) { if (peak_no == -1) { /* color = "red"; */ color_val = (gint) (BYTEVAL); color_val = (color_val << BITSHIFT_RED); } else if (peak_no == 0) { /* color = "lightblue"; */ color_val = (gint) (BYTEVAL); color_val = (color_val << BITSHIFT_BLUE); } else if (peak_no == 1) { /* color = "green"; */ color_val = (gint) (BYTEVAL); color_val = (color_val << BITSHIFT_GREEN); } else if (peak_no == 2) { /* color = "yellow"; */ color_val = (gint) (BYTEVAL); color_val = (color_val << BITSHIFT_GREEN) + (color_val << BITSHIFT_BLUE); } else { /* if (peak_no == 3) */ /* color = "gray"; */ color_val = (gint) (127); color_val = (color_val << BITSHIFT_RED) + (color_val << BITSHIFT_GREEN) + (color_val << BITSHIFT_BLUE); } } else if (gpiv_par->display__vector_color == SHOW_SNR) { if (snr >= gl_valid_par->residu_max) { /* color = "red"; */ color_val = (gint) (BYTEVAL); color_val = (color_val << BITSHIFT_RED); } else { /* color = "green"; */ color_val = (gint) (BYTEVAL); color_val = (color_val << BITSHIFT_GREEN); } } else if (gpiv_par->display__vector_color == SHOW_MAGNITUDE_GRAY) { if (peak_no >= 1) { color_val = (gint) (BYTEVAL * (dl - gpiv_var->dl_min) / (gpiv_var->dl_max - gpiv_var->dl_min)); color_val = (color_val << BITSHIFT_RED) + (color_val << BITSHIFT_GREEN) + (color_val << BITSHIFT_BLUE); } else { color_val = 0; } } else if (gpiv_par->display__vector_color == SHOW_MAGNITUDE) { if (peak_no >= 1) { shift_factor = (gint) (28.0 * (dl - gpiv_var->dl_min) / (gpiv_var->dl_max - gpiv_var->dl_min)); color_val = ( 0xFFFF << shift_factor); } else { color_val = 0; } } return color_val; } #endif /* CANVAS_AA */ gpiv-0.6.1/src/display_piv.h0000644000175000017500000000401011110307026012651 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ #ifndef DISPLAY_PIV_H #define DISPLAY_PIV_H /* * PIV vectors in a Gnome canvas */ /* Determines maximum for scaling */ gfloat dxdy_min (GpivPivData *piv_data); gfloat dxdy_max (GpivPivData *piv_data); /* Displays a single PIV vector */ void create_vector (PivData *pida, guint i, guint j); /* Updates a single PIV vector */ void update_vector (PivData *pida, guint i, guint j); /* Destroys a single PIV vector */ void destroy_vector (PivData *pida, guint i, guint j); /* Displays all PIV vectors*/ void create_all_vectors (PivData *pida); /* Shows all PIV vectors */ void show_all_vectors (PivData *pida); /* Hides all PIV vectors */ void hide_all_vectors (PivData *pida); /* Updates all PIV vectors */ void update_all_vectors (PivData *pida); /* Destroys all PIV vectors */ void destroy_all_vectors (PivData *pida); #endif /* DISPLAY_PIV_H */ gpiv-0.6.1/src/piveval_interrogate.c0000644000175000017500000010543211204235403014407 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* $Log: piveval_interrogate.c,v $ /* Revision 1.4 2008-10-09 15:19:03 gerber /* Release 0.6.0 using paralellized code /* /* Revision 1.3 2008-10-09 14:43:37 gerber /* paralellized with OMP and MPI /* /* Revision 1.2 2008-09-25 13:32:22 gerber /* Adapted for use on cluster (using MPI/OMP) paralellised gpiv_rr from gpivtools) /* /* Revision 1.1 2008-09-16 10:17:36 gerber /* added piveval_interrogate routines /* */ #include "gpiv_gui.h" /* #include "utils.h" */ #include "piveval.h" #include "piveval_interrogate.h" #undef USE_MTRACE #ifdef USE_MTRACE #include #endif static void report_progress (const guint index_y, const guint index_x, gdouble *progress_value_prev, const GpivPivData *piv_data, const GpivPivPar *piv_par, const guint sweep, const gfloat cum_residu, const GpivConsole *gpiv, const Display *disp ); static GpivPivData * alloc_pivdata_gridgen (const GpivImagePar *image_par, const GpivPivPar *piv_par ); static gchar * update_pivdata_imgdeform_zoff (const GpivImage *image, GpivImage *lo_image, const GpivPivPar *piv_par, const GpivValidPar *valid_par, GpivPivData *piv_data, GpivPivData *lo_piv_data, gfloat *cum_residu, gboolean *cum_residu_reached, gfloat *sum_dxdy, gfloat *sum_dxdy_old, gboolean isi_last, gboolean grid_last, gboolean sweep_last, gboolean verbose ); #ifdef ENABLE_MPI static GpivPivData * exec_piv_mpi (GpivImage *image, GpivPivPar *piv_par, GpivValidPar *valid_par, GpivConsole *gpiv ); #endif /* ENABLE_MPI */ /* * Program-wide public piv interrogation functions */ void exec_piv (GpivConsole *gpiv ) /*----------------------------------------------------------------------------- * Performs the execution of image interrogation for PIV */ { char *err_msg = NULL; char message[2 * GPIV_MAX_CHARS]; guint nx = 0, ny = 0; if (display_act == NULL || display_act->img->exist_img == FALSE || cancel_process) { err_msg = _("At first, open an image. \n" "Than we'll further see what will happen."); g_warning (err_msg); warning_gpiv (err_msg); return; } /* * Free memory of pivdata and clean the display from its vectors */ if (display_act->pida->exist_piv /* && (m_select != SINGLE_AREA_MS */ /* || m_select != DRAG_AREA_MS) */ ) { destroy_all_vectors (display_act->pida); gpiv_free_pivdata (display_act->pida->piv_data); display_act->pida->exist_piv = FALSE; display_act->pida->averaged_piv = FALSE; if (display_act->pida->scaled_piv) { gpiv_free_pivdata (display_act->pida->piv_data_scaled); display_act->pida->scaled_piv = FALSE; } } /* * Free eventually existing memory of vor_data and cleanup the display * as they do not belong to the piv data anymore */ free_post_bufmems (display_act); exec_process = TRUE; /* * Set mouse selection to None for using correct AOI */ /* if (m_select != NO_MS) { */ /* gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON */ /* (gpiv->piveval->radiobutton_mouse_1), */ /* TRUE); */ /* } */ /* * Setting interrogation scheme to GPIV_ZERO_OFF_CENTRAL if image deformation * is impossible with too small (initial or final) grid. */ if (gl_piv_par->int_scheme == GPIV_IMG_DEFORM) { gpiv_piv_count_pivdata_fromimage (display_act->img->image->header, gl_piv_par, &nx, &ny); if (nx < 2 || ny < 2) { g_snprintf (message, 2 * GPIV_MAX_CHARS, _("Image deformation is impossibe with grid of nx = %d ny =%d.\n\ Setting Interrogation scheme to Central difference.\n \ This will be reset automatically."), nx, ny); warning_gpiv ("%s", message); gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (gpiv->piveval->radiobutton_centraldiff), TRUE); int_scheme_autochanged = TRUE; } } /* * checking parameters and interrogating image by local function */ display_act->pida->piv_par = gpiv_piv_cp_parameters (gl_piv_par); if ((err_msg = gpiv_piv_testadjust_parameters (display_act->img->image->header, display_act->pida->piv_par)) != NULL) { warning_gpiv ("%s", err_msg); return; } display_act->pida->valid_par = gpiv_valid_cp_parameters (gl_valid_par); gpiv_valid_print_parameters (stdout, display_act->pida->valid_par); if ((err_msg = gpiv_valid_testadjust_parameters (display_act->pida->valid_par)) != NULL) { warning_gpiv ("%s", err_msg); return; } gpiv_valid_print_parameters (stdout, display_act->pida->valid_par); #ifdef USE_LIBGPIV_INTERR #undef USE_LIBGPIV_INTERR #endif if ((display_act->pida->piv_data = #ifdef ENABLE_MPI /* Calling extern tool gpiv_rr from gpivtools with MPI enabled */ exec_piv_mpi(display_act->img->image, display_act->pida->piv_par, display_act->pida->valid_par, gpiv) #elif USE_LIBGPIV_INTERR /* Libgpiv's function for image interrogation */ gpiv_piv_interrogate_img (display_act->img->image, display_act->pida->piv_par, display_act->pida->valid_par, TRUE) #else /* Gpiv's function for image interrogation */ interrogate_img (display_act->img->image, display_act->pida->piv_par, display_act->pida->valid_par, gpiv) #endif ) == NULL) { warning_gpiv ("exec_piv: failing interrogate_img"); return; } #ifdef USE_LIBGPIV_INTERR #undef USE_LIBGPIV_INTERR #endif display_act->pida->exist_piv = TRUE; /* * Adding some comment to piv_data */ display_act->pida->piv_data->comment = g_strdup_printf ("# Software: %s %s\n", PACKAGE, VERSION); display_act->pida->piv_data->comment = gpiv_add_datetime_to_comment (display_act->pida->piv_data->comment); display_act->pida->piv_data->comment = g_strconcat (display_act->pida->piv_data->comment, "# Data type: Particle Image Velocities\n", NULL); /* * Drawing and displaying PIV vectors */ if (gl_piv_par->int_geo == GPIV_POINT || m_select == SINGLE_AREA_MS || m_select == SINGLE_POINT_MS || m_select == DRAG_MS) { } else { if (display_act->display_piv) { create_all_vectors (display_act->pida); } display_act->display_piv = TRUE; } /* * Some settings for displaying features * Update vectors to correct for colors/gray-scale */ display_act->pida->scaled_piv = FALSE; display_act->pida->saved_piv = FALSE; display_act->pida->averaged_piv = FALSE; display_act->pida->exist_cov = TRUE; update_all_vectors (display_act->pida); exec_process = FALSE; /* * Resetting interrogation scheme */ if (int_scheme_autochanged) { int_scheme_autochanged = FALSE; gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (gpiv->piveval->radiobutton_imgdeform), TRUE); } gtk_progress_set_value (GTK_PROGRESS (gnome_appbar_get_progress (GNOME_APPBAR (gpiv->appbar))), 0.0); } GpivPivData * interrogate_img (const GpivImage *image, const GpivPivPar *piv_par, const GpivValidPar *valid_par, GpivConsole *gpiv ) /* ---------------------------------------------------------------------------- * PIV interrogation of an image pair at an entire grid or single point * Similar to gpiv_piv_interr_img, but adapted for the GUI */ { GpivPivData *piv_data = NULL; /* piv data to be returned */ gchar *err_msg = NULL; /* error message */ guint index_x = 0, index_y = 0; /* array indices */ /* * Local variables with prefix lo_ to distinguish from global or from * parameter list */ GpivImage *lo_image = NULL; /* local image that might be deformed */ GpivPivData *lo_piv_data = NULL; /* local piv data */ GpivPivPar *lo_piv_par = NULL; /* local piv parameters */ gfloat **intreg1 = display_act->pida->intreg1; /* first interrogation area */ gfloat **intreg2 = display_act->pida->intreg2; /* second interrogation area */ guint int_size_0; /* zero-padded interrogation area size */ GpivCov *cov = NULL; /* covariance */ guint sweep = 1; /* itaration counter */ gboolean grid_last = FALSE; /* flag if final grid refinement has been reached */ gboolean isi_last = FALSE; /* flag if final interrogation area shift has been reached */ gboolean cum_residu_reached = FALSE;/* flag if max. cumulative residu has been reached */ gboolean sweep_last = FALSE; /* perform the last iteration sweep */ gboolean sweep_stop = FALSE; /* stop the current iteration at the end */ gfloat sum_dxdy = 0.0, sum_dxdy_old = 0.0; /* */ gfloat cum_residu = 914.6; /* initial, large, arbitrary cumulative residu */ gdouble progress = 0.0; /* for monitoring calculation progress */ /* * Testing parameters on consistency and initializing derived * parameters/variables */ if ((err_msg = gpiv_piv_testonly_parameters (image->header, piv_par)) != NULL) { warning_gpiv ("%s", err_msg); return NULL; } if ((err_msg = gpiv_valid_testonly_parameters (valid_par)) != NULL) { warning_gpiv ("%s", err_msg); return NULL; } /* * Local (actualized) parameters * Setting initial parameters and variables for adaptive grid and * Interrogation Area dimensions */ lo_piv_par = gpiv_piv_cp_parameters (piv_par); if (lo_piv_par->int_scheme == GPIV_ZERO_OFF_FORWARD || lo_piv_par->int_scheme == GPIV_ZERO_OFF_CENTRAL || lo_piv_par->int_scheme == GPIV_IMG_DEFORM || lo_piv_par->int_size_i > lo_piv_par->int_size_f) { lo_piv_par->int_size_f = lo_piv_par->int_size_i; sweep_last = FALSE; } else { sweep_last = TRUE; } if (lo_piv_par->int_shift < lo_piv_par->int_size_i / GPIV_SHIFT_FACTOR) { lo_piv_par->int_shift = lo_piv_par->int_size_i / GPIV_SHIFT_FACTOR; } /* * A copy of the image and PIV data are needed when image deformation is used. * To keep the algorithm simple, copies are made unconditionally. */ lo_image = gpiv_cp_img (image); piv_data = alloc_pivdata_gridgen (image->header, lo_piv_par); lo_piv_data = gpiv_cp_pivdata (piv_data); gpiv_0_pivdata (lo_piv_data); /* * Reads eventually existing fftw wisdom */ gpiv_fread_fftw_wisdom(1); gpiv_fread_fftw_wisdom(-1); #ifdef USE_MTRACE mtrace(); #endif while (sweep <= GPIV_MAX_PIV_SWEEP && !sweep_stop && !cancel_process) { /* * Memory allocation of interrogation area's and covariance. * These memory chunks are allocated here to optimize calculation * speed and for eventually monitoring their contents. */ int_size_0 = GPIV_ZEROPAD_FACT * lo_piv_par->int_size_i; intreg1 = gpiv_matrix (int_size_0, int_size_0); intreg2 = gpiv_matrix (int_size_0, int_size_0); cov = gpiv_alloc_cov (int_size_0, image->header->x_corr); display_act->pida->cov = cov; /* * Interrogates a single interrogation area */ if (m_select != SINGLE_AREA_MS && m_select != DRAG_MS) { destroy_all_vectors (display_act->pida); gnome_canvas_update_now (GNOME_CANVAS (display_act->canvas)); } if (lo_piv_par->int_geo == GPIV_POINT || m_select == SINGLE_AREA_MS || m_select == SINGLE_POINT_MS || m_select == DRAG_MS) { if ((err_msg = gpiv_piv_interrogate_ia (m_select_index_y, m_select_index_x, lo_image, lo_piv_par, sweep, sweep_last, intreg1, intreg2, cov, lo_piv_data )) != NULL) { gpiv_free_img (lo_image); gpiv_free_pivdata (lo_piv_data); gpiv_free_pivdata (piv_data); gpiv_free_matrix (intreg1); gpiv_free_matrix (intreg2); gpiv_free_cov (cov); error_gpiv ("interrogate_img: %s", err_msg); } /* * display piv values, draw interrogation areas and * covariance function */ if (gpiv_var->piv_disproc == TRUE) { display_piv_vector (m_select_index_y, m_select_index_x, piv_data, gpiv->piveval); display_img_intreg1 (intreg1, lo_piv_par->int_size_i, gpiv->piveval); display_img_intreg2 (intreg2, lo_piv_par->int_size_i, gpiv->piveval); display_img_cov (cov, lo_piv_par->int_size_i, gpiv->piveval); } } else { /* * Interrogates at a rectangular grid of points within the Area Of * Interest of the image */ for (index_y = 0; index_y < lo_piv_data->ny; index_y++) { for (index_x = 0; index_x < lo_piv_data->nx; index_x++) { if (cancel_process) break; /* * Interrogates a single interrogation area. */ if ((err_msg = gpiv_piv_interrogate_ia (index_y, index_x, lo_image, lo_piv_par, sweep, sweep_last, intreg1, intreg2, cov, lo_piv_data )) != NULL) { gpiv_free_img (lo_image); gpiv_free_pivdata (lo_piv_data); gpiv_free_pivdata (piv_data); gpiv_free_matrix (intreg1); gpiv_free_matrix (intreg2); gpiv_free_cov (cov); error_gpiv ("interrogate_img: %s", err_msg); } #ifdef DEBUG gpiv_warning("interrogate_img:: back from gpiv_piv_interr_ia: sweep=%d x[%d][%d]=%f y[%d][%d]=%f dx[%d][%d]=%f dy[%d][%d]=%f snr=%f p_no=%d", sweep, index_y, index_x, lo_piv_data->point_x[index_y][index_x], index_y, index_x, lo_piv_data->point_y[index_y][index_x], index_y, index_x, lo_piv_data->dx[index_y][index_x], index_y, index_x, lo_piv_data->dy[index_y][index_x], lo_piv_data->snr[index_y][index_x], lo_piv_data->peak_no[index_y][index_x] ); #endif /* * Printing the progress of processing */ report_progress (index_y, index_x, &progress, piv_data, lo_piv_par, sweep, cum_residu, gpiv, display_act ); /* * Draw interrogation areas, covariance function, * display piv vector to monitor the process. * Includes report_rogress to include * as an argument in gpiv_piv_interr_img */ if (gpiv_var->piv_disproc == TRUE) { display_piv_vector (index_y, index_x, piv_data, gpiv->piveval); display_img_intreg1 (intreg1, lo_piv_par->int_size_i, gpiv->piveval); display_img_intreg2 (intreg2, lo_piv_par->int_size_i, gpiv->piveval); display_img_cov (cov, lo_piv_par->int_size_i, gpiv->piveval); } } } } /* * De-allocating memory: other (smaller) sizes are eventually needed * for a next iteration sweep */ gpiv_free_matrix (intreg1); gpiv_free_matrix (intreg2); gpiv_free_cov (cov); if (sweep_last) { sweep_stop = TRUE; } if ((lo_piv_par->int_scheme == GPIV_IMG_DEFORM || lo_piv_par->int_scheme == GPIV_ZERO_OFF_FORWARD || lo_piv_par->int_scheme == GPIV_ZERO_OFF_CENTRAL) /* BUGFIX: crashes with single point */ && (lo_piv_par->int_geo != GPIV_POINT && m_select != SINGLE_AREA_MS && m_select != SINGLE_POINT_MS && m_select != DRAG_MS) ) { if ((err_msg = update_pivdata_imgdeform_zoff (image, lo_image, lo_piv_par, valid_par, piv_data, lo_piv_data, &cum_residu, &cum_residu_reached, &sum_dxdy, &sum_dxdy_old, isi_last, grid_last, sweep_last, gpiv_par->verbose)) != NULL) { g_warning ("GPIV_PIV_INTERR_IMG: %s", err_msg); gpiv_free_img (lo_image); gpiv_free_pivdata (lo_piv_data); gpiv_free_pivdata (piv_data); return NULL; } } else { /* * Apply results to output piv_data */ gpiv_free_pivdata (piv_data); piv_data = gpiv_cp_pivdata (lo_piv_data); cum_residu_reached = TRUE; } /* * Adapt grid. * If final grid has been reached, grid_last will be set. */ if (lo_piv_par->int_shift > piv_par->int_shift && !sweep_stop) { GpivPivData *pd = NULL; pd = gpiv_piv_gridadapt (image->header, piv_par, lo_piv_par, piv_data, sweep, &grid_last); gpiv_free_pivdata (piv_data); piv_data = gpiv_cp_pivdata (pd); gpiv_free_pivdata (pd); gpiv_free_pivdata (lo_piv_data); lo_piv_data = gpiv_cp_pivdata (piv_data); if (lo_piv_par->int_scheme == GPIV_IMG_DEFORM) { gpiv_0_pivdata (lo_piv_data); } } else { grid_last = TRUE; } /* * Adapt interrogation area size. * If final size has been reached, isi_last will be set. */ gpiv_piv_isizadapt (piv_par, lo_piv_par, &isi_last); if (cum_residu_reached && isi_last && grid_last) { sweep_last = TRUE; /* if (lo_piv_par->int_scheme == GPIV_ZERO_OFF_FORWARD */ /* || lo_piv_par->int_scheme == GPIV_ZERO_OFF_CENTRAL) { */ /* lo_piv_par->ifit = piv_par->ifit; */ /* } */ } sweep++; } /* * Writes existing fftw wisdom */ gpiv_fwrite_fftw_wisdom (1); gpiv_fwrite_fftw_wisdom (-1); fftw_forget_wisdom(); fftw_cleanup (); #ifdef USE_MTRACE muntrace(); #endif gpiv_free_img (lo_image); gpiv_free_pivdata (lo_piv_data); return piv_data; } /* * Private piv interrogation functions */ static GpivPivData * alloc_pivdata_gridgen (const GpivImagePar *image_par, const GpivPivPar *piv_par ) /*----------------------------------------------------------------------------- * Determining the number of grid points, allocating memory for output data * and calculate locations of Interrogation Area's. If ad_int is enabled, a * course grid is started with and adapted for subsequent sweeps. ----------------------------------------------------------------------------*/ { GpivPivData *piv_data = NULL; gchar *err_msg = NULL; GpivPivPar *lo_piv_par = NULL; guint nx, ny; if ((lo_piv_par = gpiv_piv_cp_parameters (piv_par)) == NULL) { gpiv_error ("alloc_pivdata_gridgen: failing gpiv_piv_cp_parameters"); } if (piv_par->int_size_i > piv_par->int_size_f && piv_par->int_shift < piv_par->int_size_i / GPIV_SHIFT_FACTOR) { lo_piv_par->int_shift = lo_piv_par->int_size_i / GPIV_SHIFT_FACTOR; } if ((err_msg = gpiv_piv_count_pivdata_fromimage (image_par, lo_piv_par, &nx, &ny)) != NULL) { warning_gpiv ("%s", err_msg); return NULL; } if ((piv_data = gpiv_piv_gridgen (nx, ny, image_par, lo_piv_par)) == NULL) error_gpiv ("%s: %s", RCSID, err_msg); return piv_data; } static void report_progress (const guint index_y, const guint index_x, gdouble *progress_value_prev, const GpivPivData *piv_data, const GpivPivPar *piv_par, const guint sweep, const gfloat cum_residu, const GpivConsole *gpiv, const Display *disp ) /*----------------------------------------------------------------------------- * Calculates progress of interrogation processing and other variables * and prints to message bar of the console if progress value has been changed */ { gchar progress_string[GPIV_MAX_CHARS]; gdouble progress_value = 100 * (index_y * piv_data->nx + index_x +1) / (piv_data->nx * piv_data->ny); if (progress_value != *progress_value_prev) { *progress_value_prev = progress_value; if (piv_par->int_scheme == GPIV_ZERO_OFF_FORWARD || piv_par->int_scheme == GPIV_ZERO_OFF_CENTRAL || piv_par->int_scheme == GPIV_IMG_DEFORM) { if (piv_par->int_size_i > piv_par->int_size_f /* substitutes ad_int == TRUE */ ) { g_snprintf (progress_string, GPIV_MAX_CHARS, "Interrogating image #%d:" " sweep #%d" " size=%d" " shift=%d" " residu=%.3f" , disp->id, sweep, piv_par->int_size_i, piv_par->int_shift, cum_residu ); } else { g_snprintf (progress_string, GPIV_MAX_CHARS, "Interrogating image #%d:" " sweep #%d" " shift=%d" " residu=%.3f" , disp->id, sweep, piv_par->int_shift, cum_residu ); } } else { g_snprintf (progress_string, GPIV_MAX_CHARS, "Interrogating image #%d: " " shift=%d " , disp->id, piv_par/* _dest */ ->int_shift ); } while (g_main_context_iteration (NULL, FALSE)); gtk_progress_set_value (GTK_PROGRESS (gnome_appbar_get_progress (GNOME_APPBAR (gpiv->appbar))), progress_value); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), progress_string); } } static gchar * update_pivdata_imgdeform_zoff (const GpivImage *image, GpivImage *lo_image, const GpivPivPar *piv_par, const GpivValidPar *valid_par, GpivPivData *piv_data, GpivPivData *lo_piv_data, gfloat *cum_residu, gboolean *cum_residu_reached, gfloat *sum_dxdy, gfloat *sum_dxdy_old, gboolean isi_last, gboolean grid_last, gboolean sweep_last, gboolean verbose ) /*----------------------------------------------------------------------------- * Validates and updates / renews pivdata and some other variables when image * deformation or zero-offset interrogation scheme is used */ { gchar *err_msg = NULL; /* * Test on outliers */ if ((err_msg = gpiv_valid_errvec (lo_piv_data, image, piv_par, valid_par, TRUE)) != NULL) { return err_msg; } if (piv_par->int_scheme == GPIV_IMG_DEFORM) { /* * Update PIV estimators with those from the last interrogation * Resetting local PIV estimators for eventual next interrogation */ if ((err_msg = gpiv_add_dxdy_pivdata (lo_piv_data, piv_data)) != NULL) { return err_msg; } if ((err_msg = gpiv_0_pivdata (lo_piv_data)) != NULL) { return err_msg; } /* * Deform image with updated PIV estimators. * First, copy local from original image. * Deform with newly updated PIV estimators. * Eventually write deformed image. */ if ((err_msg = gpiv_cp_img_data (image, lo_image)) != NULL) { return err_msg; } if ((err_msg = gpiv_imgproc_deform (lo_image, piv_data)) != NULL) { return err_msg; } /* #define DEBUG */ #ifdef DEBUG if (sweep_last && verbose) { printf ("\n"); if ((err_msg = gpiv_piv_write_deformed_image (lo_image)) != NULL) { return err_msg; } } #endif /* DEBUG */ /* #undef DEBUG */ } else { /* * Renew PIV estimators with those from the last interrogation */ if ((err_msg = gpiv_0_pivdata (piv_data)) != NULL) { return err_msg; } if ((err_msg = gpiv_add_dxdy_pivdata (lo_piv_data, piv_data)) != NULL) { return err_msg; } } /* * Checking the relative cumulative residu for convergence * if final residu has been reached, cum_residu_reached will be set. */ if (isi_last && grid_last) { *sum_dxdy_old = *sum_dxdy; *sum_dxdy = 0.0; gpiv_sum_dxdy_pivdata (piv_data, sum_dxdy); *cum_residu = fabsf ((*sum_dxdy - *sum_dxdy_old) / ((gfloat)piv_data->nx * (gfloat)piv_data->ny)); if (*cum_residu < GPIV_CUM_RESIDU_MIN) { *cum_residu_reached = TRUE; } } return err_msg; } #ifdef ENABLE_MPI static GpivPivData * exec_piv_mpi (GpivImage *image, GpivPivPar *piv_par, GpivValidPar *valid_par, GpivConsole *gpiv ) /*----------------------------------------------------------------------------- * Interrogates an image on a distributed memory (Beowulf) cluster * using gpiv_rr from the gpivtools package */ { GpivPivData *pd = NULL; FILE *fp = NULL; gchar *command = NULL; const gchar *tmp_dir = g_get_tmp_dir (); const gchar *username = g_get_user_name (); const gchar *basename = g_get_prgname (); gchar progress_string[GPIV_MAX_CHARS]; /* * Save image at tmp directory */ gchar *image_name = g_strdup_printf ("%s/%s__%s%s" , tmp_dir, basename, username, GPIV_EXT_PNG_IMAGE); gchar *pivdata_name = g_strdup_printf ("%s/%s__%s%s" , tmp_dir, basename, username, GPIV_EXT_PIV); gchar *par_name = g_strdup_printf ("%s/%s__%s%s" , tmp_dir, basename, username, GPIV_EXT_PAR); /* * prints to message console bar */ g_snprintf (progress_string, GPIV_MAX_CHARS, "Interrogating image #%d using %s %d gpiv_rr", display_act->id, MPIRUN_CMD, gpiv_par->mpi_nodes); gnome_appbar_set_status (GNOME_APPBAR(gpiv->appbar), progress_string); /* gtk_progress_set_value (GTK_PULSE? (gnome_appbar_get_progress */ /* (GNOME_APPBAR (gpiv->appbar))), */ /* progress_value); */ if (gpiv_par->verbose) g_message ("exec_piv_mpi: image name = %s, piv name = %s", image_name, pivdata_name); if ((fp = fopen (image_name, "wb")) == NULL) { error_gpiv ("exec_piv_mpi: failing fopen %s\n probably user directory under %s does not exist", tmp_dir, image_name); } gpiv_write_png_image (fp, image, FALSE); fclose (fp); /* * Run MPI-paralellised gpiv_rr */ command = g_strdup_printf ("%s %d gpiv_rr -p \ --cf %d --cl %d --cp %d \ --rf %d --rl %d --rp %d \ --ia_size_i %d --ia_size_f %d \ --ia_shift %d --ischeme %d \ --ifit %d --peak %d \ --val_r %d --val_s %d --val_t %f", MPIRUN_CMD, gpiv_par->mpi_nodes, piv_par->col_start, piv_par->col_end, piv_par->pre_shift_col, piv_par->row_start, piv_par->row_end, piv_par->pre_shift_row, piv_par->int_size_i, piv_par->int_size_f, piv_par->int_shift, piv_par->int_scheme, piv_par->ifit, piv_par->peak, valid_par->residu_type, valid_par->subst_type, valid_par->residu_max); if (piv_par->spof_filter) { command = g_strconcat (command, " --spof", NULL); } if (gpiv_par->verbose) { command = g_strconcat (command, " -p", NULL); } command = g_strconcat (command, " ", image_name, NULL); if (gpiv_par->verbose) g_message ("exec_piv_mpi: command = %s", command); if (system (command) != 0) { error_gpiv ("exec_piv_mpi: could not exec shell command:\n %s", command); } g_free (command); /* * Obtain PIV-data from tmp/ */ pd = gpiv_fread_pivdata(pivdata_name); /* * Cleanup image and data from tmp/ */ command = g_strdup_printf ("rm %s %s %s", image_name, pivdata_name, par_name); if (system (command) != 0) { error_gpiv ("exec_piv_mpi: could not exec shell command:\n %s", command); } g_free (command); g_free (image_name); g_free (pivdata_name); g_free (par_name); return pd; } #endif /* ENABLE_MPI */ gpiv-0.6.1/src/piveval_interrogate.h0000644000175000017500000000272711110306521014413 00000000000000/*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * $Log: piveval_interrogate.h,v $ * Revision 1.1 2008-09-16 10:17:36 gerber * added piveval_interrogate routines * */ #ifndef GPIV_PIVEVAL_INTERROGATE_H #define GPIV_PIVEVAL_INTERROGATE_H void exec_piv (GpivConsole *gpiv ); GpivPivData * interrogate_img (const GpivImage *image, const GpivPivPar *piv_par, const GpivValidPar *valid_par, GpivConsole *gpiv ); #endif /* GPIV_PIVEVAL_INTERROGATE_H */ gpiv-0.6.1/src/utils.c0000644000175000017500000012055711171605457011520 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * utility functions for gpiv * $Log: utils.c,v $ * Revision 1.22 2008-04-28 12:00:58 gerber * hdf-formatted files are now with .hdf extension (previously: .gpi) * * Revision 1.21 2007-12-19 08:42:35 gerber * debugged * * Revision 1.20 2007-11-23 16:24:08 gerber * release 0.5.0: Kafka * * Revision 1.19 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.18 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.17 2007-01-29 11:27:44 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.16 2006-09-18 07:27:06 gerber * *** empty log message *** * * Revision 1.15 2006/01/29 15:36:56 gerber * repaired a few annoying bugs * * Revision 1.13 2005/03/03 16:21:09 gerber * version number * * Revision 1.12 2005/02/26 09:43:31 gerber * parameter flags (parameter_logic) defined as gboolean * * Revision 1.11 2005/02/26 09:17:14 gerber * structured of interrogate function by using gpiv_piv_isiadapt * * Revision 1.10 2005/01/19 15:53:43 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.9 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.8 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.7 2003/09/04 13:31:55 gerber * init of printing (unfinished) * * Revision 1.6 2003/09/01 11:17:15 gerber * improved monitoring of interrogation process * * Revision 1.5 2003/08/22 15:24:53 gerber * interactive spatial scaling * * Revision 1.4 2003/07/31 11:43:26 gerber * display images in gnome canvas (HOERAreset) * * Revision 1.3 2003/07/25 15:40:24 gerber * removed/disabled setting of correlation in Eval tab, Correlation type in Image info tab * * Revision 1.2 2003/06/27 13:47:26 gerber * display ruler, line/point evaluation * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #include "gpiv_gui.h" #include "utils.h" #include "display.h" #include "dialog_interface.h" #include "console_interface.h" #ifdef ENABLE_DAC #include "dac_interface.h" #endif void update_imgh_entries (GpivConsole *gpiv, GpivImagePar *image_par ) /*----------------------------------------------------------------------------- * DESCRIPTION: * Refreshes image header entries and labels (when a different buffer is * selected) * * PROTOTYPE LOCATATION: * gpiv_img.h * * INPUTS: * gpiv: console structure * image_par: image parameters * * OUTPUTS: *---------------------------------------------------------------------------*/ { gchar label[GPIV_MAX_CHARS]; gchar *tmp_name, *text_uri; GnomeVFSURI* uri = NULL; if (display_act != NULL) { g_snprintf (label, GPIV_MAX_CHARS,"%d", display_act->id); gtk_label_set_text (GTK_LABEL (gpiv->imgh->label_bufno), (char *) label); text_uri = gnome_vfs_make_uri_from_input ((const gchar *) display_act->file_uri_name); if ((uri = gnome_vfs_uri_new (text_uri)) == NULL) return; g_free (text_uri); if (gnome_vfs_uri_is_local (uri)) { gtk_label_set_text (GTK_LABEL (gpiv->imgh->label_label_name), "file: "); } else { gtk_label_set_text (GTK_LABEL (gpiv->imgh->label_label_name), "uri: "); } gtk_label_set_text (GTK_LABEL (gpiv->imgh->label_name), display_act->file_uri_name); g_snprintf (label, GPIV_MAX_CHARS, "%d", display_act->img->image->header->ncolumns); gtk_label_set_text (GTK_LABEL (gpiv->imgh->label_ncols), (char *) label); g_snprintf (label, GPIV_MAX_CHARS, "%d", display_act->img->image->header->nrows); gtk_label_set_text (GTK_LABEL (gpiv->imgh->label_nrows), (char *) label); } gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_imgtitle), image_par->title); gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->imgh->spinbutton_colpos), image_par->z_off_x); gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->imgh->spinbutton_rowpos), image_par->z_off_y); gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->imgh->spinbutton_sscale), image_par->s_scale); gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->imgh->spinbutton_tscale), image_par->t_scale); gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_crdate), image_par->creation_date); gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_location), image_par->location); gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_author), image_par->author); gtk_entry_set_text (GTK_ENTRY(gpiv->imgh->entry_software), image_par->software); gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_source), image_par->source); gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_usertext), image_par->usertext); gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_warning), image_par->warning); gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_disclaimer), image_par->disclaimer); gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_comment), image_par->comment); gtk_entry_set_text (GTK_ENTRY(gpiv->imgh->entry_copyright), image_par->copyright); gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_email), image_par->email); gtk_entry_set_text (GTK_ENTRY (gpiv->imgh->entry_url), image_par->url); } void update_eval_entries (GpivConsole *gpiv, GpivImagePar *image_par ) /*----------------------------------------------------------------------------- * DESCRIPTION: * Refreshes spinners of col/row start/ end/ shift for image size * (when a different buffer is selected) * * PROTOTYPE LOCATATION: * gpiv_img.h * * INPUTS: * gpiv: console structure * image_par: image parameters * * OUTPUTS: *---------------------------------------------------------------------------*/ { if (display_act != NULL) { gtk_spin_button_set_range (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_colstart), 0.0, image_par->ncolumns - 1); gtk_spin_button_set_range (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_colend), 0.0, image_par->ncolumns - 1); gtk_spin_button_set_range (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_preshiftcol), 0.0 - (image_par->ncolumns - 1), image_par->ncolumns - 1); gtk_spin_button_set_range (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_rowstart), 0.0, image_par->nrows - 1); gtk_spin_button_set_range (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_rowend), 0.0, display_act->img->image->header->nrows - 1); gtk_spin_button_set_range (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_preshiftrow), 0.0 - (image_par->nrows - 1), image_par->nrows - 1); /* * Adjust spinbutton values if they are invalid * Columns */ if (gl_piv_par->col_start > image_par->ncolumns - 1) { gl_piv_par->col_start = image_par->ncolumns - 1; gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_colstart), gl_piv_par->col_start); } if (gl_piv_par->col_end > image_par->ncolumns - 1) { gl_piv_par->col_end = image_par->ncolumns - 1; gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_colend), gl_piv_par->col_end); } if (gl_piv_par->pre_shift_col > image_par->ncolumns - 1) { gl_piv_par->pre_shift_col = image_par->ncolumns - 1; gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_preshiftcol), gl_piv_par->pre_shift_col); } if (gl_piv_par->pre_shift_col < (0.0 - (image_par->ncolumns - 1))) { gl_piv_par->pre_shift_col = - (image_par->ncolumns - 1); gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_preshiftcol), gl_piv_par->pre_shift_col); } /* * Rows */ if (gl_piv_par->row_start > image_par->nrows - 1) { gl_piv_par->row_start = image_par->nrows - 1; gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_rowstart), gl_piv_par->row_start); } if (gl_piv_par->row_end > image_par->nrows - 1) { gl_piv_par->row_end = image_par->nrows - 1; gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_rowend), gl_piv_par->row_end); } if (gl_piv_par->pre_shift_row > image_par->nrows - 1) { gl_piv_par->pre_shift_row = image_par->nrows - 1; gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_preshiftrow), gl_piv_par->pre_shift_row); } if (gl_piv_par->pre_shift_row < (0.0 - (image_par->nrows - 1))) { gl_piv_par->pre_shift_row = - (image_par->nrows - 1); gtk_spin_button_set_value (GTK_SPIN_BUTTON (gpiv->piveval->spinbutton_preshiftrow), gl_piv_par->pre_shift_row); } } } gchar * month_name (GDateMonth month) /*-------------------------------------------------------------------- * returns the month name */ { gchar *name = NULL; if (month == G_DATE_JANUARY) { name = g_strdup ( _("January")); } else if (month == G_DATE_FEBRUARY) { name = g_strdup ( _("February")); } else if (month == G_DATE_MARCH) { name = g_strdup ( _("March")); } else if (month == G_DATE_APRIL) { name = g_strdup ( _("April")); } else if (month == G_DATE_MAY) { name = g_strdup ( _("May")); } else if (month == G_DATE_JUNE) { name = g_strdup ( _("June")); } else if (month == G_DATE_JULY) { name = g_strdup ( _("July")); } else if (month == G_DATE_AUGUST) { name = g_strdup ( _("August")); } else if (month == G_DATE_SEPTEMBER) { name = g_strdup ( _("September")); } else if (month == G_DATE_OCTOBER) { name = g_strdup ( _("October")); } else if (month == G_DATE_NOVEMBER) { name = g_strdup ( _("November")); } else if (month == G_DATE_DECEMBER) { name = g_strdup ( _("December")); } else if (month == G_DATE_BAD_MONTH) { name = g_strdup ( _("Bad month")); } else { name = g_strdup ( _("month_name: Unvalid month")); } return name; } void free_all_mems (void) /*-------------------------------------------------------------------- * Frees all allocated memory data from the application */ { gint i = 0; for (i = 1; i < gpiv_var->number_fnames_last; i++) { g_free (gpiv_var->fn_last[i]); } } void push_list_lastfnames (gchar *fname ) /*-------------------------------------------------------------------- * Pushes fname on gpiv_var fn_last[0] * Eventually removes fn_last[MAX_LIST] */ { gchar fname_nr[GPIV_MAX_CHARS]; gint i; gnome_config_push_prefix ("/gpiv/RuntimeVariables/"); if (gpiv_var->number_fnames_last < MAX_LIST) { gpiv_var->number_fnames_last++; gnome_config_set_int ("number_fnames_last", gpiv_var->number_fnames_last); } for (i = gpiv_var->number_fnames_last - 1; i > 0; i--) { gpiv_var->fn_last[i] = g_strdup (gpiv_var->fn_last[i - 1]); } gpiv_var->fn_last[0] = g_strdup (fname); for (i = 0; i < gpiv_var->number_fnames_last; i++) { g_snprintf (fname_nr, GPIV_MAX_CHARS,"fname_last_%d", i); gnome_config_set_string (fname_nr, gpiv_var->fn_last[i]); } if (gpiv_par->verbose) g_message ("push_list_lastfnames: fn_last[0]=%s", gpiv_var->fn_last[0]); gnome_config_pop_prefix (); gnome_config_sync (); } guint get_row_from_id (GpivConsole *gpiv, Display *disp ) /*----------------------------------------------------------------------------- * Searches the row of buffer clist that belongs to deplay identity. */ { guint i, row; Display *display_loc = NULL; for (i = 0; i < nbufs; i++) { display_loc = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), i); if (disp->id == display_loc->id) row = i; } return row; } void point_to_existbuffer (GpivConsole *gpiv ) /*----------------------------------------------------------------------------- * Point display_act to first existing buffer */ { guint i; if (nbufs > 0) { display_act = gtk_clist_get_row_data (GTK_CLIST (gpiv->clist_buf), 0); gtk_clist_select_row (GTK_CLIST (gpiv->clist_buf), 0, 0); } } void close_buffer__check_saved (GpivConsole *gpiv, Display *disp ) /*----------------------------------------------------------------------------- * closes buffer, checks if (modified) image and data have been saved. * If unsaved, close_buffer_dialog will direct to on_close_buffer_response, * found in dialog.c. */ { char message[2 * GPIV_MAX_CHARS]; GtkDialog *close_buffer_dialog; guint row = get_row_from_id (gpiv, disp); if (disp == NULL) return; #ifdef DEBUG g_message ("close_buffer__check_saved:: id = %d saved_img = %d", disp->id, display_act->img->saved_img); #endif if (!disp->img->saved_img || !disp->pida->saved_piv || !disp->pida->saved_histo || !disp->pida->saved_vor || !disp->pida->saved_nstrain || !disp->pida->saved_sstrain) { /* * Data not stored, deleting buffer only after permission */ g_snprintf (message, 2 * GPIV_MAX_CHARS, _("There are unsaved data that will be lost.\n\ Are you sure you want to close buffer #%d ?"), disp->id); close_buffer_dialog = create_close_buffer_dialog (gpiv, disp, message); gtk_widget_show (GTK_WIDGET (close_buffer_dialog)); } else { /* * No modified / new data or already stored, deleting buffer unconditionally */ close_buffer (gpiv, disp); } } void close_buffer (GpivConsole *gpiv, Display *disp ) /*----------------------------------------------------------------------------- * closes all data of a display and cleans up clist of buffer */ { guint row = get_row_from_id (gpiv, disp); free_all_bufmems (disp); g_free (disp->file_uri_name); gtk_widget_destroy (GTK_WIDGET (disp->mwin)); disp = NULL; /* * Cleaning up clist */ gtk_clist_remove (GTK_CLIST (gpiv->clist_buf), row); nbufs--; /* * Point display to an existing buffer */ if (nbufs == 0) { update_imgh_entries (gpiv, gl_image_par); } else { point_to_existbuffer (gpiv); } } gfloat image_mean (guint16 **img, gint ncols, gint nrows) /*----------------------------------------------------------------------------- */ { int i, j, ncount = ncols * nrows; float img_sum = 0.0, mean = 0.0; for (i = 0; i < nrows; i++) { for (j = 0; j < ncols; j++) { img_sum += (float) img[i][j]; } } mean = img_sum / (float) ncount; return mean; } GnomeCanvasItem **alloc_gci_matrix (long nr, long nc ) /*----------------------------------------------------------------------------- * Allocates 2-dimensional array for GnomeCanvasItem */ { long i; GnomeCanvasItem **item; /* * allocate pointers to rows */ item = (GnomeCanvasItem **) g_malloc ((size_t) ((nr - 1) * sizeof (GnomeCanvasItem*))); if (!item) gpiv_error ("%s: allocation failure 1 in g_malloc()", "alloc_gci_matrix"); item += 1; /* * allocate rows and set pointers to them */ item[0] = (GnomeCanvasItem *) g_malloc ((size_t) ((nr * nc - 1) * sizeof (GnomeCanvasItem))); if (!item[0]) gpiv_error ("%s: allocation failure 2 in g_malloc()", "alloc_gci_matrix"); item[0] += 1; for (i = 1; i <= nr; i++) item[i] = item[i-1] + 1; /* * return pointer to array of pointers to rows */ return item; } void free_gci_matrix (GnomeCanvasItem **item, long nr, long nc ) /*----------------------------------------------------------------------------- * Frees 2-dimensional array for GnomeCanvasItem */ { assert (item[0] != NULL); free ((char*) (item[0] - 1)); free ((char*) (item - 1)); } void free_all_bufmems (Display * disp) /*----------------------------------------------------------------------------- * Frees all dynamic memory of Buffer structure */ { if (disp != NULL) { free_img_bufmems (disp); free_eval_bufmems (disp); free_valid_bufmems (disp); free_post_bufmems (disp); } } void free_img_bufmems (Display * disp) /*----------------------------------------------------------------------------- * Frees all dynamic memory of Buffer structure of img */ { /* char *foo = '\0'; */ /* g_snprintf (disp->file_uri_name, GPIV_MAX_CHARS, ""); */ if (disp != NULL) { if (disp->img->exist_img) { gdk_pixbuf_unref (disp->img->pixbuf1); if (disp->img->rgbbuf_img1 != NULL) { g_free (disp->img->rgbbuf_img1); disp->img->rgbbuf_img1 = NULL; } gdk_pixbuf_unref (disp->img->pixbuf2); if (disp->img->rgbbuf_img2 != NULL) { g_free (disp->img->rgbbuf_img2); disp->img->rgbbuf_img2 = NULL; } gpiv_free_img (disp->img->image); destroy_img (disp); disp->img->exist_img = FALSE; } /* destroy_background (disp); */ destroy_background(display_act->gci_bg); if (disp->intreg->exist_int) { destroy_all_intregs (disp); disp->intreg->exist_int = FALSE; } } } void free_eval_bufmems (Display * disp) /*----------------------------------------------------------------------------- * Frees all dynamic memory of Buffer structure of evaluation processing */ { if (disp != NULL) { if (disp->pida->exist_piv) { destroy_all_vectors (disp->pida); gpiv_free_pivdata (disp->pida->piv_data); disp->pida->exist_piv = FALSE; } if (disp->pida->scaled_piv) { gpiv_free_pivdata (disp->pida->piv_data_scaled); disp->pida->scaled_piv = FALSE; } disp->pida->averaged_piv = FALSE; } } void free_valid_bufmems (Display * disp) /*----------------------------------------------------------------------------- * Frees all dynamic memory of Buffer structure of validation processing */ { if (disp != NULL) { if (disp->pida->exist_histo) { gpiv_free_bindata (disp->pida->klass); disp->pida->exist_valid = FALSE; } } } void free_post_bufmems (Display * disp ) /*----------------------------------------------------------------------------- * Frees all dynamic memory of Buffer structure of post processing */ { if (disp != NULL) { if (disp->pida->exist_vor) { destroy_all_scalars (disp, GPIV_VORTICITY); gpiv_free_scdata (disp->pida->vor_data); disp->pida->exist_vor = FALSE; disp->pida->post_par->diff_type__set = FALSE; disp->pida->post_par->operator_vorstra__set = FALSE; } if (disp->pida->exist_vor_scaled) { gpiv_free_scdata (disp->pida->vor_data_scaled); disp->pida->exist_vor_scaled = FALSE; } if (disp->pida->exist_sstrain) { destroy_all_scalars (disp, GPIV_S_STRAIN); gpiv_free_scdata (disp->pida->sstrain_data); disp->pida->exist_sstrain = FALSE; disp->pida->post_par->diff_type__set = FALSE; disp->pida->post_par->operator_vorstra__set = FALSE; } if (disp->pida->exist_sstrain_scaled) { gpiv_free_scdata (disp->pida->sstrain_data_scaled); disp->pida->exist_sstrain_scaled = FALSE; } if (disp->pida->exist_nstrain) { destroy_all_scalars (disp, GPIV_N_STRAIN); gpiv_free_scdata (disp->pida->nstrain_data); disp->pida->exist_nstrain = FALSE; disp->pida->post_par->diff_type__set = FALSE; disp->pida->post_par->operator_vorstra__set = FALSE; } if (disp->pida->exist_nstrain_scaled) { gpiv_free_scdata (disp->pida->nstrain_data_scaled); disp->pida->exist_nstrain_scaled = FALSE; } } } /* * gtk routines */ void on_widget_leave (GtkContainer * container, GtkDirectionType direction, gpointer user_data ) /*----------------------------------------------------------------------------- * Resets text in application bar to default after poiner leaves * container object */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (container), "gpiv"); gnome_appbar_push (GNOME_APPBAR (gpiv->appbar), msg_default); } void sensitive (GpivConsole *gpiv, enum WidgetSet wi_set, gboolean sense) /*----------------------------------------------------------------------------- * Changes the sensitivity of a set of witgets */ { #ifdef ENABLE_CAM Dac *dac = gpiv->dac; Cam *cam = dac->cam; Trig *trig = dac->trig; #else #ifdef ENABLE_TRIG Dac *dac = gpiv->dac; Trig *trig = dac->trig; #endif /* ENABLE_TRIG */ #endif /* ENABLE_CAM */ /* * Setting sensitivity of Dac witgets */ #ifdef ENABLE_DAC if (wi_set == DAC) { gtk_widget_set_sensitive (gpiv->tablabel_dac, sense); gtk_widget_set_sensitive (gpiv->dac->label_title, sense); gtk_widget_set_sensitive (gpiv->dac->label_fname, sense); gtk_widget_set_sensitive (gpiv->dac->entry_fname, sense); } #endif /* DAC */ #ifdef ENABLE_TRIG if (wi_set == DAC_TRIG) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gpiv->button_toolbar_trig), gpiv_par->process__trig); gtk_widget_set_sensitive (gpiv->button_toolbar_trig, sense); gtk_widget_set_sensitive (trig->frame_trigger, sense); gtk_widget_set_sensitive (trig->radiobutton_mouse_3, sense); gtk_widget_set_sensitive (trig->radiobutton_mouse_4, sense); gtk_widget_set_sensitive (trig->radiobutton_mouse_5, sense); gtk_widget_set_sensitive (trig->radiobutton_mouse_6, sense); gtk_widget_set_sensitive (trig->label_trigger_dt, sense); gtk_widget_set_sensitive (trig->spinbutton_trigger_dt, sense); gtk_widget_set_sensitive (trig->label_trigger_incrdt, sense); gtk_widget_set_sensitive (trig->spinbutton_trigger_incrdt, sense); gtk_widget_set_sensitive (trig->label_trigger_cap, sense); gtk_widget_set_sensitive (trig->spinbutton_trigger_cap, sense); gtk_widget_set_sensitive (trig->button_trigger_start, sense); gtk_widget_set_sensitive (trig->button_trigger_stop, sense); } #endif /* ENABLE_TRIG */ #ifdef ENABLE_CAM if (wi_set == DAC_TIMING) { gtk_widget_set_sensitive (trig->frame_trigger, sense); gtk_widget_set_sensitive (trig->radiobutton_mouse_1, sense); gtk_widget_set_sensitive (trig->radiobutton_mouse_2, sense); gtk_widget_set_sensitive (trig->label_trigger_nf, sense); gtk_widget_set_sensitive (trig->spinbutton_trigger_nf, sense); } #else #ifdef ENABLE_TRIG if (wi_set == DAC_TIMING) { gtk_widget_set_sensitive (trig->frame_trigger, sense); gtk_widget_set_sensitive (trig->radiobutton_mouse_1, sense); gtk_widget_set_sensitive (trig->radiobutton_mouse_2, sense); gtk_widget_set_sensitive (trig->label_trigger_nf, sense); gtk_widget_set_sensitive (trig->spinbutton_trigger_nf, sense); } #endif /* ENABLE_TRIG */ #endif /* ENABLE_CAM */ #ifdef ENABLE_CAM if (wi_set == DAC_CAM) { gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (gpiv->button_toolbar_cam), gpiv_par->process__cam); gtk_widget_set_sensitive (gpiv->button_toolbar_cam, sense); gtk_widget_set_sensitive (cam->frame_cam, sense); gtk_widget_set_sensitive (cam->camera_select, sense); gtk_widget_set_sensitive (cam->camera_select_menu, sense); gtk_widget_set_sensitive (cam->menu_item, sense); gtk_widget_set_sensitive (cam->label_temp, sense); gtk_widget_set_sensitive (cam->label_label_temp, sense); gtk_widget_set_sensitive (cam->button_cam_start, sense); gtk_widget_set_sensitive (cam->button_cam_stop, sense); } #endif /* ENABLE_CAM */ /* * Setting sensitivity of Image witgets */ if (wi_set == IMG) { /* gtk_widget_set_sensitive (gpiv->imgh->label_name, sense); */ /* gtk_widget_set_sensitive (gpiv->imgh->entry_name, sense); */ /* gtk_widget_set_sensitive (gpiv->imgh->spinbutton_ncols, sense); */ gtk_widget_set_sensitive (gpiv->imgh->label_colpos, sense); gtk_widget_set_sensitive (gpiv->imgh->label_sscale, sense); gtk_widget_set_sensitive (gpiv->imgh->label_ncols, sense); gtk_widget_set_sensitive (gpiv->imgh->label_nrows, sense); gtk_widget_set_sensitive (gpiv->imgh->label_depth, sense); gtk_widget_set_sensitive (gpiv->imgh->label_rowpos, sense); gtk_widget_set_sensitive (gpiv->imgh->label_tscale, sense); gtk_widget_set_sensitive (gpiv->imgh->label_imgtitle, sense); gtk_widget_set_sensitive (gpiv->imgh->label_crdate, sense); gtk_widget_set_sensitive (gpiv->imgh->label_location, sense); gtk_widget_set_sensitive (gpiv->imgh->label_author, sense); gtk_widget_set_sensitive (gpiv->imgh->label_software, sense); gtk_widget_set_sensitive (gpiv->imgh->label_source, sense); gtk_widget_set_sensitive (gpiv->imgh->label_usertext, sense); gtk_widget_set_sensitive (gpiv->imgh->label_warning, sense); gtk_widget_set_sensitive (gpiv->imgh->label_disclaimer, sense); gtk_widget_set_sensitive (gpiv->imgh->label_comment, sense); gtk_widget_set_sensitive (gpiv->imgh->label_copyright, sense); gtk_widget_set_sensitive (gpiv->imgh->label_email, sense); gtk_widget_set_sensitive (gpiv->imgh->label_url, sense); gtk_widget_set_sensitive (gpiv->imgh->spinbutton_colpos, sense); gtk_widget_set_sensitive (gpiv->imgh->spinbutton_sscale, sense); gtk_widget_set_sensitive (gpiv->imgh->spinbutton_rowpos, sense); gtk_widget_set_sensitive (gpiv->imgh->spinbutton_tscale, sense); gtk_widget_set_sensitive (gpiv->imgh->entry_imgtitle, sense); gtk_widget_set_sensitive (gpiv->imgh->entry_crdate, sense); gtk_widget_set_sensitive (gpiv->imgh->entry_location, sense); gtk_widget_set_sensitive (gpiv->imgh->entry_author, sense); gtk_widget_set_sensitive (gpiv->imgh->entry_software, sense); gtk_widget_set_sensitive (gpiv->imgh->entry_source, sense); gtk_widget_set_sensitive (gpiv->imgh->entry_usertext, sense); gtk_widget_set_sensitive (gpiv->imgh->entry_warning, sense); gtk_widget_set_sensitive (gpiv->imgh->entry_disclaimer, sense); gtk_widget_set_sensitive (gpiv->imgh->entry_comment, sense); gtk_widget_set_sensitive (gpiv->imgh->entry_copyright, sense); gtk_widget_set_sensitive (gpiv->imgh->entry_email, sense); gtk_widget_set_sensitive (gpiv->imgh->entry_url, sense); } /* * Setting sensitivity of Image Processing witgets */ if (wi_set == IMGPROC) { } /* * Setting sensitivity of PIV witgets */ if (wi_set == EVAL) { gtk_widget_set_sensitive (gpiv->piveval->spinbutton_colstart, sense); gtk_widget_set_sensitive (gpiv->piveval->spinbutton_colend, sense); gtk_widget_set_sensitive (gpiv->piveval->spinbutton_preshiftcol, sense); gtk_widget_set_sensitive (gpiv->piveval->spinbutton_rowstart, sense); gtk_widget_set_sensitive (gpiv->piveval->spinbutton_rowend, sense); gtk_widget_set_sensitive (gpiv->piveval->spinbutton_preshiftrow, sense); /* gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_f_1, sense); */ gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_f_2, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_f_3, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_f_4, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_f_5, sense); /* gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_i_1, sense); */ gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_i_2, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_i_3, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_i_4, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intsize_i_5, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intshift_1, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intshift_2, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intshift_3, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intshift_4, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_intshift_5, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_fit_none, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_fit_gauss, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_fit_power, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_fit_gravity, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_mouse_1, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_mouse_2, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_mouse_3, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_mouse_4, sense); gtk_widget_set_sensitive (gpiv->piveval->checkbutton_monitor, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_peak_1, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_peak_2, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_peak_3, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_weightkernel, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_zerooff, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_centraldiff, sense); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_cross_1, FALSE); gtk_widget_set_sensitive (gpiv->piveval->radiobutton_cross_2, FALSE); gtk_widget_set_sensitive (gpiv->piveval->button, sense); } /* * Setting sensitivity of a slection of PIV witgets */ if (wi_set == INTREGS) { /* if (piv_par->int_size_f >= 16) { */ /* gtk_widget_set_sensitive (GTK_WIDGET */ /* (gpiv->piveval->radiobutton_intsize_i_1), sense); */ if (gl_piv_par->int_size_f >= 32) { gtk_widget_set_sensitive (GTK_WIDGET (gpiv->piveval->radiobutton_intsize_i_2), sense); if (gl_piv_par->int_size_f >= 64) { gtk_widget_set_sensitive (GTK_WIDGET (gpiv->piveval->radiobutton_intsize_i_3), sense); if (gl_piv_par->int_size_f >= 128) { gtk_widget_set_sensitive (GTK_WIDGET (gpiv->piveval->radiobutton_intsize_i_4), sense); } } } /* } */ } /* * Setting sensitivity of Validation witgets */ if (wi_set == VALID) { gtk_widget_set_sensitive (gpiv->pivvalid->radiobutton_errvec_residu_snr, sense); gtk_widget_set_sensitive (gpiv->pivvalid->radiobutton_errvec_residu_median, sense); gtk_widget_set_sensitive (gpiv->pivvalid->radiobutton_errvec_residu_normmedian, sense); gtk_widget_set_sensitive (gpiv->pivvalid->radiobutton_disable_1, sense); gtk_widget_set_sensitive (gpiv->pivvalid->label_errvec_res, sense); gtk_widget_set_sensitive (gpiv->pivvalid->spinbutton_errvec_res, sense); gtk_widget_set_sensitive (gpiv->pivvalid->checkbutton_errvec_disres, sense); gtk_widget_set_sensitive (gpiv->pivvalid->button_errvec_resstats, sense); gtk_widget_set_sensitive (gpiv->pivvalid->radiobutton_errvec_subst_1, sense); /* gtk_widget_set_sensitive (gpiv->pivvalid->radiobutton_errvec_subst_2, sense); */ gtk_widget_set_sensitive (gpiv->pivvalid->radiobutton_errvec_subst_3, sense); gtk_widget_set_sensitive (gpiv->pivvalid->button_errvec, sense); gtk_widget_set_sensitive (gpiv->pivvalid->spinbutton_histo_bins, sense); gtk_widget_set_sensitive (gpiv->pivvalid->button_peaklck, sense); gtk_widget_set_sensitive (gpiv->pivvalid->button_uhisto, sense); gtk_widget_set_sensitive (gpiv->pivvalid->button_vhisto, sense); } /* * Setting sensitivity of Post processing witgets */ if (wi_set == POST) { gtk_widget_set_sensitive (gpiv->pivpost->radiobutton_vorstra_output_1, sense); gtk_widget_set_sensitive (gpiv->pivpost->radiobutton_vorstra_output_2, sense); gtk_widget_set_sensitive (gpiv->pivpost->radiobutton_vorstra_output_3, sense); gtk_widget_set_sensitive (gpiv->pivpost->radiobutton_vorstra_diffscheme_1, sense); gtk_widget_set_sensitive (gpiv->pivpost->radiobutton_vorstra_diffscheme_2, sense); gtk_widget_set_sensitive (gpiv->pivpost->radiobutton_vorstra_diffscheme_3, sense); gtk_widget_set_sensitive (gpiv->pivpost->radiobutton_vorstra_diffscheme_4, sense); gtk_widget_set_sensitive (gpiv->pivpost->button_vorstra, sense); } } gint on_my_popup_handler (GtkWidget *widget, GdkEvent *event) /*----------------------------------------------------------------------------- * Callback function for pop-up menus */ { GtkMenu *menu; GdkEventButton *event_button; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_MENU (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); /* The "widget" is the menu that was supplied when * gtk_signal_connect_object was called. */ menu = GTK_MENU (widget); if (event->type == GDK_BUTTON_PRESS) { event_button = (GdkEventButton *) event; if (event_button->button == 3) { gtk_menu_popup (menu, NULL, NULL, NULL, NULL, event_button->button, event_button->time); return TRUE; } } return FALSE; } gchar * replace_home_dir_with_tilde (const gchar *uri) /*----------------------------------------------------------------------------- * I stole this from gedit * return value will have to be freed */ { gchar *tmp; gchar *home; g_return_val_if_fail (uri != NULL, NULL); /* Note that g_get_home_dir returns a const string */ tmp = (gchar *)g_get_home_dir (); if (tmp == NULL) return g_strdup (uri); home = g_filename_to_utf8 (tmp, -1, NULL, NULL, NULL); if (home == NULL) return g_strdup (uri); if (strcmp (uri, home) == 0) { g_free (home); return g_strdup ("~"); } tmp = home; home = g_strdup_printf ("%s/", tmp); g_free (tmp); if (g_str_has_prefix (uri, home)) { gchar *res; res = g_strdup_printf ("~/%s", uri + strlen (home)); g_free (home); return res; } g_free (home); return g_strdup (uri); } gchar * replace_tilde_with_home_dir (const gchar *uri) /*----------------------------------------------------------------------------- * And wrote this by myself :) (What a genius that guy) */ { gchar *tmp; gchar *home; gchar* home_name; g_return_val_if_fail (uri != NULL, NULL); if ((tmp =(gchar *)g_get_home_dir ()) == NULL) { return g_strdup (uri); } if ((home = g_filename_to_utf8 (tmp, -1, NULL, NULL, NULL)) == NULL) { g_free (tmp); return g_strdup (uri); } if (g_str_has_prefix (uri, "~/")) { home_name = g_strdup_printf ("%s/%s", home, uri + strlen ("~/")); } else { g_free (home); return g_strdup (uri); } g_free (home); return (home_name); } void destroy (GtkWidget * widget, gpointer data) /*----------------------------------------------------------------------------- * Destroys widget */ { gtk_widget_destroy (widget); } void message_gpiv (gchar * msg, ...) /*----------------------------------------------------------------------------- * Message box with warning */ { /* GtkWidget */ GtkDialog *gtk_message_wi; va_list args; char local_msg[3 * GPIV_MAX_CHARS]; va_start (args, msg); g_vsnprintf (local_msg, 3 * GPIV_MAX_CHARS, msg, args); gtk_message_wi = create_message_dialog (local_msg); gtk_widget_show (GTK_WIDGET (gtk_message_wi)); /* gtk_widget_show_all (gtk_message_wi); */ va_end (args); } void warning_gpiv (gchar * msg, ...) /*----------------------------------------------------------------------------- * Message box with warning */ { GtkDialog *gtk_warning_wi; va_list args; char lo_msg[3 * GPIV_MAX_CHARS]; va_start (args, msg); g_vsnprintf (lo_msg, 3 * GPIV_MAX_CHARS, msg, args); gtk_warning_wi = create_message_dialog (lo_msg); gtk_widget_show (GTK_WIDGET (gtk_warning_wi)); va_end (args); } void error_gpiv (gchar * msg, ...) /*----------------------------------------------------------------------------- * Message box with error */ { GtkDialog *gtk_error_wi; va_list args; char lo_msg[2 * GPIV_MAX_CHARS]; va_start (args, msg); g_vsnprintf (lo_msg, 2 * GPIV_MAX_CHARS, msg, args); gtk_error_wi = create_error_dialog (lo_msg); gtk_widget_show (GTK_WIDGET (gtk_error_wi)); va_end (args); } gpiv-0.6.1/src/utils.h0000644000175000017500000001110411110306322011466 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /* libgpiv - library for Particle Image Velocimetry Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of libgpiv. Libgpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * $Log: utils.h,v $ * Revision 1.13 2007-12-19 08:42:35 gerber * debugged * * Revision 1.12 2007-11-23 16:24:08 gerber * release 0.5.0: Kafka * * Revision 1.11 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.10 2007-01-29 11:27:44 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.9 2006/01/31 14:28:13 gerber * version 0.3.0 * * Revision 1.8 2005/01/19 15:53:43 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.7 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.6 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.5 2003/09/04 13:31:55 gerber * init of printing (unfinished) * * Revision 1.4 2003/09/01 11:17:15 gerber * improved monitoring of interrogation process * * Revision 1.3 2003/08/22 15:24:53 gerber * interactive spatial scaling * * Revision 1.2 2003/06/27 13:47:26 gerber * display ruler, line/point evaluation * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef UTILS_H #define UTILS_H void update_imgh_entries (GpivConsole *gpiv, GpivImagePar *image_par); void update_eval_entries (GpivConsole *gpiv, GpivImagePar *image_par); gchar * month_name(GDateMonth month); /*-------------------------------------------------------------------- * returns the month name */ void free_all_mems(void); void push_list_lastfnames(gchar *fname); guint get_row_from_id (GpivConsole *gpiv, Display *disp); void point_to_existbuffer (GpivConsole *gpiv); void close_buffer__check_saved (GpivConsole *gpiv, Display *disp); void close_buffer (GpivConsole *gpiv, Display *disp); gfloat image_mean (guint16 **img, gint ncols, gint nrows); /* * mem allocation functions */ /*-------------------------------------------------------------------- Allocates 2-dimensional array for GnomeCanvasItem */ GnomeCanvasItem **alloc_gci_matrix (long nr, long nc); /*-------------------------------------------------------------------- Frees 2-dimensional array for GnomeCanvasItem */ void free_gci_matrix (GnomeCanvasItem **item, long nr, long nc); void free_all_bufmems (Display *disp); void free_img_bufmems (Display *disp); void free_eval_bufmems (Display *disp); void free_valid_bufmems (Display *disp); void free_post_bufmems (Display *disp); /* * general gtk functions */ void on_widget_leave (GtkContainer *container, GtkDirectionType direction, gpointer user_data); void sensitive (GpivConsole *gpiv, enum WidgetSet wi_set, gboolean sense); gint on_my_popup_handler (GtkWidget *widget, GdkEvent *event); gchar * replace_home_dir_with_tilde (const gchar *uri); gchar * replace_tilde_with_home_dir (const gchar *uri); void destroy (GtkWidget *widget, gpointer data); void message_gpiv (gchar *msg, ...); void warning_gpiv (gchar *msg, ...); void error_gpiv (gchar *msg, ...); #endif /* UTILS_H */ gpiv-0.6.1/src/dac_cam.c0000644000175000017500000012120711115261512011704 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * functions for dac_cam * $Log: dac_cam.c,v $ * Revision 1.7 2008-04-28 12:00:57 gerber * hdf-formatted files are now with .hdf extension (previously: .gpi) * * Revision 1.6 2007-12-19 08:42:35 gerber * debugged * * Revision 1.5 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.4 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.3 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.2 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.1 2006-09-18 07:29:49 gerber * Split up of triggering and image recording (camera) * */ #ifdef ENABLE_CAM #include #include "gpiv_gui.h" #include "utils.h" #include "console.h" #include "dac_cam.h" #include "display.h" #include static struct tm *dac_time; static GDate *date; pthread_mutex_t mutex_rec = PTHREAD_MUTEX_INITIALIZER; typedef struct _ImgFrame ImgFrame; struct _ImgFrame { unsigned char **A; unsigned char **B; /* gint count; */ }; /* * Prototypes of local functions */ static void rec_frame(ImgFrame *img_frame ); static void thread_rec_frame(void *img_frame ); static void thread_rec_frame_serie(ImgFrame img_frame[GPIV_NIMG_MAX] ); static void add_buffer(GpivConsole *gpiv, gchar *fname_base, gint ibuf, unsigned char **frameA, unsigned char **frameB ); static void renew_buffer(GpivConsole *gpiv, gchar *fname_base, gint ibuf, unsigned char **frameA, unsigned char **frameB ); static void recreate_img(Display * disp, unsigned char **frameA, unsigned char **frameB ); static int open_dac_img(GpivCamVar *cam_var, unsigned char **frameA, unsigned char **frameB, Image * img, gboolean alloc_mem ); static void load_dac_buffer(GpivConsole *gpiv, GpivCamVar *cam_var, gboolean second_image, char *fname, int ibuf, unsigned char **frameA, unsigned char **frameB, enum ClistPut clist_put ); static void rec_and_display(GpivConsole *gpiv ); /* * Global functions */ void exec_cam_start(GpivConsole * gpiv ) /*----------------------------------------------------------------------------- */ { /* * dc1394 stuff */ /* quadlet_t value; */ cancel_process = FALSE; /* * report camera's feature set * in: on_menu_camera_select */ /* dc1394_print_feature_set(&cam_var->feature_set[0]); */ /* g_message("exec_cam_start:: mode[%d] = %s", */ /* cam_var->misc_info[0].mode, */ /* format0_desc[cam_var->misc_info[0].mode - MODE_FORMAT0_MIN]); */ /* g_message("exec_cam_start:: format[%d] = %s", */ /* cam_var->misc_info[0].format, */ /* format_desc[cam_var->misc_info[0].format - FORMAT_MIN]); */ if (verbose) g_warning("exec_cam_start:: fps = %d", cam_var->misc_info[0].framerate/* - FRAMERATE_MIN */); if (dc1394_setup_capture(cam_var->camera[0].handle, cam_var->camera[0].id, cam_var->misc_info[0].iso_channel, cam_var->misc_info[0].format, cam_var->misc_info[0].mode, cam_var->maxspeed, cam_var->misc_info[0].framerate, /* FRAMERATE_7_5, */ /* FRAMERATE_3_75, */ &cam_var->capture[0]) != DC1394_SUCCESS) { dc1394_release_camera(cam_var->handle, &cam_var->capture[0]); raw1394_destroy_handle(cam_var->handle); warning_gpiv(_("Unable to setup camera-\n\ check line %d of %s to make sure\n\ that the video mode,framerate and format are\n\ supported by your camera"), __LINE__,__FILE__); return; } /* * have the camera start sending us data */ if (dc1394_start_iso_transmission(cam_var->handle, cam_var->capture[0].node) != DC1394_SUCCESS) { dc1394_release_camera(cam_var->handle, &cam_var->capture[0]); raw1394_destroy_handle(cam_var->handle); warning_gpiv(_("Unable to start camera iso transmission")); return; } /* * let sending data for a while before grabbing and storing to stabilize * data transfer */ /* sleep(1); */ usleep(1000); /* * set trigger mode and use triggering or just free run */ if (gpiv_par->console__trigger_cam) { if (verbose) g_warning("exec_cam_start:: trigger_cam"); /* if (dc1394_set_trigger_mode(cam_var->handle, */ /* cam_var->capture[0].node, */ /* TRIGGER_MODE_0) != DC1394_SUCCESS) */ /* { */ /* warning_gpiv(_("unable to set camera trigger mode")); */ /* } */ /* exec_trigger_start(); */ rec_and_display(gpiv); /* exec_trigger_stop(); */ } else { if (verbose) g_warning("exec_cam_start:: !trigger_cam"); rec_and_display(gpiv); } /* pthread_exit(NULL); */ /* * Stop data transmission */ if (verbose) g_warning("exec_cam_start:: Stop data transmission and release camera"); if (dc1394_stop_iso_transmission(cam_var->handle, cam_var->capture[0].node) != DC1394_SUCCESS /* && dc1394_release_camera(cam_var->handle, &cam_var->capture[0]) */ /* != DC1394_SUCCESS */ ) { warning_gpiv(_("couldn't stop the camera?")); } /* in: exec_stop_cam dc1394_release_camera(cam_var->handle, &cam_var->capture[0]); */ /*in: exec_stop_cam: raw1394_destroy_handle(cam_var->handle); */ } void exec_cam_stop (void ) /*----------------------------------------------------------------------------- */ { gint i; cancel_process = TRUE; for (i = 0; i < cam_var->numCameras; i++) { if (dc1394_stop_iso_transmission(cam_var->handle, cam_var->capture[i].node) != DC1394_SUCCESS) { warning_gpiv(_("couldn't stop the camera?")); } pthread_exit(NULL); dc1394_release_camera(cam_var->handle, &cam_var->capture[0]); } if (cam_var->numCameras > 0) { raw1394_destroy_handle(cam_var->handle); } } /* * Callback functions */ void on_menu_camera_select (GtkWidget *widget, gpointer data) /* ---------------------------------------------------------------------------- */ { } void on_menu_format (GtkWidget *widget, gpointer data) /* ---------------------------------------------------------------------------- */ { GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gint mode = (int) data; gint format = 0; gint was_iso_on; /* change_mode_and_format(format, FORMAT_VGA_NONCOMPRESSED); */ /* IsoFlowCheck(state); */ if (verbose) g_message("on_menu_format:: "); if (!dc1394_get_iso_status(cam_var->camera[0].handle, cam_var->camera[0].id, &cam_var->misc_info[0].is_iso_on)) { g_warning("Cannot get ISO status"); } else { if (cam_var->misc_info[0].is_iso_on > 0) { cancel_process = TRUE; } } was_iso_on = cam_var->misc_info[0].is_iso_on; /* g_message("on_menu_format:: is_iso_on = %d", was_iso_on); */ if (mode >= MODE_FORMAT0_MIN && mode <= MODE_FORMAT0_MAX) { format = FORMAT_VGA_NONCOMPRESSED; /* g_message("on_menu_format:: mode[%d] = %s", */ /* mode, format0_desc[mode - MODE_FORMAT0_MIN]); */ /* g_message(":n_menu_format: format[%d] = %s", */ /* format, */ /* format_desc[format - FORMAT_MIN]); */ } else if (mode >= MODE_FORMAT1_MIN && mode <= MODE_FORMAT1_MAX) { format = FORMAT_SVGA_NONCOMPRESSED_1; } else if (mode >= MODE_FORMAT2_MIN && mode <= MODE_FORMAT2_MAX) { format = FORMAT_SVGA_NONCOMPRESSED_2; } else if (mode >= MODE_FORMAT6_MIN && mode <= MODE_FORMAT6_MAX) { format = FORMAT_STILL_IMAGE; } else if (mode >= MODE_FORMAT7_MIN && mode <= MODE_FORMAT7_MAX) { format = FORMAT_SCALABLE_IMAGE_SIZE; /* } else if (mode >= COLOR_FORMAT7_MIN && mode <= COLOR_FORMAT7_MAX) { */ /* format = FORMAT_SCALABLE_IMAGE_SIZE; */ } else { warning_gpiv(_("on_menu_format: non valid format")); } if (!dc1394_set_video_format(cam_var->camera[0].handle, cam_var->camera[0].id, format)) { if (verbose) g_warning("on_menu_format:: Could not set video format"); } else { cam_var->misc_info[0].format = format; } if (!dc1394_set_video_mode(cam_var->camera[0].handle, cam_var->camera[0].id, mode)) { if (verbose) g_warning("on_menu_format:: Could not set video format"); } else { cam_var->misc_info[0].mode = mode; } if (was_iso_on > 0) { exec_cam_start(gpiv); } /* BuildFpsMenu(); */ /* UpdateTriggerFrame(); */ /* IsoFlowResume(state); */ /* MODE_320x240_YUV422, */ /* MODE_640x480_YUV411, */ /* MODE_640x480_YUV422, */ /* MODE_640x480_RGB, */ /* MODE_640x480_MONO, */ /* MODE_640x480_MONO16 */ } void on_menu_fps (GtkWidget *widget, gpointer data) /* ---------------------------------------------------------------------------- */ { cam_var->misc_info[0].framerate = (int) data/* - FRAMERATE_MIN */; /* cam_var->misc_info[0].framerat */ if (verbose) g_warning("on_menu_fps:: fps = %d", cam_var->misc_info[0].framerate); } /* * BUGFIX: include in trigger callbacks? */ void on_trigger_polarity_toggled (GtkToggleButton *togglebutton, gpointer user_data) { /* ---------------------------------------------------------------------------- */ if (!dc1394_set_trigger_polarity(cam_var->camera[0].handle, cam_var->camera[0].id, togglebutton->active)) { message_gpiv(_("Cannot set trigger polarity")); } else { cam_var->feature_set[0].feature[FEATURE_TRIGGER-FEATURE_MIN]. trigger_polarity = (int) togglebutton->active; } } void on_trigger_external_toggled (GtkToggleButton *togglebutton, gpointer user_data) { /* ---------------------------------------------------------------------------- */ if (!dc1394_feature_on_off(cam_var->camera[0].handle, cam_var->camera[0].id, FEATURE_TRIGGER, togglebutton->active)) { message_gpiv(_("Cannot set external trigger source")); } else { cam_var->feature_set[0].feature[FEATURE_TRIGGER - FEATURE_MIN].is_on = togglebutton->active; } /* UpdateTriggerFrame(); */ } void on_trigger_mode_activate (GtkWidget *widget, gpointer user_data) /* ---------------------------------------------------------------------------- */ { if (!dc1394_set_trigger_mode(cam_var->camera[0].handle, cam_var->camera[0].id, (int) user_data)) { message_gpiv(_("Cannot set trigger mode")); } else { cam_var->feature_set[0].feature[FEATURE_TRIGGER-FEATURE_MIN]. trigger_mode = (int) user_data; } /* UpdateTriggerFrame(); */ } /* void */ /* on_trigger_value_changed (GtkAdjustment *adj, */ /* gpointer user_data) */ /* { */ /* if (!dc1394_set_feature_value(cam_var->camera[0].handle, cam_var->camera[0].id, */ /* FEATURE_TRIGGER, adj->value)) */ /* message_gpiv(_("Cannot set external trigger count")); */ /* else */ /* cam_var->feature_set[0].feature[FEATURE_TRIGGER-FEATURE_MIN].value = */ /* adj->value; */ /* } */ void on_checkbutton_camera_trigger_enter (GtkWidget *widget, gpointer data) /* ---------------------------------------------------------------------------- */ { GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gchar *msg = _("Enables triggering of the camera"); gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); } void on_checkbutton_camera_trigger (GtkWidget *widget, gpointer data) /* ---------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { gpiv_par->console__trigger_cam = TRUE; } else { gpiv_par->console__trigger_cam = FALSE; } } void on_man_auto_menu (GtkWidget *widget, gpointer data) /* ---------------------------------------------------------------------------- */ { GtkWidget *scale = gtk_object_get_data(GTK_OBJECT(widget), "scale"); int feature = (int) data; enum VariableType { MAN, AUTO } var_type; var_type = atoi(gtk_object_get_data(GTK_OBJECT(widget), "var_type")); if (!dc1394_auto_on_off(cam_var->camera[0].handle, cam_var->camera[0].id, feature, var_type)) { message_gpiv(_("on_man_auto_menu: Cannnot set auto / manual")); } if (var_type == MAN) { gtk_widget_set_sensitive (GTK_WIDGET(scale), TRUE); } else if (var_type == AUTO) { gtk_widget_set_sensitive (GTK_WIDGET(scale), FALSE); } } void on_scale_changed (GtkAdjustment *adj, gpointer user_data) /* ---------------------------------------------------------------------------- */ { switch((int)user_data) { case FEATURE_TEMPERATURE: if (!dc1394_set_temperature(cam_var->camera[0].handle, cam_var->camera[0].id, adj->value)) message_gpiv(_("on_scale_changed: Cannot set temperature")); else cam_var->feature_set[0].feature[FEATURE_TEMPERATURE-FEATURE_MIN]. value = adj->value; break; default: /* g_message("on_scale_changed:: feature = %d value = %f", */ /* (gint) user_data, adj->value); */ if (!dc1394_set_feature_value(cam_var->camera[0].handle, cam_var->camera[0].id, (gint) user_data, adj->value)) { message_gpiv(_("on_scale_changed: Cannot set feature")); } else { cam_var->feature_set[0].feature[(gint) user_data - FEATURE_MIN]. value = adj->value; } break; } } void on_button_dac_camstart_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gchar *msg = _("Records PIV images"); gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); } void on_button_dac_camstart (GtkWidget * widget, gpointer data ) /* ---------------------------------------------------------------------------- * The actual calculation of particle image displacements */ { GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); cancel_process = FALSE; /*in exec_cam_start: exec_trigger_start(); */ exec_cam_start(gpiv); } void on_button_dac_camstop_enter (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gchar *msg = _("Stops recording PIV images"); gnome_appbar_set_status(GNOME_APPBAR(gpiv->appbar), msg); } void on_button_dac_camstop (GtkWidget * widget, gpointer data ) /* ---------------------------------------------------------------------------- * The actual calculation of particle image displacements */ { cancel_process = TRUE; #ifdef ENABLE_TRIG exec_trigger_stop(); #endif exec_cam_stop(); } /* * Local functions */ static int open_dac_img(GpivCamVar *cam_var, unsigned char **frameA, unsigned char **frameB, Image * img, gboolean alloc_mem ) /*----------------------------------------------------------------------------- * Opens an image obtained from the camera (Counterpart of open_img from file) */ { gint i, j; gchar *month; /* * parameter initializing of image */ gpiv_img_parameters_set(img->image->header, FALSE); img->image->header->ncolumns = cam_var->capture[0].frame_width; img->image->header->nrows = cam_var->capture[0].frame_height; img->image->header->x_corr = gpiv_par->x_corr; img->image->header->ncolumns__set = TRUE; img->image->header->nrows__set = TRUE; img->image->header->x_corr__set = TRUE; gl_image_par = gpiv_img_cp_parameters (img->image->header); if (verbose) g_message("open_dac_img:: 1 creation_date = %s", img->image->header->creation_date); /* * Apply time and date to creation_date (buffer) parameter */ month = month_name(g_date_month(date)); g_snprintf(img->image->header->creation_date, GPIV_MAX_CHARS, "%d %s %d %d:%d:%d", g_date_day(date), month, g_date_year(date), dac_time->tm_hour, dac_time->tm_min, dac_time->tm_sec); g_free(month); /* if(alloc_mem) { */ img->img1 = gpiv_alloc_img(img->image_par); /* } */ for (i = 0; i < img->image->header->nrows ; i++) { for (j = 0; j < img->image->header->ncolumns; j++) { /* * format 640x480 = 1:1.3 */ img->img1[i][j/* + i/3 */] = (guint16) frameA[i][j]; } } if (gpiv_par->x_corr) { /* if(alloc_mem) { */ img->img2 = gpiv_alloc_img(img->image_par); /* } */ for (i = 0; i < img->image->header->nrows ; i++) { for (j = 0; j < img->image->header->ncolumns; j++) { /* * format 640x480 = 1:1.3 */ img->img2[i][j/* + i/3 */] = (guint16) frameB[i][j]; } } } else { img->img2 = img->img1; } img->exist_img = TRUE; img->saved_img = FALSE; return 0; } static void load_dac_buffer (GpivConsole *gpiv, GpivCamVar *cam_var, gboolean second_image, char *fname, int ibuf, unsigned char **frameA, unsigned char **frameB, enum ClistPut clist_put ) /*----------------------------------------------------------------------------- * create display and its (popup) menu, load image, piv data and puts * buffername into clist */ { gint return_val = 0; gchar *clist_buf_txt[MAX_BUFS][2], cl_int[4]; display[ibuf] = create_display(fname, ibuf, gpiv); display_act = display[ibuf]; gtk_widget_show(display_act->mwin); /* zoom_display(display_act, display_act->zoom_index); */ g_snprintf (display_act->file_uri_name, GPIV_MAX_CHARS, "%s", fname); if((return_val = open_dac_img (cam_var, frameA, frameB, display_act->img, FALSE)) != 0) { gtk_object_destroy (GTK_OBJECT(display[ibuf]->mwin)); if (ibuf > 0) { ibuf = nbufs - 1;; display_act = display[ibuf]; } else { display_act = NULL; } nbufs--; return; } /* * Pop-up menu after loading data */ display_act->display_popupmenu = create_display_popupmenu (display_act); gtk_widget_show (display_act->display_popupmenu); gtk_signal_connect_object (GTK_OBJECT(display_act->mwin), "button_press_event", GTK_SIGNAL_FUNC (on_my_popup_handler), GTK_OBJECT(display_act->display_popupmenu)); zoom_display (display_act, display_act->zoom_index); /* * Displaying */ create_background (display_act); create_img (display_act); if (display_act->img->exist_img ) { show_img1 (display_act); } else { hide_img1 (display_act); } if (gl_image_par->x_corr) { if (display_act->img->exist_img) { show_img2 (display_act); } else { hide_img2 (display_act); } } /* display_act->img.img_mean = image_mean(display_act->img.img1, */ /* gpiv_par->img_width, */ /* gpiv_par->img_height); */ if (gpiv_par->display__intregs == 1) { if (verbose) g_message("load_dac_buffer:: create_all_intregs"); create_all_intregs(display_act); } /* * Add buffer to list */ g_snprintf(cl_int, 4, "%d", ibuf); clist_buf_txt[ibuf][0] = (gchar *) cl_int; clist_buf_txt[ibuf][1] = fname; if (clist_put == PREPEND) { gtk_clist_prepend(GTK_CLIST(gpiv->clist_buf), clist_buf_txt[ibuf]); } else if (clist_put == INSERT) { gtk_clist_insert(GTK_CLIST(gpiv->clist_buf), ibuf, clist_buf_txt[ibuf]); } else if (clist_put == APPEND) { gtk_clist_append(GTK_CLIST(gpiv->clist_buf), clist_buf_txt[ibuf]); } else { error_gpiv("non-existent CLIST enumerate"); } gtk_clist_set_row_data(GTK_CLIST(gpiv->clist_buf), ibuf, display_act); /* * Copy general image parameters to the buffer parameters * and display in imgh tabulator */ /* gpiv_img_cp_parameters(gl_image_par, display_act->img.image_par); */ if (verbose) g_message ("load_dac_buffer:: ncolumns=%d nrows = %d", display_act->img->image->header->ncolumns, display_act->img->image->header->nrows); gtk_widget_set_size_request (display_act->canvas, (gint) (display_act->zoom_factor * display_act->img->image->header->ncolumns), (gint) (display_act->zoom_factor * display_act->img->image->header->nrows)); } static void rec_and_display (GpivConsole *gpiv /* , ImgFrame *img_frame */ ) /*----------------------------------------------------------------------------- */ { gint ibuf = 0; ImgFrame img_frame[GPIV_NIMG_MAX]; gint return_val = 0; pthread_t thread_rec; pthread_attr_t attr; gint mode, cycles, DURATION; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); /* * Select which parameters and constants to be used; from RTAI trigger * system (if enabled, this may be used) or from camera. If trigger has not * been enabled only from camera */ #ifdef ENABLE_TRIG if (gpiv_par->process_trig) { mode = gl_trig_par.ttime.mode; cycles = gl_trig_par.ttime.cycles; DURATION = GPIV_TIMER_MODE__DURATION; } else { mode = gl_cam_par->mode; cycles = gl_cam_par->cycles; DURATION = GPIV_CAM_MODE__DURATION; } #else /* ENABLE_TRIG */ mode = gl_cam_par->mode; cycles = gl_cam_par->cycles; DURATION = GPIV_CAM_MODE__DURATION; #endif /* ENABLE_TRIG */ /* * Closing existing buffer windows and cleaning up Clist * BUGFIX: windows remain open */ if (mode == DURATION) { for (ibuf = 0; ibuf < nbufs; ibuf++) { if (display[ibuf] != NULL) { close_buffer(gpiv, display[ibuf]); } } gtk_clist_clear(GTK_CLIST(gpiv->clist_buf)); nbufs = 0; /* * allocating image mem */ for (ibuf = 0; ibuf < cycles; ibuf++) { img_frame[ibuf].A = gpiv_ucmatrix(cam_var->capture[0].frame_height, cam_var->capture[0].frame_width); if (gpiv_par->x_corr) { img_frame[ibuf].B = gpiv_ucmatrix(cam_var->capture[0].frame_height, cam_var->capture[0].frame_width); } } /* * recording */ #define THREADING /* * use threading */ /* if (verbose) */ /* g_message("rec_and_display:: Creating thread_rec from %d", pthread_self ()); */ #ifdef THREADING if ((return_val = pthread_create (&thread_rec, &attr, (void *) &thread_rec_frame_serie, (void *) &img_frame)) == TRUE) { pthread_exit(NULL); g_error("return code from pthread_create() is %d\n", return_val); } pthread_join(thread_rec, NULL); if (verbose) g_message ("rec_and_display:: waited on thread_rec. Done"); /* * no threading used */ #else for (ibuf = 0; ibuf < cycles; ibuf++) { if (cancel_process) break; rec_frame(&img_frame[ibuf]); progress_value = (gfloat) (ibuf + 1.0) / (gfloat) cycles; g_snprintf(progress_string, GPIV_MAX_CHARS, "recording image #%d", ibuf); while (g_main_iteration(FALSE)); gtk_progress_set_value(gnome_appbar_get_progress (GNOME_APPBAR(gpiv->appbar)), progress_value * 100.0); gnome_appbar_push(GNOME_APPBAR(gpiv->appbar), progress_string); } #endif /* THREADING */ #undef THREADING /* * displaying and freeing image mem */ for (ibuf = 0; ibuf < cycles; ibuf++) { add_buffer(gpiv, gpiv_var->fn_last[0], ibuf, img_frame[ibuf].A, img_frame[ibuf].B); gpiv_free_ucmatrix(img_frame[ibuf].A); if (gpiv_par->x_corr) { gpiv_free_ucmatrix(img_frame[ibuf].B); } } /* * timing is indefinite periodic * display only and continuously images in buffer 0 */ } else { ibuf = 0; gtk_clist_select_row(GTK_CLIST(gpiv->clist_buf), ibuf, 0); if (verbose) g_message("rec_and_display:: INDEFINITE"); /* BUGFIX: for Gtk2 */ /* gtk_progress_bar_set_pulse_step (GNOME_APPBAR(gpiv->appbar), */ /* 0.1); */ img_frame[ibuf].A = gpiv_ucmatrix(cam_var->capture[0].frame_height, cam_var->capture[0].frame_width); if (gpiv_par->x_corr) { img_frame[ibuf].B = gpiv_ucmatrix(cam_var->capture[0].frame_height, cam_var->capture[0].frame_width); } while (!cancel_process) { rec_frame(&img_frame[ibuf]); while (g_main_iteration(FALSE)); renew_buffer(gpiv, gpiv_var->fn_last[0], ibuf, img_frame[ibuf].A, img_frame[ibuf].B); /* BUGFIX: for Gtk2 */ /* gtk_progress_bar_pulse ((GNOME_APPBAR(gpiv->appbar)) */ } gpiv_free_ucmatrix(img_frame[ibuf].A); if (gpiv_par->x_corr) { gpiv_free_ucmatrix(img_frame[ibuf].B); } } pthread_attr_destroy(&attr); } static void thread_rec_frame(void *img_frame) /*----------------------------------------------------------------------------- */ { ImgFrame *my_frame = NULL; unsigned char **frameA = my_frame->A; unsigned char **frameB = my_frame->B; if (verbose) g_warning("thread_rec_frame:: 0"); my_frame = (ImgFrame *) img_frame; /* unsigned char **frameA = gpiv_ucmatrix(cam_var->capture[0].frame_height, */ /* cam_var->capture[0].frame_width); */ if (verbose) g_message("thread_rec_frame:: 0.1"); /* * capture one frame */ if (dc1394_single_capture(cam_var->handle, &cam_var->capture[0]) != DC1394_SUCCESS) { dc1394_release_camera(cam_var->handle, &cam_var->capture[0]); raw1394_destroy_handle(cam_var->handle); warning_gpiv(_("unable to capture a frame")); /* return(); */ } else { if (verbose) g_message("thread_rec_frame:: 1"); /* * Copy buffer content to tmp buffer array * block data for thread */ pthread_mutex_lock(&mutex_rec); memcpy( frameA[0], (const char *) cam_var->capture[0].capture_buffer, sizeof(char) * cam_var->capture[0].frame_width * cam_var->capture[0].frame_height); pthread_mutex_unlock(&mutex_rec); if (verbose) g_message("thread_rec_frame:: 2"); } /* * Repeat if cross correlation; x_corr = TRUE */ if (gpiv_par->x_corr) { if (dc1394_single_capture(cam_var->handle, &cam_var->capture[0]) != DC1394_SUCCESS) { dc1394_release_camera(cam_var->handle, &cam_var->capture[0]); raw1394_destroy_handle(cam_var->handle); warning_gpiv(_("unable to capture a frame")); /* return(); */ } else { pthread_mutex_lock(&mutex_rec); memcpy( frameB[0], (const char *) cam_var->capture[0].capture_buffer, sizeof(char) * cam_var->capture[0].frame_width * cam_var->capture[0].frame_height); pthread_mutex_unlock(&mutex_rec); } } /* gpiv_free_ucmatrix(frameA); */ if (verbose) g_warning("thread_rec_frame:: 3/3"); pthread_exit(0); } static void thread_rec_frame_serie(ImgFrame img_frame[GPIV_NIMG_MAX] ) /*----------------------------------------------------------------------------- * capture a series of images */ { gint ibuf, cycles; #ifdef ENABLE_TRIG cycles = gl_trig_par.ttime.cycles; #else /* ENABLE_TRIG */ cycles = gl_cam_par->cycles; #endif /* ENABLE_TRIG */ /* g_message("thread_rec_frame_series:: 0 with id = %d", (int) pthread_self ()); */ for (ibuf = 0; ibuf < cycles; ibuf++) { if (cancel_process) break; /* BUGFIX: thread_rec_frame_serie calls rec_frame, NOT thread_ rec_frame; correct? rec_frame(&img_frame[ibuf]); } /* g_message("thread_rec_frame_series:: 1/1"); */ pthread_exit(NULL); } } static void rec_frame(ImgFrame *img_frame ) /*----------------------------------------------------------------------------- /* * capture a single image frame or frame pair */ { /* g_message("rec_frame:: 0"); */ if (dc1394_single_capture(cam_var->handle, &cam_var->capture[0]) != DC1394_SUCCESS) { dc1394_release_camera(cam_var->handle, &cam_var->capture[0]); raw1394_destroy_handle(cam_var->handle); g_warning("unable to capture a frame"); return; } /* * Copy buffer content to tmp buffer array */ memcpy( img_frame->A[0], (const char *) cam_var->capture[0].capture_buffer, sizeof(char) * cam_var->capture[0].frame_width * cam_var->capture[0].frame_height); if (gpiv_par->x_corr) { /* * capture second frame */ if (dc1394_single_capture(cam_var->handle, &cam_var->capture[0]) != DC1394_SUCCESS) { dc1394_release_camera(cam_var->handle, &cam_var->capture[0]); raw1394_destroy_handle(cam_var->handle); g_warning("unable to capture a frame"); return; } memcpy( img_frame->B[0], (const char *) cam_var->capture[0].capture_buffer, sizeof(char) * cam_var->capture[0].frame_width * cam_var->capture[0].frame_height); } /* g_message("rec_frame:: 3/3"); */ } static void add_buffer(GpivConsole *gpiv, gchar *fname_base, gint ibuf, unsigned char **frameA, unsigned char **frameB ) /*----------------------------------------------------------------------------- */ { gchar cbuf[4], cdate[GPIV_MAX_CHARS], ctime[GPIV_MAX_CHARS]; /* GTimeVal *my_gtime = NULL; */ time_t ltime_t; /* * Use numbers or timing to concanate after buffer names */ /* BUGFIX GTimeVal might be used for more accurate timing */ /* my_gtime = g_malloc(sizeof(GTimeVal)); */ /* g_get_current_time(my_gtime); */ date = g_date_new (); g_date_set_time(date, time (NULL)); ltime_t = time(<ime_t); dac_time = localtime(<ime_t); g_snprintf(ctime, sizeof(gint) * 3 + 2, "%d.%d.%d_", dac_time->tm_hour, dac_time->tm_min, dac_time->tm_sec); g_snprintf(cdate, sizeof(gint) * 3 + 2, "%d.%d.%d_", g_date_day(date), g_date_month(date), g_date_year(date)); g_snprintf(cbuf, 4, "%d", ibuf); if (gpiv_var->fname_date && gpiv_var->fname_time) { fname_base = g_strdup(g_strconcat(gpiv_var->fn_last[0], (gchar *) cdate, (gchar *) ctime, (gchar *) cbuf, NULL)); } else if (gpiv_var->fname_date) { fname_base = g_strdup(g_strconcat(gpiv_var->fn_last[0], (gchar *) cdate, (gchar *) cbuf, NULL)); } else if (gpiv_var->fname_time) { fname_base = g_strdup(g_strconcat(gpiv_var->fn_last[0], (gchar *) ctime, (gchar *) cbuf, NULL)); } else { fname_base = g_strdup(g_strconcat(gpiv_var->fn_last[0], (gchar *) cbuf, NULL)); } load_dac_buffer(gpiv, cam_var, FALSE, fname_base, ibuf, frameA, frameB, INSERT); nbufs++; /* g_free(my_gtime); */ g_free(fname_base); g_date_free(date); return; } static void renew_buffer(GpivConsole *gpiv, gchar *fname_base, gint ibuf, unsigned char **frameA, unsigned char **frameB ) /*----------------------------------------------------------------------------- * updates image of buffer */ { /* * Open buffer 0 if not exist */ if (display[ibuf] == NULL) { add_buffer(gpiv, fname_base, ibuf, frameA, frameB); } else { display_act = display[ibuf]; recreate_img(display_act, frameA, frameB); if (display_act->img->exist_img) { show_img1(display_act); } else { hide_img1(display_act); } if (gl_image_par->x_corr) { if (display_act->img->exist_img) { show_img2(display_act); } else { hide_img2(display_act); } } } } static void recreate_img(Display * disp, unsigned char **frameA, unsigned char **frameB ) /* ---------------------------------------------------------------------------- * Re-creates image in gnome canvas; without memallocating of rgbbuf_img1 and * rgbbuf_img2 * row stride; each row is a 4-byte buffer array */ { guchar *pos1 = NULL; /* guchar *pos2 = NULL; */ gint i, j; GdkPixbuf *pixbuf1 = NULL; /* GdkPixbuf *pixbuf2 = NULL; */ guint16 fact = 1; gint depth = 8; assert (disp != NULL); //assert (disp->img->img1 != NULL); assert (disp->img->rgbbuf_img1 != NULL); if (disp->img->image->header->x_corr) { // assert (disp->img->img2 != NULL); assert (disp->img->rgbbuf_img2 != NULL); } assert (disp->img->exist_img); fact = fact << (disp->img->image->header->depth - depth); disp->img->rgb_img_width = disp->img->image->header->ncolumns * 3; while ((disp->img->rgb_img_width) % 4 != 0) { disp->img->rgb_img_width++; } pixbuf1 = gdk_pixbuf_new_from_data(disp->img->rgbbuf_img1, GDK_COLORSPACE_RGB, FALSE, /* gboolean has_alpha */ disp->img->image->header->depth, disp->img->image->header->ncolumns, disp->img->image->header->nrows, disp->img->rgb_img_width, /* rowstride */ NULL, NULL); pos1 = disp->img->rgbbuf_img1; for (i = 0; i < disp->img->image->header->nrows; i++) { for (j = 0; j < disp->img->image->header->ncolumns; j++) { *pos1++ = (guchar) (frameA[i][j] / fact); *pos1++ = (guchar) (frameA[i][j] / fact); *pos1++ = (guchar) (frameA[i][j] / fact); } } gnome_canvas_item_set(GNOME_CANVAS_ITEM (disp->img->gci_img1), "pixbuf", pixbuf1, NULL); /* gnome_canvas_item_raise_to_top (GNOME_CANVAS_ITEM (disp->img->gci_img1)); */ /* gnome_canvas_item_request_update (GNOME_CANVAS_ITEM (disp->img->gci_img1)); */ /* gtk_widget_pop_visual(); */ /* gtk_widget_pop_colormap(); */ gdk_pixbuf_unref (pixbuf1); /* if(image->header->x_corr) { */ /* pos2 = NULL; */ /* disp->img->rgbbuf_img2 = g_malloc(disp->img->rgb_img_width * 3 * */ /* gpiv_par->img_height); */ /* pixbuf2 = gdk_pixbuf_new_from_data(disp->img->rgbbuf_img2, */ /* GDK_COLORSPACE_RGB, */ /* FALSE, */ /* depth, */ /* gpiv_par->img_width, */ /* gpiv_par->img_height, */ /* disp->img->rgb_img_width, */ /* NULL, */ /* NULL); */ /* if (disp->img->gci_img2 != NULL) { */ /* destroy_img(disp); */ /* } */ /* disp->img->gci_img2 = */ /* gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS */ /* (disp->canvas)), */ /* gnome_canvas_pixbuf_get_type (), */ /* "pixbuf", pixbuf2, */ /* NULL); */ /* pos2 = disp->img->rgbbuf_img2; */ /* for (i = 0; i < gpiv_par->img_height; i++) { */ /* for (j = 0; j < gpiv_par->img_width; j++) { */ /* *pos2++ = (guchar) (frameB[i][j] / fact); */ /* *pos2++ = (guchar) (frameB[i][j] / fact); */ /* *pos2++ = (guchar) (frameB[i][j] / fact); */ /* } */ /* } */ /* gdk_pixbuf_unref (pixbuf2); */ /* } else { */ disp->img->gci_img2 = disp->img->gci_img2; /* } */ } #endif /* ENABLE_CAM */ gpiv-0.6.1/src/dac_cam.h0000644000175000017500000001304011110307326011703 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * (callback) functions for dac * $Log: dac_cam.h,v $ * Revision 1.3 2006-09-18 07:27:05 gerber * *** empty log message *** * * Revision 1.2 2005/01/31 14:41:41 gerber * copyrighted and cleaned-up * * Revision 1.1 2005/01/19 15:53:41 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * */ #ifndef DAC_CAM_H #define DAC_CAM_H #ifdef ENABLE_CAM static const char *format0_desc[NUM_FORMAT0_MODES] = { "160x120 YUV (4:4:4)", "320x240 YUV (4:2:2)", "640x480 YUV (4:1:1)", "640x480 YUV (4:2:2)", "640x480 RGB (24bpp)", "640x480 Mono (8bpp)", "640x480 Mono (16bpp)" }; static const char *format1_desc[NUM_FORMAT1_MODES] = { "800x600 (YUV)", "800x600 (RGB)", "800x600 (MONO)", "1024x768 (YUV422)", "1024x768 (RGB)", "1024x768 (MONO)", "800x600 (MONO16)", "1024x768 (MONO16)" }; static const char *format2_desc[NUM_FORMAT2_MODES] = { "1280x960 (YUV)", "1280x960 (RGB)", "1280x960 (MONO)", "1600x1200 (YUV422)", "1600x1200 (RGB)", "1600x1200 (MONO)", "1280x960 (MONO16)", "1600x1200 (MONO16)" }; static const char *format6_desc[NUM_FORMAT6_MODES] = { "EXIF" }; static const char *format7_desc[NUM_MODE_FORMAT7] = { "FORMAT7 (0)", "FORMAT7 (1)", "FORMAT7 (2)", "FORMAT7 (3)", "FORMAT7 (4)", "FORMAT7 (5)", "FORMAT7 (6)", "FORMAT7 (7)" }; static const char *color_format7_desc[NUM_COLOR_FORMAT7] = { "FORMAT7 (MONO8)", "FORMAT7 (YUV411)", "FORMAT7 (YUV422)", "FORMAT7 (YUV444)", "FORMAT7 (RGB8)", "FORMAT7 (MONO16)", "FORMAT7 (RGB16" }; static const char *trigger_mode_desc[NUM_TRIGGER_MODE] = { "TRIGGER MODE 0", "TRIGGER MODE 1", "TRIGGER MODE 2", "TRIGGER MODE 3" }; static const char *format_desc[NUM_FORMATS] = { "FORMAT_VGA_NONCOMPRESSED", "FORMAT_SVGA_NONCOMPRESSED_1", "FORMAT_SVGA_NONCOMPRESSED_2", "RESERVED 1", "RESERVED 2", "RESERVED 3", "FORMAT_STILL_IMAGE= 390", "FORMAT_SCALABLE_IMAGE_SIZE" }; /* * Already declared in libdc1394.h */ /* const char *dc1394_feature_desc[NUM_FEATURES] = { "Brightness", "Exposure", "Sharpness", "White Balance", "Hue", "Saturation", "Gamma", "Shutter", "Gain", "Iris", "Focus", "Temperature", "Trigger", "Zoom", "Pan", "Tilt", "Optical Filter", "Capture Size", "Capture Quality" }; */ static const char * fps_label_list[NUM_FRAMERATES] = { "1.875 fps", "3.75 fps", "7.5 fps", "15 fps", "30 fps", "60 fps" }; /* * Global functions */ void exec_cam_start(GpivConsole *gpiv ); void exec_cam_stop(void ); /* * Callback functions */ void on_menu_camera_select(GtkWidget *widget, gpointer data); void on_menu_format(GtkWidget *widget, gpointer data); void on_menu_fps(GtkWidget *widget, gpointer data); void on_trigger_external_toggled (GtkToggleButton *togglebutton, gpointer user_data); void on_trigger_polarity_toggled (GtkToggleButton *togglebutton, gpointer user_data); void on_trigger_mode_activate(GtkWidget *widget, gpointer data); #ifdef ENABLE_TRIG void on_checkbutton_camera_trigger_enter(GtkWidget *widget, gpointer data); void on_checkbutton_camera_trigger(GtkWidget *widget, gpointer data); #endif /* ENABLE_TRIG */ void on_man_auto_menu(GtkWidget *widget, gpointer data); void on_scale_changed(GtkAdjustment *adj, gpointer user_data); void on_button_dac_camstart_enter(GtkWidget *widget, gpointer data); void on_button_dac_camstart(GtkWidget *widget, gpointer data); void on_button_dac_camstop_enter(GtkWidget *widget, gpointer data); void on_button_dac_camstop(GtkWidget *widget, gpointer data); #endif /* ENABLE_CAM */ #endif /* DAC_CAM_H */ gpiv-0.6.1/src/preferences.c0000644000175000017500000006773211110305502012643 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * $Log: preferences.c,v $ * Revision 1.18 2008-10-09 14:43:37 gerber * paralellized with OMP and MPI * * Revision 1.17 2008-04-28 12:00:58 gerber * hdf-formatted files are now with .hdf extension (previously: .gpi) * * Revision 1.16 2007-12-19 08:42:35 gerber * debugged * * Revision 1.15 2007-11-23 16:24:08 gerber * release 0.5.0: Kafka * * Revision 1.14 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.13 2007/02/05 15:17:09 gerber * auto stretching, broadcast display settings to buffers from preferences * * Revision 1.12 2007-01-29 11:27:44 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.11 2006-09-18 07:27:06 gerber * *** empty log message *** * * Revision 1.10 2006/01/31 14:28:13 gerber * version 0.3.0 * * Revision 1.8 2005/01/19 15:53:42 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.7 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.6 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.5 2003/09/01 11:17:15 gerber * improved monitoring of interrogation process * * Revision 1.4 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.3 2003/07/25 15:40:24 gerber * removed/disabled setting of correlation in Eval tab, Correlation type in Image info tab * * Revision 1.2 2003/06/27 13:47:26 gerber * display ruler, line/point evaluation * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifdef HAVE_CONFIG_H # include #endif /* HAVE_CONFIG_H */ #include "support.h" #include "gpiv_gui.h" #include "utils.h" #include "preferences.h" #include "preferences_interface.h" static void apply_gpivpar_console (GpivConsole * gpiv); static void apply_gpivpar_display (); void on_checkbutton_gpivbuttons_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->console__view_gpivbuttons = 1; } else { default_par->console__view_gpivbuttons = 0; } } void on_checkbutton_tab_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->console__view_tabulator = 1; } else { default_par->console__view_tabulator = 0; } } void on_checkbutton_hdf_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->hdf = 1; } else { default_par->hdf = 0; } } void on_radiobutton_datafmt(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { gint select = atoi(gtk_object_get_data(GTK_OBJECT(widget), "data_format")); default_par->hdf = select; if (gpiv_par->verbose) g_message("on_radiobutton_datafmt:: %d", default_par->hdf); } void on_radiobutton_imgfmt(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { gint fmt_select = atoi(gtk_object_get_data(GTK_OBJECT(widget), "image_format")); gpiv_par->img_fmt = fmt_select; if (fmt_select == IMG_FMT_PNG) { if (gpiv_par->verbose) g_message("on_radiobutton_imgfmt:: img_fmt = IMG_FMT_PNG"); } else if (fmt_select == IMG_FMT_HDF) { if (gpiv_par->verbose) g_message("on_radiobutton_imgfmt:: img_fmt = IMG_FMT_HDF"); } else if (fmt_select == IMG_FMT_RAW) { if (gpiv_par->verbose) g_message("on_radiobutton_imgfmt:: img_fmt = IMG_FMT_RAW"); } else { g_message("INVALID IMG_FMT"); } } void on_checkbutton_xcorr_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->x_corr = 1; } else { default_par->x_corr = 0; } } void on_checkbutton_tooltips_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->console__show_tooltips = 1; } else { default_par->console__show_tooltips = 0; } } #ifdef ENABLE_CAM void on_checkbutton_process_cam_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->process__cam = TRUE; } else { default_par->process__cam = FALSE; } } #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG void on_checkbutton_process_trig_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->process__trig = TRUE; } else { default_par->process__trig = FALSE; } } #endif /* ENABLE_TRIG */ #ifdef ENABLE_IMGPROC void on_checkbutton_process_imgproc_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->process__imgproc = TRUE; } else { default_par->process__imgproc = FALSE; } } #endif /* ENABLE_IMGPROC */ void on_checkbutton_process_piv_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->process__piv = TRUE; } else { default_par->process__piv = FALSE; } } void on_checkbutton_process_gradient_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->process__gradient = TRUE; } else { default_par->process__gradient = FALSE; } } void on_checkbutton_process_resstats_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->process__resstats = TRUE; } else { default_par->process__resstats = FALSE; } } void on_checkbutton_process_errvec_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->process__errvec = TRUE; } else { default_par->process__errvec = FALSE; } } void on_checkbutton_process_peaklck_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->process__peaklock = TRUE; } else { default_par->process__peaklock = FALSE; } } void on_checkbutton_process_subtract_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->process__subtract = TRUE; } else { default_par->process__subtract = FALSE; } } void on_checkbutton_process_scale_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->process__scale = TRUE; } else { default_par->process__scale = FALSE; } } void on_checkbutton_process_avg_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->process__average = TRUE; } else { default_par->process__average = FALSE; } } void on_checkbutton_process_vorstra_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->process__vorstra = TRUE; } else { default_par->process__vorstra = FALSE; } } void on_spinbutton_bins_activate(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ {} #ifdef ENABLE_MPI void on_spinbutton_nodes(GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { default_par->mpi_nodes = gtk_spin_button_get_value_as_int (widget); } #endif void on_radiobutton_display_vecscale(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { default_par->display__vector_scale = atoi(gtk_object_get_data(GTK_OBJECT(widget), "vscale")); } void on_radiobutton_display_veccolor(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { default_par->display__vector_color = atoi(gtk_object_get_data(GTK_OBJECT(widget), "vcolor")); } void on_radiobutton_display_zoomscale(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { default_par->display__zoom_index = atoi(gtk_object_get_data(GTK_OBJECT(widget), "zscale")); } void on_radiobutton_display_background(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { default_par->display__backgrnd = atoi (gtk_object_get_data (GTK_OBJECT (widget), "bgcolor")); if (gpiv_par->verbose) g_message ("on_radiobutton_display_background:: display__backgrnd = %d", default_par->display__backgrnd); } void on_checkbutton_display_display_intregs(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->display__intregs = TRUE; } else { default_par->display__intregs = FALSE; } } void on_checkbutton_display_display_piv(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->display__piv = TRUE; } else { default_par->display__piv = FALSE; } } void on_radiobutton_display_scalar(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { default_par->display__scalar = atoi (gtk_object_get_data (GTK_OBJECT (widget), "scalar")); if (gpiv_par->verbose) g_message ("on_radiobutton_display_scalar:: display__scalar = %d", default_par->display__scalar); } void on_checkbutton_display_view_menubar_activate (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->display__view_menubar = 1; } else { default_par->display__view_menubar = 0; } } void on_checkbutton_display_view_rulers_activate (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->display__view_rulers = 1; } else { default_par->display__view_rulers = 0; } } void on_checkbutton_display_stretch_auto_activate (GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { if (GTK_TOGGLE_BUTTON(widget)->active) { default_par->display__stretch_auto = TRUE; } else { default_par->display__stretch_auto = FALSE; } } void on_preferences_response(GtkDialog *dialog, gint response, gpointer data ) /*----------------------------------------------------------------------------- */ { GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(dialog), "gpiv"); Pref *pref = gtk_object_get_data(GTK_OBJECT(dialog), "pref"); g_assert( response == GTK_RESPONSE_OK || response == GTK_RESPONSE_APPLY || response == GTK_RESPONSE_CANCEL); switch (response) { case GTK_RESPONSE_OK: apply_gpivpar(gpiv); store_defaultpar(); gtk_widget_destroy(GTK_WIDGET (dialog)); break; case GTK_RESPONSE_APPLY: apply_gpivpar(gpiv); break; case GTK_RESPONSE_CANCEL: gtk_widget_destroy(GTK_WIDGET (dialog)); break; default: g_warning("on_preferences_response: should not arrive here"); break; } } void apply_gpivpar (GpivConsole * gpiv) /* ---------------------------------------------------------------------------- * Updates actual parameters */ { gint i; apply_gpivpar_console(gpiv); for (i = 0; i < nbufs; i++) { display_act = display[i]; if (display_act != NULL) { if (gpiv_par->verbose) g_message("apply_gpivpar:: ibuf = %d apply_gpivpar_display", i); apply_gpivpar_display (); } } } static void apply_gpivpar_console(GpivConsole *gpiv) /* ---------------------------------------------------------------------------- * Updates actual parameters for the console */ { GtkWidget *settings_menu_gpiv0 = gtk_object_get_data (GTK_OBJECT (gpiv->console), "settings_menu_gpiv0"); GtkWidget *settings_menu_gpiv1 = gtk_object_get_data (GTK_OBJECT (gpiv->console), "settings_menu_gpiv1"); GtkWidget *help_menu_gpiv0 = gtk_object_get_data (GTK_OBJECT (gpiv->console), "help_menu_gpiv0"); GtkWidget *help_menu_gpiv_popup0 = gtk_object_get_data (GTK_OBJECT (gpiv->console), "help_menu_gpiv_popup0"); parameters_set(gpiv_par, FALSE); cp_undef_parameters(default_par, gpiv_par); if (default_par->console__view_gpivbuttons == 1) { gtk_widget_show(gpiv->handlebox1); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (settings_menu_gpiv0), TRUE); } else { gtk_widget_hide(gpiv->handlebox1); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (settings_menu_gpiv0), FALSE); } if (default_par->console__view_tabulator == 1) { gtk_widget_show(gpiv->notebook); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (settings_menu_gpiv1), TRUE); } else { gtk_widget_hide(gpiv->notebook); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (settings_menu_gpiv1), FALSE); } if (default_par->console__show_tooltips == 1) { gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (help_menu_gpiv0), TRUE); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (help_menu_gpiv_popup0), TRUE); } else { gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (help_menu_gpiv0), FALSE); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM (help_menu_gpiv_popup0), FALSE); } gtk_spin_button_set_value(GTK_SPIN_BUTTON (gpiv->pivvalid->spinbutton_histo_bins), default_par->console__nbins); #ifdef ENABLE_CAM gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (gpiv->button_toolbar_cam), default_par->process__cam); #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (gpiv->button_toolbar_trig), default_par->process__trig); #endif /* ENABLE_TRIG */ #ifdef ENABLE_IMGPROC gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (gpiv->button_toolbar_imgproc), default_par->process__imgproc); #endif /* ENABLE_IMGPROC */ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON (gpiv->button_toolbar_piv), default_par->process__piv); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (gpiv->button_toolbar_gradient), default_par->process__gradient); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (gpiv->button_toolbar_resstats), default_par->process__resstats); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (gpiv->button_toolbar_errvec), default_par->process__errvec); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (gpiv->button_toolbar_peaklock), default_par->process__peaklock); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (gpiv->button_toolbar_scale), default_par->process__scale); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (gpiv->button_toolbar_average), default_par->process__average); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (gpiv->button_toolbar_subavg), default_par->process__subtract); gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (gpiv->button_toolbar_vorstra), default_par->process__vorstra); } static void apply_gpivpar_display (void) /* ---------------------------------------------------------------------------- * Updates actual parameters for the actual display */ { GtkWidget *view_menubar_popup_menu = gtk_object_get_data(GTK_OBJECT(display_act->mwin), "view_menubar_popup_menu"); GtkWidget *view_rulers_popup_menu = gtk_object_get_data(GTK_OBJECT(display_act->mwin), "view_rulers_popup_menu"); GtkWidget *stretch_auto_popup_menu = gtk_object_get_data(GTK_OBJECT(display_act->mwin), "stretch_auto_popup_menu"); /* for (i = 0; i < nbufs; i++) { */ /* display_act = display[i]; */ /* if (display_act != NULL) { */ if (display_act->pida->exist_piv && display_act->display_piv) { update_all_vectors(display_act->pida); } if (display_act->display_intregs) { if (default_par->display__intregs == 1) { create_all_intregs2(display_act); create_all_intregs1(display_act); } else { hide_all_intregs1(display_act); hide_all_intregs2(display_act); } } if (display_act->pida->exist_piv) { if (default_par->display__piv) { create_all_vectors(display_act->pida); } else { hide_all_vectors(display_act->pida); } } if (display_act->pida->exist_vor) { if (default_par->display__scalar == SHOW_SC_VORTICITY) { create_all_scalars (display_act, GPIV_VORTICITY); } else { hide_all_scalars (display_act, GPIV_VORTICITY); } } if (display_act->pida->exist_sstrain) { if (default_par->display__scalar == SHOW_SC_SSTRAIN) { create_all_scalars (display_act, GPIV_S_STRAIN); } else { hide_all_scalars (display_act, GPIV_S_STRAIN); } } if (display_act->pida->exist_nstrain) { if (default_par->display__scalar == SHOW_SC_NSTRAIN) { create_all_scalars (display_act, GPIV_N_STRAIN); } else { hide_all_scalars (display_act, GPIV_N_STRAIN); } } if (default_par->display__view_menubar == 1) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_menubar_popup_menu), TRUE); } else { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_menubar_popup_menu), FALSE); } if (default_par->display__view_rulers == 1) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_rulers_popup_menu), TRUE); } else { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (view_rulers_popup_menu), FALSE); } if (default_par->display__stretch_auto == TRUE) { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (stretch_auto_popup_menu), TRUE); } else { gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (stretch_auto_popup_menu), FALSE); } } void store_defaultpar (void ) /* ---------------------------------------------------------------------------- * Store parameters as defaults */ { gnome_config_push_prefix ("/gpiv/General/"); /* gnome_config_set_bool ("print_par", print_par); */ gnome_config_set_bool ("console__show_tooltips", default_par->console__show_tooltips); gnome_config_set_bool ("console__view_gpivbuttons", default_par->console__view_gpivbuttons); gnome_config_set_bool ("console__view_tabulator", default_par->console__view_tabulator); gnome_config_set_int ("console__nbins", default_par->console__nbins); gnome_config_set_bool ("img_fmt", default_par->img_fmt); gnome_config_set_bool ("hdf", default_par->hdf); #ifdef ENABLE_MPI gnome_config_set_int ("mpi_nodes", default_par->mpi_nodes); #endif /* ENABLE_MPI */ gnome_config_pop_prefix (); gnome_config_push_prefix ("/gpiv/Image/"); gnome_config_set_bool ("x_corr", default_par->x_corr); gnome_config_pop_prefix (); gnome_config_push_prefix ("/gpiv/Processes/"); #ifdef ENABLE_CAM gnome_config_set_bool ("process__cam", default_par->process__cam); #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG gnome_config_set_bool ("process__trig", default_par->process__trig); #endif /* ENABLE_TRIG */ #ifdef ENABLE_IMGPROC gnome_config_set_bool ("process__imgproc", default_par->process__imgproc); #endif /* ENABLE_IMGPROC */ gnome_config_set_bool ("process__piv", default_par->process__piv); gnome_config_set_bool ("process__gradient", default_par->process__gradient); gnome_config_set_bool ("process__resstats", default_par->process__resstats); gnome_config_set_bool ("process__errvec", default_par->process__errvec); gnome_config_set_bool ("process__peaklock", default_par->process__peaklock); gnome_config_set_bool ("process__scale", default_par->process__scale); gnome_config_set_bool ("process__average", default_par->process__average); gnome_config_set_bool ("process__subtract", default_par->process__subtract); gnome_config_set_bool ("process__vorstra", default_par->process__vorstra); gnome_config_pop_prefix (); gnome_config_push_prefix ("/gpiv/Display/"); gnome_config_set_bool ("display__view_menubar", default_par->display__view_menubar); gnome_config_set_bool ("display__view_rulers", default_par->display__view_rulers); gnome_config_set_bool ("display__stretch_auto", default_par->display__stretch_auto); gnome_config_set_int ("display__vector_scale", default_par->display__vector_scale); gnome_config_set_int ("display__vector_color", default_par->display__vector_color); gnome_config_set_int ("display__zoom_index", default_par->display__zoom_index); gnome_config_set_int ("display__backgrnd", default_par->display__backgrnd); gnome_config_set_bool ("display__intregs", default_par->display__intregs); gnome_config_set_bool ("display__piv", default_par->display__piv); gnome_config_set_int ("display__scalar", default_par->display__scalar); gnome_config_pop_prefix (); gnome_config_sync (); } gpiv-0.6.1/src/preferences.h0000644000175000017500000001337111110306421012637 00000000000000/*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * $Log: preferences.h,v $ * Revision 1.13 2008-10-09 14:43:37 gerber * paralellized with OMP and MPI * * Revision 1.12 2007-12-19 08:42:35 gerber * debugged * * Revision 1.11 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.10 2007/02/05 15:17:09 gerber * auto stretching, broadcast display settings to buffers from preferences * * Revision 1.9 2007-01-29 11:27:44 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.8 2006-09-18 07:27:06 gerber * *** empty log message *** * * Revision 1.7 2006/01/31 14:28:13 gerber * version 0.3.0 * * Revision 1.5 2005/01/19 15:53:43 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.4 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.3 2003/08/22 15:24:53 gerber * interactive spatial scaling * * Revision 1.2 2003/07/25 15:40:24 gerber * removed/disabled setting of correlation in Eval tab, Correlation type in Image info tab * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef PREFERENCES_H #define PREFERENCES_H /* #ifdef HAVE_CONFIG_H */ /* # include */ /* #endif */ #include "gpiv_gui.h" /*------------------------------------------------------------------------ * widgets from preferences */ GtkDialog * create_preferences (GpivConsole *gpiv); void on_checkbutton_gpivbuttons_activate (GtkWidget *widget, gpointer data); void on_checkbutton_tab_activate (GtkWidget *widget, gpointer data); void on_radiobutton_imgfmt (GtkWidget *widget, gpointer data ); void on_radiobutton_datafmt (GtkWidget *widget, gpointer data ); /* void */ /* on_checkbutton_hdf_activate(GtkWidget *widget, */ /* gpointer data); */ void on_checkbutton_xcorr_activate (GtkWidget *widget, gpointer data); void on_checkbutton_tooltips_activate (GtkWidget *widget, gpointer data); #ifdef ENABLE_CAM void on_checkbutton_process_cam_activate (GtkWidget *widget, gpointer data); #endif /* ENABLE_CAM */ #ifdef ENABLE_TRIG void on_checkbutton_process_trig_activate (GtkWidget *widget, gpointer data); #endif /* ENABLE_TRIG */ #ifdef ENABLE_IMGPROC void on_checkbutton_process_imgproc_activate (GtkWidget *widget, gpointer data); #endif /* ENABLE_IMGPROC */ void on_checkbutton_process_piv_activate (GtkWidget *widget, gpointer data); void on_checkbutton_process_gradient_activate (GtkWidget *widget, gpointer data); void on_checkbutton_process_resstats_activate (GtkWidget *widget, gpointer data); void on_checkbutton_process_errvec_activate (GtkWidget *widget, gpointer data); void on_checkbutton_process_peaklck_activate (GtkWidget *widget, gpointer data); void on_checkbutton_process_scale_activate (GtkWidget *widget, gpointer data); void on_checkbutton_process_avg_activate (GtkWidget *widget, gpointer data); void on_checkbutton_process_subtract_activate (GtkWidget *widget, gpointer data); void on_checkbutton_process_vorstra_activate (GtkWidget *widget, gpointer data); void on_spinbutton_bins_activate (GtkWidget *widget, gpointer data); #ifdef ENABLE_MPI void on_spinbutton_nodes (GtkSpinButton *widget, GtkWidget *entry); #endif /* ENABLE_MPI */ void on_radiobutton_display_zoomscale (GtkWidget *widget, gpointer data); void on_radiobutton_display_background (GtkWidget *widget, gpointer data); void on_radiobutton_display_vecscale (GtkWidget *widget, gpointer data); void on_radiobutton_display_veccolor (GtkWidget *widget, gpointer data); void on_checkbutton_display_display_intregs (GtkWidget *widget, gpointer data); void on_checkbutton_display_display_piv (GtkWidget *widget, gpointer data); void on_radiobutton_display_scalar(GtkWidget *widget, gpointer data ); void on_checkbutton_display_view_menubar_activate (GtkWidget *widget, gpointer data); void on_checkbutton_display_view_rulers_activate (GtkWidget *widget, gpointer data); void on_checkbutton_display_stretch_auto_activate (GtkWidget *widget, gpointer data); void on_preferences_response (GtkDialog *dialog, gint response, gpointer data); void apply_gpivpar (GpivConsole * gpiv); void store_defaultpar (void); #endif /* PREFERENCES_H */ gpiv-0.6.1/src/display_intregs.c0000644000175000017500000004242211110306006013527 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ #include "gpiv_gui.h" #include "display_intregs.h" void create_all_intregs (Display *disp ) /*----------------------------------------------------------------------------- * Creates all interrogation areas */ { char *err_msg = NULL; GtkWidget *view_piv_display0 = gtk_object_get_data(GTK_OBJECT(disp->mwin), "view_piv_display0"); if (disp != NULL) { /* if (GTK_CHECK_MENU_ITEM(view_piv_display0)->disabled) { */ if (!disp->intreg->exist_int) { if ((disp->intreg->data = create_intreg_data (disp)) == NULL) { g_warning ("create_all_intregs: failing create_intreg_data"); return; } } /* disp->intreg->par->row_start_old = 0; */ /* disp->intreg->par->row_start = disp->pida->eval_par->row_start; */ /* disp->intreg->par->row_end = disp->pida->eval_par->row_end; */ /* disp->intreg->par->col_start_old = 0; */ /* disp->intreg->par->col_start = disp->pida->eval_par->col_start; */ /* disp->intreg->par->col_end = disp->pida->eval_par->col_end; */ /* disp->intreg->par->int_size_f = disp->pida->eval_par->int_size_f; */ /* disp->intreg->par->int_size_i = disp->pida->eval_par->int_size_i; */ /* disp->intreg->par->int_shift = disp->pida->eval_par->int_shift; */ /* disp->intreg->par->pre_shift_row = disp->pida->eval_par->pre_shift_row; */ /* disp->intreg->par->pre_shift_col = disp->pida->eval_par->pre_shift_col; */ /* g_message ("CREATE_ALL_INTREGS:: x_first = %d x_last = %d y_first = %d y_last = %d", */ /* disp->intreg->par->col_start, */ /* disp->intreg->par->col_end, */ /* disp->intreg->par->row_start, */ /* disp->intreg->par->row_end); */ create_all_intregs1 (disp); create_all_intregs2 (disp); } else { error_gpiv ("create_all_intregs: disp != NULL failed"); } } void destroy_all_intregs (Display *disp ) /*----------------------------------------------------------------------------- * Destroys all interrogation areas */ { if (disp != NULL) { destroy_all_intregs1 (disp); destroy_all_intregs2 (disp); destroy_intreg_data (disp); disp->display_intregs = FALSE; } } void show_all_intregs(Display *disp ) /*----------------------------------------------------------------------------- * Shows all interrogation areas */ { if (disp != NULL && !disp->intreg->exist_int) { create_all_intregs(disp); } show_all_intregs1(disp); show_all_intregs2(disp); } void hide_all_intregs (Display *disp ) /*----------------------------------------------------------------------------- * Hides all interrogation areas */ { if (disp != NULL) { hide_all_intregs1(disp); hide_all_intregs2(disp); } } GpivPivData * create_intreg_data (Display *disp ) /*----------------------------------------------------------------------------- */ { char *err_msg = NULL; GpivPivData *data = NULL; guint nx = 0, ny = 0; g_return_if_fail (!disp->intreg->exist_int); /* g_message ("CREATE_INTREG_DATA:: print_parameters"); */ /* gpiv_piv_fprint_parameters (NULL, disp->intreg->par); */ if ((err_msg = gpiv_piv_count_pivdata_fromimage (disp->img->image->header, disp->intreg->par, &nx, &ny)) != NULL) { g_warning ("create_intreg_data: %s", err_msg); return NULL; } if ((data = gpiv_piv_gridgen (nx, ny, disp->img->image->header, disp->intreg->par)) == NULL) error_gpiv ("%s: failing gpiv_piv_gridgen", RCSID); disp->intreg->exist_int = TRUE; return data; } void destroy_intreg_data (Display *disp ) /*----------------------------------------------------------------------------- */ { if (disp != NULL && disp->intreg->gci_intreg1[0][0] == NULL && disp->intreg->gci_intreg2[0][0] == NULL) { gpiv_free_pivdata (disp->intreg->data); disp->intreg->exist_int = FALSE; } } void create_all_intregs1 (Display *disp ) /* ---------------------------------------------------------------------------- * Displays all first interrogation areas */ { int i = 0, j; gint nx = 0; gint ny = 0; if (disp != NULL && !disp->intreg->exist_int) disp->intreg->data = create_intreg_data (disp); nx = disp->intreg->data->nx; ny = disp->intreg->data->ny; if (gpiv_par->verbose) g_message ("create_all_intregs1: creating %d I.A.'s", nx * ny); for (i = 0; i < ny; i++) { for (j = 0; j < nx ; j++) { create_intreg1 (disp, i, j); } } } void create_intreg1 (Display *disp, gint i, gint j ) /* ---------------------------------------------------------------------------- * Displays first interrogation area */ { int start_x = 0, start_y = 0, end_x = 0, end_y = 0; float x, y; if (disp != NULL && disp->intreg->exist_int) { x = disp->intreg->data->point_x[i][j]; y = disp->intreg->data->point_y[i][j]; /* * Using centre points of interr regs */ start_x = (int) x - disp->intreg->par->int_size_f / 2; start_y = (int) y - disp->intreg->par->int_size_f / 2; end_x = (int) x + disp->intreg->par->int_size_f / 2; end_y = (int) y + disp->intreg->par->int_size_f / 2; if (disp->intreg->gci_intreg1[i][j] != NULL) { destroy_intreg1 (disp, i, j); } disp->intreg->gci_intreg1[i][j] = gnome_canvas_item_new (gnome_canvas_root (GNOME_CANVAS (disp->canvas)), gnome_canvas_rect_get_type(), "x1", (double) start_x, "y1", (double) start_y, "x2", (double) end_x, "y2", (double) end_y, "outline_color", "red", "width_units", (double) THICKNESS, NULL); } } void update_intreg1 (Display *disp, gint i, gint j ) /* ---------------------------------------------------------------------------- * Updates first interrogation area */ { int start_x = 0, start_y = 0, end_x = 0, end_y = 0; float x, y; if (disp != NULL && disp->intreg->gci_intreg1[i][j] != NULL) { x = disp->intreg->data->point_x[i][j]; y = disp->intreg->data->point_y[i][j]; /* * Using centre points of interr regs */ start_x = (int) x - disp->intreg->par->int_size_f / 2; start_y = (int) y - disp->intreg->par->int_size_f / 2; end_x = (int) x + disp->intreg->par->int_size_f / 2; end_y = (int) y + disp->intreg->par->int_size_f / 2; gnome_canvas_item_set (GNOME_CANVAS_ITEM (disp->intreg->gci_intreg1[i][j]), "x1", (double) start_x, "y1", (double) start_y, "x2", (double) end_x, "y2", (double) end_y, "outline_color", "red", "width_units", (double) THICKNESS, NULL); } } void destroy_intreg1 (Display *disp, gint i, gint j ) /* ---------------------------------------------------------------------------- * Destroys 1st interrogation area at index i, j */ { if (disp != NULL && disp->intreg->gci_intreg1[i][j] != NULL) { gtk_object_destroy (GTK_OBJECT (disp->intreg->gci_intreg1[i][j])); disp->intreg->gci_intreg1[i][j] = NULL; } } void show_all_intregs1 (Display *disp ) /* ---------------------------------------------------------------------------- * Shows 1st interrogation areas */ { int i = 0, j = 0; gint nx = 0, ny = 0; if (disp != NULL && disp->intreg->exist_int) { /* if (!disp->intreg->exist_int) */ /* disp->intreg->data = create_intreg_data (disp); */ nx = disp->intreg->data->nx; ny = disp->intreg->data->ny; for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { assert (disp->intreg->gci_intreg1[i][j] != NULL); gnome_canvas_item_show (GNOME_CANVAS_ITEM (disp->intreg->gci_intreg1[i][j])); } } } } void hide_all_intregs1 (Display *disp ) /* ---------------------------------------------------------------------------- * Hides 1st interrogation areas */ { int i = 0, j = 0; gint nx = 0, ny = 0; if (disp != NULL && disp->intreg->exist_int) { nx = disp->intreg->data->nx; ny = disp->intreg->data->ny; for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { if (disp->intreg->gci_intreg1[i][j] != NULL) { gnome_canvas_item_hide (GNOME_CANVAS_ITEM (disp->intreg->gci_intreg1[i][j])); } } } } } void destroy_all_intregs1 (Display *disp ) /* ---------------------------------------------------------------------------- * Destroys 1st interrogation areas */ { int i = 0, j = 0; int nx = 0, ny = 0; if (disp != NULL && disp->intreg->exist_int) { nx = disp->intreg->data->nx; ny = disp->intreg->data->ny; if (gpiv_par->verbose) g_message("destroy_all_intregs1: destroying %d I.A.'s", nx * ny); for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { destroy_intreg1(disp, i, j); } } } } void create_all_intregs2 (Display *disp ) /* ---------------------------------------------------------------------------- * Displays all second interrogation areas */ { int i, j; int nx, ny; if (disp != NULL && !disp->intreg->exist_int) disp->intreg->data = create_intreg_data (disp); nx = disp->intreg->data->nx; ny = disp->intreg->data->ny; if (gpiv_par->verbose) g_message("create_all_intregs2: creating %d I.A.'s", nx * ny); for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { create_intreg2 (disp, i, j); } } } void create_intreg2 (Display *disp, gint i, gint j ) /* ---------------------------------------------------------------------------- - Displays second interrogation area */ { int start_x, start_y, end_x, end_y; float x, y; if (disp != NULL && disp->intreg->exist_int) { x = disp->intreg->data->point_x[i][j]; y = disp->intreg->data->point_y[i][j]; /* * with lines */ start_x = (int) x - disp->intreg->par->int_size_i / 2 + disp->intreg->par->pre_shift_col; start_y = (int) y - disp->intreg->par->int_size_i / 2 + disp->intreg->par->pre_shift_row; end_x = (int) x + disp->intreg->par->int_size_i / 2 + disp->intreg->par->pre_shift_col; end_y = (int) y + disp->intreg->par->int_size_i / 2 + disp->intreg->par->pre_shift_row; if (disp->intreg->gci_intreg2[i][j] != NULL) { destroy_intreg2(disp, i, j); } disp->intreg->gci_intreg2[i][j] = gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS (disp->canvas)), gnome_canvas_rect_get_type(), "x1", (double) start_x, "y1", (double) start_y, "x2", (double) end_x, "y2", (double) end_y, "outline_color", "blue", "width_units", (double) THICKNESS, NULL); } } void update_intreg2 (Display *disp, gint i, gint j ) /* ---------------------------------------------------------------------------- * Updates second interrogation area */ { int start_x, start_y, end_x, end_y; float x, y; if (disp != NULL && disp->intreg->gci_intreg1[i][j] != NULL) { x = disp->intreg->data->point_x[i][j] + disp->intreg->par->pre_shift_col; y = disp->intreg->data->point_y[i][j] + disp->intreg->par->pre_shift_row; /* * Using centre points of interr regs */ start_x = (int) x - disp->intreg->par->int_size_i / 2; start_y = (int) y - disp->intreg->par->int_size_i / 2; end_x = (int) x + disp->intreg->par->int_size_i / 2; end_y = (int) y + disp->intreg->par->int_size_i / 2; if (disp->intreg->gci_intreg2[i][j] != NULL) { gnome_canvas_item_set (GNOME_CANVAS_ITEM (disp->intreg->gci_intreg2[i][j]), "x1", (double) start_x, "y1", (double) start_y, "x2", (double) end_x, "y2", (double) end_y, "outline_color", "blue", "width_units", (double) THICKNESS, NULL); } } } void destroy_intreg2 (Display *disp, gint i, gint j ) /* ---------------------------------------------------------------------------- * Destroys 2nd interrogation area at index i, j */ { if (disp != NULL && disp->intreg->gci_intreg2[i][j] != NULL) { gtk_object_destroy(GTK_OBJECT (disp->intreg->gci_intreg2[i][j])); disp->intreg->gci_intreg2[i][j] = NULL; } } void show_all_intregs2 (Display *disp ) /* ---------------------------------------------------------------------------- * Shows 2nd interrogation areas */ { int i, j; int nx, ny; if (disp != NULL && disp->intreg->exist_int) { nx = disp->intreg->data->nx; ny = disp->intreg->data->ny; for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { assert (disp->intreg->gci_intreg2[i][j] != NULL); gnome_canvas_item_show (GNOME_CANVAS_ITEM (disp->intreg->gci_intreg2[i][j])); } } } } void hide_all_intregs2 (Display *disp ) /* ---------------------------------------------------------------------------- * Hides 2nd interrogation areas */ { int i, j; int nx, ny; if (disp != NULL && disp->intreg->exist_int) { nx = disp->intreg->data->nx; ny = disp->intreg->data->ny; for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { assert (disp->intreg->gci_intreg2[i][j] != NULL); gnome_canvas_item_hide (GNOME_CANVAS_ITEM (disp->intreg->gci_intreg2[i][j])); } } } } void destroy_all_intregs2 (Display *disp ) /* ---------------------------------------------------------------------------- * Destroys 2nd interrogation areas */ { int i, j; int nx, ny; if (disp != NULL && disp->intreg->exist_int) { nx = disp->intreg->data->nx; ny = disp->intreg->data->ny; if (gpiv_par->verbose) g_message("destroy_all_intregs2: destroying %d I.A.'s", nx * ny); for (i = 0; i < ny; i++) { for (j = 0; j < nx; j++) { destroy_intreg2(disp, i, j); } } } } gpiv-0.6.1/src/display_intregs.h0000644000175000017500000000462311110307061013537 00000000000000/* /* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ #ifndef DISPLAY_INTREGS_H #define DISPLAY_INTREGS_H /* * Interrogation regions of first and second image frame in a Gnome canvas */ void create_all_intregs (Display *disp); void destroy_all_intregs (Display *disp); GpivPivData * create_intreg_data (Display *disp); void destroy_intreg_data (Display *disp); void show_all_intregs (Display *disp); void hide_all_intregs (Display *disp); void create_all_intregs1 (Display *disp); void create_intreg1 (Display *disp, gint i, gint j); void update_intreg1 (Display *disp, gint i, gint j); void destroy_intreg1 (Display *disp, gint i, gint j); void show_all_intregs1 (Display *disp); void hide_all_intregs1 (Display *disp); void destroy_all_intregs1 (Display *disp); void create_all_intregs2 (Display *disp); void create_intreg2 (Display *disp, gint i, gint j); void update_intreg2 (Display *disp, gint i, gint j); void destroy_intreg2 (Display *disp, gint i, gint j); void show_all_intregs2 (Display *disp); void hide_all_intregs2 (Display *disp); void destroy_all_intregs2 (Display *disp); #endif /* DISPLAY_INTREGS_H */ gpiv-0.6.1/src/display_zoom.c0000644000175000017500000002221611110305734013046 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ #include "gpiv_gui.h" #include "display.h" #include "display_zoom.h" void set__canvas_size (Display *disp ); void set__adjusters (Display *disp ); gboolean canvas_display_button_scroll (GtkWidget *widget, GdkEventScroll *event, gpointer data ) /*----------------------------------------------------------------------------- */ { Display * disp = gtk_object_get_data(GTK_OBJECT(widget), "disp"); GpivConsole * gpiv = gtk_object_get_data(GTK_OBJECT(widget), "gpiv"); gint x, y; if (event->direction == 0) { disp->zoom_factor *= DISPLAY_ZOOMFACTOR_STEP; } if (event->direction == 1) { disp->zoom_factor /= DISPLAY_ZOOMFACTOR_STEP; } check__zoom_factor (&disp->zoom_factor); set__canvas_size (disp); if (gpiv_par->display__stretch_auto == TRUE) { stretch_window (disp); } set__adjusters (disp); set__hrulerscale (disp); set__vrulerscale (disp); } void check__zoom_factor (gfloat *factor ) /*----------------------------------------------------------------------------- */ { if (*factor < DISPLAY_ZOOMFACTOR_MIN) { *factor = DISPLAY_ZOOMFACTOR_MIN; } if (*factor > DISPLAY_ZOOMFACTOR_MAX) { *factor = DISPLAY_ZOOMFACTOR_MAX; } } void set__canvas_size (Display *disp ) /*----------------------------------------------------------------------------- */ { gnome_canvas_set_pixels_per_unit (GNOME_CANVAS (disp->canvas), disp->zoom_factor); /* gnome_canvas_set_center_scroll_region (GNOME_CANVAS(disp->canvas), TRUE); */ if (disp->zoom_factor < disp->zoom_factor_old) { gtk_widget_set_size_request (disp->canvas, (gint) (disp->zoom_factor * disp->img->image->header->ncolumns), (gint) (disp->zoom_factor * disp->img->image->header->nrows)); disp->zoom_factor_old = disp->zoom_factor; } } void set__hrulerscale (Display *disp ) /*----------------------------------------------------------------------------- */ { gfloat x_start; gfloat x_end; if (disp->pida->exist_piv && display_act->pida->scaled_piv) { x_start = (gfloat) (disp->x_adj_value - 1) / (gfloat) disp->zoom_factor * disp->img->image->header->s_scale * 10e-4 + disp->img->image->header->z_off_x ; x_end = (gfloat) x_start + (disp->img->image->header->s_scale * (gfloat) disp->x_page_size / (gfloat) disp->zoom_factor) * 10e-4; } else { x_start = (gfloat) (disp->x_adj_value - 1) / (gfloat) disp->zoom_factor; x_end = (gfloat) x_start + (gfloat) disp->x_page_size / (gfloat) disp->zoom_factor; } /* g_message ("set__hrulerscale:: s_scale = %f z_off_x = %f x_start = %f x_end = %f", */ /* disp->img->image->header->s_scale, */ /* disp->img->image->header->z_off_x, */ /* x_start, */ /* x_end); */ gtk_ruler_set_range (GTK_RULER (disp->hruler), x_start, x_end, x_start, x_end); } void set__vrulerscale (Display *disp ) /*----------------------------------------------------------------------------- * Identic to display.c: on_adj_changed__adapt_vruler */ { gfloat y_start; gfloat y_end; if (disp->pida->exist_piv && display_act->pida->scaled_piv) { y_start = (gfloat) (disp->y_adj_value - 1) / (gfloat) disp->zoom_factor * disp->img->image->header->s_scale * 10e-4 + disp->img->image->header->z_off_y ; y_end = (gfloat) y_start + (disp->img->image->header->s_scale * (gfloat) disp->y_page_size / (gfloat) disp->zoom_factor) * 10e-4; } else { y_start = (gfloat) (disp->y_adj_value - 1) / (gfloat) disp->zoom_factor; y_end = (gfloat) y_start + (gfloat) disp->y_page_size /(gfloat) disp->zoom_factor; } gtk_ruler_set_range (GTK_RULER (disp->vruler), y_start, y_end, y_start, y_end); } void set__adjusters (Display *disp ) /*----------------------------------------------------------------------------- */ { GtkAdjustment * hadj = GTK_ADJUSTMENT (disp->hadj); GtkAdjustment * vadj = GTK_ADJUSTMENT (disp->vadj) ; vadj->lower = 0.0; vadj->upper = (gdouble) (disp->img->image->header->nrows) * disp->zoom_factor - 1.0; vadj->page_size = (gdouble) (disp->img->image->header->nrows) * disp->zoom_factor_old; gtk_adjustment_set_value( GTK_ADJUSTMENT (vadj), (vadj->lower + vadj->upper - vadj->page_size) / 2.0); hadj->lower = 0.0; hadj->upper = (gdouble) (disp->img->image->header->ncolumns) * disp->zoom_factor - 1.0; hadj->page_size = (gdouble) (disp->img->image->header->ncolumns) * disp->zoom_factor_old; gtk_adjustment_set_value (GTK_ADJUSTMENT (hadj), (hadj->lower + hadj->upper - hadj->page_size) / 2.0); /* g_message ("set__adjusters:: HOR: lower = %f upper = %f size = %f", */ /* hadj->lower, hadj->upper, hadj->page_size); */ g_signal_emit_by_name (G_OBJECT (hadj), "changed"); g_signal_emit_by_name (G_OBJECT (vadj), "changed"); } void stretch_window (Display *disp ) /*----------------------------------------------------------------------------- */ { GtkAdjustment * hadj = GTK_ADJUSTMENT (disp->hadj); GtkAdjustment * vadj = GTK_ADJUSTMENT (disp->vadj); gint screen_width = gdk_screen_width(); gint screen_height = gdk_screen_height(); gint display_width = (gint) (disp->zoom_factor * disp->img->image->header->ncolumns /* + VIEW_HMARGE */ ); gint display_height = (gint) (disp->zoom_factor * disp->img->image->header->nrows /* + VIEW_VMARGE */ ); if (display_width >= screen_width/* - VIEW_HMARGE */) { display_width = screen_width - VIEW_HMARGE; } if (display_height >= screen_height - VIEW_VMARGE) { display_height = screen_height/* - VIEW_VMARGE */; } gtk_widget_set_size_request (disp->canvas, (gint) display_width/* - VIEW_HMARGE */, (gint) display_height/* - VIEW_VMARGE */); disp->zoom_factor_old = disp->zoom_factor; vadj->lower = 0.0; vadj->upper = (gdouble) disp->img->image->header->nrows - 1; vadj->page_size = (gdouble) (disp->img->image->header->nrows); hadj->lower = 0.0; hadj->upper = (gdouble) disp->img->image->header->ncolumns - 1; hadj->page_size = (gdouble) (disp->img->image->header->ncolumns); g_signal_emit_by_name (G_OBJECT (hadj), "changed"); g_signal_emit_by_name (G_OBJECT (vadj), "changed"); } void zoom_display (Display *disp, gint zoom_index ) /*----------------------------------------------------------------------------- */ { gint width = 0, height = 0; gint new_width = 0, new_height = 0; if (disp != NULL) { disp->zoom_factor = zfactor[zoom_index]; check__zoom_factor (&disp->zoom_factor); set__canvas_size (disp); if (gpiv_par->display__stretch_auto == TRUE) { stretch_window (disp); } set__adjusters (disp); set__hrulerscale (disp); set__vrulerscale (disp); } } gpiv-0.6.1/src/display_zoom.h0000644000175000017500000000314511110306771013055 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ #ifndef DISPLAY_ZOOM_H #define DISPLAY_ZOOM_H gboolean canvas_display_button_scroll (GtkWidget *widget, GdkEventScroll *event, gpointer data ); void check__zoom_factor (gfloat *factor ); void set__hrulerscale (Display *disp ); void set__vrulerscale (Display *disp ); void stretch_window (Display *disp ); void zoom_display (Display *disp, gint zoom_index ); #endif /* DISPLAY_ZOOM_H */ gpiv-0.6.1/src/display_image.c0000644000175000017500000002247411167072711013162 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ #include "gpiv_gui.h" #include "display_image.h" void create_img (Display *disp ) /* ---------------------------------------------------------------------------- * Creates pixbuf image in gnome canvas * row stride; each row is a 4-byte buffer array */ { /* GpivImagePar image_par = disp->img->image->header; */ guchar *pos1 = NULL, *pos2 = NULL; gint i, j; /* GdkPixbuf *pixbuf1 = NULL, *pixbuf2 = NULL; */ GdkPixbuf *px; guint16 fact = 1; gint depth = 8; assert (disp != NULL); assert (disp->img->image->frame1[0] != NULL); assert (disp->img->exist_img); disp->img->pixbuf1 = NULL; disp->img->pixbuf2 = NULL; fact = fact << (disp->img->image->header->depth - depth); /* g_message ("create_img:: fact = %d", fact); */ /* * BUGFIX: this works for rowstride */ disp->img->rgb_img_width = disp->img->image->header->ncolumns * 3; while ((disp->img->rgb_img_width) % 4 != 0) { disp->img->rgb_img_width++; } /* * this is a more formal way to do it */ px = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, depth, disp->img->image->header->ncolumns, disp->img->image->header->nrows); #ifdef DEBUG g_message("create_img:: rowstride = %d, rgb_img_width = %d", gdk_pixbuf_get_rowstride(px), disp->img->rgb_img_width); #endif disp->img->rgbbuf_img1 = g_malloc (gdk_pixbuf_get_rowstride(px) * disp->img->image->header->nrows); disp->img->pixbuf1 = gdk_pixbuf_new_from_data (disp->img->rgbbuf_img1, GDK_COLORSPACE_RGB, FALSE, /* gboolean has_alpha */ depth, /* image_par->depth */ disp->img->image->header->ncolumns, disp->img->image->header->nrows, disp->img->rgb_img_width, /* rowstride */ NULL, NULL); if (disp->img->gci_img1 != NULL) { destroy_img(disp); } disp->img->gci_img1 = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS (disp->canvas)), gnome_canvas_pixbuf_get_type (), "pixbuf", disp->img->pixbuf1, NULL); pos1 = disp->img->rgbbuf_img1; for (i = 0; i < disp->img->image->header->nrows; i++) { for (j = 0; j < disp->img->image->header->ncolumns; j++) { *pos1++ = (guchar) (disp->img->image->frame1[i][j] / fact); *pos1++ = (guchar) (disp->img->image->frame1[i][j] / fact); *pos1++ = (guchar) (disp->img->image->frame1[i][j] / fact); } } gdk_pixbuf_ref (disp->img->pixbuf1); if (disp->img->image->header->x_corr) { pos2 = NULL; /* NEW */ disp->img->rgbbuf_img2 = g_malloc(gdk_pixbuf_get_rowstride(px) * disp->img->image->header->nrows); /* OLD */ /* disp->img->rgbbuf_img2 = g_malloc(disp->img->rgb_img_width * */ /* disp->img->image->header->nrows); */ disp->img->pixbuf2 = gdk_pixbuf_new_from_data (disp->img->rgbbuf_img2, GDK_COLORSPACE_RGB, FALSE, depth, disp->img->image->header->ncolumns, disp->img->image->header->nrows, disp->img->rgb_img_width, NULL, NULL); if (disp->img->gci_img2 != NULL) { destroy_img(disp); } disp->img->gci_img2 = gnome_canvas_item_new( gnome_canvas_root( GNOME_CANVAS (disp->canvas)), gnome_canvas_pixbuf_get_type (), "pixbuf", disp->img->pixbuf2, NULL); pos2 = disp->img->rgbbuf_img2; for (i = 0; i < disp->img->image->header->nrows; i++) { for (j = 0; j < disp->img->image->header->ncolumns; j++) { *pos2++ = (guchar) (disp->img->image->frame2[i][j] / fact); *pos2++ = (guchar) (disp->img->image->frame2[i][j] / fact); *pos2++ = (guchar) (disp->img->image->frame2[i][j] / fact); } } gdk_pixbuf_ref (disp->img->pixbuf2); } else { disp->img->gci_img2 = disp->img->gci_img1; } gdk_pixbuf_unref (px); } void hide_img1 (Display *disp ) /*----------------------------------------------------------------------------- */ { assert (disp != NULL); if (disp->img->exist_img && disp->img->gci_img1 != NULL) { gnome_canvas_item_hide (GNOME_CANVAS_ITEM (disp->img->gci_img1)); disp->display_backgrnd = SHOW_BG_DARKBLUE; } } void show_img1 (Display *disp ) /*----------------------------------------------------------------------------- */ { assert (disp != NULL); if (disp->img->exist_img && disp->img->gci_img1 != NULL) { gnome_canvas_item_show (GNOME_CANVAS_ITEM (disp->img->gci_img1)); disp->display_backgrnd = SHOW_BG_IMG1; } } void hide_img2 (Display *disp ) /*----------------------------------------------------------------------------- */ { assert (disp != NULL); if (disp->img->exist_img && disp->img->gci_img2 != NULL) { gnome_canvas_item_hide (GNOME_CANVAS_ITEM (disp->img->gci_img2)); disp->display_backgrnd = SHOW_BG_DARKBLUE; } } void show_img2 (Display *disp ) /*----------------------------------------------------------------------------- */ { assert (disp != NULL); if (disp->img->exist_img && disp->img->gci_img2 != NULL) { gnome_canvas_item_show (GNOME_CANVAS_ITEM (disp->img->gci_img2)); disp->display_backgrnd = SHOW_BG_IMG2; } } void destroy_img (Display *disp ) /*----------------------------------------------------------------------------- */ { assert (disp->img->gci_img1 != NULL); gtk_object_destroy(GTK_OBJECT (disp->img->gci_img1)); /* g_free(disp->img->gci_img1); */ disp->img->gci_img1 = NULL; if(display_act->img->image->header->x_corr) { gtk_object_destroy(GTK_OBJECT (disp->img->gci_img2)); disp->img->gci_img2 = NULL; } } GnomeCanvasItem * create_background (Display *disp ) /* ---------------------------------------------------------------------------- * Displays backgroundcolor */ { GnomeCanvasItem *bg = NULL; gchar *color = NULL; if (gpiv_par->display__backgrnd == SHOW_BG_DARKBLUE) { color = "darkblue"; } else if (gpiv_par->display__backgrnd == SHOW_BG_BLACK) { color = "black"; } bg = gnome_canvas_item_new(gnome_canvas_root(GNOME_CANVAS(disp->canvas)), gnome_canvas_rect_get_type(), "x1", (double) 0, "y1", (double) 0, "x2", (double) disp->img->image->header->ncolumns, "y2", (double) disp->img->image->header->nrows, "fill_color", color, "width_units", 1.0, NULL); return bg; } void destroy_background (GnomeCanvasItem *gci ) /*----------------------------------------------------------------------------- */ { assert (gci != NULL); gtk_object_destroy(GTK_OBJECT (gci)); gci = NULL; } gpiv-0.6.1/src/display_image.h0000644000175000017500000000311611110307131013140 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ #ifndef DISPLAY_IMAGE_H #define DISPLAY_IMAGE_H /* * Public image and background functions * Image in a Gnome canvas */ void create_img (Display *disp); void hide_img1 (Display *disp); void show_img1 (Display *disp); void hide_img2 (Display *disp); void show_img2 (Display *disp); void destroy_img (Display *disp); GnomeCanvasItem * create_background (Display *disp); void destroy_background (GnomeCanvasItem *gci); #endif /* DISPLAY_IMAGE_H */ gpiv-0.6.1/src/pivvalid_interface.c0000644000175000017500000013270611110305516014177 00000000000000 /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * PIV Validation interface * $Log: pivvalid_interface.c,v $ * Revision 1.11 2007-12-19 08:42:35 gerber * debugged * * Revision 1.10 2007-11-23 16:24:08 gerber * release 0.5.0: Kafka * * Revision 1.9 2007-01-29 11:27:44 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.8 2006/01/31 14:28:13 gerber * version 0.3.0 * * Revision 1.6 2005/02/12 14:12:12 gerber * Changed tabular names and titles * * Revision 1.5 2005/01/19 15:53:42 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.4 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.3 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.2 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifdef HAVE_CONFIG_H # include #endif #include "gpiv_gui.h" /* #include "console.h" */ #include "utils.h" #include "pivvalid_interface.h" #include "pivvalid.h" PivValid * create_pivvalid (GnomeApp *main_window, GtkWidget *container ) /*----------------------------------------------------------------------------- */ { GpivConsole * gpiv = gtk_object_get_data (GTK_OBJECT (main_window), "gpiv"); PivValid *valid = g_new0(PivValid, 1); valid->vbox_label = gtk_vbox_new (FALSE, 0); gtk_widget_ref(valid->vbox_label); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox_label", valid->vbox_label, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(valid->vbox_label); gtk_container_add (GTK_CONTAINER (container), valid->vbox_label); valid->label_title = gtk_label_new( _("Piv data validation")); gtk_widget_ref(valid->label_title); gtk_object_set_data_full (GTK_OBJECT (main_window), "label_title", valid->label_title, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->label_title); gtk_box_pack_start (GTK_BOX (valid->vbox_label), valid->label_title, FALSE, FALSE, 0); /* * Scrolled window */ valid->vbox_scroll = gtk_vbox_new (FALSE, 0); gtk_widget_ref (valid->vbox_scroll); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox_scroll", valid->vbox_scroll, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->vbox_scroll); gtk_box_pack_start (GTK_BOX (valid->vbox_label), valid->vbox_scroll, TRUE, TRUE, 0); valid->scrolledwindow = gtk_scrolled_window_new (NULL, NULL); gtk_widget_ref (valid->scrolledwindow); gtk_object_set_data_full (GTK_OBJECT (main_window), "scrolledwindow", valid->scrolledwindow, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->scrolledwindow); gtk_box_pack_start (GTK_BOX (valid->vbox_scroll), valid->scrolledwindow, TRUE, TRUE, 0); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (valid->scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); valid->viewport = gtk_viewport_new (NULL, NULL); gtk_widget_ref (valid->viewport); gtk_object_set_data_full (GTK_OBJECT (main_window), "viewport", valid->viewport, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->viewport); gtk_container_add (GTK_CONTAINER (valid->scrolledwindow), valid->viewport); /* * main table for validation */ valid->table = gtk_table_new (2, 2, FALSE); gtk_widget_ref (valid->table); gtk_object_set_data_full (GTK_OBJECT (main_window), "table", valid->table, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->table); gtk_container_add (GTK_CONTAINER (valid->viewport), valid->table); /* * Enable / Disable frame */ valid->frame_disable = gtk_frame_new ( _("Disable data")); gtk_widget_ref (valid->frame_disable); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_disable", valid->frame_disable, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->frame_disable); gtk_table_attach (GTK_TABLE (valid->table), valid->frame_disable, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_SHRINK), 0, 0); valid->vbox_disable = gtk_vbox_new (FALSE, 0); gtk_widget_ref (valid->vbox_disable); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox_disable", valid->vbox_disable, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->vbox_disable); gtk_container_add (GTK_CONTAINER (valid->frame_disable), valid->vbox_disable); valid->radiobutton_disable_0 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("None")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (valid->radiobutton_disable_0)); gtk_widget_ref (valid->radiobutton_disable_0); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_disable_0", valid->radiobutton_disable_0, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->radiobutton_disable_0); gtk_box_pack_start (GTK_BOX (valid->vbox_disable), valid->radiobutton_disable_0, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_disable_0), "valid", valid); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_disable_0), "mouse_select", "0" /* NO_MS */); g_signal_connect (GTK_OBJECT (valid->radiobutton_disable_0), "enter", G_CALLBACK (on_radiobutton_valid_disable_0_enter), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_disable_0), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_disable_0), "toggled", G_CALLBACK (on_radiobutton_valid_disable), NULL); valid->radiobutton_disable_1 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("Enable point")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (valid->radiobutton_disable_1)); gtk_widget_ref (valid->radiobutton_disable_1); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_valid_disable_1", valid->radiobutton_disable_1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->radiobutton_disable_1); gtk_box_pack_start (GTK_BOX (valid->vbox_disable), valid->radiobutton_disable_1, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_disable_1), "valid", valid); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_disable_1), "mouse_select", "7" /* ENABLE_POINT_MS */); g_signal_connect (GTK_OBJECT (valid->radiobutton_disable_1), "enter", G_CALLBACK (on_radiobutton_valid_disable_1_enter), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_disable_1), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_disable_1), "toggled", G_CALLBACK (on_radiobutton_valid_disable), NULL); valid->radiobutton_disable_2 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("Disable point")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (valid->radiobutton_disable_2)); gtk_widget_ref (valid->radiobutton_disable_2); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_disable_2", valid->radiobutton_disable_2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->radiobutton_disable_2); gtk_box_pack_start (GTK_BOX (valid->vbox_disable), valid->radiobutton_disable_2, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_disable_2), "valid", valid); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_disable_2), "mouse_select", "8" /* DISABLE_POINT_MS */); g_signal_connect (GTK_OBJECT (valid->radiobutton_disable_2), "enter", G_CALLBACK (on_radiobutton_valid_disable_2_enter), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_disable_2), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_disable_2), "toggled", G_CALLBACK (on_radiobutton_valid_disable), NULL); valid->radiobutton_disable_3 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("Enable area")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (valid->radiobutton_disable_3)); gtk_widget_ref (valid->radiobutton_disable_3); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_disable_3", valid->radiobutton_disable_3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->radiobutton_disable_3); gtk_box_pack_start (GTK_BOX (valid->vbox_disable), valid->radiobutton_disable_3, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_disable_3), "valid", valid); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_disable_3), "mouse_select", "9" /* ENABLE_AREA_MS */); g_signal_connect (GTK_OBJECT (valid->radiobutton_disable_3), "enter", G_CALLBACK (on_radiobutton_valid_disable_3_enter), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_disable_3), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_disable_3), "toggled", G_CALLBACK (on_radiobutton_valid_disable), NULL); valid->radiobutton_disable_4 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("Disable area")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (valid->radiobutton_disable_4)); gtk_widget_ref (valid->radiobutton_disable_4); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_disable_4", valid->radiobutton_disable_4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->radiobutton_disable_4); gtk_box_pack_start (GTK_BOX (valid->vbox_disable), valid->radiobutton_disable_4, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_disable_4), "valid", valid); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_disable_4), "mouse_select", "10" /* DISABLE_AREA_MS */); g_signal_connect (GTK_OBJECT (valid->radiobutton_disable_4), "enter", G_CALLBACK (on_radiobutton_valid_disable_4_enter), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_disable_4), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_disable_4), "toggled", G_CALLBACK (on_radiobutton_valid_disable), NULL); /* * Button for testing on velocity gradients */ valid->button_gradient = gtk_button_new_with_label ( _("validate on velocity gradient ")); gtk_widget_ref (valid->button_gradient); gtk_object_set_data_full (GTK_OBJECT (main_window), "button_gradient", valid->button_gradient, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->button_gradient); gtk_table_attach (GTK_TABLE (valid->table), valid->button_gradient, 1, 2, 0, 1, (GtkAttachOptions)(GTK_SHRINK /*FILL*/), (GtkAttachOptions)(GTK_SHRINK), 0, 0); gtk_tooltips_set_tip(gpiv->tooltips, valid->button_gradient, _("Disables PIV data that have a too large velocity " "gradient over the Interrogation Area"), NULL); gtk_object_set_data (GTK_OBJECT (valid->button_gradient), "valid", valid); g_signal_connect (GTK_OBJECT (valid->button_gradient), "enter", G_CALLBACK (on_button_valid_gradient_enter), NULL); g_signal_connect (GTK_OBJECT (valid->button_gradient), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->button_gradient), "clicked", G_CALLBACK (on_button_valid_gradient), NULL); /* * Frame for histogram of sub-pixel values (used to test on peak-locking * effect) */ valid->frame_histo = gtk_frame_new ( _("Histograms")); gtk_widget_ref (valid->frame_histo); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_histo", valid->frame_histo, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->frame_histo); gtk_table_attach (GTK_TABLE (valid->table), valid->frame_histo, 0, 1, 1, 2, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), (GtkAttachOptions) /* (GTK_SHRINK) */ (GTK_EXPAND | GTK_FILL), 0, 0); valid->vbox_histo = gtk_vbox_new (FALSE, 0); gtk_widget_ref (valid->vbox_histo); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox_histo", valid->vbox_histo, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->vbox_histo); gtk_container_add (GTK_CONTAINER (valid->frame_histo), valid->vbox_histo); valid->hbox_histo_spin = gtk_hbox_new (FALSE, 0); gtk_widget_ref (valid->hbox_histo_spin); gtk_object_set_data_full (GTK_OBJECT (main_window), "hbox_histo_spin", valid->hbox_histo_spin, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->hbox_histo_spin); gtk_box_pack_start (GTK_BOX (valid->vbox_histo), valid->hbox_histo_spin, FALSE, FALSE, 0); valid->label_histo_bins = gtk_label_new ( _("# bins: ")); gtk_widget_ref (valid->label_histo_bins); gtk_object_set_data_full (GTK_OBJECT (main_window), "label_histo_bins", valid->label_histo_bins, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->label_histo_bins); gtk_box_pack_start (GTK_BOX (valid->hbox_histo_spin), valid->label_histo_bins, FALSE, FALSE, 0); /* * NBINS_DEFAULT defined in gpiv.h */ valid->spinbutton_adj_histo_bins = gtk_adjustment_new (GPIV_NBINS_DEFAULT, 0, 100, 1, 10, 100); valid->spinbutton_histo_bins = gtk_spin_button_new (GTK_ADJUSTMENT (valid->spinbutton_adj_histo_bins), 1, 0); gtk_widget_ref (valid->spinbutton_histo_bins); gtk_object_set_data_full (GTK_OBJECT (main_window), "spinbutton_histo_bins", valid->spinbutton_histo_bins, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->spinbutton_histo_bins); gtk_box_pack_start (GTK_BOX (valid->hbox_histo_spin), valid->spinbutton_histo_bins, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (valid->spinbutton_histo_bins), "valid", valid); g_signal_connect (GTK_OBJECT (valid->spinbutton_histo_bins), "changed", G_CALLBACK (on_spinbutton_valid_peaklck_bins), valid->spinbutton_histo_bins); /* * Gnome2: */ /* gtk_widget_push_colormap (GdkColormap *cmap) */ /* gtk_widget_push_visual (gdk_imlib_get_visual ()); */ /* gtk_widget_push_colormap (gdk_imlib_get_colormap ()); */ valid->canvas_histo = gnome_canvas_new (); gtk_widget_pop_colormap (); gtk_widget_pop_visual (); gtk_widget_ref (valid->canvas_histo); gtk_object_set_data_full (GTK_OBJECT (main_window), "canvas_histo", valid->canvas_histo, (GtkDestroyNotify) gtk_widget_unref); gtk_box_pack_start (GTK_BOX (valid->vbox_histo), valid->canvas_histo, TRUE, TRUE, 0); gtk_widget_show (valid->canvas_histo); valid->hbox_histo_buttons = gtk_hbox_new (FALSE, 0); gtk_widget_ref (valid->hbox_histo_buttons); gtk_object_set_data_full (GTK_OBJECT (main_window), "hbox_histo_buttons", valid->hbox_histo_buttons, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->hbox_histo_buttons); gtk_box_pack_start (GTK_BOX (valid->vbox_histo), valid->hbox_histo_buttons, FALSE, FALSE, 0); valid->button_errvec_resstats = gtk_button_new_with_label ( _("residu")); gtk_widget_ref (valid->button_errvec_resstats); gtk_object_set_data_full (GTK_OBJECT (main_window), "button_errvec_resstats", valid->button_errvec_resstats, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->button_errvec_resstats); gtk_box_pack_start (GTK_BOX (valid->hbox_histo_buttons), valid->button_errvec_resstats, FALSE, FALSE, 0); gtk_tooltips_set_tip(gpiv->tooltips, valid->button_errvec_resstats, _("calculates residus of displacements " "and displays in a histogram"), NULL); gtk_object_set_data (GTK_OBJECT (valid->button_errvec_resstats), "valid", valid); g_signal_connect (GTK_OBJECT (valid->button_errvec_resstats), "enter", G_CALLBACK (on_button_valid_errvec_resstats_enter), NULL); g_signal_connect (GTK_OBJECT (valid->button_errvec_resstats), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->button_errvec_resstats), "clicked", G_CALLBACK (on_button_valid_errvec_resstats), NULL); valid->button_peaklck = gtk_button_new_with_label ( _("sub-pixel")); gtk_widget_ref (valid->button_peaklck); gtk_object_set_data_full (GTK_OBJECT (main_window), "button_peaklck", valid->button_peaklck, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->button_peaklck); gtk_box_pack_start (GTK_BOX (valid->hbox_histo_buttons), valid->button_peaklck, FALSE, FALSE, 0); gtk_tooltips_set_tip(gpiv->tooltips, valid->button_peaklck, _("shows histogram of sub-pixel displacements " "to check on peak-locking effects"), NULL); gtk_object_set_data (GTK_OBJECT (valid->button_peaklck), "valid", valid); g_signal_connect (GTK_OBJECT (valid->button_peaklck), "enter", G_CALLBACK (on_button_valid_peaklck_enter), valid->button_peaklck); g_signal_connect (GTK_OBJECT (valid->button_peaklck), "leave", G_CALLBACK (on_widget_leave), valid->button_peaklck); g_signal_connect (GTK_OBJECT (valid->button_peaklck), "clicked", G_CALLBACK (on_button_valid_peaklck), valid->button_peaklck); valid->button_uhisto = gtk_button_new_with_label ( _("U-comp")); gtk_widget_ref (valid->button_uhisto); gtk_object_set_data_full (GTK_OBJECT (main_window), "button_uhisto", valid->button_uhisto, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->button_uhisto); gtk_box_pack_start (GTK_BOX (valid->hbox_histo_buttons), valid->button_uhisto, FALSE, FALSE, 0); gtk_tooltips_set_tip(gpiv->tooltips, valid->button_uhisto, _("shows histogram of horizontal displacements.\n\ Only this histogram will be saved"), NULL); gtk_object_set_data (GTK_OBJECT (valid->button_uhisto), "valid", valid); g_signal_connect (GTK_OBJECT (valid->button_uhisto), "enter", G_CALLBACK (on_button_valid_uhisto_enter), valid->button_uhisto); g_signal_connect (GTK_OBJECT (valid->button_uhisto), "leave", G_CALLBACK (on_widget_leave), valid->button_uhisto); g_signal_connect (GTK_OBJECT (valid->button_uhisto), "clicked", G_CALLBACK (on_button_valid_uhisto), valid->button_uhisto); valid->button_vhisto = gtk_button_new_with_label ( _("V-comp")); gtk_widget_ref (valid->button_vhisto); gtk_object_set_data_full (GTK_OBJECT (main_window), "button_vhisto", valid->button_vhisto, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->button_vhisto); gtk_box_pack_start (GTK_BOX (valid->hbox_histo_buttons), valid->button_vhisto, FALSE, FALSE, 0); gtk_tooltips_set_tip(gpiv->tooltips, valid->button_vhisto, _("shows histogram of vertical displacements.\n\ Only this histogram will be saved"), NULL); gtk_object_set_data (GTK_OBJECT (valid->button_vhisto), "valid", valid); g_signal_connect (GTK_OBJECT (valid->button_vhisto), "enter", G_CALLBACK (on_button_valid_vhisto_enter), valid->button_vhisto); g_signal_connect (GTK_OBJECT (valid->button_vhisto), "leave", G_CALLBACK (on_widget_leave), valid->button_vhisto); g_signal_connect (GTK_OBJECT (valid->button_vhisto), "clicked", G_CALLBACK (on_button_valid_vhisto), valid->button_vhisto); /* * Errvec frame */ valid->frame_errvec = gtk_frame_new ( _("Outliers")); gtk_widget_ref (valid->frame_errvec); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_errvec", valid->frame_errvec, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->frame_errvec); gtk_table_attach (GTK_TABLE (valid->table), valid->frame_errvec, 1, 2, 1, 2, (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_SHRINK), 0, 0); valid->vbox_errvec = gtk_vbox_new (FALSE, 0); gtk_widget_ref (valid->vbox_errvec); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox_errvec", valid->vbox_errvec, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->vbox_errvec); gtk_container_add (GTK_CONTAINER (valid->frame_errvec), valid->vbox_errvec); /* * Spinner for array length of neighboring PIV data */ valid->hbox_errvec_neighbors_spin = gtk_hbox_new (FALSE, 0); gtk_widget_ref (valid->hbox_errvec_neighbors_spin); gtk_object_set_data_full (GTK_OBJECT (main_window), "hbox_errvec_neighbors_spin", valid->hbox_errvec_neighbors_spin, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->hbox_errvec_neighbors_spin); gtk_box_pack_start (GTK_BOX (valid->vbox_errvec), valid->hbox_errvec_neighbors_spin, TRUE, TRUE, 0); valid->label_errvec_neighbors = gtk_label_new ( _("Neighbors: ")); gtk_widget_ref (valid->label_errvec_neighbors); gtk_object_set_data_full (GTK_OBJECT (main_window), "label_errvec_neighbors", valid->label_errvec_neighbors, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->label_errvec_neighbors); gtk_box_pack_start (GTK_BOX (valid->hbox_errvec_neighbors_spin), valid->label_errvec_neighbors, FALSE, FALSE, 0); valid->spinbutton_adj_errvec_neighbors = gtk_adjustment_new (gl_valid_par->neighbors, 3, GPIV_VALIDPAR_MAX__NEIGHBORS, 2, 2, 2); valid->spinbutton_errvec_neighbors = gtk_spin_button_new (GTK_ADJUSTMENT (valid->spinbutton_adj_errvec_neighbors), 2, 0); gtk_widget_ref (valid->spinbutton_errvec_neighbors); gtk_object_set_data_full (GTK_OBJECT (main_window), "spinbutton_errvec_neighbors", valid->spinbutton_errvec_neighbors, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->spinbutton_errvec_neighbors); gtk_box_pack_start (GTK_BOX (valid->hbox_errvec_neighbors_spin), valid->spinbutton_errvec_neighbors, TRUE, TRUE, 0); gtk_object_set_data (GTK_OBJECT (valid->spinbutton_errvec_neighbors), "valid", valid); g_signal_connect (GTK_OBJECT (valid->spinbutton_errvec_neighbors), "changed", G_CALLBACK (on_spinbutton_valid_errvec_neighbors), NULL); /* * Spinner for data yield */ valid->hbox_errvec_yield_spin = gtk_hbox_new (FALSE, 0); gtk_widget_ref (valid->hbox_errvec_yield_spin); gtk_object_set_data_full (GTK_OBJECT (main_window), "hbox_errvec_yield_spin", valid->hbox_errvec_yield_spin, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->hbox_errvec_yield_spin); gtk_box_pack_start (GTK_BOX (valid->vbox_errvec), valid->hbox_errvec_yield_spin, TRUE, TRUE, 0); valid->label_errvec_yield = gtk_label_new ( _("Data yield: ")); gtk_widget_ref (valid->label_errvec_yield); gtk_object_set_data_full (GTK_OBJECT (main_window), "label_errvec_yield", valid->label_errvec_yield, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->label_errvec_yield); gtk_box_pack_start (GTK_BOX (valid->hbox_errvec_yield_spin), valid->label_errvec_yield, FALSE, FALSE, 0); valid->spinbutton_adj_errvec_yield = gtk_adjustment_new (gl_valid_par->data_yield, 0.0, 1.0, 0.01, 0.1, 0.1); valid->spinbutton_errvec_yield = gtk_spin_button_new (GTK_ADJUSTMENT (valid->spinbutton_adj_errvec_yield), 0.1, 3); gtk_widget_ref (valid->spinbutton_errvec_yield); gtk_object_set_data_full (GTK_OBJECT (main_window), "spinbutton_errvec_yield", valid->spinbutton_errvec_yield, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->spinbutton_errvec_yield); gtk_box_pack_start (GTK_BOX (valid->hbox_errvec_yield_spin), valid->spinbutton_errvec_yield, TRUE, TRUE, 0); gtk_object_set_data (GTK_OBJECT (valid->spinbutton_errvec_yield), "valid", valid); g_signal_connect (GTK_OBJECT (valid->spinbutton_errvec_yield), "changed", G_CALLBACK (on_spinbutton_valid_errvec_yield), NULL); /* * Spinner for threshold residu */ valid->hbox_errvec_residu_spin = gtk_hbox_new (FALSE, 0); gtk_widget_ref (valid->hbox_errvec_residu_spin); gtk_object_set_data_full (GTK_OBJECT (main_window), "hbox_errvec_residu_spin", valid->hbox_errvec_residu_spin, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->hbox_errvec_residu_spin); gtk_box_pack_start (GTK_BOX (valid->vbox_errvec), valid->hbox_errvec_residu_spin, TRUE, TRUE, 0); valid->label_errvec_res = gtk_label_new ( _("Threshold: ")); gtk_widget_ref (valid->label_errvec_res); gtk_object_set_data_full (GTK_OBJECT (main_window), "label_errvec_res", valid->label_errvec_res, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->label_errvec_res); gtk_box_pack_start (GTK_BOX (valid->hbox_errvec_residu_spin), valid->label_errvec_res, FALSE, FALSE, 0); valid->spinbutton_adj_errvec_res = gtk_adjustment_new (gl_valid_par->residu_max, 0., THRESHOLD_MAX, 0.1, 1.0, 1.0); valid->spinbutton_errvec_res = gtk_spin_button_new (GTK_ADJUSTMENT (valid->spinbutton_adj_errvec_res), 0.1, 3); gtk_widget_ref (valid->spinbutton_errvec_res); gtk_object_set_data_full (GTK_OBJECT (main_window), "spinbutton_errvec_res", valid->spinbutton_errvec_res, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->spinbutton_errvec_res); gtk_box_pack_start (GTK_BOX (valid->hbox_errvec_residu_spin), valid->spinbutton_errvec_res, TRUE, TRUE, 0); gtk_object_set_data (GTK_OBJECT (valid->spinbutton_errvec_res), "valid", valid); g_signal_connect (GTK_OBJECT (valid->spinbutton_errvec_res), "changed", G_CALLBACK (on_spinbutton_valid_errvec_res), NULL); valid->checkbutton_errvec_disres = gtk_check_button_new_with_label ( _("Show SNR values")); gtk_widget_ref (valid->checkbutton_errvec_disres); gtk_object_set_data_full (GTK_OBJECT (main_window), "checkbutton_errvec_disres", valid->checkbutton_errvec_disres, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->checkbutton_errvec_disres); gtk_box_pack_start (GTK_BOX (valid->vbox_errvec), valid->checkbutton_errvec_disres, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (valid->checkbutton_errvec_disres), "valid", valid); g_signal_connect (GTK_OBJECT (valid->checkbutton_errvec_disres), "enter", G_CALLBACK (on_checkbutton_valid_errvec_disres_enter), NULL); g_signal_connect (GTK_OBJECT (valid->checkbutton_errvec_disres), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->checkbutton_errvec_disres), "toggled", G_CALLBACK (on_checkbutton_valid_errvec_disres), NULL); if (v_color == SHOW_SNR) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (valid->checkbutton_errvec_disres), TRUE); } valid->frame_errvec_residu = gtk_frame_new ( _("Residu type:")); gtk_widget_ref (valid->frame_errvec_residu); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_errvec_residu", valid->frame_errvec_residu, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->frame_errvec_residu); gtk_box_pack_start (GTK_BOX (valid->vbox_errvec), valid->frame_errvec_residu, FALSE, FALSE, 0); gtk_frame_set_shadow_type (GTK_FRAME (valid->frame_errvec_residu), GTK_SHADOW_NONE); valid->vbox_errvec_residu = gtk_vbox_new (FALSE, 0); gtk_widget_ref (valid->vbox_errvec_residu); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox_errvec_residu", valid->vbox_errvec_residu, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->vbox_errvec_residu); gtk_container_add (GTK_CONTAINER (valid->frame_errvec_residu), valid->vbox_errvec_residu); valid->radiobutton_errvec_residu_normmedian = gtk_radio_button_new_with_label (valid->vbox_errvec_residu_group, _("Normalized median")); valid->vbox_errvec_residu_group = gtk_radio_button_group (GTK_RADIO_BUTTON (valid->radiobutton_errvec_residu_normmedian)); gtk_widget_ref (valid->radiobutton_errvec_residu_normmedian); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_errvec_residu_normmedian", valid->radiobutton_errvec_residu_normmedian, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_errvec_residu_normmedian), "valid", valid); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_errvec_residu_normmedian), "residu", "2"); gtk_widget_show (valid->radiobutton_errvec_residu_normmedian); gtk_box_pack_start (GTK_BOX (valid->vbox_errvec_residu), valid->radiobutton_errvec_residu_normmedian, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_residu_normmedian), "enter", G_CALLBACK (on_radiobutton_valid_errvec_residu_enter), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_residu_normmedian), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_residu_normmedian), "clicked", G_CALLBACK (on_radiobutton_valid_errvec_residu), NULL); if (gl_valid_par->residu_type == 2) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (valid->radiobutton_errvec_residu_normmedian), TRUE); } valid->radiobutton_errvec_residu_median = gtk_radio_button_new_with_label (valid->vbox_errvec_residu_group, _("Median")); valid->vbox_errvec_residu_group = gtk_radio_button_group (GTK_RADIO_BUTTON (valid->radiobutton_errvec_residu_median)); gtk_widget_ref (valid->radiobutton_errvec_residu_median); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_errvec_residu_median", valid->radiobutton_errvec_residu_median, (GtkDestroyNotify) gtk_widget_unref); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_errvec_residu_median), "valid", valid); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_errvec_residu_median), "residu", "1"); gtk_widget_show (valid->radiobutton_errvec_residu_median); gtk_box_pack_start (GTK_BOX (valid->vbox_errvec_residu), valid->radiobutton_errvec_residu_median, FALSE, FALSE, 0); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_residu_median), "enter", G_CALLBACK (on_radiobutton_valid_errvec_residu_enter), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_residu_median), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_residu_median), "clicked", G_CALLBACK (on_radiobutton_valid_errvec_residu), NULL); if (gl_valid_par->residu_type == 1) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (valid->radiobutton_errvec_residu_median), TRUE); } valid->radiobutton_errvec_residu_snr = gtk_radio_button_new_with_label (valid->vbox_errvec_residu_group, _("Snr")); valid->vbox_errvec_residu_group = gtk_radio_button_group (GTK_RADIO_BUTTON (valid->radiobutton_errvec_residu_snr)); gtk_widget_ref (valid->radiobutton_errvec_residu_snr); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_errvec_residu_snr", valid->radiobutton_errvec_residu_snr, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->radiobutton_errvec_residu_snr); gtk_box_pack_start (GTK_BOX (valid->vbox_errvec_residu), valid->radiobutton_errvec_residu_snr, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_errvec_residu_snr), "valid", valid); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_errvec_residu_snr), "residu", "0"); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_residu_snr), "enter", G_CALLBACK (on_radiobutton_valid_errvec_residu_enter), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_residu_snr), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_residu_snr), "toggled", G_CALLBACK (on_radiobutton_valid_errvec_residu), NULL); if (gl_valid_par->residu_type == 0) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (valid->radiobutton_errvec_residu_snr), TRUE); } /* * A long time ago, the GtkWidget valid->button_errvec_resstats was *here*. * Though it felt in love with valid->button_peaklock. * Now they are living happily cheeck tot cheeck. * No, they haven't got child widgets, yet. But maybe, one day ... */ /* * Radio buttons for substitution type */ valid->frame_errvec_subst = gtk_frame_new ( _("Substituted by:")); gtk_widget_ref (valid->frame_errvec_subst); gtk_object_set_data_full (GTK_OBJECT (main_window), "frame_errvec_subst", valid->frame_errvec_subst, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->frame_errvec_subst); gtk_box_pack_start (GTK_BOX (valid->vbox_errvec), valid->frame_errvec_subst, FALSE, FALSE, 0); gtk_frame_set_shadow_type (GTK_FRAME (valid->frame_errvec_subst), GTK_SHADOW_NONE); valid->vbox_errvec_subst = gtk_vbox_new (FALSE, 0); gtk_widget_ref (valid->vbox_errvec_subst); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox_errvec_subst", valid->vbox_errvec_subst, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->vbox_errvec_subst); gtk_container_add (GTK_CONTAINER (valid->frame_errvec_subst), valid->vbox_errvec_subst); valid->radiobutton_errvec_subst_0 = gtk_radio_button_new_with_label(valid->vbox_errvec_subst_group, _("Nothing")); valid->vbox_errvec_subst_group = gtk_radio_button_group (GTK_RADIO_BUTTON (valid->radiobutton_errvec_subst_0)); gtk_widget_ref(valid->radiobutton_errvec_subst_0); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_errvec_subst_0", valid->radiobutton_errvec_subst_0, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(valid->radiobutton_errvec_subst_0); gtk_box_pack_start (GTK_BOX(valid->vbox_errvec_subst), valid->radiobutton_errvec_subst_0, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_errvec_subst_0), "valid", valid); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_errvec_subst_0), "substitute", "0" /* GPIV_VALID_SUBSTYPE__NONE */); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_subst_0), "enter", G_CALLBACK (on_radiobutton_valid_errvec_subst_enter), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_subst_0), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_subst_0), "toggled", G_CALLBACK (on_radiobutton_valid_errvec_subst), NULL); if (gl_valid_par->subst_type == GPIV_VALID_SUBSTYPE__NONE) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (valid->radiobutton_errvec_subst_0), TRUE); } /* * Substitute by mean of surroundings */ valid->radiobutton_errvec_subst_1 = gtk_radio_button_new_with_label (valid->vbox_errvec_subst_group, _("Mean of surroundings")); valid->vbox_errvec_subst_group = gtk_radio_button_group (GTK_RADIO_BUTTON (valid->radiobutton_errvec_subst_1)); gtk_widget_ref (valid->radiobutton_errvec_subst_1); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_errvec_subst_1", valid->radiobutton_errvec_subst_1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(valid->radiobutton_errvec_subst_1); gtk_box_pack_start (GTK_BOX(valid->vbox_errvec_subst), valid->radiobutton_errvec_subst_1, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_errvec_subst_1), "valid", valid); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_errvec_subst_1), "substitute", "1" /* GPIV_VALID_SUBSTYPE__L_MEAN */); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_subst_1), "enter", G_CALLBACK (on_radiobutton_valid_errvec_subst_enter), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_subst_1), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_subst_1), "toggled", G_CALLBACK (on_radiobutton_valid_errvec_subst), NULL); /* * Substitute by median of surroundings */ valid->radiobutton_errvec_subst_2 = gtk_radio_button_new_with_label (valid->vbox_errvec_subst_group, _("Median")); valid->vbox_errvec_subst_group = gtk_radio_button_group (GTK_RADIO_BUTTON (valid->radiobutton_errvec_subst_2)); gtk_widget_ref (valid->radiobutton_errvec_subst_2); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_errvec_subst_2", valid->radiobutton_errvec_subst_2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->radiobutton_errvec_subst_2); gtk_box_pack_start (GTK_BOX (valid->vbox_errvec_subst), valid->radiobutton_errvec_subst_2, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_errvec_subst_2), "valid", valid); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_errvec_subst_2), "substitute", "2" /* GPIV_VALID_SUBSTYPE__MEDIAN */); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_subst_2), "enter", G_CALLBACK(on_radiobutton_valid_errvec_subst_enter), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_subst_2), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_subst_2), "toggled", G_CALLBACK (on_radiobutton_valid_errvec_subst), NULL); if (gl_valid_par->subst_type == GPIV_VALID_SUBSTYPE__MEDIAN ) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (valid->radiobutton_errvec_subst_2), TRUE); } valid->radiobutton_errvec_subst_3 = gtk_radio_button_new_with_label (valid->vbox_errvec_subst_group, _("Next highest corr. peak")); valid->vbox_errvec_subst_group = gtk_radio_button_group (GTK_RADIO_BUTTON (valid->radiobutton_errvec_subst_3)); gtk_widget_ref (valid->radiobutton_errvec_subst_3); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_errvec_subst_3", valid->radiobutton_errvec_subst_3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->radiobutton_errvec_subst_3); gtk_box_pack_start (GTK_BOX (valid->vbox_errvec_subst), valid->radiobutton_errvec_subst_3, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_errvec_subst_3), "valid", valid); gtk_object_set_data (GTK_OBJECT (valid->radiobutton_errvec_subst_3), "substitute", "3" /* GPIV_VALID_SUBSTYPE__COV_PEAK */); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_subst_3), "enter", G_CALLBACK (on_radiobutton_valid_errvec_subst_enter), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_subst_3), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->radiobutton_errvec_subst_3), "toggled", G_CALLBACK (on_radiobutton_valid_errvec_subst), NULL); if (gl_valid_par->subst_type == GPIV_VALID_SUBSTYPE__COR_PEAK) { gtk_toggle_button_set_state (GTK_TOGGLE_BUTTON (valid->radiobutton_errvec_subst_3), TRUE); } valid->button_errvec = gtk_button_new_with_label ( _("validate on outliers")); gtk_widget_ref (valid->button_errvec); gtk_object_set_data_full (GTK_OBJECT (main_window), "button_errvec", valid->button_errvec, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (valid->button_errvec); gtk_box_pack_start (GTK_BOX (valid->vbox_errvec), valid->button_errvec, FALSE, FALSE, 0); gtk_tooltips_set_tip(gpiv->tooltips, valid->button_errvec, _("substitutes outliers"), NULL); gtk_object_set_data (GTK_OBJECT (valid->button_errvec), "valid", valid); g_signal_connect (GTK_OBJECT (valid->button_errvec), "enter", G_CALLBACK (on_button_valid_errvec_enter), NULL); g_signal_connect (GTK_OBJECT (valid->button_errvec), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (valid->button_errvec), "clicked", G_CALLBACK (on_button_valid_errvec), NULL); return valid; } gpiv-0.6.1/src/pivvalid_interface.h0000644000175000017500000001025011110306427014173 00000000000000 /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf Copyright (C) 2002 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * PIV validation tab * $Log: pivvalid_interface.h,v $ * Revision 1.7 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.6 2006/01/31 14:28:13 gerber * version 0.3.0 * * Revision 1.4 2005/01/19 15:53:42 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.3 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.2 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef GPIV_PIVVALID_INTERFACE_H #define GPIV_PIVVALID_INTERFACE_H #define THRESHOLD_MAX 32 typedef struct _PivValid PivValid; struct _PivValid { GtkWidget *vbox_label; GtkWidget *label_title; GtkWidget *vbox_scroll; GtkWidget *scrolledwindow; GtkWidget *viewport; GtkWidget *table; GtkWidget *frame_disable; GtkWidget *vbox_disable; /* GSList *vbox_disable_group; */ /* GSList *disable_group; */ GtkWidget *radiobutton_disable_0; GtkWidget *radiobutton_disable_1; GtkWidget *radiobutton_disable_2; GtkWidget *radiobutton_disable_3; GtkWidget *radiobutton_disable_4; GtkWidget *button_gradient; GtkWidget *frame_errvec; GtkWidget *vbox_errvec; GtkWidget *frame_errvec_residu; GtkWidget *vbox_errvec_residu; GSList *vbox_errvec_residu_group; GtkWidget *radiobutton_errvec_residu_snr; GtkWidget *radiobutton_errvec_residu_median; GtkWidget *radiobutton_errvec_residu_normmedian; GtkWidget *button_errvec_resstats; GtkWidget *hbox_errvec_neighbors_spin; GtkWidget *label_errvec_neighbors; GtkObject *spinbutton_adj_errvec_neighbors; GtkWidget *spinbutton_errvec_neighbors; GtkWidget *hbox_errvec_yield_spin; GtkWidget *label_errvec_yield; GtkObject *spinbutton_adj_errvec_yield; GtkWidget *spinbutton_errvec_yield; GtkWidget *hbox_errvec_residu_spin; GtkWidget *label_errvec_res; GtkObject *spinbutton_adj_errvec_res; GtkWidget *spinbutton_errvec_res; GtkWidget *checkbutton_errvec_disres; GtkWidget *frame_errvec_subst; GtkWidget *vbox_errvec_subst; GSList *vbox_errvec_subst_group; GtkWidget *radiobutton_errvec_subst_0; GtkWidget *radiobutton_errvec_subst_1; GtkWidget *radiobutton_errvec_subst_2; GtkWidget *radiobutton_errvec_subst_3; GtkWidget *button_errvec; GtkWidget *frame_histo; GtkWidget *vbox_histo; GtkWidget *hbox_histo_spin; GtkWidget *label_histo_bins; GtkObject *spinbutton_adj_histo_bins; GtkWidget *spinbutton_histo_bins; GtkWidget *hbox_histo_buttons; GtkWidget *button_peaklck; GtkWidget *button_uhisto; GtkWidget *button_vhisto; GtkWidget *canvas_histo; GtkWidget *label; }; PivValid * create_pivvalid (GnomeApp *main_window, GtkWidget *container); #endif /* GPIV_PIVVALID_INTERFACE_H */ gpiv-0.6.1/src/imgh_interface.c0000644000175000017500000013754411110305704013311 00000000000000/* -*- Mode: C; indent-tabs-mode: nil; c-basic-offset: 4 c-style: "K&R" -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * Image header interface * $Log: imgh_interface.c,v $ * Revision 1.13 2007-11-23 16:24:07 gerber * release 0.5.0: Kafka * * Revision 1.12 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.11 2007-03-22 16:00:32 gerber * Added image processing tabulator * * Revision 1.10 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.9 2006-09-18 07:27:06 gerber * *** empty log message *** * * Revision 1.8 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.6 2005/02/26 09:17:13 gerber * structured of interrogate function by using gpiv_piv_isiadapt * * Revision 1.5 2005/01/19 15:53:42 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.4 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.3 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.2 2003/07/25 15:40:23 gerber * removed/disabled setting of correlation in Eval tab, Correlation type in Image info tab * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifdef HAVE_CONFIG_H # include #endif #include "gpiv_gui.h" #include "imgh_interface.h" #include "utils.h" #include "console.h" #include "imgh.h" #include "pivpost.h" Imgheader * create_imgh (GnomeApp *main_window, GtkWidget *container ) /*----------------------------------------------------------------------------- * Image Info window with data from header */ { GpivConsole *gpiv = gtk_object_get_data (GTK_OBJECT (main_window), "gpiv"); Imgheader *imgh = g_new0 (Imgheader, 1); imgh->vbox_label = gtk_vbox_new (FALSE, 0); gtk_widget_ref (imgh->vbox_label); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_vbox_label", imgh->vbox_label, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->vbox_label); gtk_container_add (GTK_CONTAINER (container), imgh->vbox_label); imgh->label_title = gtk_label_new(_("Image information and settings")); gtk_widget_ref(imgh->label_title); gtk_object_set_data_full(GTK_OBJECT(main_window), "imgh->label_title", imgh->label_title, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_title); gtk_box_pack_start (GTK_BOX (imgh->vbox_label), imgh->label_title, FALSE, FALSE, 0); /* * Scrolled window */ imgh->vbox_scroll = gtk_vbox_new (FALSE, 0); gtk_widget_ref (imgh->vbox_scroll); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_vbox_scroll", imgh->vbox_scroll, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->vbox_scroll); gtk_box_pack_start (GTK_BOX (imgh->vbox_label), imgh->vbox_scroll, TRUE, TRUE, 0); imgh->scrolledwindow = gtk_scrolled_window_new (NULL, NULL); gtk_widget_ref (imgh->scrolledwindow); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_scrolledwindow", imgh->scrolledwindow, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->scrolledwindow); gtk_box_pack_start (GTK_BOX (imgh->vbox_scroll), imgh->scrolledwindow, TRUE, TRUE, 0); gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (imgh->scrolledwindow), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC); imgh->viewport = gtk_viewport_new (NULL, NULL); gtk_widget_ref (imgh->viewport); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_viewport", imgh->viewport, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->viewport); gtk_container_add (GTK_CONTAINER (imgh->scrolledwindow), imgh->viewport); /* * main table for image header table/window */ imgh->vbox1 = gtk_vbox_new (FALSE, 0); gtk_widget_ref (imgh->vbox1); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh->vbox1", imgh->vbox1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->vbox1); gtk_container_add (GTK_CONTAINER (imgh->viewport), imgh->vbox1); /* * buffer number */ imgh->hbox_bufno = gtk_hbox_new (FALSE, 0); gtk_widget_ref (imgh->hbox_bufno); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_hbox_bufno", imgh->hbox_bufno, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->hbox_bufno); gtk_box_pack_start (GTK_BOX (imgh->vbox1), imgh->hbox_bufno, TRUE, TRUE, 0); imgh->label_label_bufno = gtk_label_new ( _("buffer #: ")); gtk_widget_ref (imgh->label_label_bufno); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_label_bufno", imgh->label_label_bufno, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_label_bufno); gtk_box_pack_start (GTK_BOX (imgh->hbox_bufno), imgh->label_label_bufno, FALSE, FALSE, 0); imgh->label_bufno = gtk_label_new (""); gtk_widget_ref (imgh->label_bufno); gtk_object_set_data_full (GTK_OBJECT (main_window), "imh_label_bufno", imgh->label_bufno, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_bufno); gtk_box_pack_start (GTK_BOX (imgh->hbox_bufno), imgh->label_bufno, FALSE, FALSE, 0); /* * buffer name */ imgh->hbox_name = gtk_hbox_new (FALSE, 0); gtk_widget_ref (imgh->hbox_name); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh->hbox_name", imgh->hbox_name, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->hbox_name); gtk_box_pack_start (GTK_BOX (imgh->vbox1), imgh->hbox_name, TRUE, TRUE, 0); imgh->label_label_name = gtk_label_new ( _("file: ")); gtk_widget_ref (imgh->label_label_name); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_label_name", imgh->label_label_name, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_label_name); gtk_box_pack_start (GTK_BOX (imgh->hbox_name), imgh->label_label_name, FALSE, FALSE, 0); imgh->label_name = gtk_label_new (""); gtk_widget_ref (imgh->label_name); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_name", imgh->label_name, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_name); gtk_box_pack_start (GTK_BOX (imgh->hbox_name), imgh->label_name, FALSE, FALSE, 0); imgh->table5 = gtk_table_new (9, 2, FALSE); gtk_widget_ref (imgh->table5); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh->table5", imgh->table5, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->table5); gtk_box_pack_start (GTK_BOX (imgh->vbox1), imgh->table5, TRUE, FALSE, 0); /* viewport_imgh */ /* * label for correlation */ imgh->label_label_correlation = gtk_label_new ( _("correlation type: ")); gtk_widget_ref (imgh->label_label_correlation); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_label_correlation", imgh->label_label_correlation, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_label_correlation); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->label_label_correlation, 0, 1, 0, 1, (GtkAttachOptions) (GTK_EXPAND), (GtkAttachOptions) (0), 0, 0); imgh->label_correlation = gtk_label_new (IMAGE_CORRELATION_LABEL); gtk_widget_ref (imgh->label_correlation); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_correlation", imgh->label_correlation, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_correlation); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->label_correlation, 1, 2, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); /* * label for ncols */ imgh->label_label_ncols = gtk_label_new ( _("number of columns (pixels): ")); gtk_widget_ref (imgh->label_label_ncols); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_label_ncols", imgh->label_label_ncols, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_label_ncols); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->label_label_ncols, 0, 1, 1, 2, (GtkAttachOptions) (GTK_EXPAND), (GtkAttachOptions) (0), 0, 0); imgh->label_ncols = gtk_label_new (IMAGE_WIDTH_LABEL); gtk_widget_ref (imgh->label_ncols); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_ncols", imgh->label_ncols, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_ncols); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->label_ncols, 1, 2, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); /* * label for nrows */ imgh->label_label_nrows = gtk_label_new ( _("number of rows (pixels): ")); gtk_widget_ref (imgh->label_label_nrows); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_label_nrows", imgh->label_label_nrows, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_label_nrows); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->label_label_nrows, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->label_nrows = gtk_label_new (IMAGE_HEIGHT_LABEL); gtk_widget_ref (imgh->label_nrows); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_nrows", imgh->label_nrows, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_nrows); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->label_nrows, 1, 2, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); /* * label for depth */ imgh->label_label_depth = gtk_label_new ( _("image depth (bits): ")); gtk_widget_ref (imgh->label_label_depth); gtk_object_set_data_full (GTK_OBJECT (main_window), "imh_label_label_depth", imgh->label_label_depth, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_label_depth); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->label_label_depth, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->label_depth = gtk_label_new (IMAGE_DEPTH_LABEL); gtk_widget_ref (imgh->label_depth); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_depth", imgh->label_depth, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_depth); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->label_depth, 1, 2, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); /* * frame, table and spinners for spatial scale "sscale" * * radio buttons and spinners defining spatial scale interactively * with pointer in image */ imgh->frame_sscale = gtk_frame_new ( _("Define spatial scale")); gtk_widget_ref (imgh->frame_sscale); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_frame_sscale", imgh->frame_sscale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->frame_sscale); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->frame_sscale, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->table_sscale = gtk_table_new (4, 2, FALSE); gtk_widget_ref (imgh->table_sscale); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_table_sscale", imgh->table_sscale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->table_sscale); gtk_container_add (GTK_CONTAINER (imgh->frame_sscale), imgh->table_sscale); imgh->vbox_sscale = gtk_vbox_new (FALSE, 0); gtk_widget_ref (imgh->vbox_sscale); gtk_object_set_data_full (GTK_OBJECT (main_window), "vbox_sscale", imgh->vbox_sscale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->vbox_sscale); gtk_table_attach (GTK_TABLE (imgh->table_sscale), imgh->vbox_sscale, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) 0, 0, 0); imgh->radiobutton_mouse_1 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("None")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (imgh->radiobutton_mouse_1)); gtk_widget_ref (imgh->radiobutton_mouse_1); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_mouse_1", imgh->radiobutton_mouse_1, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->radiobutton_mouse_1); gtk_box_pack_start (GTK_BOX (imgh->vbox_sscale), imgh->radiobutton_mouse_1, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (imgh->radiobutton_mouse_1), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (imgh->radiobutton_mouse_1), "mouse_select", "0" /* NO_MS */); g_signal_connect (GTK_OBJECT (imgh->radiobutton_mouse_1), "enter", G_CALLBACK (on_radiobutton_imgh_mouse_1_enter), NULL); g_signal_connect (GTK_OBJECT (imgh->radiobutton_mouse_1), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (imgh->radiobutton_mouse_1), "toggled", G_CALLBACK (on_radiobutton_imgh_mouse), NULL); imgh->radiobutton_mouse_2 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("Spanned length")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (imgh->radiobutton_mouse_2)); gtk_widget_ref (imgh->radiobutton_mouse_2); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_mouse_2", imgh->radiobutton_mouse_2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->radiobutton_mouse_2); gtk_box_pack_start (GTK_BOX (imgh->vbox_sscale), imgh->radiobutton_mouse_2, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (imgh->radiobutton_mouse_2), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (imgh->radiobutton_mouse_2), "mouse_select", "11" /* SPANLENGTH */); g_signal_connect (GTK_OBJECT (imgh->radiobutton_mouse_2), "enter", G_CALLBACK (on_radiobutton_imgh_mouse_2_enter), NULL); g_signal_connect (GTK_OBJECT (imgh->radiobutton_mouse_2), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (imgh->radiobutton_mouse_2), "toggled", G_CALLBACK (on_radiobutton_imgh_mouse), NULL); imgh->radiobutton_mouse_3 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("Vertical spanned length")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (imgh->radiobutton_mouse_3)); gtk_widget_ref (imgh->radiobutton_mouse_3); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_mouse_3", imgh->radiobutton_mouse_3, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->radiobutton_mouse_3); gtk_box_pack_start (GTK_BOX (imgh->vbox_sscale), imgh->radiobutton_mouse_3, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (imgh->radiobutton_mouse_3), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (imgh->radiobutton_mouse_3), "mouse_select", "12" /* V_SPANLENGTH */); g_signal_connect (GTK_OBJECT (imgh->radiobutton_mouse_3), "enter", G_CALLBACK (on_radiobutton_imgh_mouse_3_enter), NULL); g_signal_connect (GTK_OBJECT (imgh->radiobutton_mouse_3), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (imgh->radiobutton_mouse_3), "toggled", G_CALLBACK (on_radiobutton_imgh_mouse), NULL); imgh->radiobutton_mouse_4 = gtk_radio_button_new_with_label (gpiv->mouse_sel_group, _("Horizontal spanned length")); gpiv->mouse_sel_group = gtk_radio_button_group (GTK_RADIO_BUTTON (imgh->radiobutton_mouse_4)); gtk_widget_ref (imgh->radiobutton_mouse_4); gtk_object_set_data_full (GTK_OBJECT (main_window), "radiobutton_mouse_4", imgh->radiobutton_mouse_4, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->radiobutton_mouse_4); gtk_box_pack_start (GTK_BOX (imgh->vbox_sscale), imgh->radiobutton_mouse_4, FALSE, FALSE, 0); gtk_object_set_data (GTK_OBJECT (imgh->radiobutton_mouse_4), "gpiv", gpiv); gtk_object_set_data (GTK_OBJECT (imgh->radiobutton_mouse_4), "mouse_select", "13" /* H_SPANLENGTH */); g_signal_connect (GTK_OBJECT (imgh->radiobutton_mouse_4), "enter", G_CALLBACK (on_radiobutton_imgh_mouse_4_enter), NULL); g_signal_connect (GTK_OBJECT (imgh->radiobutton_mouse_4), "leave", G_CALLBACK (on_widget_leave), NULL); g_signal_connect (GTK_OBJECT (imgh->radiobutton_mouse_4), "toggled", G_CALLBACK (on_radiobutton_imgh_mouse), NULL); imgh->label_sscale_px = gtk_label_new ( _("span (pixels): ")); gtk_widget_ref (imgh->label_sscale_px); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_sscale_px", imgh->label_sscale_px, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_sscale_px); gtk_table_attach (GTK_TABLE (imgh->table_sscale), imgh->label_sscale_px, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->spinbutton_adj_sscale_px = gtk_adjustment_new (gpiv_var->img_span_px, 1, IMAGE_WIDTH_MAX, 1, 100, IMAGE_WIDTH_MAX); imgh->spinbutton_sscale_px = gtk_spin_button_new (GTK_ADJUSTMENT (imgh->spinbutton_adj_sscale_px), 1, 4); gtk_widget_ref (imgh->spinbutton_sscale_px); gtk_widget_show (imgh->spinbutton_sscale_px); gtk_table_attach (GTK_TABLE (imgh->table_sscale), imgh->spinbutton_sscale_px, 1, 2, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (imgh->spinbutton_sscale_px), TRUE); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (imgh->spinbutton_sscale_px), TRUE); gtk_object_set_data (GTK_OBJECT (imgh->spinbutton_sscale_px), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (imgh->spinbutton_sscale_px), "changed", G_CALLBACK (on_spinbutton_post_scale_px), imgh->spinbutton_sscale_px); imgh->label_sscale_mm = gtk_label_new ( _("length (mm): ")); gtk_widget_ref (imgh->label_sscale_mm); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_sscale_mm", imgh->label_sscale_mm, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_sscale_mm); gtk_table_attach (GTK_TABLE (imgh->table_sscale), imgh->label_sscale_mm, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->spinbutton_adj_sscale_mm = gtk_adjustment_new (gpiv_var->img_length_mm, 0.0001, 500.0, ADJ_STEP, 10.0, 500.0); imgh->spinbutton_sscale_mm = gtk_spin_button_new (GTK_ADJUSTMENT (imgh->spinbutton_adj_sscale_mm), 1, 4); gtk_widget_ref (imgh->spinbutton_sscale_mm); gtk_widget_show (imgh->spinbutton_sscale_mm); gtk_table_attach (GTK_TABLE (imgh->table_sscale), imgh->spinbutton_sscale_mm, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (imgh->spinbutton_sscale_mm), TRUE); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (imgh->spinbutton_sscale_mm), TRUE); gtk_object_set_data (GTK_OBJECT (imgh->spinbutton_sscale_mm), "gpiv", gpiv); g_signal_connect (GTK_OBJECT (imgh->spinbutton_sscale_mm), "changed", G_CALLBACK (on_spinbutton_post_scale_mm), imgh->spinbutton_sscale_mm); /* * spinner for spatial scale "sscale" */ imgh->label_sscale = gtk_label_new ( _("spatial scale (mm/pixels): ")); gtk_widget_ref (imgh->label_sscale); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_sscale", imgh->label_sscale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_sscale); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->label_sscale, 0, 1, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->spinbutton_adj_sscale = gtk_adjustment_new (gl_image_par->s_scale, 0, ADJ_MAX, ADJ_STEP, ADJ_PAGE, ADJ_MAX); imgh->spinbutton_sscale = gtk_spin_button_new (GTK_ADJUSTMENT (imgh->spinbutton_adj_sscale), 1, 4); gtk_widget_ref (imgh->spinbutton_sscale); gtk_widget_show (imgh->spinbutton_sscale); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->spinbutton_sscale, 1, 2, 5, 6, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (imgh->spinbutton_sscale), TRUE); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (imgh->spinbutton_sscale), TRUE); gtk_object_set_data (GTK_OBJECT (imgh->spinbutton_sscale), "var_type", "3"); g_signal_connect (GTK_OBJECT (imgh->spinbutton_sscale), "changed", G_CALLBACK (on_spinbutton_post_scale), imgh->spinbutton_sscale); /* * spinner for time scale "tscale" */ imgh->label_tscale = gtk_label_new ( _("time scale (ms): ")); gtk_widget_ref (imgh->label_tscale); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_tscale", imgh->label_tscale, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_tscale); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->label_tscale, 0, 1, 6, 7, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->spinbutton_adj_tscale = gtk_adjustment_new (gl_image_par->t_scale, 0, ADJ_MAX, ADJ_STEP, ADJ_PAGE, ADJ_MAX); imgh->spinbutton_tscale = gtk_spin_button_new (GTK_ADJUSTMENT (imgh->spinbutton_adj_tscale), 1, 4); gtk_widget_ref (imgh->spinbutton_tscale); gtk_widget_show (imgh->spinbutton_tscale); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->spinbutton_tscale, 1, 2, 6, 7, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (imgh->spinbutton_tscale), TRUE); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (imgh->spinbutton_tscale), TRUE); gtk_object_set_data (GTK_OBJECT (imgh->spinbutton_tscale), "var_type", "4"); g_signal_connect (GTK_OBJECT (imgh->spinbutton_tscale), "changed", G_CALLBACK (on_spinbutton_post_scale), imgh->spinbutton_tscale); imgh->table2 = gtk_table_new (16, 2, FALSE); gtk_widget_ref (imgh->table2); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh->table2", imgh->table2, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->table2); gtk_box_pack_end (GTK_BOX (imgh->vbox1), imgh->table2, TRUE, FALSE, 0); /* * spinner for column position */ imgh->label_colpos = gtk_label_new ( _("position of column #0 (m): ")); gtk_widget_ref (imgh->label_colpos); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_colpos", imgh->label_colpos, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_colpos); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->label_colpos, 0, 1, 7, 8, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->spinbutton_adj_colpos = gtk_adjustment_new (gl_image_par->z_off_x, ADJ_MIN, ADJ_MAX, ADJ_STEP, ADJ_PAGE, ADJ_MAX); imgh->spinbutton_colpos = gtk_spin_button_new (GTK_ADJUSTMENT (imgh->spinbutton_adj_colpos), 1, 4); gtk_widget_ref (imgh->spinbutton_colpos); gtk_widget_show (imgh->spinbutton_colpos); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->spinbutton_colpos, 1, 2, 7, 8, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (imgh->spinbutton_colpos), TRUE); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (imgh->spinbutton_colpos), TRUE); gtk_object_set_data (GTK_OBJECT (imgh->spinbutton_colpos), "var_type", "1"); g_signal_connect (GTK_OBJECT (imgh->spinbutton_colpos), "changed", G_CALLBACK (on_spinbutton_post_scale), imgh->spinbutton_colpos); /* * spinner for row position */ imgh->label_rowpos = gtk_label_new ( _("position of row #0 (m): ")); gtk_widget_ref (imgh->label_rowpos); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_rowpos", imgh->label_rowpos, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_rowpos); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->label_rowpos, 0, 1, 8, 9, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->spinbutton_adj_rowpos = gtk_adjustment_new (gl_image_par->z_off_y, ADJ_MIN, ADJ_MAX, ADJ_STEP, ADJ_PAGE, ADJ_MAX); imgh->spinbutton_rowpos = gtk_spin_button_new (GTK_ADJUSTMENT (imgh->spinbutton_adj_rowpos), 1, 4); gtk_widget_ref (imgh->spinbutton_rowpos); gtk_widget_show (imgh->spinbutton_rowpos); gtk_table_attach (GTK_TABLE (imgh->table5), imgh->spinbutton_rowpos, 1, 2, 8, 9, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_editable (GTK_ENTRY (imgh->spinbutton_rowpos), TRUE); gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (imgh->spinbutton_rowpos), TRUE); gtk_object_set_data (GTK_OBJECT (imgh->spinbutton_rowpos), "var_type", "2"); g_signal_connect (GTK_OBJECT (imgh->spinbutton_rowpos), "changed", G_CALLBACK (on_spinbutton_post_scale), imgh->spinbutton_rowpos); /* * entry for project */ imgh->label_imgtitle = gtk_label_new ( _("Title: ")); gtk_widget_ref (imgh->label_imgtitle); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_imgtitle", imgh->label_imgtitle, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_imgtitle); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->label_imgtitle, 0, 1, 0, 1, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_padding (GTK_MISC (imgh->label_imgtitle), 14, 0); imgh->entry_imgtitle = gtk_entry_new (); gtk_widget_ref (imgh->entry_imgtitle); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_entry_imgtitle", imgh->entry_imgtitle, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->entry_imgtitle); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->entry_imgtitle, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_object_set_data (GTK_OBJECT (imgh->entry_imgtitle), "imgh", imgh); g_signal_connect (GTK_OBJECT (imgh->entry_imgtitle), "changed", G_CALLBACK (on_entry_imgh_title), imgh->entry_imgtitle); if (gl_image_par->title__set) { gtk_entry_set_text(GTK_ENTRY(imgh->entry_imgtitle), gl_image_par->title); } /* * entry for creation date */ imgh->label_crdate = gtk_label_new ( _("Creation date: ")); gtk_widget_ref (imgh->label_crdate); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_crdate", imgh->label_crdate, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_crdate); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->label_crdate, 0, 1, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (imgh->label_crdate), 2.98023e-07, 0.5); gtk_misc_set_padding (GTK_MISC (imgh->label_crdate), 11, 0); imgh->entry_crdate = gtk_entry_new (); gtk_widget_ref (imgh->entry_crdate); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_entry_crdate", imgh->entry_crdate, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->entry_crdate); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->entry_crdate, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_object_set_data (GTK_OBJECT (imgh->entry_crdate), "imgh", imgh); g_signal_connect (GTK_OBJECT (imgh->entry_crdate), "changed", G_CALLBACK (on_entry_imgh_crdate), imgh->entry_crdate); if (gl_image_par->creation_date__set) { gtk_entry_set_text(GTK_ENTRY(imgh->entry_crdate), gl_image_par->creation_date); } /* * entry for location */ imgh->label_location = gtk_label_new ( _("Place: ")); gtk_widget_ref (imgh->label_location); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_location", imgh->label_location, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_location); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->label_location, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->entry_location = gtk_entry_new (); gtk_widget_ref (imgh->entry_location); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_entry_location", imgh->entry_location, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->entry_location); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->entry_location, 1, 2, 2, 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_object_set_data (GTK_OBJECT (imgh->entry_location), "imgh", imgh); g_signal_connect (GTK_OBJECT (imgh->entry_location), "changed", G_CALLBACK (on_entry_imgh_location), imgh->entry_location); if (gl_image_par->location__set) { gtk_entry_set_text(GTK_ENTRY(imgh->entry_location), gl_image_par->location); } /* * entry for author */ imgh->label_author = gtk_label_new ( _("Author: ")); gtk_widget_ref (imgh->label_author); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_author", imgh->label_author, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_author); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->label_author, 0, 1, 3, 4, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->entry_author = gtk_entry_new (); gtk_widget_ref (imgh->entry_author); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_entry_author", imgh->entry_author, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->entry_author); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->entry_author, 1, 2, 3, 4, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_object_set_data (GTK_OBJECT (imgh->entry_author), "imgh", imgh); g_signal_connect (GTK_OBJECT (imgh->entry_author), "changed", G_CALLBACK (on_entry_imgh_author), imgh->entry_author); if (gl_image_par->author__set) { gtk_entry_set_text(GTK_ENTRY(imgh->entry_author), gl_image_par->author); } /* * entry for software */ imgh->label_software = gtk_label_new ( _("Software: ")); gtk_widget_ref (imgh->label_software); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_software", imgh->label_software, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_software); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->label_software, 0, 1, 4, 5, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->entry_software = gtk_entry_new (); gtk_widget_ref (imgh->entry_software); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_entry_software", imgh->entry_software, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->entry_software); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->entry_software, 1, 2, 4, 5, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_object_set_data (GTK_OBJECT (imgh->entry_software), "imgh", imgh); g_signal_connect (GTK_OBJECT (imgh->entry_software), "changed", G_CALLBACK (on_entry_imgh_software), imgh->entry_software); if (gl_image_par->software__set) { gtk_entry_set_text(GTK_ENTRY(imgh->entry_software), gl_image_par->software); } /* * entry for source */ imgh->label_source = gtk_label_new ( _("Source: ")); gtk_widget_ref (imgh->label_source); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_source", imgh->label_source, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_source); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->label_source, 0, 1, 5, 6, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->entry_source = gtk_entry_new (); gtk_widget_ref (imgh->entry_source); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_entry_source", imgh->entry_source, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->entry_source); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->entry_source, 1, 2, 5, 6, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_object_set_data (GTK_OBJECT (imgh->entry_source), "imgh", imgh); g_signal_connect (GTK_OBJECT (imgh->entry_source), "changed", G_CALLBACK (on_entry_imgh_source), imgh->entry_source); if (gl_image_par->source__set) { gtk_entry_set_text(GTK_ENTRY(imgh->entry_source), gl_image_par->source); } /* * entry for usertext */ imgh->label_usertext = gtk_label_new ( _("Usertext: ")); gtk_widget_ref (imgh->label_usertext); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_usertext", imgh->label_usertext, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_usertext); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->label_usertext, 0, 1, 6, 7, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->entry_usertext = gtk_entry_new (); gtk_widget_ref (imgh->entry_usertext); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_entry_usertext", imgh->entry_usertext, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->entry_usertext); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->entry_usertext, 1, 2, 6, 7, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_object_set_data (GTK_OBJECT (imgh->entry_usertext), "imgh", imgh); g_signal_connect (GTK_OBJECT (imgh->entry_usertext), "changed", G_CALLBACK (on_entry_imgh_usertext), imgh->entry_usertext); if (gl_image_par->usertext__set) { gtk_entry_set_text(GTK_ENTRY(imgh->entry_usertext), gl_image_par->usertext); } /* * entry for warning */ imgh->label_warning = gtk_label_new ( _("Warning: ")); gtk_widget_ref (imgh->label_warning); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_warning", imgh->label_warning, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_warning); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->label_warning, 0, 1, 7, 8, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->entry_warning = gtk_entry_new (); gtk_widget_ref (imgh->entry_warning); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_entry_warning", imgh->entry_warning, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->entry_warning); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->entry_warning, 1, 2, 7, 8, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_object_set_data (GTK_OBJECT (imgh->entry_warning), "imgh", imgh); g_signal_connect (GTK_OBJECT (imgh->entry_warning), "changed", G_CALLBACK (on_entry_imgh_warning), imgh->entry_warning); if (gl_image_par->warning__set) { gtk_entry_set_text(GTK_ENTRY(imgh->entry_warning), gl_image_par->warning); } /* * entry for disclaimer */ imgh->label_disclaimer = gtk_label_new ( _("Disclaimer: ")); gtk_widget_ref (imgh->label_disclaimer); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_disclaimer", imgh->label_disclaimer, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_disclaimer); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->label_disclaimer, 0, 1, 8, 9, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->entry_disclaimer = gtk_entry_new (); gtk_widget_ref (imgh->entry_disclaimer); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_entry_disclaimer", imgh->entry_disclaimer, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->entry_disclaimer); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->entry_disclaimer, 1, 2, 8, 9, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_object_set_data (GTK_OBJECT (imgh->entry_disclaimer), "imgh", imgh); g_signal_connect (GTK_OBJECT (imgh->entry_disclaimer), "changed", G_CALLBACK (on_entry_imgh_disclaimer), imgh->entry_disclaimer); if (gl_image_par->disclaimer__set) { gtk_entry_set_text(GTK_ENTRY(imgh->entry_disclaimer), gl_image_par->disclaimer); } /* * entry for comment */ imgh->label_comment = gtk_label_new ( _("Comment: ")); gtk_widget_ref (imgh->label_comment); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_comment", imgh->label_comment, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_comment); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->label_comment, 0, 1, 9, 10, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->entry_comment = gtk_entry_new (); gtk_widget_ref (imgh->entry_comment); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_entry_comment", imgh->entry_comment, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->entry_comment); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->entry_comment, 1, 2, 9, 10, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_object_set_data (GTK_OBJECT (imgh->entry_comment), "imgh", imgh); g_signal_connect (GTK_OBJECT (imgh->entry_comment), "changed", G_CALLBACK (on_entry_imgh_comment), imgh->entry_comment); if (gl_image_par->comment__set) { gtk_entry_set_text(GTK_ENTRY(imgh->entry_comment), gl_image_par->comment); } /* * entry for copyright */ imgh->label_copyright = gtk_label_new ( _("Copyright: ")); gtk_widget_ref (imgh->label_copyright); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_copyright", imgh->label_copyright, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_copyright); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->label_copyright, 0, 1, 11, 12, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->entry_copyright = gtk_entry_new (); gtk_widget_ref (imgh->entry_copyright); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_entry_copyright", imgh->entry_copyright, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->entry_copyright); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->entry_copyright, 1, 2, 11, 12, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_object_set_data (GTK_OBJECT (imgh->entry_copyright), "imgh", imgh); g_signal_connect (GTK_OBJECT (imgh->entry_copyright), "changed", G_CALLBACK (on_entry_imgh_copyright), imgh->entry_copyright); if (gl_image_par->copyright__set) { gtk_entry_set_text(GTK_ENTRY(imgh->entry_copyright), gl_image_par->copyright); } /* * entry for email */ imgh->label_email = gtk_label_new ( _("Email: ")); gtk_widget_ref (imgh->label_email); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_email", imgh->label_email, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_email); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->label_email, 0, 1, 13, 14, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->entry_email = gtk_entry_new (); gtk_widget_ref (imgh->entry_email); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_entry_email", imgh->entry_email, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->entry_email); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->entry_email, 1, 2, 13, 14, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_object_set_data (GTK_OBJECT (imgh->entry_email), "imgh", imgh); g_signal_connect (GTK_OBJECT (imgh->entry_email), "changed", G_CALLBACK (on_entry_imgh_email), imgh->entry_email); if (gl_image_par->email__set) { gtk_entry_set_text(GTK_ENTRY(imgh->entry_email), gl_image_par->email); } /* * entry for url */ imgh->label_url = gtk_label_new ( _("Url: ")); gtk_widget_ref (imgh->label_url); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_label_url", imgh->label_url, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->label_url); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->label_url, 0, 1, 15, 16, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); imgh->entry_url = gtk_entry_new (); gtk_widget_ref (imgh->entry_url); gtk_object_set_data_full (GTK_OBJECT (main_window), "imgh_entry_url", imgh->entry_url, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (imgh->entry_url); gtk_table_attach (GTK_TABLE (imgh->table2), imgh->entry_url, 1, 2, 15, 16, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_object_set_data (GTK_OBJECT (imgh->entry_url), "imgh", imgh); g_signal_connect (GTK_OBJECT (imgh->entry_url), "changed", G_CALLBACK (on_entry_imgh_url), imgh->entry_url); if (gl_image_par->url__set) { gtk_entry_set_text(GTK_ENTRY(imgh->entry_url), gl_image_par->url); } return imgh; } gpiv-0.6.1/src/imgh_interface.h0000644000175000017500000001065411110306712013306 00000000000000 /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * Image header tab * $Log: imgh_interface.h,v $ * Revision 1.7 2007-01-29 11:27:43 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.6 2006/01/31 14:28:12 gerber * version 0.3.0 * * Revision 1.5 2005/01/19 15:53:42 gerber * Initiation of Data Acquisition (DAC); trigerring of lasers and camera * by using RTAI and Realtime Linux, recording images from IEEE1394 * (Firewire) IIDC compliant camera's * * Revision 1.4 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.3 2003/08/22 15:24:52 gerber * interactive spatial scaling * * Revision 1.2 2003/07/25 15:40:23 gerber * removed/disabled setting of correlation in Eval tab, Correlation type in Image info tab * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef GPIV_IMGH_INTERFACE_H #define GPIV_IMGH_INTERFACE_H typedef struct _Imgheader Imgheader; struct _Imgheader { GtkWidget *vbox_label; GtkWidget *label_title; GtkWidget *vbox_scroll; GtkWidget *scrolledwindow; GtkWidget *viewport; GtkWidget *vbox1; GtkWidget *hbox_bufno; GtkWidget *label_label_bufno; GtkWidget *label_bufno; GtkWidget *hbox_name; GtkWidget *label_label_name; GtkWidget *label_name; GtkWidget *table5; GtkWidget *label_label_correlation; GtkWidget *label_correlation; GtkWidget *label_label_ncols; GtkWidget *label_ncols; GtkWidget *label_label_nrows; GtkWidget *label_nrows; GtkWidget *label_label_depth; GtkWidget *label_depth; GtkWidget *label_colpos; GtkObject *spinbutton_adj_colpos; GtkWidget *spinbutton_colpos; GtkWidget *label_rowpos; GtkObject *spinbutton_adj_rowpos; GtkWidget *spinbutton_rowpos; GtkWidget *frame_sscale; GtkWidget *table_sscale; GtkWidget *label_sscale_px; GtkWidget *vbox_sscale; GtkWidget *radiobutton_mouse_1; GtkWidget *radiobutton_mouse_2; GtkWidget *radiobutton_mouse_3; GtkWidget *radiobutton_mouse_4; GtkObject *spinbutton_adj_sscale_px; GtkWidget *spinbutton_sscale_px; GtkWidget *label_sscale_mm; GtkObject *spinbutton_adj_sscale_mm; GtkWidget *spinbutton_sscale_mm; GtkWidget *label_sscale; GtkObject *spinbutton_adj_sscale; GtkWidget *spinbutton_sscale; GtkWidget *label_tscale; GtkObject *spinbutton_adj_tscale; GtkWidget *spinbutton_tscale; GtkWidget *table2; GtkWidget *label_imgtitle; GtkWidget *entry_imgtitle; GtkWidget *label_crdate; GtkWidget *entry_crdate; GtkWidget *label_location; GtkWidget *entry_location; GtkWidget *label_author; GtkWidget *entry_author; GtkWidget *label_software; GtkWidget *entry_software; GtkWidget *label_source; GtkWidget *entry_source; GtkWidget *label_usertext; GtkWidget *entry_usertext; GtkWidget *label_warning; GtkWidget *entry_warning; GtkWidget *label_disclaimer; GtkWidget *entry_disclaimer; GtkWidget *label_comment; GtkWidget *entry_comment; GtkWidget *label_copyright; GtkWidget *entry_copyright; GtkWidget *label_email; GtkWidget *entry_email; GtkWidget *label_url; GtkWidget *entry_url; }; Imgheader * create_imgh(GnomeApp *main_window, GtkWidget *container); #endif /* GPIV_IMGH_INTERFACE_H */ gpiv-0.6.1/src/print.c0000644000175000017500000007643611110305435011504 00000000000000/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * $Log: print.c,v $ * Revision 1.9 2008-04-28 12:00:58 gerber * hdf-formatted files are now with .hdf extension (previously: .gpi) * * Revision 1.8 2007-11-23 16:24:08 gerber * release 0.5.0: Kafka * * Revision 1.7 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.6 2007-01-29 11:27:44 gerber * added image formats png, gif, tif png, bmp, improved buffer display * * Revision 1.5 2006/01/31 14:28:13 gerber * version 0.3.0 * * Revision 1.4 2005/06/15 09:40:40 gerber * debugged, optimized * * Revision 1.3 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.2 2004/06/14 21:19:23 gerber * Image depth up to 16 bits. * Improvement "single int" and "drag int" in Eval tab. * Viewer's pop-up menu. * Adaption for gpiv_matrix_* and gpiv_vector_*. * Resizing console. * See Changelog for further info. * * Revision 1.1 2003/09/04 13:31:55 gerber * init of printing (unfinished) * */ #ifdef HAVE_CONFIG_H # include #endif #include "support.h" #include "gpiv_gui.h" #include "utils.h" #include "print.h" /* #include "console_menus.h" */ /* #include "display.h" */ GtkDialog * create_print_dialog (GpivConsole *gpiv ) /*----------------------------------------------------------------------------- ttp://developer.gnome.org/doc/API/2.0/gtk/GtkDialog.html#GtkDialogFlags */ { PrintDialog * pri = g_new0(PrintDialog, 1); /* g_snprintf(pri->var.label_printer_state, GPIV_MAX_CHARS, "Printer is ready to print"); */ /* g_snprintf(pri->var.label_printer_state, GPIV_MAX_CHARS, "Printer is offline"); */ g_snprintf(pri->var.label_printer_state, GPIV_MAX_CHARS, "Printer state is unknown"); pri->var.print_to_printer = FALSE; pri->var.select_range = TRUE; /* * Main window of print dialog */ if (gpiv_par->verbose) g_warning("create_print_dialog:: 1"); /* * GTK2: */ pri->dialog = GTK_DIALOG( gtk_dialog_new_with_buttons ("gpiv print", /* GNOME_APP ( */ /* gpiv->console */ NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_STOCK_PRINT_PREVIEW, GTK_RESPONSE_APPLY, GTK_STOCK_PRINT, GTK_RESPONSE_ACCEPT, NULL)); gtk_dialog_set_default_response (pri->dialog, GTK_RESPONSE_REJECT); g_signal_connect_swapped (pri->dialog, "response", G_CALLBACK (gtk_widget_destroy), pri->dialog); g_signal_connect (pri->dialog, "response", G_CALLBACK (on_print_response), NULL); gtk_object_set_data (GTK_OBJECT (pri->dialog), "print_dialog", pri->dialog); /* * Gnome2: */ gtk_window_set_policy (GTK_WINDOW (pri->dialog), FALSE, FALSE, FALSE); if (gpiv_par->verbose) g_warning("create_print_dialog:: 1.3"); gtk_window_set_wmclass (GTK_WINDOW (pri->dialog), "gpiv print", ""); if (gpiv_par->verbose) g_warning("create_print_dialog:: 1.4"); /* * Main table */ /* pri->vbox_dialog = GTK_DIALOG (pri->dialog)->vbox; */ /* gtk_object_set_data (GTK_OBJECT (pri->dialog), */ /* "vbox_dialog", */ /* pri->vbox_dialog); */ /* gtk_widget_show (pri->vbox_dialog); */ pri->frame_print = gtk_frame_new (_("Select printer")); gtk_widget_ref (pri->frame_print); gtk_object_set_data_full (GTK_OBJECT (pri->dialog), "frame_print", pri->frame_print, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pri->frame_print); gtk_container_add (GTK_CONTAINER (GTK_DIALOG(pri->dialog)->vbox), pri->frame_print); /* gtk_box_pack_start( GTK_BOX (pri->vbox_dialog), */ /* pri->frame_print, */ /* TRUE, */ /* TRUE, */ /* 0); */ pri->table_print = gtk_table_new (2, 3, FALSE); gtk_widget_ref (pri->table_print); gtk_object_set_data_full (GTK_OBJECT (pri->dialog), "table_print", pri->table_print, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pri->table_print); gtk_container_add (GTK_CONTAINER (pri->frame_print), pri->table_print); pri->radiobutton_printer = gtk_radio_button_new_with_label(pri->printer_group, _("Printer")); pri->printer_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pri->radiobutton_printer)); gtk_widget_ref(pri->radiobutton_printer); gtk_object_set_data_full(GTK_OBJECT(pri->dialog), "radiobutton_printer", pri->radiobutton_printer, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pri->radiobutton_printer); gtk_table_attach (GTK_TABLE (pri->table_print), pri->radiobutton_printer, 0, 1, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_object_set_data(GTK_OBJECT(pri->radiobutton_printer), "pri", pri); pri->entry_printer = gtk_entry_new(); gtk_widget_ref(pri->entry_printer); gtk_object_set_data_full(GTK_OBJECT(pri->dialog), "entry_printer", pri->entry_printer, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pri->entry_printer); gtk_table_attach(GTK_TABLE(pri->table_print), pri->entry_printer, 1, 3, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_text(GTK_ENTRY (pri->entry_printer), DEFAULT_PRINT_CMD); gtk_object_set_data(GTK_OBJECT(pri->entry_printer), "pri", pri); pri->radiobutton_file = gtk_radio_button_new_with_label(pri->printer_group, _("File")); pri->printer_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pri->radiobutton_file)); gtk_widget_ref(pri->radiobutton_file); gtk_object_set_data_full(GTK_OBJECT(pri->dialog), "radiobutton_file", pri->radiobutton_file, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pri->radiobutton_file); gtk_table_attach (GTK_TABLE (pri->table_print), pri->radiobutton_file, 0, 1, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_object_set_data(GTK_OBJECT(pri->radiobutton_file), "pri", pri); pri->entry_file = gtk_entry_new(); gtk_widget_ref(pri->entry_file); gtk_object_set_data_full(GTK_OBJECT(pri->dialog), "entry_file", pri->entry_file, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pri->entry_file); gtk_table_attach(GTK_TABLE(pri->table_print), pri->entry_file, 1, 2, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_entry_set_text(GTK_ENTRY (pri->entry_file), DEFAULT_FNAME_PRINT); /* gtk_object_set_data(GTK_OBJECT(pri->entry_file), */ /* "pri", */ /* pri); */ pri->button_browse = gtk_button_new_with_label(_("Browse")); gtk_widget_ref(pri->button_browse); gtk_object_set_data_full(GTK_OBJECT(pri->dialog), "button_browse", pri->button_browse, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pri->button_browse); gtk_table_attach(GTK_TABLE(pri->table_print), pri->button_browse, 2, 3, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_tooltips_set_tip(gpiv->tooltips, pri->button_browse, _("Launches a file selector to browse a file"), NULL); gtk_object_set_data(GTK_OBJECT(pri->button_browse), "pri", pri); pri->label_label_printerstate = gtk_label_new(_("State: ")); gtk_widget_ref(pri->label_label_printerstate); gtk_object_set_data_full(GTK_OBJECT(pri->dialog), "label_label_printerstate", pri->label_label_printerstate, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pri->label_label_printerstate); gtk_table_attach(GTK_TABLE(pri->table_print), pri->label_label_printerstate, 0, 1, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); pri->label_printerstate = gtk_label_new(pri->var.label_printer_state); gtk_widget_ref(pri->label_printerstate); gtk_object_set_data_full(GTK_OBJECT(pri->dialog), "label_printerstate", pri->label_printerstate, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pri->label_printerstate); gtk_table_attach(GTK_TABLE(pri->table_print), pri->label_printerstate, 1, 2, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); /* * Print range frame */ pri->frame_range = gtk_frame_new (_("Print range")); gtk_widget_ref (pri->frame_range); gtk_object_set_data_full (GTK_OBJECT (pri->dialog), "frame_range", pri->frame_range, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pri->frame_range); gtk_container_add (GTK_CONTAINER (GTK_DIALOG(pri->dialog)->vbox), pri->frame_range); /* gtk_box_pack_start( GTK_BOX (pri->vbox_dialog), */ /* pri->frame_range, */ /* TRUE, */ /* TRUE, */ /* 0); */ pri->table_range = gtk_table_new (2, 5, FALSE); gtk_widget_ref (pri->table_range); gtk_object_set_data_full (GTK_OBJECT (pri->dialog), "table_range", pri->table_range, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show (pri->table_range); gtk_container_add (GTK_CONTAINER (pri->frame_range), pri->table_range); pri->radiobutton_all = gtk_radio_button_new_with_label(pri->range_group, _("All")); pri->range_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pri->radiobutton_all)); gtk_widget_ref(pri->radiobutton_all); gtk_object_set_data_full(GTK_OBJECT(pri->dialog), "radiobutton_all", pri->radiobutton_all, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pri->radiobutton_all); gtk_table_attach (GTK_TABLE (pri->table_range), pri->radiobutton_all, 0, 1, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_object_set_data(GTK_OBJECT(pri->radiobutton_all), "pri", pri); pri->radiobutton_range = gtk_radio_button_new_with_label(pri->range_group, _("Buffers")); pri->range_group = gtk_radio_button_group(GTK_RADIO_BUTTON (pri->radiobutton_range)); gtk_widget_ref(pri->radiobutton_range); gtk_object_set_data_full(GTK_OBJECT(pri->dialog), "radiobutton_range", pri->radiobutton_range, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pri->radiobutton_range); gtk_table_attach (GTK_TABLE (pri->table_range), pri->radiobutton_range, 0, 1, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_object_set_data(GTK_OBJECT(pri->radiobutton_range), "pri", pri); pri->label_range_from = gtk_label_new(_("From: ")); gtk_widget_ref(pri->label_range_from); gtk_object_set_data_full(GTK_OBJECT(pri->dialog), "label_range_from", pri->label_range_from, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pri->label_range_from); gtk_table_attach(GTK_TABLE(pri->table_range), pri->label_range_from, 1, 2, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); pri->spinbutton_adj_range_start = gtk_adjustment_new(gpiv->first_selected_row, 1, nbufs - 1, 1, 2, nbufs - 1); pri->spinbutton_range_start = gtk_spin_button_new(GTK_ADJUSTMENT(pri->spinbutton_adj_range_start), gpiv->first_selected_row, 0); gtk_widget_ref(pri->spinbutton_range_start); gtk_widget_show(pri->spinbutton_range_start); gtk_table_attach (GTK_TABLE (pri->table_range), pri->spinbutton_range_start, 2, 3, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_entry_set_editable(GTK_ENTRY(pri->spinbutton_range_start), TRUE); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(pri->spinbutton_range_start), TRUE); gtk_object_set_data(GTK_OBJECT(pri->spinbutton_range_start), "pri", pri); pri->label_range_end = gtk_label_new(_("To: ")); gtk_widget_ref(pri->label_range_end); gtk_object_set_data_full(GTK_OBJECT(pri->dialog), "label_range_end", pri->label_range_end, (GtkDestroyNotify) gtk_widget_unref); gtk_widget_show(pri->label_range_end); gtk_table_attach(GTK_TABLE(pri->table_range), pri->label_range_end, 3, 4, 1, 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); pri->spinbutton_adj_range_end = gtk_adjustment_new(gpiv->last_selected_row, 1, nbufs - 1, 1, 2, nbufs - 1); pri->spinbutton_range_end = gtk_spin_button_new(GTK_ADJUSTMENT(pri->spinbutton_adj_range_end), gpiv->last_selected_row, 0); gtk_widget_ref(pri->spinbutton_range_end); gtk_widget_show(pri->spinbutton_range_end); gtk_table_attach (GTK_TABLE (pri->table_range), pri->spinbutton_range_end, 4, 5, 1, 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (GTK_FILL), 0, 0); gtk_entry_set_editable(GTK_ENTRY(pri->spinbutton_range_end), TRUE); gtk_spin_button_set_numeric(GTK_SPIN_BUTTON(pri->spinbutton_range_end), TRUE); gtk_object_set_data(GTK_OBJECT(pri->spinbutton_range_end), "pri", pri); /* * Dialog area with "Print", "Preview" and "Cancel" buttons */ /* pri->dialog_action_area = GTK_DIALOG (pri->dialog)->action_area; */ /* gtk_object_set_data (GTK_OBJECT (pri->dialog), */ /* "dialog_action_area", */ /* pri->dialog_action_area); */ /* gtk_widget_show (pri->dialog_action_area); */ /* gtk_button_box_set_layout (GTK_BUTTON_BOX (pri->dialog_action_area), */ /* GTK_BUTTONBOX_END); */ /* gtk_button_box_set_spacing (GTK_BUTTON_BOX (pri->dialog_action_area), */ /* 8); */ /* gnome_dialog_append_button (GNOME_DIALOG (pri->dialog), */ /* "Print"); */ /* pri->button_print = */ /* GTK_WIDGET (g_list_last (GNOME_DIALOG (pri->dialog)->buttons)->data); */ /* pri->button_print = */ /* (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-print"); */ /* gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pri)->action_area), */ /* pri->button_print, TRUE, TRUE, 0); */ /* gtk_widget_ref (pri->button_print); */ /* gtk_object_set_data_full (GTK_OBJECT (pri->dialog), */ /* "button_print", */ /* pri->button_print, */ /* (GtkDestroyNotify) gtk_widget_unref); */ /* gtk_widget_show (pri->button_print); */ /* GTK_WIDGET_SET_FLAGS (pri->button_print, */ /* GTK_CAN_DEFAULT); */ /* gtk_tooltips_set_tip(gpiv->tooltips, pri->button_print, */ /* _("Prints the content of the actual buffer display"), */ /* NULL); */ /* gtk_object_set_data(GTK_OBJECT(pri->button_print), */ /* "pri", */ /* pri); */ /* g_signal_connect (GTK_OBJECT (pri->button_print), "clicked", */ /* G_CALLBACK (on_button_print), */ /* NULL); */ /* gtk_widget_set_sensitive(pri->button_print, FALSE); */ /* pri->button_preview = */ /* (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-print_preview"); */ /* gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pri)->action_area), */ /* pri->button_preview, TRUE, TRUE, 0); */ /* gtk_widget_ref (pri->button_preview); */ /* gtk_object_set_data_full (GTK_OBJECT (pri->dialog), */ /* "button_preview", */ /* pri->button_preview, */ /* (GtkDestroyNotify) gtk_widget_unref); */ /* gtk_widget_show (pri->button_preview); */ /* GTK_WIDGET_SET_FLAGS (pri->button_preview, GTK_CAN_DEFAULT); */ /* gtk_tooltips_set_tip(gpiv->tooltips, pri->button_preview, */ /* _("Shows a preview of the output to be printed"), */ /* NULL); */ /* gtk_object_set_data(GTK_OBJECT(pri->button_preview), */ /* "gpiv", */ /* gpiv); */ /* g_signal_connect (GTK_OBJECT (pri->button_preview), "clicked", */ /* G_CALLBACK (on_button_preview), */ /* NULL); */ /* gtk_widget_set_sensitive(pri->button_preview, FALSE); */ /* gnome_dialog_append_button (GNOME_DIALOG (pri->dialog), */ /* GTK_STOCK_CANCEL); */ /* pri->button_print_cancel = */ /* GTK_WIDGET (g_list_last (GNOME_DIALOG (pri->dialog)->buttons)->data); */ /* pri->button_print_cancel = */ /* (GtkWidget*) gtk_tool_button_new_from_stock ("gtk-cancel"); */ /* gtk_box_pack_start (GTK_BOX (GTK_DIALOG (pri)->action_area), */ /* pri->button_print_cancel, TRUE, TRUE, 0); */ /* gtk_widget_ref (pri->button_print_cancel); */ /* gtk_object_set_data_full (GTK_OBJECT (pri->dialog), */ /* "button_print_cancel", */ /* pri->button_print_cancel, */ /* (GtkDestroyNotify) gtk_widget_unref); */ /* gtk_widget_show (pri->button_print_cancel); */ /* GTK_WIDGET_SET_FLAGS (pri->button_print_cancel, */ /* GTK_CAN_DEFAULT); */ /* gtk_tooltips_set_tip(gpiv->tooltips, */ /* pri->button_print_cancel, */ /* _("Close pri->dialog window"), */ /* NULL); */ /* gtk_object_set_data(GTK_OBJECT(pri->button_print_cancel), */ /* "pri", */ /* pri); */ /* g_signal_connect (GTK_OBJECT (pri->button_print_cancel), */ /* "clicked", */ /* G_CALLBACK (on_button_print_cancel), */ /* NULL); */ /* * Connecting to callback functions */ g_signal_connect (GTK_OBJECT(pri->radiobutton_printer), "toggled", G_CALLBACK(on_radiobutton_printer), NULL); g_signal_connect(GTK_OBJECT(pri->entry_printer), "changed", G_CALLBACK(on_entry_printer), pri->entry_printer); g_signal_connect (GTK_OBJECT(pri->radiobutton_file), "toggled", G_CALLBACK(on_radiobutton_file), NULL); g_signal_connect(GTK_OBJECT(pri->entry_file), "changed", G_CALLBACK(on_entry_file), pri->entry_file); g_signal_connect(GTK_OBJECT(pri->button_browse), "clicked", G_CALLBACK(on_button_browse), pri->button_browse); g_signal_connect (GTK_OBJECT(pri->radiobutton_all), "toggled", G_CALLBACK(on_radiobutton_all), NULL); g_signal_connect (GTK_OBJECT(pri->radiobutton_range), "toggled", G_CALLBACK(on_radiobutton_range), NULL); g_signal_connect(GTK_OBJECT(pri->spinbutton_range_start), "changed", G_CALLBACK(on_spinbutton_range_start), pri->spinbutton_range_start); g_signal_connect(GTK_OBJECT(pri->spinbutton_range_end), "changed", G_CALLBACK(on_spinbutton_range_end), pri->spinbutton_range_end); /* * Initialize settings */ if (pri->var.print_to_printer) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pri->radiobutton_printer), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pri->radiobutton_file), TRUE); } if (pri->var.select_range) { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pri->radiobutton_range), TRUE); } else { gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON (pri->radiobutton_range), FALSE); /* gtk_toggle_button_set_state(GTK_TOGGLE_BUTTON */ /* (pri->radiobutton_all), */ /* TRUE); */ } return pri->dialog; } static void file_ok_sel(GtkWidget * widget, GtkFileSelection * fs ) /* ---------------------------------------------------------------------------- * Print file selection */ { PrintDialog *pri = gtk_object_get_data(GTK_OBJECT(widget), "pri"); pri->var.fname_print = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(fs))); gtk_entry_set_text(GTK_ENTRY (pri->entry_file), pri->var.fname_print); } static void print(PrintDialog *pri ) /*----------------------------------------------------------------------------- * prints and closes print dialog */ { g_warning(_("Button \"Print\" pressed")); g_free(pri->var.print_cmd); g_free(pri->var.fname_print); /* gnome_dialog_close(GNOME_DIALOG(gpiv_print_dialog)); */ /* * Gnome2: */ /* gtk_widget_destroy(GTK_DIALOG(pri->dialog)); */ } #ifdef HAVE_GNOME_PRINT static int print_on_context(/* gpaint_image * image, */ /* const gchar * name, */ GnomePrintContext * pc ) /* ---------------------------------------------------------------------------- */ { double matrix[6] = { 1, 0, 0, 1, 0, 0 }; gnome_print_beginpage(pc, display_act->file_uri_name); gnome_print_concat(pc, matrix); gnome_print_translate(pc, 0, 0); gnome_print_scale(pc, display_act->img->image->header->ncolumns, display_act->img->image->header->nrows); gnome_print_rgbaimage(pc, gdk_pixbuf_get_pixels(display_act->img->pixbuf1), display_act->img->image->header->ncolumns, display_act->img->image->header->nrows, display_act->img->rgb_img_width); gnome_print_showpage(pc); return 1; } static int preview(void ) /* ---------------------------------------------------------------------------- * preview print from gpaint: do_print_preview */ { GtkWidget *toplevel, *canvas, *sw; GnomePrintContext *pc = 0; GnomePrintConfig *cfg = NULL; GnomePrintJob *job = NULL; GnomePrintJobPreview *pmp = NULL; GnomePrintContext *ctx = NULL; cfg = gnome_print_config_default(); job = gnome_print_job_new(cfg); /* transfer dialog data to output context */ ctx = gnome_print_job_get_context(job); print_on_context(/* image, name, */ctx); gnome_print_job_close(job); pmp = GNOME_PRINT_JOB_PREVIEW (gnome_print_job_preview_new(job, "Print Preview")); g_signal_connect((gpointer)pmp, "destroy", G_CALLBACK(gtk_widget_destroy), (gpointer)pmp); gtk_window_set_modal(GTK_WINDOW(pmp), TRUE); gtk_widget_show(GTK_WIDGET(pmp)); return 1; } #else static int preview(void ) /* ---------------------------------------------------------------------------- * preview print from gpaint: do_print_preview */ { g_warning(_("Button \"Preview\" pressed")); return 1; } #endif static void cancel(PrintDialog *pri /* GtkDialog *dialog */ /* GtkWidget *widget, */ /* gpointer data */ ) /* ---------------------------------------------------------------------------- * closes print dialog */ { g_warning(_("Button \"Cancel\" pressed")); g_free(pri->var.print_cmd); g_free(pri->var.fname_print); /* gnome_dialog_close(GNOME_DIALOG(gpiv_print_dialog)); */ /* * Gnome2: */ gtk_widget_destroy(GTK_WIDGET(pri->dialog)); } /* * Callback functions */ void dialog_action(GtkDialog *dialog, gint response, gpointer data) /*----------------------------------------------------------------------------- */ { PrintDialog *pri = gtk_object_get_data(GTK_OBJECT(dialog), "pri"); g_assert(response == GTK_RESPONSE_ACCEPT || response == GTK_RESPONSE_APPLY || response == GTK_RESPONSE_CANCEL); gint result = gtk_dialog_run (GTK_DIALOG (dialog)); switch (result) { case GTK_RESPONSE_ACCEPT: print (pri); break; case GTK_RESPONSE_APPLY: preview (); break; case GTK_RESPONSE_CANCEL: /* do_nothing_since_dialog_was_cancelled (); */ cancel (pri); break; default: g_warning("dialog_action: should not arrive here"); break; } /* gtk_widget_destroy (dialog); */ } void on_radiobutton_printer(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PrintDialog *pri = gtk_object_get_data(GTK_OBJECT(widget), "pri"); if (GTK_TOGGLE_BUTTON(widget)->active) { pri->var.print_to_printer = TRUE; gtk_widget_set_sensitive(pri->entry_printer, TRUE); } else { pri->var.print_to_printer = FALSE; gtk_widget_set_sensitive(pri->entry_printer, FALSE); } } void on_entry_printer(GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { PrintDialog *pri = gtk_object_get_data(GTK_OBJECT(widget), "pri"); /* snprintf(printer_name, GPIV_MAX_CHARS,"%s", */ /* gtk_entry_get_text(GTK_ENTRY(entry))); */ pri->var.print_cmd = g_strdup(gtk_entry_get_text(GTK_ENTRY (pri->entry_file))); g_warning("print_cmd = %s", pri->var.print_cmd); } void on_radiobutton_file(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PrintDialog *pri = gtk_object_get_data(GTK_OBJECT(widget), "pri"); if (GTK_TOGGLE_BUTTON(widget)->active) { gtk_widget_set_sensitive(pri->entry_file, TRUE); gtk_widget_set_sensitive(pri->button_browse, TRUE); } else { gtk_widget_set_sensitive(pri->entry_file, FALSE); gtk_widget_set_sensitive(pri->button_browse, FALSE); pri->var.print_to_printer = TRUE; } } void on_entry_file(GtkSpinButton *widget, GtkWidget *entry ) /*----------------------------------------------------------------------------- */ { /* snprintf(file_name, GPIV_MAX_CHARS,"%s", */ /* gtk_entry_get_text(GTK_ENTRY(entry))); */ } void on_button_browse(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PrintDialog *pri = gtk_object_get_data(GTK_OBJECT(widget), "pri"); GtkWidget *filew = NULL; filew = gtk_file_selection_new("gpiv: print file"); g_signal_connect(GTK_OBJECT(filew), "destroy", G_CALLBACK( destroy), &filew); g_signal_connect(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), "clicked", G_CALLBACK( file_ok_sel), GTK_OBJECT(filew)); g_signal_connect_swapped(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), "clicked", G_CALLBACK( gtk_widget_destroy), GTK_OBJECT(filew)); gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(filew)->ok_button), "pri", pri); g_signal_connect_swapped(GTK_OBJECT (GTK_FILE_SELECTION(filew)->cancel_button), "clicked", G_CALLBACK( gtk_widget_destroy), GTK_OBJECT(filew)); gtk_file_selection_set_filename(GTK_FILE_SELECTION(filew), gpiv_var->fname_last_print); gtk_widget_show(filew); gtk_object_set_data(GTK_OBJECT(GTK_FILE_SELECTION(filew)), "pri", pri); } void on_radiobutton_all(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PrintDialog *pri = gtk_object_get_data(GTK_OBJECT(widget), "pri"); if (GTK_TOGGLE_BUTTON(widget)->active) { pri->var.select_range = FALSE; } } void on_radiobutton_range(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- */ { PrintDialog *pri = gtk_object_get_data(GTK_OBJECT(widget), "pri"); if (GTK_TOGGLE_BUTTON(widget)->active) { pri->var.select_range = TRUE; gtk_widget_set_sensitive(pri->spinbutton_range_start, TRUE); gtk_widget_set_sensitive(pri->spinbutton_range_end, TRUE); } else { gtk_widget_set_sensitive(pri->spinbutton_range_start, FALSE); gtk_widget_set_sensitive(pri->spinbutton_range_end, FALSE); pri->var.select_range = FALSE; } } void on_spinbutton_range_start(GtkSpinButton * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { PrintDialog *pri = gtk_object_get_data(GTK_OBJECT(widget), "pri"); pri->var.print_start = gtk_spin_button_get_value_as_int(widget); GTK_ADJUSTMENT(pri->spinbutton_adj_range_end)->lower = (gint) pri->var.print_start; } void on_spinbutton_range_end(GtkSpinButton * widget, GtkWidget * entry ) /*----------------------------------------------------------------------------- */ { PrintDialog *pri = gtk_object_get_data(GTK_OBJECT(widget), "pri"); pri->var.print_end = gtk_spin_button_get_value_as_int(widget); GTK_ADJUSTMENT(pri->spinbutton_adj_range_start)->upper = (gint) pri->var.print_end; } void on_print_response(GtkDialog *dialog, gint response, gpointer data ) /*----------------------------------------------------------------------------- */ { /* GpivConsole *gpiv = gtk_object_get_data(GTK_OBJECT(dialog), "gpiv"); */ PrintDialog *pri = gtk_object_get_data(GTK_OBJECT(dialog), "print_dialog"); g_assert( response == GTK_RESPONSE_OK || response == GTK_RESPONSE_APPLY || response == GTK_RESPONSE_CANCEL); switch (response) { case GTK_RESPONSE_OK: g_warning(_("Button \"Print\" pressed")); g_free(pri->var.print_cmd); g_free(pri->var.fname_print); break; case GTK_RESPONSE_APPLY: g_warning(_("Button \"Preview\" pressed")); break; case GTK_RESPONSE_CANCEL: g_warning(_("Button \"Cancel\" pressed")); g_free(pri->var.print_cmd); g_free(pri->var.fname_print); break; default: g_warning("on_preferences_response: should not arrive here"); break; } } /* * BUGFIX: obsolete functions: on_button_...; cleanup */ void on_button_print(GtkWidget *widget, gpointer data ) /*----------------------------------------------------------------------------- * prints and closes print dialog */ { PrintDialog *pri = gtk_object_get_data(GTK_OBJECT(widget), "pri"); g_warning(_("Button \"Print\" pressed")); g_free(pri->var.print_cmd); g_free(pri->var.fname_print); /* gnome_dialog_close(GNOME_DIALOG(gpiv_print_dialog)); */ /* * Gnome2: */ gtk_widget_destroy(GTK_WIDGET (pri->dialog)); } void on_button_preview(GtkWidget *widget, gpointer data ) /* ---------------------------------------------------------------------------- * preview print */ { g_warning(_("Button \"Preview\" pressed")); } void on_button_print_cancel(GtkWidget *widget, gpointer data ) /* ---------------------------------------------------------------------------- * closes print dialog */ { PrintDialog *pri = gtk_object_get_data(GTK_OBJECT(widget), "pri"); g_warning(_("Button \"Cancel\" pressed")); g_free(pri->var.print_cmd); g_free(pri->var.fname_print); /* gnome_dialog_close(GNOME_DIALOG(gpiv_print_dialog)); */ /* * Gnome2: */ gtk_widget_destroy(GTK_WIDGET(pri->dialog)); } gpiv-0.6.1/src/print.h0000644000175000017500000001064111110306400011464 00000000000000/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /*---------------------------------------------------------------------- gpiv - Graphic program for Particle Image Velocimetry, based on gtk/gnome libraries. Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Gerber van der Graaf This file is part of gpiv. Gpiv is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ----------------------------------------------------------------------*/ /* * $Log: print.h,v $ * Revision 1.4 2007-06-06 17:00:48 gerber * Retreives images/data from URI using Gnome Virtual File System. * * Revision 1.3 2006/01/31 14:28:13 gerber * version 0.3.0 * * Revision 1.2 2004/10/15 19:24:05 gerber * GPIV_ and Gpiv prefix to defines and structure names of libgpiv * * Revision 1.1 2003/09/04 13:31:55 gerber * init of printing (unfinished) * * Revision 1.3 2003/08/22 15:24:53 gerber * interactive spatial scaling * * Revision 1.2 2003/07/25 15:40:24 gerber * removed/disabled setting of correlation in Eval tab, Correlation type in Image info tab * * Revision 1.1.1.1 2003/06/17 17:10:52 gerber * Imported gpiv * */ #ifndef PRINT_H #define PRINT_H /* #ifdef HAVE_CONFIG_H */ /* # include */ /* #endif */ #define DEFAULT_PRINT_CMD "lpr" #define DEFAULT_FNAME_PRINT "gpiv_print.pdf" GtkDialog * create_print_dialog (GpivConsole *gpiv); /* * printer variables */ typedef struct _PrintVar PrintVar; struct _PrintVar { gboolean print_to_printer; char label_printer_state[GPIV_MAX_CHARS]; gchar *print_cmd; gchar *fname_print; gboolean select_range; gint print_start; gint print_end; }; /* * print dialog interface widgets */ typedef struct _PrintDialog PrintDialog; struct _PrintDialog { PrintVar var; GtkDialog *dialog; /* GtkWidget *vbox_dialog; */ GSList *printer_group; GtkWidget *frame_print; GtkWidget *table_print; GtkWidget *radiobutton_printer; GtkWidget *entry_printer; GtkWidget *radiobutton_file; GtkWidget *entry_file; GtkWidget *button_browse; GtkWidget *label_label_printerstate; GtkWidget *label_printerstate; GSList *range_group; GtkWidget *frame_range; GtkWidget *table_range; GtkWidget *radiobutton_all; GtkWidget *radiobutton_range; GtkWidget *label_range_from; GtkObject *spinbutton_adj_range_start; GtkWidget *spinbutton_range_start; GtkWidget *label_range_end; GtkObject *spinbutton_adj_range_end; GtkWidget *spinbutton_range_end; /* GtkWidget *dialog_action_area; */ /* GtkWidget *button_print; */ /* GtkWidget *button_preview; */ /* GtkWidget *button_print_cancel; */ }; /* * Callback functions * printer select */ void on_radiobutton_printer(GtkWidget *widget, gpointer data); void on_entry_printer(GtkSpinButton *widget, GtkWidget *entry); void on_radiobutton_file(GtkWidget *widget, gpointer data); void on_entry_file(GtkSpinButton *widget, GtkWidget *entry); void on_button_browse(GtkWidget *widget, gpointer data); /* * print range */ void on_radiobutton_all(GtkWidget *widget, gpointer data); void on_radiobutton_range(GtkWidget *widget, gpointer data); void on_spinbutton_range_start(GtkSpinButton * widget, GtkWidget * entry); void on_spinbutton_range_end(GtkSpinButton * widget, GtkWidget * entry); /* * Dialog buttons */ void on_print_response(GtkDialog *dialog, gint response, gpointer data ); /* void */ /* on_button_print(GtkWidget *widget, */ /* gpointer data); */ /* void */ /* on_button_preview(GtkWidget *widget, */ /* gpointer data); */ /* void */ /* on_button_print_cancel(GtkWidget *widget, */ /* gpointer data); */ #endif /* PRINT_H */ gpiv-0.6.1/NEWS0000644000175000017500000000000011076052422010070 00000000000000gpiv-0.6.1/depcomp0000755000175000017500000004271311170314110010755 00000000000000#! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2007-03-29.01 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software # Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: gpiv-0.6.1/intltool-extract.in0000644000175000017500000000000011204234167013236 00000000000000gpiv-0.6.1/aclocal.m40000644000175000017500000017405111204234172011250 00000000000000# generated automatically by aclocal 1.10.2 -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.63],, [m4_warning([this file was generated for autoconf 2.63. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically `autoreconf'.])]) # Copyright (C) 1995-2002 Free Software Foundation, Inc. # Copyright (C) 2001-2003,2004 Red Hat, Inc. # # This file is free software, distributed under the terms of the GNU # General Public License. As a special exception to the GNU General # Public License, this file may be distributed as part of a program # that contains a configuration script generated by Autoconf, under # the same distribution terms as the rest of that program. # # This file can be copied and used freely without restrictions. It can # be used in projects which are not available under the GNU Public License # but which still want to provide support for the GNU gettext functionality. # # Macro to add for using GNU gettext. # Ulrich Drepper , 1995, 1996 # # Modified to never use included libintl. # Owen Taylor , 12/15/1998 # # Major rework to remove unused code # Owen Taylor , 12/11/2002 # # Added better handling of ALL_LINGUAS from GNU gettext version # written by Bruno Haible, Owen Taylor 5/30/3002 # # Modified to require ngettext # Matthias Clasen 08/06/2004 # # We need this here as well, since someone might use autoconf-2.5x # to configure GLib then an older version to configure a package # using AM_GLIB_GNU_GETTEXT AC_PREREQ(2.53) dnl dnl We go to great lengths to make sure that aclocal won't dnl try to pull in the installed version of these macros dnl when running aclocal in the glib directory. dnl m4_copy([AC_DEFUN],[glib_DEFUN]) m4_copy([AC_REQUIRE],[glib_REQUIRE]) dnl dnl At the end, if we're not within glib, we'll define the public dnl definitions in terms of our private definitions. dnl # GLIB_LC_MESSAGES #-------------------- glib_DEFUN([GLIB_LC_MESSAGES], [AC_CHECK_HEADERS([locale.h]) if test $ac_cv_header_locale_h = yes; then AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES, [AC_TRY_LINK([#include ], [return LC_MESSAGES], am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)]) if test $am_cv_val_LC_MESSAGES = yes; then AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your file defines LC_MESSAGES.]) fi fi]) # GLIB_PATH_PROG_WITH_TEST #---------------------------- dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) glib_DEFUN([GLIB_PATH_PROG_WITH_TEST], [# Extract the first word of "$2", so it can be a program name with args. set dummy $2; ac_word=[$]2 AC_MSG_CHECKING([for $ac_word]) AC_CACHE_VAL(ac_cv_path_$1, [case "[$]$1" in /*) ac_cv_path_$1="[$]$1" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in ifelse([$5], , $PATH, [$5]); do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if [$3]; then ac_cv_path_$1="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" dnl If no 4th arg is given, leave the cache variable unset, dnl so AC_PATH_PROGS will keep looking. ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" ])dnl ;; esac])dnl $1="$ac_cv_path_$1" if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then AC_MSG_RESULT([$]$1) else AC_MSG_RESULT(no) fi AC_SUBST($1)dnl ]) # GLIB_WITH_NLS #----------------- glib_DEFUN([GLIB_WITH_NLS], dnl NLS is obligatory [USE_NLS=yes AC_SUBST(USE_NLS) gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= AC_CHECK_HEADER(libintl.h, [gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # AC_CACHE_CHECK([for ngettext in libc], gt_cv_func_ngettext_libc, [AC_TRY_LINK([ #include ], [return !ngettext ("","", 1)], gt_cv_func_ngettext_libc=yes, gt_cv_func_ngettext_libc=no) ]) if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc, [AC_TRY_LINK([ #include ], [return !dgettext ("","")], gt_cv_func_dgettext_libc=yes, gt_cv_func_dgettext_libc=no) ]) fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then AC_CHECK_FUNCS(bind_textdomain_codeset) fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then AC_CHECK_LIB(intl, bindtextdomain, [AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dgettext, gt_cv_func_dgettext_libintl=yes)])]) if test "$gt_cv_func_dgettext_libintl" != "yes" ; then AC_MSG_CHECKING([if -liconv is needed to use gettext]) AC_MSG_RESULT([]) AC_CHECK_LIB(intl, ngettext, [AC_CHECK_LIB(intl, dcgettext, [gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv], :,-liconv)], :,-liconv) fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset AC_CHECK_FUNCS(bind_textdomain_codeset) LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then AC_DEFINE(HAVE_GETTEXT,1, [Define if the GNU gettext() function is already present or preinstalled.]) GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" AC_CHECK_FUNCS(dcgettext) MSGFMT_OPTS= AC_MSG_CHECKING([if msgfmt accepts -c]) GLIB_RUN_PROG([$MSGFMT -c -o /dev/null],[ msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" ], [MSGFMT_OPTS=-c; AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) AC_SUBST(MSGFMT_OPTS) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :) AC_TRY_LINK(, [extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr], [CATOBJEXT=.gmo DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share and dnl and CATOBJEXT=.gmo in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [CATOBJEXT=.gmo DATADIRNAME=share], [CATOBJEXT=.mo DATADIRNAME=lib]) ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac]) LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi ]) if test "$gt_cv_have_gettext" = "yes" ; then AC_DEFINE(ENABLE_NLS, 1, [always defined to indicate that i18n is enabled]) fi dnl Test whether we really found GNU xgettext. if test "$XGETTEXT" != ":"; then dnl If it is not GNU xgettext we define it as : so that the dnl Makefiles still can work. if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else AC_MSG_RESULT( [found xgettext program is not GNU xgettext; ignore it]) XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po AC_OUTPUT_COMMANDS( [case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac]) dnl These rules are solely for the distribution goal. While doing this dnl we only have to keep exactly one list of the available catalogs dnl in configure.in. for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done dnl Make all variables we use known to autoconf. AC_SUBST(CATALOGS) AC_SUBST(CATOBJEXT) AC_SUBST(DATADIRNAME) AC_SUBST(GMOFILES) AC_SUBST(INSTOBJEXT) AC_SUBST(INTLLIBS) AC_SUBST(PO_IN_DATADIR_TRUE) AC_SUBST(PO_IN_DATADIR_FALSE) AC_SUBST(POFILES) AC_SUBST(POSUB) ]) # AM_GLIB_GNU_GETTEXT # ------------------- # Do checks necessary for use of gettext. If a suitable implementation # of gettext is found in either in libintl or in the C library, # it will set INTLLIBS to the libraries needed for use of gettext # and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable # gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST() # on various variables needed by the Makefile.in.in installed by # glib-gettextize. dnl glib_DEFUN([GLIB_GNU_GETTEXT], [AC_REQUIRE([AC_PROG_CC])dnl AC_REQUIRE([AC_HEADER_STDC])dnl GLIB_LC_MESSAGES GLIB_WITH_NLS if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else AC_MSG_CHECKING(for catalogs to be installed) NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS AC_MSG_RESULT($LINGUAS) fi dnl Construct list of names of catalog files to be constructed. if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly dnl find the mkinstalldirs script in another subdir but ($top_srcdir). dnl Try to locate is. MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi AC_SUBST(MKINSTALLDIRS) dnl Generate list of files to be processed by xgettext which will dnl be included in po/Makefile. test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES ]) # AM_GLIB_DEFINE_LOCALEDIR(VARIABLE) # ------------------------------- # Define VARIABLE to the location where catalog files will # be installed by po/Makefile. glib_DEFUN([GLIB_DEFINE_LOCALEDIR], [glib_REQUIRE([GLIB_GNU_GETTEXT])dnl glib_save_prefix="$prefix" glib_save_exec_prefix="$exec_prefix" glib_save_datarootdir="$datarootdir" test "x$prefix" = xNONE && prefix=$ac_default_prefix test "x$exec_prefix" = xNONE && exec_prefix=$prefix datarootdir=`eval echo "${datarootdir}"` if test "x$CATOBJEXT" = "x.mo" ; then localedir=`eval echo "${libdir}/locale"` else localedir=`eval echo "${datadir}/locale"` fi prefix="$glib_save_prefix" exec_prefix="$glib_save_exec_prefix" datarootdir="$glib_save_datarootdir" AC_DEFINE_UNQUOTED($1, "$localedir", [Define the location where the catalogs will be installed]) ]) dnl dnl Now the definitions that aclocal will find dnl ifdef(glib_configure_in,[],[ AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)]) AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)]) ])dnl # GLIB_RUN_PROG(PROGRAM, TEST-FILE, [ACTION-IF-PASS], [ACTION-IF-FAIL]) # # Create a temporary file with TEST-FILE as its contents and pass the # file name to PROGRAM. Perform ACTION-IF-PASS if PROGRAM exits with # 0 and perform ACTION-IF-FAIL for any other exit status. AC_DEFUN([GLIB_RUN_PROG], [cat >conftest.foo <<_ACEOF $2 _ACEOF if AC_RUN_LOG([$1 conftest.foo]); then m4_ifval([$3], [$3], [:]) m4_ifvaln([$4], [else $4])dnl echo "$as_me: failed input was:" >&AS_MESSAGE_LOG_FD sed 's/^/| /' conftest.foo >&AS_MESSAGE_LOG_FD fi]) dnl IT_PROG_INTLTOOL([MINIMUM-VERSION], [no-xml]) # serial 40 IT_PROG_INTLTOOL AC_DEFUN([IT_PROG_INTLTOOL], [ AC_PREREQ([2.50])dnl AC_REQUIRE([AM_NLS])dnl case "$am__api_version" in 1.[01234]) AC_MSG_ERROR([Automake 1.5 or newer is required to use intltool]) ;; *) ;; esac if test -n "$1"; then AC_MSG_CHECKING([for intltool >= $1]) INTLTOOL_REQUIRED_VERSION_AS_INT=`echo $1 | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` [INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` ] AC_MSG_RESULT([$INTLTOOL_APPLIED_VERSION found]) test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || AC_MSG_ERROR([Your intltool is too old. You need intltool $1 or later.]) fi AC_PATH_PROG(INTLTOOL_UPDATE, [intltool-update]) AC_PATH_PROG(INTLTOOL_MERGE, [intltool-merge]) AC_PATH_PROG(INTLTOOL_EXTRACT, [intltool-extract]) if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then AC_MSG_ERROR([The intltool scripts were not found. Please install intltool.]) fi INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -p $(top_srcdir)/po $< [$]@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u /tmp $< [$]@' INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< [$]@' _IT_SUBST(INTLTOOL_DESKTOP_RULE) _IT_SUBST(INTLTOOL_DIRECTORY_RULE) _IT_SUBST(INTLTOOL_KEYS_RULE) _IT_SUBST(INTLTOOL_PROP_RULE) _IT_SUBST(INTLTOOL_OAF_RULE) _IT_SUBST(INTLTOOL_PONG_RULE) _IT_SUBST(INTLTOOL_SERVER_RULE) _IT_SUBST(INTLTOOL_SHEET_RULE) _IT_SUBST(INTLTOOL_SOUNDLIST_RULE) _IT_SUBST(INTLTOOL_UI_RULE) _IT_SUBST(INTLTOOL_XAM_RULE) _IT_SUBST(INTLTOOL_KBD_RULE) _IT_SUBST(INTLTOOL_XML_RULE) _IT_SUBST(INTLTOOL_XML_NOMERGE_RULE) _IT_SUBST(INTLTOOL_CAVES_RULE) _IT_SUBST(INTLTOOL_SCHEMAS_RULE) _IT_SUBST(INTLTOOL_THEME_RULE) _IT_SUBST(INTLTOOL_SERVICE_RULE) _IT_SUBST(INTLTOOL_POLICY_RULE) # Check the gettext tools to make sure they are GNU AC_PATH_PROG(XGETTEXT, xgettext) AC_PATH_PROG(MSGMERGE, msgmerge) AC_PATH_PROG(MSGFMT, msgfmt) AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then AC_MSG_ERROR([GNU gettext tools not found; required for intltool]) fi AC_PATH_PROG(INTLTOOL_PERL, perl) if test -z "$INTLTOOL_PERL"; then AC_MSG_ERROR([perl not found]) fi AC_MSG_CHECKING([for perl >= 5.8.1]) $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then AC_MSG_ERROR([perl 5.8.1 is required for intltool]) else IT_PERL_VERSION="`$INTLTOOL_PERL -e \"printf '%vd', $^V\"`" AC_MSG_RESULT([$IT_PERL_VERSION]) fi if test "x$2" != "xno-xml"; then AC_MSG_CHECKING([for XML::Parser]) if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then AC_MSG_RESULT([ok]) else AC_MSG_ERROR([XML::Parser perl module is required for intltool]) fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile AC_SUBST(ALL_LINGUAS) # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then AC_LINK_IFELSE( [AC_LANG_PROGRAM([[]], [[extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr]])], [DATADIRNAME=share], [case $host in *-*-solaris*) dnl On Solaris, if bind_textdomain_codeset is in libc, dnl GNU format message catalog is always supported, dnl since both are added to the libc all together. dnl Hence, we'd like to go with DATADIRNAME=share dnl in this case. AC_CHECK_FUNC(bind_textdomain_codeset, [DATADIRNAME=share], [DATADIRNAME=lib]) ;; *) [DATADIRNAME=lib] ;; esac]) fi AC_SUBST(DATADIRNAME) IT_PO_SUBDIR([po]) ]) # IT_PO_SUBDIR(DIRNAME) # --------------------- # All po subdirs have to be declared with this macro; the subdir "po" is # declared by IT_PROG_INTLTOOL. # AC_DEFUN([IT_PO_SUBDIR], [AC_PREREQ([2.53])dnl We use ac_top_srcdir inside AC_CONFIG_COMMANDS. dnl dnl The following CONFIG_COMMANDS should be exetuted at the very end dnl of config.status. AC_CONFIG_COMMANDS_PRE([ AC_CONFIG_COMMANDS([$1/stamp-it], [ if [ ! grep "^# INTLTOOL_MAKEFILE$" "$1/Makefile.in" > /dev/null ]; then AC_MSG_ERROR([$1/Makefile.in.in was not created by intltoolize.]) fi rm -f "$1/stamp-it" "$1/stamp-it.tmp" "$1/POTFILES" "$1/Makefile.tmp" >"$1/stamp-it.tmp" [sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/$1/POTFILES.in" | sed '$!s/$/ \\/' >"$1/POTFILES" ] [sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r $1/POTFILES } ' "$1/Makefile.in" >"$1/Makefile"] rm -f "$1/Makefile.tmp" mv "$1/stamp-it.tmp" "$1/stamp-it" ]) ])dnl ]) # _IT_SUBST(VARIABLE) # ------------------- # Abstract macro to do either _AM_SUBST_NOTMAKE or AC_SUBST # AC_DEFUN([_IT_SUBST], [ AC_SUBST([$1]) m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([$1])]) ] ) # deprecated macros AU_ALIAS([AC_PROG_INTLTOOL], [IT_PROG_INTLTOOL]) # A hint is needed for aclocal from Automake <= 1.9.4: # AC_DEFUN([AC_PROG_INTLTOOL], ...) # nls.m4 serial 3 (gettext-0.15) dnl Copyright (C) 1995-2003, 2005-2006 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, dnl with or without modifications, as long as this notice is preserved. dnl dnl This file can can be used in projects which are not available under dnl the GNU General Public License or the GNU Library General Public dnl License but which still want to provide support for the GNU gettext dnl functionality. dnl Please note that the actual code of the GNU gettext library is covered dnl by the GNU Library General Public License, and the rest of the GNU dnl gettext package package is covered by the GNU General Public License. dnl They are *not* in the public domain. dnl Authors: dnl Ulrich Drepper , 1995-2000. dnl Bruno Haible , 2000-2003. AC_PREREQ(2.50) AC_DEFUN([AM_NLS], [ AC_MSG_CHECKING([whether NLS is requested]) dnl Default is enabled NLS AC_ARG_ENABLE(nls, [ --disable-nls do not use Native Language Support], USE_NLS=$enableval, USE_NLS=yes) AC_MSG_RESULT($USE_NLS) AC_SUBST(USE_NLS) ]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # # Similar to PKG_CHECK_MODULES, make sure that the first instance of # this or PKG_CHECK_MODULES is called, or make sure to call # PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_ifval([$2], [$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$PKG_CONFIG"; then if test -n "$$1"; then pkg_cv_[]$1="$$1" else PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`], [pkg_failed=yes]) fi else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$2"` else $1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ifelse([$4], , [AC_MSG_ERROR(dnl [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT ])], [AC_MSG_RESULT([no]) $4]) elif test $pkg_failed = untried; then ifelse([$4], , [AC_MSG_FAILURE(dnl [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])], [$4]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) ifelse([$3], , :, [$3]) fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.10' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.10.2], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.10.2])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to # `$srcdir', `$srcdir/..', or `$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is `.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # This was merged into AC_PROG_CC in Autoconf. AU_DEFUN([AM_PROG_CC_STDC], [AC_PROG_CC AC_DIAGNOSE([obsolete], [$0: your code should no longer depend upon `am_cv_prog_cc_stdc', but upon `ac_cv_prog_cc_stdc'. Remove this warning and the assignment when you adjust the code. You can also remove the above call to AC_PROG_CC if you already called it elsewhere.]) am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc ]) AU_DEFUN([fp_PROG_CC_STDC]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 8 # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ(2.52)dnl ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 9 # There are a few dirty hacks below to avoid letting `AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "GCJ", or "OBJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl ifelse([$1], CC, [depcc="$CC" am_compiler_list=], [$1], CXX, [depcc="$CXX" am_compiler_list=], [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], UPC, [depcc="$UPC" am_compiler_list=], [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE(dependency-tracking, [ --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. #serial 4 # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [# Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each `.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, # 2005, 2006, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 13 # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.60])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) AM_MISSING_PROG(AUTOCONF, autoconf) AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) AM_MISSING_PROG(AUTOHEADER, autoheader) AM_MISSING_PROG(MAKEINFO, makeinfo) AM_PROG_INSTALL_SH AM_PROG_INSTALL_STRIP AC_REQUIRE([AM_PROG_MKDIR_P])dnl # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES(CC)], [define([AC_PROG_CC], defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES(CXX)], [define([AC_PROG_CXX], defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES(OBJC)], [define([AC_PROG_OBJC], defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl ]) ]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} AC_SUBST(install_sh)]) # Copyright (C) 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 AC_DEFUN([AM_MAINTAINER_MODE], [AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode is disabled by default AC_ARG_ENABLE(maintainer-mode, [ --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer], USE_MAINTAINER_MODE=$enableval, USE_MAINTAINER_MODE=no) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST(MAINT)dnl ] ) AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE]) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 3 # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 5 # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it supports --run. # If it does, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= AC_MSG_WARN([`missing' script is too old or missing]) fi ]) # Copyright (C) 2003, 2004, 2005, 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_MKDIR_P # --------------- # Check for `mkdir -p'. AC_DEFUN([AM_PROG_MKDIR_P], [AC_PREREQ([2.60])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P, dnl while keeping a definition of mkdir_p for backward compatibility. dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile. dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of dnl Makefile.ins that do not define MKDIR_P, so we do our own dnl adjustment using top_builddir (which is defined more often than dnl MKDIR_P). AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl case $mkdir_p in [[\\/$]]* | ?:[[\\/]]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac ]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # ------------------------------ # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), 1)]) # _AM_SET_OPTIONS(OPTIONS) # ---------------------------------- # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005 # Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 4 # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT(yes)]) # Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor `install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in `make install-strip', and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be `maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004, 2005 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # serial 2 # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of `v7', `ustar', or `pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. AM_MISSING_PROG([AMTAR], [tar]) m4_if([$1], [v7], [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of `-'. for _am_tool in $_am_tools do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR gpiv-0.6.1/README0000644000175000017500000000637511076052422010276 00000000000000 GPIV is a graphic user interface for analyzing images obtained from a fluid flow that has been seeded with tracer particles by the so-called Particle Image Velocimetry technique. It is meant to have a quick overview of the parameters of all piv processes, easily changing them, running the processes and visualizing their results in an interactive way. It uses LIBGPIV, which contains the main routines for data in-and output, processing etc. The software is written in ANSI-C under the LINUX operating system by using the GTK/GNOME libraries. GPIV is Free Software licensed under the GNU Public license terms. See the COPYING file for the license. The main web page can be found at: http://gpiv.sourceforge.net/ Compilation and installation ============================ The General instructions of compilation and installation can be found in INSTALL. There are some additional configuration options for this program, as well. These are: --enable-cam --enable-trig --enable-rta=RTA_DIR --enable-k=K_DIR --enable-img-width=WIDTH --enable-img-height=HEIGHT --enable-debug An explanation of these options is printed with ./configure --help. Features ========= General ======== - Data storage in ASCII format or HDF version 5 format. - Loading of images with with file-open menu, "open" button or with "drag and drop" from the gnome file-manager "nautilus" into the buffer list. - Quick execution of all enabled process on all selected buffers. Display ======== - Visualization of interrogation area contours and highlighting them when pointing to it. - Displays pointer position and belonging estimated values. Image recording =============== - Sending trigger pulses over the parallel port by using Real Time Linux and RTAI - Obtaining images from a IEEE1394 (Firewire) IIDC_Compliant CCD camera Image info =========== - shows image name, dimensions and type of correlation (cross or auto). - defining of spatial and time scales, position of image within the experiment. - Adding and updating header information (date of creation, project, comment etc). Image evaluation ================= - Interrogation at the entire image or at a defined region within the image frames, resulting into a displacement field on a rectangular grid. - Interrogation at a single arbitrary point, along a vertical or horizontal line. - Re-interrogation of a single area with, different parameters. - Dragging a single interrogation area from the rectangular grid. - Arbitrary interrogation area sizes. - Global pre-shifting. - Local pre-shifting or zero offsetting of the interrogation areas. - Forward and central interrogation scheme. - Adaptive interrogation area sizes to obtain high resolution and dynamic range. - Different interpolation schemes for sub-pixel estimation. - Cross and auto correlation. - Defining the order of correlation peak to be used as estimator. - Visualization of interrogation area's and correlation function. Data validation =========== - Manually enabling and disabling of PIV estimators interactively. - Checking on peak-locking effects. - Validation on outliers by snr value or median test. Post-processing =============== - apply time and spatial scaling - calculate statistics and subtraction of mean values from estimators - calculation of vorticity and strain. gpiv-0.6.1/configure0000755000175000017500000121475011204234174011323 00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.63 for gpiv 0.6.1. # # Report bugs to . # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH if test "x$CONFIG_SHELL" = x; then if (eval ":") 2>/dev/null; then as_have_required=yes else as_have_required=no fi if test $as_have_required = yes && (eval ": (as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=\$LINENO as_lineno_2=\$LINENO test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" && test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; } ") 2> /dev/null; then : else as_candidate_shells= as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. case $as_dir in /*) for as_base in sh bash ksh sh5; do as_candidate_shells="$as_candidate_shells $as_dir/$as_base" done;; esac done IFS=$as_save_IFS for as_shell in $as_candidate_shells $SHELL; do # Try only shells that exist, to save several forks. if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { ("$as_shell") 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : _ASEOF }; then CONFIG_SHELL=$as_shell as_have_required=yes if { "$as_shell" 2> /dev/null <<\_ASEOF if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi : (as_func_return () { (exit $1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = "$1" ); then : else exitcode=1 echo positional parameters were not saved. fi test $exitcode = 0) || { (exit 1); exit 1; } ( as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; } _ASEOF }; then break fi fi done if test "x$CONFIG_SHELL" != x; then for as_var in BASH_ENV ENV do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test $as_have_required = no; then echo This script requires a shell more modern than all the echo shells that I found on your system. Please install a echo modern shell, or manually run the script under such a echo shell if you do have one. { (exit 1); exit 1; } fi fi fi (eval "as_func_return () { (exit \$1) } as_func_success () { as_func_return 0 } as_func_failure () { as_func_return 1 } as_func_ret_success () { return 0 } as_func_ret_failure () { return 1 } exitcode=0 if as_func_success; then : else exitcode=1 echo as_func_success failed. fi if as_func_failure; then exitcode=1 echo as_func_failure succeeded. fi if as_func_ret_success; then : else exitcode=1 echo as_func_ret_success failed. fi if as_func_ret_failure; then exitcode=1 echo as_func_ret_failure succeeded. fi if ( set x; as_func_ret_success y && test x = \"\$1\" ); then : else exitcode=1 echo positional parameters were not saved. fi test \$exitcode = 0") || { echo No shell found that supports shell functions. echo Please tell bug-autoconf@gnu.org about your system, echo including any error possibly output before this message. echo This can help us improve future autoconf versions. echo Configuration will now proceed without shell functions. } as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= SHELL=${CONFIG_SHELL-/bin/sh} # Identity of this package. PACKAGE_NAME='gpiv' PACKAGE_TARNAME='gpiv' PACKAGE_VERSION='0.6.1' PACKAGE_STRING='gpiv 0.6.1' PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=gpiv' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS DEBUG CANVAS_AA OVERRIDE_IMAGE_HEIGHT_MAX OVERRIDE_IMAGE_WIDTH_MAX K_TOPDIR RTA_TOPDIR HAVE_CONTROL_FALSE HAVE_CONTROL_TRUE CONTROL ENABLE_DAC ENABLE_TRIG ENABLE_CAM RR MPIRUN ENABLE_MPI_RR ENABLE_MPI ALL_LINGUAS INTLTOOL_PERL MSGMERGE INTLTOOL_POLICY_RULE INTLTOOL_SERVICE_RULE INTLTOOL_THEME_RULE INTLTOOL_SCHEMAS_RULE INTLTOOL_CAVES_RULE INTLTOOL_XML_NOMERGE_RULE INTLTOOL_XML_RULE INTLTOOL_KBD_RULE INTLTOOL_XAM_RULE INTLTOOL_UI_RULE INTLTOOL_SOUNDLIST_RULE INTLTOOL_SHEET_RULE INTLTOOL_SERVER_RULE INTLTOOL_PONG_RULE INTLTOOL_OAF_RULE INTLTOOL_PROP_RULE INTLTOOL_KEYS_RULE INTLTOOL_DIRECTORY_RULE INTLTOOL_DESKTOP_RULE INTLTOOL_EXTRACT INTLTOOL_MERGE INTLTOOL_UPDATE MKINSTALLDIRS POSUB POFILES PO_IN_DATADIR_FALSE PO_IN_DATADIR_TRUE INTLLIBS INSTOBJEXT GMOFILES DATADIRNAME CATOBJEXT CATALOGS XGETTEXT GMSGFMT MSGFMT_OPTS MSGFMT USE_NLS GETTEXT_PACKAGE GPIV_LIBS GPIV_CFLAGS GPIV_UI_LIBS GPIV_UI_CFLAGS PKG_CONFIG EGREP GREP CPP am__fastdepCC_FALSE am__fastdepCC_TRUE CCDEPMODE AMDEPBACKSLASH AMDEP_FALSE AMDEP_TRUE am__quote am__include DEPDIR OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC MAINT MAINTAINER_MODE_FALSE MAINTAINER_MODE_TRUE am__untar am__tar AMTAR am__leading_dot SET_MAKE AWK mkdir_p MKDIR_P INSTALL_STRIP_PROGRAM STRIP install_sh MAKEINFO AUTOHEADER AUTOMAKE AUTOCONF ACLOCAL VERSION PACKAGE CYGPATH_W am__isrc INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_maintainer_mode enable_dependency_tracking enable_nls enable_mpi enable_rr enable_cam enable_trig enable_rta enable_k enable_img_width enable_img_height enable_canvas_aa enable_debug ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP PKG_CONFIG GPIV_UI_CFLAGS GPIV_UI_LIBS GPIV_CFLAGS GPIV_LIBS' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && { $as_echo "$as_me: error: invalid feature name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && { $as_echo "$as_me: error: invalid package name: $ac_useropt" >&2 { (exit 1); exit 1; }; } ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) { $as_echo "$as_me: error: unrecognized option: $ac_option Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && { $as_echo "$as_me: error: invalid variable name: $ac_envvar" >&2 { (exit 1); exit 1; }; } eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` { $as_echo "$as_me: error: missing argument to $ac_option" >&2 { (exit 1); exit 1; }; } fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) { $as_echo "$as_me: error: unrecognized options: $ac_unrecognized_opts" >&2 { (exit 1); exit 1; }; } ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac { $as_echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 { (exit 1); exit 1; }; } done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || { $as_echo "$as_me: error: working directory cannot be determined" >&2 { (exit 1); exit 1; }; } test "X$ac_ls_di" = "X$ac_pwd_ls_di" || { $as_echo "$as_me: error: pwd does not report name of working directory" >&2 { (exit 1); exit 1; }; } # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." { $as_echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 { (exit 1); exit 1; }; } fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || { $as_echo "$as_me: error: $ac_msg" >&2 { (exit 1); exit 1; }; } pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures gpiv 0.6.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/gpiv] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF Program names: --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of gpiv 0.6.1:";; esac cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-maintainer-mode enable make rules and dependencies not useful (and sometimes confusing) to the casual installer --disable-dependency-tracking speeds up one-time build --enable-dependency-tracking do not reject slow dependency extractors --disable-nls do not use Native Language Support --enable-mpi enable Message Protocol Interface (MPI) --enable-rr checks also for MPI-enabled gpiv_rr --enable-cam enable data acquisition --enable-trig enable (realtime) triggering --enable-rta=RTA_DIR place where the RTAI code resides (default /usr/lib/realtime) --enable-k=K_DIR place where the installed kernel headers resides (default /usr/src/kernel-headers-2.4.27-adeos) --enable-img-width=WIDTH maximum image width to be used (default SVGA) --enable-img-height=HEIGHT maximum image height to be used (default SVGA) --enable-canvas-aa Use Anti Aliased canvas for viewer; slower but better displaying of image and resulting data --enable-debug debug version (more verbose) Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS C/C++/Objective C preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor PKG_CONFIG path to pkg-config utility GPIV_UI_CFLAGS C compiler flags for GPIV_UI, overriding pkg-config GPIV_UI_LIBS linker flags for GPIV_UI, overriding pkg-config GPIV_CFLAGS C compiler flags for GPIV, overriding pkg-config GPIV_LIBS linker flags for GPIV, overriding pkg-config Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF gpiv configure 0.6.1 generated by GNU Autoconf 2.63 Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by gpiv $as_me 0.6.1, which was generated by GNU Autoconf 2.63. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; 2) ac_configure_args1="$ac_configure_args1 '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac done done $as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } $as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test -r "$ac_site_file"; then { $as_echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special # files actually), so we avoid doing that. if test -f "$cache_file"; then { $as_echo "$as_me:$LINENO: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:$LINENO: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:$LINENO: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:$LINENO: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:$LINENO: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} { { $as_echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 $as_echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} { (exit 1); exit 1; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu am__api_version='1.10' ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then { { $as_echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5 $as_echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;} { (exit 1); exit 1; }; } fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in ./ | .// | /cC/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:$LINENO: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:$LINENO: checking whether build environment is sane" >&5 $as_echo_n "checking whether build environment is sane... " >&6; } # Just in case sleep 1 echo timestamp > conftest.file # Do `set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` if test "$*" = "X"; then # -L didn't work. set X `ls -t $srcdir/configure conftest.file` fi rm -f conftest.file if test "$*" != "X $srcdir/configure conftest.file" \ && test "$*" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". { { $as_echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&5 $as_echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken alias in your environment" >&2;} { (exit 1); exit 1; }; } fi test "$2" = conftest.file ) then # Ok. : else { { $as_echo "$as_me:$LINENO: error: newly created file is older than distributed files! Check your system clock" >&5 $as_echo "$as_me: error: newly created file is older than distributed files! Check your system clock" >&2;} { (exit 1); exit 1; }; } fi { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } test "$program_prefix" != NONE && program_transform_name="s&^&$program_prefix&;$program_transform_name" # Use a double $ so make ignores it. test "$program_suffix" != NONE && program_transform_name="s&\$&$program_suffix&;$program_transform_name" # Double any \ or $. # By default was `s,x,x', remove it if useless. ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" # Use eval to expand $SHELL if eval "$MISSING --run true"; then am_missing_run="$MISSING --run " else am_missing_run= { $as_echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 $as_echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} fi { $as_echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5 $as_echo_n "checking for a thread-safe mkdir -p... " >&6; } if test -z "$MKDIR_P"; then if test "${ac_cv_path_mkdir+set}" = set; then $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in mkdir gmkdir; do for ac_exec_ext in '' $ac_executable_extensions; do { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( 'mkdir (GNU coreutils) '* | \ 'mkdir (coreutils) '* | \ 'mkdir (fileutils) '4.1*) ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext break 3;; esac done done done IFS=$as_save_IFS fi if test "${ac_cv_path_mkdir+set}" = set; then MKDIR_P="$ac_cv_path_mkdir -p" else # As a last resort, use the slow shell script. Don't cache a # value for MKDIR_P within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. test -d ./--version && rmdir ./--version MKDIR_P="$ac_install_sh -d" fi fi { $as_echo "$as_me:$LINENO: result: $MKDIR_P" >&5 $as_echo "$MKDIR_P" >&6; } mkdir_p="$MKDIR_P" case $mkdir_p in [\\/$]* | ?:[\\/]*) ;; */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;; esac for ac_prog in gawk mawk nawk awk do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_AWK+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$AWK"; then ac_cv_prog_AWK="$AWK" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_AWK="$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi AWK=$ac_cv_prog_AWK if test -n "$AWK"; then { $as_echo "$as_me:$LINENO: result: $AWK" >&5 $as_echo "$AWK" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$AWK" && break done { $as_echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." am__isrc=' -I$(srcdir)' # test to see if srcdir already configured if test -f $srcdir/config.status; then { { $as_echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 $as_echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} { (exit 1); exit 1; }; } fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi # Define the identity of the package. PACKAGE=gpiv VERSION=0.6.1 cat >>confdefs.h <<_ACEOF #define PACKAGE "$PACKAGE" _ACEOF cat >>confdefs.h <<_ACEOF #define VERSION "$VERSION" _ACEOF # Some tools Automake needs. ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"} # Installed binaries are usually stripped using `strip' when the user # run `make install-strip'. However `strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the `STRIP' environment variable to overrule this program. if test "$cross_compiling" != no; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. set dummy ${ac_tool_prefix}strip; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_STRIP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$STRIP"; then ac_cv_prog_STRIP="$STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_STRIP="${ac_tool_prefix}strip" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi STRIP=$ac_cv_prog_STRIP if test -n "$STRIP"; then { $as_echo "$as_me:$LINENO: result: $STRIP" >&5 $as_echo "$STRIP" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_STRIP"; then ac_ct_STRIP=$STRIP # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_STRIP"; then ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_STRIP="strip" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP if test -n "$ac_ct_STRIP"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 $as_echo "$ac_ct_STRIP" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_STRIP" = x; then STRIP=":" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac STRIP=$ac_ct_STRIP fi else STRIP="$ac_cv_prog_STRIP" fi fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" # We need awk for the "check" target. The system "awk" is bad on # some platforms. # Always define AMTAR for backward compatibility. AMTAR=${AMTAR-"${am_missing_run}tar"} am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -' { $as_echo "$as_me:$LINENO: checking whether to enable maintainer-specific portions of Makefiles" >&5 $as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; } # Check whether --enable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval else USE_MAINTAINER_MODE=no fi { $as_echo "$as_me:$LINENO: result: $USE_MAINTAINER_MODE" >&5 $as_echo "$USE_MAINTAINER_MODE" >&6; } if test $USE_MAINTAINER_MODE = yes; then MAINTAINER_MODE_TRUE= MAINTAINER_MODE_FALSE='#' else MAINTAINER_MODE_TRUE='#' MAINTAINER_MODE_FALSE= fi MAINT=$MAINTAINER_MODE_TRUE DEPDIR="${am__leading_dot}deps" ac_config_commands="$ac_config_commands depfiles" am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo done .PHONY: am__doit END # If we don't find an include directive, just comment out the code. { $as_echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 $as_echo_n "checking for style of include used by $am_make... " >&6; } am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # We grep out `Entering directory' and `Leaving directory' # messages which can occur if `w' ends up in MAKEFLAGS. # In particular we don't look at `^make:' because GNU make might # be invoked under some other name (usually "gmake"), in which # case it prints its new name instead of `make'. if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then am__include=include am__quote= _am_result=GNU fi # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then am__include=.include am__quote="\"" _am_result=BSD fi fi { $as_echo "$as_me:$LINENO: result: $_am_result" >&5 $as_echo "$_am_result" >&6; } rm -f confinc confmf # Check whether --enable-dependency-tracking was given. if test "${enable_dependency_tracking+set}" = set; then enableval=$enable_dependency_tracking; fi if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' fi if test "x$enable_dependency_tracking" != xno; then AMDEP_TRUE= AMDEP_FALSE='#' else AMDEP_TRUE='#' AMDEP_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 $as_echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } # Provide some information about the compiler. $as_echo "$as_me:$LINENO: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { (ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi { $as_echo "$as_me:$LINENO: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } if test -z "$ac_file"; then $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: C compiler cannot create executables See \`config.log' for more details." >&5 $as_echo "$as_me: error: C compiler cannot create executables See \`config.log' for more details." >&2;} { (exit 77); exit 77; }; }; } fi ac_exeext=$ac_cv_exeext # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:$LINENO: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } # FIXME: These cross compiler hacks should be removed for Autoconf 3.0 # If not cross compiling, check that we can run a simple program. if test "$cross_compiling" != yes; then if { ac_try='./$ac_file' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi fi fi { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } { $as_echo "$as_me:$LINENO: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } { $as_echo "$as_me:$LINENO: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi rm -f conftest$ac_cv_exeext { $as_echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT { $as_echo "$as_me:$LINENO: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&5 $as_echo "$as_me: error: cannot compute suffix of object files: cannot compile See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:$LINENO: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:$LINENO: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi { $as_echo "$as_me:$LINENO: checking for library containing strerror" >&5 $as_echo_n "checking for library containing strerror... " >&6; } if test "${ac_cv_search_strerror+set}" = set; then $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strerror (); int main () { return strerror (); ; return 0; } _ACEOF for ac_lib in '' cposix; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_search_strerror=$ac_res else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext if test "${ac_cv_search_strerror+set}" = set; then break fi done if test "${ac_cv_search_strerror+set}" = set; then : else ac_cv_search_strerror=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_search_strerror" >&5 $as_echo "$ac_cv_search_strerror" >&6; } ac_res=$ac_cv_search_strerror if test "$ac_res" != no; then test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 $as_echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } # Provide some information about the compiler. $as_echo "$as_me:$LINENO: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:$LINENO: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:$LINENO: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:$LINENO: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&5 $as_echo "$as_me: error: no acceptable C compiler found in \$PATH See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } # Provide some information about the compiler. $as_echo "$as_me:$LINENO: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 { (ac_try="$ac_compiler --version >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler --version >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -v >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -v >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { (ac_try="$ac_compiler -V >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compiler -V >&5") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } { $as_echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_compiler_gnu=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 CFLAGS="" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_g=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_prog_cc_c89=$ac_arg else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:$LINENO: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:$LINENO: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu depcc="$CC" am_compiler_list= { $as_echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 $as_echo_n "checking dependency style of $depcc... " >&6; } if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named `D' -- because `-MD' means `put the output # in D'. mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_CC_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` fi for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with # Solaris 8's {/usr,}/bin/sh. touch sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf case $depmode in nosideeffect) # after this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; none) break ;; esac # We check with `-c' and `-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle `-M -o', and we need to detect this. if depmode=$depmode \ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_CC_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_CC_dependencies_compiler_type=none fi fi { $as_echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 $as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type if test "x$enable_dependency_tracking" != xno \ && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then am__fastdepCC_TRUE= am__fastdepCC_FALSE='#' else am__fastdepCC_TRUE='#' am__fastdepCC_FALSE= fi am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:$LINENO: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then # Broken: success on invalid input. continue else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&5 $as_echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; then $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then { { $as_echo "$as_me:$LINENO: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 $as_echo "$as_me: error: no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:$LINENO: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if test "${ac_cv_path_EGREP+set}" = set; then $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break ac_count=`expr $ac_count + 1` if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then { { $as_echo "$as_me:$LINENO: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5 $as_echo "$as_me: error: no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;} { (exit 1); exit 1; }; } fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:$LINENO: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_cv_header_stdc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF rm -f conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { ac_try='./conftest$ac_exeext' { (case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; }; then : else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ( exit $ac_status ) ac_cv_header_stdc=no fi rm -rf conftest.dSYM rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext fi fi fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then cat >>confdefs.h <<\_ACEOF #define STDC_HEADERS 1 _ACEOF fi # ============ Switched off: #AC_SUBST(CFLAGS) #AC_SUBST(CPPFLAGS) #AC_SUBST(LDFLAGS) GNOME_COMPILE_WARNINGS if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_PKG_CONFIG+set}" = set; then $as_echo_n "(cached) " >&6 else case $PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi PKG_CONFIG=$ac_cv_path_PKG_CONFIG if test -n "$PKG_CONFIG"; then { $as_echo "$as_me:$LINENO: result: $PKG_CONFIG" >&5 $as_echo "$PKG_CONFIG" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_path_PKG_CONFIG"; then ac_pt_PKG_CONFIG=$PKG_CONFIG # Extract the first word of "pkg-config", so it can be a program name with args. set dummy pkg-config; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then $as_echo_n "(cached) " >&6 else case $ac_pt_PKG_CONFIG in [\\/]* | ?:[\\/]*) ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG if test -n "$ac_pt_PKG_CONFIG"; then { $as_echo "$as_me:$LINENO: result: $ac_pt_PKG_CONFIG" >&5 $as_echo "$ac_pt_PKG_CONFIG" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_pt_PKG_CONFIG" = x; then PKG_CONFIG="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:$LINENO: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac PKG_CONFIG=$ac_pt_PKG_CONFIG fi else PKG_CONFIG="$ac_cv_path_PKG_CONFIG" fi fi if test -n "$PKG_CONFIG"; then _pkg_min_version=0.9.0 { $as_echo "$as_me:$LINENO: checking pkg-config is at least version $_pkg_min_version" >&5 $as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } PKG_CONFIG="" fi fi pkg_failed=no { $as_echo "$as_me:$LINENO: checking for GPIV_UI" >&5 $as_echo_n "checking for GPIV_UI... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GPIV_UI_CFLAGS"; then pkg_cv_GPIV_UI_CFLAGS="$GPIV_UI_CFLAGS" else if test -n "$PKG_CONFIG" && \ { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libgnomeui-2.0\"") >&5 ($PKG_CONFIG --exists --print-errors "libgnomeui-2.0") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then pkg_cv_GPIV_UI_CFLAGS=`$PKG_CONFIG --cflags "libgnomeui-2.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GPIV_UI_LIBS"; then pkg_cv_GPIV_UI_LIBS="$GPIV_UI_LIBS" else if test -n "$PKG_CONFIG" && \ { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"libgnomeui-2.0\"") >&5 ($PKG_CONFIG --exists --print-errors "libgnomeui-2.0") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then pkg_cv_GPIV_UI_LIBS=`$PKG_CONFIG --libs "libgnomeui-2.0" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GPIV_UI_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libgnomeui-2.0"` else GPIV_UI_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libgnomeui-2.0"` fi # Put the nasty error message in config.log where it belongs echo "$GPIV_UI_PKG_ERRORS" >&5 { { $as_echo "$as_me:$LINENO: error: Package requirements (libgnomeui-2.0) were not met: $GPIV_UI_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GPIV_UI_CFLAGS and GPIV_UI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " >&5 $as_echo "$as_me: error: Package requirements (libgnomeui-2.0) were not met: $GPIV_UI_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GPIV_UI_CFLAGS and GPIV_UI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " >&2;} { (exit 1); exit 1; }; } elif test $pkg_failed = untried; then { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GPIV_UI_CFLAGS and GPIV_UI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." >&5 $as_echo "$as_me: error: The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GPIV_UI_CFLAGS and GPIV_UI_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } else GPIV_UI_CFLAGS=$pkg_cv_GPIV_UI_CFLAGS GPIV_UI_LIBS=$pkg_cv_GPIV_UI_LIBS { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } : fi GPIV_GNOME_LIBS="libgnomeui-2.0" echo "configuring with libraries: " $gpiv_gnome_libs pkg_failed=no { $as_echo "$as_me:$LINENO: checking for GPIV" >&5 $as_echo_n "checking for GPIV... " >&6; } if test -n "$PKG_CONFIG"; then if test -n "$GPIV_CFLAGS"; then pkg_cv_GPIV_CFLAGS="$GPIV_CFLAGS" else if test -n "$PKG_CONFIG" && \ { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"\$GPIV_GNOME_LIBS\"") >&5 ($PKG_CONFIG --exists --print-errors "$GPIV_GNOME_LIBS") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then pkg_cv_GPIV_CFLAGS=`$PKG_CONFIG --cflags "$GPIV_GNOME_LIBS" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test -n "$PKG_CONFIG"; then if test -n "$GPIV_LIBS"; then pkg_cv_GPIV_LIBS="$GPIV_LIBS" else if test -n "$PKG_CONFIG" && \ { ($as_echo "$as_me:$LINENO: \$PKG_CONFIG --exists --print-errors \"\$GPIV_GNOME_LIBS\"") >&5 ($PKG_CONFIG --exists --print-errors "$GPIV_GNOME_LIBS") 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then pkg_cv_GPIV_LIBS=`$PKG_CONFIG --libs "$GPIV_GNOME_LIBS" 2>/dev/null` else pkg_failed=yes fi fi else pkg_failed=untried fi if test $pkg_failed = yes; then if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi if test $_pkg_short_errors_supported = yes; then GPIV_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$GPIV_GNOME_LIBS"` else GPIV_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$GPIV_GNOME_LIBS"` fi # Put the nasty error message in config.log where it belongs echo "$GPIV_PKG_ERRORS" >&5 { { $as_echo "$as_me:$LINENO: error: Package requirements ($GPIV_GNOME_LIBS) were not met: $GPIV_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GPIV_CFLAGS and GPIV_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " >&5 $as_echo "$as_me: error: Package requirements ($GPIV_GNOME_LIBS) were not met: $GPIV_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. Alternatively, you may set the environment variables GPIV_CFLAGS and GPIV_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. " >&2;} { (exit 1); exit 1; }; } elif test $pkg_failed = untried; then { { $as_echo "$as_me:$LINENO: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { { $as_echo "$as_me:$LINENO: error: The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GPIV_CFLAGS and GPIV_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." >&5 $as_echo "$as_me: error: The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. Alternatively, you may set the environment variables GPIV_CFLAGS and GPIV_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details. To get pkg-config, see . See \`config.log' for more details." >&2;} { (exit 1); exit 1; }; }; } else GPIV_CFLAGS=$pkg_cv_GPIV_CFLAGS GPIV_LIBS=$pkg_cv_GPIV_LIBS { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } : fi GETTEXT_PACKAGE=gpiv cat >>confdefs.h <<_ACEOF #define GETTEXT_PACKAGE "$GETTEXT_PACKAGE" _ACEOF ALL_LINGUAS="ca de nl" # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then eval "$as_ac_Header=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in locale.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 $as_echo_n "checking $ac_header usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 $as_echo_n "checking $ac_header presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------------------------------- ## ## Report this to http://bugzilla.gnome.org/enter_bug.cgi?product=gpiv ## ## ------------------------------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done if test $ac_cv_header_locale_h = yes; then { $as_echo "$as_me:$LINENO: checking for LC_MESSAGES" >&5 $as_echo_n "checking for LC_MESSAGES... " >&6; } if test "${am_cv_val_LC_MESSAGES+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { return LC_MESSAGES ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then am_cv_val_LC_MESSAGES=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 am_cv_val_LC_MESSAGES=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $am_cv_val_LC_MESSAGES" >&5 $as_echo "$am_cv_val_LC_MESSAGES" >&6; } if test $am_cv_val_LC_MESSAGES = yes; then cat >>confdefs.h <<\_ACEOF #define HAVE_LC_MESSAGES 1 _ACEOF fi fi USE_NLS=yes gt_cv_have_gettext=no CATOBJEXT=NONE XGETTEXT=: INTLLIBS= if test "${ac_cv_header_libintl_h+set}" = set; then { $as_echo "$as_me:$LINENO: checking for libintl.h" >&5 $as_echo_n "checking for libintl.h... " >&6; } if test "${ac_cv_header_libintl_h+set}" = set; then $as_echo_n "(cached) " >&6 fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_libintl_h" >&5 $as_echo "$ac_cv_header_libintl_h" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking libintl.h usability" >&5 $as_echo_n "checking libintl.h usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking libintl.h presence" >&5 $as_echo_n "checking libintl.h presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: libintl.h: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: libintl.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libintl.h: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: libintl.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: libintl.h: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: libintl.h: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libintl.h: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: libintl.h: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libintl.h: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: libintl.h: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libintl.h: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: libintl.h: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libintl.h: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: libintl.h: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libintl.h: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: libintl.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------------------------------- ## ## Report this to http://bugzilla.gnome.org/enter_bug.cgi?product=gpiv ## ## ------------------------------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:$LINENO: checking for libintl.h" >&5 $as_echo_n "checking for libintl.h... " >&6; } if test "${ac_cv_header_libintl_h+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_header_libintl_h=$ac_header_preproc fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_libintl_h" >&5 $as_echo "$ac_cv_header_libintl_h" >&6; } fi if test "x$ac_cv_header_libintl_h" = x""yes; then gt_cv_func_dgettext_libintl="no" libintl_extra_libs="" # # First check in libc # { $as_echo "$as_me:$LINENO: checking for ngettext in libc" >&5 $as_echo_n "checking for ngettext in libc... " >&6; } if test "${gt_cv_func_ngettext_libc+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { return !ngettext ("","", 1) ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then gt_cv_func_ngettext_libc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 gt_cv_func_ngettext_libc=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $gt_cv_func_ngettext_libc" >&5 $as_echo "$gt_cv_func_ngettext_libc" >&6; } if test "$gt_cv_func_ngettext_libc" = "yes" ; then { $as_echo "$as_me:$LINENO: checking for dgettext in libc" >&5 $as_echo_n "checking for dgettext in libc... " >&6; } if test "${gt_cv_func_dgettext_libc+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include int main () { return !dgettext ("","") ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then gt_cv_func_dgettext_libc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 gt_cv_func_dgettext_libc=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $gt_cv_func_dgettext_libc" >&5 $as_echo "$gt_cv_func_dgettext_libc" >&6; } fi if test "$gt_cv_func_ngettext_libc" = "yes" ; then for ac_func in bind_textdomain_codeset do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done fi # # If we don't have everything we want, check in libintl # if test "$gt_cv_func_dgettext_libc" != "yes" \ || test "$gt_cv_func_ngettext_libc" != "yes" \ || test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then { $as_echo "$as_me:$LINENO: checking for bindtextdomain in -lintl" >&5 $as_echo_n "checking for bindtextdomain in -lintl... " >&6; } if test "${ac_cv_lib_intl_bindtextdomain+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bindtextdomain (); int main () { return bindtextdomain (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_intl_bindtextdomain=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_intl_bindtextdomain=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_intl_bindtextdomain" >&5 $as_echo "$ac_cv_lib_intl_bindtextdomain" >&6; } if test "x$ac_cv_lib_intl_bindtextdomain" = x""yes; then { $as_echo "$as_me:$LINENO: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if test "${ac_cv_lib_intl_ngettext+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_intl_ngettext=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_intl_ngettext=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = x""yes; then { $as_echo "$as_me:$LINENO: checking for dgettext in -lintl" >&5 $as_echo_n "checking for dgettext in -lintl... " >&6; } if test "${ac_cv_lib_intl_dgettext+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dgettext (); int main () { return dgettext (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_intl_dgettext=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_intl_dgettext=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_intl_dgettext" >&5 $as_echo "$ac_cv_lib_intl_dgettext" >&6; } if test "x$ac_cv_lib_intl_dgettext" = x""yes; then gt_cv_func_dgettext_libintl=yes fi fi fi if test "$gt_cv_func_dgettext_libintl" != "yes" ; then { $as_echo "$as_me:$LINENO: checking if -liconv is needed to use gettext" >&5 $as_echo_n "checking if -liconv is needed to use gettext... " >&6; } { $as_echo "$as_me:$LINENO: result: " >&5 $as_echo "" >&6; } { $as_echo "$as_me:$LINENO: checking for ngettext in -lintl" >&5 $as_echo_n "checking for ngettext in -lintl... " >&6; } if test "${ac_cv_lib_intl_ngettext+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char ngettext (); int main () { return ngettext (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_intl_ngettext=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_intl_ngettext=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_intl_ngettext" >&5 $as_echo "$ac_cv_lib_intl_ngettext" >&6; } if test "x$ac_cv_lib_intl_ngettext" = x""yes; then { $as_echo "$as_me:$LINENO: checking for dcgettext in -lintl" >&5 $as_echo_n "checking for dcgettext in -lintl... " >&6; } if test "${ac_cv_lib_intl_dcgettext+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl -liconv $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dcgettext (); int main () { return dcgettext (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_intl_dcgettext=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_intl_dcgettext=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_intl_dcgettext" >&5 $as_echo "$ac_cv_lib_intl_dcgettext" >&6; } if test "x$ac_cv_lib_intl_dcgettext" = x""yes; then gt_cv_func_dgettext_libintl=yes libintl_extra_libs=-liconv else : fi else : fi fi # # If we found libintl, then check in it for bind_textdomain_codeset(); # we'll prefer libc if neither have bind_textdomain_codeset(), # and both have dgettext and ngettext # if test "$gt_cv_func_dgettext_libintl" = "yes" ; then glib_save_LIBS="$LIBS" LIBS="$LIBS -lintl $libintl_extra_libs" unset ac_cv_func_bind_textdomain_codeset for ac_func in bind_textdomain_codeset do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done LIBS="$glib_save_LIBS" if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then gt_cv_func_dgettext_libc=no else if test "$gt_cv_func_dgettext_libc" = "yes" \ && test "$gt_cv_func_ngettext_libc" = "yes"; then gt_cv_func_dgettext_libintl=no fi fi fi fi if test "$gt_cv_func_dgettext_libc" = "yes" \ || test "$gt_cv_func_dgettext_libintl" = "yes"; then gt_cv_have_gettext=yes fi if test "$gt_cv_func_dgettext_libintl" = "yes"; then INTLLIBS="-lintl $libintl_extra_libs" fi if test "$gt_cv_have_gettext" = "yes"; then cat >>confdefs.h <<\_ACEOF #define HAVE_GETTEXT 1 _ACEOF # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_MSGFMT+set}" = set; then $as_echo_n "(cached) " >&6 else case "$MSGFMT" in /*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"; then ac_cv_path_MSGFMT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="no" ;; esac fi MSGFMT="$ac_cv_path_MSGFMT" if test "$MSGFMT" != "no"; then { $as_echo "$as_me:$LINENO: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test "$MSGFMT" != "no"; then glib_save_LIBS="$LIBS" LIBS="$LIBS $INTLLIBS" for ac_func in dcgettext do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` { $as_echo "$as_me:$LINENO: checking for $ac_func" >&5 $as_echo_n "checking for $ac_func... " >&6; } if { as_var=$as_ac_var; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define $ac_func to an innocuous variant, in case declares $ac_func. For example, HP-UX 11i declares gettimeofday. */ #define $ac_func innocuous_$ac_func /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $ac_func (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $ac_func /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $ac_func (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$ac_func || defined __stub___$ac_func choke me #endif int main () { return $ac_func (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then eval "$as_ac_var=yes" else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi ac_res=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } as_val=`eval 'as_val=${'$as_ac_var'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done MSGFMT_OPTS= { $as_echo "$as_me:$LINENO: checking if msgfmt accepts -c" >&5 $as_echo_n "checking if msgfmt accepts -c... " >&6; } cat >conftest.foo <<_ACEOF msgid "" msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Project-Id-Version: test 1.0\n" "PO-Revision-Date: 2007-02-15 12:01+0100\n" "Last-Translator: test \n" "Language-Team: C \n" "MIME-Version: 1.0\n" "Content-Transfer-Encoding: 8bit\n" _ACEOF if { ($as_echo "$as_me:$LINENO: \$MSGFMT -c -o /dev/null conftest.foo") >&5 ($MSGFMT -c -o /dev/null conftest.foo) 2>&5 ac_status=$? $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); }; then MSGFMT_OPTS=-c; { $as_echo "$as_me:$LINENO: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } echo "$as_me: failed input was:" >&5 sed 's/^/| /' conftest.foo >&5 fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_GMSGFMT+set}" = set; then $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:$LINENO: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_XGETTEXT+set}" = set; then $as_echo_n "(cached) " >&6 else case "$XGETTEXT" in /*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"; then ac_cv_path_XGETTEXT="$ac_dir/$ac_word" break fi fi done IFS="$ac_save_ifs" test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" ;; esac fi XGETTEXT="$ac_cv_path_XGETTEXT" if test "$XGETTEXT" != ":"; then { $as_echo "$as_me:$LINENO: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then CATOBJEXT=.gmo DATADIRNAME=share else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 case $host in *-*-solaris*) { $as_echo "$as_me:$LINENO: checking for bind_textdomain_codeset" >&5 $as_echo_n "checking for bind_textdomain_codeset... " >&6; } if test "${ac_cv_func_bind_textdomain_codeset+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define bind_textdomain_codeset to an innocuous variant, in case declares bind_textdomain_codeset. For example, HP-UX 11i declares gettimeofday. */ #define bind_textdomain_codeset innocuous_bind_textdomain_codeset /* System header to define __stub macros and hopefully few prototypes, which can conflict with char bind_textdomain_codeset (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef bind_textdomain_codeset /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bind_textdomain_codeset (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_bind_textdomain_codeset || defined __stub___bind_textdomain_codeset choke me #endif int main () { return bind_textdomain_codeset (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_bind_textdomain_codeset=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_bind_textdomain_codeset=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_bind_textdomain_codeset" >&5 $as_echo "$ac_cv_func_bind_textdomain_codeset" >&6; } if test "x$ac_cv_func_bind_textdomain_codeset" = x""yes; then CATOBJEXT=.gmo DATADIRNAME=share else CATOBJEXT=.mo DATADIRNAME=lib fi ;; *) CATOBJEXT=.mo DATADIRNAME=lib ;; esac fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS="$glib_save_LIBS" INSTOBJEXT=.mo else gt_cv_have_gettext=no fi fi fi if test "$gt_cv_have_gettext" = "yes" ; then cat >>confdefs.h <<\_ACEOF #define ENABLE_NLS 1 _ACEOF fi if test "$XGETTEXT" != ":"; then if $XGETTEXT --omit-header /dev/null 2> /dev/null; then : ; else { $as_echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5 $as_echo "found xgettext program is not GNU xgettext; ignore it" >&6; } XGETTEXT=":" fi fi # We need to process the po/ directory. POSUB=po ac_config_commands="$ac_config_commands default-1" for lang in $ALL_LINGUAS; do GMOFILES="$GMOFILES $lang.gmo" POFILES="$POFILES $lang.po" done if test "$gt_cv_have_gettext" = "yes"; then if test "x$ALL_LINGUAS" = "x"; then LINGUAS= else { $as_echo "$as_me:$LINENO: checking for catalogs to be installed" >&5 $as_echo_n "checking for catalogs to be installed... " >&6; } NEW_LINGUAS= for presentlang in $ALL_LINGUAS; do useit=no if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then desiredlanguages="$LINGUAS" else desiredlanguages="$ALL_LINGUAS" fi for desiredlang in $desiredlanguages; do # Use the presentlang catalog if desiredlang is # a. equal to presentlang, or # b. a variant of presentlang (because in this case, # presentlang can be used as a fallback for messages # which are not translated in the desiredlang catalog). case "$desiredlang" in "$presentlang"*) useit=yes;; esac done if test $useit = yes; then NEW_LINGUAS="$NEW_LINGUAS $presentlang" fi done LINGUAS=$NEW_LINGUAS { $as_echo "$as_me:$LINENO: result: $LINGUAS" >&5 $as_echo "$LINGUAS" >&6; } fi if test -n "$LINGUAS"; then for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done fi fi MKINSTALLDIRS= if test -n "$ac_aux_dir"; then MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" fi if test -z "$MKINSTALLDIRS"; then MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" fi test -d po || mkdir po if test "x$srcdir" != "x."; then if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then posrcprefix="$srcdir/" else posrcprefix="../$srcdir/" fi else posrcprefix="../" fi rm -f po/POTFILES sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \ < $srcdir/po/POTFILES.in > po/POTFILES { $as_echo "$as_me:$LINENO: checking whether NLS is requested" >&5 $as_echo_n "checking whether NLS is requested... " >&6; } # Check whether --enable-nls was given. if test "${enable_nls+set}" = set; then enableval=$enable_nls; USE_NLS=$enableval else USE_NLS=yes fi { $as_echo "$as_me:$LINENO: result: $USE_NLS" >&5 $as_echo "$USE_NLS" >&6; } case "$am__api_version" in 1.01234) { { $as_echo "$as_me:$LINENO: error: Automake 1.5 or newer is required to use intltool" >&5 $as_echo "$as_me: error: Automake 1.5 or newer is required to use intltool" >&2;} { (exit 1); exit 1; }; } ;; *) ;; esac if test -n ""; then { $as_echo "$as_me:$LINENO: checking for intltool >= " >&5 $as_echo_n "checking for intltool >= ... " >&6; } INTLTOOL_REQUIRED_VERSION_AS_INT=`echo | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` INTLTOOL_APPLIED_VERSION=`intltool-update --version | head -1 | cut -d" " -f3` INTLTOOL_APPLIED_VERSION_AS_INT=`echo $INTLTOOL_APPLIED_VERSION | awk -F. '{ print $ 1 * 1000 + $ 2 * 100 + $ 3; }'` { $as_echo "$as_me:$LINENO: result: $INTLTOOL_APPLIED_VERSION found" >&5 $as_echo "$INTLTOOL_APPLIED_VERSION found" >&6; } test "$INTLTOOL_APPLIED_VERSION_AS_INT" -ge "$INTLTOOL_REQUIRED_VERSION_AS_INT" || { { $as_echo "$as_me:$LINENO: error: Your intltool is too old. You need intltool or later." >&5 $as_echo "$as_me: error: Your intltool is too old. You need intltool or later." >&2;} { (exit 1); exit 1; }; } fi # Extract the first word of "intltool-update", so it can be a program name with args. set dummy intltool-update; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_INTLTOOL_UPDATE+set}" = set; then $as_echo_n "(cached) " >&6 else case $INTLTOOL_UPDATE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_UPDATE="$INTLTOOL_UPDATE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_UPDATE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_UPDATE=$ac_cv_path_INTLTOOL_UPDATE if test -n "$INTLTOOL_UPDATE"; then { $as_echo "$as_me:$LINENO: result: $INTLTOOL_UPDATE" >&5 $as_echo "$INTLTOOL_UPDATE" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-merge", so it can be a program name with args. set dummy intltool-merge; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_INTLTOOL_MERGE+set}" = set; then $as_echo_n "(cached) " >&6 else case $INTLTOOL_MERGE in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_MERGE="$INTLTOOL_MERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_MERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_MERGE=$ac_cv_path_INTLTOOL_MERGE if test -n "$INTLTOOL_MERGE"; then { $as_echo "$as_me:$LINENO: result: $INTLTOOL_MERGE" >&5 $as_echo "$INTLTOOL_MERGE" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "intltool-extract", so it can be a program name with args. set dummy intltool-extract; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_INTLTOOL_EXTRACT+set}" = set; then $as_echo_n "(cached) " >&6 else case $INTLTOOL_EXTRACT in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_EXTRACT="$INTLTOOL_EXTRACT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_EXTRACT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_EXTRACT=$ac_cv_path_INTLTOOL_EXTRACT if test -n "$INTLTOOL_EXTRACT"; then { $as_echo "$as_me:$LINENO: result: $INTLTOOL_EXTRACT" >&5 $as_echo "$INTLTOOL_EXTRACT" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_UPDATE" -o -z "$INTLTOOL_MERGE" -o -z "$INTLTOOL_EXTRACT"; then { { $as_echo "$as_me:$LINENO: error: The intltool scripts were not found. Please install intltool." >&5 $as_echo "$as_me: error: The intltool scripts were not found. Please install intltool." >&2;} { (exit 1); exit 1; }; } fi INTLTOOL_DESKTOP_RULE='%.desktop: %.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_DIRECTORY_RULE='%.directory: %.directory.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KEYS_RULE='%.keys: %.keys.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -k -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_PROP_RULE='%.prop: %.prop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_OAF_RULE='%.oaf: %.oaf.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -p $(top_srcdir)/po $< $@' INTLTOOL_PONG_RULE='%.pong: %.pong.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVER_RULE='%.server: %.server.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -o -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SHEET_RULE='%.sheet: %.sheet.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SOUNDLIST_RULE='%.soundlist: %.soundlist.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_UI_RULE='%.ui: %.ui.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_XML_NOMERGE_RULE='%.xml: %.xml.in $(INTLTOOL_MERGE) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u /tmp $< $@' INTLTOOL_XAM_RULE='%.xam: %.xml.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_KBD_RULE='%.kbd: %.kbd.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -m -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_CAVES_RULE='%.caves: %.caves.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SCHEMAS_RULE='%.schemas: %.schemas.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -s -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_THEME_RULE='%.theme: %.theme.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_SERVICE_RULE='%.service: %.service.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' INTLTOOL_POLICY_RULE='%.policy: %.policy.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -x -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@' # Check the gettext tools to make sure they are GNU # Extract the first word of "xgettext", so it can be a program name with args. set dummy xgettext; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_XGETTEXT+set}" = set; then $as_echo_n "(cached) " >&6 else case $XGETTEXT in [\\/]* | ?:[\\/]*) ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_XGETTEXT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi XGETTEXT=$ac_cv_path_XGETTEXT if test -n "$XGETTEXT"; then { $as_echo "$as_me:$LINENO: result: $XGETTEXT" >&5 $as_echo "$XGETTEXT" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgmerge", so it can be a program name with args. set dummy msgmerge; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_MSGMERGE+set}" = set; then $as_echo_n "(cached) " >&6 else case $MSGMERGE in [\\/]* | ?:[\\/]*) ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MSGMERGE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGMERGE=$ac_cv_path_MSGMERGE if test -n "$MSGMERGE"; then { $as_echo "$as_me:$LINENO: result: $MSGMERGE" >&5 $as_echo "$MSGMERGE" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "msgfmt", so it can be a program name with args. set dummy msgfmt; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_MSGFMT+set}" = set; then $as_echo_n "(cached) " >&6 else case $MSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_MSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi MSGFMT=$ac_cv_path_MSGFMT if test -n "$MSGFMT"; then { $as_echo "$as_me:$LINENO: result: $MSGFMT" >&5 $as_echo "$MSGFMT" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi # Extract the first word of "gmsgfmt", so it can be a program name with args. set dummy gmsgfmt; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_GMSGFMT+set}" = set; then $as_echo_n "(cached) " >&6 else case $GMSGFMT in [\\/]* | ?:[\\/]*) ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" ;; esac fi GMSGFMT=$ac_cv_path_GMSGFMT if test -n "$GMSGFMT"; then { $as_echo "$as_me:$LINENO: result: $GMSGFMT" >&5 $as_echo "$GMSGFMT" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$XGETTEXT" -o -z "$MSGMERGE" -o -z "$MSGFMT"; then { { $as_echo "$as_me:$LINENO: error: GNU gettext tools not found; required for intltool" >&5 $as_echo "$as_me: error: GNU gettext tools not found; required for intltool" >&2;} { (exit 1); exit 1; }; } fi xgversion="`$XGETTEXT --version|grep '(GNU ' 2> /dev/null`" mmversion="`$MSGMERGE --version|grep '(GNU ' 2> /dev/null`" mfversion="`$MSGFMT --version|grep '(GNU ' 2> /dev/null`" if test -z "$xgversion" -o -z "$mmversion" -o -z "$mfversion"; then { { $as_echo "$as_me:$LINENO: error: GNU gettext tools not found; required for intltool" >&5 $as_echo "$as_me: error: GNU gettext tools not found; required for intltool" >&2;} { (exit 1); exit 1; }; } fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_INTLTOOL_PERL+set}" = set; then $as_echo_n "(cached) " >&6 else case $INTLTOOL_PERL in [\\/]* | ?:[\\/]*) ac_cv_path_INTLTOOL_PERL="$INTLTOOL_PERL" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_INTLTOOL_PERL="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi INTLTOOL_PERL=$ac_cv_path_INTLTOOL_PERL if test -n "$INTLTOOL_PERL"; then { $as_echo "$as_me:$LINENO: result: $INTLTOOL_PERL" >&5 $as_echo "$INTLTOOL_PERL" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test -z "$INTLTOOL_PERL"; then { { $as_echo "$as_me:$LINENO: error: perl not found" >&5 $as_echo "$as_me: error: perl not found" >&2;} { (exit 1); exit 1; }; } fi { $as_echo "$as_me:$LINENO: checking for perl >= 5.8.1" >&5 $as_echo_n "checking for perl >= 5.8.1... " >&6; } $INTLTOOL_PERL -e "use 5.8.1;" > /dev/null 2>&1 if test $? -ne 0; then { { $as_echo "$as_me:$LINENO: error: perl 5.8.1 is required for intltool" >&5 $as_echo "$as_me: error: perl 5.8.1 is required for intltool" >&2;} { (exit 1); exit 1; }; } else IT_PERL_VERSION="`$INTLTOOL_PERL -e \"printf '%vd', $^V\"`" { $as_echo "$as_me:$LINENO: result: $IT_PERL_VERSION" >&5 $as_echo "$IT_PERL_VERSION" >&6; } fi if test "x" != "xno-xml"; then { $as_echo "$as_me:$LINENO: checking for XML::Parser" >&5 $as_echo_n "checking for XML::Parser... " >&6; } if `$INTLTOOL_PERL -e "require XML::Parser" 2>/dev/null`; then { $as_echo "$as_me:$LINENO: result: ok" >&5 $as_echo "ok" >&6; } else { { $as_echo "$as_me:$LINENO: error: XML::Parser perl module is required for intltool" >&5 $as_echo "$as_me: error: XML::Parser perl module is required for intltool" >&2;} { (exit 1); exit 1; }; } fi fi # Substitute ALL_LINGUAS so we can use it in po/Makefile # Set DATADIRNAME correctly if it is not set yet # (copied from glib-gettext.m4) if test -z "$DATADIRNAME"; then cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { extern int _nl_msg_cat_cntr; return _nl_msg_cat_cntr ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then DATADIRNAME=share else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 case $host in *-*-solaris*) { $as_echo "$as_me:$LINENO: checking for bind_textdomain_codeset" >&5 $as_echo_n "checking for bind_textdomain_codeset... " >&6; } if test "${ac_cv_func_bind_textdomain_codeset+set}" = set; then $as_echo_n "(cached) " >&6 else cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Define bind_textdomain_codeset to an innocuous variant, in case declares bind_textdomain_codeset. For example, HP-UX 11i declares gettimeofday. */ #define bind_textdomain_codeset innocuous_bind_textdomain_codeset /* System header to define __stub macros and hopefully few prototypes, which can conflict with char bind_textdomain_codeset (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef bind_textdomain_codeset /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char bind_textdomain_codeset (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_bind_textdomain_codeset || defined __stub___bind_textdomain_codeset choke me #endif int main () { return bind_textdomain_codeset (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_func_bind_textdomain_codeset=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_func_bind_textdomain_codeset=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: result: $ac_cv_func_bind_textdomain_codeset" >&5 $as_echo "$ac_cv_func_bind_textdomain_codeset" >&6; } if test "x$ac_cv_func_bind_textdomain_codeset" = x""yes; then DATADIRNAME=share else DATADIRNAME=lib fi ;; *) DATADIRNAME=lib ;; esac fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:$LINENO: checking for g_malloc0 in -lglib-2.0" >&5 $as_echo_n "checking for g_malloc0 in -lglib-2.0... " >&6; } if test "${ac_cv_lib_glib_2_0_g_malloc0+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lglib-2.0 $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char g_malloc0 (); int main () { return g_malloc0 (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_glib_2_0_g_malloc0=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_glib_2_0_g_malloc0=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_glib_2_0_g_malloc0" >&5 $as_echo "$ac_cv_lib_glib_2_0_g_malloc0" >&6; } if test "x$ac_cv_lib_glib_2_0_g_malloc0" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBGLIB_2_0 1 _ACEOF LIBS="-lglib-2.0 $LIBS" else { { $as_echo "$as_me:$LINENO: error: \"libglib not installed\"" >&5 $as_echo "$as_me: error: \"libglib not installed\"" >&2;} { (exit 1); exit 1; }; } fi { $as_echo "$as_me:$LINENO: checking for fftw_plan_dft_r2c_2d in -lfftw3" >&5 $as_echo_n "checking for fftw_plan_dft_r2c_2d in -lfftw3... " >&6; } if test "${ac_cv_lib_fftw3_fftw_plan_dft_r2c_2d+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lfftw3 $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char fftw_plan_dft_r2c_2d (); int main () { return fftw_plan_dft_r2c_2d (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_fftw3_fftw_plan_dft_r2c_2d=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_fftw3_fftw_plan_dft_r2c_2d=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_fftw3_fftw_plan_dft_r2c_2d" >&5 $as_echo "$ac_cv_lib_fftw3_fftw_plan_dft_r2c_2d" >&6; } if test "x$ac_cv_lib_fftw3_fftw_plan_dft_r2c_2d" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBFFTW3 1 _ACEOF LIBS="-lfftw3 $LIBS" else { { $as_echo "$as_me:$LINENO: error: \"libfftw3 not installed\"" >&5 $as_echo "$as_me: error: \"libfftw3 not installed\"" >&2;} { (exit 1); exit 1; }; } fi { $as_echo "$as_me:$LINENO: checking for main in -lgslcblas" >&5 $as_echo_n "checking for main in -lgslcblas... " >&6; } if test "${ac_cv_lib_gslcblas_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgslcblas $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_gslcblas_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_gslcblas_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_gslcblas_main" >&5 $as_echo "$ac_cv_lib_gslcblas_main" >&6; } if test "x$ac_cv_lib_gslcblas_main" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBGSLCBLAS 1 _ACEOF LIBS="-lgslcblas $LIBS" else { { $as_echo "$as_me:$LINENO: error: \"libgslcblas not installed\"" >&5 $as_echo "$as_me: error: \"libgslcblas not installed\"" >&2;} { (exit 1); exit 1; }; } fi { $as_echo "$as_me:$LINENO: checking for main in -lgsl" >&5 $as_echo_n "checking for main in -lgsl... " >&6; } if test "${ac_cv_lib_gsl_main+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgsl $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_gsl_main=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_gsl_main=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_gsl_main" >&5 $as_echo "$ac_cv_lib_gsl_main" >&6; } if test "x$ac_cv_lib_gsl_main" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBGSL 1 _ACEOF LIBS="-lgsl $LIBS" else { { $as_echo "$as_me:$LINENO: error: \"libgsl not installed\"" >&5 $as_echo "$as_me: error: \"libgsl not installed\"" >&2;} { (exit 1); exit 1; }; } fi # Check whether --enable-mpi was given. if test "${enable_mpi+set}" = set; then enableval=$enable_mpi; ENABLE_MPI="-DENABLE_MPI" fi # Check whether --enable-rr was given. if test "${enable_rr+set}" = set; then enableval=$enable_rr; ENABLE_MPI_RR="-DENABLE_MPI_RR" fi if test "${ENABLE_MPI}" == '-DENABLE_MPI'; then if test "${ac_cv_header_mpi_mpi_h+set}" = set; then { $as_echo "$as_me:$LINENO: checking for mpi/mpi.h" >&5 $as_echo_n "checking for mpi/mpi.h... " >&6; } if test "${ac_cv_header_mpi_mpi_h+set}" = set; then $as_echo_n "(cached) " >&6 fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_mpi_mpi_h" >&5 $as_echo "$ac_cv_header_mpi_mpi_h" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking mpi/mpi.h usability" >&5 $as_echo_n "checking mpi/mpi.h usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking mpi/mpi.h presence" >&5 $as_echo_n "checking mpi/mpi.h presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: mpi/mpi.h: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: mpi/mpi.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: mpi/mpi.h: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: mpi/mpi.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: mpi/mpi.h: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: mpi/mpi.h: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: mpi/mpi.h: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: mpi/mpi.h: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: mpi/mpi.h: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: mpi/mpi.h: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: mpi/mpi.h: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: mpi/mpi.h: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: mpi/mpi.h: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: mpi/mpi.h: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: mpi/mpi.h: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: mpi/mpi.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------------------------------- ## ## Report this to http://bugzilla.gnome.org/enter_bug.cgi?product=gpiv ## ## ------------------------------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:$LINENO: checking for mpi/mpi.h" >&5 $as_echo_n "checking for mpi/mpi.h... " >&6; } if test "${ac_cv_header_mpi_mpi_h+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_header_mpi_mpi_h=$ac_header_preproc fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_mpi_mpi_h" >&5 $as_echo "$ac_cv_header_mpi_mpi_h" >&6; } fi if test "x$ac_cv_header_mpi_mpi_h" = x""yes; then : else { { $as_echo "$as_me:$LINENO: error: \"mpi.h is not installed\"" >&5 $as_echo "$as_me: error: \"mpi.h is not installed\"" >&2;} { (exit 1); exit 1; }; } fi # Extract the first word of "mpirun", so it can be a program name with args. set dummy mpirun; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_MPIRUN+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$MPIRUN"; then ac_cv_prog_MPIRUN="$MPIRUN" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_MPIRUN="true" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_MPIRUN" && ac_cv_prog_MPIRUN="false" fi fi MPIRUN=$ac_cv_prog_MPIRUN if test -n "$MPIRUN"; then { $as_echo "$as_me:$LINENO: result: $MPIRUN" >&5 $as_echo "$MPIRUN" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test x$MPIRUN = xfalse ; then { { $as_echo "$as_me:$LINENO: error: \"missing mpirun \ Needed by gpiv when --enable-mpi\"" >&5 $as_echo "$as_me: error: \"missing mpirun \ Needed by gpiv when --enable-mpi\"" >&2;} { (exit 1); exit 1; }; } fi if test "${ENABLE_MPI_RR}" == '-DENABLE_MPI_RR'; then # Extract the first word of "gpiv_rr", so it can be a program name with args. set dummy gpiv_rr; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_RR+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$RR"; then ac_cv_prog_RR="$RR" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_RR="true" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_RR" && ac_cv_prog_RR="false" fi fi RR=$ac_cv_prog_RR if test -n "$RR"; then { $as_echo "$as_me:$LINENO: result: $RR" >&5 $as_echo "$RR" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if test x$RR = xfalse ; then { { $as_echo "$as_me:$LINENO: error: \"missing mpi-enabled gpiv_rr from gpivtools. \ Needed by gpiv when --enable-mpi.\"" >&5 $as_echo "$as_me: error: \"missing mpi-enabled gpiv_rr from gpivtools. \ Needed by gpiv when --enable-mpi.\"" >&2;} { (exit 1); exit 1; }; } fi else echo "WARNING: Not checking on MPI-enabled gpiv_rr" fi { $as_echo "$as_me:$LINENO: checking for gpiv_piv_mpi_bcast_pivpar in -lgpiv_mpi" >&5 $as_echo_n "checking for gpiv_piv_mpi_bcast_pivpar in -lgpiv_mpi... " >&6; } if test "${ac_cv_lib_gpiv_mpi_gpiv_piv_mpi_bcast_pivpar+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgpiv_mpi $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gpiv_piv_mpi_bcast_pivpar (); int main () { return gpiv_piv_mpi_bcast_pivpar (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_gpiv_mpi_gpiv_piv_mpi_bcast_pivpar=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_gpiv_mpi_gpiv_piv_mpi_bcast_pivpar=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_gpiv_mpi_gpiv_piv_mpi_bcast_pivpar" >&5 $as_echo "$ac_cv_lib_gpiv_mpi_gpiv_piv_mpi_bcast_pivpar" >&6; } if test "x$ac_cv_lib_gpiv_mpi_gpiv_piv_mpi_bcast_pivpar" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBGPIV_MPI 1 _ACEOF LIBS="-lgpiv_mpi $LIBS" else { { $as_echo "$as_me:$LINENO: error: \"gpiv_piv_mpi_bcast_pivpar is not working in libgpiv_mpi. \ Enable MPI in libgpiv or disable it here by leaving out --enable-mpi during ./configure\"" >&5 $as_echo "$as_me: error: \"gpiv_piv_mpi_bcast_pivpar is not working in libgpiv_mpi. \ Enable MPI in libgpiv or disable it here by leaving out --enable-mpi during ./configure\"" >&2;} { (exit 1); exit 1; }; } fi else { $as_echo "$as_me:$LINENO: checking for gpiv_piv_interrogate_img in -lgpiv" >&5 $as_echo_n "checking for gpiv_piv_interrogate_img in -lgpiv... " >&6; } if test "${ac_cv_lib_gpiv_gpiv_piv_interrogate_img+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgpiv $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gpiv_piv_interrogate_img (); int main () { return gpiv_piv_interrogate_img (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_gpiv_gpiv_piv_interrogate_img=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_gpiv_gpiv_piv_interrogate_img=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_gpiv_gpiv_piv_interrogate_img" >&5 $as_echo "$ac_cv_lib_gpiv_gpiv_piv_interrogate_img" >&6; } if test "x$ac_cv_lib_gpiv_gpiv_piv_interrogate_img" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBGPIV 1 _ACEOF LIBS="-lgpiv $LIBS" else { { $as_echo "$as_me:$LINENO: error: libgpiv has not been installed" >&5 $as_echo "$as_me: error: libgpiv has not been installed" >&2;} { (exit 1); exit 1; }; } fi fi for ac_header in stdlib.h string.h unistd.h fftw3.h gpiv.h do as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking $ac_header usability" >&5 $as_echo_n "checking $ac_header usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include <$ac_header> _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking $ac_header presence" >&5 $as_echo_n "checking $ac_header presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include <$ac_header> _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------------------------------- ## ## Report this to http://bugzilla.gnome.org/enter_bug.cgi?product=gpiv ## ## ------------------------------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:$LINENO: checking for $ac_header" >&5 $as_echo_n "checking for $ac_header... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then $as_echo_n "(cached) " >&6 else eval "$as_ac_Header=\$ac_header_preproc" fi ac_res=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` { $as_echo "$as_me:$LINENO: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi as_val=`eval 'as_val=${'$as_ac_Header'} $as_echo "$as_val"'` if test "x$as_val" = x""yes; then cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done # Check whether --enable-cam was given. if test "${enable_cam+set}" = set; then enableval=$enable_cam; ENABLE_CAM="-DENABLE_CAM" fi # Check whether --enable-trig was given. if test "${enable_trig+set}" = set; then enableval=$enable_trig; ENABLE_TRIG="-DENABLE_TRIG" fi if test $ENABLE_CAM || test $ENABLE_TRIG; then ENABLE_DAC="-DENABLE_DAC" fi if test "${ENABLE_CAM}" == '-DENABLE_CAM'; then { $as_echo "$as_me:$LINENO: checking for gpiv_cam_get_camvar in -lgpiv" >&5 $as_echo_n "checking for gpiv_cam_get_camvar in -lgpiv... " >&6; } if test "${ac_cv_lib_gpiv_gpiv_cam_get_camvar+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgpiv $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gpiv_cam_get_camvar (); int main () { return gpiv_cam_get_camvar (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_gpiv_gpiv_cam_get_camvar=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_gpiv_gpiv_cam_get_camvar=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_gpiv_gpiv_cam_get_camvar" >&5 $as_echo "$ac_cv_lib_gpiv_gpiv_cam_get_camvar" >&6; } if test "x$ac_cv_lib_gpiv_gpiv_cam_get_camvar" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBGPIV 1 _ACEOF LIBS="-lgpiv $LIBS" else { { $as_echo "$as_me:$LINENO: error: \"(IEEE-1394) camera is not working in libgpiv. \ Enable (IEEE-1394) camera in libgpiv or disable it here by leaving out --enable-cam during ./configure\"" >&5 $as_echo "$as_me: error: \"(IEEE-1394) camera is not working in libgpiv. \ Enable (IEEE-1394) camera in libgpiv or disable it here by leaving out --enable-cam during ./configure\"" >&2;} { (exit 1); exit 1; }; } fi { $as_echo "$as_me:$LINENO: checking for raw1394_destroy_handle in -lraw1394" >&5 $as_echo_n "checking for raw1394_destroy_handle in -lraw1394... " >&6; } if test "${ac_cv_lib_raw1394_raw1394_destroy_handle+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lraw1394 $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char raw1394_destroy_handle (); int main () { return raw1394_destroy_handle (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_raw1394_raw1394_destroy_handle=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_raw1394_raw1394_destroy_handle=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_raw1394_raw1394_destroy_handle" >&5 $as_echo "$ac_cv_lib_raw1394_raw1394_destroy_handle" >&6; } if test "x$ac_cv_lib_raw1394_raw1394_destroy_handle" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBRAW1394 1 _ACEOF LIBS="-lraw1394 $LIBS" else { { $as_echo "$as_me:$LINENO: error: \"libraw1394 not installed\"" >&5 $as_echo "$as_me: error: \"libraw1394 not installed\"" >&2;} { (exit 1); exit 1; }; } fi { $as_echo "$as_me:$LINENO: checking for dc1394_create_handle in -ldc1394_control" >&5 $as_echo_n "checking for dc1394_create_handle in -ldc1394_control... " >&6; } if test "${ac_cv_lib_dc1394_control_dc1394_create_handle+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldc1394_control $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dc1394_create_handle (); int main () { return dc1394_create_handle (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_dc1394_control_dc1394_create_handle=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_dc1394_control_dc1394_create_handle=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_dc1394_control_dc1394_create_handle" >&5 $as_echo "$ac_cv_lib_dc1394_control_dc1394_create_handle" >&6; } if test "x$ac_cv_lib_dc1394_control_dc1394_create_handle" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBDC1394_CONTROL 1 _ACEOF LIBS="-ldc1394_control $LIBS" else { { $as_echo "$as_me:$LINENO: error: \"libdc1394_control not installed\"" >&5 $as_echo "$as_me: error: \"libdc1394_control not installed\"" >&2;} { (exit 1); exit 1; }; } fi if test "${ac_cv_header_libdc1394_dc1394_control_h+set}" = set; then { $as_echo "$as_me:$LINENO: checking for libdc1394/dc1394_control.h" >&5 $as_echo_n "checking for libdc1394/dc1394_control.h... " >&6; } if test "${ac_cv_header_libdc1394_dc1394_control_h+set}" = set; then $as_echo_n "(cached) " >&6 fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_libdc1394_dc1394_control_h" >&5 $as_echo "$ac_cv_header_libdc1394_dc1394_control_h" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking libdc1394/dc1394_control.h usability" >&5 $as_echo_n "checking libdc1394/dc1394_control.h usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking libdc1394/dc1394_control.h presence" >&5 $as_echo_n "checking libdc1394/dc1394_control.h presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: libdc1394/dc1394_control.h: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: libdc1394/dc1394_control.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libdc1394/dc1394_control.h: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: libdc1394/dc1394_control.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: libdc1394/dc1394_control.h: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: libdc1394/dc1394_control.h: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libdc1394/dc1394_control.h: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: libdc1394/dc1394_control.h: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libdc1394/dc1394_control.h: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: libdc1394/dc1394_control.h: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libdc1394/dc1394_control.h: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: libdc1394/dc1394_control.h: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libdc1394/dc1394_control.h: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: libdc1394/dc1394_control.h: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libdc1394/dc1394_control.h: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: libdc1394/dc1394_control.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------------------------------- ## ## Report this to http://bugzilla.gnome.org/enter_bug.cgi?product=gpiv ## ## ------------------------------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:$LINENO: checking for libdc1394/dc1394_control.h" >&5 $as_echo_n "checking for libdc1394/dc1394_control.h... " >&6; } if test "${ac_cv_header_libdc1394_dc1394_control_h+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_header_libdc1394_dc1394_control_h=$ac_header_preproc fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_libdc1394_dc1394_control_h" >&5 $as_echo "$ac_cv_header_libdc1394_dc1394_control_h" >&6; } fi if test "x$ac_cv_header_libdc1394_dc1394_control_h" = x""yes; then : else { { $as_echo "$as_me:$LINENO: error: \"missing dc1394_control.h\"" >&5 $as_echo "$as_me: error: \"missing dc1394_control.h\"" >&2;} { (exit 1); exit 1; }; } fi if test "${ac_cv_header_libraw1394_raw1394_h+set}" = set; then { $as_echo "$as_me:$LINENO: checking for libraw1394/raw1394.h" >&5 $as_echo_n "checking for libraw1394/raw1394.h... " >&6; } if test "${ac_cv_header_libraw1394_raw1394_h+set}" = set; then $as_echo_n "(cached) " >&6 fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_libraw1394_raw1394_h" >&5 $as_echo "$ac_cv_header_libraw1394_raw1394_h" >&6; } else # Is the header compilable? { $as_echo "$as_me:$LINENO: checking libraw1394/raw1394.h usability" >&5 $as_echo_n "checking libraw1394/raw1394.h usability... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ $ac_includes_default #include _ACEOF rm -f conftest.$ac_objext if { (ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_compile") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then ac_header_compiler=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:$LINENO: checking libraw1394/raw1394.h presence" >&5 $as_echo_n "checking libraw1394/raw1394.h presence... " >&6; } cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ #include _ACEOF if { (ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then ac_header_preproc=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in yes:no: ) { $as_echo "$as_me:$LINENO: WARNING: libraw1394/raw1394.h: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: libraw1394/raw1394.h: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libraw1394/raw1394.h: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: libraw1394/raw1394.h: proceeding with the compiler's result" >&2;} ac_header_preproc=yes ;; no:yes:* ) { $as_echo "$as_me:$LINENO: WARNING: libraw1394/raw1394.h: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: libraw1394/raw1394.h: present but cannot be compiled" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libraw1394/raw1394.h: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: libraw1394/raw1394.h: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libraw1394/raw1394.h: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: libraw1394/raw1394.h: see the Autoconf documentation" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libraw1394/raw1394.h: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: libraw1394/raw1394.h: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libraw1394/raw1394.h: proceeding with the preprocessor's result" >&5 $as_echo "$as_me: WARNING: libraw1394/raw1394.h: proceeding with the preprocessor's result" >&2;} { $as_echo "$as_me:$LINENO: WARNING: libraw1394/raw1394.h: in the future, the compiler will take precedence" >&5 $as_echo "$as_me: WARNING: libraw1394/raw1394.h: in the future, the compiler will take precedence" >&2;} ( cat <<\_ASBOX ## ------------------------------------------------------------------- ## ## Report this to http://bugzilla.gnome.org/enter_bug.cgi?product=gpiv ## ## ------------------------------------------------------------------- ## _ASBOX ) | sed "s/^/$as_me: WARNING: /" >&2 ;; esac { $as_echo "$as_me:$LINENO: checking for libraw1394/raw1394.h" >&5 $as_echo_n "checking for libraw1394/raw1394.h... " >&6; } if test "${ac_cv_header_libraw1394_raw1394_h+set}" = set; then $as_echo_n "(cached) " >&6 else ac_cv_header_libraw1394_raw1394_h=$ac_header_preproc fi { $as_echo "$as_me:$LINENO: result: $ac_cv_header_libraw1394_raw1394_h" >&5 $as_echo "$ac_cv_header_libraw1394_raw1394_h" >&6; } fi if test "x$ac_cv_header_libraw1394_raw1394_h" = x""yes; then : else { { $as_echo "$as_me:$LINENO: error: \"missing raw1394.h\"" >&5 $as_echo "$as_me: error: \"missing raw1394.h\"" >&2;} { (exit 1); exit 1; }; } fi fi if test "${ENABLE_TRIG}" == '-DENABLE_TRIG'; then { $as_echo "$as_me:$LINENO: checking for gpiv_trig_openrtfs in -lgpiv" >&5 $as_echo_n "checking for gpiv_trig_openrtfs in -lgpiv... " >&6; } if test "${ac_cv_lib_gpiv_gpiv_trig_openrtfs+set}" = set; then $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lgpiv $LIBS" cat >conftest.$ac_ext <<_ACEOF /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gpiv_trig_openrtfs (); int main () { return gpiv_trig_openrtfs (); ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\"" $as_echo "$ac_try_echo") >&5 (eval "$ac_link") 2>conftest.er1 ac_status=$? grep -v '^ *+' conftest.er1 >conftest.err rm -f conftest.er1 cat conftest.err >&5 $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then ac_cv_lib_gpiv_gpiv_trig_openrtfs=yes else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_cv_lib_gpiv_gpiv_trig_openrtfs=no fi rm -rf conftest.dSYM rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:$LINENO: result: $ac_cv_lib_gpiv_gpiv_trig_openrtfs" >&5 $as_echo "$ac_cv_lib_gpiv_gpiv_trig_openrtfs" >&6; } if test "x$ac_cv_lib_gpiv_gpiv_trig_openrtfs" = x""yes; then cat >>confdefs.h <<_ACEOF #define HAVE_LIBGPIV 1 _ACEOF LIBS="-lgpiv $LIBS" else { { $as_echo "$as_me:$LINENO: error: \"(Realtime) triggering is not working in libgpiv. \ Enable (realtime) triggering in libgpiv or disable it here by leaving out --enable-trig during ./configure\"" >&5 $as_echo "$as_me: error: \"(Realtime) triggering is not working in libgpiv. \ Enable (realtime) triggering in libgpiv or disable it here by leaving out --enable-trig during ./configure\"" >&2;} { (exit 1); exit 1; }; } fi fi # Extract the first word of "gpiv_control", so it can be a program name with args. set dummy gpiv_control; ac_word=$2 { $as_echo "$as_me:$LINENO: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CONTROL+set}" = set; then $as_echo_n "(cached) " >&6 else if test -n "$CONTROL"; then ac_cv_prog_CONTROL="$CONTROL" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CONTROL="true" $as_echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS test -z "$ac_cv_prog_CONTROL" && ac_cv_prog_CONTROL="false" fi fi CONTROL=$ac_cv_prog_CONTROL if test -n "$CONTROL"; then { $as_echo "$as_me:$LINENO: result: $CONTROL" >&5 $as_echo "$CONTROL" >&6; } else { $as_echo "$as_me:$LINENO: result: no" >&5 $as_echo "no" >&6; } fi if $CONTROL; then HAVE_CONTROL_TRUE= HAVE_CONTROL_FALSE='#' else HAVE_CONTROL_TRUE='#' HAVE_CONTROL_FALSE= fi # Check whether --enable-rta was given. if test "${enable_rta+set}" = set; then enableval=$enable_rta; RTA_TOPDIR="$enableval" else RTA_TOPDIR="/usr/lib/realtime" fi # Check whether --enable-k was given. if test "${enable_k+set}" = set; then enableval=$enable_k; K_TOPDIR="$enableval" else K_TOPDIR="/usr/src/kernel-headers-2.4.27-adeos" fi # Check whether --enable-img-width was given. if test "${enable_img_width+set}" = set; then enableval=$enable_img_width; OVERRIDE_IMAGE_WIDTH_MAX="-DIMAGE_WIDTH_MAX=$enableval" fi # Check whether --enable-img-height was given. if test "${enable_img_height+set}" = set; then enableval=$enable_img_height; OVERRIDE_IMAGE_HEIGHT_MAX="-DIMAGE_HEIGHT_MAX=$enableval" fi # Check whether --enable-canvas_aa was given. if test "${enable_canvas_aa+set}" = set; then enableval=$enable_canvas_aa; CANVAS_AA="-DCANVAS_AA" fi # Check whether --enable-debug was given. if test "${enable_debug+set}" = set; then enableval=$enable_debug; DEBUG="-DDEBUG" fi ac_config_files="$ac_config_files Makefile doc/Makefile doc/C/Makefile doc/C/figures/Makefile src/Makefile po/Makefile.in man/Makefile pixmaps/Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:$LINENO: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) $as_unset $ac_var ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes (double-quote # substitution turns \\\\ into \\, and sed turns \\ into \). sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:$LINENO: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext" ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs if test -z "${MAINTAINER_MODE_TRUE}" && test -z "${MAINTAINER_MODE_FALSE}"; then { { $as_echo "$as_me:$LINENO: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&5 $as_echo "$as_me: error: conditional \"MAINTAINER_MODE\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then { { $as_echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&5 $as_echo "$as_me: error: conditional \"AMDEP\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 $as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 $as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then { { $as_echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&5 $as_echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi ac_config_commands="$ac_config_commands po/stamp-it" if test -z "${HAVE_CONTROL_TRUE}" && test -z "${HAVE_CONTROL_FALSE}"; then { { $as_echo "$as_me:$LINENO: error: conditional \"HAVE_CONTROL\" was never defined. Usually this means the macro was only invoked conditionally." >&5 $as_echo "$as_me: error: conditional \"HAVE_CONTROL\" was never defined. Usually this means the macro was only invoked conditionally." >&2;} { (exit 1); exit 1; }; } fi : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} cat >$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ## --------------------- ## ## M4sh Initialization. ## ## --------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in *posix*) set -o posix ;; esac fi # PATH needs CR # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo if (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # Support unset when possible. if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then as_unset=unset else as_unset=false fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 { (exit 1); exit 1; } fi # Work around bugs in pre-3.0 UWIN ksh. for as_var in ENV MAIL MAILPATH do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # Required to use basename. if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi # Name of the executable. as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # CDPATH. $as_unset CDPATH as_lineno_1=$LINENO as_lineno_2=$LINENO test "x$as_lineno_1" != "x$as_lineno_2" && test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || { # Create $as_me.lineno as a copy of $as_myself, but with $LINENO # uniformly replaced by the line number. The first 'sed' inserts a # line-number line after each line using $LINENO; the second 'sed' # does the real work. The second script uses 'N' to pair each # line-number line with the line containing $LINENO, and appends # trailing '-' during substitution so that $LINENO is not a special # case at line end. # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the # scripts with optimization help from Paolo Bonzini. Blame Lee # E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 { (exit 1); exit 1; }; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in -n*) case `echo 'x\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. *) ECHO_C='\c';; esac;; *) ECHO_N='-n';; esac if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p=: else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 # Save the log message, to keep $[0] and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by gpiv $as_me 0.6.1, which was generated by GNU Autoconf 2.63. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_commands="$ac_config_commands" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files from templates according to the current configuration. Usage: $0 [OPTION]... [FILE]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Configuration commands: $config_commands Report bugs to ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_version="\\ gpiv config.status 0.6.1 configured by $0, generated by GNU Autoconf 2.63, with options \\"`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\" Copyright (C) 2008 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' MKDIR_P='$MKDIR_P' AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac CONFIG_FILES="$CONFIG_FILES '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) { $as_echo "$as_me: error: unrecognized option: $1 Try \`$0 --help' for more information." >&2 { (exit 1); exit 1; }; } ;; *) ac_config_targets="$ac_config_targets $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # # INIT-COMMANDS # AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; "default-1") CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; "doc/C/Makefile") CONFIG_FILES="$CONFIG_FILES doc/C/Makefile" ;; "doc/C/figures/Makefile") CONFIG_FILES="$CONFIG_FILES doc/C/figures/Makefile" ;; "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; "po/Makefile.in") CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; "man/Makefile") CONFIG_FILES="$CONFIG_FILES man/Makefile" ;; "pixmaps/Makefile") CONFIG_FILES="$CONFIG_FILES pixmaps/Makefile" ;; "po/stamp-it") CONFIG_COMMANDS="$CONFIG_COMMANDS po/stamp-it" ;; *) { { $as_echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 $as_echo "$as_me: error: invalid argument: $ac_config_target" >&2;} { (exit 1); exit 1; }; };; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap '{ (exit 1); exit 1; }' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || { $as_echo "$as_me: cannot create a temporary directory in ." >&2 { (exit 1); exit 1; } } # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=' ' ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then { { $as_echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5 $as_echo "$as_me: error: could not make $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\).*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\).*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || { { $as_echo "$as_me:$LINENO: error: could not setup config files machinery" >&5 $as_echo "$as_me: error: could not setup config files machinery" >&2;} { (exit 1); exit 1; }; } _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) { { $as_echo "$as_me:$LINENO: error: invalid tag $ac_tag" >&5 $as_echo "$as_me: error: invalid tag $ac_tag" >&2;} { (exit 1); exit 1; }; };; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || { { $as_echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5 $as_echo "$as_me: error: cannot find input file: $ac_f" >&2;} { (exit 1); exit 1; }; };; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac ac_file_inputs="$ac_file_inputs '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:$LINENO: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir="$ac_dir" case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 $as_echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p ' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || { { $as_echo "$as_me:$LINENO: error: could not create $ac_file" >&5 $as_echo "$as_me: error: could not create $ac_file" >&2;} { (exit 1); exit 1; }; } ;; :C) { $as_echo "$as_me:$LINENO: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || # Autoconf 2.62 quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named `Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running `make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # When using ansi2knr, U may be empty or an underscore; expand it U=`sed -n 's/^U = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` { as_dir=$dirpart/$fdir case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || { { $as_echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5 $as_echo "$as_me: error: cannot create directory $as_dir" >&2;} { (exit 1); exit 1; }; }; } # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done ;; "default-1":C) case "$CONFIG_FILES" in *po/Makefile.in*) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile esac ;; "po/stamp-it":C) if ! grep "^# INTLTOOL_MAKEFILE$" "po/Makefile.in" > /dev/null ; then { { $as_echo "$as_me:$LINENO: error: po/Makefile.in.in was not created by intltoolize." >&5 $as_echo "$as_me: error: po/Makefile.in.in was not created by intltoolize." >&2;} { (exit 1); exit 1; }; } fi rm -f "po/stamp-it" "po/stamp-it.tmp" "po/POTFILES" "po/Makefile.tmp" >"po/stamp-it.tmp" sed '/^#/d s/^[[].*] *// /^[ ]*$/d '"s|^| $ac_top_srcdir/|" \ "$srcdir/po/POTFILES.in" | sed '$!s/$/ \\/' >"po/POTFILES" sed '/^POTFILES =/,/[^\\]$/ { /^POTFILES =/!d r po/POTFILES } ' "po/Makefile.in" >"po/Makefile" rm -f "po/Makefile.tmp" mv "po/stamp-it.tmp" "po/stamp-it" ;; esac done # for ac_tag { (exit 0); exit 0; } _ACEOF chmod +x $CONFIG_STATUS ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || { { $as_echo "$as_me:$LINENO: error: write failure creating $CONFIG_STATUS" >&5 $as_echo "$as_me: error: write failure creating $CONFIG_STATUS" >&2;} { (exit 1); exit 1; }; } # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || { (exit 1); exit 1; } fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:$LINENO: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo "====================================================================" echo "Configuration succesfully finished" if test $ENABLE_CAM; then echo "with (IEEE-1394) camera enabled" fi if test $ENABLE_TRIG; then echo "with (realtime) triggering enabled." if test x$CONTROL = xfalse ; then echo "Gpiv_control has not been found on this system, and probably gpivtrig-rtl isn't" echo "resident as well. This script eases to install and uninstall the gpivtrig-rtl" echo "and RTAI kernel modules that are needed for the triggering of camera and lasers" echo "" fi fi if test $ENABLE_MPI; then echo "Using Message Passing Interface (MPI)." echo "for processing on distributed memory systems" echo "MPI-enabled gpivtools package is needed for correct funtioning" fi echo "Type 'make' and 'make install' to build and install gpiv" echo "====================================================================" gpiv-0.6.1/configure.in0000644000175000017500000001557511204234152011724 00000000000000dnl Process this file with autoconf to produce a configure script. dnl =========== Initialization AC_INIT(gpiv, 0.6.1, http://bugzilla.gnome.org/enter_bug.cgi?product=gpiv) AM_INIT_AUTOMAKE(AC_PACKAGE_NAME, AC_PACKAGE_VERSION) AM_MAINTAINER_MODE dnl =========== basic compiler settings AC_ISC_POSIX AC_PROG_CC AM_PROG_CC_STDC AC_HEADER_STDC dnl ========== Export Compiler/linker options # ============ Switched off: #AC_SUBST(CFLAGS) #AC_SUBST(CPPFLAGS) #AC_SUBST(LDFLAGS) GNOME_COMPILE_WARNINGS PKG_CHECK_MODULES(GPIV_UI, libgnomeui-2.0) GPIV_GNOME_LIBS="libgnomeui-2.0" echo "configuring with libraries: " $gpiv_gnome_libs PKG_CHECK_MODULES(GPIV, $GPIV_GNOME_LIBS) AC_SUBST(GPIV_CFLAGS) AC_SUBST(GPIV_LIBS) dnl ========== Add the languages which the application supports. GETTEXT_PACKAGE=gpiv AC_SUBST(GETTEXT_PACKAGE) AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE") ALL_LINGUAS="ca de nl" AM_GLIB_GNU_GETTEXT AC_PROG_INTLTOOL dnl =========== Checking on libraries and headers AC_CHECK_LIB(glib-2.0, g_malloc0, , AC_MSG_ERROR("libglib not installed")) dnl H5Fcreate dnl AC_CHECK_LIB(hdf5, H5Fopen, , dnl AC_MSG_ERROR("libhdf5 not installed")) dnl ========== include fftw3 AC_CHECK_LIB(fftw3, fftw_plan_dft_r2c_2d, , AC_MSG_ERROR("libfftw3 not installed")) AC_CHECK_LIB(gslcblas, main, , AC_MSG_ERROR("libgslcblas not installed")) AC_CHECK_LIB(gsl, main, , AC_MSG_ERROR("libgsl not installed")) dnl AC_CHECK_LIB(gslcblas, gsl_fit_linear, , dnl AC_MSG_ERROR("libgsl not installed")) dnl dnl Enabling Message Passing Interface (MPI) for parallel computing dnl AC_ARG_ENABLE(mpi, [ --enable-mpi enable Message Protocol Interface (MPI)], [ENABLE_MPI="-DENABLE_MPI"] ) AC_SUBST(ENABLE_MPI) AC_ARG_ENABLE(rr, [ --enable-rr checks also for MPI-enabled gpiv_rr ], [ENABLE_MPI_RR="-DENABLE_MPI_RR"] ) AC_SUBST(ENABLE_MPI_RR) if test "${ENABLE_MPI}" == '-DENABLE_MPI'; then dnl ACX_MPI(AC_MSG_WARN("libmpi HAS BEEN installed"), dnl AC_MSG_ERROR("libmpi IS NOT installed")) AC_CHECK_HEADER(mpi/mpi.h, ,AC_MSG_ERROR("mpi.h is not installed")) AC_CHECK_PROG(MPIRUN, mpirun, true, false) if test x$MPIRUN = xfalse ; then AC_MSG_ERROR("missing mpirun \ Needed by gpiv when --enable-mpi") fi if test "${ENABLE_MPI_RR}" == '-DENABLE_MPI_RR'; then AC_CHECK_PROG(RR, gpiv_rr, true, false) if test x$RR = xfalse ; then AC_MSG_ERROR("missing mpi-enabled gpiv_rr from gpivtools. \ Needed by gpiv when --enable-mpi.") fi else echo "WARNING: Not checking on MPI-enabled gpiv_rr" fi AC_CHECK_LIB(gpiv_mpi, gpiv_piv_mpi_bcast_pivpar, , AC_MSG_ERROR("gpiv_piv_mpi_bcast_pivpar is not working in libgpiv_mpi. \ Enable MPI in libgpiv or disable it here by leaving out --enable-mpi during ./configure")) else AC_CHECK_LIB(gpiv, gpiv_piv_interrogate_img, , AC_MSG_ERROR([libgpiv has not been installed])) fi dnl AC_CHECK_HEADER(gpiv.h, ,AC_MSG_ERROR("giv.h is not installed")) AC_CHECK_HEADERS([stdlib.h string.h unistd.h fftw3.h gpiv.h]) dnl hdf5.h AC_ARG_ENABLE(cam, [ --enable-cam enable data acquisition], [ENABLE_CAM="-DENABLE_CAM"] ) AC_SUBST(ENABLE_CAM) AC_ARG_ENABLE(trig, [ --enable-trig enable (realtime) triggering], [ENABLE_TRIG="-DENABLE_TRIG"] ) AC_SUBST(ENABLE_TRIG) if test $ENABLE_CAM || test $ENABLE_TRIG; then ENABLE_DAC="-DENABLE_DAC" AC_SUBST(ENABLE_DAC) fi if test "${ENABLE_CAM}" == '-DENABLE_CAM'; then AC_CHECK_LIB(gpiv, gpiv_cam_get_camvar, , AC_MSG_ERROR("(IEEE-1394) camera is not working in libgpiv. \ Enable (IEEE-1394) camera in libgpiv or disable it here by leaving out --enable-cam during ./configure")) AC_CHECK_LIB(raw1394, raw1394_destroy_handle, , AC_MSG_ERROR("libraw1394 not installed")) AC_CHECK_LIB(dc1394_control, dc1394_create_handle, , AC_MSG_ERROR("libdc1394_control not installed")) AC_CHECK_HEADER(libdc1394/dc1394_control.h, , AC_MSG_ERROR("missing dc1394_control.h")) AC_CHECK_HEADER(libraw1394/raw1394.h, , AC_MSG_ERROR("missing raw1394.h")) fi if test "${ENABLE_TRIG}" == '-DENABLE_TRIG'; then AC_CHECK_LIB(gpiv, gpiv_trig_openrtfs, , AC_MSG_ERROR("(Realtime) triggering is not working in libgpiv. \ Enable (realtime) triggering in libgpiv or disable it here by leaving out --enable-trig during ./configure")) fi AC_CHECK_PROG(CONTROL, gpiv_control, true, false) AM_CONDITIONAL(HAVE_CONTROL, $CONTROL) AC_ARG_ENABLE(rta, [ --enable-rta=RTA_DIR place where the RTAI code resides (default /usr/lib/realtime)], [RTA_TOPDIR="$enableval"], [RTA_TOPDIR="/usr/lib/realtime"] ) AC_SUBST(RTA_TOPDIR) AC_ARG_ENABLE(k, [ --enable-k=K_DIR place where the installed kernel headers resides (default /usr/src/kernel-headers-2.4.27-adeos)], [K_TOPDIR="$enableval"], [K_TOPDIR="/usr/src/kernel-headers-2.4.27-adeos"] ) AC_SUBST(K_TOPDIR) AC_ARG_ENABLE(img-width, [ --enable-img-width=WIDTH maximum image width to be used (default SVGA)], [OVERRIDE_IMAGE_WIDTH_MAX="-DIMAGE_WIDTH_MAX=$enableval"] ) AC_SUBST(OVERRIDE_IMAGE_WIDTH_MAX) AC_ARG_ENABLE(img-height, [ --enable-img-height=HEIGHT maximum image height to be used (default SVGA)], [OVERRIDE_IMAGE_HEIGHT_MAX="-DIMAGE_HEIGHT_MAX=$enableval"] ) AC_SUBST(OVERRIDE_IMAGE_HEIGHT_MAX) AC_ARG_ENABLE(canvas_aa, [ --enable-canvas-aa Use Anti Aliased canvas for viewer; slower but better displaying of image and resulting data], [CANVAS_AA="-DCANVAS_AA"] ) AC_SUBST(CANVAS_AA) AC_ARG_ENABLE(debug, [ --enable-debug debug version (more verbose)], [DEBUG="-DDEBUG"] ) AC_SUBST(DEBUG) dnl GNOME_DISABLE_DEPRECATED="-DGNOME_DISABLE_DEPRECATED" dnl AC_SUBST(GNOME_DISABLE_DEPRECATED) AC_OUTPUT([ Makefile doc/Makefile doc/C/Makefile doc/C/figures/Makefile src/Makefile po/Makefile.in man/Makefile pixmaps/Makefile ]) echo "====================================================================" echo "Configuration succesfully finished" if test $ENABLE_CAM; then echo "with (IEEE-1394) camera enabled" fi if test $ENABLE_TRIG; then echo "with (realtime) triggering enabled." if test x$CONTROL = xfalse ; then echo "Gpiv_control has not been found on this system, and probably gpivtrig-rtl isn't" echo "resident as well. This script eases to install and uninstall the gpivtrig-rtl" echo "and RTAI kernel modules that are needed for the triggering of camera and lasers" echo "" fi fi if test $ENABLE_MPI; then echo "Using Message Passing Interface (MPI)." echo "for processing on distributed memory systems" echo "MPI-enabled gpivtools package is needed for correct funtioning" fi echo "Type 'make' and 'make install' to build and install gpiv" echo "====================================================================" gpiv-0.6.1/intltool-update.in0000644000175000017500000000000011204234167013046 00000000000000gpiv-0.6.1/install-sh0000644000175000017500000001273611076052422011415 00000000000000#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 gpiv-0.6.1/autogen.sh0000755000175000017500000001057411076052422011413 00000000000000#!/bin/sh # Run this to generate all the initial makefiles, etc. srcdir=`dirname $0` test -z "$srcdir" && srcdir=. DIE=0 if [ -n "$GNOME2_DIR" ]; then ACLOCAL_FLAGS="-I $GNOME2_DIR/share/aclocal $ACLOCAL_FLAGS" LD_LIBRARY_PATH="$GNOME2_DIR/lib:$LD_LIBRARY_PATH" PATH="$GNOME2_DIR/bin:$PATH" export PATH export LD_LIBRARY_PATH fi (test -f $srcdir/configure.in) || { echo -n "**Error**: Directory "\`$srcdir\'" does not look like the" echo " top-level package directory" exit 1 } (autoconf --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`autoconf' installed." echo "Download the appropriate package for your distribution," echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/" DIE=1 } (grep "^AC_PROG_INTLTOOL" $srcdir/configure.in >/dev/null) && { (intltoolize --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`intltool' installed." echo "You can get it from:" echo " ftp://ftp.gnome.org/pub/GNOME/" DIE=1 } } (grep "^AM_PROG_XML_I18N_TOOLS" $srcdir/configure.in >/dev/null) && { (xml-i18n-toolize --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`xml-i18n-toolize' installed." echo "You can get it from:" echo " ftp://ftp.gnome.org/pub/GNOME/" DIE=1 } } (grep "^AM_PROG_LIBTOOL" $srcdir/configure.in >/dev/null) && { (libtool --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`libtool' installed." echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" DIE=1 } } (grep "^AM_GLIB_GNU_GETTEXT" $srcdir/configure.in >/dev/null) && { (grep "sed.*POTFILES" $srcdir/configure.in) > /dev/null || \ (glib-gettextize --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`glib' installed." echo "You can get it from: ftp://ftp.gtk.org/pub/gtk" DIE=1 } } (automake --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: You must have \`automake' installed." echo "You can get it from: ftp://ftp.gnu.org/pub/gnu/" DIE=1 NO_AUTOMAKE=yes } # if no automake, don't bother testing for aclocal test -n "$NO_AUTOMAKE" || (aclocal --version) < /dev/null > /dev/null 2>&1 || { echo echo "**Error**: Missing \`aclocal'. The version of \`automake'" echo "installed doesn't appear recent enough." echo "You can get automake from ftp://ftp.gnu.org/pub/gnu/" DIE=1 } if test "$DIE" -eq 1; then exit 1 fi if test -z "$*"; then echo "**Warning**: I am going to run \`configure' with no arguments." echo "If you wish to pass any to it, please specify them on the" echo \`$0\'" command line." echo fi case $CC in xlc ) am_opt=--include-deps;; esac for coin in `find $srcdir -name configure.in -print` do dr=`dirname $coin` if test -f $dr/NO-AUTO-GEN; then echo skipping $dr -- flagged as no auto-gen else echo processing $dr ( cd $dr aclocalinclude="$ACLOCAL_FLAGS" if grep "^AM_GLIB_GNU_GETTEXT" configure.in >/dev/null; then echo "Creating $dr/aclocal.m4 ..." test -r $dr/aclocal.m4 || touch $dr/aclocal.m4 echo "Running glib-gettextize... Ignore non-fatal messages." echo "no" | glib-gettextize --force --copy echo "Making $dr/aclocal.m4 writable ..." test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4 fi if grep "^AC_PROG_INTLTOOL" configure.in >/dev/null; then echo "Running intltoolize..." intltoolize --copy --force --automake fi if grep "^AM_PROG_XML_I18N_TOOLS" configure.in >/dev/null; then echo "Running xml-i18n-toolize..." xml-i18n-toolize --copy --force --automake fi if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then if test -z "$NO_LIBTOOLIZE" ; then echo "Running libtoolize..." libtoolize --force --copy fi fi echo "Running aclocal $aclocalinclude ..." aclocal $aclocalinclude if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then echo "Running autoheader..." autoheader fi echo "Running automake --gnu $am_opt ..." automake --add-missing --gnu $am_opt echo "Running autoconf ..." autoconf ) fi done conf_flags="--enable-maintainer-mode" if test x$NOCONFIGURE = x; then echo Running $srcdir/configure $conf_flags "$@" ... $srcdir/configure $conf_flags "$@" \ && echo Now type \`make\' to compile. || exit 1 else echo Skipping configure process. fi gpiv-0.6.1/config.sub0000755000175000017500000007547011076052422011403 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. timestamp='2005-04-22' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit 0 ;; --version | -v ) echo "$version" ; exit 0 ;; --help | --h* | -h ) echo "$usage"; exit 0 ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit 0;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ | openrisc | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | msp430-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; or32 | or32-*) basic_machine=or32-unknown os=-coff ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sh64) basic_machine=sh64-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: gpiv-0.6.1/missing0000644000175000017500000002540611076052422011006 00000000000000#! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2005-06-08.21 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case "$1" in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case "$1" in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case "$1" in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case "$f" in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" y.tab.h fi ;; esac fi if [ ! -f y.tab.h ]; then echo >y.tab.h fi if [ ! -f y.tab.c ]; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if [ $# -ne 1 ]; then eval LASTARG="\${$#}" case "$LASTARG" in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if [ -f "$SRCFILE" ]; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if [ ! -f lex.yy.c ]; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` fi if [ -f "$file" ]; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case "$firstarg" in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case "$firstarg" in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: gpiv-0.6.1/mkinstalldirs0000755000175000017500000000370411204234167012216 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" 1>&2 exit 0 ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac case $dirmode in '') if mkdir -p -- . 2>/dev/null; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" fi ;; *) if mkdir -m "$dirmode" -p -- . 2>/dev/null; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # End: # mkinstalldirs ends here gpiv-0.6.1/Makefile.am0000644000175000017500000000041611076052422011440 00000000000000## Process this file with automake to produce Makefile.in SUBDIRS = src man doc po pixmaps EXTRA_DIST = \ autogen.sh \ intltool-extract.in \ intltool-merge.in \ intltool-update.in DISTCLEANFILES = \ intltool-extract \ intltool-merge \ intltool-updategpiv-0.6.1/Makefile.in0000644000175000017500000004662711204234174011466 00000000000000# Makefile.in generated by automake 1.10.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = . DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in $(top_srcdir)/configure ABOUT-NLS \ AUTHORS COPYING ChangeLog INSTALL NEWS acconfig.h config.sub \ depcomp install-sh missing mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ configure.lineno config.status.lineno mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) distdir = $(PACKAGE)-$(VERSION) top_distdir = $(distdir) am__remove_distdir = \ { test ! -d $(distdir) \ || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ && rm -fr $(distdir); }; } DIST_ARCHIVES = $(distdir).tar.gz GZIP_ENV = --best distuninstallcheck_listfiles = find . -type f -print distcleancheck_listfiles = find . -type f -print ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CANVAS_AA = @CANVAS_AA@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONTROL = @CONTROL@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUG = @DEBUG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_CAM = @ENABLE_CAM@ ENABLE_DAC = @ENABLE_DAC@ ENABLE_MPI = @ENABLE_MPI@ ENABLE_MPI_RR = @ENABLE_MPI_RR@ ENABLE_TRIG = @ENABLE_TRIG@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GPIV_CFLAGS = @GPIV_CFLAGS@ GPIV_LIBS = @GPIV_LIBS@ GPIV_UI_CFLAGS = @GPIV_UI_CFLAGS@ GPIV_UI_LIBS = @GPIV_UI_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ K_TOPDIR = @K_TOPDIR@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MPIRUN = @MPIRUN@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OVERRIDE_IMAGE_HEIGHT_MAX = @OVERRIDE_IMAGE_HEIGHT_MAX@ OVERRIDE_IMAGE_WIDTH_MAX = @OVERRIDE_IMAGE_WIDTH_MAX@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RR = @RR@ RTA_TOPDIR = @RTA_TOPDIR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = src man doc po pixmaps EXTRA_DIST = \ autogen.sh \ intltool-extract.in \ intltool-merge.in \ intltool-update.in DISTCLEANFILES = \ intltool-extract \ intltool-merge \ intltool-update all: all-recursive .SUFFIXES: am--refresh: @: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ cd $(srcdir) && $(AUTOMAKE) --gnu \ && exit 0; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ echo ' $(SHELL) ./config.status'; \ $(SHELL) ./config.status;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) $(SHELL) ./config.status --recheck $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(srcdir) && $(AUTOCONF) $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) $(am__remove_distdir) test -d $(distdir) || mkdir $(distdir) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ || chmod -R a+r $(distdir) dist-gzip: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) dist-bzip2: distdir tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2 $(am__remove_distdir) dist-lzma: distdir tardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma $(am__remove_distdir) dist-tarZ: distdir tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__remove_distdir) dist-shar: distdir shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz $(am__remove_distdir) dist-zip: distdir -rm -f $(distdir).zip zip -rq $(distdir).zip $(distdir) $(am__remove_distdir) dist dist-all: distdir tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz $(am__remove_distdir) # This target untars the dist file and tries a VPATH configuration. Then # it guarantees that the distribution is self-contained by making another # tarfile. distcheck: dist case '$(DIST_ARCHIVES)' in \ *.tar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\ *.tar.bz2*) \ bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\ *.tar.lzma*) \ unlzma -c $(distdir).tar.lzma | $(am__untar) ;;\ *.tar.Z*) \ uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ *.shar.gz*) \ GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ *.zip*) \ unzip $(distdir).zip ;;\ esac chmod -R a-w $(distdir); chmod a+w $(distdir) mkdir $(distdir)/_build mkdir $(distdir)/_inst chmod a-w $(distdir) dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ && cd $(distdir)/_build \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) \ && $(MAKE) $(AM_MAKEFLAGS) dvi \ && $(MAKE) $(AM_MAKEFLAGS) check \ && $(MAKE) $(AM_MAKEFLAGS) install \ && $(MAKE) $(AM_MAKEFLAGS) installcheck \ && $(MAKE) $(AM_MAKEFLAGS) uninstall \ && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ distuninstallcheck \ && chmod -R a-w "$$dc_install_base" \ && ({ \ (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ } || { rm -rf "$$dc_destdir"; exit 1; }) \ && rm -rf "$$dc_destdir" \ && $(MAKE) $(AM_MAKEFLAGS) dist \ && rm -rf $(DIST_ARCHIVES) \ && $(MAKE) $(AM_MAKEFLAGS) distcleancheck $(am__remove_distdir) @(echo "$(distdir) archives ready for distribution: "; \ list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' distuninstallcheck: @cd $(distuninstallcheck_dir) \ && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ || { echo "ERROR: files left after uninstall:" ; \ if test -n "$(DESTDIR)"; then \ echo " (check DESTDIR support)"; \ fi ; \ $(distuninstallcheck_listfiles) ; \ exit 1; } >&2 distcleancheck: distclean @if test '$(srcdir)' = . ; then \ echo "ERROR: distcleancheck can only run from a VPATH build" ; \ exit 1 ; \ fi @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ || { echo "ERROR: files left in build directory after distclean:" ; \ $(distcleancheck_listfiles) ; \ exit 1; } >&2 check-am: all-am check: check-recursive all-am: Makefile installdirs: installdirs-recursive installdirs-am: install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f $(am__CONFIG_DISTCLEAN_FILES) -rm -rf $(top_srcdir)/autom4te.cache -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am am--refresh check check-am clean clean-generic \ ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \ dist-lzma dist-shar dist-tarZ dist-zip distcheck distclean \ distclean-generic distclean-tags distcleancheck distdir \ distuninstallcheck dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-ps install-ps-am \ install-strip installcheck installcheck-am installdirs \ installdirs-am maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am tags \ tags-recursive uninstall uninstall-am # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gpiv-0.6.1/AUTHORS0000644000175000017500000000000011076052422010441 00000000000000gpiv-0.6.1/INSTALL0000644000175000017500000001722711076052422010445 00000000000000Basic Installation ================== These are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. gpiv-0.6.1/intltool-merge.in0000644000175000017500000000000011204234167012663 00000000000000gpiv-0.6.1/ABOUT-NLS0000644000175000017500000015111611076052422010637 00000000000000Notes on the Free Translation Project ************************************* Free software is going international! The Free Translation Project is a way to get maintainers of free software, translators, and users all together, so that will gradually become able to speak many languages. A few packages already provide translations for their messages. If you found this `ABOUT-NLS' file inside a distribution, you may assume that the distributed package does use GNU `gettext' internally, itself available at your nearest GNU archive site. But you do _not_ need to install GNU `gettext' prior to configuring, installing or using this package with messages translated. Installers will find here some useful hints. These notes also explain how users should proceed for getting the programs to use the available translations. They tell how people wanting to contribute and work at translations should contact the appropriate team. When reporting bugs in the `intl/' directory or bugs which may be related to internationalization, you should tell about the version of `gettext' which is used. The information can be found in the `intl/VERSION' file, in internationalized packages. Quick configuration advice ========================== If you want to exploit the full power of internationalization, you should configure it using ./configure --with-included-gettext to force usage of internationalizing routines provided within this package, despite the existence of internationalizing capabilities in the operating system where this package is being installed. So far, only the `gettext' implementation in the GNU C library version 2 provides as many features (such as locale alias, message inheritance, automatic charset conversion or plural form handling) as the implementation here. It is also not possible to offer this additional functionality on top of a `catgets' implementation. Future versions of GNU `gettext' will very likely convey even more functionality. So it might be a good idea to change to GNU `gettext' as soon as possible. So you need _not_ provide this option if you are using GNU libc 2 or you have installed a recent copy of the GNU gettext package with the included `libintl'. INSTALL Matters =============== Some packages are "localizable" when properly installed; the programs they contain can be made to speak your own native language. Most such packages use GNU `gettext'. Other packages have their own ways to internationalization, predating GNU `gettext'. By default, this package will be installed to allow translation of messages. It will automatically detect whether the system already provides the GNU `gettext' functions. If not, the GNU `gettext' own library will be used. This library is wholly contained within this package, usually in the `intl/' subdirectory, so prior installation of the GNU `gettext' package is _not_ required. Installers may use special options at configuration time for changing the default behaviour. The commands: ./configure --with-included-gettext ./configure --disable-nls will respectively bypass any pre-existing `gettext' to use the internationalizing routines provided within this package, or else, _totally_ disable translation of messages. When you already have GNU `gettext' installed on your system and run configure without an option for your new package, `configure' will probably detect the previously built and installed `libintl.a' file and will decide to use this. This might be not what is desirable. You should use the more recent version of the GNU `gettext' library. I.e. if the file `intl/VERSION' shows that the library which comes with this package is more recent, you should use ./configure --with-included-gettext to prevent auto-detection. The configuration process will not test for the `catgets' function and therefore it will not be used. The reason is that even an emulation of `gettext' on top of `catgets' could not provide all the extensions of the GNU `gettext' library. Internationalized packages have usually many `po/LL.po' files, where LL gives an ISO 639 two-letter code identifying the language. Unless translations have been forbidden at `configure' time by using the `--disable-nls' switch, all available translations are installed together with the package. However, the environment variable `LINGUAS' may be set, prior to configuration, to limit the installed set. `LINGUAS' should then contain a space separated list of two-letter codes, stating which languages are allowed. Using This Package ================== As a user, if your language has been installed for this package, you only have to set the `LANG' environment variable to the appropriate `LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, and `CC' is an ISO 3166 two-letter country code. For example, let's suppose that you speak German and live in Germany. At the shell prompt, merely execute `setenv LANG de_DE' (in `csh'), `export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). This can be done from your `.login' or `.profile' file, once and for all. You might think that the country code specification is redundant. But in fact, some languages have dialects in different countries. For example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The country code serves to distinguish the dialects. The locale naming convention of `LL_CC', with `LL' denoting the language and `CC' denoting the country, is the one use on systems based on GNU libc. On other systems, some variations of this scheme are used, such as `LL' or `LL_CC.ENCODING'. You can get the list of locales supported by your system for your country by running the command `locale -a | grep '^LL''. Not all programs have translations for all languages. By default, an English message is shown in place of a nonexistent translation. If you understand other languages, you can set up a priority list of languages. This is done through a different environment variable, called `LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' for the purpose of message handling, but you still need to have `LANG' set to the primary language; this is required by other parts of the system libraries. For example, some Swedish users who would rather read translations in German than English for when Swedish is not available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. Special advice for Norwegian users: The language code for Norwegian bokma*l changed from `no' to `nb' recently (in 2003). During the transition period, while some message catalogs for this language are installed under `nb' and some older ones under `no', it's recommended for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and older translations are used. In the `LANGUAGE' environment variable, but not in the `LANG' environment variable, `LL_CC' combinations can be abbreviated as `LL' to denote the language's main dialect. For example, `de' is equivalent to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' (Portuguese as spoken in Portugal) in this context. Translating Teams ================= For the Free Translation Project to be a success, we need interested people who like their own language and write it well, and who are also able to synergize with other translators speaking the same language. Each translation team has its own mailing list. The up-to-date list of teams can be found at the Free Translation Project's homepage, `http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" area. If you'd like to volunteer to _work_ at translating messages, you should become a member of the translating team for your own language. The subscribing address is _not_ the same as the list itself, it has `-request' appended. For example, speakers of Swedish can send a message to `sv-request@li.org', having this message body: subscribe Keep in mind that team members are expected to participate _actively_ in translations, or at solving translational difficulties, rather than merely lurking around. If your team does not exist yet and you want to start one, or if you are unsure about what to do or how to get started, please write to `translation@iro.umontreal.ca' to reach the coordinator for all translator teams. The English team is special. It works at improving and uniformizing the terminology in use. Proven linguistic skill are praised more than programming skill, here. Available Packages ================== Languages are not equally supported in all packages. The following matrix shows the current state of internationalization, as of January 2004. The matrix shows, in regard of each package, for which languages PO files have been submitted to translation coordination, with a translation percentage of at least 50%. Ready PO files af am ar az be bg bs ca cs da de el en en_GB eo es +----------------------------------------------------+ a2ps | [] [] [] [] | aegis | () | ant-phone | () | anubis | | ap-utils | | aspell | [] | bash | [] [] [] [] | batchelor | | bfd | [] [] | binutils | [] [] | bison | [] [] [] | bluez-pin | [] [] [] | clisp | | clisp | [] [] [] | console-tools | [] [] | coreutils | [] [] [] [] | cpio | [] [] [] | darkstat | [] () [] | diffutils | [] [] [] [] [] [] [] | e2fsprogs | [] [] [] | enscript | [] [] [] [] | error | [] [] [] [] [] | fetchmail | [] () [] [] [] [] | fileutils | [] [] [] | findutils | [] [] [] [] [] [] [] | flex | [] [] [] [] | fslint | | gas | [] | gawk | [] [] [] [] | gbiff | [] | gcal | [] | gcc | [] [] | gettext | [] [] [] [] [] | gettext-examples | [] [] [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] [] | gimp-print | [] [] [] [] [] | gliv | | glunarclock | [] [] | gnubiff | [] | gnucash | [] () [] [] | gnucash-glossary | [] () [] | gnupg | [] () [] [] [] [] | gpe-aerial | [] | gpe-beam | [] [] | gpe-calendar | [] [] | gpe-clock | [] [] | gpe-conf | [] [] | gpe-contacts | [] [] | gpe-edit | [] | gpe-go | [] | gpe-login | [] [] | gpe-ownerinfo | [] [] | gpe-sketchbook | [] [] | gpe-su | [] [] | gpe-taskmanager | [] [] | gpe-timesheet | [] | gpe-today | [] [] | gpe-todo | [] [] | gphoto2 | [] [] [] [] | gprof | [] [] [] | gpsdrive | () () () | gramadoir | [] | grep | [] [] [] [] [] [] | gretl | [] | gtick | [] () | hello | [] [] [] [] [] [] | id-utils | [] [] | indent | [] [] [] [] | iso_3166 | [] [] [] [] [] [] [] [] [] [] | iso_3166_1 | [] [] [] [] [] [] | iso_3166_2 | | iso_3166_3 | [] | iso_4217 | [] [] [] [] | iso_639 | | jpilot | [] [] [] | jtag | | jwhois | [] | kbd | [] [] [] [] [] | latrine | () | ld | [] [] | libc | [] [] [] [] [] [] | libgpewidget | [] [] | libiconv | [] [] [] [] [] | lifelines | [] () | lilypond | [] | lingoteach | | lingoteach_lessons | () () | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | [] [] | make | [] [] [] | man-db | [] () [] [] () | minicom | [] [] [] | mysecretdiary | [] [] [] | nano | [] () [] [] [] | nano_1_0 | [] () [] [] [] | opcodes | [] | parted | [] [] [] [] [] | ptx | [] [] [] [] [] | python | | radius | [] | recode | [] [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] [] [] [] [] [] | sed | [] [] [] [] [] [] | sh-utils | [] [] [] | shared-mime-info | | sharutils | [] [] [] [] [] [] | silky | () | skencil | [] () [] | sketch | [] () [] | soundtracker | [] [] [] | sp | [] | tar | [] [] [] [] | texinfo | [] [] [] | textutils | [] [] [] [] | tin | () () | tp-robot | | tuxpaint | [] [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] [] [] | vorbis-tools | [] [] [] [] | wastesedge | () | wdiff | [] [] [] [] | wget | [] [] [] [] [] [] | xchat | [] [] [] [] | xfree86_xkb_xml | [] [] | xpad | [] | +----------------------------------------------------+ af am ar az be bg bs ca cs da de el en en_GB eo es 4 0 0 1 9 4 1 40 41 60 78 17 1 5 13 68 et eu fa fi fr ga gl he hr hu id is it ja ko lg +-------------------------------------------------+ a2ps | [] [] [] () () | aegis | | ant-phone | [] | anubis | [] | ap-utils | [] | aspell | [] [] | bash | [] [] | batchelor | [] [] | bfd | [] | binutils | [] [] | bison | [] [] [] [] | bluez-pin | [] [] [] [] [] | clisp | | clisp | [] | console-tools | | coreutils | [] [] [] [] [] [] | cpio | [] [] [] [] | darkstat | () [] [] [] | diffutils | [] [] [] [] [] [] [] | e2fsprogs | | enscript | [] [] | error | [] [] [] [] | fetchmail | [] | fileutils | [] [] [] [] [] [] | findutils | [] [] [] [] [] [] [] [] [] [] [] | flex | [] [] [] | fslint | [] | gas | [] | gawk | [] [] [] | gbiff | [] | gcal | [] | gcc | [] | gettext | [] [] [] | gettext-examples | [] [] | gettext-runtime | [] [] [] [] [] | gettext-tools | [] [] [] | gimp-print | [] [] | gliv | () | glunarclock | [] [] [] [] | gnubiff | [] | gnucash | () [] | gnucash-glossary | [] | gnupg | [] [] [] [] [] [] [] | gpe-aerial | [] | gpe-beam | [] | gpe-calendar | [] [] [] | gpe-clock | [] | gpe-conf | [] | gpe-contacts | [] [] | gpe-edit | [] [] | gpe-go | [] | gpe-login | [] [] | gpe-ownerinfo | [] [] [] | gpe-sketchbook | [] | gpe-su | [] | gpe-taskmanager | [] | gpe-timesheet | [] [] [] | gpe-today | [] [] | gpe-todo | [] [] | gphoto2 | [] [] [] | gprof | [] [] | gpsdrive | () () () | gramadoir | [] [] | grep | [] [] [] [] [] [] [] [] [] [] [] | gretl | [] [] | gtick | [] [] [] | hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] [] | indent | [] [] [] [] [] [] [] [] [] | iso_3166 | [] [] [] [] [] [] [] | iso_3166_1 | [] [] [] [] [] | iso_3166_2 | | iso_3166_3 | | iso_4217 | [] [] [] [] [] [] | iso_639 | | jpilot | [] () | jtag | [] | jwhois | [] [] [] [] | kbd | [] | latrine | [] | ld | [] | libc | [] [] [] [] [] [] | libgpewidget | [] [] [] [] | libiconv | [] [] [] [] [] [] [] [] [] | lifelines | () | lilypond | [] | lingoteach | [] [] | lingoteach_lessons | | lynx | [] [] [] [] | m4 | [] [] [] [] | mailutils | | make | [] [] [] [] [] [] | man-db | () () | minicom | [] [] [] [] | mysecretdiary | [] [] | nano | [] [] [] [] | nano_1_0 | [] [] [] [] | opcodes | [] | parted | [] [] [] | ptx | [] [] [] [] [] [] [] | python | | radius | [] | recode | [] [] [] [] [] [] | rpm | [] [] | screem | | scrollkeeper | [] | sed | [] [] [] [] [] [] [] [] [] | sh-utils | [] [] [] [] [] [] [] | shared-mime-info | [] [] [] | sharutils | [] [] [] [] [] | silky | () [] () () | skencil | [] | sketch | [] | soundtracker | [] [] | sp | [] () | tar | [] [] [] [] [] [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] [] [] [] [] | tin | [] () | tp-robot | [] | tuxpaint | [] [] [] [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | [] [] | util-linux | [] [] [] [] () [] | vorbis-tools | [] | wastesedge | () | wdiff | [] [] [] [] [] [] | wget | [] [] [] [] [] [] [] | xchat | [] [] [] | xfree86_xkb_xml | [] [] | xpad | [] [] | +-------------------------------------------------+ et eu fa fi fr ga gl he hr hu id is it ja ko lg 22 2 1 26 106 28 24 8 10 41 33 1 26 33 12 0 lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru +-----------------------------------------------------+ a2ps | [] [] () () [] [] [] | aegis | () () () | ant-phone | [] [] | anubis | [] [] [] [] [] [] | ap-utils | [] () [] | aspell | [] | bash | [] [] [] | batchelor | [] | bfd | [] | binutils | [] | bison | [] [] [] [] [] | bluez-pin | [] [] [] | clisp | | clisp | [] | console-tools | [] | coreutils | [] [] | cpio | [] [] [] [] [] | darkstat | [] [] [] [] | diffutils | [] [] [] [] [] [] | e2fsprogs | [] | enscript | [] [] [] [] | error | [] [] [] | fetchmail | [] [] () [] | fileutils | [] [] [] | findutils | [] [] [] [] [] | flex | [] [] [] [] | fslint | [] [] | gas | | gawk | [] [] [] | gbiff | [] [] | gcal | | gcc | | gettext | [] [] [] | gettext-examples | [] [] [] | gettext-runtime | [] [] [] [] | gettext-tools | [] [] | gimp-print | [] | gliv | [] [] [] | glunarclock | [] [] [] [] | gnubiff | [] | gnucash | [] [] () [] | gnucash-glossary | [] [] | gnupg | [] | gpe-aerial | [] [] [] [] | gpe-beam | [] [] [] [] | gpe-calendar | [] [] [] [] | gpe-clock | [] [] [] [] | gpe-conf | [] [] [] [] | gpe-contacts | [] [] [] [] | gpe-edit | [] [] [] [] | gpe-go | [] [] [] | gpe-login | [] [] [] [] | gpe-ownerinfo | [] [] [] [] | gpe-sketchbook | [] [] [] [] | gpe-su | [] [] [] [] | gpe-taskmanager | [] [] [] [] | gpe-timesheet | [] [] [] [] | gpe-today | [] [] [] [] | gpe-todo | [] [] [] [] | gphoto2 | [] | gprof | [] [] | gpsdrive | () () [] | gramadoir | () [] | grep | [] [] [] [] [] | gretl | | gtick | [] [] [] | hello | [] [] [] [] [] [] [] [] [] [] | id-utils | [] [] [] [] | indent | [] [] [] [] | iso_3166 | [] [] [] | iso_3166_1 | [] [] | iso_3166_2 | | iso_3166_3 | [] | iso_4217 | [] [] [] [] [] [] [] [] | iso_639 | [] | jpilot | () () | jtag | | jwhois | [] [] [] [] () | kbd | [] [] [] | latrine | [] | ld | | libc | [] [] [] [] | libgpewidget | [] [] [] | libiconv | [] [] [] [] [] | lifelines | | lilypond | | lingoteach | | lingoteach_lessons | | lynx | [] [] [] | m4 | [] [] [] [] [] | mailutils | [] [] [] | make | [] [] [] [] | man-db | [] | minicom | [] [] [] [] | mysecretdiary | [] [] [] | nano | [] [] [] [] [] | nano_1_0 | [] [] [] [] [] [] | opcodes | [] [] | parted | [] [] [] [] | ptx | [] [] [] [] [] [] [] [] | python | | radius | [] [] | recode | [] [] [] [] | rpm | [] [] [] | screem | | scrollkeeper | [] [] [] [] [] | sed | [] [] [] | sh-utils | [] [] | shared-mime-info | [] [] | sharutils | [] [] | silky | () | skencil | [] [] | sketch | [] [] | soundtracker | | sp | | tar | [] [] [] [] [] [] | texinfo | [] [] [] [] | textutils | [] [] | tin | | tp-robot | [] | tuxpaint | [] [] [] [] [] [] [] [] | unicode-han-tra... | | unicode-transla... | | util-linux | [] [] [] | vorbis-tools | [] [] [] | wastesedge | | wdiff | [] [] [] [] [] | wget | [] [] [] | xchat | [] [] [] | xfree86_xkb_xml | [] [] | xpad | [] [] | +-----------------------------------------------------+ lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru 1 2 0 3 12 0 10 69 6 7 1 40 26 36 76 63 sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu +-----------------------------------------------------+ a2ps | [] [] [] [] | 16 aegis | | 0 ant-phone | | 3 anubis | [] [] | 9 ap-utils | () | 3 aspell | | 4 bash | | 9 batchelor | | 3 bfd | [] [] | 6 binutils | [] [] [] | 8 bison | [] [] | 14 bluez-pin | [] [] [] | 14 clisp | | 0 clisp | | 5 console-tools | | 3 coreutils | [] [] [] [] | 16 cpio | [] [] | 14 darkstat | [] [] [] () () | 12 diffutils | [] [] [] | 23 e2fsprogs | [] [] | 6 enscript | [] [] | 12 error | [] [] [] | 15 fetchmail | [] [] | 11 fileutils | [] [] [] [] [] | 17 findutils | [] [] [] [] [] [] | 29 flex | [] [] | 13 fslint | | 3 gas | [] | 3 gawk | [] [] | 12 gbiff | | 4 gcal | [] [] | 4 gcc | [] | 4 gettext | [] [] [] [] [] | 16 gettext-examples | [] [] [] [] [] | 14 gettext-runtime | [] [] [] [] [] [] [] [] | 22 gettext-tools | [] [] [] [] [] [] | 14 gimp-print | [] [] | 10 gliv | | 3 glunarclock | [] [] [] | 13 gnubiff | | 3 gnucash | [] [] | 9 gnucash-glossary | [] [] [] | 8 gnupg | [] [] [] [] | 17 gpe-aerial | [] | 7 gpe-beam | [] | 8 gpe-calendar | [] [] [] [] | 13 gpe-clock | [] [] [] | 10 gpe-conf | [] [] | 9 gpe-contacts | [] [] [] | 11 gpe-edit | [] [] [] [] [] | 12 gpe-go | | 5 gpe-login | [] [] [] [] [] | 13 gpe-ownerinfo | [] [] [] [] | 13 gpe-sketchbook | [] [] | 9 gpe-su | [] [] [] | 10 gpe-taskmanager | [] [] [] | 10 gpe-timesheet | [] [] [] [] | 12 gpe-today | [] [] [] [] [] | 13 gpe-todo | [] [] [] [] | 12 gphoto2 | [] [] [] | 11 gprof | [] [] | 9 gpsdrive | [] [] | 3 gramadoir | [] | 5 grep | [] [] [] [] | 26 gretl | | 3 gtick | | 7 hello | [] [] [] [] [] | 34 id-utils | [] [] | 12 indent | [] [] [] [] | 21 iso_3166 | [] [] [] [] [] [] [] | 27 iso_3166_1 | [] [] [] | 16 iso_3166_2 | | 0 iso_3166_3 | | 2 iso_4217 | [] [] [] [] [] [] | 24 iso_639 | | 1 jpilot | [] [] [] [] [] | 9 jtag | [] | 2 jwhois | () [] [] | 11 kbd | [] [] | 11 latrine | | 2 ld | [] [] | 5 libc | [] [] [] [] | 20 libgpewidget | [] [] [] [] | 13 libiconv | [] [] [] [] [] [] [] [] | 27 lifelines | [] | 2 lilypond | [] | 3 lingoteach | | 2 lingoteach_lessons | () | 0 lynx | [] [] [] | 14 m4 | [] [] | 15 mailutils | | 5 make | [] [] [] | 16 man-db | [] | 5 minicom | | 11 mysecretdiary | [] [] | 10 nano | [] [] [] [] | 17 nano_1_0 | [] [] [] | 17 opcodes | [] [] | 6 parted | [] [] [] | 15 ptx | [] [] | 22 python | | 0 radius | | 4 recode | [] [] [] | 20 rpm | [] [] | 9 screem | [] [] | 2 scrollkeeper | [] [] [] | 15 sed | [] [] [] [] [] [] | 24 sh-utils | [] [] | 14 shared-mime-info | [] [] | 7 sharutils | [] [] [] [] | 17 silky | () | 3 skencil | [] | 6 sketch | [] | 6 soundtracker | [] [] | 7 sp | [] | 3 tar | [] [] [] [] [] | 24 texinfo | [] [] [] | 14 textutils | [] [] [] [] | 16 tin | | 1 tp-robot | | 2 tuxpaint | [] [] [] [] [] | 29 unicode-han-tra... | | 0 unicode-transla... | | 2 util-linux | [] [] | 15 vorbis-tools | | 8 wastesedge | | 0 wdiff | [] [] [] | 18 wget | [] [] [] [] [] [] [] [] | 24 xchat | [] [] [] [] [] | 15 xfree86_xkb_xml | [] [] [] [] [] | 11 xpad | | 5 +-----------------------------------------------------+ 63 teams sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu 131 domains 47 19 28 83 0 0 59 13 1 1 11 0 22 22 0 1373 Some counters in the preceding matrix are higher than the number of visible blocks let us expect. This is because a few extra PO files are used for implementing regional variants of languages, or language dialects. For a PO file in the matrix above to be effective, the package to which it applies should also have been internationalized and distributed as such by its maintainer. There might be an observable lag between the mere existence a PO file and its wide availability in a distribution. If January 2004 seems to be old, you may fetch a more recent copy of this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date matrix with full percentage details can be found at `http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. Using `gettext' in new packages =============================== If you are writing a freely available program and want to internationalize it you are welcome to use GNU `gettext' in your package. Of course you have to respect the GNU Library General Public License which covers the use of the GNU `gettext' library. This means in particular that even non-free programs can use `libintl' as a shared library, whereas only free software can use `libintl' as a static library or use modified versions of `libintl'. Once the sources are changed appropriately and the setup can handle the use of `gettext' the only thing missing are the translations. The Free Translation Project is also available for packages which are not developed inside the GNU project. Therefore the information given above applies also for every other Free Software Project. Contact `translation@iro.umontreal.ca' to make the `.pot' files available to the translation teams. gpiv-0.6.1/pixmaps/0000777000175000017500000000000011204235561011150 500000000000000gpiv-0.6.1/pixmaps/Makefile.am0000644000175000017500000000022211157744201013117 00000000000000INCLUDES = -DDATA_DIR=\""$(datadir)"\" pixmapsdir = $(datadir)/pixmaps pixmaps_DATA = gpiv_logo.png gpiv_logo.xpm EXTRA_DIST = $(pixmaps_DATA) gpiv-0.6.1/pixmaps/Makefile.in0000644000175000017500000002446211204234173013137 00000000000000# Makefile.in generated by automake 1.10.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = pixmaps DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(pixmapsdir)" pixmapsDATA_INSTALL = $(INSTALL_DATA) DATA = $(pixmaps_DATA) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CANVAS_AA = @CANVAS_AA@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONTROL = @CONTROL@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUG = @DEBUG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_CAM = @ENABLE_CAM@ ENABLE_DAC = @ENABLE_DAC@ ENABLE_MPI = @ENABLE_MPI@ ENABLE_MPI_RR = @ENABLE_MPI_RR@ ENABLE_TRIG = @ENABLE_TRIG@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GPIV_CFLAGS = @GPIV_CFLAGS@ GPIV_LIBS = @GPIV_LIBS@ GPIV_UI_CFLAGS = @GPIV_UI_CFLAGS@ GPIV_UI_LIBS = @GPIV_UI_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ K_TOPDIR = @K_TOPDIR@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MPIRUN = @MPIRUN@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OVERRIDE_IMAGE_HEIGHT_MAX = @OVERRIDE_IMAGE_HEIGHT_MAX@ OVERRIDE_IMAGE_WIDTH_MAX = @OVERRIDE_IMAGE_WIDTH_MAX@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RR = @RR@ RTA_TOPDIR = @RTA_TOPDIR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ INCLUDES = -DDATA_DIR=\""$(datadir)"\" pixmapsdir = $(datadir)/pixmaps pixmaps_DATA = gpiv_logo.png gpiv_logo.xpm EXTRA_DIST = $(pixmaps_DATA) all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu pixmaps/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu pixmaps/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-pixmapsDATA: $(pixmaps_DATA) @$(NORMAL_INSTALL) test -z "$(pixmapsdir)" || $(MKDIR_P) "$(DESTDIR)$(pixmapsdir)" @list='$(pixmaps_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(pixmapsDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pixmapsdir)/$$f'"; \ $(pixmapsDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pixmapsdir)/$$f"; \ done uninstall-pixmapsDATA: @$(NORMAL_UNINSTALL) @list='$(pixmaps_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(pixmapsdir)/$$f'"; \ rm -f "$(DESTDIR)$(pixmapsdir)/$$f"; \ done tags: TAGS TAGS: ctags: CTAGS CTAGS: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(DATA) installdirs: for dir in "$(DESTDIR)$(pixmapsdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am info: info-am info-am: install-data-am: install-pixmapsDATA install-dvi: install-dvi-am install-exec-am: install-html: install-html-am install-info: install-info-am install-man: install-pdf: install-pdf-am install-ps: install-ps-am installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-pixmapsDATA .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic distclean \ distclean-generic distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am install-html \ install-html-am install-info install-info-am install-man \ install-pdf install-pdf-am install-pixmapsDATA install-ps \ install-ps-am install-strip installcheck installcheck-am \ installdirs maintainer-clean maintainer-clean-generic \ mostlyclean mostlyclean-generic pdf pdf-am ps ps-am uninstall \ uninstall-am uninstall-pixmapsDATA # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gpiv-0.6.1/pixmaps/gpiv_logo.png0000644000175000017500000000346311076052422013565 00000000000000PNG  IHDRPP"PLTEql t"{f)m,r-v/v0w0f{1\\\ccckkksss{{{$&()+-/0135688:=> B CI@B GMOUV@BHG J KDFKH MMP Q SXSTZ[\_b`hcdei$g f$m#m i/z't$s)s)v-y+z123;468;>@@ A!D"F#H$J-S&M(O'O&P(P'P(Q3]*U,X+V,Y0\0^7`8d=i4`3`:i-[.^0]0^/`3c:j1`7h:l2c:l4f:n?r>rDrDtK{GvDv@qJ|@s@tDyJOOTOMXT\[^`bcfjoth.tRNS@fbKGDH pHYs  tIME 'M/IDATXn6PINWKYb iAS+nȴѥ|HhR<^vD8DjZP;R FQ'Z~4Ͳfa <ߒ8\(ZQʹO$BqI/EqRpywwЍPʼnO _8p\blU8 p[Ǘoeɸf[2 d}iѰm7os}:̒'8mtOOF>r@٦.W;Bâ33Yݯި]v T APEz!. 78/$;Sq xQ'+I:.s՜Yv}+1cפTV`v 8rm1ʬMiY~pnpV]%ޭib1m3d$zIϤPou;gĻ+NN F-8{7%XW|&|-mŻ{bw6Y}bxy]̓ |N ^)H桻z1MErW[T׍zԇ2 cOj܅c GA]~uׅâ^K&nz㹶A ^I Ԛ Ę@:ߍZn 0Ɗ+h\[uk>D%Wî9׻sB@ lArQ`m/}biS`ۚ9oW%]Xe՞ 3~yΉC5zmw<'wR 1KQ9az4L>lubT Nb?xf<)lA$ck m!8 C bQ:t BanCJ'IQ! ˰&al ,B !'#d P\6.$gYRd!p3AnY{H`4a!;`gDkP4%t,TGQHBL6Z8mIozvapdrTN' c #A4A4A4", ", c #B7B7B7", "' c #C0C0C0", ") c #B6B6B6", "! c #A5A5A5", "~ c #9C9C9C", "{ c #949494", "] c #A9A9A9", "^ c #9E9E9E", "/ c #CD2853", "( c #DD2D5A", "_ c #989898", ": c #A8A8A8", "< c #A6A6A6", "[ c #9D9D9D", "} c #939393", "| c #BD254B", "1 c #CA2751", "2 c #CC2851", "3 c #D52B56", "4 c #D82C57", "5 c #DC2C59", "6 c #D52A56", "7 c #CC2B54", "8 c #CD3561", "9 c #A3A3A3", "0 c #8E8E8E", "a c #8F8F8F", "b c #C1264D", "c c #C6274F", "d c #BC244A", "e c #B82449", "f c #B22246", "g c #AE2145", "h c #AC2144", "i c #9A9A9A", "j c #661429", "k c #71162D", "l c #A92143", "m c #AD2144", "n c #AA2143", "o c #AB2144", "p c #848484", "q c #929292", "r c #72162E", "s c #8C1B38", "t c #B02246", "u c #7B7B7B", "v c #69152A", "w c #7E1832", "x c #9C1E3E", "y c #AF2245", "z c #AD2145", "A c #909090", "B c #999999", "C c #6C152B", "D c #8D1B38", "E c #A11F40", "F c #A62042", "G c #828282", "H c #9B9B9B", "I c #67142A", "J c #781730", "K c #961D3C", "L c #969696", "M c #6B152B", "N c #861A35", "O c #9D1E3E", "P c #8C8C8C", "Q c #73172E", "R c #941D3B", "S c #0036C4", "T c #0139D0", "U c #013AD2", "V c #0644E0", "W c #941C3B", "X c #A82043", "Y c #0034BE", "Z c #0137C7", "` c #0139CE", " . c #023CD8", ".. c #023DDC", "+. c #023BD5", "@. c #023BD2", "#. c #0238C9", "$. c #083FC0", "%. c #0136C5", "&. c #0136C2", "*. c #0135BF", "=. c #0031B2", "-. c #0030AD", ";. c #002FAA", ">. c #888888", ",. c #001C66", "'. c #001E6F", "). c #002EA8", "!. c #0030AE", "~. c #A1A1A1", "{. c #001C67", "]. c #002176", "^. c #002996", "/. c #0030AC", "(. c #002FAB", "_. c #001D68", ":. c #00237F", "<. c #002C9D", "[. c #919191", "}. c #B5B5B5", "|. c #001D69", "1. c #002178", "2. c #002892", "3. c #1840AA", "4. c #DFDFDF", "5. c #00227C", "6. c #002A99", "7. c #B8B8B8", "8. c #EFEFEF", "9. c #E6E6E6", "0. c #001F70", "a. c #00268B", "b. c #002EA4", "c. c #002FA8", "d. c #858585", "e. c #E7E7E7", "f. c #EEEEEE", "g. c #002A98", "h. c #002FA9", "i. c #979797", "j. c #CACACA", "k. c #F5F5F5", "l. c #F0F0F0", "m. c #3657AE", "n. c #A2A2A2", "o. c #A7A7A7", "p. c #CBCBCB", "q. c #F8F8F8", "r. c #AAB7DA", "s. c #264EB7", "t. c #6A82C2", "u. c #B8BECC", "v. c #C5C5C5", "w. c #BEBEBE", "x. c #B4B4B4", "y. c #B0B0B0", "z. c #B3B3B3", "A. c #B1B1B1", "B. c #BCBCBC", "C. c #EBEBEB", "D. c #F7F7F7", "E. c #F1F1F1", "F. c #E4E4E4", "G. c #E0E0E0", "H. c #DCDCDC", "I. c #C9C9C9", "J. c #C2C2C2", "K. c #F4F4F4", "L. c #ECECEC", "M. c #E5E5E5", "N. c #D9D9D9", "O. c #C4C4C4", "P. c #ABABAB", "Q. c #A0A0A0", "R. c #9F9F9F", "S. c #ADADAD", "T. c #AEAEAE", "U. c #7D7D7D", "V. c #7C7C7C", "W. c #808080", " . + @ # $ ", " % & * = = - - ; ", " > , ' ) ! ~ ~ ~ ~ ~ ", " { ] , ] ^ ~ ~ ~ ~ ~ ~ ~ / ( ", " _ : < [ ~ ~ ~ ~ ~ _ } ~ ~ | 1 2 3 4 5 6 7 8 ", " } 9 [ ~ ~ ~ ~ 0 a b c d e f g g h ", " a ^ ~ ~ ~ i { j k l m m n g o l ", " p ~ ~ ~ ~ q j j r s n t h h o ", " u _ ~ ~ i j v w x m y o y m z ", " A ~ ~ B j j C D E z z m F ", " G ~ ~ H j I J K m m m h ", " L ~ ~ j j M N O n h h ", " P ~ ~ q j Q R h o y F S T U V ", " B ~ B W X m g o Y Z ` ...+.@.#.$.", " ~ ~ L h %.&.*.=.-.-.-.;. ", " >.~ H ,.'.).-.!.-.-.-.-. ", " ~ ~ ~. ,.{.].^./.(.(.-.;. ", " } ~ ] ,._.:.<./.-.-.(.-.). ", " [.~ }.# ,.|.1.2.-.-.-.-. 3. ", " { ~ . 4. ,.,.5.6.-.-./.(. 7. ", " >.~ : 8.9. ,.,.0.a.b.-.-.c. p d., * ", " ~ ~ e.f.9. ,.1.g.h.-.-.h. { { i.% j. ", " i ~ ) k.l.e.m.-.-.;.-. ! ~.n.> o.< [ ~ ", " a ~ [ p.q.l.r.s.t.u.j.v.w.& ) }.}.x.y.z.o.^ ~ ~ A. ", " ~ ~ ~ B.C.D.E.C.F.G.H.- * I.I.I.J.A.~.~ ~ ~ ~ ~ ", " q ~ ~ n.B.G.D.D.K.K.L.M.N.O.P.Q.~ ~ ~ ~ ~ ~ ~ ", " L ~ ~ ~ ~ R.S.}.}.T.> ~ ~ ~ ~ ~ i 0 p ~ ~ : ", " i.~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ } U.~ ~ ", " P ~ ~ ~ ~ i P U.~ ~ ", " V.~ ~ ", " W.~ ~ ", " ~ ~ "}; gpiv-0.6.1/ChangeLog0000644000175000017500000000454111167101712011157 000000000000002009-04-8 Adrian Daer * src/display_image.c: repaired Debian bug #523010: gpiv: crashes with assertion error on opening PNG 2009-01-12 Thomas Huxhorn * src/cam.c, src/cam_interface.c, src/dac.c: bug repairs and update for new libgpiv3 interface 2008-25-9 Gerber Van der Graaf * Adapted for use on cluster using (MPI/OMP) parallelised gpiv_rr from gpivtools. 2008-6-5 Gerber Van der Graaf * .h5 and .H5 extension for hdf files (previously .gpi) 2008-7-4 Gerber Van der Graaf * Adapted to changes in __GpivPivPar and Interrogate tabulator of console 2007-14-12 Gerber Van der Graaf * Debugged * __GpivPar: added: display__backgrnd and display__scalar to substitute displaying of images, single color and scalar data 2007-10-12 Gerber Van der Graaf * Adaption for libgpiv 0.5 API. 2007-18-5 Gerber Van der Graaf * Stores/Retreives images/data from URI using the Gnome Virtual File System 2007-10-5 Gerber Van der Graaf * renamed all parameters *_logic to *__set and functions *parameter_logic to *parameter_set 2007-21-02 Gerber Van der Graaf * gpiv_0.4.0_patch3: * improved naming of __GpivPar structure elements * src/: New: image processing tabulator * src/piveval_interrogate.c: disabled some memory leaks 2007-21-02 Gerber Van der Graaf * gpiv_0.4.0_patch2: * src/piveval_interface.c: Monitor with non-interlaced canvas * src/piveval.c: new: Gauss weighting, SPOF filtering 2007-05-02 Gerber Van der Graaf * gpiv_0.4.0_patch1: * Added automatic stretching of buffer display. * Apply broadcast display preferences to all buffers. 2007-25-01 Gerber Van der Graaf * Added loading images from command line. 2006-13-12 Gerber Van der Graaf * Improved display buffer: src/display.c/h splitted into src/event.c/h, src/display_zoom.c/h, src/display_image.c/h, src/display_intregs.c/h, src/display_piv.c/h, src/display_scalars.c/h. * Zooming / paning with pointer and scrollbutton, added menubar, anti-aliased canvas. 2006-7-11 Gerber Van der Graaf * Support for Portable Network Graphics image format (native), and for tif, gif, pgm, bmp by converting to png with netbpm on the fly. * Removed settings for image dimensions; defined in image header and allowing different sizes during same session. 2006-25-7 Gerber Van der Graaf * DISABLE_DAC substituted by ENABLE_CAM, ENABLE_TRIG * Splitting up of dac module into dac_cam and dac_trig gpiv-0.6.1/acconfig.h0000644000175000017500000000030311076052422011321 00000000000000#undef ENABLE_NLS #undef HAVE_CATGETS #undef HAVE_GETTEXT #undef HAVE_LC_MESSAGES #undef HAVE_STPCPY #undef HAVE_LIBSM #undef PACKAGE_LOCALE_DIR #undef PACKAGE_DATA_DIR #undef PACKAGE_SOURCE_DIR gpiv-0.6.1/COPYING0000644000175000017500000004311011076052422010435 00000000000000 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.

?G<8;d2i<OEEE.D1?\. ڵnGl63bQ Z?)0 CҕhYbs/r]]]ii*//w\HdϞ=J (+J]t lȟamqָ$- ݮV-c2y:1@;<vn  \ TnxdY -,,|gע+d-`pvzAi(hAm€W兔RUUM 'U% AYIeq]sB/ ---7=MVuL^i1ZK'ܝTT A k:/4Uk" HC?)Ou0gh!SPppR :)3c`A%(ltMPVoӡd PfM{g-P%Mf0H$-w-^]02h}CjW*롹'aG <_*LnAQ -i ޚf/&`*]?D\w"l{hc"m IBb84UZD-X`&E>S˵gEQβ,/ IR:;377B9<ϑ#Gֵ Fv{eIV<4tШt"qs/ηMl 7> pz^ \.>ӧO@@4T.NOOvEE!V  IDATEB]x뭷6PI> EreYQ_βlEEĄL& |PURRjZeY!СC?& TQP~LN{*ðDRSeKKKyg릵l`V5\YYyZtm.k{iiW_]ZZvTED4ͶlXPD?><77gł&>0_;zrH$R7d27ݱsuX,a\.Hyyy2r(J6u݅>onn///7^xᅂZ"H\"H$q"20,Z,&x<A̬}kCc&'ovCP$I "rm=^3ۙ~^#Du+y /D.^ _q?Y v*/ܲvrСGorttرcv}߾}h$Z$I6;xd[ } (m<\,LbK4y ]VTT|G.ѣ@ܹsaZ æ_~喖/eY~…{VTT|555ǏGmmmy%ҒC2Ƚ>իH_O$htziv\|<߻woeeDGG,//Gw@OI놧}sv﹙rp9uؗ?yWmmeVtZբ׮u]////[-a0{-TL -) `+ZHAlPU HA&+0| CåBH4s V[UO|e yAC f0@| p @t+-&Rz7t4*d0$AX,}k#o o|РpӧמXPE޽!g ڣ`Ǐ\Ҽr:"j.r"*C}.hٻ 6'NB`0Ik` @ ~ zGd/]O0VË2h]Fbo~ꇕ@TSX+qn:B`Ni6ȵ&;ԍ*o sja +8$ ]~ 9J@@r!)`v@nmXLLLLֲwA#035K J,gtf;v4QSSp8`mmMx<~/vzܹ,zdwWyg^5Qj?K}ι!Lx)o8j*|7 w Y *j0Nv ֢O ^ plPcXY@LLLL-M tөEFh}{n G/gK~1,}%m>ĉp+++X,}77[NUm)Q*ݶHi$p`ڝ~j\_C0ۤkv`Ъr$H8*tys{[ZZ|>oŀ~u04UU)R(ֆm166(z']I.nfbbbpb398͸h2w__//Y0 Xk4߽Y~Oسg EQ~ddᱥ֟VHCU*?qTlRD`=Q@b^hkE0"N׳211oppp(@:he6 .* `x:uy}G 4@mw~'j Pnc@ư ݲcrJ8$8c}/P0111mlp/*GA\.pwSzttð? ;3ޅl*@8uEW51 0A?.Y@`9`5N*8pmˎ٬@%2@9 зspSSS?3$ՙq?&&&@V[_,ICd"5M#)Jt:UUEE 8 Ct$TEZܼy3J1 sAcas_|744\z˿<90xw"6(<,uQ~X 0 k\+.-w_·UI/tl5R1Qf:@fWTb&IP"gbZKKK`xxYLHF"׮]~bb51 {}ߏD"SSSCCCzKK\___wwtgg'MhRd***B0л[[knyPɅx"o}Z,~TVVVVVq S`:`:8]. p@lr] ۂai˳4y,t]t0p øU!dۢ뺮ia@ I$E8vԜ<֕ݱ,* P٪BNW<*}h622o|իΝ#v} ðH$2>>(D(:r|?Ҋݎ_[mqӲ웣w*aD|S Ū|gi$UU$ Uq\ <azRx<."0% eG/H˲t:醆h4JQqXipGvnn.|>VTTXQVaVR/.˫\XD"韝t~{!L_=?dg:JY,B6Kβ`P%˲ :d1,0 iqvE1.+٬4Ei[HxW_aXkk+A~?N7o8p W^=pݻkjjNg,d2N555 @RQ\.'i6jj/{k EE GaY㋩F=ӹ Z~k$N&@zJJ P|m灘j,%fkߝEIA.]Jf=j EP8 Xެ-lyq:XTFM7tPDkvg bOȻG-))))Uriii'/9Mb4O7!IwaEQQEWUUEQ4KeIDQ$IRUUl6$IhTMXEhv7&*d^VGvvvQZZZUUUx<555QŲ,,f+X|;OK&MӐ3GQ@n(a|>:rݠ.AJh6ހ뺮FMim6Fq:@6oi obq8}ى'gg4Mv=p@2AQ܎|7yP 9yH$M"@4QEA 4GCVj,+I D}40q=+8˲--ͺ1(*)ĉO(SA`Y6J SʼncfZ- ؈,G1Yy] qYV?<>{ ߥj8^gӗwM,zZ[[[o.TU]\\ez4UU1 Ȳ; A}ж,(YieFh4N haY |ngӏʘKk<&J;eeT1_ZZz?ϬWC2y:!eYa4My0,8,KdSUU5JL..D)]3`ZSQԠg6ՉCUUsq "nw( x<[fO---msD"aX,ʣxcIh.d2(n]t:MV,[wRm"cXww6ս0gߢ@~̢j%IIt\ Et:H`F<18ӼmWub̆RT4QT>nܵk׵kPlҥZے Dr *8= 5_~'dٹ]v4NAka rgm5OMMNOOպ @fC[0a?¹qWWܜ(kC0PPЍ_W_d6x9C&qdQVDZ[(766vvv7jqqQUՂ'.$ qT)"m;_Na\W8rvq?tsz/ҟ#BU!Dڵk(׼ƍ4M߿… E(7zzz}ᩩ|>_RRBt"[YYwyeÇb@ 0??OQ{PqhhLd2yd2(ʞ={P?oܸJ`Q>fl$ɳgφaÁ2`ww7I`ѣ"xe<ҲKKKKKK^jXvr"xw].W<w8vttTT*uȑҳg>7ɸ]RQP?PNMG%z[ZZ\.E%˥i&,˲,cfXvhG]2-VZV?,Nٓa;qO;bz]C(Z_fhZooÇ%Iv8׿ӧ\ѱSRRRSSwرy㚛1 nmm*UUU>}׿cVVVP/>| YVTMUUE蛈~Qfnt:$Ib@jnh ̆ϯ?Ȩ`">PB=mޥSv6G.#)>y C'$WbO0vyV-JIf2FPrɲ6QU[2(yrWkk+/y>JB!IAp:L&'''xՐ뜦iF1 c||M#0xyIɤY\o~sPv땕 : z\t)sm=n,AE\$dFUl6 H ȿ/I$IFJd(t'}saQZpAhۚYs 󎎎.x㍹9RuuuD_u %%%h㺡j".]iR`0h:m0$sQp'W M4˲~?͊Fc`P]YeY`͉|έ(vnDRSi^U&C{ WSo\αXF$iرc j ڵ+UUU=.@>4F)| qF @q>._.,Gyyʍ7PtGGǦvddp:tHt:ݍ Nl6 ͅU(, ?~hooGm6455]v*777wuu7yz  vՊd6/AA ( qIfffVVV$IeV]Gj\.͆j<3y2Q(|o>uszf- N.FnESS爥DC>)#,4668uԕ+WnwSSSii)rmP[[[[[E 8|0ڒ;֛UUUȔ={왞nhh@aQΧc5h\3 ԜH(n{<0(y=GdXp7 sKr2y3[Ei.U^ux0d\-R|S  ո}+J>el^ʣ#0[wkCEbH,r7dCC`}&OPI~awyxt]g8nX,Hm#H|=&wEqӟӱ={#ov`q❋z0ۜIcX]]UPHCŘo A{a(fqt:H m碄 +H IDATޞ_c(k$A.|~ J;5ݿ8q?Jdӏu0$#yQ{2躎vЦ dYYQ. uy<JP.Ƀb%(B!aj p7BXTCh|%ꟘrZ("H2!V,ܶE]d[9 I-(t1;*py<׏{P^KQ9n+ û%c%?(S=l{$Ɋgucb0qnE"G2Dqh(Xem4-r6d2p54ߧiaSP찡o7cX(Jᄪ8zJ8d2WW).jiDt `G̉-,p8HX,B}S0 ]}hbf4Θߏ[Rw``pKVf^4L7n Pp8ԗ& #i4M#gEQP]FތQ,(bT?3gn]%5]_Y;`>((,+:8.F&&wÛܝ N$faqt8Qp H<QyQմÚ*pIwpF&;4Y*k, 8Nd8.~oiiCQ뚺\\Օ^ \oG!h4ZH4 ٢T^T}8˅8HYyEH(4rʝ-}i>oHea)vna>XVW%&)+KΆR[]b1 IRr@MQD:~%oMv+=\2L8M ÄX`("1i N']pw{b!.k00X[ɒ.+>ƺZ3b p$Rma%SM&[AQ lkD^Lt<;m, >np2^TT" ;G|{w`26.qK}8lh:K+ml¡0Ngx`6$R$gڒ $Yp]L@[Qufhb2"pLV@}f)U[]} WTcW9Tc|[o*hN. _Je[X0H&3镑f#+ZMkFwUď5FRp8&& 'S? +kjjvBHM$Ie)E1sR_΀!%q2rX<"YO= 21XY H%3=us X*hDeMp#=%&dӏx%IUQDI,Fh |^VU$y F-aj5dEQUETUQ0LVh?˂UJ3ΚY"J&oH)iǥ epM9A] Ig)'IdMQHR`A2,/%5/ 3Kt.c8%ax&,/A=N:LgrAR雓FʽA6A+KSX*# yIjrdH* v=< 6"Ih(hx2edWn=FfXXmuE/ݜe5ɫ9Ǘ66^y4Espj FxtDZd&/Jwl\M@< psr$yQeQxeȥ!J2_^{U,y$\Uvv ޓ3:Eؘ_(mjFr<5t1q$(Mq{(چO}z0v{2z$E9N$m_@1TIsJxxNEQd:qS" )&:_q]Q@!y?^䓎l6jkk+ˮ ݻ[ZZPZ ˲}}}MMMD񁁁SN4JIyG%. cؾ}-h4M8{$I&IҢ{D|>荿~ӧ]T\.Ni&I2N?~|bb"ˑ$k׮]ٿb}}H.C_zAnܸa믿~ʕ|>?55ꫯ;w.J֢7̲,M===MMMn͛I$vڵ%60HޏeuCnG~T%Q eY 2==KJJÇWH$x6izq8bXV1??o]-s(sssO?dn}tp\hs8|yn7#llllT$H&GQt:iD󦵐$YWWWx4M@N}܈C' VTTQ0MYXX1ڵkPZ[["nŋ]]]EM$/_x<$x{MM\mm-,..m>oEIIɑ#G<O$Ae/_|WWY],EeYIx#r=uaV!y&''6z{ 9sޫq̙3KKKHd㸙g7===^zzzzO>i:RV(u̙ z{{7{(jzz̙3.p8v_z饊SN9sF$ө3g A$InjIO8q̙3gDQͦiڙ3gNEvM{83dVVf}_S$EIZl˶n_#LLOD?܇}mվDEQ  @ľjC{eU.p  @:Y<!@`KaӉdYYق} fR~{( >oXNr:hھR_h41W(tiYVVFfcYaxxqBjaz{{||≯~.k9 P`9KPxOLChFHHBԩ`` ryvvr6X2E+:2GTf9q0L\. zo :tx<;Hi4΍wޑ#GcnŋGh4jVThظ I𱾲O>ybh4*jK7ntteV}뭷BAbXWUUή$L5 p6&15˲ϟiq TUUUcf5 -- e^$S裂%x˙.@&>!L&{t7Wjz]{l6?p,Bj0pb@ccc*KQ/**QˌK0òlzzr,+,,$I]r>. fZX,nV~`H$(˻s^Ns```޽~?H b6BD"afzzyyyKWEѴ4VD޽ؤg2/A{Ǧg*=AjNB @IIhq<++K. nJe2*++Ddee1 #΢v5>>^SSCDggBh4AaݾsNJ͛Pե_?2L,tuuT*VXAnn۷%IAArѨ^~RP(H$,Koo cpO[RJԋp% [0ĤRkfepѣ_@vv6|M=XfiӟaW_]H(h4hl64###5O}KCSn榾]v#Ŗ$,RPŲlooݻSsƅ 8)FBpWMF<Bke=-6ʄX,mEEń1O>$ɞEh:Wv8̅$9;;+˟_mżЏ KӴ .~Y*޽{ZuIlY0 J EQUUUP󛚚0 [B @P466) s(.i`0,3ջ4/#4i^zQ橗Zhm! E*2 Jox<Ǜ[sJ{6,1 zmq`Xk/>=-.B5@bD2Pjf3'kFlO\ssnyiuefvJsPѱσ|edp<4_1:N<. (QYO`>}e, EAeǒLӫ/%mni6 ;1a*q>R~#/f͓N?~| CbsLIDCAann.ebb6k%DQA%$Gg3Lɩ9 *lxtfzp*gffVP 1=c뛐v= G."EQdjf-;=cJvk2]rE>rMϵkV X_*|gccco|y_pĪ]R/pc}jf(Uj"`j|jj{CwZPkHKKz~l 8˲Pn.fl Zg?\xbڱʕ+V5;;alljKA]F3;r%vXMMtX"띟O ˵_z a탟'w1uofxVOggg,CQF*vwwMLLddd<c#z?=0Ljt$U%K:r'2::ZY^8MXKJkatw$ID|FSꖓx<{Pw˯ojܹd4˲@YBGaDx,C^?LF"Z%x^-)Qkth4di22V K ,H\rLh\hkH.qXi5555>>N\.F+Ӳ${DpOQlϻa:cML? Afpdee>uGcu+>aLA!*JWejպOC$RΝ~NeR{#Z6##ASb-*7 ,qk -F{88$nڽ [/ IDAT&̵'_P((,5C2P(422gϞdR@`۪mVūW‘VBf ömEՀ dE(-'O:i+ϒ~~Em>bJx-A*@(P)TA|vECǿ~[?NNM^1]mh5? -9unUIќ8qb5g^dm0L鴺?r+ǿ3ojm#+>ێƦ78ppN%L&׿l AQ47n]G!r j,h²,Iky"bX4F^~2o,[86充M[;NFTK=D"@kf2y`(Z@<BPAAɫ( x*\.BXTljZ}#Hzzz~~x"P ~R>O OݴTu^ <'nkok2222?fNOO|6<Ư455b EI ,?D`4K]@UUUE$ `96p8mڭ hjSsI  CMӱX AAP100lAA0P}855577wH${IMKy줛e`0 =O<遽a;_HzE"Qyy9Mӓ:vK;X,{{{#b1P5p%`Ny< j: j{ͧeBa0bE.rׇ(a>OPjn;--- ̸S@moj:NXz3WH$~ZXBzF vi:--j|' lV){wX0=m, 0W.D"`dX`x*jppy0Fw B8RsH$ y'ʱD"v= ttk> U C>gϞrF377GFFD"Ν;^/L/g4b8''-  l@jD88/cfY$ɩa>϶a{8ǟc+mGdǎdRK/'A-]srp!2,Hlqa-B]?IMgOJhfY6Lrc[nmt>D$8pqUw98 ɤXX.?fFK,J7/|N>2X3whh l_(`0 vtup UbN3!sVnn'Dhi BI&A4}֭*Tʲ,χ=p,ر~K8 (eApð'Oxj7m$I8sٳtj4''V3$%IaYvpptMN9%,xes.?z&Ai ?yU ȘFaPY?q$Td(q񌌌(#jjj>Ӻ|ǓL&}>_iii<OU-}'/i;v D"Zgppp׮]* Eׯ;;wbv޽Rhopmm-I&Cuuu8N$>l(˜.HAWWWYY@uuu*777l9(EÎtDB$(}vRں}vx)|᜜rBqMEw_?ieӷBXW|c7rSe@`!9!BO&7 BƍaRl6߽{Vфᎎcǎ zp"h߾}ΝzNaX ->SZGOT >jX;ߣ V7ywI48ڵ#\,\@!!(lMA,ҥjgggu:òZln{ z "өjaG^8Rp0,((0 $It433#d"~Zv@ ضm[, arr2-- [T*H$Fz HL&S[[۱cߟkjjR6 d2o(ߺuq=g,92D1::ZXX?- !|v98c1ð={͛:ndd//Ξ=viZ"hxxA `av-X$ |> AbeϜ9w^ à$4%Ν;:.H'O9sOݽ{wkk+fDQ4\|̙3NڳgOkkL&.]x<ز̙3% 9s+ L-xLz<,H$yy^̙!aΜ9399E"T*uf2Eqqq___fffkkl&Irpp8.H:;;ß-"<;ޞ Ԕl~ډs,sNff|>H&i'Wyyy333>'HZ-'|. ?Eѥ=|886w.0y0 JrIb466†2;; x bΣAX,2Jv;jZZͅ~Bq'R)4_d20 ΓQPPëRۡPhe'ߓ0xqr<{6wςH$p8BP0t\kQٵ=/Kz.ql]ؔ} _9., ʅap8jűaf3CL&Z-U*U2&@ H$ a3cެ&)??(ڵk$7nY$I v $Ifdd$;v(斖$I޼y3?%8}# (nK$JRp9V/rATTTݻwDjhv/ؙ#E4D"6M*׫jZ MD"F?zx]αT*L& T*,%c+BX, (|" nܼr~β ABaGGYZZHQT<ͻ8Bx<.P<ضm̐='shqƩSR B^o2=J tIi3Y+$I<xZD&ݺu^[N/eM C_|F].׿ۿ=znbbf:rtwL/G0˭x8^RRRSS][[;:::::Z^^βl[[hCCCiii.\ͅCH,s\}S=ggg=Oyy9IT h|=ggEEE###SSS  tלa^>onn v}^_^2.]t{T* d2uuu>S]e]. eeefwfp8d2ӡPR EvvbqvvvjciPM$wx<4M88+_R*r|~jCh$ DwvݑHDVԈbTj0, IRZM P(,,,-)RT;v())Y¢>dFqnnnpppnnN,/h4F"jBPV88+Pݼyk4P0_ߢ)*؉㧡W䖗T*oܸm6_3g2331 oopp0H(D"ǃubx'u4džg&԰z}N5_(dgg,P(B!t(((D0Փ΃[j&L0 2hF|%k__ZmxaPXnttTVeeeHzװ, DbQց(FsSSS,64Mm>{#$ J{j;aݏ4>/98 ,ONNY$~o` ;}]3::& J%\ac$0o|>_2|lI׾}&''gffbf۵kj%Irvvjll͛;vxd'G$++yyy555ׯ_X,6.ugUv_rk.N °LQikNV|>^p8|>= nЯjw]PP`pttɓCCChtppMMMh4VVVH$LE5Ç :z> z Ü c+/dBCh$%"(áaN{MSJ@ `EQR)ɤJmmmD"X;vt\.@8믛bc,888, B6hhiN$hӰT$: B\ ܾpT*]M 999NgffZ >T*b1;v@;( ŚJ~觏c`ҹӥ,|$ZD"hz~ ߑ#G ] ~׭/bbq:ڙ3g~L58888k<^+$ sqD"$Id2P {{{HZ}}}2,''tZ,µ&eYؤ?aJF1 {>Ün^BjĉUUU/:d0>cX|a.sppXUr]tҥKx|B`|&Șw:ALw644VPo>anܸt:>|_D"C577um~\.W<}X,.,,%A"{zz(KR7[] H, QI ^h4R)WT/WRݾ}07ޣ@f*J"PV Ý;wD8{ݻw?>77'Z[[ıcV֬XU~@td |14HR(y)Nj??99)@.b P988k?33Nz(A&>Ç?Tŝp>\.Zx<.\0jZӍOOO+:n2_Nh4'OVUUx4D"9rZq\Pdeequ[Uͦ.\p…?1@x|&7_s(*J[[[G^^g}߿?99 ٽ{BX,ѣG::: H$ks ZZZ OOO@ 033#JPeY ݻ322T*988r󡘄$@8<*(Jaz}AAA tZ>!P($Je2VNMT*H(nJRejhlkk(*ïĉG,߾}_~yppjf`-Ϊ*Ant:*}3C3IE_qh4={tvv쪪* >#@zz:P͢骪>U_JʯY㟝xVkVVVZZڶmR NV { RY \.}+Dܷo`~KB^?kΝǏ777+JLVHҌ aqs)pz[]]~>r$ ~AT*q$IB6. .bX0?c-C?04M#2?;O4ǃBJMւS4m6a>/c˲v$7&b$Ij-0+===BpxxX,kԏ L|>0VfB,|bseRޥiZ.W8qƍ#G|gGq8Po٠Z$?b@ HT_ׇH$ &/ 0 ʥ߸qX,0L4}^DNsssV+_r-++֭[@wݻ]ǚ~ _9~L$t@ `aoއΪP(H$^r:yyyW^%t8^ZZʉNJ x?Ca2R~JUU??;@j{UNϟ?| Y:Sr(*Hn߾]PP011a;::vɲlGG^ .]2`ff1 ;|T*]+l8X,v-NWPP@SSS0oظ#pj֯T*w Ae#DbnZV-..СeY>ORT*VURD">S#DH$>Zm"x]y&ĉ~_"2 /z^,7MҌcXUq\m^lFK;zq^_SS# wرcǹs粲:$222vq==;;˲lAAxJ'OMMAa<h\lNၙPן^[[;_/^X xY\L&zGJ)˛'رc۷aѧ7 vvvB!a\Jla[4H$TQ@V/_ v7x`0ٰ?L& Aa;ŠiEQ`G_eSKBQAS`q,`fbx<.JvBEQ4Mzzzd2ȈD"td2L Bc V4NF>h4z;mה kE3R htJRJv(--۵k&vlD&`0/x<ާ~ VvCM Åh4Jt$y]ǭVɓ'R:ׯ {qpppgbzϞ=555}D˟~&4==mn޽{ϟ?}NX;<}?4L& Z8GrqciVQ*cccAtwwc8<ʜ1pz---:''G?x A~͛7GFF޽rr5A8B7n@s-+hƍiiiALLL888V8x&饗^i`0(0@D#9%htddny0U fShx0IGdjƍ@jB]cZZn߷oϟDA444ܻwק>N TWWS  a1AnnSw ؍vd2|^#E  ̙^0a!ӟAKVNaH~Oq}wvtx8WQXoZC/I$ojeƫ'555n4m6 @`rrjGFF<O?lK&PT[[{Gvwwgff2Fv{5&&"VRxg?I!I*! T*bt4 |X/nO>h4 (JU:q4-ɶo>33L{m۶bܻw/==_RUUUE"H$RQQYWW Bx<R]]pOOOSSSan&L&H}I28}j5T:F ʪfZ_BEix>0m.#(L@ gϞS05LV5Lx -prttE`-ȪB?anz@y qp`X,x.]}AZZZBoq%PPPP__?11QPP000033òmѣG/]- rKJEĎ;ɑ&$sË:͞=ٰ7!@A/EE[ ycKf~Tz'O/x7xvYY@ ʒJ۶m[o7qT&§HA/F)d`DbLۜ#nE'Q4iiiзyK7!Qk5[j;/O q/K?F"aS*i0L,p;D+R9R@h V &Bp9/c!"_$<.sppgB8rbgWL>|ZX,/wܩj)jnnnhh*j:n>j5!{qZ*xLMdgK]ͯʒj).VxiÝ)\nkbV b@+}*YsYSz˯|vd2 ̴4vܹp8ZZZsMݻq%gMx<[oxH}V&Jbl,t$`l,gj5_ j5P500#xF*[֏??~qPʘh^i\^__?;;gff$Ɏ;\.뒖&ftv6bF竀eFRq:'Mb,(Ypp<#V1 O(v:=~ m.>~hA- 7w`0AӬHr6[NClOf" I P@@4oh\888泪(Rlz^. dB{NX,nܸQXX(RVk0ϗē)gYAwjdih4cF0]@pee\oជ88k6H$/|O.x^{t{k5J$|TX,VkT*c}>RlT,d2Nx|Nϱr/I xOAq[u fklԙ/,f/c aro9yRud{Pώ H8 `_WD"P|x;7ssr\J%>1:~0>:wnJ3988r]? ===x 1P:\^a E]]fx~ppvQ[[hr IFQ&5nNb1VZƜB spp<&|HOOWi%:bѸ t0 PE,z#?IHMLL>|(֦8(nzpP(lkkkllJmmm"h4vtt`p8rssÏD/.ē/\޹Ӱofɼ<0R 8~<3=]R>)`ݞ41<5߂cПvh4zqD"y/yyЈ066%STWWlH#( |ǟ.FАA|n/NQ{3o曛rplAMo2`%pZZza ^2)Ngl뭭N!bvo;Q } _gg9]>mxj:##`Z{\ψ `1dzL4ir>OQT2LOO_OߔyrTot~B1 U(>ݿHtaeYf#* Mj+nq2H,c&?Yqp< V ~$aYvxxnNg,ܻ{eUV@_]B$x$4d>|#IpB |j*| `r23sii{,ώ'|h*))iii'F+eYjD"G B;;;"[t:D_l4@B BGFr</ʒ0 rrx(*L&TlArsm \pp (2 s(ieYMvy /Bi1>>FC$IN$P(k/\ ,/B*FbZ !:Nu]SvbeH 6{̲٬]d2XbdYF䎕A(s]׫eL&(,ͤi`m#Ʉa VWWm6ӧ<(4ONNaÑN3 (f2H$F9J0 Bd2J .\rsssT8.: ||>\x_p?#G`5ob4MEa~{P(IJknܸaX<O"$IlȲ|u b:0laTu|m6џN%rNY. řo,IR4-SSSE$Er4rhJH$bXrALOO;wnpp\.u]G>onn.N\.@.[\\4-fUUWWWeYXUyG IDATJnݺCQdbpAvxooo**JeYP(Ѩlx<\v'ڵkaXJR,p8vf[XXHR;w|al,ˆaiuVnkkn?Ӄ^aBJ0Ȳ,˲nZ8|ԩHn^|￿o>n<:k QU0|r$ tbD"p,.uO>g |UyT ֯S8{ eAy|F[8>nZhoo 2 SO8a^{o8|M[[[~m z{{]АL&?䓎9@8EX,4 _$311zj\^__:W˗;;;\ž0͊,76604M{^ץ E?9h4jG}#vXu~ifHcc‚>sʊfiz||T*,kX*JTJR0Q0s"̉DbnnnΝ(&͹\au)b6?Ֆ9wc&OԍuY6R1 ji>f|@̙3CCCQ5Ml3<qսl6?===55d666\.3<311AQ|,[\\r9CCC/^@לap7  ,--uvvX|lO=իW$I0^~婩/B!͛7WWWgff6ɴwuuMMM-Bk7??o~5YCgw8J%Q}\.Dzd:vv:~x$rv:{,K&սx\.wܹi6Ӳv'EQL&$IZ,r\OdX]]=|i㪪VM4X ~nnnWVV|>E5a_9{:_2,eGΣ P1kC]ԩSKnЬSNǎSNǎSNǎSNǎSNǎSNǎSNO_:*JŅp8L:uƍcc.ͱ.n7[Q u0 _F;|>̙Ro߾0q,1@z{`^3Q<ܵ?:$q z *,_yEQjfݎ(vPUUQLq(a} 0jK.A~6͘fggEQqittfmEff;(_GɃNS¦^W6W_UUU$ARԏ~#t:␿TW}uyW_}#琇<.9{g2?DGgJQsmuEQ0 Hbvr !ŮaotZq\i[ouo`4KYodٻɓ'GGG@Q J4]F D.XT*a(q\$I~[Q{^۴aÇ; w}qűAuChSi$IV)6QTVy "aw+kQUeYLqE ør$1 fXE`4U[-E(˰QR& a6JXPv+ApF,9au8a=~] [{|33lv(JP* Nsic33vWCc0[[>{yw\[h몪u&=تl6$Y7EQ&^䷎4wPdJi#_.}gn}_(RTjAd+a~s&M:`s;11S5iw8ܞͶ-V$;::MiY]][q9ܲ.KE\]eH$bFKKCo766NgmCZiwe9nT*.]q\.n4-JY\\.0Tb}ybbb޽<ϧR\.WmhFc|z٬nvo2`<:_<C0!d2Y,-l!$kN9ԿxBmy~իWlz$37~RkSSӉDpM4 Ce]W vTEU UUUTES5EV%E.Ȇ6}k?Iht$^T3b%֘Ս+XiU-&RTQ[Y.\45q%jyb_ xXi:LNOOGFFpCP8nnn>w\cc ׯ_?xڊ"~뭷_>66v`0\.SSS&2 sپ޵5>|(P(Q'I^۱c\(BRf>u mmmNںlfO`3L}~rfYaɥ zt:}̙Ǐ}}} _ H$]v yP(rr0LCCdUq$Iv=;3+S+"TtQ4Ua-+{[%eIZY%kniReIy]v$} ]Eay~"*Ghp{nY;$EaK:$b(n@V\>`X8KUׯ}oO89TfHCV;S-Dh;uJZ Ge_NJE<8N 0Y8IC kJ'a舡ǢQ[G]tTʺ&UbˉRU̫:8P*"랖v^^PT2K]u[hK<T"X\^t9[<[[[#IR4 _8fhqFDbrrER466V*o]zkhД$ q]KR,#Ic+P>?4M(ŋkI,NLL R2>MSSIja߽[yJ[k\ʊI嚚8Nh4j6tX4Ld<{ $ڗvgr<11-akXBP4MRl6UU^x)WK^sB͜ )T-/r9bZħPxT)HH`.Յz)Q$8At]wcc+cy<655 zGXmp{g !m;L>g\P\.Vj 8AD 3LWdEDY%QjmQ Jr"I8nvvK?xbwwI=y0o<<5ux'GHc}"R8,QX.4M9>2ꆨ.Ŕ(&Ralh6%I=&rrwrX_)}]]3>s¯VcF#v].\818ns?L& jMizay>p8p8nw*uhv{\vݚϷ644(ajf( !76pbLc턐J$XaŢs[J|AD bBQ磓 ,zs:eYM-) ՝궕Jg?ĵ#O9y$>?~oa6}&M[+Kv#P037Y(X:9 0VoJ<Ϥv;㑓;v2ݻw{^$²&un|:醤H,c:M@f\)]p& EuU4JA~P|Cck>Ra կ~o/ޢP(h3TkV*<{Cr[@.DYDMSAPVu YUh 4*qS0l'\~Cxrjʑc6Vvwoɏ \wO' \m18qbbb>WyEQ(GU<{F¯6% >ݗK'ʇ\e 5NA&5#*e#V+/˱DJT˲ ʪ t $INfwnLJ,P0P5U =0ЮӧOgD"nw>ܺt镭yeݮn6[[[oG0v}~~ ,kI&Ƶkh9T%MC#rcO;VZnhb0tMTD7hl .tcPL&s;Mtk[x1QF/_T`[SSr9r}idx1tEU5M5M5 u;K٨zuADQzzz*JYۭCDX,&Ço yLu0 L>ۈ$hZ(JXJl$:VXV߇nEa(t62~Ř |^B:Y]lSx/09~h83ᑝcԏ^zicyAi1uc B E2n$1`Wv  \s0 C Ѐ*@PEIY݈D[0! 5Nw.k xg947Z[Nð Q6}5z4M P xn#8(ji"Ae9N?37|[ $qcDQ(iI$˲,0Ͳ,a͛7gffkxunU(bCF&R%H`lAP"A/vt4ZRtEH( $^%|QE]keM&SyAQ%jԝ% tuumeJJb1BwOLLFx1 injuŒd^PR/8*jVxR.iMӉ8Mp bxxp~[a_yx˷wń=ufUT*s*('6ۧfN @J2KuCWZ(T4e pxxTW9Ԯ]] (J6l6oWLDZW_Z?=j9eYITUr2MK055U.M& 0wccܸqc$)J>:u(77;++0c8.Ȋ(jWƀX,fA+eQ04Fm"hٌg:Lvwu׾7ܑujnf@>nqiɣ'Nn]ðkk3K UE7utvvf BfGP*0"Y[_ؙ;FlCן84{  ~~*SR'%LͫD7琔bGvQuSGGx6鞗A`,ILv#)9u1C%+IQpzS-> |>udd$*VkWDITUPGQ>ZZZA( Z[oOܸqvEEQpX,&0:ujAމ ^͸NfO@c; 4iJ V5 Y֭f#];vG=gwpⓙ5Rt 7;vƍcpp 8{թpJBP&) ,[ֆzM&Ss > q]T6CIt8rm3@Pwf '(lV腀wSojj|0ԩ*vcѣMcmFFFL<yZ>n4oՂxXz Þ9\6mle}v~E^goxNL8,m(,Tl6< FZ,J-Ȳar8|=8p~0 C$UU `K[444T8a8B8m[G 7aJ<,0d4biiiill]B9 >?džp`D߀=@dcccCC޽{%V3E|iPw;dx sbիWa r_zS3/@m5mAڡj=wv (֝ԁqXnA)GZJ& 7ů*A`nIENDB`gpiv-0.6.1/doc/C/figures/gpiv-fig_console_interrogat_lower.png0000644000175000017500000023614311204235560021414 00000000000000PNG  IHDRdN pHYs !dtIME;0 IDATxw|TUϭ3wz̤7cE,`Yu{q]]ꊽ7")Zz2I&ɴL1"_y;9yNyFDLL @ U(dLLLSSdžAÒ(xD sq\NS%q' ٚ ~? A] )Jwnlj0 9xtttbB%#9#{y9rR(|0LHMNJ( q5Z-J]8B`8C~ڎ?e`.iO $xs zoB(8PiV8fdffFb\ G08tjINNDzM&SZz:J,ę^;ODaa) [;ŋ_-(ȿnT py>==m-3I콞I"***..{I(J$311[lo hFd==+,,̺!޿_VVVNn.J,y~ [o q1G+ $Gbn _7i ~Ƒ#O2IV^Oܐ$I$Q%IȬ"T8.E 2M_Í ~P *چ3s]`+J"Xoct~ׁ`@.h_S=EQ'M߸qsll;o8oUz?$0 ^Z4ƀ5-IUU{HLL}---:h2b\[W+RZzjyaNǺkrsr匼zɑ>5W6-z J%ť4M={+ CTh4X֨(sCCNC*233%I:~xuP(jssrH{* C+4MtRj$U8v{MqIqzz(?AH@ srii7_;_|5~]2l挛8/>'O>NOZf!gA HR+CA_UU\TahnnbYɲ%)jiMMU}Æ{^ell2١ÇUj aiZe,{ήҲؖCĎСC1ܽ1ȏfee'%%m۶u&c8nڴ1**j„$I64;N$ot:aݻ>#9`F kQXl 77`4Ruzbή^\|쬘ݻ*~y:uR)LuJ )[!b7 WDP"BtL'q =iDV(vtw[V$IF0 x `6>>_e(\.r z=IF){{z0 B&(A"'NÔ SV^*+w67 Cx)*THSNo00 XG$TjUh3y~=Zͼsz}vyoY`~VVu> _'N?] I<$IU,T7qQ0zNh;v`dE ;q][W x^Q(+TTWرc;\&/(,d& 򐴴Tc[[Z:;(R) z;vU/iIptZ SOS$E?8b`X|lEvv=ܝhc.MSO?5&\;OW ~eCQ"TJoWRňAdEE^BHTG. ZrIJNBJhY&OQՑk-h46C ƢCTj!&STiYydMPt:14yR<(=#S$ }> $IjZyHTp<DCpHMM3Xq\Ph6LFW^~r߯KI03&ⱿtH1l6ֽW^~Q.%''k4jB[o3H%$Gc8$IQDθދe2|F 1 vd2@FӉ *j=Ot}V9!(ʈt% Aǫ#B p d?Z(8ALNQT?T`ƌŲ,A2,2RƏqI*oy$룂$N`@ Ll`0(IIiiP4 p8(W$ǩժ@4MӧWO;LQuYqd&WߓrDX qjamjjt8fݜVoҥ|~^nδiSbcb=k֮w=##᱿=Q\\mvR1mꔊ!hq[ ZZZ{W_q{͝c2~<ہ^WU8a#=E[XfiSOZYgǎ]#κP(4w 6|<̿Fc <6^jMyyvС5kvwm۶ϙ}kA~jC@\yw$ 5jDVfF߯~վ}1ѱ11|_d2c{Ujk-6.OpBX~øqc NkoUرZMbB|vV& 9)QVG>%..nmZmvvM[Z]3:ښwozX-4YO{yRص2=#}h\6e򤯾^z޸rr2\.ב#5y!JÏ~%}ைH":v9yС_~4 Ϟ=r?/-~`)4MG6fQ(pjOTEE0 uCORSSuG w=.~K|V\\X ÔJ%0 rK@ .sa8E3jii$V,mniHh4Pr{'Mr@Pw}GtnObbZ5fԨeV&$N9rG}wh4j~ww1SNYb>/1!j$%&ڵY7+ ?^aC32hCP׌_efetww;;#+V6(Jd1#G _j_-h4`PT%ໍ읝‚|%jzAٌ Nư0 Z-Vsr E\\,@1^ZZ>gb@Nר5#F +,, l2NRT*L&vJrBtvvYVՂcXnnE <Ryx97';枯0}'{fܸ1'MۮÇ垚Bc0chullysv$9}ڔDrRҍ7\d@ @\0d_yx|iu?HJVo w uW.%@ DQ@ ~х"@ |?Yq0۷o5vMqUq>6.4 IRl|Rl|R֯_Q!IG ~?fܵ70$GC @-ˆery.rvP0 D + ەV2G$ @ B~:]holE@ W0huJaN]6Aqe0Cx@юĈP(v{VLƴTR0Kmwk$IBOM0 q Ð[0TKEKT_8ttWZj!jj+}Æΰ^7~Yq!/ G}B˘.ejOE .V|)SƂ|$.e2EOwIx>aݬ y RXOc;w'捘099)( g۱|Ū3fx^z}JpaֻL&Cp C0$ Js1<9RͲ^/ PVRhB~O |xfu Ѣ(W\AQZ(yオ>;; .!D3xڴ[rr??H;:;~YXߋbvH4A4MGT$I!Kd4h)m.]姟&X;1'N˜'@qhDpHc'o՚r.J9(UͲ,%<-ÇCqb> A-QUH13b%+R"rJpL k;ʄ$:t~믟>lhEd<|jhŐ9Yuvv)yS;fohh40BaZO`_ p~ M&[[S8H HB줺M 88 g~ɃY3Uf;C#0x1:z>AӴh$k|\3O9]ؘćc&L]ԥ}cB6Go&6}ێP8A۹qԵ&)b & #7 /X9R/ioH÷~ /ՐceV}[ž371d$c0VDe/ nW`p\H$v{^D0Qch!Iq $X{߆ '\{MdN Um$lNKK;ÅJrP!hy]zF$I8wttjJӴ$I(<'_)@$IvttWX67 ۷R*?w}Fٲhkv548]۰~[bis&C Z ܼnmNQ \.3fƍ_|q=i+6[A beGM^ok4D=_ KpۯuntԤVqh p Fe/ *Hvu3 òP"JRh45kOp`$z} ̜yӚիbcm1Yb.]a(JwB[vm!/*[;( )Qѱރۂ ADfzhl߮PX?QX tNpuVU` +c$ˮq1;v$"b1)!Ep (z MrnҤ  (1ࡃU a8B! \~d2A_Q\`0(A. @ av:(lݲ%̜qNa򲯿Ysu ,TJ)Λ;+>.n 8r J5hA]TAڦy^c]II%%E$Ip,_ AHb BA@J#Ȯ`Wr~>5L?p`{{»vWvXS}ﷂ.,ѨxQZNQ48@CW0D{<.a 磡Ϳi~dʾ.Rs|eۺaV.Ru&A1UT}%8Ia(JPCQb8~~g f,CqVI&N))..(_W;v'l>}Ϊ}MMͭL~am8wn ?  pA 8l4b^JѰދt%bnĻO!N(?a]_~e9]'N.\xciQN ̿놛g`t:qhZ&?% bmww[qnB B#9] 02$ r~$9'0,McFJEAA%I Cmސ `#ܢUsN}U yyFT8& "N BdiE w;*r:roǗ_-}i8?SO<_!æɭѓy[V/=n//Ha@{{LJ- w1{'zf۶m--_~#3g8A:@rR  :l=̝7BQNMbԕ! $ImJmcT{ۀy-> B% `h  Ȇ9sXSb|z\l'" @L~tؒ)'n Rq>[kwdngJ&~gJ2˩~?-!~_x=: 8vcޝ.(Oֶ`ܺE 䳥ra8IٷdwuuVpjޒ%]8^pHA(X6ε-Wwd1d~az85[lW--O뙃;_}T; N9:WNC߹hB0U$("-I4:aP4(|^>]EZcnm;)RV,(, sB}]+Aȋ t:46 %IY67/_T_t9ťSMϧgfل18xbPgQyAP" Nu;C(r: % V wWVn޼uԉ{9P}(/7WSɧO>j9lxr1|np3J̸DA %z/=rPoaIBWR۱ y93,AkrnaUݲu[qQarRҽj4>Q(^qƌ7h`0q3 p82AM!Jۡ1 c*l3Hj>p IP`HH( WOEk?9 :|P^O:zv0ˆޞ%(<P7 FDQyx'ʱ,I >*A# ')0i8qd2zǎ%9<~DWkkSSS?hɮϾl|6qh4];}xRM:a]Έ+ BR`gHtM'\2|RD}?}DZnfmݹ4f4eIQ] srv QJ"In]'hg&RSSh*#&Zc1rFfS2䉓j^oM̲,H .&&lzIl' x$1#p| +^z^oQ]}#(5/_w%i'I픟Tg-5GQP?rpF}I6q;vڿ/tEZ O= q7#GL&??ǟ\{x20|ђ'k{J~}M'/ZBġnsyyYnn {qv] Æ}MH SP(2y3l! w>OTem1EdT^m]}iiq^^>@ xIKٶcGVV#T9zUfܘѣbŊU'T22ҳ2[{)//-*,wk.j"\fi)C+8^\sggefd֮,@\ˆ.$I/}vq[f&&&@VZsz_6nD3o6u A$^˯ BӦMu4M/~5On?~{.38'Ǝ !,))~ss1W^]P7>RjP(m-8!bQmDE0 cYG|on[$_/[b%x7P]}1mڔys_WtsfjBOR?<Bƛ8y2#=mw$Kq%|2[bcb$IznJ5k5]/#}&M$‚w}ooe{}8vh|򩧟{__} EQ37_նe!B4|&''+>> $bb6[ۮ]O<۶ܺm;`Æ6m#_mmݪk]]]{~W`w}vjZ_.>xr i*,.++{㵗GNݵ2.6vުo߿@BBkn3{֫O/\ a&$ID&V655=ӏav-;w=ٵvwUZR{o 0`Ga,[,_qc:txS&M|y ;cO,]|?4 $,CS&/'E|[[_?_O]7$i;y`(5rHQMQЩ.HL/**Z1`y$Iq@u[g\\T=mꔆڿz!C}EGonCVff򨨨Q#G464Kdkkoo1|XCfsN1|"m N=zʕNgB|\}-Z- 󣍌zĄ̌‚LFRno3/[4='Nߟ\f~ LvIZ&X-^o1m hnjj5'^?W)ժյm¢BEQJOOds?7}>mǩJ zqުS&eefdggN6ro3n,KIN3mvLƦٷw-3No0^juvu ^X|IpX08k8Vb9* 1\]I2]V@D^rXq]ZY*8t1/_rB2thEJ-i,Wu= #yM7ϼ#Gjj)(>uӦ͛luܢ(v'\k0苊 nۑcΡCj˲mtH.D<38nM{*uUH%IRZWط+ @xrr~7thE`ΆH%BdqC$ 8&iBeVlټ5F 6[q?ܹÏ&mXU(HR*>qRYRB{ bV ( aDI$I&=֬YsnQ?9@>譲KKK.DVT* DEQlok20 @(E9 +T䌜Qn9ø]Ēu6$&%j_GFݾcgRRkll$M6UvvvAx}X"cu:]dg_|u'Mxz} 'Jf: 3uʤ믟m$MzsOZ |$rގGooٲk[,I]}@oC䤤̌t 6rqϩK P)EӧMj5`04n߱+#=h4H7`H`qGjfggIH8eUWR^P($;fILLD֪`1lt*,,8tR<Ѓ=/VИ;nѣG$j1 ERb}5vhF.ߴy븱c"Rjwy}>vS zT^qk4:Ej [[m~iB 2Of9q䫯 ):m2`W|qq<7';#=BvssQqyA&CKnllkljddcƌdaC+V^dg$I8"7'e+vˇs>cM(SaAAG/(0XZRqdg}V(JKMt鯿`qOh^1bؘѣL|w}?=//7=-CU{$q C:Aq/Њ!Ǐ_~k!y~-3#755G |9sn=3jR4 q|Q QnjͲlx PR\jڗ^zUd?WR\λ$&ϿT^FZy=rF_E 8qvܕ,Yv$'zLfJ"K.3{N9rxJr2az>&&:3# aA(*>..B雜aÆ&'%8P(TjuzZaC2#rB|^3ztUhbbFT*JK/D/jlltZj:1&::55%VbIII(2b'$ěbcc Ѩ#ύ(VؘANӴZJe\\llLBT(qqÆ QT R4MIqle J`0ffd0 Gd1f`P4h23=%$+ Ri2Gi HHi:&&bhZF[ѣFae˶̌ A?zkx4T(1Myi4M[Ԕ\ijU~~ް(Ifs԰aC3HZ,4M ^?ADG[rFV7o6{$d b1=27''11A$%&z}6P0XgF---WZǟ)e4vn;nM׻axJu/3߿h!˲;o?wZ/(4ΛKyͺ'x^  .qۻR_\\RCi{ JRggf;6lݾ{ν111?VoGO |1qAbRr#mg5Tӷ<էBKK)@ A"DoV?R)w7~9ͭ *ڵk7CL*ufhzߣ#JΜ߻PPPеxwV\.ǭw/zMdÀj{Uk޼e3Ph&]??o?bo\gʋ17[$&&ؘ؇[WgXg.[MgclyGYo&l7LfM @uU].'[Ü.>/H =#8o0bmV u׹sŊ/W|pxdi~~DÇr9-o ^>ٳg_{Ϸ鿗Lwԩ%okZt|kW㹝~u+K,zå_mg-F?|;+/3=w 'z]57kС|0a֭[n4 6+c(zXxy{Z N˔d6d2%A|aoAmmm:EQ Pjn|FLIiGV:X.CdXtj)b1AEmmd`rRPP Aw쌌xw.;w~Se޽+VxS{1"Qu{xxإKbIZj/A[;vtEyQ#Pxf(a_(s:E Do x<5e$EED'H[XpAWh4! ÔBCCzҪƦf C``Q#ihh*ሊxFD755;b 6Mn/++Ԁp||\BBr[rT7$s\N`0 ׁV--=*ՈEB-fuuuq aE'jwP[]SKx||8`r Wׅ=Yrd2K$|aZEE'uzf28'ӧBA䠠[<ҳ[[Zy|njjJxXXMm puṚoHv)pzŊt{so3lO.ęҳqw/(tzp}p|$IҒ lj̬F5;;^fϞkNQԧ}yplo>X{~БFoȲCGb+)9k :::c_v޶m@Puo>BSti=YEl}JJJq(,,2 źis:-++RC#I?^8wkQUZzv! 0meoܴK ?\Xxlj e{sv'֬WV}#MV57@i9'/4Lɜ۶?LEEB kjjO*>uq$=Vp-kmp\c`'Ojn;}v@tuMmv^ш 0/eddvvtwメ[disKGę3%s_kq.+;g~XSWWvY{ jqcNjKx<3g[Z3Hܿ?p}l6>x¹7wq/={j$yKzW麺K9{u:]C=Oaщ}o=V7wtt4޾7wCCci¢$Iz MMյvgtz˵wᄈg Vm/#MS3rl6I޶sVѣqw}%V8|nG.\(6W-Wz\) PTT2cƌ-[TTTlذ!55ܿ`X,t,Yҥ/f$I/(|xCq;}·/4(}󖭵5u~~cF hvN.MK/T|+(,:k?k۶m~~~?ɓ|ƥ&NHJظq㖖6R Ѩ,,<Ν>m-6Y{ |ߴfd2pY|>l76,445ο|`^pK"***WK\`FsTqmcǎΙ=CV755?KO?cF..YRcbϛ#ɺt=$>.eƍPȫk&Op8_ ]]ʋ/("""/c>|Пm3z@ u< ᰰP?Nؓ9ik]3>~/(:zԈH@٩U:~+W}ߝRlYx} 2Vt97u@BlV} h1C LOvbU`@@0shE'No=j!Gܼ%DDgd|ZUXtb=cF-EպQ#G:;=@HK" 2r~QQBK+MM͋ZUU>?-*55%2"B,͖\0y҄5?8aH Mh|̞q?xpjju1GEFO?lw'xYKeҥ JK~yCcSﭤ`'hcvhi|;;gJڸqcfffssի`f?6:Z$\.סCG*+*Q($)0qršR8NpP@X-&{GFQ&jֹ\_|1**_~e/yII8NDx8qB(FG?tH{{f#<Ą[,M͏?0aJ":]erBB<p8XcC~ץӑ$0v\EbC人tve>|a閮???l6moyEEd28vCQڟ~I.d]߰iι8aXB|X_ً%22B";GyWd4*(,X8j"fEG0,6&Z.`qzw,^jsBrnuG5yM]ε'9cua4 &3_jin Oaa!~ <t1?Y Hڹsa ܮ2p`kkgxEE9Nӿ_aAA^ CoV9m'X-}JJJQ!)c%J?Ʀf'ó<Ξ=70%&0 ׯәYGlLL jyowtz<ֶgy(mWW|\Q/i90][F&N;O??. *ldt]G|X/CPH!(:tȠ_!H(Qj]\.l||  HN'ERű۾rۍ |N{bq^^￿e˖W^y%%%vѤѨv;A(vW3%gϞkjn4(}CE"d !baQUU\,]7QZm bx<¶xfޜ7 CNNkʤ4M) Eg͘>u;~qW fefoq8=GPt7lzgy A̬lW^ihl^&a8ŪT*,+A^V?|itt4on<O<11 E[.-Κ9駟%%&@rEӧOqy]>ÄS^^_7EQA6Bi!_=|P8q, (6{/\8D^i ̞u'{A`P3Ozg\h8XmشEʫo@5T>v}J@hV=lC8y/^G("IAhz~]]T!(týRs=n>jOTTZmWSsvH$[~SYy/;wyMӦM^겲\sٙ_QQ?{ݼy?hn8if6׭P^^sW+W~xA{[{lḼ&Oaæ¢}`M3ե.P*۶(ؼekoIFbtj-}|UV^p8oBH${2;;:[Z[6of0n߬tj1 zVMQoKyEŦ[ZWrٮ7_xKNNa&F~,M֍z(D%}kyEŶmۛ[ Id2۟WWyT(KJuz=`ᕕUϗL3gJ322o1]:ݏk665lvA bc6nRYYyJ+7Q"2TTdRo¢ee_rYW֯8E_x0)]ŧ[ޮR\|fwFf{{MFRmtNtْаPTr.RC?z(EEN.^2xؾcgw7nܘҊFtqqNNn/I \op8R^bwFŪ*o9sfoޑ'~@C.P Ѩ;;-/!nQޯ:0)qJ$sf߯ߵOXUooR x1a@°aC8Q#?lEeede,?hy<^vz )+/U"PTˮUsWɉGJ800`Y{2kD2c^g^cעW_yq볲D=W\~/ݿ٧a윽ήgϞѣ.(ؓEA#G govQ"ܿ`ޮ? hk__eF\l=ٹjꕗ_$&8as)AAA5Um2{tfnh?('OBaa^w /?"2z[Bվz]矲8TߟM(}=1YrZ[=zltt^4_ŪѸ]>>>ךX̦TQ/Br~xށ}$ze7]qPW[u … '{P?n#00&}뎥-ݸb07Z6xT l2;[Sϣ4 FT-0:f͜g]:cTwWlJ$eKR"̽ZN:|j0<(-O4.?iаCn$bɒ%5}pحc"[3cumE!C+MPxi+`,?a5ݷ.]Q}V7<>)!ש.4%Ie FӴdў BѠKFr]Ng0He,[Fy$߯_XX蟞i<W,-/&6;>*QJiEÆ mjl0 knxY*qWu9>jNQ=!l&p8;?MMSvEg =?J _Ѯ IDAT0ۭ`3^]*S" c{ٳcvul* ==brya_pW|aZL5AI$숁\r9h۷\nî M@^IєbRr Jp<厥Nۮ8R =OY4Cב_ii:ĿJڻwomuM!22rÏ^O0 ,f#_ 2cQQT*b󑅅/l{ jARyy <3$ ,,,,18\aS JӴbp.4md CXV65;'G,3wa۬JCh^EuIQ8 0Oa I(ɠ heaaaa4"*=G\.E+Ο+U%(v]].lcs΄NmJR N>{#FZ-ޅAաR[\} i35_E'w㵷<-,,,w ^ag~tO%<19 A0JQ/;xd}EQ^)|.mnvŠb ˝EQʹk;ZmgϜ=J E"dΛ jkrPyԩ) v ޿ere_8a.ʋqIə' qVҳ6YXXX:m-`}TjK.5r7R[W+ZZZoVhvR$ik5[o|6sYXXXF~700fATBcax Rd󗅅BӏFm{^u2bӧѨ\faaa[{W'N`=A : zH|T͝2 ]İaCn&XOa H*SMDcCksi)$yydjT> ˝M3lڛ<ןޖ-F:;ڛBNvz+++Z '3+[YXX@\n7/R7()>uPMf˄z-iqhzGrقrW#BB$?͛?a|}zQF$'B! 2$)/ !ZE*,w%>*?HC7 n֦E H((F?iH0L}{ _zmtƟiSLK0L[K#IzH#C̕E!`*(^A0  ((MSe5A0P00a~-&Gv  eĀP(F1ϖ'p9\wkIdw8z%88:n0GPC)pq AEQ4M~"=0 {<LInp8EQV٠ >ᎢKp8:mzN&Yq]$ Hz]'n( BFS*Sx{TAP$1fA8BbK$8$EQntHeJ3@AGӔɨ Ox.=M(`Hdańq8_r9: u!jYb`Dkr `$IN+0p\ID"5 E9\l(h E&)t.C&W =)/0 8.He(>faDbrx-B2!v9ʔ0d T[AD"+}`%60P(ry2b6(*HEFEQ_ÈR (*Q0 EbH8Iz*pNaT \ `x<>_ Kd./'MLaD"UX-&>_2krXa`aa+c].'MS%Rhn/IzlV$ɔZ-&(Ebp&BT{n @b"p7Izx|>/tmNahdrwmV"nk}"p!B1˳,Ni$Rrح4M\NƟH!K$2 XfIS"r86q%=Bz<ɕZ-&pBaw:l CBTn[H.`He _Ӆa W `C8$Aۃ î^Ջq,FPan !=u(40 #$wx (a@Mr8surP~u? E1!p^Lw0,u?x9Ipzwf.9Yvy<[ 9g̟7_(ǹ\A`w^71jz}\rg)ap.$`Lq[?v;ERO̻Ͽ+{ugC)q8y:`ɢLFT*p Ø->׭C8.(zOn8aY}T"ŝl\9Lvb]NF}g6k~Z7zؘhQfY,7\.OJxSPVV0r JeKk+Ax4_G{)juuC,'$IRoVYYe}5j8d`r.^tB0&6Z!ߌcǎ]6uŪjq  %%9{cMJϮx~y#%e`UU˕rXAg'rEE'x<.SoaÆff455[V###̞YXtv䆆Hٛ+XfÆ42w,__ǟ|p8\3SSLX4dpZAAQ\lw0̹xV/>;w~wFր__ᬨ4MR8::Z.۫k PUQUV@^J3fy1?ߦf â"!*,:" եu8j*!!0dXEar.VUt:@_P@^]SKFDFnwe~" ŹsJŁАfА`E):{^I U]-bDT.\04,7qy\$Od2ͪj'M/HN<]xǧM,I$e{j6ur@~~ d2:t]*]vLƖ'H٩mll^AN$e]]]3gN'豂RQ[[PLt4'O>SzV&YVmWפkgٲ}5ûwg~7ӦN6%y<0~ܸӷ%$'H0 4jSUUV}ddڷY3 J+={vϞ]̞=cʯ;|C }||K?WHnݺ=6&z۶R\\2c}E P4}/E'AGojj߿b644^(+7$I\ 4sŦAkƍm0<ܥI%ʋU }&sUuysn( mxH,(,:{R,;;&E6oy"Y,V$zõÏ?$'˕rvqڔ~~7m U}T>!!N/ ϸqC,#GZIkk[pP AN)Nv "p|>O({,VT"(j9{6ET|7fp9Vb̙CBϔݷ/߷LMw0&/½ ٛor:~0PG(l6O8$ÇN>-q@B[[m;bqvN3R&-o(''wq ̬ eSLr_ho5kFP``iyo>11ѓ&i&cOVEeY3[[[yyI""¹\nSS˪VO:l6_P6oȈU'N8]ǏOou{j y4})/ I|9rD&))Q@D0xpOI%}hy|>?>>b'%ؾcV%}xxI؊K͝?=)B >_TdZp3x1 0 #G͟;'>!>cOVbXtB4))nsؘ[.YWSRbR¨Q#:}VvNeE??_@\l0 +.>ե=kSřÆioo4s}am<r>zl}S*}E"ᅲ'49if/7fQ$ыB1tնmm!!{:%--Smmk;TlTf͚xϝP/^t?@'Ng;)rϜ98料3ZZ[&'q\rmllzGZҨUQlvEޤD.wє8|z}P` !!!vrVۗ_}k0(e aXLt&!KJ(y7EF'AzL7mX$̝3+6&;: !B C(8xn/vPZjBB Avpn׀CQ"WW7:dy[JťZAQ4gonuu-A&yPZ7Z,V"HJJ=YF"Ꚛ^s@`117mq. ALtA4j5 y#dMm/c3fL&#\7$$q8H$.`޼هw`@BIAҸFP+݅$ojx@ERV}p""1 83gJ2gLΙu}$L80w'NΘ>x@B< y^SSr8{/Lj00 ]=pe7o72(SSS(o3OmV|p^vJCCzk ʛAN(:fȕ!m+ C6#Ǐio0!An7aN(o]Iέb0r|> #G dB0dҾx{2gΘ@D,D /(kMME N>~3( ;:~!o tbՔɓ@BqN?NO2 E͛}l98i0{N @|m7WCQ+xO& (r99B" y5 P@ppK/\r\p0pn7 M2b0N@s'{l6Dlo7="(0A(j۽UEp=sUhM:ya]]Ο/;vbc,ˑ-_u@AJv.! \ /*:ZPP>rTiszSsۯQ#Glڲ>**3|):rhKkkzvyD$Ec +@"5ܖ֬K\Xt@RԡGFuEmaX"++7E't,]#<\ |J$/t=xFaO|Ň .]e>ya_p?C >|:bq0,9bx}ݥc $Ihhfs8L"vu왙Y~%aGyj$$ĭJ_|~B֞x$Ϯ1?Rikkۏk~)S&Me IDATҳxݶeK֞^}W_:䪕_|=vd' BT,͝=s_>АϗIN+$WÈ=a8X``5?ޖmY`PysVĐRڰ1]$wz<$&&Ͼ - ʉ]p>o)32+6t0<oΜYb#$R A߭!C{]RRmߡ7fϚ ދJ|,?oOk?@[,,=AAA5UmvR}kn;N!jjkm܊};u{he C.\=߀a;oٞ_܍`fmdd{,[G.sf0--~Zmמ섄#uWm۶ܞ޶+˞_w?W]lkm-ŧ^~֖@MmT"2 MI0\(+rEUr_z Rr: 2 Ζ<2xq Ú[Ewa?44 rlܸ1j˰ܤ0:|D  'krPW_oX5o'ܙ8Cx]ڽ{aE.\?hJ###Z[&' |w <o^;,vCMRU]9p _(yLث0[p\bU-*+,,ڛؓRNވΗ=igwbY3:;GPUy*6&zfpу_|>ܲ;#3<<%dfy/`O.~GjӄVģ,7_/,<7欬 GnڜĩS{՗++~XVQ?# vg}% {`"XuH$  Qaw7W<F`C<˽VǻhL;v=gI"w=0 "PDNkӦ-{2! zK ]NˮP-H%q1-ޱ+0?;;wɗ^~ޡGDDx,Bxoj?i7r܌khŏAOq[. 66i/54 ,6RH0vhOѣ ]$(((@(Er =C}}Q))ɺ>=I͛7[*2O1-JrIڞ."*V- =LhHX 7oG~SOUkSO>vĩֶk=y0"tan g_M֮|x'***VUR_~f;|~( 5'O>påVTVt:knn@3qD7yD/t8==`8NE_yEZ^^t8Fd;waibD53J[Zz$>~Hm]VۇacdϚ9]D#iIq:UU՗kPUTcD2{,s©!!X-VgX+.^7L%S+/JSCT*5Њe2ؘ[q@Pw…rJG>ft'[3,{wqcǴ+ò\MpBQI&IQԺu4Z-IA48pcnd^^tҾbhn7)K`7p(Jӝ8yމ*K(7.hEQ$IGfs8IR(qM6hZhimߝ1ZL&2jLO'@sO q=ݝ8ð;1( innMM60g$Iroֶ6C#G;).60ix&")-LqdܜaǏMZVx2=-sr9FQ YYC.tch~՗ZZZT}6e6L$&?phJO ۽h|뭷$ly뭷 3%88($$x=\Dشe]%"سhɢu7:sY,Vz/Ң7mT (k„qw~h#/X,*,RZzpQ(Qvz{Gܵlj ƉD"ع{\r F^nΦ[9bس4sho oY\p$|/ a2SS$ IŒ`͛kO(h+鮥[.H**P@dQ8v!qjuˡ`Vp566BVR @//)-fEђ=3'MPwthz5$Id^<WY*Qm2T*vJk6*jMOKp8n[ѡPCQҥiiW_VL.^}vժTl6P$  ymv; |óO?j$R,H:::;;$RI\lRr$[ZZ  dTW_BOk4Z ]Hg>=Tz^7̖a3vyuaa?luqeȐ8@HȏQ9aE&IUSL./0XHpp X,jAX1͎|UГBefER8x[.oӻ QaW3E3x]/]ip[\6Yp( PͶpRײeKJ`,&>~t 2 Î8̟C+]B6W> fv`0|]\.C8\&6߸RK"HJo@.j fqmԅ%x\$Mb eK|/l5Yltd'(j0 UQ$"&5Y:^֖S8X;!oǛ>}- MKxKcVF`4=qĂi|( v8]aަ9&;1:TEݎstHrLxJ\TLdoeV"OCQHGoߞH Fg*>r` ܂EMfmnڲ#**^ui s'L~^ӗ?J?Pj0 (.9lXV@@M\k7<}^}m6ۊVVU> ۅ g LJMj'a^ݵTU^8yfg`s7=5rLxn;]a1Mʮ&eBTHRtةzkǝ:_.D׷vՍQgC}]^sW& OsbL3undyi=a@WW`tz ˙5k\~(=r,**r0apw|N>c;ƏkWjIIIh4 ~æTz_؍lܴ ïA:F_D9,`s80sT|NRE6K"MUעN XtDE)~Z4gzdٸ_x>><6!Wj_o OE761}}W4Lf6b`f=9Ι"IjAQv< ѡ~.qݑ~u-Wmg)Bse  !H@ "A(%{(,,LJJp=t#}}^+s7^+A_hrڧ6-Z$̢EQ(Z$@8Fds/r}5*0 pC{Ys):mi\?}" A"@Q48(ȓ;L<KOM>>ޞ…3<]Xa˗ 6HJl/;w_& M2sU7{{{ X3 b@3J4)Ib1C mE&ń/j.-R )W&3U,s8, .< aaCͻ%ptf 7mYC,-y,}ZU8p `q/HO=󼟯oCÕ^&))ѕ;w~=rܒ]ݏ>TvvfEyO=fs.0P`ylno/Ycۍ ˥7ll2zˋg2nb74q=vnj.R$d4m߶rMw߯njj{d劌to¢qǔCQt3gL[xc̸&Nˋ7L8;z5p]pٳfLf#֮۰x/<{iyWl_~3yW^zQ۸iG,{cΞ=믆O+Tw?|ѿ7mU;>Cj=,^p\^xNٶ}B`8666ò6oZ7uڬC H{+WnQW_ __D~~a ?0C: hR(&Hҭi)D4<"rĉ<>ٳNkY\.ѣJUG\lJ!H'Mf/W_EmϚ9S"ER39ܸiKVPooٝ^Ӭ3dcq\uk^A]kg+[$XYZX\\zC"OKCj@dyds|vKsvlNIJ+-da)58BDde$I\6:|ӌ7zfSԴD ݁(Ւ` V#׬s:,^ˈoDEFH7A8H۫a0-M;cpmdzYAPB愆fծ7taYrdV+d!H<2ę'srrR>'cFڸqwzZ*I \7!>>55$D¦fڥMaXV &1ЉGțV8E~N jW*v.HLXsBaЌܜan oLfW_y)%%~GJ̜1w] 64Ԧe}7rŸhaXOߏuu2Y"EE%(@Lf9$.WstX"8)f1lrAeYτWgJʶ Ned~گdѸ5kף8e$ӷm/b I{߱s7=ߟ.=rqty7_f}`2|$/Lc/;n?ph,;6&:o9(HNJ|Gݷ^8uʪk @~6ۺeKUԴW;u5--2n`*U55`岘Xvx6*O:CL.KLLn [/^pIT:.Q$*0l7tYx* xt>̺2@ gN}_z;].'jҳ>5(8Tt:vE7ô>D(d2 0:$@ 8NWWmnwL&AVrkZ6áh].˥]wtvue2p=c6u:=IRjF rJgX`0^ݟAYpLr.+ =onNڬ(zIR I]]͝]s FX+bhI |$%bX,jiiImȝsӝvv)KM˖ɽV{A,6bR$n2G"Syup9mmm+ٵ}7̙=kaC // n̙Jelv4o[+-V+r Z'00bsINק+;{~tL&m @0 Jww"({ƍ6ݻԱߛ9P]]=2L͓O>:`vʔI, q~9sR/k^l6keեg{!ىɓ''&ĩnZ}=FcRSRE],/ojjaI E%{466%Ʃ;:-KPP`n0~$++/5\pbc/\,oimݳg_eehZzmJrrDdxU.FQTWWWեj?2h:zDgW?=Fcg6ĉSrcbb 1(cp];~r ϥǑ.Wl߾b={+?zbAQTOOOuϞ}Ǐp-[[,VxGSS3mI@Rh7TiN6^i@OOoɞ}uu ciʀl z E(;֛Z%#a>2oܸy1G46n|&220,;k,ĉS:~AAee֬0nܘ-)ٛ2mZbټu[s˖.  V8%99IRWTT=p2@i;qxooywwd2ϝ;;8(j FV]O@ ׻􁃇[[ۖ-]-7\iͷS$٧R:<==m2y<^HH0;J^x!aYa!0a|ɞ7HC:n=g2 MF@~0$IQmpCJRԱc'N>ҋϋY/:n"+4E:FÊ|h4Qax%>!~HdD>y̧/>cs8ӦO?w6k 6s (ʘ;g-oyv9u$4< s;q|#G׭߸h<ɤVw6 h6vuw CK+*+fWSS駟O$ &2*Z&G;vMO'>S @,@ ?6к*@0@  @0@  @~Kajz:: zo> dhVۙÆ[dނ%gh-X'ݳw_}}h4:TJê57d4 l[n/ޱfb@ _RlVkMm /_^tz&--t_Tp8( tuwe;mm rR<|c EQ,m5ua39JjzXf+V66F$W Ο0a|k2>omiX,_|́Y,% ǏfԘ #GƫlXlݮT,^ 7~d/_8IX,ϼA__߹sf .{{_xĄx~Umm}LL3< =@d7=pE2שKbBP;pohlj6MWlݮR{gϞa2VYw_67`n p8ϟ~C[__C+ReV^T{tet`Y/>{/ϗWT>Sh4u_~aw74 n c㦭iiW}_nX] ;!1"/svw̨JuZ.8xp Y,VR9nwtttΜ1].NA{{{/]H.gefr\`0@L&10f̙R9t47/Ǎa<d2def=J*L:Y j=݁AjZPT]qV˥$3w٫R\nHhH}Õ@oooQ\z;sEQ8qtDP+L&A@QL5{1PFvv&dz;vӯ:HĞl6Xf$ y &qA ȟQ^aòkjU*UhhhC=b$}Ȉ6&'IRép8))Iٙcƌ <.,UV^JMM\ʒ+ŴZ7:r'M:#S&b*5ź|E#F͘^?r 1@ ?0Fnصٓޞse'R2#ɛL8'"T(1WDDhۊkpѣF\Dۊw9B`o999+55yxQ \ni11c}4\iDrF SedٷwEEB}A ȟKbɌӝNk84%u(r7=+&&7_`fL0L&,\0OAoDx8矑H$gasZ[ۙ }<]Z8((+ڕ>o`0EJ<.wx^/HDR <r>+--522sw~  F懄t:d2W\+  @( EbJoD p.$AzX#Gп<DEEFEELmlvŚ9tÇLJJ(Q EԀ"?d6OLedeIH$JMIH$JOK@a@ Yo"oZAP}oG^ K@^aտK@~GLA"֖F]fjVfŽ 0$!fry|A{T@8(1q ,64yy C`PWۭ!0iLF=̄WO@ DdL݁ ǕU~]f8V8NtjRaxgAs.Uoa-9\. :3 [{ 4e#G>GnK~Yg[.}g0O ??m۩g!՗].cǥIZZ*]ryll jFSVʀ?ȮnZxP``DD8 E(UW}}YC t\b(!!tutt=v<1!ǧlN0L&skkfJ% .kj%bVe0QQh?#};:{pQ(,]Ym.b xKkNqyQQRAbXvxxzv{Ia"яNH 6E+vWU]d eDD(t:LfTjEQ:]r8!fڤR"Zrmv{MMD,j===bfgdLv*b8N i&ɴs>nl3g ^xyڴvd6,-Z,JΜ9g>PdZ[G__--m,S&z,/W9l1~Q]/ ].H$_q\oooBqP(Ə3sʪz5c:EQJRo;Δd'۷nع[R1LþliQRRBs7mIKKqz!;+s@UaP* z`iiÆe _fzjSRQ--ZrP hsrl(2̌y,kI>Rt ;v+*ʇWn^|E@SRlvEe7|ןϟ?;;*.͛;+>~Sgw1 Tj;7{֌`2FȋV9_?%ǎ'M?|xn[[uRbX,4qT*Zzm[pGV>;`0[ABCg͜! 46}WƎpy))]]:N l+9sFa^nN}5.uh˗ksLH?ul׮ܜ>v̨dګDxxآy<^eեںYfp|՚`PDQo#""gΘjj^v޳fwt֌au oEA))]* =])X,fHl6{\ 5Į3e]]L&nwtvu "<, EQ͡=uvvEG+ C@oo_PP3v~-ͭ'&jp|/h>>) C8A\g0<,[l6lO @9]8qf!qknucX}}:}SC&NF>_,}:ðK0Ќt&q$U*U^nKHzqF-dXY6 Ǔ9N^Ͽ.>ooyrrЈyS<^lNfVUUGm޲fL[*h>>L&sWã"(E FEQ'"*x8'0ܽ€hXxdoO'#t  7d2CG*ѭN{W/¾dbF$p8t8$ &;/V9{6kP\a EQAn8N5mi 뒿o߁ή"XR]BXg왢khȑ#3YzmtviC34SN<5gEgyy9#Hjhh"B(B`Xav0&A$NgDQgwL&EQV?u1$.v\.hq.٫.Z>2X3L8d2vGt1(E$\.'ͅpW "IIP 47P$8x411F?~2~Hu""8\[[1 ۅ%&&xkQIs-qYM@=:2M[bc+gwo/NMMu\6o7uqyAٻO$߲Sto~rzuIK틍 ,ٳ2 IDATh226mٺh'NͿ>BDxxeե/عlb.=2 1 V(Ɍ&tq֡C3~̓Pj6ltMTfrqMS.[u:.6˯>IpOBMƯ`3EN"b[[ i@Vɓ&lܼejw =-7ω/2vC3xEKEEFғy9ٙaѲ,6 ''KV< Zp3;~s尰йgwp¢6#+Wp8&%z%׃ӧi4>܋ ^^R@ tz\Xm,_Eypμee""億~~0 CXTʋ'uv/Ul//٭OIxCdŲO>fm!S%qm ʋ=4LnyEVeXO), @ߞhEaJrQ Fr@ ߌRd,=@a@ =* c7BQ-8vn7EQD6ptWm0vck3a.릇={=|;yꌴ>,ѻ7zӃ?a*A}f5\r֜O<ܩgnq'm6[sKP &3<,TUQYi1[ j( a2J%fr:*h2xPP bQ*U6ad^H?sGV>ʇfYn ^@??+W].ٳI ; q\ Zp8bM!CDBRjuL&#((AݮT FKx7sV 9ޮ|ŗnje2,kB%=Vk)Mw˗ktn?ke|}[VDNNIZa#1@  T6wHh 6;ztARbB[wߛ=kKy^ŝp(LNJxX^߿qcss54\YaЌt?>mm?Zuka`X8t{cZpx侾C&&&k0Ʀ/߸i{=xpFF@  u`!.G1,04'm0h̍ _=qq1GعptzT??_ANs1 +=z ǰN6iðʪ3FEqpX1 \~WWGZz6aԏub5bxj N]B~$>_f2ng9E=|1]%z!##755WVVl6 ci{Sn_~541!Xn'pz*Ic"Vۅwvl!ХǏHIIyya8~yliG,ָq FEF;oo ĉ8>p`4͜9=44E됐Z8^ErUsW<xWEJm0w캱U)ɽ=3=bc|~kk۲ъ'Okpq+,O'"ЅDŗ_'%%x"Ù* 7nBl ӄ .WpK| }|O    (8N[V(@$ WSl6 I!BQ?GAd2y^K/?9G-mW]m|>ɤ(rG]Nbd2,&]WD*Hta6a8P$Ep.څ81 I PԵBn7A#B'@"X,h35h`5eT1Acuuu$I\.KO6  at6Wne2Yw@.s8$,RRR$ BAEX Z0N'r(f6VVM+a$I Gd2 |>?XL/HQAt|({;*mv{{K/Kga *@\q8#*3 :CYEO6ECHfN{/u~<}OTw5>ɽUoխz=04M^7x>w]0 pX,/_ND{P@$@ !LBT,a;۶ c|׮],˂J\DH$ZZZ04 M(&XWW! B1h8붵 R"΋H&0,T*a !NkfvGG~x~p&% B^)8Tdҙݻw~2m޽xNy={` aa"znv>]}}G>C===4uj__뺶mAjT"q=J%M0u]պyfdT*Ym6]`, BS47{0T8 l)a<X:0Ȍ E{Pry^) |ؒ|8 B&|f```B!e4M^YYIDh̃2GJ&,¹sF"{{{A19Zuꩧb>8kiif $U0ڶiʕz+H$VZEJZuu5"0Lć.> h0 X0PQؑssM*TQQDX\Xx׊`PIeʵeYйu]>C(JE]apXVÒpr(`q _YY q$hg.J~2Tdf>vcAcZ08%OJ<aber9v4k ֏ Fٌf ?-Ú4*Sms^9PIPo^Hu'L ommŁW+Ja!xś8SIht Tvq744L8"L*L UOOOVEJ#h7Q~ d2lVu `X H8>4B*ˁϵ t:[v zTGxk,+hՕm۶zjX(׌ъ"4^%pdN@e$TQ:/Z$tYRI58)/<b`J 0ꈙIDP,X {{{Djjj` edē>-'Zs>ص~`ÿ dj @#~EFH$bgd2iZcc#VXQ\u Wx AG+.3 M6=3DtVWW H|ݻbG0̯7`| I=CG +>LT v8hҤIP}\3J%gYN=h4vڧ~.™3gR9ñX,B$IL"N`'=+]! ,*I qb1ϛ7:;;Qqʹ5'O F=8ڤJ~A#x"ȬY\?,hH$@6E~ bjR ǭE2`D5A@D4đd2PaX k -&HڽPəBӧ/Bq01zzz` Nx* 1R]]M ƾ` mUBn@"sQ\N-/q,=@89w\ = Cqj"B1}$6ii9aDa1 G0c:f "  zNcLJĉ؇=Y24\ޮ.ܟn!}+2W`Š7ӓ;E|)i x-˂CfMT#jby8k`XJ%z|9Ɲ=˂1-~g۟rm .H$dc u &?Td꠪ :;;҆eYkFD3g7IDͻv* (Z6xtUTT:4f$bcbRUU wΜ9!: /Rk x(G&<6l؀6`BVvK,5X,b3f`(ӟ`>~k_df"cA|?<p} 0(YfavJR@0n,xn"d2@c"z d={eee0uT 2F %S4M <$0aUYYNT^ð Kh@jB%l^B;"N5 Ju|R[TJ8X"ts&S4NG򔫬{Oxpט͙`TR z" z{vdwP7qgD"-6ѨoB?H:(cA,xp"$4qGI4qansm%!uDpH-R8\k4Ly4,qZ0oN fq%%0 j U`xw42e }ڮ677 bXP@|f$d1Ѐff@?TrpH}my 9gUsfg&4p8 ]\.w*۶`gqL0~Rf4jQRϣ6Od* EP"!JPtcq\Puu5kp8HPK f(&*r6bG"^< `JR:,`qf~չ' `fI`@\[)˩8P%SLxY!o)#4pC/+>QOQsX8Q9~si&I55Oy-~I0 WL& \Jȴ k=گݶ ^e-P*7 7fy|csn0rɡvR[[{ Y.N5a{yƏFu ;r?Ǎ0m45w4o/0f *J"3gVU*lVHD"3`5 XBϋ2Ra 1! IDATǁ_D"-ϓ0k,D.]JSqpHXO-fXHZq0ӧׇT}yqC,x.赀yܻTЀɋ/{ss3۷oh4B/x$sPm0;wRV`C@ 7 Bӹ˖<=g] o0km]v@gg X,U͛7 uwwCĦRB|>a0Ͱ/LJuBfg2n6s;ayb1zp?bZ)wUUU˲*lmmŴIR•QI՘0P0[J4 N eqy2DmC0$I.V~T%dBg_E<GrŇ zeee(D*`E|XPq5! z Y0TnāhAJ$Kh.FDJ-p8q(W]7۶mPp*-RNȗdu5MuÔ#g5Zj/ Jhmu-rZ؈^n۶ l|CpI&\]&AijI&$ap Bww?e__`wuu5N œe9^}}H@0h ( &`޽;Ns9n &b;C8>IkqGͶm[0OW"*x[[N~l"K\]`0oA6-JiFm#Y a [C`U8ܐ Qft]2pKxà `6<&  2P84@@ː76 \MICkaM4W(QJu=eyfPŜrs>ܨ3gh2.qֆq cEV*Pt))QIj$I]q#MDX fmg꯻4X,a9ᱽ=JAp8sh1 )b"n j1{lhI$~NwjO777CYwHn@ ƋŐNADQX+_*gr).q%1,yjkhL0l6VJ M` D" %}O&?k*"(o:|ѮbxZrp&A}FAu L|7$RQO$h6DpKZ̀000h^4SBK Y61.r>Jăa Ŋ h/G0|vuu-yr9."ËT᪜ 0Z$Lqi^bc}`j 0%I,jY:չ\aX,vtt@D9۶9!rz _1{~?Y$"SþP(ĞBǗlFHPI@ ?Ν;DtUWY;|_%.lѢEB5knnF4(tJۡ*'9iҤ&hd2Ǖ6&B TUB_E&MRhPzzz$)8VpHyN9唉' s9.]zUW&+ ÀFq6Ҁ3KBeY6bY ;q]vuub`Ӄc`Av-&-[kMM lhŀ|xɑ`6 mbp!dRZm~ 5QN]P RTF1jMvm0:8S(IqejHMs>B<ݓԼ4SK3w2ގqL R.Pl@h4 mujOcPkpA CgXe8H& )b5DEf)86qfQ;5y,YYG^ lT;i@v7c5p>q{ 4 T@1aM3 Aee% (vc1e R;YC8F=h&Lf$!FOA/wqj"zs'%<ǚH$%LxGqP(At 7D~MM Z™9F,F`WWWcL:5 y0R$aC@ 7 Rʍ PY'%nZ\,ٹbbH`48(r:fK% _Z'b* {R  \.}M6mDDT .LBlYwvP=ْ80w´  y0cf>KNmF\B< Ƌ`0Mӯ!4M2B«0!x!8̃xueYLm/ 6~IXYE_QA7Ph5ʌ{!k2GcDk%!IE4^ܜ5sF(y Ҍ,0󄩧@ |IQ` _@$@ {Nd%Tn``RNFNRjsihllD?%K 'B4-[i H)͔ᳬ͞=j#ǭQR4;vin:(줖= L2eʼn+2r]8&;BF00bqV8S%Ta?߁òD"W}6d'Mi:P(p?"۸q# L^BئSBU3<VCԄޓI.–8?2ƿ34ZaR\Õ7p$#Ecbł' O;F+O;5L[yx GWsOY!TNKC*a ɵD4c ^I)F0 hp~ZQv2eo߾=N|>Q*.f ֺe@g/-r5;P u  }q^'OF+>  #q|E,~a ܹx9;GA,fP!/  0q0hyTQ%$F03;!z* p2**`„ yF"hx ;w.zk֬ۉ***C"@|>EQhɗohGj3f@j*p_a( 6nx˟n!nmXgaAEEGr?<l K.%o4wyĉ31 0l2644[MM '4@/!%ڍ4'OFL&[[[ƂH|2 ƽ,@ bXv.<TGa"Ƥƛ3iCs[JۻuV"袋N:$0Θdn`nv[[,xL&3mڴOPl;lЬro0w˖^LK :9[+$5%ر͛w7ܳgϹ\NP(˵ ֮]`oLd28#f8RU9+K algΝ;Z\3շPb'!Mc~,XzP@+P.^7?Ncey뭷 RPʵX0AW>-x[/|Tho8󉨻24Ma ,yfu(K ]cgϞ=o(&48WR|S=d$-Q"B% `Y Wg(766 kz``$L{{;f̘9)ypBn߾պ8 |t9 K 35 ptSooooo={VZEDv4MFhKD"P<Ν!\]\ϣAssV- CGxRPXf S4Dph4cQXHPaW+:%J4MkhhӻUgC$uO'%G4, QKKK:v])s@0'3{h`@ p<*ztn!9s9iP?kLF5/N3?L ,N_A\{BAK@oDY^_N_PyW P̭a455M8qĉ0$HVFD}׮]1`0hY뺰W۝Va`U١sF⮺d2Ȧēd2jT4 I^QBu=e(+q|!?]&Ⱥ> 2m4;[-킱~۠gX['«`xst:8Π n%hEb]v@MbZ3Յ.+1666"ared$-R P(` , %OJMrKha8UUUk> .%X#ϻxb4Zv-VP@!4MH5"#}'NQ$A g@ A BP#t:P4L^bx}Qֆ flwd0آGD e&TJFM20ZŰ=a`08XGyᣜ9Ty: h4 K1:,xN mL&%nFiF"5y@=f\HHT }K@mԐp)oy>!HmUH=/*3r?ߏh k6@H$9AR+j$>f8>  J岇v|8jYjH,^`p/(WP'9VWKFw.74K @F8HBP D… !bX0֭[QB>p8 J[2G\P]]]EEχ?-[l~?saq_IPH`)4V \Ќz<г>4́kkkd#ZWW*hu-[ǰc88*hkkfaL:Q8-X lVӴx<\Z##$ VWWJr yG?!<¶mM +A-[`0JNIQx}]TNe>}:M8ߏDAt]"WoGR|5MCqt!-s@ y @ 7Cmm̚Dyfø&(j04Ju?k,z؍DmhΪ= D`0#a[&Aqu4T? +Ή3J }޽D"PɑΞ8q"vL@ FpgV3Ų,x'O<{l"Zre60aK0|1Os[ pU0K| <@D S8% !L 5)-Eɴ>IoڰUk^ 6b!V`X vi0>@nluq9! 뺎Z{z@F 1u= v8P-+++Q[5U(tZ¡Q󨘤/7A~'r0 ZʵiHM`0Ke"***{]׭;w.% PFp5q%χ6s ~2M(g 3 #Dxx%rzƝyb:4mϞ=X& r@/j__Lfͭꂲ`C GImݺ&_YY:py~̘%}4T3555{m/[n`lZv!u]8FDo\Ӭ 655Y?ڊ-a)S}5ض}9\|?sB ~.xTfІT*a{ʑ_fPI@ s>O9*<m6xJ$ƙTØ555eq+nȃD9u9F'9)R4 IDAT8$u]ӆ/r&0[2 tL ,Xy~~8 bp*0 s8 7Ĺ3". /*/ba|pnNCA{|hvS`Y\S'/@JރgT\䎃<l2bpBUƓIHؾ9@^@X@"Lvы/ R({gJrmp8)6m)fd>q]||Zܑ[o=2aB'~.={AӆmG`D_BnPqMO*8z],m$6($!h|~衟 pϽ@<.[c&/Z{~ޱc?ԓ^uu_[[ouC=wwf//Ukkɍ_񆦦YuDe?k>~O]76iRmûn6c떼g/xW~i+>x_R#'65Vl߱^zM(O|iorkP|g[>g~bkΙfƚ@ p'>~N'>~umm޽Y{x?o% ṧl^ƚ{{p޽ ?7uʔ-[}/^hחϕ$`p7N믯^~H;GwWVT<Û63 KCmmݲuwCG.8N*-=o?<_چD" ?w5 ;S\I H%Dwo-[bwO]r-x/困[:%R}k^t|g"x_|O\qc}@ xH$d**kvlZ*kWGOO /yϯL%ں D//^t 4ibOo+8.9 _~y>3}ʊ33?ʝ;wmg^xҲegG"}>u=Θ>|h='B KOr+*s/e3D.6m֭NZzgb84u]nh 5oAo 55u;|䗏&IץRM#tt]rJ%nXD %hTck/]pI*9e~.;,usY7lܴfuoy q;$[iIg}nƷ騹eѢCl_ȵ,~m&:nkY>y/lXNn1#`7twe^裿F3fL/ oyE>s}---=;𘧝vʙg~yh;UuWgmۿpLͷ^zBL8=-ˬoϫN?uo d;I 7/l6âc)gu7w>m۹\r?e^rqwO}=Ydq]]b(i .X>m1{e_<#܄cI083;~_fs9Ckj2"VuE ,^\W=k&M.?N8''ԠI$U|k߸/_~ B\~guwٲqwOV^wm"׽K!W~ݵXx~9V7F#x|IDt=~'?}ʔ'/i\q% P(+ٛJ ]n' |UUDwV;,+*+z{DTS]POD?{DP"&LCP06NHD_ueuSNMRPhɡPu6>Xyݵ TTV*+ ec9M? L< 0ǀ4iy{El6 KN8b /XpA6ESMu}i_/W0@O;wgfl\pj2 c)SLQ7"04I'Mj)S&ÌfLŇ@ 0wN:iQ1}" ͞=KḟX,6^h!ŇH$`|UUUUUU<+b<x"hU]n@ D0@@ D0@@ D0@@ D0@@ D0@@ D0@@ D0@@ D0`q޽dAjc7{ "s GW˓;Xfo|䗻YAwnO^*aLB$@ `@ `@ `@ `@ `@ ` s 6G\M#"r鯚v$Vw]@0x}ĭD.-JDiiDdq쉿:>(o74˂fpXc|Y(\4Ͳ,", t]y"|,J_ J$mo-F @0n,w%jFf+y;>J%6)TKa;iu]4uٲ۶1E:0, ]@ 0\PH!όuR8,X^ci.JX!TI]Yxni2xm3%E !f&vdLk@p8R bp[5aC) g릢}硹Cg.aI uncbeYpwj] I"F -R{|Tz8+|#mcE\u6x` "A `p]y=5F]{j=hG4qsq""(J|< RPP4p`&^_v2E *?G[/}P(/a| b;]J;ɩQC@ 7'um۶t9@2|2Rl"/TV}מ[@A ^9)OÙJ]n4MSDx| K9/nbgU@0 F: C$@ p UCgˀ}9P,=y-BRt PR(8*ۙ b!Sq>s]ݞ#$D0-p y_°qR8+e'<Cu]]"  Gΐ^0xz5m1h]w״CE "D"0Kb Jm<} ~_+HeI0 7; QO,TrzDɴx-x*qR '3SRS^*<מ>ҪCCj(sbX @û38xQ3ٓP(ԡ8)R8Z4a.jCIA$@ HGTϦ22JtX|U } v W<-ECjCpԬMW#"K6_6[gOИ3P[=it+eɤ6ZDz\4Bq@ ]gU=q5}Ni,LyC +:Ua&"_ՖgN=eJ=+,QB \.2xr8;}zNT;\9˲PqnT{ $] `X *3qzAg)Tˀ^OCJ'ySJ Ae]÷~|B%    ,?=,Ծ\r5V.}uxUf6`(rvCڄ `X iS4kqq'Ni8HP@q=5ZT1 =Z{t?'Ox2qR۶a"d2|H0S,@ КY+5UIxK!jVUpH?G D0`P8% $gW4Vt>Hi 8_t8U Cm 'A `8 @BbJZE4MDR|jB! 0,'( tTy ! hvnY2GQ)( q> `X @J~a\0 P੹l|>xc.֭K! b`46@ Ń(%喟j=N(7W|VdL& Tկj'H , \  T@ ƍ8tQKG@'% (˩öm( D" P<̊\.n:b0`b!'g@“G D0 A5H-4lO"3-"jWcCbuDYu᪪*"NӱX G gJMP)b4 ^8JSzFbZ 55MN:{l"Kh׮]?(Ɨdr2@K@ \nAԯy֞ݐ@`׷k."\UUH$6mDDD9%QpHq=e`;4<$4U䈈VO`8`f}w!`s?Te鏳ӤzvK?Oh &aة˥)Jsӡ *Qcx (DNa1FCȬhWvp>Nt  WG_m@ywd }-T(G!a._|Yi;T0Sq1ԑ ~PCjq+`|S<8+->L}{!=~hR%^Xa@->s< f9Q9,P(p'QmX9v! ŠooˮjMzq0CM>@_~?֊`AӨܨ"d2|`JG2r:c:U.@6ʼn R9XXyAGa.Kq<N\ʛ ^aq;~[ ,FO7]Bv`c&ҧV%/ɻXCDnp0 TnF)P*GiajbjH=FU28BD\M;守`?|}]O1j$ crK5dnl݂eY/`CaV-h4?Rp>ùg.hf|>J1E83 ~ v*Ip_/I6.1&6M G)eqO㠑D;J&@ pS³ܛ 9{=J&va'sPP0=} WΈf1D(&R{K bTkDbQM-f1ãA~\F),˲<9<&\}B@ ۶9!c*Qh87g s;j_ ᥜU `A2ŗRL.Y=@,1|>R80#"p)ĠHIPPS+ɤd8랾H8p%:piAQUے<@ @ b8(x| c1>lʛJZ3')yd&,TPjzxwKVkjs8Bn]54^Ln  #AB[4bhq<҂P=sM$>tPA0+g?¿ZLdR  EѲz8@EF:ˁX@ p\j7( N D1eZӂ/HVu|Y 끇垝 )σDYjI7@p@ @=\SeԐ P*bǨ} T*Ty~iXl@Pye9z۶ժ\*9ZԜ|LRK,0ԮAXIDAT=NlnfCt'I@ 8Sn@ Ƌ`&L`0+XT]5z8]Rj% R$x,Nk`RU~x bY;IA `R\B]ʇ5x@ҡ@8`t*I bX "T̐1BDee{74r<?vWٟFA:{Zy߿Q@ `؇h-AB$@ `@ `@ 6~ QuN>^DoÄT*ADQgLK%u$QSx$ e陳-=C${W|E؎ZDcJ5(ln#w6E.-7B>_|a N>MhΦVuB-YGG`r R;[~|C'O>3JڑvرcΝ;ɸ?*+ yG`xhǝ7}K#p9+o_s5ĥnݺӟ'xb H&vb!/h!SIEG$\UwF*#}Wٱk1 uxYMsLӒ[)zjuT?|l_#L^rϽw;v|[?&C6}#pwZu*n/kWCG?0J_̛7egs ۶zY4.p95kxgwxƍr͛V\y嗇j^t!>[>aY@D3g䯹\{ի?s5+K{2/%ݻ7oӛqd2U, 7 fYr) A]}>K C뺙L&j   $ ov~rP(<̳LJ%'JE0#0v:La~{6u] erBhF,Ct:mF 8k{g8[n%NywyWk&{O>裏g?oĉ;0L6ϟ7awܵys9˶D"Qr` !9r|&qR8,;~uTu#~"}l.gfeeX,&RdYV8fL"w]7f9q|>+rV~LV( A\d__EE̳q_wuw} 뮺˗+NuuUuucA0H?я3gH}~oÆ~`nv?E\ B_hڵofsO8cɓ>Oӻoﶵ_?ꊮ{~zYgWUUU|7*L˺>D^yd2^XQs]wƍ`WwwEE\~β;~tO::; BֽdΛ3iӦ[~?N=~z&5ꊃn b 'f\nݺuvۤIVXo}o&\210_K@s)'Z溺Z]׋-[-˘O H$.%KL81 Mɶ v t:OwsW7>waM\L$좂}PĵZ-ZzoU{}*.]ZڢպV]ꆠUYD@d'(E.LL =sԋAy>=+**؇v u+Tonnn}B|E&qwzMgI ڲ vŲ_y\nUHLL2e2|:ik9ݷ{ZƧ;wۻg܎]}M:u*588!d#jNm+W-YvУ3 =z"##c̘1 ƪ*777JjVdv"k{^KQTUUu^~AhhpjꍒUK]a„qRRRjuӫda,p7Moq{]B(.nZRrǻF 5\L&!TT\ܽwO7b^OIۿwEz]KN~]9%ɩp FeL?k.8:!g4Jk 7n;tv8rcfgp1##`0չFBXa_JC߾}W^T*m֚U| q#?G=,qv?eᕱf&{iYjڍԴc٣u4=T\.g%Y~Bطo_||avٕVWW ¶6TZETU#;u =skDb6#9;w mKa-&53(nΛnxW49%kn\|E* |̍fdyqܹ366ϯ,&&Ν;&(zhX֞bW}HݚU":z[s5rx]'hNR:=B| $33[7,[vvѽ| {t;MS,Eq3nJ_'Oz-MرcYYYA.7$׮][VV&|}}>,Μ9cooo׎'_ѣGd߾}=9B>> ;gA!qnannZ>Fv!BÂ۷wxVc={x7iGvl'N(jROHv~ci3gL۱s%|ÆlͻyV۴ OO澹cÇDFF!3ߟ:/[Bg 7Pտ9s/]4gGGٳgoڴСC]tvrrjyRÿ (B :XQZgIBZvԨ])sEXtР.7,xƌɞjφ]麺:Oӧ!&NϫO>1!sg$I4niEN9xǫ>h="#'˯]7TUVmݺ>#bּΟy [!5/΃"[lr9a鲏W}lKK=ܼ嫰"&7]d2uS]Yf|r\BAdJ%͎dUpU$Tm~Zq LnkkÎOju$)j1 B!A  %I :tB[[[ivjƧ~vF&!,˥R)BHV8nyVݻgwɃjv=^Rz= $I>)cGmL^(j.~o!G1ȩ3Ϝ=Uz)1<.^k4jqIQu:Za$I0L*ZS]JӴ^qI>X cMEJ0 'Ih4cGL&Z0 #NJmZ-Vkf{:<\ 1fzD`0( шH$vPyyyo=]q!_vjob6n>bErW]U!tfFP5*2?ؗ5+Wp;{>qy[Oe2K4jarYMFz껋?e_r֮]RFR/_q\"=ph3I 7mBbDF4}a'|7S?{3I3\ʤ59Nlg'Mxvm{A|>+_ 7=jx42e/Gh%FH[0 h h%!.X,i׎Q co#bW#B*^{{mx vEf0*12%ZzTCdZ-C Kj*ˬ! x<~KO^$֞)r+pyyz/x3^K$Mַ' kݒy慄 ]O$G-|ڃd4?G3cfLœ?Ls8iWdV*`Zu0L}TОyˁ33 Tn4Z_/%@)4_RTMJu @0`Xs@0 H%$$fff=wd\b3M&0+F+мgP(p^W(_:~X -6=~Reaa\Ɓ6(ki%Sp!YY vss0ձsԴ]BvXѶ8Rt`VFLD?ݯV?ֶW9554M@@[7 /]JBA0+bbFCV8?:kp{ffe楥2P.VE`7ŅwJ/|ϥVVV8yJ"H8;:vNHXZRp\:NZZ.;A0+#h~%ׯ̚9 !qoXhLU]I}b+rܣG-7@sb&99. $Ѵg3g/ځTr SP#7WW qŊez Rg™P@al67]n4FC 'H? w^vfz]U+.4zT&im0 2d͚E0 ~גR˫1l5UP SN.j4˗-1 r JherY BH,/^ԪUquPSh ÚĤ#GTWBnы1}ڀ Bn& c7 t|=V%%EP,sq߷|oYPq08:v0~= :^j{*.^"ꗈby @=vlﺮ]qN ߼bWGRn0R:땊 %{wx yJn:2=؜ OZJtI h%J) qjd/n89 x" [gDBS=֑SLn IENDB`gpiv-0.6.1/doc/C/figures/gpiv.xpm0000644000175000017500000000505611204235560013476 00000000000000/* XPM */ static char * gpiv_xpm[] = { "48 48 4 1", " g None", ". g #00CF00", "+ g #FF0000", "@ g #0000FF", " ", " ", " ", " . ", " .... .. .. ", " . . . . . ", " ... . . . ", " . . . ", " .. . ... ", " ... ", " ... ", " ... ", " ", " ", " + ", " ++++ ++ ++ ", " + + + + + ", " +++ + + + ", " + + + ", " ++ + + ", " +++ ", " +++ ", " +++ ", " +++ ", " ", " ", " ", " @ ", " @@@@ @@ @@ ", " @ @ @ @ @ ", " @@@ @ @ @ ", " @ @ @ ", " @@ @ @ ", " @@@ ", " @@@ ", " @@@ ", " @@@ ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; gpiv-0.6.1/doc/C/Makefile.am0000644000175000017500000000274311076052422012374 00000000000000 SUBDIRS = figures gpiv_helpdir = $(datadir)/gnome/help/gpiv/C gpiv_help_DATA = \ index.html \ intro.html \ gpiv.html \ piv_intro.html \ topic.dat EXTRA_DIST = Makefile.in #EXTRA_DIST = $(gpiv_help_DATA) ## ##SGML_FILES = \ ## gpiv.sgml # files that aren't in a binary/data/library target have to be listed here # to be included in the tarball when you 'make dist' ##EXTRA_DIST = \ ## topic.dat ## $(SGML_FILES) ## The - before the command means to ignore it if it fails. that way ## people can still build the software without the docbook tools all: #index.html: index.html # -cp index.html . #intro.html: intro.html # -cp intro.html . #gpiv.html: gpiv.html # -cp gpiv/gpiv.html . #piv_intro.html: gpiv/piv_intro.html # -cp piv_intro.html . ##gpiv/gpiv.html: $(SGML_FILES) ## -db2html gpiv.sgml ## when we make dist, we include the generated HTML so people don't ## have to have the docbook tools dist-hook: -cp *.html $(distdir) -cp *.dat $(distdir) # mkdir $(distdir)/gpiv # -cp gpiv/*.html gpiv/*.css $(distdir)/gpiv # -cp gpiv.html $(distdir) #install-data-local: gpiv.html # $(mkinstalldirs) $(gpiv_helpdir)/images # -for file in $(srcdir)/gpiv/*.html $(srcdir)/gpiv/*.css; do \ # basefile=`basename $$file`; \ # $(INSTALL_DATA) $(srcdir)/$$file $(gpiv_helpdir)/$$basefile; \ # done ##gpiv.ps: gpiv.sgml ## -db2ps $< ##gpiv.rtf: gpiv.sgml ## -db2rtf $< gpiv-0.6.1/doc/C/Makefile.in0000644000175000017500000004141011204234173012375 00000000000000# Makefile.in generated by automake 1.10.2 from Makefile.am. # @configure_input@ # Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, # 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ pkgdatadir = $(datadir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = doc/C DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.in am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_CLEAN_FILES = SOURCES = DIST_SOURCES = RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ html-recursive info-recursive install-data-recursive \ install-dvi-recursive install-exec-recursive \ install-html-recursive install-info-recursive \ install-pdf-recursive install-ps-recursive install-recursive \ installcheck-recursive installdirs-recursive pdf-recursive \ ps-recursive uninstall-recursive am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = `echo $$p | sed -e 's|^.*/||'`; am__installdirs = "$(DESTDIR)$(gpiv_helpdir)" gpiv_helpDATA_INSTALL = $(INSTALL_DATA) DATA = $(gpiv_help_DATA) RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ distclean-recursive maintainer-clean-recursive ETAGS = etags CTAGS = ctags DIST_SUBDIRS = $(SUBDIRS) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALL_LINGUAS = @ALL_LINGUAS@ AMTAR = @AMTAR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CANVAS_AA = @CANVAS_AA@ CATALOGS = @CATALOGS@ CATOBJEXT = @CATOBJEXT@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONTROL = @CONTROL@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DATADIRNAME = @DATADIRNAME@ DEBUG = @DEBUG@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ ENABLE_CAM = @ENABLE_CAM@ ENABLE_DAC = @ENABLE_DAC@ ENABLE_MPI = @ENABLE_MPI@ ENABLE_MPI_RR = @ENABLE_MPI_RR@ ENABLE_TRIG = @ENABLE_TRIG@ EXEEXT = @EXEEXT@ GETTEXT_PACKAGE = @GETTEXT_PACKAGE@ GMOFILES = @GMOFILES@ GMSGFMT = @GMSGFMT@ GPIV_CFLAGS = @GPIV_CFLAGS@ GPIV_LIBS = @GPIV_LIBS@ GPIV_UI_CFLAGS = @GPIV_UI_CFLAGS@ GPIV_UI_LIBS = @GPIV_UI_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ INSTOBJEXT = @INSTOBJEXT@ INTLLIBS = @INTLLIBS@ INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@ INTLTOOL_MERGE = @INTLTOOL_MERGE@ INTLTOOL_PERL = @INTLTOOL_PERL@ INTLTOOL_UPDATE = @INTLTOOL_UPDATE@ K_TOPDIR = @K_TOPDIR@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ MKINSTALLDIRS = @MKINSTALLDIRS@ MPIRUN = @MPIRUN@ MSGFMT = @MSGFMT@ MSGFMT_OPTS = @MSGFMT_OPTS@ MSGMERGE = @MSGMERGE@ OBJEXT = @OBJEXT@ OVERRIDE_IMAGE_HEIGHT_MAX = @OVERRIDE_IMAGE_HEIGHT_MAX@ OVERRIDE_IMAGE_WIDTH_MAX = @OVERRIDE_IMAGE_WIDTH_MAX@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ POFILES = @POFILES@ POSUB = @POSUB@ PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@ PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@ RR = @RR@ RTA_TOPDIR = @RTA_TOPDIR@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ USE_NLS = @USE_NLS@ VERSION = @VERSION@ XGETTEXT = @XGETTEXT@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ SUBDIRS = figures gpiv_helpdir = $(datadir)/gnome/help/gpiv/C gpiv_help_DATA = \ index.html \ intro.html \ gpiv.html \ piv_intro.html \ topic.dat EXTRA_DIST = Makefile.in all: all-recursive .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/C/Makefile'; \ cd $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/C/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh install-gpiv_helpDATA: $(gpiv_help_DATA) @$(NORMAL_INSTALL) test -z "$(gpiv_helpdir)" || $(MKDIR_P) "$(DESTDIR)$(gpiv_helpdir)" @list='$(gpiv_help_DATA)'; for p in $$list; do \ if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ f=$(am__strip_dir) \ echo " $(gpiv_helpDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(gpiv_helpdir)/$$f'"; \ $(gpiv_helpDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(gpiv_helpdir)/$$f"; \ done uninstall-gpiv_helpDATA: @$(NORMAL_UNINSTALL) @list='$(gpiv_help_DATA)'; for p in $$list; do \ f=$(am__strip_dir) \ echo " rm -f '$(DESTDIR)$(gpiv_helpdir)/$$f'"; \ rm -f "$(DESTDIR)$(gpiv_helpdir)/$$f"; \ done # This directory's subdirectories are mostly independent; you can cd # into them and run `make' without going through this Makefile. # To change the values of `make' variables: instead of editing Makefiles, # (1) if the variable is set in `config.status', edit `config.status' # (which will cause the Makefiles to be regenerated when you run `make'); # (2) otherwise, pass the desired values on the `make' command line. $(RECURSIVE_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ target=`echo $@ | sed s/-recursive//`; \ list='$(SUBDIRS)'; for subdir in $$list; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ dot_seen=yes; \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done; \ if test "$$dot_seen" = "no"; then \ $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ fi; test -z "$$fail" $(RECURSIVE_CLEAN_TARGETS): @failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ dot_seen=no; \ case "$@" in \ distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ *) list='$(SUBDIRS)' ;; \ esac; \ rev=''; for subdir in $$list; do \ if test "$$subdir" = "."; then :; else \ rev="$$subdir $$rev"; \ fi; \ done; \ rev="$$rev ."; \ target=`echo $@ | sed s/-recursive//`; \ for subdir in $$rev; do \ echo "Making $$target in $$subdir"; \ if test "$$subdir" = "."; then \ local_target="$$target-am"; \ else \ local_target="$$target"; \ fi; \ (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ || eval $$failcom; \ done && test -z "$$fail" tags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ done ctags-recursive: list='$(SUBDIRS)'; for subdir in $$list; do \ test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ done ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ mkid -fID $$unique tags: TAGS TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ here=`pwd`; \ if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ include_option=--etags-include; \ empty_fix=.; \ else \ include_option=--include; \ empty_fix=; \ fi; \ list='$(SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test ! -f $$subdir/TAGS || \ tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ fi; \ done; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$tags $$unique; \ fi ctags: CTAGS CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ $(TAGS_FILES) $(LISP) tags=; \ list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | \ $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in files) print i; }; }'`; \ test -z "$(CTAGS_ARGS)$$tags$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$tags $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && cd $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) $$here distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ fi; \ cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ else \ test -f $(distdir)/$$file \ || cp -p $$d/$$file $(distdir)/$$file \ || exit 1; \ fi; \ done list='$(DIST_SUBDIRS)'; for subdir in $$list; do \ if test "$$subdir" = .; then :; else \ test -d "$(distdir)/$$subdir" \ || $(MKDIR_P) "$(distdir)/$$subdir" \ || exit 1; \ distdir=`$(am__cd) $(distdir) && pwd`; \ top_distdir=`$(am__cd) $(top_distdir) && pwd`; \ (cd $$subdir && \ $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$$top_distdir" \ distdir="$$distdir/$$subdir" \ am__remove_distdir=: \ am__skip_length_check=: \ distdir) \ || exit 1; \ fi; \ done $(MAKE) $(AM_MAKEFLAGS) \ top_distdir="$(top_distdir)" distdir="$(distdir)" \ dist-hook check-am: all-am check: check-recursive all-am: Makefile $(DATA) installdirs: installdirs-recursive installdirs-am: for dir in "$(DESTDIR)$(gpiv_helpdir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-recursive install-exec: install-exec-recursive install-data: install-data-recursive uninstall: uninstall-recursive install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-recursive install-strip: $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ `test -z '$(STRIP)' || \ echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-recursive clean-am: clean-generic mostlyclean-am distclean: distclean-recursive -rm -f Makefile distclean-am: clean-am distclean-generic distclean-tags dvi: dvi-recursive dvi-am: html: html-recursive info: info-recursive info-am: install-data-am: install-gpiv_helpDATA install-dvi: install-dvi-recursive install-exec-am: install-html: install-html-recursive install-info: install-info-recursive install-man: install-pdf: install-pdf-recursive install-ps: install-ps-recursive installcheck-am: maintainer-clean: maintainer-clean-recursive -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-recursive mostlyclean-am: mostlyclean-generic pdf: pdf-recursive pdf-am: ps: ps-recursive ps-am: uninstall-am: uninstall-gpiv_helpDATA .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) install-am \ install-strip .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \ all all-am check check-am clean clean-generic ctags \ ctags-recursive dist-hook distclean distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-data install-data-am install-dvi \ install-dvi-am install-exec install-exec-am \ install-gpiv_helpDATA install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs installdirs-am \ maintainer-clean maintainer-clean-generic mostlyclean \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-recursive \ uninstall uninstall-am uninstall-gpiv_helpDATA #EXTRA_DIST = $(gpiv_help_DATA) # files that aren't in a binary/data/library target have to be listed here # to be included in the tarball when you 'make dist' all: #index.html: index.html # -cp index.html . #intro.html: intro.html # -cp intro.html . #gpiv.html: gpiv.html # -cp gpiv/gpiv.html . #piv_intro.html: gpiv/piv_intro.html # -cp piv_intro.html . dist-hook: -cp *.html $(distdir) -cp *.dat $(distdir) # mkdir $(distdir)/gpiv # -cp gpiv/*.html gpiv/*.css $(distdir)/gpiv # -cp gpiv.html $(distdir) #install-data-local: gpiv.html # $(mkinstalldirs) $(gpiv_helpdir)/images # -for file in $(srcdir)/gpiv/*.html $(srcdir)/gpiv/*.css; do \ # basefile=`basename $$file`; \ # $(INSTALL_DATA) $(srcdir)/$$file $(gpiv_helpdir)/$$basefile; \ # done # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: gpiv-0.6.1/doc/C/gpiv.html0000644000175000017500000010071611204235560012171 00000000000000GPIV Contents
Previous
Next