Numworks Epsilon  1.4.1
Graphing Calculator Operating System
nth_root_layout.cpp
Go to the documentation of this file.
1 #include <string.h>
2 #include <assert.h>
3 #include "nth_root_layout.h"
4 
5 namespace Poincare {
6 
8  {0x00, 0xFF, 0xFF, 0xFF, 0xFF},
9  {0xFF, 0x00, 0xFF, 0xFF, 0xFF},
10  {0xFF, 0x00, 0xFF, 0xFF, 0xFF},
11  {0xFF, 0xFF, 0x00, 0xFF, 0xFF},
12  {0xFF, 0xFF, 0x00, 0xFF, 0xFF},
13  {0xFF, 0xFF, 0xFF, 0x00, 0xFF},
14  {0xFF, 0xFF, 0xFF, 0x00, 0xFF},
15  {0xFF, 0xFF, 0xFF, 0xFF, 0x00},
16 };
17 
20  m_radicandLayout(radicandLayout),
21  m_indexLayout(indexLayout)
22 {
23  m_radicandLayout->setParent(this);
24  if (m_indexLayout != nullptr) {
25  m_indexLayout->setParent(this);
26  m_baseline = max(m_radicandLayout->baseline() + k_radixLineThickness + k_heightMargin,
27  m_indexLayout->size().height() + k_indexHeight);
28  } else {
29  m_baseline = m_radicandLayout->baseline() + k_radixLineThickness + k_heightMargin;
30  }
31 }
32 
34  delete m_radicandLayout;
35  if (m_indexLayout != nullptr) {
36  delete m_indexLayout;
37  }
38 }
39 
40 void NthRootLayout::render(KDContext * ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) {
41  KDSize radicandSize = m_radicandLayout->size();
42  KDSize indexSize = m_indexLayout != nullptr ? m_indexLayout->size() : KDSize(k_leftRadixWidth,0);
44  KDRect leftRadixFrame(p.x() + indexSize.width() + k_widthMargin - k_leftRadixWidth,
45  p.y() + m_baseline + radicandSize.height() - m_radicandLayout->baseline() + k_heightMargin - k_leftRadixHeight,
47  ctx->blendRectWithMask(leftRadixFrame, expressionColor, (const uint8_t *)radixPixel, (KDColor *)workingBuffer);
48  if (indexSize.height() + k_indexHeight > m_radicandLayout->baseline() + k_radixLineThickness + k_heightMargin) {
49  ctx->fillRect(KDRect(p.x() + indexSize.width() + k_widthMargin,
50  p.y() + indexSize.height() + k_indexHeight - m_radicandLayout->baseline() - k_radixLineThickness - k_heightMargin,
51  k_radixLineThickness,
52  radicandSize.height() + 2*k_heightMargin + k_radixLineThickness), expressionColor);
53  ctx->fillRect(KDRect(p.x() + indexSize.width() + k_widthMargin,
54  p.y() + indexSize.height() + k_indexHeight - m_radicandLayout->baseline() - k_radixLineThickness - k_heightMargin,
55  radicandSize.width() + 2*k_widthMargin,
56  k_radixLineThickness), expressionColor);
57  ctx->fillRect(KDRect(p.x() + indexSize.width() + k_widthMargin + radicandSize.width() + 2*k_widthMargin,
58  p.y() + indexSize.height() + k_indexHeight - m_radicandLayout->baseline() - k_radixLineThickness - k_heightMargin,
59  k_radixLineThickness,
60  k_rightRadixHeight + k_radixLineThickness), expressionColor);
61  } else {
62  ctx->fillRect(KDRect(p.x() + indexSize.width() + k_widthMargin,
63  p.y(),
64  k_radixLineThickness,
65  radicandSize.height() + 2*k_heightMargin + k_radixLineThickness), expressionColor);
66  ctx->fillRect(KDRect(p.x() + indexSize.width() + k_widthMargin,
67  p.y(),
68  radicandSize.width() + 2*k_widthMargin,
69  k_radixLineThickness), expressionColor);
70  ctx->fillRect(KDRect(p.x() + indexSize.width() + k_widthMargin + radicandSize.width() + 2*k_widthMargin,
71  p.y(),
72  k_radixLineThickness,
73  k_rightRadixHeight + k_radixLineThickness), expressionColor);
74  }
75 
76 }
77 
79  KDSize radicandSize = m_radicandLayout->size();
80  KDSize indexSize = m_indexLayout != nullptr ? m_indexLayout->size() : KDSize(k_leftRadixWidth,0);
81  return KDSize(
82  indexSize.width() + 3*k_widthMargin + 2*k_radixLineThickness + radicandSize.width(),
83  m_baseline + radicandSize.height() - m_radicandLayout->baseline() + k_heightMargin
84  );
85 }
86 
88  switch (index) {
89  case 0:
90  return m_radicandLayout;
91  case 1:
92  return m_indexLayout;
93  default:
94  return nullptr;
95  }
96 }
97 
99  KDCoordinate x = 0;
100  KDCoordinate y = 0;
101  KDSize indexSize = m_indexLayout != nullptr ? m_indexLayout->size() : KDSize(k_leftRadixWidth,0);
102  if (child == m_indexLayout) {
103  x = 0;
104  y = m_baseline - indexSize.height() - k_indexHeight;
105  } else if (child == m_radicandLayout) {
106  x = indexSize.width() + 2*k_widthMargin + k_radixLineThickness;
107  y = m_baseline - m_radicandLayout->baseline();
108  } else {
109  assert(false);
110  }
111  return KDPoint(x,y);
112 }
113 
114 }
115 
KDCoordinate y() const
Definition: point.h:11
void render(KDContext *ctx, KDPoint p, KDColor expressionColor, KDColor backgroundColor) override
ExpressionLayout * child(uint16_t index) override
NthRootLayout(ExpressionLayout *radicandLayout, ExpressionLayout *indexLayout)
#define assert(e)
Definition: assert.h:9
int16_t KDCoordinate
Definition: coordinate.h:6
constexpr KDCoordinate width() const
Definition: size.h:10
void blendRectWithMask(KDRect rect, KDColor color, const uint8_t *mask, KDColor *workingBuffer)
unsigned short uint16_t
Definition: stdint.h:5
unsigned char uint8_t
Definition: stdint.h:4
Definition: point.h:6
Definition: size.h:6
static constexpr KDCoordinate k_leftRadixWidth
KDPoint positionOfChild(ExpressionLayout *child) override
const uint8_t radixPixel[NthRootLayout::k_leftRadixHeight][NthRootLayout::k_leftRadixWidth]
Definition: rect.h:26
void fillRect(KDRect rect, KDColor color)
Definition: context_rect.cpp:8
Definition: color.h:6
static constexpr KDCoordinate k_leftRadixHeight
KDCoordinate x() const
Definition: point.h:10
KDSize computeSize() override
void setParent(ExpressionLayout *parent)
constexpr KDCoordinate height() const
Definition: size.h:11