Окт 13

Вывод пикселов

Для работы с пикселами предусмотрены следующие функции:
COLORREF GetPixel(HDC hdc, int X. int Y);
BOOL SetPixelV(HDC hdc, int X. int Y, COLORREF color);
COLORREF SetPixeKHOC hdc, int X, int Y, COLORREF color);
Параметры Х и Y определяют позицию пиксела в логических единицах. Параметр color, устанавливающий цвет пиксела, обычно задается при помощи макроса RGB1.
Функция GetPixel возвращает цветовое значение пиксела с заданными координатами.
Функции SetPixelV и SetPixel устанавливают заданное цветовое значение пиксела, различаясь возвращаемым значением. Первая функция возвращает логическое значение, указывающее, успешно ли прошла операция. Вторая функция в случае успешного выполнения возвращает старый цвет пиксела, а если произошла какая-то ошибка, то возвращается значение -1.
Реализация несложных, на первый взгляд, функций SetPixelV и SetPixel на самом деле связана с существенными затратами процессорного времени. Обе функции инициируют вызов системной функции NtGdiSetPixel, которая, в свою очередь, осуществляет довольно много действий:
блокировку контекста устройства;
отображение логических координат в физические;
преобразование в случае необходимости значения типа COLORREF в индекс;
вызов функции драйвера DrvBitBlt;
разблокировку контекста устройства.
Хронометраж процесса выполнения этих функций [6] показал, что процесс вывода одного пиксела требует более 1000 тактов работы процессора. Как ни странно, функция GetPixel работает еще медленнее и требует более 6000 тактов работы процессора.
Поэтому, если рисование ведется посредством вывода отдельных пикселов, могут возникнуть проблемы с быстродействием программы.