aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/lib/Xft1/xftrender.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/lib/Xft1/xftrender.c')
-rw-r--r--nx-X11/lib/Xft1/xftrender.c527
1 files changed, 527 insertions, 0 deletions
diff --git a/nx-X11/lib/Xft1/xftrender.c b/nx-X11/lib/Xft1/xftrender.c
new file mode 100644
index 000000000..419ae9f8a
--- /dev/null
+++ b/nx-X11/lib/Xft1/xftrender.c
@@ -0,0 +1,527 @@
+/*
+ * $XFree86: xc/lib/Xft/xftrender.c,v 1.8 2001/07/13 18:16:10 keithp Exp $
+ *
+ * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
+ *
+ * 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 <stdlib.h>
+#include "xftint.h"
+
+void
+XftRenderString8 (Display *dpy, Picture src,
+ XftFontStruct *font, Picture dst,
+ int srcx, int srcy,
+ int x, int y,
+ XftChar8 *string, int len)
+{
+ XftChar32 missing[XFT_NMISSING];
+ int nmissing;
+ XftChar8 *s;
+ int l;
+
+ s = string;
+ l = len;
+ nmissing = 0;
+ while (l--)
+ XftGlyphCheck (dpy, font, (XftChar32) *s++, missing, &nmissing);
+ if (nmissing)
+ XftGlyphLoad (dpy, font, missing, nmissing);
+ XRenderCompositeString8 (dpy, PictOpOver, src, dst,
+ font->format, font->glyphset,
+ srcx, srcy, x, y, (char *) string, len);
+}
+
+void
+XftRenderString16 (Display *dpy, Picture src,
+ XftFontStruct *font, Picture dst,
+ int srcx, int srcy,
+ int x, int y,
+ XftChar16 *string, int len)
+{
+ XftChar32 missing[XFT_NMISSING];
+ int nmissing;
+ XftChar16 *s;
+ int l;
+
+ s = string;
+ l = len;
+ nmissing = 0;
+ while (l--)
+ XftGlyphCheck (dpy, font, (XftChar32) *s++, missing, &nmissing);
+ if (nmissing)
+ XftGlyphLoad (dpy, font, missing, nmissing);
+ XRenderCompositeString16 (dpy, PictOpOver, src, dst,
+ font->format, font->glyphset,
+ srcx, srcy, x, y, string, len);
+}
+
+void
+XftRenderString32 (Display *dpy, Picture src,
+ XftFontStruct *font, Picture dst,
+ int srcx, int srcy,
+ int x, int y,
+ XftChar32 *string, int len)
+{
+ XftChar32 missing[XFT_NMISSING];
+ int nmissing;
+ XftChar32 *s;
+ int l;
+
+ s = string;
+ l = len;
+ nmissing = 0;
+ while (l--)
+ XftGlyphCheck (dpy, font, (XftChar32) *s++, missing, &nmissing);
+ if (nmissing)
+ XftGlyphLoad (dpy, font, missing, nmissing);
+ XRenderCompositeString32 (dpy, PictOpOver, src, dst,
+ font->format, font->glyphset,
+ srcx, srcy, x, y, string, len);
+}
+
+void
+XftRenderStringUtf8 (Display *dpy, Picture src,
+ XftFontStruct *font, Picture dst,
+ int srcx, int srcy,
+ int x, int y,
+ XftChar8 *string, int len)
+{
+ XftChar8 *s;
+ XftChar32 c;
+ XftChar32 lbuf[4096];
+ XftChar32 *d;
+ XftChar8 *dst8;
+ XftChar16 *dst16;
+ XftChar32 *dst32;
+ int rlen, clen;
+ int width = 1;
+ int n;
+
+ /* compute needed width */
+ if (!XftUtf8Len (string, len, &n, &width))
+ return;
+
+ d = lbuf;
+ if (n * width > sizeof (lbuf))
+ {
+ d = (XftChar32 *) malloc (n * width);
+ if (!d)
+ return;
+ }
+
+ switch (width) {
+ case 4:
+ s = string;
+ rlen = len;
+ dst32 = d;
+ while (rlen)
+ {
+ clen = XftUtf8ToUcs4 (s, &c, rlen);
+ if (clen <= 0) /* malformed UTF8 string */
+ return;
+ *dst32++ = c;
+ s += clen;
+ rlen -= clen;
+ }
+ dst32 = d;
+ XftRenderString32 (dpy, src, font, dst, srcx, srcy, x, y,
+ dst32, n);
+ break;
+ case 2:
+ s = string;
+ rlen = len;
+ dst16 = (XftChar16 *) d;
+ while (rlen)
+ {
+ clen = XftUtf8ToUcs4 (s, &c, rlen);
+ if (clen <= 0) /* malformed UTF8 string */
+ return;
+ *dst16++ = c;
+ s += clen;
+ rlen -= clen;
+ }
+ dst16 = (XftChar16 *) d;
+ XftRenderString16 (dpy, src, font, dst, srcx, srcy, x, y,
+ dst16, n);
+ break;
+ case 1:
+ s = string;
+ rlen = len;
+ dst8 = (XftChar8 *) d;
+ while (rlen)
+ {
+ clen = XftUtf8ToUcs4 (s, &c, rlen);
+ if (clen <= 0) /* malformed UTF8 string */
+ return;
+ *dst8++ = c;
+ s += clen;
+ rlen -= clen;
+ }
+ dst8 = (XftChar8 *) d;
+ XftRenderString8 (dpy, src, font, dst, srcx, srcy, x, y,
+ dst8, n);
+ break;
+ }
+ if (d != lbuf)
+ free (d);
+}
+
+void
+XftRenderExtents8 (Display *dpy,
+ XftFontStruct *font,
+ XftChar8 *string,
+ int len,
+ XGlyphInfo *extents)
+{
+ XftChar32 missing[XFT_NMISSING];
+ int nmissing;
+ XftChar8 *s, c;
+ int l;
+ XGlyphInfo *gi;
+ int x, y;
+ int left, right, top, bottom;
+ int overall_left, overall_right;
+ int overall_top, overall_bottom;
+
+ s = string;
+ l = len;
+ nmissing = 0;
+ while (l--)
+ XftGlyphCheck (dpy, font, (XftChar32) *s++, missing, &nmissing);
+ if (nmissing)
+ XftGlyphLoad (dpy, font, missing, nmissing);
+
+ gi = 0;
+ while (len)
+ {
+ c = *string++;
+ len--;
+ gi = c < font->nrealized ? font->realized[c] : 0;
+ if (gi)
+ break;
+ }
+ if (len == 0 && !gi)
+ {
+ extents->width = 0;
+ extents->height = 0;
+ extents->x = 0;
+ extents->y = 0;
+ extents->yOff = 0;
+ extents->xOff = 0;
+ return;
+ }
+ x = 0;
+ y = 0;
+ overall_left = x - gi->x;
+ overall_top = y - gi->y;
+ overall_right = overall_left + (int) gi->width;
+ overall_bottom = overall_top + (int) gi->height;
+ x += gi->xOff;
+ y += gi->yOff;
+ while (len--)
+ {
+ c = *string++;
+ gi = c < font->nrealized ? font->realized[c] : 0;
+ if (!gi)
+ continue;
+ left = x - gi->x;
+ top = y - gi->y;
+ right = left + (int) gi->width;
+ bottom = top + (int) gi->height;
+ if (left < overall_left)
+ overall_left = left;
+ if (top < overall_top)
+ overall_top = top;
+ if (right > overall_right)
+ overall_right = right;
+ if (bottom > overall_bottom)
+ overall_bottom = bottom;
+ x += gi->xOff;
+ y += gi->yOff;
+ }
+ extents->x = -overall_left;
+ extents->y = -overall_top;
+ extents->width = overall_right - overall_left;
+ extents->height = overall_bottom - overall_top;
+ extents->xOff = x;
+ extents->yOff = y;
+}
+
+void
+XftRenderExtents16 (Display *dpy,
+ XftFontStruct *font,
+ XftChar16 *string,
+ int len,
+ XGlyphInfo *extents)
+{
+ XftChar32 missing[XFT_NMISSING];
+ int nmissing;
+ XftChar16 *s, c;
+ int l;
+ XGlyphInfo *gi;
+ int x, y;
+ int left, right, top, bottom;
+ int overall_left, overall_right;
+ int overall_top, overall_bottom;
+
+ s = string;
+ l = len;
+ nmissing = 0;
+ while (l--)
+ XftGlyphCheck (dpy, font, (XftChar32) *s++, missing, &nmissing);
+ if (nmissing)
+ XftGlyphLoad (dpy, font, missing, nmissing);
+
+ gi = 0;
+ while (len)
+ {
+ c = *string++;
+ len--;
+ gi = c < font->nrealized ? font->realized[c] : 0;
+ if (gi)
+ break;
+ }
+ if (len == 0 && !gi)
+ {
+ extents->width = 0;
+ extents->height = 0;
+ extents->x = 0;
+ extents->y = 0;
+ extents->yOff = 0;
+ extents->xOff = 0;
+ return;
+ }
+ x = 0;
+ y = 0;
+ overall_left = x - gi->x;
+ overall_top = y - gi->y;
+ overall_right = overall_left + (int) gi->width;
+ overall_bottom = overall_top + (int) gi->height;
+ x += gi->xOff;
+ y += gi->yOff;
+ while (len--)
+ {
+ c = *string++;
+ gi = c < font->nrealized ? font->realized[c] : 0;
+ if (!gi)
+ continue;
+ left = x - gi->x;
+ top = y - gi->y;
+ right = left + (int) gi->width;
+ bottom = top + (int) gi->height;
+ if (left < overall_left)
+ overall_left = left;
+ if (top < overall_top)
+ overall_top = top;
+ if (right > overall_right)
+ overall_right = right;
+ if (bottom > overall_bottom)
+ overall_bottom = bottom;
+ x += gi->xOff;
+ y += gi->yOff;
+ }
+ extents->x = -overall_left;
+ extents->y = -overall_top;
+ extents->width = overall_right - overall_left;
+ extents->height = overall_bottom - overall_top;
+ extents->xOff = x;
+ extents->yOff = y;
+}
+
+void
+XftRenderExtents32 (Display *dpy,
+ XftFontStruct *font,
+ XftChar32 *string,
+ int len,
+ XGlyphInfo *extents)
+{
+ XftChar32 missing[XFT_NMISSING];
+ int nmissing;
+ XftChar32 *s, c;
+ int l;
+ XGlyphInfo *gi;
+ int x, y;
+ int left, right, top, bottom;
+ int overall_left, overall_right;
+ int overall_top, overall_bottom;
+
+ s = string;
+ l = len;
+ nmissing = 0;
+ while (l--)
+ XftGlyphCheck (dpy, font, (XftChar32) *s++, missing, &nmissing);
+ if (nmissing)
+ XftGlyphLoad (dpy, font, missing, nmissing);
+
+ gi = 0;
+ while (len)
+ {
+ c = *string++;
+ len--;
+ gi = c < font->nrealized ? font->realized[c] : 0;
+ if (gi)
+ break;
+ }
+ if (len == 0 && !gi)
+ {
+ extents->width = 0;
+ extents->height = 0;
+ extents->x = 0;
+ extents->y = 0;
+ extents->yOff = 0;
+ extents->xOff = 0;
+ return;
+ }
+ x = 0;
+ y = 0;
+ overall_left = x - gi->x;
+ overall_top = y - gi->y;
+ overall_right = overall_left + (int) gi->width;
+ overall_bottom = overall_top + (int) gi->height;
+ x += gi->xOff;
+ y += gi->yOff;
+ while (len--)
+ {
+ c = *string++;
+ gi = c < font->nrealized ? font->realized[c] : 0;
+ if (!gi)
+ continue;
+ left = x - gi->x;
+ top = y - gi->y;
+ right = left + (int) gi->width;
+ bottom = top + (int) gi->height;
+ if (left < overall_left)
+ overall_left = left;
+ if (top < overall_top)
+ overall_top = top;
+ if (right > overall_right)
+ overall_right = right;
+ if (bottom > overall_bottom)
+ overall_bottom = bottom;
+ x += gi->xOff;
+ y += gi->yOff;
+ }
+ extents->x = -overall_left;
+ extents->y = -overall_top;
+ extents->width = overall_right - overall_left;
+ extents->height = overall_bottom - overall_top;
+ extents->xOff = x;
+ extents->yOff = y;
+}
+
+void
+XftRenderExtentsUtf8 (Display *dpy,
+ XftFontStruct *font,
+ XftChar8 *string,
+ int len,
+ XGlyphInfo *extents)
+{
+ XftChar32 missing[XFT_NMISSING];
+ int nmissing;
+ XftChar8 *s;
+ XftChar32 c;
+ int l, clen;
+ XGlyphInfo *gi;
+ int x, y;
+ int left, right, top, bottom;
+ int overall_left, overall_right;
+ int overall_top, overall_bottom;
+
+ s = string;
+ l = len;
+ nmissing = 0;
+ while (l)
+ {
+ clen = XftUtf8ToUcs4 (s, &c, l);
+ if (clen < 0)
+ break;
+ XftGlyphCheck (dpy, font, (XftChar32) c, missing, &nmissing);
+ s += clen;
+ l -= clen;
+ }
+ if (nmissing)
+ XftGlyphLoad (dpy, font, missing, nmissing);
+
+ gi = 0;
+ while (len)
+ {
+ clen = XftUtf8ToUcs4 (string, &c, len);
+ if (clen < 0)
+ {
+ len = 0;
+ break;
+ }
+ len -= clen;
+ string += clen;
+ gi = c < font->nrealized ? font->realized[c] : 0;
+ if (gi)
+ break;
+ }
+ if (len == 0 && !gi)
+ {
+ extents->width = 0;
+ extents->height = 0;
+ extents->x = 0;
+ extents->y = 0;
+ extents->yOff = 0;
+ extents->xOff = 0;
+ return;
+ }
+ x = 0;
+ y = 0;
+ overall_left = x - gi->x;
+ overall_top = y - gi->y;
+ overall_right = overall_left + (int) gi->width;
+ overall_bottom = overall_top + (int) gi->height;
+ x += gi->xOff;
+ y += gi->yOff;
+ while (len)
+ {
+ clen = XftUtf8ToUcs4 (string, &c, len);
+ if (clen < 0)
+ break;
+ len -= clen;
+ string += clen;
+ gi = c < font->nrealized ? font->realized[c] : 0;
+ if (!gi)
+ continue;
+ left = x - gi->x;
+ top = y - gi->y;
+ right = left + (int) gi->width;
+ bottom = top + (int) gi->height;
+ if (left < overall_left)
+ overall_left = left;
+ if (top < overall_top)
+ overall_top = top;
+ if (right > overall_right)
+ overall_right = right;
+ if (bottom > overall_bottom)
+ overall_bottom = bottom;
+ x += gi->xOff;
+ y += gi->yOff;
+ }
+ extents->x = -overall_left;
+ extents->y = -overall_top;
+ extents->width = overall_right - overall_left;
+ extents->height = overall_bottom - overall_top;
+ extents->xOff = x;
+ extents->yOff = y;
+}