Как я могу активировать субпиксельное позиционирование с помощью Pan go и (py) Cairo? - PullRequest
0 голосов
/ 07 мая 2020

Я только что наткнулся на эту статью , в которой говорилось, что субпиксельное позиционирование было добавлено в Pan go 1.44 в 2019 году - хотя и не без проблем. Видимо это выключено по умолчанию . Обе статьи go, поскольку говорят, что нужен последний мастер от cairo. Возможно, он был выпущен тем временем (?).

На самом деле два вопроса:

  • Какая версия / выпуск Cairo (или pycairo в этом отношении) мне нужна для активации этого характерная черта? Или мне (все еще) нужно собрать cairo из (невыпущенного) мастера?
  • Как активировать субпиксельное позиционирование с помощью Cairo (pycairo) / pangocairo?

Есть несколько Python привязок к pangocairo. Я использую следующий подход в Python 3:

import cairo

import gi
gi.require_version('Pango', '1.0')
gi.require_version('PangoCairo', '1.0')
from gi.repository import Pango, PangoCairo

Мой рендеринг текста выглядит примерно так:

_alignments = {
    'tl': lambda width, height: (0.0, 0.0), # top left
    'tc': lambda width, height: (-width / 2, 0.0), # top center
    'tr': lambda width, height: (-width, 0.0), # top right
    'cl': lambda width, height: (0.0, -height / 2), # center left
    'cc': lambda width, height: (-width / 2, -height / 2), # center center
    'cr': lambda width, height: (-width, -height / 2), # center right
    'bl': lambda width, height: (0.0, -height), # bottom left
    'bc': lambda width, height: (-width / 2, -height), # bottom center
    'br': lambda width, height: (-width, -height), # bottom right
}

def make_font(family, size):
    return Pango.font_description_from_string(f'{family:s} {size:.2f}')

font = make_font('Arial', 10.0)
x = 0.0
y = 0.0
angle = 0.0
font_color = (1.0, 0.0, 0.0, 0.5)
text = 'test'

_ctx.save() # _ctx is a cairo.Context object

layout = PangoCairo.create_layout(_ctx)
layout.set_font_description(font)
layout.set_markup(text, -1)

_ctx.set_source_rgba(*font_color)

_, text_extents = layout.get_pixel_extents()
text_width, text_height = text_extents.width, text_extents.height

_ctx.translate(x, y)
if angle != 0.0:
    _ctx.rotate(angle)
_ctx.translate(*self._alignments[alignment](text_width, text_height))
_ctx.move_to(0.0, 0.0)

PangoCairo.show_layout(_ctx, layout)

_ctx.restore()

1 Ответ

1 голос
/ 07 мая 2020

Какая версия / выпуск Cairo (или pycairo, если на то пошло) мне нужна для активации этой функции? Или мне (все еще) нужно собрать cairo из (невыпущенного) мастера?

Случайное предположение: это связано с src/cairo-ft-font.c в cairo, поэтому я быстро взглянул на результат git log src/cairo-ft-font.c. Третья запись звучит как то, что вы ищете:

commit ea9329215d3431ded51a71b724baf0edc25ad633
Author: Matthias Clasen <mclasen@redhat.com>
Date:   Sat Jul 28 12:25:47 2018 +0000

    image compositor: Support subpixel positioning

    Support subpixel positioning with a 4x4 subpixel grid.

    When compositing glyphs in the image compositor,
    we store the subpixel phases in the high bits of the
    glyph index. The _cairo_scaled_glyph_index() macro
    has been updated to discard these bits. By storing
    the phases in the glyph index, the glyph cache just
    keeps working. When loading a glyph, the Freetype
    font backend shifts the outline according to the
    phases.

Итак, какой первый выпуск содержит этот коммит?

$ git describe --contains ea9329215d3431ded51a71b724baf0edc25ad633
fatal: cannot describe 'ea9329215d3431ded51a71b724baf0edc25ad633'

Хм, похоже, нет в любой выпуск, поэтому вам нужен мастер.

Как мне активировать субпиксельное позиционирование с помощью Cairo (pycairo) / pangocairo?

У вас нет. Насколько я понял, он автоматически активируется. Тогда возникает вопрос: как мне его отключить? И ответ на это тоже кажется «вы не делаете».

Изменить: Согласно https://blogs.gnome.org/mclasen/2019/08/07/pango-1-44-wrap-up/, ответ, похоже, (частично) находится в функции pango_context_set_round_glyph_positions . Похоже, это касается части опоры Pan go и PangoCairo.

...