From cfd6767ec1a4776cd9a8d90e0cc4f532afe2001d Mon Sep 17 00:00:00 2001 From: Georg Baum Date: Fri, 14 Jan 2011 20:00:55 +0000 Subject: [PATCH] Import notefontcolor (one more step towards a working roundtrip for the LyX documentation) git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@37213 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/Color.cpp | 48 +++++++++++++++++++++++++++++++++++++--- src/Color.h | 2 ++ src/tex2lyx/preamble.cpp | 22 ++++++++++++++++-- 3 files changed, 67 insertions(+), 5 deletions(-) diff --git a/src/Color.cpp b/src/Color.cpp index 8e4940a4fc..290c50a0b2 100644 --- a/src/Color.cpp +++ b/src/Color.cpp @@ -92,22 +92,64 @@ string const outputLaTeXColor(RGBColor const & color) int red = color.r; int green = color.g; int blue = color.b; +#ifdef USE_CORRECT_RGB_CONVERSION + int const scale = 255; +#else // the color values are given in the range of 0-255, so to get // an output of "0.5" for the value 127 we need to do the following + // FIXME: This is wrong, since it creates a nonlinear mapping: + // There is a gap between 0/256 and 2/256! + // 0.5 cannot be represented in 8bit hex RGB, it would be 127.5. if (red != 0) ++red; if (green != 0) ++green; if (blue != 0) ++blue; + int const scale = 256; +#endif string output; - output = convert(float(red) / 256) + ", " - + convert(float(green) / 256) + ", " - + convert(float(blue) / 256); + output = convert(float(red) / scale) + ", " + + convert(float(green) / scale) + ", " + + convert(float(blue) / scale); return output; } +RGBColor const RGBColorFromLaTeX(string const & color) +{ + vector rgb = getVectorFromString(color); + while (rgb.size() < 3) + rgb.push_back("0"); + RGBColor c; + for (int i = 0; i < 3; ++i) { + rgb[i] = trim(rgb[i]); + if (!isStrDbl(rgb[i])) + return c; + } +#ifdef USE_CORRECT_RGB_CONVERSION + int const scale = 255; +#else + // FIXME: This is wrong, since it creates a nonlinear mapping: + // Both 0/256 and 1/256 are mapped to 0! + // The wrong code exists only to match outputLaTeXColor(). + int const scale = 256; +#endif + c.r = static_cast(scale * convert(rgb[0]) + 0.5); + c.g = static_cast(scale * convert(rgb[1]) + 0.5); + c.b = static_cast(scale * convert(rgb[2]) + 0.5); +#ifndef USE_CORRECT_RGB_CONVERSION + if (c.r != 0) + c.r--; + if (c.g != 0) + c.g--; + if (c.b != 0) + c.b--; +#endif + return c; +} + + Color::Color(ColorCode base_color) : baseColor(base_color), mergeColor(Color_ignore) {} diff --git a/src/Color.h b/src/Color.h index 57ae496831..865f0ab8a8 100644 --- a/src/Color.h +++ b/src/Color.h @@ -62,6 +62,8 @@ std::ostream & operator<<(std::ostream & os, Color color); std::string const X11hexname(RGBColor const & col); RGBColor rgbFromHexName(std::string const & x11hexname); std::string const outputLaTeXColor(RGBColor const & color); +/// Inverse of outputLaTeXColor +RGBColor const RGBColorFromLaTeX(std::string const & color); } // namespace lyx diff --git a/src/tex2lyx/preamble.cpp b/src/tex2lyx/preamble.cpp index 8003e54195..d8624a2ba2 100644 --- a/src/tex2lyx/preamble.cpp +++ b/src/tex2lyx/preamble.cpp @@ -200,6 +200,7 @@ string h_use_esint = "1"; string h_cite_engine = "basic"; string h_use_bibtopic = "false"; string h_paperorientation = "portrait"; +string h_notefontcolor; string h_secnumdepth = "3"; string h_tocdepth = "3"; string h_paragraph_separation = "indent"; @@ -718,8 +719,10 @@ void end_preamble(ostream & os, TextClass const & /*textclass*/) << "\\use_esint " << h_use_esint << "\n" << "\\cite_engine " << h_cite_engine << "\n" << "\\use_bibtopic " << h_use_bibtopic << "\n" - << "\\paperorientation " << h_paperorientation << "\n" - << h_margins + << "\\paperorientation " << h_paperorientation << '\n'; + if (LYX_FORMAT >= 382 && !h_notefontcolor.empty()) + os << "\\notefontcolor " << h_notefontcolor << '\n'; + os << h_margins << "\\secnumdepth " << h_secnumdepth << "\n" << "\\tocdepth " << h_tocdepth << "\n" << "\\paragraph_separation " << h_paragraph_separation << "\n"; @@ -1068,6 +1071,21 @@ void parse_preamble(Parser & p, ostream & os, } } + else if (t.cs() == "definecolor") { + string const color = p.getArg('{', '}'); + string const space = p.getArg('{', '}'); + string const value = p.getArg('{', '}'); + if (LYX_FORMAT >= 382 && + color == "note_fontcolor" && space == "rgb") { + RGBColor c(RGBColorFromLaTeX(value)); + h_notefontcolor = X11hexname(c); + } else { + h_preamble << "\\definecolor{" << color + << "}{" << space << "}{" << value + << '}'; + } + } + else if (t.cs() == "jurabibsetup") { // FIXME p.getArg('{', '}') is most probably wrong (it // does not handle nested braces). -- 2.39.2