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
This commit is contained in:
Georg Baum 2011-01-14 20:00:55 +00:00
parent 1b98ec3e99
commit cfd6767ec1
3 changed files with 67 additions and 5 deletions

View File

@ -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<string>(float(red) / 256) + ", "
+ convert<string>(float(green) / 256) + ", "
+ convert<string>(float(blue) / 256);
output = convert<string>(float(red) / scale) + ", "
+ convert<string>(float(green) / scale) + ", "
+ convert<string>(float(blue) / scale);
return output;
}
RGBColor const RGBColorFromLaTeX(string const & color)
{
vector<string> 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<unsigned int>(scale * convert<double>(rgb[0]) + 0.5);
c.g = static_cast<unsigned int>(scale * convert<double>(rgb[1]) + 0.5);
c.b = static_cast<unsigned int>(scale * convert<double>(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)
{}

View File

@ -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

View File

@ -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).