diff options
Diffstat (limited to 'RenderLogo.c')
-rw-r--r-- | RenderLogo.c | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/RenderLogo.c b/RenderLogo.c new file mode 100644 index 0000000..ce8c462 --- /dev/null +++ b/RenderLogo.c @@ -0,0 +1,163 @@ +/* $Xorg: DrawLogo.c,v 1.4 2001/02/09 02:03:52 xorgcvs Exp $ */ + +/* + +Copyright 1988, 1998 The Open Group + +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. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +*/ +/* $XFree86: xc/programs/xlogo/RenderLogo.c,v 1.2 2002/10/19 19:15:32 herrb Exp $ */ + +#include <stdio.h> +#include <math.h> + +#include <X11/Xlib.h> +#include <X11/extensions/Xrender.h> + +#include "RenderLogo.h" + +typedef struct _XLineDouble { + XPointDouble p1, p2; +} XLineDouble; + +static void +intersect(XLineDouble *l1, XLineDouble *l2, XPointDouble *intersection); + +/* + * Draw the "official" X Window System Logo, designed by Danny Chong + * + * Written by Ollie Jones, Apollo Computer + * + * Does some fancy stuff to make the logo look acceptable even + * if it is tiny. Also makes the various linear elements of + * the logo line up as well as possible considering rasterization. + * + * Munged to draw anti-aliased logo using Render extension. + * Carl Worth, 2002-05-16 + */ +void +RenderLogo(Display *dpy, int op, Picture src, Picture dst, XRenderPictFormat *maskFormat, + int x, int y, unsigned int width, unsigned int height) +{ + unsigned int size; + double thin, thick, gap, d31; + XPointDouble poly[6]; + XLineDouble thick_left, thick_right, thin_left, thin_right, gap_left, gap_right; + + /* for now, do a centered even-sized square, at least for now */ + size = width; + if (height < width) + size = height; + size &= ~1; + x += (width - size) >> 1; + y += (height - size) >> 1; + + thin = (size / 11.0); + thick = (size / 4.0); + gap = thin / 4.0; + d31 = thin + thin + gap; + + thick_left.p1.x = x; thick_left.p1.y = y; + thick_left.p2.x = x + size - thick; thick_left.p2.y = y + size; + + thick_right.p1.x = x + thick; thick_right.p1.y = y; + thick_right.p2.x = x + size; thick_right.p2.y = y + size; + + thin_left.p1.x = x + size-d31; thin_left.p1.y = y; + thin_left.p2.x = x + 0; thin_left.p2.y = y + size; + + thin_right.p1.x = x + size; thin_right.p1.y = y; + thin_right.p2.x = x + d31; thin_right.p2.y = y + size; + + gap_left.p1.x = x + size-( thin+gap); gap_left.p1.y = y; + gap_left.p2.x = x + thin; gap_left.p2.y = y + size; + + gap_right.p1.x = x + size- thin; gap_right.p1.y = y; + gap_right.p2.x = x + thin + gap; gap_right.p2.y = y + size; + + poly[0] = thick_left.p1; + poly[1] = thick_right.p1; + intersect(&thick_right, &gap_left, &poly[2]); + poly[3] = gap_left.p2; + poly[4] = thin_left.p2; + intersect(&thick_left, &thin_left, &poly[5]); + + XRenderCompositeDoublePoly(dpy, op, + src, dst, maskFormat, + 0, 0, 0, 0, + poly, 6, 0); + + poly[0] = thin_right.p1; + poly[1] = gap_right.p1; + intersect(&thick_left, &gap_right, &poly[2]); + poly[3] = thick_left.p2; + poly[4] = thick_right.p2; + intersect(&thick_right, &thin_right, &poly[5]); + + XRenderCompositeDoublePoly(dpy, op, + src, dst, maskFormat, + 0, 0, 0, 0, + poly, 6, 0); +} + +static double +compute_inverse_slope (XLineDouble *l) +{ + return ((l->p2.x - l->p1.x) / + (l->p2.y - l->p1.y)); +} + +static double +compute_x_intercept(XLineDouble *l, double inverse_slope) +{ + return (l->p1.x) - inverse_slope * l->p1.y; +} + +static void +intersect(XLineDouble *l1, XLineDouble *l2, XPointDouble *intersection) +{ + double check; + /* + * x = m1y + b1 + * x = m2y + b2 + * m1y + b1 = m2y + b2 + * y * (m1 - m2) = b2 - b1 + * y = (b2 - b1) / (m1 - m2) + */ + double m1 = compute_inverse_slope (l1); + double b1 = compute_x_intercept (l1, m1); + double m2 = compute_inverse_slope (l2); + double b2 = compute_x_intercept (l2, m2); + + intersection->y = (b2 - b1) / (m1 - m2); + intersection->x = m1 * intersection->y + b1; + + check = m2 * intersection->y + b2; + if (fabs(check - intersection->x) > (1/(double)(1<<16))) { +#ifdef __GNUC__ + fprintf(stderr, "%s: intersection is off by: %f\n", __FUNCTION__, fabs(check - intersection->x)); +#else + fprintf(stderr, "intersect: intersection is off by %f\n", fabs(check - instersection->x)); +#endif + } +} + |