NEO SPECTRUMAN, Вроде нашел решение, но заточенное под мой случай.
У меня кроме палитры 8bpp (rgb 773) есть исходная палитра 24bpp. Цвет из палитры 24bpp переводим в формат YCbCr, изменяем яркость и переводим обратно в RGB.
Но решение считаю частичным, так что продолжаю поиск изменения яркости внутри палитры 8bpp.
Минусом данного решения является необходимость наличия палитры 24bpp, и более того если необходимо последовательное изменения цвета, то цвет в палитры 24bpp должен оставаться оригинальным (незатронутый конверсией в 8bpp).
Код:
Y=Trunc( 0.299 * rrr + 0.587 * ggg + 0.114 * bbb) /* канал яркости */
Cb=Trunc(-0.1687 * rrr - 0.3313 * ggg + 0.5 * bbb + 128.0)
Cr=Trunc( 0.5 * rrr - 0.4187 * ggg - 0.0813* bbb + 128.0)
if ?bright=1 then Y=Y+36 /* Светлее */
else Y=Y-36 /* Темнеее */
rrr=Trunc(Y + 1.402 * (Cr - 128.0))
if rrr>255 then rrr=255
else if rrr<0 then rrr=0
ggg=Trunc(Y - 0.34414 * (Cb - 128.0) - 0.71414 * (Cr - 128.0))
if ggg>255 then ggg=255
else if ggg<0 then ggg=0
bbb=Trunc(Y + 1.772 * (Cb - 128.0))
if bbb>255 then bbb=255
else if bbb<0 then bbb=0
rrr8=format(rrr*(7/255),,0) /* 24bpp в 8bpp */
ggg8=format(ggg*(7/255),,0) /* format - округление до целого */
bbb8=format(bbb*(3/255),,0)
так же обращу внимание, что в "идеальном" случае получается только 9 шагов смещения. "Идеальным" случаем это когда составные R и G равны. А вот если внести поправку = 16 в 24bpp в одну из составляющих, получиться 18 шагов (в 8 Bpp).