Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
    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)
Esempio n. 4
0
    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