#include <iostream>
#include <cstring>
#include "glut.h"
#include <cstdlib>
using namespace std;
int color = 1; // переменная, отвечающая за изменение цвета. По умолчанию она равна 1.
string str = "";
//int temp = 100;
GLubyte space[] =
{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };// символ пробела
GLubyte letters[][13] = {
{ 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0x66, 0x3c, 0x18 },
{ 0x00, 0x00, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe },
{ 0x00, 0x00, 0x7e, 0xe7, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e },
{ 0x00, 0x00, 0xfc, 0xce, 0xc7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc7, 0xce, 0xfc },
{ 0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xc0, 0xff },
{ 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfc, 0xc0, 0xc0, 0xc0, 0xff },
{ 0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xcf, 0xc0, 0xc0, 0xc0, 0xc0, 0xe7, 0x7e },
{ 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3 },
{ 0x00, 0x00, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7e },
{ 0x00, 0x00, 0x7c, 0xee, 0xc6, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06 },
{ 0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xe0, 0xf0, 0xd8, 0xcc, 0xc6, 0xc3 },
{ 0x00, 0x00, 0xff, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0 },
{ 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xdb, 0xff, 0xff, 0xe7, 0xc3 },
{ 0x00, 0x00, 0xc7, 0xc7, 0xcf, 0xcf, 0xdf, 0xdb, 0xfb, 0xf3, 0xf3, 0xe3, 0xe3 },
{ 0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xe7, 0x7e },
{ 0x00, 0x00, 0xc0, 0xc0, 0xc0, 0xc0, 0xc0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe },
{ 0x00, 0x00, 0x3f, 0x6e, 0xdf, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0x66, 0x3c },
{ 0x00, 0x00, 0xc3, 0xc6, 0xcc, 0xd8, 0xf0, 0xfe, 0xc7, 0xc3, 0xc3, 0xc7, 0xfe },
{ 0x00, 0x00, 0x7e, 0xe7, 0x03, 0x03, 0x07, 0x7e, 0xe0, 0xc0, 0xc0, 0xe7, 0x7e },
{ 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0xff },
{ 0x00, 0x00, 0x7e, 0xe7, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3 },
{ 0x00, 0x00, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3 },
{ 0x00, 0x00, 0xc3, 0xe7, 0xff, 0xff, 0xdb, 0xdb, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3 },
{ 0x00, 0x00, 0xc3, 0x66, 0x66, 0x3c, 0x3c, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3 },
{ 0x00, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x3c, 0x3c, 0x66, 0x66, 0xc3 },
{ 0x00, 0x00, 0xff, 0xc0, 0xc0, 0x60, 0x30, 0x7e, 0x0c, 0x06, 0x03, 0x03, 0xff }
}; // символы английской расскладки(только буквы)
GLuint fontOffset;
void makeRasterFont(void) // получение изображения символов
{
GLuint i, j;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // выравнивание
fontOffset = glGenLists(128);
for (i = 0, j = 'A'; i < 26; i++, j++) {
glNewList(fontOffset + j, GL_COMPILE);
glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, letters[i]); // отображают отдельный битовый массив на экране
glEndList();
}
glNewList(fontOffset + ' ', GL_COMPILE);
glBitmap(8, 13, 0.0, 2.0, 10.0, 0.0, space);
glEndList();
}
void init1(void) // функция, инициализирующая нашу модель
{
glShadeModel(GL_FLAT);
makeRasterFont();
}
void printString(char *s) // функция, выводящая на экран нарисованную строку
{
glPushAttrib(GL_LIST_BIT);
glListBase(fontOffset); // используется для задания смещения
glCallLists(strlen(s), GL_UNSIGNED_BYTE, (GLubyte *)s); //
glPopAttrib();
}
void display1(void) // дисплей шрифтов
{
GLfloat white[3] = { 1.0, 1.0, 1.0 };
GLfloat black[3] = { 0.0, 0.0, 0.0 };
GLfloat red[3] = { 1.0, 0.0, 0.0 };
GLfloat green[3] = { 0.0, 1.0, 0.0 };
GLfloat blue[3] = { 0.0, 0.0, 1.0 };
glClear(GL_COLOR_BUFFER_BIT); // очистка буфера цвета
if (color == 1)
glColor3fv(white);
else if(color == 2)
glColor3fv(black);
else if (color == 3)
glColor3fv(red);
else if (color == 4)
glColor3fv(green);
else if (color == 5)
glColor3fv(blue);
glRasterPos2i(20, 60); // отступ снизу и слева, позиция растра
printString(&str[0]);
glFlush();
}
/* Действие при изменении размеров окна */
void reshape1(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, w, 0.0, h, -1.0, 1.0);
glMatrixMode(GL_MODELVIEW);
}
void keyboard1(unsigned char key, int x, int y) // функция для работы с клавиатурой
{
switch (key) {
case 'a':
str += 'A';
display1();
break;
case 'b':
str += 'B';
display1();
break;
case 'c':
str += 'C';
display1();
break;
case 'd':
str += 'D';
display1();
break;
case 'e':
str += 'E';
display1();
break;
case 'f':
str += 'F';
display1();
break;
case 'g':
str += 'G';
display1();
break;
case 'h':
str += 'H';
display1();
break;
case 'i':
str += 'I';
display1();
break;
case 'j':
str += 'J';
display1();
break;
case 'k':
str += 'K';
display1();
break;
case 'l':
str += 'L';
display1();
break;
case 'm':
str += 'M';
display1();
break;
case 'n':
str += 'N';
display1();
break;
case 'o':
str += 'O';
display1();
break;
case 'p':
str += 'P';
display1();
break;
case 'q':
str += 'Q';
display1();
break;
case 'r':
str += 'R';
display1();
break;
case 's':
str += 'S';
display1();
break;
case 't':
str += 'T';
display1();
break;
case 'u':
str += 'U';
display1();
break;
case 'v':
str += 'V';
display1();
break;
case 'w':
str += 'W';
display1();
break;
case 'x':
str += 'X';
display1();
break;
case 'y':
str += 'Y';
display1();
break;
case 'z':
str += 'Z';
display1();
break;
case ' ':
str += ' ';
display1();
break;
case 8:
if (!str.empty())
str.pop_back();
display1();
break;
case '1':
color = 1;
display1();
break;
case '2':
color = 2;
display1();
break;
case '3':
color = 3;
display1();
break;
case '4':
color = 4;
display1();
break;
case '5':
color = 5;
display1();
break;
}
}
#define checkImageWidth 64
#define checkImageHeight 64
GLubyte checkImage[checkImageHeight][checkImageWidth][3];
static GLdouble zoomFactor = 1.0;
static GLint height;
/* Происходит генерация изображения, которое помещается в битовый массив */
void makeCheckImage(void)
{
int i, j, c;
for (i = 0; i < checkImageHeight; i++) {
for (j = 0; j < checkImageWidth; j++) {
c = ((((i & 0x8) == 0) ^ ((j & 0x8)) == 0)) * 255;
checkImage[i][j][0] = (GLubyte)c;
checkImage[i][j][1] = (GLubyte)c;
checkImage[i][j][2] = (GLubyte)c;
}
}
}
void init2(void)
{
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
makeCheckImage();
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // задает метод хранения данных битового образа в памяти компьютера
}
void display2(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glRasterPos2i(0, 0);
glDrawPixels(checkImageWidth, checkImageHeight, GL_RGB,
GL_UNSIGNED_BYTE, checkImage); //записывает прямоугольный массив пикселей из данных, хранимых в памяти процессора
glFlush();
//GL_RGB красный компонент цвета. сопровождающийся зеленым и синим компонентом цвета
}
void reshape2(int w, int h)
{
glViewport(0, 0, (GLsizei)w, (GLsizei)h);
height = (GLint)h;
glMatrixMode(GL_PROJECTION); //
glLoadIdentity();
gluOrtho2D(0.0, (GLdouble)w, 0.0, (GLdouble)h);
glMatrixMode(GL_MODELVIEW); //
glLoadIdentity();
}
/* Действие, которое происходит при взаимодействии с мышкой */
void motion(int x, int y)
{
static GLint screeny;
screeny = height - (GLint)y;
glRasterPos2i(x, screeny);
glPixelZoom(zoomFactor, zoomFactor);
glCopyPixels(0, 0, checkImageWidth, checkImageHeight,
GL_COLOR); //копирует пиксели в буфер кадра
glPixelZoom(1.0, 1.0); //устанавливаем размер пикселя
glFlush(); // прорисовка экрана
}
void keyboard2(unsigned char key, int x, int y)
{
switch (key) {
case 'r':
zoomFactor = 1.0;
glutPostRedisplay();
printf("Коэффициент масштаба возвращен в значение 1.0\n");
break;
case '+':
zoomFactor += 0.5;
if (zoomFactor >= 3.0)
zoomFactor = 3.0;
printf("Коэффициент масштаба - %4.1f\n", zoomFactor);
break;
case '-':
zoomFactor -= 0.5;
if (zoomFactor <= 0.5)
zoomFactor = 0.5;
printf("Коэффициент масштаба - %4.1f\n", zoomFactor);
break;
case 27:
break;
default:
exit(0);
break;
}
}
int main(int argc, char** argv)
{
setlocale(LC_CTYPE, "Russian");
system("title Инструкция");
cout << "Приложение Шрифты" << endl;
cout << "Для выбора цвета шрифта нажмите:" << endl;
cout << "1- белый, 2-черный, 3 - красный, 4 - зеленый, 5 -синий" << endl;
cout << "Для печати текста набирайте слова на клавиатуре." << endl << "Поддерживается только английская раскладка" << endl << endl;
cout << "Приложение Вывод пикселей" << endl;
cout << "Нажмите мышкой на свободную область окна для рисования изображения" << endl;
cout << "Клавиши + и - служат для изменения масштаба" << endl;
cout << "Клавиша r позволяет очистить окно" << endl << endl;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
/*Создание окна приложения Шрифты*/
glutInitWindowSize(1000, 100);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
glutSetWindowTitle("Шрифты");
init1();
glutReshapeFunc(reshape1);
glutKeyboardFunc(keyboard1);
glutDisplayFunc(display1);
/*Создание окна приложения Вывод пикселей*/
glutInitWindowSize(250, 250);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
glutSetWindowTitle("Вывод пикселей");
init2();
glutDisplayFunc(display2);
glutReshapeFunc(reshape2);
glutKeyboardFunc(keyboard2);
glutMotionFunc(motion);
glutMainLoop(); // запуск программы
return 0;
}