}:
В листинге 10.1 приводится начало создаваемого нами класса RGBpixmap. Как принято в OpenGL, мы представляем пиксельную карту в форме простого массива пиксельных значений pixel, который хранится строка за строкой снизу вверх и вдоль каждой строки слева направо.
Листинг 10.1. Класс RGBpixmap для обработки RGB-изображений
class RGBpixmap{ private:
int nRows, nCols: // dimensions of the pixmap // размеры пиксельной карты
RGB* pixel; // array of pixels // массив пикселов public:
RGBpixmapO {nRows = nCols = 0; pixel = 0;}
RGBpixmapCint r. int c) //constructor // конструктор
{
nRows - r: nCols - c:
pixel " new RGB[r*c]:
}
void setPixeKint x. int y. RGB color) {
продолжение^
1 На самом деле в OpenGL предлагается несколько способов «упаковки» пиксельной карты в памяти. Мы работаем с самым обще употребительным форматом.
Средства для растровой графики
Листинг Ю.1 (продолжение)
if(x >- 0 && х < nCols && у >= 0 && у < nRowr) pixel[nCols * у + х] = color;
}
RGB getPixeKint x. int y) {
return pixel[nCols * у + x]:
}
//*** draw this pixmap at the current raster position //*** рисуем эту пиксельную карту в текущей растровой // позиции void draw(){
glDrawPi xels(nCol s. nRows. GL_RGB.
GLJJNSIGNED BYTE.pixel);
}
//*** read a rectangle of pixels into this pixmap
//*** считываем прямоугольник пикселов в эту пиксельную карту
void readdnt х. int у. int wid. int ht){
nRows - ht;
nCols - wid;
pixel = new RGB[nRows *nCols]; if(!pixel)exit(-l);
glReadPixels(x. y, nCols.
nRows.GL_RGB.GL_UNSIGNED_BYTE. pi xel);
}
//*** copy a region of the display back onto the display //*** копируем область, взятую с дисплея, обратно на дисплей void copy(int х, int у. int wid. int ht){ glCopyPixels(x. y. wid. ht. GL_COLOR);
}
//*** read BMP file into this pixmap
//*** считываем BMP-файл в эту пиксельную карту
int readBmpFile(char * fname):
//*** write this pixmap tD a BMP file
//*** записываем эту пиксельную карту в BMP-файл
void writeBmpFile(char * fname):
// …others …
// .. .другие функции …