[DEV] add distance field for theme image just a big test
This commit is contained in:
parent
10f9e7c60f
commit
50c9be054d
24
data/texturedDF.frag
Normal file
24
data/texturedDF.frag
Normal file
@ -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);
|
||||
|
||||
}
|
22
data/texturedDF.vert
Normal file
22
data/texturedDF.vert
Normal file
@ -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;
|
||||
}
|
2
external/egami
vendored
2
external/egami
vendored
@ -1 +1 @@
|
||||
Subproject commit cd88edc7085edbef3d78bee02104c697a0713057
|
||||
Subproject commit 2fe76f92055c61a11e84bafbecc4aa0488e0b16e
|
2
external/etk
vendored
2
external/etk
vendored
@ -1 +1 @@
|
||||
Subproject commit 7d28c888f7d4d9b3aa92274db82ffeaa63a6a681
|
||||
Subproject commit 7f26881c3e8e26b1813b039b6ffd973a5126d1a4
|
@ -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();
|
||||
}
|
||||
|
@ -13,11 +13,14 @@
|
||||
#include <ewol/compositing/Compositing.h>
|
||||
#include <ewol/resource/Program.h>
|
||||
#include <ewol/resource/Image.h>
|
||||
#include <ewol/resource/ImageDF.h>
|
||||
|
||||
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<vec3 > m_coord; //!< internal coord of the object
|
||||
std::vector<vec2 > m_coordTex; //!< internal texture coordinate for every point
|
||||
std::vector<etk::Color<float> > 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
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
225
sources/ewol/resource/ImageDF.cpp
Normal file
225
sources/ewol/resource/ImageDF.cpp
Normal file
@ -0,0 +1,225 @@
|
||||
/**
|
||||
* @author Edouard DUPIN
|
||||
*
|
||||
* @copyright 2011, Edouard DUPIN, all right reserved
|
||||
*
|
||||
* @license BSD v3 (see license file)
|
||||
*/
|
||||
|
||||
|
||||
#include <etk/types.h>
|
||||
#include <egami/egami.h>
|
||||
#include <ewol/resource/Manager.h>
|
||||
#include <ewol/resource/ImageDF.h>
|
||||
#include <ewol/resource/Texture.h>
|
||||
#include <edtaa3/edtaa3func.h>
|
||||
|
||||
|
||||
#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<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,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<ewol::resource::ImageDF*>(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<ewol::Resource*>(_object);
|
||||
getManager().release(object2);
|
||||
_object = NULL;
|
||||
}
|
||||
|
57
sources/ewol/resource/ImageDF.h
Normal file
57
sources/ewol/resource/ImageDF.h
Normal file
@ -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 <etk/types.h>
|
||||
#include <etk/types.h>
|
||||
#include <egami/Image.h>
|
||||
#include <egami/ImageMono.h>
|
||||
#include <ewol/resource/Texture.h>
|
||||
#include <ewol/resource/Resource.h>
|
||||
|
||||
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
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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("<composer>\n") +
|
||||
" <sizer mode=\"hori\">\n"
|
||||
" <image src=\"" + tmpObject->m_image + "\" size=\"8,8mm\"/>\n"
|
||||
" <label>" + tmpObject->m_label + "</label>\n"
|
||||
" </sizer>\n"
|
||||
"</composer>\n"));
|
||||
std::string composeString ="<sizer mode=\"hori\">\n";
|
||||
if (std::end_with(tmpObject->m_image, ".edf") == true) {
|
||||
composeString+=" <image src=\"" + tmpObject->m_image + "\" size=\"8,8mm\" distance-field='true'/>\n";
|
||||
} else {
|
||||
composeString+=" <image src=\"" + tmpObject->m_image + "\" size=\"8,8mm\"/>\n";
|
||||
}
|
||||
composeString+=" <label>" + tmpObject->m_label + "</label>\n";
|
||||
composeString+="</sizer>\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("<composer expand=\"true,false\" fill=\"true,true\">\n") +
|
||||
" <sizer mode=\"hori\" expand=\"true,false\" fill=\"true,true\" lock=\"true\">\n"
|
||||
" <image src=\"" + m_listElement[jjj]->m_image + "\" size=\"8,8mm\"/>\n"
|
||||
" <label exand=\"true,true\" fill=\"true,true\"><![CDATA[" + m_listElement[jjj]->m_label + " ]]></label>\n"
|
||||
" </sizer>\n"
|
||||
"</composer>\n"));
|
||||
|
||||
std::string composeString = "<composer expand=\"true,false\" fill=\"true,true\">\n";
|
||||
composeString+= " <sizer mode=\"hori\" expand=\"true,false\" fill=\"true,true\" lock=\"true\">\n";
|
||||
if (std::end_with(m_listElement[jjj]->m_image, ".edf") == true) {
|
||||
composeString+=" <image src=\"" + m_listElement[jjj]->m_image + "\" size=\"8,8mm\" distance-field='true'/>\n";
|
||||
} else {
|
||||
composeString+=" <image src=\"" + m_listElement[jjj]->m_image + "\" size=\"8,8mm\"/>\n";
|
||||
}
|
||||
composeString+=" <label exand=\"true,true\" fill=\"true,true\">" + m_listElement[jjj]->m_label + "</label>\n";
|
||||
composeString+=" </sizer>\n";
|
||||
composeString+="</composer>\n";
|
||||
myButton->setSubWidget(new ewol::widget::Composer(widget::Composer::String, composeString));
|
||||
} else {
|
||||
if (true == menuHaveImage) {
|
||||
myButton->setSubWidget(
|
||||
|
@ -74,13 +74,13 @@ ewol::widget::FileChooser::FileChooser(void) {
|
||||
+ " <spacer expand='true,false'/>\n"
|
||||
+ " <button name='[" + std::to_string(getId()) + "]file-shooser:button-validate'>\n"
|
||||
+ " <sizer mode='hori'>\n"
|
||||
+ " <image src='THEME:GUI:Load.svg' fill='true' size='7,7mm'/>\n"
|
||||
+ " <image src='THEME:GUI:Load.edf' fill='true' size='7,7mm' distance-field='true'/>\n"
|
||||
+ " <label name='[" + std::to_string(getId()) + "]file-shooser:validate-label'>Validate</label>\n"
|
||||
+ " </sizer>\n"
|
||||
+ " </button>\n"
|
||||
+ " <button name='[" + std::to_string(getId()) + "]file-shooser:button-cancel'>\n"
|
||||
+ " <sizer mode='hori'>\n"
|
||||
+ " <image src='THEME:GUI:Remove.svg' fill='true' size='7,7mm'/>\n"
|
||||
+ " <image src='THEME:GUI:Remove.edf' fill='true' size='7,7mm' distance-field='true'/>\n"
|
||||
+ " <label name='[" + std::to_string(getId()) + "]file-shooser:cancel-label'>Cancel</label>\n"
|
||||
+ " </sizer>\n"
|
||||
+ " </button>\n"
|
||||
@ -104,13 +104,13 @@ ewol::widget::FileChooser::FileChooser(void) {
|
||||
+ " <spacer min-size='2,2mm'/>\n"
|
||||
+ " </sizer>\n"
|
||||
+ " <sizer mode='hori'>\n"
|
||||
+ " <image name='[" + std::to_string(getId()) + "]file-shooser:img-file' src='THEME:GUI:File.svg' expand='false' size='8,8mm'/>\n"
|
||||
+ " <image name='[" + std::to_string(getId()) + "]file-shooser:img-file' src='THEME:GUI:File.edf' expand='false' size='8,8mm' distance-field='true'/>\n"
|
||||
+ " <entry name='[" + std::to_string(getId()) + "]file-shooser:entry-file' expand='true,false' fill='true,false'/>\n"
|
||||
+ " </sizer>\n"
|
||||
+ " <sizer mode='hori'>\n"
|
||||
+ " <image name='[" + std::to_string(getId()) + "]file-shooser:img-folder' src='THEME:GUI:Folder.svg' expand='false' size='8,8mm'/>\n"
|
||||
+ " <image name='[" + std::to_string(getId()) + "]file-shooser:img-folder' src='THEME:GUI:Folder.edf' expand='false' size='8,8mm' distance-field='true'/>\n"
|
||||
+ " <entry name='[" + std::to_string(getId()) + "]file-shooser:entry-folder' expand='true,false' fill='true,false'/>\n"
|
||||
+ " <image name='[" + std::to_string(getId()) + "]file-shooser:img-home' src='THEME:GUI:Home.svg' expand='false' size='8,8mm'/>\n"
|
||||
+ " <image name='[" + std::to_string(getId()) + "]file-shooser:img-home' src='THEME:GUI:Home.edf' expand='false' size='8,8mm' distance-field='true'/>\n"
|
||||
+ " </sizer>\n"
|
||||
+ " <label name='[" + std::to_string(getId()) + "]file-shooser:title-label'>File chooser ...</label>\n"
|
||||
+ " </sizer>\n"
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user