From 49f49c9d784d43ab88cf5edd96403f28ded3221c Mon Sep 17 00:00:00 2001 From: trigg Date: Tue, 22 Dec 2020 15:19:20 +0000 Subject: [PATCH] - Changed text renderer for Voice Overlay - Changed generic overlay font handling - Fixes #123 - Breaks #115 again? I can't tell --- discover_overlay/overlay.py | 5 ++- discover_overlay/text_overlay.py | 14 ++++----- discover_overlay/text_settings.py | 8 ++--- discover_overlay/voice_overlay.py | 50 +++++++++++++++++++----------- discover_overlay/voice_settings.py | 14 ++------- 5 files changed, 46 insertions(+), 45 deletions(-) diff --git a/discover_overlay/overlay.py b/discover_overlay/overlay.py index b882a5c..ca8e13b 100644 --- a/discover_overlay/overlay.py +++ b/discover_overlay/overlay.py @@ -108,12 +108,11 @@ class OverlayWindow(Gtk.Window): Draw overlay """ - def set_font(self, name, size): + def set_font(self, font): """ Set the font used by the overlay """ - self.text_font = name - self.text_size = size + self.text_font = font self.redraw() def set_floating(self, floating, pos_x, pos_y, width, height): diff --git a/discover_overlay/text_overlay.py b/discover_overlay/text_overlay.py index 6cc6e62..7b23e2a 100644 --- a/discover_overlay/text_overlay.py +++ b/discover_overlay/text_overlay.py @@ -92,15 +92,16 @@ class TextOverlayWindow(OverlayWindow): """ self.popup_style = boolean - def set_font(self, name, size): + def set_font(self, font): """ Set font used to render text """ - self.text_font = name - self.text_size = size + self.text_font = font + self.pango_rect = Pango.Rectangle() - self.pango_rect.width = self.text_size * Pango.SCALE - self.pango_rect.height = self.text_size * Pango.SCALE + font = Pango.FontDescription(self.text_font) + self.pango_rect.width = font.get_size() * Pango.SCALE + self.pango_rect.height = font.get_size() * Pango.SCALE self.redraw() def make_line(self, message): @@ -254,8 +255,7 @@ class TextOverlayWindow(OverlayWindow): layout.set_width(Pango.SCALE * self.width) layout.set_spacing(Pango.SCALE * 3) if self.text_font: - font = Pango.FontDescription( - "%s %s" % (self.text_font, self.text_size)) + font = Pango.FontDescription(self.text_font) layout.set_font_description(font) _tw, text_height = layout.get_pixel_size() self.col(self.bg_col) diff --git a/discover_overlay/text_settings.py b/discover_overlay/text_settings.py index 00890e2..d5c83bc 100644 --- a/discover_overlay/text_settings.py +++ b/discover_overlay/text_settings.py @@ -432,13 +432,9 @@ class TextSettingsWindow(SettingsWindow): Font settings changed """ font = button.get_font() - desc = Pango.FontDescription.from_string(font) - size = desc.get_size() - if not desc.get_size_is_absolute(): - size = size / Pango.SCALE - self.overlay.set_font(desc.get_family(), size) + self.overlay.set_font(font) - self.font = desc.to_string() + self.font = font self.save_config() def change_channel(self, button): diff --git a/discover_overlay/voice_overlay.py b/discover_overlay/voice_overlay.py index ebd6551..f219784 100644 --- a/discover_overlay/voice_overlay.py +++ b/discover_overlay/voice_overlay.py @@ -15,6 +15,11 @@ import math import cairo from .overlay import OverlayWindow from .image_getter import get_surface, draw_img_to_rect +import gi +gi.require_version("Gtk", "3.0") +gi.require_version('PangoCairo', '1.0') +# pylint: disable=wrong-import-position,wrong-import-order +from gi.repository import Pango, PangoCairo class VoiceOverlayWindow(OverlayWindow): @@ -376,43 +381,48 @@ class VoiceOverlayWindow(OverlayWindow): """ Draw username & background at given position """ + layout = self.create_pango_layout(string) + layout.set_markup(string, -1) + + layout.set_width(Pango.SCALE * self.width) + layout.set_spacing(Pango.SCALE * 3) + font=None if self.text_font: - context.set_font_face(cairo.ToyFontFace( - self.text_font, cairo.FontSlant.NORMAL, cairo.FontWeight.NORMAL)) - context.set_font_size(self.text_size) - - # Get text size details - f_ascent, f_descent, f_height, f_max_dx, f_max_dy = context.font_extents() - _xb, _yb, width, height, _dx, _dy = context.text_extents(string) - - height_offset = (self.avatar_size / 2) - (f_height / 2) - text_y_offset = height_offset + f_height - f_descent + self.text_baseline_adj + font = Pango.FontDescription(self.text_font) + layout.set_font_description(font) + (_ink_rect, logical_rect) = layout.get_pixel_extents() + text_height = logical_rect.height + text_width = logical_rect.width + + self.set_text_col() + height_offset = (self.avatar_size / 2) - (text_height / 2) + text_y_offset=height_offset + self.text_baseline_adj if self.align_right: context.move_to(0, 0) self.set_norm_col() context.rectangle( - pos_x - width - (self.text_pad * 2), + pos_x - text_width - (self.text_pad * 2), pos_y + height_offset - self.text_pad, - width + (self.text_pad * 4), - f_height + (self.text_pad * 2) + text_width + (self.text_pad * 4), + text_height + (self.text_pad * 2) ) context.fill() self.set_text_col() context.move_to( - pos_x - width - self.text_pad, + pos_x - text_width - self.text_pad, pos_y + text_y_offset ) - context.show_text(string) + PangoCairo.show_layout(self.context, layout) else: context.move_to(0, 0) self.set_norm_col() context.rectangle( pos_x - (self.text_pad * 2), pos_y + height_offset - self.text_pad, - width + (self.text_pad * 4), - f_height + (self.text_pad * 2) + text_width + (self.text_pad * 4), + text_height + (self.text_pad * 2) ) context.fill() @@ -421,7 +431,11 @@ class VoiceOverlayWindow(OverlayWindow): pos_x + self.text_pad, pos_y + text_y_offset ) - context.show_text(string) + PangoCairo.show_layout(self.context, layout) + + + + return pos_y - text_height def draw_avatar_pix(self, context, pixbuf, pos_x, pos_y, border_colour): """ diff --git a/discover_overlay/voice_settings.py b/discover_overlay/voice_settings.py index 8a60e86..862f585 100644 --- a/discover_overlay/voice_settings.py +++ b/discover_overlay/voice_settings.py @@ -136,11 +136,7 @@ class VoiceSettingsWindow(SettingsWindow): self.floating, self.floating_x, self.floating_y, self.floating_w, self.floating_h) if self.font: - desc = Pango.FontDescription.from_string(self.font) - size = desc.get_size() - if not desc.get_size_is_absolute(): - size = size / Pango.SCALE - self.overlay.set_font(desc.get_family(), size) + self.overlay.set_font(self.font) def save_config(self): """ @@ -400,13 +396,9 @@ class VoiceSettingsWindow(SettingsWindow): Font settings changed """ font = button.get_font() - desc = Pango.FontDescription.from_string(font) - size = desc.get_size() - if not desc.get_size_is_absolute(): - size = size / Pango.SCALE - self.overlay.set_font(desc.get_family(), size) + self.overlay.set_font(font) - self.font = desc.to_string() + self.font = font self.save_config() def change_bg(self, button):