From 50c9be054d59852334343b5afaa9298482414fe1 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Sun, 19 Jan 2014 19:16:51 +0100 Subject: [PATCH] [DEV] add distance field for theme image just a big test --- data/texturedDF.frag | 24 +++ data/texturedDF.vert | 22 ++ external/egami | 2 +- external/etk | 2 +- sources/ewol/compositing/Image.cpp | 81 +++++-- sources/ewol/compositing/Image.h | 22 +- sources/ewol/resource/DistanceFieldFont.cpp | 2 +- sources/ewol/resource/Image.cpp | 4 + sources/ewol/resource/ImageDF.cpp | 225 ++++++++++++++++++++ sources/ewol/resource/ImageDF.h | 57 +++++ sources/ewol/widget/Image.cpp | 11 + sources/ewol/widget/Image.h | 16 ++ sources/ewol/widget/Menu.cpp | 39 ++-- sources/ewol/widget/meta/FileChooser.cpp | 10 +- sources/lutin_ewol.py | 2 + 15 files changed, 476 insertions(+), 43 deletions(-) create mode 100644 data/texturedDF.frag create mode 100644 data/texturedDF.vert create mode 100644 sources/ewol/resource/ImageDF.cpp create mode 100644 sources/ewol/resource/ImageDF.h diff --git a/data/texturedDF.frag b/data/texturedDF.frag new file mode 100644 index 00000000..d41f072d --- /dev/null +++ b/data/texturedDF.frag @@ -0,0 +1,24 @@ +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +// Input : +uniform sampler2D EW_texID; +uniform float EW_SoftEdgeMin; +uniform float EW_SoftEdgeMax; +uniform int EW_SoftEdge; + +varying vec2 f_texcoord; +varying vec4 f_color; + +void main(void) { + vec4 color = texture2D(EW_texID, f_texcoord ); + float dist = color.r; + float width = fwidth(dist); + float alpha = smoothstep(0.5-width, 0.5+width, dist); + + // Smooth + gl_FragColor = vec4(f_color[0], f_color[1], f_color[2], f_color[3]*alpha); + +} diff --git a/data/texturedDF.vert b/data/texturedDF.vert new file mode 100644 index 00000000..1e8591b2 --- /dev/null +++ b/data/texturedDF.vert @@ -0,0 +1,22 @@ +#ifdef GL_ES +precision mediump float; +precision mediump int; +#endif + +// Input : +attribute vec3 EW_coord3d; +attribute vec2 EW_texture2d; +attribute vec4 EW_color; +uniform mat4 EW_MatrixTransformation; + +// output : +varying vec4 f_color; +varying vec2 f_texcoord; + +void main(void) { + gl_Position = EW_MatrixTransformation * vec4(EW_coord3d, 1.0); + // set texture output coord + f_texcoord = EW_texture2d; + // set output color : + f_color = EW_color; +} \ No newline at end of file diff --git a/external/egami b/external/egami index cd88edc7..2fe76f92 160000 --- a/external/egami +++ b/external/egami @@ -1 +1 @@ -Subproject commit cd88edc7085edbef3d78bee02104c697a0713057 +Subproject commit 2fe76f92055c61a11e84bafbecc4aa0488e0b16e diff --git a/external/etk b/external/etk index 7d28c888..7f26881c 160000 --- a/external/etk +++ b/external/etk @@ -1 +1 @@ -Subproject commit 7d28c888f7d4d9b3aa92274db82ffeaa63a6a681 +Subproject commit 7f26881c3e8e26b1813b039b6ffd973a5126d1a4 diff --git a/sources/ewol/compositing/Image.cpp b/sources/ewol/compositing/Image.cpp index 51df0d95..51e149be 100644 --- a/sources/ewol/compositing/Image.cpp +++ b/sources/ewol/compositing/Image.cpp @@ -12,7 +12,9 @@ #undef __class__ #define __class__ "ewol::compositing::Image" -ewol::compositing::Image::Image(const std::string& _imageName) : +ewol::compositing::Image::Image(const std::string& _imageName, bool _df) : + m_filename(_imageName), + m_requestSize(2,2), m_position(0.0, 0.0, 0.0), m_clippingPosStart(0.0, 0.0, 0.0), m_clippingPosStop(0.0, 0.0, 0.0), @@ -25,21 +27,29 @@ ewol::compositing::Image::Image(const std::string& _imageName) : m_GLColor(-1), m_GLtexture(-1), m_GLtexID(-1), - m_resource(NULL) { + m_distanceFieldMode(_df), + m_resource(NULL), + m_resourceDF(NULL) { setSource(_imageName); loadProgram(); } ewol::compositing::Image::~Image(void) { ewol::resource::TextureFile::release(m_resource); + ewol::resource::ImageDF::release(m_resourceDF); ewol::resource::Program::release(m_GLprogram); } void ewol::compositing::Image::loadProgram(void) { // get the shader resource : m_GLPosition = 0; - m_GLprogram = ewol::resource::Program::keep("DATA:textured3D.prog"); - if (NULL!=m_GLprogram) { + ewol::resource::Program::release(m_GLprogram); + if (m_distanceFieldMode == true) { + m_GLprogram = ewol::resource::Program::keep("DATA:texturedDF.prog"); + } else { + m_GLprogram = ewol::resource::Program::keep("DATA:textured3D.prog"); + } + if (m_GLprogram != NULL) { m_GLPosition = m_GLprogram->getAttribute("EW_coord3d"); m_GLColor = m_GLprogram->getAttribute("EW_color"); m_GLtexture = m_GLprogram->getAttribute("EW_texture2d"); @@ -53,7 +63,8 @@ void ewol::compositing::Image::draw(bool _disableDepthTest) { //EWOL_WARNING("Nothink to draw..."); return; } - if (m_resource == NULL) { + if ( m_resource == NULL + && m_resourceDF == NULL) { // this is a normale case ... the user can choice to have no image ... return; } @@ -71,7 +82,17 @@ void ewol::compositing::Image::draw(bool _disableDepthTest) { m_GLprogram->use(); m_GLprogram->uniformMatrix4fv(m_GLMatrix, 1, tmpMatrix.m_mat); // TextureID - m_GLprogram->setTexture0(m_GLtexID, m_resource->getId()); + if (m_resource != NULL) { + if (m_distanceFieldMode == true) { + EWOL_ERROR("FONT type error Request distance field and display normal ..."); + } + m_GLprogram->setTexture0(m_GLtexID, m_resource->getId()); + } else { + if (m_distanceFieldMode == false) { + EWOL_ERROR("FONT type error Request normal and display distance field ..."); + } + m_GLprogram->setTexture0(m_GLtexID, m_resourceDF->getId()); + } // position : m_GLprogram->sendAttribute(m_GLPosition, m_coord); // Texture : @@ -229,39 +250,67 @@ void ewol::compositing::Image::printPart(const vec2& _size, void ewol::compositing::Image::setSource(const std::string& _newFile, const vec2& _size) { clear(); ewol::resource::TextureFile* resource = m_resource; + ewol::resource::ImageDF* resourceDF = m_resourceDF; + m_filename = _newFile; + m_requestSize = _size; m_resource = NULL; + m_resourceDF = NULL; ivec2 tmpSize(_size.x(),_size.y()); // note that no image can be loaded... if (_newFile != "") { // link to new one - m_resource = ewol::resource::TextureFile::keep(_newFile, tmpSize); - if (NULL == m_resource) { - EWOL_ERROR("Can not get Image resource"); + if (m_distanceFieldMode == false) { + m_resource = ewol::resource::TextureFile::keep(m_filename, tmpSize); + if (NULL == m_resource) { + EWOL_ERROR("Can not get Image resource"); + } + } else { + m_resourceDF = ewol::resource::ImageDF::keep(_newFile, tmpSize); + if (NULL == m_resourceDF) { + EWOL_ERROR("Can not get Image resource DF"); + } } } - if (m_resource == NULL) { + if ( m_resource == NULL + && m_resourceDF == NULL) { if (resource != NULL) { EWOL_WARNING("Retrive previous resource"); m_resource = resource; } - } else { - if (resource != NULL) { - ewol::resource::TextureFile::release(resource); + if (resourceDF != NULL) { + EWOL_WARNING("Retrive previous resource (DF)"); + m_resourceDF = resourceDF; } + } else { + ewol::resource::TextureFile::release(resource); + ewol::resource::ImageDF::release(resourceDF); } } bool ewol::compositing::Image::hasSources(void) { - return m_resource != NULL; + return (m_resource != NULL || m_resourceDF != NULL); } vec2 ewol::compositing::Image::getRealSize(void) { - if (NULL == m_resource) { + if ( m_resource == NULL + && m_resourceDF == NULL) { return vec2(0,0); } - return m_resource->getRealSize(); + if (m_resource != NULL) { + return m_resource->getRealSize(); + } + return m_resourceDF->getRealSize(); } +void ewol::compositing::Image::setDistanceFieldMode(bool _mode) { + if (m_distanceFieldMode == _mode) { + return; + } + m_distanceFieldMode = _mode; + // Force reload input + setSource(m_filename, m_requestSize); + loadProgram(); +} diff --git a/sources/ewol/compositing/Image.h b/sources/ewol/compositing/Image.h index 667ef944..f25f4d71 100644 --- a/sources/ewol/compositing/Image.h +++ b/sources/ewol/compositing/Image.h @@ -13,11 +13,14 @@ #include #include #include +#include namespace ewol { namespace compositing { class Image : public ewol::Compositing { private: + std::string m_filename; + ivec2 m_requestSize; vec3 m_position; //!< The current position to draw vec3 m_clippingPosStart; //!< Clipping start position vec3 m_clippingPosStop; //!< Clipping stop position @@ -33,7 +36,9 @@ namespace ewol { int32_t m_GLtexture; //!< openGL id on the element (Texture position) int32_t m_GLtexID; //!< openGL id on the element (texture ID) private: + bool m_distanceFieldMode; //!< select distance field mode ewol::resource::TextureFile* m_resource; //!< texture resources + ewol::resource::ImageDF* m_resourceDF; //!< texture resources std::vector m_coord; //!< internal coord of the object std::vector m_coordTex; //!< internal texture coordinate for every point std::vector > m_coordColor; //!< internal color of the different point @@ -46,8 +51,9 @@ namespace ewol { /** * @brief generic constructor * @param[in] _imageName Name of the file that might be loaded + * @param[in] _df enable distance field mode */ - Image(const std::string& _imageName=""); + Image(const std::string& _imageName="", bool _df = false); /** * @brief generic destructor */ @@ -164,9 +170,21 @@ namespace ewol { * @return tre image registered size */ vec2 getRealSize(void); + public: + /** + * @brief Set render mode of the image + * @param[in] _mode Activation of distance field mode + */ + void setDistanceFieldMode(bool _mode); + /** + * @brief Get the render methode. + * @return The render mode of the image. + */ + bool getDistanceFieldMode(void) const { + return m_distanceFieldMode; + } }; }; }; #endif - diff --git a/sources/ewol/resource/DistanceFieldFont.cpp b/sources/ewol/resource/DistanceFieldFont.cpp index 32ec3d5d..cc30aee5 100644 --- a/sources/ewol/resource/DistanceFieldFont.cpp +++ b/sources/ewol/resource/DistanceFieldFont.cpp @@ -278,7 +278,7 @@ bool ewol::resource::DistanceFieldFont::addGlyph(const char32_t& _val) { } if (hasChange == true) { flush(); - egami::store(m_data, "fileFont.bmp"); // ==> for debug test only ... + //egami::store(m_data, "fileFont.bmp"); // ==> for debug test only ... } return hasChange; } diff --git a/sources/ewol/resource/Image.cpp b/sources/ewol/resource/Image.cpp index 612bfaa9..a859d54f 100644 --- a/sources/ewol/resource/Image.cpp +++ b/sources/ewol/resource/Image.cpp @@ -33,6 +33,10 @@ ewol::resource::TextureFile::TextureFile(std::string _genName, const std::string } ivec2 tmp = m_data.getSize(); m_realImageSize = vec2(tmp.x(), tmp.y()); + #ifdef GENERATE_DISTANCE_FIELD_MODE + //egami::generateDistanceFieldFile(_tmpfileName, std::string(_tmpfileName, 0, _tmpfileName.size()-4) + ".bmp"); + egami::generateDistanceFieldFile(_tmpfileName, std::string(_tmpfileName, 0, _tmpfileName.size()-4) + ".edf"); + #endif flush(); } diff --git a/sources/ewol/resource/ImageDF.cpp b/sources/ewol/resource/ImageDF.cpp new file mode 100644 index 00000000..5bb9ffe3 --- /dev/null +++ b/sources/ewol/resource/ImageDF.cpp @@ -0,0 +1,225 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license BSD v3 (see license file) + */ + + +#include +#include +#include +#include +#include +#include + + +#undef __class__ +#define __class__ "resource::TextureFile" + +ewol::resource::ImageDF::ImageDF(const std::string& _genName) : + Texture(_genName) { + EWOL_DEBUG("create a new resource::ImageDF : _genName=" << _genName << " _tmpfileName=--- size=---"); + +} + + +ewol::resource::ImageDF::ImageDF(std::string _genName, const std::string& _tmpfileName, const ivec2& _size) : + ewol::resource::Texture(_genName) { + addObjectType("ewol::resource::ImageDF"); + EWOL_DEBUG("create a new resource::Image : _genName=" << _genName << " _tmpfileName=" << _tmpfileName << " size=" << _size); + if (false == egami::load(m_data, _tmpfileName, _size)) { + EWOL_ERROR("ERROR when loading the image : " << _tmpfileName); + } + ivec2 tmp = m_data.getSize(); + m_realImageSize = vec2(tmp.x(), tmp.y()); + // distance field Generation + // TODO : if it is not a .edf ==> generate dynamicly ... + /* + egami::ImageMono input; + input.resize(tmp); + for (size_t yyy = 0; yyy < tmp.y(); ++yyy) { + for (size_t xxx = 0; xxx < tmp.x(); ++xxx) { + input.set(ivec2(xxx, yyy), m_data.get(ivec2(xxx, yyy)).a() ); + } + } + generateDistanceField(input, m_data); + */ + flush(); +} + + +void ewol::resource::ImageDF::generateDistanceField(const egami::ImageMono& _input, egami::Image& _output) { + int32_t size = _input.getSize().x() * _input.getSize().y(); + std::vector xdist(size); + std::vector ydist(size); + std::vector gx(size); + std::vector gy(size); + std::vector data(size); + std::vector outside(size); + std::vector 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,256)); + } + } +} + + +#ifdef __TARGET_OS__Android +/** + * @brief get the next power 2 if the input + * @param[in] _value Value that we want the next power of 2 + * @return result value + */ +static int32_t nextP2(int32_t _value) { + int32_t val=1; + for (int32_t iii=1; iii<31; iii++) { + if (_value <= val) { + return val; + } + val *=2; + } + EWOL_CRITICAL("impossible CASE.... request P2 of " << _value); + return val; +} +#endif + + + +ewol::resource::ImageDF* ewol::resource::ImageDF::keep(const std::string& _filename, ivec2 _size) { + EWOL_VERBOSE("KEEP: TextureFile: '" << _filename << "' size=" << _size); + if (_filename == "") { + ewol::resource::ImageDF* object = new ewol::resource::ImageDF(""); + if (NULL == object) { + EWOL_ERROR("allocation error of a resource : ??TEX??"); + return NULL; + } + getManager().localAdd(object); + return object; + } + if (_size.x() == 0) { + _size.setX(-1); + //EWOL_ERROR("Error Request the image size.x() =0 ???"); + } + if (_size.y() == 0) { + _size.setY(-1); + //EWOL_ERROR("Error Request the image size.y() =0 ???"); + } + std::string TmpFilename = _filename; + if (false == end_with(_filename, ".svg") ) { + _size = ivec2(-1,-1); + } + #ifdef __TARGET_OS__MacOs + EWOL_ERROR("TODO : remove this strange hack"); + _size = ivec2(64,64); + #endif + if (_size.x()>0 && _size.y()>0) { + EWOL_VERBOSE(" == > specific size : " << _size); + #ifdef __TARGET_OS__Android + _size.setValue(nextP2(_size.x()), nextP2(_size.y())); + #endif + TmpFilename += ":"; + TmpFilename += std::to_string(_size.x()); + TmpFilename += "x"; + TmpFilename += std::to_string(_size.y()); + } + + EWOL_VERBOSE("KEEP: TextureFile: '" << TmpFilename << "' new size=" << _size); + ewol::resource::ImageDF* object = NULL; + ewol::Resource* object2 = getManager().localKeep("DF__" + TmpFilename); + if (NULL != object2) { + object = dynamic_cast(object2); + if (NULL == object) { + EWOL_CRITICAL("Request resource file : '" << TmpFilename << "' With the wrong type (dynamic cast error)"); + return NULL; + } + } + if (NULL != object) { + return object; + } + EWOL_INFO("CREATE: ImageDF: '" << TmpFilename << "' size=" << _size); + // need to crate a new one ... + object = new ewol::resource::ImageDF("DF__" + TmpFilename, _filename, _size); + if (NULL == object) { + EWOL_ERROR("allocation error of a resource : " << _filename); + return NULL; + } + getManager().localAdd(object); + return object; +} + + +void ewol::resource::ImageDF::release(ewol::resource::ImageDF*& _object) { + if (NULL == _object) { + return; + } + ewol::Resource* object2 = static_cast(_object); + getManager().release(object2); + _object = NULL; +} + diff --git a/sources/ewol/resource/ImageDF.h b/sources/ewol/resource/ImageDF.h new file mode 100644 index 00000000..2236f14f --- /dev/null +++ b/sources/ewol/resource/ImageDF.h @@ -0,0 +1,57 @@ +/** + * @author Edouard DUPIN + * + * @copyright 2011, Edouard DUPIN, all right reserved + * + * @license BSD v3 (see license file) + */ + +#ifndef __EWOL_RESOURCE_IMAGE_DISTANCE_FIELD_H__ +#define __EWOL_RESOURCE_IMAGE_DISTANCE_FIELD_H__ + +#include +#include +#include +#include +#include +#include + +namespace ewol { + namespace resource { + class ImageDF : public ewol::resource::Texture { + protected: + vec2 m_realImageSize; + protected: + ImageDF(const std::string& _genName); + ImageDF(std::string _genName, const std::string& _fileName, const ivec2& _size); + virtual ~ImageDF(void) { }; + /** + * @brief Generate distance field of this Image input. + * @param[in] _input Input image to change in distance field mode. + * @param[out] _output New image generate with this image _input. + */ + void generateDistanceField(const egami::ImageMono& _input, egami::Image& _output); + public: + const vec2& getRealSize(void) { + return m_realImageSize; + }; + public: + /** + * @brief keep the resource pointer. + * @note Never free this pointer by your own... + * @param[in] _filename Name of the image file. + * @param[in] _requested size of the image (usefull when loading .svg to automatic rescale) + * @return pointer on the resource or NULL if an error occured. + */ + static ewol::resource::ImageDF* keep(const std::string& _filename, ivec2 _size=ivec2(-1,-1)); + /** + * @brief release the keeped resources + * @param[in,out] reference on the object pointer + */ + static void release(ewol::resource::ImageDF*& _object); + }; + }; +}; + + +#endif \ No newline at end of file diff --git a/sources/ewol/widget/Image.cpp b/sources/ewol/widget/Image.cpp index 23d557a7..5bc238f1 100644 --- a/sources/ewol/widget/Image.cpp +++ b/sources/ewol/widget/Image.cpp @@ -31,6 +31,7 @@ const char * const ewol::widget::Image::configRatio = "ratio"; const char * const ewol::widget::Image::configSize = "size"; const char * const ewol::widget::Image::configBorder = "border"; const char * const ewol::widget::Image::configSource = "src"; +const char * const ewol::widget::Image::configDistanceField = "distance-field"; ewol::widget::Image::Image(const std::string& _file, const ewol::Dimension& _border) : m_imageSize(vec2(0,0)), @@ -41,6 +42,7 @@ ewol::widget::Image::Image(const std::string& _file, const ewol::Dimension& _bor registerConfig(configSize, "Dimension", NULL, "Basic display size of the image"); registerConfig(configBorder, "Dimension", NULL, "Border of the image"); registerConfig(configSource, "string", "Image source path"); + registerConfig(configDistanceField, "bool", "Distance field mode"); set(_file, _border); } @@ -240,6 +242,10 @@ bool ewol::widget::Image::onSetConfig(const ewol::object::Config& _conf) { setFile(_conf.getData()); return true; } + if (_conf.getConfig() == configDistanceField) { + setDistanceField(std::stob(_conf.getData())); + return true; + } return false; } @@ -263,6 +269,11 @@ bool ewol::widget::Image::onGetConfig(const char* _config, std::string& _result) _result = getFile(); return true; } + if (_config == configDistanceField) { + _result = std::to_string(getDistanceField()); + return true; + } + return false; } diff --git a/sources/ewol/widget/Image.h b/sources/ewol/widget/Image.h index ca294fe5..ae1033e0 100644 --- a/sources/ewol/widget/Image.h +++ b/sources/ewol/widget/Image.h @@ -30,6 +30,7 @@ namespace ewol { static const char * const configSize; static const char * const configBorder; static const char * const configSource; + static const char * const configDistanceField; public: /** * @brief Main call of recording the widget on the List of "widget named creator" @@ -113,6 +114,21 @@ namespace ewol { bool getKeepRatio(void) const { return m_keepRatio; }; + public: + /** + * @brief Set distance field rendering mode + * @param[in] _df enable distance field + */ + void setDistanceField(bool _df) { + m_compositing.setDistanceFieldMode(_df); + } + /** + * @brief Get the distance field render mode. + * @return Status of the distance field render mode. + */ + bool getDistanceField(void) const { + return m_compositing.getDistanceFieldMode(); + } protected: // Derived function virtual void onDraw(void); virtual bool onSetConfig(const ewol::object::Config& _conf); diff --git a/sources/ewol/widget/Menu.cpp b/sources/ewol/widget/Menu.cpp index 6649d610..a9daca91 100644 --- a/sources/ewol/widget/Menu.cpp +++ b/sources/ewol/widget/Menu.cpp @@ -89,16 +89,17 @@ int32_t ewol::widget::Menu::add(int32_t _parent, return tmpObject->m_localId; } if (tmpObject->m_image.size()!=0) { - myButton->setSubWidget( - new ewol::widget::Composer(widget::Composer::String, - std::string("\n") + - " \n" - " m_image + "\" size=\"8,8mm\"/>\n" - " \n" - " \n" - "\n")); + std::string composeString ="\n"; + if (std::end_with(tmpObject->m_image, ".edf") == true) { + composeString+=" m_image + "\" size=\"8,8mm\" distance-field='true'/>\n"; + } else { + composeString+=" m_image + "\" size=\"8,8mm\"/>\n"; + } + composeString+=" \n"; + composeString+="\n"; + myButton->setSubWidget(new ewol::widget::Composer(widget::Composer::String, composeString)); } else { - myButton->setSubWidget( new ewol::widget::Label(tmpObject->m_label) ); + myButton->setSubWidget(new ewol::widget::Label(tmpObject->m_label) ); } // add it in the widget list @@ -196,14 +197,18 @@ void ewol::widget::Menu::onReceiveMessage(const ewol::object::Message& _msg) { EWOL_ERROR("Allocation Error"); } else { if (m_listElement[jjj]->m_image.size()!=0) { - myButton->setSubWidget( - new ewol::widget::Composer(widget::Composer::String, - std::string("\n") + - " \n" - " m_image + "\" size=\"8,8mm\"/>\n" - " \n" - " \n" - "\n")); + + std::string composeString = "\n"; + composeString+= " \n"; + if (std::end_with(m_listElement[jjj]->m_image, ".edf") == true) { + composeString+=" m_image + "\" size=\"8,8mm\" distance-field='true'/>\n"; + } else { + composeString+=" m_image + "\" size=\"8,8mm\"/>\n"; + } + composeString+=" \n"; + composeString+=" \n"; + composeString+="\n"; + myButton->setSubWidget(new ewol::widget::Composer(widget::Composer::String, composeString)); } else { if (true == menuHaveImage) { myButton->setSubWidget( diff --git a/sources/ewol/widget/meta/FileChooser.cpp b/sources/ewol/widget/meta/FileChooser.cpp index f028f1fb..779f79c6 100644 --- a/sources/ewol/widget/meta/FileChooser.cpp +++ b/sources/ewol/widget/meta/FileChooser.cpp @@ -74,13 +74,13 @@ ewol::widget::FileChooser::FileChooser(void) { + " \n" + " \n" + " \n" @@ -104,13 +104,13 @@ ewol::widget::FileChooser::FileChooser(void) { + " \n" + " \n" + " \n" - + " \n" + + " \n" + " \n" + " \n" + " \n" - + " \n" + + " \n" + " \n" - + " \n" + + " \n" + " \n" + " \n" + " \n" diff --git a/sources/lutin_ewol.py b/sources/lutin_ewol.py index 4ff94450..3c85cfa3 100755 --- a/sources/lutin_ewol.py +++ b/sources/lutin_ewol.py @@ -107,6 +107,7 @@ def create(target): 'ewol/resource/ConfigFile.cpp', 'ewol/resource/FontFreeType.cpp', 'ewol/resource/Image.cpp', + 'ewol/resource/ImageDF.cpp', 'ewol/resource/Manager.cpp', 'ewol/resource/Program.cpp', 'ewol/resource/Resource.cpp', @@ -166,6 +167,7 @@ def create(target): myModule.copy_folder('../data/color3.*','') myModule.copy_folder('../data/textured3D2.*','') myModule.copy_folder('../data/textured3D.*','') + myModule.copy_folder('../data/texturedDF.*','') myModule.copy_folder('../data/fontDistanceField/*','fontDistanceField') # name of the dependency