Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Oleksii Turkot
CrystFEL
Commits
d3ec6617
Commit
d3ec6617
authored
Nov 15, 2011
by
Thomas White
Browse files
Remove libcrystfel dependency on GTK et al.
parent
c4c31271
Changes
9
Hide whitespace changes
Inline
Side-by-side
Makefile.am
View file @
d3ec6617
...
...
@@ -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
...
...
Makefile.in
View file @
d3ec6617
...
...
@@ -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@
...
...
libcrystfel/Makefile.am
View file @
d3ec6617
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
\
...
...
libcrystfel/Makefile.in
View file @
d3ec6617
...
...
@@ -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
\
...
...
libcrystfel/src/render.c
View file @
d3ec6617
...
...
@@ -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 */
libcrystfel/src/render.h
View file @
d3ec6617
...
...
@@ -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 */
src/dw-hdfsee.c
View file @
d3ec6617
...
...
@@ -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"
...
...
src/hdfsee-render.c
0 → 100644
View file @
d3ec6617
/*
* 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
);