Merge with 'master'

This commit is contained in:
Túlio Henrique
2015-07-07 10:43:18 -03:00
22 changed files with 427 additions and 79 deletions

View File

@@ -174,7 +174,7 @@ set(CMAKE_CXX_FLAGS_COMPILESPEED "-O0")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O1 -g -fno-omit-frame-pointer")
set(CMAKE_CXX_FLAGS_RELEASE "-O2")
set(CMAKE_CXX_FLAGS_PERFORMANCE "-Ofast -mmmx -msse -msse2")
set(CMAKE_CXX_FLAGS_PERFORMANCE "-Ofast -march=native")
if(USE_LTO)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fwhole-program -flto")

View File

@@ -135,6 +135,12 @@ void PainterOGL1::drawCoords(CoordsBuffer& coordsBuffer, DrawMode drawMode)
#endif
}
void PainterOGL1::drawFillCoords(CoordsBuffer& coordsBuffer)
{
setTexture(nullptr);
drawCoords(coordsBuffer);
}
void PainterOGL1::drawTextureCoords(CoordsBuffer& coordsBuffer, const TexturePtr& texture)
{
if(texture->isEmpty())

View File

@@ -50,6 +50,7 @@ public:
void refreshState();
void drawCoords(CoordsBuffer& coordsBuffer, DrawMode drawMode = Triangles);
void drawFillCoords(CoordsBuffer& coordsBuffer);
void drawTextureCoords(CoordsBuffer& coordsBuffer, const TexturePtr& texture);
void drawTexturedRect(const Rect& dest, const TexturePtr& texture, const Rect& src);
void drawUpsideDownTexturedRect(const Rect& dest, const TexturePtr& texture, const Rect& src);

View File

@@ -120,6 +120,13 @@ void PainterOGL2::drawCoords(CoordsBuffer& coordsBuffer, DrawMode drawMode)
PainterShaderProgram::enableAttributeArray(PainterShaderProgram::TEXCOORD_ATTR);
}
void PainterOGL2::drawFillCoords(CoordsBuffer& coordsBuffer)
{
setDrawProgram(m_shaderProgram ? m_shaderProgram : m_drawSolidColorProgram.get());
setTexture(nullptr);
drawCoords(coordsBuffer);
}
void PainterOGL2::drawTextureCoords(CoordsBuffer& coordsBuffer, const TexturePtr& texture)
{
if(texture && texture->isEmpty())

View File

@@ -41,6 +41,7 @@ public:
void unbind();
void drawCoords(CoordsBuffer& coordsBuffer, DrawMode drawMode = Triangles);
void drawFillCoords(CoordsBuffer& coordsBuffer);
void drawTextureCoords(CoordsBuffer& coordsBuffer, const TexturePtr& texture);
void drawTexturedRect(const Rect& dest, const TexturePtr& texture, const Rect& src);
void drawUpsideDownTexturedRect(const Rect& dest, const TexturePtr& texture, const Rect& src);

View File

@@ -62,6 +62,7 @@ public:
virtual void clear(const Color& color) = 0;
virtual void drawCoords(CoordsBuffer& coordsBuffer, DrawMode drawMode = Triangles) = 0;
virtual void drawFillCoords(CoordsBuffer& coordsBuffer) = 0;
virtual void drawTextureCoords(CoordsBuffer& coordsBuffer, const TexturePtr& texture) = 0;
virtual void drawTexturedRect(const Rect& dest, const TexturePtr& texture, const Rect& src) = 0;
void drawTexturedRect(const Rect& dest, const TexturePtr& texture) { drawTexturedRect(dest, texture, Rect(Point(0,0), texture->getSize())); }

View File

@@ -49,6 +49,9 @@ UITextEdit::UITextEdit()
m_updatesEnabled = true;
m_selectionColor = Color::white;
m_selectionBackgroundColor = Color::black;
m_glyphsTextCoordsBuffer.enableHardwareCaching();
m_glyphsSelectCoordsBuffer.enableHardwareCaching();
m_glyphsMustRecache = true;
blinkCursor();
}
@@ -62,38 +65,36 @@ void UITextEdit::drawSelf(Fw::DrawPane drawPane)
drawImage(m_rect);
drawIcon(m_rect);
//TODO: text rendering could be much optimized by using vertex buffer or caching the render into a texture
int textLength = m_text.length();
const TexturePtr& texture = m_font->getTexture();
if(!texture)
return;
if(hasSelection()) {
if(m_color != Color::alpha) {
g_painter->setColor(m_color);
for(int i=0;i<m_selectionStart;++i)
g_painter->drawTexturedRect(m_glyphsCoords[i], texture, m_glyphsTexCoords[i]);
}
bool glyphsMustRecache = m_glyphsMustRecache;
if(glyphsMustRecache)
m_glyphsMustRecache = false;
for(int i=m_selectionStart;i<m_selectionEnd;++i) {
g_painter->setColor(m_selectionBackgroundColor);
g_painter->drawFilledRect(m_glyphsCoords[i]);
g_painter->setColor(m_selectionColor);
g_painter->drawTexturedRect(m_glyphsCoords[i], texture, m_glyphsTexCoords[i]);
if(m_color != Color::alpha) {
if(glyphsMustRecache) {
m_glyphsTextCoordsBuffer.clear();
for(int i=0;i<textLength;++i)
m_glyphsTextCoordsBuffer.addRect(m_glyphsCoords[i], m_glyphsTexCoords[i]);
}
if(m_color != Color::alpha) {
g_painter->setColor(m_color);
for(int i=m_selectionEnd;i<textLength;++i)
g_painter->drawTexturedRect(m_glyphsCoords[i], texture, m_glyphsTexCoords[i]);
}
} else if(m_color != Color::alpha) {
g_painter->setColor(m_color);
for(int i=0;i<textLength;++i)
g_painter->drawTexturedRect(m_glyphsCoords[i], texture, m_glyphsTexCoords[i]);
g_painter->drawTextureCoords(m_glyphsTextCoordsBuffer, texture);
}
if(hasSelection()) {
if(glyphsMustRecache) {
m_glyphsSelectCoordsBuffer.clear();
for(int i=m_selectionStart;i<m_selectionEnd;++i)
m_glyphsSelectCoordsBuffer.addRect(m_glyphsCoords[i], m_glyphsTexCoords[i]);
}
g_painter->setColor(m_selectionBackgroundColor);
g_painter->drawFillCoords(m_glyphsSelectCoordsBuffer);
g_painter->setColor(m_selectionColor);
g_painter->drawTextureCoords(m_glyphsSelectCoordsBuffer, texture);
}
// render cursor
if(isExplicitlyEnabled() && m_cursorVisible && m_cursorInRange && isActive() && m_cursorPos >= 0) {
@@ -136,6 +137,9 @@ void UITextEdit::update(bool focusCursor)
if(m_rect.isEmpty())
return;
// recache coords buffers
recacheGlyphs();
// map glyphs positions
Size textBoxSize;
const std::vector<Point>& glyphsPositions = m_font->calculateGlyphsPositions(text, m_textAlign, &textBoxSize);
@@ -360,6 +364,7 @@ void UITextEdit::setSelection(int start, int end)
m_selectionStart = stdext::clamp<int>(start, 0, (int)m_text.length());
m_selectionEnd = stdext::clamp<int>(end, 0, (int)m_text.length());
recacheGlyphs();
}
void UITextEdit::setTextHidden(bool hidden)
@@ -654,7 +659,7 @@ void UITextEdit::onFocusChange(bool focused, Fw::FocusReason reason)
else
blinkCursor();
update(true);
} else
} else if(m_selectable)
clearSelection();
UIWidget::onFocusChange(focused, reason);
}
@@ -796,7 +801,6 @@ bool UITextEdit::onMousePress(const Point& mousePos, Fw::MouseButton button)
}
return true;
}
return false;
}
@@ -807,6 +811,9 @@ bool UITextEdit::onMouseRelease(const Point& mousePos, Fw::MouseButton button)
bool UITextEdit::onMouseMove(const Point& mousePos, const Point& mouseMoved)
{
if(UIWidget::onMouseMove(mousePos, mouseMoved))
return true;
if(m_selectable && isPressed()) {
int pos = getTextPos(mousePos);
if(pos >= 0) {
@@ -815,7 +822,7 @@ bool UITextEdit::onMouseMove(const Point& mousePos, const Point& mouseMoved)
}
return true;
}
return UIWidget::onMouseMove(mousePos, mouseMoved);
return false;
}
bool UITextEdit::onDoubleClick(const Point& mousePos)

View File

@@ -108,6 +108,7 @@ protected:
private:
void disableUpdates() { m_updatesEnabled = false; }
void enableUpdates() { m_updatesEnabled = true; }
void recacheGlyphs() { m_glyphsMustRecache = true; }
Rect m_drawArea;
int m_cursorPos;
@@ -137,6 +138,10 @@ private:
std::vector<Rect> m_glyphsCoords;
std::vector<Rect> m_glyphsTexCoords;
CoordsBuffer m_glyphsTextCoordsBuffer;
CoordsBuffer m_glyphsSelectCoordsBuffer;
bool m_glyphsMustRecache;
};
#endif