47
50
void cd_decorator_draw_decorations_comics (cairo_t *pCairoContext, CairoDialog *pDialog)
49
52
double fLineWidth = myConfig.iComicsLineWidth;
50
double fRadius = myConfig.iComicsRadius;
53
double fRadius = MIN (myConfig.iComicsRadius, pDialog->iBubbleHeight/2 - fLineWidth);
52
double fGapFromDock = pDialog->iDistanceToDock + .5 * fLineWidth;
53
double cos_gamma = 1 / sqrt (1. + 1. * (CAIRO_DIALOG_TIP_MARGIN + CAIRO_DIALOG_TIP_BASE) / fGapFromDock * (CAIRO_DIALOG_TIP_MARGIN + CAIRO_DIALOG_TIP_BASE) / fGapFromDock);
55
/**double fGapFromDock = pDialog->iMinBottomGap + pDialog->iBottomMargin + fLineWidth/2;
56
double cos_gamma = 1 / sqrt (1. + 1. * (CAIRO_DIALOG_TIP_MARGIN + CD_TIP_BASE) / fGapFromDock * (CAIRO_DIALOG_TIP_MARGIN + CD_TIP_BASE) / fGapFromDock);
54
57
double cos_theta = 1 / sqrt (1. + 1. * CAIRO_DIALOG_TIP_MARGIN / fGapFromDock * CAIRO_DIALOG_TIP_MARGIN / fGapFromDock);
55
double fTipHeight = fGapFromDock / (1. + fLineWidth / 2. / CAIRO_DIALOG_TIP_BASE * (1./cos_gamma + 1./cos_theta));
58
double fTipHeight = fGapFromDock / (1. + fLineWidth / 2. / CD_TIP_BASE * (1./cos_gamma + 1./cos_theta));*/
56
59
//g_print ("TipHeight <- %d\n", (int)fTipHeight);
58
double fOffsetX = fRadius + fLineWidth / 2;
59
double fOffsetY = (pDialog->container.bDirectionUp ? fLineWidth / 2 : pDialog->container.iHeight - fLineWidth / 2);
60
int sens = (pDialog->container.bDirectionUp ? 1 : -1);
60
double fTipHeight = pDialog->iMinBottomGap;
62
int iWidth = pDialog->container.iWidth;
63
double fMargin = 2 * fRadius + fLineWidth;
64
double fBaseWidth = iWidth - fMargin;
65
double fTipWidth = CD_TIP_OUTER_MARGIN + CD_TIP_BASE + CD_TIP_INNER_MARGIN;
66
double fOffsetX = fRadius + fLineWidth / 2;
67
double fOffsetY = fLineWidth / 2;
70
if (!pDialog->container.bDirectionUp) // dessin a l'envers.
72
cairo_scale (pCairoContext, 1., -1.);
73
cairo_translate (pCairoContext, 0., -pDialog->container.iHeight);
61
75
cairo_move_to (pCairoContext, fOffsetX, fOffsetY);
62
//g_print (" fOffsetX : %.2f; fOffsetY : %.2f\n", fOffsetX, fOffsetY);
63
int iWidth = pDialog->container.iWidth;
65
cairo_rel_line_to (pCairoContext, iWidth - (2 * fRadius + fLineWidth), 0);
77
cairo_rel_line_to (pCairoContext, fBaseWidth, 0);
67
79
cairo_rel_curve_to (pCairoContext,
70
fRadius, sens * fRadius);
71
cairo_rel_line_to (pCairoContext, 0, sens * (pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin - (2 * fRadius + fLineWidth)));
83
cairo_rel_line_to (pCairoContext, 0, pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin - fMargin);
73
85
cairo_rel_curve_to (pCairoContext,
76
-fRadius, sens * fRadius);
79
91
if (pDialog->bRight)
81
fDeltaMargin = MAX (0, pDialog->iAimedX - pDialog->container.iWindowPositionX - fRadius - fLineWidth / 2);
82
//g_print ("fDeltaMargin : %.2f\n", fDeltaMargin);
83
cairo_rel_line_to (pCairoContext, -iWidth + fDeltaMargin + fLineWidth + 2 * fRadius + CAIRO_DIALOG_TIP_MARGIN + CAIRO_DIALOG_TIP_BASE + CAIRO_DIALOG_TIP_ROUNDING_MARGIN , 0);
84
cairo_rel_curve_to (pCairoContext,
86
- CAIRO_DIALOG_TIP_ROUNDING_MARGIN, 0,
87
- (CAIRO_DIALOG_TIP_ROUNDING_MARGIN + CAIRO_DIALOG_TIP_MARGIN + CAIRO_DIALOG_TIP_BASE), sens * fTipHeight);
88
cairo_rel_curve_to (pCairoContext,
90
CAIRO_DIALOG_TIP_MARGIN, - sens * fTipHeight,
91
CAIRO_DIALOG_TIP_MARGIN - CAIRO_DIALOG_TIP_ROUNDING_MARGIN, - sens * fTipHeight);
92
cairo_rel_line_to (pCairoContext, - CAIRO_DIALOG_TIP_MARGIN - fDeltaMargin + CAIRO_DIALOG_TIP_ROUNDING_MARGIN, 0);
92
bRight = (pDialog->container.iWindowPositionX + iWidth > pDialog->iAimedX + fTipWidth);
96
fDeltaMargin = MAX (0, MIN (- CAIRO_DIALOG_TIP_MARGIN - CAIRO_DIALOG_TIP_ROUNDING_MARGIN - CAIRO_DIALOG_TIP_BASE - fRadius - fLineWidth / 2, pDialog->container.iWindowPositionX - pDialog->iAimedX - fRadius - fLineWidth / 2) + pDialog->container.iWidth);
97
//g_print ("fDeltaMargin : %.2f / %d\n", fDeltaMargin, pDialog->container.iWidth);
98
cairo_rel_line_to (pCairoContext, - (CAIRO_DIALOG_TIP_MARGIN + fDeltaMargin) + CAIRO_DIALOG_TIP_ROUNDING_MARGIN, 0);
99
cairo_rel_curve_to (pCairoContext,
101
-CAIRO_DIALOG_TIP_ROUNDING_MARGIN, 0,
102
CAIRO_DIALOG_TIP_MARGIN - CAIRO_DIALOG_TIP_ROUNDING_MARGIN, sens * fTipHeight);
103
cairo_rel_curve_to (pCairoContext,
105
- (CAIRO_DIALOG_TIP_MARGIN + CAIRO_DIALOG_TIP_BASE), - sens * fTipHeight,
106
- (CAIRO_DIALOG_TIP_MARGIN + CAIRO_DIALOG_TIP_BASE) - CAIRO_DIALOG_TIP_ROUNDING_MARGIN, - sens * fTipHeight);
107
cairo_rel_line_to (pCairoContext, -iWidth + fDeltaMargin + fLineWidth + 2 * fRadius + CAIRO_DIALOG_TIP_MARGIN + CAIRO_DIALOG_TIP_BASE + CAIRO_DIALOG_TIP_ROUNDING_MARGIN, 0);
94
bRight = (pDialog->container.iWindowPositionX + fTipWidth > pDialog->iAimedX);
95
//g_print ("%d, %d, %d -> %d\n", pDialog->container.iWindowPositionX, (int) fTipWidth, pDialog->iAimedX, bRight);
97
if (bRight) // dialogue a droite de l'icone, pointe vers la gauche.
99
iDeltaIconX = MIN (0, pDialog->container.iWindowPositionX - pDialog->iAimedX); // < 0
100
//g_print ("iDeltaIconX right : %d / %d\n", iDeltaIconX, iWidth);
101
cairo_rel_line_to (pCairoContext, -(fBaseWidth + iDeltaIconX - fTipWidth), 0);
102
cairo_rel_curve_to (pCairoContext,
103
- CD_TIP_OUTER_MARGIN, 0,
104
- CD_TIP_OUTER_MARGIN, 0,
105
- fTipWidth, fTipHeight);
106
cairo_rel_curve_to (pCairoContext,
107
CD_TIP_INNER_MARGIN, - fTipHeight,
108
CD_TIP_INNER_MARGIN, - fTipHeight,
110
cairo_rel_line_to (pCairoContext, iDeltaIconX, 0);
112
else // dialogue a gauche de l'icone, pointe vers la droite.
114
iDeltaIconX = MAX (0, pDialog->container.iWindowPositionX + iWidth - pDialog->iAimedX); // > 0
115
//g_print ("iDeltaIconX left : %d / %d\n", iDeltaIconX, iWidth);
116
cairo_rel_line_to (pCairoContext, - iDeltaIconX, 0);
117
cairo_rel_curve_to (pCairoContext,
118
- (CD_TIP_INNER_MARGIN), 0,
119
- (CD_TIP_INNER_MARGIN), 0,
121
cairo_rel_curve_to (pCairoContext,
122
- (CD_TIP_INNER_MARGIN + CD_TIP_BASE), - fTipHeight,
123
- (CD_TIP_INNER_MARGIN + CD_TIP_BASE), - fTipHeight,
124
- fTipWidth, - fTipHeight);
125
cairo_rel_line_to (pCairoContext, - fBaseWidth + iDeltaIconX + fTipWidth, 0);
111
129
cairo_rel_curve_to (pCairoContext,
114
-fRadius, -sens * fRadius);
115
cairo_rel_line_to (pCairoContext, 0, - sens * (pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin - (2 * fRadius + fLineWidth)));
133
cairo_rel_line_to (pCairoContext, 0, - (pDialog->iBubbleHeight + pDialog->iTopMargin + pDialog->iBottomMargin - fMargin));
117
135
cairo_rel_curve_to (pCairoContext,
120
fRadius, -sens * fRadius);
122
140
cairo_close_path (pCairoContext);
124
cairo_set_source_rgba (pCairoContext, myDialogs.fDialogColor[0], myDialogs.fDialogColor[1], myDialogs.fDialogColor[2], myDialogs.fDialogColor[3]);
142
cairo_set_source_rgba (pCairoContext, myDialogsParam.fDialogColor[0], myDialogsParam.fDialogColor[1], myDialogsParam.fDialogColor[2], myDialogsParam.fDialogColor[3]);
125
143
cairo_fill_preserve (pCairoContext);
127
145
cairo_set_line_width (pCairoContext, fLineWidth);