From 5fc413c46d83a05778c03dda937b9880c82af32f Mon Sep 17 00:00:00 2001 From: Martin Preuss Date: Thu, 23 May 2024 13:34:23 +0200 Subject: [PATCH] reuse code. --- src/lib/aqdiagram/draw/context_cairo.c | 405 ++++++++++--------------- 1 file changed, 157 insertions(+), 248 deletions(-) diff --git a/src/lib/aqdiagram/draw/context_cairo.c b/src/lib/aqdiagram/draw/context_cairo.c index 8b860cd..73b9faf 100644 --- a/src/lib/aqdiagram/draw/context_cairo.c +++ b/src/lib/aqdiagram/draw/context_cairo.c @@ -41,6 +41,13 @@ static int _getTextWidth(AQDG_DRAW_CONTEXT *g, int fontId, const char *text); static int _getTextHeight(AQDG_DRAW_CONTEXT *g, int fontId, const char *text); static int _finish(AQDG_DRAW_CONTEXT *g); +static AQDG_DRAW_CONTEXT_CAIRO *_ensureFullCairoContext(const AQDG_DRAW_CONTEXT *g); +static AQDG_DRAW_CONTEXT_CAIRO *_ensureCairoSurface(const AQDG_DRAW_CONTEXT *g); + +static void _setColourAndWidthFromPen(cairo_t *cr, const AQDG_DRAW_PEN *pen); +static void _setDashType(cairo_t *cr, int dashType); +static void _setFont(cairo_t *cr, AQDG_DRAW_FONT *font); + /* ------------------------------------------------------------------------------------------------ @@ -238,12 +245,9 @@ int _penCreate(AQDG_DRAW_CONTEXT *g, uint32_t frontColour, int lineWidth, int da AQDG_DRAW_CONTEXT_CAIRO *xg; AQDG_DRAW_PEN *pen; - assert(g); - xg=GWEN_INHERIT_GETDATA(AQDG_DRAW_CONTEXT, AQDG_DRAW_CONTEXT_CAIRO, g); - assert(xg); - - if (xg->surface==NULL) { - DBG_ERROR(0, "No surface created"); + xg=_ensureCairoSurface(g); + if (xg==NULL) { + DBG_INFO(NULL, "here"); return GWEN_ERROR_INVALID; } @@ -264,12 +268,9 @@ int _penRelease(AQDG_DRAW_CONTEXT *g, int penId) AQDG_DRAW_CONTEXT_CAIRO *xg; AQDG_DRAW_PEN *pen; - assert(g); - xg=GWEN_INHERIT_GETDATA(AQDG_DRAW_CONTEXT, AQDG_DRAW_CONTEXT_CAIRO, g); - assert(xg); - - if (xg->surface==NULL) { - DBG_ERROR(0, "No surface created"); + xg=_ensureCairoSurface(g); + if (xg==NULL) { + DBG_INFO(NULL, "here"); return GWEN_ERROR_INVALID; } @@ -290,22 +291,10 @@ int _drawLine(AQDG_DRAW_CONTEXT *g, int penId, int xStart, int yStart, int xEnd, { AQDG_DRAW_CONTEXT_CAIRO *xg; AQDG_DRAW_PEN *pen; - uint32_t fgCol; - double red, green, blue; - int i; - int dashType; - assert(g); - xg=GWEN_INHERIT_GETDATA(AQDG_DRAW_CONTEXT, AQDG_DRAW_CONTEXT_CAIRO, g); - assert(xg); - - if (xg->surface==NULL) { - DBG_ERROR(0, "No surface created"); - return GWEN_ERROR_INVALID; - } - - if (xg->cr==NULL) { - DBG_ERROR(0, "Graphics context not active, call \"AQDG_Draw_Context_BeginDraw()\" before"); + xg=_ensureFullCairoContext(g); + if (xg==NULL) { + DBG_INFO(NULL, "here"); return GWEN_ERROR_INVALID; } @@ -315,40 +304,8 @@ int _drawLine(AQDG_DRAW_CONTEXT *g, int penId, int xStart, int yStart, int xEnd, return GWEN_ERROR_NOT_FOUND; } - /* set foreground color */; - fgCol=AQDG_Draw_Pen_GetFrontColour(pen); - red=(double)((fgCol>>24) & 0xff)/255.0; - green=(double)((fgCol>>16) & 0xff)/255.0; - blue=(double)((fgCol>>8) & 0xff)/255.0; - cairo_set_source_rgb(xg->cr, red, green, blue); - - /* set line width */ - i=AQDG_Draw_Pen_GetLineWidth(pen); - cairo_set_line_width(xg->cr, i); - - dashType=AQDG_Draw_Pen_GetDashType(pen); - - switch (dashType) { - default: - case 0: - cairo_set_dash(xg->cr, NULL, 0, 0.0); - break; - case 1: - cairo_set_dash(xg->cr, AQDG_Draw_ContextCairo_DashPattern1, 2, 0.0); - break; - case 2: - cairo_set_dash(xg->cr, AQDG_Draw_ContextCairo_DashPattern2, 2, 0.0); - break; - case 3: - cairo_set_dash(xg->cr, AQDG_Draw_ContextCairo_DashPattern3, 2, 0.0); - break; - case 4: - cairo_set_dash(xg->cr, AQDG_Draw_ContextCairo_DashPattern4, 2, 0.0); - break; - case 5: - cairo_set_dash(xg->cr, AQDG_Draw_ContextCairo_DashPattern5, 2, 0.0); - break; - } + _setColourAndWidthFromPen(xg->cr, pen); + _setDashType(xg->cr, AQDG_Draw_Pen_GetDashType(pen)); /* draw line from start to end position */ cairo_move_to(xg->cr, xStart, yStart); @@ -364,21 +321,10 @@ int _drawRect(AQDG_DRAW_CONTEXT *g, int penId, int x, int y, int w, int h) { AQDG_DRAW_CONTEXT_CAIRO *xg; AQDG_DRAW_PEN *pen; - uint32_t fgCol; - double red, green, blue; - int i; - assert(g); - xg=GWEN_INHERIT_GETDATA(AQDG_DRAW_CONTEXT, AQDG_DRAW_CONTEXT_CAIRO, g); - assert(xg); - - if (xg->surface==NULL) { - DBG_ERROR(0, "No surface created"); - return GWEN_ERROR_INVALID; - } - - if (xg->cr==NULL) { - DBG_INFO(0, "Graphics context not active, call \"AQDG_Draw_Context_BeginDraw()\" before"); + xg=_ensureFullCairoContext(g); + if (xg==NULL) { + DBG_INFO(NULL, "here"); return GWEN_ERROR_INVALID; } @@ -388,16 +334,7 @@ int _drawRect(AQDG_DRAW_CONTEXT *g, int penId, int x, int y, int w, int h) return GWEN_ERROR_NOT_FOUND; } - /* set foreground color */; - fgCol=AQDG_Draw_Pen_GetFrontColour(pen); - red=(double)((fgCol>>24) & 0xff)/255.0; - green=(double)((fgCol>>16) & 0xff)/255.0; - blue=(double)((fgCol>>8) & 0xff)/255.0; - cairo_set_source_rgb(xg->cr, red, green, blue); - - /* set line width */ - i=AQDG_Draw_Pen_GetLineWidth(pen); - cairo_set_line_width(xg->cr, i); + _setColourAndWidthFromPen(xg->cr, pen); cairo_set_dash(xg->cr, NULL, 0, 0.0); @@ -414,21 +351,10 @@ int _drawFilledRect(AQDG_DRAW_CONTEXT *g, int penId, int x, int y, int w, int h) { AQDG_DRAW_CONTEXT_CAIRO *xg; AQDG_DRAW_PEN *pen; - uint32_t fgCol; - double red, green, blue; - int i; - assert(g); - xg=GWEN_INHERIT_GETDATA(AQDG_DRAW_CONTEXT, AQDG_DRAW_CONTEXT_CAIRO, g); - assert(xg); - - if (xg->surface==NULL) { - DBG_ERROR(0, "No surface created"); - return GWEN_ERROR_INVALID; - } - - if (xg->cr==NULL) { - DBG_INFO(0, "Graphics context not active, call \"AQDG_Draw_Context_BeginDraw()\" before"); + xg=_ensureFullCairoContext(g); + if (xg==NULL) { + DBG_INFO(NULL, "here"); return GWEN_ERROR_INVALID; } @@ -438,16 +364,7 @@ int _drawFilledRect(AQDG_DRAW_CONTEXT *g, int penId, int x, int y, int w, int h) return GWEN_ERROR_NOT_FOUND; } - /* set foreground color */; - fgCol=AQDG_Draw_Pen_GetFrontColour(pen); - red=(double)((fgCol>>24) & 0xff)/255.0; - green=(double)((fgCol>>16) & 0xff)/255.0; - blue=(double)((fgCol>>8) & 0xff)/255.0; - cairo_set_source_rgb(xg->cr, red, green, blue); - - /* set line width */ - i=AQDG_Draw_Pen_GetLineWidth(pen); - cairo_set_line_width(xg->cr, i); + _setColourAndWidthFromPen(xg->cr, pen); cairo_set_dash(xg->cr, NULL, 0, 0.0); @@ -466,12 +383,9 @@ int _fontCreate(AQDG_DRAW_CONTEXT *g, const char *face, int fontSize, int fontSl AQDG_DRAW_CONTEXT_CAIRO *xg; AQDG_DRAW_FONT *font; - assert(g); - xg=GWEN_INHERIT_GETDATA(AQDG_DRAW_CONTEXT, AQDG_DRAW_CONTEXT_CAIRO, g); - assert(xg); - - if (xg->surface==NULL) { - DBG_ERROR(0, "No surface created"); + xg=_ensureCairoSurface(g); + if (xg==NULL) { + DBG_INFO(NULL, "here"); return GWEN_ERROR_INVALID; } @@ -494,12 +408,9 @@ int _fontRelease(AQDG_DRAW_CONTEXT *g, int fontId) AQDG_DRAW_CONTEXT_CAIRO *xg; AQDG_DRAW_FONT *font; - assert(g); - xg=GWEN_INHERIT_GETDATA(AQDG_DRAW_CONTEXT, AQDG_DRAW_CONTEXT_CAIRO, g); - assert(xg); - - if (xg->surface==NULL) { - DBG_ERROR(0, "No surface created"); + xg=_ensureCairoSurface(g); + if (xg==NULL) { + DBG_INFO(NULL, "here"); return GWEN_ERROR_INVALID; } @@ -520,25 +431,12 @@ int _drawText(AQDG_DRAW_CONTEXT *g, int penId, int fontId, int direction, int x, { AQDG_DRAW_CONTEXT_CAIRO *xg; AQDG_DRAW_FONT *font; - int crSlant; - int crWeight; AQDG_DRAW_PEN *pen; - uint32_t fgCol; - double red, green, blue; - int i; cairo_font_extents_t extents; - assert(g); - xg=GWEN_INHERIT_GETDATA(AQDG_DRAW_CONTEXT, AQDG_DRAW_CONTEXT_CAIRO, g); - assert(xg); - - if (xg->surface==NULL) { - DBG_ERROR(0, "No surface created"); - return GWEN_ERROR_INVALID; - } - - if (xg->cr==NULL) { - DBG_INFO(0, "Graphics context not active, call \"AQDG_Draw_Context_BeginDraw()\" before"); + xg=_ensureFullCairoContext(g); + if (xg==NULL) { + DBG_INFO(NULL, "here"); return GWEN_ERROR_INVALID; } @@ -549,16 +447,7 @@ int _drawText(AQDG_DRAW_CONTEXT *g, int penId, int fontId, int direction, int x, return GWEN_ERROR_NOT_FOUND; } - /* set foreground color */; - fgCol=AQDG_Draw_Pen_GetFrontColour(pen); - red=(double)((fgCol>>24) & 0xff)/255.0; - green=(double)((fgCol>>16) & 0xff)/255.0; - blue=(double)((fgCol>>8) & 0xff)/255.0; - cairo_set_source_rgb(xg->cr, red, green, blue); - - /* set line width */ - i=AQDG_Draw_Pen_GetLineWidth(pen); - cairo_set_line_width(xg->cr, i); + _setColourAndWidthFromPen(xg->cr, pen); /* get and handle font */ font=AQDG_Draw_Font_List_GetById(xg->fontList, fontId); @@ -566,28 +455,7 @@ int _drawText(AQDG_DRAW_CONTEXT *g, int penId, int fontId, int direction, int x, DBG_INFO(0, "Font %d not found", fontId); return GWEN_ERROR_NOT_FOUND; } - - switch (AQDG_Draw_Font_GetFontSlant(font)) { - default: - case AQDG_Slant_None: - crSlant=CAIRO_FONT_SLANT_NORMAL; - break; - case AQDG_Slant_Italic: - crSlant=CAIRO_FONT_SLANT_ITALIC; - break; - } - - switch (AQDG_Draw_Font_GetFontWeight(font)) { - default: - case AQDG_Weight_None: - crWeight=CAIRO_FONT_WEIGHT_NORMAL; - break; - case AQDG_Weight_Bold: - crWeight=CAIRO_FONT_WEIGHT_BOLD; - break; - } - cairo_select_font_face(xg->cr, AQDG_Draw_Font_GetFontName(font), crSlant, crWeight); - cairo_set_font_size(xg->cr, AQDG_Draw_Font_GetFontSize(font)); + _setFont(xg->cr, font); cairo_font_extents(xg->cr, &extents); @@ -604,21 +472,11 @@ int _getTextWidth(AQDG_DRAW_CONTEXT *g, int fontId, const char *text) { AQDG_DRAW_CONTEXT_CAIRO *xg; AQDG_DRAW_FONT *font; - int crSlant; - int crWeight; cairo_text_extents_t extents; - assert(g); - xg=GWEN_INHERIT_GETDATA(AQDG_DRAW_CONTEXT, AQDG_DRAW_CONTEXT_CAIRO, g); - assert(xg); - - if (xg->surface==NULL) { - DBG_ERROR(0, "No surface created"); - return GWEN_ERROR_INVALID; - } - - if (xg->cr==NULL) { - DBG_INFO(0, "Graphics context not active, call \"AQDG_Draw_Context_BeginDraw()\" before"); + xg=_ensureFullCairoContext(g); + if (xg==NULL) { + DBG_INFO(NULL, "here"); return GWEN_ERROR_INVALID; } @@ -629,27 +487,7 @@ int _getTextWidth(AQDG_DRAW_CONTEXT *g, int fontId, const char *text) return GWEN_ERROR_NOT_FOUND; } - switch (AQDG_Draw_Font_GetFontSlant(font)) { - default: - case AQDG_Slant_None: - crSlant=CAIRO_FONT_SLANT_NORMAL; - break; - case AQDG_Slant_Italic: - crSlant=CAIRO_FONT_SLANT_ITALIC; - break; - } - - switch (AQDG_Draw_Font_GetFontWeight(font)) { - default: - case AQDG_Weight_None: - crWeight=CAIRO_FONT_WEIGHT_NORMAL; - break; - case AQDG_Weight_Bold: - crWeight=CAIRO_FONT_WEIGHT_BOLD; - break; - } - cairo_select_font_face(xg->cr, AQDG_Draw_Font_GetFontName(font), crSlant, crWeight); - cairo_set_font_size(xg->cr, AQDG_Draw_Font_GetFontSize(font)); + _setFont(xg->cr, font); cairo_text_extents(xg->cr, text, &extents); @@ -662,21 +500,11 @@ int _getTextHeight(AQDG_DRAW_CONTEXT *g, int fontId, const char *text) { AQDG_DRAW_CONTEXT_CAIRO *xg; AQDG_DRAW_FONT *font; - int crSlant; - int crWeight; cairo_text_extents_t extents; - assert(g); - xg=GWEN_INHERIT_GETDATA(AQDG_DRAW_CONTEXT, AQDG_DRAW_CONTEXT_CAIRO, g); - assert(xg); - - if (xg->surface==NULL) { - DBG_ERROR(0, "No surface created"); - return GWEN_ERROR_INVALID; - } - - if (xg->cr==NULL) { - DBG_INFO(0, "Graphics context not active, call \"AQDG_Draw_Context_BeginDraw()\" before"); + xg=_ensureFullCairoContext(g); + if (xg==NULL) { + DBG_INFO(NULL, "here"); return GWEN_ERROR_INVALID; } @@ -687,27 +515,7 @@ int _getTextHeight(AQDG_DRAW_CONTEXT *g, int fontId, const char *text) return GWEN_ERROR_NOT_FOUND; } - switch (AQDG_Draw_Font_GetFontSlant(font)) { - default: - case AQDG_Slant_None: - crSlant=CAIRO_FONT_SLANT_NORMAL; - break; - case AQDG_Slant_Italic: - crSlant=CAIRO_FONT_SLANT_ITALIC; - break; - } - - switch (AQDG_Draw_Font_GetFontWeight(font)) { - default: - case AQDG_Weight_None: - crWeight=CAIRO_FONT_WEIGHT_NORMAL; - break; - case AQDG_Weight_Bold: - crWeight=CAIRO_FONT_WEIGHT_BOLD; - break; - } - cairo_select_font_face(xg->cr, AQDG_Draw_Font_GetFontName(font), crSlant, crWeight); - cairo_set_font_size(xg->cr, AQDG_Draw_Font_GetFontSize(font)); + _setFont(xg->cr, font); cairo_text_extents(xg->cr, text, &extents); @@ -720,17 +528,9 @@ int _finish(AQDG_DRAW_CONTEXT *g) { AQDG_DRAW_CONTEXT_CAIRO *xg; - assert(g); - xg=GWEN_INHERIT_GETDATA(AQDG_DRAW_CONTEXT, AQDG_DRAW_CONTEXT_CAIRO, g); - assert(xg); - - if (xg->surface==NULL) { - DBG_ERROR(0, "No surface created"); - return GWEN_ERROR_INVALID; - } - - if (xg->cr==NULL) { - DBG_INFO(0, "Graphics context not active, call \"AQDG_Draw_Context_BeginDraw()\" before"); + xg=_ensureFullCairoContext(g); + if (xg==NULL) { + DBG_INFO(NULL, "here"); return GWEN_ERROR_INVALID; } @@ -764,6 +564,115 @@ int _finish(AQDG_DRAW_CONTEXT *g) +AQDG_DRAW_CONTEXT_CAIRO *_ensureFullCairoContext(const AQDG_DRAW_CONTEXT *g) +{ + if (g) { + AQDG_DRAW_CONTEXT_CAIRO *xg; + + xg=_ensureCairoSurface(g); + if (xg) { + if (xg->cr==NULL) { + DBG_INFO(0, "Graphics context not active, call \"AQDG_Draw_Context_BeginDraw()\" first"); + return NULL; + } + return xg; + } + } + return NULL; +} + + + +AQDG_DRAW_CONTEXT_CAIRO *_ensureCairoSurface(const AQDG_DRAW_CONTEXT *g) +{ + if (g) { + AQDG_DRAW_CONTEXT_CAIRO *xg; + + xg=GWEN_INHERIT_GETDATA(AQDG_DRAW_CONTEXT, AQDG_DRAW_CONTEXT_CAIRO, g); + if (xg) { + if (xg->surface==NULL) { + DBG_ERROR(0, "No surface created"); + return NULL; + } + } + return xg; + } + return NULL; +} + + + +void _setColourAndWidthFromPen(cairo_t *cr, const AQDG_DRAW_PEN *pen) +{ + uint32_t fgCol; + double red, green, blue; + + /* set foreground color */; + fgCol=AQDG_Draw_Pen_GetFrontColour(pen); + red=(double)((fgCol>>24) & 0xff)/255.0; + green=(double)((fgCol>>16) & 0xff)/255.0; + blue=(double)((fgCol>>8) & 0xff)/255.0; + cairo_set_source_rgb(cr, red, green, blue); + + /* set line width */ + cairo_set_line_width(cr, AQDG_Draw_Pen_GetLineWidth(pen)); +} + + + +void _setDashType(cairo_t *cr, int dashType) +{ + switch (dashType) { + default: + case 0: + cairo_set_dash(cr, NULL, 0, 0.0); + break; + case 1: + cairo_set_dash(cr, AQDG_Draw_ContextCairo_DashPattern1, 2, 0.0); + break; + case 2: + cairo_set_dash(cr, AQDG_Draw_ContextCairo_DashPattern2, 2, 0.0); + break; + case 3: + cairo_set_dash(cr, AQDG_Draw_ContextCairo_DashPattern3, 2, 0.0); + break; + case 4: + cairo_set_dash(cr, AQDG_Draw_ContextCairo_DashPattern4, 2, 0.0); + break; + case 5: + cairo_set_dash(cr, AQDG_Draw_ContextCairo_DashPattern5, 2, 0.0); + break; + } +} + + +void _setFont(cairo_t *cr, AQDG_DRAW_FONT *font) +{ + int crSlant; + int crWeight; + + switch (AQDG_Draw_Font_GetFontSlant(font)) { + default: + case AQDG_Slant_None: + crSlant=CAIRO_FONT_SLANT_NORMAL; + break; + case AQDG_Slant_Italic: + crSlant=CAIRO_FONT_SLANT_ITALIC; + break; + } + + switch (AQDG_Draw_Font_GetFontWeight(font)) { + default: + case AQDG_Weight_None: + crWeight=CAIRO_FONT_WEIGHT_NORMAL; + break; + case AQDG_Weight_Bold: + crWeight=CAIRO_FONT_WEIGHT_BOLD; + break; + } + cairo_select_font_face(cr, AQDG_Draw_Font_GetFontName(font), crSlant, crWeight); + cairo_set_font_size(cr, AQDG_Draw_Font_GetFontSize(font)); +}