+static GC
+get_gc (MFrame *frame, MSymbol color, int for_foreground, int *rgb_ret)
+{
+ MWDevice *device = frame->device;
+ XColor xcolor;
+ RGB_GC *rgb_gc;
+
+ if (color == Mnil)
+ {
+ if (frame->rface)
+ goto no_color;
+ color = for_foreground ? frame->foreground : frame->background;
+ }
+ if (! XParseColor (FRAME_DISPLAY (frame), device->cmap,
+ msymbol_name (color), &xcolor))
+ goto no_color;
+ rgb_gc = get_rgb_gc (device, &xcolor);
+ if (! rgb_gc)
+ goto no_color;
+ if (rgb_ret)
+ *rgb_ret = rgb_gc->rgb;
+ return rgb_gc->gc;
+
+ no_color:
+ {
+ GCInfo *info = frame->rface->info;
+ GC gc;
+ int rgb;
+
+ if (for_foreground)
+ rgb = info->rgb_fore, gc = info->gc[GC_NORMAL];
+ else
+ rgb = info->rgb_back, gc = info->gc[GC_INVERSE];
+ if (rgb_ret)
+ *rgb_ret = rgb;
+ return gc;
+ }
+}
+
+static GC
+get_gc_for_anti_alias (MWDevice *device, GCInfo *info, int intensity)
+{
+ int rgb_fore, rgb_back;
+ XColor xcolor;
+ RGB_GC *rgb_gc;
+ GC gc;
+
+ if (info->gc[intensity])
+ return info->gc[intensity];
+
+ rgb_fore = info->rgb_fore, rgb_back = info->rgb_back;
+ xcolor.red = ((((rgb_fore & 0xFF0000) >> 16) * intensity
+ + ((rgb_back & 0xFF0000) >> 16) * (7 - intensity)) / 7) << 8;
+ xcolor.green = ((((rgb_fore & 0xFF00) >> 8) * intensity
+ + ((rgb_back & 0xFF00) >> 8) * (7 - intensity)) / 7) << 8;
+ xcolor.blue = (((rgb_fore & 0xFF) * intensity
+ + (rgb_back & 0xFF) * (7 - intensity)) / 7) << 8;
+ rgb_gc = get_rgb_gc (device, &xcolor);
+ if (rgb_gc)
+ gc = rgb_gc->gc;
+ else
+ gc =get_gc_for_anti_alias (device, info,
+ intensity < 4 ? intensity - 1 : intensity + 1);
+ return (info->gc[intensity] = gc);