initial import
This commit is contained in:
parent
a5aa9fa3f5
commit
bc35a88d78
5 changed files with 431 additions and 0 deletions
52
src/FontImp.hh
Normal file
52
src/FontImp.hh
Normal file
|
@ -0,0 +1,52 @@
|
|||
// FontImp.cc for FbTk
|
||||
// Copyright (c) 2002 Henrik Kinnunen (fluxgen@linuxmail.org)
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// 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 AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
// $Id: FontImp.hh,v 1.1 2002/10/13 22:22:14 fluxgen Exp $
|
||||
|
||||
#ifndef FBTK_FONTIMP_HH
|
||||
#define FBTK_FONTIMP_HH
|
||||
|
||||
#include "Color.hh"
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace FbTk {
|
||||
|
||||
/**
|
||||
FontImp, second part of the bridge pattern for fonts
|
||||
pure interface class.
|
||||
*/
|
||||
class FontImp {
|
||||
public:
|
||||
virtual ~FontImp() { }
|
||||
virtual bool load(const std::string &name) = 0;
|
||||
virtual void drawText(Drawable w, int screen, GC gc, const char *text, size_t len, int x, int y) const = 0;
|
||||
virtual unsigned int textWidth(const char * const text, unsigned int size) const = 0;
|
||||
virtual unsigned int height() const = 0;
|
||||
protected:
|
||||
FontImp() { }
|
||||
};
|
||||
|
||||
}; // end namespace FbTk
|
||||
|
||||
#endif // FBTK_FONTIMP_HH
|
70
src/XFontImp.cc
Normal file
70
src/XFontImp.cc
Normal file
|
@ -0,0 +1,70 @@
|
|||
// XFontImp.cc for FbTk fluxbox toolkit
|
||||
// Copyright (c) 2002 Henrik Kinnunen (fluxgen@linuxmail.org)
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// 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 AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
// $Id: XFontImp.cc,v 1.1 2002/10/13 22:22:14 fluxgen Exp $
|
||||
|
||||
#include "XFontImp.hh"
|
||||
#include "BaseDisplay.hh"
|
||||
|
||||
#include <iostream>
|
||||
using namespace std;
|
||||
|
||||
XFontImp::XFontImp(const char *fontname):m_fontstruct(0) {
|
||||
if (fontname != 0)
|
||||
load(fontname);
|
||||
}
|
||||
|
||||
XFontImp::~XFontImp() {
|
||||
if (m_fontstruct != 0)
|
||||
XFreeFont(BaseDisplay::getXDisplay(), m_fontstruct);
|
||||
}
|
||||
|
||||
bool XFontImp::load(const std::string &fontname) {
|
||||
XFontStruct *font = XLoadQueryFont(BaseDisplay::getXDisplay(), fontname.c_str());
|
||||
if (font == 0)
|
||||
return false;
|
||||
if (m_fontstruct != 0) // free old font struct, if any
|
||||
XFreeFont(BaseDisplay::getXDisplay(), m_fontstruct);
|
||||
|
||||
m_fontstruct = font; //set new font
|
||||
return true;
|
||||
}
|
||||
|
||||
void XFontImp::drawText(Drawable w, int screen, GC gc, const char *text, size_t len, int x, int y) const {
|
||||
if (m_fontstruct == 0)
|
||||
return;
|
||||
Display *disp = BaseDisplay::getXDisplay();
|
||||
XSetFont(disp, gc, m_fontstruct->fid);
|
||||
XDrawString(disp, w, gc, x, y, text, len);
|
||||
}
|
||||
|
||||
unsigned int XFontImp::textWidth(const char * const text, unsigned int size) const {
|
||||
if (m_fontstruct == 0)
|
||||
return 0;
|
||||
return XTextWidth(m_fontstruct, text, size);
|
||||
}
|
||||
|
||||
unsigned int XFontImp::height() const {
|
||||
if (m_fontstruct == 0)
|
||||
return 0;
|
||||
|
||||
return m_fontstruct->ascent + m_fontstruct->descent;
|
||||
}
|
41
src/XFontImp.hh
Normal file
41
src/XFontImp.hh
Normal file
|
@ -0,0 +1,41 @@
|
|||
// XFontImp.hh for FbTk fluxbox toolkit
|
||||
// Copyright (c) 2002 Henrik Kinnunen (fluxgen@linuxmail.org)
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// 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 AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
// $Id: XFontImp.hh,v 1.1 2002/10/13 22:22:14 fluxgen Exp $
|
||||
|
||||
#ifndef XFONTIMP_HH
|
||||
#define XFONTIMP_HH
|
||||
|
||||
#include "FontImp.hh"
|
||||
|
||||
class XFontImp:public FbTk::FontImp {
|
||||
public:
|
||||
explicit XFontImp(const char *filename = 0);
|
||||
~XFontImp();
|
||||
bool load(const std::string &filename);
|
||||
unsigned int textWidth(const char * const text, unsigned int size) const;
|
||||
unsigned int height() const;
|
||||
void drawText(Drawable w, int screen, GC gc, const char *text, size_t len, int x, int y) const;
|
||||
private:
|
||||
XFontStruct *m_fontstruct;
|
||||
};
|
||||
|
||||
#endif // XFONTIMP_HH
|
225
src/XmbFontImp.cc
Normal file
225
src/XmbFontImp.cc
Normal file
|
@ -0,0 +1,225 @@
|
|||
// XmbFontImp.cc for FbTk fluxbox toolkit
|
||||
// Copyright (c) 2002 Henrik Kinnunen (fluxgen@linuxmail.org)
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// 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 AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
// $Id: XmbFontImp.cc,v 1.1 2002/10/13 22:22:14 fluxgen Exp $
|
||||
|
||||
#include "XmbFontImp.hh"
|
||||
|
||||
#include "BaseDisplay.hh"
|
||||
#include "StringUtil.hh"
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif //HAVE_CONFIG_H
|
||||
|
||||
#ifdef HAVE_SETLOCALE
|
||||
#include <locale.h>
|
||||
#endif // HAVE_SETLOCALE
|
||||
|
||||
#include <cstdarg>
|
||||
|
||||
namespace {
|
||||
|
||||
const char *getFontSize(const char *pattern, int *size) {
|
||||
const char *p;
|
||||
const char *p2=0;
|
||||
int n=0;
|
||||
|
||||
for (p=pattern; 1; p++) {
|
||||
if (!*p) {
|
||||
if (p2!=0 && n>1 && n<72) {
|
||||
*size = n; return p2+1;
|
||||
} else {
|
||||
*size = 16; return 0;
|
||||
}
|
||||
} else if (*p=='-') {
|
||||
if (n>1 && n<72 && p2!=0) {
|
||||
*size = n;
|
||||
return p2+1;
|
||||
}
|
||||
p2=p; n=0;
|
||||
} else if (*p>='0' && *p<='9' && p2!=0) {
|
||||
n *= 10;
|
||||
n += *p-'0';
|
||||
} else {
|
||||
p2=0; n=0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const char *getFontElement(const char *pattern, char *buf, int bufsiz, ...) {
|
||||
const char *p, *v;
|
||||
char *p2;
|
||||
va_list va;
|
||||
|
||||
va_start(va, bufsiz);
|
||||
buf[bufsiz-1] = 0;
|
||||
buf[bufsiz-2] = '*';
|
||||
while((v = va_arg(va, char *)) != 0) {
|
||||
p = StringUtil::strcasestr(pattern, v);
|
||||
if (p) {
|
||||
std::strncpy(buf, p+1, bufsiz-2);
|
||||
p2 = strchr(buf, '-');
|
||||
if (p2) *p2=0;
|
||||
va_end(va);
|
||||
return p;
|
||||
}
|
||||
}
|
||||
va_end(va);
|
||||
std::strncpy(buf, "*", bufsiz);
|
||||
return 0;
|
||||
}
|
||||
|
||||
XFontSet createFontSet(const char *fontname) {
|
||||
Display *display = BaseDisplay::getXDisplay();
|
||||
XFontSet fs;
|
||||
const int FONT_ELEMENT_SIZE=50;
|
||||
char **missing, *def = "-";
|
||||
int nmissing, pixel_size = 0, buf_size = 0;
|
||||
char weight[FONT_ELEMENT_SIZE], slant[FONT_ELEMENT_SIZE];
|
||||
|
||||
fs = XCreateFontSet(display,
|
||||
fontname, &missing, &nmissing, &def);
|
||||
if (fs && (! nmissing)) return fs;
|
||||
|
||||
#ifdef HAVE_SETLOCALE
|
||||
if (! fs) {
|
||||
if (nmissing) XFreeStringList(missing);
|
||||
|
||||
setlocale(LC_CTYPE, "C");
|
||||
fs = XCreateFontSet(display, fontname,
|
||||
&missing, &nmissing, &def);
|
||||
setlocale(LC_CTYPE, "");
|
||||
}
|
||||
#endif // HAVE_SETLOCALE
|
||||
|
||||
if (fs) {
|
||||
XFontStruct **fontstructs;
|
||||
char **fontnames;
|
||||
XFontsOfFontSet(fs, &fontstructs, &fontnames);
|
||||
fontname = fontnames[0];
|
||||
}
|
||||
|
||||
getFontElement(fontname, weight, FONT_ELEMENT_SIZE,
|
||||
"-medium-", "-bold-", "-demibold-", "-regular-", 0);
|
||||
getFontElement(fontname, slant, FONT_ELEMENT_SIZE,
|
||||
"-r-", "-i-", "-o-", "-ri-", "-ro-", 0);
|
||||
getFontSize(fontname, &pixel_size);
|
||||
|
||||
if (! strcmp(weight, "*"))
|
||||
std::strncpy(weight, "medium", FONT_ELEMENT_SIZE);
|
||||
if (! strcmp(slant, "*"))
|
||||
std::strncpy(slant, "r", FONT_ELEMENT_SIZE);
|
||||
if (pixel_size < 3)
|
||||
pixel_size = 3;
|
||||
else if (pixel_size > 97)
|
||||
pixel_size = 97;
|
||||
|
||||
buf_size = strlen(fontname) + (FONT_ELEMENT_SIZE * 2) + 64;
|
||||
char *pattern2 = new char[buf_size];
|
||||
snprintf(pattern2, buf_size - 1,
|
||||
"%s,"
|
||||
"-*-*-%s-%s-*-*-%d-*-*-*-*-*-*-*,"
|
||||
"-*-*-*-*-*-*-%d-*-*-*-*-*-*-*,*",
|
||||
fontname, weight, slant, pixel_size, pixel_size);
|
||||
fontname = pattern2;
|
||||
|
||||
if (nmissing)
|
||||
XFreeStringList(missing);
|
||||
if (fs)
|
||||
XFreeFontSet(display, fs);
|
||||
|
||||
fs = XCreateFontSet(display, fontname,
|
||||
&missing, &nmissing, &def);
|
||||
delete [] pattern2;
|
||||
|
||||
return fs;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
XmbFontImp::XmbFontImp(const char *filename, bool utf8):m_fontset(0), m_utf8mode(utf8) {
|
||||
if (filename != 0)
|
||||
load(filename);
|
||||
}
|
||||
|
||||
XmbFontImp::~XmbFontImp() {
|
||||
if (m_fontset != 0)
|
||||
XFreeFontSet(BaseDisplay::getXDisplay(), m_fontset);
|
||||
}
|
||||
|
||||
bool XmbFontImp::load(const std::string &fontname) {
|
||||
if (fontname.size() == 0)
|
||||
return false;
|
||||
XFontSet set = createFontSet(fontname.c_str());
|
||||
if (set == 0)
|
||||
return false;
|
||||
if (m_fontset != 0)
|
||||
XFreeFontSet(BaseDisplay::getXDisplay(), m_fontset);
|
||||
m_fontset = set;
|
||||
m_setextents = XExtentsOfFontSet(m_fontset);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void XmbFontImp::drawText(Drawable w, int screen, GC gc, const char *text,
|
||||
size_t len, int x, int y) const {
|
||||
|
||||
if (text == 0 || len == 0 || w == 0 || m_fontset == 0)
|
||||
return;
|
||||
#ifdef X_HAVE_UTF8_STRING
|
||||
if (m_utf8mode) {
|
||||
Xutf8DrawString(BaseDisplay::getXDisplay(), w, m_fontset,
|
||||
gc, x, y,
|
||||
text, len);
|
||||
} else
|
||||
#endif //X_HAVE_UTF8_STRING
|
||||
{
|
||||
XmbDrawString(BaseDisplay::getXDisplay(), w, m_fontset,
|
||||
gc, x, y,
|
||||
text, len);
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int XmbFontImp::textWidth(const char *text, unsigned int len) const {
|
||||
if (m_fontset == 0)
|
||||
return 0;
|
||||
XRectangle ink, logical;
|
||||
#ifdef X_HAVE_UTF8_STRING
|
||||
if (m_utf8mode) {
|
||||
Xutf8TextExtents(m_fontset, text, len,
|
||||
&ink, &logical);
|
||||
} else
|
||||
#endif // X_HAVE_UTF8_STRING
|
||||
{
|
||||
XmbTextExtents(m_fontset, text, len,
|
||||
&ink, &logical);
|
||||
}
|
||||
|
||||
return logical.width;
|
||||
}
|
||||
|
||||
unsigned int XmbFontImp::height() const {
|
||||
if (m_fontset == 0)
|
||||
return 0;
|
||||
return m_setextents->max_ink_extent.height;
|
||||
}
|
||||
|
43
src/XmbFontImp.hh
Normal file
43
src/XmbFontImp.hh
Normal file
|
@ -0,0 +1,43 @@
|
|||
// XmbFontImp.hh for FbTk fluxbox toolkit
|
||||
// Copyright (c) 2002 Henrik Kinnunen (fluxgen@linuxmail.org)
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// 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 AUTHORS OR COPYRIGHT HOLDERS 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.
|
||||
|
||||
// $Id: XmbFontImp.hh,v 1.1 2002/10/13 22:22:14 fluxgen Exp $
|
||||
|
||||
#ifndef XMBFONTIMP_HH
|
||||
#define XMBFONTIMP_HH
|
||||
|
||||
#include "FontImp.hh"
|
||||
|
||||
class XmbFontImp:public FbTk::FontImp {
|
||||
public:
|
||||
XmbFontImp(const char *fontname, bool utf8);
|
||||
~XmbFontImp();
|
||||
bool load(const std::string &name);
|
||||
virtual void drawText(Drawable w, int screen, GC gc, const char *text, size_t len, int x, int y) const;
|
||||
unsigned int textWidth(const char *text, unsigned int len) const;
|
||||
unsigned int height() const;
|
||||
private:
|
||||
XFontSet m_fontset;
|
||||
XFontSetExtents *m_setextents;
|
||||
const bool m_utf8mode;
|
||||
};
|
||||
|
||||
#endif // XMBFONTIMP_HH
|
Loading…
Reference in a new issue