diff --git a/libs/gtkmm2ext/emscale.cc b/libs/gtkmm2ext/emscale.cc new file mode 100644 index 0000000000..5d28218bb5 --- /dev/null +++ b/libs/gtkmm2ext/emscale.cc @@ -0,0 +1,73 @@ +/* + Copyright (C) 2014 Paul Davis, Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include +#include +#include + +#include "gtkmm2ext/emscale.h" + +#include "i18n.h" + +using namespace Gtkmm2ext; + +std::map EmScale::_emscales; + +EmScale::EmScale (const Pango::FontDescription& fd) + : _font (fd) + , _char_pixel_width (-1) + , _char_pixel_height (-1) + , _char_avg_pixel_width (-1) +{ +} + +void +EmScale::recalc_char_pixel_geometry () +{ + if (_char_pixel_height > 0 && _char_pixel_width > 0) { + return; + } + + Glib::RefPtr pc = Glib::wrap (gdk_pango_context_get_for_screen (gdk_screen_get_default())); + Glib::RefPtr layout = Pango::Layout::create (pc); + + layout->set_font_description (_font); + + int w, h; + std::string x = _("ABCDEFGHIJLKMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"); + layout->set_text (x); + layout->get_pixel_size (w, h); + _char_pixel_height = std::max(4, h); + // number of actual chars in the string (not bytes) + // Glib to the rescue. + Glib::ustring gx(x); + _char_avg_pixel_width = w / (float)gx.size(); + _char_pixel_width = std::max(4, (int) ceil (_char_avg_pixel_width)); +} + +EmScale& +EmScale::by_font (const Pango::FontDescription& fd) +{ + std::map::iterator i = _emscales.find (fd.to_string()); + + if (i == _emscales.end()) { + i = _emscales.insert (std::make_pair (fd.to_string(), EmScale (fd))).first; + } + + return i->second; +} diff --git a/libs/gtkmm2ext/gtkmm2ext/emscale.h b/libs/gtkmm2ext/gtkmm2ext/emscale.h new file mode 100644 index 0000000000..15f32a7d70 --- /dev/null +++ b/libs/gtkmm2ext/gtkmm2ext/emscale.h @@ -0,0 +1,56 @@ +/* + Copyright (C) 2014 Paul Davis, Robin Gareus + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#ifndef __libgtkmm2ext_emscale_h__ +#define __libgtkmm2ext_emscale_h__ + +#include +#include + +#include + +#include "gtkmm2ext/visibility.h" + +namespace Gtkmm2ext +{ + +class LIBGTKMM2EXT_API EmScale +{ + public: + EmScale (const Pango::FontDescription&); + + unsigned int char_pixel_width() { if (_char_pixel_width < 1) recalc_char_pixel_geometry() ; return _char_pixel_width; } + unsigned int char_pixel_height() { if (_char_pixel_height < 1) recalc_char_pixel_geometry() ; return _char_pixel_height; } + float char_avg_pixel_width() { if (_char_pixel_width < 1) recalc_char_pixel_geometry() ; return _char_avg_pixel_width; } + + static EmScale& by_font (const Pango::FontDescription&); + + private: + Pango::FontDescription _font; + unsigned int _char_pixel_width; + unsigned int _char_pixel_height; + float _char_avg_pixel_width; + + void recalc_char_pixel_geometry (); + + static std::map _emscales; +}; + +} // namespace + +#endif /* __libgtkmm2ext_emscale_h__ */ diff --git a/libs/gtkmm2ext/wscript b/libs/gtkmm2ext/wscript index ef45563c18..c385ce01f8 100644 --- a/libs/gtkmm2ext/wscript +++ b/libs/gtkmm2ext/wscript @@ -39,6 +39,7 @@ gtkmm2ext_sources = [ 'cursors.cc', 'debug.cc', 'dndtreeview.cc', + 'emscale.cc', 'fastmeter.cc', 'focus_entry.cc', 'grouped_buttons.cc',