]> Dogcows Code - chaz/openbox/blob - otk/rendercontrol.cc
otk using new render shit.. supposedly
[chaz/openbox] / otk / rendercontrol.cc
1 // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*-
2
3 #ifdef HAVE_CONFIG_H
4 # include "../config.h"
5 #endif // HAVE_CONFIG_H
6
7 #include "rendercontrol.hh"
8 #include "truerendercontrol.hh"
9 #include "rendertexture.hh"
10 #include "rendercolor.hh"
11 #include "display.hh"
12 #include "screeninfo.hh"
13 #include "surface.hh"
14 #include "font.hh"
15 #include "ustring.hh"
16
17 extern "C" {
18 #ifdef HAVE_STDLIB_H
19 # include <stdlib.h>
20 #endif // HAVE_STDLIB_H
21
22 #include "gettext.h"
23 #define _(str) gettext(str)
24 }
25
26 namespace otk {
27
28 RenderControl *RenderControl::getRenderControl(int screen)
29 {
30 // get the visual on the screen and return the correct type of RenderControl
31 int vclass = display->screenInfo(screen)->visual()->c_class;
32 switch (vclass) {
33 case TrueColor:
34 return new TrueRenderControl(screen);
35 case PseudoColor:
36 case StaticColor:
37 // return new PseudoRenderControl(screen);
38 case GrayScale:
39 case StaticGray:
40 // return new GrayRenderControl(screen);
41 default:
42 printf(_("RenderControl: Unsupported visual %d specified. Aborting.\n"),
43 vclass);
44 ::exit(1);
45 }
46 }
47
48 RenderControl::RenderControl(int screen)
49 : _screen(screen)
50 {
51 printf("Initializing RenderControl\n");
52
53
54 }
55
56 RenderControl::~RenderControl()
57 {
58 printf("Destroying RenderControl\n");
59
60
61 }
62
63 void RenderControl::drawString(Surface& sf, const Font &font, int x, int y,
64 const RenderColor &color,
65 const ustring &string) const
66 {
67 assert(sf._screen == _screen);
68 XftDraw *d = sf._xftdraw;
69 assert(d); // this means that the background hasn't been rendered yet!
70
71 if (font._shadow) {
72 XftColor c;
73 c.color.red = 0;
74 c.color.green = 0;
75 c.color.blue = 0;
76 c.color.alpha = font._tint | font._tint << 8; // transparent shadow
77 c.pixel = BlackPixel(**display, _screen);
78
79 if (string.utf8())
80 XftDrawStringUtf8(d, &c, font._xftfont, x + font._offset,
81 font._xftfont->ascent + y + font._offset,
82 (FcChar8*)string.c_str(), string.bytes());
83 else
84 XftDrawString8(d, &c, font._xftfont, x + font._offset,
85 font._xftfont->ascent + y + font._offset,
86 (FcChar8*)string.c_str(), string.bytes());
87 }
88
89 XftColor c;
90 c.color.red = color.red() | color.red() << 8;
91 c.color.green = color.green() | color.green() << 8;
92 c.color.blue = color.blue() | color.blue() << 8;
93 c.pixel = color.pixel();
94 c.color.alpha = 0xff | 0xff << 8; // no transparency in Color yet
95
96 if (string.utf8())
97 XftDrawStringUtf8(d, &c, font._xftfont, x, font._xftfont->ascent + y,
98 (FcChar8*)string.c_str(), string.bytes());
99 else
100 XftDrawString8(d, &c, font._xftfont, x, font._xftfont->ascent + y,
101 (FcChar8*)string.c_str(), string.bytes());
102
103 return;
104 }
105
106 void RenderControl::drawSolidBackground(Surface& sf,
107 const RenderTexture& texture) const
108 {
109 assert(_screen == sf._screen);
110 assert(_screen == texture.color().screen());
111
112 if (texture.parentRelative()) return;
113
114 sf.setPixmap(texture.color());
115
116 int width = sf.width(), height = sf.height();
117 int left = 0, top = 0, right = width - 1, bottom = height - 1;
118
119 if (texture.interlaced())
120 for (int i = 0; i < height; i += 2)
121 XDrawLine(**display, sf.pixmap(), texture.interlaceColor().gc(),
122 0, i, width, i);
123
124 switch (texture.relief()) {
125 case RenderTexture::Raised:
126 switch (texture.bevel()) {
127 case RenderTexture::Bevel1:
128 XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
129 left, bottom, right, bottom);
130 XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
131 right, bottom, right, top);
132
133 XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
134 left, top, right, top);
135 XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
136 left, bottom, left, top);
137 break;
138 case RenderTexture::Bevel2:
139 XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
140 left + 1, bottom - 2, right - 2, bottom - 2);
141 XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
142 right - 2, bottom - 2, right - 2, top + 1);
143
144 XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
145 left + 1, top + 1, right - 2, top + 1);
146 XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
147 left + 1, bottom - 2, left + 1, top + 1);
148 break;
149 default:
150 assert(false); // unhandled RenderTexture::BevelType
151 }
152 break;
153 case RenderTexture::Sunken:
154 switch (texture.bevel()) {
155 case RenderTexture::Bevel1:
156 XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
157 left, bottom, right, bottom);
158 XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
159 right, bottom, right, top);
160
161 XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
162 left, top, right, top);
163 XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
164 left, bottom, left, top);
165 break;
166 case RenderTexture::Bevel2:
167 XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
168 left + 1, bottom - 2, right - 2, bottom - 2);
169 XDrawLine(**display, sf.pixmap(), texture.bevelLightColor().gc(),
170 right - 2, bottom - 2, right - 2, top + 1);
171
172 XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
173 left + 1, top + 1, right - 2, top + 1);
174 XDrawLine(**display, sf.pixmap(), texture.bevelDarkColor().gc(),
175 left + 1, bottom - 2, left + 1, top + 1);
176 break;
177 default:
178 assert(false); // unhandled RenderTexture::BevelType
179 }
180 break;
181 case RenderTexture::Flat:
182 if (texture.border())
183 XDrawRectangle(**display, sf.pixmap(), texture.borderColor().gc(),
184 left, top, right, bottom);
185 break;
186 default:
187 assert(false); // unhandled RenderTexture::ReliefType
188 }
189 }
190
191 }
This page took 0.048534 seconds and 4 git commands to generate.