source: trunk/third/xscreensaver/utils/colorbars.c @ 20148

Revision 20148, 4.4 KB checked in by ghudson, 21 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r20147, which included commits to RCS files with non-trunk default branches.
Line 
1/* xscreensaver, Copyright (c) 2001, 2003 Jamie Zawinski <jwz@jwz.org>
2 *
3 * Permission to use, copy, modify, distribute, and sell this software and its
4 * documentation for any purpose is hereby granted without fee, provided that
5 * the above copyright notice appear in all copies and that both that
6 * copyright notice and this permission notice appear in supporting
7 * documentation.  No representations are made about the suitability of this
8 * software for any purpose.  It is provided "as is" without express or
9 * implied warranty.
10 */
11
12/* This file contains code for drawing NTSC colorbars.
13   A couple of things use this.
14 */
15
16#include "utils.h"
17#include "resources.h"
18#include "colorbars.h"
19
20static const char * const colors[7][18] = {
21  { "#CCCCCC", "#FFFF00", "#00FFFF", "#00FF00",         /* tall bars */
22    "#FF00FF", "#FF0000", "#0000FF", "#000000",
23    0
24  }, {
25    "#000000", "#0000FF", "#FF0000", "#FF00FF",         /* short rev bars */
26    "#00FF00", "#00FFFF", "#FFFF00", "#CCCCCC",
27    0
28  }, {
29    "#000000", 0                                        /* blank */
30  }, {
31    "#FFFFFF", "#EEEEEE", "#DDDDDD", "#CCCCCC",         /* gray ramp */
32    "#BBBBBB", "#AAAAAA", "#999999", "#888888",
33    "#777777", "#666666", "#555555", "#444444",
34    "#333333", "#222222", "#111111", "#000000"
35  }, {
36    "#000000", "#111111", "#222222", "#333333",         /* gray rev ramp */
37    "#444444", "#555555", "#666666", "#777777",
38    "#888888", "#999999", "#AAAAAA", "#BBBBBB",
39    "#CCCCCC", "#DDDDDD", "#EEEEEE", "#FFFFFF"
40  }, {
41    "#000000", 0                                        /* blank */
42  }, {
43    "#FF00FF", "#FF00FF", "#FF00FF",                    /* blacklevel row */
44    "#FFFFFF", "#FFFFFF", "#FFFFFF",
45    "#0000AD", "#0000AD", "#0000AD",
46    "#131313", "#131313", "#131313",
47    "#000000", "#000000", "#262626",
48    "#000000", "#000000", "#000000"
49  }
50};
51
52static const int heights[7] = { 63, 10, 1, 5, 5, 1, 15 };   /* percentages */
53
54
55void
56draw_colorbars (Screen *screen, Visual *visual,
57                Drawable drawable, Colormap cmap,
58                int x, int y, int width, int height)
59{
60  Display *dpy = DisplayOfScreen (screen);
61  int oy = y;
62  int ypct = 0;
63  int j;
64  XGCValues gcv;
65  GC gc = XCreateGC (dpy, drawable, 0, &gcv);
66
67  if (width <= 0 || height <= 0)
68    {
69      Window root;
70      int xx, yy;
71      unsigned int bw, d;
72      XGetGeometry (dpy, drawable,
73                    &root, &xx, &yy,
74                    (unsigned int *) &width,
75                    (unsigned int *) &height,
76                    &bw, &d);
77    }
78
79  for (j = 0; j < sizeof(colors) / sizeof(*colors); j++)
80    {
81      int i, h, ncols;
82      int x1 = 0;
83      int y2;
84      for (ncols = 0; ncols < sizeof(*colors) / sizeof(**colors); ncols++)
85        if (!colors[j][ncols]) break;
86      ypct += heights[j];
87      y2 = height * ypct / 100;
88      h = y2 - y; /* avoid roundoff fencepost */
89      for (i = 0; i < ncols; i++)
90        {
91          XColor xcolor;
92          const char *color = colors[j][i];
93          int x2 = x + (width * (i+1) / ncols);
94          int w = x2 - x1; /* avoid roundoff fencepost */
95          if (! XParseColor (dpy, cmap, color, &xcolor))
96            abort();
97          xcolor.flags = DoRed|DoGreen|DoBlue;
98          if (!XAllocColor (dpy, cmap, &xcolor))
99            continue;
100          XSetForeground (dpy, gc, xcolor.pixel);
101          XFillRectangle (dpy, drawable, gc, x1, y, w, h);
102          x1 = x2;
103        }
104      y = y2;
105    }
106
107  y = oy;
108
109  /* Add in the xscreensaver logo */
110  {
111    unsigned long *pixels; /* ignored - unfreed */
112    int npixels;
113    unsigned long bg = ~0;
114    Pixmap logo_mask = 0;
115    Pixmap logo_map = xscreensaver_logo (screen, visual, drawable, cmap, bg,
116                                         &pixels, &npixels, &logo_mask,
117                                         True);
118    if (logo_map)
119      {
120        Window root;
121        unsigned int logo_width, logo_height;
122        unsigned int w = width;
123        unsigned int h = height * heights[0] / 100;
124        int x1, y1;
125        unsigned int bw, d;
126        XGetGeometry (dpy, logo_map, &root, &x1, &y1,
127                      &logo_width, &logo_height, &bw, &d);
128        x1 = x + (w - logo_width) / 2;
129        y1 = y + (h - logo_height) / 2;
130        if (logo_mask)
131          {
132            XSetClipMask (dpy, gc, logo_mask);
133            XSetClipOrigin (dpy, gc, x1, y1);
134          }
135        XCopyArea (dpy, logo_map, drawable, gc,
136                   0, 0, logo_width, logo_height, x1, y1);
137        XFreePixmap (dpy, logo_map);
138        if (logo_mask)
139          XFreePixmap (dpy, logo_mask);
140      }
141  }
142
143  XFreeGC(dpy, gc);
144}
Note: See TracBrowser for help on using the repository browser.