// // Created by my on 2019/11/11. // #include "DritteFont.h" DritteFont::DritteFont(){ readFont(); } std::vector DritteFont::test() { return loadBitmap(); } std::vector> DritteFont::getCharacter(unsigned char character) { return characters[character - FIRST_CHARACTER_INDEX]; } void DritteFont::readFont() { std::vector data = loadBitmap(); Config config; int offset = DATA_OFFSET; int row; int column; int i; int j; int size = getBitmapSize(data); // size = width * 10000 + height int width = size / 10000; int characterSize = getCharacterSize(data, config, width); // characterSize = width * 10000 + height int characterWidth = characterSize / 10000; int characterHeight = characterSize % 10000; // characters->resize(NUMBER_OF_CHARACTERS); for(i = 0; i < NUMBER_OF_CHARACTERS; i++) { characters[i].resize(characterHeight); for(j = 0; j < characterHeight; j++) { characters[i][j].resize(characterWidth); } } offset = findNextStartOffset(data, offset, config); for(row = 0; row < config.row - 1; row++) { for(column = 0; column < config.column; column++) { for(i = 0; i < characterHeight; i++) { for(j = 0; j < characterWidth; j++) { characters[row * config.column + column][i][j] = data[offset + (i * width + j) * PIXEL_SIZE] != (char)config.background_color.red; } } offset = findNextStartOffset(data, offset, config); } offset += characterHeight * width * PIXEL_SIZE; offset = findNextStartOffset(data, offset, config); } for(column = 0; column < config.column_of_finalRow; column++) { for(i = 0; i < characterHeight; i++) { for(j = 0; j < characterWidth; j++) { characters[config.row * config.column + column][i][j] = data[offset + (i * width + j) * PIXEL_SIZE] != (char)config.background_color.red; } } offset = findNextStartOffset(data, offset, config); } } std::vector DritteFont::loadBitmap() { std::ifstream ifstream; ifstream.open(PATH_OF_FONT_BITMAP); if(ifstream.is_open()) { std::string str((std::istreambuf_iterator(ifstream)), std::istreambuf_iterator()); std::vector data; data.resize(str.size()); for(int i = 0; i < str.size(); i++){ data[i] = str[i]; } return data; } std::cout << "read failed" << std::endl; return std::vector(); } int DritteFont::getBitmapSize(std::vector data) { int width = 0; int height = 0; int offset = WIDTH_OFFSET; while(data[offset] != WIDTH_END_SIGNAL) { width = width * 10 + data[offset++] - '0'; } offset++; while(data[offset] != HEIGHT_END_SIGNAL) { height = height * 10 + data[offset++] - '0'; } return width * 10000 + height; } int DritteFont::getCharacterSize(std::vector data, Config config, int width) { int characterWidth = 0; int characterHeight = 0; int tempOffset; int offset = DATA_OFFSET; int counter = 0; // because the red green blue values of border color is equal, // so i simple the method, falls the values is different, // the method must be modified for(; offset < data.size(); offset++) { if(((unsigned int)data[offset] & 0xff) == config.border_color.red) // only use red value because the red, green and blue values are equal. counter++; if(((unsigned int)data[offset] & 0xff) != config.border_color.red) { if(counter > 0 && counter < config.border_width * 3 + DEVIATION_NUMBER) { // mal 3 because color has 3 values, red, green and blue values. tempOffset = offset; while (((unsigned int)data[tempOffset++] & 0xff) != config.border_color.red) { characterWidth++; } tempOffset = offset; while (((unsigned int)data[tempOffset] & 0xff) != config.border_color.red) { characterHeight++; tempOffset += width * PIXEL_SIZE; } return characterWidth / PIXEL_SIZE * 10000 + characterHeight; } counter = 0; } } std::cout << "not get chacter size\n" << std::endl; return 0; } int DritteFont::findNextStartOffset(std::vector data, int offset, Config config) { int counter = 0; for(; offset < data.size(); offset += PIXEL_SIZE) { if(((unsigned int)data[offset] & 0xff) == config.border_color.red) // only use red value because the red, green and blue values are equal. counter++; if(((unsigned int)data[offset] & 0xff) != config.border_color.red) { if(counter > 0 && counter < config.border_width + DEVIATION_NUMBER) { // mal 3 because color has 3 values, red, green and blue values. return offset; } counter = 0; } } std::cout << "not find offset\n" << std::endl; return 0; }