//Автор: Иванченко Леонид Васильевич
//MyGraph.cpp

#include <windows.h>   // include important windows stuff//Главный заголовочный файл
#include <windowsx.h>  //Набор макросов
#include <mmsystem.h>
#include <math.h>

#include <ddraw.h>  // directX includes
//**************************
#include "main.h"
#include "DirectDraw.h"
#include "MyGraph.h"
#include "ResFile.h"
//**************************
//--------------------------------------------------------
// Расчитывает новое значение частоты смены кадров
//--------------------------------------------------------
int UpdateFPS()
{
	static const long lPeriod=10;
	static long lFrameNumber=0;
	static DWORD dwPrevTime;
	static DWORD dwCurTime;
	static int nFps=0;

	lFrameNumber+=1;
	//Период истёк - вычисляем новое FPS
	if (lFrameNumber==lPeriod)
	{
		dwPrevTime=dwCurTime;
		dwCurTime=timeGetTime();

		double fSeconds=double(dwCurTime-dwPrevTime)/(double)1000;
		nFps=(int)((double)lFrameNumber/fSeconds);

		lFrameNumber=0;
	}
	return nFps;
}
//--------------------------------------------------------
//получение случайного числа типа - int
int randInt( int low, int high )
{
    int range = high - low;
    int num = rand() % range;
    return( num + low );
}
//--------------------------------------------------------
//получение случайного числа типа - double
double randDouble( double low, double high )
{
    double range = high - low;
    double num = range * (double)rand()/(double)RAND_MAX;
    return( num + low );
}
//--------------------------------------------------------
//rectangle,box - не требуют указания ScreenPtr, так как они используют функцию Blt
//рисование прямоугольника
void rectangle(int x,int y,int width,int height,DWORD c1,DWORD c2)
{
	if(!bActive)return;
	//Объявление структуры ddbltfx 
    DDBLTFX ddbltfx;
    ZeroMemory(&ddbltfx, sizeof(ddbltfx));
    ddbltfx.dwSize = sizeof(ddbltfx);
	//структура размеров заполняемого прямоугольник
	RECT rect;  
	// установление цвета заполнения
	ddbltfx.dwFillColor = c2; 
	//рисование нижней горизонтальной линии
	rect.left=x; rect.top=y+height-1; rect.right=x+width; rect.bottom=y+height;
	buffer->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
	//рисование правой вертикальной линии
	rect.left=x+width-1; rect.top=y; rect.right=x+width; rect.bottom=y+height;
	buffer->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
	// установление цвета заполнения
	ddbltfx.dwFillColor = c1; 
	//рисование верхней горизонтальной линии
	rect.left=x; rect.top=y; rect.right=x+width; rect.bottom=y+1;
	buffer->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
	//рисование левой вертикальной линии
	rect.left=x; rect.top=y; rect.right=x+1; rect.bottom=y+height;
	buffer->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
}
//рисование прямоугольника
void rectangle(int x,int y,int width,int height,DWORD c1,DWORD c2,LPDIRECTDRAWSURFACE7 surface)
{
	if(!bActive)return;
	//Объявление структуры ddbltfx 
    DDBLTFX ddbltfx;
    ZeroMemory(&ddbltfx, sizeof(ddbltfx));
    ddbltfx.dwSize = sizeof(ddbltfx);
	//структура размеров заполняемого прямоугольник
	RECT rect;  
	// установление цвета заполнения
	ddbltfx.dwFillColor = c2; 
	//рисование нижней горизонтальной линии
	rect.left=x; rect.top=y+height-1; rect.right=x+width; rect.bottom=y+height;
	surface->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
	//рисование правой вертикальной линии
	rect.left=x+width-1; rect.top=y; rect.right=x+width; rect.bottom=y+height;
	surface->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
	// установление цвета заполнения
	ddbltfx.dwFillColor = c1; 
	//рисование верхней горизонтальной линии
	rect.left=x; rect.top=y; rect.right=x+width; rect.bottom=y+1;
	surface->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
	//рисование левой вертикальной линии
	rect.left=x; rect.top=y; rect.right=x+1; rect.bottom=y+height;
	surface->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
}
//перегруженная функция с заданием одного цвета для всех сторон
void rectangle(int x,int y,int width,int height,DWORD c)
{
	if(!bActive)return;
	//Объявление структуры ddbltfx 
    DDBLTFX ddbltfx;
    ZeroMemory(&ddbltfx, sizeof(ddbltfx));
    ddbltfx.dwSize = sizeof(ddbltfx);
	// установление цвета заполнения
	ddbltfx.dwFillColor = c; 
	//структура размеров заполняемого прямоугольник
	RECT rect;  
	//рисование нижней горизонтальной линии
	rect.left=x; rect.top=y+height-1; rect.right=x+width; rect.bottom=y+height;
	buffer->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
	//рисование правой вертикальной линии
	rect.left=x+width-1; rect.top=y; rect.right=x+width; rect.bottom=y+height;
	buffer->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
	//рисование верхней горизонтальной линии
	rect.left=x; rect.top=y; rect.right=x+width; rect.bottom=y+1;
	buffer->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
	//рисование левой вертикальной линии
	rect.left=x; rect.top=y; rect.right=x+1; rect.bottom=y+height;
	buffer->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
}
//перегруженная функция с заданием одного цвета для всех сторон
void rectangle(int x,int y,int width,int height,DWORD c,LPDIRECTDRAWSURFACE7 surface)
{
	if(!bActive)return;
	//Объявление структуры ddbltfx 
    DDBLTFX ddbltfx;
    ZeroMemory(&ddbltfx, sizeof(ddbltfx));
    ddbltfx.dwSize = sizeof(ddbltfx);
	// установление цвета заполнения
	ddbltfx.dwFillColor = c; 
	//структура размеров заполняемого прямоугольник
	RECT rect;  
	//рисование нижней горизонтальной линии
	rect.left=x; rect.top=y+height-1; rect.right=x+width; rect.bottom=y+height;
	surface->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
	//рисование правой вертикальной линии
	rect.left=x+width-1; rect.top=y; rect.right=x+width; rect.bottom=y+height;
	surface->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
	//рисование верхней горизонтальной линии
	rect.left=x; rect.top=y; rect.right=x+width; rect.bottom=y+1;
	surface->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
	//рисование левой вертикальной линии
	rect.left=x; rect.top=y; rect.right=x+1; rect.bottom=y+height;
	surface->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
}
//-------------------------------------------------------------------------
//рисование клиппированного прямоугольника
void rectangle_clip(int x,int y,int width,int height//положение и размеры прямоугольника
					,int clip_x,int clip_y,//видимая отсекаемая область
					int clip_w,int clip_h//
					,DWORD color)//цвет
{
	bool r1=false,r2=false,r3=false,r4=false;
	//определить разрешено ли показать отрезок
	if(y>clip_y&&y<clip_y+clip_h)r1=true;
	if(y+height-1>clip_y&&y+height-1<clip_y+clip_h)r2=true;
	if(x>clip_x&&x<clip_x+clip_w)r3=true;
	if(x+width-1>clip_x&&x+width-1<clip_x+clip_w)r4=true;
	//---------------------
	//проверка на выход за пределы
	if(x<0){width=width-(x*-1);x=0;}
	if(y<0){height=height-(y*-1);y=0;}
	//клиппирование
	if(x<clip_x){width=width-(clip_x-x);x=clip_x;}
	if(x+width>clip_x+clip_w){width=clip_x+clip_w-x;}
	//--
	if(y<clip_y){height=height-(clip_y-y);y=clip_y;}
	if(y+height>clip_y+clip_h){height=clip_y+clip_h-y;}
	//---------------------
	//рисование прямоугольника
	//горизонтальные линии
	if(r1)box(x,y,width,1,color);//если разрешено показать отрезок
	if(r2)box(x,y+height-1,width,1,color);
	//вертикальные линии
	if(r3)box(x,y,1,height,color);
	if(r4)box(x+width-1,y,1,height,color);
}
//рисование клиппированного прямоугольника
void rectangle_clip(int x,int y,int width,int height//положение и размеры прямоугольника
					,int clip_x,int clip_y,//видимая отсекаемая область
					int clip_w,int clip_h//
					,DWORD color,LPDIRECTDRAWSURFACE7 surface)//цвет
{
	bool r1=false,r2=false,r3=false,r4=false;
	//определить разрешено ли показать отрезок
	if(y>clip_y&&y<clip_y+clip_h)r1=true;
	if(y+height-1>clip_y&&y+height-1<clip_y+clip_h)r2=true;
	if(x>clip_x&&x<clip_x+clip_w)r3=true;
	if(x+width-1>clip_x&&x+width-1<clip_x+clip_w)r4=true;
	//---------------------
	//проверка на выход за пределы
	if(x<0){width=width-(x*-1);x=0;}
	if(y<0){height=height-(y*-1);y=0;}
	//клиппирование
	if(x<clip_x){width=width-(clip_x-x);x=clip_x;}
	if(x+width>clip_x+clip_w){width=clip_x+clip_w-x;}
	//--
	if(y<clip_y){height=height-(clip_y-y);y=clip_y;}
	if(y+height>clip_y+clip_h){height=clip_y+clip_h-y;}
	//---------------------
	//рисование прямоугольника
	//горизонтальные линии
	if(r1)box(x,y,width,1,color,surface);//если разрешено показать отрезок
	if(r2)box(x,y+height-1,width,1,color,surface);
	//вертикальные линии
	if(r3)box(x,y,1,height,color,surface);
	if(r4)box(x+width-1,y,1,height,color,surface);
}
//клипированый заполненный прямоугольник
void box_clip(int x,int y,int width,int height,int c_x,int c_y,int c_w,int c_h,DWORD color)
{
	if(!bActive)return;
	//клипирование(урезание невидимых частей) выводимого прямоугольника
	if(x<c_x){ width=width-(c_x-x); x=c_x;if(width>c_w)width=c_w;}
	if(y<c_y){ height=height-(c_y-y); y=c_y;if(height>c_h)height=c_h;}
	if(x+width>c_x+c_w)width=c_w-(x-c_x);
	if(y+height>c_y+c_h)height=c_h-(y-c_y);
	//---------------
	//Объявление структуры ddbltfx 
    DDBLTFX ddbltfx;ZeroMemory(&ddbltfx, sizeof(ddbltfx));
    ddbltfx.dwSize = sizeof(ddbltfx);ddbltfx.dwFillColor = color;RECT rect;  
	rect.left=x; rect.top=y;rect.right=x+width; rect.bottom=y+height;
	//рисование заполненного прямоугольника с помощью 
	buffer->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
}
void box_clip(int x,int y,int width,int height,int c_x,int c_y,int c_w,int c_h,
			  DWORD color,LPDIRECTDRAWSURFACE7 surface)
{
	if(!bActive)return;
	//клипирование(урезание невидимых частей) выводимого прямоугольника
	if(x<c_x){ width=width-(c_x-x); x=c_x;if(width>c_w)width=c_w;}
	if(y<c_y){ height=height-(c_y-y); y=c_y;if(height>c_h)height=c_h;}
	if(x+width>c_x+c_w)width=c_w-(x-c_x);
	if(y+height>c_y+c_h)height=c_h-(y-c_y);
	//---------------
	//Объявление структуры ddbltfx 
    DDBLTFX ddbltfx;ZeroMemory(&ddbltfx, sizeof(ddbltfx));
    ddbltfx.dwSize = sizeof(ddbltfx);ddbltfx.dwFillColor = color;RECT rect;  
	rect.left=x; rect.top=y;rect.right=x+width; rect.bottom=y+height;
	//рисование заполненного прямоугольника с помощью 
	surface->Blt(&rect,NULL,NULL,DDBLT_COLORFILL | DDBLT_WAIT,&ddbltfx);
}
void box(int x,int y,int width,int height,DWORD color)
{
	if(!bActive)return;
	//Объявление структуры ddbltfx 
    DDBLTFX ddbltfx;
    ZeroMemory(&ddbltfx, sizeof(ddbltfx));
    ddbltfx.dwSize = sizeof(ddbltfx);
	// установление цвета заполнения
	ddbltfx.dwFillColor = color;
	//структура размеров заполняемого прямоугольник
	RECT rect;  
	//заполнение структуры rect
	rect.left=x; rect.top=y;
	rect.right=x+width; rect.bottom=y+height;
	//рисование заполненного прямоугольника с помощью 
	buffer->Blt(&rect, //адрес структуры 
			   NULL,       // адресс поверхности-источника, он нам без надобности
			   NULL,       // адресс структуры свойств поверхности-источника, тоже не нужен
			   DDBLT_COLORFILL | DDBLT_WAIT,   //ждать полного заполнения прямоугольника                  
			   &ddbltfx);  //DDBLTFX structure
}
//заполнение прямоугольника в заданной поверхности
void box(int x1, int y1, int x2, int y2, DWORD color,LPDIRECTDRAWSURFACE7 surface)
{
	if(!bActive)return;
	//Объявление структуры ddbltfx 
    DDBLTFX ddbltfx;
    ZeroMemory(&ddbltfx, sizeof(ddbltfx));
    ddbltfx.dwSize = sizeof(ddbltfx);
	// установление цвета заполнения
	ddbltfx.dwFillColor = color; 
	//структура размеров заполняемого прямоугольник
	RECT rect;  
	//заполнение структуры rect
	rect.top    = y1;rect.left   = x1;
	rect.bottom = y1+y2;rect.right  = x1+x2;
	//рисование заполненного прямоугольника с помощью 
	surface->Blt(&rect, //адрес структуры 
			   NULL,       // адресс поверхности-источника, он нам без надобности
			   NULL,       // адресс структуры свойств поверхности-источника, тоже не нужен
			   DDBLT_COLORFILL | DDBLT_WAIT,   //ждать полного заполнения прямоугольника                  
			   &ddbltfx);  //DDBLTFX structure
}
//--------------------------------------------------------
//пипетка (возвращает значение пиксела указанного на "экране" вторичного буфера)
DWORD check_color(int x,int y)
{
	void* ScreenPtr=SurfacePointers(buffer);
	if(BIT_MODE==8)
	{
		byte* dest=(byte*)ScreenPtr+y*SizeWindowX+x;
		return dest[0];
	}
	if(BIT_MODE==16)
	{
		USHORT* dest=(USHORT*)ScreenPtr+y*SizeWindowX+x;
		return dest[0];
	}
	if(BIT_MODE==32)
	{
		DWORD* dest=(DWORD*)ScreenPtr+y*SizeWindowX+x;
		return dest[0];
	}
	return (0); //defualt
}
//--------------------------------------------------------
//размер растра в файле
bool bmpfile_size(int* x,int* y,char* filename)//размер растра в файле
{
	ResFile ff1=RReset(filename);
	if(ff1==INVALID_HANDLE_VALUE)return false;
	char d[18];
	char* n=d;
	int tx,ty;
	RBlockRead(ff1,&n,18);
	RBlockRead(ff1,&tx,4);
	RBlockRead(ff1,&ty,4);
	RClose(ff1);
	*x=tx;*y=ty;
	return true;
}
//размер поверхности
bool surface_size(int* x,int* y,LPDIRECTDRAWSURFACE7 pSurface)
{
	DDSURFACEDESC2 ddSurfaceDesc;
	HRESULT hRet;

	ZeroMemory(&ddSurfaceDesc,sizeof(ddSurfaceDesc));
	ddSurfaceDesc.dwSize=sizeof(ddSurfaceDesc);

	hRet=pSurface->Lock(NULL,&ddSurfaceDesc,
			DDLOCK_SURFACEMEMORYPTR | DDLOCK_WAIT,NULL);
	if(FAILED(hRet))
	{
		return (false);
	}
	*x=ddSurfaceDesc.lPitch;
	*y=ddSurfaceDesc.dwHeight;

	pSurface->Unlock(NULL);
	return true;
}
//--------------------------------------------------------
//вывод растра в DirectDraw функцией BltFast - простой блитинг
void BltFast(int x,int y,int dx,int dy,int width,int height,LPDIRECTDRAWSURFACE7 pSurface)
{
	if(!bActive)return;
	RECT rPic;
	//Установка размеров копируемого блока данных
	rPic.left=dx;rPic.top=dy;rPic.right=dx+width;rPic.bottom=dy+height;
	buffer->BltFast(x, y,pSurface,&rPic,DDBLTFAST_WAIT);
}
//-----------------------------------------------------
//вывод растра функцией Blt со стретчингом 
void Blt(int x,int y,int dx,int dy,int width,int height,
					int stretchX,int stretchY,LPDIRECTDRAWSURFACE7 pSurface)
{
	if(!bActive)return;
	if(x<0){dx=dx+(x*-1);width=width-(x*-1);x=0;}
	if(y<0){dy=dy+(y*-1);height=height-(y*-1);y=0;}
	if(x+width>SizeWindowX){width=width-(x+width-SizeWindowX);}
	if(y+height>SizeWindowY){height=height-(y+height-SizeWindowY);}
	RECT rPic;
	RECT rPic2;
	//Установка размеров приемника
	SetRect(&rPic, x, y, x+stretchX, y+stretchY);
	//Установка размеров источника
	SetRect(&rPic2, dx, dy, dx+width, dy+height);
	//Вывод растра
	buffer->Blt(&rPic, pSurface, &rPic2, DDBLT_WAIT,NULL);
}
//---------------------------------------------------------
//вывод растра в DirectDraw функцией BltFast c цветовыми ключами и клипированием
void draw(int x,int y,int dx,int dy,int width,int height,
				  LPDIRECTDRAWSURFACE7 pSurface)//поверхность
{
	if(!bActive)return;
	if(x+width<0||x>SizeWindowX||y+height<0||y>SizeWindowY)return;

	if(x<0){dx=dx+(x*-1);width=width-(x*-1);x=0;}
	if(y<0){dy=dy+(y*-1);height=height-(y*-1);y=0;}
	if(x+width>SizeWindowX){width=width-(x+width-SizeWindowX);}
	if(y+height>SizeWindowY){height=height-(y+height-SizeWindowY);}
	RECT rPic;
	//Установка размеров копируемого блока данных
	SetRect(&rPic, dx, dy, dx+width, dy+height);
	buffer/*куда копировать*/->BltFast(x, y,
			pSurface/*откуда копировать*/,&rPic,DDBLTFAST_SRCCOLORKEY |DDBLTFAST_WAIT);
}
void draw(int x,int y,int dx,int dy,int width,int height,
				  LPDIRECTDRAWSURFACE7 source,LPDIRECTDRAWSURFACE7 dest)
{
	if(!bActive)return;
	if(x+width<0||x>SizeWindowX||y+height<0||y>SizeWindowY)return;

	if(x<0){dx=dx+(x*-1);width=width-(x*-1);x=0;}
	if(y<0){dy=dy+(y*-1);height=height-(y*-1);y=0;}
	if(x+width>SizeWindowX){width=width-(x+width-SizeWindowX);}
	if(y+height>SizeWindowY){height=height-(y+height-SizeWindowY);}
	RECT rPic;
	SetRect(&rPic, dx, dy, dx+width, dy+height);
	dest->BltFast(x, y,source,&rPic,DDBLTFAST_SRCCOLORKEY |DDBLTFAST_WAIT);
}
//--------------------------------------------------------
//возвращает цвет 16 и 32 формата в зависимости от заданного цветового режима
//МОЖНО ПОЛЬЗОВАТЬСЯ ТОЛЬКО ПОСЛЕ ИНИЦИАЛИЗАЦИИ DIRECTDRAW
//Очень медленная функция - поэтому можно использовать только вне цикла игры
DWORD COLOR(BYTE r,BYTE g,BYTE b)
{
	HDC hdc;
	if ((buf->GetDC(&hdc)) == DD_OK)//если контекст определен
	{
		SetBkColor(hdc,RGB(r,g,b));//цвет фона
		TextOut(hdc,0,0," ",1);//выводим текст
		buf->ReleaseDC(hdc);//удаляем
	}else return 0;
	void* ScreenPtr=SurfacePointers(buf);
	if(BIT_MODE==8)
	{
		byte* dest=(byte*)ScreenPtr;//определяем адресс
		return dest[0];//возвращаем номер цвета
	}
	if(BIT_MODE==16)
	{
		USHORT* dest=(USHORT*)ScreenPtr;
		return dest[0];
	}
	if(BIT_MODE==32)
	{
		DWORD* dest=(DWORD*)ScreenPtr;
		return dest[0];
	}
	return 0;
}
//---------------------------------------------
//Печать текстов - цвет задается только RGB(N,N,N) т.к. TextOut пользуется 32-битным цветом
// или 32-битным числом например: 3048657 , но это неудобно проще пользоваться функцией RGB
void print(int x,int y,UINT size,COLORREF color,char* str)
{
	if(!bActive)return;
	HDC hdc;
	HFONT hfont;
	if ((buffer->GetDC(&hdc)) == DD_OK)//если контекст определен
	{
		//Создать шрифт
		hfont=CreateFont(size,0,0,0,FW_BOLD/*FW_NORMAL*/,false,false,false,
			   ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
			   VARIABLE_PITCH,"Arial Cyr");//задать имя фонта
		SelectFont(hdc,hfont);//устанавливаем шрифт
		SetTextColor(hdc,color);//цвет шрифта
		SetBkMode(hdc,TRANSPARENT);//прозрачный фон
		TextOut(hdc,x,y,str,strlen(str));//выводим текст
		buffer->ReleaseDC(hdc);//удаляем
		DeleteFont(hfont);//удаляем
	}
}
//----------------------------------------------
//Сохранение части растра на диске в формате BMP
bool save_bmp(int x,int y,int w,int h,LPDIRECTDRAWSURFACE7 pSurface,char* fileName)
{
	int mode=BIT_MODE,add;
	if(mode==8)add=1;
	if(mode==16)add=2;
	if(mode==32)add=4;
	ResFile ff1=RRewrite(fileName);
	if(ff1==INVALID_HANDLE_VALUE)return (false);
	//Запись заголовка файла BMP *****************************
	// BITMAPFILEHEADER  -
	char* per="BM";
	RBlockWrite(ff1,per,2);
	DWORD dpr=w*h;
	RBlockWrite(ff1,&dpr,4);
	word pr=0;
	RBlockWrite(ff1,&pr,2);//0
	RBlockWrite(ff1,&pr,2);//0
	if(mode==8)dpr=14+40+256*4;
	else dpr=14+40;
	RBlockWrite(ff1,&dpr,4);
	//  BITMAPINFOHEADER  -
	dpr=40;
	RBlockWrite(ff1,&dpr,4);
	dpr=w;
	RBlockWrite(ff1,&dpr,4);
	dpr=h;
	RBlockWrite(ff1,&dpr,4);
	pr=1;
	RBlockWrite(ff1,&pr,2);
	pr=mode;
	RBlockWrite(ff1,&pr,2);
	dpr=0;
	RBlockWrite(ff1,&dpr,4);
	dpr=w*h*add;
	RBlockWrite(ff1,&dpr,4);
	dpr=0;
	RBlockWrite(ff1,&dpr,4);
	dpr=0;
	RBlockWrite(ff1,&dpr,4);
	dpr=0;
	RBlockWrite(ff1,&dpr,4);
	dpr=0;
	RBlockWrite(ff1,&dpr,4);

	if(mode==8)
	{
		for(int r=0;r<256;r++)
		{
			RBlockWrite(ff1,&palEntries[r].peBlue,1);
			RBlockWrite(ff1,&palEntries[r].peGreen,1);
			RBlockWrite(ff1,&palEntries[r].peRed,1);
			RBlockWrite(ff1,&palEntries[r].peFlags,1);
		}
	}
	//Запись растра в файл **********************************
	char* buf=SurfacePointers(pSurface);//вычисление адресса вторичной поверхности
	int sx,sy;
	surface_size(&sx,&sy,pSurface);
	x=x/4*4;
	for(int i=h+y;i>y;i--)
	{
		RBlockWrite(ff1,buf+x+i*sx-sx,w*add);
	}
	RClose(ff1);
	return (true);
};