bool egami::storeEDF(const std::string& _fileName, const egami::Image& _inputImage) { bool anErrorEccured = false; etk::FSNode file(_fileName); if (file.fileOpenWrite() == false) { EGAMI_ERROR("Can not find the file name=\"" << file << "\""); return false; } anErrorEccured = file.filePuts( std::string("#EDF // Generate with EGAMI (") + etk::to_string(_inputImage.getSize().x()) + "," + etk::to_string(_inputImage.getSize().y()) + ")\n"); char tmp[256]; for (int32_t yyy = 0; yyy < _inputImage.getSize().y(); ++yyy) { if (yyy != 0) { if (file.filePut('\n') == false) { anErrorEccured = false; } } for (int32_t xxx = 0; xxx < _inputImage.getSize().x(); ++xxx) { sprintf(tmp, "%02X", _inputImage.get(ivec2(xxx, yyy)).a()); /* if (yyy == 25) { EGAMI_DEBUG(" set : " << _inputImage.get(ivec2(xxx, yyy)) << " : '" << tmp << "'"); } */ if (file.filePuts(tmp) == false) { anErrorEccured = false; } } } file.fileClose(); return anErrorEccured; }
void ewol::resource::DistanceFieldFont::generateDistanceField(const egami::ImageMono& _input, egami::Image& _output) { std11::unique_lock<std11::recursive_mutex> lock(m_mutex); int32_t size = _input.getSize().x() * _input.getSize().y(); std::vector<short> xdist(size); std::vector<short> ydist(size); std::vector<double> gx(size); std::vector<double> gy(size); std::vector<double> data(size); std::vector<double> outside(size); std::vector<double> inside(size); // Convert img into double (data) double img_min = 255, img_max = -255; for (int32_t yyy = 0; yyy < _input.getSize().y(); ++yyy) { for (int32_t xxx = 0; xxx < _input.getSize().x(); ++xxx) { int32_t iii = yyy * _input.getSize().x() + xxx; double v = _input.get(ivec2(xxx, yyy)); data[iii] = v; if (v > img_max) { img_max = v; } if (v < img_min) { img_min = v; } } } // Rescale image levels between 0 and 1 for (int32_t yyy = 0; yyy < _input.getSize().y(); ++yyy) { for (int32_t xxx = 0; xxx < _input.getSize().x(); ++xxx) { int32_t iii = yyy * _input.getSize().x() + xxx; data[iii] = (_input.get(ivec2(xxx, yyy))-img_min)/img_max; } } // Compute outside = edtaa3(bitmap); % Transform background (0's) computegradient(&data[0], _input.getSize().x(), _input.getSize().y(), &gx[0], &gy[0]); edtaa3(&data[0], &gx[0], &gy[0], _input.getSize().x(), _input.getSize().y(), &xdist[0], &ydist[0], &outside[0]); for(size_t iii = 0; iii < outside.size(); ++iii) { if( outside[iii] < 0 ) { outside[iii] = 0.0; } } // Compute inside = edtaa3(1-bitmap); % Transform foreground (1's) for(size_t iii = 0; iii < gx.size(); ++iii) { gx[iii] = 0; } for(size_t iii = 0; iii < gy.size(); ++iii) { gy[iii] = 0; } for(size_t iii = 0; iii < data.size(); ++iii) { data[iii] = 1 - data[iii]; } computegradient( &data[0], _input.getSize().x(), _input.getSize().y(), &gx[0], &gy[0]); edtaa3(&data[0], &gx[0], &gy[0], _input.getSize().x(), _input.getSize().y(), &xdist[0], &ydist[0], &inside[0]); for(size_t iii = 0; iii < inside.size(); ++iii) { if( inside[iii] < 0 ) { inside[iii] = 0.0; } } _output.resize(_input.getSize(), etk::Color<>(0)); _output.clear(etk::Color<>(0)); for (int32_t xxx = 0; xxx < _output.getSize().x(); ++xxx) { for (int32_t yyy = 0; yyy < _output.getSize().y(); ++yyy) { int32_t iii = yyy * _output.getSize().x() + xxx; outside[iii] -= inside[iii]; outside[iii] = 128+outside[iii]*16; if( outside[iii] < 0 ) { outside[iii] = 0; } if( outside[iii] > 255 ) { outside[iii] = 255; } uint8_t val = 255 - (unsigned char) outside[iii]; // TODO : Remove multiple size of the map ... _output.set(ivec2(xxx, yyy), etk::Color<>((int32_t)val,(int32_t)val,(int32_t)val,255)); } } }