C0L0RP Cvet: //Цвет точки.
int R.G.B: //Компоненты цвета точки
static COLORP Fon; //Цвет фона формируется только при первом вызове pS - pSO: //Начальное значение указателя на текущую точку источника Р pD - pDO; //Начальное значение указателя на текущую точку приемника if(!pS ||!pD) return -1: //Указатель не заполнен int tK - bitmap.bmWidth*bitmap.bmHeight: //Общее количество точек //Разделение цвета фона на компоненты:
static BYTE fR -Fon.R- cFon&OxFF; //В cFon красный в младшем байте, static BYTE fG -Fon.G- (cFon»8) &0xFF; static BYTE fB -Fon.B- (cFon»16)&0xFF; //Обработка точек изображения:
for(i-0:i<tK:i++) //Выполняем цикл по точкам картинки. {
Cvet-*pS++; //Читаем цвет очередной точки в переменную Cvet if(Cvet.R-ColorKey && Cvet.G-ColorKey && Cvet.B-ColorKey)
{*pD++-Fon; continue;} //Прозрачный цвет. Заносим в приемник цвет фона R-Cvet.R; G-Cvet.G: B-Cvet.B; Cvet.R - (BYTE)(R+(fR - R)*t/N); //Вычисление Cvet.G - (BYTE)(G+(fG -G)*t/N); //смешанного Cvet.В - (BYTEHB+ (fB - B)*t/N); //цвета. *pD++-Cvet; //Заполнение смешанным цветом точки приемника
}
продолжение &
Работа с растровыми изображениями
Листинг 17.6 (продолжение)
BUBI t (hdc. х. у. bi tmap. bmWi dth, bi tmap. bmHei ght. hdcMemD ,0.0. SRCCOPY);
return 0;
}
Сравнение с функцией, использующей GetPixelO, показало, что прямой доступ к графическим данным снизил затраты на вывод заставки в 50 раз.
Функция хорошо работает при копировании обработанного изображения на экран в режиме TrueColor. Если в контексте памяти цвет каждой точки кодируется тремя байтами, а в видеопамяти - двумя, то на экране после исчезновения рисунка может быть виден прямоугольник, цвет которого несколько отличается от цвета фона. Видимо, для кисти округление при преобразовании 24-битного цвета источника в 16-битный код видеопамяти делается несколько иначе, чем в функции BitBltC).
При необходимости рассмотренную функцию можно ускорить еще в несколько раз. Известное правило решения таких задач требует выделения и тщательной проработки критических по времени участков программы. В данном случае необходимо более эффективное выполнение операций, которые производятся с каждой точкой рисунка, то есть тела цикла и функции копирования BitBltC).