0 Members and 2 Guests are viewing this topic.
Нет.
Возник вопрос - как перевести десятичные числа в шестнадцатеричные?
Вот простой примерчик:
Я к сожалению мало что понял. Так что надо мне поизучать паскаль.
Read more...Так, спрашивай, постараюсь ответить. Тут не Паскаль, а представление чисел надо понять.Цвет у нас представлен числом из 4-х байт. (Байт - это 8 бит. Напр., FF = 255 = 11111111, F0 = 240 = 11110000 и т.д.)4-й байт (старший, левый) - прозрачность (D);3-й - красный (R);2-й - зелёный (G);1-й байт (младший, правый) - синий (B);К примеру, в программе объявлены переменные:var D, R, G, B: Byte;Не важно, как и в каком виде мы их получаем, нам нужно каждую поставить на своё место в значении цвета:B - так и останется в неизменном виде;G - надо поставить на место второго байта, т.е. сдвинуть влево на 1 байт или на 8 бит, т.е. умножить на 256;R - надо сдвинуть уже на 2 байта (на 16 бит) влево, умножив на 65536 (256 * 256);значение D должно переместиться на 3 байта влево (* 16777216)а после всего этого сложить, чтоб получить желаемое значение цвета:D * 16777216 + R * 65536 + G * 256 + BВ нашей привычной десятичной системе мы точно так же поступаем: если нам нужно число 5 переместить на 1 разряд влево, мы умножаем его на 10 - основание системы счисления.Набросал ещё один пример, где это как раз и реализовано. Для простоты не стал делать скрипты на кажый движок, потому цвет меняется только от слайдера "D".
Можно было бы поступить так: D shl 24, но там проблемы с типом, он со знаком и возникает ошибка, приходится просто умножить это значение трижды на 256, т.е. на 256*256*256 = 16777216
Color := B + (G shl 8) + (R shl 16) + (Alpha shl 24); Color := Color AND $FFFFFFFF;
var Color: Variant; R, G, B, Alpha: Integer;begin Color := FindObject('T_Content').Get('Color'); R := Color shr 16 AND $FF; G := Color shr 8 AND $FF; B := Color AND $FF; Alpha := Color shr 24 AND $FF;
Только при Alpha=0 цвет становится непрозрачным, а должен быть полностью прозрачным.
Вроде раньше это работало, но с v4.12 цвет записан беззнаковым типом (если я ничего не попутал), поэтому я сделал так (вторая строчка):
Два бага или это всё из одной оперы?
Не работало ни раньше, ни сейчас, и проблема не в плеере, это ограничение скрипт-движка
Я активно ковырялся с этим в октябре и тестировал и в SE, и в AIMP (v4.11 stable и v4.12 beta) - у меня только так, как я написал, заработало правильно везде.
В SE.920 при использовании выражения shl 24 прозрачность меняется наполовину - максимальной непрозрачности нет.При значениях > 127 дебагер выдаёт сообщение: Range check error.
поэтому я сделал так (вторая строчка):Code: [Select] Color := B + (G shl 8) + (R shl 16) + (Alpha shl 24); Color := Color AND $FFFFFFFF;Так работает и там, и там.
Хм... Вон в чём дело: я скин не собирал, проверял лишь в редакторе в тестовом режиме, а в нём всё нормально. А вот в плеере, действительно, при переходе с 1 на 0 цвет становится полносттью непрозрачным. Кстати, в плеере работает нормально с выражением shl 24, а в редакторе - нет.Два бага или это всё из одной оперы?
... (см. самую последнюю таблицу)