Контроль выравнивания текста в Shady - PullRequest
1 голос
/ 22 февраля 2020

Я использую Shady, чтобы написать текст на экране, и мне интересно, что было бы самым простым способом управления выравниванием строки. Насколько я понимаю, параметр align в объекте Shady text управляет выравниванием абзаца, но я заинтересован в управлении выравниванием одной строки текста.
По сути, я хотел бы повторить поведение горизонтальное выравнивание , вертикальное выравнивание и вращение параметры текстовой функции matplotlib. Но для этого мне нужно оценить область (в пикселях), которая будет занята строкой после рендеринга. Могу ли я получить это от Шейди как-нибудь? В руководстве говорится, что рендеринг выполняется на процессоре, а отрисованная строка затем передается в графический процессор, поэтому это должно быть выполнимо.

1 Ответ

1 голос
/ 24 февраля 2020

Вы правы, что свойства .text.align и .text.wrapping связаны с «выравниванием» только на логическом уровне текстового потока, т. Е. Как выравниваются строки многострочного текстового стимула относительно друг друга в системе координат, в которой они читаются (независимо от того, каким образом физический стимул вверх).

Свойства, о которых вы говорите - вращение, "вертикальный" Выравнивание "и даже то, что вы называете" горизонтальным выравниванием ", если в игре только одна строка текста - это не свойства c, специфичные для текста: они могут одинаково хорошо применяться к любому прямоугольному патчу angular. По этой причине вы хотите манипулировать свойствами stim.*, а не stim.text.*. В частности, это .anchor и .rotation, как показано здесь:

#!/usr/bin/env python -m Shady shell

import Shady, Shady.Text
w = Shady.World(fullScreenMode=False)

axes = w.Stimulus(Shady.PixelRuler(1000), anchor=Shady.LOWER_LEFT, size=600)

xlabel = w.Stimulus(text='x axis label', x=300, y=0, anchor=Shady.TOP) 
ylabel = w.Stimulus(text='y axis label', x=0, y=300, anchor=Shady.BOTTOM, rotation=90)

speed = 30
msg = w.Stimulus(
    xy = 300,
    rotation = Shady.Integral( lambda t: speed ),
    text = 'Change msg.anchor to anything\nbetween [-1,-1] and [+1,+1]\nand see what happens',
    text_blockbg = [0, 0, 0, 0.5],
)
Shady.AutoFinish(w)

Где-то в недокументированных функциях Shady.Text, вероятно, есть какой-то способ заблаговременно оценить, каким будет размер визуализированного текстового стимула. На самом деле, при ближайшем рассмотрении это выглядит как наименее раздражающий способ сделать это - создать массив текстур:

img = Shady.Text.MakeTextImage('hello world')
heightInPixels, widthInPixels, _ = img.shape

Но, надеюсь, при правильном использовании .anchor вам больше не понадобится это.

...