#include <iostream>
#include <mapapi.h>
#include <maptype.h>
#include <longstring.h>
typedef struct MYBITMAPFILEHEADER
{
unsigned short int bfType;
char bfSize[4];
char bfReserved1[2];
char bfReserved2[2];
char bfOffBits[4];
}
MYBITMAPFILEHEADER;
int SaveBufToBmpFile(int loadwidth, int loadheight, int bits, const char* inbuf,
const char* filename)
{
if ((inbuf == 0) || (filename == 0)) return 0;
int mywidth = loadwidth;
int myheight = loadheight;
// размер сжимаемой области
int imagebits = bits / 8;
int myjpgsize = mywidth*myheight*imagebits;
int widthlen = mywidth*imagebits;
BITMAPINFOHEADER biheader;
MYBITMAPFILEHEADER bfheader;
memset(&bfheader, 0, sizeof(bfheader));
//инициализация заголовка
bfheader.bfType = 0x4D42;
int filesize = 54 + myjpgsize;
*((long*)(bfheader.bfSize)) = filesize;
*((long*)(bfheader.bfOffBits)) = 54;
//инициализация картинки
biheader.biSize = 40;
biheader.biWidth = mywidth;
biheader.biHeight = myheight;
biheader.biPlanes = 1;
biheader.biBitCount = bits;
biheader.biCompression = 0;
biheader.biSizeImage = myjpgsize;
biheader.biXPelsPerMeter = 3780;
biheader.biYPelsPerMeter = 3780;
biheader.biClrUsed = 0;
biheader.biClrImportant = 0;
TLongString buffer;
buffer.Append((const char *)&bfheader, 14);
buffer.Append((const char *)&biheader, 40);
//запись несжатых данных в поток
char* currentstr = 0;
for(int ii = 0; ii < myheight; ii++)
{
currentstr = (char *)inbuf + widthlen*(myheight - ii - 1);
buffer.Append((const char *)currentstr, widthlen);
}
HANDLE file = OpenTheFile(filename, 0, FILE_SHARE_READ|FILE_SHARE_WRITE, CREATE_ALWAYS);
if(file == 0)
return 0;
long res;
int ret = WriteTheFile(file, buffer.getString(), buffer.getSize(), &res);
CloseTheFile(file);
return ret;
}
HOBJ createGDIObject(HMAP map, long size)
{
HOBJ hobj = mapCreateObject(map, IDDOUBLE2, 0);
double x = 6166598.10;
double y = 7412695.27;
if (hobj != 0)
{
if (mapRegisterDrawObject(hobj, 0, LOCAL_LINE) != 0)
{
IMGLINE parm;
memset((void *) &parm, 0, sizeof(parm));
parm.Color = 0xFF0000;
parm.Thick = PIX2MKM(10);
mapAppendDraw(hobj, IMG_LINE, (const char *) &parm);
mapAppendPointPlane(hobj, x, y, 0);
mapAppendPointPlane(hobj, x + size, y, 0);
mapAppendPointPlane(hobj, x + size, y + size, 0);
mapAppendPointPlane(hobj, x, y + size, 0);
mapAppendPointPlane(hobj, x, y, 0);
mapCommitObject(hobj);
}
else
{
std::cout << "mapRegisterDrawObject error" << std::endl;
}
}
else
{
std::cout << "mapCreateObject error" << std::endl;
}
return hobj;
}
void paintMapObj(HMAP map, HOBJ hobj)
{
DFRAME frame;
mapGetTotalBorder(map, &frame, PP_PICTURE);
RECT rect;
rect.left = frame.X1;
rect.right = frame.X2;
rect.top = frame.Y1;
rect.bottom = frame.Y2;
XIMAGEDESC desc;
memset((void *) &desc, 0, sizeof(desc));
desc.Width = rect.right - rect.left;
desc.Height = rect.bottom - rect.top;
desc.Depth = 32;
desc.CellSize = desc.Depth / 8;
desc.RowSize = desc.Width * desc.CellSize;
desc.Point = (char *) malloc(desc.Height * desc.RowSize);
memset((void *) desc.Point, 0, desc.Height * desc.RowSize);
mapPaintMapObjectToDib(map, desc.Point, desc.Width, desc.Height, &rect, 0, hobj);
SaveBufToBmpFile(desc.Width, desc.Height, 32, desc.Point, "test.bmp");
free((void *) desc.Point);
}
int main(int, char *[])
{
constexpr const char16_t *mapName = u"test_paintToDib.sitx";
constexpr const char16_t *rscName = u"military.rsc";
// create map
{
CREATESITEUN createSite{};
createSite.Length = sizeof(CREATESITEUN);
createSite.MapType = 16;
createSite.Reserve = 0;
HMAP map = mapCreateSiteUn((const WCHAR *) mapName, (const WCHAR *) rscName, &createSite);
if (!map)
{
std::cout << "failed to create (" << mapName << ", " << rscName << ")" << std::endl;
return 1;
}
mapCloseMap(map);
}
// reopen map
HMAP map = mapOpenAnyData((const WCHAR *) mapName);
if (!map)
{
std::cout << "failed to open (" << mapName << ", " << rscName << ")" << std::endl;
return 1;
}
mapSetRealShowScale(map, 10000.);
// create new draw object
{
HOBJ obj = createGDIObject(map, 1000);
if (!obj)
{
std::cout << "createGDIObject failed" << std::endl;
return 1;
}
mapFreeObject(obj);
}
mapSetRealShowScale(map, 25000.);
// paint the objects
{
HOBJ obj = mapCreateObject(map, IDDOUBLE2, 0);
if (!mapReadObjectByNumber(map, 0, obj, 1, 1))
{
std::cout << "mapReadObjectByNumber(1) failed" << std::endl;
}
else
{
paintMapObj(map, obj);
}
mapFreeObject(obj);
}
mapCloseMap(map);
return 0;
} |