Открыть главное меню

Предотвращение мерцания

Перед началом вывода графики необходимо чтобы у нас был контекст устройства (dCtx), на которое будем выводить графику и две поверхности - экранная поверхность (sDisp) и внеэкранная поверхность (sDraw). Если у нас их нет - смотрим здесь как их получить.

Итак, графика инициализирована. Можем приступать к работе.

  1. Перед выводом графики мы меняем поверхность, на которой будем рисовать
    По-умолчанию этой поверхностью является экранная поверхность. Но для наших целей она не подходит. Переключаем поверхность с помощью функции AhiDrawSurfDstSet:
    AhiDrawSurfDstSet(dCtx, sDraw, 0);
  2. Собственно, выводим графику
    Выводим графику. Не забываем устанавливать растровую операцию и цвет кисти:
    // Вспомогательная переменная для указания области экрана
    AHIRECT_T	rect;
    // Устанавливаем растровую операцию на применение кисти
    AhiDrawRopSet(dCtx, AHIROP3(AHIROP_PATCOPY));
    // Установим цвет кисти. Этим цветом будут выводиться наши графические примитивы
    AhiDrawBrushFgColorSet(dCtx, ATI_565RGB(0,0,255)); // Ярко-синий
    // Зададим прямоугольник на экране, который будет залит нашим цветом
    rect.x1 = 0;
    rect.y1 = 0;
    rect.x2 = 64;
    rect.y2 = 64;
    // Нарисуем прямоугольник rect
    AhiDrawSpans(dCtx, &rect, 1, 0);
  3. Переносим изображение из поверхности в видеопамяти на экран
    Графика выведена в память, но теперь её нужно вывести на экран. Для этого мы выставляем растровую операцию в AHIROP_SRCCOPY, устанавливаем поверхность-источник в sDraw (там у нас находится то, что мы уже вывели), а поверхность-приёмник в sDisp (экранная поверхность) и копируем изображение с помощью функции AhiDrawBitBlt:
    // Левый верхний угол поверхности рисования
    AHIPOINT_T zpoint = {0, 0};
    // Область вывода на поверхность экрана
    AHIRECT_T zrect = {0, 0, DISPLAY_WIDTH, DISPLAY_HEIGHT};
    // Устанавливаем растровую операцию
    AhiDrawRopSet(dCtx, AHIROP3(AHIROP_SRCCOPY));
    // Устанавливаем поверхность-источник
    AhiDrawSurfSrcSet(dCtx, sDraw, 0);
    // Устанавливаем поверхность-приёмник
    AhiDrawSurfDstSet(dCtx, sDisp, 0);
    // Копируем изображение
    AhiDrawBitBlt(dCtx, &zrect, &zpoint);

Изображение получено на экране.

См. также

  • AHI - драйвер для чипов ATI
  • LdrDisplayCbkReg - функция для создания callback'ов для рисования поверх UIS
  • LdrDisplayCbkUnReg - функция для удаления callback'ов, созданных с помощью LdrDisplayCbkReg