34 #define INVALIDRECT Rect(-32768, -32768, -32768, -32768) 37 Canvas::Canvas(BitmappedDisplayController * displayController)
38 : m_displayController(displayController),
41 m_origin(Point(0, 0)),
42 m_clippingRect(INVALIDRECT)
47 void Canvas::setOrigin(
int X,
int Y)
53 void Canvas::setOrigin(
Point const & origin)
56 p.cmd = PrimitiveCmd::SetOrigin;
57 p.position = m_origin = origin;
58 m_displayController->addPrimitive(p);
62 void Canvas::setClippingRect(
Rect const & rect)
65 p.cmd = PrimitiveCmd::SetClippingRect;
66 p.rect = m_clippingRect = rect;
67 m_displayController->addPrimitive(p);
71 Rect Canvas::getClippingRect()
73 if (m_clippingRect == INVALIDRECT)
74 m_clippingRect =
Rect(0, 0, getWidth() - 1, getHeight() - 1);
75 return m_clippingRect;
79 void Canvas::waitCompletion(
bool waitVSync)
82 m_displayController->primitivesExecutionWait();
84 m_displayController->processPrimitives();
92 void Canvas::beginUpdate()
94 m_displayController->suspendBackgroundPrimitiveExecution();
98 void Canvas::endUpdate()
100 m_displayController->resumeBackgroundPrimitiveExecution();
107 p.cmd = PrimitiveCmd::Clear;
109 m_displayController->addPrimitive(p);
116 p.cmd = PrimitiveCmd::Reset;
117 m_displayController->addPrimitive(p);
121 void Canvas::scroll(
int offsetX,
int offsetY)
125 p.cmd = PrimitiveCmd::VScroll;
127 m_displayController->addPrimitive(p);
130 p.cmd = PrimitiveCmd::HScroll;
132 m_displayController->addPrimitive(p);
137 void Canvas::setScrollingRegion(
int X1,
int Y1,
int X2,
int Y2)
140 p.cmd = PrimitiveCmd::SetScrollingRegion;
142 m_displayController->addPrimitive(p);
146 void Canvas::setPixel(
int X,
int Y)
149 p.cmd = PrimitiveCmd::SetPixel;
151 m_displayController->addPrimitive(p);
155 void Canvas::setPixel(
int X,
int Y,
RGB888 const & color)
164 p.cmd = PrimitiveCmd::SetPixelAt;
165 p.pixelDesc = { pos, color };
166 m_displayController->addPrimitive(p);
170 void Canvas::moveTo(
int X,
int Y)
173 p.cmd = PrimitiveCmd::MoveTo;
175 m_displayController->addPrimitive(p);
179 void Canvas::setPenColor(
Color color)
181 setPenColor(
RGB888(color));
185 void Canvas::setPenColor(uint8_t red, uint8_t green, uint8_t blue)
187 setPenColor(
RGB888(red, green, blue));
191 void Canvas::setPenColor(
RGB888 const & color)
194 p.cmd = PrimitiveCmd::SetPenColor;
196 m_displayController->addPrimitive(p);
200 void Canvas::setBrushColor(
Color color)
202 setBrushColor(
RGB888(color));
206 void Canvas::setBrushColor(uint8_t red, uint8_t green, uint8_t blue)
208 setBrushColor(
RGB888(red, green, blue));
212 void Canvas::setPenWidth(
int value)
215 p.cmd = PrimitiveCmd::SetPenWidth;
217 m_displayController->addPrimitive(p);
224 p.cmd = PrimitiveCmd::SetLineEnds;
226 m_displayController->addPrimitive(p);
230 void Canvas::setBrushColor(
RGB888 const & color)
233 p.cmd = PrimitiveCmd::SetBrushColor;
235 m_displayController->addPrimitive(p);
239 void Canvas::lineTo(
int X,
int Y)
242 p.cmd = PrimitiveCmd::LineTo;
244 m_displayController->addPrimitive(p);
248 void Canvas::drawLine(
int X1,
int Y1,
int X2,
int Y2)
255 void Canvas::drawRectangle(
int X1,
int Y1,
int X2,
int Y2)
258 p.cmd = PrimitiveCmd::DrawRect;
260 m_displayController->addPrimitive(p);
264 void Canvas::drawRectangle(
Rect const & rect)
266 drawRectangle(rect.X1, rect.Y1, rect.X2, rect.Y2);
270 void Canvas::fillRectangle(
int X1,
int Y1,
int X2,
int Y2)
273 p.cmd = PrimitiveCmd::FillRect;
275 m_displayController->addPrimitive(p);
279 void Canvas::fillRectangle(
Rect const & rect)
282 p.cmd = PrimitiveCmd::FillRect;
284 m_displayController->addPrimitive(p);
288 void Canvas::invertRectangle(
int X1,
int Y1,
int X2,
int Y2)
294 void Canvas::invertRectangle(
Rect const & rect)
297 p.cmd = PrimitiveCmd::InvertRect;
299 m_displayController->addPrimitive(p);
303 void Canvas::swapRectangle(
int X1,
int Y1,
int X2,
int Y2)
306 p.cmd = PrimitiveCmd::SwapFGBG;
308 m_displayController->addPrimitive(p);
316 p.cmd = PrimitiveCmd::FillEllipse;
318 m_displayController->addPrimitive(p);
326 p.cmd = PrimitiveCmd::DrawEllipse;
328 m_displayController->addPrimitive(p);
335 p.cmd = PrimitiveCmd::DrawGlyph;
337 m_displayController->addPrimitive(p);
341 void Canvas::renderGlyphsBuffer(
int itemX,
int itemY, GlyphsBuffer
const * glyphsBuffer)
344 p.cmd = PrimitiveCmd::RenderGlyphsBuffer;
345 p.glyphsBufferRenderInfo = GlyphsBufferRenderInfo(itemX, itemY, glyphsBuffer);
346 m_displayController->addPrimitive(p);
353 p.cmd = PrimitiveCmd::SetGlyphOptions;
354 p.glyphOptions = options;
355 m_displayController->addPrimitive(p);
360 void Canvas::resetGlyphOptions()
369 p.cmd = PrimitiveCmd::SetPaintOptions;
370 p.paintOptions = options;
371 m_displayController->addPrimitive(p);
375 void Canvas::resetPaintOptions()
381 void Canvas::selectFont(FontInfo
const * fontInfo)
383 m_fontInfo = fontInfo;
387 void Canvas::drawChar(
int X,
int Y,
char c)
389 drawGlyph(
X,
Y, m_fontInfo->width, m_fontInfo->height, m_fontInfo->data, c);
393 void Canvas::drawText(
int X,
int Y,
char const * text,
bool wrap)
395 if (m_fontInfo ==
nullptr)
396 selectFont(&FONT_8x8);
397 drawText(m_fontInfo,
X,
Y, text, wrap);
401 void Canvas::drawText(FontInfo
const * fontInfo,
int X,
int Y,
char const * text,
bool wrap)
403 int fontWidth = fontInfo->width;
404 for (; *text; ++text,
X += fontWidth * m_textHorizRate) {
405 if (wrap &&
X >= getWidth()) {
407 Y += fontInfo->height;
409 if (fontInfo->chptr) {
411 uint8_t
const * chptr = fontInfo->data + fontInfo->chptr[(int)(*text)];
412 fontWidth = *chptr++;
413 drawGlyph(
X,
Y, fontWidth, fontInfo->height, chptr, 0);
416 drawGlyph(
X,
Y, fontInfo->width, fontInfo->height, fontInfo->data, *text);
422 void Canvas::drawTextWithEllipsis(FontInfo
const * fontInfo,
int X,
int Y,
char const * text,
int maxX)
424 int fontWidth = fontInfo->width;
425 int fontHeight = fontInfo->height;
426 for (; *text; ++text,
X += fontWidth) {
427 if (
X >= maxX - fontHeight) {
429 drawText(fontInfo,
X,
Y,
"...");
432 if (fontInfo->chptr) {
434 uint8_t
const * chptr = fontInfo->data + fontInfo->chptr[(int)(*text)];
435 fontWidth = *chptr++;
436 drawGlyph(
X,
Y, fontWidth, fontInfo->height, chptr, 0);
439 drawGlyph(
X,
Y, fontInfo->width, fontInfo->height, fontInfo->data, *text);
445 int Canvas::textExtent(FontInfo
const * fontInfo,
char const * text)
447 int fontWidth = fontInfo->width;
449 for (; *text; ++text, extent += fontWidth) {
450 if (fontInfo->chptr) {
452 uint8_t
const * chptr = fontInfo->data + fontInfo->chptr[(int)(*text)];
460 int Canvas::textExtent(
char const * text)
462 return textExtent(m_fontInfo, text);
466 void Canvas::drawTextFmt(
int X,
int Y,
const char *format, ...)
469 va_start(ap, format);
470 int size = vsnprintf(
nullptr, 0, format, ap) + 1;
473 va_start(ap, format);
475 vsnprintf(buf, size, format, ap);
476 drawText(
X,
Y, buf,
false);
482 void Canvas::copyRect(
int sourceX,
int sourceY,
int destX,
int destY,
int width,
int height)
484 moveTo(destX, destY);
485 int sourceX2 = sourceX +
width - 1;
486 int sourceY2 = sourceY +
height - 1;
488 p.cmd = PrimitiveCmd::CopyRect;
489 p.rect =
Rect(sourceX, sourceY, sourceX2, sourceY2);
490 m_displayController->addPrimitive(p);
494 void Canvas::drawBitmap(
int X,
int Y,
Bitmap const * bitmap)
497 p.cmd = PrimitiveCmd::DrawBitmap;
498 p.bitmapDrawingInfo = BitmapDrawingInfo(
X,
Y, bitmap);
499 m_displayController->addPrimitive(p);
503 void Canvas::swapBuffers()
506 p.cmd = PrimitiveCmd::SwapBuffers;
507 p.notifyTask = xTaskGetCurrentTaskHandle();
508 m_displayController->addPrimitive(p);
509 m_displayController->primitivesExecutionWait();
513 void Canvas::drawPath(
Point const * points,
int pointsCount)
516 p.cmd = PrimitiveCmd::DrawPath;
517 p.path.points = points;
518 p.path.pointsCount = pointsCount;
519 p.path.freePoints =
false;
520 m_displayController->addPrimitive(p);
524 void Canvas::fillPath(
Point const * points,
int pointsCount)
527 p.cmd = PrimitiveCmd::FillPath;
528 p.path.points = points;
529 p.path.pointsCount = pointsCount;
530 p.path.freePoints =
false;
531 m_displayController->addPrimitive(p);
538 m_displayController->readScreen(
Rect(
X,
Y,
X,
Y), &rgb);
Represents a 24 bit RGB color.
Color
This enum defines named colors.
This file contains fabgl::Canvas definition.
LineEnds
This enum defines line ends when pen width is greater than 1.
Represents a glyph position, size and binary data.
Represents the coordinate of a point.
Specifies various glyph painting options.
Represents a bidimensional size.
Specifies general paint options.