gboolean cairo_dock_apply_icon_background_opengl (Icon *icon) { if (cairo_dock_begin_draw_icon (icon, 1)) // 1 => don't clear current image { _cairo_dock_enable_texture (); glBlendFunc (GL_ONE_MINUS_DST_ALPHA, GL_ONE); // dest_over = src * (1 - dst.a) + dst _cairo_dock_set_alpha (1.); _cairo_dock_apply_texture_at_size (g_pIconBackgroundBuffer.iTexture, icon->image.iWidth, icon->image.iHeight); cairo_dock_end_draw_icon (icon); return TRUE; } return FALSE; }
static void render_opengl (CairoDesklet *pDesklet) { static CairoDockGLPath *pPath = NULL; static const int iNbPoints1Round = 5; static const int iNbPointsCurve = 15; CDPanelParameters *pPanel = (CDPanelParameters *) pDesklet->pRendererData; if (pPanel == NULL) return ; // draw frame double fRadius = pPanel->iRadius; double fLineWidth = pPanel->iLineWidth; //double fOffsetX = fRadius + fLineWidth/2; //double fOffsetY = fLineWidth/2; double fFrameWidth = pDesklet->container.iWidth - 2 * fRadius - fLineWidth; double fFrameHeight = pDesklet->container.iHeight - 2 * fRadius - fLineWidth; double w = fFrameWidth / 2; double h = fFrameHeight / 2; double r = fRadius; if (fLineWidth != 0 && pPanel->fBgColor[3] != 0) { if (pPath == NULL) { pPath = cairo_dock_new_gl_path (4*iNbPoints1Round+iNbPointsCurve+1, -w, -h, pDesklet->container.iWidth, pDesklet->container.iHeight); // on commence en bas a gauche pour avoir une bonne triangulation du polygone. // 4 corners + 1 curve } else { cairo_dock_gl_path_move_to (pPath, -w, -h-r); cairo_dock_gl_path_set_extent (pPath, pDesklet->container.iWidth, pDesklet->container.iHeight); } _cairo_dock_disable_texture (); _cairo_dock_set_blend_alpha (); cairo_dock_gl_path_arc (pPath, iNbPoints1Round, -w, -h, r, -G_PI/2, -G_PI/2); // coin bas gauche. cairo_dock_gl_path_arc (pPath, iNbPoints1Round, -w, h, r, -G_PI, -G_PI/2); // coin haut gauche. cairo_dock_gl_path_rel_curve_to (pPath, iNbPointsCurve, w, 0, w, - pPanel->iMainIconSize, 2*w, - pPanel->iMainIconSize); cairo_dock_gl_path_arc (pPath, iNbPoints1Round, w, h - pPanel->iMainIconSize, r, G_PI/2, -G_PI/2); // coin haut droit. cairo_dock_gl_path_arc (pPath, iNbPoints1Round, w, -h, r, 0., -G_PI/2); // coin bas droit. glColor4f (pPanel->fBgColor[0], pPanel->fBgColor[1], pPanel->fBgColor[2], 1.); glLineWidth (fLineWidth); cairo_dock_stroke_gl_path (pPath, TRUE); glColor4f (pPanel->fBgColor[0], pPanel->fBgColor[1], pPanel->fBgColor[2], pPanel->fBgColor[3]); cairo_dock_fill_gl_path (pPath, 0); } glTranslatef (-pDesklet->container.iWidth/2, -pDesklet->container.iHeight/2, 0.); // draw main icon. _cairo_dock_enable_texture (); _cairo_dock_set_blend_alpha (); _cairo_dock_set_alpha (1.); Icon *pIcon = pDesklet->pIcon; if (pIcon && pIcon->image.iTexture != 0 ) { glPushMatrix (); glTranslatef (floor (pIcon->fDrawX + pIcon->fWidth/2), floor (pDesklet->container.iHeight - pIcon->fDrawY - pIcon->fHeight/2), 0.); _cairo_dock_apply_texture_at_size (pIcon->image.iTexture, pIcon->fWidth, pIcon->fHeight); /**if (pIcon->iQuickInfoTexture != 0) { glPushMatrix (); double dx = .5 * (pIcon->iQuickInfoWidth & 1); // on decale la texture pour la coller sur la grille des coordonnees entieres. double dy = .5 * (pIcon->iQuickInfoHeight & 1); glTranslatef (floor (pIcon->fWidth/2 + pIcon->iQuickInfoWidth/2) + dx, dy, 0.); _cairo_dock_apply_texture_at_size (pIcon->iQuickInfoTexture, pIcon->iQuickInfoWidth, pIcon->iQuickInfoHeight); glPopMatrix (); }*/ glTranslatef (floor (pIcon->fWidth), 0., 0.); cairo_dock_draw_icon_overlays_opengl (pIcon, pDesklet->container.fRatio); glPopMatrix (); } // draw icons. GList *pFirstDrawnElement = cairo_dock_get_first_drawn_element_linear (pDesklet->icons); if (pFirstDrawnElement == NULL) return; GList *ic = pFirstDrawnElement; do { pIcon = ic->data; if (pIcon->image.iTexture != 0 && ! CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon)) { glPushMatrix (); glTranslatef (floor (pIcon->fDrawX + pIcon->fWidth/2), floor (pDesklet->container.iHeight - pIcon->fDrawY - pIcon->fHeight/2), 0.); _cairo_dock_enable_texture (); // cairo_dock_draw_icon_overlays_opengl() disable textures _cairo_dock_apply_texture_at_size (pIcon->image.iTexture, pIcon->fWidth, pIcon->fHeight); if (pIcon->label.iTexture != 0) { glPushMatrix (); double dx = .5 * (pIcon->label.iWidth & 1); // on decale la texture pour la coller sur la grille des coordonnees entieres. double dy = .5 * (pIcon->label.iHeight & 1); double u0 = 0., u1 = 1.; double fOffsetX = 0.; if (pIcon->bPointed) { _cairo_dock_set_alpha (1.); if (pIcon->fDrawX + pIcon->fWidth + pIcon->label.iWidth/2 > pDesklet->container.iWidth) fOffsetX = pDesklet->container.iWidth - (pIcon->fDrawX + pIcon->fWidth + pIcon->label.iWidth/2); if (pIcon->fDrawX + pIcon->fWidth - pIcon->label.iWidth/2 < 0) fOffsetX = pIcon->label.iWidth/2 - (pIcon->fDrawX + pIcon->fWidth); } else { _cairo_dock_set_alpha (.6); if (pIcon->label.iWidth > 2*pIcon->fWidth + 2 * myIconsParam.iLabelSize) { fOffsetX = 0.; u1 = (double) (2*pIcon->fWidth + 2 * myIconsParam.iLabelSize) / pIcon->label.iWidth; } } glTranslatef (ceil (-pIcon->fWidth/2 + fOffsetX + pIcon->label.iWidth/2) + dx, ceil (pIcon->fHeight/2 + pIcon->label.iHeight / 2) + dy, 0.); glBindTexture (GL_TEXTURE_2D, pIcon->label.iTexture); _cairo_dock_apply_current_texture_portion_at_size_with_offset (u0, 0., u1 - u0, 1., pIcon->label.iWidth * (u1 - u0), pIcon->label.iHeight, 0., 0.); _cairo_dock_set_alpha (1.); glPopMatrix (); } /**if (pIcon->iQuickInfoTexture != 0) { double dx = .5 * (pIcon->iQuickInfoWidth & 1); // on decale la texture pour la coller sur la grille des coordonnees entieres. double dy = .5 * (pIcon->iQuickInfoHeight & 1); glTranslatef (floor (pIcon->fWidth/2 + pIcon->iQuickInfoWidth/2) + dx, dy, 0.); _cairo_dock_set_alpha (1.); _cairo_dock_apply_texture_at_size (pIcon->iQuickInfoTexture, pIcon->iQuickInfoWidth, pIcon->iQuickInfoHeight); }*/ cairo_dock_draw_icon_overlays_opengl (pIcon, pDesklet->container.fRatio); glPopMatrix (); } ic = cairo_dock_get_next_element (ic, pDesklet->icons); } while (ic != pFirstDrawnElement); _cairo_dock_disable_texture (); }
static void render_opengl (CairoDesklet *pDesklet) { CDSlideParameters *pSlide = (CDSlideParameters *) pDesklet->pRendererData; if (pSlide == NULL) return ; // le cadre. double fRadius = (pSlide->bRoundedRadius ? pSlide->iRadius : 0.); double fLineWidth = pSlide->iLineWidth; if (fLineWidth != 0 && pSlide->fLineColor[3] != 0) { cairo_dock_draw_rounded_rectangle_opengl (pDesklet->container.iWidth - 2 * fRadius, pDesklet->container.iHeight, fRadius, fLineWidth, pSlide->fLineColor); } glTranslatef (-pDesklet->container.iWidth/2, -pDesklet->container.iHeight/2, 0.); // les icones. double w = pDesklet->container.iWidth - 2 * pSlide->fMargin; double h = pDesklet->container.iHeight - 2 * pSlide->fMargin; int dh = (h - pSlide->iNbLines * (pSlide->iIconSize + myIconsParam.iLabelSize)) / (pSlide->iNbLines != 1 ? pSlide->iNbLines - 1 : 1); // ecart entre 2 lignes. int dw = (w - pSlide->iNbColumns * pSlide->iIconSize) / pSlide->iNbColumns; // ecart entre 2 colonnes. _cairo_dock_enable_texture (); _cairo_dock_set_blend_alpha (); _cairo_dock_set_alpha (1.); double x = pSlide->fMargin + dw/2, y = pSlide->fMargin + myIconsParam.iLabelSize; int q = 0; Icon *pIcon; GList *ic; for (ic = pDesklet->icons; ic != NULL; ic = ic->next) { pIcon = ic->data; if (CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon)) continue; pIcon->fDrawX = x; pIcon->fDrawY = y; x += pSlide->iIconSize + dw; q ++; if (q == pSlide->iNbColumns) { q = 0; x = pSlide->fMargin + dw/2; y += pSlide->iIconSize + myIconsParam.iLabelSize + dh; } } GList *pFirstDrawnElement = cairo_dock_get_first_drawn_element_linear (pDesklet->icons); if (pFirstDrawnElement == NULL) return; ic = pFirstDrawnElement; do { pIcon = ic->data; if (pIcon->image.iTexture != 0 && ! CAIRO_DOCK_ICON_TYPE_IS_SEPARATOR (pIcon)) { glPushMatrix (); glTranslatef (pIcon->fDrawX + pIcon->fWidth/2, pDesklet->container.iHeight - pIcon->fDrawY - pIcon->fHeight/2, 0.); _cairo_dock_enable_texture (); // cairo_dock_draw_icon_overlays_opengl() disable textures _cairo_dock_apply_texture_at_size (pIcon->image.iTexture, pIcon->fWidth, pIcon->fHeight); /// generer une notification ... /*if (pIcon->bHasIndicator && g_pIndicatorBuffer.iTexture != 0) { glPushMatrix (); glTranslatef (0., - pIcon->fHeight/2 + g_pIndicatorBuffer.iHeight/2 * pIcon->fWidth / g_pIndicatorBuffer.iWidth, 0.); _cairo_dock_apply_texture_at_size (g_pIndicatorBuffer.iTexture, pIcon->fWidth, g_pIndicatorBuffer.iHeight * pIcon->fWidth / g_pIndicatorBuffer.iWidth); glPopMatrix (); }*/ if (pIcon->label.iTexture != 0) { glPushMatrix (); double dx = .5 * (pIcon->label.iWidth & 1); // on decale la texture pour la coller sur la grille des coordonnees entieres. double dy = .5 * (pIcon->label.iHeight & 1); double u0 = 0., u1 = 1.; double fOffsetX = 0.; if (pIcon->bPointed) { _cairo_dock_set_alpha (1.); if (pIcon->fDrawX + pIcon->fWidth/2 + pIcon->label.iWidth/2 > pDesklet->container.iWidth) fOffsetX = pDesklet->container.iWidth - (pIcon->fDrawX + pIcon->fWidth/2 + pIcon->label.iWidth/2); if (pIcon->fDrawX + pIcon->fWidth/2 - pIcon->label.iWidth/2 < 0) fOffsetX = pIcon->label.iWidth/2 - (pIcon->fDrawX + pIcon->fWidth/2); } else { _cairo_dock_set_alpha (.6); if (pIcon->label.iWidth > pIcon->fWidth + 2 * myIconsParam.iLabelSize) { fOffsetX = 0.; u1 = (double) (pIcon->fWidth + 2 * myIconsParam.iLabelSize) / pIcon->label.iWidth; } } glTranslatef (ceil (fOffsetX) + dx, ceil (pIcon->fHeight/2 + pIcon->label.iHeight / 2) + dy, 0.); glBindTexture (GL_TEXTURE_2D, pIcon->label.iTexture); _cairo_dock_apply_current_texture_portion_at_size_with_offset (u0, 0., u1 - u0, 1., pIcon->label.iWidth * (u1 - u0), pIcon->label.iHeight, 0., 0.); _cairo_dock_set_alpha (1.); glPopMatrix (); } cairo_dock_draw_icon_overlays_opengl (pIcon, pDesklet->container.fRatio); glPopMatrix (); } ic = cairo_dock_get_next_element (ic, pDesklet->icons); } while (ic != pFirstDrawnElement); _cairo_dock_disable_texture (); }
void rendering_draw_slide_in_desklet_opengl (CairoDesklet *pDesklet) { _cairo_dock_define_static_vertex_tab (7); CDSlideParameters *pSlide = (CDSlideParameters *) pDesklet->pRendererData; if (pSlide == NULL) return ; // le cadre. double fRadius = pSlide->iRadius; double fLineWidth = pSlide->iLineWidth; if (fLineWidth != 0 && pSlide->fLineColor[3] != 0) { if (pSlide->bRoundedRadius) { cairo_dock_draw_rounded_rectangle_opengl (fRadius, fLineWidth, pDesklet->iWidth - 2 * fRadius, pDesklet->iHeight, 0., 0., pSlide->fLineColor); glTranslatef (-pDesklet->iWidth/2, -pDesklet->iHeight/2, 0.); } else { int i = 0; _cairo_dock_set_vertex_xy (0, -pDesklet->iWidth/2, +pDesklet->iHeight/2); _cairo_dock_set_vertex_xy (1, -pDesklet->iWidth/2, -pDesklet->iHeight/2 + fRadius); _cairo_dock_set_vertex_xy (2, -pDesklet->iWidth/2 + fRadius, -pDesklet->iHeight/2); _cairo_dock_set_vertex_xy (3, +pDesklet->iWidth/2, -pDesklet->iHeight/2); _cairo_dock_set_path_as_current (); cairo_dock_draw_current_path_opengl (fLineWidth, pSlide->fLineColor, 4); } } glTranslatef (-pDesklet->iWidth/2, -pDesklet->iHeight/2, 0.); // les icones. double w = pDesklet->iWidth - 2 * pSlide->fMargin; double h = pDesklet->iHeight - 2 * pSlide->fMargin; int dh = (h - pSlide->iNbLines * (pSlide->iIconSize + myLabels.iLabelSize)) / (pSlide->iNbLines != 1 ? pSlide->iNbLines - 1 : 1); // ecart entre 2 lignes. int dw = (w - pSlide->iNbColumns * pSlide->iIconSize) / pSlide->iNbColumns; // ecart entre 2 colonnes. _cairo_dock_enable_texture (); _cairo_dock_set_blend_alpha (); _cairo_dock_set_alpha (1.); double x = pSlide->fMargin + dw/2, y = pSlide->fMargin + myLabels.iLabelSize; int q = 0; Icon *pIcon; GList *ic; for (ic = pDesklet->icons; ic != NULL; ic = ic->next) { pIcon = ic->data; pIcon->fDrawX = x; pIcon->fDrawY = y; x += pSlide->iIconSize + dw; q ++; if (q == pSlide->iNbColumns) { q = 0; x = pSlide->fMargin + dw/2; y += pSlide->iIconSize + myLabels.iLabelSize + dh; } } GList *pFirstDrawnElement = cairo_dock_get_first_drawn_element_linear (pDesklet->icons); if (pFirstDrawnElement == NULL) return; ic = pFirstDrawnElement; do { pIcon = ic->data; if (pIcon->iIconTexture != 0) { glPushMatrix (); glTranslatef (pIcon->fDrawX + pIcon->fWidth/2, pDesklet->iHeight - pIcon->fDrawY - pIcon->fHeight/2, 0.); //g_print (" %d) %d;%d %dx%d\n", pIcon->iIconTexture, (int)(pIcon->fDrawX + pIcon->fWidth/2), (int)(pDesklet->iHeight - pIcon->fDrawY - pIcon->fHeight/2), (int)(pIcon->fWidth/2), (int)(pIcon->fHeight/2)); _cairo_dock_apply_texture_at_size (pIcon->iIconTexture, pIcon->fWidth, pIcon->fHeight); if (pIcon->bHasIndicator && g_iIndicatorTexture != 0) { glPushMatrix (); glTranslatef (0., - pIcon->fHeight/2 + g_fIndicatorHeight/2 * pIcon->fWidth / g_fIndicatorWidth, 0.); _cairo_dock_apply_texture_at_size (g_iIndicatorTexture, pIcon->fWidth, g_fIndicatorHeight * pIcon->fWidth / g_fIndicatorWidth); glPopMatrix (); } if (pIcon->iLabelTexture != 0) { glPushMatrix (); double u0 = 0., u1 = 1.; double fOffsetX = 0.; if (pIcon->bPointed) { _cairo_dock_set_alpha (1.); if (pIcon->fDrawX + pIcon->fWidth/2 + pIcon->iTextWidth/2 > pDesklet->iWidth) fOffsetX = pDesklet->iWidth - (pIcon->fDrawX + pIcon->fWidth/2 + pIcon->iTextWidth/2); if (pIcon->fDrawX + pIcon->fWidth/2 - pIcon->iTextWidth/2 < 0) fOffsetX = pIcon->iTextWidth/2 - (pIcon->fDrawX + pIcon->fWidth/2); } else { _cairo_dock_set_alpha (.6); if (pIcon->iTextWidth > pIcon->fWidth + 2 * myLabels.iLabelSize) { fOffsetX = 0.; u1 = (double) (pIcon->fWidth + 2 * myLabels.iLabelSize) / pIcon->iTextWidth; } } glTranslatef (fOffsetX, pIcon->fHeight/2 + pIcon->iTextHeight / 2, 0.); glBindTexture (GL_TEXTURE_2D, pIcon->iLabelTexture); _cairo_dock_apply_current_texture_portion_at_size_with_offset (u0, 0., u1 - u0, 1., pIcon->iTextWidth * (u1 - u0), pIcon->iTextHeight, 0., 0.); _cairo_dock_set_alpha (1.); glPopMatrix (); } if (pIcon->iQuickInfoTexture != 0) { glTranslatef (0., (- pIcon->fHeight + pIcon->iQuickInfoHeight)/2, 0.); _cairo_dock_apply_texture_at_size (pIcon->iQuickInfoTexture, pIcon->iQuickInfoWidth, pIcon->iQuickInfoHeight); } glPopMatrix (); } ic = cairo_dock_get_next_element (ic, pDesklet->icons); } while (ic != pFirstDrawnElement); _cairo_dock_disable_texture (); }