From 8b73f6f02517e717842d122d82e1eb08cda95e19 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Mon, 13 Jan 2003 01:08:54 +0000 Subject: [PATCH] begin conversion to ustring. add some more members. --- configure.ac | 2 +- otk/font.cc | 39 +++++++++++---------------------------- otk/font.hh | 8 ++++---- otk/ustring.cc | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ otk/ustring.hh | 28 ++++++++++++++++++++++------ 5 files changed, 88 insertions(+), 39 deletions(-) diff --git a/configure.ac b/configure.ac index 97e34241..6b439cd9 100644 --- a/configure.ac +++ b/configure.ac @@ -32,7 +32,7 @@ AM_GNU_GETTEXT([external]) PYTHON_DEVEL -AC_CHECK_HEADERS(ctype.h dirent.h fcntl.h libgen.h locale.h nl_types.h process.h signal.h stdarg.h stdio.h stdlib.h string.h time.h unistd.h sys/param.h sys/select.h sys/signal.h sys/stat.h sys/time.h sys/types.h sys/wait.h) +AC_CHECK_HEADERS(ctype.h dirent.h fcntl.h libgen.h locale.h nl_types.h process.h signal.h stdarg.h stdint.h stdio.h stdlib.h string.h time.h unistd.h sys/param.h sys/select.h sys/signal.h sys/stat.h sys/time.h sys/types.h sys/wait.h) AC_HEADER_TIME # AC_TYPE_SIGNAL diff --git a/otk/font.cc b/otk/font.cc index 0f1ad8c1..b9cc7075 100644 --- a/otk/font.cc +++ b/otk/font.cc @@ -13,10 +13,6 @@ extern "C" { #include #include -using std::string; -using std::cerr; -using std::endl; - #include "font.hh" #include "util.hh" #include "display.hh" @@ -34,10 +30,10 @@ extern "C" { namespace otk { -string Font::_fallback_font = "fixed"; +std::string Font::_fallback_font = "fixed"; bool Font::_xft_init = false; -Font::Font(int screen_num, const string &fontstring, +Font::Font(int screen_num, const std::string &fontstring, bool shadow, unsigned char offset, unsigned char tint) : _screen_num(screen_num), _fontstring(fontstring), @@ -86,7 +82,7 @@ Font::~Font(void) void Font::drawString(XftDraw *d, int x, int y, const Color &color, - const string &string, bool utf8) const + const ustring &string) const { assert(d); @@ -98,14 +94,9 @@ void Font::drawString(XftDraw *d, int x, int y, const Color &color, c.color.alpha = _tint | _tint << 8; // transparent shadow c.pixel = BlackPixel(Display::display, _screen_num); - if (utf8) - XftDrawStringUtf8(d, &c, _xftfont, x + _offset, - _xftfont->ascent + y + _offset, - (FcChar8*)string.c_str(), string.size()); - else - XftDrawString8(d, &c, _xftfont, x + _offset, - _xftfont->ascent + y + _offset, - (FcChar8*)string.c_str(), string.size()); + XftDrawStringUtf8(d, &c, _xftfont, x + _offset, + _xftfont->ascent + y + _offset, + (FcChar8*)string.c_str(), string.size()); } XftColor c; @@ -115,27 +106,19 @@ void Font::drawString(XftDraw *d, int x, int y, const Color &color, c.pixel = color.pixel(); c.color.alpha = 0xff | 0xff << 8; // no transparency in Color yet - if (utf8) - XftDrawStringUtf8(d, &c, _xftfont, x, _xftfont->ascent + y, - (FcChar8*)string.c_str(), string.size()); - else - XftDrawString8(d, &c, _xftfont, x, _xftfont->ascent + y, - (FcChar8*)string.c_str(), string.size()); + XftDrawStringUtf8(d, &c, _xftfont, x, _xftfont->ascent + y, + (FcChar8*)string.c_str(), string.size()); return; } -unsigned int Font::measureString(const string &string, bool utf8) const +unsigned int Font::measureString(const ustring &string) const { XGlyphInfo info; - if (utf8) - XftTextExtentsUtf8(Display::display, _xftfont, - (FcChar8*)string.c_str(), string.size(), &info); - else - XftTextExtents8(Display::display, _xftfont, - (FcChar8*)string.c_str(), string.size(), &info); + XftTextExtentsUtf8(Display::display, _xftfont, + (FcChar8*)string.c_str(), string.size(), &info); return info.xOff + (_shadow ? _offset : 0); } diff --git a/otk/font.hh b/otk/font.hh index 9091b9bc..dcff6526 100644 --- a/otk/font.hh +++ b/otk/font.hh @@ -2,6 +2,8 @@ #ifndef __font_hh #define __font_hh +#include "ustring.hh" + extern "C" { #include #define _XFT_NO_COMPAT_ // no Xft 1 API @@ -9,7 +11,6 @@ extern "C" { } #include -#include namespace otk { @@ -57,8 +58,7 @@ public: unsigned int height() const; unsigned int maxCharWidth() const; - unsigned int measureString(const std::string &string, - bool utf8 = false) const; + unsigned int measureString(const ustring &string) const; //! Draws a string into an XftDraw object /*! @@ -66,7 +66,7 @@ public: different screens, you WILL have unpredictable results! :) */ void drawString(XftDraw *d, int x, int y, const Color &color, - const std::string &string, bool utf8 = false) const; + const ustring &string) const; }; } diff --git a/otk/ustring.cc b/otk/ustring.cc index 571f9773..be16bb17 100644 --- a/otk/ustring.cc +++ b/otk/ustring.cc @@ -41,4 +41,54 @@ ustring::ustring(const char* src) { } +static ustring::size_type find_offset(const char *str, const char *pos) +{ + ustring::size_type offset = 0; + + while (str < pos) { + str += g_utf8_skip[*str]; + offset += g_utf8_skip[*str]; + } + + return offset; +} + +ustring::size_type ustring::size() const +{ + const char *const pdata = _string.data(); + return find_offset(pdata, pdata + _string.size()); +} + +ustring::size_type ustring::length() const +{ + const char *const pdata = _string.data(); + return find_offset(pdata, pdata + _string.size()); +} + +ustring::size_type ustring::bytes() const +{ + return _string.size(); +} + +ustring::size_type ustring::capacity() const +{ + return _string.capacity(); +} + +ustring::size_type ustring::max_size() const +{ + return _string.max_size(); +} + + +const char* ustring::data() const +{ + return _string.data(); +} + +const char* ustring::c_str() const +{ + return _string.c_str(); +} + } diff --git a/otk/ustring.hh b/otk/ustring.hh index 5d011cfc..03f893d3 100644 --- a/otk/ustring.hh +++ b/otk/ustring.hh @@ -20,6 +20,14 @@ extern "C" { namespace otk { +#ifdef HAVE_STDINT_H +typedef uint32_t unichar; +#else +typedef u_int32_t unichar; +#endif + +#ifndef DOXYGEN_IGNORE + //! The number of bytes to skip to find the next character in the string const char g_utf8_skip[256] = { 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, @@ -32,12 +40,6 @@ const char g_utf8_skip[256] = { 3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,6,6,1,1 }; -#ifdef HAVE_STDINT_H -typedef uint32_t unichar; -#else -typedef u_int32_t unichar; -#endif - //! The iterator type for ustring /*! Note this is not a random access iterator but a bidirectional one, since all @@ -102,6 +104,8 @@ private: T _pos; }; +#endif // DOXYGEN_IGNORE + //! This class provides a simple wrapper to a std::string that is encoded as //! UTF-8. /*! @@ -140,6 +144,18 @@ public: ustring(const std::string& src); ustring::ustring(const char* src); + // sizes + + ustring::size_type size() const; + ustring::size_type length() const; + ustring::size_type bytes() const; + ustring::size_type capacity() const; + ustring::size_type max_size() const; + + // internal data + + const char* data() const; + const char* c_str() const; }; -- 2.39.2