/* Copyright (c) 2008-2018 Jan W. Krieger (<jan@jkrieger.de>) This software is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program 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 (LGPL) for more details. You should have received a copy of the GNU Lesser General Public License (LGPL) along with this program. If not, see <http://www.gnu.org/licenses/>. */ #include "jkqtplottertools/jkqtpimagetools.h" #include <QPainter> #include <QApplication> #include <QDir> #include <QFileInfo> #ifndef NO_JKQTPLOTTER #include "jkqtplotter/jkqtpbaseelements.h" #include "jkqtplotter/jkqtpbaseplotter.h" #endif #ifdef QT_XML_LIB # include <QtXml/QtXml> #endif #define JKQTP_PALETTE_ICON_WIDTH 64 #define JKQTP_PALETTE_IMAGEICON_HEIGHT 64 QList<int*> global_jkqtpimagetools_lutstore = QList<int*>(); bool JKQTPimagePlot_buildDefinedPaletteLessThan(const QPair<double, QRgb> &s1, const QPair<double, QRgb> &s2) { return s1.first<s2.first; } void JKQTPimagePlot_buildDefinedPaletteLinInterpolate(int* lut, QList<QPair<double, QRgb> > items, int lut_size) { qSort(items.begin(), items.end(), JKQTPimagePlot_buildDefinedPaletteLessThan); double dmin=items.first().first; double dmax=items.last().first; double delta=(dmax-dmin)/double(lut_size); int i=0; int j=0; for (double v=dmin; v<=dmax; v=v+delta) { double r=0; double g=0; double b=0; if (j+1<items.size()) { double del=items[j+1].first-items[j].first; double rel=(v-items[j].first)/del; r=double(qRed(items[j].second))+rel*(double(qRed(items[j+1].second))-double(qRed(items[j].second))); g=double(qGreen(items[j].second))+rel*(double(qGreen(items[j+1].second))-double(qGreen(items[j].second))); b=double(qBlue(items[j].second))+rel*(double(qBlue(items[j+1].second))-double(qBlue(items[j].second))); while (j+1<items.size() && v>=items[j+1].first) j++; } else { r=double(qRed(items.last().second)); g=double(qGreen(items.last().second)); b=double(qBlue(items.last().second)); } if (i<=lut_size) lut[i]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); i++; } } void JKQTPimagePlot_buildDefinedPaletteLinInterpolate(int* lut, int N, ...) { QList<QPair<double, QRgb> > items; va_list args; va_start(args, N); for (int i=0; i<N; i++) { double colval=va_arg(args, double); QRgb col=va_arg(args,QRgb); items<<qMakePair(colval, col); } va_end(args); JKQTPimagePlot_buildDefinedPaletteLinInterpolate(lut, items); } void JKQTPimagePlot_buildDefinedPalette(int* lut, QList<QPair<double, QRgb> > items) { qSort(items.begin(), items.end(), JKQTPimagePlot_buildDefinedPaletteLessThan); double dmin=items.first().first; double dmax=items.last().first; double delta=(dmax-dmin)/double(JKQTPimagePlot_LUTSIZE); int i=0; int j=0; for (double v=dmin; v<=dmax; v=v+delta) { double r=0; double g=0; double b=0; if (j+1<items.size()) { r=qRed(items[j].second); g=qGreen(items[j].second); b=qBlue(items[j].second); while (j+1<items.size() && v>=items[j+1].first) j++; } if (i<=JKQTPimagePlot_LUTSIZE) lut[i]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); i++; } } void JKQTPimagePlot_buildDefinedPalette(int* lut, int N, ...) { QList<QPair<double, QRgb> > items; va_list args; va_start(args, N); for (int i=0; i<N; i++) { double colval=va_arg(args, double); QRgb col=va_arg(args,QRgb); items<<qMakePair(colval, col); } va_end(args); JKQTPimagePlot_buildDefinedPalette(lut, items); } double JKQTPimagePlot_QStringToDouble(QString value) { QString v=value; if (value.contains(',')) { v=value.replace(',', '.'); } QLocale loc=QLocale::c(); loc.setNumberOptions(QLocale::OmitGroupSeparator); return loc.toDouble(v) ; } static QStringList JKQTPimagePlot_palettesSearchPaths=QStringList(); static QMap<int, QList<QPair<double, QRgb> > > JKQTPimagePlot_lutsFromFiles; template <class T1, class T2> bool JKQTPimagePlot_QPairCompareFirst(const QPair<T1, T2> &s1, const QPair<T1, T2> &s2) { return s1.first < s2.first; } QStringList JKQTPimagePlot_getPredefinedPalettes() { static QStringList sl; if (JKQTPimagePlot_palettesSearchPaths.isEmpty()) { JKQTPimagePlot_palettesSearchPaths<<":/colorpalettes/"; JKQTPimagePlot_palettesSearchPaths<<(QApplication::applicationDirPath()+"/colorpalettes/"); JKQTPimagePlot_palettesSearchPaths<<(QApplication::applicationDirPath()+"/assets/colorpalettes/"); } if (sl.size()<=0) { sl<<QObject::tr("gray"); sl<<QObject::tr("inv. gray"); sl<<QObject::tr("red"); sl<<QObject::tr("inv. red"); sl<<QObject::tr("green"); sl<<QObject::tr("inv. green"); sl<<QObject::tr("blue"); sl<<QObject::tr("inv. blue"); sl<<QObject::tr("cyan"); sl<<QObject::tr("inv. cyan"); sl<<QObject::tr("yellow"); sl<<QObject::tr("inv. yellow"); sl<<QObject::tr("magenta"); sl<<QObject::tr("inv. magenta"); sl<<QObject::tr("Matlab"); sl<<QObject::tr("inv. Matlab"); sl<<QObject::tr("RYGB"); sl<<QObject::tr("inv. RYGB"); sl<<QObject::tr("HSV"); sl<<QObject::tr("inv. HSV"); sl<<QObject::tr("rainbow"); sl<<QObject::tr("inv. rainbow"); sl<<QObject::tr("AFM hot"); sl<<QObject::tr("inv. AFM hot"); sl<<QObject::tr("ocean"); sl<<QObject::tr("inv. ocean"); sl<<QObject::tr("trafficlight"); sl<<QObject::tr("inv. trafficl."); sl<<QObject::tr("BlMaYe"); sl<<QObject::tr("YeMaBl"); sl<<QObject::tr("BlYe"); sl<<QObject::tr("YeBl"); sl<<QObject::tr("blue-white-red"); sl<<QObject::tr("red-white-blue"); sl<<QObject::tr("BBlRdYe"); sl<<QObject::tr("GnRdVi"); sl<<QObject::tr("BW print"); sl<<QObject::tr("inv. BW print"); sl<<QObject::tr("BrBG"); sl<<QObject::tr("PuOr"); sl<<QObject::tr("green-blue"); sl<<QObject::tr("blue-green"); sl<<QObject::tr("YeGnBu"); sl<<QObject::tr("steps: BrBG"); sl<<QObject::tr("steps: PuOr"); sl<<QObject::tr("steps: GnBl"); sl<<QObject::tr("steps: BlGn"); sl<<QObject::tr("steps: YeGnBu"); sl<<QObject::tr("cyan-white"); sl<<QObject::tr("white-cyan"); sl<<QObject::tr("yellow-white"); sl<<QObject::tr("white-yellow"); sl<<QObject::tr("magenta-white"); sl<<QObject::tr("white-magenta"); sl<<QObject::tr("blue-green-red"); sl<<QObject::tr("red-green-blue"); sl<<QObject::tr("magenta-yellow"); sl<<QObject::tr("yellow-magenta"); sl<<QObject::tr("red-blue"); sl<<QObject::tr("blue-red"); //sl<<QObject::tr(""); #ifdef QT_XML_LIB int palID=sl.size(); #endif for (int i=0; i<JKQTPimagePlot_palettesSearchPaths.size(); i++) { QDir d(JKQTPimagePlot_palettesSearchPaths[i]); QStringList nameFilters; nameFilters<<"*.pal"; nameFilters<<"*.rgb"; nameFilters<<"*.csv"; #ifdef QT_XML_LIB nameFilters<<"*.xml"; #endif QFileInfoList l=d.entryInfoList(nameFilters); for (int j=0; j<l.size(); j++) { QString ext=l[j].suffix().toLower(); if (ext=="rgb" || ext=="pal" || ext=="csv") { QFile file(l[j].absoluteFilePath()); if (file.open(QIODevice::ReadOnly|QIODevice::Text)) { QString txt=file.readAll(); QStringList slt=txt.split('\n'); bool has4=false; bool rgb255=false; QList<QPair<double, QRgb> > pal; QRegExp rx3("\\s*([0-9eE.+-]+)\\s*([,\\t ])\\s*([0-9eE.+-]+)\\s*\\2\\s*([0-9eE.+-]+)\\s*", Qt::CaseInsensitive); rx3.setMinimal(false); QRegExp rx4("\\s*([0-9eE.+-]+)\\s*([,\\t ])\\s*([0-9eE.+-]+)\\s*\\2\\s*([0-9eE.+-]+)\\s*\\2\\s*([0-9eE.+-]+)\\s*", Qt::CaseInsensitive); rx4.setMinimal(false); // determine format for (int i=slt.size()-1; i>=0; i--) { slt[i]=slt[i].trimmed(); if (rx4.indexIn(slt[i])>=0) { has4=true; double r=JKQTPimagePlot_QStringToDouble(rx4.cap(3)); double g=JKQTPimagePlot_QStringToDouble(rx4.cap(4)); double b=JKQTPimagePlot_QStringToDouble(rx4.cap(5)); if (r>1.0 || g>1.0 || b>1.0) { rgb255=true; } } else if (rx3.indexIn(slt[i])>=0) { has4=false; double r=JKQTPimagePlot_QStringToDouble(rx3.cap(1)); double g=JKQTPimagePlot_QStringToDouble(rx3.cap(3)); double b=JKQTPimagePlot_QStringToDouble(rx3.cap(4)); if (r>1.0 || g>1.0 || b>1.0) { rgb255=true; } } else { slt.removeAt(i); } } // read data bool ok=true; for (int i=0; i<slt.size(); i++) { double x=0; double r=0, g=0, b=0; if (has4 && rx4.indexIn(slt[i])>=0) { x=JKQTPimagePlot_QStringToDouble(rx4.cap(1)); r=JKQTPimagePlot_QStringToDouble(rx4.cap(3)); g=JKQTPimagePlot_QStringToDouble(rx4.cap(4)); b=JKQTPimagePlot_QStringToDouble(rx4.cap(5)); } else if (!has4 && rx3.indexIn(slt[i])>=0) { x=i; r=JKQTPimagePlot_QStringToDouble(rx3.cap(1)); g=JKQTPimagePlot_QStringToDouble(rx3.cap(3)); b=JKQTPimagePlot_QStringToDouble(rx3.cap(4)); //qDebug()<<r<<g<<b; } else { ok=false; break; } if (ok) { if (!rgb255) { pal<<qMakePair(x, qRgb(qBound(0,(int)round(255*r), 255), qBound(0,(int)round(255*g), 255), qBound(0,(int)round(255*b), 255))); } else { pal<<qMakePair(x, qRgb(qBound(0,(int)round(r), 255), qBound(0,(int)round(g), 255), qBound(0,(int)round(b), 255))); } } } //qDebug()<<"read: "<<l[j].fileName()<<": size="<<pal.size()<<" ok="<<ok<<" has4="<<has4<<" rgb255="<<rgb255; if (ok && pal.size()>1) { sl<<l[j].fileName(); qStableSort(pal.begin(), pal.end(), JKQTPimagePlot_QPairCompareFirst<double, QRgb>); JKQTPimagePlot_lutsFromFiles[sl.size()-1]=pal; //qDebug()<<" added as "<<sl.size()-1; #ifdef QT_XML_LIB palID=l.size(); #endif } } #ifdef QT_XML_LIB } else if (ext=="xml") { QDomDocument doc("palette"); QFile file(l[j].absoluteFilePath()); if (file.open(QIODevice::ReadOnly)) { if (doc.setContent(&file)) { file.close(); QDomElement docElem = doc.documentElement(); QDomElement n = docElem.firstChildElement("ColorMap"); if (docElem.nodeName()=="ColorMap") n=docElem; while(!n.isNull()) { QString name=n.attribute("name", QString("palette %1").arg(palID+1)); QString colorspace=n.attribute("space", "RGB").toLower(); QList<QPair<double, QRgb> > pal; if (colorspace=="rgb"){ QDomElement e = n.firstChildElement("Point"); while(!e.isNull()) { double x=JKQTPimagePlot_QStringToDouble(e.attribute("x", "0")); //double o=JKQTPimagePlot_QStringToDouble(e.attribute("o", "0")); double r=JKQTPimagePlot_QStringToDouble(e.attribute("r", "0")); double g=JKQTPimagePlot_QStringToDouble(e.attribute("g", "0")); double b=JKQTPimagePlot_QStringToDouble(e.attribute("b", "0")); pal<<qMakePair(x, qRgb(qBound(0,(int)round(255*r), 255), qBound(0,(int)round(255*g), 255), qBound(0,(int)round(255*b), 255))); e = e.nextSiblingElement("Point"); } if (pal.size()>1) { sl<<name; qStableSort(pal.begin(), pal.end(), JKQTPimagePlot_QPairCompareFirst<double, QRgb>); JKQTPimagePlot_lutsFromFiles[sl.size()-1]=pal; palID=sl.size(); //qDebug()<<"read "<<l[j].fileName()<<": "<<name<<" ("<<colorspace<<") size="<<pal.size(); } } n = n.nextSiblingElement("ColorMap"); } } } #endif } } } } return sl; } void JKQTPimagePlot_freeLUTs(QList<int *> &lutstore) { QList<int *> ls=lutstore; lutstore.clear(); for (int i=0; i<ls.size(); i++) { if (ls[i]) free(ls[i]); } } int* JKQTPimagePlot_getCreateLUT(QList<int*>& lutstore, JKQTPMathImageColorPalette palette) { int* lut_used=nullptr; if (palette == JKQTPMathImageRED) { //int*& plut=lutstore[palette]; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=qRgb(static_cast<int>(255.0*v), 0, 0); } plut[JKQTPimagePlot_LUTSIZE+1]=plut[JKQTPimagePlot_LUTSIZE]; } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageGREEN) { //int*& plut=&lut_green; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=qRgb(0, static_cast<int>(255.0*v), 0); } plut[JKQTPimagePlot_LUTSIZE+1]=plut[JKQTPimagePlot_LUTSIZE]; } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageBLUE) { //int*& plut=&lut_blue; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=qRgb(0, 0, static_cast<int>(255.0*v)); } plut[JKQTPimagePlot_LUTSIZE+1]=plut[JKQTPimagePlot_LUTSIZE]; } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageGRAY) { //int*& plut=&lut_gray; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=qRgb(static_cast<int>(255.0*v), static_cast<int>(255.0*v), static_cast<int>(255.0*v)); } plut[JKQTPimagePlot_LUTSIZE+1]=plut[JKQTPimagePlot_LUTSIZE]; } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageALPHA) { //int*& plut=&lut_gray; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=qRgba(255,255,255, static_cast<int>(255.0*v)); } plut[JKQTPimagePlot_LUTSIZE+1]=plut[JKQTPimagePlot_LUTSIZE]; } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_ALPHA) { //int*& plut=&lut_gray; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=qRgba(255,255,255, static_cast<int>(255.0*v)); } plut[JKQTPimagePlot_LUTSIZE+1]=plut[JKQTPimagePlot_LUTSIZE]; } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTEDRED) { //int*& plut=&lut_invred; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=qRgb(static_cast<int>(255.0*(1.0-v)), 0, 0); } plut[JKQTPimagePlot_LUTSIZE+1]=plut[JKQTPimagePlot_LUTSIZE]; } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTEDGREEN) { //int*& plut=&lut_invgreen; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=qRgb(0, static_cast<int>(255.0*(1.0-v)), 0); } plut[JKQTPimagePlot_LUTSIZE+1]=plut[JKQTPimagePlot_LUTSIZE]; } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTEDBLUE) { //int*& plut=&lut_invblue; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=qRgb(0, 0, static_cast<int>(255.0*(1.0-v))); } plut[JKQTPimagePlot_LUTSIZE+1]=plut[JKQTPimagePlot_LUTSIZE]; } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTEDGRAY) { //int*& plut=&lut_invgray; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=1.0-(l/(double)(JKQTPimagePlot_LUTSIZE)); plut[l]=qRgb(static_cast<int>(255.0*v), static_cast<int>(255.0*v), static_cast<int>(255.0*v)); } plut[JKQTPimagePlot_LUTSIZE+1]=plut[JKQTPimagePlot_LUTSIZE]; } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageMATLAB) { //int*& plut=&lut_matlab; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); double r = 382.5 - 1020.0 * std::abs(v - 0.75); if (r > 255.0) r = 255.0; else if (r < 0.0) r = 0.0; double g = 382.5 - 1020.0 * std::abs(v - 0.5); if (g > 255.0) g = 255.0; else if (g < 0.0) g = 0.0; double b = 382.5 - 1020.0 * std::abs(v - 0.25); if (b > 255.0) b = 255.0; else if (b < 0.0) b = 0.0; plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_MATLAB) { //int*& plut=&lut_matlab_inverted; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=JKQTPimagePlot_LUTSIZE; l>=0; l--) { double v=(JKQTPimagePlot_LUTSIZE-l)/(double)(JKQTPimagePlot_LUTSIZE); double r = 382.5 - 1020.0 * std::abs(v - 0.75); if (r > 255.0) r = 255.0; else if (r < 0.0) r = 0.0; double g = 382.5 - 1020.0 * std::abs(v - 0.5); if (g > 255.0) g = 255.0; else if (g < 0.0) g = 0.0; double b = 382.5 - 1020.0 * std::abs(v - 0.25); if (b > 255.0) b = 255.0; else if (b < 0.0) b = 0.0; plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageRYGB) //gnuplot: 30,-13,-23 { //int*& plut=&lut_rygb; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); double r = 796.875*v - 199.21875; if (r > 255.0) r = 255.0; else if (r < 0.0) r = 0.0; double g = 255.0 * std::sin(M_PI*v); double b = 255.0 - 765.0 * v; if (b < 0.0) b = 0.0; plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_RYGB) //gnuplot: 30,-13,-23 { //int*& plut=&lut_rygb_inverted; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=JKQTPimagePlot_LUTSIZE; l>=0; l--) { double v=(JKQTPimagePlot_LUTSIZE-l)/(double)(JKQTPimagePlot_LUTSIZE); double r = 796.875*v - 199.21875; if (r > 255.0) r = 255.0; else if (r < 0.0) r = 0.0; double g = 255.0 * std::sin(M_PI*v); double b = 255.0 - 765.0 * v; if (b < 0.0) b = 0.0; plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageHSV) { //int*& plut=&lut_hsv; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); int h = static_cast<int>(floor(6*v)); double f = 6*v-double(h); switch (h) { case 0: plut[l]=qRgb(255, static_cast<int>(255.0*f), 0); break; case 1: plut[l]=qRgb(static_cast<int>(255.0*(1-f)), 255, 0); break; case 2: plut[l]=qRgb(0, 255, static_cast<int>(255.0*f)); break; case 3: plut[l]=qRgb(0, static_cast<int>(255.0*(1-f)), 255); break; case 4: plut[l]=qRgb(static_cast<int>(255.0*f), 0, 255); break; case 5: plut[l]=qRgb(255, 0, static_cast<int>(255.0*(1-f))); break; case 6: plut[l]=qRgb(255, static_cast<int>(255.0*f), 0); break; } } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_HSV) { //int*& plut=&lut_invhsv; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); int h = static_cast<int>(floor(6.0-6.0*v)); double f = 6.0-6.0*v-double(h); switch (h) { case 0: plut[l]=qRgb(255, static_cast<int>(255.0*f), 0); break; case 1: plut[l]=qRgb(static_cast<int>(255.0*(1-f)), 255, 0); break; case 2: plut[l]=qRgb(0, 255, static_cast<int>(255.0*f)); break; case 3: plut[l]=qRgb(0, static_cast<int>(255.0*(1-f)), 255); break; case 4: plut[l]=qRgb(static_cast<int>(255.0*f), 0, 255); break; case 5: plut[l]=qRgb(255, 0, static_cast<int>(255.0*(1-f))); break; case 6: plut[l]=qRgb(255, static_cast<int>(255.0*f), 0); break; } } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageRAINBOW) //gnuplot: 33,13,10 { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); double r = 255.0*std::abs(2.0*v-0.5); if (r > 255.0) r = 255.0; double g = 255.0*sin(M_PI*v); double b = 255.0*cos(0.5*M_PI*v); plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_RAINBOW) //gnuplot: 33,13,10 { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=JKQTPimagePlot_LUTSIZE; l>=0; l--) { double v=(JKQTPimagePlot_LUTSIZE-l)/(double)(JKQTPimagePlot_LUTSIZE); double r = 255.0*std::abs(2.0*v-0.5); if (r > 255.0) r = 255.0; double g = 255.0*sin(M_PI*v); double b = 255.0*cos(0.5*M_PI*v); plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageHOT) //gnuplot: 21,22,23 { //int*& plut=&lut_hot; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); double r = 765.0*v; if (r > 255.0) r = 255.0; double g = 765.0*v-255.0; if (g > 255.0) g = 255.0; else if (g < 0.0) g = 0.0; double b = 765.0*v-510.0; if (b < 0.0) b = 0.0; plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_HOT) //gnuplot: 21,22,23 { //int*& plut=&lut_hot_inverted; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=JKQTPimagePlot_LUTSIZE; l>=0; l--) { double v=(JKQTPimagePlot_LUTSIZE-l)/(double)(JKQTPimagePlot_LUTSIZE); double r = 765.0*v; if (r > 255.0) r = 255.0; double g = 765.0*v-255.0; if (g > 255.0) g = 255.0; else if (g < 0.0) g = 0.0; double b = 765.0*v-510.0; if (b < 0.0) b = 0.0; plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageOCEAN) //gnuplot: 23,28,3 { //int*& plut=&lut_ocean; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); double r = 765.0*v-510.0; if (r < 0.0) r = 0.0; double g = std::abs(382.5*v-127.5); double b = 255.0*v; plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_OCEAN) //gnuplot: 23,28,3 { //int*& plut=&lut_ocean_inverted; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=JKQTPimagePlot_LUTSIZE; l>=0; l--) { double v=(JKQTPimagePlot_LUTSIZE-l)/(double)(JKQTPimagePlot_LUTSIZE); double r = 765.0*v-510.0; if (r < 0.0) r = 0.0; double g = std::abs(382.5*v-127.5); double b = 255.0*v; plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageBLUEMAGENTAYELLOW) //gnuplot: 30,31,32 { //int*& plut=&lut_bluemagentayellow; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); double r = (v/0.32-0.78125); if (r < 0.0) r = 0.0; if (r > 1.0) r = 1.0; double g = 2.0*v-0.84; if (g < 0.0) g = 0.0; if (g > 1.0) g = 1.0; double b = 4.0*v; if (b>1 || b<0) b = -2.0*v+1.84; if (b>1 || b<0) b = v/0.08-11.5; if (b>1 || b<0) b=1; if (b < 0.0) b = 0.0; if (b > 1.0) b = 1.0; plut[l]=qRgb(static_cast<int>(255.0*r), static_cast<int>(255.0*g), static_cast<int>(255.0*b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_BLUEMAGENTAYELLOW) //gnuplot: 30,31,32 { //int*& plut=&lut_bluemagentayellow_inverted; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(JKQTPimagePlot_LUTSIZE-l)/(double)(JKQTPimagePlot_LUTSIZE); double r = (v/0.32-0.78125); if (r < 0.0) r = 0.0; if (r > 1.0) r = 1.0; double g = 2.0*v-0.84; if (g < 0.0) g = 0.0; if (g > 1.0) g = 1.0; double b = 4.0*v; if (b>1 || b<0) b = -2.0*v+1.84; if (b>1 || b<0) b = v/0.08-11.5; if (b>1 || b<0) b=1; if (b < 0.0) b = 0.0; if (b > 1.0) b = 1.0; plut[l]=qRgb(static_cast<int>(255.0*r), static_cast<int>(255.0*g), static_cast<int>(255.0*b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageBLUEYELLOW) //gnuplot: 8,9,10 { //int*& plut=&lut_blueyellow; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); double r = sqrt(sqrt(v)); if (r < 0.0) r = 0.0; if (r > 1.0) r = 1.0; double g = sin(M_PI/2.0*v); if (g < 0.0) g = 0.0; if (g > 1.0) g = 1.0; double b = cos(M_PI/2.0*v); if (b < 0.0) b = 0.0; if (b > 1.0) b = 1.0; plut[l]=qRgb(static_cast<int>(255.0*r), static_cast<int>(255.0*g), static_cast<int>(255.0*b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_BLUEYELLOW) //gnuplot: 8,9,10 { //int*& plut=&lut_blueyellow_inverted; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(JKQTPimagePlot_LUTSIZE-l)/(double)(JKQTPimagePlot_LUTSIZE); double r = sqrt(sqrt(v)); if (r < 0.0) r = 0.0; if (r > 1.0) r = 1.0; double g = sin(M_PI/2.0*v); if (g < 0.0) g = 0.0; if (g > 1.0) g = 1.0; double b = cos(M_PI/2.0*v); if (b < 0.0) b = 0.0; if (b > 1.0) b = 1.0; plut[l]=qRgb(static_cast<int>(255.0*r), static_cast<int>(255.0*g), static_cast<int>(255.0*b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageCYAN) { //int*& plut=&lut_cyan; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); double r = v*0.5; if (r < 0.0) r = 0.0; if (r > 1.0) r = 1.0; double g = v; if (g < 0.0) g = 0.0; if (g > 1.0) g = 1.0; double b = v; if (b < 0.0) b = 0.0; if (b > 1.0) b = 1.0; plut[l]=qRgb(static_cast<int>(255.0*r), static_cast<int>(255.0*g), static_cast<int>(255.0*b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_CYAN) { //int*& plut=&lut_cyan_inverted; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(JKQTPimagePlot_LUTSIZE-l)/(double)(JKQTPimagePlot_LUTSIZE); double r = v*0.5; if (r < 0.0) r = 0.0; if (r > 1.0) r = 1.0; double g = v; if (g < 0.0) g = 0.0; if (g > 1.0) g = 1.0; double b = v; if (b < 0.0) b = 0.0; if (b > 1.0) b = 1.0; plut[l]=qRgb(static_cast<int>(255.0*r), static_cast<int>(255.0*g), static_cast<int>(255.0*b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageTRAFFICLIGHT) { //int*& plut=&lut_trafficlight; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=l/(double)(JKQTPimagePlot_LUTSIZE); double r = (v < 0.5) ? 128.0*sin(M_PI*(2.0*v-0.5))+128.0 : 255.0; if (r > 255.0) r = 255.0; double g = (v < 0.5) ? 512.0*v+128.0 : 512.0-512.0*v; if (g > 255.0) g = 255.0; plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), 0); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_TRAFFICLIGHT) { //int*& plut=&lut_trafficlight_inverted; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(JKQTPimagePlot_LUTSIZE-l)/(double)(JKQTPimagePlot_LUTSIZE); double r = (v < 0.5) ? 128.0*sin(M_PI*(2.0*v-0.5))+128.0 : 255.0; if (r > 255.0) r = 255.0; double g = (v < 0.5) ? 512.0*v+128.0 : 512.0-512.0*v; if (g > 255.0) g = 255.0; plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), 0); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageBLUEWHITERED) //gnuplot: 34,13,-34 { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(8.0, 0xFFB2182B); lst<<qMakePair<double, QRgb>(7.0, 0xFFD6604D); lst<<qMakePair<double, QRgb>(6.0, 0xFFF4A582); lst<<qMakePair<double, QRgb>(5.0, 0xFFFDDBC7); lst<<qMakePair<double, QRgb>(4.0, 0xFFD1E5F0); lst<<qMakePair<double, QRgb>(3.0, 0xFF92C5DE); lst<<qMakePair<double, QRgb>(2.0, 0xFF4393C3); lst<<qMakePair<double, QRgb>(1.0, 0xFF2166AC); JKQTPimagePlot_buildDefinedPaletteLinInterpolate(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageREDWHITEBLUE) //gnuplot: https://github.com/aschn/gnuplot-colorbrewer/blob/master/diverging/RdBu.plt { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(0.0, 0xFFB2182B); lst<<qMakePair<double, QRgb>(1.0, 0xFFD6604D); lst<<qMakePair<double, QRgb>(2.0, 0xFFF4A582); lst<<qMakePair<double, QRgb>(3.0, 0xFFFDDBC7); lst<<qMakePair<double, QRgb>(4.0, 0xFFD1E5F0); lst<<qMakePair<double, QRgb>(5.0, 0xFF92C5DE); lst<<qMakePair<double, QRgb>(6.0, 0xFF4393C3); lst<<qMakePair<double, QRgb>(7.0, 0xFF2166AC); JKQTPimagePlot_buildDefinedPaletteLinInterpolate(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageBLACKBLUEREDYELLOW) //gnuplot: 7,5,15 { // int*& plut=&lut_BLACKBLUEREDYELLOW; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(l)/(double)(JKQTPimagePlot_LUTSIZE); double r = 255.0*qBound(0.0,sqrt(v),1.0); double g = 255.0*qBound(0.0,v*v*v,1.0); double b = 255.0*qBound(0.0,sin(2.0*M_PI*v),1.0); plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageGREENREDVIOLET) //gnuplot: 3,11,6 { //int*& plut=&lut_GREENREDVIOLET; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(l)/(double)(JKQTPimagePlot_LUTSIZE); double r = 255.0*qBound(0.0,v,1.0); double g = 255.0*qBound(0.0,fabs(v-0.5),1.0); double b = 255.0*qBound(0.0,v*v*v*v,1.0); plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageBLACKBLUEVIOLETYELLOWWHITE) //gnuplot: 30,31,32 { //int*& plut=&lut_BLACKBLUEVIOLETYELLOWWHITE; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(l)/(double)(JKQTPimagePlot_LUTSIZE); double r = 255.0*qBound(0.0,v/0.32-0.78125,1.0); double g = 255.0*qBound(0.0,v/0.32-0.78125,1.0); double b = 255.0*qBound(0.0,(v<0.25)?4*v:(v<0.42)?1.0:(v<0.92)?-2.0*v+1.84:v/0.08-11.5,1.0); plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageWHITEYELLOWVIOLETBLUEBLACK) //gnuplot: 30,31,32 { //int*& plut=&lut_WHITEYELLOWVIOLETBLUEBLACK; if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(JKQTPimagePlot_LUTSIZE-l)/(double)(JKQTPimagePlot_LUTSIZE); double r = 255.0*qBound(0.0,v/0.32-0.78125,1.0); double g = 255.0*qBound(0.0,v/0.32-0.78125,1.0); double b = 255.0*qBound(0.0,(v<0.25)?4*v:(v<0.42)?1.0:(v<0.92)?-2.0*v+1.84:v/0.08-11.5,1.0); plut[l]=qRgb(static_cast<int>(r), static_cast<int>(g), static_cast<int>(b)); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageBR_GR) //https://github.com/aschn/gnuplot-colorbrewer/blob/master/diverging/BrBG.plt { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(0.0, qRgb(0x8C, 0x51, 0x0A)); lst<<qMakePair<double, QRgb>(1.0, qRgb(0xBF, 0x81, 0x2D)); lst<<qMakePair<double, QRgb>(2.0, qRgb(0xDF, 0xC2, 0x7D)); lst<<qMakePair<double, QRgb>(3.0, 0xFFF6E8C3); lst<<qMakePair<double, QRgb>(4.0, 0xFFC7EAE5); lst<<qMakePair<double, QRgb>(5.0, 0xFF80CDC1); lst<<qMakePair<double, QRgb>(6.0, 0xFF35978F); lst<<qMakePair<double, QRgb>(7.0, 0xFF01665E); JKQTPimagePlot_buildDefinedPaletteLinInterpolate(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageBR_GR_STEP) //https://github.com/aschn/gnuplot-colorbrewer/blob/master/diverging/BrBG.plt { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(0.0, qRgb(0x8C, 0x51, 0x0A)); lst<<qMakePair<double, QRgb>(1.0, qRgb(0xBF, 0x81, 0x2D)); lst<<qMakePair<double, QRgb>(2.0, qRgb(0xDF, 0xC2, 0x7D)); lst<<qMakePair<double, QRgb>(3.0, 0xFFF6E8C3); lst<<qMakePair<double, QRgb>(4.0, 0xFFC7EAE5); lst<<qMakePair<double, QRgb>(5.0, 0xFF80CDC1); lst<<qMakePair<double, QRgb>(6.0, 0xFF35978F); lst<<qMakePair<double, QRgb>(7.0, 0xFF01665E); JKQTPimagePlot_buildDefinedPalette(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImagePU_OR) //https://github.com/aschn/gnuplot-colorbrewer/blob/master/diverging/PuOr.plt { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(0.0, 0xFFB35806); lst<<qMakePair<double, QRgb>(1.0, 0xFFE08214); lst<<qMakePair<double, QRgb>(2.0, 0xFFFDB863); lst<<qMakePair<double, QRgb>(3.0, 0xFFFEE0B6); lst<<qMakePair<double, QRgb>(4.0, 0xFFF7F7F7); lst<<qMakePair<double, QRgb>(5.0, 0xFFD8DAEB); lst<<qMakePair<double, QRgb>(6.0, 0xFFB2ABD2); lst<<qMakePair<double, QRgb>(7.0, 0xFF8073AC); lst<<qMakePair<double, QRgb>(8.0, 0xFF542788); JKQTPimagePlot_buildDefinedPaletteLinInterpolate(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImagePU_OR_STEP) //https://github.com/aschn/gnuplot-colorbrewer/blob/master/diverging/PuOr.plt { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(0.0, 0xFFB35806); lst<<qMakePair<double, QRgb>(1.0, 0xFFE08214); lst<<qMakePair<double, QRgb>(2.0, 0xFFFDB863); lst<<qMakePair<double, QRgb>(3.0, 0xFFFEE0B6); lst<<qMakePair<double, QRgb>(4.0, 0xFFF7F7F7); lst<<qMakePair<double, QRgb>(5.0, 0xFFD8DAEB); lst<<qMakePair<double, QRgb>(6.0, 0xFFB2ABD2); lst<<qMakePair<double, QRgb>(7.0, 0xFF8073AC); lst<<qMakePair<double, QRgb>(8.0, 0xFF542788); JKQTPimagePlot_buildDefinedPalette(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageYL_GN_BU) //http://colorbrewer2.org/ { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(0.0, 0xFFFFFFD9); lst<<qMakePair<double, QRgb>(1.0, 0xFFEDF8B1); lst<<qMakePair<double, QRgb>(2.0, 0xFFC7E9B4); lst<<qMakePair<double, QRgb>(3.0, 0xFF7FCDBB); lst<<qMakePair<double, QRgb>(4.0, 0xFF41B6C4); lst<<qMakePair<double, QRgb>(5.0, 0xFF1D91C0); lst<<qMakePair<double, QRgb>(6.0, 0xFF225EA8); lst<<qMakePair<double, QRgb>(7.0, 0xFF253494); lst<<qMakePair<double, QRgb>(8.0, 0xFF081D58); JKQTPimagePlot_buildDefinedPaletteLinInterpolate(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageYL_GN_BU_STEP) //http://colorbrewer2.org/ { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(0.0, 0xFFFFFFD9); lst<<qMakePair<double, QRgb>(1.0, 0xFFEDF8B1); lst<<qMakePair<double, QRgb>(2.0, 0xFFC7E9B4); lst<<qMakePair<double, QRgb>(3.0, 0xFF7FCDBB); lst<<qMakePair<double, QRgb>(4.0, 0xFF41B6C4); lst<<qMakePair<double, QRgb>(5.0, 0xFF1D91C0); lst<<qMakePair<double, QRgb>(6.0, 0xFF225EA8); lst<<qMakePair<double, QRgb>(7.0, 0xFF253494); lst<<qMakePair<double, QRgb>(8.0, 0xFF081D58); JKQTPimagePlot_buildDefinedPalette(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageGN_BU) //http://colorbrewer2.org/ { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(0.0, 0xFFF7FCF0); lst<<qMakePair<double, QRgb>(1.0, 0xFFE0F3DB); lst<<qMakePair<double, QRgb>(2.0, 0xFFCCEBC5); lst<<qMakePair<double, QRgb>(3.0, 0xFFA8DDB5); lst<<qMakePair<double, QRgb>(4.0, 0xFF7BCCC4); lst<<qMakePair<double, QRgb>(5.0, 0xFF4EB3D3); lst<<qMakePair<double, QRgb>(6.0, 0xFF2B8CBE); lst<<qMakePair<double, QRgb>(7.0, 0xFF0868AC); lst<<qMakePair<double, QRgb>(8.0, 0xFF084081); JKQTPimagePlot_buildDefinedPaletteLinInterpolate(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageGN_BU_STEP) //http://colorbrewer2.org/ { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(0.0, 0xFFF7FCF0); lst<<qMakePair<double, QRgb>(1.0, 0xFFE0F3DB); lst<<qMakePair<double, QRgb>(2.0, 0xFFCCEBC5); lst<<qMakePair<double, QRgb>(3.0, 0xFFA8DDB5); lst<<qMakePair<double, QRgb>(4.0, 0xFF7BCCC4); lst<<qMakePair<double, QRgb>(5.0, 0xFF4EB3D3); lst<<qMakePair<double, QRgb>(6.0, 0xFF2B8CBE); lst<<qMakePair<double, QRgb>(7.0, 0xFF0868AC); lst<<qMakePair<double, QRgb>(8.0, 0xFF084081); JKQTPimagePlot_buildDefinedPalette(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageBU_GN) //http://colorbrewer2.org/ { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(8.0, 0xFFF7FCF0); lst<<qMakePair<double, QRgb>(7.0, 0xFFE0F3DB); lst<<qMakePair<double, QRgb>(6.0, 0xFFCCEBC5); lst<<qMakePair<double, QRgb>(5.0, 0xFFA8DDB5); lst<<qMakePair<double, QRgb>(4.0, 0xFF7BCCC4); lst<<qMakePair<double, QRgb>(3.0, 0xFF4EB3D3); lst<<qMakePair<double, QRgb>(2.0, 0xFF2B8CBE); lst<<qMakePair<double, QRgb>(1.0, 0xFF0868AC); lst<<qMakePair<double, QRgb>(0.0, 0xFF084081); JKQTPimagePlot_buildDefinedPaletteLinInterpolate(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageBU_GN_STEP) //http://colorbrewer2.org/ { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(8.0, 0xFFF7FCF0); lst<<qMakePair<double, QRgb>(7.0, 0xFFE0F3DB); lst<<qMakePair<double, QRgb>(6.0, 0xFFCCEBC5); lst<<qMakePair<double, QRgb>(5.0, 0xFFA8DDB5); lst<<qMakePair<double, QRgb>(4.0, 0xFF7BCCC4); lst<<qMakePair<double, QRgb>(3.0, 0xFF4EB3D3); lst<<qMakePair<double, QRgb>(2.0, 0xFF2B8CBE); lst<<qMakePair<double, QRgb>(1.0, 0xFF0868AC); lst<<qMakePair<double, QRgb>(0.0, 0xFF084081); JKQTPimagePlot_buildDefinedPalette(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_MAGENTA) // from CMYK model { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(l)/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=QColor::fromCmykF(0,1,0,v).rgba(); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageMAGENTA) // from CMYK model { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(JKQTPimagePlot_LUTSIZE-l)/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=QColor::fromCmykF(0,1,0,v).rgba(); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_YELLOW) // from CMYK model { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(l)/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=QColor::fromCmykF(0,0,1,v).rgba(); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageYELLOW) // from CMYK model { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(JKQTPimagePlot_LUTSIZE-l)/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=QColor::fromCmykF(0,0,1,v).rgba(); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_MAGENTAWHITE) // from CMYK model { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(l)/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=QColor::fromCmykF(0,v,0,0).rgba(); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageMAGENTAWHITE) // from CMYK model { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(JKQTPimagePlot_LUTSIZE-l)/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=QColor::fromCmykF(0,v,0,0).rgba(); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_YELLOWWHITE) // from CMYK model { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(l)/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=QColor::fromCmykF(0,0,v,0).rgba(); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageYELLOWWHITE) // from CMYK model { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(JKQTPimagePlot_LUTSIZE-l)/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=QColor::fromCmykF(0,0,v,0).rgba(); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageINVERTED_CYANWHITE) // from CMYK model { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(l)/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=QColor::fromCmykF(v,0,0,0).rgba(); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageCYANWHITE) // from CMYK model { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { for (int l=0; l<=JKQTPimagePlot_LUTSIZE; l++) { double v=(JKQTPimagePlot_LUTSIZE-l)/(double)(JKQTPimagePlot_LUTSIZE); plut[l]=QColor::fromCmykF(v,0,0,0).rgba(); } } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageBlueGreenRed) { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(1.0, QColor("blue").rgb()); lst<<qMakePair<double, QRgb>(2.0, QColor("green").rgb()); lst<<qMakePair<double, QRgb>(3.0, QColor("red").rgb()); JKQTPimagePlot_buildDefinedPaletteLinInterpolate(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImageRedGreenBlue) { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(1.0, QColor("red").rgb()); lst<<qMakePair<double, QRgb>(2.0, QColor("green").rgb()); lst<<qMakePair<double, QRgb>(3.0, QColor("blue").rgb()); JKQTPimagePlot_buildDefinedPaletteLinInterpolate(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImagePREDEFINED_PALETTES_COUNT) { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(1.0, QColor("magenta").rgb()); lst<<qMakePair<double, QRgb>(2.0, QColor("yellow").rgb()); JKQTPimagePlot_buildDefinedPaletteLinInterpolate(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImagePREDEFINED_PALETTES_COUNT+1) { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(1.0, QColor("yellow").rgb()); lst<<qMakePair<double, QRgb>(2.0, QColor("magenta").rgb()); JKQTPimagePlot_buildDefinedPaletteLinInterpolate(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImagePREDEFINED_PALETTES_COUNT+2) { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(1.0, QColor("red").rgb()); lst<<qMakePair<double, QRgb>(2.0, QColor("blue").rgb()); JKQTPimagePlot_buildDefinedPaletteLinInterpolate(plut, lst); } } lut_used=lutstore[palette]; } else if (palette == JKQTPMathImagePREDEFINED_PALETTES_COUNT+3) { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(1.0, QColor("blue").rgb()); lst<<qMakePair<double, QRgb>(2.0, QColor("red").rgb()); JKQTPimagePlot_buildDefinedPaletteLinInterpolate(plut, lst); } } lut_used=lutstore[palette]; /* } else if (palette == JKQTPMathImagePU_OR) //https://github.com/aschn/gnuplot-colorbrewer/blob/master/diverging/PuOr.plt { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { QList<QPair<double, QRgb> > lst; lst<<qMakePair<double, QRgb>(0.0, 0xFF); lst<<qMakePair<double, QRgb>(1.0, 0xFF); lst<<qMakePair<double, QRgb>(2.0, 0xFF); lst<<qMakePair<double, QRgb>(3.0, 0xFF); lst<<qMakePair<double, QRgb>(4.0, 0xFF); lst<<qMakePair<double, QRgb>(5.0, 0xFF); lst<<qMakePair<double, QRgb>(6.0, 0xFF); lst<<qMakePair<double, QRgb>(7.0, 0xFF); lst<<qMakePair<double, QRgb>(8.0, 0xFF); JKQTPimagePlot_buildDefinedPalette(plut, lst); } } lut_used=lutstore[palette]; */ } else if (JKQTPimagePlot_lutsFromFiles.contains(palette)) // LUTs read from files in JKQTPimagePlot_lutsFromFiles { if (lutstore[palette]==nullptr) { lutstore[palette]=(int*)malloc((JKQTPimagePlot_LUTSIZE+2)*sizeof(int)); int* plut=lutstore[palette]; //std::cout<<"!!! creating rainbow lut\n"; if (plut!=nullptr) { if (JKQTPimagePlot_lutsFromFiles[palette].size()>220) JKQTPimagePlot_buildDefinedPalette(plut, JKQTPimagePlot_lutsFromFiles[palette]); else JKQTPimagePlot_buildDefinedPaletteLinInterpolate(plut, JKQTPimagePlot_lutsFromFiles[palette]); } } lut_used=lutstore[palette]; } return lut_used; } QImage JKQTPMathImageGetPaletteImage(int i, int width) { return JKQTPMathImageGetPaletteImage(i, width, 1); } QImage JKQTPMathImageGetPaletteImage(int i, int width, int height) { QImage img; double* pic=(double*)malloc(width*height*sizeof(double)); for (int j=0; j<width*height; j++) { pic[j]=j%width; } JKQTPimagePlot_array2image<double>(pic, width, height, img, (JKQTPMathImageColorPalette)i, Qt::black, Qt::black); free(pic); return img; } QImage JKQTPMathImageGetPaletteImage(JKQTPMathImageColorPalette palette, int width) { return JKQTPMathImageGetPaletteImage((int)palette, width); } QImage JKQTPMathImageGetPaletteImage(JKQTPMathImageColorPalette palette, int width, int height) { return JKQTPMathImageGetPaletteImage((int)palette, width, height); } QImage JKQTPMathImageGetPaletteImage(int *lut, int lut_size, int width) { QImage img; double* pic=(double*)malloc(width*sizeof(double)); for (int j=0; j<width; j++) { pic[j]=j; } JKQTPimagePlot_array2image<double>(pic, width, 1, img, lut, lut_size, Qt::black, Qt::black); free(pic); return img; } QIcon JKQTPMathImageGetPaletteIcon(int i) { QImage img=JKQTPMathImageGetPaletteImage(i, JKQTP_PALETTE_ICON_WIDTH); QPixmap pix(JKQTP_PALETTE_ICON_WIDTH,8); QRect r(0,0,JKQTP_PALETTE_ICON_WIDTH-1,7); QPainter p(&pix); p.drawImage(r, img); p.setPen(QPen(QColor("black"))); p.drawRect(r); p.end(); return QIcon(pix); } QIcon JKQTPMathImageGetPaletteIcon(JKQTPMathImageColorPalette palette) { return JKQTPMathImageGetPaletteIcon((int)palette); } QImage JKQTPMathImageGetAlphaPaletteImage(int *lut, int lut_size, int width, int height) { QImage img; if (!lut || lut_size<=0 || width<=0 || height<=0) return img; double* pic=(double*)malloc(width*sizeof(double)); for (int j=0; j<width; j++) { pic[j]=j; } QVector<int> l1(lut_size, QColor("white").rgba()); for (int i=0; i<l1.size(); i++) { l1[i]=qRgba(255,255,255, lut[i]); } QImage img1(8,8,QImage::Format_ARGB32); img1.fill(Qt::white); for (int y=0; y<img1.height()/2; y++) { QRgb* sl1=(QRgb*)img1.scanLine(y); QRgb* sl2=(QRgb*)img1.scanLine(y+img1.height()/2); for (int x=0; x<img1.width()/2; x++) { sl1[x]=QColor(Qt::black).rgba(); sl2[x+img1.width()/2]=QColor(Qt::black).rgba(); } } JKQTPimagePlot_array2image<double>(pic, width, 1, img, l1.data(), lut_size, Qt::black, Qt::black); free(pic); QImage img2(width, height, QImage::Format_ARGB32); QPainter p(&img2); QBrush b; b.setStyle(Qt::TexturePattern); b.setTextureImage(img1); p.setBrush(b); p.fillRect(QRect(0,0,width,height), b); p.drawImage(QRect(0,0,width,height), img); p.end(); return img2; } #ifndef NO_JKQTPLOTTER JKQTPColorPaletteTools::JKQTPColorPaletteTools(JKQtBasePlotter *parent) { cbParent=parent; colorBarRightAxis=new JKQTPverticalIndependentAxis(0, 100, 0, 100, parent); if (parent) colorBarRightAxis->loadSettings(parent->getYAxis()); colorBarRightAxis->set_drawMode1(JKQTPCADMline); colorBarRightAxis->set_drawMode2(JKQTPCADMcomplete); colorBarRightAxis->set_axisLabel(""); colorBarRightAxis->set_minTicks(3); colorBarRightAxis->set_showZeroAxis(false); colorBarRightAxis->set_minorTicks(0); colorBarRightAxis->set_tickOutsideLength(0); colorBarRightAxis->set_minorTickOutsideLength(0); colorBarTopAxis=new JKQTPhorizontalIndependentAxis(0, 100, 0, 100, parent); if (parent) colorBarTopAxis->loadSettings(parent->getXAxis()); colorBarTopAxis->set_drawMode1(JKQTPCADMline); colorBarTopAxis->set_drawMode2(JKQTPCADMcomplete); colorBarTopAxis->set_axisLabel(""); colorBarTopAxis->set_minTicks(3); colorBarTopAxis->set_showZeroAxis(false); colorBarTopAxis->set_minorTicks(0); colorBarTopAxis->set_tickOutsideLength(0); colorBarTopAxis->set_minorTickOutsideLength(0); this->palette=JKQTPMathImageMATLAB; this->imageNameFontName=parent->get_keyFont(); this->imageNameFontSize=parent->get_keyFontSize(); this->imageName=""; this->showColorBar=true; this->colorBarWidth=14; this->colorBarRelativeHeight=0.75; this->autoImageRange=true; this->imageMin=0; this->imageMax=1; this->colorBarOffset=4; this->rangeMinFailAction=JKQTPMathImageLastPaletteColor; this->rangeMaxFailAction=JKQTPMathImageLastPaletteColor; this->rangeMinFailColor=QColor("black"); this->rangeMaxFailColor=QColor("black"); this->nanColor=QColor("black"); this->infColor=QColor("black"); this->colorBarTopVisible=false; this->colorBarRightVisible=true; } JKQTPColorPaletteTools::~JKQTPColorPaletteTools() { } void JKQTPColorPaletteTools::cbGetOutsideSize(JKQTPEnhancedPainter& painter, int& leftSpace, int& rightSpace, int& topSpace, int& bottomSpace) { Q_UNUSED(leftSpace); Q_UNUSED(bottomSpace); if (showColorBar) { double internalDataMin=getInternalDataMin(); double internalDataMax=getInternalDataMax(); cbGetDataMinMax(internalDataMin, internalDataMax); if (colorBarRightVisible) { rightSpace+=cbParent->pt2px(painter, colorBarWidth+colorBarOffset); colorBarRightAxis->setRange(internalDataMin, internalDataMax); colorBarRightAxis->set_axisWidth(colorBarRelativeHeight*cbParent->get_plotHeight()); QSize s=colorBarRightAxis->getSize2(painter); /*cbParent->get_mathText()->set_fontSize(imageNameFontSize*cbParent->get_fontSizeMultiplier()); cbParent->get_mathText()->set_fontRoman(imageNameFontName); cbParent->get_mathText()->parse(imageName); QSizeF names=cbParent->get_mathText()->getSize(painter);*/ QSizeF names=cbParent->getTextSizeSize(imageNameFontName, imageNameFontSize*cbParent->get_fontSizeMultiplier(), imageName, painter); rightSpace+=cbParent->pt2px(painter, colorBarWidth+colorBarOffset)+qMax((double)s.width(), (double)names.width()); } if (colorBarTopVisible) { //topSpace+=cbParent->pt2px(painter, colorBarWidth+colorBarOffset); colorBarTopAxis->setRange(internalDataMin, internalDataMax); colorBarTopAxis->set_axisWidth(colorBarRelativeHeight*cbParent->get_plotWidth()); QSize s=colorBarTopAxis->getSize2(painter); /*cbParent->get_mathText()->set_fontSize(imageNameFontSize*cbParent->get_fontSizeMultiplier()); cbParent->get_mathText()->set_fontRoman(imageNameFontName); cbParent->get_mathText()->parse(imageName); QSizeF names=cbParent->get_mathText()->getSize(painter);*/ QSizeF names=cbParent->getTextSizeSize(imageNameFontName, imageNameFontSize*cbParent->get_fontSizeMultiplier(), imageName, painter); topSpace+=cbParent->pt2px(painter, colorBarWidth+colorBarOffset)+qMax((double)s.height(), (double)names.height()); } } } void JKQTPColorPaletteTools::cbDrawOutside(JKQTPEnhancedPainter& painter, QRect leftSpace, QRect rightSpace, QRect topSpace, QRect bottomSpace) { Q_UNUSED(leftSpace); Q_UNUSED(bottomSpace); if (showColorBar) { double internalDataMin=getInternalDataMin(); double internalDataMax=getInternalDataMax(); cbGetDataMinMax(internalDataMin, internalDataMax); if (colorBarRightVisible) { painter.save(); static const uint8_t h=1; static const uint8_t dSize = 200*h; uint8_t d[dSize];//, dd[200*h]; for (int i=0; i<200; i++) { for (int j=0; j<h; j++) { d[i*h+j]=i; //dd[i*h+j]=j; } } QImage b(h, 200, QImage::Format_ARGB32); JKQTPimagePlot_array2image<uint8_t>(d, h, 200, b, palette, 0, 199); /*cbParent->get_mathText()->set_fontSize(imageNameFontSize*cbParent->get_fontSizeMultiplier()); cbParent->get_mathText()->set_fontRoman(imageNameFontName); cbParent->get_mathText()->parse(imageName); QSizeF names=cbParent->get_mathText()->getSize(painter);*/ QSizeF names=cbParent->getTextSizeSize(imageNameFontName, imageNameFontSize*cbParent->get_fontSizeMultiplier(), imageName, painter); double icolorBarRelativeHeight=colorBarRelativeHeight; int barHeight=rightSpace.height()*icolorBarRelativeHeight; if (barHeight<1) barHeight=1; // find a height for the bar that allows to show the image name while ((barHeight>1) && ((rightSpace.height()-barHeight)/2<names.height())) { barHeight--; } //qDebug()<<"r: "<<imageName<<rightSpace; QRect cb(rightSpace.x()+cbParent->pt2px(painter, colorBarOffset), rightSpace.top()+(rightSpace.height()-barHeight)/2, cbParent->pt2px(painter, colorBarWidth), barHeight); painter.drawImage(cb, b.mirrored(true, false)); QPen p=painter.pen(); p.setColor(colorBarRightAxis->get_axisColor()); p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, cbParent->pt2px(painter, colorBarRightAxis->get_lineWidth()*cbParent->get_lineWidthMultiplier()))); painter.setPen(p); painter.drawRect(cb); colorBarRightAxis->setRange(internalDataMin, internalDataMax); colorBarRightAxis->set_axisWidth(cb.height()); colorBarRightAxis->set_axisOffset(cb.top()); colorBarRightAxis->set_otherAxisOffset(cb.left()); colorBarRightAxis->set_otherAxisWidth(cb.width()); colorBarRightAxis->drawAxes(painter); cbParent->get_mathText()->set_fontSize(imageNameFontSize*cbParent->get_fontSizeMultiplier()); cbParent->get_mathText()->set_fontRoman(imageNameFontName); cbParent->get_mathText()->parse(imageName); cbParent->get_mathText()->draw(painter, Qt::AlignHCenter|Qt::AlignVCenter, QRect(rightSpace.x(), rightSpace.y(), rightSpace.width(), (rightSpace.height()-barHeight)/2)); painter.restore(); } if (colorBarTopVisible) { painter.save(); /*uint8_t d[200]; for (int i=0; i<200; i++) d[i]=i; QImage b(200,1, QImage::Format_ARGB32); JKQTPimagePlot_array2image<uint8_t>(d, 200, 1, b, palette, 0, 199);*/ static const uint8_t h=1; static const uint8_t dSize = 200*h; uint8_t d[dSize];//, dd[200*h]; for (int i=0; i<200; i++) { for (int j=0; j<h; j++) { d[i*h+j]=i; //dd[i*h+j]=j; } } QImage b(h,200, QImage::Format_ARGB32); JKQTPimagePlot_array2image<uint8_t>(d,h,200, b, palette, 0, 199); /*cbParent->get_mathText()->set_fontSize(imageNameFontSize*cbParent->get_fontSizeMultiplier()); cbParent->get_mathText()->set_fontRoman(imageNameFontName); cbParent->get_mathText()->parse(imageName); QSizeF names=cbParent->get_mathText()->getSize(painter);*/ QSizeF names=cbParent->getTextSizeSize(imageNameFontName, imageNameFontSize*cbParent->get_fontSizeMultiplier(), imageName, painter); double icolorBarRelativeHeight=colorBarRelativeHeight; int barWidth=topSpace.width()*icolorBarRelativeHeight; if (barWidth<1) barWidth=1; // find a height for the bar that allows to show the image name while ((barWidth>1) && ((topSpace.width()-barWidth)/2<names.width())) { barWidth--; } QRect cb(topSpace.x()+(topSpace.width()-barWidth)/2, topSpace.bottom()-cbParent->pt2px(painter, colorBarOffset+(colorBarWidth)), barWidth, cbParent->pt2px(painter, colorBarWidth)); //qDebug()<<"t: "<<imageName<<topSpace<<topSpace.bottom()<<colorBarOffset<<"\n "<<cb; QMatrix rm; rm.rotate(90); painter.drawImage(cb, b.transformed(rm)); QPen p=painter.pen(); p.setColor(colorBarTopAxis->get_axisColor()); p.setWidthF(qMax(JKQTPLOTTER_ABS_MIN_LINEWIDTH, cbParent->pt2px(painter, colorBarTopAxis->get_lineWidth()*cbParent->get_lineWidthMultiplier()))); painter.setPen(p); painter.drawRect(cb); colorBarTopAxis->setRange(internalDataMin, internalDataMax); colorBarTopAxis->set_axisWidth(cb.width()); colorBarTopAxis->set_axisOffset(cb.left()); colorBarTopAxis->set_otherAxisOffset(cb.top()); colorBarTopAxis->set_otherAxisWidth(cb.height()); colorBarTopAxis->drawAxes(painter); cbParent->get_mathText()->set_fontSize(imageNameFontSize*cbParent->get_fontSizeMultiplier()); cbParent->get_mathText()->set_fontRoman(imageNameFontName); cbParent->get_mathText()->parse(imageName); cbParent->get_mathText()->draw(painter, Qt::AlignHCenter|Qt::AlignVCenter, QRect(topSpace.right()-(topSpace.width()-barWidth)/2, topSpace.y(), (topSpace.width()-barWidth)/2, topSpace.height())); painter.restore(); } } } QStringList JKQTPColorPaletteTools::getPalettes() { return JKQTPimagePlot_getPredefinedPalettes(); } int JKQTPColorPaletteTools::getPalettesCount() { return getPalettes().size(); } QIcon JKQTPColorPaletteTools::getPaletteIcon(int i) { QImage img=getPaletteImage(i, JKQTP_PALETTE_ICON_WIDTH); QPixmap pix(JKQTP_PALETTE_ICON_WIDTH,8); QRect r(0,0,JKQTP_PALETTE_ICON_WIDTH-1,7); QPainter p(&pix); p.drawImage(r, img); p.setPen(QPen(QColor("black"))); p.drawRect(r); p.end(); return QIcon(pix); } QIcon JKQTPColorPaletteTools::getPaletteIcon(JKQTPMathImageColorPalette palette) { return getPaletteIcon((int)palette); } QImage JKQTPColorPaletteTools::getPaletteImage(int i, int width) { QImage img; double* pic=(double*)malloc(width*sizeof(double)); for (int j=0; j<width; j++) { pic[j]=j; } JKQTPimagePlot_array2image<double>(pic, width, 1, img, (JKQTPMathImageColorPalette)i, 0, width-1); free(pic); return img; } QImage JKQTPColorPaletteTools::getPaletteImage(JKQTPMathImageColorPalette palette, int width) { return getPaletteImage((int)palette, width); } QIcon JKQTPColorPaletteTools::getPaletteKeyIcon(int i) { QImage img=getPaletteKeyImage(i, JKQTP_PALETTE_ICON_WIDTH, JKQTP_PALETTE_IMAGEICON_HEIGHT); QPixmap pix(JKQTP_PALETTE_ICON_WIDTH,JKQTP_PALETTE_IMAGEICON_HEIGHT); QRect r(0,0,JKQTP_PALETTE_ICON_WIDTH-1,JKQTP_PALETTE_IMAGEICON_HEIGHT-1); QPainter p(&pix); p.drawImage(r, img); p.setPen(QPen(QColor("black"))); p.drawRect(r); p.end(); return QIcon(pix); } QIcon JKQTPColorPaletteTools::getPaletteKeyIcon(JKQTPMathImageColorPalette palette) { return getPaletteIcon((int)palette); } QImage JKQTPColorPaletteTools::getPaletteKeyImage(int i, int width, int height) { QImage img; const double x01=double(width)/3.0; const double y01=double(height)/3.0*2.0; const double w1x=double(width*width)/(5.0*5.0); const double w1y=double(height*height)/(2.0*2.0); const double x02=double(width)/3.0*2.0; const double y02=double(height)/4.0; const double w2x=double(width*width)/(8.0*8.0); const double w2y=double(height*height)/(8.0*8.0); double* pic=(double*)malloc(width*height*sizeof(double)); double mmax=0; for (int j=0; j<width*height; j++) { const int x=j%width; const int y=j/width; pic[j]=exp(-0.5*(double((x-x01)*double(x-x01))/w1x+double((y-y01)*double(y-y01))/w1y))+0.7*exp(-0.5*(double((x-x02)*double(x-x02))/w2x+double((y-y02)*double(y-y02))/w2y)); if (pic[j]>mmax) mmax=pic[j]; } JKQTPimagePlot_array2image<double>(pic, width, height, img, (JKQTPMathImageColorPalette)i, 0, mmax); free(pic); return img; } QImage JKQTPColorPaletteTools::getPaletteKeyImage(JKQTPMathImageColorPalette palette, int width, int height) { return getPaletteKeyImage((int)palette, width, height); } void JKQTPColorPaletteTools::set_palette(int pal) { palette=(JKQTPMathImageColorPalette)pal; } void JKQTPColorPaletteTools::cbSetParent(JKQtBasePlotter* parent) { cbParent=parent; colorBarRightAxis->set_parent(parent); colorBarTopAxis->set_parent(parent); } double JKQTPColorPaletteTools::getInternalDataMin() const { return 0; } double JKQTPColorPaletteTools::getInternalDataMax() const { return 0; } #endif