diff options
-rw-r--r-- | src/FbTk/XFontImp.cc | 66 |
1 files changed, 32 insertions, 34 deletions
diff --git a/src/FbTk/XFontImp.cc b/src/FbTk/XFontImp.cc index 66adee3..e253aa6 100644 --- a/src/FbTk/XFontImp.cc +++ b/src/FbTk/XFontImp.cc | |||
@@ -19,10 +19,12 @@ | |||
19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | 19 | // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
20 | // DEALINGS IN THE SOFTWARE. | 20 | // DEALINGS IN THE SOFTWARE. |
21 | 21 | ||
22 | // $Id: XFontImp.cc,v 1.5 2002/12/09 22:12:56 fluxgen Exp $ | 22 | // $Id: XFontImp.cc,v 1.6 2003/09/11 20:00:09 fluxgen Exp $ |
23 | 23 | ||
24 | #include "XFontImp.hh" | 24 | #include "XFontImp.hh" |
25 | #include "App.hh" | 25 | #include "App.hh" |
26 | #include "GContext.hh" | ||
27 | #include "FbPixmap.hh" | ||
26 | 28 | ||
27 | #include <X11/Xutil.h> | 29 | #include <X11/Xutil.h> |
28 | 30 | ||
@@ -125,14 +127,11 @@ void XFontImp::rotate(float angle) { | |||
125 | 127 | ||
126 | m_angle = angle; | 128 | m_angle = angle; |
127 | 129 | ||
128 | char val; | ||
129 | XImage *I1, *I2; | ||
130 | // X system default vars | 130 | // X system default vars |
131 | Display *dpy = App::instance()->display(); | 131 | Display *dpy = App::instance()->display(); |
132 | Window rootwin = DefaultRootWindow(dpy); | 132 | Window rootwin = DefaultRootWindow(dpy); |
133 | int screen = DefaultScreen(dpy); | 133 | int screen = DefaultScreen(dpy); |
134 | 134 | ||
135 | GC font_gc; | ||
136 | char text[3]; | 135 | char text[3]; |
137 | int ichar, i, j, index, boxlen = 60; | 136 | int ichar, i, j, index, boxlen = 60; |
138 | int vert_w, vert_h, vert_len, bit_w, bit_h, bit_len; | 137 | int vert_w, vert_h, vert_len, bit_w, bit_h, bit_len; |
@@ -147,14 +146,12 @@ void XFontImp::rotate(float angle) { | |||
147 | return; | 146 | return; |
148 | 147 | ||
149 | // create the depth 1 canvas bitmap | 148 | // create the depth 1 canvas bitmap |
150 | Pixmap canvas = XCreatePixmap(dpy, rootwin, boxlen, boxlen, 1); | 149 | FbTk::FbPixmap canvas(rootwin, boxlen, boxlen, 1); |
151 | 150 | ||
152 | // create graphic context for our canvas | 151 | // create graphic context for our canvas |
153 | font_gc = XCreateGC(dpy, canvas, 0, 0); | 152 | FbTk::GContext font_gc(canvas); |
154 | 153 | font_gc.setBackground(None); | |
155 | XSetBackground(dpy, font_gc, None); | 154 | font_gc.setFont(m_fontstruct->fid); |
156 | |||
157 | XSetFont(dpy, font_gc, m_fontstruct->fid); | ||
158 | 155 | ||
159 | // allocate space for rotated font | 156 | // allocate space for rotated font |
160 | m_rotfont = new(nothrow) XRotFontStruct; | 157 | m_rotfont = new(nothrow) XRotFontStruct; |
@@ -207,21 +204,24 @@ void XFontImp::rotate(float angle) { | |||
207 | // width in bytes | 204 | // width in bytes |
208 | vert_len = (vert_w-1)/8+1; | 205 | vert_len = (vert_w-1)/8+1; |
209 | 206 | ||
210 | XSetForeground(dpy, font_gc, None); | 207 | font_gc.setForeground(None); |
211 | XFillRectangle(dpy, canvas, font_gc, 0, 0, boxlen, boxlen); | 208 | canvas.fillRectangle(font_gc.gc(), |
212 | 209 | 0, 0, | |
210 | boxlen, boxlen); | ||
213 | // draw the character centre top right on canvas | 211 | // draw the character centre top right on canvas |
214 | sprintf(text, "%c", ichar); | 212 | sprintf(text, "%c", ichar); |
215 | XSetForeground(dpy, font_gc, 1); | 213 | font_gc.setForeground(1); |
216 | XDrawImageString(dpy, canvas, font_gc, boxlen/2 - lbearing, | 214 | XDrawImageString(dpy, canvas.drawable(), font_gc.gc(), |
215 | boxlen/2 - lbearing, | ||
217 | boxlen/2 - descent, text, 1); | 216 | boxlen/2 - descent, text, 1); |
218 | 217 | ||
219 | // reserve memory for first XImage | 218 | // reserve memory for first XImage |
220 | vertdata = (unsigned char *) malloc((unsigned)(vert_len*vert_h)); | 219 | vertdata = new unsigned char[vert_len * vert_h]; |
221 | 220 | ||
222 | /* create the XImage ... */ | 221 | XImage *I1 = XCreateImage(dpy, DefaultVisual(dpy, screen), |
223 | I1 = XCreateImage(dpy, DefaultVisual(dpy, screen), 1, XYBitmap, | 222 | 1, XYBitmap, |
224 | 0, (char *)vertdata, vert_w, vert_h, 8, 0); | 223 | 0, (char *)vertdata, |
224 | vert_w, vert_h, 8, 0); | ||
225 | 225 | ||
226 | if (I1 == None) { | 226 | if (I1 == None) { |
227 | cerr<<"RotFont: Cant create ximage."<<endl; | 227 | cerr<<"RotFont: Cant create ximage."<<endl; |
@@ -232,12 +232,14 @@ void XFontImp::rotate(float angle) { | |||
232 | 232 | ||
233 | I1->byte_order = I1->bitmap_bit_order = MSBFirst; | 233 | I1->byte_order = I1->bitmap_bit_order = MSBFirst; |
234 | 234 | ||
235 | /* extract character from canvas ... */ | 235 | // extract character from canvas |
236 | XGetSubImage(dpy, canvas, boxlen/2, boxlen/2 - vert_h, | 236 | XGetSubImage(dpy, canvas.drawable(), |
237 | boxlen/2, boxlen/2 - vert_h, | ||
237 | vert_w, vert_h, 1, XYPixmap, I1, 0, 0); | 238 | vert_w, vert_h, 1, XYPixmap, I1, 0, 0); |
239 | |||
238 | I1->format = XYBitmap; | 240 | I1->format = XYBitmap; |
239 | 241 | ||
240 | /* width, height of rotated character ... */ | 242 | // width, height of rotated character |
241 | if (dir == 2) { | 243 | if (dir == 2) { |
242 | bit_w = vert_w; | 244 | bit_w = vert_w; |
243 | bit_h = vert_h; | 245 | bit_h = vert_h; |
@@ -246,17 +248,17 @@ void XFontImp::rotate(float angle) { | |||
246 | bit_h = vert_w; | 248 | bit_h = vert_w; |
247 | } | 249 | } |
248 | 250 | ||
249 | /* width in bytes ... */ | 251 | // width in bytes |
250 | bit_len = (bit_w-1)/8 + 1; | 252 | bit_len = (bit_w-1)/8 + 1; |
251 | 253 | ||
252 | m_rotfont->per_char[ichar-32].glyph.bit_w = bit_w; | 254 | m_rotfont->per_char[ichar-32].glyph.bit_w = bit_w; |
253 | m_rotfont->per_char[ichar-32].glyph.bit_h = bit_h; | 255 | m_rotfont->per_char[ichar-32].glyph.bit_h = bit_h; |
254 | 256 | ||
255 | /* reserve memory for the rotated image ... */ | 257 | // reserve memory for the rotated image |
256 | bitdata = (unsigned char *)calloc((unsigned)(bit_h * bit_len), 1); | 258 | bitdata = (unsigned char *)calloc((unsigned)(bit_h * bit_len), 1); |
257 | 259 | ||
258 | /* create the image ... */ | 260 | // create the image |
259 | I2 = XCreateImage(dpy, DefaultVisual(dpy, screen), 1, XYBitmap, 0, | 261 | XImage *I2 = XCreateImage(dpy, DefaultVisual(dpy, screen), 1, XYBitmap, 0, |
260 | (char *)bitdata, bit_w, bit_h, 8, 0); | 262 | (char *)bitdata, bit_w, bit_h, 8, 0); |
261 | 263 | ||
262 | if (I2 == None) { | 264 | if (I2 == None) { |
@@ -268,16 +270,16 @@ void XFontImp::rotate(float angle) { | |||
268 | 270 | ||
269 | I2->byte_order = I2->bitmap_bit_order = MSBFirst; | 271 | I2->byte_order = I2->bitmap_bit_order = MSBFirst; |
270 | 272 | ||
271 | /* map vertical data to rotated character ... */ | 273 | // map vertical data to rotated character |
272 | for (j = 0; j < bit_h; j++) { | 274 | for (j = 0; j < bit_h; j++) { |
273 | for (i = 0; i < bit_w; i++) { | 275 | for (i = 0; i < bit_w; i++) { |
274 | /* map bits ... */ | 276 | char val = 0; |
275 | if (dir == 1) { | 277 | if (dir == 1) { |
276 | val = vertdata[i*vert_len + (vert_w-j-1)/8] & | 278 | val = vertdata[i*vert_len + (vert_w-j-1)/8] & |
277 | (128>>((vert_w-j-1)%8)); | 279 | (128>>((vert_w-j-1)%8)); |
278 | } else if (dir == 2) { | 280 | } else if (dir == 2) { |
279 | val = vertdata[(vert_h-j-1)*vert_len + | 281 | val = vertdata[(vert_h-j-1)*vert_len + |
280 | (vert_w-i-1)/8] & (128>>((vert_w-i-1)%8)); | 282 | (vert_w-i-1)/8] & (128>>((vert_w-i-1)%8)); |
281 | } else { | 283 | } else { |
282 | val = vertdata[(vert_h-i-1)*vert_len + j/8] & | 284 | val = vertdata[(vert_h-i-1)*vert_len + j/8] & |
283 | (128>>(j%8)); | 285 | (128>>(j%8)); |
@@ -295,17 +297,13 @@ void XFontImp::rotate(float angle) { | |||
295 | 297 | ||
296 | // put the image into the bitmap | 298 | // put the image into the bitmap |
297 | XPutImage(dpy, m_rotfont->per_char[ichar-32].glyph.bm, | 299 | XPutImage(dpy, m_rotfont->per_char[ichar-32].glyph.bm, |
298 | font_gc, I2, 0, 0, 0, 0, bit_w, bit_h); | 300 | font_gc.gc(), I2, 0, 0, 0, 0, bit_w, bit_h); |
299 | 301 | ||
300 | // free the image and data | 302 | // free the image and data |
301 | XDestroyImage(I1); | 303 | XDestroyImage(I1); |
302 | XDestroyImage(I2); | 304 | XDestroyImage(I2); |
303 | } | 305 | } |
304 | 306 | ||
305 | /* free pixmap and GC ... */ | ||
306 | XFreePixmap(dpy, canvas); | ||
307 | XFreeGC(dpy, font_gc); | ||
308 | |||
309 | } | 307 | } |
310 | 308 | ||
311 | void XFontImp::freeRotFont() { | 309 | void XFontImp::freeRotFont() { |