diff options
Diffstat (limited to 'nx-X11/lib/Xft/xftcore.c')
-rw-r--r-- | nx-X11/lib/Xft/xftcore.c | 1375 |
1 files changed, 0 insertions, 1375 deletions
diff --git a/nx-X11/lib/Xft/xftcore.c b/nx-X11/lib/Xft/xftcore.c deleted file mode 100644 index 1052a1d09..000000000 --- a/nx-X11/lib/Xft/xftcore.c +++ /dev/null @@ -1,1375 +0,0 @@ -/* - * $Id: xftcore.c,v 1.4 2005/07/03 07:00:57 daniels Exp $ - * - * Copyright © 2000 Keith Packard - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of Keith Packard not be used in - * advertising or publicity pertaining to distribution of the software without - * specific, written prior permission. Keith Packard makes no - * representations about the suitability of this software for any purpose. It - * is provided "as is" without express or implied warranty. - * - * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO - * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -#include "xftint.h" - -void -XftRectCore (XftDraw *draw, - _Xconst XftColor *color, - int x, - int y, - unsigned int width, - unsigned int height) -{ - if (color->color.alpha >= 0x8000) - { - XSetForeground (draw->dpy, draw->core.gc, color->pixel); - XFillRectangle (draw->dpy, draw->drawable, draw->core.gc, - x, y, width, height); - } -} - -/* - * Use the core protocol to draw the glyphs - */ - -static void -_XftSharpGlyphMono (XftDraw *draw, - XftGlyph *glyph, - int x, - int y) -{ - unsigned char *srcLine = glyph->bitmap, *src; - unsigned char bits, bitsMask; - int width = glyph->metrics.width; - int stride = ((width + 31) & ~31) >> 3; - int height = glyph->metrics.height; - int w; - int xspan, lenspan; - - x -= glyph->metrics.x; - y -= glyph->metrics.y; - while (height--) - { - src = srcLine; - srcLine += stride; - w = width; - - bitsMask = 0x80; /* FreeType is always MSB first */ - bits = *src++; - - xspan = x; - while (w) - { - if (bits & bitsMask) - { - lenspan = 0; - do - { - lenspan++; - if (lenspan == w) - break; - bitsMask = bitsMask >> 1; - if (!bitsMask) - { - bits = *src++; - bitsMask = 0x80; - } - } while (bits & bitsMask); - XFillRectangle (draw->dpy, draw->drawable, - draw->core.gc, xspan, y, lenspan, 1); - xspan += lenspan; - w -= lenspan; - } - else - { - do - { - w--; - xspan++; - if (!w) - break; - bitsMask = bitsMask >> 1; - if (!bitsMask) - { - bits = *src++; - bitsMask = 0x80; - } - } while (!(bits & bitsMask)); - } - } - y++; - } -} - -/* - * Draw solid color text from an anti-aliased bitmap. This is a - * fallback for cases where a particular drawable has no AA code - */ -static void -_XftSharpGlyphGray (XftDraw *draw, - XftGlyph *glyph, - int x, - int y) -{ - unsigned char *srcLine = glyph->bitmap, *src, bits; - int width = glyph->metrics.width; - int stride = ((width + 3) & ~3); - int height = glyph->metrics.height; - int w; - int xspan, lenspan; - - x -= glyph->metrics.x; - y -= glyph->metrics.y; - while (height--) - { - src = srcLine; - srcLine += stride; - w = width; - - bits = *src++; - xspan = x; - while (w) - { - if (bits >= 0x80) - { - lenspan = 0; - do - { - lenspan++; - if (lenspan == w) - break; - bits = *src++; - } while (bits >= 0x80); - XFillRectangle (draw->dpy, draw->drawable, - draw->core.gc, xspan, y, lenspan, 1); - xspan += lenspan; - w -= lenspan; - } - else - { - do - { - w--; - xspan++; - if (!w) - break; - bits = *src++; - } while (bits < 0x80); - } - } - y++; - } -} - -static void -_XftSharpGlyphRgba (XftDraw *draw, - XftGlyph *glyph, - int x, - int y) -{ - CARD32 *srcLine = glyph->bitmap, *src, bits; - int width = glyph->metrics.width; - int stride = ((width + 3) & ~3); - int height = glyph->metrics.height; - int w; - int xspan, lenspan; - - x -= glyph->metrics.x; - y -= glyph->metrics.y; - while (height--) - { - src = srcLine; - srcLine += stride; - w = width; - - bits = *src++; - xspan = x; - while (w) - { - if (bits >= 0x80000000) - { - lenspan = 0; - do - { - lenspan++; - if (lenspan == w) - break; - bits = *src++; - } while (bits >= 0x80000000); - XFillRectangle (draw->dpy, draw->drawable, - draw->core.gc, xspan, y, lenspan, 1); - xspan += lenspan; - w -= lenspan; - } - else - { - do - { - w--; - xspan++; - if (!w) - break; - bits = *src++; - } while (bits < 0x80000000); - } - } - y++; - } -} - -typedef void (*XftSharpGlyph) (XftDraw *draw, - XftGlyph *glyph, - int x, - int y); - -static XftSharpGlyph -_XftSharpGlyphFind (XftDraw *draw, XftFont *public) -{ - XftFontInt *font = (XftFontInt *) public; - - if (!font->info.antialias) - return _XftSharpGlyphMono; - else switch (font->info.rgba) { - case FC_RGBA_RGB: - case FC_RGBA_BGR: - case FC_RGBA_VRGB: - case FC_RGBA_VBGR: - return _XftSharpGlyphRgba; - default: - return _XftSharpGlyphGray; - } -} - -/* - * Draw glyphs to a target that supports anti-aliasing - */ - -/* - * Primitives for converting between RGB values and TrueColor pixels - */ - -static void -_XftExamineBitfield (unsigned long mask, int *shift, int *len) -{ - int s, l; - - s = 0; - while ((mask & 1) == 0) - { - mask >>= 1; - s++; - } - l = 0; - while ((mask & 1) == 1) - { - mask >>= 1; - l++; - } - *shift = s; - *len = l; -} - -static CARD32 -_XftGetField (unsigned long l_pixel, int shift, int len) -{ - CARD32 pixel = (CARD32) l_pixel; - - pixel = pixel & (((1 << (len)) - 1) << shift); - pixel = pixel << (32 - (shift + len)) >> 24; - while (len < 8) - { - pixel |= (pixel >> len); - len <<= 1; - } - return pixel; -} - -static unsigned long -_XftPutField (CARD32 pixel, int shift, int len) -{ - unsigned long l_pixel = (unsigned long) pixel; - - shift = shift - (8 - len); - if (len <= 8) - l_pixel &= (((1 << len) - 1) << (8 - len)); - if (shift < 0) - l_pixel >>= -shift; - else - l_pixel <<= shift; - return l_pixel; -} - -/* - * This is used when doing XftCharFontSpec/XftGlyphFontSpec where - * some of the fonts are bitmaps and some are anti-aliased to handle - * the bitmap portions - */ -static void -_XftSmoothGlyphMono (XImage *image, - _Xconst XftGlyph *xftg, - int x, - int y, - _Xconst XftColor *color) -{ - unsigned char *srcLine = xftg->bitmap, *src; - unsigned char bits, bitsMask; - int width = xftg->metrics.width; - int stride = ((width + 31) & ~31) >> 3; - int height = xftg->metrics.height; - int w; - int xspan; - int r_shift, r_len; - int g_shift, g_len; - int b_shift, b_len; - unsigned long pixel; - - _XftExamineBitfield (image->red_mask, &r_shift, &r_len); - _XftExamineBitfield (image->green_mask, &g_shift, &g_len); - _XftExamineBitfield (image->blue_mask, &b_shift, &b_len); - pixel = (_XftPutField (color->color.red >> 8, r_shift, r_len) | - _XftPutField (color->color.green >> 8, g_shift, g_len) | - _XftPutField (color->color.blue >> 8, b_shift, b_len)); - x -= xftg->metrics.x; - y -= xftg->metrics.y; - while (height--) - { - src = srcLine; - srcLine += stride; - w = width; - - bitsMask = 0x80; /* FreeType is always MSB first */ - bits = *src++; - - xspan = x; - while (w--) - { - if (bits & bitsMask) - XPutPixel (image, xspan, y, pixel); - bitsMask = bitsMask >> 1; - if (!bitsMask) - { - bits = *src++; - bitsMask = 0x80; - } - xspan++; - } - y++; - } -} - -/* - * As simple anti-aliasing is likely to be common, there are three - * optimized versions for the usual true color pixel formats (888, 565, 555). - * Other formats are handled by the general case - */ - -#define cvt8888to0565(s) ((((s) >> 3) & 0x001f) | \ - (((s) >> 5) & 0x07e0) | \ - (((s) >> 8) & 0xf800)) - -#define cvt0565to8888(s) (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \ - ((((s) << 5) & 0xfc00) | (((s) >> 1) & 0x300)) | \ - ((((s) << 8) & 0xf80000) | (((s) << 3) & 0x70000))) - -#define cvt8888to0555(s) ((((s) >> 3) & 0x001f) | \ - (((s) >> 6) & 0x03e0) | \ - (((s) >> 7) & 0x7c00)) - -#define cvt0555to8888(s) (((((s) << 3) & 0xf8) | (((s) >> 2) & 0x7)) | \ - ((((s) << 6) & 0xf800) | (((s) >> 0) & 0x300)) | \ - ((((s) << 9) & 0xf80000) | (((s) << 4) & 0x70000))) - - -#define XftIntMult(a,b,t) ( (t) = (a) * (b) + 0x80, ( ( ( (t)>>8 ) + (t) )>>8 ) ) -#define XftIntDiv(a,b) (((CARD16) (a) * 255) / (b)) - -#define XftGet8(v,i) ((CARD16) (CARD8) ((v) >> i)) - -/* - * There are two ways of handling alpha -- either as a single unified value or - * a separate value for each component, hence each macro must have two - * versions. The unified alpha version has a 'U' at the end of the name, - * the component version has a 'C'. Similarly, functions which deal with - * this difference will have two versions using the same convention. - */ - -#define XftOverU(x,y,i,a,t) ((t) = XftIntMult(XftGet8(y,i),(a),(t)) + XftGet8(x,i),\ - (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i)) - -#define XftOverC(x,y,i,a,t) ((t) = XftIntMult(XftGet8(y,i),XftGet8(a,i),(t)) + XftGet8(x,i),\ - (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i)) - -#define XftInU(x,i,a,t) ((CARD32) XftIntMult(XftGet8(x,i),(a),(t)) << (i)) - -#define XftInC(x,i,a,t) ((CARD32) XftIntMult(XftGet8(x,i),XftGet8(a,i),(t)) << (i)) - -#define XftGen(x,y,i,ax,ay,t,u,v) ((t) = (XftIntMult(XftGet8(y,i),ay,(u)) + \ - XftIntMult(XftGet8(x,i),ax,(v))),\ - (CARD32) ((CARD8) ((t) | \ - (0 - ((t) >> 8)))) << (i)) - -#define XftAdd(x,y,i,t) ((t) = XftGet8(x,i) + XftGet8(y,i), \ - (CARD32) ((CARD8) ((t) | (0 - ((t) >> 8)))) << (i)) - - -static CARD32 -fbOver24 (CARD32 x, CARD32 y) -{ - CARD16 a = ~x >> 24; - CARD16 t; - CARD32 m,n,o; - - m = XftOverU(x,y,0,a,t); - n = XftOverU(x,y,8,a,t); - o = XftOverU(x,y,16,a,t); - return m|n|o; -} - -static CARD32 -fbIn (CARD32 x, CARD8 y) -{ - CARD16 a = y; - CARD16 t; - CARD32 m,n,o,p; - - m = XftInU(x,0,a,t); - n = XftInU(x,8,a,t); - o = XftInU(x,16,a,t); - p = XftInU(x,24,a,t); - return m|n|o|p; -} - -static void -_XftSmoothGlyphGray8888 (XImage *image, - _Xconst XftGlyph *xftg, - int x, - int y, - _Xconst XftColor *color) -{ - CARD32 src, srca; - CARD32 r, g, b; - CARD32 *dstLine, *dst, d; - CARD8 *maskLine, *mask, m; - int dstStride, maskStride; - int width, height; - int w; - - srca = color->color.alpha >> 8; - - /* This handles only RGB and BGR */ - g = (color->color.green & 0xff00); - if (image->red_mask == 0xff0000) - { - r = (color->color.red & 0xff00) << 8; - b = color->color.blue >> 8; - } - else - { - r = color->color.red >> 8; - b = (color->color.blue & 0xff00) << 8; - } - src = (srca << 24) | r | g | b; - - width = xftg->metrics.width; - height = xftg->metrics.height; - - x -= xftg->metrics.x; - y -= xftg->metrics.y; - - dstLine = (CARD32 *) (image->data + image->bytes_per_line * y + (x << 2)); - dstStride = image->bytes_per_line >> 2; - maskLine = (unsigned char *) xftg->bitmap; - maskStride = (width + 3) & ~3; - - while (height--) - { - dst = dstLine; - dstLine += dstStride; - mask = maskLine; - maskLine += maskStride; - w = width; - - while (w--) - { - m = *mask++; - if (m == 0xff) - { - if (srca == 0xff) - *dst = src; - else - *dst = fbOver24 (src, *dst); - } - else if (m) - { - d = fbIn (src, m); - *dst = fbOver24 (d, *dst); - } - dst++; - } - } -} - -static void -_XftSmoothGlyphGray565 (XImage *image, - _Xconst XftGlyph *xftg, - int x, - int y, - _Xconst XftColor *color) -{ - CARD32 src, srca; - CARD32 r, g, b; - CARD32 d; - CARD16 *dstLine, *dst; - CARD8 *maskLine, *mask, m; - int dstStride, maskStride; - int width, height; - int w; - - srca = color->color.alpha >> 8; - - /* This handles only RGB and BGR */ - g = (color->color.green & 0xff00); - if (image->red_mask == 0xf800) - { - r = (color->color.red & 0xff00) << 8; - b = color->color.blue >> 8; - } - else - { - r = color->color.red >> 8; - b = (color->color.blue & 0xff00) << 8; - } - src = (srca << 24) | r | g | b; - - width = xftg->metrics.width; - height = xftg->metrics.height; - - x -= xftg->metrics.x; - y -= xftg->metrics.y; - - dstLine = (CARD16 *) (image->data + image->bytes_per_line * y + (x << 1)); - dstStride = image->bytes_per_line >> 1; - maskLine = (unsigned char *) xftg->bitmap; - maskStride = (width + 3) & ~3; - - while (height--) - { - dst = dstLine; - dstLine += dstStride; - mask = maskLine; - maskLine += maskStride; - w = width; - - while (w--) - { - m = *mask++; - if (m == 0xff) - { - if (srca == 0xff) - d = src; - else - { - d = *dst; - d = fbOver24 (src, cvt0565to8888(d)); - } - *dst = cvt8888to0565(d); - } - else if (m) - { - d = *dst; - d = fbOver24 (fbIn(src,m), cvt0565to8888(d)); - *dst = cvt8888to0565(d); - } - dst++; - } - } -} - -static void -_XftSmoothGlyphGray555 (XImage *image, - _Xconst XftGlyph *xftg, - int x, - int y, - _Xconst XftColor *color) -{ - CARD32 src, srca; - CARD32 r, g, b; - CARD32 d; - CARD16 *dstLine, *dst; - CARD8 *maskLine, *mask, m; - int dstStride, maskStride; - int width, height; - int w; - - srca = color->color.alpha >> 8; - - /* This handles only RGB and BGR */ - g = (color->color.green & 0xff00); - if (image->red_mask == 0xf800) - { - r = (color->color.red & 0xff00) << 8; - b = color->color.blue >> 8; - } - else - { - r = color->color.red >> 8; - b = (color->color.blue & 0xff00) << 8; - } - src = (srca << 24) | r | g | b; - - width = xftg->metrics.width; - height = xftg->metrics.height; - - x -= xftg->metrics.x; - y -= xftg->metrics.y; - - dstLine = (CARD16 *) (image->data + image->bytes_per_line * y + (x << 1)); - dstStride = image->bytes_per_line >> 1; - maskLine = (unsigned char *) xftg->bitmap; - maskStride = (width + 3) & ~3; - - while (height--) - { - dst = dstLine; - dstLine += dstStride; - mask = maskLine; - maskLine += maskStride; - w = width; - - while (w--) - { - m = *mask++; - if (m == 0xff) - { - if (srca == 0xff) - d = src; - else - { - d = *dst; - d = fbOver24 (src, cvt0555to8888(d)); - } - *dst = cvt8888to0555(d); - } - else if (m) - { - d = *dst; - d = fbOver24 (fbIn(src,m), cvt0555to8888(d)); - *dst = cvt8888to0555(d); - } - dst++; - } - } -} - -static void -_XftSmoothGlyphGray (XImage *image, - _Xconst XftGlyph *xftg, - int x, - int y, - _Xconst XftColor *color) -{ - CARD32 src, srca; - int r_shift, r_len; - int g_shift, g_len; - int b_shift, b_len; - CARD8 *maskLine, *mask, m; - int maskStride; - CARD32 d; - unsigned long pixel; - int width, height; - int w, tx; - - srca = color->color.alpha >> 8; - src = (srca << 24 | - (color->color.red & 0xff00) << 8 | - (color->color.green & 0xff00) | - (color->color.blue) >> 8); - x -= xftg->metrics.x; - y -= xftg->metrics.y; - width = xftg->metrics.width; - height = xftg->metrics.height; - - maskLine = (unsigned char *) xftg->bitmap; - maskStride = (width + 3) & ~3; - - _XftExamineBitfield (image->red_mask, &r_shift, &r_len); - _XftExamineBitfield (image->green_mask, &g_shift, &g_len); - _XftExamineBitfield (image->blue_mask, &b_shift, &b_len); - while (height--) - { - mask = maskLine; - maskLine += maskStride; - w = width; - tx = x; - - while (w--) - { - m = *mask++; - if (m == 0xff) - { - if (srca == 0xff) - d = src; - else - { - pixel = XGetPixel (image, tx, y); - d = (_XftGetField (pixel, r_shift, r_len) << 16 | - _XftGetField (pixel, g_shift, g_len) << 8 | - _XftGetField (pixel, b_shift, b_len)); - d = fbOver24 (src, d); - } - pixel = (_XftPutField ((d >> 16) & 0xff, r_shift, r_len) | - _XftPutField ((d >> 8) & 0xff, g_shift, g_len) | - _XftPutField ((d ) & 0xff, b_shift, b_len)); - XPutPixel (image, tx, y, pixel); - } - else if (m) - { - pixel = XGetPixel (image, tx, y); - d = (_XftGetField (pixel, r_shift, r_len) << 16 | - _XftGetField (pixel, g_shift, g_len) << 8 | - _XftGetField (pixel, b_shift, b_len)); - d = fbOver24 (fbIn(src,m), d); - pixel = (_XftPutField ((d >> 16) & 0xff, r_shift, r_len) | - _XftPutField ((d >> 8) & 0xff, g_shift, g_len) | - _XftPutField ((d ) & 0xff, b_shift, b_len)); - XPutPixel (image, tx, y, pixel); - } - tx++; - } - y++; - } -} - -static void -_XftSmoothGlyphRgba (XImage *image, - _Xconst XftGlyph *xftg, - int x, - int y, - _Xconst XftColor *color) -{ - CARD32 src, srca; - int r_shift, r_len; - int g_shift, g_len; - int b_shift, b_len; - CARD32 *mask, ma; - CARD32 d; - unsigned long pixel; - int width, height; - int w, tx; - - srca = color->color.alpha >> 8; - src = (srca << 24 | - (color->color.red & 0xff00) << 8 | - (color->color.green & 0xff00) | - (color->color.blue) >> 8); - x -= xftg->metrics.x; - y -= xftg->metrics.y; - width = xftg->metrics.width; - height = xftg->metrics.height; - - mask = (CARD32 *) xftg->bitmap; - - _XftExamineBitfield (image->red_mask, &r_shift, &r_len); - _XftExamineBitfield (image->green_mask, &g_shift, &g_len); - _XftExamineBitfield (image->blue_mask, &b_shift, &b_len); - while (height--) - { - w = width; - tx = x; - - while (w--) - { - ma = *mask++; - if (ma == 0xffffffff) - { - if (srca == 0xff) - d = src; - else - { - pixel = XGetPixel (image, tx, y); - d = (_XftGetField (pixel, r_shift, r_len) << 16 | - _XftGetField (pixel, g_shift, g_len) << 8 | - _XftGetField (pixel, b_shift, b_len)); - d = fbOver24 (src, d); - } - pixel = (_XftPutField ((d >> 16) & 0xff, r_shift, r_len) | - _XftPutField ((d >> 8) & 0xff, g_shift, g_len) | - _XftPutField ((d ) & 0xff, b_shift, b_len)); - XPutPixel (image, tx, y, pixel); - } - else if (ma) - { - CARD32 m,n,o; - pixel = XGetPixel (image, tx, y); - d = (_XftGetField (pixel, r_shift, r_len) << 16 | - _XftGetField (pixel, g_shift, g_len) << 8 | - _XftGetField (pixel, b_shift, b_len)); -#define XftInOverC(src,srca,msk,dst,i,result) { \ - CARD16 __a = XftGet8(msk,i); \ - CARD32 __t, __ta; \ - CARD32 __i; \ - __t = XftIntMult (XftGet8(src,i), __a,__i); \ - __ta = (CARD8) ~XftIntMult (srca, __a,__i); \ - __t = __t + XftIntMult(XftGet8(dst,i),__ta,__i); \ - __t = (CARD32) (CARD8) (__t | (-(__t >> 8))); \ - result = __t << (i); \ -} - XftInOverC(src,srca,ma,d,0,m); - XftInOverC(src,srca,ma,d,8,n); - XftInOverC(src,srca,ma,d,16,o); - d = m | n | o; - pixel = (_XftPutField ((d >> 16) & 0xff, r_shift, r_len) | - _XftPutField ((d >> 8) & 0xff, g_shift, g_len) | - _XftPutField ((d ) & 0xff, b_shift, b_len)); - XPutPixel (image, tx, y, pixel); - } - tx++; - } - y++; - } -} - -static FcBool -_XftSmoothGlyphPossible (XftDraw *draw) -{ - if (!draw->visual) - return FcFalse; - if (draw->visual->class != TrueColor) - return FcFalse; - return FcTrue; -} - -typedef void (*XftSmoothGlyph) (XImage *image, - _Xconst XftGlyph *xftg, - int x, - int y, - _Xconst XftColor *color); - -static XftSmoothGlyph -_XftSmoothGlyphFind (XftDraw *draw, XftFont *public) -{ - XftFontInt *font = (XftFontInt *) public; - - if (!font->info.antialias) - return _XftSmoothGlyphMono; - else switch (font->info.rgba) { - case FC_RGBA_RGB: - case FC_RGBA_BGR: - case FC_RGBA_VRGB: - case FC_RGBA_VBGR: - return _XftSmoothGlyphRgba; - default: - switch (XftDrawBitsPerPixel (draw)) { - case 32: - if ((draw->visual->red_mask == 0xff0000 && - draw->visual->green_mask == 0x00ff00 && - draw->visual->blue_mask == 0x0000ff) || - (draw->visual->red_mask == 0x0000ff && - draw->visual->green_mask == 0x00ff00 && - draw->visual->blue_mask == 0xff0000)) - { - return _XftSmoothGlyphGray8888; - } - break; - case 16: - if ((draw->visual->red_mask == 0xf800 && - draw->visual->green_mask == 0x07e0 && - draw->visual->blue_mask == 0x001f) || - (draw->visual->red_mask == 0x001f && - draw->visual->green_mask == 0x07e0 && - draw->visual->blue_mask == 0xf800)) - { - return _XftSmoothGlyphGray565; - } - if ((draw->visual->red_mask == 0x7c00 && - draw->visual->green_mask == 0x03e0 && - draw->visual->blue_mask == 0x001f) || - (draw->visual->red_mask == 0x001f && - draw->visual->green_mask == 0x03e0 && - draw->visual->blue_mask == 0x7c00)) - { - return _XftSmoothGlyphGray555; - } - break; - default: - break; - } - return _XftSmoothGlyphGray; - } -} - -static XftGlyph * -_XftGlyphDefault (Display *dpy, XftFont *public) -{ - XftFontInt *font = (XftFontInt *) public; - FT_UInt missing[XFT_NMISSING]; - int nmissing; - FcBool glyphs_loaded = FcFalse; - - if (XftFontCheckGlyph (dpy, public, FcTrue, 0, missing, &nmissing)) - glyphs_loaded = FcTrue; - if (nmissing) - XftFontLoadGlyphs (dpy, public, FcTrue, missing, nmissing); - return font->glyphs[0]; -} - -static int XftGetImageErrorHandler (Display *dpy, XErrorEvent *error_event) -{ - return 0; -} - -void -XftGlyphCore (XftDraw *draw, - _Xconst XftColor *color, - XftFont *public, - int x, - int y, - _Xconst FT_UInt *glyphs, - int nglyphs) -{ - Display *dpy = draw->dpy; - XftFontInt *font = (XftFontInt *) public; - XftGlyph *xftg; - FT_UInt glyph; - _Xconst FT_UInt *g; - FT_UInt missing[XFT_NMISSING]; - FcBool glyphs_loaded; - int nmissing; - int n; - XErrorHandler prev_error; - - /* - * Load missing glyphs - */ - g = glyphs; - n = nglyphs; - nmissing = 0; - glyphs_loaded = FcFalse; - while (n--) - if (XftFontCheckGlyph (dpy, public, FcTrue, *g++, missing, &nmissing)) - glyphs_loaded = FcTrue; - if (nmissing) - XftFontLoadGlyphs (dpy, public, FcTrue, missing, nmissing); - - g = glyphs; - n = nglyphs; - if ((font->info.antialias || color->color.alpha != 0xffff) && - _XftSmoothGlyphPossible (draw)) - { - XGlyphInfo gi; - XImage *image; - unsigned int depth; - int ox, oy; - XftSmoothGlyph smooth = _XftSmoothGlyphFind (draw, public); - - XftGlyphExtents (dpy, public, glyphs, nglyphs, &gi); - if (!gi.width || !gi.height) - goto bail1; - ox = x - gi.x; - oy = y - gi.y; - /* - * Try to get bits directly from the drawable; if that fails, - * use a temporary pixmap. When it does fail, assume it - * will probably fail for a while and keep using temporary - * pixmaps for a while to avoid double round trips. - */ - if (draw->core.use_pixmap == 0) - { - prev_error = XSetErrorHandler (XftGetImageErrorHandler); - image = XGetImage (dpy, draw->drawable, - ox, oy, - gi.width, gi.height, AllPlanes, - ZPixmap); - XSetErrorHandler (prev_error); - if (!image) - draw->core.use_pixmap = XFT_ASSUME_PIXMAP; - } - else - { - draw->core.use_pixmap--; - image = 0; - } - if (!image && (depth = XftDrawDepth (draw))) - { - Pixmap pix; - GC gc; - XGCValues gcv; - - pix = XCreatePixmap (dpy, draw->drawable, - gi.width, gi.height, depth); - gcv.graphics_exposures = False; - gc = XCreateGC (dpy, pix, GCGraphicsExposures, &gcv); - XCopyArea (dpy, draw->drawable, pix, gc, ox, oy, - gi.width, gi.height, 0, 0); - XFreeGC (dpy, gc); - image = XGetImage (dpy, pix, 0, 0, gi.width, gi.height, AllPlanes, - ZPixmap); - XFreePixmap (dpy, pix); - } - if (!image) - goto bail1; - image->red_mask = draw->visual->red_mask; - image->green_mask = draw->visual->green_mask; - image->blue_mask = draw->visual->blue_mask; - if (image->byte_order != XftNativeByteOrder ()) - XftSwapImage (image); - while (n--) - { - glyph = *g++; - if (glyph >= font->num_glyphs || !(xftg = font->glyphs[glyph])) - xftg = _XftGlyphDefault (dpy, public); - if (xftg) - { - (*smooth) (image, xftg, x - ox, y - oy, color); - x += xftg->metrics.xOff; - y += xftg->metrics.yOff; - } - } - if (image->byte_order != XftNativeByteOrder ()) - XftSwapImage (image); - XPutImage (dpy, draw->drawable, draw->core.gc, image, 0, 0, ox, oy, - gi.width, gi.height); - XDestroyImage (image); - } - else - { - XftSharpGlyph sharp = _XftSharpGlyphFind (draw, public); - while (n--) - { - glyph = *g++; - if (glyph >= font->num_glyphs || !(xftg = font->glyphs[glyph])) - xftg = _XftGlyphDefault (dpy, public); - if (xftg) - { - (*sharp) (draw, xftg, x, y); - x += xftg->metrics.xOff; - y += xftg->metrics.yOff; - } - } - } -bail1: - if (glyphs_loaded) - _XftFontManageMemory (dpy, public); -} - -#define NUM_LOCAL 1024 - -void -XftGlyphSpecCore (XftDraw *draw, - _Xconst XftColor *color, - XftFont *public, - _Xconst XftGlyphSpec *glyphs, - int nglyphs) -{ - Display *dpy = draw->dpy; - XftFontInt *font = (XftFontInt *) public; - XftGlyph *xftg; - FT_UInt missing[XFT_NMISSING]; - FcBool glyphs_loaded; - int nmissing; - int i; - XErrorHandler prev_error; - int x1, y1, x2, y2; - - /* - * Load missing glyphs - */ - glyphs_loaded = FcFalse; - x1 = y1 = x2 = y2 = 0; - for (i = 0; i < nglyphs; i++) - { - XGlyphInfo gi; - int g_x1, g_x2, g_y1, g_y2; - - nmissing = 0; - if (XftFontCheckGlyph (dpy, public, FcTrue, glyphs[i].glyph, missing, &nmissing)) - glyphs_loaded = FcTrue; - if (nmissing) - XftFontLoadGlyphs (dpy, public, FcTrue, missing, nmissing); - - XftGlyphExtents (dpy, public, &glyphs[i].glyph, 1, &gi); - g_x1 = glyphs[i].x - gi.x; - g_y1 = glyphs[i].y - gi.y; - g_x2 = g_x1 + gi.width; - g_y2 = g_y1 + gi.height; - if (i) - { - if (g_x1 < x1) - x1 = g_x1; - if (g_y1 < y1) - y1 = g_y1; - if (g_x2 > x2) - x2 = g_x2; - if (g_y2 > y2) - y2 = g_y2; - } - else - { - x1 = g_x1; - y1 = g_y1; - x2 = g_x2; - y2 = g_y2; - } - } - - if (x1 == x2 || y1 == y2) - goto bail1; - - if ((font->info.antialias || color->color.alpha != 0xffff) && - _XftSmoothGlyphPossible (draw)) - { - XImage *image; - unsigned int depth; - int width = x2 - x1, height = y2 - y1; - XftSmoothGlyph smooth = _XftSmoothGlyphFind (draw, public); - - /* - * Try to get bits directly from the drawable; if that fails, - * use a temporary pixmap. When it does fail, assume it - * will probably fail for a while and keep using temporary - * pixmaps for a while to avoid double round trips. - */ - if (draw->core.use_pixmap == 0) - { - prev_error = XSetErrorHandler (XftGetImageErrorHandler); - image = XGetImage (dpy, draw->drawable, - x1, y1, - width, height, AllPlanes, - ZPixmap); - XSetErrorHandler (prev_error); - if (!image) - draw->core.use_pixmap = XFT_ASSUME_PIXMAP; - } - else - { - draw->core.use_pixmap--; - image = 0; - } - if (!image && (depth = XftDrawDepth (draw))) - { - Pixmap pix; - GC gc; - XGCValues gcv; - - pix = XCreatePixmap (dpy, draw->drawable, - width, height, depth); - gcv.graphics_exposures = False; - gc = XCreateGC (dpy, pix, GCGraphicsExposures, &gcv); - XCopyArea (dpy, draw->drawable, pix, gc, x1, y1, - width, height, 0, 0); - XFreeGC (dpy, gc); - image = XGetImage (dpy, pix, 0, 0, width, height, AllPlanes, - ZPixmap); - XFreePixmap (dpy, pix); - } - if (!image) - goto bail1; - image->red_mask = draw->visual->red_mask; - image->green_mask = draw->visual->green_mask; - image->blue_mask = draw->visual->blue_mask; - if (image->byte_order != XftNativeByteOrder ()) - XftSwapImage (image); - for (i = 0; i < nglyphs; i++) - { - FT_UInt glyph = glyphs[i].glyph; - if (glyph >= font->num_glyphs || !(xftg = font->glyphs[glyph])) - xftg = _XftGlyphDefault (dpy, public); - if (xftg) - { - (*smooth) (image, xftg, glyphs[i].x - x1, - glyphs[i].y - y1, color); - } - } - if (image->byte_order != XftNativeByteOrder ()) - XftSwapImage (image); - XPutImage (dpy, draw->drawable, draw->core.gc, image, 0, 0, x1, y1, - width, height); - XDestroyImage (image); - } - else - { - XftSharpGlyph sharp = _XftSharpGlyphFind (draw, public); - for (i = 0; i < nglyphs; i++) - { - FT_UInt glyph = glyphs[i].glyph; - if (glyph >= font->num_glyphs || !(xftg = font->glyphs[glyph])) - xftg = _XftGlyphDefault (dpy, public); - if (xftg) - (*sharp) (draw, xftg, glyphs[i].x, glyphs[i].y); - } - } -bail1: - if (glyphs_loaded) - _XftFontManageMemory (dpy, public); -} - -void -XftGlyphFontSpecCore (XftDraw *draw, - _Xconst XftColor *color, - _Xconst XftGlyphFontSpec *glyphs, - int nglyphs) -{ - Display *dpy = draw->dpy; - XftGlyph *xftg; - FT_UInt missing[XFT_NMISSING]; - FcBool glyphs_loaded; - int nmissing; - int i; - XErrorHandler prev_error; - int x1, y1, x2, y2; - - /* - * Load missing glyphs - */ - glyphs_loaded = FcFalse; - x1 = y1 = x2 = y2 = 0; - for (i = 0; i < nglyphs; i++) - { - XftFont *public = glyphs[i].font; - XGlyphInfo gi; - int g_x1, g_x2, g_y1, g_y2; - - nmissing = 0; - if (XftFontCheckGlyph (dpy, public, FcTrue, glyphs[i].glyph, missing, &nmissing)) - glyphs_loaded = FcTrue; - if (nmissing) - XftFontLoadGlyphs (dpy, public, FcTrue, missing, nmissing); - - XftGlyphExtents (dpy, public, &glyphs[i].glyph, 1, &gi); - g_x1 = glyphs[i].x - gi.x; - g_y1 = glyphs[i].y - gi.y; - g_x2 = g_x1 + gi.width; - g_y2 = g_y1 + gi.height; - if (i) - { - if (g_x1 < x1) - x1 = g_x1; - if (g_y1 < y1) - y1 = g_y1; - if (g_x2 > x2) - x2 = g_x2; - if (g_y2 > y2) - y2 = g_y2; - } - else - { - x1 = g_x1; - y1 = g_y1; - x2 = g_x2; - y2 = g_y2; - } - } - - if (x1 == x2 || y1 == y2) - goto bail1; - - for (i = 0; i < nglyphs; i++) - if (((XftFontInt *) glyphs[i].font)->info.antialias) - break; - - if ((i != nglyphs || color->color.alpha != 0xffff) && - _XftSmoothGlyphPossible (draw)) - { - XImage *image; - unsigned int depth; - int width = x2 - x1, height = y2 - y1; - - /* - * Try to get bits directly from the drawable; if that fails, - * use a temporary pixmap. When it does fail, assume it - * will probably fail for a while and keep using temporary - * pixmaps for a while to avoid double round trips. - */ - if (draw->core.use_pixmap == 0) - { - prev_error = XSetErrorHandler (XftGetImageErrorHandler); - image = XGetImage (dpy, draw->drawable, - x1, y1, - width, height, AllPlanes, - ZPixmap); - XSetErrorHandler (prev_error); - if (!image) - draw->core.use_pixmap = XFT_ASSUME_PIXMAP; - } - else - { - draw->core.use_pixmap--; - image = 0; - } - if (!image && (depth = XftDrawDepth (draw))) - { - Pixmap pix; - GC gc; - XGCValues gcv; - - pix = XCreatePixmap (dpy, draw->drawable, - width, height, depth); - gcv.graphics_exposures = False; - gc = XCreateGC (dpy, pix, GCGraphicsExposures, &gcv); - XCopyArea (dpy, draw->drawable, pix, gc, x1, y1, - width, height, 0, 0); - XFreeGC (dpy, gc); - image = XGetImage (dpy, pix, 0, 0, width, height, AllPlanes, - ZPixmap); - XFreePixmap (dpy, pix); - } - if (!image) - goto bail1; - image->red_mask = draw->visual->red_mask; - image->green_mask = draw->visual->green_mask; - image->blue_mask = draw->visual->blue_mask; - if (image->byte_order != XftNativeByteOrder ()) - XftSwapImage (image); - for (i = 0; i < nglyphs; i++) - { - XftFont *public = glyphs[i].font; - XftFontInt *font = (XftFontInt *) public; - XftSmoothGlyph smooth = _XftSmoothGlyphFind (draw, public); - FT_UInt glyph = glyphs[i].glyph; - - if (glyph >= font->num_glyphs || !(xftg = font->glyphs[glyph])) - xftg = _XftGlyphDefault (dpy, public); - if (xftg) - { - (*smooth) (image, xftg, glyphs[i].x - x1, - glyphs[i].y - y1, color); - } - } - if (image->byte_order != XftNativeByteOrder ()) - XftSwapImage (image); - XPutImage (dpy, draw->drawable, draw->core.gc, image, 0, 0, x1, y1, - width, height); - XDestroyImage (image); - } - else - { - for (i = 0; i < nglyphs; i++) - { - XftFont *public = glyphs[i].font; - XftFontInt *font = (XftFontInt *) public; - XftSharpGlyph sharp = _XftSharpGlyphFind (draw, public); - FT_UInt glyph = glyphs[i].glyph; - - if (glyph >= font->num_glyphs || !(xftg = font->glyphs[glyph])) - xftg = _XftGlyphDefault (dpy, public); - if (xftg) - (*sharp) (draw, xftg, glyphs[i].x, glyphs[i].y); - } - } -bail1: - if (glyphs_loaded) - for (i = 0; i < nglyphs; i++) - _XftFontManageMemory (dpy, glyphs[i].font); -} |