diff --git a/meson.build b/meson.build index 0672ed943..ce91771b2 100644 --- a/meson.build +++ b/meson.build @@ -61,6 +61,7 @@ gobject_dep = dependency ('gobject-2.0', required: true) gio_dep = dependency ('gio-2.0', required: true) xml2_dep = dependency ('libxml-2.0', required: true) libz_dep = dependency ('zlib', required: true) +tiff_dep = dependency ('libtiff-4', required: get_option ('tiff')) usb_dep = dependency ('libusb-1.0', required: get_option ('usb')) aravis_public_dependencies = [glib_dep, gobject_dep, gio_dep] @@ -107,9 +108,14 @@ viewer_deps = aravis_dependencies + [dependency ('gtk+-3.0', version: '>=3.12', dependency ('gstreamer-base-1.0', required: viewer_option), dependency ('gstreamer-app-1.0', required: viewer_option), dependency ('gstreamer-video-1.0', required: viewer_option)] +if tiff_dep.found() + viewer_deps += tiff_dep +endif subdir ('po', if_found: viewer_deps) subdir ('viewer', if_found: viewer_deps) + + gst_enabled = false gst_option = get_option ('gst-plugin') gst_deps = aravis_dependencies + [dependency ('gstreamer-base-1.0', required: gst_option), @@ -136,6 +142,7 @@ summary ( 'Viewer': viewer_enabled, 'GStreamer plugin': gst_enabled, 'USB support': usb_dep.found(), + 'TIFF viewer support': tiff_dep.found(), }, section: 'Options' ) diff --git a/meson_options.txt b/meson_options.txt index eba1b30ae..e752704f7 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -3,6 +3,7 @@ option('viewer', type: 'feature', value: 'auto', description : 'Build simple viewer') option('gst-plugin', type: 'feature', value: 'auto', description : 'Build GStreamer plugin') option('usb', type: 'feature', value: 'auto', description : 'Enable USB support') +option('tiff', type: 'feature', value: 'auto', description : 'Enable viewer TIFF support') option('packet-socket', type: 'feature', value: 'auto', description : 'Enable packet socket support') option('tests', type: 'boolean', value: true, description: 'Build tests') diff --git a/src/arvmisc.c b/src/arvmisc.c index c9a1c5798..82515c440 100644 --- a/src/arvmisc.c +++ b/src/arvmisc.c @@ -720,10 +720,205 @@ ArvGstCapsInfos arv_gst_caps_infos[] = { "video/x-raw-bayer, format=(string)bggr, bpp=(int)8, depth=(int)8", "video/x-raw-bayer", 8, 8, ARV_MAKE_FOURCC ('b','g','g','r') }, - /* Non 8bit bayer formats are not supported by gstreamer bayer plugin. - * This feature is discussed in bug https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/86 .*/ - + * This feature is discussed in bug https://gitlab.freedesktop.org/gstreamer/gst-plugins-bad/-/issues/86 . + * This is a fallback for these bayer formats, displaying a grayscale image. */ + { + ARV_PIXEL_FORMAT_BAYER_GR_10, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)grbg, bpp=(int)16, depth=(int)10", + "video/x-raw-gray", 16, 10, ARV_MAKE_FOURCC ('g','r','b','g') + }, + { + ARV_PIXEL_FORMAT_BAYER_RG_10, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)rggb, bpp=(int)16, depth=(int)10", + "video/x-raw-gray", 16, 10, ARV_MAKE_FOURCC ('r','g','g','b') + }, + { + ARV_PIXEL_FORMAT_BAYER_GB_10, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)gbrg, bpp=(int)16, depth=(int)10", + "video/x-raw-gray", 16, 10, ARV_MAKE_FOURCC ('g','b','r','g') + }, + { + ARV_PIXEL_FORMAT_BAYER_BG_10, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-gray, format=(string)bggr, bpp=(int)16, depth=(int)10", + "video/x-raw-gray", 16, 10, ARV_MAKE_FOURCC ('b','g','g','r') + }, + { + ARV_PIXEL_FORMAT_BAYER_GR_12, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)grbg, bpp=(int)16, depth=(int)12", + "video/x-raw-gray", 16, 12, ARV_MAKE_FOURCC ('g','r','b','g') + }, + { + ARV_PIXEL_FORMAT_BAYER_RG_12, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)rggb, bpp=(int)16, depth=(int)12", + "video/x-raw-gray", 16, 12, ARV_MAKE_FOURCC ('r','g','g','b') + }, + { + ARV_PIXEL_FORMAT_BAYER_GB_12, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)gbrg, bpp=(int)16, depth=(int)12", + "video/x-raw-gray", 16, 12, ARV_MAKE_FOURCC ('g','b','r','g') + }, + { + ARV_PIXEL_FORMAT_BAYER_BG_12, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-gray, format=(string)bggr, bpp=(int)16, depth=(int)12", + "video/x-raw-gray", 16, 12, ARV_MAKE_FOURCC ('b','g','g','r') + }, + { + ARV_PIXEL_FORMAT_BAYER_GR_16, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)grbg, bpp=(int)16, depth=(int)16", + "video/x-raw-gray", 16, 16, ARV_MAKE_FOURCC ('g','r','b','g') + }, + { + ARV_PIXEL_FORMAT_BAYER_RG_16, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)rggb, bpp=(int)16, depth=(int)16", + "video/x-raw-gray", 16, 16, ARV_MAKE_FOURCC ('r','g','g','b') + }, + { + ARV_PIXEL_FORMAT_BAYER_GB_16, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)gbrg, bpp=(int)16, depth=(int)16", + "video/x-raw-gray", 16, 16, ARV_MAKE_FOURCC ('g','b','r','g') + }, + { + ARV_PIXEL_FORMAT_BAYER_BG_16, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-gray, format=(string)bggr, bpp=(int)16, depth=(int)16", + "video/x-raw-gray", 16, 16, ARV_MAKE_FOURCC ('b','g','g','r') + }, + { + ARV_PIXEL_FORMAT_BAYER_GR_10P, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)grbg, bpp=(int)10, depth=(int)10", + "video/x-raw-gray", 10, 10, ARV_MAKE_FOURCC ('g','r','b','g') + }, + { + ARV_PIXEL_FORMAT_BAYER_RG_10P, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)rggb, bpp=(int)10, depth=(int)10", + "video/x-raw-gray", 10, 10, ARV_MAKE_FOURCC ('r','g','g','b') + }, + { + ARV_PIXEL_FORMAT_BAYER_GB_10P, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)gbrg, bpp=(int)10, depth=(int)10", + "video/x-raw-gray", 10, 10, ARV_MAKE_FOURCC ('g','b','r','g') + }, + { + ARV_PIXEL_FORMAT_BAYER_BG_10P, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-gray, format=(string)bggr, bpp=(int)10, depth=(int)10", + "video/x-raw-gray", 10, 10, ARV_MAKE_FOURCC ('b','g','g','r') + }, + { + ARV_PIXEL_FORMAT_BAYER_GR_12P, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)grbg, bpp=(int)12, depth=(int)12", + "video/x-raw-gray", 12, 12, ARV_MAKE_FOURCC ('g','r','b','g') + }, + { + ARV_PIXEL_FORMAT_BAYER_RG_12P, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)rggb, bpp=(int)12, depth=(int)12", + "video/x-raw-gray", 12, 12, ARV_MAKE_FOURCC ('r','g','g','b') + }, + { + ARV_PIXEL_FORMAT_BAYER_GB_12P, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)gbrg, bpp=(int)12, depth=(int)12", + "video/x-raw-gray", 12, 12, ARV_MAKE_FOURCC ('g','b','r','g') + }, + { + ARV_PIXEL_FORMAT_BAYER_BG_12P, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-gray, format=(string)bggr, bpp=(int)12, depth=(int)12", + "video/x-raw-gray", 12, 12, ARV_MAKE_FOURCC ('b','g','g','r') + }, + { + ARV_PIXEL_FORMAT_BAYER_GR_10_PACKED, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)grbg, bpp=(int)10, depth=(int)10", + "video/x-raw-gray", 10, 10, ARV_MAKE_FOURCC ('g','r','b','g') + }, + { + ARV_PIXEL_FORMAT_BAYER_RG_10_PACKED, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)rggb, bpp=(int)10, depth=(int)10", + "video/x-raw-gray", 10, 10, ARV_MAKE_FOURCC ('r','g','g','b') + }, + { + ARV_PIXEL_FORMAT_BAYER_GB_10_PACKED, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)gbrg, bpp=(int)10, depth=(int)10", + "video/x-raw-gray", 10, 10, ARV_MAKE_FOURCC ('g','b','r','g') + }, + { + ARV_PIXEL_FORMAT_BAYER_BG_10_PACKED, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-gray, format=(string)bggr, bpp=(int)10, depth=(int)10", + "video/x-raw-gray", 10, 10, ARV_MAKE_FOURCC ('b','g','g','r') + }, + { + ARV_PIXEL_FORMAT_BAYER_GR_12_PACKED, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)grbg, bpp=(int)12, depth=(int)12", + "video/x-raw-gray", 12, 12, ARV_MAKE_FOURCC ('g','r','b','g') + }, + { + ARV_PIXEL_FORMAT_BAYER_RG_12_PACKED, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)rggb, bpp=(int)12, depth=(int)12", + "video/x-raw-gray", 12, 12, ARV_MAKE_FOURCC ('r','g','g','b') + }, + { + ARV_PIXEL_FORMAT_BAYER_GB_12_PACKED, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-bayer, format=(string)gbrg, bpp=(int)12, depth=(int)12", + "video/x-raw-gray", 12, 12, ARV_MAKE_FOURCC ('g','b','r','g') + }, + { + ARV_PIXEL_FORMAT_BAYER_BG_12_PACKED, + "video/x-raw, format=(string)GRAY16_LE", + "video/x-raw", "GRAY16_LE", + "video/x-raw-gray, format=(string)bggr, bpp=(int)12, depth=(int)12", + "video/x-raw-gray", 12, 12, ARV_MAKE_FOURCC ('b','g','g','r') + }, { ARV_PIXEL_FORMAT_YUV_422_PACKED, "video/x-raw, format=(string)UYVY", diff --git a/viewer/arvviewer.c b/viewer/arvviewer.c index 24a9dacb0..a6440e5a6 100644 --- a/viewer/arvviewer.c +++ b/viewer/arvviewer.c @@ -29,8 +29,12 @@ #include #include #include +#include #include #include +#ifdef ARAVIS_HAS_TIFF +#include +#endif #ifdef GDK_WINDOWING_X11 #include // for GDK_WINDOW_XID #endif @@ -820,6 +824,183 @@ _save_gst_sample_to_file (GstSample *sample, const char *path, const char *mime_ return success; } +#ifdef ARAVIS_HAS_TIFF +static gboolean +_save_arv_buffer_to_dng_file (ArvBuffer *buffer, GstSample *sample, const char *path, GError **error) +{ + + TIFF *tif; + GstSample *converted = NULL; + GstSample *scaled = NULL; + GstCaps *caps = NULL; + GstBuffer *scaled_buffer; + size_t size; + int width, height, bpp; + char *vendor, *model; + const char *data; + const char *caps_string; + static int white_level; + const static int black_level = 0; + guint32 pixel_format; + GstVideoScaler *h_scale = NULL; + GstVideoScaler *v_scale = NULL; + // TODO: implement camera/sensor specific color conversion matrix + const float cc_matrix[] = { 1.0, 0.0, 0.0, + 0.0, 1.0, 0.0, + 0.0, 0.0, 1.0 }; + // TODO: implement white balance + const float neutral[] = { 1.0, 1.0, 1.0 }; + const unsigned short cfa_dimensions[] = { 2, 2 }; + const char dng_version[] = { 1, 1, 0, 0 }; + const char dng_compatversion[] = { 1, 0, 0, 0 }; + char cfa_pattern[4]; + static const long sub_offset = 0; + gboolean success = FALSE; + + tif = TIFFOpen (path, "w"); + if (!tif) return FALSE; + + arv_buffer_get_image_region (buffer, NULL, NULL, &width, &height); + data = arv_buffer_get_image_data (buffer, &size); + pixel_format = arv_buffer_get_image_pixel_format (buffer); + + switch (pixel_format) { + case ARV_PIXEL_FORMAT_BAYER_GR_8: + bpp = 8; + cfa_pattern[0] = 1; + cfa_pattern[1] = 0; + cfa_pattern[2] = 2; + cfa_pattern[3] = 1; + break; + case ARV_PIXEL_FORMAT_BAYER_RG_8: + bpp = 8; + cfa_pattern[0] = 0; + cfa_pattern[1] = 1; + cfa_pattern[2] = 1; + cfa_pattern[3] = 2; + break; + case ARV_PIXEL_FORMAT_BAYER_GB_8: + bpp = 8; + cfa_pattern[0] = 1; + cfa_pattern[1] = 2; + cfa_pattern[2] = 0; + cfa_pattern[3] = 1; + break; + case ARV_PIXEL_FORMAT_BAYER_BG_8: + bpp = 8; + cfa_pattern[0] = 2; + cfa_pattern[1] = 1; + cfa_pattern[2] = 1; + cfa_pattern[3] = 0; + break; + case ARV_PIXEL_FORMAT_BAYER_GR_16: + bpp = 16; + cfa_pattern[0] = 1; + cfa_pattern[1] = 0; + cfa_pattern[2] = 2; + cfa_pattern[3] = 1; + break; + case ARV_PIXEL_FORMAT_BAYER_RG_16: + bpp = 16; + cfa_pattern[0] = 0; + cfa_pattern[1] = 1; + cfa_pattern[2] = 1; + cfa_pattern[3] = 2; + break; + case ARV_PIXEL_FORMAT_BAYER_GB_16: + bpp = 16; + cfa_pattern[0] = 1; + cfa_pattern[1] = 2; + cfa_pattern[2] = 0; + cfa_pattern[3] = 1; + break; + case ARV_PIXEL_FORMAT_BAYER_BG_16: + bpp = 16; + cfa_pattern[0] = 2; + cfa_pattern[1] = 1; + cfa_pattern[2] = 1; + cfa_pattern[3] = 0; + break; + default: + bpp = 8; + cfa_pattern[0] = 1; + cfa_pattern[1] = 0; + cfa_pattern[2] = 2; + cfa_pattern[3] = 1; + } + + white_level = pow(2, bpp) - 1; + + caps = gst_caps_from_string ("video/x-raw-gray, bpp=(int)8, depth=(int)8"); + converted = gst_video_convert_sample (sample, caps, GST_CLOCK_TIME_NONE, NULL); + + h_scale = gst_video_scaler_new (GST_VIDEO_RESAMPLER_METHOD_NEAREST, GST_VIDEO_SCALER_FLAG_NONE, 1, 1, 1, NULL); + v_scale = gst_video_scaler_new (GST_VIDEO_RESAMPLER_METHOD_NEAREST, GST_VIDEO_SCALER_FLAG_NONE, 1, 1, 1, NULL); + + gst_video_scaler_2d (h_scale, v_scale, GST_VIDEO_FORMAT_GRAY8, converted, 1, scaled, 1, 0, 0, (width >> 2), (height >> 2)); + + TIFFSetField (tif, TIFFTAG_SUBFILETYPE, 1); // Reduced resolution preview image + TIFFSetField (tif, TIFFTAG_IMAGEWIDTH, (width >> 2)); + TIFFSetField (tif, TIFFTAG_IMAGELENGTH, (height >> 2)); + TIFFSetField (tif, TIFFTAG_BITSPERSAMPLE, 8); + TIFFSetField (tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE); + TIFFSetField (tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); + //TIFFSetField (tif, TIFFTAG_MAKE, vendor); + //TIFFSetField (tif, TIFFTAG_MODEL, model); + TIFFSetField (tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); + TIFFSetField (tif, TIFFTAG_SAMPLESPERPIXEL, 1); + TIFFSetField (tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + TIFFSetField (tif, TIFFTAG_SOFTWARE, "arv-viewer-0.8"); + //TIFFSetField (tif, TIFFTAG_DATETIME, datetime); + TIFFSetField (tif, TIFFTAG_SUBIFD, 1, &sub_offset); + TIFFSetField (tif, TIFFTAG_DNGVERSION, dng_version); + TIFFSetField (tif, TIFFTAG_DNGBACKWARDVERSION, dng_compatversion); + //TIFFSetField (tif, TIFFTAG_UNIQUECAMERAMODEL, model); + TIFFSetField (tif, TIFFTAG_COLORMATRIX1, 9, cc_matrix); + TIFFSetField (tif, TIFFTAG_ASSHOTNEUTRAL, 3, neutral); + //TIFFSetField (tif, TIFFTAG_CAMERASERIALNUMBER, serial); + TIFFSetField (tif, TIFFTAG_CALIBRATIONILLUMINANT1, 21); + + scaled_buffer = gst_sample_get_buffer (scaled); + if (scaled_buffer) { + GstMapInfo map; + + gst_buffer_map (scaled_buffer, &map, GST_MAP_READ); + for (int row = 0; row < (height >> 2); row ++) + TIFFWriteScanline (tif, map.data[row * (width >> 2)], row, 0); + gst_buffer_unmap (scaled_buffer, &map); + } else { + gst_sample_unref (converted); + gst_sample_unref (scaled); + gst_caps_unref (caps); + gst_video_scaler_free (h_scale); + gst_video_scaler_free (v_scale); + } + + TIFFWriteDirectory (tif); + + TIFFSetField (tif, TIFFTAG_SUBFILETYPE, 0); // Full size image + TIFFSetField (tif, TIFFTAG_IMAGEWIDTH, width); + TIFFSetField (tif, TIFFTAG_IMAGELENGTH, height); + TIFFSetField (tif, TIFFTAG_BITSPERSAMPLE, bpp); + TIFFSetField (tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_CFA); + TIFFSetField (tif, TIFFTAG_SAMPLESPERPIXEL, 1); + TIFFSetField (tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); + TIFFSetField (tif, TIFFTAG_CFAREPEATPATTERNDIM, cfa_dimensions); + TIFFSetField (tif, TIFFTAG_CFAPATTERN, 4, cfa_pattern); + TIFFSetField (tif, TIFFTAG_WHITELEVEL, 1, &white_level); + TIFFSetField (tif, TIFFTAG_WHITELEVEL, 1, &black_level); + + for (int row = 0; row < height; row ++) + TIFFWriteScanline (tif, &data[row * width * (bpp >> 3)], row, 0); + + TIFFClose (tif); + success = TRUE; + + return success; +} +#endif + static void snapshot_cb (GtkButton *button, ArvViewer *viewer) { @@ -902,6 +1083,14 @@ snapshot_cb (GtkButton *button, ArvViewer *viewer) gtk_file_filter_add_pattern (filter_all, "*.raw"); gtk_file_filter_set_name (filter, "Raw images (*.raw)"); gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); + + #ifdef ARAVIS_HAS_TIFF + filter = gtk_file_filter_new (); + gtk_file_filter_add_mime_type (filter, "image/x-adobe-dng"); + gtk_file_filter_add_mime_type (filter_all, "image/x-adobe-dng"); + gtk_file_filter_set_name (filter, "DNG raw image (*.dng)"); + gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter); + #endif } gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter_all); @@ -924,7 +1113,15 @@ snapshot_cb (GtkButton *button, ArvViewer *viewer) success = _save_gst_sample_to_file (sample, filename, "image/png", NULL); } else if (GST_IS_SAMPLE (sample) && g_content_type_is_mime_type (content_type, "image/jpeg")) { success = _save_gst_sample_to_file (sample, filename, "image/jpeg", NULL); - } else if (ARV_IS_BUFFER (buffer)) { + } + #ifdef ARAVIS_HAS_TIFF + else if (ARV_IS_BUFFER (buffer) && g_content_type_is_mime_type (content_type, "image/x-adobe-dng")) { + success = _save_arv_buffer_to_dng_file (buffer, sample, filename, &error); + g_free (filename); + } + #endif + else if (ARV_IS_BUFFER (buffer) && g_content_type_is_mime_type (content_type, "image/x-panasonic-rw")) { + // GIO guesses that MIME type for ".raw" files, so this is what we look for when writing unformatted raw files success = g_file_set_contents (filename, data, size, &error); g_free (filename); } diff --git a/viewer/arvviewerfeatures.h.in b/viewer/arvviewerfeatures.h.in new file mode 100644 index 000000000..65fa05f53 --- /dev/null +++ b/viewer/arvviewerfeatures.h.in @@ -0,0 +1,40 @@ +/* Aravis - Digital camera library + * + * Copyright © 2009-2016 Emmanuel Pacaud + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General + * Public License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301, USA. + * + * Author: Emmanuel Pacaud + */ + +#ifndef ARV_VIEWER_FEATURES_H +#define ARV_VIEWER_FEATURES_H + +/*#if !defined (ARV_H_INSIDE) && !defined (ARAVIS_COMPILATION) +#error "Only can be included directly." +#endif*/ + +/** + * ARAVIS_HAS_TIFF + * + * ARAVIS_HAS_TIFF is defined as 1 if aravis viewer is compiled with TIFF support, 0 if not. + * + * Since: 0.8.27 + */ + +#define ARAVIS_HAS_TIFF @ARAVIS_HAS_TIFF@ + +#endif diff --git a/viewer/meson.build b/viewer/meson.build index 0928e6b01..678d840e9 100644 --- a/viewer/meson.build +++ b/viewer/meson.build @@ -19,6 +19,13 @@ viewer_c_args = [ '-DARAVIS_GETTEXT="aravis-@0@"'.format (aravis_api_version) ] +viewer_include_dir = get_option ('includedir') / 'aravis-@0@'.format (aravis_api_version) + +features_viewer_config_data = configuration_data () +features_viewer_config_data.set10 ('ARAVIS_HAS_TIFF', tiff_dep.found()) +configure_file (input: 'arvviewerfeatures.h.in', output: 'arvviewerfeatures.h', + configuration: features_viewer_config_data, install_dir: viewer_include_dir) + viewer_resources = gnome.compile_resources ( 'arvviewerresources', 'arvviewerresources.xml' )