X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FColorHandler.C;h=6a1f333ab4ecbf6cac6f4985d3234ac7e7ff1b7b;hb=98c966c64594611e469313314abd1e59524adb4a;hp=2272dd12aeed9db4a175b4b88dd2624a1ce274cd;hpb=13ae124f460830626c6ea39dd7b21e099959d110;p=lyx.git diff --git a/src/ColorHandler.C b/src/ColorHandler.C index 2272dd12ae..6a1f333ab4 100644 --- a/src/ColorHandler.C +++ b/src/ColorHandler.C @@ -1,8 +1,8 @@ /* This file is part of * ====================================================== - * + * * LyX, The Document Processor - * + * * Copyright 1998-2001 The LyX Team * *======================================================*/ @@ -13,24 +13,26 @@ #pragma implementation #endif -#include - -#include "frontends/GUIRunTime.h" #include "ColorHandler.h" #include "LColor.h" #include "gettext.h" #include "debug.h" +#include "frontends/GUIRunTime.h" + +#include + using std::endl; -LyXColorHandler::LyXColorHandler() + +LyXColorHandler::LyXColorHandler() { display = GUIRunTime::x11Display(); drawable = XCreatePixmap(display, RootWindow(display, GUIRunTime::x11Screen()), 10, 10, GUIRunTime::x11VisualDepth()); - + colormap = GUIRunTime::x11Colormap(); // Clear the GC cache for (int i = 0; i <= LColor::ignore; ++i) { @@ -50,7 +52,7 @@ LyXColorHandler::~LyXColorHandler() // Iterate over the line cache and Free the GCs for (LineGCCache::iterator lit = lineGCcache.begin(); lit != lineGCcache.end(); ++lit) { - XFreeGC(display, (*lit).second); + XFreeGC(display, lit->second); } } @@ -70,27 +72,29 @@ GC LyXColorHandler::getGCForeground(LColor::color c) //if (lyxerr.debugging()) { // lyxerr << "Painter drawable: " << drawable() << endl; //} - - if (colorGCcache[c] != 0) return colorGCcache[c]; - XColor xcol, ccol; - string s = lcolor.getX11Name(c); + if (colorGCcache[c] != 0) + return colorGCcache[c]; + + XColor xcol; + XColor ccol; + string const s = lcolor.getX11Name(c); XGCValues val; // Look up the RGB values for the color, and an approximate // color that we can hope to get on this display. - if (XLookupColor(display, colormap, s.c_str(), &xcol, &ccol) == 0) { + if (XLookupColor(display, colormap, s.c_str(), &xcol, &ccol) == 0) { lyxerr << _("LyX: Unknown X11 color ") << s << _(" for ") << lcolor.getGUIName(c) << '\n' - << _(" Using black instead, sorry!.") << endl; + << _(" Using black instead, sorry!") << endl; unsigned long bla = BlackPixel(display, DefaultScreen(display)); val.foreground = bla; // Try the exact RGB values first, then the approximate. } else if (XAllocColor(display, colormap, &xcol) != 0) { - if (lyxerr.debugging()) { + if (lyxerr.debugging(Debug::GUI)) { lyxerr << _("LyX: X11 color ") << s - << _(" allocated for ") + << _(" allocated for ") << lcolor.getGUIName(c) << endl; } val.foreground = xcol.pixel; @@ -104,25 +108,25 @@ GC LyXColorHandler::getGCForeground(LColor::color c) // the color closest to the one we want. Visual * vi = DefaultVisual(display, DefaultScreen(display)); - XColor * cmap = new XColor[vi->map_entries]; + boost::scoped_array cmap(new XColor[vi->map_entries]); for (int i = 0; i < vi->map_entries; ++i) { cmap[i].pixel = i; } - XQueryColors(display, colormap, cmap, vi->map_entries); + XQueryColors(display, colormap, cmap.get(), vi->map_entries); // Walk through the cmap and look for close colors. int closest_pixel = 0; double closest_distance = 1e20; // we want to minimize this double distance = 0; for (int t = 0; t < vi->map_entries; ++t) { - // The Euclidean distance between two points in + // The Euclidean distance between two points in // a three-dimensional space, the RGB color-cube, // is used as the distance measurement between two // colors. // Since square-root is monotonous, we don't have to - // take the square-root to find the minimum, and thus + // take the square-root to find the minimum, and thus // we use the squared distance instead to be faster. // If we want to get fancy, we could convert the RGB @@ -136,20 +140,19 @@ GC LyXColorHandler::getGCForeground(LColor::color c) closest_pixel = t; } } - lyxerr << _("LyX: Couldn't allocate '") << s + lyxerr << _("LyX: Couldn't allocate '") << s << _("' for ") << lcolor.getGUIName(c) - << _(" with (r,g,b)=(") + << _(" with (r,g,b)=(") << xcol.red << "," << xcol.green << "," << xcol.blue << ").\n" << _(" Using closest allocated " - "color with (r,g,b)=(") + "color with (r,g,b)=(") << cmap[closest_pixel].red << "," << cmap[closest_pixel].green << "," << cmap[closest_pixel].blue << _(") instead.\n") - << _("Pixel [") << closest_pixel << _("] is used.") + << _("Pixel [") << closest_pixel << _("] is used.") << endl; val.foreground = cmap[closest_pixel].pixel; - delete[] cmap; } val.function = GXcopy; @@ -160,29 +163,40 @@ GC LyXColorHandler::getGCForeground(LColor::color c) // Gets GC for line GC LyXColorHandler::getGCLinepars(PainterBase::line_style ls, - PainterBase::line_width lw, LColor::color c) + PainterBase::line_width lw, LColor::color c) { //if (lyxerr.debugging()) { // lyxerr << "Painter drawable: " << drawable() << endl; //} - - int index = lw + (ls << 1) + (c << 3); - if (lineGCcache.find(index) != lineGCcache.end()) - return lineGCcache[index]; + int index = lw + (ls << 1) + (c << 6); + + LineGCCache::iterator it = lineGCcache.find(index); + if (it != lineGCcache.end()) + return it->second; XGCValues val; XGetGCValues(display, getGCForeground(c), GCForeground, &val); - + switch (lw) { - case PainterBase::line_thin: val.line_width = 0; break; - case PainterBase::line_thick: val.line_width = 2; break; + case PainterBase::line_thin: + val.line_width = 0; + break; + case PainterBase::line_thick: + val.line_width = 2; + break; } - + switch (ls) { - case PainterBase::line_solid: val.line_style = LineSolid; break; - case PainterBase::line_onoffdash: val.line_style = LineOnOffDash; break; - case PainterBase::line_doubledash: val.line_style = LineDoubleDash; break; + case PainterBase::line_solid: + val.line_style = LineSolid; + break; + case PainterBase::line_onoffdash: + val.line_style = LineOnOffDash; + break; + case PainterBase::line_doubledash: + val.line_style = LineDoubleDash; + break; } @@ -191,8 +205,8 @@ GC LyXColorHandler::getGCLinepars(PainterBase::line_style ls, val.function = GXcopy; return lineGCcache[index] = - XCreateGC(display, drawable, - GCForeground | GCLineStyle | GCLineWidth | + XCreateGC(display, drawable, + GCForeground | GCLineStyle | GCLineWidth | GCCapStyle | GCJoinStyle | GCFunction, &val); } @@ -202,7 +216,7 @@ void LyXColorHandler::updateColor (LColor::color c) { // color GC cache GC gc = colorGCcache[c]; - if (gc != NULL) { + if (gc != 0) { XFreeGC(display, gc); colorGCcache[c] = NULL; getGCForeground(c); @@ -210,19 +224,19 @@ void LyXColorHandler::updateColor (LColor::color c) // line GC cache - int index, ls, lw; - for (ls=0; ls<3; ++ls) - for (lw=0; lw<2; ++lw) { - index = lw + (ls << 1) + (c << 3); - if (lineGCcache.find(index) != lineGCcache.end()) { - gc = lineGCcache[index]; - XFreeGC(display,gc); - lineGCcache.erase(index); + for (int ls = 0; ls < 3; ++ls) + for (int lw = 0; lw < 2; ++lw) { + int const index = lw + (ls << 1) + (c << 6); + LineGCCache::iterator it = lineGCcache.find(index); + if (it != lineGCcache.end()) { + gc = it->second; + XFreeGC(display, gc); + lineGCcache.erase(it); getGCLinepars(PainterBase::line_style(ls), - PainterBase::line_width(lw), c); + PainterBase::line_width(lw), c); } } - + } //