From 96aaccaa62f69e6bf13832934111123c71811367 Mon Sep 17 00:00:00 2001 From: Romain Goyet Date: Tue, 19 May 2015 11:13:31 +0200 Subject: [PATCH] Displaying a fraction --- kandinsky/fonts/Makefile | 17 ++++++++++ kandinsky/include/kandinsky.h | 2 +- kandinsky/include/kandinsky/line.h | 2 +- kandinsky/include/kandinsky/point.h | 11 ------- kandinsky/include/kandinsky/rect.h | 26 +++++++++++++++ kandinsky/include/kandinsky/text.h | 2 +- kandinsky/include/kandinsky/types.h | 18 +++++++++++ kandinsky/src/line.c | 2 ++ kandinsky/src/rect.c | 9 ++++++ poincare/Makefile | 2 +- poincare/include/poincare.h | 1 + poincare/include/poincare/expression.h | 8 +++++ poincare/include/poincare/fraction.h | 17 ++++++++++ poincare/include/poincare/number.h | 5 ++- poincare/src/expression.cpp | 5 +-- poincare/src/fraction.cpp | 45 ++++++++++++++++++++++++++ poincare/src/number.cpp | 9 ++++++ 17 files changed, 161 insertions(+), 20 deletions(-) create mode 100644 kandinsky/fonts/Makefile delete mode 100644 kandinsky/include/kandinsky/point.h create mode 100644 kandinsky/include/kandinsky/rect.h create mode 100644 kandinsky/include/kandinsky/types.h create mode 100644 kandinsky/src/rect.c create mode 100644 poincare/include/poincare/fraction.h create mode 100644 poincare/src/fraction.cpp diff --git a/kandinsky/fonts/Makefile b/kandinsky/fonts/Makefile new file mode 100644 index 000000000..ce8ea83e9 --- /dev/null +++ b/kandinsky/fonts/Makefile @@ -0,0 +1,17 @@ +FREETYPE_PATH := /usr/local/Cellar/freetype/2.5.5 +LIBPNG_PATH = /usr/local/Cellar/libpng/1.6.17 +#LIBPNG_PATH is optional, PNGs won't be generated + +CC := clang +CFLAGS := -I$(FREETYPE_PATH)/include/freetype2 +LDFLAGS := -L$(FREETYPE_PATH)/lib -lfreetype +ifdef LIBPNG_PATH +CFLAGS += -I$(LIBPNG_PATH)/include -DGENERATE_PNG=1 +LDFLAGS += -L$(LIBPNG_PATH)/lib -lpng +endif + +default: + $(CC) $(CFLAGS) $(LDFLAGS) rasterizer.c -o rasterizer + +clean: + rm rasterizer diff --git a/kandinsky/include/kandinsky.h b/kandinsky/include/kandinsky.h index 1982d0dcf..0e92a888e 100644 --- a/kandinsky/include/kandinsky.h +++ b/kandinsky/include/kandinsky.h @@ -3,8 +3,8 @@ #include #include -#include #include #include +#include #endif diff --git a/kandinsky/include/kandinsky/line.h b/kandinsky/include/kandinsky/line.h index 5bb8c0ead..02ec9a706 100644 --- a/kandinsky/include/kandinsky/line.h +++ b/kandinsky/include/kandinsky/line.h @@ -1,7 +1,7 @@ #ifndef KANDINSKY_LINE_H #define KANDINSKY_LINE_H -#include +#include void KDDrawLine(KDPoint p1, KDPoint p2); diff --git a/kandinsky/include/kandinsky/point.h b/kandinsky/include/kandinsky/point.h deleted file mode 100644 index a90c2958d..000000000 --- a/kandinsky/include/kandinsky/point.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef KANDINSKY_POINT_H -#define KANDINSKY_POINT_H - -#include - -typedef struct { - KDCoordinate x; - KDCoordinate y; -} KDPoint; - -#endif diff --git a/kandinsky/include/kandinsky/rect.h b/kandinsky/include/kandinsky/rect.h new file mode 100644 index 000000000..91be83501 --- /dev/null +++ b/kandinsky/include/kandinsky/rect.h @@ -0,0 +1,26 @@ +#ifndef KANDINSKY_RECT_H +#define KANDINSKY_RECT_H + +#include +#include + +typedef struct { + union { + struct { + KDCoordinate x; + KDCoordinate y; + }; + KDPoint origin; + }; + union { + struct { + KDCoordinate width; + KDCoordinate height; + }; + KDPoint size; + }; +} KDRect; + +void KDFillRect(KDRect rect, KDColor color); + +#endif diff --git a/kandinsky/include/kandinsky/text.h b/kandinsky/include/kandinsky/text.h index 6067392a7..78292601d 100644 --- a/kandinsky/include/kandinsky/text.h +++ b/kandinsky/include/kandinsky/text.h @@ -1,7 +1,7 @@ #ifndef KANDINSKY_TEXT_H #define KANDINSKY_TEXT_H -#include +#include void KDDrawChar(char character, KDPoint p); void KDDrawString(char * text, KDPoint p); diff --git a/kandinsky/include/kandinsky/types.h b/kandinsky/include/kandinsky/types.h new file mode 100644 index 000000000..4d5493dd0 --- /dev/null +++ b/kandinsky/include/kandinsky/types.h @@ -0,0 +1,18 @@ +#ifndef KANDINSKY_TYPES_H +#define KANDINSKY_TYPES_H + +#include + +typedef uint16_t KDCoordinate; + +typedef struct { + KDCoordinate x; + KDCoordinate y; +} KDPoint; + +typedef struct { + KDCoordinate width; + KDCoordinate height; +} KDSize; + +#endif diff --git a/kandinsky/src/line.c b/kandinsky/src/line.c index 968e2331d..32a721197 100644 --- a/kandinsky/src/line.c +++ b/kandinsky/src/line.c @@ -1,6 +1,8 @@ #include +#include void KDDrawLine(KDPoint p1, KDPoint p2) { for (KDCoordinate x = p1.x; x +#include +#include + +void KDFillRect(KDRect rect, KDColor color) { + for (KDCoordinate y = rect.y ; y < (rect.y + rect.height); y++) { + memset(PIXEL_ADDRESS(rect.x, y), color, rect.width); + } +} diff --git a/poincare/Makefile b/poincare/Makefile index 5b0cd202f..0953f511d 100644 --- a/poincare/Makefile +++ b/poincare/Makefile @@ -1,2 +1,2 @@ SFLAGS += -Ipoincare/include -objs += $(addprefix poincare/src/, expression.o number.o) +objs += $(addprefix poincare/src/, expression.o number.o fraction.o) diff --git a/poincare/include/poincare.h b/poincare/include/poincare.h index eee3eec28..a5119c0f5 100644 --- a/poincare/include/poincare.h +++ b/poincare/include/poincare.h @@ -2,6 +2,7 @@ #define POINCARE_H #include +#include #include #endif diff --git a/poincare/include/poincare/expression.h b/poincare/include/poincare/expression.h index f83decf1f..18d169c5b 100644 --- a/poincare/include/poincare/expression.h +++ b/poincare/include/poincare/expression.h @@ -1,7 +1,15 @@ #ifndef POINCARE_EXPRESSION_H #define POINCARE_EXPRESSION_H +extern "C" { +#include +} + class Expression { + public: + virtual void draw() = 0; + virtual void layout() = 0; + KDRect m_frame; }; #endif diff --git a/poincare/include/poincare/fraction.h b/poincare/include/poincare/fraction.h new file mode 100644 index 000000000..e176ddfdf --- /dev/null +++ b/poincare/include/poincare/fraction.h @@ -0,0 +1,17 @@ +#ifndef POINCARE_FRACTION_H +#define POINCARE_FRACTION_H + +#include + +class Fraction : public Expression { + public: + Fraction(Expression * numerator, Expression * denominator); + virtual void draw(); +// protected: + virtual void layout(); + private: + Expression * m_numerator; + Expression * m_denominator; +}; + +#endif diff --git a/poincare/include/poincare/number.h b/poincare/include/poincare/number.h index d3c895bd9..eb9f9b50b 100644 --- a/poincare/include/poincare/number.h +++ b/poincare/include/poincare/number.h @@ -3,9 +3,12 @@ #include -class Number : Expression { +class Number : public Expression { public: Number(int v); + virtual void draw(); + protected: + virtual void layout(); private: int m_value; }; diff --git a/poincare/src/expression.cpp b/poincare/src/expression.cpp index 49cb524bf..7a1ef13b9 100644 --- a/poincare/src/expression.cpp +++ b/poincare/src/expression.cpp @@ -1,5 +1,2 @@ #include -/* -Expression::Expression(int v) : value(v) { -} -*/ + diff --git a/poincare/src/fraction.cpp b/poincare/src/fraction.cpp new file mode 100644 index 000000000..3eb2d462d --- /dev/null +++ b/poincare/src/fraction.cpp @@ -0,0 +1,45 @@ +#include + +static inline KDCoordinate max(KDCoordinate a, KDCoordinate b) { + return (a > b ? a : b); +} + +#define FRACTION_BORDER_LENGTH 2 +#define FRACTION_LINE_MARGIN 2 +#define FRACTION_LINE_HEIGHT 1 + +Fraction::Fraction(Expression * numerator, Expression * denominator) : + m_numerator(numerator), + m_denominator(denominator) { +} + +void Fraction::layout() { + m_numerator->layout(); + m_denominator->layout(); + + KDRect numFrame = m_numerator->m_frame; + KDRect denFrame = m_denominator->m_frame; + + m_frame.width = max(numFrame.width, denFrame.width) + 2*FRACTION_BORDER_LENGTH; + m_frame.height = numFrame.height + FRACTION_LINE_MARGIN + FRACTION_LINE_HEIGHT + FRACTION_LINE_MARGIN + denFrame.height; + + m_numerator->m_frame.origin = { + .x = (KDCoordinate)((m_frame.width - numFrame.width)/2), + .y = 0 + }; + + m_denominator->m_frame.origin = { + .x = (KDCoordinate)((m_frame.width - denFrame.width)/2), + .y = (KDCoordinate)(numFrame.height + 2*FRACTION_LINE_MARGIN + FRACTION_LINE_HEIGHT) + }; +} + +void Fraction::draw() { + m_numerator->draw(); + m_denominator->draw(); + + KDCoordinate fractionLineY = m_numerator->m_frame.height + FRACTION_LINE_MARGIN; + + KDDrawLine((KDPoint){.x = 0, .y = fractionLineY}, + (KDPoint){.x = m_frame.width, .y = fractionLineY}); +} diff --git a/poincare/src/number.cpp b/poincare/src/number.cpp index d6e106e2e..bd5ebac21 100644 --- a/poincare/src/number.cpp +++ b/poincare/src/number.cpp @@ -2,3 +2,12 @@ Number::Number(int v) : m_value(v) { } + +void Number::layout() { + m_frame.width = 20; + m_frame.height = 10; +} + +void Number::draw() { + KDFillRect(m_frame, 0x7F); +}