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)
395 void recurseForBg(
unsigned char*** d,
int r,
int c,
int rm,
int cm)
397 if(r == rm || c == cm || r < 0 || c < 0)
400 if(d[r][c][0] == 255 && d[r][c][1] == 0 && d[r][c][2] == 0)
408 recurseForBg(d, r + 1, c, rm, cm);
409 recurseForBg(d, r - 1, c, rm, cm);
410 recurseForBg(d, r, c - 1, rm, cm);
411 recurseForBg(d, r, c + 1, rm, cm);
415 #include <sys/stat.h>
416 void PixelHistoPicGen::generateTurtle(
const std::string& filepath)
418 std::string tmpPath = filepath +
"generated/tmp.bmp";
426 mkdir((filepath +
"generated").c_str(), 0755);
428 readBmpToReadImg(filepath +
"turtle.bmp");
433 offSetH = (TUR_IMG_HEIGHT - readImgH_) / 2;
435 clearTurtleBuffer(255, 255, 255, 255);
437 recurseForBg(readImg_, 0, 0, readImgW_, readImgH_);
438 recurseForBg(readImg_, 150, readImgH_ - 1, readImgW_, readImgH_);
442 for(
int i = 0; i < readImgW_; ++i)
443 for(
int j = 0; j < readImgH_; ++j)
445 if(readImg_[i][j][0] < 60 && readImg_[i][j][1] > 130)
447 turtleImg_[i][offSetH + j][0] = 0;
448 turtleImg_[i][offSetH + j][1] = 0;
449 turtleImg_[i][offSetH + j][2] = 255;
453 for(
int k = 0; k < 3; ++k)
454 turtleImg_[i][offSetH + j][k] = readImg_[i][j][k];
456 if(readImg_[i][j][0] == 255 && readImg_[i][j][1] == 0 &&
457 readImg_[i][j][2] == 0)
458 turtleImg_[i][offSetH + j][3] = 0;
460 turtleImg_[i][offSetH + j][3] = 255;
463 writeTurtleToBmp((filepath +
"generated/turtleBase.bmp").c_str());
467 readBmpToReadImg(filepath +
"generated/turtleBase.bmp");
468 offSetH = (TUR_IMG_HEIGHT - readImgH_) / 2;
470 int rd = clock() % 256;
471 int gn = (clock() / 3) % 256;
472 int bl = (clock() * 3) % 256;
474 for(
int i = 0; i < readImgW_; ++i)
475 for(
int j = 0; j < readImgH_; ++j)
476 if(readImg_[i][j][0] == 0 && readImg_[i][j][1] == 0 &&
477 readImg_[i][j][2] == 255)
479 turtleImg_[i][offSetH + j][0] = rd;
480 turtleImg_[i][offSetH + j][1] = gn;
481 turtleImg_[i][offSetH + j][2] = bl;
484 writeTurtleToBmp(tmpPath.c_str());
485 convertBmp(tmpPath, filepath +
"generated/turtle.png");
593 for(
int x = 0; x < TUR_IMG_WIDTH; ++x)
594 for(
int y = 0; y < TUR_IMG_HEIGHT; ++y)
596 turtleImg_[x][y][0] = r;
597 turtleImg_[x][y][1] = g;
598 turtleImg_[x][y][2] = b;
599 turtleImg_[x][y][3] = a;
604 void PixelHistoPicGen::writeTurtleToBmp(
const char* fn)
606 string mthn =
"[PicGen::writeTurtleToBmp()]\t";
613 ofstream file(fn, ofstream::binary);
617 unsigned int bmpTemp;
620 file << char(0x42) << char(0x4d);
621 bmpTemp = TUR_IMG_FILE_SIZE;
622 for(
int i = 0; i < 4; ++i)
623 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
624 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
625 unsigned int dibHeaderSize = TUR_IMG_HEADER_SIZE + 14;
626 for(
int i = 0; i < 4; ++i)
627 file << (
unsigned char)(((
char*)(&dibHeaderSize))[i]);
628 bmpTemp = TUR_IMG_HEADER_SIZE;
629 for(
int i = 0; i < 4; ++i)
630 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
631 bmpTemp = TUR_IMG_WIDTH;
632 for(
int i = 0; i < 4; ++i)
633 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
634 bmpTemp = TUR_IMG_HEIGHT;
635 for(
int i = 0; i < 4; ++i)
636 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
637 file << char(0x01) << char(0x00) << char(0x20)
639 file << char(0x03) << char(0x00) << char(0x00) << char(0x00);
640 bmpTemp = TUR_IMG_RAW_SIZE;
641 for(
int i = 0; i < 4; ++i)
642 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
643 file << char(0xD6) << char(0x0D) << char(0x00)
645 file << char(0xD6) << char(0x0D) << char(0x00)
647 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
648 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
649 file << char(0x00) << char(0x00) << char(0xFF) << char(0x00);
650 file << char(0x00) << char(0xFF) << char(0x00) << char(0x00);
651 file << char(0xFF) << char(0x00) << char(0x00) << char(0x00);
652 file << char(0x00) << char(0x00) << char(0x00) << char(0xFF);
653 file << char(0x01) << char(0x00) << char(0x00) << char(0x00);
654 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
655 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
656 file << char(0x01) << char(0x00) << char(0x00) << char(0x00);
657 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
658 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
659 file << char(0x01) << char(0x00) << char(0x00) << char(0x00);
660 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
661 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
662 file << char(0x01) << 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);
665 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
669 int bytesToPad = (4 - TUR_IMG_WIDTH * 4 % 4) %
671 for(
int y = TUR_IMG_HEIGHT - 1; y >= 0; --y)
673 for(
int x = 0; x < TUR_IMG_WIDTH; ++x)
675 for(
int i = 2; i >= 0; --i)
677 file << turtleImg_[x][y][i];
679 file << turtleImg_[x][y][3];
682 for(
int p = 0; p < bytesToPad; ++p)
689 void PixelHistoPicGen::writeAuxToBmp(
char* fn)
691 string mthn =
"[PicGen::writeAuxToBmp()]\t";
698 ofstream file(fn, ofstream::binary);
702 unsigned int bmpTemp;
705 file << char(0x42) << char(0x4d);
706 bmpTemp = AUX_IMG_FILE_SIZE;
707 for(
int i = 0; i < 4; ++i)
708 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
709 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
710 unsigned int dibHeaderSize = AUX_IMG_HEADER_SIZE + 14;
711 for(
int i = 0; i < 4; ++i)
712 file << (
unsigned char)(((
char*)(&dibHeaderSize))[i]);
713 bmpTemp = AUX_IMG_HEADER_SIZE;
714 for(
int i = 0; i < 4; ++i)
715 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
716 bmpTemp = AUX_IMG_WIDTH;
717 for(
int i = 0; i < 4; ++i)
718 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
719 bmpTemp = AUX_IMG_HEIGHT;
720 for(
int i = 0; i < 4; ++i)
721 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
722 file << char(0x01) << char(0x00) << char(0x20)
724 file << char(0x03) << char(0x00) << char(0x00) << char(0x00);
725 bmpTemp = AUX_IMG_RAW_SIZE;
726 for(
int i = 0; i < 4; ++i)
727 file << (
unsigned char)(((
char*)(&bmpTemp))[i]);
728 file << char(0xD6) << char(0x0D) << char(0x00)
730 file << char(0xD6) << char(0x0D) << char(0x00)
732 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
733 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
734 file << char(0x00) << char(0x00) << char(0xFF) << char(0x00);
735 file << char(0x00) << char(0xFF) << char(0x00) << char(0x00);
736 file << char(0xFF) << char(0x00) << char(0x00) << char(0x00);
737 file << char(0x00) << char(0x00) << char(0x00) << char(0xFF);
738 file << char(0x01) << char(0x00) << char(0x00) << char(0x00);
739 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
740 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
741 file << char(0x01) << char(0x00) << char(0x00) << char(0x00);
742 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
743 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
744 file << char(0x01) << char(0x00) << char(0x00) << char(0x00);
745 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
746 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
747 file << char(0x01) << 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);
750 file << char(0x00) << char(0x00) << char(0x00) << char(0x00);
754 int bytesToPad = (4 - AUX_IMG_WIDTH * 4 % 4) %
756 for(
int y = AUX_IMG_HEIGHT - 1; y >= 0; --y)
758 for(
int x = 0; x < AUX_IMG_WIDTH; ++x)
760 for(
int i = 2; i >= 0; --i)
762 file << auxImg_[x][y][i];
764 file << auxImg_[x][y][3];
767 for(
int p = 0; p < bytesToPad; ++p)
789 float up[2] = {0.0f, 1.0f};
791 transform(up[0], up[1], m1, m2, m3, m4);
793 float rt[2] = {up[1], -up[0]};
795 float px = (float)x - up[0] * 0.5 * w -
797 float py = (float)y - up[1] * 0.5 * h - rt[1] * 0.5 * h;
800 for(
int i = 0; i < w * 2; ++i)
804 for(
float j = 0; j < h * 2; ++j)
806 setAuxPixel((
int)px, (
int)py, r, g, b);
810 px = tpx + rt[0] / 2.0f;
811 py = tpy + rt[1] / 2.0f;
819 int x,
int y,
int w,
int h,
int r,
int g,
int b,
float deg)
821 float rad = deg * PI / 180.0f;
822 drawFillRectAux(x, y, w, h, r, g, b, cos(rad), -sin(rad), sin(rad), cos(rad));
826 void PixelHistoPicGen::setAuxPixel(
int x,
int y,
int r,
int g,
int b)
828 auxImg_[x][y][0] = r;
829 auxImg_[x][y][1] = g;
830 auxImg_[x][y][2] = b;
831 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)