From b1394ce0bf470e303f260632fd162e59fe57eb76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89milie=20Feral?= Date: Sun, 15 Jan 2017 20:00:54 +0100 Subject: [PATCH] [poincare] Create a class symbol layout to be used by sum and product layout Change-Id: I468ddd190518d9f904d4b0ebdde9e268d8d6e51c --- poincare/Makefile | 1 + poincare/src/layout/sum_layout.cpp | 61 ------------------------- poincare/src/layout/sum_layout.h | 21 ++------- poincare/src/layout/symbol_layout.cpp | 64 +++++++++++++++++++++++++++ poincare/src/layout/symbol_layout.h | 25 +++++++++++ 5 files changed, 94 insertions(+), 78 deletions(-) create mode 100644 poincare/src/layout/symbol_layout.cpp create mode 100644 poincare/src/layout/symbol_layout.h diff --git a/poincare/Makefile b/poincare/Makefile index 5b6fe17ad..ddece8982 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -49,6 +49,7 @@ objs += $(addprefix poincare/src/layout/,\ string_layout.o\ sum_layout.o\ subscript_layout.o\ + symbol_layout.o\ ) tests += $(addprefix poincare/test/,\ diff --git a/poincare/src/layout/sum_layout.cpp b/poincare/src/layout/sum_layout.cpp index 21668f7ce..509e2225a 100644 --- a/poincare/src/layout/sum_layout.cpp +++ b/poincare/src/layout/sum_layout.cpp @@ -20,24 +20,6 @@ const uint8_t symbolPixel[SumLayout::k_symbolHeight][SumLayout::k_symbolWidth] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, }; -SumLayout::SumLayout(ExpressionLayout * lowerBoundLayout, ExpressionLayout * upperBoundLayout, ExpressionLayout * argumentLayout) : - ExpressionLayout(), - m_lowerBoundLayout(lowerBoundLayout), - m_upperBoundLayout(upperBoundLayout), - m_argumentLayout(argumentLayout) -{ - m_lowerBoundLayout->setParent(this); - m_upperBoundLayout->setParent(this); - m_argumentLayout->setParent(this); - m_baseline = max(m_upperBoundLayout->size().height()+k_boundHeightMargin+k_symbolHeight, m_argumentLayout->baseline()); -} - -SumLayout::~SumLayout() { - delete m_lowerBoundLayout; - delete m_upperBoundLayout; - delete m_argumentLayout; -} - void SumLayout::render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) { KDSize upperBoundSize = m_upperBoundLayout->size(); KDSize lowerBoundSize = m_lowerBoundLayout->size(); @@ -47,46 +29,3 @@ void SumLayout::render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDCo k_symbolWidth, k_symbolHeight); ctx->blendRectWithMask(symbolFrame, expressionColor, (const uint8_t *)symbolPixel, (KDColor *)workingBuffer); } - -KDSize SumLayout::computeSize() { - KDSize argumentSize = m_argumentLayout->size(); - KDSize lowerBoundSize = m_lowerBoundLayout->size(); - KDSize upperBoundSize = m_upperBoundLayout->size(); - return KDSize( - max(max(k_symbolWidth, lowerBoundSize.width()), upperBoundSize.width())+k_argumentWidthMargin+argumentSize.width(), - m_baseline + max(k_boundHeightMargin+lowerBoundSize.height(), argumentSize.height() - m_argumentLayout->baseline()) - ); -} - -ExpressionLayout * SumLayout::child(uint16_t index) { - switch (index) { - case 0: - return m_upperBoundLayout; - case 1: - return m_lowerBoundLayout; - case 2: - return m_argumentLayout; - default: - return nullptr; - } -} - -KDPoint SumLayout::positionOfChild(ExpressionLayout * child) { - KDSize lowerBoundSize = m_lowerBoundLayout->size(); - KDSize upperBoundSize = m_upperBoundLayout->size(); - KDCoordinate x = 0; - KDCoordinate y = 0; - if (child == m_lowerBoundLayout) { - x = max(max(0, (k_symbolWidth-lowerBoundSize.width())/2), (upperBoundSize.width()-lowerBoundSize.width())/2); - y = m_baseline + k_boundHeightMargin; - } else if (child == m_upperBoundLayout) { - x = max(max(0, (k_symbolWidth-upperBoundSize.width())/2), (lowerBoundSize.width()-upperBoundSize.width())/2); - y = m_baseline - k_symbolHeight- k_boundHeightMargin-upperBoundSize.height(); - } else if (child == m_argumentLayout) { - x = max(max(k_symbolWidth, lowerBoundSize.width()), upperBoundSize.width())+k_argumentWidthMargin; - y = m_baseline - m_argumentLayout->baseline(); - } else { - assert(false); - } - return KDPoint(x,y); -} diff --git a/poincare/src/layout/sum_layout.h b/poincare/src/layout/sum_layout.h index d1301402a..e942632ce 100644 --- a/poincare/src/layout/sum_layout.h +++ b/poincare/src/layout/sum_layout.h @@ -1,26 +1,13 @@ #ifndef POINCARE_SUM_LAYOUT_H #define POINCARE_SUM_LAYOUT_H -#include -#include +#include "symbol_layout.h" -class SumLayout : public ExpressionLayout { +class SumLayout : public SymbolLayout { public: - SumLayout(ExpressionLayout * lowerBoundLayout, ExpressionLayout * upperBoundLayout, ExpressionLayout * argumentLayout); - ~SumLayout(); - constexpr static KDCoordinate k_symbolHeight = 15; - constexpr static KDCoordinate k_symbolWidth = 9; -protected: - void render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) override; - KDSize computeSize() override; - ExpressionLayout * child(uint16_t index) override; - KDPoint positionOfChild(ExpressionLayout * child) override; + using SymbolLayout::SymbolLayout; private: - constexpr static KDCoordinate k_boundHeightMargin = 2; - constexpr static KDCoordinate k_argumentWidthMargin = 2; - ExpressionLayout * m_lowerBoundLayout; - ExpressionLayout * m_upperBoundLayout; - ExpressionLayout * m_argumentLayout; + void render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) override; }; #endif diff --git a/poincare/src/layout/symbol_layout.cpp b/poincare/src/layout/symbol_layout.cpp new file mode 100644 index 000000000..95f233709 --- /dev/null +++ b/poincare/src/layout/symbol_layout.cpp @@ -0,0 +1,64 @@ +#include "symbol_layout.h" +#include +#include + +SymbolLayout::SymbolLayout(ExpressionLayout * lowerBoundLayout, ExpressionLayout * upperBoundLayout, ExpressionLayout * argumentLayout) : + ExpressionLayout(), + m_lowerBoundLayout(lowerBoundLayout), + m_upperBoundLayout(upperBoundLayout), + m_argumentLayout(argumentLayout) +{ + m_lowerBoundLayout->setParent(this); + m_upperBoundLayout->setParent(this); + m_argumentLayout->setParent(this); + m_baseline = max(m_upperBoundLayout->size().height()+k_boundHeightMargin+k_symbolHeight, m_argumentLayout->baseline()); +} + +SymbolLayout::~SymbolLayout() { + delete m_lowerBoundLayout; + delete m_upperBoundLayout; + delete m_argumentLayout; +} + +KDSize SymbolLayout::computeSize() { + KDSize argumentSize = m_argumentLayout->size(); + KDSize lowerBoundSize = m_lowerBoundLayout->size(); + KDSize upperBoundSize = m_upperBoundLayout->size(); + return KDSize( + max(max(k_symbolWidth, lowerBoundSize.width()), upperBoundSize.width())+k_argumentWidthMargin+argumentSize.width(), + m_baseline + max(k_boundHeightMargin+lowerBoundSize.height(), argumentSize.height() - m_argumentLayout->baseline()) + ); +} + +ExpressionLayout * SymbolLayout::child(uint16_t index) { + switch (index) { + case 0: + return m_upperBoundLayout; + case 1: + return m_lowerBoundLayout; + case 2: + return m_argumentLayout; + default: + return nullptr; + } +} + +KDPoint SymbolLayout::positionOfChild(ExpressionLayout * child) { + KDSize lowerBoundSize = m_lowerBoundLayout->size(); + KDSize upperBoundSize = m_upperBoundLayout->size(); + KDCoordinate x = 0; + KDCoordinate y = 0; + if (child == m_lowerBoundLayout) { + x = max(max(0, (k_symbolWidth-lowerBoundSize.width())/2), (upperBoundSize.width()-lowerBoundSize.width())/2); + y = m_baseline + k_boundHeightMargin; + } else if (child == m_upperBoundLayout) { + x = max(max(0, (k_symbolWidth-upperBoundSize.width())/2), (lowerBoundSize.width()-upperBoundSize.width())/2); + y = m_baseline - k_symbolHeight- k_boundHeightMargin-upperBoundSize.height(); + } else if (child == m_argumentLayout) { + x = max(max(k_symbolWidth, lowerBoundSize.width()), upperBoundSize.width())+k_argumentWidthMargin; + y = m_baseline - m_argumentLayout->baseline(); + } else { + assert(false); + } + return KDPoint(x,y); +} diff --git a/poincare/src/layout/symbol_layout.h b/poincare/src/layout/symbol_layout.h new file mode 100644 index 000000000..1f473147f --- /dev/null +++ b/poincare/src/layout/symbol_layout.h @@ -0,0 +1,25 @@ +#ifndef POINCARE_SYMBOL_LAYOUT_H +#define POINCARE_SYMBOL_LAYOUT_H + +#include +#include + +class SymbolLayout : public ExpressionLayout { +public: + SymbolLayout(ExpressionLayout * lowerBoundLayout, ExpressionLayout * upperBoundLayout, ExpressionLayout * argumentLayout); + ~SymbolLayout(); + constexpr static KDCoordinate k_symbolHeight = 15; + constexpr static KDCoordinate k_symbolWidth = 9; +protected: + constexpr static KDCoordinate k_boundHeightMargin = 2; + ExpressionLayout * m_lowerBoundLayout; + ExpressionLayout * m_upperBoundLayout; + ExpressionLayout * m_argumentLayout; +private: + KDSize computeSize() override; + ExpressionLayout * child(uint16_t index) override; + KDPoint positionOfChild(ExpressionLayout * child) override; + constexpr static KDCoordinate k_argumentWidthMargin = 2; +}; + +#endif