
Опытный
 
Профиль
Группа: Участник
Сообщений: 553
Регистрация: 17.8.2003
Где: Volgograd, Russia
Репутация: 5 Всего: 10
|
HELPER давай почту, пришлю Да жачем ждать. Все на мего низком уровне: Код | ////////////////////////////////////////////////// //////////// 3xbmp.h ////////////////////////////////////////////////// typedef struct _WinBMPFileHeader //заголовок файла { unsigned int /*WORD*/ FileType; unsigned long /*DWORD*/ FileSize; unsigned int /*WORD*/ Reserved_1; unsigned int /*WORD*/ Reserved_2; unsigned long /*DWORD*/ Offset; } WinBMPFileHeader; typedef struct _Win3xBitMapHeader //заголовок изображения { unsigned long /*DWORD*/ Size; signed long /*LONG*/ Width; signed long /*LONG*/ Height; unsigned int /*WORD*/ Planes; unsigned int /*WORD*/ BitPerPixel; unsigned long /*DWORD*/ Compression; unsigned long /*DWORD*/ SizeOfBitmap; signed long /*LONG*/ HorzRezolution; signed long /*LONG*/ VertRezolution; unsigned long /*DWORD*/ ColorsUsed; unsigned long /*DWORD*/ ColorsImportant; } Win3xBitMapHeader; typedef struct _Win3xPaletteElement //палитра { unsigned char /*BYTE*/ Blue; unsigned char /*BYTE*/ Green; unsigned char /*BYTE*/ Red; unsigned char /*BYTE*/ Reserved; } Win3xPaletteElement; typedef struct _Win3xBMPData //данные изображения { unsigned char /*BYTE*/ Blue; unsigned char /*BYTE*/ Green; unsigned char /*BYTE*/ Red; } Win3xBMPData; // ---------------------------------------------------------------------------------------------- ////////////////////////////////////////////////// //////////// funk.cpp //////////////////////////////////////////////////
#include "FUNK.H" #include "DOS.H" #include <iostream.h> #include <conio.h> #include <stdlib.h> //-- //инициализация нового видео режима unsigned int INITVIDEO(const unsigned int NEW_VIDEO) { unsigned int OLD_VIDEO; REGS regs; //-- //узнаем номер текущего видео режима regs.x.ax=0x4f03; int86(0x10,®s,®s); OLD_VIDEO=regs.x.bx; //-- //-- //устанавливаем новый видеорежим regs.x.ax=0x4f02; regs.x.bx=NEW_VIDEO; int86(0x10,®s,®s); //-- return OLD_VIDEO; } //-- //прорисовка точки на экране в указанное место void DRAWPOINT(const unsigned long X,const unsigned long Y,const int R,const int G,const int B,int &WINDOW,const unsigned int RX) { unsigned long SET_POINT_TO; REGS regs; SET_POINT_TO = ( Y * (RX) + X) * 4; //вычисляем сдвиг в памяти if(WINDOW != SET_POINT_TO / 65536) //вычисляем номер окна и сравниваем его с текущим { //окна не совпали (произошел сдвиг за 64 кБайт) //-- //устанавливаем новое окно regs.x.ax = 0x4F05; regs.h.bh = 0; regs.h.bl = 0; regs.x.dx = SET_POINT_TO / 65536; int86(0x10,®s,®s); WINDOW = SET_POINT_TO / 65536; //-- } //-- //прорисовываем точку на экране pokeb(0xA000,SET_POINT_TO ,B); pokeb(0xA000,SET_POINT_TO + 1 ,G); pokeb(0xA000,SET_POINT_TO + 2 ,R); pokeb(0xA000,SET_POINT_TO + 3 ,0); //-- } //-- //очистка экрана //прорисовка четырех угольника на экран с указанными координатами углов void DRAWQUADRANGLE(const unsigned long X1,const unsigned long Y1,const unsigned long X2,const unsigned long Y2,const int R,const int G,const int B,int &WINDOW,int RX) { unsigned long x1,x2,y1,y2,x,y; //-- //левый верхний, правый нижний if(X1<X2) { x1=X1; x2=X2; } else { x1=X2; x2=X1; } if(Y1<Y2) { y1=Y1; y2=Y2; } else { y1=Y2; y2=Y1; } //-- //рисуем саму фигуру for(x=x1;x<=x2;x++) { for(y=y1;y<=y2;y++) { DRAWPOINT(x,y,R,G,B,WINDOW,RX); } } //-- } void INFO(char *STROKA) { cout<<STROKA<<flush; cout<<"Press any key to continue..."<<flush; getch(); exit(1); } void ERRORR(char *STROKA) { cout<<STROKA<<flush; cout<<"Press any key to continue..."<<flush; getch(); exit(1); } // ---------------------------------------------------------------------------------------------- ////////////////////////////////////////////////// //////////// funk.h ////////////////////////////////////////////////// unsigned int INITVIDEO(const unsigned int NEW_VIDEO); void DRAWQUADRANGLE(const unsigned long X1,const unsigned long Y1,const unsigned long X2,const unsigned long Y2,const int R,const int G,const int B,int &WINDOW,int RX); void DRAWPOINT(const unsigned long X,const unsigned long Y,const int R,const int G,const int B,int &WINDOW,const unsigned int RX); void INFO(char *STROKA); void ERRORR(char *STROKA); // ---------------------------------------------------------------------------------------------- ////////////////////////////////////////////////// //////////// win3xbmp.cpp ////////////////////////////////////////////////// #include "WIN3XBMP.h" #include "FUNK.H" //доп. функции работы с графикой #include <STDIO.H> #include <STRING.H> #include <IOSTREAM.H> WIN3XBMP::WIN3XBMP(char *STROKA) { //char *EERROR; FILE* F; int i,x,y; //-- //выделяем память под PathToBMP=new char[strlen(STROKA)];strcpy(PathToBMP,STROKA); //считываем путь к файлу X = 0;Y = 0; //начальные коодинаты изображеня //try //{ F = fopen(PathToBMP,"r"); //открываем файл по указанному пути //} //catch(...) //{ // EERROR = new char[strlen(PathToBMP)+strlen("Can't open file: ")]; // strcpy(EERROR,"Can't open file: ");strcat(EERROR,PathToBMP); // throw EERROR; //} //try //{ fread(&FileHeader,sizeof(_WinBMPFileHeader),1,F); //считываем заголовок файла fread(&BitMapHeader,sizeof(_Win3xBitMapHeader),1,F); //считываем заголовок изображения //} //try //{ BMPData = new _Win3xBMPData[BitMapHeader.Width*BitMapHeader.Height]; //выделяем память под данные картинки Win3xBMPData *TEMPDATA = BMPData; if(BitMapHeader.BitPerPixel < 24) //проверяем, есть ли палитра { PaletteElement = new _Win3xPaletteElement[256]; //если есть, то выделяем память //-- //загружаем в файл Win3xPaletteElement *TEMPPALLETE = PaletteElement; unsigned char color; for(i=0;i<256;i++) { fread(TEMPPALLETE++,sizeof(_Win3xPaletteElement),1,F); } //-- fseek(F,FileHeader.Offset,0); //устанавливаем указатель на файл, в место начала данных изображения //-- //считываем данные изображения по точке и печатаем с соответствующими координатами на экран for(y=BitMapHeader.Height;y>0;y--) { for(x=0;x<BitMapHeader.Width;x++) { fread(&color,sizeof(unsigned char),1,F); TEMPDATA->Red = (PaletteElement+color)->Red; TEMPDATA->Blue = (PaletteElement+color)->Blue; TEMPDATA->Green = (PaletteElement+color)->Green; TEMPDATA++; } } //-- } else //просто загружаем данные изображения из файла { fseek(F,FileHeader.Offset,0); //устанавливаем указатель на файл, в место начала данных изображения //-- //считываем данные изображения по точке и печатаем с соответствующими координатами на экран for(y=BitMapHeader.Height;y>0;y--) { for(x=0;x<BitMapHeader.Width;x++) { fread(TEMPDATA++,sizeof(_Win3xBMPData),1,F); } } //-- } //} /*catch(...) { // EERROR = new char[strlen(PathToBMP)+strlen("Can't open file: ")]; // strcpy(EERROR,"Can't find memory: ");strcat(EERROR,PathToBMP); // throw EERROR; }*/
fclose(F); //закрываем файл } WIN3XBMP::~WIN3XBMP() { //-- //удаляем все что сами создали delete PathToBMP; //if(PaletteElement) { delete PaletteElement; } //if(BMPData) { delete BMPData; } //-- } void WIN3XBMP::PrintToXY(const unsigned int MOVE_X,const unsigned int MOVE_Y) { int x,y,WINDOW,RX; //координаты, номер окна памяти, разрешение экрана по горизонтали Win3xBMPData *TEMPDATA = BMPData; //FILE* F; //файл BMP //-- //сохраняем координаты изображения X = MOVE_X; Y = MOVE_Y; //-- //F = fopen(PathToBMP,"r"); WINDOW = 0; RX = 1024; //-- //fseek(F,FileHeader->Offset,0); //устанавливаем указатель на файл, в место начала данных изображения //-- //считываем данные изображения по точке и печатаем с соответствующими координатами на экран for(y=BitMapHeader.Height;y>0;y--) { for(x=0;x<BitMapHeader.Width;x++) { //fread(PaletteElement,sizeof(_Win3xPaletteElement),1,F); //DRAWPOINT(MOVE_X + x,MOVE_Y + y,PaletteElement->Red,PaletteElement->Green,PaletteElement->Blue,WINDOW,RX); DRAWPOINT(MOVE_X + x,MOVE_Y + y,TEMPDATA->Red,TEMPDATA->Green,TEMPDATA->Blue,WINDOW,RX); TEMPDATA++; } } //-- //fclose(F); } void WIN3XBMP::MoveToXY(const unsigned int MOVE_X,const unsigned int MOVE_Y) { int x,y,WINDOW,RX; //координаты, номер окна памяти, разрешение экрана по горизонтали Win3xBMPData *TEMPDATA = BMPData; //FILE* F; //файл BMP //F = fopen(PathToBMP,"r"); WINDOW = 0; RX = 1024; //-- //fseek(F,FileHeader->Offset,0); //устанавливаем указатель на файл, в место начала данных изображения //-- //стираем старые куски картинки DRAWQUADRANGLE(MOVE_X,MOVE_Y + BitMapHeader.Height+1,X + BitMapHeader.Width,Y + BitMapHeader.Height,0,0,0,WINDOW,RX); DRAWQUADRANGLE(X,Y,MOVE_X + BitMapHeader.Width,MOVE_Y-1,0,0,0,WINDOW,RX); DRAWQUADRANGLE(X,Y,MOVE_X-1,MOVE_Y + BitMapHeader.Height,0,0,0,WINDOW,RX); DRAWQUADRANGLE(MOVE_X + BitMapHeader.Width+1,MOVE_Y,X + BitMapHeader.Width,Y + BitMapHeader.Height,0,0,0,WINDOW,RX); //-- //сохраняем координаты изображения X = MOVE_X; Y = MOVE_Y; //-- //считываем данные изображения по точке и печатаем с соответствующими координатами на экран for(y=BitMapHeader.Height;y>0;y--) { for(x=0;x<BitMapHeader.Width;x++) { //fread(PaletteElement,sizeof(_Win3xPaletteElement),1,F); //DRAWPOINT(MOVE_X + x,MOVE_Y + y,PaletteElement->Red,PaletteElement->Green,PaletteElement->Blue,WINDOW,RX); DRAWPOINT(MOVE_X + x,MOVE_Y + y,TEMPDATA->Red,TEMPDATA->Green,TEMPDATA->Blue,WINDOW,RX); TEMPDATA++; } } //-- //fclose(F); } void WIN3XBMP::ShowInfo() { cout<<"WinBMPFileHeader:\n"; cout<<"{\n"; cout<<"FileType = "<<FileHeader.FileType<<"\n"; cout<<"FileSize = "<<FileHeader.FileSize<<"\n"; cout<<"Reserved_1 = "<<FileHeader.Reserved_1<<"\n"; cout<<"Reserved_2 = "<<FileHeader.Reserved_2<<"\n"; cout<<"Offset = "<<FileHeader.Offset<<"\n"; cout<<"}\n"; cout<<"Win3xBitMapHeader:\n"; cout<<"{\n"; cout<<"Size = "<<BitMapHeader.Size<<"\n"; cout<<"Width = "<<BitMapHeader.Width<<"\n"; cout<<"Height = "<<BitMapHeader.Height<<"\n"; cout<<"Planes = "<<BitMapHeader.Planes<<"\n"; cout<<"BitPerPixel = "<<BitMapHeader.BitPerPixel<<"\n"; cout<<"Compression = "<<BitMapHeader.Compression<<"\n"; cout<<"SizeOfBitmap = "<<BitMapHeader.SizeOfBitmap<<"\n"; cout<<"HorzRezolution = "<<BitMapHeader.HorzRezolution<<"\n"; cout<<"VertRezolution = "<<BitMapHeader.VertRezolution<<"\n"; cout<<"ColorsUsed = "<<BitMapHeader.ColorsUsed<<"\n"; cout<<"ColorsImportant = "<<BitMapHeader.ColorsImportant<<"\n"; cout<<"}\n"<<flush; } // ---------------------------------------------------------------------------------------------- ////////////////////////////////////////////////// //////////// win3xbmp.h ////////////////////////////////////////////////// #ifndef WIN3XBMPH #define WIN3XBMPH #include "3XBMP.H" class WIN3XBMP { public: WIN3XBMP(char *); //конструктор virtual ~WIN3XBMP(); //деструктор void PrintToXY(const unsigned int,const unsigned int); //вывод BMP файла на экран с указанным смещением (координаты левого верхнего угла) void MoveToXY(const unsigned int,const unsigned int); //сдвиг уже напечатанного изображения в указанное место void ShowInfo(); //информация о файле protected: //-- //данные WinBMPFileHeader FileHeader; //заголовок файла Win3xBitMapHeader BitMapHeader; //заголовок изображения Win3xPaletteElement *PaletteElement; //палитра изображеня Win3xBMPData *BMPData; //данные изображения unsigned int X,Y; //начальные координаты изображения char *PathToBMP; //путь к BMP файлу //-- }; #endif // ----------------------------------------------------------------------------------------------
|
Вот так значит. Не судите строго люди, писал когда ещё не знал что такое ptr (может быть утечка, а попробуйка найди  )....И к сожадению под DOS нет исключений... Компилятор BC++ 3.1, Это сообщение отредактировал(а) np9mi7 - 19.4.2005, 19:37
|