Add polygon drawing Add convex polygon filling Start support for a monochrome display Move gdisp doxygen to header file Restructure the balance between gdisp.h and gdisp_lld.h Remove old extern font definitions (now always use gdispOpenFont) Make public the GDISP structure and change macros to suit (faster for the application). gdispQuery is now optional.
340 lines
10 KiB
C
340 lines
10 KiB
C
/*
|
|
ChibiOS/GFX - Copyright (C) 2012, 2013
|
|
Joel Bodenmann aka Tectu <joel@unormal.org>
|
|
|
|
This file is part of ChibiOS/GFX.
|
|
|
|
ChibiOS/GFX is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
ChibiOS/GFX is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/**
|
|
* @file include/gdisp/lld/gdisp_lld.h
|
|
* @brief GDISP Graphic Driver subsystem low level driver header.
|
|
*
|
|
* @addtogroup GDISP
|
|
* @{
|
|
*/
|
|
|
|
#ifndef _GDISP_LLD_H
|
|
#define _GDISP_LLD_H
|
|
|
|
#if GFX_USE_GDISP || defined(__DOXYGEN__)
|
|
|
|
/*===========================================================================*/
|
|
/* Error checks. */
|
|
/*===========================================================================*/
|
|
|
|
/**
|
|
* @name GDISP hardware accelerated support
|
|
* @{
|
|
*/
|
|
/**
|
|
* @brief Hardware accelerated line drawing.
|
|
* @details If set to @p FALSE software emulation is used.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_LINES
|
|
#define GDISP_HARDWARE_LINES FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief Hardware accelerated screen clears.
|
|
* @details If set to @p FALSE software emulation is used.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_CLEARS
|
|
#define GDISP_HARDWARE_CLEARS FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief Hardware accelerated rectangular fills.
|
|
* @details If set to @p FALSE software emulation is used.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_FILLS
|
|
#define GDISP_HARDWARE_FILLS FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief Hardware accelerated fills from an image.
|
|
* @details If set to @p FALSE software emulation is used.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_BITFILLS
|
|
#define GDISP_HARDWARE_BITFILLS FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief Hardware accelerated circles.
|
|
* @details If set to @p FALSE software emulation is used.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_CIRCLES
|
|
#define GDISP_HARDWARE_CIRCLES FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief Hardware accelerated filled circles.
|
|
* @details If set to @p FALSE software emulation is used.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_CIRCLEFILLS
|
|
#define GDISP_HARDWARE_CIRCLEFILLS FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief Hardware accelerated ellipses.
|
|
* @details If set to @p FALSE software emulation is used.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_ELLIPSES
|
|
#define GDISP_HARDWARE_ELLIPSES FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief Hardware accelerated filled ellipses.
|
|
* @details If set to @p FALSE software emulation is used.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_ELLIPSEFILLS
|
|
#define GDISP_HARDWARE_ELLIPSEFILLS FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief Hardware accelerated arc's.
|
|
* @details If set to @p FALSE software emulation is used.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_ARCS
|
|
#define GDISP_HARDWARE_ARCS FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief Hardware accelerated filled arcs.
|
|
* @details If set to @p FALSE software emulation is used.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_ARCFILLS
|
|
#define GDISP_HARDWARE_ARCFILLS FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief Hardware accelerated text drawing.
|
|
* @details If set to @p FALSE software emulation is used.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_TEXT
|
|
#define GDISP_HARDWARE_TEXT FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief Hardware accelerated text drawing with a filled background.
|
|
* @details If set to @p FALSE software emulation is used.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_TEXTFILLS
|
|
#define GDISP_HARDWARE_TEXTFILLS FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief Hardware accelerated scrolling.
|
|
* @details If set to @p FALSE there is no support for scrolling.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_SCROLL
|
|
#define GDISP_HARDWARE_SCROLL FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief Reading back of pixel values.
|
|
* @details If set to @p FALSE there is no support for pixel read-back.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_PIXELREAD
|
|
#define GDISP_HARDWARE_PIXELREAD FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief The driver supports one or more control commands.
|
|
* @details If set to @p FALSE there is no support for control commands.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_CONTROL
|
|
#define GDISP_HARDWARE_CONTROL FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief The driver supports a non-standard query.
|
|
* @details If set to @p FALSE there is no support for non-standard queries.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_QUERY
|
|
#define GDISP_HARDWARE_QUERY FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief The driver supports a clipping in hardware.
|
|
* @details If set to @p FALSE there is no support for non-standard queries.
|
|
*/
|
|
#ifndef GDISP_HARDWARE_CLIP
|
|
#define GDISP_HARDWARE_CLIP FALSE
|
|
#endif
|
|
/** @} */
|
|
|
|
/**
|
|
* @name GDISP software algorithm choices
|
|
* @{
|
|
*/
|
|
/**
|
|
* @brief For filled text drawing, use a background fill and then draw
|
|
* the text instead of using a blit or direct pixel drawing.
|
|
* @details If set to @p TRUE background fill and then text draw is used.
|
|
* @note This is ignored if hardware accelerated text is supported.
|
|
*/
|
|
#ifndef GDISP_SOFTWARE_TEXTFILLDRAW
|
|
#define GDISP_SOFTWARE_TEXTFILLDRAW FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief For filled text drawing, when using a bitmap blit
|
|
* use a column by column buffer rather than a full character
|
|
* buffer to save memory at a small performance cost.
|
|
* @details If set to @p TRUE background fill one character column at a time.
|
|
* @note This is ignored if software text using blit is not being used.
|
|
*/
|
|
#ifndef GDISP_SOFTWARE_TEXTBLITCOLUMN
|
|
#define GDISP_SOFTWARE_TEXTBLITCOLUMN FALSE
|
|
#endif
|
|
/** @} */
|
|
|
|
/**
|
|
* @name GDISP pixel format choices
|
|
* @{
|
|
*/
|
|
/**
|
|
* @brief The native pixel format for this device
|
|
* @note Should be set to one of the following:
|
|
* GDISP_PIXELFORMAT_RGB565
|
|
* GDISP_PIXELFORMAT_RGB888
|
|
* GDISP_PIXELFORMAT_RGB444
|
|
* GDISP_PIXELFORMAT_RGB332
|
|
* GDISP_PIXELFORMAT_RGB666
|
|
* GDISP_PIXELFORMAT_CUSTOM
|
|
* @note If you set GDISP_PIXELFORMAT_CUSTOM you need to also define
|
|
* color_t, RGB2COLOR(r,g,b), HTML2COLOR(h),
|
|
* RED_OF(c), GREEN_OF(c), BLUE_OF(c),
|
|
* COLOR(c) and MASKCOLOR.
|
|
*/
|
|
#ifndef GDISP_PIXELFORMAT
|
|
#define GDISP_PIXELFORMAT GDISP_PIXELFORMAT_ERROR
|
|
#endif
|
|
|
|
/**
|
|
* @brief Do pixels require packing for a blit
|
|
* @note Is only valid for a pixel format that doesn't fill it's datatype. ie formats:
|
|
* GDISP_PIXELFORMAT_RGB888
|
|
* GDISP_PIXELFORMAT_RGB444
|
|
* GDISP_PIXELFORMAT_RGB666
|
|
* GDISP_PIXELFORMAT_CUSTOM
|
|
* @note If you use GDISP_PIXELFORMAT_CUSTOM and packed bit fills
|
|
* you need to also define @p gdispPackPixels(buf,cx,x,y,c)
|
|
* @note If you are using GDISP_HARDWARE_BITFILLS = FALSE then the pixel
|
|
* format must not be a packed format as the software blit does
|
|
* not support packed pixels
|
|
* @note Very few cases should actually require packed pixels as the low
|
|
* level driver can also pack on the fly as it is sending it
|
|
* to the graphics device.
|
|
*/
|
|
#ifndef GDISP_PACKED_PIXELS
|
|
#define GDISP_PACKED_PIXELS FALSE
|
|
#endif
|
|
|
|
/**
|
|
* @brief Do lines of pixels require packing for a blit
|
|
* @note Ignored if GDISP_PACKED_PIXELS is FALSE
|
|
*/
|
|
#ifndef GDISP_PACKED_LINES
|
|
#define GDISP_PACKED_LINES FALSE
|
|
#endif
|
|
/** @} */
|
|
|
|
/*===========================================================================*/
|
|
/* External declarations. */
|
|
/*===========================================================================*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* Core functions */
|
|
extern bool_t gdisp_lld_init(void);
|
|
|
|
/* Some of these functions will be implemented in software by the high level driver
|
|
depending on the GDISP_HARDWARE_XXX macros defined in gdisp_lld_config.h.
|
|
*/
|
|
|
|
/* Drawing functions */
|
|
extern void gdisp_lld_clear(color_t color);
|
|
extern void gdisp_lld_draw_pixel(coord_t x, coord_t y, color_t color);
|
|
extern void gdisp_lld_fill_area(coord_t x, coord_t y, coord_t cx, coord_t cy, color_t color);
|
|
extern void gdisp_lld_blit_area_ex(coord_t x, coord_t y, coord_t cx, coord_t cy, coord_t srcx, coord_t srcy, coord_t srccx, const pixel_t *buffer);
|
|
extern void gdisp_lld_draw_line(coord_t x0, coord_t y0, coord_t x1, coord_t y1, color_t color);
|
|
|
|
/* Circular Drawing Functions */
|
|
#if GDISP_NEED_CIRCLE
|
|
extern void gdisp_lld_draw_circle(coord_t x, coord_t y, coord_t radius, color_t color);
|
|
extern void gdisp_lld_fill_circle(coord_t x, coord_t y, coord_t radius, color_t color);
|
|
#endif
|
|
|
|
#if GDISP_NEED_ELLIPSE
|
|
extern void gdisp_lld_draw_ellipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color);
|
|
extern void gdisp_lld_fill_ellipse(coord_t x, coord_t y, coord_t a, coord_t b, color_t color);
|
|
#endif
|
|
|
|
/* Arc Drawing Functions */
|
|
#if GDISP_NEED_ARC
|
|
extern void gdisp_lld_draw_arc(coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle, color_t color);
|
|
extern void gdisp_lld_fill_arc(coord_t x, coord_t y, coord_t radius, coord_t startangle, coord_t endangle, color_t color);
|
|
#endif
|
|
|
|
/* Text Rendering Functions */
|
|
#if GDISP_NEED_TEXT
|
|
extern void gdisp_lld_draw_char(coord_t x, coord_t y, char c, font_t font, color_t color);
|
|
extern void gdisp_lld_fill_char(coord_t x, coord_t y, char c, font_t font, color_t color, color_t bgcolor);
|
|
#endif
|
|
|
|
/* Pixel readback */
|
|
#if GDISP_NEED_PIXELREAD
|
|
extern color_t gdisp_lld_get_pixel_color(coord_t x, coord_t y);
|
|
#endif
|
|
|
|
/* Scrolling Function - clears the area scrolled out */
|
|
#if GDISP_NEED_SCROLL
|
|
extern void gdisp_lld_vertical_scroll(coord_t x, coord_t y, coord_t cx, coord_t cy, int lines, color_t bgcolor);
|
|
#endif
|
|
|
|
/* Set driver specific control */
|
|
#if GDISP_NEED_CONTROL
|
|
extern void gdisp_lld_control(unsigned what, void *value);
|
|
#endif
|
|
|
|
/* Query driver specific data */
|
|
#if GDISP_NEED_QUERY
|
|
extern void *gdisp_lld_query(unsigned what);
|
|
#endif
|
|
|
|
/* Clipping Functions */
|
|
#if GDISP_NEED_CLIP
|
|
extern void gdisp_lld_set_clip(coord_t x, coord_t y, coord_t cx, coord_t cy);
|
|
#endif
|
|
|
|
/* Messaging API */
|
|
#if GDISP_NEED_MSGAPI
|
|
#include "gdisp_lld_msgs.h"
|
|
extern void gdisp_lld_msg_dispatch(gdisp_lld_msg_t *msg);
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* GFX_USE_GDISP */
|
|
|
|
#endif /* _GDISP_LLD_H */
|
|
/** @} */
|
|
|