1/* 2 * Copyright © 2000 Keith Packard 3 * 4 * Permission to use, copy, modify, distribute, and sell this software and its 5 * documentation for any purpose is hereby granted without fee, provided that 6 * the above copyright notice appear in all copies and that both that 7 * copyright notice and this permission notice appear in supporting 8 * documentation, and that the name of Keith Packard not be used in 9 * advertising or publicity pertaining to distribution of the software without 10 * specific, written prior permission. Keith Packard makes no 11 * representations about the suitability of this software for any purpose. It 12 * is provided "as is" without express or implied warranty. 13 * 14 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 16 * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR 17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, 18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 20 * PERFORMANCE OF THIS SOFTWARE. 21 */ 22 23#include "xftint.h" 24 25_X_EXPORT Bool 26XftColorAllocName (Display *dpy, 27 _Xconst Visual *visual _X_UNUSED, 28 Colormap cmap, 29 _Xconst char *name, 30 XftColor *result) 31{ 32 XColor screen, exact; 33 34 if (!XAllocNamedColor (dpy, cmap, name, &screen, &exact)) 35 { 36 /* XXX stick standard colormap stuff here */ 37 return False; 38 } 39 40 result->pixel = screen.pixel; 41 result->color.red = exact.red; 42 result->color.green = exact.green; 43 result->color.blue = exact.blue; 44 result->color.alpha = 0xffff; 45 return True; 46} 47 48static short 49maskbase (unsigned long m) 50{ 51 short i; 52 53 if (!m) 54 return 0; 55 i = 0; 56 while (!(m&1)) 57 { 58 m>>=1; 59 i++; 60 } 61 return i; 62} 63 64static short 65masklen (unsigned long m) 66{ 67 unsigned long y; 68 69 y = (m >> 1) &033333333333; 70 y = m - y - ((y >>1) & 033333333333); 71 return (short) (((y + (y >> 3)) & 030707070707) % 077); 72} 73 74_X_EXPORT Bool 75XftColorAllocValue (Display *dpy, 76 Visual *visual, 77 Colormap cmap, 78 _Xconst XRenderColor *color, 79 XftColor *result) 80{ 81 if (visual->class == TrueColor) 82 { 83 int red_shift, red_len; 84 int green_shift, green_len; 85 int blue_shift, blue_len; 86 87 red_shift = maskbase (visual->red_mask); 88 red_len = masklen (visual->red_mask); 89 green_shift = maskbase (visual->green_mask); 90 green_len = masklen (visual->green_mask); 91 blue_shift = maskbase (visual->blue_mask); 92 blue_len = masklen (visual->blue_mask); 93 result->pixel = (unsigned long)(((color->red >> (16 - red_len)) << red_shift) | 94 ((color->green >> (16 - green_len)) << green_shift) | 95 ((color->blue >> (16 - blue_len)) << blue_shift)); 96 } 97 else 98 { 99 XColor xcolor; 100 101 xcolor.red = color->red; 102 xcolor.green = color->green; 103 xcolor.blue = color->blue; 104 if (!XAllocColor (dpy, cmap, &xcolor)) 105 return False; 106 result->pixel = xcolor.pixel; 107 } 108 result->color.red = color->red; 109 result->color.green = color->green; 110 result->color.blue = color->blue; 111 result->color.alpha = color->alpha; 112 return True; 113} 114 115_X_EXPORT void 116XftColorFree (Display *dpy, 117 Visual *visual, 118 Colormap cmap, 119 XftColor *color) 120{ 121 if (visual->class != TrueColor) 122 XFreeColors (dpy, cmap, &color->pixel, 1, 0); 123} 124