def getExtents(self, text=None, style=None): if text == None: text = str(self.text) if style == None: style = self.style txtext = {} dc = win32gui.CreateCompatibleDC(0) win32gui.SetMapMode(dc, win32con.MM_TEXT) font = self.selectFont(dc, style, 64) if style.spacing: for char in text: cx, cy = win32gui.GetTextExtentPoint32(dc, char) txtext['width'] += cx + (style.spacing * 64) txtext['height'] = cy else: cx, cy = win32gui.GetTextExtentPoint32(dc, text) txtext['width'] = cx txtext['height'] = cy tm = win32gui.GetTextMetrics(dc) txtext['ascent'] = tm['Ascent'] txtext['descent'] = tm['Descent'] txtext['internal_lead'] = tm['InternalLeading'] txtext['external_lead'] = tm['ExternalLeading'] txtext['width'] = txtext['width'] * (style.scale_x / float(100)) / float(64) txtext['height'] = txtext['height'] * (style.scale_y / float(100)) / float(64) txtext['ascent'] = txtext['ascent'] * (style.scale_y / float(100)) / float(64) txtext['descent'] = txtext['descent'] * (style.scale_y / float(100)) / float(64) txtext['internal_lead'] = txtext['internal_lead'] * ( style.scale_y / float(100)) / float(64) txtext['external_lead'] = txtext['external_lead'] * ( style.scale_y / float(100)) / float(64) return txtext
def get_metrics(self): if sys.platform == "win32": metrics = win32gui.GetTextMetrics(self.dc) return ( # 'height': metrics['Height'] * self.downscale * self.yscale, metrics['Ascent'] * self.downscale * self.yscale, metrics['Descent'] * self.downscale * self.yscale, metrics['InternalLeading'] * self.downscale * self.yscale, metrics['ExternalLeading'] * self.downscale * self.yscale) elif sys.platform == "linux": return ( # 'height': (self.metrics.get_ascent() + self.metrics.get_descent()) / PANGO_SCALE * self.downscale * self.yscale * self.fonthack_scale, self.metrics.get_ascent() / PANGO_SCALE * self.downscale * self.yscale * self.fonthack_scale, self.metrics.get_descent() / PANGO_SCALE * self.downscale * self.yscale * self.fonthack_scale, 0.0, self.layout.get_spacing() / PANGO_SCALE * self.downscale * self.yscale * self.fonthack_scale) else: raise NotImplementedError
def wndProc(self, hWnd, message, wParam, lParam): if message == win32con.WM_PAINT: hDC, paintStruct = win32gui.BeginPaint(hWnd) folder_with_ico_file = 'share' if hasattr(sys, 'frozen') else 'windows' filename = os.path.join(os.path.dirname(sys.argv[0]), folder_with_ico_file, 'bleachbit.ico') flags = win32con.LR_LOADFROMFILE hIcon = win32gui.LoadImage(0, filename, win32con.IMAGE_ICON, 0, 0, flags) # Default icon size seems to be 32 pixels so we center the icon vertically. default_icon_size = 32 icon_top_margin = self._splash_screen_height - 2 * ( default_icon_size + 2) win32gui.DrawIcon(hDC, 0, icon_top_margin, hIcon) # win32gui.DrawIconEx(hDC, 0, 0, hIcon, 64, 64, 0, 0, win32con.DI_NORMAL) rect = win32gui.GetClientRect(hWnd) textmetrics = win32gui.GetTextMetrics(hDC) text_left_margin = 2 * default_icon_size text_rect = (text_left_margin, (rect[3] - textmetrics['Height']) // 2, rect[2], rect[3]) win32gui.DrawText(hDC, _("BleachBit is starting...\n"), -1, text_rect, win32con.DT_WORDBREAK) win32gui.EndPaint(hWnd, paintStruct) return 0 elif message == win32con.WM_DESTROY: win32gui.PostQuitMessage(0) return 0 else: return win32gui.DefWindowProc(hWnd, message, wParam, lParam)
def __init__(self, style: Style): self.family = style.fontname self.bold = style.bold self.italic = style.italic self.underline = style.underline self.strikeout = style.strikeout self.size = style.fontsize self.xscale = style.scale_x / 100 self.yscale = style.scale_y / 100 self.hspace = style.spacing self.upscale = FONT_PRECISION self.downscale = 1 / FONT_PRECISION if sys.platform == "win32": # Create device context self.dc = win32gui.CreateCompatibleDC(None) # Set context coordinates mapping mode win32gui.SetMapMode(self.dc, win32con.MM_TEXT) # Set context backgrounds to transparent win32gui.SetBkMode(self.dc, win32con.TRANSPARENT) # Create font handle font_spec = { "height": int(self.size * self.upscale), "width": 0, "escapement": 0, "orientation": 0, "weight": win32con.FW_BOLD if self.bold else win32con.FW_NORMAL, "italic": int(self.italic), "underline": int(self.underline), "strike out": int(self.strikeout), "charset": win32con.DEFAULT_CHARSET, "out precision": win32con.OUT_TT_PRECIS, "clip precision": win32con.CLIP_DEFAULT_PRECIS, "quality": win32con.ANTIALIASED_QUALITY, "pitch and family": win32con.DEFAULT_PITCH + win32con.FF_DONTCARE, "name": self.family, } self.pycfont = win32ui.CreateFont(font_spec) win32gui.SelectObject(self.dc, self.pycfont.GetSafeHandle()) # Calculate metrics self.metrics = win32gui.GetTextMetrics(self.dc) elif sys.platform == "linux" or sys.platform == "darwin": surface = cairo.ImageSurface(cairo.Format.A8, 1, 1) self.context = cairo.Context(surface) self.layout = PangoCairo.create_layout(self.context) font_description = Pango.FontDescription() font_description.set_family(self.family) font_description.set_absolute_size(self.size * self.upscale * PANGO_SCALE) font_description.set_weight( Pango.Weight.BOLD if self.bold else Pango.Weight.NORMAL) font_description.set_style( Pango.Style.ITALIC if self.italic else Pango.Style.NORMAL) self.layout.set_font_description(font_description) self.metrics = Pango.Context.get_metrics( self.layout.get_context(), self.layout.get_font_description()) if LIBASS_FONTHACK: self.fonthack_scale = self.size / ( (self.metrics.get_ascent() + self.metrics.get_descent()) / PANGO_SCALE * self.downscale) else: self.fonthack_scale = 1 else: raise NotImplementedError