X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FColorHandler.C;h=6a1f333ab4ecbf6cac6f4985d3234ac7e7ff1b7b;hb=98c966c64594611e469313314abd1e59524adb4a;hp=48aea3a9ca8aa1eedacd34128d2ef061adb3cf27;hpb=802d3221e0dae22037262d4185f5e671b86064ba;p=lyx.git diff --git a/src/ColorHandler.C b/src/ColorHandler.C index 48aea3a9ca..6a1f333ab4 100644 --- a/src/ColorHandler.C +++ b/src/ColorHandler.C @@ -1,10 +1,9 @@ -// -*- C++ -*- /* This file is part of * ====================================================== - * + * * LyX, The Document Processor - * - * Copyright 1998-2000 The LyX Team + * + * Copyright 1998-2001 The LyX Team * *======================================================*/ @@ -14,23 +13,27 @@ #pragma implementation #endif -#include - -#include FORMS_H_LOCATION -#include "debug.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 = fl_display; - drawable = XCreatePixmap(display, fl_root, 10, 10, - fl_get_visual_depth()); - - colormap = fl_state[fl_get_vclass()].colormap; + 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) { colorGCcache[i] = 0; @@ -49,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); } } @@ -69,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; @@ -103,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) { + 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 + for (int t = 0; t < vi->map_entries; ++t) { + // 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 @@ -135,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; @@ -159,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; } @@ -190,17 +205,18 @@ 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); } + // update GC cache after color redefinition 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); @@ -208,20 +224,20 @@ 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); } } - + } // -LyXColorHandler * lyxColorHandler; +boost::scoped_ptr lyxColorHandler;