aboutsummaryrefslogtreecommitdiff
path: root/src/FbTk
diff options
context:
space:
mode:
Diffstat (limited to 'src/FbTk')
-rw-r--r--src/FbTk/FbPixmap.cc43
-rw-r--r--src/FbTk/FbPixmap.hh17
-rw-r--r--src/FbTk/ImageControl.cc23
-rw-r--r--src/FbTk/ImageControl.hh42
-rw-r--r--src/FbTk/Text.cc16
-rw-r--r--src/FbTk/Text.hh10
-rw-r--r--src/FbTk/TextButton.cc2
-rw-r--r--src/FbTk/TextureRender.cc1
8 files changed, 71 insertions, 83 deletions
diff --git a/src/FbTk/FbPixmap.cc b/src/FbTk/FbPixmap.cc
index bfd3ead..9d90c5a 100644
--- a/src/FbTk/FbPixmap.cc
+++ b/src/FbTk/FbPixmap.cc
@@ -38,21 +38,34 @@ using std::cerr;
38 38
39namespace FbTk { 39namespace FbTk {
40 40
41Pixmap *FbPixmap::m_root_pixmaps = 0; 41namespace {
42 42
43const char* FbPixmap::root_prop_ids[] = { 43Pixmap *root_pixmaps = 0;
44
45const char* root_prop_ids[] = {
44 "_XROOTPMAP_ID", 46 "_XROOTPMAP_ID",
45 "_XSETROOT_ID", 47 "_XSETROOT_ID",
46 0 48 0
47}; 49};
48 50
49// same number as in root_prop_ids 51// same number as in root_prop_ids
50Atom FbPixmap::root_prop_atoms[] = { 52Atom root_prop_atoms[] = {
51 None, 53 None,
52 None, 54 None,
53 None 55 None
54}; 56};
55 57
58void checkAtoms() {
59
60 Display* display = FbTk::App::instance()->display();
61 for (int i=0; root_prop_ids[i] != 0; ++i) {
62 if (root_prop_atoms[i] == None) {
63 root_prop_atoms[i] = XInternAtom(display, root_prop_ids[i], False);
64 }
65 }
66}
67
68}; // end of anonymous namespace
56 69
57FbPixmap::FbPixmap():m_pm(0), 70FbPixmap::FbPixmap():m_pm(0),
58 m_width(0), m_height(0), 71 m_width(0), m_height(0),
@@ -389,14 +402,14 @@ bool FbPixmap::rootwinPropertyNotify(int screen_num, Atom atom) {
389 402
390// returns whether or not the background was changed 403// returns whether or not the background was changed
391bool FbPixmap::setRootPixmap(int screen_num, Pixmap pm) { 404bool FbPixmap::setRootPixmap(int screen_num, Pixmap pm) {
392 if (!m_root_pixmaps) { 405 if (!root_pixmaps) {
393 m_root_pixmaps = new Pixmap[ScreenCount(display())]; 406 root_pixmaps = new Pixmap[ScreenCount(display())];
394 for (int i=0; i < ScreenCount(display()); ++i) 407 for (int i=0; i < ScreenCount(display()); ++i)
395 m_root_pixmaps[i] = None; 408 root_pixmaps[i] = None;
396 } 409 }
397 410
398 if (m_root_pixmaps[screen_num] != pm) { 411 if (root_pixmaps[screen_num] != pm) {
399 m_root_pixmaps[screen_num] = pm; 412 root_pixmaps[screen_num] = pm;
400 FbWindow::updatedAlphaBackground(screen_num); 413 FbWindow::updatedAlphaBackground(screen_num);
401 return true; 414 return true;
402 } 415 }
@@ -410,8 +423,8 @@ Pixmap FbPixmap::getRootPixmap(int screen_num, bool force_update) {
410 */ 423 */
411 424
412 // check and see if if we have the pixmaps in cache 425 // check and see if if we have the pixmaps in cache
413 if (m_root_pixmaps && !force_update) 426 if (root_pixmaps && !force_update)
414 return m_root_pixmaps[screen_num]; 427 return root_pixmaps[screen_num];
415 428
416 // else setup pixmap cache 429 // else setup pixmap cache
417 int numscreens = ScreenCount(display()); 430 int numscreens = ScreenCount(display());
@@ -460,15 +473,7 @@ Pixmap FbPixmap::getRootPixmap(int screen_num, bool force_update) {
460 setRootPixmap(i, root_pm); 473 setRootPixmap(i, root_pm);
461 } 474 }
462 475
463 return m_root_pixmaps[screen_num]; 476 return root_pixmaps[screen_num];
464}
465
466void FbPixmap::checkAtoms() {
467 for (int i=0; root_prop_ids[i] != 0; ++i) {
468 if (root_prop_atoms[i] == None) {
469 root_prop_atoms[i] = XInternAtom(display(), root_prop_ids[i], False);
470 }
471 }
472} 477}
473 478
474void FbPixmap::free() { 479void FbPixmap::free() {
diff --git a/src/FbTk/FbPixmap.hh b/src/FbTk/FbPixmap.hh
index 7b3c8de..5c2e2b8 100644
--- a/src/FbTk/FbPixmap.hh
+++ b/src/FbTk/FbPixmap.hh
@@ -23,22 +23,22 @@
23#define FBTK_FBPIXMAP_HH 23#define FBTK_FBPIXMAP_HH
24 24
25#include "FbDrawable.hh" 25#include "FbDrawable.hh"
26#include "Text.hh" 26#include "Text.hh" // for Orientation
27 27
28namespace FbTk { 28namespace FbTk {
29 29
30/// a wrapper for X Pixmap 30/// a wrapper for X Pixmap
31class FbPixmap:public FbDrawable { 31class FbPixmap:public FbDrawable {
32public: 32public:
33 FbPixmap(); 33 FbPixmap();
34 /// copy pixmap 34 /// copy pixmap
35 FbPixmap(const FbPixmap &copy); 35 FbPixmap(const FbPixmap &copy);
36 /// creates a FbPixmap from X pixmap 36 /// creates a FbPixmap from X pixmap
37 explicit FbPixmap(Pixmap pm); 37 explicit FbPixmap(Pixmap pm);
38 FbPixmap(const FbDrawable &src, 38 FbPixmap(const FbDrawable &src,
39 unsigned int width, unsigned int height, 39 unsigned int width, unsigned int height,
40 unsigned int depth); 40 unsigned int depth);
41 FbPixmap(Drawable src, 41 FbPixmap(Drawable src,
42 unsigned int width, unsigned int height, 42 unsigned int width, unsigned int height,
43 unsigned int depth); 43 unsigned int depth);
44 44
@@ -86,13 +86,6 @@ private:
86 // if pixmap not *owned* by this object (eg assigned from cache object) 86 // if pixmap not *owned* by this object (eg assigned from cache object)
87 bool m_dont_free; 87 bool m_dont_free;
88 88
89 /// Functions relating to the maintenance of root window pixmap caching
90 static void checkAtoms();
91
92 // array of pixmaps: 1 per screen
93 static Pixmap *m_root_pixmaps;
94 static const char *root_prop_ids[];
95 static Atom root_prop_atoms[];
96}; 89};
97 90
98} // end namespace FbTk 91} // end namespace FbTk
diff --git a/src/FbTk/ImageControl.cc b/src/FbTk/ImageControl.cc
index 1281b56..1fa2f65 100644
--- a/src/FbTk/ImageControl.cc
+++ b/src/FbTk/ImageControl.cc
@@ -25,6 +25,7 @@
25#include "ImageControl.hh" 25#include "ImageControl.hh"
26 26
27#include "TextureRender.hh" 27#include "TextureRender.hh"
28#include "Texture.hh"
28#include "App.hh" 29#include "App.hh"
29#include "SimpleCommand.hh" 30#include "SimpleCommand.hh"
30#include "I18n.hh" 31#include "I18n.hh"
@@ -67,15 +68,17 @@ using std::list;
67 68
68namespace FbTk { 69namespace FbTk {
69 70
70// lookup table for texture 71namespace { // anonymous
71unsigned long *ImageControl::sqrt_table = 0; 72
73static unsigned long *sqrt_table = 0; /// lookup table
74
72#ifdef TIMEDCACHE 75#ifdef TIMEDCACHE
73bool ImageControl::s_timed_cache = true; 76bool s_timed_cache = true;
74#else 77#else
75bool ImageControl::s_timed_cache = false; 78bool s_timed_cache = false;
76#endif // TIMEDCACHE 79#endif // TIMEDCACHE
77 80
78namespace { // anonymous 81
79 82
80inline unsigned long bsqrt(unsigned long x) { 83inline unsigned long bsqrt(unsigned long x) {
81 if (x <= 0) return 0; 84 if (x <= 0) return 0;
@@ -93,6 +96,14 @@ inline unsigned long bsqrt(unsigned long x) {
93 96
94}; // end anonymous namespace 97}; // end anonymous namespace
95 98
99struct ImageControl::Cache {
100 Pixmap pixmap;
101 Pixmap texture_pixmap;
102 Orientation orient;
103 unsigned int count, width, height;
104 unsigned long pixel1, pixel2, texture;
105};
106
96ImageControl::ImageControl(int screen_num, bool dither, 107ImageControl::ImageControl(int screen_num, bool dither,
97 int cpc, unsigned long cache_timeout, unsigned long cmax): 108 int cpc, unsigned long cache_timeout, unsigned long cmax):
98 m_dither(dither), 109 m_dither(dither),
@@ -148,7 +159,7 @@ ImageControl::~ImageControl() {
148 delete [] m_colors; 159 delete [] m_colors;
149 } 160 }
150 161
151 if (cache.size() > 0) { 162 if (!cache.empty()) {
152 CacheList::iterator it = cache.begin(); 163 CacheList::iterator it = cache.begin();
153 CacheList::iterator it_end = cache.end(); 164 CacheList::iterator it_end = cache.end();
154 for (; it != it_end; ++it) { 165 for (; it != it_end; ++it) {
diff --git a/src/FbTk/ImageControl.hh b/src/FbTk/ImageControl.hh
index d754a07..3c3cbb1 100644
--- a/src/FbTk/ImageControl.hh
+++ b/src/FbTk/ImageControl.hh
@@ -25,16 +25,17 @@
25#ifndef FBTK_IMAGECONTROL_HH 25#ifndef FBTK_IMAGECONTROL_HH
26#define FBTK_IMAGECONTROL_HH 26#define FBTK_IMAGECONTROL_HH
27 27
28// actually, Text is rather tool like, that's where orientation comes from 28#include "Text.hh" // actually, Text is rather tool like, that's where orientation comes from
29#include "Text.hh"
30#include "Texture.hh"
31#include "Timer.hh" 29#include "Timer.hh"
32#include "NotCopyable.hh" 30#include "NotCopyable.hh"
33 31
32#include <X11/Xlib.h> // for Visual* etc
34#include <list> 33#include <list>
35 34
36namespace FbTk { 35namespace FbTk {
37 36
37class Texture;
38
38/// Holds screen info, color tables and caches textures 39/// Holds screen info, color tables and caches textures
39class ImageControl: private NotCopyable { 40class ImageControl: private NotCopyable {
40public: 41public:
@@ -47,7 +48,7 @@ public:
47 int bitsPerPixel() const { return bits_per_pixel; } 48 int bitsPerPixel() const { return bits_per_pixel; }
48#endif 49#endif
49 int depth() const { return m_screen_depth; } 50 int depth() const { return m_screen_depth; }
50 int colorsPerChannel() const { return m_colors_per_channel; } 51 int colorsPerChannel() const { return m_colors_per_channel; }
51 int screenNumber() const { return m_screen_num; } 52 int screenNumber() const { return m_screen_num; }
52 Visual *visual() const { return m_visual; } 53 Visual *visual() const { return m_visual; }
53 unsigned long getSqrt(unsigned int val) const; 54 unsigned long getSqrt(unsigned int val) const;
@@ -103,39 +104,18 @@ private:
103 int m_colors_per_channel; ///< number of colors per channel 104 int m_colors_per_channel; ///< number of colors per channel
104 int m_screen_depth; ///< bit depth of screen 105 int m_screen_depth; ///< bit depth of screen
105 int m_screen_num; ///< screen number 106 int m_screen_num; ///< screen number
106 unsigned char red_color_table[256], green_color_table[256], 107 unsigned char red_color_table[256];
107 blue_color_table[256]; 108 unsigned char green_color_table[256];
109 unsigned char blue_color_table[256];
110
108 unsigned int *grad_xbuffer, *grad_ybuffer, grad_buffer_width, 111 unsigned int *grad_xbuffer, *grad_ybuffer, grad_buffer_width,
109 grad_buffer_height; 112 grad_buffer_height;
110 113
111 static unsigned long *sqrt_table; /// sqrt lookup table 114 struct Cache;
112
113 typedef struct Cache {
114 Pixmap pixmap;
115 Pixmap texture_pixmap;
116 Orientation orient;
117 unsigned int count, width, height;
118 unsigned long pixel1, pixel2, texture;
119 } Cache;
120
121 struct ltCacheEntry {
122 bool operator()(const Cache* s1, const Cache* s2) const {
123 return (s1->orient < s2->orient || s1->orient == s2->orient
124 && (s1->width < s2->width || s1->width == s2->width
125 && (s1->height < s2->height || s1->height == s2->height
126 && (s1->texture < s2->texture || s1->texture == s2->texture
127 && (s1->pixel1 < s2->pixel1 || s1->pixel1 == s2->pixel1
128 && ((s1->texture & FbTk::Texture::GRADIENT) && s1->pixel2 < s2->pixel2)
129 )))));
130 }
131 };
132
133
134 unsigned long cache_max;
135 typedef std::list<Cache *> CacheList; 115 typedef std::list<Cache *> CacheList;
136 116
137 mutable CacheList cache; 117 mutable CacheList cache;
138 static bool s_timed_cache; 118 unsigned long cache_max;
139}; 119};
140 120
141} // end namespace FbTk 121} // end namespace FbTk
diff --git a/src/FbTk/Text.cc b/src/FbTk/Text.cc
index 1e2851e..710b48a 100644
--- a/src/FbTk/Text.cc
+++ b/src/FbTk/Text.cc
@@ -28,15 +28,15 @@
28 28
29namespace FbTk { 29namespace FbTk {
30 30
31int doAlignment(int max_width, int bevel, FbTk::Justify justify, 31int doAlignment(int max_width, int bevel, FbTk::Justify justify,
32 const FbTk::Font &font, const char * const text, 32 const FbTk::Font &font, const char * const text,
33 size_t textlen, size_t &newlen) { 33 unsigned int textlen, unsigned int &newlen) {
34 34
35 if (text == 0 || textlen == 0) 35 if (text == 0 || textlen == 0)
36 return 0; 36 return 0;
37 37
38 int l = font.textWidth(text, textlen) + bevel; 38 int l = font.textWidth(text, textlen) + bevel;
39 size_t dlen = textlen; 39 unsigned int dlen = textlen;
40 int dx = bevel; 40 int dx = bevel;
41 if (l > max_width) { 41 if (l > max_width) {
42 for (; dlen > 0; dlen--) { 42 for (; dlen > 0; dlen--) {
@@ -51,14 +51,14 @@ int doAlignment(int max_width, int bevel, FbTk::Justify justify,
51 switch (justify) { 51 switch (justify) {
52 case FbTk::RIGHT: 52 case FbTk::RIGHT:
53 dx = max_width - l - bevel; 53 dx = max_width - l - bevel;
54 break; 54 break;
55 case FbTk::CENTER: 55 case FbTk::CENTER:
56 dx = (max_width - l)/2; 56 dx = (max_width - l)/2;
57 break; 57 break;
58 case FbTk::LEFT: 58 case FbTk::LEFT:
59 break; 59 break;
60 } 60 }
61 61
62 return dx; 62 return dx;
63} 63}
64 64
diff --git a/src/FbTk/Text.hh b/src/FbTk/Text.hh
index f2b4162..494d365 100644
--- a/src/FbTk/Text.hh
+++ b/src/FbTk/Text.hh
@@ -22,8 +22,6 @@
22#ifndef FBTK_TEXT_HH 22#ifndef FBTK_TEXT_HH
23#define FBTK_TEXT_HH 23#define FBTK_TEXT_HH
24 24
25#include <sys/types.h>
26
27namespace FbTk { 25namespace FbTk {
28 26
29class Font; 27class Font;
@@ -37,7 +35,7 @@ enum Orientation { ROT0=0, ROT90, ROT180, ROT270 };
37 */ 35 */
38int doAlignment(int max_width, int bevel, FbTk::Justify justify, 36int doAlignment(int max_width, int bevel, FbTk::Justify justify,
39 const FbTk::Font &font, const char * const text, 37 const FbTk::Font &font, const char * const text,
40 size_t textlen, size_t &newlen); 38 unsigned int textlen, unsigned int &newlen);
41 39
42/** 40/**
43 There are 3 interesting translations: 41 There are 3 interesting translations:
@@ -76,7 +74,7 @@ inline void translateCoords(Orientation orient, int &x, int &y, unsigned int w,
76} 74}
77 75
78// still require w and h in ROT0 coords 76// still require w and h in ROT0 coords
79inline void untranslateCoords(Orientation orient, int &orig_x, int &orig_y, unsigned int w, unsigned int h) { 77inline void untranslateCoords(Orientation orient, int orig_x, int orig_y, unsigned int w, unsigned int h) {
80 78
81 int x = orig_x; 79 int x = orig_x;
82 int y = orig_y; 80 int y = orig_y;
@@ -102,7 +100,7 @@ inline void untranslateCoords(Orientation orient, int &orig_x, int &orig_y, unsi
102 100
103// When positioning an X11 box inside another area, we need to 101// When positioning an X11 box inside another area, we need to
104// relocate the x,y coordinates 102// relocate the x,y coordinates
105inline void translatePosition(Orientation orient, int &x, int &y, unsigned int w, unsigned int h, unsigned int bw) { 103inline void translatePosition(Orientation orient, int x, int y, unsigned int w, unsigned int h, unsigned int bw) {
106 104
107 switch(orient) { 105 switch(orient) {
108 case ROT0: 106 case ROT0:
@@ -121,7 +119,7 @@ inline void translatePosition(Orientation orient, int &x, int &y, unsigned int w
121 119
122} 120}
123 121
124inline void translateSize(Orientation orient, unsigned int &w, unsigned int &h) { 122inline void translateSize(Orientation orient, unsigned int w, unsigned int h) {
125 if (orient == ROT0 || orient == ROT180) 123 if (orient == ROT0 || orient == ROT180)
126 return; 124 return;
127 125
diff --git a/src/FbTk/TextButton.cc b/src/FbTk/TextButton.cc
index 922eb74..85ac5c8 100644
--- a/src/FbTk/TextButton.cc
+++ b/src/FbTk/TextButton.cc
@@ -150,7 +150,7 @@ void TextButton::renderForeground(FbWindow &win, FbDrawable &drawable) {
150} 150}
151 151
152void TextButton::drawText(int x_offset, int y_offset, FbDrawable *drawable) { 152void TextButton::drawText(int x_offset, int y_offset, FbDrawable *drawable) {
153 size_t textlen = text().size(); 153 unsigned int textlen = text().size();
154 // do text alignment 154 // do text alignment
155 155
156 unsigned int textw = width(), texth = height(); 156 unsigned int textw = width(), texth = height();
diff --git a/src/FbTk/TextureRender.cc b/src/FbTk/TextureRender.cc
index 3f35951..c7c29c1 100644
--- a/src/FbTk/TextureRender.cc
+++ b/src/FbTk/TextureRender.cc
@@ -25,6 +25,7 @@
25#include "TextureRender.hh" 25#include "TextureRender.hh"
26 26
27#include "ImageControl.hh" 27#include "ImageControl.hh"
28#include "Texture.hh"
28#include "App.hh" 29#include "App.hh"
29#include "FbPixmap.hh" 30#include "FbPixmap.hh"
30#include "GContext.hh" 31#include "GContext.hh"