SXXXXXXX_PyBusMonitor1553/cpp/GrifoScope/GrifoSdkEif/pub/inc/GC/gfddrawingcontext.h.bak
2025-12-17 07:59:30 +01:00

208 lines
9.1 KiB
C

#ifndef GFDDRAWINGCONTEXT_H
#define GFDDRAWINGCONTEXT_H
#include "gfd_grifo.h"
//#include "gfd_font.h"
struct gfd_font256_tag_t;
#include <stdarg.h>
class GfdDrawingContext;
class GrifoDrawingContext;
extern GfdDrawingContext& GfdDrawingContext_default;
class GfdDrawingContext
{
public:
typedef int color_t;
GfdDrawingContext()
{
initialize();
}
GfdDrawingContext(const GfdDrawingContext& baseCx):
cx(baseCx.cx)
{
}
struct Size
{
int dx;
int dy;
Size(int sx=0, int sy=0): dx(sx), dy(sy) {}
Size(const Size& s): dx(s.dx), dy(s.dy) {}
int width(int x) { return dx=x;}
int hieght(int y) { return dy=y;}
int width() const { return dx;}
int height() const { return dy;}
Size& operator+=(const Size& a) { dx+=a.dx; dy+=a.dy; return *this;}
Size& operator+=(int k) { dx+=k; dy+=k; return *this;}
Size& operator-=(int k) { return operator+=(-k);}
Size operator+(const Size& a) const { return Size(dx+a.dx, dy+a.dy);}
Size operator+(int k) const { return Size(dx+k, dy+k);}
Size operator-(int k) const { return operator+(-k);}
void operator=(const Size& s) { dx=s.dx; dy=s.dy;}
bool operator==(const Size& s) const { return dx==s.dx && dy==s.dy;}
};
class Point: public Size {};
int width() const { return cx.fb->dx;}
int height() const { return cx.fb->dy;}
int endx() const { return cx.fb->ex;}
int endy() const { return cx.fb->ey;}
void clear() const { gfd_fb_clear(cx.fb);}
void clearPhy() const { gfd_fb_clear_phy(cx.fb);}
void fill(int c) const { gfd_fb_fill(cx.fb, c);}
// Funzioni grafiche maincolor
void line(int x1, int y1, int x2, int y2) const { gfd_fb_draw_line(cx.fb, x1, y1, x2, y2, cx.main_color);}
void rect(int x1, int y1, int x2, int y2) const { gfd_fb_draw_rect(cx.fb, x1, y1, x2, y2, cx.main_color);}
void rectFill(int x, int y, int w, int h) const { gfd_fb_fill_rect(cx.fb, x, y, w, h, cx.main_color);}
void rectHollow(int x, int y, int w, int h) const { gfd_fb_draw_rect(cx.fb, x, y, x+(w-1), y+(h-1), cx.main_color);}
void circle(int x, int y, int r) const { gfd_fb_draw_circle(cx.fb, x, y, r, cx.main_color);}
void arc(int x, int y, int r, double ang_start, double ang_stop) const { gfd_fb_draw_arc179(cx.fb, x, y, r, ang_start, ang_stop, cx.main_color);}
void rect(int x1, int y1, int x2, int y2, int color) const { gfd_fb_draw_rect(cx.fb, x1, y1, x2, y2, color);}
void rect(int x1, int y1, const Size& s) const { gfd_fb_draw_rect(cx.fb, x1, y1, (x1+s.dx)-1, (y1+s.dy)-1, cx.main_color);}
// Funzioni grafiche arc whid 1 px e parametro per occlusione
int cntCircPix(int r) const {return gfd_count_circle_pix(r);}
void arcW2Occ(int x, int y, int r, double ang_start, double ang_stop, bool occlusion, int cnt) const { gfd_fb_draw_arc179_w2_occ(cx.fb, x, y, r, ang_start, ang_stop, cx.main_color, cx.occl_color, occlusion, cnt);}
// Funzioni grafiche di occlusione
void lineOcclusion(int x1, int y1, int x2, int y2) const { gfd_fb_draw_line(cx.fb, x1, y1, x2, y2, cx.occl_color);}
void rectOcclusion(int x1, int y1, int x2, int y2) const { gfd_fb_draw_rect(cx.fb, x1, y1, x2, y2, cx.occl_color);}
void rectFillOcclusion(int x, int y, int w, int h) const { gfd_fb_fill_rect(cx.fb, x, y, w, h, cx.occl_color);}
void rectHollowOcclusion(int x, int y, int w, int h) const { gfd_fb_draw_rect(cx.fb, x, y, x+(w-1), y+(h-1), cx.occl_color);}
void rectHollowOuterOcc(int x, int y, int w, int h) const { gfd_fb_draw_rect(cx.fb, x-1, y-1, x+w, y+h, cx.occl_color);}
void rectHollowOuterOccLH(int x, int y, int w, int h) const { gfd_fb_draw_rect_limH(cx.fb, x-1, y-1, x+w, y+h, cx.occl_color);}
void rectHollowOuterOccLV(int x, int y, int w, int h) const { gfd_fb_draw_rect_limV(cx.fb, x-1, y-1, x+w, y+h, cx.occl_color);}
void circleOcclusion(int x, int y, int r) const { gfd_fb_draw_circle(cx.fb, x, y, r, cx.occl_color);}
void arcOcclusion(int x, int y, int r, double ang_start, double ang_stop) const { gfd_fb_draw_arc179(cx.fb, x, y, r, ang_start, ang_stop, cx.occl_color);}
// Funzioni grafiche con parametro di occlusione
void line_w2(int x1, int y1, int x2, int y2, bool occlusion) const { gfd_fb_draw_line_w2(cx.fb, x1, y1, x2, y2, cx.main_color, cx.occl_color, occlusion);}
void line_w1(int x1, int y1, int x2, int y2, bool occlusion) const { gfd_fb_draw_line_w1(cx.fb, x1, y1, x2, y2, cx.main_color, cx.occl_color, occlusion);}
// Questa funzione e' messa qui solo per ricordarsi del mondo gfd_grifo.h non ancora completato e usato
void line_w2TODO(int x1, int y1, int x2, int y2, bool /*occlusion*/) const { LineDraw_W2O(cx.fb, x1, y1, x2, y2, cx.main_color);}
// Sprites
void sprite(int x, int y, gfd_framebuffer_t* const bitmap, bool drawOcclusion) const { gfd_fb_draw_sprite(cx.fb, x, y, bitmap, cx.main_color, drawOcclusion?1:0);}
void spriteOccEx(int x, int y, gfd_framebuffer_t* const bitmap, bool drawOcclusion) const { gfd_fb_draw_sprite_occ_ex(cx.fb, x, y, bitmap, cx.main_color, drawOcclusion?1:0);}
void spriteLine_w2(int x1, int y1, int x2, int y2, gfd_framebuffer_t* const bitmap, int color) const { gfd_fb_draw_line_w2(bitmap, x1, y1, x2, y2, color, 0, false);}
int printf(int x, int y, const char* fmt, ...);
int vprintf(int x, int y, const char* fmt, va_list args);
int printf(const char* fmt, ...);
int textWidth(const char* fmt, ...) const;
int vtextWidth(const char* fmt, va_list args) const;
int textHeight() const;
int textLen(const char* text, int maxCnt);
char* textCpy(char *dest, const char *source, int count);
color_t getColor() { return cx.main_color; }
void setColor(color_t c) { cx.main_color = c; }
void setOcclusionColor(color_t c) { cx.occl_color = c; }
void setFont(const gfd_font256_tag_t& f) { cx.font = &f; }
void setTransperentColorLevel(int level) { cx.trsp_color=level;}
int transparentColorLevel() const { return cx.trsp_color;}
gfd_framebuffer_t* framebuffer() const { return cx.fb;}
void* raw_framebuffer() const { return cx.fb->buffer;}
gfd_framebuffer_t* switch_framebuffer(gfd_framebuffer_t* newFb) { gfd_framebuffer_t* tmp=cx.fb; cx.fb=newFb;return tmp;}
void new_subbbox(gfd_framebuffer_t& newfbBBox, int ox, int oy, int width, int height) const { gfd_fb_subbbox(&newfbBBox, cx.fb, ox, oy, width, height);}
bool is_inside_x(int x) const { return ((unsigned int)x)<(unsigned int)cx.fb->dx;}
bool is_inside_y(int y) const { return ((unsigned int)y)<(unsigned int)cx.fb->dy;}
bool is_inside(int x, int y) const { return is_inside_x(x) && is_inside_y(y);}
color_t getPixColor(int x, int y) { return gfd_fb_get_pixel2(cx.fb, x, y);}
//The dbg interface
void dbgLine(int x1, int y1, int x2, int y2) const { gfd_fb_draw_line_cs(cx.fb, x1, y1, x2, y2, cx.dbg_color);}
void dbgRect(int x1, int y1, int x2, int y2) const { gfd_fb_draw_rect_cs(cx.fb, x1, y1, x2, y2, cx.dbg_color);}
void dbgRect(int x1, int y1, const Size& s) const { gfd_fb_draw_rect_cs(cx.fb, x1, y1, (x1+s.dx)-1, (y1+s.dy)-1, cx.dbg_color);}
void dbgLineOccMix(int x1, int y1, int x2, int y2) const { gfd_fb_draw_line_cs_2cols(cx.fb, x1, y1, x2, y2, cx.dbg_color, cx.occl_color);}
void dbgCircleOccMix(int x, int y, int r) const { gfd_fb_draw_circle_2cols(cx.fb, x, y, r, cx.dbg_color, cx.occl_color);}
int dbgPrintf(int x, int y, const char* fmt, ...);
int dbgVprintf(int x, int y, const char* fmt, va_list args);
int dbgPrintfColor(int x, int y, int color, const char* fmt, ...);
int dbgVprintfColor(int x, int y, int color, const char* fmt, va_list args);
protected:
struct cx_t
{
int main_color;
int occl_color;
int dbg_color;
int trsp_color;
const struct gfd_font256_tag_t* font;
const struct gfd_font256_tag_t* dbg_font;
gfd_framebuffer_t* fb;
int crs_x;
int crs_y;
};
cx_t cx;
void initialize();
void setFb(gfd_framebuffer_t& fb) { cx.fb=&fb;}
friend class GrifoDrawingContext;
};
class GrifoDrawingContext
{
public:
GrifoDrawingContext():
current(&wholeDisplay)
{
}
GfdDrawingContext& dc() const { return *current;}
static GfdDrawingContext& phyDisplay() { return phyDeviceDisplay;}
static GfdDrawingContext& displayDc() { return wholeDisplay;}
static GfdDrawingContext& movingAreaDc() { return movingArea;}
static void setup(gfd_framebuffer_t& fb,
int rsx, int rsy, int rw, int rh, //Radar sub-window
int sx, int sy, int mw, int mh); //Moving symbols sub-window
static void setFramebufferMemory(void*);
static void setColor(GfdDrawingContext::color_t c) { displayDc().setColor(c); movingAreaDc().setColor(c); phyDeviceDisplay.setColor(c);}
static void setOcclusionColor(GfdDrawingContext::color_t c) { displayDc().setOcclusionColor(c); movingAreaDc().setOcclusionColor(c); phyDeviceDisplay.setOcclusionColor(c);}
static void setFont(const gfd_font256_tag_t& f) { displayDc().setFont(f); movingAreaDc().setFont(f); phyDeviceDisplay.setFont(f);}
static void setDebug();
static const gfd_font256_tag_t& fontSmall();
static const gfd_font256_tag_t& fontMicro();
static const gfd_font256_tag_t& fontLarge();
static const gfd_font256_tag_t& fontDebug();
protected:
GfdDrawingContext* current;
static GfdDrawingContext wholeDisplay;
static GfdDrawingContext movingArea;
static GfdDrawingContext phyDeviceDisplay;
private:
};
#endif // GFDDRAWINGCONTEXT_H