91
void cd_rendering_calculate_max_dock_size_diapo_simple (CairoDock *pDock)
93
// On calcule la configuration de la grille
108
const double sr = .5; // screen ratio
110
static void _set_scroll (CairoDock *pDock, int iOffsetY)
112
//g_print ("%s (%d)\n", __func__, iOffsetY);
113
CDSlideData *pData = pDock->pRendererData;
114
g_return_if_fail (pData != NULL);
116
pData->iScrollOffset = MAX (0, MIN (iOffsetY, pData->iDeltaHeight));
117
cairo_dock_calculate_dock_icons (pDock);
118
gtk_widget_queue_draw (pDock->container.pWidget);
120
static gboolean _add_scroll (CairoDock *pDock, int iDeltaOffsetY)
122
//g_print ("%s (%d)\n", __func__, iDeltaOffsetY);
123
CDSlideData *pData = pDock->pRendererData;
124
g_return_val_if_fail (pData != NULL, FALSE);
126
if (iDeltaOffsetY < 0)
128
if (pData->iScrollOffset <= 0)
133
if (pData->iScrollOffset >= pData->iDeltaHeight)
136
_set_scroll (pDock, pData->iScrollOffset + iDeltaOffsetY);
140
static gboolean _cd_slide_on_scroll (gpointer data, Icon *pClickedIcon, CairoDock *pDock, int iDirection)
142
CDSlideData *pData = pDock->pRendererData;
143
g_return_val_if_fail (pData != NULL, CAIRO_DOCK_LET_PASS_NOTIFICATION);
144
if (pData->iDeltaHeight == 0)
145
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
147
gboolean bScrolled = _add_scroll (pDock, iDirection == 1 ? pDock->iMaxIconHeight : - pDock->iMaxIconHeight);
148
return (bScrolled ? CAIRO_DOCK_INTERCEPT_NOTIFICATION : CAIRO_DOCK_LET_PASS_NOTIFICATION);
150
static gboolean _cd_slide_on_click (gpointer data, Icon *pClickedIcon, CairoDock *pDock, guint iButtonState)
152
CDSlideData *pData = pDock->pRendererData;
153
g_return_val_if_fail (pData != NULL, CAIRO_DOCK_LET_PASS_NOTIFICATION);
154
if (pData->iDeltaHeight == 0)
155
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
156
if (pData->bDraggingScrollbar)
157
return CAIRO_DOCK_INTERCEPT_NOTIFICATION;
159
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
161
gboolean _cd_slide_on_press_button (GtkWidget* pWidget, GdkEventButton* pButton, CairoDock *pDock)
163
CDSlideData *pData = pDock->pRendererData;
164
g_return_val_if_fail (pData != NULL, FALSE);
165
if (pData->iDeltaHeight == 0)
168
if (pButton->type == GDK_BUTTON_PRESS && pButton->button == 1)
170
double x_arrow = pDock->iMaxDockWidth - X_BORDER_SPACE - fScrollbarWidth;
171
if (pButton->x > x_arrow) // on a clique dans la zone de scroll.
173
//g_print ("click (y=%d, scroll=%d)\n", (int) pButton->y, pData->iScrollOffset);
175
// on regarde sur quoi on clic.
176
double y_arrow_top, y_arrow_bottom;
177
if (pDock->container.bDirectionUp)
179
y_arrow_bottom = pDock->iMaxDockHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth);
180
y_arrow_top = my_diapo_simple_lineWidth;
184
y_arrow_bottom = pDock->iMaxDockHeight - my_diapo_simple_lineWidth;
185
y_arrow_top = my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth;
187
if (pButton->y > y_arrow_top - fScrollbarArrowGap/2 && pButton->y < y_arrow_top + fArrowHeight + fScrollbarArrowGap/2) // bouton haut
189
_set_scroll (pDock, 0);
191
else if (pButton->y < y_arrow_bottom + fScrollbarArrowGap/2 && pButton->y > y_arrow_bottom - fArrowHeight - fScrollbarArrowGap/2) // bouton bas
193
_set_scroll (pDock, pData->iDeltaHeight);
197
pData->bDraggingScrollbar = TRUE;
198
pData->iClickY = pButton->y;
199
pData->iClickOffset = pData->iScrollOffset;
203
else if (GDK_BUTTON_RELEASE)
205
//g_print ("release\n");
206
pData->bDraggingScrollbar = FALSE;
210
static gboolean _cd_slide_on_mouse_moved (gpointer data, CairoDock *pDock, gboolean *bStartAnimation)
212
CDSlideData *pData = pDock->pRendererData;
213
g_return_val_if_fail (pData != NULL, CAIRO_DOCK_LET_PASS_NOTIFICATION);
214
if (pData->iDeltaHeight == 0)
215
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
217
if (pData->bDraggingScrollbar)
219
//g_print ("scroll on motion (y=%d)\n", pDock->container.iMouseY);
221
double y_arrow_top, y_arrow_bottom;
222
if (pDock->container.bDirectionUp)
224
y_arrow_bottom = my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth;
225
y_arrow_top = pDock->iMaxDockHeight - my_diapo_simple_lineWidth;
229
y_arrow_top = pDock->iMaxDockHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth);
230
y_arrow_bottom = my_diapo_simple_lineWidth;
232
double fFrameHeight = pDock->iMaxDockHeight- (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth); // hauteur du cadre avec les rayons et sans la pointe.
233
double fGripHeight = fFrameHeight / (fFrameHeight + pData->iDeltaHeight) * (y_arrow_top - y_arrow_bottom - 2*(fArrowHeight+fScrollbarArrowGap));
234
double ygrip = (double) pData->iScrollOffset / pData->iDeltaHeight * (y_arrow_top - y_arrow_bottom - 2*(fArrowHeight+fScrollbarArrowGap) - fGripHeight);
236
int delta = pDock->container.iMouseY - pData->iClickY;
237
_set_scroll (pDock, (pData->iClickOffset + (double)delta / (y_arrow_top - y_arrow_bottom - 2*(fArrowHeight+fScrollbarArrowGap) - fGripHeight) * pData->iDeltaHeight));
239
return CAIRO_DOCK_INTERCEPT_NOTIFICATION;
241
gboolean cd_slide_on_leave (gpointer data, CairoDock *pDock, gboolean *bStartAnimation)
243
CDSlideData *pData = pDock->pRendererData;
244
//g_return_val_if_fail (pData != NULL, CAIRO_DOCK_LET_PASS_NOTIFICATION);
245
if (pData == NULL || ! pDock->pRenderer || pDock->pRenderer->render != cd_rendering_render_diapo_simple) // pas nous
246
return CAIRO_DOCK_LET_PASS_NOTIFICATION;
248
//g_print (" LEAVE (%d)\n", pData->bDraggingScrollbar);
250
return (pData->bDraggingScrollbar ? CAIRO_DOCK_INTERCEPT_NOTIFICATION : CAIRO_DOCK_LET_PASS_NOTIFICATION);
252
static void cd_rendering_calculate_max_dock_size_diapo_simple (CairoDock *pDock)
254
// On calcule la configuration de la grille sans contrainte.
94
255
guint nRowsX = 0; // nb colonnes.
95
256
guint nRowsY = 0; // nb lignes.
96
257
guint nIcones = 0; // nb icones.
258
int iDeltaHeight = 0; // hauteur ne pouvant rentrer dans le dock.
259
int iMaxIconWidth = 0;
97
260
nIcones = _cd_rendering_diapo_simple_guess_grid(pDock->icons, &nRowsX, &nRowsY);
99
// On calcule la taille de l'affichage
262
// On calcule la taille de l'affichage avec contrainte taille ecran.
102
int iMaxIconWidth = ((Icon*)pDock->icons->data)->fWidth; // approximation un peu bof.
265
// on calcule la largeur avec contrainte, ce qui donne aussi le nombre de lignes.
266
iMaxIconWidth = ((Icon*)pDock->icons->data)->fWidth; // approximation un peu bof.
103
267
pDock->iMaxDockWidth = nRowsX * (iMaxIconWidth + my_diapo_simple_iconGapX) + 2*X_BORDER_SPACE;
104
pDock->iMaxDockHeight = (nRowsY - 1) * (pDock->iMaxIconHeight + my_diapo_simple_iconGapY) + // les icones
105
pDock->iMaxIconHeight * my_diapo_simple_fScaleMax + // les icones des bords zooment
268
int iMaxWidth = sr * g_desktopGeometry.iXScreenWidth[pDock->container.bIsHorizontal];
269
if (pDock->iMaxDockWidth > iMaxWidth)
271
nRowsX = (iMaxWidth - 2*X_BORDER_SPACE) / (iMaxIconWidth + my_diapo_simple_iconGapX);
272
nRowsY = ceil((double) nIcones / nRowsX);
273
pDock->iMaxDockWidth = nRowsX * (iMaxIconWidth + my_diapo_simple_iconGapX) + 2*X_BORDER_SPACE;
274
//g_print ("%d -> %d\n", iMaxWidth, pDock->iMaxDockWidth);
277
// on calcule la hauteur avec contrainte, ce qui donne aussi la marge de defilement.
278
pDock->iMaxDockHeight = (nRowsY - 1) * (pDock->iMaxIconHeight * pDock->container.fRatio + my_diapo_simple_iconGapY) + // les icones
279
pDock->iMaxIconHeight * pDock->container.fRatio * my_diapo_simple_fScaleMax + // les icones des bords zooment
106
280
myLabels.iLabelSize + // le texte des icones de la 1ere ligne
107
281
my_diapo_simple_lineWidth + // les demi-lignes du haut et du bas
108
282
my_diapo_simple_arrowHeight + ARROW_TIP; // la fleche etendue
283
int iMaxHeight = MIN (pDock->iMaxDockWidth, sr * g_desktopGeometry.iXScreenHeight[pDock->container.bIsHorizontal]);
284
if (pDock->iMaxDockHeight > iMaxHeight)
286
nRowsY = (iMaxHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth + myLabels.iLabelSize + pDock->iMaxIconHeight * pDock->container.fRatio * my_diapo_simple_fScaleMax)) / (pDock->iMaxIconHeight * pDock->container.fRatio + my_diapo_simple_iconGapY);
287
int iMaxDockHeight0 = pDock->iMaxDockHeight;
288
pDock->iMaxDockHeight = (nRowsY - 1) * (pDock->iMaxIconHeight * pDock->container.fRatio + my_diapo_simple_iconGapY) +
289
pDock->iMaxIconHeight * pDock->container.fRatio * my_diapo_simple_fScaleMax +
290
myLabels.iLabelSize +
291
my_diapo_simple_lineWidth +
292
my_diapo_simple_arrowHeight + ARROW_TIP;
293
iDeltaHeight = iMaxDockHeight0 - pDock->iMaxDockHeight;
294
//g_print ("%d -> %d\n", iMaxHeight, pDock->iMaxDockHeight);
109
297
pDock->iMinDockWidth = pDock->iMaxDockWidth - 2*X_BORDER_SPACE;
110
298
pDock->iMinDockHeight = pDock->iMaxDockHeight;
122
310
// On affecte ca aussi au cas ou.
123
311
pDock->fFlatDockWidth = pDock->iMaxDockWidth;
124
312
pDock->fMagnitudeMax = my_diapo_simple_fScaleMax / (1+g_fAmplitude);
128
void cd_rendering_render_diapo_simple (cairo_t *pCairoContext, CairoDock *pDock)
314
CDSlideData *pData = pDock->pRendererData;
317
pData = g_new0 (CDSlideData, 1);
318
pDock->pRendererData = pData;
319
cairo_dock_register_notification_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_SCROLL_ICON, (CairoDockNotificationFunc) _cd_slide_on_scroll, CAIRO_DOCK_RUN_AFTER, NULL);
320
cairo_dock_register_notification_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_CLICK_ICON, (CairoDockNotificationFunc) _cd_slide_on_click, CAIRO_DOCK_RUN_FIRST, NULL);
321
cairo_dock_register_notification_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_MOUSE_MOVED, (CairoDockNotificationFunc) _cd_slide_on_mouse_moved, CAIRO_DOCK_RUN_AFTER, NULL);
322
pData->iSidPressEvent = g_signal_connect (G_OBJECT (pDock->container.pWidget),
323
"button-press-event",
324
G_CALLBACK (_cd_slide_on_press_button),
325
pDock); // car les notification de clic en provenance du dock sont emises lors du relachement du bouton.
326
pData->iSidReleaseEvent = g_signal_connect (G_OBJECT (pDock->container.pWidget),
327
"button-release-event",
328
G_CALLBACK (_cd_slide_on_press_button),
331
pData->nRowsX = nRowsX;
332
pData->nRowsY = nRowsY;
333
pData->iDeltaHeight = iDeltaHeight;
334
if (iDeltaHeight != 0)
336
int iScrollMargin = iMaxIconWidth * (my_diapo_simple_fScaleMax - 1) / 2
338
+ fScrollbarWidth; // donc a droite on a : derniere icone en taille max + demi-gapx + + gab + scrollbar + X_BORDER_SPACE
339
pDock->iMaxDockWidth += iScrollMargin;
345
//////////////////////////////////////////////////////////////////////////////////////// Methodes de dessin :
347
static void cairo_dock_draw_frame_horizontal_for_diapo_simple (cairo_t *pCairoContext, CairoDock *pDock)
349
const gdouble arrow_dec = 2;
350
gdouble fFrameWidth = pDock->iMaxDockWidth - 2 * X_BORDER_SPACE - 0 * my_diapo_simple_radius;
351
gdouble fFrameHeight = pDock->iMaxDockHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth);
352
gdouble fDockOffsetX = X_BORDER_SPACE + 0*my_diapo_simple_radius;
353
gdouble fDockOffsetY = (pDock->container.bDirectionUp ? .5*my_diapo_simple_lineWidth : my_diapo_simple_arrowHeight + ARROW_TIP);
355
cairo_move_to (pCairoContext, fDockOffsetX, fDockOffsetY);
357
//HautGauche -> HautDroit
358
if(pDock->container.bDirectionUp)
360
cairo_rel_line_to (pCairoContext, fFrameWidth, 0);
365
cairo_rel_line_to (pCairoContext, (fFrameWidth/2 - my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth), 0); // _
366
cairo_rel_line_to (pCairoContext, + my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth - my_diapo_simple_arrowShift * fFrameWidth / arrow_dec, -my_diapo_simple_arrowHeight); // \.
367
cairo_rel_line_to (pCairoContext, + my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth + my_diapo_simple_arrowShift * fFrameWidth / arrow_dec, +my_diapo_simple_arrowHeight); // /
368
cairo_rel_line_to (pCairoContext, (fFrameWidth/2 - my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth) , 0); // _
370
//\_________________ Coin haut droit.
371
cairo_rel_curve_to (pCairoContext,
373
my_diapo_simple_radius, 0,
374
my_diapo_simple_radius, my_diapo_simple_radius );
376
//HautDroit -> BasDroit
377
cairo_rel_line_to (pCairoContext, 0, fFrameHeight + my_diapo_simple_lineWidth - my_diapo_simple_radius * 2 );
378
//\_________________ Coin bas droit.
379
cairo_rel_curve_to (pCairoContext,
381
0 , my_diapo_simple_radius,
382
-my_diapo_simple_radius , my_diapo_simple_radius);
384
//BasDroit -> BasGauche
385
if(!pDock->container.bDirectionUp)
387
cairo_rel_line_to (pCairoContext, - fFrameWidth , 0);
392
cairo_rel_line_to (pCairoContext, - (fFrameWidth/2 - my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth), 0); // _
393
cairo_rel_line_to (pCairoContext, - my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth + my_diapo_simple_arrowShift * fFrameWidth / arrow_dec, my_diapo_simple_arrowHeight); // /
394
cairo_rel_line_to (pCairoContext, - my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth - my_diapo_simple_arrowShift * fFrameWidth / arrow_dec, -my_diapo_simple_arrowHeight); // \.
395
cairo_rel_line_to (pCairoContext, - (fFrameWidth/2 - my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth) , 0); // _
397
//\_________________ Coin bas gauche.
398
cairo_rel_curve_to (pCairoContext,
400
-my_diapo_simple_radius, 0,
401
-my_diapo_simple_radius, -my_diapo_simple_radius);
403
//BasGauche -> HautGauche
404
cairo_rel_line_to (pCairoContext, 0, - fFrameHeight - my_diapo_simple_lineWidth + my_diapo_simple_radius * 2);
405
//\_________________ Coin haut gauche.
406
cairo_rel_curve_to (pCairoContext,
408
0 , -my_diapo_simple_radius ,
409
my_diapo_simple_radius, -my_diapo_simple_radius);
412
static void cairo_dock_draw_frame_vertical_for_diapo_simple (cairo_t *pCairoContext, CairoDock *pDock)
414
const gdouble arrow_dec = 2;
415
gdouble fFrameWidth = pDock->iMaxDockWidth - 2 * X_BORDER_SPACE - 2 * my_diapo_simple_radius;
416
gdouble fFrameHeight = pDock->iMaxDockHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth);
417
gdouble fDockOffsetX = X_BORDER_SPACE + my_diapo_simple_radius;
418
gdouble fDockOffsetY = (pDock->container.bDirectionUp ? .5*my_diapo_simple_lineWidth : my_diapo_simple_arrowHeight + ARROW_TIP);
420
cairo_move_to (pCairoContext, fDockOffsetY, fDockOffsetX);
422
if(pDock->container.bDirectionUp)
424
cairo_rel_line_to (pCairoContext, 0, fFrameWidth);
428
cairo_rel_line_to (pCairoContext,0,(fFrameWidth/2 - my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth)); // _
429
cairo_rel_line_to (pCairoContext, -my_diapo_simple_arrowHeight, my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth - my_diapo_simple_arrowShift * fFrameWidth / arrow_dec); // \.
430
cairo_rel_line_to (pCairoContext, my_diapo_simple_arrowHeight, + my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth + my_diapo_simple_arrowShift * fFrameWidth / arrow_dec); // /
431
cairo_rel_line_to (pCairoContext,0,(fFrameWidth/2 - my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth)); // _
433
//\_________________ Coin haut droit.
434
cairo_rel_curve_to (pCairoContext,
436
0, my_diapo_simple_radius,
437
my_diapo_simple_radius, my_diapo_simple_radius);
438
cairo_rel_line_to (pCairoContext, fFrameHeight + my_diapo_simple_lineWidth - my_diapo_simple_radius * 2, 0);
439
//\_________________ Coin bas droit.
440
cairo_rel_curve_to (pCairoContext,
442
my_diapo_simple_radius, 0,
443
my_diapo_simple_radius, -my_diapo_simple_radius);
444
if(!pDock->container.bDirectionUp)
446
cairo_rel_line_to (pCairoContext, 0, - fFrameWidth);
451
cairo_rel_line_to (pCairoContext, 0, - (fFrameWidth/2 - my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth)); // _
452
cairo_rel_line_to (pCairoContext, my_diapo_simple_arrowHeight, - my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth + my_diapo_simple_arrowShift * fFrameWidth / arrow_dec); // /
453
cairo_rel_line_to (pCairoContext, -my_diapo_simple_arrowHeight, - my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth - my_diapo_simple_arrowShift * fFrameWidth / arrow_dec ); // \.
454
cairo_rel_line_to (pCairoContext, 0, - (fFrameWidth/2 - my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth)); // _
457
//\_________________ Coin bas gauche.
458
cairo_rel_curve_to (pCairoContext,
460
0, -my_diapo_simple_radius,
461
-my_diapo_simple_radius, -my_diapo_simple_radius);
462
cairo_rel_line_to (pCairoContext, - fFrameHeight - my_diapo_simple_lineWidth + my_diapo_simple_radius * 2, 0);
463
//\_________________ Coin haut gauche.
464
cairo_rel_curve_to (pCairoContext,
466
-my_diapo_simple_radius, 0,
467
-my_diapo_simple_radius, my_diapo_simple_radius);
469
static void cairo_dock_draw_frame_for_diapo_simple (cairo_t *pCairoContext, CairoDock *pDock)
471
if (pDock->container.bIsHorizontal)
472
cairo_dock_draw_frame_horizontal_for_diapo_simple (pCairoContext, pDock);
474
cairo_dock_draw_frame_vertical_for_diapo_simple (pCairoContext, pDock);
477
static void cairo_dock_render_decorations_in_frame_for_diapo_simple (cairo_t *pCairoContext, CairoDock *pDock, double fAlpha)
479
// On se fait un beau pattern degrade :
480
cairo_pattern_t *mon_super_pattern;
481
mon_super_pattern = cairo_pattern_create_linear (0.0,
483
my_diapo_simple_fade2right ? pDock->iMaxDockWidth : 0.0, // Y'aurait surement des calculs complexes à faire mais
484
my_diapo_simple_fade2bottom ? pDock->iMaxDockHeight : 0.0); // a quelques pixels près pour un dégradé : OSEF !
486
cairo_pattern_add_color_stop_rgba (mon_super_pattern, 0,
487
my_diapo_simple_color_frame_start[0],
488
my_diapo_simple_color_frame_start[1],
489
my_diapo_simple_color_frame_start[2],
490
my_diapo_simple_color_frame_start[3] * fAlpha); // transparent -> opaque au depliage.
492
cairo_pattern_add_color_stop_rgba (mon_super_pattern, 1,
493
my_diapo_simple_color_frame_stop[0],
494
my_diapo_simple_color_frame_stop[1],
495
my_diapo_simple_color_frame_stop[2],
496
my_diapo_simple_color_frame_stop[3] * fAlpha);
497
cairo_set_source (pCairoContext, mon_super_pattern);
499
//On remplit le contexte en le préservant -> pourquoi ? ----> parce qu'on va tracer le contour plus tard ;-)
500
cairo_fill_preserve (pCairoContext);
501
cairo_pattern_destroy (mon_super_pattern);
504
static void cd_rendering_render_diapo_simple (cairo_t *pCairoContext, CairoDock *pDock)
506
double fAlpha = (pDock->fFoldingFactor < .3 ? (.3 - pDock->fFoldingFactor) / .3 : 0.); // apparition du cadre de 0.3 a 0
130
507
if (my_diapo_simple_draw_background)
132
509
//\____________________ On trace le cadre.
161
537
if (myIcons.iStringLineWidth > 0)
162
538
cairo_dock_draw_string (pCairoContext, pDock, myIcons.iStringLineWidth, TRUE, TRUE);
540
//\____________________ On dessine les barres de defilement.
541
CDSlideData *pData = pDock->pRendererData;
542
if (pData != NULL && pData->iDeltaHeight != 0)
544
cairo_save (pCairoContext);
545
cairo_set_line_width (pCairoContext, 2.);
547
double x_arrow = pDock->iMaxDockWidth - X_BORDER_SPACE - fScrollbarWidth/2; // pointe de la fleche.
548
double y_arrow_top, y_arrow_bottom;
549
if (pDock->container.bDirectionUp)
551
y_arrow_bottom = pDock->iMaxDockHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth);
552
y_arrow_top = my_diapo_simple_lineWidth;
556
y_arrow_top = my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth;
557
y_arrow_bottom = pDock->iMaxDockHeight - my_diapo_simple_lineWidth;
559
if (pData->iScrollOffset != 0) // fleche vers le haut.
561
cairo_move_to (pCairoContext, x_arrow, y_arrow_top);
562
cairo_rel_line_to (pCairoContext, fScrollbarWidth/2, fArrowHeight);
563
cairo_rel_line_to (pCairoContext, -fScrollbarWidth, 0.);
564
cairo_close_path (pCairoContext);
566
cairo_set_source_rgba (pCairoContext, my_diapo_simple_color_scrollbar_inside[0], my_diapo_simple_color_scrollbar_inside[1], my_diapo_simple_color_scrollbar_inside[2], my_diapo_simple_color_scrollbar_inside[3] * fAlpha);
567
cairo_fill_preserve (pCairoContext);
569
cairo_set_source_rgba (pCairoContext, my_diapo_simple_color_scrollbar_line[0], my_diapo_simple_color_scrollbar_line[1], my_diapo_simple_color_scrollbar_line[2], my_diapo_simple_color_scrollbar_line[3] * fAlpha);
570
cairo_stroke (pCairoContext);
572
if (pData->iScrollOffset != pData->iDeltaHeight) // fleche vers le bas.
574
cairo_move_to (pCairoContext, x_arrow, y_arrow_bottom);
575
cairo_rel_line_to (pCairoContext, fScrollbarWidth/2, - fArrowHeight);
576
cairo_rel_line_to (pCairoContext, -fScrollbarWidth, 0.);
577
cairo_close_path (pCairoContext);
579
cairo_set_source_rgba (pCairoContext, my_diapo_simple_color_scrollbar_inside[0], my_diapo_simple_color_scrollbar_inside[1], my_diapo_simple_color_scrollbar_inside[2], my_diapo_simple_color_scrollbar_inside[3] * fAlpha);
580
cairo_fill_preserve (pCairoContext);
582
cairo_set_source_rgba (pCairoContext, my_diapo_simple_color_scrollbar_line[0], my_diapo_simple_color_scrollbar_line[1], my_diapo_simple_color_scrollbar_line[2], my_diapo_simple_color_scrollbar_line[3] * fAlpha);
583
cairo_stroke (pCairoContext);
586
cairo_move_to (pCairoContext, x_arrow - fScrollbarWidth/2, y_arrow_top + fArrowHeight + fScrollbarArrowGap);
587
cairo_rel_line_to (pCairoContext, fScrollbarWidth, 0.);
588
cairo_rel_line_to (pCairoContext, 0., y_arrow_bottom - y_arrow_top - 2*(fArrowHeight+fScrollbarArrowGap));
589
cairo_rel_line_to (pCairoContext, -fScrollbarWidth, 0.);
590
cairo_close_path (pCairoContext);
592
cairo_set_source_rgba (pCairoContext, my_diapo_simple_color_scrollbar_inside[0], my_diapo_simple_color_scrollbar_inside[1], my_diapo_simple_color_scrollbar_inside[2], my_diapo_simple_color_scrollbar_inside[3] * fAlpha);
593
cairo_fill_preserve (pCairoContext);
595
cairo_set_source_rgba (pCairoContext, my_diapo_simple_color_scrollbar_line[0], my_diapo_simple_color_scrollbar_line[1], my_diapo_simple_color_scrollbar_line[2], my_diapo_simple_color_scrollbar_line[3] * fAlpha);
596
cairo_stroke (pCairoContext);
598
double fFrameHeight = pDock->iMaxDockHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth); // hauteur du cadre avec les rayons et sans la pointe.
599
double fGripHeight = fFrameHeight / (fFrameHeight + pData->iDeltaHeight) * (y_arrow_bottom - y_arrow_top - 2*(fArrowHeight+fScrollbarArrowGap));
600
double ygrip = (double) pData->iScrollOffset / pData->iDeltaHeight * (y_arrow_bottom - y_arrow_top - 2*(fArrowHeight+fScrollbarArrowGap) - fGripHeight);
601
cairo_set_source_rgba (pCairoContext, my_diapo_simple_color_grip[0], my_diapo_simple_color_grip[1], my_diapo_simple_color_grip[2], my_diapo_simple_color_grip[3] * fAlpha);
602
cairo_move_to (pCairoContext, x_arrow - fScrollbarWidth/2 + 1, y_arrow_top + fArrowHeight + fScrollbarArrowGap + ygrip);
603
cairo_rel_line_to (pCairoContext, fScrollbarWidth - 2, 0.);
604
cairo_rel_line_to (pCairoContext, 0., fGripHeight);
605
cairo_rel_line_to (pCairoContext, - (fScrollbarWidth - 2), 0.);
606
cairo_fill (pCairoContext);
608
cairo_restore (pCairoContext);
164
611
//\____________________ On dessine les icones avec leurs etiquettes.
165
612
// on determine la 1ere icone a tracer : l'icone suivant l'icone pointee.
166
613
GList *pFirstDrawnElement = cairo_dock_get_first_drawn_element_linear (pDock->icons);
167
614
if (pFirstDrawnElement == NULL)
617
//clip pour le scroll
618
if (pData != NULL && pData->iDeltaHeight != 0) // on fait un clip pour les icones qui debordent.
620
int h = my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth;
621
if (pDock->container.bIsHorizontal)
623
cairo_rectangle (pCairoContext,
625
(pDock->container.bDirectionUp ? my_diapo_simple_lineWidth : h), // top left corner.
626
pDock->container.iWidth,
627
pDock->container.iHeight - h);
628
cairo_clip (pCairoContext);
629
} // sinon clip inutile.
170
632
// on dessine les icones, l'icone pointee en dernier.
172
634
GList *ic = pFirstDrawnElement;
638
if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (icon))
177
641
if (icon->bPointed)
398
void cd_rendering_register_diapo_simple_renderer (const gchar *cRendererName)
400
//////////////////////////////////////////////////////////////////////////////////////// On definit le renderer :
401
CairoDockRenderer *pRenderer = g_new0 (CairoDockRenderer, 1); //Nouvelle structure
402
pRenderer->cReadmeFilePath = g_strdup_printf ("%s/readme-diapo-simple-view", MY_APPLET_SHARE_DATA_DIR); //On affecte le readme
403
pRenderer->cPreviewFilePath = g_strdup_printf ("%s/preview-diapo-simple.jpg", MY_APPLET_SHARE_DATA_DIR); // la preview
404
pRenderer->compute_size = cd_rendering_calculate_max_dock_size_diapo_simple; //La fonction qui défini les bornes
405
pRenderer->calculate_icons = cd_rendering_calculate_icons_diapo_simple; //qui calcule les param des icones
406
pRenderer->render = cd_rendering_render_diapo_simple; //qui initie le calcul du rendu
407
pRenderer->render_optimized = NULL;//cd_rendering_render_diapo_simple_optimized; //pareil en mieux
408
pRenderer->set_subdock_position = cairo_dock_set_subdock_position_linear; // ?
409
pRenderer->render_opengl = cd_rendering_render_diapo_simple_opengl;
411
pRenderer->bUseReflect = FALSE; // On dit non au reflections
412
pRenderer->cDisplayedName = D_ (cRendererName);
414
cairo_dock_register_renderer (cRendererName, pRenderer); //Puis on signale l'existence de notre rendu
418
//////////////////////////////////////////////////////////////////////////////////////// Methodes de dessin :
420
static void cairo_dock_draw_frame_horizontal_for_diapo_simple (cairo_t *pCairoContext, CairoDock *pDock)
422
const gdouble arrow_dec = 2;
423
gdouble fFrameWidth = pDock->iMaxDockWidth - 2 * X_BORDER_SPACE;
424
gdouble fFrameHeight = pDock->iMaxDockHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth);
425
gdouble fDockOffsetX = X_BORDER_SPACE;
426
gdouble fDockOffsetY = (pDock->container.bDirectionUp ? .5*my_diapo_simple_lineWidth : my_diapo_simple_arrowHeight + ARROW_TIP);
428
cairo_move_to (pCairoContext, fDockOffsetX, fDockOffsetY);
430
//HautGauche -> HautDroit
431
if(pDock->container.bDirectionUp)
433
cairo_rel_line_to (pCairoContext, fFrameWidth, 0);
438
cairo_rel_line_to (pCairoContext, (fFrameWidth/2 - my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth), 0); // _
439
cairo_rel_line_to (pCairoContext, + my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth - my_diapo_simple_arrowShift * fFrameWidth / arrow_dec, -my_diapo_simple_arrowHeight); // \.
440
cairo_rel_line_to (pCairoContext, + my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth + my_diapo_simple_arrowShift * fFrameWidth / arrow_dec, +my_diapo_simple_arrowHeight); // /
441
cairo_rel_line_to (pCairoContext, (fFrameWidth/2 - my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth) , 0); // _
443
//\_________________ Coin haut droit.
444
cairo_rel_curve_to (pCairoContext,
446
my_diapo_simple_radius, 0,
447
my_diapo_simple_radius, my_diapo_simple_radius );
449
//HautDroit -> BasDroit
450
cairo_rel_line_to (pCairoContext, 0, fFrameHeight + my_diapo_simple_lineWidth - my_diapo_simple_radius * 2 );
451
//\_________________ Coin bas droit.
452
cairo_rel_curve_to (pCairoContext,
454
0 , my_diapo_simple_radius,
455
-my_diapo_simple_radius , my_diapo_simple_radius);
457
//BasDroit -> BasGauche
458
if(!pDock->container.bDirectionUp)
460
cairo_rel_line_to (pCairoContext, - fFrameWidth , 0);
465
cairo_rel_line_to (pCairoContext, - (fFrameWidth/2 - my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth), 0); // _
466
cairo_rel_line_to (pCairoContext, - my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth + my_diapo_simple_arrowShift * fFrameWidth / arrow_dec, my_diapo_simple_arrowHeight); // /
467
cairo_rel_line_to (pCairoContext, - my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth - my_diapo_simple_arrowShift * fFrameWidth / arrow_dec, -my_diapo_simple_arrowHeight); // \.
468
cairo_rel_line_to (pCairoContext, - (fFrameWidth/2 - my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth) , 0); // _
470
//\_________________ Coin bas gauche.
471
cairo_rel_curve_to (pCairoContext,
473
-my_diapo_simple_radius, 0,
474
-my_diapo_simple_radius, -my_diapo_simple_radius);
476
//BasGauche -> HautGauche
477
cairo_rel_line_to (pCairoContext, 0, - fFrameHeight - my_diapo_simple_lineWidth + my_diapo_simple_radius * 2);
478
//\_________________ Coin haut gauche.
479
cairo_rel_curve_to (pCairoContext,
481
0 , -my_diapo_simple_radius ,
482
my_diapo_simple_radius, -my_diapo_simple_radius);
485
static void cairo_dock_draw_frame_vertical_for_diapo_simple (cairo_t *pCairoContext, CairoDock *pDock)
487
const gdouble arrow_dec = 2;
488
gdouble fFrameWidth = pDock->iMaxDockWidth - 2 * X_BORDER_SPACE;
489
gdouble fFrameHeight = pDock->iMaxDockHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth);
490
gdouble fDockOffsetX = X_BORDER_SPACE;
491
gdouble fDockOffsetY = (pDock->container.bDirectionUp ? .5*my_diapo_simple_lineWidth : my_diapo_simple_arrowHeight + ARROW_TIP);
493
cairo_move_to (pCairoContext, fDockOffsetY, fDockOffsetX);
495
if(pDock->container.bDirectionUp)
497
cairo_rel_line_to (pCairoContext, 0, fFrameWidth);
501
cairo_rel_line_to (pCairoContext,0,(fFrameWidth/2 - my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth)); // _
502
cairo_rel_line_to (pCairoContext, -my_diapo_simple_arrowHeight, my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth - my_diapo_simple_arrowShift * fFrameWidth / arrow_dec); // \.
503
cairo_rel_line_to (pCairoContext, my_diapo_simple_arrowHeight, + my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth + my_diapo_simple_arrowShift * fFrameWidth / arrow_dec); // /
504
cairo_rel_line_to (pCairoContext,0,(fFrameWidth/2 - my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth)); // _
506
//\_________________ Coin haut droit.
507
cairo_rel_curve_to (pCairoContext,
509
0, my_diapo_simple_radius,
510
my_diapo_simple_radius, my_diapo_simple_radius);
511
cairo_rel_line_to (pCairoContext, fFrameHeight + my_diapo_simple_lineWidth - my_diapo_simple_radius * 2, 0);
512
//\_________________ Coin bas droit.
513
cairo_rel_curve_to (pCairoContext,
515
my_diapo_simple_radius, 0,
516
my_diapo_simple_radius, -my_diapo_simple_radius);
517
if(!pDock->container.bDirectionUp)
519
cairo_rel_line_to (pCairoContext, 0, - fFrameWidth);
524
cairo_rel_line_to (pCairoContext, 0, - (fFrameWidth/2 - my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth)); // _
525
cairo_rel_line_to (pCairoContext, my_diapo_simple_arrowHeight, - my_diapo_simple_arrowWidth/2 - my_diapo_simple_arrowShift * fFrameWidth + my_diapo_simple_arrowShift * fFrameWidth / arrow_dec); // /
526
cairo_rel_line_to (pCairoContext, -my_diapo_simple_arrowHeight, - my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth - my_diapo_simple_arrowShift * fFrameWidth / arrow_dec ); // \.
527
cairo_rel_line_to (pCairoContext, 0, - (fFrameWidth/2 - my_diapo_simple_arrowWidth/2 + my_diapo_simple_arrowShift * fFrameWidth)); // _
530
//\_________________ Coin bas gauche.
531
cairo_rel_curve_to (pCairoContext,
533
0, -my_diapo_simple_radius,
534
-my_diapo_simple_radius, -my_diapo_simple_radius);
535
cairo_rel_line_to (pCairoContext, - fFrameHeight - my_diapo_simple_lineWidth + my_diapo_simple_radius * 2, 0);
536
//\_________________ Coin haut gauche.
537
cairo_rel_curve_to (pCairoContext,
539
-my_diapo_simple_radius, 0,
540
-my_diapo_simple_radius, my_diapo_simple_radius);
542
void cairo_dock_draw_frame_for_diapo_simple (cairo_t *pCairoContext, CairoDock *pDock)
544
if (pDock->container.bIsHorizontal)
545
cairo_dock_draw_frame_horizontal_for_diapo_simple (pCairoContext, pDock);
547
cairo_dock_draw_frame_vertical_for_diapo_simple (pCairoContext, pDock);
552
void cairo_dock_render_decorations_in_frame_for_diapo_simple (cairo_t *pCairoContext, CairoDock *pDock, double fAlpha)
554
// On se fait un beau pattern degrade :
555
cairo_pattern_t *mon_super_pattern;
556
mon_super_pattern = cairo_pattern_create_linear (0.0,
558
my_diapo_simple_fade2right ? pDock->iMaxDockWidth : 0.0, // Y'aurait surement des calculs complexes à faire mais
559
my_diapo_simple_fade2bottom ? pDock->iMaxDockHeight : 0.0); // a quelques pixels près pour un dégradé : OSEF !
561
cairo_pattern_add_color_stop_rgba (mon_super_pattern, 0,
562
my_diapo_simple_color_frame_start[0],
563
my_diapo_simple_color_frame_start[1],
564
my_diapo_simple_color_frame_start[2],
565
my_diapo_simple_color_frame_start[3] * fAlpha); // transparent -> opaque au depliage.
567
cairo_pattern_add_color_stop_rgba (mon_super_pattern, 1,
568
my_diapo_simple_color_frame_stop[0],
569
my_diapo_simple_color_frame_stop[1],
570
my_diapo_simple_color_frame_stop[2],
571
my_diapo_simple_color_frame_stop[3] * fAlpha);
572
cairo_set_source (pCairoContext, mon_super_pattern);
574
//On remplit le contexte en le préservant -> pourquoi ? ----> parce qu'on va tracer le contour plus tard ;-)
575
cairo_fill_preserve (pCairoContext);
576
cairo_pattern_destroy (mon_super_pattern);
580
void cd_rendering_render_diapo_simple_opengl (CairoDock *pDock)
880
static const double a = 2.5; // definit combien la fleche est penchee.
882
#define RADIAN (G_PI / 180.0) // Conversion Radian/Degres
883
#define DELTA_ROUND_DEGREE 5
884
#define TIP_OFFSET_FACTOR 2.
885
#define _recopy_prev_color(pColorTab, i) memcpy (&pColorTab[4*i], &pColorTab[4*(i-1)], 4*sizeof (GLfloat));
886
#define _copy_color(pColorTab, i, fAlpha, c) do { \
887
pColorTab[4*i] = c[0];\
888
pColorTab[4*i+1] = c[1];\
889
pColorTab[4*i+2] = c[2];\
890
pColorTab[4*i+3] = c[3] * fAlpha; } while (0)
891
/*#define _copy_mean_color(pColorTab, i, fAlpha, c1, c2, f) do { \
892
pColorTab[4*i] = c1[0]*f + c2[0]*(1-f);\
893
pColorTab[4*i+1] = c1[1]*f + c2[1]*(1-f);\
894
pColorTab[4*i+2] = c1[2]*f + c2[2]*(1-f);\
895
pColorTab[4*i+3] = (c1[3]*f + c2[3]*(1-f)) * fAlpha; } while (0)*/
896
static void cd_add_arrow_to_path (CairoDockGLPath *pPath, double fFrameWidth)
898
double w = fFrameWidth / 2;
899
double aw = my_diapo_simple_arrowWidth/2;
900
double ah = my_diapo_simple_arrowHeight;
901
double xa = my_diapo_simple_arrowShift * (w - aw); // abscisse de l'extremite de la pointe.
903
cairo_dock_gl_path_rel_line_to (pPath, w + xa - aw, 0.); // pointe.
904
cairo_dock_gl_path_rel_line_to (pPath, aw, -ah);
905
cairo_dock_gl_path_rel_line_to (pPath, aw, ah);
907
static CairoDockGLPath *cd_generate_frame_path_without_arrow (double fFrameWidth, double fTotalHeight, double fRadius)
909
static CairoDockGLPath *pPath = NULL;
910
double fTotalWidth = fFrameWidth + 2 * fRadius;
911
double fFrameHeight = MAX (0, fTotalHeight - 2 * fRadius);
912
double w = fFrameWidth / 2;
913
double h = fFrameHeight / 2;
916
int iNbPoins1Round = 90/DELTA_ROUND_DEGREE;
918
pPath = cairo_dock_new_gl_path ((iNbPoins1Round+1)*4+1+3, w, -h-r, fTotalWidth, fTotalHeight); // on commence au coin haut droit pour avoir une bonne triangulation du polygone, et en raisonnant par rapport au centre du rectangle.
920
cairo_dock_gl_path_move_to (pPath, w, -h-r);
922
cairo_dock_gl_path_arc (pPath, iNbPoins1Round, w, -h, r, -G_PI/2, +G_PI/2); // coin bas droit.
924
cairo_dock_gl_path_arc (pPath, iNbPoins1Round, w, h, r, 0., +G_PI/2); // coin haut droit.
926
cairo_dock_gl_path_arc (pPath, iNbPoins1Round, -w, h, r, G_PI/2, +G_PI/2); // coin haut gauche.
928
cairo_dock_gl_path_arc (pPath, iNbPoins1Round, -w, -h, r, G_PI, +G_PI/2); // coin bas gauche.
933
static CairoDockGLPath *cd_generate_arrow_path (double fFrameWidth, double fTotalHeight)
935
static CairoDockGLPath *pPath = NULL;
936
double w = fFrameWidth / 2;
938
double aw = my_diapo_simple_arrowWidth/2;
939
double ah = my_diapo_simple_arrowHeight;
940
double xa = my_diapo_simple_arrowShift * (w - aw); // abscisse de l'extremite de la pointe.
943
pPath = cairo_dock_new_gl_path (3, xa - aw, -fTotalHeight/2, 0., 0.);
945
cairo_dock_gl_path_move_to (pPath, xa - aw, -fTotalHeight/2);
947
cairo_dock_gl_path_rel_line_to (pPath, aw, -ah);
948
cairo_dock_gl_path_rel_line_to (pPath, aw, ah);
953
static const GLfloat *cd_generate_color_tab (double fAlpha, GLfloat *pMiddleBottomColor)
955
static GLfloat *pColorTab = NULL;
956
int iNbPoins1Round = 90/DELTA_ROUND_DEGREE;
957
if (pColorTab == NULL)
958
pColorTab = g_new (GLfloat, ((iNbPoins1Round+1)*4+1) * 4);
960
double *pTopRightColor, *pTopLeftColor, *pBottomLeftColor, *pBottomRightColor;
961
double pMeanColor[4] = {(my_diapo_simple_color_frame_start[0] + my_diapo_simple_color_frame_stop[0])/2,
962
(my_diapo_simple_color_frame_start[1] + my_diapo_simple_color_frame_stop[1])/2,
963
(my_diapo_simple_color_frame_start[2] + my_diapo_simple_color_frame_stop[2])/2,
964
(my_diapo_simple_color_frame_start[3] + my_diapo_simple_color_frame_stop[3])/2};
965
pTopLeftColor = my_diapo_simple_color_frame_start;
966
if (my_diapo_simple_fade2bottom || my_diapo_simple_fade2right)
968
pBottomRightColor = my_diapo_simple_color_frame_stop;
969
if (my_diapo_simple_fade2bottom && my_diapo_simple_fade2right)
971
pBottomLeftColor = pMeanColor;
972
pTopRightColor = pMeanColor;
974
else if (my_diapo_simple_fade2bottom)
976
pBottomLeftColor = my_diapo_simple_color_frame_stop;
977
pTopRightColor = my_diapo_simple_color_frame_start;
981
pBottomLeftColor = my_diapo_simple_color_frame_start;
982
pTopRightColor = my_diapo_simple_color_frame_stop;
987
pBottomRightColor = my_diapo_simple_color_frame_start;
988
pBottomLeftColor = my_diapo_simple_color_frame_start;
989
pTopRightColor = my_diapo_simple_color_frame_start;
992
pMiddleBottomColor[0] = (pBottomRightColor[0] + pBottomLeftColor[0])/2;
993
pMiddleBottomColor[1] = (pBottomRightColor[1] + pBottomLeftColor[1])/2;
994
pMiddleBottomColor[2] = (pBottomRightColor[2] + pBottomLeftColor[2])/2;
995
pMiddleBottomColor[3] = (pBottomRightColor[3] + pBottomLeftColor[3])/2;
998
_copy_color (pColorTab, i, fAlpha, pBottomRightColor);
1001
for (j = 0; j < iNbPoins1Round; j ++, i ++) // coin bas droit.
1003
_copy_color (pColorTab, i, fAlpha, pBottomRightColor);
1006
for (j = 0; j < iNbPoins1Round; j ++, i ++) // coin haut droit.
1008
_copy_color (pColorTab, i, fAlpha, pTopRightColor);
1011
for (j = 0; j < iNbPoins1Round; j ++, i ++) // coin haut gauche.
1013
_copy_color (pColorTab, i, fAlpha, pTopLeftColor);
1016
for (j = 0; j < iNbPoins1Round; j ++, i ++) // coin bas gauche.
1018
_copy_color (pColorTab, i, fAlpha, pBottomLeftColor);
1024
static void cd_rendering_render_diapo_simple_opengl (CairoDock *pDock)
1026
static CairoDockGLPath *pScrollPath = NULL;
582
1028
//\____________________ On initialise le cadre.
584
1030
GLfloat *pColorTab, *pVertexTab;
586
1032
double fRadius = my_diapo_simple_radius;
587
1033
double fFrameWidth = pDock->iMaxDockWidth - 2*X_BORDER_SPACE; // longueur du trait horizontal.
588
double fFrameHeight = pDock->iMaxDockHeight- (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth); // hauteur du cadre avec les rayons et sans la pointe.
1034
double fFrameHeight = pDock->iMaxDockHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth); // hauteur du cadre avec les rayons et sans la pointe.
589
1035
double fDockOffsetX, fDockOffsetY;
590
if (pDock->container.bIsHorizontal)
592
fDockOffsetX = X_BORDER_SPACE;
593
fDockOffsetY = (!pDock->container.bDirectionUp ? .5*my_diapo_simple_lineWidth : my_diapo_simple_arrowHeight+ARROW_TIP);
594
fFrameWidth = pDock->iMaxDockWidth - 2*X_BORDER_SPACE; // longueur du trait horizontal.
595
fFrameHeight = pDock->iMaxDockHeight- (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth); // hauteur du cadre avec les rayons et sans la pointe.
599
fDockOffsetY = X_BORDER_SPACE;
600
fDockOffsetX = (pDock->container.bDirectionUp ? .5*my_diapo_simple_lineWidth : my_diapo_simple_arrowHeight+ARROW_TIP);
601
fFrameHeight = pDock->iMaxDockWidth - 2*X_BORDER_SPACE; // longueur du trait horizontal.
602
fFrameWidth = pDock->iMaxDockHeight- (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth); // hauteur du cadre avec les rayons et sans la pointe.
606
if (my_diapo_simple_draw_background) // On remplit le cadre en 2 temps (avec des polygones convexes).
609
glTranslatef ((int) (fDockOffsetX + fFrameWidth/2), (int) (fDockOffsetY + fFrameHeight/2), -100); // (int) -pDock->iMaxIconHeight * (1 + myIcons.fAmplitude) + 1
610
glScalef (fFrameWidth, fFrameHeight, 1.);
612
glEnable (GL_BLEND); // On active le blend
613
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
614
_cairo_dock_set_blend_alpha ();
616
double fAlpha = (pDock->fFoldingFactor < .3 ? (.3 - pDock->fFoldingFactor) / .3 : 0.); // apparition du cadre de 0.3 a 0
618
glPolygonMode (GL_FRONT, GL_FILL);
619
glEnableClientState (GL_VERTEX_ARRAY);
1037
fDockOffsetX = X_BORDER_SPACE;
1038
fDockOffsetY = my_diapo_simple_arrowHeight+ARROW_TIP;
1039
///fFrameWidth = pDock->iMaxDockWidth - 2*X_BORDER_SPACE; // longueur du trait horizontal.
1040
///fFrameHeight = pDock->iMaxDockHeight- (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth); // hauteur du cadre avec les rayons et sans la pointe.
1042
//\_____________ On genere les coordonnees du contour.
1043
CairoDockGLPath *pFramePath = cd_generate_frame_path_without_arrow (fFrameWidth, fFrameHeight, fRadius);
1045
//\_____________ On remplit avec le fond.
1047
double fAlpha = (pDock->fFoldingFactor < .3 ? (.3 - pDock->fFoldingFactor) / .3 : 0.); // apparition du cadre de 0.3 a 0
1048
cairo_dock_set_container_orientation_opengl (CAIRO_CONTAINER (pDock));
1049
glTranslatef (fDockOffsetX + (fFrameWidth)/2,
1050
fDockOffsetY + fFrameHeight/2,
1052
_cairo_dock_set_blend_alpha ();
1054
if (my_diapo_simple_draw_background)
1056
// le cadre sans la pointe.
1057
GLfloat pBottomMiddleColor[4];
1058
const GLfloat *pColorTab = cd_generate_color_tab (fAlpha, pBottomMiddleColor);
620
1059
glEnableClientState (GL_COLOR_ARRAY);
622
//\____________________ On remplit le cadre sans la fleche.
623
pVertexTab = cd_rendering_generate_path_for_diapo_simple_opengl_without_arrow (pDock, fAlpha, &pColorTab, &iNbVertex);
625
//glVertexPointer (_CAIRO_DOCK_PATH_DIM, GL_FLOAT, 0, pVertexTab);
626
_cairo_dock_set_vertex_pointer (pVertexTab);
627
1060
glColorPointer (4, GL_FLOAT, 0, pColorTab);
628
glDrawArrays (GL_POLYGON, 0, iNbVertex);
1061
cairo_dock_fill_gl_path (pFramePath, 0);
630
1062
glDisableClientState (GL_COLOR_ARRAY);
632
//\____________________ On remplit la fleche.
634
pVertexTab = cd_rendering_generate_arrow_path_for_diapo_simple_opengl (pDock, fAlpha, color);
637
//glVertexPointer (_CAIRO_DOCK_PATH_DIM, GL_FLOAT, 0, pVertexTab);
638
_cairo_dock_set_vertex_pointer (pVertexTab);
639
glDrawArrays (GL_POLYGON, 0, 4);
641
glDisableClientState (GL_VERTEX_ARRAY);
643
//\____________________ On genere et trace le contour du cadre complet (avec la fleche).
644
if (my_diapo_simple_lineWidth != 0 && my_diapo_simple_color_border_line[3] != 0 && fAlpha != 0)
646
pVertexTab = cd_rendering_generate_path_for_diapo_simple_opengl (pDock, &iNbVertex);
648
//glVertexPointer (_CAIRO_DOCK_PATH_DIM, GL_FLOAT, 0, pVertexTab);
649
_cairo_dock_set_vertex_pointer (pVertexTab);
650
double frame_alpha = my_diapo_simple_color_border_line[3];
651
my_diapo_simple_color_border_line[3] *= fAlpha;
652
cairo_dock_draw_current_path_opengl (my_diapo_simple_lineWidth, my_diapo_simple_color_border_line, iNbVertex);
653
my_diapo_simple_color_border_line[3] = frame_alpha;
1065
CairoDockGLPath *pArrowPath = cd_generate_arrow_path (fFrameWidth, fFrameHeight);
1066
glColor4f (pBottomMiddleColor[0], pBottomMiddleColor[1], pBottomMiddleColor[2], pBottomMiddleColor[3] * fAlpha);
1067
cairo_dock_fill_gl_path (pArrowPath, 0);
1070
//\_____________ On trace le contour.
1071
if (my_diapo_simple_lineWidth != 0 && my_diapo_simple_color_border_line[3] != 0 && fAlpha != 0)
1073
cd_add_arrow_to_path (pFramePath, fFrameWidth);
1074
glLineWidth (my_diapo_simple_lineWidth);
1075
glColor4f (my_diapo_simple_color_border_line[0], my_diapo_simple_color_border_line[1], my_diapo_simple_color_border_line[2], my_diapo_simple_color_border_line[3] * fAlpha);
1076
cairo_dock_stroke_gl_path (pFramePath, TRUE);
1079
_cairo_dock_set_blend_over ();
1081
//\____________________ On dessine les barres de defilement.
1082
CDSlideData *pData = pDock->pRendererData;
1083
if (pData != NULL && pData->iDeltaHeight != 0)
1086
if (pScrollPath == NULL)
1087
pScrollPath = cairo_dock_new_gl_path (4, 0., 0., 0, 0); // des triangles ou des rectangles => 4 points max.
1090
double x_arrow = pDock->iMaxDockWidth - X_BORDER_SPACE - fScrollbarWidth/2; // pointe de la fleche.
1091
double y_arrow_top, y_arrow_bottom;
1092
if (pDock->container.bDirectionUp)
1094
y_arrow_bottom = my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth;
1095
y_arrow_top = pDock->iMaxDockHeight - my_diapo_simple_lineWidth;
1099
y_arrow_top = pDock->iMaxDockHeight - (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth);
1100
y_arrow_bottom = my_diapo_simple_lineWidth;
1102
if (pData->iScrollOffset != 0) // fleche vers le haut.
1104
cairo_dock_gl_path_move_to (pScrollPath, x_arrow, y_arrow_top);
1105
cairo_dock_gl_path_rel_line_to (pScrollPath, fScrollbarWidth/2, -fArrowHeight);
1106
cairo_dock_gl_path_rel_line_to (pScrollPath, -fScrollbarWidth, 0.);
1108
glColor4f (my_diapo_simple_color_scrollbar_inside[0], my_diapo_simple_color_scrollbar_inside[1], my_diapo_simple_color_scrollbar_inside[2], my_diapo_simple_color_scrollbar_inside[3] * fAlpha);
1109
cairo_dock_fill_gl_path (pScrollPath, 0);
1111
glColor4f (my_diapo_simple_color_scrollbar_line[0], my_diapo_simple_color_scrollbar_line[1], my_diapo_simple_color_scrollbar_line[2], my_diapo_simple_color_scrollbar_line[3] * fAlpha);
1112
cairo_dock_stroke_gl_path (pScrollPath, TRUE); // TRUE <=> close
1114
if (pData->iScrollOffset != pData->iDeltaHeight) // fleche vers le bas.
1116
cairo_dock_gl_path_move_to (pScrollPath, x_arrow, y_arrow_bottom);
1117
cairo_dock_gl_path_rel_line_to (pScrollPath, fScrollbarWidth/2, fArrowHeight);
1118
cairo_dock_gl_path_rel_line_to (pScrollPath, -fScrollbarWidth, 0.);
1120
glColor4f (my_diapo_simple_color_scrollbar_inside[0], my_diapo_simple_color_scrollbar_inside[1], my_diapo_simple_color_scrollbar_inside[2], my_diapo_simple_color_scrollbar_inside[3] * fAlpha);
1121
cairo_dock_fill_gl_path (pScrollPath, 0);
1123
glColor4f (my_diapo_simple_color_scrollbar_line[0], my_diapo_simple_color_scrollbar_line[1], my_diapo_simple_color_scrollbar_line[2], my_diapo_simple_color_scrollbar_line[3] * fAlpha);
1124
cairo_dock_stroke_gl_path (pScrollPath, TRUE); // TRUE <=> close
1127
// scrollbar outline
1128
cairo_dock_gl_path_move_to (pScrollPath, x_arrow - fScrollbarWidth/2, y_arrow_bottom + fArrowHeight + fScrollbarArrowGap);
1129
cairo_dock_gl_path_rel_line_to (pScrollPath, fScrollbarWidth, 0.);
1130
cairo_dock_gl_path_rel_line_to (pScrollPath, 0., y_arrow_top - y_arrow_bottom - 2*(fArrowHeight+fScrollbarArrowGap));
1131
cairo_dock_gl_path_rel_line_to (pScrollPath, -fScrollbarWidth, 0.);
1133
glColor4f (my_diapo_simple_color_scrollbar_inside[0], my_diapo_simple_color_scrollbar_inside[1], my_diapo_simple_color_scrollbar_inside[2], my_diapo_simple_color_scrollbar_inside[3] * fAlpha);
1134
cairo_dock_fill_gl_path (pScrollPath, 0);
1136
glColor4f (my_diapo_simple_color_scrollbar_line[0], my_diapo_simple_color_scrollbar_line[1], my_diapo_simple_color_scrollbar_line[2], my_diapo_simple_color_scrollbar_line[3] * fAlpha);
1137
cairo_dock_stroke_gl_path (pScrollPath, TRUE);
1140
double fGripHeight = fFrameHeight / (fFrameHeight + pData->iDeltaHeight) * (y_arrow_top - y_arrow_bottom - 2*(fArrowHeight+fScrollbarArrowGap));
1141
double ygrip = (double) pData->iScrollOffset / pData->iDeltaHeight * (y_arrow_top - y_arrow_bottom - 2*(fArrowHeight+fScrollbarArrowGap) - fGripHeight);
1142
glColor4f (my_diapo_simple_color_grip[0], my_diapo_simple_color_grip[1], my_diapo_simple_color_grip[2], my_diapo_simple_color_grip[3] * fAlpha);
1143
cairo_dock_gl_path_move_to (pScrollPath, x_arrow - fScrollbarWidth/2, y_arrow_top - (fArrowHeight+fScrollbarArrowGap) - ygrip);
1144
cairo_dock_gl_path_rel_line_to (pScrollPath, fScrollbarWidth, 0.);
1145
cairo_dock_gl_path_rel_line_to (pScrollPath, 0., - fGripHeight);
1146
cairo_dock_gl_path_rel_line_to (pScrollPath, -fScrollbarWidth, 0.);
1147
cairo_dock_fill_gl_path (pScrollPath, 0);
674
1165
// on dessine les icones, l'icone pointee en dernier.
1166
if (pData != NULL && pData->iDeltaHeight != 0) // on fait un clip pour les icones qui debordent.
1168
int h = my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth;
1169
if (pDock->container.bIsHorizontal)
1171
glEnable (GL_SCISSOR_TEST);
1173
(pDock->container.bDirectionUp ? h : 0), // lower left corner of the scissor box.
1174
pDock->container.iWidth,
1175
pDock->container.iHeight - h);
1176
} // sinon clip inutile.
676
1180
GList *ic = pFirstDrawnElement;
679
1183
icon = ic->data;
1184
if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (icon))
681
1187
cairo_dock_render_one_icon_opengl (icon, pDock, 1., FALSE);
683
if(icon->iLabelTexture != 0 && (my_diapo_simple_display_all_icons || icon->bPointed))
1189
if (icon->iLabelTexture != 0 && (my_diapo_simple_display_all_labels || icon->bPointed))
685
1191
glPushMatrix ();
686
cairo_dock_translate_on_icon_opengl (icon, CAIRO_CONTAINER (pDock), 1.);
688
1193
double fAlpha = (pDock->fFoldingFactor > .5 ? (1 - pDock->fFoldingFactor) / .5 : 1.); // apparition du texte de 1 a 0.5
1195
double dx = .5 * (icon->iTextWidth & 1); // on decale la texture pour la coller sur la grille des coordonnees entieres.
1196
double dy = .5 * (icon->iTextHeight & 1);
1197
double u0 = 0., u1 = 1.;
689
1198
double fOffsetX = 0.;
690
if (icon->fDrawX + icon->fWidth * icon->fScale/2 - icon->iTextWidth/2 < 0)
691
fOffsetX = icon->iTextWidth/2 - (icon->fDrawX + icon->fWidth * icon->fScale/2);
692
else if (icon->fDrawX + icon->fWidth * icon->fScale/2 + icon->iTextWidth/2 > pDock->container.iWidth)
693
fOffsetX = pDock->container.iWidth - (icon->fDrawX + icon->fWidth * icon->fScale/2 + icon->iTextWidth/2);
695
glTranslatef (floor (fOffsetX) + .5 * (icon->iTextWidth & 1),
696
floor ((pDock->container.bDirectionUp ? 1:-1) * (icon->fHeight * icon->fScale/2 + myLabels.iLabelSize - icon->iTextHeight / 2)) + .5 * (icon->iTextWidth & 1),
699
if (icon->iTextWidth > icon->fWidth * icon->fScale + my_diapo_simple_iconGapX && ! icon->bPointed)
1199
if (pDock->container.bIsHorizontal)
701
_cairo_dock_enable_texture ();
702
_cairo_dock_set_blend_alpha ();
703
_cairo_dock_set_alpha (fAlpha * icon->fScale / my_diapo_simple_fScaleMax);
704
glBindTexture (GL_TEXTURE_2D, icon->iLabelTexture);
706
double w = icon->fWidth * icon->fScale + my_diapo_simple_iconGapX;
707
double h = icon->iTextHeight;
708
_cairo_dock_apply_current_texture_portion_at_size_with_offset (0., 0., w/icon->iTextWidth, 1.,
711
_cairo_dock_disable_texture ();
1203
_cairo_dock_set_alpha (fAlpha);
1204
if (icon->fDrawX + icon->fWidth/2 + icon->iTextWidth/2 > pDock->container.iWidth)
1205
fOffsetX = pDock->container.iWidth - (icon->fDrawX + icon->fWidth/2 + icon->iTextWidth/2);
1206
if (icon->fDrawX + icon->fWidth/2 - icon->iTextWidth/2 < 0)
1207
fOffsetX = icon->iTextWidth/2 - (icon->fDrawX + icon->fWidth/2);
1211
_cairo_dock_set_alpha (fAlpha * icon->fScale / my_diapo_simple_fScaleMax);
1212
if (icon->iTextWidth > icon->fWidth + 2 * myLabels.iLabelSize)
1215
u1 = (double) (icon->fWidth + 2 * myLabels.iLabelSize) / icon->iTextWidth;
1219
glTranslatef (ceil (icon->fDrawX + icon->fScale * icon->fWidth/2 + fOffsetX) + dx,
1220
ceil (pDock->container.iHeight - icon->fDrawY + icon->iTextHeight / 2) + dy,
715
cairo_dock_draw_texture_with_alpha (icon->iLabelTexture,
718
fAlpha * icon->fScale / my_diapo_simple_fScaleMax);
1227
_cairo_dock_set_alpha (fAlpha);
1228
if (icon->fDrawY + icon->fHeight/2 + icon->iTextWidth/2 > pDock->container.iHeight)
1229
fOffsetX = pDock->container.iHeight - (icon->fDrawY + icon->fHeight/2 + icon->iTextWidth/2);
1230
if (icon->fDrawY + icon->fHeight/2 - icon->iTextWidth/2 < 0)
1231
fOffsetX = icon->iTextWidth/2 - (icon->fDrawY + icon->fHeight/2);
1235
_cairo_dock_set_alpha (fAlpha * icon->fScale / my_diapo_simple_fScaleMax);
1236
if (icon->iTextWidth > icon->fWidth + 2 * myLabels.iLabelSize)
1239
u1 = (double) (icon->fWidth + 2 * myLabels.iLabelSize) / icon->iTextWidth;
1243
glTranslatef (ceil (icon->fDrawY + icon->fScale * icon->fHeight/2 + fOffsetX / 2) + dx,
1244
ceil (pDock->container.iWidth - icon->fDrawX + icon->iTextHeight / 2) + dy,
1247
_cairo_dock_enable_texture ();
1248
_cairo_dock_set_blend_alpha ();
1249
glBindTexture (GL_TEXTURE_2D, icon->iLabelTexture);
1250
_cairo_dock_apply_current_texture_portion_at_size_with_offset (u0, 0.,
1252
icon->iTextWidth * (u1 - u0), icon->iTextHeight,
1254
_cairo_dock_disable_texture ();
1255
_cairo_dock_set_alpha (1.);
723
1260
ic = cairo_dock_get_next_element (ic, pDock->icons);
725
1262
while (ic != pFirstDrawnElement);
729
static const double a = 2.5; // definit combien la fleche est penchee.
731
#define RADIAN (G_PI / 180.0) // Conversion Radian/Degres
732
#define DELTA_ROUND_DEGREE 5
733
#define TIP_OFFSET_FACTOR 2.
734
#define _recopy_prev_color(pColorTab, i) memcpy (&pColorTab[4*i], &pColorTab[4*(i-1)], 4*sizeof (GLfloat));
735
#define _copy_color(pColorTab, i, fAlpha, c) do { \
736
pColorTab[4*i] = c[0];\
737
pColorTab[4*i+1] = c[1];\
738
pColorTab[4*i+2] = c[2];\
739
pColorTab[4*i+3] = c[3] * fAlpha; } while (0)
740
/*#define _copy_mean_color(pColorTab, i, fAlpha, c1, c2, f) do { \
741
pColorTab[4*i] = c1[0]*f + c2[0]*(1-f);\
742
pColorTab[4*i+1] = c1[1]*f + c2[1]*(1-f);\
743
pColorTab[4*i+2] = c1[2]*f + c2[2]*(1-f);\
744
pColorTab[4*i+3] = (c1[3]*f + c2[3]*(1-f)) * fAlpha; } while (0)*/
745
GLfloat *cd_rendering_generate_path_for_diapo_simple_opengl (CairoDock *pDock, int *iNbPoints)
747
//static GLfloat pVertexTab[((90/DELTA_ROUND_DEGREE+1)*4+1+3)*3]; // +3 pour la pointe.
748
_cairo_dock_define_static_vertex_tab ((90/DELTA_ROUND_DEGREE+1)*4+1+3); // +3 pour la pointe.
749
double fRadius = my_diapo_simple_radius;
750
double fFrameWidth = pDock->iMaxDockWidth - 2*X_BORDER_SPACE - 2*fRadius; // longueur du trait horizontal.
751
double fFrameHeight = pDock->iMaxDockHeight- (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth); // hauteur du cadre avec les rayons et sans la pointe.
753
const gdouble arrow_dec = 2;
754
double fTotalWidth = fFrameWidth + 2 * fRadius;
755
double w = fFrameWidth / fTotalWidth / 2;
756
double h = MAX (0, fFrameHeight - 2 * fRadius) / fFrameHeight / 2;
757
double rw = fRadius / fTotalWidth;
758
double rh = fRadius / fFrameHeight;
760
int iPrecision = DELTA_ROUND_DEGREE;
761
double x,y; // 1ere coordonnee de la pointe.
763
for (t = 0;t <= 90;t += iPrecision, i++) // cote haut droit.
765
_cairo_dock_set_vertex_xy (i,
766
w + rw * cos (t*RADIAN),
767
h + rh * sin (t*RADIAN));
769
if (!pDock->container.bDirectionUp && pDock->container.bIsHorizontal) // dessin de la pointe vers le haut.
771
x = 0. + my_diapo_simple_arrowShift * (fFrameWidth/2 - my_diapo_simple_arrowWidth/2)/fTotalWidth + my_diapo_simple_arrowWidth/2/fTotalWidth;
773
_cairo_dock_set_vertex_xy (i,
777
_cairo_dock_set_vertex_xy (i,
778
x - my_diapo_simple_arrowWidth/2 * (1 + a * my_diapo_simple_arrowShift)/fTotalWidth,
779
y + my_diapo_simple_arrowHeight/fFrameHeight);
781
_cairo_dock_set_vertex_xy (i,
782
x - my_diapo_simple_arrowWidth/fTotalWidth,
786
for (t = 90;t <= 180;t += iPrecision, i++) // haut gauche.
788
_cairo_dock_set_vertex_xy (i,
789
-w + rw * cos (t*RADIAN),
790
h + rh * sin (t*RADIAN));
792
if (!pDock->container.bDirectionUp && !pDock->container.bIsHorizontal) // dessin de la pointe vers la gauche.
795
y = 0. + my_diapo_simple_arrowShift * (fFrameHeight/2 - fRadius - my_diapo_simple_arrowWidth/2)/fFrameHeight + my_diapo_simple_arrowWidth/2/fFrameHeight;
796
_cairo_dock_set_vertex_xy (i,
800
_cairo_dock_set_vertex_xy (i,
801
x - my_diapo_simple_arrowHeight/fFrameHeight,
802
y - my_diapo_simple_arrowWidth/2 * (1 + a * my_diapo_simple_arrowShift)/fFrameHeight);
804
_cairo_dock_set_vertex_xy (i,
806
y - my_diapo_simple_arrowWidth/fFrameHeight);
809
for (t = 180;t <= 270;t += iPrecision, i++) // bas gauche.
811
_cairo_dock_set_vertex_xy (i,
812
-w + rw * cos (t*RADIAN),
813
-h + rh * sin (t*RADIAN));
815
if (pDock->container.bDirectionUp && pDock->container.bIsHorizontal) // dessin de la pointe vers le bas.
817
x = 0. + my_diapo_simple_arrowShift * (fFrameWidth/2 - my_diapo_simple_arrowWidth/2)/fTotalWidth - my_diapo_simple_arrowWidth/2/fTotalWidth;
819
_cairo_dock_set_vertex_xy (i,
823
_cairo_dock_set_vertex_xy (i,
824
x + my_diapo_simple_arrowWidth/2 * (1 - a * my_diapo_simple_arrowShift)/fTotalWidth,
825
y - my_diapo_simple_arrowHeight/fFrameHeight);
827
_cairo_dock_set_vertex_xy (i,
828
x + my_diapo_simple_arrowWidth/fTotalWidth,
832
for (t = 270;t <= 360;t += iPrecision, i++) // bas droit.
834
_cairo_dock_set_vertex_xy (i,
835
w + rw * cos (t*RADIAN),
836
-h + rh * sin (t*RADIAN));
838
if (pDock->container.bDirectionUp && !pDock->container.bIsHorizontal) // dessin de la pointe vers la droite.
841
y = 0. + my_diapo_simple_arrowShift * (fFrameHeight/2 - fRadius - my_diapo_simple_arrowWidth/2)/fFrameHeight - my_diapo_simple_arrowWidth/2/fFrameHeight;
842
_cairo_dock_set_vertex_xy (i,
846
_cairo_dock_set_vertex_xy (i,
847
x + my_diapo_simple_arrowHeight/fFrameHeight,
848
y + my_diapo_simple_arrowWidth/2 * (1 - a * my_diapo_simple_arrowShift)/fFrameHeight);
850
_cairo_dock_set_vertex_xy (i,
852
y + my_diapo_simple_arrowWidth/fFrameHeight);
855
_cairo_dock_close_path(i);
858
_cairo_dock_return_vertex_tab ();
861
GLfloat *cd_rendering_generate_path_for_diapo_simple_opengl_without_arrow (CairoDock *pDock, double fAlpha, GLfloat **colors, int *iNbPoints)
863
//static GLfloat pVertexTab[((90/DELTA_ROUND_DEGREE+1)*4+1+3)*3]; // +3 pour la pointe.
864
_cairo_dock_define_static_vertex_tab ((90/DELTA_ROUND_DEGREE+1)*4+1+3); // +3 pour la pointe.
865
static GLfloat pColorTab[((90/DELTA_ROUND_DEGREE+1)*4+1+3)*4]; // +3 pour la pointe.
866
double fRadius = my_diapo_simple_radius;
867
double fFrameWidth = pDock->iMaxDockWidth - 2*X_BORDER_SPACE - 2*fRadius; // longueur du trait horizontal.
868
double fFrameHeight = pDock->iMaxDockHeight- (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth); // hauteur du cadre avec les rayons et sans la pointe.
870
const gdouble arrow_dec = 2;
871
double fTotalWidth = fFrameWidth + 2 * fRadius;
872
double w = fFrameWidth / fTotalWidth / 2;
873
double h = MAX (0, fFrameHeight - 2 * fRadius) / fFrameHeight / 2;
874
double rw = fRadius / fTotalWidth;
875
double rh = fRadius / fFrameHeight;
877
int iPrecision = DELTA_ROUND_DEGREE;
879
double *pTopRightColor, *pTopLeftColor, *pBottomLeftColor, *pBottomRightColor;
880
double pMeanColor[4] = {(my_diapo_simple_color_frame_start[0] + my_diapo_simple_color_frame_stop[0])/2,
881
(my_diapo_simple_color_frame_start[1] + my_diapo_simple_color_frame_stop[1])/2,
882
(my_diapo_simple_color_frame_start[2] + my_diapo_simple_color_frame_stop[2])/2,
883
(my_diapo_simple_color_frame_start[3] + my_diapo_simple_color_frame_stop[3])/2};
884
pTopLeftColor = my_diapo_simple_color_frame_start;
885
if (my_diapo_simple_fade2bottom || my_diapo_simple_fade2right)
887
pBottomRightColor = my_diapo_simple_color_frame_stop;
888
if (my_diapo_simple_fade2bottom && my_diapo_simple_fade2right)
890
pBottomLeftColor = pMeanColor;
891
pTopRightColor = pMeanColor;
893
else if (my_diapo_simple_fade2bottom)
895
pBottomLeftColor = my_diapo_simple_color_frame_stop;
896
pTopRightColor = my_diapo_simple_color_frame_start;
900
pBottomLeftColor = my_diapo_simple_color_frame_start;
901
pTopRightColor = my_diapo_simple_color_frame_stop;
906
pBottomRightColor = my_diapo_simple_color_frame_start;
907
pBottomLeftColor = my_diapo_simple_color_frame_start;
908
pTopRightColor = my_diapo_simple_color_frame_start;
911
for (t = 0;t <= 90;t += iPrecision, i++) // cote haut droit.
913
_cairo_dock_set_vertex_xy (i,
914
w + rw * cos (t*RADIAN),
915
h + rh * sin (t*RADIAN));
916
//pVertexTab[3*i] = w + rw * cos (t*RADIAN);
917
//pVertexTab[3*i+1] = h + rh * sin (t*RADIAN);
918
_copy_color (pColorTab, i, fAlpha, pTopRightColor);
920
for (t = 90;t <= 180;t += iPrecision, i++) // haut gauche.
922
_cairo_dock_set_vertex_xy (i,
923
-w + rw * cos (t*RADIAN),
924
h + rh * sin (t*RADIAN));
925
//pVertexTab[3*i] = -w + rw * cos (t*RADIAN);
926
//pVertexTab[3*i+1] = h + rh * sin (t*RADIAN);
927
_copy_color (pColorTab, i, fAlpha, pTopLeftColor);
929
for (t = 180;t <= 270;t += iPrecision, i++) // bas gauche.
931
_cairo_dock_set_vertex_xy (i,
932
-w + rw * cos (t*RADIAN),
933
-h + rh * sin (t*RADIAN));
934
//pVertexTab[3*i] = -w + rw * cos (t*RADIAN);
935
//pVertexTab[3*i+1] = -h + rh * sin (t*RADIAN);
936
_copy_color (pColorTab, i, fAlpha, pBottomLeftColor);
938
for (t = 270;t <= 360;t += iPrecision, i++) // bas droit.
940
_cairo_dock_set_vertex_xy (i,
941
w + rw * cos (t*RADIAN),
942
-h + rh * sin (t*RADIAN));
943
//pVertexTab[3*i] = w + rw * cos (t*RADIAN);
944
//pVertexTab[3*i+1] = -h + rh * sin (t*RADIAN);
945
_copy_color (pColorTab, i, fAlpha, pBottomRightColor);
947
_cairo_dock_close_path(i);
948
//pVertexTab[3*i] = w + rw; // on boucle.
949
//pVertexTab[3*i+1] = h;
950
memcpy (&pColorTab[4*i], &pColorTab[0], 4*sizeof (GLfloat));
954
_cairo_dock_return_vertex_tab ();
957
#define _set_arrow_color(c1, c2, f, fAlpha, colors) do {\
958
colors[0] = c1[0] * (f) + c2[0] * (1 - (f));\
959
colors[1] = c1[1] * (f) + c2[1] * (1 - (f));\
960
colors[2] = c1[2] * (f) + c2[2] * (1 - (f));\
961
colors[3] = (c1[3] * (f) + c2[3] * (1 - (f))) * fAlpha; } while (0)
962
GLfloat *cd_rendering_generate_arrow_path_for_diapo_simple_opengl (CairoDock *pDock, double fAlpha, GLfloat *color)
964
//static GLfloat pVertexTab[((90/DELTA_ROUND_DEGREE+1)*4+1+3)*3]; // +3 pour la pointe.
965
_cairo_dock_define_static_vertex_tab ((90/DELTA_ROUND_DEGREE+1)*4+1+3); // +3 pour la pointe.
966
double fRadius = my_diapo_simple_radius;
967
double fFrameWidth = pDock->iMaxDockWidth - 2*X_BORDER_SPACE - 2*fRadius; // longueur du trait horizontal.
968
double fFrameHeight = pDock->iMaxDockHeight- (my_diapo_simple_arrowHeight + ARROW_TIP + my_diapo_simple_lineWidth); // hauteur du cadre avec les rayons et sans la pointe.
970
const gdouble arrow_dec = 2;
971
double fTotalWidth = fFrameWidth + 2 * fRadius;
972
double w = fFrameWidth / fTotalWidth / 2;
973
double h = MAX (0, fFrameHeight - 2 * fRadius) / fFrameHeight / 2;
974
double rw = fRadius / fTotalWidth;
975
double rh = fRadius / fFrameHeight;
977
int iPrecision = DELTA_ROUND_DEGREE;
979
double *pTopRightColor, *pTopLeftColor, *pBottomLeftColor, *pBottomRightColor;
980
double pMeanColor[4] = {(my_diapo_simple_color_frame_start[0] + my_diapo_simple_color_frame_stop[0])/2,
981
(my_diapo_simple_color_frame_start[1] + my_diapo_simple_color_frame_stop[1])/2,
982
(my_diapo_simple_color_frame_start[2] + my_diapo_simple_color_frame_stop[2])/2,
983
(my_diapo_simple_color_frame_start[3] + my_diapo_simple_color_frame_stop[3])/2};
984
pTopLeftColor = my_diapo_simple_color_frame_start;
985
if (my_diapo_simple_fade2bottom || my_diapo_simple_fade2right)
987
pBottomRightColor = my_diapo_simple_color_frame_stop;
988
if (my_diapo_simple_fade2bottom && my_diapo_simple_fade2right)
990
pBottomLeftColor = pMeanColor;
991
pTopRightColor = pMeanColor;
993
else if (my_diapo_simple_fade2bottom)
995
pBottomLeftColor = my_diapo_simple_color_frame_stop;
996
pTopRightColor = my_diapo_simple_color_frame_start;
1000
pBottomLeftColor = my_diapo_simple_color_frame_start;
1001
pTopRightColor = my_diapo_simple_color_frame_stop;
1006
pBottomRightColor = my_diapo_simple_color_frame_start;
1007
pBottomLeftColor = my_diapo_simple_color_frame_start;
1008
pTopRightColor = my_diapo_simple_color_frame_start;
1011
double x,y; // 1ere coordonnee de la pointe.
1012
if (!pDock->container.bDirectionUp && pDock->container.bIsHorizontal) // dessin de la pointe vers le haut.
1014
x = 0. + my_diapo_simple_arrowShift * (fFrameWidth/2 - my_diapo_simple_arrowWidth/2)/fTotalWidth + my_diapo_simple_arrowWidth/2/fTotalWidth;
1016
_cairo_dock_set_vertex_xy (i,
1020
_cairo_dock_set_vertex_xy (i,
1021
x - my_diapo_simple_arrowWidth/2 * (1 + a * my_diapo_simple_arrowShift)/fTotalWidth,
1022
y + my_diapo_simple_arrowHeight/fFrameHeight);
1024
_cairo_dock_set_vertex_xy (i,
1025
x - my_diapo_simple_arrowWidth/fTotalWidth,
1028
_set_arrow_color (pTopRightColor, pTopLeftColor, .5+my_diapo_simple_arrowShift/2, fAlpha, color);
1030
else if (!pDock->container.bDirectionUp && !pDock->container.bIsHorizontal) // dessin de la pointe vers la gauche.
1033
y = 0. + my_diapo_simple_arrowShift * (fFrameHeight/2 - fRadius - my_diapo_simple_arrowWidth/2)/fFrameHeight + my_diapo_simple_arrowWidth/2/fFrameHeight;
1034
_cairo_dock_set_vertex_xy (i,
1038
_cairo_dock_set_vertex_xy (i,
1039
x - my_diapo_simple_arrowHeight/fFrameHeight,
1040
y - my_diapo_simple_arrowWidth/2 * (1 + a * my_diapo_simple_arrowShift)/fFrameHeight);
1042
_cairo_dock_set_vertex_xy (i,
1044
y - my_diapo_simple_arrowWidth/fFrameHeight);
1046
_set_arrow_color (pTopLeftColor, pBottomLeftColor, .5+my_diapo_simple_arrowShift/2, fAlpha, color);
1048
else if (pDock->container.bDirectionUp && pDock->container.bIsHorizontal) // dessin de la pointe vers le bas.
1050
x = 0. + my_diapo_simple_arrowShift * (fFrameWidth/2 - my_diapo_simple_arrowWidth/2)/fTotalWidth - my_diapo_simple_arrowWidth/2/fTotalWidth;
1052
_cairo_dock_set_vertex_xy (i,
1056
_cairo_dock_set_vertex_xy (i,
1057
x + my_diapo_simple_arrowWidth/2 * (1 - a * my_diapo_simple_arrowShift)/fTotalWidth,
1058
y - my_diapo_simple_arrowHeight/fFrameHeight);
1060
_cairo_dock_set_vertex_xy (i,
1061
x + my_diapo_simple_arrowWidth/fTotalWidth,
1064
_set_arrow_color (pBottomRightColor, pBottomLeftColor, .5+my_diapo_simple_arrowShift/2, fAlpha, color);
1066
else if (pDock->container.bDirectionUp && !pDock->container.bIsHorizontal) // dessin de la pointe vers la droite.
1069
y = 0. + my_diapo_simple_arrowShift * (fFrameHeight/2 - fRadius - my_diapo_simple_arrowWidth/2)/fFrameHeight - my_diapo_simple_arrowWidth/2/fFrameHeight;
1070
_cairo_dock_set_vertex_xy (i,
1074
_cairo_dock_set_vertex_xy (i,
1075
x + my_diapo_simple_arrowHeight/fFrameHeight,
1076
y + my_diapo_simple_arrowWidth/2 * (1 - a * my_diapo_simple_arrowShift)/fFrameHeight);
1078
_cairo_dock_set_vertex_xy (i,
1080
y + my_diapo_simple_arrowWidth/fFrameHeight);
1082
_set_arrow_color (pTopRightColor, pBottomRightColor, .5+my_diapo_simple_arrowShift/2, fAlpha, color);
1084
_cairo_dock_close_path (i); // on boucle.
1085
_cairo_dock_return_vertex_tab ();
1263
glDisable (GL_SCISSOR_TEST);
1267
void cd_rendering_free_slide_data (CairoDock *pDock)
1269
CDSlideData *pData = pDock->pRendererData;
1272
cairo_dock_remove_notification_func_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_SCROLL_ICON, (CairoDockNotificationFunc) _cd_slide_on_scroll, NULL);
1273
cairo_dock_remove_notification_func_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_CLICK_ICON, (CairoDockNotificationFunc) _cd_slide_on_click, NULL);
1274
cairo_dock_remove_notification_func_on_container (CAIRO_CONTAINER (pDock), CAIRO_DOCK_MOUSE_MOVED, (CairoDockNotificationFunc) _cd_slide_on_mouse_moved, NULL);
1275
g_signal_handler_disconnect (pDock->container.pWidget, pData->iSidPressEvent);
1276
g_signal_handler_disconnect (pDock->container.pWidget, pData->iSidReleaseEvent);
1279
pDock->pRendererData = NULL;
1283
void cd_rendering_register_diapo_simple_renderer (const gchar *cRendererName)
1285
//////////////////////////////////////////////////////////////////////////////////////// On definit le renderer :
1286
CairoDockRenderer *pRenderer = g_new0 (CairoDockRenderer, 1); //Nouvelle structure
1287
pRenderer->cReadmeFilePath = g_strdup_printf ("%s/readme-diapo-simple-view", MY_APPLET_SHARE_DATA_DIR); //On affecte le readme
1288
pRenderer->cPreviewFilePath = g_strdup_printf ("%s/preview-diapo-simple.jpg", MY_APPLET_SHARE_DATA_DIR); // la preview
1289
pRenderer->compute_size = cd_rendering_calculate_max_dock_size_diapo_simple; //La fonction qui défini les bornes
1290
pRenderer->calculate_icons = cd_rendering_calculate_icons_diapo_simple; //qui calcule les param des icones
1291
pRenderer->render = cd_rendering_render_diapo_simple; //qui initie le calcul du rendu
1292
pRenderer->render_optimized = NULL;//cd_rendering_render_diapo_simple_optimized; //pareil en mieux
1293
pRenderer->set_subdock_position = cairo_dock_set_subdock_position_linear; // ?
1294
pRenderer->render_opengl = cd_rendering_render_diapo_simple_opengl;
1296
pRenderer->free_data = cd_rendering_free_slide_data;
1299
pRenderer->bUseReflect = FALSE; // On dit non au reflections
1300
pRenderer->cDisplayedName = D_ (cRendererName);
1302
cairo_dock_register_renderer (cRendererName, pRenderer); //Puis on signale l'existence de notre rendu