|
|
|
|
#include "DiabloUI/text_draw.h"
|
|
|
|
|
|
|
|
|
|
#include "DiabloUI/art_draw.h"
|
|
|
|
|
#include "DiabloUI/diabloui.h"
|
|
|
|
|
#include "DiabloUI/fonts.h"
|
|
|
|
|
#include "DiabloUI/ttf_render_wrapped.h"
|
|
|
|
|
#include "DiabloUI/ui_item.h"
|
|
|
|
|
#include "utils/display.h"
|
|
|
|
|
|
|
|
|
|
namespace devilution {
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
|
|
|
|
|
TextAlignment XAlignmentFromFlags(UiFlags flags)
|
|
|
|
|
{
|
|
|
|
|
if (HasAnyOf(flags, UiFlags::AlignCenter))
|
|
|
|
|
return TextAlignment_CENTER;
|
|
|
|
|
if (HasAnyOf(flags, UiFlags::AlignRight))
|
|
|
|
|
return TextAlignment_END;
|
|
|
|
|
return TextAlignment_BEGIN;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int AlignXOffset(UiFlags flags, const SDL_Rect &dest, int w)
|
|
|
|
|
{
|
|
|
|
|
if (HasAnyOf(flags, UiFlags::AlignCenter))
|
|
|
|
|
return (dest.w - w) / 2;
|
|
|
|
|
if (HasAnyOf(flags, UiFlags::AlignRight))
|
|
|
|
|
return dest.w - w;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
void DrawTTF(const char *text, const SDL_Rect &rectIn, UiFlags flags,
|
|
|
|
|
const SDL_Color &textColor, const SDL_Color &shadowColor,
|
|
|
|
|
TtfSurfaceCache &renderCache)
|
|
|
|
|
{
|
|
|
|
|
SDL_Rect rect(rectIn);
|
|
|
|
|
if (font == nullptr || text == nullptr || *text == '\0')
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
const auto xAlign = XAlignmentFromFlags(flags);
|
|
|
|
|
if (renderCache.text == nullptr)
|
|
|
|
|
renderCache.text = ScaleSurfaceToOutput(RenderUTF8_Solid_Wrapped(font, text, textColor, rect.w, xAlign));
|
|
|
|
|
if (renderCache.shadow == nullptr)
|
|
|
|
|
renderCache.shadow = ScaleSurfaceToOutput(RenderUTF8_Solid_Wrapped(font, text, shadowColor, rect.w, xAlign));
|
|
|
|
|
|
|
|
|
|
SDL_Surface *textSurface = renderCache.text.get();
|
|
|
|
|
SDL_Surface *shadowSurface = renderCache.shadow.get();
|
|
|
|
|
if (textSurface == nullptr)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
SDL_Rect destRect = rect;
|
|
|
|
|
ScaleOutputRect(&destRect);
|
|
|
|
|
destRect.x += AlignXOffset(flags, destRect, textSurface->w);
|
|
|
|
|
destRect.y += HasAnyOf(flags, UiFlags::VerticalCenter) ? (destRect.h - textSurface->h) / 2 : 0;
|
|
|
|
|
|
|
|
|
|
SDL_Rect shadowRect = destRect;
|
|
|
|
|
++shadowRect.x;
|
|
|
|
|
++shadowRect.y;
|
|
|
|
|
if (SDL_BlitSurface(shadowSurface, nullptr, DiabloUiSurface(), &shadowRect) < 0)
|
|
|
|
|
ErrSdl();
|
|
|
|
|
if (SDL_BlitSurface(textSurface, nullptr, DiabloUiSurface(), &destRect) < 0)
|
|
|
|
|
ErrSdl();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace devilution
|