Функцию копирования можно ускорить подключением библиотеки DirectDraw и использованием метода FastBl t() этой библиотеки. При вычислении смешанного цвета можно использовать возможности одновременного выполнения операций с тремя компонентами цвета одной машинной командой. В проект включены функции обработки, в которых вычисление нескольких компонентов цвета одной машинной командой выполняется при помощи ассемблерной вставки, что еще более ускоряет работу.
Для объяснения возможности параллельного выполнения арифметических операций с кодами цвета, упакованными в один регистр, представим расчетное выражение (например, для компонента R) в следующем виде:
(R*N-R*t + fR^t)/N
или R - R t/N + /А t/N
Из него видно, что если предварительно вычислить произведения R t/N, fR t/N, все три компонента R, G, В можно хранить и вычислять в разных байтах одного регистра. Код R не превышает значения 255, поэтому для его хранения достаточно байта. В разности R- R t/N не может быть займа из старшего байта, так как R>R t/N, а после прибавления fR t/Nне возникает переноса единицы в старший байт.
Но вычислять параллельно все три выражения вида нельзя. Операцию R Step/N можно выполнять только в том случае, если коды цвета разделены в регистре пустыми байтами.
В функции Di rectBitMapAss() параллельно вычисляются красная и синяя составляющие цвета. Зеленая составляющая вычисляется отдельно. Для этого в цвете фона обнуляется область зеленого:
static COLORREF cRB - cFon&OxffOOff
В результате этих действий переменная cRB будет содержать компоненты фона fR и /В. В ассемблерной вставке указатель на текущую точку источника помещаНепосредственный доступ к графическим данным ется в регистр esi, а на точку приемника - в регистр edi. Перед выполнением цикла параллельно вычисляются выражения fR t/N, fB t/N. Для ускорения работы деление на N заменено сдвигом, как показано в листинге 17.7.
Листинг 17.7
mov eax.cRB // < fB> <fR> две составляющих фона в одном регистре еах mul t // <fB*t> <fR*t> два результата умножения в разных байтах