Commit d3ec6617 authored by Thomas White's avatar Thomas White
Browse files

Remove libcrystfel dependency on GTK et al.

parent c4c31271
......@@ -50,7 +50,7 @@ src_process_hkl_SOURCES = src/process_hkl.c
src_indexamajig_SOURCES = src/indexamajig.c
if BUILD_HDFSEE
src_hdfsee_SOURCES = src/hdfsee.c src/dw-hdfsee.c
src_hdfsee_SOURCES = src/hdfsee.c src/dw-hdfsee.c src/hdfsee-render.c
endif
src_get_hkl_SOURCES = src/get_hkl.c
......@@ -88,7 +88,7 @@ INCLUDES = -I$(top_srcdir)/libcrystfel/src -I$(top_srcdir)/data
EXTRA_DIST += src/dw-hdfsee.h src/hdfsee.h src/render_hkl.h \
src/post-refinement.h src/hrs-scaling.h src/scaling-report.h \
src/cl-utils.h
src/cl-utils.h src/hdfsee-render.h
crystfeldir = $(datadir)/crystfel
crystfel_DATA = data/diffraction.cl data/hdfsee.ui
......
......@@ -116,9 +116,11 @@ src_get_hkl_OBJECTS = $(am_src_get_hkl_OBJECTS)
src_get_hkl_LDADD = $(LDADD)
src_get_hkl_DEPENDENCIES = $(top_builddir)/lib/libgnu.a \
$(top_builddir)/libcrystfel/libcrystfel.la
am__src_hdfsee_SOURCES_DIST = src/hdfsee.c src/dw-hdfsee.c
am__src_hdfsee_SOURCES_DIST = src/hdfsee.c src/dw-hdfsee.c \
src/hdfsee-render.c
@BUILD_HDFSEE_TRUE@am_src_hdfsee_OBJECTS = src/hdfsee.$(OBJEXT) \
@BUILD_HDFSEE_TRUE@ src/dw-hdfsee.$(OBJEXT)
@BUILD_HDFSEE_TRUE@ src/dw-hdfsee.$(OBJEXT) \
@BUILD_HDFSEE_TRUE@ src/hdfsee-render.$(OBJEXT)
src_hdfsee_OBJECTS = $(am_src_hdfsee_OBJECTS)
src_hdfsee_LDADD = $(LDADD)
src_hdfsee_DEPENDENCIES = $(top_builddir)/lib/libgnu.a \
......@@ -555,8 +557,8 @@ EXTRA_DIST = configure m4/gnulib-cache.m4 tests/first_merge_check \
tests/third_merge_check.hkl tests/fourth_merge_check.hkl \
src/dw-hdfsee.h src/hdfsee.h src/render_hkl.h \
src/post-refinement.h src/hrs-scaling.h src/scaling-report.h \
src/cl-utils.h $(crystfel_DATA) doc/twin-calculator.pdf \
doc/examples/lcls-dec.geom \
src/cl-utils.h src/hdfsee-render.h $(crystfel_DATA) \
doc/twin-calculator.pdf doc/examples/lcls-dec.geom \
doc/examples/lcls-june-r0013-r0128.geom \
doc/examples/lcls-xpp-estimate.geom doc/examples/simple.geom \
doc/examples/lcls-dec.beam doc/examples/lcls-june.beam \
......@@ -584,7 +586,7 @@ src_pattern_sim_SOURCES = src/pattern_sim.c src/diffraction.c \
src_process_hkl_SOURCES = src/process_hkl.c
src_indexamajig_SOURCES = src/indexamajig.c
@BUILD_HDFSEE_TRUE@src_hdfsee_SOURCES = src/hdfsee.c src/dw-hdfsee.c
@BUILD_HDFSEE_TRUE@src_hdfsee_SOURCES = src/hdfsee.c src/dw-hdfsee.c src/hdfsee-render.c
src_get_hkl_SOURCES = src/get_hkl.c
src_compare_hkl_SOURCES = src/compare_hkl.c
src_check_hkl_SOURCES = src/check_hkl.c
......@@ -764,6 +766,8 @@ src/hdfsee.$(OBJEXT): src/$(am__dirstamp) \
src/$(DEPDIR)/$(am__dirstamp)
src/dw-hdfsee.$(OBJEXT): src/$(am__dirstamp) \
src/$(DEPDIR)/$(am__dirstamp)
src/hdfsee-render.$(OBJEXT): src/$(am__dirstamp) \
src/$(DEPDIR)/$(am__dirstamp)
src/hdfsee$(EXEEXT): $(src_hdfsee_OBJECTS) $(src_hdfsee_DEPENDENCIES) src/$(am__dirstamp)
@rm -f src/hdfsee$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(src_hdfsee_OBJECTS) $(src_hdfsee_LDADD) $(LIBS)
......@@ -856,6 +860,7 @@ mostlyclean-compile:
-rm -f src/diffraction.$(OBJEXT)
-rm -f src/dw-hdfsee.$(OBJEXT)
-rm -f src/get_hkl.$(OBJEXT)
-rm -f src/hdfsee-render.$(OBJEXT)
-rm -f src/hdfsee.$(OBJEXT)
-rm -f src/hrs-scaling.$(OBJEXT)
-rm -f src/indexamajig.$(OBJEXT)
......@@ -884,6 +889,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/diffraction.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/dw-hdfsee.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/get_hkl.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/hdfsee-render.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/hdfsee.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/hrs-scaling.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/indexamajig.Po@am__quote@
......
lib_LTLIBRARIES = libcrystfel.la
lib_LTLIBRARIES = libcrystfel.la
LDADD = $(top_builddir)/lib/libgnu.a @IGNORE_UNUSED_LIBRARIES_CFLAGS@
libcrystfel_la_SOURCES = src/reflist.c src/utils.c src/cell.c src/detector.c \
src/thread-pool.c src/image.c src/hdf5-file.c \
......
......@@ -346,6 +346,7 @@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
lib_LTLIBRARIES = libcrystfel.la
LDADD = $(top_builddir)/lib/libgnu.a @IGNORE_UNUSED_LIBRARIES_CFLAGS@
libcrystfel_la_SOURCES = src/reflist.c src/utils.c src/cell.c src/detector.c \
src/thread-pool.c src/image.c src/hdf5-file.c \
src/beam-parameters.c src/geometry.c src/statistics.c \
......
......@@ -14,18 +14,10 @@
#endif
#ifdef HAVE_GTK
#include <gdk-pixbuf/gdk-pixbuf.h>
#endif
#include <stdlib.h>
#include <math.h>
#include <stdint.h>
#ifdef HAVE_TIFF
#include <tiffio.h>
#endif
#include "hdf5-file.h"
#include "render.h"
......@@ -149,294 +141,3 @@ void render_scale(double val, double max, int scale,
break;
}
}
#ifdef HAVE_GTK
static float *get_binned_panel(struct image *image, int binning,
int min_fs, int max_fs, int min_ss, int max_ss)
{
float *data;
int x, y;
int w, h;
int fw;
float *in;
fw = image->width;
in = image->data;
/* Some pixels might get discarded */
w = (max_fs - min_fs + 1) / binning;
h = (max_ss - min_ss + 1) / binning;
data = malloc(w*h*sizeof(float));
for ( x=0; x<w; x++ ) {
for ( y=0; y<h; y++ ) {
double total;
size_t xb, yb;
total = 0;
for ( xb=0; xb<binning; xb++ ) {
for ( yb=0; yb<binning; yb++ ) {
double v;
v = in[binning*x+xb+min_fs + (binning*y+yb+min_ss)*fw];
total += v;
}
}
data[x+w*y] = total / ((double)binning * (double)binning);
}
}
return data;
}
/* NB This function is shared between render_get_image() and
* render_get_colour_scale() */
static void render_free_data(guchar *data, gpointer p)
{
free(data);
}
static GdkPixbuf *render_panel(struct image *image,
int binning, int scale, double boost,
int min_fs, int max_fs, int min_ss, int max_ss)
{
int w, h;
guchar *data;
float *hdr;
int x, y;
double max;
int pw, ph;
int i;
/* Calculate panel width and height
* (add one because min and max are inclusive) */
pw = max_fs - min_fs + 1;
ph = max_ss - min_ss + 1;
w = pw / binning;
h = ph / binning;
/* High dynamic range version */
max = 0.0;
for ( i=0; i<image->width*image->height; i++ ) {
if ( image->data[i] > max ) max = image->data[i];
}
hdr = get_binned_panel(image, binning, min_fs, max_fs, min_ss, max_ss);
if ( hdr == NULL ) return NULL;
/* Rendered (colourful) version */
data = malloc(3*w*h);
if ( data == NULL ) {
free(hdr);
return NULL;
}
max /= boost;
if ( max <= 6 ) { max = 10; }
/* These x,y coordinates are measured relative to the bottom-left
* corner */
for ( y=0; y<h; y++ ) {
for ( x=0; x<w; x++ ) {
double val;
double r, g, b;
val = hdr[x+w*y];
render_scale(val, max, scale, &r, &g, &b);
/* Stuff inside square brackets makes this pixel go to
* the expected location in the pixbuf (which measures
* from the top-left corner */
data[3*( x+w*y )+0] = 255*r;
data[3*( x+w*y )+1] = 255*g;
data[3*( x+w*y )+2] = 255*b;
}
}
/* Finished with this */
free(hdr);
/* Create the pixbuf from the 8-bit display data */
return gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB, FALSE, 8,
w, h, w*3, render_free_data, NULL);
}
/* Render an image into multiple pixbufs according to geometry */
GdkPixbuf **render_panels(struct image *image,
int binning, int scale, double boost,
int *n_pixbufs)
{
int i;
int np = image->det->n_panels;
GdkPixbuf **pixbufs;
pixbufs = calloc(np, sizeof(GdkPixbuf*));
if ( pixbufs == NULL ) {
*n_pixbufs = 0;
return NULL;
}
for ( i=0; i<np; i++ ) {
pixbufs[i] = render_panel(image, binning, scale, boost,
image->det->panels[i].min_fs,
image->det->panels[i].max_fs,
image->det->panels[i].min_ss,
image->det->panels[i].max_ss);
}
*n_pixbufs = np;
return pixbufs;
}
GdkPixbuf *render_get_colour_scale(size_t w, size_t h, int scale)
{
guchar *data;
size_t x, y;
int max;
data = malloc(3*w*h);
if ( data == NULL ) return NULL;
max = h;
for ( y=0; y<h; y++ ) {
double r, g, b;
int val;
val = y;
render_scale(val, max, scale, &r, &g, &b);
data[3*( 0+w*(h-1-y) )+0] = 0;
data[3*( 0+w*(h-1-y) )+1] = 0;
data[3*( 0+w*(h-1-y) )+2] = 0;
for ( x=1; x<w; x++ ) {
data[3*( x+w*(h-1-y) )+0] = 255*r;
data[3*( x+w*(h-1-y) )+1] = 255*g;
data[3*( x+w*(h-1-y) )+2] = 255*b;
}
}
return gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB, FALSE, 8,
w, h, w*3, render_free_data, NULL);
}
int render_tiff_fp(struct image *image, const char *filename)
{
#ifdef HAVE_TIFF
TIFF *th;
float *line;
int y;
th = TIFFOpen(filename, "w");
if ( th == NULL ) return 1;
TIFFSetField(th, TIFFTAG_IMAGEWIDTH, image->width);
TIFFSetField(th, TIFFTAG_IMAGELENGTH, image->height);
TIFFSetField(th, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(th, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_IEEEFP);
TIFFSetField(th, TIFFTAG_BITSPERSAMPLE, 32);
TIFFSetField(th, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
TIFFSetField(th, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(th, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(th, TIFFTAG_ROWSPERSTRIP,
TIFFDefaultStripSize(th, image->width*4));
line = _TIFFmalloc(TIFFScanlineSize(th));
for ( y=0; y<image->height; y++ ) {
memcpy(line, &image->data[(image->height-1-y)*image->width],
image->width*4);
TIFFWriteScanline(th, line, y, 0);
}
_TIFFfree(line);
TIFFClose(th);
#else
STATUS("No TIFF support.\n");
#endif
return 0;
}
int render_tiff_int16(struct image *image, const char *filename, double boost)
{
#ifdef HAVE_TIFF
TIFF *th;
int16_t *line;
int x, y;
double max;
th = TIFFOpen(filename, "w");
if ( th == NULL ) return 1;
TIFFSetField(th, TIFFTAG_IMAGEWIDTH, image->width);
TIFFSetField(th, TIFFTAG_IMAGELENGTH, image->height);
TIFFSetField(th, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(th, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_INT); /* (signed) */
TIFFSetField(th, TIFFTAG_BITSPERSAMPLE, 16);
TIFFSetField(th, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
TIFFSetField(th, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(th, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(th, TIFFTAG_ROWSPERSTRIP,
TIFFDefaultStripSize(th, image->width*4));
line = _TIFFmalloc(TIFFScanlineSize(th));
max = 0.0;
for ( y=0; y<image->height; y++ ) {
for ( x=0;x<image->width; x++ ) {
double val;
val = image->data[x+image->height*y];
if ( val > max ) max = val;
}
}
max /= 32767.0;
for ( y=0; y<image->height; y++ ) {
for ( x=0;x<image->width; x++ ) {
double val;
val = image->data[x+(image->height-1-y)*image->width];
val *= ((double)boost/max);
/* Clamp to 16-bit range,
* and work round inability of most readers to deal
* with signed integers. */
val += 1000.0;
if ( val > 32767.0 ) val = 32767.0;
if ( val < 0.0 ) val = 0.0;
line[x] = val;
}
TIFFWriteScanline(th, line, y, 0);
}
_TIFFfree(line);
TIFFClose(th);
#else
STATUS("No TIFF support.\n");
#endif
return 0;
}
#endif /* HAVE_GTK */
......@@ -18,10 +18,6 @@
#define RENDER_H
#include <stddef.h>
#include "image.h"
enum {
SCALE_COLOUR,
SCALE_MONO,
......@@ -34,22 +30,4 @@ extern void render_scale(double val, double max, int scale,
double *rp, double *gp, double *bp);
#ifdef HAVE_GTK
#include <gdk-pixbuf/gdk-pixbuf.h>
extern GdkPixbuf **render_panels(struct image *image,
int binning, int scale, double boost,
int *n_pixbufs);
extern GdkPixbuf *render_get_colour_scale(size_t w, size_t h, int scale);
extern int render_tiff_fp(struct image *image, const char *filename);
extern int render_tiff_int16(struct image *image, const char *filename,
double boost);
#endif /* HAVE_GTK */
#endif /* RENDER_H */
......@@ -22,6 +22,7 @@
#include <gdk-pixbuf/gdk-pixbuf.h>
#include "dw-hdfsee.h"
#include "hdfsee-render.h"
#include "render.h"
#include "hdf5-file.h"
#include "hdfsee.h"
......
/*
* hdfsee-render.c
*
* Rendering bits for hdfsee
*
* (c) 2006-2011 Thomas White <taw@physics.org>
*
* Part of CrystFEL - crystallography with a FEL
*
*/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#ifdef HAVE_GTK
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <stdlib.h>
#include <math.h>
#include <stdint.h>
#ifdef HAVE_TIFF
#include <tiffio.h>
#endif
#include <render.h>
#include <image.h>
static float *get_binned_panel(struct image *image, int binning,
int min_fs, int max_fs, int min_ss, int max_ss)
{
float *data;
int x, y;
int w, h;
int fw;
float *in;
fw = image->width;
in = image->data;
/* Some pixels might get discarded */
w = (max_fs - min_fs + 1) / binning;
h = (max_ss - min_ss + 1) / binning;
data = malloc(w*h*sizeof(float));
for ( x=0; x<w; x++ ) {
for ( y=0; y<h; y++ ) {
double total;
size_t xb, yb;
total = 0;
for ( xb=0; xb<binning; xb++ ) {
for ( yb=0; yb<binning; yb++ ) {
double v;
v = in[binning*x+xb+min_fs + (binning*y+yb+min_ss)*fw];
total += v;
}
}
data[x+w*y] = total / ((double)binning * (double)binning);
}
}
return data;
}
/* NB This function is shared between render_get_image() and
* render_get_colour_scale() */
static void render_free_data(guchar *data, gpointer p)
{
free(data);
}
static GdkPixbuf *render_panel(struct image *image,
int binning, int scale, double boost,
int min_fs, int max_fs, int min_ss, int max_ss)
{
int w, h;
guchar *data;
float *hdr;
int x, y;
double max;
int pw, ph;
int i;
/* Calculate panel width and height
* (add one because min and max are inclusive) */
pw = max_fs - min_fs + 1;
ph = max_ss - min_ss + 1;
w = pw / binning;
h = ph / binning;
/* High dynamic range version */
max = 0.0;
for ( i=0; i<image->width*image->height; i++ ) {
if ( image->data[i] > max ) max = image->data[i];
}
hdr = get_binned_panel(image, binning, min_fs, max_fs, min_ss, max_ss);
if ( hdr == NULL ) return NULL;
/* Rendered (colourful) version */
data = malloc(3*w*h);
if ( data == NULL ) {
free(hdr);
return NULL;
}
max /= boost;
if ( max <= 6 ) { max = 10; }
/* These x,y coordinates are measured relative to the bottom-left
* corner */
for ( y=0; y<h; y++ ) {
for ( x=0; x<w; x++ ) {
double val;
double r, g, b;
val = hdr[x+w*y];
render_scale(val, max, scale, &r, &g, &b);
/* Stuff inside square brackets makes this pixel go to
* the expected location in the pixbuf (which measures
* from the top-left corner */
data[3*( x+w*y )+0] = 255*r;
data[3*( x+w*y )+1] = 255*g;
data[3*( x+w*y )+2] = 255*b;
}
}
/* Finished with this */
free(hdr);
/* Create the pixbuf from the 8-bit display data */
return gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB, FALSE, 8,
w, h, w*3, render_free_data, NULL);
}
/* Render an image into multiple pixbufs according to geometry */
GdkPixbuf **render_panels(struct image *image,
int binning, int scale, double boost,
int *n_pixbufs)
{
int i;
int np = image->det->n_panels;
GdkPixbuf **pixbufs;
pixbufs = calloc(np, sizeof(GdkPixbuf*));
if ( pixbufs == NULL ) {
*n_pixbufs = 0;
return NULL;
}
for ( i=0; i<np; i++ ) {
pixbufs[i] = render_panel(image, binning, scale, boost,
image->det->panels[i].min_fs,
image->det->panels[i].max_fs,
image->det->panels[i].min_ss,
image->det->panels[i].max_ss);