From e6335baf1632c98e502c4e030eea5385c74ca734 Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Fri, 24 Dec 2004 18:12:22 +0000 Subject: [PATCH] add matlab colormaps: hsv, bone, spring, summer, autumn, winter, cool, copper --- Common/ColorTable.cpp | 123 ++++++++++++++++++++++++++++++++++++--- Common/ColorTable.h | 5 ++ Common/Makefile | 4 +- Fltk/Colorbar_Window.cpp | 108 ++++++++++++++-------------------- Fltk/Makefile | 8 +-- 5 files changed, 172 insertions(+), 76 deletions(-) diff --git a/Common/ColorTable.cpp b/Common/ColorTable.cpp index f8b3f9f098..e39463f7dc 100644 --- a/Common/ColorTable.cpp +++ b/Common/ColorTable.cpp @@ -1,4 +1,4 @@ -// $Id: ColorTable.cpp,v 1.25 2004-12-24 04:58:20 geuzaine Exp $ +// $Id: ColorTable.cpp,v 1.26 2004-12-24 18:12:22 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -31,6 +31,7 @@ #include "Gmsh.h" #include "ColorTable.h" #include "Context.h" +#include "Numeric.h" extern Context_T CTX; @@ -97,6 +98,9 @@ void ColorTable_Recompute(GmshColorTable * ct) s = 1.0 - s; switch (ct->ipar[COLORTABLE_NUMBER]) { + case 0: // all black + r = g = b = 0; + break; case 1: // vis5d t = (curvature + 1.4) * (s - (1. + bias) / 2.); r = (int)(128.0 + 127.0 * atan(7.0 * t) / 1.57); @@ -128,7 +132,7 @@ void ColorTable_Recompute(GmshColorTable * ct) b = (int)(bb*255.); } break; - case 3: // samcef + case 3: // lucie, samcef (?) if(s - bias <= 0.) { r = 0; g = 0; @@ -171,8 +175,7 @@ void ColorTable_Recompute(GmshColorTable * ct) curvature = (curvature == 0.25) ? 0.26 : curvature; r = 0; g = 255; - b = - (int)(255. - (255. / (0.25 - curvature)) * (s - bias - 0.25 - curvature)); + b = (int)(255. - (255. / (0.25 - curvature)) * (s - bias - 0.25 - curvature)); } else if(s - bias <= 0.75 - curvature) { curvature = (curvature == 0.25) ? 0.26 : curvature; @@ -183,8 +186,7 @@ void ColorTable_Recompute(GmshColorTable * ct) else if(s - bias <= 1.) { curvature = (curvature == -0.25) ? -0.26 : curvature; r = 255; - g = - (int)(255. - (255. / (0.25 + curvature)) * (s - bias - 0.75 + curvature)); + g = (int)(255. - (255. / (0.25 + curvature)) * (s - bias - 0.75 + curvature)); b = 0; } else { @@ -261,7 +263,53 @@ void ColorTable_Recompute(GmshColorTable * ct) r = g = b = (int)(255 * (1. - curvature)); } break; - case 0: // all black + case 10: // all white + r = g = b = 255; + break; + case 11: // matlab "hsv" + { + double H = 6. * s + 1.e-10, R, G, B; + HSV_to_RGB(H, 1., 1., &R, &G, &B); + r = (int)(255 * R); + g = (int)(255 * G); + b = (int)(255 * B); + } + break; + case 12: // matlab "bone" + r = (int)(255. * (7.*gray(s-bias) + hot_b(s-bias))/8.); + g = (int)(255. * (7.*gray(s-bias) + hot_g(s-bias))/8.); + b = (int)(255. * (7.*gray(s-bias) + hot_r(s-bias))/8.); + break; + case 13: // matlab "spring" + r = (int)(255. * 1.); + g = (int)(255. * gray(s-bias)); + b = (int)(255. * (1. - gray(s-bias))); + break; + case 14: // matlab "summer" + r = (int)(255. * gray(s-bias)); + g = (int)(255. * (0.5+gray(s-bias)/2.)); + b = (int)(255. * 0.4); + break; + case 15: // matlab "autumn" + r = (int)(255. * 1.); + g = (int)(255. * gray(s-bias)); + b = (int)(255. * 0.); + break; + case 16: // matlab "winter" + r = (int)(255. * 0.); + g = (int)(255. * gray(s-bias)); + b = (int)(255. * (0.5+(1.-gray(s-bias))/2.)); + break; + case 17: // matlab "cool" + r = (int)(255. * gray(s-bias)); + g = (int)(255. * (1.-gray(s-bias))); + b = (int)(255. * 1.); + break; + case 18: // matlab "copper" + r = (int)(255. * DMIN(1., gray(s-bias) * 1.25)); + g = (int)(255. * DMIN(1., gray(s-bias) * 0.7812)); + b = (int)(255. * DMIN(1., gray(s-bias) * 0.4975)); + break; default: r = g = b = 0; break; @@ -362,3 +410,64 @@ int ColorTable_IsAlpha(GmshColorTable * ct) return 0; } +// HSV/RBG conversion routines + +#define UNDEFINED 0 + +// rgb on [0, 1], sv returned on [0, 1] and h on [0, 6]. +// Exception: h is returned UNDEFINED if S==0. + +#define RETURN_HSV(h,s,v) {*H=h; *S=s; *V=v; return;} + +void RGB_to_HSV(double R, double G, double B, + double *H, double *S, double *V) +{ + double v, x, f; + int i; + + x = DMIN(DMIN(R, G), B); + v = DMAX(DMAX(R, G), B); + if(v == x) + RETURN_HSV(UNDEFINED, 0, v); + f = (R == x) ? G - B : ((G == x) ? B - R : R - G); + i = (R == x) ? 3 : ((G == x) ? 5 : 1); + RETURN_HSV(i - f / (v - x), (v - x) / v, v); +} + +// h given on [0, 6] or UNDEFINED. s and v given on [0, 1]. +// rgb each returned on [0, 1]. + +#define RETURN_RGB(r,g,b) {*R=r; *G=g; *B=b; return;} + +void HSV_to_RGB(double H, double S, double V, + double *R, double *G, double *B) +{ + double m, n, f; + int i; + + if(H == UNDEFINED) + RETURN_RGB(V, V, V); + i = (int)floor(H); + f = H - i; + if(!(i & 1)) + f = 1 - f; // if i is even + m = V * (1 - S); + n = V * (1 - S * f); + + switch (i) { + case 6: + case 0: + RETURN_RGB(V, n, m); + case 1: + RETURN_RGB(n, V, m); + case 2: + RETURN_RGB(m, V, n); + case 3: + RETURN_RGB(m, n, V); + case 4: + RETURN_RGB(n, m, V); + case 5: + RETURN_RGB(V, m, n); + } +} + diff --git a/Common/ColorTable.h b/Common/ColorTable.h index 8a75deb671..57357afda7 100644 --- a/Common/ColorTable.h +++ b/Common/ColorTable.h @@ -58,4 +58,9 @@ void ColorTable_Print(GmshColorTable *ct, FILE *fp) ; int ColorTable_IsAlpha(GmshColorTable *ct) ; int ColorTable_Diff(GmshColorTable *ct1, GmshColorTable *ct2); +void RGB_to_HSV(double R, double G, double B, + double *H, double *S, double *V); +void HSV_to_RGB(double H, double S, double V, + double *R, double *G, double *B); + #endif diff --git a/Common/Makefile b/Common/Makefile index 40a2ed0226..3c125233f8 100644 --- a/Common/Makefile +++ b/Common/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.68 2004-12-09 02:57:03 geuzaine Exp $ +# $Id: Makefile,v 1.69 2004-12-24 18:12:22 geuzaine Exp $ # # Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle # @@ -102,7 +102,7 @@ CommandLine.o: CommandLine.cpp Gmsh.h Message.h ../DataStr/Malloc.h \ Timer.o: Timer.cpp ColorTable.o: ColorTable.cpp Gmsh.h Message.h ../DataStr/Malloc.h \ ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \ - ColorTable.h Context.h + ColorTable.h Context.h ../Numeric/Numeric.h Visibility.o: Visibility.cpp Gmsh.h Message.h ../DataStr/Malloc.h \ ../DataStr/List.h ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \ ../Geo/Geo.h ../Geo/CAD.h ../Mesh/Mesh.h ../Mesh/Vertex.h \ diff --git a/Fltk/Colorbar_Window.cpp b/Fltk/Colorbar_Window.cpp index 43ea8179f0..ec60e07f78 100644 --- a/Fltk/Colorbar_Window.cpp +++ b/Fltk/Colorbar_Window.cpp @@ -1,4 +1,4 @@ -// $Id: Colorbar_Window.cpp,v 1.41 2004-12-24 05:32:53 geuzaine Exp $ +// $Id: Colorbar_Window.cpp,v 1.42 2004-12-24 18:12:22 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -26,7 +26,6 @@ #include "Gmsh.h" #include "GmshUI.h" -#include "Numeric.h" #include "GUI.h" #include "ColorTable.h" #include "Colorbar_Window.h" @@ -34,7 +33,6 @@ extern Context_T CTX; -#define UNDEFINED 0 #define EPS 1.e-10 // This file defines the Colorbar_Window class (subclass of Fl_Window) @@ -54,65 +52,6 @@ Colorbar_Window::Colorbar_Window(int x, int y, int w, int h, const char *l) minval = maxval = 0.0; } - -// rgb on [0, 1], sv returned on [0, 1] and h on [0, 6]. -// Exception: h is returned UNDEFINED if S==0. - -#define RETURN_HSV(h,s,v) {*H=h; *S=s; *V=v; return;} - -static void RGB_to_HSV(double R, double G, double B, - double *H, double *S, double *V) -{ - double v, x, f; - int i; - - x = DMIN(DMIN(R, G), B); - v = DMAX(DMAX(R, G), B); - if(v == x) - RETURN_HSV(UNDEFINED, 0, v); - f = (R == x) ? G - B : ((G == x) ? B - R : R - G); - i = (R == x) ? 3 : ((G == x) ? 5 : 1); - RETURN_HSV(i - f / (v - x), (v - x) / v, v); -} - -// h given on [0, 6] or UNDEFINED. s and v given on [0, 1]. -// rgb each returned on [0, 1]. - -#define RETURN_RGB(r,g,b) {*R=r; *G=g; *B=b; return;} - -static void HSV_to_RGB(double H, double S, double V, - double *R, double *G, double *B) -{ - double m, n, f; - int i; - - if(H == UNDEFINED) - RETURN_RGB(V, V, V); - i = (int)floor(H); - f = H - i; - if(!(i & 1)) - f = 1 - f; // if i is even - m = V * (1 - S); - n = V * (1 - S * f); - - switch (i) { - case 6: - case 0: - RETURN_RGB(V, n, m); - case 1: - RETURN_RGB(n, V, m); - case 2: - RETURN_RGB(m, V, n); - case 3: - RETURN_RGB(m, n, V); - case 4: - RETURN_RGB(n, m, V); - case 5: - RETURN_RGB(V, m, n); - } -} - - // Convert window X coordinate to color table index int Colorbar_Window::x_to_index(int x) @@ -287,7 +226,10 @@ void Colorbar_Window::redraw_range(int a, int b) int xx0 = 10, xx1 = 12 * font_height, yy0 = 10; if(help_flag) { i = 0; - fl_draw("0, 1, 2, ..., 9", xx0, yy0 + (i + 1) * font_height); + fl_draw("0, 1, 2, 3, ...", xx0, yy0 + (i + 1) * font_height); + fl_draw("select predefined colormap", xx1, yy0 + (i + 1) * font_height); + i++; + fl_draw("Ctrl+0, Ctrl+1, ...", xx0, yy0 + (i + 1) * font_height); fl_draw("select predefined colormap", xx1, yy0 + (i + 1) * font_height); i++; fl_draw("mouse1", xx0, yy0 + (i + 1) * font_height); @@ -461,6 +403,46 @@ int Colorbar_Window::handle(int event) ColorTable_InitParam(9, ct); compute = 1; } + else if(Fl::test_shortcut(FL_CTRL + '0')) { + ColorTable_InitParam(10, ct); + compute = 1; + } + else if(Fl::test_shortcut(FL_CTRL + '1')) { + ColorTable_InitParam(11, ct); + compute = 1; + } + else if(Fl::test_shortcut(FL_CTRL + '2')) { + ColorTable_InitParam(12, ct); + compute = 1; + } + else if(Fl::test_shortcut(FL_CTRL + '3')) { + ColorTable_InitParam(13, ct); + compute = 1; + } + else if(Fl::test_shortcut(FL_CTRL + '4')) { + ColorTable_InitParam(14, ct); + compute = 1; + } + else if(Fl::test_shortcut(FL_CTRL + '5')) { + ColorTable_InitParam(15, ct); + compute = 1; + } + else if(Fl::test_shortcut(FL_CTRL + '6')) { + ColorTable_InitParam(16, ct); + compute = 1; + } + else if(Fl::test_shortcut(FL_CTRL + '7')) { + ColorTable_InitParam(17, ct); + compute = 1; + } + else if(Fl::test_shortcut(FL_CTRL + '8')) { + ColorTable_InitParam(18, ct); + compute = 1; + } + else if(Fl::test_shortcut(FL_CTRL + '9')) { + ColorTable_InitParam(19, ct); + compute = 1; + } else if(Fl::test_shortcut('c')) { ColorTable_Copy(ct); } diff --git a/Fltk/Makefile b/Fltk/Makefile index 5eb095384a..3c645f7b20 100644 --- a/Fltk/Makefile +++ b/Fltk/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.61 2004-12-06 04:59:08 geuzaine Exp $ +# $Id: Makefile,v 1.62 2004-12-24 18:12:22 geuzaine Exp $ # # Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle # @@ -136,9 +136,9 @@ Opengl_Window.o: Opengl_Window.cpp ../Common/Gmsh.h ../Common/Message.h \ Colorbar_Window.o: Colorbar_Window.cpp ../Common/Gmsh.h \ ../Common/Message.h ../DataStr/Malloc.h ../DataStr/List.h \ ../DataStr/Tree.h ../DataStr/avl.h ../DataStr/Tools.h \ - ../Common/GmshUI.h ../Numeric/Numeric.h GUI.h Opengl_Window.h \ - ../Mesh/Mesh.h ../Mesh/Vertex.h ../Mesh/Element.h ../Mesh/Simplex.h \ - ../Mesh/Face.h ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/STL.h \ + ../Common/GmshUI.h GUI.h Opengl_Window.h ../Mesh/Mesh.h \ + ../Mesh/Vertex.h ../Mesh/Element.h ../Mesh/Simplex.h ../Mesh/Face.h \ + ../Mesh/Edge.h ../Geo/ExtrudeParams.h ../Mesh/STL.h \ ../Common/VertexArray.h ../Common/SmoothNormals.h ../Mesh/Metric.h \ ../Mesh/Matrix.h Colorbar_Window.h ../Common/ColorTable.h File_Picker.h \ ../Common/Context.h -- GitLab