static void cd_render (cairo_t *pCairoContext, CairoDock *pDock) { //\____________________ On trace le cadre. double fLineWidth = myDocksParam.iDockLineWidth; double fMargin = myDocksParam.iFrameMargin; double fRadius = (pDock->iDecorationsHeight + fLineWidth - 2 * myDocksParam.iDockRadius > 0 ? myDocksParam.iDockRadius : (pDock->iDecorationsHeight + fLineWidth) / 2 - 1); double fExtraWidth = 2 * fRadius + fLineWidth; double fDockWidth; int sens; double fDockOffsetX, fDockOffsetY; // Offset du coin haut gauche du cadre. if (cairo_dock_is_extended_dock (pDock)) // mode panel etendu. { fDockWidth = pDock->container.iWidth - fExtraWidth; fDockOffsetX = fExtraWidth / 2; } else { fDockWidth = cairo_dock_get_current_dock_width_linear (pDock); Icon *pFirstIcon = cairo_dock_get_first_icon (pDock->icons); fDockOffsetX = (pFirstIcon != NULL ? pFirstIcon->fX - fMargin : fExtraWidth / 2); if (fDockOffsetX < fExtraWidth / 2) fDockOffsetX = fExtraWidth / 2; if (fDockOffsetX + fDockWidth + fExtraWidth / 2 > pDock->container.iWidth) fDockWidth = pDock->container.iWidth - fDockOffsetX - fExtraWidth / 2; } if (pDock->container.bDirectionUp) { sens = 1; fDockOffsetY = pDock->container.iHeight - pDock->iDecorationsHeight - 1.5 * fLineWidth; } else { sens = -1; fDockOffsetY = pDock->iDecorationsHeight + 1.5 * fLineWidth; } cairo_save (pCairoContext); double fDeltaXTrapeze = cairo_dock_draw_frame (pCairoContext, fRadius, fLineWidth, fDockWidth, pDock->iDecorationsHeight, fDockOffsetX, fDockOffsetY, sens, 0., pDock->container.bIsHorizontal, FALSE); // FALSE <=> ignore 'myDocksParam.bRoundedBottomCorner', as bottom rounded corners looks bad for a panel. //\____________________ On dessine les decorations dedans. fDockOffsetY = (pDock->container.bDirectionUp ? pDock->container.iHeight - pDock->iDecorationsHeight - fLineWidth : fLineWidth); cairo_dock_render_decorations_in_frame (pCairoContext, pDock, fDockOffsetY, fDockOffsetX - fDeltaXTrapeze, fDockWidth + 2*fDeltaXTrapeze); //\____________________ On dessine le cadre. if (fLineWidth > 0) { cairo_set_line_width (pCairoContext, fLineWidth); if (myDocksParam.bUseDefaultColors) gldi_style_colors_set_line_color (pCairoContext); else gldi_color_set_cairo (pCairoContext, &myDocksParam.fLineColor); cairo_stroke (pCairoContext); } else cairo_new_path (pCairoContext); cairo_restore (pCairoContext); //\____________________ On dessine les separateurs physiques. GList *ic; Icon *pIcon; if (my_bPanelPhysicalSeparator) { cairo_save (pCairoContext); if (pDock->container.bIsHorizontal) { if (! pDock->container.bDirectionUp) { cairo_translate (pCairoContext, 0., pDock->container.iHeight); cairo_scale (pCairoContext, 1., -1.); } } else { cairo_translate (pCairoContext, pDock->container.iHeight/2., pDock->container.iWidth/2.); cairo_rotate (pCairoContext, G_PI/2); if (pDock->container.bDirectionUp) cairo_scale (pCairoContext, 1., -1.); cairo_translate (pCairoContext, -pDock->container.iWidth/2., -pDock->container.iHeight/2.); } double x1, x2, dx, delta, h = pDock->iDecorationsHeight + 2*fLineWidth, h_ = h - fLineWidth; for (ic = pDock->icons; ic != NULL; ic = ic->next) { pIcon = ic->data; if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon)) { x1 = pIcon->fDrawX = pIcon->fX; pIcon = NULL; for (ic = ic->next; ic != NULL; ic = ic->next) { pIcon = ic->data; if (!CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon)) break; } if (ic != NULL) { pIcon = ic->data; x2 = pIcon->fDrawX; } else break; dx = MIN (my_fPanelRadius, (x2 - x1) / 2); delta = dx + h*tan(my_fPanelInclination)/2; if (delta > (x2 - x1) / 2) delta = (x2 - x1) / 2; cairo_move_to (pCairoContext, x1, pDock->iMaxDockHeight - h); cairo_rel_curve_to (pCairoContext, dx, 0., delta - dx, h, delta, h); cairo_rel_line_to (pCairoContext, x2 - x1 - 2*delta, 0.); cairo_rel_curve_to (pCairoContext, dx, 0., delta - dx, -h, delta, -h); cairo_close_path (pCairoContext); cairo_set_operator (pCairoContext, CAIRO_OPERATOR_DEST_OUT); cairo_set_source_rgba (pCairoContext, 0.0, 0.0, 0.0, 1.0); cairo_fill (pCairoContext); if (fLineWidth > 0) { cairo_move_to (pCairoContext, x1, pDock->iMaxDockHeight - h_ - fLineWidth/2); cairo_rel_curve_to (pCairoContext, dx, 0., delta - dx, h_, delta, h_); cairo_rel_line_to (pCairoContext, x2 - x1 - 2*delta, 0.); cairo_rel_curve_to (pCairoContext, dx, 0., delta - dx, -h_, delta, -h_); cairo_set_operator (pCairoContext, CAIRO_OPERATOR_OVER); cairo_set_line_width (pCairoContext, fLineWidth); if (myDocksParam.bUseDefaultColors) gldi_style_colors_set_line_color (pCairoContext); else gldi_color_set_cairo (pCairoContext, &myDocksParam.fLineColor); cairo_stroke (pCairoContext); } } } cairo_restore (pCairoContext); } //\____________________ On dessine la ficelle qui les joint. if (myIconsParam.iStringLineWidth > 0) cairo_dock_draw_string (pCairoContext, pDock, myIconsParam.iStringLineWidth, FALSE, FALSE); //\____________________ On dessine les icones et les etiquettes, en tenant compte de l'ordre pour dessiner celles en arriere-plan avant celles en avant-plan. GList *pFirstDrawnElement = cairo_dock_get_first_drawn_element_linear (pDock->icons); if (pFirstDrawnElement == NULL) return; double fDockMagnitude = cairo_dock_calculate_magnitude (pDock->iMagnitudeIndex); // * pDock->fMagnitudeMax ic = pFirstDrawnElement; do { pIcon = ic->data; if (! CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon)) { cairo_save (pCairoContext); cairo_dock_render_one_icon (pIcon, pDock, pCairoContext, fDockMagnitude, pIcon->bPointed); cairo_restore (pCairoContext); } ic = cairo_dock_get_next_element (ic, pDock->icons); } while (ic != pFirstDrawnElement); }
void cd_rendering_render_3D_plane (cairo_t *pCairoContext, CairoDock *pDock) { _define_parameters (hi, h0, H, l, r, gamma, h, w, dw); h = pDock->iDecorationsHeight; if (h < 2 * r) r = h / 2; double dx, dy; if (cairo_dock_is_extended_dock (pDock)) // mode panel etendu. { double Ws = pDock->iCurrentWidth; gamma = Ws / 2 / H; double W = Ws - 2 * (r + (l+(r==0)*2)*sqrt(1+gamma*gamma)); double a = H + hi; double b = H + hi + h0 - W / 2; double c = - W / 2; gamma = (-b + sqrt (b * b - 4 * a * c)) / 2 / a; h = hi + h0 / (1 + gamma); //g_print ("h : %.2f (=) %d\n", h, pDock->iDecorationsHeight); w = 2 * H * gamma; dw = (Ws - w) / 2; //g_print ("dw : %.2f (=) %.2f\n", dw, h * gamma + r + (l+(r==0)*2)*sqrt(1+gamma*gamma)); dx = dw; } else { w = cairo_dock_get_current_dock_width_linear (pDock); gamma = w / 2 / H; dw = h * gamma + r + (l+(r==0)*2)*sqrt(1+gamma*gamma); h = pDock->iDecorationsHeight; Icon *pFirstIcon = cairo_dock_get_first_drawn_icon (pDock); dx = (pFirstIcon != NULL ? pFirstIcon->fX - 0*myBackground.iFrameMargin : r); } //\____________________ On trace le cadre. int sens; if (pDock->bDirectionUp) { sens = 1; dy = pDock->iCurrentHeight - pDock->iDecorationsHeight - 1.5 * l; } else { sens = -1; dy = pDock->iDecorationsHeight + 1.5 * l; } cairo_save (pCairoContext); double fDeltaXTrapeze = cairo_dock_draw_frame (pCairoContext, r, l, w, pDock->iDecorationsHeight, dx, dy, sens, gamma, pDock->bHorizontalDock); //\____________________ On dessine les decorations dedans. dy = (pDock->bDirectionUp ? pDock->iCurrentHeight - pDock->iDecorationsHeight - l : l); cairo_dock_render_decorations_in_frame (pCairoContext, pDock, dy, dx-fDeltaXTrapeze, w+2*fDeltaXTrapeze); //\____________________ On dessine le cadre. if (l > 0) { cairo_set_line_width (pCairoContext, l); cairo_set_source_rgba (pCairoContext, myBackground.fLineColor[0], myBackground.fLineColor[1], myBackground.fLineColor[2], myBackground.fLineColor[3]); cairo_stroke (pCairoContext); } else cairo_new_path (pCairoContext); /// donner un effet d'epaisseur => chaud du slip avec les separateurs physiques ! cairo_restore (pCairoContext); //\____________________ On dessine la ficelle qui les joint. if (myIcons.iStringLineWidth > 0) cairo_dock_draw_string (pCairoContext, pDock, myIcons.iStringLineWidth, FALSE, (my_iDrawSeparator3D == CD_FLAT_SEPARATOR || my_iDrawSeparator3D == CD_PHYSICAL_SEPARATOR)); //\____________________ On dessine les icones et les etiquettes, en tenant compte de l'ordre pour dessiner celles en arriere-plan avant celles en avant-plan. GList *pFirstDrawnElement = cairo_dock_get_first_drawn_element_linear (pDock->icons); if (pFirstDrawnElement == NULL) return; double fDockMagnitude = cairo_dock_calculate_magnitude (pDock->iMagnitudeIndex); Icon *icon; GList *ic = pFirstDrawnElement; if (my_iDrawSeparator3D == CD_FLAT_SEPARATOR || my_iDrawSeparator3D == CD_PHYSICAL_SEPARATOR) { cairo_set_line_cap (pCairoContext, CAIRO_LINE_CAP_SQUARE); do { icon = ic->data; if (icon->acFileName == NULL && CAIRO_DOCK_IS_SEPARATOR (icon)) { cairo_save (pCairoContext); cd_rendering_draw_3D_separator (icon, pCairoContext, pDock, pDock->bHorizontalDock, TRUE); cairo_restore (pCairoContext); } ic = cairo_dock_get_next_element (ic, pDock->icons); } while (ic != pFirstDrawnElement); do { icon = ic->data; if (icon->acFileName != NULL || ! CAIRO_DOCK_IS_SEPARATOR (icon)) { cairo_save (pCairoContext); cairo_dock_render_one_icon (icon, pDock, pCairoContext, fDockMagnitude, TRUE); cairo_restore (pCairoContext); } ic = cairo_dock_get_next_element (ic, pDock->icons); } while (ic != pFirstDrawnElement); if (my_iDrawSeparator3D == CD_PHYSICAL_SEPARATOR) { do { icon = ic->data; if (icon->acFileName == NULL && CAIRO_DOCK_IS_SEPARATOR (icon)) { cairo_save (pCairoContext); cd_rendering_draw_3D_separator (icon, pCairoContext, pDock, pDock->bHorizontalDock, FALSE); cairo_restore (pCairoContext); } ic = cairo_dock_get_next_element (ic, pDock->icons); } while (ic != pFirstDrawnElement); } } else { do { icon = ic->data; cairo_save (pCairoContext); cairo_dock_render_one_icon (icon, pDock, pCairoContext, fDockMagnitude, TRUE); cairo_restore (pCairoContext); ic = cairo_dock_get_next_element (ic, pDock->icons); } while (ic != pFirstDrawnElement); } }
void cd_rendering_render_3D_plane (cairo_t *pCairoContext, CairoDock *pDock) { //\____________________ On trace le cadre. double fLineWidth = g_iDockLineWidth; double fMargin = g_iFrameMargin; double fRadius = (pDock->iDecorationsHeight + fLineWidth - 2 * g_iDockRadius > 0 ? g_iDockRadius : (pDock->iDecorationsHeight + fLineWidth) / 2 - 1); double fDockWidth = cairo_dock_get_current_dock_width_linear (pDock); int sens; double fDockOffsetX, fDockOffsetY; // Offset du coin haut gauche du cadre. Icon *pFirstIcon = cairo_dock_get_first_drawn_icon (pDock); fDockOffsetX = (pFirstIcon != NULL ? pFirstIcon->fX + 0 - fMargin : fRadius + fLineWidth / 2); if (pDock->bDirectionUp) { sens = 1; fDockOffsetY = pDock->iCurrentHeight - pDock->iDecorationsHeight - 1.5 * fLineWidth; } else { sens = -1; fDockOffsetY = pDock->iDecorationsHeight + 1.5 * fLineWidth; } cairo_save (pCairoContext); double fInclinationOnHorizon = (fDockWidth / 2) / iVanishingPointY; cairo_dock_draw_frame (pCairoContext, fRadius, fLineWidth, fDockWidth, pDock->iDecorationsHeight, fDockOffsetX, fDockOffsetY, sens, fInclinationOnHorizon, pDock->bHorizontalDock); // fLineWidth //\____________________ On dessine les decorations dedans. fDockOffsetY = (pDock->bDirectionUp ? pDock->iCurrentHeight - pDock->iDecorationsHeight - fLineWidth : fLineWidth); cairo_dock_render_decorations_in_frame (pCairoContext, pDock, fDockOffsetY); //\____________________ On dessine le cadre. if (fLineWidth > 0) { cairo_set_line_width (pCairoContext, fLineWidth); cairo_set_source_rgba (pCairoContext, g_fLineColor[0], g_fLineColor[1], g_fLineColor[2], g_fLineColor[3]); cairo_stroke (pCairoContext); } else cairo_new_path (pCairoContext); /// donner un effet d'epaisseur => chaud du slip avec les separateurs physiques ! cairo_restore (pCairoContext); //\____________________ On dessine la ficelle qui les joint. if (g_iStringLineWidth > 0) cairo_dock_draw_string (pCairoContext, pDock, g_iStringLineWidth, FALSE, (my_iDrawSeparator3D == CD_FLAT_SEPARATOR || my_iDrawSeparator3D == CD_PHYSICAL_SEPARATOR)); //\____________________ On dessine les icones et les etiquettes, en tenant compte de l'ordre pour dessiner celles en arriere-plan avant celles en avant-plan. double fRatio = (pDock->iRefCount == 0 ? 1 : g_fSubDockSizeRatio); fRatio = pDock->fRatio; GList *pFirstDrawnElement = (pDock->pFirstDrawnElement != NULL ? pDock->pFirstDrawnElement : pDock->icons); if (pFirstDrawnElement == NULL) return ; double fDockMagnitude = cairo_dock_calculate_magnitude (pDock->iMagnitudeIndex); Icon *icon; GList *ic = pFirstDrawnElement; if (my_iDrawSeparator3D == CD_FLAT_SEPARATOR || my_iDrawSeparator3D == CD_PHYSICAL_SEPARATOR) { cairo_set_line_cap (pCairoContext, CAIRO_LINE_CAP_SQUARE); do { icon = ic->data; if (icon->acFileName == NULL && CAIRO_DOCK_IS_SEPARATOR (icon)) { cairo_save (pCairoContext); cd_rendering_draw_3D_separator (icon, pCairoContext, pDock, pDock->bHorizontalDock, TRUE); cairo_restore (pCairoContext); } ic = cairo_dock_get_next_element (ic, pDock->icons); } while (ic != pFirstDrawnElement); do { icon = ic->data; if (icon->acFileName != NULL || ! CAIRO_DOCK_IS_SEPARATOR (icon)) { cairo_save (pCairoContext); cairo_dock_render_one_icon (icon, pCairoContext, pDock->bHorizontalDock, fRatio, fDockMagnitude, pDock->bUseReflect, TRUE, pDock->iCurrentWidth, pDock->bDirectionUp); cairo_restore (pCairoContext); } ic = cairo_dock_get_next_element (ic, pDock->icons); } while (ic != pFirstDrawnElement); if (my_iDrawSeparator3D == CD_PHYSICAL_SEPARATOR) { do { icon = ic->data; if (icon->acFileName == NULL && CAIRO_DOCK_IS_SEPARATOR (icon)) { cairo_save (pCairoContext); cd_rendering_draw_3D_separator (icon, pCairoContext, pDock, pDock->bHorizontalDock, FALSE); cairo_restore (pCairoContext); } ic = cairo_dock_get_next_element (ic, pDock->icons); } while (ic != pFirstDrawnElement); } } else { do { icon = ic->data; cairo_save (pCairoContext); cairo_dock_render_one_icon (icon, pCairoContext, pDock->bHorizontalDock, fRatio, fDockMagnitude, pDock->bUseReflect, TRUE, pDock->iCurrentWidth, pDock->bDirectionUp); cairo_restore (pCairoContext); ic = cairo_dock_get_next_element (ic, pDock->icons); } while (ic != pFirstDrawnElement); } }