src/Text.cpp in gosu-1.3.0 vs src/Text.cpp in gosu-1.4.0

- old
+ new

@@ -1,112 +1,112 @@ +#include <Gosu/Text.hpp> #include "GraphicsImpl.hpp" #include "MarkupParser.hpp" #include "TextBuilder.hpp" #include "TrueTypeFont.hpp" -#include <Gosu/Text.hpp> #include <algorithm> #include <cmath> #include <stdexcept> #include <vector> -double Gosu::text_width(const std::u32string& text, +double Gosu::text_width(const std::u32string& text, // const std::string& font_name, double font_height, unsigned font_flags) { - if (font_height <= 0) throw std::invalid_argument{"font_height must be > 0"}; + if (font_height <= 0) throw std::invalid_argument{"font_height must be > 0"}; if (font_flags >= FF_COMBINATIONS) throw std::invalid_argument{"Invalid font_flags"}; TrueTypeFont& font = font_by_name(font_name, font_flags); return font.draw_text(text, font_height, nullptr, 0, 0, Gosu::Color::NONE); } double Gosu::draw_text(Bitmap& bitmap, double x, double y, Color c, const std::u32string& text, const std::string& font_name, double font_height, unsigned font_flags) { - if (font_height <= 0) throw std::invalid_argument("font_height must be > 0"); + if (font_height <= 0) throw std::invalid_argument("font_height must be > 0"); if (font_flags >= FF_COMBINATIONS) throw std::invalid_argument("Invalid font_flags"); TrueTypeFont& font = font_by_name(font_name, font_flags); return font.draw_text(text, font_height, &bitmap, x, y, c); } -Gosu::Bitmap Gosu::layout_text(const std::string& text, const std::string& font_name, - double font_height, double line_spacing, - int width, Alignment align, unsigned font_flags) +Gosu::Bitmap Gosu::layout_text(const std::string& text, const std::string& font_name, // + double font_height, double line_spacing, int width, // + Alignment align, unsigned font_flags) { // Escape all markup and delegate to layout_markup. - return layout_markup(escape_markup(text), font_name, - font_height, line_spacing, - width, align, font_flags); + return layout_markup(escape_markup(text), font_name, font_height, line_spacing, width, align, + font_flags); } -Gosu::Bitmap Gosu::layout_markup(const std::string& markup, const std::string& font_name, - double font_height, double line_spacing, - int width, Alignment align, unsigned font_flags) +Gosu::Bitmap Gosu::layout_markup(const std::string& markup, const std::string& font_name, // + double font_height, double line_spacing, int width, // + Alignment align, unsigned font_flags) { - if (font_height <= 0) throw std::invalid_argument{"font_height must be > 0"}; - if (line_spacing < -font_height) throw std::invalid_argument{"line_spacing must be ≥ -font_height"}; + if (font_height <= 0) throw std::invalid_argument{"font_height must be > 0"}; + if (line_spacing < -font_height) throw std::invalid_argument{"line_spacing < -font_height"}; if (font_flags >= FF_COMBINATIONS) throw std::invalid_argument{"Invalid font_flags"}; - + if (width >= 0) { TextBuilder text_builder{font_name, static_cast<int>(font_height), static_cast<int>(line_spacing), width, align}; - + // Feed all formatted substrings to the TextBuilder, which will construct the result. // Split the input string into words, because this method implements word-wrapping. MarkupParser parser{font_flags, true, [&text_builder](std::vector<FormattedString> word) { - text_builder.feed_word(move(word)); - }}; + text_builder.feed_word(move(word)); + }}; parser.parse(markup); - - return text_builder.move_into_bitmap(); + + return std::move(text_builder).move_into_bitmap(); } else { std::vector<std::vector<FormattedString>> lines; - + // Split the text into lines (split_words = false) since this method does not wrap lines. MarkupParser parser{font_flags, false, [&lines](std::vector<FormattedString>&& line) { - // Remove trailing \n characters from each line to avoid errors from Gosu::text_width(). - if (!line.back().text.empty() && line.back().text.back() == '\n') { - line.back().text.pop_back(); - } - - lines.emplace_back(line); - }}; + // Remove trailing \n characters from each line to avoid errors from + // Gosu::text_width(). + if (!line.back().text.empty() && line.back().text.back() == '\n') { + line.back().text.pop_back(); + } + + lines.emplace_back(line); + }}; parser.parse(markup); - + if (lines.empty()) return Bitmap(); - + // Measure every part of every line. std::vector<double> line_widths; double max_width = 0; for (auto& line : lines) { line_widths.push_back(0); for (auto& part : line) { line_widths.back() += text_width(part.text, font_name, font_height, part.flags); } max_width = std::max(max_width, line_widths.back()); } - + double height = lines.size() * font_height + (lines.size() - 1.0) * line_spacing; Bitmap result{static_cast<int>(std::ceil(max_width)), static_cast<int>(std::ceil(height))}; - + // Render every part of every line. double y = 0; for (int i = 0; i < lines.size(); ++i) { double x = 0; if (align == AL_CENTER) { x = (result.width() - line_widths[i]) / 2; } else if (align == AL_RIGHT) { x = result.width() - line_widths[i]; } - + for (auto& part : lines[i]) { - x = draw_text(result, x, y, part.color, part.text, - font_name, font_height, part.flags); + x = draw_text(result, x, y, part.color, part.text, font_name, font_height, + part.flags); } y += (font_height + line_spacing); } - + return result; } }