resources/text: fix alignment layout for center/right

This commit is contained in:
Vaxry 2025-11-06 20:42:13 +00:00
parent 50fb9f0692
commit e381b2f1f0
Signed by: vaxry
GPG key ID: 665806380871D640
2 changed files with 56 additions and 26 deletions

View file

@ -37,9 +37,15 @@ CMatrix3 Hyprgraphics::CMatrix3::invert() const {
);
return CMatrix3(std::array<std::array<double, 3>, 3>{
(m[1][1] * m[2][2] - m[2][1] * m[1][2]) * invDet, (m[0][2] * m[2][1] - m[0][1] * m[2][2]) * invDet, (m[0][1] * m[1][2] - m[0][2] * m[1][1]) * invDet, //
(m[1][2] * m[2][0] - m[1][0] * m[2][2]) * invDet, (m[0][0] * m[2][2] - m[0][2] * m[2][0]) * invDet, (m[1][0] * m[0][2] - m[0][0] * m[1][2]) * invDet, //
(m[1][0] * m[2][1] - m[2][0] * m[1][1]) * invDet, (m[2][0] * m[0][1] - m[0][0] * m[2][1]) * invDet, (m[0][0] * m[1][1] - m[1][0] * m[0][1]) * invDet, //
(m[1][1] * m[2][2] - m[2][1] * m[1][2]) * invDet,
(m[0][2] * m[2][1] - m[0][1] * m[2][2]) * invDet,
(m[0][1] * m[1][2] - m[0][2] * m[1][1]) * invDet, //
(m[1][2] * m[2][0] - m[1][0] * m[2][2]) * invDet,
(m[0][0] * m[2][2] - m[0][2] * m[2][0]) * invDet,
(m[1][0] * m[0][2] - m[0][0] * m[1][2]) * invDet, //
(m[1][0] * m[2][1] - m[2][0] * m[1][1]) * invDet,
(m[2][0] * m[0][1] - m[0][0] * m[2][1]) * invDet,
(m[0][0] * m[1][1] - m[1][0] * m[0][1]) * invDet, //
});
}
@ -69,9 +75,15 @@ const std::array<std::array<double, 3>, 3>& Hyprgraphics::CMatrix3::mat() {
const CMatrix3& CMatrix3::identity() {
static const CMatrix3 Identity3 = CMatrix3(std::array<std::array<double, 3>, 3>{
1, 0, 0, //
0, 1, 0, //
0, 0, 1, //
1,
0,
0, //
0,
1,
0, //
0,
0,
1, //
});
return Identity3;
}
@ -84,9 +96,15 @@ CColor::XYZ Hyprgraphics::xy2xyz(const CColor::xy& xy) {
}
static CMatrix3 Bradford = CMatrix3(std::array<std::array<double, 3>, 3>{
0.8951, 0.2664, -0.1614, //
-0.7502, 1.7135, 0.0367, //
0.0389, -0.0685, 1.0296, //
0.8951,
0.2664,
-0.1614, //
-0.7502,
1.7135,
0.0367, //
0.0389,
-0.0685,
1.0296, //
});
static CMatrix3 BradfordInv = Bradford.invert();
@ -101,9 +119,15 @@ CMatrix3 Hyprgraphics::adaptWhite(const CColor::xy& src, const CColor::xy
return BradfordInv *
CMatrix3(std::array<std::array<double, 3>, 3>{
factors.x, 0.0, 0.0, //
0.0, factors.y, 0.0, //
0.0, 0.0, factors.z, //
factors.x,
0.0,
0.0, //
0.0,
factors.y,
0.0, //
0.0,
0.0,
factors.z, //
}) *
Bradford;
}
@ -115,9 +139,15 @@ CMatrix3 Hyprgraphics::SPCPRimaries::toXYZ() const {
const auto w = xy2xyz(white);
const auto invMat = CMatrix3(std::array<std::array<double, 3>, 3>{
r.x, g.x, b.x, //
r.y, g.y, b.y, //
r.z, g.z, b.z, //
r.x,
g.x,
b.x, //
r.y,
g.y,
b.y, //
r.z,
g.z,
b.z, //
})
.invert();

View file

@ -13,7 +13,7 @@ CTextResource::CTextResource(CTextResource::STextResourceData&& data) : m_data(s
}
void CTextResource::render() {
auto CAIROSURFACE = makeUnique<CCairoSurface>(cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1920, 1080 /* dummy value */));
auto CAIROSURFACE = makeUnique<CCairoSurface>(cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1, 1 /* dummy value */));
auto CAIRO = cairo_create(CAIROSURFACE->cairo());
PangoLayout* layout = pango_cairo_create_layout(CAIRO);
@ -60,30 +60,30 @@ void CTextResource::render() {
pango_layout_set_attributes(layout, attrList);
pango_attr_list_unref(attrList);
int layoutWidth, layoutHeight;
pango_layout_get_size(layout, &layoutWidth, &layoutHeight);
PangoRectangle ink, logical;
pango_layout_get_pixel_extents(layout, &ink, &logical);
if (m_data.maxSize) {
layoutWidth = m_data.maxSize->x > 0 ? std::min(layoutWidth, sc<int>(m_data.maxSize->x * PANGO_SCALE)) : layoutWidth;
layoutHeight = m_data.maxSize->y > 0 ? std::min(layoutHeight, sc<int>(m_data.maxSize->y * PANGO_SCALE)) : layoutHeight;
if (m_data.ellipsize)
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
if (m_data.maxSize->x >= 0)
pango_layout_set_width(layout, layoutWidth);
pango_layout_set_width(layout, std::min(logical.width * PANGO_SCALE, sc<int>(m_data.maxSize->x * PANGO_SCALE)));
if (m_data.maxSize->y >= 0)
pango_layout_set_height(layout, layoutHeight);
pango_layout_set_height(layout, std::min(logical.height * PANGO_SCALE, sc<int>(m_data.maxSize->y * PANGO_SCALE)));
if (m_data.wrap)
pango_layout_set_wrap(layout, PANGO_WRAP_WORD_CHAR);
pango_layout_get_size(layout, &layoutWidth, &layoutHeight);
pango_layout_get_pixel_extents(layout, &ink, &logical);
}
pango_layout_get_pixel_extents(layout, &ink, &logical);
// TODO: avoid this?
cairo_destroy(CAIRO);
CAIROSURFACE.reset();
m_asset.cairoSurface = makeShared<CCairoSurface>(cairo_image_surface_create(CAIRO_FORMAT_ARGB32, layoutWidth / PANGO_SCALE, layoutHeight / PANGO_SCALE));
m_asset.cairoSurface = makeShared<CCairoSurface>(cairo_image_surface_create(CAIRO_FORMAT_ARGB32, logical.width, logical.height));
CAIRO = cairo_create(m_asset.cairoSurface->cairo());
// clear the pixmap
@ -96,14 +96,14 @@ void CTextResource::render() {
const auto RGB = m_data.color.asRgb();
cairo_set_source_rgba(CAIRO, RGB.r, RGB.g, RGB.b, 1.F);
cairo_move_to(CAIRO, 0, 0);
cairo_move_to(CAIRO, -logical.x, -logical.y);
pango_cairo_show_layout(CAIRO, layout);
g_object_unref(layout);
cairo_surface_flush(m_asset.cairoSurface->cairo());
m_asset.pixelSize = {layoutWidth / (double)PANGO_SCALE, layoutHeight / (double)PANGO_SCALE};
m_asset.pixelSize = {logical.width, logical.height};
cairo_destroy(CAIRO);
}