shr еах.8 // <fB*t/256> <fR*t/256> and eax.OxffOOff mov Cvet.eax

В цикле по точкам картинки цветовые компоненты вычитаются из соответствующих компонентов цвета текущей точки, как показано в листинге 17.8.

Листинг 17.8

mov eax.dword ptr [esi] //Чтение цвета точки

and eax.OxffOOff //Удаление зеленой составляющей

mul t // <B*t> <R*t>

shr еах. 8 // <B*t/256> <R*t/256>

and eax.OxffOOff // Очистка байта-разделителя

sub eax.Cvet // <B*t/256 - fB*t/256> <R*t/256 - fR*t/256>

Полный текст функции Di rectBitMapAss() можно найти в файле BitmapTest.cpp проекта ЗаставкаВМР. Предложенные решения позволили сократить время работы исходной функции GDIBitMapC) в 250-300 раз.

Для эффективной реализации параллельной обработки нескольких элементов, упакованных в один регистр или переменную, предусмотрена технология ММХ. Команды ММХ позволяют одновременно умножать, складывать, вычитать 8 байт или четыре слова, помещенных в один регистр, как независимые поля. Перенос в соседнее поле для обеспечения независимости вычислений теряется.

Три компонента цвета, размещенные в 64-битной ячейке j nt64 packe как три слова, можно параллельно обрабатывать одной командой ММХ. Например, умножение на номер текущего шага t и помещение результата в ячейку packcl будет выглядеть так, как показано в листинге 17.9.

Листинг 17.9

movQ mmO.packe PMULLW mmO.t movQ packcl.mmO

Параллельная обработка трех составляющих цвета реализована функцией Di rectBi tMapMMX (), текст которой также находится в BitmapTest.cpp. Экспериментальная проверка показала, что она работает медленнее, чем Di rectBi tMapAsm(). Возможно, это произошло оттого, что не очень удачно выбран алгоритм взаимных преобразований трехбайтовых кодов цвета формата DIB и необходимых для ММХ восьмибайтовых кодов.

При выборе соответствующего пункта меню проекта можно выполнить один из четырех вариантов вывода заставки. Поскольку все функции обработки имеют одинаковые наборы параметров, используется общая функция демонстрации заставки 0nTest(), которая получает функцию обработки в качестве параметра Test, как это показано в листинге 17.10.


⇐ Предыдущая| |Следующая ⇒