0
0
mirror of https://github.com/obsproject/obs-studio.git synced 2024-09-19 20:32:15 +02:00

obs-text: Fix alignment with extents

This commit is contained in:
Exeldro 2024-02-10 22:38:01 +01:00 committed by Ryan Foster
parent fc9d3a208e
commit 8c9e4c2822

View File

@ -253,6 +253,7 @@ struct TextSource {
uint32_t outline_opacity = 100;
bool use_extents = false;
bool old_extents = false;
bool wrap = false;
uint32_t extents_cx = 0;
uint32_t extents_cy = 0;
@ -264,10 +265,12 @@ struct TextSource {
/* --------------------------- */
inline TextSource(obs_source_t *source_, obs_data_t *settings)
inline TextSource(obs_source_t *source_, obs_data_t *settings,
bool old_extents_)
: source(source_),
hdc(CreateCompatibleDC(nullptr)),
graphics(hdc)
graphics(hdc),
old_extents(old_extents_)
{
obs_source_update(source, settings);
}
@ -338,8 +341,10 @@ void TextSource::UpdateFont()
void TextSource::GetStringFormat(StringFormat &format)
{
UINT flags = StringFormatFlagsNoFitBlackBox |
StringFormatFlagsMeasureTrailingSpaces;
UINT flags = StringFormatFlagsNoFitBlackBox;
if (!use_extents || old_extents)
flags |= StringFormatFlagsMeasureTrailingSpaces;
if (vertical)
flags |= StringFormatFlagsDirectionVertical |
@ -500,6 +505,24 @@ void TextSource::CalculateTextSizes(const StringFormat &format,
if (use_extents) {
text_size.cx = extents_cx;
text_size.cy = extents_cy;
if (!old_extents && !wrap) {
if (align == Align::Center) {
bounding_box.X +=
(extents_cx - bounding_box.Width) / 2;
} else if (align == Align::Right) {
bounding_box.X +=
extents_cx - bounding_box.Width;
}
if (valign == VAlign::Center) {
bounding_box.Y +=
(extents_cy - bounding_box.Height) / 2;
} else if (valign == VAlign::Bottom) {
bounding_box.Y +=
extents_cy - bounding_box.Height;
}
}
}
text_size.cx += text_size.cx % 2;
@ -1117,7 +1140,7 @@ bool obs_module_load(void)
return obs_module_text("TextGDIPlus");
};
si.create = [](obs_data_t *settings, obs_source_t *source) {
return (void *)new TextSource(source, settings);
return (void *)new TextSource(source, settings, true);
};
si.destroy = [](void *data) {
delete reinterpret_cast<TextSource *>(data);
@ -1169,13 +1192,20 @@ bool obs_module_load(void)
obs_source_info si_v2 = si;
si_v2.version = 2;
si_v2.output_flags &= ~OBS_SOURCE_CAP_OBSOLETE;
si_v2.get_defaults = [](obs_data_t *settings) {
defaults(settings, 2);
};
obs_source_info si_v3 = si_v2;
si_v3.version = 3;
si_v3.output_flags &= ~OBS_SOURCE_CAP_OBSOLETE;
si_v3.create = [](obs_data_t *settings, obs_source_t *source) {
return (void *)new TextSource(source, settings, false);
};
obs_register_source(&si);
obs_register_source(&si_v2);
obs_register_source(&si_v3);
const GdiplusStartupInput gdip_input;
GdiplusStartup(&gdip_token, &gdip_input, nullptr);