Author: mordante
Date: Fri Jul 11 18:53:20 2008
New Revision: 27909
URL: http://svn.gna.org/viewcvs/wesnoth?rev=27909&view=rev
Log:
Write in the pango render engine for the new widget library.
Also enabled it for scons, cmake still needs to be done.
Added:
trunk/src/text.cpp (with props)
trunk/src/text.hpp (with props)
Modified:
trunk/SConstruct
trunk/po/wesnoth-lib/POTFILES.in
trunk/src/CMakeLists.txt
trunk/src/Makefile.am
trunk/src/SConscript
trunk/src/gui/widgets/canvas.cpp
Modified: trunk/SConstruct
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/SConstruct?rev=27909&r1=27908&r2=27909&view=diff
==============================================================================
--- trunk/SConstruct (original)
+++ trunk/SConstruct Fri Jul 11 18:53:20 2008
@@ -191,8 +191,8 @@
conf.CheckCHeader("libintl.h", "<>") and \
conf.CheckSDL(require_version = '1.2.7') or Die("Base prerequisites are
not met.")
-# conf.CheckPango("cairo") and \
have_client_prereqs = \
+ conf.CheckPango("cairo") and \
conf.CheckBoost("regex") and \
conf.CheckSDL("SDL_ttf", require_version = "2.0.8") and \
conf.CheckSDL("SDL_mixer", require_version = '1.2.0') and \
Modified: trunk/po/wesnoth-lib/POTFILES.in
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/po/wesnoth-lib/POTFILES.in?rev=27909&r1=27908&r2=27909&view=diff
==============================================================================
--- trunk/po/wesnoth-lib/POTFILES.in (original)
+++ trunk/po/wesnoth-lib/POTFILES.in Fri Jul 11 18:53:20 2008
@@ -39,6 +39,7 @@
src/preferences.cpp
src/preferences_display.cpp
src/show_dialog.cpp
+src/text.cpp
src/terrain_filter.cpp
src/terrain_translation.cpp
src/widgets/button.cpp
Modified: trunk/src/CMakeLists.txt
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/CMakeLists.txt?rev=27909&r1=27908&r2=27909&view=diff
==============================================================================
--- trunk/src/CMakeLists.txt (original)
+++ trunk/src/CMakeLists.txt Fri Jul 11 18:53:20 2008
@@ -164,6 +164,7 @@
soundsource.cpp
terrain.cpp
terrain_translation.cpp
+ text.cpp
time_of_day.cpp
video.cpp
theme.cpp
Modified: trunk/src/Makefile.am
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/Makefile.am?rev=27909&r1=27908&r2=27909&view=diff
==============================================================================
--- trunk/src/Makefile.am (original)
+++ trunk/src/Makefile.am Fri Jul 11 18:53:20 2008
@@ -127,6 +127,7 @@
statistics_dialog.cpp \
team.cpp \
terrain_filter.cpp \
+ text.cpp \
time_of_day.cpp \
titlescreen.cpp \
tooltips.cpp \
Modified: trunk/src/SConscript
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/SConscript?rev=27909&r1=27908&r2=27909&view=diff
==============================================================================
--- trunk/src/SConscript (original)
+++ trunk/src/SConscript Fri Jul 11 18:53:20 2008
@@ -83,6 +83,7 @@
soundsource.cpp
terrain.cpp
terrain_translation.cpp
+ text.cpp
time_of_day.cpp
tooltips.cpp
video.cpp
Modified: trunk/src/gui/widgets/canvas.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/widgets/canvas.cpp?rev=27909&r1=27908&r2=27909&view=diff
==============================================================================
--- trunk/src/gui/widgets/canvas.cpp (original)
+++ trunk/src/gui/widgets/canvas.cpp Fri Jul 11 18:53:20 2008
@@ -20,13 +20,13 @@
#include "gui/widgets/canvas.hpp"
#include "config.hpp"
-#include "font.hpp"
#include "image.hpp"
#include "gettext.hpp"
#include "gui/widgets/formula.hpp"
#include "gui/widgets/helper.hpp"
#include "log.hpp"
#include "serialization/parser.hpp"
+#include "../../text.hpp"
#include "variant.hpp"
#include "wml_exception.hpp"
@@ -766,18 +766,21 @@
return;
}
- SDL_Color col = { (colour_ >> 24), (colour_ >> 16), (colour_ >> 8),
colour_ };
- surface surf(font::get_rendered_text(text, font_size_, col,
font_style_));
- assert(surf);
+ static font::ttext text_renderer;
+
+ text_renderer.set_text(text, false).
+ set_font_size(font_size_).
+ set_foreground_colour(colour_);
+ surface surf = text_renderer.render();
game_logic::map_formula_callable local_variables(variables);
local_variables.add("text_width", variant(surf->w));
local_variables.add("text_height", variant(surf->h));
-
//@todo formulas are now recalculated every draw cycle which is a
// bit silly unless there has been a resize. So to optimize we should
// use an extra flag or do the calculation in a separate routine.
+
const unsigned x = x_(local_variables);
const unsigned y = y_(local_variables);
const unsigned w = w_(local_variables);
Added: trunk/src/text.cpp
URL: http://svn.gna.org/viewcvs/wesnoth/trunk/src/text.cpp?rev=27909&view=auto
==============================================================================
--- trunk/src/text.cpp (added)
+++ trunk/src/text.cpp Fri Jul 11 18:53:20 2008
@@ -1,0 +1,162 @@
+/* $Id$ */
+/*
+ Copyright (C) 2003 - 2008 by David White <[EMAIL PROTECTED]>
+ Part of the Battle for Wesnoth Project http://www.wesnoth.org/
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2
+ or at your option any later version.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY.
+
+ See the COPYING file for more details.
+*/
+
+#include "text.hpp"
+
+#include "font.hpp"
+#include "language.hpp"
+
+#include <cassert>
+
+#include <cairo/cairo.h>
+
+namespace font {
+
+ttext::ttext() :
+
font_map_(reinterpret_cast<PangoCairoFontMap*>(pango_cairo_font_map_new())),
+ context_(pango_cairo_font_map_create_context(font_map_)),
+ layout_(pango_layout_new(context_)),
+ surface_(),
+ text_(),
+ markedup_text_(false),
+ font_size_(14),
+ foreground_colour_(0xFFFFFFFF), // solid white
+ dirty_(true),
+ surface_buffer_(NULL)
+{
+ // With 72 dpi the sizes are the same as with SDL_TTF so hardcoded.
+ pango_cairo_context_set_resolution(context_, 72.0);
+}
+
+ttext::~ttext()
+{
+ if(font_map_) {
+ g_object_unref(font_map_);
+ }
+ if(context_) {
+ g_object_unref(context_);
+ }
+ if(layout_) {
+ g_object_unref(layout_);
+ }
+ if(surface_buffer_) {
+ surface_.assign(NULL);
+ delete[] surface_buffer_;
+ }
+}
+
+surface ttext::render()
+{
+ if(dirty_) {
+ dirty_ = false;
+
+ /**
+ * @todo FIXME the font needs to be an object.
+ */
+ PangoFontDescription *font = pango_font_description_new();
+ pango_font_description_set_family(font, get_fonts().c_str());
+ pango_font_description_set_size(font, font_size_ * PANGO_SCALE);
+ pango_layout_set_font_description(layout_, font);
+ pango_font_description_free(font);
+
+ if(markedup_text_) {
+ pango_layout_set_markup(layout_, text_.c_str(),
text_.size());
+ } else {
+ pango_layout_set_text(layout_, text_.c_str(),
text_.size());
+ }
+
+ PangoRectangle rect;
+ pango_layout_get_pixel_extents(layout_, NULL, &rect);
+
+ const unsigned stride = rect.width * 4;
+ create_surface_buffer(stride * rect.height);
+
+ cairo_surface_t *cairo_surface =
+ cairo_image_surface_create_for_data(surface_buffer_,
+ CAIRO_FORMAT_ARGB32, rect.width, rect.height,
stride);
+ cairo_t *cr = cairo_create(cairo_surface);
+
+ pango_cairo_update_context (cr, context_); // Needed?
+
+ /* paint background */
+// cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
+// cairo_paint(cr);
+
+ /* set colour (used for foreground). */
+ cairo_set_source_rgba(cr,
+ (foreground_colour_ >> 24) / 256.0,
+ ((foreground_colour_ >> 16) & 0xFF) / 256.0,
+ ((foreground_colour_ >> 8) & 0xFF) / 256.0,
+ (foreground_colour_ & 0xFF) / 256.0);
+
+ pango_cairo_show_layout(cr, layout_);
+
+ // Draw twice otherwise we have some problems due to
transparency
+ // we overcome the problem with drawing twice which is a kind
of hack.
+ pango_cairo_show_layout(cr, layout_);
+
+ surface_.assign(SDL_CreateRGBSurfaceFrom(
+ surface_buffer_, rect.width, rect.height, 32, stride,
+ 0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000));
+
+ }
+
+ return surface_;
+}
+
+ttext& ttext::set_text(const t_string& text, const bool markedup)
+{
+ if(markedup != markedup_text_ || text != text_) {
+ text_ = text;
+ markedup_text_ = markedup;
+ dirty_ = true;
+ }
+
+ return *this;
+}
+
+ttext& ttext::set_font_size(const unsigned font_size)
+{
+ if(font_size != font_size_) {
+ font_size_ = font_size;
+ dirty_ = true;
+ }
+
+ return *this;
+}
+
+ttext& ttext::set_foreground_colour(const Uint32 colour)
+{
+ if(colour != foreground_colour_) {
+ foreground_colour_ = colour;
+ dirty_ = true;
+ }
+
+ return *this;
+}
+
+void ttext::create_surface_buffer(const size_t size)
+{
+ // clear old buffer
+ if(surface_buffer_) {
+ surface_.assign(NULL);
+ delete[] surface_buffer_;
+ }
+
+ surface_buffer_ = new unsigned char [size];
+ memset(surface_buffer_, 0, size);
+}
+
+} // namespace font
+
Propchange: trunk/src/text.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: trunk/src/text.cpp
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Added: trunk/src/text.hpp
URL: http://svn.gna.org/viewcvs/wesnoth/trunk/src/text.hpp?rev=27909&view=auto
==============================================================================
--- trunk/src/text.hpp (added)
+++ trunk/src/text.hpp Fri Jul 11 18:53:20 2008
@@ -1,0 +1,109 @@
+/* $Id$ */
+/*
+ Copyright (C) 2003 - 2008 by David White <[EMAIL PROTECTED]>
+ Part of the Battle for Wesnoth Project http://www.wesnoth.org/
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License version 2
+ or at your option any later version.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY.
+
+ See the COPYING file for more details.
+*/
+
+#ifndef TEXT_HPP_INCLUDED
+#define TEXT_HPP_INCLUDED
+
+#include "sdl_utils.hpp"
+#include "tstring.hpp"
+
+#include <pango/pango.h>
+#include <pango/pangocairo.h>
+
+class language_def;
+
+namespace font {
+
+// add background colour and also font markup.
+
+/**
+ * Text class .
+ *
+ * This class stores the text to draw and uses pango with the cairo backend to
+ * render the text. See http://pango.org for more info.
+ */
+class ttext {
+public:
+
+ ttext();
+
+ ~ttext();
+
+ /**
+ * Returns the rendered text.
+ *
+ * Before rendering it tests whether a redraw is needed and if so it
first
+ * redraws the surface before returning it.
+ */
+ surface render();
+
+ /***** ***** ***** ***** Setters ***** ***** ***** *****/
+
+ ttext& set_text(const t_string& text, const bool markedup);
+
+ ttext& set_font_size(const unsigned font_size);
+
+ ttext& set_foreground_colour(const Uint32 colour);
+
+private:
+
+ /***** ***** ***** ***** Pango variables ***** ***** ***** *****/
+ PangoCairoFontMap* font_map_;
+ PangoContext* context_;
+ PangoLayout* layout_;
+
+ /** The surface to render upon used as a cache. */
+ mutable surface surface_;
+
+ /** The text to draw. */
+ t_string text_;
+
+ /** Is the text markedup if so the markedup render routines need to be
used. */
+ bool markedup_text_;
+
+ /** The font size to draw. */
+ unsigned font_size_;
+
+ /** The foreground colour. */
+ Uint32 foreground_colour_;
+
+ /**
+ * When the text is rendered it's cached so we need to know the dirty
+ * status of the surface.
+ */
+ bool dirty_;
+
+ /**
+ * Buffer to store the image on.
+ *
+ * We use a cairo surface to draw on this buffer and then use the
buffer as
+ * data source for the SDL_Surface. This means the buffer needs to be
stored
+ * in the object.
+ */
+ unsigned char* surface_buffer_;
+
+ /**
+ * Creates a new buffer.
+ *
+ * If needed frees the other surface and then creates a new buffer and
+ * initializes the entire buffer with values 0.
+ *
+ * @param size The required size of the buffer.
+ */
+ void create_surface_buffer(const size_t size);
+};
+
+} // namespace font
+
+#endif
Propchange: trunk/src/text.hpp
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: trunk/src/text.hpp
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits