1 #include "PixelHistoPicGen.h"
15 void transform(
float& x,
float& y,
float m1,
float m2,
float m3,
float m4)
31 PixelHistoPicGen::PixelHistoPicGen()
33 std::string mthn =
"[PixelHistoPicGen::PixelHistoPicGen()]\t";
42 PixelHistoPicGen::~PixelHistoPicGen()
47 for(
int x = 0; x < readImgW_; ++x)
49 for(
int y = 0; y < readImgH_; ++y)
50 delete[] readImg_[x][y];
124 ifstream file(filename.c_str(), ifstream::binary);
132 file.read(buffer, 2);
134 file.read((
char*)(&size), 4);
136 file.read(buffer, 4);
137 unsigned int data_offset;
138 file.read((
char*)(&data_offset), 4);
140 unsigned int header_size;
141 file.read((
char*)(&header_size), 4);
144 file.read((
char*)(&w), 4);
145 file.read((
char*)(&h), 4);
147 file.read(buffer, 2);
148 unsigned int depth = 0;
149 file.read((
char*)(&depth), 2);
151 if(depth != 24 && depth != 32)
157 unsigned int compr_method;
158 file.read((
char*)(&compr_method), 4);
162 file.seekg(data_offset, ios_base::beg);
167 for(
int x = 0; x < readImgW_; ++x)
169 for(
int y = 0; y < readImgH_; ++y)
170 delete[] readImg_[x][y];
171 delete[] readImg_[x];
180 readImg_ =
new unsigned char**[readImgW_];
181 for(
int x = 0; x < readImgW_; ++x)
183 readImg_[x] =
new unsigned char*[readImgH_];
184 for(
int y = 0; y < readImgH_; ++y)
185 readImg_[x][y] =
new unsigned char[3];
189 for(
int y = readImgH_ - 1; y >= 0; --y)
190 for(
int x = 0; x < readImgW_; ++x)
192 for(
int i = 2; i >= 0; --i)
193 file.read((
char*)(&(readImg_[x][y][i])), 1);
195 file.seekg(1, ios_base::cur);
244 ofstream file(filename.c_str(), ofstream::binary);
248 unsigned int bmpTemp;
249 bmpTemp = IMG_FILE_SIZE;
252 file << char(0x42) << char(0x4d);
253 for(
int i = 0; i < 4; ++i)
255 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
257 file << char(0x00) << char(0x00) << char(0x00)
259 file << char(0x36) << char(0x00) << char(0x00)
261 file << char(0x28) << char(0x00) << char(0x00)
263 for(
int i = 0, bmpTemp = IMG_WIDTH; i < 4; ++i)
265 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
267 for(
int i = 0, bmpTemp = IMG_HEIGHT; i < 4; ++i)
269 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
271 file << char(0x01) << char(0x00) << char(0x18) << char(0x00) << char(0x00)
272 << char(0x00) << char(0x00) << char(0x00);
273 for(
int i = 0, bmpTemp = IMG_RAW_SIZE; i < 4; ++i)
275 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
278 file << char(0x00) << char(0x00) << char(0x00) << char(0x00) << char(0x00)
279 << char(0x00) << char(0x00) << char(0x00) << char(0x00) << char(0x00)
280 << char(0x00) << char(0x00) << char(0x00) << char(0x00) << char(0x00)
285 for(
int y = IMG_HEIGHT - 1; y >= 0; --y)
286 for(
int x = 0; x < IMG_WIDTH; ++x)
287 for(
int i = 2; i >= 0; --i)
289 file << img_[x][y][i];
296 void PixelHistoPicGen::convertBmp(
const std::string& fileBMP,
297 const std::string& convertFile)
299 string convertCmd =
"convert " + fileBMP +
" " + convertFile;
300 system(convertCmd.c_str());
304 void PixelHistoPicGen::drawFillRectAng(
305 int x,
int y,
int w,
int h,
int r,
int g,
int b,
float deg)
307 float rad = deg * PI / 180.0f;
308 drawFillRect(x, y, w, h, r, g, b, cos(rad), -sin(rad), sin(rad), cos(rad));
325 float up[2] = {0.0f, 1.0f};
327 transform(up[0], up[1], m1, m2, m3, m4);
329 float rt[2] = {up[1], -up[0]};
335 for(
int i = 0; i < w * 2; ++i)
339 for(
float j = 0; j < h * 2; ++j)
341 setImgPixel((
int)px, (
int)py, r, g, b);
345 px = tpx + rt[0] / 2.0f;
346 py = tpy + rt[1] / 2.0f;
351 void PixelHistoPicGen::setImgPixel(
int x,
int y,
int r,
int g,
int b)
394 void recurseForBg(
unsigned char*** d,
int r,
int c,
int rm,
int cm)
396 if(r == rm || c == cm || r < 0 || c < 0)
399 if(d[r][c][0] == 255 && d[r][c][1] == 0 && d[r][c][2] == 0)
407 recurseForBg(d, r + 1, c, rm, cm);
408 recurseForBg(d, r - 1, c, rm, cm);
409 recurseForBg(d, r, c - 1, rm, cm);
410 recurseForBg(d, r, c + 1, rm, cm);
414 #include <sys/stat.h>
415 void PixelHistoPicGen::generateTurtle(
const std::string& filepath)
417 std::string tmpPath = filepath +
"generated/tmp.bmp";
425 mkdir((filepath +
"generated").c_str(), 0755);
427 readBmpToReadImg(filepath +
"turtle.bmp");
432 offSetH = (TUR_IMG_HEIGHT - readImgH_) / 2;
434 clearTurtleBuffer(255, 255, 255, 255);
436 recurseForBg(readImg_, 0, 0, readImgW_, readImgH_);
437 recurseForBg(readImg_, 150, readImgH_ - 1, readImgW_, readImgH_);
441 for(
int i = 0; i < readImgW_; ++i)
442 for(
int j = 0; j < readImgH_; ++j)
444 if(readImg_[i][j][0] < 60 && readImg_[i][j][1] > 130)
446 turtleImg_[i][offSetH + j][0] = 0;
447 turtleImg_[i][offSetH + j][1] = 0;
448 turtleImg_[i][offSetH + j][2] = 255;
452 for(
int k = 0; k < 3; ++k)
453 turtleImg_[i][offSetH + j][k] = readImg_[i][j][k];
455 if(readImg_[i][j][0] == 255 && readImg_[i][j][1] == 0 &&
456 readImg_[i][j][2] == 0)
457 turtleImg_[i][offSetH + j][3] = 0;
459 turtleImg_[i][offSetH + j][3] = 255;
462 writeTurtleToBmp((filepath +
"generated/turtleBase.bmp").c_str());
466 readBmpToReadImg(filepath +
"generated/turtleBase.bmp");
467 offSetH = (TUR_IMG_HEIGHT - readImgH_) / 2;
469 int rd = clock() % 256;
470 int gn = (clock() / 3) % 256;
471 int bl = (clock() * 3) % 256;
473 for(
int i = 0; i < readImgW_; ++i)
474 for(
int j = 0; j < readImgH_; ++j)
475 if(readImg_[i][j][0] == 0 && readImg_[i][j][1] == 0 &&
476 readImg_[i][j][2] == 255)
478 turtleImg_[i][offSetH + j][0] = rd;
479 turtleImg_[i][offSetH + j][1] = gn;
480 turtleImg_[i][offSetH + j][2] = bl;
483 writeTurtleToBmp(tmpPath.c_str());
484 convertBmp(tmpPath, filepath +
"generated/turtle.png");
592 for(
int x = 0; x < TUR_IMG_WIDTH; ++x)
593 for(
int y = 0; y < TUR_IMG_HEIGHT; ++y)
595 turtleImg_[x][y][0] = r;
596 turtleImg_[x][y][1] = g;
597 turtleImg_[x][y][2] = b;
598 turtleImg_[x][y][3] = a;
603 void PixelHistoPicGen::writeTurtleToBmp(
const char* fn)
605 string mthn =
"[PicGen::writeTurtleToBmp()]\t";
612 ofstream file(fn, ofstream::binary);
616 unsigned int bmpTemp;
619 file << char(0x42) << char(0x4d);
620 bmpTemp = TUR_IMG_FILE_SIZE;
621 for(
int i = 0; i < 4; ++i)
622 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
623 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
624 unsigned int dibHeaderSize = TUR_IMG_HEADER_SIZE + 14;
625 for(
int i = 0; i < 4; ++i)
626 file << (
unsigned char)(((
char*)(&dibHeaderSize))[i]);
627 bmpTemp = TUR_IMG_HEADER_SIZE;
628 for(
int i = 0; i < 4; ++i)
629 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
630 bmpTemp = TUR_IMG_WIDTH;
631 for(
int i = 0; i < 4; ++i)
632 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
633 bmpTemp = TUR_IMG_HEIGHT;
634 for(
int i = 0; i < 4; ++i)
635 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
636 file << char(0x01) << char(0x00) << char(0x20)
638 file << char(0x03) << char(0x00) << char(0x00) << char(0x00);
639 bmpTemp = TUR_IMG_RAW_SIZE;
640 for(
int i = 0; i < 4; ++i)
641 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
642 file << char(0xD6) << char(0x0D) << char(0x00)
644 file << char(0xD6) << char(0x0D) << char(0x00)
646 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
647 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
648 file << char(0x00) << char(0x00) << char(0xFF) << char(0x00);
649 file << char(0x00) << char(0xFF) << char(0x00) << char(0x00);
650 file << char(0xFF) << char(0x00) << char(0x00) << char(0x00);
651 file << char(0x00) << char(0x00) << char(0x00) << char(0xFF);
652 file << char(0x01) << char(0x00) << char(0x00) << char(0x00);
653 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
654 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
655 file << char(0x01) << char(0x00) << char(0x00) << char(0x00);
656 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
657 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
658 file << char(0x01) << char(0x00) << char(0x00) << char(0x00);
659 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
660 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
661 file << char(0x01) << char(0x00) << char(0x00) << char(0x00);
662 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
663 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
664 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
668 int bytesToPad = (4 - TUR_IMG_WIDTH * 4 % 4) %
670 for(
int y = TUR_IMG_HEIGHT - 1; y >= 0; --y)
672 for(
int x = 0; x < TUR_IMG_WIDTH; ++x)
674 for(
int i = 2; i >= 0; --i)
676 file << turtleImg_[x][y][i];
678 file << turtleImg_[x][y][3];
681 for(
int p = 0; p < bytesToPad; ++p)
688 void PixelHistoPicGen::writeAuxToBmp(
char* fn)
690 string mthn =
"[PicGen::writeAuxToBmp()]\t";
697 ofstream file(fn, ofstream::binary);
701 unsigned int bmpTemp;
704 file << char(0x42) << char(0x4d);
705 bmpTemp = AUX_IMG_FILE_SIZE;
706 for(
int i = 0; i < 4; ++i)
707 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
708 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
709 unsigned int dibHeaderSize = AUX_IMG_HEADER_SIZE + 14;
710 for(
int i = 0; i < 4; ++i)
711 file << (
unsigned char)(((
char*)(&dibHeaderSize))[i]);
712 bmpTemp = AUX_IMG_HEADER_SIZE;
713 for(
int i = 0; i < 4; ++i)
714 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
715 bmpTemp = AUX_IMG_WIDTH;
716 for(
int i = 0; i < 4; ++i)
717 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
718 bmpTemp = AUX_IMG_HEIGHT;
719 for(
int i = 0; i < 4; ++i)
720 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
721 file << char(0x01) << char(0x00) << char(0x20)
723 file << char(0x03) << char(0x00) << char(0x00) << char(0x00);
724 bmpTemp = AUX_IMG_RAW_SIZE;
725 for(
int i = 0; i < 4; ++i)
726 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
727 file << char(0xD6) << char(0x0D) << char(0x00)
729 file << char(0xD6) << char(0x0D) << char(0x00)
731 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
732 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
733 file << char(0x00) << char(0x00) << char(0xFF) << char(0x00);
734 file << char(0x00) << char(0xFF) << char(0x00) << char(0x00);
735 file << char(0xFF) << char(0x00) << char(0x00) << char(0x00);
736 file << char(0x00) << char(0x00) << char(0x00) << char(0xFF);
737 file << char(0x01) << char(0x00) << char(0x00) << char(0x00);
738 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
739 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
740 file << char(0x01) << char(0x00) << char(0x00) << char(0x00);
741 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
742 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
743 file << char(0x01) << char(0x00) << char(0x00) << char(0x00);
744 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
745 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
746 file << char(0x01) << char(0x00) << char(0x00) << char(0x00);
747 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
748 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
749 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
753 int bytesToPad = (4 - AUX_IMG_WIDTH * 4 % 4) %
755 for(
int y = AUX_IMG_HEIGHT - 1; y >= 0; --y)
757 for(
int x = 0; x < AUX_IMG_WIDTH; ++x)
759 for(
int i = 2; i >= 0; --i)
761 file << auxImg_[x][y][i];
763 file << auxImg_[x][y][3];
766 for(
int p = 0; p < bytesToPad; ++p)
788 float up[2] = {0.0f, 1.0f};
790 transform(up[0], up[1], m1, m2, m3, m4);
792 float rt[2] = {up[1], -up[0]};
794 float px = (float)x - up[0] * 0.5 * w -
796 float py = (float)y - up[1] * 0.5 * h - rt[1] * 0.5 * h;
799 for(
int i = 0; i < w * 2; ++i)
803 for(
float j = 0; j < h * 2; ++j)
805 setAuxPixel((
int)px, (
int)py, r, g, b);
809 px = tpx + rt[0] / 2.0f;
810 py = tpy + rt[1] / 2.0f;
818 int x,
int y,
int w,
int h,
int r,
int g,
int b,
float deg)
820 float rad = deg * PI / 180.0f;
821 drawFillRectAux(x, y, w, h, r, g, b, cos(rad), -sin(rad), sin(rad), cos(rad));
825 void PixelHistoPicGen::setAuxPixel(
int x,
int y,
int r,
int g,
int b)
827 auxImg_[x][y][0] = r;
828 auxImg_[x][y][1] = g;
829 auxImg_[x][y][2] = b;
830 auxImg_[x][y][3] = 0;
void drawFillRect(int x, int y, int w, int h, int r, int g, int b, float m1=1.0f, float m2=0.0f, float m3=0.0f, float m4=1.0f)
draws rect to img buffer. {x,y} is lower left corner. d is degrees of rotation around z-axis.
void writeImgToBmp(std::string filename)
write img buffer to bmp file
void readBmpToReadImg(const std::string &filename)
read bmp file to readImg_ buffer
void clearTurtleBuffer(int r, int g, int b, int a)
initializes aux buffer to all invisible black pixels
void drawFillRectAngAux(int x, int y, int w, int h, int r, int g, int b, float deg)
void drawFillRectAux(int x, int y, int w, int h, int r, int g, int b, float m1=1.0f, float m2=0.0f, float m3=0.0f, float m4=1.0f)