[Scummvm-git-logs] scummvm master -> 1fc7c622bcafee1a3ebf13f27a3177bddb5773b6
OMGPizzaGuy
noreply at scummvm.org
Wed Jan 10 23:22:45 UTC 2024
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
1fc7c622bc ULTIMA8: Interpret book page breaks correctly
Commit: 1fc7c622bcafee1a3ebf13f27a3177bddb5773b6
https://github.com/scummvm/scummvm/commit/1fc7c622bcafee1a3ebf13f27a3177bddb5773b6
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2024-01-10T17:22:41-06:00
Commit Message:
ULTIMA8: Interpret book page breaks correctly
Now interpreting page breaks in scrolls and books. Verified the behaviour
of those two gumps in dosbox. Also verified that plaques treat '*' as a
linebreak.
Fixes #14833.
Changed paths:
engines/ultima/ultima8/graphics/fonts/font.cpp
engines/ultima/ultima8/graphics/fonts/font.h
engines/ultima/ultima8/graphics/fonts/jp_font.cpp
engines/ultima/ultima8/graphics/fonts/jp_font.h
engines/ultima/ultima8/graphics/fonts/shape_font.cpp
engines/ultima/ultima8/graphics/fonts/shape_font.h
engines/ultima/ultima8/graphics/fonts/tt_font.cpp
engines/ultima/ultima8/graphics/fonts/tt_font.h
engines/ultima/ultima8/gumps/book_gump.cpp
engines/ultima/ultima8/gumps/scroll_gump.cpp
engines/ultima/ultima8/gumps/widgets/edit_widget.cpp
engines/ultima/ultima8/gumps/widgets/text_widget.cpp
engines/ultima/ultima8/gumps/widgets/text_widget.h
diff --git a/engines/ultima/ultima8/graphics/fonts/font.cpp b/engines/ultima/ultima8/graphics/fonts/font.cpp
index e7fd531831a..3138e9087ef 100644
--- a/engines/ultima/ultima8/graphics/fonts/font.cpp
+++ b/engines/ultima/ultima8/graphics/fonts/font.cpp
@@ -39,10 +39,10 @@ void Font::getTextSize(const Std::string &text,
int32 &resultwidth, int32 &resultheight,
unsigned int &remaining,
int32 width, int32 height, TextAlign align,
- bool u8specials) {
+ bool u8specials, bool pagebreaks) {
Std::list<PositionedText> tmp;
tmp = typesetText<Traits>(this, text, remaining,
- width, height, align, u8specials,
+ width, height, align, u8specials, pagebreaks,
resultwidth, resultheight);
}
@@ -180,7 +180,7 @@ CHECKME: any others? (page breaks for books?)
template<class T>
Std::list<PositionedText> typesetText(Font *font,
const Std::string &text, unsigned int &remaining, int32 width, int32 height,
- Font::TextAlign align, bool u8specials, int32 &resultwidth,
+ Font::TextAlign align, bool u8specials, bool pagebreaks, int32 &resultwidth,
int32 &resultheight, Std::string::size_type cursor) {
debugC(kDebugGraphics, "typeset (%d, %d) %s", width, height, text.c_str());
@@ -205,6 +205,7 @@ Std::list<PositionedText> typesetText(Font *font,
while (true) {
if (iter == text.end() || breakhere || T::isBreak(iter, u8specials)) {
// break here
+ bool atpagebreak = pagebreaks && T::isPageBreak(iter, u8specials);
int32 stringwidth = 0, stringheight = 0;
font->getStringSize(curline, stringwidth, stringheight);
line._dims.left = 0;
@@ -239,7 +240,7 @@ Std::list<PositionedText> typesetText(Font *font,
curlinestart = iter;
}
- if (height != 0 && totalheight + font->getHeight() > height) {
+ if (atpagebreak || (height != 0 && totalheight + font->getHeight() > height)) {
// next line won't fit
remaining = curlinestart - text.begin();
break;
@@ -366,14 +367,14 @@ template
Std::list<PositionedText> typesetText<Font::Traits>
(Font *font, const Std::string &text,
unsigned int &remaining, int32 width, int32 height,
- Font::TextAlign align, bool u8specials,
+ Font::TextAlign align, bool u8specials, bool pagebreaks,
int32 &resultwidth, int32 &resultheight, Std::string::size_type cursor);
template
Std::list<PositionedText> typesetText<Font::SJISTraits>
(Font *font, const Std::string &text,
unsigned int &remaining, int32 width, int32 height,
- Font::TextAlign align, bool u8specials,
+ Font::TextAlign align, bool u8specials, bool pagebreaks,
int32 &resultwidth, int32 &resultheight, Std::string::size_type cursor);
} // End of namespace Ultima8
diff --git a/engines/ultima/ultima8/graphics/fonts/font.h b/engines/ultima/ultima8/graphics/fonts/font.h
index e098ad5d0b0..3d4521938a8 100644
--- a/engines/ultima/ultima8/graphics/fonts/font.h
+++ b/engines/ultima/ultima8/graphics/fonts/font.h
@@ -72,10 +72,12 @@ public:
//! \param height The height of the target rectangle, or 0 for unlimited
//! \param align Alignment of the text (left, right, center)
//! \param u8specials If true, interpret the special characters U8 uses
+ //! \param pagebreaks If true (and u8specials too), stop at U8 pagebreaks
//! \return the rendered text in a RenderedText object
virtual RenderedText *renderText(const Std::string &text,
unsigned int &remaining, int32 width = 0, int32 height = 0,
TextAlign align = TEXT_LEFT, bool u8specials = false,
+ bool pagebreaks = false,
Std::string::size_type cursor = Std::string::npos) = 0;
//! get the dimensions of a rendered string
@@ -85,12 +87,13 @@ public:
//! \param remaining Returns index of the first character not printed
//! \param width The width of the target rectangle, or 0 for unlimited
//! \param height The height of the target rectangle, or 0 for unlimited
- //! \param u8specials If true, interpret the special characters U8 uses
//! \param align Alignment of the text (left, right, center)
+ //! \param u8specials If true, interpret the special characters U8 uses
+ //! \param pagebreaks If true (and u8specials too), stop at U8 pagebreaks
virtual void getTextSize(const Std::string &text,
int32 &resultwidth, int32 &resultheight, unsigned int &remaining,
int32 width = 0, int32 height = 0, TextAlign align = TEXT_LEFT,
- bool u8specials = false);
+ bool u8specials = false, bool pagebreaks = false);
void setHighRes(bool hr) {
_highRes = hr;
@@ -120,6 +123,10 @@ protected:
return (c == '\n' ||
(u8specials && (c == '\n' || c == '~' || c == '*')));
}
+ static bool isPageBreak(Std::string::const_iterator &i, bool u8specials) {
+ char c = *i;
+ return (u8specials && c == '*');
+ }
static bool canBreakAfter(Std::string::const_iterator &i);
static void advance(Std::string::const_iterator &i) {
++i;
@@ -164,7 +171,8 @@ template<class T>
Std::list<PositionedText> typesetText(Font *font,
const Std::string &text, unsigned int &remaining,
int32 width, int32 height, Font::TextAlign align,
- bool u8specials, int32 &resultwidth, int32 &resultheight,
+ bool u8specials, bool pagebreaks,
+ int32 &resultwidth, int32 &resultheight,
Std::string::size_type cursor = Std::string::npos);
} // End of namespace Ultima8
diff --git a/engines/ultima/ultima8/graphics/fonts/jp_font.cpp b/engines/ultima/ultima8/graphics/fonts/jp_font.cpp
index 3bf4d179abe..be935800c85 100644
--- a/engines/ultima/ultima8/graphics/fonts/jp_font.cpp
+++ b/engines/ultima/ultima8/graphics/fonts/jp_font.cpp
@@ -78,22 +78,22 @@ void JPFont::getTextSize(const Std::string &text,
int32 &resultwidth, int32 &resultheight,
unsigned int &remaining,
int32 width, int32 height, TextAlign align,
- bool u8specials) {
+ bool u8specials, bool pagebreaks) {
Std::list<PositionedText> tmp;
tmp = typesetText<SJISTraits>(this, text, remaining,
- width, height, align, u8specials,
+ width, height, align, u8specials, pagebreaks,
resultwidth, resultheight);
}
RenderedText *JPFont::renderText(const Std::string &text,
unsigned int &remaining,
int32 width, int32 height, TextAlign align,
- bool u8specials,
+ bool u8specials, bool pagebreaks,
Std::string::size_type cursor) {
int32 resultwidth, resultheight;
Std::list<PositionedText> lines;
lines = typesetText<SJISTraits>(this, text, remaining,
- width, height, align, u8specials,
+ width, height, align, u8specials, pagebreaks,
resultwidth, resultheight,
cursor);
diff --git a/engines/ultima/ultima8/graphics/fonts/jp_font.h b/engines/ultima/ultima8/graphics/fonts/jp_font.h
index 8bdcfa01b44..161e79f2cb8 100644
--- a/engines/ultima/ultima8/graphics/fonts/jp_font.h
+++ b/engines/ultima/ultima8/graphics/fonts/jp_font.h
@@ -44,11 +44,13 @@ public:
int32 &width, int32 &height) override;
void getTextSize(const Std::string &text, int32 &resultwidth,
int32 &resultheight, unsigned int &remaining, int32 width = 0,
- int32 height = 0, TextAlign align = TEXT_LEFT, bool u8specials = false) override;
+ int32 height = 0, TextAlign align = TEXT_LEFT,
+ bool u8specials = false, bool pagebreaks = false) override;
RenderedText *renderText(const Std::string &text,
unsigned int &remaining, int32 width = 0, int32 height = 0,
TextAlign align = TEXT_LEFT, bool u8specials = false,
+ bool pagebreaks = false,
Std::string::size_type cursor = Std::string::npos) override;
protected:
diff --git a/engines/ultima/ultima8/graphics/fonts/shape_font.cpp b/engines/ultima/ultima8/graphics/fonts/shape_font.cpp
index 6ad278e353c..5cc8377a95b 100644
--- a/engines/ultima/ultima8/graphics/fonts/shape_font.cpp
+++ b/engines/ultima/ultima8/graphics/fonts/shape_font.cpp
@@ -121,12 +121,12 @@ int ShapeFont::charToFrameNum(char c) const {
RenderedText *ShapeFont::renderText(const Std::string &text,
unsigned int &remaining,
int32 width, int32 height, TextAlign align,
- bool u8specials,
+ bool u8specials, bool pagebreaks,
Std::string::size_type cursor) {
int32 resultwidth, resultheight;
Std::list<PositionedText> lines;
lines = typesetText<Traits>(this, text, remaining,
- width, height, align, u8specials,
+ width, height, align, u8specials, pagebreaks,
resultwidth, resultheight, cursor);
return new ShapeRenderedText(lines, resultwidth, resultheight,
diff --git a/engines/ultima/ultima8/graphics/fonts/shape_font.h b/engines/ultima/ultima8/graphics/fonts/shape_font.h
index 7b2c062a71e..462edce56e9 100644
--- a/engines/ultima/ultima8/graphics/fonts/shape_font.h
+++ b/engines/ultima/ultima8/graphics/fonts/shape_font.h
@@ -67,6 +67,7 @@ public:
RenderedText *renderText(const Std::string &text,
unsigned int &remaining, int32 width = 0, int32 height = 0,
TextAlign align = TEXT_LEFT, bool u8specials = false,
+ bool pagebreaks = false,
Std::string::size_type cursor = Std::string::npos) override;
};
diff --git a/engines/ultima/ultima8/graphics/fonts/tt_font.cpp b/engines/ultima/ultima8/graphics/fonts/tt_font.cpp
index 2a13f1a897a..f2d33003a4a 100644
--- a/engines/ultima/ultima8/graphics/fonts/tt_font.cpp
+++ b/engines/ultima/ultima8/graphics/fonts/tt_font.cpp
@@ -105,15 +105,15 @@ void TTFont::getTextSize(const Std::string &text,
int32 &resultWidth, int32 &resultHeight,
unsigned int &remaining,
int32 width, int32 height, TextAlign align,
- bool u8specials) {
+ bool u8specials, bool pagebreaks) {
Std::list<PositionedText> tmp;
if (!_SJIS)
tmp = typesetText<Traits>(this, text, remaining,
- width, height, align, u8specials,
+ width, height, align, u8specials, pagebreaks,
resultWidth, resultHeight);
else
tmp = typesetText<SJISTraits>(this, text, remaining,
- width, height, align, u8specials,
+ width, height, align, u8specials, pagebreaks,
resultWidth, resultHeight);
}
@@ -189,15 +189,15 @@ void TTFont::addTextBorder(Graphics::ManagedSurface &textSurf, uint32 *texBuf, c
}
RenderedText *TTFont::renderText(const Std::string &text, unsigned int &remaining,
- int32 width, int32 height, TextAlign align, bool u8specials,
+ int32 width, int32 height, TextAlign align, bool u8specials, bool pagebreaks,
Std::string::size_type cursor) {
int32 resultWidth, resultHeight, lineHeight;
Std::list<PositionedText> lines;
if (!_SJIS)
- lines = typesetText<Traits>(this, text, remaining, width, height, align, u8specials,
+ lines = typesetText<Traits>(this, text, remaining, width, height, align, u8specials, pagebreaks,
resultWidth, resultHeight, cursor);
else
- lines = typesetText<SJISTraits>(this, text, remaining, width, height, align, u8specials,
+ lines = typesetText<SJISTraits>(this, text, remaining, width, height, align, u8specials, pagebreaks,
resultWidth, resultHeight, cursor);
lineHeight = _ttfFont->getFontHeight();
diff --git a/engines/ultima/ultima8/graphics/fonts/tt_font.h b/engines/ultima/ultima8/graphics/fonts/tt_font.h
index 0d48eeb1138..fca321d8a26 100644
--- a/engines/ultima/ultima8/graphics/fonts/tt_font.h
+++ b/engines/ultima/ultima8/graphics/fonts/tt_font.h
@@ -49,11 +49,12 @@ public:
void getTextSize(const Std::string &text,
int32 &resultwidth, int32 &resultheight, unsigned int &remaining,
int32 width = 0, int32 height = 0, TextAlign align = TEXT_LEFT,
- bool u8specials = false) override;
+ bool u8specials = false, bool pagebreaks = false) override;
RenderedText *renderText(const Std::string &text,
unsigned int &remaining, int32 width = 0, int32 height = 0,
TextAlign align = TEXT_LEFT, bool u8specials = false,
+ bool pagebreaks = false,
Std::string::size_type cursor = Std::string::npos) override;
protected:
diff --git a/engines/ultima/ultima8/gumps/book_gump.cpp b/engines/ultima/ultima8/gumps/book_gump.cpp
index 1e9cc1da819..88fd5f04701 100644
--- a/engines/ultima/ultima8/gumps/book_gump.cpp
+++ b/engines/ultima/ultima8/gumps/book_gump.cpp
@@ -66,11 +66,11 @@ void BookGump::InitGump(Gump *newparent, bool take_focus) {
}
// Create the TextWidgets (NOTE: they _must_ have exactly the same _dims)
- TextWidget *widget = new TextWidget(9, 5, _text, true, 9, 123, 129); //!! constants
+ TextWidget *widget = new TextWidget(9, 5, _text, true, 9, 123, 129, Font::TEXT_LEFT, true); //!! constants
widget->InitGump(this);
_textWidgetL = widget->getObjId();
- widget = new TextWidget(150, 5, _text, true, 9, 123, 129); //!! constants
+ widget = new TextWidget(150, 5, _text, true, 9, 123, 129, Font::TEXT_LEFT, true); //!! constants
widget->InitGump(this);
_textWidgetR = widget->getObjId();
widget->setupNextText();
diff --git a/engines/ultima/ultima8/gumps/scroll_gump.cpp b/engines/ultima/ultima8/gumps/scroll_gump.cpp
index 2afb4efc9a6..0b6a56af6b2 100644
--- a/engines/ultima/ultima8/gumps/scroll_gump.cpp
+++ b/engines/ultima/ultima8/gumps/scroll_gump.cpp
@@ -52,7 +52,7 @@ void ScrollGump::InitGump(Gump *newparent, bool take_focus) {
ModalGump::InitGump(newparent, take_focus);
// Create the TextWidget
- Gump *widget = new TextWidget(22, 29, _text, true, 9, 204, 115); //!! constants
+ Gump *widget = new TextWidget(22, 29, _text, true, 9, 204, 115, Font::TEXT_LEFT, true); //!! constants
widget->InitGump(this);
_textWidget = widget->getObjId();
diff --git a/engines/ultima/ultima8/gumps/widgets/edit_widget.cpp b/engines/ultima/ultima8/gumps/widgets/edit_widget.cpp
index ffb95687179..c04d7b97d6f 100644
--- a/engines/ultima/ultima8/gumps/widgets/edit_widget.cpp
+++ b/engines/ultima/ultima8/gumps/widgets/edit_widget.cpp
@@ -147,7 +147,8 @@ void EditWidget::renderText() {
_cachedText = font->renderText(_text, remaining,
max_width, max_height,
Font::TEXT_LEFT,
- false, cv ? _cursor : Std::string::npos);
+ false, false,
+ cv ? _cursor : Std::string::npos);
// Trim text to fit
if (remaining < _text.length()) {
diff --git a/engines/ultima/ultima8/gumps/widgets/text_widget.cpp b/engines/ultima/ultima8/gumps/widgets/text_widget.cpp
index 53c853ee984..2dbf945ff9f 100644
--- a/engines/ultima/ultima8/gumps/widgets/text_widget.cpp
+++ b/engines/ultima/ultima8/gumps/widgets/text_widget.cpp
@@ -38,10 +38,11 @@ TextWidget::TextWidget() : Gump(), _gameFont(false), _fontNum(0), _blendColour(0
}
TextWidget::TextWidget(int x, int y, const Std::string &txt, bool gamefont, int font,
- int w, int h, Font::TextAlign align) :
+ int w, int h, Font::TextAlign align, bool dopaging) :
Gump(x, y, w, h), _text(txt), _gameFont(gamefont), _fontNum(font),
_blendColour(0), _currentStart(0), _currentEnd(0), _tx(0), _ty(0),
- _targetWidth(w), _targetHeight(h), _cachedText(nullptr), _textAlign(align) {
+ _doPaging(dopaging), _targetWidth(w), _targetHeight(h),
+ _cachedText(nullptr), _textAlign(align) {
}
TextWidget::~TextWidget(void) {
@@ -110,7 +111,7 @@ bool TextWidget::setupNextText() {
unsigned int remaining;
font->getTextSize(_text.substr(_currentStart), _tx, _ty, remaining,
- _targetWidth, _targetHeight, _textAlign, true);
+ _targetWidth, _targetHeight, _textAlign, true, _doPaging);
_dims.top = -font->getBaseline();
@@ -153,7 +154,7 @@ void TextWidget::renderText() {
_cachedText = font->renderText(_text.substr(_currentStart,
_currentEnd - _currentStart),
remaining, _targetWidth, _targetHeight,
- _textAlign, true);
+ _textAlign, true, _doPaging);
}
}
@@ -248,7 +249,7 @@ bool TextWidget::loadData(Common::ReadStream *rs, uint32 version) {
int32 tx, ty;
unsigned int remaining;
font->getTextSize(_text.substr(_currentStart), tx, ty, remaining,
- _targetWidth, _targetHeight, _textAlign, true);
+ _targetWidth, _targetHeight, _textAlign, true, _doPaging);
// Y offset is always baseline
_dims.top = -font->getBaseline();
diff --git a/engines/ultima/ultima8/gumps/widgets/text_widget.h b/engines/ultima/ultima8/gumps/widgets/text_widget.h
index 0f7bf2dc0f1..f4b479d54a5 100644
--- a/engines/ultima/ultima8/gumps/widgets/text_widget.h
+++ b/engines/ultima/ultima8/gumps/widgets/text_widget.h
@@ -42,6 +42,7 @@ protected:
int _fontNum;
uint32 _blendColour;
int32 _tx, _ty;
+ bool _doPaging;
unsigned int _currentStart; //!< start of currently displaying text
unsigned int _currentEnd; //!< start of remaining text
@@ -56,7 +57,8 @@ public:
TextWidget();
TextWidget(int x, int y, const Std::string &txt, bool gamefont, int fontnum,
int width = 0, int height = 0,
- Font::TextAlign align = Font::TEXT_LEFT);
+ Font::TextAlign align = Font::TEXT_LEFT,
+ bool dopaging = false);
~TextWidget() override;
// Init the gump, call after construction
More information about the Scummvm-git-logs
mailing list