static int rgb2xterm (uint8_t r, uint8_t g, uint8_t b) { static bool tableInit = false; double dst, dtmp; int best, i; if (!tableInit) { for (i=0; i<=253; ++i) colourTable_G[i] = xterm2rgb (i); tableInit = true; } best = 0; dst = 10000000000.0; for (i=0; i<=253; ++i) { dtmp = pow (colourTable_G[i].r - r, 2.0) + pow (colourTable_G[i].g - g, 2.0) + pow (colourTable_G[i].b - b, 2.0); if (dtmp < dst) { dst = dtmp; best = i; } } return best; }
int main() { int i = 16; unsigned char c[3]; puts("GIMP Palette"); puts("Name: xterm-256color"); puts("Columns: 12"); puts("#"); for (; i < 256; i ++) { xterm2rgb(i, c); printf("%3d %3d %3d #%d, ", c[0], c[1], c[2], i); if (i < 232) printf("color cube (%d, %d, %d)\n", ((i - 16) / 36) % 6, ((i - 16) / 6) % 6, (i - 16) % 6); else printf("grey ramp (%d)\n", i - 232); } return 0; }
bool CodeGenerator::parseSequence(const string& line, size_t begin, size_t end) { if (end-begin>2 && line[begin]!=0x1b && line[begin+1]!=0x5b) { return false; } int ansiCode=0; int colorCode=0; unsigned char colorValues[3]={0}; char colorString[10]={0}; string codes=line.substr(begin+2, end-begin-2); vector<string> codeVector = StringTools::splitString(codes, ';'); if (codes.empty()){ // fix empty grep --color ending sequence elementStyle.setReset(true); return true; } std::vector<std::string>::iterator itVectorData = codeVector.begin(); while( itVectorData != codeVector.end()) { StringTools::str2num<int>(ansiCode, *(itVectorData), std::dec); elementStyle.setReset(false); switch (ansiCode) { case 0: //Reset elementStyle.setReset(true); break; case 1: //Bold elementStyle.setBold(true); break; case 2: //Faint break; case 3: //italic elementStyle.setItalic(true); break; case 5: //Blink case 6: //Blink fast elementStyle.setBlink(true); break; case 8: // Conceal elementStyle.setConceal(true); break; case 4:// Underline Single case 21: // Underline double elementStyle.setUnderline(true); break; case 7: // image negative elementStyle.imageMode(true); break; case 22: // not bold, not faint elementStyle.setBold(false); break; case 24: //no underline elementStyle.setUnderline(false); break; case 25: //no blink elementStyle.setBlink(false); break; case 27: // image positive elementStyle.imageMode(false); break; case 28: // Reveal elementStyle.setConceal(false); break; case 30: elementStyle.setFgColour(ColorBlack); break; case 31: elementStyle.setFgColour(ColorRed); break; case 32: elementStyle.setFgColour(ColorGreen); break; case 33: elementStyle.setFgColour(ColorYellow); break; case 34: elementStyle.setFgColour(ColorBlue); break; case 35: elementStyle.setFgColour(ColorMagenta); break; case 36: elementStyle.setFgColour(ColorCyan); break; case 37: elementStyle.setFgColour(ColorWhite); break; case 38: // xterm 256 foreground color mode \033[38;5;<color> itVectorData++; if (itVectorData == codeVector.end()) break; if(*(itVectorData)!="5") break; itVectorData++; if (itVectorData == codeVector.end()) break; StringTools::str2num<int>(colorCode, *(itVectorData), std::dec); xterm2rgb((unsigned char)colorCode, colorValues); sprintf(colorString, "#%02x%02x%02x", colorValues[0], colorValues[1], colorValues[2]); elementStyle.setFgColour(colorString); break; case 39: elementStyle.setReset(true); break; case 40: elementStyle.setBgColour(ColorBlack); break; case 41: elementStyle.setBgColour(ColorRed); break; case 42: elementStyle.setBgColour(ColorGreen); break; case 43: elementStyle.setBgColour(ColorYellow); break; case 44: elementStyle.setBgColour(ColorBlue); break; case 45: elementStyle.setBgColour(ColorMagenta); break; case 46: elementStyle.setBgColour(ColorCyan); break; case 47: elementStyle.setBgColour(ColorWhite); break; case 48: // xterm 256 background color mode \033[48;5;<color> itVectorData++; if (itVectorData == codeVector.end()) break; if(*(itVectorData)!="5") break; itVectorData++; if (itVectorData == codeVector.end()) break; StringTools::str2num<int>(colorCode, *(itVectorData), std::dec); xterm2rgb((unsigned char)colorCode, colorValues); sprintf(colorString, "#%02x%02x%02x", colorValues[0], colorValues[1], colorValues[2]); elementStyle.setBgColour(colorString); break; case 49: elementStyle.setReset(true); break; } if (ansiCode>=30 and ansiCode <40) elementStyle.setFgColourID(ansiCode-30); if (ansiCode>=40 and ansiCode <50) elementStyle.setBgColourID(ansiCode-40); if (itVectorData != codeVector.end()) itVectorData++; } return true; }