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

render_hkl: Use colour scale if requested

parent 9b082034
......@@ -47,7 +47,7 @@ powder_plot_SOURCES = powder_plot.c cell.c utils.c image.c hdf5-file.c \
powder_plot_LDADD = @LIBS@
render_hkl_SOURCES = render_hkl.c cell.c reflections.c utils.c povray.c \
symmetry.c
symmetry.c render.c hdf5-file.c image.c filters.c
render_hkl_LDADD = @LIBS@
calibrate_detector_SOURCES = calibrate_detector.c utils.c hdf5-file.c image.c \
......
......@@ -109,7 +109,8 @@ process_hkl_OBJECTS = $(am_process_hkl_OBJECTS)
process_hkl_DEPENDENCIES =
am_render_hkl_OBJECTS = render_hkl.$(OBJEXT) cell.$(OBJEXT) \
reflections.$(OBJEXT) utils.$(OBJEXT) povray.$(OBJEXT) \
symmetry.$(OBJEXT)
symmetry.$(OBJEXT) render.$(OBJEXT) hdf5-file.$(OBJEXT) \
image.$(OBJEXT) filters.$(OBJEXT)
render_hkl_OBJECTS = $(am_render_hkl_OBJECTS)
render_hkl_DEPENDENCIES =
DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
......@@ -263,7 +264,7 @@ powder_plot_SOURCES = powder_plot.c cell.c utils.c image.c hdf5-file.c \
powder_plot_LDADD = @LIBS@
render_hkl_SOURCES = render_hkl.c cell.c reflections.c utils.c povray.c \
symmetry.c
symmetry.c render.c hdf5-file.c image.c filters.c
render_hkl_LDADD = @LIBS@
calibrate_detector_SOURCES = calibrate_detector.c utils.c hdf5-file.c image.c \
......
......@@ -101,12 +101,11 @@ float *render_get_image_binned(DisplayWindow *dw, int binning, float *max)
}
static inline void render_rgb(float val, float max,
guchar *rp, guchar *gp, guchar *bp)
static void render_rgb(float val, float max, float *rp, float *gp, float *bp)
{
int s;
float p;
guchar r, g, b;
float r, g, b;
s = val / (max/6);
p = fmod(val, max/6);
......@@ -123,31 +122,31 @@ static inline void render_rgb(float val, float max,
}
switch ( s ) {
case 0 : { /* Black to blue */
r = 0; g = 0; b = p*255;
r = 0; g = 0; b = p;
break;
}
case 1 : { /* Blue to pink */
r = 255*p; g = 0; b = 255;
r = p; g = 0; b = 1.0;
break;
}
case 2 : { /* Pink to red */
r = 255; g = 0; b = (1-p)*255;
r = 1.0; g = 0; b = (1.0-p)*1.0;
break;
}
case 3 : { /* Red to Orange */
r = 255; g = 127*p; b = 0;
r = 1.0; g = 0.5*p; b = 0;
break;
}
case 4 : { /* Orange to Yellow */
r = 255; g = 127 + 127*p; b = 0;
r = 1.0; g = 0.5 + 0.5*p; b = 0;
break;
}
case 5 : { /* Yellow to White */
r = 255; g = 255; b = 255*p;
r = 1.0; g = 1.0; b = 1.0*p;
break;
}
case 6 : { /* Pixel has hit the maximum value */
r = 255; g = 255; b = 255;
r = 1.0; g = 1.0; b = 1.0;
break;
}
}
......@@ -158,30 +157,46 @@ static inline void render_rgb(float val, float max,
}
static inline void render_mono(float val, float max,
guchar *rp, guchar *gp, guchar *bp)
static void render_mono(float val, float max, float *rp, float *gp, float *bp)
{
float p;
p = (float)val / (float)max;
p = val / max;
if ( val < 0.0 ) p = 0.0;
if ( val > max ) p = 1.0;
*rp = 255.0*p;
*gp = 255.0*p;
*bp = 255.0*p;
*rp = p;
*gp = p;
*bp = p;
}
static inline void render_invmono(float val, float max,
guchar *rp, guchar *gp, guchar *bp)
static void render_invmono(float val, float max,
float *rp, float *gp, float *bp)
{
float p;
p = (float)val / (float)max;
p = val / max;
p = 1.0 - p;
if ( val < 0.0 ) p = 1.0;
if ( val > max ) p = 0.0;
*rp = 255.0*p;
*gp = 255.0*p;
*bp = 255.0*p;
*rp = p;
*gp = p;
*bp = p;
}
void render_scale(float val, float max, int scale,
float *rp, float *gp, float *bp)
{
switch ( scale ) {
case SCALE_COLOUR :
render_rgb(val, max, rp, gp, bp);
break;
case SCALE_MONO :
render_mono(val, max, rp, gp, bp);
break;
case SCALE_INVMONO :
render_invmono(val, max, rp, gp, bp);
break;
}
}
......@@ -269,32 +284,17 @@ GdkPixbuf *render_get_image(DisplayWindow *dw)
for ( x=0; x<w; x++ ) {
float val;
guchar r = 0;
guchar g = 0;
guchar b = 0;
float r, g, b;
val = hdr[x+w*y];
switch ( dw->scale ) {
case SCALE_COLOUR : {
render_rgb(val, max, &r, &g, &b);
break;
}
case SCALE_MONO : {
render_mono(val, max, &r, &g, &b);
break;
}
case SCALE_INVMONO : {
render_invmono(val, max, &r, &g, &b);
break;
}
}
render_scale(val, max, dw->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*(h-1-y) )+0] = r;
data[3*( x+w*(h-1-y) )+1] = g;
data[3*( x+w*(h-1-y) )+2] = b;
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;
}
}
......@@ -322,35 +322,20 @@ GdkPixbuf *render_get_colour_scale(size_t w, size_t h, int scale)
for ( y=0; y<h; y++ ) {
guchar r = 0;
guchar g = 0;
guchar b = 0;
float r, g, b;
int val;
val = y;
switch ( scale ) {
case SCALE_COLOUR : {
render_rgb(val, max, &r, &g, &b);
break;
}
case SCALE_MONO : {
render_mono(val, max, &r, &g, &b);
break;
}
case SCALE_INVMONO : {
render_invmono(val, max, &r, &g, &b);
break;
}
}
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] = r;
data[3*( x+w*(h-1-y) )+1] = g;
data[3*( x+w*(h-1-y) )+2] = b;
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;
}
}
......@@ -421,30 +406,15 @@ int render_png(DisplayWindow *dw, const char *filename)
for ( x=0; x<w; x++ ) {
guchar r = 0;
guchar g = 0;
guchar b = 0;
float r, g, b;
float val;
val = hdr[x+w*y];
switch ( dw->scale ) {
case SCALE_COLOUR : {
render_rgb(val, max, &r, &g, &b);
break;
}
case SCALE_MONO : {
render_mono(val, max, &r, &g, &b);
break;
}
case SCALE_INVMONO : {
render_invmono(val, max, &r, &g, &b);
break;
}
}
row_pointers[y][3*x] = (png_byte)r;
row_pointers[y][3*x+1] = (png_byte)g;
row_pointers[y][3*x+2] = (png_byte)b;
render_scale(val, max, dw->scale, &r, &g, &b);
row_pointers[y][3*x] = (png_byte)255*r;
row_pointers[y][3*x+1] = (png_byte)255*g;
row_pointers[y][3*x+2] = (png_byte)255*b;
}
}
......
......@@ -30,6 +30,9 @@ enum {
SCALE_INVMONO
};
extern void render_scale(float val, float max, int scale,
float *rp, float *gp, float *bp);
extern GdkPixbuf *render_get_image(DisplayWindow *dw);
extern GdkPixbuf *render_get_colour_scale(size_t w, size_t h, int scale);
......
......@@ -29,6 +29,7 @@
#include "reflections.h"
#include "povray.h"
#include "symmetry.h"
#include "render.h"
enum {
WGHT_I,
......@@ -66,7 +67,7 @@ static void show_help(const char *s)
#ifdef HAVE_CAIRO
static void render_za(UnitCell *cell, double *ref, unsigned int *c,
double boost, const char *sym, int wght)
double boost, const char *sym, int wght, int colscale)
{
cairo_surface_t *surface;
cairo_t *dctx;
......@@ -217,12 +218,11 @@ static void render_za(UnitCell *cell, double *ref, unsigned int *c,
abort();
}
val = boost*val/max_val;
nequiv = num_equivs(h, k, 0, sym);
for ( p=0; p<nequiv; p++ ) {
signed int he, ke, le;
float r, g, b;
get_equiv(h, k, 0, &he, &ke, &le, sym, p);
u = (double)he*as*sin(theta);
......@@ -232,7 +232,8 @@ static void render_za(UnitCell *cell, double *ref, unsigned int *c,
((double)ht/2)+v*scale, max_r,
0, 2*M_PI);
cairo_set_source_rgb(dctx, val, val, val);
render_scale(val, max_val/boost, colscale, &r, &g, &b);
cairo_set_source_rgb(dctx, r, g, b);
cairo_fill(dctx);
}
......@@ -300,6 +301,8 @@ int main(int argc, char *argv[])
char *sym = NULL;
char *weighting = NULL;
int wght;
int colscale;
char *cscale = NULL;
/* Long options */
const struct option longopts[] = {
......@@ -310,12 +313,14 @@ int main(int argc, char *argv[])
{"boost", 1, NULL, 'b'},
{"symmetry", 1, NULL, 'y'},
{"weighting", 1, NULL, 'w'},
{"colscale", 1, NULL, 'c'},
{"counts", 0, &config_sqrt, 1},
{0, 0, NULL, 0}
};
/* Short options */
while ((c = getopt_long(argc, argv, "hj:p:w:", longopts, NULL)) != -1) {
while ((c = getopt_long(argc, argv, "hj:p:w:c:y:",
longopts, NULL)) != -1) {
switch (c) {
case 'h' :
......@@ -342,6 +347,10 @@ int main(int argc, char *argv[])
weighting = strdup(optarg);
break;
case 'c' :
cscale = strdup(optarg);
break;
case 0 :
break;
......@@ -381,6 +390,25 @@ int main(int argc, char *argv[])
ERROR("Unrecognised weighting '%s'\n", weighting);
return 1;
}
free(weighting);
if ( cscale == NULL ) {
cscale = strdup("mono");
}
if ( strcmp(cscale, "mono") == 0 ) {
colscale = SCALE_MONO;
} else if ( strcmp(cscale, "invmono") == 0 ) {
colscale = SCALE_INVMONO;
} else if ( strcmp(cscale, "colour") == 0 ) {
colscale = SCALE_COLOUR;
} else if ( strcmp(cscale, "color") == 0 ) {
colscale = SCALE_COLOUR;
} else {
ERROR("Unrecognised colour scale '%s'\n", cscale);
return 1;
}
free(cscale);
infile = argv[optind];
......@@ -400,7 +428,7 @@ int main(int argc, char *argv[])
r = povray_render_animation(cell, ref, cts, nproc);
} else if ( config_zoneaxis ) {
#ifdef HAVE_CAIRO
render_za(cell, ref, cts, boost, sym, wght);
render_za(cell, ref, cts, boost, sym, wght, colscale);
#else
ERROR("This version of CrystFEL was compiled without Cairo");
ERROR(" support, which is required to plot a zone axis");
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment